survey-pdf 1.12.21 → 1.12.23

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/survey.pdf.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * surveyjs - SurveyJS PDF library v1.12.21
2
+ * surveyjs - SurveyJS PDF library v1.12.23
3
3
  * Copyright (c) 2015-2025 Devsoft Baltic OÜ - http://surveyjs.io/
4
4
  * License: MIT (http://www.opensource.org/licenses/mit-license.php)
5
5
  */
@@ -3095,7 +3095,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
3095
3095
 
3096
3096
 
3097
3097
 
3098
- __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_51_survey_core__["checkLibraryVersion"])("".concat("1.12.21"), 'survey-pdf');
3098
+ __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_51_survey_core__["checkLibraryVersion"])("".concat("1.12.23"), 'survey-pdf');
3099
3099
 
3100
3100
 
3101
3101
  /***/ }),
@@ -12193,4 +12193,4 @@ var jspdf = __webpack_require__(18);
12193
12193
  /***/ })
12194
12194
  /******/ ]);
12195
12195
  });
12196
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCA4ODdkZjBjODA0OTU2Y2E3MDM2MiIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9oZWxwZXJzLnRzIiwid2VicGFjazovLy8uL3NyYy9oZWxwZXJfc3VydmV5LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcXVlc3Rpb24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZS50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wicm9vdFwiOlwiU3VydmV5XCIsXCJjb21tb25qczJcIjpcInN1cnZleS1jb3JlXCIsXCJjb21tb25qc1wiOlwic3VydmV5LWNvcmVcIixcImFtZFwiOlwic3VydmV5LWNvcmVcIn0iLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2JyaWNrLnRzIiwid2VicGFjazovLy8uL3NyYy9kb2NfY29udHJvbGxlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYWRpb2dyb3VwLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3N1cnZleS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfY2hlY2tpdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9lbXB0eS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGJvbGQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VudHJpZXMvcGRmLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3NlbGVjdGJhc2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3Jvd2xpbmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHRib3gudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcImpzcGRmXCIsXCJjb21tb25qczJcIjpcImpzcGRmXCIsXCJjb21tb25qc1wiOlwianNwZGZcIixcImFtZFwiOlwianNwZGZcIn0iLCJ3ZWJwYWNrOi8vLy4vc3JjL2V2ZW50X2hhbmRsZXIvZHJhd19jYW52YXMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2V2ZW50X2hhbmRsZXIvZXZlbnRfaGFuZGxlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9kZWZhdWx0LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X21hdHJpeG11bHRpcGxlLnRzIiwid2VicGFjazovLy8uL3NyYy9wYWdlX2xheW91dC9wYWdlX3BhY2tlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfYm9vbGVhbml0ZW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NoZWNrYm94aXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfY29tbWVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfZHJvcGRvd24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2h0bWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2ltYWdlLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9saW5rLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9yYWRpb2l0ZW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3JhbmtpbmdpdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0ZmllbGQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3RpdGxlcGFuZWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfYm9vbGVhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9jaGVja2JveC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9jb21tZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X2N1c3RvbV9tb2RlbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9kcm9wZG93bi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9leHByZXNzaW9uLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X2ZpbGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaHRtbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9pbWFnZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9pbWFnZXBpY2tlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXgudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4ZHluYW1pYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tdWx0aXBsZXRleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcGFuZWxkeW5hbWljLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3JhbmtpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcmF0aW5nLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3NpZ25hdHVyZXBhZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF90ZXh0Ym94LnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9jdXN0b20udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3N1cnZleS50cyIsIndlYnBhY2s6Ly8vLi9+L25vZGUtaW50ZXJ2YWwtdHJlZS9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9zaGFsbG93ZXF1YWwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NvbG9yZWRicmljay50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfZGVzY3JpcHRpb24udHMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvanNwZGZfcGx1Z2lucy9hY3JvZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvanNwZGZfcGx1Z2lucy9mcm9tX2h0bWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1EQUEyQyxjQUFjOztBQUV6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFB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SUFBSSxJQUFJO1lBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQUU7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUFFLENBQUMsQ0FBQztRQUNuRyxTQUFTLElBQUksQ0FBQyxNQUFXLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuSCxJQUFJLENBQUMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFSyxTQUFVLFdBQVcsQ0FBQyxPQUFZLEVBQUUsSUFBUztJQUMvQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWEsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFPLEVBQUUsRUFBRSxHQUFHLEVBQU8sRUFBRSxFQUFFLEVBQUUsQ0FBTSxFQUFFLENBQU0sRUFBRSxDQUFNLEVBQUUsQ0FBTSxDQUFDO0lBQy9JLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUs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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixnQ0FBZ0M7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQix5QkFBeUI7QUFDeEQ7QUFDQSxpRkFBaUY7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBLDBCQUEwQjtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUEsbUNBQW1DO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUNBQWlDLHNCQUFzQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxxQkFBcUI7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O0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7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LFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0EseUpBQXlKO0FBQ3pKO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0EseUZBQXlGO0FBQ3pGO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLHlGQUF5RjtBQUN6RjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrREFBK0Q7QUFDL0Q7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLDZSQUE2UjtBQUM3UjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxxRzs7Ozs7OztBQzUyRkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjs7QUFFL0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNB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QUFPO0FBQ3hCLHdCQUF3QixPQUFPO0FBQy9CLGlCQUFpQixPQUFPO0FBQ3hCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHIiwiZmlsZSI6Ii4vcGFja2FnZXMvc3VydmV5LXBkZi9zdXJ2ZXkucGRmLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwic3VydmV5LWNvcmVcIiksIHJlcXVpcmUoXCJqc3BkZlwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcIlN1cnZleVBERlwiLCBbXCJzdXJ2ZXktY29yZVwiLCBcImpzcGRmXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlN1cnZleVBERlwiXSA9IGZhY3RvcnkocmVxdWlyZShcInN1cnZleS1jb3JlXCIpLCByZXF1aXJlKFwianNwZGZcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlN1cnZleVBERlwiXSA9IGZhY3Rvcnkocm9vdFtcIlN1cnZleVwiXSwgcm9vdFtcImpzcGRmXCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfNl9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzE4X18pIHtcbnJldHVybiBcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMTQpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDg4N2RmMGM4MDQ5NTZjYTcwMzYyIiwiZGVjbGFyZSB2YXIgUmVmbGVjdDogYW55O1xuXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQ6IGFueSwgYjogYW55KTogYW55IHtcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQ6IGFueSwgYjogYW55KSB7XG4gICAgaWYgKHR5cGVvZiBiICE9PSAnZnVuY3Rpb24nICYmIGIgIT09IG51bGwpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NsYXNzIGV4dGVuZHMgdmFsdWUgJyArIFN0cmluZyhiKSArICcgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbCcpO1xuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59XG5cbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcbiAgICBfX2Fzc2lnbiA9ICg8YW55Pk9iamVjdCkuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQ6IGFueSkge1xuICAgICAgICBmb3IgKHZhciBzOiBhbnksIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QoczogYW55LCBlOiBhbnkpIHtcbiAgICB2YXIgdDogYW55ID0ge307XG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICAgIHRbcF0gPSBzW3BdO1xuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBxID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocVtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBxW2ldKSlcbiAgICAgICAgICAgICAgICB0W3FbaV1dID0gc1txW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzOiBhbnksIHRhcmdldDogYW55LCBrZXk6IGFueSwgZGVzYzogYW55KSB7XG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSAnZnVuY3Rpb24nKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbmQtYXNzaWduXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmc6IGFueSwgX2FyZ3VtZW50czogYW55LCBQOiBhbnksIGdlbmVyYXRvcjogYW55KSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWU6IGFueSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZTogYW55KSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmU6IGFueSwgcmVqZWN0OiBhbnkpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlOiBhbnkpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlOiBhbnkpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbJ3Rocm93J10odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdDogYW55KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmc6IGFueSwgYm9keTogYW55KSB7XG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogPGFueT5bXSwgb3BzOiA8YW55PltdIH0sIGY6IGFueSwgeTogYW55LCB0OiBhbnksIGc6IGFueTtcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgJ3Rocm93JzogdmVyYigxKSwgJ3JldHVybic6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG46IGFueSkgeyByZXR1cm4gZnVuY3Rpb24gKHY6IGFueSkgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gICAgZnVuY3Rpb24gc3RlcChvcDogYW55KSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuJyk7XG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVsncmV0dXJuJ10gOiBvcFswXSA/IHlbJ3Rocm93J10gfHwgKCh0ID0geVsncmV0dXJuJ10pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyAoPGFueT5fKSA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkgKHRvOiBhbnksIGZyb206IGFueSwgcGFjazogYW55KSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI6IGFueTsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9lbnRyaWVzL2hlbHBlcnMudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uLCBRdWVzdGlvblJhdGluZ01vZGVsLCBRdWVzdGlvbkZpbGVNb2RlbCwgTG9jYWxpemFibGVTdHJpbmcsIFF1ZXN0aW9uU2VsZWN0QmFzZSwgUXVlc3Rpb25Ecm9wZG93bk1vZGVsLCBzZXR0aW5ncyB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCAqIGFzIFN1cnZleVBERk1vZHVsZSBmcm9tICcuL2VudHJpZXMvcGRmJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIElTaXplLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9sYXlvdXQvZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfbGF5b3V0L2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgSUhUTUxSZW5kZXJUeXBlIH0gZnJvbSAnLi9mbGF0X2xheW91dC9mbGF0X2h0bWwnO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IFRleHRCb2xkQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX3RleHRib2xkJztcbmltcG9ydCB7IFRpdGxlUGFuZWxCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfdGl0bGVwYW5lbCc7XG5pbXBvcnQgeyBEZXNjcmlwdGlvbkJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9kZXNjcmlwdGlvbic7XG5pbXBvcnQgeyBDb21tZW50QnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2NvbW1lbnQnO1xuaW1wb3J0IHsgTGlua0JyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9saW5rJztcbmltcG9ydCB7IEhUTUxCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfaHRtbCc7XG5pbXBvcnQgeyBJbWFnZUJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9pbWFnZSc7XG5pbXBvcnQgeyBFbXB0eUJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9lbXB0eSc7XG5pbXBvcnQgeyBSb3dsaW5lQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX3Jvd2xpbmUnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBBZG9ybmVyc09wdGlvbnMgfSBmcm9tICcuL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMnO1xuXG5leHBvcnQgdHlwZSBJQm9yZGVyRGVzY3JpcHRpb24gPSBJUmVjdCAmIElTaXplICYgUGljazxQZGZCcmljaywgJ2Zvcm1Cb3JkZXJDb2xvcic+ICYgeyByb3VuZGVkPzogYm9vbGVhbiwgZGFzaFN0eWxlPzogeyBkYXNoQXJyYXk6IFtudW1iZXIsIG51bWJlcl0gfCBbbnVtYmVyXSwgZGFzaFBoYXNlOiBudW1iZXIgfSwgb3V0c2lkZT86IGJvb2xlYW4gfTtcblxuZXhwb3J0IGNsYXNzIFN1cnZleUhlbHBlciB7XG4gICAgcHVibGljIHN0YXRpYyBFUFNJTE9OOiBudW1iZXIgPSAyLjIyMDQ0NjA0OTI1MDMxMzA4MDg0NzI2MzMzNjE4MTZlLTE1O1xuICAgIHB1YmxpYyBzdGF0aWMgVElUTEVfU1VSVkVZX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS43O1xuICAgIHB1YmxpYyBzdGF0aWMgVElUTEVfUEFHRV9GT05UX1NJWkVfU0NBTEU6IG51bWJlciA9IDEuMztcbiAgICBwdWJsaWMgc3RhdGljIFRJVExFX1BBTkVMX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS4zO1xuICAgIHB1YmxpYyBzdGF0aWMgREVTQ1JJUFRJT05fRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAyLjAgLyAzLjA7XG4gICAgcHVibGljIHN0YXRpYyBPVEhFUl9ST1dTX0NPVU5UOiBudW1iZXIgPSAyO1xuICAgIHB1YmxpYyBzdGF0aWMgUkFUSU5HX01JTl9XSURUSDogbnVtYmVyID0gMztcbiAgICBwdWJsaWMgc3RhdGljIFJBVElOR19NSU5fSEVJR0hUOiBudW1iZXIgPSAyO1xuICAgIHB1YmxpYyBzdGF0aWMgUkFUSU5HX0NPTFVNTl9XSURUSDogbnVtYmVyID0gNTtcbiAgICBwdWJsaWMgc3RhdGljIE1BVFJJWF9DT0xVTU5fV0lEVEg6IG51bWJlciA9IDU7XG4gICAgcHVibGljIHN0YXRpYyBJTUFHRVBJQ0tFUl9DT1VOVDogbnVtYmVyID0gNDtcbiAgICBwdWJsaWMgc3RhdGljIElNQUdFUElDS0VSX1JBVElPOiBudW1iZXIgPSA0LjAgLyAzLjA7XG4gICAgcHVibGljIHN0YXRpYyBNVUxUSVBMRVRFWFRfVEVYVF9QRVJTOiBudW1iZXIgPSBNYXRoLkUgLyAxMC4wO1xuICAgIHB1YmxpYyBzdGF0aWMgSFRNTF9UQUlMX1RFWFRfU0NBTEU6IG51bWJlciA9IDAuMjQ7XG4gICAgcHVibGljIHN0YXRpYyBTRUxFQ1RfSVRFTV9GTEFUX1NDQUxFOiBudW1iZXIgPSAwLjk1O1xuICAgIHB1YmxpYyBzdGF0aWMgR0FQX0JFVFdFRU5fUk9XUzogbnVtYmVyID0gMC4yNTtcbiAgICBwdWJsaWMgc3RhdGljIEdBUF9CRVRXRUVOX0NPTFVNTlM6IG51bWJlciA9IDEuNTtcbiAgICBwdWJsaWMgc3RhdGljIEdBUF9CRVRXRUVOX0lURU1fVEVYVDogbnVtYmVyID0gMC4yNTtcbiAgICBwdWJsaWMgc3RhdGljIEZPUk1fQk9SREVSX1ZJU0lCTEU6IGJvb2xlYW4gPSB0cnVlO1xuICAgIHB1YmxpYyBzdGF0aWMgQk9SREVSX1NDQUxFOiBudW1iZXIgPSAwLjE7XG4gICAgcHVibGljIHN0YXRpYyBWSVNJQkxFX0JPUkRFUl9TQ0FMRTogbnVtYmVyID0gMC44O1xuICAgIHB1YmxpYyBzdGF0aWMgVU5WSVNJQkxFX0JPUkRFUl9TQ0FMRTogbnVtYmVyID0gMC4yO1xuICAgIHB1YmxpYyBzdGF0aWMgUkFESVVTX1NDQUxFOiBudW1iZXIgPSAzLjA7XG4gICAgcHVibGljIHN0YXRpYyBUSVRMRV9GT05UX1NDQUxFOiBudW1iZXIgPSAxLjE7XG4gICAgcHVibGljIHN0YXRpYyBWQUxVRV9SRUFET05MWV9QQURESU5HX1NDQUxFOiBudW1iZXIgPSAwLjM7XG4gICAgcHVibGljIHN0YXRpYyBIVE1MX1RPX0lNQUdFX1FVQUxJVFk6IG51bWJlciA9IDEuMDtcbiAgICBwdWJsaWMgc3RhdGljIEZPUk1fQk9SREVSX0NPTE9SOiBzdHJpbmcgPSAnIzlmOWY5Zic7XG4gICAgcHVibGljIHN0YXRpYyBURVhUX0NPTE9SOiBzdHJpbmcgPSAnIzQwNDA0MCc7XG4gICAgcHVibGljIHN0YXRpYyBCQUNLR1JPVU5EX0NPTE9SOiBzdHJpbmcgPSAnI0ZGRkZGRic7XG4gICAgcHVibGljIHN0YXRpYyBUSVRMRV9MT0NBVElPTl9NQVRSSVg6IHN0cmluZyA9ICdtYXRyaXgnO1xuICAgIHB1YmxpYyBzdGF0aWMgU1RBTkRBUkRfRk9OVDogc3RyaW5nID0gJ2hlbHZldGljYSc7XG4gICAgcHVibGljIHN0YXRpYyBDVVNUT01fRk9OVF9FTkNPRElORzogc3RyaW5nID0gJ0lkZW50aXR5LUgnO1xuXG4gICAgcHVibGljIHN0YXRpYyBwYXJzZVdpZHRoKHdpZHRoOiBzdHJpbmcsIG1heFdpZHRoOiBudW1iZXIsXG4gICAgICAgIGNvbHVtbnNDb3VudDogbnVtYmVyID0gMSwgZGVmYXVsdFVuaXQ/OiBzdHJpbmcpOiBudW1iZXIge1xuICAgICAgICBpZiAod2lkdGguaW5kZXhPZignY2FsYycpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF4V2lkdGggLyBjb2x1bW5zQ291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWU6IG51bWJlciA9IHBhcnNlRmxvYXQod2lkdGgpO1xuICAgICAgICBjb25zdCB1bml0OiBzdHJpbmcgPSB3aWR0aC5yZXBsYWNlKC9bXkEtWmEteiVdL2csICcnKSB8fCBkZWZhdWx0VW5pdDtcbiAgICAgICAgbGV0IGs6IG51bWJlcjtcbiAgICAgICAgc3dpdGNoICh1bml0KSB7XG4gICAgICAgICAgICBjYXNlICdwdCc6XG4gICAgICAgICAgICAgICAgayA9IDEuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICBrID0gNzIuMCAvIDI1LjQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjbSc6XG4gICAgICAgICAgICAgICAgayA9IDcyLjAgLyAyLjU0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaW4nOlxuICAgICAgICAgICAgICAgIGsgPSA3Mi4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncHgnOlxuICAgICAgICAgICAgICAgIGsgPSA3Mi4wIC8gOTYuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3BjJzpcbiAgICAgICAgICAgICAgICBrID0gMTIuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2VtJzpcbiAgICAgICAgICAgICAgICBrID0gMTIuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2V4JzpcbiAgICAgICAgICAgICAgICBrID0gNi4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNhc2UgJyUnOlxuICAgICAgICAgICAgICAgIGsgPSBtYXhXaWR0aCAvIDEwMC4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLm1pbih2YWx1ZSAqIGssIG1heFdpZHRoKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBweFRvUHQodmFsdWU6IG51bWJlciB8IHN0cmluZykge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYoIWlzTmFOKE51bWJlcih2YWx1ZSkpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gJ3B4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aCh2YWx1ZSwgTnVtYmVyLk1BWF9WQUxVRSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlICogNzIuMCAvIDk2LjA7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgbWVyZ2VSZWN0cyguLi5yZWN0czogSVJlY3RbXSk6IElSZWN0IHtcbiAgICAgICAgY29uc3QgcmVzdWx0UmVjdDogSVJlY3QgPSB7XG4gICAgICAgICAgICB4TGVmdDogcmVjdHNbMF0ueExlZnQsXG4gICAgICAgICAgICB4UmlnaHQ6IHJlY3RzWzBdLnhSaWdodCxcbiAgICAgICAgICAgIHlUb3A6IHJlY3RzWzBdLnlUb3AsXG4gICAgICAgICAgICB5Qm90OiByZWN0c1swXS55Qm90XG4gICAgICAgIH07XG4gICAgICAgIHJlY3RzLmZvckVhY2goKHJlY3Q6IElSZWN0KSA9PiB7XG4gICAgICAgICAgICByZXN1bHRSZWN0LnhMZWZ0ID0gTWF0aC5taW4ocmVzdWx0UmVjdC54TGVmdCwgcmVjdC54TGVmdCksXG4gICAgICAgICAgICByZXN1bHRSZWN0LnhSaWdodCA9IE1hdGgubWF4KHJlc3VsdFJlY3QueFJpZ2h0LCByZWN0LnhSaWdodCksXG4gICAgICAgICAgICByZXN1bHRSZWN0LnlUb3AgPSBNYXRoLm1pbihyZXN1bHRSZWN0LnlUb3AsIHJlY3QueVRvcCksXG4gICAgICAgICAgICByZXN1bHRSZWN0LnlCb3QgPSBNYXRoLm1heChyZXN1bHRSZWN0LnlCb3QsIHJlY3QueUJvdCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0UmVjdDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVQb2ludChyZWN0OiBJUmVjdCwgaXNMZWZ0OiBib29sZWFuID0gdHJ1ZSwgaXNUb3A6IGJvb2xlYW4gPSBmYWxzZSk6IElQb2ludCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogaXNMZWZ0ID8gcmVjdC54TGVmdCA6IHJlY3QueFJpZ2h0LFxuICAgICAgICAgICAgeVRvcDogaXNUb3AgPyByZWN0LnlUb3AgOiByZWN0LnlCb3RcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVSZWN0KHBvaW50OiBJUG9pbnQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogSVJlY3Qge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeExlZnQ6IHBvaW50LnhMZWZ0LFxuICAgICAgICAgICAgeFJpZ2h0OiBwb2ludC54TGVmdCArIHdpZHRoLFxuICAgICAgICAgICAgeVRvcDogcG9pbnQueVRvcCxcbiAgICAgICAgICAgIHlCb3Q6IHBvaW50LnlUb3AgKyBoZWlnaHRcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVIZWFkZXJSZWN0KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBJUmVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogMC4wLFxuICAgICAgICAgICAgeFJpZ2h0OiBjb250cm9sbGVyLnBhcGVyV2lkdGgsXG4gICAgICAgICAgICB5VG9wOiAwLjAsXG4gICAgICAgICAgICB5Qm90OiBjb250cm9sbGVyLm1hcmdpbnMudG9wXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlRm9vdGVyUmVjdChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogSVJlY3Qge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeExlZnQ6IDAuMCxcbiAgICAgICAgICAgIHhSaWdodDogY29udHJvbGxlci5wYXBlcldpZHRoLFxuICAgICAgICAgICAgeVRvcDogY29udHJvbGxlci5wYXBlckhlaWdodCAtIGNvbnRyb2xsZXIubWFyZ2lucy5ib3QsXG4gICAgICAgICAgICB5Qm90OiBjb250cm9sbGVyLnBhcGVySGVpZ2h0XG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY2hvb3NlSHRtbEZvbnQoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLnVzZUN1c3RvbUZvbnRJbkh0bWwgPyBjb250cm9sbGVyLmZvbnROYW1lIDogdGhpcy5TVEFOREFSRF9GT05UO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlQ3NzVGV4dFJ1bGUoZm9udFNpemU6IG51bWJlciwgZm9udFN0eWxlOiBzdHJpbmcsIGZvbnROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYFwiZm9udC1zaXplOiAke2ZvbnRTaXplfXB0OyBmb250LXdlaWdodDogJHtmb250U3R5bGV9OyBmb250LWZhbWlseTogJHtmb250TmFtZX07IGNvbG9yOiAke3RoaXMuVEVYVF9DT0xPUn07XCJgO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUh0bWxDb250YWluZXJCbG9jayhodG1sOiBzdHJpbmcsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlbmRlckFzOiBJSFRNTFJlbmRlclR5cGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBmb250ID0gdGhpcy5jaG9vc2VIdG1sRm9udChjb250cm9sbGVyKTtcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwiX19zdXJ2ZXlwZGZfaHRtbFwiIHN0eWxlPSR7dGhpcy5nZW5lcmF0ZUNzc1RleHRSdWxlKFxuICAgICAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSwgY29udHJvbGxlci5mb250U3R5bGUsIGZvbnQpfT5gICtcbiAgICAgICAgICAgIGA8c3R5bGU+Ll9fc3VydmV5cGRmX2h0bWwgcCB7IG1hcmdpbjogMDsgbGluZS1oZWlnaHQ6ICR7Y29udHJvbGxlci5mb250U2l6ZX1wdCB9IGJvZHkgeyBtYXJnaW46IDA7IH08L3N0eWxlPiR7aHRtbH08L2Rpdj5gO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHNwbGl0SHRtbFJlY3QoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgaHRtbEJyaWNrOiBJUGRmQnJpY2spOiBJUGRmQnJpY2sge1xuICAgICAgICBjb25zdCBicmlja3M6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IGh0bWxIZWlnaHQ6IG51bWJlciA9IGh0bWxCcmljay5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IG1pbkhlaWdodDogbnVtYmVyID0gY29udHJvbGxlci5kb2MuZ2V0Rm9udFNpemUoKTtcbiAgICAgICAgaHRtbEJyaWNrLnlCb3QgPSBodG1sQnJpY2sueVRvcCArIG1pbkhlaWdodDtcbiAgICAgICAgY29uc3QgZW1wdHlCcmlja0NvdW50OiBudW1iZXIgPSBNYXRoLmZsb29yKGh0bWxIZWlnaHQgLyBtaW5IZWlnaHQpIC0gMTtcbiAgICAgICAgYnJpY2tzLnB1c2goaHRtbEJyaWNrKTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSB0aGlzLmNyZWF0ZVBvaW50KGh0bWxCcmljayk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBlbXB0eUJyaWNrQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgYnJpY2tzLnB1c2gobmV3IEVtcHR5QnJpY2sodGhpcy5jcmVhdGVSZWN0KGN1cnJQb2ludCwgaHRtbEJyaWNrLndpZHRoLCBtaW5IZWlnaHQpKSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBtaW5IZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVtYWluaW5nSGVpZ2h0OiBudW1iZXIgPSBodG1sSGVpZ2h0IC0gKGVtcHR5QnJpY2tDb3VudCArIDEpICogbWluSGVpZ2h0O1xuICAgICAgICBpZiAocmVtYWluaW5nSGVpZ2h0ID4gMCkge1xuICAgICAgICAgICAgYnJpY2tzLnB1c2gobmV3IEVtcHR5QnJpY2sodGhpcy5jcmVhdGVSZWN0KGN1cnJQb2ludCwgaHRtbEJyaWNrLndpZHRoLCByZW1haW5pbmdIZWlnaHQpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVCcmljayguLi5icmlja3MpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVBsYWluVGV4dEZsYXQ8VCBleHRlbmRzIElQZGZCcmljaz4ocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgdGV4dDogc3RyaW5nLCBmYWJyaWM6IG5ldyAocXVlc3Rpb246IElRdWVzdGlvbixcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlY3Q6IElSZWN0LCB0ZXh0OiBzdHJpbmcpID0+IFQpOiBDb21wb3NpdGVCcmljayB7XG4gICAgICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IGNvbnRyb2xsZXIuZG9jLnNwbGl0VGV4dFRvU2l6ZSh0ZXh0LFxuICAgICAgICAgICAgY29udHJvbGxlci5wYXBlcldpZHRoIC0gY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0IC0gcG9pbnQueExlZnQpO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IHRoaXMuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGxpbmVzLmZvckVhY2goKGxpbmU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZTogSVNpemUgPSBjb250cm9sbGVyLm1lYXN1cmVUZXh0KGxpbmUpO1xuICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKG5ldyBmYWJyaWMocXVlc3Rpb24sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVSZWN0KGN1cnJQb2ludCwgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpLCBsaW5lKSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBzaXplLmhlaWdodDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlVGV4dEZsYXQ8VCBleHRlbmRzIElQZGZCcmljaz4ocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgdGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcsIGZhYnJpYzogbmV3IChxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVjdDogSVJlY3QsIHRleHQ6IHN0cmluZykgPT4gVCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycgfHwgIXRoaXMuaGFzSHRtbCh0ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUGxhaW5UZXh0RmxhdChwb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgICAgICAgdGV4dCA6IHRoaXMuZ2V0TG9jU3RyaW5nKDxMb2NhbGl6YWJsZVN0cmluZz50ZXh0KSwgZmFicmljKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNwbGl0SHRtbFJlY3QoY29udHJvbGxlciwgYXdhaXQgdGhpcy5jcmVhdGVIVE1MRmxhdChwb2ludCwgPFF1ZXN0aW9uPnF1ZXN0aW9uLCBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlSHRtbENvbnRhaW5lckJsb2NrKHRoaXMuZ2V0TG9jU3RyaW5nKHRleHQpLCBjb250cm9sbGVyLCAnc3RhbmRhcmQnKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIGhhc0h0bWwodGV4dDogTG9jYWxpemFibGVTdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgcGF0dGVybjogUmVnRXhwID0gLzxcXC8/W2Etel1bXFxzXFxTXSo+L2k7XG4gICAgICAgIHJldHVybiB0ZXh0Lmhhc0h0bWwgJiYgKHBhdHRlcm4udGVzdCgoPGFueT50ZXh0KS5yZW5kZXJlZFRleHQpIHx8IHBhdHRlcm4udGVzdCh0ZXh0LnJlbmRlcmVkSHRtbCkpO1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRIdG1sTWFyZ2lucyhjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBwb2ludDogSVBvaW50KTogeyB0b3A6IG51bWJlciwgYm90dG9tOiBudW1iZXIsIHdpZHRoOiBudW1iZXIgfSB7XG4gICAgICAgIGNvbnN0IHdpZHRoOiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBwb2ludC54TGVmdCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvcDogY29udHJvbGxlci5tYXJnaW5zLnRvcCxcbiAgICAgICAgICAgIGJvdHRvbTogY29udHJvbGxlci5tYXJnaW5zLmJvdCxcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aCA+IGNvbnRyb2xsZXIudW5pdFdpZHRoID8gd2lkdGggOiBjb250cm9sbGVyLnVuaXRXaWR0aFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlSFRNTFJlY3QocG9pbnQ6IElQb2ludCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgbWFyZ2luczogeyB0b3A6IG51bWJlciwgYm90dG9tOiBudW1iZXIsIHdpZHRoOiBudW1iZXIgfSwgcmVzdWx0WTogbnVtYmVyKTogSVJlY3Qge1xuICAgICAgICBjb25zdCBhdmFpbGFibGVQYWdlSGVpZ2h0OiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVySGVpZ2h0IC0gY29udHJvbGxlci5tYXJnaW5zLmJvdCAtIGNvbnRyb2xsZXIubWFyZ2lucy50b3A7XG4gICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gKGNvbnRyb2xsZXIuaGVscGVyRG9jLmdldE51bWJlck9mUGFnZXMoKSAtIDEpICpcbiAgICAgICAgICAgIChjb250cm9sbGVyLmZvbnRTaXplICogTWF0aC5mbG9vcihhdmFpbGFibGVQYWdlSGVpZ2h0IC8gY29udHJvbGxlci5mb250U2l6ZSkpXG4gICAgICAgICAgICArIHJlc3VsdFkgLSBtYXJnaW5zLnRvcCArIFN1cnZleUhlbHBlci5IVE1MX1RBSUxfVEVYVF9TQ0FMRSAqIGNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIGNvbnN0IG51bWJlck9mUGFnZXM6IG51bWJlciA9IGNvbnRyb2xsZXIuaGVscGVyRG9jLmdldE51bWJlck9mUGFnZXMoKTtcbiAgICAgICAgY29udHJvbGxlci5oZWxwZXJEb2MuYWRkUGFnZSgpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgbnVtYmVyT2ZQYWdlczsgaSsrKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmhlbHBlckRvYy5kZWxldGVQYWdlKDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChwb2ludCwgbWFyZ2lucy53aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZUhUTUxGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgaHRtbDogc3RyaW5nKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgbWFyZ2luczogeyB0b3A6IG51bWJlciwgYm90dG9tOiBudW1iZXIsIHdpZHRoOiBudW1iZXIgfSA9IHRoaXMuZ2V0SHRtbE1hcmdpbnMoY29udHJvbGxlciwgcG9pbnQpO1xuICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8SVBkZkJyaWNrPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgY29udHJvbGxlci5oZWxwZXJEb2MuZnJvbUhUTUwoaHRtbCwgcG9pbnQueExlZnQsIG1hcmdpbnMudG9wLCB7XG4gICAgICAgICAgICAgICAgcGFnZXNwbGl0OiB0cnVlLCB3aWR0aDogbWFyZ2lucy53aWR0aFxuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHJlc3VsdDogYW55KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlSFRNTFJlY3QocG9pbnQsIGNvbnRyb2xsZXIsIG1hcmdpbnMsIHJlc3VsdC55KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBIVE1MQnJpY2socXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIGh0bWwpKTtcbiAgICAgICAgICAgIH0sIG1hcmdpbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZUZvbnRGYWNlKGZvbnROYW1lOiBzdHJpbmcsIGZvbnRCYXNlNjQ6IHN0cmluZywgZm9udFdlaWdodDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBgQGZvbnQtZmFjZSB7IGZvbnQtZmFtaWx5OiAke2ZvbnROYW1lfTsgYCArXG4gICAgICAgICAgICBgc3JjOiB1cmwoZGF0YTphcHBsaWNhdGlvbi9mb250LXdvZmY7Y2hhcnNldD11dGYtODtiYXNlNjQsJHtmb250QmFzZTY0fSkgZm9ybWF0KCd3b2ZmJyk7IGAgK1xuICAgICAgICAgICAgYGZvbnQtd2VpZ2h0OiAke2ZvbnRXZWlnaHR9OyB9YDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZUZvbnRGYWNlV2l0aEl0YWxpY1N0eWxlKGZvbnROYW1lOiBzdHJpbmcsIGZvbnRCYXNlNjQ6IHN0cmluZywgZm9udFdlaWdodDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBgQGZvbnQtZmFjZSB7IGZvbnQtZmFtaWx5OiAke2ZvbnROYW1lfTsgYCArXG4gICAgICAgICAgICBgc3JjOiB1cmwoZGF0YTphcHBsaWNhdGlvbi9mb250LXdvZmY7Y2hhcnNldD11dGYtODtiYXNlNjQsJHtmb250QmFzZTY0fSkgZm9ybWF0KCd3b2ZmJyk7IGAgK1xuICAgICAgICAgICAgYGZvbnQtd2VpZ2h0OiAke2ZvbnRXZWlnaHR9OyBmb250LXN0eWxlOiBpdGFsaWN9YDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBodG1sVG9YbWwoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgaHRtbERvYzogRG9jdW1lbnQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoJycpO1xuICAgICAgICBodG1sRG9jLndyaXRlKGh0bWwucmVwbGFjZSgvXFwjL2csICclMjMnKSk7XG4gICAgICAgIGh0bWxEb2MuZG9jdW1lbnRFbGVtZW50LnNldEF0dHJpYnV0ZSgneG1sbnMnLCBodG1sRG9jLmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkpO1xuICAgICAgICBodG1sRG9jLmJvZHkuc3R5bGUubWFyZ2luID0gJ3Vuc2V0JztcbiAgICAgICAgcmV0dXJuIChuZXcgWE1MU2VyaWFsaXplcigpKS5zZXJpYWxpemVUb1N0cmluZyhodG1sRG9jLmJvZHkpLnJlcGxhY2UoLyUyMy9nLCAnIycpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVN2Z0NvbnRlbnQoaHRtbDogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnN0IHN0eWxlOiBIVE1MU3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgc3R5bGUuaW5uZXJIVE1MID0gJy5fX3N1cnZleXBkZl9odG1sIHAgeyBtYXJnaW46IHVuc2V0OyBsaW5lLWhlaWdodDogMjJweDsgfSBib2R5IHsgbWFyZ2luOiB1bnNldDsgfSc7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgICAgICBjb25zdCBkaXY6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGRpdi5jbGFzc05hbWUgPSAnX19zdXJ2ZXlwZGZfaHRtbCc7XG4gICAgICAgIGRpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgZGl2LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICAgICAgZGl2LnN0eWxlLnRvcCA9ICctMTAwMDBweCc7XG4gICAgICAgIGRpdi5zdHlsZS5sZWZ0ID0gJy0xMDAwMHB4JztcbiAgICAgICAgZGl2LnN0eWxlLndpZHRoID0gKHdpZHRoIC8gNzIuMCAqIDk2LjApICsgJ3B4JztcbiAgICAgICAgZGl2LnN0eWxlLmJveFNpemluZyA9ICdpbml0aWFsJztcbiAgICAgICAgZGl2LnN0eWxlLmNvbG9yID0gJ2luaXRpYWwnO1xuICAgICAgICBkaXYuc3R5bGUuZm9udEZhbWlseSA9ICdpbml0aWFsJztcbiAgICAgICAgZGl2LnN0eWxlLmZvbnQgPSAnaW5pdGlhbCc7XG4gICAgICAgIGRpdi5zdHlsZS5saW5lSGVpZ2h0ID0gJ2luaXRpYWwnO1xuICAgICAgICBkaXYuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1sKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpO1xuICAgICAgICBjb25zdCBkaXZXaWR0aDogbnVtYmVyID0gZGl2Lm9mZnNldFdpZHRoO1xuICAgICAgICBjb25zdCBkaXZIZWlnaHQ6IG51bWJlciA9IGRpdi5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIGRpdi5yZW1vdmUoKTtcbiAgICAgICAgc3R5bGUucmVtb3ZlKCk7XG4gICAgICAgIGxldCBkZWZzOiBzdHJpbmcgPSAnJztcbiAgICAgICAgaWYgKGNvbnRyb2xsZXIudXNlQ3VzdG9tRm9udEluSHRtbCkge1xuICAgICAgICAgICAgZGVmcyA9IGA8ZGVmcz48c3R5bGU+JHt0aGlzLmdlbmVyYXRlRm9udEZhY2UoY29udHJvbGxlci5mb250TmFtZSwgY29udHJvbGxlci5iYXNlNjROb3JtYWwsICdub3JtYWwnKX1gICtcbiAgICAgICAgICAgICAgICBgICR7dGhpcy5nZW5lcmF0ZUZvbnRGYWNlKGNvbnRyb2xsZXIuZm9udE5hbWUsIGNvbnRyb2xsZXIuYmFzZTY0Qm9sZCwgJ2JvbGQnKX08L3N0eWxlPjwvZGVmcz5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoRG9jQ29udHJvbGxlci5jdXN0b21Gb250cykuZm9yRWFjaChmb250TmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9udCA9IERvY0NvbnRyb2xsZXIuY3VzdG9tRm9udHNbZm9udE5hbWVdO1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGZvbnQpLmZvckVhY2goKGZvbnRTdHlsZTogJ25vcm1hbCcgfCAnYm9sZCcgfCAnaXRhbGljJyB8ICdib2xkaXRhbGljJykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm9udFN0eWxlID09PSAnbm9ybWFsJyB8fCBmb250U3R5bGUgPT09ICdib2xkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmcyArPSBgJHt0aGlzLmdlbmVyYXRlRm9udEZhY2UoZm9udE5hbWUsIGZvbnRbZm9udFN0eWxlXSwgZm9udFN0eWxlKX1gO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmcyArPSBgJHt0aGlzLmdlbmVyYXRlRm9udEZhY2VXaXRoSXRhbGljU3R5bGUoZm9udE5hbWUsIGZvbnRbZm9udFN0eWxlXSwgZm9udFN0eWxlID09PSAnaXRhbGljJyA/ICdub3JtYWwnIDogJ2JvbGQnKX1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZGVmcyA9ICc8ZGVmcz48c3R5bGU+JyArIGRlZnMgKyAnPC9zdHlsZT48L2RlZnM+JztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN2Zzogc3RyaW5nID0gYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiJHtkaXZXaWR0aH1weFwiIGhlaWdodD1cIiR7ZGl2SGVpZ2h0fXB4XCI+YCArIGRlZnMgK1xuICAgICAgICAgICAgJzxzdHlsZT4uX19zdXJ2ZXlwZGZfaHRtbCBwIHsgbWFyZ2luOiB1bnNldDsgbGluZS1oZWlnaHQ6IDIycHg7IH08L3N0eWxlPicgK1xuICAgICAgICAgICAgYDxmb3JlaWduT2JqZWN0IHdpZHRoPVwiJHtkaXZXaWR0aH1weFwiIGhlaWdodD1cIiR7ZGl2SGVpZ2h0fXB4XCI+YCArXG4gICAgICAgICAgICB0aGlzLmh0bWxUb1htbChodG1sKSArICc8L2ZvcmVpZ25PYmplY3Q+PC9zdmc+JztcbiAgICAgICAgcmV0dXJuIHsgc3ZnLCBkaXZXaWR0aCwgZGl2SGVpZ2h0IH07XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIHNldENhbnZhcyhjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCBkaXZXaWR0aDogbnVtYmVyLCBkaXZIZWlnaHQ6IG51bWJlciwgaW1nOiBIVE1MSW1hZ2VFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IGRpdldpZHRoICogU3VydmV5SGVscGVyLkhUTUxfVE9fSU1BR0VfUVVBTElUWTtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGRpdkhlaWdodCAqIFN1cnZleUhlbHBlci5IVE1MX1RPX0lNQUdFX1FVQUxJVFk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBjb250ZXh0LnNjYWxlKFN1cnZleUhlbHBlci5IVE1MX1RPX0lNQUdFX1FVQUxJVFksIFN1cnZleUhlbHBlci5IVE1MX1RPX0lNQUdFX1FVQUxJVFkpO1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IFN1cnZleUhlbHBlci5CQUNLR1JPVU5EX0NPTE9SO1xuICAgICAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIGRpdldpZHRoLCBkaXZIZWlnaHQpO1xuICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGh0bWxUb0ltYWdlKGh0bWw6IHN0cmluZywgd2lkdGg6IG51bWJlciwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IFByb21pc2U8eyB1cmw6IHN0cmluZywgYXNwZWN0OiBudW1iZXIgfT4ge1xuICAgICAgICBjb25zdCB7IHN2ZywgZGl2V2lkdGgsIGRpdkhlaWdodCB9ID0gU3VydmV5SGVscGVyLmNyZWF0ZVN2Z0NvbnRlbnQoaHRtbCwgd2lkdGgsIGNvbnRyb2xsZXIpO1xuICAgICAgICBjb25zdCBkYXRhOiBzdHJpbmcgPSAnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwnICsgYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3ZnKSkpO1xuICAgICAgICBjb25zdCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgaW1nLmNyb3NzT3JpZ2luPSdhbm9ueW1vdXMnO1xuICAgICAgICBpbWcuc3JjID0gZGF0YTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2V0Q2FudmFzKGNhbnZhcywgZGl2V2lkdGgsIGRpdkhlaWdodCwgaW1nKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmw6IHN0cmluZyA9IGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL2pwZWcnLCBTdXJ2ZXlIZWxwZXIuSFRNTF9UT19JTUFHRV9RVUFMSVRZKTtcbiAgICAgICAgICAgICAgICBjYW52YXMucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7IHVybDogdXJsLCBhc3BlY3Q6IGRpdldpZHRoIC8gZGl2SGVpZ2h0IH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGltZy5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoeyB1cmw6ICdkYXRhOiwnLCBhc3BlY3Q6IHdpZHRoIC8gdGhpcy5FUFNJTE9OIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlQm9sZFRleHRGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgdGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdib2xkJztcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgcG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLCB0ZXh0LCBUZXh0Qm9sZEJyaWNrKTtcbiAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnbm9ybWFsJztcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVUaXRsZUZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IFF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBsZXQgY3VyclBvaW50OiBJUG9pbnQgPSB0aGlzLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3Qgb2xkRm9udFNpemU6IG51bWJlciA9IGNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgKj0gdGhpcy5USVRMRV9GT05UX1NDQUxFO1xuICAgICAgICBpZiAocXVlc3Rpb24ubm8pIHtcbiAgICAgICAgICAgIGNvbnN0IG5vVGV4dDogc3RyaW5nID0gcXVlc3Rpb24ubm8gKyAnICc7XG4gICAgICAgICAgICBsZXQgbm9GbGF0OiBJUGRmQnJpY2s7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNIdG1sKHF1ZXN0aW9uLmxvY1RpdGxlKSkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ2JvbGQnO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbnRyb2xsZXIubWVhc3VyZVRleHQobm9UZXh0LCAnYm9sZCcpLndpZHRoO1xuICAgICAgICAgICAgICAgIG5vRmxhdCA9IGF3YWl0IHRoaXMuY3JlYXRlSFRNTEZsYXQoY3VyclBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVIdG1sQ29udGFpbmVyQmxvY2sobm9UZXh0LCBjb250cm9sbGVyLCAnc3RhbmRhcmQnKSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnbm9ybWFsJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vRmxhdCA9IGF3YWl0IHRoaXMuY3JlYXRlQm9sZFRleHRGbGF0KGN1cnJQb2ludCxcbiAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIG5vVGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2sobm9GbGF0KTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IG5vRmxhdC54UmlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IGN1cnJQb2ludC54TGVmdDtcbiAgICAgICAgY29uc3QgdGV4dEZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gPENvbXBvc2l0ZUJyaWNrPmF3YWl0IHRoaXMuY3JlYXRlQm9sZFRleHRGbGF0KFxuICAgICAgICAgICAgY3VyclBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlciwgcXVlc3Rpb24ubG9jVGl0bGUpO1xuICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2sodGV4dEZsYXQpO1xuICAgICAgICBjb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLmlzUmVxdWlyZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVpcmVkVGV4dDogc3RyaW5nID0gcXVlc3Rpb24ucmVxdWlyZWRUZXh0O1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzSHRtbChxdWVzdGlvbi5sb2NUaXRsZSkpIHtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQgPSB0aGlzLmNyZWF0ZVBvaW50KHRleHRGbGF0LnVuZm9sZCgpWzBdLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ2JvbGQnO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbnRyb2xsZXIubWVhc3VyZVRleHQocmVxdWlyZWRUZXh0LCAnYm9sZCcpLndpZHRoO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhhd2FpdCB0aGlzLmNyZWF0ZUhUTUxGbGF0KGN1cnJQb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlSHRtbENvbnRhaW5lckJsb2NrKHJlcXVpcmVkVGV4dCwgY29udHJvbGxlciwgJ3N0YW5kYXJkJykpKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50ID0gdGhpcy5jcmVhdGVQb2ludCh0ZXh0RmxhdC51bmZvbGQoKS5wb3AoKSwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhhd2FpdCB0aGlzLmNyZWF0ZUJvbGRUZXh0RmxhdChjdXJyUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZXF1aXJlZFRleHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIGNyZWF0ZVRpdGxlU3VydmV5UGFuZWxGbGF0KHBvaW50OiBJUG9pbnQsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHRleHQ6IHN0cmluZyB8IExvY2FsaXphYmxlU3RyaW5nLCBmb250U2l6ZVNjYWxlOiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplICogZm9udFNpemVTY2FsZTtcbiAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnYm9sZCc7XG4gICAgICAgIGNvbnN0IHRpdGxlRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5jcmVhdGVUZXh0RmxhdChwb2ludCwgbnVsbCwgY29udHJvbGxlciwgdGV4dCwgVGl0bGVQYW5lbEJyaWNrKTtcbiAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnbm9ybWFsJztcbiAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgICAgICByZXR1cm4gdGl0bGVGbGF0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZVRpdGxlU3VydmV5RmxhdChwb2ludDogSVBvaW50LCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICB0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZyk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZVRpdGxlU3VydmV5UGFuZWxGbGF0KHBvaW50LCBjb250cm9sbGVyLCB0ZXh0LCB0aGlzLlRJVExFX1NVUlZFWV9GT05UX1NJWkVfU0NBTEUpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZVRpdGxlUGFuZWxGbGF0KHBvaW50OiBJUG9pbnQsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHRleHQ6IHN0cmluZyB8IExvY2FsaXphYmxlU3RyaW5nLCBpc1BhZ2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZVRpdGxlU3VydmV5UGFuZWxGbGF0KHBvaW50LCBjb250cm9sbGVyLCB0ZXh0LFxuICAgICAgICAgICAgaXNQYWdlID8gdGhpcy5USVRMRV9QQUdFX0ZPTlRfU0laRV9TQ0FMRSA6IHRoaXMuVElUTEVfUEFORUxfRk9OVF9TSVpFX1NDQUxFKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVEZXNjRmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCB0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZyk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSBjb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKiB0aGlzLkRFU0NSSVBUSU9OX0ZPTlRfU0laRV9TQ0FMRTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgcG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLCB0ZXh0LCBEZXNjcmlwdGlvbkJyaWNrKTtcbiAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldFJlYWRvbmx5UmVuZGVyQXMocXVlc3Rpb246IFF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogJ2F1dG8nIHwgJ3RleHQnIHwgJ2Fjcm9mb3JtJyB7XG4gICAgICAgIHJldHVybiAoPGFueT5xdWVzdGlvbikucmVhZG9ubHlSZW5kZXJBcyA9PT0gJ2F1dG8nID8gY29udHJvbGxlci5yZWFkb25seVJlbmRlckFzIDogKDxhbnk+cXVlc3Rpb24pLnJlYWRvbmx5UmVuZGVyQXM7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlQ29tbWVudEZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBpc1F1ZXN0aW9uOiBib29sZWFuLCBvcHRpb25zOiB7IHJvd3M/OiBudW1iZXIsIGluZGV4PzogbnVtYmVyLCB2YWx1ZT86IHN0cmluZywgcmVhZE9ubHk/OiBib29sZWFuIH0gPSB7fSk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IHJlY3Q6IElSZWN0ID0gdGhpcy5jcmVhdGVUZXh0RmllbGRSZWN0KHBvaW50LCBjb250cm9sbGVyLCBvcHRpb25zLnJvd3MgPz8gMSk7XG4gICAgICAgIGxldCB0ZXh0RmxhdDtcbiAgICAgICAgaWYgKG9wdGlvbnMucmVhZE9ubHkgPz8gU3VydmV5SGVscGVyLnNob3VsZFJlbmRlclJlYWRPbmx5KHF1ZXN0aW9uLCBjb250cm9sbGVyKSkge1xuICAgICAgICAgICAgY29uc3QgcmVuZGVyZWRWYWx1ZSA9IG9wdGlvbnMudmFsdWUgPz8gdGhpcy5nZXRRdWVzdGlvbk9yQ29tbWVudFZhbHVlKHF1ZXN0aW9uLCBpc1F1ZXN0aW9uKTtcbiAgICAgICAgICAgIHRleHRGbGF0ID0gYXdhaXQgdGhpcy5jcmVhdGVSZWFkT25seVRleHRGaWVsZFRleHRGbGF0KFxuICAgICAgICAgICAgICAgIHBvaW50LCBjb250cm9sbGVyLCBxdWVzdGlvbiwgcmVuZGVyZWRWYWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBwYWRkaW5nOiBudW1iZXIgPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgKiB0aGlzLlZBTFVFX1JFQURPTkxZX1BBRERJTkdfU0NBTEU7XG4gICAgICAgICAgICBpZiAodGV4dEZsYXQueUJvdCArIHBhZGRpbmcgPiByZWN0LnlCb3QpIHJlY3QueUJvdCA9IHRleHRGbGF0LnlCb3QgKyBwYWRkaW5nO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbW1lbnQgPSBuZXcgQ29tbWVudEJyaWNrKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCBpc1F1ZXN0aW9uLCBvcHRpb25zLmluZGV4KTtcbiAgICAgICAgaWYob3B0aW9ucy5yZWFkT25seSAhPT0gbnVsbCAmJiBvcHRpb25zLnJlYWRPbmx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbW1lbnQuaXNSZWFkT25seSA9IG9wdGlvbnMucmVhZE9ubHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGV4dEZsYXQpIHtcbiAgICAgICAgICAgIGNvbW1lbnQudGV4dEJyaWNrID0gdGV4dEZsYXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbW1lbnQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UXVlc3Rpb25PckNvbW1lbnRWYWx1ZShxdWVzdGlvbjogUXVlc3Rpb24sIGlzUXVlc3Rpb246IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGlzUXVlc3Rpb24gPyAocXVlc3Rpb24udmFsdWUgIT09IHVuZGVmaW5lZCAmJiBxdWVzdGlvbi52YWx1ZSAhPT0gbnVsbCA/IHF1ZXN0aW9uLnZhbHVlIDogJycpIDpcbiAgICAgICAgICAgIChxdWVzdGlvbi5jb21tZW50ICE9PSB1bmRlZmluZWQgJiYgcXVlc3Rpb24uY29tbWVudCAhPT0gbnVsbCA/IHF1ZXN0aW9uLmNvbW1lbnQgOiAnJyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UXVlc3Rpb25PckNvbW1lbnREaXNwbGF5VmFsdWUocXVlc3Rpb246IFF1ZXN0aW9uLCBpc1F1ZXN0aW9uOiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpc1F1ZXN0aW9uID8gcXVlc3Rpb24uZGlzcGxheVZhbHVlIDogU3VydmV5SGVscGVyLmdldFF1ZXN0aW9uT3JDb21tZW50VmFsdWUocXVlc3Rpb24sIGlzUXVlc3Rpb24pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGluQnJvd3NlciA9IHR5cGVvZiBJbWFnZSA9PT0gJ2Z1bmN0aW9uJztcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGhhc0RvY3VtZW50KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGdldEltYWdlQmFzZTY0KGltYWdlTGluazogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgaW1hZ2UuY3Jvc3NPcmlnaW49J2Fub255bW91cyc7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbWFnZS5uYXR1cmFsSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IGltYWdlLm5hdHVyYWxXaWR0aDtcbiAgICAgICAgICAgICAgICBjdHguZHJhd0ltYWdlKGltYWdlLCAwLCAwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhVXJsID0gY2FudmFzLnRvRGF0YVVSTCgpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YVVybCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaW1hZ2Uub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCcnKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWFnZS5zcmMgPSBpbWFnZUxpbms7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHNob3VsZENvbnZlcnRJbWFnZVRvUG5nID0gdHJ1ZTtcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGdldEltYWdlTGluayhjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBpbWFnZU9wdGlvbnM6IHsgbGluazogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgb2JqZWN0Rml0Pzogc3RyaW5nIH0sIGFwcGx5SW1hZ2VGaXQ6IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBwdFRvUHg6IG51bWJlciA9IDk2LjAgLyA3Mi4wO1xuICAgICAgICBsZXQgdXJsID0gdGhpcy5zaG91bGRDb252ZXJ0SW1hZ2VUb1BuZyA/IGF3YWl0IFN1cnZleUhlbHBlci5nZXRJbWFnZUJhc2U2NChpbWFnZU9wdGlvbnMubGluaykgOiBpbWFnZU9wdGlvbnMubGluaztcbiAgICAgICAgaWYodHlwZW9mIFhNTFNlcmlhbGl6ZXIgPT09ICdmdW5jdGlvbicgJiYgYXBwbHlJbWFnZUZpdCkge1xuICAgICAgICAgICAgY29uc3QgY2FudmFzSHRtbDogc3RyaW5nID1cbiAgICAgICAgICAgICAgIGA8ZGl2IHN0eWxlPSdvdmVyZmxvdzogaGlkZGVuOyB3aWR0aDogJHtpbWFnZU9wdGlvbnMud2lkdGggKiBwdFRvUHh9cHg7IGhlaWdodDogJHtpbWFnZU9wdGlvbnMuaGVpZ2h0ICogcHRUb1B4fXB4Oyc+XG4gICAgICAgICAgICAgICAgICAgPGltZyBzcmM9JyR7dXJsfScgc3R5bGU9J29iamVjdC1maXQ6ICR7aW1hZ2VPcHRpb25zLm9iamVjdEZpdH07IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7Jy8+XG4gICAgICAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICAgICAgdXJsID0gKGF3YWl0IFN1cnZleUhlbHBlci5odG1sVG9JbWFnZShjYW52YXNIdG1sLCBpbWFnZU9wdGlvbnMud2lkdGgsIGNvbnRyb2xsZXIpKS51cmw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVJbWFnZUZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IGFueSxcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgaW1hZ2VPcHRpb25zOiB7IGxpbms6IHN0cmluZywgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIG9iamVjdEZpdD86IHN0cmluZyB9LCBhcHBseUltYWdlRml0PzogYm9vbGVhbik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGlmIChTdXJ2ZXlIZWxwZXIuaW5Ccm93c2VyKSB7XG4gICAgICAgICAgICBpbWFnZU9wdGlvbnMub2JqZWN0Rml0ID0gISFxdWVzdGlvbiAmJiAhIXF1ZXN0aW9uLmltYWdlRml0ID8gcXVlc3Rpb24uaW1hZ2VGaXQgOiAoaW1hZ2VPcHRpb25zLm9iamVjdEZpdCB8fCAnY29udGFpbicpO1xuICAgICAgICAgICAgaWYgKGFwcGx5SW1hZ2VGaXQgPz8gY29udHJvbGxlci5hcHBseUltYWdlRml0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGltYWdlT3B0aW9ucy53aWR0aCA+IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0IC0gY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1dpZHRoOiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodDtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VPcHRpb25zLmhlaWdodCAqPSBuZXdXaWR0aCAvIGltYWdlT3B0aW9ucy53aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VPcHRpb25zLndpZHRoID0gbmV3V2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaHRtbDogc3RyaW5nID0gYDxpbWcgc3JjPScke2F3YWl0IFN1cnZleUhlbHBlci5nZXRJbWFnZUxpbmsoY29udHJvbGxlciwgaW1hZ2VPcHRpb25zLCBhcHBseUltYWdlRml0ID8/IGNvbnRyb2xsZXIuYXBwbHlJbWFnZUZpdCl9JyB3aWR0aD0nJHtpbWFnZU9wdGlvbnMud2lkdGh9JyBoZWlnaHQ9JyR7aW1hZ2VPcHRpb25zLmhlaWdodH0nLz5gO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBIVE1MQnJpY2socXVlc3Rpb24sIGNvbnRyb2xsZXIsIHRoaXMuY3JlYXRlUmVjdChwb2ludCwgaW1hZ2VPcHRpb25zLndpZHRoLCBpbWFnZU9wdGlvbnMuaGVpZ2h0KSwgaHRtbCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBJbWFnZUJyaWNrKHF1ZXN0aW9uLCBjb250cm9sbGVyLCBpbWFnZU9wdGlvbnMubGluaywgcG9pbnQsIGltYWdlT3B0aW9ucy53aWR0aCwgaW1hZ2VPcHRpb25zLmhlaWdodCk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY2FuUHJldmlld0ltYWdlKHF1ZXN0aW9uOiBRdWVzdGlvbkZpbGVNb2RlbCwgaXRlbTogeyBuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgY29udGVudDogc3RyaW5nIH0sIHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBxdWVzdGlvbi5jYW5QcmV2aWV3SW1hZ2UoaXRlbSk7XG4gICAgICAgIC8vICAmJiAgYXdhaXQgdGhpcy5nZXRJbWFnZVNpemUodXJsKSAhPT0gbnVsbDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBnZXRJbWFnZVNpemUodXJsOiBzdHJpbmcpOiBQcm9taXNlPElTaXplPiB7XG4gICAgICAgIGlmICghU3VydmV5SGVscGVyLmluQnJvd3Nlcikge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoeyB3aWR0aDogdW5kZWZpbmVkLCBoZWlnaHQ6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW1hZ2U6IGFueSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICAgICAgaW1hZ2Uuc3JjID0gdXJsO1xuICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHsgd2lkdGg6IGltYWdlLndpZHRoLCBoZWlnaHQ6IGltYWdlLmhlaWdodCB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzb2x2ZShudWxsKTsgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlUm93bGluZUZsYXQocG9pbnQ6IElQb2ludCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgd2lkdGg/OiBudW1iZXIsIGNvbG9yPzogc3RyaW5nKTogSVBkZkJyaWNrIHtcbiAgICAgICAgbGV0IHhSaWdodDogbnVtYmVyID0gdHlwZW9mIHdpZHRoID09PSAndW5kZWZpbmVkJyA/XG4gICAgICAgICAgICBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgOlxuICAgICAgICAgICAgcG9pbnQueExlZnQgKyB3aWR0aDtcbiAgICAgICAgeFJpZ2h0ID0geFJpZ2h0ID4gcG9pbnQueExlZnQgPyB4UmlnaHQgOiBwb2ludC54TGVmdCArIHRoaXMuRVBTSUxPTjtcbiAgICAgICAgcmV0dXJuIG5ldyBSb3dsaW5lQnJpY2soY29udHJvbGxlciwge1xuICAgICAgICAgICAgeExlZnQ6IHBvaW50LnhMZWZ0LFxuICAgICAgICAgICAgeFJpZ2h0OiB4UmlnaHQsXG4gICAgICAgICAgICB5VG9wOiBwb2ludC55VG9wICsgdGhpcy5FUFNJTE9OLFxuICAgICAgICAgICAgeUJvdDogcG9pbnQueVRvcCArIHRoaXMuRVBTSUxPTlxuICAgICAgICB9LCB0eXBlb2YgY29sb3IgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IGNvbG9yKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVMaW5rRmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHRleHQ6IHN0cmluZywgbGluazogc3RyaW5nKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlVGV4dDogQ29tcG9zaXRlQnJpY2sgPSA8Q29tcG9zaXRlQnJpY2s+YXdhaXQgdGhpcy5cbiAgICAgICAgICAgIGNyZWF0ZVRleHRGbGF0KHBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlciwgdGV4dCwgVGV4dEJyaWNrKTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlTGluazogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29tcG9zaXRlVGV4dC51bmZvbGQoKS5mb3JFYWNoKCh0ZXh0OiBUZXh0QnJpY2spID0+IHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUxpbmsuYWRkQnJpY2sobmV3IExpbmtCcmljayh0ZXh0LCBsaW5rKSk7XG4gICAgICAgICAgICBjb25zdCBsaW5lUG9pbnQ6IElQb2ludCA9IHRoaXMuY3JlYXRlUG9pbnQoY29tcG9zaXRlTGluayk7XG4gICAgICAgICAgICBjb21wb3NpdGVMaW5rLmFkZEJyaWNrKHRoaXMuY3JlYXRlUm93bGluZUZsYXQobGluZVBvaW50LFxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIGNvbXBvc2l0ZUxpbmsud2lkdGgsIExpbmtCcmljay5DT0xPUikpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUxpbms7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlQWNyb2Zvcm1SZWN0KHJlY3Q6IElSZWN0KTogbnVtYmVyW10ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgcmVjdC54TGVmdCxcbiAgICAgICAgICAgIHJlY3QueVRvcCxcbiAgICAgICAgICAgIHJlY3QueFJpZ2h0IC0gcmVjdC54TGVmdCxcbiAgICAgICAgICAgIHJlY3QueUJvdCAtIHJlY3QueVRvcFxuICAgICAgICBdO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVRleHRGaWVsZFJlY3QocG9pbnQ6IElQb2ludCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgbGluZXM6IG51bWJlciA9IDEpOiBJUmVjdCB7XG4gICAgICAgIGxldCB3aWR0aDogbnVtYmVyID0gY29udHJvbGxlci5wYXBlcldpZHRoIC0gcG9pbnQueExlZnQgLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQ7XG4gICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGNvbnRyb2xsZXIudW5pdFdpZHRoKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgKiBsaW5lcztcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUmVjdChwb2ludCwgd2lkdGgsIGhlaWdodCk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlUmVhZE9ubHlUZXh0RmllbGRUZXh0RmxhdChwb2ludDogSVBvaW50LFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBxdWVzdGlvbjogUXVlc3Rpb24sIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBwYWRkaW5nOiBudW1iZXIgPSBjb250cm9sbGVyLnVuaXRXaWR0aCAqIHRoaXMuVkFMVUVfUkVBRE9OTFlfUEFERElOR19TQ0FMRTtcbiAgICAgICAgcG9pbnQueVRvcCArPSBwYWRkaW5nO1xuICAgICAgICBwb2ludC54TGVmdCArPSBwYWRkaW5nO1xuICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKHBvaW50LnhMZWZ0LCBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKyBwYWRkaW5nKTtcbiAgICAgICAgY29uc3QgdGV4dEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHZhbHVlLnRvU3RyaW5nKCksIFRleHRCcmljayk7XG4gICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICByZXR1cm4gdGV4dEZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgcmVuZGVyRmxhdEJvcmRlcnMoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgYm9yZGVyT3B0aW9uczogSUJvcmRlckRlc2NyaXB0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5GT1JNX0JPUkRFUl9WSVNJQkxFKSByZXR1cm47XG4gICAgICAgIGJvcmRlck9wdGlvbnMucm91bmRlZCA9IGJvcmRlck9wdGlvbnMucm91bmRlZCA/PyB0cnVlO1xuICAgICAgICBib3JkZXJPcHRpb25zLm91dHNpZGUgPSBib3JkZXJPcHRpb25zLm91dHNpZGUgPz8gZmFsc2U7XG4gICAgICAgIGNvbnN0IG1pblNpZGU6IG51bWJlciA9IE1hdGgubWluKGJvcmRlck9wdGlvbnMud2lkdGgsIGJvcmRlck9wdGlvbnMuaGVpZ2h0KTtcbiAgICAgICAgY29uc3QgYm9yZGVyV2lkdGggPSB0aGlzLmdldEJvcmRlcldpZHRoKGNvbnRyb2xsZXIpO1xuICAgICAgICBjb25zdCB2aXNpYmxlV2lkdGg6IG51bWJlciA9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIHRoaXMuVklTSUJMRV9CT1JERVJfU0NBTEUgKiB0aGlzLkJPUkRFUl9TQ0FMRTtcbiAgICAgICAgY29uc3QgdmlzaWJsZVNjYWxlOiBudW1iZXIgPSBib3JkZXJPcHRpb25zLm91dHNpZGUgPyAobWluU2lkZSArIGJvcmRlcldpZHRoKSAvIG1pblNpZGUgLSB2aXNpYmxlV2lkdGggLyBtaW5TaWRlIDogKG1pblNpZGUgLSBib3JkZXJXaWR0aCkgLyBtaW5TaWRlICsgdmlzaWJsZVdpZHRoIC8gbWluU2lkZTtcbiAgICAgICAgY29uc3Qgb2xkRHJhd0NvbG9yOiBzdHJpbmcgPSBjb250cm9sbGVyLmRvYy5nZXREcmF3Q29sb3IoKTtcbiAgICAgICAgY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKGJvcmRlck9wdGlvbnMuZm9ybUJvcmRlckNvbG9yKTtcbiAgICAgICAgY29udHJvbGxlci5kb2Muc2V0TGluZVdpZHRoKHZpc2libGVXaWR0aCk7XG4gICAgICAgIGNvbnN0IHNjYWxlZFJlY3QgPSB0aGlzLnNjYWxlUmVjdChib3JkZXJPcHRpb25zLCB2aXNpYmxlU2NhbGUpO1xuICAgICAgICBpZihib3JkZXJPcHRpb25zLmRhc2hTdHlsZSkge1xuICAgICAgICAgICAgY29uc3QgZGFzaFN0eWxlID0gYm9yZGVyT3B0aW9ucy5kYXNoU3R5bGU7XG4gICAgICAgICAgICBjb25zdCBib3JkZXJMZW5ndGggPSAoTWF0aC5hYnMoc2NhbGVkUmVjdC55VG9wIC0gc2NhbGVkUmVjdC55Qm90KSArIE1hdGguYWJzKHNjYWxlZFJlY3QueExlZnQgLSBzY2FsZWRSZWN0LnhSaWdodCkpICogMjtcbiAgICAgICAgICAgIGNvbnN0IGRhc2hXaXRoU3BhY2VTaXplID0gZGFzaFN0eWxlLmRhc2hBcnJheVswXSArIChkYXNoU3R5bGUuZGFzaEFycmF5WzFdID8/IGRhc2hTdHlsZS5kYXNoQXJyYXlbMF0pO1xuICAgICAgICAgICAgY29uc3QgZGFzaFNpemUgPSBkYXNoU3R5bGUuZGFzaEFycmF5WzBdICsgKGJvcmRlckxlbmd0aCAlIGRhc2hXaXRoU3BhY2VTaXplKSAvIE1hdGguZmxvb3IoYm9yZGVyTGVuZ3RoIC8gZGFzaFdpdGhTcGFjZVNpemUpO1xuXG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy5zZXRMaW5lRGFzaFBhdHRlcm4oXG4gICAgICAgICAgICAgICAgW2Rhc2hTaXplLCBkYXNoU3R5bGUuZGFzaEFycmF5WzFdID8/IGRhc2hTdHlsZS5kYXNoQXJyYXlbMF1dLFxuICAgICAgICAgICAgICAgIGRhc2hTdHlsZS5kYXNoUGhhc2VcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250cm9sbGVyLmRvYy5yZWN0KC4uLnRoaXMuY3JlYXRlQWNyb2Zvcm1SZWN0KHNjYWxlZFJlY3QpKTtcbiAgICAgICAgaWYoYm9yZGVyT3B0aW9ucy5yb3VuZGVkKSB7XG4gICAgICAgICAgICBjb25zdCB1bnZpc2libGVXaWR0aDogbnVtYmVyID0gY29udHJvbGxlci51bml0SGVpZ2h0ICogdGhpcy5VTlZJU0lCTEVfQk9SREVSX1NDQUxFICogdGhpcy5CT1JERVJfU0NBTEU7XG4gICAgICAgICAgICBjb25zdCB1bnZpc2libGVTY2FsZTogbnVtYmVyID0gMS4wIC0gdW52aXNpYmxlV2lkdGggLyBtaW5TaWRlO1xuICAgICAgICAgICAgY29uc3QgdW52aXNpYmxlUmFkaXVzOiBudW1iZXIgPSB0aGlzLlJBRElVU19TQ0FMRSAqIHVudmlzaWJsZVdpZHRoO1xuICAgICAgICAgICAgY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKHRoaXMuQkFDS0dST1VORF9DT0xPUik7XG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy5zZXRMaW5lV2lkdGgodW52aXNpYmxlV2lkdGgpO1xuICAgICAgICAgICAgY29udHJvbGxlci5kb2Mucm91bmRlZFJlY3QoLi4udGhpcy5jcmVhdGVBY3JvZm9ybVJlY3QoXG4gICAgICAgICAgICAgICAgdGhpcy5zY2FsZVJlY3QoYm9yZGVyT3B0aW9ucywgdW52aXNpYmxlU2NhbGUpKSwgdW52aXNpYmxlUmFkaXVzLCB1bnZpc2libGVSYWRpdXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmKGJvcmRlck9wdGlvbnMuZGFzaFN0eWxlKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy5zZXRMaW5lRGFzaFBhdHRlcm4oW10pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2xsZXIuZG9jLnNldERyYXdDb2xvcihvbGREcmF3Q29sb3IpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldExvY1N0cmluZyh0ZXh0OiBMb2NhbGl6YWJsZVN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmhhc0h0bWwodGV4dCkpIHJldHVybiB0ZXh0LnJlbmRlcmVkSHRtbDtcbiAgICAgICAgcmV0dXJuICg8YW55PnRleHQpLnJlbmRlcmVkVGV4dCB8fCB0ZXh0LnJlbmRlcmVkSHRtbDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXREcm9wZG93blF1ZXN0aW9uVmFsdWUocXVlc3Rpb246IFF1ZXN0aW9uKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcURyb3BEb3duOiBRdWVzdGlvbkRyb3Bkb3duTW9kZWwgPSA8UXVlc3Rpb25Ecm9wZG93bk1vZGVsPnF1ZXN0aW9uO1xuICAgICAgICBpZiAocURyb3BEb3duLmlzT3RoZXJTZWxlY3RlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHFEcm9wRG93bi5vdGhlclRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoISFxdWVzdGlvbi5kaXNwbGF5VmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWVzdGlvbi5kaXNwbGF5VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocURyb3BEb3duLnNob3dPcHRpb25zQ2FwdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHFEcm9wRG93bi5vcHRpb25zQ2FwdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29udGVudFF1ZXN0aW9uKHF1ZXN0aW9uOiBRdWVzdGlvbik6IFF1ZXN0aW9uIHtcbiAgICAgICAgcmV0dXJuICEhKDxhbnk+cXVlc3Rpb24pLmNvbnRlbnRRdWVzdGlvbiA/ICg8YW55PnF1ZXN0aW9uKS5jb250ZW50UXVlc3Rpb24gOiBxdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRDb250ZW50UXVlc3Rpb25UeXBlUmVuZGVyQXMocXVlc3Rpb246IFF1ZXN0aW9uLCBzdXJ2ZXk6IFN1cnZleVBERik6IHN0cmluZyB7XG4gICAgICAgIGxldCByZW5kZXJBcyA9IHF1ZXN0aW9uLnJlbmRlckFzO1xuICAgICAgICBpZihxdWVzdGlvbi5nZXRUeXBlKCkgPT09ICdib29sZWFuJyAmJiBzdXJ2ZXkub3B0aW9ucy51c2VMZWdhY3lCb29sZWFuUmVuZGVyaW5nKSB7XG4gICAgICAgICAgICByZW5kZXJBcyA9ICdjaGVja2JveCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYocmVuZGVyQXMgIT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IGAke3F1ZXN0aW9uLmdldFR5cGUoKX0tJHtyZW5kZXJBc31gO1xuICAgICAgICAgICAgaWYoRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5pc1R5cGVSZWdpc3RlcmVkKHR5cGUpKSByZXR1cm4gdHlwZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcXVlc3Rpb24uZ2V0VHlwZSgpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldENvbnRlbnRRdWVzdGlvblR5cGUocXVlc3Rpb246IFF1ZXN0aW9uLCBzdXJ2ZXk6IFN1cnZleVBERik6IHN0cmluZyB7XG4gICAgICAgIGlmKCEhcXVlc3Rpb24uY3VzdG9tV2lkZ2V0KSByZXR1cm4gcXVlc3Rpb24uY3VzdG9tV2lkZ2V0LnBkZlF1ZXN0aW9uVHlwZTtcbiAgICAgICAgcmV0dXJuICEhKDxhbnk+cXVlc3Rpb24pLmNvbnRlbnRRdWVzdGlvbiA/ICdjdXN0b21fbW9kZWwnIDogdGhpcy5nZXRDb250ZW50UXVlc3Rpb25UeXBlUmVuZGVyQXMocXVlc3Rpb24sIHN1cnZleSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmF0aW5nTWluV2lkdGgoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLm1lYXN1cmVUZXh0KHRoaXMuUkFUSU5HX01JTl9XSURUSCkud2lkdGg7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmF0aW5nSXRlbVRleHQocXVlc3Rpb246IFF1ZXN0aW9uUmF0aW5nTW9kZWwsXG4gICAgICAgIGluZGV4OiBudW1iZXIsIGxvY1RleHQ6IExvY2FsaXphYmxlU3RyaW5nKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgICAgICBjb25zdCByYXRpbmdJdGVtTG9jVGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSBuZXcgTG9jYWxpemFibGVTdHJpbmcobG9jVGV4dC5vd25lciwgbG9jVGV4dC51c2VNYXJrZG93bik7XG4gICAgICAgIHJhdGluZ0l0ZW1Mb2NUZXh0LnRleHQgPSB0aGlzLmdldExvY1N0cmluZyhsb2NUZXh0KTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwICYmIHF1ZXN0aW9uLm1pblJhdGVEZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgcmF0aW5nSXRlbUxvY1RleHQudGV4dCA9IHF1ZXN0aW9uLmxvY01pblJhdGVEZXNjcmlwdGlvbi50ZXh0ICsgJyAnICsgdGhpcy5nZXRMb2NTdHJpbmcobG9jVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW5kZXggPT09IHF1ZXN0aW9uLnZpc2libGVSYXRlVmFsdWVzLmxlbmd0aCAtIDEgJiYgcXVlc3Rpb24ubWF4UmF0ZURlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICByYXRpbmdJdGVtTG9jVGV4dC50ZXh0ID0gdGhpcy5nZXRMb2NTdHJpbmcobG9jVGV4dCkgKyAnICcgKyBxdWVzdGlvbi5sb2NNYXhSYXRlRGVzY3JpcHRpb24udGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmF0aW5nSXRlbUxvY1RleHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5wYXBlcldpZHRoIC0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW1hZ2VQaWNrZXJBdmFpbGFibGVXaWR0aChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9ICh0aGlzLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSAtXG4gICAgICAgICAgICAodGhpcy5JTUFHRVBJQ0tFUl9DT1VOVCAtIDEpICogY29udHJvbGxlci51bml0SGVpZ2h0KTtcbiAgICAgICAgcmV0dXJuIHdpZHRoID4gMCA/IHdpZHRoIDogY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldENvbHVtbldpZHRoKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGNvbENvdW50OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSAtIChjb2xDb3VudCAtIDEpICpcbiAgICAgICAgICAgIGNvbnRyb2xsZXIudW5pdFdpZHRoICogdGhpcy5HQVBfQkVUV0VFTl9DT0xVTU5TKSAvIGNvbENvdW50O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHNldENvbHVtbk1hcmdpbnMoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgY29sQ291bnQ6IG51bWJlciwgY29sdW1uOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgY2VsbFdpZHRoOiBudW1iZXIgPSB0aGlzLmdldENvbHVtbldpZHRoKGNvbnRyb2xsZXIsIGNvbENvdW50KTtcbiAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCArIGNvbHVtbiAqXG4gICAgICAgICAgICAoY2VsbFdpZHRoICsgY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLkdBUF9CRVRXRUVOX0NPTFVNTlMpO1xuICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKyAoY29sQ291bnQgLSBjb2x1bW4gLSAxKSAqXG4gICAgICAgICAgICAoY2VsbFdpZHRoICsgY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLkdBUF9CRVRXRUVOX0NPTFVNTlMpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIG1vdmVSZWN0KHJlY3Q6IElSZWN0LCBsZWZ0OiBudW1iZXIgPSByZWN0LnhMZWZ0LCB0b3A6IG51bWJlciA9IHJlY3QueVRvcCk6IElSZWN0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiBsZWZ0LFxuICAgICAgICAgICAgeVRvcDogdG9wLFxuICAgICAgICAgICAgeFJpZ2h0OiBsZWZ0ICsgcmVjdC54UmlnaHQgLSByZWN0LnhMZWZ0LFxuICAgICAgICAgICAgeUJvdDogdG9wICsgcmVjdC55Qm90IC0gcmVjdC55VG9wXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc2NhbGVSZWN0KHJlY3Q6IElSZWN0LCBzY2FsZTogbnVtYmVyKTogSVJlY3Qge1xuICAgICAgICBjb25zdCBzY2FsZVdpZHRoOiBudW1iZXIgPSBNYXRoLm1pbihyZWN0LnhSaWdodCAtIHJlY3QueExlZnQsIHJlY3QueUJvdCAtIHJlY3QueVRvcCkgKiAoMS4wIC0gc2NhbGUpIC8gMi4wO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeExlZnQ6IHJlY3QueExlZnQgKyBzY2FsZVdpZHRoLFxuICAgICAgICAgICAgeVRvcDogcmVjdC55VG9wICsgc2NhbGVXaWR0aCxcbiAgICAgICAgICAgIHhSaWdodDogcmVjdC54UmlnaHQgLSBzY2FsZVdpZHRoLFxuICAgICAgICAgICAgeUJvdDogcmVjdC55Qm90IC0gc2NhbGVXaWR0aFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldEJvcmRlcldpZHRoKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgcmV0dXJuIDIuMCAqIGNvbnRyb2xsZXIudW5pdFdpZHRoICogdGhpcy5CT1JERVJfU0NBTEU7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZm9ybVNjYWxlKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGZsYXQ6IElTaXplKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbWluU2lkZTogbnVtYmVyID0gTWF0aC5taW4oZmxhdC53aWR0aCwgZmxhdC5oZWlnaHQpO1xuICAgICAgICByZXR1cm4gKG1pblNpZGUgLSB0aGlzLmdldEJvcmRlcldpZHRoKGNvbnRyb2xsZXIpKSAvIG1pblNpZGU7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVRdWVzdGlvbkZsYXRzKHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBxdWVzdGlvbjogUXVlc3Rpb24sIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uVHlwZTogc3RyaW5nID0gdGhpcy5nZXRDb250ZW50UXVlc3Rpb25UeXBlKHF1ZXN0aW9uLCBzdXJ2ZXkpO1xuICAgICAgICBjb25zdCBmbGF0UXVlc3Rpb246IElGbGF0UXVlc3Rpb24gPSBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLlxuICAgICAgICAgICAgY3JlYXRlKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHF1ZXN0aW9uVHlwZSk7XG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uRmxhdHM6IElQZGZCcmlja1tdID0gYXdhaXQgZmxhdFF1ZXN0aW9uLmdlbmVyYXRlRmxhdHMocG9pbnQpO1xuICAgICAgICBjb25zdCBhZG9ybmVyc09wdGlvbnM6IEFkb3JuZXJzT3B0aW9ucyA9IG5ldyBBZG9ybmVyc09wdGlvbnMocG9pbnQsXG4gICAgICAgICAgICBxdWVzdGlvbkZsYXRzLCBxdWVzdGlvbiwgY29udHJvbGxlciwgRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKSwgU3VydmV5UERGTW9kdWxlKTtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLmN1c3RvbVdpZGdldCAmJiBxdWVzdGlvbi5jdXN0b21XaWRnZXQuaXNGaXQocXVlc3Rpb24pICYmXG4gICAgICAgICAgICBxdWVzdGlvbi5jdXN0b21XaWRnZXQucGRmUmVuZGVyKSB7XG4gICAgICAgICAgICBzdXJ2ZXkub25SZW5kZXJRdWVzdGlvbi51bnNoaWZ0KHF1ZXN0aW9uLmN1c3RvbVdpZGdldC5wZGZSZW5kZXIpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHN1cnZleS5vblJlbmRlclF1ZXN0aW9uLmZpcmUoc3VydmV5LCBhZG9ybmVyc09wdGlvbnMpO1xuICAgICAgICByZXR1cm4gWy4uLmFkb3JuZXJzT3B0aW9ucy5icmlja3NdO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzRm9udEV4aXN0KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGZvbnROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuZG9jLmludGVybmFsLmdldEZvbnQoZm9udE5hbWUpLmZvbnROYW1lID09PSBmb250TmFtZTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0N1c3RvbUZvbnQoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgZm9udE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5kb2MuaW50ZXJuYWwuZ2V0Rm9udChmb250TmFtZSkuZW5jb2RpbmcgPT09IHRoaXMuQ1VTVE9NX0ZPTlRfRU5DT0RJTkc7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZml4Rm9udChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzQ3VzdG9tRm9udChjb250cm9sbGVyLCBjb250cm9sbGVyLmZvbnROYW1lKSkge1xuICAgICAgICAgICAgY29udHJvbGxlci5kb2MudGV4dCgnbG9hZCBmb250JywgMCwgMCk7XG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy5kZWxldGVQYWdlKDEpO1xuICAgICAgICAgICAgY29udHJvbGxlci5hZGRQYWdlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjbG9uZShzcmM6IGFueSk6IGFueSB7XG4gICAgICAgIGNvbnN0IHRhcmdldDogYW55ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBzcmMpIHtcbiAgICAgICAgICAgIGlmIChzcmMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcF0gPSBzcmNbcHJvcF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBzaG91bGRSZW5kZXJSZWFkT25seShxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZWFkT25seT86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICgoISFxdWVzdGlvbiAmJiBxdWVzdGlvbi5pc1JlYWRPbmx5IHx8IHJlYWRPbmx5KSAmJiBTdXJ2ZXlIZWxwZXIuZ2V0UmVhZG9ubHlSZW5kZXJBcyhcbiAgICAgICAgICAgIDxRdWVzdGlvbj5xdWVzdGlvbiwgY29udHJvbGxlcikgIT09ICdhY3JvZm9ybScpIHx8IGNvbnRyb2xsZXI/LmNvbXByZXNzO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzU2l6ZUVtcHR5KHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdmFsIHx8IHZhbCA9PT0gJ2F1dG8nO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzSGVpZ2h0RW1wdHkodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTaXplRW1wdHkodmFsKSB8fCB2YWwgPT0gJzEwMCUnO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGdldENvcnJlY3RlZEltYWdlU2l6ZShjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBpbWFnZU9wdGlvbnM6IHsgaW1hZ2VXaWR0aD86IGFueSwgaW1hZ2VIZWlnaHQ/OiBhbnksIGltYWdlTGluazogc3RyaW5nLCBkZWZhdWx0SW1hZ2VXaWR0aD86IGFueSwgZGVmYXVsdEltYWdlSGVpZ2h0PzogYW55IH0pOiBQcm9taXNlPElTaXplPiB7XG4gICAgICAgIGxldCB7IGltYWdlV2lkdGgsIGltYWdlTGluaywgaW1hZ2VIZWlnaHQsIGRlZmF1bHRJbWFnZVdpZHRoLCBkZWZhdWx0SW1hZ2VIZWlnaHQgfSA9IGltYWdlT3B0aW9ucztcbiAgICAgICAgaW1hZ2VXaWR0aCA9IHR5cGVvZiBpbWFnZVdpZHRoID09PSAnbnVtYmVyJyA/IGltYWdlV2lkdGgudG9TdHJpbmcoKSA6IGltYWdlV2lkdGg7XG4gICAgICAgIGltYWdlSGVpZ2h0ID0gdHlwZW9mIGltYWdlSGVpZ2h0ID09PSAnbnVtYmVyJyA/IGltYWdlSGVpZ2h0LnRvU3RyaW5nKCkgOiBpbWFnZUhlaWdodDtcbiAgICAgICAgbGV0IHdpZHRoUHQ6IG51bWJlciA9IGltYWdlV2lkdGggJiYgU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoaW1hZ2VXaWR0aCwgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSwgMSwgJ3B4Jyk7XG4gICAgICAgIGxldCBoZWlnaHRQdDogbnVtYmVyID0gaW1hZ2VIZWlnaHQgJiYgU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoaW1hZ2VIZWlnaHQsIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlciksIDEsICdweCcpO1xuICAgICAgICBkZWZhdWx0SW1hZ2VXaWR0aCA9IHR5cGVvZiBkZWZhdWx0SW1hZ2VXaWR0aCA9PT0gJ251bWJlcicgPyBkZWZhdWx0SW1hZ2VXaWR0aC50b1N0cmluZygpIDogZGVmYXVsdEltYWdlV2lkdGg7XG4gICAgICAgIGRlZmF1bHRJbWFnZUhlaWdodCA9IHR5cGVvZiBkZWZhdWx0SW1hZ2VIZWlnaHQgPT09ICdudW1iZXInID8gZGVmYXVsdEltYWdlSGVpZ2h0LnRvU3RyaW5nKCkgOiBkZWZhdWx0SW1hZ2VIZWlnaHQ7XG4gICAgICAgIGxldCBkZWZhdWx0V2lkdGhQdDogbnVtYmVyID0gZGVmYXVsdEltYWdlV2lkdGggJiYgU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoZGVmYXVsdEltYWdlV2lkdGgsIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlciksIDEsICdweCcpO1xuICAgICAgICBsZXQgZGVmYXVsdEhlaWdodFB0OiBudW1iZXIgPSBkZWZhdWx0SW1hZ2VIZWlnaHQgJiYgU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoZGVmYXVsdEltYWdlSGVpZ2h0LCBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpLCAxLCAncHgnKTtcblxuICAgICAgICBpZihTdXJ2ZXlIZWxwZXIuaXNTaXplRW1wdHkoaW1hZ2VXaWR0aCkgfHwgU3VydmV5SGVscGVyLmlzSGVpZ2h0RW1wdHkoaW1hZ2VIZWlnaHQpKSB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZVNpemUgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuZ2V0SW1hZ2VTaXplKGltYWdlTGluayk7XG4gICAgICAgICAgICBpZighU3VydmV5SGVscGVyLmlzU2l6ZUVtcHR5KGltYWdlV2lkdGgpKSB7XG4gICAgICAgICAgICAgICAgaWYoaW1hZ2VTaXplICYmIGltYWdlU2l6ZS53aWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHRQdCA9IGltYWdlU2l6ZS5oZWlnaHQgKiB3aWR0aFB0IC8gaW1hZ2VTaXplLndpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYoIVN1cnZleUhlbHBlci5pc0hlaWdodEVtcHR5KGltYWdlSGVpZ2h0KSkge1xuICAgICAgICAgICAgICAgIGlmKGltYWdlU2l6ZSAmJiBpbWFnZVNpemUuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoUHQgPSBpbWFnZVNpemUud2lkdGggKiBoZWlnaHRQdCAvIGltYWdlU2l6ZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZihpbWFnZVNpemUgJiYgaW1hZ2VTaXplLmhlaWdodCAmJiBpbWFnZVNpemUud2lkdGgpIHtcbiAgICAgICAgICAgICAgICBoZWlnaHRQdCA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKGltYWdlU2l6ZS5oZWlnaHQudG9TdHJpbmcoKSwgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSwgMSwgJ3B4Jyk7XG4gICAgICAgICAgICAgICAgd2lkdGhQdCA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKGltYWdlU2l6ZS53aWR0aC50b1N0cmluZygpLCBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpLCAxLCAncHgnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB3aWR0aDogd2lkdGhQdCB8fCBkZWZhdWx0V2lkdGhQdCB8fCAwLCBoZWlnaHQ6IGhlaWdodFB0IHx8IGRlZmF1bHRIZWlnaHRQdCB8fCAwIH07XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9oZWxwZXJfc3VydmV5LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSUZsYXRRdWVzdGlvbiwgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbkRlZmF1bHQgfSBmcm9tICcuL2ZsYXRfZGVmYXVsdCc7XG5cbmV4cG9ydCB0eXBlIEZsYXRDb25zdHJ1Y3RvciA9IG5ldyAoXG4gICAgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyXG4pID0+IElGbGF0UXVlc3Rpb247XG5leHBvcnQgY2xhc3MgRmxhdFJlcG9zaXRvcnkge1xuICAgIHByaXZhdGUgcXVlc3Rpb25zOiB7IFtpbmRleDogc3RyaW5nXTogRmxhdENvbnN0cnVjdG9yIH0gPSB7fTtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogRmxhdFJlcG9zaXRvcnkgPSBuZXcgRmxhdFJlcG9zaXRvcnkoKTtcbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IEZsYXRSZXBvc2l0b3J5IHtcbiAgICAgICAgcmV0dXJuIEZsYXRSZXBvc2l0b3J5Lmluc3RhbmNlO1xuICAgIH1cbiAgICBwdWJsaWMgcmVnaXN0ZXIobW9kZWxUeXBlOiBzdHJpbmcsIHJlbmRlcmVyQ29uc3RydWN0b3I6IEZsYXRDb25zdHJ1Y3Rvcik6IHZvaWQge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uc1ttb2RlbFR5cGVdID0gcmVuZGVyZXJDb25zdHJ1Y3RvcjtcbiAgICB9XG4gICAgcHVibGljIGlzVHlwZVJlZ2lzdGVyZWQodHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMucXVlc3Rpb25zW3R5cGVdO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0UmVuZGVyZXIodHlwZTogc3RyaW5nKTogRmxhdENvbnN0cnVjdG9yIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb25zW3R5cGVdO1xuICAgIH1cbiAgICBwdWJsaWMgY3JlYXRlKHN1cnZleTogU3VydmV5UERGLCBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgICAgIGRvY0NvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHR5cGU/OiBzdHJpbmcpOiBJRmxhdFF1ZXN0aW9uIHtcbiAgICAgICAgY29uc3QgcXVlc3Rpb25UeXBlOiBzdHJpbmcgPSB0eXBlb2YgdHlwZSA9PT0gJ3VuZGVmaW5lZCcgPyBxdWVzdGlvbi5nZXRUeXBlKCkgOiB0eXBlO1xuICAgICAgICBsZXQgcmVuZGVyZXJDb25zdHJ1Y3RvciA9IHRoaXMuZ2V0UmVuZGVyZXIocXVlc3Rpb25UeXBlKTtcbiAgICAgICAgaWYoIXJlbmRlcmVyQ29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIGlmKCEhcXVlc3Rpb24uY3VzdG9tV2lkZ2V0Py5wZGZSZW5kZXIpIHtcbiAgICAgICAgICAgICAgICByZW5kZXJlckNvbnN0cnVjdG9yID0gRmxhdFF1ZXN0aW9uO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZW5kZXJlckNvbnN0cnVjdG9yID0gRmxhdFF1ZXN0aW9uRGVmYXVsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IHJlbmRlcmVyQ29uc3RydWN0b3Ioc3VydmV5LCBxdWVzdGlvbiwgZG9jQ29udHJvbGxlcik7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXIodHlwZTogc3RyaW5nLCByZW5kZXJlckNvbnN0cnVjdG9yOiBGbGF0Q29uc3RydWN0b3IpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKHR5cGUsIHJlbmRlcmVyQ29uc3RydWN0b3IpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldFJlbmRlcmVyKHR5cGU6IHN0cmluZyk6IEZsYXRDb25zdHJ1Y3RvciB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEluc3RhbmNlKCkuZ2V0UmVuZGVyZXIodHlwZSk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnkudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uLCBMb2NhbGl6YWJsZVN0cmluZywgU2VyaWFsaXplciB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0U3VydmV5IH0gZnJvbSAnLi9mbGF0X3N1cnZleSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgaW50ZXJmYWNlIElGbGF0UXVlc3Rpb24ge1xuICAgIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPjtcbiAgICBnZW5lcmF0ZUZsYXRzKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPjtcbn1cbmV4cG9ydCBjbGFzcyBGbGF0UXVlc3Rpb24gaW1wbGVtZW50cyBJRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIENPTlRFTlRfR0FQX1ZFUlRfU0NBTEU6IG51bWJlciA9IDAuNTtcbiAgICBwdWJsaWMgc3RhdGljIENPTlRFTlRfR0FQX0hPUl9TQ0FMRTogbnVtYmVyID0gMS4wO1xuICAgIHB1YmxpYyBzdGF0aWMgQ09OVEVOVF9JTkRFTlRfU0NBTEU6IG51bWJlciA9IDEuMDtcbiAgICBwdWJsaWMgc3RhdGljIERFU0NfR0FQX1NDQUxFOiBudW1iZXIgPSAwLjA2MjU7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdFRpdGxlKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRpdGxlRmxhdChwb2ludCxcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcik7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0RGVzY3JpcHRpb24ocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlRGVzY0ZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi5sb2NEZXNjcmlwdGlvbik7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0SGVhZGVyKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGNvbnN0IHRpdGxlRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRUaXRsZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKHRpdGxlRmxhdCk7XG4gICAgICAgIGlmKHRoaXMucXVlc3Rpb24uaGFzRGVzY3JpcHRpb25VbmRlclRpdGxlKSB7XG4gICAgICAgICAgICBjb25zdCBkZXNjUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludCh0aXRsZUZsYXQsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgIGRlc2NQb2ludC55VG9wICs9IEZsYXRRdWVzdGlvbi5ERVNDX0dBUF9TQ0FMRSAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgZGVzY1BvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0RGVzY3JpcHRpb24oZGVzY1BvaW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbW1lbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IHRleHQ6IExvY2FsaXphYmxlU3RyaW5nID0gdGhpcy5xdWVzdGlvbi5sb2NDb21tZW50VGV4dDtcbiAgICAgICAgY29uc3Qgb3RoZXJUZXh0RmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgcG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdGV4dCwgVGV4dEJyaWNrKTtcbiAgICAgICAgY29uc3Qgb3RoZXJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KG90aGVyVGV4dEZsYXQpO1xuICAgICAgICBvdGhlclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVCcmljayhvdGhlclRleHRGbGF0LCBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQ29tbWVudEZsYXQoXG4gICAgICAgICAgICBvdGhlclBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGZhbHNlLCB7IHJvd3M6IFN1cnZleUhlbHBlci5PVEhFUl9ST1dTX0NPVU5UIH0pKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb21wb3NpdGUocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY29udGVudFBhbmVsID0gKDxhbnk+dGhpcy5xdWVzdGlvbikuY29udGVudFBhbmVsO1xuICAgICAgICBpZiAoISFjb250ZW50UGFuZWwpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBGbGF0U3VydmV5LmdlbmVyYXRlRmxhdHNQYW5lbCh0aGlzLnN1cnZleSxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIGNvbnRlbnRQYW5lbCwgcG9pbnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSBTdXJ2ZXlIZWxwZXIuZ2V0Q29udGVudFF1ZXN0aW9uKHRoaXMucXVlc3Rpb24pO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50V2l0aE9wdGlvbmFsRWxlbWVudHMocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgZmxhdHM6IEFycmF5PElQZGZCcmljaz4gPSBbXTtcbiAgICAgICAgY29uc3QgY29udGVudEZsYXRzID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29tcG9zaXRlKHBvaW50KTtcbiAgICAgICAgZmxhdHMucHVzaCguLi5jb250ZW50RmxhdHMpO1xuICAgICAgICBjb25zdCBnZXRMYXRlc3RQb2ludCA9ICgpOiBJUG9pbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgICAgIGlmKGNvbnRlbnRGbGF0cyAhPT0gbnVsbCAmJiBjb250ZW50RmxhdHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzLnlUb3AgPSBTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi5mbGF0cykueUJvdCArIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5oYXNDb21tZW50KSB7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbW1lbnQoZ2V0TGF0ZXN0UG9pbnQoKSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmhhc0Rlc2NyaXB0aW9uVW5kZXJJbnB1dCkge1xuICAgICAgICAgICAgZmxhdHMucHVzaChhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdERlc2NyaXB0aW9uKGdldExhdGVzdFBvaW50KCkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHMocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KHRoaXMucXVlc3Rpb24uaW5kZW50KS53aWR0aDtcbiAgICAgICAgY29uc3QgaW5kZW50UG9pbnQ6IElQb2ludCA9IHtcbiAgICAgICAgICAgIHhMZWZ0OiBwb2ludC54TGVmdCArIHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dCh0aGlzLnF1ZXN0aW9uLmluZGVudCkud2lkdGgsXG4gICAgICAgICAgICB5VG9wOiBwb2ludC55VG9wXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBsZXQgdGl0bGVMb2NhdGlvbjogc3RyaW5nID0gdGhpcy5xdWVzdGlvbi5nZXRUaXRsZUxvY2F0aW9uKCk7XG4gICAgICAgIHRpdGxlTG9jYXRpb24gPSB0aGlzLnF1ZXN0aW9uLmhhc1RpdGxlID8gdGl0bGVMb2NhdGlvbiA6ICdoaWRkZW4nO1xuICAgICAgICBzd2l0Y2ggKHRpdGxlTG9jYXRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgICBjYXNlICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlckZsYXQgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEhlYWRlcihpbmRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGhlYWRlckZsYXQpO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludC54TGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfSU5ERU5UX1NDQUxFO1xuICAgICAgICAgICAgICAgIGhlYWRlckZsYXQuYWRkQnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoaGVhZGVyRmxhdCksIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICpcbiAgICAgICAgICAgICAgICAgICAgRmxhdFF1ZXN0aW9uLkNPTlRFTlRfR0FQX1ZFUlRfU0NBTEUgKyBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEZsYXRzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbnRlbnRXaXRoT3B0aW9uYWxFbGVtZW50cyhjb250ZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgaWYoY29udGVudEZsYXRzICE9PSBudWxsICYmIGNvbnRlbnRGbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyRmxhdC5hZGRCcmljayhjb250ZW50RmxhdHMuc2hpZnQoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goaGVhZGVyRmxhdCk7XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaCguLi5jb250ZW50RmxhdHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnYm90dG9tJzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKGluZGVudFBvaW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250ZW50UG9pbnQueExlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0lOREVOVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEZsYXRzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbnRlbnRXaXRoT3B0aW9uYWxFbGVtZW50cyhjb250ZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaCguLi5jb250ZW50RmxhdHMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlUG9pbnQ6IElQb2ludCA9IGluZGVudFBvaW50O1xuICAgICAgICAgICAgICAgIGlmIChmbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVQb2ludC55VG9wID0gZmxhdHNbZmxhdHMubGVuZ3RoIC0gMV0ueUJvdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGl0bGVQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfR0FQX1ZFUlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaChhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEhlYWRlcih0aXRsZVBvaW50KSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdsZWZ0Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLVxuICAgICAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuTVVMVElQTEVURVhUX1RFWFRfUEVSUyk7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEhlYWRlcihpbmRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoaGVhZGVyRmxhdCwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgY29udGVudFBvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9HQVBfSE9SX1NDQUxFO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSBjb250ZW50UG9pbnQueExlZnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEZsYXRzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbnRlbnRXaXRoT3B0aW9uYWxFbGVtZW50cyhjb250ZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIGlmKGNvbnRlbnRGbGF0cyAhPT0gbnVsbCAmJiBjb250ZW50RmxhdHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlckZsYXQuYWRkQnJpY2soY29udGVudEZsYXRzLnNoaWZ0KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKGhlYWRlckZsYXQpO1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goLi4uY29udGVudEZsYXRzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2hpZGRlbic6XG4gICAgICAgICAgICBjYXNlIFN1cnZleUhlbHBlci5USVRMRV9MT0NBVElPTl9NQVRSSVg6XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUoaW5kZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGlmICh0aXRsZUxvY2F0aW9uICE9PSBTdXJ2ZXlIZWxwZXIuVElUTEVfTE9DQVRJT05fTUFUUklYKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludC54TGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfSU5ERU5UX1NDQUxFO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goLi4uYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29udGVudFdpdGhPcHRpb25hbEVsZW1lbnRzKGNvbnRlbnRQb2ludCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0IHNob3VsZFJlbmRlckFzQ29tbWVudCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5zaG91bGRSZW5kZXJSZWFkT25seSh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgIH1cbn1cblxuU2VyaWFsaXplci5hZGRQcm9wZXJ0eSgncXVlc3Rpb24nLCB7XG4gICAgbmFtZTogJ3JlYWRvbmx5UmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAndGV4dCcsICdhY3JvZm9ybSddLFxuICAgIHZpc2libGU6IGZhbHNlXG59KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9xdWVzdGlvbi50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5cbmV4cG9ydCBjbGFzcyBUZXh0QnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJvdGVjdGVkIGFsaWduOiBhbnk7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcm90ZWN0ZWQgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgdGhpcy5hbGlnbiA9IHtcbiAgICAgICAgICAgIGlzSW5wdXRSdGw6IGZhbHNlLFxuICAgICAgICAgICAgaXNPdXRwdXRSdGw6IGNvbnRyb2xsZXIuaXNSVEwsXG4gICAgICAgICAgICBhbGlnbjogY29udHJvbGxlci5pc1JUTCA/ICdyaWdodCc6ICdsZWZ0JyxcbiAgICAgICAgICAgIGJhc2VsaW5lOiAnbWlkZGxlJ1xuICAgICAgICB9O1xuICAgIH1cbiAgICBwcml2YXRlIGVzY2FwZVRleHQoKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLnRleHQuaW5kZXhPZignXFx0JykgPiAtMSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGhpcy50ZXh0LnJlcGxhY2UoJ1xcdCcsIEFycmF5KDUpLmpvaW4oU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgYWxpZ25Qb2ludDogSVBvaW50ID0gdGhpcy5hbGlnblBvaW50KHRoaXMpO1xuICAgICAgICBsZXQgb2xkRm9udFNpemU6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gdGhpcy5mb250U2l6ZTtcbiAgICAgICAgbGV0IG9sZFRleHRDb2xvcjogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXRUZXh0Q29sb3IoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRUZXh0Q29sb3IodGhpcy50ZXh0Q29sb3IpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnRleHQodGhpcy5lc2NhcGVUZXh0KCksIGFsaWduUG9pbnQueExlZnQsIGFsaWduUG9pbnQueVRvcCwgdGhpcy5hbGlnbik7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0VGV4dENvbG9yKG9sZFRleHRDb2xvcik7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYWxpZ25Qb2ludChyZWN0OiBJUmVjdCk6IElQb2ludCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogdGhpcy5jb250cm9sbGVyLmlzUlRMID8gcmVjdC54UmlnaHQgOiByZWN0LnhMZWZ0LFxuICAgICAgICAgICAgeVRvcDogcmVjdC55VG9wICsgKHJlY3QueUJvdCAtIHJlY3QueVRvcCkgLyAyLjBcbiAgICAgICAgfTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHQudHMiLCJpbXBvcnQgeyBJUGRmQnJpY2ssIFRyYW5zbGF0ZVhGdW5jdGlvbiB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgQ29tcG9zaXRlQnJpY2sgaW1wbGVtZW50cyBJUGRmQnJpY2sge1xuICAgIHByaXZhdGUgYnJpY2tzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgIHByaXZhdGUgX3hMZWZ0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfeFJpZ2h0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfeVRvcDogbnVtYmVyO1xuICAgIHByaXZhdGUgX3lCb3Q6IG51bWJlcjtcbiAgICBwdWJsaWMgaXNQYWdlQnJlYWs6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoLi4uYnJpY2tzOiBJUGRmQnJpY2tbXSkge1xuICAgICAgICB0aGlzLl94TGVmdCA9IDAuMDtcbiAgICAgICAgdGhpcy5feFJpZ2h0ID0gMC4wO1xuICAgICAgICB0aGlzLl95VG9wID0gMC4wO1xuICAgICAgICB0aGlzLl95Qm90ID0gMC4wO1xuICAgICAgICB0aGlzLmFkZEJyaWNrKC4uLmJyaWNrcyk7XG4gICAgfVxuICAgIGdldCB4TGVmdCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5feExlZnQ7IH1cbiAgICBzZXQgeExlZnQoeExlZnQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNoaWZ0KHhMZWZ0IC0gdGhpcy54TGVmdCwgMC4wLCAwLjAsIDAuMCk7XG4gICAgICAgIHRoaXMuX3hMZWZ0ID0geExlZnQ7XG4gICAgfVxuICAgIGdldCB4UmlnaHQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3hSaWdodDsgfVxuICAgIHNldCB4UmlnaHQoeFJpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zaGlmdCgwLjAsIHhSaWdodCAtIHRoaXMueFJpZ2h0LCAwLjAsIDAuMCk7XG4gICAgICAgIHRoaXMuX3hSaWdodCA9IHhSaWdodDtcbiAgICB9XG4gICAgZ2V0IHlUb3AoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3lUb3A7IH1cbiAgICBzZXQgeVRvcCh5VG9wOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zaGlmdCgwLjAsIDAuMCwgeVRvcCAtIHRoaXMueVRvcCwgMC4wKTtcbiAgICAgICAgdGhpcy5feVRvcCA9IHlUb3A7XG4gICAgfVxuICAgIGdldCB5Qm90KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl95Qm90OyB9XG4gICAgc2V0IHlCb3QoeUJvdDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2hpZnQoMC4wLCAwLjAsIDAuMCwgeUJvdCAtIHRoaXMueUJvdCk7XG4gICAgICAgIHRoaXMuX3lCb3QgPSB5Qm90O1xuICAgIH1cbiAgICBwcml2YXRlIHNoaWZ0KGxlZnRTaGlmdDogbnVtYmVyLCByaWdodFNoaWZ0OiBudW1iZXIsXG4gICAgICAgIHRvcFNoaWZ0OiBudW1iZXIsIGJvdFNoaWZ0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5icmlja3MuZm9yRWFjaCgoYnJpY2s6IElQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgYnJpY2sueExlZnQgKz0gbGVmdFNoaWZ0O1xuICAgICAgICAgICAgYnJpY2sueFJpZ2h0ICs9IHJpZ2h0U2hpZnQ7XG4gICAgICAgICAgICBicmljay55VG9wICs9IHRvcFNoaWZ0O1xuICAgICAgICAgICAgYnJpY2sueUJvdCArPSBib3RTaGlmdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgd2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueFJpZ2h0IC0gdGhpcy54TGVmdDtcbiAgICB9XG4gICAgcHVibGljIGdldCBoZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueUJvdCAtIHRoaXMueVRvcDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuYnJpY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmJyaWNrc1tpXS5yZW5kZXIoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJyaWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIHB1YmxpYyBhZGRCcmljayguLi5icmlja3M6IElQZGZCcmlja1tdKSB7XG4gICAgICAgIGlmIChicmlja3MubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgIHRoaXMuYnJpY2tzLnB1c2goLi4uYnJpY2tzKTtcbiAgICAgICAgICAgIGxldCBtZXJnZVJlY3QgPSBTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi50aGlzLmJyaWNrcyk7XG4gICAgICAgICAgICB0aGlzLl94TGVmdCA9IG1lcmdlUmVjdC54TGVmdDtcbiAgICAgICAgICAgIHRoaXMuX3hSaWdodCA9IG1lcmdlUmVjdC54UmlnaHQ7XG4gICAgICAgICAgICB0aGlzLl95VG9wID0gbWVyZ2VSZWN0LnlUb3A7XG4gICAgICAgICAgICB0aGlzLl95Qm90ID0gbWVyZ2VSZWN0LnlCb3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIHVuZm9sZCgpOiBJUGRmQnJpY2tbXSB7XG4gICAgICAgIGNvbnN0IHVuZm9sZEJyaWNrczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgdGhpcy5icmlja3MuZm9yRWFjaCgoYnJpY2s6IElQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgdW5mb2xkQnJpY2tzLnB1c2goLi4uYnJpY2sudW5mb2xkKCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVuZm9sZEJyaWNrcztcbiAgICB9XG4gICAgdHJhbnNsYXRlWChmdW5jOiBUcmFuc2xhdGVYRnVuY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5icmlja3MuZm9yRWFjaChicmljayA9PiBicmljay50cmFuc2xhdGVYKGZ1bmMpKTtcbiAgICAgICAgY29uc3QgcmVzID0gZnVuYyh0aGlzLnhMZWZ0LCB0aGlzLnhSaWdodCk7XG4gICAgICAgIHRoaXMuX3hMZWZ0ID0gcmVzLnhMZWZ0O1xuICAgICAgICB0aGlzLl94UmlnaHQgPSByZXMueFJpZ2h0O1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlLnRzIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzZfXztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJyb290XCI6XCJTdXJ2ZXlcIixcImNvbW1vbmpzMlwiOlwic3VydmV5LWNvcmVcIixcImNvbW1vbmpzXCI6XCJzdXJ2ZXktY29yZVwiLFwiYW1kXCI6XCJzdXJ2ZXktY29yZVwifVxuLy8gbW9kdWxlIGlkID0gNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgeyBJUmVjdCwgSVNpemUsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCB0eXBlIFRyYW5zbGF0ZVhGdW5jdGlvbiA9ICh4TGVmdDogbnVtYmVyLCB4UmlnaHQgOiBudW1iZXIpID0+IHsgeExlZnQ6IG51bWJlciwgeFJpZ2h0OiBudW1iZXJ9O1xuZXhwb3J0IGludGVyZmFjZSBJUGRmQnJpY2sgZXh0ZW5kcyBJUmVjdCwgSVNpemUge1xuICAgIHJlbmRlcigpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHVuZm9sZCgpOiBJUGRmQnJpY2tbXTtcbiAgICB0cmFuc2xhdGVYKGZ1bmM6IFRyYW5zbGF0ZVhGdW5jdGlvbik6IHZvaWQ7XG4gICAgaXNQYWdlQnJlYWs6IGJvb2xlYW47XG59XG4vKipcbiAqIEFuIG9iamVjdCB0aGF0IGRlc2NyaWJlcyBhIFBERiBicmljayZtZGFzaDthIHNpbXBsZSBlbGVtZW50IHdpdGggc3BlY2lmaWVkIGNvbnRlbnQsIHNpemUsIGFuZCBsb2NhdGlvbi4gQnJpY2tzIGFyZSBmdW5kYW1lbnRhbCBlbGVtZW50cyB1c2VkIHRvIGNvbnN0cnVjdCBhIFBERiBkb2N1bWVudC5cbiAqXG4gKiBZb3UgY2FuIGFjY2VzcyBgUGRmQnJpY2tgIG9iamVjdHMgd2l0aGluIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSBgU3VydmV5UERGYCdzIFtgb25SZW5kZXJRdWVzdGlvbmBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2Uvc3VydmV5cGRmI29uUmVuZGVyUXVlc3Rpb24pLCBbYG9uUmVuZGVyUGFuZWxgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3N1cnZleXBkZiNvblJlbmRlclBhbmVsKSwgYW5kIFtgb25SZW5kZXJQYWdlYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9zdXJ2ZXlwZGYjb25SZW5kZXJQYWdlKSBldmVudHMuXG4gKlxuICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzL2FkZC1tYXJrdXAtdG8tY3VzdG9taXplLXBkZi1mb3Jtcy8gKGxpbmtTdHlsZSkpXG4gKi9cbmV4cG9ydCBjbGFzcyBQZGZCcmljayBpbXBsZW1lbnRzIElQZGZCcmljayB7XG4gICAgcHJvdGVjdGVkIF94TGVmdDogbnVtYmVyO1xuICAgIHByb3RlY3RlZCBfeFJpZ2h0OiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIF95VG9wOiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIF95Qm90OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBBbiBYLWNvb3JkaW5hdGUgZm9yIHRoZSBsZWZ0IGJyaWNrIGVkZ2UuXG4gICAgICovXG4gICAgcHVibGljIGdldCB4TGVmdCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5feExlZnQ7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgeExlZnQodmFsOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRYTGVmdCh2YWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBYLWNvb3JkaW5hdGUgZm9yIHRoZSByaWdodCBicmljayBlZGdlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgeFJpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl94UmlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgeFJpZ2h0KHZhbDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0WFJpZ2h0KHZhbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgWS1jb29yZGluYXRlIGZvciB0aGUgdG9wIGJyaWNrIGVkZ2UuXG4gICAgICovXG4gICAgcHVibGljIGdldCB5VG9wKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl95VG9wO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IHlUb3AodmFsOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRZVG9wKHZhbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgWS1jb29yZGluYXRlIGZvciB0aGUgYm90dG9tIGJyaWNrIGVkZ2UuXG4gICAgICovXG4gICAgcHVibGljIGdldCB5Qm90KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl95Qm90O1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IHlCb3QodmFsOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRZQm90dG9tKHZhbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZvbnQgc2l6ZSBpbiBwb2ludHMuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlOiAxNCAoaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudCBQREYgZG9jdW1lbnQpXG4gICAgICovXG4gICAgcHVibGljIGZvbnRTaXplOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbG9yIG9mIHRleHQgd2l0aGluIHRoZSBicmljay5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IGBcIiM0MDQwNDBcImBcbiAgICAgKi9cbiAgICBwdWJsaWMgdGV4dENvbG9yOiBzdHJpbmcgPSBTdXJ2ZXlIZWxwZXIuVEVYVF9DT0xPUjtcbiAgICBwdWJsaWMgZm9ybUJvcmRlckNvbG9yOiBzdHJpbmcgPSBTdXJ2ZXlIZWxwZXIuRk9STV9CT1JERVJfQ09MT1I7XG4gICAgcHVibGljIGlzUGFnZUJyZWFrOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVjdDogSVJlY3QpIHtcbiAgICAgICAgdGhpcy54TGVmdCA9IHJlY3QueExlZnQ7XG4gICAgICAgIHRoaXMueFJpZ2h0ID0gcmVjdC54UmlnaHQ7XG4gICAgICAgIHRoaXMueVRvcCA9IHJlY3QueVRvcDtcbiAgICAgICAgdGhpcy55Qm90ID0gcmVjdC55Qm90O1xuICAgICAgICB0aGlzLmZvbnRTaXplID0gISFjb250cm9sbGVyID9cbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgOiBEb2NDb250cm9sbGVyLkZPTlRfU0laRTtcbiAgICB9XG4gICAgdHJhbnNsYXRlWChmdW5jOiBUcmFuc2xhdGVYRnVuY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVzID0gZnVuYyh0aGlzLnhMZWZ0LCB0aGlzLnhSaWdodCk7XG4gICAgICAgIHRoaXMueExlZnQgPSByZXMueExlZnQ7XG4gICAgICAgIHRoaXMueFJpZ2h0ID0gcmVzLnhSaWdodDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGJyaWNrJ3Mgd2lkdGggaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgd2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueFJpZ2h0IC0gdGhpcy54TGVmdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGJyaWNrJ3MgaGVpZ2h0IGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy55Qm90IC0gdGhpcy55VG9wO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0U2hvdWxkUmVuZGVyUmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBTdXJ2ZXlIZWxwZXIuc2hvdWxkUmVuZGVyUmVhZE9ubHkodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyKTtcbiAgICB9XG4gICAgcHVibGljIGFmdGVyUmVuZGVyQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gICAgcHVibGljIGFzeW5jIHJlbmRlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0U2hvdWxkUmVuZGVyUmVhZE9ubHkoKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJSZWFkT25seSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgYXdhaXQgdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgICAgICB0aGlzLmFmdGVyUmVuZGVyQ2FsbGJhY2sgJiYgdGhpcy5hZnRlclJlbmRlckNhbGxiYWNrKCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbGxvd3MgeW91IHRvIGdldCBhIGZsYXQgYXJyYXkgb2YgbmVzdGVkIFBERiBicmlja3MuXG4gICAgICogQHJldHVybnMgQSBmbGF0IGFycmF5IG9mIG5lc3RlZCBQREYgYnJpY2tzLlxuICAgICAqL1xuICAgIHB1YmxpYyB1bmZvbGQoKTogSVBkZkJyaWNrW10ge1xuICAgICAgICByZXR1cm4gW3RoaXNdO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0Q29ycmVjdGVkVGV4dCh2YWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuaXNSVEwgPyAodmFsIHx8ICcnKS5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpOiB2YWw7XG4gICAgfVxuICAgIHByb3RlY3RlZCBzZXRYTGVmdCh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl94TGVmdCA9IHZhbDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHNldFhSaWdodCh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl94UmlnaHQgPSB2YWw7XG4gICAgfVxuICAgIHByb3RlY3RlZCBzZXRZVG9wKHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3lUb3AgPSB2YWw7XG4gICAgfVxuICAgIHByb3RlY3RlZCBzZXRZQm90dG9tKHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3lCb3QgPSB2YWw7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2JyaWNrLnRzIiwiaW1wb3J0IHsganNQREYsIGpzUERGT3B0aW9ucyB9IGZyb20gJ2pzcGRmJztcbmltcG9ydCB7IElIVE1MUmVuZGVyVHlwZSB9IGZyb20gJy4vZmxhdF9sYXlvdXQvZmxhdF9odG1sJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gJ3N1cnZleS1jb3JlJztcbi8vIGltcG9ydCBGb250cyBmcm9tICcuL2ZvbnRzJztcbmltcG9ydCBzZXRSYWRpb0FwcGVhcmFuY2UgZnJvbSAnLi9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtJztcbmltcG9ydCAnLi9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtLmpzJztcbmltcG9ydCAnLi9qc3BkZl9wbHVnaW5zL2Zyb21faHRtbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBvaW50IHtcbiAgICAvKipcbiAgICAgKiBBbiBYLWNvb3JkaW5hdGUgZm9yIHRoZSBsZWZ0IGVsZW1lbnQgZWRnZS5cbiAgICAgKi9cbiAgICB4TGVmdDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgWS1jb29yZGluYXRlIGZvciB0aGUgdG9wIGVsZW1lbnQgZWRnZS5cbiAgICAgKi9cbiAgICB5VG9wOiBudW1iZXI7XG59XG4vKipcbiAqIEFuIGludGVyZmFjZSB0aGF0IGRlc2NyaWJlcyBhIHJlY3RhbmdsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUmVjdCBleHRlbmRzIElQb2ludCB7XG4gICAgLyoqXG4gICAgICogQW4gWC1jb29yZGluYXRlIGZvciB0aGUgcmlnaHQgZWxlbWVudCBlZGdlLlxuICAgICAqL1xuICAgIHhSaWdodDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgWS1jb29yZGluYXRlIGZvciB0aGUgYm90dG9tIGVsZW1lbnQgZWRnZS5cbiAgICAgKi9cbiAgICB5Qm90OiBudW1iZXI7XG59XG5leHBvcnQgaW50ZXJmYWNlIElTaXplIHtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBJTWFyZ2luTFIge1xuICAgIC8qKlxuICAgICAqIEEgbGVmdCBtYXJnaW4uXG4gICAgICovXG4gICAgbGVmdD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHJpZ2h0IG1hcmdpbi5cbiAgICAgKi9cbiAgICByaWdodD86IG51bWJlcjtcbn1cbi8qKlxuICogQW4gaW50ZXJmYWNlIHRoYXQgZGVzY3JpYmVzIG1hcmdpbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSU1hcmdpbiBleHRlbmRzIElNYXJnaW5MUiB7XG4gICAgLyoqXG4gICAgICogQSB0b3AgbWFyZ2luLlxuICAgICAqL1xuICAgIHRvcD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIGJvdHRvbSBtYXJnaW4uXG4gICAgICovXG4gICAgYm90PzogbnVtYmVyO1xufVxuLyoqXG4gKiBQREYgZG9jdW1lbnQgY29uZmlndXJhdGlvbi4gUGFzcyBpdCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBgU3VydmV5UERGYCBjb25zdHJ1Y3RvcjpcbiAqXG4gKiBgYGBqc1xuICogY29uc3Qgc3VydmV5UGRmID0gbmV3IFN1cnZleVBERi5TdXJ2ZXlQREYoc3VydmV5SnNvbiwgcGRmRG9jT3B0aW9ucyk7XG4gKlxuICogLy8gSW4gbW9kdWxhciBhcHBsaWNhdGlvbnM6XG4gKiBpbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tIFwic3VydmV5LXBkZlwiO1xuICogY29uc3Qgc3VydmV5UGRmID0gbmV3IFN1cnZleVBERihzdXJ2ZXlKc29uLCBwZGZEb2NPcHRpb25zKTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElEb2NPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBQYWdlIG9yaWVudGF0aW9uLlxuICAgICAqXG4gICAgICogUG9zc2libGUgdmFsdWVzOlxuICAgICAqXG4gICAgICogLSBgXCJwXCJgIChkZWZhdWx0KSAtIFBvcnRyYWl0IG9yaWVudGF0aW9uLlxuICAgICAqIC0gYFwibFwiYCAtIExhbmRzY2FwZSBvcmllbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzZWUgZm9ybWF0XG4gICAgICovXG4gICAgb3JpZW50YXRpb24/OiAncCcgfCAnbCc7XG5cbiAgICAvKipcbiAgICAgKiBQYWdlIGZvcm1hdC5cbiAgICAgKlxuICAgICAqIFBvc3NpYmxlIHZhbHVlczpcbiAgICAgKlxuICAgICAqIC0gYFwiYTBcImAgLSBgXCJhMTBcImAgKGBcImE0XCJgIGlzIGRlZmF1bHQpXG4gICAgICogLSBgXCJiMFwiYCAtIGBcImIxMFwiYFxuICAgICAqIC0gYFwiYzBcImAgLSBgXCJjMTBcImBcbiAgICAgKiAtIGBcImRsXCJgXG4gICAgICogLSBgXCJsZXR0ZXJcImBcbiAgICAgKiAtIGBcImdvdmVybm1lbnQtbGV0dGVyXCJgXG4gICAgICogLSBgXCJsZWdhbFwiYFxuICAgICAqIC0gYFwianVuaW9yLWxlZ2FsXCJgXG4gICAgICogLSBgXCJsZWRnZXJcImBcbiAgICAgKiAtIGBcInRhYmxvaWRcImBcbiAgICAgKiAtIGBcImNyZWRpdC1jYXJkXCJgXG4gICAgICogLSBBcnJheTxudW1iZXI+IC0gY3VzdG9tIHBhZ2Ugc2l6ZSBpbiBtaWxsaW1ldGVycywgZm9yIGV4YW1wbGUsIGBbMjEwLCAyOTddYC5cbiAgICAgKlxuICAgICAqIEBzZWUgb3JpZW50YXRpb25cbiAgICAgKi9cbiAgICBmb3JtYXQ/OiBzdHJpbmcgfCBudW1iZXJbXTtcblxuICAgIC8qKlxuICAgICAqIEZvbnQgc2l6ZSBpbiBwb2ludHMuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlOiAxNFxuICAgICAqXG4gICAgICogQHNlZSBmb250TmFtZVxuICAgICAqL1xuICAgIGZvbnRTaXplPzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogRm9udCBuYW1lLlxuICAgICAqXG4gICAgICogUG9zc2libGUgdmFsdWVzOlxuICAgICAqXG4gICAgICogLSBgXCJIZWx2ZXRpY2FcImAgKGRlZmF1bHQpXG4gICAgICogLSBgXCJDb3VyaWVyXCJgXG4gICAgICogLSBgXCJUaW1lc1wiYFxuICAgICAqIC0gYFwiU3ltYm9sXCJgXG4gICAgICogLSBgXCJaYXBmRGluZ2JhdHNcImBcbiAgICAgKiAtIFtDdXN0b20gZm9udCBuYW1lXShodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vUGRmLUV4cG9ydD9pZD1DdXN0b21pemF0aW9uLUNoYW5nZUZvbnRzI3VzZS1jdXN0b20tZm9udClcbiAgICAgKlxuICAgICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9jaGFuZ2UtZm9udC1pbi1wZGYtZm9ybS8gKGxpbmtTdHlsZSkpXG4gICAgICogQHNlZSBmb250U2l6ZVxuICAgICAqL1xuICAgIGZvbnROYW1lPzogc3RyaW5nO1xuXG4gICAgYmFzZTY0Tm9ybWFsPzogc3RyaW5nO1xuICAgIGJhc2U2NEJvbGQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gYXBwbHkgYSBjdXN0b20gZm9udCB0byBbSFRNTCBxdWVzdGlvbnNdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2V4YW1wbGVzL3F1ZXN0aW9udHlwZS1odG1sLykuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlOiBgZmFsc2VgXG4gICAgICpcbiAgICAgKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZXhhbXBsZXMvY2hhbmdlLWZvbnQtaW4tcGRmLWZvcm0vIChsaW5rU3R5bGUpKVxuICAgICAqIEBzZWUgaHRtbFJlbmRlckFzXG4gICAgICovXG4gICAgdXNlQ3VzdG9tRm9udEluSHRtbD86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBQYWdlIG1hcmdpbnMuIFNldCB0aGlzIHByb3BlcnR5IHRvIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgZmllbGRzOiBgdG9wYCwgYGJvdGAsIGBsZWZ0YCwgYHJpZ2h0YC5cbiAgICAgKi9cbiAgICBtYXJnaW5zPzogSU1hcmdpbjtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBob3cgdG8gcmVuZGVyIFtIVE1MIHF1ZXN0aW9uc10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnk/aWQ9cXVlc3Rpb25odG1sbW9kZWwpIGludG8gUERGLlxuICAgICAqXG4gICAgICogUG9zc2libGUgdmFsdWVzOlxuICAgICAqXG4gICAgICogLSBgXCJzdGFuZGFyZFwiYCAtIFJlbmRlciBIVE1MIHF1ZXN0aW9ucyBhcyBzZWxlY3RhYmxlIHRleHQuXG4gICAgICogLSBgXCJpbWFnZVwiYCAtIFJlbmRlciBIVE1MIHF1ZXN0aW9ucyBhcyBpbWFnZXMuXG4gICAgICogLSBgXCJhdXRvXCJgIChkZWZhdWx0KSAtIFNlbGVjdCBiZXR3ZWVuIHRoZSBgXCJzdGFuZGFyZFwiYCBhbmQgYFwiaW1hZ2VcImAgbW9kZXMgYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGUgSFRNTCBjb250ZW50LlxuICAgICAqXG4gICAgICogWW91IGNhbiBvdmVycmlkZSB0aGlzIHByb3BlcnR5IGZvciBhbiBpbmRpdmlkdWFsIEhUTUwgcXVlc3Rpb24uIFNldCB0aGUgcXVlc3Rpb24ncyBgcmVuZGVyQXNgIHByb3BlcnR5IHRvIGBcInN0YW5kYXJkXCJgIG9yIGBcImltYWdlXCJgIGluIHRoZSBzdXJ2ZXkgSlNPTiBzY2hlbWEuXG4gICAgICogQHNlZSB1c2VDdXN0b21Gb250SW5IdG1sXG4gICAgICovXG4gICAgaHRtbFJlbmRlckFzPzogSUhUTUxSZW5kZXJUeXBlO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGhvdyB0byByZW5kZXIgW01hdHJpeF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnk/aWQ9cXVlc3Rpb25tYXRyaXhtb2RlbCksIFtNYXRyaXggRHJvcGRvd25dKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5P2lkPXF1ZXN0aW9ubWF0cml4ZHJvcGRvd25tb2RlbCksIGFuZCBbTWF0cml4IER5bmFtaWNdKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5P2lkPXF1ZXN0aW9ubWF0cml4ZHluYW1pY21vZGVsKSBxdWVzdGlvbnMgaW50byBQREYuXG4gICAgICpcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICpcbiAgICAgKiAtIGBcImxpc3RcImAgLSBSZW5kZXIgbWF0cml4LWxpa2UgcXVlc3Rpb25zIGFzIGxpc3RzLlxuICAgICAqIC0gYFwiYXV0b1wiYCAoZGVmYXVsdCkgLSBSZW5kZXIgbWF0cml4LWxpa2UgcXVlc3Rpb25zIGFzIHRhYmxlcyBpZiB0aGV5IGZpdCBpbnRvIHRoZSBhdmFpbGFibGUgc3BhY2UuIE90aGVyd2lzZSwgcmVuZGVyIHRoZSBxdWVzdGlvbnMgYXMgbGlzdHMuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgcHJvcGVydHkgZm9yIGFuIGluZGl2aWR1YWwgbWF0cml4LWxpa2UgcXVlc3Rpb24uIFNldCB0aGUgcXVlc3Rpb24ncyBgcmVuZGVyQXNgIHByb3BlcnR5IHRvIGBcImxpc3RcImAgaW4gdGhlIHN1cnZleSBKU09OIHNjaGVtYS5cbiAgICAgKi9cbiAgICBtYXRyaXhSZW5kZXJBcz86ICdhdXRvJyB8ICdsaXN0JztcbiAgICB1c2VMZWdhY3lCb29sZWFuUmVuZGVyaW5nPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgaG93IHRvIHJlbmRlciByZWFkLW9ubHkgcXVlc3Rpb25zLlxuICAgICAqXG4gICAgICogUG9zc2libGUgdmFsdWVzOlxuICAgICAqXG4gICAgICogLSBgXCJ0ZXh0XCJgIC0gUmVuZGVyIHJlYWQtb25seSBxdWVzdGlvbnMgYXMgcGxhaW4gdGV4dCBhbmQgY3VzdG9tIHByaW1pdGl2ZXMuXG4gICAgICogLSBgXCJhY3JvZm9ybVwiYCAtIFVzZSBBZG9iZSBBY3JvRm9ybXMgdG8gcmVuZGVyIHF1ZXN0aW9ucyB0aGF0IHN1cHBvcnQgdGhlbSBhcyBpbnRlcmFjdGl2ZSBmb3JtIGVsZW1lbnRzIHN3aXRjaGVkIHRvIHRoZWlyIG5hdGl2ZSByZWFkLW9ubHkgc3RhdGUuIE90aGVyIHF1ZXN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gYFwidGV4dFwiYCBtb2RlLlxuICAgICAqIC0gYFwiYXV0b1wiYCAoZGVmYXVsdCkgLSBQcmVmZXIgdGhlIGBcInRleHRcImAgbW9kZSBidXQgdXNlIGBcImFjcm9mb3JtXCJgIGZvciBbRmlsZSBVcGxvYWRdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9maWxlLW1vZGVsKSBxdWVzdGlvbnMgYW5kIGxpbmtzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5UmVuZGVyQXM/OiAnYXV0bycgfCAndGV4dCcgfCAnYWNyb2Zvcm0nO1xuXG4gICAgdGV4dEZpZWxkUmVuZGVyQXM/OiAnc2luZ2xlTGluZScgfCAnbXVsdGlMaW5lJztcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGNvbXByZXNzIHRoZSBQREYgZG9jdW1lbnQuIENvbXByZXNzZWQgZG9jdW1lbnRzIGRvIG5vdCBzdXBwb3J0IFtjdXN0b20gZm9udHNdKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9QZGYtRXhwb3J0P2lkPUN1c3RvbWl6YXRpb24tQ2hhbmdlRm9udHMjdXNlLWN1c3RvbS1mb250KS5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICAgKi9cbiAgICBjb21wcmVzcz86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBhcHBseSBgaW1hZ2VGaXRgIHNldHRpbmdzIHNwZWNpZmllZCBpbiB0aGUgc3VydmV5IEpTT04gc2NoZW1hIHRvIGV4cG9ydGVkIGltYWdlcy5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICAgKlxuICAgICAqIFRoaXMgcHJvcGVydHkgYXBwbGllcyB0aGUgZm9sbG93aW5nIHNldHRpbmdzOlxuICAgICAqXG4gICAgICogLSBbYGltYWdlRml0YF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2FkZC1pbWFnZS10by1zdXJ2ZXkjaW1hZ2VGaXQpIHRvIGV4cG9ydGVkIFtJbWFnZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2FkZC1pbWFnZS10by1zdXJ2ZXkpIHF1ZXN0aW9uc1xuICAgICAqIC0gW2BpbWFnZUZpdGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pbWFnZS1waWNrZXItcXVlc3Rpb24tbW9kZWwjaW1hZ2VGaXQpIHRvIGV4cG9ydGVkIFtJbWFnZSBQaWNrZXJdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pbWFnZS1waWNrZXItcXVlc3Rpb24tbW9kZWwpIHF1ZXN0aW9uc1xuICAgICAqIC0gW2Bsb2dvRml0YF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3N1cnZleS1kYXRhLW1vZGVsI2xvZ29GaXQpIHRvIGFuIGV4cG9ydGVkIGxvZ28gaW4gdGhlIHN1cnZleSBoZWFkZXJcbiAgICAgKlxuICAgICAqIElmIHlvdSBlbmFibGUgdGhlIGBhcHBseUltYWdlRml0YCBwcm9wZXJ0eSwgdGhlIHF1YWxpdHkgb2YgaW1hZ2VzIG1heSBiZSBsb3dlciBiZWNhdXNlIHRoZXkgcGFzcyB0aHJvdWdoIHNldmVyYWwgY29udmVyc2lvbnMuIElmIGBhcHBseUltYWdlRml0YCBpcyBkaXNhYmxlZCwgZXhwb3J0ZWQgaW1hZ2VzIGZpbGwgdGhlIGVudGlyZSBjb250YWluZXIgYW5kIGRvIG5vdCBwcmVzZXJ2ZSB0aGVpciBhc3BlY3QgcmF0aW8sIGJ1dCB0aGVpciBxdWFsaXR5IHJlbWFpbnMgdGhlIHNhbWUgYmVjYXVzZSB0aGV5IGFyZSBleHBvcnRlZCBhcyBpcy5cbiAgICAgKi9cbiAgICBhcHBseUltYWdlRml0PzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBQREYgZG9jdW1lbnQgY29udGFpbnMgdGV4dCBpbiByaWdodC10by1sZWZ0IGxhbmd1YWdlcy5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICAgKi9cbiAgICBpc1JUTD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gaW5jbHVkZSBvbmx5IHNlbGVjdGVkIGNob2ljZXMgd2hlbiBQREYgR2VuZXJhdG9yIHJlbmRlcnMgYSBbTXVsdGktU2VsZWN0IERyb3Bkb3duIChUYWcgQm94KV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZXhhbXBsZXMvaG93LXRvLWNyZWF0ZS1tdWx0aXNlbGVjdC10YWctYm94LykgcXVlc3Rpb24uXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlOiBgZmFsc2VgIChpbmNsdWRlIGFsbCBjaG9pY2VzKVxuICAgICAqL1xuICAgIHRhZ2JveFNlbGVjdGVkQ2hvaWNlc09ubHk/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgRG9jT3B0aW9ucyBpbXBsZW1lbnRzIElEb2NPcHRpb25zIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE1NX1RPX1BUID0gNzIgLyAyNS40O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRk9OVF9TSVpFID0gMTQ7XG4gICAgcHJvdGVjdGVkIF9vcmllbnRhdGlvbjogJ2wnIHwgJ3AnO1xuICAgIHByb3RlY3RlZCBfZm9ybWF0OiBzdHJpbmcgfCBudW1iZXJbXTtcbiAgICBwcm90ZWN0ZWQgX2ZvbnRTaXplOiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIF9mb250TmFtZTogc3RyaW5nO1xuICAgIHB1YmxpYyBzdGF0aWMgU0VHT0VfTk9STUFMOiBzdHJpbmc7XG4gICAgcHVibGljIHN0YXRpYyBTRUdPRV9CT0xEOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9iYXNlNjROb3JtYWw6IHN0cmluZyA9IHVuZGVmaW5lZDtcbiAgICBwcm90ZWN0ZWQgX2Jhc2U2NEJvbGQ6IHN0cmluZyA9IHVuZGVmaW5lZDtcbiAgICBwcm90ZWN0ZWQgX3VzZUN1c3RvbUZvbnRJbkh0bWw6IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIF9tYXJnaW5zOiBJTWFyZ2luO1xuICAgIHByb3RlY3RlZCBfaHRtbFJlbmRlckFzOiBJSFRNTFJlbmRlclR5cGU7XG4gICAgcHJvdGVjdGVkIF9tYXRyaXhSZW5kZXJBczogJ2F1dG8nIHwgJ2xpc3QnO1xuICAgIHByb3RlY3RlZCBfcmVhZG9ubHlSZW5kZXJBczogJ2F1dG8nIHwgJ3RleHQnIHwgJ2Fjcm9mb3JtJztcbiAgICBwcm90ZWN0ZWQgX2NvbXByZXNzOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBfYXBwbHlJbWFnZUZpdDogYm9vbGVhbjtcbiAgICBwcm90ZWN0ZWQgX3VzZUxlZ2FjeUJvb2xlYW5SZW5kZXJpbmc6IGJvb2xlYW5cbiAgICBwcm90ZWN0ZWQgX2lzUlRMOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBfdGFnYm94U2VsZWN0ZWRDaG9pY2VzT25seTogYm9vbGVhbjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogSURvY09wdGlvbnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm9yaWVudGF0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmZvcm1hdCA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm1hdFswXSA8IG9wdGlvbnMuZm9ybWF0WzFdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb3JpZW50YXRpb24gPSAncCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHRoaXMuX29yaWVudGF0aW9uID0gJ2wnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgdGhpcy5fb3JpZW50YXRpb24gPSBvcHRpb25zLm9yaWVudGF0aW9uO1xuICAgICAgICB0aGlzLl9mb3JtYXQgPSBvcHRpb25zLmZvcm1hdCB8fCAnYTQnO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9mb3JtYXQpKSB7XG4gICAgICAgICAgICB0aGlzLl9mb3JtYXQgPSB0aGlzLl9mb3JtYXQubWFwKGYgPT4gZiAqIERvY09wdGlvbnMuTU1fVE9fUFQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2ZvbnRTaXplID0gb3B0aW9ucy5mb250U2l6ZSB8fCBEb2NPcHRpb25zLkZPTlRfU0laRTtcbiAgICAgICAgaWYoIW9wdGlvbnMuZm9udE5hbWUpIHtcbiAgICAgICAgICAgIGlmKCFEb2NPcHRpb25zLlNFR09FX0JPTEQgJiYgIURvY09wdGlvbnMuU0VHT0VfTk9STUFMKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9udE5hbWUgPSBTdXJ2ZXlIZWxwZXIuU1RBTkRBUkRfRk9OVDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9udE5hbWUgPSAnc2Vnb2UnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZm9udE5hbWUgPSBvcHRpb25zLmZvbnROYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICgodHlwZW9mIG9wdGlvbnMuZm9udE5hbWUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAodHlwZW9mIG9wdGlvbnMuYmFzZTY0Tm9ybWFsICE9PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiBvcHRpb25zLmJhc2U2NEJvbGQgIT09ICd1bmRlZmluZWQnKSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2Jhc2U2NE5vcm1hbCA9IG9wdGlvbnMuYmFzZTY0Tm9ybWFsIHx8IG9wdGlvbnMuYmFzZTY0Qm9sZDtcbiAgICAgICAgICAgIHRoaXMuX2Jhc2U2NEJvbGQgPSBvcHRpb25zLmJhc2U2NEJvbGQgfHwgb3B0aW9ucy5iYXNlNjROb3JtYWw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5mb250TmFtZSA9PT0gJ3NlZ29lJykge1xuICAgICAgICAgICAgLy8gdGhpcy5fYmFzZTY0Tm9ybWFsID0gRm9udHMuU0VHT0VfTk9STUFMO1xuICAgICAgICAgICAgLy8gdGhpcy5fYmFzZTY0Qm9sZCA9IEZvbnRzLlNFR09FX0JPTEQ7XG4gICAgICAgICAgICB0aGlzLl9iYXNlNjROb3JtYWwgPSBEb2NPcHRpb25zLlNFR09FX05PUk1BTDtcbiAgICAgICAgICAgIHRoaXMuX2Jhc2U2NEJvbGQgPSBEb2NPcHRpb25zLlNFR09FX0JPTEQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWFyZ2lucyA9IFN1cnZleUhlbHBlci5jbG9uZShvcHRpb25zLm1hcmdpbnMpO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX21hcmdpbnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXJnaW5zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9tYXJnaW5zLnRvcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcmdpbnMudG9wID0gMTAuMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX21hcmdpbnMuYm90ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fbWFyZ2lucy5ib3QgPSAxMC4wO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fbWFyZ2lucy5sZWZ0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fbWFyZ2lucy5sZWZ0ID0gMTAuMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX21hcmdpbnMucmlnaHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXJnaW5zLnJpZ2h0ID0gMTAuMDtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLl9tYXJnaW5zKS5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICg8YW55PnRoaXMuX21hcmdpbnMpW25hbWVdID0gKDxhbnk+dGhpcy5fbWFyZ2lucylbbmFtZV0gKiBEb2NPcHRpb25zLk1NX1RPX1BUO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5faHRtbFJlbmRlckFzID0gb3B0aW9ucy5odG1sUmVuZGVyQXMgfHwgJ2F1dG8nO1xuICAgICAgICB0aGlzLl9tYXRyaXhSZW5kZXJBcyA9IG9wdGlvbnMubWF0cml4UmVuZGVyQXMgfHwgJ2F1dG8nO1xuICAgICAgICB0aGlzLl9yZWFkb25seVJlbmRlckFzID0gb3B0aW9ucy5yZWFkb25seVJlbmRlckFzIHx8ICdhdXRvJztcbiAgICAgICAgdGhpcy5fY29tcHJlc3MgPSBvcHRpb25zLmNvbXByZXNzIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLl9hcHBseUltYWdlRml0ID0gb3B0aW9ucy5hcHBseUltYWdlRml0IHx8IGZhbHNlO1xuICAgICAgICB0aGlzLl91c2VMZWdhY3lCb29sZWFuUmVuZGVyaW5nID0gb3B0aW9ucy51c2VMZWdhY3lCb29sZWFuUmVuZGVyaW5nIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc1JUTCA9IG9wdGlvbnMuaXNSVEwgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuX3RhZ2JveFNlbGVjdGVkQ2hvaWNlc09ubHkgPSBvcHRpb25zLnRhZ2JveFNlbGVjdGVkQ2hvaWNlc09ubHkgfHwgZmFsc2U7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgbGVmdFRvcFBvaW50KCk6IElQb2ludCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogdGhpcy5tYXJnaW5zLmxlZnQsXG4gICAgICAgICAgICB5VG9wOiB0aGlzLm1hcmdpbnMudG9wXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9udFNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnRTaXplO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGZvbnROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250TmFtZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBiYXNlNjROb3JtYWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2U2NE5vcm1hbDtcbiAgICB9XG4gICAgcHVibGljIGdldCBiYXNlNjRCb2xkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iYXNlNjRCb2xkO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHVzZUN1c3RvbUZvbnRJbkh0bWwoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl91c2VDdXN0b21Gb250SW5IdG1sO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IG1hcmdpbnMoKTogSU1hcmdpbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXJnaW5zO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGZvcm1hdCgpOiBzdHJpbmcgfCBudW1iZXJbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb3JtYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgb3JpZW50YXRpb24oKTogJ2wnIHwgJ3AnIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29yaWVudGF0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGh0bWxSZW5kZXJBcygpOiBJSFRNTFJlbmRlclR5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5faHRtbFJlbmRlckFzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IG1hdHJpeFJlbmRlckFzKCk6ICdhdXRvJyB8ICdsaXN0JyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXRyaXhSZW5kZXJBcztcbiAgICB9XG4gICAgcHVibGljIGdldCByZWFkb25seVJlbmRlckFzKCk6ICdhdXRvJyB8ICd0ZXh0JyB8ICdhY3JvZm9ybScge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHlSZW5kZXJBcztcbiAgICB9XG4gICAgcHVibGljIGdldCBjb21wcmVzcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbXByZXNzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGFwcGx5SW1hZ2VGaXQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBseUltYWdlRml0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHVzZUxlZ2FjeUJvb2xlYW5SZW5kZXJpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl91c2VMZWdhY3lCb29sZWFuUmVuZGVyaW5nO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGlzUlRMKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNSVEw7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdGFnYm94U2VsZWN0ZWRDaG9pY2VzT25seSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhZ2JveFNlbGVjdGVkQ2hvaWNlc09ubHk7XG4gICAgfVxufVxuXG4vKipcbiAqIFRoZSBgRG9jQ29udHJvbGxlcmAgb2JqZWN0IGluY2x1ZGVzIGFuIEFQSSB0aGF0IGFsbG93cyB5b3UgdG8gY29uZmlndXJlIHRoZSByZXN1bHRpbmcgUERGIGRvY3VtZW50LiBZb3UgY2FuIGFjY2VzcyB0aGlzIG9iamVjdCB3aXRoaW4gZnVuY3Rpb25zIHRoYXQgaGFuZGxlIHRoZSBgU3VydmV5UERGYCdzIFtgb25SZW5kZXIuLi5gXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3N1cnZleXBkZiNvblJlbmRlckZvb3RlcikgZXZlbnRzLlxuICpcbiAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9ob3ctdG8tdXNlLWFkb3JuZXJzLWluLXBkZi1mb3Jtcy8gKGxpbmtTdHlsZSkpXG4gKi9cbmV4cG9ydCBjbGFzcyBEb2NDb250cm9sbGVyIGV4dGVuZHMgRG9jT3B0aW9ucyB7XG4gICAgcHJpdmF0ZSBfZG9jOiBqc1BERjtcbiAgICBwcml2YXRlIF9oZWxwZXJEb2M6IGpzUERGO1xuICAgIHByaXZhdGUgX2ZvbnRTdHlsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgbWFyZ2luc1N0YWNrOiBJTWFyZ2luTFJbXTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogSURvY09wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgICAgY29uc3QganNwZGZPcHRpb25zOiBqc1BERk9wdGlvbnMgPSB7XG4gICAgICAgICAgICBvcmllbnRhdGlvbjogdGhpcy5vcmllbnRhdGlvbixcbiAgICAgICAgICAgIHVuaXQ6ICdwdCcsXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuZm9ybWF0LFxuICAgICAgICAgICAgY29tcHJlc3M6IHRoaXMuY29tcHJlc3NcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fZG9jID0gbmV3IGpzUERGKGpzcGRmT3B0aW9ucyk7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5iYXNlNjROb3JtYWwgIT09ICd1bmRlZmluZWQnICYmICFTdXJ2ZXlIZWxwZXIuaXNGb250RXhpc3QodGhpcywgdGhpcy5mb250TmFtZSkpIHtcbiAgICAgICAgICAgIERvY0NvbnRyb2xsZXIuYWRkRm9udCh0aGlzLmZvbnROYW1lLCB0aGlzLmJhc2U2NE5vcm1hbCwgJ25vcm1hbCcpO1xuICAgICAgICAgICAgRG9jQ29udHJvbGxlci5hZGRGb250KHRoaXMuZm9udE5hbWUsIHRoaXMuYmFzZTY0Qm9sZCwgJ2JvbGQnKTtcbiAgICAgICAgICAgIHRoaXMuX2RvYyA9IG5ldyBqc1BERihqc3BkZk9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHNldFJhZGlvQXBwZWFyYW5jZSh0aGlzLl9kb2MpO1xuICAgICAgICB0aGlzLl91c2VDdXN0b21Gb250SW5IdG1sID0gb3B0aW9ucy51c2VDdXN0b21Gb250SW5IdG1sICYmIFN1cnZleUhlbHBlci5pc0ZvbnRFeGlzdCh0aGlzLCB0aGlzLmZvbnROYW1lKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jID0gbmV3IGpzUERGKGpzcGRmT3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX2RvYy5zZXRGb250KHRoaXMuZm9udE5hbWUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udCh0aGlzLmZvbnROYW1lKTtcbiAgICAgICAgdGhpcy5fZG9jLnNldEZvbnRTaXplKHRoaXMuZm9udFNpemUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udFNpemUodGhpcy5mb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2ZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICB0aGlzLm1hcmdpbnNTdGFjayA9IFtdO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGN1c3RvbUZvbnRzOiB7IFtuYW1lOiBzdHJpbmddOiB7IG5vcm1hbDogc3RyaW5nLCBib2xkOiBzdHJpbmcsIGl0YWxpYzogc3RyaW5nLCBib2xkaXRhbGljOiBzdHJpbmcgfSB9ID0ge307XG4gICAgcHVibGljIHN0YXRpYyBhZGRGb250KGZvbnROYW1lOiBzdHJpbmcsIGJhc2U2NDogc3RyaW5nLCBmb250U3R5bGU6ICdub3JtYWwnIHwgJ2JvbGQnIHwgJ2l0YWxpYycgfCAnYm9sZGl0YWxpYycpIHtcbiAgICAgICAgbGV0IGZvbnQgPSBEb2NDb250cm9sbGVyLmN1c3RvbUZvbnRzW2ZvbnROYW1lXTtcbiAgICAgICAgaWYgKCFmb250KSB7XG4gICAgICAgICAgICBmb250ID0gPGFueT57fTtcbiAgICAgICAgICAgIERvY0NvbnRyb2xsZXIuY3VzdG9tRm9udHNbZm9udE5hbWVdID0gZm9udDtcbiAgICAgICAgfVxuICAgICAgICBmb250W2ZvbnRTdHlsZV0gPSBiYXNlNjQ7XG4gICAgICAgIGNvbnN0IGFkZEZvbnRDYWxsYmFjazogKCkgPT4gdm9pZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUZvbnQgPSBEb2NDb250cm9sbGVyLmN1c3RvbUZvbnRzW2ZvbnROYW1lXTtcbiAgICAgICAgICAgIGlmICghIWN1c3RvbUZvbnQgJiYgISFjdXN0b21Gb250W2ZvbnRTdHlsZV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb250RmlsZTogc3RyaW5nID0gYCR7Zm9udE5hbWV9LSR7Zm9udFN0eWxlfS50dGZgO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmlsZVRvVkZTKGZvbnRGaWxlLCBjdXN0b21Gb250W2ZvbnRTdHlsZV0pO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRm9udChmb250RmlsZSwgZm9udE5hbWUsIGZvbnRTdHlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgICg8YW55PmpzUERGKS5BUEkuZXZlbnRzLnB1c2goWydhZGRGb250cycsIGFkZEZvbnRDYWxsYmFja10pO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGRvYygpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZG9jO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhlbHBlckRvYygpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVscGVyRG9jO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGZvbnROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250TmFtZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBmb250TmFtZShmb250TmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2ZvbnROYW1lID0gZm9udE5hbWU7XG4gICAgICAgIHRoaXMuX2RvYy5zZXRGb250KGZvbnROYW1lKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnQoZm9udE5hbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGZvbnRTaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250U2l6ZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBmb250U2l6ZShmb250U2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2ZvbnRTaXplID0gZm9udFNpemU7XG4gICAgICAgIHRoaXMuX2RvYy5zZXRGb250U2l6ZShmb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250U2l6ZShmb250U2l6ZSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9udFN0eWxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250U3R5bGU7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgZm9udFN0eWxlKGZvbnRTdHlsZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2ZvbnRTdHlsZSA9IGZvbnRTdHlsZTtcbiAgICAgICAgdGhpcy5fZG9jLnNldEZvbnQodGhpcy5fZm9udE5hbWUsIGZvbnRTdHlsZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250KHRoaXMuX2ZvbnROYW1lLCBmb250U3R5bGUpO1xuICAgIH1cbiAgICBwdWJsaWMgbWVhc3VyZVRleHQodGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcgfCBudW1iZXIgPSAxLCBmb250U3R5bGU6IHN0cmluZyA9IHRoaXMuX2ZvbnRTdHlsZSxcbiAgICAgICAgZm9udFNpemU6IG51bWJlciA9IHRoaXMuX2ZvbnRTaXplKTogSVNpemUge1xuICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5faGVscGVyRG9jLmdldEZvbnRTaXplKCk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250U2l6ZShmb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250KHRoaXMuX2ZvbnROYW1lLCBmb250U3R5bGUpO1xuICAgICAgICBjb25zdCBoZWlnaHQ6IG51bWJlciA9IHRoaXMuX2hlbHBlckRvYy5nZXRMaW5lSGVpZ2h0KCkgLyB0aGlzLl9oZWxwZXJEb2MuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgIGxldCB3aWR0aDogbnVtYmVyID0gMC4wO1xuICAgICAgICBpZiAodHlwZW9mIHRleHQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB3aWR0aCA9IGhlaWdodCAqIHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0ZXh0ID0gdHlwZW9mIHRleHQgPT09ICdzdHJpbmcnID8gdGV4dCA6IFN1cnZleUhlbHBlci5nZXRMb2NTdHJpbmcodGV4dCk7XG4gICAgICAgICAgICB3aWR0aCA9IHRleHQuc3BsaXQoJycpLnJlZHVjZSgoc206IG51bWJlciwgY3I6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgICBzbSArIHRoaXMuX2hlbHBlckRvYy5nZXRUZXh0V2lkdGgoY3IpLCAwLjApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250U2l6ZShvbGRGb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250KHRoaXMuX2ZvbnROYW1lLCAnbm9ybWFsJyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGhlaWdodFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgd2lkdGggb2Ygb25lIGNoYXJhY3RlciBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgcHVibGljIGdldCB1bml0V2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVhc3VyZVRleHQoKS53aWR0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGhlaWd0aCBvZiBvbmUgY2hhcmFjdGVyIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHVuaXRIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVhc3VyZVRleHQoKS5oZWlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBwdXNoTWFyZ2lucyhsZWZ0PzogbnVtYmVyLCByaWdodD86IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcmdpbnNTdGFjay5wdXNoKHsgbGVmdDogdGhpcy5tYXJnaW5zLmxlZnQsIHJpZ2h0OiB0aGlzLm1hcmdpbnMucmlnaHQgfSk7XG4gICAgICAgIGlmICh0eXBlb2YgbGVmdCAhPT0gJ3VuZGVmaW5lZCcpIHRoaXMubWFyZ2lucy5sZWZ0ID0gbGVmdDtcbiAgICAgICAgaWYgKHR5cGVvZiByaWdodCAhPT0gJ3VuZGVmaW5lZCcpIHRoaXMubWFyZ2lucy5yaWdodCA9IHJpZ2h0O1xuICAgIH1cbiAgICBwdWJsaWMgcG9wTWFyZ2lucygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWFyZ2luczogSU1hcmdpbkxSID0gdGhpcy5tYXJnaW5zU3RhY2sucG9wKCk7XG4gICAgICAgIHRoaXMubWFyZ2lucy5sZWZ0ID0gbWFyZ2lucy5sZWZ0O1xuICAgICAgICB0aGlzLm1hcmdpbnMucmlnaHQgPSBtYXJnaW5zLnJpZ2h0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgd2lkdGggb2YgYSBQREYgcGFnZSBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgcHVibGljIGdldCBwYXBlcldpZHRoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGhlaWdodCBvZiBhIFBERiBwYWdlIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhcGVySGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXROdW1iZXJPZlBhZ2VzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5nZXROdW1iZXJPZlBhZ2VzKCk7XG4gICAgfVxuICAgIHB1YmxpYyBhZGRQYWdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRvYy5hZGRQYWdlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRDdXJyZW50UGFnZUluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyIC0gMTtcbiAgICB9XG4gICAgcHVibGljIHNldFBhZ2UoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmRvYy5zZXRQYWdlKGluZGV4ICsgMSk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2RvY19jb250cm9sbGVyLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBSYWRpb0dyb3VwV3JhcCwgUmFkaW9JdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9yYWRpb2l0ZW0nO1xuaW1wb3J0IHsgRmxhdFNlbGVjdEJhc2UgfSBmcm9tICcuL2ZsYXRfc2VsZWN0YmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0UmFkaW9ncm91cCBleHRlbmRzIEZsYXRTZWxlY3RCYXNlIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsO1xuICAgIHByaXZhdGUgcmFkaW9Hcm91cFdyYXA6IFJhZGlvR3JvdXBXcmFwO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgaXNJdGVtU2VsZWN0ZWQoaXRlbTogSXRlbVZhbHVlLCBjaGVja2VkPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHR5cGVvZiBjaGVja2VkID09PSAndW5kZWZpbmVkJykgP1xuICAgICAgICAgICAgKGl0ZW0gPT09IHRoaXMucXVlc3Rpb24ub3RoZXJJdGVtID8gdGhpcy5xdWVzdGlvbi5pc090aGVyU2VsZWN0ZWQgOlxuICAgICAgICAgICAgICAgIChpdGVtLnZhbHVlID09PSB0aGlzLnF1ZXN0aW9uLnZhbHVlIHx8XG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgdGhpcy5xdWVzdGlvbi5pc0l0ZW1TZWxlY3RlZCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uaXNJdGVtU2VsZWN0ZWQoaXRlbSkpKSkgOiBjaGVja2VkO1xuICAgIH1cbiAgICBwdWJsaWMgZ2VuZXJhdGVGbGF0SXRlbShyZWN0OiBJUmVjdCwgaXRlbTogSXRlbVZhbHVlLFxuICAgICAgICBpbmRleDogbnVtYmVyLCBrZXk/OiBzdHJpbmcsIGNoZWNrZWQ/OiBib29sZWFuLCBjb250ZXh0OiBhbnkgPSB7fSk6IElQZGZCcmljayB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5yYWRpb0dyb3VwV3JhcCA9IG5ldyBSYWRpb0dyb3VwV3JhcCh0aGlzLnF1ZXN0aW9uLmlkICsgKCh0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJykgPyAnJyA6IGtleSksXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCB7IHJlYWRPbmx5OiB0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHksIHF1ZXN0aW9uOiB0aGlzLnF1ZXN0aW9uLCAuLi5jb250ZXh0IH0pO1xuICAgICAgICAgICAgKDxhbnk+dGhpcy5xdWVzdGlvbikucGRmUmFkaW9Hcm91cFdyYXAgPSB0aGlzLnJhZGlvR3JvdXBXcmFwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLnJhZGlvR3JvdXBXcmFwID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5yYWRpb0dyb3VwV3JhcCA9ICg8YW55PnRoaXMucXVlc3Rpb24pLnBkZlJhZGlvR3JvdXBXcmFwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzQ2hlY2tlZDogYm9vbGVhbiA9IHRoaXMuaXNJdGVtU2VsZWN0ZWQoaXRlbSwgY2hlY2tlZCk7XG4gICAgICAgIHJldHVybiBuZXcgUmFkaW9JdGVtQnJpY2sodGhpcy5jb250cm9sbGVyLCByZWN0LFxuICAgICAgICAgICAgeyBxdWVzdGlvbjogdGhpcy5xdWVzdGlvbiwgaW5kZXg6IGluZGV4LCBjaGVja2VkOiBpc0NoZWNrZWQsIGl0ZW06IGl0ZW0gfSwgdGhpcy5yYWRpb0dyb3VwV3JhcCk7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdyYWRpb2dyb3VwJywgRmxhdFJhZGlvZ3JvdXApO1xuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignYnV0dG9uZ3JvdXAnLCBGbGF0UmFkaW9ncm91cCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcmFkaW9ncm91cC50cyIsImltcG9ydCB7IElFbGVtZW50LCBRdWVzdGlvbiwgUGFuZWxNb2RlbEJhc2UsIFBhbmVsTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgUm93bGluZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfcm93bGluZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IEFkb3JuZXJzUGFuZWxPcHRpb25zLCBBZG9ybmVyc1BhZ2VPcHRpb25zIH0gZnJvbSAnLi4vZXZlbnRfaGFuZGxlci9hZG9ybmVycyc7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4uL2VudHJpZXMvcGRmJztcbmltcG9ydCAqIGFzIFN1cnZleVBERk1vZHVsZSBmcm9tICcuLi9lbnRyaWVzL3BkZic7XG5cbmV4cG9ydCBjbGFzcyBGbGF0U3VydmV5IHtcbiAgICBwdWJsaWMgc3RhdGljIFFVRVNfR0FQX1ZFUlRfU0NBTEU6IG51bWJlciA9IDEuNTtcbiAgICBwdWJsaWMgc3RhdGljIFBBTkVMX0NPTlRfR0FQX1NDQUxFOiBudW1iZXIgPSAxLjA7XG4gICAgcHVibGljIHN0YXRpYyBQQU5FTF9ERVNDX0dBUF9TQ0FMRTogbnVtYmVyID0gMC4yNTtcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGdlbmVyYXRlRmxhdHNQYW5lbChzdXJ2ZXk6IFN1cnZleVBERiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcGFuZWw6IFBhbmVsTW9kZWwsIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHBhbmVsRmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IHBhbmVsQ29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IGNvbnRyb2xsZXIubWVhc3VyZVRleHQocGFuZWwuaW5uZXJJbmRlbnQpLndpZHRoO1xuICAgICAgICBwYW5lbENvbnRlbnRQb2ludC54TGVmdCArPSBjb250cm9sbGVyLm1lYXN1cmVUZXh0KHBhbmVsLmlubmVySW5kZW50KS53aWR0aDtcbiAgICAgICAgcGFuZWxGbGF0cy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1BhZ2VQYW5lbChzdXJ2ZXksXG4gICAgICAgICAgICBjb250cm9sbGVyLCBwYW5lbCwgcGFuZWxDb250ZW50UG9pbnQpKTtcbiAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIGNvbnN0IGFkb3JuZXJzT3B0aW9uczogQWRvcm5lcnNQYW5lbE9wdGlvbnMgPSBuZXcgQWRvcm5lcnNQYW5lbE9wdGlvbnMocG9pbnQsXG4gICAgICAgICAgICBwYW5lbEZsYXRzLCBwYW5lbCwgY29udHJvbGxlciwgRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKSwgU3VydmV5UERGTW9kdWxlKTtcbiAgICAgICAgYXdhaXQgc3VydmV5Lm9uUmVuZGVyUGFuZWwuZmlyZShzdXJ2ZXksIGFkb3JuZXJzT3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBbLi4uYWRvcm5lcnNPcHRpb25zLmJyaWNrc107XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIGdlbmVyYXRlRmxhdHNQYWdlUGFuZWwoc3VydmV5OiBTdXJ2ZXlQREYsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHBhZ2VQYW5lbDogUGFuZWxNb2RlbEJhc2UsIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGlmICghcGFnZVBhbmVsLmlzVmlzaWJsZSkgcmV0dXJuO1xuICAgICAgICBwYWdlUGFuZWwub25GaXJzdFJlbmRlcmluZygpO1xuICAgICAgICBjb25zdCBwYWdlUGFuZWxGbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgbGV0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgaWYgKHBhZ2VQYW5lbC5nZXRUeXBlKCkgIT09ICdwYWdlJyB8fCBzdXJ2ZXkuc2hvd1BhZ2VUaXRsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgICAgICBpZiAocGFnZVBhbmVsLnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhZ2VQYW5lbCBpbnN0YW5jZW9mIFBhbmVsTW9kZWwgJiYgcGFnZVBhbmVsLm5vKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRpdGxlUGFuZWxGbGF0KFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LCBjb250cm9sbGVyLCBwYWdlUGFuZWwubm8sIHBhZ2VQYW5lbC5nZXRUeXBlKCkgPT09ICdwYWdlJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sobm9GbGF0KTtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gbm9GbGF0LnhSaWdodCArIGNvbnRyb2xsZXIubWVhc3VyZVRleHQoJyAnKS53aWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZWxQYW5lbFRpdGxlRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRpdGxlUGFuZWxGbGF0KFxuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQsIGNvbnRyb2xsZXIsIHBhZ2VQYW5lbC5sb2NUaXRsZSwgcGFnZVBhbmVsLmdldFR5cGUoKSA9PT0gJ3BhZ2UnKTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKHBhZ2VsUGFuZWxUaXRsZUZsYXQpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChwYWdlbFBhbmVsVGl0bGVGbGF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYWdlUGFuZWwuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocGFnZVBhbmVsLnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFN1cnZleS5QQU5FTF9ERVNDX0dBUF9TQ0FMRTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZVBhbmVsRGVzY0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVEZXNjRmxhdChcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LCBudWxsLCBjb250cm9sbGVyLCBwYWdlUGFuZWwubG9jRGVzY3JpcHRpb24pO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2socGFnZVBhbmVsRGVzY0ZsYXQpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChwYWdlUGFuZWxEZXNjRmxhdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNvbXBvc2l0ZUZsYXQuaXNFbXB0eSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvd0xpbmVQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KHJvd0xpbmVQb2ludCwgY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgIHBhZ2VQYW5lbEZsYXRzLnB1c2goY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0SGVpZ2h0ICogRmxhdFN1cnZleS5QQU5FTF9DT05UX0dBUF9TQ0FMRSArIFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHBhZ2VQYW5lbC5yb3dzKSB7XG4gICAgICAgICAgICBpZiAoIXJvdy52aXNpYmxlKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgbGV0IG5leHRNYXJnaW5MZWZ0OiBudW1iZXIgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGNvbnN0IHJvd0ZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgdmlzaWJsZUVsZW1lbnRzID0gcm93LmVsZW1lbnRzLmZpbHRlcihlbCA9PiBlbC5pc1Zpc2libGUpO1xuICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHZpc2libGVFbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50OiBJRWxlbWVudCA9IHZpc2libGVFbGVtZW50c1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQuaXNWaXNpYmxlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwZXJzV2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKGVsZW1lbnQucmVuZGVyV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoIC0gKHZpc2libGVFbGVtZW50cy5sZW5ndGggLSAxKSAqIGNvbnRyb2xsZXIudW5pdFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlRWxlbWVudHMubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IG5leHRNYXJnaW5MZWZ0ICsgKChpICE9PSAwKSA/IGNvbnRyb2xsZXIudW5pdFdpZHRoIDogMCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ID0gY29udHJvbGxlci5wYXBlcldpZHRoIC0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBwZXJzV2lkdGg7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICAgICAgbmV4dE1hcmdpbkxlZnQgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCArIHBlcnNXaWR0aDtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBhbmVsTW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcm93RmxhdHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNQYW5lbChcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgZWxlbWVudCwgY3VyclBvaW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByb3dGbGF0cy5wdXNoKC4uLmF3YWl0IFN1cnZleUhlbHBlci5nZW5lcmF0ZVF1ZXN0aW9uRmxhdHMoc3VydmV5LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgPFF1ZXN0aW9uPmVsZW1lbnQsIGN1cnJQb2ludCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICBpZiAocm93RmxhdHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi5yb3dGbGF0cykueUJvdDtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBwb2ludC54TGVmdDtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0U3VydmV5LlFVRVNfR0FQX1ZFUlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgcGFnZVBhbmVsRmxhdHMucHVzaCguLi5yb3dGbGF0cyk7XG4gICAgICAgICAgICAgICAgcGFnZVBhbmVsRmxhdHMucHVzaChTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoY3VyclBvaW50LCBjb250cm9sbGVyKSk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhZ2VQYW5lbEZsYXRzO1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBwb3BSb3dsaW5lcyhmbGF0czogSVBkZkJyaWNrW10pIHtcbiAgICAgICAgd2hpbGUgKGZsYXRzLmxlbmd0aCA+IDAgJiYgZmxhdHNbZmxhdHMubGVuZ3RoIC0gMV0gaW5zdGFuY2VvZiBSb3dsaW5lQnJpY2spIHtcbiAgICAgICAgICAgIGZsYXRzLnBvcCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIGdlbmVyYXRlRmxhdFRpdGxlKHN1cnZleTogU3VydmV5UERGLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBwb2ludDogSVBvaW50KTogUHJvbWlzZTxDb21wb3NpdGVCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBpZiAoc3VydmV5LnNob3dUaXRsZSkge1xuICAgICAgICAgICAgaWYgKHN1cnZleS50aXRsZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1cnZleVRpdGxlRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRpdGxlU3VydmV5RmxhdChcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQsIGNvbnRyb2xsZXIsIHN1cnZleS5sb2NUaXRsZSk7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhzdXJ2ZXlUaXRsZUZsYXQpO1xuICAgICAgICAgICAgICAgIHBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHN1cnZleVRpdGxlRmxhdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3VydmV5LmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN1cnZleS50aXRsZSkge1xuICAgICAgICAgICAgICAgICAgICBwb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFN1cnZleS5QQU5FTF9ERVNDX0dBUF9TQ0FMRTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlRGVzY0ZsYXQoXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LCBudWxsLCBjb250cm9sbGVyLCBzdXJ2ZXkubG9jRGVzY3JpcHRpb24pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVGbGF0TG9nb0ltYWdlKHN1cnZleTogU3VydmV5UERGLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgbG9nb1VybCA9IFN1cnZleUhlbHBlci5nZXRMb2NTdHJpbmcoc3VydmV5LmxvY0xvZ28pO1xuICAgICAgICBjb25zdCBsb2dvU2l6ZSA9IGF3YWl0IFN1cnZleUhlbHBlci5nZXRDb3JyZWN0ZWRJbWFnZVNpemUoY29udHJvbGxlciwgeyBpbWFnZUxpbms6IGxvZ29VcmwsIGltYWdlSGVpZ2h0OiBzdXJ2ZXkubG9nb0hlaWdodCwgaW1hZ2VXaWR0aDogc3VydmV5LmxvZ29XaWR0aCB9KTtcbiAgICAgICAgY29uc3QgbG9nb0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQoXG4gICAgICAgICAgICBwb2ludCwgbnVsbCwgY29udHJvbGxlciwgeyBsaW5rOiBsb2dvVXJsLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBsb2dvU2l6ZS53aWR0aCwgaGVpZ2h0OiBsb2dvU2l6ZS5oZWlnaHQgfSk7XG4gICAgICAgIGxldCBzaGlmdDogbnVtYmVyID0gMDtcbiAgICAgICAgaWYgKHN1cnZleS5sb2dvUG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgIHNoaWZ0ID0gU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSAtIGxvZ29GbGF0LndpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN1cnZleS5sb2dvUG9zaXRpb24gIT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgc2hpZnQgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpIC8gMi4wIC0gbG9nb0ZsYXQud2lkdGggLyAyLjA7XG4gICAgICAgIH1cbiAgICAgICAgbG9nb0ZsYXQueExlZnQgKz0gc2hpZnQ7XG4gICAgICAgIGxvZ29GbGF0LnhSaWdodCArPSBzaGlmdDtcbiAgICAgICAgcmV0dXJuIGxvZ29GbGF0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGdlbmVyYXRlRmxhdHMoc3VydmV5OiBTdXJ2ZXlQREYsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBQcm9taXNlPElQZGZCcmlja1tdW10+IHtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdW10gPSBbXTtcbiAgICAgICAgaWYgKCFzdXJ2ZXkuaGFzTG9nbykge1xuICAgICAgICAgICAgY29uc3QgdGl0bGVGbGF0OiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0VGl0bGUoXG4gICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBjb250cm9sbGVyLmxlZnRUb3BQb2ludCk7XG4gICAgICAgICAgICBpZiAoIXRpdGxlRmxhdC5pc0VtcHR5KSBmbGF0cy5wdXNoKFt0aXRsZUZsYXRdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdXJ2ZXkuaXNMb2dvQmVmb3JlKSB7XG4gICAgICAgICAgICBjb25zdCBsb2dvRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRMb2dvSW1hZ2UoXG4gICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBjb250cm9sbGVyLmxlZnRUb3BQb2ludCk7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKFtsb2dvRmxhdF0pO1xuICAgICAgICAgICAgY29uc3QgdGl0bGVQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGxvZ29GbGF0LFxuICAgICAgICAgICAgICAgIHN1cnZleS5sb2dvUG9zaXRpb24gPT09ICd0b3AnLCBzdXJ2ZXkubG9nb1Bvc2l0aW9uICE9PSAndG9wJyk7XG4gICAgICAgICAgICBpZiAoc3VydmV5LmxvZ29Qb3NpdGlvbiAhPT0gJ3RvcCcpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgdGl0bGVQb2ludC54TGVmdCArPSBjb250cm9sbGVyLnVuaXRXaWR0aDtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMubGVmdCArPSBsb2dvRmxhdC53aWR0aCArIGNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGl0bGVQb2ludC54TGVmdCA9IGNvbnRyb2xsZXIubGVmdFRvcFBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgIHRpdGxlUG9pbnQueVRvcCArPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgLyAyLjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRUaXRsZShcbiAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIHRpdGxlUG9pbnQpO1xuICAgICAgICAgICAgaWYgKHN1cnZleS5sb2dvUG9zaXRpb24gIT09ICd0b3AnKSBjb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGlmICghdGl0bGVGbGF0LmlzRW1wdHkpIGZsYXRzWzBdLnB1c2godGl0bGVGbGF0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzdXJ2ZXkubG9nb1Bvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9nb0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0TG9nb0ltYWdlKFxuICAgICAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIubGVmdFRvcFBvaW50KTtcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKFtsb2dvRmxhdF0pO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKz0gbG9nb0ZsYXQud2lkdGggKyBjb250cm9sbGVyLnVuaXRXaWR0aDtcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRUaXRsZShcbiAgICAgICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBjb250cm9sbGVyLmxlZnRUb3BQb2ludCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aXRsZUZsYXQuaXNFbXB0eSkgZmxhdHNbMF0udW5zaGlmdCh0aXRsZUZsYXQpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGVGbGF0OiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0VGl0bGUoXG4gICAgICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgY29udHJvbGxlci5sZWZ0VG9wUG9pbnQpO1xuICAgICAgICAgICAgICAgIGxldCBsb2dvUG9pbnQ6IElQb2ludCA9IGNvbnRyb2xsZXIubGVmdFRvcFBvaW50O1xuICAgICAgICAgICAgICAgIGlmICghdGl0bGVGbGF0LmlzRW1wdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhdHMucHVzaChbdGl0bGVGbGF0XSk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ29Qb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludCh0aXRsZUZsYXQpO1xuICAgICAgICAgICAgICAgICAgICBsb2dvUG9pbnQueVRvcCArPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgLyAyLjA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ29GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdExvZ29JbWFnZShcbiAgICAgICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBsb2dvUG9pbnQpO1xuICAgICAgICAgICAgICAgIGlmIChmbGF0cy5sZW5ndGggIT09IDApIGZsYXRzWzBdLnB1c2gobG9nb0ZsYXQpO1xuICAgICAgICAgICAgICAgIGVsc2UgZmxhdHMucHVzaChbbG9nb0ZsYXRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcG9pbnQ6IElQb2ludCA9IGNvbnRyb2xsZXIubGVmdFRvcFBvaW50O1xuICAgICAgICBpZiAoZmxhdHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBwb2ludC55VG9wID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLmZsYXRzWzBdKSkueVRvcDtcbiAgICAgICAgICAgIGZsYXRzWzBdLnB1c2goU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KHBvaW50LCBjb250cm9sbGVyKSk7XG4gICAgICAgICAgICBwb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRTdXJ2ZXkuUEFORUxfQ09OVF9HQVBfU0NBTEUgKyBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc3VydmV5LnZpc2libGVQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc3VydmV5LmN1cnJlbnRQYWdlID0gc3VydmV5LnZpc2libGVQYWdlc1tpXTtcbiAgICAgICAgICAgIGxldCBwYWdlRmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgICAgICBwYWdlRmxhdHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNQYWdlUGFuZWwoXG4gICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBzdXJ2ZXkudmlzaWJsZVBhZ2VzW2ldLCBwb2ludCkpO1xuICAgICAgICAgICAgY29uc3QgYWRvcm5lcnNPcHRpb25zOiBBZG9ybmVyc1BhZ2VPcHRpb25zID0gbmV3IEFkb3JuZXJzUGFnZU9wdGlvbnMocG9pbnQsXG4gICAgICAgICAgICAgICAgcGFnZUZsYXRzLCBzdXJ2ZXkudmlzaWJsZVBhZ2VzW2ldLCBjb250cm9sbGVyLCBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLCBTdXJ2ZXlQREZNb2R1bGUpO1xuICAgICAgICAgICAgYXdhaXQgc3VydmV5Lm9uUmVuZGVyUGFnZS5maXJlKHN1cnZleSwgYWRvcm5lcnNPcHRpb25zKTtcbiAgICAgICAgICAgIHBhZ2VGbGF0cyA9IFsuLi5hZG9ybmVyc09wdGlvbnMuYnJpY2tzXTtcbiAgICAgICAgICAgIGlmIChpID09PSAwICYmIGZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGZsYXRzWzBdLnB1c2goLi4ucGFnZUZsYXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgZmxhdHMucHVzaChwYWdlRmxhdHMpO1xuICAgICAgICAgICAgdGhpcy5wb3BSb3dsaW5lcyhmbGF0c1tmbGF0cy5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICBwb2ludC55VG9wID0gY29udHJvbGxlci5sZWZ0VG9wUG9pbnQueVRvcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmxhdHM7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3N1cnZleS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBRdWVzdGlvbkNoZWNrYm94TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgSVNpemUsIERvY0NvbnRyb2xsZXIsIElQb2ludCB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljaywgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcblxuZXhwb3J0IGludGVyZmFjZSBJQ2hlY2tJdGVtQnJpY2tDb250ZXh0IHtcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uO1xuICAgIHJlYWRPbmx5OiBib29sZWFuO1xuICAgIGNoZWNrZWQ6IGJvb2xlYW47XG4gICAgaXRlbT86IEl0ZW1WYWx1ZTtcbiAgICBpbmRleD86IG51bWJlcjtcbn1cbmV4cG9ydCBjbGFzcyBDaGVja0l0ZW1CcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBGT05UX1NJWkVfU0NBTEU6IG51bWJlciA9IDAuNztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDSEVDS01BUktfUkVBRE9OTFlfU1lNQk9MOiBzdHJpbmcgPSAnMyc7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ0hFQ0tNQVJLX1JFQURPTkxZX0ZPTlQ6IHN0cmluZyA9ICd6YXBmZGluZ2JhdHMnO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ0hFQ0tNQVJLX1JFQURPTkxZX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS4wIC0gTWF0aC5FIC8gMTAuMDtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBmaWVsZE5hbWU6IHN0cmluZywgcHJvdGVjdGVkIGNvbnRleHQ6IElDaGVja0l0ZW1Ccmlja0NvbnRleHQpIHtcbiAgICAgICAgc3VwZXIoY29udGV4dC5xdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25DaGVja2JveE1vZGVsPnRoaXMuY29udGV4dC5xdWVzdGlvbjtcbiAgICAgICAgdGhpcy50ZXh0Q29sb3IgPSB0aGlzLmZvcm1Cb3JkZXJDb2xvcjtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldFNob3VsZFJlbmRlclJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LnJlYWRPbmx5ICYmIFN1cnZleUhlbHBlci5nZXRSZWFkb25seVJlbmRlckFzKFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyKSAhPT0gJ2Fjcm9mb3JtJyB8fCB0aGlzLmNvbnRyb2xsZXIuY29tcHJlc3M7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgY2hlY2tCb3g6IGFueSA9IG5ldyAoPGFueT50aGlzLmNvbnRyb2xsZXIuZG9jLkFjcm9Gb3JtQ2hlY2tCb3gpKCk7XG4gICAgICAgIGNvbnN0IGZvcm1TY2FsZTogbnVtYmVyID0gU3VydmV5SGVscGVyLmZvcm1TY2FsZSh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7fTtcbiAgICAgICAgb3B0aW9ucy5tYXhGb250U2l6ZSA9IHRoaXMuaGVpZ2h0ICogZm9ybVNjYWxlICogQ2hlY2tJdGVtQnJpY2suRk9OVF9TSVpFX1NDQUxFO1xuICAgICAgICBvcHRpb25zLmNhcHRpb24gPSBDaGVja0l0ZW1Ccmljay5DSEVDS01BUktfUkVBRE9OTFlfU1lNQk9MO1xuICAgICAgICBvcHRpb25zLnRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICBvcHRpb25zLmZpZWxkTmFtZSA9IHRoaXMuZmllbGROYW1lO1xuICAgICAgICBvcHRpb25zLnJlYWRPbmx5ID0gdGhpcy5jb250ZXh0LnJlYWRPbmx5O1xuICAgICAgICBvcHRpb25zLmNvbG9yID0gdGhpcy5mb3JtQm9yZGVyQ29sb3I7XG4gICAgICAgIG9wdGlvbnMudmFsdWUgPSB0aGlzLmNvbnRleHQuY2hlY2tlZCA/ICdPbicgOiBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5BUyA9IHRoaXMuY29udGV4dC5jaGVja2VkID8gJy9PbicgOiAnL09mZic7XG4gICAgICAgIG9wdGlvbnMuY29udGV4dCA9IHRoaXMuY29udGV4dDtcblxuICAgICAgICBvcHRpb25zLlJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdCh0aGlzLCBmb3JtU2NhbGUpKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5hZGRGaWVsZChjaGVja0JveCk7XG4gICAgICAgICg8U3VydmV5UERGPnRoaXMucXVlc3Rpb24uc3VydmV5KT8uZ2V0VXBkYXRlZENoZWNrSXRlbUFjcm9mb3JtT3B0aW9ucyhvcHRpb25zKTtcblxuICAgICAgICBjaGVja0JveC5tYXhGb250U2l6ZSA9IG9wdGlvbnMubWF4Rm9udFNpemU7XG4gICAgICAgIGNoZWNrQm94LmNhcHRpb24gPSBvcHRpb25zLmNhcHRpb247XG4gICAgICAgIGNoZWNrQm94LnRleHRBbGlnbiA9IG9wdGlvbnMudGV4dEFsaWduO1xuICAgICAgICBjaGVja0JveC5maWVsZE5hbWUgPSBvcHRpb25zLmZpZWxkTmFtZTtcbiAgICAgICAgY2hlY2tCb3gucmVhZE9ubHkgPSBvcHRpb25zLnJlYWRPbmx5O1xuICAgICAgICBjaGVja0JveC5jb2xvciA9IG9wdGlvbnMuY29sb3I7XG4gICAgICAgIGNoZWNrQm94LnZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICAgICAgY2hlY2tCb3guQVMgPSBvcHRpb25zLkFTO1xuICAgICAgICBjaGVja0JveC5SZWN0ID0gb3B0aW9ucy5SZWN0O1xuXG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyUmVhZE9ubHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0LmNoZWNrZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrbWFya1BvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQodGhpcywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBvbGRGb250TmFtZTogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmZvbnROYW1lO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnROYW1lID0gQ2hlY2tJdGVtQnJpY2suQ0hFQ0tNQVJLX1JFQURPTkxZX0ZPTlQ7XG4gICAgICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKlxuICAgICAgICAgICAgICAgIENoZWNrSXRlbUJyaWNrLkNIRUNLTUFSS19SRUFET05MWV9GT05UX1NJWkVfU0NBTEU7XG4gICAgICAgICAgICBjb25zdCBjaGVja21hcmtTaXplOiBJU2l6ZSA9IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChcbiAgICAgICAgICAgICAgICBDaGVja0l0ZW1Ccmljay5DSEVDS01BUktfUkVBRE9OTFlfU1lNQk9MKTtcbiAgICAgICAgICAgIGNoZWNrbWFya1BvaW50LnhMZWZ0ICs9IHRoaXMud2lkdGggLyAyLjAgLSBjaGVja21hcmtTaXplLndpZHRoIC8gMi4wO1xuICAgICAgICAgICAgY2hlY2ttYXJrUG9pbnQueVRvcCArPSB0aGlzLmhlaWdodCAvIDIuMCAtIGNoZWNrbWFya1NpemUuaGVpZ2h0IC8gMi4wO1xuICAgICAgICAgICAgY29uc3QgY2hlY2ttYXJrRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgICAgIGNoZWNrbWFya1BvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgQ2hlY2tJdGVtQnJpY2suQ0hFQ0tNQVJLX1JFQURPTkxZX1NZTUJPTCwgVGV4dEJyaWNrKTtcbiAgICAgICAgICAgICg8YW55PmNoZWNrbWFya0ZsYXQudW5mb2xkKClbMF0pLnRleHRDb2xvciA9IHRoaXMudGV4dENvbG9yO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgICAgICBhd2FpdCBjaGVja21hcmtGbGF0LnJlbmRlcigpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnROYW1lID0gb2xkRm9udE5hbWU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2NoZWNraXRlbS50cyIsImltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgRG9jQ29udHJvbGxlciwgSVJlY3QgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEVtcHR5QnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJpdmF0ZSBpc0JvcmRlclZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKHJlY3Q6IElSZWN0LFxuICAgICAgICBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciA9IG51bGwsXG4gICAgICAgIGlzQm9yZGVyVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKG51bGwsIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLmlzQm9yZGVyVmlzaWJsZSA9IGlzQm9yZGVyVmlzaWJsZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2l6ZUJvcmRlcihpc0luY3JlYXNlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvZWY6IG51bWJlciA9IGlzSW5jcmVhc2UgPyAxIDogLTE7XG4gICAgICAgIGNvbnN0IGJvcmRlclBhZGRpbmc6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5kb2MuZ2V0Rm9udFNpemUoKSAqIFN1cnZleUhlbHBlci5WQUxVRV9SRUFET05MWV9QQURESU5HX1NDQUxFO1xuICAgICAgICB0aGlzLnhMZWZ0IC09IGNvZWYgKiBib3JkZXJQYWRkaW5nO1xuICAgICAgICB0aGlzLnhSaWdodCArPSBjb2VmICogYm9yZGVyUGFkZGluZztcbiAgICAgICAgdGhpcy55Qm90ICs9IGNvZWYgKiBib3JkZXJQYWRkaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNCb3JkZXJWaXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZUJvcmRlcih0cnVlKTtcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5yZXNpemVCb3JkZXIoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9lbXB0eS50cyIsImltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dCc7XG5cbmV4cG9ydCBjbGFzcyBUZXh0Qm9sZEJyaWNrIGV4dGVuZHMgVGV4dEJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHRleHQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCwgdGV4dCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTdHlsZSA9ICdib2xkJztcbiAgICAgICAgYXdhaXQgc3VwZXIucmVuZGVySW50ZXJhY3RpdmUoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGJvbGQudHMiLCJleHBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuZXhwb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5leHBvcnQgeyBJUG9pbnQsIElSZWN0LCBJU2l6ZSwgSU1hcmdpbkxSLCBJTWFyZ2luLCBJRG9jT3B0aW9ucywgRG9jT3B0aW9ucywgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmV4cG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9yZXBvc2l0b3J5JztcbmV4cG9ydCB7IElGbGF0UXVlc3Rpb24sIEZsYXRRdWVzdGlvbiB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfcXVlc3Rpb24nO1xuZXhwb3J0IHsgRmxhdFF1ZXN0aW9uRGVmYXVsdCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfZGVmYXVsdCc7XG5leHBvcnQgeyBGbGF0Qm9vbGVhbkNoZWNrYm94IGFzIEZsYXRCb29sZWFuIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9ib29sZWFuJztcbmV4cG9ydCB7IEZsYXRDaGVja2JveCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfY2hlY2tib3gnO1xuZXhwb3J0IHsgRmxhdEN1c3RvbU1vZGVsIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9jdXN0b21fbW9kZWwnO1xuZXhwb3J0IHsgRmxhdENvbW1lbnQgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2NvbW1lbnQnO1xuZXhwb3J0IHsgRmxhdERyb3Bkb3duIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9kcm9wZG93bic7XG5leHBvcnQgeyBGbGF0RXhwcmVzc2lvbiB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfZXhwcmVzc2lvbic7XG5leHBvcnQgeyBGbGF0RmlsZSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfZmlsZSc7XG5leHBvcnQgeyBGbGF0SFRNTCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfaHRtbCc7XG5leHBvcnQgeyBGbGF0SW1hZ2UgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2ltYWdlJztcbmV4cG9ydCB7IEZsYXRJbWFnZVBpY2tlciB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2VwaWNrZXInO1xuZXhwb3J0IHsgRmxhdFBhbmVsRHluYW1pYyB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfcGFuZWxkeW5hbWljJztcbmV4cG9ydCB7IEZsYXRSYWRpb2dyb3VwIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9yYWRpb2dyb3VwJztcbmV4cG9ydCB7IEZsYXRSYW5raW5nIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9yYW5raW5nJztcbmV4cG9ydCB7IEZsYXRSYXRpbmcgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3JhdGluZyc7XG5leHBvcnQgeyBGbGF0U2VsZWN0QmFzZSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfc2VsZWN0YmFzZSc7XG5leHBvcnQgeyBGbGF0U2lnbmF0dXJlUGFkIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9zaWduYXR1cmVwYWQnO1xuZXhwb3J0IHsgRmxhdFRleHRib3ggfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3RleHRib3gnO1xuZXhwb3J0IHsgRmxhdFN1cnZleSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfc3VydmV5JztcbmV4cG9ydCB7IEZsYXRNYXRyaXggfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X21hdHJpeCc7XG5leHBvcnQgeyBGbGF0TWF0cml4TXVsdGlwbGUgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X21hdHJpeG11bHRpcGxlJztcbmV4cG9ydCB7IEZsYXRNYXRyaXhEeW5hbWljIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXhkeW5hbWljJztcbmV4cG9ydCB7IEZsYXRNdWx0aXBsZVRleHQgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X211bHRpcGxldGV4dCc7XG5leHBvcnQgeyBQYWdlUGFja2VyIH0gZnJvbSAnLi4vcGFnZV9sYXlvdXQvcGFnZV9wYWNrZXInO1xuZXhwb3J0IHsgRXZlbnRIYW5kbGVyIH0gZnJvbSAnLi4vZXZlbnRfaGFuZGxlci9ldmVudF9oYW5kbGVyJztcbmV4cG9ydCB7IEhvcml6b250YWxBbGlnbiwgVmVydGljYWxBbGlnbiwgSURyYXdSZWN0T3B0aW9ucywgSURyYXdUZXh0T3B0aW9ucywgSURyYXdJbWFnZU9wdGlvbnMsIERyYXdDYW52YXMgfSBmcm9tICcuLi9ldmVudF9oYW5kbGVyL2RyYXdfY2FudmFzJztcbmV4cG9ydCB7IElQZGZCcmljaywgUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5leHBvcnQgeyBCb29sZWFuSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYm9vbGVhbml0ZW0nO1xuZXhwb3J0IHsgQ2hlY2tib3hJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jaGVja2JveGl0ZW0nO1xuZXhwb3J0IHsgQ2hlY2tJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jaGVja2l0ZW0nO1xuZXhwb3J0IHsgQ29tbWVudEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tbWVudCc7XG5leHBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5leHBvcnQgeyBDdXN0b21CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2N1c3RvbSc7XG5leHBvcnQgeyBEcm9wZG93bkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfZHJvcGRvd24nO1xuZXhwb3J0IHsgRW1wdHlCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2VtcHR5JztcbmV4cG9ydCB7IEhUTUxCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2h0bWwnO1xuZXhwb3J0IHsgSW1hZ2VCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2ltYWdlJztcbmV4cG9ydCB7IExpbmtCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2xpbmsnO1xuZXhwb3J0IHsgUmFkaW9JdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9yYWRpb2l0ZW0nO1xuZXhwb3J0IHsgUmFua2luZ0l0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3JhbmtpbmdpdGVtJztcbmV4cG9ydCB7IFJvd2xpbmVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3Jvd2xpbmUnO1xuZXhwb3J0IHsgVGV4dEZpZWxkQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0ZmllbGQnO1xuZXhwb3J0IHsgVGV4dEJvbGRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHRib2xkJztcbmV4cG9ydCB7IFRleHRCb3hCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHRib3gnO1xuZXhwb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5leHBvcnQgeyBUaXRsZVBhbmVsQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90aXRsZXBhbmVsJztcblxuaW1wb3J0IHsgY2hlY2tMaWJyYXJ5VmVyc2lvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmNoZWNrTGlicmFyeVZlcnNpb24oYCR7cHJvY2Vzcy5lbnYuVkVSU0lPTn1gLCAnc3VydmV5LXBkZicpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9lbnRyaWVzL3BkZi50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBRdWVzdGlvbkNoZWNrYm94QmFzZSB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGbGF0U2VsZWN0QmFzZSBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkNoZWNrYm94QmFzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkNoZWNrYm94QmFzZT5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFic3RyYWN0IGdlbmVyYXRlRmxhdEl0ZW0ocmVjdDogSVJlY3QsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IElQZGZCcmljaztcbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0Q29tcG9zaXRlKHBvaW50OiBJUG9pbnQsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFN1cnZleUhlbHBlci5tb3ZlUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QoaXRlbVJlY3QsIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSxcbiAgICAgICAgICAgIHBvaW50LnhMZWZ0KSwgaXRlbSwgaW5kZXgpO1xuICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgY29uc3QgdGV4dFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICB0ZXh0UG9pbnQueExlZnQgPSBpdGVtRmxhdC54UmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgaWYgKGl0ZW0ubG9jVGV4dC5yZW5kZXJlZEh0bWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgICAgIHRleHRQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLmxvY1RleHQsIFRleHRCcmljaykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtID09PSB0aGlzLnF1ZXN0aW9uLm90aGVySXRlbSAmJiAoaXRlbS52YWx1ZSA9PT0gdGhpcy5xdWVzdGlvbi52YWx1ZSB8fFxuICAgICAgICAgICAgKHR5cGVvZiB0aGlzLnF1ZXN0aW9uLmlzT3RoZXJTZWxlY3RlZCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5xdWVzdGlvbi5pc090aGVyU2VsZWN0ZWQpKSkge1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgb3RoZXJQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChcbiAgICAgICAgICAgICAgICBvdGhlclBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGZhbHNlLCB7IGluZGV4LCByb3dzOiBTdXJ2ZXlIZWxwZXIuT1RIRVJfUk9XU19DT1VOVCB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRWaXNpYmxlQ2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXM7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRDb2xDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5jb2xDb3VudDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGNvbENvdW50ID0gdGhpcy5nZXRDb2xDb3VudCgpO1xuICAgICAgICBjb25zdCB2aXNpYmxlQ2hvaWNlcyA9IHRoaXMuZ2V0VmlzaWJsZUNob2ljZXMoKTtcbiAgICAgICAgbGV0IGN1cnJlbnRDb2xDb3VudDogbnVtYmVyID0gY29sQ291bnQ7XG4gICAgICAgIGlmIChjb2xDb3VudCA9PSAwKSB7XG4gICAgICAgICAgICBjdXJyZW50Q29sQ291bnQgPSBNYXRoLmZsb29yKFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKVxuICAgICAgICAgICAgICAgIC8gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFN1cnZleUhlbHBlci5NQVRSSVhfQ09MVU1OX1dJRFRIKS53aWR0aCkgfHwgMTtcbiAgICAgICAgICAgIGlmICh2aXNpYmxlQ2hvaWNlcy5sZW5ndGggPCBjdXJyZW50Q29sQ291bnQpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50Q29sQ291bnQgPSB2aXNpYmxlQ2hvaWNlcy5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29sQ291bnQgPiAxKSB7XG4gICAgICAgICAgICBjdXJyZW50Q29sQ291bnQgPSAoU3VydmV5SGVscGVyLmdldENvbHVtbldpZHRoKHRoaXMuY29udHJvbGxlciwgY29sQ291bnQpIDxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoU3VydmV5SGVscGVyLk1BVFJJWF9DT0xVTU5fV0lEVEgpLndpZHRoKSA/IDEgOiBjb2xDb3VudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGN1cnJlbnRDb2xDb3VudCA9PSAxKSA/IGF3YWl0IHRoaXMuZ2VuZXJhdGVWZXJ0aWNhbGx5SXRlbXMocG9pbnQsIHZpc2libGVDaG9pY2VzKSA6XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlSG9yaXNvbnRhbGx5SXRlbXMocG9pbnQsIGN1cnJlbnRDb2xDb3VudCk7XG5cbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlVmVydGljYWxseUl0ZW1zKHBvaW50OiBJUG9pbnQsIGl0ZW1WYWx1ZXM6IEl0ZW1WYWx1ZVtdKTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgaXRlbVZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0Q29tcG9zaXRlKGN1cnJQb2ludCwgaXRlbVZhbHVlc1tpXSwgaSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IGl0ZW1GbGF0LnlCb3QgKyBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgZmxhdHMucHVzaChpdGVtRmxhdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVIb3Jpc29udGFsbHlJdGVtcyhwb2ludDogSVBvaW50LCBjb2xDb3VudDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCB2aXNpYmxlQ2hvaWNlcyA9IHRoaXMuZ2V0VmlzaWJsZUNob2ljZXMoKTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgbGV0IHJvdzogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHZpc2libGVDaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnModGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCwgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQpO1xuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNldENvbHVtbk1hcmdpbnModGhpcy5jb250cm9sbGVyLCBjb2xDb3VudCwgaSAlIGNvbENvdW50KTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRDb21wb3NpdGUoXG4gICAgICAgICAgICAgICAgY3VyclBvaW50LCB2aXNpYmxlQ2hvaWNlc1tpXSwgaSk7XG4gICAgICAgICAgICByb3cuYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGlmIChpICUgY29sQ291bnQgPT09IGNvbENvdW50IC0gMSB8fCBpID09PSB2aXNpYmxlQ2hvaWNlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93TGluZUZsYXQ6IElQZGZCcmljayA9IFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHJvdyksIHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSByb3dMaW5lRmxhdC55Qm90ICtcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKHJvdywgcm93TGluZUZsYXQpO1xuICAgICAgICAgICAgICAgIHJvdyA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9zZWxlY3RiYXNlLnRzIiwiaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFRyYW5zbGF0ZVhGdW5jdGlvbiB9IGZyb20gJy4vcGRmX2JyaWNrJztcblxuZXhwb3J0IGNsYXNzIFJvd2xpbmVCcmljayBpbXBsZW1lbnRzIElQZGZCcmljayB7XG4gICAgeExlZnQ6IG51bWJlcjtcbiAgICB4UmlnaHQ6IG51bWJlcjtcbiAgICB5VG9wOiBudW1iZXI7XG4gICAgeUJvdDogbnVtYmVyO1xuICAgIHB1YmxpYyBpc1BhZ2VCcmVhazogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBjb2xvcjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMueExlZnQgPSByZWN0LnhMZWZ0O1xuICAgICAgICB0aGlzLnhSaWdodCA9IHJlY3QueFJpZ2h0O1xuICAgICAgICB0aGlzLnlUb3AgPSByZWN0LnlUb3A7XG4gICAgICAgIHRoaXMueUJvdCA9IHJlY3QueUJvdDtcbiAgICB9XG4gICAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy54UmlnaHQgLSB0aGlzLnhMZWZ0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy55Qm90IC0gdGhpcy55VG9wO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5jb2xvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG9sZERyYXdDb2xvcjogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXREcmF3Q29sb3IoKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKHRoaXMuY29sb3IpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5saW5lKHRoaXMueExlZnQsIHRoaXMueVRvcCwgdGhpcy54UmlnaHQsIHRoaXMueVRvcCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldERyYXdDb2xvcihvbGREcmF3Q29sb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyB1bmZvbGQoKTogSVBkZkJyaWNrW10ge1xuICAgICAgICByZXR1cm4gW3RoaXNdO1xuICAgIH1cbiAgICB0cmFuc2xhdGVYKF86IFRyYW5zbGF0ZVhGdW5jdGlvbik6IHZvaWQge31cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfcm93bGluZS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25UZXh0TW9kZWwsIFF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBUZXh0RmllbGRCcmljayB9IGZyb20gJy4vcGRmX3RleHRmaWVsZCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIFRleHRCb3hCcmljayBleHRlbmRzIFRleHRGaWVsZEJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBpc1F1ZXN0aW9uOiBib29sZWFuID0gdHJ1ZSxcbiAgICAgICAgcHJvdGVjdGVkIGlzTXVsdGlsaW5lOiBib29sZWFuID0gZmFsc2UsIGluZGV4OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCBpc1F1ZXN0aW9uLFxuICAgICAgICAgICAgKDxRdWVzdGlvblRleHRNb2RlbD5xdWVzdGlvbikuaWQgKyAoaXNRdWVzdGlvbiA/ICcnIDogJ19jb21tZW50JyArIGluZGV4KSxcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5nZXRRdWVzdGlvbk9yQ29tbWVudFZhbHVlKDxRdWVzdGlvbj5xdWVzdGlvbiwgaXNRdWVzdGlvbiksXG4gICAgICAgICAgICBpc1F1ZXN0aW9uICYmICg8UXVlc3Rpb25UZXh0TW9kZWw+cXVlc3Rpb24pLmxvY1BsYWNlSG9sZGVyID8gU3VydmV5SGVscGVyLmdldExvY1N0cmluZygoPFF1ZXN0aW9uVGV4dE1vZGVsPnF1ZXN0aW9uKS5sb2NQbGFjZUhvbGRlcikgOiAnJyxcbiAgICAgICAgICAgIHF1ZXN0aW9uLmlzUmVhZE9ubHksIGlzTXVsdGlsaW5lLFxuICAgICAgICAgICAgKDxRdWVzdGlvblRleHRNb2RlbD5xdWVzdGlvbikuaW5wdXRUeXBlKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHRib3gudHMiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMThfXztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJyb290XCI6XCJqc3BkZlwiLFwiY29tbW9uanMyXCI6XCJqc3BkZlwiLFwiY29tbW9uanNcIjpcImpzcGRmXCIsXCJhbWRcIjpcImpzcGRmXCJ9XG4vLyBtb2R1bGUgaWQgPSAxOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgeyBJUmVjdCwgSU1hcmdpbiwgSVNpemUsIERvY09wdGlvbnMsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBUZXh0Qm9sZEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dGJvbGQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbi8qKlxuICogSG9yaXpvbnRhbCBhbGlnbm1lbnQgdHlwZXMgaW4gb25SZW5kZXJIZWFkZXIgYW5kIG9uUmVuZGVyRm9vdGVyIGV2ZW50c1xuICovXG5leHBvcnQgZW51bSBIb3Jpem9udGFsQWxpZ24ge1xuICAgIE5vdFNldCA9ICdub3RzZXQnLFxuICAgIExlZnQgPSAnbGVmdCcsXG4gICAgQ2VudGVyID0gJ2NlbnRlcicsXG4gICAgUmlnaHQgPSAncmlnaHQnXG59XG4vKipcbiAqIFZlcnRpY2FsIGFsaWdubWVudCB0eXBlcyBpbiBvblJlbmRlckhlYWRlciBhbmQgb25SZW5kZXJGb290ZXIgZXZlbnRzXG4gKi9cbmV4cG9ydCBlbnVtIFZlcnRpY2FsQWxpZ24ge1xuICAgIE5vdFNldCA9ICdub3RzZXQnLFxuICAgIFRvcCA9ICd0b3AnLFxuICAgIE1pZGRsZSA9ICdtaWRkbGUnLFxuICAgIEJvdHRvbSA9ICdib3R0b20nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURyYXdSZWN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogSG9yaXpvbnRhbCBhbGlnbm1lbnQgd2l0aGluIHRoZSByZWN0YW5nbGUgdGhhdCBsaW1pdHMgdGhlIGRyYXdpbmcgYXJlYS5cbiAgICAgKlxuICAgICAqIFBvc3NpYmxlIHZhbHVlczpcbiAgICAgKlxuICAgICAqIC0gYFwiY2VudGVyXCJgIChkZWZhdWx0KVxuICAgICAqIC0gYFwibGVmdFwiYFxuICAgICAqIC0gYFwicmlnaHRcImBcbiAgICAgKi9cbiAgICBob3Jpem9udGFsQWxpZ24/OiBIb3Jpem9udGFsQWxpZ247XG4gICAgLyoqXG4gICAgICogVmVydGljYWwgYWxpZ25tZW50IHdpdGhpbiB0aGUgcmVjdGFuZ2xlIHRoYXQgbGltaXRzIHRoZSBkcmF3aW5nIGFyZWEuXG4gICAgICpcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICpcbiAgICAgKiAtIGBcIm1pZGRsZVwiYCAoZGVmYXVsdClcbiAgICAgKiAtIGBcInRvcFwiYFxuICAgICAqIC0gYFwiYm90dG9tXCJgXG4gICAgICovXG4gICAgdmVydGljYWxBbGlnbj86IFZlcnRpY2FsQWxpZ247XG4gICAgLyoqXG4gICAgICogVGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGNvbnRlbnQgYW5kIHRoZSBib3JkZXJzIG9mIHRoZSByZWN0YW5nbGUuIFRoaXMgcHJvcGVydHkgYXBwbGllcyBvbmx5IGlmIHRoZSBjb250ZW50IGlzIGFsaWduZWQgdG8gdGhlIGxlZnQvcmlnaHQgb3IgdG9wL2JvdHRvbS5cbiAgICAgKi9cbiAgICBtYXJnaW5zPzogSU1hcmdpbjtcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2l0aCBjb29yZGluYXRlcyBvZiB0aGUgcmVjdGFuZ2xlLlxuICAgICAqL1xuICAgIHJlY3Q/OiBJUmVjdDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgY29uZmlndXJlcyByZW5kZXJpbmcgYSBwaWVjZSBvZiB0ZXh0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElEcmF3VGV4dE9wdGlvbnMgZXh0ZW5kcyBJRHJhd1JlY3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIHRleHQgc3RyaW5nIHRvIGJlIGRyYXduLlxuICAgICAqL1xuICAgIHRleHQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGb250IHNpemUgaW4gcG9pbnRzLlxuICAgICAqXG4gICAgICogRGVmYXVsdCB2YWx1ZTogMTRcbiAgICAgKi9cbiAgICBmb250U2l6ZT86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBFbmFibGUgdGhpcyBwcm9wZXJ0eSB0byByZW5kZXIgdGhlIHRleHQgc3RyaW5nIGJvbGQuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlOiBgZmFsc2VgXG4gICAgICovXG4gICAgaXNCb2xkPzogYm9vbGVhbjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgY29uZmlndXJlcyByZW5kZXJpbmcgYW4gaW1hZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURyYXdJbWFnZU9wdGlvbnMgZXh0ZW5kcyBJRHJhd1JlY3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBpbWFnZSB3aWR0aCBpbiBwaXhlbHMuIERlZmF1bHRzIHRvIHRoZSBbcmVjdGFuZ2xlIHdpZHRoXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2lkcmF3aW1hZ2VvcHRpb25zI3JlY3QpLlxuICAgICAqL1xuICAgIHdpZHRoPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFuIGltYWdlIGhlaWdodCBpbiBwaXhlbHMuIERlZmF1bHRzIHRvIHRoZSBbcmVjdGFuZ2xlIGhlaWdodF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pZHJhd2ltYWdlb3B0aW9ucyNyZWN0KS5cbiAgICAgKi9cbiAgICBoZWlnaHQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgdmFsdWUgd2l0aCBhIGJhc2U2NC1lbmNvZGVkIGltYWdlIHRvIGJlIGRyYXduLlxuICAgICAqL1xuICAgIGJhc2U2NDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBob3cgdG8gcmVzaXplIHRoZSBpbWFnZSB0byBmaXQgaXQgaW50byBpdHMgY29udGFpbmVyLlxuICAgICAqXG4gICAgICogRGVmYXVsdCB2YWx1ZTogYFwiY29udGFpblwiYCBpZiBbYGFwcGx5SW1hZ2VGaXRgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2lkb2NvcHRpb25zI2FwcGx5SW1hZ2VGaXQpIGlzIGVuYWJsZWQgb3IgYHVuZGVmaW5lZGAgaWYgbm90LlxuICAgICAqXG4gICAgICogUmVmZXIgdG8gdGhlIFtgb2JqZWN0LWZpdGBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9vYmplY3QtZml0KSBDU1MgcHJvcGVydHkgZGVzY3JpcHRpb24gZm9yIGluZm9ybWF0aW9uIG9uIGFjY2VwdGVkIHZhbHVlcy5cbiAgICAgKi9cbiAgICBpbWFnZUZpdD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBkZXNjcmliZXMgYSBkcmF3aW5nIGFyZWEgYW5kIGVuYWJsZXMgeW91IHRvIGRyYXcgYW4gaW1hZ2Ugb3IgYSBwaWVjZSBvZiB0ZXh0IHdpdGhpbiB0aGUgYXJlYS4gWW91IGNhbiBhY2Nlc3MgdGhpcyBvYmplY3Qgd2l0aGluIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSBgU3VydmV5UERGYCdzIFtgb25SZW5kZXJIZWFkZXJgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3N1cnZleXBkZiNvblJlbmRlckhlYWRlcikgYW5kIFtgb25SZW5kZXJGb290ZXJgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3N1cnZleXBkZiNvblJlbmRlckZvb3RlcikgZXZlbnRzLlxuICpcbiAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9jdXN0b21pemUtaGVhZGVyLWFuZC1mb290ZXItb2YtcGRmLWZvcm0vIChsaW5rU3R5bGUpKVxuICovXG5leHBvcnQgY2xhc3MgRHJhd0NhbnZhcyB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBwYWNrczogSVBkZkJyaWNrW10sXG4gICAgICAgIHB1YmxpYyBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBwcm90ZWN0ZWQgX3JlY3Q6IElSZWN0LFxuICAgICAgICBwcm90ZWN0ZWQgX2NvdW50UGFnZXM6IG51bWJlcixcbiAgICAgICAgcHJvdGVjdGVkIF9wYWdlTnVtYmVyOiBudW1iZXIpIHsgfVxuICAgIC8qKlxuICAgICAqIEEgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhZ2VDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fY291bnRQYWdlcztcbiAgICB9XG4gICAgcHVibGljIGdldCBjb3VudFBhZ2VzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3VudFBhZ2VzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRoZSBwYWdlIHRoYXQgY29udGFpbnMgdGhlIGRyYXdpbmcgYXJlYS4gRW51bWVyYXRpb24gc3RhcnRzIHdpdGggMS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhZ2VOdW1iZXIoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VOdW1iZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aXRoIGNvb3JkaW5hdGVzIG9mIGEgcmVjdGFuZ2xlIHRoYXQgbGltaXRzIHRoZSBkcmF3aW5nIGFyZWEuIFRoaXMgb2JqZWN0IGNvbnRhaW4gdGhlIGZvbGxvd2luZyBmaWVsZHM6IGB4TGVmdGAsIGB4UmlnaHRgLCBgeVRvcGAsIGB5Qm90YC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlY3QoKTogSVJlY3Qge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVjdDtcbiAgICB9XG4gICAgcHJpdmF0ZSBhbGlnblJlY3QocmVjdE9wdGlvbnM6IElEcmF3UmVjdE9wdGlvbnMsIGl0ZW1TaXplOiBJU2l6ZSk6IElSZWN0IHtcbiAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmVjdE9wdGlvbnMubWFyZ2lucyA9IHsgbGVmdDogMC4wLCByaWdodDogMC4wLCB0b3A6IDAuMCwgYm90OiAwLjAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLm1hcmdpbnMubGVmdCA9IDAuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMubWFyZ2lucy5yaWdodCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0ID0gMC4wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zLnRvcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5tYXJnaW5zLnRvcCA9IDAuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMubWFyZ2lucy5ib3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMubWFyZ2lucy5ib3QgPSAwLjA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5yZWN0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5ob3Jpem9udGFsQWxpZ24gPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMuaG9yaXpvbnRhbEFsaWduID09PSBIb3Jpem9udGFsQWxpZ24uTm90U2V0KSB7XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMuaG9yaXpvbnRhbEFsaWduID0gSG9yaXpvbnRhbEFsaWduLkNlbnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMudmVydGljYWxBbGlnbiA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy52ZXJ0aWNhbEFsaWduID09PSBWZXJ0aWNhbEFsaWduLk5vdFNldCkge1xuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLnZlcnRpY2FsQWxpZ24gPSBWZXJ0aWNhbEFsaWduLk1pZGRsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jbG9uZSh0aGlzLnJlY3QpO1xuICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLmhvcml6b250YWxBbGlnbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocmVjdE9wdGlvbnMuaG9yaXpvbnRhbEFsaWduKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBIb3Jpem9udGFsQWxpZ24uTGVmdDpcbiAgICAgICAgICAgICAgICAgICAgcmVjdC54TGVmdCA9IHRoaXMucmVjdC54TGVmdCArIHJlY3RPcHRpb25zLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgcmVjdC54UmlnaHQgPSBNYXRoLm1pbih0aGlzLnJlY3QueFJpZ2h0IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5yaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVjdC54TGVmdCArIHJlY3RPcHRpb25zLm1hcmdpbnMubGVmdCArIGl0ZW1TaXplLndpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBIb3Jpem9udGFsQWxpZ24uQ2VudGVyOlxuICAgICAgICAgICAgICAgICAgICByZWN0LnhMZWZ0ID0gTWF0aC5tYXgodGhpcy5yZWN0LnhMZWZ0ICsgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMucmVjdC54TGVmdCArIHRoaXMucmVjdC54UmlnaHQgLSBpdGVtU2l6ZS53aWR0aCkgLyAyLjApO1xuICAgICAgICAgICAgICAgICAgICByZWN0LnhSaWdodCA9IE1hdGgubWluKHRoaXMucmVjdC54UmlnaHQgLSByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMucmVjdC54TGVmdCArIHRoaXMucmVjdC54UmlnaHQgKyBpdGVtU2l6ZS53aWR0aCkgLyAyLjApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEhvcml6b250YWxBbGlnbi5SaWdodDpcbiAgICAgICAgICAgICAgICAgICAgcmVjdC54TGVmdCA9IE1hdGgubWF4KHRoaXMucmVjdC54TGVmdCArIHJlY3RPcHRpb25zLm1hcmdpbnMubGVmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVjdC54UmlnaHQgLSByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0IC0gaXRlbVNpemUud2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICByZWN0LnhSaWdodCA9IHRoaXMucmVjdC54UmlnaHQgLSByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlY3QueExlZnQgPSByZWN0T3B0aW9ucy5yZWN0LnhMZWZ0IHx8IHRoaXMucmVjdC54TGVmdDtcbiAgICAgICAgICAgIHJlY3QueFJpZ2h0ID0gcmVjdE9wdGlvbnMucmVjdC54UmlnaHQgfHwgdGhpcy5yZWN0LnhSaWdodDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLnZlcnRpY2FsQWxpZ24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHJlY3RPcHRpb25zLnZlcnRpY2FsQWxpZ24pIHtcbiAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ24uVG9wOlxuICAgICAgICAgICAgICAgICAgICByZWN0LnlUb3AgPSB0aGlzLnJlY3QueVRvcCArIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wO1xuICAgICAgICAgICAgICAgICAgICByZWN0LnlCb3QgPSBNYXRoLm1pbih0aGlzLnJlY3QueUJvdCAtIHJlY3RPcHRpb25zLm1hcmdpbnMuYm90LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN0LnlUb3AgKyByZWN0T3B0aW9ucy5tYXJnaW5zLnRvcCArIGl0ZW1TaXplLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbi5NaWRkbGU6XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueVRvcCA9IE1hdGgubWF4KHRoaXMucmVjdC55VG9wICsgcmVjdE9wdGlvbnMubWFyZ2lucy50b3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5yZWN0LnlUb3AgKyB0aGlzLnJlY3QueUJvdCAtIGl0ZW1TaXplLmhlaWdodCkgLyAyLjApO1xuICAgICAgICAgICAgICAgICAgICByZWN0LnlCb3QgPSBNYXRoLm1pbih0aGlzLnJlY3QueUJvdCAtIHJlY3RPcHRpb25zLm1hcmdpbnMuYm90LFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMucmVjdC55VG9wICsgdGhpcy5yZWN0LnlCb3QgKyBpdGVtU2l6ZS5oZWlnaHQpIC8gMi4wKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduLkJvdHRvbTpcbiAgICAgICAgICAgICAgICAgICAgcmVjdC55VG9wID0gTWF0aC5tYXgodGhpcy5yZWN0LnlUb3AgKyByZWN0T3B0aW9ucy5tYXJnaW5zLnRvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVjdC55Qm90IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5ib3QgLSBpdGVtU2l6ZS5oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICByZWN0LnlCb3QgPSB0aGlzLnJlY3QueUJvdCAtIHJlY3RPcHRpb25zLm1hcmdpbnMuYm90O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlY3QueVRvcCA9IHJlY3RPcHRpb25zLnJlY3QueVRvcCB8fCB0aGlzLnJlY3QueVRvcDtcbiAgICAgICAgICAgIHJlY3QueUJvdCA9IHJlY3RPcHRpb25zLnJlY3QueUJvdCB8fCB0aGlzLnJlY3QueUJvdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRHJhd3MgYSBwaWVjZSBvZiB0ZXh0IHdpdGhpbiB0aGUgZHJhd2luZyBhcmVhLlxuICAgICAqIEBwYXJhbSB0ZXh0T3B0aW9ucyBBbiBbYElEcmF3VGV4dE9wdGlvbnNgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2lkcmF3dGV4dG9wdGlvbnMpIG9iamVjdCB0aGF0IGNvbmZpZ3VyZXMgdGhlIGRyYXdpbmcuXG4gICAgICovXG4gICAgcHVibGljIGRyYXdUZXh0KHRleHRPcHRpb25zOiBJRHJhd1RleHRPcHRpb25zKTogdm9pZCB7XG4gICAgICAgIHRleHRPcHRpb25zID0gU3VydmV5SGVscGVyLmNsb25lKHRleHRPcHRpb25zKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0T3B0aW9ucy5mb250U2l6ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRleHRPcHRpb25zLmZvbnRTaXplID0gRG9jT3B0aW9ucy5GT05UX1NJWkU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0T3B0aW9ucy5pc0JvbGQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0ZXh0T3B0aW9ucy5pc0JvbGQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ZXh0U2l6ZTogSVNpemUgPSB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQodGV4dE9wdGlvbnMudGV4dCxcbiAgICAgICAgICAgIHRleHRPcHRpb25zLmlzQm9sZCA/ICdib2xkJyA6ICdub3JtYWwnLCB0ZXh0T3B0aW9ucy5mb250U2l6ZSk7XG4gICAgICAgIGNvbnN0IHRleHRSZWN0OiBJUmVjdCA9IHRoaXMuYWxpZ25SZWN0KHRleHRPcHRpb25zLCB0ZXh0U2l6ZSk7XG4gICAgICAgIGlmICghdGV4dE9wdGlvbnMuaXNCb2xkKSB7XG4gICAgICAgICAgICB0aGlzLnBhY2tzLnB1c2gobmV3IFRleHRCcmljayhudWxsLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdGV4dFJlY3QsIHRleHRPcHRpb25zLnRleHQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGFja3MucHVzaChuZXcgVGV4dEJvbGRCcmljayhudWxsLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdGV4dFJlY3QsIHRleHRPcHRpb25zLnRleHQpKTtcbiAgICAgICAgfVxuICAgICAgICAoPFBkZkJyaWNrPnRoaXMucGFja3NbdGhpcy5wYWNrcy5sZW5ndGggLSAxXSkuZm9udFNpemUgPSB0ZXh0T3B0aW9ucy5mb250U2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRHJhd3MgYW4gaW1hZ2Ugd2l0aGluIHRoZSBkcmF3aW5nIGFyZWEuXG4gICAgICogQHBhcmFtIGltYWdlT3B0aW9ucyBBbiBbYElEcmF3SW1hZ2VPcHRpb25zYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pZHJhd2ltYWdlb3B0aW9ucykgb2JqZWN0IHRoYXQgY29uZmlndXJlcyBkcmF3aW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBkcmF3SW1hZ2UoaW1hZ2VPcHRpb25zOiBJRHJhd0ltYWdlT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpbWFnZU9wdGlvbnMgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUoaW1hZ2VPcHRpb25zKTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbWFnZU9wdGlvbnMud2lkdGggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpbWFnZU9wdGlvbnMud2lkdGggPSB0aGlzLnJlY3QueFJpZ2h0IC0gdGhpcy5yZWN0LnhMZWZ0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaW1hZ2VPcHRpb25zLmhlaWdodCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltYWdlT3B0aW9ucy5oZWlnaHQgPSB0aGlzLnJlY3QueUJvdCAtIHRoaXMucmVjdC55VG9wO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGltYWdlU2l6ZTogSVNpemUgPSB7XG4gICAgICAgICAgICB3aWR0aDogaW1hZ2VPcHRpb25zLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBpbWFnZU9wdGlvbnMuaGVpZ2h0XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGltYWdlUmVjdDogSVJlY3QgPSB0aGlzLmFsaWduUmVjdChpbWFnZU9wdGlvbnMsIGltYWdlU2l6ZSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygwLCAwKTtcbiAgICAgICAgdGhpcy5wYWNrcy5wdXNoKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQoXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoaW1hZ2VSZWN0LCB0cnVlLCB0cnVlKSxcbiAgICAgICAgICAgIG51bGwsIHRoaXMuY29udHJvbGxlciwgeyBsaW5rOiBpbWFnZU9wdGlvbnMuYmFzZTY0LFxuICAgICAgICAgICAgICAgIHdpZHRoOiBpbWFnZVJlY3QueFJpZ2h0IC0gaW1hZ2VSZWN0LnhMZWZ0LFxuICAgICAgICAgICAgICAgIGhlaWdodDogaW1hZ2VSZWN0LnlCb3QgLSBpbWFnZVJlY3QueVRvcCwgb2JqZWN0Rml0OiBpbWFnZU9wdGlvbnMuaW1hZ2VGaXQgfSwgISFpbWFnZU9wdGlvbnMuaW1hZ2VGaXQgfHwgdGhpcy5jb250cm9sbGVyLmFwcGx5SW1hZ2VGaXQpKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2V2ZW50X2hhbmRsZXIvZHJhd19jYW52YXMudHMiLCJpbXBvcnQgeyBFdmVudCwgRXZlbnRCYXNlIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBEcmF3Q2FudmFzIH0gZnJvbSAnLi9kcmF3X2NhbnZhcyc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEV2ZW50QXN5bmM8U2VuZGVyLCBPcHRpb25zPiBleHRlbmRzIEV2ZW50QmFzZTxTZW5kZXIsIE9wdGlvbnM+IHtcbiAgICBwdWJsaWMgdW5zaGlmdChmdW5jOiAoc2VuZGVyOiBTZW5kZXIsIG9wdGlvbnM6IE9wdGlvbnMpID0+IGFueSkge1xuICAgICAgICBpZiAodGhpcy5oYXNGdW5jKGZ1bmMpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmNhbGxiYWNrcyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrcyA9IG5ldyBBcnJheTwoc2VuZGVyOiBTZW5kZXIsIG9wdGlvbnM6IE9wdGlvbnMpID0+IGFueT4oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbGxiYWNrcy51bnNoaWZ0KGZ1bmMpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmlyZShzZW5kZXI6IFNlbmRlciwgb3B0aW9uczogT3B0aW9ucykge1xuICAgICAgICBpZiAodGhpcy5jYWxsYmFja3MgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNhbGxiYWNrc1tpXShzZW5kZXIsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEV2ZW50SGFuZGxlciB7XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBwcm9jZXNzX2hlYWRlcl9ldmVudHMoc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHBhY2tzOiBJUGRmQnJpY2tbXVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghc3VydmV5LmhhdmVDb21tZXJjaWFsTGljZW5zZSkge1xuICAgICAgICAgICAgc3VydmV5Lm9uUmVuZGVySGVhZGVyLmFkZCgoXywgY2FudmFzKSA9PiB7XG4gICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1N1cnZleUpTIFBERiB8IFBsZWFzZSBwdXJjaGFzZSBhIFN1cnZleUpTIFBERiBkZXZlbG9wZXIgbGljZW5zZSB0byB1c2UgaXQgaW4geW91ciBhcHAgfCBodHRwczovL3N1cnZleWpzLmlvL0J1eScsXG4gICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiAxMFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHBhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhd2FpdCBzdXJ2ZXkub25SZW5kZXJIZWFkZXIuZmlyZShzdXJ2ZXksIG5ldyBEcmF3Q2FudmFzKHBhY2tzW2ldLCBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVIZWFkZXJSZWN0KGNvbnRyb2xsZXIpLCBwYWNrcy5sZW5ndGgsIGkgKyAxKSk7XG4gICAgICAgICAgICBhd2FpdCBzdXJ2ZXkub25SZW5kZXJGb290ZXIuZmlyZShzdXJ2ZXksIG5ldyBEcmF3Q2FudmFzKHBhY2tzW2ldLCBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVGb290ZXJSZWN0KGNvbnRyb2xsZXIpLCBwYWNrcy5sZW5ndGgsIGkgKyAxKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2V2ZW50X2hhbmRsZXIvZXZlbnRfaGFuZGxlci50cyIsImltcG9ydCB7IElQb2ludCB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuXG5leHBvcnQgY2xhc3MgRmxhdFF1ZXN0aW9uRGVmYXVsdCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgYCR7dGhpcy5xdWVzdGlvbi5kaXNwbGF5VmFsdWV9YCwgVGV4dEJyaWNrKTtcbiAgICAgICAgcmV0dXJuIFt2YWx1ZUJyaWNrXTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfZGVmYXVsdC50cyIsImltcG9ydCB7XG4gICAgSVF1ZXN0aW9uLCBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLCBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSxcbiAgICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3csIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwsIFNlcmlhbGl6ZXIsIFBhbmVsTW9kZWwsIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsLFxuICAgIExvY2FsaXphYmxlU3RyaW5nXG59IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSUZsYXRRdWVzdGlvbiwgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRTZWxlY3RCYXNlIH0gZnJvbSAnLi9mbGF0X3NlbGVjdGJhc2UnO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgRmxhdFN1cnZleSB9IGZyb20gJy4vZmxhdF9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdE1hdHJpeE11bHRpcGxlIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdBUF9CRVRXRUVOX1JPV1M6IG51bWJlciA9IDAuNTtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2U7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERiwgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcHJvdGVjdGVkIGlzTXVsdGlwbGU6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2U+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgdmlzaWJsZVJvd3NWYWx1ZTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93W107XG4gICAgcHJpdmF0ZSBnZXQgdmlzaWJsZVJvd3MoKSB7XG4gICAgICAgIGlmKCF0aGlzLnZpc2libGVSb3dzVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZVJvd3NWYWx1ZSA9IHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZS5yb3dzLmZpbHRlcihyb3cgPT4gcm93LnZpc2libGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2libGVSb3dzVmFsdWU7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0c0NlbGxUaXRsZShwb2ludDogSVBvaW50LCBsb2NUaXRsZTogTG9jYWxpemFibGVTdHJpbmcpOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChwb2ludCxcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgbG9jVGl0bGUsIFRleHRCcmljaykpO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdHNDZWxsKHBvaW50OiBJUG9pbnQsIGNlbGw6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwsXG4gICAgICAgIGxvY2F0aW9uPzogJ2hlYWRlcicgfCAnZm9vdGVyJywgaXNXaWRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8Q29tcG9zaXRlQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBpZiAoY2VsbC5oYXNRdWVzdGlvbikge1xuICAgICAgICAgICAgaWYobG9jYXRpb24gPT0gJ2Zvb3RlcicgJiYgIWNlbGwucXVlc3Rpb24uaXNBbnN3ZXJlZCkge31cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzV2lkZSAmJiBjZWxsLmlzQ2hvaWNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmxhdE11bHRpcGxlQ29sdW1uc1F1ZXN0aW9uOiBJRmxhdFF1ZXN0aW9uID0gRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VydmV5LCBjZWxsLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGNlbGwucXVlc3Rpb24uZ2V0VHlwZSgpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoU3VydmV5SGVscGVyLnNjYWxlUmVjdChcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0LCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCksXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSwgcG9pbnQueExlZnQpO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljaygoPEZsYXRTZWxlY3RCYXNlPmZsYXRNdWx0aXBsZUNvbHVtbnNRdWVzdGlvbilcbiAgICAgICAgICAgICAgICAgICAgLmdlbmVyYXRlRmxhdEl0ZW0oaXRlbVJlY3QsIGNlbGwuaXRlbSwgY2VsbC5jaG9pY2VJbmRleCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY2VsbC5xdWVzdGlvbi50aXRsZUxvY2F0aW9uID0gU3VydmV5SGVscGVyLlRJVExFX0xPQ0FUSU9OX01BVFJJWDtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soLi4uYXdhaXQgU3VydmV5SGVscGVyLmdlbmVyYXRlUXVlc3Rpb25GbGF0cyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXJ2ZXksIHRoaXMuY29udHJvbGxlciwgY2VsbC5xdWVzdGlvbiwgcG9pbnQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjZWxsLmhhc1RpdGxlKSB7XG4gICAgICAgICAgICBpZiAobG9jYXRpb24gPT0gJ2hlYWRlcicpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUJvbGRUZXh0RmxhdChwb2ludCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBjZWxsLmxvY1RpdGxlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KHBvaW50LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGNlbGwubG9jVGl0bGUsIFRleHRCcmljaykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0IGhhc0RldGFpbFBhbmVsKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpYmxlUm93cy5zb21lKChyZW5kZXJlZFJvdykgPT4gcmVuZGVyZWRSb3cucm93ICYmIHRoaXMucXVlc3Rpb24uaGFzRGV0YWlsUGFuZWwocmVuZGVyZWRSb3cucm93KSk7XG4gICAgfVxuICAgIHByaXZhdGUgaWdub3JlQ2VsbChjZWxsOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsLCBpbmRleDogbnVtYmVyLCBsb2NhdGlvbj86ICdoZWFkZXInIHwgJ2Zvb3RlcicsIGlzV2lkZTogYm9vbGVhbiA9IHRydWUpOiBib29sZWFuIHtcbiAgICAgICAgaWYoIWlzV2lkZSAmJiBsb2NhdGlvbiA9PSAnZm9vdGVyJyAmJiBjZWxsLmhhc1F1ZXN0aW9uICYmICFjZWxsLnF1ZXN0aW9uLmlzQW5zd2VyZWQpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gIShjZWxsLmhhc1F1ZXN0aW9uIHx8IGNlbGwuaGFzVGl0bGUgfHwgKHRoaXMuaXNNdWx0aXBsZSAmJiAodGhpcy5oYXNEZXRhaWxQYW5lbCA/IGluZGV4ID09IDEgOiBpbmRleCA9PSAwKSkpO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFJvd0xvY2F0aW9uKHJvdzogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93KSB7XG4gICAgICAgIHJldHVybiByb3cgPT09IHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZS5oZWFkZXJSb3cgPyAnaGVhZGVyJyA6ICh0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVGFibGUuZm9vdGVyUm93ID09PSByb3cgPyAnZm9vdGVyJyA6IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0c1Jvd0hvcmlzb250YWwocG9pbnQ6IElQb2ludCwgcm93OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3csIGNvbHVtbldpZHRoOiBudW1iZXJbXSk6IFByb21pc2U8Q29tcG9zaXRlQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGxldCBsYXN0UmlnaHRNYXJnaW46IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCArXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICBsZXQgY250ID0gMDtcbiAgICAgICAgY29uc3Qgcm93TG9jYXRpb24gPSB0aGlzLmdldFJvd0xvY2F0aW9uKHJvdyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93LmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pZ25vcmVDZWxsKHJvdy5jZWxsc1tpXSwgaSwgcm93TG9jYXRpb24pKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGxhc3RSaWdodE1hcmdpbiArXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9DT0xVTU5TO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbHVtbldpZHRoW2NudF07XG4gICAgICAgICAgICBsYXN0UmlnaHRNYXJnaW4gPSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodDtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICBjb25zdCBjZWxsQ29udGVudDogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDZWxsKFxuICAgICAgICAgICAgICAgIGN1cnJQb2ludCwgcm93LmNlbGxzW2ldLCByb3dMb2NhdGlvbik7XG4gICAgICAgICAgICBpZiAoIWNlbGxDb250ZW50LmlzRW1wdHkpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soY2VsbENvbnRlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY250Kys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRzUm93VmVydGljYWwocG9pbnQ6IElQb2ludCwgcm93OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3cpOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCByb3dMb2NhdGlvbiA9IHRoaXMuZ2V0Um93TG9jYXRpb24ocm93KTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvdy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaWdub3JlQ2VsbChyb3cuY2VsbHNbaV0sIGksIHJvd0xvY2F0aW9uLCBmYWxzZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZS5zaG93SGVhZGVyICYmICghdGhpcy5pc011bHRpcGxlIHx8IGkgPiAwKSAmJiByb3cuY2VsbHNbaV0uY2VsbD8uY29sdW1uPy5sb2NUaXRsZSkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDZWxsVGl0bGUoY3VyclBvaW50LCByb3cuY2VsbHNbaV0uY2VsbC5jb2x1bW4ubG9jVGl0bGUpKTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IGNvbXBvc2l0ZS55Qm90ICsgRmxhdE1hdHJpeE11bHRpcGxlLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDZWxsKGN1cnJQb2ludCwgcm93LmNlbGxzW2ldLCByb3dMb2NhdGlvbiwgZmFsc2UpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gY29tcG9zaXRlLnlCb3QgKyBGbGF0TWF0cml4TXVsdGlwbGUuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0QXZhbGFibGVXaWR0aChjb2xDb3VudDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSAtXG4gICAgICAgIChjb2xDb3VudCAtIDEpICogdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9DT0xVTU5TO1xuICAgIH1cbiAgICBwcml2YXRlIGNhbGN1bGF0ZUNvbHVtbldpZHRoKHJvd3M6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvd1tdLCBjb2xDb3VudDogbnVtYmVyKTogbnVtYmVyW10ge1xuICAgICAgICBjb25zdCBhdmFpbGFibGVXaWR0aDogbnVtYmVyID0gdGhpcy5nZXRBdmFsYWJsZVdpZHRoKGNvbENvdW50KTtcbiAgICAgICAgbGV0IHJlbWFpbldpZHRoOiBudW1iZXIgPSBhdmFpbGFibGVXaWR0aDtcbiAgICAgICAgbGV0IHJlbWFpbkNvbENvdW50OiBudW1iZXIgPSBjb2xDb3VudDtcbiAgICAgICAgY29uc3QgY29sdW1uV2lkdGg6IG51bWJlcltdID0gW107XG4gICAgICAgIGNvbnN0IHVuc2V0Q2VsbHM6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGxbXSA9IFtdO1xuICAgICAgICBsZXQgY2VsbHMgPSByb3dzWzBdLmNlbGxzLmZpbHRlcigoY2VsbDogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCwgaW5kZXg6IG51bWJlcikgPT4gIXRoaXMuaWdub3JlQ2VsbChjZWxsLCBpbmRleCkpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgY29sQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKGNlbGxzW2ldLndpZHRoLFxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoLCBjb2xDb3VudCkgfHwgMC4wO1xuICAgICAgICAgICAgcmVtYWluV2lkdGggLT0gd2lkdGg7XG4gICAgICAgICAgICBpZiAod2lkdGggIT09IDAuMCkge1xuICAgICAgICAgICAgICAgIHJlbWFpbkNvbENvdW50LS07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVuc2V0Q2VsbHMucHVzaChjZWxsc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2x1bW5XaWR0aC5wdXNoKHdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVtYWluQ29sQ291bnQgPT09IDApIHJldHVybiBjb2x1bW5XaWR0aDtcbiAgICAgICAgY29uc3QgaGV1cmlzdGljV2lkdGg6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChTdXJ2ZXlIZWxwZXIuTUFUUklYX0NPTFVNTl9XSURUSCkud2lkdGg7XG4gICAgICAgIHVuc2V0Q2VsbHMuc29ydCgoY2VsbDE6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwsIGNlbGwyOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsKSA9PiB7XG4gICAgICAgICAgICBsZXQgbWluV2lkdGgxID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoY2VsbDEubWluV2lkdGgsIGF2YWlsYWJsZVdpZHRoLCBjb2xDb3VudCkgfHwgMC4wO1xuICAgICAgICAgICAgbGV0IG1pbldpZHRoMiA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKGNlbGwyLm1pbldpZHRoLCBhdmFpbGFibGVXaWR0aCwgY29sQ291bnQpIHx8IDAuMDtcbiAgICAgICAgICAgIHJldHVybiBtaW5XaWR0aDIgPiBtaW5XaWR0aDEgPyAxIDogLTE7XG4gICAgICAgIH0pLmZvckVhY2goKGNlbGw6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVxdWFsV2lkdGg6IG51bWJlciA9IHJlbWFpbldpZHRoIC8gcmVtYWluQ29sQ291bnQ7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW5NaW5XaWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoY2VsbC5taW5XaWR0aCwgYXZhaWxhYmxlV2lkdGgsIGNvbENvdW50KSB8fCAwLjA7XG4gICAgICAgICAgICBpZihjb2x1bW5NaW5XaWR0aCA+IGVxdWFsV2lkdGggJiYgY29sdW1uTWluV2lkdGggPiBoZXVyaXN0aWNXaWR0aCkge1xuICAgICAgICAgICAgICAgIHJlbWFpbldpZHRoIC09IGNvbHVtbk1pbldpZHRoO1xuICAgICAgICAgICAgICAgIHJlbWFpbkNvbENvdW50LS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2x1bW5XaWR0aFtjZWxscy5pbmRleE9mKGNlbGwpXSA9IE1hdGgubWF4KGhldXJpc3RpY1dpZHRoLCBjb2x1bW5NaW5XaWR0aCwgZXF1YWxXaWR0aCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29sdW1uV2lkdGg7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVPbmVSb3cocG9pbnQ6IElQb2ludCwgcm93OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3csIGlzV2lkZTogYm9vbGVhbiwgY29sdW1uV2lkdGg6IG51bWJlcltdKTogUHJvbWlzZTxDb21wb3NpdGVCcmljaz4ge1xuICAgICAgICBpZiAoaXNXaWRlKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzUm93SG9yaXNvbnRhbChwb2ludCwgcm93LCBjb2x1bW5XaWR0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1Jvd1ZlcnRpY2FsKHBvaW50LCByb3cpO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdHNSb3dzKHBvaW50OiBJUG9pbnQsIHJvd3M6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvd1tdLFxuICAgICAgICBjb2xDb3VudDogbnVtYmVyLCBpc1dpZGU6IGJvb2xlYW4pOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCByb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByb3dGbGF0OiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVPbmVSb3coY3VyclBvaW50LCByb3dzW2ldLFxuICAgICAgICAgICAgICAgIGlzV2lkZSwgdGhpcy5jYWxjdWxhdGVDb2x1bW5XaWR0aChyb3dzLCBjb2xDb3VudCkpO1xuICAgICAgICAgICAgaWYgKHJvd0ZsYXQuaXNFbXB0eSAmJiAhKHJvd3NbaV0ucm93ICYmIHJvd3NbaV0ucm93Lmhhc1BhbmVsKSkgY29udGludWU7XG4gICAgICAgICAgICBpZighcm93RmxhdC5pc0VtcHR5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgIT09IHJvd3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHJvd0ZsYXQueUJvdDtcbiAgICAgICAgICAgICAgICAgICAgcm93RmxhdC5hZGRCcmljayhTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoY3VyclBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2gocm93RmxhdCk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSByb3dGbGF0LnlCb3QgKyBGbGF0TWF0cml4TXVsdGlwbGUuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoISFyb3dzW2ldLnJvdyAmJiByb3dzW2ldLnJvdy5oYXNQYW5lbCkge1xuICAgICAgICAgICAgICAgIHJvd3NbaV0ucm93LnNob3dEZXRhaWxQYW5lbCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREZXRhaWxQYW5lbDogUGFuZWxNb2RlbCA9IHJvd3NbaV0ucm93LmRldGFpbFBhbmVsO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY3VycmVudERldGFpbFBhbmVsLnF1ZXN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGV0YWlsUGFuZWwucXVlc3Rpb25zW2pdLmlkICs9ICdfJyArIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsQnJpY2tzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IEZsYXRTdXJ2ZXkuZ2VuZXJhdGVGbGF0c1BhbmVsKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cnZleSwgdGhpcy5jb250cm9sbGVyLCBjdXJyZW50RGV0YWlsUGFuZWwsIGN1cnJQb2ludCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyQ29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICAgICAgICAgIGN1cnJDb21wb3NpdGUuYWRkQnJpY2soLi4ucGFuZWxCcmlja3MpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gY3VyckNvbXBvc2l0ZS55Qm90ICsgRmxhdE1hdHJpeE11bHRpcGxlLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcblxuICAgICAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKGN1cnJDb21wb3NpdGUpO1xuICAgICAgICAgICAgICAgIGlmIChpICE9PSByb3dzLmxlbmd0aCAtIDEgJiYgdGhpcy5xdWVzdGlvbi5yZW5kZXJlZFRhYmxlLnNob3dIZWFkZXIgJiYgaXNXaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlcjogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlT25lUm93KGN1cnJQb2ludCwgcm93c1swXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzV2lkZSwgdGhpcy5jYWxjdWxhdGVDb2x1bW5XaWR0aChyb3dzLCBjb2xDb3VudCkpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VycllUb3AgPSBjdXJyQ29tcG9zaXRlLnlCb3Q7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFoZWFkZXIuaXNFbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycllUb3AgPSBoZWFkZXIueUJvdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKGhlYWRlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBjdXJyWVRvcCArIEZsYXRNYXRyaXhNdWx0aXBsZS5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzRmxhdHM7XG4gICAgfVxuICAgIHByaXZhdGUgY2FsY3VsYXRlSXNXaWRlKHRhYmxlOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSwgY29sQ291bnQ6IG51bWJlcikge1xuICAgICAgICBjb25zdCByb3dzOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3dbXSA9IFtdO1xuICAgICAgICBpZih0YWJsZS5zaG93SGVhZGVyKSB7XG4gICAgICAgICAgICByb3dzLnB1c2godGFibGUuaGVhZGVyUm93KTtcbiAgICAgICAgfVxuICAgICAgICByb3dzLnB1c2goLi4udGhpcy52aXNpYmxlUm93cyk7XG4gICAgICAgIGlmKHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc3QgY29sdW1uV2lkdGhTdW0gPSB0aGlzLmNhbGN1bGF0ZUNvbHVtbldpZHRoKHJvd3MsIGNvbENvdW50KS5yZWR1Y2UoKHdpZHRoU3VtOiBudW1iZXIsIHdpZHRoOiBudW1iZXIpID0+IHdpZHRoU3VtICs9IHdpZHRoLCAwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb24ucmVuZGVyQXMgIT09ICdsaXN0JyAmJiB0aGlzLmNvbnRyb2xsZXIubWF0cml4UmVuZGVyQXMgIT09ICdsaXN0JyAmJiBNYXRoLmZsb29yKGNvbHVtbldpZHRoU3VtKSA8PSBNYXRoLmZsb29yKHRoaXMuZ2V0QXZhbGFibGVXaWR0aChjb2xDb3VudCkpO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFJvd3NUb1JlbmRlcih0YWJsZTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUsIGlzVmVydGljYWw6IGJvb2xlYW4sIGlzV2lkZTogYm9vbGVhbikge1xuICAgICAgICBjb25zdCByb3dzOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3dbXSA9IFtdO1xuICAgICAgICBjb25zdCByZW5kZXJlZFJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgICAgICBpZiAodGFibGUuc2hvd0hlYWRlciAmJiBpc1dpZGUpIHJvd3MucHVzaCh0YWJsZS5oZWFkZXJSb3cpO1xuICAgICAgICByb3dzLnB1c2goLi4ucmVuZGVyZWRSb3dzKTtcbiAgICAgICAgaWYgKHRhYmxlLmhhc1JlbW92ZVJvd3MgJiYgaXNWZXJ0aWNhbCkgcm93cy5wb3AoKTtcbiAgICAgICAgaWYgKHRhYmxlLnNob3dGb290ZXIpIHJvd3MucHVzaCh0YWJsZS5mb290ZXJSb3cpO1xuICAgICAgICByZXR1cm4gcm93cztcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRDb2xDb3VudCh0YWJsZTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUsIHJlbmRlcmVkUm93czogQXJyYXk8UXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93Pik6IG51bWJlciB7XG4gICAgICAgIGlmICghIXJlbmRlcmVkUm93c1swXSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVkUm93c1swXS5jZWxscy5maWx0ZXIoKGNlbGw6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwsIGluZGV4OiBudW1iZXIpID0+ICF0aGlzLmlnbm9yZUNlbGwoY2VsbCwgaW5kZXgpKS5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFibGUuc2hvd0hlYWRlciAmJiB0YWJsZS5oZWFkZXJSb3cgPyB0YWJsZS5oZWFkZXJSb3cuY2VsbHMubGVuZ3RoIDpcbiAgICAgICAgICAgICAgICB0YWJsZS5zaG93Rm9vdGVyICYmIHRhYmxlLmZvb3RlclJvdyA/IHRhYmxlLmZvb3RlclJvdy5jZWxscy5sZW5ndGggOiAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGxldCB0YWJsZTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUgPSB0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVGFibGU7XG4gICAgICAgIGxldCBpc1ZlcnRpY2FsOiBib29sZWFuID0gdGhpcy5xdWVzdGlvbi5jb2x1bW5MYXlvdXQgPT09ICd2ZXJ0aWNhbCc7XG4gICAgICAgIGxldCBjb2xDb3VudDogbnVtYmVyID0gdGhpcy5nZXRDb2xDb3VudCh0YWJsZSwgdGhpcy52aXNpYmxlUm93cyk7XG4gICAgICAgIGlmIChjb2xDb3VudCA9PT0gMCAmJiAhdGhpcy5oYXNEZXRhaWxQYW5lbCkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgQ29tcG9zaXRlQnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KHBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNXaWRlID0gdGhpcy5jYWxjdWxhdGVJc1dpZGUodGFibGUsIGNvbENvdW50KTtcbiAgICAgICAgaWYoIWlzV2lkZSkge1xuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5pc01vYmlsZSA9IHRydWU7XG4gICAgICAgICAgICBpc1ZlcnRpY2FsID0gZmFsc2U7XG4gICAgICAgICAgICB0YWJsZSA9IHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZTtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZVJvd3NWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbENvdW50ID0gdGhpcy5nZXRDb2xDb3VudCh0YWJsZSwgdGhpcy52aXNpYmxlUm93cyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgcm93cyA9IHRoaXMuZ2V0Um93c1RvUmVuZGVyKHRhYmxlLCBpc1ZlcnRpY2FsLCBpc1dpZGUpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzUm93cyhwb2ludCwgcm93cywgY29sQ291bnQsIGlzV2lkZSk7XG4gICAgfVxufVxuXG5TZXJpYWxpemVyLnJlbW92ZVByb3BlcnR5KCdtYXRyaXhkcm9wZG93bicsICdyZW5kZXJBcycpO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eSgnbWF0cml4ZHJvcGRvd24nLCB7XG4gICAgbmFtZTogJ3JlbmRlckFzJyxcbiAgICBkZWZhdWx0OiAnYXV0bycsXG4gICAgdmlzaWJsZTogZmFsc2UsXG4gICAgY2hvaWNlczogWydhdXRvJywgJ2xpc3QnXVxufSk7XG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdtYXRyaXhkcm9wZG93bicsIEZsYXRNYXRyaXhNdWx0aXBsZSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4bXVsdGlwbGUudHMiLCJpbXBvcnQgSW50ZXJ2YWxUcmVlIGZyb20gJ25vZGUtaW50ZXJ2YWwtdHJlZSc7XG5pbXBvcnQgeyBEb2NPcHRpb25zLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmludGVyZmFjZSBQYWNrSW50ZXJ2YWwge1xuICAgIHBhZ2VJbmRleDogbnVtYmVyO1xuICAgIHhMZWZ0OiBudW1iZXI7XG4gICAgeFJpZ2h0OiBudW1iZXI7XG4gICAgeUJvdDogbnVtYmVyO1xuICAgIGFic0JvdDogbnVtYmVyO1xufVxuZXhwb3J0IGNsYXNzIFBhZ2VQYWNrZXIge1xuICAgIHByaXZhdGUgc3RhdGljIGZpbmRCb3RJbnRlcnZhbCh0cmVlOiBJbnRlcnZhbFRyZWU8UGFja0ludGVydmFsPixcbiAgICAgICAgeExlZnQ6IG51bWJlciwgeFJpZ2h0OiBudW1iZXIsIG9wdGlvbnM6IERvY09wdGlvbnMpOiBQYWNrSW50ZXJ2YWwge1xuICAgICAgICBjb25zdCBpbnRlcnZhbHM6IFBhY2tJbnRlcnZhbFtdID0gdHJlZS5zZWFyY2goeExlZnQsIHhSaWdodCk7XG4gICAgICAgIGludGVydmFscy5wdXNoKHtcbiAgICAgICAgICAgIHBhZ2VJbmRleDogMCwgeExlZnQ6XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5tYXJnaW5zLmxlZnQsIHhSaWdodDogb3B0aW9ucy5tYXJnaW5zLmxlZnQsXG4gICAgICAgICAgICB5Qm90OiBvcHRpb25zLm1hcmdpbnMudG9wLCBhYnNCb3Q6IG9wdGlvbnMubWFyZ2lucy50b3BcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbnRlcnZhbHMucmVkdWNlKChteCwgY3IpID0+IHtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhjci54UmlnaHQgLSB4TGVmdCkgPCBTdXJ2ZXlIZWxwZXIuRVBTSUxPTiB8fFxuICAgICAgICAgICAgICAgIE1hdGguYWJzKGNyLnhMZWZ0IC0geFJpZ2h0KSA8IFN1cnZleUhlbHBlci5FUFNJTE9OKSByZXR1cm4gbXg7XG4gICAgICAgICAgICBpZiAoY3IucGFnZUluZGV4IDwgbXgucGFnZUluZGV4KSByZXR1cm4gbXg7XG4gICAgICAgICAgICBpZiAoY3IucGFnZUluZGV4ID4gbXgucGFnZUluZGV4KSByZXR1cm4gY3I7XG4gICAgICAgICAgICByZXR1cm4gY3IueUJvdCA+IG14LnlCb3QgPyBjciA6IG14O1xuICAgICAgICB9LCBpbnRlcnZhbHNbaW50ZXJ2YWxzLmxlbmd0aCAtIDFdKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgYWRkUGFjayhwYWNrczogSVBkZkJyaWNrW11bXSwgaW5kZXg6IG51bWJlciwgYnJpY2s6IElQZGZCcmljaykge1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBwYWNrcy5sZW5ndGg7IGkgPD0gaW5kZXg7IGkrKykge1xuICAgICAgICAgICAgcGFja3MucHVzaChbXSk7XG4gICAgICAgIH1cbiAgICAgICAgcGFja3NbaW5kZXhdLnB1c2goYnJpY2spO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHBhY2soZmxhdHM6IElQZGZCcmlja1tdW10sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBJUGRmQnJpY2tbXVtdIHtcbiAgICAgICAgY29uc3QgcGFnZUhlaWdodDogbnVtYmVyID0gY29udHJvbGxlci5wYXBlckhlaWdodCAtXG4gICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMudG9wIC0gY29udHJvbGxlci5tYXJnaW5zLmJvdDtcbiAgICAgICAgY29uc3QgdW5mb2xkRmxhdHM6IElQZGZCcmlja1tdW10gPSBbXTtcbiAgICAgICAgZmxhdHMuZm9yRWFjaCgoZmxhdHNQYWdlOiBJUGRmQnJpY2tbXSkgPT4ge1xuICAgICAgICAgICAgdW5mb2xkRmxhdHMucHVzaChbXSk7XG4gICAgICAgICAgICBmbGF0c1BhZ2UuZm9yRWFjaCgoZmxhdDogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZsYXQuaGVpZ2h0ID4gcGFnZUhlaWdodCArIFN1cnZleUhlbHBlci5FUFNJTE9OKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuZm9sZEZsYXRzW3VuZm9sZEZsYXRzLmxlbmd0aCAtIDFdLnB1c2goLi4uZmxhdC51bmZvbGQoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgdW5mb2xkRmxhdHNbdW5mb2xkRmxhdHMubGVuZ3RoIC0gMV0ucHVzaChmbGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdW5mb2xkRmxhdHMuZm9yRWFjaCgodW5mb2xkRmxhdHNQYWdlOiBJUGRmQnJpY2tbXSkgPT4ge1xuICAgICAgICAgICAgdW5mb2xkRmxhdHNQYWdlLnNvcnQoKGE6IElQZGZCcmljaywgYjogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGEueVRvcCA8IGIueVRvcCkgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgIGlmIChhLnlUb3AgPiBiLnlUb3ApIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIGlmIChhLnhMZWZ0ID4gYi54TGVmdCkgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgaWYgKGEueExlZnQgPCBiLnhMZWZ0KSByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBwYWdlSW5kZXhNb2RlbDogbnVtYmVyID0gMDtcbiAgICAgICAgY29uc3QgcGFja3M6IElQZGZCcmlja1tdW10gPSBbXTtcbiAgICAgICAgY29uc3QgcGFnZUJvdDogbnVtYmVyID0gY29udHJvbGxlci5wYXBlckhlaWdodCAtIGNvbnRyb2xsZXIubWFyZ2lucy5ib3Q7XG4gICAgICAgIHVuZm9sZEZsYXRzLmZvckVhY2goKHVuZm9sZEZsYXRzUGFnZTogSVBkZkJyaWNrW10pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyZWU6IEludGVydmFsVHJlZTxQYWNrSW50ZXJ2YWw+ID0gbmV3IEludGVydmFsVHJlZSgpO1xuICAgICAgICAgICAgbGV0IHBhZ2VJbmRleFNoaWZ0OiBudW1iZXIgPSAwO1xuICAgICAgICAgICAgdW5mb2xkRmxhdHNQYWdlLmZvckVhY2goKGZsYXQ6IElQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB7IHBhZ2VJbmRleCwgeUJvdCwgYWJzQm90IH0gPSBQYWdlUGFja2VyLmZpbmRCb3RJbnRlcnZhbChcbiAgICAgICAgICAgICAgICAgICAgdHJlZSwgZmxhdC54TGVmdCwgZmxhdC54UmlnaHQsIGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gZmxhdC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgZmxhdC55VG9wID0geUJvdCArIGZsYXQueVRvcCAtIGFic0JvdDtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoZmxhdC55VG9wIC0gY29udHJvbGxlci5tYXJnaW5zLnRvcCkgPiBTdXJ2ZXlIZWxwZXIuRVBTSUxPTiAmJlxuICAgICAgICAgICAgICAgICAgICBmbGF0LnlUb3AgKyBoZWlnaHQgPiBwYWdlQm90ICsgU3VydmV5SGVscGVyLkVQU0lMT04gfHwgZmxhdC5pc1BhZ2VCcmVhaykge1xuICAgICAgICAgICAgICAgICAgICBmbGF0LnlUb3AgPSBjb250cm9sbGVyLm1hcmdpbnMudG9wO1xuICAgICAgICAgICAgICAgICAgICBwYWdlSW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgcGFnZUluZGV4U2hpZnQgPSBNYXRoLm1heChwYWdlSW5kZXhTaGlmdCwgcGFnZUluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHJlZS5pbnNlcnQoZmxhdC54TGVmdCwgZmxhdC54UmlnaHQsIHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZUluZGV4OiBwYWdlSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHhMZWZ0OiBmbGF0LnhMZWZ0LCB4UmlnaHQ6IGZsYXQueFJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB5Qm90OiBmbGF0LnlUb3AgKyBoZWlnaHQsIGFic0JvdDogZmxhdC55Qm90XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZmxhdC55Qm90ID0gZmxhdC55VG9wICsgaGVpZ2h0O1xuICAgICAgICAgICAgICAgIFBhZ2VQYWNrZXIuYWRkUGFjayhwYWNrcywgcGFnZUluZGV4TW9kZWwgKyBwYWdlSW5kZXgsIGZsYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwYWdlSW5kZXhNb2RlbCArPSBwYWdlSW5kZXhTaGlmdCArIDE7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGFja3M7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wYWdlX2xheW91dC9wYWdlX3BhY2tlci50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25Cb29sZWFuTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IENoZWNrSXRlbUJyaWNrIH0gZnJvbSAnLi9wZGZfY2hlY2tpdGVtJztcblxuZXhwb3J0IGNsYXNzIEJvb2xlYW5JdGVtQnJpY2sgZXh0ZW5kcyBDaGVja0l0ZW1CcmljayB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0KSB7XG4gICAgICAgIHN1cGVyKGNvbnRyb2xsZXIsIHJlY3QsXG4gICAgICAgICAgICAoPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPnF1ZXN0aW9uKS5pZCxcbiAgICAgICAgICAgIHsgcXVlc3Rpb246IHF1ZXN0aW9uLCByZWFkT25seTogcXVlc3Rpb24uaXNSZWFkT25seSwgY2hlY2tlZDogKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikuY2hlY2tlZFZhbHVlIH0pO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfYm9vbGVhbml0ZW0udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCwgSXRlbVZhbHVlIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBDaGVja0l0ZW1CcmljayB9IGZyb20gJy4vcGRmX2NoZWNraXRlbSc7XG5cbmV4cG9ydCBjbGFzcyBDaGVja2JveEl0ZW1CcmljayBleHRlbmRzIENoZWNrSXRlbUJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBzdXBlcihjb250cm9sbGVyLCByZWN0LFxuICAgICAgICAgICAgKDxRdWVzdGlvbkNoZWNrYm94TW9kZWw+cXVlc3Rpb24pLmlkICsgJ2luZGV4JyArIGluZGV4LFxuICAgICAgICAgICAgeyBxdWVzdGlvbjogcXVlc3Rpb24sIHJlYWRPbmx5OiBxdWVzdGlvbi5pc1JlYWRPbmx5IHx8ICFpdGVtLmlzRW5hYmxlZCwgaXRlbTogaXRlbSwgY2hlY2tlZDogKDxRdWVzdGlvbkNoZWNrYm94TW9kZWw+cXVlc3Rpb24pLmlzSXRlbVNlbGVjdGVkKGl0ZW0pLCBpbmRleDogaW5kZXggfSk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9jaGVja2JveGl0ZW0udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIHNldHRpbmdzIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBUZXh0Qm94QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0Ym94JztcblxuZXhwb3J0IGNsYXNzIENvbW1lbnRCcmljayBleHRlbmRzIFRleHRCb3hCcmljayB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgaXNRdWVzdGlvbjogYm9vbGVhbiwgaW5kZXg6IG51bWJlciA9IDApIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIGlzUXVlc3Rpb24sIHRydWUsIGluZGV4KTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHNob3VsZFJlbmRlckZsYXRCb3JkZXJzKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZih0aGlzLmlzUXVlc3Rpb24gJiYgdGhpcy5xdWVzdGlvbi5nZXRUeXBlKCkgIT09ICdjb21tZW50JykgcmV0dXJuIHN1cGVyLnNob3VsZFJlbmRlckZsYXRCb3JkZXJzKCk7XG4gICAgICAgIHJldHVybiBzZXR0aW5ncy5yZWFkT25seUNvbW1lbnRSZW5kZXJNb2RlID09PSAndGV4dGFyZWEnO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfY29tbWVudC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25Ecm9wZG93bk1vZGVsLCBJdGVtVmFsdWUgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBEcm9wZG93bkJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25Ecm9wZG93bk1vZGVsO1xuICAgIHByb3RlY3RlZCBpc1F1ZXN0aW9uOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBpc011bHRpbGluZTogYm9vbGVhbjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbixcbiAgICAgICAgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlY3Q6IElSZWN0KSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkRyb3Bkb3duTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgY29tYm9Cb3ggPSBuZXcgKDxhbnk+dGhpcy5jb250cm9sbGVyLmRvYy5BY3JvRm9ybUNvbWJvQm94KSgpO1xuICAgICAgICBjb21ib0JveC5maWVsZE5hbWUgPSB0aGlzLnF1ZXN0aW9uLmlkO1xuICAgICAgICBjb21ib0JveC5SZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZUFjcm9mb3JtUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QodGhpcyxcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuZm9ybVNjYWxlKHRoaXMuY29udHJvbGxlciwgdGhpcykpKTtcbiAgICAgICAgY29tYm9Cb3guZWRpdCA9IGZhbHNlO1xuICAgICAgICBjb21ib0JveC5jb2xvciA9IHRoaXMudGV4dENvbG9yO1xuICAgICAgICBjb25zdCBvcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5zaG93T3B0aW9uc0NhcHRpb24pIHtcbiAgICAgICAgICAgIG9wdGlvbnMucHVzaCh0aGlzLmdldENvcnJlY3RlZFRleHQodGhpcy5xdWVzdGlvbi5vcHRpb25zQ2FwdGlvbikpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXMuZm9yRWFjaCgoaXRlbTogSXRlbVZhbHVlKSA9PiB7XG4gICAgICAgICAgICBvcHRpb25zLnB1c2godGhpcy5nZXRDb3JyZWN0ZWRUZXh0KFN1cnZleUhlbHBlci5nZXRMb2NTdHJpbmcoaXRlbS5sb2NUZXh0KSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29tYm9Cb3guc2V0T3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgY29tYm9Cb3guZm9udE5hbWUgPSB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWU7XG4gICAgICAgIGNvbWJvQm94LmZvbnRTaXplID0gdGhpcy5mb250U2l6ZTtcbiAgICAgICAgY29tYm9Cb3gucmVhZE9ubHkgPSB0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHk7XG4gICAgICAgIGNvbWJvQm94LmlzVW5pY29kZSA9IFN1cnZleUhlbHBlci5pc0N1c3RvbUZvbnQoXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIGNvbWJvQm94LmZvbnROYW1lKTtcbiAgICAgICAgY29tYm9Cb3guViA9IHRoaXMuZ2V0Q29ycmVjdGVkVGV4dChTdXJ2ZXlIZWxwZXIuZ2V0RHJvcGRvd25RdWVzdGlvblZhbHVlKHRoaXMucXVlc3Rpb24pKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5hZGRGaWVsZChjb21ib0JveCk7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfZHJvcGRvd24udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuXG5leHBvcnQgY2xhc3MgSFRNTEJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByaXZhdGUgbWFyZ2luczogeyB0b3A6IG51bWJlciwgYm90dG9tOiBudW1iZXIgfTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBodG1sOiBzdHJpbmcsIGlzSW1hZ2U6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIGlmIChpc0ltYWdlKSB7XG4gICAgICAgICAgICB0aGlzLm1hcmdpbnMgPSB7XG4gICAgICAgICAgICAgICAgdG9wOiAwLjAsXG4gICAgICAgICAgICAgICAgYm90dG9tOiAwLjBcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1hcmdpbnMgPSB7XG4gICAgICAgICAgICAgICAgdG9wOiBjb250cm9sbGVyLm1hcmdpbnMudG9wLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogY29udHJvbGxlci5tYXJnaW5zLmJvdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSB0aGlzLmZvbnRTaXplO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5mcm9tSFRNTCh0aGlzLmh0bWwsIHRoaXMueExlZnQsIHRoaXMueVRvcCwge1xuICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLndpZHRoLCBwYWdlc3BsaXQ6IHRydWUsXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2pzLXBkZi1oaWRkZW4taHRtbC1kaXYnKSkuZm9yRWFjaChcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVsOiBIVE1MRGl2RWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0sIHRoaXMubWFyZ2lucyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2h0bWwudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUG9pbnQgfSBmcm9tICcuLi9lbnRyaWVzL3BkZic7XG5cbmV4cG9ydCBjbGFzcyBJbWFnZUJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBwcm90ZWN0ZWQgaW1hZ2U6IHN0cmluZyxcbiAgICAgICAgcG9pbnQ6IElQb2ludCwgcHJvdGVjdGVkIG9yaWdpbmFsV2lkdGg6IG51bWJlciwgcHJvdGVjdGVkIG9yaWdpbmFsSGVpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHtcbiAgICAgICAgICAgIHhMZWZ0OiBwb2ludC54TGVmdCxcbiAgICAgICAgICAgIHhSaWdodDogcG9pbnQueExlZnQgKyAob3JpZ2luYWxXaWR0aCB8fCAwKSxcbiAgICAgICAgICAgIHlUb3A6IHBvaW50LnlUb3AsXG4gICAgICAgICAgICB5Qm90OiBwb2ludC55VG9wICsgKG9yaWdpbmFsSGVpZ2h0IHx8IDApXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlzUGFnZUJyZWFrID0gdGhpcy5vcmlnaW5hbEhlaWdodCA9PT0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MuYWRkSW1hZ2UodGhpcy5pbWFnZSwgJ1BORycsIHRoaXMueExlZnQsIHRoaXMueVRvcCwgdGhpcy5vcmlnaW5hbFdpZHRoLCB0aGlzLm9yaWdpbmFsSGVpZ2h0KTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2ltYWdlLnRzIiwiaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgTGlua0JyaWNrIGV4dGVuZHMgVGV4dEJyaWNrIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTQ0FMRV9GQUNUT1JfTUFHSUM6IG51bWJlciA9IDAuOTU1O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ09MT1I6IHN0cmluZyA9ICcjMDAwMEVFJztcbiAgICBwdWJsaWMgY29uc3RydWN0b3IodGV4dEZsYXQ6IFRleHRCcmljaywgcHJvdGVjdGVkIGxpbms6IHN0cmluZykge1xuICAgICAgICBzdXBlcigoPExpbmtCcmljaz50ZXh0RmxhdCkucXVlc3Rpb24sXG4gICAgICAgICAgICAoPExpbmtCcmljaz50ZXh0RmxhdCkuY29udHJvbGxlcixcbiAgICAgICAgICAgIHRleHRGbGF0LCAoPExpbmtCcmljaz50ZXh0RmxhdCkudGV4dCk7XG4gICAgICAgIHRoaXMudGV4dENvbG9yID0gTGlua0JyaWNrLkNPTE9SO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBvbGRUZXh0Q29sb3I6IHN0cmluZyA9IHRoaXMuY29udHJvbGxlci5kb2MuZ2V0VGV4dENvbG9yKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0VGV4dENvbG9yKFN1cnZleUhlbHBlci5CQUNLR1JPVU5EX0NPTE9SKTtcbiAgICAgICAgbGV0IGRlc2NlbnQ6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICpcbiAgICAgICAgICAgICh0aGlzLmNvbnRyb2xsZXIuZG9jLmdldExpbmVIZWlnaHRGYWN0b3IoKSAtXG4gICAgICAgICAgICAgICAgTGlua0JyaWNrLlNDQUxFX0ZBQ1RPUl9NQUdJQyk7XG4gICAgICAgIGxldCB5VG9wTGluazogbnVtYmVyID0gdGhpcy55VG9wICtcbiAgICAgICAgICAgICh0aGlzLnlCb3QgLSB0aGlzLnlUb3ApIC0gZGVzY2VudDtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy50ZXh0V2l0aExpbmsodGhpcy50ZXh0LCB0aGlzLnhMZWZ0LFxuICAgICAgICAgICAgeVRvcExpbmssIHsgdXJsOiB0aGlzLmxpbmsgfSk7XG4gICAgICAgIGF3YWl0IHN1cGVyLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0VGV4dENvbG9yKG9sZFRleHRDb2xvcik7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKFN1cnZleUhlbHBlci5nZXRSZWFkb25seVJlbmRlckFzKDxRdWVzdGlvbj50aGlzLnF1ZXN0aW9uLFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyKSAhPT0gJ3RleHQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHN1cGVyLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9saW5rLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgSVNpemUsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dCc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJhZGlvZ3JvdXBXcmFwQ29udGV4dCB7XG4gICAgcXVlc3Rpb246IElRdWVzdGlvbjtcbiAgICByZWFkT25seTogYm9vbGVhbjtcbn1cbmV4cG9ydCBjbGFzcyBSYWRpb0dyb3VwV3JhcCB7XG4gICAgcHJpdmF0ZSBfcmFkaW9Hcm91cDogYW55O1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHByaXZhdGUgY29udGV4dDogSVJhZGlvZ3JvdXBXcmFwQ29udGV4dCkge1xuICAgIH1cbiAgICBwdWJsaWMgYWRkVG9QZGYoY29sb3I6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9yYWRpb0dyb3VwID0gbmV3IHRoaXMuY29udHJvbGxlci5kb2MuQWNyb0Zvcm1SYWRpb0J1dHRvbigpO1xuICAgICAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7fTtcbiAgICAgICAgb3B0aW9ucy5maWVsZE5hbWUgPSB0aGlzLm5hbWU7XG4gICAgICAgIG9wdGlvbnMucmVhZE9ubHkgPSB0aGlzLnJlYWRPbmx5O1xuICAgICAgICBvcHRpb25zLmNvbG9yID0gY29sb3I7XG4gICAgICAgIG9wdGlvbnMuY29udGV4dCA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgKDxTdXJ2ZXlQREY+dGhpcy5jb250ZXh0LnF1ZXN0aW9uLnN1cnZleSk/LmdldFVwZGF0ZWRSYWRpb0dyb3VwV3JhcE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAuZmllbGROYW1lID0gb3B0aW9ucy5maWVsZE5hbWU7XG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAucmVhZE9ubHkgPSBvcHRpb25zLnJlYWRPbmx5O1xuICAgICAgICB0aGlzLl9yYWRpb0dyb3VwLmNvbG9yID0gb3B0aW9ucy5jb2xvcjtcblxuICAgICAgICB0aGlzLl9yYWRpb0dyb3VwLnZhbHVlID0gJyc7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MuYWRkRmllbGQodGhpcy5fcmFkaW9Hcm91cCk7XG4gICAgfVxuICAgIGdldCByYWRpb0dyb3VwKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yYWRpb0dyb3VwO1xuICAgIH1cbiAgICBnZXQgcmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQucmVhZE9ubHk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElSYWRpb0dyb3VwSXRlbUJyaWNrQ29udGV4dCB7XG4gICAgcXVlc3Rpb246IElRdWVzdGlvbjtcbiAgICBjaGVja2VkOiBib29sZWFuO1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAgaXRlbTogSXRlbVZhbHVlO1xufVxuXG5leHBvcnQgY2xhc3MgUmFkaW9JdGVtQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUkFESU9NQVJLRVJfUkVBRE9OTFlfU1lNQk9MOiBzdHJpbmcgPSAnbCc7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUkFESU9NQVJLRVJfUkVBRE9OTFlfRk9OVDogc3RyaW5nID0gJ3phcGZkaW5nYmF0cyc7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBSQURJT01BUktFUl9SRUFET05MWV9GT05UX1NJWkVfU0NBTEU6IG51bWJlciA9IDEuMCAtICgoMi4wICsgTWF0aC5FKSAvIDEwLjApO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJpdmF0ZSBjb250ZXh0OiBJUmFkaW9Hcm91cEl0ZW1Ccmlja0NvbnRleHQsXG4gICAgICAgIHByaXZhdGUgcmFkaW9Hcm91cFdyYXA6IFJhZGlvR3JvdXBXcmFwKSB7XG4gICAgICAgIHN1cGVyKGNvbnRleHQucXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLnRleHRDb2xvciA9IHRoaXMuZm9ybUJvcmRlckNvbG9yO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0U2hvdWxkUmVuZGVyUmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJhZGlvR3JvdXBXcmFwLnJlYWRPbmx5ICYmIFN1cnZleUhlbHBlci5nZXRSZWFkb25seVJlbmRlckFzKFxuICAgICAgICAgICAgPFF1ZXN0aW9uPnRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcikgIT09ICdhY3JvZm9ybScgfHwgdGhpcy5jb250cm9sbGVyLmNvbXByZXNzO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuaW5kZXggPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5yYWRpb0dyb3VwV3JhcC5hZGRUb1BkZih0aGlzLmZvcm1Cb3JkZXJDb2xvcik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9uczogYW55ID0ge307XG4gICAgICAgIG9wdGlvbnMuZmllbGROYW1lID0gdGhpcy5yYWRpb0dyb3VwV3JhcC5uYW1lICsgJ2luZGV4JyArIHRoaXMuY29udGV4dC5pbmRleDtcbiAgICAgICAgbGV0IGZvcm1TY2FsZTogbnVtYmVyID0gU3VydmV5SGVscGVyLmZvcm1TY2FsZSh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICBvcHRpb25zLlJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdCh0aGlzLCBmb3JtU2NhbGUpKTtcbiAgICAgICAgb3B0aW9ucy5jb2xvciA9IHRoaXMuZm9ybUJvcmRlckNvbG9yO1xuICAgICAgICBvcHRpb25zLmFwcGVhcmFuY2UgPSB0aGlzLmNvbnRyb2xsZXIuZG9jLkFjcm9Gb3JtLkFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ2lyY2xlO1xuICAgICAgICBvcHRpb25zLnJhZGlvR3JvdXAgPSB0aGlzLnJhZGlvR3JvdXBXcmFwLnJhZGlvR3JvdXA7XG4gICAgICAgIG9wdGlvbnMuY29udGV4dCA9IHRoaXMuY29udGV4dDtcblxuICAgICAgICAoPFN1cnZleVBERj50aGlzLmNvbnRleHQucXVlc3Rpb24uc3VydmV5KT8uZ2V0VXBkYXRlZFJhZGlvSXRlbUFjcm9mb3JtT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgbGV0IHJhZGlvQnV0dG9uOiBhbnkgPSB0aGlzLnJhZGlvR3JvdXBXcmFwLnJhZGlvR3JvdXAuY3JlYXRlT3B0aW9uKG9wdGlvbnMuZmllbGROYW1lKTtcblxuICAgICAgICBpZiAodGhpcy5jb250ZXh0LmNoZWNrZWQpIHtcbiAgICAgICAgICAgIGlmKCFvcHRpb25zLkFTKSB7XG4gICAgICAgICAgICAgICAgcmFkaW9CdXR0b24uQVMgPSAnLycgKyBvcHRpb25zLmZpZWxkTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKCF0aGlzLnJhZGlvR3JvdXBXcmFwLnJhZGlvR3JvdXAudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJhZGlvR3JvdXBXcmFwLnJhZGlvR3JvdXAudmFsdWUgPSBvcHRpb25zLmZpZWxkTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmKCFvcHRpb25zLkFTKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5BUyA9ICcvT2ZmJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByYWRpb0J1dHRvbi5SZWN0ID0gb3B0aW9ucy5SZWN0O1xuICAgICAgICByYWRpb0J1dHRvbi5jb2xvciA9IG9wdGlvbnMuY29sb3I7XG5cbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIHRoaXMucmFkaW9Hcm91cFdyYXAucmFkaW9Hcm91cC5zZXRBcHBlYXJhbmNlKFxuICAgICAgICAgICAgb3B0aW9ucy5hcHBlYXJhbmNlXG4gICAgICAgICk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuY2hlY2tlZCkge1xuICAgICAgICAgICAgY29uc3QgcmFkaW9tYXJrZXJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHRoaXMsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgY29uc3Qgb2xkRm9udFNpemU6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgICAgIGNvbnN0IG9sZEZvbnROYW1lOiBzdHJpbmcgPSB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWU7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWUgPSBSYWRpb0l0ZW1Ccmljay5SQURJT01BUktFUl9SRUFET05MWV9GT05UO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKlxuICAgICAgICAgICAgICAgIFJhZGlvSXRlbUJyaWNrLlJBRElPTUFSS0VSX1JFQURPTkxZX0ZPTlRfU0laRV9TQ0FMRTtcbiAgICAgICAgICAgIGxldCByYWRpb21hcmtlclNpemU6IElTaXplID0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFxuICAgICAgICAgICAgICAgIFJhZGlvSXRlbUJyaWNrLlJBRElPTUFSS0VSX1JFQURPTkxZX1NZTUJPTCk7XG4gICAgICAgICAgICByYWRpb21hcmtlclBvaW50LnhMZWZ0ICs9IHRoaXMud2lkdGggLyAyLjAgLSByYWRpb21hcmtlclNpemUud2lkdGggLyAyLjA7XG4gICAgICAgICAgICByYWRpb21hcmtlclBvaW50LnlUb3AgKz0gdGhpcy5oZWlnaHQgLyAyLjAgLSByYWRpb21hcmtlclNpemUuaGVpZ2h0IC8gMi4wO1xuICAgICAgICAgICAgbGV0IHJhZGlvbWFya2VyRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgICAgIHJhZGlvbWFya2VyUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICBSYWRpb0l0ZW1Ccmljay5SQURJT01BUktFUl9SRUFET05MWV9TWU1CT0wsIFRleHRCcmljayk7XG4gICAgICAgICAgICAoPGFueT5yYWRpb21hcmtlckZsYXQudW5mb2xkKClbMF0pLnRleHRDb2xvciA9IHRoaXMudGV4dENvbG9yO1xuICAgICAgICAgICAgYXdhaXQgcmFkaW9tYXJrZXJGbGF0LnJlbmRlcigpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWUgPSBvbGRGb250TmFtZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfcmFkaW9pdGVtLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvblJhbmtpbmdNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBJU2l6ZSwgRG9jQ29udHJvbGxlciwgSVBvaW50IH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4vcGRmX3RleHQnO1xuaW1wb3J0IHsgQ2hlY2tJdGVtQnJpY2sgfSBmcm9tICcuL3BkZl9jaGVja2l0ZW0nO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBSYW5raW5nSXRlbUJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25SYW5raW5nTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcm90ZWN0ZWQgbWFyazogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblJhbmtpbmdNb2RlbD5xdWVzdGlvbjtcbiAgICAgICAgdGhpcy50ZXh0Q29sb3IgPSB0aGlzLmZvcm1Cb3JkZXJDb2xvcjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICAgICAgY29uc3QgbWFya1BvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQodGhpcywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplICpcbiAgICAgICAgICAgIENoZWNrSXRlbUJyaWNrLkNIRUNLTUFSS19SRUFET05MWV9GT05UX1NJWkVfU0NBTEU7XG4gICAgICAgIGNvbnN0IG1hcmtTaXplOiBJU2l6ZSA9IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dCh0aGlzLm1hcmspO1xuICAgICAgICBtYXJrUG9pbnQueExlZnQgKz0gdGhpcy53aWR0aCAvIDIuMCAtIG1hcmtTaXplLndpZHRoIC8gMi4wO1xuICAgICAgICBtYXJrUG9pbnQueVRvcCArPSB0aGlzLmhlaWdodCAvIDIuMCAtIG1hcmtTaXplLmhlaWdodCAvIDIuMDtcbiAgICAgICAgY29uc3QgbWFya0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIG1hcmtQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0aGlzLm1hcmssIFRleHRCcmljayk7XG4gICAgICAgICg8YW55Pm1hcmtGbGF0LnVuZm9sZCgpWzBdKS50ZXh0Q29sb3IgPSB0aGlzLnRleHRDb2xvcjtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgIGF3YWl0IG1hcmtGbGF0LnJlbmRlcigpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfcmFua2luZ2l0ZW0udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uVGV4dE1vZGVsLCBzZXR0aW5ncyB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljaywgVHJhbnNsYXRlWEZ1bmN0aW9uIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4vcGRmX2NvbXBvc2l0ZSc7XG5cbmV4cG9ydCBjbGFzcyBUZXh0RmllbGRCcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uVGV4dE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJvdGVjdGVkIGlzUXVlc3Rpb246IGJvb2xlYW4sXG4gICAgICAgIHByb3RlY3RlZCBmaWVsZE5hbWU6IHN0cmluZywgcHJvdGVjdGVkIHZhbHVlOiBzdHJpbmcsXG4gICAgICAgIHByb3RlY3RlZCBwbGFjZWhvbGRlcjogc3RyaW5nLCBwdWJsaWMgaXNSZWFkT25seTogYm9vbGVhbixcbiAgICAgICAgcHJvdGVjdGVkIGlzTXVsdGlsaW5lOiBib29sZWFuLCBwcm90ZWN0ZWQgaW5wdXRUeXBlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uVGV4dE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcml2YXRlIHJlbmRlckNvbG9yUXVlc3Rpb24oKTogdm9pZCB7XG4gICAgICAgIGxldCBvbGRGaWxsQ29sb3I6IHN0cmluZyA9IHRoaXMuY29udHJvbGxlci5kb2MuZ2V0RmlsbENvbG9yKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0RmlsbENvbG9yKHRoaXMucXVlc3Rpb24udmFsdWUgfHwgJ2JsYWNrJyk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MucmVjdCh0aGlzLnhMZWZ0LCB0aGlzLnlUb3AsXG4gICAgICAgICAgICB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgJ0YnKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRGaWxsQ29sb3Iob2xkRmlsbENvbG9yKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyQ29sb3JRdWVzdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0RmllbGQ6IGFueSA9IHRoaXMuaW5wdXRUeXBlID09PSAncGFzc3dvcmQnID9cbiAgICAgICAgICAgIG5ldyAoPGFueT50aGlzLmNvbnRyb2xsZXIuZG9jLkFjcm9Gb3JtUGFzc3dvcmRGaWVsZCkoKSA6XG4gICAgICAgICAgICBuZXcgKDxhbnk+dGhpcy5jb250cm9sbGVyLmRvYy5BY3JvRm9ybVRleHRGaWVsZCkoKTtcbiAgICAgICAgaW5wdXRGaWVsZC5maWVsZE5hbWUgPSB0aGlzLmZpZWxkTmFtZTtcbiAgICAgICAgaW5wdXRGaWVsZC5mb250TmFtZSA9IHRoaXMuY29udHJvbGxlci5mb250TmFtZTtcbiAgICAgICAgaW5wdXRGaWVsZC5mb250U2l6ZSA9IHRoaXMuZm9udFNpemU7XG4gICAgICAgIGlucHV0RmllbGQuaXNVbmljb2RlID0gU3VydmV5SGVscGVyLmlzQ3VzdG9tRm9udChcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgaW5wdXRGaWVsZC5mb250TmFtZSk7XG4gICAgICAgIGlmICh0aGlzLmlucHV0VHlwZSAhPT0gJ3Bhc3N3b3JkJykge1xuICAgICAgICAgICAgaW5wdXRGaWVsZC5WID0gJyAnICsgdGhpcy5nZXRDb3JyZWN0ZWRUZXh0KHRoaXMudmFsdWUpO1xuICAgICAgICAgICAgaW5wdXRGaWVsZC5EViA9ICcgJyArIHRoaXMuZ2V0Q29ycmVjdGVkVGV4dCh0aGlzLnBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlucHV0RmllbGQudmFsdWUgPSAnJztcbiAgICAgICAgaW5wdXRGaWVsZC5tdWx0aWxpbmUgPSB0aGlzLmlzTXVsdGlsaW5lO1xuICAgICAgICBpbnB1dEZpZWxkLnJlYWRPbmx5ID0gdGhpcy5pc1JlYWRPbmx5O1xuICAgICAgICBpbnB1dEZpZWxkLmNvbG9yID0gdGhpcy50ZXh0Q29sb3I7XG4gICAgICAgIGxldCBmb3JtU2NhbGU6IG51bWJlciA9IFN1cnZleUhlbHBlci5mb3JtU2NhbGUodGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICAgICAgaW5wdXRGaWVsZC5tYXhGb250U2l6ZSA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZSAqIGZvcm1TY2FsZTtcbiAgICAgICAgaW5wdXRGaWVsZC5SZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZUFjcm9mb3JtUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QodGhpcywgZm9ybVNjYWxlKSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MuYWRkRmllbGQoaW5wdXRGaWVsZCk7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2hvdWxkUmVuZGVyRmxhdEJvcmRlcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBzZXR0aW5ncy5yZWFkT25seVRleHRSZW5kZXJNb2RlID09PSAnaW5wdXQnO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0U2hvdWxkUmVuZGVyUmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBTdXJ2ZXlIZWxwZXIuc2hvdWxkUmVuZGVyUmVhZE9ubHkodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0aGlzLmlzUmVhZE9ubHkpO1xuICAgIH1cbiAgICBwcml2YXRlIF90ZXh0QnJpY2s6IElQZGZCcmljaztcbiAgICBwdWJsaWMgZ2V0IHRleHRCcmljaygpOiBJUGRmQnJpY2sge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGV4dEJyaWNrO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IHRleHRCcmljayh2YWw6IElQZGZCcmljaykge1xuICAgICAgICB0aGlzLl90ZXh0QnJpY2sgPSB2YWw7XG4gICAgICAgIGNvbnN0IHVuRm9sZGVkQnJpY2tzID0gdmFsLnVuZm9sZCgpO1xuICAgICAgICBjb25zdCBicmlja3NDb3VudCA9IHVuRm9sZGVkQnJpY2tzLmxlbmd0aDtcbiAgICAgICAgbGV0IHJlbmRlcmVkQnJpY2tzQ291bnQgPSAwO1xuICAgICAgICBjb25zdCBicmlja3NCeVBhZ2U6IHsgW2luZGV4OiBudW1iZXJdOiBBcnJheTxQZGZCcmljaz4gfSA9IHt9O1xuICAgICAgICBjb25zdCBhZnRlclJlbmRlclRleHRCcmlja0NhbGxiYWNrID0gKGJyaWNrOiBQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgaWYodGhpcy5zaG91bGRSZW5kZXJGbGF0Qm9yZGVycygpKSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyZWRCcmlja3NDb3VudCsrO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlTnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmdldEN1cnJlbnRQYWdlSW5kZXgoKTtcbiAgICAgICAgICAgICAgICBpZighYnJpY2tzQnlQYWdlW2N1cnJlbnRQYWdlTnVtYmVyXSkge1xuICAgICAgICAgICAgICAgICAgICBicmlja3NCeVBhZ2VbY3VycmVudFBhZ2VOdW1iZXJdID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyaWNrc0J5UGFnZVtjdXJyZW50UGFnZU51bWJlcl0ucHVzaChicmljayk7XG4gICAgICAgICAgICAgICAgaWYocmVuZGVyZWRCcmlja3NDb3VudCA+PSBicmlja3NDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYnJpY2tzQnlQYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyZWRPbk9uZVBhZ2UgPSBrZXlzLmxlbmd0aCA9PSAxO1xuICAgICAgICAgICAgICAgICAgICBrZXlzLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJpY2tzQnlQYWdlW2tleSBhcyBhbnldLmZvckVhY2goKGJyaWNrOiBQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUJyaWNrLmFkZEJyaWNrKGJyaWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFkZGluZyA9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLlZBTFVFX1JFQURPTkxZX1BBRERJTkdfU0NBTEU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib3JkZXJSZWN0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhMZWZ0OiB0aGlzLnhMZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhSaWdodDogdGhpcy54UmlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeVRvcDogcmVuZGVyZWRPbk9uZVBhZ2UgPyB0aGlzLnlUb3AgOiBjb21wb3NpdGVCcmljay55VG9wIC0gcGFkZGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5Qm90OiByZW5kZXJlZE9uT25lUGFnZSA/IHRoaXMueUJvdCA6IGNvbXBvc2l0ZUJyaWNrLnlCb3QgKyBwYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogcmVuZGVyZWRPbk9uZVBhZ2UgPyB0aGlzLmhlaWdodCA6IGNvbXBvc2l0ZUJyaWNrLmhlaWdodCArIDIgKiBwYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Cb3JkZXJDb2xvcjogdGhpcy5mb3JtQm9yZGVyQ29sb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnNldFBhZ2UoTnVtYmVyKGtleSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgYm9yZGVyUmVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuc2V0UGFnZShjdXJyZW50UGFnZU51bWJlcik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdW5Gb2xkZWRCcmlja3MuZm9yRWFjaCgoYnJpY2s6IFBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICBicmljay5hZnRlclJlbmRlckNhbGxiYWNrID0gYWZ0ZXJSZW5kZXJUZXh0QnJpY2tDYWxsYmFjay5iaW5kKHRoaXMsIGJyaWNrKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKHRoaXMueExlZnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHRoaXMueFJpZ2h0KTtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRUeXBlID09PSAnY29sb3InKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckNvbG9yUXVlc3Rpb24oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudGV4dEJyaWNrLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgfVxuICAgIHB1YmxpYyB1bmZvbGQoKTogSVBkZkJyaWNrW10ge1xuICAgICAgICBpZiAodGhpcy5nZXRTaG91bGRSZW5kZXJSZWFkT25seSgpICYmIHRoaXMuaW5wdXRUeXBlICE9PSAnY29sb3InKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50ZXh0QnJpY2sudW5mb2xkKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIudW5mb2xkKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIHRyYW5zbGF0ZVgoZnVuYzogVHJhbnNsYXRlWEZ1bmN0aW9uKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGZ1bmModGhpcy54TGVmdCwgdGhpcy54UmlnaHQpO1xuICAgICAgICB0aGlzLl94TGVmdCA9IHJlcy54TGVmdDtcbiAgICAgICAgdGhpcy5feFJpZ2h0ID0gcmVzLnhSaWdodDtcbiAgICAgICAgaWYodGhpcy50ZXh0QnJpY2spIHtcbiAgICAgICAgICAgIHRoaXMudGV4dEJyaWNrLnRyYW5zbGF0ZVgoZnVuYyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIHNldFhMZWZ0KHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gdmFsIC0gdGhpcy5feExlZnQ7XG4gICAgICAgIHN1cGVyLnNldFhMZWZ0KHZhbCk7XG4gICAgICAgIGlmKHRoaXMudGV4dEJyaWNrKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRCcmljay54TGVmdCA9IHRoaXMudGV4dEJyaWNrLnhMZWZ0ICsgZGVsdGE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIHNldFhSaWdodCh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBkZWx0YSA9IHZhbCAtIHRoaXMuX3hSaWdodDtcbiAgICAgICAgc3VwZXIuc2V0WFJpZ2h0KHZhbCk7XG4gICAgICAgIGlmKHRoaXMudGV4dEJyaWNrKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRCcmljay54UmlnaHQgPSB0aGlzLnRleHRCcmljay54UmlnaHQgKyBkZWx0YTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2V0WVRvcCh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBkZWx0YSA9IHZhbCAtIHRoaXMuX3lUb3A7XG4gICAgICAgIHN1cGVyLnNldFlUb3AodmFsKTtcbiAgICAgICAgaWYodGhpcy50ZXh0QnJpY2spIHtcbiAgICAgICAgICAgIHRoaXMudGV4dEJyaWNrLnlUb3AgPSB0aGlzLnRleHRCcmljay55VG9wICsgZGVsdGE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIHNldFlCb3R0b20odmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGVsdGEgPSB2YWwgLSB0aGlzLl95Qm90O1xuICAgICAgICBzdXBlci5zZXRZQm90dG9tKHZhbCk7XG4gICAgICAgIGlmKHRoaXMudGV4dEJyaWNrKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRCcmljay55Qm90ID0gdGhpcy50ZXh0QnJpY2sueUJvdCArIGRlbHRhO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0ZmllbGQudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uVGV4dE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBUZXh0Qm9sZEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dGJvbGQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBUaXRsZVBhbmVsQnJpY2sgZXh0ZW5kcyBUZXh0Qm9sZEJyaWNrIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uVGV4dE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCB0ZXh0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgb2xkRm9udFNpemUgPSB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplICogU3VydmV5SGVscGVyLlRJVExFX1BBTkVMX0ZPTlRfU0laRV9TQ0FMRTtcbiAgICAgICAgYXdhaXQgc3VwZXIucmVuZGVySW50ZXJhY3RpdmUoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl90aXRsZXBhbmVsLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBQYW5lbE1vZGVsLCBQYWdlTW9kZWwsIFF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuXG5leHBvcnQgY2xhc3MgQWRvcm5lcnNCYXNlT3B0aW9ucyB7XG4gICAgcHVibGljIHBvaW50OiBJUG9pbnQ7XG4gICAgcHVibGljIGJyaWNrczogSVBkZkJyaWNrW107XG4gICAgcHVibGljIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXI7XG4gICAgcHVibGljIHJlcG9zaXRvcnk6IEZsYXRSZXBvc2l0b3J5O1xuICAgIHB1YmxpYyBtb2R1bGU6IGFueTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwb2ludDogSVBvaW50LCBicmlja3M6IElQZGZCcmlja1tdLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZXBvc2l0b3J5OiBGbGF0UmVwb3NpdG9yeSwgbW9kdWxlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5wb2ludCA9IHBvaW50O1xuICAgICAgICB0aGlzLmJyaWNrcyA9IGJyaWNrcztcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICAgICAgdGhpcy5yZXBvc2l0b3J5ID0gcmVwb3NpdG9yeTtcbiAgICAgICAgdGhpcy5tb2R1bGUgPSBtb2R1bGU7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEFkb3JuZXJzT3B0aW9ucyBleHRlbmRzIEFkb3JuZXJzQmFzZU9wdGlvbnMge1xuICAgIHB1YmxpYyBxdWVzdGlvbjogUXVlc3Rpb247XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBvaW50OiBJUG9pbnQsIGJyaWNrczogSVBkZkJyaWNrW10sXG4gICAgICAgIHF1ZXN0aW9uOiBRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVwb3NpdG9yeTogRmxhdFJlcG9zaXRvcnksIG1vZHVsZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHBvaW50LCBicmlja3MsIGNvbnRyb2xsZXIsIHJlcG9zaXRvcnksIG1vZHVsZSk7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQWRvcm5lcnNQYW5lbE9wdGlvbnMgZXh0ZW5kcyBBZG9ybmVyc0Jhc2VPcHRpb25zIHtcbiAgICBwdWJsaWMgcGFuZWw6IFBhbmVsTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBvaW50OiBJUG9pbnQsIGJyaWNrczogSVBkZkJyaWNrW10sXG4gICAgICAgIHBhbmVsOiBQYW5lbE1vZGVsLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZXBvc2l0b3J5OiBGbGF0UmVwb3NpdG9yeSwgbW9kdWxlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocG9pbnQsIGJyaWNrcywgY29udHJvbGxlciwgcmVwb3NpdG9yeSwgbW9kdWxlKTtcbiAgICAgICAgdGhpcy5wYW5lbCA9IHBhbmVsO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFkb3JuZXJzUGFnZU9wdGlvbnMgZXh0ZW5kcyBBZG9ybmVyc0Jhc2VPcHRpb25zIHtcbiAgICBwdWJsaWMgcGFnZTogUGFnZU1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwb2ludDogSVBvaW50LCBicmlja3M6IElQZGZCcmlja1tdLFxuICAgICAgICBwYWdlOiBQYWdlTW9kZWwsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlcG9zaXRvcnk6IEZsYXRSZXBvc2l0b3J5LCBtb2R1bGU6IGFueSkge1xuICAgICAgICBzdXBlcihwb2ludCwgYnJpY2tzLCBjb250cm9sbGVyLCByZXBvc2l0b3J5LCBtb2R1bGUpO1xuICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIH1cbn1cblxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgTG9jYWxpemFibGVTdHJpbmcsIFF1ZXN0aW9uQm9vbGVhbk1vZGVsLCBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbCwgU3VydmV5TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBCb29sZWFuSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYm9vbGVhbml0ZW0nO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBGbGF0UmFkaW9ncm91cCB9IGZyb20gJy4vZmxhdF9yYWRpb2dyb3VwJztcblxuZXhwb3J0IGNsYXNzIEZsYXRCb29sZWFuQ2hlY2tib3ggZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25Cb29sZWFuTW9kZWw7XG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBuZXcgQm9vbGVhbkl0ZW1Ccmljayh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdChTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChwb2ludCwgaGVpZ2h0LCBoZWlnaHQpLFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuU0VMRUNUX0lURU1fRkxBVF9TQ0FMRSksIHBvaW50LnhMZWZ0KSk7XG4gICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICBjb25zdCB0ZXh0UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIHRleHRQb2ludC54TGVmdCA9IGl0ZW1GbGF0LnhSaWdodCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fSVRFTV9URVhUO1xuICAgICAgICBjb25zdCBsb2NMYWJlbFRleHQ6IExvY2FsaXphYmxlU3RyaW5nID0gdGhpcy5xdWVzdGlvbi5pc0luZGV0ZXJtaW5hdGUgPyBudWxsIDpcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uY2hlY2tlZFZhbHVlID8gdGhpcy5xdWVzdGlvbi5sb2NMYWJlbFRydWUgOiB0aGlzLnF1ZXN0aW9uLmxvY0xhYmVsRmFsc2U7XG4gICAgICAgIGlmIChsb2NMYWJlbFRleHQgIT09IG51bGwgJiYgbG9jTGFiZWxUZXh0LnJlbmRlcmVkSHRtbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgdGV4dFBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGxvY0xhYmVsVGV4dCwgVGV4dEJyaWNrKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtjb21wb3NpdGVGbGF0XTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgRmxhdEJvb2xlYW4gZXh0ZW5kcyBGbGF0UmFkaW9ncm91cCB7XG4gICAgcHJpdmF0ZSBpdGVtczogQXJyYXk8SXRlbVZhbHVlPjtcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLmJ1aWxkSXRlbXMoKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBidWlsZEl0ZW1zKCkge1xuICAgICAgICBjb25zdCBxdWVzdGlvbiA9IDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD4oPGFueT50aGlzLnF1ZXN0aW9uKTtcbiAgICAgICAgY29uc3QgZmFsc2VDaG9pY2UgPSBuZXcgSXRlbVZhbHVlKCg8UXVlc3Rpb25Cb29sZWFuTW9kZWw+cXVlc3Rpb24pLnZhbHVlRmFsc2UgIT09IHVuZGVmaW5lZCA/ICg8UXVlc3Rpb25Cb29sZWFuTW9kZWw+cXVlc3Rpb24pLnZhbHVlRmFsc2UgOiBmYWxzZSk7XG4gICAgICAgIGNvbnN0IHRydWVDaG9pY2UgPSBuZXcgSXRlbVZhbHVlKCg8UXVlc3Rpb25Cb29sZWFuTW9kZWw+cXVlc3Rpb24pLnZhbHVlVHJ1ZSAhPT0gdW5kZWZpbmVkID8gKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikudmFsdWVUcnVlIDogdHJ1ZSk7XG4gICAgICAgIGZhbHNlQ2hvaWNlLmxvY093bmVyID0gcXVlc3Rpb247XG4gICAgICAgIGZhbHNlQ2hvaWNlLnNldExvY1RleHQoKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikubG9jTGFiZWxGYWxzZSk7XG4gICAgICAgIHRydWVDaG9pY2UubG9jT3duZXIgPSBxdWVzdGlvbjtcbiAgICAgICAgdHJ1ZUNob2ljZS5zZXRMb2NUZXh0KCg8UXVlc3Rpb25Cb29sZWFuTW9kZWw+cXVlc3Rpb24pLmxvY0xhYmVsVHJ1ZSk7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBbZmFsc2VDaG9pY2UsIHRydWVDaG9pY2VdO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0VmlzaWJsZUNob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1zO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0Q29sQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdib29sZWFuJywgRmxhdEJvb2xlYW4pO1xuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignYm9vbGVhbi1jaGVja2JveCcsIEZsYXRCb29sZWFuQ2hlY2tib3gpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfYm9vbGVhbi50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBRdWVzdGlvbkNoZWNrYm94TW9kZWwsIFF1ZXN0aW9uVGFnYm94TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0U2VsZWN0QmFzZSB9IGZyb20gJy4vZmxhdF9zZWxlY3RiYXNlJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgQ2hlY2tib3hJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jaGVja2JveGl0ZW0nO1xuXG5leHBvcnQgY2xhc3MgRmxhdENoZWNrYm94IGV4dGVuZHMgRmxhdFNlbGVjdEJhc2Uge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25DaGVja2JveE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uQ2hlY2tib3hNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGdlbmVyYXRlRmxhdEl0ZW0ocmVjdDogSVJlY3QsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IElQZGZCcmljayB7XG4gICAgICAgIHJldHVybiBuZXcgQ2hlY2tib3hJdGVtQnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCByZWN0LCBpdGVtLCBpbmRleCk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEZsYXRUYWdib3ggZXh0ZW5kcyBGbGF0Q2hlY2tib3gge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25UYWdib3hNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblRhZ2JveE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0VmlzaWJsZUNob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgICAgIGlmKHRoaXMuY29udHJvbGxlci50YWdib3hTZWxlY3RlZENob2ljZXNPbmx5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5zZWxlY3RlZENob2ljZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VmlzaWJsZUNob2ljZXMoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ3RhZ2JveCcsIEZsYXRUYWdib3gpO1xuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignY2hlY2tib3gnLCBGbGF0Q2hlY2tib3gpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2NoZWNrYm94LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkNvbW1lbnRNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRDb21tZW50IGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uQ29tbWVudE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uQ29tbWVudE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgcmV0dXJuIFthd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQ29tbWVudEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0cnVlLCB7IHJvd3M6IHRoaXMucXVlc3Rpb24ucm93cyB9KV07XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdjb21tZW50JywgRmxhdENvbW1lbnQpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2NvbW1lbnQudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uQ3VzdG9tTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuXG5leHBvcnQgY2xhc3MgRmxhdEN1c3RvbU1vZGVsIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgZmxhdCA9IEZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlKHRoaXMuc3VydmV5LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24uZ2V0VHlwZSgpKTtcbiAgICAgICAgcmV0dXJuIGZsYXQuZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQpO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignY3VzdG9tX21vZGVsJywgRmxhdEN1c3RvbU1vZGVsKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9jdXN0b21fbW9kZWwudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgRHJvcGRvd25CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2Ryb3Bkb3duJztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdERyb3Bkb3duIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkRyb3Bkb3duTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCB2YWx1ZUJyaWNrID0gIXRoaXMuc2hvdWxkUmVuZGVyQXNDb21tZW50ID8gbmV3IERyb3Bkb3duQnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZpZWxkUmVjdChwb2ludCwgdGhpcy5jb250cm9sbGVyKSkgOiBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQ29tbWVudEZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdHJ1ZSwgeyB2YWx1ZTogU3VydmV5SGVscGVyLmdldERyb3Bkb3duUXVlc3Rpb25WYWx1ZSh0aGlzLnF1ZXN0aW9uKSB9KTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2sodmFsdWVCcmljayk7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmlzT3RoZXJTZWxlY3RlZCkge1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgb3RoZXJQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChcbiAgICAgICAgICAgICAgICBvdGhlclBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGZhbHNlLCB7IHJvd3M6IFN1cnZleUhlbHBlci5PVEhFUl9ST1dTX0NPVU5UIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUZsYXRdO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignZHJvcGRvd24nLCBGbGF0RHJvcGRvd24pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2Ryb3Bkb3duLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEZpZWxkQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0ZmllbGQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0RXhwcmVzc2lvbiBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgcmV0dXJuIFthd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQ29tbWVudEZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdHJ1ZSwgeyB2YWx1ZTogdGhpcy5xdWVzdGlvbi5kaXNwbGF5VmFsdWUsIHJlYWRPbmx5OiB0cnVlIH0pXTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2V4cHJlc3Npb24nLCBGbGF0RXhwcmVzc2lvbik7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfZXhwcmVzc2lvbi50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25GaWxlTW9kZWwsIHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElTaXplLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRGaWxlIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IElNQUdFX0dBUF9TQ0FMRTogbnVtYmVyID0gMC4xOTU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBURVhUX01JTl9TQ0FMRTogbnVtYmVyID0gNS4wO1xuICAgIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9JTUFHRV9GSVQ6IHN0cmluZyA9ICdjb250YWluJztcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uRmlsZU1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25GaWxlTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0SXRlbShwb2ludDogSVBvaW50LCBpdGVtOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGltYWdlU2l6ZT86IElTaXplLFxuICAgIH0pOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlTGlua0ZsYXQoXG4gICAgICAgICAgICBwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLm5hbWUgPT09IHVuZGVmaW5lZCA/ICdpbWFnZScgOiBpdGVtLm5hbWUsIGl0ZW0uY29udGVudCkpO1xuICAgICAgICBpZiAoU3VydmV5SGVscGVyLmNhblByZXZpZXdJbWFnZSh0aGlzLnF1ZXN0aW9uLCBpdGVtLCBpdGVtLmNvbnRlbnQpKSB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZVBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICBpbWFnZVBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0RmlsZS5JTUFHRV9HQVBfU0NBTEU7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQoaW1hZ2VQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB7IGxpbms6IGl0ZW0uY29udGVudCwgd2lkdGg6IGl0ZW0uaW1hZ2VTaXplLndpZHRoLCBoZWlnaHQ6IGl0ZW0uaW1hZ2VTaXplLmhlaWdodCwgb2JqZWN0Rml0OiBGbGF0RmlsZS5ERUZBVUxUX0lNQUdFX0ZJVCB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHByaXZhdGUgYWRkTGluZShyb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10sIGN1cnJQb2ludDogSVBvaW50LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmIChpbmRleCAhPT0gdGhpcy5xdWVzdGlvbi5wcmV2aWV3VmFsdWUubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoY3VyclBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2gobmV3IENvbXBvc2l0ZUJyaWNrKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRJbWFnZVByZXZpZXdDb250ZW50V2lkdGgoaXRlbTogeyBuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBpbWFnZVNpemU/OiBJU2l6ZSB9KSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChpdGVtLmltYWdlU2l6ZS53aWR0aCwgRmxhdEZpbGUuVEVYVF9NSU5fU0NBTEUgKiB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLnByZXZpZXdWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KHBvaW50LCB0aGlzLnF1ZXN0aW9uLFxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi5ub0ZpbGVDaG9zZW5DYXB0aW9uLCBUZXh0QnJpY2spXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10gPSBbbmV3IENvbXBvc2l0ZUJyaWNrKCldO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGxldCB5Qm90OiBudW1iZXIgPSBjdXJyUG9pbnQueVRvcDtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb24ucHJldmlld1ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgaXRlbTogeyBuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBpbWFnZVNpemU/OiBJU2l6ZSB9ID0geyAuLi50aGlzLnF1ZXN0aW9uLnByZXZpZXdWYWx1ZVtpXSB9O1xuICAgICAgICAgICAgY29uc3QgY2FuUHJldmlld0ltYWdlID0gU3VydmV5SGVscGVyLmNhblByZXZpZXdJbWFnZSh0aGlzLnF1ZXN0aW9uLCBpdGVtLCBpdGVtLmNvbnRlbnQpO1xuICAgICAgICAgICAgaWYgKGNhblByZXZpZXdJbWFnZSkge1xuICAgICAgICAgICAgICAgIGl0ZW0uaW1hZ2VTaXplID0gYXdhaXQgU3VydmV5SGVscGVyLmdldENvcnJlY3RlZEltYWdlU2l6ZSh0aGlzLmNvbnRyb2xsZXIsIHsgaW1hZ2VXaWR0aDogdGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoLCBpbWFnZUhlaWdodDogdGhpcy5xdWVzdGlvbi5pbWFnZUhlaWdodCwgaW1hZ2VMaW5rOiB0aGlzLnF1ZXN0aW9uLnByZXZpZXdWYWx1ZVtpXS5jb250ZW50LCBkZWZhdWx0SW1hZ2VXaWR0aDogMjAwLCBkZWZhdWx0SW1hZ2VIZWlnaHQ6IDE1MCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgLSBjdXJyUG9pbnQueExlZnQ7XG4gICAgICAgICAgICBpZiAoY2FuUHJldmlld0ltYWdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9zaXRlV2lkdGggPSBhd2FpdCB0aGlzLmdldEltYWdlUHJldmlld0NvbnRlbnRXaWR0aChpdGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlV2lkdGggPCBjb21wb3NpdGVXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBwb2ludC54TGVmdDtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSB5Qm90O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZExpbmUocm93c0ZsYXRzLCBjdXJyUG9pbnQsIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoY3VyclBvaW50LnhMZWZ0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGN1cnJQb2ludC54TGVmdCAtIGNvbXBvc2l0ZVdpZHRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKGN1cnJQb2ludCwgaXRlbSk7XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IGl0ZW1GbGF0LndpZHRoO1xuICAgICAgICAgICAgICAgIHlCb3QgPSBNYXRoLm1heCh5Qm90LCBpdGVtRmxhdC55Qm90KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZVdpZHRoIDwgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBwb2ludC54TGVmdDtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSB5Qm90O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZExpbmUocm93c0ZsYXRzLCBjdXJyUG9pbnQsIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKGN1cnJQb2ludCwgaXRlbSk7XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IGl0ZW1GbGF0LnhSaWdodCAtIGl0ZW1GbGF0LnhMZWZ0O1xuICAgICAgICAgICAgICAgIHlCb3QgPSBNYXRoLm1heCh5Qm90LCBpdGVtRmxhdC55Qm90KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzRmxhdHM7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdmaWxlJywgRmxhdEZpbGUpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2ZpbGUudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uSHRtbE1vZGVsLCBTZXJpYWxpemVyIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgRW1wdHlCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2VtcHR5JztcblxuZXhwb3J0IHR5cGUgSUhUTUxSZW5kZXJUeXBlID0gJ2F1dG8nIHwgJ3N0YW5kYXJkJyB8ICdpbWFnZSc7XG5leHBvcnQgY2xhc3MgRmxhdEhUTUwgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25IdG1sTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBjaG9vc2VSZW5kZXIoaHRtbDogc3RyaW5nKTogSUhUTUxSZW5kZXJUeXBlIHtcbiAgICAgICAgaWYgKC88W14+XSpzdHlsZVtePF0qPi8udGVzdChodG1sKSB8fFxuICAgICAgICAgICAgLzxbXj5dKnRhYmxlW148XSo+Ly50ZXN0KGh0bWwpIHx8XG4gICAgICAgICAgICAvJlxcdys7Ly50ZXN0KGh0bWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2ltYWdlJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ3N0YW5kYXJkJztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb3JyZWN0SHRtbFJ1bGVzOiBbeyBzZWFyY2hSZWdFeHA6IFJlZ0V4cCwgcmVwbGFjZVN0cmluZzogc3RyaW5nIH1dID0gW1xuICAgICAgICB7IHNlYXJjaFJlZ0V4cDogLyg8XFwvP2JyXFxzKj9cXC8/XFxzKj8+XFxzKil7Mix9L2csIHJlcGxhY2VTdHJpbmc6ICc8YnI+JyB9XG4gICAgXVxuICAgIHByb3RlY3RlZCBjb3JyZWN0SHRtbChodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBGbGF0SFRNTC5jb3JyZWN0SHRtbFJ1bGVzLmZvckVhY2goKHJ1bGUpID0+IHtcbiAgICAgICAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2UocnVsZS5zZWFyY2hSZWdFeHAsIHJ1bGUucmVwbGFjZVN0cmluZyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGxldCByZW5kZXJBczogSUhUTUxSZW5kZXJUeXBlID0gPElIVE1MUmVuZGVyVHlwZT50aGlzLnF1ZXN0aW9uLnJlbmRlckFzO1xuICAgICAgICBpZighU3VydmV5SGVscGVyLmhhc0RvY3VtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBFbXB0eUJyaWNrKFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LCAwLCAwKSldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZW5kZXJBcyA9PT0gJ2F1dG8nKSByZW5kZXJBcyA9IHRoaXMuY29udHJvbGxlci5odG1sUmVuZGVyQXM7XG4gICAgICAgIGlmIChyZW5kZXJBcyA9PT0gJ2F1dG8nKSByZW5kZXJBcyA9IHRoaXMuY2hvb3NlUmVuZGVyKFN1cnZleUhlbHBlci5nZXRMb2NTdHJpbmcodGhpcy5xdWVzdGlvbi5sb2NIdG1sKSk7XG4gICAgICAgIGNvbnN0IGh0bWw6IHN0cmluZyA9IFN1cnZleUhlbHBlci5jcmVhdGVIdG1sQ29udGFpbmVyQmxvY2soU3VydmV5SGVscGVyLmdldExvY1N0cmluZyh0aGlzLnF1ZXN0aW9uLmxvY0h0bWwpLCB0aGlzLmNvbnRyb2xsZXIsIHJlbmRlckFzKTtcbiAgICAgICAgaWYgKHJlbmRlckFzID09PSAnaW1hZ2UnKSB7XG4gICAgICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgY29uc3QgeyB1cmwsIGFzcGVjdCB9OiB7IHVybDogc3RyaW5nLCBhc3BlY3Q6IG51bWJlciB9ID1cbiAgICAgICAgICAgIGF3YWl0IFN1cnZleUhlbHBlci5odG1sVG9JbWFnZShodG1sLCB3aWR0aCwgdGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gd2lkdGggLyBhc3BlY3Q7XG4gICAgICAgICAgICByZXR1cm4gW2F3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgeyBsaW5rOiB1cmwsIHdpZHRoLCBoZWlnaHQgfSldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbU3VydmV5SGVscGVyLnNwbGl0SHRtbFJlY3QodGhpcy5jb250cm9sbGVyLCBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlSFRNTEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0aGlzLmNvcnJlY3RIdG1sKGh0bWwpKSldO1xuICAgIH1cbn1cblxuU2VyaWFsaXplci5yZW1vdmVQcm9wZXJ0eSgnaHRtbCcsICdyZW5kZXJBcycpO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eSgnaHRtbCcsIHtcbiAgICBuYW1lOiAncmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAnc3RhbmRhcmQnLCAnaW1hZ2UnXVxufSk7XG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdodG1sJywgRmxhdEhUTUwpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2h0bWwudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uSW1hZ2VNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIsIElTaXplIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0SW1hZ2UgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25JbWFnZU1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25JbWFnZU1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdldENvcnJlY3RJbWFnZVNpemUoKTogUHJvbWlzZTxJU2l6ZT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgU3VydmV5SGVscGVyLmdldENvcnJlY3RlZEltYWdlU2l6ZSh0aGlzLmNvbnRyb2xsZXIsIHsgaW1hZ2VXaWR0aDogdGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoLCBpbWFnZUhlaWdodDogdGhpcy5xdWVzdGlvbi5pbWFnZUhlaWdodCwgaW1hZ2VMaW5rOiB0aGlzLnF1ZXN0aW9uLmltYWdlTGluayB9KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGltYWdlU2l6ZSA9IGF3YWl0IHRoaXMuZ2V0Q29ycmVjdEltYWdlU2l6ZSgpO1xuICAgICAgICByZXR1cm4gW2F3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIHsgbGluazogdGhpcy5xdWVzdGlvbi5pbWFnZUxpbmssIHdpZHRoOiBpbWFnZVNpemUud2lkdGgsIGhlaWdodDogaW1hZ2VTaXplLmhlaWdodCB9KV07XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdpbWFnZScsIEZsYXRJbWFnZSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2UudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgUXVlc3Rpb25JbWFnZVBpY2tlck1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IEZsYXRSYWRpb2dyb3VwIH0gZnJvbSAnLi9mbGF0X3JhZGlvZ3JvdXAnO1xuaW1wb3J0IHsgQ2hlY2tJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jaGVja2l0ZW0nO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0SW1hZ2VQaWNrZXIgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25JbWFnZVBpY2tlck1vZGVsO1xuICAgIHByb3RlY3RlZCByYWRpbzogRmxhdFJhZGlvZ3JvdXA7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkltYWdlUGlja2VyTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0SXRlbShwb2ludDogSVBvaW50LCBpdGVtOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBwYWdlQXZhaWxhYmxlV2lkdGggPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgIGNvbnN0IGltYWdlRmxhdCA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgeyBsaW5rOiAoPGFueT5pdGVtKS5pbWFnZUxpbmssIHdpZHRoOiBwYWdlQXZhaWxhYmxlV2lkdGgsIGhlaWdodDogcGFnZUF2YWlsYWJsZVdpZHRoIC8gU3VydmV5SGVscGVyLklNQUdFUElDS0VSX1JBVElPIH0pO1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayhpbWFnZUZsYXQpO1xuICAgICAgICBsZXQgYnV0dG9uUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uc2hvd0xhYmVsKSB7XG4gICAgICAgICAgICBsZXQgbGFiZWxGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoYnV0dG9uUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgaXRlbS50ZXh0IHx8IGl0ZW0udmFsdWUsIFRleHRCcmljayk7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGxhYmVsRmxhdCk7XG4gICAgICAgICAgICBidXR0b25Qb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChsYWJlbEZsYXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGJ1dHRvblJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QoYnV0dG9uUG9pbnQsIHBhZ2VBdmFpbGFibGVXaWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24ubXVsdGlTZWxlY3QpIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sobmV3IENoZWNrSXRlbUJyaWNrKHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICBidXR0b25SZWN0LCB0aGlzLnF1ZXN0aW9uLmlkICsgJ2luZGV4JyArIGluZGV4LCB7IHJlYWRPbmx5OiB0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHkgfHwgIWl0ZW0uaXNFbmFibGVkLCBxdWVzdGlvbjogdGhpcy5xdWVzdGlvbiwgaXRlbTogaXRlbSwgY2hlY2tlZDogdGhpcy5xdWVzdGlvbi52YWx1ZS5pbmRleE9mKGl0ZW0udmFsdWUpICE9PSAtMSwgaW5kZXg6IGluZGV4IH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sodGhpcy5yYWRpby5nZW5lcmF0ZUZsYXRJdGVtKGJ1dHRvblJlY3QsIGl0ZW0sIGluZGV4KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICB0aGlzLnJhZGlvID0gdGhpcy5xdWVzdGlvbi5tdWx0aVNlbGVjdCA/IG51bGwgOlxuICAgICAgICAgICAgbmV3IEZsYXRSYWRpb2dyb3VwKHRoaXMuc3VydmV5LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICBjb25zdCByb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10gPSBbbmV3IENvbXBvc2l0ZUJyaWNrKCldO1xuICAgICAgICBjb25zdCBjb2xXaWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLmdldEltYWdlUGlja2VyQXZhaWxhYmxlV2lkdGgoXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIpIC8gU3VydmV5SGVscGVyLklNQUdFUElDS0VSX0NPVU5UO1xuICAgICAgICBsZXQgY29sczogbnVtYmVyID0gfn4oU3VydmV5SGVscGVyLlxuICAgICAgICAgICAgZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikgLyBjb2xXaWR0aCkgfHwgMTtcbiAgICAgICAgY29uc3QgY291bnQ6IG51bWJlciA9IHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXMubGVuZ3RoO1xuICAgICAgICBjb2xzID0gY29scyA8PSBjb3VudCA/IGNvbHMgOiBjb3VudDtcbiAgICAgICAgY29uc3Qgcm93czogbnVtYmVyID0gfn4oTWF0aC5jZWlsKGNvdW50IC8gY29scykpO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCByb3dzOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB5Qm90OiBudW1iZXIgPSBjdXJyUG9pbnQueVRvcDtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgbGV0IGN1cnJNYXJnaW5MZWZ0OiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IGNvbHM7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSBpICogY29scyArIGo7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IGNvdW50KSBicmVhaztcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ID0gY3Vyck1hcmdpbkxlZnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgICAgIGN1cnJNYXJnaW5MZWZ0IC0gY29sV2lkdGg7XG4gICAgICAgICAgICAgICAgY3Vyck1hcmdpbkxlZnQgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ICsgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aDtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oY3VyclBvaW50LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzW2luZGV4XSwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICAgICAgICAgIHlCb3QgPSBNYXRoLm1heCh5Qm90LCBpdGVtRmxhdC55Qm90KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBwb2ludC54TGVmdDtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0geUJvdDtcbiAgICAgICAgICAgIGlmIChpICE9PSByb3dzIC0gMSkge1xuICAgICAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKG5ldyBDb21wb3NpdGVCcmljaygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93c0ZsYXRzO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignaW1hZ2VwaWNrZXInLCBGbGF0SW1hZ2VQaWNrZXIpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2ltYWdlcGlja2VyLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbk1hdHJpeE1vZGVsLCBNYXRyaXhSb3dNb2RlbCxcbiAgICBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbCwgSXRlbVZhbHVlLCBTZXJpYWxpemVyIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIsIElQb2ludCwgSVJlY3QgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJhZGlvZ3JvdXAgfSBmcm9tICcuL2ZsYXRfcmFkaW9ncm91cCc7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0TWF0cml4IGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdBUF9CRVRXRUVOX1JPV1M6IG51bWJlciA9IDAuNTtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uTWF0cml4TW9kZWw7XG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIDxRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbD5xdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25NYXRyaXhNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdHNIZWFkZXIocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgaGVhZGVyczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBpZih0aGlzLnF1ZXN0aW9uLmhhc1Jvd3MpIHtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCArPSB0aGlzLnJvd1RpdGxlV2lkdGggKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IGN1cnJQb2ludC54TGVmdDtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ICs9IChTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikgLSB0aGlzLmNvbHVtbldpZHRoKTtcbiAgICAgICAgICAgIGhlYWRlcnMucHVzaChhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQm9sZFRleHRGbGF0KGN1cnJQb2ludCxcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnNbaV0ubG9jVGV4dCkpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IHRoaXMuY29sdW1uV2lkdGggKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUJyaWNrOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayguLi5oZWFkZXJzKTtcbiAgICAgICAgcmV0dXJuIFtjb21wb3NpdGVCcmljaywgU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVCcmljayksIHRoaXMuY29udHJvbGxlcildO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0c1Jvd3MocG9pbnQ6IElQb2ludCwgaXNWZXJ0aWNhbDogYm9vbGVhbik6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY2VsbHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGxldCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uLnZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXk6IHN0cmluZyA9ICdyb3cnICsgaTtcbiAgICAgICAgICAgIGNvbnN0IGZsYXRzUm93OiBJUGRmQnJpY2tbXSA9IGF3YWl0IG5ldyBGbGF0TWF0cml4Um93KHRoaXMuc3VydmV5LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi52aXNpYmxlUm93c1tpXSwgaSwga2V5LCBpID09IDAsIGlzVmVydGljYWwsIHRoaXMucm93VGl0bGVXaWR0aCwgdGhpcy5jb2x1bW5XaWR0aCkuZ2VuZXJhdGVGbGF0c0NvbnRlbnQoY3VyclBvaW50KTtcbiAgICAgICAgICAgIGN1cnJQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi5mbGF0c1JvdykpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0TWF0cml4LkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgICAgICBjZWxscy5wdXNoKC4uLmZsYXRzUm93KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2VsbHM7XG4gICAgfVxuICAgIHByaXZhdGUgcm93VGl0bGVXaWR0aDogbnVtYmVyO1xuICAgIHByaXZhdGUgY29sdW1uV2lkdGg6IG51bWJlcjtcbiAgICBwcml2YXRlIGNhbGN1bGF0ZUNvbHVtbnNXaWR0aGVzKCkge1xuICAgICAgICBjb25zdCBhdmFpbGFibGVXaWR0aCA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgaWYodGhpcy5xdWVzdGlvbi5oYXNSb3dzICYmIHRoaXMucXVlc3Rpb24ucm93VGl0bGVXaWR0aCkge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICB0aGlzLnJvd1RpdGxlV2lkdGggPSBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aCh0aGlzLnF1ZXN0aW9uLnJvd1RpdGxlV2lkdGgsIGF2YWlsYWJsZVdpZHRoKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gKHRoaXMucm93VGl0bGVXaWR0aCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fQ09MVU1OUyk7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbldpZHRoID0gU3VydmV5SGVscGVyLmdldENvbHVtbldpZHRoKHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ29sdW1ucy5sZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uV2lkdGggPSB0aGlzLnJvd1RpdGxlV2lkdGggPSBTdXJ2ZXlIZWxwZXIuZ2V0Q29sdW1uV2lkdGgodGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLnZpc2libGVDb2x1bW5zLmxlbmd0aCArICh0aGlzLnF1ZXN0aW9uLmhhc1Jvd3MgPyAxIDogMCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbHVtbnNXaWR0aGVzKCk7XG4gICAgICAgIGNvbnN0IGlzVmVydGljYWw6IGJvb2xlYW4gPSB0aGlzLnF1ZXN0aW9uLnJlbmRlckFzID09PSAnbGlzdCcgfHwgdGhpcy5jb250cm9sbGVyLm1hdHJpeFJlbmRlckFzID09PSAnbGlzdCcgfHxcbiAgICAgICAgICAgIHRoaXMuY29sdW1uV2lkdGggPCB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoU3VydmV5SGVscGVyLk1BVFJJWF9DT0xVTU5fV0lEVEgpLndpZHRoO1xuICAgICAgICBsZXQgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBjZWxsczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgaWYgKCFpc1ZlcnRpY2FsICYmIHRoaXMucXVlc3Rpb24uc2hvd0hlYWRlciAmJiB0aGlzLnF1ZXN0aW9uLnZpc2libGVDb2x1bW5zLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICBsZXQgaGVhZGVyczogSVBkZkJyaWNrW10gPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNIZWFkZXIoY3VyclBvaW50KTtcbiAgICAgICAgICAgIGN1cnJQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi5oZWFkZXJzKSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBGbGF0TWF0cml4LkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgIGNlbGxzLnB1c2goLi4uaGVhZGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgY2VsbHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNSb3dzKGN1cnJQb2ludCwgaXNWZXJ0aWNhbCkpO1xuICAgICAgICByZXR1cm4gY2VsbHM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmxhdE1hdHJpeFJvdyBleHRlbmRzIEZsYXRSYWRpb2dyb3VwIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb25NYXRyaXg6IFF1ZXN0aW9uTWF0cml4TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHByaXZhdGUgcm93OiBNYXRyaXhSb3dNb2RlbCwgcHJpdmF0ZSByb3dJbmRleDogbnVtYmVyLFxuICAgICAgICBwcml2YXRlIGtleTogc3RyaW5nLCBwcm90ZWN0ZWQgaXNGaXJzdDogYm9vbGVhbiA9IGZhbHNlLCBwcm90ZWN0ZWQgaXNWZXJ0aWNhbDogYm9vbGVhbiA9IGZhbHNlLCBwcml2YXRlIHJvd1RpdGxlV2lkdGg6IG51bWJlciwgcHJpdmF0ZSBjb2x1bW5XaWR0aDogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uTWF0cml4ID0gPFF1ZXN0aW9uTWF0cml4TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZlcnRpY2FsID9cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1ZlcnRpY2FsbHlDZWxscyhwb2ludCkgOlxuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzSG9yaXpvbnRhbGx5Q2VsbHMocG9pbnQpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVUZXh0Q29tcG9zaXRlKHBvaW50OiBJUG9pbnQsIGNvbHVtbjogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBjaGVja2VkOiBib29sZWFuID0gdGhpcy5yb3cudmFsdWUgPT0gY29sdW1uLnZhbHVlO1xuICAgICAgICBjb25zdCBpdGVtUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KGN1cnJQb2ludCxcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICBjb25zdCByYWRpb0ZsYXQ6IElQZGZCcmljayA9IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShpdGVtUmVjdCwgY29sdW1uLCBpbmRleCwgdGhpcy5rZXksIGNoZWNrZWQsIHsgcm93OiB0aGlzLnJvdywgcm93SW5kZXg6IHRoaXMucm93SW5kZXggfSk7XG4gICAgICAgIGN1cnJQb2ludC55VG9wID0gcmFkaW9GbGF0LnlCb3QgKyB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9JVEVNX1RFWFQ7XG4gICAgICAgIGNvbnN0IGNlbGxUZXh0RmxhdCA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb25NYXRyaXgsIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25NYXRyaXguZ2V0Q2VsbERpc3BsYXlMb2NUZXh0KHRoaXMucm93Lm5hbWUsIGNvbHVtbiksIFRleHRCcmljayk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9zaXRlQnJpY2socmFkaW9GbGF0LCBjZWxsVGV4dEZsYXQpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVJdGVtQ29tcG9pc3RlKHBvaW50OiBJUG9pbnQsIGNvbHVtbjogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBjaGVja2VkOiBib29sZWFuID0gdGhpcy5yb3cudmFsdWUgPT0gY29sdW1uLnZhbHVlO1xuICAgICAgICBjb25zdCBpdGVtUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChjdXJyUG9pbnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICBjb25zdCByYWRpb0ZsYXQ6IElQZGZCcmljayA9IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KGl0ZW1SZWN0LCBTdXJ2ZXlIZWxwZXIuU0VMRUNUX0lURU1fRkxBVF9TQ0FMRSksIGl0ZW1SZWN0LnhMZWZ0KSwgY29sdW1uLCBpbmRleCwgdGhpcy5rZXksIGNoZWNrZWQsIHsgcm93OiB0aGlzLnJvdywgcm93SW5kZXg6IHRoaXMucm93SW5kZXggfSk7XG4gICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHJhZGlvRmxhdC54UmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgY29uc3QgcmFkaW9UZXh0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoY3VyclBvaW50LCB0aGlzLnF1ZXN0aW9uTWF0cml4LFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCBjb2x1bW4ubG9jVGV4dCwgVGV4dEJyaWNrKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVCcmljayhyYWRpb0ZsYXQsIHJhZGlvVGV4dCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRzSG9yaXpvbnRhbGx5Q2VsbHMocG9pbnQ6IElQb2ludCkge1xuICAgICAgICBjb25zdCBjZWxsczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbk1hdHJpeC5oYXNSb3dzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArPSAoU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpIC0gdGhpcy5yb3dUaXRsZVdpZHRoKTtcbiAgICAgICAgICAgIGNlbGxzLnB1c2goYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbk1hdHJpeCwgdGhpcy5jb250cm9sbGVyLCB0aGlzLnJvdy5sb2NUZXh0LCBUZXh0QnJpY2spKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCArPSB0aGlzLnJvd1RpdGxlV2lkdGggKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uTWF0cml4LnZpc2libGVDb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW46IEl0ZW1WYWx1ZSA9IHRoaXMucXVlc3Rpb25NYXRyaXgudmlzaWJsZUNvbHVtbnNbaV07XG4gICAgICAgICAgICBjb25zdCBjaGVja2VkOiBib29sZWFuID0gdGhpcy5yb3cudmFsdWUgPT0gY29sdW1uLnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ID0gY3VyclBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKz0gKFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSAtIHRoaXMuY29sdW1uV2lkdGgpO1xuICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25NYXRyaXguaGFzQ2VsbFRleHQpIHtcbiAgICAgICAgICAgICAgICBjZWxscy5wdXNoKGF3YWl0IHRoaXMuZ2VuZXJhdGVUZXh0Q29tcG9zaXRlKGN1cnJQb2ludCwgY29sdW1uLCBpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0LCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgICAgICAgICAgY2VsbHMucHVzaCh0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oU3VydmV5SGVscGVyLm1vdmVSZWN0KFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KGl0ZW1SZWN0LCBTdXJ2ZXlIZWxwZXIuU0VMRUNUX0lURU1fRkxBVF9TQ0FMRSksIGN1cnJQb2ludC54TGVmdCksIGNvbHVtbiwgaSwgdGhpcy5rZXksIGNoZWNrZWQsIHsgcm93OiB0aGlzLnJvdywgcm93SW5kZXg6IHRoaXMucm93SW5kZXggfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IHRoaXMuY29sdW1uV2lkdGggKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKC4uLmNlbGxzKTtcbiAgICAgICAgcmV0dXJuIFtjb21wb3NpdGVCcmljaywgU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVCcmljayksIHRoaXMuY29udHJvbGxlcildO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0c1ZlcnRpY2FsbHlDZWxscyhwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjZWxsczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbk1hdHJpeC5oYXNSb3dzKSB7XG4gICAgICAgICAgICBjb25zdCByb3dUZXh0RmxhdCA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb25NYXRyaXgsXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCB0aGlzLnJvdy5sb2NUZXh0LCBUZXh0QnJpY2spO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSByb3dUZXh0RmxhdC55Qm90ICsgRmxhdFF1ZXN0aW9uLkNPTlRFTlRfR0FQX1ZFUlRfU0NBTEUgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgIGNlbGxzLnB1c2gocm93VGV4dEZsYXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVGbGF0Q29tcG9zaXRlID0gKHRoaXMucXVlc3Rpb25NYXRyaXguaGFzQ2VsbFRleHQpID8gdGhpcy5nZW5lcmF0ZVRleHRDb21wb3NpdGUgOiB0aGlzLmdlbmVyYXRlSXRlbUNvbXBvaXN0ZTtcbiAgICAgICAgY2VsbHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlVmVydGljYWxseUl0ZW1zKGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbk1hdHJpeC52aXNpYmxlQ29sdW1ucykpO1xuICAgICAgICBjb25zdCBjb21wb3NpdGVCcmljazogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soLi4uY2VsbHMpO1xuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUJyaWNrLCBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUJyaWNrKSwgdGhpcy5jb250cm9sbGVyKV07XG4gICAgfVxufVxuXG5TZXJpYWxpemVyLnJlbW92ZVByb3BlcnR5KCdtYXRyaXgnLCAncmVuZGVyQXMnKTtcblNlcmlhbGl6ZXIuYWRkUHJvcGVydHkoJ21hdHJpeCcsIHtcbiAgICBuYW1lOiAncmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAnbGlzdCddXG59KTtcbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ21hdHJpeCcsIEZsYXRNYXRyaXgpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X21hdHJpeC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgU2VyaWFsaXplciB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBGbGF0TWF0cml4TXVsdGlwbGUgfSBmcm9tICcuL2ZsYXRfbWF0cml4bXVsdGlwbGUnO1xuXG5leHBvcnQgY2xhc3MgRmxhdE1hdHJpeER5bmFtaWMgZXh0ZW5kcyBGbGF0TWF0cml4TXVsdGlwbGUge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlciwgZmFsc2UpO1xuICAgIH1cbn1cblxuU2VyaWFsaXplci5yZW1vdmVQcm9wZXJ0eSgnbWF0cml4ZHluYW1pYycsICdyZW5kZXJBcycpO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eSgnbWF0cml4ZHluYW1pYycsIHtcbiAgICBuYW1lOiAncmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAnbGlzdCddXG59KTtcbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ21hdHJpeGR5bmFtaWMnLCBGbGF0TWF0cml4RHluYW1pYyk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4ZHluYW1pYy50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbCwgTXVsdGlwbGVUZXh0SXRlbU1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiwgSUZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgRmxhdFRleHRib3ggfSBmcm9tICcuL2ZsYXRfdGV4dGJveCc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0TXVsdGlwbGVUZXh0IGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJPV1NfR0FQX1NDQUxFOiBudW1iZXIgPSAwLjE5NTtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRWaXNpYmxlUm93cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb24uZ2V0Um93cygpLmZpbHRlcihyb3cgPT4gcm93LmlzVmlzaWJsZSk7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0SXRlbShwb2ludDogSVBvaW50LCByb3dfaW5kZXg6IG51bWJlciwgY29sX2luZGV4OiBudW1iZXIsXG4gICAgICAgIGl0ZW06IE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbFdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb2xXaWR0aCAqIFN1cnZleUhlbHBlci5NVUxUSVBMRVRFWFRfVEVYVF9QRVJTO1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuXG4gICAgICAgICAgICBjcmVhdGVCb2xkVGV4dEZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgaXRlbS5sb2NUaXRsZSkpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuXG4gICAgICAgIGNvbnN0IGZsYXRNdWx0aXBsZVRleHRJdGVtUXVlc3Rpb246IElGbGF0UXVlc3Rpb24gPSBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZShcbiAgICAgICAgICAgIHRoaXMuc3VydmV5LCBpdGVtLmVkaXRvciwgdGhpcy5jb250cm9sbGVyLCAndGV4dCcpO1xuICAgICAgICBjb25zdCBpdGVtUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmllbGRSZWN0KHtcbiAgICAgICAgICAgIHhMZWZ0OiBwb2ludC54TGVmdCArIGNvbFdpZHRoICogU3VydmV5SGVscGVyLk1VTFRJUExFVEVYVF9URVhUX1BFUlMsIHlUb3A6IHBvaW50LnlUb3AgfSxcbiAgICAgICAgdGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayguLi5hd2FpdCAoPEZsYXRUZXh0Ym94PmZsYXRNdWx0aXBsZVRleHRJdGVtUXVlc3Rpb24pLmdlbmVyYXRlRmxhdHNDb250ZW50KGl0ZW1Qb2ludCkpO1xuXG4gICAgICAgIHJldHVybiBjb21wb3NpdGVGbGF0O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3Qgcm93c0ZsYXRzOiBDb21wb3NpdGVCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3Qgcm93cyA9IHRoaXMuZ2V0VmlzaWJsZVJvd3MoKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKG5ldyBDb21wb3NpdGVCcmljaygpKTtcbiAgICAgICAgICAgIGxldCB5Qm90OiBudW1iZXIgPSBjdXJyUG9pbnQueVRvcDtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHJvd3NbaV0uY2VsbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2V0Q29sdW1uTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24uY29sQ291bnQsIGopO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LCBpLCBqLCByb3dzW2ldLmNlbGxzW2pdLml0ZW0pO1xuICAgICAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICAgICAgICAgIHlCb3QgPSBNYXRoLm1heCh5Qm90LCBpdGVtRmxhdC55Qm90KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSB5Qm90O1xuICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoY3VyclBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0TXVsdGlwbGVUZXh0LlJPV1NfR0FQX1NDQUxFO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzRmxhdHM7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdtdWx0aXBsZXRleHQnLCBGbGF0TXVsdGlwbGVUZXh0KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tdWx0aXBsZXRleHQudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFN1cnZleSB9IGZyb20gJy4vZmxhdF9zdXJ2ZXknO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0UGFuZWxEeW5hbWljIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWw7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBHQVBfQkVUV0VFTl9QQU5FTFM6IG51bWJlciA9IDAuNzU7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGZvciAoY29uc3QgcGFuZWwgb2YgdGhpcy5xdWVzdGlvbi5wYW5lbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhbmVsRmxhdHM6IElQZGZCcmlja1tdID0gYXdhaXQgRmxhdFN1cnZleS5nZW5lcmF0ZUZsYXRzUGFuZWwoXG4gICAgICAgICAgICAgICAgdGhpcy5zdXJ2ZXksIHRoaXMuY29udHJvbGxlciwgcGFuZWwsIGN1cnJQb2ludCk7XG4gICAgICAgICAgICBpZiAocGFuZWxGbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLnBhbmVsRmxhdHMpLnlCb3Q7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0UGFuZWxEeW5hbWljLkdBUF9CRVRXRUVOX1BBTkVMUztcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKC4uLnBhbmVsRmxhdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ3BhbmVsZHluYW1pYycsIEZsYXRQYW5lbER5bmFtaWMpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3BhbmVsZHluYW1pYy50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBRdWVzdGlvblJhbmtpbmdNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBSYW5raW5nSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfcmFua2luZ2l0ZW0nO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBDb2xvcmVkQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb2xvcmVkYnJpY2snO1xuXG5leHBvcnQgY2xhc3MgRmxhdFJhbmtpbmcgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25SYW5raW5nTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25SYW5raW5nTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRDb21wb3NpdGUocG9pbnQ6IElQb2ludCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyLCB1bnJhbmtlZEl0ZW06IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICBjb25zdCBpdGVtU2NhbGVkUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoU3VydmV5SGVscGVyLnNjYWxlUmVjdChcbiAgICAgICAgICAgIGl0ZW1SZWN0LCBTdXJ2ZXlIZWxwZXIuU0VMRUNUX0lURU1fRkxBVF9TQ0FMRSksIHBvaW50LnhMZWZ0KTtcbiAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IG5ldyBSYW5raW5nSXRlbUJyaWNrKHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgIGl0ZW1TY2FsZWRSZWN0LCB1bnJhbmtlZEl0ZW0gPyAnLScgOiB0aGlzLnF1ZXN0aW9uLmdldE51bWJlckJ5SW5kZXgoaW5kZXgpKTtcbiAgICAgICAgY29uc3QgdGV4dFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICB0ZXh0UG9pbnQueExlZnQgPSBpdGVtRmxhdC54UmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgY29uc3QgdGV4dEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIHRleHRQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLmxvY1RleHQsIFRleHRCcmljayk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9zaXRlQnJpY2soaXRlbUZsYXQsIHRleHRGbGF0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlQ2hvaWNlc0NvbHVtbihwb2ludDogSVBvaW50LCBjaG9pY2VzOiBJdGVtVmFsdWVbXSwgdW5yYW5rZWRDaG9pY2VzOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRDb21wb3NpdGUoY3VyclBvaW50LCBjaG9pY2VzW2ldLCBpLCB1bnJhbmtlZENob2ljZXMpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBpdGVtRmxhdC55Qm90ICsgU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgIGZsYXRzLnB1c2goaXRlbUZsYXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlU2VsZWN0VG9SYW5rSXRlbXNWZXJ0aWNhbGx5KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBpZih0aGlzLnF1ZXN0aW9uLnJhbmtpbmdDaG9pY2VzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgZmxhdHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlQ2hvaWNlc0NvbHVtbihjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb24ucmFua2luZ0Nob2ljZXMpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gZmxhdHNbZmxhdHMubGVuZ3RoIC0gMV0ueUJvdCArIDIgKiAoU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHtcbiAgICAgICAgICAgIHhMZWZ0OiBjdXJyUG9pbnQueExlZnQsXG4gICAgICAgICAgICB5VG9wOiBjdXJyUG9pbnQueVRvcCAtIChTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0KSAtIDAuNSxcbiAgICAgICAgfSwgdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCAtIGN1cnJQb2ludC54TGVmdCwgMSk7XG4gICAgICAgIGZsYXRzLnB1c2gobmV3IENvbG9yZWRCcmljayh0aGlzLmNvbnRyb2xsZXIsIHNlcGFyYXRvclJlY3QsIFN1cnZleUhlbHBlci5GT1JNX0JPUkRFUl9DT0xPUikpO1xuXG4gICAgICAgIGZsYXRzLnB1c2goLi4uYXdhaXQgdGhpcy5nZW5lcmF0ZUNob2ljZXNDb2x1bW4oY3VyclBvaW50LCB0aGlzLnF1ZXN0aW9uLnVuUmFua2luZ0Nob2ljZXMsIHRydWUpKTtcbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVTZWxlY3RUb1JhbmtJdGVtc0hvcml6b250YWxseShwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjb2xDb3VudCA9IDI7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IHJvd3NDb3VudCA9IE1hdGgubWF4KHRoaXMucXVlc3Rpb24udW5SYW5raW5nQ2hvaWNlcy5sZW5ndGgsIHRoaXMucXVlc3Rpb24ucmFua2luZ0Nob2ljZXMubGVuZ3RoKTtcbiAgICAgICAgbGV0IHJvdzogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvd3NDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY29sSW5kZXggPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiBbdGhpcy5xdWVzdGlvbi51blJhbmtpbmdDaG9pY2VzW2ldLCB0aGlzLnF1ZXN0aW9uLnJhbmtpbmdDaG9pY2VzW2ldXSkge1xuICAgICAgICAgICAgICAgIGlmKCEhaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnModGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCwgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2V0Q29sdW1uTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIsIGNvbENvdW50LCBjb2xJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdENvbXBvc2l0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludCwgaXRlbSwgaSwgY29sSW5kZXggPT0gMCk7XG4gICAgICAgICAgICAgICAgICAgIHJvdy5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbEluZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByb3dMaW5lRmxhdDogSVBkZkJyaWNrID0gU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChyb3cpLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgZmxhdHMucHVzaChyb3csIHJvd0xpbmVGbGF0KTtcbiAgICAgICAgICAgIGNvbnN0IHNlcGFyYXRvclJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdCh7XG4gICAgICAgICAgICAgICAgeExlZnQ6IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKyBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikgLyAyIC0gMC41LFxuICAgICAgICAgICAgICAgIHlUb3A6IGN1cnJQb2ludC55VG9wLFxuICAgICAgICAgICAgfSwgMCwgMCk7XG4gICAgICAgICAgICByb3cuYWRkQnJpY2sobmV3IENvbG9yZWRCcmljayh0aGlzLmNvbnRyb2xsZXIsIHNlcGFyYXRvclJlY3QsIFN1cnZleUhlbHBlci5GT1JNX0JPUkRFUl9DT0xPUiwgMSwgcm93TGluZUZsYXQueUJvdCAtIGN1cnJQb2ludC55VG9wICsgKGkgIT09IHJvd3NDb3VudCAtIDEgP1xuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgOiAwKSkpO1xuXG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHJvd0xpbmVGbGF0LnlCb3QgK1xuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICByb3cgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmxhdHM7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBpZighdGhpcy5xdWVzdGlvbi5zZWxlY3RUb1JhbmtFbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUNob2ljZXNDb2x1bW4ocG9pbnQsIHRoaXMucXVlc3Rpb24ucmFua2luZ0Nob2ljZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYodGhpcy5xdWVzdGlvbi5zZWxlY3RUb1JhbmtBcmVhc0xheW91dCA9PSAndmVydGljYWwnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVNlbGVjdFRvUmFua0l0ZW1zVmVydGljYWxseShwb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVNlbGVjdFRvUmFua0l0ZW1zSG9yaXpvbnRhbGx5KHBvaW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigncmFua2luZycsIEZsYXRSYW5raW5nKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYW5raW5nLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uUmF0aW5nTW9kZWwsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UmFkaW9ncm91cCB9IGZyb20gJy4vZmxhdF9yYWRpb2dyb3VwJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRSYXRpbmcgZXh0ZW5kcyBGbGF0UmFkaW9ncm91cCB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uUmF0aW5nOiBRdWVzdGlvblJhdGluZ01vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uUmF0aW5nID0gPFF1ZXN0aW9uUmF0aW5nTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRIb3Jpc29udGFsQ29tcG9zaXRlKHBvaW50OiBJUG9pbnQsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGl0ZW1UZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IFN1cnZleUhlbHBlci5nZXRSYXRpbmdJdGVtVGV4dChcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25SYXRpbmcsIGluZGV4LCBpdGVtLmxvY1RleHQpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgY29uc3QgaGFsZldpZHRoOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoIC8gMi4wO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IGhhbGZXaWR0aDtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKz0gaGFsZldpZHRoO1xuICAgICAgICBjb25zdCB0ZXh0UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIHRleHRQb2ludC54TGVmdCArPSBoYWxmV2lkdGg7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5cbiAgICAgICAgICAgIGNyZWF0ZUJvbGRUZXh0RmxhdCh0ZXh0UG9pbnQsIHRoaXMucXVlc3Rpb25SYXRpbmcsIHRoaXMuY29udHJvbGxlciwgaXRlbVRleHQpKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgbGV0IHRleHRXaWR0aDogbnVtYmVyID0gY29tcG9zaXRlRmxhdC53aWR0aDtcbiAgICAgICAgaWYgKHRleHRXaWR0aCA8IFN1cnZleUhlbHBlci5nZXRSYXRpbmdNaW5XaWR0aCh0aGlzLmNvbnRyb2xsZXIpKSB7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LnhMZWZ0ICs9IChTdXJ2ZXlIZWxwZXIuZ2V0UmF0aW5nTWluV2lkdGgoXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyKSAtIHRleHRXaWR0aCkgLyAyLjAgLSBoYWxmV2lkdGg7XG4gICAgICAgICAgICB0ZXh0V2lkdGggPSBTdXJ2ZXlIZWxwZXIuZ2V0UmF0aW5nTWluV2lkdGgodGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRleHRXaWR0aCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJhZGlvUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgcmFkaW9Qb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChcbiAgICAgICAgICAgIHJhZGlvUG9pbnQsIHRleHRXaWR0aCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpLCBpdGVtLCBpbmRleCwgdW5kZWZpbmVkLCB0aGlzLnF1ZXN0aW9uLnZhbHVlID09IGl0ZW0udmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRDb21wb3NpdGUocG9pbnQ6IElQb2ludCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29uc3QgaXRlbVJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFN1cnZleUhlbHBlci5tb3ZlUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QoaXRlbVJlY3QsIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSxcbiAgICAgICAgICAgIHBvaW50LnhMZWZ0KSwgaXRlbSwgaW5kZXgsIHVuZGVmaW5lZCwgdGhpcy5xdWVzdGlvbi52YWx1ZSA9PSBpdGVtLnZhbHVlKTtcbiAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgIGNvbnN0IHRleHRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgdGV4dFBvaW50LnhMZWZ0ID0gaXRlbUZsYXQueFJpZ2h0ICsgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9JVEVNX1RFWFQ7XG4gICAgICAgIGNvbnN0IGl0ZW1UZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IFN1cnZleUhlbHBlci5nZXRSYXRpbmdJdGVtVGV4dCh0aGlzLnF1ZXN0aW9uUmF0aW5nLCBpbmRleCwgaXRlbS5sb2NUZXh0KTtcbiAgICAgICAgaXRlbVRleHQgPT0gbnVsbCB8fCBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIHRleHRQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtVGV4dCwgVGV4dEJyaWNrKSk7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGVGbGF0O1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVIb3Jpc29udGFsbHlJdGVtcyhwb2ludDogSVBvaW50KSB7XG4gICAgICAgIGNvbnN0IHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSA9IFtuZXcgQ29tcG9zaXRlQnJpY2soKV07XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb25SYXRpbmcudmlzaWJsZVJhdGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEhvcmlzb250YWxDb21wb3NpdGUoY3VyclBvaW50LFxuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb25SYXRpbmcudmlzaWJsZVJhdGVWYWx1ZXNbaV0sIGkpO1xuICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICBjb25zdCBsZWZ0V2lkdGg6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCAtIGl0ZW1GbGF0LnhSaWdodDtcbiAgICAgICAgICAgIGlmIChTdXJ2ZXlIZWxwZXIuZ2V0UmF0aW5nTWluV2lkdGgodGhpcy5jb250cm9sbGVyKSA8PSBsZWZ0V2lkdGggKyBTdXJ2ZXlIZWxwZXIuRVBTSUxPTikge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IGl0ZW1GbGF0LnhSaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gaXRlbUZsYXQueUJvdDtcbiAgICAgICAgICAgICAgICBpZiAoaSAhPT0gdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soXG4gICAgICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoY3VyclBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKG5ldyBDb21wb3NpdGVCcmljaygpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3NGbGF0cztcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGxldCBpc1ZlcnRpY2FsOiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uUmF0aW5nLnZpc2libGVSYXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtVGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSBTdXJ2ZXlIZWxwZXIuZ2V0UmF0aW5nSXRlbVRleHQoXG4gICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvblJhdGluZywgaSwgdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlc1tpXS5sb2NUZXh0KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoaXRlbVRleHQpLndpZHRoID4gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFN1cnZleUhlbHBlci5SQVRJTkdfQ09MVU1OX1dJRFRIKS53aWR0aCkge1xuICAgICAgICAgICAgICAgIGlzVmVydGljYWwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1ZlcnRpY2FsID8gdGhpcy5nZW5lcmF0ZVZlcnRpY2FsbHlJdGVtcyhwb2ludCwgdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlcykgOiB0aGlzLmdlbmVyYXRlSG9yaXNvbnRhbGx5SXRlbXMocG9pbnQpO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigncmF0aW5nJywgRmxhdFJhdGluZyk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcmF0aW5nLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvblNpZ25hdHVyZVBhZE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciwgSVJlY3QsIElTaXplIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IElCb3JkZXJEZXNjcmlwdGlvbiwgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBFbXB0eUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfZW1wdHknO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuXG5leHBvcnQgY2xhc3MgRmxhdFNpZ25hdHVyZVBhZCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblNpZ25hdHVyZVBhZE1vZGVsO1xuICAgIHB1YmxpYyBzdGF0aWMgQk9SREVSX1NUWUxFOiAnZGFzaGVkJyB8ICdzb2xpZCcgfCAnbm9uZScgPSAnZGFzaGVkJztcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uU2lnbmF0dXJlUGFkTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlQmFja2dyb3VuZEltYWdlKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB7IGxpbms6IHRoaXMucXVlc3Rpb24uYmFja2dyb3VuZEltYWdlLCB3aWR0aDogU3VydmV5SGVscGVyLnB4VG9QdCg8YW55PnRoaXMucXVlc3Rpb24uc2lnbmF0dXJlV2lkdGgpLCBoZWlnaHQ6IFN1cnZleUhlbHBlci5weFRvUHQoPGFueT50aGlzLnF1ZXN0aW9uLnNpZ25hdHVyZUhlaWdodCksIG9iamVjdEZpdDogJ2NvdmVyJyB9LCB0cnVlKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRTaWduSW1hZ2VVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLnN0b3JlRGF0YUFzVGV4dCB8fCAhdGhpcy5xdWVzdGlvbi5sb2FkZWREYXRhID8gdGhpcy5xdWVzdGlvbi52YWx1ZSA6IHRoaXMucXVlc3Rpb24ubG9hZGVkRGF0YTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlU2lnbihwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBTdXJ2ZXlIZWxwZXIucHhUb1B0KDxhbnk+dGhpcy5xdWVzdGlvbi5zaWduYXR1cmVXaWR0aCk7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IFN1cnZleUhlbHBlci5weFRvUHQoPGFueT50aGlzLnF1ZXN0aW9uLnNpZ25hdHVyZUhlaWdodCk7XG4gICAgICAgIGxldCBicmljazogUGRmQnJpY2s7XG4gICAgICAgIGlmKHRoaXMucXVlc3Rpb24udmFsdWUpIHtcbiAgICAgICAgICAgIGJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChwb2ludCxcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHsgbGluazogdGhpcy5nZXRTaWduSW1hZ2VVcmwoKSxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCB9LCBmYWxzZVxuICAgICAgICAgICAgKSBhcyBQZGZCcmljaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyaWNrID0gbmV3IEVtcHR5QnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsIHdpZHRoLCBoZWlnaHQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZihGbGF0U2lnbmF0dXJlUGFkLkJPUkRFUl9TVFlMRSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICBicmljay5hZnRlclJlbmRlckNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvcmRlck9wdGlvbnM6IElCb3JkZXJEZXNjcmlwdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBicmljay53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGJyaWNrLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICB5VG9wOiBicmljay55VG9wLFxuICAgICAgICAgICAgICAgICAgICB5Qm90OiBicmljay55Qm90LFxuICAgICAgICAgICAgICAgICAgICB4TGVmdDogYnJpY2sueExlZnQsXG4gICAgICAgICAgICAgICAgICAgIHhSaWdodDogYnJpY2sueFJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBmb3JtQm9yZGVyQ29sb3I6IGJyaWNrLmZvcm1Cb3JkZXJDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgcm91bmRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG91dHNpZGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGRhc2hTdHlsZTogRmxhdFNpZ25hdHVyZVBhZC5CT1JERVJfU1RZTEUgPT0gJ2Rhc2hlZCcgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXNoQXJyYXk6IFs1XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhc2hQaGFzZTogMFxuICAgICAgICAgICAgICAgICAgICB9IDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCBib3JkZXJPcHRpb25zKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYnJpY2s7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGlmKHRoaXMucXVlc3Rpb24uYmFja2dyb3VuZEltYWdlKSB7XG4gICAgICAgICAgICBjb21wb3NpdGVCcmljay5hZGRCcmljayhhd2FpdCB0aGlzLmdlbmVyYXRlQmFja2dyb3VuZEltYWdlKHBvaW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9zaXRlQnJpY2suYWRkQnJpY2soYXdhaXQgdGhpcy5nZW5lcmF0ZVNpZ24ocG9pbnQpKTtcbiAgICAgICAgcmV0dXJuIFtjb21wb3NpdGVCcmlja107XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdzaWduYXR1cmVwYWQnLCBGbGF0U2lnbmF0dXJlUGFkKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9zaWduYXR1cmVwYWQudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uVGV4dE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0Qm94QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0Ym94JztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdFRleHRib3ggZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTVVMVElMSU5FX1RFWFRfUk9XU19DT1VOVDogbnVtYmVyID0gMTtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uVGV4dE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25UZXh0TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBpZiAoIXRoaXMuc2hvdWxkUmVuZGVyQXNDb21tZW50KSB7XG4gICAgICAgICAgICBjb25zdCByZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmllbGRSZWN0KHBvaW50LCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVGV4dEJveEJyaWNrKHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgcmVjdCldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUNvbW1lbnRGbGF0KHBvaW50LCB0aGlzLnF1ZXN0aW9uLFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCB0cnVlLCB7IHJvd3M6IEZsYXRUZXh0Ym94Lk1VTFRJTElORV9URVhUX1JPV1NfQ09VTlQgfSldO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigndGV4dCcsIEZsYXRUZXh0Ym94KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF90ZXh0Ym94LnRzIiwiaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyLCBJUmVjdCB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcblxuZXhwb3J0IGNsYXNzIEN1c3RvbUJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuXG4gICAgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcHJpdmF0ZSByZW5kZXJGdW5jOiAoZG9jOiBhbnksIHF1ZXN0aW9uOiBhbnksIHhMZWZ0OiBudW1iZXIsIHlUb3A6IG51bWJlcikgPT4gSVJlY3QpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlbmRlckZ1bmMoY29udHJvbGxlci5oZWxwZXJEb2MsIHF1ZXN0aW9uLCAwLCAwKSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyRnVuYyh0aGlzLmNvbnRyb2xsZXIuZG9jLCB0aGlzLnF1ZXN0aW9uLCB0aGlzLnhMZWZ0LCB0aGlzLnlUb3ApO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2N1c3RvbS50cyIsImltcG9ydCB7IFN1cnZleU1vZGVsLCBRdWVzdGlvbiwgRXZlbnRCYXNlIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0ICogYXMgU3VydmV5Q29yZSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJRG9jT3B0aW9ucywgRG9jQ29udHJvbGxlciB9IGZyb20gJy4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFN1cnZleSB9IGZyb20gJy4vZmxhdF9sYXlvdXQvZmxhdF9zdXJ2ZXknO1xuaW1wb3J0IHsgUGFnZVBhY2tlciB9IGZyb20gJy4vcGFnZV9sYXlvdXQvcGFnZV9wYWNrZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBFdmVudEFzeW5jLCBFdmVudEhhbmRsZXIgfSBmcm9tICcuL2V2ZW50X2hhbmRsZXIvZXZlbnRfaGFuZGxlcic7XG5pbXBvcnQgeyBEcmF3Q2FudmFzIH0gZnJvbSAnLi9ldmVudF9oYW5kbGVyL2RyYXdfY2FudmFzJztcbmltcG9ydCB7IEFkb3JuZXJzT3B0aW9ucywgQWRvcm5lcnNQYW5lbE9wdGlvbnMsIEFkb3JuZXJzUGFnZU9wdGlvbnMgfSBmcm9tICcuL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi9oZWxwZXJfc3VydmV5JztcblxuLyoqXG4gKiBUaGUgYFN1cnZleVBERmAgb2JqZWN0IGVuYWJsZXMgeW91IHRvIGV4cG9ydCB5b3VyIHN1cnZleXMgYW5kIGZvcm1zIHRvIFBERiBkb2N1bWVudHMuXG4gKlxuICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzLyAobGlua1N0eWxlKSlcbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleVBERiBleHRlbmRzIFN1cnZleU1vZGVsIHtcbiAgICBwcml2YXRlIHN0YXRpYyBjdXJyZW50bHlTYXZpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIHN0YXRpYyBzYXZlUXVldWU6IGFueVtdID0gW107XG4gICAgcHVibGljIG9wdGlvbnM6IElEb2NPcHRpb25zO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihqc29uT2JqZWN0OiBhbnksIG9wdGlvbnM/OiBJRG9jT3B0aW9ucykge1xuICAgICAgICBzdXBlcihqc29uT2JqZWN0KTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IFN1cnZleUhlbHBlci5jbG9uZShvcHRpb25zKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBoYXZlQ29tbWVyY2lhbExpY2Vuc2UoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGYgPSBTdXJ2ZXlDb3JlLmhhc0xpY2Vuc2U7XG4gICAgICAgIHJldHVybiAhIWYgJiYgZigyKTtcbiAgICB9XG4gICAgcHVibGljIHNldCBoYXZlQ29tbWVyY2lhbExpY2Vuc2UodmFsOiBib29sZWFuKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FzIG9mIHYxLjkuMTAxLCB0aGUgaGF2ZUNvbW1lcmNpYWxMaWNlbnNlIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQuIFRvIGFjdGl2YXRlIHlvdXIgbGljZW5zZSwgdXNlIHRoZSBzZXRMaWNlbnNlS2V5KGtleSkgbWV0aG9kIGFzIHNob3duIG9uIHRoZSBmb2xsb3dpbmcgcGFnZTogaHR0cHM6Ly9zdXJ2ZXlqcy5pby9yZW1vdmUtYWxlcnQtYmFubmVyJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIGV2ZW50IHRoYXQgaXMgcmFpc2VkIHdoZW4gU3VydmV5SlMgUERGIEdlbmVyYXRvciByZW5kZXJzIGEgcGFnZSBoZWFkZXIuIEhhbmRsZSB0aGlzIGV2ZW50IHRvIGN1c3RvbWl6ZSB0aGUgaGVhZGVyLlxuICAgICAqXG4gICAgICogUGFyYW1ldGVyczpcbiAgICAgKlxuICAgICAqIC0gYHNlbmRlcmA6IGBTdXJ2ZXlQREZgXFxcbiAgICAgKiBBIFN1cnZleVBERiBpbnN0YW5jZSB0aGF0IHJhaXNlZCB0aGUgZXZlbnQuXG4gICAgICpcbiAgICAgKiAtIGBjYW52YXNgOiBbYERyYXdDYW52YXNgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2RyYXdjYW52YXMpXFxcbiAgICAgKiBBbiBvYmplY3QgdGhhdCB5b3UgY2FuIHVzZSB0byBkcmF3IHRleHQgYW5kIGltYWdlcyBpbiB0aGUgcGFnZSBoZWFkZXIuXG4gICAgICpcbiAgICAgKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZXhhbXBsZXMvY3VzdG9taXplLWhlYWRlci1hbmQtZm9vdGVyLW9mLXBkZi1mb3JtLyAobGlua1N0eWxlKSlcbiAgICAgKi9cbiAgICBwdWJsaWMgb25SZW5kZXJIZWFkZXI6IEV2ZW50QXN5bmM8U3VydmV5UERGLCBEcmF3Q2FudmFzPiA9XG4gICAgICAgIG5ldyBFdmVudEFzeW5jPFN1cnZleVBERiwgRHJhd0NhbnZhcz4oKTtcbiAgICAvKipcbiAgICAgKiBBbiBldmVudCB0aGF0IGlzIHJhaXNlZCB3aGVuIFN1cnZleUpTIFBERiBHZW5lcmF0b3IgcmVuZGVycyBhIHBhZ2UgZm9vdGVyLiBIYW5kbGUgdGhpcyBldmVudCB0byBjdXN0b21pemUgdGhlIGZvb3Rlci5cbiAgICAgKlxuICAgICAqIFBhcmFtZXRlcnM6XG4gICAgICpcbiAgICAgKiAtIGBzZW5kZXJgOiBgU3VydmV5UERGYFxcXG4gICAgICogQSBTdXJ2ZXlQREYgaW5zdGFuY2UgdGhhdCByYWlzZWQgdGhlIGV2ZW50LlxuICAgICAqXG4gICAgICogLSBgY2FudmFzYDogW2BEcmF3Q2FudmFzYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9kcmF3Y2FudmFzKVxcXG4gICAgICogQW4gb2JqZWN0IHRoYXQgeW91IGNhbiB1c2UgdG8gZHJhdyB0ZXh0IGFuZCBpbWFnZXMgaW4gdGhlIHBhZ2UgZm9vdGVyLlxuICAgICAqXG4gICAgICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzL2N1c3RvbWl6ZS1oZWFkZXItYW5kLWZvb3Rlci1vZi1wZGYtZm9ybS8gKGxpbmtTdHlsZSkpXG4gICAgICovXG4gICAgcHVibGljIG9uUmVuZGVyRm9vdGVyOiBFdmVudEFzeW5jPFN1cnZleVBERiwgRHJhd0NhbnZhcz4gPVxuICAgICAgICBuZXcgRXZlbnRBc3luYzxTdXJ2ZXlQREYsIERyYXdDYW52YXM+KCk7XG4gICAgLyoqXG4gICAgICogQW4gZXZlbnQgdGhhdCBpcyByYWlzZWQgd2hlbiBTdXJ2ZXlKUyBQREYgR2VuZXJhdG9yIHJlbmRlcnMgYSBzdXJ2ZXkgcXVlc3Rpb24uIEhhbmRsZSB0aGlzIGV2ZW50IHRvIGN1c3RvbWl6ZSBxdWVzdGlvbiByZW5kZXJpbmcuXG4gICAgICpcbiAgICAgKiBQYXJhbWV0ZXJzOlxuICAgICAqXG4gICAgICogLSBgc2VuZGVyYDogYFN1cnZleVBERmBcXFxuICAgICAqIEEgU3VydmV5UERGIGluc3RhbmNlIHRoYXQgcmFpc2VkIHRoZSBldmVudC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMucXVlc3Rpb25gOiBbYFF1ZXN0aW9uYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3F1ZXN0aW9uKVxcXG4gICAgICogQSBzdXJ2ZXkgcXVlc3Rpb24gdGhhdCBpcyBiZWluZyByZW5kZXJlZC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMucG9pbnRgOiBgSVBvaW50YFxcXG4gICAgICogQW4gb2JqZWN0IHdpdGggY29vcmRpbmF0ZXMgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZWxlbWVudCBiZWluZyByZW5kZXJlZC4gVGhpcyBvYmplY3QgY29udGFpbnMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOiBgeyB4TGVmdDogbnVtYmVyLCB5VG9wOiBudW1iZXIgfWAuXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLmJyaWNrc2A6IFtgUGRmQnJpY2tbXWBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcGRmYnJpY2spXFxcbiAgICAgKiBBbiBhcnJheSBvZiBbYnJpY2tzXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9jdXN0b21pemUtc3VydmV5LXF1ZXN0aW9uLXJlbmRlcmluZy1pbi1wZGYtZm9ybSNjdXN0b20tcmVuZGVyaW5nKSB1c2VkIHRvIHJlbmRlciB0aGUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMuY29udHJvbGxlcmA6IFtgRG9jQ29udHJvbGxlcmBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvZG9jY29udHJvbGxlcilcXFxuICAgICAqIEFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBtYWluIFBERiBkb2N1bWVudCBwcm9wZXJ0aWVzIChmb250LCBtYXJnaW5zLCBwYWdlIHdpZHRoIGFuZCBoZWlnaHQpIGFuZCBhbGxvd3MgeW91IHRvIG1vZGlmeSB0aGVtLlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5yZXBvc2l0b3J5YDogYEZsYXRSZXBvc2l0b3J5YFxcXG4gICAgICogQSByZXBvc2l0b3J5IHdpdGggY2xhc3NlcyB0aGF0IHJlbmRlciBlbGVtZW50cyB0byBQREYuIFVzZSBpdHMgYGNyZWF0ZWAgbWV0aG9kIGlmIHlvdSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIHJlbmRlcmluZyBjbGFzcy5cbiAgICAgKlxuICAgICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9ob3ctdG8tdXNlLWFkb3JuZXJzLWluLXBkZi1mb3Jtcy8gKGxpbmtTdHlsZSkpXG4gICAgICovXG4gICAgcHVibGljIG9uUmVuZGVyUXVlc3Rpb246IEV2ZW50QXN5bmM8U3VydmV5UERGLCBBZG9ybmVyc09wdGlvbnM+ID1cbiAgICAgICAgbmV3IEV2ZW50QXN5bmM8U3VydmV5UERGLCBBZG9ybmVyc09wdGlvbnM+KCk7XG4gICAgLyoqXG4gICAgICogQW4gZXZlbnQgdGhhdCBpcyByYWlzZWQgd2hlbiBTdXJ2ZXlKUyBQREYgR2VuZXJhdG9yIHJlbmRlcnMgYSBwYW5lbC4gSGFuZGxlIHRoaXMgZXZlbnQgdG8gY3VzdG9taXplIHBhbmVsIHJlbmRlcmluZy5cbiAgICAgKlxuICAgICAqIFBhcmFtZXRlcnM6XG4gICAgICpcbiAgICAgKiAtIGBzZW5kZXJgOiBgU3VydmV5UERGYFxcXG4gICAgICogQSBTdXJ2ZXlQREYgaW5zdGFuY2UgdGhhdCByYWlzZWQgdGhlIGV2ZW50LlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5wYW5lbGA6IFtgUGFuZWxNb2RlbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9wYW5lbC1tb2RlbClcXFxuICAgICAqIEEgcGFuZWwgdGhhdCBpcyBiZWluZyByZW5kZXJlZC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMucG9pbnRgOiBgSVBvaW50YFxcXG4gICAgICogQW4gb2JqZWN0IHdpdGggY29vcmRpbmF0ZXMgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZWxlbWVudCBiZWluZyByZW5kZXJlZC4gVGhpcyBvYmplY3QgY29udGFpbnMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOiBgeyB4TGVmdDogbnVtYmVyLCB5VG9wOiBudW1iZXIgfWAuXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLmJyaWNrc2A6IFtgUGRmQnJpY2tbXWBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcGRmYnJpY2spXFxcbiAgICAgKiBBbiBhcnJheSBvZiBbYnJpY2tzXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9jdXN0b21pemUtc3VydmV5LXF1ZXN0aW9uLXJlbmRlcmluZy1pbi1wZGYtZm9ybSNjdXN0b20tcmVuZGVyaW5nKSB1c2VkIHRvIHJlbmRlciB0aGUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMuY29udHJvbGxlcmA6IFtgRG9jQ29udHJvbGxlcmBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvZG9jY29udHJvbGxlcilcXFxuICAgICAqIEFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBtYWluIFBERiBkb2N1bWVudCBwcm9wZXJ0aWVzIChmb250LCBtYXJnaW5zLCBwYWdlIHdpZHRoIGFuZCBoZWlnaHQpIGFuZCBhbGxvd3MgeW91IHRvIG1vZGlmeSB0aGVtLlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5yZXBvc2l0b3J5YDogYEZsYXRSZXBvc2l0b3J5YFxcXG4gICAgICogQSByZXBvc2l0b3J5IHdpdGggY2xhc3NlcyB0aGF0IHJlbmRlciBlbGVtZW50cyB0byBQREYuIFVzZSBpdHMgYGNyZWF0ZWAgbWV0aG9kIGlmIHlvdSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIHJlbmRlcmluZyBjbGFzcy5cbiAgICAgKlxuICAgICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9ob3ctdG8tdXNlLWFkb3JuZXJzLWluLXBkZi1mb3Jtcy8gKGxpbmtTdHlsZSkpXG4gICAgICovXG4gICAgcHVibGljIG9uUmVuZGVyUGFuZWw6IEV2ZW50QXN5bmM8U3VydmV5UERGLCBBZG9ybmVyc1BhbmVsT3B0aW9ucz4gPVxuICAgICAgICBuZXcgRXZlbnRBc3luYzxTdXJ2ZXlQREYsIEFkb3JuZXJzUGFuZWxPcHRpb25zPigpO1xuICAgIC8qKlxuICAgICAqIEFuIGV2ZW50IHRoYXQgaXMgcmFpc2VkIHdoZW4gU3VydmV5SlMgUERGIEdlbmVyYXRvciByZW5kZXJzIGEgcGFnZS4gSGFuZGxlIHRoaXMgZXZlbnQgdG8gY3VzdG9taXplIHBhZ2UgcmVuZGVyaW5nLlxuICAgICAqXG4gICAgICogUGFyYW1ldGVyczpcbiAgICAgKlxuICAgICAqIC0gYHNlbmRlcmA6IGBTdXJ2ZXlQREZgXFxcbiAgICAgKiBBIFN1cnZleVBERiBpbnN0YW5jZSB0aGF0IHJhaXNlZCB0aGUgZXZlbnQuXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLnBhZ2VgOiBbYFBhZ2VNb2RlbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9wYWdlLW1vZGVsKVxcXG4gICAgICogQSBwYWdlIHRoYXQgaXMgYmVpbmcgcmVuZGVyZWQuXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLnBvaW50YDogYElQb2ludGBcXFxuICAgICAqIEFuIG9iamVjdCB3aXRoIGNvb3JkaW5hdGVzIG9mIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGVsZW1lbnQgYmVpbmcgcmVuZGVyZWQuIFRoaXMgb2JqZWN0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczogYHsgeExlZnQ6IG51bWJlciwgeVRvcDogbnVtYmVyIH1gLlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5icmlja3NgOiBbYFBkZkJyaWNrW11gXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3BkZmJyaWNrKVxcXG4gICAgICogQW4gYXJyYXkgb2YgW2JyaWNrc10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vY3VzdG9taXplLXN1cnZleS1xdWVzdGlvbi1yZW5kZXJpbmctaW4tcGRmLWZvcm0jY3VzdG9tLXJlbmRlcmluZykgdXNlZCB0byByZW5kZXIgdGhlIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLmNvbnRyb2xsZXJgOiBbYERvY0NvbnRyb2xsZXJgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2RvY2NvbnRyb2xsZXIpXFxcbiAgICAgKiBBbiBvYmplY3QgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gbWFpbiBQREYgZG9jdW1lbnQgcHJvcGVydGllcyAoZm9udCwgbWFyZ2lucywgcGFnZSB3aWR0aCBhbmQgaGVpZ2h0KSBhbmQgYWxsb3dzIHlvdSB0byBtb2RpZnkgdGhlbS5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMucmVwb3NpdG9yeWA6IGBGbGF0UmVwb3NpdG9yeWBcXFxuICAgICAqIEEgcmVwb3NpdG9yeSB3aXRoIGNsYXNzZXMgdGhhdCByZW5kZXIgZWxlbWVudHMgdG8gUERGLiBVc2UgaXRzIGBjcmVhdGVgIG1ldGhvZCBpZiB5b3UgbmVlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSByZW5kZXJpbmcgY2xhc3MuXG4gICAgICpcbiAgICAgKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZXhhbXBsZXMvaG93LXRvLXVzZS1hZG9ybmVycy1pbi1wZGYtZm9ybXMvIChsaW5rU3R5bGUpKVxuICAgICAqL1xuICAgIHB1YmxpYyBvblJlbmRlclBhZ2U6IEV2ZW50QXN5bmM8U3VydmV5UERGLCBBZG9ybmVyc1BhZ2VPcHRpb25zPiA9XG4gICAgICAgIG5ldyBFdmVudEFzeW5jPFN1cnZleVBERiwgQWRvcm5lcnNQYWdlT3B0aW9ucz4oKTtcblxuICAgIHB1YmxpYyBvbkRvY0NvbnRyb2xsZXJDcmVhdGVkOiBFdmVudEJhc2U8U3VydmV5UERGLCB7IGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIgfT4gPSBuZXcgRXZlbnRCYXNlPFN1cnZleVBERiwge2NvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXJ9PigpO1xuXG4gICAgcHVibGljIG9uUmVuZGVyQ2hlY2tJdGVtQWNyb2Zvcm06IEV2ZW50QXN5bmM8U3VydmV5UERGLCBhbnk+ID1cbiAgICAgICAgbmV3IEV2ZW50QXN5bmM8U3VydmV5UERGLCBhbnk+KCk7XG5cbiAgICBwdWJsaWMgb25SZW5kZXJSYWRpb0dyb3VwV3JhcEFjcm9mb3JtOiBFdmVudEFzeW5jPFN1cnZleVBERiwgYW55PiA9XG4gICAgbmV3IEV2ZW50QXN5bmM8U3VydmV5UERGLCBhbnk+KCk7XG5cbiAgICBwdWJsaWMgb25SZW5kZXJSYWRpb0l0ZW1BY3JvZm9ybTogRXZlbnRBc3luYzxTdXJ2ZXlQREYsIGFueT4gPVxuICAgIG5ldyBFdmVudEFzeW5jPFN1cnZleVBERiwgYW55PigpO1xuXG4gICAgcHJpdmF0ZSB3YWl0Rm9yUXVlc3Rpb25Jc1JlYWR5KHF1ZXN0aW9uOiBRdWVzdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHF1ZXN0aW9uLmlzUmVhZHkpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkeUNhbGxiYWNrOiAoc2VuZGVyOiBRdWVzdGlvbiwgb3B0aW9uczogYW55KSA9PiB2b2lkID1cbiAgICAgICAgICAgICAgICAoXywgb3B0aW9uczogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmlzUmVhZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uLm9uUmVhZHlDaGFuZ2VkLnJlbW92ZShyZWFkeUNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcXVlc3Rpb24ub25SZWFkeUNoYW5nZWQuYWRkKHJlYWR5Q2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQ29yZUlzUmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAoY29uc3QgcXVlc3Rpb24gb2YgdGhpcy5nZXRBbGxRdWVzdGlvbnMoKSkge1xuICAgICAgICAgICAgaWYgKCEhKDxhbnk+cXVlc3Rpb24pLmNvbnRlbnRQYW5lbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3Q6IFF1ZXN0aW9uW10gPSBbXTtcbiAgICAgICAgICAgICAgICAoPGFueT5xdWVzdGlvbikuY29udGVudFBhbmVsLmFkZFF1ZXN0aW9uc1RvTGlzdChsaXN0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlubmVyUXVlc3Rpb24gb2YgbGlzdCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JRdWVzdGlvbklzUmVhZHkoaW5uZXJRdWVzdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBhd2FpdCB0aGlzLndhaXRGb3JRdWVzdGlvbklzUmVhZHkoXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmdldENvbnRlbnRRdWVzdGlvbig8UXVlc3Rpb24+cXVlc3Rpb24pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgZ2V0VXBkYXRlZENoZWNrSXRlbUFjcm9mb3JtT3B0aW9ucyhvcHRpb25zOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblJlbmRlckNoZWNrSXRlbUFjcm9mb3JtLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRVcGRhdGVkUmFkaW9Hcm91cFdyYXBPcHRpb25zKG9wdGlvbnM6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uUmVuZGVyUmFkaW9Hcm91cFdyYXBBY3JvZm9ybS5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0VXBkYXRlZFJhZGlvSXRlbUFjcm9mb3JtT3B0aW9ucyhvcHRpb25zOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblJlbmRlclJhZGlvSXRlbUFjcm9mb3JtLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHByaXZhdGUgY29ycmVjdEJyaWNrc1Bvc2l0aW9uKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGZsYXRzOiBJUGRmQnJpY2tbXVtdKSB7XG4gICAgICAgIGlmKGNvbnRyb2xsZXIuaXNSVEwpIHtcbiAgICAgICAgICAgIGZsYXRzLmZvckVhY2goZmxhdHNBcnIgPT4ge1xuICAgICAgICAgICAgICAgIGZsYXRzQXJyLmZvckVhY2goZmxhdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZsYXQudHJhbnNsYXRlWCgoeExlZnQ6IG51bWJlciwgeFJpZ2h0OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoaWZ0V2lkdGggPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLSB4TGVmdCAtIHhSaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHhMZWZ0OiB4TGVmdCArIHNoaWZ0V2lkdGgsIHhSaWdodDogeFJpZ2h0ICsgc2hpZnRXaWR0aCB9O1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyByZW5kZXJTdXJ2ZXkoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnZpc2libGVQYWdlcy5mb3JFYWNoKHBhZ2UgPT4gcGFnZS5vbkZpcnN0UmVuZGVyaW5nKCkpO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JDb3JlSXNSZWFkeSgpO1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW11bXSA9IGF3YWl0IEZsYXRTdXJ2ZXkuZ2VuZXJhdGVGbGF0cyh0aGlzLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5jb3JyZWN0QnJpY2tzUG9zaXRpb24oY29udHJvbGxlciwgZmxhdHMpO1xuICAgICAgICBjb25zdCBwYWNrczogSVBkZkJyaWNrW11bXSA9IFBhZ2VQYWNrZXIucGFjayhmbGF0cywgY29udHJvbGxlcik7XG4gICAgICAgIGF3YWl0IEV2ZW50SGFuZGxlci5wcm9jZXNzX2hlYWRlcl9ldmVudHModGhpcywgY29udHJvbGxlciwgcGFja3MpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcGFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCBwYWNrc1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyLmdldE51bWJlck9mUGFnZXMoKSA9PT0gaSkge1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmFkZFBhZ2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5zZXRQYWdlKGkpO1xuICAgICAgICAgICAgICAgIC8vZ2l6bW9zIGJyaWNrcyBib3JkZXJzIGZvciBkZWJ1Z1xuICAgICAgICAgICAgICAgIC8vIHBhY2tzW2ldW2pdLnVuZm9sZCgpLmZvckVhY2goKHJlY3Q6IElQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb250cm9sbGVyLmRvYy5zZXREcmF3Q29sb3IoJ2dyZWVuJyk7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnRyb2xsZXIuZG9jLnJlY3QoLi4uU3VydmV5SGVscGVyLmNyZWF0ZUFjcm9mb3JtUmVjdChyZWN0KSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnRyb2xsZXIuZG9jLnNldERyYXdDb2xvcignYmxhY2snKTtcbiAgICAgICAgICAgICAgICAvLyAgIH1cbiAgICAgICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhY2tzW2ldW2pdLnJlbmRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIGFzeW5jaHJvbm91cyBtZXRob2QgdGhhdCBzdGFydHMgZG93bmxvYWQgb2YgdGhlIGdlbmVyYXRlZCBQREYgZmlsZSBpbiB0aGUgd2ViIGJyb3dzZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmlsZU5hbWUgKihPcHRpb25hbCkqIEEgZmlsZSBuYW1lIHdpdGggdGhlIFwiLnBkZlwiIGV4dGVuc2lvbi4gRGVmYXVsdCB2YWx1ZTogYFwic3VydmV5X3Jlc3VsdC5wZGZcImAuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNhdmUoZmlsZU5hbWU6IHN0cmluZyA9ICdzdXJ2ZXlfcmVzdWx0LnBkZicpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBpZighU3VydmV5UERGLmN1cnJlbnRseVNhdmluZykge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciA9IG5ldyBEb2NDb250cm9sbGVyKHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLm9uRG9jQ29udHJvbGxlckNyZWF0ZWQuZmlyZSh0aGlzLCB7IGNvbnRyb2xsZXI6IGNvbnRyb2xsZXIgfSk7XG4gICAgICAgICAgICBTdXJ2ZXlQREYuY3VycmVudGx5U2F2aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5maXhGb250KGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJTdXJ2ZXkoY29udHJvbGxlcik7XG4gICAgICAgICAgICBjb25zdCBwcm9taXNlID0gY29udHJvbGxlci5kb2Muc2F2ZShmaWxlTmFtZSwgeyByZXR1cm5Qcm9taXNlOiB0cnVlIH0pO1xuICAgICAgICAgICAgcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBTdXJ2ZXlQREYuY3VycmVudGx5U2F2aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2F2ZUZ1bmMgPSBTdXJ2ZXlQREYuc2F2ZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgaWYoISFzYXZlRnVuYykge1xuICAgICAgICAgICAgICAgICAgICBzYXZlRnVuYygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTdXJ2ZXlQREYuc2F2ZVF1ZXVlLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZShmaWxlTmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBhc3luY2hyb25vdXMgbWV0aG9kIHRoYXQgYWxsb3dzIHlvdSB0byBnZXQgUERGIGNvbnRlbnQgaW4gZGlmZmVyZW50IGZvcm1hdHMuXG4gICAgICpcbiAgICAgKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZXhhbXBsZXMvY29udmVydC1wZGYtZm9ybS1ibG9iLWJhc2U2NC1yYXctcGRmLWphdmFzY3JpcHQvIChsaW5rU3R5bGUpKVxuICAgICAqXG4gICAgICogQHBhcmFtIHR5cGUgKihPcHRpb25hbCkqIE9uZSBvZiBgXCJibG9iXCJgLCBgXCJibG9idXJsXCJgLCBgXCJkYXRhdXJsc3RyaW5nXCJgLiBEbyBub3Qgc3BlY2lmeSB0aGlzIHBhcmFtZXRlciBpZiB5b3Ugd2FudCB0byBnZXQgcmF3IFBERiBjb250ZW50IGFzIGEgc3RyaW5nIHZhbHVlLlxuICAgICAqXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHJhdyh0eXBlPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciA9IG5ldyBEb2NDb250cm9sbGVyKHRoaXMub3B0aW9ucyk7XG4gICAgICAgIHRoaXMub25Eb2NDb250cm9sbGVyQ3JlYXRlZC5maXJlKHRoaXMsIHsgY29udHJvbGxlcjogY29udHJvbGxlciB9KTtcbiAgICAgICAgU3VydmV5SGVscGVyLmZpeEZvbnQoY29udHJvbGxlcik7XG4gICAgICAgIGF3YWl0IHRoaXMucmVuZGVyU3VydmV5KGNvbnRyb2xsZXIpO1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5kb2Mub3V0cHV0KHR5cGUpO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zdXJ2ZXkudHMiLCJcInVzZSBzdHJpY3RcIjtcclxuLy8gQW4gYXVnbWVudGVkIEFWTCBUcmVlIHdoZXJlIGVhY2ggbm9kZSBtYWludGFpbnMgYSBsaXN0IG9mIHJlY29yZHMgYW5kIHRoZWlyIHNlYXJjaCBpbnRlcnZhbHMuXHJcbi8vIFJlY29yZCBpcyBjb21wb3NlZCBvZiBhbiBpbnRlcnZhbCBhbmQgaXRzIHVuZGVybHlpbmcgZGF0YSwgc2VudCBieSBhIGNsaWVudC4gVGhpcyBhbGxvd3MgdGhlXHJcbi8vIGludGVydmFsIHRyZWUgdG8gaGF2ZSB0aGUgc2FtZSBpbnRlcnZhbCBpbnNlcnRlZCBtdWx0aXBsZSB0aW1lcywgYXMgbG9uZyBpdHMgZGF0YSBpcyBkaWZmZXJlbnQuXHJcbi8vIEJvdGggaW5zZXJ0aW9uIGFuZCBkZWxldGlvbiByZXF1aXJlIE8obG9nIG4pIHRpbWUuIFNlYXJjaGluZyByZXF1aXJlcyBPKGsqbG9nbikgdGltZSwgd2hlcmUgYGtgXHJcbi8vIGlzIHRoZSBudW1iZXIgb2YgaW50ZXJ2YWxzIGluIHRoZSBvdXRwdXQgbGlzdC5cclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgaXNTYW1lID0gcmVxdWlyZShcInNoYWxsb3dlcXVhbFwiKTtcclxuZnVuY3Rpb24gaGVpZ2h0KG5vZGUpIHtcclxuICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gbm9kZS5oZWlnaHQ7XHJcbiAgICB9XHJcbn1cclxudmFyIE5vZGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBOb2RlKGludGVydmFsVHJlZSwgcmVjb3JkKSB7XHJcbiAgICAgICAgdGhpcy5pbnRlcnZhbFRyZWUgPSBpbnRlcnZhbFRyZWU7XHJcbiAgICAgICAgdGhpcy5yZWNvcmRzID0gW107XHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAwO1xyXG4gICAgICAgIHRoaXMua2V5ID0gcmVjb3JkLmxvdztcclxuICAgICAgICB0aGlzLm1heCA9IHJlY29yZC5oaWdoO1xyXG4gICAgICAgIC8vIFNhdmUgdGhlIGFycmF5IG9mIGFsbCByZWNvcmRzIHdpdGggdGhlIHNhbWUga2V5IGZvciB0aGlzIG5vZGVcclxuICAgICAgICB0aGlzLnJlY29yZHMucHVzaChyZWNvcmQpO1xyXG4gICAgfVxyXG4gICAgLy8gR2V0cyB0aGUgaGlnaGVzdCByZWNvcmQuaGlnaCB2YWx1ZSBmb3IgdGhpcyBub2RlXHJcbiAgICBOb2RlLnByb3RvdHlwZS5nZXROb2RlSGlnaCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgaGlnaCA9IHRoaXMucmVjb3Jkc1swXS5oaWdoO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgdGhpcy5yZWNvcmRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJlY29yZHNbaV0uaGlnaCA+IGhpZ2gpIHtcclxuICAgICAgICAgICAgICAgIGhpZ2ggPSB0aGlzLnJlY29yZHNbaV0uaGlnaDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaGlnaDtcclxuICAgIH07XHJcbiAgICAvLyBVcGRhdGVzIGhlaWdodCB2YWx1ZSBvZiB0aGUgbm9kZS4gQ2FsbGVkIGR1cmluZyBpbnNlcnRpb24sIHJlYmFsYW5jZSwgcmVtb3ZhbFxyXG4gICAgTm9kZS5wcm90b3R5cGUudXBkYXRlSGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0KHRoaXMubGVmdCksIGhlaWdodCh0aGlzLnJpZ2h0KSkgKyAxO1xyXG4gICAgfTtcclxuICAgIC8vIFVwZGF0ZXMgdGhlIG1heCB2YWx1ZSBvZiBhbGwgdGhlIHBhcmVudHMgYWZ0ZXIgaW5zZXJ0aW5nIGludG8gYWxyZWFkeSBleGlzdGluZyBub2RlLCBhcyB3ZWxsIGFzXHJcbiAgICAvLyByZW1vdmluZyB0aGUgbm9kZSBjb21wbGV0ZWx5IG9yIHJlbW92aW5nIHRoZSByZWNvcmQgb2YgYW4gYWxyZWFkeSBleGlzdGluZyBub2RlLiBTdGFydHMgd2l0aFxyXG4gICAgLy8gdGhlIHBhcmVudCBvZiBhbiBhZmZlY3RlZCBub2RlIGFuZCBidWJibGVzIHVwIHRvIHJvb3RcclxuICAgIE5vZGUucHJvdG90eXBlLnVwZGF0ZU1heE9mUGFyZW50cyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHRoaXNIaWdoID0gdGhpcy5nZXROb2RlSGlnaCgpO1xyXG4gICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heChNYXRoLm1heCh0aGlzLmxlZnQubWF4LCB0aGlzLnJpZ2h0Lm1heCksIHRoaXNIaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgodGhpcy5sZWZ0Lm1heCwgdGhpc0hpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heCh0aGlzLnJpZ2h0Lm1heCwgdGhpc0hpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSB0aGlzSGlnaDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50LnVwZGF0ZU1heE9mUGFyZW50cygpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICAvKlxyXG4gICAgTGVmdC1MZWZ0IGNhc2U6XHJcbiAgXHJcbiAgICAgICAgICAgeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeVxyXG4gICAgICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAgIFxcXHJcbiAgICAgICAgIHkgICBUNCAgICAgIFJpZ2h0IFJvdGF0ZSAoeikgICAgICAgICAgeCAgICAgelxyXG4gICAgICAgIC8gXFwgICAgICAgICAgLSAtIC0gLSAtIC0gLSAtIC0+ICAgICAgIC8gXFwgICAvIFxcXHJcbiAgICAgICB4ICAgVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxIFQyIFQzIFQ0XHJcbiAgICAgIC8gXFxcclxuICAgIFQxICAgVDJcclxuICBcclxuICAgIExlZnQtUmlnaHQgY2FzZTpcclxuICBcclxuICAgICAgICAgeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgeFxyXG4gICAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAvICAgXFxcclxuICAgICAgIHkgICBUNCAgTGVmdCBSb3RhdGUgKHkpICAgICAgICAgeCAgVDQgIFJpZ2h0IFJvdGF0ZSh6KSAgICAgeSAgICAgelxyXG4gICAgICAvIFxcICAgICAgLSAtIC0gLSAtIC0gLSAtIC0+ICAgICAvIFxcICAgICAgLSAtIC0gLSAtIC0gLSAtPiAgLyBcXCAgIC8gXFxcclxuICAgIFQxICAgeCAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgIFQzICAgICAgICAgICAgICAgICAgICAgIFQxIFQyIFQzIFQ0XHJcbiAgICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAvIFxcXHJcbiAgICAgIFQyICAgVDMgICAgICAgICAgICAgICAgICAgICAgVDEgVDJcclxuICAgICovXHJcbiAgICAvLyBIYW5kbGVzIExlZnQtTGVmdCBjYXNlIGFuZCBMZWZ0LVJpZ2h0IGNhc2UgYWZ0ZXIgcmViYWxhbmNpbmcgQVZMIHRyZWVcclxuICAgIE5vZGUucHJvdG90eXBlLl91cGRhdGVNYXhBZnRlclJpZ2h0Um90YXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcclxuICAgICAgICB2YXIgbGVmdCA9IHBhcmVudC5sZWZ0O1xyXG4gICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgbGVmdCBzaWJsaW5nICh4IGluIGZpcnN0IGNhc2UsIHkgaW4gc2Vjb25kKVxyXG4gICAgICAgIHZhciB0aGlzUGFyZW50TGVmdEhpZ2ggPSBsZWZ0LmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgaWYgKGxlZnQubGVmdCA9PT0gdW5kZWZpbmVkICYmIGxlZnQucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZWZ0Lm1heCA9IE1hdGgubWF4KHRoaXNQYXJlbnRMZWZ0SGlnaCwgbGVmdC5yaWdodC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChsZWZ0LmxlZnQgIT09IHVuZGVmaW5lZCAmJiBsZWZ0LnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbGVmdC5tYXggPSBNYXRoLm1heCh0aGlzUGFyZW50TGVmdEhpZ2gsIGxlZnQubGVmdC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChsZWZ0LmxlZnQgPT09IHVuZGVmaW5lZCAmJiBsZWZ0LnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbGVmdC5tYXggPSB0aGlzUGFyZW50TGVmdEhpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZWZ0Lm1heCA9IE1hdGgubWF4KE1hdGgubWF4KGxlZnQubGVmdC5tYXgsIGxlZnQucmlnaHQubWF4KSwgdGhpc1BhcmVudExlZnRIaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVXBkYXRlIG1heCBvZiBpdHNlbGYgKHopXHJcbiAgICAgICAgdmFyIHRoaXNIaWdoID0gdGhpcy5nZXROb2RlSGlnaCgpO1xyXG4gICAgICAgIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heCh0aGlzSGlnaCwgdGhpcy5yaWdodC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heCh0aGlzSGlnaCwgdGhpcy5sZWZ0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IHRoaXNIaWdoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heChNYXRoLm1heCh0aGlzLmxlZnQubWF4LCB0aGlzLnJpZ2h0Lm1heCksIHRoaXNIaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVXBkYXRlIG1heCBvZiBwYXJlbnQgKHkgaW4gZmlyc3QgY2FzZSwgeCBpbiBzZWNvbmQpXHJcbiAgICAgICAgcGFyZW50Lm1heCA9IE1hdGgubWF4KE1hdGgubWF4KHBhcmVudC5sZWZ0Lm1heCwgcGFyZW50LnJpZ2h0Lm1heCksIHBhcmVudC5nZXROb2RlSGlnaCgpKTtcclxuICAgIH07XHJcbiAgICAvKlxyXG4gICAgUmlnaHQtUmlnaHQgY2FzZTpcclxuICBcclxuICAgICAgeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5XHJcbiAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICAgXFxcclxuICAgIFQxICB5ICAgICBMZWZ0IFJvdGF0ZSh6KSAgICAgICB6ICAgICB4XHJcbiAgICAgICAvIFxcICAgLSAtIC0gLSAtIC0gLSAtPiAgICAgLyBcXCAgIC8gXFxcclxuICAgICAgVDIgIHggICAgICAgICAgICAgICAgICAgICAgVDEgVDIgVDMgVDRcclxuICAgICAgICAgLyBcXFxyXG4gICAgICAgIFQzIFQ0XHJcbiAgXHJcbiAgICBSaWdodC1MZWZ0IGNhc2U6XHJcbiAgXHJcbiAgICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogICAgICAgICAgICAgICAgICAgICAgICAgICAgeFxyXG4gICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgIC8gICBcXFxyXG4gICAgIFQxICB5ICAgUmlnaHQgUm90YXRlICh5KSAgICAgVDEgIHggICAgICBMZWZ0IFJvdGF0ZSh6KSAgIHogICAgIHlcclxuICAgICAgICAvIFxcICAtIC0gLSAtIC0gLSAtIC0gLT4gICAgICAvIFxcICAgLSAtIC0gLSAtIC0gLSAtPiAgLyBcXCAgIC8gXFxcclxuICAgICAgIHggIFQ0ICAgICAgICAgICAgICAgICAgICAgICAgVDIgIHkgICAgICAgICAgICAgICAgICAgVDEgVDIgVDMgVDRcclxuICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gXFxcclxuICAgIFQyICAgVDMgICAgICAgICAgICAgICAgICAgICAgICAgICBUMyBUNFxyXG4gICAgKi9cclxuICAgIC8vIEhhbmRsZXMgUmlnaHQtUmlnaHQgY2FzZSBhbmQgUmlnaHQtTGVmdCBjYXNlIGluIHJlYmFsYW5jaW5nIEFWTCB0cmVlXHJcbiAgICBOb2RlLnByb3RvdHlwZS5fdXBkYXRlTWF4QWZ0ZXJMZWZ0Um90YXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcclxuICAgICAgICB2YXIgcmlnaHQgPSBwYXJlbnQucmlnaHQ7XHJcbiAgICAgICAgLy8gVXBkYXRlIG1heCBvZiByaWdodCBzaWJsaW5nICh4IGluIGZpcnN0IGNhc2UsIHkgaW4gc2Vjb25kKVxyXG4gICAgICAgIHZhciB0aGlzUGFyZW50UmlnaHRIaWdoID0gcmlnaHQuZ2V0Tm9kZUhpZ2goKTtcclxuICAgICAgICBpZiAocmlnaHQubGVmdCA9PT0gdW5kZWZpbmVkICYmIHJpZ2h0LnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmlnaHQubWF4ID0gTWF0aC5tYXgodGhpc1BhcmVudFJpZ2h0SGlnaCwgcmlnaHQucmlnaHQubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocmlnaHQubGVmdCAhPT0gdW5kZWZpbmVkICYmIHJpZ2h0LnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmlnaHQubWF4ID0gTWF0aC5tYXgodGhpc1BhcmVudFJpZ2h0SGlnaCwgcmlnaHQubGVmdC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyaWdodC5sZWZ0ID09PSB1bmRlZmluZWQgJiYgcmlnaHQucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByaWdodC5tYXggPSB0aGlzUGFyZW50UmlnaHRIaWdoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmlnaHQubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgocmlnaHQubGVmdC5tYXgsIHJpZ2h0LnJpZ2h0Lm1heCksIHRoaXNQYXJlbnRSaWdodEhpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIGl0c2VsZiAoeilcclxuICAgICAgICB2YXIgdGhpc0hpZ2ggPSB0aGlzLmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXNIaWdoLCB0aGlzLnJpZ2h0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXNIaWdoLCB0aGlzLmxlZnQubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gdGhpc0hpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KE1hdGgubWF4KHRoaXMubGVmdC5tYXgsIHRoaXMucmlnaHQubWF4KSwgdGhpc0hpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIHBhcmVudCAoeSBpbiBmaXJzdCBjYXNlLCB4IGluIHNlY29uZClcclxuICAgICAgICBwYXJlbnQubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgocGFyZW50LmxlZnQubWF4LCByaWdodC5tYXgpLCBwYXJlbnQuZ2V0Tm9kZUhpZ2goKSk7XHJcbiAgICB9O1xyXG4gICAgTm9kZS5wcm90b3R5cGUuX2xlZnRSb3RhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHJpZ2h0Q2hpbGQgPSB0aGlzLnJpZ2h0O1xyXG4gICAgICAgIHJpZ2h0Q2hpbGQucGFyZW50ID0gdGhpcy5wYXJlbnQ7XHJcbiAgICAgICAgaWYgKHJpZ2h0Q2hpbGQucGFyZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnRlcnZhbFRyZWUucm9vdCA9IHJpZ2h0Q2hpbGQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocmlnaHRDaGlsZC5wYXJlbnQubGVmdCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgcmlnaHRDaGlsZC5wYXJlbnQubGVmdCA9IHJpZ2h0Q2hpbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAocmlnaHRDaGlsZC5wYXJlbnQucmlnaHQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIHJpZ2h0Q2hpbGQucGFyZW50LnJpZ2h0ID0gcmlnaHRDaGlsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHRDaGlsZC5sZWZ0O1xyXG4gICAgICAgIGlmICh0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5yaWdodC5wYXJlbnQgPSB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICByaWdodENoaWxkLmxlZnQgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMucGFyZW50ID0gcmlnaHRDaGlsZDtcclxuICAgICAgICB0aGlzLnVwZGF0ZUhlaWdodCgpO1xyXG4gICAgICAgIHJpZ2h0Q2hpbGQudXBkYXRlSGVpZ2h0KCk7XHJcbiAgICB9O1xyXG4gICAgTm9kZS5wcm90b3R5cGUuX3JpZ2h0Um90YXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBsZWZ0Q2hpbGQgPSB0aGlzLmxlZnQ7XHJcbiAgICAgICAgbGVmdENoaWxkLnBhcmVudCA9IHRoaXMucGFyZW50O1xyXG4gICAgICAgIGlmIChsZWZ0Q2hpbGQucGFyZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnRlcnZhbFRyZWUucm9vdCA9IGxlZnRDaGlsZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChsZWZ0Q2hpbGQucGFyZW50LmxlZnQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIGxlZnRDaGlsZC5wYXJlbnQubGVmdCA9IGxlZnRDaGlsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChsZWZ0Q2hpbGQucGFyZW50LnJpZ2h0ID09PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICBsZWZ0Q2hpbGQucGFyZW50LnJpZ2h0ID0gbGVmdENoaWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGVmdCA9IGxlZnRDaGlsZC5yaWdodDtcclxuICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5sZWZ0LnBhcmVudCA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxlZnRDaGlsZC5yaWdodCA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBsZWZ0Q2hpbGQ7XHJcbiAgICAgICAgdGhpcy51cGRhdGVIZWlnaHQoKTtcclxuICAgICAgICBsZWZ0Q2hpbGQudXBkYXRlSGVpZ2h0KCk7XHJcbiAgICB9O1xyXG4gICAgLy8gUmViYWxhbmNlcyB0aGUgdHJlZSBpZiB0aGUgaGVpZ2h0IHZhbHVlIGJldHdlZW4gdHdvIG5vZGVzIG9mIHRoZSBzYW1lIHBhcmVudCBpcyBncmVhdGVyIHRoYW5cclxuICAgIC8vIHR3by4gVGhlcmUgYXJlIDQgY2FzZXMgdGhhdCBjYW4gaGFwcGVuIHdoaWNoIGFyZSBvdXRsaW5lZCBpbiB0aGUgZ3JhcGhpY3MgYWJvdmVcclxuICAgIE5vZGUucHJvdG90eXBlLl9yZWJhbGFuY2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKGhlaWdodCh0aGlzLmxlZnQpID49IDIgKyBoZWlnaHQodGhpcy5yaWdodCkpIHtcclxuICAgICAgICAgICAgdmFyIGxlZnQgPSB0aGlzLmxlZnQ7XHJcbiAgICAgICAgICAgIGlmIChoZWlnaHQobGVmdC5sZWZ0KSA+PSBoZWlnaHQobGVmdC5yaWdodCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIExlZnQtTGVmdCBjYXNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yaWdodFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlTWF4QWZ0ZXJSaWdodFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gTGVmdC1SaWdodCBjYXNlXHJcbiAgICAgICAgICAgICAgICBsZWZ0Ll9sZWZ0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yaWdodFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlTWF4QWZ0ZXJSaWdodFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGhlaWdodCh0aGlzLnJpZ2h0KSA+PSAyICsgaGVpZ2h0KHRoaXMubGVmdCkpIHtcclxuICAgICAgICAgICAgdmFyIHJpZ2h0ID0gdGhpcy5yaWdodDtcclxuICAgICAgICAgICAgaWYgKGhlaWdodChyaWdodC5yaWdodCkgPj0gaGVpZ2h0KHJpZ2h0LmxlZnQpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBSaWdodC1SaWdodCBjYXNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sZWZ0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVNYXhBZnRlckxlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIFJpZ2h0LUxlZnQgY2FzZVxyXG4gICAgICAgICAgICAgICAgcmlnaHQuX3JpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sZWZ0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVNYXhBZnRlckxlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAocmVjb3JkKSB7XHJcbiAgICAgICAgaWYgKHJlY29yZC5sb3cgPCB0aGlzLmtleSkge1xyXG4gICAgICAgICAgICAvLyBJbnNlcnQgaW50byBsZWZ0IHN1YnRyZWVcclxuICAgICAgICAgICAgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxlZnQgPSBuZXcgTm9kZSh0aGlzLmludGVydmFsVHJlZSwgcmVjb3JkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGVmdC5wYXJlbnQgPSB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sZWZ0Lmluc2VydChyZWNvcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBJbnNlcnQgaW50byByaWdodCBzdWJ0cmVlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmlnaHQgPSBuZXcgTm9kZSh0aGlzLmludGVydmFsVHJlZSwgcmVjb3JkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmlnaHQucGFyZW50ID0gdGhpcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmlnaHQuaW5zZXJ0KHJlY29yZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBtYXggdmFsdWUgb2YgdGhpcyBhbmNlc3RvciBpZiBuZWVkZWRcclxuICAgICAgICBpZiAodGhpcy5tYXggPCByZWNvcmQuaGlnaCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IHJlY29yZC5oaWdoO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgaGVpZ2h0IG9mIGVhY2ggbm9kZVxyXG4gICAgICAgIHRoaXMudXBkYXRlSGVpZ2h0KCk7XHJcbiAgICAgICAgLy8gUmViYWxhbmNlIHRoZSB0cmVlIHRvIGVuc3VyZSBhbGwgb3BlcmF0aW9ucyBhcmUgZXhlY3V0ZWQgaW4gTyhsb2duKSB0aW1lLiBUaGlzIGlzIGVzcGVjaWFsbHlcclxuICAgICAgICAvLyBpbXBvcnRhbnQgaW4gc2VhcmNoaW5nLCBhcyB0aGUgdHJlZSBoYXMgYSBoaWdoIGNoYW5jZSBvZiBkZWdlbmVyYXRpbmcgd2l0aG91dCB0aGUgcmViYWxhbmNpbmdcclxuICAgICAgICB0aGlzLl9yZWJhbGFuY2UoKTtcclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5fZ2V0T3ZlcmxhcHBpbmdSZWNvcmRzID0gZnVuY3Rpb24gKGN1cnJlbnROb2RlLCBsb3csIGhpZ2gpIHtcclxuICAgICAgICBpZiAoY3VycmVudE5vZGUua2V5IDw9IGhpZ2ggJiYgbG93IDw9IGN1cnJlbnROb2RlLmdldE5vZGVIaWdoKCkpIHtcclxuICAgICAgICAgICAgLy8gTm9kZXMgYXJlIG92ZXJsYXBwaW5nLCBjaGVjayBpZiBpbmRpdmlkdWFsIHJlY29yZHMgaW4gdGhlIG5vZGUgYXJlIG92ZXJsYXBwaW5nXHJcbiAgICAgICAgICAgIHZhciB0ZW1wUmVzdWx0cyA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1cnJlbnROb2RlLnJlY29yZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5yZWNvcmRzW2ldLmhpZ2ggPj0gbG93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcFJlc3VsdHMucHVzaChjdXJyZW50Tm9kZS5yZWNvcmRzW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGVtcFJlc3VsdHM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5zZWFyY2ggPSBmdW5jdGlvbiAobG93LCBoaWdoKSB7XHJcbiAgICAgICAgLy8gRG9uJ3Qgc2VhcmNoIG5vZGVzIHRoYXQgZG9uJ3QgZXhpc3RcclxuICAgICAgICBpZiAodGhpcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGxlZnRTZWFyY2ggPSBbXTtcclxuICAgICAgICB2YXIgb3duU2VhcmNoID0gW107XHJcbiAgICAgICAgdmFyIHJpZ2h0U2VhcmNoID0gW107XHJcbiAgICAgICAgLy8gSWYgaW50ZXJ2YWwgaXMgdG8gdGhlIHJpZ2h0IG9mIHRoZSByaWdodG1vc3QgcG9pbnQgb2YgYW55IGludGVydmFsIGluIHRoaXMgbm9kZSBhbmQgYWxsIGl0c1xyXG4gICAgICAgIC8vIGNoaWxkcmVuLCB0aGVyZSB3b24ndCBiZSBhbnkgbWF0Y2hlc1xyXG4gICAgICAgIGlmIChsb3cgPiB0aGlzLm1heCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNlYXJjaCBsZWZ0IGNoaWxkcmVuXHJcbiAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMubGVmdC5tYXggPj0gbG93KSB7XHJcbiAgICAgICAgICAgIGxlZnRTZWFyY2ggPSB0aGlzLmxlZnQuc2VhcmNoKGxvdywgaGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIENoZWNrIHRoaXMgbm9kZVxyXG4gICAgICAgIG93blNlYXJjaCA9IHRoaXMuX2dldE92ZXJsYXBwaW5nUmVjb3Jkcyh0aGlzLCBsb3csIGhpZ2gpO1xyXG4gICAgICAgIC8vIElmIGludGVydmFsIGlzIHRvIHRoZSBsZWZ0IG9mIHRoZSBzdGFydCBvZiB0aGlzIGludGVydmFsLCB0aGVuIGl0IGNhbid0IGJlIGluIGFueSBjaGlsZCB0b1xyXG4gICAgICAgIC8vIHRoZSByaWdodFxyXG4gICAgICAgIGlmIChoaWdoIDwgdGhpcy5rZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxlZnRTZWFyY2guY29uY2F0KG93blNlYXJjaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE90aGVyd2lzZSwgc2VhcmNoIHJpZ2h0IGNoaWxkcmVuXHJcbiAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByaWdodFNlYXJjaCA9IHRoaXMucmlnaHQuc2VhcmNoKGxvdywgaGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFJldHVybiBhY2N1bXVsYXRlZCByZXN1bHRzLCBpZiBhbnlcclxuICAgICAgICByZXR1cm4gbGVmdFNlYXJjaC5jb25jYXQob3duU2VhcmNoLCByaWdodFNlYXJjaCk7XHJcbiAgICB9O1xyXG4gICAgLy8gU2VhcmNoZXMgZm9yIGEgbm9kZSBieSBhIGBrZXlgIHZhbHVlXHJcbiAgICBOb2RlLnByb3RvdHlwZS5zZWFyY2hFeGlzdGluZyA9IGZ1bmN0aW9uIChsb3cpIHtcclxuICAgICAgICBpZiAodGhpcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmtleSA9PT0gbG93KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChsb3cgPCB0aGlzLmtleSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnQuc2VhcmNoRXhpc3RpbmcobG93KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmlnaHQuc2VhcmNoRXhpc3RpbmcobG93KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfTtcclxuICAgIC8vIFJldHVybnMgdGhlIHNtYWxsZXN0IG5vZGUgb2YgdGhlIHN1YnRyZWVcclxuICAgIE5vZGUucHJvdG90eXBlLl9taW5WYWx1ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sZWZ0Ll9taW5WYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcclxuICAgICAgICBpZiAobm9kZS5rZXkgPCB0aGlzLmtleSkge1xyXG4gICAgICAgICAgICAvLyBOb2RlIHRvIGJlIHJlbW92ZWQgaXMgb24gdGhlIGxlZnQgc2lkZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnQucmVtb3ZlKG5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChub2RlLmtleSA+IHRoaXMua2V5KSB7XHJcbiAgICAgICAgICAgIC8vIE5vZGUgdG8gYmUgcmVtb3ZlZCBpcyBvbiB0aGUgcmlnaHQgc2lkZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodC5yZW1vdmUobm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBOb2RlIGhhcyB0d28gY2hpbGRyZW5cclxuICAgICAgICAgICAgICAgIHZhciBtaW5WYWx1ZSA9IHRoaXMucmlnaHQuX21pblZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmtleSA9IG1pblZhbHVlLmtleTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVjb3JkcyA9IG1pblZhbHVlLnJlY29yZHM7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodC5yZW1vdmUodGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAocGFyZW50LmxlZnQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIC8vIE9uZSBjaGlsZCBvciBubyBjaGlsZCBjYXNlIG9uIGxlZnQgc2lkZVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5sZWZ0ID0gdGhpcy5yaWdodDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0LnBhcmVudCA9IHBhcmVudDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5sZWZ0ID0gdGhpcy5sZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxlZnQucGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHBhcmVudC51cGRhdGVNYXhPZlBhcmVudHMoKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudC51cGRhdGVIZWlnaHQoKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudC5fcmViYWxhbmNlKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChwYXJlbnQucmlnaHQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIC8vIE9uZSBjaGlsZCBvciBubyBjaGlsZCBjYXNlIG9uIHJpZ2h0IHNpZGVcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQucmlnaHQgPSB0aGlzLnJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmlnaHQucGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50LnJpZ2h0ID0gdGhpcy5sZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxlZnQucGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHBhcmVudC51cGRhdGVNYXhPZlBhcmVudHMoKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudC51cGRhdGVIZWlnaHQoKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudC5fcmViYWxhbmNlKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXR1cm4gTm9kZTtcclxufSgpKTtcclxuZXhwb3J0cy5Ob2RlID0gTm9kZTtcclxudmFyIEludGVydmFsVHJlZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIEludGVydmFsVHJlZSgpIHtcclxuICAgICAgICB0aGlzLmNvdW50ID0gMDtcclxuICAgIH1cclxuICAgIEludGVydmFsVHJlZS5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gKHJlY29yZCkge1xyXG4gICAgICAgIGlmIChyZWNvcmQubG93ID4gcmVjb3JkLmhpZ2gpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdgbG93YCB2YWx1ZSBtdXN0IGJlIGxvd2VyIG9yIGVxdWFsIHRvIGBoaWdoYCB2YWx1ZScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5yb290ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8gQmFzZSBjYXNlOiBUcmVlIGlzIGVtcHR5LCBuZXcgbm9kZSBiZWNvbWVzIHJvb3RcclxuICAgICAgICAgICAgdGhpcy5yb290ID0gbmV3IE5vZGUodGhpcywgcmVjb3JkKTtcclxuICAgICAgICAgICAgdGhpcy5jb3VudCsrO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgY2hlY2sgaWYgbm9kZSBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBzYW1lIGtleVxyXG4gICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMucm9vdC5zZWFyY2hFeGlzdGluZyhyZWNvcmQubG93KTtcclxuICAgICAgICAgICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlY29yZHMgaW4gdGhpcyBub2RlIGlmIHRoZXJlIGFscmVhZHkgaXMgdGhlIG9uZSB3aXRoIHNhbWUgbG93LCBoaWdoLCBkYXRhXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUucmVjb3Jkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1NhbWUobm9kZS5yZWNvcmRzW2ldLCByZWNvcmQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgcmVjb3JkIGlzIHNhbWUgYXMgdGhlIG9uZSB3ZSdyZSB0cnlpbmcgdG8gaW5zZXJ0OyByZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBoYXMgYmVlbiBpbnNlcnRlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSByZWNvcmQgdG8gdGhlIG5vZGVcclxuICAgICAgICAgICAgICAgIG5vZGUucmVjb3Jkcy5wdXNoKHJlY29yZCk7XHJcbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIHRoZSBub2RlIGFuZCBpdHMgcGFyZW50cyBpZiBuZWNlc3NhcnlcclxuICAgICAgICAgICAgICAgIGlmIChyZWNvcmQuaGlnaCA+IG5vZGUubWF4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXggPSByZWNvcmQuaGlnaDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQudXBkYXRlTWF4T2ZQYXJlbnRzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBOb2RlIHdpdGggdGhpcyBrZXkgZG9lc24ndCBhbHJlYWR5IGV4aXN0LiBDYWxsIGluc2VydCBmdW5jdGlvbiBvbiByb290J3Mgbm9kZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yb290Lmluc2VydChyZWNvcmQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5zZWFyY2ggPSBmdW5jdGlvbiAobG93LCBoaWdoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vIFRyZWUgaXMgZW1wdHk7IHJldHVybiBlbXB0eSBhcnJheVxyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290LnNlYXJjaChsb3csIGhpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBJbnRlcnZhbFRyZWUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChyZWNvcmQpIHtcclxuICAgICAgICBpZiAodGhpcy5yb290ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8gVHJlZSBpcyBlbXB0eTsgbm90aGluZyB0byByZW1vdmVcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzLnJvb3Quc2VhcmNoRXhpc3RpbmcocmVjb3JkLmxvdyk7XHJcbiAgICAgICAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChub2RlLnJlY29yZHMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlbW92ZWRSZWNvcmQgPSB2b2lkIDA7XHJcbiAgICAgICAgICAgICAgICAvLyBOb2RlIHdpdGggdGhpcyBrZXkgaGFzIDIgb3IgbW9yZSByZWNvcmRzLiBGaW5kIHRoZSBvbmUgd2UgbmVlZCBhbmQgcmVtb3ZlIGl0XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUucmVjb3Jkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1NhbWUobm9kZS5yZWNvcmRzW2ldLCByZWNvcmQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWRSZWNvcmQgPSBub2RlLnJlY29yZHNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucmVjb3Jkcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChyZW1vdmVkUmVjb3JkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZFJlY29yZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIHRoYXQgbm9kZSBhbmQgaXRzIHBhcmVudHMgaWYgbmVjZXNzYXJ5XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZC5oaWdoID09PSBub2RlLm1heCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZUhpZ2ggPSBub2RlLmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmxlZnQgIT09IHVuZGVmaW5lZCAmJiBub2RlLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgobm9kZS5sZWZ0Lm1heCwgbm9kZS5yaWdodC5tYXgpLCBub2RlSGlnaCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgbm9kZS5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm1heCA9IE1hdGgubWF4KG5vZGUubGVmdC5tYXgsIG5vZGVIaWdoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlLmxlZnQgPT09IHVuZGVmaW5lZCAmJiBub2RlLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubWF4ID0gTWF0aC5tYXgobm9kZS5yaWdodC5tYXgsIG5vZGVIaWdoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubWF4ID0gbm9kZUhpZ2g7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnBhcmVudC51cGRhdGVNYXhPZlBhcmVudHMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50LS07XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5yZWNvcmRzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgLy8gTm9kZSB3aXRoIHRoaXMga2V5IGhhcyBvbmx5IDEgcmVjb3JkLiBDaGVjayBpZiB0aGUgcmVtYWluaW5nIHJlY29yZCBpbiB0aGlzIG5vZGUgaXNcclxuICAgICAgICAgICAgICAgIC8vIGFjdHVhbGx5IHRoZSBvbmUgd2Ugd2FudCB0byByZW1vdmVcclxuICAgICAgICAgICAgICAgIGlmIChpc1NhbWUobm9kZS5yZWNvcmRzWzBdLCByZWNvcmQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlbWFpbmluZyByZWNvcmQgaXMgdGhlIG9uZSB3ZSB3YW50IHRvIHJlbW92ZS4gUmVtb3ZlIHRoZSB3aG9sZSBub2RlIGZyb20gdGhlIHRyZWVcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yb290LmtleSA9PT0gbm9kZS5rZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgcmVtb3ZpbmcgdGhlIHJvb3QgZWxlbWVudC4gQ3JlYXRlIGEgZHVtbXkgbm9kZSB0aGF0IHdpbGwgdGVtcG9yYXJpbHkgdGFrZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByb290J3MgcGFyZW50IHJvbGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvb3RQYXJlbnQgPSBuZXcgTm9kZSh0aGlzLCB7IGxvdzogcmVjb3JkLmxvdywgaGlnaDogcmVjb3JkLmxvdyB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFBhcmVudC5sZWZ0ID0gdGhpcy5yb290O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3QucGFyZW50ID0gcm9vdFBhcmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbW92ZWROb2RlID0gdGhpcy5yb290LnJlbW92ZShub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290ID0gcm9vdFBhcmVudC5sZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yb290ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdC5wYXJlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZWROb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkTm9kZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnQtLTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlZE5vZGUgPSB0aGlzLnJvb3QucmVtb3ZlKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3ZlZE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWROb2RlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudC0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVtYWluaW5nIHJlY29yZCBpcyBub3QgdGhlIG9uZSB3ZSB3YW50IHRvIHJlbW92ZVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIE5vIHJlY29yZHMgYXQgYWxsIGluIHRoaXMgbm9kZT8hIFNob3VsZG4ndCBoYXBwZW5cclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBJbnRlcnZhbFRyZWUucHJvdG90eXBlLmluT3JkZXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBJbk9yZGVyKHRoaXMucm9vdCk7XHJcbiAgICB9O1xyXG4gICAgSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5wcmVPcmRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByZU9yZGVyKHRoaXMucm9vdCk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIEludGVydmFsVHJlZTtcclxufSgpKTtcclxuZXhwb3J0cy5JbnRlcnZhbFRyZWUgPSBJbnRlcnZhbFRyZWU7XHJcbnZhciBEYXRhSW50ZXJ2YWxUcmVlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gRGF0YUludGVydmFsVHJlZSgpIHtcclxuICAgICAgICB0aGlzLnRyZWUgPSBuZXcgSW50ZXJ2YWxUcmVlKCk7XHJcbiAgICB9XHJcbiAgICBEYXRhSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAobG93LCBoaWdoLCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZS5pbnNlcnQoeyBsb3c6IGxvdywgaGlnaDogaGlnaCwgZGF0YTogZGF0YSB9KTtcclxuICAgIH07XHJcbiAgICBEYXRhSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAobG93LCBoaWdoLCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZS5yZW1vdmUoeyBsb3c6IGxvdywgaGlnaDogaGlnaCwgZGF0YTogZGF0YSB9KTtcclxuICAgIH07XHJcbiAgICBEYXRhSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5zZWFyY2ggPSBmdW5jdGlvbiAobG93LCBoaWdoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZS5zZWFyY2gobG93LCBoaWdoKS5tYXAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYuZGF0YTsgfSk7XHJcbiAgICB9O1xyXG4gICAgRGF0YUludGVydmFsVHJlZS5wcm90b3R5cGUuaW5PcmRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLmluT3JkZXIoKTtcclxuICAgIH07XHJcbiAgICBEYXRhSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5wcmVPcmRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLnByZU9yZGVyKCk7XHJcbiAgICB9O1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLCBcImNvdW50XCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJlZS5jb3VudDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBEYXRhSW50ZXJ2YWxUcmVlO1xyXG59KCkpO1xyXG5leHBvcnRzLmRlZmF1bHQgPSBEYXRhSW50ZXJ2YWxUcmVlO1xyXG52YXIgSW5PcmRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIEluT3JkZXIoc3RhcnROb2RlKSB7XHJcbiAgICAgICAgdGhpcy5zdGFjayA9IFtdO1xyXG4gICAgICAgIGlmIChzdGFydE5vZGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnB1c2goc3RhcnROb2RlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBJbk9yZGVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vIFdpbGwgb25seSBoYXBwZW4gaWYgc3RhY2sgaXMgZW1wdHkgYW5kIHBvcCBpcyBjYWxsZWRcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkb25lOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUHJvY2VzcyB0aGlzIG5vZGVcclxuICAgICAgICBpZiAodGhpcy5pIDwgdGhpcy5jdXJyZW50Tm9kZS5yZWNvcmRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZG9uZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5jdXJyZW50Tm9kZS5yZWNvcmRzW3RoaXMuaSsrXSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnB1c2godGhpcy5jdXJyZW50Tm9kZS5yaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBNaWdodCBwb3AgdGhlIGxhc3QgYW5kIHNldCB0aGlzLmN1cnJlbnROb2RlID0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIHRoaXMucG9wKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLm5leHQoKTtcclxuICAgIH07XHJcbiAgICBJbk9yZGVyLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gbm9kZTtcclxuICAgICAgICB0aGlzLmkgPSAwO1xyXG4gICAgICAgIHdoaWxlICh0aGlzLmN1cnJlbnROb2RlLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2godGhpcy5jdXJyZW50Tm9kZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmN1cnJlbnROb2RlLmxlZnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEluT3JkZXIucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5zdGFjay5wb3AoKTtcclxuICAgICAgICB0aGlzLmkgPSAwO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBJbk9yZGVyO1xyXG59KCkpO1xyXG5leHBvcnRzLkluT3JkZXIgPSBJbk9yZGVyO1xyXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgSW5PcmRlci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XHJcbn1cclxudmFyIFByZU9yZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gUHJlT3JkZXIoc3RhcnROb2RlKSB7XHJcbiAgICAgICAgdGhpcy5zdGFjayA9IFtdO1xyXG4gICAgICAgIHRoaXMuaSA9IDA7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHN0YXJ0Tm9kZTtcclxuICAgIH1cclxuICAgIFByZU9yZGVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vIFdpbGwgb25seSBoYXBwZW4gaWYgc3RhY2sgaXMgZW1wdHkgYW5kIHBvcCBpcyBjYWxsZWQsXHJcbiAgICAgICAgLy8gd2hpY2ggb25seSBoYXBwZW5zIGlmIHRoZXJlIGlzIG5vIHJpZ2h0IG5vZGUgKGkuZSB3ZSBhcmUgZG9uZSlcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkb25lOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUHJvY2VzcyB0aGlzIG5vZGVcclxuICAgICAgICBpZiAodGhpcy5pIDwgdGhpcy5jdXJyZW50Tm9kZS5yZWNvcmRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZG9uZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5jdXJyZW50Tm9kZS5yZWNvcmRzW3RoaXMuaSsrXSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnB1c2godGhpcy5jdXJyZW50Tm9kZS5yaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnB1c2godGhpcy5jdXJyZW50Tm9kZS5sZWZ0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wb3AoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KCk7XHJcbiAgICB9O1xyXG4gICAgUHJlT3JkZXIucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIHRoaXMuc3RhY2sucHVzaChub2RlKTtcclxuICAgIH07XHJcbiAgICBQcmVPcmRlci5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLnN0YWNrLnBvcCgpO1xyXG4gICAgICAgIHRoaXMuaSA9IDA7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIFByZU9yZGVyO1xyXG59KCkpO1xyXG5leHBvcnRzLlByZU9yZGVyID0gUHJlT3JkZXI7XHJcbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICBQcmVPcmRlci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XHJcbn1cclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L25vZGUtaW50ZXJ2YWwtdHJlZS9saWIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDU2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIsIGNvbXBhcmUsIGNvbXBhcmVDb250ZXh0KSB7XG4gIHZhciByZXQgPSBjb21wYXJlID8gY29tcGFyZS5jYWxsKGNvbXBhcmVDb250ZXh0LCBvYmpBLCBvYmpCKSA6IHZvaWQgMDtcblxuICBpZiAocmV0ICE9PSB2b2lkIDApIHtcbiAgICByZXR1cm4gISFyZXQ7XG4gIH1cblxuICBpZiAob2JqQSA9PT0gb2JqQikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSBcIm9iamVjdFwiIHx8ICFvYmpBIHx8IHR5cGVvZiBvYmpCICE9PSBcIm9iamVjdFwiIHx8ICFvYmpCKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBiSGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmJpbmQob2JqQik7XG5cbiAgLy8gVGVzdCBmb3IgQSdzIGtleXMgZGlmZmVyZW50IGZyb20gQi5cbiAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwga2V5c0EubGVuZ3RoOyBpZHgrKykge1xuICAgIHZhciBrZXkgPSBrZXlzQVtpZHhdO1xuXG4gICAgaWYgKCFiSGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZUEgPSBvYmpBW2tleV07XG4gICAgdmFyIHZhbHVlQiA9IG9iakJba2V5XTtcblxuICAgIHJldCA9IGNvbXBhcmUgPyBjb21wYXJlLmNhbGwoY29tcGFyZUNvbnRleHQsIHZhbHVlQSwgdmFsdWVCLCBrZXkpIDogdm9pZCAwO1xuXG4gICAgaWYgKHJldCA9PT0gZmFsc2UgfHwgKHJldCA9PT0gdm9pZCAwICYmIHZhbHVlQSAhPT0gdmFsdWVCKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9zaGFsbG93ZXF1YWwvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDU3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNldFJhZGlvQXBwZWFyYW5jZShkb2M6IGFueSk6IGFueSB7XG4gICAgY29uc3Qgb2xkQXBwZWFyYW5jZUZ1bmNpdGlvbjogRnVuY3Rpb24gPSBkb2MuQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZS5ZZXNOb3JtYWw7XG4gICAgZG9jLkFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGUuWWVzTm9ybWFsID0gZnVuY3Rpb24oZm9ybU9iamVjdDogYW55KSB7XG4gICAgICAgIGNvbnN0IHhvYmo6IGFueSA9IG9sZEFwcGVhcmFuY2VGdW5jaXRpb24oZm9ybU9iamVjdCk7XG4gICAgICAgIGNvbnN0IHN0cmVhbTogc3RyaW5nW10gPSB4b2JqLnN0cmVhbS5zcGxpdCgnXFxuJyk7XG4gICAgICAgIGNvbnN0IGVuY29kZUNvbG9yOiBzdHJpbmcgPSBkb2MuX19wcml2YXRlX18uZW5jb2RlQ29sb3JTdHJpbmcoZm9ybU9iamVjdC5jb2xvcik7XG4gICAgICAgIHN0cmVhbVswXSA9IHN0cmVhbVswXSArICdcXG4nICsgZW5jb2RlQ29sb3IgKyAnXFxuJyArIGVuY29kZUNvbG9yLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oJ1xcbicpO1xuICAgICAgICByZXR1cm4geG9iajtcbiAgICB9O1xufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtLnRzIiwiaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcblxuZXhwb3J0IGNsYXNzIENvbG9yZWRCcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByaXZhdGUgY29sb3I6IHN0cmluZywgcHJpdmF0ZSByZW5kZXJXaWR0aD86IG51bWJlciwgcHJpdmF0ZSByZW5kZXJIZWlnaHQ/OiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIodW5kZWZpbmVkLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgb2xkRmlsbENvbG9yOiBzdHJpbmcgPSB0aGlzLmNvbnRyb2xsZXIuZG9jLmdldEZpbGxDb2xvcigpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldEZpbGxDb2xvcih0aGlzLmNvbG9yIHx8ICdibGFjaycpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnJlY3QodGhpcy54TGVmdCwgdGhpcy55VG9wLFxuICAgICAgICAgICAgdGhpcy5yZW5kZXJXaWR0aCA/PyB0aGlzLndpZHRoLCB0aGlzLnJlbmRlckhlaWdodCA/PyB0aGlzLmhlaWdodCwgJ0YnKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRGaWxsQ29sb3Iob2xkRmlsbENvbG9yKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2NvbG9yZWRicmljay50cyIsImltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dCc7XG5cbmV4cG9ydCBjbGFzcyBEZXNjcmlwdGlvbkJyaWNrIGV4dGVuZHMgVGV4dEJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHRleHQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCwgdGV4dCk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9kZXNjcmlwdGlvbi50cyIsInZhciBnO1xyXG5cclxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcclxuZyA9IChmdW5jdGlvbigpIHtcclxuXHRyZXR1cm4gdGhpcztcclxufSkoKTtcclxuXHJcbnRyeSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXHJcblx0ZyA9IGcgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpIHx8ICgxLGV2YWwpKFwidGhpc1wiKTtcclxufSBjYXRjaChlKSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcclxuXHRpZih0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKVxyXG5cdFx0ZyA9IHdpbmRvdztcclxufVxyXG5cclxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxyXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xyXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGc7XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gNjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogZ2xvYmFsIGpzUERGICovXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgQWxleGFuZGVyIFdlaWR0LFxuICogaHR0cHM6Ly9naXRodWIuY29tL0JpZ2dBOTRcbiAqIFxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2VcbiAqL1xuXG4vKiogXG4qIGpzUERGIEFjcm9Gb3JtIFBsdWdpblxuKiBAbW9kdWxlIEFjcm9Gb3JtXG4qL1xudmFyIGpzcGRmID0gcmVxdWlyZSgnanNwZGYnKTtcbihmdW5jdGlvbiAoanNQREYsIGdsb2JhbE9iaikge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBqc1BERkFQSSA9IGpzUERGLkFQSTtcbiAgICB2YXIgc2NvcGU7XG4gICAgdmFyIHNjYWxlRmFjdG9yID0gMTtcbiAgICBmdW5jdGlvbiB0b1VuaWNvZGUoc3RyKSB7XG4gICAgICAgIHZhciB1bmljb2RlU3RyaW5nID0gJyc7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGhlVW5pY29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgd2hpbGUgKHRoZVVuaWNvZGUubGVuZ3RoIDwgNCkge1xuICAgICAgICAgICAgICAgIHRoZVVuaWNvZGUgPSAnMCcgKyB0aGVVbmljb2RlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHVuaWNvZGVTdHJpbmcgKz0gdGhlVW5pY29kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJzxGRUZGJyArIHVuaWNvZGVTdHJpbmcgKyAnPic7XG4gICAgfVxuICAgIHZhciBwZGZFc2NhcGUgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJykucmVwbGFjZSgvXFwoL2csICdcXFxcKCcpLnJlcGxhY2UoL1xcKS9nLCAnXFxcXCknKSB9O1xuICAgIHZhciBwZGZVbmVzY2FwZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxcXFxcXFwvZywgJ1xcXFwnKS5yZXBsYWNlKC9cXFxcXFwoL2csICcoJykucmVwbGFjZSgvXFxcXFxcKS9nLCAnKScpOyB9O1xuICAgIGZ1bmN0aW9uIGFycmF5VG9QZGZVbmljb2RlQXJyYXkodmFsdWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9ICdbICc7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0b1VuaWNvZGUodmFsdWVbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCArPSAnIF0nXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHZhciBmMiA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlci50b0ZpeGVkKDIpOyAvLyBJZSwgJS4yZlxuICAgIH07XG5cbiAgICB2YXIgZjUgPSBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBudW1iZXIudG9GaXhlZCg1KTsgLy8gSWUsICUuMmZcbiAgICB9O1xuXG4gICAganNQREZBUEkuX19hY3JvZm9ybV9fID0ge307XG4gICAgdmFyIGluaGVyaXQgPSBmdW5jdGlvbiAoY2hpbGQsIHBhcmVudCkge1xuICAgICAgICBjaGlsZC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUpO1xuICAgICAgICBjaGlsZC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjaGlsZDtcbiAgICB9O1xuXG4gICAgdmFyIHNjYWxlID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuICh4ICogc2NhbGVGYWN0b3IpO1xuICAgIH07XG4gICAgdmFyIGFudGlTY2FsZSA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiAoeCAvIHNjYWxlRmFjdG9yKTtcbiAgICB9O1xuXG4gICAgdmFyIGNyZWF0ZUZvcm1YT2JqZWN0ID0gZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgdmFyIHhvYmogPSBuZXcgQWNyb0Zvcm1YT2JqZWN0KCk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIHx8IDA7XG4gICAgICAgIHZhciB3aWR0aCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSB8fCAwO1xuICAgICAgICB4b2JqLkJCb3ggPSBbMCwgMCwgTnVtYmVyKGYyKHdpZHRoKSksIE51bWJlcihmMihoZWlnaHQpKV07XG4gICAgICAgIHJldHVybiB4b2JqO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEJpdC1PcGVyYXRpb25zXG4gICAgKi9cbiAgICB2YXIgc2V0Qml0ID0ganNQREZBUEkuX19hY3JvZm9ybV9fLnNldEJpdCA9IGZ1bmN0aW9uIChudW1iZXIsIGJpdFBvc2l0aW9uKSB7XG4gICAgICAgIG51bWJlciA9IG51bWJlciB8fCAwO1xuICAgICAgICBiaXRQb3NpdGlvbiA9IGJpdFBvc2l0aW9uIHx8IDA7XG5cbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgaXNOYU4oYml0UG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLnNldEJpdCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBiaXRNYXNrID0gMSA8PCBiaXRQb3NpdGlvbjtcblxuICAgICAgICBudW1iZXIgfD0gYml0TWFzaztcblxuICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH07XG5cbiAgICB2YXIgY2xlYXJCaXQgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uY2xlYXJCaXQgPSBmdW5jdGlvbiAobnVtYmVyLCBiaXRQb3NpdGlvbikge1xuICAgICAgICBudW1iZXIgPSBudW1iZXIgfHwgMDtcbiAgICAgICAgYml0UG9zaXRpb24gPSBiaXRQb3NpdGlvbiB8fCAwO1xuXG4gICAgICAgIGlmIChpc05hTihudW1iZXIpIHx8IGlzTmFOKGJpdFBvc2l0aW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuQVBJLl9fYWNyb2Zvcm1fXy5jbGVhckJpdCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBiaXRNYXNrID0gMSA8PCBiaXRQb3NpdGlvbjtcblxuICAgICAgICBudW1iZXIgJj0gfmJpdE1hc2s7XG5cbiAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9O1xuXG4gICAgdmFyIGdldEJpdCA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5nZXRCaXQgPSBmdW5jdGlvbiAobnVtYmVyLCBiaXRQb3NpdGlvbikge1xuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSB8fCBpc05hTihiaXRQb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uZ2V0Qml0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChudW1iZXIgJiAoMSA8PCBiaXRQb3NpdGlvbikpID09PSAwID8gMCA6IDE7XG4gICAgfTtcblxuICAgIC8qXG4gICAgKiBGZiBzdGFydHMgY291bnRpbmcgdGhlIGJpdCBwb3NpdGlvbiBhdCAxIGFuZCBub3QgbGlrZSBqYXZhc2NyaXB0IGF0IDBcbiAgICAqL1xuICAgIHZhciBnZXRCaXRGb3JQZGYgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uZ2V0Qml0Rm9yUGRmID0gZnVuY3Rpb24gKG51bWJlciwgYml0UG9zaXRpb24pIHtcbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgaXNOYU4oYml0UG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLmdldEJpdEZvclBkZicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRCaXQobnVtYmVyLCBiaXRQb3NpdGlvbiAtIDEpO1xuICAgIH07XG5cbiAgICB2YXIgc2V0Qml0Rm9yUGRmID0ganNQREZBUEkuX19hY3JvZm9ybV9fLnNldEJpdEZvclBkZiA9IGZ1bmN0aW9uIChudW1iZXIsIGJpdFBvc2l0aW9uKSB7XG4gICAgICAgIGlmIChpc05hTihudW1iZXIpIHx8IGlzTmFOKGJpdFBvc2l0aW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuQVBJLl9fYWNyb2Zvcm1fXy5zZXRCaXRGb3JQZGYnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2V0Qml0KG51bWJlciwgYml0UG9zaXRpb24gLSAxKTtcbiAgICB9O1xuXG4gICAgdmFyIGNsZWFyQml0Rm9yUGRmID0ganNQREZBUEkuX19hY3JvZm9ybV9fLmNsZWFyQml0Rm9yUGRmID0gZnVuY3Rpb24gKG51bWJlciwgYml0UG9zaXRpb24pIHtcbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgaXNOYU4oYml0UG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLmNsZWFyQml0Rm9yUGRmJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsZWFyQml0KG51bWJlciwgYml0UG9zaXRpb24gLSAxKTtcbiAgICB9O1xuXG4gICAgdmFyIGNhbGN1bGF0ZUNvb3JkaW5hdGVzID0ganNQREZBUEkuX19hY3JvZm9ybV9fLmNhbGN1bGF0ZUNvb3JkaW5hdGVzID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgdmFyIGdldEhvcml6b250YWxDb29yZGluYXRlID0gdGhpcy5pbnRlcm5hbC5nZXRIb3Jpem9udGFsQ29vcmRpbmF0ZTtcbiAgICAgICAgdmFyIGdldFZlcnRpY2FsQ29vcmRpbmF0ZSA9IHRoaXMuaW50ZXJuYWwuZ2V0VmVydGljYWxDb29yZGluYXRlO1xuICAgICAgICB2YXIgeCA9IGFyZ3NbMF07XG4gICAgICAgIHZhciB5ID0gYXJnc1sxXTtcbiAgICAgICAgdmFyIHcgPSBhcmdzWzJdO1xuICAgICAgICB2YXIgaCA9IGFyZ3NbM107XG5cbiAgICAgICAgdmFyIGNvb3JkaW5hdGVzID0ge307XG5cbiAgICAgICAgY29vcmRpbmF0ZXMubG93ZXJMZWZ0X1ggPSBnZXRIb3Jpem9udGFsQ29vcmRpbmF0ZSh4KSB8fCAwO1xuICAgICAgICBjb29yZGluYXRlcy5sb3dlckxlZnRfWSA9IGdldFZlcnRpY2FsQ29vcmRpbmF0ZSh5ICsgaCkgfHwgMDtcbiAgICAgICAgY29vcmRpbmF0ZXMudXBwZXJSaWdodF9YID0gZ2V0SG9yaXpvbnRhbENvb3JkaW5hdGUoeCArIHcpIHx8IDA7XG4gICAgICAgIGNvb3JkaW5hdGVzLnVwcGVyUmlnaHRfWSA9IGdldFZlcnRpY2FsQ29vcmRpbmF0ZSh5KSB8fCAwO1xuXG4gICAgICAgIHJldHVybiBbTnVtYmVyKGYyKGNvb3JkaW5hdGVzLmxvd2VyTGVmdF9YKSksIE51bWJlcihmMihjb29yZGluYXRlcy5sb3dlckxlZnRfWSkpLCBOdW1iZXIoZjIoY29vcmRpbmF0ZXMudXBwZXJSaWdodF9YKSksIE51bWJlcihmMihjb29yZGluYXRlcy51cHBlclJpZ2h0X1kpKV07XG4gICAgfTtcblxuICAgIHZhciBjYWxjdWxhdGVBcHBlYXJhbmNlU3RyZWFtID0gZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgaWYgKGZvcm1PYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtT2JqZWN0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmb3JtT2JqZWN0LlYgJiYgIWZvcm1PYmplY3QuRFYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVsc2UgY2FsY3VsYXRlIGl0XG5cbiAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICB2YXIgdGV4dCA9IGZvcm1PYmplY3QuViB8fCBmb3JtT2JqZWN0LkRWO1xuICAgICAgICB2YXIgY2FsY1JlcyA9IGNhbGN1bGF0ZVgoZm9ybU9iamVjdCwgdGV4dCk7XG4gICAgICAgIHZhciBmb250S2V5ID0gc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udChmb3JtT2JqZWN0LmZvbnROYW1lLCBmb3JtT2JqZWN0LmZvbnRTdHlsZSkuaWQ7XG5cbiAgICAgICAgLy9QREYgMzIwMDAtMToyMDA4LCBwYWdlIDQ0NFxuICAgICAgICBzdHJlYW0ucHVzaCgnL1R4IEJNQycpO1xuICAgICAgICBzdHJlYW0ucHVzaCgncScpO1xuICAgICAgICBzdHJlYW0ucHVzaCgnQlQnKTsgLy8gQmVnaW4gVGV4dFxuICAgICAgICBzdHJlYW0ucHVzaChzY29wZS5fX3ByaXZhdGVfXy5lbmNvZGVDb2xvclN0cmluZyhmb3JtT2JqZWN0LmNvbG9yKSk7XG4gICAgICAgIHN0cmVhbS5wdXNoKCcvJyArIGZvbnRLZXkgKyAnICcgKyBmMihjYWxjUmVzLmZvbnRTaXplKSArICcgVGYnKTtcbiAgICAgICAgc3RyZWFtLnB1c2goJzEgMCAwIDEgMCAwIFRtJyk7Ly8gVHJhbnNmb3JtYXRpb24gTWF0cml4XG4gICAgICAgIHN0cmVhbS5wdXNoKGNhbGNSZXMudGV4dCk7XG4gICAgICAgIHN0cmVhbS5wdXNoKCdFVCcpOyAvLyBFbmQgVGV4dCAgICBcbiAgICAgICAgc3RyZWFtLnB1c2goJ1EnKTtcbiAgICAgICAgc3RyZWFtLnB1c2goJ0VNQycpO1xuXG4gICAgICAgIHZhciBhcHBlYXJhbmNlU3RyZWFtQ29udGVudCA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQuc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgIHJldHVybiBhcHBlYXJhbmNlU3RyZWFtQ29udGVudDtcbiAgICB9O1xuXG4gICAgdmFyIGNhbGN1bGF0ZVggPSBmdW5jdGlvbiAoZm9ybU9iamVjdCwgdGV4dCkge1xuICAgICAgICBpZiAoZm9ybU9iamVjdC5pc1VuaWNvZGUpIHRleHQgPSBmb3JtT2JqZWN0LnRydWVWYWx1ZTtcbiAgICAgICAgIHZhciBtYXhGb250U2l6ZSA9XG4gICAgICAgICAgICBmb3JtT2JqZWN0LmZvbnRTaXplID09PSAwID8gZm9ybU9iamVjdC5tYXhGb250U2l6ZSA6IGZvcm1PYmplY3QuZm9udFNpemU7XG4gICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IHtcbiAgICAgICAgICAgIHRleHQ6IFwiXCIsXG4gICAgICAgICAgICBmb250U2l6ZTogXCJcIlxuICAgICAgICB9O1xuICAgICAgICAvLyBSZW1vdmUgQnJhY2tldHNcbiAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyKDAsIDEpID09IFwiKFwiID8gdGV4dC5zdWJzdHIoMSkgOiB0ZXh0O1xuICAgICAgICB0ZXh0ID1cbiAgICAgICAgICAgIHRleHQuc3Vic3RyKHRleHQubGVuZ3RoIC0gMSkgPT0gXCIpXCJcbiAgICAgICAgICAgID8gdGV4dC5zdWJzdHIoMCwgdGV4dC5sZW5ndGggLSAxKVxuICAgICAgICAgICAgOiB0ZXh0O1xuICAgICAgICAvLyBzcGxpdCBpbnRvIGFycmF5IG9mIHdvcmRzXG4gICAgICAgIHZhciB0ZXh0U3BsaXQgPSB0ZXh0LnNwbGl0KFwiIFwiKTtcbiAgICAgICAgdGV4dFNwbGl0ID0gdGV4dFNwbGl0Lm1hcChmdW5jdGlvbiAod29yZCkge1xuICAgICAgICAgICAgcmV0dXJuIHdvcmQuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWZvcm1PYmplY3QubXVsdGlsaW5lKSB7XG4gICAgICAgICAgICB0ZXh0U3BsaXQgPSB0ZXh0U3BsaXQubWFwKGZ1bmN0aW9uIChhcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2Fyci5qb2luKFwiIFwiKV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZvbnRTaXplID0gbWF4Rm9udFNpemU7IC8vIFRoZSBTdGFydGluZyBmb250U2l6ZSAoVGhlIE1heGltdW0pXG4gICAgICAgIHZhciBsaW5lU3BhY2luZyA9IDI7XG4gICAgICAgIHZhciBib3JkZXJQYWRkaW5nID0gMjtcblxuICAgICAgICB2YXIgaGVpZ2h0ID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSB8fCAwO1xuICAgICAgICBoZWlnaHQgPSBoZWlnaHQgPCAwID8gLWhlaWdodCA6IGhlaWdodDtcbiAgICAgICAgdmFyIHdpZHRoID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIHx8IDA7XG4gICAgICAgIHdpZHRoID0gd2lkdGggPCAwID8gLXdpZHRoIDogd2lkdGg7XG5cbiAgICAgICAgdmFyIGlzU21hbGxlclRoYW5XaWR0aCA9IGZ1bmN0aW9uKGksIGxhc3RMaW5lLCBmb250U2l6ZSkge1xuICAgICAgICAgICAgaWYgKGkgKyAxIDwgdGV4dFNwbGl0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIHRtcCA9IGxhc3RMaW5lICsgXCIgXCIgKyB0ZXh0U3BsaXRbaSArIDFdWzBdO1xuICAgICAgICAgICAgdmFyIFRleHRXaWR0aCA9IGNhbGN1bGF0ZUZvbnRTcGFjZSh0bXAsIGZvcm1PYmplY3QsIGZvbnRTaXplKS53aWR0aDtcbiAgICAgICAgICAgIHZhciBGaWVsZFdpZHRoID0gd2lkdGggLSAyICogYm9yZGVyUGFkZGluZztcbiAgICAgICAgICAgIHJldHVybiBUZXh0V2lkdGggPD0gRmllbGRXaWR0aDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9udFNpemUrKztcbiAgICAgICAgRm9udFNpemU6IHdoaWxlIChmb250U2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgZm9udFNpemUtLTtcbiAgICAgICAgICAgIHZhciB0ZXh0SGVpZ2h0ID0gY2FsY3VsYXRlRm9udFNwYWNlKFwiM1wiLCBmb3JtT2JqZWN0LCBmb250U2l6ZSkuaGVpZ2h0O1xuICAgICAgICAgICAgdmFyIHN0YXJ0WSA9IGZvcm1PYmplY3QubXVsdGlsaW5lXG4gICAgICAgICAgICA/IGhlaWdodCAtIGZvbnRTaXplXG4gICAgICAgICAgICA6IChoZWlnaHQgLSB0ZXh0SGVpZ2h0KSAvIDI7XG4gICAgICAgICAgICBzdGFydFkgKz0gbGluZVNwYWNpbmc7XG4gICAgICAgICAgICB2YXIgc3RhcnRYO1xuXG4gICAgICAgICAgICB2YXIgbGFzdFkgPSBzdGFydFk7XG4gICAgICAgICAgICB2YXIgZmlyc3RXb3JkSW5MaW5lID0gMCxcbiAgICAgICAgICAgIGxhc3RXb3JkSW5MaW5lID0gMDtcbiAgICAgICAgICAgIHZhciBsYXN0TGVuZ3RoO1xuICAgICAgICAgICAgdmFyIGN1cnJXb3JkID0gMDtcblxuICAgICAgICAgICAgaWYgKGZvbnRTaXplIDw9IDApIHtcbiAgICAgICAgICAgIC8vIEluIGNhc2UsIHRoZSBUZXh0IGRvZXNuJ3QgZml0IGF0IGFsbFxuICAgICAgICAgICAgZm9udFNpemUgPSAxMjtcbiAgICAgICAgICAgIHRleHQgPSBcIiguLi4pIFRqXFxuXCI7XG4gICAgICAgICAgICB0ZXh0ICs9XG4gICAgICAgICAgICAgICAgXCIlIFdpZHRoIG9mIFRleHQ6IFwiICtcbiAgICAgICAgICAgICAgICBjYWxjdWxhdGVGb250U3BhY2UodGV4dCwgZm9ybU9iamVjdCwgZm9udFNpemUpLndpZHRoICtcbiAgICAgICAgICAgICAgICBcIiwgRmllbGRXaWR0aDpcIiArXG4gICAgICAgICAgICAgICAgd2lkdGggK1xuICAgICAgICAgICAgICAgIFwiXFxuXCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGxhc3RMaW5lID0gXCJcIjtcbiAgICAgICAgICAgIHZhciBsaW5lQ291bnQgPSAwO1xuICAgICAgICAgICAgTGluZTogZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0U3BsaXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0ZXh0U3BsaXQuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgaXNXaXRoTmV3TGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0U3BsaXRbaV0ubGVuZ3RoICE9PSAxICYmIGN1cnJXb3JkICE9PSB0ZXh0U3BsaXRbaV0ubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgKHRleHRIZWlnaHQgKyBsaW5lU3BhY2luZykgKiAobGluZUNvdW50ICsgMikgKyBsaW5lU3BhY2luZyA+XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBGb250U2l6ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsYXN0TGluZSArPSB0ZXh0U3BsaXRbaV1bY3VycldvcmRdO1xuICAgICAgICAgICAgICAgIGlzV2l0aE5ld0xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxhc3RXb3JkSW5MaW5lID0gaTtcbiAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsYXN0TGluZSArPSB0ZXh0U3BsaXRbaV1bY3VycldvcmRdICsgXCIgXCI7XG4gICAgICAgICAgICAgICAgbGFzdExpbmUgPVxuICAgICAgICAgICAgICAgICAgICBsYXN0TGluZS5zdWJzdHIobGFzdExpbmUubGVuZ3RoIC0gMSkgPT0gXCIgXCJcbiAgICAgICAgICAgICAgICAgICAgPyBsYXN0TGluZS5zdWJzdHIoMCwgbGFzdExpbmUubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgOiBsYXN0TGluZTtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gcGFyc2VJbnQoaSk7XG4gICAgICAgICAgICAgICAgdmFyIG5leHRMaW5lSXNTbWFsbGVyID0gaXNTbWFsbGVyVGhhbldpZHRoKGtleSwgbGFzdExpbmUsIGZvbnRTaXplKTtcbiAgICAgICAgICAgICAgICB2YXIgaXNMYXN0V29yZCA9IGkgPj0gdGV4dFNwbGl0Lmxlbmd0aCAtIDE7XG5cbiAgICAgICAgICAgICAgICBpZiAobmV4dExpbmVJc1NtYWxsZXIgJiYgIWlzTGFzdFdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdExpbmUgKz0gXCIgXCI7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJXb3JkID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIExpbmVcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFuZXh0TGluZUlzU21hbGxlciAmJiAhaXNMYXN0V29yZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZvcm1PYmplY3QubXVsdGlsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIEZvbnRTaXplO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAodGV4dEhlaWdodCArIGxpbmVTcGFjaW5nKSAqIChsaW5lQ291bnQgKyAyKSArIGxpbmVTcGFjaW5nID5cbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBUZXh0IGlzIGhpZ2hlciB0aGFuIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmllbGRPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIEZvbnRTaXplO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxhc3RXb3JkSW5MaW5lID0ga2V5O1xuICAgICAgICAgICAgICAgICAgICAvLyBnbyBvblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0xhc3RXb3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RXb3JkSW5MaW5lID0ga2V5O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgZm9ybU9iamVjdC5tdWx0aWxpbmUgJiZcbiAgICAgICAgICAgICAgICAgICAgKHRleHRIZWlnaHQgKyBsaW5lU3BhY2luZykgKiAobGluZUNvdW50ICsgMikgKyBsaW5lU3BhY2luZyA+XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBUZXh0IGlzIGhpZ2hlciB0aGFuIHRoZSBGaWVsZE9iamVjdFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBGb250U2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGxhc3QgYmxhbmtcblxuICAgICAgICAgICAgICAgIHZhciBsaW5lID0gXCJcIjtcblxuICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSBmaXJzdFdvcmRJbkxpbmU7IHggPD0gbGFzdFdvcmRJbkxpbmU7IHgrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY3VyckxpbmUgPSB0ZXh0U3BsaXRbeF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtT2JqZWN0Lm11bHRpbGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPT09IGxhc3RXb3JkSW5MaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lICs9IGN1cnJMaW5lW2N1cnJXb3JkXSArIFwiIFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycldvcmQgPSAoY3VycldvcmQgKyAxKSAlIGN1cnJMaW5lLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPT09IGZpcnN0V29yZEluTGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZSArPSBjdXJyTGluZVtjdXJyTGluZS5sZW5ndGggLSAxXSArIFwiIFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGluZSArPSBjdXJyTGluZVswXSArIFwiIFwiO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBsYXN0IGJsYW5rXG4gICAgICAgICAgICAgICAgbGluZSA9XG4gICAgICAgICAgICAgICAgbGluZS5zdWJzdHIobGluZS5sZW5ndGggLSAxKSA9PSBcIiBcIlxuICAgICAgICAgICAgICAgICAgICA/IGxpbmUuc3Vic3RyKDAsIGxpbmUubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgOiBsaW5lO1xuICAgICAgICAgICAgICAgIC8vIGxhc3RMZW5ndGggLT0gYmxhbmtTcGFjZS53aWR0aDtcbiAgICAgICAgICAgICAgICBsYXN0TGVuZ3RoID0gY2FsY3VsYXRlRm9udFNwYWNlKGxpbmUsIGZvcm1PYmplY3QsIGZvbnRTaXplKS53aWR0aDtcblxuICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBzdGFydFhcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvcm1PYmplY3QudGV4dEFsaWduKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInJpZ2h0XCI6XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0WCA9IHdpZHRoIC0gbGFzdExlbmd0aCAtIGJvcmRlclBhZGRpbmc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjZW50ZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRYID0gKHdpZHRoIC0gbGFzdExlbmd0aCkgLyAyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibGVmdFwiOlxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0WCA9IGJvcmRlclBhZGRpbmc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0ZXh0ICs9IGYyKHN0YXJ0WCkgKyBcIiBcIiArIGYyKGxhc3RZKSArIFwiIFRkXFxuXCI7XG5cbiAgICAgICAgICAgICAgICBpZiAoZm9ybU9iamVjdC5pc1VuaWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZvbnRMaXN0ID0ge307XG4gICAgICAgICAgICAgICAgICAgIGZvbnRMaXN0W3Njb3BlLmludGVybmFsLmdldEZvbnQoKS5pZF0gPSBzY29wZS5pbnRlcm5hbC5nZXRGb250KCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogbGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmc6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRleDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkVzY2FwZTogcGRmRXNjYXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUZvbnRLZXk6IHNjb3BlLmludGVybmFsLmdldEZvbnQoKS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250czogZm9udExpc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRm9udFNpemU6IGZvcm1PYmplY3QuZm9udFNpemVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuZXZlbnRzLnB1Ymxpc2goJ3Bvc3RQcm9jZXNzVGV4dCcsIHBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICc8JyArIHBheWxvYWQudGV4dCArICc+IFRqXFxuJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gJygnICsgcGRmRXNjYXBlKGxpbmUpICsgJykgVGpcXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyByZXNldCBYIGluIFBERlxuICAgICAgICAgICAgICAgIHRleHQgKz0gLWYyKHN0YXJ0WCkgKyBcIiAwIFRkXFxuXCI7XG5cbiAgICAgICAgICAgICAgICAvLyBBZnRlciBhIExpbmUsIGFkanVzdCB5IHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgbGFzdFkgPSAtKGZvbnRTaXplICsgbGluZVNwYWNpbmcpO1xuXG4gICAgICAgICAgICAgICAgLy8gUmVzZXQgZm9yIG5leHQgaXRlcmF0aW9uIHN0ZXBcbiAgICAgICAgICAgICAgICBsYXN0TGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICBmaXJzdFdvcmRJbkxpbmUgPSBpc1dpdGhOZXdMaW5lID8gbGFzdFdvcmRJbkxpbmUgOiBsYXN0V29yZEluTGluZSArIDE7XG4gICAgICAgICAgICAgICAgbGluZUNvdW50Kys7XG5cbiAgICAgICAgICAgICAgICBsYXN0TGluZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgY29udGludWUgTGluZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuVmFsdWUudGV4dCA9IHRleHQ7XG4gICAgICAgIHJldHVyblZhbHVlLmZvbnRTaXplID0gZm9udFNpemU7XG5cbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIFNtYWxsIHdvcmthcm91bmQgZm9yIGNhbGN1bGF0aW5nIHRoZSBUZXh0TWV0cmljIGFwcHJveGltYXRlbHkuXG4gICAgKiBcbiAgICAqIEBwYXJhbSB0ZXh0XG4gICAgKiBAcGFyYW0gZm9udHNpemVcbiAgICAqIEByZXR1cm5zIHtUZXh0TWV0cmljc30gKEhhcyBIZWlnaHQgYW5kIFdpZHRoKVxuICAgICovXG4gICAgdmFyIGNhbGN1bGF0ZUZvbnRTcGFjZSA9IGZ1bmN0aW9uICh0ZXh0LCBmb3JtT2JqZWN0LCBmb250U2l6ZSkge1xuICAgICAgICB2YXIgZm9udCA9IHNjb3BlLmludGVybmFsLmdldEZvbnQoZm9ybU9iamVjdC5mb250TmFtZSwgZm9ybU9iamVjdC5mb250U3R5bGUpO1xuICAgICAgICB2YXIgd2lkdGggPSBzY29wZS5nZXRTdHJpbmdVbml0V2lkdGgodGV4dCwgeyBmb250OiBmb250LCBmb250U2l6ZTogcGFyc2VGbG9hdChmb250U2l6ZSksIGNoYXJTcGFjZTogMCB9KSAqIHBhcnNlRmxvYXQoZm9udFNpemUpO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gc2NvcGUuZ2V0U3RyaW5nVW5pdFdpZHRoKFwiM1wiLCB7IGZvbnQ6IGZvbnQsIGZvbnRTaXplOiBwYXJzZUZsb2F0KGZvbnRTaXplKSwgY2hhclNwYWNlOiAwIH0pICogcGFyc2VGbG9hdChmb250U2l6ZSkgKiAxLjU7XG4gICAgICAgIHJldHVybiB7IGhlaWdodDogaGVpZ2h0LCB3aWR0aDogd2lkdGggfTtcbiAgICB9O1xuXG4gICAgdmFyIGFjcm9mb3JtUGx1Z2luVGVtcGxhdGUgPSB7XG4gICAgICAgIGZpZWxkczogW10sXG4gICAgICAgIHhGb3JtczogW10sXG4gICAgICAgIC8qKlxuICAgICAgICAqIGFjcm9Gb3JtRGljdGlvbmFyeVJvb3QgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEFjcm9Gb3JtXG4gICAgICAgICogRGljdGlvbmFyeSAwOiBUaGUgRXZlbnQtVG9rZW4sIHRoZSBBY3JvRm9ybURpY3Rpb25hcnlDYWxsYmFjayBoYXNcbiAgICAgICAgKiAxOiBUaGUgT2JqZWN0IElEIG9mIHRoZSBSb290XG4gICAgICAgICovXG4gICAgICAgIGFjcm9Gb3JtRGljdGlvbmFyeVJvb3Q6IG51bGwsXG4gICAgICAgIC8qKlxuICAgICAgICAqIEFmdGVyIHRoZSBQREYgZ2V0cyBldmFsdWF0ZWQsIHRoZSByZWZlcmVuY2UgdG8gdGhlIHJvb3QgaGFzIHRvIGJlXG4gICAgICAgICogcmVzZXQsIHRoaXMgaW5kaWNhdGVzLCB3aGV0aGVyIHRoZSByb290IGhhcyBhbHJlYWR5IGJlZW4gcHJpbnRlZFxuICAgICAgICAqIG91dFxuICAgICAgICAqL1xuICAgICAgICBwcmludGVkT3V0OiBmYWxzZSxcbiAgICAgICAgaW50ZXJuYWw6IG51bGwsXG4gICAgICAgIGlzSW5pdGlhbGl6ZWQ6IGZhbHNlXG4gICAgfTtcblxuICAgIHZhciBhbm5vdFJlZmVyZW5jZUNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvL3NldCBvYmpJZCB0byB1bmRlZmluZWQgYW5kIGZvcmNlIGl0IHRvIGdldCBhIG5ldyBvYmpJZCBvbiBidWlsZERvY3VtZW50XG4gICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3Qub2JqSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBmaWVsZHMgPSBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290LkZpZWxkcztcbiAgICAgICAgZm9yICh2YXIgaSBpbiBmaWVsZHMpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZHMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZm9ybU9iamVjdCA9IGZpZWxkc1tpXTtcbiAgICAgICAgICAgICAgICAvL3NldCBvYmpJZCB0byB1bmRlZmluZWQgYW5kIGZvcmNlIGl0IHRvIGdldCBhIG5ldyBvYmpJZCBvbiBidWlsZERvY3VtZW50XG4gICAgICAgICAgICAgICAgZm9ybU9iamVjdC5vYmpJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAvLyBhZGQgQW5ub3QgUmVmZXJlbmNlIVxuICAgICAgICAgICAgICAgIGlmIChmb3JtT2JqZWN0Lmhhc0Fubm90YXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmVzIGFuIEFubm90YXRpb24gV2lkZ2V0IGluIHRoZSBGb3JtIE9iamVjdCwgcHV0IHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBSZWZlcmVuY2UgaW4gdGhlIC9Bbm5vdCBhcnJheVxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVBbm5vdGF0aW9uUmVmZXJlbmNlLmNhbGwoc2NvcGUsIGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgcHV0Rm9ybSA9IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgIGlmIChzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5wcmludGVkT3V0KSB7XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5wcmludGVkT3V0ID0gZmFsc2U7XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QpIHtcbiAgICAgICAgICAgIGluaXRpYWxpemVBY3JvRm9ybS5jYWxsKHNjb3BlKTtcbiAgICAgICAgfVxuICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290LkZpZWxkcy5wdXNoKGZvcm1PYmplY3QpO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBDcmVhdGUgdGhlIFJlZmVyZW5jZSB0byB0aGUgd2lkZ2V0QW5ub3RhdGlvbiwgc28gdGhhdCBpdCBnZXRzIHJlZmVyZW5jZWRcbiAgICAqIGluIHRoZSBBbm5vdFtdIGludCB0aGUrIChSZXF1aXJlcyB0aGUgQW5ub3RhdGlvbiBQbHVnaW4pXG4gICAgKi9cbiAgICB2YXIgY3JlYXRlQW5ub3RhdGlvblJlZmVyZW5jZSA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICB0eXBlOiAncmVmZXJlbmNlJyxcbiAgICAgICAgICAgIG9iamVjdDogb2JqZWN0XG4gICAgICAgIH07XG4gICAgICAgIHZhciBmaW5kRW50cnkgPSBmdW5jdGlvbiAoZW50cnkpIHsgcmV0dXJuIChlbnRyeS50eXBlID09PSBvcHRpb25zLnR5cGUgJiYgZW50cnkub2JqZWN0ID09PSBvcHRpb25zLm9iamVjdCk7IH07XG4gICAgICAgIGlmIChzY29wZS5pbnRlcm5hbC5nZXRQYWdlSW5mbyhvYmplY3QucGFnZSkucGFnZUNvbnRleHQuYW5ub3RhdGlvbnMuZmluZChmaW5kRW50cnkpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmdldFBhZ2VJbmZvKG9iamVjdC5wYWdlKS5wYWdlQ29udGV4dC5hbm5vdGF0aW9ucy5wdXNoKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIENhbGxiYWNrc1xuXG4gICAgdmFyIHB1dENhdGFsb2dDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gUHV0IHJlZmVyZW5jZSB0byBBY3JvRm9ybSB0byBEb2N1bWVudENhdGFsb2dcbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290ICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAvLyBmb3Igc2FmZXR5LCBzaG91bGRuJ3Qgbm9ybWFsbHkgYmUgdGhlIGNhc2VcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLndyaXRlKCcvQWNyb0Zvcm0gJyArIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3Qub2JqSWQgKyAnICcgKyAwICsgJyBSJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3B1dENhdGFsb2dDYWxsYmFjazogUm9vdCBtaXNzaW5nLicpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQWRkcyAvQWNyb2Zvcm0gWCAwIFIgdG8gRG9jdW1lbnQgQ2F0YWxvZywgYW5kIGNyZWF0ZXMgdGhlIEFjcm9Gb3JtXG4gICAgKiBEaWN0aW9uYXJ5XG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1EaWN0aW9uYXJ5Q2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFJlbW92ZSBldmVudFxuICAgICAgICBzY29wZS5pbnRlcm5hbC5ldmVudHMudW5zdWJzY3JpYmUoc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5fZXZlbnRJRCk7XG4gICAgICAgIGRlbGV0ZSBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290Ll9ldmVudElEO1xuICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5wcmludGVkT3V0ID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBDcmVhdGVzIHRoZSBzaW5nbGUgRmllbGRzIGFuZCB3cml0ZXMgdGhlbSBpbnRvIHRoZSBEb2N1bWVudFxuICAgICogXG4gICAgKiBJZiBmaWVsZEFycmF5IGlzIHNldCwgdXNlIHRoZSBmaWVsZHMgdGhhdCBhcmUgaW5zaWRlIGl0IGluc3RlYWQgb2YgdGhlXG4gICAgKiBmaWVsZHMgZnJvbSB0aGUgQWNyb1Jvb3QgKGZvciB0aGUgRm9ybVhPYmplY3RzLi4uKVxuICAgICovXG4gICAgdmFyIGNyZWF0ZUZpZWxkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZmllbGRBcnJheSkge1xuICAgICAgICB2YXIgc3RhbmRhcmRGaWVsZHMgPSAoIWZpZWxkQXJyYXkpO1xuXG4gICAgICAgIGlmICghZmllbGRBcnJheSkge1xuICAgICAgICAgICAgLy8gaW4gY2FzZSB0aGVyZSBpcyBubyBmaWVsZEFycmF5IHNwZWNpZmllZCwgd2Ugd2FudCB0byBwcmludCBvdXRcbiAgICAgICAgICAgIC8vIHRoZSBGaWVsZHMgb2YgdGhlIEFjcm9Gb3JtXG4gICAgICAgICAgICAvLyBQcmludCBvdXQgUm9vdFxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwubmV3T2JqZWN0RGVmZXJyZWRCZWdpbihzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290Lm9iaklkLCB0cnVlKTtcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QucHV0U3RyZWFtKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmaWVsZEFycmF5ID0gZmllbGRBcnJheSB8fCBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290LktpZHM7XG5cbiAgICAgICAgZm9yICh2YXIgaSBpbiBmaWVsZEFycmF5KSB7XG4gICAgICAgICAgICBpZiAoZmllbGRBcnJheS5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgIHZhciBmaWVsZE9iamVjdCA9IGZpZWxkQXJyYXlbaV07XG4gICAgICAgICAgICAgICAgdmFyIGtleVZhbHVlTGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBvbGRSZWN0ID0gZmllbGRPYmplY3QuUmVjdDtcblxuICAgICAgICAgICAgICAgIGlmIChmaWVsZE9iamVjdC5SZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkT2JqZWN0LlJlY3QgPSBjYWxjdWxhdGVDb29yZGluYXRlcy5jYWxsKHRoaXMsIGZpZWxkT2JqZWN0LlJlY3QpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IFdyaXRpbmcgdGhlIE9iamVjdFxuICAgICAgICAgICAgICAgIHNjb3BlLmludGVybmFsLm5ld09iamVjdERlZmVycmVkQmVnaW4oZmllbGRPYmplY3Qub2JqSWQsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgZmllbGRPYmplY3QuREEgPSBBY3JvRm9ybUFwcGVhcmFuY2UuY3JlYXRlRGVmYXVsdEFwcGVhcmFuY2VTdHJlYW0oZmllbGRPYmplY3QpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZE9iamVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgZmllbGRPYmplY3QuZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVMaXN0ID0gZmllbGRPYmplY3QuZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZmllbGRPYmplY3QuUmVjdCA9IG9sZFJlY3Q7XG5cbiAgICAgICAgICAgICAgICBpZiAoZmllbGRPYmplY3QuaGFzQXBwZWFyYW5jZVN0cmVhbSAmJiAhZmllbGRPYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIEFwcGVhcmFuY2VcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFwcGVhcmFuY2UgPSBjYWxjdWxhdGVBcHBlYXJhbmNlU3RyZWFtLmNhbGwodGhpcywgZmllbGRPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QucHVzaCh7IGtleTogJ0FQJywgdmFsdWU6IFwiPDwvTiBcIiArIGFwcGVhcmFuY2UgKyBcIj4+XCIgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zLnB1c2goYXBwZWFyYW5jZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQXNzdW1lIEFwcGVhcmFuY2VTdHJlYW1Db250ZW50IGlzIGEgQXJyYXkgd2l0aCBOLFIsRCAoYXQgbGVhc3RcbiAgICAgICAgICAgICAgICAvLyBvbmUgb2YgdGhlbSEpXG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkT2JqZWN0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIE4sUiBhbmQgRFxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGZpZWxkT2JqZWN0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRPYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQuaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBmaWVsZE9iamVjdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudFtrXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nICs9IChcIi9cIiArIGsgKyBcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyArPSBcIjw8XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPj0gMSB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXJhbmNlU3RyZWFtIGlzIGFuIEFycmF5IG9yIE9iamVjdCFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IHZhbHVlW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIEZ1bmN0aW9uIGlzIHJlZmVyZW5jZWQsIGNhbGwgaXQgaW4gb3JkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gZ2V0IHRoZSBGb3JtWE9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmogPSBvYmouY2FsbCh0aGlzLCBmaWVsZE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1TdHJpbmcgKz0gKFwiL1wiICsgaSArIFwiIFwiICsgb2JqICsgXCIgXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSB0aGUgWEZvcm0gaXMgYWxyZWFkeSB1c2VkLCBlLmcuIE9mZlN0YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgQ2hlY2tCb3hlcywgZG9uJ3QgYWRkIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zLmluZGV4T2Yob2JqKSA+PSAwKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zLnB1c2gob2JqKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBGdW5jdGlvbiBpcyByZWZlcmVuY2VkLCBjYWxsIGl0IGluIG9yZGVyIHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIEZvcm1YT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmogPSBvYmouY2FsbCh0aGlzLCBmaWVsZE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyArPSAoXCIvXCIgKyBpICsgXCIgXCIgKyBvYmopO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMuaW5kZXhPZihvYmopID49IDApKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zLnB1c2gob2JqKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyArPSBcIj4+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXJhbmNlIHN0cmVhbSBpcyBhIG5vcm1hbCBPYmplY3QuLlxuICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QucHVzaCh7IGtleTogJ0FQJywgdmFsdWU6IFwiPDxcXG5cIiArIGFwcGVhcmFuY2VTdHJlYW1TdHJpbmcgKyBcIj4+XCIgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwucHV0U3RyZWFtKHsgYWRkaXRpb25hbEtleVZhbHVlczoga2V5VmFsdWVMaXN0IH0pO1xuXG4gICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwub3V0KFwiZW5kb2JqXCIpO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YW5kYXJkRmllbGRzKSB7XG4gICAgICAgICAgICBjcmVhdGVYRm9ybU9iamVjdENhbGxiYWNrLmNhbGwodGhpcywgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgY3JlYXRlWEZvcm1PYmplY3RDYWxsYmFjayA9IGZ1bmN0aW9uIChmaWVsZEFycmF5KSB7XG4gICAgICAgIGZvciAodmFyIGkgaW4gZmllbGRBcnJheSkge1xuICAgICAgICAgICAgaWYgKGZpZWxkQXJyYXkuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gaTtcbiAgICAgICAgICAgICAgICB2YXIgZmllbGRPYmplY3QgPSBmaWVsZEFycmF5W2ldO1xuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IFdyaXRpbmcgdGhlIE9iamVjdFxuICAgICAgICAgICAgICAgIHNjb3BlLmludGVybmFsLm5ld09iamVjdERlZmVycmVkQmVnaW4oZmllbGRPYmplY3QgJiYgZmllbGRPYmplY3Qub2JqSWQsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZE9iamVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgZmllbGRPYmplY3QucHV0U3RyZWFtID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRPYmplY3QucHV0U3RyZWFtKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBmaWVsZEFycmF5W2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIGluaXRpYWxpemVBY3JvRm9ybSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWwgIT09IHVuZGVmaW5lZCAmJiAodGhpcy5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbiA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uaXNJbml0aWFsaXplZCA9PT0gZmFsc2UpKSB7XG5cbiAgICAgICAgICAgIHNjb3BlID0gdGhpcztcblxuICAgICAgICAgICAgQWNyb0Zvcm1GaWVsZC5GaWVsZE51bSA9IDA7XG4gICAgICAgICAgICB0aGlzLmludGVybmFsLmFjcm9mb3JtUGx1Z2luID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShhY3JvZm9ybVBsdWdpblRlbXBsYXRlKSk7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhjZXB0aW9uIHdoaWxlIGNyZWF0aW5nIEFjcm9mb3JtRGljdGlvbmFyeVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjYWxlRmFjdG9yID0gc2NvcGUuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgICAgICAvLyBUaGUgT2JqZWN0IE51bWJlciBvZiB0aGUgQWNyb0Zvcm0gRGljdGlvbmFyeVxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdCA9IG5ldyBBY3JvRm9ybURpY3Rpb25hcnkoKTtcblxuICAgICAgICAgICAgLy8gYWRkIENhbGxiYWNrIGZvciBjcmVhdGluZyB0aGUgQWNyb0Zvcm0gRGljdGlvbmFyeVxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5fZXZlbnRJRCA9IHNjb3BlLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ3Bvc3RQdXRSZXNvdXJjZXMnLCBBY3JvRm9ybURpY3Rpb25hcnlDYWxsYmFjayk7XG5cbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ2J1aWxkRG9jdW1lbnQnLCBhbm5vdFJlZmVyZW5jZUNhbGxiYWNrKTsgLy8gYnVpbGREb2N1bWVudFxuXG4gICAgICAgICAgICAvLyBSZWdpc3RlciBldmVudCwgdGhhdCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgRG9jdW1lbnRDYXRhbG9nIGlzXG4gICAgICAgICAgICAvLyB3cml0dGVuLCBpbiBvcmRlciB0byBhZGQgL0Fjcm9Gb3JtXG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdwdXRDYXRhbG9nJywgcHV0Q2F0YWxvZ0NhbGxiYWNrKTtcblxuICAgICAgICAgICAgLy8gUmVnaXN0ZXIgZXZlbnQsIHRoYXQgY3JlYXRlcyBhbGwgRmllbGRzXG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdwb3N0UHV0UGFnZXMnLCBjcmVhdGVGaWVsZENhbGxiYWNrKTtcblxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy9QREYgMzIwMDAtMToyMDA4LCBwYWdlIDI2LCA3LjMuNlxuICAgIHZhciBhcnJheVRvUGRmQXJyYXkgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uYXJyYXlUb1BkZkFycmF5ID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFycmF5KSkge1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSAnWyc7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSAnICc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIGFycmF5W2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBhcnJheVtpXS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlbaV0uc3Vic3RyKDAsIDEpICE9PSAnLycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9ICcoJyArIHBkZkVzY2FwZShhcnJheVtpXS50b1N0cmluZygpKSArICcpJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBhcnJheVtpXS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGVudCArPSAnXSc7XG4gICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLl9fYWNyb2Zvcm1fXy5hcnJheVRvUGRmQXJyYXknKTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGdldE1hdGNoZXMoc3RyaW5nLCByZWdleCwgaW5kZXgpIHtcbiAgICAgICAgaW5kZXggfHwgKGluZGV4ID0gMSk7IC8vIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGNhcHR1cmluZyBncm91cFxuICAgICAgICB2YXIgbWF0Y2hlcyA9IFtdO1xuICAgICAgICB2YXIgbWF0Y2g7XG4gICAgICAgIHdoaWxlIChtYXRjaCA9IHJlZ2V4LmV4ZWMoc3RyaW5nKSkge1xuICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKG1hdGNoW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hdGNoZXM7XG4gICAgfVxuICAgIHZhciBwZGZBcnJheVRvU3RyaW5nQXJyYXkgPSBmdW5jdGlvbiAoYXJyYXkpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICBpZiAodHlwZW9mIGFycmF5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBnZXRNYXRjaGVzKGFycmF5LCAvXFwoKC4qPylcXCkvZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgdmFyIHRvUGRmU3RyaW5nID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICBzdHJpbmcgPSBzdHJpbmcgfHwgXCJcIjtcbiAgICAgICAgc3RyaW5nLnRvU3RyaW5nKCk7XG4gICAgICAgIHN0cmluZyA9ICcoJyArIHBkZkVzY2FwZShzdHJpbmcpICsgJyknO1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgIH07XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuICAgIC8vIENsYXNzZXNcbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1QREZPYmplY3RcbiAgICAqIEBjbGFzc2Rlc2MgQSBBY3JvRm9ybVBERk9iamVjdFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtUERGT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX29iaklkO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtUERGT2JqZWN0I29iaklkXG4gICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdvYmpJZCcsIHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX29iaklkKSB7XG4gICAgICAgICAgICAgICAgICAgIF9vYmpJZCA9IHNjb3BlLmludGVybmFsLm5ld09iamVjdERlZmVycmVkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfb2JqSWRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9vYmpJZCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBAZnVuY3Rpb24gQWNyb0Zvcm1QREZPYmplY3QudG9TdHJpbmdcbiAgICAqL1xuICAgIEFjcm9Gb3JtUERGT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JqSWQgKyBcIiAwIFJcIjtcbiAgICB9O1xuXG4gICAgQWNyb0Zvcm1QREZPYmplY3QucHJvdG90eXBlLnB1dFN0cmVhbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGtleVZhbHVlTGlzdCA9IHRoaXMuZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtKCk7XG4gICAgICAgIHNjb3BlLmludGVybmFsLnB1dFN0cmVhbSh7IGRhdGE6IHRoaXMuc3RyZWFtLCBhZGRpdGlvbmFsS2V5VmFsdWVzOiBrZXlWYWx1ZUxpc3QgfSk7XG4gICAgICAgIHNjb3BlLmludGVybmFsLm91dChcImVuZG9ialwiKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIGFuIGtleS12YWx1ZS1MaXN0IG9mIGFsbCBub24tY29uZmlndXJhYmxlIFZhcmlhYmxlcyBmcm9tIHRoZSBPYmplY3RcbiAgICAqIFxuICAgICogQG5hbWUgZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtXG4gICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICovXG4gICAgQWNyb0Zvcm1QREZPYmplY3QucHJvdG90eXBlLmdldEtleVZhbHVlTGlzdEZvclN0cmVhbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNyZWF0ZUtleVZhbHVlTGlzdEZyb21GaWVsZE9iamVjdCA9IGZ1bmN0aW9uIChmaWVsZE9iamVjdCkge1xuICAgICAgICAgICAgdmFyIGtleVZhbHVlTGlzdCA9IFtdO1xuICAgICAgICAgICAgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhmaWVsZE9iamVjdCkuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGtleSAhPSAnY29udGVudCcgJiYga2V5ICE9ICdhcHBlYXJhbmNlU3RyZWFtQ29udGVudCcgJiYga2V5LnN1YnN0cmluZygwLCAxKSAhPSBcIl9cIik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBrZXlzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZmllbGRPYmplY3QsIGtleXNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eURlc2NyaXB0b3IgJiYgcHJvcGVydHlEZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGZpZWxkT2JqZWN0W2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVMaXN0LnB1c2goeyBrZXk6IGtleSwgdmFsdWU6IGFycmF5VG9QZGZBcnJheSh2YWx1ZSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQWNyb0Zvcm1QREZPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIGl0IGlzIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgUERGT2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2UgdGhlIHJlZmVyZW5jZSBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QucHVzaCh7IGtleToga2V5LCB2YWx1ZTogdmFsdWUub2JqSWQgKyBcIiAwIFJcIiB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QucHVzaCh7IGtleToga2V5LCB2YWx1ZTogdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ga2V5VmFsdWVMaXN0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVLZXlWYWx1ZUxpc3RGcm9tRmllbGRPYmplY3QodGhpcyk7XG4gICAgfTtcblxuICAgIHZhciBBY3JvRm9ybVhPYmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtUERGT2JqZWN0LmNhbGwodGhpcyk7XG5cblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1R5cGUnLCB7XG4gICAgICAgICAgICB2YWx1ZTogXCIvWE9iamVjdFwiLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRlYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1N1YnR5cGUnLCB7XG4gICAgICAgICAgICB2YWx1ZTogXCIvRm9ybVwiLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRlYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0Zvcm1UeXBlJywge1xuICAgICAgICAgICAgdmFsdWU6IDEsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfQkJveCA9IFtdO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0JCb3gnLCB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9CQm94O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0JCb3ggPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdSZXNvdXJjZXMnLCB7XG4gICAgICAgICAgICB2YWx1ZTogXCIyIDAgUlwiLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRlYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX3N0cmVhbTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdzdHJlYW0nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX3N0cmVhbSA9IHZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoX3N0cmVhbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3N0cmVhbTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBpbmhlcml0KEFjcm9Gb3JtWE9iamVjdCwgQWNyb0Zvcm1QREZPYmplY3QpO1xuXG4gICAgdmFyIEFjcm9Gb3JtRGljdGlvbmFyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1QREZPYmplY3QuY2FsbCh0aGlzKTtcblxuICAgICAgICB2YXIgX0tpZHMgPSBbXTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0tpZHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChfS2lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfS2lkcztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRmllbGRzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9LaWRzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBEZWZhdWx0IEFwcGVhcmFuY2VcbiAgICAgICAgdmFyIF9EQTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdEQScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX0RBKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAnKCcgKyBfREEgKyAnKSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9EQSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgaW5oZXJpdChBY3JvRm9ybURpY3Rpb25hcnksIEFjcm9Gb3JtUERGT2JqZWN0KTtcblxuICAgIC8qKlxuICAgICogVGhlIEZpZWxkIE9iamVjdCBjb250YWlucyB0aGUgVmFyaWFibGVzLCB0aGF0IGV2ZXJ5IEZpZWxkIG5lZWRzXG4gICAgKiBcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUZpZWxkXG4gICAgKiBAY2xhc3NkZXNjIEFuIEFjcm9Gb3JtIEZpZWxkT2JqZWN0XG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1GaWVsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1QREZPYmplY3QuY2FsbCh0aGlzKTtcblxuICAgICAgICAvL0Fubm90YXRpb24tRmxhZyBTZWUgVGFibGUgMTY1XG4gICAgICAgIHZhciBfRiA9IDQ7XG4gICAgICAgIHRoaXMuaXNVbmljb2RlID0gZmFsc2U7XG4gICAgICAgIHRoaXMudHJ1ZVZhbHVlID0gJyc7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfRjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9GID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIFwiJyArIHZhbHVlICsgJ1wiIGZvciBhdHRyaWJ1dGUgRiBzdXBwbGllZC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS4yKSBJZiBzZXQsIHByaW50IHRoZSBhbm5vdGF0aW9uIHdoZW4gdGhlIHBhZ2UgaXMgcHJpbnRlZC4gSWYgY2xlYXIsIG5ldmVyIHByaW50IHRoZSBhbm5vdGF0aW9uLCByZWdhcmRsZXNzIG9mIHdldGhlciBpcyBpcyBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbi4gXG4gICAgICAgICogTk9URSAyIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgYW5ub3RhdGlvbnMgcmVwcmVzZW50aW5nIGludGVyYWN0aXZlIHB1c2hidXR0b25zLCB3aGljaCB3b3VsZCBzZXJ2ZSBubyBtZWFuaW5nZnVsIHB1cnBvc2Ugb24gdGhlIHByaW50ZWQgcGFnZS5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjc2hvd1doZW5QcmludGVkXG4gICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3Nob3dXaGVuUHJpbnRlZCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYoX0YsIDMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkYgPSBzZXRCaXRGb3JQZGYoX0YsIDMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRiA9IGNsZWFyQml0Rm9yUGRmKF9GLCAzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfRmYgPSAwO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0ZmJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9GZjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9GZiA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZSBcIicgKyB2YWx1ZSArICdcIiBmb3IgYXR0cmlidXRlIEZmIHN1cHBsaWVkLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9SZWN0ID0gW107XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnUmVjdCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChfUmVjdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9SZWN0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICBfUmVjdCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9SZWN0ID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgeC1wb3NpdGlvbiBvZiB0aGUgZmllbGQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3hcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd4Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX1JlY3QgfHwgaXNOYU4oX1JlY3RbMF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYW50aVNjYWxlKF9SZWN0WzBdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9SZWN0WzBdID0gc2NhbGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgeS1wb3NpdGlvbiBvZiB0aGUgZmllbGQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3lcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd5Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX1JlY3QgfHwgaXNOYU4oX1JlY3RbMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYW50aVNjYWxlKF9SZWN0WzFdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9SZWN0WzFdID0gc2NhbGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIGZpZWxkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCN3aWR0aFxuICAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3dpZHRoJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX1JlY3QgfHwgaXNOYU4oX1JlY3RbMl0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYW50aVNjYWxlKF9SZWN0WzJdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9SZWN0WzJdID0gc2NhbGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBmaWVsZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjaGVpZ2h0XG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaGVpZ2h0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX1JlY3QgfHwgaXNOYU4oX1JlY3RbM10pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYW50aVNjYWxlKF9SZWN0WzNdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9SZWN0WzNdID0gc2NhbGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX0ZUID0gXCJcIjtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdGVCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9GVFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICcvQnRuJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnL1R4JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnL0NoJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnL1NpZyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfRlQgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIFwiJyArIHZhbHVlICsgJ1wiIGZvciBhdHRyaWJ1dGUgRlQgc3VwcGxpZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX1QgPSBudWxsO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnVCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfVCB8fCBfVC5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgYSBDaGlsZCBmcm9tIGEgUmFkaW/CtEdyb3VwLCB5b3UgZG9uJ3QgbmVlZCBhIEZpZWxkTmFtZVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQ2hpbGRDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfVCA9IFwiRmllbGRPYmplY3RcIiArIChBY3JvRm9ybUZpZWxkLkZpZWxkTnVtKyspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gJygnICsgcGRmRXNjYXBlKF9UKSArICcpJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9UID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKE9wdGlvbmFsKSBUaGUgcGFydGlhbCBmaWVsZCBuYW1lIChzZWUgMTIuNy4zLjIsIOKAnEZpZWxkIE5hbWVz4oCdKS5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjZmllbGROYW1lXG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZmllbGROYW1lJywge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfVDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9UID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfZm9udE5hbWUgPSAnaGVsdmV0aWNhJztcbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIGZvbnROYW1lIG9mIHRoZSBmb250IHRvIGJlIHVzZWQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2ZvbnROYW1lXG4gICAgICAgICogQGRlZmF1bHQgJ2hlbHZldGljYSdcbiAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2ZvbnROYW1lJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZm9udE5hbWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfZm9udE5hbWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9mb250U3R5bGUgPSAnbm9ybWFsJztcbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIGZvbnRTdHlsZSBvZiB0aGUgZm9udCB0byBiZSB1c2VkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNmb250U3R5bGVcbiAgICAgICAgKiBAZGVmYXVsdCAnbm9ybWFsJ1xuICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZm9udFN0eWxlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZm9udFN0eWxlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX2ZvbnRTdHlsZSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX2ZvbnRTaXplID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIGZvbnRTaXplIG9mIHRoZSBmb250IHRvIGJlIHVzZWQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2ZvbnRTaXplXG4gICAgICAgICogQGRlZmF1bHQgMCAoZm9yIGF1dG8pXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdmb250U2l6ZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYW50aVNjYWxlKF9mb250U2l6ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfZm9udFNpemUgPSBzY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfbWF4Rm9udFNpemUgPSA1MDtcbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIG1heGltdW0gZm9udFNpemUgb2YgdGhlIGZvbnQgdG8gYmUgdXNlZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjbWF4Rm9udFNpemVcbiAgICAgICAgKiBAZGVmYXVsdCAwIChmb3IgYXV0bylcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ21heEZvbnRTaXplJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX21heEZvbnRTaXplKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9tYXhGb250U2l6ZSA9IHNjYWxlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9jb2xvciA9ICdibGFjayc7XG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSBjb2xvciBvZiB0aGUgdGV4dFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNjb2xvclxuICAgICAgICAqIEBkZWZhdWx0ICdibGFjaydcbiAgICAgICAgKiBAdHlwZSB7c3RyaW5nfHJnYmF9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY29sb3InLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb2xvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9jb2xvciA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX0RBID0gJy9GMSAwIFRmIDAgZyc7XG4gICAgICAgIC8vIERlZmluZXMgdGhlIGRlZmF1bHQgYXBwZWFyYW5jZSAoTmVlZGVkIGZvciB2YXJpYWJsZSBUZXh0KVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0RBJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9EQVxuICAgICAgICAgICAgICAgICAgICB8fCB0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1DaGlsZENsYXNzXG4gICAgICAgICAgICAgICAgICAgIHx8IHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybVRleHRGaWVsZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdG9QZGZTdHJpbmcoX0RBKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBfREEgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICB2YXIgX0RWID0gbnVsbDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdEVicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX0RWKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvUGRmU3RyaW5nKF9EVik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfRFY7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuc3Vic3RyKDAsIDEpID09PSAnKCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9EViA9IHBkZlVuZXNjYXBlKHZhbHVlLnN1YnN0cigxLCB2YWx1ZS5sZW5ndGggLSAyKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfRFYgPSBwZGZVbmVzY2FwZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfRFYgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChPcHRpb25hbDsgaW5oZXJpdGFibGUpIFRoZSBkZWZhdWx0IHZhbHVlIHRvIHdoaWNoIHRoZSBmaWVsZCByZXZlcnRzIHdoZW4gYSByZXNldC1mb3JtIGFjdGlvbiBpcyBleGVjdXRlZCAoc2VlIDEyLjcuNS4zLCDigJxSZXNldC1Gb3JtIEFjdGlvbuKAnSkuIFRoZSBmb3JtYXQgb2YgdGhpcyB2YWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGF0IG9mIHZhbHVlLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjZGVmYXVsdFZhbHVlXG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHthbnl9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZGVmYXVsdFZhbHVlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGRmVW5lc2NhcGUoX0RWLnN1YnN0cigxLCBfRFYubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfRFY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICBfRFYgPSAnLycgKyB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfRFYgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfViA9IG51bGw7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnVicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVW5pY29kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX1Y7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghX1YpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9QZGZTdHJpbmcoX1YpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX1Y7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNVbmljb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIF9WID0gdG9Vbmljb2RlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnVlVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdWJzdHIoMCwgMSkgPT09ICcoJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WID0gcGRmVW5lc2NhcGUodmFsdWUuc3Vic3RyKDEsIHZhbHVlLmxlbmd0aCAtIDIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX1YgPSBwZGZVbmVzY2FwZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfViA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoT3B0aW9uYWw7IGluaGVyaXRhYmxlKSBUaGUgZmllbGTigJlzIHZhbHVlLCB3aG9zZSBmb3JtYXQgdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgZmllbGQgdHlwZS4gU2VlIHRoZSBkZXNjcmlwdGlvbnMgb2YgaW5kaXZpZHVhbCBmaWVsZCB0eXBlcyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3ZhbHVlXG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHthbnl9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndmFsdWUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwZGZVbmVzY2FwZShfVi5zdWJzdHIoMSwgX1YubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfVjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9WID0gJy8nICsgdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX1YgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIENoZWNrIGlmIGZpZWxkIGhhcyBhbm5vdGF0aW9uc1xuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNoYXNBbm5vdGF0aW9uXG4gICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaGFzQW5ub3RhdGlvbicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuUmVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnVHlwZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmhhc0Fubm90YXRpb24pID8gXCIvQW5ub3RcIiA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnU3VidHlwZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmhhc0Fubm90YXRpb24pID8gXCIvV2lkZ2V0XCIgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX2hhc0FwcGVhcmFuY2VTdHJlYW0gPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICogdHJ1ZSBpZiBmaWVsZCBoYXMgYW4gYXBwZWFyYW5jZVN0cmVhbVxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNoYXNBcHBlYXJhbmNlU3RyZWFtXG4gICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaGFzQXBwZWFyYW5jZVN0cmVhbScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0ZWFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2hhc0FwcGVhcmFuY2VTdHJlYW07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IEJvb2xlYW4odmFsdWUpO1xuICAgICAgICAgICAgICAgIF9oYXNBcHBlYXJhbmNlU3RyZWFtID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSBwYWdlIG9uIHdoaWNoIHRoZSBBY3JvRm9ybUZpZWxkIGlzIHBsYWNlZFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNwYWdlXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgdmFyIF9wYWdlO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3BhZ2UnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfcGFnZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX3BhZ2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9wYWdlID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIHVzZXIgbWF5IG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4gQW55IGFzc29jaWF0ZWQgd2lkZ2V0IGFubm90YXRpb25zIHdpbGwgbm90IGludGVyYWN0IHdpdGggdGhlIHVzZXI7IHRoYXQgaXMsIHRoZXkgd2lsbCBub3QgcmVzcG9uZCB0byBtb3VzZSBjbGlja3Mgb3IgY2hhbmdlIHRoZWlyIGFwcGVhcmFuY2UgaW4gcmVzcG9uc2UgdG8gbW91c2UgbW90aW9ucy4gVGhpcyBmbGFnIGlzIHVzZWZ1bCBmb3IgZmllbGRzIHdob3NlIHZhbHVlcyBhcmUgY29tcHV0ZWQgb3IgaW1wb3J0ZWQgZnJvbSBhIGRhdGFiYXNlLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjcmVhZE9ubHlcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3JlYWRPbmx5Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBzaGFsbCBoYXZlIGEgdmFsdWUgYXQgdGhlIHRpbWUgaXQgaXMgZXhwb3J0ZWQgYnkgYSBzdWJtaXRmb3JtIGFjdGlvbiAoc2VlIDEyLjcuNS4yLCDigJxTdWJtaXQtRm9ybSBBY3Rpb27igJ0pLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjcmVxdWlyZWRcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3JlcXVpcmVkJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBzaGFsbCBub3QgYmUgZXhwb3J0ZWQgYnkgYSBzdWJtaXQtZm9ybSBhY3Rpb24gKHNlZSAxMi43LjUuMiwg4oCcU3VibWl0LUZvcm0gQWN0aW9u4oCdKVxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNub0V4cG9ydFxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbm9FeHBvcnQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgdmFyIF9RID0gbnVsbDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdRJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoX1EgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9RO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKFswLCAxLCAyXS5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgX1EgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgXCInICsgdmFsdWUgKyAnXCIgZm9yIGF0dHJpYnV0ZSBRIHN1cHBsaWVkLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKE9wdGlvbmFsOyBpbmhlcml0YWJsZSkgQSBjb2RlIHNwZWNpZnlpbmcgdGhlIGZvcm0gb2YgcXVhZGRpbmcgKGp1c3RpZmljYXRpb24pIHRoYXQgc2hhbGwgYmUgdXNlZCBpbiBkaXNwbGF5aW5nIHRoZSB0ZXh0OlxuICAgICAgICAqICdsZWZ0JywgJ2NlbnRlcicsICdyaWdodCdcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjdGV4dEFsaWduXG4gICAgICAgICogQGRlZmF1bHQgJ2xlZnQnXG4gICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0ZXh0QWxpZ24nLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX1EpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gJ2xlZnQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICdjZW50ZXInO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICdyaWdodCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX1EgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9RID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX1EgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICB9O1xuXG4gICAgaW5oZXJpdChBY3JvRm9ybUZpZWxkLCBBY3JvRm9ybVBERk9iamVjdCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1DaG9pY2VGaWVsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1GaWVsZC5jYWxsKHRoaXMpO1xuICAgICAgICAvLyBGaWVsZCBUeXBlID0gQ2hvaWNlIEZpZWxkXG4gICAgICAgIHRoaXMuRlQgPSBcIi9DaFwiO1xuICAgICAgICAvLyBvcHRpb25zXG4gICAgICAgIHRoaXMuViA9ICcoKSc7XG5cbiAgICAgICAgdGhpcy5mb250TmFtZSA9ICd6YXBmZGluZ2JhdHMnO1xuICAgICAgICAvLyBUb3AgSW5kZXhcbiAgICAgICAgdmFyIF9USSA9IDA7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdUSScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9USTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9USSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBNSyBmaXggZm9yIEFjcm9iYXRcbiAgICAgICAgdmFyIF9NSyA9ICc8PCAvQkcgWyAwLjk3NSAwLjk3NSAwLjk3NSBdICA+Pic7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTUsnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfTUs7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfTUsgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKE9wdGlvbmFsKSBGb3Igc2Nyb2xsYWJsZSBsaXN0IGJveGVzLCB0aGUgdG9wIGluZGV4ICh0aGUgaW5kZXggaW4gdGhlIE9wdCBhcnJheSBvZiB0aGUgZmlyc3Qgb3B0aW9uIHZpc2libGUgaW4gdGhlIGxpc3QpLiBEZWZhdWx0IHZhbHVlOiAwLlxuICAgICAgICAqIFxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjdG9wSW5kZXhcbiAgICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0b3BJbmRleCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX1RJO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1RJID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfT3B0ID0gW107XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnT3B0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1VuaWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5VG9QZGZVbmljb2RlQXJyYXkoX09wdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVRvUGRmQXJyYXkoX09wdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfT3B0ID0gcGRmQXJyYXlUb1N0cmluZ0FycmF5KHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICAvKipcbiAgICAgICAgKiBAbWVtYmVyb2YgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICAgICAqIEBuYW1lIGdldE9wdGlvbnNcbiAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IGFycmF5IG9mIE9wdGlvbnNcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5nZXRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9PcHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgKiBAbWVtYmVyb2YgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICAgICAqIEBuYW1lIHNldE9wdGlvbnNcbiAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgKiBAcGFyYW0ge2FycmF5fSB2YWx1ZVxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnNldE9wdGlvbnMgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIF9PcHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvcnQpIHtcbiAgICAgICAgICAgICAgICBfT3B0LnNvcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEBtZW1iZXJvZiBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgICAgICogQG5hbWUgYWRkT3B0aW9uXG4gICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuYWRkT3B0aW9uID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlIHx8IFwiXCI7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBfT3B0LnB1c2godmFsdWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc29ydCkge1xuICAgICAgICAgICAgICAgIF9PcHQuc29ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQG1lbWJlcm9mIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAgICAgKiBAbmFtZSByZW1vdmVPcHRpb25cbiAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbEVudHJpZXMgKGRlZmF1bHQ6IGZhbHNlKVxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlbW92ZU9wdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZSwgYWxsRW50cmllcykge1xuICAgICAgICAgICAgYWxsRW50cmllcyA9IGFsbEVudHJpZXMgfHwgZmFsc2VcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgfHwgXCJcIjtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgd2hpbGUgKF9PcHQuaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgX09wdC5zcGxpY2UoX09wdC5pbmRleE9mKHZhbHVlKSwgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGFsbEVudHJpZXMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBhIGNvbWJvIGJveDsgaWYgY2xlYXIsIHRoZSBmaWVsZCBpcyBhIGxpc3QgYm94LiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjY29tYm9cbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NvbWJvJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxOCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxOCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBjb21ibyBib3ggc2hhbGwgaW5jbHVkZSBhbiBlZGl0YWJsZSB0ZXh0IGJveCBhcyB3ZWxsIGFzIGEgZHJvcC1kb3duIGxpc3Q7IGlmIGNsZWFyLCBpdCBzaGFsbCBpbmNsdWRlIG9ubHkgYSBkcm9wLWRvd24gbGlzdC4gVGhpcyBmbGFnIHNoYWxsIGJlIHVzZWQgb25seSBpZiB0aGUgQ29tYm8gZmxhZyBpcyBzZXQuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNlZGl0XG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdlZGl0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxOSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy9QREYgMzIwMDAtMToyMDA4LCBwYWdlIDQ0NFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbWJvID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxOSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMTkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZOKAmXMgb3B0aW9uIGl0ZW1zIHNoYWxsIGJlIHNvcnRlZCBhbHBoYWJldGljYWxseS4gVGhpcyBmbGFnIGlzIGludGVuZGVkIGZvciB1c2UgYnkgd3JpdGVycywgbm90IGJ5IHJlYWRlcnMuIENvbmZvcm1pbmcgcmVhZGVycyBzaGFsbCBkaXNwbGF5IHRoZSBvcHRpb25zIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IG9jY3VyIGluIHRoZSBPcHQgYXJyYXkgKHNlZSBUYWJsZSAyMzEpLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjc29ydFxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc29ydCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjApKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIwKTtcbiAgICAgICAgICAgICAgICAgICAgX09wdC5zb3J0KCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDIwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS40KSBJZiBzZXQsIG1vcmUgdGhhbiBvbmUgb2YgdGhlIGZpZWxk4oCZcyBvcHRpb24gaXRlbXMgbWF5IGJlIHNlbGVjdGVkIHNpbXVsdGFuZW91c2x5OyBpZiBjbGVhciwgYXQgbW9zdCBvbmUgaXRlbSBzaGFsbCBiZSBzZWxlY3RlZCBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjbXVsdGlTZWxlY3RcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ211bHRpU2VsZWN0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyMikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjIpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDIyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS40KSBJZiBzZXQsIHRleHQgZW50ZXJlZCBpbiB0aGUgZmllbGQgc2hhbGwgbm90IGJlIHNwZWxsY2hlY2tlZC4gVGhpcyBmbGFnIHNoYWxsIG5vdCBiZSB1c2VkIHVubGVzcyB0aGUgQ29tYm8gYW5kIEVkaXQgZmxhZ3MgYXJlIGJvdGggc2V0LiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjZG9Ob3RTcGVsbENoZWNrXG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdkb05vdFNwZWxsQ2hlY2snLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIzKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyMyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDIzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS41KSBJZiBzZXQsIHRoZSBuZXcgdmFsdWUgc2hhbGwgYmUgY29tbWl0dGVkIGFzIHNvb24gYXMgYSBzZWxlY3Rpb24gaXMgbWFkZSAoY29tbW9ubHkgd2l0aCB0aGUgcG9pbnRpbmcgZGV2aWNlKS4gSW4gdGhpcyBjYXNlLCBzdXBwbHlpbmcgYSB2YWx1ZSBmb3IgYSBmaWVsZCBpbnZvbHZlcyB0aHJlZSBhY3Rpb25zOiBzZWxlY3RpbmcgdGhlIGZpZWxkIGZvciBmaWxsLWluLCBzZWxlY3RpbmcgYSBjaG9pY2UgZm9yIHRoZSBmaWxsLWluIHZhbHVlLCBhbmQgbGVhdmluZyB0aGF0IGZpZWxkLCB3aGljaCBmaW5hbGl6ZXMgb3Ig4oCcY29tbWl0c+KAnSB0aGUgZGF0YSBjaG9pY2UgYW5kIHRyaWdnZXJzIGFueSBhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50cnkgb3IgY2hhbmdpbmcgb2YgdGhpcyBkYXRhLiBJZiB0aGlzIGZsYWcgaXMgb24sIHRoZW4gcHJvY2Vzc2luZyBkb2VzIG5vdCB3YWl0IGZvciBsZWF2aW5nIHRoZSBmaWVsZCBhY3Rpb24gdG8gb2NjdXIsIGJ1dCBpbW1lZGlhdGVseSBwcm9jZWVkcyB0byB0aGUgdGhpcmQgc3RlcC5cbiAgICAgICAgKiBUaGlzIG9wdGlvbiBlbmFibGVzIGFwcGxpY2F0aW9ucyB0byBwZXJmb3JtIGFuIGFjdGlvbiBvbmNlIGEgc2VsZWN0aW9uIGlzIG1hZGUsIHdpdGhvdXQgcmVxdWlyaW5nIHRoZSB1c2VyIHRvIGV4aXQgdGhlIGZpZWxkLiBJZiBjbGVhciwgdGhlIG5ldyB2YWx1ZSBpcyBub3QgY29tbWl0dGVkIHVudGlsIHRoZSB1c2VyIGV4aXRzIHRoZSBmaWVsZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjY29tbWl0T25TZWxDaGFuZ2VcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NvbW1pdE9uU2VsQ2hhbmdlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyNykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyNyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIHRoaXMuaGFzQXBwZWFyYW5jZVN0cmVhbSA9IGZhbHNlO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUNob2ljZUZpZWxkLCBBY3JvRm9ybUZpZWxkKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtTGlzdEJveFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtTGlzdEJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1DaG9pY2VGaWVsZC5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLmZvbnROYW1lID0gJ2hlbHZldGljYSc7XG5cbiAgICAgICAgLy9QREYgMzIwMDAtMToyMDA4LCBwYWdlIDQ0NFxuICAgICAgICB0aGlzLmNvbWJvID0gZmFsc2U7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtTGlzdEJveCwgQWNyb0Zvcm1DaG9pY2VGaWVsZCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUNvbWJvQm94IFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1MaXN0Qm94XG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1Db21ib0JveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1MaXN0Qm94LmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuY29tYm8gPSB0cnVlO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUNvbWJvQm94LCBBY3JvRm9ybUxpc3RCb3gpO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1FZGl0Qm94IFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1Db21ib0JveFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1MaXN0Qm94XG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1FZGl0Qm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUNvbWJvQm94LmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuZWRpdCA9IHRydWU7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtRWRpdEJveCwgQWNyb0Zvcm1Db21ib0JveCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUJ1dHRvblxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtQnV0dG9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUZpZWxkLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuRlQgPSBcIi9CdG5cIjtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUmFkaW8gYnV0dG9ucyBvbmx5KSBJZiBzZXQsIGV4YWN0bHkgb25lIHJhZGlvIGJ1dHRvbiBzaGFsbCBiZSBzZWxlY3RlZCBhdCBhbGwgdGltZXM7IHNlbGVjdGluZyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGJ1dHRvbiBoYXMgbm8gZWZmZWN0LiBJZiBjbGVhciwgY2xpY2tpbmcgdGhlIHNlbGVjdGVkIGJ1dHRvbiBkZXNlbGVjdHMgaXQsIGxlYXZpbmcgbm8gYnV0dG9uIHNlbGVjdGVkLlxuICAgICAgICAqIFxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI25vVG9nZ2xlVG9PZmZcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdub1RvZ2dsZVRvT2ZmJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxNSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxNSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBhIHNldCBvZiByYWRpbyBidXR0b25zOyBpZiBjbGVhciwgdGhlIGZpZWxkIGlzIGEgY2hlY2tib3guIFRoaXMgZmxhZyBtYXkgYmUgc2V0IG9ubHkgaWYgdGhlIFB1c2hidXR0b24gZmxhZyBpcyBjbGVhci4gXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jcmFkaW9cbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdyYWRpbycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMTYpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE2KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMTYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgZmllbGQgaXMgYSBwdXNoYnV0dG9uIHRoYXQgZG9lcyBub3QgcmV0YWluIGEgcGVybWFuZW50IHZhbHVlLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI3B1c2hCdXR0b25cbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdwdXNoQnV0dG9uJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxNykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxNyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNSkgSWYgc2V0LCBhIGdyb3VwIG9mIHJhZGlvIGJ1dHRvbnMgd2l0aGluIGEgcmFkaW8gYnV0dG9uIGZpZWxkIHRoYXQgdXNlIHRoZSBzYW1lIHZhbHVlIGZvciB0aGUgb24gc3RhdGUgd2lsbCB0dXJuIG9uIGFuZCBvZmYgaW4gdW5pc29uOyB0aGF0IGlzIGlmIG9uZSBpcyBjaGVja2VkLCB0aGV5IGFyZSBhbGwgY2hlY2tlZC4gSWYgY2xlYXIsIHRoZSBidXR0b25zIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgKHRoZSBzYW1lIGJlaGF2aW9yIGFzIEhUTUwgcmFkaW8gYnV0dG9ucykuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNyYWRpb0lzVW5pc29uXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncmFkaW9Jc1VuaXNvbicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjYpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI2KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9NSyA9IHt9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ01LJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKF9NSykubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJzw8Jyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoa2V5IGluIF9NSykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJy8nICsga2V5ICsgJyAoJyArIF9NS1trZXldICsgJyknKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnPj4nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCdcXG4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgX01LID0gdmFsdWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEZyb20gdGhlIFBERiByZWZlcmVuY2U6XG4gICAgICAgICogKE9wdGlvbmFsLCBidXR0b24gZmllbGRzIG9ubHkpIFRoZSB3aWRnZXQgYW5ub3RhdGlvbidzIG5vcm1hbCBjYXB0aW9uIHdoaWNoIHNoYWxsIGJlIGRpc3BsYXllZCB3aGVuIGl0IGlzIG5vdCBpbnRlcmFjdGluZyB3aXRoIHRoZSB1c2VyLiBcbiAgICAgICAgKiBVbmxpa2UgdGhlIHJlbWFpbmluZyBlbnRyaWVzIGxpc3RlZCBpbiB0aGlzIFRhYmxlIHdoaWNoIGFwcGx5IG9ubHkgdG8gd2lkZ2V0IGFubm90YXRpb25zIGFzc29jaWF0ZWQgd2l0aCBwdXNoYnV0dG9uIGZpZWxkcyAoc2VlIFB1c2hidXR0b25zIGluIDEyLjcuNC4yLCBcIkJ1dHRvbiBGaWVsZHNcIiksIHRoZSBDQSBlbnRyeSBtYXkgYmUgdXNlZCB3aXRoIGFueSB0eXBlIG9mIGJ1dHRvbiBmaWVsZCwgaW5jbHVkaW5nIGNoZWNrIGJveGVzIChzZWUgQ2hlY2sgQm94ZXMgaW4gMTIuNy40LjIsIFwiQnV0dG9uIEZpZWxkc1wiKSBhbmQgcmFkaW8gYnV0dG9ucyAoUmFkaW8gQnV0dG9ucyBpbiAxMi43LjQuMiwgXCJCdXR0b24gRmllbGRzXCIpLlxuICAgICAgICAqXG4gICAgICAgICogLSAnOCcgPSBDcm9zcywgXG4gICAgICAgICogLSAnbCcgPSAgQ2lyY2xlLFxuICAgICAgICAqIC0gJycgPSBub3RoaW5nXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jY2FwdGlvblxuICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY2FwdGlvbicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX01LLkNBIHx8ICcnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBfTUsuQ0EgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfQVM7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnQVMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0FTO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0FTID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFJlcXVpcmVkIGlmIHRoZSBhcHBlYXJhbmNlIGRpY3Rpb25hcnkgQVAgY29udGFpbnMgb25lIG9yIG1vcmUgc3ViZGljdGlvbmFyaWVzOyBQREYgMS4yKSBUaGUgYW5ub3RhdGlvbidzIGFwcGVhcmFuY2Ugc3RhdGUsIHdoaWNoIHNlbGVjdHMgdGhlIGFwcGxpY2FibGUgYXBwZWFyYW5jZSBzdHJlYW0gZnJvbSBhbiBhcHBlYXJhbmNlIHN1YmRpY3Rpb25hcnkgKHNlZSBTZWN0aW9uIDEyLjUuNSwgXCJBcHBlYXJhbmNlIFN0cmVhbXNcIilcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI2FwcGVhcmFuY2VTdGF0ZVxuICAgICAgICAqIEB0eXBlIHthbnl9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYXBwZWFyYW5jZVN0YXRlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfQVMuc3Vic3RyKDEsIF9BUy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9BUyA9ICcvJyArIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUJ1dHRvbiwgQWNyb0Zvcm1GaWVsZCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybVB1c2hCdXR0b25cbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtQnV0dG9uXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1QdXNoQnV0dG9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUJ1dHRvbi5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLnB1c2hCdXR0b24gPSB0cnVlO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybVB1c2hCdXR0b24sIEFjcm9Gb3JtQnV0dG9uKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtUmFkaW9CdXR0b25cbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtQnV0dG9uXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1SYWRpb0J1dHRvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1CdXR0b24uY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5yYWRpbyA9IHRydWU7XG4gICAgICAgIHRoaXMucHVzaEJ1dHRvbiA9IGZhbHNlO1xuXG4gICAgICAgIHZhciBfS2lkcyA9IFtdO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0tpZHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfS2lkcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgX0tpZHMgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfS2lkcyA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtUmFkaW9CdXR0b24sIEFjcm9Gb3JtQnV0dG9uKTtcblxuICAgIC8qKlxuICAgICogVGhlIENoaWxkIGNsYXNzIG9mIGEgUmFkaW9CdXR0b24gKHRoZSByYWRpb0dyb3VwKSAtPiBUaGUgc2luZ2xlIEJ1dHRvbnNcbiAgICAqIFxuICAgICogQGNsYXNzIEFjcm9Gb3JtQ2hpbGRDbGFzc1xuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICogQGlnbm9yZVxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtQ2hpbGRDbGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1GaWVsZC5jYWxsKHRoaXMpO1xuXG4gICAgICAgIHZhciBfcGFyZW50O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1BhcmVudCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcGFyZW50O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX3BhcmVudCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX29wdGlvbk5hbWU7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnb3B0aW9uTmFtZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9vcHRpb25OYW1lO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX29wdGlvbk5hbWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9NSyA9IHt9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ01LJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc8PCcpO1xuICAgICAgICAgICAgICAgIHZhciBrZXk7XG4gICAgICAgICAgICAgICAgZm9yIChrZXkgaW4gX01LKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcvJyArIGtleSArICcgKCcgKyBfTUtba2V5XSArICcpJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc+PicpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuam9pbignXFxuJyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIF9NSyA9IHZhbHVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBGcm9tIHRoZSBQREYgcmVmZXJlbmNlOlxuICAgICAgICAqIChPcHRpb25hbCwgYnV0dG9uIGZpZWxkcyBvbmx5KSBUaGUgd2lkZ2V0IGFubm90YXRpb24ncyBub3JtYWwgY2FwdGlvbiB3aGljaCBzaGFsbCBiZSBkaXNwbGF5ZWQgd2hlbiBpdCBpcyBub3QgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdXNlci4gXG4gICAgICAgICogVW5saWtlIHRoZSByZW1haW5pbmcgZW50cmllcyBsaXN0ZWQgaW4gdGhpcyBUYWJsZSB3aGljaCBhcHBseSBvbmx5IHRvIHdpZGdldCBhbm5vdGF0aW9ucyBhc3NvY2lhdGVkIHdpdGggcHVzaGJ1dHRvbiBmaWVsZHMgKHNlZSBQdXNoYnV0dG9ucyBpbiAxMi43LjQuMiwgXCJCdXR0b24gRmllbGRzXCIpLCB0aGUgQ0EgZW50cnkgbWF5IGJlIHVzZWQgd2l0aCBhbnkgdHlwZSBvZiBidXR0b24gZmllbGQsIGluY2x1ZGluZyBjaGVjayBib3hlcyAoc2VlIENoZWNrIEJveGVzIGluIDEyLjcuNC4yLCBcIkJ1dHRvbiBGaWVsZHNcIikgYW5kIHJhZGlvIGJ1dHRvbnMgKFJhZGlvIEJ1dHRvbnMgaW4gMTIuNy40LjIsIFwiQnV0dG9uIEZpZWxkc1wiKS5cbiAgICAgICAgKlxuICAgICAgICAqIC0gJzgnID0gQ3Jvc3MsIFxuICAgICAgICAqIC0gJ2wnID0gIENpcmNsZSxcbiAgICAgICAgKiAtICcnID0gbm90aGluZ1xuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI2NhcHRpb25cbiAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NhcHRpb24nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9NSy5DQSB8fCAnJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgX01LLkNBID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX0FTO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0FTJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9BUztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9BUyA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUmVxdWlyZWQgaWYgdGhlIGFwcGVhcmFuY2UgZGljdGlvbmFyeSBBUCBjb250YWlucyBvbmUgb3IgbW9yZSBzdWJkaWN0aW9uYXJpZXM7IFBERiAxLjIpIFRoZSBhbm5vdGF0aW9uJ3MgYXBwZWFyYW5jZSBzdGF0ZSwgd2hpY2ggc2VsZWN0cyB0aGUgYXBwbGljYWJsZSBhcHBlYXJhbmNlIHN0cmVhbSBmcm9tIGFuIGFwcGVhcmFuY2Ugc3ViZGljdGlvbmFyeSAoc2VlIFNlY3Rpb24gMTIuNS41LCBcIkFwcGVhcmFuY2UgU3RyZWFtc1wiKVxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jYXBwZWFyYW5jZVN0YXRlXG4gICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdhcHBlYXJhbmNlU3RhdGUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9BUy5zdWJzdHIoMSwgX0FTLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0FTID0gJy8nICsgdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNhcHRpb24gPSAnbCc7XG4gICAgICAgIHRoaXMuYXBwZWFyYW5jZVN0YXRlID0gJ09mZic7XG4gICAgICAgIC8vIHRvZG86IHNldCBBcHBlYXJhbmNlVHlwZSBhcyB2YXJpYWJsZSB0aGF0IGNhbiBiZSBzZXQgZnJvbSB0aGVcbiAgICAgICAgLy8gb3V0c2lkZS4uLlxuICAgICAgICB0aGlzLl9BcHBlYXJhbmNlVHlwZSA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGU7XG4gICAgICAgIC8vIFRoZSBEZWZhdWx0IGFwcGVhcmFuY2VUeXBlIGlzIHRoZSBDaXJjbGVcbiAgICAgICAgdGhpcy5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCA9IHRoaXMuX0FwcGVhcmFuY2VUeXBlLmNyZWF0ZUFwcGVhcmFuY2VTdHJlYW0odGhpcy5vcHRpb25OYW1lKTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1DaGlsZENsYXNzLCBBY3JvRm9ybUZpZWxkKTtcblxuICAgIEFjcm9Gb3JtUmFkaW9CdXR0b24ucHJvdG90eXBlLnNldEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoYXBwZWFyYW5jZSkge1xuICAgICAgICBpZiAoISgnY3JlYXRlQXBwZWFyYW5jZVN0cmVhbScgaW4gYXBwZWFyYW5jZSAmJiAnZ2V0Q0EnIGluIGFwcGVhcmFuY2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBhc3NpZ24gQXBwZWFyYW5jZSB0byBSYWRpb0J1dHRvbi4gQXBwZWFyYW5jZSB3YXMgSW52YWxpZCFcIik7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgb2JqSWQgaW4gdGhpcy5LaWRzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5LaWRzLmhhc093blByb3BlcnR5KG9iaklkKSkge1xuICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuS2lkc1tvYmpJZF07XG4gICAgICAgICAgICAgICAgY2hpbGQuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgPSBhcHBlYXJhbmNlLmNyZWF0ZUFwcGVhcmFuY2VTdHJlYW0oY2hpbGQub3B0aW9uTmFtZSk7XG4gICAgICAgICAgICAgICAgY2hpbGQuY2FwdGlvbiA9IGFwcGVhcmFuY2UuZ2V0Q0EoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBBY3JvRm9ybVJhZGlvQnV0dG9uLnByb3RvdHlwZS5jcmVhdGVPcHRpb24gPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAvLyBDcmVhdGUgbmV3IENoaWxkIGZvciBSYWRpb0dyb3VwXG4gICAgICAgIHZhciBjaGlsZCA9IG5ldyBBY3JvRm9ybUNoaWxkQ2xhc3MoKTtcbiAgICAgICAgY2hpbGQuUGFyZW50ID0gdGhpcztcbiAgICAgICAgY2hpbGQub3B0aW9uTmFtZSA9IG5hbWU7XG4gICAgICAgIC8vIEFkZCB0byBQYXJlbnRcbiAgICAgICAgdGhpcy5LaWRzLnB1c2goY2hpbGQpO1xuXG4gICAgICAgIGFkZEZpZWxkLmNhbGwodGhpcywgY2hpbGQpO1xuXG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1DaGVja0JveFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1CdXR0b25cbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUNoZWNrQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUJ1dHRvbi5jYWxsKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuZm9udE5hbWUgPSAnemFwZmRpbmdiYXRzJztcbiAgICAgICAgdGhpcy5jYXB0aW9uID0gJzMnO1xuICAgICAgICB0aGlzLmFwcGVhcmFuY2VTdGF0ZSA9ICdPbic7XG4gICAgICAgIHRoaXMudmFsdWUgPSBcIk9uXCI7XG4gICAgICAgIHRoaXMudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgIHRoaXMuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgPSBBY3JvRm9ybUFwcGVhcmFuY2UuQ2hlY2tCb3guY3JlYXRlQXBwZWFyYW5jZVN0cmVhbSgpO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUNoZWNrQm94LCBBY3JvRm9ybUJ1dHRvbik7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybVRleHRGaWVsZFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtVGV4dEZpZWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUZpZWxkLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuRlQgPSAnL1R4JztcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBtYXkgY29udGFpbiBtdWx0aXBsZSBsaW5lcyBvZiB0ZXh0OyBpZiBjbGVhciwgdGhlIGZpZWxk4oCZcyB0ZXh0IHNoYWxsIGJlIHJlc3RyaWN0ZWQgdG8gYSBzaW5nbGUgbGluZS4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNtdWx0aWxpbmVcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdtdWx0aWxpbmUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDEzKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxMyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDEzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS40KSBJZiBzZXQsIHRoZSB0ZXh0IGVudGVyZWQgaW4gdGhlIGZpZWxkIHJlcHJlc2VudHMgdGhlIHBhdGhuYW1lIG9mIGEgZmlsZSB3aG9zZSBjb250ZW50cyBzaGFsbCBiZSBzdWJtaXR0ZWQgYXMgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4gXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjZmlsZVNlbGVjdFxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2ZpbGVTZWxlY3QnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIxKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDIxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS40KSBJZiBzZXQsIHRleHQgZW50ZXJlZCBpbiB0aGUgZmllbGQgc2hhbGwgbm90IGJlIHNwZWxsLWNoZWNrZWQuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjZG9Ob3RTcGVsbENoZWNrXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZG9Ob3RTcGVsbENoZWNrJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyMykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyMyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNCkgSWYgc2V0LCB0aGUgZmllbGQgc2hhbGwgbm90IHNjcm9sbCAoaG9yaXpvbnRhbGx5IGZvciBzaW5nbGUtbGluZSBmaWVsZHMsIHZlcnRpY2FsbHkgZm9yIG11bHRpcGxlLWxpbmUgZmllbGRzKSB0byBhY2NvbW1vZGF0ZSBtb3JlIHRleHQgdGhhbiBmaXRzIHdpdGhpbiBpdHMgYW5ub3RhdGlvbiByZWN0YW5nbGUuIE9uY2UgdGhlIGZpZWxkIGlzIGZ1bGwsIG5vIGZ1cnRoZXIgdGV4dCBzaGFsbCBiZSBhY2NlcHRlZCBmb3IgaW50ZXJhY3RpdmUgZm9ybSBmaWxsaW5nOyBmb3Igbm9uaW50ZXJhY3RpdmUgZm9ybSBmaWxsaW5nLCB0aGUgZmlsbGVyIHNob3VsZCB0YWtlIGNhcmUgbm90IHRvIGFkZCBtb3JlIGNoYXJhY3RlciB0aGFuIHdpbGwgdmlzaWJseSBmaXQgaW4gdGhlIGRlZmluZWQgYXJlYS4gXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjZG9Ob3RTY3JvbGxcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdkb05vdFNjcm9sbCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjQpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjUpIE1heSBiZSBzZXQgb25seSBpZiB0aGUgTWF4TGVuIGVudHJ5IGlzIHByZXNlbnQgaW4gdGhlIHRleHQgZmllbGQgZGljdGlvbmFyeSAoc2VlIFRhYmxlIDIyOSkgYW5kIGlmIHRoZSBNdWx0aWxpbmUsIFBhc3N3b3JkLCBhbmQgRmlsZVNlbGVjdCBmbGFncyBhcmUgY2xlYXIuIElmIHNldCwgdGhlIGZpZWxkIHNoYWxsIGJlIGF1dG9tYXRpY2FsbHkgZGl2aWRlZCBpbnRvIGFzIG1hbnkgZXF1YWxseSBzcGFjZWQgcG9zaXRpb25zLCBvciBjb21icywgYXMgdGhlIHZhbHVlIG9mIE1heExlbiwgYW5kIHRoZSB0ZXh0IGlzIGxhaWQgb3V0IGludG8gdGhvc2UgY29tYnMuXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjY29tYlxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NvbWInLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI1KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyNSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDI1KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS41KSBJZiBzZXQsIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIHNoYWxsIGJlIGEgcmljaCB0ZXh0IHN0cmluZyAoc2VlIDEyLjcuMy40LCDigJxSaWNoIFRleHQgU3RyaW5nc+KAnSkuIElmIHRoZSBmaWVsZCBoYXMgYSB2YWx1ZSwgdGhlIFJWIGVudHJ5IG9mIHRoZSBmaWVsZCBkaWN0aW9uYXJ5IChUYWJsZSAyMjIpIHNoYWxsIHNwZWNpZnkgdGhlIHJpY2ggdGV4dCBzdHJpbmcuXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjcmljaFRleHRcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdyaWNoVGV4dCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjYpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI2KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9NYXhMZW4gPSBudWxsO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ01heExlbicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9NYXhMZW47XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfTWF4TGVuID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChPcHRpb25hbDsgaW5oZXJpdGFibGUpIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgZmllbGTigJlzIHRleHQsIGluIGNoYXJhY3RlcnMuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjbWF4TGVuZ3RoXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdtYXhMZW5ndGgnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9NYXhMZW47XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgX01heExlbiA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2hhc0FwcGVhcmFuY2VTdHJlYW0nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLlYgfHwgdGhpcy5EVik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtVGV4dEZpZWxkLCBBY3JvRm9ybUZpZWxkKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtUGFzc3dvcmRGaWVsZFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1UZXh0RmllbGRcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybVBhc3N3b3JkRmllbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtVGV4dEZpZWxkLmNhbGwodGhpcyk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgZmllbGQgaXMgaW50ZW5kZWQgZm9yIGVudGVyaW5nIGEgc2VjdXJlIHBhc3N3b3JkIHRoYXQgc2hvdWxkIG5vdCBiZSBlY2hvZWQgdmlzaWJseSB0byB0aGUgc2NyZWVuLiBDaGFyYWN0ZXJzIHR5cGVkIGZyb20gdGhlIGtleWJvYXJkIHNoYWxsIGluc3RlYWQgYmUgZWNob2VkIGluIHNvbWUgdW5yZWFkYWJsZSBmb3JtLCBzdWNoIGFzIGFzdGVyaXNrcyBvciBidWxsZXQgY2hhcmFjdGVycy5cbiAgICAgICAgKiBOT1RFIFRvIHByb3RlY3QgcGFzc3dvcmQgY29uZmlkZW50aWFsaXR5LCByZWFkZXJzIHNob3VsZCBuZXZlciBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIHRleHQgZmllbGQgaW4gdGhlIFBERiBmaWxlIGlmIHRoaXMgZmxhZyBpcyBzZXQuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjcGFzc3dvcmRcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdwYXNzd29yZCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMTQpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMTQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucGFzc3dvcmQgPSB0cnVlO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybVBhc3N3b3JkRmllbGQsIEFjcm9Gb3JtVGV4dEZpZWxkKTtcblxuXG4gICAgLy8gQ29udGFpbnMgTWV0aG9kcyBmb3IgY3JlYXRpbmcgc3RhbmRhcmQgYXBwZWFyYW5jZXNcbiAgICB2YXIgQWNyb0Zvcm1BcHBlYXJhbmNlID0ge1xuICAgICAgICBDaGVja0JveDoge1xuICAgICAgICAgICAgY3JlYXRlQXBwZWFyYW5jZVN0cmVhbTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBhcHBlYXJhbmNlID0ge1xuICAgICAgICAgICAgICAgICAgICBOOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPbjogQWNyb0Zvcm1BcHBlYXJhbmNlLkNoZWNrQm94Llllc05vcm1hbFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBEOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPbjogQWNyb0Zvcm1BcHBlYXJhbmNlLkNoZWNrQm94Llllc1B1c2hEb3duLFxuICAgICAgICAgICAgICAgICAgICAgICAgT2ZmOiBBY3JvRm9ybUFwcGVhcmFuY2UuQ2hlY2tCb3guT2ZmUHVzaERvd25cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gYXBwZWFyYW5jZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBPbiBBcHBlYXJhbmNlIGZvciBhIENoZWNrQm94XG4gICAgICAgICAgICAgICogXG4gICAgICAgICAgICAgICogQHJldHVybnMge0Fjcm9Gb3JtWE9iamVjdH1cbiAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIFllc1B1c2hEb3duOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgZm9udEtleSA9IHNjb3BlLmludGVybmFsLmdldEZvbnQoZm9ybU9iamVjdC5mb250TmFtZSwgZm9ybU9iamVjdC5mb250U3R5bGUpLmlkO1xuICAgICAgICAgICAgICAgIHZhciBlbmNvZGVkQ29sb3IgPSBzY29wZS5fX3ByaXZhdGVfXy5lbmNvZGVDb2xvclN0cmluZyhmb3JtT2JqZWN0LmNvbG9yKTtcbiAgICAgICAgICAgICAgICB2YXIgY2FsY1JlcyA9IGNhbGN1bGF0ZVgoZm9ybU9iamVjdCwgZm9ybU9iamVjdC5jYXB0aW9uKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAuNzQ5MDIzIGdcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkpICsgXCIgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIkJNQ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgMSByZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi9cIiArIGZvbnRLZXkgKyBcIiBcIiArIGYyKGNhbGNSZXMuZm9udFNpemUpICsgXCIgVGYgXCIgKyBlbmNvZGVkQ29sb3IpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiQlRcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goY2FsY1Jlcy50ZXh0KTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIkVUXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIkVNQ1wiKTtcbiAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgWWVzTm9ybWFsOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBmb250S2V5ID0gc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udChmb3JtT2JqZWN0LmZvbnROYW1lLCBmb3JtT2JqZWN0LmZvbnRTdHlsZSkuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIGVuY29kZWRDb2xvciA9IHNjb3BlLl9fcHJpdmF0ZV9fLmVuY29kZUNvbG9yU3RyaW5nKGZvcm1PYmplY3QuY29sb3IpO1xuICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0ID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIGNhbGNSZXMgPSBjYWxjdWxhdGVYKGZvcm1PYmplY3QsIGZvcm1PYmplY3QuY2FwdGlvbik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIxIGdcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgXCIgKyBmMih3aWR0aCkgKyBcIiBcIiArIGYyKGhlaWdodCkgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCAwIDEgcmdcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgXCIgKyBmMih3aWR0aCAtIDEpICsgXCIgXCIgKyBmMihoZWlnaHQgLSAxKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiV1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIm5cIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIGdcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJCVFwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi9cIiArIGZvbnRLZXkgKyBcIiBcIiArIGYyKGNhbGNSZXMuZm9udFNpemUpICsgXCIgVGYgXCIgKyBlbmNvZGVkQ29sb3IpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGNhbGNSZXMudGV4dCk7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJFVFwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAqIFJldHVybnMgdGhlIHN0YW5kYXJkIE9mZiBBcHBlYXJhbmNlIGZvciBhIENoZWNrQm94XG4gICAgICAgICAgICAgICogXG4gICAgICAgICAgICAgICogQHJldHVybnMge0Fjcm9Gb3JtWE9iamVjdH1cbiAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIE9mZlB1c2hEb3duOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAuNzQ5MDIzIGdcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkpICsgXCIgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIFJhZGlvQnV0dG9uOiB7XG4gICAgICAgICAgICBDaXJjbGU6IHtcbiAgICAgICAgICAgICAgICBjcmVhdGVBcHBlYXJhbmNlU3RyZWFtOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBEOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09mZic6IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGUuT2ZmUHVzaERvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBOOiB7fVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtQ29udGVudC5OW25hbWVdID0gQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZS5ZZXNOb3JtYWw7XG4gICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50LkRbbmFtZV0gPSBBY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ2lyY2xlLlllc1B1c2hEb3duO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXRDQTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2wnO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBZZXNOb3JtYWw6IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgICAgIC8vIE1ha2UgdGhlIFJhZGl1cyBvZiB0aGUgQ2lyY2xlIHJlbGF0aXZlIHRvIG1pbihoZWlnaHQsIHdpZHRoKSBvZiBmb3JtT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIHZhciBEb3RSYWRpdXMgPSAoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIDw9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpID8gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC8gNCA6IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLyA0O1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQm9yZGVycGFkZGluZy4uLlxuICAgICAgICAgICAgICAgICAgICBEb3RSYWRpdXMgPSBOdW1iZXIoKERvdFJhZGl1cyAqIDAuOSkudG9GaXhlZCg1KSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLkJlemllcl9DO1xuICAgICAgICAgICAgICAgICAgICB2YXIgRG90UmFkaXVzQmV6aWVyID0gTnVtYmVyKChEb3RSYWRpdXMgKiBjKS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICAqIFRoZSBGb2xsb3dpbmcgaXMgYSBDaXJjbGUgY3JlYXRlZCB3aXRoIEJlemllci1DdXJ2ZXMuXG4gICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgMCAwIDEgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyAyKSArIFwiIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDIpICsgXCIgY21cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKERvdFJhZGl1cyArIFwiIDAgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goRG90UmFkaXVzICsgXCIgXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiBcIiArIERvdFJhZGl1c0JlemllciArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgMCBcIiArIERvdFJhZGl1cyArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsgRG90UmFkaXVzQmV6aWVyICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiBcIiArIERvdFJhZGl1c0JlemllciArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBEb3RSYWRpdXMgKyBcIiAtXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiAtXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiAwIC1cIiArIERvdFJhZGl1cyArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKERvdFJhZGl1c0JlemllciArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgLVwiICsgRG90UmFkaXVzQmV6aWVyICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFllc1B1c2hEb3duOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgRG90UmFkaXVzID0gKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSA8PSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyA0IDogQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBCb3JkZXJwYWRkaW5nLi4uXG4gICAgICAgICAgICAgICAgICAgIHZhciBEb3RSYWRpdXMgPSBOdW1iZXIoKERvdFJhZGl1cyAqIDAuOSkudG9GaXhlZCg1KSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgcmVzdWx0cyBmb3IgbGF0ZXIgdXNlOyBubyBuZWVkIHRvIHdhc3RlXG4gICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NvciB0aWNrcyBvbiBkb2luZyBtYXRoXG4gICAgICAgICAgICAgICAgICAgIHZhciBrID0gTnVtYmVyKChEb3RSYWRpdXMgKiAyKS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtjID0gTnVtYmVyKChrICogQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLkJlemllcl9DKS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRjID0gTnVtYmVyKChEb3RSYWRpdXMgKiBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuQmV6aWVyX0MpLnRvRml4ZWQoNSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMC43NDkwMjMgZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgMCAwIDEgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyAyKSArIFwiIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDIpICsgXCIgY21cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGsgKyBcIiAwIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGsgKyBcIiBcIiArIGtjICsgXCIgXCIgKyBrYyArIFwiIFwiICsgayArIFwiIDAgXCIgKyBrICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBrYyArIFwiIFwiICsgayArIFwiIC1cIiArIGsgKyBcIiBcIiArIGtjICsgXCIgLVwiICsgayArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBrICsgXCIgLVwiICsga2MgKyBcIiAtXCIgKyBrYyArIFwiIC1cIiArIGsgKyBcIiAwIC1cIiArIGsgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChrYyArIFwiIC1cIiArIGsgKyBcIiBcIiArIGsgKyBcIiAtXCIgKyBrYyArIFwiIFwiICsgayArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCBnXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSAwIDAgMSBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAvIDIpICsgXCIgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC8gMikgKyBcIiBjbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goRG90UmFkaXVzICsgXCIgMCBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlwiICsgRG90UmFkaXVzICsgXCIgXCIgKyBkYyArIFwiIFwiICsgZGMgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIDAgXCIgKyBEb3RSYWRpdXMgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIGRjICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiBcIiArIGRjICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIERvdFJhZGl1cyArIFwiIC1cIiArIGRjICsgXCIgLVwiICsgZGMgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiAwIC1cIiArIERvdFJhZGl1cyArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGRjICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAtXCIgKyBkYyArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBPZmZQdXNoRG93bjogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIERvdFJhZGl1cyA9IChBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgPD0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC8gNCA6IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLyA0O1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQm9yZGVycGFkZGluZy4uLlxuICAgICAgICAgICAgICAgICAgICBEb3RSYWRpdXMgPSBOdW1iZXIoKERvdFJhZGl1cyAqIDAuOSkudG9GaXhlZCg1KSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgcmVzdWx0cyBmb3IgbGF0ZXIgdXNlOyBubyBuZWVkIHRvIHdhc3RlXG4gICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NvciB0aWNrcyBvbiBkb2luZyBtYXRoXG4gICAgICAgICAgICAgICAgICAgIHZhciBrID0gTnVtYmVyKChEb3RSYWRpdXMgKiAyKS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtjID0gTnVtYmVyKChrICogQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLkJlemllcl9DKS50b0ZpeGVkKDUpKTtcblxuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAuNzQ5MDIzIGdcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIxIDAgMCAxIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC8gMikgKyBcIiBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLyAyKSArIFwiIGNtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChrICsgXCIgMCBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChrICsgXCIgXCIgKyBrYyArIFwiIFwiICsga2MgKyBcIiBcIiArIGsgKyBcIiAwIFwiICsgayArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsga2MgKyBcIiBcIiArIGsgKyBcIiAtXCIgKyBrICsgXCIgXCIgKyBrYyArIFwiIC1cIiArIGsgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsgayArIFwiIC1cIiArIGtjICsgXCIgLVwiICsga2MgKyBcIiAtXCIgKyBrICsgXCIgMCAtXCIgKyBrICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goa2MgKyBcIiAtXCIgKyBrICsgXCIgXCIgKyBrICsgXCIgLVwiICsga2MgKyBcIiBcIiArIGsgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgQ3Jvc3M6IHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICogQ3JlYXRlcyB0aGUgQWN0dWFsIEFwcGVhcmFuY2VEaWN0aW9uYXJ5LVJlZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICogXG4gICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICAgICAgICAgICAgICAqIEBpZ25vcmVcbiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY3JlYXRlQXBwZWFyYW5jZVN0cmVhbTogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgRDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPZmYnOiBBY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ3Jvc3MuT2ZmUHVzaERvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBOOiB7fVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtQ29udGVudC5OW25hbWVdID0gQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNyb3NzLlllc05vcm1hbDtcbiAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQuRFtuYW1lXSA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5Dcm9zcy5ZZXNQdXNoRG93bjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ2V0Q0E6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc4J1xuICAgICAgICAgICAgICAgIH0sXG5cblxuICAgICAgICAgICAgICAgIFllc05vcm1hbDogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNyb3NzID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmNhbGN1bGF0ZUNyb3NzKGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSAxIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC0gMikgKyBcIiBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLSAyKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIldcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiblwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDEueCkgKyBcIiBcIiArIGYyKGNyb3NzLngxLnkpICsgXCIgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDIueCkgKyBcIiBcIiArIGYyKGNyb3NzLngyLnkpICsgXCIgbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDQueCkgKyBcIiBcIiArIGYyKGNyb3NzLng0LnkpICsgXCIgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDMueCkgKyBcIiBcIiArIGYyKGNyb3NzLngzLnkpICsgXCIgbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJzXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgWWVzUHVzaERvd246IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY3Jvc3MgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuY2FsY3VsYXRlQ3Jvc3MoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwLjc0OTAyMyBnXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSkgKyBcIiBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgMSBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAtIDIpICsgXCIgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC0gMikgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJXXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIm5cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLngxLngpICsgXCIgXCIgKyBmMihjcm9zcy54MS55KSArIFwiIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLngyLngpICsgXCIgXCIgKyBmMihjcm9zcy54Mi55KSArIFwiIGxcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLng0LngpICsgXCIgXCIgKyBmMihjcm9zcy54NC55KSArIFwiIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLngzLngpICsgXCIgXCIgKyBmMihjcm9zcy54My55KSArIFwiIGxcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwic1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE9mZlB1c2hEb3duOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAuNzQ5MDIzIGdcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCAwIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpKSArIFwiIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSkgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgICogUmV0dXJucyB0aGUgc3RhbmRhcmQgQXBwZWFyYW5jZVxuICAgICAgICAgICogXG4gICAgICAgICAgKiBAcmV0dXJucyB7QWNyb0Zvcm1YT2JqZWN0fVxuICAgICAgICAgICovXG4gICAgICAgIGNyZWF0ZURlZmF1bHRBcHBlYXJhbmNlU3RyZWFtOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgLy8gU2V0IEhlbHZldGljYSB0byBTdGFuZGFyZCBGb250IChzaXplOiBhdXRvKVxuICAgICAgICAgICAgLy8gQ29sb3I6IEJsYWNrXG4gICAgICAgICAgICB2YXIgZm9udEtleSA9IHNjb3BlLmludGVybmFsLmdldEZvbnQoZm9ybU9iamVjdC5mb250TmFtZSwgZm9ybU9iamVjdC5mb250U3R5bGUpLmlkO1xuICAgICAgICAgICAgdmFyIGVuY29kZWRDb2xvciA9IHNjb3BlLl9fcHJpdmF0ZV9fLmVuY29kZUNvbG9yU3RyaW5nKGZvcm1PYmplY3QuY29sb3IpO1xuICAgICAgICAgICAgdmFyIGZvbnRTaXplID0gZm9ybU9iamVjdC5mb250U2l6ZTtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSAnLycgKyBmb250S2V5ICsgJyAnICsgZm9udFNpemUgKyAnIFRmICcgKyBlbmNvZGVkQ29sb3I7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbCA9IHtcbiAgICAgICAgQmV6aWVyX0M6IDAuNTUxOTE1MDI0NDk0LFxuXG4gICAgICAgIGNhbGN1bGF0ZUNyb3NzOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuXG4gICAgICAgICAgICB2YXIgd2lkdGggPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICB2YXIgaGVpZ2h0ID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgIHZhciBhID0gTWF0aC5taW4od2lkdGgsIGhlaWdodCk7XG5cbiAgICAgICAgICAgIHZhciBjcm9zcyA9IHtcbiAgICAgICAgICAgICAgICB4MTogeyAvLyB1cHBlckxlZnRcbiAgICAgICAgICAgICAgICAgICAgeDogKHdpZHRoIC0gYSkgLyAyLFxuICAgICAgICAgICAgICAgICAgICB5OiAoKGhlaWdodCAtIGEpIC8gMikgKyBhLC8vIGhlaWdodCAtIGJvcmRlclBhZGRpbmdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHgyOiB7IC8vIGxvd2VyUmlnaHRcbiAgICAgICAgICAgICAgICAgICAgeDogKCh3aWR0aCAtIGEpIC8gMikgKyBhLFxuICAgICAgICAgICAgICAgICAgICB5OiAoKGhlaWdodCAtIGEpIC8gMikvLyBib3JkZXJQYWRkaW5nXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB4MzogeyAvLyBsb3dlckxlZnRcbiAgICAgICAgICAgICAgICAgICAgeDogKHdpZHRoIC0gYSkgLyAyLFxuICAgICAgICAgICAgICAgICAgICB5OiAoKGhlaWdodCAtIGEpIC8gMikvLyBib3JkZXJQYWRkaW5nXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB4NDogeyAvLyB1cHBlclJpZ2h0XG4gICAgICAgICAgICAgICAgICAgIHg6ICgod2lkdGggLSBhKSAvIDIpICsgYSxcbiAgICAgICAgICAgICAgICAgICAgeTogKChoZWlnaHQgLSBhKSAvIDIpICsgYSwvLyBoZWlnaHQgLSBib3JkZXJQYWRkaW5nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIGNyb3NzO1xuICAgICAgICB9LFxuICAgIH07XG4gICAgQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoID0gZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IDA7XG4gICAgICAgIGlmICh0eXBlb2YgZm9ybU9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgcmVzdWx0ID0gc2NhbGUoZm9ybU9iamVjdC5SZWN0WzJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodCA9IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAwO1xuICAgICAgICBpZiAodHlwZW9mIGZvcm1PYmplY3QgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHNjYWxlKGZvcm1PYmplY3QuUmVjdFszXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLy8gUHVibGljOlxuXG4gICAgLyoqXG4gICAgKiBBZGQgYW4gQWNyb0Zvcm0tRmllbGQgdG8gdGhlIGpzUERGLWluc3RhbmNlXG4gICAgKlxuICAgICogQG5hbWUgYWRkRmllbGRcbiAgICAqIEBmdW5jdGlvbiBcbiAgICAqIEBpbnN0YW5jZVxuICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkT2JqZWN0XG4gICAgKiBAcmV0dXJucyB7anNQREZ9XG4gICAgKi9cbiAgICB2YXIgYWRkRmllbGQgPSBqc1BERkFQSS5hZGRGaWVsZCA9IGZ1bmN0aW9uIChmaWVsZE9iamVjdCkge1xuICAgICAgICBpbml0aWFsaXplQWNyb0Zvcm0uY2FsbCh0aGlzKTtcblxuICAgICAgICBpZiAoZmllbGRPYmplY3QgaW5zdGFuY2VvZiBBY3JvRm9ybUZpZWxkKSB7XG4gICAgICAgICAgICBwdXRGb3JtLmNhbGwodGhpcywgZmllbGRPYmplY3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5hZGRGaWVsZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBmaWVsZE9iamVjdC5wYWdlID0gc2NvcGUuaW50ZXJuYWwuZ2V0Q3VycmVudFBhZ2VJbmZvKCkucGFnZU51bWJlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQG5hbWUgYWRkQnV0dG9uXG4gICAgKiBAZnVuY3Rpb25cbiAgICAqIEBpbnN0YW5jZVxuICAgICogQHBhcmFtIHtBY3JvRm9ybUJ1dHRvbn0gb3B0aW9uc1xuICAgICogQHJldHVybnMge2pzUERGfVxuICAgICogQGRlcHJlY2F0ZWRcbiAgICAqL1xuICAgIGpzUERGQVBJLmFkZEJ1dHRvbiA9IGZ1bmN0aW9uIChidXR0b24pIHtcbiAgICAgICAgaWYgKGJ1dHRvbiBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5hZGRCdXR0b24uJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZEZpZWxkLmNhbGwodGhpcywgYnV0dG9uKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBAbmFtZSBhZGRUZXh0RmllbGRcbiAgICAqIEBmdW5jdGlvblxuICAgICogQGluc3RhbmNlXG4gICAgKiBAcGFyYW0ge0Fjcm9Gb3JtVGV4dEZpZWxkfSB0ZXh0RmllbGRcbiAgICAqIEByZXR1cm5zIHtqc1BERn1cbiAgICAqIEBkZXByZWNhdGVkXG4gICAgKi9cbiAgICBqc1BERkFQSS5hZGRUZXh0RmllbGQgPSBmdW5jdGlvbiAodGV4dEZpZWxkKSB7XG4gICAgICAgIGlmICh0ZXh0RmllbGQgaW5zdGFuY2VvZiBBY3JvRm9ybVRleHRGaWVsZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuYWRkVGV4dEZpZWxkLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRGaWVsZC5jYWxsKHRoaXMsIHRleHRGaWVsZCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQG5hbWUgYWRkQ2hvaWNlRmllbGRcbiAgICAqIEBmdW5jdGlvblxuICAgICogQGluc3RhbmNlXG4gICAgKiBAcGFyYW0ge0Fjcm9Gb3JtQ2hvaWNlRmllbGR9IFxuICAgICogQHJldHVybnMge2pzUERGfVxuICAgICogQGRlcHJlY2F0ZWRcbiAgICAqL1xuICAgIGpzUERGQVBJLmFkZENob2ljZUZpZWxkID0gZnVuY3Rpb24gKGNob2ljZUZpZWxkKSB7XG4gICAgICAgIGlmIChjaG9pY2VGaWVsZCBpbnN0YW5jZW9mIEFjcm9Gb3JtQ2hvaWNlRmllbGQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLmFkZENob2ljZUZpZWxkLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRGaWVsZC5jYWxsKHRoaXMsIGNob2ljZUZpZWxkKTtcbiAgICB9O1xuXG4gICAgaWYgKHR5cGVvZiBnbG9iYWxPYmogPT0gXCJvYmplY3RcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIkNob2ljZUZpZWxkXCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIkxpc3RCb3hcIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiQ29tYm9Cb3hcIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiRWRpdEJveFwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJCdXR0b25cIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiUHVzaEJ1dHRvblwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJSYWRpb0J1dHRvblwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJDaGVja0JveFwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJUZXh0RmllbGRcIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiUGFzc3dvcmRGaWVsZFwiXSkgPT09IFwidW5kZWZpbmVkXCJcbiAgICApIHtcbiAgICAgICAgZ2xvYmFsT2JqW1wiQ2hvaWNlRmllbGRcIl0gPSBBY3JvRm9ybUNob2ljZUZpZWxkO1xuICAgICAgICBnbG9iYWxPYmpbXCJMaXN0Qm94XCJdID0gQWNyb0Zvcm1MaXN0Qm94O1xuICAgICAgICBnbG9iYWxPYmpbXCJDb21ib0JveFwiXSA9IEFjcm9Gb3JtQ29tYm9Cb3g7XG4gICAgICAgIGdsb2JhbE9ialtcIkVkaXRCb3hcIl0gPSBBY3JvRm9ybUVkaXRCb3g7XG4gICAgICAgIGdsb2JhbE9ialtcIkJ1dHRvblwiXSA9IEFjcm9Gb3JtQnV0dG9uO1xuICAgICAgICBnbG9iYWxPYmpbXCJQdXNoQnV0dG9uXCJdID0gQWNyb0Zvcm1QdXNoQnV0dG9uO1xuICAgICAgICBnbG9iYWxPYmpbXCJSYWRpb0J1dHRvblwiXSA9IEFjcm9Gb3JtUmFkaW9CdXR0b247XG4gICAgICAgIGdsb2JhbE9ialtcIkNoZWNrQm94XCJdID0gQWNyb0Zvcm1DaGVja0JveDtcbiAgICAgICAgZ2xvYmFsT2JqW1wiVGV4dEZpZWxkXCJdID0gQWNyb0Zvcm1UZXh0RmllbGQ7XG4gICAgICAgIGdsb2JhbE9ialtcIlBhc3N3b3JkRmllbGRcIl0gPSBBY3JvRm9ybVBhc3N3b3JkRmllbGQ7XG5cbiAgICAgICAgLy8gYmFja3dhcmRzQ29tcGF0aWJpbGl0eVxuICAgICAgICBnbG9iYWxPYmpbXCJBY3JvRm9ybVwiXSA9IHsgQXBwZWFyYW5jZTogQWNyb0Zvcm1BcHBlYXJhbmNlIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgLy8gY29uc29sZS53YXJuKFwiQWNyb0Zvcm0tQ2xhc3NlcyBhcmUgbm90IHBvcHVsYXRlZCBpbnRvIGdsb2JhbC1uYW1lc3BhY2UsIGJlY2F1c2UgdGhlIGNsYXNzLU5hbWVzIGV4aXN0IGFscmVhZHkuIFRoaXMgYXZvaWRzIGNvbmZsaWN0cyB3aXRoIHRoZSBhbHJlYWR5IHVzZWQgZnJhbWV3b3JrLlwiKTtcbiAgICB9XG5cbiAgICBqc1BERkFQSS5BY3JvRm9ybUNob2ljZUZpZWxkID0gQWNyb0Zvcm1DaG9pY2VGaWVsZDtcbiAgICBqc1BERkFQSS5BY3JvRm9ybUxpc3RCb3ggPSBBY3JvRm9ybUxpc3RCb3g7XG4gICAganNQREZBUEkuQWNyb0Zvcm1Db21ib0JveCA9IEFjcm9Gb3JtQ29tYm9Cb3g7XG4gICAganNQREZBUEkuQWNyb0Zvcm1FZGl0Qm94ID0gQWNyb0Zvcm1FZGl0Qm94O1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtQnV0dG9uID0gQWNyb0Zvcm1CdXR0b247XG4gICAganNQREZBUEkuQWNyb0Zvcm1QdXNoQnV0dG9uID0gQWNyb0Zvcm1QdXNoQnV0dG9uO1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtUmFkaW9CdXR0b24gPSBBY3JvRm9ybVJhZGlvQnV0dG9uO1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtQ2hlY2tCb3ggPSBBY3JvRm9ybUNoZWNrQm94O1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtVGV4dEZpZWxkID0gQWNyb0Zvcm1UZXh0RmllbGQ7XG4gICAganNQREZBUEkuQWNyb0Zvcm1QYXNzd29yZEZpZWxkID0gQWNyb0Zvcm1QYXNzd29yZEZpZWxkO1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtQXBwZWFyYW5jZSA9IEFjcm9Gb3JtQXBwZWFyYW5jZTtcblxuICAgIGpzUERGQVBJLkFjcm9Gb3JtID0ge1xuICAgICAgICBDaG9pY2VGaWVsZDogQWNyb0Zvcm1DaG9pY2VGaWVsZCxcbiAgICAgICAgTGlzdEJveDogQWNyb0Zvcm1MaXN0Qm94LFxuICAgICAgICBDb21ib0JveDogQWNyb0Zvcm1Db21ib0JveCxcbiAgICAgICAgRWRpdEJveDogQWNyb0Zvcm1FZGl0Qm94LFxuICAgICAgICBCdXR0b246IEFjcm9Gb3JtQnV0dG9uLFxuICAgICAgICBQdXNoQnV0dG9uOiBBY3JvRm9ybVB1c2hCdXR0b24sXG4gICAgICAgIFJhZGlvQnV0dG9uOiBBY3JvRm9ybVJhZGlvQnV0dG9uLFxuICAgICAgICBDaGVja0JveDogQWNyb0Zvcm1DaGVja0JveCxcbiAgICAgICAgVGV4dEZpZWxkOiBBY3JvRm9ybVRleHRGaWVsZCxcbiAgICAgICAgUGFzc3dvcmRGaWVsZDogQWNyb0Zvcm1QYXNzd29yZEZpZWxkLFxuICAgICAgICBBcHBlYXJhbmNlOiBBY3JvRm9ybUFwcGVhcmFuY2VcbiAgICB9O1xuXG4gICAganNQREYuQWNyb0Zvcm0gPSB7XG4gICAgICAgIENob2ljZUZpZWxkOiBBY3JvRm9ybUNob2ljZUZpZWxkLFxuICAgICAgICBMaXN0Qm94OiBBY3JvRm9ybUxpc3RCb3gsXG4gICAgICAgIENvbWJvQm94OiBBY3JvRm9ybUNvbWJvQm94LFxuICAgICAgICBFZGl0Qm94OiBBY3JvRm9ybUVkaXRCb3gsXG4gICAgICAgIEJ1dHRvbjogQWNyb0Zvcm1CdXR0b24sXG4gICAgICAgIFB1c2hCdXR0b246IEFjcm9Gb3JtUHVzaEJ1dHRvbixcbiAgICAgICAgUmFkaW9CdXR0b246IEFjcm9Gb3JtUmFkaW9CdXR0b24sXG4gICAgICAgIENoZWNrQm94OiBBY3JvRm9ybUNoZWNrQm94LFxuICAgICAgICBUZXh0RmllbGQ6IEFjcm9Gb3JtVGV4dEZpZWxkLFxuICAgICAgICBQYXNzd29yZEZpZWxkOiBBY3JvRm9ybVBhc3N3b3JkRmllbGQsXG4gICAgICAgIEFwcGVhcmFuY2U6IEFjcm9Gb3JtQXBwZWFyYW5jZVxuICAgIH07XG59KShqc3BkZi5qc1BERiwgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdyB8fCB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWwpKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtLmpzXG4vLyBtb2R1bGUgaWQgPSA2MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIgIC8qKlxuICAgKiBqc1BERiBmcm9tSFRNTCBwbHVnaW4uIEJFVEEgc3RhZ2UuIEFQSSBzdWJqZWN0IHRvIGNoYW5nZS4gTmVlZHMgYnJvd3NlclxuICAgKiBDb3B5cmlnaHQgKGMpIDIwMTIgV2lsbG93IFN5c3RlbXMgQ29ycG9yYXRpb24sIHdpbGxvdy1zeXN0ZW1zLmNvbVxuICAgKiAgICAgICAgICAgICAgIDIwMTQgSnVhbiBQYWJsbyBHYXZpcmlhLCBodHRwczovL2dpdGh1Yi5jb20vanVhbnBnYXZpcmlhXG4gICAqICAgICAgICAgICAgICAgMjAxNCBEaWVnbyBDYXNvcnJhbiwgaHR0cHM6Ly9naXRodWIuY29tL2RpZWdvY3JcbiAgICogICAgICAgICAgICAgICAyMDE0IERhbmllbCBIdXNhciwgaHR0cHM6Ly9naXRodWIuY29tL2RhbmllbGh1c2FyXG4gICAqICAgICAgICAgICAgICAgMjAxNCBXb2xmZ2FuZyBHYXNzbGVyLCBodHRwczovL2dpdGh1Yi5jb20vd29vbGZnXG4gICAqICAgICAgICAgICAgICAgMjAxNCBTdGV2ZW4gU3B1bmdpbiwgaHR0cHM6Ly9naXRodWIuY29tL2ZsYW1lbmNvXG4gICAqXG4gICAqIEBsaWNlbnNlXG4gICAqIFxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cbiAgdmFyIGpzcGRmID0gcmVxdWlyZShcImpzcGRmXCIpO1xuXG4gIChmdW5jdGlvbiAoanNQREZBUEkpIHtcbiAgICB2YXIgY2xvbmUsIF9EcmlsbEZvckNvbnRlbnQsIEZvbnROYW1lREIsIEZvbnRTdHlsZU1hcCwgVGV4dEFsaWduTWFwLCBGb250V2VpZ2h0TWFwLCBGbG9hdE1hcCwgQ2xlYXJNYXAsIEdldENTUywgUHVyZ2VXaGl0ZVNwYWNlLCBSZW5kZXJlciwgUmVzb2x2ZUZvbnQsIFJlc29sdmVVbml0ZWROdW1iZXIsIFVuaXRlZE51bWJlck1hcCwgZWxlbWVudEhhbmRsZWRFbHNld2hlcmUsIGltYWdlcywgbG9hZEltZ3MsIGNoZWNrRm9yRm9vdGVyLCBwcm9jZXNzLCB0YWJsZVRvSnNvbjtcblxuICAgIGNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgQ2xvbmUucHJvdG90eXBlID0gb2JqO1xuICAgICAgICByZXR1cm4gbmV3IENsb25lKCk7XG4gICAgICB9O1xuXG4gICAgICBmdW5jdGlvbiBDbG9uZSgpIHt9XG4gICAgfSgpO1xuXG4gICAgUHVyZ2VXaGl0ZVNwYWNlID0gZnVuY3Rpb24gUHVyZ2VXaGl0ZVNwYWNlKGFycmF5KSB7XG4gICAgICB2YXIgZnJhZ21lbnQsIGksIGwsIGxUcmltbWVkLCByLCByVHJpbW1lZCwgdHJhaWxpbmdTcGFjZTtcbiAgICAgIGkgPSAwO1xuICAgICAgbCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIGZyYWdtZW50ID0gdm9pZCAwO1xuICAgICAgbFRyaW1tZWQgPSBmYWxzZTtcbiAgICAgIHJUcmltbWVkID0gZmFsc2U7XG5cbiAgICAgIHdoaWxlICghbFRyaW1tZWQgJiYgaSAhPT0gbCkge1xuICAgICAgICBmcmFnbWVudCA9IGFycmF5W2ldID0gYXJyYXlbaV0udHJpbUxlZnQoKTtcblxuICAgICAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgICAgICBsVHJpbW1lZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpKys7XG4gICAgICB9XG5cbiAgICAgIGkgPSBsIC0gMTtcblxuICAgICAgd2hpbGUgKGwgJiYgIXJUcmltbWVkICYmIGkgIT09IC0xKSB7XG4gICAgICAgIGZyYWdtZW50ID0gYXJyYXlbaV0gPSBhcnJheVtpXS50cmltUmlnaHQoKTtcblxuICAgICAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgICAgICByVHJpbW1lZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpLS07XG4gICAgICB9XG5cbiAgICAgIHIgPSAvXFxzKyQvZztcbiAgICAgIHRyYWlsaW5nU3BhY2UgPSB0cnVlO1xuICAgICAgaSA9IDA7XG5cbiAgICAgIHdoaWxlIChpICE9PSBsKSB7XG4gICAgICAgIC8vIExlYXZlIHRoZSBsaW5lIGJyZWFrcyBpbnRhY3RcbiAgICAgICAgaWYgKGFycmF5W2ldICE9IFwiXFx1MjAyOFwiKSB7XG4gICAgICAgICAgZnJhZ21lbnQgPSBhcnJheVtpXS5yZXBsYWNlKC9cXHMrL2csIFwiIFwiKTtcblxuICAgICAgICAgIGlmICh0cmFpbGluZ1NwYWNlKSB7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGZyYWdtZW50LnRyaW1MZWZ0KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICAgICAgICB0cmFpbGluZ1NwYWNlID0gci50ZXN0KGZyYWdtZW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhcnJheVtpXSA9IGZyYWdtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaSsrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyID0gZnVuY3Rpb24gUmVuZGVyZXIocGRmLCB4LCB5LCBzZXR0aW5ncykge1xuICAgICAgdGhpcy5wZGYgPSBwZGY7XG4gICAgICB0aGlzLnggPSB4O1xuICAgICAgdGhpcy55ID0geTtcbiAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5nczsgLy9saXN0IG9mIGZ1bmN0aW9ucyB3aGljaCBhcmUgY2FsbGVkIGFmdGVyIGVhY2ggZWxlbWVudC1yZW5kZXJpbmcgcHJvY2Vzc1xuXG4gICAgICB0aGlzLndhdGNoRnVuY3Rpb25zID0gW107XG4gICAgICB0aGlzLmluaXQoKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBSZXNvbHZlRm9udCA9IGZ1bmN0aW9uIFJlc29sdmVGb250KGNzc19mb250X2ZhbWlseV9zdHJpbmcpIHtcbiAgICAgIHZhciBuYW1lLCBwYXJ0LCBwYXJ0cztcbiAgICAgIG5hbWUgPSB2b2lkIDA7XG4gICAgICBwYXJ0cyA9IGNzc19mb250X2ZhbWlseV9zdHJpbmcuc3BsaXQoXCIsXCIpO1xuICAgICAgcGFydCA9IHBhcnRzLnNoaWZ0KCk7XG5cbiAgICAgIHdoaWxlICghbmFtZSAmJiBwYXJ0KSB7XG4gICAgICAgIG5hbWUgPSBGb250TmFtZURCW3BhcnQudHJpbSgpLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICBwYXJ0ID0gcGFydHMuc2hpZnQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfTtcblxuICAgIFJlc29sdmVVbml0ZWROdW1iZXIgPSBmdW5jdGlvbiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNzc19saW5lX2hlaWdodF9zdHJpbmcpIHtcbiAgICAgIC8vSUU4IGlzc3Vlc1xuICAgICAgY3NzX2xpbmVfaGVpZ2h0X3N0cmluZyA9IGNzc19saW5lX2hlaWdodF9zdHJpbmcgPT09IFwiYXV0b1wiID8gXCIwcHhcIiA6IGNzc19saW5lX2hlaWdodF9zdHJpbmc7XG5cbiAgICAgIGlmIChjc3NfbGluZV9oZWlnaHRfc3RyaW5nLmluZGV4T2YoXCJlbVwiKSA+IC0xICYmICFpc05hTihOdW1iZXIoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5yZXBsYWNlKFwiZW1cIiwgXCJcIikpKSkge1xuICAgICAgICBjc3NfbGluZV9oZWlnaHRfc3RyaW5nID0gTnVtYmVyKGNzc19saW5lX2hlaWdodF9zdHJpbmcucmVwbGFjZShcImVtXCIsIFwiXCIpKSAqIDE4LjcxOSArIFwicHhcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNzc19saW5lX2hlaWdodF9zdHJpbmcuaW5kZXhPZihcInB0XCIpID4gLTEgJiYgIWlzTmFOKE51bWJlcihjc3NfbGluZV9oZWlnaHRfc3RyaW5nLnJlcGxhY2UoXCJwdFwiLCBcIlwiKSkpKSB7XG4gICAgICAgIGNzc19saW5lX2hlaWdodF9zdHJpbmcgPSBOdW1iZXIoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5yZXBsYWNlKFwicHRcIiwgXCJcIikpICogMS4zMzMgKyBcInB4XCI7XG4gICAgICB9XG5cbiAgICAgIHZhciBub3JtYWwsIHVuZGVmLCB2YWx1ZTtcbiAgICAgIHVuZGVmID0gdm9pZCAwO1xuICAgICAgbm9ybWFsID0gMTYuMDA7XG4gICAgICB2YWx1ZSA9IFVuaXRlZE51bWJlck1hcFtjc3NfbGluZV9oZWlnaHRfc3RyaW5nXTtcblxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdmFsdWUgPSB7XG4gICAgICAgIFwieHgtc21hbGxcIjogOSxcbiAgICAgICAgXCJ4LXNtYWxsXCI6IDExLFxuICAgICAgICBzbWFsbDogMTMsXG4gICAgICAgIG1lZGl1bTogMTYsXG4gICAgICAgIGxhcmdlOiAxOSxcbiAgICAgICAgXCJ4LWxhcmdlXCI6IDIzLFxuICAgICAgICBcInh4LWxhcmdlXCI6IDI4LFxuICAgICAgICBhdXRvOiAwXG4gICAgICB9W2Nzc19saW5lX2hlaWdodF9zdHJpbmddO1xuXG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmKSB7XG4gICAgICAgIHJldHVybiBVbml0ZWROdW1iZXJNYXBbY3NzX2xpbmVfaGVpZ2h0X3N0cmluZ10gPSB2YWx1ZSAvIG5vcm1hbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlID0gcGFyc2VGbG9hdChjc3NfbGluZV9oZWlnaHRfc3RyaW5nKSkge1xuICAgICAgICByZXR1cm4gVW5pdGVkTnVtYmVyTWFwW2Nzc19saW5lX2hlaWdodF9zdHJpbmddID0gdmFsdWUgLyBub3JtYWw7XG4gICAgICB9XG5cbiAgICAgIHZhbHVlID0gY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5tYXRjaCgvKFtcXGRcXC5dKykocHgpLyk7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcmV0dXJuIFVuaXRlZE51bWJlck1hcFtjc3NfbGluZV9oZWlnaHRfc3RyaW5nXSA9IHBhcnNlRmxvYXQodmFsdWVbMV0pIC8gbm9ybWFsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gVW5pdGVkTnVtYmVyTWFwW2Nzc19saW5lX2hlaWdodF9zdHJpbmddID0gMTtcbiAgICB9O1xuXG4gICAgR2V0Q1NTID0gZnVuY3Rpb24gR2V0Q1NTKGVsZW1lbnQpIHtcbiAgICAgIHZhciBjc3MsIHRtcCwgY29tcHV0ZWRDU1NFbGVtZW50O1xuXG4gICAgICBjb21wdXRlZENTU0VsZW1lbnQgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgdmFyIGNvbXBDU1M7XG5cbiAgICAgICAgY29tcENTUyA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgIGlmIChkb2N1bWVudC5kZWZhdWx0VmlldyAmJiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChlbC5jdXJyZW50U3R5bGUpIHtcbiAgICAgICAgICAgIHJldHVybiBlbC5jdXJyZW50U3R5bGU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBlbC5zdHlsZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0oZWwpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgIHByb3AgPSBwcm9wLnJlcGxhY2UoLy1cXEQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2guY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGNvbXBDU1NbcHJvcF07XG4gICAgICAgIH07XG4gICAgICB9KGVsZW1lbnQpO1xuXG4gICAgICBjc3MgPSB7fTtcbiAgICAgIHRtcCA9IHZvaWQgMDtcbiAgICAgIGNzc1tcImZvbnQtZmFtaWx5XCJdID0gUmVzb2x2ZUZvbnQoY29tcHV0ZWRDU1NFbGVtZW50KFwiZm9udC1mYW1pbHlcIikpIHx8IFwidGltZXNcIjtcbiAgICAgIGNzc1tcImZvbnQtc3R5bGVcIl0gPSBGb250U3R5bGVNYXBbY29tcHV0ZWRDU1NFbGVtZW50KFwiZm9udC1zdHlsZVwiKV0gfHwgXCJub3JtYWxcIjtcbiAgICAgIGNzc1tcInRleHQtYWxpZ25cIl0gPSBUZXh0QWxpZ25NYXBbY29tcHV0ZWRDU1NFbGVtZW50KFwidGV4dC1hbGlnblwiKV0gfHwgXCJsZWZ0XCI7XG4gICAgICB0bXAgPSBGb250V2VpZ2h0TWFwW2NvbXB1dGVkQ1NTRWxlbWVudChcImZvbnQtd2VpZ2h0XCIpXSB8fCBcIm5vcm1hbFwiO1xuXG4gICAgICBpZiAodG1wID09PSBcImJvbGRcIikge1xuICAgICAgICBpZiAoY3NzW1wiZm9udC1zdHlsZVwiXSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIGNzc1tcImZvbnQtc3R5bGVcIl0gPSB0bXA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3NzW1wiZm9udC1zdHlsZVwiXSA9IHRtcCArIGNzc1tcImZvbnQtc3R5bGVcIl07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY3NzW1wiZm9udC1zaXplXCJdID0gUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJmb250LXNpemVcIikpIHx8IDE7XG4gICAgICBjc3NbXCJsaW5lLWhlaWdodFwiXSA9IFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwibGluZS1oZWlnaHRcIikpIHx8IDE7XG4gICAgICBjc3NbXCJkaXNwbGF5XCJdID0gY29tcHV0ZWRDU1NFbGVtZW50KFwiZGlzcGxheVwiKSA9PT0gXCJpbmxpbmVcIiA/IFwiaW5saW5lXCIgOiBcImJsb2NrXCI7XG4gICAgICB0bXAgPSBjc3NbXCJkaXNwbGF5XCJdID09PSBcImJsb2NrXCI7XG4gICAgICBjc3NbXCJtYXJnaW4tdG9wXCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwibWFyZ2luLXRvcFwiKSkgfHwgMDtcbiAgICAgIGNzc1tcIm1hcmdpbi1ib3R0b21cIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJtYXJnaW4tYm90dG9tXCIpKSB8fCAwO1xuICAgICAgY3NzW1wicGFkZGluZy10b3BcIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJwYWRkaW5nLXRvcFwiKSkgfHwgMDtcbiAgICAgIGNzc1tcInBhZGRpbmctYm90dG9tXCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwicGFkZGluZy1ib3R0b21cIikpIHx8IDA7XG4gICAgICBjc3NbXCJtYXJnaW4tbGVmdFwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcIm1hcmdpbi1sZWZ0XCIpKSB8fCAwO1xuICAgICAgY3NzW1wibWFyZ2luLXJpZ2h0XCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwibWFyZ2luLXJpZ2h0XCIpKSB8fCAwO1xuICAgICAgY3NzW1wicGFkZGluZy1sZWZ0XCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwicGFkZGluZy1sZWZ0XCIpKSB8fCAwO1xuICAgICAgY3NzW1wicGFkZGluZy1yaWdodFwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcInBhZGRpbmctcmlnaHRcIikpIHx8IDA7XG4gICAgICBjc3NbXCJwYWdlLWJyZWFrLWJlZm9yZVwiXSA9IGNvbXB1dGVkQ1NTRWxlbWVudChcInBhZ2UtYnJlYWstYmVmb3JlXCIpIHx8IFwiYXV0b1wiOyAvL2Zsb2F0IGFuZCBjbGVhcmluZyBvZiBmbG9hdHNcblxuICAgICAgY3NzW1wiZmxvYXRcIl0gPSBGbG9hdE1hcFtjb21wdXRlZENTU0VsZW1lbnQoXCJjc3NGbG9hdFwiKV0gfHwgXCJub25lXCI7XG4gICAgICBjc3NbXCJjbGVhclwiXSA9IENsZWFyTWFwW2NvbXB1dGVkQ1NTRWxlbWVudChcImNsZWFyXCIpXSB8fCBcIm5vbmVcIjtcbiAgICAgIGNzc1tcImNvbG9yXCJdID0gY29tcHV0ZWRDU1NFbGVtZW50KFwiY29sb3JcIik7XG4gICAgICByZXR1cm4gY3NzO1xuICAgIH07XG5cbiAgICBlbGVtZW50SGFuZGxlZEVsc2V3aGVyZSA9IGZ1bmN0aW9uIGVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlKGVsZW1lbnQsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpIHtcbiAgICAgIHZhciBoYW5kbGVycywgaSwgaXNIYW5kbGVkRWxzZXdoZXJlLCBsLCBjbGFzc05hbWVzO1xuICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gZmFsc2U7XG4gICAgICBpID0gdm9pZCAwO1xuICAgICAgbCA9IHZvaWQgMDtcbiAgICAgIGhhbmRsZXJzID0gZWxlbWVudEhhbmRsZXJzW1wiI1wiICsgZWxlbWVudC5pZF07XG5cbiAgICAgIGlmIChoYW5kbGVycykge1xuICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXJzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBpc0hhbmRsZWRFbHNld2hlcmUgPSBoYW5kbGVycyhlbGVtZW50LCByZW5kZXJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgbCA9IGhhbmRsZXJzLmxlbmd0aDtcblxuICAgICAgICAgIHdoaWxlICghaXNIYW5kbGVkRWxzZXdoZXJlICYmIGkgIT09IGwpIHtcbiAgICAgICAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzW2ldKGVsZW1lbnQsIHJlbmRlcmVyKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaGFuZGxlcnMgPSBlbGVtZW50SGFuZGxlcnNbZWxlbWVudC5ub2RlTmFtZV07XG5cbiAgICAgIGlmICghaXNIYW5kbGVkRWxzZXdoZXJlICYmIGhhbmRsZXJzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZGxlcnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzKGVsZW1lbnQsIHJlbmRlcmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpID0gMDtcbiAgICAgICAgICBsID0gaGFuZGxlcnMubGVuZ3RoO1xuXG4gICAgICAgICAgd2hpbGUgKCFpc0hhbmRsZWRFbHNld2hlcmUgJiYgaSAhPT0gbCkge1xuICAgICAgICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnNbaV0oZWxlbWVudCwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvLyBUcnkgY2xhc3MgbmFtZXNcblxuXG4gICAgICBjbGFzc05hbWVzID0gdHlwZW9mIGVsZW1lbnQuY2xhc3NOYW1lID09PSAnc3RyaW5nJyA/IGVsZW1lbnQuY2xhc3NOYW1lLnNwbGl0KCcgJykgOiBbXTtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IGNsYXNzTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaGFuZGxlcnMgPSBlbGVtZW50SGFuZGxlcnNbJy4nICsgY2xhc3NOYW1lc1tpXV07XG5cbiAgICAgICAgaWYgKCFpc0hhbmRsZWRFbHNld2hlcmUgJiYgaGFuZGxlcnMpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXJzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzKGVsZW1lbnQsIHJlbmRlcmVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgICBsID0gaGFuZGxlcnMubGVuZ3RoO1xuXG4gICAgICAgICAgICB3aGlsZSAoIWlzSGFuZGxlZEVsc2V3aGVyZSAmJiBpICE9PSBsKSB7XG4gICAgICAgICAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzW2ldKGVsZW1lbnQsIHJlbmRlcmVyKTtcbiAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXNIYW5kbGVkRWxzZXdoZXJlO1xuICAgIH07XG5cbiAgICB0YWJsZVRvSnNvbiA9IGZ1bmN0aW9uIHRhYmxlVG9Kc29uKHRhYmxlLCByZW5kZXJlcikge1xuICAgICAgdmFyIGRhdGEsIGhlYWRlcnMsIGksIGosIHJvd0RhdGEsIHRhYmxlUm93LCB0YWJsZV9vYmosIHRhYmxlX3dpdGgsIGNlbGwsIGw7XG4gICAgICBkYXRhID0gW107XG4gICAgICBoZWFkZXJzID0gW107XG4gICAgICBpID0gMDtcbiAgICAgIGwgPSAwO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0YWJsZS5yb3dzWzBdLmNlbGxzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGwgKz0gdGFibGUucm93c1swXS5jZWxsc1tqXS5jb2xTcGFuO1xuICAgICAgfVxuICAgICAgdGFibGVfd2l0aCA9IHRhYmxlLmNsaWVudFdpZHRoO1xuXG4gICAgICB3aGlsZSAoaSA8IGwpIHtcbiAgICAgICAgY2VsbCA9IHRhYmxlLnJvd3NbMF0uY2VsbHNbaV07XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjZWxsLmNvbFNwYW47IGorKykge1xuICAgICAgICAgIGhlYWRlcnNbaSArIGpdID0ge1xuICAgICAgICAgICAgbmFtZTogY2VsbC50ZXh0Q29udGVudC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJycpICsgJ18nICsgaixcbiAgICAgICAgICAgIHByb21wdDogY2VsbC50ZXh0Q29udGVudC5yZXBsYWNlKC9cXHI/XFxuL2csICcnKSxcbiAgICAgICAgICAgIHdpZHRoOiBjZWxsLmNsaWVudFdpZHRoIC8gdGFibGVfd2l0aCAqIHJlbmRlcmVyLnNldHRpbmdzLndpZHRoIC8gY2VsbC5jb2xTcGFuXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGkgKz0gajtcbiAgICAgIH1cblxuICAgICAgaSA9IDE7XG5cbiAgICAgIHdoaWxlIChpIDwgdGFibGUucm93cy5sZW5ndGgpIHtcbiAgICAgICAgdGFibGVSb3cgPSB0YWJsZS5yb3dzW2ldO1xuICAgICAgICByb3dEYXRhID0ge307XG4gICAgICAgIGogPSAwO1xuXG4gICAgICAgIHdoaWxlIChqIDwgdGFibGVSb3cuY2VsbHMubGVuZ3RoKSB7XG4gICAgICAgICAgcm93RGF0YVtoZWFkZXJzW2pdLm5hbWVdID0gdGFibGVSb3cuY2VsbHNbal0udGV4dENvbnRlbnQucmVwbGFjZSgvXFxyP1xcbi9nLCAnJyk7XG4gICAgICAgICAgaisrO1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YS5wdXNoKHJvd0RhdGEpO1xuICAgICAgICBpKys7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZV9vYmogPSB7XG4gICAgICAgIHJvd3M6IGRhdGEsXG4gICAgICAgIGhlYWRlcnM6IGhlYWRlcnNcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHZhciBTa2lwTm9kZSA9IHtcbiAgICAgIFNDUklQVDogMSxcbiAgICAgIFNUWUxFOiAxLFxuICAgICAgTk9TQ1JJUFQ6IDEsXG4gICAgICBPQkpFQ1Q6IDEsXG4gICAgICBFTUJFRDogMSxcbiAgICAgIFNFTEVDVDogMVxuICAgIH07XG4gICAgdmFyIGxpc3RDb3VudCA9IDE7XG5cbiAgICBfRHJpbGxGb3JDb250ZW50ID0gZnVuY3Rpb24gRHJpbGxGb3JDb250ZW50KGVsZW1lbnQsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpIHtcbiAgICAgIHZhciBjbiwgY25zLCBmcmFnbWVudENTUywgaSwgaXNCbG9jaywgbCwgdGFibGUyanNvbiwgY2I7XG4gICAgICBjbnMgPSBlbGVtZW50LmNoaWxkTm9kZXM7XG4gICAgICBjbiA9IHZvaWQgMDtcbiAgICAgIGZyYWdtZW50Q1NTID0gR2V0Q1NTKGVsZW1lbnQpO1xuICAgICAgaXNCbG9jayA9IGZyYWdtZW50Q1NTLmRpc3BsYXkgPT09IFwiYmxvY2tcIjtcblxuICAgICAgaWYgKGlzQmxvY2spIHtcbiAgICAgICAgcmVuZGVyZXIuc2V0QmxvY2tCb3VuZGFyeSgpO1xuICAgICAgICByZW5kZXJlci5zZXRCbG9ja1N0eWxlKGZyYWdtZW50Q1NTKTtcbiAgICAgIH1cbiAgICAgIGkgPSAwO1xuICAgICAgbCA9IGNucy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChpIDwgbCkge1xuICAgICAgICBjbiA9IGNuc1tpXTtcblxuICAgICAgICBpZiAodHlwZW9mKGNuKSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIC8vZXhlY3V0ZSBhbGwgd2F0Y2hlciBmdW5jdGlvbnMgdG8gZS5nLiByZXNldCBmbG9hdGluZ1xuICAgICAgICAgIHJlbmRlcmVyLmV4ZWN1dGVXYXRjaEZ1bmN0aW9ucyhjbik7XG4gICAgICAgICAgLyoqKiBIRUFERVIgcmVuZGVyaW5nICoqL1xuXG4gICAgICAgICAgaWYgKGNuLm5vZGVUeXBlID09PSAxICYmIGNuLm5vZGVOYW1lID09PSAnSEVBREVSJykge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IGNuOyAvL3N0b3JlIG9sZCB0b3AgbWFyZ2luXG5cbiAgICAgICAgICAgIHZhciBvbGRNYXJnaW5Ub3AgPSByZW5kZXJlci5wZGYubWFyZ2luc19kb2MudG9wOyAvL3N1YnNjcmliZSBmb3IgbmV3IHBhZ2UgZXZlbnQgYW5kIHJlbmRlciBoZWFkZXIgZmlyc3Qgb24gZXZlcnkgcGFnZVxuXG4gICAgICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgnYWRkUGFnZScsIGZ1bmN0aW9uIChwYWdlSW5mbykge1xuICAgICAgICAgICAgICAvL3NldCBjdXJyZW50IHkgcG9zaXRpb24gdG8gb2xkIG1hcmdpblxuICAgICAgICAgICAgICByZW5kZXJlci55ID0gb2xkTWFyZ2luVG9wOyAvL3JlbmRlciBhbGwgY2hpbGQgbm9kZXMgb2YgdGhlIGhlYWRlciBlbGVtZW50XG5cbiAgICAgICAgICAgICAgX0RyaWxsRm9yQ29udGVudChoZWFkZXIsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpOyAvL3NldCBtYXJnaW4gdG8gb2xkIG1hcmdpbiArIHJlbmRlcmVkIGhlYWRlciArIDEwIHNwYWNlIHRvIHByZXZlbnQgb3ZlcmxhcHBpbmdcbiAgICAgICAgICAgICAgLy9pbXBvcnRhbnQgZm9yIG90aGVyIHBsdWdpbnMgKGUuZy4gdGFibGUpIHRvIHN0YXJ0IHJlbmRlcmluZyBhdCBjb3JyZWN0IHBvc2l0aW9uIGFmdGVyIGhlYWRlclxuXG5cbiAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLnRvcCA9IHJlbmRlcmVyLnkgKyAxMDtcbiAgICAgICAgICAgICAgcmVuZGVyZXIueSArPSAxMDtcbiAgICAgICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY24ubm9kZVR5cGUgPT09IDggJiYgY24ubm9kZU5hbWUgPT09IFwiI2NvbW1lbnRcIikge1xuICAgICAgICAgICAgaWYgKH5jbi50ZXh0Q29udGVudC5pbmRleE9mKFwiQUREX1BBR0VcIikpIHtcbiAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLmFkZFBhZ2UoKTtcbiAgICAgICAgICAgICAgcmVuZGVyZXIueSA9IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy50b3A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlVHlwZSA9PT0gMSAmJiAhU2tpcE5vZGVbY24ubm9kZU5hbWVdKSB7XG4gICAgICAgICAgICAvKioqIElNQUdFIFJFTkRFUklORyAqKiovXG4gICAgICAgICAgICB2YXIgY2FjaGVkX2ltYWdlO1xuXG4gICAgICAgICAgICBpZiAoY24ubm9kZU5hbWUgPT09IFwiSU1HXCIpIHtcbiAgICAgICAgICAgICAgdmFyIHVybCA9IGNuLmdldEF0dHJpYnV0ZShcInNyY1wiKTtcbiAgICAgICAgICAgICAgY2FjaGVkX2ltYWdlID0gaW1hZ2VzWyhyZW5kZXJlci5wZGYuc0hhc2hDb2RlICYmIHJlbmRlcmVyLnBkZi5zSGFzaENvZGUodXJsKSkgfHwgdXJsXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNhY2hlZF9pbWFnZSkge1xuICAgICAgICAgICAgICBpZiAocmVuZGVyZXIucGRmLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpIC0gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmJvdHRvbSA8IHJlbmRlcmVyLnkgKyBjbi5oZWlnaHQgJiYgcmVuZGVyZXIueSA+IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy50b3ApIHtcbiAgICAgICAgICAgICAgICByZW5kZXJlci5wZGYuYWRkUGFnZSgpO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgPSByZW5kZXJlci5wZGYubWFyZ2luc19kb2MudG9wOyAvL2NoZWNrIGlmIHdlIGhhdmUgdG8gc2V0IGJhY2sgc29tZSB2YWx1ZXMgZHVlIHRvIGUuZy4gaGVhZGVyIHJlbmRlcmluZyBmb3IgbmV3IHBhZ2VcblxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLmV4ZWN1dGVXYXRjaEZ1bmN0aW9ucyhjbik7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgaW1hZ2VzQ1NTID0gR2V0Q1NTKGNuKTtcbiAgICAgICAgICAgICAgdmFyIGltYWdlWCA9IHJlbmRlcmVyLng7XG4gICAgICAgICAgICAgIHZhciBmb250VG9Vbml0UmF0aW8gPSAxMiAvIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjsgLy9kZWZpbmUgYWRkaXRpb25hbCBwYWRkaW5ncywgbWFyZ2lucyB3aGljaCBoYXZlIHRvIGJlIHRha2VuIGludG8gYWNjb3VudCBmb3IgbWFyZ2luIGNhbGN1bGF0aW9uc1xuXG4gICAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsU3BhY2VMZWZ0ID0gKGltYWdlc0NTU1tcIm1hcmdpbi1sZWZ0XCJdICsgaW1hZ2VzQ1NTW1wicGFkZGluZy1sZWZ0XCJdKSAqIGZvbnRUb1VuaXRSYXRpbztcbiAgICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxTcGFjZVJpZ2h0ID0gKGltYWdlc0NTU1tcIm1hcmdpbi1yaWdodFwiXSArIGltYWdlc0NTU1tcInBhZGRpbmctcmlnaHRcIl0pICogZm9udFRvVW5pdFJhdGlvO1xuICAgICAgICAgICAgICB2YXIgYWRkaXRpb25hbFNwYWNlVG9wID0gKGltYWdlc0NTU1tcIm1hcmdpbi10b3BcIl0gKyBpbWFnZXNDU1NbXCJwYWRkaW5nLXRvcFwiXSkgKiBmb250VG9Vbml0UmF0aW87XG4gICAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsU3BhY2VCb3R0b20gPSAoaW1hZ2VzQ1NTW1wibWFyZ2luLWJvdHRvbVwiXSArIGltYWdlc0NTU1tcInBhZGRpbmctYm90dG9tXCJdKSAqIGZvbnRUb1VuaXRSYXRpbzsgLy9pZiBmbG9hdCBpcyBzZXQgdG8gcmlnaHQsIG1vdmUgdGhlIGltYWdlIHRvIHRoZSByaWdodCBib3JkZXJcbiAgICAgICAgICAgICAgLy9hZGQgc3BhY2UgaWYgbWFyZ2luIGlzIHNldFxuXG4gICAgICAgICAgICAgIGlmIChpbWFnZXNDU1NbJ2Zsb2F0J10gIT09IHVuZGVmaW5lZCAmJiBpbWFnZXNDU1NbJ2Zsb2F0J10gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgICAgICBpbWFnZVggKz0gcmVuZGVyZXIuc2V0dGluZ3Mud2lkdGggLSBjbi53aWR0aCAtIGFkZGl0aW9uYWxTcGFjZVJpZ2h0O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGltYWdlWCArPSBhZGRpdGlvbmFsU3BhY2VMZWZ0O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLmFkZEltYWdlKGNhY2hlZF9pbWFnZSwgaW1hZ2VYLCByZW5kZXJlci55ICsgYWRkaXRpb25hbFNwYWNlVG9wLCBjbi53aWR0aCwgY24uaGVpZ2h0KTtcbiAgICAgICAgICAgICAgY2FjaGVkX2ltYWdlID0gdW5kZWZpbmVkOyAvL2lmIHRoZSBmbG9hdCBwcm9wIGlzIHNwZWNpZmllZCB3ZSBoYXZlIHRvIGZsb2F0IHRoZSB0ZXh0IGFyb3VuZCB0aGUgaW1hZ2VcblxuICAgICAgICAgICAgICBpZiAoaW1hZ2VzQ1NTWydmbG9hdCddID09PSAncmlnaHQnIHx8IGltYWdlc0NTU1snZmxvYXQnXSA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgLy9hZGQgZnVuY3Rpb250IHRvIHNldCBiYWNrIGNvb3JkaW5hdGVzIGFmdGVyIGltYWdlIHJlbmRlcmluZ1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLndhdGNoRnVuY3Rpb25zLnB1c2goZnVuY3Rpb24gKGRpZmZYLCB0aHJlc2hvbGRZLCBkaWZmV2lkdGgsIGVsKSB7XG4gICAgICAgICAgICAgICAgICAvL3VuZG8gZHJhd2luZyBib3ggYWRhcHRpb25zIHdoaWNoIHdlcmUgc2V0IGJ5IGZsb2F0aW5nXG4gICAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIueSA+PSB0aHJlc2hvbGRZKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnggKz0gZGlmZlg7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldHRpbmdzLndpZHRoICs9IGRpZmZXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsICYmIGVsLm5vZGVUeXBlID09PSAxICYmICFTa2lwTm9kZVtlbC5ub2RlTmFtZV0gJiYgcmVuZGVyZXIueCArIGVsLndpZHRoID4gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmxlZnQgKyByZW5kZXJlci5wZGYubWFyZ2luc19kb2Mud2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIueCArPSBkaWZmWDtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIueSA9IHRocmVzaG9sZFk7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldHRpbmdzLndpZHRoICs9IGRpZmZXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMsIGltYWdlc0NTU1snZmxvYXQnXSA9PT0gJ2xlZnQnID8gLWNuLndpZHRoIC0gYWRkaXRpb25hbFNwYWNlTGVmdCAtIGFkZGl0aW9uYWxTcGFjZVJpZ2h0IDogMCwgcmVuZGVyZXIueSArIGNuLmhlaWdodCArIGFkZGl0aW9uYWxTcGFjZVRvcCArIGFkZGl0aW9uYWxTcGFjZUJvdHRvbSwgY24ud2lkdGgpKTsgLy9yZXNldCBmbG9hdGluZyBieSBjbGVhcjpib3RoIGRpdnNcbiAgICAgICAgICAgICAgICAvL2p1c3Qgc2V0IGN1cnNvclkgYWZ0ZXIgdGhlIGZsb2F0aW5nIGVsZW1lbnRcblxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLndhdGNoRnVuY3Rpb25zLnB1c2goZnVuY3Rpb24gKHlQb3NpdGlvbkFmdGVyRmxvYXRpbmcsIHBhZ2VzLCBlbCkge1xuICAgICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyLnkgPCB5UG9zaXRpb25BZnRlckZsb2F0aW5nICYmIHBhZ2VzID09PSByZW5kZXJlci5wZGYuaW50ZXJuYWwuZ2V0TnVtYmVyT2ZQYWdlcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbC5ub2RlVHlwZSA9PT0gMSAmJiBHZXRDU1MoZWwpLmNsZWFyID09PSAnYm90aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlci55ID0geVBvc2l0aW9uQWZ0ZXJGbG9hdGluZztcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzLCByZW5kZXJlci55ICsgY24uaGVpZ2h0LCByZW5kZXJlci5wZGYuaW50ZXJuYWwuZ2V0TnVtYmVyT2ZQYWdlcygpKSk7IC8vaWYgZmxvYXRpbmcgaXMgc2V0IHdlIGRlY3JlYXNlIHRoZSBhdmFpbGFibGUgd2lkdGggYnkgdGhlIGltYWdlIHdpZHRoXG5cbiAgICAgICAgICAgICAgICByZW5kZXJlci5zZXR0aW5ncy53aWR0aCAtPSBjbi53aWR0aCArIGFkZGl0aW9uYWxTcGFjZUxlZnQgKyBhZGRpdGlvbmFsU3BhY2VSaWdodDsgLy9pZiBsZWZ0IGp1c3QgYWRkIHRoZSBpbWFnZSB3aWR0aCB0byB0aGUgWCBjb29yZGluYXRlXG5cbiAgICAgICAgICAgICAgICBpZiAoaW1hZ2VzQ1NTWydmbG9hdCddID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnggKz0gY24ud2lkdGggKyBhZGRpdGlvbmFsU3BhY2VMZWZ0ICsgYWRkaXRpb25hbFNwYWNlUmlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vaWYgbm8gZmxvYXRpbmcgaXMgc2V0LCBtb3ZlIHRoZSByZW5kZXJpbmcgY3Vyc29yIGFmdGVyIHRoZSBpbWFnZSBoZWlnaHRcbiAgICAgICAgICAgICAgICByZW5kZXJlci55ICs9IGNuLmhlaWdodCArIGFkZGl0aW9uYWxTcGFjZVRvcCArIGFkZGl0aW9uYWxTcGFjZUJvdHRvbTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvKioqIFRBQkxFIFJFTkRFUklORyAqKiovXG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY24ubm9kZU5hbWUgPT09IFwiVEFCTEVcIikge1xuICAgICAgICAgICAgICBpZighcmVuZGVyZXIucGRmLmF1dG9UYWJsZSkge1xuICAgICAgICAgICAgICAgIHRhYmxlMmpzb24gPSB0YWJsZVRvSnNvbihjbiwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gMTA7XG4gICAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLnRhYmxlKHJlbmRlcmVyLngsIHJlbmRlcmVyLnksIHRhYmxlMmpzb24ucm93cywgdGFibGUyanNvbi5oZWFkZXJzLCB7XG4gICAgICAgICAgICAgICAgICBhdXRvU2l6ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBwcmludEhlYWRlcnM6IGVsZW1lbnRIYW5kbGVycy5wcmludEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICBtYXJnaW5zOiByZW5kZXJlci5wZGYubWFyZ2luc19kb2MsXG4gICAgICAgICAgICAgICAgICBjc3M6IEdldENTUyhjbilcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZW5kZXJlci55ID0gcmVuZGVyZXIucGRmLmludGVybmFsLl9fY2VsbF9fLmxhc3RDZWxsLnkgK1xuICAgICAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLmludGVybmFsLl9fY2VsbF9fLmxhc3RDZWxsLmhlaWdodDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZW5kZXJlci55ICs9IDEwO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnBkZi5hdXRvVGFibGUoeyB0aGVtZTogXCJncmlkXCIsIGh0bWw6IGNuLCBzdGFydFk6IHJlbmRlcmVyLnksXG4gICAgICAgICAgICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgZm9udDogcmVuZGVyZXIucGRmLmdldEZvbnQoKS5mb250TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IHJlbmRlcmVyLnBkZi5nZXRGb250U2l6ZSgpLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0Q29sb3I6IHJlbmRlcmVyLnBkZi5nZXRUZXh0Q29sb3IoKVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIG1hcmdpbjogeyBcbiAgICAgICAgICAgICAgICAgICAgdG9wOiByZW5kZXJlci5wZGYubWFyZ2luc19kb2MudG9wLCBcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogcmVuZGVyZXIueCwgXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0OiByZW5kZXJlci5wZGYuaW50ZXJuYWwucGFnZVNpemUuZ2V0V2lkdGgoKSAtIChyZW5kZXJlci54ICArIHJlbmRlcmVyLnNldHRpbmdzLndpZHRoKSwgXG4gICAgICAgICAgICAgICAgICAgIGJvdHRvbTogcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmJvdHRvbSB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgPSByZW5kZXJlci5wZGYubGFzdEF1dG9UYWJsZS5maW5hbFk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY24ubm9kZU5hbWUgPT09IFwiT0xcIiB8fCBjbi5ub2RlTmFtZSA9PT0gXCJVTFwiKSB7XG4gICAgICAgICAgICAgIGxpc3RDb3VudCA9IDE7XG5cbiAgICAgICAgICAgICAgaWYgKCFlbGVtZW50SGFuZGxlZEVsc2V3aGVyZShjbiwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycykpIHtcbiAgICAgICAgICAgICAgICBfRHJpbGxGb3JDb250ZW50KGNuLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gMTA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNuLm5vZGVOYW1lID09PSBcIkxJXCIpIHtcbiAgICAgICAgICAgICAgdmFyIHRlbXAgPSByZW5kZXJlci54O1xuICAgICAgICAgICAgICByZW5kZXJlci54ICs9IDIwIC8gcmVuZGVyZXIucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgICAgICAgICByZW5kZXJlci55ICs9IDM7XG5cbiAgICAgICAgICAgICAgaWYgKCFlbGVtZW50SGFuZGxlZEVsc2V3aGVyZShjbiwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycykpIHtcbiAgICAgICAgICAgICAgICBfRHJpbGxGb3JDb250ZW50KGNuLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJlbmRlcmVyLnggPSB0ZW1wO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlTmFtZSA9PT0gXCJCUlwiKSB7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gZnJhZ21lbnRDU1NbXCJmb250LXNpemVcIl0gKiByZW5kZXJlci5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLmFkZFRleHQoXCJcXHUyMDI4XCIsIGNsb25lKGZyYWdtZW50Q1NTKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoIWVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlKGNuLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKSkge1xuICAgICAgICAgICAgICAgIF9EcmlsbEZvckNvbnRlbnQoY24sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gY24ubm9kZVZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoY24ubm9kZVZhbHVlICYmIGNuLnBhcmVudE5vZGUubm9kZU5hbWUgPT09IFwiTElcIikge1xuICAgICAgICAgICAgICBpZiAoY24ucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lID09PSBcIk9MXCIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGxpc3RDb3VudCsrICsgJy4gJyArIHZhbHVlO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmb250U2l6ZSA9IGZyYWdtZW50Q1NTW1wiZm9udC1zaXplXCJdO1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXRYID0gKDMgLSBmb250U2l6ZSAqIDAuNzUpICogcmVuZGVyZXIucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXRZID0gZm9udFNpemUgKiAwLjc1ICogcmVuZGVyZXIucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgICAgICAgICAgIHZhciByYWRpdXMgPSBmb250U2l6ZSAqIDEuNzQgLyByZW5kZXJlci5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG5cbiAgICAgICAgICAgICAgICBjYiA9IGZ1bmN0aW9uIGNiKHgsIHkpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMucGRmLmNpcmNsZSh4ICsgb2Zmc2V0WCwgeSArIG9mZnNldFksIHJhZGl1cywgJ0ZEJyk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAvLyBPbmx5IGFkZCB0aGUgdGV4dCBpZiB0aGUgdGV4dCBub2RlIGlzIGluIHRoZSBib2R5IGVsZW1lbnRcbiAgICAgICAgICAgIC8vIEFkZCBjb21wYXRpYmlsaXR5IHdpdGggSUUxMVxuXG5cbiAgICAgICAgICAgIGlmICghIShjbi5vd25lckRvY3VtZW50LmJvZHkuY29tcGFyZURvY3VtZW50UG9zaXRpb24oY24pICYgMTYpKSB7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLmFkZFRleHQodmFsdWUsIGZyYWdtZW50Q1NTKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmVuZGVyZXIuYWRkVGV4dChjbiwgZnJhZ21lbnRDU1MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGkrKztcbiAgICAgIH1cblxuICAgICAgZWxlbWVudEhhbmRsZXJzLm91dFkgPSByZW5kZXJlci55O1xuXG4gICAgICBpZiAoaXNCbG9jaykge1xuICAgICAgICByZXR1cm4gcmVuZGVyZXIuc2V0QmxvY2tCb3VuZGFyeShjYik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGltYWdlcyA9IHt9O1xuXG4gICAgbG9hZEltZ3MgPSBmdW5jdGlvbiBsb2FkSW1ncyhlbGVtZW50LCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzLCBjYikge1xuICAgICAgdmFyIGltZ3MgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKSxcbiAgICAgICAgICBsID0gaW1ncy5sZW5ndGgsXG4gICAgICAgICAgZm91bmRfaW1hZ2VzLFxuICAgICAgICAgIHggPSAwO1xuXG4gICAgICBmdW5jdGlvbiBkb25lKCkge1xuICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwuZXZlbnRzLnB1Ymxpc2goJ2ltYWdlc0xvYWRlZCcpO1xuICAgICAgICBjYihmb3VuZF9pbWFnZXMpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBsb2FkSW1hZ2UodXJsLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIGlmICghdXJsKSByZXR1cm47XG4gICAgICAgIHZhciBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgZm91bmRfaW1hZ2VzID0gKyt4O1xuICAgICAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnJztcblxuICAgICAgICBpbWcub25lcnJvciA9IGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGltZy5jb21wbGV0ZSkge1xuICAgICAgICAgICAgLy90byBzdXBwb3J0IGRhdGEgdXJscyBpbiBpbWFnZXMsIHNldCB3aWR0aCBhbmQgaGVpZ2h0XG4gICAgICAgICAgICAvL2FzIHRob3NlIHZhbHVlcyBhcmUgbm90IHJlY29nbml6ZWQgYXV0b21hdGljYWxseVxuICAgICAgICAgICAgaWYgKGltZy5zcmMuaW5kZXhPZignZGF0YTppbWFnZS8nKSA9PT0gMCkge1xuICAgICAgICAgICAgICBpbWcud2lkdGggPSB3aWR0aCB8fCBpbWcud2lkdGggfHwgMDtcbiAgICAgICAgICAgICAgaW1nLmhlaWdodCA9IGhlaWdodCB8fCBpbWcuaGVpZ2h0IHx8IDA7XG4gICAgICAgICAgICB9IC8vaWYgdmFsaWQgaW1hZ2UgYWRkIHRvIGtub3duIGltYWdlcyBhcnJheVxuXG5cbiAgICAgICAgICAgIGlmIChpbWcud2lkdGggKyBpbWcuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgIHZhciBoYXNoID0gKHJlbmRlcmVyLnBkZi5zSGFzaENvZGUgJiYgcmVuZGVyZXIucGRmLnNIYXNoQ29kZSh1cmwpKSB8fCB1cmw7XG4gICAgICAgICAgICAgIGltYWdlc1toYXNoXSA9IGltYWdlc1toYXNoXSB8fCBpbWc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCEgLS14KSB7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGltZy5zcmMgPSB1cmw7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChsLS0pIHtcbiAgICAgICAgbG9hZEltYWdlKGltZ3NbbF0uZ2V0QXR0cmlidXRlKFwic3JjXCIpLCBpbWdzW2xdLndpZHRoLCBpbWdzW2xdLmhlaWdodCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB4IHx8IGRvbmUoKTtcbiAgICB9O1xuXG4gICAgY2hlY2tGb3JGb290ZXIgPSBmdW5jdGlvbiBjaGVja0ZvckZvb3RlcihlbGVtLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKSB7XG4gICAgICAvL2NoZWNrIGlmIHdlIGNhbiBmb3VuZCBhIDxmb290ZXI+IGVsZW1lbnRcbiAgICAgIHZhciBmb290ZXIgPSBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiZm9vdGVyXCIpO1xuXG4gICAgICBpZiAoZm9vdGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9vdGVyID0gZm9vdGVyWzBdOyAvL2JhZCBoYWNrIHRvIGdldCBoZWlnaHQgb2YgZm9vdGVyXG4gICAgICAgIC8vY3JlYXQgZHVtbXkgb3V0IGFuZCBjaGVjayBuZXcgeSBhZnRlciBmYWtlIHJlbmRlcmluZ1xuXG4gICAgICAgIHZhciBvbGRPdXQgPSByZW5kZXJlci5wZGYuaW50ZXJuYWwud3JpdGU7XG4gICAgICAgIHZhciBvbGRZID0gcmVuZGVyZXIueTtcblxuICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwud3JpdGUgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgICAgICBfRHJpbGxGb3JDb250ZW50KGZvb3RlciwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycyk7XG5cbiAgICAgICAgdmFyIGZvb3RlckhlaWdodCA9IE1hdGguY2VpbChyZW5kZXJlci55IC0gb2xkWSkgKyA1O1xuICAgICAgICByZW5kZXJlci55ID0gb2xkWTtcbiAgICAgICAgcmVuZGVyZXIucGRmLmludGVybmFsLndyaXRlID0gb2xkT3V0OyAvL2FkZCAyMCUgdG8gcHJldmVudCBvdmVybGFwcGluZ1xuXG4gICAgICAgIHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy5ib3R0b20gKz0gZm9vdGVySGVpZ2h0OyAvL0NyZWF0ZSBmdW5jdGlvbiByZW5kZXIgaGVhZGVyIG9uIGV2ZXJ5IHBhZ2VcblxuICAgICAgICB2YXIgcmVuZGVyRm9vdGVyID0gZnVuY3Rpb24gcmVuZGVyRm9vdGVyKHBhZ2VJbmZvKSB7XG4gICAgICAgICAgdmFyIHBhZ2VOdW1iZXIgPSBwYWdlSW5mbyAhPT0gdW5kZWZpbmVkID8gcGFnZUluZm8ucGFnZU51bWJlciA6IDE7IC8vc2V0IGN1cnJlbnQgeSBwb3NpdGlvbiB0byBvbGQgbWFyZ2luXG5cbiAgICAgICAgICB2YXIgb2xkUG9zaXRpb24gPSByZW5kZXJlci55OyAvL3JlbmRlciBhbGwgY2hpbGQgbm9kZXMgb2YgdGhlIGhlYWRlciBlbGVtZW50XG5cbiAgICAgICAgICByZW5kZXJlci55ID0gcmVuZGVyZXIucGRmLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpIC0gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmJvdHRvbTtcbiAgICAgICAgICByZW5kZXJlci5wZGYubWFyZ2luc19kb2MuYm90dG9tIC09IGZvb3RlckhlaWdodDsgLy9jaGVjayBpZiB3ZSBoYXZlIHRvIGFkZCBwYWdlIG51bWJlcnNcblxuICAgICAgICAgIHZhciBzcGFucyA9IGZvb3Rlci5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3BhbicpO1xuXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgLy9pZiB3ZSBmaW5kIHNvbWUgc3BhbiBlbGVtZW50IHdpdGggY2xhc3MgcGFnZUNvdW50ZXIsIHNldCB0aGUgcGFnZVxuICAgICAgICAgICAgaWYgKChcIiBcIiArIHNwYW5zW2ldLmNsYXNzTmFtZSArIFwiIFwiKS5yZXBsYWNlKC9bXFxuXFx0XS9nLCBcIiBcIikuaW5kZXhPZihcIiBwYWdlQ291bnRlciBcIikgPiAtMSkge1xuICAgICAgICAgICAgICBzcGFuc1tpXS5pbm5lckhUTUwgPSBwYWdlTnVtYmVyO1xuICAgICAgICAgICAgfSAvL2lmIHdlIGZpbmQgc29tZSBzcGFuIGVsZW1lbnQgd2l0aCBjbGFzcyB0b3RhbFBhZ2VzLCBzZXQgYSB2YXJpYWJsZSB3aGljaCBpcyByZXBsYWNlZCBhZnRlciByZW5kZXJpbmcgb2YgYWxsIHBhZ2VzXG5cblxuICAgICAgICAgICAgaWYgKChcIiBcIiArIHNwYW5zW2ldLmNsYXNzTmFtZSArIFwiIFwiKS5yZXBsYWNlKC9bXFxuXFx0XS9nLCBcIiBcIikuaW5kZXhPZihcIiB0b3RhbFBhZ2VzIFwiKSA+IC0xKSB7XG4gICAgICAgICAgICAgIHNwYW5zW2ldLmlubmVySFRNTCA9ICcjIyNqc1BERlZhclRvdGFsUGFnZXMjIyMnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy9yZW5kZXIgZm9vdGVyIGNvbnRlbnRcblxuXG4gICAgICAgICAgX0RyaWxsRm9yQ29udGVudChmb290ZXIsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpOyAvL3NldCBib3R0b20gbWFyZ2luIHRvIHByZXZpb3VzIGhlaWdodCBpbmNsdWRpbmcgdGhlIGZvb3RlciBoZWlnaHRcblxuXG4gICAgICAgICAgcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmJvdHRvbSArPSBmb290ZXJIZWlnaHQ7IC8vaW1wb3J0YW50IGZvciBvdGhlciBwbHVnaW5zIChlLmcuIHRhYmxlKSB0byBzdGFydCByZW5kZXJpbmcgYXQgY29ycmVjdCBwb3NpdGlvbiBhZnRlciBoZWFkZXJcblxuICAgICAgICAgIHJlbmRlcmVyLnkgPSBvbGRQb3NpdGlvbjtcbiAgICAgICAgfTsgLy9jaGVjayBpZiBmb290ZXIgY29udGFpbnMgdG90YWxQYWdlcyB3aGljaCBzaG91bGQgYmUgcmVwbGFjZSBhdCB0aGUgZGlzb3Bvc2FsIG9mIHRoZSBkb2N1bWVudFxuXG5cbiAgICAgICAgdmFyIHNwYW5zID0gZm9vdGVyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzcGFuJyk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGlmICgoXCIgXCIgKyBzcGFuc1tpXS5jbGFzc05hbWUgKyBcIiBcIikucmVwbGFjZSgvW1xcblxcdF0vZywgXCIgXCIpLmluZGV4T2YoXCIgdG90YWxQYWdlcyBcIikgPiAtMSkge1xuICAgICAgICAgICAgcmVuZGVyZXIucGRmLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ2h0bWxSZW5kZXJpbmdGaW5pc2hlZCcsIHJlbmRlcmVyLnBkZi5wdXRUb3RhbFBhZ2VzLmJpbmQocmVuZGVyZXIucGRmLCAnIyMjanNQREZWYXJUb3RhbFBhZ2VzIyMjJyksIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvL3JlZ2lzdGVyIGV2ZW50IHRvIHJlbmRlciBmb290ZXIgb24gZXZlcnkgbmV3IHBhZ2VcblxuXG4gICAgICAgIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdhZGRQYWdlJywgcmVuZGVyRm9vdGVyLCBmYWxzZSk7IC8vcmVuZGVyIGZvb3RlciBvbiBmaXJzdCBwYWdlXG5cbiAgICAgICAgcmVuZGVyRm9vdGVyKCk7IC8vcHJldmVudCBmb290ZXIgcmVuZGVyaW5nXG5cbiAgICAgICAgU2tpcE5vZGVbJ0ZPT1RFUiddID0gMTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJvY2VzcyA9IGZ1bmN0aW9uIHByb2Nlc3MocGRmLCBlbGVtZW50LCB4LCB5LCBzZXR0aW5ncywgY2FsbGJhY2spIHtcbiAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ICE9PSBcInN0cmluZ1wiICYmICFlbGVtZW50LnBhcmVudE5vZGUpIGVsZW1lbnQgPSAnJyArIGVsZW1lbnQuaW5uZXJIVE1MO1xuXG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgZWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgdmFyICRmcmFtZSwgJGhpZGRlbmRpdiwgZnJhbWVuYW1lLCB2aXN1YWxseWhpZGRlbjtcbiAgICAgICAgICBmcmFtZW5hbWUgPSBcImpzUERGaHRtbFRleHRcIiArIERhdGUubm93KCkudG9TdHJpbmcoKSArIChNYXRoLnJhbmRvbSgpICogMTAwMCkudG9GaXhlZCgwKTtcbiAgICAgICAgICB2aXN1YWxseWhpZGRlbiA9IFwicG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XCIgKyBcImNsaXA6IHJlY3QoMXB4IDFweCAxcHggMXB4KTsgLyogSUU2LCBJRTcgKi9cIiArIFwiY2xpcDogcmVjdCgxcHgsIDFweCwgMXB4LCAxcHgpO1wiICsgXCJwYWRkaW5nOjAgIWltcG9ydGFudDtcIiArIFwiYm9yZGVyOjAgIWltcG9ydGFudDtcIiArIFwiaGVpZ2h0OiAxcHggIWltcG9ydGFudDtcIiArIFwid2lkdGg6IDFweCAhaW1wb3J0YW50OyBcIiArIFwidG9wOmF1dG87XCIgKyBcImxlZnQ6LTEwMHB4O1wiICsgXCJvdmVyZmxvdzogaGlkZGVuO1wiO1xuICAgICAgICAgICRoaWRkZW5kaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAkaGlkZGVuZGl2LmNsYXNzTmFtZSA9IFwic2pzLXBkZi1oaWRkZW4taHRtbC1kaXZcIjtcbiAgICAgICAgICAkaGlkZGVuZGl2LnN0eWxlLmNzc1RleHQgPSB2aXN1YWxseWhpZGRlbjtcbiAgICAgICAgICAkaGlkZGVuZGl2LmlubmVySFRNTCA9IFwiPGlmcmFtZSBzdHlsZT1cXFwiaGVpZ2h0OjFweDt3aWR0aDoxcHhcXFwiIG5hbWU9XFxcIlwiICsgZnJhbWVuYW1lICsgXCJcXFwiIC8+XCI7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCgkaGlkZGVuZGl2KTtcbiAgICAgICAgICAkZnJhbWUgPSB3aW5kb3cuZnJhbWVzW2ZyYW1lbmFtZV07XG4gICAgICAgICAgJGZyYW1lLmRvY3VtZW50Lm9wZW4oKTtcbiAgICAgICAgICAkZnJhbWUuZG9jdW1lbnQud3JpdGVsbihlbGVtZW50KTtcbiAgICAgICAgICAkZnJhbWUuZG9jdW1lbnQuY2xvc2UoKTtcbiAgICAgICAgICByZXR1cm4gJGZyYW1lLmRvY3VtZW50LmJvZHk7XG4gICAgICAgIH0oZWxlbWVudC5yZXBsYWNlKC88XFwvP3NjcmlwdFtePl0qPz4vZ2ksICcnKSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBhdmFpbGFibGVGb250cyA9IE9iamVjdC5rZXlzKHBkZi5nZXRGb250TGlzdCgpKTtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhdmFpbGFibGVGb250cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgZm9udE5hbWUgPSBhdmFpbGFibGVGb250c1tpXTtcbiAgICAgICAgdmFyIGZvbnRGYW1pbHkgPSBmb250TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZighRm9udE5hbWVEQltmb250RmFtaWx5XSkge1xuICAgICAgICAgIEZvbnROYW1lREJbZm9udEZhbWlseV0gPSBmb250TmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgciA9IG5ldyBSZW5kZXJlcihwZGYsIHgsIHksIHNldHRpbmdzKSxcbiAgICAgICAgICBvdXQ7IC8vIDEuIGxvYWQgaW1hZ2VzXG4gICAgICAvLyAyLiBwcmVwYXJlIG9wdGlvbmFsIGZvb3RlciBlbGVtZW50c1xuICAgICAgLy8gMy4gcmVuZGVyIGNvbnRlbnRcblxuICAgICAgbG9hZEltZ3MuY2FsbCh0aGlzLCBlbGVtZW50LCByLCBzZXR0aW5ncy5lbGVtZW50SGFuZGxlcnMsIGZ1bmN0aW9uIChmb3VuZF9pbWFnZXMpIHtcbiAgICAgICAgY2hlY2tGb3JGb290ZXIoZWxlbWVudCwgciwgc2V0dGluZ3MuZWxlbWVudEhhbmRsZXJzKTtcblxuICAgICAgICBfRHJpbGxGb3JDb250ZW50KGVsZW1lbnQsIHIsIHNldHRpbmdzLmVsZW1lbnRIYW5kbGVycyk7IC8vc2VuZCBldmVudCBkaXNwb3NlIGZvciBmaW5hbCB0YWtzIChlLmcuIGZvb3RlciB0b3RhbHBhZ2UgcmVwbGFjZW1lbnQpXG5cblxuICAgICAgICByLnBkZi5pbnRlcm5hbC5ldmVudHMucHVibGlzaCgnaHRtbFJlbmRlcmluZ0ZpbmlzaGVkJyk7XG4gICAgICAgIG91dCA9IHIuZGlzcG9zZSgpO1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSBjYWxsYmFjayhvdXQpO2Vsc2UgaWYgKGZvdW5kX2ltYWdlcykgY29uc29sZS5lcnJvcignanNQREYgV2FybmluZzogcmVuZGVyaW5nIGlzc3Vlcz8gcHJvdmlkZSBhIGNhbGxiYWNrIHRvIGZyb21IVE1MIScpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gb3V0IHx8IHtcbiAgICAgICAgeDogci54LFxuICAgICAgICB5OiByLnlcbiAgICAgIH07XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5wYXJhZ3JhcGggPSB7XG4gICAgICAgIHRleHQ6IFtdLFxuICAgICAgICBzdHlsZTogW11cbiAgICAgIH07XG4gICAgICByZXR1cm4gdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoXCJxXCIpO1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKFwiUVwiKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHRoaXMueCxcbiAgICAgICAgeTogdGhpcy55LFxuICAgICAgICByZWFkeTogdHJ1ZVxuICAgICAgfTtcbiAgICB9OyAvL0NoZWNrcyBpZiB3ZSBoYXZlIHRvIGV4ZWN1dGUgc29tZSB3YXRjaGVyIGZ1bmN0aW9uc1xuICAgIC8vZS5nLiB0byBlbmQgdGV4dCBmbG9hdGluZyBhcm91bmQgYW4gaW1hZ2VcblxuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmV4ZWN1dGVXYXRjaEZ1bmN0aW9ucyA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgdmFyIHJldCA9IGZhbHNlO1xuICAgICAgdmFyIG5hcnJheSA9IFtdO1xuXG4gICAgICBpZiAodGhpcy53YXRjaEZ1bmN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy53YXRjaEZ1bmN0aW9ucy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGlmICh0aGlzLndhdGNoRnVuY3Rpb25zW2ldKGVsKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0ID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmFycmF5LnB1c2godGhpcy53YXRjaEZ1bmN0aW9uc1tpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy53YXRjaEZ1bmN0aW9ucyA9IG5hcnJheTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLnNwbGl0RnJhZ21lbnRzSW50b0xpbmVzID0gZnVuY3Rpb24gKGZyYWdtZW50cywgc3R5bGVzKSB7XG4gICAgICB2YXIgY3VycmVudExpbmVMZW5ndGgsIGRlZmF1bHRGb250U2l6ZSwgZmYsIGZvbnRNZXRyaWNzLCBmb250TWV0cmljc0NhY2hlLCBmcmFnbWVudCwgZnJhZ21lbnRDaG9wcGVkLCBmcmFnbWVudExlbmd0aCwgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MsIGZzLCBrLCBsaW5lLCBsaW5lcywgbWF4TGluZUxlbmd0aCwgc3R5bGU7XG4gICAgICBkZWZhdWx0Rm9udFNpemUgPSAxMjtcbiAgICAgIGsgPSB0aGlzLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgIGZvbnRNZXRyaWNzQ2FjaGUgPSB7fTtcbiAgICAgIGZmID0gdm9pZCAwO1xuICAgICAgZnMgPSB2b2lkIDA7XG4gICAgICBmb250TWV0cmljcyA9IHZvaWQgMDtcbiAgICAgIGZyYWdtZW50ID0gdm9pZCAwO1xuICAgICAgc3R5bGUgPSB2b2lkIDA7XG4gICAgICBmcmFnbWVudFNwZWNpZmljTWV0cmljcyA9IHZvaWQgMDtcbiAgICAgIGZyYWdtZW50TGVuZ3RoID0gdm9pZCAwO1xuICAgICAgZnJhZ21lbnRDaG9wcGVkID0gdm9pZCAwO1xuICAgICAgbGluZSA9IFtdO1xuICAgICAgbGluZXMgPSBbbGluZV07XG4gICAgICBjdXJyZW50TGluZUxlbmd0aCA9IDA7XG4gICAgICBtYXhMaW5lTGVuZ3RoID0gdGhpcy5zZXR0aW5ncy53aWR0aDtcblxuICAgICAgd2hpbGUgKGZyYWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgZnJhZ21lbnQgPSBmcmFnbWVudHMuc2hpZnQoKTtcbiAgICAgICAgc3R5bGUgPSBzdHlsZXMuc2hpZnQoKTtcblxuICAgICAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgICAgICBmZiA9IHN0eWxlW1wiZm9udC1mYW1pbHlcIl07XG4gICAgICAgICAgZnMgPSBzdHlsZVtcImZvbnQtc3R5bGVcIl07XG4gICAgICAgICAgZm9udE1ldHJpY3MgPSBmb250TWV0cmljc0NhY2hlW2ZmICsgZnNdO1xuXG4gICAgICAgICAgaWYgKCFmb250TWV0cmljcykge1xuICAgICAgICAgICAgZm9udE1ldHJpY3MgPSB0aGlzLnBkZi5pbnRlcm5hbC5nZXRGb250KGZmLCBmcykubWV0YWRhdGEuVW5pY29kZTtcbiAgICAgICAgICAgIGZvbnRNZXRyaWNzQ2FjaGVbZmYgKyBmc10gPSBmb250TWV0cmljcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmcmFnbWVudFNwZWNpZmljTWV0cmljcyA9IHtcbiAgICAgICAgICAgIHdpZHRoczogZm9udE1ldHJpY3Mud2lkdGhzLFxuICAgICAgICAgICAga2VybmluZzogZm9udE1ldHJpY3Mua2VybmluZyxcbiAgICAgICAgICAgIGZvbnRTaXplOiBzdHlsZVtcImZvbnQtc2l6ZVwiXSAqIGRlZmF1bHRGb250U2l6ZSxcbiAgICAgICAgICAgIHRleHRJbmRlbnQ6IGN1cnJlbnRMaW5lTGVuZ3RoXG4gICAgICAgICAgfTtcbiAgICAgICAgICBmcmFnbWVudExlbmd0aCA9IHRoaXMucGRmLmdldFN0cmluZ1VuaXRXaWR0aChmcmFnbWVudCwgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MpICogZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MuZm9udFNpemUgLyBrO1xuXG4gICAgICAgICAgaWYgKGZyYWdtZW50ID09IFwiXFx1MjAyOFwiKSB7XG4gICAgICAgICAgICBsaW5lID0gW107XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudExpbmVMZW5ndGggKyBmcmFnbWVudExlbmd0aCA+IG1heExpbmVMZW5ndGgpIHtcbiAgICAgICAgICAgIGZyYWdtZW50Q2hvcHBlZCA9IHRoaXMucGRmLnNwbGl0VGV4dFRvU2l6ZShmcmFnbWVudCwgbWF4TGluZUxlbmd0aCwgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MpO1xuICAgICAgICAgICAgbGluZS5wdXNoKFtmcmFnbWVudENob3BwZWQuc2hpZnQoKSwgc3R5bGVdKTtcblxuICAgICAgICAgICAgd2hpbGUgKGZyYWdtZW50Q2hvcHBlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgbGluZSA9IFtbZnJhZ21lbnRDaG9wcGVkLnNoaWZ0KCksIHN0eWxlXV07XG4gICAgICAgICAgICAgIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN1cnJlbnRMaW5lTGVuZ3RoID0gdGhpcy5wZGYuZ2V0U3RyaW5nVW5pdFdpZHRoKGxpbmVbMF1bMF0sIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzKSAqIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzLmZvbnRTaXplIC8gaztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGluZS5wdXNoKFtmcmFnbWVudCwgc3R5bGVdKTtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lTGVuZ3RoICs9IGZyYWdtZW50TGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvL2lmIHRleHQgYWxpZ25tZW50IHdhcyBzZXQsIHNldCBtYXJnaW4vaW5kZW50IG9mIGVhY2ggbGluZVxuXG5cbiAgICAgIGlmIChzdHlsZVsndGV4dC1hbGlnbiddICE9PSB1bmRlZmluZWQgJiYgKHN0eWxlWyd0ZXh0LWFsaWduJ10gPT09ICdjZW50ZXInIHx8IHN0eWxlWyd0ZXh0LWFsaWduJ10gPT09ICdyaWdodCcgfHwgc3R5bGVbJ3RleHQtYWxpZ24nXSA9PT0gJ2p1c3RpZnknKSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMucGRmLmdldFN0cmluZ1VuaXRXaWR0aChsaW5lc1tpXVswXVswXSwgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MpICogZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MuZm9udFNpemUgLyBrOyAvL2lmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbiBsaW5lIHdlIGhhdmUgdG8gY2xvbmUgdGhlIHN0eWxlIG9iamVjdCBhcyBhbGwgbGluZXMgaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGlzIG9iamVjdFxuXG4gICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBsaW5lc1tpXVswXVsxXSA9IGNsb25lKGxpbmVzW2ldWzBdWzFdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgc3BhY2UgPSBtYXhMaW5lTGVuZ3RoIC0gbGVuZ3RoO1xuXG4gICAgICAgICAgaWYgKHN0eWxlWyd0ZXh0LWFsaWduJ10gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgIGxpbmVzW2ldWzBdWzFdWydtYXJnaW4tbGVmdCddID0gc3BhY2U7IC8vaWYgYWxpZ25tZW50IGlzIG5vdCByaWdodCwgaXQgaGFzIHRvIGJlIGNlbnRlciBzbyBzcGxpdCB0aGUgc3BhY2UgdG8gdGhlIGxlZnQgYW5kIHRoZSByaWdodFxuICAgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVbJ3RleHQtYWxpZ24nXSA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgIGxpbmVzW2ldWzBdWzFdWydtYXJnaW4tbGVmdCddID0gc3BhY2UgLyAyOyAvL2lmIGp1c3RpZnkgd2FzIHNldCwgY2FsY3VsYXRlIHRoZSB3b3JkIHNwYWNpbmcgYW5kIGRlZmluZSBpbiBieSB1c2luZyB0aGUgY3NzIHByb3BlcnR5XG4gICAgICAgICAgfSBlbHNlIGlmIChzdHlsZVsndGV4dC1hbGlnbiddID09PSAnanVzdGlmeScpIHtcbiAgICAgICAgICAgIHZhciBjb3VudFNwYWNlcyA9IGxpbmVzW2ldWzBdWzBdLnNwbGl0KCcgJykubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGxpbmVzW2ldWzBdWzFdWyd3b3JkLXNwYWNpbmcnXSA9IHNwYWNlIC8gY291bnRTcGFjZXM7IC8vaWdub3JlIHRoZSBsYXN0IGxpbmUgaW4ganVzdGlmeSBtb2RlXG5cbiAgICAgICAgICAgIGlmIChpID09PSBsaW5lcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgIGxpbmVzW2ldWzBdWzFdWyd3b3JkLXNwYWNpbmcnXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsaW5lcztcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLlJlbmRlclRleHRGcmFnbWVudCA9IGZ1bmN0aW9uICh0ZXh0LCBzdHlsZSkge1xuICAgICAgdmFyIGRlZmF1bHRGb250U2l6ZSwgZm9udCwgbWF4TGluZUhlaWdodDtcbiAgICAgIG1heExpbmVIZWlnaHQgPSAwO1xuICAgICAgZGVmYXVsdEZvbnRTaXplID0gMTI7XG5cbiAgICAgIGlmICh0aGlzLnBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRIZWlnaHQoKSAtIHRoaXMucGRmLm1hcmdpbnNfZG9jLmJvdHRvbSA8IHRoaXMueSArIHRoaXMucGRmLmludGVybmFsLmdldEZvbnRTaXplKCkpIHtcbiAgICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoXCJFVFwiLCBcIlFcIiwgXCJRXCIpO1xuICAgICAgICBjb25zdCBjdXJyZW50UGFnZU51bWJlciA9IHRoaXMucGRmLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXI7XG4gICAgICAgIGlmICh0aGlzLnBkZi5nZXROdW1iZXJPZlBhZ2VzKCkgPT09IGN1cnJlbnRQYWdlTnVtYmVyKSB0aGlzLnBkZi5hZGRQYWdlKCk7XG4gICAgICAgIGVsc2UgdGhpcy5wZGYuc2V0UGFnZShjdXJyZW50UGFnZU51bWJlciArIDEpO1xuICAgICAgICB0aGlzLnkgPSB0aGlzLnBkZi5tYXJnaW5zX2RvYy50b3A7XG4gICAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKFwicVwiLCBcInFcIiwgXCJCVFwiLCB0aGlzLmdldFBkZkNvbG9yKHN0eWxlLmNvbG9yKSwgdGhpcy5wZGYuaW50ZXJuYWwuZ2V0Q29vcmRpbmF0ZVN0cmluZyh0aGlzLngpLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRWZXJ0aWNhbENvb3JkaW5hdGVTdHJpbmcodGhpcy55KSwgXCJUZFwiKTsgLy9tb3ZlIGN1cnNvciBieSBvbmUgbGluZSBvbiBuZXcgcGFnZVxuXG4gICAgICAgIG1heExpbmVIZWlnaHQgPSBNYXRoLm1heChtYXhMaW5lSGVpZ2h0LCBzdHlsZVtcImxpbmUtaGVpZ2h0XCJdLCBzdHlsZVtcImZvbnQtc2l6ZVwiXSk7XG4gICAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKDAsICgtMSAqIGRlZmF1bHRGb250U2l6ZSAqIG1heExpbmVIZWlnaHQpLnRvRml4ZWQoMiksIFwiVGRcIik7XG4gICAgICB9XG5cbiAgICAgIGZvbnQgPSB0aGlzLnBkZi5pbnRlcm5hbC5nZXRGb250KHN0eWxlW1wiZm9udC1mYW1pbHlcIl0sIHN0eWxlW1wiZm9udC1zdHlsZVwiXSk7IC8vIHRleHQgY29sb3JcblxuICAgICAgdmFyIHBkZlRleHRDb2xvciA9IHRoaXMuZ2V0UGRmQ29sb3Ioc3R5bGVbXCJjb2xvclwiXSk7XG5cbiAgICAgIGlmIChwZGZUZXh0Q29sb3IgIT09IHRoaXMubGFzdFRleHRDb2xvcikge1xuICAgICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZShwZGZUZXh0Q29sb3IpO1xuICAgICAgICB0aGlzLmxhc3RUZXh0Q29sb3IgPSBwZGZUZXh0Q29sb3I7XG4gICAgICB9IC8vc2V0IHRoZSB3b3JkIHNwYWNpbmcgZm9yIGUuZy4ganVzdGlmeSBzdHlsZVxuXG5cbiAgICAgIGlmIChzdHlsZVsnd29yZC1zcGFjaW5nJ10gIT09IHVuZGVmaW5lZCAmJiBzdHlsZVsnd29yZC1zcGFjaW5nJ10gPiAwKSB7XG4gICAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKHN0eWxlWyd3b3JkLXNwYWNpbmcnXS50b0ZpeGVkKDIpLCBcIlR3XCIpO1xuICAgICAgfVxuXG5cbiAgICAgIHZhciBwZGZFc2NhcGUxNiA9IGZ1bmN0aW9uKHRleHQsIGZvbnQpIHtcbiAgICAgICAgdmFyIHdpZHRocyA9IGZvbnQubWV0YWRhdGEuVW5pY29kZS53aWR0aHM7XG4gICAgICAgIHZhciBwYWR6ID0gW1wiXCIsIFwiMFwiLCBcIjAwXCIsIFwiMDAwXCIsIFwiMDAwMFwiXTtcbiAgICAgICAgdmFyIGFyID0gW1wiXCJdO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRleHQubGVuZ3RoLCB0OyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgdCA9IGZvbnQubWV0YWRhdGEuY2hhcmFjdGVyVG9HbHlwaCh0ZXh0LmNoYXJDb2RlQXQoaSkpO1xuICAgICAgICAgIGZvbnQubWV0YWRhdGEuZ2x5SWRzVXNlZC5wdXNoKHQpO1xuICAgICAgICAgIGZvbnQubWV0YWRhdGEudG9Vbmljb2RlW3RdID0gdGV4dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgIGlmICh3aWR0aHMuaW5kZXhPZih0KSA9PSAtMSkge1xuICAgICAgICAgICAgd2lkdGhzLnB1c2godCk7XG4gICAgICAgICAgICB3aWR0aHMucHVzaChbcGFyc2VJbnQoZm9udC5tZXRhZGF0YS53aWR0aE9mR2x5cGgodCksIDEwKV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodCA9PSBcIjBcIikge1xuICAgICAgICAgICAgLy9TcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGluIGNtYXAuXG4gICAgICAgICAgICByZXR1cm4gYXIuam9pbihcIlwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdCA9IHQudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgYXIucHVzaChwYWR6WzQgLSB0Lmxlbmd0aF0sIHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXIuam9pbihcIlwiKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciB1dGY4VGV4dEZ1bmN0aW9uID0gZnVuY3Rpb24odGV4dCwgZm9udCkge1xuICAgICAgICB2YXIgdGV4dCA9IHRleHQgfHwgXCJcIjtcbiAgICBcbiAgICAgICAgdmFyIHN0ciA9IFwiXCIsXG4gICAgICAgICAgcyA9IDAsXG4gICAgICAgICAgY21hcENvbmZpcm07XG4gICAgICAgIHZhciBzdHJUZXh0ID0gXCJcIjtcbiAgICAgICAgdmFyIGVuY29kaW5nID0gZm9udC5lbmNvZGluZztcbiAgICBcbiAgICAgICAgaWYgKGZvbnQuZW5jb2RpbmcgIT09IFwiSWRlbnRpdHktSFwiKSB7XG4gICAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgc3RyVGV4dCA9IHRleHQ7XG4gICAgXG4gICAgICAgIGZvciAocyA9IDA7IHMgPCBzdHJUZXh0Lmxlbmd0aDsgcyArPSAxKSB7XG4gICAgICAgICAgaWYgKGZvbnQubWV0YWRhdGEuaGFzT3duUHJvcGVydHkoXCJjbWFwXCIpKSB7XG4gICAgICAgICAgICBjbWFwQ29uZmlybSA9IGZvbnQubWV0YWRhdGEuY21hcC51bmljb2RlLmNvZGVNYXBbc3RyVGV4dFtzXS5jaGFyQ29kZUF0KDApXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFjbWFwQ29uZmlybSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBzdHJUZXh0W3NdLmNoYXJDb2RlQXQoMCkgPCAyNTYgJiZcbiAgICAgICAgICAgICAgZm9udC5tZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eShcIlVuaWNvZGVcIilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBzdHIgKz0gc3RyVGV4dFtzXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0ciArPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHIgKz0gc3RyVGV4dFtzXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGlmIChwYXJzZUludChmb250LmlkLnNsaWNlKDEpKSA8IDE0IHx8IGVuY29kaW5nID09PSBcIldpbkFuc2lFbmNvZGluZ1wiKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5wZGYuaW50ZXJuYWwucGRmRXNjYXBlKHN0ciwga2V5KVxuICAgICAgICAgICAgLnNwbGl0KFwiXCIpXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uKGN2KSB7XG4gICAgICAgICAgICAgIHJldHVybiBjdi5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbihcIlwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbmNvZGluZyA9PT0gXCJJZGVudGl0eS1IXCIpIHtcbiAgICAgICAgICByZXN1bHQgPSBwZGZFc2NhcGUxNihzdHIsIGZvbnQpO1xuICAgICAgICB9XG4gICAgXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9OyAgICAgIFxuXG4gICAgICAvLyB2YXIgZXNjYXBlZFRleHQgPSB0aGlzLnBkZi5pbnRlcm5hbC5wZGZFc2NhcGUodGV4dCk7XG4gICAgICAvLyB2YXIgZXNjYXBlZFRleHQgPSB1dGY4VGV4dEZ1bmN0aW9uKHRleHQsIGZvbnQpO1xuICAgICAgLy8gaWYoZXNjYXBlZFRleHQgIT0gdGV4dCkge1xuICAgICAgLy8gICBlc2NhcGVkVGV4dCA9IFwiPFwiICsgZXNjYXBlZFRleHQgKyBcIj5cIjtcbiAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAvLyAgIGVzY2FwZWRUZXh0ID0gXCIoXCIgKyBlc2NhcGVkVGV4dCArIFwiKVwiO1xuICAgICAgLy8gfVxuXG4gICAgICB2YXIgZXNjYXBlZFRleHQgPSBcIlwiO1xuICAgICAgaWYoZm9udC5lbmNvZGluZyAhPT0gXCJJZGVudGl0eS1IXCIpIHtcbiAgICAgICAgZXNjYXBlZFRleHQgPSBcIihcIiArIHRoaXMucGRmLmludGVybmFsLnBkZkVzY2FwZSh0ZXh0KSArIFwiKVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXNjYXBlZFRleHQgPSBcIjxcIiArIHV0ZjhUZXh0RnVuY3Rpb24odGV4dCwgZm9udCkgKyBcIj5cIjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoXCIvXCIgKyBmb250LmlkLCAoZGVmYXVsdEZvbnRTaXplICogc3R5bGVbXCJmb250LXNpemVcIl0pLnRvRml4ZWQoMiksIFwiVGZcIiwgZXNjYXBlZFRleHQgKyBcIiBUalwiKTsgLy9zZXQgdGhlIHdvcmQgc3BhY2luZyBiYWNrIHRvIG5ldXRyYWwgPT4gMFxuXG4gICAgICBpZiAoc3R5bGVbJ3dvcmQtc3BhY2luZyddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoMCwgXCJUd1wiKTtcbiAgICAgIH1cbiAgICB9OyAvLyBBY2NlcHRzICNGRkZGRkYsIHJnYihpbnQsaW50LGludCksIG9yIENTUyBDb2xvciBOYW1lXG5cblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5nZXRQZGZDb2xvciA9IGZ1bmN0aW9uIChzdHlsZSkge1xuICAgICAgdmFyIHRleHRDb2xvcjtcbiAgICAgIHZhciByLCBnLCBiO1xuICAgICAgdmFyIHJ4ID0gL3JnYlxccypcXChcXHMqKFxcZCspLFxccyooXFxkKyksXFxzKihcXGQrXFxzKilcXCkvO1xuICAgICAgdmFyIG0gPSByeC5leGVjKHN0eWxlKTtcblxuICAgICAgaWYgKG0gIT0gbnVsbCkge1xuICAgICAgICByID0gcGFyc2VJbnQobVsxXSk7XG4gICAgICAgIGcgPSBwYXJzZUludChtWzJdKTtcbiAgICAgICAgYiA9IHBhcnNlSW50KG1bM10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdHlsZSA9PT0gXCJzdHJpbmdcIiAmJiBzdHlsZS5jaGFyQXQoMCkgIT0gJyMnKSB7XG4gICAgICAgICAgdmFyIHJnYkNvbG9yID0gbmV3IFJHQkNvbG9yKHN0eWxlKTtcblxuICAgICAgICAgIGlmIChyZ2JDb2xvci5vaykge1xuICAgICAgICAgICAgc3R5bGUgPSByZ2JDb2xvci50b0hleCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHlsZSA9ICcjMDAwMDAwJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByID0gc3R5bGUuc3Vic3RyaW5nKDEsIDMpO1xuICAgICAgICByID0gcGFyc2VJbnQociwgMTYpO1xuICAgICAgICBnID0gc3R5bGUuc3Vic3RyaW5nKDMsIDUpO1xuICAgICAgICBnID0gcGFyc2VJbnQoZywgMTYpO1xuICAgICAgICBiID0gc3R5bGUuc3Vic3RyaW5nKDUsIDcpO1xuICAgICAgICBiID0gcGFyc2VJbnQoYiwgMTYpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHIgPT09ICdzdHJpbmcnICYmIC9eI1swLTlBLUZhLWZdezZ9JC8udGVzdChyKSkge1xuICAgICAgICB2YXIgaGV4ID0gcGFyc2VJbnQoci5zdWJzdHIoMSksIDE2KTtcbiAgICAgICAgciA9IGhleCA+PiAxNiAmIDI1NTtcbiAgICAgICAgZyA9IGhleCA+PiA4ICYgMjU1O1xuICAgICAgICBiID0gaGV4ICYgMjU1O1xuICAgICAgfVxuXG4gICAgICB2YXIgZjMgPSB0aGlzLmYzO1xuXG4gICAgICBpZiAociA9PT0gMCAmJiBnID09PSAwICYmIGIgPT09IDAgfHwgdHlwZW9mIGcgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRleHRDb2xvciA9IGYzKHIgLyAyNTUpICsgJyBnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRleHRDb2xvciA9IFtmMyhyIC8gMjU1KSwgZjMoZyAvIDI1NSksIGYzKGIgLyAyNTUpLCAncmcnXS5qb2luKCcgJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ZXh0Q29sb3I7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5mMyA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgIHJldHVybiBudW1iZXIudG9GaXhlZCgzKTsgLy8gSWUsICUuM2ZcbiAgICB9LCBSZW5kZXJlci5wcm90b3R5cGUucmVuZGVyUGFyYWdyYXBoID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgICB2YXIgYmxvY2tzdHlsZSwgZGVmYXVsdEZvbnRTaXplLCBmb250VG9Vbml0UmF0aW8sIGZyYWdtZW50cywgaSwgbCwgbGluZSwgbGluZXMsIG1heExpbmVIZWlnaHQsIG91dCwgcGFyYWdyYXBoc3BhY2luZ19hZnRlciwgcGFyYWdyYXBoc3BhY2luZ19iZWZvcmUsIHByaW9yYmxvY2tzdHlsZSwgc3R5bGVzLCBmb250U2l6ZTtcbiAgICAgIGZyYWdtZW50cyA9IFB1cmdlV2hpdGVTcGFjZSh0aGlzLnBhcmFncmFwaC50ZXh0KTtcbiAgICAgIHN0eWxlcyA9IHRoaXMucGFyYWdyYXBoLnN0eWxlO1xuICAgICAgYmxvY2tzdHlsZSA9IHRoaXMucGFyYWdyYXBoLmJsb2Nrc3R5bGU7XG4gICAgICBwcmlvcmJsb2Nrc3R5bGUgPSB0aGlzLnBhcmFncmFwaC5wcmlvcmJsb2Nrc3R5bGUgfHwge307XG4gICAgICB0aGlzLnBhcmFncmFwaCA9IHtcbiAgICAgICAgdGV4dDogW10sXG4gICAgICAgIHN0eWxlOiBbXSxcbiAgICAgICAgYmxvY2tzdHlsZToge30sXG4gICAgICAgIHByaW9yYmxvY2tzdHlsZTogYmxvY2tzdHlsZVxuICAgICAgfTtcblxuICAgICAgaWYgKCFmcmFnbWVudHMuam9pbihcIlwiKS50cmltKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsaW5lcyA9IHRoaXMuc3BsaXRGcmFnbWVudHNJbnRvTGluZXMoZnJhZ21lbnRzLCBzdHlsZXMpO1xuICAgICAgbGluZSA9IHZvaWQgMDtcbiAgICAgIG1heExpbmVIZWlnaHQgPSB2b2lkIDA7XG4gICAgICBkZWZhdWx0Rm9udFNpemUgPSAxMjtcbiAgICAgIGZvbnRUb1VuaXRSYXRpbyA9IGRlZmF1bHRGb250U2l6ZSAvIHRoaXMucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgdGhpcy5wcmlvck1hcmdpbkJvdHRvbSA9IHRoaXMucHJpb3JNYXJnaW5Cb3R0b20gfHwgMDtcbiAgICAgIHBhcmFncmFwaHNwYWNpbmdfYmVmb3JlID0gKE1hdGgubWF4KChibG9ja3N0eWxlW1wibWFyZ2luLXRvcFwiXSB8fCAwKSAtIHRoaXMucHJpb3JNYXJnaW5Cb3R0b20sIDApICsgKGJsb2Nrc3R5bGVbXCJwYWRkaW5nLXRvcFwiXSB8fCAwKSkgKiBmb250VG9Vbml0UmF0aW87XG4gICAgICBwYXJhZ3JhcGhzcGFjaW5nX2FmdGVyID0gKChibG9ja3N0eWxlW1wibWFyZ2luLWJvdHRvbVwiXSB8fCAwKSArIChibG9ja3N0eWxlW1wicGFkZGluZy1ib3R0b21cIl0gfHwgMCkpICogZm9udFRvVW5pdFJhdGlvO1xuICAgICAgdGhpcy5wcmlvck1hcmdpbkJvdHRvbSA9IGJsb2Nrc3R5bGVbXCJtYXJnaW4tYm90dG9tXCJdIHx8IDA7XG5cbiAgICAgIGlmIChibG9ja3N0eWxlWydwYWdlLWJyZWFrLWJlZm9yZSddID09PSAnYWx3YXlzJykge1xuICAgICAgICB0aGlzLnBkZi5hZGRQYWdlKCk7XG4gICAgICAgIHRoaXMueSA9IDA7XG4gICAgICAgIHBhcmFncmFwaHNwYWNpbmdfYmVmb3JlID0gKChibG9ja3N0eWxlW1wibWFyZ2luLXRvcFwiXSB8fCAwKSArIChibG9ja3N0eWxlW1wicGFkZGluZy10b3BcIl0gfHwgMCkpICogZm9udFRvVW5pdFJhdGlvO1xuICAgICAgfVxuXG4gICAgICBvdXQgPSB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZTtcbiAgICAgIGkgPSB2b2lkIDA7XG4gICAgICBsID0gdm9pZCAwO1xuICAgICAgdGhpcy55ICs9IHBhcmFncmFwaHNwYWNpbmdfYmVmb3JlO1xuICAgICAgb3V0KFwicVwiLCBcIkJUIDAgZ1wiLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRDb29yZGluYXRlU3RyaW5nKHRoaXMueCksIHRoaXMucGRmLmludGVybmFsLmdldFZlcnRpY2FsQ29vcmRpbmF0ZVN0cmluZyh0aGlzLnkpLCBcIlRkXCIpOyAvL3N0b3JlcyB0aGUgY3VycmVudCBpbmRlbnQgb2YgY3Vyc29yIHBvc2l0aW9uXG5cbiAgICAgIHZhciBjdXJyZW50SW5kZW50ID0gMDtcblxuICAgICAgd2hpbGUgKGxpbmVzLmxlbmd0aCkge1xuICAgICAgICBsaW5lID0gbGluZXMuc2hpZnQoKTtcbiAgICAgICAgbWF4TGluZUhlaWdodCA9IDA7XG4gICAgICAgIGkgPSAwO1xuICAgICAgICBsID0gbGluZS5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGkgIT09IGwpIHtcbiAgICAgICAgICBpZiAobGluZVtpXVswXS50cmltKCkpIHtcbiAgICAgICAgICAgIG1heExpbmVIZWlnaHQgPSBNYXRoLm1heChtYXhMaW5lSGVpZ2h0LCBsaW5lW2ldWzFdW1wibGluZS1oZWlnaHRcIl0sIGxpbmVbaV1bMV1bXCJmb250LXNpemVcIl0pO1xuICAgICAgICAgICAgZm9udFNpemUgPSBsaW5lW2ldWzFdW1wiZm9udC1zaXplXCJdICogNztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpKys7XG4gICAgICAgIH0gLy9pZiB3ZSBoYXZlIHRvIG1vdmUgdGhlIGN1cnNvciB0byBhZGFwdCB0aGUgaW5kZW50XG5cblxuICAgICAgICB2YXIgaW5kZW50TW92ZSA9IDA7XG4gICAgICAgIHZhciB3YW50ZWRJbmRlbnQgPSAwOyAvL2lmIGEgbWFyZ2luIHdhcyBhZGRlZCAoYnkgZS5nLiBhIHRleHQtYWxpZ25tZW50KSwgbW92ZSB0aGUgY3Vyc29yXG5cbiAgICAgICAgaWYgKGxpbmVbMF1bMV1bXCJtYXJnaW4tbGVmdFwiXSAhPT0gdW5kZWZpbmVkICYmIGxpbmVbMF1bMV1bXCJtYXJnaW4tbGVmdFwiXSA+IDApIHtcbiAgICAgICAgICB3YW50ZWRJbmRlbnQgPSB0aGlzLnBkZi5pbnRlcm5hbC5nZXRDb29yZGluYXRlU3RyaW5nKGxpbmVbMF1bMV1bXCJtYXJnaW4tbGVmdFwiXSk7XG4gICAgICAgICAgaW5kZW50TW92ZSA9IHdhbnRlZEluZGVudCAtIGN1cnJlbnRJbmRlbnQ7XG4gICAgICAgICAgY3VycmVudEluZGVudCA9IHdhbnRlZEluZGVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbmRlbnRNb3JlID0gTWF0aC5tYXgoYmxvY2tzdHlsZVtcIm1hcmdpbi1sZWZ0XCJdIHx8IDAsIDApICogZm9udFRvVW5pdFJhdGlvOyAvL21vdmUgdGhlIGN1cnNvclxuXG4gICAgICAgIG91dChpbmRlbnRNb3ZlICsgaW5kZW50TW9yZSwgKC0xICogZGVmYXVsdEZvbnRTaXplICogbWF4TGluZUhlaWdodCkudG9GaXhlZCgyKSwgXCJUZFwiKTtcbiAgICAgICAgaSA9IDA7XG4gICAgICAgIGwgPSBsaW5lLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoaSAhPT0gbCkge1xuICAgICAgICAgIGlmIChsaW5lW2ldWzBdKSB7XG4gICAgICAgICAgICB0aGlzLlJlbmRlclRleHRGcmFnbWVudChsaW5lW2ldWzBdLCBsaW5lW2ldWzFdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnkgKz0gbWF4TGluZUhlaWdodCAqIGZvbnRUb1VuaXRSYXRpbzsgLy9pZiBzb21lIHdhdGNoZXIgZnVuY3Rpb24gd2FzIGV4ZWN1dGVkIHN1Y2Nlc3NmdWwsIHNvIGUuZy4gbWFyZ2luIGFuZCB3aWR0aHMgd2VyZSBjaGFuZ2VkLFxuICAgICAgICAvL3Jlc2V0IGxpbmUgZHJhd2luZyBhbmQgY2FsY3VsYXRlIHBvc2l0aW9uIGFuZCBsaW5lcyBhZ2FpblxuICAgICAgICAvL2UuZy4gdG8gc3RvcCB0ZXh0IGZsb2F0aW5nIGFyb3VuZCBhbiBpbWFnZVxuXG4gICAgICAgIGlmICh0aGlzLmV4ZWN1dGVXYXRjaEZ1bmN0aW9ucyhsaW5lWzBdWzFdKSAmJiBsaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFyIGxvY2FsRnJhZ21lbnRzID0gW107XG4gICAgICAgICAgdmFyIGxvY2FsU3R5bGVzID0gW107IC8vY3JlYXRlIGZyYWdtZW50IGFycmF5IG9mXG5cbiAgICAgICAgICBsaW5lcy5mb3JFYWNoKGZ1bmN0aW9uIChsb2NhbExpbmUpIHtcbiAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgIHZhciBsID0gbG9jYWxMaW5lLmxlbmd0aDtcblxuICAgICAgICAgICAgd2hpbGUgKGkgIT09IGwpIHtcbiAgICAgICAgICAgICAgaWYgKGxvY2FsTGluZVtpXVswXSkge1xuICAgICAgICAgICAgICAgIGxvY2FsRnJhZ21lbnRzLnB1c2gobG9jYWxMaW5lW2ldWzBdICsgJyAnKTtcbiAgICAgICAgICAgICAgICBsb2NhbFN0eWxlcy5wdXNoKGxvY2FsTGluZVtpXVsxXSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICArK2k7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7IC8vc3BsaXQgbGluZXMgYWdhaW4gZHVlIHRvIHBvc3NpYmxlIGNvb3JkaW5hdGUgY2hhbmdlc1xuXG4gICAgICAgICAgbGluZXMgPSB0aGlzLnNwbGl0RnJhZ21lbnRzSW50b0xpbmVzKFB1cmdlV2hpdGVTcGFjZShsb2NhbEZyYWdtZW50cyksIGxvY2FsU3R5bGVzKTsgLy9yZXBvc2l0aW9uIHRoZSBjdXJyZW50IGN1cnNvclxuXG4gICAgICAgICAgb3V0KFwiRVRcIiwgXCJRXCIpO1xuICAgICAgICAgIG91dChcInFcIiwgXCJCVCAwIGdcIiwgdGhpcy5wZGYuaW50ZXJuYWwuZ2V0Q29vcmRpbmF0ZVN0cmluZyh0aGlzLngpLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRWZXJ0aWNhbENvb3JkaW5hdGVTdHJpbmcodGhpcy55KSwgXCJUZFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2IgJiYgdHlwZW9mIGNiID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2IuY2FsbCh0aGlzLCB0aGlzLnggLSA5LCB0aGlzLnkgLSBmb250U2l6ZSAvIDIpO1xuICAgICAgfVxuXG4gICAgICBvdXQoXCJFVFwiLCBcIlFcIik7XG4gICAgICByZXR1cm4gdGhpcy55ICs9IHBhcmFncmFwaHNwYWNpbmdfYWZ0ZXI7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5zZXRCbG9ja0JvdW5kYXJ5ID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJQYXJhZ3JhcGgoY2IpO1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuc2V0QmxvY2tTdHlsZSA9IGZ1bmN0aW9uIChjc3MpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmFncmFwaC5ibG9ja3N0eWxlID0gY3NzO1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuYWRkVGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBjc3MpIHtcbiAgICAgIHRoaXMucGFyYWdyYXBoLnRleHQucHVzaCh0ZXh0KTtcbiAgICAgIHJldHVybiB0aGlzLnBhcmFncmFwaC5zdHlsZS5wdXNoKGNzcyk7XG4gICAgfTtcblxuICAgIEZvbnROYW1lREIgPSB7XG4gICAgICBoZWx2ZXRpY2E6IFwiaGVsdmV0aWNhXCIsXG4gICAgICBcInNhbnMtc2VyaWZcIjogXCJoZWx2ZXRpY2FcIixcbiAgICAgIFwidGltZXMgbmV3IHJvbWFuXCI6IFwidGltZXNcIixcbiAgICAgIHNlcmlmOiBcInRpbWVzXCIsXG4gICAgICB0aW1lczogXCJ0aW1lc1wiLFxuICAgICAgbW9ub3NwYWNlOiBcImNvdXJpZXJcIixcbiAgICAgIGNvdXJpZXI6IFwiY291cmllclwiXG4gICAgfTtcbiAgICBGb250V2VpZ2h0TWFwID0ge1xuICAgICAgMTAwOiBcIm5vcm1hbFwiLFxuICAgICAgMjAwOiBcIm5vcm1hbFwiLFxuICAgICAgMzAwOiBcIm5vcm1hbFwiLFxuICAgICAgNDAwOiBcIm5vcm1hbFwiLFxuICAgICAgNTAwOiBcImJvbGRcIixcbiAgICAgIDYwMDogXCJib2xkXCIsXG4gICAgICA3MDA6IFwiYm9sZFwiLFxuICAgICAgODAwOiBcImJvbGRcIixcbiAgICAgIDkwMDogXCJib2xkXCIsXG4gICAgICBub3JtYWw6IFwibm9ybWFsXCIsXG4gICAgICBib2xkOiBcImJvbGRcIixcbiAgICAgIGJvbGRlcjogXCJib2xkXCIsXG4gICAgICBsaWdodGVyOiBcIm5vcm1hbFwiXG4gICAgfTtcbiAgICBGb250U3R5bGVNYXAgPSB7XG4gICAgICBub3JtYWw6IFwibm9ybWFsXCIsXG4gICAgICBpdGFsaWM6IFwiaXRhbGljXCIsXG4gICAgICBvYmxpcXVlOiBcIml0YWxpY1wiXG4gICAgfTtcbiAgICBUZXh0QWxpZ25NYXAgPSB7XG4gICAgICBsZWZ0OiBcImxlZnRcIixcbiAgICAgIHJpZ2h0OiBcInJpZ2h0XCIsXG4gICAgICBjZW50ZXI6IFwiY2VudGVyXCIsXG4gICAgICBqdXN0aWZ5OiBcImp1c3RpZnlcIlxuICAgIH07XG4gICAgRmxvYXRNYXAgPSB7XG4gICAgICBub25lOiAnbm9uZScsXG4gICAgICByaWdodDogJ3JpZ2h0JyxcbiAgICAgIGxlZnQ6ICdsZWZ0J1xuICAgIH07XG4gICAgQ2xlYXJNYXAgPSB7XG4gICAgICBub25lOiAnbm9uZScsXG4gICAgICBib3RoOiAnYm90aCdcbiAgICB9O1xuICAgIFVuaXRlZE51bWJlck1hcCA9IHtcbiAgICAgIG5vcm1hbDogMVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgSFRNTC1mb3JtYXR0ZWQgdGV4dCBpbnRvIGZvcm1hdHRlZCBQREYgdGV4dC5cbiAgICAgKlxuICAgICAqIE5vdGVzOlxuICAgICAqIDIwMTItMDctMThcbiAgICAgKiBQbHVnaW4gcmVsaWVzIG9uIGhhdmluZyBicm93c2VyLCBET00gYXJvdW5kLiBUaGUgSFRNTCBpcyBwdXNoZWQgaW50byBkb20gYW5kIHRyYXZlcnNlZC5cbiAgICAgKiBQbHVnaW4gcmVsaWVzIG9uIGpRdWVyeSBmb3IgQ1NTIGV4dHJhY3Rpb24uXG4gICAgICogVGFyZ2V0aW5nIEhUTUwgb3V0cHV0IGZyb20gTWFya2Rvd24gdGVtcGxhdGluZywgd2hpY2ggaXMgYSB2ZXJ5IHNpbXBsZVxuICAgICAqIG1hcmt1cCAtIGRpdiwgc3BhbiwgZW0sIHN0cm9uZywgcC4gTm8gYnItYmFzZWQgcGFyYWdyYXBoIHNlcGFyYXRpb24gc3VwcG9ydGVkIGV4cGxpY2l0bHkgKGJ1dCBzdGlsbCBtYXkgd29yay4pXG4gICAgICogSW1hZ2VzLCB0YWJsZXMgYXJlIE5PVCBzdXBwb3J0ZWQuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIEhUTUwge1N0cmluZ3xPYmplY3R9IEhUTUwtZm9ybWF0dGVkIHRleHQsIG9yIHBvaW50ZXIgdG8gRE9NIGVsZW1lbnQgdGhhdCBpcyB0byBiZSByZW5kZXJlZCBpbnRvIFBERi5cbiAgICAgKiBAcGFyYW0geCB7TnVtYmVyfSBzdGFydGluZyBYIGNvb3JkaW5hdGUgaW4ganNQREYgaW5zdGFuY2UncyBkZWNsYXJlZCB1bml0cy5cbiAgICAgKiBAcGFyYW0geSB7TnVtYmVyfSBzdGFydGluZyBZIGNvb3JkaW5hdGUgaW4ganNQREYgaW5zdGFuY2UncyBkZWNsYXJlZCB1bml0cy5cbiAgICAgKiBAcGFyYW0gc2V0dGluZ3Mge09iamVjdH0gQWRkaXRpb25hbCAvIG9wdGlvbmFsIHZhcmlhYmxlcyBjb250cm9sbGluZyBwYXJzaW5nLCByZW5kZXJpbmcuXG4gICAgICogQHJldHVybnMge09iamVjdH0ganNQREYgaW5zdGFuY2VcbiAgICAgKi9cblxuICAgIGpzUERGQVBJLmZyb21IVE1MID0gZnVuY3Rpb24gKEhUTUwsIHgsIHksIHNldHRpbmdzLCBjYWxsYmFjaywgbWFyZ2lucykge1xuXG4gICAgICB0aGlzLm1hcmdpbnNfZG9jID0gbWFyZ2lucyB8fCB7XG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgYm90dG9tOiAwXG4gICAgICB9O1xuICAgICAgaWYgKCFzZXR0aW5ncykgc2V0dGluZ3MgPSB7fTtcbiAgICAgIGlmICghc2V0dGluZ3MuZWxlbWVudEhhbmRsZXJzKSBzZXR0aW5ncy5lbGVtZW50SGFuZGxlcnMgPSB7fTtcbiAgICAgIHJldHVybiBwcm9jZXNzKHRoaXMsIEhUTUwsIGlzTmFOKHgpID8gNCA6IHgsIGlzTmFOKHkpID8gNCA6IHksIHNldHRpbmdzLCBjYWxsYmFjayk7XG4gICAgfTtcbiAgfSkoanNwZGYuanNQREYuQVBJKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2pzcGRmX3BsdWdpbnMvZnJvbV9odG1sLmpzXG4vLyBtb2R1bGUgaWQgPSA2M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9
12196
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCA2ODE2NWQ1NDBhMjJjMTZmMjE5MiIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9oZWxwZXJzLnRzIiwid2VicGFjazovLy8uL3NyYy9oZWxwZXJfc3VydmV5LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcXVlc3Rpb24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZS50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wicm9vdFwiOlwiU3VydmV5XCIsXCJjb21tb25qczJcIjpcInN1cnZleS1jb3JlXCIsXCJjb21tb25qc1wiOlwic3VydmV5LWNvcmVcIixcImFtZFwiOlwic3VydmV5LWNvcmVcIn0iLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2JyaWNrLnRzIiwid2VicGFjazovLy8uL3NyYy9kb2NfY29udHJvbGxlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYWRpb2dyb3VwLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3N1cnZleS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfY2hlY2tpdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9lbXB0eS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGJvbGQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VudHJpZXMvcGRmLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3NlbGVjdGJhc2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3Jvd2xpbmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHRib3gudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcImpzcGRmXCIsXCJjb21tb25qczJcIjpcImpzcGRmXCIsXCJjb21tb25qc1wiOlwianNwZGZcIixcImFtZFwiOlwianNwZGZcIn0iLCJ3ZWJwYWNrOi8vLy4vc3JjL2V2ZW50X2hhbmRsZXIvZHJhd19jYW52YXMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2V2ZW50X2hhbmRsZXIvZXZlbnRfaGFuZGxlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9kZWZhdWx0LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X21hdHJpeG11bHRpcGxlLnRzIiwid2VicGFjazovLy8uL3NyYy9wYWdlX2xheW91dC9wYWdlX3BhY2tlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfYm9vbGVhbml0ZW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NoZWNrYm94aXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfY29tbWVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfZHJvcGRvd24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2h0bWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2ltYWdlLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9saW5rLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9yYWRpb2l0ZW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3JhbmtpbmdpdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0ZmllbGQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3RpdGxlcGFuZWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfYm9vbGVhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9jaGVja2JveC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9jb21tZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X2N1c3RvbV9tb2RlbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9kcm9wZG93bi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9leHByZXNzaW9uLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X2ZpbGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaHRtbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9pbWFnZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9pbWFnZXBpY2tlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXgudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4ZHluYW1pYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tdWx0aXBsZXRleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcGFuZWxkeW5hbWljLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3JhbmtpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcmF0aW5nLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3NpZ25hdHVyZXBhZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF90ZXh0Ym94LnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9jdXN0b20udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3N1cnZleS50cyIsIndlYnBhY2s6Ly8vLi9+L25vZGUtaW50ZXJ2YWwtdHJlZS9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9zaGFsbG93ZXF1YWwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NvbG9yZWRicmljay50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfZGVzY3JpcHRpb24udHMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvanNwZGZfcGx1Z2lucy9hY3JvZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvanNwZGZfcGx1Z2lucy9mcm9tX2h0bWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1EQUEyQyxjQUFjOztBQUV6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFB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SUFBSSxJQUFJO1lBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQUU7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUFFLENBQUMsQ0FBQztRQUNuRyxTQUFTLElBQUksQ0FBQyxNQUFXLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuSCxJQUFJLENBQUMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFSyxTQUFVLFdBQVcsQ0FBQyxPQUFZLEVBQUUsSUFBUztJQUMvQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWEsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFPLEVBQUUsRUFBRSxHQUFHLEVBQU8sRUFBRSxFQUFFLEVBQUUsQ0FBTSxFQUFFLENBQU0sRUFBRSxDQUFNLEVBQUUsQ0FBTSxDQUFDO0lBQy9JLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUs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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixnQ0FBZ0M7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQix5QkFBeUI7QUFDeEQ7QUFDQSxpRkFBaUY7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBLDBCQUEwQjtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUEsbUNBQW1DO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUNBQWlDLHNCQUFzQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxxQkFBcUI7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O0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLG9JQUFvSTtBQUNwSTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7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LFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0EseUpBQXlKO0FBQ3pKO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0EseUZBQXlGO0FBQ3pGO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLHlGQUF5RjtBQUN6RjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrREFBK0Q7QUFDL0Q7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLDZSQUE2UjtBQUM3UjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxxRzs7Ozs7OztBQzUyRkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjs7QUFFL0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNB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QUFPO0FBQ3hCLHdCQUF3QixPQUFPO0FBQy9CLGlCQUFpQixPQUFPO0FBQ3hCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHIiwiZmlsZSI6Ii4vcGFja2FnZXMvc3VydmV5LXBkZi9zdXJ2ZXkucGRmLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwic3VydmV5LWNvcmVcIiksIHJlcXVpcmUoXCJqc3BkZlwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcIlN1cnZleVBERlwiLCBbXCJzdXJ2ZXktY29yZVwiLCBcImpzcGRmXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlN1cnZleVBERlwiXSA9IGZhY3RvcnkocmVxdWlyZShcInN1cnZleS1jb3JlXCIpLCByZXF1aXJlKFwianNwZGZcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlN1cnZleVBERlwiXSA9IGZhY3Rvcnkocm9vdFtcIlN1cnZleVwiXSwgcm9vdFtcImpzcGRmXCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfNl9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzE4X18pIHtcbnJldHVybiBcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMTQpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDY4MTY1ZDU0MGEyMmMxNmYyMTkyIiwiZGVjbGFyZSB2YXIgUmVmbGVjdDogYW55O1xuXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQ6IGFueSwgYjogYW55KTogYW55IHtcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQ6IGFueSwgYjogYW55KSB7XG4gICAgaWYgKHR5cGVvZiBiICE9PSAnZnVuY3Rpb24nICYmIGIgIT09IG51bGwpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NsYXNzIGV4dGVuZHMgdmFsdWUgJyArIFN0cmluZyhiKSArICcgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbCcpO1xuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59XG5cbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcbiAgICBfX2Fzc2lnbiA9ICg8YW55Pk9iamVjdCkuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQ6IGFueSkge1xuICAgICAgICBmb3IgKHZhciBzOiBhbnksIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QoczogYW55LCBlOiBhbnkpIHtcbiAgICB2YXIgdDogYW55ID0ge307XG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICAgIHRbcF0gPSBzW3BdO1xuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBxID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocVtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBxW2ldKSlcbiAgICAgICAgICAgICAgICB0W3FbaV1dID0gc1txW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzOiBhbnksIHRhcmdldDogYW55LCBrZXk6IGFueSwgZGVzYzogYW55KSB7XG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSAnZnVuY3Rpb24nKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbmQtYXNzaWduXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmc6IGFueSwgX2FyZ3VtZW50czogYW55LCBQOiBhbnksIGdlbmVyYXRvcjogYW55KSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWU6IGFueSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZTogYW55KSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmU6IGFueSwgcmVqZWN0OiBhbnkpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlOiBhbnkpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlOiBhbnkpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbJ3Rocm93J10odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdDogYW55KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmc6IGFueSwgYm9keTogYW55KSB7XG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogPGFueT5bXSwgb3BzOiA8YW55PltdIH0sIGY6IGFueSwgeTogYW55LCB0OiBhbnksIGc6IGFueTtcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgJ3Rocm93JzogdmVyYigxKSwgJ3JldHVybic6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG46IGFueSkgeyByZXR1cm4gZnVuY3Rpb24gKHY6IGFueSkgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gICAgZnVuY3Rpb24gc3RlcChvcDogYW55KSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuJyk7XG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVsncmV0dXJuJ10gOiBvcFswXSA/IHlbJ3Rocm93J10gfHwgKCh0ID0geVsncmV0dXJuJ10pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyAoPGFueT5fKSA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkgKHRvOiBhbnksIGZyb206IGFueSwgcGFjazogYW55KSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI6IGFueTsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9lbnRyaWVzL2hlbHBlcnMudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uLCBRdWVzdGlvblJhdGluZ01vZGVsLCBRdWVzdGlvbkZpbGVNb2RlbCwgTG9jYWxpemFibGVTdHJpbmcsIFF1ZXN0aW9uU2VsZWN0QmFzZSwgUXVlc3Rpb25Ecm9wZG93bk1vZGVsLCBzZXR0aW5ncyB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCAqIGFzIFN1cnZleVBERk1vZHVsZSBmcm9tICcuL2VudHJpZXMvcGRmJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIElTaXplLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9sYXlvdXQvZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfbGF5b3V0L2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgSUhUTUxSZW5kZXJUeXBlIH0gZnJvbSAnLi9mbGF0X2xheW91dC9mbGF0X2h0bWwnO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IFRleHRCb2xkQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX3RleHRib2xkJztcbmltcG9ydCB7IFRpdGxlUGFuZWxCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfdGl0bGVwYW5lbCc7XG5pbXBvcnQgeyBEZXNjcmlwdGlvbkJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9kZXNjcmlwdGlvbic7XG5pbXBvcnQgeyBDb21tZW50QnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2NvbW1lbnQnO1xuaW1wb3J0IHsgTGlua0JyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9saW5rJztcbmltcG9ydCB7IEhUTUxCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfaHRtbCc7XG5pbXBvcnQgeyBJbWFnZUJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9pbWFnZSc7XG5pbXBvcnQgeyBFbXB0eUJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9lbXB0eSc7XG5pbXBvcnQgeyBSb3dsaW5lQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX3Jvd2xpbmUnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBBZG9ybmVyc09wdGlvbnMgfSBmcm9tICcuL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMnO1xuXG5leHBvcnQgdHlwZSBJQm9yZGVyRGVzY3JpcHRpb24gPSBJUmVjdCAmIElTaXplICYgUGljazxQZGZCcmljaywgJ2Zvcm1Cb3JkZXJDb2xvcic+ICYgeyByb3VuZGVkPzogYm9vbGVhbiwgZGFzaFN0eWxlPzogeyBkYXNoQXJyYXk6IFtudW1iZXIsIG51bWJlcl0gfCBbbnVtYmVyXSwgZGFzaFBoYXNlOiBudW1iZXIgfSwgb3V0c2lkZT86IGJvb2xlYW4gfTtcblxuZXhwb3J0IGNsYXNzIFN1cnZleUhlbHBlciB7XG4gICAgcHVibGljIHN0YXRpYyBFUFNJTE9OOiBudW1iZXIgPSAyLjIyMDQ0NjA0OTI1MDMxMzA4MDg0NzI2MzMzNjE4MTZlLTE1O1xuICAgIHB1YmxpYyBzdGF0aWMgVElUTEVfU1VSVkVZX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS43O1xuICAgIHB1YmxpYyBzdGF0aWMgVElUTEVfUEFHRV9GT05UX1NJWkVfU0NBTEU6IG51bWJlciA9IDEuMztcbiAgICBwdWJsaWMgc3RhdGljIFRJVExFX1BBTkVMX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS4zO1xuICAgIHB1YmxpYyBzdGF0aWMgREVTQ1JJUFRJT05fRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAyLjAgLyAzLjA7XG4gICAgcHVibGljIHN0YXRpYyBPVEhFUl9ST1dTX0NPVU5UOiBudW1iZXIgPSAyO1xuICAgIHB1YmxpYyBzdGF0aWMgUkFUSU5HX01JTl9XSURUSDogbnVtYmVyID0gMztcbiAgICBwdWJsaWMgc3RhdGljIFJBVElOR19NSU5fSEVJR0hUOiBudW1iZXIgPSAyO1xuICAgIHB1YmxpYyBzdGF0aWMgUkFUSU5HX0NPTFVNTl9XSURUSDogbnVtYmVyID0gNTtcbiAgICBwdWJsaWMgc3RhdGljIE1BVFJJWF9DT0xVTU5fV0lEVEg6IG51bWJlciA9IDU7XG4gICAgcHVibGljIHN0YXRpYyBJTUFHRVBJQ0tFUl9DT1VOVDogbnVtYmVyID0gNDtcbiAgICBwdWJsaWMgc3RhdGljIElNQUdFUElDS0VSX1JBVElPOiBudW1iZXIgPSA0LjAgLyAzLjA7XG4gICAgcHVibGljIHN0YXRpYyBNVUxUSVBMRVRFWFRfVEVYVF9QRVJTOiBudW1iZXIgPSBNYXRoLkUgLyAxMC4wO1xuICAgIHB1YmxpYyBzdGF0aWMgSFRNTF9UQUlMX1RFWFRfU0NBTEU6IG51bWJlciA9IDAuMjQ7XG4gICAgcHVibGljIHN0YXRpYyBTRUxFQ1RfSVRFTV9GTEFUX1NDQUxFOiBudW1iZXIgPSAwLjk1O1xuICAgIHB1YmxpYyBzdGF0aWMgR0FQX0JFVFdFRU5fUk9XUzogbnVtYmVyID0gMC4yNTtcbiAgICBwdWJsaWMgc3RhdGljIEdBUF9CRVRXRUVOX0NPTFVNTlM6IG51bWJlciA9IDEuNTtcbiAgICBwdWJsaWMgc3RhdGljIEdBUF9CRVRXRUVOX0lURU1fVEVYVDogbnVtYmVyID0gMC4yNTtcbiAgICBwdWJsaWMgc3RhdGljIEZPUk1fQk9SREVSX1ZJU0lCTEU6IGJvb2xlYW4gPSB0cnVlO1xuICAgIHB1YmxpYyBzdGF0aWMgQk9SREVSX1NDQUxFOiBudW1iZXIgPSAwLjE7XG4gICAgcHVibGljIHN0YXRpYyBWSVNJQkxFX0JPUkRFUl9TQ0FMRTogbnVtYmVyID0gMC44O1xuICAgIHB1YmxpYyBzdGF0aWMgVU5WSVNJQkxFX0JPUkRFUl9TQ0FMRTogbnVtYmVyID0gMC4yO1xuICAgIHB1YmxpYyBzdGF0aWMgUkFESVVTX1NDQUxFOiBudW1iZXIgPSAzLjA7XG4gICAgcHVibGljIHN0YXRpYyBUSVRMRV9GT05UX1NDQUxFOiBudW1iZXIgPSAxLjE7XG4gICAgcHVibGljIHN0YXRpYyBWQUxVRV9SRUFET05MWV9QQURESU5HX1NDQUxFOiBudW1iZXIgPSAwLjM7XG4gICAgcHVibGljIHN0YXRpYyBIVE1MX1RPX0lNQUdFX1FVQUxJVFk6IG51bWJlciA9IDEuMDtcbiAgICBwdWJsaWMgc3RhdGljIEZPUk1fQk9SREVSX0NPTE9SOiBzdHJpbmcgPSAnIzlmOWY5Zic7XG4gICAgcHVibGljIHN0YXRpYyBURVhUX0NPTE9SOiBzdHJpbmcgPSAnIzQwNDA0MCc7XG4gICAgcHVibGljIHN0YXRpYyBCQUNLR1JPVU5EX0NPTE9SOiBzdHJpbmcgPSAnI0ZGRkZGRic7XG4gICAgcHVibGljIHN0YXRpYyBUSVRMRV9MT0NBVElPTl9NQVRSSVg6IHN0cmluZyA9ICdtYXRyaXgnO1xuICAgIHB1YmxpYyBzdGF0aWMgU1RBTkRBUkRfRk9OVDogc3RyaW5nID0gJ2hlbHZldGljYSc7XG4gICAgcHVibGljIHN0YXRpYyBDVVNUT01fRk9OVF9FTkNPRElORzogc3RyaW5nID0gJ0lkZW50aXR5LUgnO1xuXG4gICAgcHVibGljIHN0YXRpYyBwYXJzZVdpZHRoKHdpZHRoOiBzdHJpbmcsIG1heFdpZHRoOiBudW1iZXIsXG4gICAgICAgIGNvbHVtbnNDb3VudDogbnVtYmVyID0gMSwgZGVmYXVsdFVuaXQ/OiBzdHJpbmcpOiBudW1iZXIge1xuICAgICAgICBpZiAod2lkdGguaW5kZXhPZignY2FsYycpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF4V2lkdGggLyBjb2x1bW5zQ291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWU6IG51bWJlciA9IHBhcnNlRmxvYXQod2lkdGgpO1xuICAgICAgICBjb25zdCB1bml0OiBzdHJpbmcgPSB3aWR0aC5yZXBsYWNlKC9bXkEtWmEteiVdL2csICcnKSB8fCBkZWZhdWx0VW5pdDtcbiAgICAgICAgbGV0IGs6IG51bWJlcjtcbiAgICAgICAgc3dpdGNoICh1bml0KSB7XG4gICAgICAgICAgICBjYXNlICdwdCc6XG4gICAgICAgICAgICAgICAgayA9IDEuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICBrID0gNzIuMCAvIDI1LjQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjbSc6XG4gICAgICAgICAgICAgICAgayA9IDcyLjAgLyAyLjU0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaW4nOlxuICAgICAgICAgICAgICAgIGsgPSA3Mi4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncHgnOlxuICAgICAgICAgICAgICAgIGsgPSA3Mi4wIC8gOTYuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3BjJzpcbiAgICAgICAgICAgICAgICBrID0gMTIuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2VtJzpcbiAgICAgICAgICAgICAgICBrID0gMTIuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2V4JzpcbiAgICAgICAgICAgICAgICBrID0gNi4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNhc2UgJyUnOlxuICAgICAgICAgICAgICAgIGsgPSBtYXhXaWR0aCAvIDEwMC4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLm1pbih2YWx1ZSAqIGssIG1heFdpZHRoKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBweFRvUHQodmFsdWU6IG51bWJlciB8IHN0cmluZykge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYoIWlzTmFOKE51bWJlcih2YWx1ZSkpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gJ3B4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aCh2YWx1ZSwgTnVtYmVyLk1BWF9WQUxVRSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlICogNzIuMCAvIDk2LjA7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgbWVyZ2VSZWN0cyguLi5yZWN0czogSVJlY3RbXSk6IElSZWN0IHtcbiAgICAgICAgY29uc3QgcmVzdWx0UmVjdDogSVJlY3QgPSB7XG4gICAgICAgICAgICB4TGVmdDogcmVjdHNbMF0ueExlZnQsXG4gICAgICAgICAgICB4UmlnaHQ6IHJlY3RzWzBdLnhSaWdodCxcbiAgICAgICAgICAgIHlUb3A6IHJlY3RzWzBdLnlUb3AsXG4gICAgICAgICAgICB5Qm90OiByZWN0c1swXS55Qm90XG4gICAgICAgIH07XG4gICAgICAgIHJlY3RzLmZvckVhY2goKHJlY3Q6IElSZWN0KSA9PiB7XG4gICAgICAgICAgICByZXN1bHRSZWN0LnhMZWZ0ID0gTWF0aC5taW4ocmVzdWx0UmVjdC54TGVmdCwgcmVjdC54TGVmdCksXG4gICAgICAgICAgICByZXN1bHRSZWN0LnhSaWdodCA9IE1hdGgubWF4KHJlc3VsdFJlY3QueFJpZ2h0LCByZWN0LnhSaWdodCksXG4gICAgICAgICAgICByZXN1bHRSZWN0LnlUb3AgPSBNYXRoLm1pbihyZXN1bHRSZWN0LnlUb3AsIHJlY3QueVRvcCksXG4gICAgICAgICAgICByZXN1bHRSZWN0LnlCb3QgPSBNYXRoLm1heChyZXN1bHRSZWN0LnlCb3QsIHJlY3QueUJvdCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0UmVjdDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVQb2ludChyZWN0OiBJUmVjdCwgaXNMZWZ0OiBib29sZWFuID0gdHJ1ZSwgaXNUb3A6IGJvb2xlYW4gPSBmYWxzZSk6IElQb2ludCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogaXNMZWZ0ID8gcmVjdC54TGVmdCA6IHJlY3QueFJpZ2h0LFxuICAgICAgICAgICAgeVRvcDogaXNUb3AgPyByZWN0LnlUb3AgOiByZWN0LnlCb3RcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVSZWN0KHBvaW50OiBJUG9pbnQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogSVJlY3Qge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeExlZnQ6IHBvaW50LnhMZWZ0LFxuICAgICAgICAgICAgeFJpZ2h0OiBwb2ludC54TGVmdCArIHdpZHRoLFxuICAgICAgICAgICAgeVRvcDogcG9pbnQueVRvcCxcbiAgICAgICAgICAgIHlCb3Q6IHBvaW50LnlUb3AgKyBoZWlnaHRcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVIZWFkZXJSZWN0KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBJUmVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogMC4wLFxuICAgICAgICAgICAgeFJpZ2h0OiBjb250cm9sbGVyLnBhcGVyV2lkdGgsXG4gICAgICAgICAgICB5VG9wOiAwLjAsXG4gICAgICAgICAgICB5Qm90OiBjb250cm9sbGVyLm1hcmdpbnMudG9wXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlRm9vdGVyUmVjdChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogSVJlY3Qge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeExlZnQ6IDAuMCxcbiAgICAgICAgICAgIHhSaWdodDogY29udHJvbGxlci5wYXBlcldpZHRoLFxuICAgICAgICAgICAgeVRvcDogY29udHJvbGxlci5wYXBlckhlaWdodCAtIGNvbnRyb2xsZXIubWFyZ2lucy5ib3QsXG4gICAgICAgICAgICB5Qm90OiBjb250cm9sbGVyLnBhcGVySGVpZ2h0XG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY2hvb3NlSHRtbEZvbnQoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLnVzZUN1c3RvbUZvbnRJbkh0bWwgPyBjb250cm9sbGVyLmZvbnROYW1lIDogdGhpcy5TVEFOREFSRF9GT05UO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlQ3NzVGV4dFJ1bGUoZm9udFNpemU6IG51bWJlciwgZm9udFN0eWxlOiBzdHJpbmcsIGZvbnROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYFwiZm9udC1zaXplOiAke2ZvbnRTaXplfXB0OyBmb250LXdlaWdodDogJHtmb250U3R5bGV9OyBmb250LWZhbWlseTogJHtmb250TmFtZX07IGNvbG9yOiAke3RoaXMuVEVYVF9DT0xPUn07XCJgO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUh0bWxDb250YWluZXJCbG9jayhodG1sOiBzdHJpbmcsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlbmRlckFzOiBJSFRNTFJlbmRlclR5cGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBmb250ID0gdGhpcy5jaG9vc2VIdG1sRm9udChjb250cm9sbGVyKTtcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwiX19zdXJ2ZXlwZGZfaHRtbFwiIHN0eWxlPSR7dGhpcy5nZW5lcmF0ZUNzc1RleHRSdWxlKFxuICAgICAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSwgY29udHJvbGxlci5mb250U3R5bGUsIGZvbnQpfT5gICtcbiAgICAgICAgICAgIGA8c3R5bGU+Ll9fc3VydmV5cGRmX2h0bWwgcCB7IG1hcmdpbjogMDsgbGluZS1oZWlnaHQ6ICR7Y29udHJvbGxlci5mb250U2l6ZX1wdCB9IGJvZHkgeyBtYXJnaW46IDA7IH08L3N0eWxlPiR7aHRtbH08L2Rpdj5gO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHNwbGl0SHRtbFJlY3QoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgaHRtbEJyaWNrOiBJUGRmQnJpY2spOiBJUGRmQnJpY2sge1xuICAgICAgICBjb25zdCBicmlja3M6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IGh0bWxIZWlnaHQ6IG51bWJlciA9IGh0bWxCcmljay5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IG1pbkhlaWdodDogbnVtYmVyID0gY29udHJvbGxlci5kb2MuZ2V0Rm9udFNpemUoKTtcbiAgICAgICAgaHRtbEJyaWNrLnlCb3QgPSBodG1sQnJpY2sueVRvcCArIG1pbkhlaWdodDtcbiAgICAgICAgY29uc3QgZW1wdHlCcmlja0NvdW50OiBudW1iZXIgPSBNYXRoLmZsb29yKGh0bWxIZWlnaHQgLyBtaW5IZWlnaHQpIC0gMTtcbiAgICAgICAgYnJpY2tzLnB1c2goaHRtbEJyaWNrKTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSB0aGlzLmNyZWF0ZVBvaW50KGh0bWxCcmljayk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBlbXB0eUJyaWNrQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgYnJpY2tzLnB1c2gobmV3IEVtcHR5QnJpY2sodGhpcy5jcmVhdGVSZWN0KGN1cnJQb2ludCwgaHRtbEJyaWNrLndpZHRoLCBtaW5IZWlnaHQpKSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBtaW5IZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVtYWluaW5nSGVpZ2h0OiBudW1iZXIgPSBodG1sSGVpZ2h0IC0gKGVtcHR5QnJpY2tDb3VudCArIDEpICogbWluSGVpZ2h0O1xuICAgICAgICBpZiAocmVtYWluaW5nSGVpZ2h0ID4gMCkge1xuICAgICAgICAgICAgYnJpY2tzLnB1c2gobmV3IEVtcHR5QnJpY2sodGhpcy5jcmVhdGVSZWN0KGN1cnJQb2ludCwgaHRtbEJyaWNrLndpZHRoLCByZW1haW5pbmdIZWlnaHQpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVCcmljayguLi5icmlja3MpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVBsYWluVGV4dEZsYXQ8VCBleHRlbmRzIElQZGZCcmljaz4ocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgdGV4dDogc3RyaW5nLCBmYWJyaWM6IG5ldyAocXVlc3Rpb246IElRdWVzdGlvbixcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlY3Q6IElSZWN0LCB0ZXh0OiBzdHJpbmcpID0+IFQpOiBDb21wb3NpdGVCcmljayB7XG4gICAgICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IGNvbnRyb2xsZXIuZG9jLnNwbGl0VGV4dFRvU2l6ZSh0ZXh0LFxuICAgICAgICAgICAgY29udHJvbGxlci5wYXBlcldpZHRoIC0gY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0IC0gcG9pbnQueExlZnQpO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IHRoaXMuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGxpbmVzLmZvckVhY2goKGxpbmU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZTogSVNpemUgPSBjb250cm9sbGVyLm1lYXN1cmVUZXh0KGxpbmUpO1xuICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKG5ldyBmYWJyaWMocXVlc3Rpb24sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVSZWN0KGN1cnJQb2ludCwgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpLCBsaW5lKSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBzaXplLmhlaWdodDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlVGV4dEZsYXQ8VCBleHRlbmRzIElQZGZCcmljaz4ocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgdGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcsIGZhYnJpYzogbmV3IChxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVjdDogSVJlY3QsIHRleHQ6IHN0cmluZykgPT4gVCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycgfHwgIXRoaXMuaGFzSHRtbCh0ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUGxhaW5UZXh0RmxhdChwb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgICAgICAgdGV4dCA6IHRoaXMuZ2V0TG9jU3RyaW5nKDxMb2NhbGl6YWJsZVN0cmluZz50ZXh0KSwgZmFicmljKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNwbGl0SHRtbFJlY3QoY29udHJvbGxlciwgYXdhaXQgdGhpcy5jcmVhdGVIVE1MRmxhdChwb2ludCwgPFF1ZXN0aW9uPnF1ZXN0aW9uLCBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlSHRtbENvbnRhaW5lckJsb2NrKHRoaXMuZ2V0TG9jU3RyaW5nKHRleHQpLCBjb250cm9sbGVyLCAnc3RhbmRhcmQnKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIGhhc0h0bWwodGV4dDogTG9jYWxpemFibGVTdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgcGF0dGVybjogUmVnRXhwID0gLzxcXC8/W2Etel1bXFxzXFxTXSo+L2k7XG4gICAgICAgIHJldHVybiB0ZXh0Lmhhc0h0bWwgJiYgKHBhdHRlcm4udGVzdCgoPGFueT50ZXh0KS5yZW5kZXJlZFRleHQpIHx8IHBhdHRlcm4udGVzdCh0ZXh0LnJlbmRlcmVkSHRtbCkpO1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRIdG1sTWFyZ2lucyhjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBwb2ludDogSVBvaW50KTogeyB0b3A6IG51bWJlciwgYm90dG9tOiBudW1iZXIsIHdpZHRoOiBudW1iZXIgfSB7XG4gICAgICAgIGNvbnN0IHdpZHRoOiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBwb2ludC54TGVmdCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvcDogY29udHJvbGxlci5tYXJnaW5zLnRvcCxcbiAgICAgICAgICAgIGJvdHRvbTogY29udHJvbGxlci5tYXJnaW5zLmJvdCxcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aCA+IGNvbnRyb2xsZXIudW5pdFdpZHRoID8gd2lkdGggOiBjb250cm9sbGVyLnVuaXRXaWR0aFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlSFRNTFJlY3QocG9pbnQ6IElQb2ludCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgbWFyZ2luczogeyB0b3A6IG51bWJlciwgYm90dG9tOiBudW1iZXIsIHdpZHRoOiBudW1iZXIgfSwgcmVzdWx0WTogbnVtYmVyKTogSVJlY3Qge1xuICAgICAgICBjb25zdCBhdmFpbGFibGVQYWdlSGVpZ2h0OiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVySGVpZ2h0IC0gY29udHJvbGxlci5tYXJnaW5zLmJvdCAtIGNvbnRyb2xsZXIubWFyZ2lucy50b3A7XG4gICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gKGNvbnRyb2xsZXIuaGVscGVyRG9jLmdldE51bWJlck9mUGFnZXMoKSAtIDEpICpcbiAgICAgICAgICAgIChjb250cm9sbGVyLmZvbnRTaXplICogTWF0aC5mbG9vcihhdmFpbGFibGVQYWdlSGVpZ2h0IC8gY29udHJvbGxlci5mb250U2l6ZSkpXG4gICAgICAgICAgICArIHJlc3VsdFkgLSBtYXJnaW5zLnRvcCArIFN1cnZleUhlbHBlci5IVE1MX1RBSUxfVEVYVF9TQ0FMRSAqIGNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIGNvbnN0IG51bWJlck9mUGFnZXM6IG51bWJlciA9IGNvbnRyb2xsZXIuaGVscGVyRG9jLmdldE51bWJlck9mUGFnZXMoKTtcbiAgICAgICAgY29udHJvbGxlci5oZWxwZXJEb2MuYWRkUGFnZSgpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgbnVtYmVyT2ZQYWdlczsgaSsrKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmhlbHBlckRvYy5kZWxldGVQYWdlKDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChwb2ludCwgbWFyZ2lucy53aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZUhUTUxGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgaHRtbDogc3RyaW5nKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgbWFyZ2luczogeyB0b3A6IG51bWJlciwgYm90dG9tOiBudW1iZXIsIHdpZHRoOiBudW1iZXIgfSA9IHRoaXMuZ2V0SHRtbE1hcmdpbnMoY29udHJvbGxlciwgcG9pbnQpO1xuICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8SVBkZkJyaWNrPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgY29udHJvbGxlci5oZWxwZXJEb2MuZnJvbUhUTUwoaHRtbCwgcG9pbnQueExlZnQsIG1hcmdpbnMudG9wLCB7XG4gICAgICAgICAgICAgICAgcGFnZXNwbGl0OiB0cnVlLCB3aWR0aDogbWFyZ2lucy53aWR0aFxuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHJlc3VsdDogYW55KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlSFRNTFJlY3QocG9pbnQsIGNvbnRyb2xsZXIsIG1hcmdpbnMsIHJlc3VsdC55KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBIVE1MQnJpY2socXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIGh0bWwpKTtcbiAgICAgICAgICAgIH0sIG1hcmdpbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZUZvbnRGYWNlKGZvbnROYW1lOiBzdHJpbmcsIGZvbnRCYXNlNjQ6IHN0cmluZywgZm9udFdlaWdodDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBgQGZvbnQtZmFjZSB7IGZvbnQtZmFtaWx5OiAke2ZvbnROYW1lfTsgYCArXG4gICAgICAgICAgICBgc3JjOiB1cmwoZGF0YTphcHBsaWNhdGlvbi9mb250LXdvZmY7Y2hhcnNldD11dGYtODtiYXNlNjQsJHtmb250QmFzZTY0fSkgZm9ybWF0KCd3b2ZmJyk7IGAgK1xuICAgICAgICAgICAgYGZvbnQtd2VpZ2h0OiAke2ZvbnRXZWlnaHR9OyB9YDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZUZvbnRGYWNlV2l0aEl0YWxpY1N0eWxlKGZvbnROYW1lOiBzdHJpbmcsIGZvbnRCYXNlNjQ6IHN0cmluZywgZm9udFdlaWdodDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBgQGZvbnQtZmFjZSB7IGZvbnQtZmFtaWx5OiAke2ZvbnROYW1lfTsgYCArXG4gICAgICAgICAgICBgc3JjOiB1cmwoZGF0YTphcHBsaWNhdGlvbi9mb250LXdvZmY7Y2hhcnNldD11dGYtODtiYXNlNjQsJHtmb250QmFzZTY0fSkgZm9ybWF0KCd3b2ZmJyk7IGAgK1xuICAgICAgICAgICAgYGZvbnQtd2VpZ2h0OiAke2ZvbnRXZWlnaHR9OyBmb250LXN0eWxlOiBpdGFsaWN9YDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBodG1sVG9YbWwoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgaHRtbERvYzogRG9jdW1lbnQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoJycpO1xuICAgICAgICBodG1sRG9jLndyaXRlKGh0bWwucmVwbGFjZSgvXFwjL2csICclMjMnKSk7XG4gICAgICAgIGh0bWxEb2MuZG9jdW1lbnRFbGVtZW50LnNldEF0dHJpYnV0ZSgneG1sbnMnLCBodG1sRG9jLmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkpO1xuICAgICAgICBodG1sRG9jLmJvZHkuc3R5bGUubWFyZ2luID0gJ3Vuc2V0JztcbiAgICAgICAgcmV0dXJuIChuZXcgWE1MU2VyaWFsaXplcigpKS5zZXJpYWxpemVUb1N0cmluZyhodG1sRG9jLmJvZHkpLnJlcGxhY2UoLyUyMy9nLCAnIycpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVN2Z0NvbnRlbnQoaHRtbDogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnN0IHN0eWxlOiBIVE1MU3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgc3R5bGUuaW5uZXJIVE1MID0gJy5fX3N1cnZleXBkZl9odG1sIHAgeyBtYXJnaW46IHVuc2V0OyBsaW5lLWhlaWdodDogMjJweDsgfSBib2R5IHsgbWFyZ2luOiB1bnNldDsgfSc7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgICAgICBjb25zdCBkaXY6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGRpdi5jbGFzc05hbWUgPSAnX19zdXJ2ZXlwZGZfaHRtbCc7XG4gICAgICAgIGRpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgZGl2LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICAgICAgZGl2LnN0eWxlLnRvcCA9ICctMTAwMDBweCc7XG4gICAgICAgIGRpdi5zdHlsZS5sZWZ0ID0gJy0xMDAwMHB4JztcbiAgICAgICAgZGl2LnN0eWxlLndpZHRoID0gKHdpZHRoIC8gNzIuMCAqIDk2LjApICsgJ3B4JztcbiAgICAgICAgZGl2LnN0eWxlLmJveFNpemluZyA9ICdpbml0aWFsJztcbiAgICAgICAgZGl2LnN0eWxlLmNvbG9yID0gJ2luaXRpYWwnO1xuICAgICAgICBkaXYuc3R5bGUuZm9udEZhbWlseSA9ICdpbml0aWFsJztcbiAgICAgICAgZGl2LnN0eWxlLmZvbnQgPSAnaW5pdGlhbCc7XG4gICAgICAgIGRpdi5zdHlsZS5saW5lSGVpZ2h0ID0gJ2luaXRpYWwnO1xuICAgICAgICBkaXYuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1sKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpO1xuICAgICAgICBjb25zdCBkaXZXaWR0aDogbnVtYmVyID0gZGl2Lm9mZnNldFdpZHRoO1xuICAgICAgICBjb25zdCBkaXZIZWlnaHQ6IG51bWJlciA9IGRpdi5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIGRpdi5yZW1vdmUoKTtcbiAgICAgICAgc3R5bGUucmVtb3ZlKCk7XG4gICAgICAgIGxldCBkZWZzOiBzdHJpbmcgPSAnJztcbiAgICAgICAgaWYgKGNvbnRyb2xsZXIudXNlQ3VzdG9tRm9udEluSHRtbCkge1xuICAgICAgICAgICAgZGVmcyA9IGA8ZGVmcz48c3R5bGU+JHt0aGlzLmdlbmVyYXRlRm9udEZhY2UoY29udHJvbGxlci5mb250TmFtZSwgY29udHJvbGxlci5iYXNlNjROb3JtYWwsICdub3JtYWwnKX1gICtcbiAgICAgICAgICAgICAgICBgICR7dGhpcy5nZW5lcmF0ZUZvbnRGYWNlKGNvbnRyb2xsZXIuZm9udE5hbWUsIGNvbnRyb2xsZXIuYmFzZTY0Qm9sZCwgJ2JvbGQnKX08L3N0eWxlPjwvZGVmcz5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoRG9jQ29udHJvbGxlci5jdXN0b21Gb250cykuZm9yRWFjaChmb250TmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9udCA9IERvY0NvbnRyb2xsZXIuY3VzdG9tRm9udHNbZm9udE5hbWVdO1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGZvbnQpLmZvckVhY2goKGZvbnRTdHlsZTogJ25vcm1hbCcgfCAnYm9sZCcgfCAnaXRhbGljJyB8ICdib2xkaXRhbGljJykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm9udFN0eWxlID09PSAnbm9ybWFsJyB8fCBmb250U3R5bGUgPT09ICdib2xkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmcyArPSBgJHt0aGlzLmdlbmVyYXRlRm9udEZhY2UoZm9udE5hbWUsIGZvbnRbZm9udFN0eWxlXSwgZm9udFN0eWxlKX1gO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmcyArPSBgJHt0aGlzLmdlbmVyYXRlRm9udEZhY2VXaXRoSXRhbGljU3R5bGUoZm9udE5hbWUsIGZvbnRbZm9udFN0eWxlXSwgZm9udFN0eWxlID09PSAnaXRhbGljJyA/ICdub3JtYWwnIDogJ2JvbGQnKX1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZGVmcyA9ICc8ZGVmcz48c3R5bGU+JyArIGRlZnMgKyAnPC9zdHlsZT48L2RlZnM+JztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN2Zzogc3RyaW5nID0gYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiJHtkaXZXaWR0aH1weFwiIGhlaWdodD1cIiR7ZGl2SGVpZ2h0fXB4XCI+YCArIGRlZnMgK1xuICAgICAgICAgICAgJzxzdHlsZT4uX19zdXJ2ZXlwZGZfaHRtbCBwIHsgbWFyZ2luOiB1bnNldDsgbGluZS1oZWlnaHQ6IDIycHg7IH08L3N0eWxlPicgK1xuICAgICAgICAgICAgYDxmb3JlaWduT2JqZWN0IHdpZHRoPVwiJHtkaXZXaWR0aH1weFwiIGhlaWdodD1cIiR7ZGl2SGVpZ2h0fXB4XCI+YCArXG4gICAgICAgICAgICB0aGlzLmh0bWxUb1htbChodG1sKSArICc8L2ZvcmVpZ25PYmplY3Q+PC9zdmc+JztcbiAgICAgICAgcmV0dXJuIHsgc3ZnLCBkaXZXaWR0aCwgZGl2SGVpZ2h0IH07XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIHNldENhbnZhcyhjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCBkaXZXaWR0aDogbnVtYmVyLCBkaXZIZWlnaHQ6IG51bWJlciwgaW1nOiBIVE1MSW1hZ2VFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IGRpdldpZHRoICogU3VydmV5SGVscGVyLkhUTUxfVE9fSU1BR0VfUVVBTElUWTtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGRpdkhlaWdodCAqIFN1cnZleUhlbHBlci5IVE1MX1RPX0lNQUdFX1FVQUxJVFk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBjb250ZXh0LnNjYWxlKFN1cnZleUhlbHBlci5IVE1MX1RPX0lNQUdFX1FVQUxJVFksIFN1cnZleUhlbHBlci5IVE1MX1RPX0lNQUdFX1FVQUxJVFkpO1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IFN1cnZleUhlbHBlci5CQUNLR1JPVU5EX0NPTE9SO1xuICAgICAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIGRpdldpZHRoLCBkaXZIZWlnaHQpO1xuICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGh0bWxUb0ltYWdlKGh0bWw6IHN0cmluZywgd2lkdGg6IG51bWJlciwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IFByb21pc2U8eyB1cmw6IHN0cmluZywgYXNwZWN0OiBudW1iZXIgfT4ge1xuICAgICAgICBjb25zdCB7IHN2ZywgZGl2V2lkdGgsIGRpdkhlaWdodCB9ID0gU3VydmV5SGVscGVyLmNyZWF0ZVN2Z0NvbnRlbnQoaHRtbCwgd2lkdGgsIGNvbnRyb2xsZXIpO1xuICAgICAgICBjb25zdCBkYXRhOiBzdHJpbmcgPSAnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwnICsgYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3ZnKSkpO1xuICAgICAgICBjb25zdCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgaW1nLmNyb3NzT3JpZ2luPSdhbm9ueW1vdXMnO1xuICAgICAgICBpbWcuc3JjID0gZGF0YTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2V0Q2FudmFzKGNhbnZhcywgZGl2V2lkdGgsIGRpdkhlaWdodCwgaW1nKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmw6IHN0cmluZyA9IGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL2pwZWcnLCBTdXJ2ZXlIZWxwZXIuSFRNTF9UT19JTUFHRV9RVUFMSVRZKTtcbiAgICAgICAgICAgICAgICBjYW52YXMucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7IHVybDogdXJsLCBhc3BlY3Q6IGRpdldpZHRoIC8gZGl2SGVpZ2h0IH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGltZy5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoeyB1cmw6ICdkYXRhOiwnLCBhc3BlY3Q6IHdpZHRoIC8gdGhpcy5FUFNJTE9OIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlQm9sZFRleHRGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgdGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdib2xkJztcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgcG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLCB0ZXh0LCBUZXh0Qm9sZEJyaWNrKTtcbiAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnbm9ybWFsJztcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVUaXRsZUZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IFF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBsZXQgY3VyclBvaW50OiBJUG9pbnQgPSB0aGlzLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3Qgb2xkRm9udFNpemU6IG51bWJlciA9IGNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgKj0gdGhpcy5USVRMRV9GT05UX1NDQUxFO1xuICAgICAgICBpZiAocXVlc3Rpb24ubm8pIHtcbiAgICAgICAgICAgIGNvbnN0IG5vVGV4dDogc3RyaW5nID0gcXVlc3Rpb24ubm8gKyAnICc7XG4gICAgICAgICAgICBsZXQgbm9GbGF0OiBJUGRmQnJpY2s7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNIdG1sKHF1ZXN0aW9uLmxvY1RpdGxlKSkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ2JvbGQnO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbnRyb2xsZXIubWVhc3VyZVRleHQobm9UZXh0LCAnYm9sZCcpLndpZHRoO1xuICAgICAgICAgICAgICAgIG5vRmxhdCA9IGF3YWl0IHRoaXMuY3JlYXRlSFRNTEZsYXQoY3VyclBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVIdG1sQ29udGFpbmVyQmxvY2sobm9UZXh0LCBjb250cm9sbGVyLCAnc3RhbmRhcmQnKSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnbm9ybWFsJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vRmxhdCA9IGF3YWl0IHRoaXMuY3JlYXRlQm9sZFRleHRGbGF0KGN1cnJQb2ludCxcbiAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIG5vVGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2sobm9GbGF0KTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IG5vRmxhdC54UmlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IGN1cnJQb2ludC54TGVmdDtcbiAgICAgICAgY29uc3QgdGV4dEZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gPENvbXBvc2l0ZUJyaWNrPmF3YWl0IHRoaXMuY3JlYXRlQm9sZFRleHRGbGF0KFxuICAgICAgICAgICAgY3VyclBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlciwgcXVlc3Rpb24ubG9jVGl0bGUpO1xuICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2sodGV4dEZsYXQpO1xuICAgICAgICBjb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLmlzUmVxdWlyZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVpcmVkVGV4dDogc3RyaW5nID0gcXVlc3Rpb24ucmVxdWlyZWRUZXh0O1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzSHRtbChxdWVzdGlvbi5sb2NUaXRsZSkpIHtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQgPSB0aGlzLmNyZWF0ZVBvaW50KHRleHRGbGF0LnVuZm9sZCgpWzBdLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ2JvbGQnO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbnRyb2xsZXIubWVhc3VyZVRleHQocmVxdWlyZWRUZXh0LCAnYm9sZCcpLndpZHRoO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhhd2FpdCB0aGlzLmNyZWF0ZUhUTUxGbGF0KGN1cnJQb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlSHRtbENvbnRhaW5lckJsb2NrKHJlcXVpcmVkVGV4dCwgY29udHJvbGxlciwgJ3N0YW5kYXJkJykpKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50ID0gdGhpcy5jcmVhdGVQb2ludCh0ZXh0RmxhdC51bmZvbGQoKS5wb3AoKSwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhhd2FpdCB0aGlzLmNyZWF0ZUJvbGRUZXh0RmxhdChjdXJyUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZXF1aXJlZFRleHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIGNyZWF0ZVRpdGxlU3VydmV5UGFuZWxGbGF0KHBvaW50OiBJUG9pbnQsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHRleHQ6IHN0cmluZyB8IExvY2FsaXphYmxlU3RyaW5nLCBmb250U2l6ZVNjYWxlOiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplICogZm9udFNpemVTY2FsZTtcbiAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnYm9sZCc7XG4gICAgICAgIGNvbnN0IHRpdGxlRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5jcmVhdGVUZXh0RmxhdChwb2ludCwgbnVsbCwgY29udHJvbGxlciwgdGV4dCwgVGl0bGVQYW5lbEJyaWNrKTtcbiAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnbm9ybWFsJztcbiAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgICAgICByZXR1cm4gdGl0bGVGbGF0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZVRpdGxlU3VydmV5RmxhdChwb2ludDogSVBvaW50LCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICB0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZyk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZVRpdGxlU3VydmV5UGFuZWxGbGF0KHBvaW50LCBjb250cm9sbGVyLCB0ZXh0LCB0aGlzLlRJVExFX1NVUlZFWV9GT05UX1NJWkVfU0NBTEUpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZVRpdGxlUGFuZWxGbGF0KHBvaW50OiBJUG9pbnQsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHRleHQ6IHN0cmluZyB8IExvY2FsaXphYmxlU3RyaW5nLCBpc1BhZ2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZVRpdGxlU3VydmV5UGFuZWxGbGF0KHBvaW50LCBjb250cm9sbGVyLCB0ZXh0LFxuICAgICAgICAgICAgaXNQYWdlID8gdGhpcy5USVRMRV9QQUdFX0ZPTlRfU0laRV9TQ0FMRSA6IHRoaXMuVElUTEVfUEFORUxfRk9OVF9TSVpFX1NDQUxFKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVEZXNjRmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCB0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZyk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSBjb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKiB0aGlzLkRFU0NSSVBUSU9OX0ZPTlRfU0laRV9TQ0FMRTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgcG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLCB0ZXh0LCBEZXNjcmlwdGlvbkJyaWNrKTtcbiAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldFJlYWRvbmx5UmVuZGVyQXMocXVlc3Rpb246IFF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogJ2F1dG8nIHwgJ3RleHQnIHwgJ2Fjcm9mb3JtJyB7XG4gICAgICAgIHJldHVybiAoPGFueT5xdWVzdGlvbikucmVhZG9ubHlSZW5kZXJBcyA9PT0gJ2F1dG8nID8gY29udHJvbGxlci5yZWFkb25seVJlbmRlckFzIDogKDxhbnk+cXVlc3Rpb24pLnJlYWRvbmx5UmVuZGVyQXM7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlQ29tbWVudEZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBpc1F1ZXN0aW9uOiBib29sZWFuLCBvcHRpb25zOiB7IHJvd3M/OiBudW1iZXIsIGluZGV4PzogbnVtYmVyLCB2YWx1ZT86IHN0cmluZywgcmVhZE9ubHk/OiBib29sZWFuIH0gPSB7fSk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IHJlY3Q6IElSZWN0ID0gdGhpcy5jcmVhdGVUZXh0RmllbGRSZWN0KHBvaW50LCBjb250cm9sbGVyLCBvcHRpb25zLnJvd3MgPz8gMSk7XG4gICAgICAgIGxldCB0ZXh0RmxhdDtcbiAgICAgICAgaWYgKG9wdGlvbnMucmVhZE9ubHkgPz8gU3VydmV5SGVscGVyLnNob3VsZFJlbmRlclJlYWRPbmx5KHF1ZXN0aW9uLCBjb250cm9sbGVyKSkge1xuICAgICAgICAgICAgY29uc3QgcmVuZGVyZWRWYWx1ZSA9IG9wdGlvbnMudmFsdWUgPz8gdGhpcy5nZXRRdWVzdGlvbk9yQ29tbWVudFZhbHVlKHF1ZXN0aW9uLCBpc1F1ZXN0aW9uKTtcbiAgICAgICAgICAgIHRleHRGbGF0ID0gYXdhaXQgdGhpcy5jcmVhdGVSZWFkT25seVRleHRGaWVsZFRleHRGbGF0KFxuICAgICAgICAgICAgICAgIHBvaW50LCBjb250cm9sbGVyLCBxdWVzdGlvbiwgcmVuZGVyZWRWYWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBwYWRkaW5nOiBudW1iZXIgPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgKiB0aGlzLlZBTFVFX1JFQURPTkxZX1BBRERJTkdfU0NBTEU7XG4gICAgICAgICAgICBpZiAodGV4dEZsYXQueUJvdCArIHBhZGRpbmcgPiByZWN0LnlCb3QpIHJlY3QueUJvdCA9IHRleHRGbGF0LnlCb3QgKyBwYWRkaW5nO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbW1lbnQgPSBuZXcgQ29tbWVudEJyaWNrKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCBpc1F1ZXN0aW9uLCBvcHRpb25zLmluZGV4KTtcbiAgICAgICAgaWYob3B0aW9ucy5yZWFkT25seSAhPT0gbnVsbCAmJiBvcHRpb25zLnJlYWRPbmx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbW1lbnQuaXNSZWFkT25seSA9IG9wdGlvbnMucmVhZE9ubHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGV4dEZsYXQpIHtcbiAgICAgICAgICAgIGNvbW1lbnQudGV4dEJyaWNrID0gdGV4dEZsYXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbW1lbnQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UXVlc3Rpb25PckNvbW1lbnRWYWx1ZShxdWVzdGlvbjogUXVlc3Rpb24sIGlzUXVlc3Rpb246IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGlzUXVlc3Rpb24gPyAocXVlc3Rpb24udmFsdWUgIT09IHVuZGVmaW5lZCAmJiBxdWVzdGlvbi52YWx1ZSAhPT0gbnVsbCA/IHF1ZXN0aW9uLnZhbHVlIDogJycpIDpcbiAgICAgICAgICAgIChxdWVzdGlvbi5jb21tZW50ICE9PSB1bmRlZmluZWQgJiYgcXVlc3Rpb24uY29tbWVudCAhPT0gbnVsbCA/IHF1ZXN0aW9uLmNvbW1lbnQgOiAnJyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UXVlc3Rpb25PckNvbW1lbnREaXNwbGF5VmFsdWUocXVlc3Rpb246IFF1ZXN0aW9uLCBpc1F1ZXN0aW9uOiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpc1F1ZXN0aW9uID8gcXVlc3Rpb24uZGlzcGxheVZhbHVlIDogU3VydmV5SGVscGVyLmdldFF1ZXN0aW9uT3JDb21tZW50VmFsdWUocXVlc3Rpb24sIGlzUXVlc3Rpb24pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGluQnJvd3NlciA9IHR5cGVvZiBJbWFnZSA9PT0gJ2Z1bmN0aW9uJztcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGhhc0RvY3VtZW50KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGdldEltYWdlQmFzZTY0KGltYWdlTGluazogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgaW1hZ2UuY3Jvc3NPcmlnaW49J2Fub255bW91cyc7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbWFnZS5uYXR1cmFsSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IGltYWdlLm5hdHVyYWxXaWR0aDtcbiAgICAgICAgICAgICAgICBjdHguZHJhd0ltYWdlKGltYWdlLCAwLCAwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhVXJsID0gY2FudmFzLnRvRGF0YVVSTCgpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YVVybCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaW1hZ2Uub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCcnKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWFnZS5zcmMgPSBpbWFnZUxpbms7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHNob3VsZENvbnZlcnRJbWFnZVRvUG5nID0gdHJ1ZTtcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGdldEltYWdlTGluayhjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBpbWFnZU9wdGlvbnM6IHsgbGluazogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgb2JqZWN0Rml0Pzogc3RyaW5nIH0sIGFwcGx5SW1hZ2VGaXQ6IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBwdFRvUHg6IG51bWJlciA9IDk2LjAgLyA3Mi4wO1xuICAgICAgICBsZXQgdXJsID0gdGhpcy5zaG91bGRDb252ZXJ0SW1hZ2VUb1BuZyA/IGF3YWl0IFN1cnZleUhlbHBlci5nZXRJbWFnZUJhc2U2NChpbWFnZU9wdGlvbnMubGluaykgOiBpbWFnZU9wdGlvbnMubGluaztcbiAgICAgICAgaWYodHlwZW9mIFhNTFNlcmlhbGl6ZXIgPT09ICdmdW5jdGlvbicgJiYgYXBwbHlJbWFnZUZpdCkge1xuICAgICAgICAgICAgY29uc3QgY2FudmFzSHRtbDogc3RyaW5nID1cbiAgICAgICAgICAgICAgIGA8ZGl2IHN0eWxlPSdvdmVyZmxvdzogaGlkZGVuOyB3aWR0aDogJHtpbWFnZU9wdGlvbnMud2lkdGggKiBwdFRvUHh9cHg7IGhlaWdodDogJHtpbWFnZU9wdGlvbnMuaGVpZ2h0ICogcHRUb1B4fXB4Oyc+XG4gICAgICAgICAgICAgICAgICAgPGltZyBzcmM9JyR7dXJsfScgc3R5bGU9J29iamVjdC1maXQ6ICR7aW1hZ2VPcHRpb25zLm9iamVjdEZpdH07IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7Jy8+XG4gICAgICAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICAgICAgdXJsID0gKGF3YWl0IFN1cnZleUhlbHBlci5odG1sVG9JbWFnZShjYW52YXNIdG1sLCBpbWFnZU9wdGlvbnMud2lkdGgsIGNvbnRyb2xsZXIpKS51cmw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVJbWFnZUZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IGFueSxcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgaW1hZ2VPcHRpb25zOiB7IGxpbms6IHN0cmluZywgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIG9iamVjdEZpdD86IHN0cmluZyB9LCBhcHBseUltYWdlRml0PzogYm9vbGVhbik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGlmIChTdXJ2ZXlIZWxwZXIuaW5Ccm93c2VyKSB7XG4gICAgICAgICAgICBpbWFnZU9wdGlvbnMub2JqZWN0Rml0ID0gISFxdWVzdGlvbiAmJiAhIXF1ZXN0aW9uLmltYWdlRml0ID8gcXVlc3Rpb24uaW1hZ2VGaXQgOiAoaW1hZ2VPcHRpb25zLm9iamVjdEZpdCB8fCAnY29udGFpbicpO1xuICAgICAgICAgICAgaWYgKGFwcGx5SW1hZ2VGaXQgPz8gY29udHJvbGxlci5hcHBseUltYWdlRml0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGltYWdlT3B0aW9ucy53aWR0aCA+IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0IC0gY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1dpZHRoOiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodDtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VPcHRpb25zLmhlaWdodCAqPSBuZXdXaWR0aCAvIGltYWdlT3B0aW9ucy53aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VPcHRpb25zLndpZHRoID0gbmV3V2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaHRtbDogc3RyaW5nID0gYDxpbWcgc3JjPScke2F3YWl0IFN1cnZleUhlbHBlci5nZXRJbWFnZUxpbmsoY29udHJvbGxlciwgaW1hZ2VPcHRpb25zLCBhcHBseUltYWdlRml0ID8/IGNvbnRyb2xsZXIuYXBwbHlJbWFnZUZpdCl9JyB3aWR0aD0nJHtpbWFnZU9wdGlvbnMud2lkdGh9JyBoZWlnaHQ9JyR7aW1hZ2VPcHRpb25zLmhlaWdodH0nLz5gO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBIVE1MQnJpY2socXVlc3Rpb24sIGNvbnRyb2xsZXIsIHRoaXMuY3JlYXRlUmVjdChwb2ludCwgaW1hZ2VPcHRpb25zLndpZHRoLCBpbWFnZU9wdGlvbnMuaGVpZ2h0KSwgaHRtbCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBJbWFnZUJyaWNrKHF1ZXN0aW9uLCBjb250cm9sbGVyLCBpbWFnZU9wdGlvbnMubGluaywgcG9pbnQsIGltYWdlT3B0aW9ucy53aWR0aCwgaW1hZ2VPcHRpb25zLmhlaWdodCk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY2FuUHJldmlld0ltYWdlKHF1ZXN0aW9uOiBRdWVzdGlvbkZpbGVNb2RlbCwgaXRlbTogeyBuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgY29udGVudDogc3RyaW5nIH0sIHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBxdWVzdGlvbi5jYW5QcmV2aWV3SW1hZ2UoaXRlbSk7XG4gICAgICAgIC8vICAmJiAgYXdhaXQgdGhpcy5nZXRJbWFnZVNpemUodXJsKSAhPT0gbnVsbDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBnZXRJbWFnZVNpemUodXJsOiBzdHJpbmcpOiBQcm9taXNlPElTaXplPiB7XG4gICAgICAgIGlmICghU3VydmV5SGVscGVyLmluQnJvd3Nlcikge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoeyB3aWR0aDogdW5kZWZpbmVkLCBoZWlnaHQ6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW1hZ2U6IGFueSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICAgICAgaW1hZ2Uuc3JjID0gdXJsO1xuICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHsgd2lkdGg6IGltYWdlLndpZHRoLCBoZWlnaHQ6IGltYWdlLmhlaWdodCB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzb2x2ZShudWxsKTsgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlUm93bGluZUZsYXQocG9pbnQ6IElQb2ludCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgd2lkdGg/OiBudW1iZXIsIGNvbG9yPzogc3RyaW5nKTogSVBkZkJyaWNrIHtcbiAgICAgICAgbGV0IHhSaWdodDogbnVtYmVyID0gdHlwZW9mIHdpZHRoID09PSAndW5kZWZpbmVkJyA/XG4gICAgICAgICAgICBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgOlxuICAgICAgICAgICAgcG9pbnQueExlZnQgKyB3aWR0aDtcbiAgICAgICAgeFJpZ2h0ID0geFJpZ2h0ID4gcG9pbnQueExlZnQgPyB4UmlnaHQgOiBwb2ludC54TGVmdCArIHRoaXMuRVBTSUxPTjtcbiAgICAgICAgcmV0dXJuIG5ldyBSb3dsaW5lQnJpY2soY29udHJvbGxlciwge1xuICAgICAgICAgICAgeExlZnQ6IHBvaW50LnhMZWZ0LFxuICAgICAgICAgICAgeFJpZ2h0OiB4UmlnaHQsXG4gICAgICAgICAgICB5VG9wOiBwb2ludC55VG9wICsgdGhpcy5FUFNJTE9OLFxuICAgICAgICAgICAgeUJvdDogcG9pbnQueVRvcCArIHRoaXMuRVBTSUxPTlxuICAgICAgICB9LCB0eXBlb2YgY29sb3IgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IGNvbG9yKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVMaW5rRmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHRleHQ6IHN0cmluZywgbGluazogc3RyaW5nKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlVGV4dDogQ29tcG9zaXRlQnJpY2sgPSA8Q29tcG9zaXRlQnJpY2s+YXdhaXQgdGhpcy5cbiAgICAgICAgICAgIGNyZWF0ZVRleHRGbGF0KHBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlciwgdGV4dCwgVGV4dEJyaWNrKTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlTGluazogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29tcG9zaXRlVGV4dC51bmZvbGQoKS5mb3JFYWNoKCh0ZXh0OiBUZXh0QnJpY2spID0+IHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUxpbmsuYWRkQnJpY2sobmV3IExpbmtCcmljayh0ZXh0LCBsaW5rKSk7XG4gICAgICAgICAgICBjb25zdCBsaW5lUG9pbnQ6IElQb2ludCA9IHRoaXMuY3JlYXRlUG9pbnQoY29tcG9zaXRlTGluayk7XG4gICAgICAgICAgICBjb21wb3NpdGVMaW5rLmFkZEJyaWNrKHRoaXMuY3JlYXRlUm93bGluZUZsYXQobGluZVBvaW50LFxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIGNvbXBvc2l0ZUxpbmsud2lkdGgsIExpbmtCcmljay5DT0xPUikpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUxpbms7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlQWNyb2Zvcm1SZWN0KHJlY3Q6IElSZWN0KTogbnVtYmVyW10ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgcmVjdC54TGVmdCxcbiAgICAgICAgICAgIHJlY3QueVRvcCxcbiAgICAgICAgICAgIHJlY3QueFJpZ2h0IC0gcmVjdC54TGVmdCxcbiAgICAgICAgICAgIHJlY3QueUJvdCAtIHJlY3QueVRvcFxuICAgICAgICBdO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVRleHRGaWVsZFJlY3QocG9pbnQ6IElQb2ludCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgbGluZXM6IG51bWJlciA9IDEpOiBJUmVjdCB7XG4gICAgICAgIGxldCB3aWR0aDogbnVtYmVyID0gY29udHJvbGxlci5wYXBlcldpZHRoIC0gcG9pbnQueExlZnQgLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQ7XG4gICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGNvbnRyb2xsZXIudW5pdFdpZHRoKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgKiBsaW5lcztcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUmVjdChwb2ludCwgd2lkdGgsIGhlaWdodCk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlUmVhZE9ubHlUZXh0RmllbGRUZXh0RmxhdChwb2ludDogSVBvaW50LFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBxdWVzdGlvbjogUXVlc3Rpb24sIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBwYWRkaW5nOiBudW1iZXIgPSBjb250cm9sbGVyLnVuaXRXaWR0aCAqIHRoaXMuVkFMVUVfUkVBRE9OTFlfUEFERElOR19TQ0FMRTtcbiAgICAgICAgcG9pbnQueVRvcCArPSBwYWRkaW5nO1xuICAgICAgICBwb2ludC54TGVmdCArPSBwYWRkaW5nO1xuICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKHBvaW50LnhMZWZ0LCBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKyBwYWRkaW5nKTtcbiAgICAgICAgY29uc3QgdGV4dEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHZhbHVlLnRvU3RyaW5nKCksIFRleHRCcmljayk7XG4gICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICByZXR1cm4gdGV4dEZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgcmVuZGVyRmxhdEJvcmRlcnMoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgYm9yZGVyT3B0aW9uczogSUJvcmRlckRlc2NyaXB0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5GT1JNX0JPUkRFUl9WSVNJQkxFKSByZXR1cm47XG4gICAgICAgIGJvcmRlck9wdGlvbnMucm91bmRlZCA9IGJvcmRlck9wdGlvbnMucm91bmRlZCA/PyB0cnVlO1xuICAgICAgICBib3JkZXJPcHRpb25zLm91dHNpZGUgPSBib3JkZXJPcHRpb25zLm91dHNpZGUgPz8gZmFsc2U7XG4gICAgICAgIGNvbnN0IG1pblNpZGU6IG51bWJlciA9IE1hdGgubWluKGJvcmRlck9wdGlvbnMud2lkdGgsIGJvcmRlck9wdGlvbnMuaGVpZ2h0KTtcbiAgICAgICAgY29uc3QgYm9yZGVyV2lkdGggPSB0aGlzLmdldEJvcmRlcldpZHRoKGNvbnRyb2xsZXIpO1xuICAgICAgICBjb25zdCB2aXNpYmxlV2lkdGg6IG51bWJlciA9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIHRoaXMuVklTSUJMRV9CT1JERVJfU0NBTEUgKiB0aGlzLkJPUkRFUl9TQ0FMRTtcbiAgICAgICAgY29uc3QgdmlzaWJsZVNjYWxlOiBudW1iZXIgPSBib3JkZXJPcHRpb25zLm91dHNpZGUgPyAobWluU2lkZSArIGJvcmRlcldpZHRoKSAvIG1pblNpZGUgLSB2aXNpYmxlV2lkdGggLyBtaW5TaWRlIDogKG1pblNpZGUgLSBib3JkZXJXaWR0aCkgLyBtaW5TaWRlICsgdmlzaWJsZVdpZHRoIC8gbWluU2lkZTtcbiAgICAgICAgY29uc3Qgb2xkRHJhd0NvbG9yOiBzdHJpbmcgPSBjb250cm9sbGVyLmRvYy5nZXREcmF3Q29sb3IoKTtcbiAgICAgICAgY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKGJvcmRlck9wdGlvbnMuZm9ybUJvcmRlckNvbG9yKTtcbiAgICAgICAgY29udHJvbGxlci5kb2Muc2V0TGluZVdpZHRoKHZpc2libGVXaWR0aCk7XG4gICAgICAgIGNvbnN0IHNjYWxlZFJlY3QgPSB0aGlzLnNjYWxlUmVjdChib3JkZXJPcHRpb25zLCB2aXNpYmxlU2NhbGUpO1xuICAgICAgICBpZihib3JkZXJPcHRpb25zLmRhc2hTdHlsZSkge1xuICAgICAgICAgICAgY29uc3QgZGFzaFN0eWxlID0gYm9yZGVyT3B0aW9ucy5kYXNoU3R5bGU7XG4gICAgICAgICAgICBjb25zdCBib3JkZXJMZW5ndGggPSAoTWF0aC5hYnMoc2NhbGVkUmVjdC55VG9wIC0gc2NhbGVkUmVjdC55Qm90KSArIE1hdGguYWJzKHNjYWxlZFJlY3QueExlZnQgLSBzY2FsZWRSZWN0LnhSaWdodCkpICogMjtcbiAgICAgICAgICAgIGNvbnN0IGRhc2hXaXRoU3BhY2VTaXplID0gZGFzaFN0eWxlLmRhc2hBcnJheVswXSArIChkYXNoU3R5bGUuZGFzaEFycmF5WzFdID8/IGRhc2hTdHlsZS5kYXNoQXJyYXlbMF0pO1xuICAgICAgICAgICAgY29uc3QgZGFzaFNpemUgPSBkYXNoU3R5bGUuZGFzaEFycmF5WzBdICsgKGJvcmRlckxlbmd0aCAlIGRhc2hXaXRoU3BhY2VTaXplKSAvIE1hdGguZmxvb3IoYm9yZGVyTGVuZ3RoIC8gZGFzaFdpdGhTcGFjZVNpemUpO1xuXG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy5zZXRMaW5lRGFzaFBhdHRlcm4oXG4gICAgICAgICAgICAgICAgW2Rhc2hTaXplLCBkYXNoU3R5bGUuZGFzaEFycmF5WzFdID8/IGRhc2hTdHlsZS5kYXNoQXJyYXlbMF1dLFxuICAgICAgICAgICAgICAgIGRhc2hTdHlsZS5kYXNoUGhhc2VcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250cm9sbGVyLmRvYy5yZWN0KC4uLnRoaXMuY3JlYXRlQWNyb2Zvcm1SZWN0KHNjYWxlZFJlY3QpKTtcbiAgICAgICAgaWYoYm9yZGVyT3B0aW9ucy5yb3VuZGVkKSB7XG4gICAgICAgICAgICBjb25zdCB1bnZpc2libGVXaWR0aDogbnVtYmVyID0gY29udHJvbGxlci51bml0SGVpZ2h0ICogdGhpcy5VTlZJU0lCTEVfQk9SREVSX1NDQUxFICogdGhpcy5CT1JERVJfU0NBTEU7XG4gICAgICAgICAgICBjb25zdCB1bnZpc2libGVTY2FsZTogbnVtYmVyID0gMS4wIC0gdW52aXNpYmxlV2lkdGggLyBtaW5TaWRlO1xuICAgICAgICAgICAgY29uc3QgdW52aXNpYmxlUmFkaXVzOiBudW1iZXIgPSB0aGlzLlJBRElVU19TQ0FMRSAqIHVudmlzaWJsZVdpZHRoO1xuICAgICAgICAgICAgY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKHRoaXMuQkFDS0dST1VORF9DT0xPUik7XG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy5zZXRMaW5lV2lkdGgodW52aXNpYmxlV2lkdGgpO1xuICAgICAgICAgICAgY29udHJvbGxlci5kb2Mucm91bmRlZFJlY3QoLi4udGhpcy5jcmVhdGVBY3JvZm9ybVJlY3QoXG4gICAgICAgICAgICAgICAgdGhpcy5zY2FsZVJlY3QoYm9yZGVyT3B0aW9ucywgdW52aXNpYmxlU2NhbGUpKSwgdW52aXNpYmxlUmFkaXVzLCB1bnZpc2libGVSYWRpdXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmKGJvcmRlck9wdGlvbnMuZGFzaFN0eWxlKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy5zZXRMaW5lRGFzaFBhdHRlcm4oW10pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2xsZXIuZG9jLnNldERyYXdDb2xvcihvbGREcmF3Q29sb3IpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldExvY1N0cmluZyh0ZXh0OiBMb2NhbGl6YWJsZVN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmhhc0h0bWwodGV4dCkpIHJldHVybiB0ZXh0LnJlbmRlcmVkSHRtbDtcbiAgICAgICAgcmV0dXJuICg8YW55PnRleHQpLnJlbmRlcmVkVGV4dCB8fCB0ZXh0LnJlbmRlcmVkSHRtbDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXREcm9wZG93blF1ZXN0aW9uVmFsdWUocXVlc3Rpb246IFF1ZXN0aW9uKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcURyb3BEb3duOiBRdWVzdGlvbkRyb3Bkb3duTW9kZWwgPSA8UXVlc3Rpb25Ecm9wZG93bk1vZGVsPnF1ZXN0aW9uO1xuICAgICAgICBpZiAocURyb3BEb3duLmlzT3RoZXJTZWxlY3RlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHFEcm9wRG93bi5vdGhlclRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoISFxdWVzdGlvbi5kaXNwbGF5VmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWVzdGlvbi5kaXNwbGF5VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocURyb3BEb3duLnNob3dPcHRpb25zQ2FwdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHFEcm9wRG93bi5vcHRpb25zQ2FwdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29udGVudFF1ZXN0aW9uKHF1ZXN0aW9uOiBRdWVzdGlvbik6IFF1ZXN0aW9uIHtcbiAgICAgICAgcmV0dXJuICEhKDxhbnk+cXVlc3Rpb24pLmNvbnRlbnRRdWVzdGlvbiA/ICg8YW55PnF1ZXN0aW9uKS5jb250ZW50UXVlc3Rpb24gOiBxdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRDb250ZW50UXVlc3Rpb25UeXBlUmVuZGVyQXMocXVlc3Rpb246IFF1ZXN0aW9uLCBzdXJ2ZXk6IFN1cnZleVBERik6IHN0cmluZyB7XG4gICAgICAgIGxldCByZW5kZXJBcyA9IHF1ZXN0aW9uLnJlbmRlckFzO1xuICAgICAgICBpZihxdWVzdGlvbi5nZXRUeXBlKCkgPT09ICdib29sZWFuJyAmJiBzdXJ2ZXkub3B0aW9ucy51c2VMZWdhY3lCb29sZWFuUmVuZGVyaW5nKSB7XG4gICAgICAgICAgICByZW5kZXJBcyA9ICdjaGVja2JveCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYocmVuZGVyQXMgIT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IGAke3F1ZXN0aW9uLmdldFR5cGUoKX0tJHtyZW5kZXJBc31gO1xuICAgICAgICAgICAgaWYoRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5pc1R5cGVSZWdpc3RlcmVkKHR5cGUpKSByZXR1cm4gdHlwZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcXVlc3Rpb24uZ2V0VHlwZSgpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldENvbnRlbnRRdWVzdGlvblR5cGUocXVlc3Rpb246IFF1ZXN0aW9uLCBzdXJ2ZXk6IFN1cnZleVBERik6IHN0cmluZyB7XG4gICAgICAgIGlmKCEhcXVlc3Rpb24uY3VzdG9tV2lkZ2V0KSByZXR1cm4gcXVlc3Rpb24uY3VzdG9tV2lkZ2V0LnBkZlF1ZXN0aW9uVHlwZTtcbiAgICAgICAgcmV0dXJuICEhKDxhbnk+cXVlc3Rpb24pLmNvbnRlbnRRdWVzdGlvbiA/ICdjdXN0b21fbW9kZWwnIDogdGhpcy5nZXRDb250ZW50UXVlc3Rpb25UeXBlUmVuZGVyQXMocXVlc3Rpb24sIHN1cnZleSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmF0aW5nTWluV2lkdGgoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLm1lYXN1cmVUZXh0KHRoaXMuUkFUSU5HX01JTl9XSURUSCkud2lkdGg7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmF0aW5nSXRlbVRleHQocXVlc3Rpb246IFF1ZXN0aW9uUmF0aW5nTW9kZWwsXG4gICAgICAgIGluZGV4OiBudW1iZXIsIGxvY1RleHQ6IExvY2FsaXphYmxlU3RyaW5nKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgICAgICBjb25zdCByYXRpbmdJdGVtTG9jVGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSBuZXcgTG9jYWxpemFibGVTdHJpbmcobG9jVGV4dC5vd25lciwgbG9jVGV4dC51c2VNYXJrZG93bik7XG4gICAgICAgIHJhdGluZ0l0ZW1Mb2NUZXh0LnRleHQgPSB0aGlzLmdldExvY1N0cmluZyhsb2NUZXh0KTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwICYmIHF1ZXN0aW9uLm1pblJhdGVEZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgcmF0aW5nSXRlbUxvY1RleHQudGV4dCA9IHF1ZXN0aW9uLmxvY01pblJhdGVEZXNjcmlwdGlvbi50ZXh0ICsgJyAnICsgdGhpcy5nZXRMb2NTdHJpbmcobG9jVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW5kZXggPT09IHF1ZXN0aW9uLnZpc2libGVSYXRlVmFsdWVzLmxlbmd0aCAtIDEgJiYgcXVlc3Rpb24ubWF4UmF0ZURlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICByYXRpbmdJdGVtTG9jVGV4dC50ZXh0ID0gdGhpcy5nZXRMb2NTdHJpbmcobG9jVGV4dCkgKyAnICcgKyBxdWVzdGlvbi5sb2NNYXhSYXRlRGVzY3JpcHRpb24udGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmF0aW5nSXRlbUxvY1RleHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5wYXBlcldpZHRoIC0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW1hZ2VQaWNrZXJBdmFpbGFibGVXaWR0aChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9ICh0aGlzLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSAtXG4gICAgICAgICAgICAodGhpcy5JTUFHRVBJQ0tFUl9DT1VOVCAtIDEpICogY29udHJvbGxlci51bml0SGVpZ2h0KTtcbiAgICAgICAgcmV0dXJuIHdpZHRoID4gMCA/IHdpZHRoIDogY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldENvbHVtbldpZHRoKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGNvbENvdW50OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSAtIChjb2xDb3VudCAtIDEpICpcbiAgICAgICAgICAgIGNvbnRyb2xsZXIudW5pdFdpZHRoICogdGhpcy5HQVBfQkVUV0VFTl9DT0xVTU5TKSAvIGNvbENvdW50O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHNldENvbHVtbk1hcmdpbnMoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgY29sQ291bnQ6IG51bWJlciwgY29sdW1uOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgY2VsbFdpZHRoOiBudW1iZXIgPSB0aGlzLmdldENvbHVtbldpZHRoKGNvbnRyb2xsZXIsIGNvbENvdW50KTtcbiAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCArIGNvbHVtbiAqXG4gICAgICAgICAgICAoY2VsbFdpZHRoICsgY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLkdBUF9CRVRXRUVOX0NPTFVNTlMpO1xuICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKyAoY29sQ291bnQgLSBjb2x1bW4gLSAxKSAqXG4gICAgICAgICAgICAoY2VsbFdpZHRoICsgY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLkdBUF9CRVRXRUVOX0NPTFVNTlMpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIG1vdmVSZWN0KHJlY3Q6IElSZWN0LCBsZWZ0OiBudW1iZXIgPSByZWN0LnhMZWZ0LCB0b3A6IG51bWJlciA9IHJlY3QueVRvcCk6IElSZWN0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiBsZWZ0LFxuICAgICAgICAgICAgeVRvcDogdG9wLFxuICAgICAgICAgICAgeFJpZ2h0OiBsZWZ0ICsgcmVjdC54UmlnaHQgLSByZWN0LnhMZWZ0LFxuICAgICAgICAgICAgeUJvdDogdG9wICsgcmVjdC55Qm90IC0gcmVjdC55VG9wXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc2NhbGVSZWN0KHJlY3Q6IElSZWN0LCBzY2FsZTogbnVtYmVyKTogSVJlY3Qge1xuICAgICAgICBjb25zdCBzY2FsZVdpZHRoOiBudW1iZXIgPSBNYXRoLm1pbihyZWN0LnhSaWdodCAtIHJlY3QueExlZnQsIHJlY3QueUJvdCAtIHJlY3QueVRvcCkgKiAoMS4wIC0gc2NhbGUpIC8gMi4wO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeExlZnQ6IHJlY3QueExlZnQgKyBzY2FsZVdpZHRoLFxuICAgICAgICAgICAgeVRvcDogcmVjdC55VG9wICsgc2NhbGVXaWR0aCxcbiAgICAgICAgICAgIHhSaWdodDogcmVjdC54UmlnaHQgLSBzY2FsZVdpZHRoLFxuICAgICAgICAgICAgeUJvdDogcmVjdC55Qm90IC0gc2NhbGVXaWR0aFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldEJvcmRlcldpZHRoKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgcmV0dXJuIDIuMCAqIGNvbnRyb2xsZXIudW5pdFdpZHRoICogdGhpcy5CT1JERVJfU0NBTEU7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZm9ybVNjYWxlKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGZsYXQ6IElTaXplKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbWluU2lkZTogbnVtYmVyID0gTWF0aC5taW4oZmxhdC53aWR0aCwgZmxhdC5oZWlnaHQpO1xuICAgICAgICByZXR1cm4gKG1pblNpZGUgLSB0aGlzLmdldEJvcmRlcldpZHRoKGNvbnRyb2xsZXIpKSAvIG1pblNpZGU7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVRdWVzdGlvbkZsYXRzKHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBxdWVzdGlvbjogUXVlc3Rpb24sIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uVHlwZTogc3RyaW5nID0gdGhpcy5nZXRDb250ZW50UXVlc3Rpb25UeXBlKHF1ZXN0aW9uLCBzdXJ2ZXkpO1xuICAgICAgICBjb25zdCBmbGF0UXVlc3Rpb246IElGbGF0UXVlc3Rpb24gPSBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLlxuICAgICAgICAgICAgY3JlYXRlKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHF1ZXN0aW9uVHlwZSk7XG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uRmxhdHM6IElQZGZCcmlja1tdID0gYXdhaXQgZmxhdFF1ZXN0aW9uLmdlbmVyYXRlRmxhdHMocG9pbnQpO1xuICAgICAgICBjb25zdCBhZG9ybmVyc09wdGlvbnM6IEFkb3JuZXJzT3B0aW9ucyA9IG5ldyBBZG9ybmVyc09wdGlvbnMocG9pbnQsXG4gICAgICAgICAgICBxdWVzdGlvbkZsYXRzLCBxdWVzdGlvbiwgY29udHJvbGxlciwgRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKSwgU3VydmV5UERGTW9kdWxlKTtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLmN1c3RvbVdpZGdldCAmJiBxdWVzdGlvbi5jdXN0b21XaWRnZXQuaXNGaXQocXVlc3Rpb24pICYmXG4gICAgICAgICAgICBxdWVzdGlvbi5jdXN0b21XaWRnZXQucGRmUmVuZGVyKSB7XG4gICAgICAgICAgICBzdXJ2ZXkub25SZW5kZXJRdWVzdGlvbi51bnNoaWZ0KHF1ZXN0aW9uLmN1c3RvbVdpZGdldC5wZGZSZW5kZXIpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHN1cnZleS5vblJlbmRlclF1ZXN0aW9uLmZpcmUoc3VydmV5LCBhZG9ybmVyc09wdGlvbnMpO1xuICAgICAgICByZXR1cm4gWy4uLmFkb3JuZXJzT3B0aW9ucy5icmlja3NdO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzRm9udEV4aXN0KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGZvbnROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuZG9jLmludGVybmFsLmdldEZvbnQoZm9udE5hbWUpLmZvbnROYW1lID09PSBmb250TmFtZTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0N1c3RvbUZvbnQoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgZm9udE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5kb2MuaW50ZXJuYWwuZ2V0Rm9udChmb250TmFtZSkuZW5jb2RpbmcgPT09IHRoaXMuQ1VTVE9NX0ZPTlRfRU5DT0RJTkc7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZml4Rm9udChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzQ3VzdG9tRm9udChjb250cm9sbGVyLCBjb250cm9sbGVyLmZvbnROYW1lKSkge1xuICAgICAgICAgICAgY29udHJvbGxlci5kb2MudGV4dCgnbG9hZCBmb250JywgMCwgMCk7XG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy5kZWxldGVQYWdlKDEpO1xuICAgICAgICAgICAgY29udHJvbGxlci5hZGRQYWdlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjbG9uZShzcmM6IGFueSk6IGFueSB7XG4gICAgICAgIGNvbnN0IHRhcmdldDogYW55ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBzcmMpIHtcbiAgICAgICAgICAgIGlmIChzcmMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcF0gPSBzcmNbcHJvcF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBzaG91bGRSZW5kZXJSZWFkT25seShxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZWFkT25seT86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICgoISFxdWVzdGlvbiAmJiBxdWVzdGlvbi5pc1JlYWRPbmx5IHx8IHJlYWRPbmx5KSAmJiBTdXJ2ZXlIZWxwZXIuZ2V0UmVhZG9ubHlSZW5kZXJBcyhcbiAgICAgICAgICAgIDxRdWVzdGlvbj5xdWVzdGlvbiwgY29udHJvbGxlcikgIT09ICdhY3JvZm9ybScpIHx8IGNvbnRyb2xsZXI/LmNvbXByZXNzO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzU2l6ZUVtcHR5KHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdmFsIHx8IHZhbCA9PT0gJ2F1dG8nO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzSGVpZ2h0RW1wdHkodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTaXplRW1wdHkodmFsKSB8fCB2YWwgPT0gJzEwMCUnO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGdldENvcnJlY3RlZEltYWdlU2l6ZShjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBpbWFnZU9wdGlvbnM6IHsgaW1hZ2VXaWR0aD86IGFueSwgaW1hZ2VIZWlnaHQ/OiBhbnksIGltYWdlTGluazogc3RyaW5nLCBkZWZhdWx0SW1hZ2VXaWR0aD86IGFueSwgZGVmYXVsdEltYWdlSGVpZ2h0PzogYW55IH0pOiBQcm9taXNlPElTaXplPiB7XG4gICAgICAgIGxldCB7IGltYWdlV2lkdGgsIGltYWdlTGluaywgaW1hZ2VIZWlnaHQsIGRlZmF1bHRJbWFnZVdpZHRoLCBkZWZhdWx0SW1hZ2VIZWlnaHQgfSA9IGltYWdlT3B0aW9ucztcbiAgICAgICAgaW1hZ2VXaWR0aCA9IHR5cGVvZiBpbWFnZVdpZHRoID09PSAnbnVtYmVyJyA/IGltYWdlV2lkdGgudG9TdHJpbmcoKSA6IGltYWdlV2lkdGg7XG4gICAgICAgIGltYWdlSGVpZ2h0ID0gdHlwZW9mIGltYWdlSGVpZ2h0ID09PSAnbnVtYmVyJyA/IGltYWdlSGVpZ2h0LnRvU3RyaW5nKCkgOiBpbWFnZUhlaWdodDtcbiAgICAgICAgbGV0IHdpZHRoUHQ6IG51bWJlciA9IGltYWdlV2lkdGggJiYgU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoaW1hZ2VXaWR0aCwgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSwgMSwgJ3B4Jyk7XG4gICAgICAgIGxldCBoZWlnaHRQdDogbnVtYmVyID0gaW1hZ2VIZWlnaHQgJiYgU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoaW1hZ2VIZWlnaHQsIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlciksIDEsICdweCcpO1xuICAgICAgICBkZWZhdWx0SW1hZ2VXaWR0aCA9IHR5cGVvZiBkZWZhdWx0SW1hZ2VXaWR0aCA9PT0gJ251bWJlcicgPyBkZWZhdWx0SW1hZ2VXaWR0aC50b1N0cmluZygpIDogZGVmYXVsdEltYWdlV2lkdGg7XG4gICAgICAgIGRlZmF1bHRJbWFnZUhlaWdodCA9IHR5cGVvZiBkZWZhdWx0SW1hZ2VIZWlnaHQgPT09ICdudW1iZXInID8gZGVmYXVsdEltYWdlSGVpZ2h0LnRvU3RyaW5nKCkgOiBkZWZhdWx0SW1hZ2VIZWlnaHQ7XG4gICAgICAgIGxldCBkZWZhdWx0V2lkdGhQdDogbnVtYmVyID0gZGVmYXVsdEltYWdlV2lkdGggJiYgU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoZGVmYXVsdEltYWdlV2lkdGgsIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlciksIDEsICdweCcpO1xuICAgICAgICBsZXQgZGVmYXVsdEhlaWdodFB0OiBudW1iZXIgPSBkZWZhdWx0SW1hZ2VIZWlnaHQgJiYgU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoZGVmYXVsdEltYWdlSGVpZ2h0LCBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpLCAxLCAncHgnKTtcblxuICAgICAgICBpZihTdXJ2ZXlIZWxwZXIuaXNTaXplRW1wdHkoaW1hZ2VXaWR0aCkgfHwgU3VydmV5SGVscGVyLmlzSGVpZ2h0RW1wdHkoaW1hZ2VIZWlnaHQpKSB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZVNpemUgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuZ2V0SW1hZ2VTaXplKGltYWdlTGluayk7XG4gICAgICAgICAgICBpZighU3VydmV5SGVscGVyLmlzU2l6ZUVtcHR5KGltYWdlV2lkdGgpKSB7XG4gICAgICAgICAgICAgICAgaWYoaW1hZ2VTaXplICYmIGltYWdlU2l6ZS53aWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHRQdCA9IGltYWdlU2l6ZS5oZWlnaHQgKiB3aWR0aFB0IC8gaW1hZ2VTaXplLndpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYoIVN1cnZleUhlbHBlci5pc0hlaWdodEVtcHR5KGltYWdlSGVpZ2h0KSkge1xuICAgICAgICAgICAgICAgIGlmKGltYWdlU2l6ZSAmJiBpbWFnZVNpemUuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoUHQgPSBpbWFnZVNpemUud2lkdGggKiBoZWlnaHRQdCAvIGltYWdlU2l6ZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZihpbWFnZVNpemUgJiYgaW1hZ2VTaXplLmhlaWdodCAmJiBpbWFnZVNpemUud2lkdGgpIHtcbiAgICAgICAgICAgICAgICBoZWlnaHRQdCA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKGltYWdlU2l6ZS5oZWlnaHQudG9TdHJpbmcoKSwgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSwgMSwgJ3B4Jyk7XG4gICAgICAgICAgICAgICAgd2lkdGhQdCA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKGltYWdlU2l6ZS53aWR0aC50b1N0cmluZygpLCBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpLCAxLCAncHgnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB3aWR0aDogd2lkdGhQdCB8fCBkZWZhdWx0V2lkdGhQdCB8fCAwLCBoZWlnaHQ6IGhlaWdodFB0IHx8IGRlZmF1bHRIZWlnaHRQdCB8fCAwIH07XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9oZWxwZXJfc3VydmV5LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSUZsYXRRdWVzdGlvbiwgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbkRlZmF1bHQgfSBmcm9tICcuL2ZsYXRfZGVmYXVsdCc7XG5cbmV4cG9ydCB0eXBlIEZsYXRDb25zdHJ1Y3RvciA9IG5ldyAoXG4gICAgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyXG4pID0+IElGbGF0UXVlc3Rpb247XG5leHBvcnQgY2xhc3MgRmxhdFJlcG9zaXRvcnkge1xuICAgIHByaXZhdGUgcXVlc3Rpb25zOiB7IFtpbmRleDogc3RyaW5nXTogRmxhdENvbnN0cnVjdG9yIH0gPSB7fTtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogRmxhdFJlcG9zaXRvcnkgPSBuZXcgRmxhdFJlcG9zaXRvcnkoKTtcbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IEZsYXRSZXBvc2l0b3J5IHtcbiAgICAgICAgcmV0dXJuIEZsYXRSZXBvc2l0b3J5Lmluc3RhbmNlO1xuICAgIH1cbiAgICBwdWJsaWMgcmVnaXN0ZXIobW9kZWxUeXBlOiBzdHJpbmcsIHJlbmRlcmVyQ29uc3RydWN0b3I6IEZsYXRDb25zdHJ1Y3Rvcik6IHZvaWQge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uc1ttb2RlbFR5cGVdID0gcmVuZGVyZXJDb25zdHJ1Y3RvcjtcbiAgICB9XG4gICAgcHVibGljIGlzVHlwZVJlZ2lzdGVyZWQodHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMucXVlc3Rpb25zW3R5cGVdO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0UmVuZGVyZXIodHlwZTogc3RyaW5nKTogRmxhdENvbnN0cnVjdG9yIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb25zW3R5cGVdO1xuICAgIH1cbiAgICBwdWJsaWMgY3JlYXRlKHN1cnZleTogU3VydmV5UERGLCBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgICAgIGRvY0NvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHR5cGU/OiBzdHJpbmcpOiBJRmxhdFF1ZXN0aW9uIHtcbiAgICAgICAgY29uc3QgcXVlc3Rpb25UeXBlOiBzdHJpbmcgPSB0eXBlb2YgdHlwZSA9PT0gJ3VuZGVmaW5lZCcgPyBxdWVzdGlvbi5nZXRUeXBlKCkgOiB0eXBlO1xuICAgICAgICBsZXQgcmVuZGVyZXJDb25zdHJ1Y3RvciA9IHRoaXMuZ2V0UmVuZGVyZXIocXVlc3Rpb25UeXBlKTtcbiAgICAgICAgaWYoIXJlbmRlcmVyQ29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIGlmKCEhcXVlc3Rpb24uY3VzdG9tV2lkZ2V0Py5wZGZSZW5kZXIpIHtcbiAgICAgICAgICAgICAgICByZW5kZXJlckNvbnN0cnVjdG9yID0gRmxhdFF1ZXN0aW9uO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZW5kZXJlckNvbnN0cnVjdG9yID0gRmxhdFF1ZXN0aW9uRGVmYXVsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IHJlbmRlcmVyQ29uc3RydWN0b3Ioc3VydmV5LCBxdWVzdGlvbiwgZG9jQ29udHJvbGxlcik7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXIodHlwZTogc3RyaW5nLCByZW5kZXJlckNvbnN0cnVjdG9yOiBGbGF0Q29uc3RydWN0b3IpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKHR5cGUsIHJlbmRlcmVyQ29uc3RydWN0b3IpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldFJlbmRlcmVyKHR5cGU6IHN0cmluZyk6IEZsYXRDb25zdHJ1Y3RvciB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEluc3RhbmNlKCkuZ2V0UmVuZGVyZXIodHlwZSk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnkudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uLCBMb2NhbGl6YWJsZVN0cmluZywgU2VyaWFsaXplciB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0U3VydmV5IH0gZnJvbSAnLi9mbGF0X3N1cnZleSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgaW50ZXJmYWNlIElGbGF0UXVlc3Rpb24ge1xuICAgIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPjtcbiAgICBnZW5lcmF0ZUZsYXRzKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPjtcbn1cbmV4cG9ydCBjbGFzcyBGbGF0UXVlc3Rpb24gaW1wbGVtZW50cyBJRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIENPTlRFTlRfR0FQX1ZFUlRfU0NBTEU6IG51bWJlciA9IDAuNTtcbiAgICBwdWJsaWMgc3RhdGljIENPTlRFTlRfR0FQX0hPUl9TQ0FMRTogbnVtYmVyID0gMS4wO1xuICAgIHB1YmxpYyBzdGF0aWMgQ09OVEVOVF9JTkRFTlRfU0NBTEU6IG51bWJlciA9IDEuMDtcbiAgICBwdWJsaWMgc3RhdGljIERFU0NfR0FQX1NDQUxFOiBudW1iZXIgPSAwLjA2MjU7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdFRpdGxlKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRpdGxlRmxhdChwb2ludCxcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcik7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0RGVzY3JpcHRpb24ocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlRGVzY0ZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi5sb2NEZXNjcmlwdGlvbik7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0SGVhZGVyKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGNvbnN0IHRpdGxlRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRUaXRsZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKHRpdGxlRmxhdCk7XG4gICAgICAgIGlmKHRoaXMucXVlc3Rpb24uaGFzRGVzY3JpcHRpb25VbmRlclRpdGxlKSB7XG4gICAgICAgICAgICBjb25zdCBkZXNjUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludCh0aXRsZUZsYXQsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgIGRlc2NQb2ludC55VG9wICs9IEZsYXRRdWVzdGlvbi5ERVNDX0dBUF9TQ0FMRSAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgZGVzY1BvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0RGVzY3JpcHRpb24oZGVzY1BvaW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbW1lbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IHRleHQ6IExvY2FsaXphYmxlU3RyaW5nID0gdGhpcy5xdWVzdGlvbi5sb2NDb21tZW50VGV4dDtcbiAgICAgICAgY29uc3Qgb3RoZXJUZXh0RmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgcG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdGV4dCwgVGV4dEJyaWNrKTtcbiAgICAgICAgY29uc3Qgb3RoZXJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KG90aGVyVGV4dEZsYXQpO1xuICAgICAgICBvdGhlclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVCcmljayhvdGhlclRleHRGbGF0LCBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQ29tbWVudEZsYXQoXG4gICAgICAgICAgICBvdGhlclBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGZhbHNlLCB7IHJvd3M6IFN1cnZleUhlbHBlci5PVEhFUl9ST1dTX0NPVU5UIH0pKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb21wb3NpdGUocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY29udGVudFBhbmVsID0gKDxhbnk+dGhpcy5xdWVzdGlvbikuY29udGVudFBhbmVsO1xuICAgICAgICBpZiAoISFjb250ZW50UGFuZWwpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBGbGF0U3VydmV5LmdlbmVyYXRlRmxhdHNQYW5lbCh0aGlzLnN1cnZleSxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIGNvbnRlbnRQYW5lbCwgcG9pbnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSBTdXJ2ZXlIZWxwZXIuZ2V0Q29udGVudFF1ZXN0aW9uKHRoaXMucXVlc3Rpb24pO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50V2l0aE9wdGlvbmFsRWxlbWVudHMocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgZmxhdHM6IEFycmF5PElQZGZCcmljaz4gPSBbXTtcbiAgICAgICAgY29uc3QgY29udGVudEZsYXRzID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29tcG9zaXRlKHBvaW50KTtcbiAgICAgICAgZmxhdHMucHVzaCguLi5jb250ZW50RmxhdHMpO1xuICAgICAgICBjb25zdCBnZXRMYXRlc3RQb2ludCA9ICgpOiBJUG9pbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgICAgIGlmKGNvbnRlbnRGbGF0cyAhPT0gbnVsbCAmJiBjb250ZW50RmxhdHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzLnlUb3AgPSBTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi5mbGF0cykueUJvdCArIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5oYXNDb21tZW50KSB7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbW1lbnQoZ2V0TGF0ZXN0UG9pbnQoKSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmhhc0Rlc2NyaXB0aW9uVW5kZXJJbnB1dCkge1xuICAgICAgICAgICAgZmxhdHMucHVzaChhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdERlc2NyaXB0aW9uKGdldExhdGVzdFBvaW50KCkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHMocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KHRoaXMucXVlc3Rpb24uaW5kZW50KS53aWR0aDtcbiAgICAgICAgY29uc3QgaW5kZW50UG9pbnQ6IElQb2ludCA9IHtcbiAgICAgICAgICAgIHhMZWZ0OiBwb2ludC54TGVmdCArIHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dCh0aGlzLnF1ZXN0aW9uLmluZGVudCkud2lkdGgsXG4gICAgICAgICAgICB5VG9wOiBwb2ludC55VG9wXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBsZXQgdGl0bGVMb2NhdGlvbjogc3RyaW5nID0gdGhpcy5xdWVzdGlvbi5nZXRUaXRsZUxvY2F0aW9uKCk7XG4gICAgICAgIHRpdGxlTG9jYXRpb24gPSB0aGlzLnF1ZXN0aW9uLmhhc1RpdGxlID8gdGl0bGVMb2NhdGlvbiA6ICdoaWRkZW4nO1xuICAgICAgICBzd2l0Y2ggKHRpdGxlTG9jYXRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgICBjYXNlICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlckZsYXQgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEhlYWRlcihpbmRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGhlYWRlckZsYXQpO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludC54TGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfSU5ERU5UX1NDQUxFO1xuICAgICAgICAgICAgICAgIGhlYWRlckZsYXQuYWRkQnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoaGVhZGVyRmxhdCksIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICpcbiAgICAgICAgICAgICAgICAgICAgRmxhdFF1ZXN0aW9uLkNPTlRFTlRfR0FQX1ZFUlRfU0NBTEUgKyBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEZsYXRzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbnRlbnRXaXRoT3B0aW9uYWxFbGVtZW50cyhjb250ZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgaWYoY29udGVudEZsYXRzICE9PSBudWxsICYmIGNvbnRlbnRGbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyRmxhdC5hZGRCcmljayhjb250ZW50RmxhdHMuc2hpZnQoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goaGVhZGVyRmxhdCk7XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaCguLi5jb250ZW50RmxhdHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnYm90dG9tJzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKGluZGVudFBvaW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250ZW50UG9pbnQueExlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0lOREVOVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEZsYXRzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbnRlbnRXaXRoT3B0aW9uYWxFbGVtZW50cyhjb250ZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaCguLi5jb250ZW50RmxhdHMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlUG9pbnQ6IElQb2ludCA9IGluZGVudFBvaW50O1xuICAgICAgICAgICAgICAgIGlmIChmbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVQb2ludC55VG9wID0gZmxhdHNbZmxhdHMubGVuZ3RoIC0gMV0ueUJvdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGl0bGVQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfR0FQX1ZFUlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaChhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEhlYWRlcih0aXRsZVBvaW50KSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdsZWZ0Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLVxuICAgICAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuTVVMVElQTEVURVhUX1RFWFRfUEVSUyk7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEhlYWRlcihpbmRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoaGVhZGVyRmxhdCwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgY29udGVudFBvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9HQVBfSE9SX1NDQUxFO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSBjb250ZW50UG9pbnQueExlZnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEZsYXRzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbnRlbnRXaXRoT3B0aW9uYWxFbGVtZW50cyhjb250ZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIGlmKGNvbnRlbnRGbGF0cyAhPT0gbnVsbCAmJiBjb250ZW50RmxhdHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlckZsYXQuYWRkQnJpY2soY29udGVudEZsYXRzLnNoaWZ0KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKGhlYWRlckZsYXQpO1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goLi4uY29udGVudEZsYXRzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2hpZGRlbic6XG4gICAgICAgICAgICBjYXNlIFN1cnZleUhlbHBlci5USVRMRV9MT0NBVElPTl9NQVRSSVg6XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUoaW5kZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGlmICh0aXRsZUxvY2F0aW9uICE9PSBTdXJ2ZXlIZWxwZXIuVElUTEVfTE9DQVRJT05fTUFUUklYKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludC54TGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfSU5ERU5UX1NDQUxFO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goLi4uYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29udGVudFdpdGhPcHRpb25hbEVsZW1lbnRzKGNvbnRlbnRQb2ludCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0IHNob3VsZFJlbmRlckFzQ29tbWVudCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5zaG91bGRSZW5kZXJSZWFkT25seSh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgIH1cbn1cblxuU2VyaWFsaXplci5hZGRQcm9wZXJ0eSgncXVlc3Rpb24nLCB7XG4gICAgbmFtZTogJ3JlYWRvbmx5UmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAndGV4dCcsICdhY3JvZm9ybSddLFxuICAgIHZpc2libGU6IGZhbHNlXG59KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9xdWVzdGlvbi50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5cbmV4cG9ydCBjbGFzcyBUZXh0QnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJvdGVjdGVkIGFsaWduOiBhbnk7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcm90ZWN0ZWQgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgdGhpcy5hbGlnbiA9IHtcbiAgICAgICAgICAgIGlzSW5wdXRSdGw6IGZhbHNlLFxuICAgICAgICAgICAgaXNPdXRwdXRSdGw6IGNvbnRyb2xsZXIuaXNSVEwsXG4gICAgICAgICAgICBhbGlnbjogY29udHJvbGxlci5pc1JUTCA/ICdyaWdodCc6ICdsZWZ0JyxcbiAgICAgICAgICAgIGJhc2VsaW5lOiAnbWlkZGxlJ1xuICAgICAgICB9O1xuICAgIH1cbiAgICBwcml2YXRlIGVzY2FwZVRleHQoKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLnRleHQuaW5kZXhPZignXFx0JykgPiAtMSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGhpcy50ZXh0LnJlcGxhY2UoJ1xcdCcsIEFycmF5KDUpLmpvaW4oU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgYWxpZ25Qb2ludDogSVBvaW50ID0gdGhpcy5hbGlnblBvaW50KHRoaXMpO1xuICAgICAgICBsZXQgb2xkRm9udFNpemU6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gdGhpcy5mb250U2l6ZTtcbiAgICAgICAgbGV0IG9sZFRleHRDb2xvcjogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXRUZXh0Q29sb3IoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRUZXh0Q29sb3IodGhpcy50ZXh0Q29sb3IpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnRleHQodGhpcy5lc2NhcGVUZXh0KCksIGFsaWduUG9pbnQueExlZnQsIGFsaWduUG9pbnQueVRvcCwgdGhpcy5hbGlnbik7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0VGV4dENvbG9yKG9sZFRleHRDb2xvcik7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYWxpZ25Qb2ludChyZWN0OiBJUmVjdCk6IElQb2ludCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogdGhpcy5jb250cm9sbGVyLmlzUlRMID8gcmVjdC54UmlnaHQgOiByZWN0LnhMZWZ0LFxuICAgICAgICAgICAgeVRvcDogcmVjdC55VG9wICsgKHJlY3QueUJvdCAtIHJlY3QueVRvcCkgLyAyLjBcbiAgICAgICAgfTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHQudHMiLCJpbXBvcnQgeyBJUGRmQnJpY2ssIFRyYW5zbGF0ZVhGdW5jdGlvbiB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgQ29tcG9zaXRlQnJpY2sgaW1wbGVtZW50cyBJUGRmQnJpY2sge1xuICAgIHByaXZhdGUgYnJpY2tzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgIHByaXZhdGUgX3hMZWZ0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfeFJpZ2h0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfeVRvcDogbnVtYmVyO1xuICAgIHByaXZhdGUgX3lCb3Q6IG51bWJlcjtcbiAgICBwdWJsaWMgaXNQYWdlQnJlYWs6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoLi4uYnJpY2tzOiBJUGRmQnJpY2tbXSkge1xuICAgICAgICB0aGlzLl94TGVmdCA9IDAuMDtcbiAgICAgICAgdGhpcy5feFJpZ2h0ID0gMC4wO1xuICAgICAgICB0aGlzLl95VG9wID0gMC4wO1xuICAgICAgICB0aGlzLl95Qm90ID0gMC4wO1xuICAgICAgICB0aGlzLmFkZEJyaWNrKC4uLmJyaWNrcyk7XG4gICAgfVxuICAgIGdldCB4TGVmdCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5feExlZnQ7IH1cbiAgICBzZXQgeExlZnQoeExlZnQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNoaWZ0KHhMZWZ0IC0gdGhpcy54TGVmdCwgMC4wLCAwLjAsIDAuMCk7XG4gICAgICAgIHRoaXMuX3hMZWZ0ID0geExlZnQ7XG4gICAgfVxuICAgIGdldCB4UmlnaHQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3hSaWdodDsgfVxuICAgIHNldCB4UmlnaHQoeFJpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zaGlmdCgwLjAsIHhSaWdodCAtIHRoaXMueFJpZ2h0LCAwLjAsIDAuMCk7XG4gICAgICAgIHRoaXMuX3hSaWdodCA9IHhSaWdodDtcbiAgICB9XG4gICAgZ2V0IHlUb3AoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3lUb3A7IH1cbiAgICBzZXQgeVRvcCh5VG9wOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zaGlmdCgwLjAsIDAuMCwgeVRvcCAtIHRoaXMueVRvcCwgMC4wKTtcbiAgICAgICAgdGhpcy5feVRvcCA9IHlUb3A7XG4gICAgfVxuICAgIGdldCB5Qm90KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl95Qm90OyB9XG4gICAgc2V0IHlCb3QoeUJvdDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2hpZnQoMC4wLCAwLjAsIDAuMCwgeUJvdCAtIHRoaXMueUJvdCk7XG4gICAgICAgIHRoaXMuX3lCb3QgPSB5Qm90O1xuICAgIH1cbiAgICBwcml2YXRlIHNoaWZ0KGxlZnRTaGlmdDogbnVtYmVyLCByaWdodFNoaWZ0OiBudW1iZXIsXG4gICAgICAgIHRvcFNoaWZ0OiBudW1iZXIsIGJvdFNoaWZ0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5icmlja3MuZm9yRWFjaCgoYnJpY2s6IElQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgYnJpY2sueExlZnQgKz0gbGVmdFNoaWZ0O1xuICAgICAgICAgICAgYnJpY2sueFJpZ2h0ICs9IHJpZ2h0U2hpZnQ7XG4gICAgICAgICAgICBicmljay55VG9wICs9IHRvcFNoaWZ0O1xuICAgICAgICAgICAgYnJpY2sueUJvdCArPSBib3RTaGlmdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgd2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueFJpZ2h0IC0gdGhpcy54TGVmdDtcbiAgICB9XG4gICAgcHVibGljIGdldCBoZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueUJvdCAtIHRoaXMueVRvcDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuYnJpY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmJyaWNrc1tpXS5yZW5kZXIoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJyaWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIHB1YmxpYyBhZGRCcmljayguLi5icmlja3M6IElQZGZCcmlja1tdKSB7XG4gICAgICAgIGlmIChicmlja3MubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgIHRoaXMuYnJpY2tzLnB1c2goLi4uYnJpY2tzKTtcbiAgICAgICAgICAgIGxldCBtZXJnZVJlY3QgPSBTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi50aGlzLmJyaWNrcyk7XG4gICAgICAgICAgICB0aGlzLl94TGVmdCA9IG1lcmdlUmVjdC54TGVmdDtcbiAgICAgICAgICAgIHRoaXMuX3hSaWdodCA9IG1lcmdlUmVjdC54UmlnaHQ7XG4gICAgICAgICAgICB0aGlzLl95VG9wID0gbWVyZ2VSZWN0LnlUb3A7XG4gICAgICAgICAgICB0aGlzLl95Qm90ID0gbWVyZ2VSZWN0LnlCb3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIHVuZm9sZCgpOiBJUGRmQnJpY2tbXSB7XG4gICAgICAgIGNvbnN0IHVuZm9sZEJyaWNrczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgdGhpcy5icmlja3MuZm9yRWFjaCgoYnJpY2s6IElQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgdW5mb2xkQnJpY2tzLnB1c2goLi4uYnJpY2sudW5mb2xkKCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVuZm9sZEJyaWNrcztcbiAgICB9XG4gICAgdHJhbnNsYXRlWChmdW5jOiBUcmFuc2xhdGVYRnVuY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5icmlja3MuZm9yRWFjaChicmljayA9PiBicmljay50cmFuc2xhdGVYKGZ1bmMpKTtcbiAgICAgICAgY29uc3QgcmVzID0gZnVuYyh0aGlzLnhMZWZ0LCB0aGlzLnhSaWdodCk7XG4gICAgICAgIHRoaXMuX3hMZWZ0ID0gcmVzLnhMZWZ0O1xuICAgICAgICB0aGlzLl94UmlnaHQgPSByZXMueFJpZ2h0O1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlLnRzIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzZfXztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJyb290XCI6XCJTdXJ2ZXlcIixcImNvbW1vbmpzMlwiOlwic3VydmV5LWNvcmVcIixcImNvbW1vbmpzXCI6XCJzdXJ2ZXktY29yZVwiLFwiYW1kXCI6XCJzdXJ2ZXktY29yZVwifVxuLy8gbW9kdWxlIGlkID0gNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgeyBJUmVjdCwgSVNpemUsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCB0eXBlIFRyYW5zbGF0ZVhGdW5jdGlvbiA9ICh4TGVmdDogbnVtYmVyLCB4UmlnaHQgOiBudW1iZXIpID0+IHsgeExlZnQ6IG51bWJlciwgeFJpZ2h0OiBudW1iZXJ9O1xuZXhwb3J0IGludGVyZmFjZSBJUGRmQnJpY2sgZXh0ZW5kcyBJUmVjdCwgSVNpemUge1xuICAgIHJlbmRlcigpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHVuZm9sZCgpOiBJUGRmQnJpY2tbXTtcbiAgICB0cmFuc2xhdGVYKGZ1bmM6IFRyYW5zbGF0ZVhGdW5jdGlvbik6IHZvaWQ7XG4gICAgaXNQYWdlQnJlYWs6IGJvb2xlYW47XG59XG4vKipcbiAqIEFuIG9iamVjdCB0aGF0IGRlc2NyaWJlcyBhIFBERiBicmljayZtZGFzaDthIHNpbXBsZSBlbGVtZW50IHdpdGggc3BlY2lmaWVkIGNvbnRlbnQsIHNpemUsIGFuZCBsb2NhdGlvbi4gQnJpY2tzIGFyZSBmdW5kYW1lbnRhbCBlbGVtZW50cyB1c2VkIHRvIGNvbnN0cnVjdCBhIFBERiBkb2N1bWVudC5cbiAqXG4gKiBZb3UgY2FuIGFjY2VzcyBgUGRmQnJpY2tgIG9iamVjdHMgd2l0aGluIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSBgU3VydmV5UERGYCdzIFtgb25SZW5kZXJRdWVzdGlvbmBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2Uvc3VydmV5cGRmI29uUmVuZGVyUXVlc3Rpb24pLCBbYG9uUmVuZGVyUGFuZWxgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3N1cnZleXBkZiNvblJlbmRlclBhbmVsKSwgYW5kIFtgb25SZW5kZXJQYWdlYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9zdXJ2ZXlwZGYjb25SZW5kZXJQYWdlKSBldmVudHMuXG4gKlxuICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzL2FkZC1tYXJrdXAtdG8tY3VzdG9taXplLXBkZi1mb3Jtcy8gKGxpbmtTdHlsZSkpXG4gKi9cbmV4cG9ydCBjbGFzcyBQZGZCcmljayBpbXBsZW1lbnRzIElQZGZCcmljayB7XG4gICAgcHJvdGVjdGVkIF94TGVmdDogbnVtYmVyO1xuICAgIHByb3RlY3RlZCBfeFJpZ2h0OiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIF95VG9wOiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIF95Qm90OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBBbiBYLWNvb3JkaW5hdGUgZm9yIHRoZSBsZWZ0IGJyaWNrIGVkZ2UuXG4gICAgICovXG4gICAgcHVibGljIGdldCB4TGVmdCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5feExlZnQ7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgeExlZnQodmFsOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRYTGVmdCh2YWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBYLWNvb3JkaW5hdGUgZm9yIHRoZSByaWdodCBicmljayBlZGdlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgeFJpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl94UmlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgeFJpZ2h0KHZhbDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0WFJpZ2h0KHZhbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgWS1jb29yZGluYXRlIGZvciB0aGUgdG9wIGJyaWNrIGVkZ2UuXG4gICAgICovXG4gICAgcHVibGljIGdldCB5VG9wKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl95VG9wO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IHlUb3AodmFsOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRZVG9wKHZhbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgWS1jb29yZGluYXRlIGZvciB0aGUgYm90dG9tIGJyaWNrIGVkZ2UuXG4gICAgICovXG4gICAgcHVibGljIGdldCB5Qm90KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl95Qm90O1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IHlCb3QodmFsOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRZQm90dG9tKHZhbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZvbnQgc2l6ZSBpbiBwb2ludHMuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlOiAxNCAoaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudCBQREYgZG9jdW1lbnQpXG4gICAgICovXG4gICAgcHVibGljIGZvbnRTaXplOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbG9yIG9mIHRleHQgd2l0aGluIHRoZSBicmljay5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IGBcIiM0MDQwNDBcImBcbiAgICAgKi9cbiAgICBwdWJsaWMgdGV4dENvbG9yOiBzdHJpbmcgPSBTdXJ2ZXlIZWxwZXIuVEVYVF9DT0xPUjtcbiAgICBwdWJsaWMgZm9ybUJvcmRlckNvbG9yOiBzdHJpbmcgPSBTdXJ2ZXlIZWxwZXIuRk9STV9CT1JERVJfQ09MT1I7XG4gICAgcHVibGljIGlzUGFnZUJyZWFrOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVjdDogSVJlY3QpIHtcbiAgICAgICAgdGhpcy54TGVmdCA9IHJlY3QueExlZnQ7XG4gICAgICAgIHRoaXMueFJpZ2h0ID0gcmVjdC54UmlnaHQ7XG4gICAgICAgIHRoaXMueVRvcCA9IHJlY3QueVRvcDtcbiAgICAgICAgdGhpcy55Qm90ID0gcmVjdC55Qm90O1xuICAgICAgICB0aGlzLmZvbnRTaXplID0gISFjb250cm9sbGVyID9cbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgOiBEb2NDb250cm9sbGVyLkZPTlRfU0laRTtcbiAgICB9XG4gICAgdHJhbnNsYXRlWChmdW5jOiBUcmFuc2xhdGVYRnVuY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVzID0gZnVuYyh0aGlzLnhMZWZ0LCB0aGlzLnhSaWdodCk7XG4gICAgICAgIHRoaXMueExlZnQgPSByZXMueExlZnQ7XG4gICAgICAgIHRoaXMueFJpZ2h0ID0gcmVzLnhSaWdodDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGJyaWNrJ3Mgd2lkdGggaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgd2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueFJpZ2h0IC0gdGhpcy54TGVmdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGJyaWNrJ3MgaGVpZ2h0IGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy55Qm90IC0gdGhpcy55VG9wO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0U2hvdWxkUmVuZGVyUmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBTdXJ2ZXlIZWxwZXIuc2hvdWxkUmVuZGVyUmVhZE9ubHkodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyKTtcbiAgICB9XG4gICAgcHVibGljIGFmdGVyUmVuZGVyQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gICAgcHVibGljIGFzeW5jIHJlbmRlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0U2hvdWxkUmVuZGVyUmVhZE9ubHkoKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJSZWFkT25seSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgYXdhaXQgdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgICAgICB0aGlzLmFmdGVyUmVuZGVyQ2FsbGJhY2sgJiYgdGhpcy5hZnRlclJlbmRlckNhbGxiYWNrKCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbGxvd3MgeW91IHRvIGdldCBhIGZsYXQgYXJyYXkgb2YgbmVzdGVkIFBERiBicmlja3MuXG4gICAgICogQHJldHVybnMgQSBmbGF0IGFycmF5IG9mIG5lc3RlZCBQREYgYnJpY2tzLlxuICAgICAqL1xuICAgIHB1YmxpYyB1bmZvbGQoKTogSVBkZkJyaWNrW10ge1xuICAgICAgICByZXR1cm4gW3RoaXNdO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0Q29ycmVjdGVkVGV4dCh2YWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuaXNSVEwgPyAodmFsIHx8ICcnKS5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpOiB2YWw7XG4gICAgfVxuICAgIHByb3RlY3RlZCBzZXRYTGVmdCh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl94TGVmdCA9IHZhbDtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHNldFhSaWdodCh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl94UmlnaHQgPSB2YWw7XG4gICAgfVxuICAgIHByb3RlY3RlZCBzZXRZVG9wKHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3lUb3AgPSB2YWw7XG4gICAgfVxuICAgIHByb3RlY3RlZCBzZXRZQm90dG9tKHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3lCb3QgPSB2YWw7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2JyaWNrLnRzIiwiaW1wb3J0IHsganNQREYsIGpzUERGT3B0aW9ucyB9IGZyb20gJ2pzcGRmJztcbmltcG9ydCB7IElIVE1MUmVuZGVyVHlwZSB9IGZyb20gJy4vZmxhdF9sYXlvdXQvZmxhdF9odG1sJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gJ3N1cnZleS1jb3JlJztcbi8vIGltcG9ydCBGb250cyBmcm9tICcuL2ZvbnRzJztcbmltcG9ydCBzZXRSYWRpb0FwcGVhcmFuY2UgZnJvbSAnLi9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtJztcbmltcG9ydCAnLi9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtLmpzJztcbmltcG9ydCAnLi9qc3BkZl9wbHVnaW5zL2Zyb21faHRtbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBvaW50IHtcbiAgICAvKipcbiAgICAgKiBBbiBYLWNvb3JkaW5hdGUgZm9yIHRoZSBsZWZ0IGVsZW1lbnQgZWRnZS5cbiAgICAgKi9cbiAgICB4TGVmdDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgWS1jb29yZGluYXRlIGZvciB0aGUgdG9wIGVsZW1lbnQgZWRnZS5cbiAgICAgKi9cbiAgICB5VG9wOiBudW1iZXI7XG59XG4vKipcbiAqIEFuIGludGVyZmFjZSB0aGF0IGRlc2NyaWJlcyBhIHJlY3RhbmdsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUmVjdCBleHRlbmRzIElQb2ludCB7XG4gICAgLyoqXG4gICAgICogQW4gWC1jb29yZGluYXRlIGZvciB0aGUgcmlnaHQgZWxlbWVudCBlZGdlLlxuICAgICAqL1xuICAgIHhSaWdodDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgWS1jb29yZGluYXRlIGZvciB0aGUgYm90dG9tIGVsZW1lbnQgZWRnZS5cbiAgICAgKi9cbiAgICB5Qm90OiBudW1iZXI7XG59XG5leHBvcnQgaW50ZXJmYWNlIElTaXplIHtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBJTWFyZ2luTFIge1xuICAgIC8qKlxuICAgICAqIEEgbGVmdCBtYXJnaW4uXG4gICAgICovXG4gICAgbGVmdD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHJpZ2h0IG1hcmdpbi5cbiAgICAgKi9cbiAgICByaWdodD86IG51bWJlcjtcbn1cbi8qKlxuICogQW4gaW50ZXJmYWNlIHRoYXQgZGVzY3JpYmVzIG1hcmdpbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSU1hcmdpbiBleHRlbmRzIElNYXJnaW5MUiB7XG4gICAgLyoqXG4gICAgICogQSB0b3AgbWFyZ2luLlxuICAgICAqL1xuICAgIHRvcD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIGJvdHRvbSBtYXJnaW4uXG4gICAgICovXG4gICAgYm90PzogbnVtYmVyO1xufVxuLyoqXG4gKiBQREYgZG9jdW1lbnQgY29uZmlndXJhdGlvbi4gUGFzcyBpdCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBgU3VydmV5UERGYCBjb25zdHJ1Y3RvcjpcbiAqXG4gKiBgYGBqc1xuICogY29uc3Qgc3VydmV5UGRmID0gbmV3IFN1cnZleVBERi5TdXJ2ZXlQREYoc3VydmV5SnNvbiwgcGRmRG9jT3B0aW9ucyk7XG4gKlxuICogLy8gSW4gbW9kdWxhciBhcHBsaWNhdGlvbnM6XG4gKiBpbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tIFwic3VydmV5LXBkZlwiO1xuICogY29uc3Qgc3VydmV5UGRmID0gbmV3IFN1cnZleVBERihzdXJ2ZXlKc29uLCBwZGZEb2NPcHRpb25zKTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElEb2NPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBQYWdlIG9yaWVudGF0aW9uLlxuICAgICAqXG4gICAgICogUG9zc2libGUgdmFsdWVzOlxuICAgICAqXG4gICAgICogLSBgXCJwXCJgIChkZWZhdWx0KSAtIFBvcnRyYWl0IG9yaWVudGF0aW9uLlxuICAgICAqIC0gYFwibFwiYCAtIExhbmRzY2FwZSBvcmllbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzZWUgZm9ybWF0XG4gICAgICovXG4gICAgb3JpZW50YXRpb24/OiAncCcgfCAnbCc7XG5cbiAgICAvKipcbiAgICAgKiBQYWdlIGZvcm1hdC5cbiAgICAgKlxuICAgICAqIFBvc3NpYmxlIHZhbHVlczpcbiAgICAgKlxuICAgICAqIC0gYFwiYTBcImAgLSBgXCJhMTBcImAgKGBcImE0XCJgIGlzIGRlZmF1bHQpXG4gICAgICogLSBgXCJiMFwiYCAtIGBcImIxMFwiYFxuICAgICAqIC0gYFwiYzBcImAgLSBgXCJjMTBcImBcbiAgICAgKiAtIGBcImRsXCJgXG4gICAgICogLSBgXCJsZXR0ZXJcImBcbiAgICAgKiAtIGBcImdvdmVybm1lbnQtbGV0dGVyXCJgXG4gICAgICogLSBgXCJsZWdhbFwiYFxuICAgICAqIC0gYFwianVuaW9yLWxlZ2FsXCJgXG4gICAgICogLSBgXCJsZWRnZXJcImBcbiAgICAgKiAtIGBcInRhYmxvaWRcImBcbiAgICAgKiAtIGBcImNyZWRpdC1jYXJkXCJgXG4gICAgICogLSBBcnJheTxudW1iZXI+IC0gY3VzdG9tIHBhZ2Ugc2l6ZSBpbiBtaWxsaW1ldGVycywgZm9yIGV4YW1wbGUsIGBbMjEwLCAyOTddYC5cbiAgICAgKlxuICAgICAqIEBzZWUgb3JpZW50YXRpb25cbiAgICAgKi9cbiAgICBmb3JtYXQ/OiBzdHJpbmcgfCBudW1iZXJbXTtcblxuICAgIC8qKlxuICAgICAqIEZvbnQgc2l6ZSBpbiBwb2ludHMuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlOiAxNFxuICAgICAqXG4gICAgICogQHNlZSBmb250TmFtZVxuICAgICAqL1xuICAgIGZvbnRTaXplPzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogRm9udCBuYW1lLlxuICAgICAqXG4gICAgICogUG9zc2libGUgdmFsdWVzOlxuICAgICAqXG4gICAgICogLSBgXCJIZWx2ZXRpY2FcImAgKGRlZmF1bHQpXG4gICAgICogLSBgXCJDb3VyaWVyXCJgXG4gICAgICogLSBgXCJUaW1lc1wiYFxuICAgICAqIC0gYFwiU3ltYm9sXCJgXG4gICAgICogLSBgXCJaYXBmRGluZ2JhdHNcImBcbiAgICAgKiAtIFtDdXN0b20gZm9udCBuYW1lXShodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vUGRmLUV4cG9ydD9pZD1DdXN0b21pemF0aW9uLUNoYW5nZUZvbnRzI3VzZS1jdXN0b20tZm9udClcbiAgICAgKlxuICAgICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9jaGFuZ2UtZm9udC1pbi1wZGYtZm9ybS8gKGxpbmtTdHlsZSkpXG4gICAgICogQHNlZSBmb250U2l6ZVxuICAgICAqL1xuICAgIGZvbnROYW1lPzogc3RyaW5nO1xuXG4gICAgYmFzZTY0Tm9ybWFsPzogc3RyaW5nO1xuICAgIGJhc2U2NEJvbGQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gYXBwbHkgYSBjdXN0b20gZm9udCB0byBbSFRNTCBxdWVzdGlvbnNdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2V4YW1wbGVzL3F1ZXN0aW9udHlwZS1odG1sLykuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlOiBgZmFsc2VgXG4gICAgICpcbiAgICAgKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZXhhbXBsZXMvY2hhbmdlLWZvbnQtaW4tcGRmLWZvcm0vIChsaW5rU3R5bGUpKVxuICAgICAqIEBzZWUgaHRtbFJlbmRlckFzXG4gICAgICovXG4gICAgdXNlQ3VzdG9tRm9udEluSHRtbD86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBQYWdlIG1hcmdpbnMuIFNldCB0aGlzIHByb3BlcnR5IHRvIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgZmllbGRzOiBgdG9wYCwgYGJvdGAsIGBsZWZ0YCwgYHJpZ2h0YC5cbiAgICAgKi9cbiAgICBtYXJnaW5zPzogSU1hcmdpbjtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBob3cgdG8gcmVuZGVyIFtIVE1MIHF1ZXN0aW9uc10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnk/aWQ9cXVlc3Rpb25odG1sbW9kZWwpIGludG8gUERGLlxuICAgICAqXG4gICAgICogUG9zc2libGUgdmFsdWVzOlxuICAgICAqXG4gICAgICogLSBgXCJzdGFuZGFyZFwiYCAtIFJlbmRlciBIVE1MIHF1ZXN0aW9ucyBhcyBzZWxlY3RhYmxlIHRleHQuXG4gICAgICogLSBgXCJpbWFnZVwiYCAtIFJlbmRlciBIVE1MIHF1ZXN0aW9ucyBhcyBpbWFnZXMuXG4gICAgICogLSBgXCJhdXRvXCJgIChkZWZhdWx0KSAtIFNlbGVjdCBiZXR3ZWVuIHRoZSBgXCJzdGFuZGFyZFwiYCBhbmQgYFwiaW1hZ2VcImAgbW9kZXMgYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGUgSFRNTCBjb250ZW50LlxuICAgICAqXG4gICAgICogWW91IGNhbiBvdmVycmlkZSB0aGlzIHByb3BlcnR5IGZvciBhbiBpbmRpdmlkdWFsIEhUTUwgcXVlc3Rpb24uIFNldCB0aGUgcXVlc3Rpb24ncyBgcmVuZGVyQXNgIHByb3BlcnR5IHRvIGBcInN0YW5kYXJkXCJgIG9yIGBcImltYWdlXCJgIGluIHRoZSBzdXJ2ZXkgSlNPTiBzY2hlbWEuXG4gICAgICogQHNlZSB1c2VDdXN0b21Gb250SW5IdG1sXG4gICAgICovXG4gICAgaHRtbFJlbmRlckFzPzogSUhUTUxSZW5kZXJUeXBlO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGhvdyB0byByZW5kZXIgW01hdHJpeF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnk/aWQ9cXVlc3Rpb25tYXRyaXhtb2RlbCksIFtNYXRyaXggRHJvcGRvd25dKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5P2lkPXF1ZXN0aW9ubWF0cml4ZHJvcGRvd25tb2RlbCksIGFuZCBbTWF0cml4IER5bmFtaWNdKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5P2lkPXF1ZXN0aW9ubWF0cml4ZHluYW1pY21vZGVsKSBxdWVzdGlvbnMgaW50byBQREYuXG4gICAgICpcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICpcbiAgICAgKiAtIGBcImxpc3RcImAgLSBSZW5kZXIgbWF0cml4LWxpa2UgcXVlc3Rpb25zIGFzIGxpc3RzLlxuICAgICAqIC0gYFwiYXV0b1wiYCAoZGVmYXVsdCkgLSBSZW5kZXIgbWF0cml4LWxpa2UgcXVlc3Rpb25zIGFzIHRhYmxlcyBpZiB0aGV5IGZpdCBpbnRvIHRoZSBhdmFpbGFibGUgc3BhY2UuIE90aGVyd2lzZSwgcmVuZGVyIHRoZSBxdWVzdGlvbnMgYXMgbGlzdHMuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgcHJvcGVydHkgZm9yIGFuIGluZGl2aWR1YWwgbWF0cml4LWxpa2UgcXVlc3Rpb24uIFNldCB0aGUgcXVlc3Rpb24ncyBgcmVuZGVyQXNgIHByb3BlcnR5IHRvIGBcImxpc3RcImAgaW4gdGhlIHN1cnZleSBKU09OIHNjaGVtYS5cbiAgICAgKi9cbiAgICBtYXRyaXhSZW5kZXJBcz86ICdhdXRvJyB8ICdsaXN0JztcbiAgICB1c2VMZWdhY3lCb29sZWFuUmVuZGVyaW5nPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgaG93IHRvIHJlbmRlciByZWFkLW9ubHkgcXVlc3Rpb25zLlxuICAgICAqXG4gICAgICogUG9zc2libGUgdmFsdWVzOlxuICAgICAqXG4gICAgICogLSBgXCJ0ZXh0XCJgIC0gUmVuZGVyIHJlYWQtb25seSBxdWVzdGlvbnMgYXMgcGxhaW4gdGV4dCBhbmQgY3VzdG9tIHByaW1pdGl2ZXMuXG4gICAgICogLSBgXCJhY3JvZm9ybVwiYCAtIFVzZSBBZG9iZSBBY3JvRm9ybXMgdG8gcmVuZGVyIHF1ZXN0aW9ucyB0aGF0IHN1cHBvcnQgdGhlbSBhcyBpbnRlcmFjdGl2ZSBmb3JtIGVsZW1lbnRzIHN3aXRjaGVkIHRvIHRoZWlyIG5hdGl2ZSByZWFkLW9ubHkgc3RhdGUuIE90aGVyIHF1ZXN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gYFwidGV4dFwiYCBtb2RlLlxuICAgICAqIC0gYFwiYXV0b1wiYCAoZGVmYXVsdCkgLSBQcmVmZXIgdGhlIGBcInRleHRcImAgbW9kZSBidXQgdXNlIGBcImFjcm9mb3JtXCJgIGZvciBbRmlsZSBVcGxvYWRdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9maWxlLW1vZGVsKSBxdWVzdGlvbnMgYW5kIGxpbmtzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5UmVuZGVyQXM/OiAnYXV0bycgfCAndGV4dCcgfCAnYWNyb2Zvcm0nO1xuXG4gICAgdGV4dEZpZWxkUmVuZGVyQXM/OiAnc2luZ2xlTGluZScgfCAnbXVsdGlMaW5lJztcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGNvbXByZXNzIHRoZSBQREYgZG9jdW1lbnQuIENvbXByZXNzZWQgZG9jdW1lbnRzIGRvIG5vdCBzdXBwb3J0IFtjdXN0b20gZm9udHNdKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9QZGYtRXhwb3J0P2lkPUN1c3RvbWl6YXRpb24tQ2hhbmdlRm9udHMjdXNlLWN1c3RvbS1mb250KS5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICAgKi9cbiAgICBjb21wcmVzcz86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBhcHBseSBgaW1hZ2VGaXRgIHNldHRpbmdzIHNwZWNpZmllZCBpbiB0aGUgc3VydmV5IEpTT04gc2NoZW1hIHRvIGV4cG9ydGVkIGltYWdlcy5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICAgKlxuICAgICAqIFRoaXMgcHJvcGVydHkgYXBwbGllcyB0aGUgZm9sbG93aW5nIHNldHRpbmdzOlxuICAgICAqXG4gICAgICogLSBbYGltYWdlRml0YF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2FkZC1pbWFnZS10by1zdXJ2ZXkjaW1hZ2VGaXQpIHRvIGV4cG9ydGVkIFtJbWFnZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2FkZC1pbWFnZS10by1zdXJ2ZXkpIHF1ZXN0aW9uc1xuICAgICAqIC0gW2BpbWFnZUZpdGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pbWFnZS1waWNrZXItcXVlc3Rpb24tbW9kZWwjaW1hZ2VGaXQpIHRvIGV4cG9ydGVkIFtJbWFnZSBQaWNrZXJdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pbWFnZS1waWNrZXItcXVlc3Rpb24tbW9kZWwpIHF1ZXN0aW9uc1xuICAgICAqIC0gW2Bsb2dvRml0YF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3N1cnZleS1kYXRhLW1vZGVsI2xvZ29GaXQpIHRvIGFuIGV4cG9ydGVkIGxvZ28gaW4gdGhlIHN1cnZleSBoZWFkZXJcbiAgICAgKlxuICAgICAqIElmIHlvdSBlbmFibGUgdGhlIGBhcHBseUltYWdlRml0YCBwcm9wZXJ0eSwgdGhlIHF1YWxpdHkgb2YgaW1hZ2VzIG1heSBiZSBsb3dlciBiZWNhdXNlIHRoZXkgcGFzcyB0aHJvdWdoIHNldmVyYWwgY29udmVyc2lvbnMuIElmIGBhcHBseUltYWdlRml0YCBpcyBkaXNhYmxlZCwgZXhwb3J0ZWQgaW1hZ2VzIGZpbGwgdGhlIGVudGlyZSBjb250YWluZXIgYW5kIGRvIG5vdCBwcmVzZXJ2ZSB0aGVpciBhc3BlY3QgcmF0aW8sIGJ1dCB0aGVpciBxdWFsaXR5IHJlbWFpbnMgdGhlIHNhbWUgYmVjYXVzZSB0aGV5IGFyZSBleHBvcnRlZCBhcyBpcy5cbiAgICAgKi9cbiAgICBhcHBseUltYWdlRml0PzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBQREYgZG9jdW1lbnQgY29udGFpbnMgdGV4dCBpbiByaWdodC10by1sZWZ0IGxhbmd1YWdlcy5cbiAgICAgKlxuICAgICAqIERlZmF1bHQgdmFsdWU6IGBmYWxzZWBcbiAgICAgKi9cbiAgICBpc1JUTD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gaW5jbHVkZSBvbmx5IHNlbGVjdGVkIGNob2ljZXMgd2hlbiBQREYgR2VuZXJhdG9yIHJlbmRlcnMgYSBbTXVsdGktU2VsZWN0IERyb3Bkb3duIChUYWcgQm94KV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZXhhbXBsZXMvaG93LXRvLWNyZWF0ZS1tdWx0aXNlbGVjdC10YWctYm94LykgcXVlc3Rpb24uXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlOiBgZmFsc2VgIChpbmNsdWRlIGFsbCBjaG9pY2VzKVxuICAgICAqL1xuICAgIHRhZ2JveFNlbGVjdGVkQ2hvaWNlc09ubHk/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgRG9jT3B0aW9ucyBpbXBsZW1lbnRzIElEb2NPcHRpb25zIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE1NX1RPX1BUID0gNzIgLyAyNS40O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRk9OVF9TSVpFID0gMTQ7XG4gICAgcHJvdGVjdGVkIF9vcmllbnRhdGlvbjogJ2wnIHwgJ3AnO1xuICAgIHByb3RlY3RlZCBfZm9ybWF0OiBzdHJpbmcgfCBudW1iZXJbXTtcbiAgICBwcm90ZWN0ZWQgX2ZvbnRTaXplOiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIF9mb250TmFtZTogc3RyaW5nO1xuICAgIHB1YmxpYyBzdGF0aWMgU0VHT0VfTk9STUFMOiBzdHJpbmc7XG4gICAgcHVibGljIHN0YXRpYyBTRUdPRV9CT0xEOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9iYXNlNjROb3JtYWw6IHN0cmluZyA9IHVuZGVmaW5lZDtcbiAgICBwcm90ZWN0ZWQgX2Jhc2U2NEJvbGQ6IHN0cmluZyA9IHVuZGVmaW5lZDtcbiAgICBwcm90ZWN0ZWQgX3VzZUN1c3RvbUZvbnRJbkh0bWw6IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIF9tYXJnaW5zOiBJTWFyZ2luO1xuICAgIHByb3RlY3RlZCBfaHRtbFJlbmRlckFzOiBJSFRNTFJlbmRlclR5cGU7XG4gICAgcHJvdGVjdGVkIF9tYXRyaXhSZW5kZXJBczogJ2F1dG8nIHwgJ2xpc3QnO1xuICAgIHByb3RlY3RlZCBfcmVhZG9ubHlSZW5kZXJBczogJ2F1dG8nIHwgJ3RleHQnIHwgJ2Fjcm9mb3JtJztcbiAgICBwcm90ZWN0ZWQgX2NvbXByZXNzOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBfYXBwbHlJbWFnZUZpdDogYm9vbGVhbjtcbiAgICBwcm90ZWN0ZWQgX3VzZUxlZ2FjeUJvb2xlYW5SZW5kZXJpbmc6IGJvb2xlYW5cbiAgICBwcm90ZWN0ZWQgX2lzUlRMOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBfdGFnYm94U2VsZWN0ZWRDaG9pY2VzT25seTogYm9vbGVhbjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogSURvY09wdGlvbnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm9yaWVudGF0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmZvcm1hdCA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm1hdFswXSA8IG9wdGlvbnMuZm9ybWF0WzFdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb3JpZW50YXRpb24gPSAncCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHRoaXMuX29yaWVudGF0aW9uID0gJ2wnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgdGhpcy5fb3JpZW50YXRpb24gPSBvcHRpb25zLm9yaWVudGF0aW9uO1xuICAgICAgICB0aGlzLl9mb3JtYXQgPSBvcHRpb25zLmZvcm1hdCB8fCAnYTQnO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9mb3JtYXQpKSB7XG4gICAgICAgICAgICB0aGlzLl9mb3JtYXQgPSB0aGlzLl9mb3JtYXQubWFwKGYgPT4gZiAqIERvY09wdGlvbnMuTU1fVE9fUFQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2ZvbnRTaXplID0gb3B0aW9ucy5mb250U2l6ZSB8fCBEb2NPcHRpb25zLkZPTlRfU0laRTtcbiAgICAgICAgaWYoIW9wdGlvbnMuZm9udE5hbWUpIHtcbiAgICAgICAgICAgIGlmKCFEb2NPcHRpb25zLlNFR09FX0JPTEQgJiYgIURvY09wdGlvbnMuU0VHT0VfTk9STUFMKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9udE5hbWUgPSBTdXJ2ZXlIZWxwZXIuU1RBTkRBUkRfRk9OVDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9udE5hbWUgPSAnc2Vnb2UnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZm9udE5hbWUgPSBvcHRpb25zLmZvbnROYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICgodHlwZW9mIG9wdGlvbnMuZm9udE5hbWUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAodHlwZW9mIG9wdGlvbnMuYmFzZTY0Tm9ybWFsICE9PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiBvcHRpb25zLmJhc2U2NEJvbGQgIT09ICd1bmRlZmluZWQnKSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2Jhc2U2NE5vcm1hbCA9IG9wdGlvbnMuYmFzZTY0Tm9ybWFsIHx8IG9wdGlvbnMuYmFzZTY0Qm9sZDtcbiAgICAgICAgICAgIHRoaXMuX2Jhc2U2NEJvbGQgPSBvcHRpb25zLmJhc2U2NEJvbGQgfHwgb3B0aW9ucy5iYXNlNjROb3JtYWw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5mb250TmFtZSA9PT0gJ3NlZ29lJykge1xuICAgICAgICAgICAgLy8gdGhpcy5fYmFzZTY0Tm9ybWFsID0gRm9udHMuU0VHT0VfTk9STUFMO1xuICAgICAgICAgICAgLy8gdGhpcy5fYmFzZTY0Qm9sZCA9IEZvbnRzLlNFR09FX0JPTEQ7XG4gICAgICAgICAgICB0aGlzLl9iYXNlNjROb3JtYWwgPSBEb2NPcHRpb25zLlNFR09FX05PUk1BTDtcbiAgICAgICAgICAgIHRoaXMuX2Jhc2U2NEJvbGQgPSBEb2NPcHRpb25zLlNFR09FX0JPTEQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWFyZ2lucyA9IFN1cnZleUhlbHBlci5jbG9uZShvcHRpb25zLm1hcmdpbnMpO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX21hcmdpbnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXJnaW5zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9tYXJnaW5zLnRvcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcmdpbnMudG9wID0gMTAuMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX21hcmdpbnMuYm90ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fbWFyZ2lucy5ib3QgPSAxMC4wO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fbWFyZ2lucy5sZWZ0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fbWFyZ2lucy5sZWZ0ID0gMTAuMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX21hcmdpbnMucmlnaHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXJnaW5zLnJpZ2h0ID0gMTAuMDtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLl9tYXJnaW5zKS5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICg8YW55PnRoaXMuX21hcmdpbnMpW25hbWVdID0gKDxhbnk+dGhpcy5fbWFyZ2lucylbbmFtZV0gKiBEb2NPcHRpb25zLk1NX1RPX1BUO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5faHRtbFJlbmRlckFzID0gb3B0aW9ucy5odG1sUmVuZGVyQXMgfHwgJ2F1dG8nO1xuICAgICAgICB0aGlzLl9tYXRyaXhSZW5kZXJBcyA9IG9wdGlvbnMubWF0cml4UmVuZGVyQXMgfHwgJ2F1dG8nO1xuICAgICAgICB0aGlzLl9yZWFkb25seVJlbmRlckFzID0gb3B0aW9ucy5yZWFkb25seVJlbmRlckFzIHx8ICdhdXRvJztcbiAgICAgICAgdGhpcy5fY29tcHJlc3MgPSBvcHRpb25zLmNvbXByZXNzIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLl9hcHBseUltYWdlRml0ID0gb3B0aW9ucy5hcHBseUltYWdlRml0IHx8IGZhbHNlO1xuICAgICAgICB0aGlzLl91c2VMZWdhY3lCb29sZWFuUmVuZGVyaW5nID0gb3B0aW9ucy51c2VMZWdhY3lCb29sZWFuUmVuZGVyaW5nIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc1JUTCA9IG9wdGlvbnMuaXNSVEwgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuX3RhZ2JveFNlbGVjdGVkQ2hvaWNlc09ubHkgPSBvcHRpb25zLnRhZ2JveFNlbGVjdGVkQ2hvaWNlc09ubHkgfHwgZmFsc2U7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgbGVmdFRvcFBvaW50KCk6IElQb2ludCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogdGhpcy5tYXJnaW5zLmxlZnQsXG4gICAgICAgICAgICB5VG9wOiB0aGlzLm1hcmdpbnMudG9wXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9udFNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnRTaXplO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGZvbnROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250TmFtZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBiYXNlNjROb3JtYWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2U2NE5vcm1hbDtcbiAgICB9XG4gICAgcHVibGljIGdldCBiYXNlNjRCb2xkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iYXNlNjRCb2xkO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHVzZUN1c3RvbUZvbnRJbkh0bWwoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl91c2VDdXN0b21Gb250SW5IdG1sO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IG1hcmdpbnMoKTogSU1hcmdpbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXJnaW5zO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGZvcm1hdCgpOiBzdHJpbmcgfCBudW1iZXJbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb3JtYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgb3JpZW50YXRpb24oKTogJ2wnIHwgJ3AnIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29yaWVudGF0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGh0bWxSZW5kZXJBcygpOiBJSFRNTFJlbmRlclR5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5faHRtbFJlbmRlckFzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IG1hdHJpeFJlbmRlckFzKCk6ICdhdXRvJyB8ICdsaXN0JyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXRyaXhSZW5kZXJBcztcbiAgICB9XG4gICAgcHVibGljIGdldCByZWFkb25seVJlbmRlckFzKCk6ICdhdXRvJyB8ICd0ZXh0JyB8ICdhY3JvZm9ybScge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHlSZW5kZXJBcztcbiAgICB9XG4gICAgcHVibGljIGdldCBjb21wcmVzcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbXByZXNzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGFwcGx5SW1hZ2VGaXQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBseUltYWdlRml0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHVzZUxlZ2FjeUJvb2xlYW5SZW5kZXJpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl91c2VMZWdhY3lCb29sZWFuUmVuZGVyaW5nO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGlzUlRMKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNSVEw7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdGFnYm94U2VsZWN0ZWRDaG9pY2VzT25seSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhZ2JveFNlbGVjdGVkQ2hvaWNlc09ubHk7XG4gICAgfVxufVxuXG4vKipcbiAqIFRoZSBgRG9jQ29udHJvbGxlcmAgb2JqZWN0IGluY2x1ZGVzIGFuIEFQSSB0aGF0IGFsbG93cyB5b3UgdG8gY29uZmlndXJlIHRoZSByZXN1bHRpbmcgUERGIGRvY3VtZW50LiBZb3UgY2FuIGFjY2VzcyB0aGlzIG9iamVjdCB3aXRoaW4gZnVuY3Rpb25zIHRoYXQgaGFuZGxlIHRoZSBgU3VydmV5UERGYCdzIFtgb25SZW5kZXIuLi5gXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3N1cnZleXBkZiNvblJlbmRlckZvb3RlcikgZXZlbnRzLlxuICpcbiAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9ob3ctdG8tdXNlLWFkb3JuZXJzLWluLXBkZi1mb3Jtcy8gKGxpbmtTdHlsZSkpXG4gKi9cbmV4cG9ydCBjbGFzcyBEb2NDb250cm9sbGVyIGV4dGVuZHMgRG9jT3B0aW9ucyB7XG4gICAgcHJpdmF0ZSBfZG9jOiBqc1BERjtcbiAgICBwcml2YXRlIF9oZWxwZXJEb2M6IGpzUERGO1xuICAgIHByaXZhdGUgX2ZvbnRTdHlsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgbWFyZ2luc1N0YWNrOiBJTWFyZ2luTFJbXTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogSURvY09wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgICAgY29uc3QganNwZGZPcHRpb25zOiBqc1BERk9wdGlvbnMgPSB7XG4gICAgICAgICAgICBvcmllbnRhdGlvbjogdGhpcy5vcmllbnRhdGlvbixcbiAgICAgICAgICAgIHVuaXQ6ICdwdCcsXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuZm9ybWF0LFxuICAgICAgICAgICAgY29tcHJlc3M6IHRoaXMuY29tcHJlc3NcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fZG9jID0gbmV3IGpzUERGKGpzcGRmT3B0aW9ucyk7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5iYXNlNjROb3JtYWwgIT09ICd1bmRlZmluZWQnICYmICFTdXJ2ZXlIZWxwZXIuaXNGb250RXhpc3QodGhpcywgdGhpcy5mb250TmFtZSkpIHtcbiAgICAgICAgICAgIERvY0NvbnRyb2xsZXIuYWRkRm9udCh0aGlzLmZvbnROYW1lLCB0aGlzLmJhc2U2NE5vcm1hbCwgJ25vcm1hbCcpO1xuICAgICAgICAgICAgRG9jQ29udHJvbGxlci5hZGRGb250KHRoaXMuZm9udE5hbWUsIHRoaXMuYmFzZTY0Qm9sZCwgJ2JvbGQnKTtcbiAgICAgICAgICAgIHRoaXMuX2RvYyA9IG5ldyBqc1BERihqc3BkZk9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHNldFJhZGlvQXBwZWFyYW5jZSh0aGlzLl9kb2MpO1xuICAgICAgICB0aGlzLl91c2VDdXN0b21Gb250SW5IdG1sID0gb3B0aW9ucy51c2VDdXN0b21Gb250SW5IdG1sICYmIFN1cnZleUhlbHBlci5pc0ZvbnRFeGlzdCh0aGlzLCB0aGlzLmZvbnROYW1lKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jID0gbmV3IGpzUERGKGpzcGRmT3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX2RvYy5zZXRGb250KHRoaXMuZm9udE5hbWUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udCh0aGlzLmZvbnROYW1lKTtcbiAgICAgICAgdGhpcy5fZG9jLnNldEZvbnRTaXplKHRoaXMuZm9udFNpemUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udFNpemUodGhpcy5mb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2ZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICB0aGlzLm1hcmdpbnNTdGFjayA9IFtdO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGN1c3RvbUZvbnRzOiB7IFtuYW1lOiBzdHJpbmddOiB7IG5vcm1hbDogc3RyaW5nLCBib2xkOiBzdHJpbmcsIGl0YWxpYzogc3RyaW5nLCBib2xkaXRhbGljOiBzdHJpbmcgfSB9ID0ge307XG4gICAgcHVibGljIHN0YXRpYyBhZGRGb250KGZvbnROYW1lOiBzdHJpbmcsIGJhc2U2NDogc3RyaW5nLCBmb250U3R5bGU6ICdub3JtYWwnIHwgJ2JvbGQnIHwgJ2l0YWxpYycgfCAnYm9sZGl0YWxpYycpIHtcbiAgICAgICAgbGV0IGZvbnQgPSBEb2NDb250cm9sbGVyLmN1c3RvbUZvbnRzW2ZvbnROYW1lXTtcbiAgICAgICAgaWYgKCFmb250KSB7XG4gICAgICAgICAgICBmb250ID0gPGFueT57fTtcbiAgICAgICAgICAgIERvY0NvbnRyb2xsZXIuY3VzdG9tRm9udHNbZm9udE5hbWVdID0gZm9udDtcbiAgICAgICAgfVxuICAgICAgICBmb250W2ZvbnRTdHlsZV0gPSBiYXNlNjQ7XG4gICAgICAgIGNvbnN0IGFkZEZvbnRDYWxsYmFjazogKCkgPT4gdm9pZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUZvbnQgPSBEb2NDb250cm9sbGVyLmN1c3RvbUZvbnRzW2ZvbnROYW1lXTtcbiAgICAgICAgICAgIGlmICghIWN1c3RvbUZvbnQgJiYgISFjdXN0b21Gb250W2ZvbnRTdHlsZV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb250RmlsZTogc3RyaW5nID0gYCR7Zm9udE5hbWV9LSR7Zm9udFN0eWxlfS50dGZgO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmlsZVRvVkZTKGZvbnRGaWxlLCBjdXN0b21Gb250W2ZvbnRTdHlsZV0pO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRm9udChmb250RmlsZSwgZm9udE5hbWUsIGZvbnRTdHlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgICg8YW55PmpzUERGKS5BUEkuZXZlbnRzLnB1c2goWydhZGRGb250cycsIGFkZEZvbnRDYWxsYmFja10pO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGRvYygpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZG9jO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhlbHBlckRvYygpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVscGVyRG9jO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGZvbnROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250TmFtZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBmb250TmFtZShmb250TmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2ZvbnROYW1lID0gZm9udE5hbWU7XG4gICAgICAgIHRoaXMuX2RvYy5zZXRGb250KGZvbnROYW1lKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnQoZm9udE5hbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGZvbnRTaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250U2l6ZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBmb250U2l6ZShmb250U2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2ZvbnRTaXplID0gZm9udFNpemU7XG4gICAgICAgIHRoaXMuX2RvYy5zZXRGb250U2l6ZShmb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250U2l6ZShmb250U2l6ZSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9udFN0eWxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250U3R5bGU7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgZm9udFN0eWxlKGZvbnRTdHlsZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2ZvbnRTdHlsZSA9IGZvbnRTdHlsZTtcbiAgICAgICAgdGhpcy5fZG9jLnNldEZvbnQodGhpcy5fZm9udE5hbWUsIGZvbnRTdHlsZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250KHRoaXMuX2ZvbnROYW1lLCBmb250U3R5bGUpO1xuICAgIH1cbiAgICBwdWJsaWMgbWVhc3VyZVRleHQodGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcgfCBudW1iZXIgPSAxLCBmb250U3R5bGU6IHN0cmluZyA9IHRoaXMuX2ZvbnRTdHlsZSxcbiAgICAgICAgZm9udFNpemU6IG51bWJlciA9IHRoaXMuX2ZvbnRTaXplKTogSVNpemUge1xuICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5faGVscGVyRG9jLmdldEZvbnRTaXplKCk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250U2l6ZShmb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250KHRoaXMuX2ZvbnROYW1lLCBmb250U3R5bGUpO1xuICAgICAgICBjb25zdCBoZWlnaHQ6IG51bWJlciA9IHRoaXMuX2hlbHBlckRvYy5nZXRMaW5lSGVpZ2h0KCkgLyB0aGlzLl9oZWxwZXJEb2MuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgIGxldCB3aWR0aDogbnVtYmVyID0gMC4wO1xuICAgICAgICBpZiAodHlwZW9mIHRleHQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB3aWR0aCA9IGhlaWdodCAqIHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0ZXh0ID0gdHlwZW9mIHRleHQgPT09ICdzdHJpbmcnID8gdGV4dCA6IFN1cnZleUhlbHBlci5nZXRMb2NTdHJpbmcodGV4dCk7XG4gICAgICAgICAgICB3aWR0aCA9IHRleHQuc3BsaXQoJycpLnJlZHVjZSgoc206IG51bWJlciwgY3I6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgICBzbSArIHRoaXMuX2hlbHBlckRvYy5nZXRUZXh0V2lkdGgoY3IpLCAwLjApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250U2l6ZShvbGRGb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250KHRoaXMuX2ZvbnROYW1lLCAnbm9ybWFsJyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGhlaWdodFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgd2lkdGggb2Ygb25lIGNoYXJhY3RlciBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgcHVibGljIGdldCB1bml0V2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVhc3VyZVRleHQoKS53aWR0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGhlaWd0aCBvZiBvbmUgY2hhcmFjdGVyIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHVuaXRIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVhc3VyZVRleHQoKS5oZWlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBwdXNoTWFyZ2lucyhsZWZ0PzogbnVtYmVyLCByaWdodD86IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcmdpbnNTdGFjay5wdXNoKHsgbGVmdDogdGhpcy5tYXJnaW5zLmxlZnQsIHJpZ2h0OiB0aGlzLm1hcmdpbnMucmlnaHQgfSk7XG4gICAgICAgIGlmICh0eXBlb2YgbGVmdCAhPT0gJ3VuZGVmaW5lZCcpIHRoaXMubWFyZ2lucy5sZWZ0ID0gbGVmdDtcbiAgICAgICAgaWYgKHR5cGVvZiByaWdodCAhPT0gJ3VuZGVmaW5lZCcpIHRoaXMubWFyZ2lucy5yaWdodCA9IHJpZ2h0O1xuICAgIH1cbiAgICBwdWJsaWMgcG9wTWFyZ2lucygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWFyZ2luczogSU1hcmdpbkxSID0gdGhpcy5tYXJnaW5zU3RhY2sucG9wKCk7XG4gICAgICAgIHRoaXMubWFyZ2lucy5sZWZ0ID0gbWFyZ2lucy5sZWZ0O1xuICAgICAgICB0aGlzLm1hcmdpbnMucmlnaHQgPSBtYXJnaW5zLnJpZ2h0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgd2lkdGggb2YgYSBQREYgcGFnZSBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgcHVibGljIGdldCBwYXBlcldpZHRoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGhlaWdodCBvZiBhIFBERiBwYWdlIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhcGVySGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXROdW1iZXJPZlBhZ2VzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5nZXROdW1iZXJPZlBhZ2VzKCk7XG4gICAgfVxuICAgIHB1YmxpYyBhZGRQYWdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRvYy5hZGRQYWdlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRDdXJyZW50UGFnZUluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyIC0gMTtcbiAgICB9XG4gICAgcHVibGljIHNldFBhZ2UoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmRvYy5zZXRQYWdlKGluZGV4ICsgMSk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2RvY19jb250cm9sbGVyLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBSYWRpb0dyb3VwV3JhcCwgUmFkaW9JdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9yYWRpb2l0ZW0nO1xuaW1wb3J0IHsgRmxhdFNlbGVjdEJhc2UgfSBmcm9tICcuL2ZsYXRfc2VsZWN0YmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0UmFkaW9ncm91cCBleHRlbmRzIEZsYXRTZWxlY3RCYXNlIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsO1xuICAgIHByaXZhdGUgcmFkaW9Hcm91cFdyYXA6IFJhZGlvR3JvdXBXcmFwO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgaXNJdGVtU2VsZWN0ZWQoaXRlbTogSXRlbVZhbHVlLCBjaGVja2VkPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHR5cGVvZiBjaGVja2VkID09PSAndW5kZWZpbmVkJykgP1xuICAgICAgICAgICAgKGl0ZW0gPT09IHRoaXMucXVlc3Rpb24ub3RoZXJJdGVtID8gdGhpcy5xdWVzdGlvbi5pc090aGVyU2VsZWN0ZWQgOlxuICAgICAgICAgICAgICAgIChpdGVtLnZhbHVlID09PSB0aGlzLnF1ZXN0aW9uLnZhbHVlIHx8XG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgdGhpcy5xdWVzdGlvbi5pc0l0ZW1TZWxlY3RlZCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uaXNJdGVtU2VsZWN0ZWQoaXRlbSkpKSkgOiBjaGVja2VkO1xuICAgIH1cbiAgICBwdWJsaWMgZ2VuZXJhdGVGbGF0SXRlbShyZWN0OiBJUmVjdCwgaXRlbTogSXRlbVZhbHVlLFxuICAgICAgICBpbmRleDogbnVtYmVyLCBrZXk/OiBzdHJpbmcsIGNoZWNrZWQ/OiBib29sZWFuLCBjb250ZXh0OiBhbnkgPSB7fSk6IElQZGZCcmljayB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5yYWRpb0dyb3VwV3JhcCA9IG5ldyBSYWRpb0dyb3VwV3JhcCh0aGlzLnF1ZXN0aW9uLmlkICsgKCh0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJykgPyAnJyA6IGtleSksXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCB7IHJlYWRPbmx5OiB0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHksIHF1ZXN0aW9uOiB0aGlzLnF1ZXN0aW9uLCAuLi5jb250ZXh0IH0pO1xuICAgICAgICAgICAgKDxhbnk+dGhpcy5xdWVzdGlvbikucGRmUmFkaW9Hcm91cFdyYXAgPSB0aGlzLnJhZGlvR3JvdXBXcmFwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLnJhZGlvR3JvdXBXcmFwID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5yYWRpb0dyb3VwV3JhcCA9ICg8YW55PnRoaXMucXVlc3Rpb24pLnBkZlJhZGlvR3JvdXBXcmFwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzQ2hlY2tlZDogYm9vbGVhbiA9IHRoaXMuaXNJdGVtU2VsZWN0ZWQoaXRlbSwgY2hlY2tlZCk7XG4gICAgICAgIHJldHVybiBuZXcgUmFkaW9JdGVtQnJpY2sodGhpcy5jb250cm9sbGVyLCByZWN0LFxuICAgICAgICAgICAgeyBxdWVzdGlvbjogdGhpcy5xdWVzdGlvbiwgaW5kZXg6IGluZGV4LCBjaGVja2VkOiBpc0NoZWNrZWQsIGl0ZW06IGl0ZW0gfSwgdGhpcy5yYWRpb0dyb3VwV3JhcCk7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdyYWRpb2dyb3VwJywgRmxhdFJhZGlvZ3JvdXApO1xuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignYnV0dG9uZ3JvdXAnLCBGbGF0UmFkaW9ncm91cCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcmFkaW9ncm91cC50cyIsImltcG9ydCB7IElFbGVtZW50LCBRdWVzdGlvbiwgUGFuZWxNb2RlbEJhc2UsIFBhbmVsTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgUm93bGluZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfcm93bGluZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IEFkb3JuZXJzUGFuZWxPcHRpb25zLCBBZG9ybmVyc1BhZ2VPcHRpb25zIH0gZnJvbSAnLi4vZXZlbnRfaGFuZGxlci9hZG9ybmVycyc7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4uL2VudHJpZXMvcGRmJztcbmltcG9ydCAqIGFzIFN1cnZleVBERk1vZHVsZSBmcm9tICcuLi9lbnRyaWVzL3BkZic7XG5cbmV4cG9ydCBjbGFzcyBGbGF0U3VydmV5IHtcbiAgICBwdWJsaWMgc3RhdGljIFFVRVNfR0FQX1ZFUlRfU0NBTEU6IG51bWJlciA9IDEuNTtcbiAgICBwdWJsaWMgc3RhdGljIFBBTkVMX0NPTlRfR0FQX1NDQUxFOiBudW1iZXIgPSAxLjA7XG4gICAgcHVibGljIHN0YXRpYyBQQU5FTF9ERVNDX0dBUF9TQ0FMRTogbnVtYmVyID0gMC4yNTtcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGdlbmVyYXRlRmxhdHNQYW5lbChzdXJ2ZXk6IFN1cnZleVBERiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcGFuZWw6IFBhbmVsTW9kZWwsIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHBhbmVsRmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IHBhbmVsQ29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IGNvbnRyb2xsZXIubWVhc3VyZVRleHQocGFuZWwuaW5uZXJJbmRlbnQpLndpZHRoO1xuICAgICAgICBwYW5lbENvbnRlbnRQb2ludC54TGVmdCArPSBjb250cm9sbGVyLm1lYXN1cmVUZXh0KHBhbmVsLmlubmVySW5kZW50KS53aWR0aDtcbiAgICAgICAgcGFuZWxGbGF0cy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1BhZ2VQYW5lbChzdXJ2ZXksXG4gICAgICAgICAgICBjb250cm9sbGVyLCBwYW5lbCwgcGFuZWxDb250ZW50UG9pbnQpKTtcbiAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIGNvbnN0IGFkb3JuZXJzT3B0aW9uczogQWRvcm5lcnNQYW5lbE9wdGlvbnMgPSBuZXcgQWRvcm5lcnNQYW5lbE9wdGlvbnMocG9pbnQsXG4gICAgICAgICAgICBwYW5lbEZsYXRzLCBwYW5lbCwgY29udHJvbGxlciwgRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKSwgU3VydmV5UERGTW9kdWxlKTtcbiAgICAgICAgYXdhaXQgc3VydmV5Lm9uUmVuZGVyUGFuZWwuZmlyZShzdXJ2ZXksIGFkb3JuZXJzT3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBbLi4uYWRvcm5lcnNPcHRpb25zLmJyaWNrc107XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIGdlbmVyYXRlRmxhdHNQYWdlUGFuZWwoc3VydmV5OiBTdXJ2ZXlQREYsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHBhZ2VQYW5lbDogUGFuZWxNb2RlbEJhc2UsIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGlmICghcGFnZVBhbmVsLmlzVmlzaWJsZSkgcmV0dXJuO1xuICAgICAgICBwYWdlUGFuZWwub25GaXJzdFJlbmRlcmluZygpO1xuICAgICAgICBjb25zdCBwYWdlUGFuZWxGbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgbGV0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgaWYgKHBhZ2VQYW5lbC5nZXRUeXBlKCkgIT09ICdwYWdlJyB8fCBzdXJ2ZXkuc2hvd1BhZ2VUaXRsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgICAgICBpZiAocGFnZVBhbmVsLnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhZ2VQYW5lbCBpbnN0YW5jZW9mIFBhbmVsTW9kZWwgJiYgcGFnZVBhbmVsLm5vKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRpdGxlUGFuZWxGbGF0KFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LCBjb250cm9sbGVyLCBwYWdlUGFuZWwubm8sIHBhZ2VQYW5lbC5nZXRUeXBlKCkgPT09ICdwYWdlJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sobm9GbGF0KTtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gbm9GbGF0LnhSaWdodCArIGNvbnRyb2xsZXIubWVhc3VyZVRleHQoJyAnKS53aWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZWxQYW5lbFRpdGxlRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRpdGxlUGFuZWxGbGF0KFxuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQsIGNvbnRyb2xsZXIsIHBhZ2VQYW5lbC5sb2NUaXRsZSwgcGFnZVBhbmVsLmdldFR5cGUoKSA9PT0gJ3BhZ2UnKTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKHBhZ2VsUGFuZWxUaXRsZUZsYXQpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChwYWdlbFBhbmVsVGl0bGVGbGF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYWdlUGFuZWwuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocGFnZVBhbmVsLnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFN1cnZleS5QQU5FTF9ERVNDX0dBUF9TQ0FMRTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZVBhbmVsRGVzY0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVEZXNjRmxhdChcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LCBudWxsLCBjb250cm9sbGVyLCBwYWdlUGFuZWwubG9jRGVzY3JpcHRpb24pO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2socGFnZVBhbmVsRGVzY0ZsYXQpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChwYWdlUGFuZWxEZXNjRmxhdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNvbXBvc2l0ZUZsYXQuaXNFbXB0eSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvd0xpbmVQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KHJvd0xpbmVQb2ludCwgY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgIHBhZ2VQYW5lbEZsYXRzLnB1c2goY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0SGVpZ2h0ICogRmxhdFN1cnZleS5QQU5FTF9DT05UX0dBUF9TQ0FMRSArIFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHBhZ2VQYW5lbC5yb3dzKSB7XG4gICAgICAgICAgICBpZiAoIXJvdy52aXNpYmxlKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgbGV0IG5leHRNYXJnaW5MZWZ0OiBudW1iZXIgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGNvbnN0IHJvd0ZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgdmlzaWJsZUVsZW1lbnRzID0gcm93LmVsZW1lbnRzLmZpbHRlcihlbCA9PiBlbC5pc1Zpc2libGUpO1xuICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHZpc2libGVFbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50OiBJRWxlbWVudCA9IHZpc2libGVFbGVtZW50c1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQuaXNWaXNpYmxlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwZXJzV2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKGVsZW1lbnQucmVuZGVyV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoIC0gKHZpc2libGVFbGVtZW50cy5sZW5ndGggLSAxKSAqIGNvbnRyb2xsZXIudW5pdFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlRWxlbWVudHMubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IG5leHRNYXJnaW5MZWZ0ICsgKChpICE9PSAwKSA/IGNvbnRyb2xsZXIudW5pdFdpZHRoIDogMCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ID0gY29udHJvbGxlci5wYXBlcldpZHRoIC0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBwZXJzV2lkdGg7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICAgICAgbmV4dE1hcmdpbkxlZnQgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCArIHBlcnNXaWR0aDtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBhbmVsTW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcm93RmxhdHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNQYW5lbChcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgZWxlbWVudCwgY3VyclBvaW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByb3dGbGF0cy5wdXNoKC4uLmF3YWl0IFN1cnZleUhlbHBlci5nZW5lcmF0ZVF1ZXN0aW9uRmxhdHMoc3VydmV5LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgPFF1ZXN0aW9uPmVsZW1lbnQsIGN1cnJQb2ludCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICBpZiAocm93RmxhdHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi5yb3dGbGF0cykueUJvdDtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBwb2ludC54TGVmdDtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0U3VydmV5LlFVRVNfR0FQX1ZFUlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgcGFnZVBhbmVsRmxhdHMucHVzaCguLi5yb3dGbGF0cyk7XG4gICAgICAgICAgICAgICAgcGFnZVBhbmVsRmxhdHMucHVzaChTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoY3VyclBvaW50LCBjb250cm9sbGVyKSk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhZ2VQYW5lbEZsYXRzO1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBwb3BSb3dsaW5lcyhmbGF0czogSVBkZkJyaWNrW10pIHtcbiAgICAgICAgd2hpbGUgKGZsYXRzLmxlbmd0aCA+IDAgJiYgZmxhdHNbZmxhdHMubGVuZ3RoIC0gMV0gaW5zdGFuY2VvZiBSb3dsaW5lQnJpY2spIHtcbiAgICAgICAgICAgIGZsYXRzLnBvcCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIGdlbmVyYXRlRmxhdFRpdGxlKHN1cnZleTogU3VydmV5UERGLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBwb2ludDogSVBvaW50KTogUHJvbWlzZTxDb21wb3NpdGVCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBpZiAoc3VydmV5LnNob3dUaXRsZSkge1xuICAgICAgICAgICAgaWYgKHN1cnZleS50aXRsZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1cnZleVRpdGxlRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRpdGxlU3VydmV5RmxhdChcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQsIGNvbnRyb2xsZXIsIHN1cnZleS5sb2NUaXRsZSk7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhzdXJ2ZXlUaXRsZUZsYXQpO1xuICAgICAgICAgICAgICAgIHBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHN1cnZleVRpdGxlRmxhdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3VydmV5LmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN1cnZleS50aXRsZSkge1xuICAgICAgICAgICAgICAgICAgICBwb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFN1cnZleS5QQU5FTF9ERVNDX0dBUF9TQ0FMRTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlRGVzY0ZsYXQoXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LCBudWxsLCBjb250cm9sbGVyLCBzdXJ2ZXkubG9jRGVzY3JpcHRpb24pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVGbGF0TG9nb0ltYWdlKHN1cnZleTogU3VydmV5UERGLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgbG9nb1VybCA9IFN1cnZleUhlbHBlci5nZXRMb2NTdHJpbmcoc3VydmV5LmxvY0xvZ28pO1xuICAgICAgICBjb25zdCBsb2dvU2l6ZSA9IGF3YWl0IFN1cnZleUhlbHBlci5nZXRDb3JyZWN0ZWRJbWFnZVNpemUoY29udHJvbGxlciwgeyBpbWFnZUxpbms6IGxvZ29VcmwsIGltYWdlSGVpZ2h0OiBzdXJ2ZXkubG9nb0hlaWdodCwgaW1hZ2VXaWR0aDogc3VydmV5LmxvZ29XaWR0aCB9KTtcbiAgICAgICAgY29uc3QgbG9nb0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQoXG4gICAgICAgICAgICBwb2ludCwgbnVsbCwgY29udHJvbGxlciwgeyBsaW5rOiBsb2dvVXJsLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBsb2dvU2l6ZS53aWR0aCwgaGVpZ2h0OiBsb2dvU2l6ZS5oZWlnaHQgfSk7XG4gICAgICAgIGxldCBzaGlmdDogbnVtYmVyID0gMDtcbiAgICAgICAgaWYgKHN1cnZleS5sb2dvUG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgIHNoaWZ0ID0gU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSAtIGxvZ29GbGF0LndpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN1cnZleS5sb2dvUG9zaXRpb24gIT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgc2hpZnQgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpIC8gMi4wIC0gbG9nb0ZsYXQud2lkdGggLyAyLjA7XG4gICAgICAgIH1cbiAgICAgICAgbG9nb0ZsYXQueExlZnQgKz0gc2hpZnQ7XG4gICAgICAgIGxvZ29GbGF0LnhSaWdodCArPSBzaGlmdDtcbiAgICAgICAgcmV0dXJuIGxvZ29GbGF0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGdlbmVyYXRlRmxhdHMoc3VydmV5OiBTdXJ2ZXlQREYsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBQcm9taXNlPElQZGZCcmlja1tdW10+IHtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdW10gPSBbXTtcbiAgICAgICAgaWYgKCFzdXJ2ZXkuaGFzTG9nbykge1xuICAgICAgICAgICAgY29uc3QgdGl0bGVGbGF0OiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0VGl0bGUoXG4gICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBjb250cm9sbGVyLmxlZnRUb3BQb2ludCk7XG4gICAgICAgICAgICBpZiAoIXRpdGxlRmxhdC5pc0VtcHR5KSBmbGF0cy5wdXNoKFt0aXRsZUZsYXRdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdXJ2ZXkuaXNMb2dvQmVmb3JlKSB7XG4gICAgICAgICAgICBjb25zdCBsb2dvRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRMb2dvSW1hZ2UoXG4gICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBjb250cm9sbGVyLmxlZnRUb3BQb2ludCk7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKFtsb2dvRmxhdF0pO1xuICAgICAgICAgICAgY29uc3QgdGl0bGVQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGxvZ29GbGF0LFxuICAgICAgICAgICAgICAgIHN1cnZleS5sb2dvUG9zaXRpb24gPT09ICd0b3AnLCBzdXJ2ZXkubG9nb1Bvc2l0aW9uICE9PSAndG9wJyk7XG4gICAgICAgICAgICBpZiAoc3VydmV5LmxvZ29Qb3NpdGlvbiAhPT0gJ3RvcCcpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgdGl0bGVQb2ludC54TGVmdCArPSBjb250cm9sbGVyLnVuaXRXaWR0aDtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMubGVmdCArPSBsb2dvRmxhdC53aWR0aCArIGNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGl0bGVQb2ludC54TGVmdCA9IGNvbnRyb2xsZXIubGVmdFRvcFBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgIHRpdGxlUG9pbnQueVRvcCArPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgLyAyLjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRUaXRsZShcbiAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIHRpdGxlUG9pbnQpO1xuICAgICAgICAgICAgaWYgKHN1cnZleS5sb2dvUG9zaXRpb24gIT09ICd0b3AnKSBjb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGlmICghdGl0bGVGbGF0LmlzRW1wdHkpIGZsYXRzWzBdLnB1c2godGl0bGVGbGF0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzdXJ2ZXkubG9nb1Bvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9nb0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0TG9nb0ltYWdlKFxuICAgICAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIubGVmdFRvcFBvaW50KTtcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKFtsb2dvRmxhdF0pO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKz0gbG9nb0ZsYXQud2lkdGggKyBjb250cm9sbGVyLnVuaXRXaWR0aDtcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRUaXRsZShcbiAgICAgICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBjb250cm9sbGVyLmxlZnRUb3BQb2ludCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aXRsZUZsYXQuaXNFbXB0eSkgZmxhdHNbMF0udW5zaGlmdCh0aXRsZUZsYXQpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGVGbGF0OiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0VGl0bGUoXG4gICAgICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgY29udHJvbGxlci5sZWZ0VG9wUG9pbnQpO1xuICAgICAgICAgICAgICAgIGxldCBsb2dvUG9pbnQ6IElQb2ludCA9IGNvbnRyb2xsZXIubGVmdFRvcFBvaW50O1xuICAgICAgICAgICAgICAgIGlmICghdGl0bGVGbGF0LmlzRW1wdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhdHMucHVzaChbdGl0bGVGbGF0XSk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ29Qb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludCh0aXRsZUZsYXQpO1xuICAgICAgICAgICAgICAgICAgICBsb2dvUG9pbnQueVRvcCArPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgLyAyLjA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ29GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdExvZ29JbWFnZShcbiAgICAgICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBsb2dvUG9pbnQpO1xuICAgICAgICAgICAgICAgIGlmIChmbGF0cy5sZW5ndGggIT09IDApIGZsYXRzWzBdLnB1c2gobG9nb0ZsYXQpO1xuICAgICAgICAgICAgICAgIGVsc2UgZmxhdHMucHVzaChbbG9nb0ZsYXRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcG9pbnQ6IElQb2ludCA9IGNvbnRyb2xsZXIubGVmdFRvcFBvaW50O1xuICAgICAgICBpZiAoZmxhdHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBwb2ludC55VG9wID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLmZsYXRzWzBdKSkueVRvcDtcbiAgICAgICAgICAgIGZsYXRzWzBdLnB1c2goU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KHBvaW50LCBjb250cm9sbGVyKSk7XG4gICAgICAgICAgICBwb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRTdXJ2ZXkuUEFORUxfQ09OVF9HQVBfU0NBTEUgKyBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc3VydmV5LnZpc2libGVQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc3VydmV5LmN1cnJlbnRQYWdlID0gc3VydmV5LnZpc2libGVQYWdlc1tpXTtcbiAgICAgICAgICAgIGxldCBwYWdlRmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgICAgICBwYWdlRmxhdHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNQYWdlUGFuZWwoXG4gICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBzdXJ2ZXkudmlzaWJsZVBhZ2VzW2ldLCBwb2ludCkpO1xuICAgICAgICAgICAgY29uc3QgYWRvcm5lcnNPcHRpb25zOiBBZG9ybmVyc1BhZ2VPcHRpb25zID0gbmV3IEFkb3JuZXJzUGFnZU9wdGlvbnMocG9pbnQsXG4gICAgICAgICAgICAgICAgcGFnZUZsYXRzLCBzdXJ2ZXkudmlzaWJsZVBhZ2VzW2ldLCBjb250cm9sbGVyLCBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLCBTdXJ2ZXlQREZNb2R1bGUpO1xuICAgICAgICAgICAgYXdhaXQgc3VydmV5Lm9uUmVuZGVyUGFnZS5maXJlKHN1cnZleSwgYWRvcm5lcnNPcHRpb25zKTtcbiAgICAgICAgICAgIHBhZ2VGbGF0cyA9IFsuLi5hZG9ybmVyc09wdGlvbnMuYnJpY2tzXTtcbiAgICAgICAgICAgIGlmIChpID09PSAwICYmIGZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGZsYXRzWzBdLnB1c2goLi4ucGFnZUZsYXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgZmxhdHMucHVzaChwYWdlRmxhdHMpO1xuICAgICAgICAgICAgdGhpcy5wb3BSb3dsaW5lcyhmbGF0c1tmbGF0cy5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICBwb2ludC55VG9wID0gY29udHJvbGxlci5sZWZ0VG9wUG9pbnQueVRvcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmxhdHM7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3N1cnZleS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBRdWVzdGlvbkNoZWNrYm94TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgSVNpemUsIERvY0NvbnRyb2xsZXIsIElQb2ludCB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljaywgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcblxuZXhwb3J0IGludGVyZmFjZSBJQ2hlY2tJdGVtQnJpY2tDb250ZXh0IHtcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uO1xuICAgIHJlYWRPbmx5OiBib29sZWFuO1xuICAgIGNoZWNrZWQ6IGJvb2xlYW47XG4gICAgaXRlbT86IEl0ZW1WYWx1ZTtcbiAgICBpbmRleD86IG51bWJlcjtcbn1cbmV4cG9ydCBjbGFzcyBDaGVja0l0ZW1CcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBGT05UX1NJWkVfU0NBTEU6IG51bWJlciA9IDAuNztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDSEVDS01BUktfUkVBRE9OTFlfU1lNQk9MOiBzdHJpbmcgPSAnMyc7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ0hFQ0tNQVJLX1JFQURPTkxZX0ZPTlQ6IHN0cmluZyA9ICd6YXBmZGluZ2JhdHMnO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ0hFQ0tNQVJLX1JFQURPTkxZX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS4wIC0gTWF0aC5FIC8gMTAuMDtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBmaWVsZE5hbWU6IHN0cmluZywgcHJvdGVjdGVkIGNvbnRleHQ6IElDaGVja0l0ZW1Ccmlja0NvbnRleHQpIHtcbiAgICAgICAgc3VwZXIoY29udGV4dC5xdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25DaGVja2JveE1vZGVsPnRoaXMuY29udGV4dC5xdWVzdGlvbjtcbiAgICAgICAgdGhpcy50ZXh0Q29sb3IgPSB0aGlzLmZvcm1Cb3JkZXJDb2xvcjtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldFNob3VsZFJlbmRlclJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LnJlYWRPbmx5ICYmIFN1cnZleUhlbHBlci5nZXRSZWFkb25seVJlbmRlckFzKFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyKSAhPT0gJ2Fjcm9mb3JtJyB8fCB0aGlzLmNvbnRyb2xsZXIuY29tcHJlc3M7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgY2hlY2tCb3g6IGFueSA9IG5ldyAoPGFueT50aGlzLmNvbnRyb2xsZXIuZG9jLkFjcm9Gb3JtQ2hlY2tCb3gpKCk7XG4gICAgICAgIGNvbnN0IGZvcm1TY2FsZTogbnVtYmVyID0gU3VydmV5SGVscGVyLmZvcm1TY2FsZSh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7fTtcbiAgICAgICAgb3B0aW9ucy5tYXhGb250U2l6ZSA9IHRoaXMuaGVpZ2h0ICogZm9ybVNjYWxlICogQ2hlY2tJdGVtQnJpY2suRk9OVF9TSVpFX1NDQUxFO1xuICAgICAgICBvcHRpb25zLmNhcHRpb24gPSBDaGVja0l0ZW1Ccmljay5DSEVDS01BUktfUkVBRE9OTFlfU1lNQk9MO1xuICAgICAgICBvcHRpb25zLnRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICBvcHRpb25zLmZpZWxkTmFtZSA9IHRoaXMuZmllbGROYW1lO1xuICAgICAgICBvcHRpb25zLnJlYWRPbmx5ID0gdGhpcy5jb250ZXh0LnJlYWRPbmx5O1xuICAgICAgICBvcHRpb25zLmNvbG9yID0gdGhpcy5mb3JtQm9yZGVyQ29sb3I7XG4gICAgICAgIG9wdGlvbnMudmFsdWUgPSB0aGlzLmNvbnRleHQuY2hlY2tlZCA/ICdPbicgOiBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5BUyA9IHRoaXMuY29udGV4dC5jaGVja2VkID8gJy9PbicgOiAnL09mZic7XG4gICAgICAgIG9wdGlvbnMuY29udGV4dCA9IHRoaXMuY29udGV4dDtcblxuICAgICAgICBvcHRpb25zLlJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdCh0aGlzLCBmb3JtU2NhbGUpKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5hZGRGaWVsZChjaGVja0JveCk7XG4gICAgICAgICg8U3VydmV5UERGPnRoaXMucXVlc3Rpb24uc3VydmV5KT8uZ2V0VXBkYXRlZENoZWNrSXRlbUFjcm9mb3JtT3B0aW9ucyhvcHRpb25zKTtcblxuICAgICAgICBjaGVja0JveC5tYXhGb250U2l6ZSA9IG9wdGlvbnMubWF4Rm9udFNpemU7XG4gICAgICAgIGNoZWNrQm94LmNhcHRpb24gPSBvcHRpb25zLmNhcHRpb247XG4gICAgICAgIGNoZWNrQm94LnRleHRBbGlnbiA9IG9wdGlvbnMudGV4dEFsaWduO1xuICAgICAgICBjaGVja0JveC5maWVsZE5hbWUgPSBvcHRpb25zLmZpZWxkTmFtZTtcbiAgICAgICAgY2hlY2tCb3gucmVhZE9ubHkgPSBvcHRpb25zLnJlYWRPbmx5O1xuICAgICAgICBjaGVja0JveC5jb2xvciA9IG9wdGlvbnMuY29sb3I7XG4gICAgICAgIGNoZWNrQm94LnZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICAgICAgY2hlY2tCb3guQVMgPSBvcHRpb25zLkFTO1xuICAgICAgICBjaGVja0JveC5SZWN0ID0gb3B0aW9ucy5SZWN0O1xuXG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyUmVhZE9ubHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0LmNoZWNrZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrbWFya1BvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQodGhpcywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBvbGRGb250TmFtZTogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmZvbnROYW1lO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnROYW1lID0gQ2hlY2tJdGVtQnJpY2suQ0hFQ0tNQVJLX1JFQURPTkxZX0ZPTlQ7XG4gICAgICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKlxuICAgICAgICAgICAgICAgIENoZWNrSXRlbUJyaWNrLkNIRUNLTUFSS19SRUFET05MWV9GT05UX1NJWkVfU0NBTEU7XG4gICAgICAgICAgICBjb25zdCBjaGVja21hcmtTaXplOiBJU2l6ZSA9IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChcbiAgICAgICAgICAgICAgICBDaGVja0l0ZW1Ccmljay5DSEVDS01BUktfUkVBRE9OTFlfU1lNQk9MKTtcbiAgICAgICAgICAgIGNoZWNrbWFya1BvaW50LnhMZWZ0ICs9IHRoaXMud2lkdGggLyAyLjAgLSBjaGVja21hcmtTaXplLndpZHRoIC8gMi4wO1xuICAgICAgICAgICAgY2hlY2ttYXJrUG9pbnQueVRvcCArPSB0aGlzLmhlaWdodCAvIDIuMCAtIGNoZWNrbWFya1NpemUuaGVpZ2h0IC8gMi4wO1xuICAgICAgICAgICAgY29uc3QgY2hlY2ttYXJrRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgICAgIGNoZWNrbWFya1BvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgQ2hlY2tJdGVtQnJpY2suQ0hFQ0tNQVJLX1JFQURPTkxZX1NZTUJPTCwgVGV4dEJyaWNrKTtcbiAgICAgICAgICAgICg8YW55PmNoZWNrbWFya0ZsYXQudW5mb2xkKClbMF0pLnRleHRDb2xvciA9IHRoaXMudGV4dENvbG9yO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgICAgICBhd2FpdCBjaGVja21hcmtGbGF0LnJlbmRlcigpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnROYW1lID0gb2xkRm9udE5hbWU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2NoZWNraXRlbS50cyIsImltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgRG9jQ29udHJvbGxlciwgSVJlY3QgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEVtcHR5QnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJpdmF0ZSBpc0JvcmRlclZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKHJlY3Q6IElSZWN0LFxuICAgICAgICBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciA9IG51bGwsXG4gICAgICAgIGlzQm9yZGVyVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKG51bGwsIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLmlzQm9yZGVyVmlzaWJsZSA9IGlzQm9yZGVyVmlzaWJsZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2l6ZUJvcmRlcihpc0luY3JlYXNlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvZWY6IG51bWJlciA9IGlzSW5jcmVhc2UgPyAxIDogLTE7XG4gICAgICAgIGNvbnN0IGJvcmRlclBhZGRpbmc6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5kb2MuZ2V0Rm9udFNpemUoKSAqIFN1cnZleUhlbHBlci5WQUxVRV9SRUFET05MWV9QQURESU5HX1NDQUxFO1xuICAgICAgICB0aGlzLnhMZWZ0IC09IGNvZWYgKiBib3JkZXJQYWRkaW5nO1xuICAgICAgICB0aGlzLnhSaWdodCArPSBjb2VmICogYm9yZGVyUGFkZGluZztcbiAgICAgICAgdGhpcy55Qm90ICs9IGNvZWYgKiBib3JkZXJQYWRkaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNCb3JkZXJWaXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZUJvcmRlcih0cnVlKTtcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5yZXNpemVCb3JkZXIoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9lbXB0eS50cyIsImltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dCc7XG5cbmV4cG9ydCBjbGFzcyBUZXh0Qm9sZEJyaWNrIGV4dGVuZHMgVGV4dEJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHRleHQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCwgdGV4dCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTdHlsZSA9ICdib2xkJztcbiAgICAgICAgYXdhaXQgc3VwZXIucmVuZGVySW50ZXJhY3RpdmUoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGJvbGQudHMiLCJleHBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuZXhwb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5leHBvcnQgeyBJUG9pbnQsIElSZWN0LCBJU2l6ZSwgSU1hcmdpbkxSLCBJTWFyZ2luLCBJRG9jT3B0aW9ucywgRG9jT3B0aW9ucywgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmV4cG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9yZXBvc2l0b3J5JztcbmV4cG9ydCB7IElGbGF0UXVlc3Rpb24sIEZsYXRRdWVzdGlvbiB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfcXVlc3Rpb24nO1xuZXhwb3J0IHsgRmxhdFF1ZXN0aW9uRGVmYXVsdCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfZGVmYXVsdCc7XG5leHBvcnQgeyBGbGF0Qm9vbGVhbkNoZWNrYm94IGFzIEZsYXRCb29sZWFuIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9ib29sZWFuJztcbmV4cG9ydCB7IEZsYXRDaGVja2JveCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfY2hlY2tib3gnO1xuZXhwb3J0IHsgRmxhdEN1c3RvbU1vZGVsIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9jdXN0b21fbW9kZWwnO1xuZXhwb3J0IHsgRmxhdENvbW1lbnQgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2NvbW1lbnQnO1xuZXhwb3J0IHsgRmxhdERyb3Bkb3duIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9kcm9wZG93bic7XG5leHBvcnQgeyBGbGF0RXhwcmVzc2lvbiB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfZXhwcmVzc2lvbic7XG5leHBvcnQgeyBGbGF0RmlsZSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfZmlsZSc7XG5leHBvcnQgeyBGbGF0SFRNTCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfaHRtbCc7XG5leHBvcnQgeyBGbGF0SW1hZ2UgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2ltYWdlJztcbmV4cG9ydCB7IEZsYXRJbWFnZVBpY2tlciB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2VwaWNrZXInO1xuZXhwb3J0IHsgRmxhdFBhbmVsRHluYW1pYyB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfcGFuZWxkeW5hbWljJztcbmV4cG9ydCB7IEZsYXRSYWRpb2dyb3VwIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9yYWRpb2dyb3VwJztcbmV4cG9ydCB7IEZsYXRSYW5raW5nIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9yYW5raW5nJztcbmV4cG9ydCB7IEZsYXRSYXRpbmcgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3JhdGluZyc7XG5leHBvcnQgeyBGbGF0U2VsZWN0QmFzZSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfc2VsZWN0YmFzZSc7XG5leHBvcnQgeyBGbGF0U2lnbmF0dXJlUGFkIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9zaWduYXR1cmVwYWQnO1xuZXhwb3J0IHsgRmxhdFRleHRib3ggfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3RleHRib3gnO1xuZXhwb3J0IHsgRmxhdFN1cnZleSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfc3VydmV5JztcbmV4cG9ydCB7IEZsYXRNYXRyaXggfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X21hdHJpeCc7XG5leHBvcnQgeyBGbGF0TWF0cml4TXVsdGlwbGUgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X21hdHJpeG11bHRpcGxlJztcbmV4cG9ydCB7IEZsYXRNYXRyaXhEeW5hbWljIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXhkeW5hbWljJztcbmV4cG9ydCB7IEZsYXRNdWx0aXBsZVRleHQgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X211bHRpcGxldGV4dCc7XG5leHBvcnQgeyBQYWdlUGFja2VyIH0gZnJvbSAnLi4vcGFnZV9sYXlvdXQvcGFnZV9wYWNrZXInO1xuZXhwb3J0IHsgRXZlbnRIYW5kbGVyIH0gZnJvbSAnLi4vZXZlbnRfaGFuZGxlci9ldmVudF9oYW5kbGVyJztcbmV4cG9ydCB7IEhvcml6b250YWxBbGlnbiwgVmVydGljYWxBbGlnbiwgSURyYXdSZWN0T3B0aW9ucywgSURyYXdUZXh0T3B0aW9ucywgSURyYXdJbWFnZU9wdGlvbnMsIERyYXdDYW52YXMgfSBmcm9tICcuLi9ldmVudF9oYW5kbGVyL2RyYXdfY2FudmFzJztcbmV4cG9ydCB7IElQZGZCcmljaywgUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5leHBvcnQgeyBCb29sZWFuSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYm9vbGVhbml0ZW0nO1xuZXhwb3J0IHsgQ2hlY2tib3hJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jaGVja2JveGl0ZW0nO1xuZXhwb3J0IHsgQ2hlY2tJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jaGVja2l0ZW0nO1xuZXhwb3J0IHsgQ29tbWVudEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tbWVudCc7XG5leHBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5leHBvcnQgeyBDdXN0b21CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2N1c3RvbSc7XG5leHBvcnQgeyBEcm9wZG93bkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfZHJvcGRvd24nO1xuZXhwb3J0IHsgRW1wdHlCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2VtcHR5JztcbmV4cG9ydCB7IEhUTUxCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2h0bWwnO1xuZXhwb3J0IHsgSW1hZ2VCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2ltYWdlJztcbmV4cG9ydCB7IExpbmtCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2xpbmsnO1xuZXhwb3J0IHsgUmFkaW9JdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9yYWRpb2l0ZW0nO1xuZXhwb3J0IHsgUmFua2luZ0l0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3JhbmtpbmdpdGVtJztcbmV4cG9ydCB7IFJvd2xpbmVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3Jvd2xpbmUnO1xuZXhwb3J0IHsgVGV4dEZpZWxkQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0ZmllbGQnO1xuZXhwb3J0IHsgVGV4dEJvbGRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHRib2xkJztcbmV4cG9ydCB7IFRleHRCb3hCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHRib3gnO1xuZXhwb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5leHBvcnQgeyBUaXRsZVBhbmVsQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90aXRsZXBhbmVsJztcblxuaW1wb3J0IHsgY2hlY2tMaWJyYXJ5VmVyc2lvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmNoZWNrTGlicmFyeVZlcnNpb24oYCR7cHJvY2Vzcy5lbnYuVkVSU0lPTn1gLCAnc3VydmV5LXBkZicpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9lbnRyaWVzL3BkZi50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBRdWVzdGlvbkNoZWNrYm94QmFzZSB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGbGF0U2VsZWN0QmFzZSBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkNoZWNrYm94QmFzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkNoZWNrYm94QmFzZT5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFic3RyYWN0IGdlbmVyYXRlRmxhdEl0ZW0ocmVjdDogSVJlY3QsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IElQZGZCcmljaztcbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0Q29tcG9zaXRlKHBvaW50OiBJUG9pbnQsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFN1cnZleUhlbHBlci5tb3ZlUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QoaXRlbVJlY3QsIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSxcbiAgICAgICAgICAgIHBvaW50LnhMZWZ0KSwgaXRlbSwgaW5kZXgpO1xuICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgY29uc3QgdGV4dFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICB0ZXh0UG9pbnQueExlZnQgPSBpdGVtRmxhdC54UmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgaWYgKGl0ZW0ubG9jVGV4dC5yZW5kZXJlZEh0bWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgICAgIHRleHRQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLmxvY1RleHQsIFRleHRCcmljaykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtID09PSB0aGlzLnF1ZXN0aW9uLm90aGVySXRlbSAmJiAoaXRlbS52YWx1ZSA9PT0gdGhpcy5xdWVzdGlvbi52YWx1ZSB8fFxuICAgICAgICAgICAgKHR5cGVvZiB0aGlzLnF1ZXN0aW9uLmlzT3RoZXJTZWxlY3RlZCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5xdWVzdGlvbi5pc090aGVyU2VsZWN0ZWQpKSkge1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgb3RoZXJQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChcbiAgICAgICAgICAgICAgICBvdGhlclBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGZhbHNlLCB7IGluZGV4LCByb3dzOiBTdXJ2ZXlIZWxwZXIuT1RIRVJfUk9XU19DT1VOVCB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRWaXNpYmxlQ2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXM7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXRDb2xDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5jb2xDb3VudDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGNvbENvdW50ID0gdGhpcy5nZXRDb2xDb3VudCgpO1xuICAgICAgICBjb25zdCB2aXNpYmxlQ2hvaWNlcyA9IHRoaXMuZ2V0VmlzaWJsZUNob2ljZXMoKTtcbiAgICAgICAgbGV0IGN1cnJlbnRDb2xDb3VudDogbnVtYmVyID0gY29sQ291bnQ7XG4gICAgICAgIGlmIChjb2xDb3VudCA9PSAwKSB7XG4gICAgICAgICAgICBjdXJyZW50Q29sQ291bnQgPSBNYXRoLmZsb29yKFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKVxuICAgICAgICAgICAgICAgIC8gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFN1cnZleUhlbHBlci5NQVRSSVhfQ09MVU1OX1dJRFRIKS53aWR0aCkgfHwgMTtcbiAgICAgICAgICAgIGlmICh2aXNpYmxlQ2hvaWNlcy5sZW5ndGggPCBjdXJyZW50Q29sQ291bnQpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50Q29sQ291bnQgPSB2aXNpYmxlQ2hvaWNlcy5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29sQ291bnQgPiAxKSB7XG4gICAgICAgICAgICBjdXJyZW50Q29sQ291bnQgPSAoU3VydmV5SGVscGVyLmdldENvbHVtbldpZHRoKHRoaXMuY29udHJvbGxlciwgY29sQ291bnQpIDxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoU3VydmV5SGVscGVyLk1BVFJJWF9DT0xVTU5fV0lEVEgpLndpZHRoKSA/IDEgOiBjb2xDb3VudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGN1cnJlbnRDb2xDb3VudCA9PSAxKSA/IGF3YWl0IHRoaXMuZ2VuZXJhdGVWZXJ0aWNhbGx5SXRlbXMocG9pbnQsIHZpc2libGVDaG9pY2VzKSA6XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlSG9yaXNvbnRhbGx5SXRlbXMocG9pbnQsIGN1cnJlbnRDb2xDb3VudCk7XG5cbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlVmVydGljYWxseUl0ZW1zKHBvaW50OiBJUG9pbnQsIGl0ZW1WYWx1ZXM6IEl0ZW1WYWx1ZVtdKTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgaXRlbVZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0Q29tcG9zaXRlKGN1cnJQb2ludCwgaXRlbVZhbHVlc1tpXSwgaSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IGl0ZW1GbGF0LnlCb3QgKyBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgZmxhdHMucHVzaChpdGVtRmxhdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVIb3Jpc29udGFsbHlJdGVtcyhwb2ludDogSVBvaW50LCBjb2xDb3VudDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCB2aXNpYmxlQ2hvaWNlcyA9IHRoaXMuZ2V0VmlzaWJsZUNob2ljZXMoKTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgbGV0IHJvdzogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHZpc2libGVDaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnModGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCwgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQpO1xuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNldENvbHVtbk1hcmdpbnModGhpcy5jb250cm9sbGVyLCBjb2xDb3VudCwgaSAlIGNvbENvdW50KTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRDb21wb3NpdGUoXG4gICAgICAgICAgICAgICAgY3VyclBvaW50LCB2aXNpYmxlQ2hvaWNlc1tpXSwgaSk7XG4gICAgICAgICAgICByb3cuYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGlmIChpICUgY29sQ291bnQgPT09IGNvbENvdW50IC0gMSB8fCBpID09PSB2aXNpYmxlQ2hvaWNlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93TGluZUZsYXQ6IElQZGZCcmljayA9IFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHJvdyksIHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSByb3dMaW5lRmxhdC55Qm90ICtcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKHJvdywgcm93TGluZUZsYXQpO1xuICAgICAgICAgICAgICAgIHJvdyA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9zZWxlY3RiYXNlLnRzIiwiaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFRyYW5zbGF0ZVhGdW5jdGlvbiB9IGZyb20gJy4vcGRmX2JyaWNrJztcblxuZXhwb3J0IGNsYXNzIFJvd2xpbmVCcmljayBpbXBsZW1lbnRzIElQZGZCcmljayB7XG4gICAgeExlZnQ6IG51bWJlcjtcbiAgICB4UmlnaHQ6IG51bWJlcjtcbiAgICB5VG9wOiBudW1iZXI7XG4gICAgeUJvdDogbnVtYmVyO1xuICAgIHB1YmxpYyBpc1BhZ2VCcmVhazogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHB1YmxpYyBjb2xvcjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMueExlZnQgPSByZWN0LnhMZWZ0O1xuICAgICAgICB0aGlzLnhSaWdodCA9IHJlY3QueFJpZ2h0O1xuICAgICAgICB0aGlzLnlUb3AgPSByZWN0LnlUb3A7XG4gICAgICAgIHRoaXMueUJvdCA9IHJlY3QueUJvdDtcbiAgICB9XG4gICAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy54UmlnaHQgLSB0aGlzLnhMZWZ0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy55Qm90IC0gdGhpcy55VG9wO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5jb2xvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG9sZERyYXdDb2xvcjogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXREcmF3Q29sb3IoKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKHRoaXMuY29sb3IpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5saW5lKHRoaXMueExlZnQsIHRoaXMueVRvcCwgdGhpcy54UmlnaHQsIHRoaXMueVRvcCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldERyYXdDb2xvcihvbGREcmF3Q29sb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyB1bmZvbGQoKTogSVBkZkJyaWNrW10ge1xuICAgICAgICByZXR1cm4gW3RoaXNdO1xuICAgIH1cbiAgICB0cmFuc2xhdGVYKF86IFRyYW5zbGF0ZVhGdW5jdGlvbik6IHZvaWQge31cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfcm93bGluZS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25UZXh0TW9kZWwsIFF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBUZXh0RmllbGRCcmljayB9IGZyb20gJy4vcGRmX3RleHRmaWVsZCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIFRleHRCb3hCcmljayBleHRlbmRzIFRleHRGaWVsZEJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBpc1F1ZXN0aW9uOiBib29sZWFuID0gdHJ1ZSxcbiAgICAgICAgcHJvdGVjdGVkIGlzTXVsdGlsaW5lOiBib29sZWFuID0gZmFsc2UsIGluZGV4OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCBpc1F1ZXN0aW9uLFxuICAgICAgICAgICAgKDxRdWVzdGlvblRleHRNb2RlbD5xdWVzdGlvbikuaWQgKyAoaXNRdWVzdGlvbiA/ICcnIDogJ19jb21tZW50JyArIGluZGV4KSxcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5nZXRRdWVzdGlvbk9yQ29tbWVudFZhbHVlKDxRdWVzdGlvbj5xdWVzdGlvbiwgaXNRdWVzdGlvbiksXG4gICAgICAgICAgICBpc1F1ZXN0aW9uICYmICg8UXVlc3Rpb25UZXh0TW9kZWw+cXVlc3Rpb24pLmxvY1BsYWNlSG9sZGVyID8gU3VydmV5SGVscGVyLmdldExvY1N0cmluZygoPFF1ZXN0aW9uVGV4dE1vZGVsPnF1ZXN0aW9uKS5sb2NQbGFjZUhvbGRlcikgOiAnJyxcbiAgICAgICAgICAgIHF1ZXN0aW9uLmlzUmVhZE9ubHksIGlzTXVsdGlsaW5lLFxuICAgICAgICAgICAgKDxRdWVzdGlvblRleHRNb2RlbD5xdWVzdGlvbikuaW5wdXRUeXBlKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHRib3gudHMiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMThfXztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJyb290XCI6XCJqc3BkZlwiLFwiY29tbW9uanMyXCI6XCJqc3BkZlwiLFwiY29tbW9uanNcIjpcImpzcGRmXCIsXCJhbWRcIjpcImpzcGRmXCJ9XG4vLyBtb2R1bGUgaWQgPSAxOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgeyBJUmVjdCwgSU1hcmdpbiwgSVNpemUsIERvY09wdGlvbnMsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBUZXh0Qm9sZEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dGJvbGQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbi8qKlxuICogSG9yaXpvbnRhbCBhbGlnbm1lbnQgdHlwZXMgaW4gb25SZW5kZXJIZWFkZXIgYW5kIG9uUmVuZGVyRm9vdGVyIGV2ZW50c1xuICovXG5leHBvcnQgZW51bSBIb3Jpem9udGFsQWxpZ24ge1xuICAgIE5vdFNldCA9ICdub3RzZXQnLFxuICAgIExlZnQgPSAnbGVmdCcsXG4gICAgQ2VudGVyID0gJ2NlbnRlcicsXG4gICAgUmlnaHQgPSAncmlnaHQnXG59XG4vKipcbiAqIFZlcnRpY2FsIGFsaWdubWVudCB0eXBlcyBpbiBvblJlbmRlckhlYWRlciBhbmQgb25SZW5kZXJGb290ZXIgZXZlbnRzXG4gKi9cbmV4cG9ydCBlbnVtIFZlcnRpY2FsQWxpZ24ge1xuICAgIE5vdFNldCA9ICdub3RzZXQnLFxuICAgIFRvcCA9ICd0b3AnLFxuICAgIE1pZGRsZSA9ICdtaWRkbGUnLFxuICAgIEJvdHRvbSA9ICdib3R0b20nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURyYXdSZWN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogSG9yaXpvbnRhbCBhbGlnbm1lbnQgd2l0aGluIHRoZSByZWN0YW5nbGUgdGhhdCBsaW1pdHMgdGhlIGRyYXdpbmcgYXJlYS5cbiAgICAgKlxuICAgICAqIFBvc3NpYmxlIHZhbHVlczpcbiAgICAgKlxuICAgICAqIC0gYFwiY2VudGVyXCJgIChkZWZhdWx0KVxuICAgICAqIC0gYFwibGVmdFwiYFxuICAgICAqIC0gYFwicmlnaHRcImBcbiAgICAgKi9cbiAgICBob3Jpem9udGFsQWxpZ24/OiBIb3Jpem9udGFsQWxpZ247XG4gICAgLyoqXG4gICAgICogVmVydGljYWwgYWxpZ25tZW50IHdpdGhpbiB0aGUgcmVjdGFuZ2xlIHRoYXQgbGltaXRzIHRoZSBkcmF3aW5nIGFyZWEuXG4gICAgICpcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICpcbiAgICAgKiAtIGBcIm1pZGRsZVwiYCAoZGVmYXVsdClcbiAgICAgKiAtIGBcInRvcFwiYFxuICAgICAqIC0gYFwiYm90dG9tXCJgXG4gICAgICovXG4gICAgdmVydGljYWxBbGlnbj86IFZlcnRpY2FsQWxpZ247XG4gICAgLyoqXG4gICAgICogVGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGNvbnRlbnQgYW5kIHRoZSBib3JkZXJzIG9mIHRoZSByZWN0YW5nbGUuIFRoaXMgcHJvcGVydHkgYXBwbGllcyBvbmx5IGlmIHRoZSBjb250ZW50IGlzIGFsaWduZWQgdG8gdGhlIGxlZnQvcmlnaHQgb3IgdG9wL2JvdHRvbS5cbiAgICAgKi9cbiAgICBtYXJnaW5zPzogSU1hcmdpbjtcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2l0aCBjb29yZGluYXRlcyBvZiB0aGUgcmVjdGFuZ2xlLlxuICAgICAqL1xuICAgIHJlY3Q/OiBJUmVjdDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgY29uZmlndXJlcyByZW5kZXJpbmcgYSBwaWVjZSBvZiB0ZXh0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElEcmF3VGV4dE9wdGlvbnMgZXh0ZW5kcyBJRHJhd1JlY3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIHRleHQgc3RyaW5nIHRvIGJlIGRyYXduLlxuICAgICAqL1xuICAgIHRleHQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGb250IHNpemUgaW4gcG9pbnRzLlxuICAgICAqXG4gICAgICogRGVmYXVsdCB2YWx1ZTogMTRcbiAgICAgKi9cbiAgICBmb250U2l6ZT86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBFbmFibGUgdGhpcyBwcm9wZXJ0eSB0byByZW5kZXIgdGhlIHRleHQgc3RyaW5nIGJvbGQuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0IHZhbHVlOiBgZmFsc2VgXG4gICAgICovXG4gICAgaXNCb2xkPzogYm9vbGVhbjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgY29uZmlndXJlcyByZW5kZXJpbmcgYW4gaW1hZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURyYXdJbWFnZU9wdGlvbnMgZXh0ZW5kcyBJRHJhd1JlY3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBpbWFnZSB3aWR0aCBpbiBwaXhlbHMuIERlZmF1bHRzIHRvIHRoZSBbcmVjdGFuZ2xlIHdpZHRoXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2lkcmF3aW1hZ2VvcHRpb25zI3JlY3QpLlxuICAgICAqL1xuICAgIHdpZHRoPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFuIGltYWdlIGhlaWdodCBpbiBwaXhlbHMuIERlZmF1bHRzIHRvIHRoZSBbcmVjdGFuZ2xlIGhlaWdodF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pZHJhd2ltYWdlb3B0aW9ucyNyZWN0KS5cbiAgICAgKi9cbiAgICBoZWlnaHQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgdmFsdWUgd2l0aCBhIGJhc2U2NC1lbmNvZGVkIGltYWdlIHRvIGJlIGRyYXduLlxuICAgICAqL1xuICAgIGJhc2U2NDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBob3cgdG8gcmVzaXplIHRoZSBpbWFnZSB0byBmaXQgaXQgaW50byBpdHMgY29udGFpbmVyLlxuICAgICAqXG4gICAgICogRGVmYXVsdCB2YWx1ZTogYFwiY29udGFpblwiYCBpZiBbYGFwcGx5SW1hZ2VGaXRgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2lkb2NvcHRpb25zI2FwcGx5SW1hZ2VGaXQpIGlzIGVuYWJsZWQgb3IgYHVuZGVmaW5lZGAgaWYgbm90LlxuICAgICAqXG4gICAgICogUmVmZXIgdG8gdGhlIFtgb2JqZWN0LWZpdGBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9vYmplY3QtZml0KSBDU1MgcHJvcGVydHkgZGVzY3JpcHRpb24gZm9yIGluZm9ybWF0aW9uIG9uIGFjY2VwdGVkIHZhbHVlcy5cbiAgICAgKi9cbiAgICBpbWFnZUZpdD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBkZXNjcmliZXMgYSBkcmF3aW5nIGFyZWEgYW5kIGVuYWJsZXMgeW91IHRvIGRyYXcgYW4gaW1hZ2Ugb3IgYSBwaWVjZSBvZiB0ZXh0IHdpdGhpbiB0aGUgYXJlYS4gWW91IGNhbiBhY2Nlc3MgdGhpcyBvYmplY3Qgd2l0aGluIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSBgU3VydmV5UERGYCdzIFtgb25SZW5kZXJIZWFkZXJgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3N1cnZleXBkZiNvblJlbmRlckhlYWRlcikgYW5kIFtgb25SZW5kZXJGb290ZXJgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3N1cnZleXBkZiNvblJlbmRlckZvb3RlcikgZXZlbnRzLlxuICpcbiAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9jdXN0b21pemUtaGVhZGVyLWFuZC1mb290ZXItb2YtcGRmLWZvcm0vIChsaW5rU3R5bGUpKVxuICovXG5leHBvcnQgY2xhc3MgRHJhd0NhbnZhcyB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwYWNrczogSVBkZkJyaWNrW10sXG4gICAgICAgIHB1YmxpYyBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBwcm90ZWN0ZWQgX3JlY3Q6IElSZWN0LFxuICAgICAgICBwcm90ZWN0ZWQgX2NvdW50UGFnZXM6IG51bWJlcixcbiAgICAgICAgcHJvdGVjdGVkIF9wYWdlTnVtYmVyOiBudW1iZXIpIHsgfVxuICAgIC8qKlxuICAgICAqIEEgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhZ2VDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fY291bnRQYWdlcztcbiAgICB9XG4gICAgcHVibGljIGdldCBjb3VudFBhZ2VzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3VudFBhZ2VzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRoZSBwYWdlIHRoYXQgY29udGFpbnMgdGhlIGRyYXdpbmcgYXJlYS4gRW51bWVyYXRpb24gc3RhcnRzIHdpdGggMS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhZ2VOdW1iZXIoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VOdW1iZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aXRoIGNvb3JkaW5hdGVzIG9mIGEgcmVjdGFuZ2xlIHRoYXQgbGltaXRzIHRoZSBkcmF3aW5nIGFyZWEuIFRoaXMgb2JqZWN0IGNvbnRhaW4gdGhlIGZvbGxvd2luZyBmaWVsZHM6IGB4TGVmdGAsIGB4UmlnaHRgLCBgeVRvcGAsIGB5Qm90YC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlY3QoKTogSVJlY3Qge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVjdDtcbiAgICB9XG4gICAgcHJpdmF0ZSBhbGlnblJlY3QocmVjdE9wdGlvbnM6IElEcmF3UmVjdE9wdGlvbnMsIGl0ZW1TaXplOiBJU2l6ZSk6IElSZWN0IHtcbiAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmVjdE9wdGlvbnMubWFyZ2lucyA9IHsgbGVmdDogMC4wLCByaWdodDogMC4wLCB0b3A6IDAuMCwgYm90OiAwLjAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLm1hcmdpbnMubGVmdCA9IDAuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMubWFyZ2lucy5yaWdodCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0ID0gMC4wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zLnRvcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5tYXJnaW5zLnRvcCA9IDAuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMubWFyZ2lucy5ib3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMubWFyZ2lucy5ib3QgPSAwLjA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5yZWN0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5ob3Jpem9udGFsQWxpZ24gPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMuaG9yaXpvbnRhbEFsaWduID09PSBIb3Jpem9udGFsQWxpZ24uTm90U2V0KSB7XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMuaG9yaXpvbnRhbEFsaWduID0gSG9yaXpvbnRhbEFsaWduLkNlbnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMudmVydGljYWxBbGlnbiA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy52ZXJ0aWNhbEFsaWduID09PSBWZXJ0aWNhbEFsaWduLk5vdFNldCkge1xuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLnZlcnRpY2FsQWxpZ24gPSBWZXJ0aWNhbEFsaWduLk1pZGRsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jbG9uZSh0aGlzLnJlY3QpO1xuICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLmhvcml6b250YWxBbGlnbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocmVjdE9wdGlvbnMuaG9yaXpvbnRhbEFsaWduKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBIb3Jpem9udGFsQWxpZ24uTGVmdDpcbiAgICAgICAgICAgICAgICAgICAgcmVjdC54TGVmdCA9IHRoaXMucmVjdC54TGVmdCArIHJlY3RPcHRpb25zLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgcmVjdC54UmlnaHQgPSBNYXRoLm1pbih0aGlzLnJlY3QueFJpZ2h0IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5yaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVjdC54TGVmdCArIHJlY3RPcHRpb25zLm1hcmdpbnMubGVmdCArIGl0ZW1TaXplLndpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBIb3Jpem9udGFsQWxpZ24uQ2VudGVyOlxuICAgICAgICAgICAgICAgICAgICByZWN0LnhMZWZ0ID0gTWF0aC5tYXgodGhpcy5yZWN0LnhMZWZ0ICsgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMucmVjdC54TGVmdCArIHRoaXMucmVjdC54UmlnaHQgLSBpdGVtU2l6ZS53aWR0aCkgLyAyLjApO1xuICAgICAgICAgICAgICAgICAgICByZWN0LnhSaWdodCA9IE1hdGgubWluKHRoaXMucmVjdC54UmlnaHQgLSByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMucmVjdC54TGVmdCArIHRoaXMucmVjdC54UmlnaHQgKyBpdGVtU2l6ZS53aWR0aCkgLyAyLjApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEhvcml6b250YWxBbGlnbi5SaWdodDpcbiAgICAgICAgICAgICAgICAgICAgcmVjdC54TGVmdCA9IE1hdGgubWF4KHRoaXMucmVjdC54TGVmdCArIHJlY3RPcHRpb25zLm1hcmdpbnMubGVmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVjdC54UmlnaHQgLSByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0IC0gaXRlbVNpemUud2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICByZWN0LnhSaWdodCA9IHRoaXMucmVjdC54UmlnaHQgLSByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlY3QueExlZnQgPSByZWN0T3B0aW9ucy5yZWN0LnhMZWZ0IHx8IHRoaXMucmVjdC54TGVmdDtcbiAgICAgICAgICAgIHJlY3QueFJpZ2h0ID0gcmVjdE9wdGlvbnMucmVjdC54UmlnaHQgfHwgdGhpcy5yZWN0LnhSaWdodDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLnZlcnRpY2FsQWxpZ24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHJlY3RPcHRpb25zLnZlcnRpY2FsQWxpZ24pIHtcbiAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ24uVG9wOlxuICAgICAgICAgICAgICAgICAgICByZWN0LnlUb3AgPSB0aGlzLnJlY3QueVRvcCArIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wO1xuICAgICAgICAgICAgICAgICAgICByZWN0LnlCb3QgPSBNYXRoLm1pbih0aGlzLnJlY3QueUJvdCAtIHJlY3RPcHRpb25zLm1hcmdpbnMuYm90LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN0LnlUb3AgKyByZWN0T3B0aW9ucy5tYXJnaW5zLnRvcCArIGl0ZW1TaXplLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbi5NaWRkbGU6XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueVRvcCA9IE1hdGgubWF4KHRoaXMucmVjdC55VG9wICsgcmVjdE9wdGlvbnMubWFyZ2lucy50b3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5yZWN0LnlUb3AgKyB0aGlzLnJlY3QueUJvdCAtIGl0ZW1TaXplLmhlaWdodCkgLyAyLjApO1xuICAgICAgICAgICAgICAgICAgICByZWN0LnlCb3QgPSBNYXRoLm1pbih0aGlzLnJlY3QueUJvdCAtIHJlY3RPcHRpb25zLm1hcmdpbnMuYm90LFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMucmVjdC55VG9wICsgdGhpcy5yZWN0LnlCb3QgKyBpdGVtU2l6ZS5oZWlnaHQpIC8gMi4wKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduLkJvdHRvbTpcbiAgICAgICAgICAgICAgICAgICAgcmVjdC55VG9wID0gTWF0aC5tYXgodGhpcy5yZWN0LnlUb3AgKyByZWN0T3B0aW9ucy5tYXJnaW5zLnRvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVjdC55Qm90IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5ib3QgLSBpdGVtU2l6ZS5oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICByZWN0LnlCb3QgPSB0aGlzLnJlY3QueUJvdCAtIHJlY3RPcHRpb25zLm1hcmdpbnMuYm90O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlY3QueVRvcCA9IHJlY3RPcHRpb25zLnJlY3QueVRvcCB8fCB0aGlzLnJlY3QueVRvcDtcbiAgICAgICAgICAgIHJlY3QueUJvdCA9IHJlY3RPcHRpb25zLnJlY3QueUJvdCB8fCB0aGlzLnJlY3QueUJvdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRHJhd3MgYSBwaWVjZSBvZiB0ZXh0IHdpdGhpbiB0aGUgZHJhd2luZyBhcmVhLlxuICAgICAqIEBwYXJhbSB0ZXh0T3B0aW9ucyBBbiBbYElEcmF3VGV4dE9wdGlvbnNgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2lkcmF3dGV4dG9wdGlvbnMpIG9iamVjdCB0aGF0IGNvbmZpZ3VyZXMgdGhlIGRyYXdpbmcuXG4gICAgICovXG4gICAgcHVibGljIGRyYXdUZXh0KHRleHRPcHRpb25zOiBJRHJhd1RleHRPcHRpb25zKTogdm9pZCB7XG4gICAgICAgIHRleHRPcHRpb25zID0gU3VydmV5SGVscGVyLmNsb25lKHRleHRPcHRpb25zKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0T3B0aW9ucy5mb250U2l6ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRleHRPcHRpb25zLmZvbnRTaXplID0gRG9jT3B0aW9ucy5GT05UX1NJWkU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0T3B0aW9ucy5pc0JvbGQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0ZXh0T3B0aW9ucy5pc0JvbGQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ZXh0U2l6ZTogSVNpemUgPSB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQodGV4dE9wdGlvbnMudGV4dCxcbiAgICAgICAgICAgIHRleHRPcHRpb25zLmlzQm9sZCA/ICdib2xkJyA6ICdub3JtYWwnLCB0ZXh0T3B0aW9ucy5mb250U2l6ZSk7XG4gICAgICAgIGNvbnN0IHRleHRSZWN0OiBJUmVjdCA9IHRoaXMuYWxpZ25SZWN0KHRleHRPcHRpb25zLCB0ZXh0U2l6ZSk7XG4gICAgICAgIGlmICghdGV4dE9wdGlvbnMuaXNCb2xkKSB7XG4gICAgICAgICAgICB0aGlzLnBhY2tzLnB1c2gobmV3IFRleHRCcmljayhudWxsLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdGV4dFJlY3QsIHRleHRPcHRpb25zLnRleHQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGFja3MucHVzaChuZXcgVGV4dEJvbGRCcmljayhudWxsLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdGV4dFJlY3QsIHRleHRPcHRpb25zLnRleHQpKTtcbiAgICAgICAgfVxuICAgICAgICAoPFBkZkJyaWNrPnRoaXMucGFja3NbdGhpcy5wYWNrcy5sZW5ndGggLSAxXSkuZm9udFNpemUgPSB0ZXh0T3B0aW9ucy5mb250U2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRHJhd3MgYW4gaW1hZ2Ugd2l0aGluIHRoZSBkcmF3aW5nIGFyZWEuXG4gICAgICogQHBhcmFtIGltYWdlT3B0aW9ucyBBbiBbYElEcmF3SW1hZ2VPcHRpb25zYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9pZHJhd2ltYWdlb3B0aW9ucykgb2JqZWN0IHRoYXQgY29uZmlndXJlcyBkcmF3aW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBkcmF3SW1hZ2UoaW1hZ2VPcHRpb25zOiBJRHJhd0ltYWdlT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpbWFnZU9wdGlvbnMgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUoaW1hZ2VPcHRpb25zKTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbWFnZU9wdGlvbnMud2lkdGggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpbWFnZU9wdGlvbnMud2lkdGggPSB0aGlzLnJlY3QueFJpZ2h0IC0gdGhpcy5yZWN0LnhMZWZ0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaW1hZ2VPcHRpb25zLmhlaWdodCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltYWdlT3B0aW9ucy5oZWlnaHQgPSB0aGlzLnJlY3QueUJvdCAtIHRoaXMucmVjdC55VG9wO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGltYWdlU2l6ZTogSVNpemUgPSB7XG4gICAgICAgICAgICB3aWR0aDogaW1hZ2VPcHRpb25zLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBpbWFnZU9wdGlvbnMuaGVpZ2h0XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGltYWdlUmVjdDogSVJlY3QgPSB0aGlzLmFsaWduUmVjdChpbWFnZU9wdGlvbnMsIGltYWdlU2l6ZSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygwLCAwKTtcbiAgICAgICAgdGhpcy5wYWNrcy5wdXNoKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQoXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoaW1hZ2VSZWN0LCB0cnVlLCB0cnVlKSxcbiAgICAgICAgICAgIG51bGwsIHRoaXMuY29udHJvbGxlciwgeyBsaW5rOiBpbWFnZU9wdGlvbnMuYmFzZTY0LFxuICAgICAgICAgICAgICAgIHdpZHRoOiBpbWFnZVJlY3QueFJpZ2h0IC0gaW1hZ2VSZWN0LnhMZWZ0LFxuICAgICAgICAgICAgICAgIGhlaWdodDogaW1hZ2VSZWN0LnlCb3QgLSBpbWFnZVJlY3QueVRvcCwgb2JqZWN0Rml0OiBpbWFnZU9wdGlvbnMuaW1hZ2VGaXQgfSwgISFpbWFnZU9wdGlvbnMuaW1hZ2VGaXQgfHwgdGhpcy5jb250cm9sbGVyLmFwcGx5SW1hZ2VGaXQpKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2V2ZW50X2hhbmRsZXIvZHJhd19jYW52YXMudHMiLCJpbXBvcnQgeyBFdmVudCwgRXZlbnRCYXNlIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBEcmF3Q2FudmFzIH0gZnJvbSAnLi9kcmF3X2NhbnZhcyc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEV2ZW50QXN5bmM8U2VuZGVyLCBPcHRpb25zPiBleHRlbmRzIEV2ZW50QmFzZTxTZW5kZXIsIE9wdGlvbnM+IHtcbiAgICBwdWJsaWMgdW5zaGlmdChmdW5jOiAoc2VuZGVyOiBTZW5kZXIsIG9wdGlvbnM6IE9wdGlvbnMpID0+IGFueSkge1xuICAgICAgICBpZiAodGhpcy5oYXNGdW5jKGZ1bmMpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmNhbGxiYWNrcyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrcyA9IG5ldyBBcnJheTwoc2VuZGVyOiBTZW5kZXIsIG9wdGlvbnM6IE9wdGlvbnMpID0+IGFueT4oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbGxiYWNrcy51bnNoaWZ0KGZ1bmMpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmlyZShzZW5kZXI6IFNlbmRlciwgb3B0aW9uczogT3B0aW9ucykge1xuICAgICAgICBpZiAodGhpcy5jYWxsYmFja3MgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNhbGxiYWNrc1tpXShzZW5kZXIsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEV2ZW50SGFuZGxlciB7XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBwcm9jZXNzX2hlYWRlcl9ldmVudHMoc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHBhY2tzOiBJUGRmQnJpY2tbXVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghc3VydmV5LmhhdmVDb21tZXJjaWFsTGljZW5zZSkge1xuICAgICAgICAgICAgc3VydmV5Lm9uUmVuZGVySGVhZGVyLmFkZCgoXywgY2FudmFzKSA9PiB7XG4gICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1N1cnZleUpTIFBERiB8IFBsZWFzZSBwdXJjaGFzZSBhIFN1cnZleUpTIFBERiBkZXZlbG9wZXIgbGljZW5zZSB0byB1c2UgaXQgaW4geW91ciBhcHAgfCBodHRwczovL3N1cnZleWpzLmlvL0J1eScsXG4gICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiAxMFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHBhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhd2FpdCBzdXJ2ZXkub25SZW5kZXJIZWFkZXIuZmlyZShzdXJ2ZXksIG5ldyBEcmF3Q2FudmFzKHBhY2tzW2ldLCBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVIZWFkZXJSZWN0KGNvbnRyb2xsZXIpLCBwYWNrcy5sZW5ndGgsIGkgKyAxKSk7XG4gICAgICAgICAgICBhd2FpdCBzdXJ2ZXkub25SZW5kZXJGb290ZXIuZmlyZShzdXJ2ZXksIG5ldyBEcmF3Q2FudmFzKHBhY2tzW2ldLCBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVGb290ZXJSZWN0KGNvbnRyb2xsZXIpLCBwYWNrcy5sZW5ndGgsIGkgKyAxKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2V2ZW50X2hhbmRsZXIvZXZlbnRfaGFuZGxlci50cyIsImltcG9ydCB7IElQb2ludCB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuXG5leHBvcnQgY2xhc3MgRmxhdFF1ZXN0aW9uRGVmYXVsdCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgYCR7dGhpcy5xdWVzdGlvbi5kaXNwbGF5VmFsdWV9YCwgVGV4dEJyaWNrKTtcbiAgICAgICAgcmV0dXJuIFt2YWx1ZUJyaWNrXTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfZGVmYXVsdC50cyIsImltcG9ydCB7XG4gICAgSVF1ZXN0aW9uLCBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLCBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSxcbiAgICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3csIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwsIFNlcmlhbGl6ZXIsIFBhbmVsTW9kZWwsIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsLFxuICAgIExvY2FsaXphYmxlU3RyaW5nXG59IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSUZsYXRRdWVzdGlvbiwgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRTZWxlY3RCYXNlIH0gZnJvbSAnLi9mbGF0X3NlbGVjdGJhc2UnO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgRmxhdFN1cnZleSB9IGZyb20gJy4vZmxhdF9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdE1hdHJpeE11bHRpcGxlIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdBUF9CRVRXRUVOX1JPV1M6IG51bWJlciA9IDAuNTtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2U7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERiwgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcHJvdGVjdGVkIGlzTXVsdGlwbGU6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2U+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgdmlzaWJsZVJvd3NWYWx1ZTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93W107XG4gICAgcHJpdmF0ZSBnZXQgdmlzaWJsZVJvd3MoKSB7XG4gICAgICAgIGlmKCF0aGlzLnZpc2libGVSb3dzVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZVJvd3NWYWx1ZSA9IHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZS5yb3dzLmZpbHRlcihyb3cgPT4gcm93LnZpc2libGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2libGVSb3dzVmFsdWU7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0c0NlbGxUaXRsZShwb2ludDogSVBvaW50LCBsb2NUaXRsZTogTG9jYWxpemFibGVTdHJpbmcpOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChwb2ludCxcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgbG9jVGl0bGUsIFRleHRCcmljaykpO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdHNDZWxsKHBvaW50OiBJUG9pbnQsIGNlbGw6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwsXG4gICAgICAgIGxvY2F0aW9uPzogJ2hlYWRlcicgfCAnZm9vdGVyJywgaXNXaWRlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8Q29tcG9zaXRlQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBpZiAoY2VsbC5oYXNRdWVzdGlvbikge1xuICAgICAgICAgICAgaWYobG9jYXRpb24gPT0gJ2Zvb3RlcicgJiYgIWNlbGwucXVlc3Rpb24uaXNBbnN3ZXJlZCkge31cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzV2lkZSAmJiBjZWxsLmlzQ2hvaWNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmxhdE11bHRpcGxlQ29sdW1uc1F1ZXN0aW9uOiBJRmxhdFF1ZXN0aW9uID0gRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VydmV5LCBjZWxsLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGNlbGwucXVlc3Rpb24uZ2V0VHlwZSgpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoU3VydmV5SGVscGVyLnNjYWxlUmVjdChcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0LCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCksXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSwgcG9pbnQueExlZnQpO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljaygoPEZsYXRTZWxlY3RCYXNlPmZsYXRNdWx0aXBsZUNvbHVtbnNRdWVzdGlvbilcbiAgICAgICAgICAgICAgICAgICAgLmdlbmVyYXRlRmxhdEl0ZW0oaXRlbVJlY3QsIGNlbGwuaXRlbSwgY2VsbC5jaG9pY2VJbmRleCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY2VsbC5xdWVzdGlvbi50aXRsZUxvY2F0aW9uID0gU3VydmV5SGVscGVyLlRJVExFX0xPQ0FUSU9OX01BVFJJWDtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soLi4uYXdhaXQgU3VydmV5SGVscGVyLmdlbmVyYXRlUXVlc3Rpb25GbGF0cyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXJ2ZXksIHRoaXMuY29udHJvbGxlciwgY2VsbC5xdWVzdGlvbiwgcG9pbnQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjZWxsLmhhc1RpdGxlKSB7XG4gICAgICAgICAgICBpZiAobG9jYXRpb24gPT0gJ2hlYWRlcicpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUJvbGRUZXh0RmxhdChwb2ludCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBjZWxsLmxvY1RpdGxlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KHBvaW50LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGNlbGwubG9jVGl0bGUsIFRleHRCcmljaykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0IGhhc0RldGFpbFBhbmVsKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpYmxlUm93cy5zb21lKChyZW5kZXJlZFJvdykgPT4gcmVuZGVyZWRSb3cucm93ICYmIHRoaXMucXVlc3Rpb24uaGFzRGV0YWlsUGFuZWwocmVuZGVyZWRSb3cucm93KSk7XG4gICAgfVxuICAgIHByaXZhdGUgaWdub3JlQ2VsbChjZWxsOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsLCBpbmRleDogbnVtYmVyLCBsb2NhdGlvbj86ICdoZWFkZXInIHwgJ2Zvb3RlcicsIGlzV2lkZTogYm9vbGVhbiA9IHRydWUpOiBib29sZWFuIHtcbiAgICAgICAgaWYoIWlzV2lkZSAmJiBsb2NhdGlvbiA9PSAnZm9vdGVyJyAmJiBjZWxsLmhhc1F1ZXN0aW9uICYmICFjZWxsLnF1ZXN0aW9uLmlzQW5zd2VyZWQpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gIShjZWxsLmhhc1F1ZXN0aW9uIHx8IGNlbGwuaGFzVGl0bGUgfHwgKHRoaXMuaXNNdWx0aXBsZSAmJiAodGhpcy5oYXNEZXRhaWxQYW5lbCA/IGluZGV4ID09IDEgOiBpbmRleCA9PSAwKSkpO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFJvd0xvY2F0aW9uKHJvdzogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93KSB7XG4gICAgICAgIHJldHVybiByb3cgPT09IHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZS5oZWFkZXJSb3cgPyAnaGVhZGVyJyA6ICh0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVGFibGUuZm9vdGVyUm93ID09PSByb3cgPyAnZm9vdGVyJyA6IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0c1Jvd0hvcmlzb250YWwocG9pbnQ6IElQb2ludCwgcm93OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3csIGNvbHVtbldpZHRoOiBudW1iZXJbXSk6IFByb21pc2U8Q29tcG9zaXRlQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGxldCBsYXN0UmlnaHRNYXJnaW46IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCArXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICBsZXQgY250ID0gMDtcbiAgICAgICAgY29uc3Qgcm93TG9jYXRpb24gPSB0aGlzLmdldFJvd0xvY2F0aW9uKHJvdyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93LmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pZ25vcmVDZWxsKHJvdy5jZWxsc1tpXSwgaSwgcm93TG9jYXRpb24pKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGxhc3RSaWdodE1hcmdpbiArXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9DT0xVTU5TO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbHVtbldpZHRoW2NudF07XG4gICAgICAgICAgICBsYXN0UmlnaHRNYXJnaW4gPSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodDtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICBjb25zdCBjZWxsQ29udGVudDogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDZWxsKFxuICAgICAgICAgICAgICAgIGN1cnJQb2ludCwgcm93LmNlbGxzW2ldLCByb3dMb2NhdGlvbik7XG4gICAgICAgICAgICBpZiAoIWNlbGxDb250ZW50LmlzRW1wdHkpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soY2VsbENvbnRlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY250Kys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRzUm93VmVydGljYWwocG9pbnQ6IElQb2ludCwgcm93OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3cpOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCByb3dMb2NhdGlvbiA9IHRoaXMuZ2V0Um93TG9jYXRpb24ocm93KTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvdy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaWdub3JlQ2VsbChyb3cuY2VsbHNbaV0sIGksIHJvd0xvY2F0aW9uLCBmYWxzZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZS5zaG93SGVhZGVyICYmICghdGhpcy5pc011bHRpcGxlIHx8IGkgPiAwKSAmJiByb3cuY2VsbHNbaV0uY2VsbD8uY29sdW1uPy5sb2NUaXRsZSkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDZWxsVGl0bGUoY3VyclBvaW50LCByb3cuY2VsbHNbaV0uY2VsbC5jb2x1bW4ubG9jVGl0bGUpKTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IGNvbXBvc2l0ZS55Qm90ICsgRmxhdE1hdHJpeE11bHRpcGxlLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDZWxsKGN1cnJQb2ludCwgcm93LmNlbGxzW2ldLCByb3dMb2NhdGlvbiwgZmFsc2UpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gY29tcG9zaXRlLnlCb3QgKyBGbGF0TWF0cml4TXVsdGlwbGUuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHByaXZhdGUgZ2V0QXZhbGFibGVXaWR0aChjb2xDb3VudDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSAtXG4gICAgICAgIChjb2xDb3VudCAtIDEpICogdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9DT0xVTU5TO1xuICAgIH1cbiAgICBwcml2YXRlIGNhbGN1bGF0ZUNvbHVtbldpZHRoKHJvd3M6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvd1tdLCBjb2xDb3VudDogbnVtYmVyKTogbnVtYmVyW10ge1xuICAgICAgICBjb25zdCBhdmFpbGFibGVXaWR0aDogbnVtYmVyID0gdGhpcy5nZXRBdmFsYWJsZVdpZHRoKGNvbENvdW50KTtcbiAgICAgICAgbGV0IHJlbWFpbldpZHRoOiBudW1iZXIgPSBhdmFpbGFibGVXaWR0aDtcbiAgICAgICAgbGV0IHJlbWFpbkNvbENvdW50OiBudW1iZXIgPSBjb2xDb3VudDtcbiAgICAgICAgY29uc3QgY29sdW1uV2lkdGg6IG51bWJlcltdID0gW107XG4gICAgICAgIGNvbnN0IHVuc2V0Q2VsbHM6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGxbXSA9IFtdO1xuICAgICAgICBsZXQgY2VsbHMgPSByb3dzWzBdLmNlbGxzLmZpbHRlcigoY2VsbDogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCwgaW5kZXg6IG51bWJlcikgPT4gIXRoaXMuaWdub3JlQ2VsbChjZWxsLCBpbmRleCkpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgY29sQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKGNlbGxzW2ldLndpZHRoLFxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoLCBjb2xDb3VudCkgfHwgMC4wO1xuICAgICAgICAgICAgcmVtYWluV2lkdGggLT0gd2lkdGg7XG4gICAgICAgICAgICBpZiAod2lkdGggIT09IDAuMCkge1xuICAgICAgICAgICAgICAgIHJlbWFpbkNvbENvdW50LS07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVuc2V0Q2VsbHMucHVzaChjZWxsc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2x1bW5XaWR0aC5wdXNoKHdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVtYWluQ29sQ291bnQgPT09IDApIHJldHVybiBjb2x1bW5XaWR0aDtcbiAgICAgICAgY29uc3QgaGV1cmlzdGljV2lkdGg6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChTdXJ2ZXlIZWxwZXIuTUFUUklYX0NPTFVNTl9XSURUSCkud2lkdGg7XG4gICAgICAgIHVuc2V0Q2VsbHMuc29ydCgoY2VsbDE6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwsIGNlbGwyOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsKSA9PiB7XG4gICAgICAgICAgICBsZXQgbWluV2lkdGgxID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoY2VsbDEubWluV2lkdGgsIGF2YWlsYWJsZVdpZHRoLCBjb2xDb3VudCkgfHwgMC4wO1xuICAgICAgICAgICAgbGV0IG1pbldpZHRoMiA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKGNlbGwyLm1pbldpZHRoLCBhdmFpbGFibGVXaWR0aCwgY29sQ291bnQpIHx8IDAuMDtcbiAgICAgICAgICAgIHJldHVybiBtaW5XaWR0aDIgPiBtaW5XaWR0aDEgPyAxIDogLTE7XG4gICAgICAgIH0pLmZvckVhY2goKGNlbGw6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVxdWFsV2lkdGg6IG51bWJlciA9IHJlbWFpbldpZHRoIC8gcmVtYWluQ29sQ291bnQ7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW5NaW5XaWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoY2VsbC5taW5XaWR0aCwgYXZhaWxhYmxlV2lkdGgsIGNvbENvdW50KSB8fCAwLjA7XG4gICAgICAgICAgICBpZihjb2x1bW5NaW5XaWR0aCA+IGVxdWFsV2lkdGggJiYgY29sdW1uTWluV2lkdGggPiBoZXVyaXN0aWNXaWR0aCkge1xuICAgICAgICAgICAgICAgIHJlbWFpbldpZHRoIC09IGNvbHVtbk1pbldpZHRoO1xuICAgICAgICAgICAgICAgIHJlbWFpbkNvbENvdW50LS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2x1bW5XaWR0aFtjZWxscy5pbmRleE9mKGNlbGwpXSA9IE1hdGgubWF4KGhldXJpc3RpY1dpZHRoLCBjb2x1bW5NaW5XaWR0aCwgZXF1YWxXaWR0aCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29sdW1uV2lkdGg7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVPbmVSb3cocG9pbnQ6IElQb2ludCwgcm93OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3csIGlzV2lkZTogYm9vbGVhbiwgY29sdW1uV2lkdGg6IG51bWJlcltdKTogUHJvbWlzZTxDb21wb3NpdGVCcmljaz4ge1xuICAgICAgICBpZiAoaXNXaWRlKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzUm93SG9yaXNvbnRhbChwb2ludCwgcm93LCBjb2x1bW5XaWR0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1Jvd1ZlcnRpY2FsKHBvaW50LCByb3cpO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdHNSb3dzKHBvaW50OiBJUG9pbnQsIHJvd3M6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvd1tdLFxuICAgICAgICBjb2xDb3VudDogbnVtYmVyLCBpc1dpZGU6IGJvb2xlYW4pOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCByb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByb3dGbGF0OiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVPbmVSb3coY3VyclBvaW50LCByb3dzW2ldLFxuICAgICAgICAgICAgICAgIGlzV2lkZSwgdGhpcy5jYWxjdWxhdGVDb2x1bW5XaWR0aChyb3dzLCBjb2xDb3VudCkpO1xuICAgICAgICAgICAgaWYgKHJvd0ZsYXQuaXNFbXB0eSAmJiAhKHJvd3NbaV0ucm93ICYmIHJvd3NbaV0ucm93Lmhhc1BhbmVsKSkgY29udGludWU7XG4gICAgICAgICAgICBpZighcm93RmxhdC5pc0VtcHR5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgIT09IHJvd3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHJvd0ZsYXQueUJvdDtcbiAgICAgICAgICAgICAgICAgICAgcm93RmxhdC5hZGRCcmljayhTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoY3VyclBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2gocm93RmxhdCk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSByb3dGbGF0LnlCb3QgKyBGbGF0TWF0cml4TXVsdGlwbGUuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoISFyb3dzW2ldLnJvdyAmJiByb3dzW2ldLnJvdy5oYXNQYW5lbCkge1xuICAgICAgICAgICAgICAgIHJvd3NbaV0ucm93LnNob3dEZXRhaWxQYW5lbCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREZXRhaWxQYW5lbDogUGFuZWxNb2RlbCA9IHJvd3NbaV0ucm93LmRldGFpbFBhbmVsO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY3VycmVudERldGFpbFBhbmVsLnF1ZXN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGV0YWlsUGFuZWwucXVlc3Rpb25zW2pdLmlkICs9ICdfJyArIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsQnJpY2tzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IEZsYXRTdXJ2ZXkuZ2VuZXJhdGVGbGF0c1BhbmVsKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cnZleSwgdGhpcy5jb250cm9sbGVyLCBjdXJyZW50RGV0YWlsUGFuZWwsIGN1cnJQb2ludCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyQ29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICAgICAgICAgIGN1cnJDb21wb3NpdGUuYWRkQnJpY2soLi4ucGFuZWxCcmlja3MpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gY3VyckNvbXBvc2l0ZS55Qm90ICsgRmxhdE1hdHJpeE11bHRpcGxlLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcblxuICAgICAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKGN1cnJDb21wb3NpdGUpO1xuICAgICAgICAgICAgICAgIGlmIChpICE9PSByb3dzLmxlbmd0aCAtIDEgJiYgdGhpcy5xdWVzdGlvbi5yZW5kZXJlZFRhYmxlLnNob3dIZWFkZXIgJiYgaXNXaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlcjogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlT25lUm93KGN1cnJQb2ludCwgcm93c1swXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzV2lkZSwgdGhpcy5jYWxjdWxhdGVDb2x1bW5XaWR0aChyb3dzLCBjb2xDb3VudCkpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VycllUb3AgPSBjdXJyQ29tcG9zaXRlLnlCb3Q7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFoZWFkZXIuaXNFbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycllUb3AgPSBoZWFkZXIueUJvdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKGhlYWRlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBjdXJyWVRvcCArIEZsYXRNYXRyaXhNdWx0aXBsZS5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzRmxhdHM7XG4gICAgfVxuICAgIHByaXZhdGUgY2FsY3VsYXRlSXNXaWRlKHRhYmxlOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSwgY29sQ291bnQ6IG51bWJlcikge1xuICAgICAgICBjb25zdCByb3dzOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3dbXSA9IFtdO1xuICAgICAgICBpZih0YWJsZS5zaG93SGVhZGVyKSB7XG4gICAgICAgICAgICByb3dzLnB1c2godGFibGUuaGVhZGVyUm93KTtcbiAgICAgICAgfVxuICAgICAgICByb3dzLnB1c2goLi4udGhpcy52aXNpYmxlUm93cyk7XG4gICAgICAgIGlmKHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc3QgY29sdW1uV2lkdGhTdW0gPSB0aGlzLmNhbGN1bGF0ZUNvbHVtbldpZHRoKHJvd3MsIGNvbENvdW50KS5yZWR1Y2UoKHdpZHRoU3VtOiBudW1iZXIsIHdpZHRoOiBudW1iZXIpID0+IHdpZHRoU3VtICs9IHdpZHRoLCAwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb24ucmVuZGVyQXMgIT09ICdsaXN0JyAmJiB0aGlzLmNvbnRyb2xsZXIubWF0cml4UmVuZGVyQXMgIT09ICdsaXN0JyAmJiBNYXRoLmZsb29yKGNvbHVtbldpZHRoU3VtKSA8PSBNYXRoLmZsb29yKHRoaXMuZ2V0QXZhbGFibGVXaWR0aChjb2xDb3VudCkpO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFJvd3NUb1JlbmRlcih0YWJsZTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUsIGlzVmVydGljYWw6IGJvb2xlYW4sIGlzV2lkZTogYm9vbGVhbikge1xuICAgICAgICBjb25zdCByb3dzOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3dbXSA9IFtdO1xuICAgICAgICBjb25zdCByZW5kZXJlZFJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgICAgICBpZiAodGFibGUuc2hvd0hlYWRlciAmJiBpc1dpZGUpIHJvd3MucHVzaCh0YWJsZS5oZWFkZXJSb3cpO1xuICAgICAgICByb3dzLnB1c2goLi4ucmVuZGVyZWRSb3dzKTtcbiAgICAgICAgaWYgKHRhYmxlLmhhc1JlbW92ZVJvd3MgJiYgaXNWZXJ0aWNhbCkgcm93cy5wb3AoKTtcbiAgICAgICAgaWYgKHRhYmxlLnNob3dGb290ZXIpIHJvd3MucHVzaCh0YWJsZS5mb290ZXJSb3cpO1xuICAgICAgICByZXR1cm4gcm93cztcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRDb2xDb3VudCh0YWJsZTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUsIHJlbmRlcmVkUm93czogQXJyYXk8UXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93Pik6IG51bWJlciB7XG4gICAgICAgIGlmICghIXJlbmRlcmVkUm93c1swXSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVkUm93c1swXS5jZWxscy5maWx0ZXIoKGNlbGw6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwsIGluZGV4OiBudW1iZXIpID0+ICF0aGlzLmlnbm9yZUNlbGwoY2VsbCwgaW5kZXgpKS5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFibGUuc2hvd0hlYWRlciAmJiB0YWJsZS5oZWFkZXJSb3cgPyB0YWJsZS5oZWFkZXJSb3cuY2VsbHMubGVuZ3RoIDpcbiAgICAgICAgICAgICAgICB0YWJsZS5zaG93Rm9vdGVyICYmIHRhYmxlLmZvb3RlclJvdyA/IHRhYmxlLmZvb3RlclJvdy5jZWxscy5sZW5ndGggOiAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGxldCB0YWJsZTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUgPSB0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVGFibGU7XG4gICAgICAgIGxldCBpc1ZlcnRpY2FsOiBib29sZWFuID0gdGhpcy5xdWVzdGlvbi5jb2x1bW5MYXlvdXQgPT09ICd2ZXJ0aWNhbCc7XG4gICAgICAgIGxldCBjb2xDb3VudDogbnVtYmVyID0gdGhpcy5nZXRDb2xDb3VudCh0YWJsZSwgdGhpcy52aXNpYmxlUm93cyk7XG4gICAgICAgIGlmIChjb2xDb3VudCA9PT0gMCAmJiAhdGhpcy5oYXNEZXRhaWxQYW5lbCkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgQ29tcG9zaXRlQnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KHBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNXaWRlID0gdGhpcy5jYWxjdWxhdGVJc1dpZGUodGFibGUsIGNvbENvdW50KTtcbiAgICAgICAgaWYoIWlzV2lkZSkge1xuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5pc01vYmlsZSA9IHRydWU7XG4gICAgICAgICAgICBpc1ZlcnRpY2FsID0gZmFsc2U7XG4gICAgICAgICAgICB0YWJsZSA9IHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZTtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZVJvd3NWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbENvdW50ID0gdGhpcy5nZXRDb2xDb3VudCh0YWJsZSwgdGhpcy52aXNpYmxlUm93cyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgcm93cyA9IHRoaXMuZ2V0Um93c1RvUmVuZGVyKHRhYmxlLCBpc1ZlcnRpY2FsLCBpc1dpZGUpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzUm93cyhwb2ludCwgcm93cywgY29sQ291bnQsIGlzV2lkZSk7XG4gICAgfVxufVxuXG5TZXJpYWxpemVyLnJlbW92ZVByb3BlcnR5KCdtYXRyaXhkcm9wZG93bicsICdyZW5kZXJBcycpO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eSgnbWF0cml4ZHJvcGRvd24nLCB7XG4gICAgbmFtZTogJ3JlbmRlckFzJyxcbiAgICBkZWZhdWx0OiAnYXV0bycsXG4gICAgdmlzaWJsZTogZmFsc2UsXG4gICAgY2hvaWNlczogWydhdXRvJywgJ2xpc3QnXVxufSk7XG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdtYXRyaXhkcm9wZG93bicsIEZsYXRNYXRyaXhNdWx0aXBsZSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4bXVsdGlwbGUudHMiLCJpbXBvcnQgSW50ZXJ2YWxUcmVlIGZyb20gJ25vZGUtaW50ZXJ2YWwtdHJlZSc7XG5pbXBvcnQgeyBEb2NPcHRpb25zLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmludGVyZmFjZSBQYWNrSW50ZXJ2YWwge1xuICAgIHBhZ2VJbmRleDogbnVtYmVyO1xuICAgIHhMZWZ0OiBudW1iZXI7XG4gICAgeFJpZ2h0OiBudW1iZXI7XG4gICAgeUJvdDogbnVtYmVyO1xuICAgIGFic0JvdDogbnVtYmVyO1xufVxuZXhwb3J0IGNsYXNzIFBhZ2VQYWNrZXIge1xuICAgIHByaXZhdGUgc3RhdGljIGZpbmRCb3RJbnRlcnZhbCh0cmVlOiBJbnRlcnZhbFRyZWU8UGFja0ludGVydmFsPixcbiAgICAgICAgeExlZnQ6IG51bWJlciwgeFJpZ2h0OiBudW1iZXIsIG9wdGlvbnM6IERvY09wdGlvbnMpOiBQYWNrSW50ZXJ2YWwge1xuICAgICAgICBjb25zdCBpbnRlcnZhbHM6IFBhY2tJbnRlcnZhbFtdID0gdHJlZS5zZWFyY2goeExlZnQsIHhSaWdodCk7XG4gICAgICAgIGludGVydmFscy5wdXNoKHtcbiAgICAgICAgICAgIHBhZ2VJbmRleDogMCwgeExlZnQ6XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5tYXJnaW5zLmxlZnQsIHhSaWdodDogb3B0aW9ucy5tYXJnaW5zLmxlZnQsXG4gICAgICAgICAgICB5Qm90OiBvcHRpb25zLm1hcmdpbnMudG9wLCBhYnNCb3Q6IG9wdGlvbnMubWFyZ2lucy50b3BcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbnRlcnZhbHMucmVkdWNlKChteCwgY3IpID0+IHtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhjci54UmlnaHQgLSB4TGVmdCkgPCBTdXJ2ZXlIZWxwZXIuRVBTSUxPTiB8fFxuICAgICAgICAgICAgICAgIE1hdGguYWJzKGNyLnhMZWZ0IC0geFJpZ2h0KSA8IFN1cnZleUhlbHBlci5FUFNJTE9OKSByZXR1cm4gbXg7XG4gICAgICAgICAgICBpZiAoY3IucGFnZUluZGV4IDwgbXgucGFnZUluZGV4KSByZXR1cm4gbXg7XG4gICAgICAgICAgICBpZiAoY3IucGFnZUluZGV4ID4gbXgucGFnZUluZGV4KSByZXR1cm4gY3I7XG4gICAgICAgICAgICByZXR1cm4gY3IueUJvdCA+IG14LnlCb3QgPyBjciA6IG14O1xuICAgICAgICB9LCBpbnRlcnZhbHNbaW50ZXJ2YWxzLmxlbmd0aCAtIDFdKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgYWRkUGFjayhwYWNrczogSVBkZkJyaWNrW11bXSwgaW5kZXg6IG51bWJlciwgYnJpY2s6IElQZGZCcmljaykge1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBwYWNrcy5sZW5ndGg7IGkgPD0gaW5kZXg7IGkrKykge1xuICAgICAgICAgICAgcGFja3MucHVzaChbXSk7XG4gICAgICAgIH1cbiAgICAgICAgcGFja3NbaW5kZXhdLnB1c2goYnJpY2spO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHBhY2soZmxhdHM6IElQZGZCcmlja1tdW10sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBJUGRmQnJpY2tbXVtdIHtcbiAgICAgICAgY29uc3QgcGFnZUhlaWdodDogbnVtYmVyID0gY29udHJvbGxlci5wYXBlckhlaWdodCAtXG4gICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMudG9wIC0gY29udHJvbGxlci5tYXJnaW5zLmJvdDtcbiAgICAgICAgY29uc3QgdW5mb2xkRmxhdHM6IElQZGZCcmlja1tdW10gPSBbXTtcbiAgICAgICAgZmxhdHMuZm9yRWFjaCgoZmxhdHNQYWdlOiBJUGRmQnJpY2tbXSkgPT4ge1xuICAgICAgICAgICAgdW5mb2xkRmxhdHMucHVzaChbXSk7XG4gICAgICAgICAgICBmbGF0c1BhZ2UuZm9yRWFjaCgoZmxhdDogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZsYXQuaGVpZ2h0ID4gcGFnZUhlaWdodCArIFN1cnZleUhlbHBlci5FUFNJTE9OKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuZm9sZEZsYXRzW3VuZm9sZEZsYXRzLmxlbmd0aCAtIDFdLnB1c2goLi4uZmxhdC51bmZvbGQoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgdW5mb2xkRmxhdHNbdW5mb2xkRmxhdHMubGVuZ3RoIC0gMV0ucHVzaChmbGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdW5mb2xkRmxhdHMuZm9yRWFjaCgodW5mb2xkRmxhdHNQYWdlOiBJUGRmQnJpY2tbXSkgPT4ge1xuICAgICAgICAgICAgdW5mb2xkRmxhdHNQYWdlLnNvcnQoKGE6IElQZGZCcmljaywgYjogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGEueVRvcCA8IGIueVRvcCkgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgIGlmIChhLnlUb3AgPiBiLnlUb3ApIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIGlmIChhLnhMZWZ0ID4gYi54TGVmdCkgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgaWYgKGEueExlZnQgPCBiLnhMZWZ0KSByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBwYWdlSW5kZXhNb2RlbDogbnVtYmVyID0gMDtcbiAgICAgICAgY29uc3QgcGFja3M6IElQZGZCcmlja1tdW10gPSBbXTtcbiAgICAgICAgY29uc3QgcGFnZUJvdDogbnVtYmVyID0gY29udHJvbGxlci5wYXBlckhlaWdodCAtIGNvbnRyb2xsZXIubWFyZ2lucy5ib3Q7XG4gICAgICAgIHVuZm9sZEZsYXRzLmZvckVhY2goKHVuZm9sZEZsYXRzUGFnZTogSVBkZkJyaWNrW10pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyZWU6IEludGVydmFsVHJlZTxQYWNrSW50ZXJ2YWw+ID0gbmV3IEludGVydmFsVHJlZSgpO1xuICAgICAgICAgICAgbGV0IHBhZ2VJbmRleFNoaWZ0OiBudW1iZXIgPSAwO1xuICAgICAgICAgICAgdW5mb2xkRmxhdHNQYWdlLmZvckVhY2goKGZsYXQ6IElQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB7IHBhZ2VJbmRleCwgeUJvdCwgYWJzQm90IH0gPSBQYWdlUGFja2VyLmZpbmRCb3RJbnRlcnZhbChcbiAgICAgICAgICAgICAgICAgICAgdHJlZSwgZmxhdC54TGVmdCwgZmxhdC54UmlnaHQsIGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gZmxhdC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgZmxhdC55VG9wID0geUJvdCArIGZsYXQueVRvcCAtIGFic0JvdDtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoZmxhdC55VG9wIC0gY29udHJvbGxlci5tYXJnaW5zLnRvcCkgPiBTdXJ2ZXlIZWxwZXIuRVBTSUxPTiAmJlxuICAgICAgICAgICAgICAgICAgICBmbGF0LnlUb3AgKyBoZWlnaHQgPiBwYWdlQm90ICsgU3VydmV5SGVscGVyLkVQU0lMT04gfHwgZmxhdC5pc1BhZ2VCcmVhaykge1xuICAgICAgICAgICAgICAgICAgICBmbGF0LnlUb3AgPSBjb250cm9sbGVyLm1hcmdpbnMudG9wO1xuICAgICAgICAgICAgICAgICAgICBwYWdlSW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgcGFnZUluZGV4U2hpZnQgPSBNYXRoLm1heChwYWdlSW5kZXhTaGlmdCwgcGFnZUluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHJlZS5pbnNlcnQoZmxhdC54TGVmdCwgZmxhdC54UmlnaHQsIHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZUluZGV4OiBwYWdlSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHhMZWZ0OiBmbGF0LnhMZWZ0LCB4UmlnaHQ6IGZsYXQueFJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB5Qm90OiBmbGF0LnlUb3AgKyBoZWlnaHQsIGFic0JvdDogZmxhdC55Qm90XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZmxhdC55Qm90ID0gZmxhdC55VG9wICsgaGVpZ2h0O1xuICAgICAgICAgICAgICAgIFBhZ2VQYWNrZXIuYWRkUGFjayhwYWNrcywgcGFnZUluZGV4TW9kZWwgKyBwYWdlSW5kZXgsIGZsYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwYWdlSW5kZXhNb2RlbCArPSBwYWdlSW5kZXhTaGlmdCArIDE7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGFja3M7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wYWdlX2xheW91dC9wYWdlX3BhY2tlci50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25Cb29sZWFuTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IENoZWNrSXRlbUJyaWNrIH0gZnJvbSAnLi9wZGZfY2hlY2tpdGVtJztcblxuZXhwb3J0IGNsYXNzIEJvb2xlYW5JdGVtQnJpY2sgZXh0ZW5kcyBDaGVja0l0ZW1CcmljayB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0KSB7XG4gICAgICAgIHN1cGVyKGNvbnRyb2xsZXIsIHJlY3QsXG4gICAgICAgICAgICAoPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPnF1ZXN0aW9uKS5pZCxcbiAgICAgICAgICAgIHsgcXVlc3Rpb246IHF1ZXN0aW9uLCByZWFkT25seTogcXVlc3Rpb24uaXNSZWFkT25seSwgY2hlY2tlZDogKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikuY2hlY2tlZFZhbHVlIH0pO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfYm9vbGVhbml0ZW0udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCwgSXRlbVZhbHVlIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBDaGVja0l0ZW1CcmljayB9IGZyb20gJy4vcGRmX2NoZWNraXRlbSc7XG5cbmV4cG9ydCBjbGFzcyBDaGVja2JveEl0ZW1CcmljayBleHRlbmRzIENoZWNrSXRlbUJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBzdXBlcihjb250cm9sbGVyLCByZWN0LFxuICAgICAgICAgICAgKDxRdWVzdGlvbkNoZWNrYm94TW9kZWw+cXVlc3Rpb24pLmlkICsgJ2luZGV4JyArIGluZGV4LFxuICAgICAgICAgICAgeyBxdWVzdGlvbjogcXVlc3Rpb24sIHJlYWRPbmx5OiBxdWVzdGlvbi5pc1JlYWRPbmx5IHx8ICFpdGVtLmlzRW5hYmxlZCwgaXRlbTogaXRlbSwgY2hlY2tlZDogKDxRdWVzdGlvbkNoZWNrYm94TW9kZWw+cXVlc3Rpb24pLmlzSXRlbVNlbGVjdGVkKGl0ZW0pLCBpbmRleDogaW5kZXggfSk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9jaGVja2JveGl0ZW0udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIHNldHRpbmdzIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBUZXh0Qm94QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0Ym94JztcblxuZXhwb3J0IGNsYXNzIENvbW1lbnRCcmljayBleHRlbmRzIFRleHRCb3hCcmljayB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgaXNRdWVzdGlvbjogYm9vbGVhbiwgaW5kZXg6IG51bWJlciA9IDApIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIGlzUXVlc3Rpb24sIHRydWUsIGluZGV4KTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIHNob3VsZFJlbmRlckZsYXRCb3JkZXJzKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZih0aGlzLmlzUXVlc3Rpb24gJiYgdGhpcy5xdWVzdGlvbi5nZXRUeXBlKCkgIT09ICdjb21tZW50JykgcmV0dXJuIHN1cGVyLnNob3VsZFJlbmRlckZsYXRCb3JkZXJzKCk7XG4gICAgICAgIHJldHVybiBzZXR0aW5ncy5yZWFkT25seUNvbW1lbnRSZW5kZXJNb2RlID09PSAndGV4dGFyZWEnO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfY29tbWVudC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25Ecm9wZG93bk1vZGVsLCBJdGVtVmFsdWUgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBEcm9wZG93bkJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25Ecm9wZG93bk1vZGVsO1xuICAgIHByb3RlY3RlZCBpc1F1ZXN0aW9uOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBpc011bHRpbGluZTogYm9vbGVhbjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbixcbiAgICAgICAgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlY3Q6IElSZWN0KSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkRyb3Bkb3duTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgY29tYm9Cb3ggPSBuZXcgKDxhbnk+dGhpcy5jb250cm9sbGVyLmRvYy5BY3JvRm9ybUNvbWJvQm94KSgpO1xuICAgICAgICBjb21ib0JveC5maWVsZE5hbWUgPSB0aGlzLnF1ZXN0aW9uLmlkO1xuICAgICAgICBjb21ib0JveC5SZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZUFjcm9mb3JtUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QodGhpcyxcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuZm9ybVNjYWxlKHRoaXMuY29udHJvbGxlciwgdGhpcykpKTtcbiAgICAgICAgY29tYm9Cb3guZWRpdCA9IGZhbHNlO1xuICAgICAgICBjb21ib0JveC5jb2xvciA9IHRoaXMudGV4dENvbG9yO1xuICAgICAgICBjb25zdCBvcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5zaG93T3B0aW9uc0NhcHRpb24pIHtcbiAgICAgICAgICAgIG9wdGlvbnMucHVzaCh0aGlzLmdldENvcnJlY3RlZFRleHQodGhpcy5xdWVzdGlvbi5vcHRpb25zQ2FwdGlvbikpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXMuZm9yRWFjaCgoaXRlbTogSXRlbVZhbHVlKSA9PiB7XG4gICAgICAgICAgICBvcHRpb25zLnB1c2godGhpcy5nZXRDb3JyZWN0ZWRUZXh0KFN1cnZleUhlbHBlci5nZXRMb2NTdHJpbmcoaXRlbS5sb2NUZXh0KSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29tYm9Cb3guc2V0T3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgY29tYm9Cb3guZm9udE5hbWUgPSB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWU7XG4gICAgICAgIGNvbWJvQm94LmZvbnRTaXplID0gdGhpcy5mb250U2l6ZTtcbiAgICAgICAgY29tYm9Cb3gucmVhZE9ubHkgPSB0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHk7XG4gICAgICAgIGNvbWJvQm94LmlzVW5pY29kZSA9IFN1cnZleUhlbHBlci5pc0N1c3RvbUZvbnQoXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIGNvbWJvQm94LmZvbnROYW1lKTtcbiAgICAgICAgY29tYm9Cb3guViA9IHRoaXMuZ2V0Q29ycmVjdGVkVGV4dChTdXJ2ZXlIZWxwZXIuZ2V0RHJvcGRvd25RdWVzdGlvblZhbHVlKHRoaXMucXVlc3Rpb24pKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5hZGRGaWVsZChjb21ib0JveCk7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfZHJvcGRvd24udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuXG5leHBvcnQgY2xhc3MgSFRNTEJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByaXZhdGUgbWFyZ2luczogeyB0b3A6IG51bWJlciwgYm90dG9tOiBudW1iZXIgfTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBodG1sOiBzdHJpbmcsIGlzSW1hZ2U6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIGlmIChpc0ltYWdlKSB7XG4gICAgICAgICAgICB0aGlzLm1hcmdpbnMgPSB7XG4gICAgICAgICAgICAgICAgdG9wOiAwLjAsXG4gICAgICAgICAgICAgICAgYm90dG9tOiAwLjBcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1hcmdpbnMgPSB7XG4gICAgICAgICAgICAgICAgdG9wOiBjb250cm9sbGVyLm1hcmdpbnMudG9wLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogY29udHJvbGxlci5tYXJnaW5zLmJvdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSB0aGlzLmZvbnRTaXplO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5mcm9tSFRNTCh0aGlzLmh0bWwsIHRoaXMueExlZnQsIHRoaXMueVRvcCwge1xuICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLndpZHRoLCBwYWdlc3BsaXQ6IHRydWUsXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2pzLXBkZi1oaWRkZW4taHRtbC1kaXYnKSkuZm9yRWFjaChcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVsOiBIVE1MRGl2RWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0sIHRoaXMubWFyZ2lucyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2h0bWwudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUG9pbnQgfSBmcm9tICcuLi9lbnRyaWVzL3BkZic7XG5cbmV4cG9ydCBjbGFzcyBJbWFnZUJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBwcm90ZWN0ZWQgaW1hZ2U6IHN0cmluZyxcbiAgICAgICAgcG9pbnQ6IElQb2ludCwgcHJvdGVjdGVkIG9yaWdpbmFsV2lkdGg6IG51bWJlciwgcHJvdGVjdGVkIG9yaWdpbmFsSGVpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHtcbiAgICAgICAgICAgIHhMZWZ0OiBwb2ludC54TGVmdCxcbiAgICAgICAgICAgIHhSaWdodDogcG9pbnQueExlZnQgKyAob3JpZ2luYWxXaWR0aCB8fCAwKSxcbiAgICAgICAgICAgIHlUb3A6IHBvaW50LnlUb3AsXG4gICAgICAgICAgICB5Qm90OiBwb2ludC55VG9wICsgKG9yaWdpbmFsSGVpZ2h0IHx8IDApXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlzUGFnZUJyZWFrID0gdGhpcy5vcmlnaW5hbEhlaWdodCA9PT0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MuYWRkSW1hZ2UodGhpcy5pbWFnZSwgJ1BORycsIHRoaXMueExlZnQsIHRoaXMueVRvcCwgdGhpcy5vcmlnaW5hbFdpZHRoLCB0aGlzLm9yaWdpbmFsSGVpZ2h0KTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2ltYWdlLnRzIiwiaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgTGlua0JyaWNrIGV4dGVuZHMgVGV4dEJyaWNrIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTQ0FMRV9GQUNUT1JfTUFHSUM6IG51bWJlciA9IDAuOTU1O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ09MT1I6IHN0cmluZyA9ICcjMDAwMEVFJztcbiAgICBwdWJsaWMgY29uc3RydWN0b3IodGV4dEZsYXQ6IFRleHRCcmljaywgcHJvdGVjdGVkIGxpbms6IHN0cmluZykge1xuICAgICAgICBzdXBlcigoPExpbmtCcmljaz50ZXh0RmxhdCkucXVlc3Rpb24sXG4gICAgICAgICAgICAoPExpbmtCcmljaz50ZXh0RmxhdCkuY29udHJvbGxlcixcbiAgICAgICAgICAgIHRleHRGbGF0LCAoPExpbmtCcmljaz50ZXh0RmxhdCkudGV4dCk7XG4gICAgICAgIHRoaXMudGV4dENvbG9yID0gTGlua0JyaWNrLkNPTE9SO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBvbGRUZXh0Q29sb3I6IHN0cmluZyA9IHRoaXMuY29udHJvbGxlci5kb2MuZ2V0VGV4dENvbG9yKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0VGV4dENvbG9yKFN1cnZleUhlbHBlci5CQUNLR1JPVU5EX0NPTE9SKTtcbiAgICAgICAgbGV0IGRlc2NlbnQ6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICpcbiAgICAgICAgICAgICh0aGlzLmNvbnRyb2xsZXIuZG9jLmdldExpbmVIZWlnaHRGYWN0b3IoKSAtXG4gICAgICAgICAgICAgICAgTGlua0JyaWNrLlNDQUxFX0ZBQ1RPUl9NQUdJQyk7XG4gICAgICAgIGxldCB5VG9wTGluazogbnVtYmVyID0gdGhpcy55VG9wICtcbiAgICAgICAgICAgICh0aGlzLnlCb3QgLSB0aGlzLnlUb3ApIC0gZGVzY2VudDtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy50ZXh0V2l0aExpbmsodGhpcy50ZXh0LCB0aGlzLnhMZWZ0LFxuICAgICAgICAgICAgeVRvcExpbmssIHsgdXJsOiB0aGlzLmxpbmsgfSk7XG4gICAgICAgIGF3YWl0IHN1cGVyLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0VGV4dENvbG9yKG9sZFRleHRDb2xvcik7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKFN1cnZleUhlbHBlci5nZXRSZWFkb25seVJlbmRlckFzKDxRdWVzdGlvbj50aGlzLnF1ZXN0aW9uLFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyKSAhPT0gJ3RleHQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHN1cGVyLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9saW5rLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgSVNpemUsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dCc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJhZGlvZ3JvdXBXcmFwQ29udGV4dCB7XG4gICAgcXVlc3Rpb246IElRdWVzdGlvbjtcbiAgICByZWFkT25seTogYm9vbGVhbjtcbn1cbmV4cG9ydCBjbGFzcyBSYWRpb0dyb3VwV3JhcCB7XG4gICAgcHJpdmF0ZSBfcmFkaW9Hcm91cDogYW55O1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHByaXZhdGUgY29udGV4dDogSVJhZGlvZ3JvdXBXcmFwQ29udGV4dCkge1xuICAgIH1cbiAgICBwdWJsaWMgYWRkVG9QZGYoY29sb3I6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9yYWRpb0dyb3VwID0gbmV3IHRoaXMuY29udHJvbGxlci5kb2MuQWNyb0Zvcm1SYWRpb0J1dHRvbigpO1xuICAgICAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7fTtcbiAgICAgICAgb3B0aW9ucy5maWVsZE5hbWUgPSB0aGlzLm5hbWU7XG4gICAgICAgIG9wdGlvbnMucmVhZE9ubHkgPSB0aGlzLnJlYWRPbmx5O1xuICAgICAgICBvcHRpb25zLmNvbG9yID0gY29sb3I7XG4gICAgICAgIG9wdGlvbnMuY29udGV4dCA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgKDxTdXJ2ZXlQREY+dGhpcy5jb250ZXh0LnF1ZXN0aW9uLnN1cnZleSk/LmdldFVwZGF0ZWRSYWRpb0dyb3VwV3JhcE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAuZmllbGROYW1lID0gb3B0aW9ucy5maWVsZE5hbWU7XG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAucmVhZE9ubHkgPSBvcHRpb25zLnJlYWRPbmx5O1xuICAgICAgICB0aGlzLl9yYWRpb0dyb3VwLmNvbG9yID0gb3B0aW9ucy5jb2xvcjtcblxuICAgICAgICB0aGlzLl9yYWRpb0dyb3VwLnZhbHVlID0gJyc7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MuYWRkRmllbGQodGhpcy5fcmFkaW9Hcm91cCk7XG4gICAgfVxuICAgIGdldCByYWRpb0dyb3VwKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yYWRpb0dyb3VwO1xuICAgIH1cbiAgICBnZXQgcmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQucmVhZE9ubHk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElSYWRpb0dyb3VwSXRlbUJyaWNrQ29udGV4dCB7XG4gICAgcXVlc3Rpb246IElRdWVzdGlvbjtcbiAgICBjaGVja2VkOiBib29sZWFuO1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAgaXRlbTogSXRlbVZhbHVlO1xufVxuXG5leHBvcnQgY2xhc3MgUmFkaW9JdGVtQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUkFESU9NQVJLRVJfUkVBRE9OTFlfU1lNQk9MOiBzdHJpbmcgPSAnbCc7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUkFESU9NQVJLRVJfUkVBRE9OTFlfRk9OVDogc3RyaW5nID0gJ3phcGZkaW5nYmF0cyc7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBSQURJT01BUktFUl9SRUFET05MWV9GT05UX1NJWkVfU0NBTEU6IG51bWJlciA9IDEuMCAtICgoMi4wICsgTWF0aC5FKSAvIDEwLjApO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJpdmF0ZSBjb250ZXh0OiBJUmFkaW9Hcm91cEl0ZW1Ccmlja0NvbnRleHQsXG4gICAgICAgIHByaXZhdGUgcmFkaW9Hcm91cFdyYXA6IFJhZGlvR3JvdXBXcmFwKSB7XG4gICAgICAgIHN1cGVyKGNvbnRleHQucXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLnRleHRDb2xvciA9IHRoaXMuZm9ybUJvcmRlckNvbG9yO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0U2hvdWxkUmVuZGVyUmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJhZGlvR3JvdXBXcmFwLnJlYWRPbmx5ICYmIFN1cnZleUhlbHBlci5nZXRSZWFkb25seVJlbmRlckFzKFxuICAgICAgICAgICAgPFF1ZXN0aW9uPnRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcikgIT09ICdhY3JvZm9ybScgfHwgdGhpcy5jb250cm9sbGVyLmNvbXByZXNzO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuaW5kZXggPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5yYWRpb0dyb3VwV3JhcC5hZGRUb1BkZih0aGlzLmZvcm1Cb3JkZXJDb2xvcik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9uczogYW55ID0ge307XG4gICAgICAgIG9wdGlvbnMuZmllbGROYW1lID0gdGhpcy5yYWRpb0dyb3VwV3JhcC5uYW1lICsgJ2luZGV4JyArIHRoaXMuY29udGV4dC5pbmRleDtcbiAgICAgICAgbGV0IGZvcm1TY2FsZTogbnVtYmVyID0gU3VydmV5SGVscGVyLmZvcm1TY2FsZSh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICBvcHRpb25zLlJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdCh0aGlzLCBmb3JtU2NhbGUpKTtcbiAgICAgICAgb3B0aW9ucy5jb2xvciA9IHRoaXMuZm9ybUJvcmRlckNvbG9yO1xuICAgICAgICBvcHRpb25zLmFwcGVhcmFuY2UgPSB0aGlzLmNvbnRyb2xsZXIuZG9jLkFjcm9Gb3JtLkFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ2lyY2xlO1xuICAgICAgICBvcHRpb25zLnJhZGlvR3JvdXAgPSB0aGlzLnJhZGlvR3JvdXBXcmFwLnJhZGlvR3JvdXA7XG4gICAgICAgIG9wdGlvbnMuY29udGV4dCA9IHRoaXMuY29udGV4dDtcblxuICAgICAgICAoPFN1cnZleVBERj50aGlzLmNvbnRleHQucXVlc3Rpb24uc3VydmV5KT8uZ2V0VXBkYXRlZFJhZGlvSXRlbUFjcm9mb3JtT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgbGV0IHJhZGlvQnV0dG9uOiBhbnkgPSB0aGlzLnJhZGlvR3JvdXBXcmFwLnJhZGlvR3JvdXAuY3JlYXRlT3B0aW9uKG9wdGlvbnMuZmllbGROYW1lKTtcblxuICAgICAgICBpZiAodGhpcy5jb250ZXh0LmNoZWNrZWQpIHtcbiAgICAgICAgICAgIGlmKCFvcHRpb25zLkFTKSB7XG4gICAgICAgICAgICAgICAgcmFkaW9CdXR0b24uQVMgPSAnLycgKyBvcHRpb25zLmZpZWxkTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKCF0aGlzLnJhZGlvR3JvdXBXcmFwLnJhZGlvR3JvdXAudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJhZGlvR3JvdXBXcmFwLnJhZGlvR3JvdXAudmFsdWUgPSBvcHRpb25zLmZpZWxkTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmKCFvcHRpb25zLkFTKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5BUyA9ICcvT2ZmJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByYWRpb0J1dHRvbi5SZWN0ID0gb3B0aW9ucy5SZWN0O1xuICAgICAgICByYWRpb0J1dHRvbi5jb2xvciA9IG9wdGlvbnMuY29sb3I7XG5cbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIHRoaXMucmFkaW9Hcm91cFdyYXAucmFkaW9Hcm91cC5zZXRBcHBlYXJhbmNlKFxuICAgICAgICAgICAgb3B0aW9ucy5hcHBlYXJhbmNlXG4gICAgICAgICk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuY2hlY2tlZCkge1xuICAgICAgICAgICAgY29uc3QgcmFkaW9tYXJrZXJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHRoaXMsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgY29uc3Qgb2xkRm9udFNpemU6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgICAgIGNvbnN0IG9sZEZvbnROYW1lOiBzdHJpbmcgPSB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWU7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWUgPSBSYWRpb0l0ZW1Ccmljay5SQURJT01BUktFUl9SRUFET05MWV9GT05UO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKlxuICAgICAgICAgICAgICAgIFJhZGlvSXRlbUJyaWNrLlJBRElPTUFSS0VSX1JFQURPTkxZX0ZPTlRfU0laRV9TQ0FMRTtcbiAgICAgICAgICAgIGxldCByYWRpb21hcmtlclNpemU6IElTaXplID0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFxuICAgICAgICAgICAgICAgIFJhZGlvSXRlbUJyaWNrLlJBRElPTUFSS0VSX1JFQURPTkxZX1NZTUJPTCk7XG4gICAgICAgICAgICByYWRpb21hcmtlclBvaW50LnhMZWZ0ICs9IHRoaXMud2lkdGggLyAyLjAgLSByYWRpb21hcmtlclNpemUud2lkdGggLyAyLjA7XG4gICAgICAgICAgICByYWRpb21hcmtlclBvaW50LnlUb3AgKz0gdGhpcy5oZWlnaHQgLyAyLjAgLSByYWRpb21hcmtlclNpemUuaGVpZ2h0IC8gMi4wO1xuICAgICAgICAgICAgbGV0IHJhZGlvbWFya2VyRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgICAgIHJhZGlvbWFya2VyUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICBSYWRpb0l0ZW1Ccmljay5SQURJT01BUktFUl9SRUFET05MWV9TWU1CT0wsIFRleHRCcmljayk7XG4gICAgICAgICAgICAoPGFueT5yYWRpb21hcmtlckZsYXQudW5mb2xkKClbMF0pLnRleHRDb2xvciA9IHRoaXMudGV4dENvbG9yO1xuICAgICAgICAgICAgYXdhaXQgcmFkaW9tYXJrZXJGbGF0LnJlbmRlcigpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWUgPSBvbGRGb250TmFtZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfcmFkaW9pdGVtLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvblJhbmtpbmdNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBJU2l6ZSwgRG9jQ29udHJvbGxlciwgSVBvaW50IH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4vcGRmX3RleHQnO1xuaW1wb3J0IHsgQ2hlY2tJdGVtQnJpY2sgfSBmcm9tICcuL3BkZl9jaGVja2l0ZW0nO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBSYW5raW5nSXRlbUJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25SYW5raW5nTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcm90ZWN0ZWQgbWFyazogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblJhbmtpbmdNb2RlbD5xdWVzdGlvbjtcbiAgICAgICAgdGhpcy50ZXh0Q29sb3IgPSB0aGlzLmZvcm1Cb3JkZXJDb2xvcjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICAgICAgY29uc3QgbWFya1BvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQodGhpcywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplICpcbiAgICAgICAgICAgIENoZWNrSXRlbUJyaWNrLkNIRUNLTUFSS19SRUFET05MWV9GT05UX1NJWkVfU0NBTEU7XG4gICAgICAgIGNvbnN0IG1hcmtTaXplOiBJU2l6ZSA9IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dCh0aGlzLm1hcmspO1xuICAgICAgICBtYXJrUG9pbnQueExlZnQgKz0gdGhpcy53aWR0aCAvIDIuMCAtIG1hcmtTaXplLndpZHRoIC8gMi4wO1xuICAgICAgICBtYXJrUG9pbnQueVRvcCArPSB0aGlzLmhlaWdodCAvIDIuMCAtIG1hcmtTaXplLmhlaWdodCAvIDIuMDtcbiAgICAgICAgY29uc3QgbWFya0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIG1hcmtQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0aGlzLm1hcmssIFRleHRCcmljayk7XG4gICAgICAgICg8YW55Pm1hcmtGbGF0LnVuZm9sZCgpWzBdKS50ZXh0Q29sb3IgPSB0aGlzLnRleHRDb2xvcjtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgIGF3YWl0IG1hcmtGbGF0LnJlbmRlcigpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfcmFua2luZ2l0ZW0udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uVGV4dE1vZGVsLCBzZXR0aW5ncyB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljaywgVHJhbnNsYXRlWEZ1bmN0aW9uIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4vcGRmX2NvbXBvc2l0ZSc7XG5cbmV4cG9ydCBjbGFzcyBUZXh0RmllbGRCcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uVGV4dE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJvdGVjdGVkIGlzUXVlc3Rpb246IGJvb2xlYW4sXG4gICAgICAgIHByb3RlY3RlZCBmaWVsZE5hbWU6IHN0cmluZywgcHJvdGVjdGVkIHZhbHVlOiBzdHJpbmcsXG4gICAgICAgIHByb3RlY3RlZCBwbGFjZWhvbGRlcjogc3RyaW5nLCBwdWJsaWMgaXNSZWFkT25seTogYm9vbGVhbixcbiAgICAgICAgcHJvdGVjdGVkIGlzTXVsdGlsaW5lOiBib29sZWFuLCBwcm90ZWN0ZWQgaW5wdXRUeXBlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uVGV4dE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcml2YXRlIHJlbmRlckNvbG9yUXVlc3Rpb24oKTogdm9pZCB7XG4gICAgICAgIGxldCBvbGRGaWxsQ29sb3I6IHN0cmluZyA9IHRoaXMuY29udHJvbGxlci5kb2MuZ2V0RmlsbENvbG9yKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0RmlsbENvbG9yKHRoaXMucXVlc3Rpb24udmFsdWUgfHwgJ2JsYWNrJyk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MucmVjdCh0aGlzLnhMZWZ0LCB0aGlzLnlUb3AsXG4gICAgICAgICAgICB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgJ0YnKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRGaWxsQ29sb3Iob2xkRmlsbENvbG9yKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyQ29sb3JRdWVzdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0RmllbGQ6IGFueSA9IHRoaXMuaW5wdXRUeXBlID09PSAncGFzc3dvcmQnID9cbiAgICAgICAgICAgIG5ldyAoPGFueT50aGlzLmNvbnRyb2xsZXIuZG9jLkFjcm9Gb3JtUGFzc3dvcmRGaWVsZCkoKSA6XG4gICAgICAgICAgICBuZXcgKDxhbnk+dGhpcy5jb250cm9sbGVyLmRvYy5BY3JvRm9ybVRleHRGaWVsZCkoKTtcbiAgICAgICAgaW5wdXRGaWVsZC5maWVsZE5hbWUgPSB0aGlzLmZpZWxkTmFtZTtcbiAgICAgICAgaW5wdXRGaWVsZC5mb250TmFtZSA9IHRoaXMuY29udHJvbGxlci5mb250TmFtZTtcbiAgICAgICAgaW5wdXRGaWVsZC5mb250U2l6ZSA9IHRoaXMuZm9udFNpemU7XG4gICAgICAgIGlucHV0RmllbGQuaXNVbmljb2RlID0gU3VydmV5SGVscGVyLmlzQ3VzdG9tRm9udChcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgaW5wdXRGaWVsZC5mb250TmFtZSk7XG4gICAgICAgIGlmICh0aGlzLmlucHV0VHlwZSAhPT0gJ3Bhc3N3b3JkJykge1xuICAgICAgICAgICAgaW5wdXRGaWVsZC5WID0gJyAnICsgdGhpcy5nZXRDb3JyZWN0ZWRUZXh0KHRoaXMudmFsdWUpO1xuICAgICAgICAgICAgaW5wdXRGaWVsZC5EViA9ICcgJyArIHRoaXMuZ2V0Q29ycmVjdGVkVGV4dCh0aGlzLnBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlucHV0RmllbGQudmFsdWUgPSAnJztcbiAgICAgICAgaW5wdXRGaWVsZC5tdWx0aWxpbmUgPSB0aGlzLmlzTXVsdGlsaW5lO1xuICAgICAgICBpbnB1dEZpZWxkLnJlYWRPbmx5ID0gdGhpcy5pc1JlYWRPbmx5O1xuICAgICAgICBpbnB1dEZpZWxkLmNvbG9yID0gdGhpcy50ZXh0Q29sb3I7XG4gICAgICAgIGxldCBmb3JtU2NhbGU6IG51bWJlciA9IFN1cnZleUhlbHBlci5mb3JtU2NhbGUodGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICAgICAgaW5wdXRGaWVsZC5tYXhGb250U2l6ZSA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZSAqIGZvcm1TY2FsZTtcbiAgICAgICAgaW5wdXRGaWVsZC5SZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZUFjcm9mb3JtUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QodGhpcywgZm9ybVNjYWxlKSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MuYWRkRmllbGQoaW5wdXRGaWVsZCk7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2hvdWxkUmVuZGVyRmxhdEJvcmRlcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBzZXR0aW5ncy5yZWFkT25seVRleHRSZW5kZXJNb2RlID09PSAnaW5wdXQnO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0U2hvdWxkUmVuZGVyUmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBTdXJ2ZXlIZWxwZXIuc2hvdWxkUmVuZGVyUmVhZE9ubHkodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0aGlzLmlzUmVhZE9ubHkpO1xuICAgIH1cbiAgICBwcml2YXRlIF90ZXh0QnJpY2s6IElQZGZCcmljaztcbiAgICBwdWJsaWMgZ2V0IHRleHRCcmljaygpOiBJUGRmQnJpY2sge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGV4dEJyaWNrO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IHRleHRCcmljayh2YWw6IElQZGZCcmljaykge1xuICAgICAgICB0aGlzLl90ZXh0QnJpY2sgPSB2YWw7XG4gICAgICAgIGNvbnN0IHVuRm9sZGVkQnJpY2tzID0gdmFsLnVuZm9sZCgpO1xuICAgICAgICBjb25zdCBicmlja3NDb3VudCA9IHVuRm9sZGVkQnJpY2tzLmxlbmd0aDtcbiAgICAgICAgbGV0IHJlbmRlcmVkQnJpY2tzQ291bnQgPSAwO1xuICAgICAgICBjb25zdCBicmlja3NCeVBhZ2U6IHsgW2luZGV4OiBudW1iZXJdOiBBcnJheTxQZGZCcmljaz4gfSA9IHt9O1xuICAgICAgICBjb25zdCBhZnRlclJlbmRlclRleHRCcmlja0NhbGxiYWNrID0gKGJyaWNrOiBQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgaWYodGhpcy5zaG91bGRSZW5kZXJGbGF0Qm9yZGVycygpKSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyZWRCcmlja3NDb3VudCsrO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlTnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmdldEN1cnJlbnRQYWdlSW5kZXgoKTtcbiAgICAgICAgICAgICAgICBpZighYnJpY2tzQnlQYWdlW2N1cnJlbnRQYWdlTnVtYmVyXSkge1xuICAgICAgICAgICAgICAgICAgICBicmlja3NCeVBhZ2VbY3VycmVudFBhZ2VOdW1iZXJdID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyaWNrc0J5UGFnZVtjdXJyZW50UGFnZU51bWJlcl0ucHVzaChicmljayk7XG4gICAgICAgICAgICAgICAgaWYocmVuZGVyZWRCcmlja3NDb3VudCA+PSBicmlja3NDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYnJpY2tzQnlQYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyZWRPbk9uZVBhZ2UgPSBrZXlzLmxlbmd0aCA9PSAxO1xuICAgICAgICAgICAgICAgICAgICBrZXlzLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJpY2tzQnlQYWdlW2tleSBhcyBhbnldLmZvckVhY2goKGJyaWNrOiBQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUJyaWNrLmFkZEJyaWNrKGJyaWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFkZGluZyA9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLlZBTFVFX1JFQURPTkxZX1BBRERJTkdfU0NBTEU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib3JkZXJSZWN0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhMZWZ0OiB0aGlzLnhMZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhSaWdodDogdGhpcy54UmlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeVRvcDogcmVuZGVyZWRPbk9uZVBhZ2UgPyB0aGlzLnlUb3AgOiBjb21wb3NpdGVCcmljay55VG9wIC0gcGFkZGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5Qm90OiByZW5kZXJlZE9uT25lUGFnZSA/IHRoaXMueUJvdCA6IGNvbXBvc2l0ZUJyaWNrLnlCb3QgKyBwYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogcmVuZGVyZWRPbk9uZVBhZ2UgPyB0aGlzLmhlaWdodCA6IGNvbXBvc2l0ZUJyaWNrLmhlaWdodCArIDIgKiBwYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Cb3JkZXJDb2xvcjogdGhpcy5mb3JtQm9yZGVyQ29sb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnNldFBhZ2UoTnVtYmVyKGtleSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgYm9yZGVyUmVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuc2V0UGFnZShjdXJyZW50UGFnZU51bWJlcik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdW5Gb2xkZWRCcmlja3MuZm9yRWFjaCgoYnJpY2s6IFBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICBicmljay5hZnRlclJlbmRlckNhbGxiYWNrID0gYWZ0ZXJSZW5kZXJUZXh0QnJpY2tDYWxsYmFjay5iaW5kKHRoaXMsIGJyaWNrKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKHRoaXMueExlZnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHRoaXMueFJpZ2h0KTtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRUeXBlID09PSAnY29sb3InKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckNvbG9yUXVlc3Rpb24oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudGV4dEJyaWNrLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgfVxuICAgIHB1YmxpYyB1bmZvbGQoKTogSVBkZkJyaWNrW10ge1xuICAgICAgICBpZiAodGhpcy5nZXRTaG91bGRSZW5kZXJSZWFkT25seSgpICYmIHRoaXMuaW5wdXRUeXBlICE9PSAnY29sb3InKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50ZXh0QnJpY2sudW5mb2xkKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIudW5mb2xkKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIHRyYW5zbGF0ZVgoZnVuYzogVHJhbnNsYXRlWEZ1bmN0aW9uKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGZ1bmModGhpcy54TGVmdCwgdGhpcy54UmlnaHQpO1xuICAgICAgICB0aGlzLl94TGVmdCA9IHJlcy54TGVmdDtcbiAgICAgICAgdGhpcy5feFJpZ2h0ID0gcmVzLnhSaWdodDtcbiAgICAgICAgaWYodGhpcy50ZXh0QnJpY2spIHtcbiAgICAgICAgICAgIHRoaXMudGV4dEJyaWNrLnRyYW5zbGF0ZVgoZnVuYyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIHNldFhMZWZ0KHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gdmFsIC0gdGhpcy5feExlZnQ7XG4gICAgICAgIHN1cGVyLnNldFhMZWZ0KHZhbCk7XG4gICAgICAgIGlmKHRoaXMudGV4dEJyaWNrKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRCcmljay54TGVmdCA9IHRoaXMudGV4dEJyaWNrLnhMZWZ0ICsgZGVsdGE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIHNldFhSaWdodCh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBkZWx0YSA9IHZhbCAtIHRoaXMuX3hSaWdodDtcbiAgICAgICAgc3VwZXIuc2V0WFJpZ2h0KHZhbCk7XG4gICAgICAgIGlmKHRoaXMudGV4dEJyaWNrKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRCcmljay54UmlnaHQgPSB0aGlzLnRleHRCcmljay54UmlnaHQgKyBkZWx0YTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0ZWQgc2V0WVRvcCh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBkZWx0YSA9IHZhbCAtIHRoaXMuX3lUb3A7XG4gICAgICAgIHN1cGVyLnNldFlUb3AodmFsKTtcbiAgICAgICAgaWYodGhpcy50ZXh0QnJpY2spIHtcbiAgICAgICAgICAgIHRoaXMudGV4dEJyaWNrLnlUb3AgPSB0aGlzLnRleHRCcmljay55VG9wICsgZGVsdGE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdGVkIHNldFlCb3R0b20odmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGVsdGEgPSB2YWwgLSB0aGlzLl95Qm90O1xuICAgICAgICBzdXBlci5zZXRZQm90dG9tKHZhbCk7XG4gICAgICAgIGlmKHRoaXMudGV4dEJyaWNrKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRCcmljay55Qm90ID0gdGhpcy50ZXh0QnJpY2sueUJvdCArIGRlbHRhO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0ZmllbGQudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uVGV4dE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBUZXh0Qm9sZEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dGJvbGQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBUaXRsZVBhbmVsQnJpY2sgZXh0ZW5kcyBUZXh0Qm9sZEJyaWNrIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uVGV4dE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCB0ZXh0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgb2xkRm9udFNpemUgPSB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplICogU3VydmV5SGVscGVyLlRJVExFX1BBTkVMX0ZPTlRfU0laRV9TQ0FMRTtcbiAgICAgICAgYXdhaXQgc3VwZXIucmVuZGVySW50ZXJhY3RpdmUoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl90aXRsZXBhbmVsLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBQYW5lbE1vZGVsLCBQYWdlTW9kZWwsIFF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuXG5leHBvcnQgY2xhc3MgQWRvcm5lcnNCYXNlT3B0aW9ucyB7XG4gICAgcHVibGljIHBvaW50OiBJUG9pbnQ7XG4gICAgcHVibGljIGJyaWNrczogSVBkZkJyaWNrW107XG4gICAgcHVibGljIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXI7XG4gICAgcHVibGljIHJlcG9zaXRvcnk6IEZsYXRSZXBvc2l0b3J5O1xuICAgIHB1YmxpYyBtb2R1bGU6IGFueTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwb2ludDogSVBvaW50LCBicmlja3M6IElQZGZCcmlja1tdLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZXBvc2l0b3J5OiBGbGF0UmVwb3NpdG9yeSwgbW9kdWxlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5wb2ludCA9IHBvaW50O1xuICAgICAgICB0aGlzLmJyaWNrcyA9IGJyaWNrcztcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICAgICAgdGhpcy5yZXBvc2l0b3J5ID0gcmVwb3NpdG9yeTtcbiAgICAgICAgdGhpcy5tb2R1bGUgPSBtb2R1bGU7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEFkb3JuZXJzT3B0aW9ucyBleHRlbmRzIEFkb3JuZXJzQmFzZU9wdGlvbnMge1xuICAgIHB1YmxpYyBxdWVzdGlvbjogUXVlc3Rpb247XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBvaW50OiBJUG9pbnQsIGJyaWNrczogSVBkZkJyaWNrW10sXG4gICAgICAgIHF1ZXN0aW9uOiBRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVwb3NpdG9yeTogRmxhdFJlcG9zaXRvcnksIG1vZHVsZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHBvaW50LCBicmlja3MsIGNvbnRyb2xsZXIsIHJlcG9zaXRvcnksIG1vZHVsZSk7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQWRvcm5lcnNQYW5lbE9wdGlvbnMgZXh0ZW5kcyBBZG9ybmVyc0Jhc2VPcHRpb25zIHtcbiAgICBwdWJsaWMgcGFuZWw6IFBhbmVsTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBvaW50OiBJUG9pbnQsIGJyaWNrczogSVBkZkJyaWNrW10sXG4gICAgICAgIHBhbmVsOiBQYW5lbE1vZGVsLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZXBvc2l0b3J5OiBGbGF0UmVwb3NpdG9yeSwgbW9kdWxlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocG9pbnQsIGJyaWNrcywgY29udHJvbGxlciwgcmVwb3NpdG9yeSwgbW9kdWxlKTtcbiAgICAgICAgdGhpcy5wYW5lbCA9IHBhbmVsO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFkb3JuZXJzUGFnZU9wdGlvbnMgZXh0ZW5kcyBBZG9ybmVyc0Jhc2VPcHRpb25zIHtcbiAgICBwdWJsaWMgcGFnZTogUGFnZU1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwb2ludDogSVBvaW50LCBicmlja3M6IElQZGZCcmlja1tdLFxuICAgICAgICBwYWdlOiBQYWdlTW9kZWwsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlcG9zaXRvcnk6IEZsYXRSZXBvc2l0b3J5LCBtb2R1bGU6IGFueSkge1xuICAgICAgICBzdXBlcihwb2ludCwgYnJpY2tzLCBjb250cm9sbGVyLCByZXBvc2l0b3J5LCBtb2R1bGUpO1xuICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIH1cbn1cblxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgTG9jYWxpemFibGVTdHJpbmcsIFF1ZXN0aW9uQm9vbGVhbk1vZGVsLCBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbCwgU3VydmV5TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBCb29sZWFuSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYm9vbGVhbml0ZW0nO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBGbGF0UmFkaW9ncm91cCB9IGZyb20gJy4vZmxhdF9yYWRpb2dyb3VwJztcblxuZXhwb3J0IGNsYXNzIEZsYXRCb29sZWFuQ2hlY2tib3ggZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25Cb29sZWFuTW9kZWw7XG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBuZXcgQm9vbGVhbkl0ZW1Ccmljayh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdChTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChwb2ludCwgaGVpZ2h0LCBoZWlnaHQpLFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuU0VMRUNUX0lURU1fRkxBVF9TQ0FMRSksIHBvaW50LnhMZWZ0KSk7XG4gICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICBjb25zdCB0ZXh0UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIHRleHRQb2ludC54TGVmdCA9IGl0ZW1GbGF0LnhSaWdodCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fSVRFTV9URVhUO1xuICAgICAgICBjb25zdCBsb2NMYWJlbFRleHQ6IExvY2FsaXphYmxlU3RyaW5nID0gdGhpcy5xdWVzdGlvbi5pc0luZGV0ZXJtaW5hdGUgPyBudWxsIDpcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uY2hlY2tlZFZhbHVlID8gdGhpcy5xdWVzdGlvbi5sb2NMYWJlbFRydWUgOiB0aGlzLnF1ZXN0aW9uLmxvY0xhYmVsRmFsc2U7XG4gICAgICAgIGlmIChsb2NMYWJlbFRleHQgIT09IG51bGwgJiYgbG9jTGFiZWxUZXh0LnJlbmRlcmVkSHRtbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgdGV4dFBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGxvY0xhYmVsVGV4dCwgVGV4dEJyaWNrKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtjb21wb3NpdGVGbGF0XTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgRmxhdEJvb2xlYW4gZXh0ZW5kcyBGbGF0UmFkaW9ncm91cCB7XG4gICAgcHJpdmF0ZSBpdGVtczogQXJyYXk8SXRlbVZhbHVlPjtcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLmJ1aWxkSXRlbXMoKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBidWlsZEl0ZW1zKCkge1xuICAgICAgICBjb25zdCBxdWVzdGlvbiA9IDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD4oPGFueT50aGlzLnF1ZXN0aW9uKTtcbiAgICAgICAgY29uc3QgZmFsc2VDaG9pY2UgPSBuZXcgSXRlbVZhbHVlKCg8UXVlc3Rpb25Cb29sZWFuTW9kZWw+cXVlc3Rpb24pLnZhbHVlRmFsc2UgIT09IHVuZGVmaW5lZCA/ICg8UXVlc3Rpb25Cb29sZWFuTW9kZWw+cXVlc3Rpb24pLnZhbHVlRmFsc2UgOiBmYWxzZSk7XG4gICAgICAgIGNvbnN0IHRydWVDaG9pY2UgPSBuZXcgSXRlbVZhbHVlKCg8UXVlc3Rpb25Cb29sZWFuTW9kZWw+cXVlc3Rpb24pLnZhbHVlVHJ1ZSAhPT0gdW5kZWZpbmVkID8gKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikudmFsdWVUcnVlIDogdHJ1ZSk7XG4gICAgICAgIGZhbHNlQ2hvaWNlLmxvY093bmVyID0gcXVlc3Rpb247XG4gICAgICAgIGZhbHNlQ2hvaWNlLnNldExvY1RleHQoKDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbikubG9jTGFiZWxGYWxzZSk7XG4gICAgICAgIHRydWVDaG9pY2UubG9jT3duZXIgPSBxdWVzdGlvbjtcbiAgICAgICAgdHJ1ZUNob2ljZS5zZXRMb2NUZXh0KCg8UXVlc3Rpb25Cb29sZWFuTW9kZWw+cXVlc3Rpb24pLmxvY0xhYmVsVHJ1ZSk7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBbZmFsc2VDaG9pY2UsIHRydWVDaG9pY2VdO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0VmlzaWJsZUNob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1zO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0Q29sQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdib29sZWFuJywgRmxhdEJvb2xlYW4pO1xuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignYm9vbGVhbi1jaGVja2JveCcsIEZsYXRCb29sZWFuQ2hlY2tib3gpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfYm9vbGVhbi50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBRdWVzdGlvbkNoZWNrYm94TW9kZWwsIFF1ZXN0aW9uVGFnYm94TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0U2VsZWN0QmFzZSB9IGZyb20gJy4vZmxhdF9zZWxlY3RiYXNlJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgQ2hlY2tib3hJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jaGVja2JveGl0ZW0nO1xuXG5leHBvcnQgY2xhc3MgRmxhdENoZWNrYm94IGV4dGVuZHMgRmxhdFNlbGVjdEJhc2Uge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25DaGVja2JveE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uQ2hlY2tib3hNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGdlbmVyYXRlRmxhdEl0ZW0ocmVjdDogSVJlY3QsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IElQZGZCcmljayB7XG4gICAgICAgIHJldHVybiBuZXcgQ2hlY2tib3hJdGVtQnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCByZWN0LCBpdGVtLCBpbmRleCk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEZsYXRUYWdib3ggZXh0ZW5kcyBGbGF0Q2hlY2tib3gge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25UYWdib3hNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblRhZ2JveE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0VmlzaWJsZUNob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgICAgIGlmKHRoaXMuY29udHJvbGxlci50YWdib3hTZWxlY3RlZENob2ljZXNPbmx5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5zZWxlY3RlZENob2ljZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VmlzaWJsZUNob2ljZXMoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ3RhZ2JveCcsIEZsYXRUYWdib3gpO1xuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignY2hlY2tib3gnLCBGbGF0Q2hlY2tib3gpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2NoZWNrYm94LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkNvbW1lbnRNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRDb21tZW50IGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uQ29tbWVudE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uQ29tbWVudE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgcmV0dXJuIFthd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQ29tbWVudEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0cnVlLCB7IHJvd3M6IHRoaXMucXVlc3Rpb24ucm93cyB9KV07XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdjb21tZW50JywgRmxhdENvbW1lbnQpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2NvbW1lbnQudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uQ3VzdG9tTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuXG5leHBvcnQgY2xhc3MgRmxhdEN1c3RvbU1vZGVsIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgZmxhdCA9IEZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlKHRoaXMuc3VydmV5LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24uZ2V0VHlwZSgpKTtcbiAgICAgICAgcmV0dXJuIGZsYXQuZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQpO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignY3VzdG9tX21vZGVsJywgRmxhdEN1c3RvbU1vZGVsKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9jdXN0b21fbW9kZWwudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgRHJvcGRvd25CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2Ryb3Bkb3duJztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdERyb3Bkb3duIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkRyb3Bkb3duTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCB2YWx1ZUJyaWNrID0gIXRoaXMuc2hvdWxkUmVuZGVyQXNDb21tZW50ID8gbmV3IERyb3Bkb3duQnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZpZWxkUmVjdChwb2ludCwgdGhpcy5jb250cm9sbGVyKSkgOiBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQ29tbWVudEZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdHJ1ZSwgeyB2YWx1ZTogU3VydmV5SGVscGVyLmdldERyb3Bkb3duUXVlc3Rpb25WYWx1ZSh0aGlzLnF1ZXN0aW9uKSB9KTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2sodmFsdWVCcmljayk7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmlzT3RoZXJTZWxlY3RlZCkge1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgb3RoZXJQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChcbiAgICAgICAgICAgICAgICBvdGhlclBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGZhbHNlLCB7IHJvd3M6IFN1cnZleUhlbHBlci5PVEhFUl9ST1dTX0NPVU5UIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUZsYXRdO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignZHJvcGRvd24nLCBGbGF0RHJvcGRvd24pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2Ryb3Bkb3duLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEZpZWxkQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0ZmllbGQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0RXhwcmVzc2lvbiBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgcmV0dXJuIFthd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQ29tbWVudEZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdHJ1ZSwgeyB2YWx1ZTogdGhpcy5xdWVzdGlvbi5kaXNwbGF5VmFsdWUsIHJlYWRPbmx5OiB0cnVlIH0pXTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2V4cHJlc3Npb24nLCBGbGF0RXhwcmVzc2lvbik7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfZXhwcmVzc2lvbi50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25GaWxlTW9kZWwsIHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElTaXplLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRGaWxlIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IElNQUdFX0dBUF9TQ0FMRTogbnVtYmVyID0gMC4xOTU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBURVhUX01JTl9TQ0FMRTogbnVtYmVyID0gNS4wO1xuICAgIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9JTUFHRV9GSVQ6IHN0cmluZyA9ICdjb250YWluJztcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uRmlsZU1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25GaWxlTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0SXRlbShwb2ludDogSVBvaW50LCBpdGVtOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGltYWdlU2l6ZT86IElTaXplLFxuICAgIH0pOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlTGlua0ZsYXQoXG4gICAgICAgICAgICBwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLm5hbWUgPT09IHVuZGVmaW5lZCA/ICdpbWFnZScgOiBpdGVtLm5hbWUsIGl0ZW0uY29udGVudCkpO1xuICAgICAgICBpZiAoU3VydmV5SGVscGVyLmNhblByZXZpZXdJbWFnZSh0aGlzLnF1ZXN0aW9uLCBpdGVtLCBpdGVtLmNvbnRlbnQpKSB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZVBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICBpbWFnZVBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0RmlsZS5JTUFHRV9HQVBfU0NBTEU7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQoaW1hZ2VQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB7IGxpbms6IGl0ZW0uY29udGVudCwgd2lkdGg6IGl0ZW0uaW1hZ2VTaXplLndpZHRoLCBoZWlnaHQ6IGl0ZW0uaW1hZ2VTaXplLmhlaWdodCwgb2JqZWN0Rml0OiBGbGF0RmlsZS5ERUZBVUxUX0lNQUdFX0ZJVCB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHByaXZhdGUgYWRkTGluZShyb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10sIGN1cnJQb2ludDogSVBvaW50LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmIChpbmRleCAhPT0gdGhpcy5xdWVzdGlvbi5wcmV2aWV3VmFsdWUubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoY3VyclBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2gobmV3IENvbXBvc2l0ZUJyaWNrKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRJbWFnZVByZXZpZXdDb250ZW50V2lkdGgoaXRlbTogeyBuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBpbWFnZVNpemU/OiBJU2l6ZSB9KSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChpdGVtLmltYWdlU2l6ZS53aWR0aCwgRmxhdEZpbGUuVEVYVF9NSU5fU0NBTEUgKiB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLnByZXZpZXdWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KHBvaW50LCB0aGlzLnF1ZXN0aW9uLFxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi5ub0ZpbGVDaG9zZW5DYXB0aW9uLCBUZXh0QnJpY2spXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10gPSBbbmV3IENvbXBvc2l0ZUJyaWNrKCldO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGxldCB5Qm90OiBudW1iZXIgPSBjdXJyUG9pbnQueVRvcDtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb24ucHJldmlld1ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgaXRlbTogeyBuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBpbWFnZVNpemU/OiBJU2l6ZSB9ID0geyAuLi50aGlzLnF1ZXN0aW9uLnByZXZpZXdWYWx1ZVtpXSB9O1xuICAgICAgICAgICAgY29uc3QgY2FuUHJldmlld0ltYWdlID0gU3VydmV5SGVscGVyLmNhblByZXZpZXdJbWFnZSh0aGlzLnF1ZXN0aW9uLCBpdGVtLCBpdGVtLmNvbnRlbnQpO1xuICAgICAgICAgICAgaWYgKGNhblByZXZpZXdJbWFnZSkge1xuICAgICAgICAgICAgICAgIGl0ZW0uaW1hZ2VTaXplID0gYXdhaXQgU3VydmV5SGVscGVyLmdldENvcnJlY3RlZEltYWdlU2l6ZSh0aGlzLmNvbnRyb2xsZXIsIHsgaW1hZ2VXaWR0aDogdGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoLCBpbWFnZUhlaWdodDogdGhpcy5xdWVzdGlvbi5pbWFnZUhlaWdodCwgaW1hZ2VMaW5rOiB0aGlzLnF1ZXN0aW9uLnByZXZpZXdWYWx1ZVtpXS5jb250ZW50LCBkZWZhdWx0SW1hZ2VXaWR0aDogMjAwLCBkZWZhdWx0SW1hZ2VIZWlnaHQ6IDE1MCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgLSBjdXJyUG9pbnQueExlZnQ7XG4gICAgICAgICAgICBpZiAoY2FuUHJldmlld0ltYWdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9zaXRlV2lkdGggPSBhd2FpdCB0aGlzLmdldEltYWdlUHJldmlld0NvbnRlbnRXaWR0aChpdGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlV2lkdGggPCBjb21wb3NpdGVXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBwb2ludC54TGVmdDtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSB5Qm90O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZExpbmUocm93c0ZsYXRzLCBjdXJyUG9pbnQsIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoY3VyclBvaW50LnhMZWZ0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGN1cnJQb2ludC54TGVmdCAtIGNvbXBvc2l0ZVdpZHRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKGN1cnJQb2ludCwgaXRlbSk7XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IGl0ZW1GbGF0LndpZHRoO1xuICAgICAgICAgICAgICAgIHlCb3QgPSBNYXRoLm1heCh5Qm90LCBpdGVtRmxhdC55Qm90KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZVdpZHRoIDwgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBwb2ludC54TGVmdDtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSB5Qm90O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZExpbmUocm93c0ZsYXRzLCBjdXJyUG9pbnQsIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKGN1cnJQb2ludCwgaXRlbSk7XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IGl0ZW1GbGF0LnhSaWdodCAtIGl0ZW1GbGF0LnhMZWZ0O1xuICAgICAgICAgICAgICAgIHlCb3QgPSBNYXRoLm1heCh5Qm90LCBpdGVtRmxhdC55Qm90KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzRmxhdHM7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdmaWxlJywgRmxhdEZpbGUpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2ZpbGUudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uSHRtbE1vZGVsLCBTZXJpYWxpemVyIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgRW1wdHlCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2VtcHR5JztcblxuZXhwb3J0IHR5cGUgSUhUTUxSZW5kZXJUeXBlID0gJ2F1dG8nIHwgJ3N0YW5kYXJkJyB8ICdpbWFnZSc7XG5leHBvcnQgY2xhc3MgRmxhdEhUTUwgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25IdG1sTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBjaG9vc2VSZW5kZXIoaHRtbDogc3RyaW5nKTogSUhUTUxSZW5kZXJUeXBlIHtcbiAgICAgICAgaWYgKC88W14+XSpzdHlsZVtePF0qPi8udGVzdChodG1sKSB8fFxuICAgICAgICAgICAgLzxbXj5dKnRhYmxlW148XSo+Ly50ZXN0KGh0bWwpIHx8XG4gICAgICAgICAgICAvJlxcdys7Ly50ZXN0KGh0bWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2ltYWdlJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ3N0YW5kYXJkJztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb3JyZWN0SHRtbFJ1bGVzOiBbeyBzZWFyY2hSZWdFeHA6IFJlZ0V4cCwgcmVwbGFjZVN0cmluZzogc3RyaW5nIH1dID0gW1xuICAgICAgICB7IHNlYXJjaFJlZ0V4cDogLyg8XFwvP2JyXFxzKj9cXC8/XFxzKj8+XFxzKil7Mix9L2csIHJlcGxhY2VTdHJpbmc6ICc8YnI+JyB9XG4gICAgXVxuICAgIHByb3RlY3RlZCBjb3JyZWN0SHRtbChodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBGbGF0SFRNTC5jb3JyZWN0SHRtbFJ1bGVzLmZvckVhY2goKHJ1bGUpID0+IHtcbiAgICAgICAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2UocnVsZS5zZWFyY2hSZWdFeHAsIHJ1bGUucmVwbGFjZVN0cmluZyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGxldCByZW5kZXJBczogSUhUTUxSZW5kZXJUeXBlID0gPElIVE1MUmVuZGVyVHlwZT50aGlzLnF1ZXN0aW9uLnJlbmRlckFzO1xuICAgICAgICBpZighU3VydmV5SGVscGVyLmhhc0RvY3VtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBFbXB0eUJyaWNrKFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LCAwLCAwKSldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZW5kZXJBcyA9PT0gJ2F1dG8nKSByZW5kZXJBcyA9IHRoaXMuY29udHJvbGxlci5odG1sUmVuZGVyQXM7XG4gICAgICAgIGlmIChyZW5kZXJBcyA9PT0gJ2F1dG8nKSByZW5kZXJBcyA9IHRoaXMuY2hvb3NlUmVuZGVyKFN1cnZleUhlbHBlci5nZXRMb2NTdHJpbmcodGhpcy5xdWVzdGlvbi5sb2NIdG1sKSk7XG4gICAgICAgIGNvbnN0IGh0bWw6IHN0cmluZyA9IFN1cnZleUhlbHBlci5jcmVhdGVIdG1sQ29udGFpbmVyQmxvY2soU3VydmV5SGVscGVyLmdldExvY1N0cmluZyh0aGlzLnF1ZXN0aW9uLmxvY0h0bWwpLCB0aGlzLmNvbnRyb2xsZXIsIHJlbmRlckFzKTtcbiAgICAgICAgaWYgKHJlbmRlckFzID09PSAnaW1hZ2UnKSB7XG4gICAgICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgY29uc3QgeyB1cmwsIGFzcGVjdCB9OiB7IHVybDogc3RyaW5nLCBhc3BlY3Q6IG51bWJlciB9ID1cbiAgICAgICAgICAgIGF3YWl0IFN1cnZleUhlbHBlci5odG1sVG9JbWFnZShodG1sLCB3aWR0aCwgdGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gd2lkdGggLyBhc3BlY3Q7XG4gICAgICAgICAgICByZXR1cm4gW2F3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgeyBsaW5rOiB1cmwsIHdpZHRoLCBoZWlnaHQgfSldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbU3VydmV5SGVscGVyLnNwbGl0SHRtbFJlY3QodGhpcy5jb250cm9sbGVyLCBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlSFRNTEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0aGlzLmNvcnJlY3RIdG1sKGh0bWwpKSldO1xuICAgIH1cbn1cblxuU2VyaWFsaXplci5yZW1vdmVQcm9wZXJ0eSgnaHRtbCcsICdyZW5kZXJBcycpO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eSgnaHRtbCcsIHtcbiAgICBuYW1lOiAncmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAnc3RhbmRhcmQnLCAnaW1hZ2UnXVxufSk7XG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdodG1sJywgRmxhdEhUTUwpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2h0bWwudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uSW1hZ2VNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIsIElTaXplIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0SW1hZ2UgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25JbWFnZU1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25JbWFnZU1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdldENvcnJlY3RJbWFnZVNpemUoKTogUHJvbWlzZTxJU2l6ZT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgU3VydmV5SGVscGVyLmdldENvcnJlY3RlZEltYWdlU2l6ZSh0aGlzLmNvbnRyb2xsZXIsIHsgaW1hZ2VXaWR0aDogdGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoLCBpbWFnZUhlaWdodDogdGhpcy5xdWVzdGlvbi5pbWFnZUhlaWdodCwgaW1hZ2VMaW5rOiB0aGlzLnF1ZXN0aW9uLmltYWdlTGluayB9KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGltYWdlU2l6ZSA9IGF3YWl0IHRoaXMuZ2V0Q29ycmVjdEltYWdlU2l6ZSgpO1xuICAgICAgICByZXR1cm4gW2F3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIHsgbGluazogdGhpcy5xdWVzdGlvbi5pbWFnZUxpbmssIHdpZHRoOiBpbWFnZVNpemUud2lkdGgsIGhlaWdodDogaW1hZ2VTaXplLmhlaWdodCB9KV07XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdpbWFnZScsIEZsYXRJbWFnZSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2UudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgUXVlc3Rpb25JbWFnZVBpY2tlck1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IEZsYXRSYWRpb2dyb3VwIH0gZnJvbSAnLi9mbGF0X3JhZGlvZ3JvdXAnO1xuaW1wb3J0IHsgQ2hlY2tJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jaGVja2l0ZW0nO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0SW1hZ2VQaWNrZXIgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25JbWFnZVBpY2tlck1vZGVsO1xuICAgIHByb3RlY3RlZCByYWRpbzogRmxhdFJhZGlvZ3JvdXA7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkltYWdlUGlja2VyTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0SXRlbShwb2ludDogSVBvaW50LCBpdGVtOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBwYWdlQXZhaWxhYmxlV2lkdGggPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgIGNvbnN0IGltYWdlRmxhdCA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgeyBsaW5rOiAoPGFueT5pdGVtKS5pbWFnZUxpbmssIHdpZHRoOiBwYWdlQXZhaWxhYmxlV2lkdGgsIGhlaWdodDogcGFnZUF2YWlsYWJsZVdpZHRoIC8gU3VydmV5SGVscGVyLklNQUdFUElDS0VSX1JBVElPIH0pO1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayhpbWFnZUZsYXQpO1xuICAgICAgICBsZXQgYnV0dG9uUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uc2hvd0xhYmVsKSB7XG4gICAgICAgICAgICBsZXQgbGFiZWxGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoYnV0dG9uUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgaXRlbS50ZXh0IHx8IGl0ZW0udmFsdWUsIFRleHRCcmljayk7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGxhYmVsRmxhdCk7XG4gICAgICAgICAgICBidXR0b25Qb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChsYWJlbEZsYXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGJ1dHRvblJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QoYnV0dG9uUG9pbnQsIHBhZ2VBdmFpbGFibGVXaWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24ubXVsdGlTZWxlY3QpIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sobmV3IENoZWNrSXRlbUJyaWNrKHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICBidXR0b25SZWN0LCB0aGlzLnF1ZXN0aW9uLmlkICsgJ2luZGV4JyArIGluZGV4LCB7IHJlYWRPbmx5OiB0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHkgfHwgIWl0ZW0uaXNFbmFibGVkLCBxdWVzdGlvbjogdGhpcy5xdWVzdGlvbiwgaXRlbTogaXRlbSwgY2hlY2tlZDogdGhpcy5xdWVzdGlvbi52YWx1ZS5pbmRleE9mKGl0ZW0udmFsdWUpICE9PSAtMSwgaW5kZXg6IGluZGV4IH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sodGhpcy5yYWRpby5nZW5lcmF0ZUZsYXRJdGVtKGJ1dHRvblJlY3QsIGl0ZW0sIGluZGV4KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICB0aGlzLnJhZGlvID0gdGhpcy5xdWVzdGlvbi5tdWx0aVNlbGVjdCA/IG51bGwgOlxuICAgICAgICAgICAgbmV3IEZsYXRSYWRpb2dyb3VwKHRoaXMuc3VydmV5LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICBjb25zdCByb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10gPSBbbmV3IENvbXBvc2l0ZUJyaWNrKCldO1xuICAgICAgICBjb25zdCBjb2xXaWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLmdldEltYWdlUGlja2VyQXZhaWxhYmxlV2lkdGgoXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIpIC8gU3VydmV5SGVscGVyLklNQUdFUElDS0VSX0NPVU5UO1xuICAgICAgICBsZXQgY29sczogbnVtYmVyID0gfn4oU3VydmV5SGVscGVyLlxuICAgICAgICAgICAgZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikgLyBjb2xXaWR0aCkgfHwgMTtcbiAgICAgICAgY29uc3QgY291bnQ6IG51bWJlciA9IHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXMubGVuZ3RoO1xuICAgICAgICBjb2xzID0gY29scyA8PSBjb3VudCA/IGNvbHMgOiBjb3VudDtcbiAgICAgICAgY29uc3Qgcm93czogbnVtYmVyID0gfn4oTWF0aC5jZWlsKGNvdW50IC8gY29scykpO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCByb3dzOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB5Qm90OiBudW1iZXIgPSBjdXJyUG9pbnQueVRvcDtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgbGV0IGN1cnJNYXJnaW5MZWZ0OiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IGNvbHM7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSBpICogY29scyArIGo7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IGNvdW50KSBicmVhaztcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ID0gY3Vyck1hcmdpbkxlZnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgICAgIGN1cnJNYXJnaW5MZWZ0IC0gY29sV2lkdGg7XG4gICAgICAgICAgICAgICAgY3Vyck1hcmdpbkxlZnQgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ICsgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aDtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oY3VyclBvaW50LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzW2luZGV4XSwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICAgICAgICAgIHlCb3QgPSBNYXRoLm1heCh5Qm90LCBpdGVtRmxhdC55Qm90KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBwb2ludC54TGVmdDtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0geUJvdDtcbiAgICAgICAgICAgIGlmIChpICE9PSByb3dzIC0gMSkge1xuICAgICAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKG5ldyBDb21wb3NpdGVCcmljaygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93c0ZsYXRzO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignaW1hZ2VwaWNrZXInLCBGbGF0SW1hZ2VQaWNrZXIpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2ltYWdlcGlja2VyLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbk1hdHJpeE1vZGVsLCBNYXRyaXhSb3dNb2RlbCxcbiAgICBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbCwgSXRlbVZhbHVlLCBTZXJpYWxpemVyIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIsIElQb2ludCwgSVJlY3QgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJhZGlvZ3JvdXAgfSBmcm9tICcuL2ZsYXRfcmFkaW9ncm91cCc7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0TWF0cml4IGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdBUF9CRVRXRUVOX1JPV1M6IG51bWJlciA9IDAuNTtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uTWF0cml4TW9kZWw7XG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIDxRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbD5xdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25NYXRyaXhNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdHNIZWFkZXIocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgaGVhZGVyczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBpZih0aGlzLnF1ZXN0aW9uLmhhc1Jvd3MpIHtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCArPSB0aGlzLnJvd1RpdGxlV2lkdGggKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IGN1cnJQb2ludC54TGVmdDtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ICs9IChTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikgLSB0aGlzLmNvbHVtbldpZHRoKTtcbiAgICAgICAgICAgIGhlYWRlcnMucHVzaChhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQm9sZFRleHRGbGF0KGN1cnJQb2ludCxcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnNbaV0ubG9jVGV4dCkpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IHRoaXMuY29sdW1uV2lkdGggKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUJyaWNrOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayguLi5oZWFkZXJzKTtcbiAgICAgICAgcmV0dXJuIFtjb21wb3NpdGVCcmljaywgU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVCcmljayksIHRoaXMuY29udHJvbGxlcildO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0c1Jvd3MocG9pbnQ6IElQb2ludCwgaXNWZXJ0aWNhbDogYm9vbGVhbik6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY2VsbHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGxldCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uLnZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXk6IHN0cmluZyA9ICdyb3cnICsgaTtcbiAgICAgICAgICAgIGNvbnN0IGZsYXRzUm93OiBJUGRmQnJpY2tbXSA9IGF3YWl0IG5ldyBGbGF0TWF0cml4Um93KHRoaXMuc3VydmV5LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi52aXNpYmxlUm93c1tpXSwgaSwga2V5LCBpID09IDAsIGlzVmVydGljYWwsIHRoaXMucm93VGl0bGVXaWR0aCwgdGhpcy5jb2x1bW5XaWR0aCkuZ2VuZXJhdGVGbGF0c0NvbnRlbnQoY3VyclBvaW50KTtcbiAgICAgICAgICAgIGN1cnJQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi5mbGF0c1JvdykpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0TWF0cml4LkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgICAgICBjZWxscy5wdXNoKC4uLmZsYXRzUm93KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2VsbHM7XG4gICAgfVxuICAgIHByaXZhdGUgcm93VGl0bGVXaWR0aDogbnVtYmVyO1xuICAgIHByaXZhdGUgY29sdW1uV2lkdGg6IG51bWJlcjtcbiAgICBwcml2YXRlIGNhbGN1bGF0ZUNvbHVtbnNXaWR0aGVzKCkge1xuICAgICAgICBjb25zdCBhdmFpbGFibGVXaWR0aCA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgaWYodGhpcy5xdWVzdGlvbi5oYXNSb3dzICYmIHRoaXMucXVlc3Rpb24ucm93VGl0bGVXaWR0aCkge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICB0aGlzLnJvd1RpdGxlV2lkdGggPSBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aCh0aGlzLnF1ZXN0aW9uLnJvd1RpdGxlV2lkdGgsIGF2YWlsYWJsZVdpZHRoKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gKHRoaXMucm93VGl0bGVXaWR0aCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fQ09MVU1OUyk7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbldpZHRoID0gU3VydmV5SGVscGVyLmdldENvbHVtbldpZHRoKHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ29sdW1ucy5sZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uV2lkdGggPSB0aGlzLnJvd1RpdGxlV2lkdGggPSBTdXJ2ZXlIZWxwZXIuZ2V0Q29sdW1uV2lkdGgodGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLnZpc2libGVDb2x1bW5zLmxlbmd0aCArICh0aGlzLnF1ZXN0aW9uLmhhc1Jvd3MgPyAxIDogMCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbHVtbnNXaWR0aGVzKCk7XG4gICAgICAgIGNvbnN0IGlzVmVydGljYWw6IGJvb2xlYW4gPSB0aGlzLnF1ZXN0aW9uLnJlbmRlckFzID09PSAnbGlzdCcgfHwgdGhpcy5jb250cm9sbGVyLm1hdHJpeFJlbmRlckFzID09PSAnbGlzdCcgfHxcbiAgICAgICAgICAgIHRoaXMuY29sdW1uV2lkdGggPCB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoU3VydmV5SGVscGVyLk1BVFJJWF9DT0xVTU5fV0lEVEgpLndpZHRoO1xuICAgICAgICBsZXQgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBjZWxsczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgaWYgKCFpc1ZlcnRpY2FsICYmIHRoaXMucXVlc3Rpb24uc2hvd0hlYWRlciAmJiB0aGlzLnF1ZXN0aW9uLnZpc2libGVDb2x1bW5zLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICBsZXQgaGVhZGVyczogSVBkZkJyaWNrW10gPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNIZWFkZXIoY3VyclBvaW50KTtcbiAgICAgICAgICAgIGN1cnJQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi5oZWFkZXJzKSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBGbGF0TWF0cml4LkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgIGNlbGxzLnB1c2goLi4uaGVhZGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgY2VsbHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNSb3dzKGN1cnJQb2ludCwgaXNWZXJ0aWNhbCkpO1xuICAgICAgICByZXR1cm4gY2VsbHM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmxhdE1hdHJpeFJvdyBleHRlbmRzIEZsYXRSYWRpb2dyb3VwIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb25NYXRyaXg6IFF1ZXN0aW9uTWF0cml4TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHByaXZhdGUgcm93OiBNYXRyaXhSb3dNb2RlbCwgcHJpdmF0ZSByb3dJbmRleDogbnVtYmVyLFxuICAgICAgICBwcml2YXRlIGtleTogc3RyaW5nLCBwcm90ZWN0ZWQgaXNGaXJzdDogYm9vbGVhbiA9IGZhbHNlLCBwcm90ZWN0ZWQgaXNWZXJ0aWNhbDogYm9vbGVhbiA9IGZhbHNlLCBwcml2YXRlIHJvd1RpdGxlV2lkdGg6IG51bWJlciwgcHJpdmF0ZSBjb2x1bW5XaWR0aDogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uTWF0cml4ID0gPFF1ZXN0aW9uTWF0cml4TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZlcnRpY2FsID9cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1ZlcnRpY2FsbHlDZWxscyhwb2ludCkgOlxuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzSG9yaXpvbnRhbGx5Q2VsbHMocG9pbnQpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVUZXh0Q29tcG9zaXRlKHBvaW50OiBJUG9pbnQsIGNvbHVtbjogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBjaGVja2VkOiBib29sZWFuID0gdGhpcy5yb3cudmFsdWUgPT0gY29sdW1uLnZhbHVlO1xuICAgICAgICBjb25zdCBpdGVtUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KGN1cnJQb2ludCxcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICBjb25zdCByYWRpb0ZsYXQ6IElQZGZCcmljayA9IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShpdGVtUmVjdCwgY29sdW1uLCBpbmRleCwgdGhpcy5rZXksIGNoZWNrZWQsIHsgcm93OiB0aGlzLnJvdywgcm93SW5kZXg6IHRoaXMucm93SW5kZXggfSk7XG4gICAgICAgIGN1cnJQb2ludC55VG9wID0gcmFkaW9GbGF0LnlCb3QgKyB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9JVEVNX1RFWFQ7XG4gICAgICAgIGNvbnN0IGNlbGxUZXh0RmxhdCA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb25NYXRyaXgsIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25NYXRyaXguZ2V0Q2VsbERpc3BsYXlMb2NUZXh0KHRoaXMucm93Lm5hbWUsIGNvbHVtbiksIFRleHRCcmljayk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9zaXRlQnJpY2socmFkaW9GbGF0LCBjZWxsVGV4dEZsYXQpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVJdGVtQ29tcG9pc3RlKHBvaW50OiBJUG9pbnQsIGNvbHVtbjogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBjaGVja2VkOiBib29sZWFuID0gdGhpcy5yb3cudmFsdWUgPT0gY29sdW1uLnZhbHVlO1xuICAgICAgICBjb25zdCBpdGVtUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChjdXJyUG9pbnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICBjb25zdCByYWRpb0ZsYXQ6IElQZGZCcmljayA9IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KGl0ZW1SZWN0LCBTdXJ2ZXlIZWxwZXIuU0VMRUNUX0lURU1fRkxBVF9TQ0FMRSksIGl0ZW1SZWN0LnhMZWZ0KSwgY29sdW1uLCBpbmRleCwgdGhpcy5rZXksIGNoZWNrZWQsIHsgcm93OiB0aGlzLnJvdywgcm93SW5kZXg6IHRoaXMucm93SW5kZXggfSk7XG4gICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHJhZGlvRmxhdC54UmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgY29uc3QgcmFkaW9UZXh0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoY3VyclBvaW50LCB0aGlzLnF1ZXN0aW9uTWF0cml4LFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCBjb2x1bW4ubG9jVGV4dCwgVGV4dEJyaWNrKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVCcmljayhyYWRpb0ZsYXQsIHJhZGlvVGV4dCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRzSG9yaXpvbnRhbGx5Q2VsbHMocG9pbnQ6IElQb2ludCkge1xuICAgICAgICBjb25zdCBjZWxsczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbk1hdHJpeC5oYXNSb3dzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArPSAoU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpIC0gdGhpcy5yb3dUaXRsZVdpZHRoKTtcbiAgICAgICAgICAgIGNlbGxzLnB1c2goYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbk1hdHJpeCwgdGhpcy5jb250cm9sbGVyLCB0aGlzLnJvdy5sb2NUZXh0LCBUZXh0QnJpY2spKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCArPSB0aGlzLnJvd1RpdGxlV2lkdGggKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uTWF0cml4LnZpc2libGVDb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW46IEl0ZW1WYWx1ZSA9IHRoaXMucXVlc3Rpb25NYXRyaXgudmlzaWJsZUNvbHVtbnNbaV07XG4gICAgICAgICAgICBjb25zdCBjaGVja2VkOiBib29sZWFuID0gdGhpcy5yb3cudmFsdWUgPT0gY29sdW1uLnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ID0gY3VyclBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKz0gKFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSAtIHRoaXMuY29sdW1uV2lkdGgpO1xuICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25NYXRyaXguaGFzQ2VsbFRleHQpIHtcbiAgICAgICAgICAgICAgICBjZWxscy5wdXNoKGF3YWl0IHRoaXMuZ2VuZXJhdGVUZXh0Q29tcG9zaXRlKGN1cnJQb2ludCwgY29sdW1uLCBpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0LCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgICAgICAgICAgY2VsbHMucHVzaCh0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oU3VydmV5SGVscGVyLm1vdmVSZWN0KFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KGl0ZW1SZWN0LCBTdXJ2ZXlIZWxwZXIuU0VMRUNUX0lURU1fRkxBVF9TQ0FMRSksIGN1cnJQb2ludC54TGVmdCksIGNvbHVtbiwgaSwgdGhpcy5rZXksIGNoZWNrZWQsIHsgcm93OiB0aGlzLnJvdywgcm93SW5kZXg6IHRoaXMucm93SW5kZXggfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IHRoaXMuY29sdW1uV2lkdGggKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKC4uLmNlbGxzKTtcbiAgICAgICAgcmV0dXJuIFtjb21wb3NpdGVCcmljaywgU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVCcmljayksIHRoaXMuY29udHJvbGxlcildO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0c1ZlcnRpY2FsbHlDZWxscyhwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjZWxsczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbk1hdHJpeC5oYXNSb3dzKSB7XG4gICAgICAgICAgICBjb25zdCByb3dUZXh0RmxhdCA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb25NYXRyaXgsXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCB0aGlzLnJvdy5sb2NUZXh0LCBUZXh0QnJpY2spO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSByb3dUZXh0RmxhdC55Qm90ICsgRmxhdFF1ZXN0aW9uLkNPTlRFTlRfR0FQX1ZFUlRfU0NBTEUgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgIGNlbGxzLnB1c2gocm93VGV4dEZsYXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVGbGF0Q29tcG9zaXRlID0gKHRoaXMucXVlc3Rpb25NYXRyaXguaGFzQ2VsbFRleHQpID8gdGhpcy5nZW5lcmF0ZVRleHRDb21wb3NpdGUgOiB0aGlzLmdlbmVyYXRlSXRlbUNvbXBvaXN0ZTtcbiAgICAgICAgY2VsbHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlVmVydGljYWxseUl0ZW1zKGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbk1hdHJpeC52aXNpYmxlQ29sdW1ucykpO1xuICAgICAgICBjb25zdCBjb21wb3NpdGVCcmljazogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soLi4uY2VsbHMpO1xuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUJyaWNrLCBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUJyaWNrKSwgdGhpcy5jb250cm9sbGVyKV07XG4gICAgfVxufVxuXG5TZXJpYWxpemVyLnJlbW92ZVByb3BlcnR5KCdtYXRyaXgnLCAncmVuZGVyQXMnKTtcblNlcmlhbGl6ZXIuYWRkUHJvcGVydHkoJ21hdHJpeCcsIHtcbiAgICBuYW1lOiAncmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAnbGlzdCddXG59KTtcbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ21hdHJpeCcsIEZsYXRNYXRyaXgpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X21hdHJpeC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgU2VyaWFsaXplciB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBGbGF0TWF0cml4TXVsdGlwbGUgfSBmcm9tICcuL2ZsYXRfbWF0cml4bXVsdGlwbGUnO1xuXG5leHBvcnQgY2xhc3MgRmxhdE1hdHJpeER5bmFtaWMgZXh0ZW5kcyBGbGF0TWF0cml4TXVsdGlwbGUge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlciwgZmFsc2UpO1xuICAgIH1cbn1cblxuU2VyaWFsaXplci5yZW1vdmVQcm9wZXJ0eSgnbWF0cml4ZHluYW1pYycsICdyZW5kZXJBcycpO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eSgnbWF0cml4ZHluYW1pYycsIHtcbiAgICBuYW1lOiAncmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAnbGlzdCddXG59KTtcbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ21hdHJpeGR5bmFtaWMnLCBGbGF0TWF0cml4RHluYW1pYyk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4ZHluYW1pYy50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbCwgTXVsdGlwbGVUZXh0SXRlbU1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiwgSUZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgRmxhdFRleHRib3ggfSBmcm9tICcuL2ZsYXRfdGV4dGJveCc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0TXVsdGlwbGVUZXh0IGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJPV1NfR0FQX1NDQUxFOiBudW1iZXIgPSAwLjE5NTtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRWaXNpYmxlUm93cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb24uZ2V0Um93cygpLmZpbHRlcihyb3cgPT4gcm93LmlzVmlzaWJsZSk7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0SXRlbShwb2ludDogSVBvaW50LCByb3dfaW5kZXg6IG51bWJlciwgY29sX2luZGV4OiBudW1iZXIsXG4gICAgICAgIGl0ZW06IE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbFdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb2xXaWR0aCAqIFN1cnZleUhlbHBlci5NVUxUSVBMRVRFWFRfVEVYVF9QRVJTO1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuXG4gICAgICAgICAgICBjcmVhdGVCb2xkVGV4dEZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgaXRlbS5sb2NUaXRsZSkpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuXG4gICAgICAgIGNvbnN0IGZsYXRNdWx0aXBsZVRleHRJdGVtUXVlc3Rpb246IElGbGF0UXVlc3Rpb24gPSBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZShcbiAgICAgICAgICAgIHRoaXMuc3VydmV5LCBpdGVtLmVkaXRvciwgdGhpcy5jb250cm9sbGVyLCAndGV4dCcpO1xuICAgICAgICBjb25zdCBpdGVtUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmllbGRSZWN0KHtcbiAgICAgICAgICAgIHhMZWZ0OiBwb2ludC54TGVmdCArIGNvbFdpZHRoICogU3VydmV5SGVscGVyLk1VTFRJUExFVEVYVF9URVhUX1BFUlMsIHlUb3A6IHBvaW50LnlUb3AgfSxcbiAgICAgICAgdGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayguLi5hd2FpdCAoPEZsYXRUZXh0Ym94PmZsYXRNdWx0aXBsZVRleHRJdGVtUXVlc3Rpb24pLmdlbmVyYXRlRmxhdHNDb250ZW50KGl0ZW1Qb2ludCkpO1xuXG4gICAgICAgIHJldHVybiBjb21wb3NpdGVGbGF0O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3Qgcm93c0ZsYXRzOiBDb21wb3NpdGVCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3Qgcm93cyA9IHRoaXMuZ2V0VmlzaWJsZVJvd3MoKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKG5ldyBDb21wb3NpdGVCcmljaygpKTtcbiAgICAgICAgICAgIGxldCB5Qm90OiBudW1iZXIgPSBjdXJyUG9pbnQueVRvcDtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHJvd3NbaV0uY2VsbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2V0Q29sdW1uTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24uY29sQ291bnQsIGopO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LCBpLCBqLCByb3dzW2ldLmNlbGxzW2pdLml0ZW0pO1xuICAgICAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICAgICAgICAgIHlCb3QgPSBNYXRoLm1heCh5Qm90LCBpdGVtRmxhdC55Qm90KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSB5Qm90O1xuICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoY3VyclBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0TXVsdGlwbGVUZXh0LlJPV1NfR0FQX1NDQUxFO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzRmxhdHM7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdtdWx0aXBsZXRleHQnLCBGbGF0TXVsdGlwbGVUZXh0KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tdWx0aXBsZXRleHQudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFN1cnZleSB9IGZyb20gJy4vZmxhdF9zdXJ2ZXknO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0UGFuZWxEeW5hbWljIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWw7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBHQVBfQkVUV0VFTl9QQU5FTFM6IG51bWJlciA9IDAuNzU7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGZvciAoY29uc3QgcGFuZWwgb2YgdGhpcy5xdWVzdGlvbi5wYW5lbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhbmVsRmxhdHM6IElQZGZCcmlja1tdID0gYXdhaXQgRmxhdFN1cnZleS5nZW5lcmF0ZUZsYXRzUGFuZWwoXG4gICAgICAgICAgICAgICAgdGhpcy5zdXJ2ZXksIHRoaXMuY29udHJvbGxlciwgcGFuZWwsIGN1cnJQb2ludCk7XG4gICAgICAgICAgICBpZiAocGFuZWxGbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLnBhbmVsRmxhdHMpLnlCb3Q7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0UGFuZWxEeW5hbWljLkdBUF9CRVRXRUVOX1BBTkVMUztcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKC4uLnBhbmVsRmxhdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ3BhbmVsZHluYW1pYycsIEZsYXRQYW5lbER5bmFtaWMpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3BhbmVsZHluYW1pYy50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBRdWVzdGlvblJhbmtpbmdNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBSYW5raW5nSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfcmFua2luZ2l0ZW0nO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBDb2xvcmVkQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb2xvcmVkYnJpY2snO1xuXG5leHBvcnQgY2xhc3MgRmxhdFJhbmtpbmcgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25SYW5raW5nTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25SYW5raW5nTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRDb21wb3NpdGUocG9pbnQ6IElQb2ludCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyLCB1bnJhbmtlZEl0ZW06IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICBjb25zdCBpdGVtU2NhbGVkUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoU3VydmV5SGVscGVyLnNjYWxlUmVjdChcbiAgICAgICAgICAgIGl0ZW1SZWN0LCBTdXJ2ZXlIZWxwZXIuU0VMRUNUX0lURU1fRkxBVF9TQ0FMRSksIHBvaW50LnhMZWZ0KTtcbiAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IG5ldyBSYW5raW5nSXRlbUJyaWNrKHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgIGl0ZW1TY2FsZWRSZWN0LCB1bnJhbmtlZEl0ZW0gPyAnLScgOiB0aGlzLnF1ZXN0aW9uLmdldE51bWJlckJ5SW5kZXgoaW5kZXgpKTtcbiAgICAgICAgY29uc3QgdGV4dFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICB0ZXh0UG9pbnQueExlZnQgPSBpdGVtRmxhdC54UmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgY29uc3QgdGV4dEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIHRleHRQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLmxvY1RleHQsIFRleHRCcmljayk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9zaXRlQnJpY2soaXRlbUZsYXQsIHRleHRGbGF0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlQ2hvaWNlc0NvbHVtbihwb2ludDogSVBvaW50LCBjaG9pY2VzOiBJdGVtVmFsdWVbXSwgdW5yYW5rZWRDaG9pY2VzOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRDb21wb3NpdGUoY3VyclBvaW50LCBjaG9pY2VzW2ldLCBpLCB1bnJhbmtlZENob2ljZXMpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBpdGVtRmxhdC55Qm90ICsgU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgIGZsYXRzLnB1c2goaXRlbUZsYXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlU2VsZWN0VG9SYW5rSXRlbXNWZXJ0aWNhbGx5KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBpZih0aGlzLnF1ZXN0aW9uLnJhbmtpbmdDaG9pY2VzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgZmxhdHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlQ2hvaWNlc0NvbHVtbihjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb24ucmFua2luZ0Nob2ljZXMpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gZmxhdHNbZmxhdHMubGVuZ3RoIC0gMV0ueUJvdCArIDIgKiAoU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHtcbiAgICAgICAgICAgIHhMZWZ0OiBjdXJyUG9pbnQueExlZnQsXG4gICAgICAgICAgICB5VG9wOiBjdXJyUG9pbnQueVRvcCAtIChTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0KSAtIDAuNSxcbiAgICAgICAgfSwgdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCAtIGN1cnJQb2ludC54TGVmdCwgMSk7XG4gICAgICAgIGZsYXRzLnB1c2gobmV3IENvbG9yZWRCcmljayh0aGlzLmNvbnRyb2xsZXIsIHNlcGFyYXRvclJlY3QsIFN1cnZleUhlbHBlci5GT1JNX0JPUkRFUl9DT0xPUikpO1xuXG4gICAgICAgIGZsYXRzLnB1c2goLi4uYXdhaXQgdGhpcy5nZW5lcmF0ZUNob2ljZXNDb2x1bW4oY3VyclBvaW50LCB0aGlzLnF1ZXN0aW9uLnVuUmFua2luZ0Nob2ljZXMsIHRydWUpKTtcbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVTZWxlY3RUb1JhbmtJdGVtc0hvcml6b250YWxseShwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjb2xDb3VudCA9IDI7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IHJvd3NDb3VudCA9IE1hdGgubWF4KHRoaXMucXVlc3Rpb24udW5SYW5raW5nQ2hvaWNlcy5sZW5ndGgsIHRoaXMucXVlc3Rpb24ucmFua2luZ0Nob2ljZXMubGVuZ3RoKTtcbiAgICAgICAgbGV0IHJvdzogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvd3NDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY29sSW5kZXggPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiBbdGhpcy5xdWVzdGlvbi51blJhbmtpbmdDaG9pY2VzW2ldLCB0aGlzLnF1ZXN0aW9uLnJhbmtpbmdDaG9pY2VzW2ldXSkge1xuICAgICAgICAgICAgICAgIGlmKCEhaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnModGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCwgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2V0Q29sdW1uTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIsIGNvbENvdW50LCBjb2xJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdENvbXBvc2l0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludCwgaXRlbSwgaSwgY29sSW5kZXggPT0gMCk7XG4gICAgICAgICAgICAgICAgICAgIHJvdy5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbEluZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByb3dMaW5lRmxhdDogSVBkZkJyaWNrID0gU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChyb3cpLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgZmxhdHMucHVzaChyb3csIHJvd0xpbmVGbGF0KTtcbiAgICAgICAgICAgIGNvbnN0IHNlcGFyYXRvclJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdCh7XG4gICAgICAgICAgICAgICAgeExlZnQ6IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKyBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikgLyAyIC0gMC41LFxuICAgICAgICAgICAgICAgIHlUb3A6IGN1cnJQb2ludC55VG9wLFxuICAgICAgICAgICAgfSwgMCwgMCk7XG4gICAgICAgICAgICByb3cuYWRkQnJpY2sobmV3IENvbG9yZWRCcmljayh0aGlzLmNvbnRyb2xsZXIsIHNlcGFyYXRvclJlY3QsIFN1cnZleUhlbHBlci5GT1JNX0JPUkRFUl9DT0xPUiwgMSwgcm93TGluZUZsYXQueUJvdCAtIGN1cnJQb2ludC55VG9wICsgKGkgIT09IHJvd3NDb3VudCAtIDEgP1xuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgOiAwKSkpO1xuXG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHJvd0xpbmVGbGF0LnlCb3QgK1xuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICByb3cgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmxhdHM7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBpZighdGhpcy5xdWVzdGlvbi5zZWxlY3RUb1JhbmtFbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUNob2ljZXNDb2x1bW4ocG9pbnQsIHRoaXMucXVlc3Rpb24ucmFua2luZ0Nob2ljZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYodGhpcy5xdWVzdGlvbi5zZWxlY3RUb1JhbmtBcmVhc0xheW91dCA9PSAndmVydGljYWwnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVNlbGVjdFRvUmFua0l0ZW1zVmVydGljYWxseShwb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVNlbGVjdFRvUmFua0l0ZW1zSG9yaXpvbnRhbGx5KHBvaW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigncmFua2luZycsIEZsYXRSYW5raW5nKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYW5raW5nLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uUmF0aW5nTW9kZWwsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UmFkaW9ncm91cCB9IGZyb20gJy4vZmxhdF9yYWRpb2dyb3VwJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRSYXRpbmcgZXh0ZW5kcyBGbGF0UmFkaW9ncm91cCB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uUmF0aW5nOiBRdWVzdGlvblJhdGluZ01vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uUmF0aW5nID0gPFF1ZXN0aW9uUmF0aW5nTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRIb3Jpc29udGFsQ29tcG9zaXRlKHBvaW50OiBJUG9pbnQsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGl0ZW1UZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IFN1cnZleUhlbHBlci5nZXRSYXRpbmdJdGVtVGV4dChcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25SYXRpbmcsIGluZGV4LCBpdGVtLmxvY1RleHQpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgY29uc3QgaGFsZldpZHRoOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoIC8gMi4wO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IGhhbGZXaWR0aDtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKz0gaGFsZldpZHRoO1xuICAgICAgICBjb25zdCB0ZXh0UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIHRleHRQb2ludC54TGVmdCArPSBoYWxmV2lkdGg7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5cbiAgICAgICAgICAgIGNyZWF0ZUJvbGRUZXh0RmxhdCh0ZXh0UG9pbnQsIHRoaXMucXVlc3Rpb25SYXRpbmcsIHRoaXMuY29udHJvbGxlciwgaXRlbVRleHQpKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgbGV0IHRleHRXaWR0aDogbnVtYmVyID0gY29tcG9zaXRlRmxhdC53aWR0aDtcbiAgICAgICAgaWYgKHRleHRXaWR0aCA8IFN1cnZleUhlbHBlci5nZXRSYXRpbmdNaW5XaWR0aCh0aGlzLmNvbnRyb2xsZXIpKSB7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LnhMZWZ0ICs9IChTdXJ2ZXlIZWxwZXIuZ2V0UmF0aW5nTWluV2lkdGgoXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyKSAtIHRleHRXaWR0aCkgLyAyLjAgLSBoYWxmV2lkdGg7XG4gICAgICAgICAgICB0ZXh0V2lkdGggPSBTdXJ2ZXlIZWxwZXIuZ2V0UmF0aW5nTWluV2lkdGgodGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRleHRXaWR0aCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJhZGlvUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgcmFkaW9Qb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChcbiAgICAgICAgICAgIHJhZGlvUG9pbnQsIHRleHRXaWR0aCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpLCBpdGVtLCBpbmRleCwgdW5kZWZpbmVkLCB0aGlzLnF1ZXN0aW9uLnZhbHVlID09IGl0ZW0udmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRDb21wb3NpdGUocG9pbnQ6IElQb2ludCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29uc3QgaXRlbVJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFN1cnZleUhlbHBlci5tb3ZlUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QoaXRlbVJlY3QsIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSxcbiAgICAgICAgICAgIHBvaW50LnhMZWZ0KSwgaXRlbSwgaW5kZXgsIHVuZGVmaW5lZCwgdGhpcy5xdWVzdGlvbi52YWx1ZSA9PSBpdGVtLnZhbHVlKTtcbiAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgIGNvbnN0IHRleHRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgdGV4dFBvaW50LnhMZWZ0ID0gaXRlbUZsYXQueFJpZ2h0ICsgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9JVEVNX1RFWFQ7XG4gICAgICAgIGNvbnN0IGl0ZW1UZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IFN1cnZleUhlbHBlci5nZXRSYXRpbmdJdGVtVGV4dCh0aGlzLnF1ZXN0aW9uUmF0aW5nLCBpbmRleCwgaXRlbS5sb2NUZXh0KTtcbiAgICAgICAgaXRlbVRleHQgPT0gbnVsbCB8fCBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIHRleHRQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtVGV4dCwgVGV4dEJyaWNrKSk7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGVGbGF0O1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVIb3Jpc29udGFsbHlJdGVtcyhwb2ludDogSVBvaW50KSB7XG4gICAgICAgIGNvbnN0IHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSA9IFtuZXcgQ29tcG9zaXRlQnJpY2soKV07XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb25SYXRpbmcudmlzaWJsZVJhdGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEhvcmlzb250YWxDb21wb3NpdGUoY3VyclBvaW50LFxuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb25SYXRpbmcudmlzaWJsZVJhdGVWYWx1ZXNbaV0sIGkpO1xuICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICBjb25zdCBsZWZ0V2lkdGg6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCAtIGl0ZW1GbGF0LnhSaWdodDtcbiAgICAgICAgICAgIGlmIChTdXJ2ZXlIZWxwZXIuZ2V0UmF0aW5nTWluV2lkdGgodGhpcy5jb250cm9sbGVyKSA8PSBsZWZ0V2lkdGggKyBTdXJ2ZXlIZWxwZXIuRVBTSUxPTikge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IGl0ZW1GbGF0LnhSaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gaXRlbUZsYXQueUJvdDtcbiAgICAgICAgICAgICAgICBpZiAoaSAhPT0gdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soXG4gICAgICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoY3VyclBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKG5ldyBDb21wb3NpdGVCcmljaygpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3NGbGF0cztcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGxldCBpc1ZlcnRpY2FsOiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uUmF0aW5nLnZpc2libGVSYXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtVGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSBTdXJ2ZXlIZWxwZXIuZ2V0UmF0aW5nSXRlbVRleHQoXG4gICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvblJhdGluZywgaSwgdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlc1tpXS5sb2NUZXh0KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoaXRlbVRleHQpLndpZHRoID4gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFN1cnZleUhlbHBlci5SQVRJTkdfQ09MVU1OX1dJRFRIKS53aWR0aCkge1xuICAgICAgICAgICAgICAgIGlzVmVydGljYWwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1ZlcnRpY2FsID8gdGhpcy5nZW5lcmF0ZVZlcnRpY2FsbHlJdGVtcyhwb2ludCwgdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlcykgOiB0aGlzLmdlbmVyYXRlSG9yaXNvbnRhbGx5SXRlbXMocG9pbnQpO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigncmF0aW5nJywgRmxhdFJhdGluZyk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcmF0aW5nLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvblNpZ25hdHVyZVBhZE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciwgSVJlY3QsIElTaXplIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IElCb3JkZXJEZXNjcmlwdGlvbiwgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBFbXB0eUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfZW1wdHknO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuXG5leHBvcnQgY2xhc3MgRmxhdFNpZ25hdHVyZVBhZCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblNpZ25hdHVyZVBhZE1vZGVsO1xuICAgIHB1YmxpYyBzdGF0aWMgQk9SREVSX1NUWUxFOiAnZGFzaGVkJyB8ICdzb2xpZCcgfCAnbm9uZScgPSAnZGFzaGVkJztcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uU2lnbmF0dXJlUGFkTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlQmFja2dyb3VuZEltYWdlKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB7IGxpbms6IHRoaXMucXVlc3Rpb24uYmFja2dyb3VuZEltYWdlLCB3aWR0aDogU3VydmV5SGVscGVyLnB4VG9QdCg8YW55PnRoaXMucXVlc3Rpb24uc2lnbmF0dXJlV2lkdGgpLCBoZWlnaHQ6IFN1cnZleUhlbHBlci5weFRvUHQoPGFueT50aGlzLnF1ZXN0aW9uLnNpZ25hdHVyZUhlaWdodCksIG9iamVjdEZpdDogJ2NvdmVyJyB9LCB0cnVlKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBnZXRTaWduSW1hZ2VVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLnN0b3JlRGF0YUFzVGV4dCB8fCAhdGhpcy5xdWVzdGlvbi5sb2FkZWREYXRhID8gdGhpcy5xdWVzdGlvbi52YWx1ZSA6IHRoaXMucXVlc3Rpb24ubG9hZGVkRGF0YTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlU2lnbihwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBTdXJ2ZXlIZWxwZXIucHhUb1B0KDxhbnk+dGhpcy5xdWVzdGlvbi5zaWduYXR1cmVXaWR0aCk7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IFN1cnZleUhlbHBlci5weFRvUHQoPGFueT50aGlzLnF1ZXN0aW9uLnNpZ25hdHVyZUhlaWdodCk7XG4gICAgICAgIGxldCBicmljazogUGRmQnJpY2s7XG4gICAgICAgIGlmKHRoaXMucXVlc3Rpb24udmFsdWUpIHtcbiAgICAgICAgICAgIGJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChwb2ludCxcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHsgbGluazogdGhpcy5nZXRTaWduSW1hZ2VVcmwoKSxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCB9LCBmYWxzZVxuICAgICAgICAgICAgKSBhcyBQZGZCcmljaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyaWNrID0gbmV3IEVtcHR5QnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsIHdpZHRoLCBoZWlnaHQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZihGbGF0U2lnbmF0dXJlUGFkLkJPUkRFUl9TVFlMRSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICBicmljay5hZnRlclJlbmRlckNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvcmRlck9wdGlvbnM6IElCb3JkZXJEZXNjcmlwdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBicmljay53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGJyaWNrLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICB5VG9wOiBicmljay55VG9wLFxuICAgICAgICAgICAgICAgICAgICB5Qm90OiBicmljay55Qm90LFxuICAgICAgICAgICAgICAgICAgICB4TGVmdDogYnJpY2sueExlZnQsXG4gICAgICAgICAgICAgICAgICAgIHhSaWdodDogYnJpY2sueFJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBmb3JtQm9yZGVyQ29sb3I6IGJyaWNrLmZvcm1Cb3JkZXJDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgcm91bmRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG91dHNpZGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGRhc2hTdHlsZTogRmxhdFNpZ25hdHVyZVBhZC5CT1JERVJfU1RZTEUgPT0gJ2Rhc2hlZCcgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXNoQXJyYXk6IFs1XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhc2hQaGFzZTogMFxuICAgICAgICAgICAgICAgICAgICB9IDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCBib3JkZXJPcHRpb25zKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYnJpY2s7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGlmKHRoaXMucXVlc3Rpb24uYmFja2dyb3VuZEltYWdlKSB7XG4gICAgICAgICAgICBjb21wb3NpdGVCcmljay5hZGRCcmljayhhd2FpdCB0aGlzLmdlbmVyYXRlQmFja2dyb3VuZEltYWdlKHBvaW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9zaXRlQnJpY2suYWRkQnJpY2soYXdhaXQgdGhpcy5nZW5lcmF0ZVNpZ24ocG9pbnQpKTtcbiAgICAgICAgcmV0dXJuIFtjb21wb3NpdGVCcmlja107XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdzaWduYXR1cmVwYWQnLCBGbGF0U2lnbmF0dXJlUGFkKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9zaWduYXR1cmVwYWQudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uVGV4dE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0Qm94QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0Ym94JztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdFRleHRib3ggZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTVVMVElMSU5FX1RFWFRfUk9XU19DT1VOVDogbnVtYmVyID0gMTtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uVGV4dE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25UZXh0TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBpZiAoIXRoaXMuc2hvdWxkUmVuZGVyQXNDb21tZW50KSB7XG4gICAgICAgICAgICBjb25zdCByZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmllbGRSZWN0KHBvaW50LCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVGV4dEJveEJyaWNrKHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgcmVjdCldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUNvbW1lbnRGbGF0KHBvaW50LCB0aGlzLnF1ZXN0aW9uLFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCB0cnVlLCB7IHJvd3M6IEZsYXRUZXh0Ym94Lk1VTFRJTElORV9URVhUX1JPV1NfQ09VTlQgfSldO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigndGV4dCcsIEZsYXRUZXh0Ym94KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF90ZXh0Ym94LnRzIiwiaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyLCBJUmVjdCB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcblxuZXhwb3J0IGNsYXNzIEN1c3RvbUJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuXG4gICAgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcHJpdmF0ZSByZW5kZXJGdW5jOiAoZG9jOiBhbnksIHF1ZXN0aW9uOiBhbnksIHhMZWZ0OiBudW1iZXIsIHlUb3A6IG51bWJlcikgPT4gSVJlY3QpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlbmRlckZ1bmMoY29udHJvbGxlci5oZWxwZXJEb2MsIHF1ZXN0aW9uLCAwLCAwKSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyRnVuYyh0aGlzLmNvbnRyb2xsZXIuZG9jLCB0aGlzLnF1ZXN0aW9uLCB0aGlzLnhMZWZ0LCB0aGlzLnlUb3ApO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2N1c3RvbS50cyIsImltcG9ydCB7IFN1cnZleU1vZGVsLCBRdWVzdGlvbiwgRXZlbnRCYXNlIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0ICogYXMgU3VydmV5Q29yZSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJRG9jT3B0aW9ucywgRG9jQ29udHJvbGxlciB9IGZyb20gJy4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFN1cnZleSB9IGZyb20gJy4vZmxhdF9sYXlvdXQvZmxhdF9zdXJ2ZXknO1xuaW1wb3J0IHsgUGFnZVBhY2tlciB9IGZyb20gJy4vcGFnZV9sYXlvdXQvcGFnZV9wYWNrZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBFdmVudEFzeW5jLCBFdmVudEhhbmRsZXIgfSBmcm9tICcuL2V2ZW50X2hhbmRsZXIvZXZlbnRfaGFuZGxlcic7XG5pbXBvcnQgeyBEcmF3Q2FudmFzIH0gZnJvbSAnLi9ldmVudF9oYW5kbGVyL2RyYXdfY2FudmFzJztcbmltcG9ydCB7IEFkb3JuZXJzT3B0aW9ucywgQWRvcm5lcnNQYW5lbE9wdGlvbnMsIEFkb3JuZXJzUGFnZU9wdGlvbnMgfSBmcm9tICcuL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi9oZWxwZXJfc3VydmV5JztcblxuLyoqXG4gKiBUaGUgYFN1cnZleVBERmAgb2JqZWN0IGVuYWJsZXMgeW91IHRvIGV4cG9ydCB5b3VyIHN1cnZleXMgYW5kIGZvcm1zIHRvIFBERiBkb2N1bWVudHMuXG4gKlxuICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzLyAobGlua1N0eWxlKSlcbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleVBERiBleHRlbmRzIFN1cnZleU1vZGVsIHtcbiAgICBwcml2YXRlIHN0YXRpYyBjdXJyZW50bHlTYXZpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIHN0YXRpYyBzYXZlUXVldWU6IGFueVtdID0gW107XG4gICAgcHVibGljIG9wdGlvbnM6IElEb2NPcHRpb25zO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihqc29uT2JqZWN0OiBhbnksIG9wdGlvbnM/OiBJRG9jT3B0aW9ucykge1xuICAgICAgICBzdXBlcihqc29uT2JqZWN0KTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IFN1cnZleUhlbHBlci5jbG9uZShvcHRpb25zKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBoYXZlQ29tbWVyY2lhbExpY2Vuc2UoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGYgPSBTdXJ2ZXlDb3JlLmhhc0xpY2Vuc2U7XG4gICAgICAgIHJldHVybiAhIWYgJiYgZigyKTtcbiAgICB9XG4gICAgcHVibGljIHNldCBoYXZlQ29tbWVyY2lhbExpY2Vuc2UodmFsOiBib29sZWFuKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FzIG9mIHYxLjkuMTAxLCB0aGUgaGF2ZUNvbW1lcmNpYWxMaWNlbnNlIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQuIFRvIGFjdGl2YXRlIHlvdXIgbGljZW5zZSwgdXNlIHRoZSBzZXRMaWNlbnNlS2V5KGtleSkgbWV0aG9kIGFzIHNob3duIG9uIHRoZSBmb2xsb3dpbmcgcGFnZTogaHR0cHM6Ly9zdXJ2ZXlqcy5pby9yZW1vdmUtYWxlcnQtYmFubmVyJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIGV2ZW50IHRoYXQgaXMgcmFpc2VkIHdoZW4gU3VydmV5SlMgUERGIEdlbmVyYXRvciByZW5kZXJzIGEgcGFnZSBoZWFkZXIuIEhhbmRsZSB0aGlzIGV2ZW50IHRvIGN1c3RvbWl6ZSB0aGUgaGVhZGVyLlxuICAgICAqXG4gICAgICogUGFyYW1ldGVyczpcbiAgICAgKlxuICAgICAqIC0gYHNlbmRlcmA6IGBTdXJ2ZXlQREZgXFxcbiAgICAgKiBBIFN1cnZleVBERiBpbnN0YW5jZSB0aGF0IHJhaXNlZCB0aGUgZXZlbnQuXG4gICAgICpcbiAgICAgKiAtIGBjYW52YXNgOiBbYERyYXdDYW52YXNgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2RyYXdjYW52YXMpXFxcbiAgICAgKiBBbiBvYmplY3QgdGhhdCB5b3UgY2FuIHVzZSB0byBkcmF3IHRleHQgYW5kIGltYWdlcyBpbiB0aGUgcGFnZSBoZWFkZXIuXG4gICAgICpcbiAgICAgKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZXhhbXBsZXMvY3VzdG9taXplLWhlYWRlci1hbmQtZm9vdGVyLW9mLXBkZi1mb3JtLyAobGlua1N0eWxlKSlcbiAgICAgKi9cbiAgICBwdWJsaWMgb25SZW5kZXJIZWFkZXI6IEV2ZW50QXN5bmM8U3VydmV5UERGLCBEcmF3Q2FudmFzPiA9XG4gICAgICAgIG5ldyBFdmVudEFzeW5jPFN1cnZleVBERiwgRHJhd0NhbnZhcz4oKTtcbiAgICAvKipcbiAgICAgKiBBbiBldmVudCB0aGF0IGlzIHJhaXNlZCB3aGVuIFN1cnZleUpTIFBERiBHZW5lcmF0b3IgcmVuZGVycyBhIHBhZ2UgZm9vdGVyLiBIYW5kbGUgdGhpcyBldmVudCB0byBjdXN0b21pemUgdGhlIGZvb3Rlci5cbiAgICAgKlxuICAgICAqIFBhcmFtZXRlcnM6XG4gICAgICpcbiAgICAgKiAtIGBzZW5kZXJgOiBgU3VydmV5UERGYFxcXG4gICAgICogQSBTdXJ2ZXlQREYgaW5zdGFuY2UgdGhhdCByYWlzZWQgdGhlIGV2ZW50LlxuICAgICAqXG4gICAgICogLSBgY2FudmFzYDogW2BEcmF3Q2FudmFzYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9kcmF3Y2FudmFzKVxcXG4gICAgICogQW4gb2JqZWN0IHRoYXQgeW91IGNhbiB1c2UgdG8gZHJhdyB0ZXh0IGFuZCBpbWFnZXMgaW4gdGhlIHBhZ2UgZm9vdGVyLlxuICAgICAqXG4gICAgICogW1ZpZXcgRGVtb10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2V4YW1wbGVzL2N1c3RvbWl6ZS1oZWFkZXItYW5kLWZvb3Rlci1vZi1wZGYtZm9ybS8gKGxpbmtTdHlsZSkpXG4gICAgICovXG4gICAgcHVibGljIG9uUmVuZGVyRm9vdGVyOiBFdmVudEFzeW5jPFN1cnZleVBERiwgRHJhd0NhbnZhcz4gPVxuICAgICAgICBuZXcgRXZlbnRBc3luYzxTdXJ2ZXlQREYsIERyYXdDYW52YXM+KCk7XG4gICAgLyoqXG4gICAgICogQW4gZXZlbnQgdGhhdCBpcyByYWlzZWQgd2hlbiBTdXJ2ZXlKUyBQREYgR2VuZXJhdG9yIHJlbmRlcnMgYSBzdXJ2ZXkgcXVlc3Rpb24uIEhhbmRsZSB0aGlzIGV2ZW50IHRvIGN1c3RvbWl6ZSBxdWVzdGlvbiByZW5kZXJpbmcuXG4gICAgICpcbiAgICAgKiBQYXJhbWV0ZXJzOlxuICAgICAqXG4gICAgICogLSBgc2VuZGVyYDogYFN1cnZleVBERmBcXFxuICAgICAqIEEgU3VydmV5UERGIGluc3RhbmNlIHRoYXQgcmFpc2VkIHRoZSBldmVudC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMucXVlc3Rpb25gOiBbYFF1ZXN0aW9uYF0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9mb3JtLWxpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3F1ZXN0aW9uKVxcXG4gICAgICogQSBzdXJ2ZXkgcXVlc3Rpb24gdGhhdCBpcyBiZWluZyByZW5kZXJlZC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMucG9pbnRgOiBgSVBvaW50YFxcXG4gICAgICogQW4gb2JqZWN0IHdpdGggY29vcmRpbmF0ZXMgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZWxlbWVudCBiZWluZyByZW5kZXJlZC4gVGhpcyBvYmplY3QgY29udGFpbnMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOiBgeyB4TGVmdDogbnVtYmVyLCB5VG9wOiBudW1iZXIgfWAuXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLmJyaWNrc2A6IFtgUGRmQnJpY2tbXWBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcGRmYnJpY2spXFxcbiAgICAgKiBBbiBhcnJheSBvZiBbYnJpY2tzXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9jdXN0b21pemUtc3VydmV5LXF1ZXN0aW9uLXJlbmRlcmluZy1pbi1wZGYtZm9ybSNjdXN0b20tcmVuZGVyaW5nKSB1c2VkIHRvIHJlbmRlciB0aGUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMuY29udHJvbGxlcmA6IFtgRG9jQ29udHJvbGxlcmBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvZG9jY29udHJvbGxlcilcXFxuICAgICAqIEFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBtYWluIFBERiBkb2N1bWVudCBwcm9wZXJ0aWVzIChmb250LCBtYXJnaW5zLCBwYWdlIHdpZHRoIGFuZCBoZWlnaHQpIGFuZCBhbGxvd3MgeW91IHRvIG1vZGlmeSB0aGVtLlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5yZXBvc2l0b3J5YDogYEZsYXRSZXBvc2l0b3J5YFxcXG4gICAgICogQSByZXBvc2l0b3J5IHdpdGggY2xhc3NlcyB0aGF0IHJlbmRlciBlbGVtZW50cyB0byBQREYuIFVzZSBpdHMgYGNyZWF0ZWAgbWV0aG9kIGlmIHlvdSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIHJlbmRlcmluZyBjbGFzcy5cbiAgICAgKlxuICAgICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9ob3ctdG8tdXNlLWFkb3JuZXJzLWluLXBkZi1mb3Jtcy8gKGxpbmtTdHlsZSkpXG4gICAgICovXG4gICAgcHVibGljIG9uUmVuZGVyUXVlc3Rpb246IEV2ZW50QXN5bmM8U3VydmV5UERGLCBBZG9ybmVyc09wdGlvbnM+ID1cbiAgICAgICAgbmV3IEV2ZW50QXN5bmM8U3VydmV5UERGLCBBZG9ybmVyc09wdGlvbnM+KCk7XG4gICAgLyoqXG4gICAgICogQW4gZXZlbnQgdGhhdCBpcyByYWlzZWQgd2hlbiBTdXJ2ZXlKUyBQREYgR2VuZXJhdG9yIHJlbmRlcnMgYSBwYW5lbC4gSGFuZGxlIHRoaXMgZXZlbnQgdG8gY3VzdG9taXplIHBhbmVsIHJlbmRlcmluZy5cbiAgICAgKlxuICAgICAqIFBhcmFtZXRlcnM6XG4gICAgICpcbiAgICAgKiAtIGBzZW5kZXJgOiBgU3VydmV5UERGYFxcXG4gICAgICogQSBTdXJ2ZXlQREYgaW5zdGFuY2UgdGhhdCByYWlzZWQgdGhlIGV2ZW50LlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5wYW5lbGA6IFtgUGFuZWxNb2RlbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9wYW5lbC1tb2RlbClcXFxuICAgICAqIEEgcGFuZWwgdGhhdCBpcyBiZWluZyByZW5kZXJlZC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMucG9pbnRgOiBgSVBvaW50YFxcXG4gICAgICogQW4gb2JqZWN0IHdpdGggY29vcmRpbmF0ZXMgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZWxlbWVudCBiZWluZyByZW5kZXJlZC4gVGhpcyBvYmplY3QgY29udGFpbnMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOiBgeyB4TGVmdDogbnVtYmVyLCB5VG9wOiBudW1iZXIgfWAuXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLmJyaWNrc2A6IFtgUGRmQnJpY2tbXWBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvcGRmYnJpY2spXFxcbiAgICAgKiBBbiBhcnJheSBvZiBbYnJpY2tzXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9jdXN0b21pemUtc3VydmV5LXF1ZXN0aW9uLXJlbmRlcmluZy1pbi1wZGYtZm9ybSNjdXN0b20tcmVuZGVyaW5nKSB1c2VkIHRvIHJlbmRlciB0aGUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMuY29udHJvbGxlcmA6IFtgRG9jQ29udHJvbGxlcmBdKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9kb2N1bWVudGF0aW9uL2FwaS1yZWZlcmVuY2UvZG9jY29udHJvbGxlcilcXFxuICAgICAqIEFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBtYWluIFBERiBkb2N1bWVudCBwcm9wZXJ0aWVzIChmb250LCBtYXJnaW5zLCBwYWdlIHdpZHRoIGFuZCBoZWlnaHQpIGFuZCBhbGxvd3MgeW91IHRvIG1vZGlmeSB0aGVtLlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5yZXBvc2l0b3J5YDogYEZsYXRSZXBvc2l0b3J5YFxcXG4gICAgICogQSByZXBvc2l0b3J5IHdpdGggY2xhc3NlcyB0aGF0IHJlbmRlciBlbGVtZW50cyB0byBQREYuIFVzZSBpdHMgYGNyZWF0ZWAgbWV0aG9kIGlmIHlvdSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIHJlbmRlcmluZyBjbGFzcy5cbiAgICAgKlxuICAgICAqIFtWaWV3IERlbW9dKGh0dHBzOi8vc3VydmV5anMuaW8vcGRmLWdlbmVyYXRvci9leGFtcGxlcy9ob3ctdG8tdXNlLWFkb3JuZXJzLWluLXBkZi1mb3Jtcy8gKGxpbmtTdHlsZSkpXG4gICAgICovXG4gICAgcHVibGljIG9uUmVuZGVyUGFuZWw6IEV2ZW50QXN5bmM8U3VydmV5UERGLCBBZG9ybmVyc1BhbmVsT3B0aW9ucz4gPVxuICAgICAgICBuZXcgRXZlbnRBc3luYzxTdXJ2ZXlQREYsIEFkb3JuZXJzUGFuZWxPcHRpb25zPigpO1xuICAgIC8qKlxuICAgICAqIEFuIGV2ZW50IHRoYXQgaXMgcmFpc2VkIHdoZW4gU3VydmV5SlMgUERGIEdlbmVyYXRvciByZW5kZXJzIGEgcGFnZS4gSGFuZGxlIHRoaXMgZXZlbnQgdG8gY3VzdG9taXplIHBhZ2UgcmVuZGVyaW5nLlxuICAgICAqXG4gICAgICogUGFyYW1ldGVyczpcbiAgICAgKlxuICAgICAqIC0gYHNlbmRlcmA6IGBTdXJ2ZXlQREZgXFxcbiAgICAgKiBBIFN1cnZleVBERiBpbnN0YW5jZSB0aGF0IHJhaXNlZCB0aGUgZXZlbnQuXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLnBhZ2VgOiBbYFBhZ2VNb2RlbGBdKGh0dHBzOi8vc3VydmV5anMuaW8vZm9ybS1saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBpLXJlZmVyZW5jZS9wYWdlLW1vZGVsKVxcXG4gICAgICogQSBwYWdlIHRoYXQgaXMgYmVpbmcgcmVuZGVyZWQuXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLnBvaW50YDogYElQb2ludGBcXFxuICAgICAqIEFuIG9iamVjdCB3aXRoIGNvb3JkaW5hdGVzIG9mIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGVsZW1lbnQgYmVpbmcgcmVuZGVyZWQuIFRoaXMgb2JqZWN0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczogYHsgeExlZnQ6IG51bWJlciwgeVRvcDogbnVtYmVyIH1gLlxuICAgICAqXG4gICAgICogLSBgb3B0aW9ucy5icmlja3NgOiBbYFBkZkJyaWNrW11gXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL3BkZmJyaWNrKVxcXG4gICAgICogQW4gYXJyYXkgb2YgW2JyaWNrc10oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9wZGYtZ2VuZXJhdG9yL2RvY3VtZW50YXRpb24vY3VzdG9taXplLXN1cnZleS1xdWVzdGlvbi1yZW5kZXJpbmctaW4tcGRmLWZvcm0jY3VzdG9tLXJlbmRlcmluZykgdXNlZCB0byByZW5kZXIgdGhlIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiAtIGBvcHRpb25zLmNvbnRyb2xsZXJgOiBbYERvY0NvbnRyb2xsZXJgXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZG9jdW1lbnRhdGlvbi9hcGktcmVmZXJlbmNlL2RvY2NvbnRyb2xsZXIpXFxcbiAgICAgKiBBbiBvYmplY3QgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gbWFpbiBQREYgZG9jdW1lbnQgcHJvcGVydGllcyAoZm9udCwgbWFyZ2lucywgcGFnZSB3aWR0aCBhbmQgaGVpZ2h0KSBhbmQgYWxsb3dzIHlvdSB0byBtb2RpZnkgdGhlbS5cbiAgICAgKlxuICAgICAqIC0gYG9wdGlvbnMucmVwb3NpdG9yeWA6IGBGbGF0UmVwb3NpdG9yeWBcXFxuICAgICAqIEEgcmVwb3NpdG9yeSB3aXRoIGNsYXNzZXMgdGhhdCByZW5kZXIgZWxlbWVudHMgdG8gUERGLiBVc2UgaXRzIGBjcmVhdGVgIG1ldGhvZCBpZiB5b3UgbmVlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSByZW5kZXJpbmcgY2xhc3MuXG4gICAgICpcbiAgICAgKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZXhhbXBsZXMvaG93LXRvLXVzZS1hZG9ybmVycy1pbi1wZGYtZm9ybXMvIChsaW5rU3R5bGUpKVxuICAgICAqL1xuICAgIHB1YmxpYyBvblJlbmRlclBhZ2U6IEV2ZW50QXN5bmM8U3VydmV5UERGLCBBZG9ybmVyc1BhZ2VPcHRpb25zPiA9XG4gICAgICAgIG5ldyBFdmVudEFzeW5jPFN1cnZleVBERiwgQWRvcm5lcnNQYWdlT3B0aW9ucz4oKTtcblxuICAgIHB1YmxpYyBvbkRvY0NvbnRyb2xsZXJDcmVhdGVkOiBFdmVudEJhc2U8U3VydmV5UERGLCB7IGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIgfT4gPSBuZXcgRXZlbnRCYXNlPFN1cnZleVBERiwge2NvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXJ9PigpO1xuXG4gICAgcHVibGljIG9uUmVuZGVyQ2hlY2tJdGVtQWNyb2Zvcm06IEV2ZW50QXN5bmM8U3VydmV5UERGLCBhbnk+ID1cbiAgICAgICAgbmV3IEV2ZW50QXN5bmM8U3VydmV5UERGLCBhbnk+KCk7XG5cbiAgICBwdWJsaWMgb25SZW5kZXJSYWRpb0dyb3VwV3JhcEFjcm9mb3JtOiBFdmVudEFzeW5jPFN1cnZleVBERiwgYW55PiA9XG4gICAgbmV3IEV2ZW50QXN5bmM8U3VydmV5UERGLCBhbnk+KCk7XG5cbiAgICBwdWJsaWMgb25SZW5kZXJSYWRpb0l0ZW1BY3JvZm9ybTogRXZlbnRBc3luYzxTdXJ2ZXlQREYsIGFueT4gPVxuICAgIG5ldyBFdmVudEFzeW5jPFN1cnZleVBERiwgYW55PigpO1xuXG4gICAgcHJpdmF0ZSB3YWl0Rm9yUXVlc3Rpb25Jc1JlYWR5KHF1ZXN0aW9uOiBRdWVzdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHF1ZXN0aW9uLmlzUmVhZHkpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkeUNhbGxiYWNrOiAoc2VuZGVyOiBRdWVzdGlvbiwgb3B0aW9uczogYW55KSA9PiB2b2lkID1cbiAgICAgICAgICAgICAgICAoXywgb3B0aW9uczogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmlzUmVhZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uLm9uUmVhZHlDaGFuZ2VkLnJlbW92ZShyZWFkeUNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcXVlc3Rpb24ub25SZWFkeUNoYW5nZWQuYWRkKHJlYWR5Q2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQ29yZUlzUmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAoY29uc3QgcXVlc3Rpb24gb2YgdGhpcy5nZXRBbGxRdWVzdGlvbnMoKSkge1xuICAgICAgICAgICAgaWYgKCEhKDxhbnk+cXVlc3Rpb24pLmNvbnRlbnRQYW5lbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3Q6IFF1ZXN0aW9uW10gPSBbXTtcbiAgICAgICAgICAgICAgICAoPGFueT5xdWVzdGlvbikuY29udGVudFBhbmVsLmFkZFF1ZXN0aW9uc1RvTGlzdChsaXN0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlubmVyUXVlc3Rpb24gb2YgbGlzdCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JRdWVzdGlvbklzUmVhZHkoaW5uZXJRdWVzdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBhd2FpdCB0aGlzLndhaXRGb3JRdWVzdGlvbklzUmVhZHkoXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmdldENvbnRlbnRRdWVzdGlvbig8UXVlc3Rpb24+cXVlc3Rpb24pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgZ2V0VXBkYXRlZENoZWNrSXRlbUFjcm9mb3JtT3B0aW9ucyhvcHRpb25zOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblJlbmRlckNoZWNrSXRlbUFjcm9mb3JtLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRVcGRhdGVkUmFkaW9Hcm91cFdyYXBPcHRpb25zKG9wdGlvbnM6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uUmVuZGVyUmFkaW9Hcm91cFdyYXBBY3JvZm9ybS5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0VXBkYXRlZFJhZGlvSXRlbUFjcm9mb3JtT3B0aW9ucyhvcHRpb25zOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblJlbmRlclJhZGlvSXRlbUFjcm9mb3JtLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHByaXZhdGUgY29ycmVjdEJyaWNrc1Bvc2l0aW9uKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGZsYXRzOiBJUGRmQnJpY2tbXVtdKSB7XG4gICAgICAgIGlmKGNvbnRyb2xsZXIuaXNSVEwpIHtcbiAgICAgICAgICAgIGZsYXRzLmZvckVhY2goZmxhdHNBcnIgPT4ge1xuICAgICAgICAgICAgICAgIGZsYXRzQXJyLmZvckVhY2goZmxhdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZsYXQudHJhbnNsYXRlWCgoeExlZnQ6IG51bWJlciwgeFJpZ2h0OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoaWZ0V2lkdGggPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLSB4TGVmdCAtIHhSaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHhMZWZ0OiB4TGVmdCArIHNoaWZ0V2lkdGgsIHhSaWdodDogeFJpZ2h0ICsgc2hpZnRXaWR0aCB9O1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyByZW5kZXJTdXJ2ZXkoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnZpc2libGVQYWdlcy5mb3JFYWNoKHBhZ2UgPT4gcGFnZS5vbkZpcnN0UmVuZGVyaW5nKCkpO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JDb3JlSXNSZWFkeSgpO1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW11bXSA9IGF3YWl0IEZsYXRTdXJ2ZXkuZ2VuZXJhdGVGbGF0cyh0aGlzLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5jb3JyZWN0QnJpY2tzUG9zaXRpb24oY29udHJvbGxlciwgZmxhdHMpO1xuICAgICAgICBjb25zdCBwYWNrczogSVBkZkJyaWNrW11bXSA9IFBhZ2VQYWNrZXIucGFjayhmbGF0cywgY29udHJvbGxlcik7XG4gICAgICAgIGF3YWl0IEV2ZW50SGFuZGxlci5wcm9jZXNzX2hlYWRlcl9ldmVudHModGhpcywgY29udHJvbGxlciwgcGFja3MpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcGFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCBwYWNrc1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyLmdldE51bWJlck9mUGFnZXMoKSA9PT0gaSkge1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmFkZFBhZ2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5zZXRQYWdlKGkpO1xuICAgICAgICAgICAgICAgIC8vZ2l6bW9zIGJyaWNrcyBib3JkZXJzIGZvciBkZWJ1Z1xuICAgICAgICAgICAgICAgIC8vIHBhY2tzW2ldW2pdLnVuZm9sZCgpLmZvckVhY2goKHJlY3Q6IElQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb250cm9sbGVyLmRvYy5zZXREcmF3Q29sb3IoJ2dyZWVuJyk7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnRyb2xsZXIuZG9jLnJlY3QoLi4uU3VydmV5SGVscGVyLmNyZWF0ZUFjcm9mb3JtUmVjdChyZWN0KSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnRyb2xsZXIuZG9jLnNldERyYXdDb2xvcignYmxhY2snKTtcbiAgICAgICAgICAgICAgICAvLyAgIH1cbiAgICAgICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhY2tzW2ldW2pdLnJlbmRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIGFzeW5jaHJvbm91cyBtZXRob2QgdGhhdCBzdGFydHMgZG93bmxvYWQgb2YgdGhlIGdlbmVyYXRlZCBQREYgZmlsZSBpbiB0aGUgd2ViIGJyb3dzZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmlsZU5hbWUgKihPcHRpb25hbCkqIEEgZmlsZSBuYW1lIHdpdGggdGhlIFwiLnBkZlwiIGV4dGVuc2lvbi4gRGVmYXVsdCB2YWx1ZTogYFwic3VydmV5X3Jlc3VsdC5wZGZcImAuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNhdmUoZmlsZU5hbWU6IHN0cmluZyA9ICdzdXJ2ZXlfcmVzdWx0LnBkZicpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBpZighU3VydmV5UERGLmN1cnJlbnRseVNhdmluZykge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciA9IG5ldyBEb2NDb250cm9sbGVyKHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLm9uRG9jQ29udHJvbGxlckNyZWF0ZWQuZmlyZSh0aGlzLCB7IGNvbnRyb2xsZXI6IGNvbnRyb2xsZXIgfSk7XG4gICAgICAgICAgICBTdXJ2ZXlQREYuY3VycmVudGx5U2F2aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5maXhGb250KGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJTdXJ2ZXkoY29udHJvbGxlcik7XG4gICAgICAgICAgICBjb25zdCBwcm9taXNlID0gY29udHJvbGxlci5kb2Muc2F2ZShmaWxlTmFtZSwgeyByZXR1cm5Qcm9taXNlOiB0cnVlIH0pO1xuICAgICAgICAgICAgcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBTdXJ2ZXlQREYuY3VycmVudGx5U2F2aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2F2ZUZ1bmMgPSBTdXJ2ZXlQREYuc2F2ZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgaWYoISFzYXZlRnVuYykge1xuICAgICAgICAgICAgICAgICAgICBzYXZlRnVuYygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTdXJ2ZXlQREYuc2F2ZVF1ZXVlLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZShmaWxlTmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBhc3luY2hyb25vdXMgbWV0aG9kIHRoYXQgYWxsb3dzIHlvdSB0byBnZXQgUERGIGNvbnRlbnQgaW4gZGlmZmVyZW50IGZvcm1hdHMuXG4gICAgICpcbiAgICAgKiBbVmlldyBEZW1vXShodHRwczovL3N1cnZleWpzLmlvL3BkZi1nZW5lcmF0b3IvZXhhbXBsZXMvY29udmVydC1wZGYtZm9ybS1ibG9iLWJhc2U2NC1yYXctcGRmLWphdmFzY3JpcHQvIChsaW5rU3R5bGUpKVxuICAgICAqXG4gICAgICogQHBhcmFtIHR5cGUgKihPcHRpb25hbCkqIE9uZSBvZiBgXCJibG9iXCJgLCBgXCJibG9idXJsXCJgLCBgXCJkYXRhdXJsc3RyaW5nXCJgLiBEbyBub3Qgc3BlY2lmeSB0aGlzIHBhcmFtZXRlciBpZiB5b3Ugd2FudCB0byBnZXQgcmF3IFBERiBjb250ZW50IGFzIGEgc3RyaW5nIHZhbHVlLlxuICAgICAqXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHJhdyh0eXBlPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciA9IG5ldyBEb2NDb250cm9sbGVyKHRoaXMub3B0aW9ucyk7XG4gICAgICAgIHRoaXMub25Eb2NDb250cm9sbGVyQ3JlYXRlZC5maXJlKHRoaXMsIHsgY29udHJvbGxlcjogY29udHJvbGxlciB9KTtcbiAgICAgICAgU3VydmV5SGVscGVyLmZpeEZvbnQoY29udHJvbGxlcik7XG4gICAgICAgIGF3YWl0IHRoaXMucmVuZGVyU3VydmV5KGNvbnRyb2xsZXIpO1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5kb2Mub3V0cHV0KHR5cGUpO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zdXJ2ZXkudHMiLCJcInVzZSBzdHJpY3RcIjtcclxuLy8gQW4gYXVnbWVudGVkIEFWTCBUcmVlIHdoZXJlIGVhY2ggbm9kZSBtYWludGFpbnMgYSBsaXN0IG9mIHJlY29yZHMgYW5kIHRoZWlyIHNlYXJjaCBpbnRlcnZhbHMuXHJcbi8vIFJlY29yZCBpcyBjb21wb3NlZCBvZiBhbiBpbnRlcnZhbCBhbmQgaXRzIHVuZGVybHlpbmcgZGF0YSwgc2VudCBieSBhIGNsaWVudC4gVGhpcyBhbGxvd3MgdGhlXHJcbi8vIGludGVydmFsIHRyZWUgdG8gaGF2ZSB0aGUgc2FtZSBpbnRlcnZhbCBpbnNlcnRlZCBtdWx0aXBsZSB0aW1lcywgYXMgbG9uZyBpdHMgZGF0YSBpcyBkaWZmZXJlbnQuXHJcbi8vIEJvdGggaW5zZXJ0aW9uIGFuZCBkZWxldGlvbiByZXF1aXJlIE8obG9nIG4pIHRpbWUuIFNlYXJjaGluZyByZXF1aXJlcyBPKGsqbG9nbikgdGltZSwgd2hlcmUgYGtgXHJcbi8vIGlzIHRoZSBudW1iZXIgb2YgaW50ZXJ2YWxzIGluIHRoZSBvdXRwdXQgbGlzdC5cclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG52YXIgaXNTYW1lID0gcmVxdWlyZShcInNoYWxsb3dlcXVhbFwiKTtcclxuZnVuY3Rpb24gaGVpZ2h0KG5vZGUpIHtcclxuICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gbm9kZS5oZWlnaHQ7XHJcbiAgICB9XHJcbn1cclxudmFyIE5vZGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBOb2RlKGludGVydmFsVHJlZSwgcmVjb3JkKSB7XHJcbiAgICAgICAgdGhpcy5pbnRlcnZhbFRyZWUgPSBpbnRlcnZhbFRyZWU7XHJcbiAgICAgICAgdGhpcy5yZWNvcmRzID0gW107XHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAwO1xyXG4gICAgICAgIHRoaXMua2V5ID0gcmVjb3JkLmxvdztcclxuICAgICAgICB0aGlzLm1heCA9IHJlY29yZC5oaWdoO1xyXG4gICAgICAgIC8vIFNhdmUgdGhlIGFycmF5IG9mIGFsbCByZWNvcmRzIHdpdGggdGhlIHNhbWUga2V5IGZvciB0aGlzIG5vZGVcclxuICAgICAgICB0aGlzLnJlY29yZHMucHVzaChyZWNvcmQpO1xyXG4gICAgfVxyXG4gICAgLy8gR2V0cyB0aGUgaGlnaGVzdCByZWNvcmQuaGlnaCB2YWx1ZSBmb3IgdGhpcyBub2RlXHJcbiAgICBOb2RlLnByb3RvdHlwZS5nZXROb2RlSGlnaCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgaGlnaCA9IHRoaXMucmVjb3Jkc1swXS5oaWdoO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgdGhpcy5yZWNvcmRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJlY29yZHNbaV0uaGlnaCA+IGhpZ2gpIHtcclxuICAgICAgICAgICAgICAgIGhpZ2ggPSB0aGlzLnJlY29yZHNbaV0uaGlnaDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaGlnaDtcclxuICAgIH07XHJcbiAgICAvLyBVcGRhdGVzIGhlaWdodCB2YWx1ZSBvZiB0aGUgbm9kZS4gQ2FsbGVkIGR1cmluZyBpbnNlcnRpb24sIHJlYmFsYW5jZSwgcmVtb3ZhbFxyXG4gICAgTm9kZS5wcm90b3R5cGUudXBkYXRlSGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0KHRoaXMubGVmdCksIGhlaWdodCh0aGlzLnJpZ2h0KSkgKyAxO1xyXG4gICAgfTtcclxuICAgIC8vIFVwZGF0ZXMgdGhlIG1heCB2YWx1ZSBvZiBhbGwgdGhlIHBhcmVudHMgYWZ0ZXIgaW5zZXJ0aW5nIGludG8gYWxyZWFkeSBleGlzdGluZyBub2RlLCBhcyB3ZWxsIGFzXHJcbiAgICAvLyByZW1vdmluZyB0aGUgbm9kZSBjb21wbGV0ZWx5IG9yIHJlbW92aW5nIHRoZSByZWNvcmQgb2YgYW4gYWxyZWFkeSBleGlzdGluZyBub2RlLiBTdGFydHMgd2l0aFxyXG4gICAgLy8gdGhlIHBhcmVudCBvZiBhbiBhZmZlY3RlZCBub2RlIGFuZCBidWJibGVzIHVwIHRvIHJvb3RcclxuICAgIE5vZGUucHJvdG90eXBlLnVwZGF0ZU1heE9mUGFyZW50cyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHRoaXNIaWdoID0gdGhpcy5nZXROb2RlSGlnaCgpO1xyXG4gICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heChNYXRoLm1heCh0aGlzLmxlZnQubWF4LCB0aGlzLnJpZ2h0Lm1heCksIHRoaXNIaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgodGhpcy5sZWZ0Lm1heCwgdGhpc0hpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heCh0aGlzLnJpZ2h0Lm1heCwgdGhpc0hpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSB0aGlzSGlnaDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50LnVwZGF0ZU1heE9mUGFyZW50cygpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICAvKlxyXG4gICAgTGVmdC1MZWZ0IGNhc2U6XHJcbiAgXHJcbiAgICAgICAgICAgeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeVxyXG4gICAgICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAgIFxcXHJcbiAgICAgICAgIHkgICBUNCAgICAgIFJpZ2h0IFJvdGF0ZSAoeikgICAgICAgICAgeCAgICAgelxyXG4gICAgICAgIC8gXFwgICAgICAgICAgLSAtIC0gLSAtIC0gLSAtIC0+ICAgICAgIC8gXFwgICAvIFxcXHJcbiAgICAgICB4ICAgVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxIFQyIFQzIFQ0XHJcbiAgICAgIC8gXFxcclxuICAgIFQxICAgVDJcclxuICBcclxuICAgIExlZnQtUmlnaHQgY2FzZTpcclxuICBcclxuICAgICAgICAgeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgeFxyXG4gICAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAvICAgXFxcclxuICAgICAgIHkgICBUNCAgTGVmdCBSb3RhdGUgKHkpICAgICAgICAgeCAgVDQgIFJpZ2h0IFJvdGF0ZSh6KSAgICAgeSAgICAgelxyXG4gICAgICAvIFxcICAgICAgLSAtIC0gLSAtIC0gLSAtIC0+ICAgICAvIFxcICAgICAgLSAtIC0gLSAtIC0gLSAtPiAgLyBcXCAgIC8gXFxcclxuICAgIFQxICAgeCAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgIFQzICAgICAgICAgICAgICAgICAgICAgIFQxIFQyIFQzIFQ0XHJcbiAgICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAvIFxcXHJcbiAgICAgIFQyICAgVDMgICAgICAgICAgICAgICAgICAgICAgVDEgVDJcclxuICAgICovXHJcbiAgICAvLyBIYW5kbGVzIExlZnQtTGVmdCBjYXNlIGFuZCBMZWZ0LVJpZ2h0IGNhc2UgYWZ0ZXIgcmViYWxhbmNpbmcgQVZMIHRyZWVcclxuICAgIE5vZGUucHJvdG90eXBlLl91cGRhdGVNYXhBZnRlclJpZ2h0Um90YXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcclxuICAgICAgICB2YXIgbGVmdCA9IHBhcmVudC5sZWZ0O1xyXG4gICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgbGVmdCBzaWJsaW5nICh4IGluIGZpcnN0IGNhc2UsIHkgaW4gc2Vjb25kKVxyXG4gICAgICAgIHZhciB0aGlzUGFyZW50TGVmdEhpZ2ggPSBsZWZ0LmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgaWYgKGxlZnQubGVmdCA9PT0gdW5kZWZpbmVkICYmIGxlZnQucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZWZ0Lm1heCA9IE1hdGgubWF4KHRoaXNQYXJlbnRMZWZ0SGlnaCwgbGVmdC5yaWdodC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChsZWZ0LmxlZnQgIT09IHVuZGVmaW5lZCAmJiBsZWZ0LnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbGVmdC5tYXggPSBNYXRoLm1heCh0aGlzUGFyZW50TGVmdEhpZ2gsIGxlZnQubGVmdC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChsZWZ0LmxlZnQgPT09IHVuZGVmaW5lZCAmJiBsZWZ0LnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbGVmdC5tYXggPSB0aGlzUGFyZW50TGVmdEhpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZWZ0Lm1heCA9IE1hdGgubWF4KE1hdGgubWF4KGxlZnQubGVmdC5tYXgsIGxlZnQucmlnaHQubWF4KSwgdGhpc1BhcmVudExlZnRIaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVXBkYXRlIG1heCBvZiBpdHNlbGYgKHopXHJcbiAgICAgICAgdmFyIHRoaXNIaWdoID0gdGhpcy5nZXROb2RlSGlnaCgpO1xyXG4gICAgICAgIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heCh0aGlzSGlnaCwgdGhpcy5yaWdodC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heCh0aGlzSGlnaCwgdGhpcy5sZWZ0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IHRoaXNIaWdoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heChNYXRoLm1heCh0aGlzLmxlZnQubWF4LCB0aGlzLnJpZ2h0Lm1heCksIHRoaXNIaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVXBkYXRlIG1heCBvZiBwYXJlbnQgKHkgaW4gZmlyc3QgY2FzZSwgeCBpbiBzZWNvbmQpXHJcbiAgICAgICAgcGFyZW50Lm1heCA9IE1hdGgubWF4KE1hdGgubWF4KHBhcmVudC5sZWZ0Lm1heCwgcGFyZW50LnJpZ2h0Lm1heCksIHBhcmVudC5nZXROb2RlSGlnaCgpKTtcclxuICAgIH07XHJcbiAgICAvKlxyXG4gICAgUmlnaHQtUmlnaHQgY2FzZTpcclxuICBcclxuICAgICAgeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5XHJcbiAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICAgXFxcclxuICAgIFQxICB5ICAgICBMZWZ0IFJvdGF0ZSh6KSAgICAgICB6ICAgICB4XHJcbiAgICAgICAvIFxcICAgLSAtIC0gLSAtIC0gLSAtPiAgICAgLyBcXCAgIC8gXFxcclxuICAgICAgVDIgIHggICAgICAgICAgICAgICAgICAgICAgVDEgVDIgVDMgVDRcclxuICAgICAgICAgLyBcXFxyXG4gICAgICAgIFQzIFQ0XHJcbiAgXHJcbiAgICBSaWdodC1MZWZ0IGNhc2U6XHJcbiAgXHJcbiAgICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogICAgICAgICAgICAgICAgICAgICAgICAgICAgeFxyXG4gICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgIC8gICBcXFxyXG4gICAgIFQxICB5ICAgUmlnaHQgUm90YXRlICh5KSAgICAgVDEgIHggICAgICBMZWZ0IFJvdGF0ZSh6KSAgIHogICAgIHlcclxuICAgICAgICAvIFxcICAtIC0gLSAtIC0gLSAtIC0gLT4gICAgICAvIFxcICAgLSAtIC0gLSAtIC0gLSAtPiAgLyBcXCAgIC8gXFxcclxuICAgICAgIHggIFQ0ICAgICAgICAgICAgICAgICAgICAgICAgVDIgIHkgICAgICAgICAgICAgICAgICAgVDEgVDIgVDMgVDRcclxuICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gXFxcclxuICAgIFQyICAgVDMgICAgICAgICAgICAgICAgICAgICAgICAgICBUMyBUNFxyXG4gICAgKi9cclxuICAgIC8vIEhhbmRsZXMgUmlnaHQtUmlnaHQgY2FzZSBhbmQgUmlnaHQtTGVmdCBjYXNlIGluIHJlYmFsYW5jaW5nIEFWTCB0cmVlXHJcbiAgICBOb2RlLnByb3RvdHlwZS5fdXBkYXRlTWF4QWZ0ZXJMZWZ0Um90YXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcclxuICAgICAgICB2YXIgcmlnaHQgPSBwYXJlbnQucmlnaHQ7XHJcbiAgICAgICAgLy8gVXBkYXRlIG1heCBvZiByaWdodCBzaWJsaW5nICh4IGluIGZpcnN0IGNhc2UsIHkgaW4gc2Vjb25kKVxyXG4gICAgICAgIHZhciB0aGlzUGFyZW50UmlnaHRIaWdoID0gcmlnaHQuZ2V0Tm9kZUhpZ2goKTtcclxuICAgICAgICBpZiAocmlnaHQubGVmdCA9PT0gdW5kZWZpbmVkICYmIHJpZ2h0LnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmlnaHQubWF4ID0gTWF0aC5tYXgodGhpc1BhcmVudFJpZ2h0SGlnaCwgcmlnaHQucmlnaHQubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocmlnaHQubGVmdCAhPT0gdW5kZWZpbmVkICYmIHJpZ2h0LnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmlnaHQubWF4ID0gTWF0aC5tYXgodGhpc1BhcmVudFJpZ2h0SGlnaCwgcmlnaHQubGVmdC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyaWdodC5sZWZ0ID09PSB1bmRlZmluZWQgJiYgcmlnaHQucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByaWdodC5tYXggPSB0aGlzUGFyZW50UmlnaHRIaWdoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmlnaHQubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgocmlnaHQubGVmdC5tYXgsIHJpZ2h0LnJpZ2h0Lm1heCksIHRoaXNQYXJlbnRSaWdodEhpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIGl0c2VsZiAoeilcclxuICAgICAgICB2YXIgdGhpc0hpZ2ggPSB0aGlzLmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXNIaWdoLCB0aGlzLnJpZ2h0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXNIaWdoLCB0aGlzLmxlZnQubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gdGhpc0hpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KE1hdGgubWF4KHRoaXMubGVmdC5tYXgsIHRoaXMucmlnaHQubWF4KSwgdGhpc0hpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIHBhcmVudCAoeSBpbiBmaXJzdCBjYXNlLCB4IGluIHNlY29uZClcclxuICAgICAgICBwYXJlbnQubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgocGFyZW50LmxlZnQubWF4LCByaWdodC5tYXgpLCBwYXJlbnQuZ2V0Tm9kZUhpZ2goKSk7XHJcbiAgICB9O1xyXG4gICAgTm9kZS5wcm90b3R5cGUuX2xlZnRSb3RhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHJpZ2h0Q2hpbGQgPSB0aGlzLnJpZ2h0O1xyXG4gICAgICAgIHJpZ2h0Q2hpbGQucGFyZW50ID0gdGhpcy5wYXJlbnQ7XHJcbiAgICAgICAgaWYgKHJpZ2h0Q2hpbGQucGFyZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnRlcnZhbFRyZWUucm9vdCA9IHJpZ2h0Q2hpbGQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocmlnaHRDaGlsZC5wYXJlbnQubGVmdCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgcmlnaHRDaGlsZC5wYXJlbnQubGVmdCA9IHJpZ2h0Q2hpbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAocmlnaHRDaGlsZC5wYXJlbnQucmlnaHQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIHJpZ2h0Q2hpbGQucGFyZW50LnJpZ2h0ID0gcmlnaHRDaGlsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHRDaGlsZC5sZWZ0O1xyXG4gICAgICAgIGlmICh0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5yaWdodC5wYXJlbnQgPSB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICByaWdodENoaWxkLmxlZnQgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMucGFyZW50ID0gcmlnaHRDaGlsZDtcclxuICAgICAgICB0aGlzLnVwZGF0ZUhlaWdodCgpO1xyXG4gICAgICAgIHJpZ2h0Q2hpbGQudXBkYXRlSGVpZ2h0KCk7XHJcbiAgICB9O1xyXG4gICAgTm9kZS5wcm90b3R5cGUuX3JpZ2h0Um90YXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBsZWZ0Q2hpbGQgPSB0aGlzLmxlZnQ7XHJcbiAgICAgICAgbGVmdENoaWxkLnBhcmVudCA9IHRoaXMucGFyZW50O1xyXG4gICAgICAgIGlmIChsZWZ0Q2hpbGQucGFyZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnRlcnZhbFRyZWUucm9vdCA9IGxlZnRDaGlsZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChsZWZ0Q2hpbGQucGFyZW50LmxlZnQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIGxlZnRDaGlsZC5wYXJlbnQubGVmdCA9IGxlZnRDaGlsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChsZWZ0Q2hpbGQucGFyZW50LnJpZ2h0ID09PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICBsZWZ0Q2hpbGQucGFyZW50LnJpZ2h0ID0gbGVmdENoaWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGVmdCA9IGxlZnRDaGlsZC5yaWdodDtcclxuICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5sZWZ0LnBhcmVudCA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxlZnRDaGlsZC5yaWdodCA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBsZWZ0Q2hpbGQ7XHJcbiAgICAgICAgdGhpcy51cGRhdGVIZWlnaHQoKTtcclxuICAgICAgICBsZWZ0Q2hpbGQudXBkYXRlSGVpZ2h0KCk7XHJcbiAgICB9O1xyXG4gICAgLy8gUmViYWxhbmNlcyB0aGUgdHJlZSBpZiB0aGUgaGVpZ2h0IHZhbHVlIGJldHdlZW4gdHdvIG5vZGVzIG9mIHRoZSBzYW1lIHBhcmVudCBpcyBncmVhdGVyIHRoYW5cclxuICAgIC8vIHR3by4gVGhlcmUgYXJlIDQgY2FzZXMgdGhhdCBjYW4gaGFwcGVuIHdoaWNoIGFyZSBvdXRsaW5lZCBpbiB0aGUgZ3JhcGhpY3MgYWJvdmVcclxuICAgIE5vZGUucHJvdG90eXBlLl9yZWJhbGFuY2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKGhlaWdodCh0aGlzLmxlZnQpID49IDIgKyBoZWlnaHQodGhpcy5yaWdodCkpIHtcclxuICAgICAgICAgICAgdmFyIGxlZnQgPSB0aGlzLmxlZnQ7XHJcbiAgICAgICAgICAgIGlmIChoZWlnaHQobGVmdC5sZWZ0KSA+PSBoZWlnaHQobGVmdC5yaWdodCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIExlZnQtTGVmdCBjYXNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yaWdodFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlTWF4QWZ0ZXJSaWdodFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gTGVmdC1SaWdodCBjYXNlXHJcbiAgICAgICAgICAgICAgICBsZWZ0Ll9sZWZ0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yaWdodFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlTWF4QWZ0ZXJSaWdodFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGhlaWdodCh0aGlzLnJpZ2h0KSA+PSAyICsgaGVpZ2h0KHRoaXMubGVmdCkpIHtcclxuICAgICAgICAgICAgdmFyIHJpZ2h0ID0gdGhpcy5yaWdodDtcclxuICAgICAgICAgICAgaWYgKGhlaWdodChyaWdodC5yaWdodCkgPj0gaGVpZ2h0KHJpZ2h0LmxlZnQpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBSaWdodC1SaWdodCBjYXNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sZWZ0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVNYXhBZnRlckxlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIFJpZ2h0LUxlZnQgY2FzZVxyXG4gICAgICAgICAgICAgICAgcmlnaHQuX3JpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sZWZ0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVNYXhBZnRlckxlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAocmVjb3JkKSB7XHJcbiAgICAgICAgaWYgKHJlY29yZC5sb3cgPCB0aGlzLmtleSkge1xyXG4gICAgICAgICAgICAvLyBJbnNlcnQgaW50byBsZWZ0IHN1YnRyZWVcclxuICAgICAgICAgICAgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxlZnQgPSBuZXcgTm9kZSh0aGlzLmludGVydmFsVHJlZSwgcmVjb3JkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGVmdC5wYXJlbnQgPSB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sZWZ0Lmluc2VydChyZWNvcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBJbnNlcnQgaW50byByaWdodCBzdWJ0cmVlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmlnaHQgPSBuZXcgTm9kZSh0aGlzLmludGVydmFsVHJlZSwgcmVjb3JkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmlnaHQucGFyZW50ID0gdGhpcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmlnaHQuaW5zZXJ0KHJlY29yZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBtYXggdmFsdWUgb2YgdGhpcyBhbmNlc3RvciBpZiBuZWVkZWRcclxuICAgICAgICBpZiAodGhpcy5tYXggPCByZWNvcmQuaGlnaCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IHJlY29yZC5oaWdoO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgaGVpZ2h0IG9mIGVhY2ggbm9kZVxyXG4gICAgICAgIHRoaXMudXBkYXRlSGVpZ2h0KCk7XHJcbiAgICAgICAgLy8gUmViYWxhbmNlIHRoZSB0cmVlIHRvIGVuc3VyZSBhbGwgb3BlcmF0aW9ucyBhcmUgZXhlY3V0ZWQgaW4gTyhsb2duKSB0aW1lLiBUaGlzIGlzIGVzcGVjaWFsbHlcclxuICAgICAgICAvLyBpbXBvcnRhbnQgaW4gc2VhcmNoaW5nLCBhcyB0aGUgdHJlZSBoYXMgYSBoaWdoIGNoYW5jZSBvZiBkZWdlbmVyYXRpbmcgd2l0aG91dCB0aGUgcmViYWxhbmNpbmdcclxuICAgICAgICB0aGlzLl9yZWJhbGFuY2UoKTtcclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5fZ2V0T3ZlcmxhcHBpbmdSZWNvcmRzID0gZnVuY3Rpb24gKGN1cnJlbnROb2RlLCBsb3csIGhpZ2gpIHtcclxuICAgICAgICBpZiAoY3VycmVudE5vZGUua2V5IDw9IGhpZ2ggJiYgbG93IDw9IGN1cnJlbnROb2RlLmdldE5vZGVIaWdoKCkpIHtcclxuICAgICAgICAgICAgLy8gTm9kZXMgYXJlIG92ZXJsYXBwaW5nLCBjaGVjayBpZiBpbmRpdmlkdWFsIHJlY29yZHMgaW4gdGhlIG5vZGUgYXJlIG92ZXJsYXBwaW5nXHJcbiAgICAgICAgICAgIHZhciB0ZW1wUmVzdWx0cyA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1cnJlbnROb2RlLnJlY29yZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5yZWNvcmRzW2ldLmhpZ2ggPj0gbG93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcFJlc3VsdHMucHVzaChjdXJyZW50Tm9kZS5yZWNvcmRzW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGVtcFJlc3VsdHM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5zZWFyY2ggPSBmdW5jdGlvbiAobG93LCBoaWdoKSB7XHJcbiAgICAgICAgLy8gRG9uJ3Qgc2VhcmNoIG5vZGVzIHRoYXQgZG9uJ3QgZXhpc3RcclxuICAgICAgICBpZiAodGhpcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGxlZnRTZWFyY2ggPSBbXTtcclxuICAgICAgICB2YXIgb3duU2VhcmNoID0gW107XHJcbiAgICAgICAgdmFyIHJpZ2h0U2VhcmNoID0gW107XHJcbiAgICAgICAgLy8gSWYgaW50ZXJ2YWwgaXMgdG8gdGhlIHJpZ2h0IG9mIHRoZSByaWdodG1vc3QgcG9pbnQgb2YgYW55IGludGVydmFsIGluIHRoaXMgbm9kZSBhbmQgYWxsIGl0c1xyXG4gICAgICAgIC8vIGNoaWxkcmVuLCB0aGVyZSB3b24ndCBiZSBhbnkgbWF0Y2hlc1xyXG4gICAgICAgIGlmIChsb3cgPiB0aGlzLm1heCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNlYXJjaCBsZWZ0IGNoaWxkcmVuXHJcbiAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMubGVmdC5tYXggPj0gbG93KSB7XHJcbiAgICAgICAgICAgIGxlZnRTZWFyY2ggPSB0aGlzLmxlZnQuc2VhcmNoKGxvdywgaGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIENoZWNrIHRoaXMgbm9kZVxyXG4gICAgICAgIG93blNlYXJjaCA9IHRoaXMuX2dldE92ZXJsYXBwaW5nUmVjb3Jkcyh0aGlzLCBsb3csIGhpZ2gpO1xyXG4gICAgICAgIC8vIElmIGludGVydmFsIGlzIHRvIHRoZSBsZWZ0IG9mIHRoZSBzdGFydCBvZiB0aGlzIGludGVydmFsLCB0aGVuIGl0IGNhbid0IGJlIGluIGFueSBjaGlsZCB0b1xyXG4gICAgICAgIC8vIHRoZSByaWdodFxyXG4gICAgICAgIGlmIChoaWdoIDwgdGhpcy5rZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxlZnRTZWFyY2guY29uY2F0KG93blNlYXJjaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE90aGVyd2lzZSwgc2VhcmNoIHJpZ2h0IGNoaWxkcmVuXHJcbiAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByaWdodFNlYXJjaCA9IHRoaXMucmlnaHQuc2VhcmNoKGxvdywgaGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFJldHVybiBhY2N1bXVsYXRlZCByZXN1bHRzLCBpZiBhbnlcclxuICAgICAgICByZXR1cm4gbGVmdFNlYXJjaC5jb25jYXQob3duU2VhcmNoLCByaWdodFNlYXJjaCk7XHJcbiAgICB9O1xyXG4gICAgLy8gU2VhcmNoZXMgZm9yIGEgbm9kZSBieSBhIGBrZXlgIHZhbHVlXHJcbiAgICBOb2RlLnByb3RvdHlwZS5zZWFyY2hFeGlzdGluZyA9IGZ1bmN0aW9uIChsb3cpIHtcclxuICAgICAgICBpZiAodGhpcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmtleSA9PT0gbG93KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChsb3cgPCB0aGlzLmtleSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnQuc2VhcmNoRXhpc3RpbmcobG93KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmlnaHQuc2VhcmNoRXhpc3RpbmcobG93KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfTtcclxuICAgIC8vIFJldHVybnMgdGhlIHNtYWxsZXN0IG5vZGUgb2YgdGhlIHN1YnRyZWVcclxuICAgIE5vZGUucHJvdG90eXBlLl9taW5WYWx1ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sZWZ0Ll9taW5WYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcclxuICAgICAgICBpZiAobm9kZS5rZXkgPCB0aGlzLmtleSkge1xyXG4gICAgICAgICAgICAvLyBOb2RlIHRvIGJlIHJlbW92ZWQgaXMgb24gdGhlIGxlZnQgc2lkZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnQucmVtb3ZlKG5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChub2RlLmtleSA+IHRoaXMua2V5KSB7XHJcbiAgICAgICAgICAgIC8vIE5vZGUgdG8gYmUgcmVtb3ZlZCBpcyBvbiB0aGUgcmlnaHQgc2lkZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodC5yZW1vdmUobm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBOb2RlIGhhcyB0d28gY2hpbGRyZW5cclxuICAgICAgICAgICAgICAgIHZhciBtaW5WYWx1ZSA9IHRoaXMucmlnaHQuX21pblZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmtleSA9IG1pblZhbHVlLmtleTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVjb3JkcyA9IG1pblZhbHVlLnJlY29yZHM7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodC5yZW1vdmUodGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAocGFyZW50LmxlZnQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIC8vIE9uZSBjaGlsZCBvciBubyBjaGlsZCBjYXNlIG9uIGxlZnQgc2lkZVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5sZWZ0ID0gdGhpcy5yaWdodDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0LnBhcmVudCA9IHBhcmVudDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5sZWZ0ID0gdGhpcy5sZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxlZnQucGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHBhcmVudC51cGRhdGVNYXhPZlBhcmVudHMoKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudC51cGRhdGVIZWlnaHQoKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudC5fcmViYWxhbmNlKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChwYXJlbnQucmlnaHQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIC8vIE9uZSBjaGlsZCBvciBubyBjaGlsZCBjYXNlIG9uIHJpZ2h0IHNpZGVcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQucmlnaHQgPSB0aGlzLnJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmlnaHQucGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50LnJpZ2h0ID0gdGhpcy5sZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxlZnQucGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHBhcmVudC51cGRhdGVNYXhPZlBhcmVudHMoKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudC51cGRhdGVIZWlnaHQoKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudC5fcmViYWxhbmNlKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXR1cm4gTm9kZTtcclxufSgpKTtcclxuZXhwb3J0cy5Ob2RlID0gTm9kZTtcclxudmFyIEludGVydmFsVHJlZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIEludGVydmFsVHJlZSgpIHtcclxuICAgICAgICB0aGlzLmNvdW50ID0gMDtcclxuICAgIH1cclxuICAgIEludGVydmFsVHJlZS5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gKHJlY29yZCkge1xyXG4gICAgICAgIGlmIChyZWNvcmQubG93ID4gcmVjb3JkLmhpZ2gpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdgbG93YCB2YWx1ZSBtdXN0IGJlIGxvd2VyIG9yIGVxdWFsIHRvIGBoaWdoYCB2YWx1ZScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5yb290ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8gQmFzZSBjYXNlOiBUcmVlIGlzIGVtcHR5LCBuZXcgbm9kZSBiZWNvbWVzIHJvb3RcclxuICAgICAgICAgICAgdGhpcy5yb290ID0gbmV3IE5vZGUodGhpcywgcmVjb3JkKTtcclxuICAgICAgICAgICAgdGhpcy5jb3VudCsrO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgY2hlY2sgaWYgbm9kZSBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBzYW1lIGtleVxyXG4gICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMucm9vdC5zZWFyY2hFeGlzdGluZyhyZWNvcmQubG93KTtcclxuICAgICAgICAgICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlY29yZHMgaW4gdGhpcyBub2RlIGlmIHRoZXJlIGFscmVhZHkgaXMgdGhlIG9uZSB3aXRoIHNhbWUgbG93LCBoaWdoLCBkYXRhXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUucmVjb3Jkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1NhbWUobm9kZS5yZWNvcmRzW2ldLCByZWNvcmQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgcmVjb3JkIGlzIHNhbWUgYXMgdGhlIG9uZSB3ZSdyZSB0cnlpbmcgdG8gaW5zZXJ0OyByZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBoYXMgYmVlbiBpbnNlcnRlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSByZWNvcmQgdG8gdGhlIG5vZGVcclxuICAgICAgICAgICAgICAgIG5vZGUucmVjb3Jkcy5wdXNoKHJlY29yZCk7XHJcbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIHRoZSBub2RlIGFuZCBpdHMgcGFyZW50cyBpZiBuZWNlc3NhcnlcclxuICAgICAgICAgICAgICAgIGlmIChyZWNvcmQuaGlnaCA+IG5vZGUubWF4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXggPSByZWNvcmQuaGlnaDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQudXBkYXRlTWF4T2ZQYXJlbnRzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBOb2RlIHdpdGggdGhpcyBrZXkgZG9lc24ndCBhbHJlYWR5IGV4aXN0LiBDYWxsIGluc2VydCBmdW5jdGlvbiBvbiByb290J3Mgbm9kZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yb290Lmluc2VydChyZWNvcmQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5zZWFyY2ggPSBmdW5jdGlvbiAobG93LCBoaWdoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vIFRyZWUgaXMgZW1wdHk7IHJldHVybiBlbXB0eSBhcnJheVxyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290LnNlYXJjaChsb3csIGhpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBJbnRlcnZhbFRyZWUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChyZWNvcmQpIHtcclxuICAgICAgICBpZiAodGhpcy5yb290ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8gVHJlZSBpcyBlbXB0eTsgbm90aGluZyB0byByZW1vdmVcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzLnJvb3Quc2VhcmNoRXhpc3RpbmcocmVjb3JkLmxvdyk7XHJcbiAgICAgICAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChub2RlLnJlY29yZHMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlbW92ZWRSZWNvcmQgPSB2b2lkIDA7XHJcbiAgICAgICAgICAgICAgICAvLyBOb2RlIHdpdGggdGhpcyBrZXkgaGFzIDIgb3IgbW9yZSByZWNvcmRzLiBGaW5kIHRoZSBvbmUgd2UgbmVlZCBhbmQgcmVtb3ZlIGl0XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUucmVjb3Jkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1NhbWUobm9kZS5yZWNvcmRzW2ldLCByZWNvcmQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWRSZWNvcmQgPSBub2RlLnJlY29yZHNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucmVjb3Jkcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChyZW1vdmVkUmVjb3JkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZFJlY29yZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIHRoYXQgbm9kZSBhbmQgaXRzIHBhcmVudHMgaWYgbmVjZXNzYXJ5XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZC5oaWdoID09PSBub2RlLm1heCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZUhpZ2ggPSBub2RlLmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmxlZnQgIT09IHVuZGVmaW5lZCAmJiBub2RlLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgobm9kZS5sZWZ0Lm1heCwgbm9kZS5yaWdodC5tYXgpLCBub2RlSGlnaCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgbm9kZS5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm1heCA9IE1hdGgubWF4KG5vZGUubGVmdC5tYXgsIG5vZGVIaWdoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlLmxlZnQgPT09IHVuZGVmaW5lZCAmJiBub2RlLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubWF4ID0gTWF0aC5tYXgobm9kZS5yaWdodC5tYXgsIG5vZGVIaWdoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubWF4ID0gbm9kZUhpZ2g7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnBhcmVudC51cGRhdGVNYXhPZlBhcmVudHMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50LS07XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5yZWNvcmRzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgLy8gTm9kZSB3aXRoIHRoaXMga2V5IGhhcyBvbmx5IDEgcmVjb3JkLiBDaGVjayBpZiB0aGUgcmVtYWluaW5nIHJlY29yZCBpbiB0aGlzIG5vZGUgaXNcclxuICAgICAgICAgICAgICAgIC8vIGFjdHVhbGx5IHRoZSBvbmUgd2Ugd2FudCB0byByZW1vdmVcclxuICAgICAgICAgICAgICAgIGlmIChpc1NhbWUobm9kZS5yZWNvcmRzWzBdLCByZWNvcmQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlbWFpbmluZyByZWNvcmQgaXMgdGhlIG9uZSB3ZSB3YW50IHRvIHJlbW92ZS4gUmVtb3ZlIHRoZSB3aG9sZSBub2RlIGZyb20gdGhlIHRyZWVcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yb290LmtleSA9PT0gbm9kZS5rZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgcmVtb3ZpbmcgdGhlIHJvb3QgZWxlbWVudC4gQ3JlYXRlIGEgZHVtbXkgbm9kZSB0aGF0IHdpbGwgdGVtcG9yYXJpbHkgdGFrZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByb290J3MgcGFyZW50IHJvbGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvb3RQYXJlbnQgPSBuZXcgTm9kZSh0aGlzLCB7IGxvdzogcmVjb3JkLmxvdywgaGlnaDogcmVjb3JkLmxvdyB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFBhcmVudC5sZWZ0ID0gdGhpcy5yb290O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3QucGFyZW50ID0gcm9vdFBhcmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbW92ZWROb2RlID0gdGhpcy5yb290LnJlbW92ZShub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290ID0gcm9vdFBhcmVudC5sZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yb290ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdC5wYXJlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZWROb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkTm9kZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnQtLTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlZE5vZGUgPSB0aGlzLnJvb3QucmVtb3ZlKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3ZlZE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWROb2RlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudC0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVtYWluaW5nIHJlY29yZCBpcyBub3QgdGhlIG9uZSB3ZSB3YW50IHRvIHJlbW92ZVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIE5vIHJlY29yZHMgYXQgYWxsIGluIHRoaXMgbm9kZT8hIFNob3VsZG4ndCBoYXBwZW5cclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBJbnRlcnZhbFRyZWUucHJvdG90eXBlLmluT3JkZXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBJbk9yZGVyKHRoaXMucm9vdCk7XHJcbiAgICB9O1xyXG4gICAgSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5wcmVPcmRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByZU9yZGVyKHRoaXMucm9vdCk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIEludGVydmFsVHJlZTtcclxufSgpKTtcclxuZXhwb3J0cy5JbnRlcnZhbFRyZWUgPSBJbnRlcnZhbFRyZWU7XHJcbnZhciBEYXRhSW50ZXJ2YWxUcmVlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gRGF0YUludGVydmFsVHJlZSgpIHtcclxuICAgICAgICB0aGlzLnRyZWUgPSBuZXcgSW50ZXJ2YWxUcmVlKCk7XHJcbiAgICB9XHJcbiAgICBEYXRhSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAobG93LCBoaWdoLCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZS5pbnNlcnQoeyBsb3c6IGxvdywgaGlnaDogaGlnaCwgZGF0YTogZGF0YSB9KTtcclxuICAgIH07XHJcbiAgICBEYXRhSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAobG93LCBoaWdoLCBkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZS5yZW1vdmUoeyBsb3c6IGxvdywgaGlnaDogaGlnaCwgZGF0YTogZGF0YSB9KTtcclxuICAgIH07XHJcbiAgICBEYXRhSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5zZWFyY2ggPSBmdW5jdGlvbiAobG93LCBoaWdoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZS5zZWFyY2gobG93LCBoaWdoKS5tYXAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYuZGF0YTsgfSk7XHJcbiAgICB9O1xyXG4gICAgRGF0YUludGVydmFsVHJlZS5wcm90b3R5cGUuaW5PcmRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLmluT3JkZXIoKTtcclxuICAgIH07XHJcbiAgICBEYXRhSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5wcmVPcmRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLnByZU9yZGVyKCk7XHJcbiAgICB9O1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLCBcImNvdW50XCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJlZS5jb3VudDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBEYXRhSW50ZXJ2YWxUcmVlO1xyXG59KCkpO1xyXG5leHBvcnRzLmRlZmF1bHQgPSBEYXRhSW50ZXJ2YWxUcmVlO1xyXG52YXIgSW5PcmRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIEluT3JkZXIoc3RhcnROb2RlKSB7XHJcbiAgICAgICAgdGhpcy5zdGFjayA9IFtdO1xyXG4gICAgICAgIGlmIChzdGFydE5vZGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnB1c2goc3RhcnROb2RlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBJbk9yZGVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vIFdpbGwgb25seSBoYXBwZW4gaWYgc3RhY2sgaXMgZW1wdHkgYW5kIHBvcCBpcyBjYWxsZWRcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkb25lOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUHJvY2VzcyB0aGlzIG5vZGVcclxuICAgICAgICBpZiAodGhpcy5pIDwgdGhpcy5jdXJyZW50Tm9kZS5yZWNvcmRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZG9uZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5jdXJyZW50Tm9kZS5yZWNvcmRzW3RoaXMuaSsrXSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnB1c2godGhpcy5jdXJyZW50Tm9kZS5yaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBNaWdodCBwb3AgdGhlIGxhc3QgYW5kIHNldCB0aGlzLmN1cnJlbnROb2RlID0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIHRoaXMucG9wKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLm5leHQoKTtcclxuICAgIH07XHJcbiAgICBJbk9yZGVyLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gbm9kZTtcclxuICAgICAgICB0aGlzLmkgPSAwO1xyXG4gICAgICAgIHdoaWxlICh0aGlzLmN1cnJlbnROb2RlLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2godGhpcy5jdXJyZW50Tm9kZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmN1cnJlbnROb2RlLmxlZnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEluT3JkZXIucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5zdGFjay5wb3AoKTtcclxuICAgICAgICB0aGlzLmkgPSAwO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBJbk9yZGVyO1xyXG59KCkpO1xyXG5leHBvcnRzLkluT3JkZXIgPSBJbk9yZGVyO1xyXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgSW5PcmRlci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XHJcbn1cclxudmFyIFByZU9yZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gUHJlT3JkZXIoc3RhcnROb2RlKSB7XHJcbiAgICAgICAgdGhpcy5zdGFjayA9IFtdO1xyXG4gICAgICAgIHRoaXMuaSA9IDA7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHN0YXJ0Tm9kZTtcclxuICAgIH1cclxuICAgIFByZU9yZGVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vIFdpbGwgb25seSBoYXBwZW4gaWYgc3RhY2sgaXMgZW1wdHkgYW5kIHBvcCBpcyBjYWxsZWQsXHJcbiAgICAgICAgLy8gd2hpY2ggb25seSBoYXBwZW5zIGlmIHRoZXJlIGlzIG5vIHJpZ2h0IG5vZGUgKGkuZSB3ZSBhcmUgZG9uZSlcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkb25lOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUHJvY2VzcyB0aGlzIG5vZGVcclxuICAgICAgICBpZiAodGhpcy5pIDwgdGhpcy5jdXJyZW50Tm9kZS5yZWNvcmRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZG9uZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5jdXJyZW50Tm9kZS5yZWNvcmRzW3RoaXMuaSsrXSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnB1c2godGhpcy5jdXJyZW50Tm9kZS5yaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnB1c2godGhpcy5jdXJyZW50Tm9kZS5sZWZ0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wb3AoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KCk7XHJcbiAgICB9O1xyXG4gICAgUHJlT3JkZXIucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIHRoaXMuc3RhY2sucHVzaChub2RlKTtcclxuICAgIH07XHJcbiAgICBQcmVPcmRlci5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLnN0YWNrLnBvcCgpO1xyXG4gICAgICAgIHRoaXMuaSA9IDA7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIFByZU9yZGVyO1xyXG59KCkpO1xyXG5leHBvcnRzLlByZU9yZGVyID0gUHJlT3JkZXI7XHJcbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICBQcmVPcmRlci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XHJcbn1cclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L25vZGUtaW50ZXJ2YWwtdHJlZS9saWIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDU2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIsIGNvbXBhcmUsIGNvbXBhcmVDb250ZXh0KSB7XG4gIHZhciByZXQgPSBjb21wYXJlID8gY29tcGFyZS5jYWxsKGNvbXBhcmVDb250ZXh0LCBvYmpBLCBvYmpCKSA6IHZvaWQgMDtcblxuICBpZiAocmV0ICE9PSB2b2lkIDApIHtcbiAgICByZXR1cm4gISFyZXQ7XG4gIH1cblxuICBpZiAob2JqQSA9PT0gb2JqQikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSBcIm9iamVjdFwiIHx8ICFvYmpBIHx8IHR5cGVvZiBvYmpCICE9PSBcIm9iamVjdFwiIHx8ICFvYmpCKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBiSGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmJpbmQob2JqQik7XG5cbiAgLy8gVGVzdCBmb3IgQSdzIGtleXMgZGlmZmVyZW50IGZyb20gQi5cbiAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwga2V5c0EubGVuZ3RoOyBpZHgrKykge1xuICAgIHZhciBrZXkgPSBrZXlzQVtpZHhdO1xuXG4gICAgaWYgKCFiSGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZUEgPSBvYmpBW2tleV07XG4gICAgdmFyIHZhbHVlQiA9IG9iakJba2V5XTtcblxuICAgIHJldCA9IGNvbXBhcmUgPyBjb21wYXJlLmNhbGwoY29tcGFyZUNvbnRleHQsIHZhbHVlQSwgdmFsdWVCLCBrZXkpIDogdm9pZCAwO1xuXG4gICAgaWYgKHJldCA9PT0gZmFsc2UgfHwgKHJldCA9PT0gdm9pZCAwICYmIHZhbHVlQSAhPT0gdmFsdWVCKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9zaGFsbG93ZXF1YWwvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDU3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNldFJhZGlvQXBwZWFyYW5jZShkb2M6IGFueSk6IGFueSB7XG4gICAgY29uc3Qgb2xkQXBwZWFyYW5jZUZ1bmNpdGlvbjogRnVuY3Rpb24gPSBkb2MuQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZS5ZZXNOb3JtYWw7XG4gICAgZG9jLkFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGUuWWVzTm9ybWFsID0gZnVuY3Rpb24oZm9ybU9iamVjdDogYW55KSB7XG4gICAgICAgIGNvbnN0IHhvYmo6IGFueSA9IG9sZEFwcGVhcmFuY2VGdW5jaXRpb24oZm9ybU9iamVjdCk7XG4gICAgICAgIGNvbnN0IHN0cmVhbTogc3RyaW5nW10gPSB4b2JqLnN0cmVhbS5zcGxpdCgnXFxuJyk7XG4gICAgICAgIGNvbnN0IGVuY29kZUNvbG9yOiBzdHJpbmcgPSBkb2MuX19wcml2YXRlX18uZW5jb2RlQ29sb3JTdHJpbmcoZm9ybU9iamVjdC5jb2xvcik7XG4gICAgICAgIHN0cmVhbVswXSA9IHN0cmVhbVswXSArICdcXG4nICsgZW5jb2RlQ29sb3IgKyAnXFxuJyArIGVuY29kZUNvbG9yLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oJ1xcbicpO1xuICAgICAgICByZXR1cm4geG9iajtcbiAgICB9O1xufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtLnRzIiwiaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcblxuZXhwb3J0IGNsYXNzIENvbG9yZWRCcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByaXZhdGUgY29sb3I6IHN0cmluZywgcHJpdmF0ZSByZW5kZXJXaWR0aD86IG51bWJlciwgcHJpdmF0ZSByZW5kZXJIZWlnaHQ/OiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIodW5kZWZpbmVkLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgb2xkRmlsbENvbG9yOiBzdHJpbmcgPSB0aGlzLmNvbnRyb2xsZXIuZG9jLmdldEZpbGxDb2xvcigpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldEZpbGxDb2xvcih0aGlzLmNvbG9yIHx8ICdibGFjaycpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnJlY3QodGhpcy54TGVmdCwgdGhpcy55VG9wLFxuICAgICAgICAgICAgdGhpcy5yZW5kZXJXaWR0aCA/PyB0aGlzLndpZHRoLCB0aGlzLnJlbmRlckhlaWdodCA/PyB0aGlzLmhlaWdodCwgJ0YnKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRGaWxsQ29sb3Iob2xkRmlsbENvbG9yKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2NvbG9yZWRicmljay50cyIsImltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dCc7XG5cbmV4cG9ydCBjbGFzcyBEZXNjcmlwdGlvbkJyaWNrIGV4dGVuZHMgVGV4dEJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHRleHQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCwgdGV4dCk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9kZXNjcmlwdGlvbi50cyIsInZhciBnO1xyXG5cclxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcclxuZyA9IChmdW5jdGlvbigpIHtcclxuXHRyZXR1cm4gdGhpcztcclxufSkoKTtcclxuXHJcbnRyeSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXHJcblx0ZyA9IGcgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpIHx8ICgxLGV2YWwpKFwidGhpc1wiKTtcclxufSBjYXRjaChlKSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcclxuXHRpZih0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKVxyXG5cdFx0ZyA9IHdpbmRvdztcclxufVxyXG5cclxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxyXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xyXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGc7XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gNjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogZ2xvYmFsIGpzUERGICovXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgQWxleGFuZGVyIFdlaWR0LFxuICogaHR0cHM6Ly9naXRodWIuY29tL0JpZ2dBOTRcbiAqIFxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2VcbiAqL1xuXG4vKiogXG4qIGpzUERGIEFjcm9Gb3JtIFBsdWdpblxuKiBAbW9kdWxlIEFjcm9Gb3JtXG4qL1xudmFyIGpzcGRmID0gcmVxdWlyZSgnanNwZGYnKTtcbihmdW5jdGlvbiAoanNQREYsIGdsb2JhbE9iaikge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBqc1BERkFQSSA9IGpzUERGLkFQSTtcbiAgICB2YXIgc2NvcGU7XG4gICAgdmFyIHNjYWxlRmFjdG9yID0gMTtcbiAgICBmdW5jdGlvbiB0b1VuaWNvZGUoc3RyKSB7XG4gICAgICAgIHZhciB1bmljb2RlU3RyaW5nID0gJyc7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGhlVW5pY29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgd2hpbGUgKHRoZVVuaWNvZGUubGVuZ3RoIDwgNCkge1xuICAgICAgICAgICAgICAgIHRoZVVuaWNvZGUgPSAnMCcgKyB0aGVVbmljb2RlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHVuaWNvZGVTdHJpbmcgKz0gdGhlVW5pY29kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJzxGRUZGJyArIHVuaWNvZGVTdHJpbmcgKyAnPic7XG4gICAgfVxuICAgIHZhciBwZGZFc2NhcGUgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJykucmVwbGFjZSgvXFwoL2csICdcXFxcKCcpLnJlcGxhY2UoL1xcKS9nLCAnXFxcXCknKSB9O1xuICAgIHZhciBwZGZVbmVzY2FwZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxcXFxcXFwvZywgJ1xcXFwnKS5yZXBsYWNlKC9cXFxcXFwoL2csICcoJykucmVwbGFjZSgvXFxcXFxcKS9nLCAnKScpOyB9O1xuICAgIGZ1bmN0aW9uIGFycmF5VG9QZGZVbmljb2RlQXJyYXkodmFsdWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9ICdbICc7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0b1VuaWNvZGUodmFsdWVbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCArPSAnIF0nXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHZhciBmMiA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlci50b0ZpeGVkKDIpOyAvLyBJZSwgJS4yZlxuICAgIH07XG5cbiAgICB2YXIgZjUgPSBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBudW1iZXIudG9GaXhlZCg1KTsgLy8gSWUsICUuMmZcbiAgICB9O1xuXG4gICAganNQREZBUEkuX19hY3JvZm9ybV9fID0ge307XG4gICAgdmFyIGluaGVyaXQgPSBmdW5jdGlvbiAoY2hpbGQsIHBhcmVudCkge1xuICAgICAgICBjaGlsZC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUpO1xuICAgICAgICBjaGlsZC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjaGlsZDtcbiAgICB9O1xuXG4gICAgdmFyIHNjYWxlID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuICh4ICogc2NhbGVGYWN0b3IpO1xuICAgIH07XG4gICAgdmFyIGFudGlTY2FsZSA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiAoeCAvIHNjYWxlRmFjdG9yKTtcbiAgICB9O1xuXG4gICAgdmFyIGNyZWF0ZUZvcm1YT2JqZWN0ID0gZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgdmFyIHhvYmogPSBuZXcgQWNyb0Zvcm1YT2JqZWN0KCk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIHx8IDA7XG4gICAgICAgIHZhciB3aWR0aCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSB8fCAwO1xuICAgICAgICB4b2JqLkJCb3ggPSBbMCwgMCwgTnVtYmVyKGYyKHdpZHRoKSksIE51bWJlcihmMihoZWlnaHQpKV07XG4gICAgICAgIHJldHVybiB4b2JqO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEJpdC1PcGVyYXRpb25zXG4gICAgKi9cbiAgICB2YXIgc2V0Qml0ID0ganNQREZBUEkuX19hY3JvZm9ybV9fLnNldEJpdCA9IGZ1bmN0aW9uIChudW1iZXIsIGJpdFBvc2l0aW9uKSB7XG4gICAgICAgIG51bWJlciA9IG51bWJlciB8fCAwO1xuICAgICAgICBiaXRQb3NpdGlvbiA9IGJpdFBvc2l0aW9uIHx8IDA7XG5cbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgaXNOYU4oYml0UG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLnNldEJpdCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBiaXRNYXNrID0gMSA8PCBiaXRQb3NpdGlvbjtcblxuICAgICAgICBudW1iZXIgfD0gYml0TWFzaztcblxuICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH07XG5cbiAgICB2YXIgY2xlYXJCaXQgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uY2xlYXJCaXQgPSBmdW5jdGlvbiAobnVtYmVyLCBiaXRQb3NpdGlvbikge1xuICAgICAgICBudW1iZXIgPSBudW1iZXIgfHwgMDtcbiAgICAgICAgYml0UG9zaXRpb24gPSBiaXRQb3NpdGlvbiB8fCAwO1xuXG4gICAgICAgIGlmIChpc05hTihudW1iZXIpIHx8IGlzTmFOKGJpdFBvc2l0aW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuQVBJLl9fYWNyb2Zvcm1fXy5jbGVhckJpdCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBiaXRNYXNrID0gMSA8PCBiaXRQb3NpdGlvbjtcblxuICAgICAgICBudW1iZXIgJj0gfmJpdE1hc2s7XG5cbiAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9O1xuXG4gICAgdmFyIGdldEJpdCA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5nZXRCaXQgPSBmdW5jdGlvbiAobnVtYmVyLCBiaXRQb3NpdGlvbikge1xuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSB8fCBpc05hTihiaXRQb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uZ2V0Qml0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChudW1iZXIgJiAoMSA8PCBiaXRQb3NpdGlvbikpID09PSAwID8gMCA6IDE7XG4gICAgfTtcblxuICAgIC8qXG4gICAgKiBGZiBzdGFydHMgY291bnRpbmcgdGhlIGJpdCBwb3NpdGlvbiBhdCAxIGFuZCBub3QgbGlrZSBqYXZhc2NyaXB0IGF0IDBcbiAgICAqL1xuICAgIHZhciBnZXRCaXRGb3JQZGYgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uZ2V0Qml0Rm9yUGRmID0gZnVuY3Rpb24gKG51bWJlciwgYml0UG9zaXRpb24pIHtcbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgaXNOYU4oYml0UG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLmdldEJpdEZvclBkZicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRCaXQobnVtYmVyLCBiaXRQb3NpdGlvbiAtIDEpO1xuICAgIH07XG5cbiAgICB2YXIgc2V0Qml0Rm9yUGRmID0ganNQREZBUEkuX19hY3JvZm9ybV9fLnNldEJpdEZvclBkZiA9IGZ1bmN0aW9uIChudW1iZXIsIGJpdFBvc2l0aW9uKSB7XG4gICAgICAgIGlmIChpc05hTihudW1iZXIpIHx8IGlzTmFOKGJpdFBvc2l0aW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuQVBJLl9fYWNyb2Zvcm1fXy5zZXRCaXRGb3JQZGYnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2V0Qml0KG51bWJlciwgYml0UG9zaXRpb24gLSAxKTtcbiAgICB9O1xuXG4gICAgdmFyIGNsZWFyQml0Rm9yUGRmID0ganNQREZBUEkuX19hY3JvZm9ybV9fLmNsZWFyQml0Rm9yUGRmID0gZnVuY3Rpb24gKG51bWJlciwgYml0UG9zaXRpb24pIHtcbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgaXNOYU4oYml0UG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLmNsZWFyQml0Rm9yUGRmJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsZWFyQml0KG51bWJlciwgYml0UG9zaXRpb24gLSAxKTtcbiAgICB9O1xuXG4gICAgdmFyIGNhbGN1bGF0ZUNvb3JkaW5hdGVzID0ganNQREZBUEkuX19hY3JvZm9ybV9fLmNhbGN1bGF0ZUNvb3JkaW5hdGVzID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgdmFyIGdldEhvcml6b250YWxDb29yZGluYXRlID0gdGhpcy5pbnRlcm5hbC5nZXRIb3Jpem9udGFsQ29vcmRpbmF0ZTtcbiAgICAgICAgdmFyIGdldFZlcnRpY2FsQ29vcmRpbmF0ZSA9IHRoaXMuaW50ZXJuYWwuZ2V0VmVydGljYWxDb29yZGluYXRlO1xuICAgICAgICB2YXIgeCA9IGFyZ3NbMF07XG4gICAgICAgIHZhciB5ID0gYXJnc1sxXTtcbiAgICAgICAgdmFyIHcgPSBhcmdzWzJdO1xuICAgICAgICB2YXIgaCA9IGFyZ3NbM107XG5cbiAgICAgICAgdmFyIGNvb3JkaW5hdGVzID0ge307XG5cbiAgICAgICAgY29vcmRpbmF0ZXMubG93ZXJMZWZ0X1ggPSBnZXRIb3Jpem9udGFsQ29vcmRpbmF0ZSh4KSB8fCAwO1xuICAgICAgICBjb29yZGluYXRlcy5sb3dlckxlZnRfWSA9IGdldFZlcnRpY2FsQ29vcmRpbmF0ZSh5ICsgaCkgfHwgMDtcbiAgICAgICAgY29vcmRpbmF0ZXMudXBwZXJSaWdodF9YID0gZ2V0SG9yaXpvbnRhbENvb3JkaW5hdGUoeCArIHcpIHx8IDA7XG4gICAgICAgIGNvb3JkaW5hdGVzLnVwcGVyUmlnaHRfWSA9IGdldFZlcnRpY2FsQ29vcmRpbmF0ZSh5KSB8fCAwO1xuXG4gICAgICAgIHJldHVybiBbTnVtYmVyKGYyKGNvb3JkaW5hdGVzLmxvd2VyTGVmdF9YKSksIE51bWJlcihmMihjb29yZGluYXRlcy5sb3dlckxlZnRfWSkpLCBOdW1iZXIoZjIoY29vcmRpbmF0ZXMudXBwZXJSaWdodF9YKSksIE51bWJlcihmMihjb29yZGluYXRlcy51cHBlclJpZ2h0X1kpKV07XG4gICAgfTtcblxuICAgIHZhciBjYWxjdWxhdGVBcHBlYXJhbmNlU3RyZWFtID0gZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgaWYgKGZvcm1PYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtT2JqZWN0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmb3JtT2JqZWN0LlYgJiYgIWZvcm1PYmplY3QuRFYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVsc2UgY2FsY3VsYXRlIGl0XG5cbiAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICB2YXIgdGV4dCA9IGZvcm1PYmplY3QuViB8fCBmb3JtT2JqZWN0LkRWO1xuICAgICAgICB2YXIgY2FsY1JlcyA9IGNhbGN1bGF0ZVgoZm9ybU9iamVjdCwgdGV4dCk7XG4gICAgICAgIHZhciBmb250S2V5ID0gc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udChmb3JtT2JqZWN0LmZvbnROYW1lLCBmb3JtT2JqZWN0LmZvbnRTdHlsZSkuaWQ7XG5cbiAgICAgICAgLy9QREYgMzIwMDAtMToyMDA4LCBwYWdlIDQ0NFxuICAgICAgICBzdHJlYW0ucHVzaCgnL1R4IEJNQycpO1xuICAgICAgICBzdHJlYW0ucHVzaCgncScpO1xuICAgICAgICBzdHJlYW0ucHVzaCgnQlQnKTsgLy8gQmVnaW4gVGV4dFxuICAgICAgICBzdHJlYW0ucHVzaChzY29wZS5fX3ByaXZhdGVfXy5lbmNvZGVDb2xvclN0cmluZyhmb3JtT2JqZWN0LmNvbG9yKSk7XG4gICAgICAgIHN0cmVhbS5wdXNoKCcvJyArIGZvbnRLZXkgKyAnICcgKyBmMihjYWxjUmVzLmZvbnRTaXplKSArICcgVGYnKTtcbiAgICAgICAgc3RyZWFtLnB1c2goJzEgMCAwIDEgMCAwIFRtJyk7Ly8gVHJhbnNmb3JtYXRpb24gTWF0cml4XG4gICAgICAgIHN0cmVhbS5wdXNoKGNhbGNSZXMudGV4dCk7XG4gICAgICAgIHN0cmVhbS5wdXNoKCdFVCcpOyAvLyBFbmQgVGV4dCAgICBcbiAgICAgICAgc3RyZWFtLnB1c2goJ1EnKTtcbiAgICAgICAgc3RyZWFtLnB1c2goJ0VNQycpO1xuXG4gICAgICAgIHZhciBhcHBlYXJhbmNlU3RyZWFtQ29udGVudCA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQuc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgIHJldHVybiBhcHBlYXJhbmNlU3RyZWFtQ29udGVudDtcbiAgICB9O1xuXG4gICAgdmFyIGNhbGN1bGF0ZVggPSBmdW5jdGlvbiAoZm9ybU9iamVjdCwgdGV4dCkge1xuICAgICAgICBpZiAoZm9ybU9iamVjdC5pc1VuaWNvZGUpIHRleHQgPSBmb3JtT2JqZWN0LnRydWVWYWx1ZTtcbiAgICAgICAgIHZhciBtYXhGb250U2l6ZSA9XG4gICAgICAgICAgICBmb3JtT2JqZWN0LmZvbnRTaXplID09PSAwID8gZm9ybU9iamVjdC5tYXhGb250U2l6ZSA6IGZvcm1PYmplY3QuZm9udFNpemU7XG4gICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IHtcbiAgICAgICAgICAgIHRleHQ6IFwiXCIsXG4gICAgICAgICAgICBmb250U2l6ZTogXCJcIlxuICAgICAgICB9O1xuICAgICAgICAvLyBSZW1vdmUgQnJhY2tldHNcbiAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyKDAsIDEpID09IFwiKFwiID8gdGV4dC5zdWJzdHIoMSkgOiB0ZXh0O1xuICAgICAgICB0ZXh0ID1cbiAgICAgICAgICAgIHRleHQuc3Vic3RyKHRleHQubGVuZ3RoIC0gMSkgPT0gXCIpXCJcbiAgICAgICAgICAgID8gdGV4dC5zdWJzdHIoMCwgdGV4dC5sZW5ndGggLSAxKVxuICAgICAgICAgICAgOiB0ZXh0O1xuICAgICAgICAvLyBzcGxpdCBpbnRvIGFycmF5IG9mIHdvcmRzXG4gICAgICAgIHZhciB0ZXh0U3BsaXQgPSB0ZXh0LnNwbGl0KFwiIFwiKTtcbiAgICAgICAgdGV4dFNwbGl0ID0gdGV4dFNwbGl0Lm1hcChmdW5jdGlvbiAod29yZCkge1xuICAgICAgICAgICAgcmV0dXJuIHdvcmQuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWZvcm1PYmplY3QubXVsdGlsaW5lKSB7XG4gICAgICAgICAgICB0ZXh0U3BsaXQgPSB0ZXh0U3BsaXQubWFwKGZ1bmN0aW9uIChhcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2Fyci5qb2luKFwiIFwiKV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZvbnRTaXplID0gbWF4Rm9udFNpemU7IC8vIFRoZSBTdGFydGluZyBmb250U2l6ZSAoVGhlIE1heGltdW0pXG4gICAgICAgIHZhciBsaW5lU3BhY2luZyA9IDI7XG4gICAgICAgIHZhciBib3JkZXJQYWRkaW5nID0gMjtcblxuICAgICAgICB2YXIgaGVpZ2h0ID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSB8fCAwO1xuICAgICAgICBoZWlnaHQgPSBoZWlnaHQgPCAwID8gLWhlaWdodCA6IGhlaWdodDtcbiAgICAgICAgdmFyIHdpZHRoID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIHx8IDA7XG4gICAgICAgIHdpZHRoID0gd2lkdGggPCAwID8gLXdpZHRoIDogd2lkdGg7XG5cbiAgICAgICAgdmFyIGlzU21hbGxlclRoYW5XaWR0aCA9IGZ1bmN0aW9uKGksIGxhc3RMaW5lLCBmb250U2l6ZSkge1xuICAgICAgICAgICAgaWYgKGkgKyAxIDwgdGV4dFNwbGl0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIHRtcCA9IGxhc3RMaW5lICsgXCIgXCIgKyB0ZXh0U3BsaXRbaSArIDFdWzBdO1xuICAgICAgICAgICAgdmFyIFRleHRXaWR0aCA9IGNhbGN1bGF0ZUZvbnRTcGFjZSh0bXAsIGZvcm1PYmplY3QsIGZvbnRTaXplKS53aWR0aDtcbiAgICAgICAgICAgIHZhciBGaWVsZFdpZHRoID0gd2lkdGggLSAyICogYm9yZGVyUGFkZGluZztcbiAgICAgICAgICAgIHJldHVybiBUZXh0V2lkdGggPD0gRmllbGRXaWR0aDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9udFNpemUrKztcbiAgICAgICAgRm9udFNpemU6IHdoaWxlIChmb250U2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgZm9udFNpemUtLTtcbiAgICAgICAgICAgIHZhciB0ZXh0SGVpZ2h0ID0gY2FsY3VsYXRlRm9udFNwYWNlKFwiM1wiLCBmb3JtT2JqZWN0LCBmb250U2l6ZSkuaGVpZ2h0O1xuICAgICAgICAgICAgdmFyIHN0YXJ0WSA9IGZvcm1PYmplY3QubXVsdGlsaW5lXG4gICAgICAgICAgICA/IGhlaWdodCAtIGZvbnRTaXplXG4gICAgICAgICAgICA6IChoZWlnaHQgLSB0ZXh0SGVpZ2h0KSAvIDI7XG4gICAgICAgICAgICBzdGFydFkgKz0gbGluZVNwYWNpbmc7XG4gICAgICAgICAgICB2YXIgc3RhcnRYO1xuXG4gICAgICAgICAgICB2YXIgbGFzdFkgPSBzdGFydFk7XG4gICAgICAgICAgICB2YXIgZmlyc3RXb3JkSW5MaW5lID0gMCxcbiAgICAgICAgICAgIGxhc3RXb3JkSW5MaW5lID0gMDtcbiAgICAgICAgICAgIHZhciBsYXN0TGVuZ3RoO1xuICAgICAgICAgICAgdmFyIGN1cnJXb3JkID0gMDtcblxuICAgICAgICAgICAgaWYgKGZvbnRTaXplIDw9IDApIHtcbiAgICAgICAgICAgIC8vIEluIGNhc2UsIHRoZSBUZXh0IGRvZXNuJ3QgZml0IGF0IGFsbFxuICAgICAgICAgICAgZm9udFNpemUgPSAxMjtcbiAgICAgICAgICAgIHRleHQgPSBcIiguLi4pIFRqXFxuXCI7XG4gICAgICAgICAgICB0ZXh0ICs9XG4gICAgICAgICAgICAgICAgXCIlIFdpZHRoIG9mIFRleHQ6IFwiICtcbiAgICAgICAgICAgICAgICBjYWxjdWxhdGVGb250U3BhY2UodGV4dCwgZm9ybU9iamVjdCwgZm9udFNpemUpLndpZHRoICtcbiAgICAgICAgICAgICAgICBcIiwgRmllbGRXaWR0aDpcIiArXG4gICAgICAgICAgICAgICAgd2lkdGggK1xuICAgICAgICAgICAgICAgIFwiXFxuXCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGxhc3RMaW5lID0gXCJcIjtcbiAgICAgICAgICAgIHZhciBsaW5lQ291bnQgPSAwO1xuICAgICAgICAgICAgTGluZTogZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0U3BsaXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0ZXh0U3BsaXQuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgaXNXaXRoTmV3TGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0U3BsaXRbaV0ubGVuZ3RoICE9PSAxICYmIGN1cnJXb3JkICE9PSB0ZXh0U3BsaXRbaV0ubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgKHRleHRIZWlnaHQgKyBsaW5lU3BhY2luZykgKiAobGluZUNvdW50ICsgMikgKyBsaW5lU3BhY2luZyA+XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBGb250U2l6ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsYXN0TGluZSArPSB0ZXh0U3BsaXRbaV1bY3VycldvcmRdO1xuICAgICAgICAgICAgICAgIGlzV2l0aE5ld0xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxhc3RXb3JkSW5MaW5lID0gaTtcbiAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsYXN0TGluZSArPSB0ZXh0U3BsaXRbaV1bY3VycldvcmRdICsgXCIgXCI7XG4gICAgICAgICAgICAgICAgbGFzdExpbmUgPVxuICAgICAgICAgICAgICAgICAgICBsYXN0TGluZS5zdWJzdHIobGFzdExpbmUubGVuZ3RoIC0gMSkgPT0gXCIgXCJcbiAgICAgICAgICAgICAgICAgICAgPyBsYXN0TGluZS5zdWJzdHIoMCwgbGFzdExpbmUubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgOiBsYXN0TGluZTtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gcGFyc2VJbnQoaSk7XG4gICAgICAgICAgICAgICAgdmFyIG5leHRMaW5lSXNTbWFsbGVyID0gaXNTbWFsbGVyVGhhbldpZHRoKGtleSwgbGFzdExpbmUsIGZvbnRTaXplKTtcbiAgICAgICAgICAgICAgICB2YXIgaXNMYXN0V29yZCA9IGkgPj0gdGV4dFNwbGl0Lmxlbmd0aCAtIDE7XG5cbiAgICAgICAgICAgICAgICBpZiAobmV4dExpbmVJc1NtYWxsZXIgJiYgIWlzTGFzdFdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdExpbmUgKz0gXCIgXCI7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJXb3JkID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIExpbmVcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFuZXh0TGluZUlzU21hbGxlciAmJiAhaXNMYXN0V29yZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZvcm1PYmplY3QubXVsdGlsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIEZvbnRTaXplO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAodGV4dEhlaWdodCArIGxpbmVTcGFjaW5nKSAqIChsaW5lQ291bnQgKyAyKSArIGxpbmVTcGFjaW5nID5cbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBUZXh0IGlzIGhpZ2hlciB0aGFuIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmllbGRPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIEZvbnRTaXplO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxhc3RXb3JkSW5MaW5lID0ga2V5O1xuICAgICAgICAgICAgICAgICAgICAvLyBnbyBvblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0xhc3RXb3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RXb3JkSW5MaW5lID0ga2V5O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgZm9ybU9iamVjdC5tdWx0aWxpbmUgJiZcbiAgICAgICAgICAgICAgICAgICAgKHRleHRIZWlnaHQgKyBsaW5lU3BhY2luZykgKiAobGluZUNvdW50ICsgMikgKyBsaW5lU3BhY2luZyA+XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBUZXh0IGlzIGhpZ2hlciB0aGFuIHRoZSBGaWVsZE9iamVjdFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBGb250U2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGxhc3QgYmxhbmtcblxuICAgICAgICAgICAgICAgIHZhciBsaW5lID0gXCJcIjtcblxuICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSBmaXJzdFdvcmRJbkxpbmU7IHggPD0gbGFzdFdvcmRJbkxpbmU7IHgrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY3VyckxpbmUgPSB0ZXh0U3BsaXRbeF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtT2JqZWN0Lm11bHRpbGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPT09IGxhc3RXb3JkSW5MaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lICs9IGN1cnJMaW5lW2N1cnJXb3JkXSArIFwiIFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycldvcmQgPSAoY3VycldvcmQgKyAxKSAlIGN1cnJMaW5lLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPT09IGZpcnN0V29yZEluTGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZSArPSBjdXJyTGluZVtjdXJyTGluZS5sZW5ndGggLSAxXSArIFwiIFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGluZSArPSBjdXJyTGluZVswXSArIFwiIFwiO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBsYXN0IGJsYW5rXG4gICAgICAgICAgICAgICAgbGluZSA9XG4gICAgICAgICAgICAgICAgbGluZS5zdWJzdHIobGluZS5sZW5ndGggLSAxKSA9PSBcIiBcIlxuICAgICAgICAgICAgICAgICAgICA/IGxpbmUuc3Vic3RyKDAsIGxpbmUubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgOiBsaW5lO1xuICAgICAgICAgICAgICAgIC8vIGxhc3RMZW5ndGggLT0gYmxhbmtTcGFjZS53aWR0aDtcbiAgICAgICAgICAgICAgICBsYXN0TGVuZ3RoID0gY2FsY3VsYXRlRm9udFNwYWNlKGxpbmUsIGZvcm1PYmplY3QsIGZvbnRTaXplKS53aWR0aDtcblxuICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBzdGFydFhcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvcm1PYmplY3QudGV4dEFsaWduKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInJpZ2h0XCI6XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0WCA9IHdpZHRoIC0gbGFzdExlbmd0aCAtIGJvcmRlclBhZGRpbmc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjZW50ZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRYID0gKHdpZHRoIC0gbGFzdExlbmd0aCkgLyAyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibGVmdFwiOlxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0WCA9IGJvcmRlclBhZGRpbmc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0ZXh0ICs9IGYyKHN0YXJ0WCkgKyBcIiBcIiArIGYyKGxhc3RZKSArIFwiIFRkXFxuXCI7XG5cbiAgICAgICAgICAgICAgICBpZiAoZm9ybU9iamVjdC5pc1VuaWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZvbnRMaXN0ID0ge307XG4gICAgICAgICAgICAgICAgICAgIGZvbnRMaXN0W3Njb3BlLmludGVybmFsLmdldEZvbnQoKS5pZF0gPSBzY29wZS5pbnRlcm5hbC5nZXRGb250KCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogbGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmc6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRleDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkVzY2FwZTogcGRmRXNjYXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUZvbnRLZXk6IHNjb3BlLmludGVybmFsLmdldEZvbnQoKS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250czogZm9udExpc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRm9udFNpemU6IGZvcm1PYmplY3QuZm9udFNpemVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuZXZlbnRzLnB1Ymxpc2goJ3Bvc3RQcm9jZXNzVGV4dCcsIHBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICc8JyArIHBheWxvYWQudGV4dCArICc+IFRqXFxuJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gJygnICsgcGRmRXNjYXBlKGxpbmUpICsgJykgVGpcXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyByZXNldCBYIGluIFBERlxuICAgICAgICAgICAgICAgIHRleHQgKz0gLWYyKHN0YXJ0WCkgKyBcIiAwIFRkXFxuXCI7XG5cbiAgICAgICAgICAgICAgICAvLyBBZnRlciBhIExpbmUsIGFkanVzdCB5IHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgbGFzdFkgPSAtKGZvbnRTaXplICsgbGluZVNwYWNpbmcpO1xuXG4gICAgICAgICAgICAgICAgLy8gUmVzZXQgZm9yIG5leHQgaXRlcmF0aW9uIHN0ZXBcbiAgICAgICAgICAgICAgICBsYXN0TGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICBmaXJzdFdvcmRJbkxpbmUgPSBpc1dpdGhOZXdMaW5lID8gbGFzdFdvcmRJbkxpbmUgOiBsYXN0V29yZEluTGluZSArIDE7XG4gICAgICAgICAgICAgICAgbGluZUNvdW50Kys7XG5cbiAgICAgICAgICAgICAgICBsYXN0TGluZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgY29udGludWUgTGluZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuVmFsdWUudGV4dCA9IHRleHQ7XG4gICAgICAgIHJldHVyblZhbHVlLmZvbnRTaXplID0gZm9udFNpemU7XG5cbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIFNtYWxsIHdvcmthcm91bmQgZm9yIGNhbGN1bGF0aW5nIHRoZSBUZXh0TWV0cmljIGFwcHJveGltYXRlbHkuXG4gICAgKiBcbiAgICAqIEBwYXJhbSB0ZXh0XG4gICAgKiBAcGFyYW0gZm9udHNpemVcbiAgICAqIEByZXR1cm5zIHtUZXh0TWV0cmljc30gKEhhcyBIZWlnaHQgYW5kIFdpZHRoKVxuICAgICovXG4gICAgdmFyIGNhbGN1bGF0ZUZvbnRTcGFjZSA9IGZ1bmN0aW9uICh0ZXh0LCBmb3JtT2JqZWN0LCBmb250U2l6ZSkge1xuICAgICAgICB2YXIgZm9udCA9IHNjb3BlLmludGVybmFsLmdldEZvbnQoZm9ybU9iamVjdC5mb250TmFtZSwgZm9ybU9iamVjdC5mb250U3R5bGUpO1xuICAgICAgICB2YXIgd2lkdGggPSBzY29wZS5nZXRTdHJpbmdVbml0V2lkdGgodGV4dCwgeyBmb250OiBmb250LCBmb250U2l6ZTogcGFyc2VGbG9hdChmb250U2l6ZSksIGNoYXJTcGFjZTogMCB9KSAqIHBhcnNlRmxvYXQoZm9udFNpemUpO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gc2NvcGUuZ2V0U3RyaW5nVW5pdFdpZHRoKFwiM1wiLCB7IGZvbnQ6IGZvbnQsIGZvbnRTaXplOiBwYXJzZUZsb2F0KGZvbnRTaXplKSwgY2hhclNwYWNlOiAwIH0pICogcGFyc2VGbG9hdChmb250U2l6ZSkgKiAxLjU7XG4gICAgICAgIHJldHVybiB7IGhlaWdodDogaGVpZ2h0LCB3aWR0aDogd2lkdGggfTtcbiAgICB9O1xuXG4gICAgdmFyIGFjcm9mb3JtUGx1Z2luVGVtcGxhdGUgPSB7XG4gICAgICAgIGZpZWxkczogW10sXG4gICAgICAgIHhGb3JtczogW10sXG4gICAgICAgIC8qKlxuICAgICAgICAqIGFjcm9Gb3JtRGljdGlvbmFyeVJvb3QgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEFjcm9Gb3JtXG4gICAgICAgICogRGljdGlvbmFyeSAwOiBUaGUgRXZlbnQtVG9rZW4sIHRoZSBBY3JvRm9ybURpY3Rpb25hcnlDYWxsYmFjayBoYXNcbiAgICAgICAgKiAxOiBUaGUgT2JqZWN0IElEIG9mIHRoZSBSb290XG4gICAgICAgICovXG4gICAgICAgIGFjcm9Gb3JtRGljdGlvbmFyeVJvb3Q6IG51bGwsXG4gICAgICAgIC8qKlxuICAgICAgICAqIEFmdGVyIHRoZSBQREYgZ2V0cyBldmFsdWF0ZWQsIHRoZSByZWZlcmVuY2UgdG8gdGhlIHJvb3QgaGFzIHRvIGJlXG4gICAgICAgICogcmVzZXQsIHRoaXMgaW5kaWNhdGVzLCB3aGV0aGVyIHRoZSByb290IGhhcyBhbHJlYWR5IGJlZW4gcHJpbnRlZFxuICAgICAgICAqIG91dFxuICAgICAgICAqL1xuICAgICAgICBwcmludGVkT3V0OiBmYWxzZSxcbiAgICAgICAgaW50ZXJuYWw6IG51bGwsXG4gICAgICAgIGlzSW5pdGlhbGl6ZWQ6IGZhbHNlXG4gICAgfTtcblxuICAgIHZhciBhbm5vdFJlZmVyZW5jZUNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvL3NldCBvYmpJZCB0byB1bmRlZmluZWQgYW5kIGZvcmNlIGl0IHRvIGdldCBhIG5ldyBvYmpJZCBvbiBidWlsZERvY3VtZW50XG4gICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3Qub2JqSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBmaWVsZHMgPSBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290LkZpZWxkcztcbiAgICAgICAgZm9yICh2YXIgaSBpbiBmaWVsZHMpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZHMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZm9ybU9iamVjdCA9IGZpZWxkc1tpXTtcbiAgICAgICAgICAgICAgICAvL3NldCBvYmpJZCB0byB1bmRlZmluZWQgYW5kIGZvcmNlIGl0IHRvIGdldCBhIG5ldyBvYmpJZCBvbiBidWlsZERvY3VtZW50XG4gICAgICAgICAgICAgICAgZm9ybU9iamVjdC5vYmpJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAvLyBhZGQgQW5ub3QgUmVmZXJlbmNlIVxuICAgICAgICAgICAgICAgIGlmIChmb3JtT2JqZWN0Lmhhc0Fubm90YXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmVzIGFuIEFubm90YXRpb24gV2lkZ2V0IGluIHRoZSBGb3JtIE9iamVjdCwgcHV0IHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBSZWZlcmVuY2UgaW4gdGhlIC9Bbm5vdCBhcnJheVxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVBbm5vdGF0aW9uUmVmZXJlbmNlLmNhbGwoc2NvcGUsIGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgcHV0Rm9ybSA9IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgIGlmIChzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5wcmludGVkT3V0KSB7XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5wcmludGVkT3V0ID0gZmFsc2U7XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QpIHtcbiAgICAgICAgICAgIGluaXRpYWxpemVBY3JvRm9ybS5jYWxsKHNjb3BlKTtcbiAgICAgICAgfVxuICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290LkZpZWxkcy5wdXNoKGZvcm1PYmplY3QpO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBDcmVhdGUgdGhlIFJlZmVyZW5jZSB0byB0aGUgd2lkZ2V0QW5ub3RhdGlvbiwgc28gdGhhdCBpdCBnZXRzIHJlZmVyZW5jZWRcbiAgICAqIGluIHRoZSBBbm5vdFtdIGludCB0aGUrIChSZXF1aXJlcyB0aGUgQW5ub3RhdGlvbiBQbHVnaW4pXG4gICAgKi9cbiAgICB2YXIgY3JlYXRlQW5ub3RhdGlvblJlZmVyZW5jZSA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICB0eXBlOiAncmVmZXJlbmNlJyxcbiAgICAgICAgICAgIG9iamVjdDogb2JqZWN0XG4gICAgICAgIH07XG4gICAgICAgIHZhciBmaW5kRW50cnkgPSBmdW5jdGlvbiAoZW50cnkpIHsgcmV0dXJuIChlbnRyeS50eXBlID09PSBvcHRpb25zLnR5cGUgJiYgZW50cnkub2JqZWN0ID09PSBvcHRpb25zLm9iamVjdCk7IH07XG4gICAgICAgIGlmIChzY29wZS5pbnRlcm5hbC5nZXRQYWdlSW5mbyhvYmplY3QucGFnZSkucGFnZUNvbnRleHQuYW5ub3RhdGlvbnMuZmluZChmaW5kRW50cnkpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmdldFBhZ2VJbmZvKG9iamVjdC5wYWdlKS5wYWdlQ29udGV4dC5hbm5vdGF0aW9ucy5wdXNoKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIENhbGxiYWNrc1xuXG4gICAgdmFyIHB1dENhdGFsb2dDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gUHV0IHJlZmVyZW5jZSB0byBBY3JvRm9ybSB0byBEb2N1bWVudENhdGFsb2dcbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290ICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAvLyBmb3Igc2FmZXR5LCBzaG91bGRuJ3Qgbm9ybWFsbHkgYmUgdGhlIGNhc2VcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLndyaXRlKCcvQWNyb0Zvcm0gJyArIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3Qub2JqSWQgKyAnICcgKyAwICsgJyBSJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3B1dENhdGFsb2dDYWxsYmFjazogUm9vdCBtaXNzaW5nLicpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQWRkcyAvQWNyb2Zvcm0gWCAwIFIgdG8gRG9jdW1lbnQgQ2F0YWxvZywgYW5kIGNyZWF0ZXMgdGhlIEFjcm9Gb3JtXG4gICAgKiBEaWN0aW9uYXJ5XG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1EaWN0aW9uYXJ5Q2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFJlbW92ZSBldmVudFxuICAgICAgICBzY29wZS5pbnRlcm5hbC5ldmVudHMudW5zdWJzY3JpYmUoc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5fZXZlbnRJRCk7XG4gICAgICAgIGRlbGV0ZSBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290Ll9ldmVudElEO1xuICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5wcmludGVkT3V0ID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBDcmVhdGVzIHRoZSBzaW5nbGUgRmllbGRzIGFuZCB3cml0ZXMgdGhlbSBpbnRvIHRoZSBEb2N1bWVudFxuICAgICogXG4gICAgKiBJZiBmaWVsZEFycmF5IGlzIHNldCwgdXNlIHRoZSBmaWVsZHMgdGhhdCBhcmUgaW5zaWRlIGl0IGluc3RlYWQgb2YgdGhlXG4gICAgKiBmaWVsZHMgZnJvbSB0aGUgQWNyb1Jvb3QgKGZvciB0aGUgRm9ybVhPYmplY3RzLi4uKVxuICAgICovXG4gICAgdmFyIGNyZWF0ZUZpZWxkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZmllbGRBcnJheSkge1xuICAgICAgICB2YXIgc3RhbmRhcmRGaWVsZHMgPSAoIWZpZWxkQXJyYXkpO1xuXG4gICAgICAgIGlmICghZmllbGRBcnJheSkge1xuICAgICAgICAgICAgLy8gaW4gY2FzZSB0aGVyZSBpcyBubyBmaWVsZEFycmF5IHNwZWNpZmllZCwgd2Ugd2FudCB0byBwcmludCBvdXRcbiAgICAgICAgICAgIC8vIHRoZSBGaWVsZHMgb2YgdGhlIEFjcm9Gb3JtXG4gICAgICAgICAgICAvLyBQcmludCBvdXQgUm9vdFxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwubmV3T2JqZWN0RGVmZXJyZWRCZWdpbihzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290Lm9iaklkLCB0cnVlKTtcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QucHV0U3RyZWFtKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmaWVsZEFycmF5ID0gZmllbGRBcnJheSB8fCBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290LktpZHM7XG5cbiAgICAgICAgZm9yICh2YXIgaSBpbiBmaWVsZEFycmF5KSB7XG4gICAgICAgICAgICBpZiAoZmllbGRBcnJheS5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgIHZhciBmaWVsZE9iamVjdCA9IGZpZWxkQXJyYXlbaV07XG4gICAgICAgICAgICAgICAgdmFyIGtleVZhbHVlTGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBvbGRSZWN0ID0gZmllbGRPYmplY3QuUmVjdDtcblxuICAgICAgICAgICAgICAgIGlmIChmaWVsZE9iamVjdC5SZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkT2JqZWN0LlJlY3QgPSBjYWxjdWxhdGVDb29yZGluYXRlcy5jYWxsKHRoaXMsIGZpZWxkT2JqZWN0LlJlY3QpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IFdyaXRpbmcgdGhlIE9iamVjdFxuICAgICAgICAgICAgICAgIHNjb3BlLmludGVybmFsLm5ld09iamVjdERlZmVycmVkQmVnaW4oZmllbGRPYmplY3Qub2JqSWQsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgZmllbGRPYmplY3QuREEgPSBBY3JvRm9ybUFwcGVhcmFuY2UuY3JlYXRlRGVmYXVsdEFwcGVhcmFuY2VTdHJlYW0oZmllbGRPYmplY3QpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZE9iamVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgZmllbGRPYmplY3QuZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVMaXN0ID0gZmllbGRPYmplY3QuZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZmllbGRPYmplY3QuUmVjdCA9IG9sZFJlY3Q7XG5cbiAgICAgICAgICAgICAgICBpZiAoZmllbGRPYmplY3QuaGFzQXBwZWFyYW5jZVN0cmVhbSAmJiAhZmllbGRPYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIEFwcGVhcmFuY2VcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFwcGVhcmFuY2UgPSBjYWxjdWxhdGVBcHBlYXJhbmNlU3RyZWFtLmNhbGwodGhpcywgZmllbGRPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QucHVzaCh7IGtleTogJ0FQJywgdmFsdWU6IFwiPDwvTiBcIiArIGFwcGVhcmFuY2UgKyBcIj4+XCIgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zLnB1c2goYXBwZWFyYW5jZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQXNzdW1lIEFwcGVhcmFuY2VTdHJlYW1Db250ZW50IGlzIGEgQXJyYXkgd2l0aCBOLFIsRCAoYXQgbGVhc3RcbiAgICAgICAgICAgICAgICAvLyBvbmUgb2YgdGhlbSEpXG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkT2JqZWN0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIE4sUiBhbmQgRFxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGZpZWxkT2JqZWN0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRPYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQuaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBmaWVsZE9iamVjdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudFtrXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nICs9IChcIi9cIiArIGsgKyBcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyArPSBcIjw8XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPj0gMSB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXJhbmNlU3RyZWFtIGlzIGFuIEFycmF5IG9yIE9iamVjdCFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IHZhbHVlW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIEZ1bmN0aW9uIGlzIHJlZmVyZW5jZWQsIGNhbGwgaXQgaW4gb3JkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gZ2V0IHRoZSBGb3JtWE9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmogPSBvYmouY2FsbCh0aGlzLCBmaWVsZE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1TdHJpbmcgKz0gKFwiL1wiICsgaSArIFwiIFwiICsgb2JqICsgXCIgXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSB0aGUgWEZvcm0gaXMgYWxyZWFkeSB1c2VkLCBlLmcuIE9mZlN0YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgQ2hlY2tCb3hlcywgZG9uJ3QgYWRkIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zLmluZGV4T2Yob2JqKSA+PSAwKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zLnB1c2gob2JqKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBGdW5jdGlvbiBpcyByZWZlcmVuY2VkLCBjYWxsIGl0IGluIG9yZGVyIHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIEZvcm1YT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmogPSBvYmouY2FsbCh0aGlzLCBmaWVsZE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyArPSAoXCIvXCIgKyBpICsgXCIgXCIgKyBvYmopO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMuaW5kZXhPZihvYmopID49IDApKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zLnB1c2gob2JqKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyArPSBcIj4+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXJhbmNlIHN0cmVhbSBpcyBhIG5vcm1hbCBPYmplY3QuLlxuICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QucHVzaCh7IGtleTogJ0FQJywgdmFsdWU6IFwiPDxcXG5cIiArIGFwcGVhcmFuY2VTdHJlYW1TdHJpbmcgKyBcIj4+XCIgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwucHV0U3RyZWFtKHsgYWRkaXRpb25hbEtleVZhbHVlczoga2V5VmFsdWVMaXN0IH0pO1xuXG4gICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwub3V0KFwiZW5kb2JqXCIpO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YW5kYXJkRmllbGRzKSB7XG4gICAgICAgICAgICBjcmVhdGVYRm9ybU9iamVjdENhbGxiYWNrLmNhbGwodGhpcywgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgY3JlYXRlWEZvcm1PYmplY3RDYWxsYmFjayA9IGZ1bmN0aW9uIChmaWVsZEFycmF5KSB7XG4gICAgICAgIGZvciAodmFyIGkgaW4gZmllbGRBcnJheSkge1xuICAgICAgICAgICAgaWYgKGZpZWxkQXJyYXkuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gaTtcbiAgICAgICAgICAgICAgICB2YXIgZmllbGRPYmplY3QgPSBmaWVsZEFycmF5W2ldO1xuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IFdyaXRpbmcgdGhlIE9iamVjdFxuICAgICAgICAgICAgICAgIHNjb3BlLmludGVybmFsLm5ld09iamVjdERlZmVycmVkQmVnaW4oZmllbGRPYmplY3QgJiYgZmllbGRPYmplY3Qub2JqSWQsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZE9iamVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgZmllbGRPYmplY3QucHV0U3RyZWFtID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRPYmplY3QucHV0U3RyZWFtKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBmaWVsZEFycmF5W2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIGluaXRpYWxpemVBY3JvRm9ybSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWwgIT09IHVuZGVmaW5lZCAmJiAodGhpcy5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbiA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uaXNJbml0aWFsaXplZCA9PT0gZmFsc2UpKSB7XG5cbiAgICAgICAgICAgIHNjb3BlID0gdGhpcztcblxuICAgICAgICAgICAgQWNyb0Zvcm1GaWVsZC5GaWVsZE51bSA9IDA7XG4gICAgICAgICAgICB0aGlzLmludGVybmFsLmFjcm9mb3JtUGx1Z2luID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShhY3JvZm9ybVBsdWdpblRlbXBsYXRlKSk7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhjZXB0aW9uIHdoaWxlIGNyZWF0aW5nIEFjcm9mb3JtRGljdGlvbmFyeVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjYWxlRmFjdG9yID0gc2NvcGUuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgICAgICAvLyBUaGUgT2JqZWN0IE51bWJlciBvZiB0aGUgQWNyb0Zvcm0gRGljdGlvbmFyeVxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdCA9IG5ldyBBY3JvRm9ybURpY3Rpb25hcnkoKTtcblxuICAgICAgICAgICAgLy8gYWRkIENhbGxiYWNrIGZvciBjcmVhdGluZyB0aGUgQWNyb0Zvcm0gRGljdGlvbmFyeVxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5fZXZlbnRJRCA9IHNjb3BlLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ3Bvc3RQdXRSZXNvdXJjZXMnLCBBY3JvRm9ybURpY3Rpb25hcnlDYWxsYmFjayk7XG5cbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ2J1aWxkRG9jdW1lbnQnLCBhbm5vdFJlZmVyZW5jZUNhbGxiYWNrKTsgLy8gYnVpbGREb2N1bWVudFxuXG4gICAgICAgICAgICAvLyBSZWdpc3RlciBldmVudCwgdGhhdCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgRG9jdW1lbnRDYXRhbG9nIGlzXG4gICAgICAgICAgICAvLyB3cml0dGVuLCBpbiBvcmRlciB0byBhZGQgL0Fjcm9Gb3JtXG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdwdXRDYXRhbG9nJywgcHV0Q2F0YWxvZ0NhbGxiYWNrKTtcblxuICAgICAgICAgICAgLy8gUmVnaXN0ZXIgZXZlbnQsIHRoYXQgY3JlYXRlcyBhbGwgRmllbGRzXG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdwb3N0UHV0UGFnZXMnLCBjcmVhdGVGaWVsZENhbGxiYWNrKTtcblxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy9QREYgMzIwMDAtMToyMDA4LCBwYWdlIDI2LCA3LjMuNlxuICAgIHZhciBhcnJheVRvUGRmQXJyYXkgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uYXJyYXlUb1BkZkFycmF5ID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFycmF5KSkge1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSAnWyc7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSAnICc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIGFycmF5W2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBhcnJheVtpXS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlbaV0uc3Vic3RyKDAsIDEpICE9PSAnLycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9ICcoJyArIHBkZkVzY2FwZShhcnJheVtpXS50b1N0cmluZygpKSArICcpJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBhcnJheVtpXS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGVudCArPSAnXSc7XG4gICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLl9fYWNyb2Zvcm1fXy5hcnJheVRvUGRmQXJyYXknKTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGdldE1hdGNoZXMoc3RyaW5nLCByZWdleCwgaW5kZXgpIHtcbiAgICAgICAgaW5kZXggfHwgKGluZGV4ID0gMSk7IC8vIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGNhcHR1cmluZyBncm91cFxuICAgICAgICB2YXIgbWF0Y2hlcyA9IFtdO1xuICAgICAgICB2YXIgbWF0Y2g7XG4gICAgICAgIHdoaWxlIChtYXRjaCA9IHJlZ2V4LmV4ZWMoc3RyaW5nKSkge1xuICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKG1hdGNoW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hdGNoZXM7XG4gICAgfVxuICAgIHZhciBwZGZBcnJheVRvU3RyaW5nQXJyYXkgPSBmdW5jdGlvbiAoYXJyYXkpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICBpZiAodHlwZW9mIGFycmF5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBnZXRNYXRjaGVzKGFycmF5LCAvXFwoKC4qPylcXCkvZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgdmFyIHRvUGRmU3RyaW5nID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICBzdHJpbmcgPSBzdHJpbmcgfHwgXCJcIjtcbiAgICAgICAgc3RyaW5nLnRvU3RyaW5nKCk7XG4gICAgICAgIHN0cmluZyA9ICcoJyArIHBkZkVzY2FwZShzdHJpbmcpICsgJyknO1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgIH07XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuICAgIC8vIENsYXNzZXNcbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1QREZPYmplY3RcbiAgICAqIEBjbGFzc2Rlc2MgQSBBY3JvRm9ybVBERk9iamVjdFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtUERGT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX29iaklkO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtUERGT2JqZWN0I29iaklkXG4gICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdvYmpJZCcsIHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX29iaklkKSB7XG4gICAgICAgICAgICAgICAgICAgIF9vYmpJZCA9IHNjb3BlLmludGVybmFsLm5ld09iamVjdERlZmVycmVkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfb2JqSWRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9vYmpJZCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBAZnVuY3Rpb24gQWNyb0Zvcm1QREZPYmplY3QudG9TdHJpbmdcbiAgICAqL1xuICAgIEFjcm9Gb3JtUERGT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JqSWQgKyBcIiAwIFJcIjtcbiAgICB9O1xuXG4gICAgQWNyb0Zvcm1QREZPYmplY3QucHJvdG90eXBlLnB1dFN0cmVhbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGtleVZhbHVlTGlzdCA9IHRoaXMuZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtKCk7XG4gICAgICAgIHNjb3BlLmludGVybmFsLnB1dFN0cmVhbSh7IGRhdGE6IHRoaXMuc3RyZWFtLCBhZGRpdGlvbmFsS2V5VmFsdWVzOiBrZXlWYWx1ZUxpc3QgfSk7XG4gICAgICAgIHNjb3BlLmludGVybmFsLm91dChcImVuZG9ialwiKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIGFuIGtleS12YWx1ZS1MaXN0IG9mIGFsbCBub24tY29uZmlndXJhYmxlIFZhcmlhYmxlcyBmcm9tIHRoZSBPYmplY3RcbiAgICAqIFxuICAgICogQG5hbWUgZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtXG4gICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICovXG4gICAgQWNyb0Zvcm1QREZPYmplY3QucHJvdG90eXBlLmdldEtleVZhbHVlTGlzdEZvclN0cmVhbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNyZWF0ZUtleVZhbHVlTGlzdEZyb21GaWVsZE9iamVjdCA9IGZ1bmN0aW9uIChmaWVsZE9iamVjdCkge1xuICAgICAgICAgICAgdmFyIGtleVZhbHVlTGlzdCA9IFtdO1xuICAgICAgICAgICAgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhmaWVsZE9iamVjdCkuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGtleSAhPSAnY29udGVudCcgJiYga2V5ICE9ICdhcHBlYXJhbmNlU3RyZWFtQ29udGVudCcgJiYga2V5LnN1YnN0cmluZygwLCAxKSAhPSBcIl9cIik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBrZXlzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZmllbGRPYmplY3QsIGtleXNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eURlc2NyaXB0b3IgJiYgcHJvcGVydHlEZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGZpZWxkT2JqZWN0W2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVMaXN0LnB1c2goeyBrZXk6IGtleSwgdmFsdWU6IGFycmF5VG9QZGZBcnJheSh2YWx1ZSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQWNyb0Zvcm1QREZPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIGl0IGlzIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgUERGT2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2UgdGhlIHJlZmVyZW5jZSBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QucHVzaCh7IGtleToga2V5LCB2YWx1ZTogdmFsdWUub2JqSWQgKyBcIiAwIFJcIiB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QucHVzaCh7IGtleToga2V5LCB2YWx1ZTogdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ga2V5VmFsdWVMaXN0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVLZXlWYWx1ZUxpc3RGcm9tRmllbGRPYmplY3QodGhpcyk7XG4gICAgfTtcblxuICAgIHZhciBBY3JvRm9ybVhPYmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtUERGT2JqZWN0LmNhbGwodGhpcyk7XG5cblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1R5cGUnLCB7XG4gICAgICAgICAgICB2YWx1ZTogXCIvWE9iamVjdFwiLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRlYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1N1YnR5cGUnLCB7XG4gICAgICAgICAgICB2YWx1ZTogXCIvRm9ybVwiLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRlYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0Zvcm1UeXBlJywge1xuICAgICAgICAgICAgdmFsdWU6IDEsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfQkJveCA9IFtdO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0JCb3gnLCB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9CQm94O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0JCb3ggPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdSZXNvdXJjZXMnLCB7XG4gICAgICAgICAgICB2YWx1ZTogXCIyIDAgUlwiLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRlYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX3N0cmVhbTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdzdHJlYW0nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX3N0cmVhbSA9IHZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoX3N0cmVhbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3N0cmVhbTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBpbmhlcml0KEFjcm9Gb3JtWE9iamVjdCwgQWNyb0Zvcm1QREZPYmplY3QpO1xuXG4gICAgdmFyIEFjcm9Gb3JtRGljdGlvbmFyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1QREZPYmplY3QuY2FsbCh0aGlzKTtcblxuICAgICAgICB2YXIgX0tpZHMgPSBbXTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0tpZHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChfS2lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfS2lkcztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRmllbGRzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9LaWRzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBEZWZhdWx0IEFwcGVhcmFuY2VcbiAgICAgICAgdmFyIF9EQTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdEQScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX0RBKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAnKCcgKyBfREEgKyAnKSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9EQSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgaW5oZXJpdChBY3JvRm9ybURpY3Rpb25hcnksIEFjcm9Gb3JtUERGT2JqZWN0KTtcblxuICAgIC8qKlxuICAgICogVGhlIEZpZWxkIE9iamVjdCBjb250YWlucyB0aGUgVmFyaWFibGVzLCB0aGF0IGV2ZXJ5IEZpZWxkIG5lZWRzXG4gICAgKiBcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUZpZWxkXG4gICAgKiBAY2xhc3NkZXNjIEFuIEFjcm9Gb3JtIEZpZWxkT2JqZWN0XG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1GaWVsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1QREZPYmplY3QuY2FsbCh0aGlzKTtcblxuICAgICAgICAvL0Fubm90YXRpb24tRmxhZyBTZWUgVGFibGUgMTY1XG4gICAgICAgIHZhciBfRiA9IDQ7XG4gICAgICAgIHRoaXMuaXNVbmljb2RlID0gZmFsc2U7XG4gICAgICAgIHRoaXMudHJ1ZVZhbHVlID0gJyc7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfRjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9GID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIFwiJyArIHZhbHVlICsgJ1wiIGZvciBhdHRyaWJ1dGUgRiBzdXBwbGllZC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS4yKSBJZiBzZXQsIHByaW50IHRoZSBhbm5vdGF0aW9uIHdoZW4gdGhlIHBhZ2UgaXMgcHJpbnRlZC4gSWYgY2xlYXIsIG5ldmVyIHByaW50IHRoZSBhbm5vdGF0aW9uLCByZWdhcmRsZXNzIG9mIHdldGhlciBpcyBpcyBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbi4gXG4gICAgICAgICogTk9URSAyIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgYW5ub3RhdGlvbnMgcmVwcmVzZW50aW5nIGludGVyYWN0aXZlIHB1c2hidXR0b25zLCB3aGljaCB3b3VsZCBzZXJ2ZSBubyBtZWFuaW5nZnVsIHB1cnBvc2Ugb24gdGhlIHByaW50ZWQgcGFnZS5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjc2hvd1doZW5QcmludGVkXG4gICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3Nob3dXaGVuUHJpbnRlZCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYoX0YsIDMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkYgPSBzZXRCaXRGb3JQZGYoX0YsIDMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRiA9IGNsZWFyQml0Rm9yUGRmKF9GLCAzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfRmYgPSAwO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0ZmJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9GZjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9GZiA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZSBcIicgKyB2YWx1ZSArICdcIiBmb3IgYXR0cmlidXRlIEZmIHN1cHBsaWVkLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9SZWN0ID0gW107XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnUmVjdCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChfUmVjdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9SZWN0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICBfUmVjdCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9SZWN0ID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgeC1wb3NpdGlvbiBvZiB0aGUgZmllbGQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3hcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd4Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX1JlY3QgfHwgaXNOYU4oX1JlY3RbMF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYW50aVNjYWxlKF9SZWN0WzBdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9SZWN0WzBdID0gc2NhbGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgeS1wb3NpdGlvbiBvZiB0aGUgZmllbGQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3lcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd5Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX1JlY3QgfHwgaXNOYU4oX1JlY3RbMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYW50aVNjYWxlKF9SZWN0WzFdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9SZWN0WzFdID0gc2NhbGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIGZpZWxkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCN3aWR0aFxuICAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3dpZHRoJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX1JlY3QgfHwgaXNOYU4oX1JlY3RbMl0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYW50aVNjYWxlKF9SZWN0WzJdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9SZWN0WzJdID0gc2NhbGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBmaWVsZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjaGVpZ2h0XG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaGVpZ2h0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX1JlY3QgfHwgaXNOYU4oX1JlY3RbM10pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYW50aVNjYWxlKF9SZWN0WzNdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9SZWN0WzNdID0gc2NhbGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX0ZUID0gXCJcIjtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdGVCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9GVFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICcvQnRuJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnL1R4JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnL0NoJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnL1NpZyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfRlQgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIFwiJyArIHZhbHVlICsgJ1wiIGZvciBhdHRyaWJ1dGUgRlQgc3VwcGxpZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX1QgPSBudWxsO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnVCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfVCB8fCBfVC5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgYSBDaGlsZCBmcm9tIGEgUmFkaW/CtEdyb3VwLCB5b3UgZG9uJ3QgbmVlZCBhIEZpZWxkTmFtZVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQ2hpbGRDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfVCA9IFwiRmllbGRPYmplY3RcIiArIChBY3JvRm9ybUZpZWxkLkZpZWxkTnVtKyspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gJygnICsgcGRmRXNjYXBlKF9UKSArICcpJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9UID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKE9wdGlvbmFsKSBUaGUgcGFydGlhbCBmaWVsZCBuYW1lIChzZWUgMTIuNy4zLjIsIOKAnEZpZWxkIE5hbWVz4oCdKS5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjZmllbGROYW1lXG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZmllbGROYW1lJywge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfVDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9UID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfZm9udE5hbWUgPSAnaGVsdmV0aWNhJztcbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIGZvbnROYW1lIG9mIHRoZSBmb250IHRvIGJlIHVzZWQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2ZvbnROYW1lXG4gICAgICAgICogQGRlZmF1bHQgJ2hlbHZldGljYSdcbiAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2ZvbnROYW1lJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZm9udE5hbWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfZm9udE5hbWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9mb250U3R5bGUgPSAnbm9ybWFsJztcbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIGZvbnRTdHlsZSBvZiB0aGUgZm9udCB0byBiZSB1c2VkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNmb250U3R5bGVcbiAgICAgICAgKiBAZGVmYXVsdCAnbm9ybWFsJ1xuICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZm9udFN0eWxlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZm9udFN0eWxlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX2ZvbnRTdHlsZSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX2ZvbnRTaXplID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIGZvbnRTaXplIG9mIHRoZSBmb250IHRvIGJlIHVzZWQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2ZvbnRTaXplXG4gICAgICAgICogQGRlZmF1bHQgMCAoZm9yIGF1dG8pXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdmb250U2l6ZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYW50aVNjYWxlKF9mb250U2l6ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfZm9udFNpemUgPSBzY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfbWF4Rm9udFNpemUgPSA1MDtcbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIG1heGltdW0gZm9udFNpemUgb2YgdGhlIGZvbnQgdG8gYmUgdXNlZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjbWF4Rm9udFNpemVcbiAgICAgICAgKiBAZGVmYXVsdCAwIChmb3IgYXV0bylcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ21heEZvbnRTaXplJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX21heEZvbnRTaXplKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9tYXhGb250U2l6ZSA9IHNjYWxlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9jb2xvciA9ICdibGFjayc7XG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSBjb2xvciBvZiB0aGUgdGV4dFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNjb2xvclxuICAgICAgICAqIEBkZWZhdWx0ICdibGFjaydcbiAgICAgICAgKiBAdHlwZSB7c3RyaW5nfHJnYmF9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY29sb3InLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb2xvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9jb2xvciA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX0RBID0gJy9GMSAwIFRmIDAgZyc7XG4gICAgICAgIC8vIERlZmluZXMgdGhlIGRlZmF1bHQgYXBwZWFyYW5jZSAoTmVlZGVkIGZvciB2YXJpYWJsZSBUZXh0KVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0RBJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9EQVxuICAgICAgICAgICAgICAgICAgICB8fCB0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1DaGlsZENsYXNzXG4gICAgICAgICAgICAgICAgICAgIHx8IHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybVRleHRGaWVsZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdG9QZGZTdHJpbmcoX0RBKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBfREEgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICB2YXIgX0RWID0gbnVsbDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdEVicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX0RWKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvUGRmU3RyaW5nKF9EVik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfRFY7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuc3Vic3RyKDAsIDEpID09PSAnKCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9EViA9IHBkZlVuZXNjYXBlKHZhbHVlLnN1YnN0cigxLCB2YWx1ZS5sZW5ndGggLSAyKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfRFYgPSBwZGZVbmVzY2FwZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfRFYgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChPcHRpb25hbDsgaW5oZXJpdGFibGUpIFRoZSBkZWZhdWx0IHZhbHVlIHRvIHdoaWNoIHRoZSBmaWVsZCByZXZlcnRzIHdoZW4gYSByZXNldC1mb3JtIGFjdGlvbiBpcyBleGVjdXRlZCAoc2VlIDEyLjcuNS4zLCDigJxSZXNldC1Gb3JtIEFjdGlvbuKAnSkuIFRoZSBmb3JtYXQgb2YgdGhpcyB2YWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGF0IG9mIHZhbHVlLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjZGVmYXVsdFZhbHVlXG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHthbnl9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZGVmYXVsdFZhbHVlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGRmVW5lc2NhcGUoX0RWLnN1YnN0cigxLCBfRFYubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfRFY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICBfRFYgPSAnLycgKyB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfRFYgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfViA9IG51bGw7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnVicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVW5pY29kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX1Y7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghX1YpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9QZGZTdHJpbmcoX1YpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX1Y7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNVbmljb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIF9WID0gdG9Vbmljb2RlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnVlVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdWJzdHIoMCwgMSkgPT09ICcoJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WID0gcGRmVW5lc2NhcGUodmFsdWUuc3Vic3RyKDEsIHZhbHVlLmxlbmd0aCAtIDIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX1YgPSBwZGZVbmVzY2FwZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfViA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoT3B0aW9uYWw7IGluaGVyaXRhYmxlKSBUaGUgZmllbGTigJlzIHZhbHVlLCB3aG9zZSBmb3JtYXQgdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgZmllbGQgdHlwZS4gU2VlIHRoZSBkZXNjcmlwdGlvbnMgb2YgaW5kaXZpZHVhbCBmaWVsZCB0eXBlcyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3ZhbHVlXG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHthbnl9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndmFsdWUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwZGZVbmVzY2FwZShfVi5zdWJzdHIoMSwgX1YubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfVjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9WID0gJy8nICsgdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX1YgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIENoZWNrIGlmIGZpZWxkIGhhcyBhbm5vdGF0aW9uc1xuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNoYXNBbm5vdGF0aW9uXG4gICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaGFzQW5ub3RhdGlvbicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuUmVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnVHlwZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmhhc0Fubm90YXRpb24pID8gXCIvQW5ub3RcIiA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnU3VidHlwZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmhhc0Fubm90YXRpb24pID8gXCIvV2lkZ2V0XCIgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX2hhc0FwcGVhcmFuY2VTdHJlYW0gPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICogdHJ1ZSBpZiBmaWVsZCBoYXMgYW4gYXBwZWFyYW5jZVN0cmVhbVxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNoYXNBcHBlYXJhbmNlU3RyZWFtXG4gICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaGFzQXBwZWFyYW5jZVN0cmVhbScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0ZWFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2hhc0FwcGVhcmFuY2VTdHJlYW07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IEJvb2xlYW4odmFsdWUpO1xuICAgICAgICAgICAgICAgIF9oYXNBcHBlYXJhbmNlU3RyZWFtID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSBwYWdlIG9uIHdoaWNoIHRoZSBBY3JvRm9ybUZpZWxkIGlzIHBsYWNlZFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNwYWdlXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgdmFyIF9wYWdlO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3BhZ2UnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfcGFnZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX3BhZ2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9wYWdlID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIHVzZXIgbWF5IG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4gQW55IGFzc29jaWF0ZWQgd2lkZ2V0IGFubm90YXRpb25zIHdpbGwgbm90IGludGVyYWN0IHdpdGggdGhlIHVzZXI7IHRoYXQgaXMsIHRoZXkgd2lsbCBub3QgcmVzcG9uZCB0byBtb3VzZSBjbGlja3Mgb3IgY2hhbmdlIHRoZWlyIGFwcGVhcmFuY2UgaW4gcmVzcG9uc2UgdG8gbW91c2UgbW90aW9ucy4gVGhpcyBmbGFnIGlzIHVzZWZ1bCBmb3IgZmllbGRzIHdob3NlIHZhbHVlcyBhcmUgY29tcHV0ZWQgb3IgaW1wb3J0ZWQgZnJvbSBhIGRhdGFiYXNlLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjcmVhZE9ubHlcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3JlYWRPbmx5Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBzaGFsbCBoYXZlIGEgdmFsdWUgYXQgdGhlIHRpbWUgaXQgaXMgZXhwb3J0ZWQgYnkgYSBzdWJtaXRmb3JtIGFjdGlvbiAoc2VlIDEyLjcuNS4yLCDigJxTdWJtaXQtRm9ybSBBY3Rpb27igJ0pLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjcmVxdWlyZWRcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3JlcXVpcmVkJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBzaGFsbCBub3QgYmUgZXhwb3J0ZWQgYnkgYSBzdWJtaXQtZm9ybSBhY3Rpb24gKHNlZSAxMi43LjUuMiwg4oCcU3VibWl0LUZvcm0gQWN0aW9u4oCdKVxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNub0V4cG9ydFxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbm9FeHBvcnQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgdmFyIF9RID0gbnVsbDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdRJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoX1EgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9RO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKFswLCAxLCAyXS5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgX1EgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgXCInICsgdmFsdWUgKyAnXCIgZm9yIGF0dHJpYnV0ZSBRIHN1cHBsaWVkLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKE9wdGlvbmFsOyBpbmhlcml0YWJsZSkgQSBjb2RlIHNwZWNpZnlpbmcgdGhlIGZvcm0gb2YgcXVhZGRpbmcgKGp1c3RpZmljYXRpb24pIHRoYXQgc2hhbGwgYmUgdXNlZCBpbiBkaXNwbGF5aW5nIHRoZSB0ZXh0OlxuICAgICAgICAqICdsZWZ0JywgJ2NlbnRlcicsICdyaWdodCdcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjdGV4dEFsaWduXG4gICAgICAgICogQGRlZmF1bHQgJ2xlZnQnXG4gICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0ZXh0QWxpZ24nLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX1EpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gJ2xlZnQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICdjZW50ZXInO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICdyaWdodCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX1EgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9RID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX1EgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICB9O1xuXG4gICAgaW5oZXJpdChBY3JvRm9ybUZpZWxkLCBBY3JvRm9ybVBERk9iamVjdCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1DaG9pY2VGaWVsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1GaWVsZC5jYWxsKHRoaXMpO1xuICAgICAgICAvLyBGaWVsZCBUeXBlID0gQ2hvaWNlIEZpZWxkXG4gICAgICAgIHRoaXMuRlQgPSBcIi9DaFwiO1xuICAgICAgICAvLyBvcHRpb25zXG4gICAgICAgIHRoaXMuViA9ICcoKSc7XG5cbiAgICAgICAgdGhpcy5mb250TmFtZSA9ICd6YXBmZGluZ2JhdHMnO1xuICAgICAgICAvLyBUb3AgSW5kZXhcbiAgICAgICAgdmFyIF9USSA9IDA7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdUSScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9USTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9USSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBNSyBmaXggZm9yIEFjcm9iYXRcbiAgICAgICAgdmFyIF9NSyA9ICc8PCAvQkcgWyAwLjk3NSAwLjk3NSAwLjk3NSBdICA+Pic7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTUsnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfTUs7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfTUsgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKE9wdGlvbmFsKSBGb3Igc2Nyb2xsYWJsZSBsaXN0IGJveGVzLCB0aGUgdG9wIGluZGV4ICh0aGUgaW5kZXggaW4gdGhlIE9wdCBhcnJheSBvZiB0aGUgZmlyc3Qgb3B0aW9uIHZpc2libGUgaW4gdGhlIGxpc3QpLiBEZWZhdWx0IHZhbHVlOiAwLlxuICAgICAgICAqIFxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjdG9wSW5kZXhcbiAgICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0b3BJbmRleCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX1RJO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1RJID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfT3B0ID0gW107XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnT3B0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1VuaWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5VG9QZGZVbmljb2RlQXJyYXkoX09wdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVRvUGRmQXJyYXkoX09wdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfT3B0ID0gcGRmQXJyYXlUb1N0cmluZ0FycmF5KHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICAvKipcbiAgICAgICAgKiBAbWVtYmVyb2YgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICAgICAqIEBuYW1lIGdldE9wdGlvbnNcbiAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IGFycmF5IG9mIE9wdGlvbnNcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5nZXRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9PcHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgKiBAbWVtYmVyb2YgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICAgICAqIEBuYW1lIHNldE9wdGlvbnNcbiAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgKiBAcGFyYW0ge2FycmF5fSB2YWx1ZVxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnNldE9wdGlvbnMgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIF9PcHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvcnQpIHtcbiAgICAgICAgICAgICAgICBfT3B0LnNvcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEBtZW1iZXJvZiBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgICAgICogQG5hbWUgYWRkT3B0aW9uXG4gICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuYWRkT3B0aW9uID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlIHx8IFwiXCI7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBfT3B0LnB1c2godmFsdWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc29ydCkge1xuICAgICAgICAgICAgICAgIF9PcHQuc29ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQG1lbWJlcm9mIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAgICAgKiBAbmFtZSByZW1vdmVPcHRpb25cbiAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbEVudHJpZXMgKGRlZmF1bHQ6IGZhbHNlKVxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlbW92ZU9wdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZSwgYWxsRW50cmllcykge1xuICAgICAgICAgICAgYWxsRW50cmllcyA9IGFsbEVudHJpZXMgfHwgZmFsc2VcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgfHwgXCJcIjtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgd2hpbGUgKF9PcHQuaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgX09wdC5zcGxpY2UoX09wdC5pbmRleE9mKHZhbHVlKSwgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGFsbEVudHJpZXMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBhIGNvbWJvIGJveDsgaWYgY2xlYXIsIHRoZSBmaWVsZCBpcyBhIGxpc3QgYm94LiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjY29tYm9cbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NvbWJvJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxOCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxOCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBjb21ibyBib3ggc2hhbGwgaW5jbHVkZSBhbiBlZGl0YWJsZSB0ZXh0IGJveCBhcyB3ZWxsIGFzIGEgZHJvcC1kb3duIGxpc3Q7IGlmIGNsZWFyLCBpdCBzaGFsbCBpbmNsdWRlIG9ubHkgYSBkcm9wLWRvd24gbGlzdC4gVGhpcyBmbGFnIHNoYWxsIGJlIHVzZWQgb25seSBpZiB0aGUgQ29tYm8gZmxhZyBpcyBzZXQuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNlZGl0XG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdlZGl0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxOSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy9QREYgMzIwMDAtMToyMDA4LCBwYWdlIDQ0NFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbWJvID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxOSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMTkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZOKAmXMgb3B0aW9uIGl0ZW1zIHNoYWxsIGJlIHNvcnRlZCBhbHBoYWJldGljYWxseS4gVGhpcyBmbGFnIGlzIGludGVuZGVkIGZvciB1c2UgYnkgd3JpdGVycywgbm90IGJ5IHJlYWRlcnMuIENvbmZvcm1pbmcgcmVhZGVycyBzaGFsbCBkaXNwbGF5IHRoZSBvcHRpb25zIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IG9jY3VyIGluIHRoZSBPcHQgYXJyYXkgKHNlZSBUYWJsZSAyMzEpLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjc29ydFxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc29ydCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjApKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIwKTtcbiAgICAgICAgICAgICAgICAgICAgX09wdC5zb3J0KCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDIwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS40KSBJZiBzZXQsIG1vcmUgdGhhbiBvbmUgb2YgdGhlIGZpZWxk4oCZcyBvcHRpb24gaXRlbXMgbWF5IGJlIHNlbGVjdGVkIHNpbXVsdGFuZW91c2x5OyBpZiBjbGVhciwgYXQgbW9zdCBvbmUgaXRlbSBzaGFsbCBiZSBzZWxlY3RlZCBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjbXVsdGlTZWxlY3RcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ211bHRpU2VsZWN0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyMikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjIpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDIyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS40KSBJZiBzZXQsIHRleHQgZW50ZXJlZCBpbiB0aGUgZmllbGQgc2hhbGwgbm90IGJlIHNwZWxsY2hlY2tlZC4gVGhpcyBmbGFnIHNoYWxsIG5vdCBiZSB1c2VkIHVubGVzcyB0aGUgQ29tYm8gYW5kIEVkaXQgZmxhZ3MgYXJlIGJvdGggc2V0LiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjZG9Ob3RTcGVsbENoZWNrXG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdkb05vdFNwZWxsQ2hlY2snLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIzKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyMyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDIzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS41KSBJZiBzZXQsIHRoZSBuZXcgdmFsdWUgc2hhbGwgYmUgY29tbWl0dGVkIGFzIHNvb24gYXMgYSBzZWxlY3Rpb24gaXMgbWFkZSAoY29tbW9ubHkgd2l0aCB0aGUgcG9pbnRpbmcgZGV2aWNlKS4gSW4gdGhpcyBjYXNlLCBzdXBwbHlpbmcgYSB2YWx1ZSBmb3IgYSBmaWVsZCBpbnZvbHZlcyB0aHJlZSBhY3Rpb25zOiBzZWxlY3RpbmcgdGhlIGZpZWxkIGZvciBmaWxsLWluLCBzZWxlY3RpbmcgYSBjaG9pY2UgZm9yIHRoZSBmaWxsLWluIHZhbHVlLCBhbmQgbGVhdmluZyB0aGF0IGZpZWxkLCB3aGljaCBmaW5hbGl6ZXMgb3Ig4oCcY29tbWl0c+KAnSB0aGUgZGF0YSBjaG9pY2UgYW5kIHRyaWdnZXJzIGFueSBhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50cnkgb3IgY2hhbmdpbmcgb2YgdGhpcyBkYXRhLiBJZiB0aGlzIGZsYWcgaXMgb24sIHRoZW4gcHJvY2Vzc2luZyBkb2VzIG5vdCB3YWl0IGZvciBsZWF2aW5nIHRoZSBmaWVsZCBhY3Rpb24gdG8gb2NjdXIsIGJ1dCBpbW1lZGlhdGVseSBwcm9jZWVkcyB0byB0aGUgdGhpcmQgc3RlcC5cbiAgICAgICAgKiBUaGlzIG9wdGlvbiBlbmFibGVzIGFwcGxpY2F0aW9ucyB0byBwZXJmb3JtIGFuIGFjdGlvbiBvbmNlIGEgc2VsZWN0aW9uIGlzIG1hZGUsIHdpdGhvdXQgcmVxdWlyaW5nIHRoZSB1c2VyIHRvIGV4aXQgdGhlIGZpZWxkLiBJZiBjbGVhciwgdGhlIG5ldyB2YWx1ZSBpcyBub3QgY29tbWl0dGVkIHVudGlsIHRoZSB1c2VyIGV4aXRzIHRoZSBmaWVsZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjY29tbWl0T25TZWxDaGFuZ2VcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NvbW1pdE9uU2VsQ2hhbmdlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyNykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyNyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIHRoaXMuaGFzQXBwZWFyYW5jZVN0cmVhbSA9IGZhbHNlO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUNob2ljZUZpZWxkLCBBY3JvRm9ybUZpZWxkKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtTGlzdEJveFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtTGlzdEJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1DaG9pY2VGaWVsZC5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLmZvbnROYW1lID0gJ2hlbHZldGljYSc7XG5cbiAgICAgICAgLy9QREYgMzIwMDAtMToyMDA4LCBwYWdlIDQ0NFxuICAgICAgICB0aGlzLmNvbWJvID0gZmFsc2U7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtTGlzdEJveCwgQWNyb0Zvcm1DaG9pY2VGaWVsZCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUNvbWJvQm94IFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1MaXN0Qm94XG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1Db21ib0JveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1MaXN0Qm94LmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuY29tYm8gPSB0cnVlO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUNvbWJvQm94LCBBY3JvRm9ybUxpc3RCb3gpO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1FZGl0Qm94IFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1Db21ib0JveFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1MaXN0Qm94XG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1FZGl0Qm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUNvbWJvQm94LmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuZWRpdCA9IHRydWU7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtRWRpdEJveCwgQWNyb0Zvcm1Db21ib0JveCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUJ1dHRvblxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtQnV0dG9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUZpZWxkLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuRlQgPSBcIi9CdG5cIjtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUmFkaW8gYnV0dG9ucyBvbmx5KSBJZiBzZXQsIGV4YWN0bHkgb25lIHJhZGlvIGJ1dHRvbiBzaGFsbCBiZSBzZWxlY3RlZCBhdCBhbGwgdGltZXM7IHNlbGVjdGluZyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGJ1dHRvbiBoYXMgbm8gZWZmZWN0LiBJZiBjbGVhciwgY2xpY2tpbmcgdGhlIHNlbGVjdGVkIGJ1dHRvbiBkZXNlbGVjdHMgaXQsIGxlYXZpbmcgbm8gYnV0dG9uIHNlbGVjdGVkLlxuICAgICAgICAqIFxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI25vVG9nZ2xlVG9PZmZcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdub1RvZ2dsZVRvT2ZmJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxNSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxNSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBhIHNldCBvZiByYWRpbyBidXR0b25zOyBpZiBjbGVhciwgdGhlIGZpZWxkIGlzIGEgY2hlY2tib3guIFRoaXMgZmxhZyBtYXkgYmUgc2V0IG9ubHkgaWYgdGhlIFB1c2hidXR0b24gZmxhZyBpcyBjbGVhci4gXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jcmFkaW9cbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdyYWRpbycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMTYpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE2KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMTYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgZmllbGQgaXMgYSBwdXNoYnV0dG9uIHRoYXQgZG9lcyBub3QgcmV0YWluIGEgcGVybWFuZW50IHZhbHVlLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI3B1c2hCdXR0b25cbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdwdXNoQnV0dG9uJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxNykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxNyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNSkgSWYgc2V0LCBhIGdyb3VwIG9mIHJhZGlvIGJ1dHRvbnMgd2l0aGluIGEgcmFkaW8gYnV0dG9uIGZpZWxkIHRoYXQgdXNlIHRoZSBzYW1lIHZhbHVlIGZvciB0aGUgb24gc3RhdGUgd2lsbCB0dXJuIG9uIGFuZCBvZmYgaW4gdW5pc29uOyB0aGF0IGlzIGlmIG9uZSBpcyBjaGVja2VkLCB0aGV5IGFyZSBhbGwgY2hlY2tlZC4gSWYgY2xlYXIsIHRoZSBidXR0b25zIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgKHRoZSBzYW1lIGJlaGF2aW9yIGFzIEhUTUwgcmFkaW8gYnV0dG9ucykuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNyYWRpb0lzVW5pc29uXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncmFkaW9Jc1VuaXNvbicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjYpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI2KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9NSyA9IHt9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ01LJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKF9NSykubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJzw8Jyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoa2V5IGluIF9NSykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJy8nICsga2V5ICsgJyAoJyArIF9NS1trZXldICsgJyknKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnPj4nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCdcXG4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgX01LID0gdmFsdWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEZyb20gdGhlIFBERiByZWZlcmVuY2U6XG4gICAgICAgICogKE9wdGlvbmFsLCBidXR0b24gZmllbGRzIG9ubHkpIFRoZSB3aWRnZXQgYW5ub3RhdGlvbidzIG5vcm1hbCBjYXB0aW9uIHdoaWNoIHNoYWxsIGJlIGRpc3BsYXllZCB3aGVuIGl0IGlzIG5vdCBpbnRlcmFjdGluZyB3aXRoIHRoZSB1c2VyLiBcbiAgICAgICAgKiBVbmxpa2UgdGhlIHJlbWFpbmluZyBlbnRyaWVzIGxpc3RlZCBpbiB0aGlzIFRhYmxlIHdoaWNoIGFwcGx5IG9ubHkgdG8gd2lkZ2V0IGFubm90YXRpb25zIGFzc29jaWF0ZWQgd2l0aCBwdXNoYnV0dG9uIGZpZWxkcyAoc2VlIFB1c2hidXR0b25zIGluIDEyLjcuNC4yLCBcIkJ1dHRvbiBGaWVsZHNcIiksIHRoZSBDQSBlbnRyeSBtYXkgYmUgdXNlZCB3aXRoIGFueSB0eXBlIG9mIGJ1dHRvbiBmaWVsZCwgaW5jbHVkaW5nIGNoZWNrIGJveGVzIChzZWUgQ2hlY2sgQm94ZXMgaW4gMTIuNy40LjIsIFwiQnV0dG9uIEZpZWxkc1wiKSBhbmQgcmFkaW8gYnV0dG9ucyAoUmFkaW8gQnV0dG9ucyBpbiAxMi43LjQuMiwgXCJCdXR0b24gRmllbGRzXCIpLlxuICAgICAgICAqXG4gICAgICAgICogLSAnOCcgPSBDcm9zcywgXG4gICAgICAgICogLSAnbCcgPSAgQ2lyY2xlLFxuICAgICAgICAqIC0gJycgPSBub3RoaW5nXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jY2FwdGlvblxuICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY2FwdGlvbicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX01LLkNBIHx8ICcnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBfTUsuQ0EgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfQVM7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnQVMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0FTO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0FTID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFJlcXVpcmVkIGlmIHRoZSBhcHBlYXJhbmNlIGRpY3Rpb25hcnkgQVAgY29udGFpbnMgb25lIG9yIG1vcmUgc3ViZGljdGlvbmFyaWVzOyBQREYgMS4yKSBUaGUgYW5ub3RhdGlvbidzIGFwcGVhcmFuY2Ugc3RhdGUsIHdoaWNoIHNlbGVjdHMgdGhlIGFwcGxpY2FibGUgYXBwZWFyYW5jZSBzdHJlYW0gZnJvbSBhbiBhcHBlYXJhbmNlIHN1YmRpY3Rpb25hcnkgKHNlZSBTZWN0aW9uIDEyLjUuNSwgXCJBcHBlYXJhbmNlIFN0cmVhbXNcIilcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI2FwcGVhcmFuY2VTdGF0ZVxuICAgICAgICAqIEB0eXBlIHthbnl9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYXBwZWFyYW5jZVN0YXRlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfQVMuc3Vic3RyKDEsIF9BUy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9BUyA9ICcvJyArIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUJ1dHRvbiwgQWNyb0Zvcm1GaWVsZCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybVB1c2hCdXR0b25cbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtQnV0dG9uXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1QdXNoQnV0dG9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUJ1dHRvbi5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLnB1c2hCdXR0b24gPSB0cnVlO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybVB1c2hCdXR0b24sIEFjcm9Gb3JtQnV0dG9uKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtUmFkaW9CdXR0b25cbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtQnV0dG9uXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1SYWRpb0J1dHRvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1CdXR0b24uY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5yYWRpbyA9IHRydWU7XG4gICAgICAgIHRoaXMucHVzaEJ1dHRvbiA9IGZhbHNlO1xuXG4gICAgICAgIHZhciBfS2lkcyA9IFtdO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0tpZHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfS2lkcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgX0tpZHMgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfS2lkcyA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtUmFkaW9CdXR0b24sIEFjcm9Gb3JtQnV0dG9uKTtcblxuICAgIC8qKlxuICAgICogVGhlIENoaWxkIGNsYXNzIG9mIGEgUmFkaW9CdXR0b24gKHRoZSByYWRpb0dyb3VwKSAtPiBUaGUgc2luZ2xlIEJ1dHRvbnNcbiAgICAqIFxuICAgICogQGNsYXNzIEFjcm9Gb3JtQ2hpbGRDbGFzc1xuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICogQGlnbm9yZVxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtQ2hpbGRDbGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1GaWVsZC5jYWxsKHRoaXMpO1xuXG4gICAgICAgIHZhciBfcGFyZW50O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1BhcmVudCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcGFyZW50O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX3BhcmVudCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX29wdGlvbk5hbWU7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnb3B0aW9uTmFtZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9vcHRpb25OYW1lO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX29wdGlvbk5hbWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9NSyA9IHt9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ01LJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc8PCcpO1xuICAgICAgICAgICAgICAgIHZhciBrZXk7XG4gICAgICAgICAgICAgICAgZm9yIChrZXkgaW4gX01LKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcvJyArIGtleSArICcgKCcgKyBfTUtba2V5XSArICcpJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc+PicpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuam9pbignXFxuJyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIF9NSyA9IHZhbHVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBGcm9tIHRoZSBQREYgcmVmZXJlbmNlOlxuICAgICAgICAqIChPcHRpb25hbCwgYnV0dG9uIGZpZWxkcyBvbmx5KSBUaGUgd2lkZ2V0IGFubm90YXRpb24ncyBub3JtYWwgY2FwdGlvbiB3aGljaCBzaGFsbCBiZSBkaXNwbGF5ZWQgd2hlbiBpdCBpcyBub3QgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdXNlci4gXG4gICAgICAgICogVW5saWtlIHRoZSByZW1haW5pbmcgZW50cmllcyBsaXN0ZWQgaW4gdGhpcyBUYWJsZSB3aGljaCBhcHBseSBvbmx5IHRvIHdpZGdldCBhbm5vdGF0aW9ucyBhc3NvY2lhdGVkIHdpdGggcHVzaGJ1dHRvbiBmaWVsZHMgKHNlZSBQdXNoYnV0dG9ucyBpbiAxMi43LjQuMiwgXCJCdXR0b24gRmllbGRzXCIpLCB0aGUgQ0EgZW50cnkgbWF5IGJlIHVzZWQgd2l0aCBhbnkgdHlwZSBvZiBidXR0b24gZmllbGQsIGluY2x1ZGluZyBjaGVjayBib3hlcyAoc2VlIENoZWNrIEJveGVzIGluIDEyLjcuNC4yLCBcIkJ1dHRvbiBGaWVsZHNcIikgYW5kIHJhZGlvIGJ1dHRvbnMgKFJhZGlvIEJ1dHRvbnMgaW4gMTIuNy40LjIsIFwiQnV0dG9uIEZpZWxkc1wiKS5cbiAgICAgICAgKlxuICAgICAgICAqIC0gJzgnID0gQ3Jvc3MsIFxuICAgICAgICAqIC0gJ2wnID0gIENpcmNsZSxcbiAgICAgICAgKiAtICcnID0gbm90aGluZ1xuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI2NhcHRpb25cbiAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NhcHRpb24nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9NSy5DQSB8fCAnJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgX01LLkNBID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX0FTO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0FTJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9BUztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9BUyA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUmVxdWlyZWQgaWYgdGhlIGFwcGVhcmFuY2UgZGljdGlvbmFyeSBBUCBjb250YWlucyBvbmUgb3IgbW9yZSBzdWJkaWN0aW9uYXJpZXM7IFBERiAxLjIpIFRoZSBhbm5vdGF0aW9uJ3MgYXBwZWFyYW5jZSBzdGF0ZSwgd2hpY2ggc2VsZWN0cyB0aGUgYXBwbGljYWJsZSBhcHBlYXJhbmNlIHN0cmVhbSBmcm9tIGFuIGFwcGVhcmFuY2Ugc3ViZGljdGlvbmFyeSAoc2VlIFNlY3Rpb24gMTIuNS41LCBcIkFwcGVhcmFuY2UgU3RyZWFtc1wiKVxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jYXBwZWFyYW5jZVN0YXRlXG4gICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdhcHBlYXJhbmNlU3RhdGUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9BUy5zdWJzdHIoMSwgX0FTLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0FTID0gJy8nICsgdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNhcHRpb24gPSAnbCc7XG4gICAgICAgIHRoaXMuYXBwZWFyYW5jZVN0YXRlID0gJ09mZic7XG4gICAgICAgIC8vIHRvZG86IHNldCBBcHBlYXJhbmNlVHlwZSBhcyB2YXJpYWJsZSB0aGF0IGNhbiBiZSBzZXQgZnJvbSB0aGVcbiAgICAgICAgLy8gb3V0c2lkZS4uLlxuICAgICAgICB0aGlzLl9BcHBlYXJhbmNlVHlwZSA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGU7XG4gICAgICAgIC8vIFRoZSBEZWZhdWx0IGFwcGVhcmFuY2VUeXBlIGlzIHRoZSBDaXJjbGVcbiAgICAgICAgdGhpcy5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCA9IHRoaXMuX0FwcGVhcmFuY2VUeXBlLmNyZWF0ZUFwcGVhcmFuY2VTdHJlYW0odGhpcy5vcHRpb25OYW1lKTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1DaGlsZENsYXNzLCBBY3JvRm9ybUZpZWxkKTtcblxuICAgIEFjcm9Gb3JtUmFkaW9CdXR0b24ucHJvdG90eXBlLnNldEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoYXBwZWFyYW5jZSkge1xuICAgICAgICBpZiAoISgnY3JlYXRlQXBwZWFyYW5jZVN0cmVhbScgaW4gYXBwZWFyYW5jZSAmJiAnZ2V0Q0EnIGluIGFwcGVhcmFuY2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBhc3NpZ24gQXBwZWFyYW5jZSB0byBSYWRpb0J1dHRvbi4gQXBwZWFyYW5jZSB3YXMgSW52YWxpZCFcIik7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgb2JqSWQgaW4gdGhpcy5LaWRzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5LaWRzLmhhc093blByb3BlcnR5KG9iaklkKSkge1xuICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuS2lkc1tvYmpJZF07XG4gICAgICAgICAgICAgICAgY2hpbGQuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgPSBhcHBlYXJhbmNlLmNyZWF0ZUFwcGVhcmFuY2VTdHJlYW0oY2hpbGQub3B0aW9uTmFtZSk7XG4gICAgICAgICAgICAgICAgY2hpbGQuY2FwdGlvbiA9IGFwcGVhcmFuY2UuZ2V0Q0EoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBBY3JvRm9ybVJhZGlvQnV0dG9uLnByb3RvdHlwZS5jcmVhdGVPcHRpb24gPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAvLyBDcmVhdGUgbmV3IENoaWxkIGZvciBSYWRpb0dyb3VwXG4gICAgICAgIHZhciBjaGlsZCA9IG5ldyBBY3JvRm9ybUNoaWxkQ2xhc3MoKTtcbiAgICAgICAgY2hpbGQuUGFyZW50ID0gdGhpcztcbiAgICAgICAgY2hpbGQub3B0aW9uTmFtZSA9IG5hbWU7XG4gICAgICAgIC8vIEFkZCB0byBQYXJlbnRcbiAgICAgICAgdGhpcy5LaWRzLnB1c2goY2hpbGQpO1xuXG4gICAgICAgIGFkZEZpZWxkLmNhbGwodGhpcywgY2hpbGQpO1xuXG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1DaGVja0JveFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1CdXR0b25cbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUNoZWNrQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUJ1dHRvbi5jYWxsKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuZm9udE5hbWUgPSAnemFwZmRpbmdiYXRzJztcbiAgICAgICAgdGhpcy5jYXB0aW9uID0gJzMnO1xuICAgICAgICB0aGlzLmFwcGVhcmFuY2VTdGF0ZSA9ICdPbic7XG4gICAgICAgIHRoaXMudmFsdWUgPSBcIk9uXCI7XG4gICAgICAgIHRoaXMudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgIHRoaXMuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgPSBBY3JvRm9ybUFwcGVhcmFuY2UuQ2hlY2tCb3guY3JlYXRlQXBwZWFyYW5jZVN0cmVhbSgpO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUNoZWNrQm94LCBBY3JvRm9ybUJ1dHRvbik7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybVRleHRGaWVsZFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtVGV4dEZpZWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUZpZWxkLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuRlQgPSAnL1R4JztcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBtYXkgY29udGFpbiBtdWx0aXBsZSBsaW5lcyBvZiB0ZXh0OyBpZiBjbGVhciwgdGhlIGZpZWxk4oCZcyB0ZXh0IHNoYWxsIGJlIHJlc3RyaWN0ZWQgdG8gYSBzaW5nbGUgbGluZS4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNtdWx0aWxpbmVcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdtdWx0aWxpbmUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDEzKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxMyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDEzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS40KSBJZiBzZXQsIHRoZSB0ZXh0IGVudGVyZWQgaW4gdGhlIGZpZWxkIHJlcHJlc2VudHMgdGhlIHBhdGhuYW1lIG9mIGEgZmlsZSB3aG9zZSBjb250ZW50cyBzaGFsbCBiZSBzdWJtaXR0ZWQgYXMgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4gXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjZmlsZVNlbGVjdFxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2ZpbGVTZWxlY3QnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIxKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDIxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS40KSBJZiBzZXQsIHRleHQgZW50ZXJlZCBpbiB0aGUgZmllbGQgc2hhbGwgbm90IGJlIHNwZWxsLWNoZWNrZWQuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjZG9Ob3RTcGVsbENoZWNrXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZG9Ob3RTcGVsbENoZWNrJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyMykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyMyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNCkgSWYgc2V0LCB0aGUgZmllbGQgc2hhbGwgbm90IHNjcm9sbCAoaG9yaXpvbnRhbGx5IGZvciBzaW5nbGUtbGluZSBmaWVsZHMsIHZlcnRpY2FsbHkgZm9yIG11bHRpcGxlLWxpbmUgZmllbGRzKSB0byBhY2NvbW1vZGF0ZSBtb3JlIHRleHQgdGhhbiBmaXRzIHdpdGhpbiBpdHMgYW5ub3RhdGlvbiByZWN0YW5nbGUuIE9uY2UgdGhlIGZpZWxkIGlzIGZ1bGwsIG5vIGZ1cnRoZXIgdGV4dCBzaGFsbCBiZSBhY2NlcHRlZCBmb3IgaW50ZXJhY3RpdmUgZm9ybSBmaWxsaW5nOyBmb3Igbm9uaW50ZXJhY3RpdmUgZm9ybSBmaWxsaW5nLCB0aGUgZmlsbGVyIHNob3VsZCB0YWtlIGNhcmUgbm90IHRvIGFkZCBtb3JlIGNoYXJhY3RlciB0aGFuIHdpbGwgdmlzaWJseSBmaXQgaW4gdGhlIGRlZmluZWQgYXJlYS4gXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjZG9Ob3RTY3JvbGxcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdkb05vdFNjcm9sbCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjQpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjUpIE1heSBiZSBzZXQgb25seSBpZiB0aGUgTWF4TGVuIGVudHJ5IGlzIHByZXNlbnQgaW4gdGhlIHRleHQgZmllbGQgZGljdGlvbmFyeSAoc2VlIFRhYmxlIDIyOSkgYW5kIGlmIHRoZSBNdWx0aWxpbmUsIFBhc3N3b3JkLCBhbmQgRmlsZVNlbGVjdCBmbGFncyBhcmUgY2xlYXIuIElmIHNldCwgdGhlIGZpZWxkIHNoYWxsIGJlIGF1dG9tYXRpY2FsbHkgZGl2aWRlZCBpbnRvIGFzIG1hbnkgZXF1YWxseSBzcGFjZWQgcG9zaXRpb25zLCBvciBjb21icywgYXMgdGhlIHZhbHVlIG9mIE1heExlbiwgYW5kIHRoZSB0ZXh0IGlzIGxhaWQgb3V0IGludG8gdGhvc2UgY29tYnMuXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjY29tYlxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NvbWInLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI1KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyNSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDI1KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS41KSBJZiBzZXQsIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIHNoYWxsIGJlIGEgcmljaCB0ZXh0IHN0cmluZyAoc2VlIDEyLjcuMy40LCDigJxSaWNoIFRleHQgU3RyaW5nc+KAnSkuIElmIHRoZSBmaWVsZCBoYXMgYSB2YWx1ZSwgdGhlIFJWIGVudHJ5IG9mIHRoZSBmaWVsZCBkaWN0aW9uYXJ5IChUYWJsZSAyMjIpIHNoYWxsIHNwZWNpZnkgdGhlIHJpY2ggdGV4dCBzdHJpbmcuXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjcmljaFRleHRcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdyaWNoVGV4dCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjYpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI2KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9NYXhMZW4gPSBudWxsO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ01heExlbicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9NYXhMZW47XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfTWF4TGVuID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChPcHRpb25hbDsgaW5oZXJpdGFibGUpIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgZmllbGTigJlzIHRleHQsIGluIGNoYXJhY3RlcnMuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjbWF4TGVuZ3RoXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdtYXhMZW5ndGgnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9NYXhMZW47XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgX01heExlbiA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2hhc0FwcGVhcmFuY2VTdHJlYW0nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLlYgfHwgdGhpcy5EVik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtVGV4dEZpZWxkLCBBY3JvRm9ybUZpZWxkKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtUGFzc3dvcmRGaWVsZFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1UZXh0RmllbGRcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybVBhc3N3b3JkRmllbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtVGV4dEZpZWxkLmNhbGwodGhpcyk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgZmllbGQgaXMgaW50ZW5kZWQgZm9yIGVudGVyaW5nIGEgc2VjdXJlIHBhc3N3b3JkIHRoYXQgc2hvdWxkIG5vdCBiZSBlY2hvZWQgdmlzaWJseSB0byB0aGUgc2NyZWVuLiBDaGFyYWN0ZXJzIHR5cGVkIGZyb20gdGhlIGtleWJvYXJkIHNoYWxsIGluc3RlYWQgYmUgZWNob2VkIGluIHNvbWUgdW5yZWFkYWJsZSBmb3JtLCBzdWNoIGFzIGFzdGVyaXNrcyBvciBidWxsZXQgY2hhcmFjdGVycy5cbiAgICAgICAgKiBOT1RFIFRvIHByb3RlY3QgcGFzc3dvcmQgY29uZmlkZW50aWFsaXR5LCByZWFkZXJzIHNob3VsZCBuZXZlciBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIHRleHQgZmllbGQgaW4gdGhlIFBERiBmaWxlIGlmIHRoaXMgZmxhZyBpcyBzZXQuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjcGFzc3dvcmRcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdwYXNzd29yZCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMTQpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMTQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucGFzc3dvcmQgPSB0cnVlO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybVBhc3N3b3JkRmllbGQsIEFjcm9Gb3JtVGV4dEZpZWxkKTtcblxuXG4gICAgLy8gQ29udGFpbnMgTWV0aG9kcyBmb3IgY3JlYXRpbmcgc3RhbmRhcmQgYXBwZWFyYW5jZXNcbiAgICB2YXIgQWNyb0Zvcm1BcHBlYXJhbmNlID0ge1xuICAgICAgICBDaGVja0JveDoge1xuICAgICAgICAgICAgY3JlYXRlQXBwZWFyYW5jZVN0cmVhbTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBhcHBlYXJhbmNlID0ge1xuICAgICAgICAgICAgICAgICAgICBOOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPbjogQWNyb0Zvcm1BcHBlYXJhbmNlLkNoZWNrQm94Llllc05vcm1hbFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBEOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPbjogQWNyb0Zvcm1BcHBlYXJhbmNlLkNoZWNrQm94Llllc1B1c2hEb3duLFxuICAgICAgICAgICAgICAgICAgICAgICAgT2ZmOiBBY3JvRm9ybUFwcGVhcmFuY2UuQ2hlY2tCb3guT2ZmUHVzaERvd25cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gYXBwZWFyYW5jZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBPbiBBcHBlYXJhbmNlIGZvciBhIENoZWNrQm94XG4gICAgICAgICAgICAgICogXG4gICAgICAgICAgICAgICogQHJldHVybnMge0Fjcm9Gb3JtWE9iamVjdH1cbiAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIFllc1B1c2hEb3duOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgZm9udEtleSA9IHNjb3BlLmludGVybmFsLmdldEZvbnQoZm9ybU9iamVjdC5mb250TmFtZSwgZm9ybU9iamVjdC5mb250U3R5bGUpLmlkO1xuICAgICAgICAgICAgICAgIHZhciBlbmNvZGVkQ29sb3IgPSBzY29wZS5fX3ByaXZhdGVfXy5lbmNvZGVDb2xvclN0cmluZyhmb3JtT2JqZWN0LmNvbG9yKTtcbiAgICAgICAgICAgICAgICB2YXIgY2FsY1JlcyA9IGNhbGN1bGF0ZVgoZm9ybU9iamVjdCwgZm9ybU9iamVjdC5jYXB0aW9uKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAuNzQ5MDIzIGdcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkpICsgXCIgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIkJNQ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgMSByZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi9cIiArIGZvbnRLZXkgKyBcIiBcIiArIGYyKGNhbGNSZXMuZm9udFNpemUpICsgXCIgVGYgXCIgKyBlbmNvZGVkQ29sb3IpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiQlRcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goY2FsY1Jlcy50ZXh0KTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIkVUXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIkVNQ1wiKTtcbiAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgWWVzTm9ybWFsOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBmb250S2V5ID0gc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udChmb3JtT2JqZWN0LmZvbnROYW1lLCBmb3JtT2JqZWN0LmZvbnRTdHlsZSkuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIGVuY29kZWRDb2xvciA9IHNjb3BlLl9fcHJpdmF0ZV9fLmVuY29kZUNvbG9yU3RyaW5nKGZvcm1PYmplY3QuY29sb3IpO1xuICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0ID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIGNhbGNSZXMgPSBjYWxjdWxhdGVYKGZvcm1PYmplY3QsIGZvcm1PYmplY3QuY2FwdGlvbik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIxIGdcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgXCIgKyBmMih3aWR0aCkgKyBcIiBcIiArIGYyKGhlaWdodCkgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCAwIDEgcmdcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgXCIgKyBmMih3aWR0aCAtIDEpICsgXCIgXCIgKyBmMihoZWlnaHQgLSAxKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiV1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIm5cIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIGdcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJCVFwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi9cIiArIGZvbnRLZXkgKyBcIiBcIiArIGYyKGNhbGNSZXMuZm9udFNpemUpICsgXCIgVGYgXCIgKyBlbmNvZGVkQ29sb3IpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGNhbGNSZXMudGV4dCk7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJFVFwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAqIFJldHVybnMgdGhlIHN0YW5kYXJkIE9mZiBBcHBlYXJhbmNlIGZvciBhIENoZWNrQm94XG4gICAgICAgICAgICAgICogXG4gICAgICAgICAgICAgICogQHJldHVybnMge0Fjcm9Gb3JtWE9iamVjdH1cbiAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIE9mZlB1c2hEb3duOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAuNzQ5MDIzIGdcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkpICsgXCIgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIFJhZGlvQnV0dG9uOiB7XG4gICAgICAgICAgICBDaXJjbGU6IHtcbiAgICAgICAgICAgICAgICBjcmVhdGVBcHBlYXJhbmNlU3RyZWFtOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBEOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09mZic6IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGUuT2ZmUHVzaERvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBOOiB7fVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtQ29udGVudC5OW25hbWVdID0gQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZS5ZZXNOb3JtYWw7XG4gICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50LkRbbmFtZV0gPSBBY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ2lyY2xlLlllc1B1c2hEb3duO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXRDQTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2wnO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBZZXNOb3JtYWw6IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgICAgIC8vIE1ha2UgdGhlIFJhZGl1cyBvZiB0aGUgQ2lyY2xlIHJlbGF0aXZlIHRvIG1pbihoZWlnaHQsIHdpZHRoKSBvZiBmb3JtT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIHZhciBEb3RSYWRpdXMgPSAoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIDw9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpID8gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC8gNCA6IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLyA0O1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQm9yZGVycGFkZGluZy4uLlxuICAgICAgICAgICAgICAgICAgICBEb3RSYWRpdXMgPSBOdW1iZXIoKERvdFJhZGl1cyAqIDAuOSkudG9GaXhlZCg1KSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLkJlemllcl9DO1xuICAgICAgICAgICAgICAgICAgICB2YXIgRG90UmFkaXVzQmV6aWVyID0gTnVtYmVyKChEb3RSYWRpdXMgKiBjKS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICAqIFRoZSBGb2xsb3dpbmcgaXMgYSBDaXJjbGUgY3JlYXRlZCB3aXRoIEJlemllci1DdXJ2ZXMuXG4gICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgMCAwIDEgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyAyKSArIFwiIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDIpICsgXCIgY21cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKERvdFJhZGl1cyArIFwiIDAgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goRG90UmFkaXVzICsgXCIgXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiBcIiArIERvdFJhZGl1c0JlemllciArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgMCBcIiArIERvdFJhZGl1cyArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsgRG90UmFkaXVzQmV6aWVyICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiBcIiArIERvdFJhZGl1c0JlemllciArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBEb3RSYWRpdXMgKyBcIiAtXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiAtXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiAwIC1cIiArIERvdFJhZGl1cyArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKERvdFJhZGl1c0JlemllciArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgLVwiICsgRG90UmFkaXVzQmV6aWVyICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFllc1B1c2hEb3duOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgRG90UmFkaXVzID0gKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSA8PSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyA0IDogQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBCb3JkZXJwYWRkaW5nLi4uXG4gICAgICAgICAgICAgICAgICAgIHZhciBEb3RSYWRpdXMgPSBOdW1iZXIoKERvdFJhZGl1cyAqIDAuOSkudG9GaXhlZCg1KSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgcmVzdWx0cyBmb3IgbGF0ZXIgdXNlOyBubyBuZWVkIHRvIHdhc3RlXG4gICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NvciB0aWNrcyBvbiBkb2luZyBtYXRoXG4gICAgICAgICAgICAgICAgICAgIHZhciBrID0gTnVtYmVyKChEb3RSYWRpdXMgKiAyKS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtjID0gTnVtYmVyKChrICogQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLkJlemllcl9DKS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRjID0gTnVtYmVyKChEb3RSYWRpdXMgKiBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuQmV6aWVyX0MpLnRvRml4ZWQoNSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMC43NDkwMjMgZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgMCAwIDEgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyAyKSArIFwiIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDIpICsgXCIgY21cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGsgKyBcIiAwIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGsgKyBcIiBcIiArIGtjICsgXCIgXCIgKyBrYyArIFwiIFwiICsgayArIFwiIDAgXCIgKyBrICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBrYyArIFwiIFwiICsgayArIFwiIC1cIiArIGsgKyBcIiBcIiArIGtjICsgXCIgLVwiICsgayArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBrICsgXCIgLVwiICsga2MgKyBcIiAtXCIgKyBrYyArIFwiIC1cIiArIGsgKyBcIiAwIC1cIiArIGsgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChrYyArIFwiIC1cIiArIGsgKyBcIiBcIiArIGsgKyBcIiAtXCIgKyBrYyArIFwiIFwiICsgayArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCBnXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSAwIDAgMSBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAvIDIpICsgXCIgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC8gMikgKyBcIiBjbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goRG90UmFkaXVzICsgXCIgMCBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlwiICsgRG90UmFkaXVzICsgXCIgXCIgKyBkYyArIFwiIFwiICsgZGMgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIDAgXCIgKyBEb3RSYWRpdXMgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIGRjICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiBcIiArIGRjICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIERvdFJhZGl1cyArIFwiIC1cIiArIGRjICsgXCIgLVwiICsgZGMgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiAwIC1cIiArIERvdFJhZGl1cyArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGRjICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAtXCIgKyBkYyArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBPZmZQdXNoRG93bjogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIERvdFJhZGl1cyA9IChBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgPD0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC8gNCA6IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLyA0O1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQm9yZGVycGFkZGluZy4uLlxuICAgICAgICAgICAgICAgICAgICBEb3RSYWRpdXMgPSBOdW1iZXIoKERvdFJhZGl1cyAqIDAuOSkudG9GaXhlZCg1KSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgcmVzdWx0cyBmb3IgbGF0ZXIgdXNlOyBubyBuZWVkIHRvIHdhc3RlXG4gICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NvciB0aWNrcyBvbiBkb2luZyBtYXRoXG4gICAgICAgICAgICAgICAgICAgIHZhciBrID0gTnVtYmVyKChEb3RSYWRpdXMgKiAyKS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtjID0gTnVtYmVyKChrICogQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLkJlemllcl9DKS50b0ZpeGVkKDUpKTtcblxuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAuNzQ5MDIzIGdcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIxIDAgMCAxIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC8gMikgKyBcIiBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLyAyKSArIFwiIGNtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChrICsgXCIgMCBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChrICsgXCIgXCIgKyBrYyArIFwiIFwiICsga2MgKyBcIiBcIiArIGsgKyBcIiAwIFwiICsgayArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsga2MgKyBcIiBcIiArIGsgKyBcIiAtXCIgKyBrICsgXCIgXCIgKyBrYyArIFwiIC1cIiArIGsgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsgayArIFwiIC1cIiArIGtjICsgXCIgLVwiICsga2MgKyBcIiAtXCIgKyBrICsgXCIgMCAtXCIgKyBrICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goa2MgKyBcIiAtXCIgKyBrICsgXCIgXCIgKyBrICsgXCIgLVwiICsga2MgKyBcIiBcIiArIGsgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgQ3Jvc3M6IHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICogQ3JlYXRlcyB0aGUgQWN0dWFsIEFwcGVhcmFuY2VEaWN0aW9uYXJ5LVJlZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICogXG4gICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICAgICAgICAgICAgICAqIEBpZ25vcmVcbiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY3JlYXRlQXBwZWFyYW5jZVN0cmVhbTogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgRDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPZmYnOiBBY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ3Jvc3MuT2ZmUHVzaERvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBOOiB7fVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtQ29udGVudC5OW25hbWVdID0gQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNyb3NzLlllc05vcm1hbDtcbiAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQuRFtuYW1lXSA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5Dcm9zcy5ZZXNQdXNoRG93bjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ2V0Q0E6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc4J1xuICAgICAgICAgICAgICAgIH0sXG5cblxuICAgICAgICAgICAgICAgIFllc05vcm1hbDogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNyb3NzID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmNhbGN1bGF0ZUNyb3NzKGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSAxIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC0gMikgKyBcIiBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLSAyKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIldcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiblwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDEueCkgKyBcIiBcIiArIGYyKGNyb3NzLngxLnkpICsgXCIgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDIueCkgKyBcIiBcIiArIGYyKGNyb3NzLngyLnkpICsgXCIgbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDQueCkgKyBcIiBcIiArIGYyKGNyb3NzLng0LnkpICsgXCIgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDMueCkgKyBcIiBcIiArIGYyKGNyb3NzLngzLnkpICsgXCIgbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJzXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgWWVzUHVzaERvd246IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY3Jvc3MgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuY2FsY3VsYXRlQ3Jvc3MoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwLjc0OTAyMyBnXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSkgKyBcIiBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgMSBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAtIDIpICsgXCIgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC0gMikgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJXXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIm5cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLngxLngpICsgXCIgXCIgKyBmMihjcm9zcy54MS55KSArIFwiIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLngyLngpICsgXCIgXCIgKyBmMihjcm9zcy54Mi55KSArIFwiIGxcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLng0LngpICsgXCIgXCIgKyBmMihjcm9zcy54NC55KSArIFwiIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLngzLngpICsgXCIgXCIgKyBmMihjcm9zcy54My55KSArIFwiIGxcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwic1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE9mZlB1c2hEb3duOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAuNzQ5MDIzIGdcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCAwIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpKSArIFwiIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSkgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgICogUmV0dXJucyB0aGUgc3RhbmRhcmQgQXBwZWFyYW5jZVxuICAgICAgICAgICogXG4gICAgICAgICAgKiBAcmV0dXJucyB7QWNyb0Zvcm1YT2JqZWN0fVxuICAgICAgICAgICovXG4gICAgICAgIGNyZWF0ZURlZmF1bHRBcHBlYXJhbmNlU3RyZWFtOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgLy8gU2V0IEhlbHZldGljYSB0byBTdGFuZGFyZCBGb250IChzaXplOiBhdXRvKVxuICAgICAgICAgICAgLy8gQ29sb3I6IEJsYWNrXG4gICAgICAgICAgICB2YXIgZm9udEtleSA9IHNjb3BlLmludGVybmFsLmdldEZvbnQoZm9ybU9iamVjdC5mb250TmFtZSwgZm9ybU9iamVjdC5mb250U3R5bGUpLmlkO1xuICAgICAgICAgICAgdmFyIGVuY29kZWRDb2xvciA9IHNjb3BlLl9fcHJpdmF0ZV9fLmVuY29kZUNvbG9yU3RyaW5nKGZvcm1PYmplY3QuY29sb3IpO1xuICAgICAgICAgICAgdmFyIGZvbnRTaXplID0gZm9ybU9iamVjdC5mb250U2l6ZTtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSAnLycgKyBmb250S2V5ICsgJyAnICsgZm9udFNpemUgKyAnIFRmICcgKyBlbmNvZGVkQ29sb3I7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbCA9IHtcbiAgICAgICAgQmV6aWVyX0M6IDAuNTUxOTE1MDI0NDk0LFxuXG4gICAgICAgIGNhbGN1bGF0ZUNyb3NzOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuXG4gICAgICAgICAgICB2YXIgd2lkdGggPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICB2YXIgaGVpZ2h0ID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgIHZhciBhID0gTWF0aC5taW4od2lkdGgsIGhlaWdodCk7XG5cbiAgICAgICAgICAgIHZhciBjcm9zcyA9IHtcbiAgICAgICAgICAgICAgICB4MTogeyAvLyB1cHBlckxlZnRcbiAgICAgICAgICAgICAgICAgICAgeDogKHdpZHRoIC0gYSkgLyAyLFxuICAgICAgICAgICAgICAgICAgICB5OiAoKGhlaWdodCAtIGEpIC8gMikgKyBhLC8vIGhlaWdodCAtIGJvcmRlclBhZGRpbmdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHgyOiB7IC8vIGxvd2VyUmlnaHRcbiAgICAgICAgICAgICAgICAgICAgeDogKCh3aWR0aCAtIGEpIC8gMikgKyBhLFxuICAgICAgICAgICAgICAgICAgICB5OiAoKGhlaWdodCAtIGEpIC8gMikvLyBib3JkZXJQYWRkaW5nXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB4MzogeyAvLyBsb3dlckxlZnRcbiAgICAgICAgICAgICAgICAgICAgeDogKHdpZHRoIC0gYSkgLyAyLFxuICAgICAgICAgICAgICAgICAgICB5OiAoKGhlaWdodCAtIGEpIC8gMikvLyBib3JkZXJQYWRkaW5nXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB4NDogeyAvLyB1cHBlclJpZ2h0XG4gICAgICAgICAgICAgICAgICAgIHg6ICgod2lkdGggLSBhKSAvIDIpICsgYSxcbiAgICAgICAgICAgICAgICAgICAgeTogKChoZWlnaHQgLSBhKSAvIDIpICsgYSwvLyBoZWlnaHQgLSBib3JkZXJQYWRkaW5nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIGNyb3NzO1xuICAgICAgICB9LFxuICAgIH07XG4gICAgQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoID0gZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IDA7XG4gICAgICAgIGlmICh0eXBlb2YgZm9ybU9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgcmVzdWx0ID0gc2NhbGUoZm9ybU9iamVjdC5SZWN0WzJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodCA9IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAwO1xuICAgICAgICBpZiAodHlwZW9mIGZvcm1PYmplY3QgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHNjYWxlKGZvcm1PYmplY3QuUmVjdFszXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLy8gUHVibGljOlxuXG4gICAgLyoqXG4gICAgKiBBZGQgYW4gQWNyb0Zvcm0tRmllbGQgdG8gdGhlIGpzUERGLWluc3RhbmNlXG4gICAgKlxuICAgICogQG5hbWUgYWRkRmllbGRcbiAgICAqIEBmdW5jdGlvbiBcbiAgICAqIEBpbnN0YW5jZVxuICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkT2JqZWN0XG4gICAgKiBAcmV0dXJucyB7anNQREZ9XG4gICAgKi9cbiAgICB2YXIgYWRkRmllbGQgPSBqc1BERkFQSS5hZGRGaWVsZCA9IGZ1bmN0aW9uIChmaWVsZE9iamVjdCkge1xuICAgICAgICBpbml0aWFsaXplQWNyb0Zvcm0uY2FsbCh0aGlzKTtcblxuICAgICAgICBpZiAoZmllbGRPYmplY3QgaW5zdGFuY2VvZiBBY3JvRm9ybUZpZWxkKSB7XG4gICAgICAgICAgICBwdXRGb3JtLmNhbGwodGhpcywgZmllbGRPYmplY3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5hZGRGaWVsZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBmaWVsZE9iamVjdC5wYWdlID0gc2NvcGUuaW50ZXJuYWwuZ2V0Q3VycmVudFBhZ2VJbmZvKCkucGFnZU51bWJlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQG5hbWUgYWRkQnV0dG9uXG4gICAgKiBAZnVuY3Rpb25cbiAgICAqIEBpbnN0YW5jZVxuICAgICogQHBhcmFtIHtBY3JvRm9ybUJ1dHRvbn0gb3B0aW9uc1xuICAgICogQHJldHVybnMge2pzUERGfVxuICAgICogQGRlcHJlY2F0ZWRcbiAgICAqL1xuICAgIGpzUERGQVBJLmFkZEJ1dHRvbiA9IGZ1bmN0aW9uIChidXR0b24pIHtcbiAgICAgICAgaWYgKGJ1dHRvbiBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5hZGRCdXR0b24uJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZEZpZWxkLmNhbGwodGhpcywgYnV0dG9uKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBAbmFtZSBhZGRUZXh0RmllbGRcbiAgICAqIEBmdW5jdGlvblxuICAgICogQGluc3RhbmNlXG4gICAgKiBAcGFyYW0ge0Fjcm9Gb3JtVGV4dEZpZWxkfSB0ZXh0RmllbGRcbiAgICAqIEByZXR1cm5zIHtqc1BERn1cbiAgICAqIEBkZXByZWNhdGVkXG4gICAgKi9cbiAgICBqc1BERkFQSS5hZGRUZXh0RmllbGQgPSBmdW5jdGlvbiAodGV4dEZpZWxkKSB7XG4gICAgICAgIGlmICh0ZXh0RmllbGQgaW5zdGFuY2VvZiBBY3JvRm9ybVRleHRGaWVsZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuYWRkVGV4dEZpZWxkLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRGaWVsZC5jYWxsKHRoaXMsIHRleHRGaWVsZCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQG5hbWUgYWRkQ2hvaWNlRmllbGRcbiAgICAqIEBmdW5jdGlvblxuICAgICogQGluc3RhbmNlXG4gICAgKiBAcGFyYW0ge0Fjcm9Gb3JtQ2hvaWNlRmllbGR9IFxuICAgICogQHJldHVybnMge2pzUERGfVxuICAgICogQGRlcHJlY2F0ZWRcbiAgICAqL1xuICAgIGpzUERGQVBJLmFkZENob2ljZUZpZWxkID0gZnVuY3Rpb24gKGNob2ljZUZpZWxkKSB7XG4gICAgICAgIGlmIChjaG9pY2VGaWVsZCBpbnN0YW5jZW9mIEFjcm9Gb3JtQ2hvaWNlRmllbGQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLmFkZENob2ljZUZpZWxkLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRGaWVsZC5jYWxsKHRoaXMsIGNob2ljZUZpZWxkKTtcbiAgICB9O1xuXG4gICAgaWYgKHR5cGVvZiBnbG9iYWxPYmogPT0gXCJvYmplY3RcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIkNob2ljZUZpZWxkXCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIkxpc3RCb3hcIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiQ29tYm9Cb3hcIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiRWRpdEJveFwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJCdXR0b25cIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiUHVzaEJ1dHRvblwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJSYWRpb0J1dHRvblwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJDaGVja0JveFwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJUZXh0RmllbGRcIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiUGFzc3dvcmRGaWVsZFwiXSkgPT09IFwidW5kZWZpbmVkXCJcbiAgICApIHtcbiAgICAgICAgZ2xvYmFsT2JqW1wiQ2hvaWNlRmllbGRcIl0gPSBBY3JvRm9ybUNob2ljZUZpZWxkO1xuICAgICAgICBnbG9iYWxPYmpbXCJMaXN0Qm94XCJdID0gQWNyb0Zvcm1MaXN0Qm94O1xuICAgICAgICBnbG9iYWxPYmpbXCJDb21ib0JveFwiXSA9IEFjcm9Gb3JtQ29tYm9Cb3g7XG4gICAgICAgIGdsb2JhbE9ialtcIkVkaXRCb3hcIl0gPSBBY3JvRm9ybUVkaXRCb3g7XG4gICAgICAgIGdsb2JhbE9ialtcIkJ1dHRvblwiXSA9IEFjcm9Gb3JtQnV0dG9uO1xuICAgICAgICBnbG9iYWxPYmpbXCJQdXNoQnV0dG9uXCJdID0gQWNyb0Zvcm1QdXNoQnV0dG9uO1xuICAgICAgICBnbG9iYWxPYmpbXCJSYWRpb0J1dHRvblwiXSA9IEFjcm9Gb3JtUmFkaW9CdXR0b247XG4gICAgICAgIGdsb2JhbE9ialtcIkNoZWNrQm94XCJdID0gQWNyb0Zvcm1DaGVja0JveDtcbiAgICAgICAgZ2xvYmFsT2JqW1wiVGV4dEZpZWxkXCJdID0gQWNyb0Zvcm1UZXh0RmllbGQ7XG4gICAgICAgIGdsb2JhbE9ialtcIlBhc3N3b3JkRmllbGRcIl0gPSBBY3JvRm9ybVBhc3N3b3JkRmllbGQ7XG5cbiAgICAgICAgLy8gYmFja3dhcmRzQ29tcGF0aWJpbGl0eVxuICAgICAgICBnbG9iYWxPYmpbXCJBY3JvRm9ybVwiXSA9IHsgQXBwZWFyYW5jZTogQWNyb0Zvcm1BcHBlYXJhbmNlIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgLy8gY29uc29sZS53YXJuKFwiQWNyb0Zvcm0tQ2xhc3NlcyBhcmUgbm90IHBvcHVsYXRlZCBpbnRvIGdsb2JhbC1uYW1lc3BhY2UsIGJlY2F1c2UgdGhlIGNsYXNzLU5hbWVzIGV4aXN0IGFscmVhZHkuIFRoaXMgYXZvaWRzIGNvbmZsaWN0cyB3aXRoIHRoZSBhbHJlYWR5IHVzZWQgZnJhbWV3b3JrLlwiKTtcbiAgICB9XG5cbiAgICBqc1BERkFQSS5BY3JvRm9ybUNob2ljZUZpZWxkID0gQWNyb0Zvcm1DaG9pY2VGaWVsZDtcbiAgICBqc1BERkFQSS5BY3JvRm9ybUxpc3RCb3ggPSBBY3JvRm9ybUxpc3RCb3g7XG4gICAganNQREZBUEkuQWNyb0Zvcm1Db21ib0JveCA9IEFjcm9Gb3JtQ29tYm9Cb3g7XG4gICAganNQREZBUEkuQWNyb0Zvcm1FZGl0Qm94ID0gQWNyb0Zvcm1FZGl0Qm94O1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtQnV0dG9uID0gQWNyb0Zvcm1CdXR0b247XG4gICAganNQREZBUEkuQWNyb0Zvcm1QdXNoQnV0dG9uID0gQWNyb0Zvcm1QdXNoQnV0dG9uO1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtUmFkaW9CdXR0b24gPSBBY3JvRm9ybVJhZGlvQnV0dG9uO1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtQ2hlY2tCb3ggPSBBY3JvRm9ybUNoZWNrQm94O1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtVGV4dEZpZWxkID0gQWNyb0Zvcm1UZXh0RmllbGQ7XG4gICAganNQREZBUEkuQWNyb0Zvcm1QYXNzd29yZEZpZWxkID0gQWNyb0Zvcm1QYXNzd29yZEZpZWxkO1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtQXBwZWFyYW5jZSA9IEFjcm9Gb3JtQXBwZWFyYW5jZTtcblxuICAgIGpzUERGQVBJLkFjcm9Gb3JtID0ge1xuICAgICAgICBDaG9pY2VGaWVsZDogQWNyb0Zvcm1DaG9pY2VGaWVsZCxcbiAgICAgICAgTGlzdEJveDogQWNyb0Zvcm1MaXN0Qm94LFxuICAgICAgICBDb21ib0JveDogQWNyb0Zvcm1Db21ib0JveCxcbiAgICAgICAgRWRpdEJveDogQWNyb0Zvcm1FZGl0Qm94LFxuICAgICAgICBCdXR0b246IEFjcm9Gb3JtQnV0dG9uLFxuICAgICAgICBQdXNoQnV0dG9uOiBBY3JvRm9ybVB1c2hCdXR0b24sXG4gICAgICAgIFJhZGlvQnV0dG9uOiBBY3JvRm9ybVJhZGlvQnV0dG9uLFxuICAgICAgICBDaGVja0JveDogQWNyb0Zvcm1DaGVja0JveCxcbiAgICAgICAgVGV4dEZpZWxkOiBBY3JvRm9ybVRleHRGaWVsZCxcbiAgICAgICAgUGFzc3dvcmRGaWVsZDogQWNyb0Zvcm1QYXNzd29yZEZpZWxkLFxuICAgICAgICBBcHBlYXJhbmNlOiBBY3JvRm9ybUFwcGVhcmFuY2VcbiAgICB9O1xuXG4gICAganNQREYuQWNyb0Zvcm0gPSB7XG4gICAgICAgIENob2ljZUZpZWxkOiBBY3JvRm9ybUNob2ljZUZpZWxkLFxuICAgICAgICBMaXN0Qm94OiBBY3JvRm9ybUxpc3RCb3gsXG4gICAgICAgIENvbWJvQm94OiBBY3JvRm9ybUNvbWJvQm94LFxuICAgICAgICBFZGl0Qm94OiBBY3JvRm9ybUVkaXRCb3gsXG4gICAgICAgIEJ1dHRvbjogQWNyb0Zvcm1CdXR0b24sXG4gICAgICAgIFB1c2hCdXR0b246IEFjcm9Gb3JtUHVzaEJ1dHRvbixcbiAgICAgICAgUmFkaW9CdXR0b246IEFjcm9Gb3JtUmFkaW9CdXR0b24sXG4gICAgICAgIENoZWNrQm94OiBBY3JvRm9ybUNoZWNrQm94LFxuICAgICAgICBUZXh0RmllbGQ6IEFjcm9Gb3JtVGV4dEZpZWxkLFxuICAgICAgICBQYXNzd29yZEZpZWxkOiBBY3JvRm9ybVBhc3N3b3JkRmllbGQsXG4gICAgICAgIEFwcGVhcmFuY2U6IEFjcm9Gb3JtQXBwZWFyYW5jZVxuICAgIH07XG59KShqc3BkZi5qc1BERiwgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdyB8fCB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWwpKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtLmpzXG4vLyBtb2R1bGUgaWQgPSA2MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIgIC8qKlxuICAgKiBqc1BERiBmcm9tSFRNTCBwbHVnaW4uIEJFVEEgc3RhZ2UuIEFQSSBzdWJqZWN0IHRvIGNoYW5nZS4gTmVlZHMgYnJvd3NlclxuICAgKiBDb3B5cmlnaHQgKGMpIDIwMTIgV2lsbG93IFN5c3RlbXMgQ29ycG9yYXRpb24sIHdpbGxvdy1zeXN0ZW1zLmNvbVxuICAgKiAgICAgICAgICAgICAgIDIwMTQgSnVhbiBQYWJsbyBHYXZpcmlhLCBodHRwczovL2dpdGh1Yi5jb20vanVhbnBnYXZpcmlhXG4gICAqICAgICAgICAgICAgICAgMjAxNCBEaWVnbyBDYXNvcnJhbiwgaHR0cHM6Ly9naXRodWIuY29tL2RpZWdvY3JcbiAgICogICAgICAgICAgICAgICAyMDE0IERhbmllbCBIdXNhciwgaHR0cHM6Ly9naXRodWIuY29tL2RhbmllbGh1c2FyXG4gICAqICAgICAgICAgICAgICAgMjAxNCBXb2xmZ2FuZyBHYXNzbGVyLCBodHRwczovL2dpdGh1Yi5jb20vd29vbGZnXG4gICAqICAgICAgICAgICAgICAgMjAxNCBTdGV2ZW4gU3B1bmdpbiwgaHR0cHM6Ly9naXRodWIuY29tL2ZsYW1lbmNvXG4gICAqXG4gICAqIEBsaWNlbnNlXG4gICAqIFxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cbiAgdmFyIGpzcGRmID0gcmVxdWlyZShcImpzcGRmXCIpO1xuXG4gIChmdW5jdGlvbiAoanNQREZBUEkpIHtcbiAgICB2YXIgY2xvbmUsIF9EcmlsbEZvckNvbnRlbnQsIEZvbnROYW1lREIsIEZvbnRTdHlsZU1hcCwgVGV4dEFsaWduTWFwLCBGb250V2VpZ2h0TWFwLCBGbG9hdE1hcCwgQ2xlYXJNYXAsIEdldENTUywgUHVyZ2VXaGl0ZVNwYWNlLCBSZW5kZXJlciwgUmVzb2x2ZUZvbnQsIFJlc29sdmVVbml0ZWROdW1iZXIsIFVuaXRlZE51bWJlck1hcCwgZWxlbWVudEhhbmRsZWRFbHNld2hlcmUsIGltYWdlcywgbG9hZEltZ3MsIGNoZWNrRm9yRm9vdGVyLCBwcm9jZXNzLCB0YWJsZVRvSnNvbjtcblxuICAgIGNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgQ2xvbmUucHJvdG90eXBlID0gb2JqO1xuICAgICAgICByZXR1cm4gbmV3IENsb25lKCk7XG4gICAgICB9O1xuXG4gICAgICBmdW5jdGlvbiBDbG9uZSgpIHt9XG4gICAgfSgpO1xuXG4gICAgUHVyZ2VXaGl0ZVNwYWNlID0gZnVuY3Rpb24gUHVyZ2VXaGl0ZVNwYWNlKGFycmF5KSB7XG4gICAgICB2YXIgZnJhZ21lbnQsIGksIGwsIGxUcmltbWVkLCByLCByVHJpbW1lZCwgdHJhaWxpbmdTcGFjZTtcbiAgICAgIGkgPSAwO1xuICAgICAgbCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIGZyYWdtZW50ID0gdm9pZCAwO1xuICAgICAgbFRyaW1tZWQgPSBmYWxzZTtcbiAgICAgIHJUcmltbWVkID0gZmFsc2U7XG5cbiAgICAgIHdoaWxlICghbFRyaW1tZWQgJiYgaSAhPT0gbCkge1xuICAgICAgICBmcmFnbWVudCA9IGFycmF5W2ldID0gYXJyYXlbaV0udHJpbUxlZnQoKTtcblxuICAgICAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgICAgICBsVHJpbW1lZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpKys7XG4gICAgICB9XG5cbiAgICAgIGkgPSBsIC0gMTtcblxuICAgICAgd2hpbGUgKGwgJiYgIXJUcmltbWVkICYmIGkgIT09IC0xKSB7XG4gICAgICAgIGZyYWdtZW50ID0gYXJyYXlbaV0gPSBhcnJheVtpXS50cmltUmlnaHQoKTtcblxuICAgICAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgICAgICByVHJpbW1lZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpLS07XG4gICAgICB9XG5cbiAgICAgIHIgPSAvXFxzKyQvZztcbiAgICAgIHRyYWlsaW5nU3BhY2UgPSB0cnVlO1xuICAgICAgaSA9IDA7XG5cbiAgICAgIHdoaWxlIChpICE9PSBsKSB7XG4gICAgICAgIC8vIExlYXZlIHRoZSBsaW5lIGJyZWFrcyBpbnRhY3RcbiAgICAgICAgaWYgKGFycmF5W2ldICE9IFwiXFx1MjAyOFwiKSB7XG4gICAgICAgICAgZnJhZ21lbnQgPSBhcnJheVtpXS5yZXBsYWNlKC9cXHMrL2csIFwiIFwiKTtcblxuICAgICAgICAgIGlmICh0cmFpbGluZ1NwYWNlKSB7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGZyYWdtZW50LnRyaW1MZWZ0KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICAgICAgICB0cmFpbGluZ1NwYWNlID0gci50ZXN0KGZyYWdtZW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhcnJheVtpXSA9IGZyYWdtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaSsrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyID0gZnVuY3Rpb24gUmVuZGVyZXIocGRmLCB4LCB5LCBzZXR0aW5ncykge1xuICAgICAgdGhpcy5wZGYgPSBwZGY7XG4gICAgICB0aGlzLnggPSB4O1xuICAgICAgdGhpcy55ID0geTtcbiAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5nczsgLy9saXN0IG9mIGZ1bmN0aW9ucyB3aGljaCBhcmUgY2FsbGVkIGFmdGVyIGVhY2ggZWxlbWVudC1yZW5kZXJpbmcgcHJvY2Vzc1xuXG4gICAgICB0aGlzLndhdGNoRnVuY3Rpb25zID0gW107XG4gICAgICB0aGlzLmluaXQoKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBSZXNvbHZlRm9udCA9IGZ1bmN0aW9uIFJlc29sdmVGb250KGNzc19mb250X2ZhbWlseV9zdHJpbmcpIHtcbiAgICAgIHZhciBuYW1lLCBwYXJ0LCBwYXJ0cztcbiAgICAgIG5hbWUgPSB2b2lkIDA7XG4gICAgICBwYXJ0cyA9IGNzc19mb250X2ZhbWlseV9zdHJpbmcuc3BsaXQoXCIsXCIpO1xuICAgICAgcGFydCA9IHBhcnRzLnNoaWZ0KCk7XG5cbiAgICAgIHdoaWxlICghbmFtZSAmJiBwYXJ0KSB7XG4gICAgICAgIG5hbWUgPSBGb250TmFtZURCW3BhcnQudHJpbSgpLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICBwYXJ0ID0gcGFydHMuc2hpZnQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfTtcblxuICAgIFJlc29sdmVVbml0ZWROdW1iZXIgPSBmdW5jdGlvbiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNzc19saW5lX2hlaWdodF9zdHJpbmcpIHtcbiAgICAgIC8vSUU4IGlzc3Vlc1xuICAgICAgY3NzX2xpbmVfaGVpZ2h0X3N0cmluZyA9IGNzc19saW5lX2hlaWdodF9zdHJpbmcgPT09IFwiYXV0b1wiID8gXCIwcHhcIiA6IGNzc19saW5lX2hlaWdodF9zdHJpbmc7XG5cbiAgICAgIGlmIChjc3NfbGluZV9oZWlnaHRfc3RyaW5nLmluZGV4T2YoXCJlbVwiKSA+IC0xICYmICFpc05hTihOdW1iZXIoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5yZXBsYWNlKFwiZW1cIiwgXCJcIikpKSkge1xuICAgICAgICBjc3NfbGluZV9oZWlnaHRfc3RyaW5nID0gTnVtYmVyKGNzc19saW5lX2hlaWdodF9zdHJpbmcucmVwbGFjZShcImVtXCIsIFwiXCIpKSAqIDE4LjcxOSArIFwicHhcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNzc19saW5lX2hlaWdodF9zdHJpbmcuaW5kZXhPZihcInB0XCIpID4gLTEgJiYgIWlzTmFOKE51bWJlcihjc3NfbGluZV9oZWlnaHRfc3RyaW5nLnJlcGxhY2UoXCJwdFwiLCBcIlwiKSkpKSB7XG4gICAgICAgIGNzc19saW5lX2hlaWdodF9zdHJpbmcgPSBOdW1iZXIoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5yZXBsYWNlKFwicHRcIiwgXCJcIikpICogMS4zMzMgKyBcInB4XCI7XG4gICAgICB9XG5cbiAgICAgIHZhciBub3JtYWwsIHVuZGVmLCB2YWx1ZTtcbiAgICAgIHVuZGVmID0gdm9pZCAwO1xuICAgICAgbm9ybWFsID0gMTYuMDA7XG4gICAgICB2YWx1ZSA9IFVuaXRlZE51bWJlck1hcFtjc3NfbGluZV9oZWlnaHRfc3RyaW5nXTtcblxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdmFsdWUgPSB7XG4gICAgICAgIFwieHgtc21hbGxcIjogOSxcbiAgICAgICAgXCJ4LXNtYWxsXCI6IDExLFxuICAgICAgICBzbWFsbDogMTMsXG4gICAgICAgIG1lZGl1bTogMTYsXG4gICAgICAgIGxhcmdlOiAxOSxcbiAgICAgICAgXCJ4LWxhcmdlXCI6IDIzLFxuICAgICAgICBcInh4LWxhcmdlXCI6IDI4LFxuICAgICAgICBhdXRvOiAwXG4gICAgICB9W2Nzc19saW5lX2hlaWdodF9zdHJpbmddO1xuXG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmKSB7XG4gICAgICAgIHJldHVybiBVbml0ZWROdW1iZXJNYXBbY3NzX2xpbmVfaGVpZ2h0X3N0cmluZ10gPSB2YWx1ZSAvIG5vcm1hbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlID0gcGFyc2VGbG9hdChjc3NfbGluZV9oZWlnaHRfc3RyaW5nKSkge1xuICAgICAgICByZXR1cm4gVW5pdGVkTnVtYmVyTWFwW2Nzc19saW5lX2hlaWdodF9zdHJpbmddID0gdmFsdWUgLyBub3JtYWw7XG4gICAgICB9XG5cbiAgICAgIHZhbHVlID0gY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5tYXRjaCgvKFtcXGRcXC5dKykocHgpLyk7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcmV0dXJuIFVuaXRlZE51bWJlck1hcFtjc3NfbGluZV9oZWlnaHRfc3RyaW5nXSA9IHBhcnNlRmxvYXQodmFsdWVbMV0pIC8gbm9ybWFsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gVW5pdGVkTnVtYmVyTWFwW2Nzc19saW5lX2hlaWdodF9zdHJpbmddID0gMTtcbiAgICB9O1xuXG4gICAgR2V0Q1NTID0gZnVuY3Rpb24gR2V0Q1NTKGVsZW1lbnQpIHtcbiAgICAgIHZhciBjc3MsIHRtcCwgY29tcHV0ZWRDU1NFbGVtZW50O1xuXG4gICAgICBjb21wdXRlZENTU0VsZW1lbnQgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgdmFyIGNvbXBDU1M7XG5cbiAgICAgICAgY29tcENTUyA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgIGlmIChkb2N1bWVudC5kZWZhdWx0VmlldyAmJiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChlbC5jdXJyZW50U3R5bGUpIHtcbiAgICAgICAgICAgIHJldHVybiBlbC5jdXJyZW50U3R5bGU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBlbC5zdHlsZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0oZWwpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgIHByb3AgPSBwcm9wLnJlcGxhY2UoLy1cXEQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2guY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGNvbXBDU1NbcHJvcF07XG4gICAgICAgIH07XG4gICAgICB9KGVsZW1lbnQpO1xuXG4gICAgICBjc3MgPSB7fTtcbiAgICAgIHRtcCA9IHZvaWQgMDtcbiAgICAgIGNzc1tcImZvbnQtZmFtaWx5XCJdID0gUmVzb2x2ZUZvbnQoY29tcHV0ZWRDU1NFbGVtZW50KFwiZm9udC1mYW1pbHlcIikpIHx8IFwidGltZXNcIjtcbiAgICAgIGNzc1tcImZvbnQtc3R5bGVcIl0gPSBGb250U3R5bGVNYXBbY29tcHV0ZWRDU1NFbGVtZW50KFwiZm9udC1zdHlsZVwiKV0gfHwgXCJub3JtYWxcIjtcbiAgICAgIGNzc1tcInRleHQtYWxpZ25cIl0gPSBUZXh0QWxpZ25NYXBbY29tcHV0ZWRDU1NFbGVtZW50KFwidGV4dC1hbGlnblwiKV0gfHwgXCJsZWZ0XCI7XG4gICAgICB0bXAgPSBGb250V2VpZ2h0TWFwW2NvbXB1dGVkQ1NTRWxlbWVudChcImZvbnQtd2VpZ2h0XCIpXSB8fCBcIm5vcm1hbFwiO1xuXG4gICAgICBpZiAodG1wID09PSBcImJvbGRcIikge1xuICAgICAgICBpZiAoY3NzW1wiZm9udC1zdHlsZVwiXSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIGNzc1tcImZvbnQtc3R5bGVcIl0gPSB0bXA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3NzW1wiZm9udC1zdHlsZVwiXSA9IHRtcCArIGNzc1tcImZvbnQtc3R5bGVcIl07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY3NzW1wiZm9udC1zaXplXCJdID0gUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJmb250LXNpemVcIikpIHx8IDE7XG4gICAgICBjc3NbXCJsaW5lLWhlaWdodFwiXSA9IFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwibGluZS1oZWlnaHRcIikpIHx8IDE7XG4gICAgICBjc3NbXCJkaXNwbGF5XCJdID0gY29tcHV0ZWRDU1NFbGVtZW50KFwiZGlzcGxheVwiKSA9PT0gXCJpbmxpbmVcIiA/IFwiaW5saW5lXCIgOiBcImJsb2NrXCI7XG4gICAgICB0bXAgPSBjc3NbXCJkaXNwbGF5XCJdID09PSBcImJsb2NrXCI7XG4gICAgICBjc3NbXCJtYXJnaW4tdG9wXCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwibWFyZ2luLXRvcFwiKSkgfHwgMDtcbiAgICAgIGNzc1tcIm1hcmdpbi1ib3R0b21cIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJtYXJnaW4tYm90dG9tXCIpKSB8fCAwO1xuICAgICAgY3NzW1wicGFkZGluZy10b3BcIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJwYWRkaW5nLXRvcFwiKSkgfHwgMDtcbiAgICAgIGNzc1tcInBhZGRpbmctYm90dG9tXCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwicGFkZGluZy1ib3R0b21cIikpIHx8IDA7XG4gICAgICBjc3NbXCJtYXJnaW4tbGVmdFwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcIm1hcmdpbi1sZWZ0XCIpKSB8fCAwO1xuICAgICAgY3NzW1wibWFyZ2luLXJpZ2h0XCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwibWFyZ2luLXJpZ2h0XCIpKSB8fCAwO1xuICAgICAgY3NzW1wicGFkZGluZy1sZWZ0XCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwicGFkZGluZy1sZWZ0XCIpKSB8fCAwO1xuICAgICAgY3NzW1wicGFkZGluZy1yaWdodFwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcInBhZGRpbmctcmlnaHRcIikpIHx8IDA7XG4gICAgICBjc3NbXCJwYWdlLWJyZWFrLWJlZm9yZVwiXSA9IGNvbXB1dGVkQ1NTRWxlbWVudChcInBhZ2UtYnJlYWstYmVmb3JlXCIpIHx8IFwiYXV0b1wiOyAvL2Zsb2F0IGFuZCBjbGVhcmluZyBvZiBmbG9hdHNcblxuICAgICAgY3NzW1wiZmxvYXRcIl0gPSBGbG9hdE1hcFtjb21wdXRlZENTU0VsZW1lbnQoXCJjc3NGbG9hdFwiKV0gfHwgXCJub25lXCI7XG4gICAgICBjc3NbXCJjbGVhclwiXSA9IENsZWFyTWFwW2NvbXB1dGVkQ1NTRWxlbWVudChcImNsZWFyXCIpXSB8fCBcIm5vbmVcIjtcbiAgICAgIGNzc1tcImNvbG9yXCJdID0gY29tcHV0ZWRDU1NFbGVtZW50KFwiY29sb3JcIik7XG4gICAgICByZXR1cm4gY3NzO1xuICAgIH07XG5cbiAgICBlbGVtZW50SGFuZGxlZEVsc2V3aGVyZSA9IGZ1bmN0aW9uIGVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlKGVsZW1lbnQsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpIHtcbiAgICAgIHZhciBoYW5kbGVycywgaSwgaXNIYW5kbGVkRWxzZXdoZXJlLCBsLCBjbGFzc05hbWVzO1xuICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gZmFsc2U7XG4gICAgICBpID0gdm9pZCAwO1xuICAgICAgbCA9IHZvaWQgMDtcbiAgICAgIGhhbmRsZXJzID0gZWxlbWVudEhhbmRsZXJzW1wiI1wiICsgZWxlbWVudC5pZF07XG5cbiAgICAgIGlmIChoYW5kbGVycykge1xuICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXJzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBpc0hhbmRsZWRFbHNld2hlcmUgPSBoYW5kbGVycyhlbGVtZW50LCByZW5kZXJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgbCA9IGhhbmRsZXJzLmxlbmd0aDtcblxuICAgICAgICAgIHdoaWxlICghaXNIYW5kbGVkRWxzZXdoZXJlICYmIGkgIT09IGwpIHtcbiAgICAgICAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzW2ldKGVsZW1lbnQsIHJlbmRlcmVyKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaGFuZGxlcnMgPSBlbGVtZW50SGFuZGxlcnNbZWxlbWVudC5ub2RlTmFtZV07XG5cbiAgICAgIGlmICghaXNIYW5kbGVkRWxzZXdoZXJlICYmIGhhbmRsZXJzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZGxlcnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzKGVsZW1lbnQsIHJlbmRlcmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpID0gMDtcbiAgICAgICAgICBsID0gaGFuZGxlcnMubGVuZ3RoO1xuXG4gICAgICAgICAgd2hpbGUgKCFpc0hhbmRsZWRFbHNld2hlcmUgJiYgaSAhPT0gbCkge1xuICAgICAgICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnNbaV0oZWxlbWVudCwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvLyBUcnkgY2xhc3MgbmFtZXNcblxuXG4gICAgICBjbGFzc05hbWVzID0gdHlwZW9mIGVsZW1lbnQuY2xhc3NOYW1lID09PSAnc3RyaW5nJyA/IGVsZW1lbnQuY2xhc3NOYW1lLnNwbGl0KCcgJykgOiBbXTtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IGNsYXNzTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaGFuZGxlcnMgPSBlbGVtZW50SGFuZGxlcnNbJy4nICsgY2xhc3NOYW1lc1tpXV07XG5cbiAgICAgICAgaWYgKCFpc0hhbmRsZWRFbHNld2hlcmUgJiYgaGFuZGxlcnMpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXJzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzKGVsZW1lbnQsIHJlbmRlcmVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgICBsID0gaGFuZGxlcnMubGVuZ3RoO1xuXG4gICAgICAgICAgICB3aGlsZSAoIWlzSGFuZGxlZEVsc2V3aGVyZSAmJiBpICE9PSBsKSB7XG4gICAgICAgICAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzW2ldKGVsZW1lbnQsIHJlbmRlcmVyKTtcbiAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXNIYW5kbGVkRWxzZXdoZXJlO1xuICAgIH07XG5cbiAgICB0YWJsZVRvSnNvbiA9IGZ1bmN0aW9uIHRhYmxlVG9Kc29uKHRhYmxlLCByZW5kZXJlcikge1xuICAgICAgdmFyIGRhdGEsIGhlYWRlcnMsIGksIGosIHJvd0RhdGEsIHRhYmxlUm93LCB0YWJsZV9vYmosIHRhYmxlX3dpdGgsIGNlbGwsIGw7XG4gICAgICBkYXRhID0gW107XG4gICAgICBoZWFkZXJzID0gW107XG4gICAgICBpID0gMDtcbiAgICAgIGwgPSAwO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0YWJsZS5yb3dzWzBdLmNlbGxzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGwgKz0gdGFibGUucm93c1swXS5jZWxsc1tqXS5jb2xTcGFuO1xuICAgICAgfVxuICAgICAgdGFibGVfd2l0aCA9IHRhYmxlLmNsaWVudFdpZHRoO1xuXG4gICAgICB3aGlsZSAoaSA8IGwpIHtcbiAgICAgICAgY2VsbCA9IHRhYmxlLnJvd3NbMF0uY2VsbHNbaV07XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjZWxsLmNvbFNwYW47IGorKykge1xuICAgICAgICAgIGhlYWRlcnNbaSArIGpdID0ge1xuICAgICAgICAgICAgbmFtZTogY2VsbC50ZXh0Q29udGVudC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJycpICsgJ18nICsgaixcbiAgICAgICAgICAgIHByb21wdDogY2VsbC50ZXh0Q29udGVudC5yZXBsYWNlKC9cXHI/XFxuL2csICcnKSxcbiAgICAgICAgICAgIHdpZHRoOiBjZWxsLmNsaWVudFdpZHRoIC8gdGFibGVfd2l0aCAqIHJlbmRlcmVyLnNldHRpbmdzLndpZHRoIC8gY2VsbC5jb2xTcGFuXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGkgKz0gajtcbiAgICAgIH1cblxuICAgICAgaSA9IDE7XG5cbiAgICAgIHdoaWxlIChpIDwgdGFibGUucm93cy5sZW5ndGgpIHtcbiAgICAgICAgdGFibGVSb3cgPSB0YWJsZS5yb3dzW2ldO1xuICAgICAgICByb3dEYXRhID0ge307XG4gICAgICAgIGogPSAwO1xuXG4gICAgICAgIHdoaWxlIChqIDwgdGFibGVSb3cuY2VsbHMubGVuZ3RoKSB7XG4gICAgICAgICAgcm93RGF0YVtoZWFkZXJzW2pdLm5hbWVdID0gdGFibGVSb3cuY2VsbHNbal0udGV4dENvbnRlbnQucmVwbGFjZSgvXFxyP1xcbi9nLCAnJyk7XG4gICAgICAgICAgaisrO1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YS5wdXNoKHJvd0RhdGEpO1xuICAgICAgICBpKys7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZV9vYmogPSB7XG4gICAgICAgIHJvd3M6IGRhdGEsXG4gICAgICAgIGhlYWRlcnM6IGhlYWRlcnNcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHZhciBTa2lwTm9kZSA9IHtcbiAgICAgIFNDUklQVDogMSxcbiAgICAgIFNUWUxFOiAxLFxuICAgICAgTk9TQ1JJUFQ6IDEsXG4gICAgICBPQkpFQ1Q6IDEsXG4gICAgICBFTUJFRDogMSxcbiAgICAgIFNFTEVDVDogMVxuICAgIH07XG4gICAgdmFyIGxpc3RDb3VudCA9IDE7XG5cbiAgICBfRHJpbGxGb3JDb250ZW50ID0gZnVuY3Rpb24gRHJpbGxGb3JDb250ZW50KGVsZW1lbnQsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpIHtcbiAgICAgIHZhciBjbiwgY25zLCBmcmFnbWVudENTUywgaSwgaXNCbG9jaywgbCwgdGFibGUyanNvbiwgY2I7XG4gICAgICBjbnMgPSBlbGVtZW50LmNoaWxkTm9kZXM7XG4gICAgICBjbiA9IHZvaWQgMDtcbiAgICAgIGZyYWdtZW50Q1NTID0gR2V0Q1NTKGVsZW1lbnQpO1xuICAgICAgaXNCbG9jayA9IGZyYWdtZW50Q1NTLmRpc3BsYXkgPT09IFwiYmxvY2tcIjtcblxuICAgICAgaWYgKGlzQmxvY2spIHtcbiAgICAgICAgcmVuZGVyZXIuc2V0QmxvY2tCb3VuZGFyeSgpO1xuICAgICAgICByZW5kZXJlci5zZXRCbG9ja1N0eWxlKGZyYWdtZW50Q1NTKTtcbiAgICAgIH1cbiAgICAgIGkgPSAwO1xuICAgICAgbCA9IGNucy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChpIDwgbCkge1xuICAgICAgICBjbiA9IGNuc1tpXTtcblxuICAgICAgICBpZiAodHlwZW9mKGNuKSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIC8vZXhlY3V0ZSBhbGwgd2F0Y2hlciBmdW5jdGlvbnMgdG8gZS5nLiByZXNldCBmbG9hdGluZ1xuICAgICAgICAgIHJlbmRlcmVyLmV4ZWN1dGVXYXRjaEZ1bmN0aW9ucyhjbik7XG4gICAgICAgICAgLyoqKiBIRUFERVIgcmVuZGVyaW5nICoqL1xuXG4gICAgICAgICAgaWYgKGNuLm5vZGVUeXBlID09PSAxICYmIGNuLm5vZGVOYW1lID09PSAnSEVBREVSJykge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IGNuOyAvL3N0b3JlIG9sZCB0b3AgbWFyZ2luXG5cbiAgICAgICAgICAgIHZhciBvbGRNYXJnaW5Ub3AgPSByZW5kZXJlci5wZGYubWFyZ2luc19kb2MudG9wOyAvL3N1YnNjcmliZSBmb3IgbmV3IHBhZ2UgZXZlbnQgYW5kIHJlbmRlciBoZWFkZXIgZmlyc3Qgb24gZXZlcnkgcGFnZVxuXG4gICAgICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgnYWRkUGFnZScsIGZ1bmN0aW9uIChwYWdlSW5mbykge1xuICAgICAgICAgICAgICAvL3NldCBjdXJyZW50IHkgcG9zaXRpb24gdG8gb2xkIG1hcmdpblxuICAgICAgICAgICAgICByZW5kZXJlci55ID0gb2xkTWFyZ2luVG9wOyAvL3JlbmRlciBhbGwgY2hpbGQgbm9kZXMgb2YgdGhlIGhlYWRlciBlbGVtZW50XG5cbiAgICAgICAgICAgICAgX0RyaWxsRm9yQ29udGVudChoZWFkZXIsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpOyAvL3NldCBtYXJnaW4gdG8gb2xkIG1hcmdpbiArIHJlbmRlcmVkIGhlYWRlciArIDEwIHNwYWNlIHRvIHByZXZlbnQgb3ZlcmxhcHBpbmdcbiAgICAgICAgICAgICAgLy9pbXBvcnRhbnQgZm9yIG90aGVyIHBsdWdpbnMgKGUuZy4gdGFibGUpIHRvIHN0YXJ0IHJlbmRlcmluZyBhdCBjb3JyZWN0IHBvc2l0aW9uIGFmdGVyIGhlYWRlclxuXG5cbiAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLnRvcCA9IHJlbmRlcmVyLnkgKyAxMDtcbiAgICAgICAgICAgICAgcmVuZGVyZXIueSArPSAxMDtcbiAgICAgICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY24ubm9kZVR5cGUgPT09IDggJiYgY24ubm9kZU5hbWUgPT09IFwiI2NvbW1lbnRcIikge1xuICAgICAgICAgICAgaWYgKH5jbi50ZXh0Q29udGVudC5pbmRleE9mKFwiQUREX1BBR0VcIikpIHtcbiAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLmFkZFBhZ2UoKTtcbiAgICAgICAgICAgICAgcmVuZGVyZXIueSA9IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy50b3A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlVHlwZSA9PT0gMSAmJiAhU2tpcE5vZGVbY24ubm9kZU5hbWVdKSB7XG4gICAgICAgICAgICAvKioqIElNQUdFIFJFTkRFUklORyAqKiovXG4gICAgICAgICAgICB2YXIgY2FjaGVkX2ltYWdlO1xuXG4gICAgICAgICAgICBpZiAoY24ubm9kZU5hbWUgPT09IFwiSU1HXCIpIHtcbiAgICAgICAgICAgICAgdmFyIHVybCA9IGNuLmdldEF0dHJpYnV0ZShcInNyY1wiKTtcbiAgICAgICAgICAgICAgY2FjaGVkX2ltYWdlID0gaW1hZ2VzWyhyZW5kZXJlci5wZGYuc0hhc2hDb2RlICYmIHJlbmRlcmVyLnBkZi5zSGFzaENvZGUodXJsKSkgfHwgdXJsXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNhY2hlZF9pbWFnZSkge1xuICAgICAgICAgICAgICBpZiAocmVuZGVyZXIucGRmLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpIC0gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmJvdHRvbSA8IHJlbmRlcmVyLnkgKyBjbi5oZWlnaHQgJiYgcmVuZGVyZXIueSA+IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy50b3ApIHtcbiAgICAgICAgICAgICAgICByZW5kZXJlci5wZGYuYWRkUGFnZSgpO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgPSByZW5kZXJlci5wZGYubWFyZ2luc19kb2MudG9wOyAvL2NoZWNrIGlmIHdlIGhhdmUgdG8gc2V0IGJhY2sgc29tZSB2YWx1ZXMgZHVlIHRvIGUuZy4gaGVhZGVyIHJlbmRlcmluZyBmb3IgbmV3IHBhZ2VcblxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLmV4ZWN1dGVXYXRjaEZ1bmN0aW9ucyhjbik7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgaW1hZ2VzQ1NTID0gR2V0Q1NTKGNuKTtcbiAgICAgICAgICAgICAgdmFyIGltYWdlWCA9IHJlbmRlcmVyLng7XG4gICAgICAgICAgICAgIHZhciBmb250VG9Vbml0UmF0aW8gPSAxMiAvIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjsgLy9kZWZpbmUgYWRkaXRpb25hbCBwYWRkaW5ncywgbWFyZ2lucyB3aGljaCBoYXZlIHRvIGJlIHRha2VuIGludG8gYWNjb3VudCBmb3IgbWFyZ2luIGNhbGN1bGF0aW9uc1xuXG4gICAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsU3BhY2VMZWZ0ID0gKGltYWdlc0NTU1tcIm1hcmdpbi1sZWZ0XCJdICsgaW1hZ2VzQ1NTW1wicGFkZGluZy1sZWZ0XCJdKSAqIGZvbnRUb1VuaXRSYXRpbztcbiAgICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxTcGFjZVJpZ2h0ID0gKGltYWdlc0NTU1tcIm1hcmdpbi1yaWdodFwiXSArIGltYWdlc0NTU1tcInBhZGRpbmctcmlnaHRcIl0pICogZm9udFRvVW5pdFJhdGlvO1xuICAgICAgICAgICAgICB2YXIgYWRkaXRpb25hbFNwYWNlVG9wID0gKGltYWdlc0NTU1tcIm1hcmdpbi10b3BcIl0gKyBpbWFnZXNDU1NbXCJwYWRkaW5nLXRvcFwiXSkgKiBmb250VG9Vbml0UmF0aW87XG4gICAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsU3BhY2VCb3R0b20gPSAoaW1hZ2VzQ1NTW1wibWFyZ2luLWJvdHRvbVwiXSArIGltYWdlc0NTU1tcInBhZGRpbmctYm90dG9tXCJdKSAqIGZvbnRUb1VuaXRSYXRpbzsgLy9pZiBmbG9hdCBpcyBzZXQgdG8gcmlnaHQsIG1vdmUgdGhlIGltYWdlIHRvIHRoZSByaWdodCBib3JkZXJcbiAgICAgICAgICAgICAgLy9hZGQgc3BhY2UgaWYgbWFyZ2luIGlzIHNldFxuXG4gICAgICAgICAgICAgIGlmIChpbWFnZXNDU1NbJ2Zsb2F0J10gIT09IHVuZGVmaW5lZCAmJiBpbWFnZXNDU1NbJ2Zsb2F0J10gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgICAgICBpbWFnZVggKz0gcmVuZGVyZXIuc2V0dGluZ3Mud2lkdGggLSBjbi53aWR0aCAtIGFkZGl0aW9uYWxTcGFjZVJpZ2h0O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGltYWdlWCArPSBhZGRpdGlvbmFsU3BhY2VMZWZ0O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLmFkZEltYWdlKGNhY2hlZF9pbWFnZSwgaW1hZ2VYLCByZW5kZXJlci55ICsgYWRkaXRpb25hbFNwYWNlVG9wLCBjbi53aWR0aCwgY24uaGVpZ2h0KTtcbiAgICAgICAgICAgICAgY2FjaGVkX2ltYWdlID0gdW5kZWZpbmVkOyAvL2lmIHRoZSBmbG9hdCBwcm9wIGlzIHNwZWNpZmllZCB3ZSBoYXZlIHRvIGZsb2F0IHRoZSB0ZXh0IGFyb3VuZCB0aGUgaW1hZ2VcblxuICAgICAgICAgICAgICBpZiAoaW1hZ2VzQ1NTWydmbG9hdCddID09PSAncmlnaHQnIHx8IGltYWdlc0NTU1snZmxvYXQnXSA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgLy9hZGQgZnVuY3Rpb250IHRvIHNldCBiYWNrIGNvb3JkaW5hdGVzIGFmdGVyIGltYWdlIHJlbmRlcmluZ1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLndhdGNoRnVuY3Rpb25zLnB1c2goZnVuY3Rpb24gKGRpZmZYLCB0aHJlc2hvbGRZLCBkaWZmV2lkdGgsIGVsKSB7XG4gICAgICAgICAgICAgICAgICAvL3VuZG8gZHJhd2luZyBib3ggYWRhcHRpb25zIHdoaWNoIHdlcmUgc2V0IGJ5IGZsb2F0aW5nXG4gICAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIueSA+PSB0aHJlc2hvbGRZKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnggKz0gZGlmZlg7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldHRpbmdzLndpZHRoICs9IGRpZmZXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsICYmIGVsLm5vZGVUeXBlID09PSAxICYmICFTa2lwTm9kZVtlbC5ub2RlTmFtZV0gJiYgcmVuZGVyZXIueCArIGVsLndpZHRoID4gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmxlZnQgKyByZW5kZXJlci5wZGYubWFyZ2luc19kb2Mud2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIueCArPSBkaWZmWDtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIueSA9IHRocmVzaG9sZFk7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldHRpbmdzLndpZHRoICs9IGRpZmZXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMsIGltYWdlc0NTU1snZmxvYXQnXSA9PT0gJ2xlZnQnID8gLWNuLndpZHRoIC0gYWRkaXRpb25hbFNwYWNlTGVmdCAtIGFkZGl0aW9uYWxTcGFjZVJpZ2h0IDogMCwgcmVuZGVyZXIueSArIGNuLmhlaWdodCArIGFkZGl0aW9uYWxTcGFjZVRvcCArIGFkZGl0aW9uYWxTcGFjZUJvdHRvbSwgY24ud2lkdGgpKTsgLy9yZXNldCBmbG9hdGluZyBieSBjbGVhcjpib3RoIGRpdnNcbiAgICAgICAgICAgICAgICAvL2p1c3Qgc2V0IGN1cnNvclkgYWZ0ZXIgdGhlIGZsb2F0aW5nIGVsZW1lbnRcblxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLndhdGNoRnVuY3Rpb25zLnB1c2goZnVuY3Rpb24gKHlQb3NpdGlvbkFmdGVyRmxvYXRpbmcsIHBhZ2VzLCBlbCkge1xuICAgICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyLnkgPCB5UG9zaXRpb25BZnRlckZsb2F0aW5nICYmIHBhZ2VzID09PSByZW5kZXJlci5wZGYuaW50ZXJuYWwuZ2V0TnVtYmVyT2ZQYWdlcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbC5ub2RlVHlwZSA9PT0gMSAmJiBHZXRDU1MoZWwpLmNsZWFyID09PSAnYm90aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlci55ID0geVBvc2l0aW9uQWZ0ZXJGbG9hdGluZztcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzLCByZW5kZXJlci55ICsgY24uaGVpZ2h0LCByZW5kZXJlci5wZGYuaW50ZXJuYWwuZ2V0TnVtYmVyT2ZQYWdlcygpKSk7IC8vaWYgZmxvYXRpbmcgaXMgc2V0IHdlIGRlY3JlYXNlIHRoZSBhdmFpbGFibGUgd2lkdGggYnkgdGhlIGltYWdlIHdpZHRoXG5cbiAgICAgICAgICAgICAgICByZW5kZXJlci5zZXR0aW5ncy53aWR0aCAtPSBjbi53aWR0aCArIGFkZGl0aW9uYWxTcGFjZUxlZnQgKyBhZGRpdGlvbmFsU3BhY2VSaWdodDsgLy9pZiBsZWZ0IGp1c3QgYWRkIHRoZSBpbWFnZSB3aWR0aCB0byB0aGUgWCBjb29yZGluYXRlXG5cbiAgICAgICAgICAgICAgICBpZiAoaW1hZ2VzQ1NTWydmbG9hdCddID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnggKz0gY24ud2lkdGggKyBhZGRpdGlvbmFsU3BhY2VMZWZ0ICsgYWRkaXRpb25hbFNwYWNlUmlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vaWYgbm8gZmxvYXRpbmcgaXMgc2V0LCBtb3ZlIHRoZSByZW5kZXJpbmcgY3Vyc29yIGFmdGVyIHRoZSBpbWFnZSBoZWlnaHRcbiAgICAgICAgICAgICAgICByZW5kZXJlci55ICs9IGNuLmhlaWdodCArIGFkZGl0aW9uYWxTcGFjZVRvcCArIGFkZGl0aW9uYWxTcGFjZUJvdHRvbTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvKioqIFRBQkxFIFJFTkRFUklORyAqKiovXG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY24ubm9kZU5hbWUgPT09IFwiVEFCTEVcIikge1xuICAgICAgICAgICAgICBpZighcmVuZGVyZXIucGRmLmF1dG9UYWJsZSkge1xuICAgICAgICAgICAgICAgIHRhYmxlMmpzb24gPSB0YWJsZVRvSnNvbihjbiwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gMTA7XG4gICAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLnRhYmxlKHJlbmRlcmVyLngsIHJlbmRlcmVyLnksIHRhYmxlMmpzb24ucm93cywgdGFibGUyanNvbi5oZWFkZXJzLCB7XG4gICAgICAgICAgICAgICAgICBhdXRvU2l6ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBwcmludEhlYWRlcnM6IGVsZW1lbnRIYW5kbGVycy5wcmludEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICBtYXJnaW5zOiByZW5kZXJlci5wZGYubWFyZ2luc19kb2MsXG4gICAgICAgICAgICAgICAgICBjc3M6IEdldENTUyhjbilcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZW5kZXJlci55ID0gcmVuZGVyZXIucGRmLmludGVybmFsLl9fY2VsbF9fLmxhc3RDZWxsLnkgK1xuICAgICAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLmludGVybmFsLl9fY2VsbF9fLmxhc3RDZWxsLmhlaWdodDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZW5kZXJlci55ICs9IDEwO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnBkZi5hdXRvVGFibGUoeyB0aGVtZTogXCJncmlkXCIsIGh0bWw6IGNuLCBzdGFydFk6IHJlbmRlcmVyLnksXG4gICAgICAgICAgICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgZm9udDogcmVuZGVyZXIucGRmLmdldEZvbnQoKS5mb250TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IHJlbmRlcmVyLnBkZi5nZXRGb250U2l6ZSgpLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0Q29sb3I6IHJlbmRlcmVyLnBkZi5nZXRUZXh0Q29sb3IoKVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIG1hcmdpbjogeyBcbiAgICAgICAgICAgICAgICAgICAgdG9wOiByZW5kZXJlci5wZGYubWFyZ2luc19kb2MudG9wLCBcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogcmVuZGVyZXIueCwgXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0OiByZW5kZXJlci5wZGYuaW50ZXJuYWwucGFnZVNpemUuZ2V0V2lkdGgoKSAtIChyZW5kZXJlci54ICArIHJlbmRlcmVyLnNldHRpbmdzLndpZHRoKSwgXG4gICAgICAgICAgICAgICAgICAgIGJvdHRvbTogcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmJvdHRvbSB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgPSByZW5kZXJlci5wZGYubGFzdEF1dG9UYWJsZS5maW5hbFk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY24ubm9kZU5hbWUgPT09IFwiT0xcIiB8fCBjbi5ub2RlTmFtZSA9PT0gXCJVTFwiKSB7XG4gICAgICAgICAgICAgIGxpc3RDb3VudCA9IDE7XG5cbiAgICAgICAgICAgICAgaWYgKCFlbGVtZW50SGFuZGxlZEVsc2V3aGVyZShjbiwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycykpIHtcbiAgICAgICAgICAgICAgICBfRHJpbGxGb3JDb250ZW50KGNuLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gMTA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNuLm5vZGVOYW1lID09PSBcIkxJXCIpIHtcbiAgICAgICAgICAgICAgdmFyIHRlbXAgPSByZW5kZXJlci54O1xuICAgICAgICAgICAgICByZW5kZXJlci54ICs9IDIwIC8gcmVuZGVyZXIucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgICAgICAgICByZW5kZXJlci55ICs9IDM7XG5cbiAgICAgICAgICAgICAgaWYgKCFlbGVtZW50SGFuZGxlZEVsc2V3aGVyZShjbiwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycykpIHtcbiAgICAgICAgICAgICAgICBfRHJpbGxGb3JDb250ZW50KGNuLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJlbmRlcmVyLnggPSB0ZW1wO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlTmFtZSA9PT0gXCJCUlwiKSB7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gZnJhZ21lbnRDU1NbXCJmb250LXNpemVcIl0gKiByZW5kZXJlci5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLmFkZFRleHQoXCJcXHUyMDI4XCIsIGNsb25lKGZyYWdtZW50Q1NTKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoIWVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlKGNuLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKSkge1xuICAgICAgICAgICAgICAgIF9EcmlsbEZvckNvbnRlbnQoY24sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gY24ubm9kZVZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoY24ubm9kZVZhbHVlICYmIGNuLnBhcmVudE5vZGUubm9kZU5hbWUgPT09IFwiTElcIikge1xuICAgICAgICAgICAgICBpZiAoY24ucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lID09PSBcIk9MXCIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGxpc3RDb3VudCsrICsgJy4gJyArIHZhbHVlO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmb250U2l6ZSA9IGZyYWdtZW50Q1NTW1wiZm9udC1zaXplXCJdO1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXRYID0gKDMgLSBmb250U2l6ZSAqIDAuNzUpICogcmVuZGVyZXIucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXRZID0gZm9udFNpemUgKiAwLjc1ICogcmVuZGVyZXIucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgICAgICAgICAgIHZhciByYWRpdXMgPSBmb250U2l6ZSAqIDEuNzQgLyByZW5kZXJlci5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG5cbiAgICAgICAgICAgICAgICBjYiA9IGZ1bmN0aW9uIGNiKHgsIHkpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMucGRmLmNpcmNsZSh4ICsgb2Zmc2V0WCwgeSArIG9mZnNldFksIHJhZGl1cywgJ0ZEJyk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAvLyBPbmx5IGFkZCB0aGUgdGV4dCBpZiB0aGUgdGV4dCBub2RlIGlzIGluIHRoZSBib2R5IGVsZW1lbnRcbiAgICAgICAgICAgIC8vIEFkZCBjb21wYXRpYmlsaXR5IHdpdGggSUUxMVxuXG5cbiAgICAgICAgICAgIGlmICghIShjbi5vd25lckRvY3VtZW50LmJvZHkuY29tcGFyZURvY3VtZW50UG9zaXRpb24oY24pICYgMTYpKSB7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLmFkZFRleHQodmFsdWUsIGZyYWdtZW50Q1NTKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmVuZGVyZXIuYWRkVGV4dChjbiwgZnJhZ21lbnRDU1MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGkrKztcbiAgICAgIH1cblxuICAgICAgZWxlbWVudEhhbmRsZXJzLm91dFkgPSByZW5kZXJlci55O1xuXG4gICAgICBpZiAoaXNCbG9jaykge1xuICAgICAgICByZXR1cm4gcmVuZGVyZXIuc2V0QmxvY2tCb3VuZGFyeShjYik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGltYWdlcyA9IHt9O1xuXG4gICAgbG9hZEltZ3MgPSBmdW5jdGlvbiBsb2FkSW1ncyhlbGVtZW50LCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzLCBjYikge1xuICAgICAgdmFyIGltZ3MgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKSxcbiAgICAgICAgICBsID0gaW1ncy5sZW5ndGgsXG4gICAgICAgICAgZm91bmRfaW1hZ2VzLFxuICAgICAgICAgIHggPSAwO1xuXG4gICAgICBmdW5jdGlvbiBkb25lKCkge1xuICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwuZXZlbnRzLnB1Ymxpc2goJ2ltYWdlc0xvYWRlZCcpO1xuICAgICAgICBjYihmb3VuZF9pbWFnZXMpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBsb2FkSW1hZ2UodXJsLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIGlmICghdXJsKSByZXR1cm47XG4gICAgICAgIHZhciBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgZm91bmRfaW1hZ2VzID0gKyt4O1xuICAgICAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnJztcblxuICAgICAgICBpbWcub25lcnJvciA9IGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGltZy5jb21wbGV0ZSkge1xuICAgICAgICAgICAgLy90byBzdXBwb3J0IGRhdGEgdXJscyBpbiBpbWFnZXMsIHNldCB3aWR0aCBhbmQgaGVpZ2h0XG4gICAgICAgICAgICAvL2FzIHRob3NlIHZhbHVlcyBhcmUgbm90IHJlY29nbml6ZWQgYXV0b21hdGljYWxseVxuICAgICAgICAgICAgaWYgKGltZy5zcmMuaW5kZXhPZignZGF0YTppbWFnZS8nKSA9PT0gMCkge1xuICAgICAgICAgICAgICBpbWcud2lkdGggPSB3aWR0aCB8fCBpbWcud2lkdGggfHwgMDtcbiAgICAgICAgICAgICAgaW1nLmhlaWdodCA9IGhlaWdodCB8fCBpbWcuaGVpZ2h0IHx8IDA7XG4gICAgICAgICAgICB9IC8vaWYgdmFsaWQgaW1hZ2UgYWRkIHRvIGtub3duIGltYWdlcyBhcnJheVxuXG5cbiAgICAgICAgICAgIGlmIChpbWcud2lkdGggKyBpbWcuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgIHZhciBoYXNoID0gKHJlbmRlcmVyLnBkZi5zSGFzaENvZGUgJiYgcmVuZGVyZXIucGRmLnNIYXNoQ29kZSh1cmwpKSB8fCB1cmw7XG4gICAgICAgICAgICAgIGltYWdlc1toYXNoXSA9IGltYWdlc1toYXNoXSB8fCBpbWc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCEgLS14KSB7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGltZy5zcmMgPSB1cmw7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChsLS0pIHtcbiAgICAgICAgbG9hZEltYWdlKGltZ3NbbF0uZ2V0QXR0cmlidXRlKFwic3JjXCIpLCBpbWdzW2xdLndpZHRoLCBpbWdzW2xdLmhlaWdodCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB4IHx8IGRvbmUoKTtcbiAgICB9O1xuXG4gICAgY2hlY2tGb3JGb290ZXIgPSBmdW5jdGlvbiBjaGVja0ZvckZvb3RlcihlbGVtLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKSB7XG4gICAgICAvL2NoZWNrIGlmIHdlIGNhbiBmb3VuZCBhIDxmb290ZXI+IGVsZW1lbnRcbiAgICAgIHZhciBmb290ZXIgPSBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiZm9vdGVyXCIpO1xuXG4gICAgICBpZiAoZm9vdGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9vdGVyID0gZm9vdGVyWzBdOyAvL2JhZCBoYWNrIHRvIGdldCBoZWlnaHQgb2YgZm9vdGVyXG4gICAgICAgIC8vY3JlYXQgZHVtbXkgb3V0IGFuZCBjaGVjayBuZXcgeSBhZnRlciBmYWtlIHJlbmRlcmluZ1xuXG4gICAgICAgIHZhciBvbGRPdXQgPSByZW5kZXJlci5wZGYuaW50ZXJuYWwud3JpdGU7XG4gICAgICAgIHZhciBvbGRZID0gcmVuZGVyZXIueTtcblxuICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwud3JpdGUgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgICAgICBfRHJpbGxGb3JDb250ZW50KGZvb3RlciwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycyk7XG5cbiAgICAgICAgdmFyIGZvb3RlckhlaWdodCA9IE1hdGguY2VpbChyZW5kZXJlci55IC0gb2xkWSkgKyA1O1xuICAgICAgICByZW5kZXJlci55ID0gb2xkWTtcbiAgICAgICAgcmVuZGVyZXIucGRmLmludGVybmFsLndyaXRlID0gb2xkT3V0OyAvL2FkZCAyMCUgdG8gcHJldmVudCBvdmVybGFwcGluZ1xuXG4gICAgICAgIHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy5ib3R0b20gKz0gZm9vdGVySGVpZ2h0OyAvL0NyZWF0ZSBmdW5jdGlvbiByZW5kZXIgaGVhZGVyIG9uIGV2ZXJ5IHBhZ2VcblxuICAgICAgICB2YXIgcmVuZGVyRm9vdGVyID0gZnVuY3Rpb24gcmVuZGVyRm9vdGVyKHBhZ2VJbmZvKSB7XG4gICAgICAgICAgdmFyIHBhZ2VOdW1iZXIgPSBwYWdlSW5mbyAhPT0gdW5kZWZpbmVkID8gcGFnZUluZm8ucGFnZU51bWJlciA6IDE7IC8vc2V0IGN1cnJlbnQgeSBwb3NpdGlvbiB0byBvbGQgbWFyZ2luXG5cbiAgICAgICAgICB2YXIgb2xkUG9zaXRpb24gPSByZW5kZXJlci55OyAvL3JlbmRlciBhbGwgY2hpbGQgbm9kZXMgb2YgdGhlIGhlYWRlciBlbGVtZW50XG5cbiAgICAgICAgICByZW5kZXJlci55ID0gcmVuZGVyZXIucGRmLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpIC0gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmJvdHRvbTtcbiAgICAgICAgICByZW5kZXJlci5wZGYubWFyZ2luc19kb2MuYm90dG9tIC09IGZvb3RlckhlaWdodDsgLy9jaGVjayBpZiB3ZSBoYXZlIHRvIGFkZCBwYWdlIG51bWJlcnNcblxuICAgICAgICAgIHZhciBzcGFucyA9IGZvb3Rlci5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3BhbicpO1xuXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgLy9pZiB3ZSBmaW5kIHNvbWUgc3BhbiBlbGVtZW50IHdpdGggY2xhc3MgcGFnZUNvdW50ZXIsIHNldCB0aGUgcGFnZVxuICAgICAgICAgICAgaWYgKChcIiBcIiArIHNwYW5zW2ldLmNsYXNzTmFtZSArIFwiIFwiKS5yZXBsYWNlKC9bXFxuXFx0XS9nLCBcIiBcIikuaW5kZXhPZihcIiBwYWdlQ291bnRlciBcIikgPiAtMSkge1xuICAgICAgICAgICAgICBzcGFuc1tpXS5pbm5lckhUTUwgPSBwYWdlTnVtYmVyO1xuICAgICAgICAgICAgfSAvL2lmIHdlIGZpbmQgc29tZSBzcGFuIGVsZW1lbnQgd2l0aCBjbGFzcyB0b3RhbFBhZ2VzLCBzZXQgYSB2YXJpYWJsZSB3aGljaCBpcyByZXBsYWNlZCBhZnRlciByZW5kZXJpbmcgb2YgYWxsIHBhZ2VzXG5cblxuICAgICAgICAgICAgaWYgKChcIiBcIiArIHNwYW5zW2ldLmNsYXNzTmFtZSArIFwiIFwiKS5yZXBsYWNlKC9bXFxuXFx0XS9nLCBcIiBcIikuaW5kZXhPZihcIiB0b3RhbFBhZ2VzIFwiKSA+IC0xKSB7XG4gICAgICAgICAgICAgIHNwYW5zW2ldLmlubmVySFRNTCA9ICcjIyNqc1BERlZhclRvdGFsUGFnZXMjIyMnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy9yZW5kZXIgZm9vdGVyIGNvbnRlbnRcblxuXG4gICAgICAgICAgX0RyaWxsRm9yQ29udGVudChmb290ZXIsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpOyAvL3NldCBib3R0b20gbWFyZ2luIHRvIHByZXZpb3VzIGhlaWdodCBpbmNsdWRpbmcgdGhlIGZvb3RlciBoZWlnaHRcblxuXG4gICAgICAgICAgcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmJvdHRvbSArPSBmb290ZXJIZWlnaHQ7IC8vaW1wb3J0YW50IGZvciBvdGhlciBwbHVnaW5zIChlLmcuIHRhYmxlKSB0byBzdGFydCByZW5kZXJpbmcgYXQgY29ycmVjdCBwb3NpdGlvbiBhZnRlciBoZWFkZXJcblxuICAgICAgICAgIHJlbmRlcmVyLnkgPSBvbGRQb3NpdGlvbjtcbiAgICAgICAgfTsgLy9jaGVjayBpZiBmb290ZXIgY29udGFpbnMgdG90YWxQYWdlcyB3aGljaCBzaG91bGQgYmUgcmVwbGFjZSBhdCB0aGUgZGlzb3Bvc2FsIG9mIHRoZSBkb2N1bWVudFxuXG5cbiAgICAgICAgdmFyIHNwYW5zID0gZm9vdGVyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzcGFuJyk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGlmICgoXCIgXCIgKyBzcGFuc1tpXS5jbGFzc05hbWUgKyBcIiBcIikucmVwbGFjZSgvW1xcblxcdF0vZywgXCIgXCIpLmluZGV4T2YoXCIgdG90YWxQYWdlcyBcIikgPiAtMSkge1xuICAgICAgICAgICAgcmVuZGVyZXIucGRmLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ2h0bWxSZW5kZXJpbmdGaW5pc2hlZCcsIHJlbmRlcmVyLnBkZi5wdXRUb3RhbFBhZ2VzLmJpbmQocmVuZGVyZXIucGRmLCAnIyMjanNQREZWYXJUb3RhbFBhZ2VzIyMjJyksIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvL3JlZ2lzdGVyIGV2ZW50IHRvIHJlbmRlciBmb290ZXIgb24gZXZlcnkgbmV3IHBhZ2VcblxuXG4gICAgICAgIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdhZGRQYWdlJywgcmVuZGVyRm9vdGVyLCBmYWxzZSk7IC8vcmVuZGVyIGZvb3RlciBvbiBmaXJzdCBwYWdlXG5cbiAgICAgICAgcmVuZGVyRm9vdGVyKCk7IC8vcHJldmVudCBmb290ZXIgcmVuZGVyaW5nXG5cbiAgICAgICAgU2tpcE5vZGVbJ0ZPT1RFUiddID0gMTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJvY2VzcyA9IGZ1bmN0aW9uIHByb2Nlc3MocGRmLCBlbGVtZW50LCB4LCB5LCBzZXR0aW5ncywgY2FsbGJhY2spIHtcbiAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ICE9PSBcInN0cmluZ1wiICYmICFlbGVtZW50LnBhcmVudE5vZGUpIGVsZW1lbnQgPSAnJyArIGVsZW1lbnQuaW5uZXJIVE1MO1xuXG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgZWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgdmFyICRmcmFtZSwgJGhpZGRlbmRpdiwgZnJhbWVuYW1lLCB2aXN1YWxseWhpZGRlbjtcbiAgICAgICAgICBmcmFtZW5hbWUgPSBcImpzUERGaHRtbFRleHRcIiArIERhdGUubm93KCkudG9TdHJpbmcoKSArIChNYXRoLnJhbmRvbSgpICogMTAwMCkudG9GaXhlZCgwKTtcbiAgICAgICAgICB2aXN1YWxseWhpZGRlbiA9IFwicG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XCIgKyBcImNsaXA6IHJlY3QoMXB4IDFweCAxcHggMXB4KTsgLyogSUU2LCBJRTcgKi9cIiArIFwiY2xpcDogcmVjdCgxcHgsIDFweCwgMXB4LCAxcHgpO1wiICsgXCJwYWRkaW5nOjAgIWltcG9ydGFudDtcIiArIFwiYm9yZGVyOjAgIWltcG9ydGFudDtcIiArIFwiaGVpZ2h0OiAxcHggIWltcG9ydGFudDtcIiArIFwid2lkdGg6IDFweCAhaW1wb3J0YW50OyBcIiArIFwidG9wOmF1dG87XCIgKyBcImxlZnQ6LTEwMHB4O1wiICsgXCJvdmVyZmxvdzogaGlkZGVuO1wiO1xuICAgICAgICAgICRoaWRkZW5kaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAkaGlkZGVuZGl2LmNsYXNzTmFtZSA9IFwic2pzLXBkZi1oaWRkZW4taHRtbC1kaXZcIjtcbiAgICAgICAgICAkaGlkZGVuZGl2LnN0eWxlLmNzc1RleHQgPSB2aXN1YWxseWhpZGRlbjtcbiAgICAgICAgICAkaGlkZGVuZGl2LmlubmVySFRNTCA9IFwiPGlmcmFtZSBzdHlsZT1cXFwiaGVpZ2h0OjFweDt3aWR0aDoxcHhcXFwiIG5hbWU9XFxcIlwiICsgZnJhbWVuYW1lICsgXCJcXFwiIC8+XCI7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCgkaGlkZGVuZGl2KTtcbiAgICAgICAgICAkZnJhbWUgPSB3aW5kb3cuZnJhbWVzW2ZyYW1lbmFtZV07XG4gICAgICAgICAgJGZyYW1lLmRvY3VtZW50Lm9wZW4oKTtcbiAgICAgICAgICAkZnJhbWUuZG9jdW1lbnQud3JpdGVsbihlbGVtZW50KTtcbiAgICAgICAgICAkZnJhbWUuZG9jdW1lbnQuY2xvc2UoKTtcbiAgICAgICAgICByZXR1cm4gJGZyYW1lLmRvY3VtZW50LmJvZHk7XG4gICAgICAgIH0oZWxlbWVudC5yZXBsYWNlKC88XFwvP3NjcmlwdFtePl0qPz4vZ2ksICcnKSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBhdmFpbGFibGVGb250cyA9IE9iamVjdC5rZXlzKHBkZi5nZXRGb250TGlzdCgpKTtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhdmFpbGFibGVGb250cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgZm9udE5hbWUgPSBhdmFpbGFibGVGb250c1tpXTtcbiAgICAgICAgdmFyIGZvbnRGYW1pbHkgPSBmb250TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZighRm9udE5hbWVEQltmb250RmFtaWx5XSkge1xuICAgICAgICAgIEZvbnROYW1lREJbZm9udEZhbWlseV0gPSBmb250TmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgciA9IG5ldyBSZW5kZXJlcihwZGYsIHgsIHksIHNldHRpbmdzKSxcbiAgICAgICAgICBvdXQ7IC8vIDEuIGxvYWQgaW1hZ2VzXG4gICAgICAvLyAyLiBwcmVwYXJlIG9wdGlvbmFsIGZvb3RlciBlbGVtZW50c1xuICAgICAgLy8gMy4gcmVuZGVyIGNvbnRlbnRcblxuICAgICAgbG9hZEltZ3MuY2FsbCh0aGlzLCBlbGVtZW50LCByLCBzZXR0aW5ncy5lbGVtZW50SGFuZGxlcnMsIGZ1bmN0aW9uIChmb3VuZF9pbWFnZXMpIHtcbiAgICAgICAgY2hlY2tGb3JGb290ZXIoZWxlbWVudCwgciwgc2V0dGluZ3MuZWxlbWVudEhhbmRsZXJzKTtcblxuICAgICAgICBfRHJpbGxGb3JDb250ZW50KGVsZW1lbnQsIHIsIHNldHRpbmdzLmVsZW1lbnRIYW5kbGVycyk7IC8vc2VuZCBldmVudCBkaXNwb3NlIGZvciBmaW5hbCB0YWtzIChlLmcuIGZvb3RlciB0b3RhbHBhZ2UgcmVwbGFjZW1lbnQpXG5cblxuICAgICAgICByLnBkZi5pbnRlcm5hbC5ldmVudHMucHVibGlzaCgnaHRtbFJlbmRlcmluZ0ZpbmlzaGVkJyk7XG4gICAgICAgIG91dCA9IHIuZGlzcG9zZSgpO1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSBjYWxsYmFjayhvdXQpO2Vsc2UgaWYgKGZvdW5kX2ltYWdlcykgY29uc29sZS5lcnJvcignanNQREYgV2FybmluZzogcmVuZGVyaW5nIGlzc3Vlcz8gcHJvdmlkZSBhIGNhbGxiYWNrIHRvIGZyb21IVE1MIScpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gb3V0IHx8IHtcbiAgICAgICAgeDogci54LFxuICAgICAgICB5OiByLnlcbiAgICAgIH07XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5wYXJhZ3JhcGggPSB7XG4gICAgICAgIHRleHQ6IFtdLFxuICAgICAgICBzdHlsZTogW11cbiAgICAgIH07XG4gICAgICByZXR1cm4gdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoXCJxXCIpO1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKFwiUVwiKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHRoaXMueCxcbiAgICAgICAgeTogdGhpcy55LFxuICAgICAgICByZWFkeTogdHJ1ZVxuICAgICAgfTtcbiAgICB9OyAvL0NoZWNrcyBpZiB3ZSBoYXZlIHRvIGV4ZWN1dGUgc29tZSB3YXRjaGVyIGZ1bmN0aW9uc1xuICAgIC8vZS5nLiB0byBlbmQgdGV4dCBmbG9hdGluZyBhcm91bmQgYW4gaW1hZ2VcblxuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmV4ZWN1dGVXYXRjaEZ1bmN0aW9ucyA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgdmFyIHJldCA9IGZhbHNlO1xuICAgICAgdmFyIG5hcnJheSA9IFtdO1xuXG4gICAgICBpZiAodGhpcy53YXRjaEZ1bmN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy53YXRjaEZ1bmN0aW9ucy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGlmICh0aGlzLndhdGNoRnVuY3Rpb25zW2ldKGVsKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0ID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmFycmF5LnB1c2godGhpcy53YXRjaEZ1bmN0aW9uc1tpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy53YXRjaEZ1bmN0aW9ucyA9IG5hcnJheTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLnNwbGl0RnJhZ21lbnRzSW50b0xpbmVzID0gZnVuY3Rpb24gKGZyYWdtZW50cywgc3R5bGVzKSB7XG4gICAgICB2YXIgY3VycmVudExpbmVMZW5ndGgsIGRlZmF1bHRGb250U2l6ZSwgZmYsIGZvbnRNZXRyaWNzLCBmb250TWV0cmljc0NhY2hlLCBmcmFnbWVudCwgZnJhZ21lbnRDaG9wcGVkLCBmcmFnbWVudExlbmd0aCwgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MsIGZzLCBrLCBsaW5lLCBsaW5lcywgbWF4TGluZUxlbmd0aCwgc3R5bGU7XG4gICAgICBkZWZhdWx0Rm9udFNpemUgPSAxMjtcbiAgICAgIGsgPSB0aGlzLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgIGZvbnRNZXRyaWNzQ2FjaGUgPSB7fTtcbiAgICAgIGZmID0gdm9pZCAwO1xuICAgICAgZnMgPSB2b2lkIDA7XG4gICAgICBmb250TWV0cmljcyA9IHZvaWQgMDtcbiAgICAgIGZyYWdtZW50ID0gdm9pZCAwO1xuICAgICAgc3R5bGUgPSB2b2lkIDA7XG4gICAgICBmcmFnbWVudFNwZWNpZmljTWV0cmljcyA9IHZvaWQgMDtcbiAgICAgIGZyYWdtZW50TGVuZ3RoID0gdm9pZCAwO1xuICAgICAgZnJhZ21lbnRDaG9wcGVkID0gdm9pZCAwO1xuICAgICAgbGluZSA9IFtdO1xuICAgICAgbGluZXMgPSBbbGluZV07XG4gICAgICBjdXJyZW50TGluZUxlbmd0aCA9IDA7XG4gICAgICBtYXhMaW5lTGVuZ3RoID0gdGhpcy5zZXR0aW5ncy53aWR0aDtcblxuICAgICAgd2hpbGUgKGZyYWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgZnJhZ21lbnQgPSBmcmFnbWVudHMuc2hpZnQoKTtcbiAgICAgICAgc3R5bGUgPSBzdHlsZXMuc2hpZnQoKTtcblxuICAgICAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgICAgICBmZiA9IHN0eWxlW1wiZm9udC1mYW1pbHlcIl07XG4gICAgICAgICAgZnMgPSBzdHlsZVtcImZvbnQtc3R5bGVcIl07XG4gICAgICAgICAgZm9udE1ldHJpY3MgPSBmb250TWV0cmljc0NhY2hlW2ZmICsgZnNdO1xuXG4gICAgICAgICAgaWYgKCFmb250TWV0cmljcykge1xuICAgICAgICAgICAgZm9udE1ldHJpY3MgPSB0aGlzLnBkZi5pbnRlcm5hbC5nZXRGb250KGZmLCBmcykubWV0YWRhdGEuVW5pY29kZTtcbiAgICAgICAgICAgIGZvbnRNZXRyaWNzQ2FjaGVbZmYgKyBmc10gPSBmb250TWV0cmljcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmcmFnbWVudFNwZWNpZmljTWV0cmljcyA9IHtcbiAgICAgICAgICAgIHdpZHRoczogZm9udE1ldHJpY3Mud2lkdGhzLFxuICAgICAgICAgICAga2VybmluZzogZm9udE1ldHJpY3Mua2VybmluZyxcbiAgICAgICAgICAgIGZvbnRTaXplOiBzdHlsZVtcImZvbnQtc2l6ZVwiXSAqIGRlZmF1bHRGb250U2l6ZSxcbiAgICAgICAgICAgIHRleHRJbmRlbnQ6IGN1cnJlbnRMaW5lTGVuZ3RoXG4gICAgICAgICAgfTtcbiAgICAgICAgICBmcmFnbWVudExlbmd0aCA9IHRoaXMucGRmLmdldFN0cmluZ1VuaXRXaWR0aChmcmFnbWVudCwgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MpICogZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MuZm9udFNpemUgLyBrO1xuXG4gICAgICAgICAgaWYgKGZyYWdtZW50ID09IFwiXFx1MjAyOFwiKSB7XG4gICAgICAgICAgICBsaW5lID0gW107XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudExpbmVMZW5ndGggKyBmcmFnbWVudExlbmd0aCA+IG1heExpbmVMZW5ndGgpIHtcbiAgICAgICAgICAgIGZyYWdtZW50Q2hvcHBlZCA9IHRoaXMucGRmLnNwbGl0VGV4dFRvU2l6ZShmcmFnbWVudCwgbWF4TGluZUxlbmd0aCwgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MpO1xuICAgICAgICAgICAgbGluZS5wdXNoKFtmcmFnbWVudENob3BwZWQuc2hpZnQoKSwgc3R5bGVdKTtcblxuICAgICAgICAgICAgd2hpbGUgKGZyYWdtZW50Q2hvcHBlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgbGluZSA9IFtbZnJhZ21lbnRDaG9wcGVkLnNoaWZ0KCksIHN0eWxlXV07XG4gICAgICAgICAgICAgIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN1cnJlbnRMaW5lTGVuZ3RoID0gdGhpcy5wZGYuZ2V0U3RyaW5nVW5pdFdpZHRoKGxpbmVbMF1bMF0sIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzKSAqIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzLmZvbnRTaXplIC8gaztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGluZS5wdXNoKFtmcmFnbWVudCwgc3R5bGVdKTtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lTGVuZ3RoICs9IGZyYWdtZW50TGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvL2lmIHRleHQgYWxpZ25tZW50IHdhcyBzZXQsIHNldCBtYXJnaW4vaW5kZW50IG9mIGVhY2ggbGluZVxuXG5cbiAgICAgIGlmIChzdHlsZVsndGV4dC1hbGlnbiddICE9PSB1bmRlZmluZWQgJiYgKHN0eWxlWyd0ZXh0LWFsaWduJ10gPT09ICdjZW50ZXInIHx8IHN0eWxlWyd0ZXh0LWFsaWduJ10gPT09ICdyaWdodCcgfHwgc3R5bGVbJ3RleHQtYWxpZ24nXSA9PT0gJ2p1c3RpZnknKSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMucGRmLmdldFN0cmluZ1VuaXRXaWR0aChsaW5lc1tpXVswXVswXSwgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MpICogZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MuZm9udFNpemUgLyBrOyAvL2lmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbiBsaW5lIHdlIGhhdmUgdG8gY2xvbmUgdGhlIHN0eWxlIG9iamVjdCBhcyBhbGwgbGluZXMgaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGlzIG9iamVjdFxuXG4gICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBsaW5lc1tpXVswXVsxXSA9IGNsb25lKGxpbmVzW2ldWzBdWzFdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgc3BhY2UgPSBtYXhMaW5lTGVuZ3RoIC0gbGVuZ3RoO1xuXG4gICAgICAgICAgaWYgKHN0eWxlWyd0ZXh0LWFsaWduJ10gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgIGxpbmVzW2ldWzBdWzFdWydtYXJnaW4tbGVmdCddID0gc3BhY2U7IC8vaWYgYWxpZ25tZW50IGlzIG5vdCByaWdodCwgaXQgaGFzIHRvIGJlIGNlbnRlciBzbyBzcGxpdCB0aGUgc3BhY2UgdG8gdGhlIGxlZnQgYW5kIHRoZSByaWdodFxuICAgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVbJ3RleHQtYWxpZ24nXSA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgIGxpbmVzW2ldWzBdWzFdWydtYXJnaW4tbGVmdCddID0gc3BhY2UgLyAyOyAvL2lmIGp1c3RpZnkgd2FzIHNldCwgY2FsY3VsYXRlIHRoZSB3b3JkIHNwYWNpbmcgYW5kIGRlZmluZSBpbiBieSB1c2luZyB0aGUgY3NzIHByb3BlcnR5XG4gICAgICAgICAgfSBlbHNlIGlmIChzdHlsZVsndGV4dC1hbGlnbiddID09PSAnanVzdGlmeScpIHtcbiAgICAgICAgICAgIHZhciBjb3VudFNwYWNlcyA9IGxpbmVzW2ldWzBdWzBdLnNwbGl0KCcgJykubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGxpbmVzW2ldWzBdWzFdWyd3b3JkLXNwYWNpbmcnXSA9IHNwYWNlIC8gY291bnRTcGFjZXM7IC8vaWdub3JlIHRoZSBsYXN0IGxpbmUgaW4ganVzdGlmeSBtb2RlXG5cbiAgICAgICAgICAgIGlmIChpID09PSBsaW5lcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgIGxpbmVzW2ldWzBdWzFdWyd3b3JkLXNwYWNpbmcnXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsaW5lcztcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLlJlbmRlclRleHRGcmFnbWVudCA9IGZ1bmN0aW9uICh0ZXh0LCBzdHlsZSkge1xuICAgICAgdmFyIGRlZmF1bHRGb250U2l6ZSwgZm9udCwgbWF4TGluZUhlaWdodDtcbiAgICAgIG1heExpbmVIZWlnaHQgPSAwO1xuICAgICAgZGVmYXVsdEZvbnRTaXplID0gMTI7XG5cbiAgICAgIGlmICh0aGlzLnBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRIZWlnaHQoKSAtIHRoaXMucGRmLm1hcmdpbnNfZG9jLmJvdHRvbSA8IHRoaXMueSArIHRoaXMucGRmLmludGVybmFsLmdldEZvbnRTaXplKCkpIHtcbiAgICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoXCJFVFwiLCBcIlFcIiwgXCJRXCIpO1xuICAgICAgICBjb25zdCBjdXJyZW50UGFnZU51bWJlciA9IHRoaXMucGRmLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXI7XG4gICAgICAgIGlmICh0aGlzLnBkZi5nZXROdW1iZXJPZlBhZ2VzKCkgPT09IGN1cnJlbnRQYWdlTnVtYmVyKSB0aGlzLnBkZi5hZGRQYWdlKCk7XG4gICAgICAgIGVsc2UgdGhpcy5wZGYuc2V0UGFnZShjdXJyZW50UGFnZU51bWJlciArIDEpO1xuICAgICAgICB0aGlzLnkgPSB0aGlzLnBkZi5tYXJnaW5zX2RvYy50b3A7XG4gICAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKFwicVwiLCBcInFcIiwgXCJCVFwiLCB0aGlzLmdldFBkZkNvbG9yKHN0eWxlLmNvbG9yKSwgdGhpcy5wZGYuaW50ZXJuYWwuZ2V0Q29vcmRpbmF0ZVN0cmluZyh0aGlzLngpLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRWZXJ0aWNhbENvb3JkaW5hdGVTdHJpbmcodGhpcy55KSwgXCJUZFwiKTsgLy9tb3ZlIGN1cnNvciBieSBvbmUgbGluZSBvbiBuZXcgcGFnZVxuXG4gICAgICAgIG1heExpbmVIZWlnaHQgPSBNYXRoLm1heChtYXhMaW5lSGVpZ2h0LCBzdHlsZVtcImxpbmUtaGVpZ2h0XCJdLCBzdHlsZVtcImZvbnQtc2l6ZVwiXSk7XG4gICAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKDAsICgtMSAqIGRlZmF1bHRGb250U2l6ZSAqIG1heExpbmVIZWlnaHQpLnRvRml4ZWQoMiksIFwiVGRcIik7XG4gICAgICB9XG5cbiAgICAgIGZvbnQgPSB0aGlzLnBkZi5pbnRlcm5hbC5nZXRGb250KHN0eWxlW1wiZm9udC1mYW1pbHlcIl0sIHN0eWxlW1wiZm9udC1zdHlsZVwiXSk7IC8vIHRleHQgY29sb3JcblxuICAgICAgdmFyIHBkZlRleHRDb2xvciA9IHRoaXMuZ2V0UGRmQ29sb3Ioc3R5bGVbXCJjb2xvclwiXSk7XG5cbiAgICAgIGlmIChwZGZUZXh0Q29sb3IgIT09IHRoaXMubGFzdFRleHRDb2xvcikge1xuICAgICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZShwZGZUZXh0Q29sb3IpO1xuICAgICAgICB0aGlzLmxhc3RUZXh0Q29sb3IgPSBwZGZUZXh0Q29sb3I7XG4gICAgICB9IC8vc2V0IHRoZSB3b3JkIHNwYWNpbmcgZm9yIGUuZy4ganVzdGlmeSBzdHlsZVxuXG5cbiAgICAgIGlmIChzdHlsZVsnd29yZC1zcGFjaW5nJ10gIT09IHVuZGVmaW5lZCAmJiBzdHlsZVsnd29yZC1zcGFjaW5nJ10gPiAwKSB7XG4gICAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKHN0eWxlWyd3b3JkLXNwYWNpbmcnXS50b0ZpeGVkKDIpLCBcIlR3XCIpO1xuICAgICAgfVxuXG5cbiAgICAgIHZhciBwZGZFc2NhcGUxNiA9IGZ1bmN0aW9uKHRleHQsIGZvbnQpIHtcbiAgICAgICAgdmFyIHdpZHRocyA9IGZvbnQubWV0YWRhdGEuVW5pY29kZS53aWR0aHM7XG4gICAgICAgIHZhciBwYWR6ID0gW1wiXCIsIFwiMFwiLCBcIjAwXCIsIFwiMDAwXCIsIFwiMDAwMFwiXTtcbiAgICAgICAgdmFyIGFyID0gW1wiXCJdO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRleHQubGVuZ3RoLCB0OyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgdCA9IGZvbnQubWV0YWRhdGEuY2hhcmFjdGVyVG9HbHlwaCh0ZXh0LmNoYXJDb2RlQXQoaSkpO1xuICAgICAgICAgIGZvbnQubWV0YWRhdGEuZ2x5SWRzVXNlZC5wdXNoKHQpO1xuICAgICAgICAgIGZvbnQubWV0YWRhdGEudG9Vbmljb2RlW3RdID0gdGV4dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgIGlmICh3aWR0aHMuaW5kZXhPZih0KSA9PSAtMSkge1xuICAgICAgICAgICAgd2lkdGhzLnB1c2godCk7XG4gICAgICAgICAgICB3aWR0aHMucHVzaChbcGFyc2VJbnQoZm9udC5tZXRhZGF0YS53aWR0aE9mR2x5cGgodCksIDEwKV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodCA9PSBcIjBcIikge1xuICAgICAgICAgICAgLy9TcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGluIGNtYXAuXG4gICAgICAgICAgICByZXR1cm4gYXIuam9pbihcIlwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdCA9IHQudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgYXIucHVzaChwYWR6WzQgLSB0Lmxlbmd0aF0sIHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXIuam9pbihcIlwiKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciB1dGY4VGV4dEZ1bmN0aW9uID0gZnVuY3Rpb24odGV4dCwgZm9udCkge1xuICAgICAgICB2YXIgdGV4dCA9IHRleHQgfHwgXCJcIjtcbiAgICBcbiAgICAgICAgdmFyIHN0ciA9IFwiXCIsXG4gICAgICAgICAgcyA9IDAsXG4gICAgICAgICAgY21hcENvbmZpcm07XG4gICAgICAgIHZhciBzdHJUZXh0ID0gXCJcIjtcbiAgICAgICAgdmFyIGVuY29kaW5nID0gZm9udC5lbmNvZGluZztcbiAgICBcbiAgICAgICAgaWYgKGZvbnQuZW5jb2RpbmcgIT09IFwiSWRlbnRpdHktSFwiKSB7XG4gICAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgc3RyVGV4dCA9IHRleHQ7XG4gICAgXG4gICAgICAgIGZvciAocyA9IDA7IHMgPCBzdHJUZXh0Lmxlbmd0aDsgcyArPSAxKSB7XG4gICAgICAgICAgaWYgKGZvbnQubWV0YWRhdGEuaGFzT3duUHJvcGVydHkoXCJjbWFwXCIpKSB7XG4gICAgICAgICAgICBjbWFwQ29uZmlybSA9IGZvbnQubWV0YWRhdGEuY21hcC51bmljb2RlLmNvZGVNYXBbc3RyVGV4dFtzXS5jaGFyQ29kZUF0KDApXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFjbWFwQ29uZmlybSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBzdHJUZXh0W3NdLmNoYXJDb2RlQXQoMCkgPCAyNTYgJiZcbiAgICAgICAgICAgICAgZm9udC5tZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eShcIlVuaWNvZGVcIilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBzdHIgKz0gc3RyVGV4dFtzXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0ciArPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHIgKz0gc3RyVGV4dFtzXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGlmIChwYXJzZUludChmb250LmlkLnNsaWNlKDEpKSA8IDE0IHx8IGVuY29kaW5nID09PSBcIldpbkFuc2lFbmNvZGluZ1wiKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5wZGYuaW50ZXJuYWwucGRmRXNjYXBlKHN0ciwga2V5KVxuICAgICAgICAgICAgLnNwbGl0KFwiXCIpXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uKGN2KSB7XG4gICAgICAgICAgICAgIHJldHVybiBjdi5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbihcIlwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbmNvZGluZyA9PT0gXCJJZGVudGl0eS1IXCIpIHtcbiAgICAgICAgICByZXN1bHQgPSBwZGZFc2NhcGUxNihzdHIsIGZvbnQpO1xuICAgICAgICB9XG4gICAgXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9OyAgICAgIFxuXG4gICAgICAvLyB2YXIgZXNjYXBlZFRleHQgPSB0aGlzLnBkZi5pbnRlcm5hbC5wZGZFc2NhcGUodGV4dCk7XG4gICAgICAvLyB2YXIgZXNjYXBlZFRleHQgPSB1dGY4VGV4dEZ1bmN0aW9uKHRleHQsIGZvbnQpO1xuICAgICAgLy8gaWYoZXNjYXBlZFRleHQgIT0gdGV4dCkge1xuICAgICAgLy8gICBlc2NhcGVkVGV4dCA9IFwiPFwiICsgZXNjYXBlZFRleHQgKyBcIj5cIjtcbiAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAvLyAgIGVzY2FwZWRUZXh0ID0gXCIoXCIgKyBlc2NhcGVkVGV4dCArIFwiKVwiO1xuICAgICAgLy8gfVxuXG4gICAgICB2YXIgZXNjYXBlZFRleHQgPSBcIlwiO1xuICAgICAgaWYoZm9udC5lbmNvZGluZyAhPT0gXCJJZGVudGl0eS1IXCIpIHtcbiAgICAgICAgZXNjYXBlZFRleHQgPSBcIihcIiArIHRoaXMucGRmLmludGVybmFsLnBkZkVzY2FwZSh0ZXh0KSArIFwiKVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXNjYXBlZFRleHQgPSBcIjxcIiArIHV0ZjhUZXh0RnVuY3Rpb24odGV4dCwgZm9udCkgKyBcIj5cIjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoXCIvXCIgKyBmb250LmlkLCAoZGVmYXVsdEZvbnRTaXplICogc3R5bGVbXCJmb250LXNpemVcIl0pLnRvRml4ZWQoMiksIFwiVGZcIiwgZXNjYXBlZFRleHQgKyBcIiBUalwiKTsgLy9zZXQgdGhlIHdvcmQgc3BhY2luZyBiYWNrIHRvIG5ldXRyYWwgPT4gMFxuXG4gICAgICBpZiAoc3R5bGVbJ3dvcmQtc3BhY2luZyddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoMCwgXCJUd1wiKTtcbiAgICAgIH1cbiAgICB9OyAvLyBBY2NlcHRzICNGRkZGRkYsIHJnYihpbnQsaW50LGludCksIG9yIENTUyBDb2xvciBOYW1lXG5cblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5nZXRQZGZDb2xvciA9IGZ1bmN0aW9uIChzdHlsZSkge1xuICAgICAgdmFyIHRleHRDb2xvcjtcbiAgICAgIHZhciByLCBnLCBiO1xuICAgICAgdmFyIHJ4ID0gL3JnYlxccypcXChcXHMqKFxcZCspLFxccyooXFxkKyksXFxzKihcXGQrXFxzKilcXCkvO1xuICAgICAgdmFyIG0gPSByeC5leGVjKHN0eWxlKTtcblxuICAgICAgaWYgKG0gIT0gbnVsbCkge1xuICAgICAgICByID0gcGFyc2VJbnQobVsxXSk7XG4gICAgICAgIGcgPSBwYXJzZUludChtWzJdKTtcbiAgICAgICAgYiA9IHBhcnNlSW50KG1bM10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdHlsZSA9PT0gXCJzdHJpbmdcIiAmJiBzdHlsZS5jaGFyQXQoMCkgIT0gJyMnKSB7XG4gICAgICAgICAgdmFyIHJnYkNvbG9yID0gbmV3IFJHQkNvbG9yKHN0eWxlKTtcblxuICAgICAgICAgIGlmIChyZ2JDb2xvci5vaykge1xuICAgICAgICAgICAgc3R5bGUgPSByZ2JDb2xvci50b0hleCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHlsZSA9ICcjMDAwMDAwJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByID0gc3R5bGUuc3Vic3RyaW5nKDEsIDMpO1xuICAgICAgICByID0gcGFyc2VJbnQociwgMTYpO1xuICAgICAgICBnID0gc3R5bGUuc3Vic3RyaW5nKDMsIDUpO1xuICAgICAgICBnID0gcGFyc2VJbnQoZywgMTYpO1xuICAgICAgICBiID0gc3R5bGUuc3Vic3RyaW5nKDUsIDcpO1xuICAgICAgICBiID0gcGFyc2VJbnQoYiwgMTYpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHIgPT09ICdzdHJpbmcnICYmIC9eI1swLTlBLUZhLWZdezZ9JC8udGVzdChyKSkge1xuICAgICAgICB2YXIgaGV4ID0gcGFyc2VJbnQoci5zdWJzdHIoMSksIDE2KTtcbiAgICAgICAgciA9IGhleCA+PiAxNiAmIDI1NTtcbiAgICAgICAgZyA9IGhleCA+PiA4ICYgMjU1O1xuICAgICAgICBiID0gaGV4ICYgMjU1O1xuICAgICAgfVxuXG4gICAgICB2YXIgZjMgPSB0aGlzLmYzO1xuXG4gICAgICBpZiAociA9PT0gMCAmJiBnID09PSAwICYmIGIgPT09IDAgfHwgdHlwZW9mIGcgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRleHRDb2xvciA9IGYzKHIgLyAyNTUpICsgJyBnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRleHRDb2xvciA9IFtmMyhyIC8gMjU1KSwgZjMoZyAvIDI1NSksIGYzKGIgLyAyNTUpLCAncmcnXS5qb2luKCcgJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ZXh0Q29sb3I7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5mMyA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgIHJldHVybiBudW1iZXIudG9GaXhlZCgzKTsgLy8gSWUsICUuM2ZcbiAgICB9LCBSZW5kZXJlci5wcm90b3R5cGUucmVuZGVyUGFyYWdyYXBoID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgICB2YXIgYmxvY2tzdHlsZSwgZGVmYXVsdEZvbnRTaXplLCBmb250VG9Vbml0UmF0aW8sIGZyYWdtZW50cywgaSwgbCwgbGluZSwgbGluZXMsIG1heExpbmVIZWlnaHQsIG91dCwgcGFyYWdyYXBoc3BhY2luZ19hZnRlciwgcGFyYWdyYXBoc3BhY2luZ19iZWZvcmUsIHByaW9yYmxvY2tzdHlsZSwgc3R5bGVzLCBmb250U2l6ZTtcbiAgICAgIGZyYWdtZW50cyA9IFB1cmdlV2hpdGVTcGFjZSh0aGlzLnBhcmFncmFwaC50ZXh0KTtcbiAgICAgIHN0eWxlcyA9IHRoaXMucGFyYWdyYXBoLnN0eWxlO1xuICAgICAgYmxvY2tzdHlsZSA9IHRoaXMucGFyYWdyYXBoLmJsb2Nrc3R5bGU7XG4gICAgICBwcmlvcmJsb2Nrc3R5bGUgPSB0aGlzLnBhcmFncmFwaC5wcmlvcmJsb2Nrc3R5bGUgfHwge307XG4gICAgICB0aGlzLnBhcmFncmFwaCA9IHtcbiAgICAgICAgdGV4dDogW10sXG4gICAgICAgIHN0eWxlOiBbXSxcbiAgICAgICAgYmxvY2tzdHlsZToge30sXG4gICAgICAgIHByaW9yYmxvY2tzdHlsZTogYmxvY2tzdHlsZVxuICAgICAgfTtcblxuICAgICAgaWYgKCFmcmFnbWVudHMuam9pbihcIlwiKS50cmltKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsaW5lcyA9IHRoaXMuc3BsaXRGcmFnbWVudHNJbnRvTGluZXMoZnJhZ21lbnRzLCBzdHlsZXMpO1xuICAgICAgbGluZSA9IHZvaWQgMDtcbiAgICAgIG1heExpbmVIZWlnaHQgPSB2b2lkIDA7XG4gICAgICBkZWZhdWx0Rm9udFNpemUgPSAxMjtcbiAgICAgIGZvbnRUb1VuaXRSYXRpbyA9IGRlZmF1bHRGb250U2l6ZSAvIHRoaXMucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgdGhpcy5wcmlvck1hcmdpbkJvdHRvbSA9IHRoaXMucHJpb3JNYXJnaW5Cb3R0b20gfHwgMDtcbiAgICAgIHBhcmFncmFwaHNwYWNpbmdfYmVmb3JlID0gKE1hdGgubWF4KChibG9ja3N0eWxlW1wibWFyZ2luLXRvcFwiXSB8fCAwKSAtIHRoaXMucHJpb3JNYXJnaW5Cb3R0b20sIDApICsgKGJsb2Nrc3R5bGVbXCJwYWRkaW5nLXRvcFwiXSB8fCAwKSkgKiBmb250VG9Vbml0UmF0aW87XG4gICAgICBwYXJhZ3JhcGhzcGFjaW5nX2FmdGVyID0gKChibG9ja3N0eWxlW1wibWFyZ2luLWJvdHRvbVwiXSB8fCAwKSArIChibG9ja3N0eWxlW1wicGFkZGluZy1ib3R0b21cIl0gfHwgMCkpICogZm9udFRvVW5pdFJhdGlvO1xuICAgICAgdGhpcy5wcmlvck1hcmdpbkJvdHRvbSA9IGJsb2Nrc3R5bGVbXCJtYXJnaW4tYm90dG9tXCJdIHx8IDA7XG5cbiAgICAgIGlmIChibG9ja3N0eWxlWydwYWdlLWJyZWFrLWJlZm9yZSddID09PSAnYWx3YXlzJykge1xuICAgICAgICB0aGlzLnBkZi5hZGRQYWdlKCk7XG4gICAgICAgIHRoaXMueSA9IDA7XG4gICAgICAgIHBhcmFncmFwaHNwYWNpbmdfYmVmb3JlID0gKChibG9ja3N0eWxlW1wibWFyZ2luLXRvcFwiXSB8fCAwKSArIChibG9ja3N0eWxlW1wicGFkZGluZy10b3BcIl0gfHwgMCkpICogZm9udFRvVW5pdFJhdGlvO1xuICAgICAgfVxuXG4gICAgICBvdXQgPSB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZTtcbiAgICAgIGkgPSB2b2lkIDA7XG4gICAgICBsID0gdm9pZCAwO1xuICAgICAgdGhpcy55ICs9IHBhcmFncmFwaHNwYWNpbmdfYmVmb3JlO1xuICAgICAgb3V0KFwicVwiLCBcIkJUIDAgZ1wiLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRDb29yZGluYXRlU3RyaW5nKHRoaXMueCksIHRoaXMucGRmLmludGVybmFsLmdldFZlcnRpY2FsQ29vcmRpbmF0ZVN0cmluZyh0aGlzLnkpLCBcIlRkXCIpOyAvL3N0b3JlcyB0aGUgY3VycmVudCBpbmRlbnQgb2YgY3Vyc29yIHBvc2l0aW9uXG5cbiAgICAgIHZhciBjdXJyZW50SW5kZW50ID0gMDtcblxuICAgICAgd2hpbGUgKGxpbmVzLmxlbmd0aCkge1xuICAgICAgICBsaW5lID0gbGluZXMuc2hpZnQoKTtcbiAgICAgICAgbWF4TGluZUhlaWdodCA9IDA7XG4gICAgICAgIGkgPSAwO1xuICAgICAgICBsID0gbGluZS5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGkgIT09IGwpIHtcbiAgICAgICAgICBpZiAobGluZVtpXVswXS50cmltKCkpIHtcbiAgICAgICAgICAgIG1heExpbmVIZWlnaHQgPSBNYXRoLm1heChtYXhMaW5lSGVpZ2h0LCBsaW5lW2ldWzFdW1wibGluZS1oZWlnaHRcIl0sIGxpbmVbaV1bMV1bXCJmb250LXNpemVcIl0pO1xuICAgICAgICAgICAgZm9udFNpemUgPSBsaW5lW2ldWzFdW1wiZm9udC1zaXplXCJdICogNztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpKys7XG4gICAgICAgIH0gLy9pZiB3ZSBoYXZlIHRvIG1vdmUgdGhlIGN1cnNvciB0byBhZGFwdCB0aGUgaW5kZW50XG5cblxuICAgICAgICB2YXIgaW5kZW50TW92ZSA9IDA7XG4gICAgICAgIHZhciB3YW50ZWRJbmRlbnQgPSAwOyAvL2lmIGEgbWFyZ2luIHdhcyBhZGRlZCAoYnkgZS5nLiBhIHRleHQtYWxpZ25tZW50KSwgbW92ZSB0aGUgY3Vyc29yXG5cbiAgICAgICAgaWYgKGxpbmVbMF1bMV1bXCJtYXJnaW4tbGVmdFwiXSAhPT0gdW5kZWZpbmVkICYmIGxpbmVbMF1bMV1bXCJtYXJnaW4tbGVmdFwiXSA+IDApIHtcbiAgICAgICAgICB3YW50ZWRJbmRlbnQgPSB0aGlzLnBkZi5pbnRlcm5hbC5nZXRDb29yZGluYXRlU3RyaW5nKGxpbmVbMF1bMV1bXCJtYXJnaW4tbGVmdFwiXSk7XG4gICAgICAgICAgaW5kZW50TW92ZSA9IHdhbnRlZEluZGVudCAtIGN1cnJlbnRJbmRlbnQ7XG4gICAgICAgICAgY3VycmVudEluZGVudCA9IHdhbnRlZEluZGVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbmRlbnRNb3JlID0gTWF0aC5tYXgoYmxvY2tzdHlsZVtcIm1hcmdpbi1sZWZ0XCJdIHx8IDAsIDApICogZm9udFRvVW5pdFJhdGlvOyAvL21vdmUgdGhlIGN1cnNvclxuXG4gICAgICAgIG91dChpbmRlbnRNb3ZlICsgaW5kZW50TW9yZSwgKC0xICogZGVmYXVsdEZvbnRTaXplICogbWF4TGluZUhlaWdodCkudG9GaXhlZCgyKSwgXCJUZFwiKTtcbiAgICAgICAgaSA9IDA7XG4gICAgICAgIGwgPSBsaW5lLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoaSAhPT0gbCkge1xuICAgICAgICAgIGlmIChsaW5lW2ldWzBdKSB7XG4gICAgICAgICAgICB0aGlzLlJlbmRlclRleHRGcmFnbWVudChsaW5lW2ldWzBdLCBsaW5lW2ldWzFdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnkgKz0gbWF4TGluZUhlaWdodCAqIGZvbnRUb1VuaXRSYXRpbzsgLy9pZiBzb21lIHdhdGNoZXIgZnVuY3Rpb24gd2FzIGV4ZWN1dGVkIHN1Y2Nlc3NmdWwsIHNvIGUuZy4gbWFyZ2luIGFuZCB3aWR0aHMgd2VyZSBjaGFuZ2VkLFxuICAgICAgICAvL3Jlc2V0IGxpbmUgZHJhd2luZyBhbmQgY2FsY3VsYXRlIHBvc2l0aW9uIGFuZCBsaW5lcyBhZ2FpblxuICAgICAgICAvL2UuZy4gdG8gc3RvcCB0ZXh0IGZsb2F0aW5nIGFyb3VuZCBhbiBpbWFnZVxuXG4gICAgICAgIGlmICh0aGlzLmV4ZWN1dGVXYXRjaEZ1bmN0aW9ucyhsaW5lWzBdWzFdKSAmJiBsaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFyIGxvY2FsRnJhZ21lbnRzID0gW107XG4gICAgICAgICAgdmFyIGxvY2FsU3R5bGVzID0gW107IC8vY3JlYXRlIGZyYWdtZW50IGFycmF5IG9mXG5cbiAgICAgICAgICBsaW5lcy5mb3JFYWNoKGZ1bmN0aW9uIChsb2NhbExpbmUpIHtcbiAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgIHZhciBsID0gbG9jYWxMaW5lLmxlbmd0aDtcblxuICAgICAgICAgICAgd2hpbGUgKGkgIT09IGwpIHtcbiAgICAgICAgICAgICAgaWYgKGxvY2FsTGluZVtpXVswXSkge1xuICAgICAgICAgICAgICAgIGxvY2FsRnJhZ21lbnRzLnB1c2gobG9jYWxMaW5lW2ldWzBdICsgJyAnKTtcbiAgICAgICAgICAgICAgICBsb2NhbFN0eWxlcy5wdXNoKGxvY2FsTGluZVtpXVsxXSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICArK2k7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7IC8vc3BsaXQgbGluZXMgYWdhaW4gZHVlIHRvIHBvc3NpYmxlIGNvb3JkaW5hdGUgY2hhbmdlc1xuXG4gICAgICAgICAgbGluZXMgPSB0aGlzLnNwbGl0RnJhZ21lbnRzSW50b0xpbmVzKFB1cmdlV2hpdGVTcGFjZShsb2NhbEZyYWdtZW50cyksIGxvY2FsU3R5bGVzKTsgLy9yZXBvc2l0aW9uIHRoZSBjdXJyZW50IGN1cnNvclxuXG4gICAgICAgICAgb3V0KFwiRVRcIiwgXCJRXCIpO1xuICAgICAgICAgIG91dChcInFcIiwgXCJCVCAwIGdcIiwgdGhpcy5wZGYuaW50ZXJuYWwuZ2V0Q29vcmRpbmF0ZVN0cmluZyh0aGlzLngpLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRWZXJ0aWNhbENvb3JkaW5hdGVTdHJpbmcodGhpcy55KSwgXCJUZFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2IgJiYgdHlwZW9mIGNiID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2IuY2FsbCh0aGlzLCB0aGlzLnggLSA5LCB0aGlzLnkgLSBmb250U2l6ZSAvIDIpO1xuICAgICAgfVxuXG4gICAgICBvdXQoXCJFVFwiLCBcIlFcIik7XG4gICAgICByZXR1cm4gdGhpcy55ICs9IHBhcmFncmFwaHNwYWNpbmdfYWZ0ZXI7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5zZXRCbG9ja0JvdW5kYXJ5ID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJQYXJhZ3JhcGgoY2IpO1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuc2V0QmxvY2tTdHlsZSA9IGZ1bmN0aW9uIChjc3MpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmFncmFwaC5ibG9ja3N0eWxlID0gY3NzO1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuYWRkVGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBjc3MpIHtcbiAgICAgIHRoaXMucGFyYWdyYXBoLnRleHQucHVzaCh0ZXh0KTtcbiAgICAgIHJldHVybiB0aGlzLnBhcmFncmFwaC5zdHlsZS5wdXNoKGNzcyk7XG4gICAgfTtcblxuICAgIEZvbnROYW1lREIgPSB7XG4gICAgICBoZWx2ZXRpY2E6IFwiaGVsdmV0aWNhXCIsXG4gICAgICBcInNhbnMtc2VyaWZcIjogXCJoZWx2ZXRpY2FcIixcbiAgICAgIFwidGltZXMgbmV3IHJvbWFuXCI6IFwidGltZXNcIixcbiAgICAgIHNlcmlmOiBcInRpbWVzXCIsXG4gICAgICB0aW1lczogXCJ0aW1lc1wiLFxuICAgICAgbW9ub3NwYWNlOiBcImNvdXJpZXJcIixcbiAgICAgIGNvdXJpZXI6IFwiY291cmllclwiXG4gICAgfTtcbiAgICBGb250V2VpZ2h0TWFwID0ge1xuICAgICAgMTAwOiBcIm5vcm1hbFwiLFxuICAgICAgMjAwOiBcIm5vcm1hbFwiLFxuICAgICAgMzAwOiBcIm5vcm1hbFwiLFxuICAgICAgNDAwOiBcIm5vcm1hbFwiLFxuICAgICAgNTAwOiBcImJvbGRcIixcbiAgICAgIDYwMDogXCJib2xkXCIsXG4gICAgICA3MDA6IFwiYm9sZFwiLFxuICAgICAgODAwOiBcImJvbGRcIixcbiAgICAgIDkwMDogXCJib2xkXCIsXG4gICAgICBub3JtYWw6IFwibm9ybWFsXCIsXG4gICAgICBib2xkOiBcImJvbGRcIixcbiAgICAgIGJvbGRlcjogXCJib2xkXCIsXG4gICAgICBsaWdodGVyOiBcIm5vcm1hbFwiXG4gICAgfTtcbiAgICBGb250U3R5bGVNYXAgPSB7XG4gICAgICBub3JtYWw6IFwibm9ybWFsXCIsXG4gICAgICBpdGFsaWM6IFwiaXRhbGljXCIsXG4gICAgICBvYmxpcXVlOiBcIml0YWxpY1wiXG4gICAgfTtcbiAgICBUZXh0QWxpZ25NYXAgPSB7XG4gICAgICBsZWZ0OiBcImxlZnRcIixcbiAgICAgIHJpZ2h0OiBcInJpZ2h0XCIsXG4gICAgICBjZW50ZXI6IFwiY2VudGVyXCIsXG4gICAgICBqdXN0aWZ5OiBcImp1c3RpZnlcIlxuICAgIH07XG4gICAgRmxvYXRNYXAgPSB7XG4gICAgICBub25lOiAnbm9uZScsXG4gICAgICByaWdodDogJ3JpZ2h0JyxcbiAgICAgIGxlZnQ6ICdsZWZ0J1xuICAgIH07XG4gICAgQ2xlYXJNYXAgPSB7XG4gICAgICBub25lOiAnbm9uZScsXG4gICAgICBib3RoOiAnYm90aCdcbiAgICB9O1xuICAgIFVuaXRlZE51bWJlck1hcCA9IHtcbiAgICAgIG5vcm1hbDogMVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgSFRNTC1mb3JtYXR0ZWQgdGV4dCBpbnRvIGZvcm1hdHRlZCBQREYgdGV4dC5cbiAgICAgKlxuICAgICAqIE5vdGVzOlxuICAgICAqIDIwMTItMDctMThcbiAgICAgKiBQbHVnaW4gcmVsaWVzIG9uIGhhdmluZyBicm93c2VyLCBET00gYXJvdW5kLiBUaGUgSFRNTCBpcyBwdXNoZWQgaW50byBkb20gYW5kIHRyYXZlcnNlZC5cbiAgICAgKiBQbHVnaW4gcmVsaWVzIG9uIGpRdWVyeSBmb3IgQ1NTIGV4dHJhY3Rpb24uXG4gICAgICogVGFyZ2V0aW5nIEhUTUwgb3V0cHV0IGZyb20gTWFya2Rvd24gdGVtcGxhdGluZywgd2hpY2ggaXMgYSB2ZXJ5IHNpbXBsZVxuICAgICAqIG1hcmt1cCAtIGRpdiwgc3BhbiwgZW0sIHN0cm9uZywgcC4gTm8gYnItYmFzZWQgcGFyYWdyYXBoIHNlcGFyYXRpb24gc3VwcG9ydGVkIGV4cGxpY2l0bHkgKGJ1dCBzdGlsbCBtYXkgd29yay4pXG4gICAgICogSW1hZ2VzLCB0YWJsZXMgYXJlIE5PVCBzdXBwb3J0ZWQuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIEhUTUwge1N0cmluZ3xPYmplY3R9IEhUTUwtZm9ybWF0dGVkIHRleHQsIG9yIHBvaW50ZXIgdG8gRE9NIGVsZW1lbnQgdGhhdCBpcyB0byBiZSByZW5kZXJlZCBpbnRvIFBERi5cbiAgICAgKiBAcGFyYW0geCB7TnVtYmVyfSBzdGFydGluZyBYIGNvb3JkaW5hdGUgaW4ganNQREYgaW5zdGFuY2UncyBkZWNsYXJlZCB1bml0cy5cbiAgICAgKiBAcGFyYW0geSB7TnVtYmVyfSBzdGFydGluZyBZIGNvb3JkaW5hdGUgaW4ganNQREYgaW5zdGFuY2UncyBkZWNsYXJlZCB1bml0cy5cbiAgICAgKiBAcGFyYW0gc2V0dGluZ3Mge09iamVjdH0gQWRkaXRpb25hbCAvIG9wdGlvbmFsIHZhcmlhYmxlcyBjb250cm9sbGluZyBwYXJzaW5nLCByZW5kZXJpbmcuXG4gICAgICogQHJldHVybnMge09iamVjdH0ganNQREYgaW5zdGFuY2VcbiAgICAgKi9cblxuICAgIGpzUERGQVBJLmZyb21IVE1MID0gZnVuY3Rpb24gKEhUTUwsIHgsIHksIHNldHRpbmdzLCBjYWxsYmFjaywgbWFyZ2lucykge1xuXG4gICAgICB0aGlzLm1hcmdpbnNfZG9jID0gbWFyZ2lucyB8fCB7XG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgYm90dG9tOiAwXG4gICAgICB9O1xuICAgICAgaWYgKCFzZXR0aW5ncykgc2V0dGluZ3MgPSB7fTtcbiAgICAgIGlmICghc2V0dGluZ3MuZWxlbWVudEhhbmRsZXJzKSBzZXR0aW5ncy5lbGVtZW50SGFuZGxlcnMgPSB7fTtcbiAgICAgIHJldHVybiBwcm9jZXNzKHRoaXMsIEhUTUwsIGlzTmFOKHgpID8gNCA6IHgsIGlzTmFOKHkpID8gNCA6IHksIHNldHRpbmdzLCBjYWxsYmFjayk7XG4gICAgfTtcbiAgfSkoanNwZGYuanNQREYuQVBJKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2pzcGRmX3BsdWdpbnMvZnJvbV9odG1sLmpzXG4vLyBtb2R1bGUgaWQgPSA2M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9