From fdd612add582043e2d5e6a61a0d58a948c2cbeeb Mon Sep 17 00:00:00 2001 From: mtkennerly Date: Sat, 27 Jul 2019 21:16:19 -0400 Subject: [PATCH] Updates --- public/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/index.js b/public/index.js index 199c94c..e26e7d2 100644 --- a/public/index.js +++ b/public/index.js @@ -28274,7 +28274,7 @@ let MetaWorkspace = class MetaWorkspace extends react__WEBPACK_IMPORTED_MODULE_2 react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_material_react_text_field__WEBPACK_IMPORTED_MODULE_6__["Input"], { required: true, type: "number", min: 0, max: 1, step: 0.05, value: song.meta.swing, // @ts-ignore onChange: e => { - const value = parseInt(e.currentTarget.value); + const value = parseFloat(e.currentTarget.value); if (isNaN(value)) { return; } @@ -28436,4 +28436,4 @@ window.onload = onLoad; /***/ }) /******/ }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vaW5zdHJ1bWVudHMueWFtbCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LWJ1dHRvbi9kaXN0L2J1dHRvbi5jc3M/ZWJkZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LWJ1dHRvbi9kaXN0L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AbWF0ZXJpYWwvcmVhY3QtZGlhbG9nL2Rpc3QvZGlhbG9nLmNzcz9hNTczIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AbWF0ZXJpYWwvcmVhY3QtZGlhbG9nL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BtYXRlcmlhbC9yZWFjdC1kaWFsb2cvbm9kZV9tb2R1bGVzL0BtYXRlcmlhbC9yZWFjdC1idXR0b24vZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LWRpYWxvZy9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LXJpcHBsZS9kaXN0L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AbWF0ZXJpYWwvcmVhY3QtZmxvYXRpbmctbGFiZWwvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LWxpbmUtcmlwcGxlL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BtYXRlcmlhbC9yZWFjdC1saXN0L2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BtYXRlcmlhbC9yZWFjdC1tZW51LXN1cmZhY2UvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LW1lbnUtc3VyZmFjZS9kaXN0L21lbnUtc3VyZmFjZS5jc3M/MjM2NyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LW1lbnUvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LW1lbnUvbm9kZV9tb2R1bGVzL0BtYXRlcmlhbC9yZWFjdC1tZW51LXN1cmZhY2UvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LW5vdGNoZWQtb3V0bGluZS9kaXN0L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AbWF0ZXJpYWwvcmVhY3QtcmlwcGxlL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BtYXRlcmlhbC9yZWFjdC1zZWxlY3QvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LXNlbGVjdC9kaXN0L3NlbGVjdC5jc3M/M2JiMSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LXRleHQtZmllbGQvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LXRleHQtZmllbGQvZGlzdC90ZXh0LWZpZWxkLmNzcz9kZGViIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AbngtanMvb2JzZXJ2ZXItdXRpbC9kaXN0L2VzLmVzNS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY2xhc3NuYW1lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LWJ1dHRvbi9kaXN0L2J1dHRvbi5jc3MiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BtYXRlcmlhbC9yZWFjdC1kaWFsb2cvZGlzdC9kaWFsb2cuY3NzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AbWF0ZXJpYWwvcmVhY3QtbWVudS1zdXJmYWNlL2Rpc3QvbWVudS1zdXJmYWNlLmNzcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LXNlbGVjdC9kaXN0L3NlbGVjdC5jc3MiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BtYXRlcmlhbC9yZWFjdC10ZXh0LWZpZWxkL2Rpc3QvdGV4dC1maWVsZC5jc3MiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9jaGVja1Byb3BUeXBlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWVhc3ktc3RhdGUvZGlzdC9lcy5lczYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWVhc3ktc3RhdGUvZGlzdC9yZWFjdC1wbGF0Zm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LmRldmVsb3BtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2Nqcy9zY2hlZHVsZXItdHJhY2luZy5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2Nqcy9zY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL3RyYWNpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvbGliL3VybHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3RvbmUvYnVpbGQvVG9uZS5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL3NyYy9hdWRpby50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZGF0YS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsYXllci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0RBQTBDLGdDQUFnQztBQUMxRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdFQUF3RCxrQkFBa0I7QUFDMUU7QUFDQSx5REFBaUQsY0FBYztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQXlDLGlDQUFpQztBQUMxRSx3SEFBZ0gsbUJBQW1CLEVBQUU7QUFDckk7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFD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QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFlBQVksUUFBUTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0Es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OztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFD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QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLE9BQU87QUFDbEIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUIsMEJBQTBCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFlBQVksZUFBZTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNGQUFzRixhQUFhO0FBQ25HO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsV0FBVztBQUN0QixXQUFXLE9BQU87QUFDbEIsV0FBVyxFQUFFO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0RBQWtEO0FBQ2xEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHlDQUF5Qzs7QUFFekM7OztBQUdBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsa0JBQWtCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsYUFBYTtBQUMvQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSCxpQkFBaUIsa0NBQWtDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFlBQVksUUFBUTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUIseUJBQXlCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQix5QkFBeUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsdUJBQXVCO0FBQ2xDLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsdUJBQXVCO0FBQ2xDLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyx1QkFBdUI7QUFDbEMsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFdBQVc7QUFDdEIsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFlBQVksV0FBVztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixzQkFBc0I7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBLHVCQUF1QjtBQUN2Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQixzQkFBc0I7QUFDakQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUIsMkJBQTJCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDJCQUEyQjtBQUM5QztBQUNBO0FBQ0E7QUFDQSxvQkFBb0IscUJBQXFCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsc0JBQXNCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFdBQVc7QUFDdEIsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixZQUFZLE9BQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsRUFBRTtBQUNiLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCO0FBQ3hCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNENBQTRDOztBQUU1QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsV0FBVztBQUN0QixXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVSxpQ0FBaUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixzQkFBc0I7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxnQ0FBZ0MsS0FBSztBQUMzQztBQUNBO0FBQ0EsTUFBTSxnQ0FBZ0MsS0FBSztBQUMzQztBQUNBLDREQUE0RDtBQUM1RCxNQUFNLGdDQUFnQyxLQUFLO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscU9BQXFPO0FBQ3JPO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhLQUE4SyxZQUFZO0FBQzFMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUxBQXVMLCtCQUErQjtBQUN0Tjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpS0FBaUssaUJBQWlCO0FBQ2xMLE9BQU87QUFDUCxpS0FBaUssaUJBQWlCLHdEQUF3RCxtQkFBbUIsZ0JBQWdCLDhCQUE4QjtBQUMzUztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLCtHQUErRyxHQUFHO0FBQ2xIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRJQUE0SSxtQkFBbUIsZ0JBQWdCLDhCQUE4QjtBQUM3TSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxZQUFZLEtBQUk7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQiwwQkFBMEI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0Esc0RBQXNELGVBQWU7QUFDckUsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLDRCQUE0QjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxZQUFZLEtBQUk7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQiw0QkFBNEI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isd0JBQXdCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxLQUFJO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsY0FBYyxLQUFJO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxZQUFZLEtBQUk7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLFVBQVUsS0FBSTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUNBQWlDO0FBQ2pDLGdCQUFnQjs7QUFFaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNLEtBQUk7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNLEtBQUk7QUFDVjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0EsTUFBTSxLQUFJO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTSxLQUFJO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTSxLQUFJO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1CQUFtQjtBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpRUFBaUU7QUFDakU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsVUFBVSxLQUFJO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLHNGQUFzRixhQUFhO0FBQ25HO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRGQUE0RixlQUFlO0FBQzNHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSx3Q0FBd0M7QUFDeEMsaURBQWlEO0FBQ2pELHFEQUFxRDtBQUNyRCwwREFBMEQ7QUFDMUQsOERBQThEO0FBQzlELDJEQUEyRDtBQUMzRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtHQUFrRztBQUNsRzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNklBQTZJOztBQUU3STtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNULGtFQUFrRSw0Q0FBNEM7QUFDOUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtLQUFrSyx5Q0FBeUM7QUFDM007QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQix3QkFBd0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsa0RBQWtEO0FBQzVEO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWSw2QkFBNkI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFVBQVUsNkJBQTZCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxhQUFhO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVSxpQ0FBaUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFlBQVk7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFVBQVUsWUFBWTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkNBQTZDLE1BQU07QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLHVCQUF1Qiw4QkFBOEI7QUFDckQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsNENBQTRDO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSx5TkFBeU4sMENBQTBDO0FBQ25RO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSCxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLHlOQUF5TixxQ0FBcUMsd0ZBQXdGLDJCQUEyQixxQkFBcUIsUUFBUSxZQUFZO0FBQzFaLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksS0FBSTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUFJO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsVUFBVSxLQUFJO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxVQUFVLEtBQUk7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLEtBQUk7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWSxLQUFJO0FBQ2hCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLEtBQUk7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxNQUFNLEtBQUk7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQUk7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsS0FBSTtBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsWUFBWSxLQUFJO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsOE1BQThNLG9EQUFvRCxFQUFFO0FBQ3BRO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFLG1CQUFtQjtBQUN6Rjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUVBQXlFO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixvQkFBb0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnR0FBZ0c7QUFDaEc7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7O0FBRXBCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStEO0FBQy9EO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixzQkFBc0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsc0JBQXNCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLGlRQUFpUSxjQUFjO0FBQy9RO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7Ozs7Ozs7Ozs7OztBQzd4cEJhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLElBQXFDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQUksS0FBcUMsRUFBRSxFQUsxQztBQUNELG1CQUFtQixtQkFBTyxDQUFDLDZGQUFnQztBQUMzRDs7Ozs7Ozs7Ozs7OztBQ3JDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXNFO0FBQ21CO0FBQzlCOztBQUUzRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsOENBQVE7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQixrREFBSTtBQUN2QjtBQUNBLDJCQUEyQixzREFBUSxHQUFHO0FBQ3RDOztBQUVBLHFCQUFxQixxREFBTyxPQUFPLG9FQUFPO0FBQzFDLG9DQUFvQztBQUNwQztBQUNBLE9BQU87QUFDUDtBQUNBLGNBQWM7O0FBRWQsTUFBTSx1REFBUztBQUNmLHFCQUFxQixzRUFBUztBQUM5QixPQUFPLE1BQU07QUFDYjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0gsdUNBQXVDLCtDQUFTLFFBQVE7QUFDeEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7O0FBRXJDLHNCQUFzQixvRUFBTztBQUM3QiwyQ0FBMkM7QUFDM0M7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxRQUFROztBQUVqQjtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdULFFBQVEsc0VBQVM7QUFDakI7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQSwyREFBMkQ7QUFDM0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0UsaUVBQVksTUFBTSx3REFBRztBQUN2Rjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxxREFBTyxPQUFPLHVFQUFVO0FBQ25DOztBQUVBLFNBQVMsdUVBQVU7QUFDbkI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRSwrRUFBdUI7QUFDekI7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDBDQUEwQztBQUMxQztBQUNBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0EsQ0FBQzs7QUFFNkI7QUFDOUI7Ozs7Ozs7Ozs7Ozs7O0FDN09BO0FBQUE7QUFBQTtBQUFBO0FBQXlCOzs7Ozs7Ozs7Ozs7O0FDQXpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7Ozs7QUFJYixJQUFJLElBQXFDO0FBQ3pDO0FBQ0E7O0FBRUEsY0FBYyxtQkFBTyxDQUFDLDREQUFlO0FBQ3JDLHFCQUFxQixtQkFBTyxDQUFDLDhFQUEyQjs7QUFFeEQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLHNGQUFzRixhQUFhO0FBQ25HO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRGQUE0RixlQUFlO0FBQzNHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxzRkFBc0YsYUFBYTtBQUNuRztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscU9BQXFPO0FBQ3JPO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFdBQVc7QUFDeEIsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxXQUFXO0FBQ3hCLGFBQWEsVUFBVTtBQUN2QixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxXQUFXO0FBQ3hCLGFBQWEsT0FBTztBQUNwQixhQUFhLFVBQVU7QUFDdkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFdBQVc7QUFDeEIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsVUFBVTtBQUN2QixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsZ0JBQWdCO0FBQzNCO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0ZBQXNGLGFBQWE7QUFDbkc7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsRUFBRTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLEVBQUU7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsaUJBQWlCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLGlCQUFpQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsc0JBQXNCO0FBQ3pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLHNCQUFzQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7O0FBR0Esa0RBQWtEOzs7QUFHbEQ7OztBQUdBOzs7QUFHQTtBQUNBOztBQUVBOzs7QUFHQTs7O0FBR0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7Ozs7Ozs7Ozs7Ozs7QUM1MkRhOztBQUViLElBQUksS0FBcUMsRUFBRSxFQUUxQztBQUNELG1CQUFtQixtQkFBTyxDQUFDLGlGQUE0QjtBQUN2RDs7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7Ozs7QUFJYixJQUFJLElBQXFDO0FBQ3pDO0FBQ0E7O0FBRUEsOENBQThDLGNBQWM7O0FBRTVEOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7O0FBR0Esa0RBQWtEOzs7QUFHbEQ7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7O0FBR0E7OztBQUdBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7Ozs7Ozs7Ozs7O0FDdGFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7Ozs7QUFJYixJQUFJLElBQXFDO0FBQ3pDO0FBQ0E7O0FBRUEsOENBQThDLGNBQWM7O0FBRTVEOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtB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QUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQ7O0FBRUEsNkJBQTZCLG1CQUFtQjs7QUFFaEQ7O0FBRUE7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7OztBQzlZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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LEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUk7b0JBQ3ZILDJEQUFDLFlBQVksSUFBQyxNQUFNLEVBQUMsV0FBVyxFQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUk7b0JBQ3pILDJEQUFDLFlBQVksSUFBQyxNQUFNLEVBQUMsT0FBTyxFQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUk7b0JBQ25ILDJEQUFDLFlBQVksSUFBQyxNQUFNLEVBQUMsUUFBUSxFQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUk7b0JBQ3BILDJEQUFDLFlBQVksSUFBQyxNQUFNLEVBQUMsUUFBUSxFQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUk7b0JBQ3BILDJEQUFDLFlBQVksSUFBQyxNQUFNLEVBQUMsWUFBWSxFQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFF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QUNmO0FBQ0wsQ0FBQztBQUVELFNBQVMsTUFBTTtJQUNYLGdEQUFRLENBQUMsTUFBTSxDQUFDLDJEQUFDLEdBQUcsT0FBRyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUUxRCxRQUFRLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxFQUFFO1FBQzFCLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxFQUFFLEVBQUU7WUFDdEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25CLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDMUI7SUFDTCxDQUFDLENBQUM7SUFFRixNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BELElBQUksVUFBVSxLQUFLLElBQUksRUFBRTtRQUNyQixVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztLQUMxRTtBQUNMLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL3BsYXllci50c3hcIik7XG4iLCJjb25zdCBkb2MgPSBbKHtcIm1pZGkucGlhbm8xXCI6KHtcImluZGV4XCI6MCwgXCJkdXJhdGlvblwiOlwic2hvcnRcIiwgXCJjYXRlZ29yeVwiOltcIk1JRElcIiwgXCJQaWFub1wiLCBcIkdyYW5kIFBpYW5vXCJdfSksIFwibWlkaS5jaHJvbTFcIjooe1wiaW5kZXhcIjo4LCBcImR1cmF0aW9uXCI6XCJjb25zdGFudFwiLCBcImNhdGVnb3J5XCI6W1wiTUlESVwiLCBcIkJlbGxzXCIsIFwiQ2VsZXN0YVwiXX0pLCBcIm1pZGkub3JnYW4xXCI6KHtcImluZGV4XCI6MTYsIFwiZHVyYXRpb25cIjpcImluc3RhbnRcIiwgXCJjYXRlZ29yeVwiOltcIk1JRElcIiwgXCJPcmdhblwiLCBcIkRyYXdiYXIgT3JnYW5cIl19KSwgXCJtaWRpLmd1aXRhcjFcIjooe1wiaW5kZXhcIjoyNCwgXCJkdXJhdGlvblwiOlwic2hvcnRcIiwgXCJjYXRlZ29yeVwiOltcIk1JRElcIiwgXCJHdWl0YXJcIiwgXCJOeWxvbiBHdWl0YXJcIl19KSwgXCJtaWRpLmJhc3MxXCI6KHtcImluZGV4XCI6MzIsIFwiZHVyYXRpb25cIjpcImluc3RhbnRcIiwgXCJjYXRlZ29yeVwiOltcIk1JRElcIiwgXCJCYXNzXCIsIFwiQWNvdXN0aWMgQmFzc1wiXX0pLCBcIm1pZGkuc3RyaW5nczFcIjooe1wiaW5kZXhcIjo0MCwgXCJkdXJhdGlvblwiOlwibWluaVwiLCBcImNhdGVnb3J5XCI6W1wiTUlESVwiLCBcIlN0cmluZ3NcIiwgXCJWaW9saW5cIl19KSwgXCJtaWRpLmVuc2VtYmxlMVwiOih7XCJpbmRleFwiOjQ4LCBcImR1cmF0aW9uXCI6XCJtaWRcIiwgXCJjYXRlZ29yeVwiOltcIk1JRElcIiwgXCJFbnNlbWJsZVwiLCBcIlN0cmluZyBFbnNlbWJsZSAxXCJdfSksIFwibWlkaS5icmFzczFcIjooe1wiaW5kZXhcIjo1NiwgXCJkdXJhdGlvblwiOlwibWluaVwiLCBcImNhdGVnb3J5XCI6W1wiTUlESVwiLCBcIkJyYXNzXCIsIFwiVHJ1bXBldFwiXX0pLCBcIm1pZGkucmVlZDFcIjooe1wiaW5kZXhcIjo2NCwgXCJkdXJhdGlvblwiOlwibWluaVwiLCBcImNhdGVnb3J5XCI6W1wiTUlESVwiLCBcIlJlZWRcIiwgXCJTb3ByYW5vIFNheFwiXX0pLCBcIm1pZGkucGlwZTFcIjooe1wiaW5kZXhcIjo3MiwgXCJkdXJhdGlvblwiOlwibWluaVwiLCBcImNhdGVnb3J5XCI6W1wiTUlESVwiLCBcIlBpcGVcIiwgXCJQaWNjb2xvXCJdfSksIFwibWlkaS5sZWFkMVwiOih7XCJpbmRleFwiOjgwLCBcImR1cmF0aW9uXCI6XCJtaW5pXCIsIFwiY2F0ZWdvcnlcIjpbXCJNSURJXCIsIFwiTGVhZFwiLCBcIlNxdWFyZSBMZWFkXCJdfSksIFwibWlkaS5wYWQxXCI6KHtcImluZGV4XCI6ODgsIFwiZHVyYXRpb25cIjpcImxvbmdcIiwgXCJjYXRlZ29yeVwiOltcIk1JRElcIiwgXCJQYWRzXCIsIFwiTmV3IEFnZSBQYWRcIl19KSwgXCJtaWRpLmZ4MVwiOih7XCJpbmRleFwiOjk2LCBcImR1cmF0aW9uXCI6XCJtZWdhXCIsIFwiY2F0ZWdvcnlcIjpbXCJNSURJXCIsIFwiU3ludGhcIiwgXCJSYWluXCJdfSksIFwibWlkaS53b3JsZDFcIjooe1wiaW5kZXhcIjoxMDQsIFwiZHVyYXRpb25cIjpcImV4dGVuZGVkXCIsIFwiY2F0ZWdvcnlcIjpbXCJNSURJXCIsIFwiV29ybGRcIiwgXCJTaXRhclwiXX0pLCBcIm1pZGkucGVyY3VzMVwiOih7XCJpbmRleFwiOjExMiwgXCJkdXJhdGlvblwiOlwibG9uZ1wiLCBcImNhdGVnb3J5XCI6W1wiTUlESVwiLCBcIkRydW1zXCIsIFwiVGlua2xlIEJlbGxcIl19KSwgXCJtaWRpLnNlMVwiOih7XCJpbmRleFwiOjEyMCwgXCJkdXJhdGlvblwiOlwibWluaVwiLCBcImNhdGVnb3J5XCI6W1wiTUlESVwiLCBcIkVmZmVjdHNcIiwgXCJGcmV0IE5vaXNlXCJdfSksIFwic3F1YXJlXCI6KHtcImluZGV4XCI6MTI4LCBcImR1cmF0aW9uXCI6XCJpbmZpbml0ZVwiLCBcImNhdGVnb3J5XCI6W1wiQ2hpcHR1bmVcIiwgXCJTcXVhcmUgV2F2ZVwiXX0pfSldO1xubW9kdWxlLmV4cG9ydHMgPSBkb2MubGVuZ3RoIDw9IDEgPyBkb2NbMF0gOiBkb2M7IiwiXG52YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9idXR0b24uY3NzXCIpO1xuXG5pZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblxudmFyIHRyYW5zZm9ybTtcbnZhciBpbnNlcnRJbnRvO1xuXG5cblxudmFyIG9wdGlvbnMgPSB7XCJobXJcIjp0cnVlfVxuXG5vcHRpb25zLnRyYW5zZm9ybSA9IHRyYW5zZm9ybVxub3B0aW9ucy5pbnNlcnRJbnRvID0gdW5kZWZpbmVkO1xuXG52YXIgdXBkYXRlID0gcmVxdWlyZShcIiEuLi8uLi8uLi9zdHlsZS1sb2FkZXIvbGliL2FkZFN0eWxlcy5qc1wiKShjb250ZW50LCBvcHRpb25zKTtcblxuaWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cbmlmKG1vZHVsZS5ob3QpIHtcblx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9idXR0b24uY3NzXCIsIGZ1bmN0aW9uKCkge1xuXHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2J1dHRvbi5jc3NcIik7XG5cblx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblxuXHRcdHZhciBsb2NhbHMgPSAoZnVuY3Rpb24oYSwgYikge1xuXHRcdFx0dmFyIGtleSwgaWR4ID0gMDtcblxuXHRcdFx0Zm9yKGtleSBpbiBhKSB7XG5cdFx0XHRcdGlmKCFiIHx8IGFba2V5XSAhPT0gYltrZXldKSByZXR1cm4gZmFsc2U7XG5cdFx0XHRcdGlkeCsrO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3Ioa2V5IGluIGIpIGlkeC0tO1xuXG5cdFx0XHRyZXR1cm4gaWR4ID09PSAwO1xuXHRcdH0oY29udGVudC5sb2NhbHMsIG5ld0NvbnRlbnQubG9jYWxzKSk7XG5cblx0XHRpZighbG9jYWxzKSB0aHJvdyBuZXcgRXJyb3IoJ0Fib3J0aW5nIENTUyBITVIgZHVlIHRvIGNoYW5nZWQgY3NzLW1vZHVsZXMgbG9jYWxzLicpO1xuXG5cdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHR9KTtcblxuXHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcbn0iLCIhZnVuY3Rpb24oZSx0KXtpZihcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZSltb2R1bGUuZXhwb3J0cz10KHJlcXVpcmUoXCJyZWFjdFwiKSxyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSxyZXF1aXJlKFwiQG1hdGVyaWFsL3JlYWN0LXJpcHBsZS9kaXN0L2luZGV4LmpzXCIpKTtlbHNlIGlmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW1wicmVhY3RcIixcImNsYXNzbmFtZXNcIixcIkBtYXRlcmlhbC9yZWFjdC1yaXBwbGUvZGlzdC9pbmRleC5qc1wiXSx0KTtlbHNle3ZhciBuPVwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP3QocmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpLHJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtcmlwcGxlL2Rpc3QvaW5kZXguanNcIikpOnQoZS5yZWFjdCxlLmNsYXNzbmFtZXMsZVtcIkBtYXRlcmlhbC9yZWFjdC1yaXBwbGUvZGlzdC9pbmRleC5qc1wiXSk7Zm9yKHZhciByIGluIG4pKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6ZSlbcl09bltyXX19KFwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcyxmdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Z1bmN0aW9uIG4ocil7aWYodFtyXSlyZXR1cm4gdFtyXS5leHBvcnRzO3ZhciBvPXRbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiBlW3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9cmV0dXJuIG4ubT1lLG4uYz10LG4uZD1mdW5jdGlvbihlLHQscil7bi5vKGUsdCl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6ITAsZ2V0OnJ9KX0sbi5yPWZ1bmN0aW9uKGUpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbihlLHQpe2lmKDEmdCYmKGU9bihlKSksOCZ0KXJldHVybiBlO2lmKDQmdCYmXCJvYmplY3RcIj09dHlwZW9mIGUmJmUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTplfSksMiZ0JiZcInN0cmluZ1wiIT10eXBlb2YgZSlmb3IodmFyIG8gaW4gZSluLmQocixvLGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfS5iaW5kKG51bGwsbykpO3JldHVybiByfSxuLm49ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIG4uZCh0LFwiYVwiLHQpLHR9LG4ubz1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX0sbi5wPVwiXCIsbihuLnM9NDUpfSh7MDpmdW5jdGlvbih0LG4pe3QuZXhwb3J0cz1lfSwxOmZ1bmN0aW9uKGUsbil7ZS5leHBvcnRzPXR9LDQ1OmZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPTEscj1hcmd1bWVudHMubGVuZ3RoO248cjtuKyspZm9yKHZhciBvIGluIHQ9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG8pJiYoZVtvXT10W29dKTtyZXR1cm4gZX0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sbz10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtmb3IodmFyIHIgaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmdC5pbmRleE9mKHIpPDAmJihuW3JdPWVbcl0pO2lmKG51bGwhPWUmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBvPTA7Zm9yKHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtvPHIubGVuZ3RoO28rKyl0LmluZGV4T2YocltvXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUscltvXSkmJihuW3Jbb11dPWVbcltvXV0pfXJldHVybiBufSxpPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBsPWkobigwKSksdT1pKG4oMSkpLGE9big1KSxzPW4oNDYpO3QuQnV0dG9uPWZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5jbGFzc05hbWUsaT12b2lkIDA9PT1uP1wiXCI6bixhPWUucmFpc2VkLGQ9dm9pZCAwIT09YSYmYSxmPWUudW5lbGV2YXRlZCxwPXZvaWQgMCE9PWYmJmYsUz1lLm91dGxpbmVkLGI9dm9pZCAwIT09UyYmUyxtPWUuZGVuc2UseT12b2lkIDAhPT1tJiZtLEU9ZS5kaXNhYmxlZCxfPXZvaWQgMCE9PUUmJkUsdj1lLmljb24sTz1lLmhyZWYsaj1lLmNoaWxkcmVuLEM9ZS5pbml0UmlwcGxlLGg9ZS50cmFpbGluZ0ljb24seD0oZS51bmJvdW5kZWQsbyhlLFtcImNsYXNzTmFtZVwiLFwicmFpc2VkXCIsXCJ1bmVsZXZhdGVkXCIsXCJvdXRsaW5lZFwiLFwiZGVuc2VcIixcImRpc2FibGVkXCIsXCJpY29uXCIsXCJocmVmXCIsXCJjaGlsZHJlblwiLFwiaW5pdFJpcHBsZVwiLFwidHJhaWxpbmdJY29uXCIsXCJ1bmJvdW5kZWRcIl0pKSxMPXIoe2NsYXNzTmFtZTp1LmRlZmF1bHQocy5DU1NfQ0xBU1NFUy5ST09ULGksKHQ9e30sdFtzLkNTU19DTEFTU0VTLlJBSVNFRF09ZCx0W3MuQ1NTX0NMQVNTRVMuVU5FTEVWQVRFRF09cCx0W3MuQ1NTX0NMQVNTRVMuT1VUTElORURdPWIsdFtzLkNTU19DTEFTU0VTLkRFTlNFXT15LHQpKSxyZWY6QyxkaXNhYmxlZDpffSx4KTtyZXR1cm4gTz9sLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImFcIixyKHt9LEwse2hyZWY6T30pLGg/bnVsbDpjKHYpLGwuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6cy5DU1NfQ0xBU1NFUy5MQUJFTH0saiksaD9jKGgpOm51bGwpOmwuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIscih7fSxMKSxoP251bGw6Yyh2KSxsLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7Y2xhc3NOYW1lOnMuQ1NTX0NMQVNTRVMuTEFCRUx9LGopLGg/YyhoKTpudWxsKX07dmFyIGM9ZnVuY3Rpb24oZSl7cmV0dXJuIGU/bC5kZWZhdWx0LmNsb25lRWxlbWVudChlLHtjbGFzc05hbWU6dS5kZWZhdWx0KHMuQ1NTX0NMQVNTRVMuSUNPTixlLnByb3BzLmNsYXNzTmFtZSl9KTpudWxsfTt0LkJ1dHRvbi5kZWZhdWx0UHJvcHM9e2luaXRSaXBwbGU6ZnVuY3Rpb24oKXt9fSx0LmRlZmF1bHQ9YS53aXRoUmlwcGxlKHQuQnV0dG9uKX0sNDY6ZnVuY3Rpb24oZSx0LG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3QuQ1NTX0NMQVNTRVM9e1JPT1Q6XCJtZGMtYnV0dG9uXCIsSUNPTjpcIm1kYy1idXR0b25fX2ljb25cIixMQUJFTDpcIm1kYy1idXR0b25fX2xhYmVsXCIsREVOU0U6XCJtZGMtYnV0dG9uLS1kZW5zZVwiLFJBSVNFRDpcIm1kYy1idXR0b24tLXJhaXNlZFwiLE9VVExJTkVEOlwibWRjLWJ1dHRvbi0tb3V0bGluZWRcIixVTkVMRVZBVEVEOlwibWRjLWJ1dHRvbi0tdW5lbGV2YXRlZFwifX0sNTpmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1ufX0pfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1idXR0b24uanMubWFwIiwiXG52YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kaWFsb2cuY3NzXCIpO1xuXG5pZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblxudmFyIHRyYW5zZm9ybTtcbnZhciBpbnNlcnRJbnRvO1xuXG5cblxudmFyIG9wdGlvbnMgPSB7XCJobXJcIjp0cnVlfVxuXG5vcHRpb25zLnRyYW5zZm9ybSA9IHRyYW5zZm9ybVxub3B0aW9ucy5pbnNlcnRJbnRvID0gdW5kZWZpbmVkO1xuXG52YXIgdXBkYXRlID0gcmVxdWlyZShcIiEuLi8uLi8uLi9zdHlsZS1sb2FkZXIvbGliL2FkZFN0eWxlcy5qc1wiKShjb250ZW50LCBvcHRpb25zKTtcblxuaWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cbmlmKG1vZHVsZS5ob3QpIHtcblx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kaWFsb2cuY3NzXCIsIGZ1bmN0aW9uKCkge1xuXHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2RpYWxvZy5jc3NcIik7XG5cblx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblxuXHRcdHZhciBsb2NhbHMgPSAoZnVuY3Rpb24oYSwgYikge1xuXHRcdFx0dmFyIGtleSwgaWR4ID0gMDtcblxuXHRcdFx0Zm9yKGtleSBpbiBhKSB7XG5cdFx0XHRcdGlmKCFiIHx8IGFba2V5XSAhPT0gYltrZXldKSByZXR1cm4gZmFsc2U7XG5cdFx0XHRcdGlkeCsrO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3Ioa2V5IGluIGIpIGlkeC0tO1xuXG5cdFx0XHRyZXR1cm4gaWR4ID09PSAwO1xuXHRcdH0oY29udGVudC5sb2NhbHMsIG5ld0NvbnRlbnQubG9jYWxzKSk7XG5cblx0XHRpZighbG9jYWxzKSB0aHJvdyBuZXcgRXJyb3IoJ0Fib3J0aW5nIENTUyBITVIgZHVlIHRvIGNoYW5nZWQgY3NzLW1vZHVsZXMgbG9jYWxzLicpO1xuXG5cdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHR9KTtcblxuXHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcbn0iLCIhZnVuY3Rpb24odCxlKXtpZihcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZSltb2R1bGUuZXhwb3J0cz1lKHJlcXVpcmUoXCJyZWFjdFwiKSxyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSxyZXF1aXJlKFwiQG1hdGVyaWFsL3JlYWN0LWJ1dHRvbi9kaXN0L2luZGV4LmpzXCIpKTtlbHNlIGlmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW1wicmVhY3RcIixcImNsYXNzbmFtZXNcIixcIkBtYXRlcmlhbC9yZWFjdC1idXR0b24vZGlzdC9pbmRleC5qc1wiXSxlKTtlbHNle3ZhciBuPVwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2UocmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpLHJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtYnV0dG9uL2Rpc3QvaW5kZXguanNcIikpOmUodC5yZWFjdCx0LmNsYXNzbmFtZXMsdFtcIkBtYXRlcmlhbC9yZWFjdC1idXR0b24vZGlzdC9pbmRleC5qc1wiXSk7Zm9yKHZhciBvIGluIG4pKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6dClbb109bltvXX19KFwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcyxmdW5jdGlvbih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4obyl7aWYoZVtvXSlyZXR1cm4gZVtvXS5leHBvcnRzO3ZhciByPWVbb109e2k6byxsOiExLGV4cG9ydHM6e319O3JldHVybiB0W29dLmNhbGwoci5leHBvcnRzLHIsci5leHBvcnRzLG4pLHIubD0hMCxyLmV4cG9ydHN9cmV0dXJuIG4ubT10LG4uYz1lLG4uZD1mdW5jdGlvbih0LGUsbyl7bi5vKHQsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2VudW1lcmFibGU6ITAsZ2V0Om99KX0sbi5yPWZ1bmN0aW9uKHQpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbih0LGUpe2lmKDEmZSYmKHQ9bih0KSksOCZlKXJldHVybiB0O2lmKDQmZSYmXCJvYmplY3RcIj09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgbz1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihvKSxPYmplY3QuZGVmaW5lUHJvcGVydHkobyxcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTp0fSksMiZlJiZcInN0cmluZ1wiIT10eXBlb2YgdClmb3IodmFyIHIgaW4gdCluLmQobyxyLGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfS5iaW5kKG51bGwscikpO3JldHVybiBvfSxuLm49ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIG4uZChlLFwiYVwiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPVwiXCIsbihuLnM9NjApfSh7MDpmdW5jdGlvbihlLG4pe2UuZXhwb3J0cz10fSwxOmZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWV9LDE2MTpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5yKGUpO1wiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yO1xuLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxuXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovdmFyIG89ZnVuY3Rpb24odCxlKXtyZXR1cm4obz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9O3ZhciByPWZ1bmN0aW9uKCl7cmV0dXJuKHI9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxvPWFyZ3VtZW50cy5sZW5ndGg7bjxvO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZvaWQgMD09PXQmJih0PXt9KSx0aGlzLmFkYXB0ZXJfPXR9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcInN0cmluZ3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJudW1iZXJzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe30sdH0oKSxhPW4oNCk7bi5kKGUsXCJNRENEaWFsb2dGb3VuZGF0aW9uXCIsZnVuY3Rpb24oKXtyZXR1cm4gc30pO1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG52YXIgcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciBvPXQuY2FsbCh0aGlzLHIoe30sZS5kZWZhdWx0QWRhcHRlcixuKSl8fHRoaXM7cmV0dXJuIG8uaXNPcGVuXz0hMSxvLmFuaW1hdGlvbkZyYW1lXz0wLG8uYW5pbWF0aW9uVGltZXJfPTAsby5sYXlvdXRGcmFtZV89MCxvLmVzY2FwZUtleUFjdGlvbl89YS5zdHJpbmdzLkNMT1NFX0FDVElPTixvLnNjcmltQ2xpY2tBY3Rpb25fPWEuc3RyaW5ncy5DTE9TRV9BQ1RJT04sby5hdXRvU3RhY2tCdXR0b25zXz0hMCxvLmFyZUJ1dHRvbnNTdGFja2VkXz0hMSxvfXJldHVybiBmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9byh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0oZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEuY3NzQ2xhc3Nlc30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcInN0cmluZ3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEuc3RyaW5nc30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIm51bWJlcnNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEubnVtYmVyc30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybnthZGRCb2R5Q2xhc3M6ZnVuY3Rpb24oKXt9LGFkZENsYXNzOmZ1bmN0aW9uKCl7fSxhcmVCdXR0b25zU3RhY2tlZDpmdW5jdGlvbigpe3JldHVybiExfSxjbGlja0RlZmF1bHRCdXR0b246ZnVuY3Rpb24oKXt9LGV2ZW50VGFyZ2V0TWF0Y2hlczpmdW5jdGlvbigpe3JldHVybiExfSxnZXRBY3Rpb25Gcm9tRXZlbnQ6ZnVuY3Rpb24oKXtyZXR1cm5cIlwifSxoYXNDbGFzczpmdW5jdGlvbigpe3JldHVybiExfSxpc0NvbnRlbnRTY3JvbGxhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LG5vdGlmeUNsb3NlZDpmdW5jdGlvbigpe30sbm90aWZ5Q2xvc2luZzpmdW5jdGlvbigpe30sbm90aWZ5T3BlbmVkOmZ1bmN0aW9uKCl7fSxub3RpZnlPcGVuaW5nOmZ1bmN0aW9uKCl7fSxyZWxlYXNlRm9jdXM6ZnVuY3Rpb24oKXt9LHJlbW92ZUJvZHlDbGFzczpmdW5jdGlvbigpe30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oKXt9LHJldmVyc2VCdXR0b25zOmZ1bmN0aW9uKCl7fSx0cmFwRm9jdXM6ZnVuY3Rpb24oKXt9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dGhpcy5hZGFwdGVyXy5oYXNDbGFzcyhhLmNzc0NsYXNzZXMuU1RBQ0tFRCkmJnRoaXMuc2V0QXV0b1N0YWNrQnV0dG9ucyghMSl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmlzT3Blbl8mJnRoaXMuY2xvc2UoYS5zdHJpbmdzLkRFU1RST1lfQUNUSU9OKSx0aGlzLmFuaW1hdGlvblRpbWVyXyYmKGNsZWFyVGltZW91dCh0aGlzLmFuaW1hdGlvblRpbWVyXyksdGhpcy5oYW5kbGVBbmltYXRpb25UaW1lckVuZF8oKSksdGhpcy5sYXlvdXRGcmFtZV8mJihjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmxheW91dEZyYW1lXyksdGhpcy5sYXlvdXRGcmFtZV89MCl9LGUucHJvdG90eXBlLm9wZW49ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuaXNPcGVuXz0hMCx0aGlzLmFkYXB0ZXJfLm5vdGlmeU9wZW5pbmcoKSx0aGlzLmFkYXB0ZXJfLmFkZENsYXNzKGEuY3NzQ2xhc3Nlcy5PUEVOSU5HKSx0aGlzLnJ1bk5leHRBbmltYXRpb25GcmFtZV8oZnVuY3Rpb24oKXt0LmFkYXB0ZXJfLmFkZENsYXNzKGEuY3NzQ2xhc3Nlcy5PUEVOKSx0LmFkYXB0ZXJfLmFkZEJvZHlDbGFzcyhhLmNzc0NsYXNzZXMuU0NST0xMX0xPQ0spLHQubGF5b3V0KCksdC5hbmltYXRpb25UaW1lcl89c2V0VGltZW91dChmdW5jdGlvbigpe3QuaGFuZGxlQW5pbWF0aW9uVGltZXJFbmRfKCksdC5hZGFwdGVyXy50cmFwRm9jdXMoKSx0LmFkYXB0ZXJfLm5vdGlmeU9wZW5lZCgpfSxhLm51bWJlcnMuRElBTE9HX0FOSU1BVElPTl9PUEVOX1RJTUVfTVMpfSl9LGUucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dm9pZCAwPT09dCYmKHQ9XCJcIiksdGhpcy5pc09wZW5fJiYodGhpcy5pc09wZW5fPSExLHRoaXMuYWRhcHRlcl8ubm90aWZ5Q2xvc2luZyh0KSx0aGlzLmFkYXB0ZXJfLmFkZENsYXNzKGEuY3NzQ2xhc3Nlcy5DTE9TSU5HKSx0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGEuY3NzQ2xhc3Nlcy5PUEVOKSx0aGlzLmFkYXB0ZXJfLnJlbW92ZUJvZHlDbGFzcyhhLmNzc0NsYXNzZXMuU0NST0xMX0xPQ0spLGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uRnJhbWVfKSx0aGlzLmFuaW1hdGlvbkZyYW1lXz0wLGNsZWFyVGltZW91dCh0aGlzLmFuaW1hdGlvblRpbWVyXyksdGhpcy5hbmltYXRpb25UaW1lcl89c2V0VGltZW91dChmdW5jdGlvbigpe2UuYWRhcHRlcl8ucmVsZWFzZUZvY3VzKCksZS5oYW5kbGVBbmltYXRpb25UaW1lckVuZF8oKSxlLmFkYXB0ZXJfLm5vdGlmeUNsb3NlZCh0KX0sYS5udW1iZXJzLkRJQUxPR19BTklNQVRJT05fQ0xPU0VfVElNRV9NUykpfSxlLnByb3RvdHlwZS5pc09wZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc09wZW5ffSxlLnByb3RvdHlwZS5nZXRFc2NhcGVLZXlBY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lc2NhcGVLZXlBY3Rpb25ffSxlLnByb3RvdHlwZS5zZXRFc2NhcGVLZXlBY3Rpb249ZnVuY3Rpb24odCl7dGhpcy5lc2NhcGVLZXlBY3Rpb25fPXR9LGUucHJvdG90eXBlLmdldFNjcmltQ2xpY2tBY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zY3JpbUNsaWNrQWN0aW9uX30sZS5wcm90b3R5cGUuc2V0U2NyaW1DbGlja0FjdGlvbj1mdW5jdGlvbih0KXt0aGlzLnNjcmltQ2xpY2tBY3Rpb25fPXR9LGUucHJvdG90eXBlLmdldEF1dG9TdGFja0J1dHRvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hdXRvU3RhY2tCdXR0b25zX30sZS5wcm90b3R5cGUuc2V0QXV0b1N0YWNrQnV0dG9ucz1mdW5jdGlvbih0KXt0aGlzLmF1dG9TdGFja0J1dHRvbnNfPXR9LGUucHJvdG90eXBlLmxheW91dD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5sYXlvdXRGcmFtZV8mJmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMubGF5b3V0RnJhbWVfKSx0aGlzLmxheW91dEZyYW1lXz1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt0LmxheW91dEludGVybmFsXygpLHQubGF5b3V0RnJhbWVfPTB9KX0sZS5wcm90b3R5cGUuaGFuZGxlSW50ZXJhY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9XCJjbGlja1wiPT09dC50eXBlLG49XCJFbnRlclwiPT09dC5rZXl8fDEzPT09dC5rZXlDb2RlLG89XCJTcGFjZVwiPT09dC5rZXl8fDMyPT09dC5rZXlDb2RlLHI9dGhpcy5hZGFwdGVyXy5ldmVudFRhcmdldE1hdGNoZXModC50YXJnZXQsYS5zdHJpbmdzLlNDUklNX1NFTEVDVE9SKSxpPSF0aGlzLmFkYXB0ZXJfLmV2ZW50VGFyZ2V0TWF0Y2hlcyh0LnRhcmdldCxhLnN0cmluZ3MuU1VQUFJFU1NfREVGQVVMVF9QUkVTU19TRUxFQ1RPUik7aWYoZSYmciYmXCJcIiE9PXRoaXMuc2NyaW1DbGlja0FjdGlvbl8pdGhpcy5jbG9zZSh0aGlzLnNjcmltQ2xpY2tBY3Rpb25fKTtlbHNlIGlmKGV8fG98fG4pe3ZhciBzPXRoaXMuYWRhcHRlcl8uZ2V0QWN0aW9uRnJvbUV2ZW50KHQpO3M/dGhpcy5jbG9zZShzKTpuJiZpJiZ0aGlzLmFkYXB0ZXJfLmNsaWNrRGVmYXVsdEJ1dHRvbigpfX0sZS5wcm90b3R5cGUuaGFuZGxlRG9jdW1lbnRLZXlkb3duPWZ1bmN0aW9uKHQpeyhcIkVzY2FwZVwiPT09dC5rZXl8fDI3PT09dC5rZXlDb2RlKSYmXCJcIiE9PXRoaXMuZXNjYXBlS2V5QWN0aW9uXyYmdGhpcy5jbG9zZSh0aGlzLmVzY2FwZUtleUFjdGlvbl8pfSxlLnByb3RvdHlwZS5sYXlvdXRJbnRlcm5hbF89ZnVuY3Rpb24oKXt0aGlzLmF1dG9TdGFja0J1dHRvbnNfJiZ0aGlzLmRldGVjdFN0YWNrZWRCdXR0b25zXygpLHRoaXMuZGV0ZWN0U2Nyb2xsYWJsZUNvbnRlbnRfKCl9LGUucHJvdG90eXBlLmhhbmRsZUFuaW1hdGlvblRpbWVyRW5kXz1mdW5jdGlvbigpe3RoaXMuYW5pbWF0aW9uVGltZXJfPTAsdGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyhhLmNzc0NsYXNzZXMuT1BFTklORyksdGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyhhLmNzc0NsYXNzZXMuQ0xPU0lORyl9LGUucHJvdG90eXBlLnJ1bk5leHRBbmltYXRpb25GcmFtZV89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbkZyYW1lXyksdGhpcy5hbmltYXRpb25GcmFtZV89cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7ZS5hbmltYXRpb25GcmFtZV89MCxjbGVhclRpbWVvdXQoZS5hbmltYXRpb25UaW1lcl8pLGUuYW5pbWF0aW9uVGltZXJfPXNldFRpbWVvdXQodCwwKX0pfSxlLnByb3RvdHlwZS5kZXRlY3RTdGFja2VkQnV0dG9uc189ZnVuY3Rpb24oKXt0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGEuY3NzQ2xhc3Nlcy5TVEFDS0VEKTt2YXIgdD10aGlzLmFkYXB0ZXJfLmFyZUJ1dHRvbnNTdGFja2VkKCk7dCYmdGhpcy5hZGFwdGVyXy5hZGRDbGFzcyhhLmNzc0NsYXNzZXMuU1RBQ0tFRCksdCE9PXRoaXMuYXJlQnV0dG9uc1N0YWNrZWRfJiYodGhpcy5hZGFwdGVyXy5yZXZlcnNlQnV0dG9ucygpLHRoaXMuYXJlQnV0dG9uc1N0YWNrZWRfPXQpfSxlLnByb3RvdHlwZS5kZXRlY3RTY3JvbGxhYmxlQ29udGVudF89ZnVuY3Rpb24oKXt0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGEuY3NzQ2xhc3Nlcy5TQ1JPTExBQkxFKSx0aGlzLmFkYXB0ZXJfLmlzQ29udGVudFNjcm9sbGFibGUoKSYmdGhpcy5hZGFwdGVyXy5hZGRDbGFzcyhhLmNzc0NsYXNzZXMuU0NST0xMQUJMRSl9LGV9KGkpO2UuZGVmYXVsdD1zfSwxNzI6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24ucihlKTt2YXIgbz17fTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xuZnVuY3Rpb24gcih0LGUpe2lmKHQuY2xvc2VzdClyZXR1cm4gdC5jbG9zZXN0KGUpO2Zvcih2YXIgbj10O247KXtpZihpKG4sZSkpcmV0dXJuIG47bj1uLnBhcmVudEVsZW1lbnR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gaSh0LGUpe3JldHVybih0Lm1hdGNoZXN8fHQud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHx0Lm1zTWF0Y2hlc1NlbGVjdG9yKS5jYWxsKHQsZSl9bi5yKG8pLG4uZChvLFwiY2xvc2VzdFwiLGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KSxuLmQobyxcIm1hdGNoZXNcIixmdW5jdGlvbigpe3JldHVybiBpfSksbi5kKGUsXCJwb255ZmlsbFwiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KX0sMjM6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBvPVwibWRjLWRpYWxvZ1wiLHI9e0JBU0U6byxDT05UQUlORVI6bytcIl9fY29udGFpbmVyXCIsU1VSRkFDRTpvK1wiX19zdXJmYWNlXCIsVElUTEU6bytcIl9fdGl0bGVcIixDT05URU5UOm8rXCJfX2NvbnRlbnRcIixBQ1RJT05TOm8rXCJfX2FjdGlvbnNcIixCVVRUT046bytcIl9fYnV0dG9uXCIsREVGQVVMVF9CVVRUT046bytcIl9fYnV0dG9uLS1kZWZhdWx0XCIsU0NSSU06bytcIl9fc2NyaW1cIn07ZS5jc3NDbGFzc2VzPXI7ZS5MQVlPVVRfRVZFTlRTPVtcInJlc2l6ZVwiLFwib3JpZW50YXRpb25jaGFuZ2VcIl19LDQ6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24ucihlKSxuLmQoZSxcImNzc0NsYXNzZXNcIixmdW5jdGlvbigpe3JldHVybiBvfSksbi5kKGUsXCJzdHJpbmdzXCIsZnVuY3Rpb24oKXtyZXR1cm4gcn0pLG4uZChlLFwibnVtYmVyc1wiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIG89e0NMT1NJTkc6XCJtZGMtZGlhbG9nLS1jbG9zaW5nXCIsT1BFTjpcIm1kYy1kaWFsb2ctLW9wZW5cIixPUEVOSU5HOlwibWRjLWRpYWxvZy0tb3BlbmluZ1wiLFNDUk9MTEFCTEU6XCJtZGMtZGlhbG9nLS1zY3JvbGxhYmxlXCIsU0NST0xMX0xPQ0s6XCJtZGMtZGlhbG9nLXNjcm9sbC1sb2NrXCIsU1RBQ0tFRDpcIm1kYy1kaWFsb2ctLXN0YWNrZWRcIn0scj17QUNUSU9OX0FUVFJJQlVURTpcImRhdGEtbWRjLWRpYWxvZy1hY3Rpb25cIixCVVRUT05fU0VMRUNUT1I6XCIubWRjLWRpYWxvZ19fYnV0dG9uXCIsQ0xPU0VEX0VWRU5UOlwiTURDRGlhbG9nOmNsb3NlZFwiLENMT1NFX0FDVElPTjpcImNsb3NlXCIsQ0xPU0lOR19FVkVOVDpcIk1EQ0RpYWxvZzpjbG9zaW5nXCIsQ09OVEFJTkVSX1NFTEVDVE9SOlwiLm1kYy1kaWFsb2dfX2NvbnRhaW5lclwiLENPTlRFTlRfU0VMRUNUT1I6XCIubWRjLWRpYWxvZ19fY29udGVudFwiLERFRkFVTFRfQlVUVE9OX1NFTEVDVE9SOlwiLm1kYy1kaWFsb2dfX2J1dHRvbi0tZGVmYXVsdFwiLERFU1RST1lfQUNUSU9OOlwiZGVzdHJveVwiLE9QRU5FRF9FVkVOVDpcIk1EQ0RpYWxvZzpvcGVuZWRcIixPUEVOSU5HX0VWRU5UOlwiTURDRGlhbG9nOm9wZW5pbmdcIixTQ1JJTV9TRUxFQ1RPUjpcIi5tZGMtZGlhbG9nX19zY3JpbVwiLFNVUFBSRVNTX0RFRkFVTFRfUFJFU1NfU0VMRUNUT1I6W1widGV4dGFyZWFcIixcIi5tZGMtbWVudSAubWRjLWxpc3QtaXRlbVwiXS5qb2luKFwiLCBcIiksU1VSRkFDRV9TRUxFQ1RPUjpcIi5tZGMtZGlhbG9nX19zdXJmYWNlXCJ9LGk9e0RJQUxPR19BTklNQVRJT05fQ0xPU0VfVElNRV9NUzo3NSxESUFMT0dfQU5JTUFUSU9OX09QRU5fVElNRV9NUzoxNTB9fSw0NDpmdW5jdGlvbih0LGUsbil7dmFyIG8scixpPW4oNjIpLGE9big2Mykscz0ocj1bXSx7YWN0aXZhdGVUcmFwOmZ1bmN0aW9uKHQpe2lmKHIubGVuZ3RoPjApe3ZhciBlPXJbci5sZW5ndGgtMV07ZSE9PXQmJmUucGF1c2UoKX12YXIgbj1yLmluZGV4T2YodCk7LTE9PT1uP3IucHVzaCh0KTooci5zcGxpY2UobiwxKSxyLnB1c2godCkpfSxkZWFjdGl2YXRlVHJhcDpmdW5jdGlvbih0KXt2YXIgZT1yLmluZGV4T2YodCk7LTEhPT1lJiZyLnNwbGljZShlLDEpLHIubGVuZ3RoPjAmJnJbci5sZW5ndGgtMV0udW5wYXVzZSgpfX0pO2Z1bmN0aW9uIGModCl7cmV0dXJuIHNldFRpbWVvdXQodCwwKX10LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj1kb2N1bWVudCxyPVwic3RyaW5nXCI9PXR5cGVvZiB0P24ucXVlcnlTZWxlY3Rvcih0KTp0LHU9YSh7cmV0dXJuRm9jdXNPbkRlYWN0aXZhdGU6ITAsZXNjYXBlRGVhY3RpdmF0ZXM6ITB9LGUpLGw9e2ZpcnN0VGFiYmFibGVOb2RlOm51bGwsbGFzdFRhYmJhYmxlTm9kZTpudWxsLG5vZGVGb2N1c2VkQmVmb3JlQWN0aXZhdGlvbjpudWxsLG1vc3RSZWNlbnRseUZvY3VzZWROb2RlOm51bGwsYWN0aXZlOiExLHBhdXNlZDohMX0sZj17YWN0aXZhdGU6ZnVuY3Rpb24odCl7aWYoIWwuYWN0aXZlKXtnKCksbC5hY3RpdmU9ITAsbC5wYXVzZWQ9ITEsbC5ub2RlRm9jdXNlZEJlZm9yZUFjdGl2YXRpb249bi5hY3RpdmVFbGVtZW50O3ZhciBlPXQmJnQub25BY3RpdmF0ZT90Lm9uQWN0aXZhdGU6dS5vbkFjdGl2YXRlO3JldHVybiBlJiZlKCkscCgpLGZ9fSxkZWFjdGl2YXRlOmQscGF1c2U6ZnVuY3Rpb24oKXshbC5wYXVzZWQmJmwuYWN0aXZlJiYobC5wYXVzZWQ9ITAsbSgpKX0sdW5wYXVzZTpmdW5jdGlvbigpe2wucGF1c2VkJiZsLmFjdGl2ZSYmKGwucGF1c2VkPSExLGcoKSxwKCkpfX07cmV0dXJuIGY7ZnVuY3Rpb24gZCh0KXtpZihsLmFjdGl2ZSl7Y2xlYXJUaW1lb3V0KG8pLG0oKSxsLmFjdGl2ZT0hMSxsLnBhdXNlZD0hMSxzLmRlYWN0aXZhdGVUcmFwKGYpO3ZhciBlPXQmJnZvaWQgMCE9PXQub25EZWFjdGl2YXRlP3Qub25EZWFjdGl2YXRlOnUub25EZWFjdGl2YXRlO3JldHVybiBlJiZlKCksKHQmJnZvaWQgMCE9PXQucmV0dXJuRm9jdXM/dC5yZXR1cm5Gb2N1czp1LnJldHVybkZvY3VzT25EZWFjdGl2YXRlKSYmYyhmdW5jdGlvbigpe0MobC5ub2RlRm9jdXNlZEJlZm9yZUFjdGl2YXRpb24pfSksZn19ZnVuY3Rpb24gcCgpe2lmKGwuYWN0aXZlKXJldHVybiBzLmFjdGl2YXRlVHJhcChmKSxvPWMoZnVuY3Rpb24oKXtDKGgoKSl9KSxuLmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsdiwhMCksbi5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsXyx7Y2FwdHVyZTohMCxwYXNzaXZlOiExfSksbi5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLF8se2NhcHR1cmU6ITAscGFzc2l2ZTohMX0pLG4uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsYix7Y2FwdHVyZTohMCxwYXNzaXZlOiExfSksbi5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLE8se2NhcHR1cmU6ITAscGFzc2l2ZTohMX0pLGZ9ZnVuY3Rpb24gbSgpe2lmKGwuYWN0aXZlKXJldHVybiBuLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsdiwhMCksbi5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsXywhMCksbi5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLF8sITApLG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsYiwhMCksbi5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLE8sITApLGZ9ZnVuY3Rpb24geSh0KXt2YXIgZT11W3RdLG89ZTtpZighZSlyZXR1cm4gbnVsbDtpZihcInN0cmluZ1wiPT10eXBlb2YgZSYmIShvPW4ucXVlcnlTZWxlY3RvcihlKSkpdGhyb3cgbmV3IEVycm9yKFwiYFwiK3QrXCJgIHJlZmVycyB0byBubyBrbm93biBub2RlXCIpO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGUmJiEobz1lKCkpKXRocm93IG5ldyBFcnJvcihcImBcIit0K1wiYCBkaWQgbm90IHJldHVybiBhIG5vZGVcIik7cmV0dXJuIG99ZnVuY3Rpb24gaCgpe3ZhciB0O2lmKCEodD1udWxsIT09eShcImluaXRpYWxGb2N1c1wiKT95KFwiaW5pdGlhbEZvY3VzXCIpOnIuY29udGFpbnMobi5hY3RpdmVFbGVtZW50KT9uLmFjdGl2ZUVsZW1lbnQ6bC5maXJzdFRhYmJhYmxlTm9kZXx8eShcImZhbGxiYWNrRm9jdXNcIikpKXRocm93IG5ldyBFcnJvcihcIllvdSBjYW4ndCBoYXZlIGEgZm9jdXMtdHJhcCB3aXRob3V0IGF0IGxlYXN0IG9uZSBmb2N1c2FibGUgZWxlbWVudFwiKTtyZXR1cm4gdH1mdW5jdGlvbiBfKHQpe3IuY29udGFpbnModC50YXJnZXQpfHwodS5jbGlja091dHNpZGVEZWFjdGl2YXRlcz9kKHtyZXR1cm5Gb2N1czohaS5pc0ZvY3VzYWJsZSh0LnRhcmdldCl9KTp0LnByZXZlbnREZWZhdWx0KCkpfWZ1bmN0aW9uIHYodCl7ci5jb250YWlucyh0LnRhcmdldCl8fHQudGFyZ2V0IGluc3RhbmNlb2YgRG9jdW1lbnR8fCh0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLEMobC5tb3N0UmVjZW50bHlGb2N1c2VkTm9kZXx8aCgpKSl9ZnVuY3Rpb24gTyh0KXtpZighMSE9PXUuZXNjYXBlRGVhY3RpdmF0ZXMmJmZ1bmN0aW9uKHQpe3JldHVyblwiRXNjYXBlXCI9PT10LmtleXx8XCJFc2NcIj09PXQua2V5fHwyNz09PXQua2V5Q29kZX0odCkpcmV0dXJuIHQucHJldmVudERlZmF1bHQoKSx2b2lkIGQoKTsoZnVuY3Rpb24odCl7cmV0dXJuXCJUYWJcIj09PXQua2V5fHw5PT09dC5rZXlDb2RlfSkodCkmJmZ1bmN0aW9uKHQpe2lmKGcoKSx0LnNoaWZ0S2V5JiZ0LnRhcmdldD09PWwuZmlyc3RUYWJiYWJsZU5vZGUpcmV0dXJuIHQucHJldmVudERlZmF1bHQoKSx2b2lkIEMobC5sYXN0VGFiYmFibGVOb2RlKTt0LnNoaWZ0S2V5fHx0LnRhcmdldCE9PWwubGFzdFRhYmJhYmxlTm9kZXx8KHQucHJldmVudERlZmF1bHQoKSxDKGwuZmlyc3RUYWJiYWJsZU5vZGUpKX0odCl9ZnVuY3Rpb24gYih0KXt1LmNsaWNrT3V0c2lkZURlYWN0aXZhdGVzfHxyLmNvbnRhaW5zKHQudGFyZ2V0KXx8KHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpKX1mdW5jdGlvbiBnKCl7dmFyIHQ9aShyKTtsLmZpcnN0VGFiYmFibGVOb2RlPXRbMF18fGgoKSxsLmxhc3RUYWJiYWJsZU5vZGU9dFt0Lmxlbmd0aC0xXXx8aCgpfWZ1bmN0aW9uIEModCl7dCE9PW4uYWN0aXZlRWxlbWVudCYmKHQmJnQuZm9jdXM/KHQuZm9jdXMoKSxsLm1vc3RSZWNlbnRseUZvY3VzZWROb2RlPXQsZnVuY3Rpb24odCl7cmV0dXJuIHQudGFnTmFtZSYmXCJpbnB1dFwiPT09dC50YWdOYW1lLnRvTG93ZXJDYXNlKCkmJlwiZnVuY3Rpb25cIj09dHlwZW9mIHQuc2VsZWN0fSh0KSYmdC5zZWxlY3QoKSk6QyhoKCkpKX19fSw2MDpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG8scj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KG89ZnVuY3Rpb24odCxlKXtyZXR1cm4obz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1vKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSksaT10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihpPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsbz1hcmd1bWVudHMubGVuZ3RoO248bztuKyspZm9yKHZhciByIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYT10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIG8gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxvKSYmZS5pbmRleE9mKG8pPDAmJihuW29dPXRbb10pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPTA7Zm9yKG89T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtyPG8ubGVuZ3RoO3IrKyllLmluZGV4T2Yob1tyXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsb1tyXSkmJihuW29bcl1dPXRbb1tyXV0pfXJldHVybiBufSxzPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBjPXMobigwKSksdT1zKG4oMSkpLGw9bigxNjEpLGY9big2MSksZD1uKDQpLHA9bigxNzIpLG09cyhuKDY0KSk7ZS5EaWFsb2dDb250ZW50PW0uZGVmYXVsdDt2YXIgeT1zKG4oNjUpKTtlLkRpYWxvZ0Zvb3Rlcj15LmRlZmF1bHQ7dmFyIGg9cyhuKDY2KSk7ZS5EaWFsb2dUaXRsZT1oLmRlZmF1bHQ7dmFyIF89cyhuKDY3KSk7ZS5EaWFsb2dCdXR0b249Xy5kZWZhdWx0O3ZhciB2PW4oMjMpO2Z1bmN0aW9uIE8odCl7cmV0dXJuIHQudHlwZT09PWguZGVmYXVsdH12YXIgYj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBlLmRpYWxvZ0VsZW1lbnQ9Yy5kZWZhdWx0LmNyZWF0ZVJlZigpLGUuc3RhdGU9e2NsYXNzTGlzdDpuZXcgU2V0fSxlLm9wZW49ZnVuY3Rpb24oKXtlLmluaXRpYWxpemVGb2N1c1RyYXAoKSxlLmZvdW5kYXRpb24ub3BlbigpfSxlLmluaXRpYWxpemVGb2N1c1RyYXA9ZnVuY3Rpb24oKXtlLmZvY3VzVHJhcD1lLnByb3BzLmNoaWxkcmVuJiZmLmNyZWF0ZUZvY3VzVHJhcEluc3RhbmNlKGUuZGlhbG9nRWxlbWVudC5jdXJyZW50KX0sZS5oYW5kbGVPcGVuaW5nPWZ1bmN0aW9uKCl7ZS5wcm9wcy5vbk9wZW5pbmcoKSx2LkxBWU9VVF9FVkVOVFMuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIodCxlLmhhbmRsZUxheW91dCl9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLGUuaGFuZGxlRG9jdW1lbnRLZXlEb3duKX0sZS5oYW5kbGVDbG9zaW5nPWZ1bmN0aW9uKHQpe2UucHJvcHMub25DbG9zaW5nKHQpLHYuTEFZT1VUX0VWRU5UUy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LGUuaGFuZGxlTGF5b3V0KX0pLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsZS5oYW5kbGVEb2N1bWVudEtleURvd24pfSxlLmhhbmRsZUludGVyYWN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBlLmZvdW5kYXRpb24uaGFuZGxlSW50ZXJhY3Rpb24odC5uYXRpdmVFdmVudCl9LGUuaGFuZGxlRG9jdW1lbnRLZXlEb3duPWZ1bmN0aW9uKHQpe3JldHVybiBlLmZvdW5kYXRpb24uaGFuZGxlRG9jdW1lbnRLZXlkb3duKHQpfSxlLmhhbmRsZUxheW91dD1mdW5jdGlvbigpe3JldHVybiBlLmZvdW5kYXRpb24ubGF5b3V0KCl9LGUucmVuZGVyQ29udGFpbmVyPWZ1bmN0aW9uKHQpe3JldHVybiB0P2MuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTp2LmNzc0NsYXNzZXMuQ09OVEFJTkVSfSxjLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6di5jc3NDbGFzc2VzLlNVUkZBQ0V9LGMuZGVmYXVsdC5DaGlsZHJlbi5tYXAodCxlLnJlbmRlckNoaWxkKSkpOnZvaWQgMH0sZS5yZW5kZXJDaGlsZD1mdW5jdGlvbih0LG4pe3JldHVybiBPKHQpfHx0LnR5cGU9PT1tLmRlZmF1bHQ/Yy5kZWZhdWx0LmNsb25lRWxlbWVudCh0LGkoe2tleTpcImNoaWxkLVwiK259LHQucHJvcHMse2lkOmUuc2V0SWQodCx0LnByb3BzLmlkKX0pKTp0fSxlLnNldElkPWZ1bmN0aW9uKHQsbil7dmFyIG89ZS5wcm9wcy5pZDtpZihPKHQpKXt2YXIgcj1ufHxvK1wiLXRpdGxlXCI7cmV0dXJuIGUubGFiZWxsZWRCeT1yLHJ9dmFyIGk9bnx8bytcIi1jb250ZW50XCI7cmV0dXJuIGUuZGVzY3JpYmVkQnk9aSxpfSxlfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9dC5vcGVuLG49dC5hdXRvU3RhY2tCdXR0b25zLG89dC5lc2NhcGVLZXlBY3Rpb24scj10LnNjcmltQ2xpY2tBY3Rpb247dGhpcy5mb3VuZGF0aW9uPW5ldyBsLk1EQ0RpYWxvZ0ZvdW5kYXRpb24odGhpcy5hZGFwdGVyKSx0aGlzLmZvdW5kYXRpb24uaW5pdCgpLGUmJnRoaXMub3BlbigpLG58fHRoaXMuZm91bmRhdGlvbi5zZXRBdXRvU3RhY2tCdXR0b25zKG4pLFwic3RyaW5nXCI9PXR5cGVvZiBvJiZ0aGlzLmZvdW5kYXRpb24uc2V0RXNjYXBlS2V5QWN0aW9uKG8pLFwic3RyaW5nXCI9PXR5cGVvZiByJiZ0aGlzLmZvdW5kYXRpb24uc2V0U2NyaW1DbGlja0FjdGlvbihyKX0sZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLmZvdW5kYXRpb24uZGVzdHJveSgpfSxlLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wcm9wcyxuPWUub3BlbixvPWUuYXV0b1N0YWNrQnV0dG9ucyxyPWUuZXNjYXBlS2V5QWN0aW9uLGk9ZS5zY3JpbUNsaWNrQWN0aW9uO2lmKHQuYXV0b1N0YWNrQnV0dG9ucyE9PW8mJnRoaXMuZm91bmRhdGlvbi5zZXRBdXRvU3RhY2tCdXR0b25zKG8pLHQuZXNjYXBlS2V5QWN0aW9uIT09ciYmdGhpcy5mb3VuZGF0aW9uLnNldEVzY2FwZUtleUFjdGlvbihyKSx0LnNjcmltQ2xpY2tBY3Rpb24hPT1pJiZ0aGlzLmZvdW5kYXRpb24uc2V0U2NyaW1DbGlja0FjdGlvbihpKSx0Lm9wZW4hPT1uKXJldHVybiBuP3RoaXMub3BlbigpOnRoaXMuZm91bmRhdGlvbi5jbG9zZSgpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJjbGFzc2VzXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuc3RhdGUuY2xhc3NMaXN0LGU9dGhpcy5wcm9wcy5jbGFzc05hbWU7cmV0dXJuIHUuZGVmYXVsdCh2LmNzc0NsYXNzZXMuQkFTRSxBcnJheS5mcm9tKHQpLGUpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImJ1dHRvbnNcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kaWFsb2dFbGVtZW50LmN1cnJlbnQmJltdLnNsaWNlLmNhbGwodGhpcy5kaWFsb2dFbGVtZW50LmN1cnJlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh2LmNzc0NsYXNzZXMuQlVUVE9OKSk7cmV0dXJuIHR8fFtdfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImNvbnRlbnRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlhbG9nRWxlbWVudC5jdXJyZW50JiZ0aGlzLmRpYWxvZ0VsZW1lbnQuY3VycmVudC5xdWVyeVNlbGVjdG9yKFwiLlwiK3YuY3NzQ2xhc3Nlcy5DT05URU5UKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJkZWZhdWx0QnV0dG9uXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpYWxvZ0VsZW1lbnQuY3VycmVudCYmdGhpcy5kaWFsb2dFbGVtZW50LmN1cnJlbnQucXVlcnlTZWxlY3RvcihcIi5cIit2LmNzc0NsYXNzZXMuREVGQVVMVF9CVVRUT04pfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPWwuTURDRGlhbG9nRm91bmRhdGlvbi5zdHJpbmdzLG49cC5wb255ZmlsbC5jbG9zZXN0LG89cC5wb255ZmlsbC5tYXRjaGVzO3JldHVybnthZGRDbGFzczpmdW5jdGlvbihlKXt2YXIgbj10LnN0YXRlLmNsYXNzTGlzdDtuLmFkZChlKSx0LnNldFN0YXRlKHtjbGFzc0xpc3Q6bn0pfSxyZW1vdmVDbGFzczpmdW5jdGlvbihlKXt2YXIgbj10LnN0YXRlLmNsYXNzTGlzdDtuLmRlbGV0ZShlKSx0LnNldFN0YXRlKHtjbGFzc0xpc3Q6bn0pfSxoYXNDbGFzczpmdW5jdGlvbihlKXtyZXR1cm4gdC5jbGFzc2VzLnNwbGl0KFwiIFwiKS5pbmNsdWRlcyhlKX0sYWRkQm9keUNsYXNzOmZ1bmN0aW9uKHQpe3JldHVybiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQodCl9LHJlbW92ZUJvZHlDbGFzczpmdW5jdGlvbih0KXtyZXR1cm4gZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKHQpfSxldmVudFRhcmdldE1hdGNoZXM6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbyh0LGUpfSx0cmFwRm9jdXM6ZnVuY3Rpb24oKXtyZXR1cm4gdC5mb2N1c1RyYXAmJnQuZm9jdXNUcmFwLmFjdGl2YXRlKCl9LHJlbGVhc2VGb2N1czpmdW5jdGlvbigpe3JldHVybiB0LmZvY3VzVHJhcCYmdC5mb2N1c1RyYXAuZGVhY3RpdmF0ZSgpfSxpc0NvbnRlbnRTY3JvbGxhYmxlOmZ1bmN0aW9uKCl7dmFyIGU9dC5jb250ZW50O3JldHVybiEhZSYmZi5pc1Njcm9sbGFibGUoZSl9LGFyZUJ1dHRvbnNTdGFja2VkOmZ1bmN0aW9uKCl7cmV0dXJuISF0LmJ1dHRvbnMmJmYuYXJlVG9wc01pc2FsaWduZWQodC5idXR0b25zKX0sZ2V0QWN0aW9uRnJvbUV2ZW50OmZ1bmN0aW9uKHQpe3ZhciBvPW4odC50YXJnZXQsXCJbXCIrZS5BQ1RJT05fQVRUUklCVVRFK1wiXVwiKTtyZXR1cm4gbyYmby5nZXRBdHRyaWJ1dGUoZS5BQ1RJT05fQVRUUklCVVRFKX0sY2xpY2tEZWZhdWx0QnV0dG9uOmZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0QnV0dG9uO2UmJmUuY2xpY2soKX0scmV2ZXJzZUJ1dHRvbnM6ZnVuY3Rpb24oKXt2YXIgZT10LmJ1dHRvbnM7cmV0dXJuIGUmJmUucmV2ZXJzZSgpLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHQucGFyZW50RWxlbWVudCYmdC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHQpfSl9LG5vdGlmeU9wZW5pbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdC5oYW5kbGVPcGVuaW5nKCl9LG5vdGlmeU9wZW5lZDpmdW5jdGlvbigpe3JldHVybiB0LnByb3BzLm9uT3BlbiYmdC5wcm9wcy5vbk9wZW4oKX0sbm90aWZ5Q2xvc2luZzpmdW5jdGlvbihlKXtyZXR1cm4gdC5oYW5kbGVDbG9zaW5nKGUpfSxub3RpZnlDbG9zZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHQucHJvcHMub25DbG9zZSYmdC5wcm9wcy5vbkNsb3NlKGUpfX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcyxlPSh0LmF1dG9TdGFja0J1dHRvbnMsdC5jbGFzc05hbWUsdC5jaGlsZHJlbiksbj0odC5lc2NhcGVLZXlBY3Rpb24sdC5pZCksbz0odC5vbk9wZW5pbmcsdC5vbk9wZW4sdC5vbkNsaWNrLHQub25DbG9zaW5nLHQub25DbG9zZSx0Lm9uS2V5RG93bix0Lm9wZW4sdC5zY3JpbUNsaWNrQWN0aW9uLHQudGFnKSxyPWEodCxbXCJhdXRvU3RhY2tCdXR0b25zXCIsXCJjbGFzc05hbWVcIixcImNoaWxkcmVuXCIsXCJlc2NhcGVLZXlBY3Rpb25cIixcImlkXCIsXCJvbk9wZW5pbmdcIixcIm9uT3BlblwiLFwib25DbGlja1wiLFwib25DbG9zaW5nXCIsXCJvbkNsb3NlXCIsXCJvbktleURvd25cIixcIm9wZW5cIixcInNjcmltQ2xpY2tBY3Rpb25cIixcInRhZ1wiXSkscz10aGlzLnJlbmRlckNvbnRhaW5lcihlKTtyZXR1cm4gYy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobyxpKHt9LHIse1wiYXJpYS1sYWJlbGxlZGJ5XCI6dGhpcy5sYWJlbGxlZEJ5LFwiYXJpYS1kZXNjcmliZWRieVwiOnRoaXMuZGVzY3JpYmVkQnksXCJhcmlhLW1vZGFsXCI6ITAsY2xhc3NOYW1lOnRoaXMuY2xhc3NlcyxpZDpuLG9uS2V5RG93bjp0aGlzLmhhbmRsZUludGVyYWN0aW9uLG9uQ2xpY2s6dGhpcy5oYW5kbGVJbnRlcmFjdGlvbixyZWY6dGhpcy5kaWFsb2dFbGVtZW50fSkscyxjLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6di5jc3NDbGFzc2VzLlNDUklNfSkpfSxlLmRlZmF1bHRQcm9wcz17YXV0b1N0YWNrQnV0dG9uczohMCxjbGFzc05hbWU6XCJcIixvbk9wZW5pbmc6ZnVuY3Rpb24oKXt9LG9uQ2xvc2luZzpmdW5jdGlvbigpe30sdGFnOlwiZGl2XCIsaWQ6XCJtZGMtZGlhbG9nXCIsb3BlbjohMSxyb2xlOlwiYWxlcnRkaWFsb2dcIixlc2NhcGVLZXlBY3Rpb246ZC5zdHJpbmdzLkNMT1NFX0FDVElPTixzY3JpbUNsaWNrQWN0aW9uOmQuc3RyaW5ncy5DTE9TRV9BQ1RJT059LGV9KGMuZGVmYXVsdC5Db21wb25lbnQpO2UuZGVmYXVsdD1ifSw2MTpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5yKGUpLG4uZChlLFwiY3JlYXRlRm9jdXNUcmFwSW5zdGFuY2VcIixmdW5jdGlvbigpe3JldHVybiBpfSksbi5kKGUsXCJpc1Njcm9sbGFibGVcIixmdW5jdGlvbigpe3JldHVybiBhfSksbi5kKGUsXCJhcmVUb3BzTWlzYWxpZ25lZFwiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KTt2YXIgbz1uKDQ0KSxyPW4ubihvKTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xuZnVuY3Rpb24gaSh0LGUsbil7cmV0dXJuIHZvaWQgMD09PWUmJihlPXIuYSksZSh0LHtjbGlja091dHNpZGVEZWFjdGl2YXRlczohMCxlc2NhcGVEZWFjdGl2YXRlczohMSxpbml0aWFsRm9jdXM6bn0pfWZ1bmN0aW9uIGEodCl7cmV0dXJuISF0JiZ0LnNjcm9sbEhlaWdodD50Lm9mZnNldEhlaWdodH1mdW5jdGlvbiBzKHQpe3ZhciBlPW5ldyBTZXQ7cmV0dXJuW10uZm9yRWFjaC5jYWxsKHQsZnVuY3Rpb24odCl7cmV0dXJuIGUuYWRkKHQub2Zmc2V0VG9wKX0pLGUuc2l6ZT4xfX0sNjI6ZnVuY3Rpb24odCxlKXt2YXIgbj1bXCJpbnB1dFwiLFwic2VsZWN0XCIsXCJ0ZXh0YXJlYVwiLFwiYVtocmVmXVwiLFwiYnV0dG9uXCIsXCJbdGFiaW5kZXhdXCIsXCJhdWRpb1tjb250cm9sc11cIixcInZpZGVvW2NvbnRyb2xzXVwiLCdbY29udGVudGVkaXRhYmxlXTpub3QoW2NvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCJdKSddLG89bi5qb2luKFwiLFwiKSxyPVwidW5kZWZpbmVkXCI9PXR5cGVvZiBFbGVtZW50P2Z1bmN0aW9uKCl7fTpFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzfHxFbGVtZW50LnByb3RvdHlwZS5tc01hdGNoZXNTZWxlY3Rvcnx8RWxlbWVudC5wcm90b3R5cGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yO2Z1bmN0aW9uIGkodCxlKXtlPWV8fHt9O3ZhciBuLGkscyxjPVtdLGY9W10sZD10LnF1ZXJ5U2VsZWN0b3JBbGwobyk7Zm9yKGUuaW5jbHVkZUNvbnRhaW5lciYmci5jYWxsKHQsbykmJihkPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShkKSkudW5zaGlmdCh0KSxuPTA7bjxkLmxlbmd0aDtuKyspYShpPWRbbl0pJiYoMD09PShzPXUoaSkpP2MucHVzaChpKTpmLnB1c2goe2RvY3VtZW50T3JkZXI6bix0YWJJbmRleDpzLG5vZGU6aX0pKTtyZXR1cm4gZi5zb3J0KGwpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5ub2RlfSkuY29uY2F0KGMpfWZ1bmN0aW9uIGEodCl7cmV0dXJuISghcyh0KXx8ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBmKHQpJiZcInJhZGlvXCI9PT10LnR5cGV9KHQpJiYhZnVuY3Rpb24odCl7aWYoIXQubmFtZSlyZXR1cm4hMDt2YXIgZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpZih0W2VdLmNoZWNrZWQpcmV0dXJuIHRbZV19KHQub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPVwicmFkaW9cIl1bbmFtZT1cIicrdC5uYW1lKydcIl0nKSk7cmV0dXJuIWV8fGU9PT10fSh0KX0odCl8fHUodCk8MCl9ZnVuY3Rpb24gcyh0KXtyZXR1cm4hKHQuZGlzYWJsZWR8fGZ1bmN0aW9uKHQpe3JldHVybiBmKHQpJiZcImhpZGRlblwiPT09dC50eXBlfSh0KXx8ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PT10Lm9mZnNldFBhcmVudHx8XCJoaWRkZW5cIj09PWdldENvbXB1dGVkU3R5bGUodCkudmlzaWJpbGl0eX0odCkpfWkuaXNUYWJiYWJsZT1mdW5jdGlvbih0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoXCJObyBub2RlIHByb3ZpZGVkXCIpO3JldHVybiExIT09ci5jYWxsKHQsbykmJmEodCl9LGkuaXNGb2N1c2FibGU9ZnVuY3Rpb24odCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKFwiTm8gbm9kZSBwcm92aWRlZFwiKTtyZXR1cm4hMSE9PXIuY2FsbCh0LGMpJiZzKHQpfTt2YXIgYz1uLmNvbmNhdChcImlmcmFtZVwiKS5qb2luKFwiLFwiKTtmdW5jdGlvbiB1KHQpe3ZhciBlPXBhcnNlSW50KHQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiksMTApO3JldHVybiBpc05hTihlKT9mdW5jdGlvbih0KXtyZXR1cm5cInRydWVcIj09PXQuY29udGVudEVkaXRhYmxlfSh0KT8wOnQudGFiSW5kZXg6ZX1mdW5jdGlvbiBsKHQsZSl7cmV0dXJuIHQudGFiSW5kZXg9PT1lLnRhYkluZGV4P3QuZG9jdW1lbnRPcmRlci1lLmRvY3VtZW50T3JkZXI6dC50YWJJbmRleC1lLnRhYkluZGV4fWZ1bmN0aW9uIGYodCl7cmV0dXJuXCJJTlBVVFwiPT09dC50YWdOYW1lfXQuZXhwb3J0cz1pfSw2MzpmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbigpe2Zvcih2YXIgdD17fSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG89YXJndW1lbnRzW2VdO2Zvcih2YXIgciBpbiBvKW4uY2FsbChvLHIpJiYodFtyXT1vW3JdKX1yZXR1cm4gdH07dmFyIG49T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eX0sNjQ6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciBvPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKG89T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxvPWFyZ3VtZW50cy5sZW5ndGg7bjxvO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxyPXRoaXMmJnRoaXMuX19yZXN0fHxmdW5jdGlvbih0LGUpe3ZhciBuPXt9O2Zvcih2YXIgbyBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG8pJiZlLmluZGV4T2Yobyk8MCYmKG5bb109dFtvXSk7aWYobnVsbCE9dCYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9MDtmb3Iobz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO3I8by5sZW5ndGg7cisrKWUuaW5kZXhPZihvW3JdKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodCxvW3JdKSYmKG5bb1tyXV09dFtvW3JdXSl9cmV0dXJuIG59LGk9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIGE9aShuKDApKSxzPWkobigxKSksYz1uKDIzKTtlLmRlZmF1bHQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5jbGFzc05hbWUsbj12b2lkIDA9PT1lP1wiXCI6ZSxpPXQuY2hpbGRyZW4sdT10LnRhZyxsPXZvaWQgMD09PXU/XCJkaXZcIjp1LGY9cih0LFtcImNsYXNzTmFtZVwiLFwiY2hpbGRyZW5cIixcInRhZ1wiXSk7cmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGwsbyh7Y2xhc3NOYW1lOnMuZGVmYXVsdChuLGMuY3NzQ2xhc3Nlcy5DT05URU5UKX0sZiksaSl9fSw2NTpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG89dGhpcyYmdGhpcy5fX2Fzc2lnbnx8ZnVuY3Rpb24oKXtyZXR1cm4obz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLG89YXJndW1lbnRzLmxlbmd0aDtuPG87bisrKWZvcih2YXIgciBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmKHRbcl09ZVtyXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHI9dGhpcyYmdGhpcy5fX3Jlc3R8fGZ1bmN0aW9uKHQsZSl7dmFyIG49e307Zm9yKHZhciBvIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbykmJmUuaW5kZXhPZihvKTwwJiYobltvXT10W29dKTtpZihudWxsIT10JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj0wO2ZvcihvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7cjxvLmxlbmd0aDtyKyspZS5pbmRleE9mKG9bcl0pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LG9bcl0pJiYobltvW3JdXT10W29bcl1dKX1yZXR1cm4gbn0saT10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgYT1pKG4oMCkpLHM9aShuKDEpKSxjPW4oMjMpO2UuZGVmYXVsdD1mdW5jdGlvbih0KXt2YXIgZT10LmNsYXNzTmFtZSxuPXZvaWQgMD09PWU/XCJcIjplLGk9dC5jaGlsZHJlbix1PXQudGFnLGw9dm9pZCAwPT09dT9cImZvb3RlclwiOnUsZj1yKHQsW1wiY2xhc3NOYW1lXCIsXCJjaGlsZHJlblwiLFwidGFnXCJdKTtyZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobCxvKHtjbGFzc05hbWU6cy5kZWZhdWx0KG4sYy5jc3NDbGFzc2VzLkFDVElPTlMpfSxmKSxpKX19LDY2OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgbz10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihvPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsbz1hcmd1bWVudHMubGVuZ3RoO248bztuKyspZm9yKHZhciByIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scj10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIG8gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxvKSYmZS5pbmRleE9mKG8pPDAmJihuW29dPXRbb10pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPTA7Zm9yKG89T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtyPG8ubGVuZ3RoO3IrKyllLmluZGV4T2Yob1tyXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsb1tyXSkmJihuW29bcl1dPXRbb1tyXV0pfXJldHVybiBufSxpPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBhPWkobigwKSkscz1pKG4oMSkpLGM9bigyMyk7ZS5kZWZhdWx0PWZ1bmN0aW9uKHQpe3ZhciBlPXQuY2xhc3NOYW1lLG49dm9pZCAwPT09ZT9cIlwiOmUsaT10LmNoaWxkcmVuLHU9dC50YWcsbD12b2lkIDA9PT11P1wiaDJcIjp1LGY9cih0LFtcImNsYXNzTmFtZVwiLFwiY2hpbGRyZW5cIixcInRhZ1wiXSk7cmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGwsbyh7Y2xhc3NOYW1lOnMuZGVmYXVsdChuLGMuY3NzQ2xhc3Nlcy5USVRMRSl9LGYpLGkpfX0sNjc6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciBvPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKG89T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxvPWFyZ3VtZW50cy5sZW5ndGg7bjxvO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxyPXRoaXMmJnRoaXMuX19yZXN0fHxmdW5jdGlvbih0LGUpe3ZhciBuPXt9O2Zvcih2YXIgbyBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG8pJiZlLmluZGV4T2Yobyk8MCYmKG5bb109dFtvXSk7aWYobnVsbCE9dCYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9MDtmb3Iobz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO3I8by5sZW5ndGg7cisrKWUuaW5kZXhPZihvW3JdKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodCxvW3JdKSYmKG5bb1tyXV09dFtvW3JdXSl9cmV0dXJuIG59LGk9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIGE9aShuKDApKSxzPWkobigxKSksYz1uKDIzKSx1PWkobig2OCkpO2UuZGVmYXVsdD1mdW5jdGlvbih0KXt2YXIgZSxuPXQuYWN0aW9uLGk9dC5jbGFzc05hbWUsbD12b2lkIDA9PT1pP1wiXCI6aSxmPXQuY2hpbGRyZW4sZD10LmlzRGVmYXVsdCxwPXZvaWQgMCE9PWQmJmQsbT1yKHQsW1wiYWN0aW9uXCIsXCJjbGFzc05hbWVcIixcImNoaWxkcmVuXCIsXCJpc0RlZmF1bHRcIl0pO3JldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh1LmRlZmF1bHQsbyh7Y2xhc3NOYW1lOnMuZGVmYXVsdChsLGMuY3NzQ2xhc3Nlcy5CVVRUT04sKGU9e30sZVtjLmNzc0NsYXNzZXMuREVGQVVMVF9CVVRUT05dPXAsZSkpLFwiZGF0YS1tZGMtZGlhbG9nLWFjdGlvblwiOm59LG0pLGYpfX0sNjg6ZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9bn19KX0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGlhbG9nLmpzLm1hcCIsIiFmdW5jdGlvbihlLHQpe2lmKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPXQocmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpLHJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtcmlwcGxlL2Rpc3QvaW5kZXguanNcIikpO2Vsc2UgaWYoXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXCJyZWFjdFwiLFwiY2xhc3NuYW1lc1wiLFwiQG1hdGVyaWFsL3JlYWN0LXJpcHBsZS9kaXN0L2luZGV4LmpzXCJdLHQpO2Vsc2V7dmFyIG49XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/dChyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcImNsYXNzbmFtZXNcIikscmVxdWlyZShcIkBtYXRlcmlhbC9yZWFjdC1yaXBwbGUvZGlzdC9pbmRleC5qc1wiKSk6dChlLnJlYWN0LGUuY2xhc3NuYW1lcyxlW1wiQG1hdGVyaWFsL3JlYWN0LXJpcHBsZS9kaXN0L2luZGV4LmpzXCJdKTtmb3IodmFyIHIgaW4gbikoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czplKVtyXT1uW3JdfX0oXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9e307ZnVuY3Rpb24gbihyKXtpZih0W3JdKXJldHVybiB0W3JdLmV4cG9ydHM7dmFyIG89dFtyXT17aTpyLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIGVbcl0uY2FsbChvLmV4cG9ydHMsbyxvLmV4cG9ydHMsbiksby5sPSEwLG8uZXhwb3J0c31yZXR1cm4gbi5tPWUsbi5jPXQsbi5kPWZ1bmN0aW9uKGUsdCxyKXtuLm8oZSx0KXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxuLnI9ZnVuY3Rpb24oZSl7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOlwiTW9kdWxlXCJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKGUsdCl7aWYoMSZ0JiYoZT1uKGUpKSw4JnQpcmV0dXJuIGU7aWYoNCZ0JiZcIm9iamVjdFwiPT10eXBlb2YgZSYmZSYmZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciByPU9iamVjdC5jcmVhdGUobnVsbCk7aWYobi5yKHIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLFwiZGVmYXVsdFwiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOmV9KSwyJnQmJlwic3RyaW5nXCIhPXR5cGVvZiBlKWZvcih2YXIgbyBpbiBlKW4uZChyLG8sZnVuY3Rpb24odCl7cmV0dXJuIGVbdF19LmJpbmQobnVsbCxvKSk7cmV0dXJuIHJ9LG4ubj1mdW5jdGlvbihlKXt2YXIgdD1lJiZlLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gZS5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiBlfTtyZXR1cm4gbi5kKHQsXCJhXCIsdCksdH0sbi5vPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfSxuLnA9XCJcIixuKG4ucz00NSl9KHswOmZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWV9LDE6ZnVuY3Rpb24oZSxuKXtlLmV4cG9ydHM9dH0sNDU6ZnVuY3Rpb24oZSx0LG4pe1widXNlIHN0cmljdFwiO3ZhciByPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKHI9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rKylmb3IodmFyIG8gaW4gdD1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbykmJihlW29dPXRbb10pO3JldHVybiBlfSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxvPXRoaXMmJnRoaXMuX19yZXN0fHxmdW5jdGlvbihlLHQpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiZ0LmluZGV4T2Yocik8MCYmKG5bcl09ZVtyXSk7aWYobnVsbCE9ZSYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG89MDtmb3Iocj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO288ci5sZW5ndGg7bysrKXQuaW5kZXhPZihyW29dKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyW29dKSYmKG5bcltvXV09ZVtyW29dXSl9cmV0dXJuIG59LGk9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIGw9aShuKDApKSx1PWkobigxKSksYT1uKDUpLHM9big0Nik7dC5CdXR0b249ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLmNsYXNzTmFtZSxpPXZvaWQgMD09PW4/XCJcIjpuLGE9ZS5yYWlzZWQsZD12b2lkIDAhPT1hJiZhLGY9ZS51bmVsZXZhdGVkLHA9dm9pZCAwIT09ZiYmZixTPWUub3V0bGluZWQsYj12b2lkIDAhPT1TJiZTLG09ZS5kZW5zZSx5PXZvaWQgMCE9PW0mJm0sRT1lLmRpc2FibGVkLF89dm9pZCAwIT09RSYmRSx2PWUuaWNvbixPPWUuaHJlZixqPWUuY2hpbGRyZW4sQz1lLmluaXRSaXBwbGUsaD1lLnRyYWlsaW5nSWNvbix4PShlLnVuYm91bmRlZCxvKGUsW1wiY2xhc3NOYW1lXCIsXCJyYWlzZWRcIixcInVuZWxldmF0ZWRcIixcIm91dGxpbmVkXCIsXCJkZW5zZVwiLFwiZGlzYWJsZWRcIixcImljb25cIixcImhyZWZcIixcImNoaWxkcmVuXCIsXCJpbml0UmlwcGxlXCIsXCJ0cmFpbGluZ0ljb25cIixcInVuYm91bmRlZFwiXSkpLEw9cih7Y2xhc3NOYW1lOnUuZGVmYXVsdChzLkNTU19DTEFTU0VTLlJPT1QsaSwodD17fSx0W3MuQ1NTX0NMQVNTRVMuUkFJU0VEXT1kLHRbcy5DU1NfQ0xBU1NFUy5VTkVMRVZBVEVEXT1wLHRbcy5DU1NfQ0xBU1NFUy5PVVRMSU5FRF09Yix0W3MuQ1NTX0NMQVNTRVMuREVOU0VdPXksdCkpLHJlZjpDLGRpc2FibGVkOl99LHgpO3JldHVybiBPP2wuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYVwiLHIoe30sTCx7aHJlZjpPfSksaD9udWxsOmModiksbC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse2NsYXNzTmFtZTpzLkNTU19DTEFTU0VTLkxBQkVMfSxqKSxoP2MoaCk6bnVsbCk6bC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIixyKHt9LEwpLGg/bnVsbDpjKHYpLGwuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6cy5DU1NfQ0xBU1NFUy5MQUJFTH0saiksaD9jKGgpOm51bGwpfTt2YXIgYz1mdW5jdGlvbihlKXtyZXR1cm4gZT9sLmRlZmF1bHQuY2xvbmVFbGVtZW50KGUse2NsYXNzTmFtZTp1LmRlZmF1bHQocy5DU1NfQ0xBU1NFUy5JQ09OLGUucHJvcHMuY2xhc3NOYW1lKX0pOm51bGx9O3QuQnV0dG9uLmRlZmF1bHRQcm9wcz17aW5pdFJpcHBsZTpmdW5jdGlvbigpe319LHQuZGVmYXVsdD1hLndpdGhSaXBwbGUodC5CdXR0b24pfSw0NjpmdW5jdGlvbihlLHQsbil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dC5DU1NfQ0xBU1NFUz17Uk9PVDpcIm1kYy1idXR0b25cIixJQ09OOlwibWRjLWJ1dHRvbl9faWNvblwiLExBQkVMOlwibWRjLWJ1dHRvbl9fbGFiZWxcIixERU5TRTpcIm1kYy1idXR0b24tLWRlbnNlXCIsUkFJU0VEOlwibWRjLWJ1dHRvbi0tcmFpc2VkXCIsT1VUTElORUQ6XCJtZGMtYnV0dG9uLS1vdXRsaW5lZFwiLFVORUxFVkFURUQ6XCJtZGMtYnV0dG9uLS11bmVsZXZhdGVkXCJ9fSw1OmZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPW59fSl9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJ1dHRvbi5qcy5tYXAiLCIhZnVuY3Rpb24odCxlKXtpZihcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZSltb2R1bGUuZXhwb3J0cz1lKHJlcXVpcmUoXCJyZWFjdFwiKSxyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7ZWxzZSBpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQpZGVmaW5lKFtcInJlYWN0XCIsXCJjbGFzc25hbWVzXCJdLGUpO2Vsc2V7dmFyIG49XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZShyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcImNsYXNzbmFtZXNcIikpOmUodC5yZWFjdCx0LmNsYXNzbmFtZXMpO2Zvcih2YXIgaSBpbiBuKShcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnQpW2ldPW5baV19fShcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZj9zZWxmOnRoaXMsZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9e307ZnVuY3Rpb24gbihpKXtpZihlW2ldKXJldHVybiBlW2ldLmV4cG9ydHM7dmFyIGE9ZVtpXT17aTppLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIHRbaV0uY2FsbChhLmV4cG9ydHMsYSxhLmV4cG9ydHMsbiksYS5sPSEwLGEuZXhwb3J0c31yZXR1cm4gbi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxpKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6aX0pfSxuLnI9ZnVuY3Rpb24odCl7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOlwiTW9kdWxlXCJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiZcIm9iamVjdFwiPT10eXBlb2YgdCYmdCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCk7aWYobi5yKGkpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLFwiZGVmYXVsdFwiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KSwyJmUmJlwic3RyaW5nXCIhPXR5cGVvZiB0KWZvcih2YXIgYSBpbiB0KW4uZChpLGEsZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxhKSk7cmV0dXJuIGl9LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsXCJhXCIsZSksZX0sbi5vPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfSxuLnA9XCJcIixuKG4ucz0xMDcpfSh7MDpmdW5jdGlvbihlLG4pe2UuZXhwb3J0cz10fSwxOmZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWV9LDEwNzpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGksYT10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4oaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSkscj10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciBhIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLGEpJiYodFthXT1lW2FdKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sbz10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIGkgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKSYmZS5pbmRleE9mKGkpPDAmJihuW2ldPXRbaV0pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBhPTA7Zm9yKGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTthPGkubGVuZ3RoO2ErKyllLmluZGV4T2YoaVthXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsaVthXSkmJihuW2lbYV1dPXRbaVthXV0pfXJldHVybiBufSxzPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciB1PXMobigwKSksYz1zKG4oMSkpLGQ9bigxNTUpLHA9bigzOCksbD1uKDEwOCk7ZS53aXRoUmlwcGxlPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybihlPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oKXt2YXIgbj1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4uaXNDb21wb25lbnRNb3VudGVkPSEwLG4uaXNUb3VjaGVkPSExLG4uZGlzcGxheU5hbWU9XCJXaXRoUmlwcGxlKFwiK2Z1bmN0aW9uKHQpe3JldHVybiB0LmRpc3BsYXlOYW1lfHx0Lm5hbWV8fFwiQ29tcG9uZW50XCJ9KHQpK1wiKVwiLG4uc3RhdGU9e2NsYXNzTGlzdDpuZXcgU2V0LHN0eWxlOnt9fSxuLmluaXRpYWxpemVGb3VuZGF0aW9uPWZ1bmN0aW9uKHQsZSl7dmFyIGk9bi5jcmVhdGVBZGFwdGVyKHQsZSk7bi5mb3VuZGF0aW9uPW5ldyBkLk1EQ1JpcHBsZUZvdW5kYXRpb24oaSksbi5mb3VuZGF0aW9uLmluaXQoKX0sbi5jcmVhdGVBZGFwdGVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJue2Jyb3dzZXJTdXBwb3J0c0Nzc1ZhcnM6ZnVuY3Rpb24oKXtyZXR1cm4gcC5zdXBwb3J0c0Nzc1ZhcmlhYmxlcyh3aW5kb3cpfSxpc1VuYm91bmRlZDpmdW5jdGlvbigpe3JldHVybiBuLnByb3BzLnVuYm91bmRlZH0saXNTdXJmYWNlQWN0aXZlOmZ1bmN0aW9uKCl7cmV0dXJuIGU/bC5tYXRjaGVzKGUsXCI6YWN0aXZlXCIpOmwubWF0Y2hlcyh0LFwiOmFjdGl2ZVwiKX0saXNTdXJmYWNlRGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5wcm9wcy5kaXNhYmxlZH0sYWRkQ2xhc3M6ZnVuY3Rpb24odCl7bi5pc0NvbXBvbmVudE1vdW50ZWQmJm4uc2V0U3RhdGUoe2NsYXNzTGlzdDpuLnN0YXRlLmNsYXNzTGlzdC5hZGQodCl9KX0scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24odCl7aWYobi5pc0NvbXBvbmVudE1vdW50ZWQpe3ZhciBlPW4uc3RhdGUuY2xhc3NMaXN0O2UuZGVsZXRlKHQpLG4uc2V0U3RhdGUoe2NsYXNzTGlzdDplfSl9fSxyZWdpc3RlckRvY3VtZW50SW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHQsZSxwLmFwcGx5UGFzc2l2ZSgpKX0sZGVyZWdpc3RlckRvY3VtZW50SW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHQsZSxwLmFwcGx5UGFzc2l2ZSgpKX0scmVnaXN0ZXJSZXNpemVIYW5kbGVyOmZ1bmN0aW9uKHQpe3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLHQpfSxkZXJlZ2lzdGVyUmVzaXplSGFuZGxlcjpmdW5jdGlvbih0KXtyZXR1cm4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIix0KX0sdXBkYXRlQ3NzVmFyaWFibGU6bi51cGRhdGVDc3NWYXJpYWJsZSxjb21wdXRlQm91bmRpbmdSZWN0OmZ1bmN0aW9uKCl7cmV0dXJuIG4uaXNDb21wb25lbnRNb3VudGVkP24ucHJvcHMuY29tcHV0ZUJvdW5kaW5nUmVjdD9uLnByb3BzLmNvbXB1dGVCb3VuZGluZ1JlY3QodCk6dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTp7Ym90dG9tOjAsaGVpZ2h0OjAsbGVmdDowLHJpZ2h0OjAsdG9wOjAsd2lkdGg6MCx4OjAseTowfX0sY29udGFpbnNFdmVudFRhcmdldDpmdW5jdGlvbih0KXtyZXR1cm4hKCFlfHxudWxsPT09dCkmJmUuY29udGFpbnModCl9LHJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGRlcmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sZ2V0V2luZG93UGFnZU9mZnNldDpmdW5jdGlvbigpe3JldHVybnt4OndpbmRvdy5wYWdlWE9mZnNldCx5OndpbmRvdy5wYWdlWU9mZnNldH19fX0sbi5oYW5kbGVGb2N1cz1mdW5jdGlvbih0KXtuLnByb3BzLm9uRm9jdXMmJm4ucHJvcHMub25Gb2N1cyh0KSxuLmZvdW5kYXRpb24uaGFuZGxlRm9jdXMoKX0sbi5oYW5kbGVCbHVyPWZ1bmN0aW9uKHQpe24ucHJvcHMub25CbHVyJiZuLnByb3BzLm9uQmx1cih0KSxuLmZvdW5kYXRpb24uaGFuZGxlQmx1cigpfSxuLmhhbmRsZU1vdXNlRG93bj1mdW5jdGlvbih0KXtuLnByb3BzLm9uTW91c2VEb3duJiZuLnByb3BzLm9uTW91c2VEb3duKHQpLG4uaXNUb3VjaGVkP24uaXNUb3VjaGVkPSExOm4uYWN0aXZhdGVSaXBwbGUodCl9LG4uaGFuZGxlTW91c2VVcD1mdW5jdGlvbih0KXtuLnByb3BzLm9uTW91c2VVcCYmbi5wcm9wcy5vbk1vdXNlVXAodCksbi5kZWFjdGl2YXRlUmlwcGxlKCl9LG4uaGFuZGxlVG91Y2hTdGFydD1mdW5jdGlvbih0KXtuLmlzVG91Y2hlZD0hMCxuLnByb3BzLm9uVG91Y2hTdGFydCYmbi5wcm9wcy5vblRvdWNoU3RhcnQodCksbi5hY3RpdmF0ZVJpcHBsZSh0KX0sbi5oYW5kbGVUb3VjaEVuZD1mdW5jdGlvbih0KXtuLnByb3BzLm9uVG91Y2hFbmQmJm4ucHJvcHMub25Ub3VjaEVuZCh0KSxuLmRlYWN0aXZhdGVSaXBwbGUoKX0sbi5oYW5kbGVLZXlEb3duPWZ1bmN0aW9uKHQpe24ucHJvcHMub25LZXlEb3duJiZuLnByb3BzLm9uS2V5RG93bih0KSxuLmFjdGl2YXRlUmlwcGxlKHQpfSxuLmhhbmRsZUtleVVwPWZ1bmN0aW9uKHQpe24ucHJvcHMub25LZXlVcCYmbi5wcm9wcy5vbktleVVwKHQpLG4uZGVhY3RpdmF0ZVJpcHBsZSgpfSxuLmFjdGl2YXRlUmlwcGxlPWZ1bmN0aW9uKHQpe3QucGVyc2lzdCgpLG4uZm91bmRhdGlvbi5hY3RpdmF0ZSh0Lm5hdGl2ZUV2ZW50KX0sbi5kZWFjdGl2YXRlUmlwcGxlPWZ1bmN0aW9uKCl7bi5mb3VuZGF0aW9uLmRlYWN0aXZhdGUoKX0sbi51cGRhdGVDc3NWYXJpYWJsZT1mdW5jdGlvbih0LGUpe24uaXNDb21wb25lbnRNb3VudGVkJiZuLnNldFN0YXRlKGZ1bmN0aW9uKGkpe3ZhciBhPU9iamVjdC5hc3NpZ24oe30sbi5zdGF0ZS5zdHlsZSxpLnN0eWxlKTtyZXR1cm4gbnVsbD09PWU/ZGVsZXRlIGFbdF06YVt0XT1lLE9iamVjdC5hc3NpZ24oaSx7c3R5bGU6YX0pfSl9LG59cmV0dXJuIGEobixlKSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe2lmKCF0aGlzLmZvdW5kYXRpb24pdGhyb3cgbmV3IEVycm9yKFwiWW91IG11c3QgY2FsbCBpbml0UmlwcGxlIGZyb20gdGhlIGVsZW1lbnQncyByZWYgcHJvcCB0byBpbml0aWFsaXplIHRoZSBhZGFwdGVyIGZvciB3aXRoUmlwcGxlXCIpfSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9ZnVuY3Rpb24odCl7dGhpcy5wcm9wcy5kaXNhYmxlZCE9PXQuZGlzYWJsZWQmJnRoaXMucHJvcHMuZGlzYWJsZWQmJnRoaXMuZm91bmRhdGlvbi5oYW5kbGVCbHVyKCl9LG4ucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7dGhpcy5mb3VuZGF0aW9uJiYodGhpcy5pc0NvbXBvbmVudE1vdW50ZWQ9ITEsdGhpcy5mb3VuZGF0aW9uLmRlc3Ryb3koKSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSxcImNsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcy5jbGFzc05hbWUsZT10aGlzLnN0YXRlLmNsYXNzTGlzdDtyZXR1cm4gYy5kZWZhdWx0KEFycmF5LmZyb20oZSksdCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLFwic3R5bGVcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcy5zdHlsZSxlPXRoaXMuc3RhdGUuc3R5bGU7cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sZSx0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxuLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLG49KGUudW5ib3VuZGVkLGUuc3R5bGUsZS5jbGFzc05hbWUsZS5vbk1vdXNlRG93bixlLm9uTW91c2VVcCxlLm9uVG91Y2hTdGFydCxlLm9uVG91Y2hFbmQsZS5vbktleURvd24sZS5vbktleVVwLGUub25Gb2N1cyxlLm9uQmx1cixvKGUsW1widW5ib3VuZGVkXCIsXCJzdHlsZVwiLFwiY2xhc3NOYW1lXCIsXCJvbk1vdXNlRG93blwiLFwib25Nb3VzZVVwXCIsXCJvblRvdWNoU3RhcnRcIixcIm9uVG91Y2hFbmRcIixcIm9uS2V5RG93blwiLFwib25LZXlVcFwiLFwib25Gb2N1c1wiLFwib25CbHVyXCJdKSksaT1yKHt9LG4se29uTW91c2VEb3duOnRoaXMuaGFuZGxlTW91c2VEb3duLG9uTW91c2VVcDp0aGlzLmhhbmRsZU1vdXNlVXAsb25Ub3VjaFN0YXJ0OnRoaXMuaGFuZGxlVG91Y2hTdGFydCxvblRvdWNoRW5kOnRoaXMuaGFuZGxlVG91Y2hFbmQsb25LZXlEb3duOnRoaXMuaGFuZGxlS2V5RG93bixvbktleVVwOnRoaXMuaGFuZGxlS2V5VXAsb25Gb2N1czp0aGlzLmhhbmRsZUZvY3VzLG9uQmx1cjp0aGlzLmhhbmRsZUJsdXIsaW5pdFJpcHBsZTp0aGlzLmluaXRpYWxpemVGb3VuZGF0aW9uLGNsYXNzTmFtZTp0aGlzLmNsYXNzZXMsc3R5bGU6dGhpcy5zdHlsZX0pO3JldHVybiB1LmRlZmF1bHQuY3JlYXRlRWxlbWVudCh0LHIoe30saSkpfSxufSh1LmRlZmF1bHQuQ29tcG9uZW50KSkuZGVmYXVsdFByb3BzPXIoe3VuYm91bmRlZDohMSxkaXNhYmxlZDohMSxzdHlsZTp7fSxjbGFzc05hbWU6XCJcIixvbk1vdXNlRG93bjpmdW5jdGlvbigpe30sb25Nb3VzZVVwOmZ1bmN0aW9uKCl7fSxvblRvdWNoU3RhcnQ6ZnVuY3Rpb24oKXt9LG9uVG91Y2hFbmQ6ZnVuY3Rpb24oKXt9LG9uS2V5RG93bjpmdW5jdGlvbigpe30sb25LZXlVcDpmdW5jdGlvbigpe30sb25Gb2N1czpmdW5jdGlvbigpe30sb25CbHVyOmZ1bmN0aW9uKCl7fX0sdC5kZWZhdWx0UHJvcHMpLGV9fSwxMDg6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG5mdW5jdGlvbiBpKHQsZSl7aWYodC5jbG9zZXN0KXJldHVybiB0LmNsb3Nlc3QoZSk7Zm9yKHZhciBuPXQ7bjspe2lmKGEobixlKSlyZXR1cm4gbjtuPW4ucGFyZW50RWxlbWVudH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBhKHQsZSl7cmV0dXJuKHQubWF0Y2hlc3x8dC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fHQubXNNYXRjaGVzU2VsZWN0b3IpLmNhbGwodCxlKX1uLnIoZSksbi5kKGUsXCJjbG9zZXN0XCIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLG4uZChlLFwibWF0Y2hlc1wiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KX0sMTU1OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSk7XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3I7XG4vKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXG50aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZVxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcbk1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuXG5cblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xuYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi92YXIgaT1mdW5jdGlvbih0LGUpe3JldHVybihpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSkodCxlKX07dmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4oYT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgYSBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxhKSYmKHRbYV09ZVthXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG52YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dm9pZCAwPT09dCYmKHQ9e30pLHRoaXMuYWRhcHRlcl89dH1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJjc3NDbGFzc2VzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwic3RyaW5nc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIm51bWJlcnNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJkZWZhdWx0QWRhcHRlclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7fSx0fSgpLG89e0JHX0ZPQ1VTRUQ6XCJtZGMtcmlwcGxlLXVwZ3JhZGVkLS1iYWNrZ3JvdW5kLWZvY3VzZWRcIixGR19BQ1RJVkFUSU9OOlwibWRjLXJpcHBsZS11cGdyYWRlZC0tZm9yZWdyb3VuZC1hY3RpdmF0aW9uXCIsRkdfREVBQ1RJVkFUSU9OOlwibWRjLXJpcHBsZS11cGdyYWRlZC0tZm9yZWdyb3VuZC1kZWFjdGl2YXRpb25cIixST09UOlwibWRjLXJpcHBsZS11cGdyYWRlZFwiLFVOQk9VTkRFRDpcIm1kYy1yaXBwbGUtdXBncmFkZWQtLXVuYm91bmRlZFwifSxzPXtWQVJfRkdfU0NBTEU6XCItLW1kYy1yaXBwbGUtZmctc2NhbGVcIixWQVJfRkdfU0laRTpcIi0tbWRjLXJpcHBsZS1mZy1zaXplXCIsVkFSX0ZHX1RSQU5TTEFURV9FTkQ6XCItLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLWVuZFwiLFZBUl9GR19UUkFOU0xBVEVfU1RBUlQ6XCItLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLXN0YXJ0XCIsVkFSX0xFRlQ6XCItLW1kYy1yaXBwbGUtbGVmdFwiLFZBUl9UT1A6XCItLW1kYy1yaXBwbGUtdG9wXCJ9LHU9e0RFQUNUSVZBVElPTl9USU1FT1VUX01TOjIyNSxGR19ERUFDVElWQVRJT05fTVM6MTUwLElOSVRJQUxfT1JJR0lOX1NDQUxFOi42LFBBRERJTkc6MTAsVEFQX0RFTEFZX01TOjMwMH0sYz1uKDM4KTtuLmQoZSxcIk1EQ1JpcHBsZUZvdW5kYXRpb25cIixmdW5jdGlvbigpe3JldHVybiBmfSk7XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cbnZhciBkPVtcInRvdWNoc3RhcnRcIixcInBvaW50ZXJkb3duXCIsXCJtb3VzZWRvd25cIixcImtleWRvd25cIl0scD1bXCJ0b3VjaGVuZFwiLFwicG9pbnRlcnVwXCIsXCJtb3VzZXVwXCIsXCJjb250ZXh0bWVudVwiXSxsPVtdLGY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXt2YXIgaT10LmNhbGwodGhpcyxhKHt9LGUuZGVmYXVsdEFkYXB0ZXIsbikpfHx0aGlzO3JldHVybiBpLmFjdGl2YXRpb25BbmltYXRpb25IYXNFbmRlZF89ITEsaS5hY3RpdmF0aW9uVGltZXJfPTAsaS5mZ0RlYWN0aXZhdGlvblJlbW92YWxUaW1lcl89MCxpLmZnU2NhbGVfPVwiMFwiLGkuZnJhbWVfPXt3aWR0aDowLGhlaWdodDowfSxpLmluaXRpYWxTaXplXz0wLGkubGF5b3V0RnJhbWVfPTAsaS5tYXhSYWRpdXNfPTAsaS51bmJvdW5kZWRDb29yZHNfPXtsZWZ0OjAsdG9wOjB9LGkuYWN0aXZhdGlvblN0YXRlXz1pLmRlZmF1bHRBY3RpdmF0aW9uU3RhdGVfKCksaS5hY3RpdmF0aW9uVGltZXJDYWxsYmFja189ZnVuY3Rpb24oKXtpLmFjdGl2YXRpb25BbmltYXRpb25IYXNFbmRlZF89ITAsaS5ydW5EZWFjdGl2YXRpb25VWExvZ2ljSWZSZWFkeV8oKX0saS5hY3RpdmF0ZUhhbmRsZXJfPWZ1bmN0aW9uKHQpe3JldHVybiBpLmFjdGl2YXRlXyh0KX0saS5kZWFjdGl2YXRlSGFuZGxlcl89ZnVuY3Rpb24oKXtyZXR1cm4gaS5kZWFjdGl2YXRlXygpfSxpLmZvY3VzSGFuZGxlcl89ZnVuY3Rpb24oKXtyZXR1cm4gaS5oYW5kbGVGb2N1cygpfSxpLmJsdXJIYW5kbGVyXz1mdW5jdGlvbigpe3JldHVybiBpLmhhbmRsZUJsdXIoKX0saS5yZXNpemVIYW5kbGVyXz1mdW5jdGlvbigpe3JldHVybiBpLmxheW91dCgpfSxpfXJldHVybiBmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0oZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzdHJpbmdzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwibnVtYmVyc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybnthZGRDbGFzczpmdW5jdGlvbigpe30sYnJvd3NlclN1cHBvcnRzQ3NzVmFyczpmdW5jdGlvbigpe3JldHVybiEwfSxjb21wdXRlQm91bmRpbmdSZWN0OmZ1bmN0aW9uKCl7cmV0dXJue3RvcDowLHJpZ2h0OjAsYm90dG9tOjAsbGVmdDowLHdpZHRoOjAsaGVpZ2h0OjB9fSxjb250YWluc0V2ZW50VGFyZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuITB9LGRlcmVnaXN0ZXJEb2N1bWVudEludGVyYWN0aW9uSGFuZGxlcjpmdW5jdGlvbigpe30sZGVyZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcjpmdW5jdGlvbigpe30sZGVyZWdpc3RlclJlc2l6ZUhhbmRsZXI6ZnVuY3Rpb24oKXt9LGdldFdpbmRvd1BhZ2VPZmZzZXQ6ZnVuY3Rpb24oKXtyZXR1cm57eDowLHk6MH19LGlzU3VyZmFjZUFjdGl2ZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1N1cmZhY2VEaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiEwfSxpc1VuYm91bmRlZDpmdW5jdGlvbigpe3JldHVybiEwfSxyZWdpc3RlckRvY3VtZW50SW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxyZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcjpmdW5jdGlvbigpe30scmVnaXN0ZXJSZXNpemVIYW5kbGVyOmZ1bmN0aW9uKCl7fSxyZW1vdmVDbGFzczpmdW5jdGlvbigpe30sdXBkYXRlQ3NzVmFyaWFibGU6ZnVuY3Rpb24oKXt9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPXRoaXMuc3VwcG9ydHNQcmVzc1JpcHBsZV8oKTtpZih0aGlzLnJlZ2lzdGVyUm9vdEhhbmRsZXJzXyhuKSxuKXt2YXIgaT1lLmNzc0NsYXNzZXMsYT1pLlJPT1Qscj1pLlVOQk9VTkRFRDtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt0LmFkYXB0ZXJfLmFkZENsYXNzKGEpLHQuYWRhcHRlcl8uaXNVbmJvdW5kZWQoKSYmKHQuYWRhcHRlcl8uYWRkQ2xhc3MociksdC5sYXlvdXRJbnRlcm5hbF8oKSl9KX19LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKHRoaXMuc3VwcG9ydHNQcmVzc1JpcHBsZV8oKSl7dGhpcy5hY3RpdmF0aW9uVGltZXJfJiYoY2xlYXJUaW1lb3V0KHRoaXMuYWN0aXZhdGlvblRpbWVyXyksdGhpcy5hY3RpdmF0aW9uVGltZXJfPTAsdGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyhlLmNzc0NsYXNzZXMuRkdfQUNUSVZBVElPTikpLHRoaXMuZmdEZWFjdGl2YXRpb25SZW1vdmFsVGltZXJfJiYoY2xlYXJUaW1lb3V0KHRoaXMuZmdEZWFjdGl2YXRpb25SZW1vdmFsVGltZXJfKSx0aGlzLmZnRGVhY3RpdmF0aW9uUmVtb3ZhbFRpbWVyXz0wLHRoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoZS5jc3NDbGFzc2VzLkZHX0RFQUNUSVZBVElPTikpO3ZhciBuPWUuY3NzQ2xhc3NlcyxpPW4uUk9PVCxhPW4uVU5CT1VOREVEO3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3QuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoaSksdC5hZGFwdGVyXy5yZW1vdmVDbGFzcyhhKSx0LnJlbW92ZUNzc1ZhcnNfKCl9KX10aGlzLmRlcmVnaXN0ZXJSb290SGFuZGxlcnNfKCksdGhpcy5kZXJlZ2lzdGVyRGVhY3RpdmF0aW9uSGFuZGxlcnNfKCl9LGUucHJvdG90eXBlLmFjdGl2YXRlPWZ1bmN0aW9uKHQpe3RoaXMuYWN0aXZhdGVfKHQpfSxlLnByb3RvdHlwZS5kZWFjdGl2YXRlPWZ1bmN0aW9uKCl7dGhpcy5kZWFjdGl2YXRlXygpfSxlLnByb3RvdHlwZS5sYXlvdXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMubGF5b3V0RnJhbWVfJiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmxheW91dEZyYW1lXyksdGhpcy5sYXlvdXRGcmFtZV89cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7dC5sYXlvdXRJbnRlcm5hbF8oKSx0LmxheW91dEZyYW1lXz0wfSl9LGUucHJvdG90eXBlLnNldFVuYm91bmRlZD1mdW5jdGlvbih0KXt2YXIgbj1lLmNzc0NsYXNzZXMuVU5CT1VOREVEO3Q/dGhpcy5hZGFwdGVyXy5hZGRDbGFzcyhuKTp0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKG4pfSxlLnByb3RvdHlwZS5oYW5kbGVGb2N1cz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7cmV0dXJuIHQuYWRhcHRlcl8uYWRkQ2xhc3MoZS5jc3NDbGFzc2VzLkJHX0ZPQ1VTRUQpfSl9LGUucHJvdG90eXBlLmhhbmRsZUJsdXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3JldHVybiB0LmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGUuY3NzQ2xhc3Nlcy5CR19GT0NVU0VEKX0pfSxlLnByb3RvdHlwZS5zdXBwb3J0c1ByZXNzUmlwcGxlXz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFkYXB0ZXJfLmJyb3dzZXJTdXBwb3J0c0Nzc1ZhcnMoKX0sZS5wcm90b3R5cGUuZGVmYXVsdEFjdGl2YXRpb25TdGF0ZV89ZnVuY3Rpb24oKXtyZXR1cm57YWN0aXZhdGlvbkV2ZW50OnZvaWQgMCxoYXNEZWFjdGl2YXRpb25VWFJ1bjohMSxpc0FjdGl2YXRlZDohMSxpc1Byb2dyYW1tYXRpYzohMSx3YXNBY3RpdmF0ZWRCeVBvaW50ZXI6ITEsd2FzRWxlbWVudE1hZGVBY3RpdmU6ITF9fSxlLnByb3RvdHlwZS5yZWdpc3RlclJvb3RIYW5kbGVyc189ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0JiYoZC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UuYWRhcHRlcl8ucmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXIodCxlLmFjdGl2YXRlSGFuZGxlcl8pfSksdGhpcy5hZGFwdGVyXy5pc1VuYm91bmRlZCgpJiZ0aGlzLmFkYXB0ZXJfLnJlZ2lzdGVyUmVzaXplSGFuZGxlcih0aGlzLnJlc2l6ZUhhbmRsZXJfKSksdGhpcy5hZGFwdGVyXy5yZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcihcImZvY3VzXCIsdGhpcy5mb2N1c0hhbmRsZXJfKSx0aGlzLmFkYXB0ZXJfLnJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyKFwiYmx1clwiLHRoaXMuYmx1ckhhbmRsZXJfKX0sZS5wcm90b3R5cGUucmVnaXN0ZXJEZWFjdGl2YXRpb25IYW5kbGVyc189ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztcImtleWRvd25cIj09PXQudHlwZT90aGlzLmFkYXB0ZXJfLnJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyKFwia2V5dXBcIix0aGlzLmRlYWN0aXZhdGVIYW5kbGVyXyk6cC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UuYWRhcHRlcl8ucmVnaXN0ZXJEb2N1bWVudEludGVyYWN0aW9uSGFuZGxlcih0LGUuZGVhY3RpdmF0ZUhhbmRsZXJfKX0pfSxlLnByb3RvdHlwZS5kZXJlZ2lzdGVyUm9vdEhhbmRsZXJzXz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7ZC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuYWRhcHRlcl8uZGVyZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcihlLHQuYWN0aXZhdGVIYW5kbGVyXyl9KSx0aGlzLmFkYXB0ZXJfLmRlcmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXIoXCJmb2N1c1wiLHRoaXMuZm9jdXNIYW5kbGVyXyksdGhpcy5hZGFwdGVyXy5kZXJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyKFwiYmx1clwiLHRoaXMuYmx1ckhhbmRsZXJfKSx0aGlzLmFkYXB0ZXJfLmlzVW5ib3VuZGVkKCkmJnRoaXMuYWRhcHRlcl8uZGVyZWdpc3RlclJlc2l6ZUhhbmRsZXIodGhpcy5yZXNpemVIYW5kbGVyXyl9LGUucHJvdG90eXBlLmRlcmVnaXN0ZXJEZWFjdGl2YXRpb25IYW5kbGVyc189ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuYWRhcHRlcl8uZGVyZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcihcImtleXVwXCIsdGhpcy5kZWFjdGl2YXRlSGFuZGxlcl8pLHAuZm9yRWFjaChmdW5jdGlvbihlKXt0LmFkYXB0ZXJfLmRlcmVnaXN0ZXJEb2N1bWVudEludGVyYWN0aW9uSGFuZGxlcihlLHQuZGVhY3RpdmF0ZUhhbmRsZXJfKX0pfSxlLnByb3RvdHlwZS5yZW1vdmVDc3NWYXJzXz1mdW5jdGlvbigpe3ZhciB0PXRoaXMsbj1lLnN0cmluZ3M7T2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXswPT09ZS5pbmRleE9mKFwiVkFSX1wiKSYmdC5hZGFwdGVyXy51cGRhdGVDc3NWYXJpYWJsZShuW2VdLG51bGwpfSl9LGUucHJvdG90eXBlLmFjdGl2YXRlXz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKCF0aGlzLmFkYXB0ZXJfLmlzU3VyZmFjZURpc2FibGVkKCkpe3ZhciBuPXRoaXMuYWN0aXZhdGlvblN0YXRlXztpZighbi5pc0FjdGl2YXRlZCl7dmFyIGk9dGhpcy5wcmV2aW91c0FjdGl2YXRpb25FdmVudF87aWYoIShpJiZ2b2lkIDAhPT10JiZpLnR5cGUhPT10LnR5cGUpKW4uaXNBY3RpdmF0ZWQ9ITAsbi5pc1Byb2dyYW1tYXRpYz12b2lkIDA9PT10LG4uYWN0aXZhdGlvbkV2ZW50PXQsbi53YXNBY3RpdmF0ZWRCeVBvaW50ZXI9IW4uaXNQcm9ncmFtbWF0aWMmJih2b2lkIDAhPT10JiYoXCJtb3VzZWRvd25cIj09PXQudHlwZXx8XCJ0b3VjaHN0YXJ0XCI9PT10LnR5cGV8fFwicG9pbnRlcmRvd25cIj09PXQudHlwZSkpLHZvaWQgMCE9PXQmJmwubGVuZ3RoPjAmJmwuc29tZShmdW5jdGlvbih0KXtyZXR1cm4gZS5hZGFwdGVyXy5jb250YWluc0V2ZW50VGFyZ2V0KHQpfSk/dGhpcy5yZXNldEFjdGl2YXRpb25TdGF0ZV8oKToodm9pZCAwIT09dCYmKGwucHVzaCh0LnRhcmdldCksdGhpcy5yZWdpc3RlckRlYWN0aXZhdGlvbkhhbmRsZXJzXyh0KSksbi53YXNFbGVtZW50TWFkZUFjdGl2ZT10aGlzLmNoZWNrRWxlbWVudE1hZGVBY3RpdmVfKHQpLG4ud2FzRWxlbWVudE1hZGVBY3RpdmUmJnRoaXMuYW5pbWF0ZUFjdGl2YXRpb25fKCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7bD1bXSxuLndhc0VsZW1lbnRNYWRlQWN0aXZlfHx2b2lkIDA9PT10fHxcIiBcIiE9PXQua2V5JiYzMiE9PXQua2V5Q29kZXx8KG4ud2FzRWxlbWVudE1hZGVBY3RpdmU9ZS5jaGVja0VsZW1lbnRNYWRlQWN0aXZlXyh0KSxuLndhc0VsZW1lbnRNYWRlQWN0aXZlJiZlLmFuaW1hdGVBY3RpdmF0aW9uXygpKSxuLndhc0VsZW1lbnRNYWRlQWN0aXZlfHwoZS5hY3RpdmF0aW9uU3RhdGVfPWUuZGVmYXVsdEFjdGl2YXRpb25TdGF0ZV8oKSl9KSl9fX0sZS5wcm90b3R5cGUuY2hlY2tFbGVtZW50TWFkZUFjdGl2ZV89ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXR8fFwia2V5ZG93blwiIT09dC50eXBlfHx0aGlzLmFkYXB0ZXJfLmlzU3VyZmFjZUFjdGl2ZSgpfSxlLnByb3RvdHlwZS5hbmltYXRlQWN0aXZhdGlvbl89ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49ZS5zdHJpbmdzLGk9bi5WQVJfRkdfVFJBTlNMQVRFX1NUQVJULGE9bi5WQVJfRkdfVFJBTlNMQVRFX0VORCxyPWUuY3NzQ2xhc3NlcyxvPXIuRkdfREVBQ1RJVkFUSU9OLHM9ci5GR19BQ1RJVkFUSU9OLHU9ZS5udW1iZXJzLkRFQUNUSVZBVElPTl9USU1FT1VUX01TO3RoaXMubGF5b3V0SW50ZXJuYWxfKCk7dmFyIGM9XCJcIixkPVwiXCI7aWYoIXRoaXMuYWRhcHRlcl8uaXNVbmJvdW5kZWQoKSl7dmFyIHA9dGhpcy5nZXRGZ1RyYW5zbGF0aW9uQ29vcmRpbmF0ZXNfKCksbD1wLnN0YXJ0UG9pbnQsZj1wLmVuZFBvaW50O2M9bC54K1wicHgsIFwiK2wueStcInB4XCIsZD1mLngrXCJweCwgXCIrZi55K1wicHhcIn10aGlzLmFkYXB0ZXJfLnVwZGF0ZUNzc1ZhcmlhYmxlKGksYyksdGhpcy5hZGFwdGVyXy51cGRhdGVDc3NWYXJpYWJsZShhLGQpLGNsZWFyVGltZW91dCh0aGlzLmFjdGl2YXRpb25UaW1lcl8pLGNsZWFyVGltZW91dCh0aGlzLmZnRGVhY3RpdmF0aW9uUmVtb3ZhbFRpbWVyXyksdGhpcy5ybUJvdW5kZWRBY3RpdmF0aW9uQ2xhc3Nlc18oKSx0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKG8pLHRoaXMuYWRhcHRlcl8uY29tcHV0ZUJvdW5kaW5nUmVjdCgpLHRoaXMuYWRhcHRlcl8uYWRkQ2xhc3MocyksdGhpcy5hY3RpdmF0aW9uVGltZXJfPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gdC5hY3RpdmF0aW9uVGltZXJDYWxsYmFja18oKX0sdSl9LGUucHJvdG90eXBlLmdldEZnVHJhbnNsYXRpb25Db29yZGluYXRlc189ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuYWN0aXZhdGlvblN0YXRlXyxuPWUuYWN0aXZhdGlvbkV2ZW50O3JldHVybntzdGFydFBvaW50OnQ9e3g6KHQ9ZS53YXNBY3RpdmF0ZWRCeVBvaW50ZXI/T2JqZWN0KGMuZ2V0Tm9ybWFsaXplZEV2ZW50Q29vcmRzKShuLHRoaXMuYWRhcHRlcl8uZ2V0V2luZG93UGFnZU9mZnNldCgpLHRoaXMuYWRhcHRlcl8uY29tcHV0ZUJvdW5kaW5nUmVjdCgpKTp7eDp0aGlzLmZyYW1lXy53aWR0aC8yLHk6dGhpcy5mcmFtZV8uaGVpZ2h0LzJ9KS54LXRoaXMuaW5pdGlhbFNpemVfLzIseTp0LnktdGhpcy5pbml0aWFsU2l6ZV8vMn0sZW5kUG9pbnQ6e3g6dGhpcy5mcmFtZV8ud2lkdGgvMi10aGlzLmluaXRpYWxTaXplXy8yLHk6dGhpcy5mcmFtZV8uaGVpZ2h0LzItdGhpcy5pbml0aWFsU2l6ZV8vMn19fSxlLnByb3RvdHlwZS5ydW5EZWFjdGl2YXRpb25VWExvZ2ljSWZSZWFkeV89ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49ZS5jc3NDbGFzc2VzLkZHX0RFQUNUSVZBVElPTixpPXRoaXMuYWN0aXZhdGlvblN0YXRlXyxhPWkuaGFzRGVhY3RpdmF0aW9uVVhSdW4scj1pLmlzQWN0aXZhdGVkOyhhfHwhcikmJnRoaXMuYWN0aXZhdGlvbkFuaW1hdGlvbkhhc0VuZGVkXyYmKHRoaXMucm1Cb3VuZGVkQWN0aXZhdGlvbkNsYXNzZXNfKCksdGhpcy5hZGFwdGVyXy5hZGRDbGFzcyhuKSx0aGlzLmZnRGVhY3RpdmF0aW9uUmVtb3ZhbFRpbWVyXz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5hZGFwdGVyXy5yZW1vdmVDbGFzcyhuKX0sdS5GR19ERUFDVElWQVRJT05fTVMpKX0sZS5wcm90b3R5cGUucm1Cb3VuZGVkQWN0aXZhdGlvbkNsYXNzZXNfPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5jc3NDbGFzc2VzLkZHX0FDVElWQVRJT047dGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyh0KSx0aGlzLmFjdGl2YXRpb25BbmltYXRpb25IYXNFbmRlZF89ITEsdGhpcy5hZGFwdGVyXy5jb21wdXRlQm91bmRpbmdSZWN0KCl9LGUucHJvdG90eXBlLnJlc2V0QWN0aXZhdGlvblN0YXRlXz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5wcmV2aW91c0FjdGl2YXRpb25FdmVudF89dGhpcy5hY3RpdmF0aW9uU3RhdGVfLmFjdGl2YXRpb25FdmVudCx0aGlzLmFjdGl2YXRpb25TdGF0ZV89dGhpcy5kZWZhdWx0QWN0aXZhdGlvblN0YXRlXygpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gdC5wcmV2aW91c0FjdGl2YXRpb25FdmVudF89dm9pZCAwfSxlLm51bWJlcnMuVEFQX0RFTEFZX01TKX0sZS5wcm90b3R5cGUuZGVhY3RpdmF0ZV89ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5hY3RpdmF0aW9uU3RhdGVfO2lmKGUuaXNBY3RpdmF0ZWQpe3ZhciBuPWEoe30sZSk7ZS5pc1Byb2dyYW1tYXRpYz8ocmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7cmV0dXJuIHQuYW5pbWF0ZURlYWN0aXZhdGlvbl8obil9KSx0aGlzLnJlc2V0QWN0aXZhdGlvblN0YXRlXygpKToodGhpcy5kZXJlZ2lzdGVyRGVhY3RpdmF0aW9uSGFuZGxlcnNfKCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7dC5hY3RpdmF0aW9uU3RhdGVfLmhhc0RlYWN0aXZhdGlvblVYUnVuPSEwLHQuYW5pbWF0ZURlYWN0aXZhdGlvbl8obiksdC5yZXNldEFjdGl2YXRpb25TdGF0ZV8oKX0pKX19LGUucHJvdG90eXBlLmFuaW1hdGVEZWFjdGl2YXRpb25fPWZ1bmN0aW9uKHQpe3ZhciBlPXQud2FzQWN0aXZhdGVkQnlQb2ludGVyLG49dC53YXNFbGVtZW50TWFkZUFjdGl2ZTsoZXx8bikmJnRoaXMucnVuRGVhY3RpdmF0aW9uVVhMb2dpY0lmUmVhZHlfKCl9LGUucHJvdG90eXBlLmxheW91dEludGVybmFsXz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5mcmFtZV89dGhpcy5hZGFwdGVyXy5jb21wdXRlQm91bmRpbmdSZWN0KCk7dmFyIG49TWF0aC5tYXgodGhpcy5mcmFtZV8uaGVpZ2h0LHRoaXMuZnJhbWVfLndpZHRoKTt0aGlzLm1heFJhZGl1c189dGhpcy5hZGFwdGVyXy5pc1VuYm91bmRlZCgpP246TWF0aC5zcXJ0KE1hdGgucG93KHQuZnJhbWVfLndpZHRoLDIpK01hdGgucG93KHQuZnJhbWVfLmhlaWdodCwyKSkrZS5udW1iZXJzLlBBRERJTkcsdGhpcy5pbml0aWFsU2l6ZV89TWF0aC5mbG9vcihuKmUubnVtYmVycy5JTklUSUFMX09SSUdJTl9TQ0FMRSksdGhpcy5mZ1NjYWxlXz1cIlwiK3RoaXMubWF4UmFkaXVzXy90aGlzLmluaXRpYWxTaXplXyx0aGlzLnVwZGF0ZUxheW91dENzc1ZhcnNfKCl9LGUucHJvdG90eXBlLnVwZGF0ZUxheW91dENzc1ZhcnNfPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5zdHJpbmdzLG49dC5WQVJfRkdfU0laRSxpPXQuVkFSX0xFRlQsYT10LlZBUl9UT1Ascj10LlZBUl9GR19TQ0FMRTt0aGlzLmFkYXB0ZXJfLnVwZGF0ZUNzc1ZhcmlhYmxlKG4sdGhpcy5pbml0aWFsU2l6ZV8rXCJweFwiKSx0aGlzLmFkYXB0ZXJfLnVwZGF0ZUNzc1ZhcmlhYmxlKHIsdGhpcy5mZ1NjYWxlXyksdGhpcy5hZGFwdGVyXy5pc1VuYm91bmRlZCgpJiYodGhpcy51bmJvdW5kZWRDb29yZHNfPXtsZWZ0Ok1hdGgucm91bmQodGhpcy5mcmFtZV8ud2lkdGgvMi10aGlzLmluaXRpYWxTaXplXy8yKSx0b3A6TWF0aC5yb3VuZCh0aGlzLmZyYW1lXy5oZWlnaHQvMi10aGlzLmluaXRpYWxTaXplXy8yKX0sdGhpcy5hZGFwdGVyXy51cGRhdGVDc3NWYXJpYWJsZShpLHRoaXMudW5ib3VuZGVkQ29vcmRzXy5sZWZ0K1wicHhcIiksdGhpcy5hZGFwdGVyXy51cGRhdGVDc3NWYXJpYWJsZShhLHRoaXMudW5ib3VuZGVkQ29vcmRzXy50b3ArXCJweFwiKSl9LGV9KHIpO2UuZGVmYXVsdD1mfSwzODpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGksYTtmdW5jdGlvbiByKHQsZSl7dm9pZCAwPT09ZSYmKGU9ITEpO3ZhciBuPXQuQ1NTLGE9aTtpZihcImJvb2xlYW5cIj09dHlwZW9mIGkmJiFlKXJldHVybiBpO2lmKCEobiYmXCJmdW5jdGlvblwiPT10eXBlb2Ygbi5zdXBwb3J0cykpcmV0dXJuITE7dmFyIHI9bi5zdXBwb3J0cyhcIi0tY3NzLXZhcnNcIixcInllc1wiKSxvPW4uc3VwcG9ydHMoXCIoLS1jc3MtdmFyczogeWVzKVwiKSYmbi5zdXBwb3J0cyhcImNvbG9yXCIsXCIjMDAwMDAwMDBcIik7cmV0dXJuIGE9ISghciYmIW8pJiYhZnVuY3Rpb24odCl7dmFyIGU9dC5kb2N1bWVudCxuPWUuY3JlYXRlRWxlbWVudChcImRpdlwiKTtuLmNsYXNzTmFtZT1cIm1kYy1yaXBwbGUtc3VyZmFjZS0tdGVzdC1lZGdlLXZhci1idWdcIixlLmJvZHkuYXBwZW5kQ2hpbGQobik7dmFyIGk9dC5nZXRDb21wdXRlZFN0eWxlKG4pLGE9bnVsbCE9PWkmJlwic29saWRcIj09PWkuYm9yZGVyVG9wU3R5bGU7cmV0dXJuIG4ucmVtb3ZlKCksYX0odCksZXx8KGk9YSksYX1mdW5jdGlvbiBvKHQsZSl7aWYodm9pZCAwPT09dCYmKHQ9d2luZG93KSx2b2lkIDA9PT1lJiYoZT0hMSksdm9pZCAwPT09YXx8ZSl7dmFyIG49ITE7dHJ5e3QuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRlc3RcIixmdW5jdGlvbigpe30se2dldCBwYXNzaXZlKCl7cmV0dXJuIG49ITB9fSl9Y2F0Y2godCl7fWE9bn1yZXR1cm4hIWEmJntwYXNzaXZlOiEwfX1mdW5jdGlvbiBzKHQsZSxuKXtpZighdClyZXR1cm57eDowLHk6MH07dmFyIGksYSxyPWUueCxvPWUueSxzPXIrbi5sZWZ0LHU9bytuLnRvcDtpZihcInRvdWNoc3RhcnRcIj09PXQudHlwZSl7dmFyIGM9dDtpPWMuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVgtcyxhPWMuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVktdX1lbHNle3ZhciBkPXQ7aT1kLnBhZ2VYLXMsYT1kLnBhZ2VZLXV9cmV0dXJue3g6aSx5OmF9fW4ucihlKSxuLmQoZSxcInN1cHBvcnRzQ3NzVmFyaWFibGVzXCIsZnVuY3Rpb24oKXtyZXR1cm4gcn0pLG4uZChlLFwiYXBwbHlQYXNzaXZlXCIsZnVuY3Rpb24oKXtyZXR1cm4gb30pLG4uZChlLFwiZ2V0Tm9ybWFsaXplZEV2ZW50Q29vcmRzXCIsZnVuY3Rpb24oKXtyZXR1cm4gc30pfX0pfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yaXBwbGUuanMubWFwIiwiIWZ1bmN0aW9uKHQsZSl7aWYoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUpbW9kdWxlLmV4cG9ydHM9ZShyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcImNsYXNzbmFtZXNcIikpO2Vsc2UgaWYoXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXCJyZWFjdFwiLFwiY2xhc3NuYW1lc1wiXSxlKTtlbHNle3ZhciBuPVwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2UocmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTplKHQucmVhY3QsdC5jbGFzc25hbWVzKTtmb3IodmFyIHIgaW4gbikoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czp0KVtyXT1uW3JdfX0oXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4ocil7aWYoZVtyXSlyZXR1cm4gZVtyXS5leHBvcnRzO3ZhciBvPWVbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9cmV0dXJuIG4ubT10LG4uYz1lLG4uZD1mdW5jdGlvbih0LGUscil7bi5vKHQsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2VudW1lcmFibGU6ITAsZ2V0OnJ9KX0sbi5yPWZ1bmN0aW9uKHQpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbih0LGUpe2lmKDEmZSYmKHQ9bih0KSksOCZlKXJldHVybiB0O2lmKDQmZSYmXCJvYmplY3RcIj09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTp0fSksMiZlJiZcInN0cmluZ1wiIT10eXBlb2YgdClmb3IodmFyIG8gaW4gdCluLmQocixvLGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfS5iaW5kKG51bGwsbykpO3JldHVybiByfSxuLm49ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIG4uZChlLFwiYVwiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPVwiXCIsbihuLnM9NzkpfSh7MDpmdW5jdGlvbihlLG4pe2UuZXhwb3J0cz10fSwxOmZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWV9LDE2MDpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5yKGUpO1wiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yO1xuLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxuXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovdmFyIHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4ocj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9O3ZhciBvPWZ1bmN0aW9uKCl7cmV0dXJuKG89T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rKylmb3IodmFyIG8gaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbykmJih0W29dPWVbb10pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZvaWQgMD09PXQmJih0PXt9KSx0aGlzLmFkYXB0ZXJfPXR9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcInN0cmluZ3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJudW1iZXJzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe30sdH0oKSxpPW4oMzcpO24uZChlLFwiTURDRmxvYXRpbmdMYWJlbEZvdW5kYXRpb25cIixmdW5jdGlvbigpe3JldHVybiBzfSk7XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cbnZhciBzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobil7dmFyIHI9dC5jYWxsKHRoaXMsbyh7fSxlLmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpcztyZXR1cm4gci5zaGFrZUFuaW1hdGlvbkVuZEhhbmRsZXJfPWZ1bmN0aW9uKCl7cmV0dXJuIHIuaGFuZGxlU2hha2VBbmltYXRpb25FbmRfKCl9LHJ9cmV0dXJuIGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1yKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfShlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5jc3NDbGFzc2VzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2FkZENsYXNzOmZ1bmN0aW9uKCl7fSxyZW1vdmVDbGFzczpmdW5jdGlvbigpe30sZ2V0V2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gMH0scmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXI6ZnVuY3Rpb24oKXt9LGRlcmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXI6ZnVuY3Rpb24oKXt9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dGhpcy5hZGFwdGVyXy5yZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcihcImFuaW1hdGlvbmVuZFwiLHRoaXMuc2hha2VBbmltYXRpb25FbmRIYW5kbGVyXyl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmFkYXB0ZXJfLmRlcmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXIoXCJhbmltYXRpb25lbmRcIix0aGlzLnNoYWtlQW5pbWF0aW9uRW5kSGFuZGxlcl8pfSxlLnByb3RvdHlwZS5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFkYXB0ZXJfLmdldFdpZHRoKCl9LGUucHJvdG90eXBlLnNoYWtlPWZ1bmN0aW9uKHQpe3ZhciBuPWUuY3NzQ2xhc3Nlcy5MQUJFTF9TSEFLRTt0P3RoaXMuYWRhcHRlcl8uYWRkQ2xhc3Mobik6dGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyhuKX0sZS5wcm90b3R5cGUuZmxvYXQ9ZnVuY3Rpb24odCl7dmFyIG49ZS5jc3NDbGFzc2VzLHI9bi5MQUJFTF9GTE9BVF9BQk9WRSxvPW4uTEFCRUxfU0hBS0U7dD90aGlzLmFkYXB0ZXJfLmFkZENsYXNzKHIpOih0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKHIpLHRoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MobykpfSxlLnByb3RvdHlwZS5oYW5kbGVTaGFrZUFuaW1hdGlvbkVuZF89ZnVuY3Rpb24oKXt2YXIgdD1lLmNzc0NsYXNzZXMuTEFCRUxfU0hBS0U7dGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyh0KX0sZX0oYSk7ZS5kZWZhdWx0PXN9LDM3OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSksbi5kKGUsXCJjc3NDbGFzc2VzXCIsZnVuY3Rpb24oKXtyZXR1cm4gcn0pO1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG52YXIgcj17TEFCRUxfRkxPQVRfQUJPVkU6XCJtZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlXCIsTEFCRUxfU0hBS0U6XCJtZGMtZmxvYXRpbmctbGFiZWwtLXNoYWtlXCIsUk9PVDpcIm1kYy1mbG9hdGluZy1sYWJlbFwifX0sNzk6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByLG89dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKHI9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9KSh0LGUpfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9cih0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLGE9dGhpcyYmdGhpcy5fX2Fzc2lnbnx8ZnVuY3Rpb24oKXtyZXR1cm4oYT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLHI9YXJndW1lbnRzLmxlbmd0aDtuPHI7bisrKWZvcih2YXIgbyBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxvKSYmKHRbb109ZVtvXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGk9dGhpcyYmdGhpcy5fX3Jlc3R8fGZ1bmN0aW9uKHQsZSl7dmFyIG49e307Zm9yKHZhciByIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscikmJmUuaW5kZXhPZihyKTwwJiYobltyXT10W3JdKTtpZihudWxsIT10JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgbz0wO2ZvcihyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7bzxyLmxlbmd0aDtvKyspZS5pbmRleE9mKHJbb10pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LHJbb10pJiYobltyW29dXT10W3Jbb11dKX1yZXR1cm4gbn0scz10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbD1zKG4oMCkpLHU9cyhuKDEpKSxjPW4oMTYwKSxmPW4oMzcpLHA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5sYWJlbEVsZW1lbnQ9bC5kZWZhdWx0LmNyZWF0ZVJlZigpLGUuc3RhdGU9e2NsYXNzTGlzdDpuZXcgU2V0fSxlLmluaXRpYWxpemVGb3VuZGF0aW9uPWZ1bmN0aW9uKCl7ZS5mb3VuZGF0aW9uPW5ldyBjLk1EQ0Zsb2F0aW5nTGFiZWxGb3VuZGF0aW9uKGUuYWRhcHRlciksZS5mb3VuZGF0aW9uLmluaXQoKX0sZS5zaGFrZT1mdW5jdGlvbigpe2UuZm91bmRhdGlvbi5zaGFrZSghMCl9LGUucmVtb3ZlQ2xhc3NGcm9tQ2xhc3NMaXN0PWZ1bmN0aW9uKHQpe3ZhciBuPWUuc3RhdGUuY2xhc3NMaXN0O24uZGVsZXRlKHQpLGUuc2V0U3RhdGUoe2NsYXNzTGlzdDpufSl9LGUuaGFuZGxlV2lkdGhDaGFuZ2U9ZnVuY3Rpb24oKXtlLnByb3BzLmhhbmRsZVdpZHRoQ2hhbmdlJiZlLmxhYmVsRWxlbWVudC5jdXJyZW50JiZlLnByb3BzLmhhbmRsZVdpZHRoQ2hhbmdlKGUubGFiZWxFbGVtZW50LmN1cnJlbnQub2Zmc2V0V2lkdGgpfSxlLm9uU2hha2VFbmQ9ZnVuY3Rpb24oKXtlLnJlbW92ZUNsYXNzRnJvbUNsYXNzTGlzdChmLmNzc0NsYXNzZXMuTEFCRUxfU0hBS0UpfSxlfXJldHVybiBvKGUsdCksZS5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt0aGlzLmluaXRpYWxpemVGb3VuZGF0aW9uKCksdGhpcy5oYW5kbGVXaWR0aENoYW5nZSgpLHRoaXMucHJvcHMuZmxvYXQmJnRoaXMuZm91bmRhdGlvbi5mbG9hdCghMCl9LGUucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7dGhpcy5mb3VuZGF0aW9uLmRlc3Ryb3koKX0sZS5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPWZ1bmN0aW9uKHQpe3RoaXMucHJvcHMuY2hpbGRyZW4hPT10LmNoaWxkcmVuJiZ0aGlzLmhhbmRsZVdpZHRoQ2hhbmdlKCksdGhpcy5wcm9wcy5mbG9hdCE9PXQuZmxvYXQmJnRoaXMuZm91bmRhdGlvbi5mbG9hdCh0aGlzLnByb3BzLmZsb2F0KX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiY2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnN0YXRlLmNsYXNzTGlzdCxlPXRoaXMucHJvcHMuY2xhc3NOYW1lO3JldHVybiB1LmRlZmF1bHQoZi5jc3NDbGFzc2VzLlJPT1QsQXJyYXkuZnJvbSh0KSxlKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJhZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJue2FkZENsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnNldFN0YXRlKHtjbGFzc0xpc3Q6dC5zdGF0ZS5jbGFzc0xpc3QuYWRkKGUpfSl9LHJlbW92ZUNsYXNzOnRoaXMucmVtb3ZlQ2xhc3NGcm9tQ2xhc3NMaXN0LHJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxkZXJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxnZXRXaWR0aDpmdW5jdGlvbigpe3JldHVybiAwfX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcyxlPSh0LmNsYXNzTmFtZSx0LmNoaWxkcmVuKSxuPSh0LmhhbmRsZVdpZHRoQ2hhbmdlLHQuZmxvYXQsaSh0LFtcImNsYXNzTmFtZVwiLFwiY2hpbGRyZW5cIixcImhhbmRsZVdpZHRoQ2hhbmdlXCIsXCJmbG9hdFwiXSkpO3JldHVybiBsLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIsYSh7Y2xhc3NOYW1lOnRoaXMuY2xhc3NlcyxyZWY6dGhpcy5sYWJlbEVsZW1lbnQsb25BbmltYXRpb25FbmQ6dGhpcy5vblNoYWtlRW5kfSxuKSxlKX0sZS5kZWZhdWx0UHJvcHM9e2NsYXNzTmFtZTpcIlwiLGZsb2F0OiExfSxlfShsLmRlZmF1bHQuQ29tcG9uZW50KTtlLmRlZmF1bHQ9cH19KX0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmxvYXRpbmctbGFiZWwuanMubWFwIiwiIWZ1bmN0aW9uKHQsZSl7aWYoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUpbW9kdWxlLmV4cG9ydHM9ZShyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcImNsYXNzbmFtZXNcIikpO2Vsc2UgaWYoXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXCJyZWFjdFwiLFwiY2xhc3NuYW1lc1wiXSxlKTtlbHNle3ZhciBuPVwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2UocmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTplKHQucmVhY3QsdC5jbGFzc25hbWVzKTtmb3IodmFyIHIgaW4gbikoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czp0KVtyXT1uW3JdfX0oXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4ocil7aWYoZVtyXSlyZXR1cm4gZVtyXS5leHBvcnRzO3ZhciBvPWVbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9cmV0dXJuIG4ubT10LG4uYz1lLG4uZD1mdW5jdGlvbih0LGUscil7bi5vKHQsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2VudW1lcmFibGU6ITAsZ2V0OnJ9KX0sbi5yPWZ1bmN0aW9uKHQpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbih0LGUpe2lmKDEmZSYmKHQ9bih0KSksOCZlKXJldHVybiB0O2lmKDQmZSYmXCJvYmplY3RcIj09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTp0fSksMiZlJiZcInN0cmluZ1wiIT10eXBlb2YgdClmb3IodmFyIG8gaW4gdCluLmQocixvLGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfS5iaW5kKG51bGwsbykpO3JldHVybiByfSxuLm49ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIG4uZChlLFwiYVwiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPVwiXCIsbihuLnM9ODYpfSh7MDpmdW5jdGlvbihlLG4pe2UuZXhwb3J0cz10fSwxOmZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWV9LDE1MTpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5yKGUpO1wiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yO1xuLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxuXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovdmFyIHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4ocj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9O3ZhciBvPWZ1bmN0aW9uKCl7cmV0dXJuKG89T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rKylmb3IodmFyIG8gaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbykmJih0W29dPWVbb10pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZvaWQgMD09PXQmJih0PXt9KSx0aGlzLmFkYXB0ZXJfPXR9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcInN0cmluZ3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJudW1iZXJzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe30sdH0oKSxhPXtMSU5FX1JJUFBMRV9BQ1RJVkU6XCJtZGMtbGluZS1yaXBwbGUtLWFjdGl2ZVwiLExJTkVfUklQUExFX0RFQUNUSVZBVElORzpcIm1kYy1saW5lLXJpcHBsZS0tZGVhY3RpdmF0aW5nXCJ9O24uZChlLFwiTURDTGluZVJpcHBsZUZvdW5kYXRpb25cIixmdW5jdGlvbigpe3JldHVybiBzfSk7XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cbnZhciBzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobil7dmFyIHI9dC5jYWxsKHRoaXMsbyh7fSxlLmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpcztyZXR1cm4gci50cmFuc2l0aW9uRW5kSGFuZGxlcl89ZnVuY3Rpb24odCl7cmV0dXJuIHIuaGFuZGxlVHJhbnNpdGlvbkVuZCh0KX0scn1yZXR1cm4gZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fXIodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJjc3NDbGFzc2VzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBhfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2FkZENsYXNzOmZ1bmN0aW9uKCl7fSxyZW1vdmVDbGFzczpmdW5jdGlvbigpe30saGFzQ2xhc3M6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sc2V0U3R5bGU6ZnVuY3Rpb24oKXt9LHJlZ2lzdGVyRXZlbnRIYW5kbGVyOmZ1bmN0aW9uKCl7fSxkZXJlZ2lzdGVyRXZlbnRIYW5kbGVyOmZ1bmN0aW9uKCl7fX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3RoaXMuYWRhcHRlcl8ucmVnaXN0ZXJFdmVudEhhbmRsZXIoXCJ0cmFuc2l0aW9uZW5kXCIsdGhpcy50cmFuc2l0aW9uRW5kSGFuZGxlcl8pfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5hZGFwdGVyXy5kZXJlZ2lzdGVyRXZlbnRIYW5kbGVyKFwidHJhbnNpdGlvbmVuZFwiLHRoaXMudHJhbnNpdGlvbkVuZEhhbmRsZXJfKX0sZS5wcm90b3R5cGUuYWN0aXZhdGU9ZnVuY3Rpb24oKXt0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGEuTElORV9SSVBQTEVfREVBQ1RJVkFUSU5HKSx0aGlzLmFkYXB0ZXJfLmFkZENsYXNzKGEuTElORV9SSVBQTEVfQUNUSVZFKX0sZS5wcm90b3R5cGUuc2V0UmlwcGxlQ2VudGVyPWZ1bmN0aW9uKHQpe3RoaXMuYWRhcHRlcl8uc2V0U3R5bGUoXCJ0cmFuc2Zvcm0tb3JpZ2luXCIsdCtcInB4IGNlbnRlclwiKX0sZS5wcm90b3R5cGUuZGVhY3RpdmF0ZT1mdW5jdGlvbigpe3RoaXMuYWRhcHRlcl8uYWRkQ2xhc3MoYS5MSU5FX1JJUFBMRV9ERUFDVElWQVRJTkcpfSxlLnByb3RvdHlwZS5oYW5kbGVUcmFuc2l0aW9uRW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYWRhcHRlcl8uaGFzQ2xhc3MoYS5MSU5FX1JJUFBMRV9ERUFDVElWQVRJTkcpO1wib3BhY2l0eVwiPT09dC5wcm9wZXJ0eU5hbWUmJmUmJih0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGEuTElORV9SSVBQTEVfQUNUSVZFKSx0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGEuTElORV9SSVBQTEVfREVBQ1RJVkFUSU5HKSl9LGV9KGkpO2UuZGVmYXVsdD1zfSw4NjpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHIsbz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4ocj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1yKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSksaT10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihpPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEscj1hcmd1bWVudHMubGVuZ3RoO248cjtuKyspZm9yKHZhciBvIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG8pJiYodFtvXT1lW29dKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYT10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIHIgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxyKSYmZS5pbmRleE9mKHIpPDAmJihuW3JdPXRbcl0pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBvPTA7Zm9yKHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtvPHIubGVuZ3RoO28rKyllLmluZGV4T2YocltvXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQscltvXSkmJihuW3Jbb11dPXRbcltvXV0pfXJldHVybiBufSxzPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciB1PXMobigwKSksYz1zKG4oMSkpLHA9bigxNTEpLGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5zdGF0ZT17Y2xhc3NMaXN0Om5ldyBTZXQsc3R5bGU6e319LGUuc2V0U3R5bGU9ZnVuY3Rpb24odCxuKXt2YXIgcj10LnJlcGxhY2UoLy0oXFx3KS9nLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUudG9VcHBlckNhc2UoKX0pLG89T2JqZWN0LmFzc2lnbih7fSxlLnN0YXRlLnN0eWxlKTtvW3JdPW4sZS5zZXRTdGF0ZSh7c3R5bGU6b30pfSxlLmdldE1lcmdlZFN0eWxlcz1mdW5jdGlvbigpe3ZhciB0PWUucHJvcHMuc3R5bGUsbj1lLnN0YXRlLnN0eWxlO3JldHVybiBPYmplY3QuYXNzaWduKHt9LG4sdCl9LGUub25UcmFuc2l0aW9uRW5kPWZ1bmN0aW9uKHQpe3JldHVybiBlLmZvdW5kYXRpb25fLmhhbmRsZVRyYW5zaXRpb25FbmQodC5uYXRpdmVFdmVudCl9LGV9cmV0dXJuIG8oZSx0KSxlLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3RoaXMuZm91bmRhdGlvbl89bmV3IHAuTURDTGluZVJpcHBsZUZvdW5kYXRpb24odGhpcy5hZGFwdGVyKSx0aGlzLmZvdW5kYXRpb25fLmluaXQoKSx0aGlzLnByb3BzLmFjdGl2ZSYmdGhpcy5mb3VuZGF0aW9uXy5hY3RpdmF0ZSgpfSxlLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9ZnVuY3Rpb24odCl7dGhpcy5wcm9wcy5hY3RpdmUhPT10LmFjdGl2ZSYmKHRoaXMucHJvcHMuYWN0aXZlP3RoaXMuZm91bmRhdGlvbl8uYWN0aXZhdGUoKTp0aGlzLmZvdW5kYXRpb25fLmRlYWN0aXZhdGUoKSk7dmFyIGU9dGhpcy5wcm9wcy5yaXBwbGVDZW50ZXI7ZSYmZSE9PXQucmlwcGxlQ2VudGVyJiYhaXNOYU4oZSkmJnRoaXMuZm91bmRhdGlvbl8uc2V0UmlwcGxlQ2VudGVyKGUpfSxlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMuZm91bmRhdGlvbl8uZGVzdHJveSgpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJhZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJue2FkZENsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnNldFN0YXRlKHtjbGFzc0xpc3Q6dC5zdGF0ZS5jbGFzc0xpc3QuYWRkKGUpfSl9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciBuPXQuc3RhdGUuY2xhc3NMaXN0O24uZGVsZXRlKGUpLHQuc2V0U3RhdGUoe2NsYXNzTGlzdDpufSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnN0YXRlLmNsYXNzTGlzdC5oYXMoZSl9LHNldFN0eWxlOnRoaXMuc2V0U3R5bGUscmVnaXN0ZXJFdmVudEhhbmRsZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sZGVyZWdpc3RlckV2ZW50SGFuZGxlcjpmdW5jdGlvbigpe3JldHVybiBudWxsfX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiY2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLmNsYXNzTmFtZSxlPXRoaXMuc3RhdGUuY2xhc3NMaXN0O3JldHVybiBjLmRlZmF1bHQoXCJtZGMtbGluZS1yaXBwbGVcIixBcnJheS5mcm9tKGUpLHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMsZT0odC5zdHlsZSx0LmNsYXNzTmFtZSx0LmFjdGl2ZSx0LnJpcHBsZUNlbnRlcixhKHQsW1wic3R5bGVcIixcImNsYXNzTmFtZVwiLFwiYWN0aXZlXCIsXCJyaXBwbGVDZW50ZXJcIl0pKTtyZXR1cm4gdS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIixpKHtjbGFzc05hbWU6dGhpcy5jbGFzc2VzLHN0eWxlOnRoaXMuZ2V0TWVyZ2VkU3R5bGVzKCksb25UcmFuc2l0aW9uRW5kOnRoaXMub25UcmFuc2l0aW9uRW5kfSxlKSl9LGUuZGVmYXVsdFByb3BzPXtjbGFzc05hbWU6XCJcIixzdHlsZTp7fSxhY3RpdmU6ITEscmlwcGxlQ2VudGVyOjB9LGV9KHUuZGVmYXVsdC5Db21wb25lbnQpO2UuZGVmYXVsdD1sfX0pfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saW5lLXJpcHBsZS5qcy5tYXAiLCIhZnVuY3Rpb24oZSx0KXtpZihcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZSltb2R1bGUuZXhwb3J0cz10KHJlcXVpcmUoXCJyZWFjdFwiKSxyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSxyZXF1aXJlKFwiQG1hdGVyaWFsL3JlYWN0LXJpcHBsZS9kaXN0L2luZGV4LmpzXCIpKTtlbHNlIGlmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW1wicmVhY3RcIixcImNsYXNzbmFtZXNcIixcIkBtYXRlcmlhbC9yZWFjdC1yaXBwbGUvZGlzdC9pbmRleC5qc1wiXSx0KTtlbHNle3ZhciBuPVwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP3QocmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpLHJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtcmlwcGxlL2Rpc3QvaW5kZXguanNcIikpOnQoZS5yZWFjdCxlLmNsYXNzbmFtZXMsZVtcIkBtYXRlcmlhbC9yZWFjdC1yaXBwbGUvZGlzdC9pbmRleC5qc1wiXSk7Zm9yKHZhciByIGluIG4pKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6ZSlbcl09bltyXX19KFwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcyxmdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Z1bmN0aW9uIG4ocil7aWYodFtyXSlyZXR1cm4gdFtyXS5leHBvcnRzO3ZhciBpPXRbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiBlW3JdLmNhbGwoaS5leHBvcnRzLGksaS5leHBvcnRzLG4pLGkubD0hMCxpLmV4cG9ydHN9cmV0dXJuIG4ubT1lLG4uYz10LG4uZD1mdW5jdGlvbihlLHQscil7bi5vKGUsdCl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6ITAsZ2V0OnJ9KX0sbi5yPWZ1bmN0aW9uKGUpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbihlLHQpe2lmKDEmdCYmKGU9bihlKSksOCZ0KXJldHVybiBlO2lmKDQmdCYmXCJvYmplY3RcIj09dHlwZW9mIGUmJmUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTplfSksMiZ0JiZcInN0cmluZ1wiIT10eXBlb2YgZSlmb3IodmFyIGkgaW4gZSluLmQocixpLGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfS5iaW5kKG51bGwsaSkpO3JldHVybiByfSxuLm49ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIG4uZCh0LFwiYVwiLHQpLHR9LG4ubz1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX0sbi5wPVwiXCIsbihuLnM9NDEpfSh7MDpmdW5jdGlvbih0LG4pe3QuZXhwb3J0cz1lfSwxOmZ1bmN0aW9uKGUsbil7ZS5leHBvcnRzPXR9LDQxOmZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcixpPXRoaXMmJnRoaXMuX19leHRlbmRzfHwocj1mdW5jdGlvbihlLHQpe3JldHVybihyPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihlLHQpe2UuX19wcm90b19fPXR9fHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJihlW25dPXRbbl0pfSkoZSx0KX0sZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfXIoZSx0KSxlLnByb3RvdHlwZT1udWxsPT09dD9PYmplY3QuY3JlYXRlKHQpOihuLnByb3RvdHlwZT10LnByb3RvdHlwZSxuZXcgbil9KSxvPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKG89T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rKylmb3IodmFyIGkgaW4gdD1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsaSkmJihlW2ldPXRbaV0pO3JldHVybiBlfSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxzPXRoaXMmJnRoaXMuX19yZXN0fHxmdW5jdGlvbihlLHQpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiZ0LmluZGV4T2Yocik8MCYmKG5bcl09ZVtyXSk7aWYobnVsbCE9ZSYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGk9MDtmb3Iocj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO2k8ci5sZW5ndGg7aSsrKXQuaW5kZXhPZihyW2ldKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyW2ldKSYmKG5bcltpXV09ZVtyW2ldXSl9cmV0dXJuIG59LGE9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIGw9YShuKDApKSxjPWEobigxKSksdT1uKDQyKSxkPWEobig4OCkpLGY9YShuKDg5KSk7dC5MaXN0SXRlbT1mLmRlZmF1bHQ7dmFyIHA9YShuKDkxKSk7dC5MaXN0SXRlbUdyYXBoaWM9cC5kZWZhdWx0O3ZhciBoPWEobig5MikpO3QuTGlzdEl0ZW1UZXh0PWguZGVmYXVsdDt2YXIgXz1hKG4oOTMpKTt0Lkxpc3RJdGVtTWV0YT1fLmRlZmF1bHQ7dmFyIG09YShuKDk0KSk7dC5MaXN0RGl2aWRlcj1tLmRlZmF1bHQ7dmFyIEk9YShuKDk1KSk7dC5MaXN0R3JvdXA9SS5kZWZhdWx0O3ZhciB5PWEobig5NikpO3QuTGlzdEdyb3VwU3ViaGVhZGVyPXkuZGVmYXVsdDtmdW5jdGlvbiBiKGUpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiBlJiYhaXNOYU4oZSl8fEFycmF5LmlzQXJyYXkoZSl9dC5kZWZhdWx0TGlzdEl0ZW1Db250ZXh0PXtoYW5kbGVDbGljazpmdW5jdGlvbigpe30saGFuZGxlS2V5RG93bjpmdW5jdGlvbigpe30saGFuZGxlQmx1cjpmdW5jdGlvbigpe30saGFuZGxlRm9jdXM6ZnVuY3Rpb24oKXt9LG9uRGVzdHJveTpmdW5jdGlvbigpe30sZ2V0TGlzdEl0ZW1Jbml0aWFsVGFiSW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4tMX0sZ2V0Q2xhc3NOYW1lc0Zyb21MaXN0OmZ1bmN0aW9uKCl7cmV0dXJue319fSx0Lkxpc3RJdGVtQ29udGV4dD1sLmRlZmF1bHQuY3JlYXRlQ29udGV4dCh0LmRlZmF1bHRMaXN0SXRlbUNvbnRleHQpO3ZhciB4PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oKXt2YXIgdD1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIHQuaGFzSW5pdGlhbGl6ZWRMaXN0SXRlbVRhYkluZGV4PSExLHQubGlzdEVsZW1lbnQ9bC5kZWZhdWx0LmNyZWF0ZVJlZigpLHQuc3RhdGU9e2xpc3RJdGVtQ2xhc3NOYW1lczp7fX0sdC5pbml0aWFsaXplTGlzdFR5cGU9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3BzLnNpbmdsZVNlbGVjdGlvbixuPXUuTURDTGlzdEZvdW5kYXRpb24uY3NzQ2xhc3NlcyxyPXUuTURDTGlzdEZvdW5kYXRpb24uc3RyaW5ncztpZih0Lmxpc3RFbGVtZW50LmN1cnJlbnQpe3ZhciBpPXQubGlzdEVsZW1lbnQuY3VycmVudC5xdWVyeVNlbGVjdG9yQWxsKHIuQVJJQV9ST0xFX0NIRUNLQk9YX1NFTEVDVE9SKSxvPXQubGlzdEVsZW1lbnQuY3VycmVudC5xdWVyeVNlbGVjdG9yKHIuQVJJQV9DSEVDS0VEX1JBRElPX1NFTEVDVE9SKTtpZihpLmxlbmd0aCl7dmFyIHM9dC5saXN0RWxlbWVudC5jdXJyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoci5BUklBX0NIRUNLRURfQ0hFQ0tCT1hfU0VMRUNUT1IpLGE9W10ubWFwLmNhbGwocyxmdW5jdGlvbihlKXtyZXR1cm4gdC5saXN0RWxlbWVudHMuaW5kZXhPZihlKX0pO3QuZm91bmRhdGlvbi5zZXRTZWxlY3RlZEluZGV4KGEpfWVsc2UgaWYoZSl7dC5saXN0RWxlbWVudC5jdXJyZW50LnF1ZXJ5U2VsZWN0b3Iobi5MSVNUX0lURU1fQUNUSVZBVEVEX0NMQVNTKSYmdC5mb3VuZGF0aW9uLnNldFVzZUFjdGl2YXRlZENsYXNzKCEwKX1lbHNlIG8mJnQuZm91bmRhdGlvbi5zZXRTZWxlY3RlZEluZGV4KHQubGlzdEVsZW1lbnRzLmluZGV4T2YobykpfX0sdC5nZXRMaXN0SXRlbUluaXRpYWxUYWJJbmRleD1mdW5jdGlvbihlKXt2YXIgbj10LnByb3BzLnNlbGVjdGVkSW5kZXgscj0tMTt0Lmhhc0luaXRpYWxpemVkTGlzdEl0ZW1UYWJJbmRleHx8KEFycmF5LmlzQXJyYXkobikmJm4ubGVuZ3RoPjAmJmU9PT1uWzBdfHxuPT09ZXx8LTE9PT1uKSYmKHI9MCx0Lmhhc0luaXRpYWxpemVkTGlzdEl0ZW1UYWJJbmRleD0hMCk7cmV0dXJuIHJ9LHQuZ2V0TGlzdEl0ZW1DbGFzc05hbWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHQuc3RhdGUubGlzdEl0ZW1DbGFzc05hbWVzfSx0LmhhbmRsZUtleURvd249ZnVuY3Rpb24oZSxuKXtlLnBlcnNpc3QoKSx0LmZvdW5kYXRpb24uaGFuZGxlS2V5ZG93bihlLm5hdGl2ZUV2ZW50LCEwLG4pfSx0LmhhbmRsZUNsaWNrPWZ1bmN0aW9uKGUsbil7dC5mb3VuZGF0aW9uLmhhbmRsZUNsaWNrKG4sITEpfSx0LmhhbmRsZUZvY3VzPWZ1bmN0aW9uKGUsbil7dC5mb3VuZGF0aW9uLmhhbmRsZUZvY3VzSW4oZS5uYXRpdmVFdmVudCxuKX0sdC5oYW5kbGVCbHVyPWZ1bmN0aW9uKGUsbil7dC5mb3VuZGF0aW9uLmhhbmRsZUZvY3VzT3V0KGUubmF0aXZlRXZlbnQsbil9LHQub25EZXN0cm95PWZ1bmN0aW9uKGUpe3ZhciBuPXQuc3RhdGUubGlzdEl0ZW1DbGFzc05hbWVzO2RlbGV0ZSBuW2VdLHQuc2V0U3RhdGUoe2xpc3RJdGVtQ2xhc3NOYW1lczpufSl9LHQuZ2V0TGlzdFByb3BzPWZ1bmN0aW9uKGUsbil7cmV0dXJue2NoZWNrYm94TGlzdDpCb29sZWFuKGUpLHJhZGlvTGlzdDpCb29sZWFuKG4pLGhhbmRsZUtleURvd246dC5oYW5kbGVLZXlEb3duLGhhbmRsZUNsaWNrOnQuaGFuZGxlQ2xpY2ssaGFuZGxlRm9jdXM6dC5oYW5kbGVGb2N1cyxoYW5kbGVCbHVyOnQuaGFuZGxlQmx1cixvbkRlc3Ryb3k6dC5vbkRlc3Ryb3ksZ2V0Q2xhc3NOYW1lc0Zyb21MaXN0OnQuZ2V0TGlzdEl0ZW1DbGFzc05hbWVzLGdldExpc3RJdGVtSW5pdGlhbFRhYkluZGV4OnQuZ2V0TGlzdEl0ZW1Jbml0aWFsVGFiSW5kZXh9fSx0LmdldExpc3RQcm9wc01lbW9pemVkPWQuZGVmYXVsdCh0LmdldExpc3RQcm9wcyksdH1yZXR1cm4gaShuLGUpLG4ucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyx0PWUuc2luZ2xlU2VsZWN0aW9uLG49ZS53cmFwRm9jdXMscj1lLnNlbGVjdGVkSW5kZXg7dGhpcy5mb3VuZGF0aW9uPW5ldyB1Lk1EQ0xpc3RGb3VuZGF0aW9uKHRoaXMuYWRhcHRlciksdGhpcy5mb3VuZGF0aW9uLmluaXQoKSx0aGlzLmZvdW5kYXRpb24uc2V0U2luZ2xlU2VsZWN0aW9uKHQpLHRoaXMuZm91bmRhdGlvbi5sYXlvdXQoKSxiKHIpJiZ0aGlzLmZvdW5kYXRpb24uc2V0U2VsZWN0ZWRJbmRleChyKSx0aGlzLmZvdW5kYXRpb24uc2V0V3JhcEZvY3VzKG4pLHRoaXMuZm91bmRhdGlvbi5zZXRWZXJ0aWNhbE9yaWVudGF0aW9uKFwidmVydGljYWxcIj09PXRoaXMucHJvcHNbXCJhcmlhLW9yaWVudGF0aW9uXCJdKSx0aGlzLmluaXRpYWxpemVMaXN0VHlwZSgpfSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wcm9wcyxuPXQuc2luZ2xlU2VsZWN0aW9uLHI9dC53cmFwRm9jdXMsaT10LnNlbGVjdGVkSW5kZXgsbz1pIT09ZS5zZWxlY3RlZEluZGV4O24hPT1lLnNpbmdsZVNlbGVjdGlvbiYmdGhpcy5mb3VuZGF0aW9uLnNldFNpbmdsZVNlbGVjdGlvbihuKSxvJiZiKGkpJiZ0aGlzLmZvdW5kYXRpb24uc2V0U2VsZWN0ZWRJbmRleChpKSxyIT09ZS53cmFwRm9jdXMmJnRoaXMuZm91bmRhdGlvbi5zZXRXcmFwRm9jdXMociksdGhpcy5wcm9wc1tcImFyaWEtb3JpZW50YXRpb25cIl0hPT1lW1wiYXJpYS1vcmllbnRhdGlvblwiXSYmdGhpcy5mb3VuZGF0aW9uLnNldFZlcnRpY2FsT3JpZW50YXRpb24oXCJ2ZXJ0aWNhbFwiPT09dGhpcy5wcm9wc1tcImFyaWEtb3JpZW50YXRpb25cIl0pfSxuLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMuZm91bmRhdGlvbi5kZXN0cm95KCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSxcImxpc3RFbGVtZW50c1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5saXN0RWxlbWVudC5jdXJyZW50P1tdLnNsaWNlLmNhbGwodGhpcy5saXN0RWxlbWVudC5jdXJyZW50LnF1ZXJ5U2VsZWN0b3JBbGwodS5NRENMaXN0Rm91bmRhdGlvbi5zdHJpbmdzLkVOQUJMRURfSVRFTVNfU0VMRUNUT1IpKTpbXX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsXCJjbGFzc2VzXCIse2dldDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLmNsYXNzTmFtZSxuPWUubm9uSW50ZXJhY3RpdmUscj1lLmRlbnNlLGk9ZS5hdmF0YXJMaXN0LG89ZS50d29MaW5lO3JldHVybiBjLmRlZmF1bHQoXCJtZGMtbGlzdFwiLHQse1wibWRjLWxpc3QtLW5vbi1pbnRlcmFjdGl2ZVwiOm4sXCJtZGMtbGlzdC0tZGVuc2VcIjpyLFwibWRjLWxpc3QtLWF2YXRhci1saXN0XCI6aSxcIm1kYy1saXN0LS10d28tbGluZVwiOm99KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsXCJhZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJue2dldExpc3RJdGVtQ291bnQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5saXN0RWxlbWVudHMubGVuZ3RofSxnZXRGb2N1c2VkRWxlbWVudEluZGV4OmZ1bmN0aW9uKCl7cmV0dXJuIGUubGlzdEVsZW1lbnRzLmluZGV4T2YoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCl9LHNldEF0dHJpYnV0ZUZvckVsZW1lbnRJbmRleDpmdW5jdGlvbih0LG4scil7dmFyIGk9ZS5saXN0RWxlbWVudHNbdF07aSYmaS5zZXRBdHRyaWJ1dGUobixyKX0sZ2V0QXR0cmlidXRlRm9yRWxlbWVudEluZGV4OmZ1bmN0aW9uKCl7cmV0dXJuXCJcIn0sYWRkQ2xhc3NGb3JFbGVtZW50SW5kZXg6ZnVuY3Rpb24odCxuKXt2YXIgcj1lLnN0YXRlLmxpc3RJdGVtQ2xhc3NOYW1lcztyW3RdJiYtMT09PXJbdF0uaW5kZXhPZihuKT9yW3RdLnB1c2gobik6clt0XT1bbl0sZS5zZXRTdGF0ZSh7bGlzdEl0ZW1DbGFzc05hbWVzOnJ9KX0scmVtb3ZlQ2xhc3NGb3JFbGVtZW50SW5kZXg6ZnVuY3Rpb24odCxuKXt2YXIgcj1lLnN0YXRlLmxpc3RJdGVtQ2xhc3NOYW1lcztpZihyW3RdKXt2YXIgaT1yW3RdLmluZGV4T2Yobik7LTEhPT1pJiYoclt0XS5zcGxpY2UoaSwxKSxlLnNldFN0YXRlKHtsaXN0SXRlbUNsYXNzTmFtZXM6cn0pKX19LHNldFRhYkluZGV4Rm9yTGlzdEl0ZW1DaGlsZHJlbjpmdW5jdGlvbih0LG4pe3ZhciByPWUubGlzdEVsZW1lbnRzW3RdLGk9dS5NRENMaXN0Rm91bmRhdGlvbi5zdHJpbmdzLkNISUxEX0VMRU1FTlRTX1RPX1RPR0dMRV9UQUJJTkRFWDtbXS5zbGljZS5jYWxsKHIucXVlcnlTZWxlY3RvckFsbChpKSkuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gZS5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLG4pfSl9LGZvY3VzSXRlbUF0SW5kZXg6ZnVuY3Rpb24odCl7dmFyIG49ZS5saXN0RWxlbWVudHNbdF07biYmbi5mb2N1cygpfSxzZXRDaGVja2VkQ2hlY2tib3hPclJhZGlvQXRJbmRleDpmdW5jdGlvbigpe30saGFzQ2hlY2tib3hBdEluZGV4OmZ1bmN0aW9uKHQpe3JldHVybiEhZS5saXN0RWxlbWVudHNbdF0ucXVlcnlTZWxlY3Rvcih1Lk1EQ0xpc3RGb3VuZGF0aW9uLnN0cmluZ3MuQ0hFQ0tCT1hfU0VMRUNUT1IpfSxoYXNSYWRpb0F0SW5kZXg6ZnVuY3Rpb24odCl7cmV0dXJuISFlLmxpc3RFbGVtZW50c1t0XS5xdWVyeVNlbGVjdG9yKHUuTURDTGlzdEZvdW5kYXRpb24uc3RyaW5ncy5SQURJT19TRUxFQ1RPUil9LGlzQ2hlY2tib3hDaGVja2VkQXRJbmRleDpmdW5jdGlvbih0KXt2YXIgbj1lLmxpc3RFbGVtZW50c1t0XSxyPXUuTURDTGlzdEZvdW5kYXRpb24uc3RyaW5ncy5DSEVDS0JPWF9TRUxFQ1RPUjtyZXR1cm4gbi5xdWVyeVNlbGVjdG9yKHIpLmNoZWNrZWR9LGlzRm9jdXNJbnNpZGVMaXN0OmZ1bmN0aW9uKCl7cmV0dXJuISFlLmxpc3RFbGVtZW50LmN1cnJlbnQmJmUubGlzdEVsZW1lbnQuY3VycmVudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KX0sbm90aWZ5QWN0aW9uOmZ1bmN0aW9uKHQpe2UucHJvcHMuaGFuZGxlU2VsZWN0KHQsZS5mb3VuZGF0aW9uLmdldFNlbGVjdGVkSW5kZXgoKSl9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsXCJyb2xlXCIse2dldDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLmNoZWNrYm94TGlzdCxuPWUucmFkaW9MaXN0LHI9ZS5yb2xlO3JldHVybiByfHwodD9cImdyb3VwXCI6bj9cInJhZGlvZ3JvdXBcIjpudWxsKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxuLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLG49KGUuY2xhc3NOYW1lLGUuY2hlY2tib3hMaXN0KSxyPWUucmFkaW9MaXN0LGk9KGUubm9uSW50ZXJhY3RpdmUsZS5kZW5zZSxlLmF2YXRhckxpc3QsZS50d29MaW5lLGUuc2luZ2xlU2VsZWN0aW9uLGUucm9sZSxlLnNlbGVjdGVkSW5kZXgsZS5oYW5kbGVTZWxlY3QsZS53cmFwRm9jdXMsZS5jaGlsZHJlbiksYT1lLnRhZyxjPXMoZSxbXCJjbGFzc05hbWVcIixcImNoZWNrYm94TGlzdFwiLFwicmFkaW9MaXN0XCIsXCJub25JbnRlcmFjdGl2ZVwiLFwiZGVuc2VcIixcImF2YXRhckxpc3RcIixcInR3b0xpbmVcIixcInNpbmdsZVNlbGVjdGlvblwiLFwicm9sZVwiLFwic2VsZWN0ZWRJbmRleFwiLFwiaGFuZGxlU2VsZWN0XCIsXCJ3cmFwRm9jdXNcIixcImNoaWxkcmVuXCIsXCJ0YWdcIl0pO3JldHVybiBsLmRlZmF1bHQuY3JlYXRlRWxlbWVudChhLG8oe2NsYXNzTmFtZTp0aGlzLmNsYXNzZXMscmVmOnRoaXMubGlzdEVsZW1lbnQscm9sZTp0aGlzLnJvbGV9LGMpLGwuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHQuTGlzdEl0ZW1Db250ZXh0LlByb3ZpZGVyLHt2YWx1ZTp0aGlzLmdldExpc3RQcm9wc01lbW9pemVkKG4scil9LGkpKX0sbi5kZWZhdWx0UHJvcHM9e2NsYXNzTmFtZTpcIlwiLGNoZWNrYm94TGlzdDohMSxyYWRpb0xpc3Q6ITEsbm9uSW50ZXJhY3RpdmU6ITEsZGVuc2U6ITEsYXZhdGFyTGlzdDohMSx0d29MaW5lOiExLHNpbmdsZVNlbGVjdGlvbjohMSxzZWxlY3RlZEluZGV4Oi0xLGhhbmRsZVNlbGVjdDpmdW5jdGlvbigpe30sd3JhcEZvY3VzOiEwLFwiYXJpYS1vcmllbnRhdGlvblwiOlwidmVydGljYWxcIix0YWc6XCJ1bFwifSxufShsLmRlZmF1bHQuQ29tcG9uZW50KTt0LmRlZmF1bHQ9eH0sNDI6ZnVuY3Rpb24oZSx0LG4pe1widXNlIHN0cmljdFwiO24ucih0KTtcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvcjtcbi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXG5MaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG5LSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVEXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cblxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL3ZhciByPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKHI9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKGUsdCl7ZS5fX3Byb3RvX189dH18fGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmKGVbbl09dFtuXSl9KShlLHQpfTt2YXIgaT1mdW5jdGlvbigpe3JldHVybihpPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPTEscj1hcmd1bWVudHMubGVuZ3RoO248cjtuKyspZm9yKHZhciBpIGluIHQ9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGkpJiYoZVtpXT10W2ldKTtyZXR1cm4gZX0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cbnZhciBvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT17fSksdGhpcy5hZGFwdGVyXz1lfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzdHJpbmdzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwibnVtYmVyc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt9LGV9KCkscz17TElTVF9JVEVNX0FDVElWQVRFRF9DTEFTUzpcIm1kYy1saXN0LWl0ZW0tLWFjdGl2YXRlZFwiLExJU1RfSVRFTV9DTEFTUzpcIm1kYy1saXN0LWl0ZW1cIixMSVNUX0lURU1fU0VMRUNURURfQ0xBU1M6XCJtZGMtbGlzdC1pdGVtLS1zZWxlY3RlZFwiLFJPT1Q6XCJtZGMtbGlzdFwifSxhPXtBQ1RJT05fRVZFTlQ6XCJNRENMaXN0OmFjdGlvblwiLEFSSUFfQ0hFQ0tFRDpcImFyaWEtY2hlY2tlZFwiLEFSSUFfQ0hFQ0tFRF9DSEVDS0JPWF9TRUxFQ1RPUjonW3JvbGU9XCJjaGVja2JveFwiXVthcmlhLWNoZWNrZWQ9XCJ0cnVlXCJdJyxBUklBX0NIRUNLRURfUkFESU9fU0VMRUNUT1I6J1tyb2xlPVwicmFkaW9cIl1bYXJpYS1jaGVja2VkPVwidHJ1ZVwiXScsQVJJQV9DVVJSRU5UOlwiYXJpYS1jdXJyZW50XCIsQVJJQV9PUklFTlRBVElPTjpcImFyaWEtb3JpZW50YXRpb25cIixBUklBX09SSUVOVEFUSU9OX0hPUklaT05UQUw6XCJob3Jpem9udGFsXCIsQVJJQV9ST0xFX0NIRUNLQk9YX1NFTEVDVE9SOidbcm9sZT1cImNoZWNrYm94XCJdJyxBUklBX1NFTEVDVEVEOlwiYXJpYS1zZWxlY3RlZFwiLENIRUNLQk9YX1JBRElPX1NFTEVDVE9SOidpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06bm90KDpkaXNhYmxlZCksIGlucHV0W3R5cGU9XCJyYWRpb1wiXTpub3QoOmRpc2FibGVkKScsQ0hFQ0tCT1hfU0VMRUNUT1I6J2lucHV0W3R5cGU9XCJjaGVja2JveFwiXTpub3QoOmRpc2FibGVkKScsQ0hJTERfRUxFTUVOVFNfVE9fVE9HR0xFX1RBQklOREVYOlwiXFxuICAgIC5cIitzLkxJU1RfSVRFTV9DTEFTUytcIiBidXR0b246bm90KDpkaXNhYmxlZCksXFxuICAgIC5cIitzLkxJU1RfSVRFTV9DTEFTUytcIiBhXFxuICBcIixFTkFCTEVEX0lURU1TX1NFTEVDVE9SOlwiLm1kYy1saXN0LWl0ZW06bm90KC5tZGMtbGlzdC1pdGVtLS1kaXNhYmxlZClcIixGT0NVU0FCTEVfQ0hJTERfRUxFTUVOVFM6XCJcXG4gICAgLlwiK3MuTElTVF9JVEVNX0NMQVNTK1wiIGJ1dHRvbjpub3QoOmRpc2FibGVkKSxcXG4gICAgLlwiK3MuTElTVF9JVEVNX0NMQVNTK1wiIGEsXFxuICAgIC5cIitzLkxJU1RfSVRFTV9DTEFTUysnIGlucHV0W3R5cGU9XCJyYWRpb1wiXTpub3QoOmRpc2FibGVkKSxcXG4gICAgLicrcy5MSVNUX0lURU1fQ0xBU1MrJyBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06bm90KDpkaXNhYmxlZClcXG4gICcsUkFESU9fU0VMRUNUT1I6J2lucHV0W3R5cGU9XCJyYWRpb1wiXTpub3QoOmRpc2FibGVkKSd9LGw9e1VOU0VUX0lOREVYOi0xfTtuLmQodCxcIk1EQ0xpc3RGb3VuZGF0aW9uXCIsZnVuY3Rpb24oKXtyZXR1cm4gdX0pO1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG52YXIgYz1bXCJpbnB1dFwiLFwiYnV0dG9uXCIsXCJ0ZXh0YXJlYVwiLFwic2VsZWN0XCJdO3ZhciB1PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobil7dmFyIHI9ZS5jYWxsKHRoaXMsaSh7fSx0LmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpcztyZXR1cm4gci53cmFwRm9jdXNfPSExLHIuaXNWZXJ0aWNhbF89ITAsci5pc1NpbmdsZVNlbGVjdGlvbkxpc3RfPSExLHIuc2VsZWN0ZWRJbmRleF89bC5VTlNFVF9JTkRFWCxyLmZvY3VzZWRJdGVtSW5kZXhfPWwuVU5TRVRfSU5ERVgsci51c2VBY3RpdmF0ZWRDbGFzc189ITEsci5hcmlhQ3VycmVudEF0dHJWYWx1ZV89bnVsbCxyLmlzQ2hlY2tib3hMaXN0Xz0hMSxyLmlzUmFkaW9MaXN0Xz0hMSxyfXJldHVybiBmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPWV9cihlLHQpLGUucHJvdG90eXBlPW51bGw9PT10P09iamVjdC5jcmVhdGUodCk6KG4ucHJvdG90eXBlPXQucHJvdG90eXBlLG5ldyBuKX0odCxlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcInN0cmluZ3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJjc3NDbGFzc2VzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwibnVtYmVyc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybnthZGRDbGFzc0ZvckVsZW1lbnRJbmRleDpmdW5jdGlvbigpe30sZm9jdXNJdGVtQXRJbmRleDpmdW5jdGlvbigpe30sZ2V0QXR0cmlidXRlRm9yRWxlbWVudEluZGV4OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGdldEZvY3VzZWRFbGVtZW50SW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sZ2V0TGlzdEl0ZW1Db3VudDpmdW5jdGlvbigpe3JldHVybiAwfSxoYXNDaGVja2JveEF0SW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saGFzUmFkaW9BdEluZGV4OmZ1bmN0aW9uKCl7cmV0dXJuITF9LGlzQ2hlY2tib3hDaGVja2VkQXRJbmRleDpmdW5jdGlvbigpe3JldHVybiExfSxpc0ZvY3VzSW5zaWRlTGlzdDpmdW5jdGlvbigpe3JldHVybiExfSxub3RpZnlBY3Rpb246ZnVuY3Rpb24oKXt9LHJlbW92ZUNsYXNzRm9yRWxlbWVudEluZGV4OmZ1bmN0aW9uKCl7fSxzZXRBdHRyaWJ1dGVGb3JFbGVtZW50SW5kZXg6ZnVuY3Rpb24oKXt9LHNldENoZWNrZWRDaGVja2JveE9yUmFkaW9BdEluZGV4OmZ1bmN0aW9uKCl7fSxzZXRUYWJJbmRleEZvckxpc3RJdGVtQ2hpbGRyZW46ZnVuY3Rpb24oKXt9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5sYXlvdXQ9ZnVuY3Rpb24oKXswIT09dGhpcy5hZGFwdGVyXy5nZXRMaXN0SXRlbUNvdW50KCkmJih0aGlzLmFkYXB0ZXJfLmhhc0NoZWNrYm94QXRJbmRleCgwKT90aGlzLmlzQ2hlY2tib3hMaXN0Xz0hMDp0aGlzLmFkYXB0ZXJfLmhhc1JhZGlvQXRJbmRleCgwKSYmKHRoaXMuaXNSYWRpb0xpc3RfPSEwKSl9LHQucHJvdG90eXBlLnNldFdyYXBGb2N1cz1mdW5jdGlvbihlKXt0aGlzLndyYXBGb2N1c189ZX0sdC5wcm90b3R5cGUuc2V0VmVydGljYWxPcmllbnRhdGlvbj1mdW5jdGlvbihlKXt0aGlzLmlzVmVydGljYWxfPWV9LHQucHJvdG90eXBlLnNldFNpbmdsZVNlbGVjdGlvbj1mdW5jdGlvbihlKXt0aGlzLmlzU2luZ2xlU2VsZWN0aW9uTGlzdF89ZX0sdC5wcm90b3R5cGUuc2V0VXNlQWN0aXZhdGVkQ2xhc3M9ZnVuY3Rpb24oZSl7dGhpcy51c2VBY3RpdmF0ZWRDbGFzc189ZX0sdC5wcm90b3R5cGUuZ2V0U2VsZWN0ZWRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGVkSW5kZXhffSx0LnByb3RvdHlwZS5zZXRTZWxlY3RlZEluZGV4PWZ1bmN0aW9uKGUpe3RoaXMuaXNJbmRleFZhbGlkXyhlKSYmKHRoaXMuaXNDaGVja2JveExpc3RfP3RoaXMuc2V0Q2hlY2tib3hBdEluZGV4XyhlKTp0aGlzLmlzUmFkaW9MaXN0Xz90aGlzLnNldFJhZGlvQXRJbmRleF8oZSk6dGhpcy5zZXRTaW5nbGVTZWxlY3Rpb25BdEluZGV4XyhlKSl9LHQucHJvdG90eXBlLmhhbmRsZUZvY3VzSW49ZnVuY3Rpb24oZSx0KXt0Pj0wJiZ0aGlzLmFkYXB0ZXJfLnNldFRhYkluZGV4Rm9yTGlzdEl0ZW1DaGlsZHJlbih0LFwiMFwiKX0sdC5wcm90b3R5cGUuaGFuZGxlRm9jdXNPdXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3Q+PTAmJnRoaXMuYWRhcHRlcl8uc2V0VGFiSW5kZXhGb3JMaXN0SXRlbUNoaWxkcmVuKHQsXCItMVwiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5hZGFwdGVyXy5pc0ZvY3VzSW5zaWRlTGlzdCgpfHxuLnNldFRhYmluZGV4VG9GaXJzdFNlbGVjdGVkSXRlbV8oKX0sMCl9LHQucHJvdG90eXBlLmhhbmRsZUtleWRvd249ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVwiQXJyb3dMZWZ0XCI9PT1lLmtleXx8Mzc9PT1lLmtleUNvZGUsaT1cIkFycm93VXBcIj09PWUua2V5fHwzOD09PWUua2V5Q29kZSxvPVwiQXJyb3dSaWdodFwiPT09ZS5rZXl8fDM5PT09ZS5rZXlDb2RlLHM9XCJBcnJvd0Rvd25cIj09PWUua2V5fHw0MD09PWUua2V5Q29kZSxhPVwiSG9tZVwiPT09ZS5rZXl8fDM2PT09ZS5rZXlDb2RlLGM9XCJFbmRcIj09PWUua2V5fHwzNT09PWUua2V5Q29kZSx1PVwiRW50ZXJcIj09PWUua2V5fHwxMz09PWUua2V5Q29kZSxkPVwiU3BhY2VcIj09PWUua2V5fHwzMj09PWUua2V5Q29kZSxmPXRoaXMuYWRhcHRlcl8uZ2V0Rm9jdXNlZEVsZW1lbnRJbmRleCgpLHA9bC5VTlNFVF9JTkRFWDtpZighKGY9PT1sLlVOU0VUX0lOREVYJiYoZj1uKTwwKSl7aWYodGhpcy5pc1ZlcnRpY2FsXyYmc3x8IXRoaXMuaXNWZXJ0aWNhbF8mJm8pdGhpcy5wcmV2ZW50RGVmYXVsdEV2ZW50XyhlKSxwPXRoaXMuZm9jdXNOZXh0RWxlbWVudChmKTtlbHNlIGlmKHRoaXMuaXNWZXJ0aWNhbF8mJml8fCF0aGlzLmlzVmVydGljYWxfJiZyKXRoaXMucHJldmVudERlZmF1bHRFdmVudF8oZSkscD10aGlzLmZvY3VzUHJldkVsZW1lbnQoZik7ZWxzZSBpZihhKXRoaXMucHJldmVudERlZmF1bHRFdmVudF8oZSkscD10aGlzLmZvY3VzRmlyc3RFbGVtZW50KCk7ZWxzZSBpZihjKXRoaXMucHJldmVudERlZmF1bHRFdmVudF8oZSkscD10aGlzLmZvY3VzTGFzdEVsZW1lbnQoKTtlbHNlIGlmKCh1fHxkKSYmdCl7dmFyIGg9ZS50YXJnZXQ7aWYoaCYmXCJBXCI9PT1oLnRhZ05hbWUmJnUpcmV0dXJuO3RoaXMucHJldmVudERlZmF1bHRFdmVudF8oZSksdGhpcy5pc1NlbGVjdGFibGVMaXN0XygpJiZ0aGlzLnNldFNlbGVjdGVkSW5kZXhPbkFjdGlvbl8oZiksdGhpcy5hZGFwdGVyXy5ub3RpZnlBY3Rpb24oZil9dGhpcy5mb2N1c2VkSXRlbUluZGV4Xz1mLHA+PTAmJih0aGlzLnNldFRhYmluZGV4QXRJbmRleF8ocCksdGhpcy5mb2N1c2VkSXRlbUluZGV4Xz1wKX19LHQucHJvdG90eXBlLmhhbmRsZUNsaWNrPWZ1bmN0aW9uKGUsdCl7ZSE9PWwuVU5TRVRfSU5ERVgmJih0aGlzLmlzU2VsZWN0YWJsZUxpc3RfKCkmJnRoaXMuc2V0U2VsZWN0ZWRJbmRleE9uQWN0aW9uXyhlLHQpLHRoaXMuYWRhcHRlcl8ubm90aWZ5QWN0aW9uKGUpLHRoaXMuc2V0VGFiaW5kZXhBdEluZGV4XyhlKSx0aGlzLmZvY3VzZWRJdGVtSW5kZXhfPWUpfSx0LnByb3RvdHlwZS5mb2N1c05leHRFbGVtZW50PWZ1bmN0aW9uKGUpe3ZhciB0PWUrMTtpZih0Pj10aGlzLmFkYXB0ZXJfLmdldExpc3RJdGVtQ291bnQoKSl7aWYoIXRoaXMud3JhcEZvY3VzXylyZXR1cm4gZTt0PTB9cmV0dXJuIHRoaXMuYWRhcHRlcl8uZm9jdXNJdGVtQXRJbmRleCh0KSx0fSx0LnByb3RvdHlwZS5mb2N1c1ByZXZFbGVtZW50PWZ1bmN0aW9uKGUpe3ZhciB0PWUtMTtpZih0PDApe2lmKCF0aGlzLndyYXBGb2N1c18pcmV0dXJuIGU7dD10aGlzLmFkYXB0ZXJfLmdldExpc3RJdGVtQ291bnQoKS0xfXJldHVybiB0aGlzLmFkYXB0ZXJfLmZvY3VzSXRlbUF0SW5kZXgodCksdH0sdC5wcm90b3R5cGUuZm9jdXNGaXJzdEVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZGFwdGVyXy5mb2N1c0l0ZW1BdEluZGV4KDApLDB9LHQucHJvdG90eXBlLmZvY3VzTGFzdEVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmFkYXB0ZXJfLmdldExpc3RJdGVtQ291bnQoKS0xO3JldHVybiB0aGlzLmFkYXB0ZXJfLmZvY3VzSXRlbUF0SW5kZXgoZSksZX0sdC5wcm90b3R5cGUucHJldmVudERlZmF1bHRFdmVudF89ZnVuY3Rpb24oZSl7dmFyIHQ9KFwiXCIrZS50YXJnZXQudGFnTmFtZSkudG9Mb3dlckNhc2UoKTstMT09PWMuaW5kZXhPZih0KSYmZS5wcmV2ZW50RGVmYXVsdCgpfSx0LnByb3RvdHlwZS5zZXRTaW5nbGVTZWxlY3Rpb25BdEluZGV4Xz1mdW5jdGlvbihlKXtpZih0aGlzLnNlbGVjdGVkSW5kZXhfIT09ZSl7dmFyIHQ9cy5MSVNUX0lURU1fU0VMRUNURURfQ0xBU1M7dGhpcy51c2VBY3RpdmF0ZWRDbGFzc18mJih0PXMuTElTVF9JVEVNX0FDVElWQVRFRF9DTEFTUyksdGhpcy5zZWxlY3RlZEluZGV4XyE9PWwuVU5TRVRfSU5ERVgmJnRoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3NGb3JFbGVtZW50SW5kZXgodGhpcy5zZWxlY3RlZEluZGV4Xyx0KSx0aGlzLmFkYXB0ZXJfLmFkZENsYXNzRm9yRWxlbWVudEluZGV4KGUsdCksdGhpcy5zZXRBcmlhRm9yU2luZ2xlU2VsZWN0aW9uQXRJbmRleF8oZSksdGhpcy5zZWxlY3RlZEluZGV4Xz1lfX0sdC5wcm90b3R5cGUuc2V0QXJpYUZvclNpbmdsZVNlbGVjdGlvbkF0SW5kZXhfPWZ1bmN0aW9uKGUpe3RoaXMuc2VsZWN0ZWRJbmRleF89PT1sLlVOU0VUX0lOREVYJiYodGhpcy5hcmlhQ3VycmVudEF0dHJWYWx1ZV89dGhpcy5hZGFwdGVyXy5nZXRBdHRyaWJ1dGVGb3JFbGVtZW50SW5kZXgoZSxhLkFSSUFfQ1VSUkVOVCkpO3ZhciB0PW51bGwhPT10aGlzLmFyaWFDdXJyZW50QXR0clZhbHVlXyxuPXQ/YS5BUklBX0NVUlJFTlQ6YS5BUklBX1NFTEVDVEVEO3RoaXMuc2VsZWN0ZWRJbmRleF8hPT1sLlVOU0VUX0lOREVYJiZ0aGlzLmFkYXB0ZXJfLnNldEF0dHJpYnV0ZUZvckVsZW1lbnRJbmRleCh0aGlzLnNlbGVjdGVkSW5kZXhfLG4sXCJmYWxzZVwiKTt2YXIgcj10P3RoaXMuYXJpYUN1cnJlbnRBdHRyVmFsdWVfOlwidHJ1ZVwiO3RoaXMuYWRhcHRlcl8uc2V0QXR0cmlidXRlRm9yRWxlbWVudEluZGV4KGUsbixyKX0sdC5wcm90b3R5cGUuc2V0UmFkaW9BdEluZGV4Xz1mdW5jdGlvbihlKXt0aGlzLmFkYXB0ZXJfLnNldENoZWNrZWRDaGVja2JveE9yUmFkaW9BdEluZGV4KGUsITApLHRoaXMuc2VsZWN0ZWRJbmRleF8hPT1sLlVOU0VUX0lOREVYJiZ0aGlzLmFkYXB0ZXJfLnNldEF0dHJpYnV0ZUZvckVsZW1lbnRJbmRleCh0aGlzLnNlbGVjdGVkSW5kZXhfLGEuQVJJQV9DSEVDS0VELFwiZmFsc2VcIiksdGhpcy5hZGFwdGVyXy5zZXRBdHRyaWJ1dGVGb3JFbGVtZW50SW5kZXgoZSxhLkFSSUFfQ0hFQ0tFRCxcInRydWVcIiksdGhpcy5zZWxlY3RlZEluZGV4Xz1lfSx0LnByb3RvdHlwZS5zZXRDaGVja2JveEF0SW5kZXhfPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8dGhpcy5hZGFwdGVyXy5nZXRMaXN0SXRlbUNvdW50KCk7dCsrKXt2YXIgbj0hMTtlLmluZGV4T2YodCk+PTAmJihuPSEwKSx0aGlzLmFkYXB0ZXJfLnNldENoZWNrZWRDaGVja2JveE9yUmFkaW9BdEluZGV4KHQsbiksdGhpcy5hZGFwdGVyXy5zZXRBdHRyaWJ1dGVGb3JFbGVtZW50SW5kZXgodCxhLkFSSUFfQ0hFQ0tFRCxuP1widHJ1ZVwiOlwiZmFsc2VcIil9dGhpcy5zZWxlY3RlZEluZGV4Xz1lfSx0LnByb3RvdHlwZS5zZXRUYWJpbmRleEF0SW5kZXhfPWZ1bmN0aW9uKGUpe3RoaXMuZm9jdXNlZEl0ZW1JbmRleF89PT1sLlVOU0VUX0lOREVYJiYwIT09ZT90aGlzLmFkYXB0ZXJfLnNldEF0dHJpYnV0ZUZvckVsZW1lbnRJbmRleCgwLFwidGFiaW5kZXhcIixcIi0xXCIpOnRoaXMuZm9jdXNlZEl0ZW1JbmRleF8+PTAmJnRoaXMuZm9jdXNlZEl0ZW1JbmRleF8hPT1lJiZ0aGlzLmFkYXB0ZXJfLnNldEF0dHJpYnV0ZUZvckVsZW1lbnRJbmRleCh0aGlzLmZvY3VzZWRJdGVtSW5kZXhfLFwidGFiaW5kZXhcIixcIi0xXCIpLHRoaXMuYWRhcHRlcl8uc2V0QXR0cmlidXRlRm9yRWxlbWVudEluZGV4KGUsXCJ0YWJpbmRleFwiLFwiMFwiKX0sdC5wcm90b3R5cGUuaXNTZWxlY3RhYmxlTGlzdF89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc1NpbmdsZVNlbGVjdGlvbkxpc3RffHx0aGlzLmlzQ2hlY2tib3hMaXN0X3x8dGhpcy5pc1JhZGlvTGlzdF99LHQucHJvdG90eXBlLnNldFRhYmluZGV4VG9GaXJzdFNlbGVjdGVkSXRlbV89ZnVuY3Rpb24oKXt2YXIgZT0wO3RoaXMuaXNTZWxlY3RhYmxlTGlzdF8oKSYmKFwibnVtYmVyXCI9PXR5cGVvZiB0aGlzLnNlbGVjdGVkSW5kZXhfJiZ0aGlzLnNlbGVjdGVkSW5kZXhfIT09bC5VTlNFVF9JTkRFWD9lPXRoaXMuc2VsZWN0ZWRJbmRleF86dGhpcy5zZWxlY3RlZEluZGV4XyBpbnN0YW5jZW9mIEFycmF5JiZ0aGlzLnNlbGVjdGVkSW5kZXhfLmxlbmd0aD4wJiYoZT10aGlzLnNlbGVjdGVkSW5kZXhfLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBNYXRoLm1pbihlLHQpfSkpKSx0aGlzLnNldFRhYmluZGV4QXRJbmRleF8oZSl9LHQucHJvdG90eXBlLmlzSW5kZXhWYWxpZF89ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZihlIGluc3RhbmNlb2YgQXJyYXkpe2lmKCF0aGlzLmlzQ2hlY2tib3hMaXN0Xyl0aHJvdyBuZXcgRXJyb3IoXCJNRENMaXN0Rm91bmRhdGlvbjogQXJyYXkgb2YgaW5kZXggaXMgb25seSBzdXBwb3J0ZWQgZm9yIGNoZWNrYm94IGJhc2VkIGxpc3RcIik7cmV0dXJuIDA9PT1lLmxlbmd0aHx8ZS5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiB0LmlzSW5kZXhJblJhbmdlXyhlKX0pfWlmKFwibnVtYmVyXCI9PXR5cGVvZiBlKXtpZih0aGlzLmlzQ2hlY2tib3hMaXN0Xyl0aHJvdyBuZXcgRXJyb3IoXCJNRENMaXN0Rm91bmRhdGlvbjogRXhwZWN0ZWQgYXJyYXkgb2YgaW5kZXggZm9yIGNoZWNrYm94IGJhc2VkIGxpc3QgYnV0IGdvdCBudW1iZXI6IFwiK2UpO3JldHVybiB0aGlzLmlzSW5kZXhJblJhbmdlXyhlKX1yZXR1cm4hMX0sdC5wcm90b3R5cGUuaXNJbmRleEluUmFuZ2VfPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuYWRhcHRlcl8uZ2V0TGlzdEl0ZW1Db3VudCgpO3JldHVybiBlPj0wJiZlPHR9LHQucHJvdG90eXBlLnNldFNlbGVjdGVkSW5kZXhPbkFjdGlvbl89ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT10JiYodD0hMCksdGhpcy5pc0NoZWNrYm94TGlzdF8/dGhpcy50b2dnbGVDaGVja2JveEF0SW5kZXhfKGUsdCk6dGhpcy5zZXRTZWxlY3RlZEluZGV4KGUpfSx0LnByb3RvdHlwZS50b2dnbGVDaGVja2JveEF0SW5kZXhfPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5hZGFwdGVyXy5pc0NoZWNrYm94Q2hlY2tlZEF0SW5kZXgoZSk7dCYmKG49IW4sdGhpcy5hZGFwdGVyXy5zZXRDaGVja2VkQ2hlY2tib3hPclJhZGlvQXRJbmRleChlLG4pKSx0aGlzLmFkYXB0ZXJfLnNldEF0dHJpYnV0ZUZvckVsZW1lbnRJbmRleChlLGEuQVJJQV9DSEVDS0VELG4/XCJ0cnVlXCI6XCJmYWxzZVwiKTt2YXIgcj10aGlzLnNlbGVjdGVkSW5kZXhfPT09bC5VTlNFVF9JTkRFWD9bXTp0aGlzLnNlbGVjdGVkSW5kZXhfLnNsaWNlKCk7bj9yLnB1c2goZSk6cj1yLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdCE9PWV9KSx0aGlzLnNlbGVjdGVkSW5kZXhfPXJ9LHR9KG8pO3QuZGVmYXVsdD11fSw1OmZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPW59LDg4OmZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiByKGUsdCl7aWYoZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZihlW25dIT09dFtuXSlyZXR1cm4hMTtyZXR1cm4hMH1lLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbjt2b2lkIDA9PT10JiYodD1yKTt2YXIgaSxvPVtdLHM9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciByPWFyZ3VtZW50cy5sZW5ndGgsYT1uZXcgQXJyYXkociksbD0wO2w8cjtsKyspYVtsXT1hcmd1bWVudHNbbF07cmV0dXJuIHMmJm49PT10aGlzJiZ0KGEsbyk/aTooaT1lLmFwcGx5KHRoaXMsYSkscz0hMCxuPXRoaXMsbz1hLGkpfX19LDg5OmZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcixpPXRoaXMmJnRoaXMuX19leHRlbmRzfHwocj1mdW5jdGlvbihlLHQpe3JldHVybihyPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihlLHQpe2UuX19wcm90b19fPXR9fHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJihlW25dPXRbbl0pfSkoZSx0KX0sZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfXIoZSx0KSxlLnByb3RvdHlwZT1udWxsPT09dD9PYmplY3QuY3JlYXRlKHQpOihuLnByb3RvdHlwZT10LnByb3RvdHlwZSxuZXcgbil9KSxvPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKG89T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rKylmb3IodmFyIGkgaW4gdD1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsaSkmJihlW2ldPXRbaV0pO3JldHVybiBlfSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxzPXRoaXMmJnRoaXMuX19yZXN0fHxmdW5jdGlvbihlLHQpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiZ0LmluZGV4T2Yocik8MCYmKG5bcl09ZVtyXSk7aWYobnVsbCE9ZSYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGk9MDtmb3Iocj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO2k8ci5sZW5ndGg7aSsrKXQuaW5kZXhPZihyW2ldKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyW2ldKSYmKG5bcltpXV09ZVtyW2ldXSl9cmV0dXJuIG59LGE9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIGw9YShuKDApKSxjPWEobigxKSksdT1uKDkwKSxkPW4oNSksZj1uKDQyKSxwPW4oNDEpLGg9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3ZhciB0PW51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gdC5saXN0SXRlbUVsZW1lbnQ9bC5kZWZhdWx0LmNyZWF0ZVJlZigpLHQuc3RhdGU9e3RhYkluZGV4OnQucHJvcHMudGFiSW5kZXh9LHQuaW5pdGlhbGl6ZVRhYkluZGV4PWZ1bmN0aW9uKCl7aWYodC5saXN0SXRlbUVsZW1lbnQuY3VycmVudCl7dmFyIGU9dC5nZXRJbmRleCh0Lmxpc3RJdGVtRWxlbWVudC5jdXJyZW50KSxuPXQucHJvcHMuZ2V0TGlzdEl0ZW1Jbml0aWFsVGFiSW5kZXgoZSk7dC5zZXRTdGF0ZSh7dGFiSW5kZXg6bn0pfX0sdC5nZXRJbmRleD1mdW5jdGlvbihlKXtyZXR1cm4gdC5saXN0RWxlbWVudHMuaW5kZXhPZihlKX0sdC5oYW5kbGVDbGljaz1mdW5jdGlvbihlKXsoMCx0LnByb3BzLm9uQ2xpY2spKGUpLHQucHJvcHMuaGFuZGxlQ2xpY2soZSx0LmdldEluZGV4KGUuY3VycmVudFRhcmdldCkpfSx0LmhhbmRsZUtleURvd249ZnVuY3Rpb24oZSl7KDAsdC5wcm9wcy5vbktleURvd24pKGUpLHQucHJvcHMuaGFuZGxlS2V5RG93bihlLHQuZ2V0SW5kZXgoZS5jdXJyZW50VGFyZ2V0KSl9LHQuaGFuZGxlRm9jdXM9ZnVuY3Rpb24oZSl7KDAsdC5wcm9wcy5vbkZvY3VzKShlKSx0LnByb3BzLmhhbmRsZUZvY3VzKGUsdC5nZXRJbmRleChlLmN1cnJlbnRUYXJnZXQpKX0sdC5oYW5kbGVCbHVyPWZ1bmN0aW9uKGUpeygwLHQucHJvcHMub25CbHVyKShlKSx0LnByb3BzLmhhbmRsZUJsdXIoZSx0LmdldEluZGV4KGUuY3VycmVudFRhcmdldCkpfSx0fXJldHVybiBpKHQsZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwibGlzdEVsZW1lbnRzXCIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMubGlzdEl0ZW1FbGVtZW50LmN1cnJlbnQpe3ZhciBlPXUuY2xvc2VzdCh0aGlzLmxpc3RJdGVtRWxlbWVudC5jdXJyZW50LFwiLlwiK2YuTURDTGlzdEZvdW5kYXRpb24uY3NzQ2xhc3Nlcy5ST09UKTtyZXR1cm4gZT9bXS5zbGljZS5jYWxsKGUucXVlcnlTZWxlY3RvckFsbChmLk1EQ0xpc3RGb3VuZGF0aW9uLnN0cmluZ3MuRU5BQkxFRF9JVEVNU19TRUxFQ1RPUikpOltdfXJldHVybltdfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dGhpcy5pbml0aWFsaXplVGFiSW5kZXgoKSx0aGlzLnByb3BzLmluaXRSaXBwbGUmJnRoaXMucHJvcHMuaW5pdFJpcHBsZSh0aGlzLmxpc3RJdGVtRWxlbWVudC5jdXJyZW50KX0sdC5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPWZ1bmN0aW9uKGUpe2UudGFiSW5kZXghPT10aGlzLnByb3BzLnRhYkluZGV4JiZ0aGlzLnNldFN0YXRlKHt0YWJJbmRleDp0aGlzLnByb3BzLnRhYkluZGV4fSl9LHQucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7aWYodGhpcy5saXN0SXRlbUVsZW1lbnQuY3VycmVudCl7dmFyIGU9dGhpcy5nZXRJbmRleCh0aGlzLmxpc3RJdGVtRWxlbWVudC5jdXJyZW50KTt0aGlzLnByb3BzLm9uRGVzdHJveShlKX19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcImNsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLnByb3BzLG49dC5jbGFzc05hbWUscj10LmFjdGl2YXRlZCxpPXQuZGlzYWJsZWQsbz10LnNlbGVjdGVkLHM9dC5nZXRDbGFzc05hbWVzRnJvbUxpc3QsYT1bXCJcIl07aWYodGhpcy5saXN0SXRlbUVsZW1lbnQuY3VycmVudCl7dmFyIGw9dGhpcy5nZXRJbmRleCh0aGlzLmxpc3RJdGVtRWxlbWVudC5jdXJyZW50KTthPXMoKVtsXX1yZXR1cm4gYy5kZWZhdWx0KFwibWRjLWxpc3QtaXRlbVwiLG4sYSwoKGU9e30pW2YuTURDTGlzdEZvdW5kYXRpb24uY3NzQ2xhc3Nlcy5MSVNUX0lURU1fQUNUSVZBVEVEX0NMQVNTXT1yLGVbZi5NRENMaXN0Rm91bmRhdGlvbi5jc3NDbGFzc2VzLkxJU1RfSVRFTV9TRUxFQ1RFRF9DTEFTU109byxlW1wibWRjLWxpc3QtaXRlbS0tZGlzYWJsZWRcIl09aSxlKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwicm9sZVwiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHQ9ZS5jaGVja2JveExpc3Qsbj1lLnJhZGlvTGlzdCxyPWUucm9sZTtyZXR1cm4gcnx8KHQ/XCJjaGVja2JveFwiOm4/XCJyYWRpb1wiOm51bGwpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD0oZS5jbGFzc05hbWUsZS5jaGlsZHJlbiksbj0oZS5yb2xlLGUuaW5pdFJpcHBsZSxlLmNoZWNrYm94TGlzdCxlLnJhZGlvTGlzdCxlLm9uRGVzdHJveSxlLm9uQ2xpY2ssZS5vbktleURvd24sZS5vbkZvY3VzLGUub25CbHVyLGUuaGFuZGxlQ2xpY2ssZS5oYW5kbGVLZXlEb3duLGUuaGFuZGxlRm9jdXMsZS5oYW5kbGVCbHVyLGUuZ2V0TGlzdEl0ZW1Jbml0aWFsVGFiSW5kZXgsZS5nZXRDbGFzc05hbWVzRnJvbUxpc3QsZS50YWJJbmRleCxlLnRhZykscj1zKGUsW1wiY2xhc3NOYW1lXCIsXCJjaGlsZHJlblwiLFwicm9sZVwiLFwiaW5pdFJpcHBsZVwiLFwiY2hlY2tib3hMaXN0XCIsXCJyYWRpb0xpc3RcIixcIm9uRGVzdHJveVwiLFwib25DbGlja1wiLFwib25LZXlEb3duXCIsXCJvbkZvY3VzXCIsXCJvbkJsdXJcIixcImhhbmRsZUNsaWNrXCIsXCJoYW5kbGVLZXlEb3duXCIsXCJoYW5kbGVGb2N1c1wiLFwiaGFuZGxlQmx1clwiLFwiZ2V0TGlzdEl0ZW1Jbml0aWFsVGFiSW5kZXhcIixcImdldENsYXNzTmFtZXNGcm9tTGlzdFwiLFwidGFiSW5kZXhcIixcInRhZ1wiXSk7cmV0dXJuIGwuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG4sbyh7fSxyLHRoaXMuY29udGV4dCx7cm9sZTp0aGlzLnJvbGUsY2xhc3NOYW1lOnRoaXMuY2xhc3NlcyxyZWY6dGhpcy5saXN0SXRlbUVsZW1lbnQsb25DbGljazp0aGlzLmhhbmRsZUNsaWNrLG9uS2V5RG93bjp0aGlzLmhhbmRsZUtleURvd24sb25Gb2N1czp0aGlzLmhhbmRsZUZvY3VzLG9uQmx1cjp0aGlzLmhhbmRsZUJsdXIsdGFiSW5kZXg6dGhpcy5zdGF0ZS50YWJJbmRleH0pLHQpfSx0LmRlZmF1bHRQcm9wcz17Y2hlY2tib3hMaXN0OiExLHJhZGlvTGlzdDohMSxjbGFzc05hbWU6XCJcIix0YWJJbmRleDotMSxvbktleURvd246ZnVuY3Rpb24oKXt9LG9uQ2xpY2s6ZnVuY3Rpb24oKXt9LG9uRm9jdXM6ZnVuY3Rpb24oKXt9LG9uQmx1cjpmdW5jdGlvbigpe30sb25EZXN0cm95OmZ1bmN0aW9uKCl7fSx0YWc6XCJsaVwiLGhhbmRsZUNsaWNrOmZ1bmN0aW9uKCl7fSxoYW5kbGVLZXlEb3duOmZ1bmN0aW9uKCl7fSxoYW5kbGVCbHVyOmZ1bmN0aW9uKCl7fSxoYW5kbGVGb2N1czpmdW5jdGlvbigpe30sZ2V0TGlzdEl0ZW1Jbml0aWFsVGFiSW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4tMX0sZ2V0Q2xhc3NOYW1lc0Zyb21MaXN0OmZ1bmN0aW9uKCl7cmV0dXJue319fSx0fShsLmRlZmF1bHQuQ29tcG9uZW50KTt0Lkxpc3RJdGVtQmFzZT1oO3QuZGVmYXVsdD1kLndpdGhSaXBwbGUoZnVuY3Rpb24oZSl7cmV0dXJuIGwuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHAuTGlzdEl0ZW1Db250ZXh0LkNvbnN1bWVyLG51bGwsZnVuY3Rpb24odCl7cmV0dXJuIGwuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGgsbyh7fSx0LGUpKX0pfSl9LDkwOmZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xuZnVuY3Rpb24gcihlLHQpe2lmKGUuY2xvc2VzdClyZXR1cm4gZS5jbG9zZXN0KHQpO2Zvcih2YXIgbj1lO247KXtpZihpKG4sdCkpcmV0dXJuIG47bj1uLnBhcmVudEVsZW1lbnR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gaShlLHQpe3JldHVybihlLm1hdGNoZXN8fGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxlLm1zTWF0Y2hlc1NlbGVjdG9yKS5jYWxsKGUsdCl9bi5yKHQpLG4uZCh0LFwiY2xvc2VzdFwiLGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KSxuLmQodCxcIm1hdGNoZXNcIixmdW5jdGlvbigpe3JldHVybiBpfSl9LDkxOmZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPTEscj1hcmd1bWVudHMubGVuZ3RoO248cjtuKyspZm9yKHZhciBpIGluIHQ9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGkpJiYoZVtpXT10W2ldKTtyZXR1cm4gZX0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0saT10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtmb3IodmFyIHIgaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmdC5pbmRleE9mKHIpPDAmJihuW3JdPWVbcl0pO2lmKG51bGwhPWUmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBpPTA7Zm9yKHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtpPHIubGVuZ3RoO2krKyl0LmluZGV4T2YocltpXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUscltpXSkmJihuW3JbaV1dPWVbcltpXV0pfXJldHVybiBufSxvPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBzPW8obigwKSksYT1vKG4oMSkpO3QuZGVmYXVsdD1mdW5jdGlvbihlKXt2YXIgdD1lLnRhYkluZGV4LG49dm9pZCAwPT09dD8tMTp0LG89ZS5ncmFwaGljLGw9ZS5jbGFzc05hbWUsYz12b2lkIDA9PT1sP1wiXCI6bCx1PWkoZSxbXCJ0YWJJbmRleFwiLFwiZ3JhcGhpY1wiLFwiY2xhc3NOYW1lXCJdKSxkPXIoe2NsYXNzTmFtZTphLmRlZmF1bHQoXCJtZGMtbGlzdC1pdGVtX19ncmFwaGljXCIsYyksdGFiSW5kZXg6dm9pZCAwIT09bj9uOi0xfSx1KTtyZXR1cm4gcy5kZWZhdWx0LmNsb25lRWxlbWVudChvLGQpfX0sOTI6ZnVuY3Rpb24oZSx0LG4pe1widXNlIHN0cmljdFwiO3ZhciByPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKHI9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rKylmb3IodmFyIGkgaW4gdD1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsaSkmJihlW2ldPXRbaV0pO3JldHVybiBlfSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxpPXRoaXMmJnRoaXMuX19yZXN0fHxmdW5jdGlvbihlLHQpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiZ0LmluZGV4T2Yocik8MCYmKG5bcl09ZVtyXSk7aWYobnVsbCE9ZSYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGk9MDtmb3Iocj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO2k8ci5sZW5ndGg7aSsrKXQuaW5kZXhPZihyW2ldKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyW2ldKSYmKG5bcltpXV09ZVtyW2ldXSl9cmV0dXJuIG59LG89dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIHM9byhuKDApKSxhPW8obigxKSk7dC5kZWZhdWx0PWZ1bmN0aW9uKGUpe3ZhciB0PWUucHJpbWFyeVRleHQsbj12b2lkIDA9PT10P1wiXCI6dCxvPWUuc2Vjb25kYXJ5VGV4dCxsPXZvaWQgMD09PW8/XCJcIjpvLGM9ZS50YWJJbmRleCx1PXZvaWQgMD09PWM/LTE6YyxkPWUuY2xhc3NOYW1lLGY9dm9pZCAwPT09ZD9cIlwiOmQscD1pKGUsW1wicHJpbWFyeVRleHRcIixcInNlY29uZGFyeVRleHRcIixcInRhYkluZGV4XCIsXCJjbGFzc05hbWVcIl0pLGg9ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDA9PT1lKXJldHVybiBudWxsO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlfHxcIm51bWJlclwiPT10eXBlb2YgZSlyZXR1cm4gcy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse2NsYXNzTmFtZTp0LHRhYkluZGV4OnZvaWQgMCE9PXU/dTotMX0sZSk7aWYobnVsbD09PShuPWUpfHx2b2lkIDA9PT1uLnByb3BzKXJldHVybiBudWxsO3ZhciBuLG89ZS5wcm9wcyxsPW8uY2xhc3NOYW1lLGM9aShvLFtcImNsYXNzTmFtZVwiXSk7dD1hLmRlZmF1bHQodCxsKTt2YXIgZD1yKHt9LGMse2NsYXNzTmFtZTp0fSk7cmV0dXJuIHMuZGVmYXVsdC5jbG9uZUVsZW1lbnQoZSxkKX07cmV0dXJuIGw/cy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIscih7Y2xhc3NOYW1lOmEuZGVmYXVsdChcIm1kYy1saXN0LWl0ZW1fX3RleHRcIixmKSx0YWJJbmRleDp2b2lkIDAhPT11P3U6LTF9LHApLGgobixcIm1kYy1saXN0LWl0ZW1fX3ByaW1hcnktdGV4dFwiKSxoKGwsXCJtZGMtbGlzdC1pdGVtX19zZWNvbmRhcnktdGV4dFwiKSk6aChuLGEuZGVmYXVsdChcIm1kYy1saXN0LWl0ZW1fX3RleHRcIixmKSl9fSw5MzpmdW5jdGlvbihlLHQsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9dGhpcyYmdGhpcy5fX2Fzc2lnbnx8ZnVuY3Rpb24oKXtyZXR1cm4ocj1PYmplY3QuYXNzaWdufHxmdW5jdGlvbihlKXtmb3IodmFyIHQsbj0xLHI9YXJndW1lbnRzLmxlbmd0aDtuPHI7bisrKWZvcih2YXIgaSBpbiB0PWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKSYmKGVbaV09dFtpXSk7cmV0dXJuIGV9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGk9dGhpcyYmdGhpcy5fX3Jlc3R8fGZ1bmN0aW9uKGUsdCl7dmFyIG49e307Zm9yKHZhciByIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJnQuaW5kZXhPZihyKTwwJiYobltyXT1lW3JdKTtpZihudWxsIT1lJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgaT0wO2ZvcihyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7aTxyLmxlbmd0aDtpKyspdC5pbmRleE9mKHJbaV0pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLHJbaV0pJiYobltyW2ldXT1lW3JbaV1dKX1yZXR1cm4gbn0sbz10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgcz1vKG4oMCkpLGE9byhuKDEpKTt0LmRlZmF1bHQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLnRhYkluZGV4LG89ZS5tZXRhLGw9ZS5jbGFzc05hbWUsYz12b2lkIDA9PT1sP1wiXCI6bCx1PWkoZSxbXCJ0YWJJbmRleFwiLFwibWV0YVwiLFwiY2xhc3NOYW1lXCJdKTt0PVwic3RyaW5nXCI9PXR5cGVvZiBvP3MuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLG51bGwsbyk6bzt2YXIgZD1yKHtjbGFzc05hbWU6YS5kZWZhdWx0KFwibWRjLWxpc3QtaXRlbV9fbWV0YVwiLGMsdC5wcm9wcy5jbGFzc05hbWUpLHRhYkluZGV4OnZvaWQgMCE9PW4/bjotMX0sdSk7cmV0dXJuIHMuZGVmYXVsdC5jbG9uZUVsZW1lbnQodCxkKX19LDk0OmZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPTEscj1hcmd1bWVudHMubGVuZ3RoO248cjtuKyspZm9yKHZhciBpIGluIHQ9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGkpJiYoZVtpXT10W2ldKTtyZXR1cm4gZX0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0saT10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtmb3IodmFyIHIgaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmdC5pbmRleE9mKHIpPDAmJihuW3JdPWVbcl0pO2lmKG51bGwhPWUmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBpPTA7Zm9yKHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtpPHIubGVuZ3RoO2krKyl0LmluZGV4T2YocltpXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUscltpXSkmJihuW3JbaV1dPWVbcltpXV0pfXJldHVybiBufSxvPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBzPW8obigwKSksYT1vKG4oMSkpO3QuZGVmYXVsdD1mdW5jdGlvbihlKXt2YXIgdD1lLnRhZyxuPXZvaWQgMD09PXQ/XCJsaVwiOnQsbz1lLmNsYXNzTmFtZSxsPXZvaWQgMD09PW8/XCJcIjpvLGM9ZS5yb2xlLHU9dm9pZCAwPT09Yz9cInNlcGFyYXRvclwiOmMsZD1pKGUsW1widGFnXCIsXCJjbGFzc05hbWVcIixcInJvbGVcIl0pO3JldHVybiBzLmRlZmF1bHQuY3JlYXRlRWxlbWVudChuLHIoe2NsYXNzTmFtZTphLmRlZmF1bHQoXCJtZGMtbGlzdC1kaXZpZGVyXCIsbCkscm9sZTp1fSxkKSl9fSw5NTpmdW5jdGlvbihlLHQsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9dGhpcyYmdGhpcy5fX2Fzc2lnbnx8ZnVuY3Rpb24oKXtyZXR1cm4ocj1PYmplY3QuYXNzaWdufHxmdW5jdGlvbihlKXtmb3IodmFyIHQsbj0xLHI9YXJndW1lbnRzLmxlbmd0aDtuPHI7bisrKWZvcih2YXIgaSBpbiB0PWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKSYmKGVbaV09dFtpXSk7cmV0dXJuIGV9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGk9dGhpcyYmdGhpcy5fX3Jlc3R8fGZ1bmN0aW9uKGUsdCl7dmFyIG49e307Zm9yKHZhciByIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJnQuaW5kZXhPZihyKTwwJiYobltyXT1lW3JdKTtpZihudWxsIT1lJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgaT0wO2ZvcihyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7aTxyLmxlbmd0aDtpKyspdC5pbmRleE9mKHJbaV0pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLHJbaV0pJiYobltyW2ldXT1lW3JbaV1dKX1yZXR1cm4gbn0sbz10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgcz1vKG4oMCkpLGE9byhuKDEpKTt0LmRlZmF1bHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YWcsbj12b2lkIDA9PT10P1wiZGl2XCI6dCxvPWUuY2xhc3NOYW1lLGw9dm9pZCAwPT09bz9cIlwiOm8sYz1lLmNoaWxkcmVuLHU9aShlLFtcInRhZ1wiLFwiY2xhc3NOYW1lXCIsXCJjaGlsZHJlblwiXSk7cmV0dXJuIHMuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG4scih7Y2xhc3NOYW1lOmEuZGVmYXVsdChcIm1kYy1saXN0LWdyb3VwXCIsbCl9LHUpLGMpfX0sOTY6ZnVuY3Rpb24oZSx0LG4pe1widXNlIHN0cmljdFwiO3ZhciByPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKHI9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rKylmb3IodmFyIGkgaW4gdD1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsaSkmJihlW2ldPXRbaV0pO3JldHVybiBlfSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxpPXRoaXMmJnRoaXMuX19yZXN0fHxmdW5jdGlvbihlLHQpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiZ0LmluZGV4T2Yocik8MCYmKG5bcl09ZVtyXSk7aWYobnVsbCE9ZSYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGk9MDtmb3Iocj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO2k8ci5sZW5ndGg7aSsrKXQuaW5kZXhPZihyW2ldKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyW2ldKSYmKG5bcltpXV09ZVtyW2ldXSl9cmV0dXJuIG59LG89dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIHM9byhuKDApKSxhPW8obigxKSk7dC5kZWZhdWx0PWZ1bmN0aW9uKGUpe3ZhciB0PWUudGFnLG49dm9pZCAwPT09dD9cImgzXCI6dCxvPWUuY2xhc3NOYW1lLGw9dm9pZCAwPT09bz9cIlwiOm8sYz1lLmNoaWxkcmVuLHU9aShlLFtcInRhZ1wiLFwiY2xhc3NOYW1lXCIsXCJjaGlsZHJlblwiXSk7cmV0dXJuIHMuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG4scih7Y2xhc3NOYW1lOmEuZGVmYXVsdChcIm1kYy1saXN0LWdyb3VwX19zdWJoZWFkZXJcIixsKX0sdSksYyl9fX0pfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saXN0LmpzLm1hcCIsIiFmdW5jdGlvbih0LGUpe2lmKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPWUocmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpLHJlcXVpcmUoXCJyZWFjdC1kb21cIikpO2Vsc2UgaWYoXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXCJyZWFjdFwiLFwiY2xhc3NuYW1lc1wiLFwicmVhY3QtZG9tXCJdLGUpO2Vsc2V7dmFyIG49XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZShyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcImNsYXNzbmFtZXNcIikscmVxdWlyZShcInJlYWN0LWRvbVwiKSk6ZSh0LnJlYWN0LHQuY2xhc3NuYW1lcyx0W1wicmVhY3QtZG9tXCJdKTtmb3IodmFyIG8gaW4gbikoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czp0KVtvXT1uW29dfX0oXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9e307ZnVuY3Rpb24gbihvKXtpZihlW29dKXJldHVybiBlW29dLmV4cG9ydHM7dmFyIGk9ZVtvXT17aTpvLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIHRbb10uY2FsbChpLmV4cG9ydHMsaSxpLmV4cG9ydHMsbiksaS5sPSEwLGkuZXhwb3J0c31yZXR1cm4gbi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxvKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6b30pfSxuLnI9ZnVuY3Rpb24odCl7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOlwiTW9kdWxlXCJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiZcIm9iamVjdFwiPT10eXBlb2YgdCYmdCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBvPU9iamVjdC5jcmVhdGUobnVsbCk7aWYobi5yKG8pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLFwiZGVmYXVsdFwiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KSwyJmUmJlwic3RyaW5nXCIhPXR5cGVvZiB0KWZvcih2YXIgaSBpbiB0KW4uZChvLGksZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxpKSk7cmV0dXJuIG99LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsXCJhXCIsZSksZX0sbi5vPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfSxuLnA9XCJcIixuKG4ucz0xMDIpfSh7MDpmdW5jdGlvbihlLG4pe2UuZXhwb3J0cz10fSwxOmZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWV9LDEwMjpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG8saT10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KG89ZnVuY3Rpb24odCxlKXtyZXR1cm4obz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1vKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSkscj10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsbz1hcmd1bWVudHMubGVuZ3RoO248bztuKyspZm9yKHZhciBpIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLGkpJiYodFtpXT1lW2ldKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scz10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIG8gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxvKSYmZS5pbmRleE9mKG8pPDAmJihuW29dPXRbb10pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBpPTA7Zm9yKG89T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtpPG8ubGVuZ3RoO2krKyllLmluZGV4T2Yob1tpXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsb1tpXSkmJihuW29baV1dPXRbb1tpXV0pfXJldHVybiBufSx1PXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBhPXUobigwKSksYz11KG4oMTAzKSksbD11KG4oMSkpLGY9bigxNiksaD1uKDE1OSk7ZS5Db3JuZXI9aC5Db3JuZXI7dmFyIGQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5tZW51U3VyZmFjZUVsZW1lbnQ9YS5kZWZhdWx0LmNyZWF0ZVJlZigpLGUucHJldmlvdXNGb2N1cz1udWxsLGUuZmlyc3RGb2N1c2FibGVFbGVtZW50PW51bGwsZS5sYXN0Rm9jdXNhYmxlRWxlbWVudD1udWxsLGUuc3RhdGU9e3RyYW5zZm9ybU9yaWdpbjpcIlwiLG1heEhlaWdodDp2b2lkIDAsc3R5bGVMZWZ0OnZvaWQgMCxzdHlsZVJpZ2h0OnZvaWQgMCxzdHlsZVRvcDp2b2lkIDAsc3R5bGVCb3R0b206dm9pZCAwLGNsYXNzTGlzdDpuZXcgU2V0LG1vdW50ZWQ6ITF9LGUub3Blbl89ZnVuY3Rpb24oKXtpZihlLnByb3BzLm9wZW4pe2lmKCFlLm1lbnVTdXJmYWNlRWxlbWVudC5jdXJyZW50KXJldHVybjt2YXIgdD1lLm1lbnVTdXJmYWNlRWxlbWVudC5jdXJyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZi5NRENNZW51U3VyZmFjZUZvdW5kYXRpb24uc3RyaW5ncy5GT0NVU0FCTEVfRUxFTUVOVFMpO2UuZmlyc3RGb2N1c2FibGVFbGVtZW50PXQubGVuZ3RoPjA/dFswXTpudWxsLGUubGFzdEZvY3VzYWJsZUVsZW1lbnQ9dC5sZW5ndGg+MD90W3QubGVuZ3RoLTFdOm51bGwsZS5mb3VuZGF0aW9uLm9wZW4oKX1lbHNlIGUuZm91bmRhdGlvbi5jbG9zZSgpfSxlLmhhbmRsZUtleWRvd249ZnVuY3Rpb24odCl7ZS5wcm9wcy5vbktleURvd24odCksZS5mb3VuZGF0aW9uLmhhbmRsZUtleWRvd24odC5uYXRpdmVFdmVudCl9LGUuaGFuZGxlT3Blbj1mdW5jdGlvbigpe2UucmVnaXN0ZXJXaW5kb3dDbGlja0xpc3RlbmVyJiZlLnJlZ2lzdGVyV2luZG93Q2xpY2tMaXN0ZW5lcigpfSxlLmhhbmRsZUNsb3NlPWZ1bmN0aW9uKCl7ZS5kZXJlZ2lzdGVyV2luZG93Q2xpY2tMaXN0ZW5lciYmZS5kZXJlZ2lzdGVyV2luZG93Q2xpY2tMaXN0ZW5lcigpfSxlfXJldHVybiBpKGUsdCksZS5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5wcm9wcyxuPWUuYW5jaG9yQ29ybmVyLG89ZS5hbmNob3JNYXJnaW4saT1lLmNvb3JkaW5hdGVzLHI9ZS5maXhlZCxzPWUucXVpY2tPcGVuO3RoaXMuaGFuZGxlV2luZG93Q2xpY2s9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuZm91bmRhdGlvbi5oYW5kbGVCb2R5Q2xpY2soZSl9LHRoaXMucmVnaXN0ZXJXaW5kb3dDbGlja0xpc3RlbmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIix0LmhhbmRsZVdpbmRvd0NsaWNrKX0sdGhpcy5kZXJlZ2lzdGVyV2luZG93Q2xpY2tMaXN0ZW5lcj1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsdC5oYW5kbGVXaW5kb3dDbGljayl9LHRoaXMuZm91bmRhdGlvbj1uZXcgZi5NRENNZW51U3VyZmFjZUZvdW5kYXRpb24odGhpcy5hZGFwdGVyKSx0aGlzLmZvdW5kYXRpb24uaW5pdCgpLHRoaXMuZm91bmRhdGlvbi5zZXRJc0hvaXN0ZWQoITApLHRoaXMuZm91bmRhdGlvbi5zZXRGaXhlZFBvc2l0aW9uKHIpLGkmJnRoaXMuc2V0Q29vcmRpbmF0ZXMoKSxuJiZ0aGlzLmZvdW5kYXRpb24uc2V0QW5jaG9yQ29ybmVyKG4pLG8mJnRoaXMuZm91bmRhdGlvbi5zZXRBbmNob3JNYXJnaW4obykscyYmdGhpcy5mb3VuZGF0aW9uLnNldFF1aWNrT3BlbihzKSx0aGlzLnNldFN0YXRlKHttb3VudGVkOiEwfSl9LGUucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbih0LGUpeyh0aGlzLnByb3BzLm9wZW4hPT10Lm9wZW58fHRoaXMucHJvcHMub3BlbiYmdGhpcy5zdGF0ZS5tb3VudGVkIT09ZS5tb3VudGVkKSYmdGhpcy5vcGVuXygpLHRoaXMucHJvcHMuY29vcmRpbmF0ZXMhPT10LmNvb3JkaW5hdGVzJiZ0aGlzLnNldENvb3JkaW5hdGVzKCksdGhpcy5wcm9wcy5hbmNob3JDb3JuZXIhPT10LmFuY2hvckNvcm5lciYmdGhpcy5mb3VuZGF0aW9uLnNldEFuY2hvckNvcm5lcih0aGlzLnByb3BzLmFuY2hvckNvcm5lciksdGhpcy5wcm9wcy5hbmNob3JNYXJnaW4hPT10LmFuY2hvck1hcmdpbiYmdGhpcy5mb3VuZGF0aW9uLnNldEFuY2hvck1hcmdpbih0aGlzLnByb3BzLmFuY2hvck1hcmdpbiksdGhpcy5wcm9wcy5xdWlja09wZW4hPT10LnF1aWNrT3BlbiYmdGhpcy5mb3VuZGF0aW9uLnNldFF1aWNrT3Blbih0aGlzLnByb3BzLnF1aWNrT3BlbiksdGhpcy5zdGF0ZS5tb3VudGVkIT09ZS5tb3VudGVkJiZ0aGlzLnByb3BzLm9uTW91bnQmJnRoaXMucHJvcHMub25Nb3VudCh0aGlzLnN0YXRlLm1vdW50ZWQpfSxlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMuZGVyZWdpc3RlcldpbmRvd0NsaWNrTGlzdGVuZXImJnRoaXMuZGVyZWdpc3RlcldpbmRvd0NsaWNrTGlzdGVuZXIoKSx0aGlzLmZvdW5kYXRpb24mJnRoaXMuZm91bmRhdGlvbi5kZXN0cm95KCl9LGUucHJvdG90eXBlLnNldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7aWYodGhpcy5wcm9wcy5jb29yZGluYXRlcyl7dmFyIHQ9dGhpcy5wcm9wcy5jb29yZGluYXRlcyxlPXQueCxuPXQueTt0aGlzLmZvdW5kYXRpb24uc2V0QWJzb2x1dGVQb3NpdGlvbihlLG4pfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiY2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9dC5maXhlZCxuPXQuY2xhc3NOYW1lLG89dGhpcy5zdGF0ZS5jbGFzc0xpc3Q7cmV0dXJuIGwuZGVmYXVsdChcIm1kYy1tZW51LXN1cmZhY2VcIixBcnJheS5mcm9tKG8pLG4se1wibWRjLW1lbnUtc3VyZmFjZS0tZml4ZWRcIjplfSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwic3R5bGVzXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuc3RhdGUsZT10LnN0eWxlTGVmdCxuPXQuc3R5bGVSaWdodCxvPXQuc3R5bGVUb3AsaT10LnN0eWxlQm90dG9tLHI9dC50cmFuc2Zvcm1PcmlnaW4scz10Lm1heEhlaWdodDtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSx0aGlzLnByb3BzLnN0eWxlcyx7dHJhbnNmb3JtT3JpZ2luOnIsbWF4SGVpZ2h0OnMsbGVmdDplLHJpZ2h0Om4sdG9wOm8sYm90dG9tOml9KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJhZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHIoe2FkZENsYXNzOmZ1bmN0aW9uKGUpe3ZhciBuPW5ldyBTZXQodC5zdGF0ZS5jbGFzc0xpc3QpO24uYWRkKGUpLHQuc2V0U3RhdGUoe2NsYXNzTGlzdDpufSl9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciBuPW5ldyBTZXQodC5zdGF0ZS5jbGFzc0xpc3QpO24uZGVsZXRlKGUpLHQuc2V0U3RhdGUoe2NsYXNzTGlzdDpufSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiB0LmNsYXNzZXMuc3BsaXQoXCIgXCIpLmluY2x1ZGVzKGUpfSxoYXNBbmNob3I6ZnVuY3Rpb24oKXtyZXR1cm4hIXQucHJvcHMuYW5jaG9yRWxlbWVudH0sbm90aWZ5T3BlbjpmdW5jdGlvbigpe3QuaGFuZGxlT3BlbigpLHQucHJvcHMub25PcGVuKCl9LG5vdGlmeUNsb3NlOmZ1bmN0aW9uKCl7dC5oYW5kbGVDbG9zZSgpLHQucHJvcHMub25DbG9zZSgpfSxpc0VsZW1lbnRJbkNvbnRhaW5lcjpmdW5jdGlvbihlKXtyZXR1cm4hIXQubWVudVN1cmZhY2VFbGVtZW50LmN1cnJlbnQmJnQubWVudVN1cmZhY2VFbGVtZW50LmN1cnJlbnQuY29udGFpbnMoZSl9LGlzUnRsOmZ1bmN0aW9uKCl7cmV0dXJuISF0Lm1lbnVTdXJmYWNlRWxlbWVudCYmKCEhdC5tZW51U3VyZmFjZUVsZW1lbnQuY3VycmVudCYmXCJydGxcIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQubWVudVN1cmZhY2VFbGVtZW50LmN1cnJlbnQpLmdldFByb3BlcnR5VmFsdWUoXCJkaXJlY3Rpb25cIikpfSxzZXRUcmFuc2Zvcm1PcmlnaW46ZnVuY3Rpb24oZSl7cmV0dXJuIHQuc2V0U3RhdGUoe3RyYW5zZm9ybU9yaWdpbjplfSl9fSx7aXNGb2N1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuIHQubWVudVN1cmZhY2VFbGVtZW50JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09dC5tZW51U3VyZmFjZUVsZW1lbnQuY3VycmVudH0sc2F2ZUZvY3VzOmZ1bmN0aW9uKCl7dC5wcmV2aW91c0ZvY3VzPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9LHJlc3RvcmVGb2N1czpmdW5jdGlvbigpe3ZhciBlPXQubWVudVN1cmZhY2VFbGVtZW50O2UmJmUuY3VycmVudCYmZS5jdXJyZW50LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpJiZ0LnByZXZpb3VzRm9jdXMmJnQucHJldmlvdXNGb2N1cy5mb2N1cyYmdC5wcmV2aW91c0ZvY3VzLmZvY3VzKCl9LGlzRmlyc3RFbGVtZW50Rm9jdXNlZDpmdW5jdGlvbigpe3JldHVybiB0LmZpcnN0Rm9jdXNhYmxlRWxlbWVudD09PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9LGlzTGFzdEVsZW1lbnRGb2N1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuIHQubGFzdEZvY3VzYWJsZUVsZW1lbnQ9PT1kb2N1bWVudC5hY3RpdmVFbGVtZW50fSxmb2N1c0ZpcnN0RWxlbWVudDpmdW5jdGlvbigpe3JldHVybiEhdC5maXJzdEZvY3VzYWJsZUVsZW1lbnQmJih0LmZpcnN0Rm9jdXNhYmxlRWxlbWVudC5mb2N1cyYmdC5maXJzdEZvY3VzYWJsZUVsZW1lbnQuZm9jdXMoKSl9LGZvY3VzTGFzdEVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5sYXN0Rm9jdXNhYmxlRWxlbWVudCYmdC5sYXN0Rm9jdXNhYmxlRWxlbWVudC5mb2N1cyYmdC5sYXN0Rm9jdXNhYmxlRWxlbWVudC5mb2N1cygpfX0se2dldElubmVyRGltZW5zaW9uczpmdW5jdGlvbigpe3ZhciBlPXQubWVudVN1cmZhY2VFbGVtZW50LmN1cnJlbnQ7cmV0dXJuIGU/e3dpZHRoOmUub2Zmc2V0V2lkdGgsaGVpZ2h0OmUub2Zmc2V0SGVpZ2h0fTp7d2lkdGg6MCxoZWlnaHQ6MH19LGdldEFuY2hvckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gdC5wcm9wcy5hbmNob3JFbGVtZW50P3QucHJvcHMuYW5jaG9yRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTpudWxsfSxnZXRXaW5kb3dEaW1lbnNpb25zOmZ1bmN0aW9uKCl7cmV0dXJue3dpZHRoOndpbmRvdy5pbm5lcldpZHRoLGhlaWdodDp3aW5kb3cuaW5uZXJIZWlnaHR9fSxnZXRCb2R5RGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybnt3aWR0aDpkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLGhlaWdodDpkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodH19LGdldFdpbmRvd1Njcm9sbDpmdW5jdGlvbigpe3JldHVybnt4OndpbmRvdy5wYWdlWE9mZnNldCx5OndpbmRvdy5wYWdlWU9mZnNldH19LHNldFBvc2l0aW9uOmZ1bmN0aW9uKGUpe3Quc2V0U3RhdGUoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5hc3NpZ24odCx7c3R5bGVMZWZ0OlwibGVmdFwiaW4gZT9lLmxlZnQ6bnVsbCxzdHlsZVJpZ2h0OlwicmlnaHRcImluIGU/ZS5yaWdodDpudWxsLHN0eWxlVG9wOlwidG9wXCJpbiBlP2UudG9wOm51bGwsc3R5bGVCb3R0b206XCJib3R0b21cImluIGU/ZS5ib3R0b206bnVsbH0pfSl9LHNldE1heEhlaWdodDpmdW5jdGlvbihlKXtyZXR1cm4gdC5zZXRTdGF0ZSh7bWF4SGVpZ2h0OmV9KX19KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9KHQuYW5jaG9yQ29ybmVyLHQuYW5jaG9yRWxlbWVudCx0LmFuY2hvck1hcmdpbix0LmNsYXNzTmFtZSx0LmNvb3JkaW5hdGVzLHQuZml4ZWQsdC5vbkNsb3NlLHQub25PcGVuLHQub25LZXlEb3duLHQuc3R5bGVzLHQucXVpY2tPcGVuLHQub25Nb3VudCx0LmNoaWxkcmVuKSxuPXModCxbXCJhbmNob3JDb3JuZXJcIixcImFuY2hvckVsZW1lbnRcIixcImFuY2hvck1hcmdpblwiLFwiY2xhc3NOYW1lXCIsXCJjb29yZGluYXRlc1wiLFwiZml4ZWRcIixcIm9uQ2xvc2VcIixcIm9uT3BlblwiLFwib25LZXlEb3duXCIsXCJzdHlsZXNcIixcInF1aWNrT3BlblwiLFwib25Nb3VudFwiLFwiY2hpbGRyZW5cIl0pO3JldHVybiB0aGlzLnN0YXRlLm1vdW50ZWQ/Yy5kZWZhdWx0LmNyZWF0ZVBvcnRhbChhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHIoe2NsYXNzTmFtZTp0aGlzLmNsYXNzZXMsb25LZXlEb3duOnRoaXMuaGFuZGxlS2V5ZG93bixyZWY6dGhpcy5tZW51U3VyZmFjZUVsZW1lbnQsc3R5bGU6dGhpcy5zdHlsZXN9LG4pLGUpLGRvY3VtZW50LmJvZHkpOm51bGx9LGUuZGVmYXVsdFByb3BzPXtjbGFzc05hbWU6XCJcIixzdHlsZXM6e30sYW5jaG9yQ29ybmVyOjAsYW5jaG9yTWFyZ2luOnt9LG9uQ2xvc2U6ZnVuY3Rpb24oKXt9LG9uT3BlbjpmdW5jdGlvbigpe30sb25LZXlEb3duOmZ1bmN0aW9uKCl7fSxxdWlja09wZW46ITEsb3BlbjohMSxmaXhlZDohMX0sZX0oYS5kZWZhdWx0LkNvbXBvbmVudCk7ZS5kZWZhdWx0PWR9LDEwMzpmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1ufSwxNTpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJiXCIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLG4uZChlLFwiYVwiLGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KSxuLmQoZSxcImRcIixmdW5jdGlvbigpe3JldHVybiBzfSksbi5kKGUsXCJjXCIsZnVuY3Rpb24oKXtyZXR1cm4gYX0pO1wiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yO1xuLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxuXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovdmFyIG89ZnVuY3Rpb24odCxlKXtyZXR1cm4obz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9O2Z1bmN0aW9uIGkodCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fW8odCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9dmFyIHI9ZnVuY3Rpb24oKXtyZXR1cm4ocj1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLG89YXJndW1lbnRzLmxlbmd0aDtuPG87bisrKWZvcih2YXIgaSBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxpKSYmKHRbaV09ZVtpXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2Z1bmN0aW9uIHModCl7dmFyIGU9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0W1N5bWJvbC5pdGVyYXRvcl0sbj0wO3JldHVybiBlP2UuY2FsbCh0KTp7bmV4dDpmdW5jdGlvbigpe3JldHVybiB0JiZuPj10Lmxlbmd0aCYmKHQ9dm9pZCAwKSx7dmFsdWU6dCYmdFtuKytdLGRvbmU6IXR9fX19ZnVuY3Rpb24gdSh0LGUpe3ZhciBuPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdO2lmKCFuKXJldHVybiB0O3ZhciBvLGkscj1uLmNhbGwodCkscz1bXTt0cnl7Zm9yKDsodm9pZCAwPT09ZXx8ZS0tID4wKSYmIShvPXIubmV4dCgpKS5kb25lOylzLnB1c2goby52YWx1ZSl9Y2F0Y2godCl7aT17ZXJyb3I6dH19ZmluYWxseXt0cnl7byYmIW8uZG9uZSYmKG49ci5yZXR1cm4pJiZuLmNhbGwocil9ZmluYWxseXtpZihpKXRocm93IGkuZXJyb3J9fXJldHVybiBzfWZ1bmN0aW9uIGEoKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdD10LmNvbmNhdCh1KGFyZ3VtZW50c1tlXSkpO3JldHVybiB0fX0sMTU5OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSk7dmFyIG8saT17fTtmdW5jdGlvbiByKHQsZSl7aWYodm9pZCAwPT09ZSYmKGU9ITEpLHZvaWQgMD09PW98fGUpe3ZhciBuPXQuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtvPVwidHJhbnNmb3JtXCJpbiBuLnN0eWxlP1widHJhbnNmb3JtXCI6XCJ3ZWJraXRUcmFuc2Zvcm1cIn1yZXR1cm4gb31uLnIoaSksbi5kKGksXCJnZXRUcmFuc2Zvcm1Qcm9wZXJ0eU5hbWVcIixmdW5jdGlvbigpe3JldHVybiByfSk7dmFyIHM9bigzKSx1PW4oMTUpLGE9bigyOCksYz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIG49W10sbz0yO288YXJndW1lbnRzLmxlbmd0aDtvKyspbltvLTJdPWFyZ3VtZW50c1tvXTt0aGlzLnJvb3RfPXQsdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsdS5jKG4pKSx0aGlzLmZvdW5kYXRpb25fPXZvaWQgMD09PWU/dGhpcy5nZXREZWZhdWx0Rm91bmRhdGlvbigpOmUsdGhpcy5mb3VuZGF0aW9uXy5pbml0KCksdGhpcy5pbml0aWFsU3luY1dpdGhET00oKX1yZXR1cm4gdC5hdHRhY2hUbz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQoZSxuZXcgYS5hKHt9KSl9LHQucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV19LHQucHJvdG90eXBlLmdldERlZmF1bHRGb3VuZGF0aW9uPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFwiU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIGdldERlZmF1bHRGb3VuZGF0aW9uIHRvIHJldHVybiBhIHByb3Blcmx5IGNvbmZpZ3VyZWQgZm91bmRhdGlvbiBjbGFzc1wiKX0sdC5wcm90b3R5cGUuaW5pdGlhbFN5bmNXaXRoRE9NPWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5mb3VuZGF0aW9uXy5kZXN0cm95KCl9LHQucHJvdG90eXBlLmxpc3Rlbj1mdW5jdGlvbih0LGUpe3RoaXMucm9vdF8uYWRkRXZlbnRMaXN0ZW5lcih0LGUpfSx0LnByb3RvdHlwZS51bmxpc3Rlbj1mdW5jdGlvbih0LGUpe3RoaXMucm9vdF8ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LGUpfSx0LnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKHQsZSxuKXt2YXIgbzt2b2lkIDA9PT1uJiYobj0hMSksXCJmdW5jdGlvblwiPT10eXBlb2YgQ3VzdG9tRXZlbnQ/bz1uZXcgQ3VzdG9tRXZlbnQodCx7YnViYmxlczpuLGRldGFpbDplfSk6KG89ZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJDdXN0b21FdmVudFwiKSkuaW5pdEN1c3RvbUV2ZW50KHQsbiwhMSxlKSx0aGlzLnJvb3RfLmRpc3BhdGNoRXZlbnQobyl9LHR9KCksbD1uKDE2KSxmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiB1LmIoZSx0KSxlLmF0dGFjaFRvPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5wcm90b3R5cGUuaW5pdGlhbFN5bmNXaXRoRE9NPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMucm9vdF8ucGFyZW50RWxlbWVudDt0aGlzLmFuY2hvckVsZW1lbnQ9ZSYmZS5jbGFzc0xpc3QuY29udGFpbnMocy5jLkFOQ0hPUik/ZTpudWxsLHRoaXMucm9vdF8uY2xhc3NMaXN0LmNvbnRhaW5zKHMuYy5GSVhFRCkmJnRoaXMuc2V0Rml4ZWRQb3NpdGlvbighMCksdGhpcy5oYW5kbGVLZXlkb3duXz1mdW5jdGlvbihlKXtyZXR1cm4gdC5mb3VuZGF0aW9uXy5oYW5kbGVLZXlkb3duKGUpfSx0aGlzLmhhbmRsZUJvZHlDbGlja189ZnVuY3Rpb24oZSl7cmV0dXJuIHQuZm91bmRhdGlvbl8uaGFuZGxlQm9keUNsaWNrKGUpfSx0aGlzLnJlZ2lzdGVyQm9keUNsaWNrTGlzdGVuZXJfPWZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsdC5oYW5kbGVCb2R5Q2xpY2tfKX0sdGhpcy5kZXJlZ2lzdGVyQm9keUNsaWNrTGlzdGVuZXJfPWZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsdC5oYW5kbGVCb2R5Q2xpY2tfKX0sdGhpcy5saXN0ZW4oXCJrZXlkb3duXCIsdGhpcy5oYW5kbGVLZXlkb3duXyksdGhpcy5saXN0ZW4ocy5lLk9QRU5FRF9FVkVOVCx0aGlzLnJlZ2lzdGVyQm9keUNsaWNrTGlzdGVuZXJfKSx0aGlzLmxpc3RlbihzLmUuQ0xPU0VEX0VWRU5ULHRoaXMuZGVyZWdpc3RlckJvZHlDbGlja0xpc3RlbmVyXyl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLnVubGlzdGVuKFwia2V5ZG93blwiLHRoaXMuaGFuZGxlS2V5ZG93bl8pLHRoaXMudW5saXN0ZW4ocy5lLk9QRU5FRF9FVkVOVCx0aGlzLnJlZ2lzdGVyQm9keUNsaWNrTGlzdGVuZXJfKSx0aGlzLnVubGlzdGVuKHMuZS5DTE9TRURfRVZFTlQsdGhpcy5kZXJlZ2lzdGVyQm9keUNsaWNrTGlzdGVuZXJfKSx0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcIm9wZW5cIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZm91bmRhdGlvbl8uaXNPcGVuKCl9LHNldDpmdW5jdGlvbih0KXtpZih0KXt2YXIgZT10aGlzLnJvb3RfLnF1ZXJ5U2VsZWN0b3JBbGwocy5lLkZPQ1VTQUJMRV9FTEVNRU5UUyk7dGhpcy5maXJzdEZvY3VzYWJsZUVsZW1lbnRfPWVbMF0sdGhpcy5sYXN0Rm9jdXNhYmxlRWxlbWVudF89ZVtlLmxlbmd0aC0xXSx0aGlzLmZvdW5kYXRpb25fLm9wZW4oKX1lbHNlIHRoaXMuZm91bmRhdGlvbl8uY2xvc2UoKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJxdWlja09wZW5cIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuZm91bmRhdGlvbl8uc2V0UXVpY2tPcGVuKHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmhvaXN0TWVudVRvQm9keT1mdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5yb290XyksdGhpcy5zZXRJc0hvaXN0ZWQoITApfSxlLnByb3RvdHlwZS5zZXRJc0hvaXN0ZWQ9ZnVuY3Rpb24odCl7dGhpcy5mb3VuZGF0aW9uXy5zZXRJc0hvaXN0ZWQodCl9LGUucHJvdG90eXBlLnNldE1lbnVTdXJmYWNlQW5jaG9yRWxlbWVudD1mdW5jdGlvbih0KXt0aGlzLmFuY2hvckVsZW1lbnQ9dH0sZS5wcm90b3R5cGUuc2V0Rml4ZWRQb3NpdGlvbj1mdW5jdGlvbih0KXt0P3RoaXMucm9vdF8uY2xhc3NMaXN0LmFkZChzLmMuRklYRUQpOnRoaXMucm9vdF8uY2xhc3NMaXN0LnJlbW92ZShzLmMuRklYRUQpLHRoaXMuZm91bmRhdGlvbl8uc2V0Rml4ZWRQb3NpdGlvbih0KX0sZS5wcm90b3R5cGUuc2V0QWJzb2x1dGVQb3NpdGlvbj1mdW5jdGlvbih0LGUpe3RoaXMuZm91bmRhdGlvbl8uc2V0QWJzb2x1dGVQb3NpdGlvbih0LGUpLHRoaXMuc2V0SXNIb2lzdGVkKCEwKX0sZS5wcm90b3R5cGUuc2V0QW5jaG9yQ29ybmVyPWZ1bmN0aW9uKHQpe3RoaXMuZm91bmRhdGlvbl8uc2V0QW5jaG9yQ29ybmVyKHQpfSxlLnByb3RvdHlwZS5zZXRBbmNob3JNYXJnaW49ZnVuY3Rpb24odCl7dGhpcy5mb3VuZGF0aW9uXy5zZXRBbmNob3JNYXJnaW4odCl9LGUucHJvdG90eXBlLmdldERlZmF1bHRGb3VuZGF0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXthZGRDbGFzczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yb290Xy5jbGFzc0xpc3QuYWRkKGUpfSxyZW1vdmVDbGFzczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yb290Xy5jbGFzc0xpc3QucmVtb3ZlKGUpfSxoYXNDbGFzczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yb290Xy5jbGFzc0xpc3QuY29udGFpbnMoZSl9LGhhc0FuY2hvcjpmdW5jdGlvbigpe3JldHVybiEhdC5hbmNob3JFbGVtZW50fSxub3RpZnlDbG9zZTpmdW5jdGlvbigpe3JldHVybiB0LmVtaXQobC5NRENNZW51U3VyZmFjZUZvdW5kYXRpb24uc3RyaW5ncy5DTE9TRURfRVZFTlQse30pfSxub3RpZnlPcGVuOmZ1bmN0aW9uKCl7cmV0dXJuIHQuZW1pdChsLk1EQ01lbnVTdXJmYWNlRm91bmRhdGlvbi5zdHJpbmdzLk9QRU5FRF9FVkVOVCx7fSl9LGlzRWxlbWVudEluQ29udGFpbmVyOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJvb3RfLmNvbnRhaW5zKGUpfSxpc1J0bDpmdW5jdGlvbigpe3JldHVyblwicnRsXCI9PT1nZXRDb21wdXRlZFN0eWxlKHQucm9vdF8pLmdldFByb3BlcnR5VmFsdWUoXCJkaXJlY3Rpb25cIil9LHNldFRyYW5zZm9ybU9yaWdpbjpmdW5jdGlvbihlKXt2YXIgbj1yKHdpbmRvdykrXCItb3JpZ2luXCI7dC5yb290Xy5zdHlsZS5zZXRQcm9wZXJ0eShuLGUpfSxpc0ZvY3VzZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PXQucm9vdF99LHNhdmVGb2N1czpmdW5jdGlvbigpe3QucHJldmlvdXNGb2N1c189ZG9jdW1lbnQuYWN0aXZlRWxlbWVudH0scmVzdG9yZUZvY3VzOmZ1bmN0aW9uKCl7dC5yb290Xy5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSYmdC5wcmV2aW91c0ZvY3VzXyYmdC5wcmV2aW91c0ZvY3VzXy5mb2N1cyYmdC5wcmV2aW91c0ZvY3VzXy5mb2N1cygpfSxpc0ZpcnN0RWxlbWVudEZvY3VzZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXQuZmlyc3RGb2N1c2FibGVFbGVtZW50XyYmdC5maXJzdEZvY3VzYWJsZUVsZW1lbnRfPT09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudH0saXNMYXN0RWxlbWVudEZvY3VzZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXQubGFzdEZvY3VzYWJsZUVsZW1lbnRfJiZ0Lmxhc3RGb2N1c2FibGVFbGVtZW50Xz09PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9LGZvY3VzRmlyc3RFbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHQuZmlyc3RGb2N1c2FibGVFbGVtZW50XyYmdC5maXJzdEZvY3VzYWJsZUVsZW1lbnRfLmZvY3VzJiZ0LmZpcnN0Rm9jdXNhYmxlRWxlbWVudF8uZm9jdXMoKX0sZm9jdXNMYXN0RWxlbWVudDpmdW5jdGlvbigpe3JldHVybiB0Lmxhc3RGb2N1c2FibGVFbGVtZW50XyYmdC5sYXN0Rm9jdXNhYmxlRWxlbWVudF8uZm9jdXMmJnQubGFzdEZvY3VzYWJsZUVsZW1lbnRfLmZvY3VzKCl9LGdldElubmVyRGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybnt3aWR0aDp0LnJvb3RfLm9mZnNldFdpZHRoLGhlaWdodDp0LnJvb3RfLm9mZnNldEhlaWdodH19LGdldEFuY2hvckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gdC5hbmNob3JFbGVtZW50P3QuYW5jaG9yRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTpudWxsfSxnZXRXaW5kb3dEaW1lbnNpb25zOmZ1bmN0aW9uKCl7cmV0dXJue3dpZHRoOndpbmRvdy5pbm5lcldpZHRoLGhlaWdodDp3aW5kb3cuaW5uZXJIZWlnaHR9fSxnZXRCb2R5RGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybnt3aWR0aDpkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLGhlaWdodDpkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodH19LGdldFdpbmRvd1Njcm9sbDpmdW5jdGlvbigpe3JldHVybnt4OndpbmRvdy5wYWdlWE9mZnNldCx5OndpbmRvdy5wYWdlWU9mZnNldH19LHNldFBvc2l0aW9uOmZ1bmN0aW9uKGUpe3Qucm9vdF8uc3R5bGUubGVmdD1cImxlZnRcImluIGU/ZS5sZWZ0K1wicHhcIjpcIlwiLHQucm9vdF8uc3R5bGUucmlnaHQ9XCJyaWdodFwiaW4gZT9lLnJpZ2h0K1wicHhcIjpcIlwiLHQucm9vdF8uc3R5bGUudG9wPVwidG9wXCJpbiBlP2UudG9wK1wicHhcIjpcIlwiLHQucm9vdF8uc3R5bGUuYm90dG9tPVwiYm90dG9tXCJpbiBlP2UuYm90dG9tK1wicHhcIjpcIlwifSxzZXRNYXhIZWlnaHQ6ZnVuY3Rpb24oZSl7dC5yb290Xy5zdHlsZS5tYXhIZWlnaHQ9ZX19O3JldHVybiBuZXcgbC5NRENNZW51U3VyZmFjZUZvdW5kYXRpb24oZSl9LGV9KGMpO24uZChlLFwiQ29ybmVyXCIsZnVuY3Rpb24oKXtyZXR1cm4gcy5hfSksbi5kKGUsXCJDb3JuZXJCaXRcIixmdW5jdGlvbigpe3JldHVybiBzLmJ9KSxuLmQoZSxcInV0aWxcIixmdW5jdGlvbigpe3JldHVybiBpfSksbi5kKGUsXCJNRENNZW51U3VyZmFjZVwiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KSxuLmQoZSxcIk1EQ01lbnVTdXJmYWNlRm91bmRhdGlvblwiLGZ1bmN0aW9uKCl7cmV0dXJuIGwuTURDTWVudVN1cmZhY2VGb3VuZGF0aW9ufSl9LDE2OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSksbi5kKGUsXCJNRENNZW51U3VyZmFjZUZvdW5kYXRpb25cIixmdW5jdGlvbigpe3JldHVybiBzfSk7dmFyIG89bigxNSksaT1uKDI4KSxyPW4oMykscz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciBpPXQuY2FsbCh0aGlzLG8uYSh7fSxlLmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpcztyZXR1cm4gaS5pc09wZW5fPSExLGkuaXNRdWlja09wZW5fPSExLGkuaXNIb2lzdGVkRWxlbWVudF89ITEsaS5pc0ZpeGVkUG9zaXRpb25fPSExLGkub3BlbkFuaW1hdGlvbkVuZFRpbWVySWRfPTAsaS5jbG9zZUFuaW1hdGlvbkVuZFRpbWVySWRfPTAsaS5hbmltYXRpb25SZXF1ZXN0SWRfPTAsaS5hbmNob3JDb3JuZXJfPXIuYS5UT1BfU1RBUlQsaS5hbmNob3JNYXJnaW5fPXt0b3A6MCxyaWdodDowLGJvdHRvbTowLGxlZnQ6MH0saS5wb3NpdGlvbl89e3g6MCx5OjB9LGl9cmV0dXJuIG8uYihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5jfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwic3RyaW5nc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5lfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwibnVtYmVyc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5kfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiQ29ybmVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybiByLmF9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJkZWZhdWx0QWRhcHRlclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57YWRkQ2xhc3M6ZnVuY3Rpb24oKXt9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKCl7fSxoYXNDbGFzczpmdW5jdGlvbigpe3JldHVybiExfSxoYXNBbmNob3I6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXNFbGVtZW50SW5Db250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXNGb2N1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGlzRmlyc3RFbGVtZW50Rm9jdXNlZDpmdW5jdGlvbigpe3JldHVybiExfSxpc0xhc3RFbGVtZW50Rm9jdXNlZDpmdW5jdGlvbigpe3JldHVybiExfSxpc1J0bDpmdW5jdGlvbigpe3JldHVybiExfSxnZXRJbm5lckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm57aGVpZ2h0OjAsd2lkdGg6MH19LGdldEFuY2hvckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sZ2V0V2luZG93RGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybntoZWlnaHQ6MCx3aWR0aDowfX0sZ2V0Qm9keURpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm57aGVpZ2h0OjAsd2lkdGg6MH19LGdldFdpbmRvd1Njcm9sbDpmdW5jdGlvbigpe3JldHVybnt4OjAseTowfX0sc2V0UG9zaXRpb246ZnVuY3Rpb24oKXt9LHNldE1heEhlaWdodDpmdW5jdGlvbigpe30sc2V0VHJhbnNmb3JtT3JpZ2luOmZ1bmN0aW9uKCl7fSxzYXZlRm9jdXM6ZnVuY3Rpb24oKXt9LHJlc3RvcmVGb2N1czpmdW5jdGlvbigpe30sZm9jdXNGaXJzdEVsZW1lbnQ6ZnVuY3Rpb24oKXt9LGZvY3VzTGFzdEVsZW1lbnQ6ZnVuY3Rpb24oKXt9LG5vdGlmeUNsb3NlOmZ1bmN0aW9uKCl7fSxub3RpZnlPcGVuOmZ1bmN0aW9uKCl7fX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciB0PWUuY3NzQ2xhc3NlcyxuPXQuUk9PVCxvPXQuT1BFTjtpZighdGhpcy5hZGFwdGVyXy5oYXNDbGFzcyhuKSl0aHJvdyBuZXcgRXJyb3IobitcIiBjbGFzcyByZXF1aXJlZCBpbiByb290IGVsZW1lbnQuXCIpO3RoaXMuYWRhcHRlcl8uaGFzQ2xhc3MobykmJih0aGlzLmlzT3Blbl89ITApfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMub3BlbkFuaW1hdGlvbkVuZFRpbWVySWRfKSxjbGVhclRpbWVvdXQodGhpcy5jbG9zZUFuaW1hdGlvbkVuZFRpbWVySWRfKSxjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvblJlcXVlc3RJZF8pfSxlLnByb3RvdHlwZS5zZXRBbmNob3JDb3JuZXI9ZnVuY3Rpb24odCl7dGhpcy5hbmNob3JDb3JuZXJfPXR9LGUucHJvdG90eXBlLnNldEFuY2hvck1hcmdpbj1mdW5jdGlvbih0KXt0aGlzLmFuY2hvck1hcmdpbl8udG9wPXQudG9wfHwwLHRoaXMuYW5jaG9yTWFyZ2luXy5yaWdodD10LnJpZ2h0fHwwLHRoaXMuYW5jaG9yTWFyZ2luXy5ib3R0b209dC5ib3R0b218fDAsdGhpcy5hbmNob3JNYXJnaW5fLmxlZnQ9dC5sZWZ0fHwwfSxlLnByb3RvdHlwZS5zZXRJc0hvaXN0ZWQ9ZnVuY3Rpb24odCl7dGhpcy5pc0hvaXN0ZWRFbGVtZW50Xz10fSxlLnByb3RvdHlwZS5zZXRGaXhlZFBvc2l0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuaXNGaXhlZFBvc2l0aW9uXz10fSxlLnByb3RvdHlwZS5zZXRBYnNvbHV0ZVBvc2l0aW9uPWZ1bmN0aW9uKHQsZSl7dGhpcy5wb3NpdGlvbl8ueD10aGlzLmlzRmluaXRlXyh0KT90OjAsdGhpcy5wb3NpdGlvbl8ueT10aGlzLmlzRmluaXRlXyhlKT9lOjB9LGUucHJvdG90eXBlLnNldFF1aWNrT3Blbj1mdW5jdGlvbih0KXt0aGlzLmlzUXVpY2tPcGVuXz10fSxlLnByb3RvdHlwZS5pc09wZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc09wZW5ffSxlLnByb3RvdHlwZS5vcGVuPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmFkYXB0ZXJfLnNhdmVGb2N1cygpLHRoaXMuaXNRdWlja09wZW5ffHx0aGlzLmFkYXB0ZXJfLmFkZENsYXNzKGUuY3NzQ2xhc3Nlcy5BTklNQVRJTkdfT1BFTiksdGhpcy5hbmltYXRpb25SZXF1ZXN0SWRfPXJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3QuYWRhcHRlcl8uYWRkQ2xhc3MoZS5jc3NDbGFzc2VzLk9QRU4pLHQuZGltZW5zaW9uc189dC5hZGFwdGVyXy5nZXRJbm5lckRpbWVuc2lvbnMoKSx0LmF1dG9Qb3NpdGlvbl8oKSx0LmlzUXVpY2tPcGVuXz90LmFkYXB0ZXJfLm5vdGlmeU9wZW4oKTp0Lm9wZW5BbmltYXRpb25FbmRUaW1lcklkXz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5vcGVuQW5pbWF0aW9uRW5kVGltZXJJZF89MCx0LmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGUuY3NzQ2xhc3Nlcy5BTklNQVRJTkdfT1BFTiksdC5hZGFwdGVyXy5ub3RpZnlPcGVuKCl9LHIuZC5UUkFOU0lUSU9OX09QRU5fRFVSQVRJT04pfSksdGhpcy5pc09wZW5fPSEwfSxlLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5pc1F1aWNrT3Blbl98fHRoaXMuYWRhcHRlcl8uYWRkQ2xhc3MoZS5jc3NDbGFzc2VzLkFOSU1BVElOR19DTE9TRUQpLHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3QuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoZS5jc3NDbGFzc2VzLk9QRU4pLHQuaXNRdWlja09wZW5fP3QuYWRhcHRlcl8ubm90aWZ5Q2xvc2UoKTp0LmNsb3NlQW5pbWF0aW9uRW5kVGltZXJJZF89c2V0VGltZW91dChmdW5jdGlvbigpe3QuY2xvc2VBbmltYXRpb25FbmRUaW1lcklkXz0wLHQuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoZS5jc3NDbGFzc2VzLkFOSU1BVElOR19DTE9TRUQpLHQuYWRhcHRlcl8ubm90aWZ5Q2xvc2UoKX0sci5kLlRSQU5TSVRJT05fQ0xPU0VfRFVSQVRJT04pfSksdGhpcy5pc09wZW5fPSExLHRoaXMubWF5YmVSZXN0b3JlRm9jdXNfKCl9LGUucHJvdG90eXBlLmhhbmRsZUJvZHlDbGljaz1mdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldDt0aGlzLmFkYXB0ZXJfLmlzRWxlbWVudEluQ29udGFpbmVyKGUpfHx0aGlzLmNsb3NlKCl9LGUucHJvdG90eXBlLmhhbmRsZUtleWRvd249ZnVuY3Rpb24odCl7dmFyIGU9dC5rZXlDb2RlLG49dC5rZXksbz10LnNoaWZ0S2V5LGk9XCJUYWJcIj09PW58fDk9PT1lO1wiRXNjYXBlXCI9PT1ufHwyNz09PWU/dGhpcy5jbG9zZSgpOmkmJih0aGlzLmFkYXB0ZXJfLmlzTGFzdEVsZW1lbnRGb2N1c2VkKCkmJiFvPyh0aGlzLmFkYXB0ZXJfLmZvY3VzRmlyc3RFbGVtZW50KCksdC5wcmV2ZW50RGVmYXVsdCgpKTp0aGlzLmFkYXB0ZXJfLmlzRmlyc3RFbGVtZW50Rm9jdXNlZCgpJiZvJiYodGhpcy5hZGFwdGVyXy5mb2N1c0xhc3RFbGVtZW50KCksdC5wcmV2ZW50RGVmYXVsdCgpKSl9LGUucHJvdG90eXBlLmF1dG9Qb3NpdGlvbl89ZnVuY3Rpb24oKXt2YXIgdDt0aGlzLm1lYXN1cmVtZW50c189dGhpcy5nZXRBdXRvTGF5b3V0TWVhc3VyZW1lbnRzXygpO3ZhciBlPXRoaXMuZ2V0T3JpZ2luQ29ybmVyXygpLG49dGhpcy5nZXRNZW51U3VyZmFjZU1heEhlaWdodF8oZSksbz10aGlzLmhhc0JpdF8oZSxyLmIuQk9UVE9NKT9cImJvdHRvbVwiOlwidG9wXCIsaT10aGlzLmhhc0JpdF8oZSxyLmIuUklHSFQpP1wicmlnaHRcIjpcImxlZnRcIixzPXRoaXMuZ2V0SG9yaXpvbnRhbE9yaWdpbk9mZnNldF8oZSksdT10aGlzLmdldFZlcnRpY2FsT3JpZ2luT2Zmc2V0XyhlKSxhPXRoaXMubWVhc3VyZW1lbnRzXyxjPWEuYW5jaG9yU2l6ZSxsPWEuc3VyZmFjZVNpemUsZj0oKHQ9e30pW2ldPXMsdFtvXT11LHQpO2Mud2lkdGgvbC53aWR0aD5yLmQuQU5DSE9SX1RPX01FTlVfU1VSRkFDRV9XSURUSF9SQVRJTyYmKGk9XCJjZW50ZXJcIiksKHRoaXMuaXNIb2lzdGVkRWxlbWVudF98fHRoaXMuaXNGaXhlZFBvc2l0aW9uXykmJnRoaXMuYWRqdXN0UG9zaXRpb25Gb3JIb2lzdGVkRWxlbWVudF8oZiksdGhpcy5hZGFwdGVyXy5zZXRUcmFuc2Zvcm1PcmlnaW4oaStcIiBcIitvKSx0aGlzLmFkYXB0ZXJfLnNldFBvc2l0aW9uKGYpLHRoaXMuYWRhcHRlcl8uc2V0TWF4SGVpZ2h0KG4/bitcInB4XCI6XCJcIil9LGUucHJvdG90eXBlLmdldEF1dG9MYXlvdXRNZWFzdXJlbWVudHNfPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5hZGFwdGVyXy5nZXRBbmNob3JEaW1lbnNpb25zKCksZT10aGlzLmFkYXB0ZXJfLmdldEJvZHlEaW1lbnNpb25zKCksbj10aGlzLmFkYXB0ZXJfLmdldFdpbmRvd0RpbWVuc2lvbnMoKSxvPXRoaXMuYWRhcHRlcl8uZ2V0V2luZG93U2Nyb2xsKCk7cmV0dXJuIHR8fCh0PXt0b3A6dGhpcy5wb3NpdGlvbl8ueSxyaWdodDp0aGlzLnBvc2l0aW9uXy54LGJvdHRvbTp0aGlzLnBvc2l0aW9uXy55LGxlZnQ6dGhpcy5wb3NpdGlvbl8ueCx3aWR0aDowLGhlaWdodDowfSkse2FuY2hvclNpemU6dCxib2R5U2l6ZTplLHN1cmZhY2VTaXplOnRoaXMuZGltZW5zaW9uc18sdmlld3BvcnREaXN0YW5jZTp7dG9wOnQudG9wLHJpZ2h0Om4ud2lkdGgtdC5yaWdodCxib3R0b206bi5oZWlnaHQtdC5ib3R0b20sbGVmdDp0LmxlZnR9LHZpZXdwb3J0U2l6ZTpuLHdpbmRvd1Njcm9sbDpvfX0sZS5wcm90b3R5cGUuZ2V0T3JpZ2luQ29ybmVyXz1mdW5jdGlvbigpe3ZhciB0PXIuYS5UT1BfTEVGVCxlPXRoaXMubWVhc3VyZW1lbnRzXyxuPWUudmlld3BvcnREaXN0YW5jZSxvPWUuYW5jaG9yU2l6ZSxpPWUuc3VyZmFjZVNpemUscz10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLHIuYi5CT1RUT00pLHU9cz9uLnRvcCtvLmhlaWdodCt0aGlzLmFuY2hvck1hcmdpbl8uYm90dG9tOm4udG9wK3RoaXMuYW5jaG9yTWFyZ2luXy50b3AsYT1zP24uYm90dG9tLXRoaXMuYW5jaG9yTWFyZ2luXy5ib3R0b206bi5ib3R0b20rby5oZWlnaHQtdGhpcy5hbmNob3JNYXJnaW5fLnRvcCxjPWkuaGVpZ2h0LXUsbD1pLmhlaWdodC1hO2w+MCYmYzxsJiYodD10aGlzLnNldEJpdF8odCxyLmIuQk9UVE9NKSk7dmFyIGY9dGhpcy5hZGFwdGVyXy5pc1J0bCgpLGg9dGhpcy5oYXNCaXRfKHRoaXMuYW5jaG9yQ29ybmVyXyxyLmIuRkxJUF9SVEwpLGQ9dGhpcy5oYXNCaXRfKHRoaXMuYW5jaG9yQ29ybmVyXyxyLmIuUklHSFQpLHA9ZCYmIWZ8fCFkJiZoJiZmLG09cD9uLmxlZnQrby53aWR0aCt0aGlzLmFuY2hvck1hcmdpbl8ucmlnaHQ6bi5sZWZ0K3RoaXMuYW5jaG9yTWFyZ2luXy5sZWZ0LF89cD9uLnJpZ2h0LXRoaXMuYW5jaG9yTWFyZ2luXy5yaWdodDpuLnJpZ2h0K28ud2lkdGgtdGhpcy5hbmNob3JNYXJnaW5fLmxlZnQseT1pLndpZHRoLW0sZz1pLndpZHRoLV87cmV0dXJuKHk8MCYmcCYmZnx8ZCYmIXAmJnk8MHx8Zz4wJiZ5PGcpJiYodD10aGlzLnNldEJpdF8odCxyLmIuUklHSFQpKSx0fSxlLnByb3RvdHlwZS5nZXRNZW51U3VyZmFjZU1heEhlaWdodF89ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5tZWFzdXJlbWVudHNfLnZpZXdwb3J0RGlzdGFuY2Usbz0wLGk9dGhpcy5oYXNCaXRfKHQsci5iLkJPVFRPTSkscz10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLHIuYi5CT1RUT00pLHU9ZS5udW1iZXJzLk1BUkdJTl9UT19FREdFO3JldHVybiBpPyhvPW4udG9wK3RoaXMuYW5jaG9yTWFyZ2luXy50b3AtdSxzfHwobys9dGhpcy5tZWFzdXJlbWVudHNfLmFuY2hvclNpemUuaGVpZ2h0KSk6KG89bi5ib3R0b20tdGhpcy5hbmNob3JNYXJnaW5fLmJvdHRvbSt0aGlzLm1lYXN1cmVtZW50c18uYW5jaG9yU2l6ZS5oZWlnaHQtdSxzJiYoby09dGhpcy5tZWFzdXJlbWVudHNfLmFuY2hvclNpemUuaGVpZ2h0KSksb30sZS5wcm90b3R5cGUuZ2V0SG9yaXpvbnRhbE9yaWdpbk9mZnNldF89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5tZWFzdXJlbWVudHNfLmFuY2hvclNpemUsbj10aGlzLmhhc0JpdF8odCxyLmIuUklHSFQpLG89dGhpcy5oYXNCaXRfKHRoaXMuYW5jaG9yQ29ybmVyXyxyLmIuUklHSFQpO2lmKG4pe3ZhciBpPW8/ZS53aWR0aC10aGlzLmFuY2hvck1hcmdpbl8ubGVmdDp0aGlzLmFuY2hvck1hcmdpbl8ucmlnaHQ7cmV0dXJuIHRoaXMuaXNIb2lzdGVkRWxlbWVudF98fHRoaXMuaXNGaXhlZFBvc2l0aW9uXz9pLSh0aGlzLm1lYXN1cmVtZW50c18udmlld3BvcnRTaXplLndpZHRoLXRoaXMubWVhc3VyZW1lbnRzXy5ib2R5U2l6ZS53aWR0aCk6aX1yZXR1cm4gbz9lLndpZHRoLXRoaXMuYW5jaG9yTWFyZ2luXy5yaWdodDp0aGlzLmFuY2hvck1hcmdpbl8ubGVmdH0sZS5wcm90b3R5cGUuZ2V0VmVydGljYWxPcmlnaW5PZmZzZXRfPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubWVhc3VyZW1lbnRzXy5hbmNob3JTaXplLG49dGhpcy5oYXNCaXRfKHQsci5iLkJPVFRPTSksbz10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLHIuYi5CT1RUT00pO3JldHVybiBuP28/ZS5oZWlnaHQtdGhpcy5hbmNob3JNYXJnaW5fLnRvcDotdGhpcy5hbmNob3JNYXJnaW5fLmJvdHRvbTpvP2UuaGVpZ2h0K3RoaXMuYW5jaG9yTWFyZ2luXy5ib3R0b206dGhpcy5hbmNob3JNYXJnaW5fLnRvcH0sZS5wcm90b3R5cGUuYWRqdXN0UG9zaXRpb25Gb3JIb2lzdGVkRWxlbWVudF89ZnVuY3Rpb24odCl7dmFyIGUsbixpPXRoaXMubWVhc3VyZW1lbnRzXyxyPWkud2luZG93U2Nyb2xsLHM9aS52aWV3cG9ydERpc3RhbmNlLHU9T2JqZWN0LmtleXModCk7dHJ5e2Zvcih2YXIgYT1vLmQodSksYz1hLm5leHQoKTshYy5kb25lO2M9YS5uZXh0KCkpe3ZhciBsPWMudmFsdWUsZj10W2xdfHwwO2YrPXNbbF0sdGhpcy5pc0ZpeGVkUG9zaXRpb25ffHwoXCJ0b3BcIj09PWw/Zis9ci55OlwiYm90dG9tXCI9PT1sP2YtPXIueTpcImxlZnRcIj09PWw/Zis9ci54OmYtPXIueCksdFtsXT1mfX1jYXRjaCh0KXtlPXtlcnJvcjp0fX1maW5hbGx5e3RyeXtjJiYhYy5kb25lJiYobj1hLnJldHVybikmJm4uY2FsbChhKX1maW5hbGx5e2lmKGUpdGhyb3cgZS5lcnJvcn19fSxlLnByb3RvdHlwZS5tYXliZVJlc3RvcmVGb2N1c189ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmFkYXB0ZXJfLmlzRm9jdXNlZCgpLGU9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCYmdGhpcy5hZGFwdGVyXy5pc0VsZW1lbnRJbkNvbnRhaW5lcihkb2N1bWVudC5hY3RpdmVFbGVtZW50KTsodHx8ZSkmJnRoaXMuYWRhcHRlcl8ucmVzdG9yZUZvY3VzKCl9LGUucHJvdG90eXBlLmhhc0JpdF89ZnVuY3Rpb24odCxlKXtyZXR1cm4gQm9vbGVhbih0JmUpfSxlLnByb3RvdHlwZS5zZXRCaXRfPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHR8ZX0sZS5wcm90b3R5cGUuaXNGaW5pdGVfPWZ1bmN0aW9uKHQpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiB0JiZpc0Zpbml0ZSh0KX0sZX0oaS5hKTtlLmRlZmF1bHQ9c30sMjg6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24uZChlLFwiYVwiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZvaWQgMD09PXQmJih0PXt9KSx0aGlzLmFkYXB0ZXJfPXR9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcInN0cmluZ3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJudW1iZXJzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe30sdH0oKX0sMzpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJjXCIsZnVuY3Rpb24oKXtyZXR1cm4gcn0pLG4uZChlLFwiZVwiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSxuLmQoZSxcImRcIixmdW5jdGlvbigpe3JldHVybiB1fSksbi5kKGUsXCJiXCIsZnVuY3Rpb24oKXtyZXR1cm4gb30pLG4uZChlLFwiYVwiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIG8saSxyPXtBTkNIT1I6XCJtZGMtbWVudS1zdXJmYWNlLS1hbmNob3JcIixBTklNQVRJTkdfQ0xPU0VEOlwibWRjLW1lbnUtc3VyZmFjZS0tYW5pbWF0aW5nLWNsb3NlZFwiLEFOSU1BVElOR19PUEVOOlwibWRjLW1lbnUtc3VyZmFjZS0tYW5pbWF0aW5nLW9wZW5cIixGSVhFRDpcIm1kYy1tZW51LXN1cmZhY2UtLWZpeGVkXCIsT1BFTjpcIm1kYy1tZW51LXN1cmZhY2UtLW9wZW5cIixST09UOlwibWRjLW1lbnUtc3VyZmFjZVwifSxzPXtDTE9TRURfRVZFTlQ6XCJNRENNZW51U3VyZmFjZTpjbG9zZWRcIixPUEVORURfRVZFTlQ6XCJNRENNZW51U3VyZmFjZTpvcGVuZWRcIixGT0NVU0FCTEVfRUxFTUVOVFM6W1wiYnV0dG9uOm5vdCg6ZGlzYWJsZWQpXCIsJ1tocmVmXTpub3QoW2FyaWEtZGlzYWJsZWQ9XCJ0cnVlXCJdKScsXCJpbnB1dDpub3QoOmRpc2FibGVkKVwiLFwic2VsZWN0Om5vdCg6ZGlzYWJsZWQpXCIsXCJ0ZXh0YXJlYTpub3QoOmRpc2FibGVkKVwiLCdbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9XCItMVwiXSk6bm90KFthcmlhLWRpc2FibGVkPVwidHJ1ZVwiXSknXS5qb2luKFwiLCBcIil9LHU9e1RSQU5TSVRJT05fT1BFTl9EVVJBVElPTjoxMjAsVFJBTlNJVElPTl9DTE9TRV9EVVJBVElPTjo3NSxNQVJHSU5fVE9fRURHRTozMixBTkNIT1JfVE9fTUVOVV9TVVJGQUNFX1dJRFRIX1JBVElPOi42N307IWZ1bmN0aW9uKHQpe3RbdC5CT1RUT009MV09XCJCT1RUT01cIix0W3QuQ0VOVEVSPTJdPVwiQ0VOVEVSXCIsdFt0LlJJR0hUPTRdPVwiUklHSFRcIix0W3QuRkxJUF9SVEw9OF09XCJGTElQX1JUTFwifShvfHwobz17fSkpLGZ1bmN0aW9uKHQpe3RbdC5UT1BfTEVGVD0wXT1cIlRPUF9MRUZUXCIsdFt0LlRPUF9SSUdIVD00XT1cIlRPUF9SSUdIVFwiLHRbdC5CT1RUT01fTEVGVD0xXT1cIkJPVFRPTV9MRUZUXCIsdFt0LkJPVFRPTV9SSUdIVD01XT1cIkJPVFRPTV9SSUdIVFwiLHRbdC5UT1BfU1RBUlQ9OF09XCJUT1BfU1RBUlRcIix0W3QuVE9QX0VORD0xMl09XCJUT1BfRU5EXCIsdFt0LkJPVFRPTV9TVEFSVD05XT1cIkJPVFRPTV9TVEFSVFwiLHRbdC5CT1RUT01fRU5EPTEzXT1cIkJPVFRPTV9FTkRcIn0oaXx8KGk9e30pKX19KX0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVudS1zdXJmYWNlLmpzLm1hcCIsIlxudmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbWVudS1zdXJmYWNlLmNzc1wiKTtcblxuaWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cbnZhciB0cmFuc2Zvcm07XG52YXIgaW5zZXJ0SW50bztcblxuXG5cbnZhciBvcHRpb25zID0ge1wiaG1yXCI6dHJ1ZX1cblxub3B0aW9ucy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1cbm9wdGlvbnMuaW5zZXJ0SW50byA9IHVuZGVmaW5lZDtcblxudmFyIHVwZGF0ZSA9IHJlcXVpcmUoXCIhLi4vLi4vLi4vc3R5bGUtbG9hZGVyL2xpYi9hZGRTdHlsZXMuanNcIikoY29udGVudCwgb3B0aW9ucyk7XG5cbmlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXG5pZihtb2R1bGUuaG90KSB7XG5cdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbWVudS1zdXJmYWNlLmNzc1wiLCBmdW5jdGlvbigpIHtcblx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9tZW51LXN1cmZhY2UuY3NzXCIpO1xuXG5cdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cblx0XHR2YXIgbG9jYWxzID0gKGZ1bmN0aW9uKGEsIGIpIHtcblx0XHRcdHZhciBrZXksIGlkeCA9IDA7XG5cblx0XHRcdGZvcihrZXkgaW4gYSkge1xuXHRcdFx0XHRpZighYiB8fCBhW2tleV0gIT09IGJba2V5XSkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRpZHgrKztcblx0XHRcdH1cblxuXHRcdFx0Zm9yKGtleSBpbiBiKSBpZHgtLTtcblxuXHRcdFx0cmV0dXJuIGlkeCA9PT0gMDtcblx0XHR9KGNvbnRlbnQubG9jYWxzLCBuZXdDb250ZW50LmxvY2FscykpO1xuXG5cdFx0aWYoIWxvY2FscykgdGhyb3cgbmV3IEVycm9yKCdBYm9ydGluZyBDU1MgSE1SIGR1ZSB0byBjaGFuZ2VkIGNzcy1tb2R1bGVzIGxvY2Fscy4nKTtcblxuXHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0fSk7XG5cblx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG59IiwiIWZ1bmN0aW9uKHQsZSl7aWYoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUpbW9kdWxlLmV4cG9ydHM9ZShyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcImNsYXNzbmFtZXNcIikscmVxdWlyZShcIkBtYXRlcmlhbC9yZWFjdC1saXN0L2Rpc3QvaW5kZXguanNcIikscmVxdWlyZShcIkBtYXRlcmlhbC9yZWFjdC1tZW51LXN1cmZhY2UvZGlzdC9pbmRleC5qc1wiKSk7ZWxzZSBpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQpZGVmaW5lKFtcInJlYWN0XCIsXCJjbGFzc25hbWVzXCIsXCJAbWF0ZXJpYWwvcmVhY3QtbGlzdC9kaXN0L2luZGV4LmpzXCIsXCJAbWF0ZXJpYWwvcmVhY3QtbWVudS1zdXJmYWNlL2Rpc3QvaW5kZXguanNcIl0sZSk7ZWxzZXt2YXIgbj1cIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9lKHJlcXVpcmUoXCJyZWFjdFwiKSxyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSxyZXF1aXJlKFwiQG1hdGVyaWFsL3JlYWN0LWxpc3QvZGlzdC9pbmRleC5qc1wiKSxyZXF1aXJlKFwiQG1hdGVyaWFsL3JlYWN0LW1lbnUtc3VyZmFjZS9kaXN0L2luZGV4LmpzXCIpKTplKHQucmVhY3QsdC5jbGFzc25hbWVzLHRbXCJAbWF0ZXJpYWwvcmVhY3QtbGlzdC9kaXN0L2luZGV4LmpzXCJdLHRbXCJAbWF0ZXJpYWwvcmVhY3QtbWVudS1zdXJmYWNlL2Rpc3QvaW5kZXguanNcIl0pO2Zvcih2YXIgaSBpbiBuKShcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnQpW2ldPW5baV19fShcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZj9zZWxmOnRoaXMsZnVuY3Rpb24odCxlLG4saSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4oaSl7aWYoZVtpXSlyZXR1cm4gZVtpXS5leHBvcnRzO3ZhciByPWVbaV09e2k6aSxsOiExLGV4cG9ydHM6e319O3JldHVybiB0W2ldLmNhbGwoci5leHBvcnRzLHIsci5leHBvcnRzLG4pLHIubD0hMCxyLmV4cG9ydHN9cmV0dXJuIG4ubT10LG4uYz1lLG4uZD1mdW5jdGlvbih0LGUsaSl7bi5vKHQsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2VudW1lcmFibGU6ITAsZ2V0Oml9KX0sbi5yPWZ1bmN0aW9uKHQpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbih0LGUpe2lmKDEmZSYmKHQ9bih0KSksOCZlKXJldHVybiB0O2lmKDQmZSYmXCJvYmplY3RcIj09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgaT1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihpKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTp0fSksMiZlJiZcInN0cmluZ1wiIT10eXBlb2YgdClmb3IodmFyIHIgaW4gdCluLmQoaSxyLGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfS5iaW5kKG51bGwscikpO3JldHVybiBpfSxuLm49ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIG4uZChlLFwiYVwiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPVwiXCIsbihuLnM9OTgpfSh7MDpmdW5jdGlvbihlLG4pe2UuZXhwb3J0cz10fSwxOmZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWV9LDEwMDpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4oaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSksbz10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihvPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciByIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scz10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIGkgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKSYmZS5pbmRleE9mKGkpPDAmJihuW2ldPXRbaV0pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPTA7Zm9yKGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtyPGkubGVuZ3RoO3IrKyllLmluZGV4T2YoaVtyXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsaVtyXSkmJihuW2lbcl1dPXRbaVtyXV0pfXJldHVybiBufSxhPXRoaXMmJnRoaXMuX19pbXBvcnRTdGFyfHxmdW5jdGlvbih0KXtpZih0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIGU9e307aWYobnVsbCE9dClmb3IodmFyIG4gaW4gdClPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pJiYoZVtuXT10W25dKTtyZXR1cm4gZS5kZWZhdWx0PXQsZX0sdT10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgYz1hKG4oMCkpLGQ9dShuKDMyKSksbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBlLmxpc3RJbnN0YW5jZT1jLmNyZWF0ZVJlZigpLGUuaGFuZGxlU2VsZWN0PWZ1bmN0aW9uKHQsbil7ZS5wcm9wcy5oYW5kbGVTZWxlY3QodCxuKSxlLnByb3BzLmhhbmRsZUl0ZW1BY3Rpb24oZS5saXN0RWxlbWVudHNbdF0pfSxlLmF0dGFjaFJlZj1mdW5jdGlvbih0KXt2YXIgbj1lLnByb3BzLmlubmVyUmVmO2UubGlzdEluc3RhbmNlLmN1cnJlbnQ9dCxuJiYoXCJmdW5jdGlvblwiIT10eXBlb2Ygbj9uLmN1cnJlbnQ9dDpuKHQpKX0sZX1yZXR1cm4gcihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImxpc3RFbGVtZW50c1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5saXN0SW5zdGFuY2UuY3VycmVudD90aGlzLmxpc3RJbnN0YW5jZS5jdXJyZW50Lmxpc3RFbGVtZW50czpbXX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9dFtcImFyaWEtaGlkZGVuXCJdLG49KHQuaGFuZGxlU2VsZWN0LHQuaGFuZGxlSXRlbUFjdGlvbix0LnJvbGUpLGk9KHQuaW5uZXJSZWYsdC5jaGlsZHJlbikscj0odC5yZWYscyh0LFtcImFyaWEtaGlkZGVuXCIsXCJoYW5kbGVTZWxlY3RcIixcImhhbmRsZUl0ZW1BY3Rpb25cIixcInJvbGVcIixcImlubmVyUmVmXCIsXCJjaGlsZHJlblwiLFwicmVmXCJdKSk7cmV0dXJuIGMuY3JlYXRlRWxlbWVudChkLmRlZmF1bHQsbyh7XCJhcmlhLWhpZGRlblwiOnZvaWQgMCE9PWU/ZTpcInRydWVcIixyb2xlOm58fFwibWVudVwiLGhhbmRsZVNlbGVjdDp0aGlzLmhhbmRsZVNlbGVjdCxyZWY6dGhpcy5hdHRhY2hSZWZ9LHIpLGkpfSxlLmRlZmF1bHRQcm9wcz17Y2xhc3NOYW1lOlwiXCIsaGFuZGxlU2VsZWN0OmZ1bmN0aW9uKCl7fSxoYW5kbGVJdGVtQWN0aW9uOmZ1bmN0aW9uKCl7fX0sZX0oYy5Db21wb25lbnQpO2UuZGVmYXVsdD1sfSwxMDE6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9KSh0LGUpfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLG89dGhpcyYmdGhpcy5fX2Fzc2lnbnx8ZnVuY3Rpb24oKXtyZXR1cm4obz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgciBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmKHRbcl09ZVtyXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHM9dGhpcyYmdGhpcy5fX3Jlc3R8fGZ1bmN0aW9uKHQsZSl7dmFyIG49e307Zm9yKHZhciBpIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsaSkmJmUuaW5kZXhPZihpKTwwJiYobltpXT10W2ldKTtpZihudWxsIT10JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj0wO2ZvcihpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7cjxpLmxlbmd0aDtyKyspZS5pbmRleE9mKGlbcl0pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LGlbcl0pJiYobltpW3JdXT10W2lbcl1dKX1yZXR1cm4gbn0sYT10aGlzJiZ0aGlzLl9faW1wb3J0U3Rhcnx8ZnVuY3Rpb24odCl7aWYodCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBlPXt9O2lmKG51bGwhPXQpZm9yKHZhciBuIGluIHQpT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGVbbl09dFtuXSk7cmV0dXJuIGUuZGVmYXVsdD10LGV9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciB1PWEobigwKSksYz1uKDMyKSxkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcyxlPXQucm9sZSxuPXZvaWQgMD09PWU/XCJtZW51aXRlbVwiOmUsaT10LmNoaWxkcmVuLHI9KHQuY29tcHV0ZUJvdW5kaW5nUmVjdCxzKHQsW1wicm9sZVwiLFwiY2hpbGRyZW5cIixcImNvbXB1dGVCb3VuZGluZ1JlY3RcIl0pKTtyZXR1cm4gdS5jcmVhdGVFbGVtZW50KGMuTGlzdEl0ZW0sbyh7cm9sZTpufSxyKSxpKX0sZX0odS5Db21wb25lbnQpO2UuZGVmYXVsdD1kfSwxNDg6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24ucihlKTtcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvcjtcbi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXG5MaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG5LSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVEXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cblxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL3ZhciBpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9KSh0LGUpfTtmdW5jdGlvbiByKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfXZhciBvPWZ1bmN0aW9uKCl7cmV0dXJuKG89T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtmdW5jdGlvbiBzKHQpe3ZhciBlPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdLG49MDtyZXR1cm4gZT9lLmNhbGwodCk6e25leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdCYmbj49dC5sZW5ndGgmJih0PXZvaWQgMCkse3ZhbHVlOnQmJnRbbisrXSxkb25lOiF0fX19fVxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG52YXIgYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dm9pZCAwPT09dCYmKHQ9e30pLHRoaXMuYWRhcHRlcl89dH1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJjc3NDbGFzc2VzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwic3RyaW5nc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIm51bWJlcnNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJkZWZhdWx0QWRhcHRlclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7fSx0fSgpLHU9e0xJU1RfSVRFTV9BQ1RJVkFURURfQ0xBU1M6XCJtZGMtbGlzdC1pdGVtLS1hY3RpdmF0ZWRcIixMSVNUX0lURU1fQ0xBU1M6XCJtZGMtbGlzdC1pdGVtXCIsTElTVF9JVEVNX1NFTEVDVEVEX0NMQVNTOlwibWRjLWxpc3QtaXRlbS0tc2VsZWN0ZWRcIixST09UOlwibWRjLWxpc3RcIn0sYz17QUNUSU9OX0VWRU5UOlwiTURDTGlzdDphY3Rpb25cIixBUklBX0NIRUNLRUQ6XCJhcmlhLWNoZWNrZWRcIixBUklBX0NIRUNLRURfQ0hFQ0tCT1hfU0VMRUNUT1I6J1tyb2xlPVwiY2hlY2tib3hcIl1bYXJpYS1jaGVja2VkPVwidHJ1ZVwiXScsQVJJQV9DSEVDS0VEX1JBRElPX1NFTEVDVE9SOidbcm9sZT1cInJhZGlvXCJdW2FyaWEtY2hlY2tlZD1cInRydWVcIl0nLEFSSUFfQ1VSUkVOVDpcImFyaWEtY3VycmVudFwiLEFSSUFfT1JJRU5UQVRJT046XCJhcmlhLW9yaWVudGF0aW9uXCIsQVJJQV9PUklFTlRBVElPTl9IT1JJWk9OVEFMOlwiaG9yaXpvbnRhbFwiLEFSSUFfUk9MRV9DSEVDS0JPWF9TRUxFQ1RPUjonW3JvbGU9XCJjaGVja2JveFwiXScsQVJJQV9TRUxFQ1RFRDpcImFyaWEtc2VsZWN0ZWRcIixDSEVDS0JPWF9SQURJT19TRUxFQ1RPUjonaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOm5vdCg6ZGlzYWJsZWQpLCBpbnB1dFt0eXBlPVwicmFkaW9cIl06bm90KDpkaXNhYmxlZCknLENIRUNLQk9YX1NFTEVDVE9SOidpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06bm90KDpkaXNhYmxlZCknLENISUxEX0VMRU1FTlRTX1RPX1RPR0dMRV9UQUJJTkRFWDpcIlxcbiAgICAuXCIrdS5MSVNUX0lURU1fQ0xBU1MrXCIgYnV0dG9uOm5vdCg6ZGlzYWJsZWQpLFxcbiAgICAuXCIrdS5MSVNUX0lURU1fQ0xBU1MrXCIgYVxcbiAgXCIsRU5BQkxFRF9JVEVNU19TRUxFQ1RPUjpcIi5tZGMtbGlzdC1pdGVtOm5vdCgubWRjLWxpc3QtaXRlbS0tZGlzYWJsZWQpXCIsRk9DVVNBQkxFX0NISUxEX0VMRU1FTlRTOlwiXFxuICAgIC5cIit1LkxJU1RfSVRFTV9DTEFTUytcIiBidXR0b246bm90KDpkaXNhYmxlZCksXFxuICAgIC5cIit1LkxJU1RfSVRFTV9DTEFTUytcIiBhLFxcbiAgICAuXCIrdS5MSVNUX0lURU1fQ0xBU1MrJyBpbnB1dFt0eXBlPVwicmFkaW9cIl06bm90KDpkaXNhYmxlZCksXFxuICAgIC4nK3UuTElTVF9JVEVNX0NMQVNTKycgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOm5vdCg6ZGlzYWJsZWQpXFxuICAnLFJBRElPX1NFTEVDVE9SOidpbnB1dFt0eXBlPVwicmFkaW9cIl06bm90KDpkaXNhYmxlZCknfSxkPXtVTlNFVF9JTkRFWDotMX0sbD1bXCJpbnB1dFwiLFwiYnV0dG9uXCIsXCJ0ZXh0YXJlYVwiLFwic2VsZWN0XCJdO3ZhciBoLHAsZj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciBpPXQuY2FsbCh0aGlzLG8oe30sZS5kZWZhdWx0QWRhcHRlcixuKSl8fHRoaXM7cmV0dXJuIGkud3JhcEZvY3VzXz0hMSxpLmlzVmVydGljYWxfPSEwLGkuaXNTaW5nbGVTZWxlY3Rpb25MaXN0Xz0hMSxpLnNlbGVjdGVkSW5kZXhfPWQuVU5TRVRfSU5ERVgsaS5mb2N1c2VkSXRlbUluZGV4Xz1kLlVOU0VUX0lOREVYLGkudXNlQWN0aXZhdGVkQ2xhc3NfPSExLGkuYXJpYUN1cnJlbnRBdHRyVmFsdWVfPW51bGwsaS5pc0NoZWNrYm94TGlzdF89ITEsaS5pc1JhZGlvTGlzdF89ITEsaX1yZXR1cm4gcihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwic3RyaW5nc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJudW1iZXJzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2FkZENsYXNzRm9yRWxlbWVudEluZGV4OmZ1bmN0aW9uKCl7fSxmb2N1c0l0ZW1BdEluZGV4OmZ1bmN0aW9uKCl7fSxnZXRBdHRyaWJ1dGVGb3JFbGVtZW50SW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sZ2V0Rm9jdXNlZEVsZW1lbnRJbmRleDpmdW5jdGlvbigpe3JldHVybiAwfSxnZXRMaXN0SXRlbUNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGhhc0NoZWNrYm94QXRJbmRleDpmdW5jdGlvbigpe3JldHVybiExfSxoYXNSYWRpb0F0SW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXNDaGVja2JveENoZWNrZWRBdEluZGV4OmZ1bmN0aW9uKCl7cmV0dXJuITF9LGlzRm9jdXNJbnNpZGVMaXN0OmZ1bmN0aW9uKCl7cmV0dXJuITF9LG5vdGlmeUFjdGlvbjpmdW5jdGlvbigpe30scmVtb3ZlQ2xhc3NGb3JFbGVtZW50SW5kZXg6ZnVuY3Rpb24oKXt9LHNldEF0dHJpYnV0ZUZvckVsZW1lbnRJbmRleDpmdW5jdGlvbigpe30sc2V0Q2hlY2tlZENoZWNrYm94T3JSYWRpb0F0SW5kZXg6ZnVuY3Rpb24oKXt9LHNldFRhYkluZGV4Rm9yTGlzdEl0ZW1DaGlsZHJlbjpmdW5jdGlvbigpe319fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmxheW91dD1mdW5jdGlvbigpezAhPT10aGlzLmFkYXB0ZXJfLmdldExpc3RJdGVtQ291bnQoKSYmKHRoaXMuYWRhcHRlcl8uaGFzQ2hlY2tib3hBdEluZGV4KDApP3RoaXMuaXNDaGVja2JveExpc3RfPSEwOnRoaXMuYWRhcHRlcl8uaGFzUmFkaW9BdEluZGV4KDApJiYodGhpcy5pc1JhZGlvTGlzdF89ITApKX0sZS5wcm90b3R5cGUuc2V0V3JhcEZvY3VzPWZ1bmN0aW9uKHQpe3RoaXMud3JhcEZvY3VzXz10fSxlLnByb3RvdHlwZS5zZXRWZXJ0aWNhbE9yaWVudGF0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuaXNWZXJ0aWNhbF89dH0sZS5wcm90b3R5cGUuc2V0U2luZ2xlU2VsZWN0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuaXNTaW5nbGVTZWxlY3Rpb25MaXN0Xz10fSxlLnByb3RvdHlwZS5zZXRVc2VBY3RpdmF0ZWRDbGFzcz1mdW5jdGlvbih0KXt0aGlzLnVzZUFjdGl2YXRlZENsYXNzXz10fSxlLnByb3RvdHlwZS5nZXRTZWxlY3RlZEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0ZWRJbmRleF99LGUucHJvdG90eXBlLnNldFNlbGVjdGVkSW5kZXg9ZnVuY3Rpb24odCl7dGhpcy5pc0luZGV4VmFsaWRfKHQpJiYodGhpcy5pc0NoZWNrYm94TGlzdF8/dGhpcy5zZXRDaGVja2JveEF0SW5kZXhfKHQpOnRoaXMuaXNSYWRpb0xpc3RfP3RoaXMuc2V0UmFkaW9BdEluZGV4Xyh0KTp0aGlzLnNldFNpbmdsZVNlbGVjdGlvbkF0SW5kZXhfKHQpKX0sZS5wcm90b3R5cGUuaGFuZGxlRm9jdXNJbj1mdW5jdGlvbih0LGUpe2U+PTAmJnRoaXMuYWRhcHRlcl8uc2V0VGFiSW5kZXhGb3JMaXN0SXRlbUNoaWxkcmVuKGUsXCIwXCIpfSxlLnByb3RvdHlwZS5oYW5kbGVGb2N1c091dD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7ZT49MCYmdGhpcy5hZGFwdGVyXy5zZXRUYWJJbmRleEZvckxpc3RJdGVtQ2hpbGRyZW4oZSxcIi0xXCIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtuLmFkYXB0ZXJfLmlzRm9jdXNJbnNpZGVMaXN0KCl8fG4uc2V0VGFiaW5kZXhUb0ZpcnN0U2VsZWN0ZWRJdGVtXygpfSwwKX0sZS5wcm90b3R5cGUuaGFuZGxlS2V5ZG93bj1mdW5jdGlvbih0LGUsbil7dmFyIGk9XCJBcnJvd0xlZnRcIj09PXQua2V5fHwzNz09PXQua2V5Q29kZSxyPVwiQXJyb3dVcFwiPT09dC5rZXl8fDM4PT09dC5rZXlDb2RlLG89XCJBcnJvd1JpZ2h0XCI9PT10LmtleXx8Mzk9PT10LmtleUNvZGUscz1cIkFycm93RG93blwiPT09dC5rZXl8fDQwPT09dC5rZXlDb2RlLGE9XCJIb21lXCI9PT10LmtleXx8MzY9PT10LmtleUNvZGUsdT1cIkVuZFwiPT09dC5rZXl8fDM1PT09dC5rZXlDb2RlLGM9XCJFbnRlclwiPT09dC5rZXl8fDEzPT09dC5rZXlDb2RlLGw9XCJTcGFjZVwiPT09dC5rZXl8fDMyPT09dC5rZXlDb2RlLGg9dGhpcy5hZGFwdGVyXy5nZXRGb2N1c2VkRWxlbWVudEluZGV4KCkscD1kLlVOU0VUX0lOREVYO2lmKCEoaD09PWQuVU5TRVRfSU5ERVgmJihoPW4pPDApKXtpZih0aGlzLmlzVmVydGljYWxfJiZzfHwhdGhpcy5pc1ZlcnRpY2FsXyYmbyl0aGlzLnByZXZlbnREZWZhdWx0RXZlbnRfKHQpLHA9dGhpcy5mb2N1c05leHRFbGVtZW50KGgpO2Vsc2UgaWYodGhpcy5pc1ZlcnRpY2FsXyYmcnx8IXRoaXMuaXNWZXJ0aWNhbF8mJmkpdGhpcy5wcmV2ZW50RGVmYXVsdEV2ZW50Xyh0KSxwPXRoaXMuZm9jdXNQcmV2RWxlbWVudChoKTtlbHNlIGlmKGEpdGhpcy5wcmV2ZW50RGVmYXVsdEV2ZW50Xyh0KSxwPXRoaXMuZm9jdXNGaXJzdEVsZW1lbnQoKTtlbHNlIGlmKHUpdGhpcy5wcmV2ZW50RGVmYXVsdEV2ZW50Xyh0KSxwPXRoaXMuZm9jdXNMYXN0RWxlbWVudCgpO2Vsc2UgaWYoKGN8fGwpJiZlKXt2YXIgZj10LnRhcmdldDtpZihmJiZcIkFcIj09PWYudGFnTmFtZSYmYylyZXR1cm47dGhpcy5wcmV2ZW50RGVmYXVsdEV2ZW50Xyh0KSx0aGlzLmlzU2VsZWN0YWJsZUxpc3RfKCkmJnRoaXMuc2V0U2VsZWN0ZWRJbmRleE9uQWN0aW9uXyhoKSx0aGlzLmFkYXB0ZXJfLm5vdGlmeUFjdGlvbihoKX10aGlzLmZvY3VzZWRJdGVtSW5kZXhfPWgscD49MCYmKHRoaXMuc2V0VGFiaW5kZXhBdEluZGV4XyhwKSx0aGlzLmZvY3VzZWRJdGVtSW5kZXhfPXApfX0sZS5wcm90b3R5cGUuaGFuZGxlQ2xpY2s9ZnVuY3Rpb24odCxlKXt0IT09ZC5VTlNFVF9JTkRFWCYmKHRoaXMuaXNTZWxlY3RhYmxlTGlzdF8oKSYmdGhpcy5zZXRTZWxlY3RlZEluZGV4T25BY3Rpb25fKHQsZSksdGhpcy5hZGFwdGVyXy5ub3RpZnlBY3Rpb24odCksdGhpcy5zZXRUYWJpbmRleEF0SW5kZXhfKHQpLHRoaXMuZm9jdXNlZEl0ZW1JbmRleF89dCl9LGUucHJvdG90eXBlLmZvY3VzTmV4dEVsZW1lbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dCsxO2lmKGU+PXRoaXMuYWRhcHRlcl8uZ2V0TGlzdEl0ZW1Db3VudCgpKXtpZighdGhpcy53cmFwRm9jdXNfKXJldHVybiB0O2U9MH1yZXR1cm4gdGhpcy5hZGFwdGVyXy5mb2N1c0l0ZW1BdEluZGV4KGUpLGV9LGUucHJvdG90eXBlLmZvY3VzUHJldkVsZW1lbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dC0xO2lmKGU8MCl7aWYoIXRoaXMud3JhcEZvY3VzXylyZXR1cm4gdDtlPXRoaXMuYWRhcHRlcl8uZ2V0TGlzdEl0ZW1Db3VudCgpLTF9cmV0dXJuIHRoaXMuYWRhcHRlcl8uZm9jdXNJdGVtQXRJbmRleChlKSxlfSxlLnByb3RvdHlwZS5mb2N1c0ZpcnN0RWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFkYXB0ZXJfLmZvY3VzSXRlbUF0SW5kZXgoMCksMH0sZS5wcm90b3R5cGUuZm9jdXNMYXN0RWxlbWVudD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYWRhcHRlcl8uZ2V0TGlzdEl0ZW1Db3VudCgpLTE7cmV0dXJuIHRoaXMuYWRhcHRlcl8uZm9jdXNJdGVtQXRJbmRleCh0KSx0fSxlLnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdEV2ZW50Xz1mdW5jdGlvbih0KXt2YXIgZT0oXCJcIit0LnRhcmdldC50YWdOYW1lKS50b0xvd2VyQ2FzZSgpOy0xPT09bC5pbmRleE9mKGUpJiZ0LnByZXZlbnREZWZhdWx0KCl9LGUucHJvdG90eXBlLnNldFNpbmdsZVNlbGVjdGlvbkF0SW5kZXhfPWZ1bmN0aW9uKHQpe2lmKHRoaXMuc2VsZWN0ZWRJbmRleF8hPT10KXt2YXIgZT11LkxJU1RfSVRFTV9TRUxFQ1RFRF9DTEFTUzt0aGlzLnVzZUFjdGl2YXRlZENsYXNzXyYmKGU9dS5MSVNUX0lURU1fQUNUSVZBVEVEX0NMQVNTKSx0aGlzLnNlbGVjdGVkSW5kZXhfIT09ZC5VTlNFVF9JTkRFWCYmdGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzc0ZvckVsZW1lbnRJbmRleCh0aGlzLnNlbGVjdGVkSW5kZXhfLGUpLHRoaXMuYWRhcHRlcl8uYWRkQ2xhc3NGb3JFbGVtZW50SW5kZXgodCxlKSx0aGlzLnNldEFyaWFGb3JTaW5nbGVTZWxlY3Rpb25BdEluZGV4Xyh0KSx0aGlzLnNlbGVjdGVkSW5kZXhfPXR9fSxlLnByb3RvdHlwZS5zZXRBcmlhRm9yU2luZ2xlU2VsZWN0aW9uQXRJbmRleF89ZnVuY3Rpb24odCl7dGhpcy5zZWxlY3RlZEluZGV4Xz09PWQuVU5TRVRfSU5ERVgmJih0aGlzLmFyaWFDdXJyZW50QXR0clZhbHVlXz10aGlzLmFkYXB0ZXJfLmdldEF0dHJpYnV0ZUZvckVsZW1lbnRJbmRleCh0LGMuQVJJQV9DVVJSRU5UKSk7dmFyIGU9bnVsbCE9PXRoaXMuYXJpYUN1cnJlbnRBdHRyVmFsdWVfLG49ZT9jLkFSSUFfQ1VSUkVOVDpjLkFSSUFfU0VMRUNURUQ7dGhpcy5zZWxlY3RlZEluZGV4XyE9PWQuVU5TRVRfSU5ERVgmJnRoaXMuYWRhcHRlcl8uc2V0QXR0cmlidXRlRm9yRWxlbWVudEluZGV4KHRoaXMuc2VsZWN0ZWRJbmRleF8sbixcImZhbHNlXCIpO3ZhciBpPWU/dGhpcy5hcmlhQ3VycmVudEF0dHJWYWx1ZV86XCJ0cnVlXCI7dGhpcy5hZGFwdGVyXy5zZXRBdHRyaWJ1dGVGb3JFbGVtZW50SW5kZXgodCxuLGkpfSxlLnByb3RvdHlwZS5zZXRSYWRpb0F0SW5kZXhfPWZ1bmN0aW9uKHQpe3RoaXMuYWRhcHRlcl8uc2V0Q2hlY2tlZENoZWNrYm94T3JSYWRpb0F0SW5kZXgodCwhMCksdGhpcy5zZWxlY3RlZEluZGV4XyE9PWQuVU5TRVRfSU5ERVgmJnRoaXMuYWRhcHRlcl8uc2V0QXR0cmlidXRlRm9yRWxlbWVudEluZGV4KHRoaXMuc2VsZWN0ZWRJbmRleF8sYy5BUklBX0NIRUNLRUQsXCJmYWxzZVwiKSx0aGlzLmFkYXB0ZXJfLnNldEF0dHJpYnV0ZUZvckVsZW1lbnRJbmRleCh0LGMuQVJJQV9DSEVDS0VELFwidHJ1ZVwiKSx0aGlzLnNlbGVjdGVkSW5kZXhfPXR9LGUucHJvdG90eXBlLnNldENoZWNrYm94QXRJbmRleF89ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmFkYXB0ZXJfLmdldExpc3RJdGVtQ291bnQoKTtlKyspe3ZhciBuPSExO3QuaW5kZXhPZihlKT49MCYmKG49ITApLHRoaXMuYWRhcHRlcl8uc2V0Q2hlY2tlZENoZWNrYm94T3JSYWRpb0F0SW5kZXgoZSxuKSx0aGlzLmFkYXB0ZXJfLnNldEF0dHJpYnV0ZUZvckVsZW1lbnRJbmRleChlLGMuQVJJQV9DSEVDS0VELG4/XCJ0cnVlXCI6XCJmYWxzZVwiKX10aGlzLnNlbGVjdGVkSW5kZXhfPXR9LGUucHJvdG90eXBlLnNldFRhYmluZGV4QXRJbmRleF89ZnVuY3Rpb24odCl7dGhpcy5mb2N1c2VkSXRlbUluZGV4Xz09PWQuVU5TRVRfSU5ERVgmJjAhPT10P3RoaXMuYWRhcHRlcl8uc2V0QXR0cmlidXRlRm9yRWxlbWVudEluZGV4KDAsXCJ0YWJpbmRleFwiLFwiLTFcIik6dGhpcy5mb2N1c2VkSXRlbUluZGV4Xz49MCYmdGhpcy5mb2N1c2VkSXRlbUluZGV4XyE9PXQmJnRoaXMuYWRhcHRlcl8uc2V0QXR0cmlidXRlRm9yRWxlbWVudEluZGV4KHRoaXMuZm9jdXNlZEl0ZW1JbmRleF8sXCJ0YWJpbmRleFwiLFwiLTFcIiksdGhpcy5hZGFwdGVyXy5zZXRBdHRyaWJ1dGVGb3JFbGVtZW50SW5kZXgodCxcInRhYmluZGV4XCIsXCIwXCIpfSxlLnByb3RvdHlwZS5pc1NlbGVjdGFibGVMaXN0Xz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzU2luZ2xlU2VsZWN0aW9uTGlzdF98fHRoaXMuaXNDaGVja2JveExpc3RffHx0aGlzLmlzUmFkaW9MaXN0X30sZS5wcm90b3R5cGUuc2V0VGFiaW5kZXhUb0ZpcnN0U2VsZWN0ZWRJdGVtXz1mdW5jdGlvbigpe3ZhciB0PTA7dGhpcy5pc1NlbGVjdGFibGVMaXN0XygpJiYoXCJudW1iZXJcIj09dHlwZW9mIHRoaXMuc2VsZWN0ZWRJbmRleF8mJnRoaXMuc2VsZWN0ZWRJbmRleF8hPT1kLlVOU0VUX0lOREVYP3Q9dGhpcy5zZWxlY3RlZEluZGV4Xzp0aGlzLnNlbGVjdGVkSW5kZXhfIGluc3RhbmNlb2YgQXJyYXkmJnRoaXMuc2VsZWN0ZWRJbmRleF8ubGVuZ3RoPjAmJih0PXRoaXMuc2VsZWN0ZWRJbmRleF8ucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgubWluKHQsZSl9KSkpLHRoaXMuc2V0VGFiaW5kZXhBdEluZGV4Xyh0KX0sZS5wcm90b3R5cGUuaXNJbmRleFZhbGlkXz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKHQgaW5zdGFuY2VvZiBBcnJheSl7aWYoIXRoaXMuaXNDaGVja2JveExpc3RfKXRocm93IG5ldyBFcnJvcihcIk1EQ0xpc3RGb3VuZGF0aW9uOiBBcnJheSBvZiBpbmRleCBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2hlY2tib3ggYmFzZWQgbGlzdFwiKTtyZXR1cm4gMD09PXQubGVuZ3RofHx0LnNvbWUoZnVuY3Rpb24odCl7cmV0dXJuIGUuaXNJbmRleEluUmFuZ2VfKHQpfSl9aWYoXCJudW1iZXJcIj09dHlwZW9mIHQpe2lmKHRoaXMuaXNDaGVja2JveExpc3RfKXRocm93IG5ldyBFcnJvcihcIk1EQ0xpc3RGb3VuZGF0aW9uOiBFeHBlY3RlZCBhcnJheSBvZiBpbmRleCBmb3IgY2hlY2tib3ggYmFzZWQgbGlzdCBidXQgZ290IG51bWJlcjogXCIrdCk7cmV0dXJuIHRoaXMuaXNJbmRleEluUmFuZ2VfKHQpfXJldHVybiExfSxlLnByb3RvdHlwZS5pc0luZGV4SW5SYW5nZV89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hZGFwdGVyXy5nZXRMaXN0SXRlbUNvdW50KCk7cmV0dXJuIHQ+PTAmJnQ8ZX0sZS5wcm90b3R5cGUuc2V0U2VsZWN0ZWRJbmRleE9uQWN0aW9uXz1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPSEwKSx0aGlzLmlzQ2hlY2tib3hMaXN0Xz90aGlzLnRvZ2dsZUNoZWNrYm94QXRJbmRleF8odCxlKTp0aGlzLnNldFNlbGVjdGVkSW5kZXgodCl9LGUucHJvdG90eXBlLnRvZ2dsZUNoZWNrYm94QXRJbmRleF89ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmFkYXB0ZXJfLmlzQ2hlY2tib3hDaGVja2VkQXRJbmRleCh0KTtlJiYobj0hbix0aGlzLmFkYXB0ZXJfLnNldENoZWNrZWRDaGVja2JveE9yUmFkaW9BdEluZGV4KHQsbikpLHRoaXMuYWRhcHRlcl8uc2V0QXR0cmlidXRlRm9yRWxlbWVudEluZGV4KHQsYy5BUklBX0NIRUNLRUQsbj9cInRydWVcIjpcImZhbHNlXCIpO3ZhciBpPXRoaXMuc2VsZWN0ZWRJbmRleF89PT1kLlVOU0VUX0lOREVYP1tdOnRoaXMuc2VsZWN0ZWRJbmRleF8uc2xpY2UoKTtuP2kucHVzaCh0KTppPWkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlIT09dH0pLHRoaXMuc2VsZWN0ZWRJbmRleF89aX0sZX0oYSksXz17QU5DSE9SOlwibWRjLW1lbnUtc3VyZmFjZS0tYW5jaG9yXCIsQU5JTUFUSU5HX0NMT1NFRDpcIm1kYy1tZW51LXN1cmZhY2UtLWFuaW1hdGluZy1jbG9zZWRcIixBTklNQVRJTkdfT1BFTjpcIm1kYy1tZW51LXN1cmZhY2UtLWFuaW1hdGluZy1vcGVuXCIsRklYRUQ6XCJtZGMtbWVudS1zdXJmYWNlLS1maXhlZFwiLE9QRU46XCJtZGMtbWVudS1zdXJmYWNlLS1vcGVuXCIsUk9PVDpcIm1kYy1tZW51LXN1cmZhY2VcIn0sbT17Q0xPU0VEX0VWRU5UOlwiTURDTWVudVN1cmZhY2U6Y2xvc2VkXCIsT1BFTkVEX0VWRU5UOlwiTURDTWVudVN1cmZhY2U6b3BlbmVkXCIsRk9DVVNBQkxFX0VMRU1FTlRTOltcImJ1dHRvbjpub3QoOmRpc2FibGVkKVwiLCdbaHJlZl06bm90KFthcmlhLWRpc2FibGVkPVwidHJ1ZVwiXSknLFwiaW5wdXQ6bm90KDpkaXNhYmxlZClcIixcInNlbGVjdDpub3QoOmRpc2FibGVkKVwiLFwidGV4dGFyZWE6bm90KDpkaXNhYmxlZClcIiwnW3RhYmluZGV4XTpub3QoW3RhYmluZGV4PVwiLTFcIl0pOm5vdChbYXJpYS1kaXNhYmxlZD1cInRydWVcIl0pJ10uam9pbihcIiwgXCIpfSxFPXtUUkFOU0lUSU9OX09QRU5fRFVSQVRJT046MTIwLFRSQU5TSVRJT05fQ0xPU0VfRFVSQVRJT046NzUsTUFSR0lOX1RPX0VER0U6MzIsQU5DSE9SX1RPX01FTlVfU1VSRkFDRV9XSURUSF9SQVRJTzouNjd9OyFmdW5jdGlvbih0KXt0W3QuQk9UVE9NPTFdPVwiQk9UVE9NXCIsdFt0LkNFTlRFUj0yXT1cIkNFTlRFUlwiLHRbdC5SSUdIVD00XT1cIlJJR0hUXCIsdFt0LkZMSVBfUlRMPThdPVwiRkxJUF9SVExcIn0oaHx8KGg9e30pKSxmdW5jdGlvbih0KXt0W3QuVE9QX0xFRlQ9MF09XCJUT1BfTEVGVFwiLHRbdC5UT1BfUklHSFQ9NF09XCJUT1BfUklHSFRcIix0W3QuQk9UVE9NX0xFRlQ9MV09XCJCT1RUT01fTEVGVFwiLHRbdC5CT1RUT01fUklHSFQ9NV09XCJCT1RUT01fUklHSFRcIix0W3QuVE9QX1NUQVJUPThdPVwiVE9QX1NUQVJUXCIsdFt0LlRPUF9FTkQ9MTJdPVwiVE9QX0VORFwiLHRbdC5CT1RUT01fU1RBUlQ9OV09XCJCT1RUT01fU1RBUlRcIix0W3QuQk9UVE9NX0VORD0xM109XCJCT1RUT01fRU5EXCJ9KHB8fChwPXt9KSk7XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cbnZhciBJPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobil7dmFyIGk9dC5jYWxsKHRoaXMsbyh7fSxlLmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpcztyZXR1cm4gaS5pc09wZW5fPSExLGkuaXNRdWlja09wZW5fPSExLGkuaXNIb2lzdGVkRWxlbWVudF89ITEsaS5pc0ZpeGVkUG9zaXRpb25fPSExLGkub3BlbkFuaW1hdGlvbkVuZFRpbWVySWRfPTAsaS5jbG9zZUFuaW1hdGlvbkVuZFRpbWVySWRfPTAsaS5hbmltYXRpb25SZXF1ZXN0SWRfPTAsaS5hbmNob3JDb3JuZXJfPXAuVE9QX1NUQVJULGkuYW5jaG9yTWFyZ2luXz17dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjB9LGkucG9zaXRpb25fPXt4OjAseTowfSxpfXJldHVybiByKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJjc3NDbGFzc2VzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBffSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwic3RyaW5nc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIm51bWJlcnNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJDb3JuZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHB9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJkZWZhdWx0QWRhcHRlclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57YWRkQ2xhc3M6ZnVuY3Rpb24oKXt9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKCl7fSxoYXNDbGFzczpmdW5jdGlvbigpe3JldHVybiExfSxoYXNBbmNob3I6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXNFbGVtZW50SW5Db250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXNGb2N1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGlzRmlyc3RFbGVtZW50Rm9jdXNlZDpmdW5jdGlvbigpe3JldHVybiExfSxpc0xhc3RFbGVtZW50Rm9jdXNlZDpmdW5jdGlvbigpe3JldHVybiExfSxpc1J0bDpmdW5jdGlvbigpe3JldHVybiExfSxnZXRJbm5lckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm57aGVpZ2h0OjAsd2lkdGg6MH19LGdldEFuY2hvckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sZ2V0V2luZG93RGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybntoZWlnaHQ6MCx3aWR0aDowfX0sZ2V0Qm9keURpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm57aGVpZ2h0OjAsd2lkdGg6MH19LGdldFdpbmRvd1Njcm9sbDpmdW5jdGlvbigpe3JldHVybnt4OjAseTowfX0sc2V0UG9zaXRpb246ZnVuY3Rpb24oKXt9LHNldE1heEhlaWdodDpmdW5jdGlvbigpe30sc2V0VHJhbnNmb3JtT3JpZ2luOmZ1bmN0aW9uKCl7fSxzYXZlRm9jdXM6ZnVuY3Rpb24oKXt9LHJlc3RvcmVGb2N1czpmdW5jdGlvbigpe30sZm9jdXNGaXJzdEVsZW1lbnQ6ZnVuY3Rpb24oKXt9LGZvY3VzTGFzdEVsZW1lbnQ6ZnVuY3Rpb24oKXt9LG5vdGlmeUNsb3NlOmZ1bmN0aW9uKCl7fSxub3RpZnlPcGVuOmZ1bmN0aW9uKCl7fX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciB0PWUuY3NzQ2xhc3NlcyxuPXQuUk9PVCxpPXQuT1BFTjtpZighdGhpcy5hZGFwdGVyXy5oYXNDbGFzcyhuKSl0aHJvdyBuZXcgRXJyb3IobitcIiBjbGFzcyByZXF1aXJlZCBpbiByb290IGVsZW1lbnQuXCIpO3RoaXMuYWRhcHRlcl8uaGFzQ2xhc3MoaSkmJih0aGlzLmlzT3Blbl89ITApfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMub3BlbkFuaW1hdGlvbkVuZFRpbWVySWRfKSxjbGVhclRpbWVvdXQodGhpcy5jbG9zZUFuaW1hdGlvbkVuZFRpbWVySWRfKSxjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvblJlcXVlc3RJZF8pfSxlLnByb3RvdHlwZS5zZXRBbmNob3JDb3JuZXI9ZnVuY3Rpb24odCl7dGhpcy5hbmNob3JDb3JuZXJfPXR9LGUucHJvdG90eXBlLnNldEFuY2hvck1hcmdpbj1mdW5jdGlvbih0KXt0aGlzLmFuY2hvck1hcmdpbl8udG9wPXQudG9wfHwwLHRoaXMuYW5jaG9yTWFyZ2luXy5yaWdodD10LnJpZ2h0fHwwLHRoaXMuYW5jaG9yTWFyZ2luXy5ib3R0b209dC5ib3R0b218fDAsdGhpcy5hbmNob3JNYXJnaW5fLmxlZnQ9dC5sZWZ0fHwwfSxlLnByb3RvdHlwZS5zZXRJc0hvaXN0ZWQ9ZnVuY3Rpb24odCl7dGhpcy5pc0hvaXN0ZWRFbGVtZW50Xz10fSxlLnByb3RvdHlwZS5zZXRGaXhlZFBvc2l0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuaXNGaXhlZFBvc2l0aW9uXz10fSxlLnByb3RvdHlwZS5zZXRBYnNvbHV0ZVBvc2l0aW9uPWZ1bmN0aW9uKHQsZSl7dGhpcy5wb3NpdGlvbl8ueD10aGlzLmlzRmluaXRlXyh0KT90OjAsdGhpcy5wb3NpdGlvbl8ueT10aGlzLmlzRmluaXRlXyhlKT9lOjB9LGUucHJvdG90eXBlLnNldFF1aWNrT3Blbj1mdW5jdGlvbih0KXt0aGlzLmlzUXVpY2tPcGVuXz10fSxlLnByb3RvdHlwZS5pc09wZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc09wZW5ffSxlLnByb3RvdHlwZS5vcGVuPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmFkYXB0ZXJfLnNhdmVGb2N1cygpLHRoaXMuaXNRdWlja09wZW5ffHx0aGlzLmFkYXB0ZXJfLmFkZENsYXNzKGUuY3NzQ2xhc3Nlcy5BTklNQVRJTkdfT1BFTiksdGhpcy5hbmltYXRpb25SZXF1ZXN0SWRfPXJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3QuYWRhcHRlcl8uYWRkQ2xhc3MoZS5jc3NDbGFzc2VzLk9QRU4pLHQuZGltZW5zaW9uc189dC5hZGFwdGVyXy5nZXRJbm5lckRpbWVuc2lvbnMoKSx0LmF1dG9Qb3NpdGlvbl8oKSx0LmlzUXVpY2tPcGVuXz90LmFkYXB0ZXJfLm5vdGlmeU9wZW4oKTp0Lm9wZW5BbmltYXRpb25FbmRUaW1lcklkXz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5vcGVuQW5pbWF0aW9uRW5kVGltZXJJZF89MCx0LmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGUuY3NzQ2xhc3Nlcy5BTklNQVRJTkdfT1BFTiksdC5hZGFwdGVyXy5ub3RpZnlPcGVuKCl9LEUuVFJBTlNJVElPTl9PUEVOX0RVUkFUSU9OKX0pLHRoaXMuaXNPcGVuXz0hMH0sZS5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuaXNRdWlja09wZW5ffHx0aGlzLmFkYXB0ZXJfLmFkZENsYXNzKGUuY3NzQ2xhc3Nlcy5BTklNQVRJTkdfQ0xPU0VEKSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt0LmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGUuY3NzQ2xhc3Nlcy5PUEVOKSx0LmlzUXVpY2tPcGVuXz90LmFkYXB0ZXJfLm5vdGlmeUNsb3NlKCk6dC5jbG9zZUFuaW1hdGlvbkVuZFRpbWVySWRfPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmNsb3NlQW5pbWF0aW9uRW5kVGltZXJJZF89MCx0LmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGUuY3NzQ2xhc3Nlcy5BTklNQVRJTkdfQ0xPU0VEKSx0LmFkYXB0ZXJfLm5vdGlmeUNsb3NlKCl9LEUuVFJBTlNJVElPTl9DTE9TRV9EVVJBVElPTil9KSx0aGlzLmlzT3Blbl89ITEsdGhpcy5tYXliZVJlc3RvcmVGb2N1c18oKX0sZS5wcm90b3R5cGUuaGFuZGxlQm9keUNsaWNrPWZ1bmN0aW9uKHQpe3ZhciBlPXQudGFyZ2V0O3RoaXMuYWRhcHRlcl8uaXNFbGVtZW50SW5Db250YWluZXIoZSl8fHRoaXMuY2xvc2UoKX0sZS5wcm90b3R5cGUuaGFuZGxlS2V5ZG93bj1mdW5jdGlvbih0KXt2YXIgZT10LmtleUNvZGUsbj10LmtleSxpPXQuc2hpZnRLZXkscj1cIlRhYlwiPT09bnx8OT09PWU7XCJFc2NhcGVcIj09PW58fDI3PT09ZT90aGlzLmNsb3NlKCk6ciYmKHRoaXMuYWRhcHRlcl8uaXNMYXN0RWxlbWVudEZvY3VzZWQoKSYmIWk/KHRoaXMuYWRhcHRlcl8uZm9jdXNGaXJzdEVsZW1lbnQoKSx0LnByZXZlbnREZWZhdWx0KCkpOnRoaXMuYWRhcHRlcl8uaXNGaXJzdEVsZW1lbnRGb2N1c2VkKCkmJmkmJih0aGlzLmFkYXB0ZXJfLmZvY3VzTGFzdEVsZW1lbnQoKSx0LnByZXZlbnREZWZhdWx0KCkpKX0sZS5wcm90b3R5cGUuYXV0b1Bvc2l0aW9uXz1mdW5jdGlvbigpe3ZhciB0O3RoaXMubWVhc3VyZW1lbnRzXz10aGlzLmdldEF1dG9MYXlvdXRNZWFzdXJlbWVudHNfKCk7dmFyIGU9dGhpcy5nZXRPcmlnaW5Db3JuZXJfKCksbj10aGlzLmdldE1lbnVTdXJmYWNlTWF4SGVpZ2h0XyhlKSxpPXRoaXMuaGFzQml0XyhlLGguQk9UVE9NKT9cImJvdHRvbVwiOlwidG9wXCIscj10aGlzLmhhc0JpdF8oZSxoLlJJR0hUKT9cInJpZ2h0XCI6XCJsZWZ0XCIsbz10aGlzLmdldEhvcml6b250YWxPcmlnaW5PZmZzZXRfKGUpLHM9dGhpcy5nZXRWZXJ0aWNhbE9yaWdpbk9mZnNldF8oZSksYT10aGlzLm1lYXN1cmVtZW50c18sdT1hLmFuY2hvclNpemUsYz1hLnN1cmZhY2VTaXplLGQ9KCh0PXt9KVtyXT1vLHRbaV09cyx0KTt1LndpZHRoL2Mud2lkdGg+RS5BTkNIT1JfVE9fTUVOVV9TVVJGQUNFX1dJRFRIX1JBVElPJiYocj1cImNlbnRlclwiKSwodGhpcy5pc0hvaXN0ZWRFbGVtZW50X3x8dGhpcy5pc0ZpeGVkUG9zaXRpb25fKSYmdGhpcy5hZGp1c3RQb3NpdGlvbkZvckhvaXN0ZWRFbGVtZW50XyhkKSx0aGlzLmFkYXB0ZXJfLnNldFRyYW5zZm9ybU9yaWdpbihyK1wiIFwiK2kpLHRoaXMuYWRhcHRlcl8uc2V0UG9zaXRpb24oZCksdGhpcy5hZGFwdGVyXy5zZXRNYXhIZWlnaHQobj9uK1wicHhcIjpcIlwiKX0sZS5wcm90b3R5cGUuZ2V0QXV0b0xheW91dE1lYXN1cmVtZW50c189ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmFkYXB0ZXJfLmdldEFuY2hvckRpbWVuc2lvbnMoKSxlPXRoaXMuYWRhcHRlcl8uZ2V0Qm9keURpbWVuc2lvbnMoKSxuPXRoaXMuYWRhcHRlcl8uZ2V0V2luZG93RGltZW5zaW9ucygpLGk9dGhpcy5hZGFwdGVyXy5nZXRXaW5kb3dTY3JvbGwoKTtyZXR1cm4gdHx8KHQ9e3RvcDp0aGlzLnBvc2l0aW9uXy55LHJpZ2h0OnRoaXMucG9zaXRpb25fLngsYm90dG9tOnRoaXMucG9zaXRpb25fLnksbGVmdDp0aGlzLnBvc2l0aW9uXy54LHdpZHRoOjAsaGVpZ2h0OjB9KSx7YW5jaG9yU2l6ZTp0LGJvZHlTaXplOmUsc3VyZmFjZVNpemU6dGhpcy5kaW1lbnNpb25zXyx2aWV3cG9ydERpc3RhbmNlOnt0b3A6dC50b3AscmlnaHQ6bi53aWR0aC10LnJpZ2h0LGJvdHRvbTpuLmhlaWdodC10LmJvdHRvbSxsZWZ0OnQubGVmdH0sdmlld3BvcnRTaXplOm4sd2luZG93U2Nyb2xsOml9fSxlLnByb3RvdHlwZS5nZXRPcmlnaW5Db3JuZXJfPWZ1bmN0aW9uKCl7dmFyIHQ9cC5UT1BfTEVGVCxlPXRoaXMubWVhc3VyZW1lbnRzXyxuPWUudmlld3BvcnREaXN0YW5jZSxpPWUuYW5jaG9yU2l6ZSxyPWUuc3VyZmFjZVNpemUsbz10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLGguQk9UVE9NKSxzPW8/bi50b3AraS5oZWlnaHQrdGhpcy5hbmNob3JNYXJnaW5fLmJvdHRvbTpuLnRvcCt0aGlzLmFuY2hvck1hcmdpbl8udG9wLGE9bz9uLmJvdHRvbS10aGlzLmFuY2hvck1hcmdpbl8uYm90dG9tOm4uYm90dG9tK2kuaGVpZ2h0LXRoaXMuYW5jaG9yTWFyZ2luXy50b3AsdT1yLmhlaWdodC1zLGM9ci5oZWlnaHQtYTtjPjAmJnU8YyYmKHQ9dGhpcy5zZXRCaXRfKHQsaC5CT1RUT00pKTt2YXIgZD10aGlzLmFkYXB0ZXJfLmlzUnRsKCksbD10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLGguRkxJUF9SVEwpLGY9dGhpcy5oYXNCaXRfKHRoaXMuYW5jaG9yQ29ybmVyXyxoLlJJR0hUKSxfPWYmJiFkfHwhZiYmbCYmZCxtPV8/bi5sZWZ0K2kud2lkdGgrdGhpcy5hbmNob3JNYXJnaW5fLnJpZ2h0Om4ubGVmdCt0aGlzLmFuY2hvck1hcmdpbl8ubGVmdCxFPV8/bi5yaWdodC10aGlzLmFuY2hvck1hcmdpbl8ucmlnaHQ6bi5yaWdodCtpLndpZHRoLXRoaXMuYW5jaG9yTWFyZ2luXy5sZWZ0LEk9ci53aWR0aC1tLHk9ci53aWR0aC1FO3JldHVybihJPDAmJl8mJmR8fGYmJiFfJiZJPDB8fHk+MCYmSTx5KSYmKHQ9dGhpcy5zZXRCaXRfKHQsaC5SSUdIVCkpLHR9LGUucHJvdG90eXBlLmdldE1lbnVTdXJmYWNlTWF4SGVpZ2h0Xz1mdW5jdGlvbih0KXt2YXIgbj10aGlzLm1lYXN1cmVtZW50c18udmlld3BvcnREaXN0YW5jZSxpPTAscj10aGlzLmhhc0JpdF8odCxoLkJPVFRPTSksbz10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLGguQk9UVE9NKSxzPWUubnVtYmVycy5NQVJHSU5fVE9fRURHRTtyZXR1cm4gcj8oaT1uLnRvcCt0aGlzLmFuY2hvck1hcmdpbl8udG9wLXMsb3x8KGkrPXRoaXMubWVhc3VyZW1lbnRzXy5hbmNob3JTaXplLmhlaWdodCkpOihpPW4uYm90dG9tLXRoaXMuYW5jaG9yTWFyZ2luXy5ib3R0b20rdGhpcy5tZWFzdXJlbWVudHNfLmFuY2hvclNpemUuaGVpZ2h0LXMsbyYmKGktPXRoaXMubWVhc3VyZW1lbnRzXy5hbmNob3JTaXplLmhlaWdodCkpLGl9LGUucHJvdG90eXBlLmdldEhvcml6b250YWxPcmlnaW5PZmZzZXRfPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubWVhc3VyZW1lbnRzXy5hbmNob3JTaXplLG49dGhpcy5oYXNCaXRfKHQsaC5SSUdIVCksaT10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLGguUklHSFQpO2lmKG4pe3ZhciByPWk/ZS53aWR0aC10aGlzLmFuY2hvck1hcmdpbl8ubGVmdDp0aGlzLmFuY2hvck1hcmdpbl8ucmlnaHQ7cmV0dXJuIHRoaXMuaXNIb2lzdGVkRWxlbWVudF98fHRoaXMuaXNGaXhlZFBvc2l0aW9uXz9yLSh0aGlzLm1lYXN1cmVtZW50c18udmlld3BvcnRTaXplLndpZHRoLXRoaXMubWVhc3VyZW1lbnRzXy5ib2R5U2l6ZS53aWR0aCk6cn1yZXR1cm4gaT9lLndpZHRoLXRoaXMuYW5jaG9yTWFyZ2luXy5yaWdodDp0aGlzLmFuY2hvck1hcmdpbl8ubGVmdH0sZS5wcm90b3R5cGUuZ2V0VmVydGljYWxPcmlnaW5PZmZzZXRfPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubWVhc3VyZW1lbnRzXy5hbmNob3JTaXplLG49dGhpcy5oYXNCaXRfKHQsaC5CT1RUT00pLGk9dGhpcy5oYXNCaXRfKHRoaXMuYW5jaG9yQ29ybmVyXyxoLkJPVFRPTSk7cmV0dXJuIG4/aT9lLmhlaWdodC10aGlzLmFuY2hvck1hcmdpbl8udG9wOi10aGlzLmFuY2hvck1hcmdpbl8uYm90dG9tOmk/ZS5oZWlnaHQrdGhpcy5hbmNob3JNYXJnaW5fLmJvdHRvbTp0aGlzLmFuY2hvck1hcmdpbl8udG9wfSxlLnByb3RvdHlwZS5hZGp1c3RQb3NpdGlvbkZvckhvaXN0ZWRFbGVtZW50Xz1mdW5jdGlvbih0KXt2YXIgZSxuLGk9dGhpcy5tZWFzdXJlbWVudHNfLHI9aS53aW5kb3dTY3JvbGwsbz1pLnZpZXdwb3J0RGlzdGFuY2UsYT1PYmplY3Qua2V5cyh0KTt0cnl7Zm9yKHZhciB1PXMoYSksYz11Lm5leHQoKTshYy5kb25lO2M9dS5uZXh0KCkpe3ZhciBkPWMudmFsdWUsbD10W2RdfHwwO2wrPW9bZF0sdGhpcy5pc0ZpeGVkUG9zaXRpb25ffHwoXCJ0b3BcIj09PWQ/bCs9ci55OlwiYm90dG9tXCI9PT1kP2wtPXIueTpcImxlZnRcIj09PWQ/bCs9ci54OmwtPXIueCksdFtkXT1sfX1jYXRjaCh0KXtlPXtlcnJvcjp0fX1maW5hbGx5e3RyeXtjJiYhYy5kb25lJiYobj11LnJldHVybikmJm4uY2FsbCh1KX1maW5hbGx5e2lmKGUpdGhyb3cgZS5lcnJvcn19fSxlLnByb3RvdHlwZS5tYXliZVJlc3RvcmVGb2N1c189ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmFkYXB0ZXJfLmlzRm9jdXNlZCgpLGU9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCYmdGhpcy5hZGFwdGVyXy5pc0VsZW1lbnRJbkNvbnRhaW5lcihkb2N1bWVudC5hY3RpdmVFbGVtZW50KTsodHx8ZSkmJnRoaXMuYWRhcHRlcl8ucmVzdG9yZUZvY3VzKCl9LGUucHJvdG90eXBlLmhhc0JpdF89ZnVuY3Rpb24odCxlKXtyZXR1cm4gQm9vbGVhbih0JmUpfSxlLnByb3RvdHlwZS5zZXRCaXRfPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHR8ZX0sZS5wcm90b3R5cGUuaXNGaW5pdGVfPWZ1bmN0aW9uKHQpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiB0JiZpc0Zpbml0ZSh0KX0sZX0oYSkseT17TUVOVV9TRUxFQ1RFRF9MSVNUX0lURU06XCJtZGMtbWVudS1pdGVtLS1zZWxlY3RlZFwiLE1FTlVfU0VMRUNUSU9OX0dST1VQOlwibWRjLW1lbnVfX3NlbGVjdGlvbi1ncm91cFwiLFJPT1Q6XCJtZGMtbWVudVwifSxPPXtBUklBX1NFTEVDVEVEX0FUVFI6XCJhcmlhLXNlbGVjdGVkXCIsQ0hFQ0tCT1hfU0VMRUNUT1I6J2lucHV0W3R5cGU9XCJjaGVja2JveFwiXScsTElTVF9TRUxFQ1RPUjpcIi5tZGMtbGlzdFwiLFNFTEVDVEVEX0VWRU5UOlwiTURDTWVudTpzZWxlY3RlZFwifTtuLmQoZSxcIk1EQ01lbnVGb3VuZGF0aW9uXCIsZnVuY3Rpb24oKXtyZXR1cm4gVH0pO1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG52YXIgVD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciBpPXQuY2FsbCh0aGlzLG8oe30sZS5kZWZhdWx0QWRhcHRlcixuKSl8fHRoaXM7cmV0dXJuIGkuY2xvc2VBbmltYXRpb25FbmRUaW1lcklkXz0wLGl9cmV0dXJuIHIoZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzdHJpbmdzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBPfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2FkZENsYXNzVG9FbGVtZW50QXRJbmRleDpmdW5jdGlvbigpe30scmVtb3ZlQ2xhc3NGcm9tRWxlbWVudEF0SW5kZXg6ZnVuY3Rpb24oKXt9LGFkZEF0dHJpYnV0ZVRvRWxlbWVudEF0SW5kZXg6ZnVuY3Rpb24oKXt9LHJlbW92ZUF0dHJpYnV0ZUZyb21FbGVtZW50QXRJbmRleDpmdW5jdGlvbigpe30sZWxlbWVudENvbnRhaW5zQ2xhc3M6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sY2xvc2VTdXJmYWNlOmZ1bmN0aW9uKCl7fSxnZXRFbGVtZW50SW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4tMX0sZ2V0UGFyZW50RWxlbWVudDpmdW5jdGlvbigpe3JldHVybiBudWxsfSxnZXRTZWxlY3RlZEVsZW1lbnRJbmRleDpmdW5jdGlvbigpe3JldHVybi0xfSxub3RpZnlTZWxlY3RlZDpmdW5jdGlvbigpe319fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmNsb3NlQW5pbWF0aW9uRW5kVGltZXJJZF8mJmNsZWFyVGltZW91dCh0aGlzLmNsb3NlQW5pbWF0aW9uRW5kVGltZXJJZF8pLHRoaXMuYWRhcHRlcl8uY2xvc2VTdXJmYWNlKCl9LGUucHJvdG90eXBlLmhhbmRsZUtleWRvd249ZnVuY3Rpb24odCl7dmFyIGU9dC5rZXksbj10LmtleUNvZGU7KFwiVGFiXCI9PT1lfHw5PT09bikmJnRoaXMuYWRhcHRlcl8uY2xvc2VTdXJmYWNlKCl9LGUucHJvdG90eXBlLmhhbmRsZUl0ZW1BY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXRoaXMuYWRhcHRlcl8uZ2V0RWxlbWVudEluZGV4KHQpO248MHx8KHRoaXMuYWRhcHRlcl8ubm90aWZ5U2VsZWN0ZWQoe2luZGV4Om59KSx0aGlzLmFkYXB0ZXJfLmNsb3NlU3VyZmFjZSgpLHRoaXMuY2xvc2VBbmltYXRpb25FbmRUaW1lcklkXz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGk9ZS5nZXRTZWxlY3Rpb25Hcm91cF8odCk7aSYmZS5oYW5kbGVTZWxlY3Rpb25Hcm91cF8oaSxuKX0sSS5udW1iZXJzLlRSQU5TSVRJT05fQ0xPU0VfRFVSQVRJT04pKX0sZS5wcm90b3R5cGUuaGFuZGxlU2VsZWN0aW9uR3JvdXBfPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5hZGFwdGVyXy5nZXRTZWxlY3RlZEVsZW1lbnRJbmRleCh0KTtuPj0wJiYodGhpcy5hZGFwdGVyXy5yZW1vdmVBdHRyaWJ1dGVGcm9tRWxlbWVudEF0SW5kZXgobixPLkFSSUFfU0VMRUNURURfQVRUUiksdGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzc0Zyb21FbGVtZW50QXRJbmRleChuLHkuTUVOVV9TRUxFQ1RFRF9MSVNUX0lURU0pKSx0aGlzLmFkYXB0ZXJfLmFkZENsYXNzVG9FbGVtZW50QXRJbmRleChlLHkuTUVOVV9TRUxFQ1RFRF9MSVNUX0lURU0pLHRoaXMuYWRhcHRlcl8uYWRkQXR0cmlidXRlVG9FbGVtZW50QXRJbmRleChlLE8uQVJJQV9TRUxFQ1RFRF9BVFRSLFwidHJ1ZVwiKX0sZS5wcm90b3R5cGUuZ2V0U2VsZWN0aW9uR3JvdXBfPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYWRhcHRlcl8uZ2V0UGFyZW50RWxlbWVudCh0KTtpZighZSlyZXR1cm4gbnVsbDtmb3IodmFyIG49dGhpcy5hZGFwdGVyXy5lbGVtZW50Q29udGFpbnNDbGFzcyhlLHkuTUVOVV9TRUxFQ1RJT05fR1JPVVApOyFuJiZlJiYhdGhpcy5hZGFwdGVyXy5lbGVtZW50Q29udGFpbnNDbGFzcyhlLGYuY3NzQ2xhc3Nlcy5ST09UKTspbj0hIShlPXRoaXMuYWRhcHRlcl8uZ2V0UGFyZW50RWxlbWVudChlKSkmJnRoaXMuYWRhcHRlcl8uZWxlbWVudENvbnRhaW5zQ2xhc3MoZSx5Lk1FTlVfU0VMRUNUSU9OX0dST1VQKTtyZXR1cm4gbj9lOm51bGx9LGV9KGEpO2UuZGVmYXVsdD1UfSwzMjpmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1ufSw5ODpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4oaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSksbz10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihvPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciByIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scz10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIGkgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKSYmZS5pbmRleE9mKGkpPDAmJihuW2ldPXRbaV0pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPTA7Zm9yKGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtyPGkubGVuZ3RoO3IrKyllLmluZGV4T2YoaVtyXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsaVtyXSkmJihuW2lbcl1dPXRbaVtyXV0pfXJldHVybiBufSxhPXRoaXMmJnRoaXMuX19pbXBvcnRTdGFyfHxmdW5jdGlvbih0KXtpZih0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIGU9e307aWYobnVsbCE9dClmb3IodmFyIG4gaW4gdClPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pJiYoZVtuXT10W25dKTtyZXR1cm4gZS5kZWZhdWx0PXQsZX0sdT10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgYz1hKG4oMCkpLGQ9dShuKDEpKSxsPW4oMTQ4KSxoPXUobig5OSkpLHA9dShuKDEwMCkpO2UuTWVudUxpc3Q9cC5kZWZhdWx0O3ZhciBmPXUobigxMDEpKTtlLk1lbnVMaXN0SXRlbT1mLmRlZmF1bHQ7dmFyIF89bC5NRENNZW51Rm91bmRhdGlvbi5jc3NDbGFzc2VzLG09ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5tZW51TGlzdEVsZW1lbnQ9Yy5jcmVhdGVSZWYoKSxlLnN0YXRlPXtmb3VuZGF0aW9uOnZvaWQgMCxvcGVuOmUucHJvcHMub3Blbnx8ITF9LGUuaGFuZGxlS2V5RG93bj1mdW5jdGlvbih0KXt2YXIgbj1lLnByb3BzLm9uS2V5RG93bjtuJiZuKHQpLGUuc3RhdGUuZm91bmRhdGlvbiYmZS5zdGF0ZS5mb3VuZGF0aW9uLmhhbmRsZUtleWRvd24odC5uYXRpdmVFdmVudCl9LGUuaGFuZGxlT3Blbj1mdW5jdGlvbigpe3ZhciB0PWUucHJvcHMub25PcGVuO3QmJnQoKX0sZX1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGwuTURDTWVudUZvdW5kYXRpb24odGhpcy5hZGFwdGVyKTt0LmluaXQoKSx0aGlzLnNldFN0YXRlKHtmb3VuZGF0aW9uOnR9KX0sZS5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPWZ1bmN0aW9uKHQpe3RoaXMucHJvcHMub3BlbiE9PXQub3BlbiYmdGhpcy5zZXRTdGF0ZSh7b3Blbjp0aGlzLnByb3BzLm9wZW59KX0sZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLnN0YXRlLmZvdW5kYXRpb24mJnRoaXMuc3RhdGUuZm91bmRhdGlvbi5kZXN0cm95KCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImxpc3RFbGVtZW50c1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZW51TGlzdEVsZW1lbnQuY3VycmVudCYmdGhpcy5tZW51TGlzdEVsZW1lbnQuY3VycmVudC5saXN0RWxlbWVudHMmJnRoaXMubWVudUxpc3RFbGVtZW50LmN1cnJlbnQubGlzdEVsZW1lbnRzLmxlbmd0aD49MD90aGlzLm1lbnVMaXN0RWxlbWVudC5jdXJyZW50Lmxpc3RFbGVtZW50czpbXX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJhZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJue2FkZENsYXNzVG9FbGVtZW50QXRJbmRleDpmdW5jdGlvbihlLG4pe3QubGlzdEVsZW1lbnRzW2VdLmNsYXNzTGlzdC5hZGQobil9LHJlbW92ZUNsYXNzRnJvbUVsZW1lbnRBdEluZGV4OmZ1bmN0aW9uKGUsbil7dC5saXN0RWxlbWVudHNbZV0uY2xhc3NMaXN0LnJlbW92ZShuKX0sYWRkQXR0cmlidXRlVG9FbGVtZW50QXRJbmRleDpmdW5jdGlvbihlLG4saSl7dC5saXN0RWxlbWVudHNbZV0uc2V0QXR0cmlidXRlKG4saSl9LHJlbW92ZUF0dHJpYnV0ZUZyb21FbGVtZW50QXRJbmRleDpmdW5jdGlvbihlLG4pe3QubGlzdEVsZW1lbnRzW2VdLnJlbW92ZUF0dHJpYnV0ZShuKX0sZWxlbWVudENvbnRhaW5zQ2xhc3M6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jbGFzc0xpc3QuY29udGFpbnMoZSl9LGNsb3NlU3VyZmFjZTpmdW5jdGlvbigpe3JldHVybiB0LnNldFN0YXRlKHtvcGVuOiExfSl9LGdldEVsZW1lbnRJbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gdC5saXN0RWxlbWVudHMuaW5kZXhPZihlKX0sZ2V0UGFyZW50RWxlbWVudDpmdW5jdGlvbih0KXtyZXR1cm4gdC5wYXJlbnRFbGVtZW50fSxnZXRTZWxlY3RlZEVsZW1lbnRJbmRleDpmdW5jdGlvbihlKXt2YXIgbj1lLnF1ZXJ5U2VsZWN0b3IoXCIuXCIrXy5NRU5VX1NFTEVDVEVEX0xJU1RfSVRFTSk7cmV0dXJuIG4/dC5saXN0RWxlbWVudHMuaW5kZXhPZihuKTotMX0sbm90aWZ5U2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHQucHJvcHMub25TZWxlY3RlZChlLmluZGV4LHQubGlzdEVsZW1lbnRzW2UuaW5kZXhdKX19fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMsZT10LmNsYXNzTmFtZSxuPSh0Lm9wZW4sdC5vbktleURvd24sdC5vbk9wZW4sdC5jaGlsZHJlbix0Lm9uU2VsZWN0ZWQscyh0LFtcImNsYXNzTmFtZVwiLFwib3BlblwiLFwib25LZXlEb3duXCIsXCJvbk9wZW5cIixcImNoaWxkcmVuXCIsXCJvblNlbGVjdGVkXCJdKSk7cmV0dXJuIGMuY3JlYXRlRWxlbWVudChoLmRlZmF1bHQsbyh7dGFiSW5kZXg6LTEsb3Blbjp0aGlzLnN0YXRlLm9wZW4sY2xhc3NOYW1lOmQuZGVmYXVsdChcIm1kYy1tZW51XCIsZSksb25LZXlEb3duOnRoaXMuaGFuZGxlS2V5RG93bixvbk9wZW46dGhpcy5oYW5kbGVPcGVufSxuKSx0aGlzLnJlbmRlckNoaWxkKCkpfSxlLnByb3RvdHlwZS5yZW5kZXJDaGlsZD1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMuY2hpbGRyZW4sZT10aGlzLnN0YXRlLmZvdW5kYXRpb247aWYodCl7dmFyIG49ZnVuY3Rpb24oKXt9O2UmJihuPWUuaGFuZGxlSXRlbUFjdGlvbi5iaW5kKGUpKTt2YXIgaT1vKHt9LHQucHJvcHMse2hhbmRsZUl0ZW1BY3Rpb246bixyZWY6dGhpcy5tZW51TGlzdEVsZW1lbnQsd3JhcEZvY3VzOiEwfSk7cmV0dXJuIGMuY2xvbmVFbGVtZW50KHQsaSl9fSxlLmRlZmF1bHRQcm9wcz17Y2xhc3NOYW1lOlwiXCIsb3BlbjohMSxvbktleURvd246ZnVuY3Rpb24oKXt9LG9uU2VsZWN0ZWQ6ZnVuY3Rpb24oKXt9fSxlfShjLkNvbXBvbmVudCk7ZS5kZWZhdWx0PW07dmFyIEU9bigzMik7ZS5NZW51TGlzdERpdmlkZXI9RS5MaXN0RGl2aWRlcixlLk1lbnVMaXN0R3JvdXA9RS5MaXN0R3JvdXAsZS5NZW51TGlzdEdyb3VwU3ViaGVhZGVyPUUuTGlzdEdyb3VwU3ViaGVhZGVyLGUuTWVudUxpc3RJdGVtR3JhcGhpYz1FLkxpc3RJdGVtR3JhcGhpYyxlLk1lbnVMaXN0SXRlbU1ldGE9RS5MaXN0SXRlbU1ldGEsZS5NZW51TGlzdEl0ZW1UZXh0PUUuTGlzdEl0ZW1UZXh0fSw5OTpmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1pfX0pfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZW51LmpzLm1hcCIsIiFmdW5jdGlvbih0LGUpe2lmKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPWUocmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpLHJlcXVpcmUoXCJyZWFjdC1kb21cIikpO2Vsc2UgaWYoXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXCJyZWFjdFwiLFwiY2xhc3NuYW1lc1wiLFwicmVhY3QtZG9tXCJdLGUpO2Vsc2V7dmFyIG49XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZShyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcImNsYXNzbmFtZXNcIikscmVxdWlyZShcInJlYWN0LWRvbVwiKSk6ZSh0LnJlYWN0LHQuY2xhc3NuYW1lcyx0W1wicmVhY3QtZG9tXCJdKTtmb3IodmFyIG8gaW4gbikoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czp0KVtvXT1uW29dfX0oXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9e307ZnVuY3Rpb24gbihvKXtpZihlW29dKXJldHVybiBlW29dLmV4cG9ydHM7dmFyIGk9ZVtvXT17aTpvLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIHRbb10uY2FsbChpLmV4cG9ydHMsaSxpLmV4cG9ydHMsbiksaS5sPSEwLGkuZXhwb3J0c31yZXR1cm4gbi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxvKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6b30pfSxuLnI9ZnVuY3Rpb24odCl7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOlwiTW9kdWxlXCJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiZcIm9iamVjdFwiPT10eXBlb2YgdCYmdCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBvPU9iamVjdC5jcmVhdGUobnVsbCk7aWYobi5yKG8pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLFwiZGVmYXVsdFwiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KSwyJmUmJlwic3RyaW5nXCIhPXR5cGVvZiB0KWZvcih2YXIgaSBpbiB0KW4uZChvLGksZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxpKSk7cmV0dXJuIG99LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsXCJhXCIsZSksZX0sbi5vPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfSxuLnA9XCJcIixuKG4ucz0xMDIpfSh7MDpmdW5jdGlvbihlLG4pe2UuZXhwb3J0cz10fSwxOmZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWV9LDEwMjpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG8saT10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KG89ZnVuY3Rpb24odCxlKXtyZXR1cm4obz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1vKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSkscj10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsbz1hcmd1bWVudHMubGVuZ3RoO248bztuKyspZm9yKHZhciBpIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLGkpJiYodFtpXT1lW2ldKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scz10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIG8gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxvKSYmZS5pbmRleE9mKG8pPDAmJihuW29dPXRbb10pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBpPTA7Zm9yKG89T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtpPG8ubGVuZ3RoO2krKyllLmluZGV4T2Yob1tpXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsb1tpXSkmJihuW29baV1dPXRbb1tpXV0pfXJldHVybiBufSx1PXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBhPXUobigwKSksYz11KG4oMTAzKSksbD11KG4oMSkpLGY9bigxNiksaD1uKDE1OSk7ZS5Db3JuZXI9aC5Db3JuZXI7dmFyIGQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5tZW51U3VyZmFjZUVsZW1lbnQ9YS5kZWZhdWx0LmNyZWF0ZVJlZigpLGUucHJldmlvdXNGb2N1cz1udWxsLGUuZmlyc3RGb2N1c2FibGVFbGVtZW50PW51bGwsZS5sYXN0Rm9jdXNhYmxlRWxlbWVudD1udWxsLGUuc3RhdGU9e3RyYW5zZm9ybU9yaWdpbjpcIlwiLG1heEhlaWdodDp2b2lkIDAsc3R5bGVMZWZ0OnZvaWQgMCxzdHlsZVJpZ2h0OnZvaWQgMCxzdHlsZVRvcDp2b2lkIDAsc3R5bGVCb3R0b206dm9pZCAwLGNsYXNzTGlzdDpuZXcgU2V0LG1vdW50ZWQ6ITF9LGUub3Blbl89ZnVuY3Rpb24oKXtpZihlLnByb3BzLm9wZW4pe2lmKCFlLm1lbnVTdXJmYWNlRWxlbWVudC5jdXJyZW50KXJldHVybjt2YXIgdD1lLm1lbnVTdXJmYWNlRWxlbWVudC5jdXJyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZi5NRENNZW51U3VyZmFjZUZvdW5kYXRpb24uc3RyaW5ncy5GT0NVU0FCTEVfRUxFTUVOVFMpO2UuZmlyc3RGb2N1c2FibGVFbGVtZW50PXQubGVuZ3RoPjA/dFswXTpudWxsLGUubGFzdEZvY3VzYWJsZUVsZW1lbnQ9dC5sZW5ndGg+MD90W3QubGVuZ3RoLTFdOm51bGwsZS5mb3VuZGF0aW9uLm9wZW4oKX1lbHNlIGUuZm91bmRhdGlvbi5jbG9zZSgpfSxlLmhhbmRsZUtleWRvd249ZnVuY3Rpb24odCl7ZS5wcm9wcy5vbktleURvd24odCksZS5mb3VuZGF0aW9uLmhhbmRsZUtleWRvd24odC5uYXRpdmVFdmVudCl9LGUuaGFuZGxlT3Blbj1mdW5jdGlvbigpe2UucmVnaXN0ZXJXaW5kb3dDbGlja0xpc3RlbmVyJiZlLnJlZ2lzdGVyV2luZG93Q2xpY2tMaXN0ZW5lcigpfSxlLmhhbmRsZUNsb3NlPWZ1bmN0aW9uKCl7ZS5kZXJlZ2lzdGVyV2luZG93Q2xpY2tMaXN0ZW5lciYmZS5kZXJlZ2lzdGVyV2luZG93Q2xpY2tMaXN0ZW5lcigpfSxlfXJldHVybiBpKGUsdCksZS5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5wcm9wcyxuPWUuYW5jaG9yQ29ybmVyLG89ZS5hbmNob3JNYXJnaW4saT1lLmNvb3JkaW5hdGVzLHI9ZS5maXhlZCxzPWUucXVpY2tPcGVuO3RoaXMuaGFuZGxlV2luZG93Q2xpY2s9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuZm91bmRhdGlvbi5oYW5kbGVCb2R5Q2xpY2soZSl9LHRoaXMucmVnaXN0ZXJXaW5kb3dDbGlja0xpc3RlbmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIix0LmhhbmRsZVdpbmRvd0NsaWNrKX0sdGhpcy5kZXJlZ2lzdGVyV2luZG93Q2xpY2tMaXN0ZW5lcj1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsdC5oYW5kbGVXaW5kb3dDbGljayl9LHRoaXMuZm91bmRhdGlvbj1uZXcgZi5NRENNZW51U3VyZmFjZUZvdW5kYXRpb24odGhpcy5hZGFwdGVyKSx0aGlzLmZvdW5kYXRpb24uaW5pdCgpLHRoaXMuZm91bmRhdGlvbi5zZXRJc0hvaXN0ZWQoITApLHRoaXMuZm91bmRhdGlvbi5zZXRGaXhlZFBvc2l0aW9uKHIpLGkmJnRoaXMuc2V0Q29vcmRpbmF0ZXMoKSxuJiZ0aGlzLmZvdW5kYXRpb24uc2V0QW5jaG9yQ29ybmVyKG4pLG8mJnRoaXMuZm91bmRhdGlvbi5zZXRBbmNob3JNYXJnaW4obykscyYmdGhpcy5mb3VuZGF0aW9uLnNldFF1aWNrT3BlbihzKSx0aGlzLnNldFN0YXRlKHttb3VudGVkOiEwfSl9LGUucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbih0LGUpeyh0aGlzLnByb3BzLm9wZW4hPT10Lm9wZW58fHRoaXMucHJvcHMub3BlbiYmdGhpcy5zdGF0ZS5tb3VudGVkIT09ZS5tb3VudGVkKSYmdGhpcy5vcGVuXygpLHRoaXMucHJvcHMuY29vcmRpbmF0ZXMhPT10LmNvb3JkaW5hdGVzJiZ0aGlzLnNldENvb3JkaW5hdGVzKCksdGhpcy5wcm9wcy5hbmNob3JDb3JuZXIhPT10LmFuY2hvckNvcm5lciYmdGhpcy5mb3VuZGF0aW9uLnNldEFuY2hvckNvcm5lcih0aGlzLnByb3BzLmFuY2hvckNvcm5lciksdGhpcy5wcm9wcy5hbmNob3JNYXJnaW4hPT10LmFuY2hvck1hcmdpbiYmdGhpcy5mb3VuZGF0aW9uLnNldEFuY2hvck1hcmdpbih0aGlzLnByb3BzLmFuY2hvck1hcmdpbiksdGhpcy5wcm9wcy5xdWlja09wZW4hPT10LnF1aWNrT3BlbiYmdGhpcy5mb3VuZGF0aW9uLnNldFF1aWNrT3Blbih0aGlzLnByb3BzLnF1aWNrT3BlbiksdGhpcy5zdGF0ZS5tb3VudGVkIT09ZS5tb3VudGVkJiZ0aGlzLnByb3BzLm9uTW91bnQmJnRoaXMucHJvcHMub25Nb3VudCh0aGlzLnN0YXRlLm1vdW50ZWQpfSxlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMuZGVyZWdpc3RlcldpbmRvd0NsaWNrTGlzdGVuZXImJnRoaXMuZGVyZWdpc3RlcldpbmRvd0NsaWNrTGlzdGVuZXIoKSx0aGlzLmZvdW5kYXRpb24mJnRoaXMuZm91bmRhdGlvbi5kZXN0cm95KCl9LGUucHJvdG90eXBlLnNldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7aWYodGhpcy5wcm9wcy5jb29yZGluYXRlcyl7dmFyIHQ9dGhpcy5wcm9wcy5jb29yZGluYXRlcyxlPXQueCxuPXQueTt0aGlzLmZvdW5kYXRpb24uc2V0QWJzb2x1dGVQb3NpdGlvbihlLG4pfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiY2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9dC5maXhlZCxuPXQuY2xhc3NOYW1lLG89dGhpcy5zdGF0ZS5jbGFzc0xpc3Q7cmV0dXJuIGwuZGVmYXVsdChcIm1kYy1tZW51LXN1cmZhY2VcIixBcnJheS5mcm9tKG8pLG4se1wibWRjLW1lbnUtc3VyZmFjZS0tZml4ZWRcIjplfSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwic3R5bGVzXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuc3RhdGUsZT10LnN0eWxlTGVmdCxuPXQuc3R5bGVSaWdodCxvPXQuc3R5bGVUb3AsaT10LnN0eWxlQm90dG9tLHI9dC50cmFuc2Zvcm1PcmlnaW4scz10Lm1heEhlaWdodDtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSx0aGlzLnByb3BzLnN0eWxlcyx7dHJhbnNmb3JtT3JpZ2luOnIsbWF4SGVpZ2h0OnMsbGVmdDplLHJpZ2h0Om4sdG9wOm8sYm90dG9tOml9KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJhZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHIoe2FkZENsYXNzOmZ1bmN0aW9uKGUpe3ZhciBuPW5ldyBTZXQodC5zdGF0ZS5jbGFzc0xpc3QpO24uYWRkKGUpLHQuc2V0U3RhdGUoe2NsYXNzTGlzdDpufSl9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciBuPW5ldyBTZXQodC5zdGF0ZS5jbGFzc0xpc3QpO24uZGVsZXRlKGUpLHQuc2V0U3RhdGUoe2NsYXNzTGlzdDpufSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiB0LmNsYXNzZXMuc3BsaXQoXCIgXCIpLmluY2x1ZGVzKGUpfSxoYXNBbmNob3I6ZnVuY3Rpb24oKXtyZXR1cm4hIXQucHJvcHMuYW5jaG9yRWxlbWVudH0sbm90aWZ5T3BlbjpmdW5jdGlvbigpe3QuaGFuZGxlT3BlbigpLHQucHJvcHMub25PcGVuKCl9LG5vdGlmeUNsb3NlOmZ1bmN0aW9uKCl7dC5oYW5kbGVDbG9zZSgpLHQucHJvcHMub25DbG9zZSgpfSxpc0VsZW1lbnRJbkNvbnRhaW5lcjpmdW5jdGlvbihlKXtyZXR1cm4hIXQubWVudVN1cmZhY2VFbGVtZW50LmN1cnJlbnQmJnQubWVudVN1cmZhY2VFbGVtZW50LmN1cnJlbnQuY29udGFpbnMoZSl9LGlzUnRsOmZ1bmN0aW9uKCl7cmV0dXJuISF0Lm1lbnVTdXJmYWNlRWxlbWVudCYmKCEhdC5tZW51U3VyZmFjZUVsZW1lbnQuY3VycmVudCYmXCJydGxcIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQubWVudVN1cmZhY2VFbGVtZW50LmN1cnJlbnQpLmdldFByb3BlcnR5VmFsdWUoXCJkaXJlY3Rpb25cIikpfSxzZXRUcmFuc2Zvcm1PcmlnaW46ZnVuY3Rpb24oZSl7cmV0dXJuIHQuc2V0U3RhdGUoe3RyYW5zZm9ybU9yaWdpbjplfSl9fSx7aXNGb2N1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuIHQubWVudVN1cmZhY2VFbGVtZW50JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09dC5tZW51U3VyZmFjZUVsZW1lbnQuY3VycmVudH0sc2F2ZUZvY3VzOmZ1bmN0aW9uKCl7dC5wcmV2aW91c0ZvY3VzPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9LHJlc3RvcmVGb2N1czpmdW5jdGlvbigpe3ZhciBlPXQubWVudVN1cmZhY2VFbGVtZW50O2UmJmUuY3VycmVudCYmZS5jdXJyZW50LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpJiZ0LnByZXZpb3VzRm9jdXMmJnQucHJldmlvdXNGb2N1cy5mb2N1cyYmdC5wcmV2aW91c0ZvY3VzLmZvY3VzKCl9LGlzRmlyc3RFbGVtZW50Rm9jdXNlZDpmdW5jdGlvbigpe3JldHVybiB0LmZpcnN0Rm9jdXNhYmxlRWxlbWVudD09PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9LGlzTGFzdEVsZW1lbnRGb2N1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuIHQubGFzdEZvY3VzYWJsZUVsZW1lbnQ9PT1kb2N1bWVudC5hY3RpdmVFbGVtZW50fSxmb2N1c0ZpcnN0RWxlbWVudDpmdW5jdGlvbigpe3JldHVybiEhdC5maXJzdEZvY3VzYWJsZUVsZW1lbnQmJih0LmZpcnN0Rm9jdXNhYmxlRWxlbWVudC5mb2N1cyYmdC5maXJzdEZvY3VzYWJsZUVsZW1lbnQuZm9jdXMoKSl9LGZvY3VzTGFzdEVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5sYXN0Rm9jdXNhYmxlRWxlbWVudCYmdC5sYXN0Rm9jdXNhYmxlRWxlbWVudC5mb2N1cyYmdC5sYXN0Rm9jdXNhYmxlRWxlbWVudC5mb2N1cygpfX0se2dldElubmVyRGltZW5zaW9uczpmdW5jdGlvbigpe3ZhciBlPXQubWVudVN1cmZhY2VFbGVtZW50LmN1cnJlbnQ7cmV0dXJuIGU/e3dpZHRoOmUub2Zmc2V0V2lkdGgsaGVpZ2h0OmUub2Zmc2V0SGVpZ2h0fTp7d2lkdGg6MCxoZWlnaHQ6MH19LGdldEFuY2hvckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gdC5wcm9wcy5hbmNob3JFbGVtZW50P3QucHJvcHMuYW5jaG9yRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTpudWxsfSxnZXRXaW5kb3dEaW1lbnNpb25zOmZ1bmN0aW9uKCl7cmV0dXJue3dpZHRoOndpbmRvdy5pbm5lcldpZHRoLGhlaWdodDp3aW5kb3cuaW5uZXJIZWlnaHR9fSxnZXRCb2R5RGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybnt3aWR0aDpkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLGhlaWdodDpkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodH19LGdldFdpbmRvd1Njcm9sbDpmdW5jdGlvbigpe3JldHVybnt4OndpbmRvdy5wYWdlWE9mZnNldCx5OndpbmRvdy5wYWdlWU9mZnNldH19LHNldFBvc2l0aW9uOmZ1bmN0aW9uKGUpe3Quc2V0U3RhdGUoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5hc3NpZ24odCx7c3R5bGVMZWZ0OlwibGVmdFwiaW4gZT9lLmxlZnQ6bnVsbCxzdHlsZVJpZ2h0OlwicmlnaHRcImluIGU/ZS5yaWdodDpudWxsLHN0eWxlVG9wOlwidG9wXCJpbiBlP2UudG9wOm51bGwsc3R5bGVCb3R0b206XCJib3R0b21cImluIGU/ZS5ib3R0b206bnVsbH0pfSl9LHNldE1heEhlaWdodDpmdW5jdGlvbihlKXtyZXR1cm4gdC5zZXRTdGF0ZSh7bWF4SGVpZ2h0OmV9KX19KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9KHQuYW5jaG9yQ29ybmVyLHQuYW5jaG9yRWxlbWVudCx0LmFuY2hvck1hcmdpbix0LmNsYXNzTmFtZSx0LmNvb3JkaW5hdGVzLHQuZml4ZWQsdC5vbkNsb3NlLHQub25PcGVuLHQub25LZXlEb3duLHQuc3R5bGVzLHQucXVpY2tPcGVuLHQub25Nb3VudCx0LmNoaWxkcmVuKSxuPXModCxbXCJhbmNob3JDb3JuZXJcIixcImFuY2hvckVsZW1lbnRcIixcImFuY2hvck1hcmdpblwiLFwiY2xhc3NOYW1lXCIsXCJjb29yZGluYXRlc1wiLFwiZml4ZWRcIixcIm9uQ2xvc2VcIixcIm9uT3BlblwiLFwib25LZXlEb3duXCIsXCJzdHlsZXNcIixcInF1aWNrT3BlblwiLFwib25Nb3VudFwiLFwiY2hpbGRyZW5cIl0pO3JldHVybiB0aGlzLnN0YXRlLm1vdW50ZWQ/Yy5kZWZhdWx0LmNyZWF0ZVBvcnRhbChhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHIoe2NsYXNzTmFtZTp0aGlzLmNsYXNzZXMsb25LZXlEb3duOnRoaXMuaGFuZGxlS2V5ZG93bixyZWY6dGhpcy5tZW51U3VyZmFjZUVsZW1lbnQsc3R5bGU6dGhpcy5zdHlsZXN9LG4pLGUpLGRvY3VtZW50LmJvZHkpOm51bGx9LGUuZGVmYXVsdFByb3BzPXtjbGFzc05hbWU6XCJcIixzdHlsZXM6e30sYW5jaG9yQ29ybmVyOjAsYW5jaG9yTWFyZ2luOnt9LG9uQ2xvc2U6ZnVuY3Rpb24oKXt9LG9uT3BlbjpmdW5jdGlvbigpe30sb25LZXlEb3duOmZ1bmN0aW9uKCl7fSxxdWlja09wZW46ITEsb3BlbjohMSxmaXhlZDohMX0sZX0oYS5kZWZhdWx0LkNvbXBvbmVudCk7ZS5kZWZhdWx0PWR9LDEwMzpmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1ufSwxNTpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJiXCIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLG4uZChlLFwiYVwiLGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KSxuLmQoZSxcImRcIixmdW5jdGlvbigpe3JldHVybiBzfSksbi5kKGUsXCJjXCIsZnVuY3Rpb24oKXtyZXR1cm4gYX0pO1wiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yO1xuLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxuXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovdmFyIG89ZnVuY3Rpb24odCxlKXtyZXR1cm4obz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9O2Z1bmN0aW9uIGkodCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fW8odCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9dmFyIHI9ZnVuY3Rpb24oKXtyZXR1cm4ocj1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLG89YXJndW1lbnRzLmxlbmd0aDtuPG87bisrKWZvcih2YXIgaSBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxpKSYmKHRbaV09ZVtpXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2Z1bmN0aW9uIHModCl7dmFyIGU9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0W1N5bWJvbC5pdGVyYXRvcl0sbj0wO3JldHVybiBlP2UuY2FsbCh0KTp7bmV4dDpmdW5jdGlvbigpe3JldHVybiB0JiZuPj10Lmxlbmd0aCYmKHQ9dm9pZCAwKSx7dmFsdWU6dCYmdFtuKytdLGRvbmU6IXR9fX19ZnVuY3Rpb24gdSh0LGUpe3ZhciBuPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdO2lmKCFuKXJldHVybiB0O3ZhciBvLGkscj1uLmNhbGwodCkscz1bXTt0cnl7Zm9yKDsodm9pZCAwPT09ZXx8ZS0tID4wKSYmIShvPXIubmV4dCgpKS5kb25lOylzLnB1c2goby52YWx1ZSl9Y2F0Y2godCl7aT17ZXJyb3I6dH19ZmluYWxseXt0cnl7byYmIW8uZG9uZSYmKG49ci5yZXR1cm4pJiZuLmNhbGwocil9ZmluYWxseXtpZihpKXRocm93IGkuZXJyb3J9fXJldHVybiBzfWZ1bmN0aW9uIGEoKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdD10LmNvbmNhdCh1KGFyZ3VtZW50c1tlXSkpO3JldHVybiB0fX0sMTU5OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSk7dmFyIG8saT17fTtmdW5jdGlvbiByKHQsZSl7aWYodm9pZCAwPT09ZSYmKGU9ITEpLHZvaWQgMD09PW98fGUpe3ZhciBuPXQuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtvPVwidHJhbnNmb3JtXCJpbiBuLnN0eWxlP1widHJhbnNmb3JtXCI6XCJ3ZWJraXRUcmFuc2Zvcm1cIn1yZXR1cm4gb31uLnIoaSksbi5kKGksXCJnZXRUcmFuc2Zvcm1Qcm9wZXJ0eU5hbWVcIixmdW5jdGlvbigpe3JldHVybiByfSk7dmFyIHM9bigzKSx1PW4oMTUpLGE9bigyOCksYz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIG49W10sbz0yO288YXJndW1lbnRzLmxlbmd0aDtvKyspbltvLTJdPWFyZ3VtZW50c1tvXTt0aGlzLnJvb3RfPXQsdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsdS5jKG4pKSx0aGlzLmZvdW5kYXRpb25fPXZvaWQgMD09PWU/dGhpcy5nZXREZWZhdWx0Rm91bmRhdGlvbigpOmUsdGhpcy5mb3VuZGF0aW9uXy5pbml0KCksdGhpcy5pbml0aWFsU3luY1dpdGhET00oKX1yZXR1cm4gdC5hdHRhY2hUbz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQoZSxuZXcgYS5hKHt9KSl9LHQucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV19LHQucHJvdG90eXBlLmdldERlZmF1bHRGb3VuZGF0aW9uPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFwiU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIGdldERlZmF1bHRGb3VuZGF0aW9uIHRvIHJldHVybiBhIHByb3Blcmx5IGNvbmZpZ3VyZWQgZm91bmRhdGlvbiBjbGFzc1wiKX0sdC5wcm90b3R5cGUuaW5pdGlhbFN5bmNXaXRoRE9NPWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5mb3VuZGF0aW9uXy5kZXN0cm95KCl9LHQucHJvdG90eXBlLmxpc3Rlbj1mdW5jdGlvbih0LGUpe3RoaXMucm9vdF8uYWRkRXZlbnRMaXN0ZW5lcih0LGUpfSx0LnByb3RvdHlwZS51bmxpc3Rlbj1mdW5jdGlvbih0LGUpe3RoaXMucm9vdF8ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LGUpfSx0LnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKHQsZSxuKXt2YXIgbzt2b2lkIDA9PT1uJiYobj0hMSksXCJmdW5jdGlvblwiPT10eXBlb2YgQ3VzdG9tRXZlbnQ/bz1uZXcgQ3VzdG9tRXZlbnQodCx7YnViYmxlczpuLGRldGFpbDplfSk6KG89ZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJDdXN0b21FdmVudFwiKSkuaW5pdEN1c3RvbUV2ZW50KHQsbiwhMSxlKSx0aGlzLnJvb3RfLmRpc3BhdGNoRXZlbnQobyl9LHR9KCksbD1uKDE2KSxmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiB1LmIoZSx0KSxlLmF0dGFjaFRvPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5wcm90b3R5cGUuaW5pdGlhbFN5bmNXaXRoRE9NPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMucm9vdF8ucGFyZW50RWxlbWVudDt0aGlzLmFuY2hvckVsZW1lbnQ9ZSYmZS5jbGFzc0xpc3QuY29udGFpbnMocy5jLkFOQ0hPUik/ZTpudWxsLHRoaXMucm9vdF8uY2xhc3NMaXN0LmNvbnRhaW5zKHMuYy5GSVhFRCkmJnRoaXMuc2V0Rml4ZWRQb3NpdGlvbighMCksdGhpcy5oYW5kbGVLZXlkb3duXz1mdW5jdGlvbihlKXtyZXR1cm4gdC5mb3VuZGF0aW9uXy5oYW5kbGVLZXlkb3duKGUpfSx0aGlzLmhhbmRsZUJvZHlDbGlja189ZnVuY3Rpb24oZSl7cmV0dXJuIHQuZm91bmRhdGlvbl8uaGFuZGxlQm9keUNsaWNrKGUpfSx0aGlzLnJlZ2lzdGVyQm9keUNsaWNrTGlzdGVuZXJfPWZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsdC5oYW5kbGVCb2R5Q2xpY2tfKX0sdGhpcy5kZXJlZ2lzdGVyQm9keUNsaWNrTGlzdGVuZXJfPWZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsdC5oYW5kbGVCb2R5Q2xpY2tfKX0sdGhpcy5saXN0ZW4oXCJrZXlkb3duXCIsdGhpcy5oYW5kbGVLZXlkb3duXyksdGhpcy5saXN0ZW4ocy5lLk9QRU5FRF9FVkVOVCx0aGlzLnJlZ2lzdGVyQm9keUNsaWNrTGlzdGVuZXJfKSx0aGlzLmxpc3RlbihzLmUuQ0xPU0VEX0VWRU5ULHRoaXMuZGVyZWdpc3RlckJvZHlDbGlja0xpc3RlbmVyXyl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLnVubGlzdGVuKFwia2V5ZG93blwiLHRoaXMuaGFuZGxlS2V5ZG93bl8pLHRoaXMudW5saXN0ZW4ocy5lLk9QRU5FRF9FVkVOVCx0aGlzLnJlZ2lzdGVyQm9keUNsaWNrTGlzdGVuZXJfKSx0aGlzLnVubGlzdGVuKHMuZS5DTE9TRURfRVZFTlQsdGhpcy5kZXJlZ2lzdGVyQm9keUNsaWNrTGlzdGVuZXJfKSx0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcIm9wZW5cIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZm91bmRhdGlvbl8uaXNPcGVuKCl9LHNldDpmdW5jdGlvbih0KXtpZih0KXt2YXIgZT10aGlzLnJvb3RfLnF1ZXJ5U2VsZWN0b3JBbGwocy5lLkZPQ1VTQUJMRV9FTEVNRU5UUyk7dGhpcy5maXJzdEZvY3VzYWJsZUVsZW1lbnRfPWVbMF0sdGhpcy5sYXN0Rm9jdXNhYmxlRWxlbWVudF89ZVtlLmxlbmd0aC0xXSx0aGlzLmZvdW5kYXRpb25fLm9wZW4oKX1lbHNlIHRoaXMuZm91bmRhdGlvbl8uY2xvc2UoKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJxdWlja09wZW5cIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuZm91bmRhdGlvbl8uc2V0UXVpY2tPcGVuKHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmhvaXN0TWVudVRvQm9keT1mdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5yb290XyksdGhpcy5zZXRJc0hvaXN0ZWQoITApfSxlLnByb3RvdHlwZS5zZXRJc0hvaXN0ZWQ9ZnVuY3Rpb24odCl7dGhpcy5mb3VuZGF0aW9uXy5zZXRJc0hvaXN0ZWQodCl9LGUucHJvdG90eXBlLnNldE1lbnVTdXJmYWNlQW5jaG9yRWxlbWVudD1mdW5jdGlvbih0KXt0aGlzLmFuY2hvckVsZW1lbnQ9dH0sZS5wcm90b3R5cGUuc2V0Rml4ZWRQb3NpdGlvbj1mdW5jdGlvbih0KXt0P3RoaXMucm9vdF8uY2xhc3NMaXN0LmFkZChzLmMuRklYRUQpOnRoaXMucm9vdF8uY2xhc3NMaXN0LnJlbW92ZShzLmMuRklYRUQpLHRoaXMuZm91bmRhdGlvbl8uc2V0Rml4ZWRQb3NpdGlvbih0KX0sZS5wcm90b3R5cGUuc2V0QWJzb2x1dGVQb3NpdGlvbj1mdW5jdGlvbih0LGUpe3RoaXMuZm91bmRhdGlvbl8uc2V0QWJzb2x1dGVQb3NpdGlvbih0LGUpLHRoaXMuc2V0SXNIb2lzdGVkKCEwKX0sZS5wcm90b3R5cGUuc2V0QW5jaG9yQ29ybmVyPWZ1bmN0aW9uKHQpe3RoaXMuZm91bmRhdGlvbl8uc2V0QW5jaG9yQ29ybmVyKHQpfSxlLnByb3RvdHlwZS5zZXRBbmNob3JNYXJnaW49ZnVuY3Rpb24odCl7dGhpcy5mb3VuZGF0aW9uXy5zZXRBbmNob3JNYXJnaW4odCl9LGUucHJvdG90eXBlLmdldERlZmF1bHRGb3VuZGF0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXthZGRDbGFzczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yb290Xy5jbGFzc0xpc3QuYWRkKGUpfSxyZW1vdmVDbGFzczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yb290Xy5jbGFzc0xpc3QucmVtb3ZlKGUpfSxoYXNDbGFzczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yb290Xy5jbGFzc0xpc3QuY29udGFpbnMoZSl9LGhhc0FuY2hvcjpmdW5jdGlvbigpe3JldHVybiEhdC5hbmNob3JFbGVtZW50fSxub3RpZnlDbG9zZTpmdW5jdGlvbigpe3JldHVybiB0LmVtaXQobC5NRENNZW51U3VyZmFjZUZvdW5kYXRpb24uc3RyaW5ncy5DTE9TRURfRVZFTlQse30pfSxub3RpZnlPcGVuOmZ1bmN0aW9uKCl7cmV0dXJuIHQuZW1pdChsLk1EQ01lbnVTdXJmYWNlRm91bmRhdGlvbi5zdHJpbmdzLk9QRU5FRF9FVkVOVCx7fSl9LGlzRWxlbWVudEluQ29udGFpbmVyOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJvb3RfLmNvbnRhaW5zKGUpfSxpc1J0bDpmdW5jdGlvbigpe3JldHVyblwicnRsXCI9PT1nZXRDb21wdXRlZFN0eWxlKHQucm9vdF8pLmdldFByb3BlcnR5VmFsdWUoXCJkaXJlY3Rpb25cIil9LHNldFRyYW5zZm9ybU9yaWdpbjpmdW5jdGlvbihlKXt2YXIgbj1yKHdpbmRvdykrXCItb3JpZ2luXCI7dC5yb290Xy5zdHlsZS5zZXRQcm9wZXJ0eShuLGUpfSxpc0ZvY3VzZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PXQucm9vdF99LHNhdmVGb2N1czpmdW5jdGlvbigpe3QucHJldmlvdXNGb2N1c189ZG9jdW1lbnQuYWN0aXZlRWxlbWVudH0scmVzdG9yZUZvY3VzOmZ1bmN0aW9uKCl7dC5yb290Xy5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSYmdC5wcmV2aW91c0ZvY3VzXyYmdC5wcmV2aW91c0ZvY3VzXy5mb2N1cyYmdC5wcmV2aW91c0ZvY3VzXy5mb2N1cygpfSxpc0ZpcnN0RWxlbWVudEZvY3VzZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXQuZmlyc3RGb2N1c2FibGVFbGVtZW50XyYmdC5maXJzdEZvY3VzYWJsZUVsZW1lbnRfPT09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudH0saXNMYXN0RWxlbWVudEZvY3VzZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXQubGFzdEZvY3VzYWJsZUVsZW1lbnRfJiZ0Lmxhc3RGb2N1c2FibGVFbGVtZW50Xz09PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9LGZvY3VzRmlyc3RFbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHQuZmlyc3RGb2N1c2FibGVFbGVtZW50XyYmdC5maXJzdEZvY3VzYWJsZUVsZW1lbnRfLmZvY3VzJiZ0LmZpcnN0Rm9jdXNhYmxlRWxlbWVudF8uZm9jdXMoKX0sZm9jdXNMYXN0RWxlbWVudDpmdW5jdGlvbigpe3JldHVybiB0Lmxhc3RGb2N1c2FibGVFbGVtZW50XyYmdC5sYXN0Rm9jdXNhYmxlRWxlbWVudF8uZm9jdXMmJnQubGFzdEZvY3VzYWJsZUVsZW1lbnRfLmZvY3VzKCl9LGdldElubmVyRGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybnt3aWR0aDp0LnJvb3RfLm9mZnNldFdpZHRoLGhlaWdodDp0LnJvb3RfLm9mZnNldEhlaWdodH19LGdldEFuY2hvckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gdC5hbmNob3JFbGVtZW50P3QuYW5jaG9yRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTpudWxsfSxnZXRXaW5kb3dEaW1lbnNpb25zOmZ1bmN0aW9uKCl7cmV0dXJue3dpZHRoOndpbmRvdy5pbm5lcldpZHRoLGhlaWdodDp3aW5kb3cuaW5uZXJIZWlnaHR9fSxnZXRCb2R5RGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybnt3aWR0aDpkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLGhlaWdodDpkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodH19LGdldFdpbmRvd1Njcm9sbDpmdW5jdGlvbigpe3JldHVybnt4OndpbmRvdy5wYWdlWE9mZnNldCx5OndpbmRvdy5wYWdlWU9mZnNldH19LHNldFBvc2l0aW9uOmZ1bmN0aW9uKGUpe3Qucm9vdF8uc3R5bGUubGVmdD1cImxlZnRcImluIGU/ZS5sZWZ0K1wicHhcIjpcIlwiLHQucm9vdF8uc3R5bGUucmlnaHQ9XCJyaWdodFwiaW4gZT9lLnJpZ2h0K1wicHhcIjpcIlwiLHQucm9vdF8uc3R5bGUudG9wPVwidG9wXCJpbiBlP2UudG9wK1wicHhcIjpcIlwiLHQucm9vdF8uc3R5bGUuYm90dG9tPVwiYm90dG9tXCJpbiBlP2UuYm90dG9tK1wicHhcIjpcIlwifSxzZXRNYXhIZWlnaHQ6ZnVuY3Rpb24oZSl7dC5yb290Xy5zdHlsZS5tYXhIZWlnaHQ9ZX19O3JldHVybiBuZXcgbC5NRENNZW51U3VyZmFjZUZvdW5kYXRpb24oZSl9LGV9KGMpO24uZChlLFwiQ29ybmVyXCIsZnVuY3Rpb24oKXtyZXR1cm4gcy5hfSksbi5kKGUsXCJDb3JuZXJCaXRcIixmdW5jdGlvbigpe3JldHVybiBzLmJ9KSxuLmQoZSxcInV0aWxcIixmdW5jdGlvbigpe3JldHVybiBpfSksbi5kKGUsXCJNRENNZW51U3VyZmFjZVwiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KSxuLmQoZSxcIk1EQ01lbnVTdXJmYWNlRm91bmRhdGlvblwiLGZ1bmN0aW9uKCl7cmV0dXJuIGwuTURDTWVudVN1cmZhY2VGb3VuZGF0aW9ufSl9LDE2OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSksbi5kKGUsXCJNRENNZW51U3VyZmFjZUZvdW5kYXRpb25cIixmdW5jdGlvbigpe3JldHVybiBzfSk7dmFyIG89bigxNSksaT1uKDI4KSxyPW4oMykscz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciBpPXQuY2FsbCh0aGlzLG8uYSh7fSxlLmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpcztyZXR1cm4gaS5pc09wZW5fPSExLGkuaXNRdWlja09wZW5fPSExLGkuaXNIb2lzdGVkRWxlbWVudF89ITEsaS5pc0ZpeGVkUG9zaXRpb25fPSExLGkub3BlbkFuaW1hdGlvbkVuZFRpbWVySWRfPTAsaS5jbG9zZUFuaW1hdGlvbkVuZFRpbWVySWRfPTAsaS5hbmltYXRpb25SZXF1ZXN0SWRfPTAsaS5hbmNob3JDb3JuZXJfPXIuYS5UT1BfU1RBUlQsaS5hbmNob3JNYXJnaW5fPXt0b3A6MCxyaWdodDowLGJvdHRvbTowLGxlZnQ6MH0saS5wb3NpdGlvbl89e3g6MCx5OjB9LGl9cmV0dXJuIG8uYihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5jfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwic3RyaW5nc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5lfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwibnVtYmVyc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5kfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiQ29ybmVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybiByLmF9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJkZWZhdWx0QWRhcHRlclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57YWRkQ2xhc3M6ZnVuY3Rpb24oKXt9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKCl7fSxoYXNDbGFzczpmdW5jdGlvbigpe3JldHVybiExfSxoYXNBbmNob3I6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXNFbGVtZW50SW5Db250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXNGb2N1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGlzRmlyc3RFbGVtZW50Rm9jdXNlZDpmdW5jdGlvbigpe3JldHVybiExfSxpc0xhc3RFbGVtZW50Rm9jdXNlZDpmdW5jdGlvbigpe3JldHVybiExfSxpc1J0bDpmdW5jdGlvbigpe3JldHVybiExfSxnZXRJbm5lckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm57aGVpZ2h0OjAsd2lkdGg6MH19LGdldEFuY2hvckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sZ2V0V2luZG93RGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybntoZWlnaHQ6MCx3aWR0aDowfX0sZ2V0Qm9keURpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm57aGVpZ2h0OjAsd2lkdGg6MH19LGdldFdpbmRvd1Njcm9sbDpmdW5jdGlvbigpe3JldHVybnt4OjAseTowfX0sc2V0UG9zaXRpb246ZnVuY3Rpb24oKXt9LHNldE1heEhlaWdodDpmdW5jdGlvbigpe30sc2V0VHJhbnNmb3JtT3JpZ2luOmZ1bmN0aW9uKCl7fSxzYXZlRm9jdXM6ZnVuY3Rpb24oKXt9LHJlc3RvcmVGb2N1czpmdW5jdGlvbigpe30sZm9jdXNGaXJzdEVsZW1lbnQ6ZnVuY3Rpb24oKXt9LGZvY3VzTGFzdEVsZW1lbnQ6ZnVuY3Rpb24oKXt9LG5vdGlmeUNsb3NlOmZ1bmN0aW9uKCl7fSxub3RpZnlPcGVuOmZ1bmN0aW9uKCl7fX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciB0PWUuY3NzQ2xhc3NlcyxuPXQuUk9PVCxvPXQuT1BFTjtpZighdGhpcy5hZGFwdGVyXy5oYXNDbGFzcyhuKSl0aHJvdyBuZXcgRXJyb3IobitcIiBjbGFzcyByZXF1aXJlZCBpbiByb290IGVsZW1lbnQuXCIpO3RoaXMuYWRhcHRlcl8uaGFzQ2xhc3MobykmJih0aGlzLmlzT3Blbl89ITApfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMub3BlbkFuaW1hdGlvbkVuZFRpbWVySWRfKSxjbGVhclRpbWVvdXQodGhpcy5jbG9zZUFuaW1hdGlvbkVuZFRpbWVySWRfKSxjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvblJlcXVlc3RJZF8pfSxlLnByb3RvdHlwZS5zZXRBbmNob3JDb3JuZXI9ZnVuY3Rpb24odCl7dGhpcy5hbmNob3JDb3JuZXJfPXR9LGUucHJvdG90eXBlLnNldEFuY2hvck1hcmdpbj1mdW5jdGlvbih0KXt0aGlzLmFuY2hvck1hcmdpbl8udG9wPXQudG9wfHwwLHRoaXMuYW5jaG9yTWFyZ2luXy5yaWdodD10LnJpZ2h0fHwwLHRoaXMuYW5jaG9yTWFyZ2luXy5ib3R0b209dC5ib3R0b218fDAsdGhpcy5hbmNob3JNYXJnaW5fLmxlZnQ9dC5sZWZ0fHwwfSxlLnByb3RvdHlwZS5zZXRJc0hvaXN0ZWQ9ZnVuY3Rpb24odCl7dGhpcy5pc0hvaXN0ZWRFbGVtZW50Xz10fSxlLnByb3RvdHlwZS5zZXRGaXhlZFBvc2l0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuaXNGaXhlZFBvc2l0aW9uXz10fSxlLnByb3RvdHlwZS5zZXRBYnNvbHV0ZVBvc2l0aW9uPWZ1bmN0aW9uKHQsZSl7dGhpcy5wb3NpdGlvbl8ueD10aGlzLmlzRmluaXRlXyh0KT90OjAsdGhpcy5wb3NpdGlvbl8ueT10aGlzLmlzRmluaXRlXyhlKT9lOjB9LGUucHJvdG90eXBlLnNldFF1aWNrT3Blbj1mdW5jdGlvbih0KXt0aGlzLmlzUXVpY2tPcGVuXz10fSxlLnByb3RvdHlwZS5pc09wZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc09wZW5ffSxlLnByb3RvdHlwZS5vcGVuPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmFkYXB0ZXJfLnNhdmVGb2N1cygpLHRoaXMuaXNRdWlja09wZW5ffHx0aGlzLmFkYXB0ZXJfLmFkZENsYXNzKGUuY3NzQ2xhc3Nlcy5BTklNQVRJTkdfT1BFTiksdGhpcy5hbmltYXRpb25SZXF1ZXN0SWRfPXJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3QuYWRhcHRlcl8uYWRkQ2xhc3MoZS5jc3NDbGFzc2VzLk9QRU4pLHQuZGltZW5zaW9uc189dC5hZGFwdGVyXy5nZXRJbm5lckRpbWVuc2lvbnMoKSx0LmF1dG9Qb3NpdGlvbl8oKSx0LmlzUXVpY2tPcGVuXz90LmFkYXB0ZXJfLm5vdGlmeU9wZW4oKTp0Lm9wZW5BbmltYXRpb25FbmRUaW1lcklkXz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5vcGVuQW5pbWF0aW9uRW5kVGltZXJJZF89MCx0LmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGUuY3NzQ2xhc3Nlcy5BTklNQVRJTkdfT1BFTiksdC5hZGFwdGVyXy5ub3RpZnlPcGVuKCl9LHIuZC5UUkFOU0lUSU9OX09QRU5fRFVSQVRJT04pfSksdGhpcy5pc09wZW5fPSEwfSxlLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5pc1F1aWNrT3Blbl98fHRoaXMuYWRhcHRlcl8uYWRkQ2xhc3MoZS5jc3NDbGFzc2VzLkFOSU1BVElOR19DTE9TRUQpLHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3QuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoZS5jc3NDbGFzc2VzLk9QRU4pLHQuaXNRdWlja09wZW5fP3QuYWRhcHRlcl8ubm90aWZ5Q2xvc2UoKTp0LmNsb3NlQW5pbWF0aW9uRW5kVGltZXJJZF89c2V0VGltZW91dChmdW5jdGlvbigpe3QuY2xvc2VBbmltYXRpb25FbmRUaW1lcklkXz0wLHQuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoZS5jc3NDbGFzc2VzLkFOSU1BVElOR19DTE9TRUQpLHQuYWRhcHRlcl8ubm90aWZ5Q2xvc2UoKX0sci5kLlRSQU5TSVRJT05fQ0xPU0VfRFVSQVRJT04pfSksdGhpcy5pc09wZW5fPSExLHRoaXMubWF5YmVSZXN0b3JlRm9jdXNfKCl9LGUucHJvdG90eXBlLmhhbmRsZUJvZHlDbGljaz1mdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldDt0aGlzLmFkYXB0ZXJfLmlzRWxlbWVudEluQ29udGFpbmVyKGUpfHx0aGlzLmNsb3NlKCl9LGUucHJvdG90eXBlLmhhbmRsZUtleWRvd249ZnVuY3Rpb24odCl7dmFyIGU9dC5rZXlDb2RlLG49dC5rZXksbz10LnNoaWZ0S2V5LGk9XCJUYWJcIj09PW58fDk9PT1lO1wiRXNjYXBlXCI9PT1ufHwyNz09PWU/dGhpcy5jbG9zZSgpOmkmJih0aGlzLmFkYXB0ZXJfLmlzTGFzdEVsZW1lbnRGb2N1c2VkKCkmJiFvPyh0aGlzLmFkYXB0ZXJfLmZvY3VzRmlyc3RFbGVtZW50KCksdC5wcmV2ZW50RGVmYXVsdCgpKTp0aGlzLmFkYXB0ZXJfLmlzRmlyc3RFbGVtZW50Rm9jdXNlZCgpJiZvJiYodGhpcy5hZGFwdGVyXy5mb2N1c0xhc3RFbGVtZW50KCksdC5wcmV2ZW50RGVmYXVsdCgpKSl9LGUucHJvdG90eXBlLmF1dG9Qb3NpdGlvbl89ZnVuY3Rpb24oKXt2YXIgdDt0aGlzLm1lYXN1cmVtZW50c189dGhpcy5nZXRBdXRvTGF5b3V0TWVhc3VyZW1lbnRzXygpO3ZhciBlPXRoaXMuZ2V0T3JpZ2luQ29ybmVyXygpLG49dGhpcy5nZXRNZW51U3VyZmFjZU1heEhlaWdodF8oZSksbz10aGlzLmhhc0JpdF8oZSxyLmIuQk9UVE9NKT9cImJvdHRvbVwiOlwidG9wXCIsaT10aGlzLmhhc0JpdF8oZSxyLmIuUklHSFQpP1wicmlnaHRcIjpcImxlZnRcIixzPXRoaXMuZ2V0SG9yaXpvbnRhbE9yaWdpbk9mZnNldF8oZSksdT10aGlzLmdldFZlcnRpY2FsT3JpZ2luT2Zmc2V0XyhlKSxhPXRoaXMubWVhc3VyZW1lbnRzXyxjPWEuYW5jaG9yU2l6ZSxsPWEuc3VyZmFjZVNpemUsZj0oKHQ9e30pW2ldPXMsdFtvXT11LHQpO2Mud2lkdGgvbC53aWR0aD5yLmQuQU5DSE9SX1RPX01FTlVfU1VSRkFDRV9XSURUSF9SQVRJTyYmKGk9XCJjZW50ZXJcIiksKHRoaXMuaXNIb2lzdGVkRWxlbWVudF98fHRoaXMuaXNGaXhlZFBvc2l0aW9uXykmJnRoaXMuYWRqdXN0UG9zaXRpb25Gb3JIb2lzdGVkRWxlbWVudF8oZiksdGhpcy5hZGFwdGVyXy5zZXRUcmFuc2Zvcm1PcmlnaW4oaStcIiBcIitvKSx0aGlzLmFkYXB0ZXJfLnNldFBvc2l0aW9uKGYpLHRoaXMuYWRhcHRlcl8uc2V0TWF4SGVpZ2h0KG4/bitcInB4XCI6XCJcIil9LGUucHJvdG90eXBlLmdldEF1dG9MYXlvdXRNZWFzdXJlbWVudHNfPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5hZGFwdGVyXy5nZXRBbmNob3JEaW1lbnNpb25zKCksZT10aGlzLmFkYXB0ZXJfLmdldEJvZHlEaW1lbnNpb25zKCksbj10aGlzLmFkYXB0ZXJfLmdldFdpbmRvd0RpbWVuc2lvbnMoKSxvPXRoaXMuYWRhcHRlcl8uZ2V0V2luZG93U2Nyb2xsKCk7cmV0dXJuIHR8fCh0PXt0b3A6dGhpcy5wb3NpdGlvbl8ueSxyaWdodDp0aGlzLnBvc2l0aW9uXy54LGJvdHRvbTp0aGlzLnBvc2l0aW9uXy55LGxlZnQ6dGhpcy5wb3NpdGlvbl8ueCx3aWR0aDowLGhlaWdodDowfSkse2FuY2hvclNpemU6dCxib2R5U2l6ZTplLHN1cmZhY2VTaXplOnRoaXMuZGltZW5zaW9uc18sdmlld3BvcnREaXN0YW5jZTp7dG9wOnQudG9wLHJpZ2h0Om4ud2lkdGgtdC5yaWdodCxib3R0b206bi5oZWlnaHQtdC5ib3R0b20sbGVmdDp0LmxlZnR9LHZpZXdwb3J0U2l6ZTpuLHdpbmRvd1Njcm9sbDpvfX0sZS5wcm90b3R5cGUuZ2V0T3JpZ2luQ29ybmVyXz1mdW5jdGlvbigpe3ZhciB0PXIuYS5UT1BfTEVGVCxlPXRoaXMubWVhc3VyZW1lbnRzXyxuPWUudmlld3BvcnREaXN0YW5jZSxvPWUuYW5jaG9yU2l6ZSxpPWUuc3VyZmFjZVNpemUscz10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLHIuYi5CT1RUT00pLHU9cz9uLnRvcCtvLmhlaWdodCt0aGlzLmFuY2hvck1hcmdpbl8uYm90dG9tOm4udG9wK3RoaXMuYW5jaG9yTWFyZ2luXy50b3AsYT1zP24uYm90dG9tLXRoaXMuYW5jaG9yTWFyZ2luXy5ib3R0b206bi5ib3R0b20rby5oZWlnaHQtdGhpcy5hbmNob3JNYXJnaW5fLnRvcCxjPWkuaGVpZ2h0LXUsbD1pLmhlaWdodC1hO2w+MCYmYzxsJiYodD10aGlzLnNldEJpdF8odCxyLmIuQk9UVE9NKSk7dmFyIGY9dGhpcy5hZGFwdGVyXy5pc1J0bCgpLGg9dGhpcy5oYXNCaXRfKHRoaXMuYW5jaG9yQ29ybmVyXyxyLmIuRkxJUF9SVEwpLGQ9dGhpcy5oYXNCaXRfKHRoaXMuYW5jaG9yQ29ybmVyXyxyLmIuUklHSFQpLHA9ZCYmIWZ8fCFkJiZoJiZmLG09cD9uLmxlZnQrby53aWR0aCt0aGlzLmFuY2hvck1hcmdpbl8ucmlnaHQ6bi5sZWZ0K3RoaXMuYW5jaG9yTWFyZ2luXy5sZWZ0LF89cD9uLnJpZ2h0LXRoaXMuYW5jaG9yTWFyZ2luXy5yaWdodDpuLnJpZ2h0K28ud2lkdGgtdGhpcy5hbmNob3JNYXJnaW5fLmxlZnQseT1pLndpZHRoLW0sZz1pLndpZHRoLV87cmV0dXJuKHk8MCYmcCYmZnx8ZCYmIXAmJnk8MHx8Zz4wJiZ5PGcpJiYodD10aGlzLnNldEJpdF8odCxyLmIuUklHSFQpKSx0fSxlLnByb3RvdHlwZS5nZXRNZW51U3VyZmFjZU1heEhlaWdodF89ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5tZWFzdXJlbWVudHNfLnZpZXdwb3J0RGlzdGFuY2Usbz0wLGk9dGhpcy5oYXNCaXRfKHQsci5iLkJPVFRPTSkscz10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLHIuYi5CT1RUT00pLHU9ZS5udW1iZXJzLk1BUkdJTl9UT19FREdFO3JldHVybiBpPyhvPW4udG9wK3RoaXMuYW5jaG9yTWFyZ2luXy50b3AtdSxzfHwobys9dGhpcy5tZWFzdXJlbWVudHNfLmFuY2hvclNpemUuaGVpZ2h0KSk6KG89bi5ib3R0b20tdGhpcy5hbmNob3JNYXJnaW5fLmJvdHRvbSt0aGlzLm1lYXN1cmVtZW50c18uYW5jaG9yU2l6ZS5oZWlnaHQtdSxzJiYoby09dGhpcy5tZWFzdXJlbWVudHNfLmFuY2hvclNpemUuaGVpZ2h0KSksb30sZS5wcm90b3R5cGUuZ2V0SG9yaXpvbnRhbE9yaWdpbk9mZnNldF89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5tZWFzdXJlbWVudHNfLmFuY2hvclNpemUsbj10aGlzLmhhc0JpdF8odCxyLmIuUklHSFQpLG89dGhpcy5oYXNCaXRfKHRoaXMuYW5jaG9yQ29ybmVyXyxyLmIuUklHSFQpO2lmKG4pe3ZhciBpPW8/ZS53aWR0aC10aGlzLmFuY2hvck1hcmdpbl8ubGVmdDp0aGlzLmFuY2hvck1hcmdpbl8ucmlnaHQ7cmV0dXJuIHRoaXMuaXNIb2lzdGVkRWxlbWVudF98fHRoaXMuaXNGaXhlZFBvc2l0aW9uXz9pLSh0aGlzLm1lYXN1cmVtZW50c18udmlld3BvcnRTaXplLndpZHRoLXRoaXMubWVhc3VyZW1lbnRzXy5ib2R5U2l6ZS53aWR0aCk6aX1yZXR1cm4gbz9lLndpZHRoLXRoaXMuYW5jaG9yTWFyZ2luXy5yaWdodDp0aGlzLmFuY2hvck1hcmdpbl8ubGVmdH0sZS5wcm90b3R5cGUuZ2V0VmVydGljYWxPcmlnaW5PZmZzZXRfPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubWVhc3VyZW1lbnRzXy5hbmNob3JTaXplLG49dGhpcy5oYXNCaXRfKHQsci5iLkJPVFRPTSksbz10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLHIuYi5CT1RUT00pO3JldHVybiBuP28/ZS5oZWlnaHQtdGhpcy5hbmNob3JNYXJnaW5fLnRvcDotdGhpcy5hbmNob3JNYXJnaW5fLmJvdHRvbTpvP2UuaGVpZ2h0K3RoaXMuYW5jaG9yTWFyZ2luXy5ib3R0b206dGhpcy5hbmNob3JNYXJnaW5fLnRvcH0sZS5wcm90b3R5cGUuYWRqdXN0UG9zaXRpb25Gb3JIb2lzdGVkRWxlbWVudF89ZnVuY3Rpb24odCl7dmFyIGUsbixpPXRoaXMubWVhc3VyZW1lbnRzXyxyPWkud2luZG93U2Nyb2xsLHM9aS52aWV3cG9ydERpc3RhbmNlLHU9T2JqZWN0LmtleXModCk7dHJ5e2Zvcih2YXIgYT1vLmQodSksYz1hLm5leHQoKTshYy5kb25lO2M9YS5uZXh0KCkpe3ZhciBsPWMudmFsdWUsZj10W2xdfHwwO2YrPXNbbF0sdGhpcy5pc0ZpeGVkUG9zaXRpb25ffHwoXCJ0b3BcIj09PWw/Zis9ci55OlwiYm90dG9tXCI9PT1sP2YtPXIueTpcImxlZnRcIj09PWw/Zis9ci54OmYtPXIueCksdFtsXT1mfX1jYXRjaCh0KXtlPXtlcnJvcjp0fX1maW5hbGx5e3RyeXtjJiYhYy5kb25lJiYobj1hLnJldHVybikmJm4uY2FsbChhKX1maW5hbGx5e2lmKGUpdGhyb3cgZS5lcnJvcn19fSxlLnByb3RvdHlwZS5tYXliZVJlc3RvcmVGb2N1c189ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmFkYXB0ZXJfLmlzRm9jdXNlZCgpLGU9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCYmdGhpcy5hZGFwdGVyXy5pc0VsZW1lbnRJbkNvbnRhaW5lcihkb2N1bWVudC5hY3RpdmVFbGVtZW50KTsodHx8ZSkmJnRoaXMuYWRhcHRlcl8ucmVzdG9yZUZvY3VzKCl9LGUucHJvdG90eXBlLmhhc0JpdF89ZnVuY3Rpb24odCxlKXtyZXR1cm4gQm9vbGVhbih0JmUpfSxlLnByb3RvdHlwZS5zZXRCaXRfPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHR8ZX0sZS5wcm90b3R5cGUuaXNGaW5pdGVfPWZ1bmN0aW9uKHQpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiB0JiZpc0Zpbml0ZSh0KX0sZX0oaS5hKTtlLmRlZmF1bHQ9c30sMjg6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24uZChlLFwiYVwiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZvaWQgMD09PXQmJih0PXt9KSx0aGlzLmFkYXB0ZXJfPXR9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcInN0cmluZ3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJudW1iZXJzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe30sdH0oKX0sMzpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJjXCIsZnVuY3Rpb24oKXtyZXR1cm4gcn0pLG4uZChlLFwiZVwiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSxuLmQoZSxcImRcIixmdW5jdGlvbigpe3JldHVybiB1fSksbi5kKGUsXCJiXCIsZnVuY3Rpb24oKXtyZXR1cm4gb30pLG4uZChlLFwiYVwiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIG8saSxyPXtBTkNIT1I6XCJtZGMtbWVudS1zdXJmYWNlLS1hbmNob3JcIixBTklNQVRJTkdfQ0xPU0VEOlwibWRjLW1lbnUtc3VyZmFjZS0tYW5pbWF0aW5nLWNsb3NlZFwiLEFOSU1BVElOR19PUEVOOlwibWRjLW1lbnUtc3VyZmFjZS0tYW5pbWF0aW5nLW9wZW5cIixGSVhFRDpcIm1kYy1tZW51LXN1cmZhY2UtLWZpeGVkXCIsT1BFTjpcIm1kYy1tZW51LXN1cmZhY2UtLW9wZW5cIixST09UOlwibWRjLW1lbnUtc3VyZmFjZVwifSxzPXtDTE9TRURfRVZFTlQ6XCJNRENNZW51U3VyZmFjZTpjbG9zZWRcIixPUEVORURfRVZFTlQ6XCJNRENNZW51U3VyZmFjZTpvcGVuZWRcIixGT0NVU0FCTEVfRUxFTUVOVFM6W1wiYnV0dG9uOm5vdCg6ZGlzYWJsZWQpXCIsJ1tocmVmXTpub3QoW2FyaWEtZGlzYWJsZWQ9XCJ0cnVlXCJdKScsXCJpbnB1dDpub3QoOmRpc2FibGVkKVwiLFwic2VsZWN0Om5vdCg6ZGlzYWJsZWQpXCIsXCJ0ZXh0YXJlYTpub3QoOmRpc2FibGVkKVwiLCdbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9XCItMVwiXSk6bm90KFthcmlhLWRpc2FibGVkPVwidHJ1ZVwiXSknXS5qb2luKFwiLCBcIil9LHU9e1RSQU5TSVRJT05fT1BFTl9EVVJBVElPTjoxMjAsVFJBTlNJVElPTl9DTE9TRV9EVVJBVElPTjo3NSxNQVJHSU5fVE9fRURHRTozMixBTkNIT1JfVE9fTUVOVV9TVVJGQUNFX1dJRFRIX1JBVElPOi42N307IWZ1bmN0aW9uKHQpe3RbdC5CT1RUT009MV09XCJCT1RUT01cIix0W3QuQ0VOVEVSPTJdPVwiQ0VOVEVSXCIsdFt0LlJJR0hUPTRdPVwiUklHSFRcIix0W3QuRkxJUF9SVEw9OF09XCJGTElQX1JUTFwifShvfHwobz17fSkpLGZ1bmN0aW9uKHQpe3RbdC5UT1BfTEVGVD0wXT1cIlRPUF9MRUZUXCIsdFt0LlRPUF9SSUdIVD00XT1cIlRPUF9SSUdIVFwiLHRbdC5CT1RUT01fTEVGVD0xXT1cIkJPVFRPTV9MRUZUXCIsdFt0LkJPVFRPTV9SSUdIVD01XT1cIkJPVFRPTV9SSUdIVFwiLHRbdC5UT1BfU1RBUlQ9OF09XCJUT1BfU1RBUlRcIix0W3QuVE9QX0VORD0xMl09XCJUT1BfRU5EXCIsdFt0LkJPVFRPTV9TVEFSVD05XT1cIkJPVFRPTV9TVEFSVFwiLHRbdC5CT1RUT01fRU5EPTEzXT1cIkJPVFRPTV9FTkRcIn0oaXx8KGk9e30pKX19KX0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVudS1zdXJmYWNlLmpzLm1hcCIsIiFmdW5jdGlvbih0LGUpe2lmKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPWUocmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtlbHNlIGlmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW1wicmVhY3RcIixcImNsYXNzbmFtZXNcIl0sZSk7ZWxzZXt2YXIgbj1cIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9lKHJlcXVpcmUoXCJyZWFjdFwiKSxyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk6ZSh0LnJlYWN0LHQuY2xhc3NuYW1lcyk7Zm9yKHZhciByIGluIG4pKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6dClbcl09bltyXX19KFwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcyxmdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT17fTtmdW5jdGlvbiBuKHIpe2lmKGVbcl0pcmV0dXJuIGVbcl0uZXhwb3J0czt2YXIgbz1lW3JdPXtpOnIsbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gdFtyXS5jYWxsKG8uZXhwb3J0cyxvLG8uZXhwb3J0cyxuKSxvLmw9ITAsby5leHBvcnRzfXJldHVybiBuLm09dCxuLmM9ZSxuLmQ9ZnVuY3Rpb24odCxlLHIpe24ubyh0LGUpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHtlbnVtZXJhYmxlOiEwLGdldDpyfSl9LG4ucj1mdW5jdGlvbih0KXtcInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6XCJNb2R1bGVcIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSxuLnQ9ZnVuY3Rpb24odCxlKXtpZigxJmUmJih0PW4odCkpLDgmZSlyZXR1cm4gdDtpZig0JmUmJlwib2JqZWN0XCI9PXR5cGVvZiB0JiZ0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIHI9T2JqZWN0LmNyZWF0ZShudWxsKTtpZihuLnIociksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsXCJkZWZhdWx0XCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pLDImZSYmXCJzdHJpbmdcIiE9dHlwZW9mIHQpZm9yKHZhciBvIGluIHQpbi5kKHIsbyxmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0uYmluZChudWxsLG8pKTtyZXR1cm4gcn0sbi5uPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiB0LmRlZmF1bHR9OmZ1bmN0aW9uKCl7cmV0dXJuIHR9O3JldHVybiBuLmQoZSxcImFcIixlKSxlfSxuLm89ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9LG4ucD1cIlwiLG4obi5zPTEwNCl9KHswOmZ1bmN0aW9uKGUsbil7ZS5leHBvcnRzPXR9LDE6ZnVuY3Rpb24odCxuKXt0LmV4cG9ydHM9ZX0sMTA0OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcixvPXRoaXMmJnRoaXMuX19leHRlbmRzfHwocj1mdW5jdGlvbih0LGUpe3JldHVybihyPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSkodCxlKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fXIodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxpPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKGk9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rKylmb3IodmFyIG8gaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbykmJih0W29dPWVbb10pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxhPXRoaXMmJnRoaXMuX19yZXN0fHxmdW5jdGlvbih0LGUpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LHIpJiZlLmluZGV4T2Yocik8MCYmKG5bcl09dFtyXSk7aWYobnVsbCE9dCYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG89MDtmb3Iocj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO288ci5sZW5ndGg7bysrKWUuaW5kZXhPZihyW29dKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodCxyW29dKSYmKG5bcltvXV09dFtyW29dXSl9cmV0dXJuIG59LHM9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIGM9cyhuKDApKSx1PXMobigxKSksbD1uKDE2OCksZD1uKDE2NSksZj1sLk1EQ05vdGNoZWRPdXRsaW5lRm91bmRhdGlvbi5jc3NDbGFzc2VzLHA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5ub3RjaGVkRWw9Yy5kZWZhdWx0LmNyZWF0ZVJlZigpLGUuc3RhdGU9e2NsYXNzTGlzdDpuZXcgU2V0LGZvdW5kYXRpb25Ob3RjaFdpZHRoOnZvaWQgMH0sZS5hZGRDbGFzcz1mdW5jdGlvbih0KXtlLnNldFN0YXRlKGZ1bmN0aW9uKGUpe3ZhciBuPW5ldyBTZXQoZS5jbGFzc0xpc3QpO3JldHVybiBuLmFkZCh0KSx7Y2xhc3NMaXN0Om59fSl9LGUubm90Y2g9ZnVuY3Rpb24oKXt2YXIgdD1lLnByb3BzLG49dC5ub3RjaFdpZHRoLHI9dC5ub3RjaDtlLmZvdW5kYXRpb24mJihyP2UuZm91bmRhdGlvbi5ub3RjaChuKTplLmZvdW5kYXRpb24uY2xvc2VOb3RjaCgpKX0sZX1yZXR1cm4gbyhlLHQpLGUucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmZvdW5kYXRpb249bmV3IGwuTURDTm90Y2hlZE91dGxpbmVGb3VuZGF0aW9uKHRoaXMuYWRhcHRlciksdGhpcy5mb3VuZGF0aW9uLmluaXQoKSx0aGlzLm5vdGNoKCksdGhpcy5sYWJlbCYmKHRoaXMubGFiZWwuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPVwiMHNcIix0aGlzLmFkZENsYXNzKGYuT1VUTElORV9VUEdSQURFRCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7dC5sYWJlbCYmKHQubGFiZWwuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPVwiXCIpfSkpfSxlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMuZm91bmRhdGlvbiYmdGhpcy5mb3VuZGF0aW9uLmRlc3Ryb3koKX0sZS5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPWZ1bmN0aW9uKHQpe3RoaXMucHJvcHMubm90Y2hXaWR0aD09PXQubm90Y2hXaWR0aCYmdGhpcy5wcm9wcy5ub3RjaD09PXQubm90Y2h8fHRoaXMubm90Y2goKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiY2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuc3RhdGUuY2xhc3NMaXN0LG49dGhpcy5wcm9wcy5jbGFzc05hbWU7cmV0dXJuIHUuZGVmYXVsdChcIm1kYy1ub3RjaGVkLW91dGxpbmVcIixBcnJheS5mcm9tKGUpLG4sKCh0PXt9KVtmLk5PX0xBQkVMXT0hdGhpcy5sYWJlbCx0KSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwibGFiZWxcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm90Y2hlZEVsLmN1cnJlbnQ/dGhpcy5ub3RjaGVkRWwuY3VycmVudC5xdWVyeVNlbGVjdG9yKFwiLlwiK2QuTURDRmxvYXRpbmdMYWJlbEZvdW5kYXRpb24uY3NzQ2xhc3Nlcy5ST09UKTpudWxsfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm57YWRkQ2xhc3M6dGhpcy5hZGRDbGFzcyxyZW1vdmVDbGFzczpmdW5jdGlvbihlKXt0LnNldFN0YXRlKGZ1bmN0aW9uKHQpe3ZhciBuPW5ldyBTZXQodC5jbGFzc0xpc3QpO3JldHVybiBuLmRlbGV0ZShlKSx7Y2xhc3NMaXN0Om59fSl9LHNldE5vdGNoV2lkdGhQcm9wZXJ0eTpmdW5jdGlvbihlKXtyZXR1cm4gdC5zZXRTdGF0ZSh7Zm91bmRhdGlvbk5vdGNoV2lkdGg6ZX0pfSxyZW1vdmVOb3RjaFdpZHRoUHJvcGVydHk6ZnVuY3Rpb24oKXtyZXR1cm4gdC5zZXRTdGF0ZSh7Zm91bmRhdGlvbk5vdGNoV2lkdGg6dm9pZCAwfSl9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9dC5jaGlsZHJlbixuPSh0LmNsYXNzTmFtZSx0Lm5vdGNoV2lkdGgsdC5ub3RjaCxhKHQsW1wiY2hpbGRyZW5cIixcImNsYXNzTmFtZVwiLFwibm90Y2hXaWR0aFwiLFwibm90Y2hcIl0pKSxyPXRoaXMuc3RhdGUuZm91bmRhdGlvbk5vdGNoV2lkdGgsbz17d2lkdGg6cj9yK1wicHhcIjp2b2lkIDB9O3JldHVybiBjLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLGkoe2NsYXNzTmFtZTp0aGlzLmNsYXNzZXMscmVmOnRoaXMubm90Y2hlZEVsfSxuKSxjLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJtZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nXCJ9KSxlP2MuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcIm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoXCIsc3R5bGU6b30sYy5kZWZhdWx0LkNoaWxkcmVuLm9ubHkoZSkpOm51bGwsYy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwibWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmdcIn0pKX0sZS5kZWZhdWx0UHJvcHM9e2NsYXNzTmFtZTpcIlwiLG5vdGNoV2lkdGg6MCxub3RjaDohMX0sZX0oYy5kZWZhdWx0LkNvbXBvbmVudCk7ZS5kZWZhdWx0PXB9LDE2NTpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5yKGUpO3ZhciByPW4oMjIpLG89bigyOSksaT17TEFCRUxfRkxPQVRfQUJPVkU6XCJtZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlXCIsTEFCRUxfU0hBS0U6XCJtZGMtZmxvYXRpbmctbGFiZWwtLXNoYWtlXCIsUk9PVDpcIm1kYy1mbG9hdGluZy1sYWJlbFwifTtuLmQoZSxcIk1EQ0Zsb2F0aW5nTGFiZWxGb3VuZGF0aW9uXCIsZnVuY3Rpb24oKXtyZXR1cm4gYX0pO1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG52YXIgYT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciBvPXQuY2FsbCh0aGlzLHIuYSh7fSxlLmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpcztyZXR1cm4gby5zaGFrZUFuaW1hdGlvbkVuZEhhbmRsZXJfPWZ1bmN0aW9uKCl7cmV0dXJuIG8uaGFuZGxlU2hha2VBbmltYXRpb25FbmRfKCl9LG99cmV0dXJuIHIuYihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybnthZGRDbGFzczpmdW5jdGlvbigpe30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oKXt9LGdldFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LHJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxkZXJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3RoaXMuYWRhcHRlcl8ucmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXIoXCJhbmltYXRpb25lbmRcIix0aGlzLnNoYWtlQW5pbWF0aW9uRW5kSGFuZGxlcl8pfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5hZGFwdGVyXy5kZXJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyKFwiYW5pbWF0aW9uZW5kXCIsdGhpcy5zaGFrZUFuaW1hdGlvbkVuZEhhbmRsZXJfKX0sZS5wcm90b3R5cGUuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZGFwdGVyXy5nZXRXaWR0aCgpfSxlLnByb3RvdHlwZS5zaGFrZT1mdW5jdGlvbih0KXt2YXIgbj1lLmNzc0NsYXNzZXMuTEFCRUxfU0hBS0U7dD90aGlzLmFkYXB0ZXJfLmFkZENsYXNzKG4pOnRoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3Mobil9LGUucHJvdG90eXBlLmZsb2F0PWZ1bmN0aW9uKHQpe3ZhciBuPWUuY3NzQ2xhc3NlcyxyPW4uTEFCRUxfRkxPQVRfQUJPVkUsbz1uLkxBQkVMX1NIQUtFO3Q/dGhpcy5hZGFwdGVyXy5hZGRDbGFzcyhyKToodGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyhyKSx0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKG8pKX0sZS5wcm90b3R5cGUuaGFuZGxlU2hha2VBbmltYXRpb25FbmRfPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5jc3NDbGFzc2VzLkxBQkVMX1NIQUtFO3RoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3ModCl9LGV9KG8uYSk7ZS5kZWZhdWx0PWF9LDE2ODpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5yKGUpO3ZhciByPW4oMjIpLG89bigyOSksaT17Tk9UQ0hfRUxFTUVOVF9TRUxFQ1RPUjpcIi5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaFwifSxhPXtOT1RDSF9FTEVNRU5UX1BBRERJTkc6OH0scz17Tk9fTEFCRUw6XCJtZGMtbm90Y2hlZC1vdXRsaW5lLS1uby1sYWJlbFwiLE9VVExJTkVfTk9UQ0hFRDpcIm1kYy1ub3RjaGVkLW91dGxpbmUtLW5vdGNoZWRcIixPVVRMSU5FX1VQR1JBREVEOlwibWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWRcIn07bi5kKGUsXCJNRENOb3RjaGVkT3V0bGluZUZvdW5kYXRpb25cIixmdW5jdGlvbigpe3JldHVybiBjfSk7XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cbnZhciBjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobil7cmV0dXJuIHQuY2FsbCh0aGlzLHIuYSh7fSxlLmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpc31yZXR1cm4gci5iKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzdHJpbmdzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gc30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIm51bWJlcnNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJkZWZhdWx0QWRhcHRlclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57YWRkQ2xhc3M6ZnVuY3Rpb24oKXt9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKCl7fSxzZXROb3RjaFdpZHRoUHJvcGVydHk6ZnVuY3Rpb24oKXt9LHJlbW92ZU5vdGNoV2lkdGhQcm9wZXJ0eTpmdW5jdGlvbigpe319fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLm5vdGNoPWZ1bmN0aW9uKHQpe3ZhciBuPWUuY3NzQ2xhc3Nlcy5PVVRMSU5FX05PVENIRUQ7dD4wJiYodCs9YS5OT1RDSF9FTEVNRU5UX1BBRERJTkcpLHRoaXMuYWRhcHRlcl8uc2V0Tm90Y2hXaWR0aFByb3BlcnR5KHQpLHRoaXMuYWRhcHRlcl8uYWRkQ2xhc3Mobil9LGUucHJvdG90eXBlLmNsb3NlTm90Y2g9ZnVuY3Rpb24oKXt2YXIgdD1lLmNzc0NsYXNzZXMuT1VUTElORV9OT1RDSEVEO3RoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3ModCksdGhpcy5hZGFwdGVyXy5yZW1vdmVOb3RjaFdpZHRoUHJvcGVydHkoKX0sZX0oby5hKTtlLmRlZmF1bHQ9Y30sMjI6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24uZChlLFwiYlwiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KSxuLmQoZSxcImFcIixmdW5jdGlvbigpe3JldHVybiBpfSk7XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3I7XG4vKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXG50aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZVxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcbk1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuXG5cblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xuYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi92YXIgcj1mdW5jdGlvbih0LGUpe3JldHVybihyPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSkodCxlKX07ZnVuY3Rpb24gbyh0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9cih0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX12YXIgaT1mdW5jdGlvbigpe3JldHVybihpPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEscj1hcmd1bWVudHMubGVuZ3RoO248cjtuKyspZm9yKHZhciBvIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG8pJiYodFtvXT1lW29dKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19LDI5OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImFcIixmdW5jdGlvbigpe3JldHVybiByfSk7XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cbnZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2b2lkIDA9PT10JiYodD17fSksdGhpcy5hZGFwdGVyXz10fXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJzdHJpbmdzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwibnVtYmVyc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt9LHQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt9LHR9KCl9fSl9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5vdGNoZWQtb3V0bGluZS5qcy5tYXAiLCIhZnVuY3Rpb24odCxlKXtpZihcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZSltb2R1bGUuZXhwb3J0cz1lKHJlcXVpcmUoXCJyZWFjdFwiKSxyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7ZWxzZSBpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQpZGVmaW5lKFtcInJlYWN0XCIsXCJjbGFzc25hbWVzXCJdLGUpO2Vsc2V7dmFyIG49XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZShyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcImNsYXNzbmFtZXNcIikpOmUodC5yZWFjdCx0LmNsYXNzbmFtZXMpO2Zvcih2YXIgaSBpbiBuKShcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnQpW2ldPW5baV19fShcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZj9zZWxmOnRoaXMsZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9e307ZnVuY3Rpb24gbihpKXtpZihlW2ldKXJldHVybiBlW2ldLmV4cG9ydHM7dmFyIGE9ZVtpXT17aTppLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIHRbaV0uY2FsbChhLmV4cG9ydHMsYSxhLmV4cG9ydHMsbiksYS5sPSEwLGEuZXhwb3J0c31yZXR1cm4gbi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxpKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6aX0pfSxuLnI9ZnVuY3Rpb24odCl7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOlwiTW9kdWxlXCJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiZcIm9iamVjdFwiPT10eXBlb2YgdCYmdCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCk7aWYobi5yKGkpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLFwiZGVmYXVsdFwiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KSwyJmUmJlwic3RyaW5nXCIhPXR5cGVvZiB0KWZvcih2YXIgYSBpbiB0KW4uZChpLGEsZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxhKSk7cmV0dXJuIGl9LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsXCJhXCIsZSksZX0sbi5vPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfSxuLnA9XCJcIixuKG4ucz0xMDcpfSh7MDpmdW5jdGlvbihlLG4pe2UuZXhwb3J0cz10fSwxOmZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWV9LDEwNzpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGksYT10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4oaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSkscj10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciBhIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLGEpJiYodFthXT1lW2FdKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sbz10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIGkgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKSYmZS5pbmRleE9mKGkpPDAmJihuW2ldPXRbaV0pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBhPTA7Zm9yKGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTthPGkubGVuZ3RoO2ErKyllLmluZGV4T2YoaVthXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsaVthXSkmJihuW2lbYV1dPXRbaVthXV0pfXJldHVybiBufSxzPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciB1PXMobigwKSksYz1zKG4oMSkpLGQ9bigxNTUpLHA9bigzOCksbD1uKDEwOCk7ZS53aXRoUmlwcGxlPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybihlPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oKXt2YXIgbj1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4uaXNDb21wb25lbnRNb3VudGVkPSEwLG4uaXNUb3VjaGVkPSExLG4uZGlzcGxheU5hbWU9XCJXaXRoUmlwcGxlKFwiK2Z1bmN0aW9uKHQpe3JldHVybiB0LmRpc3BsYXlOYW1lfHx0Lm5hbWV8fFwiQ29tcG9uZW50XCJ9KHQpK1wiKVwiLG4uc3RhdGU9e2NsYXNzTGlzdDpuZXcgU2V0LHN0eWxlOnt9fSxuLmluaXRpYWxpemVGb3VuZGF0aW9uPWZ1bmN0aW9uKHQsZSl7dmFyIGk9bi5jcmVhdGVBZGFwdGVyKHQsZSk7bi5mb3VuZGF0aW9uPW5ldyBkLk1EQ1JpcHBsZUZvdW5kYXRpb24oaSksbi5mb3VuZGF0aW9uLmluaXQoKX0sbi5jcmVhdGVBZGFwdGVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJue2Jyb3dzZXJTdXBwb3J0c0Nzc1ZhcnM6ZnVuY3Rpb24oKXtyZXR1cm4gcC5zdXBwb3J0c0Nzc1ZhcmlhYmxlcyh3aW5kb3cpfSxpc1VuYm91bmRlZDpmdW5jdGlvbigpe3JldHVybiBuLnByb3BzLnVuYm91bmRlZH0saXNTdXJmYWNlQWN0aXZlOmZ1bmN0aW9uKCl7cmV0dXJuIGU/bC5tYXRjaGVzKGUsXCI6YWN0aXZlXCIpOmwubWF0Y2hlcyh0LFwiOmFjdGl2ZVwiKX0saXNTdXJmYWNlRGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5wcm9wcy5kaXNhYmxlZH0sYWRkQ2xhc3M6ZnVuY3Rpb24odCl7bi5pc0NvbXBvbmVudE1vdW50ZWQmJm4uc2V0U3RhdGUoe2NsYXNzTGlzdDpuLnN0YXRlLmNsYXNzTGlzdC5hZGQodCl9KX0scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24odCl7aWYobi5pc0NvbXBvbmVudE1vdW50ZWQpe3ZhciBlPW4uc3RhdGUuY2xhc3NMaXN0O2UuZGVsZXRlKHQpLG4uc2V0U3RhdGUoe2NsYXNzTGlzdDplfSl9fSxyZWdpc3RlckRvY3VtZW50SW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHQsZSxwLmFwcGx5UGFzc2l2ZSgpKX0sZGVyZWdpc3RlckRvY3VtZW50SW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHQsZSxwLmFwcGx5UGFzc2l2ZSgpKX0scmVnaXN0ZXJSZXNpemVIYW5kbGVyOmZ1bmN0aW9uKHQpe3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLHQpfSxkZXJlZ2lzdGVyUmVzaXplSGFuZGxlcjpmdW5jdGlvbih0KXtyZXR1cm4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIix0KX0sdXBkYXRlQ3NzVmFyaWFibGU6bi51cGRhdGVDc3NWYXJpYWJsZSxjb21wdXRlQm91bmRpbmdSZWN0OmZ1bmN0aW9uKCl7cmV0dXJuIG4uaXNDb21wb25lbnRNb3VudGVkP24ucHJvcHMuY29tcHV0ZUJvdW5kaW5nUmVjdD9uLnByb3BzLmNvbXB1dGVCb3VuZGluZ1JlY3QodCk6dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTp7Ym90dG9tOjAsaGVpZ2h0OjAsbGVmdDowLHJpZ2h0OjAsdG9wOjAsd2lkdGg6MCx4OjAseTowfX0sY29udGFpbnNFdmVudFRhcmdldDpmdW5jdGlvbih0KXtyZXR1cm4hKCFlfHxudWxsPT09dCkmJmUuY29udGFpbnModCl9LHJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGRlcmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sZ2V0V2luZG93UGFnZU9mZnNldDpmdW5jdGlvbigpe3JldHVybnt4OndpbmRvdy5wYWdlWE9mZnNldCx5OndpbmRvdy5wYWdlWU9mZnNldH19fX0sbi5oYW5kbGVGb2N1cz1mdW5jdGlvbih0KXtuLnByb3BzLm9uRm9jdXMmJm4ucHJvcHMub25Gb2N1cyh0KSxuLmZvdW5kYXRpb24uaGFuZGxlRm9jdXMoKX0sbi5oYW5kbGVCbHVyPWZ1bmN0aW9uKHQpe24ucHJvcHMub25CbHVyJiZuLnByb3BzLm9uQmx1cih0KSxuLmZvdW5kYXRpb24uaGFuZGxlQmx1cigpfSxuLmhhbmRsZU1vdXNlRG93bj1mdW5jdGlvbih0KXtuLnByb3BzLm9uTW91c2VEb3duJiZuLnByb3BzLm9uTW91c2VEb3duKHQpLG4uaXNUb3VjaGVkP24uaXNUb3VjaGVkPSExOm4uYWN0aXZhdGVSaXBwbGUodCl9LG4uaGFuZGxlTW91c2VVcD1mdW5jdGlvbih0KXtuLnByb3BzLm9uTW91c2VVcCYmbi5wcm9wcy5vbk1vdXNlVXAodCksbi5kZWFjdGl2YXRlUmlwcGxlKCl9LG4uaGFuZGxlVG91Y2hTdGFydD1mdW5jdGlvbih0KXtuLmlzVG91Y2hlZD0hMCxuLnByb3BzLm9uVG91Y2hTdGFydCYmbi5wcm9wcy5vblRvdWNoU3RhcnQodCksbi5hY3RpdmF0ZVJpcHBsZSh0KX0sbi5oYW5kbGVUb3VjaEVuZD1mdW5jdGlvbih0KXtuLnByb3BzLm9uVG91Y2hFbmQmJm4ucHJvcHMub25Ub3VjaEVuZCh0KSxuLmRlYWN0aXZhdGVSaXBwbGUoKX0sbi5oYW5kbGVLZXlEb3duPWZ1bmN0aW9uKHQpe24ucHJvcHMub25LZXlEb3duJiZuLnByb3BzLm9uS2V5RG93bih0KSxuLmFjdGl2YXRlUmlwcGxlKHQpfSxuLmhhbmRsZUtleVVwPWZ1bmN0aW9uKHQpe24ucHJvcHMub25LZXlVcCYmbi5wcm9wcy5vbktleVVwKHQpLG4uZGVhY3RpdmF0ZVJpcHBsZSgpfSxuLmFjdGl2YXRlUmlwcGxlPWZ1bmN0aW9uKHQpe3QucGVyc2lzdCgpLG4uZm91bmRhdGlvbi5hY3RpdmF0ZSh0Lm5hdGl2ZUV2ZW50KX0sbi5kZWFjdGl2YXRlUmlwcGxlPWZ1bmN0aW9uKCl7bi5mb3VuZGF0aW9uLmRlYWN0aXZhdGUoKX0sbi51cGRhdGVDc3NWYXJpYWJsZT1mdW5jdGlvbih0LGUpe24uaXNDb21wb25lbnRNb3VudGVkJiZuLnNldFN0YXRlKGZ1bmN0aW9uKGkpe3ZhciBhPU9iamVjdC5hc3NpZ24oe30sbi5zdGF0ZS5zdHlsZSxpLnN0eWxlKTtyZXR1cm4gbnVsbD09PWU/ZGVsZXRlIGFbdF06YVt0XT1lLE9iamVjdC5hc3NpZ24oaSx7c3R5bGU6YX0pfSl9LG59cmV0dXJuIGEobixlKSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe2lmKCF0aGlzLmZvdW5kYXRpb24pdGhyb3cgbmV3IEVycm9yKFwiWW91IG11c3QgY2FsbCBpbml0UmlwcGxlIGZyb20gdGhlIGVsZW1lbnQncyByZWYgcHJvcCB0byBpbml0aWFsaXplIHRoZSBhZGFwdGVyIGZvciB3aXRoUmlwcGxlXCIpfSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9ZnVuY3Rpb24odCl7dGhpcy5wcm9wcy5kaXNhYmxlZCE9PXQuZGlzYWJsZWQmJnRoaXMucHJvcHMuZGlzYWJsZWQmJnRoaXMuZm91bmRhdGlvbi5oYW5kbGVCbHVyKCl9LG4ucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7dGhpcy5mb3VuZGF0aW9uJiYodGhpcy5pc0NvbXBvbmVudE1vdW50ZWQ9ITEsdGhpcy5mb3VuZGF0aW9uLmRlc3Ryb3koKSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSxcImNsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcy5jbGFzc05hbWUsZT10aGlzLnN0YXRlLmNsYXNzTGlzdDtyZXR1cm4gYy5kZWZhdWx0KEFycmF5LmZyb20oZSksdCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLFwic3R5bGVcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcy5zdHlsZSxlPXRoaXMuc3RhdGUuc3R5bGU7cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sZSx0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxuLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLG49KGUudW5ib3VuZGVkLGUuc3R5bGUsZS5jbGFzc05hbWUsZS5vbk1vdXNlRG93bixlLm9uTW91c2VVcCxlLm9uVG91Y2hTdGFydCxlLm9uVG91Y2hFbmQsZS5vbktleURvd24sZS5vbktleVVwLGUub25Gb2N1cyxlLm9uQmx1cixvKGUsW1widW5ib3VuZGVkXCIsXCJzdHlsZVwiLFwiY2xhc3NOYW1lXCIsXCJvbk1vdXNlRG93blwiLFwib25Nb3VzZVVwXCIsXCJvblRvdWNoU3RhcnRcIixcIm9uVG91Y2hFbmRcIixcIm9uS2V5RG93blwiLFwib25LZXlVcFwiLFwib25Gb2N1c1wiLFwib25CbHVyXCJdKSksaT1yKHt9LG4se29uTW91c2VEb3duOnRoaXMuaGFuZGxlTW91c2VEb3duLG9uTW91c2VVcDp0aGlzLmhhbmRsZU1vdXNlVXAsb25Ub3VjaFN0YXJ0OnRoaXMuaGFuZGxlVG91Y2hTdGFydCxvblRvdWNoRW5kOnRoaXMuaGFuZGxlVG91Y2hFbmQsb25LZXlEb3duOnRoaXMuaGFuZGxlS2V5RG93bixvbktleVVwOnRoaXMuaGFuZGxlS2V5VXAsb25Gb2N1czp0aGlzLmhhbmRsZUZvY3VzLG9uQmx1cjp0aGlzLmhhbmRsZUJsdXIsaW5pdFJpcHBsZTp0aGlzLmluaXRpYWxpemVGb3VuZGF0aW9uLGNsYXNzTmFtZTp0aGlzLmNsYXNzZXMsc3R5bGU6dGhpcy5zdHlsZX0pO3JldHVybiB1LmRlZmF1bHQuY3JlYXRlRWxlbWVudCh0LHIoe30saSkpfSxufSh1LmRlZmF1bHQuQ29tcG9uZW50KSkuZGVmYXVsdFByb3BzPXIoe3VuYm91bmRlZDohMSxkaXNhYmxlZDohMSxzdHlsZTp7fSxjbGFzc05hbWU6XCJcIixvbk1vdXNlRG93bjpmdW5jdGlvbigpe30sb25Nb3VzZVVwOmZ1bmN0aW9uKCl7fSxvblRvdWNoU3RhcnQ6ZnVuY3Rpb24oKXt9LG9uVG91Y2hFbmQ6ZnVuY3Rpb24oKXt9LG9uS2V5RG93bjpmdW5jdGlvbigpe30sb25LZXlVcDpmdW5jdGlvbigpe30sb25Gb2N1czpmdW5jdGlvbigpe30sb25CbHVyOmZ1bmN0aW9uKCl7fX0sdC5kZWZhdWx0UHJvcHMpLGV9fSwxMDg6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG5mdW5jdGlvbiBpKHQsZSl7aWYodC5jbG9zZXN0KXJldHVybiB0LmNsb3Nlc3QoZSk7Zm9yKHZhciBuPXQ7bjspe2lmKGEobixlKSlyZXR1cm4gbjtuPW4ucGFyZW50RWxlbWVudH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBhKHQsZSl7cmV0dXJuKHQubWF0Y2hlc3x8dC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fHQubXNNYXRjaGVzU2VsZWN0b3IpLmNhbGwodCxlKX1uLnIoZSksbi5kKGUsXCJjbG9zZXN0XCIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLG4uZChlLFwibWF0Y2hlc1wiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KX0sMTU1OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSk7XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3I7XG4vKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXG50aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZVxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcbk1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuXG5cblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xuYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi92YXIgaT1mdW5jdGlvbih0LGUpe3JldHVybihpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSkodCxlKX07dmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4oYT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgYSBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxhKSYmKHRbYV09ZVthXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG52YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dm9pZCAwPT09dCYmKHQ9e30pLHRoaXMuYWRhcHRlcl89dH1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJjc3NDbGFzc2VzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwic3RyaW5nc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIm51bWJlcnNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJkZWZhdWx0QWRhcHRlclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7fSx0fSgpLG89e0JHX0ZPQ1VTRUQ6XCJtZGMtcmlwcGxlLXVwZ3JhZGVkLS1iYWNrZ3JvdW5kLWZvY3VzZWRcIixGR19BQ1RJVkFUSU9OOlwibWRjLXJpcHBsZS11cGdyYWRlZC0tZm9yZWdyb3VuZC1hY3RpdmF0aW9uXCIsRkdfREVBQ1RJVkFUSU9OOlwibWRjLXJpcHBsZS11cGdyYWRlZC0tZm9yZWdyb3VuZC1kZWFjdGl2YXRpb25cIixST09UOlwibWRjLXJpcHBsZS11cGdyYWRlZFwiLFVOQk9VTkRFRDpcIm1kYy1yaXBwbGUtdXBncmFkZWQtLXVuYm91bmRlZFwifSxzPXtWQVJfRkdfU0NBTEU6XCItLW1kYy1yaXBwbGUtZmctc2NhbGVcIixWQVJfRkdfU0laRTpcIi0tbWRjLXJpcHBsZS1mZy1zaXplXCIsVkFSX0ZHX1RSQU5TTEFURV9FTkQ6XCItLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLWVuZFwiLFZBUl9GR19UUkFOU0xBVEVfU1RBUlQ6XCItLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLXN0YXJ0XCIsVkFSX0xFRlQ6XCItLW1kYy1yaXBwbGUtbGVmdFwiLFZBUl9UT1A6XCItLW1kYy1yaXBwbGUtdG9wXCJ9LHU9e0RFQUNUSVZBVElPTl9USU1FT1VUX01TOjIyNSxGR19ERUFDVElWQVRJT05fTVM6MTUwLElOSVRJQUxfT1JJR0lOX1NDQUxFOi42LFBBRERJTkc6MTAsVEFQX0RFTEFZX01TOjMwMH0sYz1uKDM4KTtuLmQoZSxcIk1EQ1JpcHBsZUZvdW5kYXRpb25cIixmdW5jdGlvbigpe3JldHVybiBmfSk7XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cbnZhciBkPVtcInRvdWNoc3RhcnRcIixcInBvaW50ZXJkb3duXCIsXCJtb3VzZWRvd25cIixcImtleWRvd25cIl0scD1bXCJ0b3VjaGVuZFwiLFwicG9pbnRlcnVwXCIsXCJtb3VzZXVwXCIsXCJjb250ZXh0bWVudVwiXSxsPVtdLGY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXt2YXIgaT10LmNhbGwodGhpcyxhKHt9LGUuZGVmYXVsdEFkYXB0ZXIsbikpfHx0aGlzO3JldHVybiBpLmFjdGl2YXRpb25BbmltYXRpb25IYXNFbmRlZF89ITEsaS5hY3RpdmF0aW9uVGltZXJfPTAsaS5mZ0RlYWN0aXZhdGlvblJlbW92YWxUaW1lcl89MCxpLmZnU2NhbGVfPVwiMFwiLGkuZnJhbWVfPXt3aWR0aDowLGhlaWdodDowfSxpLmluaXRpYWxTaXplXz0wLGkubGF5b3V0RnJhbWVfPTAsaS5tYXhSYWRpdXNfPTAsaS51bmJvdW5kZWRDb29yZHNfPXtsZWZ0OjAsdG9wOjB9LGkuYWN0aXZhdGlvblN0YXRlXz1pLmRlZmF1bHRBY3RpdmF0aW9uU3RhdGVfKCksaS5hY3RpdmF0aW9uVGltZXJDYWxsYmFja189ZnVuY3Rpb24oKXtpLmFjdGl2YXRpb25BbmltYXRpb25IYXNFbmRlZF89ITAsaS5ydW5EZWFjdGl2YXRpb25VWExvZ2ljSWZSZWFkeV8oKX0saS5hY3RpdmF0ZUhhbmRsZXJfPWZ1bmN0aW9uKHQpe3JldHVybiBpLmFjdGl2YXRlXyh0KX0saS5kZWFjdGl2YXRlSGFuZGxlcl89ZnVuY3Rpb24oKXtyZXR1cm4gaS5kZWFjdGl2YXRlXygpfSxpLmZvY3VzSGFuZGxlcl89ZnVuY3Rpb24oKXtyZXR1cm4gaS5oYW5kbGVGb2N1cygpfSxpLmJsdXJIYW5kbGVyXz1mdW5jdGlvbigpe3JldHVybiBpLmhhbmRsZUJsdXIoKX0saS5yZXNpemVIYW5kbGVyXz1mdW5jdGlvbigpe3JldHVybiBpLmxheW91dCgpfSxpfXJldHVybiBmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0oZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzdHJpbmdzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwibnVtYmVyc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybnthZGRDbGFzczpmdW5jdGlvbigpe30sYnJvd3NlclN1cHBvcnRzQ3NzVmFyczpmdW5jdGlvbigpe3JldHVybiEwfSxjb21wdXRlQm91bmRpbmdSZWN0OmZ1bmN0aW9uKCl7cmV0dXJue3RvcDowLHJpZ2h0OjAsYm90dG9tOjAsbGVmdDowLHdpZHRoOjAsaGVpZ2h0OjB9fSxjb250YWluc0V2ZW50VGFyZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuITB9LGRlcmVnaXN0ZXJEb2N1bWVudEludGVyYWN0aW9uSGFuZGxlcjpmdW5jdGlvbigpe30sZGVyZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcjpmdW5jdGlvbigpe30sZGVyZWdpc3RlclJlc2l6ZUhhbmRsZXI6ZnVuY3Rpb24oKXt9LGdldFdpbmRvd1BhZ2VPZmZzZXQ6ZnVuY3Rpb24oKXtyZXR1cm57eDowLHk6MH19LGlzU3VyZmFjZUFjdGl2ZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1N1cmZhY2VEaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiEwfSxpc1VuYm91bmRlZDpmdW5jdGlvbigpe3JldHVybiEwfSxyZWdpc3RlckRvY3VtZW50SW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxyZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcjpmdW5jdGlvbigpe30scmVnaXN0ZXJSZXNpemVIYW5kbGVyOmZ1bmN0aW9uKCl7fSxyZW1vdmVDbGFzczpmdW5jdGlvbigpe30sdXBkYXRlQ3NzVmFyaWFibGU6ZnVuY3Rpb24oKXt9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPXRoaXMuc3VwcG9ydHNQcmVzc1JpcHBsZV8oKTtpZih0aGlzLnJlZ2lzdGVyUm9vdEhhbmRsZXJzXyhuKSxuKXt2YXIgaT1lLmNzc0NsYXNzZXMsYT1pLlJPT1Qscj1pLlVOQk9VTkRFRDtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt0LmFkYXB0ZXJfLmFkZENsYXNzKGEpLHQuYWRhcHRlcl8uaXNVbmJvdW5kZWQoKSYmKHQuYWRhcHRlcl8uYWRkQ2xhc3MociksdC5sYXlvdXRJbnRlcm5hbF8oKSl9KX19LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKHRoaXMuc3VwcG9ydHNQcmVzc1JpcHBsZV8oKSl7dGhpcy5hY3RpdmF0aW9uVGltZXJfJiYoY2xlYXJUaW1lb3V0KHRoaXMuYWN0aXZhdGlvblRpbWVyXyksdGhpcy5hY3RpdmF0aW9uVGltZXJfPTAsdGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyhlLmNzc0NsYXNzZXMuRkdfQUNUSVZBVElPTikpLHRoaXMuZmdEZWFjdGl2YXRpb25SZW1vdmFsVGltZXJfJiYoY2xlYXJUaW1lb3V0KHRoaXMuZmdEZWFjdGl2YXRpb25SZW1vdmFsVGltZXJfKSx0aGlzLmZnRGVhY3RpdmF0aW9uUmVtb3ZhbFRpbWVyXz0wLHRoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoZS5jc3NDbGFzc2VzLkZHX0RFQUNUSVZBVElPTikpO3ZhciBuPWUuY3NzQ2xhc3NlcyxpPW4uUk9PVCxhPW4uVU5CT1VOREVEO3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3QuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoaSksdC5hZGFwdGVyXy5yZW1vdmVDbGFzcyhhKSx0LnJlbW92ZUNzc1ZhcnNfKCl9KX10aGlzLmRlcmVnaXN0ZXJSb290SGFuZGxlcnNfKCksdGhpcy5kZXJlZ2lzdGVyRGVhY3RpdmF0aW9uSGFuZGxlcnNfKCl9LGUucHJvdG90eXBlLmFjdGl2YXRlPWZ1bmN0aW9uKHQpe3RoaXMuYWN0aXZhdGVfKHQpfSxlLnByb3RvdHlwZS5kZWFjdGl2YXRlPWZ1bmN0aW9uKCl7dGhpcy5kZWFjdGl2YXRlXygpfSxlLnByb3RvdHlwZS5sYXlvdXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMubGF5b3V0RnJhbWVfJiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmxheW91dEZyYW1lXyksdGhpcy5sYXlvdXRGcmFtZV89cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7dC5sYXlvdXRJbnRlcm5hbF8oKSx0LmxheW91dEZyYW1lXz0wfSl9LGUucHJvdG90eXBlLnNldFVuYm91bmRlZD1mdW5jdGlvbih0KXt2YXIgbj1lLmNzc0NsYXNzZXMuVU5CT1VOREVEO3Q/dGhpcy5hZGFwdGVyXy5hZGRDbGFzcyhuKTp0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKG4pfSxlLnByb3RvdHlwZS5oYW5kbGVGb2N1cz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7cmV0dXJuIHQuYWRhcHRlcl8uYWRkQ2xhc3MoZS5jc3NDbGFzc2VzLkJHX0ZPQ1VTRUQpfSl9LGUucHJvdG90eXBlLmhhbmRsZUJsdXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3JldHVybiB0LmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGUuY3NzQ2xhc3Nlcy5CR19GT0NVU0VEKX0pfSxlLnByb3RvdHlwZS5zdXBwb3J0c1ByZXNzUmlwcGxlXz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFkYXB0ZXJfLmJyb3dzZXJTdXBwb3J0c0Nzc1ZhcnMoKX0sZS5wcm90b3R5cGUuZGVmYXVsdEFjdGl2YXRpb25TdGF0ZV89ZnVuY3Rpb24oKXtyZXR1cm57YWN0aXZhdGlvbkV2ZW50OnZvaWQgMCxoYXNEZWFjdGl2YXRpb25VWFJ1bjohMSxpc0FjdGl2YXRlZDohMSxpc1Byb2dyYW1tYXRpYzohMSx3YXNBY3RpdmF0ZWRCeVBvaW50ZXI6ITEsd2FzRWxlbWVudE1hZGVBY3RpdmU6ITF9fSxlLnByb3RvdHlwZS5yZWdpc3RlclJvb3RIYW5kbGVyc189ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0JiYoZC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UuYWRhcHRlcl8ucmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXIodCxlLmFjdGl2YXRlSGFuZGxlcl8pfSksdGhpcy5hZGFwdGVyXy5pc1VuYm91bmRlZCgpJiZ0aGlzLmFkYXB0ZXJfLnJlZ2lzdGVyUmVzaXplSGFuZGxlcih0aGlzLnJlc2l6ZUhhbmRsZXJfKSksdGhpcy5hZGFwdGVyXy5yZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcihcImZvY3VzXCIsdGhpcy5mb2N1c0hhbmRsZXJfKSx0aGlzLmFkYXB0ZXJfLnJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyKFwiYmx1clwiLHRoaXMuYmx1ckhhbmRsZXJfKX0sZS5wcm90b3R5cGUucmVnaXN0ZXJEZWFjdGl2YXRpb25IYW5kbGVyc189ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztcImtleWRvd25cIj09PXQudHlwZT90aGlzLmFkYXB0ZXJfLnJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyKFwia2V5dXBcIix0aGlzLmRlYWN0aXZhdGVIYW5kbGVyXyk6cC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UuYWRhcHRlcl8ucmVnaXN0ZXJEb2N1bWVudEludGVyYWN0aW9uSGFuZGxlcih0LGUuZGVhY3RpdmF0ZUhhbmRsZXJfKX0pfSxlLnByb3RvdHlwZS5kZXJlZ2lzdGVyUm9vdEhhbmRsZXJzXz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7ZC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuYWRhcHRlcl8uZGVyZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcihlLHQuYWN0aXZhdGVIYW5kbGVyXyl9KSx0aGlzLmFkYXB0ZXJfLmRlcmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXIoXCJmb2N1c1wiLHRoaXMuZm9jdXNIYW5kbGVyXyksdGhpcy5hZGFwdGVyXy5kZXJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyKFwiYmx1clwiLHRoaXMuYmx1ckhhbmRsZXJfKSx0aGlzLmFkYXB0ZXJfLmlzVW5ib3VuZGVkKCkmJnRoaXMuYWRhcHRlcl8uZGVyZWdpc3RlclJlc2l6ZUhhbmRsZXIodGhpcy5yZXNpemVIYW5kbGVyXyl9LGUucHJvdG90eXBlLmRlcmVnaXN0ZXJEZWFjdGl2YXRpb25IYW5kbGVyc189ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuYWRhcHRlcl8uZGVyZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcihcImtleXVwXCIsdGhpcy5kZWFjdGl2YXRlSGFuZGxlcl8pLHAuZm9yRWFjaChmdW5jdGlvbihlKXt0LmFkYXB0ZXJfLmRlcmVnaXN0ZXJEb2N1bWVudEludGVyYWN0aW9uSGFuZGxlcihlLHQuZGVhY3RpdmF0ZUhhbmRsZXJfKX0pfSxlLnByb3RvdHlwZS5yZW1vdmVDc3NWYXJzXz1mdW5jdGlvbigpe3ZhciB0PXRoaXMsbj1lLnN0cmluZ3M7T2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXswPT09ZS5pbmRleE9mKFwiVkFSX1wiKSYmdC5hZGFwdGVyXy51cGRhdGVDc3NWYXJpYWJsZShuW2VdLG51bGwpfSl9LGUucHJvdG90eXBlLmFjdGl2YXRlXz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKCF0aGlzLmFkYXB0ZXJfLmlzU3VyZmFjZURpc2FibGVkKCkpe3ZhciBuPXRoaXMuYWN0aXZhdGlvblN0YXRlXztpZighbi5pc0FjdGl2YXRlZCl7dmFyIGk9dGhpcy5wcmV2aW91c0FjdGl2YXRpb25FdmVudF87aWYoIShpJiZ2b2lkIDAhPT10JiZpLnR5cGUhPT10LnR5cGUpKW4uaXNBY3RpdmF0ZWQ9ITAsbi5pc1Byb2dyYW1tYXRpYz12b2lkIDA9PT10LG4uYWN0aXZhdGlvbkV2ZW50PXQsbi53YXNBY3RpdmF0ZWRCeVBvaW50ZXI9IW4uaXNQcm9ncmFtbWF0aWMmJih2b2lkIDAhPT10JiYoXCJtb3VzZWRvd25cIj09PXQudHlwZXx8XCJ0b3VjaHN0YXJ0XCI9PT10LnR5cGV8fFwicG9pbnRlcmRvd25cIj09PXQudHlwZSkpLHZvaWQgMCE9PXQmJmwubGVuZ3RoPjAmJmwuc29tZShmdW5jdGlvbih0KXtyZXR1cm4gZS5hZGFwdGVyXy5jb250YWluc0V2ZW50VGFyZ2V0KHQpfSk/dGhpcy5yZXNldEFjdGl2YXRpb25TdGF0ZV8oKToodm9pZCAwIT09dCYmKGwucHVzaCh0LnRhcmdldCksdGhpcy5yZWdpc3RlckRlYWN0aXZhdGlvbkhhbmRsZXJzXyh0KSksbi53YXNFbGVtZW50TWFkZUFjdGl2ZT10aGlzLmNoZWNrRWxlbWVudE1hZGVBY3RpdmVfKHQpLG4ud2FzRWxlbWVudE1hZGVBY3RpdmUmJnRoaXMuYW5pbWF0ZUFjdGl2YXRpb25fKCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7bD1bXSxuLndhc0VsZW1lbnRNYWRlQWN0aXZlfHx2b2lkIDA9PT10fHxcIiBcIiE9PXQua2V5JiYzMiE9PXQua2V5Q29kZXx8KG4ud2FzRWxlbWVudE1hZGVBY3RpdmU9ZS5jaGVja0VsZW1lbnRNYWRlQWN0aXZlXyh0KSxuLndhc0VsZW1lbnRNYWRlQWN0aXZlJiZlLmFuaW1hdGVBY3RpdmF0aW9uXygpKSxuLndhc0VsZW1lbnRNYWRlQWN0aXZlfHwoZS5hY3RpdmF0aW9uU3RhdGVfPWUuZGVmYXVsdEFjdGl2YXRpb25TdGF0ZV8oKSl9KSl9fX0sZS5wcm90b3R5cGUuY2hlY2tFbGVtZW50TWFkZUFjdGl2ZV89ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXR8fFwia2V5ZG93blwiIT09dC50eXBlfHx0aGlzLmFkYXB0ZXJfLmlzU3VyZmFjZUFjdGl2ZSgpfSxlLnByb3RvdHlwZS5hbmltYXRlQWN0aXZhdGlvbl89ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49ZS5zdHJpbmdzLGk9bi5WQVJfRkdfVFJBTlNMQVRFX1NUQVJULGE9bi5WQVJfRkdfVFJBTlNMQVRFX0VORCxyPWUuY3NzQ2xhc3NlcyxvPXIuRkdfREVBQ1RJVkFUSU9OLHM9ci5GR19BQ1RJVkFUSU9OLHU9ZS5udW1iZXJzLkRFQUNUSVZBVElPTl9USU1FT1VUX01TO3RoaXMubGF5b3V0SW50ZXJuYWxfKCk7dmFyIGM9XCJcIixkPVwiXCI7aWYoIXRoaXMuYWRhcHRlcl8uaXNVbmJvdW5kZWQoKSl7dmFyIHA9dGhpcy5nZXRGZ1RyYW5zbGF0aW9uQ29vcmRpbmF0ZXNfKCksbD1wLnN0YXJ0UG9pbnQsZj1wLmVuZFBvaW50O2M9bC54K1wicHgsIFwiK2wueStcInB4XCIsZD1mLngrXCJweCwgXCIrZi55K1wicHhcIn10aGlzLmFkYXB0ZXJfLnVwZGF0ZUNzc1ZhcmlhYmxlKGksYyksdGhpcy5hZGFwdGVyXy51cGRhdGVDc3NWYXJpYWJsZShhLGQpLGNsZWFyVGltZW91dCh0aGlzLmFjdGl2YXRpb25UaW1lcl8pLGNsZWFyVGltZW91dCh0aGlzLmZnRGVhY3RpdmF0aW9uUmVtb3ZhbFRpbWVyXyksdGhpcy5ybUJvdW5kZWRBY3RpdmF0aW9uQ2xhc3Nlc18oKSx0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKG8pLHRoaXMuYWRhcHRlcl8uY29tcHV0ZUJvdW5kaW5nUmVjdCgpLHRoaXMuYWRhcHRlcl8uYWRkQ2xhc3MocyksdGhpcy5hY3RpdmF0aW9uVGltZXJfPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gdC5hY3RpdmF0aW9uVGltZXJDYWxsYmFja18oKX0sdSl9LGUucHJvdG90eXBlLmdldEZnVHJhbnNsYXRpb25Db29yZGluYXRlc189ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuYWN0aXZhdGlvblN0YXRlXyxuPWUuYWN0aXZhdGlvbkV2ZW50O3JldHVybntzdGFydFBvaW50OnQ9e3g6KHQ9ZS53YXNBY3RpdmF0ZWRCeVBvaW50ZXI/T2JqZWN0KGMuZ2V0Tm9ybWFsaXplZEV2ZW50Q29vcmRzKShuLHRoaXMuYWRhcHRlcl8uZ2V0V2luZG93UGFnZU9mZnNldCgpLHRoaXMuYWRhcHRlcl8uY29tcHV0ZUJvdW5kaW5nUmVjdCgpKTp7eDp0aGlzLmZyYW1lXy53aWR0aC8yLHk6dGhpcy5mcmFtZV8uaGVpZ2h0LzJ9KS54LXRoaXMuaW5pdGlhbFNpemVfLzIseTp0LnktdGhpcy5pbml0aWFsU2l6ZV8vMn0sZW5kUG9pbnQ6e3g6dGhpcy5mcmFtZV8ud2lkdGgvMi10aGlzLmluaXRpYWxTaXplXy8yLHk6dGhpcy5mcmFtZV8uaGVpZ2h0LzItdGhpcy5pbml0aWFsU2l6ZV8vMn19fSxlLnByb3RvdHlwZS5ydW5EZWFjdGl2YXRpb25VWExvZ2ljSWZSZWFkeV89ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49ZS5jc3NDbGFzc2VzLkZHX0RFQUNUSVZBVElPTixpPXRoaXMuYWN0aXZhdGlvblN0YXRlXyxhPWkuaGFzRGVhY3RpdmF0aW9uVVhSdW4scj1pLmlzQWN0aXZhdGVkOyhhfHwhcikmJnRoaXMuYWN0aXZhdGlvbkFuaW1hdGlvbkhhc0VuZGVkXyYmKHRoaXMucm1Cb3VuZGVkQWN0aXZhdGlvbkNsYXNzZXNfKCksdGhpcy5hZGFwdGVyXy5hZGRDbGFzcyhuKSx0aGlzLmZnRGVhY3RpdmF0aW9uUmVtb3ZhbFRpbWVyXz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5hZGFwdGVyXy5yZW1vdmVDbGFzcyhuKX0sdS5GR19ERUFDVElWQVRJT05fTVMpKX0sZS5wcm90b3R5cGUucm1Cb3VuZGVkQWN0aXZhdGlvbkNsYXNzZXNfPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5jc3NDbGFzc2VzLkZHX0FDVElWQVRJT047dGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyh0KSx0aGlzLmFjdGl2YXRpb25BbmltYXRpb25IYXNFbmRlZF89ITEsdGhpcy5hZGFwdGVyXy5jb21wdXRlQm91bmRpbmdSZWN0KCl9LGUucHJvdG90eXBlLnJlc2V0QWN0aXZhdGlvblN0YXRlXz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5wcmV2aW91c0FjdGl2YXRpb25FdmVudF89dGhpcy5hY3RpdmF0aW9uU3RhdGVfLmFjdGl2YXRpb25FdmVudCx0aGlzLmFjdGl2YXRpb25TdGF0ZV89dGhpcy5kZWZhdWx0QWN0aXZhdGlvblN0YXRlXygpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gdC5wcmV2aW91c0FjdGl2YXRpb25FdmVudF89dm9pZCAwfSxlLm51bWJlcnMuVEFQX0RFTEFZX01TKX0sZS5wcm90b3R5cGUuZGVhY3RpdmF0ZV89ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5hY3RpdmF0aW9uU3RhdGVfO2lmKGUuaXNBY3RpdmF0ZWQpe3ZhciBuPWEoe30sZSk7ZS5pc1Byb2dyYW1tYXRpYz8ocmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7cmV0dXJuIHQuYW5pbWF0ZURlYWN0aXZhdGlvbl8obil9KSx0aGlzLnJlc2V0QWN0aXZhdGlvblN0YXRlXygpKToodGhpcy5kZXJlZ2lzdGVyRGVhY3RpdmF0aW9uSGFuZGxlcnNfKCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7dC5hY3RpdmF0aW9uU3RhdGVfLmhhc0RlYWN0aXZhdGlvblVYUnVuPSEwLHQuYW5pbWF0ZURlYWN0aXZhdGlvbl8obiksdC5yZXNldEFjdGl2YXRpb25TdGF0ZV8oKX0pKX19LGUucHJvdG90eXBlLmFuaW1hdGVEZWFjdGl2YXRpb25fPWZ1bmN0aW9uKHQpe3ZhciBlPXQud2FzQWN0aXZhdGVkQnlQb2ludGVyLG49dC53YXNFbGVtZW50TWFkZUFjdGl2ZTsoZXx8bikmJnRoaXMucnVuRGVhY3RpdmF0aW9uVVhMb2dpY0lmUmVhZHlfKCl9LGUucHJvdG90eXBlLmxheW91dEludGVybmFsXz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5mcmFtZV89dGhpcy5hZGFwdGVyXy5jb21wdXRlQm91bmRpbmdSZWN0KCk7dmFyIG49TWF0aC5tYXgodGhpcy5mcmFtZV8uaGVpZ2h0LHRoaXMuZnJhbWVfLndpZHRoKTt0aGlzLm1heFJhZGl1c189dGhpcy5hZGFwdGVyXy5pc1VuYm91bmRlZCgpP246TWF0aC5zcXJ0KE1hdGgucG93KHQuZnJhbWVfLndpZHRoLDIpK01hdGgucG93KHQuZnJhbWVfLmhlaWdodCwyKSkrZS5udW1iZXJzLlBBRERJTkcsdGhpcy5pbml0aWFsU2l6ZV89TWF0aC5mbG9vcihuKmUubnVtYmVycy5JTklUSUFMX09SSUdJTl9TQ0FMRSksdGhpcy5mZ1NjYWxlXz1cIlwiK3RoaXMubWF4UmFkaXVzXy90aGlzLmluaXRpYWxTaXplXyx0aGlzLnVwZGF0ZUxheW91dENzc1ZhcnNfKCl9LGUucHJvdG90eXBlLnVwZGF0ZUxheW91dENzc1ZhcnNfPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5zdHJpbmdzLG49dC5WQVJfRkdfU0laRSxpPXQuVkFSX0xFRlQsYT10LlZBUl9UT1Ascj10LlZBUl9GR19TQ0FMRTt0aGlzLmFkYXB0ZXJfLnVwZGF0ZUNzc1ZhcmlhYmxlKG4sdGhpcy5pbml0aWFsU2l6ZV8rXCJweFwiKSx0aGlzLmFkYXB0ZXJfLnVwZGF0ZUNzc1ZhcmlhYmxlKHIsdGhpcy5mZ1NjYWxlXyksdGhpcy5hZGFwdGVyXy5pc1VuYm91bmRlZCgpJiYodGhpcy51bmJvdW5kZWRDb29yZHNfPXtsZWZ0Ok1hdGgucm91bmQodGhpcy5mcmFtZV8ud2lkdGgvMi10aGlzLmluaXRpYWxTaXplXy8yKSx0b3A6TWF0aC5yb3VuZCh0aGlzLmZyYW1lXy5oZWlnaHQvMi10aGlzLmluaXRpYWxTaXplXy8yKX0sdGhpcy5hZGFwdGVyXy51cGRhdGVDc3NWYXJpYWJsZShpLHRoaXMudW5ib3VuZGVkQ29vcmRzXy5sZWZ0K1wicHhcIiksdGhpcy5hZGFwdGVyXy51cGRhdGVDc3NWYXJpYWJsZShhLHRoaXMudW5ib3VuZGVkQ29vcmRzXy50b3ArXCJweFwiKSl9LGV9KHIpO2UuZGVmYXVsdD1mfSwzODpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGksYTtmdW5jdGlvbiByKHQsZSl7dm9pZCAwPT09ZSYmKGU9ITEpO3ZhciBuPXQuQ1NTLGE9aTtpZihcImJvb2xlYW5cIj09dHlwZW9mIGkmJiFlKXJldHVybiBpO2lmKCEobiYmXCJmdW5jdGlvblwiPT10eXBlb2Ygbi5zdXBwb3J0cykpcmV0dXJuITE7dmFyIHI9bi5zdXBwb3J0cyhcIi0tY3NzLXZhcnNcIixcInllc1wiKSxvPW4uc3VwcG9ydHMoXCIoLS1jc3MtdmFyczogeWVzKVwiKSYmbi5zdXBwb3J0cyhcImNvbG9yXCIsXCIjMDAwMDAwMDBcIik7cmV0dXJuIGE9ISghciYmIW8pJiYhZnVuY3Rpb24odCl7dmFyIGU9dC5kb2N1bWVudCxuPWUuY3JlYXRlRWxlbWVudChcImRpdlwiKTtuLmNsYXNzTmFtZT1cIm1kYy1yaXBwbGUtc3VyZmFjZS0tdGVzdC1lZGdlLXZhci1idWdcIixlLmJvZHkuYXBwZW5kQ2hpbGQobik7dmFyIGk9dC5nZXRDb21wdXRlZFN0eWxlKG4pLGE9bnVsbCE9PWkmJlwic29saWRcIj09PWkuYm9yZGVyVG9wU3R5bGU7cmV0dXJuIG4ucmVtb3ZlKCksYX0odCksZXx8KGk9YSksYX1mdW5jdGlvbiBvKHQsZSl7aWYodm9pZCAwPT09dCYmKHQ9d2luZG93KSx2b2lkIDA9PT1lJiYoZT0hMSksdm9pZCAwPT09YXx8ZSl7dmFyIG49ITE7dHJ5e3QuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRlc3RcIixmdW5jdGlvbigpe30se2dldCBwYXNzaXZlKCl7cmV0dXJuIG49ITB9fSl9Y2F0Y2godCl7fWE9bn1yZXR1cm4hIWEmJntwYXNzaXZlOiEwfX1mdW5jdGlvbiBzKHQsZSxuKXtpZighdClyZXR1cm57eDowLHk6MH07dmFyIGksYSxyPWUueCxvPWUueSxzPXIrbi5sZWZ0LHU9bytuLnRvcDtpZihcInRvdWNoc3RhcnRcIj09PXQudHlwZSl7dmFyIGM9dDtpPWMuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVgtcyxhPWMuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVktdX1lbHNle3ZhciBkPXQ7aT1kLnBhZ2VYLXMsYT1kLnBhZ2VZLXV9cmV0dXJue3g6aSx5OmF9fW4ucihlKSxuLmQoZSxcInN1cHBvcnRzQ3NzVmFyaWFibGVzXCIsZnVuY3Rpb24oKXtyZXR1cm4gcn0pLG4uZChlLFwiYXBwbHlQYXNzaXZlXCIsZnVuY3Rpb24oKXtyZXR1cm4gb30pLG4uZChlLFwiZ2V0Tm9ybWFsaXplZEV2ZW50Q29vcmRzXCIsZnVuY3Rpb24oKXtyZXR1cm4gc30pfX0pfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yaXBwbGUuanMubWFwIiwiIWZ1bmN0aW9uKHQsZSl7aWYoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUpbW9kdWxlLmV4cG9ydHM9ZShyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcImNsYXNzbmFtZXNcIikscmVxdWlyZShcIkBtYXRlcmlhbC9yZWFjdC1mbG9hdGluZy1sYWJlbC9kaXN0L2luZGV4LmpzXCIpLHJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtbGluZS1yaXBwbGUvZGlzdC9pbmRleC5qc1wiKSxyZXF1aXJlKFwiQG1hdGVyaWFsL3JlYWN0LW5vdGNoZWQtb3V0bGluZS9kaXN0L2luZGV4LmpzXCIpLHJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtbWVudS9kaXN0L2luZGV4LmpzXCIpKTtlbHNlIGlmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW1wicmVhY3RcIixcImNsYXNzbmFtZXNcIixcIkBtYXRlcmlhbC9yZWFjdC1mbG9hdGluZy1sYWJlbC9kaXN0L2luZGV4LmpzXCIsXCJAbWF0ZXJpYWwvcmVhY3QtbGluZS1yaXBwbGUvZGlzdC9pbmRleC5qc1wiLFwiQG1hdGVyaWFsL3JlYWN0LW5vdGNoZWQtb3V0bGluZS9kaXN0L2luZGV4LmpzXCIsXCJAbWF0ZXJpYWwvcmVhY3QtbWVudS9kaXN0L2luZGV4LmpzXCJdLGUpO2Vsc2V7dmFyIG49XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZShyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcImNsYXNzbmFtZXNcIikscmVxdWlyZShcIkBtYXRlcmlhbC9yZWFjdC1mbG9hdGluZy1sYWJlbC9kaXN0L2luZGV4LmpzXCIpLHJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtbGluZS1yaXBwbGUvZGlzdC9pbmRleC5qc1wiKSxyZXF1aXJlKFwiQG1hdGVyaWFsL3JlYWN0LW5vdGNoZWQtb3V0bGluZS9kaXN0L2luZGV4LmpzXCIpLHJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtbWVudS9kaXN0L2luZGV4LmpzXCIpKTplKHQucmVhY3QsdC5jbGFzc25hbWVzLHRbXCJAbWF0ZXJpYWwvcmVhY3QtZmxvYXRpbmctbGFiZWwvZGlzdC9pbmRleC5qc1wiXSx0W1wiQG1hdGVyaWFsL3JlYWN0LWxpbmUtcmlwcGxlL2Rpc3QvaW5kZXguanNcIl0sdFtcIkBtYXRlcmlhbC9yZWFjdC1ub3RjaGVkLW91dGxpbmUvZGlzdC9pbmRleC5qc1wiXSx0W1wiQG1hdGVyaWFsL3JlYWN0LW1lbnUvZGlzdC9pbmRleC5qc1wiXSk7Zm9yKHZhciBpIGluIG4pKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6dClbaV09bltpXX19KFwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcyxmdW5jdGlvbih0LGUsbixpLG8scil7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4oaSl7aWYoZVtpXSlyZXR1cm4gZVtpXS5leHBvcnRzO3ZhciBvPWVbaV09e2k6aSxsOiExLGV4cG9ydHM6e319O3JldHVybiB0W2ldLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9cmV0dXJuIG4ubT10LG4uYz1lLG4uZD1mdW5jdGlvbih0LGUsaSl7bi5vKHQsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2VudW1lcmFibGU6ITAsZ2V0Oml9KX0sbi5yPWZ1bmN0aW9uKHQpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbih0LGUpe2lmKDEmZSYmKHQ9bih0KSksOCZlKXJldHVybiB0O2lmKDQmZSYmXCJvYmplY3RcIj09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgaT1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihpKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTp0fSksMiZlJiZcInN0cmluZ1wiIT10eXBlb2YgdClmb3IodmFyIG8gaW4gdCluLmQoaSxvLGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfS5iaW5kKG51bGwsbykpO3JldHVybiBpfSxuLm49ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIG4uZChlLFwiYVwiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPVwiXCIsbihuLnM9MTA5KX0oezA6ZnVuY3Rpb24oZSxuKXtlLmV4cG9ydHM9dH0sMTpmdW5jdGlvbih0LG4pe3QuZXhwb3J0cz1lfSwxMDk6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciBpLG89dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9KSh0LGUpfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLHI9dGhpcyYmdGhpcy5fX2Fzc2lnbnx8ZnVuY3Rpb24oKXtyZXR1cm4ocj1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgbyBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxvKSYmKHRbb109ZVtvXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGE9dGhpcyYmdGhpcy5fX3Jlc3R8fGZ1bmN0aW9uKHQsZSl7dmFyIG49e307Zm9yKHZhciBpIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsaSkmJmUuaW5kZXhPZihpKTwwJiYobltpXT10W2ldKTtpZihudWxsIT10JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgbz0wO2ZvcihpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7bzxpLmxlbmd0aDtvKyspZS5pbmRleE9mKGlbb10pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LGlbb10pJiYobltpW29dXT10W2lbb11dKX1yZXR1cm4gbn0scz10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgdT1zKG4oMCkpLGw9cyhuKDEpKSxjPW4oNDMpLGQ9cyhuKDMzKSkscD1zKG4oMzQpKSxmPXMobigzNSkpLGg9bigxMTApLF89cyhuKDExMykpO2UuT3B0aW9uPV8uZGVmYXVsdDt2YXIgbT1jLk1EQ1NlbGVjdEZvdW5kYXRpb24uY3NzQ2xhc3Nlcyx5PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG49dC5jYWxsKHRoaXMsZSl8fHRoaXM7cmV0dXJuIG4ubmF0aXZlQ29udHJvbD11LmRlZmF1bHQuY3JlYXRlUmVmKCksbi5jbGFzc2VzQmVpbmdSZW1vdmVkPW5ldyBTZXQsbi5jbGFzc2VzQmVpbmdBZGRlZD1uZXcgU2V0LG4uY3JlYXRlRm91bmRhdGlvbj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgYy5NRENTZWxlY3RGb3VuZGF0aW9uKG4uYWRhcHRlcixuLmZvdW5kYXRpb25NYXApO2UuaW5pdCgpLG4uc2V0U3RhdGUoe2ZvdW5kYXRpb246ZX0sdCl9LG4uZGVzdHJveUZvdW5kYXRpb249ZnVuY3Rpb24oKXtuLnN0YXRlLmZvdW5kYXRpb24mJm4uc3RhdGUuZm91bmRhdGlvbi5kZXN0cm95KCl9LG4uYWRkQ2xhc3M9ZnVuY3Rpb24odCl7bi5jbGFzc2VzQmVpbmdBZGRlZC5hZGQodCksbi5zZXRTdGF0ZShmdW5jdGlvbihlKXt2YXIgbj1uZXcgU2V0KGUuY2xhc3NMaXN0KTtyZXR1cm4gbi5hZGQodCkse2NsYXNzTGlzdDpufX0sZnVuY3Rpb24oKXtuLmNsYXNzZXNCZWluZ0FkZGVkLmRlbGV0ZSh0KX0pfSxuLnJlbW92ZUNsYXNzPWZ1bmN0aW9uKHQpe24uY2xhc3Nlc0JlaW5nUmVtb3ZlZC5hZGQodCksbi5zZXRTdGF0ZShmdW5jdGlvbihlKXt2YXIgbj1uZXcgU2V0KGUuY2xhc3NMaXN0KTtyZXR1cm4gbi5kZWxldGUodCkse2NsYXNzTGlzdDpufX0sZnVuY3Rpb24oKXtuLmNsYXNzZXNCZWluZ1JlbW92ZWQuZGVsZXRlKHQpfSl9LG4uY2xvc2VNZW51PWZ1bmN0aW9uKCl7cmV0dXJuIG4uc2V0U3RhdGUoe29wZW46ITF9KX0sbi5zZXRWYWxpZENsYXNzZXM9ZnVuY3Rpb24odCl7dD9uLnJlbW92ZUNsYXNzKG0uSU5WQUxJRCk6bi5hZGRDbGFzcyhtLklOVkFMSUQpfSxuLnNldEhlbHBlclRleHRGb3VuZGF0aW9uPWZ1bmN0aW9uKHQpe24uc2V0U3RhdGUoe2hlbHBlclRleHRGb3VuZGF0aW9uOnR9KX0sbi5zZXRJY29uRm91bmRhdGlvbj1mdW5jdGlvbih0KXtuLnNldFN0YXRlKHtpY29uRm91bmRhdGlvbjp0fSl9LG4uc3RhdGU9e2NsYXNzTGlzdDpuZXcgU2V0LGRpc2FibGVkOmUuZGlzYWJsZWQsdmFsdWU6ZS52YWx1ZSxsYWJlbElzRmxvYXRlZDohMSxsYWJlbFdpZHRoOjAsYWN0aXZlTGluZVJpcHBsZTohMSxsaW5lUmlwcGxlQ2VudGVyOnZvaWQgMCxvdXRsaW5lSXNOb3RjaGVkOiExLG9wZW46ITEsc2VsZWN0RWxlbWVudDp1LmRlZmF1bHQuY3JlYXRlUmVmKCksaXNJbnZhbGlkOiExLGhlbHBlclRleHRGb3VuZGF0aW9uOnZvaWQgMCxpY29uRm91bmRhdGlvbjp2b2lkIDAsZm91bmRhdGlvbjp2b2lkIDB9LG59cmV0dXJuIG8oZSx0KSxlLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5jcmVhdGVGb3VuZGF0aW9uKGZ1bmN0aW9uKCl7dC5zdGF0ZS5mb3VuZGF0aW9uLmhhbmRsZUNoYW5nZSghMSl9KX0sZS5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPWZ1bmN0aW9uKHQsZSl7dGhpcy5wcm9wcy52YWx1ZSE9PXQudmFsdWUmJnRoaXMuc2V0U3RhdGUoe3ZhbHVlOnRoaXMucHJvcHMudmFsdWV9KSx0aGlzLnN0YXRlLmZvdW5kYXRpb24mJnRoaXMuc3RhdGUudmFsdWUhPT1lLnZhbHVlJiZ0aGlzLnN0YXRlLmZvdW5kYXRpb24uaGFuZGxlQ2hhbmdlKCEwKSx0aGlzLnN0YXRlLmZvdW5kYXRpb24mJnRoaXMucHJvcHMuZGlzYWJsZWQhPT10LmRpc2FibGVkJiZ0aGlzLnN0YXRlLmZvdW5kYXRpb24uc2V0RGlzYWJsZWQodGhpcy5wcm9wcy5kaXNhYmxlZCksdGhpcy5zdGF0ZS5oZWxwZXJUZXh0Rm91bmRhdGlvbj09PWUuaGVscGVyVGV4dEZvdW5kYXRpb24mJnRoaXMuc3RhdGUuaWNvbkZvdW5kYXRpb249PT1lLmljb25Gb3VuZGF0aW9ufHwodGhpcy5kZXN0cm95Rm91bmRhdGlvbigpLHRoaXMuY3JlYXRlRm91bmRhdGlvbigpKX0sZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLmRlc3Ryb3lGb3VuZGF0aW9uKCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImNsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zdGF0ZSxlPXQuY2xhc3NMaXN0LG49dC5kaXNhYmxlZCxpPXRoaXMucHJvcHMsbz1pLmNsYXNzTmFtZSxyPWkubGVhZGluZ0ljb24sYT1pLnJlcXVpcmVkLHM9aS5vdXRsaW5lZDtyZXR1cm4gbC5kZWZhdWx0KFwibWRjLXNlbGVjdFwiLEFycmF5LmZyb20oZSksbyx7XCJtZGMtc2VsZWN0LS1vdXRsaW5lZFwiOnMsXCJtZGMtc2VsZWN0LS1kaXNhYmxlZFwiOm4sXCJtZGMtc2VsZWN0LS1yZXF1aXJlZFwiOmEsXCJtZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvblwiOnJ9KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJhZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLnByb3BzLmVuaGFuY2VkLG49e2FkZENsYXNzOnRoaXMuYWRkQ2xhc3MscmVtb3ZlQ2xhc3M6dGhpcy5yZW1vdmVDbGFzcyxoYXNDbGFzczpmdW5jdGlvbihlKXt2YXIgbj10LmNsYXNzZXMuc3BsaXQoXCIgXCIpLmluY2x1ZGVzKGUpLGk9dC5jbGFzc2VzQmVpbmdBZGRlZC5oYXMoZSksbz10LmNsYXNzZXNCZWluZ1JlbW92ZWQuaGFzKGUpO3JldHVybihufHxpKSYmIW99LHNldFJpcHBsZUNlbnRlcjpmdW5jdGlvbihlKXtyZXR1cm4gdC5zZXRTdGF0ZSh7bGluZVJpcHBsZUNlbnRlcjplfSl9LGdldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHQuc3RhdGUudmFsdWV9LHNldFZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0LnNldFN0YXRlKHt2YWx1ZTplfSl9LHNldERpc2FibGVkOmZ1bmN0aW9uKGUpe3JldHVybiB0LnNldFN0YXRlKHtkaXNhYmxlZDplfSl9LHNldFNlbGVjdGVkSW5kZXg6ZnVuY3Rpb24oKXt9LGNsb3NlTWVudTp0aGlzLmNsb3NlTWVudSxvcGVuTWVudTpmdW5jdGlvbigpe3JldHVybiB0LnNldFN0YXRlKHtvcGVuOiEwfSl9fSxpPXtpc01lbnVPcGVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGNoZWNrVmFsaWRpdHk6ZnVuY3Rpb24oKXtyZXR1cm4hIXQubmF0aXZlQ29udHJvbC5jdXJyZW50JiZ0Lm5hdGl2ZUNvbnRyb2wuY3VycmVudC5jaGVja1ZhbGlkaXR5KCl9LHNldFZhbGlkOnRoaXMuc2V0VmFsaWRDbGFzc2VzfTtyZXR1cm4gcih7fSxlP3tpc01lbnVPcGVuOmZ1bmN0aW9uKCl7cmV0dXJuIHQuc3RhdGUub3Blbn0sY2hlY2tWYWxpZGl0eTpmdW5jdGlvbigpe3JldHVybiEoIXQucHJvcHMuZGlzYWJsZWQmJnQucHJvcHMucmVxdWlyZWQpfHxCb29sZWFuKHQuc3RhdGUudmFsdWUpfSxzZXRWYWxpZDpmdW5jdGlvbihlKXt0LnNldFN0YXRlKHtpc0ludmFsaWQ6IWV9KSx0LnNldFZhbGlkQ2xhc3NlcyhlKX19Omksbix7ZmxvYXRMYWJlbDpmdW5jdGlvbihlKXtyZXR1cm4gdC5zZXRTdGF0ZSh7bGFiZWxJc0Zsb2F0ZWQ6ZX0pfSxnZXRMYWJlbFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHQuc3RhdGUubGFiZWxXaWR0aH19LHthY3RpdmF0ZUJvdHRvbUxpbmU6ZnVuY3Rpb24oKXtyZXR1cm4gdC5zZXRTdGF0ZSh7YWN0aXZlTGluZVJpcHBsZTohMH0pfSxkZWFjdGl2YXRlQm90dG9tTGluZTpmdW5jdGlvbigpe3JldHVybiB0LnNldFN0YXRlKHthY3RpdmVMaW5lUmlwcGxlOiExfSl9LG5vdGlmeUNoYW5nZTpmdW5jdGlvbihlKXtyZXR1cm4gdC5wcm9wcy5hZnRlckNoYW5nZShlKX19LHtub3RjaE91dGxpbmU6ZnVuY3Rpb24oKXtyZXR1cm4gdC5zZXRTdGF0ZSh7b3V0bGluZUlzTm90Y2hlZDohMH0pfSxjbG9zZU91dGxpbmU6ZnVuY3Rpb24oKXtyZXR1cm4gdC5zZXRTdGF0ZSh7b3V0bGluZUlzTm90Y2hlZDohMX0pfSxoYXNPdXRsaW5lOmZ1bmN0aW9uKCl7cmV0dXJuISF0LnByb3BzLm91dGxpbmVkfX0pfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImZvdW5kYXRpb25NYXBcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zdGF0ZTtyZXR1cm57aGVscGVyVGV4dDp0LmhlbHBlclRleHRGb3VuZGF0aW9uLGxlYWRpbmdJY29uOnQuaWNvbkZvdW5kYXRpb259fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3JldHVybiB1LmRlZmF1bHQuY3JlYXRlRWxlbWVudCh1LmRlZmF1bHQuRnJhZ21lbnQsbnVsbCx1LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6dGhpcy5jbGFzc2VzLHJlZjp0aGlzLnN0YXRlLnNlbGVjdEVsZW1lbnR9LHRoaXMucmVuZGVySWNvbigpLHUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaVwiLHtjbGFzc05hbWU6XCJtZGMtc2VsZWN0X19kcm9wZG93bi1pY29uXCJ9KSx0aGlzLnJlbmRlclNlbGVjdCgpLHRoaXMucHJvcHMub3V0bGluZWQ/bnVsbDp0aGlzLnJlbmRlckxhYmVsKCksdGhpcy5wcm9wcy5vdXRsaW5lZD90aGlzLnJlbmRlck5vdGNoZWRPdXRsaW5lKCk6dGhpcy5yZW5kZXJMaW5lUmlwcGxlKCkpLHRoaXMucmVuZGVySGVscGVyVGV4dCgpKX0sZS5wcm90b3R5cGUucmVuZGVyU2VsZWN0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcyxlPXQuc2VsZWN0Q2xhc3NOYW1lLG49KHQuY2xhc3NOYW1lLHQuZmxvYXRpbmdMYWJlbENsYXNzTmFtZSx0LmxpbmVSaXBwbGVDbGFzc05hbWUsdC5ub3RjaGVkT3V0bGluZUNsYXNzTmFtZSx0Lm91dGxpbmVkLHQucmVmLHQudmFsdWUsdC5hZnRlckNoYW5nZSx0Lm9uRW5oYW5jZWRDaGFuZ2UpLGk9KHQuaGVscGVyVGV4dCx0LmxlYWRpbmdJY29uLHQuZW5oYW5jZWQpLG89YSh0LFtcInNlbGVjdENsYXNzTmFtZVwiLFwiY2xhc3NOYW1lXCIsXCJmbG9hdGluZ0xhYmVsQ2xhc3NOYW1lXCIsXCJsaW5lUmlwcGxlQ2xhc3NOYW1lXCIsXCJub3RjaGVkT3V0bGluZUNsYXNzTmFtZVwiLFwib3V0bGluZWRcIixcInJlZlwiLFwidmFsdWVcIixcImFmdGVyQ2hhbmdlXCIsXCJvbkVuaGFuY2VkQ2hhbmdlXCIsXCJoZWxwZXJUZXh0XCIsXCJsZWFkaW5nSWNvblwiLFwiZW5oYW5jZWRcIl0pLHM9dGhpcy5zdGF0ZSxsPXMub3BlbixjPXMuc2VsZWN0RWxlbWVudCxkPXMuaXNJbnZhbGlkLHA9cy52YWx1ZSxmPXtvbkVuaGFuY2VkQ2hhbmdlOm4sY2xvc2VNZW51OnRoaXMuY2xvc2VNZW51LGFuY2hvckVsZW1lbnQ6Yy5jdXJyZW50LGVuaGFuY2VkOmksaXNJbnZhbGlkOmR9O3JldHVybiB1LmRlZmF1bHQuY3JlYXRlRWxlbWVudChoLkJhc2VTZWxlY3Qscih7b3BlbjpsLHZhbHVlOnAsaW5uZXJSZWY6dGhpcy5uYXRpdmVDb250cm9sLGZvdW5kYXRpb246dGhpcy5zdGF0ZS5mb3VuZGF0aW9uLGNsYXNzTmFtZTplfSxpP2Y6e30sbyksdGhpcy5yZW5kZXJPcHRpb25zKCkpfSxlLnByb3RvdHlwZS5yZW5kZXJPcHRpb25zPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcyxlPXQuY2hpbGRyZW4sbj10Lm9wdGlvbnM7cmV0dXJuIHZvaWQgMCE9PW4mJm4ubGVuZ3RoP24ubWFwKGZ1bmN0aW9uKHQsZSl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpcmV0dXJuIHUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF8uZGVmYXVsdCx7a2V5OmUsdmFsdWU6dH0sdCk7dmFyIG49dC5sYWJlbCxpPWEodCxbXCJsYWJlbFwiXSk7cmV0dXJuIHUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF8uZGVmYXVsdCxyKHtrZXk6ZX0saSksbil9KTplfSxlLnByb3RvdHlwZS5yZW5kZXJMYWJlbD1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLnByb3BzLG49ZS5pZCxpPWUubGFiZWwsbz1lLmZsb2F0aW5nTGFiZWxDbGFzc05hbWU7aWYoaSlyZXR1cm4gdS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoZC5kZWZhdWx0LHtjbGFzc05hbWU6byxmbG9hdDp0aGlzLnN0YXRlLmxhYmVsSXNGbG9hdGVkLGhhbmRsZVdpZHRoQ2hhbmdlOmZ1bmN0aW9uKGUpe3JldHVybiB0LnNldFN0YXRlKHtsYWJlbFdpZHRoOmV9KX0saHRtbEZvcjpufSxpKX0sZS5wcm90b3R5cGUucmVuZGVyTGluZVJpcHBsZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMubGluZVJpcHBsZUNsYXNzTmFtZSxlPXRoaXMuc3RhdGUsbj1lLmFjdGl2ZUxpbmVSaXBwbGUsaT1lLmxpbmVSaXBwbGVDZW50ZXI7cmV0dXJuIHUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHAuZGVmYXVsdCx7cmlwcGxlQ2VudGVyOmksY2xhc3NOYW1lOnQsYWN0aXZlOm59KX0sZS5wcm90b3R5cGUucmVuZGVyTm90Y2hlZE91dGxpbmU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLm5vdGNoZWRPdXRsaW5lQ2xhc3NOYW1lLGU9dGhpcy5zdGF0ZSxuPWUub3V0bGluZUlzTm90Y2hlZCxpPWUubGFiZWxXaWR0aDtyZXR1cm4gdS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoZi5kZWZhdWx0LHtjbGFzc05hbWU6dCxub3RjaDpuLG5vdGNoV2lkdGg6aX0sdGhpcy5yZW5kZXJMYWJlbCgpKX0sZS5wcm90b3R5cGUucmVuZGVySGVscGVyVGV4dD1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMuaGVscGVyVGV4dDtpZih0KXt2YXIgZT1yKHt9LHQucHJvcHMse3NldEhlbHBlclRleHRGb3VuZGF0aW9uOnRoaXMuc2V0SGVscGVyVGV4dEZvdW5kYXRpb259KTtyZXR1cm4gdS5kZWZhdWx0LmNsb25lRWxlbWVudCh0LGUpfX0sZS5wcm90b3R5cGUucmVuZGVySWNvbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMubGVhZGluZ0ljb247aWYodCl7dmFyIGU9cih7fSx0LnByb3BzLHtzZXRJY29uRm91bmRhdGlvbjp0aGlzLnNldEljb25Gb3VuZGF0aW9ufSk7cmV0dXJuIHUuZGVmYXVsdC5jbG9uZUVsZW1lbnQodCxlKX19LGUuZGVmYXVsdFByb3BzPXtlbmhhbmNlZDohMSxjbGFzc05hbWU6XCJcIixkaXNhYmxlZDohMSxmbG9hdGluZ0xhYmVsQ2xhc3NOYW1lOlwiXCIsbGluZVJpcHBsZUNsYXNzTmFtZTpcIlwiLHNlbGVjdENsYXNzTmFtZTpcIlwiLG5vdGNoZWRPdXRsaW5lQ2xhc3NOYW1lOlwiXCIsb3V0bGluZWQ6ITEsb3B0aW9uczpbXSxvbkNoYW5nZTpmdW5jdGlvbigpe30sb25FbmhhbmNlZENoYW5nZTpmdW5jdGlvbigpe30sdmFsdWU6XCJcIixhZnRlckNoYW5nZTpmdW5jdGlvbigpe319LGV9KHUuZGVmYXVsdC5Db21wb25lbnQpO2UuZGVmYXVsdD15O3ZhciBPPW4oMTE0KTtlLlNlbGVjdEhlbHBlclRleHQ9Ty5TZWxlY3RIZWxwZXJUZXh0O3ZhciB2PW4oMTE1KTtlLlNlbGVjdEljb249di5TZWxlY3RJY29uO3ZhciBiPW4oMzYpO2UuT3B0aW9uRGl2aWRlcj1iLk1lbnVMaXN0RGl2aWRlcixlLk9wdGlvbkdyb3VwPWIuTWVudUxpc3RHcm91cCxlLk9wdGlvbkdyb3VwU3ViaGVhZGVyPWIuTWVudUxpc3RHcm91cFN1YmhlYWRlcixlLk9wdGlvbkdyYXBoaWM9Yi5NZW51TGlzdEl0ZW1HcmFwaGljLGUuT3B0aW9uTWV0YT1iLk1lbnVMaXN0SXRlbU1ldGEsZS5PcHRpb25UZXh0PWIuTWVudUxpc3RJdGVtVGV4dH0sMTEwOmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgaSxvPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1mdW5jdGlvbih0LGUpe3JldHVybihpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSkodCxlKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxyPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKHI9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIG8gaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbykmJih0W29dPWVbb10pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxhPXRoaXMmJnRoaXMuX19yZXN0fHxmdW5jdGlvbih0LGUpe3ZhciBuPXt9O2Zvcih2YXIgaSBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGkpJiZlLmluZGV4T2YoaSk8MCYmKG5baV09dFtpXSk7aWYobnVsbCE9dCYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG89MDtmb3IoaT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO288aS5sZW5ndGg7bysrKWUuaW5kZXhPZihpW29dKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodCxpW29dKSYmKG5baVtvXV09dFtpW29dXSl9cmV0dXJuIG59LHM9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIHU9cyhuKDApKSxsPXMobigxMTEpKSxjPXMobigxMTIpKSxkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUuaGFuZGxlRm9jdXM9ZnVuY3Rpb24odCl7dmFyIG49ZS5wcm9wcyxpPW4uZm91bmRhdGlvbixvPW4ub25Gb2N1cztpJiZpLmhhbmRsZUZvY3VzKCksbyYmbyh0KX0sZS5oYW5kbGVCbHVyPWZ1bmN0aW9uKHQpe3ZhciBuPWUucHJvcHMsaT1uLmZvdW5kYXRpb24sbz1uLm9uQmx1cjtpJiZpLmhhbmRsZUJsdXIoKSxvJiZvKHQpfSxlLmhhbmRsZVRvdWNoU3RhcnQ9ZnVuY3Rpb24odCl7dmFyIG49ZS5wcm9wcyxpPW4uZm91bmRhdGlvbixvPW4ub25Ub3VjaFN0YXJ0O2kmJmkuaGFuZGxlQ2xpY2soZS5nZXROb3JtYWxpemVkWENvb3JkaW5hdGUodCkpLG8mJm8odCl9LGUuaGFuZGxlTW91c2VEb3duPWZ1bmN0aW9uKHQpe3ZhciBuPWUucHJvcHMsaT1uLmZvdW5kYXRpb24sbz1uLm9uTW91c2VEb3duO2kmJmkuaGFuZGxlQ2xpY2soZS5nZXROb3JtYWxpemVkWENvb3JkaW5hdGUodCkpLG8mJm8odCl9LGUuaGFuZGxlQ2xpY2s9ZnVuY3Rpb24odCl7dmFyIG49ZS5wcm9wcyxpPW4uZm91bmRhdGlvbixvPW4ub25DbGljaztpJiZpLmhhbmRsZUNsaWNrKGUuZ2V0Tm9ybWFsaXplZFhDb29yZGluYXRlKHQpKSxvJiZvKHQpfSxlLmhhbmRsZUtleURvd249ZnVuY3Rpb24odCl7dmFyIG49ZS5wcm9wcyxpPW4uZm91bmRhdGlvbixvPW4ub25LZXlEb3duO2kmJmkuaGFuZGxlS2V5ZG93bih0Lm5hdGl2ZUV2ZW50KSxvJiZvKHQpfSxlLmlzVG91Y2hFdmVudD1mdW5jdGlvbih0KXtyZXR1cm4gQm9vbGVhbih0LnRvdWNoZXMpfSxlLmdldE5vcm1hbGl6ZWRYQ29vcmRpbmF0ZT1mdW5jdGlvbih0KXt2YXIgbj10LmN1cnJlbnRUYXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuKGUuaXNUb3VjaEV2ZW50KHQubmF0aXZlRXZlbnQpP3QubmF0aXZlRXZlbnQudG91Y2hlc1swXS5jbGllbnRYOnQubmF0aXZlRXZlbnQuY2xpZW50WCktbi5sZWZ0fSxlfXJldHVybiBvKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcyxlPSh0Lm9uRm9jdXMsdC5vbkJsdXIsdC5vbkNsaWNrLHQub25Nb3VzZURvd24sdC5vblRvdWNoU3RhcnQsdC5yZWYsdC5lbmhhbmNlZCksbj10LmNoaWxkcmVuLGk9dC5vbktleURvd24sbz10LnNlbGVjdENsYXNzTmFtZSxzPWEodCxbXCJvbkZvY3VzXCIsXCJvbkJsdXJcIixcIm9uQ2xpY2tcIixcIm9uTW91c2VEb3duXCIsXCJvblRvdWNoU3RhcnRcIixcInJlZlwiLFwiZW5oYW5jZWRcIixcImNoaWxkcmVuXCIsXCJvbktleURvd25cIixcInNlbGVjdENsYXNzTmFtZVwiXSksZD1yKHtvbkZvY3VzOnRoaXMuaGFuZGxlRm9jdXMsb25CbHVyOnRoaXMuaGFuZGxlQmx1cixvbk1vdXNlRG93bjp0aGlzLmhhbmRsZU1vdXNlRG93bixvbkNsaWNrOnRoaXMuaGFuZGxlQ2xpY2ssb25Ub3VjaFN0YXJ0OnRoaXMuaGFuZGxlVG91Y2hTdGFydCxjbGFzc05hbWU6b30scyk7cmV0dXJuIGU/dS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYy5kZWZhdWx0LHIoe29uS2V5RG93bjp0aGlzLmhhbmRsZUtleURvd259LGQpLG4pOnUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGwuZGVmYXVsdCxyKHtvbktleURvd246aX0sZCksbil9LGUuZGVmYXVsdFByb3BzPXtlbmhhbmNlZDohMSxzZWxlY3RDbGFzc05hbWU6XCJcIn0sZX0odS5kZWZhdWx0LkNvbXBvbmVudCk7ZS5CYXNlU2VsZWN0PWR9LDExMTpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGksbz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4oaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSkscj10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciBvIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG8pJiYodFtvXT1lW29dKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYT10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIGkgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKSYmZS5pbmRleE9mKGkpPDAmJihuW2ldPXRbaV0pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBvPTA7Zm9yKGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtvPGkubGVuZ3RoO28rKyllLmluZGV4T2YoaVtvXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsaVtvXSkmJihuW2lbb11dPXRbaVtvXV0pfXJldHVybiBufSxzPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciB1PXMobigwKSksbD1zKG4oMSkpLGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5OYXRpdmVTZWxlY3Q9dS5kZWZhdWx0LmNyZWF0ZVJlZigpLGUuYXR0YWNoUmVmPWZ1bmN0aW9uKHQpe3ZhciBuPWUucHJvcHMuaW5uZXJSZWY7ZS5OYXRpdmVTZWxlY3QuY3VycmVudD10LG4mJihcImZ1bmN0aW9uXCIhPXR5cGVvZiBuP24uY3VycmVudD10Om4odCkpfSxlfXJldHVybiBvKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiY2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbC5kZWZhdWx0KFwibWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2xcIix0aGlzLnByb3BzLmNsYXNzTmFtZSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcyxlPSh0LmNsYXNzTmFtZSx0LmNoaWxkcmVuKSxuPSh0LmZvdW5kYXRpb24sdC5pbm5lclJlZixhKHQsW1wiY2xhc3NOYW1lXCIsXCJjaGlsZHJlblwiLFwiZm91bmRhdGlvblwiLFwiaW5uZXJSZWZcIl0pKTtyZXR1cm4gdS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIixyKHtjbGFzc05hbWU6dGhpcy5jbGFzc2VzLHJlZjp0aGlzLmF0dGFjaFJlZn0sbiksZSl9LGUuZGVmYXVsdFByb3BzPXtjbGFzc05hbWU6XCJcIixjaGlsZHJlbjpudWxsLGRpc2FibGVkOiExLHZhbHVlOlwiXCJ9LGV9KHUuZGVmYXVsdC5Db21wb25lbnQpO2UuZGVmYXVsdD1jfSwxMTI6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciBpLG89dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9KSh0LGUpfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLHI9dGhpcyYmdGhpcy5fX2Fzc2lnbnx8ZnVuY3Rpb24oKXtyZXR1cm4ocj1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgbyBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxvKSYmKHRbb109ZVtvXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGE9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0scz10aGlzJiZ0aGlzLl9faW1wb3J0U3Rhcnx8ZnVuY3Rpb24odCl7aWYodCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBlPXt9O2lmKG51bGwhPXQpZm9yKHZhciBuIGluIHQpT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGVbbl09dFtuXSk7cmV0dXJuIGUuZGVmYXVsdD10LGV9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciB1PWEobigwKSksbD1uKDE3NCksYz1zKG4oMzYpKSxkPWEobig0MykpLHA9bC5NRENNZW51U3VyZmFjZUZvdW5kYXRpb24uQ29ybmVyLGY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5uYXRpdmVDb250cm9sPXUuZGVmYXVsdC5jcmVhdGVSZWYoKSxlLnNlbGVjdGVkVGV4dEVsPXUuZGVmYXVsdC5jcmVhdGVSZWYoKSxlLm1lbnVFbD11LmRlZmF1bHQuY3JlYXRlUmVmKCksZS5zdGF0ZT17XCJhcmlhLWV4cGFuZGVkXCI6dm9pZCAwLHNlbGVjdGVkSXRlbTpudWxsLHNlbGVjdGVkVmFsdWU6XCJcIn0sZS5zZXRTZWxlY3RlZD1mdW5jdGlvbigpe3ZhciB0PW51bGwhPT1lLm1lbnVFbC5jdXJyZW50JiZlLm1lbnVFbC5jdXJyZW50Lmxpc3RFbGVtZW50cztpZih0JiZ0Lmxlbmd0aCl7dmFyIG49dFtlLmdldEluZGV4QnlWYWx1ZSh0KV0saT1uJiZuLmdldEF0dHJpYnV0ZShkLmRlZmF1bHQuc3RyaW5ncy5FTkhBTkNFRF9WQUxVRV9BVFRSKXx8XCJcIjtlLnNldFN0YXRlKHtzZWxlY3RlZEl0ZW06bixzZWxlY3RlZFZhbHVlOml9KX19LGUuZ2V0SW5kZXhCeVZhbHVlPWZ1bmN0aW9uKHQpe3ZhciBuPWUucHJvcHMudmFsdWUsaT0tMTtyZXR1cm4gaTwwJiZuJiZ0LnNvbWUoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoZC5kZWZhdWx0LnN0cmluZ3MuRU5IQU5DRURfVkFMVUVfQVRUUik9PT1uJiYoaT1lLCEwKX0pLGl9LGUuaGFuZGxlTWVudUNsb3NlPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5wcm9wcyxuPXQuY2xvc2VNZW51LGk9dC5mb3VuZGF0aW9uO24oKSxlLnNldFN0YXRlKHtcImFyaWEtZXhwYW5kZWRcIjp2b2lkIDB9KSxpJiZkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09ZS5zZWxlY3RlZFRleHRFbC5jdXJyZW50JiZpLmhhbmRsZUJsdXIoKX0sZS5oYW5kbGVNZW51T3Blbj1mdW5jdGlvbigpe2lmKGUuc2V0U3RhdGUoe1wiYXJpYS1leHBhbmRlZFwiOiEwfSksZS5saXN0RWxlbWVudHMmJmUubGlzdEVsZW1lbnRzLmxlbmd0aD4wKXt2YXIgdD1lLmdldEluZGV4QnlWYWx1ZShlLmxpc3RFbGVtZW50cyk7dD10Pi0xP3Q6MCxlLmxpc3RFbGVtZW50c1t0XS5mb2N1cygpfX0sZX1yZXR1cm4gbyhlLHQpLGUucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbih0KXt0aGlzLnByb3BzLnZhbHVlIT09dC52YWx1ZSYmdGhpcy5zZXRTZWxlY3RlZCgpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJsaXN0RWxlbWVudHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT10aGlzLm1lbnVFbC5jdXJyZW50JiZ0aGlzLm1lbnVFbC5jdXJyZW50Lmxpc3RFbGVtZW50c30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9dC5jaGlsZHJlbixuPXQucmVxdWlyZWQsaT10Lm9wZW4sbz10LmRpc2FibGVkLGE9dC5hbmNob3JFbGVtZW50LHM9dC5vbk1vdXNlRG93bixsPXQub25Ub3VjaFN0YXJ0LGQ9dC5vbktleURvd24sZj10Lm9uRm9jdXMsaD10Lm9uQ2xpY2ssXz10Lm9uQmx1cixtPXQub25FbmhhbmNlZENoYW5nZSx5PXQuaXNJbnZhbGlkLE89dGhpcy5zdGF0ZSx2PU9bXCJhcmlhLWV4cGFuZGVkXCJdLGI9Ty5zZWxlY3RlZFZhbHVlLGc9Ty5zZWxlY3RlZEl0ZW0sRT17fTtyZXR1cm4gbiYmKEVbXCJhcmlhLXJlcXVpcmVkXCJdPW4udG9TdHJpbmcoKSksdiYmXCJmYWxzZVwiIT09diYmKEVbXCJhcmlhLWV4cGFuZGVkXCJdPVwidHJ1ZVwiKSx5JiYoRVtcImFyaWEtaW52YWxpZFwiXT1cInRydWVcIiksRVtcImFyaWEtZGlzYWJsZWRcIl09bz9cInRydWVcIjpcImZhbHNlXCIsdS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQodS5kZWZhdWx0LkZyYWdtZW50LG51bGwsdS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLHt0eXBlOlwiaGlkZGVuXCIsbmFtZTpcImVuaGFuY2VkLXNlbGVjdFwiLGRpc2FibGVkOm8sdmFsdWU6Yn0pLHUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIscih7Y2xhc3NOYW1lOlwibWRjLXNlbGVjdF9fc2VsZWN0ZWQtdGV4dFwifSxFLHtyZWY6dGhpcy5zZWxlY3RlZFRleHRFbCx0YWJJbmRleDpvPy0xOjAsb25Nb3VzZURvd246cyxvblRvdWNoU3RhcnQ6bCxvbktleURvd246ZCxvbkZvY3VzOmYsb25DbGljazpoLG9uQmx1cjpffSksZz9nLnRleHRDb250ZW50LnRyaW0oKTpcIlwiKSx1LmRlZmF1bHQuY3JlYXRlRWxlbWVudChjLmRlZmF1bHQse2NsYXNzTmFtZTpcIm1kYy1zZWxlY3RfX21lbnVcIixvbkNsb3NlOnRoaXMuaGFuZGxlTWVudUNsb3NlLG9uT3Blbjp0aGlzLmhhbmRsZU1lbnVPcGVuLG9wZW46aSxvblNlbGVjdGVkOm0sYW5jaG9yRWxlbWVudDphfHx2b2lkIDAsYW5jaG9yQ29ybmVyOnAuQk9UVE9NX1NUQVJULHJlZjp0aGlzLm1lbnVFbCxvbk1vdW50OnRoaXMuc2V0U2VsZWN0ZWR9LHUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGMuTWVudUxpc3QsbnVsbCx1LmRlZmF1bHQuQ2hpbGRyZW4ubWFwKGUsZnVuY3Rpb24odCl7dmFyIGU9dDtyZXR1cm4gdS5kZWZhdWx0LmNsb25lRWxlbWVudChlLHIoe30sZS5wcm9wcyx7ZW5oYW5jZWQ6ITB9KSl9KSkpKX0sZS5kZWZhdWx0UHJvcHM9e2Rpc2FibGVkOiExLGNsb3NlTWVudTpmdW5jdGlvbigpe30sb25FbmhhbmNlZENoYW5nZTpmdW5jdGlvbigpe30sdmFsdWU6XCJcIixhbmNob3JFbGVtZW50Om51bGwsaXNJbnZhbGlkOiExfSxlfSh1LmRlZmF1bHQuQ29tcG9uZW50KTtlLmRlZmF1bHQ9Zn0sMTEzOmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgaSxvPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1mdW5jdGlvbih0LGUpe3JldHVybihpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSkodCxlKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxyPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKHI9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIG8gaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbykmJih0W29dPWVbb10pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxhPXRoaXMmJnRoaXMuX19yZXN0fHxmdW5jdGlvbih0LGUpe3ZhciBuPXt9O2Zvcih2YXIgaSBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGkpJiZlLmluZGV4T2YoaSk8MCYmKG5baV09dFtpXSk7aWYobnVsbCE9dCYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG89MDtmb3IoaT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO288aS5sZW5ndGg7bysrKWUuaW5kZXhPZihpW29dKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodCxpW29dKSYmKG5baVtvXV09dFtpW29dXSl9cmV0dXJuIG59LHM9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIHU9cyhuKDApKSxsPW4oMzYpLGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIG8oZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9dC52YWx1ZSxuPXQuZW5oYW5jZWQsaT10LmNoaWxkcmVuLG89YSh0LFtcInZhbHVlXCIsXCJlbmhhbmNlZFwiLFwiY2hpbGRyZW5cIl0pO3JldHVybiBuP3UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGwuTWVudUxpc3RJdGVtLHIoe1wiZGF0YS12YWx1ZVwiOmV9LG8pLGkpOnUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIscih7dmFsdWU6ZX0sbyksaSl9LGUuZGVmYXVsdFByb3BzPXtlbmhhbmNlZDohMX0sZX0odS5kZWZhdWx0LkNvbXBvbmVudCk7ZS5kZWZhdWx0PWN9LDExNDpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGksbz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4oaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSkscj10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciBvIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG8pJiYodFtvXT1lW29dKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYT10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIGkgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKSYmZS5pbmRleE9mKGkpPDAmJihuW2ldPXRbaV0pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBvPTA7Zm9yKGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtvPGkubGVuZ3RoO28rKyllLmluZGV4T2YoaVtvXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsaVtvXSkmJihuW2lbb11dPXRbaVtvXV0pfXJldHVybiBufSxzPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciB1PXMobigwKSksbD1zKG4oMSkpLGM9bigxNjYpLGQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5zdGF0ZT17XCJhcmlhLWhpZGRlblwiOnZvaWQgMCxyb2xlOnZvaWQgMCxjbGFzc0xpc3Q6bmV3IFNldH0sZX1yZXR1cm4gbyhlLHQpLGUucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcy5zZXRIZWxwZXJUZXh0Rm91bmRhdGlvbjt0aGlzLmZvdW5kYXRpb249bmV3IGMuTURDU2VsZWN0SGVscGVyVGV4dEZvdW5kYXRpb24odGhpcy5hZGFwdGVyKSx0aGlzLmZvdW5kYXRpb24uaW5pdCgpLHQmJnQodGhpcy5mb3VuZGF0aW9uKX0sZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLnNldEhlbHBlclRleHRGb3VuZGF0aW9uO3RoaXMuZm91bmRhdGlvbiYmKHRoaXMuZm91bmRhdGlvbi5kZXN0cm95KCksdCYmdCh2b2lkIDApKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiY2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9dC5jbGFzc05hbWUsbj10LnBlcnNpc3RlbnQsaT10aGlzLnN0YXRlLmNsYXNzTGlzdDtyZXR1cm4gbC5kZWZhdWx0KFwibWRjLXNlbGVjdC1oZWxwZXItdGV4dFwiLEFycmF5LmZyb20oaSksZSx7XCJtZGMtc2VsZWN0LWhlbHBlci10ZXh0LS1wZXJzaXN0ZW50XCI6bn0pfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm57YWRkQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIG49bmV3IFNldCh0LnN0YXRlLmNsYXNzTGlzdCk7bi5hZGQoZSksdC5zZXRTdGF0ZSh7Y2xhc3NMaXN0Om59KX0scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIG49bmV3IFNldCh0LnN0YXRlLmNsYXNzTGlzdCk7bi5kZWxldGUoZSksdC5zZXRTdGF0ZSh7Y2xhc3NMaXN0Om59KX0saGFzQ2xhc3M6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY2xhc3Nlcy5zcGxpdChcIiBcIikuaW5jbHVkZXMoZSl9LHNldEF0dHI6ZnVuY3Rpb24oZSxuKXt0LnNldFN0YXRlKGZ1bmN0aW9uKHQpe3ZhciBpO3JldHVybiByKHt9LHQsKChpPXt9KVtlXT1uLGkpKX0pfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3Quc2V0U3RhdGUoZnVuY3Rpb24odCl7dmFyIG47cmV0dXJuIHIoe30sdCwoKG49e30pW2VdPW51bGwsbikpfSl9LHNldENvbnRlbnQ6ZnVuY3Rpb24oKXt9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9dC5jaGlsZHJlbixuPSh0LnBlcnNpc3RlbnQsdC5jbGFzc05hbWUsdC5zZXRIZWxwZXJUZXh0Rm91bmRhdGlvbixhKHQsW1wiY2hpbGRyZW5cIixcInBlcnNpc3RlbnRcIixcImNsYXNzTmFtZVwiLFwic2V0SGVscGVyVGV4dEZvdW5kYXRpb25cIl0pKSxpPXRoaXMuc3RhdGUsbz1pW1wiYXJpYS1oaWRkZW5cIl0scz1pLnJvbGU7cmV0dXJuIHUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwicFwiLHIoe2NsYXNzTmFtZTp0aGlzLmNsYXNzZXMsXCJhcmlhLWhpZGRlblwiOm8scm9sZTpzfSxuKSxlKX0sZX0odS5kZWZhdWx0LkNvbXBvbmVudCk7ZS5TZWxlY3RIZWxwZXJUZXh0PWR9LDExNTpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGksbz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4oaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSkscj10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciBvIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG8pJiYodFtvXT1lW29dKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYT10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIGkgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKSYmZS5pbmRleE9mKGkpPDAmJihuW2ldPXRbaV0pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBvPTA7Zm9yKGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtvPGkubGVuZ3RoO28rKyllLmluZGV4T2YoaVtvXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsaVtvXSkmJihuW2lbb11dPXRbaVtvXV0pfXJldHVybiBufSxzPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciB1PXMobigwKSksbD1zKG4oMSkpLGM9bigxNzEpLGQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5zdGF0ZT17dGFiaW5kZXg6dm9pZCAwLHJvbGU6dm9pZCAwfSxlfXJldHVybiBvKGUsdCksZS5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLnNldEljb25Gb3VuZGF0aW9uO3RoaXMuZm91bmRhdGlvbj1uZXcgYy5NRENTZWxlY3RJY29uRm91bmRhdGlvbih0aGlzLmFkYXB0ZXIpLHRoaXMuZm91bmRhdGlvbi5pbml0KCksdCYmdCh0aGlzLmZvdW5kYXRpb24pfSxlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMuc2V0SWNvbkZvdW5kYXRpb247dGhpcy5mb3VuZGF0aW9uJiYodGhpcy5mb3VuZGF0aW9uLmRlc3Ryb3koKSx0JiZ0KHZvaWQgMCkpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJhZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJue2dldEF0dHI6ZnVuY3Rpb24oZSl7aWYodm9pZCAwIT09dC5zdGF0ZVtlXSlyZXR1cm4gdC5zdGF0ZVtlXS50b1N0cmluZygpO3ZhciBuPVwidGFiaW5kZXhcIj09PWU/XCJ0YWJJbmRleFwiOmU7cmV0dXJuIHZvaWQgMCE9PXQucHJvcHNbbl0/dC5wcm9wc1tuXS50b1N0cmluZygpOm51bGx9LHNldEF0dHI6ZnVuY3Rpb24oZSxuKXt0LnNldFN0YXRlKGZ1bmN0aW9uKHQpe3ZhciBpO3JldHVybiByKHt9LHQsKChpPXt9KVtlXT1uLGkpKX0pfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3Quc2V0U3RhdGUoZnVuY3Rpb24odCl7dmFyIG47cmV0dXJuIHIoe30sdCwoKG49e30pW2VdPW51bGwsbikpfSl9LHNldENvbnRlbnQ6ZnVuY3Rpb24oKXt9LHJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxkZXJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxub3RpZnlJY29uQWN0aW9uOmZ1bmN0aW9uKCl7fX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcyxlPXQudGFnLG49KHQuc2V0SWNvbkZvdW5kYXRpb24sdC5jaGlsZHJlbiksaT10LmNsYXNzTmFtZSxvPWEodCxbXCJ0YWdcIixcInNldEljb25Gb3VuZGF0aW9uXCIsXCJjaGlsZHJlblwiLFwiY2xhc3NOYW1lXCJdKSxzPXRoaXMuc3RhdGUsYz1zLnRhYmluZGV4LGQ9cy5yb2xlO3JldHVybiB1LmRlZmF1bHQuY3JlYXRlRWxlbWVudChlLHIoe2NsYXNzTmFtZTpsLmRlZmF1bHQoXCJtZGMtc2VsZWN0X19pY29uXCIsaSkscm9sZTpkLHRhYkluZGV4OmN9LG8pLG4pfSxlLmRlZmF1bHRQcm9wcz17dGFnOlwiaVwifSxlfSh1LmRlZmF1bHQuQ29tcG9uZW50KTtlLlNlbGVjdEljb249ZH0sMTM6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24uZChlLFwiYVwiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZvaWQgMD09PXQmJih0PXt9KSx0aGlzLmFkYXB0ZXJfPXR9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcInN0cmluZ3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJudW1iZXJzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe30sdH0oKX0sMTY2OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSk7dmFyIGk9big5KSxvPW4oMTMpLHI9e0FSSUFfSElEREVOOlwiYXJpYS1oaWRkZW5cIixST0xFOlwicm9sZVwifSxhPXtIRUxQRVJfVEVYVF9QRVJTSVNURU5UOlwibWRjLXNlbGVjdC1oZWxwZXItdGV4dC0tcGVyc2lzdGVudFwiLEhFTFBFUl9URVhUX1ZBTElEQVRJT05fTVNHOlwibWRjLXNlbGVjdC1oZWxwZXItdGV4dC0tdmFsaWRhdGlvbi1tc2dcIn07bi5kKGUsXCJNRENTZWxlY3RIZWxwZXJUZXh0Rm91bmRhdGlvblwiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIHM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXtyZXR1cm4gdC5jYWxsKHRoaXMsaS5hKHt9LGUuZGVmYXVsdEFkYXB0ZXIsbikpfHx0aGlzfXJldHVybiBpLmIoZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzdHJpbmdzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiByfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2FkZENsYXNzOmZ1bmN0aW9uKCl7fSxyZW1vdmVDbGFzczpmdW5jdGlvbigpe30saGFzQ2xhc3M6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sc2V0QXR0cjpmdW5jdGlvbigpe30scmVtb3ZlQXR0cjpmdW5jdGlvbigpe30sc2V0Q29udGVudDpmdW5jdGlvbigpe319fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnNldENvbnRlbnQ9ZnVuY3Rpb24odCl7dGhpcy5hZGFwdGVyXy5zZXRDb250ZW50KHQpfSxlLnByb3RvdHlwZS5zZXRQZXJzaXN0ZW50PWZ1bmN0aW9uKHQpe3Q/dGhpcy5hZGFwdGVyXy5hZGRDbGFzcyhhLkhFTFBFUl9URVhUX1BFUlNJU1RFTlQpOnRoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoYS5IRUxQRVJfVEVYVF9QRVJTSVNURU5UKX0sZS5wcm90b3R5cGUuc2V0VmFsaWRhdGlvbj1mdW5jdGlvbih0KXt0P3RoaXMuYWRhcHRlcl8uYWRkQ2xhc3MoYS5IRUxQRVJfVEVYVF9WQUxJREFUSU9OX01TRyk6dGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyhhLkhFTFBFUl9URVhUX1ZBTElEQVRJT05fTVNHKX0sZS5wcm90b3R5cGUuc2hvd1RvU2NyZWVuUmVhZGVyPWZ1bmN0aW9uKCl7dGhpcy5hZGFwdGVyXy5yZW1vdmVBdHRyKHIuQVJJQV9ISURERU4pfSxlLnByb3RvdHlwZS5zZXRWYWxpZGl0eT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmFkYXB0ZXJfLmhhc0NsYXNzKGEuSEVMUEVSX1RFWFRfUEVSU0lTVEVOVCksbj10aGlzLmFkYXB0ZXJfLmhhc0NsYXNzKGEuSEVMUEVSX1RFWFRfVkFMSURBVElPTl9NU0cpJiYhdDtuP3RoaXMuYWRhcHRlcl8uc2V0QXR0cihyLlJPTEUsXCJhbGVydFwiKTp0aGlzLmFkYXB0ZXJfLnJlbW92ZUF0dHIoci5ST0xFKSxlfHxufHx0aGlzLmhpZGVfKCl9LGUucHJvdG90eXBlLmhpZGVfPWZ1bmN0aW9uKCl7dGhpcy5hZGFwdGVyXy5zZXRBdHRyKHIuQVJJQV9ISURERU4sXCJ0cnVlXCIpfSxlfShvLmEpO2UuZGVmYXVsdD1zfSwxNzE6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24ucihlKTt2YXIgaT1uKDkpLG89bigxMykscj17SUNPTl9FVkVOVDpcIk1EQ1NlbGVjdDppY29uXCIsSUNPTl9ST0xFOlwiYnV0dG9uXCJ9O24uZChlLFwiTURDU2VsZWN0SWNvbkZvdW5kYXRpb25cIixmdW5jdGlvbigpe3JldHVybiBzfSk7XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cbnZhciBhPVtcImNsaWNrXCIsXCJrZXlkb3duXCJdLHM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXt2YXIgbz10LmNhbGwodGhpcyxpLmEoe30sZS5kZWZhdWx0QWRhcHRlcixuKSl8fHRoaXM7cmV0dXJuIG8uc2F2ZWRUYWJJbmRleF89bnVsbCxvLmludGVyYWN0aW9uSGFuZGxlcl89ZnVuY3Rpb24odCl7cmV0dXJuIG8uaGFuZGxlSW50ZXJhY3Rpb24odCl9LG99cmV0dXJuIGkuYihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwic3RyaW5nc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcn0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybntnZXRBdHRyOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LHNldEF0dHI6ZnVuY3Rpb24oKXt9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oKXt9LHNldENvbnRlbnQ6ZnVuY3Rpb24oKXt9LHJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxkZXJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxub3RpZnlJY29uQWN0aW9uOmZ1bmN0aW9uKCl7fX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5zYXZlZFRhYkluZGV4Xz10aGlzLmFkYXB0ZXJfLmdldEF0dHIoXCJ0YWJpbmRleFwiKSxhLmZvckVhY2goZnVuY3Rpb24oZSl7dC5hZGFwdGVyXy5yZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcihlLHQuaW50ZXJhY3Rpb25IYW5kbGVyXyl9KX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7YS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuYWRhcHRlcl8uZGVyZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcihlLHQuaW50ZXJhY3Rpb25IYW5kbGVyXyl9KX0sZS5wcm90b3R5cGUuc2V0RGlzYWJsZWQ9ZnVuY3Rpb24odCl7dGhpcy5zYXZlZFRhYkluZGV4XyYmKHQ/KHRoaXMuYWRhcHRlcl8uc2V0QXR0cihcInRhYmluZGV4XCIsXCItMVwiKSx0aGlzLmFkYXB0ZXJfLnJlbW92ZUF0dHIoXCJyb2xlXCIpKToodGhpcy5hZGFwdGVyXy5zZXRBdHRyKFwidGFiaW5kZXhcIix0aGlzLnNhdmVkVGFiSW5kZXhfKSx0aGlzLmFkYXB0ZXJfLnNldEF0dHIoXCJyb2xlXCIsci5JQ09OX1JPTEUpKSl9LGUucHJvdG90eXBlLnNldEFyaWFMYWJlbD1mdW5jdGlvbih0KXt0aGlzLmFkYXB0ZXJfLnNldEF0dHIoXCJhcmlhLWxhYmVsXCIsdCl9LGUucHJvdG90eXBlLnNldENvbnRlbnQ9ZnVuY3Rpb24odCl7dGhpcy5hZGFwdGVyXy5zZXRDb250ZW50KHQpfSxlLnByb3RvdHlwZS5oYW5kbGVJbnRlcmFjdGlvbj1mdW5jdGlvbih0KXt2YXIgZT1cIkVudGVyXCI9PT10LmtleXx8MTM9PT10LmtleUNvZGU7KFwiY2xpY2tcIj09PXQudHlwZXx8ZSkmJnRoaXMuYWRhcHRlcl8ubm90aWZ5SWNvbkFjdGlvbigpfSxlfShvLmEpO2UuZGVmYXVsdD1zfSwxNzQ6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24ucihlKTt2YXIgaSxvLHI9big5KSxhPW4oMTMpLHM9e0FOQ0hPUjpcIm1kYy1tZW51LXN1cmZhY2UtLWFuY2hvclwiLEFOSU1BVElOR19DTE9TRUQ6XCJtZGMtbWVudS1zdXJmYWNlLS1hbmltYXRpbmctY2xvc2VkXCIsQU5JTUFUSU5HX09QRU46XCJtZGMtbWVudS1zdXJmYWNlLS1hbmltYXRpbmctb3BlblwiLEZJWEVEOlwibWRjLW1lbnUtc3VyZmFjZS0tZml4ZWRcIixPUEVOOlwibWRjLW1lbnUtc3VyZmFjZS0tb3BlblwiLFJPT1Q6XCJtZGMtbWVudS1zdXJmYWNlXCJ9LHU9e0NMT1NFRF9FVkVOVDpcIk1EQ01lbnVTdXJmYWNlOmNsb3NlZFwiLE9QRU5FRF9FVkVOVDpcIk1EQ01lbnVTdXJmYWNlOm9wZW5lZFwiLEZPQ1VTQUJMRV9FTEVNRU5UUzpbXCJidXR0b246bm90KDpkaXNhYmxlZClcIiwnW2hyZWZdOm5vdChbYXJpYS1kaXNhYmxlZD1cInRydWVcIl0pJyxcImlucHV0Om5vdCg6ZGlzYWJsZWQpXCIsXCJzZWxlY3Q6bm90KDpkaXNhYmxlZClcIixcInRleHRhcmVhOm5vdCg6ZGlzYWJsZWQpXCIsJ1t0YWJpbmRleF06bm90KFt0YWJpbmRleD1cIi0xXCJdKTpub3QoW2FyaWEtZGlzYWJsZWQ9XCJ0cnVlXCJdKSddLmpvaW4oXCIsIFwiKX0sbD17VFJBTlNJVElPTl9PUEVOX0RVUkFUSU9OOjEyMCxUUkFOU0lUSU9OX0NMT1NFX0RVUkFUSU9OOjc1LE1BUkdJTl9UT19FREdFOjMyLEFOQ0hPUl9UT19NRU5VX1NVUkZBQ0VfV0lEVEhfUkFUSU86LjY3fTshZnVuY3Rpb24odCl7dFt0LkJPVFRPTT0xXT1cIkJPVFRPTVwiLHRbdC5DRU5URVI9Ml09XCJDRU5URVJcIix0W3QuUklHSFQ9NF09XCJSSUdIVFwiLHRbdC5GTElQX1JUTD04XT1cIkZMSVBfUlRMXCJ9KGl8fChpPXt9KSksZnVuY3Rpb24odCl7dFt0LlRPUF9MRUZUPTBdPVwiVE9QX0xFRlRcIix0W3QuVE9QX1JJR0hUPTRdPVwiVE9QX1JJR0hUXCIsdFt0LkJPVFRPTV9MRUZUPTFdPVwiQk9UVE9NX0xFRlRcIix0W3QuQk9UVE9NX1JJR0hUPTVdPVwiQk9UVE9NX1JJR0hUXCIsdFt0LlRPUF9TVEFSVD04XT1cIlRPUF9TVEFSVFwiLHRbdC5UT1BfRU5EPTEyXT1cIlRPUF9FTkRcIix0W3QuQk9UVE9NX1NUQVJUPTldPVwiQk9UVE9NX1NUQVJUXCIsdFt0LkJPVFRPTV9FTkQ9MTNdPVwiQk9UVE9NX0VORFwifShvfHwobz17fSkpLG4uZChlLFwiTURDTWVudVN1cmZhY2VGb3VuZGF0aW9uXCIsZnVuY3Rpb24oKXtyZXR1cm4gY30pO1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG52YXIgYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciBpPXQuY2FsbCh0aGlzLHIuYSh7fSxlLmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpcztyZXR1cm4gaS5pc09wZW5fPSExLGkuaXNRdWlja09wZW5fPSExLGkuaXNIb2lzdGVkRWxlbWVudF89ITEsaS5pc0ZpeGVkUG9zaXRpb25fPSExLGkub3BlbkFuaW1hdGlvbkVuZFRpbWVySWRfPTAsaS5jbG9zZUFuaW1hdGlvbkVuZFRpbWVySWRfPTAsaS5hbmltYXRpb25SZXF1ZXN0SWRfPTAsaS5hbmNob3JDb3JuZXJfPW8uVE9QX1NUQVJULGkuYW5jaG9yTWFyZ2luXz17dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjB9LGkucG9zaXRpb25fPXt4OjAseTowfSxpfXJldHVybiByLmIoZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHN9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzdHJpbmdzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB1fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwibnVtYmVyc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIkNvcm5lclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybnthZGRDbGFzczpmdW5jdGlvbigpe30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oKXt9LGhhc0NsYXNzOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGhhc0FuY2hvcjpmdW5jdGlvbigpe3JldHVybiExfSxpc0VsZW1lbnRJbkNvbnRhaW5lcjpmdW5jdGlvbigpe3JldHVybiExfSxpc0ZvY3VzZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXNGaXJzdEVsZW1lbnRGb2N1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGlzTGFzdEVsZW1lbnRGb2N1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGlzUnRsOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGdldElubmVyRGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybntoZWlnaHQ6MCx3aWR0aDowfX0sZ2V0QW5jaG9yRGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybiBudWxsfSxnZXRXaW5kb3dEaW1lbnNpb25zOmZ1bmN0aW9uKCl7cmV0dXJue2hlaWdodDowLHdpZHRoOjB9fSxnZXRCb2R5RGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybntoZWlnaHQ6MCx3aWR0aDowfX0sZ2V0V2luZG93U2Nyb2xsOmZ1bmN0aW9uKCl7cmV0dXJue3g6MCx5OjB9fSxzZXRQb3NpdGlvbjpmdW5jdGlvbigpe30sc2V0TWF4SGVpZ2h0OmZ1bmN0aW9uKCl7fSxzZXRUcmFuc2Zvcm1PcmlnaW46ZnVuY3Rpb24oKXt9LHNhdmVGb2N1czpmdW5jdGlvbigpe30scmVzdG9yZUZvY3VzOmZ1bmN0aW9uKCl7fSxmb2N1c0ZpcnN0RWxlbWVudDpmdW5jdGlvbigpe30sZm9jdXNMYXN0RWxlbWVudDpmdW5jdGlvbigpe30sbm90aWZ5Q2xvc2U6ZnVuY3Rpb24oKXt9LG5vdGlmeU9wZW46ZnVuY3Rpb24oKXt9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dmFyIHQ9ZS5jc3NDbGFzc2VzLG49dC5ST09ULGk9dC5PUEVOO2lmKCF0aGlzLmFkYXB0ZXJfLmhhc0NsYXNzKG4pKXRocm93IG5ldyBFcnJvcihuK1wiIGNsYXNzIHJlcXVpcmVkIGluIHJvb3QgZWxlbWVudC5cIik7dGhpcy5hZGFwdGVyXy5oYXNDbGFzcyhpKSYmKHRoaXMuaXNPcGVuXz0hMCl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodGhpcy5vcGVuQW5pbWF0aW9uRW5kVGltZXJJZF8pLGNsZWFyVGltZW91dCh0aGlzLmNsb3NlQW5pbWF0aW9uRW5kVGltZXJJZF8pLGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uUmVxdWVzdElkXyl9LGUucHJvdG90eXBlLnNldEFuY2hvckNvcm5lcj1mdW5jdGlvbih0KXt0aGlzLmFuY2hvckNvcm5lcl89dH0sZS5wcm90b3R5cGUuc2V0QW5jaG9yTWFyZ2luPWZ1bmN0aW9uKHQpe3RoaXMuYW5jaG9yTWFyZ2luXy50b3A9dC50b3B8fDAsdGhpcy5hbmNob3JNYXJnaW5fLnJpZ2h0PXQucmlnaHR8fDAsdGhpcy5hbmNob3JNYXJnaW5fLmJvdHRvbT10LmJvdHRvbXx8MCx0aGlzLmFuY2hvck1hcmdpbl8ubGVmdD10LmxlZnR8fDB9LGUucHJvdG90eXBlLnNldElzSG9pc3RlZD1mdW5jdGlvbih0KXt0aGlzLmlzSG9pc3RlZEVsZW1lbnRfPXR9LGUucHJvdG90eXBlLnNldEZpeGVkUG9zaXRpb249ZnVuY3Rpb24odCl7dGhpcy5pc0ZpeGVkUG9zaXRpb25fPXR9LGUucHJvdG90eXBlLnNldEFic29sdXRlUG9zaXRpb249ZnVuY3Rpb24odCxlKXt0aGlzLnBvc2l0aW9uXy54PXRoaXMuaXNGaW5pdGVfKHQpP3Q6MCx0aGlzLnBvc2l0aW9uXy55PXRoaXMuaXNGaW5pdGVfKGUpP2U6MH0sZS5wcm90b3R5cGUuc2V0UXVpY2tPcGVuPWZ1bmN0aW9uKHQpe3RoaXMuaXNRdWlja09wZW5fPXR9LGUucHJvdG90eXBlLmlzT3Blbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzT3Blbl99LGUucHJvdG90eXBlLm9wZW49ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuYWRhcHRlcl8uc2F2ZUZvY3VzKCksdGhpcy5pc1F1aWNrT3Blbl98fHRoaXMuYWRhcHRlcl8uYWRkQ2xhc3MoZS5jc3NDbGFzc2VzLkFOSU1BVElOR19PUEVOKSx0aGlzLmFuaW1hdGlvblJlcXVlc3RJZF89cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7dC5hZGFwdGVyXy5hZGRDbGFzcyhlLmNzc0NsYXNzZXMuT1BFTiksdC5kaW1lbnNpb25zXz10LmFkYXB0ZXJfLmdldElubmVyRGltZW5zaW9ucygpLHQuYXV0b1Bvc2l0aW9uXygpLHQuaXNRdWlja09wZW5fP3QuYWRhcHRlcl8ubm90aWZ5T3BlbigpOnQub3BlbkFuaW1hdGlvbkVuZFRpbWVySWRfPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0Lm9wZW5BbmltYXRpb25FbmRUaW1lcklkXz0wLHQuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoZS5jc3NDbGFzc2VzLkFOSU1BVElOR19PUEVOKSx0LmFkYXB0ZXJfLm5vdGlmeU9wZW4oKX0sbC5UUkFOU0lUSU9OX09QRU5fRFVSQVRJT04pfSksdGhpcy5pc09wZW5fPSEwfSxlLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5pc1F1aWNrT3Blbl98fHRoaXMuYWRhcHRlcl8uYWRkQ2xhc3MoZS5jc3NDbGFzc2VzLkFOSU1BVElOR19DTE9TRUQpLHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3QuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoZS5jc3NDbGFzc2VzLk9QRU4pLHQuaXNRdWlja09wZW5fP3QuYWRhcHRlcl8ubm90aWZ5Q2xvc2UoKTp0LmNsb3NlQW5pbWF0aW9uRW5kVGltZXJJZF89c2V0VGltZW91dChmdW5jdGlvbigpe3QuY2xvc2VBbmltYXRpb25FbmRUaW1lcklkXz0wLHQuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoZS5jc3NDbGFzc2VzLkFOSU1BVElOR19DTE9TRUQpLHQuYWRhcHRlcl8ubm90aWZ5Q2xvc2UoKX0sbC5UUkFOU0lUSU9OX0NMT1NFX0RVUkFUSU9OKX0pLHRoaXMuaXNPcGVuXz0hMSx0aGlzLm1heWJlUmVzdG9yZUZvY3VzXygpfSxlLnByb3RvdHlwZS5oYW5kbGVCb2R5Q2xpY2s9ZnVuY3Rpb24odCl7dmFyIGU9dC50YXJnZXQ7dGhpcy5hZGFwdGVyXy5pc0VsZW1lbnRJbkNvbnRhaW5lcihlKXx8dGhpcy5jbG9zZSgpfSxlLnByb3RvdHlwZS5oYW5kbGVLZXlkb3duPWZ1bmN0aW9uKHQpe3ZhciBlPXQua2V5Q29kZSxuPXQua2V5LGk9dC5zaGlmdEtleSxvPVwiVGFiXCI9PT1ufHw5PT09ZTtcIkVzY2FwZVwiPT09bnx8Mjc9PT1lP3RoaXMuY2xvc2UoKTpvJiYodGhpcy5hZGFwdGVyXy5pc0xhc3RFbGVtZW50Rm9jdXNlZCgpJiYhaT8odGhpcy5hZGFwdGVyXy5mb2N1c0ZpcnN0RWxlbWVudCgpLHQucHJldmVudERlZmF1bHQoKSk6dGhpcy5hZGFwdGVyXy5pc0ZpcnN0RWxlbWVudEZvY3VzZWQoKSYmaSYmKHRoaXMuYWRhcHRlcl8uZm9jdXNMYXN0RWxlbWVudCgpLHQucHJldmVudERlZmF1bHQoKSkpfSxlLnByb3RvdHlwZS5hdXRvUG9zaXRpb25fPWZ1bmN0aW9uKCl7dmFyIHQ7dGhpcy5tZWFzdXJlbWVudHNfPXRoaXMuZ2V0QXV0b0xheW91dE1lYXN1cmVtZW50c18oKTt2YXIgZT10aGlzLmdldE9yaWdpbkNvcm5lcl8oKSxuPXRoaXMuZ2V0TWVudVN1cmZhY2VNYXhIZWlnaHRfKGUpLG89dGhpcy5oYXNCaXRfKGUsaS5CT1RUT00pP1wiYm90dG9tXCI6XCJ0b3BcIixyPXRoaXMuaGFzQml0XyhlLGkuUklHSFQpP1wicmlnaHRcIjpcImxlZnRcIixhPXRoaXMuZ2V0SG9yaXpvbnRhbE9yaWdpbk9mZnNldF8oZSkscz10aGlzLmdldFZlcnRpY2FsT3JpZ2luT2Zmc2V0XyhlKSx1PXRoaXMubWVhc3VyZW1lbnRzXyxjPXUuYW5jaG9yU2l6ZSxkPXUuc3VyZmFjZVNpemUscD0oKHQ9e30pW3JdPWEsdFtvXT1zLHQpO2Mud2lkdGgvZC53aWR0aD5sLkFOQ0hPUl9UT19NRU5VX1NVUkZBQ0VfV0lEVEhfUkFUSU8mJihyPVwiY2VudGVyXCIpLCh0aGlzLmlzSG9pc3RlZEVsZW1lbnRffHx0aGlzLmlzRml4ZWRQb3NpdGlvbl8pJiZ0aGlzLmFkanVzdFBvc2l0aW9uRm9ySG9pc3RlZEVsZW1lbnRfKHApLHRoaXMuYWRhcHRlcl8uc2V0VHJhbnNmb3JtT3JpZ2luKHIrXCIgXCIrbyksdGhpcy5hZGFwdGVyXy5zZXRQb3NpdGlvbihwKSx0aGlzLmFkYXB0ZXJfLnNldE1heEhlaWdodChuP24rXCJweFwiOlwiXCIpfSxlLnByb3RvdHlwZS5nZXRBdXRvTGF5b3V0TWVhc3VyZW1lbnRzXz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYWRhcHRlcl8uZ2V0QW5jaG9yRGltZW5zaW9ucygpLGU9dGhpcy5hZGFwdGVyXy5nZXRCb2R5RGltZW5zaW9ucygpLG49dGhpcy5hZGFwdGVyXy5nZXRXaW5kb3dEaW1lbnNpb25zKCksaT10aGlzLmFkYXB0ZXJfLmdldFdpbmRvd1Njcm9sbCgpO3JldHVybiB0fHwodD17dG9wOnRoaXMucG9zaXRpb25fLnkscmlnaHQ6dGhpcy5wb3NpdGlvbl8ueCxib3R0b206dGhpcy5wb3NpdGlvbl8ueSxsZWZ0OnRoaXMucG9zaXRpb25fLngsd2lkdGg6MCxoZWlnaHQ6MH0pLHthbmNob3JTaXplOnQsYm9keVNpemU6ZSxzdXJmYWNlU2l6ZTp0aGlzLmRpbWVuc2lvbnNfLHZpZXdwb3J0RGlzdGFuY2U6e3RvcDp0LnRvcCxyaWdodDpuLndpZHRoLXQucmlnaHQsYm90dG9tOm4uaGVpZ2h0LXQuYm90dG9tLGxlZnQ6dC5sZWZ0fSx2aWV3cG9ydFNpemU6bix3aW5kb3dTY3JvbGw6aX19LGUucHJvdG90eXBlLmdldE9yaWdpbkNvcm5lcl89ZnVuY3Rpb24oKXt2YXIgdD1vLlRPUF9MRUZULGU9dGhpcy5tZWFzdXJlbWVudHNfLG49ZS52aWV3cG9ydERpc3RhbmNlLHI9ZS5hbmNob3JTaXplLGE9ZS5zdXJmYWNlU2l6ZSxzPXRoaXMuaGFzQml0Xyh0aGlzLmFuY2hvckNvcm5lcl8saS5CT1RUT00pLHU9cz9uLnRvcCtyLmhlaWdodCt0aGlzLmFuY2hvck1hcmdpbl8uYm90dG9tOm4udG9wK3RoaXMuYW5jaG9yTWFyZ2luXy50b3AsbD1zP24uYm90dG9tLXRoaXMuYW5jaG9yTWFyZ2luXy5ib3R0b206bi5ib3R0b20rci5oZWlnaHQtdGhpcy5hbmNob3JNYXJnaW5fLnRvcCxjPWEuaGVpZ2h0LXUsZD1hLmhlaWdodC1sO2Q+MCYmYzxkJiYodD10aGlzLnNldEJpdF8odCxpLkJPVFRPTSkpO3ZhciBwPXRoaXMuYWRhcHRlcl8uaXNSdGwoKSxmPXRoaXMuaGFzQml0Xyh0aGlzLmFuY2hvckNvcm5lcl8saS5GTElQX1JUTCksaD10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLGkuUklHSFQpLF89aCYmIXB8fCFoJiZmJiZwLG09Xz9uLmxlZnQrci53aWR0aCt0aGlzLmFuY2hvck1hcmdpbl8ucmlnaHQ6bi5sZWZ0K3RoaXMuYW5jaG9yTWFyZ2luXy5sZWZ0LHk9Xz9uLnJpZ2h0LXRoaXMuYW5jaG9yTWFyZ2luXy5yaWdodDpuLnJpZ2h0K3Iud2lkdGgtdGhpcy5hbmNob3JNYXJnaW5fLmxlZnQsTz1hLndpZHRoLW0sdj1hLndpZHRoLXk7cmV0dXJuKE88MCYmXyYmcHx8aCYmIV8mJk88MHx8dj4wJiZPPHYpJiYodD10aGlzLnNldEJpdF8odCxpLlJJR0hUKSksdH0sZS5wcm90b3R5cGUuZ2V0TWVudVN1cmZhY2VNYXhIZWlnaHRfPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMubWVhc3VyZW1lbnRzXy52aWV3cG9ydERpc3RhbmNlLG89MCxyPXRoaXMuaGFzQml0Xyh0LGkuQk9UVE9NKSxhPXRoaXMuaGFzQml0Xyh0aGlzLmFuY2hvckNvcm5lcl8saS5CT1RUT00pLHM9ZS5udW1iZXJzLk1BUkdJTl9UT19FREdFO3JldHVybiByPyhvPW4udG9wK3RoaXMuYW5jaG9yTWFyZ2luXy50b3AtcyxhfHwobys9dGhpcy5tZWFzdXJlbWVudHNfLmFuY2hvclNpemUuaGVpZ2h0KSk6KG89bi5ib3R0b20tdGhpcy5hbmNob3JNYXJnaW5fLmJvdHRvbSt0aGlzLm1lYXN1cmVtZW50c18uYW5jaG9yU2l6ZS5oZWlnaHQtcyxhJiYoby09dGhpcy5tZWFzdXJlbWVudHNfLmFuY2hvclNpemUuaGVpZ2h0KSksb30sZS5wcm90b3R5cGUuZ2V0SG9yaXpvbnRhbE9yaWdpbk9mZnNldF89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5tZWFzdXJlbWVudHNfLmFuY2hvclNpemUsbj10aGlzLmhhc0JpdF8odCxpLlJJR0hUKSxvPXRoaXMuaGFzQml0Xyh0aGlzLmFuY2hvckNvcm5lcl8saS5SSUdIVCk7aWYobil7dmFyIHI9bz9lLndpZHRoLXRoaXMuYW5jaG9yTWFyZ2luXy5sZWZ0OnRoaXMuYW5jaG9yTWFyZ2luXy5yaWdodDtyZXR1cm4gdGhpcy5pc0hvaXN0ZWRFbGVtZW50X3x8dGhpcy5pc0ZpeGVkUG9zaXRpb25fP3ItKHRoaXMubWVhc3VyZW1lbnRzXy52aWV3cG9ydFNpemUud2lkdGgtdGhpcy5tZWFzdXJlbWVudHNfLmJvZHlTaXplLndpZHRoKTpyfXJldHVybiBvP2Uud2lkdGgtdGhpcy5hbmNob3JNYXJnaW5fLnJpZ2h0OnRoaXMuYW5jaG9yTWFyZ2luXy5sZWZ0fSxlLnByb3RvdHlwZS5nZXRWZXJ0aWNhbE9yaWdpbk9mZnNldF89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5tZWFzdXJlbWVudHNfLmFuY2hvclNpemUsbj10aGlzLmhhc0JpdF8odCxpLkJPVFRPTSksbz10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLGkuQk9UVE9NKTtyZXR1cm4gbj9vP2UuaGVpZ2h0LXRoaXMuYW5jaG9yTWFyZ2luXy50b3A6LXRoaXMuYW5jaG9yTWFyZ2luXy5ib3R0b206bz9lLmhlaWdodCt0aGlzLmFuY2hvck1hcmdpbl8uYm90dG9tOnRoaXMuYW5jaG9yTWFyZ2luXy50b3B9LGUucHJvdG90eXBlLmFkanVzdFBvc2l0aW9uRm9ySG9pc3RlZEVsZW1lbnRfPWZ1bmN0aW9uKHQpe3ZhciBlLG4saT10aGlzLm1lYXN1cmVtZW50c18sbz1pLndpbmRvd1Njcm9sbCxhPWkudmlld3BvcnREaXN0YW5jZSxzPU9iamVjdC5rZXlzKHQpO3RyeXtmb3IodmFyIHU9ci5jKHMpLGw9dS5uZXh0KCk7IWwuZG9uZTtsPXUubmV4dCgpKXt2YXIgYz1sLnZhbHVlLGQ9dFtjXXx8MDtkKz1hW2NdLHRoaXMuaXNGaXhlZFBvc2l0aW9uX3x8KFwidG9wXCI9PT1jP2QrPW8ueTpcImJvdHRvbVwiPT09Yz9kLT1vLnk6XCJsZWZ0XCI9PT1jP2QrPW8ueDpkLT1vLngpLHRbY109ZH19Y2F0Y2godCl7ZT17ZXJyb3I6dH19ZmluYWxseXt0cnl7bCYmIWwuZG9uZSYmKG49dS5yZXR1cm4pJiZuLmNhbGwodSl9ZmluYWxseXtpZihlKXRocm93IGUuZXJyb3J9fX0sZS5wcm90b3R5cGUubWF5YmVSZXN0b3JlRm9jdXNfPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5hZGFwdGVyXy5pc0ZvY3VzZWQoKSxlPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQmJnRoaXMuYWRhcHRlcl8uaXNFbGVtZW50SW5Db250YWluZXIoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7KHR8fGUpJiZ0aGlzLmFkYXB0ZXJfLnJlc3RvcmVGb2N1cygpfSxlLnByb3RvdHlwZS5oYXNCaXRfPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEJvb2xlYW4odCZlKX0sZS5wcm90b3R5cGUuc2V0Qml0Xz1mdW5jdGlvbih0LGUpe3JldHVybiB0fGV9LGUucHJvdG90eXBlLmlzRmluaXRlXz1mdW5jdGlvbih0KXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgdCYmaXNGaW5pdGUodCl9LGV9KGEuYSk7ZS5kZWZhdWx0PWN9LDMzOmZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPW59LDM0OmZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWl9LDM1OmZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPW99LDM2OmZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPXJ9LDQzOmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSk7dmFyIGk9big5KSxvPW4oMTMpLHI9e0RJU0FCTEVEOlwibWRjLXNlbGVjdC0tZGlzYWJsZWRcIixGT0NVU0VEOlwibWRjLXNlbGVjdC0tZm9jdXNlZFwiLElOVkFMSUQ6XCJtZGMtc2VsZWN0LS1pbnZhbGlkXCIsT1VUTElORUQ6XCJtZGMtc2VsZWN0LS1vdXRsaW5lZFwiLFJFUVVJUkVEOlwibWRjLXNlbGVjdC0tcmVxdWlyZWRcIixST09UOlwibWRjLXNlbGVjdFwiLFNFTEVDVEVEX0lURU1fQ0xBU1M6XCJtZGMtbGlzdC1pdGVtLS1zZWxlY3RlZFwiLFdJVEhfTEVBRElOR19JQ09OOlwibWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb25cIn0sYT17QVJJQV9DT05UUk9MUzpcImFyaWEtY29udHJvbHNcIixBUklBX1NFTEVDVEVEX0FUVFI6XCJhcmlhLXNlbGVjdGVkXCIsQ0hBTkdFX0VWRU5UOlwiTURDU2VsZWN0OmNoYW5nZVwiLEVOSEFOQ0VEX1ZBTFVFX0FUVFI6XCJkYXRhLXZhbHVlXCIsSElEREVOX0lOUFVUX1NFTEVDVE9SOidpbnB1dFt0eXBlPVwiaGlkZGVuXCJdJyxMQUJFTF9TRUxFQ1RPUjpcIi5tZGMtZmxvYXRpbmctbGFiZWxcIixMRUFESU5HX0lDT05fU0VMRUNUT1I6XCIubWRjLXNlbGVjdF9faWNvblwiLExJTkVfUklQUExFX1NFTEVDVE9SOlwiLm1kYy1saW5lLXJpcHBsZVwiLE1FTlVfU0VMRUNUT1I6XCIubWRjLXNlbGVjdF9fbWVudVwiLE5BVElWRV9DT05UUk9MX1NFTEVDVE9SOlwiLm1kYy1zZWxlY3RfX25hdGl2ZS1jb250cm9sXCIsT1VUTElORV9TRUxFQ1RPUjpcIi5tZGMtbm90Y2hlZC1vdXRsaW5lXCIsU0VMRUNURURfSVRFTV9TRUxFQ1RPUjpcIi5cIityLlNFTEVDVEVEX0lURU1fQ0xBU1MsU0VMRUNURURfVEVYVF9TRUxFQ1RPUjpcIi5tZGMtc2VsZWN0X19zZWxlY3RlZC10ZXh0XCJ9LHM9e0xBQkVMX1NDQUxFOi43NX07bi5kKGUsXCJNRENTZWxlY3RGb3VuZGF0aW9uXCIsZnVuY3Rpb24oKXtyZXR1cm4gdX0pO1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG52YXIgdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4sbyl7dm9pZCAwPT09byYmKG89e30pO3ZhciByPXQuY2FsbCh0aGlzLGkuYSh7fSxlLmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpcztyZXR1cm4gci5sZWFkaW5nSWNvbl89by5sZWFkaW5nSWNvbixyLmhlbHBlclRleHRfPW8uaGVscGVyVGV4dCxyfXJldHVybiBpLmIoZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJudW1iZXJzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwic3RyaW5nc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybnthZGRDbGFzczpmdW5jdGlvbigpe30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oKXt9LGhhc0NsYXNzOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGFjdGl2YXRlQm90dG9tTGluZTpmdW5jdGlvbigpe30sZGVhY3RpdmF0ZUJvdHRvbUxpbmU6ZnVuY3Rpb24oKXt9LHNldFZhbHVlOmZ1bmN0aW9uKCl7fSxnZXRWYWx1ZTpmdW5jdGlvbigpe3JldHVyblwiXCJ9LGZsb2F0TGFiZWw6ZnVuY3Rpb24oKXt9LGdldExhYmVsV2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gMH0saGFzT3V0bGluZTpmdW5jdGlvbigpe3JldHVybiExfSxub3RjaE91dGxpbmU6ZnVuY3Rpb24oKXt9LGNsb3NlT3V0bGluZTpmdW5jdGlvbigpe30sb3Blbk1lbnU6ZnVuY3Rpb24oKXt9LGNsb3NlTWVudTpmdW5jdGlvbigpe30saXNNZW51T3BlbjpmdW5jdGlvbigpe3JldHVybiExfSxzZXRTZWxlY3RlZEluZGV4OmZ1bmN0aW9uKCl7fSxzZXREaXNhYmxlZDpmdW5jdGlvbigpe30sc2V0UmlwcGxlQ2VudGVyOmZ1bmN0aW9uKCl7fSxub3RpZnlDaGFuZ2U6ZnVuY3Rpb24oKXt9LGNoZWNrVmFsaWRpdHk6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sc2V0VmFsaWQ6ZnVuY3Rpb24oKXt9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5zZXRTZWxlY3RlZEluZGV4PWZ1bmN0aW9uKHQpe3RoaXMuYWRhcHRlcl8uc2V0U2VsZWN0ZWRJbmRleCh0KSx0aGlzLmFkYXB0ZXJfLmNsb3NlTWVudSgpO3RoaXMuaGFuZGxlQ2hhbmdlKCEwKX0sZS5wcm90b3R5cGUuc2V0VmFsdWU9ZnVuY3Rpb24odCl7dGhpcy5hZGFwdGVyXy5zZXRWYWx1ZSh0KTt0aGlzLmhhbmRsZUNoYW5nZSghMCl9LGUucHJvdG90eXBlLmdldFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRhcHRlcl8uZ2V0VmFsdWUoKX0sZS5wcm90b3R5cGUuc2V0RGlzYWJsZWQ9ZnVuY3Rpb24odCl7dD90aGlzLmFkYXB0ZXJfLmFkZENsYXNzKHIuRElTQUJMRUQpOnRoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3Moci5ESVNBQkxFRCksdGhpcy5hZGFwdGVyXy5zZXREaXNhYmxlZCh0KSx0aGlzLmFkYXB0ZXJfLmNsb3NlTWVudSgpLHRoaXMubGVhZGluZ0ljb25fJiZ0aGlzLmxlYWRpbmdJY29uXy5zZXREaXNhYmxlZCh0KX0sZS5wcm90b3R5cGUuc2V0SGVscGVyVGV4dENvbnRlbnQ9ZnVuY3Rpb24odCl7dGhpcy5oZWxwZXJUZXh0XyYmdGhpcy5oZWxwZXJUZXh0Xy5zZXRDb250ZW50KHQpfSxlLnByb3RvdHlwZS5sYXlvdXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFZhbHVlKCkubGVuZ3RoPjA7dGhpcy5ub3RjaE91dGxpbmUodCl9LGUucHJvdG90eXBlLmhhbmRsZUNoYW5nZT1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD0hMCk7dmFyIGU9dGhpcy5nZXRWYWx1ZSgpLG49ZS5sZW5ndGg+MCxpPXRoaXMuYWRhcHRlcl8uaGFzQ2xhc3Moci5SRVFVSVJFRCk7dGhpcy5ub3RjaE91dGxpbmUobiksdGhpcy5hZGFwdGVyXy5oYXNDbGFzcyhyLkZPQ1VTRUQpfHx0aGlzLmFkYXB0ZXJfLmZsb2F0TGFiZWwobiksdCYmKHRoaXMuYWRhcHRlcl8ubm90aWZ5Q2hhbmdlKGUpLGkmJih0aGlzLnNldFZhbGlkKHRoaXMuaXNWYWxpZCgpKSx0aGlzLmhlbHBlclRleHRfJiZ0aGlzLmhlbHBlclRleHRfLnNldFZhbGlkaXR5KHRoaXMuaXNWYWxpZCgpKSkpfSxlLnByb3RvdHlwZS5oYW5kbGVGb2N1cz1mdW5jdGlvbigpe3RoaXMuYWRhcHRlcl8uYWRkQ2xhc3Moci5GT0NVU0VEKSx0aGlzLmFkYXB0ZXJfLmZsb2F0TGFiZWwoITApLHRoaXMubm90Y2hPdXRsaW5lKCEwKSx0aGlzLmFkYXB0ZXJfLmFjdGl2YXRlQm90dG9tTGluZSgpLHRoaXMuaGVscGVyVGV4dF8mJnRoaXMuaGVscGVyVGV4dF8uc2hvd1RvU2NyZWVuUmVhZGVyKCl9LGUucHJvdG90eXBlLmhhbmRsZUJsdXI9ZnVuY3Rpb24oKXt0aGlzLmFkYXB0ZXJfLmlzTWVudU9wZW4oKXx8KHRoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3Moci5GT0NVU0VEKSx0aGlzLmhhbmRsZUNoYW5nZSghMSksdGhpcy5hZGFwdGVyXy5kZWFjdGl2YXRlQm90dG9tTGluZSgpLHRoaXMuYWRhcHRlcl8uaGFzQ2xhc3Moci5SRVFVSVJFRCkmJih0aGlzLnNldFZhbGlkKHRoaXMuaXNWYWxpZCgpKSx0aGlzLmhlbHBlclRleHRfJiZ0aGlzLmhlbHBlclRleHRfLnNldFZhbGlkaXR5KHRoaXMuaXNWYWxpZCgpKSkpfSxlLnByb3RvdHlwZS5oYW5kbGVDbGljaz1mdW5jdGlvbih0KXt0aGlzLmFkYXB0ZXJfLmlzTWVudU9wZW4oKXx8KHRoaXMuYWRhcHRlcl8uc2V0UmlwcGxlQ2VudGVyKHQpLHRoaXMuYWRhcHRlcl8ub3Blbk1lbnUoKSl9LGUucHJvdG90eXBlLmhhbmRsZUtleWRvd249ZnVuY3Rpb24odCl7aWYoIXRoaXMuYWRhcHRlcl8uaXNNZW51T3BlbigpKXt2YXIgZT1cIkVudGVyXCI9PT10LmtleXx8MTM9PT10LmtleUNvZGUsbj1cIlNwYWNlXCI9PT10LmtleXx8MzI9PT10LmtleUNvZGUsaT1cIkFycm93VXBcIj09PXQua2V5fHwzOD09PXQua2V5Q29kZSxvPVwiQXJyb3dEb3duXCI9PT10LmtleXx8NDA9PT10LmtleUNvZGU7dGhpcy5hZGFwdGVyXy5oYXNDbGFzcyhyLkZPQ1VTRUQpJiYoZXx8bnx8aXx8bykmJih0aGlzLmFkYXB0ZXJfLm9wZW5NZW51KCksdC5wcmV2ZW50RGVmYXVsdCgpKX19LGUucHJvdG90eXBlLm5vdGNoT3V0bGluZT1mdW5jdGlvbih0KXtpZih0aGlzLmFkYXB0ZXJfLmhhc091dGxpbmUoKSl7dmFyIGU9dGhpcy5hZGFwdGVyXy5oYXNDbGFzcyhyLkZPQ1VTRUQpO2lmKHQpe3ZhciBuPXMuTEFCRUxfU0NBTEUsaT10aGlzLmFkYXB0ZXJfLmdldExhYmVsV2lkdGgoKSpuO3RoaXMuYWRhcHRlcl8ubm90Y2hPdXRsaW5lKGkpfWVsc2UgZXx8dGhpcy5hZGFwdGVyXy5jbG9zZU91dGxpbmUoKX19LGUucHJvdG90eXBlLnNldExlYWRpbmdJY29uQXJpYUxhYmVsPWZ1bmN0aW9uKHQpe3RoaXMubGVhZGluZ0ljb25fJiZ0aGlzLmxlYWRpbmdJY29uXy5zZXRBcmlhTGFiZWwodCl9LGUucHJvdG90eXBlLnNldExlYWRpbmdJY29uQ29udGVudD1mdW5jdGlvbih0KXt0aGlzLmxlYWRpbmdJY29uXyYmdGhpcy5sZWFkaW5nSWNvbl8uc2V0Q29udGVudCh0KX0sZS5wcm90b3R5cGUuc2V0VmFsaWQ9ZnVuY3Rpb24odCl7dGhpcy5hZGFwdGVyXy5zZXRWYWxpZCh0KX0sZS5wcm90b3R5cGUuaXNWYWxpZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFkYXB0ZXJfLmNoZWNrVmFsaWRpdHkoKX0sZX0oby5hKTtlLmRlZmF1bHQ9dX0sOTpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJiXCIsZnVuY3Rpb24oKXtyZXR1cm4gb30pLG4uZChlLFwiYVwiLGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KSxuLmQoZSxcImNcIixmdW5jdGlvbigpe3JldHVybiBhfSk7XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3I7XG4vKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXG50aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZVxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcbk1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuXG5cblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xuYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi92YXIgaT1mdW5jdGlvbih0LGUpe3JldHVybihpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSkodCxlKX07ZnVuY3Rpb24gbyh0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX12YXIgcj1mdW5jdGlvbigpe3JldHVybihyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciBvIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG8pJiYodFtvXT1lW29dKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07ZnVuY3Rpb24gYSh0KXt2YXIgZT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnRbU3ltYm9sLml0ZXJhdG9yXSxuPTA7cmV0dXJuIGU/ZS5jYWxsKHQpOntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIHQmJm4+PXQubGVuZ3RoJiYodD12b2lkIDApLHt2YWx1ZTp0JiZ0W24rK10sZG9uZTohdH19fX19fSl9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlbGVjdC5qcy5tYXAiLCJcbnZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NlbGVjdC5jc3NcIik7XG5cbmlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXG52YXIgdHJhbnNmb3JtO1xudmFyIGluc2VydEludG87XG5cblxuXG52YXIgb3B0aW9ucyA9IHtcImhtclwiOnRydWV9XG5cbm9wdGlvbnMudHJhbnNmb3JtID0gdHJhbnNmb3JtXG5vcHRpb25zLmluc2VydEludG8gPSB1bmRlZmluZWQ7XG5cbnZhciB1cGRhdGUgPSByZXF1aXJlKFwiIS4uLy4uLy4uL3N0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzLmpzXCIpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5pZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2FscztcblxuaWYobW9kdWxlLmhvdCkge1xuXHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NlbGVjdC5jc3NcIiwgZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc2VsZWN0LmNzc1wiKTtcblxuXHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXG5cdFx0dmFyIGxvY2FscyA9IChmdW5jdGlvbihhLCBiKSB7XG5cdFx0XHR2YXIga2V5LCBpZHggPSAwO1xuXG5cdFx0XHRmb3Ioa2V5IGluIGEpIHtcblx0XHRcdFx0aWYoIWIgfHwgYVtrZXldICE9PSBiW2tleV0pIHJldHVybiBmYWxzZTtcblx0XHRcdFx0aWR4Kys7XG5cdFx0XHR9XG5cblx0XHRcdGZvcihrZXkgaW4gYikgaWR4LS07XG5cblx0XHRcdHJldHVybiBpZHggPT09IDA7XG5cdFx0fShjb250ZW50LmxvY2FscywgbmV3Q29udGVudC5sb2NhbHMpKTtcblxuXHRcdGlmKCFsb2NhbHMpIHRocm93IG5ldyBFcnJvcignQWJvcnRpbmcgQ1NTIEhNUiBkdWUgdG8gY2hhbmdlZCBjc3MtbW9kdWxlcyBsb2NhbHMuJyk7XG5cblx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdH0pO1xuXG5cdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xufSIsIiFmdW5jdGlvbih0LGUpe2lmKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPWUocmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpLHJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtZmxvYXRpbmctbGFiZWwvZGlzdC9pbmRleC5qc1wiKSxyZXF1aXJlKFwiQG1hdGVyaWFsL3JlYWN0LWxpbmUtcmlwcGxlL2Rpc3QvaW5kZXguanNcIikscmVxdWlyZShcIkBtYXRlcmlhbC9yZWFjdC1ub3RjaGVkLW91dGxpbmUvZGlzdC9pbmRleC5qc1wiKSk7ZWxzZSBpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQpZGVmaW5lKFtcInJlYWN0XCIsXCJjbGFzc25hbWVzXCIsXCJAbWF0ZXJpYWwvcmVhY3QtZmxvYXRpbmctbGFiZWwvZGlzdC9pbmRleC5qc1wiLFwiQG1hdGVyaWFsL3JlYWN0LWxpbmUtcmlwcGxlL2Rpc3QvaW5kZXguanNcIixcIkBtYXRlcmlhbC9yZWFjdC1ub3RjaGVkLW91dGxpbmUvZGlzdC9pbmRleC5qc1wiXSxlKTtlbHNle3ZhciBuPVwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2UocmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpLHJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtZmxvYXRpbmctbGFiZWwvZGlzdC9pbmRleC5qc1wiKSxyZXF1aXJlKFwiQG1hdGVyaWFsL3JlYWN0LWxpbmUtcmlwcGxlL2Rpc3QvaW5kZXguanNcIikscmVxdWlyZShcIkBtYXRlcmlhbC9yZWFjdC1ub3RjaGVkLW91dGxpbmUvZGlzdC9pbmRleC5qc1wiKSk6ZSh0LnJlYWN0LHQuY2xhc3NuYW1lcyx0W1wiQG1hdGVyaWFsL3JlYWN0LWZsb2F0aW5nLWxhYmVsL2Rpc3QvaW5kZXguanNcIl0sdFtcIkBtYXRlcmlhbC9yZWFjdC1saW5lLXJpcHBsZS9kaXN0L2luZGV4LmpzXCJdLHRbXCJAbWF0ZXJpYWwvcmVhY3Qtbm90Y2hlZC1vdXRsaW5lL2Rpc3QvaW5kZXguanNcIl0pO2Zvcih2YXIgaSBpbiBuKShcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnQpW2ldPW5baV19fShcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZj9zZWxmOnRoaXMsZnVuY3Rpb24odCxlLG4saSxyKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9e307ZnVuY3Rpb24gbihpKXtpZihlW2ldKXJldHVybiBlW2ldLmV4cG9ydHM7dmFyIHI9ZVtpXT17aTppLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIHRbaV0uY2FsbChyLmV4cG9ydHMscixyLmV4cG9ydHMsbiksci5sPSEwLHIuZXhwb3J0c31yZXR1cm4gbi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxpKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6aX0pfSxuLnI9ZnVuY3Rpb24odCl7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOlwiTW9kdWxlXCJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiZcIm9iamVjdFwiPT10eXBlb2YgdCYmdCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCk7aWYobi5yKGkpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLFwiZGVmYXVsdFwiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KSwyJmUmJlwic3RyaW5nXCIhPXR5cGVvZiB0KWZvcih2YXIgciBpbiB0KW4uZChpLHIsZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxyKSk7cmV0dXJuIGl9LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsXCJhXCIsZSksZX0sbi5vPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfSxuLnA9XCJcIixuKG4ucz0xMzIpfSh7MDpmdW5jdGlvbihlLG4pe2UuZXhwb3J0cz10fSwxOmZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWV9LDEwOmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImJcIixmdW5jdGlvbigpe3JldHVybiByfSksbi5kKGUsXCJhXCIsZnVuY3Rpb24oKXtyZXR1cm4gYX0pO1wiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yO1xuLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxuXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovdmFyIGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4oaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9O2Z1bmN0aW9uIHIodCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9dmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4oYT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgciBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmKHRbcl09ZVtyXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSwxMzI6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9KSh0LGUpfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLGE9dGhpcyYmdGhpcy5fX2Fzc2lnbnx8ZnVuY3Rpb24oKXtyZXR1cm4oYT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgciBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmKHRbcl09ZVtyXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG89dGhpcyYmdGhpcy5fX3Jlc3R8fGZ1bmN0aW9uKHQsZSl7dmFyIG49e307Zm9yKHZhciBpIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsaSkmJmUuaW5kZXhPZihpKTwwJiYobltpXT10W2ldKTtpZihudWxsIT10JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj0wO2ZvcihpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7cjxpLmxlbmd0aDtyKyspZS5pbmRleE9mKGlbcl0pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LGlbcl0pJiYobltpW3JdXT10W2lbcl1dKX1yZXR1cm4gbn0scz10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbD1zKG4oMCkpLHU9cyhuKDEpKSxkPW4oMTY0KSxjPXMobigxMzMpKTtlLklucHV0PWMuZGVmYXVsdDt2YXIgcD1zKG4oMTM0KSk7ZS5JY29uPXAuZGVmYXVsdDt2YXIgZj1zKG4oMTM1KSk7ZS5IZWxwZXJUZXh0PWYuZGVmYXVsdDt2YXIgaD1zKG4oMTM2KSk7ZS5DaGFyYWN0ZXJDb3VudGVyPWguZGVmYXVsdDt2YXIgYj1zKG4oMzMpKSxfPXMobigzNCkpLGc9cyhuKDM1KSkseT1kLk1EQ1RleHRGaWVsZEZvdW5kYXRpb24uY3NzQ2xhc3NlcyxtPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG4saT10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gaS50ZXh0RmllbGRFbGVtZW50PWwuZGVmYXVsdC5jcmVhdGVSZWYoKSxpLmZsb2F0aW5nTGFiZWxFbGVtZW50PWwuZGVmYXVsdC5jcmVhdGVSZWYoKSxpLmlucHV0Q29tcG9uZW50Xz1udWxsLGUuY2hpbGRyZW4mJmwuZGVmYXVsdC5DaGlsZHJlbi5vbmx5KGUuY2hpbGRyZW4pJiYobj1lLmNoaWxkcmVuLnByb3BzLmlkKSxpLnN0YXRlPXtjbGFzc0xpc3Q6bmV3IFNldCxpbnB1dElkOm4saXNGb2N1c2VkOiExLGRpcjpcImx0clwiLGRpc2FibGVkOiExLGxhYmVsSXNGbG9hdGVkOiExLGluaXRpYWxMYWJlbFdpZHRoOjAsbm90Y2hlZExhYmVsV2lkdGg6MCxhY3RpdmVMaW5lUmlwcGxlOiExLGxpbmVSaXBwbGVDZW50ZXI6MCxvdXRsaW5lSXNOb3RjaGVkOiExLGlzVmFsaWQ6ITAsZm91bmRhdGlvbjp2b2lkIDB9LGl9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3ZhciB0PW5ldyBkLk1EQ1RleHRGaWVsZEZvdW5kYXRpb24odGhpcy5hZGFwdGVyKTt0aGlzLnNldFN0YXRlKHtmb3VuZGF0aW9uOnR9KSx0LmluaXQoKX0sZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLnN0YXRlLmZvdW5kYXRpb24mJnRoaXMuc3RhdGUuZm91bmRhdGlvbi5kZXN0cm95KCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImNsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLnN0YXRlLG49ZS5jbGFzc0xpc3QsaT1lLmRpc2FibGVkLHI9ZS5pc0ZvY3VzZWQsYT1lLmlzVmFsaWQsbz10aGlzLnByb3BzLHM9by5jbGFzc05hbWUsbD1vLmRlbnNlLGQ9by5mdWxsV2lkdGgsYz1vLnRleHRhcmVhLHA9by50cmFpbGluZ0ljb24sZj1vLmxlYWRpbmdJY29uLGg9by5ub0xhYmVsO3JldHVybiB1LmRlZmF1bHQoeS5ST09ULEFycmF5LmZyb20obikscywoKHQ9e30pW3kuREVOU0VdPWwsdFt5LkRJU0FCTEVEXT1pLHRbeS5GT0NVU0VEXT1yLHRbeS5JTlZBTElEXT0hYSx0W3kuT1VUTElORURdPXRoaXMubm90Y2hlZE91dGxpbmVBZGFwdGVyLmhhc091dGxpbmUoKSYmIWQsdFt5LlRFWFRBUkVBXT1jLHRbeS5XSVRIX0xFQURJTkdfSUNPTl09Zix0W1wibWRjLXRleHQtZmllbGQtLWZ1bGx3aWR0aFwiXT1kLHRbXCJtZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uXCJdPXAsdFtcIm1kYy10ZXh0LWZpZWxkLS1uby1sYWJlbFwiXT0hdGhpcy5sYWJlbEFkYXB0ZXIuaGFzTGFiZWwoKXx8aCx0KSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwib3RoZXJQcm9wc1wiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzO3QuY2hpbGRyZW4sdC5jbGFzc05hbWUsdC5kZW5zZSx0LmZsb2F0aW5nTGFiZWxDbGFzc05hbWUsdC5mdWxsV2lkdGgsdC5oZWxwZXJUZXh0LHQuY2hhcmFjdGVyQ291bnRlcix0LmxhYmVsLHQubGVhZGluZ0ljb24sdC5saW5lUmlwcGxlQ2xhc3NOYW1lLHQubm90Y2hlZE91dGxpbmVDbGFzc05hbWUsdC5vbkxlYWRpbmdJY29uU2VsZWN0LHQub25UcmFpbGluZ0ljb25TZWxlY3QsdC5vdXRsaW5lZCx0LnRleHRhcmVhLHQudHJhaWxpbmdJY29uLHQubm9MYWJlbDtyZXR1cm4gbyh0LFtcImNoaWxkcmVuXCIsXCJjbGFzc05hbWVcIixcImRlbnNlXCIsXCJmbG9hdGluZ0xhYmVsQ2xhc3NOYW1lXCIsXCJmdWxsV2lkdGhcIixcImhlbHBlclRleHRcIixcImNoYXJhY3RlckNvdW50ZXJcIixcImxhYmVsXCIsXCJsZWFkaW5nSWNvblwiLFwibGluZVJpcHBsZUNsYXNzTmFtZVwiLFwibm90Y2hlZE91dGxpbmVDbGFzc05hbWVcIixcIm9uTGVhZGluZ0ljb25TZWxlY3RcIixcIm9uVHJhaWxpbmdJY29uU2VsZWN0XCIsXCJvdXRsaW5lZFwiLFwidGV4dGFyZWFcIixcInRyYWlsaW5nSWNvblwiLFwibm9MYWJlbFwiXSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiYWRhcHRlclwiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9e2FkZENsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnNldFN0YXRlKHtjbGFzc0xpc3Q6dC5zdGF0ZS5jbGFzc0xpc3QuYWRkKGUpfSl9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciBuPXQuc3RhdGUuY2xhc3NMaXN0O24uZGVsZXRlKGUpLHQuc2V0U3RhdGUoe2NsYXNzTGlzdDpufSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiB0LmNsYXNzZXMuc3BsaXQoXCIgXCIpLmluY2x1ZGVzKGUpfSxyZWdpc3RlclRleHRGaWVsZEludGVyYWN0aW9uSGFuZGxlcjpmdW5jdGlvbigpe30sZGVyZWdpc3RlclRleHRGaWVsZEludGVyYWN0aW9uSGFuZGxlcjpmdW5jdGlvbigpe30scmVnaXN0ZXJWYWxpZGF0aW9uQXR0cmlidXRlQ2hhbmdlSGFuZGxlcjpmdW5jdGlvbigpe30sZGVyZWdpc3RlclZhbGlkYXRpb25BdHRyaWJ1dGVDaGFuZ2VIYW5kbGVyOmZ1bmN0aW9uKCl7fX07cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sZSx0aGlzLmlucHV0QWRhcHRlcix0aGlzLmxhYmVsQWRhcHRlcix0aGlzLmxpbmVSaXBwbGVBZGFwdGVyLHRoaXMubm90Y2hlZE91dGxpbmVBZGFwdGVyKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJpbnB1dEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm57aXNGb2N1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuIHQuc3RhdGUuaXNGb2N1c2VkfSxnZXROYXRpdmVJbnB1dDpmdW5jdGlvbigpe3ZhciBlPXQuaW5wdXRDb21wb25lbnRfO2lmKGUpcmV0dXJue2Rpc2FibGVkOmUuaXNEaXNhYmxlZCgpLHZhbHVlOmUuZ2V0VmFsdWUoKSxtYXhMZW5ndGg6ZS5nZXRNYXhMZW5ndGgoKSx0eXBlOmUuZ2V0SW5wdXRUeXBlKCksdmFsaWRpdHk6e2JhZElucHV0OiEhZS5pc0JhZElucHV0KCksdmFsaWQ6ISFlLmlzVmFsaWQoKX19O3Rocm93IEVycm9yKFwiTURDUmVhY3RUZXh0RmllbGQ6IFRoZSBpbnB1dCBkaWQgbm90IHJlbmRlciBwcm9wZXJseVwiKX0scmVnaXN0ZXJJbnB1dEludGVyYWN0aW9uSGFuZGxlcjpmdW5jdGlvbigpe30sZGVyZWdpc3RlcklucHV0SW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwibGFiZWxBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJue3NoYWtlTGFiZWw6ZnVuY3Rpb24oZSl7dmFyIG49dC5mbG9hdGluZ0xhYmVsRWxlbWVudDtlJiZuJiZuLmN1cnJlbnQmJm4uY3VycmVudC5zaGFrZSgpfSxmbG9hdExhYmVsOmZ1bmN0aW9uKGUpe3JldHVybiB0LnNldFN0YXRlKHtsYWJlbElzRmxvYXRlZDplfSl9LGhhc0xhYmVsOmZ1bmN0aW9uKCl7cmV0dXJuISF0LnByb3BzLmxhYmVsJiYhdC5wcm9wcy5mdWxsV2lkdGh9LGdldExhYmVsV2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gdC5zdGF0ZS5pbml0aWFsTGFiZWxXaWR0aH19fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImxpbmVSaXBwbGVBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJue2FjdGl2YXRlTGluZVJpcHBsZTpmdW5jdGlvbigpe3JldHVybiB0LnNldFN0YXRlKHthY3RpdmVMaW5lUmlwcGxlOiEwfSl9LGRlYWN0aXZhdGVMaW5lUmlwcGxlOmZ1bmN0aW9uKCl7cmV0dXJuIHQuc2V0U3RhdGUoe2FjdGl2ZUxpbmVSaXBwbGU6ITF9KX0sc2V0TGluZVJpcHBsZVRyYW5zZm9ybU9yaWdpbjpmdW5jdGlvbihlKXtyZXR1cm4gdC5zZXRTdGF0ZSh7bGluZVJpcHBsZUNlbnRlcjplfSl9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJub3RjaGVkT3V0bGluZUFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm57bm90Y2hPdXRsaW5lOmZ1bmN0aW9uKGUpe3JldHVybiB0LnNldFN0YXRlKHtvdXRsaW5lSXNOb3RjaGVkOiEwLG5vdGNoZWRMYWJlbFdpZHRoOmV9KX0sY2xvc2VPdXRsaW5lOmZ1bmN0aW9uKCl7cmV0dXJuIHQuc2V0U3RhdGUoe291dGxpbmVJc05vdGNoZWQ6ITF9KX0saGFzT3V0bGluZTpmdW5jdGlvbigpe3JldHVybiEhdC5wcm9wcy5vdXRsaW5lZHx8ISF0LnByb3BzLnRleHRhcmVhfX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiaW5wdXRQcm9wc1wiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9bC5kZWZhdWx0LkNoaWxkcmVuLm9ubHkodGhpcy5wcm9wcy5jaGlsZHJlbikucHJvcHM7cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sZSx7Zm91bmRhdGlvbjp0aGlzLnN0YXRlLmZvdW5kYXRpb24saGFuZGxlRm9jdXNDaGFuZ2U6ZnVuY3Rpb24oZSl7dC5zZXRTdGF0ZSh7aXNGb2N1c2VkOmV9KSx0LnN0YXRlLmZvdW5kYXRpb24mJihlP3Quc3RhdGUuZm91bmRhdGlvbi5hY3RpdmF0ZUZvY3VzKCk6dC5zdGF0ZS5mb3VuZGF0aW9uLmRlYWN0aXZhdGVGb2N1cygpKX0sc2V0RGlzYWJsZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuc2V0U3RhdGUoe2Rpc2FibGVkOmV9KX0sc2V0SW5wdXRJZDpmdW5jdGlvbihlKXtyZXR1cm4gdC5zZXRTdGF0ZSh7aW5wdXRJZDplfSl9LHN5bmNJbnB1dDpmdW5jdGlvbihlKXtyZXR1cm4gdC5pbnB1dENvbXBvbmVudF89ZX0saW5wdXRUeXBlOnRoaXMucHJvcHMudGV4dGFyZWE/XCJ0ZXh0YXJlYVwiOlwiaW5wdXRcIixwbGFjZWhvbGRlcjp0aGlzLnByb3BzLm5vTGFiZWw/dGhpcy5wcm9wcy5sYWJlbDpudWxsfSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiY2hhcmFjdGVyQ291bnRlclByb3BzXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaW5wdXRQcm9wcyxlPXQudmFsdWUsbj10Lm1heExlbmd0aDtyZXR1cm57Y291bnQ6ZT9lLmxlbmd0aDowLG1heExlbmd0aDpuP3BhcnNlSW50KG4pOjB9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMsZT10LmZ1bGxXaWR0aCxuPXQuaGVscGVyVGV4dCxpPXQuY2hhcmFjdGVyQ291bnRlcixyPXQub25MZWFkaW5nSWNvblNlbGVjdCxvPXQub25UcmFpbGluZ0ljb25TZWxlY3Qscz10LmxlYWRpbmdJY29uLHU9dC50cmFpbGluZ0ljb24sZD10LnRleHRhcmVhLGM9dC5ub0xhYmVsLHA9dGhpcy5zdGF0ZS5mb3VuZGF0aW9uO3JldHVybiBsLmRlZmF1bHQuY3JlYXRlRWxlbWVudChsLmRlZmF1bHQuRnJhZ21lbnQsbnVsbCxsLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLGEoe30sdGhpcy5vdGhlclByb3BzLHtjbGFzc05hbWU6dGhpcy5jbGFzc2VzLG9uQ2xpY2s6ZnVuY3Rpb24oKXtyZXR1cm4gcC5oYW5kbGVUZXh0RmllbGRJbnRlcmFjdGlvbigpfSxvbktleURvd246ZnVuY3Rpb24oKXtyZXR1cm4gcC5oYW5kbGVUZXh0RmllbGRJbnRlcmFjdGlvbigpfSxyZWY6dGhpcy50ZXh0RmllbGRFbGVtZW50LGtleTpcInRleHQtZmllbGQtY29udGFpbmVyXCJ9KSxzP3RoaXMucmVuZGVySWNvbihzLHIpOm51bGwsZCYmaSYmdGhpcy5yZW5kZXJDaGFyYWN0ZXJDb3VudGVyKGkpLHRoaXMucmVuZGVySW5wdXQoKSx0aGlzLm5vdGNoZWRPdXRsaW5lQWRhcHRlci5oYXNPdXRsaW5lKCk/dGhpcy5yZW5kZXJOb3RjaGVkT3V0bGluZSgpOmwuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGwuZGVmYXVsdC5GcmFnbWVudCxudWxsLHRoaXMubGFiZWxBZGFwdGVyLmhhc0xhYmVsKCkmJiFjP3RoaXMucmVuZGVyTGFiZWwoKTpudWxsLGR8fGU/bnVsbDp0aGlzLnJlbmRlckxpbmVSaXBwbGUoKSksdT90aGlzLnJlbmRlckljb24odSxvKTpudWxsKSxufHxpP3RoaXMucmVuZGVySGVscGVyTGluZShuLGkpOm51bGwpfSxlLnByb3RvdHlwZS5yZW5kZXJJbnB1dD1mdW5jdGlvbigpe3ZhciB0PWwuZGVmYXVsdC5DaGlsZHJlbi5vbmx5KHRoaXMucHJvcHMuY2hpbGRyZW4pO3JldHVybiBsLmRlZmF1bHQuY2xvbmVFbGVtZW50KHQsdGhpcy5pbnB1dFByb3BzKX0sZS5wcm90b3R5cGUucmVuZGVyTGFiZWw9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5wcm9wcyxuPWUubGFiZWwsaT1lLmZsb2F0aW5nTGFiZWxDbGFzc05hbWUscj10aGlzLnN0YXRlLmlucHV0SWQ7cmV0dXJuIGwuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGIuZGVmYXVsdCx7Y2xhc3NOYW1lOmksZmxvYXQ6dGhpcy5zdGF0ZS5sYWJlbElzRmxvYXRlZCxoYW5kbGVXaWR0aENoYW5nZTpmdW5jdGlvbihlKXtyZXR1cm4gdC5zZXRTdGF0ZSh7aW5pdGlhbExhYmVsV2lkdGg6ZX0pfSxyZWY6dGhpcy5mbG9hdGluZ0xhYmVsRWxlbWVudCxodG1sRm9yOnJ9LG4pfSxlLnByb3RvdHlwZS5yZW5kZXJMaW5lUmlwcGxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcy5saW5lUmlwcGxlQ2xhc3NOYW1lLGU9dGhpcy5zdGF0ZSxuPWUuYWN0aXZlTGluZVJpcHBsZSxpPWUubGluZVJpcHBsZUNlbnRlcjtyZXR1cm4gbC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXy5kZWZhdWx0LHtyaXBwbGVDZW50ZXI6aSxjbGFzc05hbWU6dCxhY3RpdmU6bn0pfSxlLnByb3RvdHlwZS5yZW5kZXJOb3RjaGVkT3V0bGluZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMubm90Y2hlZE91dGxpbmVDbGFzc05hbWUsZT10aGlzLnN0YXRlLG49ZS5ub3RjaGVkTGFiZWxXaWR0aCxpPWUub3V0bGluZUlzTm90Y2hlZDtyZXR1cm4gbC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoZy5kZWZhdWx0LHtjbGFzc05hbWU6dCxub3RjaFdpZHRoOm4sbm90Y2g6aX0sdGhpcy5sYWJlbEFkYXB0ZXIuaGFzTGFiZWwoKT90aGlzLnJlbmRlckxhYmVsKCk6bnVsbCl9LGUucHJvdG90eXBlLnJlbmRlckhlbHBlckxpbmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOnkuSEVMUEVSX0xJTkV9LHQmJnRoaXMucmVuZGVySGVscGVyVGV4dCh0KSxlJiYhdGhpcy5wcm9wcy50ZXh0YXJlYSYmdGhpcy5yZW5kZXJDaGFyYWN0ZXJDb3VudGVyKGUpKX0sZS5wcm90b3R5cGUucmVuZGVySGVscGVyVGV4dD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnN0YXRlLmlzVmFsaWQsbj1PYmplY3QuYXNzaWduKHtpc1ZhbGlkOmUsa2V5OlwidGV4dC1maWVsZC1oZWxwZXItdGV4dFwifSx0LnByb3BzKTtyZXR1cm4gbC5kZWZhdWx0LmNsb25lRWxlbWVudCh0LG4pfSxlLnByb3RvdHlwZS5yZW5kZXJJY29uPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5zdGF0ZS5kaXNhYmxlZDtyZXR1cm4gbC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQocC5kZWZhdWx0LHtkaXNhYmxlZDpuLG9uU2VsZWN0OmV9LHQpfSxlLnByb3RvdHlwZS5yZW5kZXJDaGFyYWN0ZXJDb3VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBsLmRlZmF1bHQuY2xvbmVFbGVtZW50KHQsT2JqZWN0LmFzc2lnbih0aGlzLmNoYXJhY3RlckNvdW50ZXJQcm9wcyx0LnByb3BzKSl9LGUuZGVmYXVsdFByb3BzPXtjbGFzc05hbWU6XCJcIixkZW5zZTohMSxmbG9hdGluZ0xhYmVsQ2xhc3NOYW1lOlwiXCIsZnVsbFdpZHRoOiExLGxpbmVSaXBwbGVDbGFzc05hbWU6XCJcIixub3RjaGVkT3V0bGluZUNsYXNzTmFtZTpcIlwiLG91dGxpbmVkOiExLHRleHRhcmVhOiExLG5vTGFiZWw6ITF9LGV9KGwuZGVmYXVsdC5Db21wb25lbnQpO2UuZGVmYXVsdD1tfSwxMzM6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9KSh0LGUpfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLGE9dGhpcyYmdGhpcy5fX2Fzc2lnbnx8ZnVuY3Rpb24oKXtyZXR1cm4oYT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgciBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmKHRbcl09ZVtyXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG89dGhpcyYmdGhpcy5fX3Jlc3R8fGZ1bmN0aW9uKHQsZSl7dmFyIG49e307Zm9yKHZhciBpIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsaSkmJmUuaW5kZXhPZihpKTwwJiYobltpXT10W2ldKTtpZihudWxsIT10JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj0wO2ZvcihpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7cjxpLmxlbmd0aDtyKyspZS5pbmRleE9mKGlbcl0pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LGlbcl0pJiYobltpW3JdXT10W2lbcl1dKX1yZXR1cm4gbn0scz10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbD1zKG4oMCkpLHU9cyhuKDEpKSxkPVtcInBhdHRlcm5cIixcIm1pblwiLFwibWF4XCIsXCJyZXF1aXJlZFwiLFwic3RlcFwiLFwibWlubGVuZ3RoXCIsXCJtYXhsZW5ndGhcIl0sYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBlLmlucHV0RWxlbWVudF89bC5kZWZhdWx0LmNyZWF0ZVJlZigpLGUuc3RhdGU9e3dhc1VzZXJUcmlnZ2VyZWRDaGFuZ2U6ITEsaXNNb3VudGVkOiExfSxlLmluaXRpYWxpemVDb21wb25lbnRXaXRoRm91bmRhdGlvbj1mdW5jdGlvbigpe3ZhciB0PWUucHJvcHMsbj10LmhhbmRsZUZvY3VzQ2hhbmdlLGk9dC5mb3VuZGF0aW9uLHI9dC5hdXRvRm9jdXMsYT10LmlzVmFsaWQ7ciYmbiYmbighMCksaSYmdm9pZCAwIT09YSYmKGkuc2V0VXNlTmF0aXZlVmFsaWRhdGlvbighMSksaS5zZXRWYWxpZChhKSl9LGUuaGFuZGxlRm9jdXM9ZnVuY3Rpb24odCl7dmFyIG49ZS5wcm9wcyxpPW4uaGFuZGxlRm9jdXNDaGFuZ2Uscj1uLm9uRm9jdXMsYT12b2lkIDA9PT1yP2Z1bmN0aW9uKCl7fTpyO2kmJmkoITApLGEodCl9LGUuaGFuZGxlQmx1cj1mdW5jdGlvbih0KXt2YXIgbj1lLnByb3BzLGk9bi5oYW5kbGVGb2N1c0NoYW5nZSxyPW4ub25CbHVyLGE9dm9pZCAwPT09cj9mdW5jdGlvbigpe306cjtpJiZpKCExKSxhKHQpfSxlLmhhbmRsZU1vdXNlRG93bj1mdW5jdGlvbih0KXt2YXIgbj1lLnByb3BzLGk9bi5mb3VuZGF0aW9uLHI9bi5vbk1vdXNlRG93bixhPXZvaWQgMD09PXI/ZnVuY3Rpb24oKXt9OnI7aSYmaS5zZXRUcmFuc2Zvcm1PcmlnaW4odC5uYXRpdmVFdmVudCksYSh0KX0sZS5oYW5kbGVUb3VjaFN0YXJ0PWZ1bmN0aW9uKHQpe3ZhciBuPWUucHJvcHMsaT1uLmZvdW5kYXRpb24scj1uLm9uVG91Y2hTdGFydCxhPXZvaWQgMD09PXI/ZnVuY3Rpb24oKXt9OnI7aSYmaS5zZXRUcmFuc2Zvcm1PcmlnaW4odC5uYXRpdmVFdmVudCksYSh0KX0sZS5oYW5kbGVDaGFuZ2U9ZnVuY3Rpb24odCl7dmFyIG49ZS5wcm9wcyxpPW4uZm91bmRhdGlvbixyPW4ub25DaGFuZ2UsYT12b2lkIDA9PT1yP2Z1bmN0aW9uKCl7fTpyO2kmJmkuYXV0b0NvbXBsZXRlRm9jdXMoKSxlLnNldFN0YXRlKHt3YXNVc2VyVHJpZ2dlcmVkQ2hhbmdlOiEwfSksYSh0KX0sZS5oYW5kbGVWYWxpZGF0aW9uQXR0cmlidXRlVXBkYXRlPWZ1bmN0aW9uKHQpe3ZhciBuPXQuZm91bmRhdGlvbjtkLnNvbWUoZnVuY3Rpb24oaSl7dmFyIHI7cmV0dXJuIHI9XCJtaW5sZW5ndGhcIj09PWk/XCJtaW5MZW5ndGhcIjpcIm1heGxlbmd0aFwiPT09aT9cIm1heExlbmd0aFwiOmksZS5wcm9wc1tyXSE9PXRbcl0mJihuLmhhbmRsZVZhbGlkYXRpb25BdHRyaWJ1dGVDaGFuZ2UoW2ldKSwhMCl9KX0sZS5pc0JhZElucHV0PWZ1bmN0aW9uKCl7dmFyIHQ9ZS5pbnB1dEVsZW1lbnQ7cmV0dXJuIHQmJnQudmFsaWRpdHkuYmFkSW5wdXR9LGUuaXNWYWxpZD1mdW5jdGlvbigpe3JldHVybiBlLmlucHV0RWxlbWVudCYmdm9pZCAwPT09ZS5wcm9wcy5pc1ZhbGlkP2UuaW5wdXRFbGVtZW50LnZhbGlkaXR5LnZhbGlkOmUucHJvcHMuaXNWYWxpZH0sZS5pc0Rpc2FibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISFlLnByb3BzLmRpc2FibGVkfSxlLmdldE1heExlbmd0aD1mdW5jdGlvbigpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiBlLnByb3BzLm1heExlbmd0aD9lLnByb3BzLm1heExlbmd0aDotMX0sZS5nZXRJbnB1dFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gU3RyaW5nKGUucHJvcHMuaW5wdXRUeXBlKX0sZS5nZXRWYWx1ZT1mdW5jdGlvbigpe3JldHVybiBlLnZhbHVlVG9TdHJpbmcoZS5wcm9wcy52YWx1ZSl9LGV9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMsZT10LmlkLG49dC5zeW5jSW5wdXQsaT10LmRpc2FibGVkLHI9dC52YWx1ZSxhPXQuc2V0SW5wdXRJZCxvPXQuc2V0RGlzYWJsZWQscz10LmZvdW5kYXRpb247biYmbih0aGlzKSxhJiZlJiZhKGUpLG8mJmkmJm8oITApLHImJnMmJnMuc2V0VmFsdWUodGhpcy52YWx1ZVRvU3RyaW5nKHIpKSx0aGlzLnNldFN0YXRlKHtpc01vdW50ZWQ6ITB9KX0sZS5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5wcm9wcyxpPW4uaWQscj1uLmZvdW5kYXRpb24sYT1uLnZhbHVlLG89bi5kaXNhYmxlZCxzPW4uaXNWYWxpZCxsPW4uc2V0SW5wdXRJZCx1PW4uc2V0RGlzYWJsZWQ7aWYoKCFlLmlzTW91bnRlZCYmdGhpcy5zdGF0ZS5pc01vdW50ZWQmJnRoaXMucHJvcHMuZm91bmRhdGlvbnx8dGhpcy5zdGF0ZS5pc01vdW50ZWQmJiF0LmZvdW5kYXRpb24mJnRoaXMucHJvcHMuZm91bmRhdGlvbikmJnRoaXMuaW5pdGlhbGl6ZUNvbXBvbmVudFdpdGhGb3VuZGF0aW9uKCksdGhpcy5oYW5kbGVWYWxpZGF0aW9uQXR0cmlidXRlVXBkYXRlKHQpLG8hPT10LmRpc2FibGVkJiYodSYmdShvKSxyJiZyLnNldERpc2FibGVkKCEhbykpLGkhPT10LmlkJiZsJiZsKGkpLGEhPT10LnZhbHVlKXt2YXIgZD10aGlzLnZhbHVlVG9TdHJpbmcoYSk7IXRoaXMuc3RhdGUud2FzVXNlclRyaWdnZXJlZENoYW5nZSYmciYmci5zZXRWYWx1ZShkKSx0aGlzLnNldFN0YXRlKHt3YXNVc2VyVHJpZ2dlcmVkQ2hhbmdlOiExfSl9cyE9PXQuaXNWYWxpZCYmciYmKHZvaWQgMD09PXM/ci5zZXRVc2VOYXRpdmVWYWxpZGF0aW9uKCEwKTooci5zZXRVc2VOYXRpdmVWYWxpZGF0aW9uKCExKSxyLnNldFZhbGlkKCEhcykpKX0sZS5wcm90b3R5cGUudmFsdWVUb1N0cmluZz1mdW5jdGlvbih0KXtyZXR1cm5cIm9iamVjdFwiPT10eXBlb2YgdD90LmpvaW4oXCJcIik6XCJudW1iZXJcIj09dHlwZW9mIHQ/dC50b1N0cmluZygpOnR8fFwiXCJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImNsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHUuZGVmYXVsdChcIm1kYy10ZXh0LWZpZWxkX19pbnB1dFwiLHRoaXMucHJvcHMuY2xhc3NOYW1lKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJpbnB1dEVsZW1lbnRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5wdXRFbGVtZW50Xy5jdXJyZW50fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMsZT10LmlucHV0VHlwZSxuPXQuZGlzYWJsZWQsaT0odC5jbGFzc05hbWUsdC5mb3VuZGF0aW9uLHQuc3luY0lucHV0LHQuaXNWYWxpZCx0LnZhbHVlKSxyPSh0LmhhbmRsZUZvY3VzQ2hhbmdlLHQuc2V0RGlzYWJsZWQsdC5zZXRJbnB1dElkLHQub25Gb2N1cyx0Lm9uQmx1cix0Lm9uTW91c2VEb3duLHQub25Ub3VjaFN0YXJ0LHQub25DaGFuZ2Usbyh0LFtcImlucHV0VHlwZVwiLFwiZGlzYWJsZWRcIixcImNsYXNzTmFtZVwiLFwiZm91bmRhdGlvblwiLFwic3luY0lucHV0XCIsXCJpc1ZhbGlkXCIsXCJ2YWx1ZVwiLFwiaGFuZGxlRm9jdXNDaGFuZ2VcIixcInNldERpc2FibGVkXCIsXCJzZXRJbnB1dElkXCIsXCJvbkZvY3VzXCIsXCJvbkJsdXJcIixcIm9uTW91c2VEb3duXCIsXCJvblRvdWNoU3RhcnRcIixcIm9uQ2hhbmdlXCJdKSkscz1PYmplY3QuYXNzaWduKHt9LHtvbkZvY3VzOnRoaXMuaGFuZGxlRm9jdXMsb25CbHVyOnRoaXMuaGFuZGxlQmx1cixvbk1vdXNlRG93bjp0aGlzLmhhbmRsZU1vdXNlRG93bixvblRvdWNoU3RhcnQ6dGhpcy5oYW5kbGVUb3VjaFN0YXJ0LG9uQ2hhbmdlOnRoaXMuaGFuZGxlQ2hhbmdlLGRpc2FibGVkOm4sdmFsdWU6aSxyZWY6dGhpcy5pbnB1dEVsZW1lbnRfLGNsYXNzTmFtZTp0aGlzLmNsYXNzZXN9LHIpO3JldHVyblwiaW5wdXRcIj09PWU/bC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLGEoe30scykpOmwuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIixhKHt9LHMpKX0sZS5kZWZhdWx0UHJvcHM9e2NsYXNzTmFtZTpcIlwiLGlucHV0VHlwZTpcImlucHV0XCIsZGlzYWJsZWQ6ITEsaWQ6XCJcIixzZXREaXNhYmxlZDpmdW5jdGlvbigpe30sc2V0SW5wdXRJZDpmdW5jdGlvbigpe30saGFuZGxlRm9jdXNDaGFuZ2U6ZnVuY3Rpb24oKXt9LHZhbHVlOlwiXCJ9LGV9KGwuZGVmYXVsdC5Db21wb25lbnQpO2UuZGVmYXVsdD1jfSwxMzQ6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9KSh0LGUpfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLGE9dGhpcyYmdGhpcy5fX2Fzc2lnbnx8ZnVuY3Rpb24oKXtyZXR1cm4oYT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgciBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmKHRbcl09ZVtyXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG89dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIHM9byhuKDApKSxsPW8obigxKSksdT1uKDE3MCksZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzLGUpfHx0aGlzO24uaGFuZGxlQ2xpY2s9ZnVuY3Rpb24odCl7cmV0dXJuIG4uZm91bmRhdGlvbi5oYW5kbGVJbnRlcmFjdGlvbih0Lm5hdGl2ZUV2ZW50KX0sbi5oYW5kbGVLZXlEb3duPWZ1bmN0aW9uKHQpe3JldHVybiBuLmZvdW5kYXRpb24uaGFuZGxlSW50ZXJhY3Rpb24odC5uYXRpdmVFdmVudCl9LG4uYWRkSWNvbkF0dHJzVG9DaGlsZHJlbj1mdW5jdGlvbigpe3ZhciB0PW4uc3RhdGUsZT10LnRhYmluZGV4LGk9dC5yb2xlLHI9cy5kZWZhdWx0LkNoaWxkcmVuLm9ubHkobi5wcm9wcy5jaGlsZHJlbiksYT1sLmRlZmF1bHQoXCJtZGMtdGV4dC1maWVsZF9faWNvblwiLHIucHJvcHMuY2xhc3NOYW1lKSxvPU9iamVjdC5hc3NpZ24oe30sci5wcm9wcyx7Y2xhc3NOYW1lOmEsb25DbGljazpuLmhhbmRsZUNsaWNrLG9uS2V5RG93bjpuLmhhbmRsZUtleURvd24sdGFiSW5kZXg6ZSxyb2xlOml9KTtyZXR1cm4gcy5kZWZhdWx0LmNsb25lRWxlbWVudChyLG8pfTt2YXIgaT1lLmNoaWxkcmVuLnByb3BzLnJvbGU7cmV0dXJuIG4uc3RhdGU9e3RhYmluZGV4Om4udGFiaW5kZXgscm9sZTppfSxufXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt0aGlzLmZvdW5kYXRpb249bmV3IHUuTURDVGV4dEZpZWxkSWNvbkZvdW5kYXRpb24odGhpcy5hZGFwdGVyKSx0aGlzLmZvdW5kYXRpb24uaW5pdCgpLHRoaXMucHJvcHMuZGlzYWJsZWQmJnRoaXMuZm91bmRhdGlvbi5zZXREaXNhYmxlZCghMCl9LGUucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbih0KXt0aGlzLnByb3BzLmRpc2FibGVkIT09dC5kaXNhYmxlZCYmdGhpcy5mb3VuZGF0aW9uLnNldERpc2FibGVkKCEhdGhpcy5wcm9wcy5kaXNhYmxlZCksdGhpcy5wcm9wcy5vblNlbGVjdCE9PXQub25TZWxlY3QmJnRoaXMuc2V0U3RhdGUoe3RhYmluZGV4OnRoaXMudGFiaW5kZXh9KX0sZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLmZvdW5kYXRpb24uZGVzdHJveSgpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJ0YWJpbmRleFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgdGhpcy5wcm9wcy5jaGlsZHJlbi5wcm9wcy50YWJJbmRleD90aGlzLnByb3BzLmNoaWxkcmVuLnByb3BzLnRhYkluZGV4OnRoaXMucHJvcHMub25TZWxlY3Q/MDotMX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJhZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJue2dldEF0dHI6ZnVuY3Rpb24oZSl7dmFyIG49dC5zdGF0ZVtlXTtyZXR1cm4gbnx8XCJudW1iZXJcIj09dHlwZW9mIG4mJiFpc05hTihuKT9uLnRvU3RyaW5nKCk6XCJcIn0sc2V0QXR0cjpmdW5jdGlvbihlLG4pe3JldHVybiB0LnNldFN0YXRlKGZ1bmN0aW9uKHQpe3ZhciBpO3JldHVybiBhKHt9LHQsKChpPXt9KVtlXT1cInRhYmluZGV4XCI9PT1lP051bWJlcihuKTpuLGkpKX0pfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0LnNldFN0YXRlKGZ1bmN0aW9uKHQpe3ZhciBuO3JldHVybiBhKHt9LHQsKChuPXt9KVtlXT1udWxsLG4pKX0pfSxub3RpZnlJY29uQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvcHMub25TZWxlY3QmJnQucHJvcHMub25TZWxlY3QoKX0sc2V0Q29udGVudDpmdW5jdGlvbigpe30scmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXI6ZnVuY3Rpb24oKXt9LGRlcmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXI6ZnVuY3Rpb24oKXt9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZGRJY29uQXR0cnNUb0NoaWxkcmVuKCl9LGUuZGVmYXVsdFByb3BzPXtkaXNhYmxlZDohMX0sZX0ocy5kZWZhdWx0LkNvbXBvbmVudCk7ZS5kZWZhdWx0PWR9LDEzNTpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGkscixhPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1mdW5jdGlvbih0LGUpe3JldHVybihpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSkodCxlKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxvPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKG89T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxzPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBsPXMobigwKSksdT1zKG4oMSkpLGQ9bigxNjkpLGM9ZC5NRENUZXh0RmllbGRIZWxwZXJUZXh0Rm91bmRhdGlvbi5jc3NDbGFzc2VzLHA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbixpPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiBpLnN0YXRlPSgobj17fSlbXCJhcmlhLWhpZGRlblwiXT1lW1wiYXJpYS1oaWRkZW5cIl0sbi5yb2xlPWUucm9sZSxuLmNsYXNzTGlzdD1uZXcgU2V0LG4pLGl9cmV0dXJuIGEoZSx0KSxlLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3RoaXMuZm91bmRhdGlvbj1uZXcgZC5NRENUZXh0RmllbGRIZWxwZXJUZXh0Rm91bmRhdGlvbih0aGlzLmFkYXB0ZXIpLHRoaXMuZm91bmRhdGlvbi5pbml0KCksdGhpcy5wcm9wcy5zaG93VG9TY3JlZW5SZWFkZXImJnRoaXMuZm91bmRhdGlvbi5zaG93VG9TY3JlZW5SZWFkZXIoKSx0aGlzLnByb3BzLmlzVmFsaWR8fHRoaXMuZm91bmRhdGlvbi5zZXRWYWxpZGl0eSghMSksdGhpcy5wcm9wcy5pc1ZhbGlkYXRpb25NZXNzYWdlJiZ0aGlzLmZvdW5kYXRpb24uc2V0VmFsaWRhdGlvbighMCl9LGUucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbih0KXt0aGlzLnByb3BzLnNob3dUb1NjcmVlblJlYWRlciE9PXQuc2hvd1RvU2NyZWVuUmVhZGVyJiZ0aGlzLnByb3BzLnNob3dUb1NjcmVlblJlYWRlciYmdGhpcy5mb3VuZGF0aW9uLnNob3dUb1NjcmVlblJlYWRlcigpLHRoaXMucHJvcHMuaXNWYWxpZCE9PXQuaXNWYWxpZCYmdGhpcy5mb3VuZGF0aW9uLnNldFZhbGlkaXR5KCEhdGhpcy5wcm9wcy5pc1ZhbGlkKSx0aGlzLnByb3BzLmlzVmFsaWRhdGlvbk1lc3NhZ2UhPT10LmlzVmFsaWRhdGlvbk1lc3NhZ2UmJnRoaXMucHJvcHMuaXNWYWxpZGF0aW9uTWVzc2FnZSYmdGhpcy5mb3VuZGF0aW9uLnNldFZhbGlkYXRpb24odGhpcy5wcm9wcy5pc1ZhbGlkYXRpb25NZXNzYWdlKX0sZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLmZvdW5kYXRpb24uZGVzdHJveSgpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJjbGFzc2VzXCIse2dldDpmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5wcm9wcyxuPWUuY2xhc3NOYW1lLGk9ZS5wZXJzaXN0ZW50LHI9ZS52YWxpZGF0aW9uO3JldHVybiB1LmRlZmF1bHQoYy5ST09ULG4sKCh0PXt9KVtjLkhFTFBFUl9URVhUX1BFUlNJU1RFTlRdPWksdFtjLkhFTFBFUl9URVhUX1ZBTElEQVRJT05fTVNHXT1yLHQpKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJhZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJue2FkZENsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnNldFN0YXRlKHtjbGFzc0xpc3Q6dC5zdGF0ZS5jbGFzc0xpc3QuYWRkKGUpfSl9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciBuPXQuc3RhdGUuY2xhc3NMaXN0O24uZGVsZXRlKGUpLHQuc2V0U3RhdGUoe2NsYXNzTGlzdDpufSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiB0LmNsYXNzZXMuc3BsaXQoXCIgXCIpLmluY2x1ZGVzKGUpfSxzZXRBdHRyOmZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuc2V0U3RhdGUoZnVuY3Rpb24odCl7dmFyIGk7cmV0dXJuIG8oe30sdCwoKGk9e30pW2VdPW4saSkpfSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuc2V0U3RhdGUoZnVuY3Rpb24odCl7dmFyIG47cmV0dXJuIG8oe30sdCwoKG49e30pW2VdPW51bGwsbikpfSl9LHNldENvbnRlbnQ6ZnVuY3Rpb24oKXt9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJwXCIse2NsYXNzTmFtZTp0aGlzLmNsYXNzZXMscm9sZTp0aGlzLnN0YXRlLnJvbGUsXCJhcmlhLWhpZGRlblwiOnRoaXMuc3RhdGVbXCJhcmlhLWhpZGRlblwiXX0sdGhpcy5wcm9wcy5jaGlsZHJlbil9LGUuZGVmYXVsdFByb3BzPSgocj17fSlbXCJhcmlhLWhpZGRlblwiXT0hMSxyLmNsYXNzTmFtZT1cIlwiLHIuaXNWYWxpZD0hMCxyLmlzVmFsaWRhdGlvbk1lc3NhZ2U9ITEsci5wZXJzaXN0ZW50PSExLHIuc2hvd1RvU2NyZWVuUmVhZGVyPSExLHIudmFsaWRhdGlvbj0hMSxyKSxlfShsLmRlZmF1bHQuQ29tcG9uZW50KTtlLmRlZmF1bHQ9cH0sMTM2OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1mdW5jdGlvbih0LGUpe3JldHVybihpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSkodCxlKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxhPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKGE9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxvPXRoaXMmJnRoaXMuX19yZXN0fHxmdW5jdGlvbih0LGUpe3ZhciBuPXt9O2Zvcih2YXIgaSBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGkpJiZlLmluZGV4T2YoaSk8MCYmKG5baV09dFtpXSk7aWYobnVsbCE9dCYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9MDtmb3IoaT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO3I8aS5sZW5ndGg7cisrKWUuaW5kZXhPZihpW3JdKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodCxpW3JdKSYmKG5baVtyXV09dFtpW3JdXSl9cmV0dXJuIG59LHM9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIGw9cyhuKDApKSx1PXMobigxKSksZD1uKDE2MyksYz1kLk1EQ1RleHRGaWVsZENoYXJhY3RlckNvdW50ZXJGb3VuZGF0aW9uLmNzc0NsYXNzZXMscD1cIiR7Y291bnR9XCIsZj1cIiR7bWF4TGVuZ3RofVwiLGg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5mb3VuZGF0aW9uPW5ldyBkLk1EQ1RleHRGaWVsZENoYXJhY3RlckNvdW50ZXJGb3VuZGF0aW9uKGUuYWRhcHRlciksZX1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7dGhpcy5mb3VuZGF0aW9uLmRlc3Ryb3koKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiYWRhcHRlclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57c2V0Q29udGVudDpmdW5jdGlvbigpe319fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnJlbmRlclRlbXBsYXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucHJvcHMsbj1lLmNvdW50LGk9dm9pZCAwPT09bj8wOm4scj1lLm1heExlbmd0aCxhPXZvaWQgMD09PXI/MDpyO3JldHVybiB0LnJlcGxhY2UocCxpLnRvU3RyaW5nKCkpLnJlcGxhY2UoZixhLnRvU3RyaW5nKCkpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJjbGFzc2VzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB1LmRlZmF1bHQoYy5ST09ULHRoaXMucHJvcHMuY2xhc3NOYW1lKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJvdGhlclByb3BzXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHM7dC5jbGFzc05hbWUsdC5jb3VudCx0Lm1heExlbmd0aCx0LnRlbXBsYXRlO3JldHVybiBvKHQsW1wiY2xhc3NOYW1lXCIsXCJjb3VudFwiLFwibWF4TGVuZ3RoXCIsXCJ0ZW1wbGF0ZVwiXSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcy50ZW1wbGF0ZTtyZXR1cm4gbC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIixhKHtjbGFzc05hbWU6dGhpcy5jbGFzc2VzfSx0aGlzLm90aGVyUHJvcHMpLHRoaXMucmVuZGVyVGVtcGxhdGUodHx8cCtcIiAvIFwiK2YpKX0sZX0obC5kZWZhdWx0LkNvbXBvbmVudCk7ZS5kZWZhdWx0PWh9LDE0OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImFcIixmdW5jdGlvbigpe3JldHVybiBpfSk7XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cbnZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2b2lkIDA9PT10JiYodD17fSksdGhpcy5hZGFwdGVyXz10fXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJzdHJpbmdzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwibnVtYmVyc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt9LHQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt9LHR9KCl9LDE2MzpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5yKGUpO3ZhciBpPW4oMTApLHI9bigxNCksYT17Uk9PVDpcIm1kYy10ZXh0LWZpZWxkLWNoYXJhY3Rlci1jb3VudGVyXCJ9LG89e1JPT1RfU0VMRUNUT1I6XCIuXCIrYS5ST09UfTtuLmQoZSxcIk1EQ1RleHRGaWVsZENoYXJhY3RlckNvdW50ZXJGb3VuZGF0aW9uXCIsZnVuY3Rpb24oKXtyZXR1cm4gc30pO1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG52YXIgcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3JldHVybiB0LmNhbGwodGhpcyxpLmEoe30sZS5kZWZhdWx0QWRhcHRlcixuKSl8fHRoaXN9cmV0dXJuIGkuYihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcInN0cmluZ3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJkZWZhdWx0QWRhcHRlclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57c2V0Q29udGVudDpmdW5jdGlvbigpe319fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnNldENvdW50ZXJWYWx1ZT1mdW5jdGlvbih0LGUpe3Q9TWF0aC5taW4odCxlKSx0aGlzLmFkYXB0ZXJfLnNldENvbnRlbnQodCtcIiAvIFwiK2UpfSxlfShyLmEpO2UuZGVmYXVsdD1zfSwxNjQ6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24ucihlKTt2YXIgaT1uKDEwKSxyPW4oMTQpLGE9e0FSSUFfQ09OVFJPTFM6XCJhcmlhLWNvbnRyb2xzXCIsSUNPTl9TRUxFQ1RPUjpcIi5tZGMtdGV4dC1maWVsZF9faWNvblwiLElOUFVUX1NFTEVDVE9SOlwiLm1kYy10ZXh0LWZpZWxkX19pbnB1dFwiLExBQkVMX1NFTEVDVE9SOlwiLm1kYy1mbG9hdGluZy1sYWJlbFwiLExJTkVfUklQUExFX1NFTEVDVE9SOlwiLm1kYy1saW5lLXJpcHBsZVwiLE9VVExJTkVfU0VMRUNUT1I6XCIubWRjLW5vdGNoZWQtb3V0bGluZVwifSxvPXtERU5TRTpcIm1kYy10ZXh0LWZpZWxkLS1kZW5zZVwiLERJU0FCTEVEOlwibWRjLXRleHQtZmllbGQtLWRpc2FibGVkXCIsRk9DVVNFRDpcIm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkXCIsRlVMTFdJRFRIOlwibWRjLXRleHQtZmllbGQtLWZ1bGx3aWR0aFwiLEhFTFBFUl9MSU5FOlwibWRjLXRleHQtZmllbGQtaGVscGVyLWxpbmVcIixJTlZBTElEOlwibWRjLXRleHQtZmllbGQtLWludmFsaWRcIixOT19MQUJFTDpcIm1kYy10ZXh0LWZpZWxkLS1uby1sYWJlbFwiLE9VVExJTkVEOlwibWRjLXRleHQtZmllbGQtLW91dGxpbmVkXCIsUk9PVDpcIm1kYy10ZXh0LWZpZWxkXCIsVEVYVEFSRUE6XCJtZGMtdGV4dC1maWVsZC0tdGV4dGFyZWFcIixXSVRIX0xFQURJTkdfSUNPTjpcIm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvblwiLFdJVEhfVFJBSUxJTkdfSUNPTjpcIm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb25cIn0scz17REVOU0VfTEFCRUxfU0NBTEU6LjkyMyxMQUJFTF9TQ0FMRTouNzV9LGw9W1wicGF0dGVyblwiLFwibWluXCIsXCJtYXhcIixcInJlcXVpcmVkXCIsXCJzdGVwXCIsXCJtaW5sZW5ndGhcIixcIm1heGxlbmd0aFwiXSx1PVtcImNvbG9yXCIsXCJkYXRlXCIsXCJkYXRldGltZS1sb2NhbFwiLFwibW9udGhcIixcInJhbmdlXCIsXCJ0aW1lXCIsXCJ3ZWVrXCJdO24uZChlLFwiTURDVGV4dEZpZWxkRm91bmRhdGlvblwiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIGQ9W1wibW91c2Vkb3duXCIsXCJ0b3VjaHN0YXJ0XCJdLGM9W1wiY2xpY2tcIixcImtleWRvd25cIl0scD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4scil7dm9pZCAwPT09ciYmKHI9e30pO3ZhciBhPXQuY2FsbCh0aGlzLGkuYSh7fSxlLmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpcztyZXR1cm4gYS5pc0ZvY3VzZWRfPSExLGEucmVjZWl2ZWRVc2VySW5wdXRfPSExLGEuaXNWYWxpZF89ITAsYS51c2VOYXRpdmVWYWxpZGF0aW9uXz0hMCxhLmhlbHBlclRleHRfPXIuaGVscGVyVGV4dCxhLmNoYXJhY3RlckNvdW50ZXJfPXIuY2hhcmFjdGVyQ291bnRlcixhLmxlYWRpbmdJY29uXz1yLmxlYWRpbmdJY29uLGEudHJhaWxpbmdJY29uXz1yLnRyYWlsaW5nSWNvbixhLmlucHV0Rm9jdXNIYW5kbGVyXz1mdW5jdGlvbigpe3JldHVybiBhLmFjdGl2YXRlRm9jdXMoKX0sYS5pbnB1dEJsdXJIYW5kbGVyXz1mdW5jdGlvbigpe3JldHVybiBhLmRlYWN0aXZhdGVGb2N1cygpfSxhLmlucHV0SW5wdXRIYW5kbGVyXz1mdW5jdGlvbigpe3JldHVybiBhLmhhbmRsZUlucHV0KCl9LGEuc2V0UG9pbnRlclhPZmZzZXRfPWZ1bmN0aW9uKHQpe3JldHVybiBhLnNldFRyYW5zZm9ybU9yaWdpbih0KX0sYS50ZXh0RmllbGRJbnRlcmFjdGlvbkhhbmRsZXJfPWZ1bmN0aW9uKCl7cmV0dXJuIGEuaGFuZGxlVGV4dEZpZWxkSW50ZXJhY3Rpb24oKX0sYS52YWxpZGF0aW9uQXR0cmlidXRlQ2hhbmdlSGFuZGxlcl89ZnVuY3Rpb24odCl7cmV0dXJuIGEuaGFuZGxlVmFsaWRhdGlvbkF0dHJpYnV0ZUNoYW5nZSh0KX0sYX1yZXR1cm4gaS5iKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJjc3NDbGFzc2VzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBvfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwic3RyaW5nc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIm51bWJlcnNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHN9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwic2hvdWxkQWx3YXlzRmxvYXRfXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0TmF0aXZlSW5wdXRfKCkudHlwZTtyZXR1cm4gdS5pbmRleE9mKHQpPj0wfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcInNob3VsZEZsb2F0XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNob3VsZEFsd2F5c0Zsb2F0X3x8dGhpcy5pc0ZvY3VzZWRffHxCb29sZWFuKHRoaXMuZ2V0VmFsdWUoKSl8fHRoaXMuaXNCYWRJbnB1dF8oKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJzaG91bGRTaGFrZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc0ZvY3VzZWRfJiYhdGhpcy5pc1ZhbGlkKCkmJkJvb2xlYW4odGhpcy5nZXRWYWx1ZSgpKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybnthZGRDbGFzczpmdW5jdGlvbigpe30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oKXt9LGhhc0NsYXNzOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHJlZ2lzdGVyVGV4dEZpZWxkSW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxkZXJlZ2lzdGVyVGV4dEZpZWxkSW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxyZWdpc3RlcklucHV0SW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxkZXJlZ2lzdGVySW5wdXRJbnRlcmFjdGlvbkhhbmRsZXI6ZnVuY3Rpb24oKXt9LHJlZ2lzdGVyVmFsaWRhdGlvbkF0dHJpYnV0ZUNoYW5nZUhhbmRsZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXt9KX0sZGVyZWdpc3RlclZhbGlkYXRpb25BdHRyaWJ1dGVDaGFuZ2VIYW5kbGVyOmZ1bmN0aW9uKCl7fSxnZXROYXRpdmVJbnB1dDpmdW5jdGlvbigpe3JldHVybiBudWxsfSxpc0ZvY3VzZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sYWN0aXZhdGVMaW5lUmlwcGxlOmZ1bmN0aW9uKCl7fSxkZWFjdGl2YXRlTGluZVJpcHBsZTpmdW5jdGlvbigpe30sc2V0TGluZVJpcHBsZVRyYW5zZm9ybU9yaWdpbjpmdW5jdGlvbigpe30sc2hha2VMYWJlbDpmdW5jdGlvbigpe30sZmxvYXRMYWJlbDpmdW5jdGlvbigpe30saGFzTGFiZWw6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZ2V0TGFiZWxXaWR0aDpmdW5jdGlvbigpe3JldHVybiAwfSxoYXNPdXRsaW5lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LG5vdGNoT3V0bGluZTpmdW5jdGlvbigpe30sY2xvc2VPdXRsaW5lOmZ1bmN0aW9uKCl7fX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5hZGFwdGVyXy5pc0ZvY3VzZWQoKT90aGlzLmlucHV0Rm9jdXNIYW5kbGVyXygpOnRoaXMuYWRhcHRlcl8uaGFzTGFiZWwoKSYmdGhpcy5zaG91bGRGbG9hdCYmKHRoaXMubm90Y2hPdXRsaW5lKCEwKSx0aGlzLmFkYXB0ZXJfLmZsb2F0TGFiZWwoITApKSx0aGlzLmFkYXB0ZXJfLnJlZ2lzdGVySW5wdXRJbnRlcmFjdGlvbkhhbmRsZXIoXCJmb2N1c1wiLHRoaXMuaW5wdXRGb2N1c0hhbmRsZXJfKSx0aGlzLmFkYXB0ZXJfLnJlZ2lzdGVySW5wdXRJbnRlcmFjdGlvbkhhbmRsZXIoXCJibHVyXCIsdGhpcy5pbnB1dEJsdXJIYW5kbGVyXyksdGhpcy5hZGFwdGVyXy5yZWdpc3RlcklucHV0SW50ZXJhY3Rpb25IYW5kbGVyKFwiaW5wdXRcIix0aGlzLmlucHV0SW5wdXRIYW5kbGVyXyksZC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuYWRhcHRlcl8ucmVnaXN0ZXJJbnB1dEludGVyYWN0aW9uSGFuZGxlcihlLHQuc2V0UG9pbnRlclhPZmZzZXRfKX0pLGMuZm9yRWFjaChmdW5jdGlvbihlKXt0LmFkYXB0ZXJfLnJlZ2lzdGVyVGV4dEZpZWxkSW50ZXJhY3Rpb25IYW5kbGVyKGUsdC50ZXh0RmllbGRJbnRlcmFjdGlvbkhhbmRsZXJfKX0pLHRoaXMudmFsaWRhdGlvbk9ic2VydmVyXz10aGlzLmFkYXB0ZXJfLnJlZ2lzdGVyVmFsaWRhdGlvbkF0dHJpYnV0ZUNoYW5nZUhhbmRsZXIodGhpcy52YWxpZGF0aW9uQXR0cmlidXRlQ2hhbmdlSGFuZGxlcl8pLHRoaXMuc2V0Q2hhcmFjdGVyQ291bnRlcl8odGhpcy5nZXRWYWx1ZSgpLmxlbmd0aCl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuYWRhcHRlcl8uZGVyZWdpc3RlcklucHV0SW50ZXJhY3Rpb25IYW5kbGVyKFwiZm9jdXNcIix0aGlzLmlucHV0Rm9jdXNIYW5kbGVyXyksdGhpcy5hZGFwdGVyXy5kZXJlZ2lzdGVySW5wdXRJbnRlcmFjdGlvbkhhbmRsZXIoXCJibHVyXCIsdGhpcy5pbnB1dEJsdXJIYW5kbGVyXyksdGhpcy5hZGFwdGVyXy5kZXJlZ2lzdGVySW5wdXRJbnRlcmFjdGlvbkhhbmRsZXIoXCJpbnB1dFwiLHRoaXMuaW5wdXRJbnB1dEhhbmRsZXJfKSxkLmZvckVhY2goZnVuY3Rpb24oZSl7dC5hZGFwdGVyXy5kZXJlZ2lzdGVySW5wdXRJbnRlcmFjdGlvbkhhbmRsZXIoZSx0LnNldFBvaW50ZXJYT2Zmc2V0Xyl9KSxjLmZvckVhY2goZnVuY3Rpb24oZSl7dC5hZGFwdGVyXy5kZXJlZ2lzdGVyVGV4dEZpZWxkSW50ZXJhY3Rpb25IYW5kbGVyKGUsdC50ZXh0RmllbGRJbnRlcmFjdGlvbkhhbmRsZXJfKX0pLHRoaXMuYWRhcHRlcl8uZGVyZWdpc3RlclZhbGlkYXRpb25BdHRyaWJ1dGVDaGFuZ2VIYW5kbGVyKHRoaXMudmFsaWRhdGlvbk9ic2VydmVyXyl9LGUucHJvdG90eXBlLmhhbmRsZVRleHRGaWVsZEludGVyYWN0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5hZGFwdGVyXy5nZXROYXRpdmVJbnB1dCgpO3QmJnQuZGlzYWJsZWR8fCh0aGlzLnJlY2VpdmVkVXNlcklucHV0Xz0hMCl9LGUucHJvdG90eXBlLmhhbmRsZVZhbGlkYXRpb25BdHRyaWJ1dGVDaGFuZ2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0LnNvbWUoZnVuY3Rpb24odCl7cmV0dXJuIGwuaW5kZXhPZih0KT4tMSYmKGUuc3R5bGVWYWxpZGl0eV8oITApLCEwKX0pLHQuaW5kZXhPZihcIm1heGxlbmd0aFwiKT4tMSYmdGhpcy5zZXRDaGFyYWN0ZXJDb3VudGVyXyh0aGlzLmdldFZhbHVlKCkubGVuZ3RoKX0sZS5wcm90b3R5cGUubm90Y2hPdXRsaW5lPWZ1bmN0aW9uKHQpe2lmKHRoaXMuYWRhcHRlcl8uaGFzT3V0bGluZSgpKWlmKHQpe3ZhciBlPXRoaXMuYWRhcHRlcl8uaGFzQ2xhc3Moby5ERU5TRSk/cy5ERU5TRV9MQUJFTF9TQ0FMRTpzLkxBQkVMX1NDQUxFLG49dGhpcy5hZGFwdGVyXy5nZXRMYWJlbFdpZHRoKCkqZTt0aGlzLmFkYXB0ZXJfLm5vdGNoT3V0bGluZShuKX1lbHNlIHRoaXMuYWRhcHRlcl8uY2xvc2VPdXRsaW5lKCl9LGUucHJvdG90eXBlLmFjdGl2YXRlRm9jdXM9ZnVuY3Rpb24oKXt0aGlzLmlzRm9jdXNlZF89ITAsdGhpcy5zdHlsZUZvY3VzZWRfKHRoaXMuaXNGb2N1c2VkXyksdGhpcy5hZGFwdGVyXy5hY3RpdmF0ZUxpbmVSaXBwbGUoKSx0aGlzLmFkYXB0ZXJfLmhhc0xhYmVsKCkmJih0aGlzLm5vdGNoT3V0bGluZSh0aGlzLnNob3VsZEZsb2F0KSx0aGlzLmFkYXB0ZXJfLmZsb2F0TGFiZWwodGhpcy5zaG91bGRGbG9hdCksdGhpcy5hZGFwdGVyXy5zaGFrZUxhYmVsKHRoaXMuc2hvdWxkU2hha2UpKSx0aGlzLmhlbHBlclRleHRfJiZ0aGlzLmhlbHBlclRleHRfLnNob3dUb1NjcmVlblJlYWRlcigpfSxlLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1PcmlnaW49ZnVuY3Rpb24odCl7dmFyIGU9dC50b3VjaGVzLG49ZT9lWzBdOnQsaT1uLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxyPW4uY2xpZW50WC1pLmxlZnQ7dGhpcy5hZGFwdGVyXy5zZXRMaW5lUmlwcGxlVHJhbnNmb3JtT3JpZ2luKHIpfSxlLnByb3RvdHlwZS5oYW5kbGVJbnB1dD1mdW5jdGlvbigpe3RoaXMuYXV0b0NvbXBsZXRlRm9jdXMoKSx0aGlzLnNldENoYXJhY3RlckNvdW50ZXJfKHRoaXMuZ2V0VmFsdWUoKS5sZW5ndGgpfSxlLnByb3RvdHlwZS5hdXRvQ29tcGxldGVGb2N1cz1mdW5jdGlvbigpe3RoaXMucmVjZWl2ZWRVc2VySW5wdXRffHx0aGlzLmFjdGl2YXRlRm9jdXMoKX0sZS5wcm90b3R5cGUuZGVhY3RpdmF0ZUZvY3VzPWZ1bmN0aW9uKCl7dGhpcy5pc0ZvY3VzZWRfPSExLHRoaXMuYWRhcHRlcl8uZGVhY3RpdmF0ZUxpbmVSaXBwbGUoKTt2YXIgdD10aGlzLmlzVmFsaWQoKTt0aGlzLnN0eWxlVmFsaWRpdHlfKHQpLHRoaXMuc3R5bGVGb2N1c2VkXyh0aGlzLmlzRm9jdXNlZF8pLHRoaXMuYWRhcHRlcl8uaGFzTGFiZWwoKSYmKHRoaXMubm90Y2hPdXRsaW5lKHRoaXMuc2hvdWxkRmxvYXQpLHRoaXMuYWRhcHRlcl8uZmxvYXRMYWJlbCh0aGlzLnNob3VsZEZsb2F0KSx0aGlzLmFkYXB0ZXJfLnNoYWtlTGFiZWwodGhpcy5zaG91bGRTaGFrZSkpLHRoaXMuc2hvdWxkRmxvYXR8fCh0aGlzLnJlY2VpdmVkVXNlcklucHV0Xz0hMSl9LGUucHJvdG90eXBlLmdldFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TmF0aXZlSW5wdXRfKCkudmFsdWV9LGUucHJvdG90eXBlLnNldFZhbHVlPWZ1bmN0aW9uKHQpe3RoaXMuZ2V0VmFsdWUoKSE9PXQmJih0aGlzLmdldE5hdGl2ZUlucHV0XygpLnZhbHVlPXQpLHRoaXMuc2V0Q2hhcmFjdGVyQ291bnRlcl8odC5sZW5ndGgpO3ZhciBlPXRoaXMuaXNWYWxpZCgpO3RoaXMuc3R5bGVWYWxpZGl0eV8oZSksdGhpcy5hZGFwdGVyXy5oYXNMYWJlbCgpJiYodGhpcy5ub3RjaE91dGxpbmUodGhpcy5zaG91bGRGbG9hdCksdGhpcy5hZGFwdGVyXy5mbG9hdExhYmVsKHRoaXMuc2hvdWxkRmxvYXQpLHRoaXMuYWRhcHRlcl8uc2hha2VMYWJlbCh0aGlzLnNob3VsZFNoYWtlKSl9LGUucHJvdG90eXBlLmlzVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51c2VOYXRpdmVWYWxpZGF0aW9uXz90aGlzLmlzTmF0aXZlSW5wdXRWYWxpZF8oKTp0aGlzLmlzVmFsaWRffSxlLnByb3RvdHlwZS5zZXRWYWxpZD1mdW5jdGlvbih0KXt0aGlzLmlzVmFsaWRfPXQsdGhpcy5zdHlsZVZhbGlkaXR5Xyh0KTt2YXIgZT0hdCYmIXRoaXMuaXNGb2N1c2VkXzt0aGlzLmFkYXB0ZXJfLmhhc0xhYmVsKCkmJnRoaXMuYWRhcHRlcl8uc2hha2VMYWJlbChlKX0sZS5wcm90b3R5cGUuc2V0VXNlTmF0aXZlVmFsaWRhdGlvbj1mdW5jdGlvbih0KXt0aGlzLnVzZU5hdGl2ZVZhbGlkYXRpb25fPXR9LGUucHJvdG90eXBlLmlzRGlzYWJsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXROYXRpdmVJbnB1dF8oKS5kaXNhYmxlZH0sZS5wcm90b3R5cGUuc2V0RGlzYWJsZWQ9ZnVuY3Rpb24odCl7dGhpcy5nZXROYXRpdmVJbnB1dF8oKS5kaXNhYmxlZD10LHRoaXMuc3R5bGVEaXNhYmxlZF8odCl9LGUucHJvdG90eXBlLnNldEhlbHBlclRleHRDb250ZW50PWZ1bmN0aW9uKHQpe3RoaXMuaGVscGVyVGV4dF8mJnRoaXMuaGVscGVyVGV4dF8uc2V0Q29udGVudCh0KX0sZS5wcm90b3R5cGUuc2V0TGVhZGluZ0ljb25BcmlhTGFiZWw9ZnVuY3Rpb24odCl7dGhpcy5sZWFkaW5nSWNvbl8mJnRoaXMubGVhZGluZ0ljb25fLnNldEFyaWFMYWJlbCh0KX0sZS5wcm90b3R5cGUuc2V0TGVhZGluZ0ljb25Db250ZW50PWZ1bmN0aW9uKHQpe3RoaXMubGVhZGluZ0ljb25fJiZ0aGlzLmxlYWRpbmdJY29uXy5zZXRDb250ZW50KHQpfSxlLnByb3RvdHlwZS5zZXRUcmFpbGluZ0ljb25BcmlhTGFiZWw9ZnVuY3Rpb24odCl7dGhpcy50cmFpbGluZ0ljb25fJiZ0aGlzLnRyYWlsaW5nSWNvbl8uc2V0QXJpYUxhYmVsKHQpfSxlLnByb3RvdHlwZS5zZXRUcmFpbGluZ0ljb25Db250ZW50PWZ1bmN0aW9uKHQpe3RoaXMudHJhaWxpbmdJY29uXyYmdGhpcy50cmFpbGluZ0ljb25fLnNldENvbnRlbnQodCl9LGUucHJvdG90eXBlLnNldENoYXJhY3RlckNvdW50ZXJfPWZ1bmN0aW9uKHQpe2lmKHRoaXMuY2hhcmFjdGVyQ291bnRlcl8pe3ZhciBlPXRoaXMuZ2V0TmF0aXZlSW5wdXRfKCkubWF4TGVuZ3RoO2lmKC0xPT09ZSl0aHJvdyBuZXcgRXJyb3IoXCJNRENUZXh0RmllbGRGb3VuZGF0aW9uOiBFeHBlY3RlZCBtYXhsZW5ndGggaHRtbCBwcm9wZXJ0eSBvbiB0ZXh0IGlucHV0IG9yIHRleHRhcmVhLlwiKTt0aGlzLmNoYXJhY3RlckNvdW50ZXJfLnNldENvdW50ZXJWYWx1ZSh0LGUpfX0sZS5wcm90b3R5cGUuaXNCYWRJbnB1dF89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXROYXRpdmVJbnB1dF8oKS52YWxpZGl0eS5iYWRJbnB1dHx8ITF9LGUucHJvdG90eXBlLmlzTmF0aXZlSW5wdXRWYWxpZF89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXROYXRpdmVJbnB1dF8oKS52YWxpZGl0eS52YWxpZH0sZS5wcm90b3R5cGUuc3R5bGVWYWxpZGl0eV89ZnVuY3Rpb24odCl7dmFyIG49ZS5jc3NDbGFzc2VzLklOVkFMSUQ7dD90aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKG4pOnRoaXMuYWRhcHRlcl8uYWRkQ2xhc3MobiksdGhpcy5oZWxwZXJUZXh0XyYmdGhpcy5oZWxwZXJUZXh0Xy5zZXRWYWxpZGl0eSh0KX0sZS5wcm90b3R5cGUuc3R5bGVGb2N1c2VkXz1mdW5jdGlvbih0KXt2YXIgbj1lLmNzc0NsYXNzZXMuRk9DVVNFRDt0P3RoaXMuYWRhcHRlcl8uYWRkQ2xhc3Mobik6dGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyhuKX0sZS5wcm90b3R5cGUuc3R5bGVEaXNhYmxlZF89ZnVuY3Rpb24odCl7dmFyIG49ZS5jc3NDbGFzc2VzLGk9bi5ESVNBQkxFRCxyPW4uSU5WQUxJRDt0Pyh0aGlzLmFkYXB0ZXJfLmFkZENsYXNzKGkpLHRoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MocikpOnRoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoaSksdGhpcy5sZWFkaW5nSWNvbl8mJnRoaXMubGVhZGluZ0ljb25fLnNldERpc2FibGVkKHQpLHRoaXMudHJhaWxpbmdJY29uXyYmdGhpcy50cmFpbGluZ0ljb25fLnNldERpc2FibGVkKHQpfSxlLnByb3RvdHlwZS5nZXROYXRpdmVJbnB1dF89ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5hZGFwdGVyXz90aGlzLmFkYXB0ZXJfLmdldE5hdGl2ZUlucHV0KCk6bnVsbCl8fHtkaXNhYmxlZDohMSxtYXhMZW5ndGg6LTEsdHlwZTpcImlucHV0XCIsdmFsaWRpdHk6e2JhZElucHV0OiExLHZhbGlkOiEwfSx2YWx1ZTpcIlwifX0sZX0oci5hKTtlLmRlZmF1bHQ9cH0sMTY5OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSk7dmFyIGk9bigxMCkscj1uKDE0KSxhPXtIRUxQRVJfVEVYVF9QRVJTSVNURU5UOlwibWRjLXRleHQtZmllbGQtaGVscGVyLXRleHQtLXBlcnNpc3RlbnRcIixIRUxQRVJfVEVYVF9WQUxJREFUSU9OX01TRzpcIm1kYy10ZXh0LWZpZWxkLWhlbHBlci10ZXh0LS12YWxpZGF0aW9uLW1zZ1wiLFJPT1Q6XCJtZGMtdGV4dC1maWVsZC1oZWxwZXItdGV4dFwifSxvPXtBUklBX0hJRERFTjpcImFyaWEtaGlkZGVuXCIsUk9MRTpcInJvbGVcIixST09UX1NFTEVDVE9SOlwiLlwiK2EuUk9PVH07bi5kKGUsXCJNRENUZXh0RmllbGRIZWxwZXJUZXh0Rm91bmRhdGlvblwiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIHM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXtyZXR1cm4gdC5jYWxsKHRoaXMsaS5hKHt9LGUuZGVmYXVsdEFkYXB0ZXIsbikpfHx0aGlzfXJldHVybiBpLmIoZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzdHJpbmdzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBvfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2FkZENsYXNzOmZ1bmN0aW9uKCl7fSxyZW1vdmVDbGFzczpmdW5jdGlvbigpe30saGFzQ2xhc3M6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sc2V0QXR0cjpmdW5jdGlvbigpe30scmVtb3ZlQXR0cjpmdW5jdGlvbigpe30sc2V0Q29udGVudDpmdW5jdGlvbigpe319fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnNldENvbnRlbnQ9ZnVuY3Rpb24odCl7dGhpcy5hZGFwdGVyXy5zZXRDb250ZW50KHQpfSxlLnByb3RvdHlwZS5zZXRQZXJzaXN0ZW50PWZ1bmN0aW9uKHQpe3Q/dGhpcy5hZGFwdGVyXy5hZGRDbGFzcyhhLkhFTFBFUl9URVhUX1BFUlNJU1RFTlQpOnRoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoYS5IRUxQRVJfVEVYVF9QRVJTSVNURU5UKX0sZS5wcm90b3R5cGUuc2V0VmFsaWRhdGlvbj1mdW5jdGlvbih0KXt0P3RoaXMuYWRhcHRlcl8uYWRkQ2xhc3MoYS5IRUxQRVJfVEVYVF9WQUxJREFUSU9OX01TRyk6dGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyhhLkhFTFBFUl9URVhUX1ZBTElEQVRJT05fTVNHKX0sZS5wcm90b3R5cGUuc2hvd1RvU2NyZWVuUmVhZGVyPWZ1bmN0aW9uKCl7dGhpcy5hZGFwdGVyXy5yZW1vdmVBdHRyKG8uQVJJQV9ISURERU4pfSxlLnByb3RvdHlwZS5zZXRWYWxpZGl0eT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmFkYXB0ZXJfLmhhc0NsYXNzKGEuSEVMUEVSX1RFWFRfUEVSU0lTVEVOVCksbj10aGlzLmFkYXB0ZXJfLmhhc0NsYXNzKGEuSEVMUEVSX1RFWFRfVkFMSURBVElPTl9NU0cpJiYhdDtuP3RoaXMuYWRhcHRlcl8uc2V0QXR0cihvLlJPTEUsXCJhbGVydFwiKTp0aGlzLmFkYXB0ZXJfLnJlbW92ZUF0dHIoby5ST0xFKSxlfHxufHx0aGlzLmhpZGVfKCl9LGUucHJvdG90eXBlLmhpZGVfPWZ1bmN0aW9uKCl7dGhpcy5hZGFwdGVyXy5zZXRBdHRyKG8uQVJJQV9ISURERU4sXCJ0cnVlXCIpfSxlfShyLmEpO2UuZGVmYXVsdD1zfSwxNzA6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24ucihlKTt2YXIgaT1uKDEwKSxyPW4oMTQpLGE9e0lDT05fRVZFTlQ6XCJNRENUZXh0RmllbGQ6aWNvblwiLElDT05fUk9MRTpcImJ1dHRvblwifSxvPXtST09UOlwibWRjLXRleHQtZmllbGRfX2ljb25cIn07bi5kKGUsXCJNRENUZXh0RmllbGRJY29uRm91bmRhdGlvblwiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIHM9W1wiY2xpY2tcIixcImtleWRvd25cIl0sbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciByPXQuY2FsbCh0aGlzLGkuYSh7fSxlLmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpcztyZXR1cm4gci5zYXZlZFRhYkluZGV4Xz1udWxsLHIuaW50ZXJhY3Rpb25IYW5kbGVyXz1mdW5jdGlvbih0KXtyZXR1cm4gci5oYW5kbGVJbnRlcmFjdGlvbih0KX0scn1yZXR1cm4gaS5iKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzdHJpbmdzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBhfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybntnZXRBdHRyOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LHNldEF0dHI6ZnVuY3Rpb24oKXt9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oKXt9LHNldENvbnRlbnQ6ZnVuY3Rpb24oKXt9LHJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxkZXJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxub3RpZnlJY29uQWN0aW9uOmZ1bmN0aW9uKCl7fX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5zYXZlZFRhYkluZGV4Xz10aGlzLmFkYXB0ZXJfLmdldEF0dHIoXCJ0YWJpbmRleFwiKSxzLmZvckVhY2goZnVuY3Rpb24oZSl7dC5hZGFwdGVyXy5yZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcihlLHQuaW50ZXJhY3Rpb25IYW5kbGVyXyl9KX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuYWRhcHRlcl8uZGVyZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcihlLHQuaW50ZXJhY3Rpb25IYW5kbGVyXyl9KX0sZS5wcm90b3R5cGUuc2V0RGlzYWJsZWQ9ZnVuY3Rpb24odCl7dGhpcy5zYXZlZFRhYkluZGV4XyYmKHQ/KHRoaXMuYWRhcHRlcl8uc2V0QXR0cihcInRhYmluZGV4XCIsXCItMVwiKSx0aGlzLmFkYXB0ZXJfLnJlbW92ZUF0dHIoXCJyb2xlXCIpKToodGhpcy5hZGFwdGVyXy5zZXRBdHRyKFwidGFiaW5kZXhcIix0aGlzLnNhdmVkVGFiSW5kZXhfKSx0aGlzLmFkYXB0ZXJfLnNldEF0dHIoXCJyb2xlXCIsYS5JQ09OX1JPTEUpKSl9LGUucHJvdG90eXBlLnNldEFyaWFMYWJlbD1mdW5jdGlvbih0KXt0aGlzLmFkYXB0ZXJfLnNldEF0dHIoXCJhcmlhLWxhYmVsXCIsdCl9LGUucHJvdG90eXBlLnNldENvbnRlbnQ9ZnVuY3Rpb24odCl7dGhpcy5hZGFwdGVyXy5zZXRDb250ZW50KHQpfSxlLnByb3RvdHlwZS5oYW5kbGVJbnRlcmFjdGlvbj1mdW5jdGlvbih0KXt2YXIgZT1cIkVudGVyXCI9PT10LmtleXx8MTM9PT10LmtleUNvZGU7KFwiY2xpY2tcIj09PXQudHlwZXx8ZSkmJnRoaXMuYWRhcHRlcl8ubm90aWZ5SWNvbkFjdGlvbigpfSxlfShyLmEpO2UuZGVmYXVsdD1sfSwzMzpmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1ufSwzNDpmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1pfSwzNTpmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1yfX0pfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZXh0LWZpZWxkLmpzLm1hcCIsIlxudmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdGV4dC1maWVsZC5jc3NcIik7XG5cbmlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXG52YXIgdHJhbnNmb3JtO1xudmFyIGluc2VydEludG87XG5cblxuXG52YXIgb3B0aW9ucyA9IHtcImhtclwiOnRydWV9XG5cbm9wdGlvbnMudHJhbnNmb3JtID0gdHJhbnNmb3JtXG5vcHRpb25zLmluc2VydEludG8gPSB1bmRlZmluZWQ7XG5cbnZhciB1cGRhdGUgPSByZXF1aXJlKFwiIS4uLy4uLy4uL3N0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzLmpzXCIpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5pZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2FscztcblxuaWYobW9kdWxlLmhvdCkge1xuXHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3RleHQtZmllbGQuY3NzXCIsIGZ1bmN0aW9uKCkge1xuXHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3RleHQtZmllbGQuY3NzXCIpO1xuXG5cdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cblx0XHR2YXIgbG9jYWxzID0gKGZ1bmN0aW9uKGEsIGIpIHtcblx0XHRcdHZhciBrZXksIGlkeCA9IDA7XG5cblx0XHRcdGZvcihrZXkgaW4gYSkge1xuXHRcdFx0XHRpZighYiB8fCBhW2tleV0gIT09IGJba2V5XSkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRpZHgrKztcblx0XHRcdH1cblxuXHRcdFx0Zm9yKGtleSBpbiBiKSBpZHgtLTtcblxuXHRcdFx0cmV0dXJuIGlkeCA9PT0gMDtcblx0XHR9KGNvbnRlbnQubG9jYWxzLCBuZXdDb250ZW50LmxvY2FscykpO1xuXG5cdFx0aWYoIWxvY2FscykgdGhyb3cgbmV3IEVycm9yKCdBYm9ydGluZyBDU1MgSE1SIGR1ZSB0byBjaGFuZ2VkIGNzcy1tb2R1bGVzIGxvY2Fscy4nKTtcblxuXHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0fSk7XG5cblx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG59IiwidmFyIGNvbm5lY3Rpb25TdG9yZSA9IG5ldyBXZWFrTWFwKCk7XG52YXIgSVRFUkFUSU9OX0tFWSA9IFN5bWJvbCgnaXRlcmF0aW9uIGtleScpO1xuXG5mdW5jdGlvbiBzdG9yZU9ic2VydmFibGUob2JqKSB7XG4gIC8vIHRoaXMgd2lsbCBiZSB1c2VkIHRvIHNhdmUgKG9iai5rZXkgLT4gcmVhY3Rpb24pIGNvbm5lY3Rpb25zIGxhdGVyXG4gIGNvbm5lY3Rpb25TdG9yZS5zZXQob2JqLCBuZXcgTWFwKCkpO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlclJlYWN0aW9uRm9yT3BlcmF0aW9uKHJlYWN0aW9uLCByZWYpIHtcbiAgdmFyIHRhcmdldCA9IHJlZi50YXJnZXQ7XG4gIHZhciBrZXkgPSByZWYua2V5O1xuICB2YXIgdHlwZSA9IHJlZi50eXBlO1xuXG4gIGlmICh0eXBlID09PSAnaXRlcmF0ZScpIHtcbiAgICBrZXkgPSBJVEVSQVRJT05fS0VZO1xuICB9XG5cbiAgdmFyIHJlYWN0aW9uc0Zvck9iaiA9IGNvbm5lY3Rpb25TdG9yZS5nZXQodGFyZ2V0KTtcbiAgdmFyIHJlYWN0aW9uc0ZvcktleSA9IHJlYWN0aW9uc0Zvck9iai5nZXQoa2V5KTtcbiAgaWYgKCFyZWFjdGlvbnNGb3JLZXkpIHtcbiAgICByZWFjdGlvbnNGb3JLZXkgPSBuZXcgU2V0KCk7XG4gICAgcmVhY3Rpb25zRm9yT2JqLnNldChrZXksIHJlYWN0aW9uc0ZvcktleSk7XG4gIH1cbiAgLy8gc2F2ZSB0aGUgZmFjdCB0aGF0IHRoZSBrZXkgaXMgdXNlZCBieSB0aGUgcmVhY3Rpb24gZHVyaW5nIGl0cyBjdXJyZW50IHJ1blxuICBpZiAoIXJlYWN0aW9uc0ZvcktleS5oYXMocmVhY3Rpb24pKSB7XG4gICAgcmVhY3Rpb25zRm9yS2V5LmFkZChyZWFjdGlvbik7XG4gICAgcmVhY3Rpb24uY2xlYW5lcnMucHVzaChyZWFjdGlvbnNGb3JLZXkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlYWN0aW9uc0Zvck9wZXJhdGlvbihyZWYpIHtcbiAgdmFyIHRhcmdldCA9IHJlZi50YXJnZXQ7XG4gIHZhciBrZXkgPSByZWYua2V5O1xuICB2YXIgdHlwZSA9IHJlZi50eXBlO1xuXG4gIHZhciByZWFjdGlvbnNGb3JUYXJnZXQgPSBjb25uZWN0aW9uU3RvcmUuZ2V0KHRhcmdldCk7XG4gIHZhciByZWFjdGlvbnNGb3JLZXkgPSBuZXcgU2V0KCk7XG5cbiAgaWYgKHR5cGUgPT09ICdjbGVhcicpIHtcbiAgICByZWFjdGlvbnNGb3JUYXJnZXQuZm9yRWFjaChmdW5jdGlvbiAoXywga2V5KSB7XG4gICAgICBhZGRSZWFjdGlvbnNGb3JLZXkocmVhY3Rpb25zRm9yS2V5LCByZWFjdGlvbnNGb3JUYXJnZXQsIGtleSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgYWRkUmVhY3Rpb25zRm9yS2V5KHJlYWN0aW9uc0ZvcktleSwgcmVhY3Rpb25zRm9yVGFyZ2V0LCBrZXkpO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09ICdhZGQnIHx8IHR5cGUgPT09ICdkZWxldGUnIHx8IHR5cGUgPT09ICdjbGVhcicpIHtcbiAgICB2YXIgaXRlcmF0aW9uS2V5ID0gQXJyYXkuaXNBcnJheSh0YXJnZXQpID8gJ2xlbmd0aCcgOiBJVEVSQVRJT05fS0VZO1xuICAgIGFkZFJlYWN0aW9uc0ZvcktleShyZWFjdGlvbnNGb3JLZXksIHJlYWN0aW9uc0ZvclRhcmdldCwgaXRlcmF0aW9uS2V5KTtcbiAgfVxuXG4gIHJldHVybiByZWFjdGlvbnNGb3JLZXk7XG59XG5cbmZ1bmN0aW9uIGFkZFJlYWN0aW9uc0ZvcktleShyZWFjdGlvbnNGb3JLZXksIHJlYWN0aW9uc0ZvclRhcmdldCwga2V5KSB7XG4gIHZhciByZWFjdGlvbnMgPSByZWFjdGlvbnNGb3JUYXJnZXQuZ2V0KGtleSk7XG4gIHJlYWN0aW9ucyAmJiByZWFjdGlvbnMuZm9yRWFjaChyZWFjdGlvbnNGb3JLZXkuYWRkLCByZWFjdGlvbnNGb3JLZXkpO1xufVxuXG5mdW5jdGlvbiByZWxlYXNlUmVhY3Rpb24ocmVhY3Rpb24pIHtcbiAgaWYgKHJlYWN0aW9uLmNsZWFuZXJzKSB7XG4gICAgcmVhY3Rpb24uY2xlYW5lcnMuZm9yRWFjaChyZWxlYXNlUmVhY3Rpb25LZXlDb25uZWN0aW9uLCByZWFjdGlvbik7XG4gIH1cbiAgcmVhY3Rpb24uY2xlYW5lcnMgPSBbXTtcbn1cblxuZnVuY3Rpb24gcmVsZWFzZVJlYWN0aW9uS2V5Q29ubmVjdGlvbihyZWFjdGlvbnNGb3JLZXkpIHtcbiAgcmVhY3Rpb25zRm9yS2V5LmRlbGV0ZSh0aGlzKTtcbn1cblxuLy8gcmVhY3Rpb25zIGNhbiBjYWxsIGVhY2ggb3RoZXIgYW5kIGZvcm0gYSBjYWxsIHN0YWNrXG52YXIgcmVhY3Rpb25TdGFjayA9IFtdO1xudmFyIGlzRGVidWdnaW5nID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHJ1bkFzUmVhY3Rpb24ocmVhY3Rpb24sIGZuLCBjb250ZXh0LCBhcmdzKSB7XG4gIC8vIGRvIG5vdCBidWlsZCByZWFjdGl2ZSByZWxhdGlvbnMsIGlmIHRoZSByZWFjdGlvbiBpcyB1bm9ic2VydmVkXG4gIGlmIChyZWFjdGlvbi51bm9ic2VydmVkKSB7XG4gICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkoZm4sIGNvbnRleHQsIGFyZ3MpO1xuICB9XG5cbiAgLy8gb25seSBydW4gdGhlIHJlYWN0aW9uIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGluIHRoZSByZWFjdGlvbiBzdGFja1xuICAvLyBUT0RPOiBpbXByb3ZlIHRoaXMgdG8gYWxsb3cgZXhwbGljaXRseSByZWN1cnNpdmUgcmVhY3Rpb25zXG4gIGlmIChyZWFjdGlvblN0YWNrLmluZGV4T2YocmVhY3Rpb24pID09PSAtMSkge1xuICAgIC8vIHJlbGVhc2UgdGhlIChvYmogLT4ga2V5IC0+IHJlYWN0aW9ucykgY29ubmVjdGlvbnNcbiAgICAvLyBhbmQgcmVzZXQgdGhlIGNsZWFuZXIgY29ubmVjdGlvbnNcbiAgICByZWxlYXNlUmVhY3Rpb24ocmVhY3Rpb24pO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIHNldCB0aGUgcmVhY3Rpb24gYXMgdGhlIGN1cnJlbnRseSBydW5uaW5nIG9uZVxuICAgICAgLy8gdGhpcyBpcyByZXF1aXJlZCBzbyB0aGF0IHdlIGNhbiBjcmVhdGUgKG9ic2VydmFibGUucHJvcCAtPiByZWFjdGlvbikgcGFpcnMgaW4gdGhlIGdldCB0cmFwXG4gICAgICByZWFjdGlvblN0YWNrLnB1c2gocmVhY3Rpb24pO1xuICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkoZm4sIGNvbnRleHQsIGFyZ3MpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBhbHdheXMgcmVtb3ZlIHRoZSBjdXJyZW50bHkgcnVubmluZyBmbGFnIGZyb20gdGhlIHJlYWN0aW9uIHdoZW4gaXQgc3RvcHMgZXhlY3V0aW9uXG4gICAgICByZWFjdGlvblN0YWNrLnBvcCgpO1xuICAgIH1cbiAgfVxufVxuXG4vLyByZWdpc3RlciB0aGUgY3VycmVudGx5IHJ1bm5pbmcgcmVhY3Rpb24gdG8gYmUgcXVldWVkIGFnYWluIG9uIG9iai5rZXkgbXV0YXRpb25zXG5mdW5jdGlvbiByZWdpc3RlclJ1bm5pbmdSZWFjdGlvbkZvck9wZXJhdGlvbihvcGVyYXRpb24pIHtcbiAgLy8gZ2V0IHRoZSBjdXJyZW50IHJlYWN0aW9uIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2tcbiAgdmFyIHJ1bm5pbmdSZWFjdGlvbiA9IHJlYWN0aW9uU3RhY2tbcmVhY3Rpb25TdGFjay5sZW5ndGggLSAxXTtcbiAgaWYgKHJ1bm5pbmdSZWFjdGlvbikge1xuICAgIGRlYnVnT3BlcmF0aW9uKHJ1bm5pbmdSZWFjdGlvbiwgb3BlcmF0aW9uKTtcbiAgICByZWdpc3RlclJlYWN0aW9uRm9yT3BlcmF0aW9uKHJ1bm5pbmdSZWFjdGlvbiwgb3BlcmF0aW9uKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBxdWV1ZVJlYWN0aW9uc0Zvck9wZXJhdGlvbihvcGVyYXRpb24pIHtcbiAgLy8gaXRlcmF0ZSBhbmQgcXVldWUgZXZlcnkgcmVhY3Rpb24sIHdoaWNoIGlzIHRyaWdnZXJlZCBieSBvYmoua2V5IG11dGF0aW9uXG4gIGdldFJlYWN0aW9uc0Zvck9wZXJhdGlvbihvcGVyYXRpb24pLmZvckVhY2gocXVldWVSZWFjdGlvbiwgb3BlcmF0aW9uKTtcbn1cblxuZnVuY3Rpb24gcXVldWVSZWFjdGlvbihyZWFjdGlvbikge1xuICBkZWJ1Z09wZXJhdGlvbihyZWFjdGlvbiwgdGhpcyk7XG4gIC8vIHF1ZXVlIHRoZSByZWFjdGlvbiBmb3IgbGF0ZXIgZXhlY3V0aW9uIG9yIHJ1biBpdCBpbW1lZGlhdGVseVxuICBpZiAodHlwZW9mIHJlYWN0aW9uLnNjaGVkdWxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJlYWN0aW9uLnNjaGVkdWxlcihyZWFjdGlvbik7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHJlYWN0aW9uLnNjaGVkdWxlciA9PT0gJ29iamVjdCcpIHtcbiAgICByZWFjdGlvbi5zY2hlZHVsZXIuYWRkKHJlYWN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICByZWFjdGlvbigpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlYnVnT3BlcmF0aW9uKHJlYWN0aW9uLCBvcGVyYXRpb24pIHtcbiAgaWYgKHJlYWN0aW9uLmRlYnVnZ2VyICYmICFpc0RlYnVnZ2luZykge1xuICAgIHRyeSB7XG4gICAgICBpc0RlYnVnZ2luZyA9IHRydWU7XG4gICAgICByZWFjdGlvbi5kZWJ1Z2dlcihvcGVyYXRpb24pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpc0RlYnVnZ2luZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNSdW5uaW5nUmVhY3Rpb24oKSB7XG4gIHJldHVybiByZWFjdGlvblN0YWNrLmxlbmd0aCA+IDA7XG59XG5cbnZhciBJU19SRUFDVElPTiA9IFN5bWJvbCgnaXMgcmVhY3Rpb24nKTtcblxuZnVuY3Rpb24gb2JzZXJ2ZShmbiwgb3B0aW9ucykge1xuICBpZiAoIG9wdGlvbnMgPT09IHZvaWQgMCApIG9wdGlvbnMgPSB7fTtcblxuICAvLyB3cmFwIHRoZSBwYXNzZWQgZnVuY3Rpb24gaW4gYSByZWFjdGlvbiwgaWYgaXQgaXMgbm90IGFscmVhZHkgb25lXG4gIHZhciByZWFjdGlvbiA9IGZuW0lTX1JFQUNUSU9OXSA/IGZuIDogZnVuY3Rpb24gcmVhY3Rpb24oKSB7XG4gICAgcmV0dXJuIHJ1bkFzUmVhY3Rpb24ocmVhY3Rpb24sIGZuLCB0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xuICAvLyBzYXZlIHRoZSBzY2hlZHVsZXIgYW5kIGRlYnVnZ2VyIG9uIHRoZSByZWFjdGlvblxuICByZWFjdGlvbi5zY2hlZHVsZXIgPSBvcHRpb25zLnNjaGVkdWxlcjtcbiAgcmVhY3Rpb24uZGVidWdnZXIgPSBvcHRpb25zLmRlYnVnZ2VyO1xuICAvLyBzYXZlIHRoZSBmYWN0IHRoYXQgdGhpcyBpcyBhIHJlYWN0aW9uXG4gIHJlYWN0aW9uW0lTX1JFQUNUSU9OXSA9IHRydWU7XG4gIC8vIHJ1biB0aGUgcmVhY3Rpb24gb25jZSBpZiBpdCBpcyBub3QgYSBsYXp5IG9uZVxuICBpZiAoIW9wdGlvbnMubGF6eSkge1xuICAgIHJlYWN0aW9uKCk7XG4gIH1cbiAgcmV0dXJuIHJlYWN0aW9uO1xufVxuXG5mdW5jdGlvbiB1bm9ic2VydmUocmVhY3Rpb24pIHtcbiAgLy8gZG8gbm90aGluZywgaWYgdGhlIHJlYWN0aW9uIGlzIGFscmVhZHkgdW5vYnNlcnZlZFxuICBpZiAoIXJlYWN0aW9uLnVub2JzZXJ2ZWQpIHtcbiAgICAvLyBpbmRpY2F0ZSB0aGF0IHRoZSByZWFjdGlvbiBzaG91bGQgbm90IGJlIHRyaWdnZXJlZCBhbnkgbW9yZVxuICAgIHJlYWN0aW9uLnVub2JzZXJ2ZWQgPSB0cnVlO1xuICAgIC8vIHJlbGVhc2UgKG9iaiAtPiBrZXkgLT4gcmVhY3Rpb24pIGNvbm5lY3Rpb25zXG4gICAgcmVsZWFzZVJlYWN0aW9uKHJlYWN0aW9uKTtcbiAgfVxuICAvLyB1bnNjaGVkdWxlIHRoZSByZWFjdGlvbiwgaWYgaXQgaXMgc2NoZWR1bGVkXG4gIGlmICh0eXBlb2YgcmVhY3Rpb24uc2NoZWR1bGVyID09PSAnb2JqZWN0Jykge1xuICAgIHJlYWN0aW9uLnNjaGVkdWxlci5kZWxldGUocmVhY3Rpb24pO1xuICB9XG59XG5cbnZhciBwcm94eVRvUmF3ID0gbmV3IFdlYWtNYXAoKTtcbnZhciByYXdUb1Byb3h5ID0gbmV3IFdlYWtNYXAoKTtcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gZmluZE9ic2VydmFibGUob2JqKSB7XG4gIHZhciBvYnNlcnZhYmxlT2JqID0gcmF3VG9Qcm94eS5nZXQob2JqKTtcbiAgaWYgKGhhc1J1bm5pbmdSZWFjdGlvbigpICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCkge1xuICAgIGlmIChvYnNlcnZhYmxlT2JqKSB7XG4gICAgICByZXR1cm4gb2JzZXJ2YWJsZU9iajtcbiAgICB9XG4gICAgcmV0dXJuIG9ic2VydmFibGUob2JqKTtcbiAgfVxuICByZXR1cm4gb2JzZXJ2YWJsZU9iaiB8fCBvYmo7XG59XG5cbmZ1bmN0aW9uIHBhdGNoSXRlcmF0b3IoaXRlcmF0b3IsIGlzRW50cmllcykge1xuICB2YXIgb3JpZ2luYWxOZXh0ID0gaXRlcmF0b3IubmV4dDtcbiAgaXRlcmF0b3IubmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVmID0gb3JpZ2luYWxOZXh0LmNhbGwoaXRlcmF0b3IpO1xuICAgIHZhciBkb25lID0gcmVmLmRvbmU7XG4gICAgdmFyIHZhbHVlID0gcmVmLnZhbHVlO1xuICAgIGlmICghZG9uZSkge1xuICAgICAgaWYgKGlzRW50cmllcykge1xuICAgICAgICB2YWx1ZVsxXSA9IGZpbmRPYnNlcnZhYmxlKHZhbHVlWzFdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gZmluZE9ic2VydmFibGUodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBkb25lOiBkb25lLCB2YWx1ZTogdmFsdWUgfTtcbiAgfTtcbiAgcmV0dXJuIGl0ZXJhdG9yO1xufVxuXG52YXIgaW5zdHJ1bWVudGF0aW9ucyA9IHtcbiAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgdmFyIHRhcmdldCA9IHByb3h5VG9SYXcuZ2V0KHRoaXMpO1xuICAgIHZhciBwcm90byA9IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7XG4gICAgcmVnaXN0ZXJSdW5uaW5nUmVhY3Rpb25Gb3JPcGVyYXRpb24oeyB0YXJnZXQ6IHRhcmdldCwga2V5OiBrZXksIHR5cGU6ICdoYXMnIH0pO1xuICAgIHJldHVybiBwcm90by5oYXMuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpO1xuICB9LFxuICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICB2YXIgdGFyZ2V0ID0gcHJveHlUb1Jhdy5nZXQodGhpcyk7XG4gICAgdmFyIHByb3RvID0gUmVmbGVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTtcbiAgICByZWdpc3RlclJ1bm5pbmdSZWFjdGlvbkZvck9wZXJhdGlvbih7IHRhcmdldDogdGFyZ2V0LCBrZXk6IGtleSwgdHlwZTogJ2dldCcgfSk7XG4gICAgcmV0dXJuIGZpbmRPYnNlcnZhYmxlKHByb3RvLmdldC5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cykpO1xuICB9LFxuICBhZGQ6IGZ1bmN0aW9uIGFkZChrZXkpIHtcbiAgICB2YXIgdGFyZ2V0ID0gcHJveHlUb1Jhdy5nZXQodGhpcyk7XG4gICAgdmFyIHByb3RvID0gUmVmbGVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTtcbiAgICB2YXIgaGFkS2V5ID0gcHJvdG8uaGFzLmNhbGwodGFyZ2V0LCBrZXkpO1xuICAgIC8vIGZvcndhcmQgdGhlIG9wZXJhdGlvbiBiZWZvcmUgcXVldWVpbmcgcmVhY3Rpb25zXG4gICAgdmFyIHJlc3VsdCA9IHByb3RvLmFkZC5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cyk7XG4gICAgaWYgKCFoYWRLZXkpIHtcbiAgICAgIHF1ZXVlUmVhY3Rpb25zRm9yT3BlcmF0aW9uKHsgdGFyZ2V0OiB0YXJnZXQsIGtleToga2V5LCB2YWx1ZToga2V5LCB0eXBlOiAnYWRkJyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIHZhciB0YXJnZXQgPSBwcm94eVRvUmF3LmdldCh0aGlzKTtcbiAgICB2YXIgcHJvdG8gPSBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO1xuICAgIHZhciBoYWRLZXkgPSBwcm90by5oYXMuY2FsbCh0YXJnZXQsIGtleSk7XG4gICAgdmFyIG9sZFZhbHVlID0gcHJvdG8uZ2V0LmNhbGwodGFyZ2V0LCBrZXkpO1xuICAgIC8vIGZvcndhcmQgdGhlIG9wZXJhdGlvbiBiZWZvcmUgcXVldWVpbmcgcmVhY3Rpb25zXG4gICAgdmFyIHJlc3VsdCA9IHByb3RvLnNldC5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cyk7XG4gICAgaWYgKCFoYWRLZXkpIHtcbiAgICAgIHF1ZXVlUmVhY3Rpb25zRm9yT3BlcmF0aW9uKHsgdGFyZ2V0OiB0YXJnZXQsIGtleToga2V5LCB2YWx1ZTogdmFsdWUsIHR5cGU6ICdhZGQnIH0pO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IG9sZFZhbHVlKSB7XG4gICAgICBxdWV1ZVJlYWN0aW9uc0Zvck9wZXJhdGlvbih7IHRhcmdldDogdGFyZ2V0LCBrZXk6IGtleSwgdmFsdWU6IHZhbHVlLCBvbGRWYWx1ZTogb2xkVmFsdWUsIHR5cGU6ICdzZXQnIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LFxuICBkZWxldGU6IGZ1bmN0aW9uIGRlbGV0ZSQxKGtleSkge1xuICAgIHZhciB0YXJnZXQgPSBwcm94eVRvUmF3LmdldCh0aGlzKTtcbiAgICB2YXIgcHJvdG8gPSBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO1xuICAgIHZhciBoYWRLZXkgPSBwcm90by5oYXMuY2FsbCh0YXJnZXQsIGtleSk7XG4gICAgdmFyIG9sZFZhbHVlID0gcHJvdG8uZ2V0ID8gcHJvdG8uZ2V0LmNhbGwodGFyZ2V0LCBrZXkpIDogdW5kZWZpbmVkO1xuICAgIC8vIGZvcndhcmQgdGhlIG9wZXJhdGlvbiBiZWZvcmUgcXVldWVpbmcgcmVhY3Rpb25zXG4gICAgdmFyIHJlc3VsdCA9IHByb3RvLmRlbGV0ZS5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGhhZEtleSkge1xuICAgICAgcXVldWVSZWFjdGlvbnNGb3JPcGVyYXRpb24oeyB0YXJnZXQ6IHRhcmdldCwga2V5OiBrZXksIG9sZFZhbHVlOiBvbGRWYWx1ZSwgdHlwZTogJ2RlbGV0ZScgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG4gIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICB2YXIgdGFyZ2V0ID0gcHJveHlUb1Jhdy5nZXQodGhpcyk7XG4gICAgdmFyIHByb3RvID0gUmVmbGVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTtcbiAgICB2YXIgaGFkSXRlbXMgPSB0YXJnZXQuc2l6ZSAhPT0gMDtcbiAgICB2YXIgb2xkVGFyZ2V0ID0gdGFyZ2V0IGluc3RhbmNlb2YgTWFwID8gbmV3IE1hcCh0YXJnZXQpIDogbmV3IFNldCh0YXJnZXQpO1xuICAgIC8vIGZvcndhcmQgdGhlIG9wZXJhdGlvbiBiZWZvcmUgcXVldWVpbmcgcmVhY3Rpb25zXG4gICAgdmFyIHJlc3VsdCA9IHByb3RvLmNsZWFyLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTtcbiAgICBpZiAoaGFkSXRlbXMpIHtcbiAgICAgIHF1ZXVlUmVhY3Rpb25zRm9yT3BlcmF0aW9uKHsgdGFyZ2V0OiB0YXJnZXQsIG9sZFRhcmdldDogb2xkVGFyZ2V0LCB0eXBlOiAnY2xlYXInIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LFxuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNiKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKCBsZW4tLSA+IDAgKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuICsgMSBdO1xuXG4gICAgdmFyIHRhcmdldCA9IHByb3h5VG9SYXcuZ2V0KHRoaXMpO1xuICAgIHZhciBwcm90byA9IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7XG4gICAgcmVnaXN0ZXJSdW5uaW5nUmVhY3Rpb25Gb3JPcGVyYXRpb24oeyB0YXJnZXQ6IHRhcmdldCwgdHlwZTogJ2l0ZXJhdGUnIH0pO1xuICAgIC8vIHN3YXAgb3V0IHRoZSByYXcgdmFsdWVzIHdpdGggdGhlaXIgb2JzZXJ2YWJsZSBwYWlyc1xuICAgIC8vIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlIGNhbGxiYWNrXG4gICAgdmFyIHdyYXBwZWRDYiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgdmFyIHJlc3QgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICB3aGlsZSAoIGxlbi0tID4gMCApIHJlc3RbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gKyAxIF07XG5cbiAgICAgIHJldHVybiBjYi5hcHBseSh2b2lkIDAsIFsgZmluZE9ic2VydmFibGUodmFsdWUpIF0uY29uY2F0KCByZXN0ICkpO1xuICAgIH07XG4gICAgcmV0dXJuIChyZWYgPSBwcm90by5mb3JFYWNoKS5jYWxsLmFwcGx5KHJlZiwgWyB0YXJnZXQsIHdyYXBwZWRDYiBdLmNvbmNhdCggYXJncyApKTtcbiAgICB2YXIgcmVmO1xuICB9LFxuICBrZXlzOiBmdW5jdGlvbiBrZXlzKCkge1xuICAgIHZhciB0YXJnZXQgPSBwcm94eVRvUmF3LmdldCh0aGlzKTtcbiAgICB2YXIgcHJvdG8gPSBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO1xuICAgIHJlZ2lzdGVyUnVubmluZ1JlYWN0aW9uRm9yT3BlcmF0aW9uKHsgdGFyZ2V0OiB0YXJnZXQsIHR5cGU6ICdpdGVyYXRlJyB9KTtcbiAgICByZXR1cm4gcHJvdG8ua2V5cy5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cyk7XG4gIH0sXG4gIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKCkge1xuICAgIHZhciB0YXJnZXQgPSBwcm94eVRvUmF3LmdldCh0aGlzKTtcbiAgICB2YXIgcHJvdG8gPSBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO1xuICAgIHJlZ2lzdGVyUnVubmluZ1JlYWN0aW9uRm9yT3BlcmF0aW9uKHsgdGFyZ2V0OiB0YXJnZXQsIHR5cGU6ICdpdGVyYXRlJyB9KTtcbiAgICB2YXIgaXRlcmF0b3IgPSBwcm90by52YWx1ZXMuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpO1xuICAgIHJldHVybiBwYXRjaEl0ZXJhdG9yKGl0ZXJhdG9yLCBmYWxzZSk7XG4gIH0sXG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoKSB7XG4gICAgdmFyIHRhcmdldCA9IHByb3h5VG9SYXcuZ2V0KHRoaXMpO1xuICAgIHZhciBwcm90byA9IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7XG4gICAgcmVnaXN0ZXJSdW5uaW5nUmVhY3Rpb25Gb3JPcGVyYXRpb24oeyB0YXJnZXQ6IHRhcmdldCwgdHlwZTogJ2l0ZXJhdGUnIH0pO1xuICAgIHZhciBpdGVyYXRvciA9IHByb3RvLmVudHJpZXMuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpO1xuICAgIHJldHVybiBwYXRjaEl0ZXJhdG9yKGl0ZXJhdG9yLCB0cnVlKTtcbiAgfSxcbiAgZ2V0IHNpemUoKSB7XG4gICAgdmFyIHRhcmdldCA9IHByb3h5VG9SYXcuZ2V0KHRoaXMpO1xuICAgIHZhciBwcm90byA9IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7XG4gICAgcmVnaXN0ZXJSdW5uaW5nUmVhY3Rpb25Gb3JPcGVyYXRpb24oeyB0YXJnZXQ6IHRhcmdldCwgdHlwZTogJ2l0ZXJhdGUnIH0pO1xuICAgIHJldHVybiBSZWZsZWN0LmdldChwcm90bywgJ3NpemUnLCB0YXJnZXQpO1xuICB9XG59O1xuaW5zdHJ1bWVudGF0aW9uc1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0YXJnZXQgPSBwcm94eVRvUmF3LmdldCh0aGlzKTtcbiAgICB2YXIgcHJvdG8gPSBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO1xuICAgIHJlZ2lzdGVyUnVubmluZ1JlYWN0aW9uRm9yT3BlcmF0aW9uKHsgdGFyZ2V0OiB0YXJnZXQsIHR5cGU6ICdpdGVyYXRlJyB9KTtcbiAgICB2YXIgaXRlcmF0b3IgPSBwcm90b1tTeW1ib2wuaXRlcmF0b3JdLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gcGF0Y2hJdGVyYXRvcihpdGVyYXRvciwgdGFyZ2V0IGluc3RhbmNlb2YgTWFwKTtcbiAgfTtcblxudmFyIGNvbGxlY3Rpb25IYW5kbGVycyA9IHtcbiAgZ2V0OiBmdW5jdGlvbiBnZXQodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSB7XG4gICAgLy8gaW5zdHJ1bWVudCBtZXRob2RzIGFuZCBwcm9wZXJ0eSBhY2Nlc3NvcnMgdG8gYmUgcmVhY3RpdmVcbiAgICB0YXJnZXQgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKGluc3RydW1lbnRhdGlvbnMsIGtleSkgPyBpbnN0cnVtZW50YXRpb25zIDogdGFyZ2V0O1xuICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpO1xuICB9XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbnZhciBnbG9iYWxPYmogPSB0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JyA/IHdpbmRvdyA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbi8vIGJ1aWx0LWluIG9iamVjdCBjYW4gbm90IGJlIHdyYXBwZWQgYnkgUHJveGllc1xuLy8gdGhlaXIgbWV0aG9kcyBleHBlY3QgdGhlIG9iamVjdCBpbnN0YW5jZSBhcyB0aGUgJ3RoaXMnIGluc3RlYWQgb2YgdGhlIFByb3h5IHdyYXBwZXJcbi8vIGNvbXBsZXggb2JqZWN0cyBhcmUgd3JhcHBlZCB3aXRoIGEgUHJveHkgb2YgaW5zdHJ1bWVudGVkIG1ldGhvZHNcbi8vIHdoaWNoIHN3aXRjaCB0aGUgcHJveHkgdG8gdGhlIHJhdyBvYmplY3QgYW5kIHRvIGFkZCByZWFjdGl2ZSB3aXJpbmdcbnZhciBoYW5kbGVycyA9IG5ldyBNYXAoW1tNYXAsIGNvbGxlY3Rpb25IYW5kbGVyc10sIFtTZXQsIGNvbGxlY3Rpb25IYW5kbGVyc10sIFtXZWFrTWFwLCBjb2xsZWN0aW9uSGFuZGxlcnNdLCBbV2Vha1NldCwgY29sbGVjdGlvbkhhbmRsZXJzXSwgW09iamVjdCwgZmFsc2VdLCBbQXJyYXksIGZhbHNlXSwgW0ludDhBcnJheSwgZmFsc2VdLCBbVWludDhBcnJheSwgZmFsc2VdLCBbVWludDhDbGFtcGVkQXJyYXksIGZhbHNlXSwgW0ludDE2QXJyYXksIGZhbHNlXSwgW1VpbnQxNkFycmF5LCBmYWxzZV0sIFtJbnQzMkFycmF5LCBmYWxzZV0sIFtVaW50MzJBcnJheSwgZmFsc2VdLCBbRmxvYXQzMkFycmF5LCBmYWxzZV0sIFtGbG9hdDY0QXJyYXksIGZhbHNlXV0pO1xuXG5mdW5jdGlvbiBzaG91bGRJbnN0cnVtZW50KHJlZikge1xuICB2YXIgY29uc3RydWN0b3IgPSByZWYuY29uc3RydWN0b3I7XG5cbiAgdmFyIGlzQnVpbHRJbiA9IHR5cGVvZiBjb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyAmJiBjb25zdHJ1Y3Rvci5uYW1lIGluIGdsb2JhbE9iaiAmJiBnbG9iYWxPYmpbY29uc3RydWN0b3IubmFtZV0gPT09IGNvbnN0cnVjdG9yO1xuICByZXR1cm4gIWlzQnVpbHRJbiB8fCBoYW5kbGVycy5oYXMoY29uc3RydWN0b3IpO1xufVxuXG5mdW5jdGlvbiBnZXRIYW5kbGVycyhvYmopIHtcbiAgcmV0dXJuIGhhbmRsZXJzLmdldChvYmouY29uc3RydWN0b3IpO1xufVxuXG52YXIgaGFzT3duUHJvcGVydHkkMSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgd2VsbEtub3duU3ltYm9scyA9IG5ldyBTZXQoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoU3ltYm9sKS5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gU3ltYm9sW2tleV07IH0pLmZpbHRlcihmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N5bWJvbCc7IH0pKTtcblxuLy8gaW50ZXJjZXB0IGdldCBvcGVyYXRpb25zIG9uIG9ic2VydmFibGVzIHRvIGtub3cgd2hpY2ggcmVhY3Rpb24gdXNlcyB0aGVpciBwcm9wZXJ0aWVzXG5mdW5jdGlvbiBnZXQodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSB7XG4gIHZhciByZXN1bHQgPSBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpO1xuICAvLyBkbyBub3QgcmVnaXN0ZXIgKG9ic2VydmFibGUucHJvcCAtPiByZWFjdGlvbikgcGFpcnMgZm9yIHdlbGwga25vd24gc3ltYm9sc1xuICAvLyB0aGVzZSBzeW1ib2xzIGFyZSBmcmVxdWVudGx5IHJldHJpZXZlZCBpbiBsb3cgbGV2ZWwgSmF2YVNjcmlwdCB1bmRlciB0aGUgaG9vZFxuICBpZiAodHlwZW9mIGtleSA9PT0gJ3N5bWJvbCcgJiYgd2VsbEtub3duU3ltYm9scy5oYXMoa2V5KSkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLy8gcmVnaXN0ZXIgYW5kIHNhdmUgKG9ic2VydmFibGUucHJvcCAtPiBydW5uaW5nUmVhY3Rpb24pXG4gIHJlZ2lzdGVyUnVubmluZ1JlYWN0aW9uRm9yT3BlcmF0aW9uKHsgdGFyZ2V0OiB0YXJnZXQsIGtleToga2V5LCByZWNlaXZlcjogcmVjZWl2ZXIsIHR5cGU6ICdnZXQnIH0pO1xuICAvLyBpZiB3ZSBhcmUgaW5zaWRlIGEgcmVhY3Rpb24gYW5kIG9ic2VydmFibGUucHJvcCBpcyBhbiBvYmplY3Qgd3JhcCBpdCBpbiBhbiBvYnNlcnZhYmxlIHRvb1xuICAvLyB0aGlzIGlzIG5lZWRlZCB0byBpbnRlcmNlcHQgcHJvcGVydHkgYWNjZXNzIG9uIHRoYXQgb2JqZWN0IHRvbyAoZHluYW1pYyBvYnNlcnZhYmxlIHRyZWUpXG4gIHZhciBvYnNlcnZhYmxlUmVzdWx0ID0gcmF3VG9Qcm94eS5nZXQocmVzdWx0KTtcbiAgaWYgKGhhc1J1bm5pbmdSZWFjdGlvbigpICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdCAhPT0gbnVsbCkge1xuICAgIGlmIChvYnNlcnZhYmxlUmVzdWx0KSB7XG4gICAgICByZXR1cm4gb2JzZXJ2YWJsZVJlc3VsdDtcbiAgICB9XG4gICAgLy8gZG8gbm90IHZpb2xhdGUgdGhlIG5vbmUtY29uZmlndXJhYmxlIG5vbmUtd3JpdGFibGUgcHJvcCBnZXQgaGFuZGxlciBpbnZhcmlhbnRcbiAgICAvLyBmYWxsIGJhY2sgdG8gbm9uZSByZWFjdGl2ZSBtb2RlIGluIHRoaXMgY2FzZSwgaW5zdGVhZCBvZiBsZXR0aW5nIHRoZSBQcm94eSB0aHJvdyBhIFR5cGVFcnJvclxuICAgIHZhciBkZXNjcmlwdG9yID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpO1xuICAgIGlmICghZGVzY3JpcHRvciB8fCAhKGRlc2NyaXB0b3Iud3JpdGFibGUgPT09IGZhbHNlICYmIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID09PSBmYWxzZSkpIHtcbiAgICAgIHJldHVybiBvYnNlcnZhYmxlKHJlc3VsdCk7XG4gICAgfVxuICB9XG4gIC8vIG90aGVyd2lzZSByZXR1cm4gdGhlIG9ic2VydmFibGUgd3JhcHBlciBpZiBpdCBpcyBhbHJlYWR5IGNyZWF0ZWQgYW5kIGNhY2hlZCBvciB0aGUgcmF3IG9iamVjdFxuICByZXR1cm4gb2JzZXJ2YWJsZVJlc3VsdCB8fCByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGhhcyh0YXJnZXQsIGtleSkge1xuICB2YXIgcmVzdWx0ID0gUmVmbGVjdC5oYXModGFyZ2V0LCBrZXkpO1xuICAvLyByZWdpc3RlciBhbmQgc2F2ZSAob2JzZXJ2YWJsZS5wcm9wIC0+IHJ1bm5pbmdSZWFjdGlvbilcbiAgcmVnaXN0ZXJSdW5uaW5nUmVhY3Rpb25Gb3JPcGVyYXRpb24oeyB0YXJnZXQ6IHRhcmdldCwga2V5OiBrZXksIHR5cGU6ICdoYXMnIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBvd25LZXlzKHRhcmdldCkge1xuICByZWdpc3RlclJ1bm5pbmdSZWFjdGlvbkZvck9wZXJhdGlvbih7IHRhcmdldDogdGFyZ2V0LCB0eXBlOiAnaXRlcmF0ZScgfSk7XG4gIHJldHVybiBSZWZsZWN0Lm93bktleXModGFyZ2V0KTtcbn1cblxuLy8gaW50ZXJjZXB0IHNldCBvcGVyYXRpb25zIG9uIG9ic2VydmFibGVzIHRvIGtub3cgd2hlbiB0byB0cmlnZ2VyIHJlYWN0aW9uc1xuZnVuY3Rpb24gc2V0KHRhcmdldCwga2V5LCB2YWx1ZSwgcmVjZWl2ZXIpIHtcbiAgLy8gbWFrZSBzdXJlIHRvIGRvIG5vdCBwb2xsdXRlIHRoZSByYXcgb2JqZWN0IHdpdGggb2JzZXJ2YWJsZXNcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICB2YWx1ZSA9IHByb3h5VG9SYXcuZ2V0KHZhbHVlKSB8fCB2YWx1ZTtcbiAgfVxuICAvLyBzYXZlIGlmIHRoZSBvYmplY3QgaGFkIGEgZGVzY3JpcHRvciBmb3IgdGhpcyBrZXlcbiAgdmFyIGhhZEtleSA9IGhhc093blByb3BlcnR5JDEuY2FsbCh0YXJnZXQsIGtleSk7XG4gIC8vIHNhdmUgaWYgdGhlIHZhbHVlIGNoYW5nZWQgYmVjYXVzZSBvZiB0aGlzIHNldCBvcGVyYXRpb25cbiAgdmFyIG9sZFZhbHVlID0gdGFyZ2V0W2tleV07XG4gIC8vIGV4ZWN1dGUgdGhlIHNldCBvcGVyYXRpb24gYmVmb3JlIHJ1bm5pbmcgYW55IHJlYWN0aW9uXG4gIHZhciByZXN1bHQgPSBSZWZsZWN0LnNldCh0YXJnZXQsIGtleSwgdmFsdWUsIHJlY2VpdmVyKTtcbiAgLy8gZG8gbm90IHF1ZXVlIHJlYWN0aW9ucyBpZiB0aGUgdGFyZ2V0IG9mIHRoZSBvcGVyYXRpb24gaXMgbm90IHRoZSByYXcgcmVjZWl2ZXJcbiAgLy8gKHBvc3NpYmxlIGJlY2F1c2Ugb2YgcHJvdG90eXBhbCBpbmhlcml0YW5jZSlcbiAgaWYgKHRhcmdldCAhPT0gcHJveHlUb1Jhdy5nZXQocmVjZWl2ZXIpKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvLyBxdWV1ZSBhIHJlYWN0aW9uIGlmIGl0J3MgYSBuZXcgcHJvcGVydHkgb3IgaXRzIHZhbHVlIGNoYW5nZWRcbiAgaWYgKCFoYWRLZXkpIHtcbiAgICBxdWV1ZVJlYWN0aW9uc0Zvck9wZXJhdGlvbih7IHRhcmdldDogdGFyZ2V0LCBrZXk6IGtleSwgdmFsdWU6IHZhbHVlLCByZWNlaXZlcjogcmVjZWl2ZXIsIHR5cGU6ICdhZGQnIH0pO1xuICB9IGVsc2UgaWYgKHZhbHVlICE9PSBvbGRWYWx1ZSkge1xuICAgIHF1ZXVlUmVhY3Rpb25zRm9yT3BlcmF0aW9uKHtcbiAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAga2V5OiBrZXksXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBvbGRWYWx1ZTogb2xkVmFsdWUsXG4gICAgICByZWNlaXZlcjogcmVjZWl2ZXIsXG4gICAgICB0eXBlOiAnc2V0J1xuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwga2V5KSB7XG4gIC8vIHNhdmUgaWYgdGhlIG9iamVjdCBoYWQgdGhlIGtleVxuICB2YXIgaGFkS2V5ID0gaGFzT3duUHJvcGVydHkkMS5jYWxsKHRhcmdldCwga2V5KTtcbiAgdmFyIG9sZFZhbHVlID0gdGFyZ2V0W2tleV07XG4gIC8vIGV4ZWN1dGUgdGhlIGRlbGV0ZSBvcGVyYXRpb24gYmVmb3JlIHJ1bm5pbmcgYW55IHJlYWN0aW9uXG4gIHZhciByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHRhcmdldCwga2V5KTtcbiAgLy8gb25seSBxdWV1ZSByZWFjdGlvbnMgZm9yIGRlbGV0ZSBvcGVyYXRpb25zIHdoaWNoIHJlc3VsdGVkIGluIGFuIGFjdHVhbCBjaGFuZ2VcbiAgaWYgKGhhZEtleSkge1xuICAgIHF1ZXVlUmVhY3Rpb25zRm9yT3BlcmF0aW9uKHsgdGFyZ2V0OiB0YXJnZXQsIGtleToga2V5LCBvbGRWYWx1ZTogb2xkVmFsdWUsIHR5cGU6ICdkZWxldGUnIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbnZhciBiYXNlSGFuZGxlcnMgPSB7IGdldDogZ2V0LCBoYXM6IGhhcywgb3duS2V5czogb3duS2V5cywgc2V0OiBzZXQsIGRlbGV0ZVByb3BlcnR5OiBkZWxldGVQcm9wZXJ0eSB9O1xuXG5mdW5jdGlvbiBvYnNlcnZhYmxlKG9iaikge1xuICBpZiAoIG9iaiA9PT0gdm9pZCAwICkgb2JqID0ge307XG5cbiAgLy8gaWYgaXQgaXMgYWxyZWFkeSBhbiBvYnNlcnZhYmxlIG9yIGl0IHNob3VsZCBub3QgYmUgd3JhcHBlZCwgcmV0dXJuIGl0XG4gIGlmIChwcm94eVRvUmF3LmhhcyhvYmopIHx8ICFzaG91bGRJbnN0cnVtZW50KG9iaikpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIC8vIGlmIGl0IGFscmVhZHkgaGFzIGEgY2FjaGVkIG9ic2VydmFibGUgd3JhcHBlciwgcmV0dXJuIGl0XG4gIC8vIG90aGVyd2lzZSBjcmVhdGUgYSBuZXcgb2JzZXJ2YWJsZVxuICByZXR1cm4gcmF3VG9Qcm94eS5nZXQob2JqKSB8fCBjcmVhdGVPYnNlcnZhYmxlKG9iaik7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU9ic2VydmFibGUob2JqKSB7XG4gIC8vIGlmIGl0IGlzIGEgY29tcGxleCBidWlsdC1pbiBvYmplY3Qgb3IgYSBub3JtYWwgb2JqZWN0LCB3cmFwIGl0XG4gIHZhciBoYW5kbGVycyA9IGdldEhhbmRsZXJzKG9iaikgfHwgYmFzZUhhbmRsZXJzO1xuICB2YXIgb2JzZXJ2YWJsZSA9IG5ldyBQcm94eShvYmosIGhhbmRsZXJzKTtcbiAgLy8gc2F2ZSB0aGVzZSB0byBzd2l0Y2ggYmV0d2VlbiB0aGUgcmF3IG9iamVjdCBhbmQgdGhlIHdyYXBwZWQgb2JqZWN0IHdpdGggZWFzZSBsYXRlclxuICByYXdUb1Byb3h5LnNldChvYmosIG9ic2VydmFibGUpO1xuICBwcm94eVRvUmF3LnNldChvYnNlcnZhYmxlLCBvYmopO1xuICAvLyBpbml0IGJhc2ljIGRhdGEgc3RydWN0dXJlcyB0byBzYXZlIGFuZCBjbGVhbnVwIGxhdGVyIChvYnNlcnZhYmxlLnByb3AgLT4gcmVhY3Rpb24pIGNvbm5lY3Rpb25zXG4gIHN0b3JlT2JzZXJ2YWJsZShvYmopO1xuICByZXR1cm4gb2JzZXJ2YWJsZTtcbn1cblxuZnVuY3Rpb24gaXNPYnNlcnZhYmxlKG9iaikge1xuICByZXR1cm4gcHJveHlUb1Jhdy5oYXMob2JqKTtcbn1cblxuZnVuY3Rpb24gcmF3KG9iaikge1xuICByZXR1cm4gcHJveHlUb1Jhdy5nZXQob2JqKSB8fCBvYmo7XG59XG5cbmV4cG9ydCB7IG9ic2VydmUsIHVub2JzZXJ2ZSwgb2JzZXJ2YWJsZSwgaXNPYnNlcnZhYmxlLCByYXcgfTtcbiIsIi8qIVxuICBDb3B5cmlnaHQgKGMpIDIwMTcgSmVkIFdhdHNvbi5cbiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChNSVQpLCBzZWVcbiAgaHR0cDovL2plZHdhdHNvbi5naXRodWIuaW8vY2xhc3NuYW1lc1xuKi9cbi8qIGdsb2JhbCBkZWZpbmUgKi9cblxuKGZ1bmN0aW9uICgpIHtcblx0J3VzZSBzdHJpY3QnO1xuXG5cdHZhciBoYXNPd24gPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuXHRmdW5jdGlvbiBjbGFzc05hbWVzICgpIHtcblx0XHR2YXIgY2xhc3NlcyA9IFtdO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBhcmcgPSBhcmd1bWVudHNbaV07XG5cdFx0XHRpZiAoIWFyZykgY29udGludWU7XG5cblx0XHRcdHZhciBhcmdUeXBlID0gdHlwZW9mIGFyZztcblxuXHRcdFx0aWYgKGFyZ1R5cGUgPT09ICdzdHJpbmcnIHx8IGFyZ1R5cGUgPT09ICdudW1iZXInKSB7XG5cdFx0XHRcdGNsYXNzZXMucHVzaChhcmcpO1xuXHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZykgJiYgYXJnLmxlbmd0aCkge1xuXHRcdFx0XHR2YXIgaW5uZXIgPSBjbGFzc05hbWVzLmFwcGx5KG51bGwsIGFyZyk7XG5cdFx0XHRcdGlmIChpbm5lcikge1xuXHRcdFx0XHRcdGNsYXNzZXMucHVzaChpbm5lcik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYXJnVHlwZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0Zm9yICh2YXIga2V5IGluIGFyZykge1xuXHRcdFx0XHRcdGlmIChoYXNPd24uY2FsbChhcmcsIGtleSkgJiYgYXJnW2tleV0pIHtcblx0XHRcdFx0XHRcdGNsYXNzZXMucHVzaChrZXkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcblx0fVxuXG5cdGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuXHRcdGNsYXNzTmFtZXMuZGVmYXVsdCA9IGNsYXNzTmFtZXM7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBjbGFzc05hbWVzO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT09ICdvYmplY3QnICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyByZWdpc3RlciBhcyAnY2xhc3NuYW1lcycsIGNvbnNpc3RlbnQgd2l0aCBucG0gcGFja2FnZSBuYW1lXG5cdFx0ZGVmaW5lKCdjbGFzc25hbWVzJywgW10sIGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBjbGFzc05hbWVzO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHdpbmRvdy5jbGFzc05hbWVzID0gY2xhc3NOYW1lcztcblx0fVxufSgpKTtcbiIsImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIikoZmFsc2UpO1xuLy8gTW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCIubWRjLWJ1dHRvbiB7XFxuICBmb250LWZhbWlseTogUm9ib3RvLCBzYW5zLXNlcmlmO1xcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcXG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcXG4gIGxpbmUtaGVpZ2h0OiAyLjI1cmVtO1xcbiAgZm9udC13ZWlnaHQ6IDUwMDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA4OTI5ZW07XFxuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcbiAgcGFkZGluZzogMCA4cHggMCA4cHg7XFxuICBkaXNwbGF5OiAtd2Via2l0LWlubGluZS1ib3g7XFxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIC13ZWJraXQtYm94LWFsaWduOiBjZW50ZXI7XFxuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAtd2Via2l0LWJveC1wYWNrOiBjZW50ZXI7XFxuICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIG1pbi13aWR0aDogNjRweDtcXG4gIGhlaWdodDogMzZweDtcXG4gIGJvcmRlcjogbm9uZTtcXG4gIG91dGxpbmU6IG5vbmU7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcXG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xcbiAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gIGJvcmRlci1yYWRpdXM6IDRweDsgfVxcbiAgLm1kYy1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIge1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBib3JkZXI6IDA7IH1cXG4gIC5tZGMtYnV0dG9uOmFjdGl2ZSB7XFxuICAgIG91dGxpbmU6IG5vbmU7IH1cXG4gIC5tZGMtYnV0dG9uOmhvdmVyIHtcXG4gICAgY3Vyc29yOiBwb2ludGVyOyB9XFxuICAubWRjLWJ1dHRvbjpkaXNhYmxlZCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM3KTtcXG4gICAgY3Vyc29yOiBkZWZhdWx0O1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsgfVxcbiAgLm1kYy1idXR0b24ubWRjLWJ1dHRvbi0tZGVuc2Uge1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7IH1cXG4gIC5tZGMtYnV0dG9uOm5vdCg6ZGlzYWJsZWQpIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IH1cXG4gIC5tZGMtYnV0dG9uIC5tZGMtYnV0dG9uX19pY29uIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBtYXJnaW4tbGVmdDogMDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBtYXJnaW4tcmlnaHQ6IDhweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICB3aWR0aDogMThweDtcXG4gICAgaGVpZ2h0OiAxOHB4O1xcbiAgICBmb250LXNpemU6IDE4cHg7XFxuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7IH1cXG4gICAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy1idXR0b24gLm1kYy1idXR0b25fX2ljb24sIC5tZGMtYnV0dG9uIC5tZGMtYnV0dG9uX19pY29uW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBtYXJnaW4tbGVmdDogOHB4O1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBtYXJnaW4tcmlnaHQ6IDA7IH1cXG4gIC5tZGMtYnV0dG9uOm5vdCg6ZGlzYWJsZWQpIHtcXG4gICAgY29sb3I6ICM2MjAwZWU7XFxuICAgIC8qIEBhbHRlcm5hdGUgKi9cXG4gICAgY29sb3I6IHZhcigtLW1kYy10aGVtZS1wcmltYXJ5LCAjNjIwMGVlKTsgfVxcblxcbi5tZGMtYnV0dG9uX19sYWJlbCArIC5tZGMtYnV0dG9uX19pY29uIHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIG1hcmdpbi1sZWZ0OiA4cHg7XFxuICAvKiBAbm9mbGlwICovXFxuICBtYXJnaW4tcmlnaHQ6IDA7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtYnV0dG9uX19sYWJlbCArIC5tZGMtYnV0dG9uX19pY29uLCAubWRjLWJ1dHRvbl9fbGFiZWwgKyAubWRjLWJ1dHRvbl9faWNvbltkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBtYXJnaW4tbGVmdDogMDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBtYXJnaW4tcmlnaHQ6IDhweDsgfVxcblxcbnN2Zy5tZGMtYnV0dG9uX19pY29uIHtcXG4gIGZpbGw6IGN1cnJlbnRDb2xvcjsgfVxcblxcbi5tZGMtYnV0dG9uLS1yYWlzZWQgLm1kYy1idXR0b25fX2ljb24sXFxuLm1kYy1idXR0b24tLXVuZWxldmF0ZWQgLm1kYy1idXR0b25fX2ljb24sXFxuLm1kYy1idXR0b24tLW91dGxpbmVkIC5tZGMtYnV0dG9uX19pY29uIHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIG1hcmdpbi1sZWZ0OiAtNHB4O1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgbWFyZ2luLXJpZ2h0OiA4cHg7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtYnV0dG9uLS1yYWlzZWQgLm1kYy1idXR0b25fX2ljb24sIC5tZGMtYnV0dG9uLS1yYWlzZWQgLm1kYy1idXR0b25fX2ljb25bZGlyPVxcXCJydGxcXFwiXSwgW2Rpcj1cXFwicnRsXFxcIl1cXG4gIC5tZGMtYnV0dG9uLS11bmVsZXZhdGVkIC5tZGMtYnV0dG9uX19pY29uLFxcbiAgLm1kYy1idXR0b24tLXVuZWxldmF0ZWQgLm1kYy1idXR0b25fX2ljb25bZGlyPVxcXCJydGxcXFwiXSwgW2Rpcj1cXFwicnRsXFxcIl1cXG4gIC5tZGMtYnV0dG9uLS1vdXRsaW5lZCAubWRjLWJ1dHRvbl9faWNvbixcXG4gIC5tZGMtYnV0dG9uLS1vdXRsaW5lZCAubWRjLWJ1dHRvbl9faWNvbltkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBtYXJnaW4tbGVmdDogOHB4O1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIG1hcmdpbi1yaWdodDogLTRweDsgfVxcblxcbi5tZGMtYnV0dG9uLS1yYWlzZWQgLm1kYy1idXR0b25fX2xhYmVsICsgLm1kYy1idXR0b25fX2ljb24sXFxuLm1kYy1idXR0b24tLXVuZWxldmF0ZWQgLm1kYy1idXR0b25fX2xhYmVsICsgLm1kYy1idXR0b25fX2ljb24sXFxuLm1kYy1idXR0b24tLW91dGxpbmVkIC5tZGMtYnV0dG9uX19sYWJlbCArIC5tZGMtYnV0dG9uX19pY29uIHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIG1hcmdpbi1sZWZ0OiA4cHg7XFxuICAvKiBAbm9mbGlwICovXFxuICBtYXJnaW4tcmlnaHQ6IC00cHg7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtYnV0dG9uLS1yYWlzZWQgLm1kYy1idXR0b25fX2xhYmVsICsgLm1kYy1idXR0b25fX2ljb24sIC5tZGMtYnV0dG9uLS1yYWlzZWQgLm1kYy1idXR0b25fX2xhYmVsICsgLm1kYy1idXR0b25fX2ljb25bZGlyPVxcXCJydGxcXFwiXSwgW2Rpcj1cXFwicnRsXFxcIl1cXG4gIC5tZGMtYnV0dG9uLS11bmVsZXZhdGVkIC5tZGMtYnV0dG9uX19sYWJlbCArIC5tZGMtYnV0dG9uX19pY29uLFxcbiAgLm1kYy1idXR0b24tLXVuZWxldmF0ZWQgLm1kYy1idXR0b25fX2xhYmVsICsgLm1kYy1idXR0b25fX2ljb25bZGlyPVxcXCJydGxcXFwiXSwgW2Rpcj1cXFwicnRsXFxcIl1cXG4gIC5tZGMtYnV0dG9uLS1vdXRsaW5lZCAubWRjLWJ1dHRvbl9fbGFiZWwgKyAubWRjLWJ1dHRvbl9faWNvbixcXG4gIC5tZGMtYnV0dG9uLS1vdXRsaW5lZCAubWRjLWJ1dHRvbl9fbGFiZWwgKyAubWRjLWJ1dHRvbl9faWNvbltkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBtYXJnaW4tbGVmdDogLTRweDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBtYXJnaW4tcmlnaHQ6IDhweDsgfVxcblxcbi5tZGMtYnV0dG9uLS1yYWlzZWQsXFxuLm1kYy1idXR0b24tLXVuZWxldmF0ZWQge1xcbiAgcGFkZGluZzogMCAxNnB4IDAgMTZweDsgfVxcbiAgLm1kYy1idXR0b24tLXJhaXNlZDpkaXNhYmxlZCxcXG4gIC5tZGMtYnV0dG9uLS11bmVsZXZhdGVkOmRpc2FibGVkIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEyKTtcXG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNyk7IH1cXG4gIC5tZGMtYnV0dG9uLS1yYWlzZWQ6bm90KDpkaXNhYmxlZCksXFxuICAubWRjLWJ1dHRvbi0tdW5lbGV2YXRlZDpub3QoOmRpc2FibGVkKSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM2MjAwZWU7IH1cXG4gICAgQHN1cHBvcnRzIG5vdCAoLW1zLWltZS1hbGlnbjogYXV0bykge1xcbiAgICAgIC5tZGMtYnV0dG9uLS1yYWlzZWQ6bm90KDpkaXNhYmxlZCksXFxuICAgICAgLm1kYy1idXR0b24tLXVuZWxldmF0ZWQ6bm90KDpkaXNhYmxlZCkge1xcbiAgICAgICAgLyogQGFsdGVybmF0ZSAqL1xcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWRjLXRoZW1lLXByaW1hcnksICM2MjAwZWUpOyB9IH1cXG4gIC5tZGMtYnV0dG9uLS1yYWlzZWQ6bm90KDpkaXNhYmxlZCksXFxuICAubWRjLWJ1dHRvbi0tdW5lbGV2YXRlZDpub3QoOmRpc2FibGVkKSB7XFxuICAgIGNvbG9yOiAjZmZmO1xcbiAgICAvKiBAYWx0ZXJuYXRlICovXFxuICAgIGNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtb24tcHJpbWFyeSwgI2ZmZik7IH1cXG5cXG4ubWRjLWJ1dHRvbi0tcmFpc2VkIHtcXG4gIGJveC1zaGFkb3c6IDBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IGJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gIHRyYW5zaXRpb246IGJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsgfVxcbiAgLm1kYy1idXR0b24tLXJhaXNlZDpob3ZlciwgLm1kYy1idXR0b24tLXJhaXNlZDpmb2N1cyB7XFxuICAgIGJveC1zaGFkb3c6IDBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XFxuICAubWRjLWJ1dHRvbi0tcmFpc2VkOmFjdGl2ZSB7XFxuICAgIGJveC1zaGFkb3c6IDBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxcbiAgLm1kYy1idXR0b24tLXJhaXNlZDpkaXNhYmxlZCB7XFxuICAgIGJveC1zaGFkb3c6IDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxcblxcbi5tZGMtYnV0dG9uLS1vdXRsaW5lZCB7XFxuICBib3JkZXItc3R5bGU6IHNvbGlkO1xcbiAgcGFkZGluZzogMCAxNHB4IDAgMTRweDtcXG4gIGJvcmRlci13aWR0aDogMnB4OyB9XFxuICAubWRjLWJ1dHRvbi0tb3V0bGluZWQ6ZGlzYWJsZWQge1xcbiAgICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNyk7IH1cXG4gIC5tZGMtYnV0dG9uLS1vdXRsaW5lZDpub3QoOmRpc2FibGVkKSB7XFxuICAgIGJvcmRlci1jb2xvcjogIzYyMDBlZTtcXG4gICAgLyogQGFsdGVybmF0ZSAqL1xcbiAgICBib3JkZXItY29sb3I6IHZhcigtLW1kYy10aGVtZS1wcmltYXJ5LCAjNjIwMGVlKTsgfVxcblxcbi5tZGMtYnV0dG9uLS1kZW5zZSB7XFxuICBoZWlnaHQ6IDMycHg7XFxuICBmb250LXNpemU6IC44MTI1cmVtOyB9XFxuXFxuQC13ZWJraXQta2V5ZnJhbWVzIG1kYy1yaXBwbGUtZmctcmFkaXVzLWluIHtcXG4gIGZyb20ge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1zdGFydCwgMCkpIHNjYWxlKDEpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLXN0YXJ0LCAwKSkgc2NhbGUoMSk7IH1cXG4gIHRvIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1lbmQsIDApKSBzY2FsZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXNjYWxlLCAxKSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tbWRjLXJpcHBsZS1mZy10cmFuc2xhdGUtZW5kLCAwKSkgc2NhbGUodmFyKC0tbWRjLXJpcHBsZS1mZy1zY2FsZSwgMSkpOyB9IH1cXG5cXG5Aa2V5ZnJhbWVzIG1kYy1yaXBwbGUtZmctcmFkaXVzLWluIHtcXG4gIGZyb20ge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1zdGFydCwgMCkpIHNjYWxlKDEpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLXN0YXJ0LCAwKSkgc2NhbGUoMSk7IH1cXG4gIHRvIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1lbmQsIDApKSBzY2FsZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXNjYWxlLCAxKSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tbWRjLXJpcHBsZS1mZy10cmFuc2xhdGUtZW5kLCAwKSkgc2NhbGUodmFyKC0tbWRjLXJpcHBsZS1mZy1zY2FsZSwgMSkpOyB9IH1cXG5cXG5ALXdlYmtpdC1rZXlmcmFtZXMgbWRjLXJpcHBsZS1mZy1vcGFjaXR5LWluIHtcXG4gIGZyb20ge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7XFxuICAgIG9wYWNpdHk6IDA7IH1cXG4gIHRvIHtcXG4gICAgb3BhY2l0eTogdmFyKC0tbWRjLXJpcHBsZS1mZy1vcGFjaXR5LCAwKTsgfSB9XFxuXFxuQGtleWZyYW1lcyBtZGMtcmlwcGxlLWZnLW9wYWNpdHktaW4ge1xcbiAgZnJvbSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjtcXG4gICAgb3BhY2l0eTogMDsgfVxcbiAgdG8ge1xcbiAgICBvcGFjaXR5OiB2YXIoLS1tZGMtcmlwcGxlLWZnLW9wYWNpdHksIDApOyB9IH1cXG5cXG5ALXdlYmtpdC1rZXlmcmFtZXMgbWRjLXJpcHBsZS1mZy1vcGFjaXR5LW91dCB7XFxuICBmcm9tIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyO1xcbiAgICBvcGFjaXR5OiB2YXIoLS1tZGMtcmlwcGxlLWZnLW9wYWNpdHksIDApOyB9XFxuICB0byB7XFxuICAgIG9wYWNpdHk6IDA7IH0gfVxcblxcbkBrZXlmcmFtZXMgbWRjLXJpcHBsZS1mZy1vcGFjaXR5LW91dCB7XFxuICBmcm9tIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyO1xcbiAgICBvcGFjaXR5OiB2YXIoLS1tZGMtcmlwcGxlLWZnLW9wYWNpdHksIDApOyB9XFxuICB0byB7XFxuICAgIG9wYWNpdHk6IDA7IH0gfVxcblxcbi5tZGMtcmlwcGxlLXN1cmZhY2UtLXRlc3QtZWRnZS12YXItYnVnIHtcXG4gIC0tbWRjLXJpcHBsZS1zdXJmYWNlLXRlc3QtZWRnZS12YXI6IDFweCBzb2xpZCAjMDAwO1xcbiAgdmlzaWJpbGl0eTogaGlkZGVuOyB9XFxuICAubWRjLXJpcHBsZS1zdXJmYWNlLS10ZXN0LWVkZ2UtdmFyLWJ1Zzo6YmVmb3JlIHtcXG4gICAgYm9yZGVyOiB2YXIoLS1tZGMtcmlwcGxlLXN1cmZhY2UtdGVzdC1lZGdlLXZhcik7IH1cXG5cXG4ubWRjLWJ1dHRvbiB7XFxuICAtLW1kYy1yaXBwbGUtZmctc2l6ZTogMDtcXG4gIC0tbWRjLXJpcHBsZS1sZWZ0OiAwO1xcbiAgLS1tZGMtcmlwcGxlLXRvcDogMDtcXG4gIC0tbWRjLXJpcHBsZS1mZy1zY2FsZTogMTtcXG4gIC0tbWRjLXJpcHBsZS1mZy10cmFuc2xhdGUtZW5kOiAwO1xcbiAgLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1zdGFydDogMDtcXG4gIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTtcXG4gIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm0sIG9wYWNpdHk7IH1cXG4gIC5tZGMtYnV0dG9uOjpiZWZvcmUsIC5tZGMtYnV0dG9uOjphZnRlciB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xcbiAgICBvcGFjaXR5OiAwO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gICAgY29udGVudDogXFxcIlxcXCI7IH1cXG4gIC5tZGMtYnV0dG9uOjpiZWZvcmUge1xcbiAgICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgMTVtcyBsaW5lYXIsIGJhY2tncm91bmQtY29sb3IgMTVtcyBsaW5lYXI7XFxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTVtcyBsaW5lYXIsIGJhY2tncm91bmQtY29sb3IgMTVtcyBsaW5lYXI7XFxuICAgIHotaW5kZXg6IDE7IH1cXG4gIC5tZGMtYnV0dG9uLm1kYy1yaXBwbGUtdXBncmFkZWQ6OmJlZm9yZSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXNjYWxlLCAxKSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXNjYWxlLCAxKSk7IH1cXG4gIC5tZGMtYnV0dG9uLm1kYy1yaXBwbGUtdXBncmFkZWQ6OmFmdGVyIHtcXG4gICAgdG9wOiAwO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IDA7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7XFxuICAgICAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsgfVxcbiAgLm1kYy1idXR0b24ubWRjLXJpcHBsZS11cGdyYWRlZC0tdW5ib3VuZGVkOjphZnRlciB7XFxuICAgIHRvcDogdmFyKC0tbWRjLXJpcHBsZS10b3AsIDApO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IHZhcigtLW1kYy1yaXBwbGUtbGVmdCwgMCk7IH1cXG4gIC5tZGMtYnV0dG9uLm1kYy1yaXBwbGUtdXBncmFkZWQtLWZvcmVncm91bmQtYWN0aXZhdGlvbjo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogbWRjLXJpcHBsZS1mZy1yYWRpdXMtaW4gMjI1bXMgZm9yd2FyZHMsIG1kYy1yaXBwbGUtZmctb3BhY2l0eS1pbiA3NW1zIGZvcndhcmRzO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbjogbWRjLXJpcHBsZS1mZy1yYWRpdXMtaW4gMjI1bXMgZm9yd2FyZHMsIG1kYy1yaXBwbGUtZmctb3BhY2l0eS1pbiA3NW1zIGZvcndhcmRzOyB9XFxuICAubWRjLWJ1dHRvbi5tZGMtcmlwcGxlLXVwZ3JhZGVkLS1mb3JlZ3JvdW5kLWRlYWN0aXZhdGlvbjo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogbWRjLXJpcHBsZS1mZy1vcGFjaXR5LW91dCAxNTBtcztcXG4gICAgICAgICAgICBhbmltYXRpb246IG1kYy1yaXBwbGUtZmctb3BhY2l0eS1vdXQgMTUwbXM7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tbWRjLXJpcHBsZS1mZy10cmFuc2xhdGUtZW5kLCAwKSkgc2NhbGUodmFyKC0tbWRjLXJpcHBsZS1mZy1zY2FsZSwgMSkpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLWVuZCwgMCkpIHNjYWxlKHZhcigtLW1kYy1yaXBwbGUtZmctc2NhbGUsIDEpKTsgfVxcbiAgLm1kYy1idXR0b246OmJlZm9yZSwgLm1kYy1idXR0b246OmFmdGVyIHtcXG4gICAgdG9wOiBjYWxjKDUwJSAtIDEwMCUpO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IGNhbGMoNTAlIC0gMTAwJSk7XFxuICAgIHdpZHRoOiAyMDAlO1xcbiAgICBoZWlnaHQ6IDIwMCU7IH1cXG4gIC5tZGMtYnV0dG9uLm1kYy1yaXBwbGUtdXBncmFkZWQ6OmFmdGVyIHtcXG4gICAgd2lkdGg6IHZhcigtLW1kYy1yaXBwbGUtZmctc2l6ZSwgMTAwJSk7XFxuICAgIGhlaWdodDogdmFyKC0tbWRjLXJpcHBsZS1mZy1zaXplLCAxMDAlKTsgfVxcbiAgLm1kYy1idXR0b246OmJlZm9yZSwgLm1kYy1idXR0b246OmFmdGVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzYyMDBlZTsgfVxcbiAgICBAc3VwcG9ydHMgbm90ICgtbXMtaW1lLWFsaWduOiBhdXRvKSB7XFxuICAgICAgLm1kYy1idXR0b246OmJlZm9yZSwgLm1kYy1idXR0b246OmFmdGVyIHtcXG4gICAgICAgIC8qIEBhbHRlcm5hdGUgKi9cXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1kYy10aGVtZS1wcmltYXJ5LCAjNjIwMGVlKTsgfSB9XFxuICAubWRjLWJ1dHRvbjpob3Zlcjo6YmVmb3JlIHtcXG4gICAgb3BhY2l0eTogMC4wNDsgfVxcbiAgLm1kYy1idXR0b246bm90KC5tZGMtcmlwcGxlLXVwZ3JhZGVkKTpmb2N1czo6YmVmb3JlLCAubWRjLWJ1dHRvbi5tZGMtcmlwcGxlLXVwZ3JhZGVkLS1iYWNrZ3JvdW5kLWZvY3VzZWQ6OmJlZm9yZSB7XFxuICAgIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogNzVtcztcXG4gICAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiA3NW1zO1xcbiAgICBvcGFjaXR5OiAwLjEyOyB9XFxuICAubWRjLWJ1dHRvbjpub3QoLm1kYy1yaXBwbGUtdXBncmFkZWQpOjphZnRlciB7XFxuICAgIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSAxNTBtcyBsaW5lYXI7XFxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTUwbXMgbGluZWFyOyB9XFxuICAubWRjLWJ1dHRvbjpub3QoLm1kYy1yaXBwbGUtdXBncmFkZWQpOmFjdGl2ZTo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDc1bXM7XFxuICAgICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogNzVtcztcXG4gICAgb3BhY2l0eTogMC4xMjsgfVxcbiAgLm1kYy1idXR0b24ubWRjLXJpcHBsZS11cGdyYWRlZCB7XFxuICAgIC0tbWRjLXJpcHBsZS1mZy1vcGFjaXR5OiAwLjEyOyB9XFxuXFxuLm1kYy1idXR0b24tLXJhaXNlZDo6YmVmb3JlLCAubWRjLWJ1dHRvbi0tcmFpc2VkOjphZnRlcixcXG4ubWRjLWJ1dHRvbi0tdW5lbGV2YXRlZDo6YmVmb3JlLFxcbi5tZGMtYnV0dG9uLS11bmVsZXZhdGVkOjphZnRlciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOyB9XFxuICBAc3VwcG9ydHMgbm90ICgtbXMtaW1lLWFsaWduOiBhdXRvKSB7XFxuICAgIC5tZGMtYnV0dG9uLS1yYWlzZWQ6OmJlZm9yZSwgLm1kYy1idXR0b24tLXJhaXNlZDo6YWZ0ZXIsXFxuICAgIC5tZGMtYnV0dG9uLS11bmVsZXZhdGVkOjpiZWZvcmUsXFxuICAgIC5tZGMtYnV0dG9uLS11bmVsZXZhdGVkOjphZnRlciB7XFxuICAgICAgLyogQGFsdGVybmF0ZSAqL1xcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1kYy10aGVtZS1vbi1wcmltYXJ5LCAjZmZmKTsgfSB9XFxuXFxuLm1kYy1idXR0b24tLXJhaXNlZDpob3Zlcjo6YmVmb3JlLFxcbi5tZGMtYnV0dG9uLS11bmVsZXZhdGVkOmhvdmVyOjpiZWZvcmUge1xcbiAgb3BhY2l0eTogMC4wODsgfVxcblxcbi5tZGMtYnV0dG9uLS1yYWlzZWQ6bm90KC5tZGMtcmlwcGxlLXVwZ3JhZGVkKTpmb2N1czo6YmVmb3JlLCAubWRjLWJ1dHRvbi0tcmFpc2VkLm1kYy1yaXBwbGUtdXBncmFkZWQtLWJhY2tncm91bmQtZm9jdXNlZDo6YmVmb3JlLFxcbi5tZGMtYnV0dG9uLS11bmVsZXZhdGVkOm5vdCgubWRjLXJpcHBsZS11cGdyYWRlZCk6Zm9jdXM6OmJlZm9yZSxcXG4ubWRjLWJ1dHRvbi0tdW5lbGV2YXRlZC5tZGMtcmlwcGxlLXVwZ3JhZGVkLS1iYWNrZ3JvdW5kLWZvY3VzZWQ6OmJlZm9yZSB7XFxuICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDc1bXM7XFxuICAgICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDc1bXM7XFxuICBvcGFjaXR5OiAwLjI0OyB9XFxuXFxuLm1kYy1idXR0b24tLXJhaXNlZDpub3QoLm1kYy1yaXBwbGUtdXBncmFkZWQpOjphZnRlcixcXG4ubWRjLWJ1dHRvbi0tdW5lbGV2YXRlZDpub3QoLm1kYy1yaXBwbGUtdXBncmFkZWQpOjphZnRlciB7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgMTUwbXMgbGluZWFyO1xcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAxNTBtcyBsaW5lYXI7IH1cXG5cXG4ubWRjLWJ1dHRvbi0tcmFpc2VkOm5vdCgubWRjLXJpcHBsZS11cGdyYWRlZCk6YWN0aXZlOjphZnRlcixcXG4ubWRjLWJ1dHRvbi0tdW5lbGV2YXRlZDpub3QoLm1kYy1yaXBwbGUtdXBncmFkZWQpOmFjdGl2ZTo6YWZ0ZXIge1xcbiAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiA3NW1zO1xcbiAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiA3NW1zO1xcbiAgb3BhY2l0eTogMC4yNDsgfVxcblxcbi5tZGMtYnV0dG9uLS1yYWlzZWQubWRjLXJpcHBsZS11cGdyYWRlZCxcXG4ubWRjLWJ1dHRvbi0tdW5lbGV2YXRlZC5tZGMtcmlwcGxlLXVwZ3JhZGVkIHtcXG4gIC0tbWRjLXJpcHBsZS1mZy1vcGFjaXR5OiAwLjI0OyB9XCIsIFwiXCJdKTtcbiIsImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIikoZmFsc2UpO1xuLy8gTW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCIubWRjLWRpYWxvZyxcXG4ubWRjLWRpYWxvZ19fc2NyaW0ge1xcbiAgcG9zaXRpb246IGZpeGVkO1xcbiAgdG9wOiAwO1xcbiAgbGVmdDogMDtcXG4gIC13ZWJraXQtYm94LWFsaWduOiBjZW50ZXI7XFxuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAtd2Via2l0LWJveC1wYWNrOiBjZW50ZXI7XFxuICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlOyB9XFxuXFxuLm1kYy1kaWFsb2cge1xcbiAgZGlzcGxheTogbm9uZTtcXG4gIHotaW5kZXg6IDc7IH1cXG4gIC5tZGMtZGlhbG9nIC5tZGMtZGlhbG9nX19zdXJmYWNlIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXG4gICAgLyogQGFsdGVybmF0ZSAqL1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtc3VyZmFjZSwgI2ZmZik7IH1cXG4gIC5tZGMtZGlhbG9nIC5tZGMtZGlhbG9nX19zY3JpbSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zMik7IH1cXG4gIC5tZGMtZGlhbG9nIC5tZGMtZGlhbG9nX190aXRsZSB7XFxuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XFxuICAubWRjLWRpYWxvZyAubWRjLWRpYWxvZ19fY29udGVudCB7XFxuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNik7IH1cXG4gIC5tZGMtZGlhbG9nLm1kYy1kaWFsb2ctLXNjcm9sbGFibGUgLm1kYy1kaWFsb2dfX3RpdGxlLFxcbiAgLm1kYy1kaWFsb2cubWRjLWRpYWxvZy0tc2Nyb2xsYWJsZSAubWRjLWRpYWxvZ19fYWN0aW9ucyB7XFxuICAgIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxcbiAgLm1kYy1kaWFsb2cgLm1kYy1kaWFsb2dfX3N1cmZhY2Uge1xcbiAgICBtaW4td2lkdGg6IDI4MHB4OyB9XFxuICBAbWVkaWEgKG1heC13aWR0aDogNTkycHgpIHtcXG4gICAgLm1kYy1kaWFsb2cgLm1kYy1kaWFsb2dfX3N1cmZhY2Uge1xcbiAgICAgIG1heC13aWR0aDogY2FsYygxMDB2dyAtIDMycHgpOyB9IH1cXG4gIEBtZWRpYSAobWluLXdpZHRoOiA1OTJweCkge1xcbiAgICAubWRjLWRpYWxvZyAubWRjLWRpYWxvZ19fc3VyZmFjZSB7XFxuICAgICAgbWF4LXdpZHRoOiA1NjBweDsgfSB9XFxuICAubWRjLWRpYWxvZyAubWRjLWRpYWxvZ19fc3VyZmFjZSB7XFxuICAgIG1heC1oZWlnaHQ6IGNhbGMoMTAwdmggLSAzMnB4KTsgfVxcbiAgLm1kYy1kaWFsb2cgLm1kYy1kaWFsb2dfX3N1cmZhY2Uge1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7IH1cXG5cXG4ubWRjLWRpYWxvZ19fc2NyaW0ge1xcbiAgb3BhY2l0eTogMDtcXG4gIHotaW5kZXg6IC0xOyB9XFxuXFxuLm1kYy1kaWFsb2dfX2NvbnRhaW5lciB7XFxuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICAtd2Via2l0LWJveC1vcmllbnQ6IGhvcml6b250YWw7XFxuICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcXG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjgpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOCk7XFxuICBvcGFjaXR5OiAwOyB9XFxuXFxuLm1kYy1kaWFsb2dfX3N1cmZhY2Uge1xcbiAgYm94LXNoYWRvdzogMHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xcbiAgZGlzcGxheTogLXdlYmtpdC1ib3g7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcXG4gIC13ZWJraXQtYm94LWRpcmVjdGlvbjogbm9ybWFsO1xcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgLXdlYmtpdC1ib3gtZmxleDogMDtcXG4gICAgICAgICAgZmxleC1ncm93OiAwO1xcbiAgZmxleC1zaHJpbms6IDA7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgbWF4LXdpZHRoOiAxMDAlO1xcbiAgbWF4LWhlaWdodDogMTAwJTsgfVxcbiAgLm1kYy1kaWFsb2dbZGlyPVxcXCJydGxcXFwiXSAubWRjLWRpYWxvZ19fc3VyZmFjZSxcXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtZGlhbG9nIC5tZGMtZGlhbG9nX19zdXJmYWNlIHtcXG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7IH1cXG5cXG4ubWRjLWRpYWxvZ19fdGl0bGUge1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBtYXJnaW4tdG9wOiAwO1xcbiAgLyogQGFsdGVybmF0ZSAqL1xcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIHNhbnMtc2VyaWY7XFxuICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XFxuICBmb250LXNpemU6IDEuMjVyZW07XFxuICBsaW5lLWhlaWdodDogMnJlbTtcXG4gIGZvbnQtd2VpZ2h0OiA1MDA7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LWRlY29yYXRpb246IGluaGVyaXQ7XFxuICB0ZXh0LXRyYW5zZm9ybTogaW5oZXJpdDtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgZmxleC1zaHJpbms6IDA7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgbWFyZ2luOiAwO1xcbiAgcGFkZGluZzogMCAyNHB4IDlweDtcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB0cmFuc3BhcmVudDsgfVxcbiAgLm1kYy1kaWFsb2dfX3RpdGxlOjpiZWZvcmUge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIHdpZHRoOiAwO1xcbiAgICBoZWlnaHQ6IDQwcHg7XFxuICAgIGNvbnRlbnQ6IFxcXCJcXFwiO1xcbiAgICB2ZXJ0aWNhbC1hbGlnbjogMDsgfVxcbiAgLm1kYy1kaWFsb2dbZGlyPVxcXCJydGxcXFwiXSAubWRjLWRpYWxvZ19fdGl0bGUsXFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLWRpYWxvZyAubWRjLWRpYWxvZ19fdGl0bGUge1xcbiAgICB0ZXh0LWFsaWduOiByaWdodDsgfVxcblxcbi5tZGMtZGlhbG9nLS1zY3JvbGxhYmxlIC5tZGMtZGlhbG9nX190aXRsZSB7XFxuICBwYWRkaW5nLWJvdHRvbTogMTVweDsgfVxcblxcbi5tZGMtZGlhbG9nX19jb250ZW50IHtcXG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIHNhbnMtc2VyaWY7XFxuICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XFxuICBmb250LXNpemU6IDFyZW07XFxuICBsaW5lLWhlaWdodDogMS41cmVtO1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAzMTI1ZW07XFxuICB0ZXh0LWRlY29yYXRpb246IGluaGVyaXQ7XFxuICB0ZXh0LXRyYW5zZm9ybTogaW5oZXJpdDtcXG4gIC13ZWJraXQtYm94LWZsZXg6IDE7XFxuICAgICAgICAgIGZsZXgtZ3JvdzogMTtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICBtYXJnaW46IDA7XFxuICBwYWRkaW5nOiAyMHB4IDI0cHg7XFxuICBvdmVyZmxvdzogYXV0bztcXG4gIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsgfVxcbiAgLm1kYy1kaWFsb2dfX2NvbnRlbnQgPiA6Zmlyc3QtY2hpbGQge1xcbiAgICBtYXJnaW4tdG9wOiAwOyB9XFxuICAubWRjLWRpYWxvZ19fY29udGVudCA+IDpsYXN0LWNoaWxkIHtcXG4gICAgbWFyZ2luLWJvdHRvbTogMDsgfVxcblxcbi5tZGMtZGlhbG9nX190aXRsZSArIC5tZGMtZGlhbG9nX19jb250ZW50IHtcXG4gIHBhZGRpbmctdG9wOiAwOyB9XFxuXFxuLm1kYy1kaWFsb2ctLXNjcm9sbGFibGUgLm1kYy1kaWFsb2dfX2NvbnRlbnQge1xcbiAgcGFkZGluZy10b3A6IDhweDtcXG4gIHBhZGRpbmctYm90dG9tOiA4cHg7IH1cXG5cXG4ubWRjLWRpYWxvZ19fY29udGVudCAubWRjLWxpc3Q6Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZCB7XFxuICBwYWRkaW5nOiA2cHggMCAwOyB9XFxuXFxuLm1kYy1kaWFsb2ctLXNjcm9sbGFibGUgLm1kYy1kaWFsb2dfX2NvbnRlbnQgLm1kYy1saXN0OmZpcnN0LWNoaWxkOmxhc3QtY2hpbGQge1xcbiAgcGFkZGluZzogMDsgfVxcblxcbi5tZGMtZGlhbG9nX19hY3Rpb25zIHtcXG4gIGRpc3BsYXk6IC13ZWJraXQtYm94O1xcbiAgZGlzcGxheTogZmxleDtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGZsZXgtc2hyaW5rOiAwO1xcbiAgZmxleC13cmFwOiB3cmFwO1xcbiAgLXdlYmtpdC1ib3gtYWxpZ246IGNlbnRlcjtcXG4gICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIC13ZWJraXQtYm94LXBhY2s6IGVuZDtcXG4gICAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICBtaW4taGVpZ2h0OiA1MnB4O1xcbiAgbWFyZ2luOiAwO1xcbiAgcGFkZGluZzogOHB4O1xcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHRyYW5zcGFyZW50OyB9XFxuICAubWRjLWRpYWxvZy0tc3RhY2tlZCAubWRjLWRpYWxvZ19fYWN0aW9ucyB7XFxuICAgIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7XFxuICAgIC13ZWJraXQtYm94LWRpcmVjdGlvbjogbm9ybWFsO1xcbiAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIC13ZWJraXQtYm94LWFsaWduOiBlbmQ7XFxuICAgICAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kOyB9XFxuXFxuLm1kYy1kaWFsb2dfX2J1dHRvbiB7XFxuICAvKiBAbm9mbGlwICovXFxuICBtYXJnaW4tbGVmdDogOHB4O1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgbWFyZ2luLXJpZ2h0OiAwO1xcbiAgbWF4LXdpZHRoOiAxMDAlO1xcbiAgdGV4dC1hbGlnbjogcmlnaHQ7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtZGlhbG9nX19idXR0b24sIC5tZGMtZGlhbG9nX19idXR0b25bZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbWFyZ2luLWxlZnQ6IDA7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbWFyZ2luLXJpZ2h0OiA4cHg7IH1cXG4gIC5tZGMtZGlhbG9nX19idXR0b246Zmlyc3QtY2hpbGQge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIG1hcmdpbi1sZWZ0OiAwO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIG1hcmdpbi1yaWdodDogMDsgfVxcbiAgICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLWRpYWxvZ19fYnV0dG9uOmZpcnN0LWNoaWxkLCAubWRjLWRpYWxvZ19fYnV0dG9uOmZpcnN0LWNoaWxkW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBtYXJnaW4tbGVmdDogMDtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgbWFyZ2luLXJpZ2h0OiAwOyB9XFxuICAubWRjLWRpYWxvZ1tkaXI9XFxcInJ0bFxcXCJdIC5tZGMtZGlhbG9nX19idXR0b24sXFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLWRpYWxvZyAubWRjLWRpYWxvZ19fYnV0dG9uIHtcXG4gICAgdGV4dC1hbGlnbjogbGVmdDsgfVxcbiAgLm1kYy1kaWFsb2ctLXN0YWNrZWQgLm1kYy1kaWFsb2dfX2J1dHRvbjpub3QoOmZpcnN0LWNoaWxkKSB7XFxuICAgIG1hcmdpbi10b3A6IDEycHg7IH1cXG5cXG4ubWRjLWRpYWxvZy0tb3BlbixcXG4ubWRjLWRpYWxvZy0tb3BlbmluZyxcXG4ubWRjLWRpYWxvZy0tY2xvc2luZyB7XFxuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcXG4gIGRpc3BsYXk6IGZsZXg7IH1cXG5cXG4ubWRjLWRpYWxvZy0tb3BlbmluZyAubWRjLWRpYWxvZ19fc2NyaW0ge1xcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IDE1MG1zIGxpbmVhcjtcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMTUwbXMgbGluZWFyOyB9XFxuXFxuLm1kYy1kaWFsb2ctLW9wZW5pbmcgLm1kYy1kaWFsb2dfX2NvbnRhaW5lciB7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgNzVtcyBsaW5lYXIsIC13ZWJraXQtdHJhbnNmb3JtIDE1MG1zIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgNzVtcyBsaW5lYXIsIC13ZWJraXQtdHJhbnNmb3JtIDE1MG1zIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgNzVtcyBsaW5lYXIsIHRyYW5zZm9ybSAxNTBtcyAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDc1bXMgbGluZWFyLCB0cmFuc2Zvcm0gMTUwbXMgMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpLCAtd2Via2l0LXRyYW5zZm9ybSAxNTBtcyAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7IH1cXG5cXG4ubWRjLWRpYWxvZy0tY2xvc2luZyAubWRjLWRpYWxvZ19fc2NyaW0sXFxuLm1kYy1kaWFsb2ctLWNsb3NpbmcgLm1kYy1kaWFsb2dfX2NvbnRhaW5lciB7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgNzVtcyBsaW5lYXI7XFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDc1bXMgbGluZWFyOyB9XFxuXFxuLm1kYy1kaWFsb2ctLWNsb3NpbmcgLm1kYy1kaWFsb2dfX2NvbnRhaW5lciB7XFxuICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7XFxuICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7IH1cXG5cXG4ubWRjLWRpYWxvZy0tb3BlbiAubWRjLWRpYWxvZ19fc2NyaW0ge1xcbiAgb3BhY2l0eTogMTsgfVxcblxcbi5tZGMtZGlhbG9nLS1vcGVuIC5tZGMtZGlhbG9nX19jb250YWluZXIge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgb3BhY2l0eTogMTsgfVxcblxcbi5tZGMtZGlhbG9nLXNjcm9sbC1sb2NrIHtcXG4gIG92ZXJmbG93OiBoaWRkZW47IH1cIiwgXCJcIl0pO1xuIiwiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiKShmYWxzZSk7XG4vLyBNb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIi5tZGMtbWVudS1zdXJmYWNlIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgbWF4LXdpZHRoOiBjYWxjKDEwMHZ3IC0gMzJweCk7XFxuICBtYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gMzJweCk7XFxuICBtYXJnaW46IDA7XFxuICBwYWRkaW5nOiAwO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiB0b3AgbGVmdDtcXG4gICAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIGxlZnQ7XFxuICBvcGFjaXR5OiAwO1xcbiAgb3ZlcmZsb3c6IGF1dG87XFxuICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtLCBvcGFjaXR5O1xcbiAgei1pbmRleDogODtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSAwLjAzcyBsaW5lYXIsIC13ZWJraXQtdHJhbnNmb3JtIDAuMTJzIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO1xcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjAzcyBsaW5lYXIsIC13ZWJraXQtdHJhbnNmb3JtIDAuMTJzIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO1xcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjAzcyBsaW5lYXIsIHRyYW5zZm9ybSAwLjEycyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMC4wM3MgbGluZWFyLCB0cmFuc2Zvcm0gMC4xMnMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSksIC13ZWJraXQtdHJhbnNmb3JtIDAuMTJzIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO1xcbiAgYm94LXNoYWRvdzogMHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1kYy10aGVtZS1zdXJmYWNlLCAjZmZmKTtcXG4gIGNvbG9yOiAjMDAwO1xcbiAgLyogQGFsdGVybmF0ZSAqL1xcbiAgY29sb3I6IHZhcigtLW1kYy10aGVtZS1vbi1zdXJmYWNlLCAjMDAwKTtcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHRyYW5zZm9ybS1vcmlnaW4tbGVmdDogdG9wIGxlZnQ7XFxuICAvKiBAbm9mbGlwICovXFxuICB0cmFuc2Zvcm0tb3JpZ2luLXJpZ2h0OiB0b3AgcmlnaHQ7IH1cXG4gIC5tZGMtbWVudS1zdXJmYWNlOmZvY3VzIHtcXG4gICAgb3V0bGluZTogbm9uZTsgfVxcbiAgLm1kYy1tZW51LXN1cmZhY2UtLW9wZW4ge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICBvcGFjaXR5OiAxOyB9XFxuICAubWRjLW1lbnUtc3VyZmFjZS0tYW5pbWF0aW5nLW9wZW4ge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC44KTtcXG4gICAgb3BhY2l0eTogMDsgfVxcbiAgLm1kYy1tZW51LXN1cmZhY2UtLWFuaW1hdGluZy1jbG9zZWQge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIG9wYWNpdHk6IDA7XFxuICAgIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSAwLjA3NXMgbGluZWFyO1xcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMDc1cyBsaW5lYXI7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtbWVudS1zdXJmYWNlLCAubWRjLW1lbnUtc3VyZmFjZVtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICB0cmFuc2Zvcm0tb3JpZ2luLWxlZnQ6IHRvcCByaWdodDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICB0cmFuc2Zvcm0tb3JpZ2luLXJpZ2h0OiB0b3AgbGVmdDsgfVxcblxcbi5tZGMtbWVudS1zdXJmYWNlLS1hbmNob3Ige1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgb3ZlcmZsb3c6IHZpc2libGU7IH1cXG5cXG4ubWRjLW1lbnUtc3VyZmFjZS0tZml4ZWQge1xcbiAgcG9zaXRpb246IGZpeGVkOyB9XCIsIFwiXCJdKTtcbiIsImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIikoZmFsc2UpO1xuLy8gTW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJALXdlYmtpdC1rZXlmcmFtZXMgbWRjLXNlbGVjdC1mbG9hdC1uYXRpdmUtY29udHJvbCB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7XFxuICAgIG9wYWNpdHk6IDA7IH1cXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XFxuICAgIG9wYWNpdHk6IDE7IH0gfVxcblxcbkBrZXlmcmFtZXMgbWRjLXNlbGVjdC1mbG9hdC1uYXRpdmUtY29udHJvbCB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7XFxuICAgIG9wYWNpdHk6IDA7IH1cXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XFxuICAgIG9wYWNpdHk6IDE7IH0gfVxcblxcbi5tZGMtbGluZS1yaXBwbGUge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgYm90dG9tOiAwO1xcbiAgbGVmdDogMDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAycHg7XFxuICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDApO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgwKTtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSAxODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpLCAtd2Via2l0LXRyYW5zZm9ybSAxODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAxODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpLCAtd2Via2l0LXRyYW5zZm9ybSAxODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDE4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksIG9wYWNpdHkgMTgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAxODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpLCBvcGFjaXR5IDE4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksIC13ZWJraXQtdHJhbnNmb3JtIDE4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICBvcGFjaXR5OiAwO1xcbiAgei1pbmRleDogMjsgfVxcblxcbi5tZGMtbGluZS1yaXBwbGUtLWFjdGl2ZSB7XFxuICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKTtcXG4gIG9wYWNpdHk6IDE7IH1cXG5cXG4ubWRjLWxpbmUtcmlwcGxlLS1kZWFjdGl2YXRpbmcge1xcbiAgb3BhY2l0eTogMDsgfVxcblxcbi5tZGMtbm90Y2hlZC1vdXRsaW5lIHtcXG4gIGRpc3BsYXk6IC13ZWJraXQtYm94O1xcbiAgZGlzcGxheTogZmxleDtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHJpZ2h0OiAwO1xcbiAgbGVmdDogMDtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICB3aWR0aDogMTAwJTtcXG4gIG1heC13aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHRleHQtYWxpZ246IGxlZnQ7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTsgfVxcbiAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy1ub3RjaGVkLW91dGxpbmUsIC5tZGMtbm90Y2hlZC1vdXRsaW5lW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHRleHQtYWxpZ246IHJpZ2h0OyB9XFxuICAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZywgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLCAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcge1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBoZWlnaHQ6IDEwMCU7XFxuICAgIC13ZWJraXQtdHJhbnNpdGlvbjogYm9yZGVyIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAgIHRyYW5zaXRpb246IGJvcmRlciAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQ7XFxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZDtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7IH1cXG4gIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGJvcmRlci1yaWdodDogbm9uZTtcXG4gICAgd2lkdGg6IDEycHg7IH1cXG4gICAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBib3JkZXItbGVmdDogbm9uZTtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQ7IH1cXG4gIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgYm9yZGVyLWxlZnQ6IG5vbmU7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQ7XFxuICAgIC13ZWJraXQtYm94LWZsZXg6IDE7XFxuICAgICAgICAgICAgZmxleC1ncm93OiAxOyB9XFxuICAgIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZywgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkO1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBib3JkZXItcmlnaHQ6IG5vbmU7IH1cXG4gIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCB7XFxuICAgIC13ZWJraXQtYm94LWZsZXg6IDA7XFxuICAgICAgICAgICAgZmxleDogMCAwIGF1dG87XFxuICAgIHdpZHRoOiBhdXRvO1xcbiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDEycHggKiAyKTsgfVxcbiAgLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICB0b3A6IDE3cHg7XFxuICAgIGJvdHRvbTogYXV0bztcXG4gICAgbWF4LXdpZHRoOiAxMDAlOyB9XFxuICAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICAgIHRleHQtb3ZlcmZsb3c6IGNsaXA7IH1cXG4gIC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICAgIG1heC13aWR0aDogY2FsYygxMDAlIC8gLjc1KTsgfVxcblxcbi5tZGMtbm90Y2hlZC1vdXRsaW5lLS1ub3RjaGVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCB7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLWxlZnQ6IDA7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLXJpZ2h0OiA4cHg7XFxuICBib3JkZXItdG9wOiBub25lOyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLW5vdGNoZWQtb3V0bGluZS0tbm90Y2hlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsIC5tZGMtbm90Y2hlZC1vdXRsaW5lLS1ub3RjaGVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLWxlZnQ6IDhweDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLXJpZ2h0OiAwOyB9XFxuXFxuLm1kYy1ub3RjaGVkLW91dGxpbmUtLW5vLWxhYmVsIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCB7XFxuICBwYWRkaW5nOiAwOyB9XFxuXFxuLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICBmb250LWZhbWlseTogUm9ib3RvLCBzYW5zLXNlcmlmO1xcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcXG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xcbiAgZm9udC1zaXplOiAxcmVtO1xcbiAgbGluZS1oZWlnaHQ6IDEuNzVyZW07XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDA5MzdlbTtcXG4gIHRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDtcXG4gIHRleHQtdHJhbnNmb3JtOiBpbmhlcml0O1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgbGVmdDogMDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7XFxuICAgICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgdG9wO1xcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBjb2xvciAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpLCAtd2Via2l0LXRyYW5zZm9ybSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgdHJhbnNpdGlvbjogY29sb3IgMTUwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKSwgLXdlYmtpdC10cmFuc2Zvcm0gMTUwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpLCBjb2xvciAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksIGNvbG9yIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksIC13ZWJraXQtdHJhbnNmb3JtIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBsaW5lLWhlaWdodDogMS4xNXJlbTtcXG4gIHRleHQtYWxpZ246IGxlZnQ7XFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICBjdXJzb3I6IHRleHQ7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsgfVxcbiAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy1mbG9hdGluZy1sYWJlbCwgLm1kYy1mbG9hdGluZy1sYWJlbFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogMDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBsZWZ0OiBhdXRvO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IHRvcDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICB0ZXh0LWFsaWduOiByaWdodDsgfVxcblxcbi5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gIGN1cnNvcjogYXV0bzsgfVxcblxcbi5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7IH1cXG5cXG4ubWRjLWZsb2F0aW5nLWxhYmVsLS1zaGFrZSB7XFxuICAtd2Via2l0LWFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXN0YW5kYXJkIDI1MG1zIDE7XFxuICAgICAgICAgIGFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXN0YW5kYXJkIDI1MG1zIDE7IH1cXG5cXG5ALXdlYmtpdC1rZXlmcmFtZXMgbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXN0YW5kYXJkIHtcXG4gIDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC01MCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDMzJSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDY2JSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMCUpKSB0cmFuc2xhdGVZKC01MCUpIHNjYWxlKDAuNzUpOyB9XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC01MCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7IH0gfVxcblxcbkBrZXlmcmFtZXMgbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXN0YW5kYXJkIHtcXG4gIDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC01MCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDMzJSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDY2JSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMCUpKSB0cmFuc2xhdGVZKC01MCUpIHNjYWxlKDAuNzUpOyB9XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC01MCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7IH0gfVxcblxcbkAtd2Via2l0LWtleWZyYW1lcyBtZGMtcmlwcGxlLWZnLXJhZGl1cy1pbiB7XFxuICBmcm9tIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tbWRjLXJpcHBsZS1mZy10cmFuc2xhdGUtc3RhcnQsIDApKSBzY2FsZSgxKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1zdGFydCwgMCkpIHNjYWxlKDEpOyB9XFxuICB0byB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tbWRjLXJpcHBsZS1mZy10cmFuc2xhdGUtZW5kLCAwKSkgc2NhbGUodmFyKC0tbWRjLXJpcHBsZS1mZy1zY2FsZSwgMSkpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLWVuZCwgMCkpIHNjYWxlKHZhcigtLW1kYy1yaXBwbGUtZmctc2NhbGUsIDEpKTsgfSB9XFxuXFxuQGtleWZyYW1lcyBtZGMtcmlwcGxlLWZnLXJhZGl1cy1pbiB7XFxuICBmcm9tIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tbWRjLXJpcHBsZS1mZy10cmFuc2xhdGUtc3RhcnQsIDApKSBzY2FsZSgxKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1zdGFydCwgMCkpIHNjYWxlKDEpOyB9XFxuICB0byB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tbWRjLXJpcHBsZS1mZy10cmFuc2xhdGUtZW5kLCAwKSkgc2NhbGUodmFyKC0tbWRjLXJpcHBsZS1mZy1zY2FsZSwgMSkpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLWVuZCwgMCkpIHNjYWxlKHZhcigtLW1kYy1yaXBwbGUtZmctc2NhbGUsIDEpKTsgfSB9XFxuXFxuQC13ZWJraXQta2V5ZnJhbWVzIG1kYy1yaXBwbGUtZmctb3BhY2l0eS1pbiB7XFxuICBmcm9tIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyO1xcbiAgICBvcGFjaXR5OiAwOyB9XFxuICB0byB7XFxuICAgIG9wYWNpdHk6IHZhcigtLW1kYy1yaXBwbGUtZmctb3BhY2l0eSwgMCk7IH0gfVxcblxcbkBrZXlmcmFtZXMgbWRjLXJpcHBsZS1mZy1vcGFjaXR5LWluIHtcXG4gIGZyb20ge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7XFxuICAgIG9wYWNpdHk6IDA7IH1cXG4gIHRvIHtcXG4gICAgb3BhY2l0eTogdmFyKC0tbWRjLXJpcHBsZS1mZy1vcGFjaXR5LCAwKTsgfSB9XFxuXFxuQC13ZWJraXQta2V5ZnJhbWVzIG1kYy1yaXBwbGUtZmctb3BhY2l0eS1vdXQge1xcbiAgZnJvbSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjtcXG4gICAgb3BhY2l0eTogdmFyKC0tbWRjLXJpcHBsZS1mZy1vcGFjaXR5LCAwKTsgfVxcbiAgdG8ge1xcbiAgICBvcGFjaXR5OiAwOyB9IH1cXG5cXG5Aa2V5ZnJhbWVzIG1kYy1yaXBwbGUtZmctb3BhY2l0eS1vdXQge1xcbiAgZnJvbSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjtcXG4gICAgb3BhY2l0eTogdmFyKC0tbWRjLXJpcHBsZS1mZy1vcGFjaXR5LCAwKTsgfVxcbiAgdG8ge1xcbiAgICBvcGFjaXR5OiAwOyB9IH1cXG5cXG4ubWRjLXJpcHBsZS1zdXJmYWNlLS10ZXN0LWVkZ2UtdmFyLWJ1ZyB7XFxuICAtLW1kYy1yaXBwbGUtc3VyZmFjZS10ZXN0LWVkZ2UtdmFyOiAxcHggc29saWQgIzAwMDtcXG4gIHZpc2liaWxpdHk6IGhpZGRlbjsgfVxcbiAgLm1kYy1yaXBwbGUtc3VyZmFjZS0tdGVzdC1lZGdlLXZhci1idWc6OmJlZm9yZSB7XFxuICAgIGJvcmRlcjogdmFyKC0tbWRjLXJpcHBsZS1zdXJmYWNlLXRlc3QtZWRnZS12YXIpOyB9XFxuXFxuLm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpIC5tZGMtc2VsZWN0X19pY29uIHtcXG4gIGNvbG9yOiAjMDAwO1xcbiAgLyogQGFsdGVybmF0ZSAqL1xcbiAgY29sb3I6IHZhcigtLW1kYy10aGVtZS1vbi1zdXJmYWNlLCAjMDAwKTsgfVxcblxcbi5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbiAubWRjLXNlbGVjdF9faWNvbiB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBib3R0b206IDE2cHg7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgd2lkdGg6IDI0cHg7XFxuICBoZWlnaHQ6IDI0cHg7XFxuICBib3JkZXI6IG5vbmU7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gIGZpbGw6IGN1cnJlbnRDb2xvcjtcXG4gIG9wYWNpdHk6IDAuNTQ7XFxuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xcbiAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lOyB9XFxuXFxuLm1kYy1zZWxlY3RfX2ljb246bm90KFt0YWJpbmRleF0pLFxcbi5tZGMtc2VsZWN0X19pY29uW3RhYmluZGV4PVxcXCItMVxcXCJdIHtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lOyB9XFxuXFxuLm1kYy1zZWxlY3QtaGVscGVyLXRleHQge1xcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgc2Fucy1zZXJpZjtcXG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XFxuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcXG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcXG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAzMzMzZW07XFxuICB0ZXh0LWRlY29yYXRpb246IGluaGVyaXQ7XFxuICB0ZXh0LXRyYW5zZm9ybTogaW5oZXJpdDtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWFyZ2luLXRvcDogMDtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGxpbmUtaGVpZ2h0OiBub3JtYWw7XFxuICBtYXJnaW46IDA7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgMTgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMTgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gIG9wYWNpdHk6IDA7XFxuICB3aWxsLWNoYW5nZTogb3BhY2l0eTsgfVxcbiAgLm1kYy1zZWxlY3QtaGVscGVyLXRleHQ6OmJlZm9yZSB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgd2lkdGg6IDA7XFxuICAgIGhlaWdodDogMTZweDtcXG4gICAgY29udGVudDogXFxcIlxcXCI7XFxuICAgIHZlcnRpY2FsLWFsaWduOiAwOyB9XFxuXFxuLm1kYy1zZWxlY3QtaGVscGVyLXRleHQtLXBlcnNpc3RlbnQge1xcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBub25lO1xcbiAgdHJhbnNpdGlvbjogbm9uZTtcXG4gIG9wYWNpdHk6IDE7XFxuICB3aWxsLWNoYW5nZTogaW5pdGlhbDsgfVxcblxcbi5tZGMtc2VsZWN0IHtcXG4gIC0tbWRjLXJpcHBsZS1mZy1zaXplOiAwO1xcbiAgLS1tZGMtcmlwcGxlLWxlZnQ6IDA7XFxuICAtLW1kYy1yaXBwbGUtdG9wOiAwO1xcbiAgLS1tZGMtcmlwcGxlLWZnLXNjYWxlOiAxO1xcbiAgLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1lbmQ6IDA7XFxuICAtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLXN0YXJ0OiAwO1xcbiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApO1xcbiAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybSwgb3BhY2l0eTtcXG4gIGRpc3BsYXk6IC13ZWJraXQtaW5saW5lLWJveDtcXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIGhlaWdodDogNTZweDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICB3aWxsLWNoYW5nZTogb3BhY2l0eSwgdHJhbnNmb3JtLCBjb2xvcjsgfVxcbiAgLm1kYy1zZWxlY3Q6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZXNtb2tlOyB9XFxuICAubWRjLXNlbGVjdDo6YmVmb3JlLCAubWRjLXNlbGVjdDo6YWZ0ZXIge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcXG4gICAgb3BhY2l0eTogMDtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxuICAgIGNvbnRlbnQ6IFxcXCJcXFwiOyB9XFxuICAubWRjLXNlbGVjdDo6YmVmb3JlIHtcXG4gICAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IDE1bXMgbGluZWFyLCBiYWNrZ3JvdW5kLWNvbG9yIDE1bXMgbGluZWFyO1xcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDE1bXMgbGluZWFyLCBiYWNrZ3JvdW5kLWNvbG9yIDE1bXMgbGluZWFyO1xcbiAgICB6LWluZGV4OiAxOyB9XFxuICAubWRjLXNlbGVjdC5tZGMtcmlwcGxlLXVwZ3JhZGVkOjpiZWZvcmUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUodmFyKC0tbWRjLXJpcHBsZS1mZy1zY2FsZSwgMSkpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tbWRjLXJpcHBsZS1mZy1zY2FsZSwgMSkpOyB9XFxuICAubWRjLXNlbGVjdC5tZGMtcmlwcGxlLXVwZ3JhZGVkOjphZnRlciB7XFxuICAgIHRvcDogMDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBsZWZ0OiAwO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7IH1cXG4gIC5tZGMtc2VsZWN0Lm1kYy1yaXBwbGUtdXBncmFkZWQtLXVuYm91bmRlZDo6YWZ0ZXIge1xcbiAgICB0b3A6IHZhcigtLW1kYy1yaXBwbGUtdG9wLCAwKTtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBsZWZ0OiB2YXIoLS1tZGMtcmlwcGxlLWxlZnQsIDApOyB9XFxuICAubWRjLXNlbGVjdC5tZGMtcmlwcGxlLXVwZ3JhZGVkLS1mb3JlZ3JvdW5kLWFjdGl2YXRpb246OmFmdGVyIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb246IG1kYy1yaXBwbGUtZmctcmFkaXVzLWluIDIyNW1zIGZvcndhcmRzLCBtZGMtcmlwcGxlLWZnLW9wYWNpdHktaW4gNzVtcyBmb3J3YXJkcztcXG4gICAgICAgICAgICBhbmltYXRpb246IG1kYy1yaXBwbGUtZmctcmFkaXVzLWluIDIyNW1zIGZvcndhcmRzLCBtZGMtcmlwcGxlLWZnLW9wYWNpdHktaW4gNzVtcyBmb3J3YXJkczsgfVxcbiAgLm1kYy1zZWxlY3QubWRjLXJpcHBsZS11cGdyYWRlZC0tZm9yZWdyb3VuZC1kZWFjdGl2YXRpb246OmFmdGVyIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb246IG1kYy1yaXBwbGUtZmctb3BhY2l0eS1vdXQgMTUwbXM7XFxuICAgICAgICAgICAgYW5pbWF0aW9uOiBtZGMtcmlwcGxlLWZnLW9wYWNpdHktb3V0IDE1MG1zO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLWVuZCwgMCkpIHNjYWxlKHZhcigtLW1kYy1yaXBwbGUtZmctc2NhbGUsIDEpKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1lbmQsIDApKSBzY2FsZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXNjYWxlLCAxKSk7IH1cXG4gIC5tZGMtc2VsZWN0OjpiZWZvcmUsIC5tZGMtc2VsZWN0OjphZnRlciB7XFxuICAgIHRvcDogY2FsYyg1MCUgLSAxMDAlKTtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBsZWZ0OiBjYWxjKDUwJSAtIDEwMCUpO1xcbiAgICB3aWR0aDogMjAwJTtcXG4gICAgaGVpZ2h0OiAyMDAlOyB9XFxuICAubWRjLXNlbGVjdC5tZGMtcmlwcGxlLXVwZ3JhZGVkOjphZnRlciB7XFxuICAgIHdpZHRoOiB2YXIoLS1tZGMtcmlwcGxlLWZnLXNpemUsIDEwMCUpO1xcbiAgICBoZWlnaHQ6IHZhcigtLW1kYy1yaXBwbGUtZmctc2l6ZSwgMTAwJSk7IH1cXG4gIC5tZGMtc2VsZWN0OjpiZWZvcmUsIC5tZGMtc2VsZWN0OjphZnRlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cXG4gIC5tZGMtc2VsZWN0OmhvdmVyOjpiZWZvcmUge1xcbiAgICBvcGFjaXR5OiAwLjA0OyB9XFxuICAubWRjLXNlbGVjdDpub3QoLm1kYy1yaXBwbGUtdXBncmFkZWQpOmZvY3VzOjpiZWZvcmUsIC5tZGMtc2VsZWN0Lm1kYy1yaXBwbGUtdXBncmFkZWQtLWJhY2tncm91bmQtZm9jdXNlZDo6YmVmb3JlIHtcXG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiA3NW1zO1xcbiAgICAgICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDc1bXM7XFxuICAgIG9wYWNpdHk6IDAuMTI7IH1cXG4gIC5tZGMtc2VsZWN0Om5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpIC5tZGMtc2VsZWN0X19uYXRpdmUtY29udHJvbCxcXG4gIC5tZGMtc2VsZWN0Om5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpIC5tZGMtc2VsZWN0X19zZWxlY3RlZC10ZXh0IHtcXG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cXG4gIC5tZGMtc2VsZWN0Om5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpIC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjYpOyB9XFxuICAubWRjLXNlbGVjdDpub3QoLm1kYy1zZWxlY3QtLWRpc2FibGVkKSAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2wsXFxuICAubWRjLXNlbGVjdDpub3QoLm1kYy1zZWxlY3QtLWRpc2FibGVkKSAubWRjLXNlbGVjdF9fc2VsZWN0ZWQtdGV4dCB7XFxuICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40Mik7IH1cXG4gIC5tZGMtc2VsZWN0Om5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpICsgLm1kYy1zZWxlY3QtaGVscGVyLXRleHQge1xcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjYpOyB9XFxuICAubWRjLXNlbGVjdCwgLm1kYy1zZWxlY3RfX25hdGl2ZS1jb250cm9sIHtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4IDRweCAwIDA7IH1cXG4gIC5tZGMtc2VsZWN0Om5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpLm1kYy1zZWxlY3QtLWZvY3VzZWQgLm1kYy1saW5lLXJpcHBsZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM2MjAwZWU7XFxuICAgIC8qIEBhbHRlcm5hdGUgKi9cXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWRjLXRoZW1lLXByaW1hcnksICM2MjAwZWUpOyB9XFxuICAubWRjLXNlbGVjdDpub3QoLm1kYy1zZWxlY3QtLWRpc2FibGVkKS5tZGMtc2VsZWN0LS1mb2N1c2VkIC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgICBjb2xvcjogcmdiYSg5OCwgMCwgMjM4LCAwLjg3KTsgfVxcbiAgLm1kYy1zZWxlY3Q6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkgLm1kYy1zZWxlY3RfX25hdGl2ZS1jb250cm9sOmhvdmVyIHtcXG4gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxcbiAgLm1kYy1zZWxlY3QgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTcwJSkgc2NhbGUoMC43NSk7IH1cXG4gIC5tZGMtc2VsZWN0IC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IDE2cHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcmlnaHQ6IGluaXRpYWw7XFxuICAgIHRvcDogMjFweDtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7IH1cXG4gICAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy1zZWxlY3QgLm1kYy1mbG9hdGluZy1sYWJlbCwgLm1kYy1zZWxlY3QgLm1kYy1mbG9hdGluZy1sYWJlbFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgbGVmdDogaW5pdGlhbDtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgcmlnaHQ6IDE2cHg7IH1cXG4gIC5tZGMtc2VsZWN0Lm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uIC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IDQ4cHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcmlnaHQ6IGluaXRpYWw7IH1cXG4gICAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy1zZWxlY3QubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy1mbG9hdGluZy1sYWJlbCwgLm1kYy1zZWxlY3QubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy1mbG9hdGluZy1sYWJlbFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgbGVmdDogaW5pdGlhbDtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgcmlnaHQ6IDQ4cHg7IH1cXG4gIC5tZGMtc2VsZWN0Lm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IDRweDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogaW5pdGlhbDtcXG4gICAgdG9wOiAxN3B4OyB9XFxuICAgIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtc2VsZWN0Lm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtZmxvYXRpbmctbGFiZWwsIC5tZGMtc2VsZWN0Lm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtZmxvYXRpbmctbGFiZWxbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIGxlZnQ6IGluaXRpYWw7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIHJpZ2h0OiA0cHg7IH1cXG4gIC5tZGMtc2VsZWN0Lm1kYy1zZWxlY3QtLW91dGxpbmVkLm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uIC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IDM2cHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcmlnaHQ6IGluaXRpYWw7IH1cXG4gICAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy1zZWxlY3QubWRjLXNlbGVjdC0tb3V0bGluZWQubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy1mbG9hdGluZy1sYWJlbCwgLm1kYy1zZWxlY3QubWRjLXNlbGVjdC0tb3V0bGluZWQubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy1mbG9hdGluZy1sYWJlbFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgbGVmdDogaW5pdGlhbDtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgcmlnaHQ6IDM2cHg7IH1cXG4gICAgLm1kYy1zZWxlY3QubWRjLXNlbGVjdC0tb3V0bGluZWQubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBsZWZ0OiAzNnB4O1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICByaWdodDogaW5pdGlhbDsgfVxcbiAgICAgIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtc2VsZWN0Lm1kYy1zZWxlY3QtLW91dGxpbmVkLm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlLCAubWRjLXNlbGVjdC5tZGMtc2VsZWN0LS1vdXRsaW5lZC5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbiAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZVtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICAgIGxlZnQ6IGluaXRpYWw7XFxuICAgICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgICByaWdodDogMzZweDsgfVxcbiAgLm1kYy1zZWxlY3RfX2Ryb3Bkb3duLWljb24ge1xcbiAgICBiYWNrZ3JvdW5kOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmclMjB3aWR0aCUzRCUyMjEwcHglMjIlMjBoZWlnaHQlM0QlMjI1cHglMjIlMjB2aWV3Qm94JTNEJTIyNyUyMDEwJTIwMTAlMjA1JTIyJTIwdmVyc2lvbiUzRCUyMjEuMSUyMiUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJTIyJTIweG1sbnMlM0F4bGluayUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMTk5OSUyRnhsaW5rJTIyJTNFJTBBJTIwJTIwJTIwJTIwJTNDcG9seWdvbiUyMGlkJTNEJTIyU2hhcGUlMjIlMjBzdHJva2UlM0QlMjJub25lJTIyJTIwZmlsbCUzRCUyMiUyMzAwMCUyMiUyMGZpbGwtcnVsZSUzRCUyMmV2ZW5vZGQlMjIlMjBvcGFjaXR5JTNEJTIyMC41NCUyMiUyMHBvaW50cyUzRCUyMjclMjAxMCUyMDEyJTIwMTUlMjAxNyUyMDEwJTIyJTNFJTNDJTJGcG9seWdvbiUzRSUwQSUzQyUyRnN2ZyUzRVxcXCIpIG5vLXJlcGVhdCBjZW50ZXI7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogYXV0bztcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogOHB4O1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGJvdHRvbTogMTZweDtcXG4gICAgd2lkdGg6IDI0cHg7XFxuICAgIGhlaWdodDogMjRweDtcXG4gICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMTUwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksIC13ZWJraXQtdHJhbnNmb3JtIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lOyB9XFxuICAgIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtc2VsZWN0X19kcm9wZG93bi1pY29uLCAubWRjLXNlbGVjdF9fZHJvcGRvd24taWNvbltkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgbGVmdDogOHB4O1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICByaWdodDogYXV0bzsgfVxcbiAgICAubWRjLXNlbGVjdC0tZm9jdXNlZCAubWRjLXNlbGVjdF9fZHJvcGRvd24taWNvbiB7XFxuICAgICAgYmFja2dyb3VuZDogdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnJTIwd2lkdGglM0QlMjIxMHB4JTIyJTIwaGVpZ2h0JTNEJTIyNXB4JTIyJTIwdmlld0JveCUzRCUyMjclMjAxMCUyMDEwJTIwNSUyMiUyMHZlcnNpb24lM0QlMjIxLjElMjIlMjB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMjAwMCUyRnN2ZyUyMiUyMHhtbG5zJTNBeGxpbmslM0QlMjJodHRwJTNBJTJGJTJGd3d3LnczLm9yZyUyRjE5OTklMkZ4bGluayUyMiUzRSUwQSUyMCUyMCUyMCUyMCUzQ3BvbHlnb24lMjBpZCUzRCUyMlNoYXBlJTIyJTIwc3Ryb2tlJTNEJTIybm9uZSUyMiUyMGZpbGwlM0QlMjIlMjM2MjAwZWUlMjIlMjBmaWxsLXJ1bGUlM0QlMjJldmVub2RkJTIyJTIwb3BhY2l0eSUzRCUyMjElMjIlMjBwb2ludHMlM0QlMjI3JTIwMTAlMjAxMiUyMDE1JTIwMTclMjAxMCUyMiUzRSUzQyUyRnBvbHlnb24lM0UlMEElM0MlMkZzdmclM0VcXFwiKSBuby1yZXBlYXQgY2VudGVyO1xcbiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKSB0cmFuc2xhdGVZKC01cHgpO1xcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKSB0cmFuc2xhdGVZKC01cHgpO1xcbiAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMTUwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpLCAtd2Via2l0LXRyYW5zZm9ybSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOyB9XFxuICAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2wge1xcbiAgICBwYWRkaW5nLXRvcDogMjBweDsgfVxcbiAgLm1kYy1zZWxlY3QubWRjLXNlbGVjdC0tZm9jdXNlZCAubWRjLWxpbmUtcmlwcGxlOjphZnRlciB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLCAyKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEsIDIpO1xcbiAgICBvcGFjaXR5OiAxOyB9XFxuXFxuLm1kYy1zZWxlY3QgKyAubWRjLXNlbGVjdC1oZWxwZXItdGV4dCB7XFxuICBtYXJnaW4tcmlnaHQ6IDEycHg7XFxuICBtYXJnaW4tbGVmdDogMTJweDsgfVxcblxcbi5tZGMtc2VsZWN0LS1vdXRsaW5lZCArIC5tZGMtc2VsZWN0LWhlbHBlci10ZXh0IHtcXG4gIG1hcmdpbi1yaWdodDogMTZweDtcXG4gIG1hcmdpbi1sZWZ0OiAxNnB4OyB9XFxuXFxuLm1kYy1zZWxlY3QtLWZvY3VzZWQgKyAubWRjLXNlbGVjdC1oZWxwZXItdGV4dDpub3QoLm1kYy1zZWxlY3QtaGVscGVyLXRleHQtLXZhbGlkYXRpb24tbXNnKSB7XFxuICBvcGFjaXR5OiAxOyB9XFxuXFxuLm1kYy1zZWxlY3RfX3NlbGVjdGVkLXRleHQge1xcbiAgbWluLXdpZHRoOiAyMDBweDtcXG4gIHBhZGRpbmctdG9wOiAyMnB4OyB9XFxuXFxuLm1kYy1zZWxlY3RfX25hdGl2ZS1jb250cm9sLFxcbi5tZGMtc2VsZWN0X19zZWxlY3RlZC10ZXh0IHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctbGVmdDogMTZweDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctcmlnaHQ6IDUycHg7XFxuICBmb250LWZhbWlseTogUm9ib3RvLCBzYW5zLXNlcmlmO1xcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcXG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xcbiAgZm9udC1zaXplOiAxcmVtO1xcbiAgbGluZS1oZWlnaHQ6IDEuNzVyZW07XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDA5MzdlbTtcXG4gIHRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDtcXG4gIHRleHQtdHJhbnNmb3JtOiBpbmhlcml0O1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiA1NnB4O1xcbiAgcGFkZGluZy10b3A6IDIwcHg7XFxuICBwYWRkaW5nLWJvdHRvbTogNHB4O1xcbiAgYm9yZGVyOiBub25lO1xcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkO1xcbiAgb3V0bGluZTogbm9uZTtcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgY29sb3I6IGluaGVyaXQ7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xcbiAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xcbiAgICAgICAgICBhcHBlYXJhbmNlOiBub25lOyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2wsIC5tZGMtc2VsZWN0X19uYXRpdmUtY29udHJvbFtkaXI9XFxcInJ0bFxcXCJdLCBbZGlyPVxcXCJydGxcXFwiXVxcbiAgLm1kYy1zZWxlY3RfX3NlbGVjdGVkLXRleHQsXFxuICAubWRjLXNlbGVjdF9fc2VsZWN0ZWQtdGV4dFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLWxlZnQ6IDUycHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcGFkZGluZy1yaWdodDogMTZweDsgfVxcbiAgLm1kYy1zZWxlY3RfX25hdGl2ZS1jb250cm9sOjotbXMtZXhwYW5kLFxcbiAgLm1kYy1zZWxlY3RfX3NlbGVjdGVkLXRleHQ6Oi1tcy1leHBhbmQge1xcbiAgICBkaXNwbGF5OiBub25lOyB9XFxuICAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2w6Oi1tcy12YWx1ZSxcXG4gIC5tZGMtc2VsZWN0X19zZWxlY3RlZC10ZXh0OjotbXMtdmFsdWUge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgY29sb3I6IGluaGVyaXQ7IH1cXG5cXG5ALW1vei1kb2N1bWVudCB1cmwtcHJlZml4KFxcXCJcXFwiKSB7XFxuICAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2wsXFxuICAubWRjLXNlbGVjdF9fc2VsZWN0ZWQtdGV4dCB7XFxuICAgIHRleHQtaW5kZW50OiAtMnB4OyB9IH1cXG5cXG4ubWRjLXNlbGVjdC0tb3V0bGluZWQge1xcbiAgYm9yZGVyOiBub25lO1xcbiAgb3ZlcmZsb3c6IHZpc2libGU7IH1cXG4gIC5tZGMtc2VsZWN0LS1vdXRsaW5lZDpub3QoLm1kYy1zZWxlY3QtLWRpc2FibGVkKSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyB9XFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbiAgLm1kYy1zZWxlY3QtLW91dGxpbmVkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICAgIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI0KTsgfVxcbiAgLm1kYy1zZWxlY3QtLW91dGxpbmVkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpOm5vdCgubWRjLXNlbGVjdC0tZm9jdXNlZCkgLm1kYy1zZWxlY3RfX25hdGl2ZS1jb250cm9sOmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCk6bm90KC5tZGMtc2VsZWN0LS1mb2N1c2VkKSAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2w6aG92ZXIgfiAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCk6bm90KC5tZGMtc2VsZWN0LS1mb2N1c2VkKSAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2w6aG92ZXIgfiAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcsXFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCk6bm90KC5tZGMtc2VsZWN0LS1mb2N1c2VkKSAubWRjLXNlbGVjdF9fc2VsZWN0ZWQtdGV4dDpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nLFxcbiAgLm1kYy1zZWxlY3QtLW91dGxpbmVkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpOm5vdCgubWRjLXNlbGVjdC0tZm9jdXNlZCkgLm1kYy1zZWxlY3RfX3NlbGVjdGVkLXRleHQ6aG92ZXIgfiAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCk6bm90KC5tZGMtc2VsZWN0LS1mb2N1c2VkKSAubWRjLXNlbGVjdF9fc2VsZWN0ZWQtdGV4dDpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICAgIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxcbiAgLm1kYy1zZWxlY3QtLW91dGxpbmVkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpLm1kYy1zZWxlY3QtLWZvY3VzZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkubWRjLXNlbGVjdC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkubWRjLXNlbGVjdC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcge1xcbiAgICBib3JkZXItd2lkdGg6IDJweDsgfVxcbiAgLm1kYy1zZWxlY3QtLW91dGxpbmVkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpLm1kYy1zZWxlY3QtLWZvY3VzZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkubWRjLXNlbGVjdC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkubWRjLXNlbGVjdC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcge1xcbiAgICBib3JkZXItY29sb3I6ICM2MjAwZWU7XFxuICAgIC8qIEBhbHRlcm5hdGUgKi9cXG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtcHJpbWFyeSwgIzYyMDBlZSk7IH1cXG4gIC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1zaGFrZSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1vdXRsaW5lZCAyNTBtcyAxO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXRleHQtZmllbGQtb3V0bGluZWQgMjUwbXMgMTsgfVxcbiAgLm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHggMCAwIDRweDsgfVxcbiAgICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXNlbGVjdC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsIC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZ1tkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgYm9yZGVyLXJhZGl1czogMCA0cHggNHB4IDA7IH1cXG4gIC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGJvcmRlci1yYWRpdXM6IDAgNHB4IDRweCAwOyB9XFxuICAgIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcsIC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmdbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweCAwIDAgNHB4OyB9XFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQgLm1kYy1zZWxlY3RfX25hdGl2ZS1jb250cm9sIHtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4OyB9XFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQ6OmJlZm9yZSwgLm1kYy1zZWxlY3QtLW91dGxpbmVkOjphZnRlciB7XFxuICAgIGNvbnRlbnQ6IG5vbmU7IH1cXG4gIC5tZGMtc2VsZWN0LS1vdXRsaW5lZDpub3QoLm1kYy1zZWxlY3QtLWRpc2FibGVkKSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyB9XFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTQ0JSkgc2NhbGUoMSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xNDQlKSBzY2FsZSgxKTsgfVxcbiAgLm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gICAgZm9udC1zaXplOiAwLjc1cmVtOyB9XFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUsXFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH1cXG4gIC5tZGMtc2VsZWN0LS1vdXRsaW5lZC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSxcXG4gIC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgICBmb250LXNpemU6IDFyZW07IH1cXG4gIC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2wsXFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQgLm1kYy1zZWxlY3RfX3NlbGVjdGVkLXRleHQge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHBhZGRpbmctbGVmdDogMTZweDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLXJpZ2h0OiA1MnB4O1xcbiAgICBkaXNwbGF5OiAtd2Via2l0LWJveDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgcGFkZGluZy10b3A6IDEycHg7XFxuICAgIHBhZGRpbmctYm90dG9tOiAxMnB4O1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgICB6LWluZGV4OiAxOyB9XFxuICAgIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2wsIC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2xbZGlyPVxcXCJydGxcXFwiXSwgW2Rpcj1cXFwicnRsXFxcIl1cXG4gICAgLm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtc2VsZWN0X19zZWxlY3RlZC10ZXh0LFxcbiAgICAubWRjLXNlbGVjdC0tb3V0bGluZWQgLm1kYy1zZWxlY3RfX3NlbGVjdGVkLXRleHRbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIHBhZGRpbmctbGVmdDogNTJweDtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgcGFkZGluZy1yaWdodDogMTZweDsgfVxcbiAgLm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtc2VsZWN0X19zZWxlY3RlZC10ZXh0IHtcXG4gICAgcGFkZGluZy10b3A6IDE0cHg7IH1cXG4gIC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLXNlbGVjdF9faWNvbiB7XFxuICAgIHotaW5kZXg6IDI7IH1cXG4gIC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLWZsb2F0aW5nLWxhYmVsIHtcXG4gICAgbGluZS1oZWlnaHQ6IDEuMTVyZW07XFxuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOyB9XFxuXFxuLm1kYy1zZWxlY3QtLWludmFsaWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkgLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICBjb2xvcjogI2IwMDAyMDtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy1zZWxlY3QtLWludmFsaWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkgLm1kYy1zZWxlY3RfX25hdGl2ZS1jb250cm9sLFxcbi5tZGMtc2VsZWN0LS1pbnZhbGlkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpIC5tZGMtc2VsZWN0X19zZWxlY3RlZC10ZXh0IHtcXG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy1zZWxlY3QtLWludmFsaWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkubWRjLXNlbGVjdC0tZm9jdXNlZCAubWRjLWxpbmUtcmlwcGxlIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy1zZWxlY3QtLWludmFsaWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkubWRjLXNlbGVjdC0tZm9jdXNlZCAubWRjLWZsb2F0aW5nLWxhYmVsIHtcXG4gIGNvbG9yOiAjYjAwMDIwOyB9XFxuXFxuLm1kYy1zZWxlY3QtLWludmFsaWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkubWRjLXNlbGVjdC0taW52YWxpZCArIC5tZGMtc2VsZWN0LWhlbHBlci10ZXh0LS12YWxpZGF0aW9uLW1zZyB7XFxuICBjb2xvcjogI2IwMDAyMDtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy1zZWxlY3QtLWludmFsaWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkgLm1kYy1zZWxlY3RfX25hdGl2ZS1jb250cm9sOmhvdmVyIHtcXG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy1zZWxlY3QtLWludmFsaWQubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuLm1kYy1zZWxlY3QtLWludmFsaWQubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbi5tZGMtc2VsZWN0LS1pbnZhbGlkLm1kYy1zZWxlY3QtLW91dGxpbmVkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICBib3JkZXItY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBib3JkZXItY29sb3I6IHZhcigtLW1kYy10aGVtZS1lcnJvciwgI2IwMDAyMCk7IH1cXG5cXG4ubWRjLXNlbGVjdC0taW52YWxpZC5tZGMtc2VsZWN0LS1vdXRsaW5lZDpub3QoLm1kYy1zZWxlY3QtLWRpc2FibGVkKTpub3QoLm1kYy1zZWxlY3QtLWZvY3VzZWQpIC5tZGMtc2VsZWN0X19uYXRpdmUtY29udHJvbDpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nLFxcbi5tZGMtc2VsZWN0LS1pbnZhbGlkLm1kYy1zZWxlY3QtLW91dGxpbmVkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpOm5vdCgubWRjLXNlbGVjdC0tZm9jdXNlZCkgLm1kYy1zZWxlY3RfX25hdGl2ZS1jb250cm9sOmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbi5tZGMtc2VsZWN0LS1pbnZhbGlkLm1kYy1zZWxlY3QtLW91dGxpbmVkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpOm5vdCgubWRjLXNlbGVjdC0tZm9jdXNlZCkgLm1kYy1zZWxlY3RfX25hdGl2ZS1jb250cm9sOmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nLFxcbi5tZGMtc2VsZWN0LS1pbnZhbGlkLm1kYy1zZWxlY3QtLW91dGxpbmVkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpOm5vdCgubWRjLXNlbGVjdC0tZm9jdXNlZCkgLm1kYy1zZWxlY3RfX3NlbGVjdGVkLXRleHQ6aG92ZXIgfiAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyxcXG4ubWRjLXNlbGVjdC0taW52YWxpZC5tZGMtc2VsZWN0LS1vdXRsaW5lZDpub3QoLm1kYy1zZWxlY3QtLWRpc2FibGVkKTpub3QoLm1kYy1zZWxlY3QtLWZvY3VzZWQpIC5tZGMtc2VsZWN0X19zZWxlY3RlZC10ZXh0OmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbi5tZGMtc2VsZWN0LS1pbnZhbGlkLm1kYy1zZWxlY3QtLW91dGxpbmVkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpOm5vdCgubWRjLXNlbGVjdC0tZm9jdXNlZCkgLm1kYy1zZWxlY3RfX3NlbGVjdGVkLXRleHQ6aG92ZXIgfiAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcge1xcbiAgYm9yZGVyLWNvbG9yOiAjYjAwMDIwO1xcbiAgLyogQGFsdGVybmF0ZSAqL1xcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy1zZWxlY3QtLWludmFsaWQubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkubWRjLXNlbGVjdC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyxcXG4ubWRjLXNlbGVjdC0taW52YWxpZC5tZGMtc2VsZWN0LS1vdXRsaW5lZDpub3QoLm1kYy1zZWxlY3QtLWRpc2FibGVkKS5tZGMtc2VsZWN0LS1mb2N1c2VkIC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCxcXG4ubWRjLXNlbGVjdC0taW52YWxpZC5tZGMtc2VsZWN0LS1vdXRsaW5lZDpub3QoLm1kYy1zZWxlY3QtLWRpc2FibGVkKS5tZGMtc2VsZWN0LS1mb2N1c2VkIC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICBib3JkZXItd2lkdGg6IDJweDsgfVxcblxcbi5tZGMtc2VsZWN0LS1pbnZhbGlkLm1kYy1zZWxlY3QtLW91dGxpbmVkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpLm1kYy1zZWxlY3QtLWZvY3VzZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuLm1kYy1zZWxlY3QtLWludmFsaWQubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkubWRjLXNlbGVjdC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXFxuLm1kYy1zZWxlY3QtLWludmFsaWQubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkubWRjLXNlbGVjdC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcge1xcbiAgYm9yZGVyLWNvbG9yOiAjYjAwMDIwO1xcbiAgLyogQGFsdGVybmF0ZSAqL1xcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy1zZWxlY3QtLWludmFsaWQgLm1kYy1zZWxlY3RfX2Ryb3Bkb3duLWljb24ge1xcbiAgYmFja2dyb3VuZDogdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnJTIwd2lkdGglM0QlMjIxMHB4JTIyJTIwaGVpZ2h0JTNEJTIyNXB4JTIyJTIwdmlld0JveCUzRCUyMjclMjAxMCUyMDEwJTIwNSUyMiUyMHZlcnNpb24lM0QlMjIxLjElMjIlMjB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMjAwMCUyRnN2ZyUyMiUyMHhtbG5zJTNBeGxpbmslM0QlMjJodHRwJTNBJTJGJTJGd3d3LnczLm9yZyUyRjE5OTklMkZ4bGluayUyMiUzRSUwQSUyMCUyMCUyMCUyMCUzQ3BvbHlnb24lMjBpZCUzRCUyMlNoYXBlJTIyJTIwc3Ryb2tlJTNEJTIybm9uZSUyMiUyMGZpbGwlM0QlMjIlMjNiMDAwMjAlMjIlMjBmaWxsLXJ1bGUlM0QlMjJldmVub2RkJTIyJTIwb3BhY2l0eSUzRCUyMjElMjIlMjBwb2ludHMlM0QlMjI3JTIwMTAlMjAxMiUyMDE1JTIwMTclMjAxMCUyMiUzRSUzQyUyRnBvbHlnb24lM0UlMEElM0MlMkZzdmclM0VcXFwiKSBuby1yZXBlYXQgY2VudGVyOyB9XFxuXFxuLm1kYy1zZWxlY3QtLWludmFsaWQgKyAubWRjLXNlbGVjdC1oZWxwZXItdGV4dC0tdmFsaWRhdGlvbi1tc2cge1xcbiAgb3BhY2l0eTogMTsgfVxcblxcbi5tZGMtc2VsZWN0LS1yZXF1aXJlZCAubWRjLWZsb2F0aW5nLWxhYmVsOjphZnRlciB7XFxuICBjb250ZW50OiBcXFwiKlxcXCI7IH1cXG5cXG4ubWRjLXNlbGVjdC0tZGlzYWJsZWQge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lOyB9XFxuICAubWRjLXNlbGVjdC0tZGlzYWJsZWQgLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzcpOyB9XFxuICAubWRjLXNlbGVjdC0tZGlzYWJsZWQgLm1kYy1zZWxlY3RfX2Ryb3Bkb3duLWljb24ge1xcbiAgICBiYWNrZ3JvdW5kOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmclMjB3aWR0aCUzRCUyMjEwcHglMjIlMjBoZWlnaHQlM0QlMjI1cHglMjIlMjB2aWV3Qm94JTNEJTIyNyUyMDEwJTIwMTAlMjA1JTIyJTIwdmVyc2lvbiUzRCUyMjEuMSUyMiUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJTIyJTIweG1sbnMlM0F4bGluayUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMTk5OSUyRnhsaW5rJTIyJTNFJTBBJTIwJTIwJTIwJTIwJTNDcG9seWdvbiUyMGlkJTNEJTIyU2hhcGUlMjIlMjBzdHJva2UlM0QlMjJub25lJTIyJTIwZmlsbCUzRCUyMiUyMzAwMCUyMiUyMGZpbGwtcnVsZSUzRCUyMmV2ZW5vZGQlMjIlMjBvcGFjaXR5JTNEJTIyMC4zNyUyMiUyMHBvaW50cyUzRCUyMjclMjAxMCUyMDEyJTIwMTUlMjAxNyUyMDEwJTIyJTNFJTNDJTJGcG9seWdvbiUzRSUwQSUzQyUyRnN2ZyUzRVxcXCIpIG5vLXJlcGVhdCBjZW50ZXI7IH1cXG4gIC5tZGMtc2VsZWN0LS1kaXNhYmxlZCAubWRjLWxpbmUtcmlwcGxlIHtcXG4gICAgZGlzcGxheTogbm9uZTsgfVxcbiAgLm1kYy1zZWxlY3QtLWRpc2FibGVkIC5tZGMtc2VsZWN0X19pY29uIHtcXG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNyk7IH1cXG4gIC5tZGMtc2VsZWN0LS1kaXNhYmxlZCAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2wsXFxuICAubWRjLXNlbGVjdC0tZGlzYWJsZWQgLm1kYy1zZWxlY3RfX3NlbGVjdGVkLXRleHQge1xcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM3KTtcXG4gICAgYm9yZGVyLWJvdHRvbS1zdHlsZTogZG90dGVkOyB9XFxuICAubWRjLXNlbGVjdC0tZGlzYWJsZWQgLm1kYy1zZWxlY3RfX3NlbGVjdGVkLXRleHQge1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsgfVxcbiAgLm1kYy1zZWxlY3QtLWRpc2FibGVkLm1kYy1zZWxlY3QtLW91dGxpbmVkIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IH1cXG4gICAgLm1kYy1zZWxlY3QtLWRpc2FibGVkLm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtc2VsZWN0X19uYXRpdmUtY29udHJvbCxcXG4gICAgLm1kYy1zZWxlY3QtLWRpc2FibGVkLm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtc2VsZWN0X19zZWxlY3RlZC10ZXh0IHtcXG4gICAgICBib3JkZXItYm90dG9tLXN0eWxlOiBub25lOyB9XFxuICAgIC5tZGMtc2VsZWN0LS1kaXNhYmxlZC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyxcXG4gICAgLm1kYy1zZWxlY3QtLWRpc2FibGVkLm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCxcXG4gICAgLm1kYy1zZWxlY3QtLWRpc2FibGVkLm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICAgICAgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTYpOyB9XFxuXFxuLm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uIC5tZGMtc2VsZWN0X19pY29uIHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIGxlZnQ6IDE2cHg7XFxuICAvKiBAbm9mbGlwICovXFxuICByaWdodDogaW5pdGlhbDsgfVxcbiAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uIC5tZGMtc2VsZWN0X19pY29uLCAubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy1zZWxlY3RfX2ljb25bZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogaW5pdGlhbDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogMTZweDsgfVxcblxcbi5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbiAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2wsXFxuLm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uIC5tZGMtc2VsZWN0X19zZWxlY3RlZC10ZXh0IHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctbGVmdDogNDhweDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctcmlnaHQ6IDMycHg7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbiAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2wsIC5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbiAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2xbZGlyPVxcXCJydGxcXFwiXSwgW2Rpcj1cXFwicnRsXFxcIl1cXG4gIC5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbiAubWRjLXNlbGVjdF9fc2VsZWN0ZWQtdGV4dCxcXG4gIC5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbiAubWRjLXNlbGVjdF9fc2VsZWN0ZWQtdGV4dFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLWxlZnQ6IDMycHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcGFkZGluZy1yaWdodDogNDhweDsgfVxcblxcbi5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbi5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTQ0JSkgdHJhbnNsYXRlWCgtMzJweCkgc2NhbGUoMSk7XFxuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTQ0JSkgdHJhbnNsYXRlWCgtMzJweCkgc2NhbGUoMSk7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbi5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSwgLm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uLm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTQ0JSkgdHJhbnNsYXRlWCgzMnB4KSBzY2FsZSgxKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTE0NCUpIHRyYW5zbGF0ZVgoMzJweCkgc2NhbGUoMSk7IH1cXG5cXG4ubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXNlbGVjdC0tb3V0bGluZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgZm9udC1zaXplOiAwLjc1cmVtOyB9XFxuXFxuLm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uLm1kYy1zZWxlY3QtLW91dGxpbmVkLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlLFxcbi5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbi5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEzMCUpIHRyYW5zbGF0ZVgoLTMycHgpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEzMCUpIHRyYW5zbGF0ZVgoLTMycHgpIHNjYWxlKDAuNzUpOyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXNlbGVjdC0tb3V0bGluZWQubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUsIC5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbi5tZGMtc2VsZWN0LS1vdXRsaW5lZC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZVtkaXI9XFxcInJ0bFxcXCJdLCBbZGlyPVxcXCJydGxcXFwiXVxcbiAgLm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uLm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSxcXG4gIC5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbi5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmVbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMzAlKSB0cmFuc2xhdGVYKDMycHgpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTMwJSkgdHJhbnNsYXRlWCgzMnB4KSBzY2FsZSgwLjc1KTsgfVxcblxcbi5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbi5tZGMtc2VsZWN0LS1vdXRsaW5lZC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSxcXG4ubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXNlbGVjdC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gIGZvbnQtc2l6ZTogMXJlbTsgfVxcblxcbi5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbi5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1zaGFrZSB7XFxuICAtd2Via2l0LWFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXNlbGVjdC1vdXRsaW5lZC1sZWFkaW5nLWljb24gMjUwbXMgMTtcXG4gICAgICAgICAgYW5pbWF0aW9uOiBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtc2VsZWN0LW91dGxpbmVkLWxlYWRpbmctaWNvbiAyNTBtcyAxOyB9XFxuXFxuW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uLm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLXNoYWtlLCAubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXNlbGVjdC0tb3V0bGluZWRbZGlyPVxcXCJydGxcXFwiXSAubWRjLWZsb2F0aW5nLWxhYmVsLS1zaGFrZSB7XFxuICAtd2Via2l0LWFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXNlbGVjdC1vdXRsaW5lZC1sZWFkaW5nLWljb24tcnRsIDI1MG1zIDE7XFxuICAgICAgICAgIGFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXNlbGVjdC1vdXRsaW5lZC1sZWFkaW5nLWljb24tcnRsIDI1MG1zIDE7IH1cXG5cXG4ubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXNlbGVjdF9fbWVudSAubWRjLWxpc3QtaXRlbV9fdGV4dCB7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLWxlZnQ6IDMycHg7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLXJpZ2h0OiAzMnB4OyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXNlbGVjdF9fbWVudSAubWRjLWxpc3QtaXRlbV9fdGV4dCwgLm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uLm1kYy1zZWxlY3RfX21lbnUgLm1kYy1saXN0LWl0ZW1fX3RleHRbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcGFkZGluZy1sZWZ0OiAzMnB4O1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHBhZGRpbmctcmlnaHQ6IDMycHg7IH1cXG5cXG4ubWRjLXNlbGVjdF9fbWVudSAubWRjLWxpc3QgLm1kYy1saXN0LWl0ZW0tLXNlbGVjdGVkIHtcXG4gIGNvbG9yOiAjMDAwO1xcbiAgLyogQGFsdGVybmF0ZSAqL1xcbiAgY29sb3I6IHZhcigtLW1kYy10aGVtZS1vbi1zdXJmYWNlLCAjMDAwKTsgfVxcbiAgLm1kYy1zZWxlY3RfX21lbnUgLm1kYy1saXN0IC5tZGMtbGlzdC1pdGVtLS1zZWxlY3RlZDo6YmVmb3JlLCAubWRjLXNlbGVjdF9fbWVudSAubWRjLWxpc3QgLm1kYy1saXN0LWl0ZW0tLXNlbGVjdGVkOjphZnRlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDA7IH1cXG4gICAgQHN1cHBvcnRzIG5vdCAoLW1zLWltZS1hbGlnbjogYXV0bykge1xcbiAgICAgIC5tZGMtc2VsZWN0X19tZW51IC5tZGMtbGlzdCAubWRjLWxpc3QtaXRlbS0tc2VsZWN0ZWQ6OmJlZm9yZSwgLm1kYy1zZWxlY3RfX21lbnUgLm1kYy1saXN0IC5tZGMtbGlzdC1pdGVtLS1zZWxlY3RlZDo6YWZ0ZXIge1xcbiAgICAgICAgLyogQGFsdGVybmF0ZSAqL1xcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWRjLXRoZW1lLW9uLXN1cmZhY2UsICMwMDApOyB9IH1cXG4gIC5tZGMtc2VsZWN0X19tZW51IC5tZGMtbGlzdCAubWRjLWxpc3QtaXRlbS0tc2VsZWN0ZWQ6aG92ZXI6OmJlZm9yZSB7XFxuICAgIG9wYWNpdHk6IDAuMDQ7IH1cXG4gIC5tZGMtc2VsZWN0X19tZW51IC5tZGMtbGlzdCAubWRjLWxpc3QtaXRlbS0tc2VsZWN0ZWQ6bm90KC5tZGMtcmlwcGxlLXVwZ3JhZGVkKTpmb2N1czo6YmVmb3JlLCAubWRjLXNlbGVjdF9fbWVudSAubWRjLWxpc3QgLm1kYy1saXN0LWl0ZW0tLXNlbGVjdGVkLm1kYy1yaXBwbGUtdXBncmFkZWQtLWJhY2tncm91bmQtZm9jdXNlZDo6YmVmb3JlIHtcXG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiA3NW1zO1xcbiAgICAgICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDc1bXM7XFxuICAgIG9wYWNpdHk6IDAuMTI7IH1cXG4gIC5tZGMtc2VsZWN0X19tZW51IC5tZGMtbGlzdCAubWRjLWxpc3QtaXRlbS0tc2VsZWN0ZWQ6bm90KC5tZGMtcmlwcGxlLXVwZ3JhZGVkKTo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgMTUwbXMgbGluZWFyO1xcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDE1MG1zIGxpbmVhcjsgfVxcbiAgLm1kYy1zZWxlY3RfX21lbnUgLm1kYy1saXN0IC5tZGMtbGlzdC1pdGVtLS1zZWxlY3RlZDpub3QoLm1kYy1yaXBwbGUtdXBncmFkZWQpOmFjdGl2ZTo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDc1bXM7XFxuICAgICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogNzVtcztcXG4gICAgb3BhY2l0eTogMC4xMjsgfVxcbiAgLm1kYy1zZWxlY3RfX21lbnUgLm1kYy1saXN0IC5tZGMtbGlzdC1pdGVtLS1zZWxlY3RlZC5tZGMtcmlwcGxlLXVwZ3JhZGVkIHtcXG4gICAgLS1tZGMtcmlwcGxlLWZnLW9wYWNpdHk6IDAuMTI7IH1cXG5cXG5ALXdlYmtpdC1rZXlmcmFtZXMgbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXNlbGVjdC1vdXRsaW5lZC1sZWFkaW5nLWljb24ge1xcbiAgMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAzMnB4KSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgNjYlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIDMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAzMnB4KSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAzMnB4KSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfSB9XFxuXFxuQGtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtc2VsZWN0LW91dGxpbmVkLWxlYWRpbmctaWNvbiB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICAzMyUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNzAxNzMsIDAuNDk1ODIpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNzAxNzMsIDAuNDk1ODIpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICA2NiUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIDMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMTAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9IH1cXG5cXG5ALXdlYmtpdC1rZXlmcmFtZXMgbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXNlbGVjdC1vdXRsaW5lZC1sZWFkaW5nLWljb24tcnRsIHtcXG4gIDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gLTMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gLTMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIC0zMnB4KSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAtMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICA2NiUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gLTMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAtMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gLTMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gLTMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfSB9XFxuXFxuQGtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtc2VsZWN0LW91dGxpbmVkLWxlYWRpbmctaWNvbi1ydGwge1xcbiAgMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAtMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAtMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICAzMyUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNzAxNzMsIDAuNDk1ODIpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNzAxNzMsIDAuNDk1ODIpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gLTMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIC0zMnB4KSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDY2JSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAtMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIC0zMnB4KSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAtMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAtMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9IH1cIiwgXCJcIl0pO1xuIiwiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiKShmYWxzZSk7XG4vLyBNb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy10ZXh0LWZpZWxkX19pY29uLFxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uIC5tZGMtdGV4dC1maWVsZF9faWNvbiB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBib3R0b206IDE2cHg7XFxuICBjdXJzb3I6IHBvaW50ZXI7IH1cXG5cXG4ubWRjLXRleHQtZmllbGRfX2ljb246bm90KFt0YWJpbmRleF0pLFxcbi5tZGMtdGV4dC1maWVsZF9faWNvblt0YWJpbmRleD1cXFwiLTFcXFwiXSB7XFxuICBjdXJzb3I6IGRlZmF1bHQ7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC1oZWxwZXItdGV4dCB7XFxuICBmb250LWZhbWlseTogUm9ib3RvLCBzYW5zLXNlcmlmO1xcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcXG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDMzMzNlbTtcXG4gIHRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDtcXG4gIHRleHQtdHJhbnNmb3JtOiBpbmhlcml0O1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBtYXJnaW4tdG9wOiAwO1xcbiAgLyogQGFsdGVybmF0ZSAqL1xcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcXG4gIG1hcmdpbjogMDtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgb3BhY2l0eTogMDtcXG4gIHdpbGwtY2hhbmdlOiBvcGFjaXR5OyB9XFxuICAubWRjLXRleHQtZmllbGQtaGVscGVyLXRleHQ6OmJlZm9yZSB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgd2lkdGg6IDA7XFxuICAgIGhlaWdodDogMTZweDtcXG4gICAgY29udGVudDogXFxcIlxcXCI7XFxuICAgIHZlcnRpY2FsLWFsaWduOiAwOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLWhlbHBlci10ZXh0LS1wZXJzaXN0ZW50IHtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogbm9uZTtcXG4gIHRyYW5zaXRpb246IG5vbmU7XFxuICBvcGFjaXR5OiAxO1xcbiAgd2lsbC1jaGFuZ2U6IGluaXRpYWw7IH1cXG5cXG4ubWRjLWZsb2F0aW5nLWxhYmVsIHtcXG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIHNhbnMtc2VyaWY7XFxuICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XFxuICBmb250LXNpemU6IDFyZW07XFxuICBsaW5lLWhlaWdodDogMS43NXJlbTtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMDkzN2VtO1xcbiAgdGV4dC1kZWNvcmF0aW9uOiBpbmhlcml0O1xcbiAgdGV4dC10cmFuc2Zvcm06IGluaGVyaXQ7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAvKiBAbm9mbGlwICovXFxuICBsZWZ0OiAwO1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IHRvcDtcXG4gICAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IGNvbG9yIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksIC13ZWJraXQtdHJhbnNmb3JtIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICB0cmFuc2l0aW9uOiBjb2xvciAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpLCAtd2Via2l0LXRyYW5zZm9ybSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksIGNvbG9yIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMTUwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKSwgY29sb3IgMTUwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKSwgLXdlYmtpdC10cmFuc2Zvcm0gMTUwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGxpbmUtaGVpZ2h0OiAxLjE1cmVtO1xcbiAgdGV4dC1hbGlnbjogbGVmdDtcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG4gIGN1cnNvcjogdGV4dDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLWZsb2F0aW5nLWxhYmVsLCAubWRjLWZsb2F0aW5nLWxhYmVsW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHJpZ2h0OiAwO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IGF1dG87XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCB0b3A7XFxuICAgICAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHRleHQtYWxpZ246IHJpZ2h0OyB9XFxuXFxuLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgY3Vyc29yOiBhdXRvOyB9XFxuXFxuLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwLjc1KTsgfVxcblxcbi5tZGMtZmxvYXRpbmctbGFiZWwtLXNoYWtlIHtcXG4gIC13ZWJraXQtYW5pbWF0aW9uOiBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtc3RhbmRhcmQgMjUwbXMgMTtcXG4gICAgICAgICAgYW5pbWF0aW9uOiBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtc3RhbmRhcmQgMjUwbXMgMTsgfVxcblxcbkAtd2Via2l0LWtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtc3RhbmRhcmQge1xcbiAgMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDAlKSkgdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDAlKSkgdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgNjYlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIDAlKSkgdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwLjc1KTsgfSB9XFxuXFxuQGtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtc3RhbmRhcmQge1xcbiAgMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDAlKSkgdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDAlKSkgdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgNjYlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIDAlKSkgdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwLjc1KTsgfSB9XFxuXFxuLm1kYy1saW5lLXJpcHBsZSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBib3R0b206IDA7XFxuICBsZWZ0OiAwO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDJweDtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMCk7XFxuICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDApO1xcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IDE4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksIC13ZWJraXQtdHJhbnNmb3JtIDE4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDE4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksIC13ZWJraXQtdHJhbnNmb3JtIDE4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMTgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKSwgb3BhY2l0eSAxODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDE4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksIG9wYWNpdHkgMTgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKSwgLXdlYmtpdC10cmFuc2Zvcm0gMTgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gIG9wYWNpdHk6IDA7XFxuICB6LWluZGV4OiAyOyB9XFxuXFxuLm1kYy1saW5lLXJpcHBsZS0tYWN0aXZlIHtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMSk7XFxuICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDEpO1xcbiAgb3BhY2l0eTogMTsgfVxcblxcbi5tZGMtbGluZS1yaXBwbGUtLWRlYWN0aXZhdGluZyB7XFxuICBvcGFjaXR5OiAwOyB9XFxuXFxuLm1kYy1ub3RjaGVkLW91dGxpbmUge1xcbiAgZGlzcGxheTogLXdlYmtpdC1ib3g7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgcmlnaHQ6IDA7XFxuICBsZWZ0OiAwO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgbWF4LXdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgdGV4dC1hbGlnbjogbGVmdDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lOyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLW5vdGNoZWQtb3V0bGluZSwgLm1kYy1ub3RjaGVkLW91dGxpbmVbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7IH1cXG4gIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nLCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIGhlaWdodDogMTAwJTtcXG4gICAgLXdlYmtpdC10cmFuc2l0aW9uOiBib3JkZXIgMTUwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gICAgdHJhbnNpdGlvbjogYm9yZGVyIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZDtcXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsgfVxcbiAgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQ7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgYm9yZGVyLXJpZ2h0OiBub25lO1xcbiAgICB3aWR0aDogMTJweDsgfVxcbiAgICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZywgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmdbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIGJvcmRlci1sZWZ0OiBub25lO1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZDsgfVxcbiAgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBib3JkZXItbGVmdDogbm9uZTtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZDtcXG4gICAgLXdlYmtpdC1ib3gtZmxleDogMTtcXG4gICAgICAgICAgICBmbGV4LWdyb3c6IDE7IH1cXG4gICAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nLCAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmdbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQ7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIGJvcmRlci1yaWdodDogbm9uZTsgfVxcbiAgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoIHtcXG4gICAgLXdlYmtpdC1ib3gtZmxleDogMDtcXG4gICAgICAgICAgICBmbGV4OiAwIDAgYXV0bztcXG4gICAgd2lkdGg6IGF1dG87XFxuICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gMTJweCAqIDIpOyB9XFxuICAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLWZsb2F0aW5nLWxhYmVsIHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHRvcDogMTdweDtcXG4gICAgYm90dG9tOiBhdXRvO1xcbiAgICBtYXgtd2lkdGg6IDEwMCU7IH1cXG4gIC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gICAgdGV4dC1vdmVyZmxvdzogY2xpcDsgfVxcbiAgLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLyAuNzUpOyB9XFxuXFxuLm1kYy1ub3RjaGVkLW91dGxpbmUtLW5vdGNoZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoIHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctbGVmdDogMDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctcmlnaHQ6IDhweDtcXG4gIGJvcmRlci10b3A6IG5vbmU7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtbm90Y2hlZC1vdXRsaW5lLS1ub3RjaGVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCwgLm1kYy1ub3RjaGVkLW91dGxpbmUtLW5vdGNoZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHBhZGRpbmctbGVmdDogOHB4O1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHBhZGRpbmctcmlnaHQ6IDA7IH1cXG5cXG4ubWRjLW5vdGNoZWQtb3V0bGluZS0tbm8tbGFiZWwgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoIHtcXG4gIHBhZGRpbmc6IDA7IH1cXG5cXG5ALXdlYmtpdC1rZXlmcmFtZXMgbWRjLXJpcHBsZS1mZy1yYWRpdXMtaW4ge1xcbiAgZnJvbSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLXN0YXJ0LCAwKSkgc2NhbGUoMSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tbWRjLXJpcHBsZS1mZy10cmFuc2xhdGUtc3RhcnQsIDApKSBzY2FsZSgxKTsgfVxcbiAgdG8ge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLWVuZCwgMCkpIHNjYWxlKHZhcigtLW1kYy1yaXBwbGUtZmctc2NhbGUsIDEpKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1lbmQsIDApKSBzY2FsZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXNjYWxlLCAxKSk7IH0gfVxcblxcbkBrZXlmcmFtZXMgbWRjLXJpcHBsZS1mZy1yYWRpdXMtaW4ge1xcbiAgZnJvbSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLXN0YXJ0LCAwKSkgc2NhbGUoMSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tbWRjLXJpcHBsZS1mZy10cmFuc2xhdGUtc3RhcnQsIDApKSBzY2FsZSgxKTsgfVxcbiAgdG8ge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLWVuZCwgMCkpIHNjYWxlKHZhcigtLW1kYy1yaXBwbGUtZmctc2NhbGUsIDEpKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1lbmQsIDApKSBzY2FsZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXNjYWxlLCAxKSk7IH0gfVxcblxcbkAtd2Via2l0LWtleWZyYW1lcyBtZGMtcmlwcGxlLWZnLW9wYWNpdHktaW4ge1xcbiAgZnJvbSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjtcXG4gICAgb3BhY2l0eTogMDsgfVxcbiAgdG8ge1xcbiAgICBvcGFjaXR5OiB2YXIoLS1tZGMtcmlwcGxlLWZnLW9wYWNpdHksIDApOyB9IH1cXG5cXG5Aa2V5ZnJhbWVzIG1kYy1yaXBwbGUtZmctb3BhY2l0eS1pbiB7XFxuICBmcm9tIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyO1xcbiAgICBvcGFjaXR5OiAwOyB9XFxuICB0byB7XFxuICAgIG9wYWNpdHk6IHZhcigtLW1kYy1yaXBwbGUtZmctb3BhY2l0eSwgMCk7IH0gfVxcblxcbkAtd2Via2l0LWtleWZyYW1lcyBtZGMtcmlwcGxlLWZnLW9wYWNpdHktb3V0IHtcXG4gIGZyb20ge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7XFxuICAgIG9wYWNpdHk6IHZhcigtLW1kYy1yaXBwbGUtZmctb3BhY2l0eSwgMCk7IH1cXG4gIHRvIHtcXG4gICAgb3BhY2l0eTogMDsgfSB9XFxuXFxuQGtleWZyYW1lcyBtZGMtcmlwcGxlLWZnLW9wYWNpdHktb3V0IHtcXG4gIGZyb20ge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7XFxuICAgIG9wYWNpdHk6IHZhcigtLW1kYy1yaXBwbGUtZmctb3BhY2l0eSwgMCk7IH1cXG4gIHRvIHtcXG4gICAgb3BhY2l0eTogMDsgfSB9XFxuXFxuLm1kYy1yaXBwbGUtc3VyZmFjZS0tdGVzdC1lZGdlLXZhci1idWcge1xcbiAgLS1tZGMtcmlwcGxlLXN1cmZhY2UtdGVzdC1lZGdlLXZhcjogMXB4IHNvbGlkICMwMDA7XFxuICB2aXNpYmlsaXR5OiBoaWRkZW47IH1cXG4gIC5tZGMtcmlwcGxlLXN1cmZhY2UtLXRlc3QtZWRnZS12YXItYnVnOjpiZWZvcmUge1xcbiAgICBib3JkZXI6IHZhcigtLW1kYy1yaXBwbGUtc3VyZmFjZS10ZXN0LWVkZ2UtdmFyKTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC1oZWxwZXItdGV4dCB7XFxuICBmb250LWZhbWlseTogUm9ib3RvLCBzYW5zLXNlcmlmO1xcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcXG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDMzMzNlbTtcXG4gIHRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDtcXG4gIHRleHQtdHJhbnNmb3JtOiBpbmhlcml0O1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBtYXJnaW4tdG9wOiAwO1xcbiAgLyogQGFsdGVybmF0ZSAqL1xcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcXG4gIG1hcmdpbjogMDtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgb3BhY2l0eTogMDtcXG4gIHdpbGwtY2hhbmdlOiBvcGFjaXR5OyB9XFxuICAubWRjLXRleHQtZmllbGQtaGVscGVyLXRleHQ6OmJlZm9yZSB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgd2lkdGg6IDA7XFxuICAgIGhlaWdodDogMTZweDtcXG4gICAgY29udGVudDogXFxcIlxcXCI7XFxuICAgIHZlcnRpY2FsLWFsaWduOiAwOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLWhlbHBlci10ZXh0LS1wZXJzaXN0ZW50IHtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogbm9uZTtcXG4gIHRyYW5zaXRpb246IG5vbmU7XFxuICBvcGFjaXR5OiAxO1xcbiAgd2lsbC1jaGFuZ2U6IGluaXRpYWw7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtY2hhcmFjdGVyLWNvdW50ZXIge1xcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgc2Fucy1zZXJpZjtcXG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XFxuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcXG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcXG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAzMzMzZW07XFxuICB0ZXh0LWRlY29yYXRpb246IGluaGVyaXQ7XFxuICB0ZXh0LXRyYW5zZm9ybTogaW5oZXJpdDtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWFyZ2luLXRvcDogMDtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGxpbmUtaGVpZ2h0OiBub3JtYWw7XFxuICAvKiBAbm9mbGlwICovXFxuICBtYXJnaW4tbGVmdDogYXV0bztcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIG1hcmdpbi1yaWdodDogMDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctbGVmdDogMTZweDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctcmlnaHQ6IDA7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwOyB9XFxuICAubWRjLXRleHQtZmllbGQtY2hhcmFjdGVyLWNvdW50ZXI6OmJlZm9yZSB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgd2lkdGg6IDA7XFxuICAgIGhlaWdodDogMTZweDtcXG4gICAgY29udGVudDogXFxcIlxcXCI7XFxuICAgIHZlcnRpY2FsLWFsaWduOiAwOyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtY2hhcmFjdGVyLWNvdW50ZXIsIC5tZGMtdGV4dC1maWVsZC1jaGFyYWN0ZXItY291bnRlcltkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBtYXJnaW4tbGVmdDogMDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC1jaGFyYWN0ZXItY291bnRlciwgLm1kYy10ZXh0LWZpZWxkLWNoYXJhY3Rlci1jb3VudGVyW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHBhZGRpbmctbGVmdDogMDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLXJpZ2h0OiAxNnB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbiAubWRjLXRleHQtZmllbGRfX2ljb24sXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24gLm1kYy10ZXh0LWZpZWxkX19pY29uIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGJvdHRvbTogMTZweDtcXG4gIGN1cnNvcjogcG9pbnRlcjsgfVxcblxcbi5tZGMtdGV4dC1maWVsZF9faWNvbjpub3QoW3RhYmluZGV4XSksXFxuLm1kYy10ZXh0LWZpZWxkX19pY29uW3RhYmluZGV4PVxcXCItMVxcXCJdIHtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkIHtcXG4gIC0tbWRjLXJpcHBsZS1mZy1zaXplOiAwO1xcbiAgLS1tZGMtcmlwcGxlLWxlZnQ6IDA7XFxuICAtLW1kYy1yaXBwbGUtdG9wOiAwO1xcbiAgLS1tZGMtcmlwcGxlLWZnLXNjYWxlOiAxO1xcbiAgLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1lbmQ6IDA7XFxuICAtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLXN0YXJ0OiAwO1xcbiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApO1xcbiAgYm9yZGVyLXJhZGl1czogNHB4IDRweCAwIDA7XFxuICBkaXNwbGF5OiAtd2Via2l0LWlubGluZS1ib3g7XFxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICBoZWlnaHQ6IDU2cHg7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgLyogQGFsdGVybmF0ZSAqL1xcbiAgd2lsbC1jaGFuZ2U6IG9wYWNpdHksIHRyYW5zZm9ybSwgY29sb3I7IH1cXG4gIC5tZGMtdGV4dC1maWVsZDo6YmVmb3JlLCAubWRjLXRleHQtZmllbGQ6OmFmdGVyIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XFxuICAgIG9wYWNpdHk6IDA7XFxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgICBjb250ZW50OiBcXFwiXFxcIjsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkOjpiZWZvcmUge1xcbiAgICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgMTVtcyBsaW5lYXIsIGJhY2tncm91bmQtY29sb3IgMTVtcyBsaW5lYXI7XFxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTVtcyBsaW5lYXIsIGJhY2tncm91bmQtY29sb3IgMTVtcyBsaW5lYXI7XFxuICAgIHotaW5kZXg6IDE7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC5tZGMtcmlwcGxlLXVwZ3JhZGVkOjpiZWZvcmUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUodmFyKC0tbWRjLXJpcHBsZS1mZy1zY2FsZSwgMSkpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tbWRjLXJpcHBsZS1mZy1zY2FsZSwgMSkpOyB9XFxuICAubWRjLXRleHQtZmllbGQubWRjLXJpcHBsZS11cGdyYWRlZDo6YWZ0ZXIge1xcbiAgICB0b3A6IDA7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogMDtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjtcXG4gICAgICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOyB9XFxuICAubWRjLXRleHQtZmllbGQubWRjLXJpcHBsZS11cGdyYWRlZC0tdW5ib3VuZGVkOjphZnRlciB7XFxuICAgIHRvcDogdmFyKC0tbWRjLXJpcHBsZS10b3AsIDApO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IHZhcigtLW1kYy1yaXBwbGUtbGVmdCwgMCk7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC5tZGMtcmlwcGxlLXVwZ3JhZGVkLS1mb3JlZ3JvdW5kLWFjdGl2YXRpb246OmFmdGVyIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb246IG1kYy1yaXBwbGUtZmctcmFkaXVzLWluIDIyNW1zIGZvcndhcmRzLCBtZGMtcmlwcGxlLWZnLW9wYWNpdHktaW4gNzVtcyBmb3J3YXJkcztcXG4gICAgICAgICAgICBhbmltYXRpb246IG1kYy1yaXBwbGUtZmctcmFkaXVzLWluIDIyNW1zIGZvcndhcmRzLCBtZGMtcmlwcGxlLWZnLW9wYWNpdHktaW4gNzVtcyBmb3J3YXJkczsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLm1kYy1yaXBwbGUtdXBncmFkZWQtLWZvcmVncm91bmQtZGVhY3RpdmF0aW9uOjphZnRlciB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBtZGMtcmlwcGxlLWZnLW9wYWNpdHktb3V0IDE1MG1zO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbjogbWRjLXJpcHBsZS1mZy1vcGFjaXR5LW91dCAxNTBtcztcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1lbmQsIDApKSBzY2FsZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXNjYWxlLCAxKSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tbWRjLXJpcHBsZS1mZy10cmFuc2xhdGUtZW5kLCAwKSkgc2NhbGUodmFyKC0tbWRjLXJpcHBsZS1mZy1zY2FsZSwgMSkpOyB9XFxuICAubWRjLXRleHQtZmllbGQ6OmJlZm9yZSwgLm1kYy10ZXh0LWZpZWxkOjphZnRlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cXG4gIC5tZGMtdGV4dC1maWVsZDpob3Zlcjo6YmVmb3JlIHtcXG4gICAgb3BhY2l0eTogMC4wNDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkOm5vdCgubWRjLXJpcHBsZS11cGdyYWRlZCk6Zm9jdXM6OmJlZm9yZSwgLm1kYy10ZXh0LWZpZWxkLm1kYy1yaXBwbGUtdXBncmFkZWQtLWJhY2tncm91bmQtZm9jdXNlZDo6YmVmb3JlIHtcXG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiA3NW1zO1xcbiAgICAgICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDc1bXM7XFxuICAgIG9wYWNpdHk6IDAuMTI7IH1cXG4gIC5tZGMtdGV4dC1maWVsZDo6YmVmb3JlLCAubWRjLXRleHQtZmllbGQ6OmFmdGVyIHtcXG4gICAgdG9wOiBjYWxjKDUwJSAtIDEwMCUpO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IGNhbGMoNTAlIC0gMTAwJSk7XFxuICAgIHdpZHRoOiAyMDAlO1xcbiAgICBoZWlnaHQ6IDIwMCU7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC5tZGMtcmlwcGxlLXVwZ3JhZGVkOjphZnRlciB7XFxuICAgIHdpZHRoOiB2YXIoLS1tZGMtcmlwcGxlLWZnLXNpemUsIDEwMCUpO1xcbiAgICBoZWlnaHQ6IHZhcigtLW1kYy1yaXBwbGUtZmctc2l6ZSwgMTAwJSk7IH1cXG4gIC5tZGMtdGV4dC1maWVsZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNik7IH1cXG4gIC5tZGMtdGV4dC1maWVsZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy10ZXh0LWZpZWxkX19pbnB1dCB7XFxuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XFxuICAubWRjLXRleHQtZmllbGQgLm1kYy10ZXh0LWZpZWxkX19pbnB1dCB7XFxuICAgIGNhcmV0LWNvbG9yOiAjNjIwMGVlO1xcbiAgICAvKiBAYWx0ZXJuYXRlICovXFxuICAgIGNhcmV0LWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtcHJpbWFyeSwgIzYyMDBlZSk7IH1cXG4gIC5tZGMtdGV4dC1maWVsZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLXRleHRhcmVhKSAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjQyKTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKTpub3QoLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEpIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6aG92ZXIge1xcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XFxuICAubWRjLXRleHQtZmllbGQgLm1kYy1saW5lLXJpcHBsZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM2MjAwZWU7XFxuICAgIC8qIEBhbHRlcm5hdGUgKi9cXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWRjLXRoZW1lLXByaW1hcnksICM2MjAwZWUpOyB9XFxuICAubWRjLXRleHQtZmllbGQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLXRleHRhcmVhKSB7XFxuICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cXG4gIC5tZGMtdGV4dC1maWVsZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgKyAubWRjLXRleHQtZmllbGQtaGVscGVyLWxpbmUgLm1kYy10ZXh0LWZpZWxkLWhlbHBlci10ZXh0IHtcXG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC42KTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKSAubWRjLXRleHQtZmllbGQtY2hhcmFjdGVyLWNvdW50ZXIsXFxuICAubWRjLXRleHQtZmllbGQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpICsgLm1kYy10ZXh0LWZpZWxkLWhlbHBlci1saW5lIC5tZGMtdGV4dC1maWVsZC1jaGFyYWN0ZXItY291bnRlciB7XFxuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNik7IH1cXG4gIC5tZGMtdGV4dC1maWVsZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy10ZXh0LWZpZWxkX19pY29uIHtcXG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cXG4gIC5tZGMtdGV4dC1maWVsZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZXNtb2tlOyB9XFxuICAubWRjLXRleHQtZmllbGQgLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogMTZweDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogaW5pdGlhbDtcXG4gICAgdG9wOiAxOHB4O1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsgfVxcbiAgICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQgLm1kYy1mbG9hdGluZy1sYWJlbCwgLm1kYy10ZXh0LWZpZWxkIC5tZGMtZmxvYXRpbmctbGFiZWxbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIGxlZnQ6IGluaXRpYWw7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIHJpZ2h0OiAxNnB4OyB9XFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhIC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IDRweDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogaW5pdGlhbDsgfVxcbiAgICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhIC5tZGMtZmxvYXRpbmctbGFiZWwsIC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEgLm1kYy1mbG9hdGluZy1sYWJlbFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgbGVmdDogaW5pdGlhbDtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgcmlnaHQ6IDRweDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLWZsb2F0aW5nLWxhYmVsIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBsZWZ0OiA0cHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcmlnaHQ6IGluaXRpYWw7XFxuICAgIHRvcDogMTdweDsgfVxcbiAgICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtZmxvYXRpbmctbGFiZWwsIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1mbG9hdGluZy1sYWJlbFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgbGVmdDogaW5pdGlhbDtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgcmlnaHQ6IDRweDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogMzZweDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogaW5pdGlhbDsgfVxcbiAgICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLS13aXRoLWxlYWRpbmctaWNvbiAubWRjLWZsb2F0aW5nLWxhYmVsLCAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLS13aXRoLWxlYWRpbmctaWNvbiAubWRjLWZsb2F0aW5nLWxhYmVsW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBsZWZ0OiBpbml0aWFsO1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICByaWdodDogMzZweDsgfVxcbiAgICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLS13aXRoLWxlYWRpbmctaWNvbiAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIGxlZnQ6IDQwcHg7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIHJpZ2h0OiBpbml0aWFsOyB9XFxuICAgICAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUsIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQtLXdpdGgtbGVhZGluZy1pY29uIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgICAgbGVmdDogaW5pdGlhbDtcXG4gICAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICAgIHJpZ2h0OiA0MHB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkX19pbnB1dCB7XFxuICBmb250LWZhbWlseTogUm9ib3RvLCBzYW5zLXNlcmlmO1xcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcXG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xcbiAgZm9udC1zaXplOiAxcmVtO1xcbiAgbGluZS1oZWlnaHQ6IDEuNzVyZW07XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDA5MzdlbTtcXG4gIHRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDtcXG4gIHRleHQtdHJhbnNmb3JtOiBpbmhlcml0O1xcbiAgYWxpZ24tc2VsZjogZmxleC1lbmQ7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICBwYWRkaW5nOiAyMHB4IDE2cHggNnB4O1xcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICBib3JkZXI6IG5vbmU7XFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQ7XFxuICBib3JkZXItcmFkaXVzOiAwO1xcbiAgYmFja2dyb3VuZDogbm9uZTtcXG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcXG4gICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcXG4gICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XFxuICAgIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSA2N21zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgNjdtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICBvcGFjaXR5OiAwO1xcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjU0KTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6LW1vei1wbGFjZWhvbGRlciB7XFxuICAgIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSA2N21zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgNjdtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICBvcGFjaXR5OiAwO1xcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjU0KTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHtcXG4gICAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IDY3bXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSA2N21zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAgIG9wYWNpdHk6IDA7XFxuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XFxuICAubWRjLXRleHQtZmllbGRfX2lucHV0OjpwbGFjZWhvbGRlciB7XFxuICAgIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSA2N21zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgNjdtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICBvcGFjaXR5OiAwO1xcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjU0KTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIge1xcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjU0KSAhaW1wb3J0YW50OyB9XFxuICAubWRjLXRleHQtZmllbGQtLWZ1bGx3aWR0aCAubWRjLXRleHQtZmllbGRfX2lucHV0Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS1uby1sYWJlbCAubWRjLXRleHQtZmllbGRfX2lucHV0Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIge1xcbiAgICAtd2Via2l0LXRyYW5zaXRpb24tZGVsYXk6IDQwbXM7XFxuICAgICAgICAgICAgdHJhbnNpdGlvbi1kZWxheTogNDBtcztcXG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAxMTBtcztcXG4gICAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAxMTBtcztcXG4gICAgb3BhY2l0eTogMTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1mdWxsd2lkdGggLm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6LW1vei1wbGFjZWhvbGRlcixcXG4gIC5tZGMtdGV4dC1maWVsZC0tbm8tbGFiZWwgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6LW1vei1wbGFjZWhvbGRlcixcXG4gIC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLXRleHQtZmllbGRfX2lucHV0OjotbW96LXBsYWNlaG9sZGVyIHtcXG4gICAgdHJhbnNpdGlvbi1kZWxheTogNDBtcztcXG4gICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMTEwbXM7XFxuICAgIG9wYWNpdHk6IDE7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tZnVsbHdpZHRoIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6Oi1tcy1pbnB1dC1wbGFjZWhvbGRlcixcXG4gIC5tZGMtdGV4dC1maWVsZC0tbm8tbGFiZWwgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6LW1zLWlucHV0LXBsYWNlaG9sZGVyLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6Oi1tcy1pbnB1dC1wbGFjZWhvbGRlciB7XFxuICAgIHRyYW5zaXRpb24tZGVsYXk6IDQwbXM7XFxuICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDExMG1zO1xcbiAgICBvcGFjaXR5OiAxOyB9XFxuICAubWRjLXRleHQtZmllbGQtLWZ1bGx3aWR0aCAubWRjLXRleHQtZmllbGRfX2lucHV0OjpwbGFjZWhvbGRlcixcXG4gIC5tZGMtdGV4dC1maWVsZC0tbm8tbGFiZWwgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6cGxhY2Vob2xkZXIsXFxuICAubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6cGxhY2Vob2xkZXIge1xcbiAgICAtd2Via2l0LXRyYW5zaXRpb24tZGVsYXk6IDQwbXM7XFxuICAgICAgICAgICAgdHJhbnNpdGlvbi1kZWxheTogNDBtcztcXG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAxMTBtcztcXG4gICAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAxMTBtcztcXG4gICAgb3BhY2l0eTogMTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDpmb2N1cyB7XFxuICAgIG91dGxpbmU6IG5vbmU7IH1cXG4gIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6aW52YWxpZCB7XFxuICAgIGJveC1zaGFkb3c6IG5vbmU7IH1cXG4gIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6LXdlYmtpdC1hdXRvZmlsbCB7XFxuICAgIHotaW5kZXg6IGF1dG8gIWltcG9ydGFudDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1uby1sYWJlbDpub3QoLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEpIC5tZGMtdGV4dC1maWVsZF9faW5wdXQge1xcbiAgICBwYWRkaW5nLXRvcDogMTZweDtcXG4gICAgcGFkZGluZy1ib3R0b206IDE2cHg7IH1cXG5cXG4ubWRjLXRleHQtZmllbGRfX2lucHV0Oi13ZWJraXQtYXV0b2ZpbGwgKyAubWRjLWZsb2F0aW5nLWxhYmVsIHtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7XFxuICBjdXJzb3I6IGF1dG87IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIHtcXG4gIGJvcmRlcjogbm9uZTtcXG4gIG92ZXJmbG93OiB2aXNpYmxlOyB9XFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyxcXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCxcXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICAgIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCkgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCkgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCxcXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLWZvY3VzZWQpIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6aG92ZXIgfiAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcsXFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKTpub3QoLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkKSAubWRjLXRleHQtZmllbGRfX2ljb246aG92ZXIgfiAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyxcXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLWZvY3VzZWQpIC5tZGMtdGV4dC1maWVsZF9faWNvbjpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCxcXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLWZvY3VzZWQpIC5tZGMtdGV4dC1maWVsZF9faWNvbjpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICAgIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKS5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKS5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcge1xcbiAgICBib3JkZXItY29sb3I6ICM2MjAwZWU7XFxuICAgIC8qIEBhbHRlcm5hdGUgKi9cXG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtcHJpbWFyeSwgIzYyMDBlZSk7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tc2hha2Uge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXRleHQtZmllbGQtb3V0bGluZWQgMjUwbXMgMTtcXG4gICAgICAgICAgICBhbmltYXRpb246IG1kYy1mbG9hdGluZy1sYWJlbC1zaGFrZS1mbG9hdC1hYm92ZS10ZXh0LWZpZWxkLW91dGxpbmVkIDI1MG1zIDE7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGJvcmRlci1yYWRpdXM6IDRweCAwIDAgNHB4OyB9XFxuICAgIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmdbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIGJvcmRlci1yYWRpdXM6IDAgNHB4IDRweCAwOyB9XFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgYm9yZGVyLXJhZGl1czogMCA0cHggNHB4IDA7IH1cXG4gICAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcsIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBib3JkZXItcmFkaXVzOiA0cHggMCAwIDRweDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xNDQlKSBzY2FsZSgxKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTE0NCUpIHNjYWxlKDEpOyB9XFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gICAgZm9udC1zaXplOiAwLjc1cmVtOyB9XFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSxcXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gICAgZm9udC1zaXplOiAxcmVtOyB9XFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkOjpiZWZvcmUsIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQ6OmFmdGVyIHtcXG4gICAgY29udGVudDogbm9uZTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gICAgZGlzcGxheTogLXdlYmtpdC1ib3g7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIHBhZGRpbmc6IDEycHggMTZweCAxNHB4O1xcbiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIHotaW5kZXg6IDE7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy10ZXh0LWZpZWxkX19pY29uIHtcXG4gICAgei1pbmRleDogMjsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXFxuLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcge1xcbiAgYm9yZGVyLXdpZHRoOiAycHg7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcge1xcbiAgICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNik7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWRpc2FibGVkIC5tZGMtdGV4dC1maWVsZF9faW5wdXQge1xcbiAgICBib3JkZXItYm90dG9tOiBub25lOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGVuc2Uge1xcbiAgaGVpZ2h0OiA0OHB4OyB9XFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMzQlKSBzY2FsZSgxKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEzNCUpIHNjYWxlKDEpOyB9XFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICAgIGZvbnQtc2l6ZTogMC44cmVtOyB9XFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kZW5zZS5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSxcXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGVuc2UubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUsXFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgICBmb250LXNpemU6IDFyZW07IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtZmxvYXRpbmctbGFiZWwtLXNoYWtlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb246IG1kYy1mbG9hdGluZy1sYWJlbC1zaGFrZS1mbG9hdC1hYm92ZS10ZXh0LWZpZWxkLW91dGxpbmVkLWRlbnNlIDI1MG1zIDE7XFxuICAgICAgICAgICAgYW5pbWF0aW9uOiBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1vdXRsaW5lZC1kZW5zZSAyNTBtcyAxOyB9XFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gICAgcGFkZGluZzogMTJweCAxMnB4IDdweDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICAgIHRvcDogMTRweDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy10ZXh0LWZpZWxkX19pY29uIHtcXG4gICAgdG9wOiAxMnB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbiAubWRjLXRleHQtZmllbGRfX2ljb24ge1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgbGVmdDogMTZweDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHJpZ2h0OiBpbml0aWFsOyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uIC5tZGMtdGV4dC1maWVsZF9faWNvbiwgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbiAubWRjLXRleHQtZmllbGRfX2ljb25bZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogaW5pdGlhbDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogMTZweDsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy10ZXh0LWZpZWxkX19pbnB1dCB7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLWxlZnQ6IDQ4cHg7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLXJpZ2h0OiAxNnB4OyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uIC5tZGMtdGV4dC1maWVsZF9faW5wdXQsIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy10ZXh0LWZpZWxkX19pbnB1dFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLWxlZnQ6IDE2cHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcGFkZGluZy1yaWdodDogNDhweDsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICAvKiBAbm9mbGlwICovXFxuICBsZWZ0OiA0OHB4O1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgcmlnaHQ6IGluaXRpYWw7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy1mbG9hdGluZy1sYWJlbCwgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbiAubWRjLWZsb2F0aW5nLWxhYmVsW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IGluaXRpYWw7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcmlnaHQ6IDQ4cHg7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLXRleHQtZmllbGRfX2ljb24ge1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgbGVmdDogMTZweDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHJpZ2h0OiBpbml0aWFsOyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLXRleHQtZmllbGRfX2ljb24sIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtdGV4dC1maWVsZF9faWNvbltkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBsZWZ0OiBpbml0aWFsO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHJpZ2h0OiAxNnB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy10ZXh0LWZpZWxkX19pbnB1dCB7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLWxlZnQ6IDQ4cHg7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLXJpZ2h0OiAxNnB4OyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLXRleHQtZmllbGRfX2lucHV0LCAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLXRleHQtZmllbGRfX2lucHV0W2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHBhZGRpbmctbGVmdDogMTZweDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLXJpZ2h0OiA0OHB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTE0NCUpIHRyYW5zbGF0ZVgoLTMycHgpIHNjYWxlKDEpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTE0NCUpIHRyYW5zbGF0ZVgoLTMycHgpIHNjYWxlKDEpOyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSwgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmVbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xNDQlKSB0cmFuc2xhdGVYKDMycHgpIHNjYWxlKDEpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTQ0JSkgdHJhbnNsYXRlWCgzMnB4KSBzY2FsZSgxKTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gIGZvbnQtc2l6ZTogMC43NXJlbTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlLFxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTMwJSkgdHJhbnNsYXRlWCgtMzJweCkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTMwJSkgdHJhbnNsYXRlWCgtMzJweCkgc2NhbGUoMC43NSk7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlLCAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZVtkaXI9XFxcInJ0bFxcXCJdLCBbZGlyPVxcXCJydGxcXFwiXVxcbiAgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTMwJSkgdHJhbnNsYXRlWCgzMnB4KSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEzMCUpIHRyYW5zbGF0ZVgoMzJweCkgc2NhbGUoMC43NSk7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSxcXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgZm9udC1zaXplOiAxcmVtOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tc2hha2Uge1xcbiAgLXdlYmtpdC1hbmltYXRpb246IG1kYy1mbG9hdGluZy1sYWJlbC1zaGFrZS1mbG9hdC1hYm92ZS10ZXh0LWZpZWxkLW91dGxpbmVkLWxlYWRpbmctaWNvbiAyNTBtcyAxO1xcbiAgICAgICAgICBhbmltYXRpb246IG1kYy1mbG9hdGluZy1sYWJlbC1zaGFrZS1mbG9hdC1hYm92ZS10ZXh0LWZpZWxkLW91dGxpbmVkLWxlYWRpbmctaWNvbiAyNTBtcyAxOyB9XFxuXFxuW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tc2hha2UsIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy1mbG9hdGluZy1sYWJlbC0tc2hha2Uge1xcbiAgLXdlYmtpdC1hbmltYXRpb246IG1kYy1mbG9hdGluZy1sYWJlbC1zaGFrZS1mbG9hdC1hYm92ZS10ZXh0LWZpZWxkLW91dGxpbmVkLWxlYWRpbmctaWNvbi1ydGwgMjUwbXMgMTtcXG4gICAgICAgICAgYW5pbWF0aW9uOiBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1vdXRsaW5lZC1sZWFkaW5nLWljb24tcnRsIDI1MG1zIDE7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLWZsb2F0aW5nLWxhYmVsIHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIGxlZnQ6IDM2cHg7XFxuICAvKiBAbm9mbGlwICovXFxuICByaWdodDogaW5pdGlhbDsgfVxcbiAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1mbG9hdGluZy1sYWJlbCwgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1mbG9hdGluZy1sYWJlbFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBsZWZ0OiBpbml0aWFsO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHJpZ2h0OiAzNnB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMzQlKSB0cmFuc2xhdGVYKC0yMXB4KSBzY2FsZSgxKTtcXG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMzQlKSB0cmFuc2xhdGVYKC0yMXB4KSBzY2FsZSgxKTsgfVxcbiAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlLCAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmVbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMzQlKSB0cmFuc2xhdGVYKDIxcHgpIHNjYWxlKDEpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTM0JSkgdHJhbnNsYXRlWCgyMXB4KSBzY2FsZSgxKTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICBmb250LXNpemU6IDAuOHJlbTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kZW5zZS5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSxcXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMjAlKSB0cmFuc2xhdGVYKC0yMXB4KSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEyMCUpIHRyYW5zbGF0ZVgoLTIxcHgpIHNjYWxlKDAuOCk7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kZW5zZS5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSwgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWRlbnNlLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlW2Rpcj1cXFwicnRsXFxcIl0sIFtkaXI9XFxcInJ0bFxcXCJdXFxuICAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZVtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEyMCUpIHRyYW5zbGF0ZVgoMjFweCkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEyMCUpIHRyYW5zbGF0ZVgoMjFweCkgc2NhbGUoMC44KTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kZW5zZS5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSxcXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gIGZvbnQtc2l6ZTogMXJlbTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLWZsb2F0aW5nLWxhYmVsLS1zaGFrZSB7XFxuICAtd2Via2l0LWFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXRleHQtZmllbGQtb3V0bGluZWQtbGVhZGluZy1pY29uLWRlbnNlIDI1MG1zIDE7XFxuICAgICAgICAgIGFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXRleHQtZmllbGQtb3V0bGluZWQtbGVhZGluZy1pY29uLWRlbnNlIDI1MG1zIDE7IH1cXG5cXG5bZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy1mbG9hdGluZy1sYWJlbC0tc2hha2UsIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kZW5zZVtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtZmxvYXRpbmctbGFiZWwtLXNoYWtlIHtcXG4gIC13ZWJraXQtYW5pbWF0aW9uOiBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1vdXRsaW5lZC1sZWFkaW5nLWljb24tZGVuc2UtcnRsIDI1MG1zIDE7XFxuICAgICAgICAgIGFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXRleHQtZmllbGQtb3V0bGluZWQtbGVhZGluZy1pY29uLWRlbnNlLXJ0bCAyNTBtcyAxOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgbGVmdDogMzJweDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHJpZ2h0OiBpbml0aWFsOyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy1mbG9hdGluZy1sYWJlbCwgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtZmxvYXRpbmctbGFiZWxbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogaW5pdGlhbDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogMzJweDsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uIC5tZGMtdGV4dC1maWVsZF9faWNvbiB7XFxuICAvKiBAbm9mbGlwICovXFxuICBsZWZ0OiBpbml0aWFsO1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgcmlnaHQ6IDEycHg7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uIC5tZGMtdGV4dC1maWVsZF9faWNvbiwgLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24gLm1kYy10ZXh0LWZpZWxkX19pY29uW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IDEycHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcmlnaHQ6IGluaXRpYWw7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbiAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctbGVmdDogMTZweDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctcmlnaHQ6IDQ4cHg7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uIC5tZGMtdGV4dC1maWVsZF9faW5wdXQsIC5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uIC5tZGMtdGV4dC1maWVsZF9faW5wdXRbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcGFkZGluZy1sZWZ0OiA0OHB4O1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHBhZGRpbmctcmlnaHQ6IDE2cHg7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy10ZXh0LWZpZWxkX19pY29uIHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIGxlZnQ6IGluaXRpYWw7XFxuICAvKiBAbm9mbGlwICovXFxuICByaWdodDogMTZweDsgfVxcbiAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtdGV4dC1maWVsZF9faWNvbiwgLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtdGV4dC1maWVsZF9faWNvbltkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBsZWZ0OiAxNnB4O1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHJpZ2h0OiBpbml0aWFsOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtdGV4dC1maWVsZF9faW5wdXQge1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgcGFkZGluZy1sZWZ0OiAxNnB4O1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgcGFkZGluZy1yaWdodDogNDhweDsgfVxcbiAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtdGV4dC1maWVsZF9faW5wdXQsIC5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLXRleHQtZmllbGRfX2lucHV0W2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHBhZGRpbmctbGVmdDogNDhweDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLXJpZ2h0OiAxNnB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uIC5tZGMtdGV4dC1maWVsZF9faWNvbiB7XFxuICAvKiBAbm9mbGlwICovXFxuICBsZWZ0OiAxNnB4O1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgcmlnaHQ6IGF1dG87IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbiAubWRjLXRleHQtZmllbGRfX2ljb24sIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbiAubWRjLXRleHQtZmllbGRfX2ljb25bZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogYXV0bztcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogMTZweDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uIC5tZGMtdGV4dC1maWVsZF9faWNvbiB+IC5tZGMtdGV4dC1maWVsZF9faWNvbiB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcmlnaHQ6IDEycHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogYXV0bzsgfVxcbiAgICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24gLm1kYy10ZXh0LWZpZWxkX19pY29uIH4gLm1kYy10ZXh0LWZpZWxkX19pY29uLCAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24gLm1kYy10ZXh0LWZpZWxkX19pY29uIH4gLm1kYy10ZXh0LWZpZWxkX19pY29uW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICByaWdodDogYXV0bztcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgbGVmdDogMTJweDsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbiAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctbGVmdDogNDhweDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctcmlnaHQ6IDQ4cHg7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbiAubWRjLXRleHQtZmllbGRfX2lucHV0LCAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24gLm1kYy10ZXh0LWZpZWxkX19pbnB1dFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLWxlZnQ6IDQ4cHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcGFkZGluZy1yaWdodDogNDhweDsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtdGV4dC1maWVsZF9faWNvbixcXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy10ZXh0LWZpZWxkX19pY29uIHtcXG4gIGJvdHRvbTogMTZweDtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjgpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOCk7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLXRleHQtZmllbGRfX2ljb24ge1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgbGVmdDogMTJweDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHJpZ2h0OiBpbml0aWFsOyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLXRleHQtZmllbGRfX2ljb24sIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtdGV4dC1maWVsZF9faWNvbltkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBsZWZ0OiBpbml0aWFsO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHJpZ2h0OiAxMnB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy10ZXh0LWZpZWxkX19pbnB1dCB7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLWxlZnQ6IDQ0cHg7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLXJpZ2h0OiAxNnB4OyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLXRleHQtZmllbGRfX2lucHV0LCAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLXRleHQtZmllbGRfX2lucHV0W2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHBhZGRpbmctbGVmdDogMTZweDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLXJpZ2h0OiA0NHB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICAvKiBAbm9mbGlwICovXFxuICBsZWZ0OiA0NHB4O1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgcmlnaHQ6IGluaXRpYWw7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtZmxvYXRpbmctbGFiZWwsIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtZmxvYXRpbmctbGFiZWxbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogaW5pdGlhbDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogNDRweDsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLXRleHQtZmllbGRfX2ljb24ge1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgbGVmdDogaW5pdGlhbDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHJpZ2h0OiAxMnB4OyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy10ZXh0LWZpZWxkX19pY29uLCAubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy10ZXh0LWZpZWxkX19pY29uW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IDEycHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcmlnaHQ6IGluaXRpYWw7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy10ZXh0LWZpZWxkX19pbnB1dCB7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLWxlZnQ6IDE2cHg7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLXJpZ2h0OiA0NHB4OyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy10ZXh0LWZpZWxkX19pbnB1dCwgLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24ubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtdGV4dC1maWVsZF9faW5wdXRbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcGFkZGluZy1sZWZ0OiA0NHB4O1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHBhZGRpbmctcmlnaHQ6IDE2cHg7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24ubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtdGV4dC1maWVsZF9faWNvbiB7XFxuICAvKiBAbm9mbGlwICovXFxuICBsZWZ0OiAxMnB4O1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgcmlnaHQ6IGF1dG87IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy10ZXh0LWZpZWxkX19pY29uLCAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24ubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtdGV4dC1maWVsZF9faWNvbltkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBsZWZ0OiBhdXRvO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHJpZ2h0OiAxMnB4OyB9XFxuICAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24ubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtdGV4dC1maWVsZF9faWNvbiB+IC5tZGMtdGV4dC1maWVsZF9faWNvbiB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcmlnaHQ6IDEycHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogYXV0bzsgfVxcbiAgICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24ubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtdGV4dC1maWVsZF9faWNvbiB+IC5tZGMtdGV4dC1maWVsZF9faWNvbiwgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLXRleHQtZmllbGRfX2ljb24gfiAubWRjLXRleHQtZmllbGRfX2ljb25bZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIHJpZ2h0OiBhdXRvO1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBsZWZ0OiAxMnB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctbGVmdDogNDRweDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctcmlnaHQ6IDQ0cHg7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy10ZXh0LWZpZWxkX19pbnB1dCwgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLXRleHQtZmllbGRfX2lucHV0W2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHBhZGRpbmctbGVmdDogNDRweDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLXJpZ2h0OiA0NHB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNzAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTcwJSkgc2NhbGUoMC44KTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy1mbG9hdGluZy1sYWJlbC0tc2hha2Uge1xcbiAgLXdlYmtpdC1hbmltYXRpb246IG1kYy1mbG9hdGluZy1sYWJlbC1zaGFrZS1mbG9hdC1hYm92ZS10ZXh0LWZpZWxkLWRlbnNlIDI1MG1zIDE7XFxuICAgICAgICAgIGFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXRleHQtZmllbGQtZGVuc2UgMjUwbXMgMTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy10ZXh0LWZpZWxkX19pbnB1dCB7XFxuICBwYWRkaW5nOiAxMnB4IDEycHggMDsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICBmb250LXNpemU6IC44MTNyZW07IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgICBmb250LXNpemU6IC44MTNyZW07IH1cXG5cXG4ubWRjLXRleHQtZmllbGRfX2lucHV0OnJlcXVpcmVkIH4gLm1kYy1mbG9hdGluZy1sYWJlbDo6YWZ0ZXIsXFxuLm1kYy10ZXh0LWZpZWxkX19pbnB1dDpyZXF1aXJlZCB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtZmxvYXRpbmctbGFiZWw6OmFmdGVyIHtcXG4gIG1hcmdpbi1sZWZ0OiAxcHg7XFxuICBjb250ZW50OiBcXFwiKlxcXCI7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLXRleHRhcmVhIHtcXG4gIGRpc3BsYXk6IC13ZWJraXQtaW5saW5lLWJveDtcXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcbiAgd2lkdGg6IGF1dG87XFxuICBoZWlnaHQ6IGF1dG87XFxuICAtd2Via2l0LXRyYW5zaXRpb246IG5vbmU7XFxuICB0cmFuc2l0aW9uOiBub25lO1xcbiAgb3ZlcmZsb3c6IHZpc2libGU7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWE6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYTpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYTpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIHtcXG4gICAgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzgpOyB9XFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKTpub3QoLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkKSAubWRjLXRleHQtZmllbGRfX2lucHV0OmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKTpub3QoLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkKSAubWRjLXRleHQtZmllbGRfX2lucHV0OmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYTpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCkgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyxcXG4gIC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWE6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLWZvY3VzZWQpIC5tZGMtdGV4dC1maWVsZF9faWNvbjpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYTpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCkgLm1kYy10ZXh0LWZpZWxkX19pY29uOmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYTpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCkgLm1kYy10ZXh0LWZpZWxkX19pY29uOmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIHtcXG4gICAgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKS5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyxcXG4gIC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWE6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCxcXG4gIC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWE6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICAgIGJvcmRlci1jb2xvcjogIzYyMDBlZTtcXG4gICAgLyogQGFsdGVybmF0ZSAqL1xcbiAgICBib3JkZXItY29sb3I6IHZhcigtLW1kYy10aGVtZS1wcmltYXJ5LCAjNjIwMGVlKTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYSAubWRjLWZsb2F0aW5nLWxhYmVsLS1zaGFrZSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1vdXRsaW5lZCAyNTBtcyAxO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXRleHQtZmllbGQtb3V0bGluZWQgMjUwbXMgMTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYSAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgYm9yZGVyLXJhZGl1czogNHB4IDAgMCA0cHg7IH1cXG4gICAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYSAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZywgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYSAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZ1tkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgYm9yZGVyLXJhZGl1czogMCA0cHggNHB4IDA7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEgLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBib3JkZXItcmFkaXVzOiAwIDRweCA0cHggMDsgfVxcbiAgICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhIC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZywgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYSAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmdbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweCAwIDAgNHB4OyB9XFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhOjpiZWZvcmUsIC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWE6OmFmdGVyIHtcXG4gICAgY29udGVudDogbm9uZTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYTpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYSAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xNDQlKSBzY2FsZSgxKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTE0NCUpIHNjYWxlKDEpOyB9XFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gICAgZm9udC1zaXplOiAwLjc1cmVtOyB9XFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYSAubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYS5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSxcXG4gIC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEgLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gICAgZm9udC1zaXplOiAxcmVtOyB9XFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhIC5tZGMtdGV4dC1maWVsZC1jaGFyYWN0ZXItY291bnRlciB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogaW5pdGlhbDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogMTZweDtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBib3R0b206IDEzcHg7IH1cXG4gICAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYSAubWRjLXRleHQtZmllbGQtY2hhcmFjdGVyLWNvdW50ZXIsIC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEgLm1kYy10ZXh0LWZpZWxkLWNoYXJhY3Rlci1jb3VudGVyW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBsZWZ0OiAxNnB4O1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICByaWdodDogaW5pdGlhbDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYSAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gICAgYWxpZ24tc2VsZjogYXV0bztcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgaGVpZ2h0OiBhdXRvO1xcbiAgICBtYXJnaW46IDhweCAxcHggMXB4IDA7XFxuICAgIHBhZGRpbmc6IDAgMTZweCAxNnB4O1xcbiAgICBib3JkZXI6IG5vbmU7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEgLm1kYy10ZXh0LWZpZWxkLWNoYXJhY3Rlci1jb3VudGVyICsgLm1kYy10ZXh0LWZpZWxkX19pbnB1dCB7XFxuICAgIG1hcmdpbi1ib3R0b206IDI4cHg7XFxuICAgIHBhZGRpbmctYm90dG9tOiAwOyB9XFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhIC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgICB0b3A6IDE3cHg7XFxuICAgIGJvdHRvbTogYXV0bztcXG4gICAgd2lkdGg6IGF1dG87XFxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lOyB9XFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYS5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICAgIGJvcmRlci13aWR0aDogMnB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS1mdWxsd2lkdGgge1xcbiAgd2lkdGg6IDEwMCU7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tZnVsbHdpZHRoOm5vdCgubWRjLXRleHQtZmllbGQtLXRleHRhcmVhKSB7XFxuICAgIGRpc3BsYXk6IGJsb2NrOyB9XFxuICAgIC5tZGMtdGV4dC1maWVsZC0tZnVsbHdpZHRoOm5vdCgubWRjLXRleHQtZmllbGQtLXRleHRhcmVhKTo6YmVmb3JlLCAubWRjLXRleHQtZmllbGQtLWZ1bGx3aWR0aDpub3QoLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYSk6OmFmdGVyIHtcXG4gICAgICBjb250ZW50OiBub25lOyB9XFxuICAgIC5tZGMtdGV4dC1maWVsZC0tZnVsbHdpZHRoOm5vdCgubWRjLXRleHQtZmllbGQtLXRleHRhcmVhKTpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkge1xcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyB9XFxuICAgIC5tZGMtdGV4dC1maWVsZC0tZnVsbHdpZHRoOm5vdCgubWRjLXRleHQtZmllbGQtLXRleHRhcmVhKSAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gICAgICBwYWRkaW5nOiAwOyB9XFxuICAubWRjLXRleHQtZmllbGQtLWZ1bGx3aWR0aC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEgLm1kYy10ZXh0LWZpZWxkX19pbnB1dCB7XFxuICAgIHJlc2l6ZTogdmVydGljYWw7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLWZ1bGx3aWR0aC5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEpIHtcXG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLWhlbHBlci1saW5lIHtcXG4gIGRpc3BsYXk6IC13ZWJraXQtYm94O1xcbiAgZGlzcGxheTogZmxleDtcXG4gIC13ZWJraXQtYm94LXBhY2s6IGp1c3RpZnk7XFxuICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tZGVuc2UgKyAubWRjLXRleHQtZmllbGQtaGVscGVyLWxpbmUge1xcbiAgICBtYXJnaW4tYm90dG9tOiA0cHg7IH1cXG4gIC5tZGMtdGV4dC1maWVsZCArIC5tZGMtdGV4dC1maWVsZC1oZWxwZXItbGluZSB7XFxuICAgIHBhZGRpbmctcmlnaHQ6IDE2cHg7XFxuICAgIHBhZGRpbmctbGVmdDogMTZweDsgfVxcblxcbi5tZGMtZm9ybS1maWVsZCA+IC5tZGMtdGV4dC1maWVsZCArIGxhYmVsIHtcXG4gIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLWZvY3VzZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgY29sb3I6IHJnYmEoOTgsIDAsIDIzOCwgMC44Nyk7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDpyZXF1aXJlZCB+IC5tZGMtZmxvYXRpbmctbGFiZWw6OmFmdGVyLFxcbi5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLXRleHQtZmllbGRfX2lucHV0OnJlcXVpcmVkIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1mbG9hdGluZy1sYWJlbDo6YWZ0ZXIge1xcbiAgY29sb3I6IHJnYmEoOTgsIDAsIDIzOCwgMC44Nyk7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgKyAubWRjLXRleHQtZmllbGQtaGVscGVyLWxpbmUgLm1kYy10ZXh0LWZpZWxkLWhlbHBlci10ZXh0Om5vdCgubWRjLXRleHQtZmllbGQtaGVscGVyLXRleHQtLXZhbGlkYXRpb24tbXNnKSB7XFxuICBvcGFjaXR5OiAxOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYS5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYS5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbi5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEubWRjLXRleHQtZmllbGQtLWZvY3VzZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICBib3JkZXItY29sb3I6ICM2MjAwZWU7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBib3JkZXItY29sb3I6IHZhcigtLW1kYy10aGVtZS1wcmltYXJ5LCAjNjIwMGVlKTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLXRleHRhcmVhKSAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKTpub3QoLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEpIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6aG92ZXIge1xcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogI2IwMDAyMDtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGJvcmRlci1ib3R0b20tY29sb3I6IHZhcigtLW1kYy10aGVtZS1lcnJvciwgI2IwMDAyMCk7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLWludmFsaWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtbGluZS1yaXBwbGUge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2IwMDAyMDtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1kYy10aGVtZS1lcnJvciwgI2IwMDAyMCk7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLWludmFsaWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBjb2xvcjogdmFyKC0tbWRjLXRoZW1lLWVycm9yLCAjYjAwMDIwKTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkubWRjLXRleHQtZmllbGQtLWludmFsaWQgKyAubWRjLXRleHQtZmllbGQtaGVscGVyLWxpbmUgLm1kYy10ZXh0LWZpZWxkLWhlbHBlci10ZXh0LS12YWxpZGF0aW9uLW1zZyB7XFxuICBjb2xvcjogI2IwMDAyMDtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkIC5tZGMtdGV4dC1maWVsZF9faW5wdXQge1xcbiAgY2FyZXQtY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBjYXJldC1jb2xvcjogdmFyKC0tbWRjLXRoZW1lLWVycm9yLCAjYjAwMDIwKTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0taW52YWxpZCAubWRjLXRleHQtZmllbGRfX2lucHV0OnJlcXVpcmVkIH4gLm1kYy1mbG9hdGluZy1sYWJlbDo6YWZ0ZXIsXFxuLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6cmVxdWlyZWQgfiAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLWZsb2F0aW5nLWxhYmVsOjphZnRlciB7XFxuICBjb2xvcjogI2IwMDAyMDtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb246bm90KC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24pOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKSAubWRjLXRleHQtZmllbGRfX2ljb24ge1xcbiAgY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBjb2xvcjogdmFyKC0tbWRjLXRoZW1lLWVycm9yLCAjYjAwMDIwKTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0taW52YWxpZC5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbjpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy10ZXh0LWZpZWxkX19pY29uIH4gLm1kYy10ZXh0LWZpZWxkX19pY29uIHtcXG4gIGNvbG9yOiAjYjAwMDIwO1xcbiAgLyogQGFsdGVybmF0ZSAqL1xcbiAgY29sb3I6IHZhcigtLW1kYy10aGVtZS1lcnJvciwgI2IwMDAyMCk7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLWludmFsaWQgKyAubWRjLXRleHQtZmllbGQtaGVscGVyLWxpbmUgLm1kYy10ZXh0LWZpZWxkLWhlbHBlci10ZXh0LS12YWxpZGF0aW9uLW1zZyB7XFxuICBvcGFjaXR5OiAxOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYS5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYS5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbi5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEubWRjLXRleHQtZmllbGQtLWludmFsaWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICBib3JkZXItY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBib3JkZXItY29sb3I6IHZhcigtLW1kYy10aGVtZS1lcnJvciwgI2IwMDAyMCk7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLXRleHRhcmVhLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKTpub3QoLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkKSAubWRjLXRleHQtZmllbGRfX2lucHV0OmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYS5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCkgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCxcXG4ubWRjLXRleHQtZmllbGQtLXRleHRhcmVhLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKTpub3QoLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkKSAubWRjLXRleHQtZmllbGRfX2lucHV0OmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nLFxcbi5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEubWRjLXRleHQtZmllbGQtLWludmFsaWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLWZvY3VzZWQpIC5tZGMtdGV4dC1maWVsZF9faWNvbjpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nLFxcbi5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEubWRjLXRleHQtZmllbGQtLWludmFsaWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLWZvY3VzZWQpIC5tZGMtdGV4dC1maWVsZF9faWNvbjpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCxcXG4ubWRjLXRleHQtZmllbGQtLXRleHRhcmVhLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKTpub3QoLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkKSAubWRjLXRleHQtZmllbGRfX2ljb246aG92ZXIgfiAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcge1xcbiAgYm9yZGVyLWNvbG9yOiAjYjAwMDIwO1xcbiAgLyogQGFsdGVybmF0ZSAqL1xcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYS5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYS5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbi5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEubWRjLXRleHQtZmllbGQtLWludmFsaWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICBib3JkZXItY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBib3JkZXItY29sb3I6IHZhcigtLW1kYy10aGVtZS1lcnJvciwgI2IwMDAyMCk7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyxcXG4ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXFxuLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIHtcXG4gIGJvcmRlci1jb2xvcjogI2IwMDAyMDtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGJvcmRlci1jb2xvcjogdmFyKC0tbWRjLXRoZW1lLWVycm9yLCAjYjAwMDIwKTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWludmFsaWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLWZvY3VzZWQpIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6aG92ZXIgfiAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyxcXG4ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKTpub3QoLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkKSAubWRjLXRleHQtZmllbGRfX2lucHV0OmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWludmFsaWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLWZvY3VzZWQpIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6aG92ZXIgfiAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcsXFxuLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCkgLm1kYy10ZXh0LWZpZWxkX19pY29uOmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCkgLm1kYy10ZXh0LWZpZWxkX19pY29uOmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWludmFsaWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLWZvY3VzZWQpIC5tZGMtdGV4dC1maWVsZF9faWNvbjpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICBib3JkZXItY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBib3JkZXItY29sb3I6IHZhcigtLW1kYy10aGVtZS1lcnJvciwgI2IwMDAyMCk7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKS5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyxcXG4ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKS5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXFxuLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIHtcXG4gIGJvcmRlci1jb2xvcjogI2IwMDAyMDtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGJvcmRlci1jb2xvcjogdmFyKC0tbWRjLXRoZW1lLWVycm9yLCAjYjAwMDIwKTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcXG4gIGJvcmRlci1ib3R0b206IG5vbmU7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA2KTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNyk7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQgLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzcpOyB9XFxuICAubWRjLXRleHQtZmllbGQtLWRpc2FibGVkICsgLm1kYy10ZXh0LWZpZWxkLWhlbHBlci1saW5lIC5tZGMtdGV4dC1maWVsZC1oZWxwZXItdGV4dCB7XFxuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzcpOyB9XFxuICAubWRjLXRleHQtZmllbGQtLWRpc2FibGVkIC5tZGMtdGV4dC1maWVsZC1jaGFyYWN0ZXItY291bnRlcixcXG4gIC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQgKyAubWRjLXRleHQtZmllbGQtaGVscGVyLWxpbmUgLm1kYy10ZXh0LWZpZWxkLWNoYXJhY3Rlci1jb3VudGVyIHtcXG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNyk7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQgLm1kYy10ZXh0LWZpZWxkX19pY29uIHtcXG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zKTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZDpub3QoLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYSkge1xcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XFxuICAubWRjLXRleHQtZmllbGQtLWRpc2FibGVkIC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgICBjdXJzb3I6IGRlZmF1bHQ7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLXRleHRhcmVhLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEubWRjLXRleHQtZmllbGQtLWRpc2FibGVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYS5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYS5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIHtcXG4gICAgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDYpOyB9XFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gICAgYm9yZGVyLWJvdHRvbTogbm9uZTsgfVxcblxcbkAtd2Via2l0LWtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1kZW5zZSB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtNzAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTcwJSkgc2NhbGUoMC44KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDAlKSkgdHJhbnNsYXRlWSgtNzAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gMCUpKSB0cmFuc2xhdGVZKC03MCUpIHNjYWxlKDAuOCk7IH1cXG4gIDY2JSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTcwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTcwJSkgc2NhbGUoMC44KTsgfVxcbiAgMTAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtNzAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTcwJSkgc2NhbGUoMC44KTsgfSB9XFxuXFxuQGtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1kZW5zZSB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtNzAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTcwJSkgc2NhbGUoMC44KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDAlKSkgdHJhbnNsYXRlWSgtNzAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gMCUpKSB0cmFuc2xhdGVZKC03MCUpIHNjYWxlKDAuOCk7IH1cXG4gIDY2JSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTcwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTcwJSkgc2NhbGUoMC44KTsgfVxcbiAgMTAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtNzAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTcwJSkgc2NhbGUoMC44KTsgfSB9XFxuXFxuQC13ZWJraXQta2V5ZnJhbWVzIG1kYy1mbG9hdGluZy1sYWJlbC1zaGFrZS1mbG9hdC1hYm92ZS10ZXh0LWZpZWxkLW91dGxpbmVkIHtcXG4gIDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICA2NiUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfSB9XFxuXFxuQGtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1vdXRsaW5lZCB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDMzJSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgNjYlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMTAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH0gfVxcblxcbkAtd2Via2l0LWtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1vdXRsaW5lZC1kZW5zZSB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpOyB9XFxuICAzMyUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNzAxNzMsIDAuNDk1ODIpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNzAxNzMsIDAuNDk1ODIpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gMCUpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gMCUpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpOyB9XFxuICA2NiUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMCUpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIDAlKSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTsgfVxcbiAgMTAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpOyB9IH1cXG5cXG5Aa2V5ZnJhbWVzIG1kYy1mbG9hdGluZy1sYWJlbC1zaGFrZS1mbG9hdC1hYm92ZS10ZXh0LWZpZWxkLW91dGxpbmVkLWRlbnNlIHtcXG4gIDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7IH1cXG4gIDMzJSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7IH1cXG4gIDY2JSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMCUpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpOyB9XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7IH0gfVxcblxcbkAtd2Via2l0LWtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1vdXRsaW5lZC1sZWFkaW5nLWljb24ge1xcbiAgMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgNjYlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfSB9XFxuXFxuQGtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1vdXRsaW5lZC1sZWFkaW5nLWljb24ge1xcbiAgMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgNjYlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfSB9XFxuXFxuQC13ZWJraXQta2V5ZnJhbWVzIG1kYy1mbG9hdGluZy1sYWJlbC1zaGFrZS1mbG9hdC1hYm92ZS10ZXh0LWZpZWxkLW91dGxpbmVkLWxlYWRpbmctaWNvbi1kZW5zZSB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDIxcHgpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAyMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDIxcHgpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gMjFweCkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7IH1cXG4gIDY2JSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAyMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAyMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTsgfVxcbiAgMTAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDIxcHgpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAyMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTsgfSB9XFxuXFxuQGtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1vdXRsaW5lZC1sZWFkaW5nLWljb24tZGVuc2Uge1xcbiAgMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAyMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMjFweCkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7IH1cXG4gIDMzJSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAyMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDIxcHgpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpOyB9XFxuICA2NiUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMjFweCkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMjFweCkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7IH1cXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAyMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMjFweCkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7IH0gfVxcblxcbkAtd2Via2l0LWtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1vdXRsaW5lZC1sZWFkaW5nLWljb24tcnRsIHtcXG4gIDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDMzJSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDY2JSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH0gfVxcblxcbkBrZXlmcmFtZXMgbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXRleHQtZmllbGQtb3V0bGluZWQtbGVhZGluZy1pY29uLXJ0bCB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICAzMyUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNzAxNzMsIDAuNDk1ODIpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNzAxNzMsIDAuNDk1ODIpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gMCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gMCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICA2NiUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMTAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9IH1cXG5cXG5ALXdlYmtpdC1rZXlmcmFtZXMgbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXRleHQtZmllbGQtb3V0bGluZWQtbGVhZGluZy1pY29uLWRlbnNlLXJ0bCB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIC0yMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gLTIxcHgpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpOyB9XFxuICAzMyUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNzAxNzMsIDAuNDk1ODIpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNzAxNzMsIDAuNDk1ODIpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gLTIxcHgpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gLTIxcHgpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpOyB9XFxuICA2NiUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gLTIxcHgpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIC0yMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTsgfVxcbiAgMTAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIC0yMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gLTIxcHgpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpOyB9IH1cXG5cXG5Aa2V5ZnJhbWVzIG1kYy1mbG9hdGluZy1sYWJlbC1zaGFrZS1mbG9hdC1hYm92ZS10ZXh0LWZpZWxkLW91dGxpbmVkLWxlYWRpbmctaWNvbi1kZW5zZS1ydGwge1xcbiAgMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAtMjFweCkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIC0yMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIC0yMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIC0yMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTsgfVxcbiAgNjYlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIC0yMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAtMjFweCkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7IH1cXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAtMjFweCkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIC0yMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTsgfSB9XFxuXFxuQC13ZWJraXQta2V5ZnJhbWVzIG1kYy1mbG9hdGluZy1sYWJlbC1zaGFrZS1mbG9hdC1hYm92ZS10ZXh0YXJlYSB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDMzJSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgNjYlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMTAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH0gfVxcblxcbkBrZXlmcmFtZXMgbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXRleHRhcmVhIHtcXG4gIDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICA2NiUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfSB9XCIsIFwiXCJdKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xuLy8gY3NzIGJhc2UgY29kZSwgaW5qZWN0ZWQgYnkgdGhlIGNzcy1sb2FkZXJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh1c2VTb3VyY2VNYXApIHtcbiAgdmFyIGxpc3QgPSBbXTsgLy8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZ1xuXG4gIGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjb250ZW50ID0gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtLCB1c2VTb3VyY2VNYXApO1xuXG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICByZXR1cm4gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwie1wiKS5jb25jYXQoY29udGVudCwgXCJ9XCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKCcnKTtcbiAgfTsgLy8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcblxuXG4gIGxpc3QuaSA9IGZ1bmN0aW9uIChtb2R1bGVzLCBtZWRpYVF1ZXJ5KSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCAnJ11dO1xuICAgIH1cblxuICAgIHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItZGVzdHJ1Y3R1cmluZ1xuICAgICAgdmFyIGlkID0gdGhpc1tpXVswXTtcblxuICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBtb2R1bGVzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIGl0ZW0gPSBtb2R1bGVzW19pXTsgLy8gc2tpcCBhbHJlYWR5IGltcG9ydGVkIG1vZHVsZVxuICAgICAgLy8gdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3QgMTAwJSBwZXJmZWN0IGZvciB3ZWlyZCBtZWRpYSBxdWVyeSBjb21iaW5hdGlvbnNcbiAgICAgIC8vIHdoZW4gYSBtb2R1bGUgaXMgaW1wb3J0ZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgbWVkaWEgcXVlcmllcy5cbiAgICAgIC8vIEkgaG9wZSB0aGlzIHdpbGwgbmV2ZXIgb2NjdXIgKEhleSB0aGlzIHdheSB3ZSBoYXZlIHNtYWxsZXIgYnVuZGxlcylcblxuICAgICAgaWYgKGl0ZW1bMF0gPT0gbnVsbCB8fCAhYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xuICAgICAgICBpZiAobWVkaWFRdWVyeSAmJiAhaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYVF1ZXJ5O1xuICAgICAgICB9IGVsc2UgaWYgKG1lZGlhUXVlcnkpIHtcbiAgICAgICAgICBpdGVtWzJdID0gXCIoXCIuY29uY2F0KGl0ZW1bMl0sIFwiKSBhbmQgKFwiKS5jb25jYXQobWVkaWFRdWVyeSwgXCIpXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gbGlzdDtcbn07XG5cbmZ1bmN0aW9uIGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSwgdXNlU291cmNlTWFwKSB7XG4gIHZhciBjb250ZW50ID0gaXRlbVsxXSB8fCAnJzsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1kZXN0cnVjdHVyaW5nXG5cbiAgdmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuXG4gIGlmICghY3NzTWFwcGluZykge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgaWYgKHVzZVNvdXJjZU1hcCAmJiB0eXBlb2YgYnRvYSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBzb3VyY2VNYXBwaW5nID0gdG9Db21tZW50KGNzc01hcHBpbmcpO1xuICAgIHZhciBzb3VyY2VVUkxzID0gY3NzTWFwcGluZy5zb3VyY2VzLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICByZXR1cm4gXCIvKiMgc291cmNlVVJMPVwiLmNvbmNhdChjc3NNYXBwaW5nLnNvdXJjZVJvb3QpLmNvbmNhdChzb3VyY2UsIFwiICovXCIpO1xuICAgIH0pO1xuICAgIHJldHVybiBbY29udGVudF0uY29uY2F0KHNvdXJjZVVSTHMpLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKCdcXG4nKTtcbn0gLy8gQWRhcHRlZCBmcm9tIGNvbnZlcnQtc291cmNlLW1hcCAoTUlUKVxuXG5cbmZ1bmN0aW9uIHRvQ29tbWVudChzb3VyY2VNYXApIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpO1xuICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gIHJldHVybiBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG59IiwiLypcbm9iamVjdC1hc3NpZ25cbihjKSBTaW5kcmUgU29yaHVzXG5AbGljZW5zZSBNSVRcbiovXG5cbid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KHZhbCkge1xuXHRpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTtcblx0fVxuXG5cdHJldHVybiBPYmplY3QodmFsKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKCkge1xuXHR0cnkge1xuXHRcdGlmICghT2JqZWN0LmFzc2lnbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIERldGVjdCBidWdneSBwcm9wZXJ0eSBlbnVtZXJhdGlvbiBvcmRlciBpbiBvbGRlciBWOCB2ZXJzaW9ucy5cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQxMThcblx0XHR2YXIgdGVzdDEgPSBuZXcgU3RyaW5nKCdhYmMnKTsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3LXdyYXBwZXJzXG5cdFx0dGVzdDFbNV0gPSAnZGUnO1xuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MSlbMF0gPT09ICc1Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDIgPSB7fTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcblx0XHRcdHRlc3QyWydfJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTtcblx0XHR9XG5cdFx0dmFyIG9yZGVyMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24gKG4pIHtcblx0XHRcdHJldHVybiB0ZXN0MltuXTtcblx0XHR9KTtcblx0XHRpZiAob3JkZXIyLmpvaW4oJycpICE9PSAnMDEyMzQ1Njc4OScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QzID0ge307XG5cdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAobGV0dGVyKSB7XG5cdFx0XHR0ZXN0M1tsZXR0ZXJdID0gbGV0dGVyO1xuXHRcdH0pO1xuXHRcdGlmIChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PVxuXHRcdFx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdC8vIFdlIGRvbid0IGV4cGVjdCBhbnkgb2YgdGhlIGFib3ZlIHRvIHRocm93LCBidXQgYmV0dGVyIHRvIGJlIHNhZmUuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hvdWxkVXNlTmF0aXZlKCkgPyBPYmplY3QuYXNzaWduIDogZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG5cdHZhciBmcm9tO1xuXHR2YXIgdG8gPSB0b09iamVjdCh0YXJnZXQpO1xuXHR2YXIgc3ltYm9scztcblxuXHRmb3IgKHZhciBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKykge1xuXHRcdGZyb20gPSBPYmplY3QoYXJndW1lbnRzW3NdKTtcblxuXHRcdGZvciAodmFyIGtleSBpbiBmcm9tKSB7XG5cdFx0XHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB7XG5cdFx0XHRcdHRvW2tleV0gPSBmcm9tW2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuXHRcdFx0c3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9scyhmcm9tKTtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocHJvcElzRW51bWVyYWJsZS5jYWxsKGZyb20sIHN5bWJvbHNbaV0pKSB7XG5cdFx0XHRcdFx0dG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRvO1xufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcbiAgdmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xuICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuXG4gIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICsgdGV4dDtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gLS0tIFdlbGNvbWUgdG8gZGVidWdnaW5nIFJlYWN0IC0tLVxuICAgICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHN0YWNrXG4gICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9IGNhdGNoICh4KSB7fVxuICB9O1xufVxuXG4vKipcbiAqIEFzc2VydCB0aGF0IHRoZSB2YWx1ZXMgbWF0Y2ggd2l0aCB0aGUgdHlwZSBzcGVjcy5cbiAqIEVycm9yIG1lc3NhZ2VzIGFyZSBtZW1vcml6ZWQgYW5kIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0eXBlU3BlY3MgTWFwIG9mIG5hbWUgdG8gYSBSZWFjdFByb3BUeXBlXG4gKiBAcGFyYW0ge29iamVjdH0gdmFsdWVzIFJ1bnRpbWUgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSB0eXBlLWNoZWNrZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBlLmcuIFwicHJvcFwiLCBcImNvbnRleHRcIiwgXCJjaGlsZCBjb250ZXh0XCJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21wb25lbnROYW1lIE5hbWUgb2YgdGhlIGNvbXBvbmVudCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gez9GdW5jdGlvbn0gZ2V0U3RhY2sgUmV0dXJucyB0aGUgY29tcG9uZW50IHN0YWNrLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBnZXRTdGFjaykge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvcjtcbiAgICAgICAgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcihcbiAgICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICtcbiAgICAgICAgICAgICAgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvciA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yID0gZXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yICYmICEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAnICtcbiAgICAgICAgICAgIGxvY2F0aW9uICsgJyBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArXG4gICAgICAgICAgICAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJyArIHR5cGVvZiBlcnJvciArICcuICcgK1xuICAgICAgICAgICAgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgK1xuICAgICAgICAgICAgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArXG4gICAgICAgICAgICAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IubWVzc2FnZV0gPSB0cnVlO1xuXG4gICAgICAgICAgdmFyIHN0YWNrID0gZ2V0U3RhY2sgPyBnZXRTdGFjaygpIDogJyc7XG5cbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAnRmFpbGVkICcgKyBsb2NhdGlvbiArICcgdHlwZTogJyArIGVycm9yLm1lc3NhZ2UgKyAoc3RhY2sgIT0gbnVsbCA/IHN0YWNrIDogJycpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlc2V0cyB3YXJuaW5nIGNhY2hlIHdoZW4gdGVzdGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jaGVja1Byb3BUeXBlcy5yZXNldFdhcm5pbmdDYWNoZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2hlY2tQcm9wVHlwZXM7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJztcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlc1NlY3JldDtcbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuOC42XG4gKiByZWFjdC1kb20uZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cblxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xudmFyIGNoZWNrUHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcy9jaGVja1Byb3BUeXBlcycpO1xudmFyIHNjaGVkdWxlciA9IHJlcXVpcmUoJ3NjaGVkdWxlcicpO1xudmFyIHRyYWNpbmcgPSByZXF1aXJlKCdzY2hlZHVsZXIvdHJhY2luZycpO1xuXG4vKipcbiAqIFVzZSBpbnZhcmlhbnQoKSB0byBhc3NlcnQgc3RhdGUgd2hpY2ggeW91ciBwcm9ncmFtIGFzc3VtZXMgdG8gYmUgdHJ1ZS5cbiAqXG4gKiBQcm92aWRlIHNwcmludGYtc3R5bGUgZm9ybWF0IChvbmx5ICVzIGlzIHN1cHBvcnRlZCkgYW5kIGFyZ3VtZW50c1xuICogdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGJyb2tlIGFuZCB3aGF0IHlvdSB3ZXJlXG4gKiBleHBlY3RpbmcuXG4gKlxuICogVGhlIGludmFyaWFudCBtZXNzYWdlIHdpbGwgYmUgc3RyaXBwZWQgaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBpbnZhcmlhbnRcbiAqIHdpbGwgcmVtYWluIHRvIGVuc3VyZSBsb2dpYyBkb2VzIG5vdCBkaWZmZXIgaW4gcHJvZHVjdGlvbi5cbiAqL1xuXG52YXIgdmFsaWRhdGVGb3JtYXQgPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICB2YWxpZGF0ZUZvcm1hdCA9IGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YXJpYW50IHJlcXVpcmVzIGFuIGVycm9yIG1lc3NhZ2UgYXJndW1lbnQnKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGludmFyaWFudChjb25kaXRpb24sIGZvcm1hdCwgYSwgYiwgYywgZCwgZSwgZikge1xuICB2YWxpZGF0ZUZvcm1hdChmb3JtYXQpO1xuXG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgdmFyIGVycm9yID0gdm9pZCAwO1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ01pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50ICcgKyAnZm9yIHRoZSBmdWxsIGVycm9yIG1lc3NhZ2UgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFyZ3MgPSBbYSwgYiwgYywgZCwgZSwgZl07XG4gICAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107XG4gICAgICB9KSk7XG4gICAgICBlcnJvci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgIH1cblxuICAgIGVycm9yLmZyYW1lc1RvUG9wID0gMTsgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCBpbnZhcmlhbnQncyBvd24gZnJhbWVcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vLyBSZWx5aW5nIG9uIHRoZSBgaW52YXJpYW50KClgIGltcGxlbWVudGF0aW9uIGxldHMgdXNcbi8vIHByZXNlcnZlIHRoZSBmb3JtYXQgYW5kIHBhcmFtcyBpbiB0aGUgd3d3IGJ1aWxkcy5cblxuIVJlYWN0ID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RET00gd2FzIGxvYWRlZCBiZWZvcmUgUmVhY3QuIE1ha2Ugc3VyZSB5b3UgbG9hZCB0aGUgUmVhY3QgcGFja2FnZSBiZWZvcmUgbG9hZGluZyBSZWFjdERPTS4nKSA6IHZvaWQgMDtcblxudmFyIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwgPSBmdW5jdGlvbiAobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICB2YXIgZnVuY0FyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpO1xuICB0cnkge1xuICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgZnVuY0FyZ3MpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gIH1cbn07XG5cbntcbiAgLy8gSW4gREVWIG1vZGUsIHdlIHN3YXAgb3V0IGludm9rZUd1YXJkZWRDYWxsYmFjayBmb3IgYSBzcGVjaWFsIHZlcnNpb25cbiAgLy8gdGhhdCBwbGF5cyBtb3JlIG5pY2VseSB3aXRoIHRoZSBicm93c2VyJ3MgRGV2VG9vbHMuIFRoZSBpZGVhIGlzIHRvIHByZXNlcnZlXG4gIC8vIFwiUGF1c2Ugb24gZXhjZXB0aW9uc1wiIGJlaGF2aW9yLiBCZWNhdXNlIFJlYWN0IHdyYXBzIGFsbCB1c2VyLXByb3ZpZGVkXG4gIC8vIGZ1bmN0aW9ucyBpbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2ssIGFuZCB0aGUgcHJvZHVjdGlvbiB2ZXJzaW9uIG9mXG4gIC8vIGludm9rZUd1YXJkZWRDYWxsYmFjayB1c2VzIGEgdHJ5LWNhdGNoLCBhbGwgdXNlciBleGNlcHRpb25zIGFyZSB0cmVhdGVkXG4gIC8vIGxpa2UgY2F1Z2h0IGV4Y2VwdGlvbnMsIGFuZCB0aGUgRGV2VG9vbHMgd29uJ3QgcGF1c2UgdW5sZXNzIHRoZSBkZXZlbG9wZXJcbiAgLy8gdGFrZXMgdGhlIGV4dHJhIHN0ZXAgb2YgZW5hYmxpbmcgcGF1c2Ugb24gY2F1Z2h0IGV4Y2VwdGlvbnMuIFRoaXMgaXNcbiAgLy8gdW5pbnR1aXRpdmUsIHRob3VnaCwgYmVjYXVzZSBldmVuIHRob3VnaCBSZWFjdCBoYXMgY2F1Z2h0IHRoZSBlcnJvciwgZnJvbVxuICAvLyB0aGUgZGV2ZWxvcGVyJ3MgcGVyc3BlY3RpdmUsIHRoZSBlcnJvciBpcyB1bmNhdWdodC5cbiAgLy9cbiAgLy8gVG8gcHJlc2VydmUgdGhlIGV4cGVjdGVkIFwiUGF1c2Ugb24gZXhjZXB0aW9uc1wiIGJlaGF2aW9yLCB3ZSBkb24ndCB1c2UgYVxuICAvLyB0cnktY2F0Y2ggaW4gREVWLiBJbnN0ZWFkLCB3ZSBzeW5jaHJvbm91c2x5IGRpc3BhdGNoIGEgZmFrZSBldmVudCB0byBhIGZha2VcbiAgLy8gRE9NIG5vZGUsIGFuZCBjYWxsIHRoZSB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrIGZyb20gaW5zaWRlIGFuIGV2ZW50IGhhbmRsZXJcbiAgLy8gZm9yIHRoYXQgZmFrZSBldmVudC4gSWYgdGhlIGNhbGxiYWNrIHRocm93cywgdGhlIGVycm9yIGlzIFwiY2FwdHVyZWRcIiB1c2luZ1xuICAvLyBhIGdsb2JhbCBldmVudCBoYW5kbGVyLiBCdXQgYmVjYXVzZSB0aGUgZXJyb3IgaGFwcGVucyBpbiBhIGRpZmZlcmVudFxuICAvLyBldmVudCBsb29wIGNvbnRleHQsIGl0IGRvZXMgbm90IGludGVycnVwdCB0aGUgbm9ybWFsIHByb2dyYW0gZmxvdy5cbiAgLy8gRWZmZWN0aXZlbHksIHRoaXMgZ2l2ZXMgdXMgdHJ5LWNhdGNoIGJlaGF2aW9yIHdpdGhvdXQgYWN0dWFsbHkgdXNpbmdcbiAgLy8gdHJ5LWNhdGNoLiBOZWF0IVxuXG4gIC8vIENoZWNrIHRoYXQgdGhlIGJyb3dzZXIgc3VwcG9ydHMgdGhlIEFQSXMgd2UgbmVlZCB0byBpbXBsZW1lbnQgb3VyIHNwZWNpYWxcbiAgLy8gREVWIHZlcnNpb24gb2YgaW52b2tlR3VhcmRlZENhbGxiYWNrXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRpc3BhdGNoRXZlbnQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZmFrZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdyZWFjdCcpO1xuXG4gICAgdmFyIGludm9rZUd1YXJkZWRDYWxsYmFja0RldiA9IGZ1bmN0aW9uIChuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgICAvLyBJZiBkb2N1bWVudCBkb2Vzbid0IGV4aXN0IHdlIGtub3cgZm9yIHN1cmUgd2Ugd2lsbCBjcmFzaCBpbiB0aGlzIG1ldGhvZFxuICAgICAgLy8gd2hlbiB3ZSBjYWxsIGRvY3VtZW50LmNyZWF0ZUV2ZW50KCkuIEhvd2V2ZXIgdGhpcyBjYW4gY2F1c2UgY29uZnVzaW5nXG4gICAgICAvLyBlcnJvcnM6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9va2luY3ViYXRvci9jcmVhdGUtcmVhY3QtYXBwL2lzc3Vlcy8zNDgyXG4gICAgICAvLyBTbyB3ZSBwcmVlbXB0aXZlbHkgdGhyb3cgd2l0aCBhIGJldHRlciBtZXNzYWdlIGluc3RlYWQuXG4gICAgICAhKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpID8gaW52YXJpYW50KGZhbHNlLCAnVGhlIGBkb2N1bWVudGAgZ2xvYmFsIHdhcyBkZWZpbmVkIHdoZW4gUmVhY3Qgd2FzIGluaXRpYWxpemVkLCBidXQgaXMgbm90IGRlZmluZWQgYW55bW9yZS4gVGhpcyBjYW4gaGFwcGVuIGluIGEgdGVzdCBlbnZpcm9ubWVudCBpZiBhIGNvbXBvbmVudCBzY2hlZHVsZXMgYW4gdXBkYXRlIGZyb20gYW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrLCBidXQgdGhlIHRlc3QgaGFzIGFscmVhZHkgZmluaXNoZWQgcnVubmluZy4gVG8gc29sdmUgdGhpcywgeW91IGNhbiBlaXRoZXIgdW5tb3VudCB0aGUgY29tcG9uZW50IGF0IHRoZSBlbmQgb2YgeW91ciB0ZXN0IChhbmQgZW5zdXJlIHRoYXQgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGdldCBjYW5jZWxlZCBpbiBgY29tcG9uZW50V2lsbFVubW91bnRgKSwgb3IgeW91IGNhbiBjaGFuZ2UgdGhlIHRlc3QgaXRzZWxmIHRvIGJlIGFzeW5jaHJvbm91cy4nKSA6IHZvaWQgMDtcbiAgICAgIHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcblxuICAgICAgLy8gS2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjayB0aHJldyBhbiBlcnJvci4gV2VcbiAgICAgIC8vIHNldCB0aGlzIHRvIHRydWUgYXQgdGhlIGJlZ2lubmluZywgdGhlbiBzZXQgaXQgdG8gZmFsc2UgcmlnaHQgYWZ0ZXJcbiAgICAgIC8vIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLiBJZiB0aGUgZnVuY3Rpb24gZXJyb3JzLCBgZGlkRXJyb3JgIHdpbGwgbmV2ZXIgYmVcbiAgICAgIC8vIHNldCB0byBmYWxzZS4gVGhpcyBzdHJhdGVneSB3b3JrcyBldmVuIGlmIHRoZSBicm93c2VyIGlzIGZsYWt5IGFuZFxuICAgICAgLy8gZmFpbHMgdG8gY2FsbCBvdXIgZ2xvYmFsIGVycm9yIGhhbmRsZXIsIGJlY2F1c2UgaXQgZG9lc24ndCByZWx5IG9uXG4gICAgICAvLyB0aGUgZXJyb3IgZXZlbnQgYXQgYWxsLlxuICAgICAgdmFyIGRpZEVycm9yID0gdHJ1ZTtcblxuICAgICAgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIHZhbHVlIG9mIHdpbmRvdy5ldmVudCBzbyB0aGF0IHdlIGNhbiByZXNldCBpdFxuICAgICAgLy8gZHVyaW5nIHRoZSBjYWxsYmFjayB0byBsZXQgdXNlciBjb2RlIGFjY2VzcyB3aW5kb3cuZXZlbnQgaW4gdGhlXG4gICAgICAvLyBicm93c2VycyB0aGF0IHN1cHBvcnQgaXQuXG4gICAgICB2YXIgd2luZG93RXZlbnQgPSB3aW5kb3cuZXZlbnQ7XG5cbiAgICAgIC8vIEtlZXBzIHRyYWNrIG9mIHRoZSBkZXNjcmlwdG9yIG9mIHdpbmRvdy5ldmVudCB0byByZXN0b3JlIGl0IGFmdGVyIGV2ZW50XG4gICAgICAvLyBkaXNwYXRjaGluZzogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzY4OFxuICAgICAgdmFyIHdpbmRvd0V2ZW50RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnZXZlbnQnKTtcblxuICAgICAgLy8gQ3JlYXRlIGFuIGV2ZW50IGhhbmRsZXIgZm9yIG91ciBmYWtlIGV2ZW50LiBXZSB3aWxsIHN5bmNocm9ub3VzbHlcbiAgICAgIC8vIGRpc3BhdGNoIG91ciBmYWtlIGV2ZW50IHVzaW5nIGBkaXNwYXRjaEV2ZW50YC4gSW5zaWRlIHRoZSBoYW5kbGVyLCB3ZVxuICAgICAgLy8gY2FsbCB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjay5cbiAgICAgIHZhciBmdW5jQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMyk7XG4gICAgICBmdW5jdGlvbiBjYWxsQ2FsbGJhY2soKSB7XG4gICAgICAgIC8vIFdlIGltbWVkaWF0ZWx5IHJlbW92ZSB0aGUgY2FsbGJhY2sgZnJvbSBldmVudCBsaXN0ZW5lcnMgc28gdGhhdFxuICAgICAgICAvLyBuZXN0ZWQgYGludm9rZUd1YXJkZWRDYWxsYmFja2AgY2FsbHMgZG8gbm90IGNsYXNoLiBPdGhlcndpc2UsIGFcbiAgICAgICAgLy8gbmVzdGVkIGNhbGwgd291bGQgdHJpZ2dlciB0aGUgZmFrZSBldmVudCBoYW5kbGVycyBvZiBhbnkgY2FsbCBoaWdoZXJcbiAgICAgICAgLy8gaW4gdGhlIHN0YWNrLlxuICAgICAgICBmYWtlTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2dFR5cGUsIGNhbGxDYWxsYmFjaywgZmFsc2UpO1xuXG4gICAgICAgIC8vIFdlIGNoZWNrIGZvciB3aW5kb3cuaGFzT3duUHJvcGVydHkoJ2V2ZW50JykgdG8gcHJldmVudCB0aGVcbiAgICAgICAgLy8gd2luZG93LmV2ZW50IGFzc2lnbm1lbnQgaW4gYm90aCBJRSA8PSAxMCBhcyB0aGV5IHRocm93IGFuIGVycm9yXG4gICAgICAgIC8vIFwiTWVtYmVyIG5vdCBmb3VuZFwiIGluIHN0cmljdCBtb2RlLCBhbmQgaW4gRmlyZWZveCB3aGljaCBkb2VzIG5vdFxuICAgICAgICAvLyBzdXBwb3J0IHdpbmRvdy5ldmVudC5cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuZXZlbnQgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnZXZlbnQnKSkge1xuICAgICAgICAgIHdpbmRvdy5ldmVudCA9IHdpbmRvd0V2ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBmdW5jQXJncyk7XG4gICAgICAgIGRpZEVycm9yID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBhIGdsb2JhbCBlcnJvciBldmVudCBoYW5kbGVyLiBXZSB1c2UgdGhpcyB0byBjYXB0dXJlIHRoZSB2YWx1ZVxuICAgICAgLy8gdGhhdCB3YXMgdGhyb3duLiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgZmlyZSBtb3JlXG4gICAgICAvLyB0aGFuIG9uY2U7IGZvciBleGFtcGxlLCBpZiBub24tUmVhY3QgY29kZSBhbHNvIGNhbGxzIGBkaXNwYXRjaEV2ZW50YFxuICAgICAgLy8gYW5kIGEgaGFuZGxlciBmb3IgdGhhdCBldmVudCB0aHJvd3MuIFdlIHNob3VsZCBiZSByZXNpbGllbnQgdG8gbW9zdCBvZlxuICAgICAgLy8gdGhvc2UgY2FzZXMuIEV2ZW4gaWYgb3VyIGVycm9yIGV2ZW50IGhhbmRsZXIgZmlyZXMgbW9yZSB0aGFuIG9uY2UsIHRoZVxuICAgICAgLy8gbGFzdCBlcnJvciBldmVudCBpcyBhbHdheXMgdXNlZC4gSWYgdGhlIGNhbGxiYWNrIGFjdHVhbGx5IGRvZXMgZXJyb3IsXG4gICAgICAvLyB3ZSBrbm93IHRoYXQgdGhlIGxhc3QgZXJyb3IgZXZlbnQgaXMgdGhlIGNvcnJlY3Qgb25lLCBiZWNhdXNlIGl0J3Mgbm90XG4gICAgICAvLyBwb3NzaWJsZSBmb3IgYW55dGhpbmcgZWxzZSB0byBoYXZlIGhhcHBlbmVkIGluIGJldHdlZW4gb3VyIGNhbGxiYWNrXG4gICAgICAvLyBlcnJvcmluZyBhbmQgdGhlIGNvZGUgdGhhdCBmb2xsb3dzIHRoZSBgZGlzcGF0Y2hFdmVudGAgY2FsbCBiZWxvdy4gSWZcbiAgICAgIC8vIHRoZSBjYWxsYmFjayBkb2Vzbid0IGVycm9yLCBidXQgdGhlIGVycm9yIGV2ZW50IHdhcyBmaXJlZCwgd2Uga25vdyB0b1xuICAgICAgLy8gaWdub3JlIGl0IGJlY2F1c2UgYGRpZEVycm9yYCB3aWxsIGJlIGZhbHNlLCBhcyBkZXNjcmliZWQgYWJvdmUuXG4gICAgICB2YXIgZXJyb3IgPSB2b2lkIDA7XG4gICAgICAvLyBVc2UgdGhpcyB0byB0cmFjayB3aGV0aGVyIHRoZSBlcnJvciBldmVudCBpcyBldmVyIGNhbGxlZC5cbiAgICAgIHZhciBkaWRTZXRFcnJvciA9IGZhbHNlO1xuICAgICAgdmFyIGlzQ3Jvc3NPcmlnaW5FcnJvciA9IGZhbHNlO1xuXG4gICAgICBmdW5jdGlvbiBoYW5kbGVXaW5kb3dFcnJvcihldmVudCkge1xuICAgICAgICBlcnJvciA9IGV2ZW50LmVycm9yO1xuICAgICAgICBkaWRTZXRFcnJvciA9IHRydWU7XG4gICAgICAgIGlmIChlcnJvciA9PT0gbnVsbCAmJiBldmVudC5jb2xubyA9PT0gMCAmJiBldmVudC5saW5lbm8gPT09IDApIHtcbiAgICAgICAgICBpc0Nyb3NzT3JpZ2luRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgLy8gU29tZSBvdGhlciBlcnJvciBoYW5kbGVyIGhhcyBwcmV2ZW50ZWQgZGVmYXVsdC5cbiAgICAgICAgICAvLyBCcm93c2VycyBzaWxlbmNlIHRoZSBlcnJvciByZXBvcnQgaWYgdGhpcyBoYXBwZW5zLlxuICAgICAgICAgIC8vIFdlJ2xsIHJlbWVtYmVyIHRoaXMgdG8gbGF0ZXIgZGVjaWRlIHdoZXRoZXIgdG8gbG9nIGl0IG9yIG5vdC5cbiAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBlcnJvci5fc3VwcHJlc3NMb2dnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGlubmVyKSB7XG4gICAgICAgICAgICAgIC8vIElnbm9yZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGEgZmFrZSBldmVudCB0eXBlLlxuICAgICAgdmFyIGV2dFR5cGUgPSAncmVhY3QtJyArIChuYW1lID8gbmFtZSA6ICdpbnZva2VndWFyZGVkY2FsbGJhY2snKTtcblxuICAgICAgLy8gQXR0YWNoIG91ciBldmVudCBoYW5kbGVyc1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgaGFuZGxlV2luZG93RXJyb3IpO1xuICAgICAgZmFrZU5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldnRUeXBlLCBjYWxsQ2FsbGJhY2ssIGZhbHNlKTtcblxuICAgICAgLy8gU3luY2hyb25vdXNseSBkaXNwYXRjaCBvdXIgZmFrZSBldmVudC4gSWYgdGhlIHVzZXItcHJvdmlkZWQgZnVuY3Rpb25cbiAgICAgIC8vIGVycm9ycywgaXQgd2lsbCB0cmlnZ2VyIG91ciBnbG9iYWwgZXJyb3IgaGFuZGxlci5cbiAgICAgIGV2dC5pbml0RXZlbnQoZXZ0VHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgIGZha2VOb2RlLmRpc3BhdGNoRXZlbnQoZXZ0KTtcblxuICAgICAgaWYgKHdpbmRvd0V2ZW50RGVzY3JpcHRvcikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnZXZlbnQnLCB3aW5kb3dFdmVudERlc2NyaXB0b3IpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlkRXJyb3IpIHtcbiAgICAgICAgaWYgKCFkaWRTZXRFcnJvcikge1xuICAgICAgICAgIC8vIFRoZSBjYWxsYmFjayBlcnJvcmVkLCBidXQgdGhlIGVycm9yIGV2ZW50IG5ldmVyIGZpcmVkLlxuICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKCdBbiBlcnJvciB3YXMgdGhyb3duIGluc2lkZSBvbmUgb2YgeW91ciBjb21wb25lbnRzLCBidXQgUmVhY3QgJyArIFwiZG9lc24ndCBrbm93IHdoYXQgaXQgd2FzLiBUaGlzIGlzIGxpa2VseSBkdWUgdG8gYnJvd3NlciBcIiArICdmbGFraW5lc3MuIFJlYWN0IGRvZXMgaXRzIGJlc3QgdG8gcHJlc2VydmUgdGhlIFwiUGF1c2Ugb24gJyArICdleGNlcHRpb25zXCIgYmVoYXZpb3Igb2YgdGhlIERldlRvb2xzLCB3aGljaCByZXF1aXJlcyBzb21lICcgKyBcIkRFVi1tb2RlIG9ubHkgdHJpY2tzLiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlc2UgZG9uJ3Qgd29yayBpbiBcIiArICd5b3VyIGJyb3dzZXIuIFRyeSB0cmlnZ2VyaW5nIHRoZSBlcnJvciBpbiBwcm9kdWN0aW9uIG1vZGUsICcgKyAnb3Igc3dpdGNoaW5nIHRvIGEgbW9kZXJuIGJyb3dzZXIuIElmIHlvdSBzdXNwZWN0IHRoYXQgdGhpcyBpcyAnICsgJ2FjdHVhbGx5IGFuIGlzc3VlIHdpdGggUmVhY3QsIHBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQ3Jvc3NPcmlnaW5FcnJvcikge1xuICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKFwiQSBjcm9zcy1vcmlnaW4gZXJyb3Igd2FzIHRocm93bi4gUmVhY3QgZG9lc24ndCBoYXZlIGFjY2VzcyB0byBcIiArICd0aGUgYWN0dWFsIGVycm9yIG9iamVjdCBpbiBkZXZlbG9wbWVudC4gJyArICdTZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC1jcm9zc29yaWdpbi1lcnJvciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgb3VyIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgaGFuZGxlV2luZG93RXJyb3IpO1xuICAgIH07XG5cbiAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsID0gaW52b2tlR3VhcmRlZENhbGxiYWNrRGV2O1xuICB9XG59XG5cbnZhciBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsJDEgPSBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsO1xuXG4vLyBVc2VkIGJ5IEZpYmVyIHRvIHNpbXVsYXRlIGEgdHJ5LWNhdGNoLlxudmFyIGhhc0Vycm9yID0gZmFsc2U7XG52YXIgY2F1Z2h0RXJyb3IgPSBudWxsO1xuXG4vLyBVc2VkIGJ5IGV2ZW50IHN5c3RlbSB0byBjYXB0dXJlL3JldGhyb3cgdGhlIGZpcnN0IGVycm9yLlxudmFyIGhhc1JldGhyb3dFcnJvciA9IGZhbHNlO1xudmFyIHJldGhyb3dFcnJvciA9IG51bGw7XG5cbnZhciByZXBvcnRlciA9IHtcbiAgb25FcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gIH1cbn07XG5cbi8qKlxuICogQ2FsbCBhIGZ1bmN0aW9uIHdoaWxlIGd1YXJkaW5nIGFnYWluc3QgZXJyb3JzIHRoYXQgaGFwcGVucyB3aXRoaW4gaXQuXG4gKiBSZXR1cm5zIGFuIGVycm9yIGlmIGl0IHRocm93cywgb3RoZXJ3aXNlIG51bGwuXG4gKlxuICogSW4gcHJvZHVjdGlvbiwgdGhpcyBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIHRyeS1jYXRjaC4gVGhlIHJlYXNvbiB3ZSBkb24ndFxuICogdXNlIGEgdHJ5LWNhdGNoIGRpcmVjdGx5IGlzIHNvIHRoYXQgd2UgY2FuIHN3YXAgb3V0IGEgZGlmZmVyZW50XG4gKiBpbXBsZW1lbnRhdGlvbiBpbiBERVYgbW9kZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiB0aGUgZ3VhcmQgdG8gdXNlIGZvciBsb2dnaW5nIG9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgVGhlIGNvbnRleHQgdG8gdXNlIHdoZW4gY2FsbGluZyB0aGUgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcmd1bWVudHMgZm9yIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFjayhuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGhhc0Vycm9yID0gZmFsc2U7XG4gIGNhdWdodEVycm9yID0gbnVsbDtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxLmFwcGx5KHJlcG9ydGVyLCBhcmd1bWVudHMpO1xufVxuXG4vKipcbiAqIFNhbWUgYXMgaW52b2tlR3VhcmRlZENhbGxiYWNrLCBidXQgaW5zdGVhZCBvZiByZXR1cm5pbmcgYW4gZXJyb3IsIGl0IHN0b3Jlc1xuICogaXQgaW4gYSBnbG9iYWwgc28gaXQgY2FuIGJlIHJldGhyb3duIGJ5IGByZXRocm93Q2F1Z2h0RXJyb3JgIGxhdGVyLlxuICogVE9ETzogU2VlIGlmIGNhdWdodEVycm9yIGFuZCByZXRocm93RXJyb3IgY2FuIGJlIHVuaWZpZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgdGhlIGd1YXJkIHRvIHVzZSBmb3IgbG9nZ2luZyBvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZVxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIHVzZSB3aGVuIGNhbGxpbmcgdGhlIGZ1bmN0aW9uXG4gKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJndW1lbnRzIGZvciBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tBbmRDYXRjaEZpcnN0RXJyb3IobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgaWYgKGhhc0Vycm9yKSB7XG4gICAgdmFyIGVycm9yID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuICAgIGlmICghaGFzUmV0aHJvd0Vycm9yKSB7XG4gICAgICBoYXNSZXRocm93RXJyb3IgPSB0cnVlO1xuICAgICAgcmV0aHJvd0Vycm9yID0gZXJyb3I7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRHVyaW5nIGV4ZWN1dGlvbiBvZiBndWFyZGVkIGZ1bmN0aW9ucyB3ZSB3aWxsIGNhcHR1cmUgdGhlIGZpcnN0IGVycm9yIHdoaWNoXG4gKiB3ZSB3aWxsIHJldGhyb3cgdG8gYmUgaGFuZGxlZCBieSB0aGUgdG9wIGxldmVsIGVycm9yIGhhbmRsZXIuXG4gKi9cbmZ1bmN0aW9uIHJldGhyb3dDYXVnaHRFcnJvcigpIHtcbiAgaWYgKGhhc1JldGhyb3dFcnJvcikge1xuICAgIHZhciBlcnJvciA9IHJldGhyb3dFcnJvcjtcbiAgICBoYXNSZXRocm93RXJyb3IgPSBmYWxzZTtcbiAgICByZXRocm93RXJyb3IgPSBudWxsO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0NhdWdodEVycm9yKCkge1xuICByZXR1cm4gaGFzRXJyb3I7XG59XG5cbmZ1bmN0aW9uIGNsZWFyQ2F1Z2h0RXJyb3IoKSB7XG4gIGlmIChoYXNFcnJvcikge1xuICAgIHZhciBlcnJvciA9IGNhdWdodEVycm9yO1xuICAgIGhhc0Vycm9yID0gZmFsc2U7XG4gICAgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICAgIHJldHVybiBlcnJvcjtcbiAgfSBlbHNlIHtcbiAgICBpbnZhcmlhbnQoZmFsc2UsICdjbGVhckNhdWdodEVycm9yIHdhcyBjYWxsZWQgYnV0IG5vIGVycm9yIHdhcyBjYXB0dXJlZC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxufVxuXG4vKipcbiAqIEluamVjdGFibGUgb3JkZXJpbmcgb2YgZXZlbnQgcGx1Z2lucy5cbiAqL1xudmFyIGV2ZW50UGx1Z2luT3JkZXIgPSBudWxsO1xuXG4vKipcbiAqIEluamVjdGFibGUgbWFwcGluZyBmcm9tIG5hbWVzIHRvIGV2ZW50IHBsdWdpbiBtb2R1bGVzLlxuICovXG52YXIgbmFtZXNUb1BsdWdpbnMgPSB7fTtcblxuLyoqXG4gKiBSZWNvbXB1dGVzIHRoZSBwbHVnaW4gbGlzdCB1c2luZyB0aGUgaW5qZWN0ZWQgcGx1Z2lucyBhbmQgcGx1Z2luIG9yZGVyaW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY29tcHV0ZVBsdWdpbk9yZGVyaW5nKCkge1xuICBpZiAoIWV2ZW50UGx1Z2luT3JkZXIpIHtcbiAgICAvLyBXYWl0IHVudGlsIGFuIGBldmVudFBsdWdpbk9yZGVyYCBpcyBpbmplY3RlZC5cbiAgICByZXR1cm47XG4gIH1cbiAgZm9yICh2YXIgcGx1Z2luTmFtZSBpbiBuYW1lc1RvUGx1Z2lucykge1xuICAgIHZhciBwbHVnaW5Nb2R1bGUgPSBuYW1lc1RvUGx1Z2luc1twbHVnaW5OYW1lXTtcbiAgICB2YXIgcGx1Z2luSW5kZXggPSBldmVudFBsdWdpbk9yZGVyLmluZGV4T2YocGx1Z2luTmFtZSk7XG4gICAgIShwbHVnaW5JbmRleCA+IC0xKSA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luUmVnaXN0cnk6IENhbm5vdCBpbmplY3QgZXZlbnQgcGx1Z2lucyB0aGF0IGRvIG5vdCBleGlzdCBpbiB0aGUgcGx1Z2luIG9yZGVyaW5nLCBgJXNgLicsIHBsdWdpbk5hbWUpIDogdm9pZCAwO1xuICAgIGlmIChwbHVnaW5zW3BsdWdpbkluZGV4XSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgICFwbHVnaW5Nb2R1bGUuZXh0cmFjdEV2ZW50cyA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luUmVnaXN0cnk6IEV2ZW50IHBsdWdpbnMgbXVzdCBpbXBsZW1lbnQgYW4gYGV4dHJhY3RFdmVudHNgIG1ldGhvZCwgYnV0IGAlc2AgZG9lcyBub3QuJywgcGx1Z2luTmFtZSkgOiB2b2lkIDA7XG4gICAgcGx1Z2luc1twbHVnaW5JbmRleF0gPSBwbHVnaW5Nb2R1bGU7XG4gICAgdmFyIHB1Ymxpc2hlZEV2ZW50cyA9IHBsdWdpbk1vZHVsZS5ldmVudFR5cGVzO1xuICAgIGZvciAodmFyIGV2ZW50TmFtZSBpbiBwdWJsaXNoZWRFdmVudHMpIHtcbiAgICAgICFwdWJsaXNoRXZlbnRGb3JQbHVnaW4ocHVibGlzaGVkRXZlbnRzW2V2ZW50TmFtZV0sIHBsdWdpbk1vZHVsZSwgZXZlbnROYW1lKSA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luUmVnaXN0cnk6IEZhaWxlZCB0byBwdWJsaXNoIGV2ZW50IGAlc2AgZm9yIHBsdWdpbiBgJXNgLicsIGV2ZW50TmFtZSwgcGx1Z2luTmFtZSkgOiB2b2lkIDA7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUHVibGlzaGVzIGFuIGV2ZW50IHNvIHRoYXQgaXQgY2FuIGJlIGRpc3BhdGNoZWQgYnkgdGhlIHN1cHBsaWVkIHBsdWdpbi5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgRGlzcGF0Y2ggY29uZmlndXJhdGlvbiBmb3IgdGhlIGV2ZW50LlxuICogQHBhcmFtIHtvYmplY3R9IFBsdWdpbk1vZHVsZSBQbHVnaW4gcHVibGlzaGluZyB0aGUgZXZlbnQuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBldmVudCB3YXMgc3VjY2Vzc2Z1bGx5IHB1Ymxpc2hlZC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHB1Ymxpc2hFdmVudEZvclBsdWdpbihkaXNwYXRjaENvbmZpZywgcGx1Z2luTW9kdWxlLCBldmVudE5hbWUpIHtcbiAgISFldmVudE5hbWVEaXNwYXRjaENvbmZpZ3MuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luSHViOiBNb3JlIHRoYW4gb25lIHBsdWdpbiBhdHRlbXB0ZWQgdG8gcHVibGlzaCB0aGUgc2FtZSBldmVudCBuYW1lLCBgJXNgLicsIGV2ZW50TmFtZSkgOiB2b2lkIDA7XG4gIGV2ZW50TmFtZURpc3BhdGNoQ29uZmlnc1tldmVudE5hbWVdID0gZGlzcGF0Y2hDb25maWc7XG5cbiAgdmFyIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzID0gZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM7XG4gIGlmIChwaGFzZWRSZWdpc3RyYXRpb25OYW1lcykge1xuICAgIGZvciAodmFyIHBoYXNlTmFtZSBpbiBwaGFzZWRSZWdpc3RyYXRpb25OYW1lcykge1xuICAgICAgaWYgKHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzLmhhc093blByb3BlcnR5KHBoYXNlTmFtZSkpIHtcbiAgICAgICAgdmFyIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWUgPSBwaGFzZWRSZWdpc3RyYXRpb25OYW1lc1twaGFzZU5hbWVdO1xuICAgICAgICBwdWJsaXNoUmVnaXN0cmF0aW9uTmFtZShwaGFzZWRSZWdpc3RyYXRpb25OYW1lLCBwbHVnaW5Nb2R1bGUsIGV2ZW50TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUpIHtcbiAgICBwdWJsaXNoUmVnaXN0cmF0aW9uTmFtZShkaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lLCBwbHVnaW5Nb2R1bGUsIGV2ZW50TmFtZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFB1Ymxpc2hlcyBhIHJlZ2lzdHJhdGlvbiBuYW1lIHRoYXQgaXMgdXNlZCB0byBpZGVudGlmeSBkaXNwYXRjaGVkIGV2ZW50cy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBSZWdpc3RyYXRpb24gbmFtZSB0byBhZGQuXG4gKiBAcGFyYW0ge29iamVjdH0gUGx1Z2luTW9kdWxlIFBsdWdpbiBwdWJsaXNoaW5nIHRoZSBldmVudC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHB1Ymxpc2hSZWdpc3RyYXRpb25OYW1lKHJlZ2lzdHJhdGlvbk5hbWUsIHBsdWdpbk1vZHVsZSwgZXZlbnROYW1lKSB7XG4gICEhcmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV0gPyBpbnZhcmlhbnQoZmFsc2UsICdFdmVudFBsdWdpbkh1YjogTW9yZSB0aGFuIG9uZSBwbHVnaW4gYXR0ZW1wdGVkIHRvIHB1Ymxpc2ggdGhlIHNhbWUgcmVnaXN0cmF0aW9uIG5hbWUsIGAlc2AuJywgcmVnaXN0cmF0aW9uTmFtZSkgOiB2b2lkIDA7XG4gIHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3JlZ2lzdHJhdGlvbk5hbWVdID0gcGx1Z2luTW9kdWxlO1xuICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdID0gcGx1Z2luTW9kdWxlLmV2ZW50VHlwZXNbZXZlbnROYW1lXS5kZXBlbmRlbmNpZXM7XG5cbiAge1xuICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IHJlZ2lzdHJhdGlvbk5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzW2xvd2VyQ2FzZWROYW1lXSA9IHJlZ2lzdHJhdGlvbk5hbWU7XG5cbiAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSA9PT0gJ29uRG91YmxlQ2xpY2snKSB7XG4gICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzLm9uZGJsY2xpY2sgPSByZWdpc3RyYXRpb25OYW1lO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBwbHVnaW5zIHNvIHRoYXQgdGhleSBjYW4gZXh0cmFjdCBhbmQgZGlzcGF0Y2ggZXZlbnRzLlxuICpcbiAqIEBzZWUge0V2ZW50UGx1Z2luSHVifVxuICovXG5cbi8qKlxuICogT3JkZXJlZCBsaXN0IG9mIGluamVjdGVkIHBsdWdpbnMuXG4gKi9cbnZhciBwbHVnaW5zID0gW107XG5cbi8qKlxuICogTWFwcGluZyBmcm9tIGV2ZW50IG5hbWUgdG8gZGlzcGF0Y2ggY29uZmlnXG4gKi9cbnZhciBldmVudE5hbWVEaXNwYXRjaENvbmZpZ3MgPSB7fTtcblxuLyoqXG4gKiBNYXBwaW5nIGZyb20gcmVnaXN0cmF0aW9uIG5hbWUgdG8gcGx1Z2luIG1vZHVsZVxuICovXG52YXIgcmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMgPSB7fTtcblxuLyoqXG4gKiBNYXBwaW5nIGZyb20gcmVnaXN0cmF0aW9uIG5hbWUgdG8gZXZlbnQgbmFtZVxuICovXG52YXIgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyA9IHt9O1xuXG4vKipcbiAqIE1hcHBpbmcgZnJvbSBsb3dlcmNhc2UgcmVnaXN0cmF0aW9uIG5hbWVzIHRvIHRoZSBwcm9wZXJseSBjYXNlZCB2ZXJzaW9uLFxuICogdXNlZCB0byB3YXJuIGluIHRoZSBjYXNlIG9mIG1pc3NpbmcgZXZlbnQgaGFuZGxlcnMuIEF2YWlsYWJsZVxuICogb25seSBpbiB0cnVlLlxuICogQHR5cGUge09iamVjdH1cbiAqL1xudmFyIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgPSB7fTtcbi8vIFRydXN0IHRoZSBkZXZlbG9wZXIgdG8gb25seSB1c2UgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyBpbiB0cnVlXG5cbi8qKlxuICogSW5qZWN0cyBhbiBvcmRlcmluZyBvZiBwbHVnaW5zIChieSBwbHVnaW4gbmFtZSkuIFRoaXMgYWxsb3dzIHRoZSBvcmRlcmluZ1xuICogdG8gYmUgZGVjb3VwbGVkIGZyb20gaW5qZWN0aW9uIG9mIHRoZSBhY3R1YWwgcGx1Z2lucyBzbyB0aGF0IG9yZGVyaW5nIGlzXG4gKiBhbHdheXMgZGV0ZXJtaW5pc3RpYyByZWdhcmRsZXNzIG9mIHBhY2thZ2luZywgb24tdGhlLWZseSBpbmplY3Rpb24sIGV0Yy5cbiAqXG4gKiBAcGFyYW0ge2FycmF5fSBJbmplY3RlZEV2ZW50UGx1Z2luT3JkZXJcbiAqIEBpbnRlcm5hbFxuICogQHNlZSB7RXZlbnRQbHVnaW5IdWIuaW5qZWN0aW9uLmluamVjdEV2ZW50UGx1Z2luT3JkZXJ9XG4gKi9cbmZ1bmN0aW9uIGluamVjdEV2ZW50UGx1Z2luT3JkZXIoaW5qZWN0ZWRFdmVudFBsdWdpbk9yZGVyKSB7XG4gICEhZXZlbnRQbHVnaW5PcmRlciA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luUmVnaXN0cnk6IENhbm5vdCBpbmplY3QgZXZlbnQgcGx1Z2luIG9yZGVyaW5nIG1vcmUgdGhhbiBvbmNlLiBZb3UgYXJlIGxpa2VseSB0cnlpbmcgdG8gbG9hZCBtb3JlIHRoYW4gb25lIGNvcHkgb2YgUmVhY3QuJykgOiB2b2lkIDA7XG4gIC8vIENsb25lIHRoZSBvcmRlcmluZyBzbyBpdCBjYW5ub3QgYmUgZHluYW1pY2FsbHkgbXV0YXRlZC5cbiAgZXZlbnRQbHVnaW5PcmRlciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGluamVjdGVkRXZlbnRQbHVnaW5PcmRlcik7XG4gIHJlY29tcHV0ZVBsdWdpbk9yZGVyaW5nKCk7XG59XG5cbi8qKlxuICogSW5qZWN0cyBwbHVnaW5zIHRvIGJlIHVzZWQgYnkgYEV2ZW50UGx1Z2luSHViYC4gVGhlIHBsdWdpbiBuYW1lcyBtdXN0IGJlXG4gKiBpbiB0aGUgb3JkZXJpbmcgaW5qZWN0ZWQgYnkgYGluamVjdEV2ZW50UGx1Z2luT3JkZXJgLlxuICpcbiAqIFBsdWdpbnMgY2FuIGJlIGluamVjdGVkIGFzIHBhcnQgb2YgcGFnZSBpbml0aWFsaXphdGlvbiBvciBvbi10aGUtZmx5LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBpbmplY3RlZE5hbWVzVG9QbHVnaW5zIE1hcCBmcm9tIG5hbWVzIHRvIHBsdWdpbiBtb2R1bGVzLlxuICogQGludGVybmFsXG4gKiBAc2VlIHtFdmVudFBsdWdpbkh1Yi5pbmplY3Rpb24uaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lfVxuICovXG5mdW5jdGlvbiBpbmplY3RFdmVudFBsdWdpbnNCeU5hbWUoaW5qZWN0ZWROYW1lc1RvUGx1Z2lucykge1xuICB2YXIgaXNPcmRlcmluZ0RpcnR5ID0gZmFsc2U7XG4gIGZvciAodmFyIHBsdWdpbk5hbWUgaW4gaW5qZWN0ZWROYW1lc1RvUGx1Z2lucykge1xuICAgIGlmICghaW5qZWN0ZWROYW1lc1RvUGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShwbHVnaW5OYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBwbHVnaW5Nb2R1bGUgPSBpbmplY3RlZE5hbWVzVG9QbHVnaW5zW3BsdWdpbk5hbWVdO1xuICAgIGlmICghbmFtZXNUb1BsdWdpbnMuaGFzT3duUHJvcGVydHkocGx1Z2luTmFtZSkgfHwgbmFtZXNUb1BsdWdpbnNbcGx1Z2luTmFtZV0gIT09IHBsdWdpbk1vZHVsZSkge1xuICAgICAgISFuYW1lc1RvUGx1Z2luc1twbHVnaW5OYW1lXSA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luUmVnaXN0cnk6IENhbm5vdCBpbmplY3QgdHdvIGRpZmZlcmVudCBldmVudCBwbHVnaW5zIHVzaW5nIHRoZSBzYW1lIG5hbWUsIGAlc2AuJywgcGx1Z2luTmFtZSkgOiB2b2lkIDA7XG4gICAgICBuYW1lc1RvUGx1Z2luc1twbHVnaW5OYW1lXSA9IHBsdWdpbk1vZHVsZTtcbiAgICAgIGlzT3JkZXJpbmdEaXJ0eSA9IHRydWU7XG4gICAgfVxuICB9XG4gIGlmIChpc09yZGVyaW5nRGlydHkpIHtcbiAgICByZWNvbXB1dGVQbHVnaW5PcmRlcmluZygpO1xuICB9XG59XG5cbi8qKlxuICogU2ltaWxhciB0byBpbnZhcmlhbnQgYnV0IG9ubHkgbG9ncyBhIHdhcm5pbmcgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byBsb2cgaXNzdWVzIGluIGRldmVsb3BtZW50IGVudmlyb25tZW50cyBpbiBjcml0aWNhbFxuICogcGF0aHMuIFJlbW92aW5nIHRoZSBsb2dnaW5nIGNvZGUgZm9yIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIHdpbGwga2VlcCB0aGVcbiAqIHNhbWUgbG9naWMgYW5kIGZvbGxvdyB0aGUgc2FtZSBjb2RlIHBhdGhzLlxuICovXG5cbnZhciB3YXJuaW5nV2l0aG91dFN0YWNrID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgd2FybmluZ1dpdGhvdXRTdGFjayA9IGZ1bmN0aW9uIChjb25kaXRpb24sIGZvcm1hdCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDIgPyBfbGVuIC0gMiA6IDApLCBfa2V5ID0gMjsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMl0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2B3YXJuaW5nV2l0aG91dFN0YWNrKGNvbmRpdGlvbiwgZm9ybWF0LCAuLi5hcmdzKWAgcmVxdWlyZXMgYSB3YXJuaW5nICcgKyAnbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgICBpZiAoYXJncy5sZW5ndGggPiA4KSB7XG4gICAgICAvLyBDaGVjayBiZWZvcmUgdGhlIGNvbmRpdGlvbiB0byBjYXRjaCB2aW9sYXRpb25zIGVhcmx5LlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YXJuaW5nV2l0aG91dFN0YWNrKCkgY3VycmVudGx5IHN1cHBvcnRzIGF0IG1vc3QgOCBhcmd1bWVudHMuJyk7XG4gICAgfVxuICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuICcnICsgaXRlbTtcbiAgICAgIH0pO1xuICAgICAgYXJnc1dpdGhGb3JtYXQudW5zaGlmdCgnV2FybmluZzogJyArIGZvcm1hdCk7XG5cbiAgICAgIC8vIFdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIHNwcmVhZCAob3IgLmFwcGx5KSBkaXJlY3RseSBiZWNhdXNlIGl0XG4gICAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlLmVycm9yLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyBmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG59XG5cbnZhciB3YXJuaW5nV2l0aG91dFN0YWNrJDEgPSB3YXJuaW5nV2l0aG91dFN0YWNrO1xuXG52YXIgZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZSA9IG51bGw7XG52YXIgZ2V0SW5zdGFuY2VGcm9tTm9kZSA9IG51bGw7XG52YXIgZ2V0Tm9kZUZyb21JbnN0YW5jZSA9IG51bGw7XG5cbmZ1bmN0aW9uIHNldENvbXBvbmVudFRyZWUoZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZUltcGwsIGdldEluc3RhbmNlRnJvbU5vZGVJbXBsLCBnZXROb2RlRnJvbUluc3RhbmNlSW1wbCkge1xuICBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZUltcGw7XG4gIGdldEluc3RhbmNlRnJvbU5vZGUgPSBnZXRJbnN0YW5jZUZyb21Ob2RlSW1wbDtcbiAgZ2V0Tm9kZUZyb21JbnN0YW5jZSA9IGdldE5vZGVGcm9tSW5zdGFuY2VJbXBsO1xuICB7XG4gICAgIShnZXROb2RlRnJvbUluc3RhbmNlICYmIGdldEluc3RhbmNlRnJvbU5vZGUpID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnRXZlbnRQbHVnaW5VdGlscy5zZXRDb21wb25lbnRUcmVlKC4uLik6IEluamVjdGVkICcgKyAnbW9kdWxlIGlzIG1pc3NpbmcgZ2V0Tm9kZUZyb21JbnN0YW5jZSBvciBnZXRJbnN0YW5jZUZyb21Ob2RlLicpIDogdm9pZCAwO1xuICB9XG59XG5cbnZhciB2YWxpZGF0ZUV2ZW50RGlzcGF0Y2hlcyA9IHZvaWQgMDtcbntcbiAgdmFsaWRhdGVFdmVudERpc3BhdGNoZXMgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICB2YXIgZGlzcGF0Y2hMaXN0ZW5lcnMgPSBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnM7XG4gICAgdmFyIGRpc3BhdGNoSW5zdGFuY2VzID0gZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzO1xuXG4gICAgdmFyIGxpc3RlbmVyc0lzQXJyID0gQXJyYXkuaXNBcnJheShkaXNwYXRjaExpc3RlbmVycyk7XG4gICAgdmFyIGxpc3RlbmVyc0xlbiA9IGxpc3RlbmVyc0lzQXJyID8gZGlzcGF0Y2hMaXN0ZW5lcnMubGVuZ3RoIDogZGlzcGF0Y2hMaXN0ZW5lcnMgPyAxIDogMDtcblxuICAgIHZhciBpbnN0YW5jZXNJc0FyciA9IEFycmF5LmlzQXJyYXkoZGlzcGF0Y2hJbnN0YW5jZXMpO1xuICAgIHZhciBpbnN0YW5jZXNMZW4gPSBpbnN0YW5jZXNJc0FyciA/IGRpc3BhdGNoSW5zdGFuY2VzLmxlbmd0aCA6IGRpc3BhdGNoSW5zdGFuY2VzID8gMSA6IDA7XG5cbiAgICAhKGluc3RhbmNlc0lzQXJyID09PSBsaXN0ZW5lcnNJc0FyciAmJiBpbnN0YW5jZXNMZW4gPT09IGxpc3RlbmVyc0xlbikgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdFdmVudFBsdWdpblV0aWxzOiBJbnZhbGlkIGBldmVudGAuJykgOiB2b2lkIDA7XG4gIH07XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggdGhlIGV2ZW50IHRvIHRoZSBsaXN0ZW5lci5cbiAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IFN5bnRoZXRpY0V2ZW50IHRvIGhhbmRsZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXIgQXBwbGljYXRpb24tbGV2ZWwgY2FsbGJhY2tcbiAqIEBwYXJhbSB7Kn0gaW5zdCBJbnRlcm5hbCBjb21wb25lbnQgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBsaXN0ZW5lciwgaW5zdCkge1xuICB2YXIgdHlwZSA9IGV2ZW50LnR5cGUgfHwgJ3Vua25vd24tZXZlbnQnO1xuICBldmVudC5jdXJyZW50VGFyZ2V0ID0gZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrQW5kQ2F0Y2hGaXJzdEVycm9yKHR5cGUsIGxpc3RlbmVyLCB1bmRlZmluZWQsIGV2ZW50KTtcbiAgZXZlbnQuY3VycmVudFRhcmdldCA9IG51bGw7XG59XG5cbi8qKlxuICogU3RhbmRhcmQvc2ltcGxlIGl0ZXJhdGlvbiB0aHJvdWdoIGFuIGV2ZW50J3MgY29sbGVjdGVkIGRpc3BhdGNoZXMuXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlcihldmVudCkge1xuICB2YXIgZGlzcGF0Y2hMaXN0ZW5lcnMgPSBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnM7XG4gIHZhciBkaXNwYXRjaEluc3RhbmNlcyA9IGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcztcbiAge1xuICAgIHZhbGlkYXRlRXZlbnREaXNwYXRjaGVzKGV2ZW50KTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShkaXNwYXRjaExpc3RlbmVycykpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vIExpc3RlbmVycyBhbmQgSW5zdGFuY2VzIGFyZSB0d28gcGFyYWxsZWwgYXJyYXlzIHRoYXQgYXJlIGFsd2F5cyBpbiBzeW5jLlxuICAgICAgZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBkaXNwYXRjaExpc3RlbmVyc1tpXSwgZGlzcGF0Y2hJbnN0YW5jZXNbaV0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChkaXNwYXRjaExpc3RlbmVycykge1xuICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgZGlzcGF0Y2hMaXN0ZW5lcnMsIGRpc3BhdGNoSW5zdGFuY2VzKTtcbiAgfVxuICBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMgPSBudWxsO1xuICBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMgPSBudWxsO1xufVxuXG4vKipcbiAqIEBzZWUgZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyU3RvcEF0VHJ1ZUltcGxcbiAqL1xuXG5cbi8qKlxuICogRXhlY3V0aW9uIG9mIGEgXCJkaXJlY3RcIiBkaXNwYXRjaCAtIHRoZXJlIG11c3QgYmUgYXQgbW9zdCBvbmUgZGlzcGF0Y2hcbiAqIGFjY3VtdWxhdGVkIG9uIHRoZSBldmVudCBvciBpdCBpcyBjb25zaWRlcmVkIGFuIGVycm9yLiBJdCBkb2Vzbid0IHJlYWxseSBtYWtlXG4gKiBzZW5zZSBmb3IgYW4gZXZlbnQgd2l0aCBtdWx0aXBsZSBkaXNwYXRjaGVzIChidWJibGVkKSB0byBrZWVwIHRyYWNrIG9mIHRoZVxuICogcmV0dXJuIHZhbHVlcyBhdCBlYWNoIGRpc3BhdGNoIGV4ZWN1dGlvbiwgYnV0IGl0IGRvZXMgdGVuZCB0byBtYWtlIHNlbnNlIHdoZW5cbiAqIGRlYWxpbmcgd2l0aCBcImRpcmVjdFwiIGRpc3BhdGNoZXMuXG4gKlxuICogQHJldHVybiB7Kn0gVGhlIHJldHVybiB2YWx1ZSBvZiBleGVjdXRpbmcgdGhlIHNpbmdsZSBkaXNwYXRjaC5cbiAqL1xuXG5cbi8qKlxuICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWZmIG51bWJlciBvZiBkaXNwYXRjaGVzIGFjY3VtdWxhdGVkIGlzIGdyZWF0ZXIgdGhhbiAwLlxuICovXG5cbi8qKlxuICogQWNjdW11bGF0ZXMgaXRlbXMgdGhhdCBtdXN0IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZCBpbnRvIHRoZSBmaXJzdCBvbmUuIFRoaXNcbiAqIGlzIHVzZWQgdG8gY29uc2VydmUgbWVtb3J5IGJ5IGF2b2lkaW5nIGFycmF5IGFsbG9jYXRpb25zLCBhbmQgdGh1cyBzYWNyaWZpY2VzXG4gKiBBUEkgY2xlYW5uZXNzLiBTaW5jZSBgY3VycmVudGAgY2FuIGJlIG51bGwgYmVmb3JlIGJlaW5nIHBhc3NlZCBpbiBhbmQgbm90XG4gKiBudWxsIGFmdGVyIHRoaXMgZnVuY3Rpb24sIG1ha2Ugc3VyZSB0byBhc3NpZ24gaXQgYmFjayB0byBgY3VycmVudGA6XG4gKlxuICogYGEgPSBhY2N1bXVsYXRlSW50byhhLCBiKTtgXG4gKlxuICogVGhpcyBBUEkgc2hvdWxkIGJlIHNwYXJpbmdseSB1c2VkLiBUcnkgYGFjY3VtdWxhdGVgIGZvciBzb21ldGhpbmcgY2xlYW5lci5cbiAqXG4gKiBAcmV0dXJuIHsqfGFycmF5PCo+fSBBbiBhY2N1bXVsYXRpb24gb2YgaXRlbXMuXG4gKi9cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUludG8oY3VycmVudCwgbmV4dCkge1xuICAhKG5leHQgIT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICdhY2N1bXVsYXRlSW50byguLi4pOiBBY2N1bXVsYXRlZCBpdGVtcyBtdXN0IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4nKSA6IHZvaWQgMDtcblxuICBpZiAoY3VycmVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cblxuICAvLyBCb3RoIGFyZSBub3QgZW1wdHkuIFdhcm5pbmc6IE5ldmVyIGNhbGwgeC5jb25jYXQoeSkgd2hlbiB5b3UgYXJlIG5vdFxuICAvLyBjZXJ0YWluIHRoYXQgeCBpcyBhbiBBcnJheSAoeCBjb3VsZCBiZSBhIHN0cmluZyB3aXRoIGNvbmNhdCBtZXRob2QpLlxuICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50KSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG5leHQpKSB7XG4gICAgICBjdXJyZW50LnB1c2guYXBwbHkoY3VycmVudCwgbmV4dCk7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgY3VycmVudC5wdXNoKG5leHQpO1xuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkobmV4dCkpIHtcbiAgICAvLyBBIGJpdCB0b28gZGFuZ2Vyb3VzIHRvIG11dGF0ZSBgbmV4dGAuXG4gICAgcmV0dXJuIFtjdXJyZW50XS5jb25jYXQobmV4dCk7XG4gIH1cblxuICByZXR1cm4gW2N1cnJlbnQsIG5leHRdO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7YXJyYXl9IGFyciBhbiBcImFjY3VtdWxhdGlvblwiIG9mIGl0ZW1zIHdoaWNoIGlzIGVpdGhlciBhbiBBcnJheSBvclxuICogYSBzaW5nbGUgaXRlbS4gVXNlZnVsIHdoZW4gcGFpcmVkIHdpdGggdGhlIGBhY2N1bXVsYXRlYCBtb2R1bGUuIFRoaXMgaXMgYVxuICogc2ltcGxlIHV0aWxpdHkgdGhhdCBhbGxvd3MgdXMgdG8gcmVhc29uIGFib3V0IGEgY29sbGVjdGlvbiBvZiBpdGVtcywgYnV0XG4gKiBoYW5kbGluZyB0aGUgY2FzZSB3aGVuIHRoZXJlIGlzIGV4YWN0bHkgb25lIGl0ZW0gKGFuZCB3ZSBkbyBub3QgbmVlZCB0b1xuICogYWxsb2NhdGUgYW4gYXJyYXkpLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2IgQ2FsbGJhY2sgaW52b2tlZCB3aXRoIGVhY2ggZWxlbWVudCBvciBhIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0gez99IFtzY29wZV0gU2NvcGUgdXNlZCBhcyBgdGhpc2AgaW4gYSBjYWxsYmFjay5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaEFjY3VtdWxhdGVkKGFyciwgY2IsIHNjb3BlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICBhcnIuZm9yRWFjaChjYiwgc2NvcGUpO1xuICB9IGVsc2UgaWYgKGFycikge1xuICAgIGNiLmNhbGwoc2NvcGUsIGFycik7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBxdWV1ZSBvZiBldmVudHMgdGhhdCBoYXZlIGFjY3VtdWxhdGVkIHRoZWlyIGRpc3BhdGNoZXMgYW5kIGFyZVxuICogd2FpdGluZyB0byBoYXZlIHRoZWlyIGRpc3BhdGNoZXMgZXhlY3V0ZWQuXG4gKi9cbnZhciBldmVudFF1ZXVlID0gbnVsbDtcblxuLyoqXG4gKiBEaXNwYXRjaGVzIGFuIGV2ZW50IGFuZCByZWxlYXNlcyBpdCBiYWNrIGludG8gdGhlIHBvb2wsIHVubGVzcyBwZXJzaXN0ZW50LlxuICpcbiAqIEBwYXJhbSB7P29iamVjdH0gZXZlbnQgU3ludGhldGljIGV2ZW50IHRvIGJlIGRpc3BhdGNoZWQuXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGlmIChldmVudCkge1xuICAgIGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlcihldmVudCk7XG5cbiAgICBpZiAoIWV2ZW50LmlzUGVyc2lzdGVudCgpKSB7XG4gICAgICBldmVudC5jb25zdHJ1Y3Rvci5yZWxlYXNlKGV2ZW50KTtcbiAgICB9XG4gIH1cbn07XG52YXIgZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlVG9wTGV2ZWwgPSBmdW5jdGlvbiAoZSkge1xuICByZXR1cm4gZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlKGUpO1xufTtcblxuZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZSh0YWcpIHtcbiAgcmV0dXJuIHRhZyA9PT0gJ2J1dHRvbicgfHwgdGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3NlbGVjdCcgfHwgdGFnID09PSAndGV4dGFyZWEnO1xufVxuXG5mdW5jdGlvbiBzaG91bGRQcmV2ZW50TW91c2VFdmVudChuYW1lLCB0eXBlLCBwcm9wcykge1xuICBzd2l0Y2ggKG5hbWUpIHtcbiAgICBjYXNlICdvbkNsaWNrJzpcbiAgICBjYXNlICdvbkNsaWNrQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Eb3VibGVDbGljayc6XG4gICAgY2FzZSAnb25Eb3VibGVDbGlja0NhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VEb3duJzpcbiAgICBjYXNlICdvbk1vdXNlRG93bkNhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VNb3ZlJzpcbiAgICBjYXNlICdvbk1vdXNlTW92ZUNhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VVcCc6XG4gICAgY2FzZSAnb25Nb3VzZVVwQ2FwdHVyZSc6XG4gICAgICByZXR1cm4gISEocHJvcHMuZGlzYWJsZWQgJiYgaXNJbnRlcmFjdGl2ZSh0eXBlKSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgYSB1bmlmaWVkIGludGVyZmFjZSBmb3IgZXZlbnQgcGx1Z2lucyB0byBiZSBpbnN0YWxsZWQgYW5kIGNvbmZpZ3VyZWQuXG4gKlxuICogRXZlbnQgcGx1Z2lucyBjYW4gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIGBleHRyYWN0RXZlbnRzYCB7ZnVuY3Rpb24oc3RyaW5nLCBET01FdmVudFRhcmdldCwgc3RyaW5nLCBvYmplY3QpOiAqfVxuICogICAgIFJlcXVpcmVkLiBXaGVuIGEgdG9wLWxldmVsIGV2ZW50IGlzIGZpcmVkLCB0aGlzIG1ldGhvZCBpcyBleHBlY3RlZCB0b1xuICogICAgIGV4dHJhY3Qgc3ludGhldGljIGV2ZW50cyB0aGF0IHdpbGwgaW4gdHVybiBiZSBxdWV1ZWQgYW5kIGRpc3BhdGNoZWQuXG4gKlxuICogICBgZXZlbnRUeXBlc2Age29iamVjdH1cbiAqICAgICBPcHRpb25hbCwgcGx1Z2lucyB0aGF0IGZpcmUgZXZlbnRzIG11c3QgcHVibGlzaCBhIG1hcHBpbmcgb2YgcmVnaXN0cmF0aW9uXG4gKiAgICAgbmFtZXMgdGhhdCBhcmUgdXNlZCB0byByZWdpc3RlciBsaXN0ZW5lcnMuIFZhbHVlcyBvZiB0aGlzIG1hcHBpbmcgbXVzdFxuICogICAgIGJlIG9iamVjdHMgdGhhdCBjb250YWluIGByZWdpc3RyYXRpb25OYW1lYCBvciBgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXNgLlxuICpcbiAqICAgYGV4ZWN1dGVEaXNwYXRjaGAge2Z1bmN0aW9uKG9iamVjdCwgZnVuY3Rpb24sIHN0cmluZyl9XG4gKiAgICAgT3B0aW9uYWwsIGFsbG93cyBwbHVnaW5zIHRvIG92ZXJyaWRlIGhvdyBhbiBldmVudCBnZXRzIGRpc3BhdGNoZWQuIEJ5XG4gKiAgICAgZGVmYXVsdCwgdGhlIGxpc3RlbmVyIGlzIHNpbXBseSBpbnZva2VkLlxuICpcbiAqIEVhY2ggcGx1Z2luIHRoYXQgaXMgaW5qZWN0ZWQgaW50byBgRXZlbnRzUGx1Z2luSHViYCBpcyBpbW1lZGlhdGVseSBvcGVyYWJsZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cblxuLyoqXG4gKiBNZXRob2RzIGZvciBpbmplY3RpbmcgZGVwZW5kZW5jaWVzLlxuICovXG52YXIgaW5qZWN0aW9uID0ge1xuICAvKipcbiAgICogQHBhcmFtIHthcnJheX0gSW5qZWN0ZWRFdmVudFBsdWdpbk9yZGVyXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGluamVjdEV2ZW50UGx1Z2luT3JkZXI6IGluamVjdEV2ZW50UGx1Z2luT3JkZXIsXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpbmplY3RlZE5hbWVzVG9QbHVnaW5zIE1hcCBmcm9tIG5hbWVzIHRvIHBsdWdpbiBtb2R1bGVzLlxuICAgKi9cbiAgaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lOiBpbmplY3RFdmVudFBsdWdpbnNCeU5hbWVcbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGluc3QgVGhlIGluc3RhbmNlLCB3aGljaCBpcyB0aGUgc291cmNlIG9mIGV2ZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb25OYW1lIE5hbWUgb2YgbGlzdGVuZXIgKGUuZy4gYG9uQ2xpY2tgKS5cbiAqIEByZXR1cm4gez9mdW5jdGlvbn0gVGhlIHN0b3JlZCBjYWxsYmFjay5cbiAqL1xuZnVuY3Rpb24gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkge1xuICB2YXIgbGlzdGVuZXIgPSB2b2lkIDA7XG5cbiAgLy8gVE9ETzogc2hvdWxkUHJldmVudE1vdXNlRXZlbnQgaXMgRE9NLXNwZWNpZmljIGFuZCBkZWZpbml0ZWx5IHNob3VsZCBub3RcbiAgLy8gbGl2ZSBoZXJlOyBuZWVkcyB0byBiZSBtb3ZlZCB0byBhIGJldHRlciBwbGFjZSBzb29uXG4gIHZhciBzdGF0ZU5vZGUgPSBpbnN0LnN0YXRlTm9kZTtcbiAgaWYgKCFzdGF0ZU5vZGUpIHtcbiAgICAvLyBXb3JrIGluIHByb2dyZXNzIChleDogb25sb2FkIGV2ZW50cyBpbiBpbmNyZW1lbnRhbCBtb2RlKS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgcHJvcHMgPSBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlKHN0YXRlTm9kZSk7XG4gIGlmICghcHJvcHMpIHtcbiAgICAvLyBXb3JrIGluIHByb2dyZXNzLlxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGxpc3RlbmVyID0gcHJvcHNbcmVnaXN0cmF0aW9uTmFtZV07XG4gIGlmIChzaG91bGRQcmV2ZW50TW91c2VFdmVudChyZWdpc3RyYXRpb25OYW1lLCBpbnN0LnR5cGUsIHByb3BzKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gICEoIWxpc3RlbmVyIHx8IHR5cGVvZiBsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCBgJXNgIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24sIGluc3RlYWQgZ290IGEgdmFsdWUgb2YgYCVzYCB0eXBlLicsIHJlZ2lzdHJhdGlvbk5hbWUsIHR5cGVvZiBsaXN0ZW5lcikgOiB2b2lkIDA7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cblxuLyoqXG4gKiBBbGxvd3MgcmVnaXN0ZXJlZCBwbHVnaW5zIGFuIG9wcG9ydHVuaXR5IHRvIGV4dHJhY3QgZXZlbnRzIGZyb20gdG9wLWxldmVsXG4gKiBuYXRpdmUgYnJvd3NlciBldmVudHMuXG4gKlxuICogQHJldHVybiB7Kn0gQW4gYWNjdW11bGF0aW9uIG9mIHN5bnRoZXRpYyBldmVudHMuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICB2YXIgZXZlbnRzID0gbnVsbDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gTm90IGV2ZXJ5IHBsdWdpbiBpbiB0aGUgb3JkZXJpbmcgbWF5IGJlIGxvYWRlZCBhdCBydW50aW1lLlxuICAgIHZhciBwb3NzaWJsZVBsdWdpbiA9IHBsdWdpbnNbaV07XG4gICAgaWYgKHBvc3NpYmxlUGx1Z2luKSB7XG4gICAgICB2YXIgZXh0cmFjdGVkRXZlbnRzID0gcG9zc2libGVQbHVnaW4uZXh0cmFjdEV2ZW50cyh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICBpZiAoZXh0cmFjdGVkRXZlbnRzKSB7XG4gICAgICAgIGV2ZW50cyA9IGFjY3VtdWxhdGVJbnRvKGV2ZW50cywgZXh0cmFjdGVkRXZlbnRzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV2ZW50cztcbn1cblxuZnVuY3Rpb24gcnVuRXZlbnRzSW5CYXRjaChldmVudHMpIHtcbiAgaWYgKGV2ZW50cyAhPT0gbnVsbCkge1xuICAgIGV2ZW50UXVldWUgPSBhY2N1bXVsYXRlSW50byhldmVudFF1ZXVlLCBldmVudHMpO1xuICB9XG5cbiAgLy8gU2V0IGBldmVudFF1ZXVlYCB0byBudWxsIGJlZm9yZSBwcm9jZXNzaW5nIGl0IHNvIHRoYXQgd2UgY2FuIHRlbGwgaWYgbW9yZVxuICAvLyBldmVudHMgZ2V0IGVucXVldWVkIHdoaWxlIHByb2Nlc3NpbmcuXG4gIHZhciBwcm9jZXNzaW5nRXZlbnRRdWV1ZSA9IGV2ZW50UXVldWU7XG4gIGV2ZW50UXVldWUgPSBudWxsO1xuXG4gIGlmICghcHJvY2Vzc2luZ0V2ZW50UXVldWUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3JFYWNoQWNjdW11bGF0ZWQocHJvY2Vzc2luZ0V2ZW50UXVldWUsIGV4ZWN1dGVEaXNwYXRjaGVzQW5kUmVsZWFzZVRvcExldmVsKTtcbiAgISFldmVudFF1ZXVlID8gaW52YXJpYW50KGZhbHNlLCAncHJvY2Vzc0V2ZW50UXVldWUoKTogQWRkaXRpb25hbCBldmVudHMgd2VyZSBlbnF1ZXVlZCB3aGlsZSBwcm9jZXNzaW5nIGFuIGV2ZW50IHF1ZXVlLiBTdXBwb3J0IGZvciB0aGlzIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQuJykgOiB2b2lkIDA7XG4gIC8vIFRoaXMgd291bGQgYmUgYSBnb29kIHRpbWUgdG8gcmV0aHJvdyBpZiBhbnkgb2YgdGhlIGV2ZW50IGhhbmRsZXJzIHRocmV3LlxuICByZXRocm93Q2F1Z2h0RXJyb3IoKTtcbn1cblxuZnVuY3Rpb24gcnVuRXh0cmFjdGVkRXZlbnRzSW5CYXRjaCh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICB2YXIgZXZlbnRzID0gZXh0cmFjdEV2ZW50cyh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIHJ1bkV2ZW50c0luQmF0Y2goZXZlbnRzKTtcbn1cblxudmFyIEZ1bmN0aW9uQ29tcG9uZW50ID0gMDtcbnZhciBDbGFzc0NvbXBvbmVudCA9IDE7XG52YXIgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudCA9IDI7IC8vIEJlZm9yZSB3ZSBrbm93IHdoZXRoZXIgaXQgaXMgZnVuY3Rpb24gb3IgY2xhc3NcbnZhciBIb3N0Um9vdCA9IDM7IC8vIFJvb3Qgb2YgYSBob3N0IHRyZWUuIENvdWxkIGJlIG5lc3RlZCBpbnNpZGUgYW5vdGhlciBub2RlLlxudmFyIEhvc3RQb3J0YWwgPSA0OyAvLyBBIHN1YnRyZWUuIENvdWxkIGJlIGFuIGVudHJ5IHBvaW50IHRvIGEgZGlmZmVyZW50IHJlbmRlcmVyLlxudmFyIEhvc3RDb21wb25lbnQgPSA1O1xudmFyIEhvc3RUZXh0ID0gNjtcbnZhciBGcmFnbWVudCA9IDc7XG52YXIgTW9kZSA9IDg7XG52YXIgQ29udGV4dENvbnN1bWVyID0gOTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSAxMDtcbnZhciBGb3J3YXJkUmVmID0gMTE7XG52YXIgUHJvZmlsZXIgPSAxMjtcbnZhciBTdXNwZW5zZUNvbXBvbmVudCA9IDEzO1xudmFyIE1lbW9Db21wb25lbnQgPSAxNDtcbnZhciBTaW1wbGVNZW1vQ29tcG9uZW50ID0gMTU7XG52YXIgTGF6eUNvbXBvbmVudCA9IDE2O1xudmFyIEluY29tcGxldGVDbGFzc0NvbXBvbmVudCA9IDE3O1xudmFyIERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudCA9IDE4O1xuXG52YXIgcmFuZG9tS2V5ID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7XG52YXIgaW50ZXJuYWxJbnN0YW5jZUtleSA9ICdfX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsRXZlbnRIYW5kbGVyc0tleSA9ICdfX3JlYWN0RXZlbnRIYW5kbGVycyQnICsgcmFuZG9tS2V5O1xuXG5mdW5jdGlvbiBwcmVjYWNoZUZpYmVyTm9kZShob3N0SW5zdCwgbm9kZSkge1xuICBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldID0gaG9zdEluc3Q7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBjbG9zZXN0IFJlYWN0RE9NQ29tcG9uZW50IG9yXG4gKiBSZWFjdERPTVRleHRDb21wb25lbnQgaW5zdGFuY2UgYW5jZXN0b3IuXG4gKi9cbmZ1bmN0aW9uIGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5vZGUpIHtcbiAgaWYgKG5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV0pIHtcbiAgICByZXR1cm4gbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcbiAgfVxuXG4gIHdoaWxlICghbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSkge1xuICAgIGlmIChub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRvcCBvZiB0aGUgdHJlZS4gVGhpcyBub2RlIG11c3Qgbm90IGJlIHBhcnQgb2YgYSBSZWFjdCB0cmVlIChvciBpc1xuICAgICAgLy8gdW5tb3VudGVkLCBwb3RlbnRpYWxseSkuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICB2YXIgaW5zdCA9IG5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG4gIGlmIChpbnN0LnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAvLyBJbiBGaWJlciwgdGhpcyB3aWxsIGFsd2F5cyBiZSB0aGUgZGVlcGVzdCByb290LlxuICAgIHJldHVybiBpbnN0O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnRcbiAqIGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBub2RlIHdhcyBub3QgcmVuZGVyZWQgYnkgdGhpcyBSZWFjdC5cbiAqL1xuZnVuY3Rpb24gZ2V0SW5zdGFuY2VGcm9tTm9kZSQxKG5vZGUpIHtcbiAgdmFyIGluc3QgPSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuICBpZiAoaW5zdCkge1xuICAgIGlmIChpbnN0LnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgIHJldHVybiBpbnN0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnQsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZ1xuICogRE9NIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIGdldE5vZGVGcm9tSW5zdGFuY2UkMShpbnN0KSB7XG4gIGlmIChpbnN0LnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAvLyBJbiBGaWJlciB0aGlzLCBpcyBqdXN0IHRoZSBzdGF0ZSBub2RlIHJpZ2h0IG5vdy4gV2UgYXNzdW1lIGl0IHdpbGwgYmVcbiAgICAvLyBhIGhvc3QgY29tcG9uZW50IG9yIGhvc3QgdGV4dC5cbiAgICByZXR1cm4gaW5zdC5zdGF0ZU5vZGU7XG4gIH1cblxuICAvLyBXaXRob3V0IHRoaXMgZmlyc3QgaW52YXJpYW50LCBwYXNzaW5nIGEgbm9uLURPTS1jb21wb25lbnQgdHJpZ2dlcnMgdGhlIG5leHRcbiAgLy8gaW52YXJpYW50IGZvciBhIG1pc3NpbmcgcGFyZW50LCB3aGljaCBpcyBzdXBlciBjb25mdXNpbmcuXG4gIGludmFyaWFudChmYWxzZSwgJ2dldE5vZGVGcm9tSW5zdGFuY2U6IEludmFsaWQgYXJndW1lbnQuJyk7XG59XG5cbmZ1bmN0aW9uIGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUkMShub2RlKSB7XG4gIHJldHVybiBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyc0tleV0gfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRmliZXJQcm9wcyhub2RlLCBwcm9wcykge1xuICBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyc0tleV0gPSBwcm9wcztcbn1cblxuZnVuY3Rpb24gZ2V0UGFyZW50KGluc3QpIHtcbiAgZG8ge1xuICAgIGluc3QgPSBpbnN0LnJldHVybjtcbiAgICAvLyBUT0RPOiBJZiB0aGlzIGlzIGEgSG9zdFJvb3Qgd2UgbWlnaHQgd2FudCB0byBiYWlsIG91dC5cbiAgICAvLyBUaGF0IGlzIGRlcGVuZGluZyBvbiBpZiB3ZSB3YW50IG5lc3RlZCBzdWJ0cmVlcyAobGF5ZXJzKSB0byBidWJibGVcbiAgICAvLyBldmVudHMgdG8gdGhlaXIgcGFyZW50LiBXZSBjb3VsZCBhbHNvIGdvIHRocm91Z2ggcGFyZW50Tm9kZSBvbiB0aGVcbiAgICAvLyBob3N0IG5vZGUgYnV0IHRoYXQgd291bGRuJ3Qgd29yayBmb3IgUmVhY3QgTmF0aXZlIGFuZCBkb2Vzbid0IGxldCB1c1xuICAgIC8vIGRvIHRoZSBwb3J0YWwgZmVhdHVyZS5cbiAgfSB3aGlsZSAoaW5zdCAmJiBpbnN0LnRhZyAhPT0gSG9zdENvbXBvbmVudCk7XG4gIGlmIChpbnN0KSB7XG4gICAgcmV0dXJuIGluc3Q7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBsb3dlc3QgY29tbW9uIGFuY2VzdG9yIG9mIEEgYW5kIEIsIG9yIG51bGwgaWYgdGhleSBhcmUgaW5cbiAqIGRpZmZlcmVudCB0cmVlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoaW5zdEEsIGluc3RCKSB7XG4gIHZhciBkZXB0aEEgPSAwO1xuICBmb3IgKHZhciB0ZW1wQSA9IGluc3RBOyB0ZW1wQTsgdGVtcEEgPSBnZXRQYXJlbnQodGVtcEEpKSB7XG4gICAgZGVwdGhBKys7XG4gIH1cbiAgdmFyIGRlcHRoQiA9IDA7XG4gIGZvciAodmFyIHRlbXBCID0gaW5zdEI7IHRlbXBCOyB0ZW1wQiA9IGdldFBhcmVudCh0ZW1wQikpIHtcbiAgICBkZXB0aEIrKztcbiAgfVxuXG4gIC8vIElmIEEgaXMgZGVlcGVyLCBjcmF3bCB1cC5cbiAgd2hpbGUgKGRlcHRoQSAtIGRlcHRoQiA+IDApIHtcbiAgICBpbnN0QSA9IGdldFBhcmVudChpbnN0QSk7XG4gICAgZGVwdGhBLS07XG4gIH1cblxuICAvLyBJZiBCIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG4gIHdoaWxlIChkZXB0aEIgLSBkZXB0aEEgPiAwKSB7XG4gICAgaW5zdEIgPSBnZXRQYXJlbnQoaW5zdEIpO1xuICAgIGRlcHRoQi0tO1xuICB9XG5cbiAgLy8gV2FsayBpbiBsb2Nrc3RlcCB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guXG4gIHZhciBkZXB0aCA9IGRlcHRoQTtcbiAgd2hpbGUgKGRlcHRoLS0pIHtcbiAgICBpZiAoaW5zdEEgPT09IGluc3RCIHx8IGluc3RBID09PSBpbnN0Qi5hbHRlcm5hdGUpIHtcbiAgICAgIHJldHVybiBpbnN0QTtcbiAgICB9XG4gICAgaW5zdEEgPSBnZXRQYXJlbnQoaW5zdEEpO1xuICAgIGluc3RCID0gZ2V0UGFyZW50KGluc3RCKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gaWYgQSBpcyBhbiBhbmNlc3RvciBvZiBCLlxuICovXG5cblxuLyoqXG4gKiBSZXR1cm4gdGhlIHBhcmVudCBpbnN0YW5jZSBvZiB0aGUgcGFzc2VkLWluIGluc3RhbmNlLlxuICovXG5cblxuLyoqXG4gKiBTaW11bGF0ZXMgdGhlIHRyYXZlcnNhbCBvZiBhIHR3by1waGFzZSwgY2FwdHVyZS9idWJibGUgZXZlbnQgZGlzcGF0Y2guXG4gKi9cbmZ1bmN0aW9uIHRyYXZlcnNlVHdvUGhhc2UoaW5zdCwgZm4sIGFyZykge1xuICB2YXIgcGF0aCA9IFtdO1xuICB3aGlsZSAoaW5zdCkge1xuICAgIHBhdGgucHVzaChpbnN0KTtcbiAgICBpbnN0ID0gZ2V0UGFyZW50KGluc3QpO1xuICB9XG4gIHZhciBpID0gdm9pZCAwO1xuICBmb3IgKGkgPSBwYXRoLmxlbmd0aDsgaS0tID4gMDspIHtcbiAgICBmbihwYXRoW2ldLCAnY2FwdHVyZWQnLCBhcmcpO1xuICB9XG4gIGZvciAoaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgZm4ocGF0aFtpXSwgJ2J1YmJsZWQnLCBhcmcpO1xuICB9XG59XG5cbi8qKlxuICogVHJhdmVyc2VzIHRoZSBJRCBoaWVyYXJjaHkgYW5kIGludm9rZXMgdGhlIHN1cHBsaWVkIGBjYmAgb24gYW55IElEcyB0aGF0XG4gKiBzaG91bGQgd291bGQgcmVjZWl2ZSBhIGBtb3VzZUVudGVyYCBvciBgbW91c2VMZWF2ZWAgZXZlbnQuXG4gKlxuICogRG9lcyBub3QgaW52b2tlIHRoZSBjYWxsYmFjayBvbiB0aGUgbmVhcmVzdCBjb21tb24gYW5jZXN0b3IgYmVjYXVzZSBub3RoaW5nXG4gKiBcImVudGVyZWRcIiBvciBcImxlZnRcIiB0aGF0IGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIHRyYXZlcnNlRW50ZXJMZWF2ZShmcm9tLCB0bywgZm4sIGFyZ0Zyb20sIGFyZ1RvKSB7XG4gIHZhciBjb21tb24gPSBmcm9tICYmIHRvID8gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoZnJvbSwgdG8pIDogbnVsbDtcbiAgdmFyIHBhdGhGcm9tID0gW107XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKCFmcm9tKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKGZyb20gPT09IGNvbW1vbikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBhbHRlcm5hdGUgPSBmcm9tLmFsdGVybmF0ZTtcbiAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZSA9PT0gY29tbW9uKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcGF0aEZyb20ucHVzaChmcm9tKTtcbiAgICBmcm9tID0gZ2V0UGFyZW50KGZyb20pO1xuICB9XG4gIHZhciBwYXRoVG8gPSBbXTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoIXRvKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKHRvID09PSBjb21tb24pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgX2FsdGVybmF0ZSA9IHRvLmFsdGVybmF0ZTtcbiAgICBpZiAoX2FsdGVybmF0ZSAhPT0gbnVsbCAmJiBfYWx0ZXJuYXRlID09PSBjb21tb24pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBwYXRoVG8ucHVzaCh0byk7XG4gICAgdG8gPSBnZXRQYXJlbnQodG8pO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aEZyb20ubGVuZ3RoOyBpKyspIHtcbiAgICBmbihwYXRoRnJvbVtpXSwgJ2J1YmJsZWQnLCBhcmdGcm9tKTtcbiAgfVxuICBmb3IgKHZhciBfaSA9IHBhdGhUby5sZW5ndGg7IF9pLS0gPiAwOykge1xuICAgIGZuKHBhdGhUb1tfaV0sICdjYXB0dXJlZCcsIGFyZ1RvKTtcbiAgfVxufVxuXG4vKipcbiAqIFNvbWUgZXZlbnQgdHlwZXMgaGF2ZSBhIG5vdGlvbiBvZiBkaWZmZXJlbnQgcmVnaXN0cmF0aW9uIG5hbWVzIGZvciBkaWZmZXJlbnRcbiAqIFwicGhhc2VzXCIgb2YgcHJvcGFnYXRpb24uIFRoaXMgZmluZHMgbGlzdGVuZXJzIGJ5IGEgZ2l2ZW4gcGhhc2UuXG4gKi9cbmZ1bmN0aW9uIGxpc3RlbmVyQXRQaGFzZShpbnN0LCBldmVudCwgcHJvcGFnYXRpb25QaGFzZSkge1xuICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IGV2ZW50LmRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzW3Byb3BhZ2F0aW9uUGhhc2VdO1xuICByZXR1cm4gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSk7XG59XG5cbi8qKlxuICogQSBzbWFsbCBzZXQgb2YgcHJvcGFnYXRpb24gcGF0dGVybnMsIGVhY2ggb2Ygd2hpY2ggd2lsbCBhY2NlcHQgYSBzbWFsbCBhbW91bnRcbiAqIG9mIGluZm9ybWF0aW9uLCBhbmQgZ2VuZXJhdGUgYSBzZXQgb2YgXCJkaXNwYXRjaCByZWFkeSBldmVudCBvYmplY3RzXCIgLSB3aGljaFxuICogYXJlIHNldHMgb2YgZXZlbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYW5ub3RhdGVkIHdpdGggYSBzZXQgb2YgZGlzcGF0Y2hlZFxuICogbGlzdGVuZXIgZnVuY3Rpb25zL2lkcy4gVGhlIEFQSSBpcyBkZXNpZ25lZCB0aGlzIHdheSB0byBkaXNjb3VyYWdlIHRoZXNlXG4gKiBwcm9wYWdhdGlvbiBzdHJhdGVnaWVzIGZyb20gYWN0dWFsbHkgZXhlY3V0aW5nIHRoZSBkaXNwYXRjaGVzLCBzaW5jZSB3ZVxuICogYWx3YXlzIHdhbnQgdG8gY29sbGVjdCB0aGUgZW50aXJlIHNldCBvZiBkaXNwYXRjaGVzIGJlZm9yZSBleGVjdXRpbmcgZXZlbiBhXG4gKiBzaW5nbGUgb25lLlxuICovXG5cbi8qKlxuICogVGFncyBhIGBTeW50aGV0aWNFdmVudGAgd2l0aCBkaXNwYXRjaGVkIGxpc3RlbmVycy4gQ3JlYXRpbmcgdGhpcyBmdW5jdGlvblxuICogaGVyZSwgYWxsb3dzIHVzIHRvIG5vdCBoYXZlIHRvIGJpbmQgb3IgY3JlYXRlIGZ1bmN0aW9ucyBmb3IgZWFjaCBldmVudC5cbiAqIE11dGF0aW5nIHRoZSBldmVudCdzIG1lbWJlcnMgYWxsb3dzIHVzIHRvIG5vdCBoYXZlIHRvIGNyZWF0ZSBhIHdyYXBwaW5nXG4gKiBcImRpc3BhdGNoXCIgb2JqZWN0IHRoYXQgcGFpcnMgdGhlIGV2ZW50IHdpdGggdGhlIGxpc3RlbmVyLlxuICovXG5mdW5jdGlvbiBhY2N1bXVsYXRlRGlyZWN0aW9uYWxEaXNwYXRjaGVzKGluc3QsIHBoYXNlLCBldmVudCkge1xuICB7XG4gICAgIWluc3QgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdEaXNwYXRjaGluZyBpbnN0IG11c3Qgbm90IGJlIG51bGwnKSA6IHZvaWQgMDtcbiAgfVxuICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lckF0UGhhc2UoaW5zdCwgZXZlbnQsIHBoYXNlKTtcbiAgaWYgKGxpc3RlbmVyKSB7XG4gICAgZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzID0gYWNjdW11bGF0ZUludG8oZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzLCBsaXN0ZW5lcik7XG4gICAgZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzID0gYWNjdW11bGF0ZUludG8oZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzLCBpbnN0KTtcbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3QgZGlzcGF0Y2hlcyAobXVzdCBiZSBlbnRpcmVseSBjb2xsZWN0ZWQgYmVmb3JlIGRpc3BhdGNoaW5nIC0gc2VlIHVuaXRcbiAqIHRlc3RzKS4gTGF6aWx5IGFsbG9jYXRlIHRoZSBhcnJheSB0byBjb25zZXJ2ZSBtZW1vcnkuICBXZSBtdXN0IGxvb3AgdGhyb3VnaFxuICogZWFjaCBldmVudCBhbmQgcGVyZm9ybSB0aGUgdHJhdmVyc2FsIGZvciBlYWNoIG9uZS4gV2UgY2Fubm90IHBlcmZvcm0gYVxuICogc2luZ2xlIHRyYXZlcnNhbCBmb3IgdGhlIGVudGlyZSBjb2xsZWN0aW9uIG9mIGV2ZW50cyBiZWNhdXNlIGVhY2ggZXZlbnQgbWF5XG4gKiBoYXZlIGEgZGlmZmVyZW50IHRhcmdldC5cbiAqL1xuZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NpbmdsZShldmVudCkge1xuICBpZiAoZXZlbnQgJiYgZXZlbnQuZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMpIHtcbiAgICB0cmF2ZXJzZVR3b1BoYXNlKGV2ZW50Ll90YXJnZXRJbnN0LCBhY2N1bXVsYXRlRGlyZWN0aW9uYWxEaXNwYXRjaGVzLCBldmVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBY2N1bXVsYXRlcyB3aXRob3V0IHJlZ2FyZCB0byBkaXJlY3Rpb24sIGRvZXMgbm90IGxvb2sgZm9yIHBoYXNlZFxuICogcmVnaXN0cmF0aW9uIG5hbWVzLiBTYW1lIGFzIGBhY2N1bXVsYXRlRGlyZWN0RGlzcGF0Y2hlc1NpbmdsZWAgYnV0IHdpdGhvdXRcbiAqIHJlcXVpcmluZyB0aGF0IHRoZSBgZGlzcGF0Y2hNYXJrZXJgIGJlIHRoZSBzYW1lIGFzIHRoZSBkaXNwYXRjaGVkIElELlxuICovXG5mdW5jdGlvbiBhY2N1bXVsYXRlRGlzcGF0Y2hlcyhpbnN0LCBpZ25vcmVkRGlyZWN0aW9uLCBldmVudCkge1xuICBpZiAoaW5zdCAmJiBldmVudCAmJiBldmVudC5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lKSB7XG4gICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUgPSBldmVudC5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lO1xuICAgIHZhciBsaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzID0gYWNjdW11bGF0ZUludG8oZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzLCBsaXN0ZW5lcik7XG4gICAgICBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMgPSBhY2N1bXVsYXRlSW50byhldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMsIGluc3QpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFjY3VtdWxhdGVzIGRpc3BhdGNoZXMgb24gYW4gYFN5bnRoZXRpY0V2ZW50YCwgYnV0IG9ubHkgZm9yIHRoZVxuICogYGRpc3BhdGNoTWFya2VyYC5cbiAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVzU2luZ2xlKGV2ZW50KSB7XG4gIGlmIChldmVudCAmJiBldmVudC5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lKSB7XG4gICAgYWNjdW11bGF0ZURpc3BhdGNoZXMoZXZlbnQuX3RhcmdldEluc3QsIG51bGwsIGV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50cykge1xuICBmb3JFYWNoQWNjdW11bGF0ZWQoZXZlbnRzLCBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2luZ2xlKTtcbn1cblxuXG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVFbnRlckxlYXZlRGlzcGF0Y2hlcyhsZWF2ZSwgZW50ZXIsIGZyb20sIHRvKSB7XG4gIHRyYXZlcnNlRW50ZXJMZWF2ZShmcm9tLCB0bywgYWNjdW11bGF0ZURpc3BhdGNoZXMsIGxlYXZlLCBlbnRlcik7XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVzKGV2ZW50cykge1xuICBmb3JFYWNoQWNjdW11bGF0ZWQoZXZlbnRzLCBhY2N1bXVsYXRlRGlyZWN0RGlzcGF0Y2hlc1NpbmdsZSk7XG59XG5cbnZhciBjYW5Vc2VET00gPSAhISh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuZG9jdW1lbnQgJiYgd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXG4vLyBEbyBub3QgdXNlcyB0aGUgYmVsb3cgdHdvIG1ldGhvZHMgZGlyZWN0bHkhXG4vLyBJbnN0ZWFkIHVzZSBjb25zdGFudHMgZXhwb3J0ZWQgZnJvbSBET01Ub3BMZXZlbEV2ZW50VHlwZXMgaW4gUmVhY3RET00uXG4vLyAoSXQgaXMgdGhlIG9ubHkgbW9kdWxlIHRoYXQgaXMgYWxsb3dlZCB0byBhY2Nlc3MgdGhlc2UgbWV0aG9kcy4pXG5cbmZ1bmN0aW9uIHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSh0b3BMZXZlbFR5cGUpIHtcbiAgcmV0dXJuIHRvcExldmVsVHlwZTtcbn1cblxuZnVuY3Rpb24gdW5zYWZlQ2FzdERPTVRvcExldmVsVHlwZVRvU3RyaW5nKHRvcExldmVsVHlwZSkge1xuICByZXR1cm4gdG9wTGV2ZWxUeXBlO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgbWFwcGluZyBvZiBzdGFuZGFyZCB2ZW5kb3IgcHJlZml4ZXMgdXNpbmcgdGhlIGRlZmluZWQgc3R5bGUgcHJvcGVydHkgYW5kIGV2ZW50IG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0eWxlUHJvcFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuZnVuY3Rpb24gbWFrZVByZWZpeE1hcChzdHlsZVByb3AsIGV2ZW50TmFtZSkge1xuICB2YXIgcHJlZml4ZXMgPSB7fTtcblxuICBwcmVmaXhlc1tzdHlsZVByb3AudG9Mb3dlckNhc2UoKV0gPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcHJlZml4ZXNbJ1dlYmtpdCcgKyBzdHlsZVByb3BdID0gJ3dlYmtpdCcgKyBldmVudE5hbWU7XG4gIHByZWZpeGVzWydNb3onICsgc3R5bGVQcm9wXSA9ICdtb3onICsgZXZlbnROYW1lO1xuXG4gIHJldHVybiBwcmVmaXhlcztcbn1cblxuLyoqXG4gKiBBIGxpc3Qgb2YgZXZlbnQgbmFtZXMgdG8gYSBjb25maWd1cmFibGUgbGlzdCBvZiB2ZW5kb3IgcHJlZml4ZXMuXG4gKi9cbnZhciB2ZW5kb3JQcmVmaXhlcyA9IHtcbiAgYW5pbWF0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uRW5kJyksXG4gIGFuaW1hdGlvbml0ZXJhdGlvbjogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkl0ZXJhdGlvbicpLFxuICBhbmltYXRpb25zdGFydDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvblN0YXJ0JyksXG4gIHRyYW5zaXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ1RyYW5zaXRpb24nLCAnVHJhbnNpdGlvbkVuZCcpXG59O1xuXG4vKipcbiAqIEV2ZW50IG5hbWVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gZGV0ZWN0ZWQgYW5kIHByZWZpeGVkIChpZiBhcHBsaWNhYmxlKS5cbiAqL1xudmFyIHByZWZpeGVkRXZlbnROYW1lcyA9IHt9O1xuXG4vKipcbiAqIEVsZW1lbnQgdG8gY2hlY2sgZm9yIHByZWZpeGVzIG9uLlxuICovXG52YXIgc3R5bGUgPSB7fTtcblxuLyoqXG4gKiBCb290c3RyYXAgaWYgYSBET00gZXhpc3RzLlxuICovXG5pZiAoY2FuVXNlRE9NKSB7XG4gIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGU7XG5cbiAgLy8gT24gc29tZSBwbGF0Zm9ybXMsIGluIHBhcnRpY3VsYXIgc29tZSByZWxlYXNlcyBvZiBBbmRyb2lkIDQueCxcbiAgLy8gdGhlIHVuLXByZWZpeGVkIFwiYW5pbWF0aW9uXCIgYW5kIFwidHJhbnNpdGlvblwiIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgb24gdGhlXG4gIC8vIHN0eWxlIG9iamVjdCBidXQgdGhlIGV2ZW50cyB0aGF0IGZpcmUgd2lsbCBzdGlsbCBiZSBwcmVmaXhlZCwgc28gd2UgbmVlZFxuICAvLyB0byBjaGVjayBpZiB0aGUgdW4tcHJlZml4ZWQgZXZlbnRzIGFyZSB1c2FibGUsIGFuZCBpZiBub3QgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgbWFwLlxuICBpZiAoISgnQW5pbWF0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uO1xuICB9XG5cbiAgLy8gU2FtZSBhcyBhYm92ZVxuICBpZiAoISgnVHJhbnNpdGlvbkV2ZW50JyBpbiB3aW5kb3cpKSB7XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEF0dGVtcHRzIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCB2ZW5kb3IgcHJlZml4ZWQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShldmVudE5hbWUpIHtcbiAgaWYgKHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdO1xuICB9IGVsc2UgaWYgKCF2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZTtcbiAgfVxuXG4gIHZhciBwcmVmaXhNYXAgPSB2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdO1xuXG4gIGZvciAodmFyIHN0eWxlUHJvcCBpbiBwcmVmaXhNYXApIHtcbiAgICBpZiAocHJlZml4TWFwLmhhc093blByb3BlcnR5KHN0eWxlUHJvcCkgJiYgc3R5bGVQcm9wIGluIHN0eWxlKSB7XG4gICAgICByZXR1cm4gcHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV0gPSBwcmVmaXhNYXBbc3R5bGVQcm9wXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXZlbnROYW1lO1xufVxuXG4vKipcbiAqIFRvIGlkZW50aWZ5IHRvcCBsZXZlbCBldmVudHMgaW4gUmVhY3RET00sIHdlIHVzZSBjb25zdGFudHMgZGVmaW5lZCBieSB0aGlzXG4gKiBtb2R1bGUuIFRoaXMgaXMgdGhlIG9ubHkgbW9kdWxlIHRoYXQgdXNlcyB0aGUgdW5zYWZlKiBtZXRob2RzIHRvIGV4cHJlc3NcbiAqIHRoYXQgdGhlIGNvbnN0YW50cyBhY3R1YWxseSBjb3JyZXNwb25kIHRvIHRoZSBicm93c2VyIGV2ZW50IG5hbWVzLiBUaGlzIGxldHNcbiAqIHVzIHNhdmUgc29tZSBidW5kbGUgc2l6ZSBieSBhdm9pZGluZyBhIHRvcCBsZXZlbCB0eXBlIC0+IGV2ZW50IG5hbWUgbWFwLlxuICogVGhlIHJlc3Qgb2YgUmVhY3RET00gY29kZSBzaG91bGQgaW1wb3J0IHRvcCBsZXZlbCB0eXBlcyBmcm9tIHRoaXMgZmlsZS5cbiAqL1xudmFyIFRPUF9BQk9SVCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnYWJvcnQnKTtcbnZhciBUT1BfQU5JTUFUSU9OX0VORCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZShnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uZW5kJykpO1xudmFyIFRPUF9BTklNQVRJT05fSVRFUkFUSU9OID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25pdGVyYXRpb24nKSk7XG52YXIgVE9QX0FOSU1BVElPTl9TVEFSVCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZShnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uc3RhcnQnKSk7XG52YXIgVE9QX0JMVVIgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2JsdXInKTtcbnZhciBUT1BfQ0FOX1BMQVkgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2NhbnBsYXknKTtcbnZhciBUT1BfQ0FOX1BMQVlfVEhST1VHSCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnY2FucGxheXRocm91Z2gnKTtcbnZhciBUT1BfQ0FOQ0VMID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdjYW5jZWwnKTtcbnZhciBUT1BfQ0hBTkdFID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdjaGFuZ2UnKTtcbnZhciBUT1BfQ0xJQ0sgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2NsaWNrJyk7XG52YXIgVE9QX0NMT1NFID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdjbG9zZScpO1xudmFyIFRPUF9DT01QT1NJVElPTl9FTkQgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2NvbXBvc2l0aW9uZW5kJyk7XG52YXIgVE9QX0NPTVBPU0lUSU9OX1NUQVJUID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdjb21wb3NpdGlvbnN0YXJ0Jyk7XG52YXIgVE9QX0NPTVBPU0lUSU9OX1VQREFURSA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnY29tcG9zaXRpb251cGRhdGUnKTtcbnZhciBUT1BfQ09OVEVYVF9NRU5VID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdjb250ZXh0bWVudScpO1xudmFyIFRPUF9DT1BZID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdjb3B5Jyk7XG52YXIgVE9QX0NVVCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnY3V0Jyk7XG52YXIgVE9QX0RPVUJMRV9DTElDSyA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnZGJsY2xpY2snKTtcbnZhciBUT1BfQVVYX0NMSUNLID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdhdXhjbGljaycpO1xudmFyIFRPUF9EUkFHID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdkcmFnJyk7XG52YXIgVE9QX0RSQUdfRU5EID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdkcmFnZW5kJyk7XG52YXIgVE9QX0RSQUdfRU5URVIgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2RyYWdlbnRlcicpO1xudmFyIFRPUF9EUkFHX0VYSVQgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2RyYWdleGl0Jyk7XG52YXIgVE9QX0RSQUdfTEVBVkUgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2RyYWdsZWF2ZScpO1xudmFyIFRPUF9EUkFHX09WRVIgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2RyYWdvdmVyJyk7XG52YXIgVE9QX0RSQUdfU1RBUlQgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2RyYWdzdGFydCcpO1xudmFyIFRPUF9EUk9QID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdkcm9wJyk7XG52YXIgVE9QX0RVUkFUSU9OX0NIQU5HRSA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnZHVyYXRpb25jaGFuZ2UnKTtcbnZhciBUT1BfRU1QVElFRCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnZW1wdGllZCcpO1xudmFyIFRPUF9FTkNSWVBURUQgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2VuY3J5cHRlZCcpO1xudmFyIFRPUF9FTkRFRCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnZW5kZWQnKTtcbnZhciBUT1BfRVJST1IgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2Vycm9yJyk7XG52YXIgVE9QX0ZPQ1VTID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdmb2N1cycpO1xudmFyIFRPUF9HT1RfUE9JTlRFUl9DQVBUVVJFID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdnb3Rwb2ludGVyY2FwdHVyZScpO1xudmFyIFRPUF9JTlBVVCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnaW5wdXQnKTtcbnZhciBUT1BfSU5WQUxJRCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnaW52YWxpZCcpO1xudmFyIFRPUF9LRVlfRE9XTiA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgna2V5ZG93bicpO1xudmFyIFRPUF9LRVlfUFJFU1MgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2tleXByZXNzJyk7XG52YXIgVE9QX0tFWV9VUCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgna2V5dXAnKTtcbnZhciBUT1BfTE9BRCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnbG9hZCcpO1xudmFyIFRPUF9MT0FEX1NUQVJUID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdsb2Fkc3RhcnQnKTtcbnZhciBUT1BfTE9BREVEX0RBVEEgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2xvYWRlZGRhdGEnKTtcbnZhciBUT1BfTE9BREVEX01FVEFEQVRBID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdsb2FkZWRtZXRhZGF0YScpO1xudmFyIFRPUF9MT1NUX1BPSU5URVJfQ0FQVFVSRSA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnbG9zdHBvaW50ZXJjYXB0dXJlJyk7XG52YXIgVE9QX01PVVNFX0RPV04gPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ21vdXNlZG93bicpO1xudmFyIFRPUF9NT1VTRV9NT1ZFID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdtb3VzZW1vdmUnKTtcbnZhciBUT1BfTU9VU0VfT1VUID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdtb3VzZW91dCcpO1xudmFyIFRPUF9NT1VTRV9PVkVSID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdtb3VzZW92ZXInKTtcbnZhciBUT1BfTU9VU0VfVVAgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ21vdXNldXAnKTtcbnZhciBUT1BfUEFTVEUgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3Bhc3RlJyk7XG52YXIgVE9QX1BBVVNFID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdwYXVzZScpO1xudmFyIFRPUF9QTEFZID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdwbGF5Jyk7XG52YXIgVE9QX1BMQVlJTkcgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3BsYXlpbmcnKTtcbnZhciBUT1BfUE9JTlRFUl9DQU5DRUwgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3BvaW50ZXJjYW5jZWwnKTtcbnZhciBUT1BfUE9JTlRFUl9ET1dOID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdwb2ludGVyZG93bicpO1xuXG5cbnZhciBUT1BfUE9JTlRFUl9NT1ZFID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdwb2ludGVybW92ZScpO1xudmFyIFRPUF9QT0lOVEVSX09VVCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgncG9pbnRlcm91dCcpO1xudmFyIFRPUF9QT0lOVEVSX09WRVIgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3BvaW50ZXJvdmVyJyk7XG52YXIgVE9QX1BPSU5URVJfVVAgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3BvaW50ZXJ1cCcpO1xudmFyIFRPUF9QUk9HUkVTUyA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgncHJvZ3Jlc3MnKTtcbnZhciBUT1BfUkFURV9DSEFOR0UgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3JhdGVjaGFuZ2UnKTtcbnZhciBUT1BfUkVTRVQgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3Jlc2V0Jyk7XG52YXIgVE9QX1NDUk9MTCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnc2Nyb2xsJyk7XG52YXIgVE9QX1NFRUtFRCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnc2Vla2VkJyk7XG52YXIgVE9QX1NFRUtJTkcgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3NlZWtpbmcnKTtcbnZhciBUT1BfU0VMRUNUSU9OX0NIQU5HRSA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnc2VsZWN0aW9uY2hhbmdlJyk7XG52YXIgVE9QX1NUQUxMRUQgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3N0YWxsZWQnKTtcbnZhciBUT1BfU1VCTUlUID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdzdWJtaXQnKTtcbnZhciBUT1BfU1VTUEVORCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnc3VzcGVuZCcpO1xudmFyIFRPUF9URVhUX0lOUFVUID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCd0ZXh0SW5wdXQnKTtcbnZhciBUT1BfVElNRV9VUERBVEUgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3RpbWV1cGRhdGUnKTtcbnZhciBUT1BfVE9HR0xFID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCd0b2dnbGUnKTtcbnZhciBUT1BfVE9VQ0hfQ0FOQ0VMID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCd0b3VjaGNhbmNlbCcpO1xudmFyIFRPUF9UT1VDSF9FTkQgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3RvdWNoZW5kJyk7XG52YXIgVE9QX1RPVUNIX01PVkUgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3RvdWNobW92ZScpO1xudmFyIFRPUF9UT1VDSF9TVEFSVCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgndG91Y2hzdGFydCcpO1xudmFyIFRPUF9UUkFOU0lUSU9OX0VORCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZShnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgndHJhbnNpdGlvbmVuZCcpKTtcbnZhciBUT1BfVk9MVU1FX0NIQU5HRSA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgndm9sdW1lY2hhbmdlJyk7XG52YXIgVE9QX1dBSVRJTkcgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3dhaXRpbmcnKTtcbnZhciBUT1BfV0hFRUwgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3doZWVsJyk7XG5cbi8vIExpc3Qgb2YgZXZlbnRzIHRoYXQgbmVlZCB0byBiZSBpbmRpdmlkdWFsbHkgYXR0YWNoZWQgdG8gbWVkaWEgZWxlbWVudHMuXG4vLyBOb3RlIHRoYXQgZXZlbnRzIGluIHRoaXMgbGlzdCB3aWxsICpub3QqIGJlIGxpc3RlbmVkIHRvIGF0IHRoZSB0b3AgbGV2ZWxcbi8vIHVubGVzcyB0aGV5J3JlIGV4cGxpY2l0bHkgd2hpdGVsaXN0ZWQgaW4gYFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5saXN0ZW5Ub2AuXG52YXIgbWVkaWFFdmVudFR5cGVzID0gW1RPUF9BQk9SVCwgVE9QX0NBTl9QTEFZLCBUT1BfQ0FOX1BMQVlfVEhST1VHSCwgVE9QX0RVUkFUSU9OX0NIQU5HRSwgVE9QX0VNUFRJRUQsIFRPUF9FTkNSWVBURUQsIFRPUF9FTkRFRCwgVE9QX0VSUk9SLCBUT1BfTE9BREVEX0RBVEEsIFRPUF9MT0FERURfTUVUQURBVEEsIFRPUF9MT0FEX1NUQVJULCBUT1BfUEFVU0UsIFRPUF9QTEFZLCBUT1BfUExBWUlORywgVE9QX1BST0dSRVNTLCBUT1BfUkFURV9DSEFOR0UsIFRPUF9TRUVLRUQsIFRPUF9TRUVLSU5HLCBUT1BfU1RBTExFRCwgVE9QX1NVU1BFTkQsIFRPUF9USU1FX1VQREFURSwgVE9QX1ZPTFVNRV9DSEFOR0UsIFRPUF9XQUlUSU5HXTtcblxuZnVuY3Rpb24gZ2V0UmF3RXZlbnROYW1lKHRvcExldmVsVHlwZSkge1xuICByZXR1cm4gdW5zYWZlQ2FzdERPTVRvcExldmVsVHlwZVRvU3RyaW5nKHRvcExldmVsVHlwZSk7XG59XG5cbi8qKlxuICogVGhlc2UgdmFyaWFibGVzIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHRleHQgY29udGVudCBvZiBhIHRhcmdldCBub2RlLFxuICogYWxsb3dpbmcgY29tcGFyaXNvbiBvZiBjb250ZW50IGJlZm9yZSBhbmQgYWZ0ZXIgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBJZGVudGlmeSB0aGUgbm9kZSB3aGVyZSBzZWxlY3Rpb24gY3VycmVudGx5IGJlZ2lucywgdGhlbiBvYnNlcnZlXG4gKiBib3RoIGl0cyB0ZXh0IGNvbnRlbnQgYW5kIGl0cyBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBET00uIFNpbmNlIHRoZVxuICogYnJvd3NlciBtYXkgbmF0aXZlbHkgcmVwbGFjZSB0aGUgdGFyZ2V0IG5vZGUgZHVyaW5nIGNvbXBvc2l0aW9uLCB3ZSBjYW5cbiAqIHVzZSBpdHMgcG9zaXRpb24gdG8gZmluZCBpdHMgcmVwbGFjZW1lbnQuXG4gKlxuICpcbiAqL1xuXG52YXIgcm9vdCA9IG51bGw7XG52YXIgc3RhcnRUZXh0ID0gbnVsbDtcbnZhciBmYWxsYmFja1RleHQgPSBudWxsO1xuXG5mdW5jdGlvbiBpbml0aWFsaXplKG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJvb3QgPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgc3RhcnRUZXh0ID0gZ2V0VGV4dCgpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVzZXQoKSB7XG4gIHJvb3QgPSBudWxsO1xuICBzdGFydFRleHQgPSBudWxsO1xuICBmYWxsYmFja1RleHQgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXREYXRhKCkge1xuICBpZiAoZmFsbGJhY2tUZXh0KSB7XG4gICAgcmV0dXJuIGZhbGxiYWNrVGV4dDtcbiAgfVxuXG4gIHZhciBzdGFydCA9IHZvaWQgMDtcbiAgdmFyIHN0YXJ0VmFsdWUgPSBzdGFydFRleHQ7XG4gIHZhciBzdGFydExlbmd0aCA9IHN0YXJ0VmFsdWUubGVuZ3RoO1xuICB2YXIgZW5kID0gdm9pZCAwO1xuICB2YXIgZW5kVmFsdWUgPSBnZXRUZXh0KCk7XG4gIHZhciBlbmRMZW5ndGggPSBlbmRWYWx1ZS5sZW5ndGg7XG5cbiAgZm9yIChzdGFydCA9IDA7IHN0YXJ0IDwgc3RhcnRMZW5ndGg7IHN0YXJ0KyspIHtcbiAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydF0gIT09IGVuZFZhbHVlW3N0YXJ0XSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIG1pbkVuZCA9IHN0YXJ0TGVuZ3RoIC0gc3RhcnQ7XG4gIGZvciAoZW5kID0gMTsgZW5kIDw9IG1pbkVuZDsgZW5kKyspIHtcbiAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydExlbmd0aCAtIGVuZF0gIT09IGVuZFZhbHVlW2VuZExlbmd0aCAtIGVuZF0pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzbGljZVRhaWwgPSBlbmQgPiAxID8gMSAtIGVuZCA6IHVuZGVmaW5lZDtcbiAgZmFsbGJhY2tUZXh0ID0gZW5kVmFsdWUuc2xpY2Uoc3RhcnQsIHNsaWNlVGFpbCk7XG4gIHJldHVybiBmYWxsYmFja1RleHQ7XG59XG5cbmZ1bmN0aW9uIGdldFRleHQoKSB7XG4gIGlmICgndmFsdWUnIGluIHJvb3QpIHtcbiAgICByZXR1cm4gcm9vdC52YWx1ZTtcbiAgfVxuICByZXR1cm4gcm9vdC50ZXh0Q29udGVudDtcbn1cblxuLyogZXNsaW50IHZhbGlkLXR5cGVvZjogMCAqL1xuXG52YXIgRVZFTlRfUE9PTF9TSVpFID0gMTA7XG5cbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cbnZhciBFdmVudEludGVyZmFjZSA9IHtcbiAgdHlwZTogbnVsbCxcbiAgdGFyZ2V0OiBudWxsLFxuICAvLyBjdXJyZW50VGFyZ2V0IGlzIHNldCB3aGVuIGRpc3BhdGNoaW5nOyBubyB1c2UgaW4gY29weWluZyBpdCBoZXJlXG4gIGN1cnJlbnRUYXJnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcbiAgZXZlbnRQaGFzZTogbnVsbCxcbiAgYnViYmxlczogbnVsbCxcbiAgY2FuY2VsYWJsZTogbnVsbCxcbiAgdGltZVN0YW1wOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG4gIH0sXG4gIGRlZmF1bHRQcmV2ZW50ZWQ6IG51bGwsXG4gIGlzVHJ1c3RlZDogbnVsbFxufTtcblxuZnVuY3Rpb24gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWUoKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2UoKSB7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTeW50aGV0aWMgZXZlbnRzIGFyZSBkaXNwYXRjaGVkIGJ5IGV2ZW50IHBsdWdpbnMsIHR5cGljYWxseSBpbiByZXNwb25zZSB0byBhXG4gKiB0b3AtbGV2ZWwgZXZlbnQgZGVsZWdhdGlvbiBoYW5kbGVyLlxuICpcbiAqIFRoZXNlIHN5c3RlbXMgc2hvdWxkIGdlbmVyYWxseSB1c2UgcG9vbGluZyB0byByZWR1Y2UgdGhlIGZyZXF1ZW5jeSBvZiBnYXJiYWdlXG4gKiBjb2xsZWN0aW9uLiBUaGUgc3lzdGVtIHNob3VsZCBjaGVjayBgaXNQZXJzaXN0ZW50YCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVcbiAqIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBpbnRvIHRoZSBwb29sIGFmdGVyIGJlaW5nIGRpc3BhdGNoZWQuIFVzZXJzIHRoYXRcbiAqIG5lZWQgYSBwZXJzaXN0ZWQgZXZlbnQgc2hvdWxkIGludm9rZSBgcGVyc2lzdGAuXG4gKlxuICogU3ludGhldGljIGV2ZW50cyAoYW5kIHN1YmNsYXNzZXMpIGltcGxlbWVudCB0aGUgRE9NIExldmVsIDMgRXZlbnRzIEFQSSBieVxuICogbm9ybWFsaXppbmcgYnJvd3NlciBxdWlya3MuIFN1YmNsYXNzZXMgZG8gbm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8gaW1wbGVtZW50IGFcbiAqIERPTSBpbnRlcmZhY2U7IGN1c3RvbSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBldmVudHMgY2FuIGFsc28gc3ViY2xhc3MgdGhpcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuXG4gKiBAcGFyYW0geyp9IHRhcmdldEluc3QgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcGFyYW0ge0RPTUV2ZW50VGFyZ2V0fSBuYXRpdmVFdmVudFRhcmdldCBUYXJnZXQgbm9kZS5cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljRXZlbnQoZGlzcGF0Y2hDb25maWcsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICB7XG4gICAgLy8gdGhlc2UgaGF2ZSBhIGdldHRlci9zZXR0ZXIgZm9yIHdhcm5pbmdzXG4gICAgZGVsZXRlIHRoaXMubmF0aXZlRXZlbnQ7XG4gICAgZGVsZXRlIHRoaXMucHJldmVudERlZmF1bHQ7XG4gICAgZGVsZXRlIHRoaXMuc3RvcFByb3BhZ2F0aW9uO1xuICAgIGRlbGV0ZSB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZDtcbiAgICBkZWxldGUgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZDtcbiAgfVxuXG4gIHRoaXMuZGlzcGF0Y2hDb25maWcgPSBkaXNwYXRjaENvbmZpZztcbiAgdGhpcy5fdGFyZ2V0SW5zdCA9IHRhcmdldEluc3Q7XG4gIHRoaXMubmF0aXZlRXZlbnQgPSBuYXRpdmVFdmVudDtcblxuICB2YXIgSW50ZXJmYWNlID0gdGhpcy5jb25zdHJ1Y3Rvci5JbnRlcmZhY2U7XG4gIGZvciAodmFyIHByb3BOYW1lIGluIEludGVyZmFjZSkge1xuICAgIGlmICghSW50ZXJmYWNlLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHtcbiAgICAgIGRlbGV0ZSB0aGlzW3Byb3BOYW1lXTsgLy8gdGhpcyBoYXMgYSBnZXR0ZXIvc2V0dGVyIGZvciB3YXJuaW5nc1xuICAgIH1cbiAgICB2YXIgbm9ybWFsaXplID0gSW50ZXJmYWNlW3Byb3BOYW1lXTtcbiAgICBpZiAobm9ybWFsaXplKSB7XG4gICAgICB0aGlzW3Byb3BOYW1lXSA9IG5vcm1hbGl6ZShuYXRpdmVFdmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ3RhcmdldCcpIHtcbiAgICAgICAgdGhpcy50YXJnZXQgPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXNbcHJvcE5hbWVdID0gbmF0aXZlRXZlbnRbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBkZWZhdWx0UHJldmVudGVkID0gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCAhPSBudWxsID8gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCA6IG5hdGl2ZUV2ZW50LnJldHVyblZhbHVlID09PSBmYWxzZTtcbiAgaWYgKGRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlO1xuICB9XG4gIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2U7XG4gIHJldHVybiB0aGlzO1xufVxuXG5fYXNzaWduKFN5bnRoZXRpY0V2ZW50LnByb3RvdHlwZSwge1xuICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgdmFyIGV2ZW50ID0gdGhpcy5uYXRpdmVFdmVudDtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnByZXZlbnREZWZhdWx0KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LnJldHVyblZhbHVlICE9PSAndW5rbm93bicpIHtcbiAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gIH0sXG5cbiAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV2ZW50ID0gdGhpcy5uYXRpdmVFdmVudDtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQuY2FuY2VsQnViYmxlICE9PSAndW5rbm93bicpIHtcbiAgICAgIC8vIFRoZSBDaGFuZ2VFdmVudFBsdWdpbiByZWdpc3RlcnMgYSBcInByb3BlcnR5Y2hhbmdlXCIgZXZlbnQgZm9yXG4gICAgICAvLyBJRS4gVGhpcyBldmVudCBkb2VzIG5vdCBzdXBwb3J0IGJ1YmJsaW5nIG9yIGNhbmNlbGxpbmcsIGFuZFxuICAgICAgLy8gYW55IHJlZmVyZW5jZXMgdG8gY2FuY2VsQnViYmxlIHRocm93IFwiTWVtYmVyIG5vdCBmb3VuZFwiLiAgQVxuICAgICAgLy8gdHlwZW9mIGNoZWNrIG9mIFwidW5rbm93blwiIGNpcmN1bXZlbnRzIHRoaXMgaXNzdWUgKGFuZCBpcyBhbHNvXG4gICAgICAvLyBJRSBzcGVjaWZpYykuXG4gICAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZTtcbiAgfSxcblxuICAvKipcbiAgICogV2UgcmVsZWFzZSBhbGwgZGlzcGF0Y2hlZCBgU3ludGhldGljRXZlbnRgcyBhZnRlciBlYWNoIGV2ZW50IGxvb3AsIGFkZGluZ1xuICAgKiB0aGVtIGJhY2sgaW50byB0aGUgcG9vbC4gVGhpcyBhbGxvd3MgYSB3YXkgdG8gaG9sZCBvbnRvIGEgcmVmZXJlbmNlIHRoYXRcbiAgICogd29uJ3QgYmUgYWRkZWQgYmFjayBpbnRvIHRoZSBwb29sLlxuICAgKi9cbiAgcGVyc2lzdDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuaXNQZXJzaXN0ZW50ID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGlzIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBiYWNrIGludG8gdGhlIHBvb2wuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhpcyBzaG91bGQgbm90IGJlIHJlbGVhc2VkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBpc1BlcnNpc3RlbnQ6IGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZSxcblxuICAvKipcbiAgICogYFBvb2xlZENsYXNzYCBsb29rcyBmb3IgYGRlc3RydWN0b3JgIG9uIGVhY2ggaW5zdGFuY2UgaXQgcmVsZWFzZXMuXG4gICAqL1xuICBkZXN0cnVjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIEludGVyZmFjZSA9IHRoaXMuY29uc3RydWN0b3IuSW50ZXJmYWNlO1xuICAgIGZvciAodmFyIHByb3BOYW1lIGluIEludGVyZmFjZSkge1xuICAgICAge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcE5hbWUsIGdldFBvb2xlZFdhcm5pbmdQcm9wZXJ0eURlZmluaXRpb24ocHJvcE5hbWUsIEludGVyZmFjZVtwcm9wTmFtZV0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5kaXNwYXRjaENvbmZpZyA9IG51bGw7XG4gICAgdGhpcy5fdGFyZ2V0SW5zdCA9IG51bGw7XG4gICAgdGhpcy5uYXRpdmVFdmVudCA9IG51bGw7XG4gICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2U7XG4gICAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZTtcbiAgICB0aGlzLl9kaXNwYXRjaExpc3RlbmVycyA9IG51bGw7XG4gICAgdGhpcy5fZGlzcGF0Y2hJbnN0YW5jZXMgPSBudWxsO1xuICAgIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbmF0aXZlRXZlbnQnLCBnZXRQb29sZWRXYXJuaW5nUHJvcGVydHlEZWZpbml0aW9uKCduYXRpdmVFdmVudCcsIG51bGwpKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaXNEZWZhdWx0UHJldmVudGVkJywgZ2V0UG9vbGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbignaXNEZWZhdWx0UHJldmVudGVkJywgZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlKSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2lzUHJvcGFnYXRpb25TdG9wcGVkJywgZ2V0UG9vbGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbignaXNQcm9wYWdhdGlvblN0b3BwZWQnLCBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2UpKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncHJldmVudERlZmF1bHQnLCBnZXRQb29sZWRXYXJuaW5nUHJvcGVydHlEZWZpbml0aW9uKCdwcmV2ZW50RGVmYXVsdCcsIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3N0b3BQcm9wYWdhdGlvbicsIGdldFBvb2xlZFdhcm5pbmdQcm9wZXJ0eURlZmluaXRpb24oJ3N0b3BQcm9wYWdhdGlvbicsIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgfVxuICB9XG59KTtcblxuU3ludGhldGljRXZlbnQuSW50ZXJmYWNlID0gRXZlbnRJbnRlcmZhY2U7XG5cbi8qKlxuICogSGVscGVyIHRvIHJlZHVjZSBib2lsZXJwbGF0ZSB3aGVuIGNyZWF0aW5nIHN1YmNsYXNzZXMuXG4gKi9cblN5bnRoZXRpY0V2ZW50LmV4dGVuZCA9IGZ1bmN0aW9uIChJbnRlcmZhY2UpIHtcbiAgdmFyIFN1cGVyID0gdGhpcztcblxuICB2YXIgRSA9IGZ1bmN0aW9uICgpIHt9O1xuICBFLnByb3RvdHlwZSA9IFN1cGVyLnByb3RvdHlwZTtcbiAgdmFyIHByb3RvdHlwZSA9IG5ldyBFKCk7XG5cbiAgZnVuY3Rpb24gQ2xhc3MoKSB7XG4gICAgcmV0dXJuIFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cbiAgX2Fzc2lnbihwcm90b3R5cGUsIENsYXNzLnByb3RvdHlwZSk7XG4gIENsYXNzLnByb3RvdHlwZSA9IHByb3RvdHlwZTtcbiAgQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2xhc3M7XG5cbiAgQ2xhc3MuSW50ZXJmYWNlID0gX2Fzc2lnbih7fSwgU3VwZXIuSW50ZXJmYWNlLCBJbnRlcmZhY2UpO1xuICBDbGFzcy5leHRlbmQgPSBTdXBlci5leHRlbmQ7XG4gIGFkZEV2ZW50UG9vbGluZ1RvKENsYXNzKTtcblxuICByZXR1cm4gQ2xhc3M7XG59O1xuXG5hZGRFdmVudFBvb2xpbmdUbyhTeW50aGV0aWNFdmVudCk7XG5cbi8qKlxuICogSGVscGVyIHRvIG51bGxpZnkgc3ludGhldGljRXZlbnQgaW5zdGFuY2UgcHJvcGVydGllcyB3aGVuIGRlc3RydWN0aW5nXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHByb3BOYW1lXG4gKiBAcGFyYW0gez9vYmplY3R9IGdldFZhbFxuICogQHJldHVybiB7b2JqZWN0fSBkZWZpbmVQcm9wZXJ0eSBvYmplY3RcbiAqL1xuZnVuY3Rpb24gZ2V0UG9vbGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbihwcm9wTmFtZSwgZ2V0VmFsKSB7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIGdldFZhbCA9PT0gJ2Z1bmN0aW9uJztcbiAgcmV0dXJuIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgc2V0OiBzZXQsXG4gICAgZ2V0OiBnZXRcbiAgfTtcblxuICBmdW5jdGlvbiBzZXQodmFsKSB7XG4gICAgdmFyIGFjdGlvbiA9IGlzRnVuY3Rpb24gPyAnc2V0dGluZyB0aGUgbWV0aG9kJyA6ICdzZXR0aW5nIHRoZSBwcm9wZXJ0eSc7XG4gICAgd2FybihhY3Rpb24sICdUaGlzIGlzIGVmZmVjdGl2ZWx5IGEgbm8tb3AnKTtcbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0KCkge1xuICAgIHZhciBhY3Rpb24gPSBpc0Z1bmN0aW9uID8gJ2FjY2Vzc2luZyB0aGUgbWV0aG9kJyA6ICdhY2Nlc3NpbmcgdGhlIHByb3BlcnR5JztcbiAgICB2YXIgcmVzdWx0ID0gaXNGdW5jdGlvbiA/ICdUaGlzIGlzIGEgbm8tb3AgZnVuY3Rpb24nIDogJ1RoaXMgaXMgc2V0IHRvIG51bGwnO1xuICAgIHdhcm4oYWN0aW9uLCByZXN1bHQpO1xuICAgIHJldHVybiBnZXRWYWw7XG4gIH1cblxuICBmdW5jdGlvbiB3YXJuKGFjdGlvbiwgcmVzdWx0KSB7XG4gICAgdmFyIHdhcm5pbmdDb25kaXRpb24gPSBmYWxzZTtcbiAgICAhd2FybmluZ0NvbmRpdGlvbiA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgXCJUaGlzIHN5bnRoZXRpYyBldmVudCBpcyByZXVzZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIElmIHlvdSdyZSBzZWVpbmcgdGhpcywgXCIgKyBcInlvdSdyZSAlcyBgJXNgIG9uIGEgcmVsZWFzZWQvbnVsbGlmaWVkIHN5bnRoZXRpYyBldmVudC4gJXMuIFwiICsgJ0lmIHlvdSBtdXN0IGtlZXAgdGhlIG9yaWdpbmFsIHN5bnRoZXRpYyBldmVudCBhcm91bmQsIHVzZSBldmVudC5wZXJzaXN0KCkuICcgKyAnU2VlIGh0dHBzOi8vZmIubWUvcmVhY3QtZXZlbnQtcG9vbGluZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLCBhY3Rpb24sIHByb3BOYW1lLCByZXN1bHQpIDogdm9pZCAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFBvb2xlZEV2ZW50KGRpc3BhdGNoQ29uZmlnLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlSW5zdCkge1xuICB2YXIgRXZlbnRDb25zdHJ1Y3RvciA9IHRoaXM7XG4gIGlmIChFdmVudENvbnN0cnVjdG9yLmV2ZW50UG9vbC5sZW5ndGgpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBFdmVudENvbnN0cnVjdG9yLmV2ZW50UG9vbC5wb3AoKTtcbiAgICBFdmVudENvbnN0cnVjdG9yLmNhbGwoaW5zdGFuY2UsIGRpc3BhdGNoQ29uZmlnLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlSW5zdCk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG4gIHJldHVybiBuZXcgRXZlbnRDb25zdHJ1Y3RvcihkaXNwYXRjaENvbmZpZywgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUluc3QpO1xufVxuXG5mdW5jdGlvbiByZWxlYXNlUG9vbGVkRXZlbnQoZXZlbnQpIHtcbiAgdmFyIEV2ZW50Q29uc3RydWN0b3IgPSB0aGlzO1xuICAhKGV2ZW50IGluc3RhbmNlb2YgRXZlbnRDb25zdHJ1Y3RvcikgPyBpbnZhcmlhbnQoZmFsc2UsICdUcnlpbmcgdG8gcmVsZWFzZSBhbiBldmVudCBpbnN0YW5jZSBpbnRvIGEgcG9vbCBvZiBhIGRpZmZlcmVudCB0eXBlLicpIDogdm9pZCAwO1xuICBldmVudC5kZXN0cnVjdG9yKCk7XG4gIGlmIChFdmVudENvbnN0cnVjdG9yLmV2ZW50UG9vbC5sZW5ndGggPCBFVkVOVF9QT09MX1NJWkUpIHtcbiAgICBFdmVudENvbnN0cnVjdG9yLmV2ZW50UG9vbC5wdXNoKGV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRFdmVudFBvb2xpbmdUbyhFdmVudENvbnN0cnVjdG9yKSB7XG4gIEV2ZW50Q29uc3RydWN0b3IuZXZlbnRQb29sID0gW107XG4gIEV2ZW50Q29uc3RydWN0b3IuZ2V0UG9vbGVkID0gZ2V0UG9vbGVkRXZlbnQ7XG4gIEV2ZW50Q29uc3RydWN0b3IucmVsZWFzZSA9IHJlbGVhc2VQb29sZWRFdmVudDtcbn1cblxuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRzLWNvbXBvc2l0aW9uZXZlbnRzXG4gKi9cbnZhciBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50ID0gU3ludGhldGljRXZlbnQuZXh0ZW5kKHtcbiAgZGF0YTogbnVsbFxufSk7XG5cbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDEzMTEwNVxuICogICAgICAvI2V2ZW50cy1pbnB1dGV2ZW50c1xuICovXG52YXIgU3ludGhldGljSW5wdXRFdmVudCA9IFN5bnRoZXRpY0V2ZW50LmV4dGVuZCh7XG4gIGRhdGE6IG51bGxcbn0pO1xuXG52YXIgRU5EX0tFWUNPREVTID0gWzksIDEzLCAyNywgMzJdOyAvLyBUYWIsIFJldHVybiwgRXNjLCBTcGFjZVxudmFyIFNUQVJUX0tFWUNPREUgPSAyMjk7XG5cbnZhciBjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ID0gY2FuVXNlRE9NICYmICdDb21wb3NpdGlvbkV2ZW50JyBpbiB3aW5kb3c7XG5cbnZhciBkb2N1bWVudE1vZGUgPSBudWxsO1xuaWYgKGNhblVzZURPTSAmJiAnZG9jdW1lbnRNb2RlJyBpbiBkb2N1bWVudCkge1xuICBkb2N1bWVudE1vZGUgPSBkb2N1bWVudC5kb2N1bWVudE1vZGU7XG59XG5cbi8vIFdlYmtpdCBvZmZlcnMgYSB2ZXJ5IHVzZWZ1bCBgdGV4dElucHV0YCBldmVudCB0aGF0IGNhbiBiZSB1c2VkIHRvXG4vLyBkaXJlY3RseSByZXByZXNlbnQgYGJlZm9yZUlucHV0YC4gVGhlIElFIGB0ZXh0aW5wdXRgIGV2ZW50IGlzIG5vdCBhc1xuLy8gdXNlZnVsLCBzbyB3ZSBkb24ndCB1c2UgaXQuXG52YXIgY2FuVXNlVGV4dElucHV0RXZlbnQgPSBjYW5Vc2VET00gJiYgJ1RleHRFdmVudCcgaW4gd2luZG93ICYmICFkb2N1bWVudE1vZGU7XG5cbi8vIEluIElFOSssIHdlIGhhdmUgYWNjZXNzIHRvIGNvbXBvc2l0aW9uIGV2ZW50cywgYnV0IHRoZSBkYXRhIHN1cHBsaWVkXG4vLyBieSB0aGUgbmF0aXZlIGNvbXBvc2l0aW9uZW5kIGV2ZW50IG1heSBiZSBpbmNvcnJlY3QuIEphcGFuZXNlIGlkZW9ncmFwaGljXG4vLyBzcGFjZXMsIGZvciBpbnN0YW5jZSAoXFx1MzAwMCkgYXJlIG5vdCByZWNvcmRlZCBjb3JyZWN0bHkuXG52YXIgdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgPSBjYW5Vc2VET00gJiYgKCFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50IHx8IGRvY3VtZW50TW9kZSAmJiBkb2N1bWVudE1vZGUgPiA4ICYmIGRvY3VtZW50TW9kZSA8PSAxMSk7XG5cbnZhciBTUEFDRUJBUl9DT0RFID0gMzI7XG52YXIgU1BBQ0VCQVJfQ0hBUiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoU1BBQ0VCQVJfQ09ERSk7XG5cbi8vIEV2ZW50cyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBuYW1lcy5cbnZhciBldmVudFR5cGVzID0ge1xuICBiZWZvcmVJbnB1dDoge1xuICAgIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOiB7XG4gICAgICBidWJibGVkOiAnb25CZWZvcmVJbnB1dCcsXG4gICAgICBjYXB0dXJlZDogJ29uQmVmb3JlSW5wdXRDYXB0dXJlJ1xuICAgIH0sXG4gICAgZGVwZW5kZW5jaWVzOiBbVE9QX0NPTVBPU0lUSU9OX0VORCwgVE9QX0tFWV9QUkVTUywgVE9QX1RFWFRfSU5QVVQsIFRPUF9QQVNURV1cbiAgfSxcbiAgY29tcG9zaXRpb25FbmQ6IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogJ29uQ29tcG9zaXRpb25FbmQnLFxuICAgICAgY2FwdHVyZWQ6ICdvbkNvbXBvc2l0aW9uRW5kQ2FwdHVyZSdcbiAgICB9LFxuICAgIGRlcGVuZGVuY2llczogW1RPUF9CTFVSLCBUT1BfQ09NUE9TSVRJT05fRU5ELCBUT1BfS0VZX0RPV04sIFRPUF9LRVlfUFJFU1MsIFRPUF9LRVlfVVAsIFRPUF9NT1VTRV9ET1dOXVxuICB9LFxuICBjb21wb3NpdGlvblN0YXJ0OiB7XG4gICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHtcbiAgICAgIGJ1YmJsZWQ6ICdvbkNvbXBvc2l0aW9uU3RhcnQnLFxuICAgICAgY2FwdHVyZWQ6ICdvbkNvbXBvc2l0aW9uU3RhcnRDYXB0dXJlJ1xuICAgIH0sXG4gICAgZGVwZW5kZW5jaWVzOiBbVE9QX0JMVVIsIFRPUF9DT01QT1NJVElPTl9TVEFSVCwgVE9QX0tFWV9ET1dOLCBUT1BfS0VZX1BSRVNTLCBUT1BfS0VZX1VQLCBUT1BfTU9VU0VfRE9XTl1cbiAgfSxcbiAgY29tcG9zaXRpb25VcGRhdGU6IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogJ29uQ29tcG9zaXRpb25VcGRhdGUnLFxuICAgICAgY2FwdHVyZWQ6ICdvbkNvbXBvc2l0aW9uVXBkYXRlQ2FwdHVyZSdcbiAgICB9LFxuICAgIGRlcGVuZGVuY2llczogW1RPUF9CTFVSLCBUT1BfQ09NUE9TSVRJT05fVVBEQVRFLCBUT1BfS0VZX0RPV04sIFRPUF9LRVlfUFJFU1MsIFRPUF9LRVlfVVAsIFRPUF9NT1VTRV9ET1dOXVxuICB9XG59O1xuXG4vLyBUcmFjayB3aGV0aGVyIHdlJ3ZlIGV2ZXIgaGFuZGxlZCBhIGtleXByZXNzIG9uIHRoZSBzcGFjZSBrZXkuXG52YXIgaGFzU3BhY2VLZXlwcmVzcyA9IGZhbHNlO1xuXG4vKipcbiAqIFJldHVybiB3aGV0aGVyIGEgbmF0aXZlIGtleXByZXNzIGV2ZW50IGlzIGFzc3VtZWQgdG8gYmUgYSBjb21tYW5kLlxuICogVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIEZpcmVmb3ggZmlyZXMgYGtleXByZXNzYCBldmVudHMgZm9yIGtleSBjb21tYW5kc1xuICogKGN1dCwgY29weSwgc2VsZWN0LWFsbCwgZXRjLikgZXZlbiB0aG91Z2ggbm8gY2hhcmFjdGVyIGlzIGluc2VydGVkLlxuICovXG5mdW5jdGlvbiBpc0tleXByZXNzQ29tbWFuZChuYXRpdmVFdmVudCkge1xuICByZXR1cm4gKG5hdGl2ZUV2ZW50LmN0cmxLZXkgfHwgbmF0aXZlRXZlbnQuYWx0S2V5IHx8IG5hdGl2ZUV2ZW50Lm1ldGFLZXkpICYmXG4gIC8vIGN0cmxLZXkgJiYgYWx0S2V5IGlzIGVxdWl2YWxlbnQgdG8gQWx0R3IsIGFuZCBpcyBub3QgYSBjb21tYW5kLlxuICAhKG5hdGl2ZUV2ZW50LmN0cmxLZXkgJiYgbmF0aXZlRXZlbnQuYWx0S2V5KTtcbn1cblxuLyoqXG4gKiBUcmFuc2xhdGUgbmF0aXZlIHRvcCBsZXZlbCBldmVudHMgaW50byBldmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdG9wTGV2ZWxUeXBlXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGdldENvbXBvc2l0aW9uRXZlbnRUeXBlKHRvcExldmVsVHlwZSkge1xuICBzd2l0Y2ggKHRvcExldmVsVHlwZSkge1xuICAgIGNhc2UgVE9QX0NPTVBPU0lUSU9OX1NUQVJUOlxuICAgICAgcmV0dXJuIGV2ZW50VHlwZXMuY29tcG9zaXRpb25TdGFydDtcbiAgICBjYXNlIFRPUF9DT01QT1NJVElPTl9FTkQ6XG4gICAgICByZXR1cm4gZXZlbnRUeXBlcy5jb21wb3NpdGlvbkVuZDtcbiAgICBjYXNlIFRPUF9DT01QT1NJVElPTl9VUERBVEU6XG4gICAgICByZXR1cm4gZXZlbnRUeXBlcy5jb21wb3NpdGlvblVwZGF0ZTtcbiAgfVxufVxuXG4vKipcbiAqIERvZXMgb3VyIGZhbGxiYWNrIGJlc3QtZ3Vlc3MgbW9kZWwgdGhpbmsgdGhpcyBldmVudCBzaWduaWZpZXMgdGhhdFxuICogY29tcG9zaXRpb24gaGFzIGJlZ3VuP1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b3BMZXZlbFR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNGYWxsYmFja0NvbXBvc2l0aW9uU3RhcnQodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkge1xuICByZXR1cm4gdG9wTGV2ZWxUeXBlID09PSBUT1BfS0VZX0RPV04gJiYgbmF0aXZlRXZlbnQua2V5Q29kZSA9PT0gU1RBUlRfS0VZQ09ERTtcbn1cblxuLyoqXG4gKiBEb2VzIG91ciBmYWxsYmFjayBtb2RlIHRoaW5rIHRoYXQgdGhpcyBldmVudCBpcyB0aGUgZW5kIG9mIGNvbXBvc2l0aW9uP1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b3BMZXZlbFR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoICh0b3BMZXZlbFR5cGUpIHtcbiAgICBjYXNlIFRPUF9LRVlfVVA6XG4gICAgICAvLyBDb21tYW5kIGtleXMgaW5zZXJ0IG9yIGNsZWFyIElNRSBpbnB1dC5cbiAgICAgIHJldHVybiBFTkRfS0VZQ09ERVMuaW5kZXhPZihuYXRpdmVFdmVudC5rZXlDb2RlKSAhPT0gLTE7XG4gICAgY2FzZSBUT1BfS0VZX0RPV046XG4gICAgICAvLyBFeHBlY3QgSU1FIGtleUNvZGUgb24gZWFjaCBrZXlkb3duLiBJZiB3ZSBnZXQgYW55IG90aGVyXG4gICAgICAvLyBjb2RlIHdlIG11c3QgaGF2ZSBleGl0ZWQgZWFybGllci5cbiAgICAgIHJldHVybiBuYXRpdmVFdmVudC5rZXlDb2RlICE9PSBTVEFSVF9LRVlDT0RFO1xuICAgIGNhc2UgVE9QX0tFWV9QUkVTUzpcbiAgICBjYXNlIFRPUF9NT1VTRV9ET1dOOlxuICAgIGNhc2UgVE9QX0JMVVI6XG4gICAgICAvLyBFdmVudHMgYXJlIG5vdCBwb3NzaWJsZSB3aXRob3V0IGNhbmNlbGxpbmcgSU1FLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEdvb2dsZSBJbnB1dCBUb29scyBwcm92aWRlcyBjb21wb3NpdGlvbiBkYXRhIHZpYSBhIEN1c3RvbUV2ZW50LFxuICogd2l0aCB0aGUgYGRhdGFgIHByb3BlcnR5IHBvcHVsYXRlZCBpbiB0aGUgYGRldGFpbGAgb2JqZWN0LiBJZiB0aGlzXG4gKiBpcyBhdmFpbGFibGUgb24gdGhlIGV2ZW50IG9iamVjdCwgdXNlIGl0LiBJZiBub3QsIHRoaXMgaXMgYSBwbGFpblxuICogY29tcG9zaXRpb24gZXZlbnQgYW5kIHdlIGhhdmUgbm90aGluZyBzcGVjaWFsIHRvIGV4dHJhY3QuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHs/c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBkZXRhaWwgPSBuYXRpdmVFdmVudC5kZXRhaWw7XG4gIGlmICh0eXBlb2YgZGV0YWlsID09PSAnb2JqZWN0JyAmJiAnZGF0YScgaW4gZGV0YWlsKSB7XG4gICAgcmV0dXJuIGRldGFpbC5kYXRhO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgY29tcG9zaXRpb24gZXZlbnQgd2FzIHRyaWdnZXJlZCBieSBLb3JlYW4gSU1FLlxuICogT3VyIGZhbGxiYWNrIG1vZGUgZG9lcyBub3Qgd29yayB3ZWxsIHdpdGggSUUncyBLb3JlYW4gSU1FLFxuICogc28ganVzdCB1c2UgbmF0aXZlIGNvbXBvc2l0aW9uIGV2ZW50cyB3aGVuIEtvcmVhbiBJTUUgaXMgdXNlZC5cbiAqIEFsdGhvdWdoIENvbXBvc2l0aW9uRXZlbnQubG9jYWxlIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQsXG4gKiBpdCBpcyBhdmFpbGFibGUgaW4gSUUsIHdoZXJlIG91ciBmYWxsYmFjayBtb2RlIGlzIGVuYWJsZWQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc1VzaW5nS29yZWFuSU1FKG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBuYXRpdmVFdmVudC5sb2NhbGUgPT09ICdrbyc7XG59XG5cbi8vIFRyYWNrIHRoZSBjdXJyZW50IElNRSBjb21wb3NpdGlvbiBzdGF0dXMsIGlmIGFueS5cbnZhciBpc0NvbXBvc2luZyA9IGZhbHNlO1xuXG4vKipcbiAqIEByZXR1cm4gez9vYmplY3R9IEEgU3ludGhldGljQ29tcG9zaXRpb25FdmVudC5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgdmFyIGV2ZW50VHlwZSA9IHZvaWQgMDtcbiAgdmFyIGZhbGxiYWNrRGF0YSA9IHZvaWQgMDtcblxuICBpZiAoY2FuVXNlQ29tcG9zaXRpb25FdmVudCkge1xuICAgIGV2ZW50VHlwZSA9IGdldENvbXBvc2l0aW9uRXZlbnRUeXBlKHRvcExldmVsVHlwZSk7XG4gIH0gZWxzZSBpZiAoIWlzQ29tcG9zaW5nKSB7XG4gICAgaWYgKGlzRmFsbGJhY2tDb21wb3NpdGlvblN0YXJ0KHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgICBldmVudFR5cGUgPSBldmVudFR5cGVzLmNvbXBvc2l0aW9uU3RhcnQ7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZCh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSkge1xuICAgIGV2ZW50VHlwZSA9IGV2ZW50VHlwZXMuY29tcG9zaXRpb25FbmQ7XG4gIH1cblxuICBpZiAoIWV2ZW50VHlwZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKHVzZUZhbGxiYWNrQ29tcG9zaXRpb25EYXRhICYmICFpc1VzaW5nS29yZWFuSU1FKG5hdGl2ZUV2ZW50KSkge1xuICAgIC8vIFRoZSBjdXJyZW50IGNvbXBvc2l0aW9uIGlzIHN0b3JlZCBzdGF0aWNhbGx5IGFuZCBtdXN0IG5vdCBiZVxuICAgIC8vIG92ZXJ3cml0dGVuIHdoaWxlIGNvbXBvc2l0aW9uIGNvbnRpbnVlcy5cbiAgICBpZiAoIWlzQ29tcG9zaW5nICYmIGV2ZW50VHlwZSA9PT0gZXZlbnRUeXBlcy5jb21wb3NpdGlvblN0YXJ0KSB7XG4gICAgICBpc0NvbXBvc2luZyA9IGluaXRpYWxpemUobmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBldmVudFR5cGVzLmNvbXBvc2l0aW9uRW5kKSB7XG4gICAgICBpZiAoaXNDb21wb3NpbmcpIHtcbiAgICAgICAgZmFsbGJhY2tEYXRhID0gZ2V0RGF0YSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBldmVudCA9IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQuZ2V0UG9vbGVkKGV2ZW50VHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBpZiAoZmFsbGJhY2tEYXRhKSB7XG4gICAgLy8gSW5qZWN0IGRhdGEgZ2VuZXJhdGVkIGZyb20gZmFsbGJhY2sgcGF0aCBpbnRvIHRoZSBzeW50aGV0aWMgZXZlbnQuXG4gICAgLy8gVGhpcyBtYXRjaGVzIHRoZSBwcm9wZXJ0eSBvZiBuYXRpdmUgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZS5cbiAgICBldmVudC5kYXRhID0gZmFsbGJhY2tEYXRhO1xuICB9IGVsc2Uge1xuICAgIHZhciBjdXN0b21EYXRhID0gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCk7XG4gICAgaWYgKGN1c3RvbURhdGEgIT09IG51bGwpIHtcbiAgICAgIGV2ZW50LmRhdGEgPSBjdXN0b21EYXRhO1xuICAgIH1cbiAgfVxuXG4gIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoZXZlbnQpO1xuICByZXR1cm4gZXZlbnQ7XG59XG5cbi8qKlxuICogQHBhcmFtIHtUb3BMZXZlbFR5cGV9IHRvcExldmVsVHlwZSBOdW1iZXIgZnJvbSBgVG9wTGV2ZWxUeXBlYC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGlzIGBiZWZvcmVJbnB1dGAgZXZlbnQuXG4gKi9cbmZ1bmN0aW9uIGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnModG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKHRvcExldmVsVHlwZSkge1xuICAgIGNhc2UgVE9QX0NPTVBPU0lUSU9OX0VORDpcbiAgICAgIHJldHVybiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KTtcbiAgICBjYXNlIFRPUF9LRVlfUFJFU1M6XG4gICAgICAvKipcbiAgICAgICAqIElmIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudHMgYXJlIGF2YWlsYWJsZSwgb3VyIGdvYWwgaXMgdG8gbWFrZVxuICAgICAgICogdXNlIG9mIHRoZW0uIEhvd2V2ZXIsIHRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlOiB0aGUgc3BhY2ViYXIga2V5LlxuICAgICAgICogSW4gV2Via2l0LCBwcmV2ZW50aW5nIGRlZmF1bHQgb24gYSBzcGFjZWJhciBgdGV4dElucHV0YCBldmVudFxuICAgICAgICogY2FuY2VscyBjaGFyYWN0ZXIgaW5zZXJ0aW9uLCBidXQgaXQgKmFsc28qIGNhdXNlcyB0aGUgYnJvd3NlclxuICAgICAgICogdG8gZmFsbCBiYWNrIHRvIGl0cyBkZWZhdWx0IHNwYWNlYmFyIGJlaGF2aW9yIG9mIHNjcm9sbGluZyB0aGVcbiAgICAgICAqIHBhZ2UuXG4gICAgICAgKlxuICAgICAgICogVHJhY2tpbmcgYXQ6XG4gICAgICAgKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzU1MTAzXG4gICAgICAgKlxuICAgICAgICogVG8gYXZvaWQgdGhpcyBpc3N1ZSwgdXNlIHRoZSBrZXlwcmVzcyBldmVudCBhcyBpZiBubyBgdGV4dElucHV0YFxuICAgICAgICogZXZlbnQgaXMgYXZhaWxhYmxlLlxuICAgICAgICovXG4gICAgICB2YXIgd2hpY2ggPSBuYXRpdmVFdmVudC53aGljaDtcbiAgICAgIGlmICh3aGljaCAhPT0gU1BBQ0VCQVJfQ09ERSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaGFzU3BhY2VLZXlwcmVzcyA9IHRydWU7XG4gICAgICByZXR1cm4gU1BBQ0VCQVJfQ0hBUjtcblxuICAgIGNhc2UgVE9QX1RFWFRfSU5QVVQ6XG4gICAgICAvLyBSZWNvcmQgdGhlIGNoYXJhY3RlcnMgdG8gYmUgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgIHZhciBjaGFycyA9IG5hdGl2ZUV2ZW50LmRhdGE7XG5cbiAgICAgIC8vIElmIGl0J3MgYSBzcGFjZWJhciBjaGFyYWN0ZXIsIGFzc3VtZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkXG4gICAgICAvLyBpdCBhdCB0aGUga2V5cHJlc3MgbGV2ZWwgYW5kIGJhaWwgaW1tZWRpYXRlbHkuIEFuZHJvaWQgQ2hyb21lXG4gICAgICAvLyBkb2Vzbid0IGdpdmUgdXMga2V5Y29kZXMsIHNvIHdlIG5lZWQgdG8gaWdub3JlIGl0LlxuICAgICAgaWYgKGNoYXJzID09PSBTUEFDRUJBUl9DSEFSICYmIGhhc1NwYWNlS2V5cHJlc3MpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjaGFycztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBGb3Igb3RoZXIgbmF0aXZlIGV2ZW50IHR5cGVzLCBkbyBub3RoaW5nLlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3IgYnJvd3NlcnMgdGhhdCBkbyBub3QgcHJvdmlkZSB0aGUgYHRleHRJbnB1dGAgZXZlbnQsIGV4dHJhY3QgdGhlXG4gKiBhcHByb3ByaWF0ZSBzdHJpbmcgdG8gdXNlIGZvciBTeW50aGV0aWNJbnB1dEV2ZW50LlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB0b3BMZXZlbFR5cGUgTnVtYmVyIGZyb20gYFRvcExldmVsRXZlbnRUeXBlc2AuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgZmFsbGJhY2sgc3RyaW5nIGZvciB0aGlzIGBiZWZvcmVJbnB1dGAgZXZlbnQuXG4gKi9cbmZ1bmN0aW9uIGdldEZhbGxiYWNrQmVmb3JlSW5wdXRDaGFycyh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSB7XG4gIC8vIElmIHdlIGFyZSBjdXJyZW50bHkgY29tcG9zaW5nIChJTUUpIGFuZCB1c2luZyBhIGZhbGxiYWNrIHRvIGRvIHNvLFxuICAvLyB0cnkgdG8gZXh0cmFjdCB0aGUgY29tcG9zZWQgY2hhcmFjdGVycyBmcm9tIHRoZSBmYWxsYmFjayBvYmplY3QuXG4gIC8vIElmIGNvbXBvc2l0aW9uIGV2ZW50IGlzIGF2YWlsYWJsZSwgd2UgZXh0cmFjdCBhIHN0cmluZyBvbmx5IGF0XG4gIC8vIGNvbXBvc2l0aW9uZXZlbnQsIG90aGVyd2lzZSBleHRyYWN0IGl0IGF0IGZhbGxiYWNrIGV2ZW50cy5cbiAgaWYgKGlzQ29tcG9zaW5nKSB7XG4gICAgaWYgKHRvcExldmVsVHlwZSA9PT0gVE9QX0NPTVBPU0lUSU9OX0VORCB8fCAhY2FuVXNlQ29tcG9zaXRpb25FdmVudCAmJiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkpIHtcbiAgICAgIHZhciBjaGFycyA9IGdldERhdGEoKTtcbiAgICAgIHJlc2V0KCk7XG4gICAgICBpc0NvbXBvc2luZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGNoYXJzO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7XG4gICAgY2FzZSBUT1BfUEFTVEU6XG4gICAgICAvLyBJZiBhIHBhc3RlIGV2ZW50IG9jY3VycyBhZnRlciBhIGtleXByZXNzLCB0aHJvdyBvdXQgdGhlIGlucHV0XG4gICAgICAvLyBjaGFycy4gUGFzdGUgZXZlbnRzIHNob3VsZCBub3QgbGVhZCB0byBCZWZvcmVJbnB1dCBldmVudHMuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjYXNlIFRPUF9LRVlfUFJFU1M6XG4gICAgICAvKipcbiAgICAgICAqIEFzIG9mIHYyNywgRmlyZWZveCBtYXkgZmlyZSBrZXlwcmVzcyBldmVudHMgZXZlbiB3aGVuIG5vIGNoYXJhY3RlclxuICAgICAgICogd2lsbCBiZSBpbnNlcnRlZC4gQSBmZXcgcG9zc2liaWxpdGllczpcbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgYDBgLiBBcnJvdyBrZXlzLCBFc2Mga2V5LCBldGMuXG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIHRoZSBwcmVzc2VkIGtleSBjb2RlLCBidXQgbm8gY2hhciBpcyBhdmFpbGFibGUuXG4gICAgICAgKiAgIEV4OiAnQWx0R3IgKyBkYCBpbiBQb2xpc2guIFRoZXJlIGlzIG5vIG1vZGlmaWVkIGNoYXJhY3RlciBmb3JcbiAgICAgICAqICAgdGhpcyBrZXkgY29tYmluYXRpb24gYW5kIG5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZCBpbnRvIHRoZVxuICAgICAgICogICBkb2N1bWVudCwgYnV0IEZGIGZpcmVzIHRoZSBrZXlwcmVzcyBmb3IgY2hhciBjb2RlIGAxMDBgIGFueXdheS5cbiAgICAgICAqICAgTm8gYGlucHV0YCBldmVudCB3aWxsIG9jY3VyLlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyB0aGUgcHJlc3NlZCBrZXkgY29kZSwgYnV0IGEgY29tbWFuZCBjb21iaW5hdGlvbiBpc1xuICAgICAgICogICBiZWluZyB1c2VkLiBFeDogYENtZCtDYC4gTm8gY2hhcmFjdGVyIGlzIGluc2VydGVkLCBhbmQgbm9cbiAgICAgICAqICAgYGlucHV0YCBldmVudCB3aWxsIG9jY3VyLlxuICAgICAgICovXG4gICAgICBpZiAoIWlzS2V5cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KSkge1xuICAgICAgICAvLyBJRSBmaXJlcyB0aGUgYGtleXByZXNzYCBldmVudCB3aGVuIGEgdXNlciB0eXBlcyBhbiBlbW9qaSB2aWFcbiAgICAgICAgLy8gVG91Y2gga2V5Ym9hcmQgb2YgV2luZG93cy4gIEluIHN1Y2ggYSBjYXNlLCB0aGUgYGNoYXJgIHByb3BlcnR5XG4gICAgICAgIC8vIGhvbGRzIGFuIGVtb2ppIGNoYXJhY3RlciBsaWtlIGBcXHVEODNEXFx1REUwQWAuICBCZWNhdXNlIGl0cyBsZW5ndGhcbiAgICAgICAgLy8gaXMgMiwgdGhlIHByb3BlcnR5IGB3aGljaGAgZG9lcyBub3QgcmVwcmVzZW50IGFuIGVtb2ppIGNvcnJlY3RseS5cbiAgICAgICAgLy8gSW4gc3VjaCBhIGNhc2UsIHdlIGRpcmVjdGx5IHJldHVybiB0aGUgYGNoYXJgIHByb3BlcnR5IGluc3RlYWQgb2ZcbiAgICAgICAgLy8gdXNpbmcgYHdoaWNoYC5cbiAgICAgICAgaWYgKG5hdGl2ZUV2ZW50LmNoYXIgJiYgbmF0aXZlRXZlbnQuY2hhci5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAobmF0aXZlRXZlbnQud2hpY2gpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShuYXRpdmVFdmVudC53aGljaCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNhc2UgVE9QX0NPTVBPU0lUSU9OX0VORDpcbiAgICAgIHJldHVybiB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSAmJiAhaXNVc2luZ0tvcmVhbklNRShuYXRpdmVFdmVudCkgPyBudWxsIDogbmF0aXZlRXZlbnQuZGF0YTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0IGEgU3ludGhldGljSW5wdXRFdmVudCBmb3IgYGJlZm9yZUlucHV0YCwgYmFzZWQgb24gZWl0aGVyIG5hdGl2ZVxuICogYHRleHRJbnB1dGAgb3IgZmFsbGJhY2sgYmVoYXZpb3IuXG4gKlxuICogQHJldHVybiB7P29iamVjdH0gQSBTeW50aGV0aWNJbnB1dEV2ZW50LlxuICovXG5mdW5jdGlvbiBleHRyYWN0QmVmb3JlSW5wdXRFdmVudCh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICB2YXIgY2hhcnMgPSB2b2lkIDA7XG5cbiAgaWYgKGNhblVzZVRleHRJbnB1dEV2ZW50KSB7XG4gICAgY2hhcnMgPSBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpO1xuICB9IGVsc2Uge1xuICAgIGNoYXJzID0gZ2V0RmFsbGJhY2tCZWZvcmVJbnB1dENoYXJzKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpO1xuICB9XG5cbiAgLy8gSWYgbm8gY2hhcmFjdGVycyBhcmUgYmVpbmcgaW5zZXJ0ZWQsIG5vIEJlZm9yZUlucHV0IGV2ZW50IHNob3VsZFxuICAvLyBiZSBmaXJlZC5cbiAgaWYgKCFjaGFycykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGV2ZW50ID0gU3ludGhldGljSW5wdXRFdmVudC5nZXRQb29sZWQoZXZlbnRUeXBlcy5iZWZvcmVJbnB1dCwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBldmVudC5kYXRhID0gY2hhcnM7XG4gIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoZXZlbnQpO1xuICByZXR1cm4gZXZlbnQ7XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIGBvbkJlZm9yZUlucHV0YCBldmVudCB0byBtYXRjaFxuICogaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAxMzExMDUvI2V2ZW50cy1pbnB1dGV2ZW50cy5cbiAqXG4gKiBUaGlzIGV2ZW50IHBsdWdpbiBpcyBiYXNlZCBvbiB0aGUgbmF0aXZlIGB0ZXh0SW5wdXRgIGV2ZW50XG4gKiBhdmFpbGFibGUgaW4gQ2hyb21lLCBTYWZhcmksIE9wZXJhLCBhbmQgSUUuIFRoaXMgZXZlbnQgZmlyZXMgYWZ0ZXJcbiAqIGBvbktleVByZXNzYCBhbmQgYG9uQ29tcG9zaXRpb25FbmRgLCBidXQgYmVmb3JlIGBvbklucHV0YC5cbiAqXG4gKiBgYmVmb3JlSW5wdXRgIGlzIHNwZWMnZCBidXQgbm90IGltcGxlbWVudGVkIGluIGFueSBicm93c2VycywgYW5kXG4gKiB0aGUgYGlucHV0YCBldmVudCBkb2VzIG5vdCBwcm92aWRlIGFueSB1c2VmdWwgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBoYXNcbiAqIGFjdHVhbGx5IGJlZW4gYWRkZWQsIGNvbnRyYXJ5IHRvIHRoZSBzcGVjLiBUaHVzLCBgdGV4dElucHV0YCBpcyB0aGUgYmVzdFxuICogYXZhaWxhYmxlIGV2ZW50IHRvIGlkZW50aWZ5IHRoZSBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBhY3R1YWxseSBiZWVuIGluc2VydGVkXG4gKiBpbnRvIHRoZSB0YXJnZXQgbm9kZS5cbiAqXG4gKiBUaGlzIHBsdWdpbiBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBgY29tcG9zaXRpb25gIGV2ZW50cywgdGh1c1xuICogYWxsb3dpbmcgdXMgdG8gc2hhcmUgY29tcG9zaXRpb24gZmFsbGJhY2sgY29kZSBmb3IgYm90aCBgYmVmb3JlSW5wdXRgIGFuZFxuICogYGNvbXBvc2l0aW9uYCBldmVudCB0eXBlcy5cbiAqL1xudmFyIEJlZm9yZUlucHV0RXZlbnRQbHVnaW4gPSB7XG4gIGV2ZW50VHlwZXM6IGV2ZW50VHlwZXMsXG5cbiAgZXh0cmFjdEV2ZW50czogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgdmFyIGNvbXBvc2l0aW9uID0gZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gICAgdmFyIGJlZm9yZUlucHV0ID0gZXh0cmFjdEJlZm9yZUlucHV0RXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gICAgaWYgKGNvbXBvc2l0aW9uID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gYmVmb3JlSW5wdXQ7XG4gICAgfVxuXG4gICAgaWYgKGJlZm9yZUlucHV0ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gY29tcG9zaXRpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIFtjb21wb3NpdGlvbiwgYmVmb3JlSW5wdXRdO1xuICB9XG59O1xuXG4vLyBVc2UgdG8gcmVzdG9yZSBjb250cm9sbGVkIHN0YXRlIGFmdGVyIGEgY2hhbmdlIGV2ZW50IGhhcyBmaXJlZC5cblxudmFyIHJlc3RvcmVJbXBsID0gbnVsbDtcbnZhciByZXN0b3JlVGFyZ2V0ID0gbnVsbDtcbnZhciByZXN0b3JlUXVldWUgPSBudWxsO1xuXG5mdW5jdGlvbiByZXN0b3JlU3RhdGVPZlRhcmdldCh0YXJnZXQpIHtcbiAgLy8gV2UgcGVyZm9ybSB0aGlzIHRyYW5zbGF0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGV2ZW50IGxvb3Agc28gdGhhdCB3ZVxuICAvLyBhbHdheXMgcmVjZWl2ZSB0aGUgY29ycmVjdCBmaWJlciBoZXJlXG4gIHZhciBpbnRlcm5hbEluc3RhbmNlID0gZ2V0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXQpO1xuICBpZiAoIWludGVybmFsSW5zdGFuY2UpIHtcbiAgICAvLyBVbm1vdW50ZWRcbiAgICByZXR1cm47XG4gIH1cbiAgISh0eXBlb2YgcmVzdG9yZUltcGwgPT09ICdmdW5jdGlvbicpID8gaW52YXJpYW50KGZhbHNlLCAnc2V0UmVzdG9yZUltcGxlbWVudGF0aW9uKCkgbmVlZHMgdG8gYmUgY2FsbGVkIHRvIGhhbmRsZSBhIHRhcmdldCBmb3IgY29udHJvbGxlZCBldmVudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJykgOiB2b2lkIDA7XG4gIHZhciBwcm9wcyA9IGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUoaW50ZXJuYWxJbnN0YW5jZS5zdGF0ZU5vZGUpO1xuICByZXN0b3JlSW1wbChpbnRlcm5hbEluc3RhbmNlLnN0YXRlTm9kZSwgaW50ZXJuYWxJbnN0YW5jZS50eXBlLCBwcm9wcyk7XG59XG5cbmZ1bmN0aW9uIHNldFJlc3RvcmVJbXBsZW1lbnRhdGlvbihpbXBsKSB7XG4gIHJlc3RvcmVJbXBsID0gaW1wbDtcbn1cblxuZnVuY3Rpb24gZW5xdWV1ZVN0YXRlUmVzdG9yZSh0YXJnZXQpIHtcbiAgaWYgKHJlc3RvcmVUYXJnZXQpIHtcbiAgICBpZiAocmVzdG9yZVF1ZXVlKSB7XG4gICAgICByZXN0b3JlUXVldWUucHVzaCh0YXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN0b3JlUXVldWUgPSBbdGFyZ2V0XTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmVzdG9yZVRhcmdldCA9IHRhcmdldDtcbiAgfVxufVxuXG5mdW5jdGlvbiBuZWVkc1N0YXRlUmVzdG9yZSgpIHtcbiAgcmV0dXJuIHJlc3RvcmVUYXJnZXQgIT09IG51bGwgfHwgcmVzdG9yZVF1ZXVlICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiByZXN0b3JlU3RhdGVJZk5lZWRlZCgpIHtcbiAgaWYgKCFyZXN0b3JlVGFyZ2V0KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciB0YXJnZXQgPSByZXN0b3JlVGFyZ2V0O1xuICB2YXIgcXVldWVkVGFyZ2V0cyA9IHJlc3RvcmVRdWV1ZTtcbiAgcmVzdG9yZVRhcmdldCA9IG51bGw7XG4gIHJlc3RvcmVRdWV1ZSA9IG51bGw7XG5cbiAgcmVzdG9yZVN0YXRlT2ZUYXJnZXQodGFyZ2V0KTtcbiAgaWYgKHF1ZXVlZFRhcmdldHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlZFRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHF1ZXVlZFRhcmdldHNbaV0pO1xuICAgIH1cbiAgfVxufVxuXG4vLyBVc2VkIGFzIGEgd2F5IHRvIGNhbGwgYmF0Y2hlZFVwZGF0ZXMgd2hlbiB3ZSBkb24ndCBoYXZlIGEgcmVmZXJlbmNlIHRvXG4vLyB0aGUgcmVuZGVyZXIuIFN1Y2ggYXMgd2hlbiB3ZSdyZSBkaXNwYXRjaGluZyBldmVudHMgb3IgaWYgdGhpcmQgcGFydHlcbi8vIGxpYnJhcmllcyBuZWVkIHRvIGNhbGwgYmF0Y2hlZFVwZGF0ZXMuIEV2ZW50dWFsbHksIHRoaXMgQVBJIHdpbGwgZ28gYXdheSB3aGVuXG4vLyBldmVyeXRoaW5nIGlzIGJhdGNoZWQgYnkgZGVmYXVsdC4gV2UnbGwgdGhlbiBoYXZlIGEgc2ltaWxhciBBUEkgdG8gb3B0LW91dCBvZlxuLy8gc2NoZWR1bGVkIHdvcmsgYW5kIGluc3RlYWQgZG8gc3luY2hyb25vdXMgd29yay5cblxuLy8gRGVmYXVsdHNcbnZhciBfYmF0Y2hlZFVwZGF0ZXNJbXBsID0gZnVuY3Rpb24gKGZuLCBib29ra2VlcGluZykge1xuICByZXR1cm4gZm4oYm9va2tlZXBpbmcpO1xufTtcbnZhciBfaW50ZXJhY3RpdmVVcGRhdGVzSW1wbCA9IGZ1bmN0aW9uIChmbiwgYSwgYikge1xuICByZXR1cm4gZm4oYSwgYik7XG59O1xudmFyIF9mbHVzaEludGVyYWN0aXZlVXBkYXRlc0ltcGwgPSBmdW5jdGlvbiAoKSB7fTtcblxudmFyIGlzQmF0Y2hpbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzKGZuLCBib29ra2VlcGluZykge1xuICBpZiAoaXNCYXRjaGluZykge1xuICAgIC8vIElmIHdlIGFyZSBjdXJyZW50bHkgaW5zaWRlIGFub3RoZXIgYmF0Y2gsIHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdFxuICAgIC8vIGZ1bGx5IGNvbXBsZXRlcyBiZWZvcmUgcmVzdG9yaW5nIHN0YXRlLlxuICAgIHJldHVybiBmbihib29ra2VlcGluZyk7XG4gIH1cbiAgaXNCYXRjaGluZyA9IHRydWU7XG4gIHRyeSB7XG4gICAgcmV0dXJuIF9iYXRjaGVkVXBkYXRlc0ltcGwoZm4sIGJvb2trZWVwaW5nKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBIZXJlIHdlIHdhaXQgdW50aWwgYWxsIHVwZGF0ZXMgaGF2ZSBwcm9wYWdhdGVkLCB3aGljaCBpcyBpbXBvcnRhbnRcbiAgICAvLyB3aGVuIHVzaW5nIGNvbnRyb2xsZWQgY29tcG9uZW50cyB3aXRoaW4gbGF5ZXJzOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY5OFxuICAgIC8vIFRoZW4gd2UgcmVzdG9yZSBzdGF0ZSBvZiBhbnkgY29udHJvbGxlZCBjb21wb25lbnQuXG4gICAgaXNCYXRjaGluZyA9IGZhbHNlO1xuICAgIHZhciBjb250cm9sbGVkQ29tcG9uZW50c0hhdmVQZW5kaW5nVXBkYXRlcyA9IG5lZWRzU3RhdGVSZXN0b3JlKCk7XG4gICAgaWYgKGNvbnRyb2xsZWRDb21wb25lbnRzSGF2ZVBlbmRpbmdVcGRhdGVzKSB7XG4gICAgICAvLyBJZiBhIGNvbnRyb2xsZWQgZXZlbnQgd2FzIGZpcmVkLCB3ZSBtYXkgbmVlZCB0byByZXN0b3JlIHRoZSBzdGF0ZSBvZlxuICAgICAgLy8gdGhlIERPTSBub2RlIGJhY2sgdG8gdGhlIGNvbnRyb2xsZWQgdmFsdWUuIFRoaXMgaXMgbmVjZXNzYXJ5IHdoZW4gUmVhY3RcbiAgICAgIC8vIGJhaWxzIG91dCBvZiB0aGUgdXBkYXRlIHdpdGhvdXQgdG91Y2hpbmcgdGhlIERPTS5cbiAgICAgIF9mbHVzaEludGVyYWN0aXZlVXBkYXRlc0ltcGwoKTtcbiAgICAgIHJlc3RvcmVTdGF0ZUlmTmVlZGVkKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGludGVyYWN0aXZlVXBkYXRlcyhmbiwgYSwgYikge1xuICByZXR1cm4gX2ludGVyYWN0aXZlVXBkYXRlc0ltcGwoZm4sIGEsIGIpO1xufVxuXG5cblxuZnVuY3Rpb24gc2V0QmF0Y2hpbmdJbXBsZW1lbnRhdGlvbihiYXRjaGVkVXBkYXRlc0ltcGwsIGludGVyYWN0aXZlVXBkYXRlc0ltcGwsIGZsdXNoSW50ZXJhY3RpdmVVcGRhdGVzSW1wbCkge1xuICBfYmF0Y2hlZFVwZGF0ZXNJbXBsID0gYmF0Y2hlZFVwZGF0ZXNJbXBsO1xuICBfaW50ZXJhY3RpdmVVcGRhdGVzSW1wbCA9IGludGVyYWN0aXZlVXBkYXRlc0ltcGw7XG4gIF9mbHVzaEludGVyYWN0aXZlVXBkYXRlc0ltcGwgPSBmbHVzaEludGVyYWN0aXZlVXBkYXRlc0ltcGw7XG59XG5cbi8qKlxuICogQHNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS90aGUtaW5wdXQtZWxlbWVudC5odG1sI2lucHV0LXR5cGUtYXR0ci1zdW1tYXJ5XG4gKi9cbnZhciBzdXBwb3J0ZWRJbnB1dFR5cGVzID0ge1xuICBjb2xvcjogdHJ1ZSxcbiAgZGF0ZTogdHJ1ZSxcbiAgZGF0ZXRpbWU6IHRydWUsXG4gICdkYXRldGltZS1sb2NhbCc6IHRydWUsXG4gIGVtYWlsOiB0cnVlLFxuICBtb250aDogdHJ1ZSxcbiAgbnVtYmVyOiB0cnVlLFxuICBwYXNzd29yZDogdHJ1ZSxcbiAgcmFuZ2U6IHRydWUsXG4gIHNlYXJjaDogdHJ1ZSxcbiAgdGVsOiB0cnVlLFxuICB0ZXh0OiB0cnVlLFxuICB0aW1lOiB0cnVlLFxuICB1cmw6IHRydWUsXG4gIHdlZWs6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGlzVGV4dElucHV0RWxlbWVudChlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKG5vZGVOYW1lID09PSAnaW5wdXQnKSB7XG4gICAgcmV0dXJuICEhc3VwcG9ydGVkSW5wdXRUeXBlc1tlbGVtLnR5cGVdO1xuICB9XG5cbiAgaWYgKG5vZGVOYW1lID09PSAndGV4dGFyZWEnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogSFRNTCBub2RlVHlwZSB2YWx1ZXMgdGhhdCByZXByZXNlbnQgdGhlIHR5cGUgb2YgdGhlIG5vZGVcbiAqL1xuXG52YXIgRUxFTUVOVF9OT0RFID0gMTtcbnZhciBURVhUX05PREUgPSAzO1xudmFyIENPTU1FTlRfTk9ERSA9IDg7XG52YXIgRE9DVU1FTlRfTk9ERSA9IDk7XG52YXIgRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA9IDExO1xuXG4vKipcbiAqIEdldHMgdGhlIHRhcmdldCBub2RlIGZyb20gYSBuYXRpdmUgYnJvd3NlciBldmVudCBieSBhY2NvdW50aW5nIGZvclxuICogaW5jb25zaXN0ZW5jaWVzIGluIGJyb3dzZXIgRE9NIEFQSXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7RE9NRXZlbnRUYXJnZXR9IFRhcmdldCBub2RlLlxuICovXG5mdW5jdGlvbiBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCkge1xuICAvLyBGYWxsYmFjayB0byBuYXRpdmVFdmVudC5zcmNFbGVtZW50IGZvciBJRTlcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjUwNlxuICB2YXIgdGFyZ2V0ID0gbmF0aXZlRXZlbnQudGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LnNyY0VsZW1lbnQgfHwgd2luZG93O1xuXG4gIC8vIE5vcm1hbGl6ZSBTVkcgPHVzZT4gZWxlbWVudCBldmVudHMgIzQ5NjNcbiAgaWYgKHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCkge1xuICAgIHRhcmdldCA9IHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudDtcbiAgfVxuXG4gIC8vIFNhZmFyaSBtYXkgZmlyZSBldmVudHMgb24gdGV4dCBub2RlcyAoTm9kZS5URVhUX05PREUgaXMgMykuXG4gIC8vIEBzZWUgaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9qcy9ldmVudHNfcHJvcGVydGllcy5odG1sXG4gIHJldHVybiB0YXJnZXQubm9kZVR5cGUgPT09IFRFWFRfTk9ERSA/IHRhcmdldC5wYXJlbnROb2RlIDogdGFyZ2V0O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBldmVudCBpcyBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuICpcbiAqIE5PVEU6IFRoaXMgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkgZm9yIG5vbi1nZW5lcmljIGV2ZW50cyBzdWNoIGFzIGBjaGFuZ2VgLFxuICogYHJlc2V0YCwgYGxvYWRgLCBgZXJyb3JgLCBhbmQgYHNlbGVjdGAuXG4gKlxuICogQm9ycm93cyBmcm9tIE1vZGVybml6ci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lU3VmZml4IEV2ZW50IG5hbWUsIGUuZy4gXCJjbGlja1wiLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZXZlbnQgaXMgc3VwcG9ydGVkLlxuICogQGludGVybmFsXG4gKiBAbGljZW5zZSBNb2Rlcm5penIgMy4wLjBwcmUgKEN1c3RvbSBCdWlsZCkgfCBNSVRcbiAqL1xuZnVuY3Rpb24gaXNFdmVudFN1cHBvcnRlZChldmVudE5hbWVTdWZmaXgpIHtcbiAgaWYgKCFjYW5Vc2VET00pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgZXZlbnROYW1lID0gJ29uJyArIGV2ZW50TmFtZVN1ZmZpeDtcbiAgdmFyIGlzU3VwcG9ydGVkID0gZXZlbnROYW1lIGluIGRvY3VtZW50O1xuXG4gIGlmICghaXNTdXBwb3J0ZWQpIHtcbiAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGV2ZW50TmFtZSwgJ3JldHVybjsnKTtcbiAgICBpc1N1cHBvcnRlZCA9IHR5cGVvZiBlbGVtZW50W2V2ZW50TmFtZV0gPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICByZXR1cm4gaXNTdXBwb3J0ZWQ7XG59XG5cbmZ1bmN0aW9uIGlzQ2hlY2thYmxlKGVsZW0pIHtcbiAgdmFyIHR5cGUgPSBlbGVtLnR5cGU7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWU7XG4gIHJldHVybiBub2RlTmFtZSAmJiBub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmICh0eXBlID09PSAnY2hlY2tib3gnIHx8IHR5cGUgPT09ICdyYWRpbycpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFja2VyKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuX3ZhbHVlVHJhY2tlcjtcbn1cblxuZnVuY3Rpb24gZGV0YWNoVHJhY2tlcihub2RlKSB7XG4gIG5vZGUuX3ZhbHVlVHJhY2tlciA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlRnJvbU5vZGUobm9kZSkge1xuICB2YXIgdmFsdWUgPSAnJztcbiAgaWYgKCFub2RlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgaWYgKGlzQ2hlY2thYmxlKG5vZGUpKSB7XG4gICAgdmFsdWUgPSBub2RlLmNoZWNrZWQgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gbm9kZS52YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gdHJhY2tWYWx1ZU9uTm9kZShub2RlKSB7XG4gIHZhciB2YWx1ZUZpZWxkID0gaXNDaGVja2FibGUobm9kZSkgPyAnY2hlY2tlZCcgOiAndmFsdWUnO1xuICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobm9kZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHZhbHVlRmllbGQpO1xuXG4gIHZhciBjdXJyZW50VmFsdWUgPSAnJyArIG5vZGVbdmFsdWVGaWVsZF07XG5cbiAgLy8gaWYgc29tZW9uZSBoYXMgYWxyZWFkeSBkZWZpbmVkIGEgdmFsdWUgb3IgU2FmYXJpLCB0aGVuIGJhaWxcbiAgLy8gYW5kIGRvbid0IHRyYWNrIHZhbHVlIHdpbGwgY2F1c2Ugb3ZlciByZXBvcnRpbmcgb2YgY2hhbmdlcyxcbiAgLy8gYnV0IGl0J3MgYmV0dGVyIHRoZW4gYSBoYXJkIGZhaWx1cmVcbiAgLy8gKG5lZWRlZCBmb3IgY2VydGFpbiB0ZXN0cyB0aGF0IHNweU9uIGlucHV0IHZhbHVlcyBhbmQgU2FmYXJpKVxuICBpZiAobm9kZS5oYXNPd25Qcm9wZXJ0eSh2YWx1ZUZpZWxkKSB8fCB0eXBlb2YgZGVzY3JpcHRvciA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIGRlc2NyaXB0b3IuZ2V0ICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBkZXNjcmlwdG9yLnNldCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgZ2V0ID0gZGVzY3JpcHRvci5nZXQsXG4gICAgICBzZXQgPSBkZXNjcmlwdG9yLnNldDtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobm9kZSwgdmFsdWVGaWVsZCwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXQuY2FsbCh0aGlzKTtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50VmFsdWUgPSAnJyArIHZhbHVlO1xuICAgICAgc2V0LmNhbGwodGhpcywgdmFsdWUpO1xuICAgIH1cbiAgfSk7XG4gIC8vIFdlIGNvdWxkJ3ZlIHBhc3NlZCB0aGlzIHRoZSBmaXJzdCB0aW1lXG4gIC8vIGJ1dCBpdCB0cmlnZ2VycyBhIGJ1ZyBpbiBJRTExIGFuZCBFZGdlIDE0LzE1LlxuICAvLyBDYWxsaW5nIGRlZmluZVByb3BlcnR5KCkgYWdhaW4gc2hvdWxkIGJlIGVxdWl2YWxlbnQuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTE3NjhcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGUsIHZhbHVlRmllbGQsIHtcbiAgICBlbnVtZXJhYmxlOiBkZXNjcmlwdG9yLmVudW1lcmFibGVcbiAgfSk7XG5cbiAgdmFyIHRyYWNrZXIgPSB7XG4gICAgZ2V0VmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7XG4gICAgfSxcbiAgICBzZXRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50VmFsdWUgPSAnJyArIHZhbHVlO1xuICAgIH0sXG4gICAgc3RvcFRyYWNraW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBkZXRhY2hUcmFja2VyKG5vZGUpO1xuICAgICAgZGVsZXRlIG5vZGVbdmFsdWVGaWVsZF07XG4gICAgfVxuICB9O1xuICByZXR1cm4gdHJhY2tlcjtcbn1cblxuZnVuY3Rpb24gdHJhY2sobm9kZSkge1xuICBpZiAoZ2V0VHJhY2tlcihub2RlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRPRE86IE9uY2UgaXQncyBqdXN0IEZpYmVyIHdlIGNhbiBtb3ZlIHRoaXMgdG8gbm9kZS5fd3JhcHBlclN0YXRlXG4gIG5vZGUuX3ZhbHVlVHJhY2tlciA9IHRyYWNrVmFsdWVPbk5vZGUobm9kZSk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVZhbHVlSWZDaGFuZ2VkKG5vZGUpIHtcbiAgaWYgKCFub2RlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHRyYWNrZXIgPSBnZXRUcmFja2VyKG5vZGUpO1xuICAvLyBpZiB0aGVyZSBpcyBubyB0cmFja2VyIGF0IHRoaXMgcG9pbnQgaXQncyB1bmxpa2VseVxuICAvLyB0aGF0IHRyeWluZyBhZ2FpbiB3aWxsIHN1Y2NlZWRcbiAgaWYgKCF0cmFja2VyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgbGFzdFZhbHVlID0gdHJhY2tlci5nZXRWYWx1ZSgpO1xuICB2YXIgbmV4dFZhbHVlID0gZ2V0VmFsdWVGcm9tTm9kZShub2RlKTtcbiAgaWYgKG5leHRWYWx1ZSAhPT0gbGFzdFZhbHVlKSB7XG4gICAgdHJhY2tlci5zZXRWYWx1ZShuZXh0VmFsdWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxudmFyIFJlYWN0U2hhcmVkSW50ZXJuYWxzID0gUmVhY3QuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7XG5cbi8vIFByZXZlbnQgbmV3ZXIgcmVuZGVyZXJzIGZyb20gUlRFIHdoZW4gdXNlZCB3aXRoIG9sZGVyIHJlYWN0IHBhY2thZ2UgdmVyc2lvbnMuXG4vLyBDdXJyZW50IG93bmVyIGFuZCBkaXNwYXRjaGVyIHVzZWQgdG8gc2hhcmUgdGhlIHNhbWUgcmVmLFxuLy8gYnV0IFBSICMxNDU0OCBzcGxpdCB0aGVtIG91dCB0byBiZXR0ZXIgc3VwcG9ydCB0aGUgcmVhY3QtZGVidWctdG9vbHMgcGFja2FnZS5cbmlmICghUmVhY3RTaGFyZWRJbnRlcm5hbHMuaGFzT3duUHJvcGVydHkoJ1JlYWN0Q3VycmVudERpc3BhdGNoZXInKSkge1xuICBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyID0ge1xuICAgIGN1cnJlbnQ6IG51bGxcbiAgfTtcbn1cblxudmFyIEJFRk9SRV9TTEFTSF9SRSA9IC9eKC4qKVtcXFxcXFwvXS87XG5cbnZhciBkZXNjcmliZUNvbXBvbmVudEZyYW1lID0gZnVuY3Rpb24gKG5hbWUsIHNvdXJjZSwgb3duZXJOYW1lKSB7XG4gIHZhciBzb3VyY2VJbmZvID0gJyc7XG4gIGlmIChzb3VyY2UpIHtcbiAgICB2YXIgcGF0aCA9IHNvdXJjZS5maWxlTmFtZTtcbiAgICB2YXIgZmlsZU5hbWUgPSBwYXRoLnJlcGxhY2UoQkVGT1JFX1NMQVNIX1JFLCAnJyk7XG4gICAge1xuICAgICAgLy8gSW4gREVWLCBpbmNsdWRlIGNvZGUgZm9yIGEgY29tbW9uIHNwZWNpYWwgY2FzZTpcbiAgICAgIC8vIHByZWZlciBcImZvbGRlci9pbmRleC5qc1wiIGluc3RlYWQgb2YganVzdCBcImluZGV4LmpzXCIuXG4gICAgICBpZiAoL15pbmRleFxcLi8udGVzdChmaWxlTmFtZSkpIHtcbiAgICAgICAgdmFyIG1hdGNoID0gcGF0aC5tYXRjaChCRUZPUkVfU0xBU0hfUkUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICB2YXIgcGF0aEJlZm9yZVNsYXNoID0gbWF0Y2hbMV07XG4gICAgICAgICAgaWYgKHBhdGhCZWZvcmVTbGFzaCkge1xuICAgICAgICAgICAgdmFyIGZvbGRlck5hbWUgPSBwYXRoQmVmb3JlU2xhc2gucmVwbGFjZShCRUZPUkVfU0xBU0hfUkUsICcnKTtcbiAgICAgICAgICAgIGZpbGVOYW1lID0gZm9sZGVyTmFtZSArICcvJyArIGZpbGVOYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBzb3VyY2VJbmZvID0gJyAoYXQgJyArIGZpbGVOYW1lICsgJzonICsgc291cmNlLmxpbmVOdW1iZXIgKyAnKSc7XG4gIH0gZWxzZSBpZiAob3duZXJOYW1lKSB7XG4gICAgc291cmNlSW5mbyA9ICcgKGNyZWF0ZWQgYnkgJyArIG93bmVyTmFtZSArICcpJztcbiAgfVxuICByZXR1cm4gJ1xcbiAgICBpbiAnICsgKG5hbWUgfHwgJ1Vua25vd24nKSArIHNvdXJjZUluZm87XG59O1xuXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy4gSWYgdGhlcmUgaXMgbm8gbmF0aXZlIFN5bWJvbFxuLy8gbm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlLlxudmFyIGhhc1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvcjtcblxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSA6IDB4ZWFjNztcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpIDogMHhlYWNhO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpIDogMHhlYWNiO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpIDogMHhlYWNjO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpIDogMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpIDogMHhlYWNkO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKSA6IDB4ZWFjZTtcblxudmFyIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29uY3VycmVudF9tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJykgOiAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJykgOiAweGVhZDE7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QubWVtbycpIDogMHhlYWQzO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKSA6IDB4ZWFkNDtcblxudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InO1xuXG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgaWYgKG1heWJlSXRlcmFibGUgPT09IG51bGwgfHwgdHlwZW9mIG1heWJlSXRlcmFibGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIG1heWJlSXRlcmF0b3IgPSBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtNQVlCRV9JVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdO1xuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIFBlbmRpbmcgPSAwO1xudmFyIFJlc29sdmVkID0gMTtcbnZhciBSZWplY3RlZCA9IDI7XG5cbmZ1bmN0aW9uIHJlZmluZVJlc29sdmVkTGF6eUNvbXBvbmVudChsYXp5Q29tcG9uZW50KSB7XG4gIHJldHVybiBsYXp5Q29tcG9uZW50Ll9zdGF0dXMgPT09IFJlc29sdmVkID8gbGF6eUNvbXBvbmVudC5fcmVzdWx0IDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBvdXRlclR5cGUuZGlzcGxheU5hbWUgfHwgKGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArICcoJyArIGZ1bmN0aW9uTmFtZSArICcpJyA6IHdyYXBwZXJOYW1lKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKSB7XG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICAvLyBIb3N0IHJvb3QsIHRleHQgbm9kZSBvciBqdXN0IGludmFsaWQgdHlwZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB7XG4gICAgaWYgKHR5cGVvZiB0eXBlLnRhZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1JlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgb2JqZWN0IGluIGdldENvbXBvbmVudE5hbWUoKS4gJyArICdUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICB9XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFOlxuICAgICAgcmV0dXJuICdDb25jdXJyZW50TW9kZSc7XG4gICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG4gICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcbiAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcbiAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuICB9XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICByZXR1cm4gJ0NvbnRleHQuQ29uc3VtZXInO1xuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICByZXR1cm4gJ0NvbnRleHQuUHJvdmlkZXInO1xuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUodHlwZS50eXBlKTtcbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHRoZW5hYmxlID0gdHlwZTtcbiAgICAgICAgICB2YXIgcmVzb2x2ZWRUaGVuYWJsZSA9IHJlZmluZVJlc29sdmVkTGF6eUNvbXBvbmVudCh0aGVuYWJsZSk7XG4gICAgICAgICAgaWYgKHJlc29sdmVkVGhlbmFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lKHJlc29sdmVkVGhlbmFibGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuXG5mdW5jdGlvbiBkZXNjcmliZUZpYmVyKGZpYmVyKSB7XG4gIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICBjYXNlIEZyYWdtZW50OlxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgICAgcmV0dXJuICcnO1xuICAgIGRlZmF1bHQ6XG4gICAgICB2YXIgb3duZXIgPSBmaWJlci5fZGVidWdPd25lcjtcbiAgICAgIHZhciBzb3VyY2UgPSBmaWJlci5fZGVidWdTb3VyY2U7XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoZmliZXIudHlwZSk7XG4gICAgICB2YXIgb3duZXJOYW1lID0gbnVsbDtcbiAgICAgIGlmIChvd25lcikge1xuICAgICAgICBvd25lck5hbWUgPSBnZXRDb21wb25lbnROYW1lKG93bmVyLnR5cGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlc2NyaWJlQ29tcG9uZW50RnJhbWUobmFtZSwgc291cmNlLCBvd25lck5hbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZCh3b3JrSW5Qcm9ncmVzcykge1xuICB2YXIgaW5mbyA9ICcnO1xuICB2YXIgbm9kZSA9IHdvcmtJblByb2dyZXNzO1xuICBkbyB7XG4gICAgaW5mbyArPSBkZXNjcmliZUZpYmVyKG5vZGUpO1xuICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgfSB3aGlsZSAobm9kZSk7XG4gIHJldHVybiBpbmZvO1xufVxuXG52YXIgY3VycmVudCA9IG51bGw7XG52YXIgcGhhc2UgPSBudWxsO1xuXG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHtcbiAge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIG93bmVyID0gY3VycmVudC5fZGVidWdPd25lcjtcbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgdHlwZW9mIG93bmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUob3duZXIudHlwZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2KCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgLy8gU2FmZSBiZWNhdXNlIGlmIGN1cnJlbnQgZmliZXIgZXhpc3RzLCB3ZSBhcmUgcmVjb25jaWxpbmcsXG4gICAgLy8gYW5kIGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgdmVyc2lvbi5cbiAgICByZXR1cm4gZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKGN1cnJlbnQpO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gcmVzZXRDdXJyZW50RmliZXIoKSB7XG4gIHtcbiAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjayA9IG51bGw7XG4gICAgY3VycmVudCA9IG51bGw7XG4gICAgcGhhc2UgPSBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRGaWJlcihmaWJlcikge1xuICB7XG4gICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2sgPSBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2O1xuICAgIGN1cnJlbnQgPSBmaWJlcjtcbiAgICBwaGFzZSA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0Q3VycmVudFBoYXNlKGxpZmVDeWNsZVBoYXNlKSB7XG4gIHtcbiAgICBwaGFzZSA9IGxpZmVDeWNsZVBoYXNlO1xuICB9XG59XG5cbi8qKlxuICogU2ltaWxhciB0byBpbnZhcmlhbnQgYnV0IG9ubHkgbG9ncyBhIHdhcm5pbmcgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byBsb2cgaXNzdWVzIGluIGRldmVsb3BtZW50IGVudmlyb25tZW50cyBpbiBjcml0aWNhbFxuICogcGF0aHMuIFJlbW92aW5nIHRoZSBsb2dnaW5nIGNvZGUgZm9yIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIHdpbGwga2VlcCB0aGVcbiAqIHNhbWUgbG9naWMgYW5kIGZvbGxvdyB0aGUgc2FtZSBjb2RlIHBhdGhzLlxuICovXG5cbnZhciB3YXJuaW5nID0gd2FybmluZ1dpdGhvdXRTdGFjayQxO1xuXG57XG4gIHdhcm5pbmcgPSBmdW5jdGlvbiAoY29uZGl0aW9uLCBmb3JtYXQpIHtcbiAgICBpZiAoY29uZGl0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbiAgICB2YXIgc3RhY2sgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0oKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvd2FybmluZy1hbmQtaW52YXJpYW50LWFyZ3NcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDIgPyBfbGVuIC0gMiA6IDApLCBfa2V5ID0gMjsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMl0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgd2FybmluZ1dpdGhvdXRTdGFjayQxLmFwcGx5KHVuZGVmaW5lZCwgW2ZhbHNlLCBmb3JtYXQgKyAnJXMnXS5jb25jYXQoYXJncywgW3N0YWNrXSkpO1xuICB9O1xufVxuXG52YXIgd2FybmluZyQxID0gd2FybmluZztcblxuLy8gQSByZXNlcnZlZCBhdHRyaWJ1dGUuXG4vLyBJdCBpcyBoYW5kbGVkIGJ5IFJlYWN0IHNlcGFyYXRlbHkgYW5kIHNob3VsZG4ndCBiZSB3cml0dGVuIHRvIHRoZSBET00uXG52YXIgUkVTRVJWRUQgPSAwO1xuXG4vLyBBIHNpbXBsZSBzdHJpbmcgYXR0cmlidXRlLlxuLy8gQXR0cmlidXRlcyB0aGF0IGFyZW4ndCBpbiB0aGUgd2hpdGVsaXN0IGFyZSBwcmVzdW1lZCB0byBoYXZlIHRoaXMgdHlwZS5cbnZhciBTVFJJTkcgPSAxO1xuXG4vLyBBIHN0cmluZyBhdHRyaWJ1dGUgdGhhdCBhY2NlcHRzIGJvb2xlYW5zIGluIFJlYWN0LiBJbiBIVE1MLCB0aGVzZSBhcmUgY2FsbGVkXG4vLyBcImVudW1lcmF0ZWRcIiBhdHRyaWJ1dGVzIHdpdGggXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIiBhcyBwb3NzaWJsZSB2YWx1ZXMuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBzZXQgdG8gYSBcInRydWVcIiBzdHJpbmcuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgc2V0IHRvIGEgXCJmYWxzZVwiIHN0cmluZy5cbnZhciBCT09MRUFOSVNIX1NUUklORyA9IDI7XG5cbi8vIEEgcmVhbCBib29sZWFuIGF0dHJpYnV0ZS5cbi8vIFdoZW4gdHJ1ZSwgaXQgc2hvdWxkIGJlIHByZXNlbnQgKHNldCBlaXRoZXIgdG8gYW4gZW1wdHkgc3RyaW5nIG9yIGl0cyBuYW1lKS5cbi8vIFdoZW4gZmFsc2UsIGl0IHNob3VsZCBiZSBvbWl0dGVkLlxudmFyIEJPT0xFQU4gPSAzO1xuXG4vLyBBbiBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIGZsYWcgYXMgd2VsbCBhcyB3aXRoIGEgdmFsdWUuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBwcmVzZW50IChzZXQgZWl0aGVyIHRvIGFuIGVtcHR5IHN0cmluZyBvciBpdHMgbmFtZSkuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgb21pdHRlZC5cbi8vIEZvciBhbnkgb3RoZXIgdmFsdWUsIHNob3VsZCBiZSBwcmVzZW50IHdpdGggdGhhdCB2YWx1ZS5cbnZhciBPVkVSTE9BREVEX0JPT0xFQU4gPSA0O1xuXG4vLyBBbiBhdHRyaWJ1dGUgdGhhdCBtdXN0IGJlIG51bWVyaWMgb3IgcGFyc2UgYXMgYSBudW1lcmljLlxuLy8gV2hlbiBmYWxzeSwgaXQgc2hvdWxkIGJlIHJlbW92ZWQuXG52YXIgTlVNRVJJQyA9IDU7XG5cbi8vIEFuIGF0dHJpYnV0ZSB0aGF0IG11c3QgYmUgcG9zaXRpdmUgbnVtZXJpYyBvciBwYXJzZSBhcyBhIHBvc2l0aXZlIG51bWVyaWMuXG4vLyBXaGVuIGZhbHN5LCBpdCBzaG91bGQgYmUgcmVtb3ZlZC5cbnZhciBQT1NJVElWRV9OVU1FUklDID0gNjtcblxuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xudmFyIEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgPSAnOkEtWl9hLXpcXFxcdTAwQzAtXFxcXHUwMEQ2XFxcXHUwMEQ4LVxcXFx1MDBGNlxcXFx1MDBGOC1cXFxcdTAyRkZcXFxcdTAzNzAtXFxcXHUwMzdEXFxcXHUwMzdGLVxcXFx1MUZGRlxcXFx1MjAwQy1cXFxcdTIwMERcXFxcdTIwNzAtXFxcXHUyMThGXFxcXHUyQzAwLVxcXFx1MkZFRlxcXFx1MzAwMS1cXFxcdUQ3RkZcXFxcdUY5MDAtXFxcXHVGRENGXFxcXHVGREYwLVxcXFx1RkZGRCc7XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi9cbnZhciBBVFRSSUJVVEVfTkFNRV9DSEFSID0gQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiArICdcXFxcLS4wLTlcXFxcdTAwQjdcXFxcdTAzMDAtXFxcXHUwMzZGXFxcXHUyMDNGLVxcXFx1MjA0MCc7XG5cblxudmFyIFJPT1RfQVRUUklCVVRFX05BTUUgPSAnZGF0YS1yZWFjdHJvb3QnO1xudmFyIFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYID0gbmV3IFJlZ0V4cCgnXlsnICsgQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiArICddWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUgPSB7fTtcbnZhciB2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGUgPSB7fTtcblxuZnVuY3Rpb24gaXNBdHRyaWJ1dGVOYW1lU2FmZShhdHRyaWJ1dGVOYW1lKSB7XG4gIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZSwgYXR0cmlidXRlTmFtZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlLCBhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVgudGVzdChhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG4gIHtcbiAgICB3YXJuaW5nJDEoZmFsc2UsICdJbnZhbGlkIGF0dHJpYnV0ZSBuYW1lOiBgJXNgJywgYXR0cmlidXRlTmFtZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBzaG91bGRJZ25vcmVBdHRyaWJ1dGUobmFtZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHByb3BlcnR5SW5mby50eXBlID09PSBSRVNFUlZFRDtcbiAgfVxuICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKG5hbWUubGVuZ3RoID4gMiAmJiAobmFtZVswXSA9PT0gJ28nIHx8IG5hbWVbMF0gPT09ICdPJykgJiYgKG5hbWVbMV0gPT09ICduJyB8fCBuYW1lWzFdID09PSAnTicpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsICYmIHByb3BlcnR5SW5mby50eXBlID09PSBSRVNFUlZFRCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAvLyAkRmxvd0lzc3VlIHN5bWJvbCBpcyBwZXJmZWN0bHkgdmFsaWQgaGVyZVxuICAgIGNhc2UgJ3N5bWJvbCc6XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHtcbiAgICAgICAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gIXByb3BlcnR5SW5mby5hY2NlcHRzQm9vbGVhbnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHByZWZpeCA9IG5hbWUudG9Mb3dlckNhc2UoKS5zbGljZSgwLCA1KTtcbiAgICAgICAgICByZXR1cm4gcHJlZml4ICE9PSAnZGF0YS0nICYmIHByZWZpeCAhPT0gJ2FyaWEtJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG4gICAgc3dpdGNoIChwcm9wZXJ0eUluZm8udHlwZSkge1xuICAgICAgY2FzZSBCT09MRUFOOlxuICAgICAgICByZXR1cm4gIXZhbHVlO1xuICAgICAgY2FzZSBPVkVSTE9BREVEX0JPT0xFQU46XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gZmFsc2U7XG4gICAgICBjYXNlIE5VTUVSSUM6XG4gICAgICAgIHJldHVybiBpc05hTih2YWx1ZSk7XG4gICAgICBjYXNlIFBPU0lUSVZFX05VTUVSSUM6XG4gICAgICAgIHJldHVybiBpc05hTih2YWx1ZSkgfHwgdmFsdWUgPCAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldFByb3BlcnR5SW5mbyhuYW1lKSB7XG4gIHJldHVybiBwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG5hbWUpID8gcHJvcGVydGllc1tuYW1lXSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCB0eXBlLCBtdXN0VXNlUHJvcGVydHksIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZU5hbWVzcGFjZSkge1xuICB0aGlzLmFjY2VwdHNCb29sZWFucyA9IHR5cGUgPT09IEJPT0xFQU5JU0hfU1RSSU5HIHx8IHR5cGUgPT09IEJPT0xFQU4gfHwgdHlwZSA9PT0gT1ZFUkxPQURFRF9CT09MRUFOO1xuICB0aGlzLmF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lO1xuICB0aGlzLmF0dHJpYnV0ZU5hbWVzcGFjZSA9IGF0dHJpYnV0ZU5hbWVzcGFjZTtcbiAgdGhpcy5tdXN0VXNlUHJvcGVydHkgPSBtdXN0VXNlUHJvcGVydHk7XG4gIHRoaXMucHJvcGVydHlOYW1lID0gbmFtZTtcbiAgdGhpcy50eXBlID0gdHlwZTtcbn1cblxuLy8gV2hlbiBhZGRpbmcgYXR0cmlidXRlcyB0byB0aGlzIGxpc3QsIGJlIHN1cmUgdG8gYWxzbyBhZGQgdGhlbSB0b1xuLy8gdGhlIGBwb3NzaWJsZVN0YW5kYXJkTmFtZXNgIG1vZHVsZSB0byBlbnN1cmUgY2FzaW5nIGFuZCBpbmNvcnJlY3Rcbi8vIG5hbWUgd2FybmluZ3MuXG52YXIgcHJvcGVydGllcyA9IHt9O1xuXG4vLyBUaGVzZSBwcm9wcyBhcmUgcmVzZXJ2ZWQgYnkgUmVhY3QuIFRoZXkgc2hvdWxkbid0IGJlIHdyaXR0ZW4gdG8gdGhlIERPTS5cblsnY2hpbGRyZW4nLCAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnLFxuLy8gVE9ETzogVGhpcyBwcmV2ZW50cyB0aGUgYXNzaWdubWVudCBvZiBkZWZhdWx0VmFsdWUgdG8gcmVndWxhclxuLy8gZWxlbWVudHMgKG5vdCBqdXN0IGlucHV0cykuIE5vdyB0aGF0IFJlYWN0RE9NSW5wdXQgYXNzaWducyB0byB0aGVcbi8vIGRlZmF1bHRWYWx1ZSBwcm9wZXJ0eSAtLSBkbyB3ZSBuZWVkIHRoaXM/XG4nZGVmYXVsdFZhbHVlJywgJ2RlZmF1bHRDaGVja2VkJywgJ2lubmVySFRNTCcsICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLCAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJywgJ3N0eWxlJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBSRVNFUlZFRCwgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwpO1xufSAvLyBhdHRyaWJ1dGVOYW1lc3BhY2Vcbik7XG5cbi8vIEEgZmV3IFJlYWN0IHN0cmluZyBhdHRyaWJ1dGVzIGhhdmUgYSBkaWZmZXJlbnQgbmFtZS5cbi8vIFRoaXMgaXMgYSBtYXBwaW5nIGZyb20gUmVhY3QgcHJvcCBuYW1lcyB0byB0aGUgYXR0cmlidXRlIG5hbWVzLlxuW1snYWNjZXB0Q2hhcnNldCcsICdhY2NlcHQtY2hhcnNldCddLCBbJ2NsYXNzTmFtZScsICdjbGFzcyddLCBbJ2h0bWxGb3InLCAnZm9yJ10sIFsnaHR0cEVxdWl2JywgJ2h0dHAtZXF1aXYnXV0uZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgbmFtZSA9IF9yZWZbMF0sXG4gICAgICBhdHRyaWJ1dGVOYW1lID0gX3JlZlsxXTtcblxuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsKTtcbn0gLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4pO1xuXG4vLyBUaGVzZSBhcmUgXCJlbnVtZXJhdGVkXCIgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgYWNjZXB0IFwidHJ1ZVwiIGFuZCBcImZhbHNlXCIuXG4vLyBJbiBSZWFjdCwgd2UgbGV0IHVzZXJzIHBhc3MgYHRydWVgIGFuZCBgZmFsc2VgIGV2ZW4gdGhvdWdoIHRlY2huaWNhbGx5XG4vLyB0aGVzZSBhcmVuJ3QgYm9vbGVhbiBhdHRyaWJ1dGVzICh0aGV5IGFyZSBjb2VyY2VkIHRvIHN0cmluZ3MpLlxuWydjb250ZW50RWRpdGFibGUnLCAnZHJhZ2dhYmxlJywgJ3NwZWxsQ2hlY2snLCAndmFsdWUnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU5JU0hfU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsKTtcbn0gLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4pO1xuXG4vLyBUaGVzZSBhcmUgXCJlbnVtZXJhdGVkXCIgU1ZHIGF0dHJpYnV0ZXMgdGhhdCBhY2NlcHQgXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIi5cbi8vIEluIFJlYWN0LCB3ZSBsZXQgdXNlcnMgcGFzcyBgdHJ1ZWAgYW5kIGBmYWxzZWAgZXZlbiB0aG91Z2ggdGVjaG5pY2FsbHlcbi8vIHRoZXNlIGFyZW4ndCBib29sZWFuIGF0dHJpYnV0ZXMgKHRoZXkgYXJlIGNvZXJjZWQgdG8gc3RyaW5ncykuXG4vLyBTaW5jZSB0aGVzZSBhcmUgU1ZHIGF0dHJpYnV0ZXMsIHRoZWlyIGF0dHJpYnV0ZSBuYW1lcyBhcmUgY2FzZS1zZW5zaXRpdmUuXG5bJ2F1dG9SZXZlcnNlJywgJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLCAnZm9jdXNhYmxlJywgJ3ByZXNlcnZlQWxwaGEnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU5JU0hfU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCk7XG59IC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuKTtcblxuLy8gVGhlc2UgYXJlIEhUTUwgYm9vbGVhbiBhdHRyaWJ1dGVzLlxuWydhbGxvd0Z1bGxTY3JlZW4nLCAnYXN5bmMnLFxuLy8gTm90ZTogdGhlcmUgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHdyaXR0ZW4gdG8gdGhlIERPTVxuLy8gb24gdGhlIGNsaWVudCBzaWRlIGJlY2F1c2UgdGhlIGJyb3dzZXJzIGFyZSBpbmNvbnNpc3RlbnQuIEluc3RlYWQgd2UgY2FsbCBmb2N1cygpLlxuJ2F1dG9Gb2N1cycsICdhdXRvUGxheScsICdjb250cm9scycsICdkZWZhdWx0JywgJ2RlZmVyJywgJ2Rpc2FibGVkJywgJ2Zvcm1Ob1ZhbGlkYXRlJywgJ2hpZGRlbicsICdsb29wJywgJ25vTW9kdWxlJywgJ25vVmFsaWRhdGUnLCAnb3BlbicsICdwbGF5c0lubGluZScsICdyZWFkT25seScsICdyZXF1aXJlZCcsICdyZXZlcnNlZCcsICdzY29wZWQnLCAnc2VhbWxlc3MnLFxuLy8gTWljcm9kYXRhXG4naXRlbVNjb3BlJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsKTtcbn0gLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4pO1xuXG4vLyBUaGVzZSBhcmUgdGhlIGZldyBSZWFjdCBwcm9wcyB0aGF0IHdlIHNldCBhcyBET00gcHJvcGVydGllc1xuLy8gcmF0aGVyIHRoYW4gYXR0cmlidXRlcy4gVGhlc2UgYXJlIGFsbCBib29sZWFucy5cblsnY2hlY2tlZCcsXG4vLyBOb3RlOiBgb3B0aW9uLnNlbGVjdGVkYCBpcyBub3QgdXBkYXRlZCBpZiBgc2VsZWN0Lm11bHRpcGxlYCBpc1xuLy8gZGlzYWJsZWQgd2l0aCBgcmVtb3ZlQXR0cmlidXRlYC4gV2UgaGF2ZSBzcGVjaWFsIGxvZ2ljIGZvciBoYW5kbGluZyB0aGlzLlxuJ211bHRpcGxlJywgJ211dGVkJywgJ3NlbGVjdGVkJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOLCB0cnVlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsKTtcbn0gLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4pO1xuXG4vLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgYXJlIFwib3ZlcmxvYWRlZCBib29sZWFuc1wiOiB0aGV5IGJlaGF2ZSBsaWtlXG4vLyBib29sZWFucywgYnV0IGNhbiBhbHNvIGFjY2VwdCBhIHN0cmluZyB2YWx1ZS5cblsnY2FwdHVyZScsICdkb3dubG9hZCddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgT1ZFUkxPQURFRF9CT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCk7XG59IC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuKTtcblxuLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IG11c3QgYmUgcG9zaXRpdmUgbnVtYmVycy5cblsnY29scycsICdyb3dzJywgJ3NpemUnLCAnc3BhbiddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgUE9TSVRJVkVfTlVNRVJJQywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwpO1xufSAvLyBhdHRyaWJ1dGVOYW1lc3BhY2Vcbik7XG5cbi8vIFRoZXNlIGFyZSBIVE1MIGF0dHJpYnV0ZXMgdGhhdCBtdXN0IGJlIG51bWJlcnMuXG5bJ3Jvd1NwYW4nLCAnc3RhcnQnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIE5VTUVSSUMsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwpO1xufSAvLyBhdHRyaWJ1dGVOYW1lc3BhY2Vcbik7XG5cbnZhciBDQU1FTElaRSA9IC9bXFwtXFw6XShbYS16XSkvZztcbnZhciBjYXBpdGFsaXplID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gIHJldHVybiB0b2tlblsxXS50b1VwcGVyQ2FzZSgpO1xufTtcblxuLy8gVGhpcyBpcyBhIGxpc3Qgb2YgYWxsIFNWRyBhdHRyaWJ1dGVzIHRoYXQgbmVlZCBzcGVjaWFsIGNhc2luZywgbmFtZXNwYWNpbmcsXG4vLyBvciBib29sZWFuIHZhbHVlIGFzc2lnbm1lbnQuIFJlZ3VsYXIgYXR0cmlidXRlcyB0aGF0IGp1c3QgYWNjZXB0IHN0cmluZ3Ncbi8vIGFuZCBoYXZlIHRoZSBzYW1lIG5hbWVzIGFyZSBvbWl0dGVkLCBqdXN0IGxpa2UgaW4gdGhlIEhUTUwgd2hpdGVsaXN0LlxuLy8gU29tZSBvZiB0aGVzZSBhdHRyaWJ1dGVzIGNhbiBiZSBoYXJkIHRvIGZpbmQuIFRoaXMgbGlzdCB3YXMgY3JlYXRlZCBieVxuLy8gc2NyYXBwaW5nIHRoZSBNRE4gZG9jdW1lbnRhdGlvbi5cblsnYWNjZW50LWhlaWdodCcsICdhbGlnbm1lbnQtYmFzZWxpbmUnLCAnYXJhYmljLWZvcm0nLCAnYmFzZWxpbmUtc2hpZnQnLCAnY2FwLWhlaWdodCcsICdjbGlwLXBhdGgnLCAnY2xpcC1ydWxlJywgJ2NvbG9yLWludGVycG9sYXRpb24nLCAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJywgJ2NvbG9yLXByb2ZpbGUnLCAnY29sb3ItcmVuZGVyaW5nJywgJ2RvbWluYW50LWJhc2VsaW5lJywgJ2VuYWJsZS1iYWNrZ3JvdW5kJywgJ2ZpbGwtb3BhY2l0eScsICdmaWxsLXJ1bGUnLCAnZmxvb2QtY29sb3InLCAnZmxvb2Qtb3BhY2l0eScsICdmb250LWZhbWlseScsICdmb250LXNpemUnLCAnZm9udC1zaXplLWFkanVzdCcsICdmb250LXN0cmV0Y2gnLCAnZm9udC1zdHlsZScsICdmb250LXZhcmlhbnQnLCAnZm9udC13ZWlnaHQnLCAnZ2x5cGgtbmFtZScsICdnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsJywgJ2dseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsJywgJ2hvcml6LWFkdi14JywgJ2hvcml6LW9yaWdpbi14JywgJ2ltYWdlLXJlbmRlcmluZycsICdsZXR0ZXItc3BhY2luZycsICdsaWdodGluZy1jb2xvcicsICdtYXJrZXItZW5kJywgJ21hcmtlci1taWQnLCAnbWFya2VyLXN0YXJ0JywgJ292ZXJsaW5lLXBvc2l0aW9uJywgJ292ZXJsaW5lLXRoaWNrbmVzcycsICdwYWludC1vcmRlcicsICdwYW5vc2UtMScsICdwb2ludGVyLWV2ZW50cycsICdyZW5kZXJpbmctaW50ZW50JywgJ3NoYXBlLXJlbmRlcmluZycsICdzdG9wLWNvbG9yJywgJ3N0b3Atb3BhY2l0eScsICdzdHJpa2V0aHJvdWdoLXBvc2l0aW9uJywgJ3N0cmlrZXRocm91Z2gtdGhpY2tuZXNzJywgJ3N0cm9rZS1kYXNoYXJyYXknLCAnc3Ryb2tlLWRhc2hvZmZzZXQnLCAnc3Ryb2tlLWxpbmVjYXAnLCAnc3Ryb2tlLWxpbmVqb2luJywgJ3N0cm9rZS1taXRlcmxpbWl0JywgJ3N0cm9rZS1vcGFjaXR5JywgJ3N0cm9rZS13aWR0aCcsICd0ZXh0LWFuY2hvcicsICd0ZXh0LWRlY29yYXRpb24nLCAndGV4dC1yZW5kZXJpbmcnLCAndW5kZXJsaW5lLXBvc2l0aW9uJywgJ3VuZGVybGluZS10aGlja25lc3MnLCAndW5pY29kZS1iaWRpJywgJ3VuaWNvZGUtcmFuZ2UnLCAndW5pdHMtcGVyLWVtJywgJ3YtYWxwaGFiZXRpYycsICd2LWhhbmdpbmcnLCAndi1pZGVvZ3JhcGhpYycsICd2LW1hdGhlbWF0aWNhbCcsICd2ZWN0b3ItZWZmZWN0JywgJ3ZlcnQtYWR2LXknLCAndmVydC1vcmlnaW4teCcsICd2ZXJ0LW9yaWdpbi15JywgJ3dvcmQtc3BhY2luZycsICd3cml0aW5nLW1vZGUnLCAneG1sbnM6eGxpbmsnLCAneC1oZWlnaHQnXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsIG51bGwpO1xufSAvLyBhdHRyaWJ1dGVOYW1lc3BhY2Vcbik7XG5cbi8vIFN0cmluZyBTVkcgYXR0cmlidXRlcyB3aXRoIHRoZSB4bGluayBuYW1lc3BhY2UuXG5bJ3hsaW5rOmFjdHVhdGUnLCAneGxpbms6YXJjcm9sZScsICd4bGluazpocmVmJywgJ3hsaW5rOnJvbGUnLCAneGxpbms6c2hvdycsICd4bGluazp0aXRsZScsICd4bGluazp0eXBlJ10uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICB2YXIgbmFtZSA9IGF0dHJpYnV0ZU5hbWUucmVwbGFjZShDQU1FTElaRSwgY2FwaXRhbGl6ZSk7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycpO1xufSk7XG5cbi8vIFN0cmluZyBTVkcgYXR0cmlidXRlcyB3aXRoIHRoZSB4bWwgbmFtZXNwYWNlLlxuWyd4bWw6YmFzZScsICd4bWw6bGFuZycsICd4bWw6c3BhY2UnXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsICdodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnKTtcbn0pO1xuXG4vLyBUaGVzZSBhdHRyaWJ1dGUgZXhpc3RzIGJvdGggaW4gSFRNTCBhbmQgU1ZHLlxuLy8gVGhlIGF0dHJpYnV0ZSBuYW1lIGlzIGNhc2Utc2Vuc2l0aXZlIGluIFNWRyBzbyB3ZSBjYW4ndCBqdXN0IHVzZVxuLy8gdGhlIFJlYWN0IG5hbWUgbGlrZSB3ZSBkbyBmb3IgYXR0cmlidXRlcyB0aGF0IGV4aXN0IG9ubHkgaW4gSFRNTC5cblsndGFiSW5kZXgnLCAnY3Jvc3NPcmlnaW4nXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHByb3BlcnRpZXNbYXR0cmlidXRlTmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKGF0dHJpYnV0ZU5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCk7XG59IC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuKTtcblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgXCJleHBlY3RlZFwiIGFyZ3VtZW50IGlzIHVzZWQgYXMgYSBoaW50IG9mIHdoYXQgdGhlIGV4cGVjdGVkIHZhbHVlIGlzLlxuICogU29tZSBwcm9wZXJ0aWVzIGhhdmUgbXVsdGlwbGUgZXF1aXZhbGVudCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgbmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbykge1xuICB7XG4gICAgaWYgKHByb3BlcnR5SW5mby5tdXN0VXNlUHJvcGVydHkpIHtcbiAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eUluZm8ucHJvcGVydHlOYW1lO1xuXG4gICAgICByZXR1cm4gbm9kZVtwcm9wZXJ0eU5hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lO1xuXG4gICAgICB2YXIgc3RyaW5nVmFsdWUgPSBudWxsO1xuXG4gICAgICBpZiAocHJvcGVydHlJbmZvLnR5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTikge1xuICAgICAgICBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhbHVlID09PSAnJyArIGV4cGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub2RlLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIGV4cGVjdGVkLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgICAgIC8vIFdlIGhhZCBhbiBhdHRyaWJ1dGUgYnV0IHNob3VsZG4ndCBoYXZlIGhhZCBvbmUsIHNvIHJlYWQgaXRcbiAgICAgICAgICAvLyBmb3IgdGhlIGVycm9yIG1lc3NhZ2UuXG4gICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8udHlwZSA9PT0gQk9PTEVBTikge1xuICAgICAgICAgIC8vIElmIHRoaXMgd2FzIGEgYm9vbGVhbiwgaXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgdmFsdWUgaXNcbiAgICAgICAgICAvLyB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgaXQgaXMgdGhlIHNhbWUgYXMgdGhlIGV4cGVjdGVkLlxuICAgICAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFdmVuIGlmIHRoaXMgcHJvcGVydHkgdXNlcyBhIG5hbWVzcGFjZSB3ZSB1c2UgZ2V0QXR0cmlidXRlXG4gICAgICAgIC8vIGJlY2F1c2Ugd2UgYXNzdW1lIGl0cyBuYW1lc3BhY2VkIG5hbWUgaXMgdGhlIHNhbWUgYXMgb3VyIGNvbmZpZy5cbiAgICAgICAgLy8gVG8gdXNlIGdldEF0dHJpYnV0ZU5TIHdlIG5lZWQgdGhlIGxvY2FsIG5hbWUgd2hpY2ggd2UgZG9uJ3QgaGF2ZVxuICAgICAgICAvLyBpbiBvdXIgY29uZmlnIGF0bS5cbiAgICAgICAgc3RyaW5nVmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1ZhbHVlID09PSBudWxsID8gZXhwZWN0ZWQgOiBzdHJpbmdWYWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoc3RyaW5nVmFsdWUgPT09ICcnICsgZXhwZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGV4cGVjdGVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1ZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9yIGEgYXR0cmlidXRlIG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdXNlZCBhcyBhIGhpbnQgb2Ygd2hhdCB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMuIFNvbWVcbiAqIGF0dHJpYnV0ZXMgaGF2ZSBtdWx0aXBsZSBlcXVpdmFsZW50IHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWVGb3JBdHRyaWJ1dGUobm9kZSwgbmFtZSwgZXhwZWN0ZWQpIHtcbiAge1xuICAgIGlmICghaXNBdHRyaWJ1dGVOYW1lU2FmZShuYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIW5vZGUuaGFzQXR0cmlidXRlKG5hbWUpKSB7XG4gICAgICByZXR1cm4gZXhwZWN0ZWQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG51bGw7XG4gICAgfVxuICAgIHZhciB2YWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgIGlmICh2YWx1ZSA9PT0gJycgKyBleHBlY3RlZCkge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBmb3IgYSBwcm9wZXJ0eSBvbiBhIG5vZGUuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICovXG5mdW5jdGlvbiBzZXRWYWx1ZUZvclByb3BlcnR5KG5vZGUsIG5hbWUsIHZhbHVlLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICB2YXIgcHJvcGVydHlJbmZvID0gZ2V0UHJvcGVydHlJbmZvKG5hbWUpO1xuICBpZiAoc2hvdWxkSWdub3JlQXR0cmlidXRlKG5hbWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgdmFsdWUgPSBudWxsO1xuICB9XG4gIC8vIElmIHRoZSBwcm9wIGlzbid0IGluIHRoZSBzcGVjaWFsIGxpc3QsIHRyZWF0IGl0IGFzIGEgc2ltcGxlIGF0dHJpYnV0ZS5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnIHx8IHByb3BlcnR5SW5mbyA9PT0gbnVsbCkge1xuICAgIGlmIChpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICB2YXIgX2F0dHJpYnV0ZU5hbWUgPSBuYW1lO1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKF9hdHRyaWJ1dGVOYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKF9hdHRyaWJ1dGVOYW1lLCAnJyArIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtdXN0VXNlUHJvcGVydHkgPSBwcm9wZXJ0eUluZm8ubXVzdFVzZVByb3BlcnR5O1xuXG4gIGlmIChtdXN0VXNlUHJvcGVydHkpIHtcbiAgICB2YXIgcHJvcGVydHlOYW1lID0gcHJvcGVydHlJbmZvLnByb3BlcnR5TmFtZTtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdmFyIHR5cGUgPSBwcm9wZXJ0eUluZm8udHlwZTtcblxuICAgICAgbm9kZVtwcm9wZXJ0eU5hbWVdID0gdHlwZSA9PT0gQk9PTEVBTiA/IGZhbHNlIDogJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvbnRyYXJ5IHRvIGBzZXRBdHRyaWJ1dGVgLCBvYmplY3QgcHJvcGVydGllcyBhcmUgcHJvcGVybHlcbiAgICAgIC8vIGB0b1N0cmluZ2BlZCBieSBJRTgvOS5cbiAgICAgIG5vZGVbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgLy8gVGhlIHJlc3QgYXJlIHRyZWF0ZWQgYXMgYXR0cmlidXRlcyB3aXRoIHNwZWNpYWwgY2FzZXMuXG4gIHZhciBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWUsXG4gICAgICBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZXNwYWNlO1xuXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBfdHlwZSA9IHByb3BlcnR5SW5mby50eXBlO1xuXG4gICAgdmFyIGF0dHJpYnV0ZVZhbHVlID0gdm9pZCAwO1xuICAgIGlmIChfdHlwZSA9PT0gQk9PTEVBTiB8fCBfdHlwZSA9PT0gT1ZFUkxPQURFRF9CT09MRUFOICYmIHZhbHVlID09PSB0cnVlKSB7XG4gICAgICBhdHRyaWJ1dGVWYWx1ZSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBgc2V0QXR0cmlidXRlYCB3aXRoIG9iamVjdHMgYmVjb21lcyBvbmx5IGBbb2JqZWN0XWAgaW4gSUU4LzksXG4gICAgICAvLyAoJycgKyB2YWx1ZSkgbWFrZXMgaXQgb3V0cHV0IHRoZSBjb3JyZWN0IHRvU3RyaW5nKCktdmFsdWUuXG4gICAgICBhdHRyaWJ1dGVWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgfVxuICAgIGlmIChhdHRyaWJ1dGVOYW1lc3BhY2UpIHtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlTlMoYXR0cmlidXRlTmFtZXNwYWNlLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gRmxvdyBkb2VzIG5vdCBhbGxvdyBzdHJpbmcgY29uY2F0ZW5hdGlvbiBvZiBtb3N0IG5vbi1zdHJpbmcgdHlwZXMuIFRvIHdvcmtcbi8vIGFyb3VuZCB0aGlzIGxpbWl0YXRpb24sIHdlIHVzZSBhbiBvcGFxdWUgdHlwZSB0aGF0IGNhbiBvbmx5IGJlIG9idGFpbmVkIGJ5XG4vLyBwYXNzaW5nIHRoZSB2YWx1ZSB0aHJvdWdoIGdldFRvU3RyaW5nVmFsdWUgZmlyc3QuXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0VG9TdHJpbmdWYWx1ZSh2YWx1ZSkge1xuICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGZ1bmN0aW9uLCBzeW1ib2wgYXJlIGFzc2lnbmVkIGFzIGVtcHR5IHN0cmluZ3NcbiAgICAgIHJldHVybiAnJztcbiAgfVxufVxuXG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gbnVsbDtcblxudmFyIFJlYWN0Q29udHJvbGxlZFZhbHVlUHJvcFR5cGVzID0ge1xuICBjaGVja1Byb3BUeXBlczogbnVsbFxufTtcblxue1xuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuXG4gIHZhciBoYXNSZWFkT25seVZhbHVlID0ge1xuICAgIGJ1dHRvbjogdHJ1ZSxcbiAgICBjaGVja2JveDogdHJ1ZSxcbiAgICBpbWFnZTogdHJ1ZSxcbiAgICBoaWRkZW46IHRydWUsXG4gICAgcmFkaW86IHRydWUsXG4gICAgcmVzZXQ6IHRydWUsXG4gICAgc3VibWl0OiB0cnVlXG4gIH07XG5cbiAgdmFyIHByb3BUeXBlcyA9IHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICAgICAgaWYgKGhhc1JlYWRPbmx5VmFsdWVbcHJvcHMudHlwZV0gfHwgcHJvcHMub25DaGFuZ2UgfHwgcHJvcHMucmVhZE9ubHkgfHwgcHJvcHMuZGlzYWJsZWQgfHwgcHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdZb3UgcHJvdmlkZWQgYSBgdmFsdWVgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gJyArICdgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmICcgKyAndGhlIGZpZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVsdFZhbHVlYC4gT3RoZXJ3aXNlLCAnICsgJ3NldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLicpO1xuICAgIH0sXG4gICAgY2hlY2tlZDogZnVuY3Rpb24gKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICAgICAgaWYgKHByb3BzLm9uQ2hhbmdlIHx8IHByb3BzLnJlYWRPbmx5IHx8IHByb3BzLmRpc2FibGVkIHx8IHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBFcnJvcignWW91IHByb3ZpZGVkIGEgYGNoZWNrZWRgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gJyArICdgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmICcgKyAndGhlIGZpZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVsdENoZWNrZWRgLiBPdGhlcndpc2UsICcgKyAnc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuJyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBQcm92aWRlIGEgbGlua2VkIGB2YWx1ZWAgYXR0cmlidXRlIGZvciBjb250cm9sbGVkIGZvcm1zLiBZb3Ugc2hvdWxkIG5vdCB1c2VcbiAgICogdGhpcyBvdXRzaWRlIG9mIHRoZSBSZWFjdERPTSBjb250cm9sbGVkIGZvcm0gY29tcG9uZW50cy5cbiAgICovXG4gIFJlYWN0Q29udHJvbGxlZFZhbHVlUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzID0gZnVuY3Rpb24gKHRhZ05hbWUsIHByb3BzKSB7XG4gICAgY2hlY2tQcm9wVHlwZXMocHJvcFR5cGVzLCBwcm9wcywgJ3Byb3AnLCB0YWdOYW1lLCBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuZ2V0U3RhY2tBZGRlbmR1bSk7XG4gIH07XG59XG5cbnZhciBlbmFibGVVc2VyVGltaW5nQVBJID0gdHJ1ZTtcblxuLy8gSGVscHMgaWRlbnRpZnkgc2lkZSBlZmZlY3RzIGluIGJlZ2luLXBoYXNlIGxpZmVjeWNsZSBob29rcyBhbmQgc2V0U3RhdGUgcmVkdWNlcnM6XG52YXIgZGVidWdSZW5kZXJQaGFzZVNpZGVFZmZlY3RzID0gZmFsc2U7XG5cbi8vIEluIHNvbWUgY2FzZXMsIFN0cmljdE1vZGUgc2hvdWxkIGFsc28gZG91YmxlLXJlbmRlciBsaWZlY3ljbGVzLlxuLy8gVGhpcyBjYW4gYmUgY29uZnVzaW5nIGZvciB0ZXN0cyB0aG91Z2gsXG4vLyBBbmQgaXQgY2FuIGJlIGJhZCBmb3IgcGVyZm9ybWFuY2UgaW4gcHJvZHVjdGlvbi5cbi8vIFRoaXMgZmVhdHVyZSBmbGFnIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGJlaGF2aW9yOlxudmFyIGRlYnVnUmVuZGVyUGhhc2VTaWRlRWZmZWN0c0ZvclN0cmljdE1vZGUgPSB0cnVlO1xuXG4vLyBUbyBwcmVzZXJ2ZSB0aGUgXCJQYXVzZSBvbiBjYXVnaHQgZXhjZXB0aW9uc1wiIGJlaGF2aW9yIG9mIHRoZSBkZWJ1Z2dlciwgd2Vcbi8vIHJlcGxheSB0aGUgYmVnaW4gcGhhc2Ugb2YgYSBmYWlsZWQgY29tcG9uZW50IGluc2lkZSBpbnZva2VHdWFyZGVkQ2FsbGJhY2suXG52YXIgcmVwbGF5RmFpbGVkVW5pdE9mV29ya1dpdGhJbnZva2VHdWFyZGVkQ2FsbGJhY2sgPSB0cnVlO1xuXG4vLyBXYXJuIGFib3V0IGRlcHJlY2F0ZWQsIGFzeW5jLXVuc2FmZSBsaWZlY3ljbGVzOyByZWxhdGVzIHRvIFJGQyAjNjpcbnZhciB3YXJuQWJvdXREZXByZWNhdGVkTGlmZWN5Y2xlcyA9IGZhbHNlO1xuXG4vLyBHYXRoZXIgYWR2YW5jZWQgdGltaW5nIG1ldHJpY3MgZm9yIFByb2ZpbGVyIHN1YnRyZWVzLlxudmFyIGVuYWJsZVByb2ZpbGVyVGltZXIgPSB0cnVlO1xuXG4vLyBUcmFjZSB3aGljaCBpbnRlcmFjdGlvbnMgdHJpZ2dlciBlYWNoIGNvbW1pdC5cbnZhciBlbmFibGVTY2hlZHVsZXJUcmFjaW5nID0gdHJ1ZTtcblxuLy8gT25seSB1c2VkIGluIHd3dyBidWlsZHMuXG52YXIgZW5hYmxlU3VzcGVuc2VTZXJ2ZXJSZW5kZXJlciA9IGZhbHNlOyAvLyBUT0RPOiB0cnVlPyBIZXJlIGl0IG1pZ2h0IGp1c3QgYmUgZmFsc2UuXG5cbi8vIE9ubHkgdXNlZCBpbiB3d3cgYnVpbGRzLlxuXG5cbi8vIE9ubHkgdXNlZCBpbiB3d3cgYnVpbGRzLlxuXG5cbi8vIFJlYWN0IEZpcmU6IHByZXZlbnQgdGhlIHZhbHVlIGFuZCBjaGVja2VkIGF0dHJpYnV0ZXMgZnJvbSBzeW5jaW5nXG4vLyB3aXRoIHRoZWlyIHJlbGF0ZWQgRE9NIHByb3BlcnRpZXNcbnZhciBkaXNhYmxlSW5wdXRBdHRyaWJ1dGVTeW5jaW5nID0gZmFsc2U7XG5cbi8vIFRoZXNlIEFQSXMgd2lsbCBubyBsb25nZXIgYmUgXCJ1bnN0YWJsZVwiIGluIHRoZSB1cGNvbWluZyAxNi43IHJlbGVhc2UsXG4vLyBDb250cm9sIHRoaXMgYmVoYXZpb3Igd2l0aCBhIGZsYWcgdG8gc3VwcG9ydCAxNi42IG1pbm9yIHJlbGVhc2VzIGluIHRoZSBtZWFud2hpbGUuXG52YXIgZW5hYmxlU3RhYmxlQ29uY3VycmVudE1vZGVBUElzID0gZmFsc2U7XG5cbnZhciB3YXJuQWJvdXRTaG9ydGhhbmRQcm9wZXJ0eUNvbGxpc2lvbiA9IGZhbHNlO1xuXG4vLyBUT0RPOiBkaXJlY3QgaW1wb3J0cyBsaWtlIHNvbWUtcGFja2FnZS9zcmMvKiBhcmUgYmFkLiBGaXggbWUuXG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gZmFsc2U7XG52YXIgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSBmYWxzZTtcbnZhciBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGlzQ29udHJvbGxlZChwcm9wcykge1xuICB2YXIgdXNlc0NoZWNrZWQgPSBwcm9wcy50eXBlID09PSAnY2hlY2tib3gnIHx8IHByb3BzLnR5cGUgPT09ICdyYWRpbyc7XG4gIHJldHVybiB1c2VzQ2hlY2tlZCA/IHByb3BzLmNoZWNrZWQgIT0gbnVsbCA6IHByb3BzLnZhbHVlICE9IG51bGw7XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBhbiA8aW5wdXQ+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIHNldHRpbmcgdGhlc2Ugb3B0aW9uYWxcbiAqIHByb3BzOiBgY2hlY2tlZGAsIGB2YWx1ZWAsIGBkZWZhdWx0Q2hlY2tlZGAsIGFuZCBgZGVmYXVsdFZhbHVlYC5cbiAqXG4gKiBJZiBgY2hlY2tlZGAgb3IgYHZhbHVlYCBhcmUgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9uc1xuICogdGhhdCBhZmZlY3QgdGhlIGNoZWNrZWQgc3RhdGUgb3IgdmFsdWUgd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogSWYgdGhleSBhcmUgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIG5vdFxuICogdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LiBJbnN0ZWFkLCB0aGUgcHJvcHMgbXVzdCBjaGFuZ2UgaW4gb3JkZXIgZm9yXG4gKiB0aGUgcmVuZGVyZWQgZWxlbWVudCB0byBiZSB1cGRhdGVkLlxuICpcbiAqIFRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgYmUgaW5pdGlhbGl6ZWQgYXMgdW5jaGVja2VkIChvciBgZGVmYXVsdENoZWNrZWRgKVxuICogd2l0aCBhbiBlbXB0eSB2YWx1ZSAob3IgYGRlZmF1bHRWYWx1ZWApLlxuICpcbiAqIFNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEyL1dELWh0bWw1LTIwMTIxMDI1L3RoZS1pbnB1dC1lbGVtZW50Lmh0bWxcbiAqL1xuXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG5cbiAgdmFyIGhvc3RQcm9wcyA9IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgZGVmYXVsdENoZWNrZWQ6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIGNoZWNrZWQ6IGNoZWNrZWQgIT0gbnVsbCA/IGNoZWNrZWQgOiBub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWRcbiAgfSk7XG5cbiAgcmV0dXJuIGhvc3RQcm9wcztcbn1cblxuZnVuY3Rpb24gaW5pdFdyYXBwZXJTdGF0ZShlbGVtZW50LCBwcm9wcykge1xuICB7XG4gICAgUmVhY3RDb250cm9sbGVkVmFsdWVQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoJ2lucHV0JywgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLmNoZWNrZWQgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkKSB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICclcyBjb250YWlucyBhbiBpbnB1dCBvZiB0eXBlICVzIHdpdGggYm90aCBjaGVja2VkIGFuZCBkZWZhdWx0Q2hlY2tlZCBwcm9wcy4gJyArICdJbnB1dCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgY2hlY2tlZCBwcm9wLCBvciB0aGUgZGVmYXVsdENoZWNrZWQgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vZmIubWUvcmVhY3QtY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKTtcbiAgICAgIGRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlKSB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICclcyBjb250YWlucyBhbiBpbnB1dCBvZiB0eXBlICVzIHdpdGggYm90aCB2YWx1ZSBhbmQgZGVmYXVsdFZhbHVlIHByb3BzLiAnICsgJ0lucHV0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cycsIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkgfHwgJ0EgY29tcG9uZW50JywgcHJvcHMudHlwZSk7XG4gICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZSA9PSBudWxsID8gJycgOiBwcm9wcy5kZWZhdWx0VmFsdWU7XG5cbiAgbm9kZS5fd3JhcHBlclN0YXRlID0ge1xuICAgIGluaXRpYWxDaGVja2VkOiBwcm9wcy5jaGVja2VkICE9IG51bGwgPyBwcm9wcy5jaGVja2VkIDogcHJvcHMuZGVmYXVsdENoZWNrZWQsXG4gICAgaW5pdGlhbFZhbHVlOiBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlICE9IG51bGwgPyBwcm9wcy52YWx1ZSA6IGRlZmF1bHRWYWx1ZSksXG4gICAgY29udHJvbGxlZDogaXNDb250cm9sbGVkKHByb3BzKVxuICB9O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDaGVja2VkKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIGNoZWNrZWQgPSBwcm9wcy5jaGVja2VkO1xuICBpZiAoY2hlY2tlZCAhPSBudWxsKSB7XG4gICAgc2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCAnY2hlY2tlZCcsIGNoZWNrZWQsIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVXcmFwcGVyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAge1xuICAgIHZhciBfY29udHJvbGxlZCA9IGlzQ29udHJvbGxlZChwcm9wcyk7XG5cbiAgICBpZiAoIW5vZGUuX3dyYXBwZXJTdGF0ZS5jb250cm9sbGVkICYmIF9jb250cm9sbGVkICYmICFkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkKSB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICdBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyBhbiB1bmNvbnRyb2xsZWQgaW5wdXQgb2YgdHlwZSAlcyB0byBiZSBjb250cm9sbGVkLiAnICsgJ0lucHV0IGVsZW1lbnRzIHNob3VsZCBub3Qgc3dpdGNoIGZyb20gdW5jb250cm9sbGVkIHRvIGNvbnRyb2xsZWQgKG9yIHZpY2UgdmVyc2EpLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cycsIHByb3BzLnR5cGUpO1xuICAgICAgZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChub2RlLl93cmFwcGVyU3RhdGUuY29udHJvbGxlZCAmJiAhX2NvbnRyb2xsZWQgJiYgIWRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQpIHtcbiAgICAgIHdhcm5pbmckMShmYWxzZSwgJ0EgY29tcG9uZW50IGlzIGNoYW5naW5nIGEgY29udHJvbGxlZCBpbnB1dCBvZiB0eXBlICVzIHRvIGJlIHVuY29udHJvbGxlZC4gJyArICdJbnB1dCBlbGVtZW50cyBzaG91bGQgbm90IHN3aXRjaCBmcm9tIGNvbnRyb2xsZWQgdG8gdW5jb250cm9sbGVkIChvciB2aWNlIHZlcnNhKS4gJyArICdEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9mYi5tZS9yZWFjdC1jb250cm9sbGVkLWNvbXBvbmVudHMnLCBwcm9wcy50eXBlKTtcbiAgICAgIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNoZWNrZWQoZWxlbWVudCwgcHJvcHMpO1xuXG4gIHZhciB2YWx1ZSA9IGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUpO1xuICB2YXIgdHlwZSA9IHByb3BzLnR5cGU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICBpZiAodHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gMCAmJiBub2RlLnZhbHVlID09PSAnJyB8fFxuICAgICAgLy8gV2UgZXhwbGljaXRseSB3YW50IHRvIGNvZXJjZSB0byBudW1iZXIgaGVyZSBpZiBwb3NzaWJsZS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgbm9kZS52YWx1ZSAhPSB2YWx1ZSkge1xuICAgICAgICBub2RlLnZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS52YWx1ZSAhPT0gdG9TdHJpbmcodmFsdWUpKSB7XG4gICAgICBub2RlLnZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlID09PSAnc3VibWl0JyB8fCB0eXBlID09PSAncmVzZXQnKSB7XG4gICAgLy8gU3VibWl0L3Jlc2V0IGlucHV0cyBuZWVkIHRoZSBhdHRyaWJ1dGUgcmVtb3ZlZCBjb21wbGV0ZWx5IHRvIGF2b2lkXG4gICAgLy8gYmxhbmstdGV4dCBidXR0b25zLlxuICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChkaXNhYmxlSW5wdXRBdHRyaWJ1dGVTeW5jaW5nKSB7XG4gICAgLy8gV2hlbiBub3Qgc3luY2luZyB0aGUgdmFsdWUgYXR0cmlidXRlLCBSZWFjdCBvbmx5IGFzc2lnbnMgYSBuZXcgdmFsdWVcbiAgICAvLyB3aGVuZXZlciB0aGUgZGVmYXVsdFZhbHVlIFJlYWN0IHByb3AgaGFzIGNoYW5nZWQuIFdoZW4gbm90IHByZXNlbnQsXG4gICAgLy8gUmVhY3QgZG9lcyBub3RoaW5nXG4gICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmFsdWUnKSkge1xuICAgICAgc2V0RGVmYXVsdFZhbHVlKG5vZGUsIHByb3BzLnR5cGUsIGdldFRvU3RyaW5nVmFsdWUocHJvcHMuZGVmYXVsdFZhbHVlKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFdoZW4gc3luY2luZyB0aGUgdmFsdWUgYXR0cmlidXRlLCB0aGUgdmFsdWUgY29tZXMgZnJvbSBhIGNhc2NhZGUgb2ZcbiAgICAvLyBwcm9wZXJ0aWVzOlxuICAgIC8vICAxLiBUaGUgdmFsdWUgUmVhY3QgcHJvcGVydHlcbiAgICAvLyAgMi4gVGhlIGRlZmF1bHRWYWx1ZSBSZWFjdCBwcm9wZXJ0eVxuICAgIC8vICAzLiBPdGhlcndpc2UgdGhlcmUgc2hvdWxkIGJlIG5vIGNoYW5nZVxuICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSkge1xuICAgICAgc2V0RGVmYXVsdFZhbHVlKG5vZGUsIHByb3BzLnR5cGUsIHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmFsdWUnKSkge1xuICAgICAgc2V0RGVmYXVsdFZhbHVlKG5vZGUsIHByb3BzLnR5cGUsIGdldFRvU3RyaW5nVmFsdWUocHJvcHMuZGVmYXVsdFZhbHVlKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRpc2FibGVJbnB1dEF0dHJpYnV0ZVN5bmNpbmcpIHtcbiAgICAvLyBXaGVuIG5vdCBzeW5jaW5nIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSwgdGhlIGF0dHJpYnV0ZSBpcyBkaXJlY3RseVxuICAgIC8vIGNvbnRyb2xsYWJsZSBmcm9tIHRoZSBkZWZhdWx0VmFsdWUgUmVhY3QgcHJvcGVydHkuIEl0IG5lZWRzIHRvIGJlXG4gICAgLy8gdXBkYXRlZCBhcyBuZXcgcHJvcHMgY29tZSBpbi5cbiAgICBpZiAocHJvcHMuZGVmYXVsdENoZWNrZWQgPT0gbnVsbCkge1xuICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ2NoZWNrZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICEhcHJvcHMuZGVmYXVsdENoZWNrZWQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFdoZW4gc3luY2luZyB0aGUgY2hlY2tlZCBhdHRyaWJ1dGUsIGl0IG9ubHkgY2hhbmdlcyB3aGVuIGl0IG5lZWRzXG4gICAgLy8gdG8gYmUgcmVtb3ZlZCwgc3VjaCBhcyB0cmFuc2l0aW9uaW5nIGZyb20gYSBjaGVja2JveCBpbnRvIGEgdGV4dCBpbnB1dFxuICAgIGlmIChwcm9wcy5jaGVja2VkID09IG51bGwgJiYgcHJvcHMuZGVmYXVsdENoZWNrZWQgIT0gbnVsbCkge1xuICAgICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICEhcHJvcHMuZGVmYXVsdENoZWNrZWQ7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIoZWxlbWVudCwgcHJvcHMsIGlzSHlkcmF0aW5nKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICAvLyBEbyBub3QgYXNzaWduIHZhbHVlIGlmIGl0IGlzIGFscmVhZHkgc2V0LiBUaGlzIHByZXZlbnRzIHVzZXIgdGV4dCBpbnB1dFxuICAvLyBmcm9tIGJlaW5nIGxvc3QgZHVyaW5nIFNTUiBoeWRyYXRpb24uXG4gIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSB8fCBwcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdFZhbHVlJykpIHtcbiAgICB2YXIgdHlwZSA9IHByb3BzLnR5cGU7XG4gICAgdmFyIGlzQnV0dG9uID0gdHlwZSA9PT0gJ3N1Ym1pdCcgfHwgdHlwZSA9PT0gJ3Jlc2V0JztcblxuICAgIC8vIEF2b2lkIHNldHRpbmcgdmFsdWUgYXR0cmlidXRlIG9uIHN1Ym1pdC9yZXNldCBpbnB1dHMgYXMgaXQgb3ZlcnJpZGVzIHRoZVxuICAgIC8vIGRlZmF1bHQgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGJyb3dzZXIuIFNlZTogIzEyODcyXG4gICAgaWYgKGlzQnV0dG9uICYmIChwcm9wcy52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHByb3BzLnZhbHVlID09PSBudWxsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBfaW5pdGlhbFZhbHVlID0gdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSk7XG5cbiAgICAvLyBEbyBub3QgYXNzaWduIHZhbHVlIGlmIGl0IGlzIGFscmVhZHkgc2V0LiBUaGlzIHByZXZlbnRzIHVzZXIgdGV4dCBpbnB1dFxuICAgIC8vIGZyb20gYmVpbmcgbG9zdCBkdXJpbmcgU1NSIGh5ZHJhdGlvbi5cbiAgICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgICBpZiAoZGlzYWJsZUlucHV0QXR0cmlidXRlU3luY2luZykge1xuICAgICAgICB2YXIgdmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlKTtcblxuICAgICAgICAvLyBXaGVuIG5vdCBzeW5jaW5nIHRoZSB2YWx1ZSBhdHRyaWJ1dGUsIHRoZSB2YWx1ZSBwcm9wZXJ0eSBwb2ludHNcbiAgICAgICAgLy8gZGlyZWN0bHkgdG8gdGhlIFJlYWN0IHByb3AuIE9ubHkgYXNzaWduIGl0IGlmIGl0IGV4aXN0cy5cbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBBbHdheXMgYXNzaWduIG9uIGJ1dHRvbnMgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBhc3NpZ24gYW5cbiAgICAgICAgICAvLyBlbXB0eSBzdHJpbmcgdG8gY2xlYXIgYnV0dG9uIHRleHQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBPdGhlcndpc2UsIGRvIG5vdCByZS1hc3NpZ24gdGhlIHZhbHVlIHByb3BlcnR5IGlmIGlzIGVtcHR5LiBUaGlzXG4gICAgICAgICAgLy8gcG90ZW50aWFsbHkgYXZvaWRzIGEgRE9NIHdyaXRlIGFuZCBwcmV2ZW50cyBGaXJlZm94ICh+NjAuMC4xKSBmcm9tXG4gICAgICAgICAgLy8gcHJlbWF0dXJlbHkgbWFya2luZyByZXF1aXJlZCBpbnB1dHMgYXMgaW52YWxpZC4gRXF1YWxpdHkgaXMgY29tcGFyZWRcbiAgICAgICAgICAvLyB0byB0aGUgY3VycmVudCB2YWx1ZSBpbiBjYXNlIHRoZSBicm93c2VyIHByb3ZpZGVkIHZhbHVlIGlzIG5vdCBhblxuICAgICAgICAgIC8vIGVtcHR5IHN0cmluZy5cbiAgICAgICAgICBpZiAoaXNCdXR0b24gfHwgdmFsdWUgIT09IG5vZGUudmFsdWUpIHtcbiAgICAgICAgICAgIG5vZGUudmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIHZhbHVlIGF0dHJpYnV0ZSwgdGhlIHZhbHVlIHByb3BlcnR5IHNob3VsZCB1c2VcbiAgICAgICAgLy8gdGhlIHdyYXBwZXJTdGF0ZS5faW5pdGlhbFZhbHVlIHByb3BlcnR5LiBUaGlzIHVzZXM6XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgMS4gVGhlIHZhbHVlIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgICAgICAvLyAgIDIuIFRoZSBkZWZhdWx0VmFsdWUgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgICAgIC8vICAgMy4gQW4gZW1wdHkgc3RyaW5nXG4gICAgICAgIGlmIChfaW5pdGlhbFZhbHVlICE9PSBub2RlLnZhbHVlKSB7XG4gICAgICAgICAgbm9kZS52YWx1ZSA9IF9pbml0aWFsVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZUlucHV0QXR0cmlidXRlU3luY2luZykge1xuICAgICAgLy8gV2hlbiBub3Qgc3luY2luZyB0aGUgdmFsdWUgYXR0cmlidXRlLCBhc3NpZ24gdGhlIHZhbHVlIGF0dHJpYnV0ZVxuICAgICAgLy8gZGlyZWN0bHkgZnJvbSB0aGUgZGVmYXVsdFZhbHVlIFJlYWN0IHByb3BlcnR5ICh3aGVuIHByZXNlbnQpXG4gICAgICB2YXIgZGVmYXVsdFZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy5kZWZhdWx0VmFsdWUpO1xuICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcoZGVmYXVsdFZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgYXR0cmlidXRlIGlzIHN5bmNocm9uaXplZCB0byB0aGUgcHJvcGVydHksXG4gICAgICAvLyBzbyB3ZSBhc3NpZ24gZGVmYXVsdFZhbHVlIHRvIHRoZSBzYW1lIHRoaW5nIGFzIHRoZSB2YWx1ZSBwcm9wZXJ0eVxuICAgICAgLy8gYXNzaWdubWVudCBzdGVwIGFib3ZlLlxuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSBfaW5pdGlhbFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vcm1hbGx5LCB3ZSdkIGp1c3QgZG8gYG5vZGUuY2hlY2tlZCA9IG5vZGUuY2hlY2tlZGAgdXBvbiBpbml0aWFsIG1vdW50LCBsZXNzIHRoaXMgYnVnXG4gIC8vIHRoaXMgaXMgbmVlZGVkIHRvIHdvcmsgYXJvdW5kIGEgY2hyb21lIGJ1ZyB3aGVyZSBzZXR0aW5nIGRlZmF1bHRDaGVja2VkXG4gIC8vIHdpbGwgc29tZXRpbWVzIGluZmx1ZW5jZSB0aGUgdmFsdWUgb2YgY2hlY2tlZCAoZXZlbiBhZnRlciBkZXRhY2htZW50KS5cbiAgLy8gUmVmZXJlbmNlOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD02MDg0MTZcbiAgLy8gV2UgbmVlZCB0byB0ZW1wb3JhcmlseSB1bnNldCBuYW1lIHRvIGF2b2lkIGRpc3J1cHRpbmcgcmFkaW8gYnV0dG9uIGdyb3Vwcy5cbiAgdmFyIG5hbWUgPSBub2RlLm5hbWU7XG4gIGlmIChuYW1lICE9PSAnJykge1xuICAgIG5vZGUubmFtZSA9ICcnO1xuICB9XG5cbiAgaWYgKGRpc2FibGVJbnB1dEF0dHJpYnV0ZVN5bmNpbmcpIHtcbiAgICAvLyBXaGVuIG5vdCBzeW5jaW5nIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSwgdGhlIGNoZWNrZWQgcHJvcGVydHlcbiAgICAvLyBuZXZlciBnZXRzIGFzc2lnbmVkLiBJdCBtdXN0IGJlIG1hbnVhbGx5IHNldC4gV2UgZG9uJ3Qgd2FudFxuICAgIC8vIHRvIGRvIHRoaXMgd2hlbiBoeWRyYXRpbmcgc28gdGhhdCBleGlzdGluZyB1c2VyIGlucHV0IGlzbid0XG4gICAgLy8gbW9kaWZpZWRcbiAgICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgICB1cGRhdGVDaGVja2VkKGVsZW1lbnQsIHByb3BzKTtcbiAgICB9XG5cbiAgICAvLyBPbmx5IGFzc2lnbiB0aGUgY2hlY2tlZCBhdHRyaWJ1dGUgaWYgaXQgaXMgZGVmaW5lZC4gVGhpcyBzYXZlc1xuICAgIC8vIGEgRE9NIHdyaXRlIHdoZW4gY29udHJvbGxpbmcgdGhlIGNoZWNrZWQgYXR0cmlidXRlIGlzbid0IG5lZWRlZFxuICAgIC8vICh0ZXh0IGlucHV0cywgc3VibWl0L3Jlc2V0KVxuICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdENoZWNrZWQnKSkge1xuICAgICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICFub2RlLmRlZmF1bHRDaGVja2VkO1xuICAgICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICEhcHJvcHMuZGVmYXVsdENoZWNrZWQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFdoZW4gc3luY2luZyB0aGUgY2hlY2tlZCBhdHRyaWJ1dGUsIGJvdGggdGhlIGNoZWNrZWQgcHJvcGVydHkgYW5kXG4gICAgLy8gYXR0cmlidXRlIGFyZSBhc3NpZ25lZCBhdCB0aGUgc2FtZSB0aW1lIHVzaW5nIGRlZmF1bHRDaGVja2VkLiBUaGlzIHVzZXM6XG4gICAgLy9cbiAgICAvLyAgIDEuIFRoZSBjaGVja2VkIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgIC8vICAgMi4gVGhlIGRlZmF1bHRDaGVja2VkIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgIC8vICAgMy4gT3RoZXJ3aXNlLCBmYWxzZVxuICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhbm9kZS5kZWZhdWx0Q2hlY2tlZDtcbiAgICBub2RlLmRlZmF1bHRDaGVja2VkID0gISFub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWQ7XG4gIH1cblxuICBpZiAobmFtZSAhPT0gJycpIHtcbiAgICBub2RlLm5hbWUgPSBuYW1lO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB1cGRhdGVXcmFwcGVyKG5vZGUsIHByb3BzKTtcbiAgdXBkYXRlTmFtZWRDb3VzaW5zKG5vZGUsIHByb3BzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTmFtZWRDb3VzaW5zKHJvb3ROb2RlLCBwcm9wcykge1xuICB2YXIgbmFtZSA9IHByb3BzLm5hbWU7XG4gIGlmIChwcm9wcy50eXBlID09PSAncmFkaW8nICYmIG5hbWUgIT0gbnVsbCkge1xuICAgIHZhciBxdWVyeVJvb3QgPSByb290Tm9kZTtcblxuICAgIHdoaWxlIChxdWVyeVJvb3QucGFyZW50Tm9kZSkge1xuICAgICAgcXVlcnlSb290ID0gcXVlcnlSb290LnBhcmVudE5vZGU7XG4gICAgfVxuXG4gICAgLy8gSWYgYHJvb3ROb2RlLmZvcm1gIHdhcyBub24tbnVsbCwgdGhlbiB3ZSBjb3VsZCB0cnkgYGZvcm0uZWxlbWVudHNgLFxuICAgIC8vIGJ1dCB0aGF0IHNvbWV0aW1lcyBiZWhhdmVzIHN0cmFuZ2VseSBpbiBJRTguIFdlIGNvdWxkIGFsc28gdHJ5IHVzaW5nXG4gICAgLy8gYGZvcm0uZ2V0RWxlbWVudHNCeU5hbWVgLCBidXQgdGhhdCB3aWxsIG9ubHkgcmV0dXJuIGRpcmVjdCBjaGlsZHJlblxuICAgIC8vIGFuZCB3b24ndCBpbmNsdWRlIGlucHV0cyB0aGF0IHVzZSB0aGUgSFRNTDUgYGZvcm09YCBhdHRyaWJ1dGUuIFNpbmNlXG4gICAgLy8gdGhlIGlucHV0IG1pZ2h0IG5vdCBldmVuIGJlIGluIGEgZm9ybS4gSXQgbWlnaHQgbm90IGV2ZW4gYmUgaW4gdGhlXG4gICAgLy8gZG9jdW1lbnQuIExldCdzIGp1c3QgdXNlIHRoZSBsb2NhbCBgcXVlcnlTZWxlY3RvckFsbGAgdG8gZW5zdXJlIHdlIGRvbid0XG4gICAgLy8gbWlzcyBhbnl0aGluZy5cbiAgICB2YXIgZ3JvdXAgPSBxdWVyeVJvb3QucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbbmFtZT0nICsgSlNPTi5zdHJpbmdpZnkoJycgKyBuYW1lKSArICddW3R5cGU9XCJyYWRpb1wiXScpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG90aGVyTm9kZSA9IGdyb3VwW2ldO1xuICAgICAgaWYgKG90aGVyTm9kZSA9PT0gcm9vdE5vZGUgfHwgb3RoZXJOb2RlLmZvcm0gIT09IHJvb3ROb2RlLmZvcm0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgaWYgcmFkaW8gYnV0dG9ucyByZW5kZXJlZCBieSBkaWZmZXJlbnQgY29waWVzIG9mIFJlYWN0XG4gICAgICAvLyBhbmQgdGhlIHNhbWUgbmFtZSBhcmUgcmVuZGVyZWQgaW50byB0aGUgc2FtZSBmb3JtIChzYW1lIGFzICMxOTM5KS5cbiAgICAgIC8vIFRoYXQncyBwcm9iYWJseSBva2F5OyB3ZSBkb24ndCBzdXBwb3J0IGl0IGp1c3QgYXMgd2UgZG9uJ3Qgc3VwcG9ydFxuICAgICAgLy8gbWl4aW5nIFJlYWN0IHJhZGlvIGJ1dHRvbnMgd2l0aCBub24tUmVhY3Qgb25lcy5cbiAgICAgIHZhciBvdGhlclByb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZSQxKG90aGVyTm9kZSk7XG4gICAgICAhb3RoZXJQcm9wcyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0RE9NSW5wdXQ6IE1peGluZyBSZWFjdCBhbmQgbm9uLVJlYWN0IHJhZGlvIGlucHV0cyB3aXRoIHRoZSBzYW1lIGBuYW1lYCBpcyBub3Qgc3VwcG9ydGVkLicpIDogdm9pZCAwO1xuXG4gICAgICAvLyBXZSBuZWVkIHVwZGF0ZSB0aGUgdHJhY2tlZCB2YWx1ZSBvbiB0aGUgbmFtZWQgY291c2luIHNpbmNlIHRoZSB2YWx1ZVxuICAgICAgLy8gd2FzIGNoYW5nZWQgYnV0IHRoZSBpbnB1dCBzYXcgbm8gZXZlbnQgb3IgdmFsdWUgc2V0XG4gICAgICB1cGRhdGVWYWx1ZUlmQ2hhbmdlZChvdGhlck5vZGUpO1xuXG4gICAgICAvLyBJZiB0aGlzIGlzIGEgY29udHJvbGxlZCByYWRpbyBidXR0b24gZ3JvdXAsIGZvcmNpbmcgdGhlIGlucHV0IHRoYXRcbiAgICAgIC8vIHdhcyBwcmV2aW91c2x5IGNoZWNrZWQgdG8gdXBkYXRlIHdpbGwgY2F1c2UgaXQgdG8gYmUgY29tZSByZS1jaGVja2VkXG4gICAgICAvLyBhcyBhcHByb3ByaWF0ZS5cbiAgICAgIHVwZGF0ZVdyYXBwZXIob3RoZXJOb2RlLCBvdGhlclByb3BzKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gSW4gQ2hyb21lLCBhc3NpZ25pbmcgZGVmYXVsdFZhbHVlIHRvIGNlcnRhaW4gaW5wdXQgdHlwZXMgdHJpZ2dlcnMgaW5wdXQgdmFsaWRhdGlvbi5cbi8vIEZvciBudW1iZXIgaW5wdXRzLCB0aGUgZGlzcGxheSB2YWx1ZSBsb3NlcyB0cmFpbGluZyBkZWNpbWFsIHBvaW50cy4gRm9yIGVtYWlsIGlucHV0cyxcbi8vIENocm9tZSByYWlzZXMgXCJUaGUgc3BlY2lmaWVkIHZhbHVlIDx4PiBpcyBub3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzXCIuXG4vL1xuLy8gSGVyZSB3ZSBjaGVjayB0byBzZWUgaWYgdGhlIGRlZmF1bHRWYWx1ZSBoYXMgYWN0dWFsbHkgY2hhbmdlZCwgYXZvaWRpbmcgdGhlc2UgcHJvYmxlbXNcbi8vIHdoZW4gdGhlIHVzZXIgaXMgaW5wdXR0aW5nIHRleHRcbi8vXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyNTNcbmZ1bmN0aW9uIHNldERlZmF1bHRWYWx1ZShub2RlLCB0eXBlLCB2YWx1ZSkge1xuICBpZiAoXG4gIC8vIEZvY3VzZWQgbnVtYmVyIGlucHV0cyBzeW5jaHJvbml6ZSBvbiBibHVyLiBTZWUgQ2hhbmdlRXZlbnRQbHVnaW4uanNcbiAgdHlwZSAhPT0gJ251bWJlcicgfHwgbm9kZS5vd25lckRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IG5vZGUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSB0b1N0cmluZyhub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUuZGVmYXVsdFZhbHVlICE9PSB0b1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZXZlbnRUeXBlcyQxID0ge1xuICBjaGFuZ2U6IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogJ29uQ2hhbmdlJyxcbiAgICAgIGNhcHR1cmVkOiAnb25DaGFuZ2VDYXB0dXJlJ1xuICAgIH0sXG4gICAgZGVwZW5kZW5jaWVzOiBbVE9QX0JMVVIsIFRPUF9DSEFOR0UsIFRPUF9DTElDSywgVE9QX0ZPQ1VTLCBUT1BfSU5QVVQsIFRPUF9LRVlfRE9XTiwgVE9QX0tFWV9VUCwgVE9QX1NFTEVDVElPTl9DSEFOR0VdXG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChpbnN0LCBuYXRpdmVFdmVudCwgdGFyZ2V0KSB7XG4gIHZhciBldmVudCA9IFN5bnRoZXRpY0V2ZW50LmdldFBvb2xlZChldmVudFR5cGVzJDEuY2hhbmdlLCBpbnN0LCBuYXRpdmVFdmVudCwgdGFyZ2V0KTtcbiAgZXZlbnQudHlwZSA9ICdjaGFuZ2UnO1xuICAvLyBGbGFnIHRoaXMgZXZlbnQgbG9vcCBhcyBuZWVkaW5nIHN0YXRlIHJlc3RvcmUuXG4gIGVucXVldWVTdGF0ZVJlc3RvcmUodGFyZ2V0KTtcbiAgYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhldmVudCk7XG4gIHJldHVybiBldmVudDtcbn1cbi8qKlxuICogRm9yIElFIHNoaW1zXG4gKi9cbnZhciBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG5cbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBjaGFuZ2VgIGV2ZW50XG4gKi9cbmZ1bmN0aW9uIHNob3VsZFVzZUNoYW5nZUV2ZW50KGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBub2RlTmFtZSA9PT0gJ3NlbGVjdCcgfHwgbm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgZWxlbS50eXBlID09PSAnZmlsZSc7XG59XG5cbmZ1bmN0aW9uIG1hbnVhbERpc3BhdGNoQ2hhbmdlRXZlbnQobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGV2ZW50ID0gY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGFjdGl2ZUVsZW1lbnRJbnN0LCBuYXRpdmVFdmVudCwgZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpKTtcblxuICAvLyBJZiBjaGFuZ2UgYW5kIHByb3BlcnR5Y2hhbmdlIGJ1YmJsZWQsIHdlJ2QganVzdCBiaW5kIHRvIGl0IGxpa2UgYWxsIHRoZVxuICAvLyBvdGhlciBldmVudHMgYW5kIGhhdmUgaXQgZ28gdGhyb3VnaCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuIFNpbmNlIGl0XG4gIC8vIGRvZXNuJ3QsIHdlIG1hbnVhbGx5IGxpc3RlbiBmb3IgdGhlIGV2ZW50cyBhbmQgc28gd2UgaGF2ZSB0byBlbnF1ZXVlIGFuZFxuICAvLyBwcm9jZXNzIHRoZSBhYnN0cmFjdCBldmVudCBtYW51YWxseS5cbiAgLy9cbiAgLy8gQmF0Y2hpbmcgaXMgbmVjZXNzYXJ5IGhlcmUgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgYWxsIGV2ZW50IGhhbmRsZXJzIHJ1blxuICAvLyBiZWZvcmUgdGhlIG5leHQgcmVyZW5kZXIgKGluY2x1ZGluZyBldmVudCBoYW5kbGVycyBhdHRhY2hlZCB0byBhbmNlc3RvclxuICAvLyBlbGVtZW50cyBpbnN0ZWFkIG9mIGRpcmVjdGx5IG9uIHRoZSBpbnB1dCkuIFdpdGhvdXQgdGhpcywgY29udHJvbGxlZFxuICAvLyBjb21wb25lbnRzIGRvbid0IHdvcmsgcHJvcGVybHkgaW4gY29uanVuY3Rpb24gd2l0aCBldmVudCBidWJibGluZyBiZWNhdXNlXG4gIC8vIHRoZSBjb21wb25lbnQgaXMgcmVyZW5kZXJlZCBhbmQgdGhlIHZhbHVlIHJldmVydGVkIGJlZm9yZSBhbGwgdGhlIGV2ZW50XG4gIC8vIGhhbmRsZXJzIGNhbiBydW4uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcwOC5cbiAgYmF0Y2hlZFVwZGF0ZXMocnVuRXZlbnRJbkJhdGNoLCBldmVudCk7XG59XG5cbmZ1bmN0aW9uIHJ1bkV2ZW50SW5CYXRjaChldmVudCkge1xuICBydW5FdmVudHNJbkJhdGNoKGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpIHtcbiAgdmFyIHRhcmdldE5vZGUgPSBnZXROb2RlRnJvbUluc3RhbmNlJDEodGFyZ2V0SW5zdCk7XG4gIGlmICh1cGRhdGVWYWx1ZUlmQ2hhbmdlZCh0YXJnZXROb2RlKSkge1xuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudCh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QpIHtcbiAgaWYgKHRvcExldmVsVHlwZSA9PT0gVE9QX0NIQU5HRSkge1xuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG5cbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBpbnB1dGAgZXZlbnRcbiAqL1xudmFyIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGZhbHNlO1xuaWYgKGNhblVzZURPTSkge1xuICAvLyBJRTkgY2xhaW1zIHRvIHN1cHBvcnQgdGhlIGlucHV0IGV2ZW50IGJ1dCBmYWlscyB0byB0cmlnZ2VyIGl0IHdoZW5cbiAgLy8gZGVsZXRpbmcgdGV4dCwgc28gd2UgaWdub3JlIGl0cyBpbnB1dCBldmVudHMuXG4gIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGlzRXZlbnRTdXBwb3J0ZWQoJ2lucHV0JykgJiYgKCFkb2N1bWVudC5kb2N1bWVudE1vZGUgfHwgZG9jdW1lbnQuZG9jdW1lbnRNb2RlID4gOSk7XG59XG5cbi8qKlxuICogKEZvciBJRSA8PTkpIFN0YXJ0cyB0cmFja2luZyBwcm9wZXJ0eWNoYW5nZSBldmVudHMgb24gdGhlIHBhc3NlZC1pbiBlbGVtZW50XG4gKiBhbmQgb3ZlcnJpZGUgdGhlIHZhbHVlIHByb3BlcnR5IHNvIHRoYXQgd2UgY2FuIGRpc3Rpbmd1aXNoIHVzZXIgZXZlbnRzIGZyb21cbiAqIHZhbHVlIGNoYW5nZXMgaW4gSlMuXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0V2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSh0YXJnZXQsIHRhcmdldEluc3QpIHtcbiAgYWN0aXZlRWxlbWVudCA9IHRhcmdldDtcbiAgYWN0aXZlRWxlbWVudEluc3QgPSB0YXJnZXRJbnN0O1xuICBhY3RpdmVFbGVtZW50LmF0dGFjaEV2ZW50KCdvbnByb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UpO1xufVxuXG4vKipcbiAqIChGb3IgSUUgPD05KSBSZW1vdmVzIHRoZSBldmVudCBsaXN0ZW5lcnMgZnJvbSB0aGUgY3VycmVudGx5LXRyYWNrZWQgZWxlbWVudCxcbiAqIGlmIGFueSBleGlzdHMuXG4gKi9cbmZ1bmN0aW9uIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCkge1xuICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYWN0aXZlRWxlbWVudC5kZXRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTtcbiAgYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbn1cblxuLyoqXG4gKiAoRm9yIElFIDw9OSkgSGFuZGxlcyBhIHByb3BlcnR5Y2hhbmdlIGV2ZW50LCBzZW5kaW5nIGEgYGNoYW5nZWAgZXZlbnQgaWZcbiAqIHRoZSB2YWx1ZSBvZiB0aGUgYWN0aXZlIGVsZW1lbnQgaGFzIGNoYW5nZWQuXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZVByb3BlcnR5Q2hhbmdlKG5hdGl2ZUV2ZW50KSB7XG4gIGlmIChuYXRpdmVFdmVudC5wcm9wZXJ0eU5hbWUgIT09ICd2YWx1ZScpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGdldEluc3RJZlZhbHVlQ2hhbmdlZChhY3RpdmVFbGVtZW50SW5zdCkpIHtcbiAgICBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KG5hdGl2ZUV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVFdmVudHNGb3JJbnB1dEV2ZW50UG9seWZpbGwodG9wTGV2ZWxUeXBlLCB0YXJnZXQsIHRhcmdldEluc3QpIHtcbiAgaWYgKHRvcExldmVsVHlwZSA9PT0gVE9QX0ZPQ1VTKSB7XG4gICAgLy8gSW4gSUU5LCBwcm9wZXJ0eWNoYW5nZSBmaXJlcyBmb3IgbW9zdCBpbnB1dCBldmVudHMgYnV0IGlzIGJ1Z2d5IGFuZFxuICAgIC8vIGRvZXNuJ3QgZmlyZSB3aGVuIHRleHQgaXMgZGVsZXRlZCwgYnV0IGNvbnZlbmllbnRseSwgc2VsZWN0aW9uY2hhbmdlXG4gICAgLy8gYXBwZWFycyB0byBmaXJlIGluIGFsbCBvZiB0aGUgcmVtYWluaW5nIGNhc2VzIHNvIHdlIGNhdGNoIHRob3NlIGFuZFxuICAgIC8vIGZvcndhcmQgdGhlIGV2ZW50IGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZFxuICAgIC8vIEluIGVpdGhlciBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIGNhbGwgdGhlIGV2ZW50IGhhbmRsZXIgaWYgdGhlIHZhbHVlXG4gICAgLy8gaXMgY2hhbmdlZCBmcm9tIEpTIHNvIHdlIHJlZGVmaW5lIGEgc2V0dGVyIGZvciBgLnZhbHVlYCB0aGF0IHVwZGF0ZXNcbiAgICAvLyBvdXIgYWN0aXZlRWxlbWVudFZhbHVlIHZhcmlhYmxlLCBhbGxvd2luZyB1cyB0byBpZ25vcmUgdGhvc2UgY2hhbmdlc1xuICAgIC8vXG4gICAgLy8gc3RvcFdhdGNoaW5nKCkgc2hvdWxkIGJlIGEgbm9vcCBoZXJlIGJ1dCB3ZSBjYWxsIGl0IGp1c3QgaW4gY2FzZSB3ZVxuICAgIC8vIG1pc3NlZCBhIGJsdXIgZXZlbnQgc29tZWhvdy5cbiAgICBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpO1xuICAgIHN0YXJ0V2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSh0YXJnZXQsIHRhcmdldEluc3QpO1xuICB9IGVsc2UgaWYgKHRvcExldmVsVHlwZSA9PT0gVE9QX0JMVVIpIHtcbiAgICBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpO1xuICB9XG59XG5cbi8vIEZvciBJRTggYW5kIElFOS5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50UG9seWZpbGwodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0KSB7XG4gIGlmICh0b3BMZXZlbFR5cGUgPT09IFRPUF9TRUxFQ1RJT05fQ0hBTkdFIHx8IHRvcExldmVsVHlwZSA9PT0gVE9QX0tFWV9VUCB8fCB0b3BMZXZlbFR5cGUgPT09IFRPUF9LRVlfRE9XTikge1xuICAgIC8vIE9uIHRoZSBzZWxlY3Rpb25jaGFuZ2UgZXZlbnQsIHRoZSB0YXJnZXQgaXMganVzdCBkb2N1bWVudCB3aGljaCBpc24ndFxuICAgIC8vIGhlbHBmdWwgZm9yIHVzIHNvIGp1c3QgY2hlY2sgYWN0aXZlRWxlbWVudCBpbnN0ZWFkLlxuICAgIC8vXG4gICAgLy8gOTklIG9mIHRoZSB0aW1lLCBrZXlkb3duIGFuZCBrZXl1cCBhcmVuJ3QgbmVjZXNzYXJ5LiBJRTggZmFpbHMgdG8gZmlyZVxuICAgIC8vIHByb3BlcnR5Y2hhbmdlIG9uIHRoZSBmaXJzdCBpbnB1dCBldmVudCBhZnRlciBzZXR0aW5nIGB2YWx1ZWAgZnJvbSBhXG4gICAgLy8gc2NyaXB0IGFuZCBmaXJlcyBvbmx5IGtleWRvd24sIGtleXByZXNzLCBrZXl1cC4gQ2F0Y2hpbmcga2V5dXAgdXN1YWxseVxuICAgIC8vIGdldHMgaXQgYW5kIGNhdGNoaW5nIGtleWRvd24gbGV0cyB1cyBmaXJlIGFuIGV2ZW50IGZvciB0aGUgZmlyc3RcbiAgICAvLyBrZXlzdHJva2UgaWYgdXNlciBkb2VzIGEga2V5IHJlcGVhdCAoaXQnbGwgYmUgYSBsaXR0bGUgZGVsYXllZDogcmlnaHRcbiAgICAvLyBiZWZvcmUgdGhlIHNlY29uZCBrZXlzdHJva2UpLiBPdGhlciBpbnB1dCBtZXRob2RzIChlLmcuLCBwYXN0ZSkgc2VlbSB0b1xuICAgIC8vIGZpcmUgc2VsZWN0aW9uY2hhbmdlIG5vcm1hbGx5LlxuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQoYWN0aXZlRWxlbWVudEluc3QpO1xuICB9XG59XG5cbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBjbGlja2AgZXZlbnRcbiAqL1xuZnVuY3Rpb24gc2hvdWxkVXNlQ2xpY2tFdmVudChlbGVtKSB7XG4gIC8vIFVzZSB0aGUgYGNsaWNrYCBldmVudCB0byBkZXRlY3QgY2hhbmdlcyB0byBjaGVja2JveCBhbmQgcmFkaW8gaW5wdXRzLlxuICAvLyBUaGlzIGFwcHJvYWNoIHdvcmtzIGFjcm9zcyBhbGwgYnJvd3NlcnMsIHdoZXJlYXMgYGNoYW5nZWAgZG9lcyBub3QgZmlyZVxuICAvLyB1bnRpbCBgYmx1cmAgaW4gSUU4LlxuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lO1xuICByZXR1cm4gbm9kZU5hbWUgJiYgbm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiAoZWxlbS50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW0udHlwZSA9PT0gJ3JhZGlvJyk7XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JDbGlja0V2ZW50KHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAodG9wTGV2ZWxUeXBlID09PSBUT1BfQ0xJQ0spIHtcbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0KSB7XG4gIGlmICh0b3BMZXZlbFR5cGUgPT09IFRPUF9JTlBVVCB8fCB0b3BMZXZlbFR5cGUgPT09IFRPUF9DSEFOR0UpIHtcbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUNvbnRyb2xsZWRJbnB1dEJsdXIobm9kZSkge1xuICB2YXIgc3RhdGUgPSBub2RlLl93cmFwcGVyU3RhdGU7XG5cbiAgaWYgKCFzdGF0ZSB8fCAhc3RhdGUuY29udHJvbGxlZCB8fCBub2RlLnR5cGUgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFkaXNhYmxlSW5wdXRBdHRyaWJ1dGVTeW5jaW5nKSB7XG4gICAgLy8gSWYgY29udHJvbGxlZCwgYXNzaWduIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb24gYmx1clxuICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCAnbnVtYmVyJywgbm9kZS52YWx1ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIHBsdWdpbiBjcmVhdGVzIGFuIGBvbkNoYW5nZWAgZXZlbnQgdGhhdCBub3JtYWxpemVzIGNoYW5nZSBldmVudHNcbiAqIGFjcm9zcyBmb3JtIGVsZW1lbnRzLiBUaGlzIGV2ZW50IGZpcmVzIGF0IGEgdGltZSB3aGVuIGl0J3MgcG9zc2libGUgdG9cbiAqIGNoYW5nZSB0aGUgZWxlbWVudCdzIHZhbHVlIHdpdGhvdXQgc2VlaW5nIGEgZmxpY2tlci5cbiAqXG4gKiBTdXBwb3J0ZWQgZWxlbWVudHMgYXJlOlxuICogLSBpbnB1dCAoc2VlIGBpc1RleHRJbnB1dEVsZW1lbnRgKVxuICogLSB0ZXh0YXJlYVxuICogLSBzZWxlY3RcbiAqL1xudmFyIENoYW5nZUV2ZW50UGx1Z2luID0ge1xuICBldmVudFR5cGVzOiBldmVudFR5cGVzJDEsXG5cbiAgX2lzSW5wdXRFdmVudFN1cHBvcnRlZDogaXNJbnB1dEV2ZW50U3VwcG9ydGVkLFxuXG4gIGV4dHJhY3RFdmVudHM6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIHZhciB0YXJnZXROb2RlID0gdGFyZ2V0SW5zdCA/IGdldE5vZGVGcm9tSW5zdGFuY2UkMSh0YXJnZXRJbnN0KSA6IHdpbmRvdztcblxuICAgIHZhciBnZXRUYXJnZXRJbnN0RnVuYyA9IHZvaWQgMCxcbiAgICAgICAgaGFuZGxlRXZlbnRGdW5jID0gdm9pZCAwO1xuICAgIGlmIChzaG91bGRVc2VDaGFuZ2VFdmVudCh0YXJnZXROb2RlKSkge1xuICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9yQ2hhbmdlRXZlbnQ7XG4gICAgfSBlbHNlIGlmIChpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICAgIGlmIChpc0lucHV0RXZlbnRTdXBwb3J0ZWQpIHtcbiAgICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRPckNoYW5nZUV2ZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudFBvbHlmaWxsO1xuICAgICAgICBoYW5kbGVFdmVudEZ1bmMgPSBoYW5kbGVFdmVudHNGb3JJbnB1dEV2ZW50UG9seWZpbGw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzaG91bGRVc2VDbGlja0V2ZW50KHRhcmdldE5vZGUpKSB7XG4gICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDbGlja0V2ZW50O1xuICAgIH1cblxuICAgIGlmIChnZXRUYXJnZXRJbnN0RnVuYykge1xuICAgICAgdmFyIGluc3QgPSBnZXRUYXJnZXRJbnN0RnVuYyh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QpO1xuICAgICAgaWYgKGluc3QpIHtcbiAgICAgICAgdmFyIGV2ZW50ID0gY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICAgIHJldHVybiBldmVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFuZGxlRXZlbnRGdW5jKSB7XG4gICAgICBoYW5kbGVFdmVudEZ1bmModG9wTGV2ZWxUeXBlLCB0YXJnZXROb2RlLCB0YXJnZXRJbnN0KTtcbiAgICB9XG5cbiAgICAvLyBXaGVuIGJsdXJyaW5nLCBzZXQgdGhlIHZhbHVlIGF0dHJpYnV0ZSBmb3IgbnVtYmVyIGlucHV0c1xuICAgIGlmICh0b3BMZXZlbFR5cGUgPT09IFRPUF9CTFVSKSB7XG4gICAgICBoYW5kbGVDb250cm9sbGVkSW5wdXRCbHVyKHRhcmdldE5vZGUpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBNb2R1bGUgdGhhdCBpcyBpbmplY3RhYmxlIGludG8gYEV2ZW50UGx1Z2luSHViYCwgdGhhdCBzcGVjaWZpZXMgYVxuICogZGV0ZXJtaW5pc3RpYyBvcmRlcmluZyBvZiBgRXZlbnRQbHVnaW5gcy4gQSBjb252ZW5pZW50IHdheSB0byByZWFzb24gYWJvdXRcbiAqIHBsdWdpbnMsIHdpdGhvdXQgaGF2aW5nIHRvIHBhY2thZ2UgZXZlcnkgb25lIG9mIHRoZW0uIFRoaXMgaXMgYmV0dGVyIHRoYW5cbiAqIGhhdmluZyBwbHVnaW5zIGJlIG9yZGVyZWQgaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCB0aGV5IGFyZSBpbmplY3RlZCBiZWNhdXNlXG4gKiB0aGF0IG9yZGVyaW5nIHdvdWxkIGJlIGluZmx1ZW5jZWQgYnkgdGhlIHBhY2thZ2luZyBvcmRlci5cbiAqIGBSZXNwb25kZXJFdmVudFBsdWdpbmAgbXVzdCBvY2N1ciBiZWZvcmUgYFNpbXBsZUV2ZW50UGx1Z2luYCBzbyB0aGF0XG4gKiBwcmV2ZW50aW5nIGRlZmF1bHQgb24gZXZlbnRzIGlzIGNvbnZlbmllbnQgaW4gYFNpbXBsZUV2ZW50UGx1Z2luYCBoYW5kbGVycy5cbiAqL1xudmFyIERPTUV2ZW50UGx1Z2luT3JkZXIgPSBbJ1Jlc3BvbmRlckV2ZW50UGx1Z2luJywgJ1NpbXBsZUV2ZW50UGx1Z2luJywgJ0VudGVyTGVhdmVFdmVudFBsdWdpbicsICdDaGFuZ2VFdmVudFBsdWdpbicsICdTZWxlY3RFdmVudFBsdWdpbicsICdCZWZvcmVJbnB1dEV2ZW50UGx1Z2luJ107XG5cbnZhciBTeW50aGV0aWNVSUV2ZW50ID0gU3ludGhldGljRXZlbnQuZXh0ZW5kKHtcbiAgdmlldzogbnVsbCxcbiAgZGV0YWlsOiBudWxsXG59KTtcblxudmFyIG1vZGlmaWVyS2V5VG9Qcm9wID0ge1xuICBBbHQ6ICdhbHRLZXknLFxuICBDb250cm9sOiAnY3RybEtleScsXG4gIE1ldGE6ICdtZXRhS2V5JyxcbiAgU2hpZnQ6ICdzaGlmdEtleSdcbn07XG5cbi8vIE9sZGVyIGJyb3dzZXJzIChTYWZhcmkgPD0gMTAsIGlPUyBTYWZhcmkgPD0gMTAuMikgZG8gbm90IHN1cHBvcnRcbi8vIGdldE1vZGlmaWVyU3RhdGUuIElmIGdldE1vZGlmaWVyU3RhdGUgaXMgbm90IHN1cHBvcnRlZCwgd2UgbWFwIGl0IHRvIGEgc2V0IG9mXG4vLyBtb2RpZmllciBrZXlzIGV4cG9zZWQgYnkgdGhlIGV2ZW50LiBJbiB0aGlzIGNhc2UsIExvY2sta2V5cyBhcmUgbm90IHN1cHBvcnRlZC5cbi8qKlxuICogVHJhbnNsYXRpb24gZnJvbSBtb2RpZmllciBrZXkgdG8gdGhlIGFzc29jaWF0ZWQgcHJvcGVydHkgaW4gdGhlIGV2ZW50LlxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2tleXMtTW9kaWZpZXJzXG4gKi9cblxuZnVuY3Rpb24gbW9kaWZpZXJTdGF0ZUdldHRlcihrZXlBcmcpIHtcbiAgdmFyIHN5bnRoZXRpY0V2ZW50ID0gdGhpcztcbiAgdmFyIG5hdGl2ZUV2ZW50ID0gc3ludGhldGljRXZlbnQubmF0aXZlRXZlbnQ7XG4gIGlmIChuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0YXRlKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUoa2V5QXJnKTtcbiAgfVxuICB2YXIga2V5UHJvcCA9IG1vZGlmaWVyS2V5VG9Qcm9wW2tleUFyZ107XG4gIHJldHVybiBrZXlQcm9wID8gISFuYXRpdmVFdmVudFtrZXlQcm9wXSA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudE1vZGlmaWVyU3RhdGUobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIG1vZGlmaWVyU3RhdGVHZXR0ZXI7XG59XG5cbnZhciBwcmV2aW91c1NjcmVlblggPSAwO1xudmFyIHByZXZpb3VzU2NyZWVuWSA9IDA7XG4vLyBVc2UgZmxhZ3MgdG8gc2lnbmFsIG1vdmVtZW50WC9ZIGhhcyBhbHJlYWR5IGJlZW4gc2V0XG52YXIgaXNNb3ZlbWVudFhTZXQgPSBmYWxzZTtcbnZhciBpc01vdmVtZW50WVNldCA9IGZhbHNlO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgTW91c2VFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cbnZhciBTeW50aGV0aWNNb3VzZUV2ZW50ID0gU3ludGhldGljVUlFdmVudC5leHRlbmQoe1xuICBzY3JlZW5YOiBudWxsLFxuICBzY3JlZW5ZOiBudWxsLFxuICBjbGllbnRYOiBudWxsLFxuICBjbGllbnRZOiBudWxsLFxuICBwYWdlWDogbnVsbCxcbiAgcGFnZVk6IG51bGwsXG4gIGN0cmxLZXk6IG51bGwsXG4gIHNoaWZ0S2V5OiBudWxsLFxuICBhbHRLZXk6IG51bGwsXG4gIG1ldGFLZXk6IG51bGwsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgYnV0dG9uOiBudWxsLFxuICBidXR0b25zOiBudWxsLFxuICByZWxhdGVkVGFyZ2V0OiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQucmVsYXRlZFRhcmdldCB8fCAoZXZlbnQuZnJvbUVsZW1lbnQgPT09IGV2ZW50LnNyY0VsZW1lbnQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudCk7XG4gIH0sXG4gIG1vdmVtZW50WDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKCdtb3ZlbWVudFgnIGluIGV2ZW50KSB7XG4gICAgICByZXR1cm4gZXZlbnQubW92ZW1lbnRYO1xuICAgIH1cblxuICAgIHZhciBzY3JlZW5YID0gcHJldmlvdXNTY3JlZW5YO1xuICAgIHByZXZpb3VzU2NyZWVuWCA9IGV2ZW50LnNjcmVlblg7XG5cbiAgICBpZiAoIWlzTW92ZW1lbnRYU2V0KSB7XG4gICAgICBpc01vdmVtZW50WFNldCA9IHRydWU7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gZXZlbnQudHlwZSA9PT0gJ21vdXNlbW92ZScgPyBldmVudC5zY3JlZW5YIC0gc2NyZWVuWCA6IDA7XG4gIH0sXG4gIG1vdmVtZW50WTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKCdtb3ZlbWVudFknIGluIGV2ZW50KSB7XG4gICAgICByZXR1cm4gZXZlbnQubW92ZW1lbnRZO1xuICAgIH1cblxuICAgIHZhciBzY3JlZW5ZID0gcHJldmlvdXNTY3JlZW5ZO1xuICAgIHByZXZpb3VzU2NyZWVuWSA9IGV2ZW50LnNjcmVlblk7XG5cbiAgICBpZiAoIWlzTW92ZW1lbnRZU2V0KSB7XG4gICAgICBpc01vdmVtZW50WVNldCA9IHRydWU7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gZXZlbnQudHlwZSA9PT0gJ21vdXNlbW92ZScgPyBldmVudC5zY3JlZW5ZIC0gc2NyZWVuWSA6IDA7XG4gIH1cbn0pO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgUG9pbnRlckV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3BvaW50ZXJldmVudHMvXG4gKi9cbnZhciBTeW50aGV0aWNQb2ludGVyRXZlbnQgPSBTeW50aGV0aWNNb3VzZUV2ZW50LmV4dGVuZCh7XG4gIHBvaW50ZXJJZDogbnVsbCxcbiAgd2lkdGg6IG51bGwsXG4gIGhlaWdodDogbnVsbCxcbiAgcHJlc3N1cmU6IG51bGwsXG4gIHRhbmdlbnRpYWxQcmVzc3VyZTogbnVsbCxcbiAgdGlsdFg6IG51bGwsXG4gIHRpbHRZOiBudWxsLFxuICB0d2lzdDogbnVsbCxcbiAgcG9pbnRlclR5cGU6IG51bGwsXG4gIGlzUHJpbWFyeTogbnVsbFxufSk7XG5cbnZhciBldmVudFR5cGVzJDIgPSB7XG4gIG1vdXNlRW50ZXI6IHtcbiAgICByZWdpc3RyYXRpb25OYW1lOiAnb25Nb3VzZUVudGVyJyxcbiAgICBkZXBlbmRlbmNpZXM6IFtUT1BfTU9VU0VfT1VULCBUT1BfTU9VU0VfT1ZFUl1cbiAgfSxcbiAgbW91c2VMZWF2ZToge1xuICAgIHJlZ2lzdHJhdGlvbk5hbWU6ICdvbk1vdXNlTGVhdmUnLFxuICAgIGRlcGVuZGVuY2llczogW1RPUF9NT1VTRV9PVVQsIFRPUF9NT1VTRV9PVkVSXVxuICB9LFxuICBwb2ludGVyRW50ZXI6IHtcbiAgICByZWdpc3RyYXRpb25OYW1lOiAnb25Qb2ludGVyRW50ZXInLFxuICAgIGRlcGVuZGVuY2llczogW1RPUF9QT0lOVEVSX09VVCwgVE9QX1BPSU5URVJfT1ZFUl1cbiAgfSxcbiAgcG9pbnRlckxlYXZlOiB7XG4gICAgcmVnaXN0cmF0aW9uTmFtZTogJ29uUG9pbnRlckxlYXZlJyxcbiAgICBkZXBlbmRlbmNpZXM6IFtUT1BfUE9JTlRFUl9PVVQsIFRPUF9QT0lOVEVSX09WRVJdXG4gIH1cbn07XG5cbnZhciBFbnRlckxlYXZlRXZlbnRQbHVnaW4gPSB7XG4gIGV2ZW50VHlwZXM6IGV2ZW50VHlwZXMkMixcblxuICAvKipcbiAgICogRm9yIGFsbW9zdCBldmVyeSBpbnRlcmFjdGlvbiB3ZSBjYXJlIGFib3V0LCB0aGVyZSB3aWxsIGJlIGJvdGggYSB0b3AtbGV2ZWxcbiAgICogYG1vdXNlb3ZlcmAgYW5kIGBtb3VzZW91dGAgZXZlbnQgdGhhdCBvY2N1cnMuIE9ubHkgdXNlIGBtb3VzZW91dGAgc28gdGhhdFxuICAgKiB3ZSBkbyBub3QgZXh0cmFjdCBkdXBsaWNhdGUgZXZlbnRzLiBIb3dldmVyLCBtb3ZpbmcgdGhlIG1vdXNlIGludG8gdGhlXG4gICAqIGJyb3dzZXIgZnJvbSBvdXRzaWRlIHdpbGwgbm90IGZpcmUgYSBgbW91c2VvdXRgIGV2ZW50LiBJbiB0aGlzIGNhc2UsIHdlIHVzZVxuICAgKiB0aGUgYG1vdXNlb3ZlcmAgdG9wLWxldmVsIGV2ZW50LlxuICAgKi9cbiAgZXh0cmFjdEV2ZW50czogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgdmFyIGlzT3ZlckV2ZW50ID0gdG9wTGV2ZWxUeXBlID09PSBUT1BfTU9VU0VfT1ZFUiB8fCB0b3BMZXZlbFR5cGUgPT09IFRPUF9QT0lOVEVSX09WRVI7XG4gICAgdmFyIGlzT3V0RXZlbnQgPSB0b3BMZXZlbFR5cGUgPT09IFRPUF9NT1VTRV9PVVQgfHwgdG9wTGV2ZWxUeXBlID09PSBUT1BfUE9JTlRFUl9PVVQ7XG5cbiAgICBpZiAoaXNPdmVyRXZlbnQgJiYgKG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQuZnJvbUVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIWlzT3V0RXZlbnQgJiYgIWlzT3ZlckV2ZW50KSB7XG4gICAgICAvLyBNdXN0IG5vdCBiZSBhIG1vdXNlIG9yIHBvaW50ZXIgaW4gb3Igb3V0IC0gaWdub3JpbmcuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgd2luID0gdm9pZCAwO1xuICAgIGlmIChuYXRpdmVFdmVudFRhcmdldC53aW5kb3cgPT09IG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgICAvLyBgbmF0aXZlRXZlbnRUYXJnZXRgIGlzIHByb2JhYmx5IGEgd2luZG93IG9iamVjdC5cbiAgICAgIHdpbiA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoeSBgb3duZXJEb2N1bWVudGAgaXMgc29tZXRpbWVzIHVuZGVmaW5lZCBpbiBJRTguXG4gICAgICB2YXIgZG9jID0gbmF0aXZlRXZlbnRUYXJnZXQub3duZXJEb2N1bWVudDtcbiAgICAgIGlmIChkb2MpIHtcbiAgICAgICAgd2luID0gZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3c7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW4gPSB3aW5kb3c7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGZyb20gPSB2b2lkIDA7XG4gICAgdmFyIHRvID0gdm9pZCAwO1xuICAgIGlmIChpc091dEV2ZW50KSB7XG4gICAgICBmcm9tID0gdGFyZ2V0SW5zdDtcbiAgICAgIHZhciByZWxhdGVkID0gbmF0aXZlRXZlbnQucmVsYXRlZFRhcmdldCB8fCBuYXRpdmVFdmVudC50b0VsZW1lbnQ7XG4gICAgICB0byA9IHJlbGF0ZWQgPyBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShyZWxhdGVkKSA6IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE1vdmluZyB0byBhIG5vZGUgZnJvbSBvdXRzaWRlIHRoZSB3aW5kb3cuXG4gICAgICBmcm9tID0gbnVsbDtcbiAgICAgIHRvID0gdGFyZ2V0SW5zdDtcbiAgICB9XG5cbiAgICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAgIC8vIE5vdGhpbmcgcGVydGFpbnMgdG8gb3VyIG1hbmFnZWQgY29tcG9uZW50cy5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBldmVudEludGVyZmFjZSA9IHZvaWQgMCxcbiAgICAgICAgbGVhdmVFdmVudFR5cGUgPSB2b2lkIDAsXG4gICAgICAgIGVudGVyRXZlbnRUeXBlID0gdm9pZCAwLFxuICAgICAgICBldmVudFR5cGVQcmVmaXggPSB2b2lkIDA7XG5cbiAgICBpZiAodG9wTGV2ZWxUeXBlID09PSBUT1BfTU9VU0VfT1VUIHx8IHRvcExldmVsVHlwZSA9PT0gVE9QX01PVVNFX09WRVIpIHtcbiAgICAgIGV2ZW50SW50ZXJmYWNlID0gU3ludGhldGljTW91c2VFdmVudDtcbiAgICAgIGxlYXZlRXZlbnRUeXBlID0gZXZlbnRUeXBlcyQyLm1vdXNlTGVhdmU7XG4gICAgICBlbnRlckV2ZW50VHlwZSA9IGV2ZW50VHlwZXMkMi5tb3VzZUVudGVyO1xuICAgICAgZXZlbnRUeXBlUHJlZml4ID0gJ21vdXNlJztcbiAgICB9IGVsc2UgaWYgKHRvcExldmVsVHlwZSA9PT0gVE9QX1BPSU5URVJfT1VUIHx8IHRvcExldmVsVHlwZSA9PT0gVE9QX1BPSU5URVJfT1ZFUikge1xuICAgICAgZXZlbnRJbnRlcmZhY2UgPSBTeW50aGV0aWNQb2ludGVyRXZlbnQ7XG4gICAgICBsZWF2ZUV2ZW50VHlwZSA9IGV2ZW50VHlwZXMkMi5wb2ludGVyTGVhdmU7XG4gICAgICBlbnRlckV2ZW50VHlwZSA9IGV2ZW50VHlwZXMkMi5wb2ludGVyRW50ZXI7XG4gICAgICBldmVudFR5cGVQcmVmaXggPSAncG9pbnRlcic7XG4gICAgfVxuXG4gICAgdmFyIGZyb21Ob2RlID0gZnJvbSA9PSBudWxsID8gd2luIDogZ2V0Tm9kZUZyb21JbnN0YW5jZSQxKGZyb20pO1xuICAgIHZhciB0b05vZGUgPSB0byA9PSBudWxsID8gd2luIDogZ2V0Tm9kZUZyb21JbnN0YW5jZSQxKHRvKTtcblxuICAgIHZhciBsZWF2ZSA9IGV2ZW50SW50ZXJmYWNlLmdldFBvb2xlZChsZWF2ZUV2ZW50VHlwZSwgZnJvbSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBsZWF2ZS50eXBlID0gZXZlbnRUeXBlUHJlZml4ICsgJ2xlYXZlJztcbiAgICBsZWF2ZS50YXJnZXQgPSBmcm9tTm9kZTtcbiAgICBsZWF2ZS5yZWxhdGVkVGFyZ2V0ID0gdG9Ob2RlO1xuXG4gICAgdmFyIGVudGVyID0gZXZlbnRJbnRlcmZhY2UuZ2V0UG9vbGVkKGVudGVyRXZlbnRUeXBlLCB0bywgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBlbnRlci50eXBlID0gZXZlbnRUeXBlUHJlZml4ICsgJ2VudGVyJztcbiAgICBlbnRlci50YXJnZXQgPSB0b05vZGU7XG4gICAgZW50ZXIucmVsYXRlZFRhcmdldCA9IGZyb21Ob2RlO1xuXG4gICAgYWNjdW11bGF0ZUVudGVyTGVhdmVEaXNwYXRjaGVzKGxlYXZlLCBlbnRlciwgZnJvbSwgdG8pO1xuXG4gICAgcmV0dXJuIFtsZWF2ZSwgZW50ZXJdO1xuICB9XG59O1xuXG4vKipcbiAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBvd25cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuICovXG5mdW5jdGlvbiBpcyh4LCB5KSB7XG4gIHJldHVybiB4ID09PSB5ICYmICh4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geSkgfHwgeCAhPT0geCAmJiB5ICE9PSB5IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIDtcbn1cblxudmFyIGhhc093blByb3BlcnR5JDEgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFBlcmZvcm1zIGVxdWFsaXR5IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGtleXMgb24gYW4gb2JqZWN0IGFuZCByZXR1cm5pbmcgZmFsc2VcbiAqIHdoZW4gYW55IGtleSBoYXMgdmFsdWVzIHdoaWNoIGFyZSBub3Qgc3RyaWN0bHkgZXF1YWwgYmV0d2VlbiB0aGUgYXJndW1lbnRzLlxuICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHZhbHVlcyBvZiBhbGwga2V5cyBhcmUgc3RyaWN0bHkgZXF1YWwuXG4gKi9cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gIGlmIChpcyhvYmpBLCBvYmpCKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSAnb2JqZWN0JyB8fCBvYmpBID09PSBudWxsIHx8IHR5cGVvZiBvYmpCICE9PSAnb2JqZWN0JyB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRlc3QgZm9yIEEncyBrZXlzIGRpZmZlcmVudCBmcm9tIEIuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5c0EubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWhhc093blByb3BlcnR5JDEuY2FsbChvYmpCLCBrZXlzQVtpXSkgfHwgIWlzKG9iakFba2V5c0FbaV1dLCBvYmpCW2tleXNBW2ldXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBgUmVhY3RJbnN0YW5jZU1hcGAgbWFpbnRhaW5zIGEgbWFwcGluZyBmcm9tIGEgcHVibGljIGZhY2luZyBzdGF0ZWZ1bFxuICogaW5zdGFuY2UgKGtleSkgYW5kIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAodmFsdWUpLiBUaGlzIGFsbG93cyBwdWJsaWNcbiAqIG1ldGhvZHMgdG8gYWNjZXB0IHRoZSB1c2VyIGZhY2luZyBpbnN0YW5jZSBhcyBhbiBhcmd1bWVudCBhbmQgbWFwIHRoZW0gYmFja1xuICogdG8gaW50ZXJuYWwgbWV0aG9kcy5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBtb2R1bGUgaXMgY3VycmVudGx5IHNoYXJlZCBhbmQgYXNzdW1lZCB0byBiZSBzdGF0ZWxlc3MuXG4gKiBJZiB0aGlzIGJlY29tZXMgYW4gYWN0dWFsIE1hcCwgdGhhdCB3aWxsIGJyZWFrLlxuICovXG5cbi8qKlxuICogVGhpcyBBUEkgc2hvdWxkIGJlIGNhbGxlZCBgZGVsZXRlYCBidXQgd2UnZCBoYXZlIHRvIG1ha2Ugc3VyZSB0byBhbHdheXNcbiAqIHRyYW5zZm9ybSB0aGVzZSB0byBzdHJpbmdzIGZvciBJRSBzdXBwb3J0LiBXaGVuIHRoaXMgdHJhbnNmb3JtIGlzIGZ1bGx5XG4gKiBzdXBwb3J0ZWQgd2UgY2FuIHJlbmFtZSBpdC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldChrZXkpIHtcbiAgcmV0dXJuIGtleS5fcmVhY3RJbnRlcm5hbEZpYmVyO1xufVxuXG5mdW5jdGlvbiBoYXMoa2V5KSB7XG4gIHJldHVybiBrZXkuX3JlYWN0SW50ZXJuYWxGaWJlciAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICBrZXkuX3JlYWN0SW50ZXJuYWxGaWJlciA9IHZhbHVlO1xufVxuXG4vLyBEb24ndCBjaGFuZ2UgdGhlc2UgdHdvIHZhbHVlcy4gVGhleSdyZSB1c2VkIGJ5IFJlYWN0IERldiBUb29scy5cbnZhciBOb0VmZmVjdCA9IC8qICAgICAgICAgICAgICAqLzA7XG52YXIgUGVyZm9ybWVkV29yayA9IC8qICAgICAgICAgKi8xO1xuXG4vLyBZb3UgY2FuIGNoYW5nZSB0aGUgcmVzdCAoYW5kIGFkZCBtb3JlKS5cbnZhciBQbGFjZW1lbnQgPSAvKiAgICAgICAgICAgICAqLzI7XG52YXIgVXBkYXRlID0gLyogICAgICAgICAgICAgICAgKi80O1xudmFyIFBsYWNlbWVudEFuZFVwZGF0ZSA9IC8qICAgICovNjtcbnZhciBEZWxldGlvbiA9IC8qICAgICAgICAgICAgICAqLzg7XG52YXIgQ29udGVudFJlc2V0ID0gLyogICAgICAgICAgKi8xNjtcbnZhciBDYWxsYmFjayA9IC8qICAgICAgICAgICAgICAqLzMyO1xudmFyIERpZENhcHR1cmUgPSAvKiAgICAgICAgICAgICovNjQ7XG52YXIgUmVmID0gLyogICAgICAgICAgICAgICAgICAgKi8xMjg7XG52YXIgU25hcHNob3QgPSAvKiAgICAgICAgICAgICAgKi8yNTY7XG52YXIgUGFzc2l2ZSA9IC8qICAgICAgICAgICAgICAgKi81MTI7XG5cbi8vIFBhc3NpdmUgJiBVcGRhdGUgJiBDYWxsYmFjayAmIFJlZiAmIFNuYXBzaG90XG52YXIgTGlmZWN5Y2xlRWZmZWN0TWFzayA9IC8qICAgKi85MzI7XG5cbi8vIFVuaW9uIG9mIGFsbCBob3N0IGVmZmVjdHNcbnZhciBIb3N0RWZmZWN0TWFzayA9IC8qICAgICAgICAqLzEwMjM7XG5cbnZhciBJbmNvbXBsZXRlID0gLyogICAgICAgICAgICAqLzEwMjQ7XG52YXIgU2hvdWxkQ2FwdHVyZSA9IC8qICAgICAgICAgKi8yMDQ4O1xuXG52YXIgUmVhY3RDdXJyZW50T3duZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xuXG52YXIgTU9VTlRJTkcgPSAxO1xudmFyIE1PVU5URUQgPSAyO1xudmFyIFVOTU9VTlRFRCA9IDM7XG5cbmZ1bmN0aW9uIGlzRmliZXJNb3VudGVkSW1wbChmaWJlcikge1xuICB2YXIgbm9kZSA9IGZpYmVyO1xuICBpZiAoIWZpYmVyLmFsdGVybmF0ZSkge1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIGFsdGVybmF0ZSwgdGhpcyBtaWdodCBiZSBhIG5ldyB0cmVlIHRoYXQgaXNuJ3QgaW5zZXJ0ZWRcbiAgICAvLyB5ZXQuIElmIGl0IGlzLCB0aGVuIGl0IHdpbGwgaGF2ZSBhIHBlbmRpbmcgaW5zZXJ0aW9uIGVmZmVjdCBvbiBpdC5cbiAgICBpZiAoKG5vZGUuZWZmZWN0VGFnICYgUGxhY2VtZW50KSAhPT0gTm9FZmZlY3QpIHtcbiAgICAgIHJldHVybiBNT1VOVElORztcbiAgICB9XG4gICAgd2hpbGUgKG5vZGUucmV0dXJuKSB7XG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICBpZiAoKG5vZGUuZWZmZWN0VGFnICYgUGxhY2VtZW50KSAhPT0gTm9FZmZlY3QpIHtcbiAgICAgICAgcmV0dXJuIE1PVU5USU5HO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAobm9kZS5yZXR1cm4pIHtcbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG4gIH1cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Um9vdCkge1xuICAgIC8vIFRPRE86IENoZWNrIGlmIHRoaXMgd2FzIGEgbmVzdGVkIEhvc3RSb290IHdoZW4gdXNlZCB3aXRoXG4gICAgLy8gcmVuZGVyQ29udGFpbmVySW50b1N1YnRyZWUuXG4gICAgcmV0dXJuIE1PVU5URUQ7XG4gIH1cbiAgLy8gSWYgd2UgZGlkbid0IGhpdCB0aGUgcm9vdCwgdGhhdCBtZWFucyB0aGF0IHdlJ3JlIGluIGFuIGRpc2Nvbm5lY3RlZCB0cmVlXG4gIC8vIHRoYXQgaGFzIGJlZW4gdW5tb3VudGVkLlxuICByZXR1cm4gVU5NT1VOVEVEO1xufVxuXG5mdW5jdGlvbiBpc0ZpYmVyTW91bnRlZChmaWJlcikge1xuICByZXR1cm4gaXNGaWJlck1vdW50ZWRJbXBsKGZpYmVyKSA9PT0gTU9VTlRFRDtcbn1cblxuZnVuY3Rpb24gaXNNb3VudGVkKGNvbXBvbmVudCkge1xuICB7XG4gICAgdmFyIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50O1xuICAgIGlmIChvd25lciAhPT0gbnVsbCAmJiBvd25lci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICB2YXIgb3duZXJGaWJlciA9IG93bmVyO1xuICAgICAgdmFyIGluc3RhbmNlID0gb3duZXJGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAhaW5zdGFuY2UuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnJXMgaXMgYWNjZXNzaW5nIGlzTW91bnRlZCBpbnNpZGUgaXRzIHJlbmRlcigpIGZ1bmN0aW9uLiAnICsgJ3JlbmRlcigpIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLiBJdCBzaG91bGQgJyArICduZXZlciBhY2Nlc3Mgc29tZXRoaW5nIHRoYXQgcmVxdWlyZXMgc3RhbGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyAnICsgJ3JlbmRlciwgc3VjaCBhcyByZWZzLiBNb3ZlIHRoaXMgbG9naWMgdG8gY29tcG9uZW50RGlkTW91bnQgYW5kICcgKyAnY29tcG9uZW50RGlkVXBkYXRlIGluc3RlYWQuJywgZ2V0Q29tcG9uZW50TmFtZShvd25lckZpYmVyLnR5cGUpIHx8ICdBIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgaW5zdGFuY2UuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQoY29tcG9uZW50KTtcbiAgaWYgKCFmaWJlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gaXNGaWJlck1vdW50ZWRJbXBsKGZpYmVyKSA9PT0gTU9VTlRFRDtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0SXNNb3VudGVkKGZpYmVyKSB7XG4gICEoaXNGaWJlck1vdW50ZWRJbXBsKGZpYmVyKSA9PT0gTU9VTlRFRCkgPyBpbnZhcmlhbnQoZmFsc2UsICdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJykgOiB2b2lkIDA7XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoKGZpYmVyKSB7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG4gIGlmICghYWx0ZXJuYXRlKSB7XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gYWx0ZXJuYXRlLCB0aGVuIHdlIG9ubHkgbmVlZCB0byBjaGVjayBpZiBpdCBpcyBtb3VudGVkLlxuICAgIHZhciBzdGF0ZSA9IGlzRmliZXJNb3VudGVkSW1wbChmaWJlcik7XG4gICAgIShzdGF0ZSAhPT0gVU5NT1VOVEVEKSA/IGludmFyaWFudChmYWxzZSwgJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKSA6IHZvaWQgMDtcbiAgICBpZiAoc3RhdGUgPT09IE1PVU5USU5HKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZpYmVyO1xuICB9XG4gIC8vIElmIHdlIGhhdmUgdHdvIHBvc3NpYmxlIGJyYW5jaGVzLCB3ZSdsbCB3YWxrIGJhY2t3YXJkcyB1cCB0byB0aGUgcm9vdFxuICAvLyB0byBzZWUgd2hhdCBwYXRoIHRoZSByb290IHBvaW50cyB0by4gT24gdGhlIHdheSB3ZSBtYXkgaGl0IG9uZSBvZiB0aGVcbiAgLy8gc3BlY2lhbCBjYXNlcyBhbmQgd2UnbGwgZGVhbCB3aXRoIHRoZW0uXG4gIHZhciBhID0gZmliZXI7XG4gIHZhciBiID0gYWx0ZXJuYXRlO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBwYXJlbnRBID0gYS5yZXR1cm47XG4gICAgdmFyIHBhcmVudEIgPSBwYXJlbnRBID8gcGFyZW50QS5hbHRlcm5hdGUgOiBudWxsO1xuICAgIGlmICghcGFyZW50QSB8fCAhcGFyZW50Qikge1xuICAgICAgLy8gV2UncmUgYXQgdGhlIHJvb3QuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyBJZiBib3RoIGNvcGllcyBvZiB0aGUgcGFyZW50IGZpYmVyIHBvaW50IHRvIHRoZSBzYW1lIGNoaWxkLCB3ZSBjYW5cbiAgICAvLyBhc3N1bWUgdGhhdCB0aGUgY2hpbGQgaXMgY3VycmVudC4gVGhpcyBoYXBwZW5zIHdoZW4gd2UgYmFpbG91dCBvbiBsb3dcbiAgICAvLyBwcmlvcml0eTogdGhlIGJhaWxlZCBvdXQgZmliZXIncyBjaGlsZCByZXVzZXMgdGhlIGN1cnJlbnQgY2hpbGQuXG4gICAgaWYgKHBhcmVudEEuY2hpbGQgPT09IHBhcmVudEIuY2hpbGQpIHtcbiAgICAgIHZhciBjaGlsZCA9IHBhcmVudEEuY2hpbGQ7XG4gICAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgICAgaWYgKGNoaWxkID09PSBhKSB7XG4gICAgICAgICAgLy8gV2UndmUgZGV0ZXJtaW5lZCB0aGF0IEEgaXMgdGhlIGN1cnJlbnQgYnJhbmNoLlxuICAgICAgICAgIGFzc2VydElzTW91bnRlZChwYXJlbnRBKTtcbiAgICAgICAgICByZXR1cm4gZmliZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkID09PSBiKSB7XG4gICAgICAgICAgLy8gV2UndmUgZGV0ZXJtaW5lZCB0aGF0IEIgaXMgdGhlIGN1cnJlbnQgYnJhbmNoLlxuICAgICAgICAgIGFzc2VydElzTW91bnRlZChwYXJlbnRBKTtcbiAgICAgICAgICByZXR1cm4gYWx0ZXJuYXRlO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgIH1cbiAgICAgIC8vIFdlIHNob3VsZCBuZXZlciBoYXZlIGFuIGFsdGVybmF0ZSBmb3IgYW55IG1vdW50aW5nIG5vZGUuIFNvIHRoZSBvbmx5XG4gICAgICAvLyB3YXkgdGhpcyBjb3VsZCBwb3NzaWJseSBoYXBwZW4gaXMgaWYgdGhpcyB3YXMgdW5tb3VudGVkLCBpZiBhdCBhbGwuXG4gICAgICBpbnZhcmlhbnQoZmFsc2UsICdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKGEucmV0dXJuICE9PSBiLnJldHVybikge1xuICAgICAgLy8gVGhlIHJldHVybiBwb2ludGVyIG9mIEEgYW5kIHRoZSByZXR1cm4gcG9pbnRlciBvZiBCIHBvaW50IHRvIGRpZmZlcmVudFxuICAgICAgLy8gZmliZXJzLiBXZSBhc3N1bWUgdGhhdCByZXR1cm4gcG9pbnRlcnMgbmV2ZXIgY3Jpc3MtY3Jvc3MsIHNvIEEgbXVzdFxuICAgICAgLy8gYmVsb25nIHRvIHRoZSBjaGlsZCBzZXQgb2YgQS5yZXR1cm4sIGFuZCBCIG11c3QgYmVsb25nIHRvIHRoZSBjaGlsZFxuICAgICAgLy8gc2V0IG9mIEIucmV0dXJuLlxuICAgICAgYSA9IHBhcmVudEE7XG4gICAgICBiID0gcGFyZW50QjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHJldHVybiBwb2ludGVycyBwb2ludCB0byB0aGUgc2FtZSBmaWJlci4gV2UnbGwgaGF2ZSB0byB1c2UgdGhlXG4gICAgICAvLyBkZWZhdWx0LCBzbG93IHBhdGg6IHNjYW4gdGhlIGNoaWxkIHNldHMgb2YgZWFjaCBwYXJlbnQgYWx0ZXJuYXRlIHRvIHNlZVxuICAgICAgLy8gd2hpY2ggY2hpbGQgYmVsb25ncyB0byB3aGljaCBzZXQuXG4gICAgICAvL1xuICAgICAgLy8gU2VhcmNoIHBhcmVudCBBJ3MgY2hpbGQgc2V0XG4gICAgICB2YXIgZGlkRmluZENoaWxkID0gZmFsc2U7XG4gICAgICB2YXIgX2NoaWxkID0gcGFyZW50QS5jaGlsZDtcbiAgICAgIHdoaWxlIChfY2hpbGQpIHtcbiAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkge1xuICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgYSA9IHBhcmVudEE7XG4gICAgICAgICAgYiA9IHBhcmVudEI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9jaGlsZCA9PT0gYikge1xuICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgYiA9IHBhcmVudEE7XG4gICAgICAgICAgYSA9IHBhcmVudEI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7XG4gICAgICB9XG4gICAgICBpZiAoIWRpZEZpbmRDaGlsZCkge1xuICAgICAgICAvLyBTZWFyY2ggcGFyZW50IEIncyBjaGlsZCBzZXRcbiAgICAgICAgX2NoaWxkID0gcGFyZW50Qi5jaGlsZDtcbiAgICAgICAgd2hpbGUgKF9jaGlsZCkge1xuICAgICAgICAgIGlmIChfY2hpbGQgPT09IGEpIHtcbiAgICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgICBhID0gcGFyZW50QjtcbiAgICAgICAgICAgIGIgPSBwYXJlbnRBO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChfY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgICBiID0gcGFyZW50QjtcbiAgICAgICAgICAgIGEgPSBwYXJlbnRBO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgICFkaWRGaW5kQ2hpbGQgPyBpbnZhcmlhbnQoZmFsc2UsICdDaGlsZCB3YXMgbm90IGZvdW5kIGluIGVpdGhlciBwYXJlbnQgc2V0LiBUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiBSZWFjdCByZWxhdGVkIHRvIHRoZSByZXR1cm4gcG9pbnRlci4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJykgOiB2b2lkIDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgIShhLmFsdGVybmF0ZSA9PT0gYikgPyBpbnZhcmlhbnQoZmFsc2UsICdSZXR1cm4gZmliZXJzIHNob3VsZCBhbHdheXMgYmUgZWFjaCBvdGhlcnNcXCcgYWx0ZXJuYXRlcy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKSA6IHZvaWQgMDtcbiAgfVxuICAvLyBJZiB0aGUgcm9vdCBpcyBub3QgYSBob3N0IGNvbnRhaW5lciwgd2UncmUgaW4gYSBkaXNjb25uZWN0ZWQgdHJlZS4gSS5lLlxuICAvLyB1bm1vdW50ZWQuXG4gICEoYS50YWcgPT09IEhvc3RSb290KSA/IGludmFyaWFudChmYWxzZSwgJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKSA6IHZvaWQgMDtcbiAgaWYgKGEuc3RhdGVOb2RlLmN1cnJlbnQgPT09IGEpIHtcbiAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQSBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgcmV0dXJuIGZpYmVyO1xuICB9XG4gIC8vIE90aGVyd2lzZSBCIGhhcyB0byBiZSBjdXJyZW50IGJyYW5jaC5cbiAgcmV0dXJuIGFsdGVybmF0ZTtcbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRIb3N0RmliZXIocGFyZW50KSB7XG4gIHZhciBjdXJyZW50UGFyZW50ID0gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgocGFyZW50KTtcbiAgaWYgKCFjdXJyZW50UGFyZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBOZXh0IHdlJ2xsIGRyaWxsIGRvd24gdGhpcyBjb21wb25lbnQgdG8gZmluZCB0aGUgZmlyc3QgSG9zdENvbXBvbmVudC9UZXh0LlxuICB2YXIgbm9kZSA9IGN1cnJlbnRQYXJlbnQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAobm9kZSA9PT0gY3VycmVudFBhcmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHdoaWxlICghbm9kZS5zaWJsaW5nKSB7XG4gICAgICBpZiAoIW5vZGUucmV0dXJuIHx8IG5vZGUucmV0dXJuID09PSBjdXJyZW50UGFyZW50KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxuICAvLyBGbG93IG5lZWRzIHRoZSByZXR1cm4gbnVsbCBoZXJlLCBidXQgRVNMaW50IGNvbXBsYWlucyBhYm91dCBpdC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVucmVhY2hhYmxlXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHMocGFyZW50KSB7XG4gIHZhciBjdXJyZW50UGFyZW50ID0gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgocGFyZW50KTtcbiAgaWYgKCFjdXJyZW50UGFyZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBOZXh0IHdlJ2xsIGRyaWxsIGRvd24gdGhpcyBjb21wb25lbnQgdG8gZmluZCB0aGUgZmlyc3QgSG9zdENvbXBvbmVudC9UZXh0LlxuICB2YXIgbm9kZSA9IGN1cnJlbnRQYXJlbnQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICYmIG5vZGUudGFnICE9PSBIb3N0UG9ydGFsKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAobm9kZSA9PT0gY3VycmVudFBhcmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHdoaWxlICghbm9kZS5zaWJsaW5nKSB7XG4gICAgICBpZiAoIW5vZGUucmV0dXJuIHx8IG5vZGUucmV0dXJuID09PSBjdXJyZW50UGFyZW50KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxuICAvLyBGbG93IG5lZWRzIHRoZSByZXR1cm4gbnVsbCBoZXJlLCBidXQgRVNMaW50IGNvbXBsYWlucyBhYm91dCBpdC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVucmVhY2hhYmxlXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBhZGRFdmVudEJ1YmJsZUxpc3RlbmVyKGVsZW1lbnQsIGV2ZW50VHlwZSwgbGlzdGVuZXIpIHtcbiAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXIoZWxlbWVudCwgZXZlbnRUeXBlLCBsaXN0ZW5lcikge1xuICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgdHJ1ZSk7XG59XG5cbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWFuaW1hdGlvbnMvI0FuaW1hdGlvbkV2ZW50LWludGVyZmFjZVxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQW5pbWF0aW9uRXZlbnRcbiAqL1xudmFyIFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50ID0gU3ludGhldGljRXZlbnQuZXh0ZW5kKHtcbiAgYW5pbWF0aW9uTmFtZTogbnVsbCxcbiAgZWxhcHNlZFRpbWU6IG51bGwsXG4gIHBzZXVkb0VsZW1lbnQ6IG51bGxcbn0pO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvY2xpcGJvYXJkLWFwaXMvXG4gKi9cbnZhciBTeW50aGV0aWNDbGlwYm9hcmRFdmVudCA9IFN5bnRoZXRpY0V2ZW50LmV4dGVuZCh7XG4gIGNsaXBib2FyZERhdGE6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnY2xpcGJvYXJkRGF0YScgaW4gZXZlbnQgPyBldmVudC5jbGlwYm9hcmREYXRhIDogd2luZG93LmNsaXBib2FyZERhdGE7XG4gIH1cbn0pO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRm9jdXNFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cbnZhciBTeW50aGV0aWNGb2N1c0V2ZW50ID0gU3ludGhldGljVUlFdmVudC5leHRlbmQoe1xuICByZWxhdGVkVGFyZ2V0OiBudWxsXG59KTtcblxuLyoqXG4gKiBgY2hhckNvZGVgIHJlcHJlc2VudHMgdGhlIGFjdHVhbCBcImNoYXJhY3RlciBjb2RlXCIgYW5kIGlzIHNhZmUgdG8gdXNlIHdpdGhcbiAqIGBTdHJpbmcuZnJvbUNoYXJDb2RlYC4gQXMgc3VjaCwgb25seSBrZXlzIHRoYXQgY29ycmVzcG9uZCB0byBwcmludGFibGVcbiAqIGNoYXJhY3RlcnMgcHJvZHVjZSBhIHZhbGlkIGBjaGFyQ29kZWAsIHRoZSBvbmx5IGV4Y2VwdGlvbiB0byB0aGlzIGlzIEVudGVyLlxuICogVGhlIFRhYi1rZXkgaXMgY29uc2lkZXJlZCBub24tcHJpbnRhYmxlIGFuZCBkb2VzIG5vdCBoYXZlIGEgYGNoYXJDb2RlYCxcbiAqIHByZXN1bWFibHkgYmVjYXVzZSBpdCBkb2VzIG5vdCBwcm9kdWNlIGEgdGFiLWNoYXJhY3RlciBpbiBicm93c2Vycy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IE5vcm1hbGl6ZWQgYGNoYXJDb2RlYCBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkge1xuICB2YXIgY2hhckNvZGUgPSB2b2lkIDA7XG4gIHZhciBrZXlDb2RlID0gbmF0aXZlRXZlbnQua2V5Q29kZTtcblxuICBpZiAoJ2NoYXJDb2RlJyBpbiBuYXRpdmVFdmVudCkge1xuICAgIGNoYXJDb2RlID0gbmF0aXZlRXZlbnQuY2hhckNvZGU7XG5cbiAgICAvLyBGRiBkb2VzIG5vdCBzZXQgYGNoYXJDb2RlYCBmb3IgdGhlIEVudGVyLWtleSwgY2hlY2sgYWdhaW5zdCBga2V5Q29kZWAuXG4gICAgaWYgKGNoYXJDb2RlID09PSAwICYmIGtleUNvZGUgPT09IDEzKSB7XG4gICAgICBjaGFyQ29kZSA9IDEzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJRTggZG9lcyBub3QgaW1wbGVtZW50IGBjaGFyQ29kZWAsIGJ1dCBga2V5Q29kZWAgaGFzIHRoZSBjb3JyZWN0IHZhbHVlLlxuICAgIGNoYXJDb2RlID0ga2V5Q29kZTtcbiAgfVxuXG4gIC8vIElFIGFuZCBFZGdlIChvbiBXaW5kb3dzKSBhbmQgQ2hyb21lIC8gU2FmYXJpIChvbiBXaW5kb3dzIGFuZCBMaW51eClcbiAgLy8gcmVwb3J0IEVudGVyIGFzIGNoYXJDb2RlIDEwIHdoZW4gY3RybCBpcyBwcmVzc2VkLlxuICBpZiAoY2hhckNvZGUgPT09IDEwKSB7XG4gICAgY2hhckNvZGUgPSAxMztcbiAgfVxuXG4gIC8vIFNvbWUgbm9uLXByaW50YWJsZSBrZXlzIGFyZSByZXBvcnRlZCBpbiBgY2hhckNvZGVgL2BrZXlDb2RlYCwgZGlzY2FyZCB0aGVtLlxuICAvLyBNdXN0IG5vdCBkaXNjYXJkIHRoZSAobm9uLSlwcmludGFibGUgRW50ZXIta2V5LlxuICBpZiAoY2hhckNvZGUgPj0gMzIgfHwgY2hhckNvZGUgPT09IDEzKSB7XG4gICAgcmV0dXJuIGNoYXJDb2RlO1xuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbi8qKlxuICogTm9ybWFsaXphdGlvbiBvZiBkZXByZWNhdGVkIEhUTUw1IGBrZXlgIHZhbHVlc1xuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudCNLZXlfbmFtZXNcbiAqL1xudmFyIG5vcm1hbGl6ZUtleSA9IHtcbiAgRXNjOiAnRXNjYXBlJyxcbiAgU3BhY2ViYXI6ICcgJyxcbiAgTGVmdDogJ0Fycm93TGVmdCcsXG4gIFVwOiAnQXJyb3dVcCcsXG4gIFJpZ2h0OiAnQXJyb3dSaWdodCcsXG4gIERvd246ICdBcnJvd0Rvd24nLFxuICBEZWw6ICdEZWxldGUnLFxuICBXaW46ICdPUycsXG4gIE1lbnU6ICdDb250ZXh0TWVudScsXG4gIEFwcHM6ICdDb250ZXh0TWVudScsXG4gIFNjcm9sbDogJ1Njcm9sbExvY2snLFxuICBNb3pQcmludGFibGVLZXk6ICdVbmlkZW50aWZpZWQnXG59O1xuXG4vKipcbiAqIFRyYW5zbGF0aW9uIGZyb20gbGVnYWN5IGBrZXlDb2RlYCB0byBIVE1MNSBga2V5YFxuICogT25seSBzcGVjaWFsIGtleXMgc3VwcG9ydGVkLCBhbGwgb3RoZXJzIGRlcGVuZCBvbiBrZXlib2FyZCBsYXlvdXQgb3IgYnJvd3NlclxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudCNLZXlfbmFtZXNcbiAqL1xudmFyIHRyYW5zbGF0ZVRvS2V5ID0ge1xuICAnOCc6ICdCYWNrc3BhY2UnLFxuICAnOSc6ICdUYWInLFxuICAnMTInOiAnQ2xlYXInLFxuICAnMTMnOiAnRW50ZXInLFxuICAnMTYnOiAnU2hpZnQnLFxuICAnMTcnOiAnQ29udHJvbCcsXG4gICcxOCc6ICdBbHQnLFxuICAnMTknOiAnUGF1c2UnLFxuICAnMjAnOiAnQ2Fwc0xvY2snLFxuICAnMjcnOiAnRXNjYXBlJyxcbiAgJzMyJzogJyAnLFxuICAnMzMnOiAnUGFnZVVwJyxcbiAgJzM0JzogJ1BhZ2VEb3duJyxcbiAgJzM1JzogJ0VuZCcsXG4gICczNic6ICdIb21lJyxcbiAgJzM3JzogJ0Fycm93TGVmdCcsXG4gICczOCc6ICdBcnJvd1VwJyxcbiAgJzM5JzogJ0Fycm93UmlnaHQnLFxuICAnNDAnOiAnQXJyb3dEb3duJyxcbiAgJzQ1JzogJ0luc2VydCcsXG4gICc0Nic6ICdEZWxldGUnLFxuICAnMTEyJzogJ0YxJyxcbiAgJzExMyc6ICdGMicsXG4gICcxMTQnOiAnRjMnLFxuICAnMTE1JzogJ0Y0JyxcbiAgJzExNic6ICdGNScsXG4gICcxMTcnOiAnRjYnLFxuICAnMTE4JzogJ0Y3JyxcbiAgJzExOSc6ICdGOCcsXG4gICcxMjAnOiAnRjknLFxuICAnMTIxJzogJ0YxMCcsXG4gICcxMjInOiAnRjExJyxcbiAgJzEyMyc6ICdGMTInLFxuICAnMTQ0JzogJ051bUxvY2snLFxuICAnMTQ1JzogJ1Njcm9sbExvY2snLFxuICAnMjI0JzogJ01ldGEnXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge3N0cmluZ30gTm9ybWFsaXplZCBga2V5YCBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gZ2V0RXZlbnRLZXkobmF0aXZlRXZlbnQpIHtcbiAgaWYgKG5hdGl2ZUV2ZW50LmtleSkge1xuICAgIC8vIE5vcm1hbGl6ZSBpbmNvbnNpc3RlbnQgdmFsdWVzIHJlcG9ydGVkIGJ5IGJyb3dzZXJzIGR1ZSB0b1xuICAgIC8vIGltcGxlbWVudGF0aW9ucyBvZiBhIHdvcmtpbmcgZHJhZnQgc3BlY2lmaWNhdGlvbi5cblxuICAgIC8vIEZpcmVGb3ggaW1wbGVtZW50cyBga2V5YCBidXQgcmV0dXJucyBgTW96UHJpbnRhYmxlS2V5YCBmb3IgYWxsXG4gICAgLy8gcHJpbnRhYmxlIGNoYXJhY3RlcnMgKG5vcm1hbGl6ZWQgdG8gYFVuaWRlbnRpZmllZGApLCBpZ25vcmUgaXQuXG4gICAgdmFyIGtleSA9IG5vcm1hbGl6ZUtleVtuYXRpdmVFdmVudC5rZXldIHx8IG5hdGl2ZUV2ZW50LmtleTtcbiAgICBpZiAoa2V5ICE9PSAnVW5pZGVudGlmaWVkJykge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cblxuICAvLyBCcm93c2VyIGRvZXMgbm90IGltcGxlbWVudCBga2V5YCwgcG9seWZpbGwgYXMgbXVjaCBvZiBpdCBhcyB3ZSBjYW4uXG4gIGlmIChuYXRpdmVFdmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgdmFyIGNoYXJDb2RlID0gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCk7XG5cbiAgICAvLyBUaGUgZW50ZXIta2V5IGlzIHRlY2huaWNhbGx5IGJvdGggcHJpbnRhYmxlIGFuZCBub24tcHJpbnRhYmxlIGFuZCBjYW5cbiAgICAvLyB0aHVzIGJlIGNhcHR1cmVkIGJ5IGBrZXlwcmVzc2AsIG5vIG90aGVyIG5vbi1wcmludGFibGUga2V5IHNob3VsZC5cbiAgICByZXR1cm4gY2hhckNvZGUgPT09IDEzID8gJ0VudGVyJyA6IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICB9XG4gIGlmIChuYXRpdmVFdmVudC50eXBlID09PSAna2V5ZG93bicgfHwgbmF0aXZlRXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgIC8vIFdoaWxlIHVzZXIga2V5Ym9hcmQgbGF5b3V0IGRldGVybWluZXMgdGhlIGFjdHVhbCBtZWFuaW5nIG9mIGVhY2hcbiAgICAvLyBga2V5Q29kZWAgdmFsdWUsIGFsbW9zdCBhbGwgZnVuY3Rpb24ga2V5cyBoYXZlIGEgdW5pdmVyc2FsIHZhbHVlLlxuICAgIHJldHVybiB0cmFuc2xhdGVUb0tleVtuYXRpdmVFdmVudC5rZXlDb2RlXSB8fCAnVW5pZGVudGlmaWVkJztcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogQGludGVyZmFjZSBLZXlib2FyZEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xudmFyIFN5bnRoZXRpY0tleWJvYXJkRXZlbnQgPSBTeW50aGV0aWNVSUV2ZW50LmV4dGVuZCh7XG4gIGtleTogZ2V0RXZlbnRLZXksXG4gIGxvY2F0aW9uOiBudWxsLFxuICBjdHJsS2V5OiBudWxsLFxuICBzaGlmdEtleTogbnVsbCxcbiAgYWx0S2V5OiBudWxsLFxuICBtZXRhS2V5OiBudWxsLFxuICByZXBlYXQ6IG51bGwsXG4gIGxvY2FsZTogbnVsbCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlLFxuICAvLyBMZWdhY3kgSW50ZXJmYWNlXG4gIGNoYXJDb2RlOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBgY2hhckNvZGVgIGlzIHRoZSByZXN1bHQgb2YgYSBLZXlQcmVzcyBldmVudCBhbmQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2ZcbiAgICAvLyB0aGUgYWN0dWFsIHByaW50YWJsZSBjaGFyYWN0ZXIuXG5cbiAgICAvLyBLZXlQcmVzcyBpcyBkZXByZWNhdGVkLCBidXQgaXRzIHJlcGxhY2VtZW50IGlzIG5vdCB5ZXQgZmluYWwgYW5kIG5vdFxuICAgIC8vIGltcGxlbWVudGVkIGluIGFueSBtYWpvciBicm93c2VyLiBPbmx5IEtleVByZXNzIGhhcyBjaGFyQ29kZS5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgcmV0dXJuIGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAga2V5Q29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYGtleUNvZGVgIGlzIHRoZSByZXN1bHQgb2YgYSBLZXlEb3duL1VwIGV2ZW50IGFuZCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZlxuICAgIC8vIHBoeXNpY2FsIGtleWJvYXJkIGtleS5cblxuICAgIC8vIFRoZSBhY3R1YWwgbWVhbmluZyBvZiB0aGUgdmFsdWUgZGVwZW5kcyBvbiB0aGUgdXNlcnMnIGtleWJvYXJkIGxheW91dFxuICAgIC8vIHdoaWNoIGNhbm5vdCBiZSBkZXRlY3RlZC4gQXNzdW1pbmcgdGhhdCBpdCBpcyBhIFVTIGtleWJvYXJkIGxheW91dFxuICAgIC8vIHByb3ZpZGVzIGEgc3VycHJpc2luZ2x5IGFjY3VyYXRlIG1hcHBpbmcgZm9yIFVTIGFuZCBFdXJvcGVhbiB1c2Vycy5cbiAgICAvLyBEdWUgdG8gdGhpcywgaXQgaXMgbGVmdCB0byB0aGUgdXNlciB0byBpbXBsZW1lbnQgYXQgdGhpcyB0aW1lLlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5ZG93bicgfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgICAgcmV0dXJuIGV2ZW50LmtleUNvZGU7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9LFxuICB3aGljaDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYHdoaWNoYCBpcyBhbiBhbGlhcyBmb3IgZWl0aGVyIGBrZXlDb2RlYCBvciBgY2hhckNvZGVgIGRlcGVuZGluZyBvbiB0aGVcbiAgICAvLyB0eXBlIG9mIHRoZSBldmVudC5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgcmV0dXJuIGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpO1xuICAgIH1cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgIHJldHVybiBldmVudC5rZXlDb2RlO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxufSk7XG5cbi8qKlxuICogQGludGVyZmFjZSBEcmFnRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG52YXIgU3ludGhldGljRHJhZ0V2ZW50ID0gU3ludGhldGljTW91c2VFdmVudC5leHRlbmQoe1xuICBkYXRhVHJhbnNmZXI6IG51bGxcbn0pO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgVG91Y2hFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi90b3VjaC1ldmVudHMvXG4gKi9cbnZhciBTeW50aGV0aWNUb3VjaEV2ZW50ID0gU3ludGhldGljVUlFdmVudC5leHRlbmQoe1xuICB0b3VjaGVzOiBudWxsLFxuICB0YXJnZXRUb3VjaGVzOiBudWxsLFxuICBjaGFuZ2VkVG91Y2hlczogbnVsbCxcbiAgYWx0S2V5OiBudWxsLFxuICBtZXRhS2V5OiBudWxsLFxuICBjdHJsS2V5OiBudWxsLFxuICBzaGlmdEtleTogbnVsbCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlXG59KTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDkvV0QtY3NzMy10cmFuc2l0aW9ucy0yMDA5MDMyMC8jdHJhbnNpdGlvbi1ldmVudHMtXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9UcmFuc2l0aW9uRXZlbnRcbiAqL1xudmFyIFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudCA9IFN5bnRoZXRpY0V2ZW50LmV4dGVuZCh7XG4gIHByb3BlcnR5TmFtZTogbnVsbCxcbiAgZWxhcHNlZFRpbWU6IG51bGwsXG4gIHBzZXVkb0VsZW1lbnQ6IG51bGxcbn0pO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgV2hlZWxFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cbnZhciBTeW50aGV0aWNXaGVlbEV2ZW50ID0gU3ludGhldGljTW91c2VFdmVudC5leHRlbmQoe1xuICBkZWx0YVg6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnZGVsdGFYJyBpbiBldmVudCA/IGV2ZW50LmRlbHRhWCA6IC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhWGAgZm9yIFdlYmtpdCBhbmQgbm9ybWFsaXplIChyaWdodCBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGFYJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhWCA6IDA7XG4gIH0sXG4gIGRlbHRhWTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdkZWx0YVknIGluIGV2ZW50ID8gZXZlbnQuZGVsdGFZIDogLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFZYCBmb3IgV2Via2l0IGFuZCBub3JtYWxpemUgKGRvd24gaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhWScgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YVkgOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YWAgZm9yIElFPDkgYW5kIG5vcm1hbGl6ZSAoZG93biBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGEnIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGEgOiAwO1xuICB9LFxuXG4gIGRlbHRhWjogbnVsbCxcblxuICAvLyBCcm93c2VycyB3aXRob3V0IFwiZGVsdGFNb2RlXCIgaXMgcmVwb3J0aW5nIGluIHJhdyB3aGVlbCBkZWx0YSB3aGVyZSBvbmVcbiAgLy8gbm90Y2ggb24gdGhlIHNjcm9sbCBpcyBhbHdheXMgKy8tIDEyMCwgcm91Z2hseSBlcXVpdmFsZW50IHRvIHBpeGVscy5cbiAgLy8gQSBnb29kIGFwcHJveGltYXRpb24gb2YgRE9NX0RFTFRBX0xJTkUgKDEpIGlzIDUlIG9mIHZpZXdwb3J0IHNpemUgb3JcbiAgLy8gfjQwIHBpeGVscywgZm9yIERPTV9ERUxUQV9TQ1JFRU4gKDIpIGl0IGlzIDg3LjUlIG9mIHZpZXdwb3J0IHNpemUuXG4gIGRlbHRhTW9kZTogbnVsbFxufSk7XG5cbi8qKlxuICogVHVybnNcbiAqIFsnYWJvcnQnLCAuLi5dXG4gKiBpbnRvXG4gKiBldmVudFR5cGVzID0ge1xuICogICAnYWJvcnQnOiB7XG4gKiAgICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHtcbiAqICAgICAgIGJ1YmJsZWQ6ICdvbkFib3J0JyxcbiAqICAgICAgIGNhcHR1cmVkOiAnb25BYm9ydENhcHR1cmUnLFxuICogICAgIH0sXG4gKiAgICAgZGVwZW5kZW5jaWVzOiBbVE9QX0FCT1JUXSxcbiAqICAgfSxcbiAqICAgLi4uXG4gKiB9O1xuICogdG9wTGV2ZWxFdmVudHNUb0Rpc3BhdGNoQ29uZmlnID0gbmV3IE1hcChbXG4gKiAgIFtUT1BfQUJPUlQsIHsgc2FtZUNvbmZpZyB9XSxcbiAqIF0pO1xuICovXG5cbnZhciBpbnRlcmFjdGl2ZUV2ZW50VHlwZU5hbWVzID0gW1tUT1BfQkxVUiwgJ2JsdXInXSwgW1RPUF9DQU5DRUwsICdjYW5jZWwnXSwgW1RPUF9DTElDSywgJ2NsaWNrJ10sIFtUT1BfQ0xPU0UsICdjbG9zZSddLCBbVE9QX0NPTlRFWFRfTUVOVSwgJ2NvbnRleHRNZW51J10sIFtUT1BfQ09QWSwgJ2NvcHknXSwgW1RPUF9DVVQsICdjdXQnXSwgW1RPUF9BVVhfQ0xJQ0ssICdhdXhDbGljayddLCBbVE9QX0RPVUJMRV9DTElDSywgJ2RvdWJsZUNsaWNrJ10sIFtUT1BfRFJBR19FTkQsICdkcmFnRW5kJ10sIFtUT1BfRFJBR19TVEFSVCwgJ2RyYWdTdGFydCddLCBbVE9QX0RST1AsICdkcm9wJ10sIFtUT1BfRk9DVVMsICdmb2N1cyddLCBbVE9QX0lOUFVULCAnaW5wdXQnXSwgW1RPUF9JTlZBTElELCAnaW52YWxpZCddLCBbVE9QX0tFWV9ET1dOLCAna2V5RG93biddLCBbVE9QX0tFWV9QUkVTUywgJ2tleVByZXNzJ10sIFtUT1BfS0VZX1VQLCAna2V5VXAnXSwgW1RPUF9NT1VTRV9ET1dOLCAnbW91c2VEb3duJ10sIFtUT1BfTU9VU0VfVVAsICdtb3VzZVVwJ10sIFtUT1BfUEFTVEUsICdwYXN0ZSddLCBbVE9QX1BBVVNFLCAncGF1c2UnXSwgW1RPUF9QTEFZLCAncGxheSddLCBbVE9QX1BPSU5URVJfQ0FOQ0VMLCAncG9pbnRlckNhbmNlbCddLCBbVE9QX1BPSU5URVJfRE9XTiwgJ3BvaW50ZXJEb3duJ10sIFtUT1BfUE9JTlRFUl9VUCwgJ3BvaW50ZXJVcCddLCBbVE9QX1JBVEVfQ0hBTkdFLCAncmF0ZUNoYW5nZSddLCBbVE9QX1JFU0VULCAncmVzZXQnXSwgW1RPUF9TRUVLRUQsICdzZWVrZWQnXSwgW1RPUF9TVUJNSVQsICdzdWJtaXQnXSwgW1RPUF9UT1VDSF9DQU5DRUwsICd0b3VjaENhbmNlbCddLCBbVE9QX1RPVUNIX0VORCwgJ3RvdWNoRW5kJ10sIFtUT1BfVE9VQ0hfU1RBUlQsICd0b3VjaFN0YXJ0J10sIFtUT1BfVk9MVU1FX0NIQU5HRSwgJ3ZvbHVtZUNoYW5nZSddXTtcbnZhciBub25JbnRlcmFjdGl2ZUV2ZW50VHlwZU5hbWVzID0gW1tUT1BfQUJPUlQsICdhYm9ydCddLCBbVE9QX0FOSU1BVElPTl9FTkQsICdhbmltYXRpb25FbmQnXSwgW1RPUF9BTklNQVRJT05fSVRFUkFUSU9OLCAnYW5pbWF0aW9uSXRlcmF0aW9uJ10sIFtUT1BfQU5JTUFUSU9OX1NUQVJULCAnYW5pbWF0aW9uU3RhcnQnXSwgW1RPUF9DQU5fUExBWSwgJ2NhblBsYXknXSwgW1RPUF9DQU5fUExBWV9USFJPVUdILCAnY2FuUGxheVRocm91Z2gnXSwgW1RPUF9EUkFHLCAnZHJhZyddLCBbVE9QX0RSQUdfRU5URVIsICdkcmFnRW50ZXInXSwgW1RPUF9EUkFHX0VYSVQsICdkcmFnRXhpdCddLCBbVE9QX0RSQUdfTEVBVkUsICdkcmFnTGVhdmUnXSwgW1RPUF9EUkFHX09WRVIsICdkcmFnT3ZlciddLCBbVE9QX0RVUkFUSU9OX0NIQU5HRSwgJ2R1cmF0aW9uQ2hhbmdlJ10sIFtUT1BfRU1QVElFRCwgJ2VtcHRpZWQnXSwgW1RPUF9FTkNSWVBURUQsICdlbmNyeXB0ZWQnXSwgW1RPUF9FTkRFRCwgJ2VuZGVkJ10sIFtUT1BfRVJST1IsICdlcnJvciddLCBbVE9QX0dPVF9QT0lOVEVSX0NBUFRVUkUsICdnb3RQb2ludGVyQ2FwdHVyZSddLCBbVE9QX0xPQUQsICdsb2FkJ10sIFtUT1BfTE9BREVEX0RBVEEsICdsb2FkZWREYXRhJ10sIFtUT1BfTE9BREVEX01FVEFEQVRBLCAnbG9hZGVkTWV0YWRhdGEnXSwgW1RPUF9MT0FEX1NUQVJULCAnbG9hZFN0YXJ0J10sIFtUT1BfTE9TVF9QT0lOVEVSX0NBUFRVUkUsICdsb3N0UG9pbnRlckNhcHR1cmUnXSwgW1RPUF9NT1VTRV9NT1ZFLCAnbW91c2VNb3ZlJ10sIFtUT1BfTU9VU0VfT1VULCAnbW91c2VPdXQnXSwgW1RPUF9NT1VTRV9PVkVSLCAnbW91c2VPdmVyJ10sIFtUT1BfUExBWUlORywgJ3BsYXlpbmcnXSwgW1RPUF9QT0lOVEVSX01PVkUsICdwb2ludGVyTW92ZSddLCBbVE9QX1BPSU5URVJfT1VULCAncG9pbnRlck91dCddLCBbVE9QX1BPSU5URVJfT1ZFUiwgJ3BvaW50ZXJPdmVyJ10sIFtUT1BfUFJPR1JFU1MsICdwcm9ncmVzcyddLCBbVE9QX1NDUk9MTCwgJ3Njcm9sbCddLCBbVE9QX1NFRUtJTkcsICdzZWVraW5nJ10sIFtUT1BfU1RBTExFRCwgJ3N0YWxsZWQnXSwgW1RPUF9TVVNQRU5ELCAnc3VzcGVuZCddLCBbVE9QX1RJTUVfVVBEQVRFLCAndGltZVVwZGF0ZSddLCBbVE9QX1RPR0dMRSwgJ3RvZ2dsZSddLCBbVE9QX1RPVUNIX01PVkUsICd0b3VjaE1vdmUnXSwgW1RPUF9UUkFOU0lUSU9OX0VORCwgJ3RyYW5zaXRpb25FbmQnXSwgW1RPUF9XQUlUSU5HLCAnd2FpdGluZyddLCBbVE9QX1dIRUVMLCAnd2hlZWwnXV07XG5cbnZhciBldmVudFR5cGVzJDQgPSB7fTtcbnZhciB0b3BMZXZlbEV2ZW50c1RvRGlzcGF0Y2hDb25maWcgPSB7fTtcblxuZnVuY3Rpb24gYWRkRXZlbnRUeXBlTmFtZVRvQ29uZmlnKF9yZWYsIGlzSW50ZXJhY3RpdmUpIHtcbiAgdmFyIHRvcEV2ZW50ID0gX3JlZlswXSxcbiAgICAgIGV2ZW50ID0gX3JlZlsxXTtcblxuICB2YXIgY2FwaXRhbGl6ZWRFdmVudCA9IGV2ZW50WzBdLnRvVXBwZXJDYXNlKCkgKyBldmVudC5zbGljZSgxKTtcbiAgdmFyIG9uRXZlbnQgPSAnb24nICsgY2FwaXRhbGl6ZWRFdmVudDtcblxuICB2YXIgdHlwZSA9IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogb25FdmVudCxcbiAgICAgIGNhcHR1cmVkOiBvbkV2ZW50ICsgJ0NhcHR1cmUnXG4gICAgfSxcbiAgICBkZXBlbmRlbmNpZXM6IFt0b3BFdmVudF0sXG4gICAgaXNJbnRlcmFjdGl2ZTogaXNJbnRlcmFjdGl2ZVxuICB9O1xuICBldmVudFR5cGVzJDRbZXZlbnRdID0gdHlwZTtcbiAgdG9wTGV2ZWxFdmVudHNUb0Rpc3BhdGNoQ29uZmlnW3RvcEV2ZW50XSA9IHR5cGU7XG59XG5cbmludGVyYWN0aXZlRXZlbnRUeXBlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnRUdXBsZSkge1xuICBhZGRFdmVudFR5cGVOYW1lVG9Db25maWcoZXZlbnRUdXBsZSwgdHJ1ZSk7XG59KTtcbm5vbkludGVyYWN0aXZlRXZlbnRUeXBlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnRUdXBsZSkge1xuICBhZGRFdmVudFR5cGVOYW1lVG9Db25maWcoZXZlbnRUdXBsZSwgZmFsc2UpO1xufSk7XG5cbi8vIE9ubHkgdXNlZCBpbiBERVYgZm9yIGV4aGF1c3RpdmVuZXNzIHZhbGlkYXRpb24uXG52YXIga25vd25IVE1MVG9wTGV2ZWxUeXBlcyA9IFtUT1BfQUJPUlQsIFRPUF9DQU5DRUwsIFRPUF9DQU5fUExBWSwgVE9QX0NBTl9QTEFZX1RIUk9VR0gsIFRPUF9DTE9TRSwgVE9QX0RVUkFUSU9OX0NIQU5HRSwgVE9QX0VNUFRJRUQsIFRPUF9FTkNSWVBURUQsIFRPUF9FTkRFRCwgVE9QX0VSUk9SLCBUT1BfSU5QVVQsIFRPUF9JTlZBTElELCBUT1BfTE9BRCwgVE9QX0xPQURFRF9EQVRBLCBUT1BfTE9BREVEX01FVEFEQVRBLCBUT1BfTE9BRF9TVEFSVCwgVE9QX1BBVVNFLCBUT1BfUExBWSwgVE9QX1BMQVlJTkcsIFRPUF9QUk9HUkVTUywgVE9QX1JBVEVfQ0hBTkdFLCBUT1BfUkVTRVQsIFRPUF9TRUVLRUQsIFRPUF9TRUVLSU5HLCBUT1BfU1RBTExFRCwgVE9QX1NVQk1JVCwgVE9QX1NVU1BFTkQsIFRPUF9USU1FX1VQREFURSwgVE9QX1RPR0dMRSwgVE9QX1ZPTFVNRV9DSEFOR0UsIFRPUF9XQUlUSU5HXTtcblxudmFyIFNpbXBsZUV2ZW50UGx1Z2luID0ge1xuICBldmVudFR5cGVzOiBldmVudFR5cGVzJDQsXG5cbiAgaXNJbnRlcmFjdGl2ZVRvcExldmVsRXZlbnRUeXBlOiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlKSB7XG4gICAgdmFyIGNvbmZpZyA9IHRvcExldmVsRXZlbnRzVG9EaXNwYXRjaENvbmZpZ1t0b3BMZXZlbFR5cGVdO1xuICAgIHJldHVybiBjb25maWcgIT09IHVuZGVmaW5lZCAmJiBjb25maWcuaXNJbnRlcmFjdGl2ZSA9PT0gdHJ1ZTtcbiAgfSxcblxuXG4gIGV4dHJhY3RFdmVudHM6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIHZhciBkaXNwYXRjaENvbmZpZyA9IHRvcExldmVsRXZlbnRzVG9EaXNwYXRjaENvbmZpZ1t0b3BMZXZlbFR5cGVdO1xuICAgIGlmICghZGlzcGF0Y2hDb25maWcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgRXZlbnRDb25zdHJ1Y3RvciA9IHZvaWQgMDtcbiAgICBzd2l0Y2ggKHRvcExldmVsVHlwZSkge1xuICAgICAgY2FzZSBUT1BfS0VZX1BSRVNTOlxuICAgICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBrZXlwcmVzcyBldmVudCBmb3IgZnVuY3Rpb24ga2V5cyB0b28uIFRoaXMgcmVtb3Zlc1xuICAgICAgICAvLyB0aGUgdW53YW50ZWQga2V5cHJlc3MgZXZlbnRzLiBFbnRlciBpcyBob3dldmVyIGJvdGggcHJpbnRhYmxlIGFuZFxuICAgICAgICAvLyBub24tcHJpbnRhYmxlLiBPbmUgd291bGQgZXhwZWN0IFRhYiB0byBiZSBhcyB3ZWxsIChidXQgaXQgaXNuJ3QpLlxuICAgICAgICBpZiAoZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBUT1BfS0VZX0RPV046XG4gICAgICBjYXNlIFRPUF9LRVlfVVA6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNLZXlib2FyZEV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVE9QX0JMVVI6XG4gICAgICBjYXNlIFRPUF9GT0NVUzpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUT1BfQ0xJQ0s6XG4gICAgICAgIC8vIEZpcmVmb3ggY3JlYXRlcyBhIGNsaWNrIGV2ZW50IG9uIHJpZ2h0IG1vdXNlIGNsaWNrcy4gVGhpcyByZW1vdmVzIHRoZVxuICAgICAgICAvLyB1bndhbnRlZCBjbGljayBldmVudHMuXG4gICAgICAgIGlmIChuYXRpdmVFdmVudC5idXR0b24gPT09IDIpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBUT1BfQVVYX0NMSUNLOlxuICAgICAgY2FzZSBUT1BfRE9VQkxFX0NMSUNLOlxuICAgICAgY2FzZSBUT1BfTU9VU0VfRE9XTjpcbiAgICAgIGNhc2UgVE9QX01PVVNFX01PVkU6XG4gICAgICBjYXNlIFRPUF9NT1VTRV9VUDpcbiAgICAgIC8vIFRPRE86IERpc2FibGVkIGVsZW1lbnRzIHNob3VsZCBub3QgcmVzcG9uZCB0byBtb3VzZSBldmVudHNcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgVE9QX01PVVNFX09VVDpcbiAgICAgIGNhc2UgVE9QX01PVVNFX09WRVI6XG4gICAgICBjYXNlIFRPUF9DT05URVhUX01FTlU6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNNb3VzZUV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVE9QX0RSQUc6XG4gICAgICBjYXNlIFRPUF9EUkFHX0VORDpcbiAgICAgIGNhc2UgVE9QX0RSQUdfRU5URVI6XG4gICAgICBjYXNlIFRPUF9EUkFHX0VYSVQ6XG4gICAgICBjYXNlIFRPUF9EUkFHX0xFQVZFOlxuICAgICAgY2FzZSBUT1BfRFJBR19PVkVSOlxuICAgICAgY2FzZSBUT1BfRFJBR19TVEFSVDpcbiAgICAgIGNhc2UgVE9QX0RST1A6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNEcmFnRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUT1BfVE9VQ0hfQ0FOQ0VMOlxuICAgICAgY2FzZSBUT1BfVE9VQ0hfRU5EOlxuICAgICAgY2FzZSBUT1BfVE9VQ0hfTU9WRTpcbiAgICAgIGNhc2UgVE9QX1RPVUNIX1NUQVJUOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljVG91Y2hFdmVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRPUF9BTklNQVRJT05fRU5EOlxuICAgICAgY2FzZSBUT1BfQU5JTUFUSU9OX0lURVJBVElPTjpcbiAgICAgIGNhc2UgVE9QX0FOSU1BVElPTl9TVEFSVDpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVE9QX1RSQU5TSVRJT05fRU5EOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljVHJhbnNpdGlvbkV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVE9QX1NDUk9MTDpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY1VJRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUT1BfV0hFRUw6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNXaGVlbEV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVE9QX0NPUFk6XG4gICAgICBjYXNlIFRPUF9DVVQ6XG4gICAgICBjYXNlIFRPUF9QQVNURTpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVE9QX0dPVF9QT0lOVEVSX0NBUFRVUkU6XG4gICAgICBjYXNlIFRPUF9MT1NUX1BPSU5URVJfQ0FQVFVSRTpcbiAgICAgIGNhc2UgVE9QX1BPSU5URVJfQ0FOQ0VMOlxuICAgICAgY2FzZSBUT1BfUE9JTlRFUl9ET1dOOlxuICAgICAgY2FzZSBUT1BfUE9JTlRFUl9NT1ZFOlxuICAgICAgY2FzZSBUT1BfUE9JTlRFUl9PVVQ6XG4gICAgICBjYXNlIFRPUF9QT0lOVEVSX09WRVI6XG4gICAgICBjYXNlIFRPUF9QT0lOVEVSX1VQOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljUG9pbnRlckV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoa25vd25IVE1MVG9wTGV2ZWxUeXBlcy5pbmRleE9mKHRvcExldmVsVHlwZSkgPT09IC0xKSB7XG4gICAgICAgICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdTaW1wbGVFdmVudFBsdWdpbjogVW5oYW5kbGVkIGV2ZW50IHR5cGUsIGAlc2AuIFRoaXMgd2FybmluZyAnICsgJ2lzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicsIHRvcExldmVsVHlwZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhUTUwgRXZlbnRzXG4gICAgICAgIC8vIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUvaW5kZXguaHRtbCNldmVudHMtMFxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgZXZlbnQgPSBFdmVudENvbnN0cnVjdG9yLmdldFBvb2xlZChkaXNwYXRjaENvbmZpZywgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50KTtcbiAgICByZXR1cm4gZXZlbnQ7XG4gIH1cbn07XG5cbnZhciBpc0ludGVyYWN0aXZlVG9wTGV2ZWxFdmVudFR5cGUgPSBTaW1wbGVFdmVudFBsdWdpbi5pc0ludGVyYWN0aXZlVG9wTGV2ZWxFdmVudFR5cGU7XG5cblxudmFyIENBTExCQUNLX0JPT0tLRUVQSU5HX1BPT0xfU0laRSA9IDEwO1xudmFyIGNhbGxiYWNrQm9va2tlZXBpbmdQb29sID0gW107XG5cbi8qKlxuICogRmluZCB0aGUgZGVlcGVzdCBSZWFjdCBjb21wb25lbnQgY29tcGxldGVseSBjb250YWluaW5nIHRoZSByb290IG9mIHRoZVxuICogcGFzc2VkLWluIGluc3RhbmNlIChmb3IgdXNlIHdoZW4gZW50aXJlIFJlYWN0IHRyZWVzIGFyZSBuZXN0ZWQgd2l0aGluIGVhY2hcbiAqIG90aGVyKS4gSWYgUmVhY3QgdHJlZXMgYXJlIG5vdCBuZXN0ZWQsIHJldHVybnMgbnVsbC5cbiAqL1xuZnVuY3Rpb24gZmluZFJvb3RDb250YWluZXJOb2RlKGluc3QpIHtcbiAgLy8gVE9ETzogSXQgbWF5IGJlIGEgZ29vZCBpZGVhIHRvIGNhY2hlIHRoaXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSBET01cbiAgLy8gdHJhdmVyc2FsLCBidXQgY2FjaGluZyBpcyBkaWZmaWN1bHQgdG8gZG8gY29ycmVjdGx5IHdpdGhvdXQgdXNpbmcgYVxuICAvLyBtdXRhdGlvbiBvYnNlcnZlciB0byBsaXN0ZW4gZm9yIGFsbCBET00gY2hhbmdlcy5cbiAgd2hpbGUgKGluc3QucmV0dXJuKSB7XG4gICAgaW5zdCA9IGluc3QucmV0dXJuO1xuICB9XG4gIGlmIChpbnN0LnRhZyAhPT0gSG9zdFJvb3QpIHtcbiAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgd2UncmUgaW4gYSBkZXRhY2hlZCB0cmVlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBpbnN0LnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xufVxuXG4vLyBVc2VkIHRvIHN0b3JlIGFuY2VzdG9yIGhpZXJhcmNoeSBpbiB0b3AgbGV2ZWwgY2FsbGJhY2tcbmZ1bmN0aW9uIGdldFRvcExldmVsQ2FsbGJhY2tCb29rS2VlcGluZyh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50LCB0YXJnZXRJbnN0KSB7XG4gIGlmIChjYWxsYmFja0Jvb2trZWVwaW5nUG9vbC5sZW5ndGgpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBjYWxsYmFja0Jvb2trZWVwaW5nUG9vbC5wb3AoKTtcbiAgICBpbnN0YW5jZS50b3BMZXZlbFR5cGUgPSB0b3BMZXZlbFR5cGU7XG4gICAgaW5zdGFuY2UubmF0aXZlRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICBpbnN0YW5jZS50YXJnZXRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0b3BMZXZlbFR5cGU6IHRvcExldmVsVHlwZSxcbiAgICBuYXRpdmVFdmVudDogbmF0aXZlRXZlbnQsXG4gICAgdGFyZ2V0SW5zdDogdGFyZ2V0SW5zdCxcbiAgICBhbmNlc3RvcnM6IFtdXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlbGVhc2VUb3BMZXZlbENhbGxiYWNrQm9va0tlZXBpbmcoaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UudG9wTGV2ZWxUeXBlID0gbnVsbDtcbiAgaW5zdGFuY2UubmF0aXZlRXZlbnQgPSBudWxsO1xuICBpbnN0YW5jZS50YXJnZXRJbnN0ID0gbnVsbDtcbiAgaW5zdGFuY2UuYW5jZXN0b3JzLmxlbmd0aCA9IDA7XG4gIGlmIChjYWxsYmFja0Jvb2trZWVwaW5nUG9vbC5sZW5ndGggPCBDQUxMQkFDS19CT09LS0VFUElOR19QT09MX1NJWkUpIHtcbiAgICBjYWxsYmFja0Jvb2trZWVwaW5nUG9vbC5wdXNoKGluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVUb3BMZXZlbChib29rS2VlcGluZykge1xuICB2YXIgdGFyZ2V0SW5zdCA9IGJvb2tLZWVwaW5nLnRhcmdldEluc3Q7XG5cbiAgLy8gTG9vcCB0aHJvdWdoIHRoZSBoaWVyYXJjaHksIGluIGNhc2UgdGhlcmUncyBhbnkgbmVzdGVkIGNvbXBvbmVudHMuXG4gIC8vIEl0J3MgaW1wb3J0YW50IHRoYXQgd2UgYnVpbGQgdGhlIGFycmF5IG9mIGFuY2VzdG9ycyBiZWZvcmUgY2FsbGluZyBhbnlcbiAgLy8gZXZlbnQgaGFuZGxlcnMsIGJlY2F1c2UgZXZlbnQgaGFuZGxlcnMgY2FuIG1vZGlmeSB0aGUgRE9NLCBsZWFkaW5nIHRvXG4gIC8vIGluY29uc2lzdGVuY2llcyB3aXRoIFJlYWN0TW91bnQncyBub2RlIGNhY2hlLiBTZWUgIzExMDUuXG4gIHZhciBhbmNlc3RvciA9IHRhcmdldEluc3Q7XG4gIGRvIHtcbiAgICBpZiAoIWFuY2VzdG9yKSB7XG4gICAgICBib29rS2VlcGluZy5hbmNlc3RvcnMucHVzaChhbmNlc3Rvcik7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIHJvb3QgPSBmaW5kUm9vdENvbnRhaW5lck5vZGUoYW5jZXN0b3IpO1xuICAgIGlmICghcm9vdCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGJvb2tLZWVwaW5nLmFuY2VzdG9ycy5wdXNoKGFuY2VzdG9yKTtcbiAgICBhbmNlc3RvciA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHJvb3QpO1xuICB9IHdoaWxlIChhbmNlc3Rvcik7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBib29rS2VlcGluZy5hbmNlc3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICB0YXJnZXRJbnN0ID0gYm9va0tlZXBpbmcuYW5jZXN0b3JzW2ldO1xuICAgIHJ1bkV4dHJhY3RlZEV2ZW50c0luQmF0Y2goYm9va0tlZXBpbmcudG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBib29rS2VlcGluZy5uYXRpdmVFdmVudCwgZ2V0RXZlbnRUYXJnZXQoYm9va0tlZXBpbmcubmF0aXZlRXZlbnQpKTtcbiAgfVxufVxuXG4vLyBUT0RPOiBjYW4gd2Ugc3RvcCBleHBvcnRpbmcgdGhlc2U/XG52YXIgX2VuYWJsZWQgPSB0cnVlO1xuXG5mdW5jdGlvbiBzZXRFbmFibGVkKGVuYWJsZWQpIHtcbiAgX2VuYWJsZWQgPSAhIWVuYWJsZWQ7XG59XG5cbmZ1bmN0aW9uIGlzRW5hYmxlZCgpIHtcbiAgcmV0dXJuIF9lbmFibGVkO1xufVxuXG4vKipcbiAqIFRyYXBzIHRvcC1sZXZlbCBldmVudHMgYnkgdXNpbmcgZXZlbnQgYnViYmxpbmcuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHRvcExldmVsVHlwZSBOdW1iZXIgZnJvbSBgVG9wTGV2ZWxFdmVudFR5cGVzYC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBlbGVtZW50IEVsZW1lbnQgb24gd2hpY2ggdG8gYXR0YWNoIGxpc3RlbmVyLlxuICogQHJldHVybiB7P29iamVjdH0gQW4gb2JqZWN0IHdpdGggYSByZW1vdmUgZnVuY3Rpb24gd2hpY2ggd2lsbCBmb3JjZWZ1bGx5XG4gKiAgICAgICAgICAgICAgICAgIHJlbW92ZSB0aGUgbGlzdGVuZXIuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gdHJhcEJ1YmJsZWRFdmVudCh0b3BMZXZlbFR5cGUsIGVsZW1lbnQpIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGRpc3BhdGNoID0gaXNJbnRlcmFjdGl2ZVRvcExldmVsRXZlbnRUeXBlKHRvcExldmVsVHlwZSkgPyBkaXNwYXRjaEludGVyYWN0aXZlRXZlbnQgOiBkaXNwYXRjaEV2ZW50O1xuXG4gIGFkZEV2ZW50QnViYmxlTGlzdGVuZXIoZWxlbWVudCwgZ2V0UmF3RXZlbnROYW1lKHRvcExldmVsVHlwZSksXG4gIC8vIENoZWNrIGlmIGludGVyYWN0aXZlIGFuZCB3cmFwIGluIGludGVyYWN0aXZlVXBkYXRlc1xuICBkaXNwYXRjaC5iaW5kKG51bGwsIHRvcExldmVsVHlwZSkpO1xufVxuXG4vKipcbiAqIFRyYXBzIGEgdG9wLWxldmVsIGV2ZW50IGJ5IHVzaW5nIGV2ZW50IGNhcHR1cmluZy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdG9wTGV2ZWxUeXBlIE51bWJlciBmcm9tIGBUb3BMZXZlbEV2ZW50VHlwZXNgLlxuICogQHBhcmFtIHtvYmplY3R9IGVsZW1lbnQgRWxlbWVudCBvbiB3aGljaCB0byBhdHRhY2ggbGlzdGVuZXIuXG4gKiBAcmV0dXJuIHs/b2JqZWN0fSBBbiBvYmplY3Qgd2l0aCBhIHJlbW92ZSBmdW5jdGlvbiB3aGljaCB3aWxsIGZvcmNlZnVsbHlcbiAqICAgICAgICAgICAgICAgICAgcmVtb3ZlIHRoZSBsaXN0ZW5lci5cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiB0cmFwQ2FwdHVyZWRFdmVudCh0b3BMZXZlbFR5cGUsIGVsZW1lbnQpIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGRpc3BhdGNoID0gaXNJbnRlcmFjdGl2ZVRvcExldmVsRXZlbnRUeXBlKHRvcExldmVsVHlwZSkgPyBkaXNwYXRjaEludGVyYWN0aXZlRXZlbnQgOiBkaXNwYXRjaEV2ZW50O1xuXG4gIGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyKGVsZW1lbnQsIGdldFJhd0V2ZW50TmFtZSh0b3BMZXZlbFR5cGUpLFxuICAvLyBDaGVjayBpZiBpbnRlcmFjdGl2ZSBhbmQgd3JhcCBpbiBpbnRlcmFjdGl2ZVVwZGF0ZXNcbiAgZGlzcGF0Y2guYmluZChudWxsLCB0b3BMZXZlbFR5cGUpKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hJbnRlcmFjdGl2ZUV2ZW50KHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpIHtcbiAgaW50ZXJhY3RpdmVVcGRhdGVzKGRpc3BhdGNoRXZlbnQsIHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpIHtcbiAgaWYgKCFfZW5hYmxlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBuYXRpdmVFdmVudFRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KTtcbiAgdmFyIHRhcmdldEluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShuYXRpdmVFdmVudFRhcmdldCk7XG4gIGlmICh0YXJnZXRJbnN0ICE9PSBudWxsICYmIHR5cGVvZiB0YXJnZXRJbnN0LnRhZyA9PT0gJ251bWJlcicgJiYgIWlzRmliZXJNb3VudGVkKHRhcmdldEluc3QpKSB7XG4gICAgLy8gSWYgd2UgZ2V0IGFuIGV2ZW50IChleDogaW1nIG9ubG9hZCkgYmVmb3JlIGNvbW1pdHRpbmcgdGhhdFxuICAgIC8vIGNvbXBvbmVudCdzIG1vdW50LCBpZ25vcmUgaXQgZm9yIG5vdyAodGhhdCBpcywgdHJlYXQgaXQgYXMgaWYgaXQgd2FzIGFuXG4gICAgLy8gZXZlbnQgb24gYSBub24tUmVhY3QgdHJlZSkuIFdlIG1pZ2h0IGFsc28gY29uc2lkZXIgcXVldWVpbmcgZXZlbnRzIGFuZFxuICAgIC8vIGRpc3BhdGNoaW5nIHRoZW0gYWZ0ZXIgdGhlIG1vdW50LlxuICAgIHRhcmdldEluc3QgPSBudWxsO1xuICB9XG5cbiAgdmFyIGJvb2tLZWVwaW5nID0gZ2V0VG9wTGV2ZWxDYWxsYmFja0Jvb2tLZWVwaW5nKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQsIHRhcmdldEluc3QpO1xuXG4gIHRyeSB7XG4gICAgLy8gRXZlbnQgcXVldWUgYmVpbmcgcHJvY2Vzc2VkIGluIHRoZSBzYW1lIGN5Y2xlIGFsbG93c1xuICAgIC8vIGBwcmV2ZW50RGVmYXVsdGAuXG4gICAgYmF0Y2hlZFVwZGF0ZXMoaGFuZGxlVG9wTGV2ZWwsIGJvb2tLZWVwaW5nKTtcbiAgfSBmaW5hbGx5IHtcbiAgICByZWxlYXNlVG9wTGV2ZWxDYWxsYmFja0Jvb2tLZWVwaW5nKGJvb2tLZWVwaW5nKTtcbiAgfVxufVxuXG4vKipcbiAqIFN1bW1hcnkgb2YgYFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlcmAgZXZlbnQgaGFuZGxpbmc6XG4gKlxuICogIC0gVG9wLWxldmVsIGRlbGVnYXRpb24gaXMgdXNlZCB0byB0cmFwIG1vc3QgbmF0aXZlIGJyb3dzZXIgZXZlbnRzLiBUaGlzXG4gKiAgICBtYXkgb25seSBvY2N1ciBpbiB0aGUgbWFpbiB0aHJlYWQgYW5kIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZlxuICogICAgUmVhY3RET01FdmVudExpc3RlbmVyLCB3aGljaCBpcyBpbmplY3RlZCBhbmQgY2FuIHRoZXJlZm9yZSBzdXBwb3J0XG4gKiAgICBwbHVnZ2FibGUgZXZlbnQgc291cmNlcy4gVGhpcyBpcyB0aGUgb25seSB3b3JrIHRoYXQgb2NjdXJzIGluIHRoZSBtYWluXG4gKiAgICB0aHJlYWQuXG4gKlxuICogIC0gV2Ugbm9ybWFsaXplIGFuZCBkZS1kdXBsaWNhdGUgZXZlbnRzIHRvIGFjY291bnQgZm9yIGJyb3dzZXIgcXVpcmtzLiBUaGlzXG4gKiAgICBtYXkgYmUgZG9uZSBpbiB0aGUgd29ya2VyIHRocmVhZC5cbiAqXG4gKiAgLSBGb3J3YXJkIHRoZXNlIG5hdGl2ZSBldmVudHMgKHdpdGggdGhlIGFzc29jaWF0ZWQgdG9wLWxldmVsIHR5cGUgdXNlZCB0b1xuICogICAgdHJhcCBpdCkgdG8gYEV2ZW50UGx1Z2luSHViYCwgd2hpY2ggaW4gdHVybiB3aWxsIGFzayBwbHVnaW5zIGlmIHRoZXkgd2FudFxuICogICAgdG8gZXh0cmFjdCBhbnkgc3ludGhldGljIGV2ZW50cy5cbiAqXG4gKiAgLSBUaGUgYEV2ZW50UGx1Z2luSHViYCB3aWxsIHRoZW4gcHJvY2VzcyBlYWNoIGV2ZW50IGJ5IGFubm90YXRpbmcgdGhlbSB3aXRoXG4gKiAgICBcImRpc3BhdGNoZXNcIiwgYSBzZXF1ZW5jZSBvZiBsaXN0ZW5lcnMgYW5kIElEcyB0aGF0IGNhcmUgYWJvdXQgdGhhdCBldmVudC5cbiAqXG4gKiAgLSBUaGUgYEV2ZW50UGx1Z2luSHViYCB0aGVuIGRpc3BhdGNoZXMgdGhlIGV2ZW50cy5cbiAqXG4gKiBPdmVydmlldyBvZiBSZWFjdCBhbmQgdGhlIGV2ZW50IHN5c3RlbTpcbiAqXG4gKiArLS0tLS0tLS0tLS0tKyAgICAuXG4gKiB8ICAgIERPTSAgICAgfCAgICAuXG4gKiArLS0tLS0tLS0tLS0tKyAgICAuXG4gKiAgICAgICB8ICAgICAgICAgICAuXG4gKiAgICAgICB2ICAgICAgICAgICAuXG4gKiArLS0tLS0tLS0tLS0tKyAgICAuXG4gKiB8IFJlYWN0RXZlbnQgfCAgICAuXG4gKiB8ICBMaXN0ZW5lciAgfCAgICAuXG4gKiArLS0tLS0tLS0tLS0tKyAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLStcbiAqICAgICAgIHwgICAgICAgICAgIC4gICAgICAgICAgICAgICArLS0tLS0tLS0rfFNpbXBsZUV2ZW50fFxuICogICAgICAgfCAgICAgICAgICAgLiAgICAgICAgICAgICAgIHwgICAgICAgICB8UGx1Z2luICAgICB8XG4gKiArLS0tLS18LS0tLS0tKyAgICAuICAgICAgICAgICAgICAgdiAgICAgICAgICstLS0tLS0tLS0tLStcbiAqIHwgICAgIHwgICAgICB8ICAgIC4gICAgKy0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLStcbiAqIHwgICAgICstLS0tLS0tLS0tLS4tLS0+fEV2ZW50UGx1Z2luSHVifCAgICAgICAgICAgICAgICAgICAgfCAgICBFdmVudCAgIHxcbiAqIHwgICAgICAgICAgICB8ICAgIC4gICAgfCAgICAgICAgICAgICAgfCAgICAgKy0tLS0tLS0tLS0tKyAgfCBQcm9wYWdhdG9yc3xcbiAqIHwgUmVhY3RFdmVudCB8ICAgIC4gICAgfCAgICAgICAgICAgICAgfCAgICAgfFRhcEV2ZW50ICAgfCAgfC0tLS0tLS0tLS0tLXxcbiAqIHwgIEVtaXR0ZXIgICB8ICAgIC4gICAgfCAgICAgICAgICAgICAgfDwtLS0rfFBsdWdpbiAgICAgfCAgfG90aGVyIHBsdWdpbnxcbiAqIHwgICAgICAgICAgICB8ICAgIC4gICAgfCAgICAgICAgICAgICAgfCAgICAgKy0tLS0tLS0tLS0tKyAgfCAgdXRpbGl0aWVzIHxcbiAqIHwgICAgICstLS0tLS0tLS0tLS4tLS0+fCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLStcbiAqIHwgICAgIHwgICAgICB8ICAgIC4gICAgKy0tLS0tLS0tLS0tLS0tK1xuICogKy0tLS0tfC0tLS0tLSsgICAgLiAgICAgICAgICAgICAgICBeICAgICAgICArLS0tLS0tLS0tLS0rXG4gKiAgICAgICB8ICAgICAgICAgICAuICAgICAgICAgICAgICAgIHwgICAgICAgIHxFbnRlci9MZWF2ZXxcbiAqICAgICAgICsgICAgICAgICAgIC4gICAgICAgICAgICAgICAgKy0tLS0tLS0rfFBsdWdpbiAgICAgfFxuICogKy0tLS0tLS0tLS0tLS0rICAgLiAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rXG4gKiB8IGFwcGxpY2F0aW9uIHwgICAuXG4gKiB8LS0tLS0tLS0tLS0tLXwgICAuXG4gKiB8ICAgICAgICAgICAgIHwgICAuXG4gKiB8ICAgICAgICAgICAgIHwgICAuXG4gKiArLS0tLS0tLS0tLS0tLSsgICAuXG4gKiAgICAgICAgICAgICAgICAgICAuXG4gKiAgICBSZWFjdCBDb3JlICAgICAuICBHZW5lcmFsIFB1cnBvc2UgRXZlbnQgUGx1Z2luIFN5c3RlbVxuICovXG5cbnZhciBhbHJlYWR5TGlzdGVuaW5nVG8gPSB7fTtcbnZhciByZWFjdFRvcExpc3RlbmVyc0NvdW50ZXIgPSAwO1xuXG4vKipcbiAqIFRvIGVuc3VyZSBubyBjb25mbGljdHMgd2l0aCBvdGhlciBwb3RlbnRpYWwgUmVhY3QgaW5zdGFuY2VzIG9uIHRoZSBwYWdlXG4gKi9cbnZhciB0b3BMaXN0ZW5lcnNJREtleSA9ICdfcmVhY3RMaXN0ZW5lcnNJRCcgKyAoJycgKyBNYXRoLnJhbmRvbSgpKS5zbGljZSgyKTtcblxuZnVuY3Rpb24gZ2V0TGlzdGVuaW5nRm9yRG9jdW1lbnQobW91bnRBdCkge1xuICAvLyBJbiBJRTgsIGBtb3VudEF0YCBpcyBhIGhvc3Qgb2JqZWN0IGFuZCBkb2Vzbid0IGhhdmUgYGhhc093blByb3BlcnR5YFxuICAvLyBkaXJlY3RseS5cbiAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW91bnRBdCwgdG9wTGlzdGVuZXJzSURLZXkpKSB7XG4gICAgbW91bnRBdFt0b3BMaXN0ZW5lcnNJREtleV0gPSByZWFjdFRvcExpc3RlbmVyc0NvdW50ZXIrKztcbiAgICBhbHJlYWR5TGlzdGVuaW5nVG9bbW91bnRBdFt0b3BMaXN0ZW5lcnNJREtleV1dID0ge307XG4gIH1cbiAgcmV0dXJuIGFscmVhZHlMaXN0ZW5pbmdUb1ttb3VudEF0W3RvcExpc3RlbmVyc0lES2V5XV07XG59XG5cbi8qKlxuICogV2UgbGlzdGVuIGZvciBidWJibGVkIHRvdWNoIGV2ZW50cyBvbiB0aGUgZG9jdW1lbnQgb2JqZWN0LlxuICpcbiAqIEZpcmVmb3ggdjguMDEgKGFuZCBwb3NzaWJseSBvdGhlcnMpIGV4aGliaXRlZCBzdHJhbmdlIGJlaGF2aW9yIHdoZW5cbiAqIG1vdW50aW5nIGBvbm1vdXNlbW92ZWAgZXZlbnRzIGF0IHNvbWUgbm9kZSB0aGF0IHdhcyBub3QgdGhlIGRvY3VtZW50XG4gKiBlbGVtZW50LiBUaGUgc3ltcHRvbXMgd2VyZSB0aGF0IGlmIHlvdXIgbW91c2UgaXMgbm90IG1vdmluZyBvdmVyIHNvbWV0aGluZ1xuICogY29udGFpbmVkIHdpdGhpbiB0aGF0IG1vdW50IHBvaW50IChmb3IgZXhhbXBsZSBvbiB0aGUgYmFja2dyb3VuZCkgdGhlXG4gKiB0b3AtbGV2ZWwgbGlzdGVuZXJzIGZvciBgb25tb3VzZW1vdmVgIHdvbid0IGJlIGNhbGxlZC4gSG93ZXZlciwgaWYgeW91XG4gKiByZWdpc3RlciB0aGUgYG1vdXNlbW92ZWAgb24gdGhlIGRvY3VtZW50IG9iamVjdCwgdGhlbiBpdCB3aWxsIG9mIGNvdXJzZVxuICogY2F0Y2ggYWxsIGBtb3VzZW1vdmVgcy4gVGhpcyBhbG9uZyB3aXRoIGlPUyBxdWlya3MsIGp1c3RpZmllcyByZXN0cmljdGluZ1xuICogdG9wLWxldmVsIGxpc3RlbmVycyB0byB0aGUgZG9jdW1lbnQgb2JqZWN0IG9ubHksIGF0IGxlYXN0IGZvciB0aGVzZVxuICogbW92ZW1lbnQgdHlwZXMgb2YgZXZlbnRzIGFuZCBwb3NzaWJseSBhbGwgZXZlbnRzLlxuICpcbiAqIEBzZWUgaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTAvMDkvY2xpY2tfZXZlbnRfZGVsLmh0bWxcbiAqXG4gKiBBbHNvLCBga2V5dXBgL2BrZXlwcmVzc2AvYGtleWRvd25gIGRvIG5vdCBidWJibGUgdG8gdGhlIHdpbmRvdyBvbiBJRSwgYnV0XG4gKiB0aGV5IGJ1YmJsZSB0byBkb2N1bWVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBOYW1lIG9mIGxpc3RlbmVyIChlLmcuIGBvbkNsaWNrYCkuXG4gKiBAcGFyYW0ge29iamVjdH0gbW91bnRBdCBDb250YWluZXIgd2hlcmUgdG8gbW91bnQgdGhlIGxpc3RlbmVyXG4gKi9cbmZ1bmN0aW9uIGxpc3RlblRvKHJlZ2lzdHJhdGlvbk5hbWUsIG1vdW50QXQpIHtcbiAgdmFyIGlzTGlzdGVuaW5nID0gZ2V0TGlzdGVuaW5nRm9yRG9jdW1lbnQobW91bnRBdCk7XG4gIHZhciBkZXBlbmRlbmNpZXMgPSByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGVwZW5kZW5jaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlcGVuZGVuY3kgPSBkZXBlbmRlbmNpZXNbaV07XG4gICAgaWYgKCEoaXNMaXN0ZW5pbmcuaGFzT3duUHJvcGVydHkoZGVwZW5kZW5jeSkgJiYgaXNMaXN0ZW5pbmdbZGVwZW5kZW5jeV0pKSB7XG4gICAgICBzd2l0Y2ggKGRlcGVuZGVuY3kpIHtcbiAgICAgICAgY2FzZSBUT1BfU0NST0xMOlxuICAgICAgICAgIHRyYXBDYXB0dXJlZEV2ZW50KFRPUF9TQ1JPTEwsIG1vdW50QXQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRPUF9GT0NVUzpcbiAgICAgICAgY2FzZSBUT1BfQkxVUjpcbiAgICAgICAgICB0cmFwQ2FwdHVyZWRFdmVudChUT1BfRk9DVVMsIG1vdW50QXQpO1xuICAgICAgICAgIHRyYXBDYXB0dXJlZEV2ZW50KFRPUF9CTFVSLCBtb3VudEF0KTtcbiAgICAgICAgICAvLyBXZSBzZXQgdGhlIGZsYWcgZm9yIGEgc2luZ2xlIGRlcGVuZGVuY3kgbGF0ZXIgaW4gdGhpcyBmdW5jdGlvbixcbiAgICAgICAgICAvLyBidXQgdGhpcyBlbnN1cmVzIHdlIG1hcmsgYm90aCBhcyBhdHRhY2hlZCByYXRoZXIgdGhhbiBqdXN0IG9uZS5cbiAgICAgICAgICBpc0xpc3RlbmluZ1tUT1BfQkxVUl0gPSB0cnVlO1xuICAgICAgICAgIGlzTGlzdGVuaW5nW1RPUF9GT0NVU10gPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRPUF9DQU5DRUw6XG4gICAgICAgIGNhc2UgVE9QX0NMT1NFOlxuICAgICAgICAgIGlmIChpc0V2ZW50U3VwcG9ydGVkKGdldFJhd0V2ZW50TmFtZShkZXBlbmRlbmN5KSkpIHtcbiAgICAgICAgICAgIHRyYXBDYXB0dXJlZEV2ZW50KGRlcGVuZGVuY3ksIG1vdW50QXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUT1BfSU5WQUxJRDpcbiAgICAgICAgY2FzZSBUT1BfU1VCTUlUOlxuICAgICAgICBjYXNlIFRPUF9SRVNFVDpcbiAgICAgICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlbSBvbiB0aGUgdGFyZ2V0IERPTSBlbGVtZW50cy5cbiAgICAgICAgICAvLyBTb21lIG9mIHRoZW0gYnViYmxlIHNvIHdlIGRvbid0IHdhbnQgdGhlbSB0byBmaXJlIHR3aWNlLlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGxpc3RlbiBvbiB0aGUgdG9wIGxldmVsIHRvIGFsbCBub24tbWVkaWEgZXZlbnRzLlxuICAgICAgICAgIC8vIE1lZGlhIGV2ZW50cyBkb24ndCBidWJibGUgc28gYWRkaW5nIHRoZSBsaXN0ZW5lciB3b3VsZG4ndCBkbyBhbnl0aGluZy5cbiAgICAgICAgICB2YXIgaXNNZWRpYUV2ZW50ID0gbWVkaWFFdmVudFR5cGVzLmluZGV4T2YoZGVwZW5kZW5jeSkgIT09IC0xO1xuICAgICAgICAgIGlmICghaXNNZWRpYUV2ZW50KSB7XG4gICAgICAgICAgICB0cmFwQnViYmxlZEV2ZW50KGRlcGVuZGVuY3ksIG1vdW50QXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlzTGlzdGVuaW5nW2RlcGVuZGVuY3ldID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNMaXN0ZW5pbmdUb0FsbERlcGVuZGVuY2llcyhyZWdpc3RyYXRpb25OYW1lLCBtb3VudEF0KSB7XG4gIHZhciBpc0xpc3RlbmluZyA9IGdldExpc3RlbmluZ0ZvckRvY3VtZW50KG1vdW50QXQpO1xuICB2YXIgZGVwZW5kZW5jaWVzID0gcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tyZWdpc3RyYXRpb25OYW1lXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXBlbmRlbmNpZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVwZW5kZW5jeSA9IGRlcGVuZGVuY2llc1tpXTtcbiAgICBpZiAoIShpc0xpc3RlbmluZy5oYXNPd25Qcm9wZXJ0eShkZXBlbmRlbmN5KSAmJiBpc0xpc3RlbmluZ1tkZXBlbmRlbmN5XSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldEFjdGl2ZUVsZW1lbnQoZG9jKSB7XG4gIGRvYyA9IGRvYyB8fCAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IGRvY3VtZW50IDogdW5kZWZpbmVkKTtcbiAgaWYgKHR5cGVvZiBkb2MgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gZG9jLmFjdGl2ZUVsZW1lbnQgfHwgZG9jLmJvZHk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZG9jLmJvZHk7XG4gIH1cbn1cblxuLyoqXG4gKiBHaXZlbiBhbnkgbm9kZSByZXR1cm4gdGhlIGZpcnN0IGxlYWYgbm9kZSB3aXRob3V0IGNoaWxkcmVuLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHJldHVybiB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX1cbiAqL1xuZnVuY3Rpb24gZ2V0TGVhZk5vZGUobm9kZSkge1xuICB3aGlsZSAobm9kZSAmJiBub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICBub2RlID0gbm9kZS5maXJzdENoaWxkO1xuICB9XG4gIHJldHVybiBub2RlO1xufVxuXG4vKipcbiAqIEdldCB0aGUgbmV4dCBzaWJsaW5nIHdpdGhpbiBhIGNvbnRhaW5lci4gVGhpcyB3aWxsIHdhbGsgdXAgdGhlXG4gKiBET00gaWYgYSBub2RlJ3Mgc2libGluZ3MgaGF2ZSBiZWVuIGV4aGF1c3RlZC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEByZXR1cm4gez9ET01FbGVtZW50fERPTVRleHROb2RlfVxuICovXG5mdW5jdGlvbiBnZXRTaWJsaW5nTm9kZShub2RlKSB7XG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nO1xuICAgIH1cbiAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICB9XG59XG5cbi8qKlxuICogR2V0IG9iamVjdCBkZXNjcmliaW5nIHRoZSBub2RlcyB3aGljaCBjb250YWluIGNoYXJhY3RlcnMgYXQgb2Zmc2V0LlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gcm9vdFxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICogQHJldHVybiB7P29iamVjdH1cbiAqL1xuZnVuY3Rpb24gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChyb290LCBvZmZzZXQpIHtcbiAgdmFyIG5vZGUgPSBnZXRMZWFmTm9kZShyb290KTtcbiAgdmFyIG5vZGVTdGFydCA9IDA7XG4gIHZhciBub2RlRW5kID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgIG5vZGVFbmQgPSBub2RlU3RhcnQgKyBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcblxuICAgICAgaWYgKG5vZGVTdGFydCA8PSBvZmZzZXQgJiYgbm9kZUVuZCA+PSBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgIG9mZnNldDogb2Zmc2V0IC0gbm9kZVN0YXJ0XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIG5vZGVTdGFydCA9IG5vZGVFbmQ7XG4gICAgfVxuXG4gICAgbm9kZSA9IGdldExlYWZOb2RlKGdldFNpYmxpbmdOb2RlKG5vZGUpKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gb3V0ZXJOb2RlXG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRPZmZzZXRzKG91dGVyTm9kZSkge1xuICB2YXIgb3duZXJEb2N1bWVudCA9IG91dGVyTm9kZS5vd25lckRvY3VtZW50O1xuXG4gIHZhciB3aW4gPSBvd25lckRvY3VtZW50ICYmIG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbiAmJiB3aW4uZ2V0U2VsZWN0aW9uKCk7XG5cbiAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBhbmNob3JOb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGUsXG4gICAgICBhbmNob3JPZmZzZXQgPSBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LFxuICAgICAgZm9jdXNOb2RlID0gc2VsZWN0aW9uLmZvY3VzTm9kZSxcbiAgICAgIGZvY3VzT2Zmc2V0ID0gc2VsZWN0aW9uLmZvY3VzT2Zmc2V0O1xuXG4gIC8vIEluIEZpcmVmb3gsIGFuY2hvck5vZGUgYW5kIGZvY3VzTm9kZSBjYW4gYmUgXCJhbm9ueW1vdXMgZGl2c1wiLCBlLmcuIHRoZVxuICAvLyB1cC9kb3duIGJ1dHRvbnMgb24gYW4gPGlucHV0IHR5cGU9XCJudW1iZXJcIj4uIEFub255bW91cyBkaXZzIGRvIG5vdCBzZWVtIHRvXG4gIC8vIGV4cG9zZSBwcm9wZXJ0aWVzLCB0cmlnZ2VyaW5nIGEgXCJQZXJtaXNzaW9uIGRlbmllZCBlcnJvclwiIGlmIGFueSBvZiBpdHNcbiAgLy8gcHJvcGVydGllcyBhcmUgYWNjZXNzZWQuIFRoZSBvbmx5IHNlZW1pbmdseSBwb3NzaWJsZSB3YXkgdG8gYXZvaWQgZXJyb3JpbmdcbiAgLy8gaXMgdG8gYWNjZXNzIGEgcHJvcGVydHkgdGhhdCB0eXBpY2FsbHkgd29ya3MgZm9yIG5vbi1hbm9ueW1vdXMgZGl2cyBhbmRcbiAgLy8gY2F0Y2ggYW55IGVycm9yIHRoYXQgbWF5IG90aGVyd2lzZSBhcmlzZS4gU2VlXG4gIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTIwODQyN1xuXG4gIHRyeSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gICAgYW5jaG9yTm9kZS5ub2RlVHlwZTtcbiAgICBmb2N1c05vZGUubm9kZVR5cGU7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtZXhwcmVzc2lvbnMgKi9cbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGdldE1vZGVybk9mZnNldHNGcm9tUG9pbnRzKG91dGVyTm9kZSwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHtzdGFydCwgZW5kfSB3aGVyZSBgc3RhcnRgIGlzIHRoZSBjaGFyYWN0ZXIvY29kZXBvaW50IGluZGV4IG9mXG4gKiAoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0KSB3aXRoaW4gdGhlIHRleHRDb250ZW50IG9mIGBvdXRlck5vZGVgLCBhbmRcbiAqIGBlbmRgIGlzIHRoZSBpbmRleCBvZiAoZm9jdXNOb2RlLCBmb2N1c09mZnNldCkuXG4gKlxuICogUmV0dXJucyBudWxsIGlmIHlvdSBwYXNzIGluIGdhcmJhZ2UgaW5wdXQgYnV0IHdlIHNob3VsZCBwcm9iYWJseSBqdXN0IGNyYXNoLlxuICpcbiAqIEV4cG9ydGVkIG9ubHkgZm9yIHRlc3RpbmcuXG4gKi9cbmZ1bmN0aW9uIGdldE1vZGVybk9mZnNldHNGcm9tUG9pbnRzKG91dGVyTm9kZSwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KSB7XG4gIHZhciBsZW5ndGggPSAwO1xuICB2YXIgc3RhcnQgPSAtMTtcbiAgdmFyIGVuZCA9IC0xO1xuICB2YXIgaW5kZXhXaXRoaW5BbmNob3IgPSAwO1xuICB2YXIgaW5kZXhXaXRoaW5Gb2N1cyA9IDA7XG4gIHZhciBub2RlID0gb3V0ZXJOb2RlO1xuICB2YXIgcGFyZW50Tm9kZSA9IG51bGw7XG5cbiAgb3V0ZXI6IHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIG5leHQgPSBudWxsO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlID09PSBhbmNob3JOb2RlICYmIChhbmNob3JPZmZzZXQgPT09IDAgfHwgbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSkge1xuICAgICAgICBzdGFydCA9IGxlbmd0aCArIGFuY2hvck9mZnNldDtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlID09PSBmb2N1c05vZGUgJiYgKGZvY3VzT2Zmc2V0ID09PSAwIHx8IG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkpIHtcbiAgICAgICAgZW5kID0gbGVuZ3RoICsgZm9jdXNPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgICAgbGVuZ3RoICs9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKChuZXh0ID0gbm9kZS5maXJzdENoaWxkKSA9PT0gbnVsbCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vIE1vdmluZyBmcm9tIGBub2RlYCB0byBpdHMgZmlyc3QgY2hpbGQgYG5leHRgLlxuICAgICAgcGFyZW50Tm9kZSA9IG5vZGU7XG4gICAgICBub2RlID0gbmV4dDtcbiAgICB9XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUgPT09IG91dGVyTm9kZSkge1xuICAgICAgICAvLyBJZiBgb3V0ZXJOb2RlYCBoYXMgY2hpbGRyZW4sIHRoaXMgaXMgYWx3YXlzIHRoZSBzZWNvbmQgdGltZSB2aXNpdGluZ1xuICAgICAgICAvLyBpdC4gSWYgaXQgaGFzIG5vIGNoaWxkcmVuLCB0aGlzIGlzIHN0aWxsIHRoZSBmaXJzdCBsb29wLCBhbmQgdGhlIG9ubHlcbiAgICAgICAgLy8gdmFsaWQgc2VsZWN0aW9uIGlzIGFuY2hvck5vZGUgYW5kIGZvY3VzTm9kZSBib3RoIGVxdWFsIHRvIHRoaXMgbm9kZVxuICAgICAgICAvLyBhbmQgYm90aCBvZmZzZXRzIDAsIGluIHdoaWNoIGNhc2Ugd2Ugd2lsbCBoYXZlIGhhbmRsZWQgYWJvdmUuXG4gICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmVudE5vZGUgPT09IGFuY2hvck5vZGUgJiYgKytpbmRleFdpdGhpbkFuY2hvciA9PT0gYW5jaG9yT2Zmc2V0KSB7XG4gICAgICAgIHN0YXJ0ID0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmVudE5vZGUgPT09IGZvY3VzTm9kZSAmJiArK2luZGV4V2l0aGluRm9jdXMgPT09IGZvY3VzT2Zmc2V0KSB7XG4gICAgICAgIGVuZCA9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGlmICgobmV4dCA9IG5vZGUubmV4dFNpYmxpbmcpICE9PSBudWxsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbm9kZSA9IHBhcmVudE5vZGU7XG4gICAgICBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cblxuICAgIC8vIE1vdmluZyBmcm9tIGBub2RlYCB0byBpdHMgbmV4dCBzaWJsaW5nIGBuZXh0YC5cbiAgICBub2RlID0gbmV4dDtcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gLTEgfHwgZW5kID09PSAtMSkge1xuICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gKFdvdWxkIGhhcHBlbiBpZiB0aGUgYW5jaG9yL2ZvY3VzIG5vZGVzIGFyZW4ndFxuICAgIC8vIGFjdHVhbGx5IGluc2lkZSB0aGUgcGFzc2VkLWluIG5vZGUuKVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydDogc3RhcnQsXG4gICAgZW5kOiBlbmRcbiAgfTtcbn1cblxuLyoqXG4gKiBJbiBtb2Rlcm4gbm9uLUlFIGJyb3dzZXJzLCB3ZSBjYW4gc3VwcG9ydCBib3RoIGZvcndhcmQgYW5kIGJhY2t3YXJkXG4gKiBzZWxlY3Rpb25zLlxuICpcbiAqIE5vdGU6IElFMTArIHN1cHBvcnRzIHRoZSBTZWxlY3Rpb24gb2JqZWN0LCBidXQgaXQgZG9lcyBub3Qgc3VwcG9ydFxuICogdGhlIGBleHRlbmRgIG1ldGhvZCwgd2hpY2ggbWVhbnMgdGhhdCBldmVuIGluIG1vZGVybiBJRSwgaXQncyBub3QgcG9zc2libGVcbiAqIHRvIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlIGEgYmFja3dhcmQgc2VsZWN0aW9uLiBUaHVzLCBmb3IgYWxsIElFXG4gKiB2ZXJzaW9ucywgd2UgdXNlIHRoZSBvbGQgSUUgQVBJIHRvIGNyZWF0ZSBvdXIgc2VsZWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvZmZzZXRzXG4gKi9cbmZ1bmN0aW9uIHNldE9mZnNldHMobm9kZSwgb2Zmc2V0cykge1xuICB2YXIgZG9jID0gbm9kZS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50O1xuICB2YXIgd2luID0gZG9jICYmIGRvYy5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG5cbiAgLy8gRWRnZSBmYWlscyB3aXRoIFwiT2JqZWN0IGV4cGVjdGVkXCIgaW4gc29tZSBzY2VuYXJpb3MuXG4gIC8vIChGb3IgaW5zdGFuY2U6IFRpbnlNQ0UgZWRpdG9yIHVzZWQgaW4gYSBsaXN0IGNvbXBvbmVudCB0aGF0IHN1cHBvcnRzIHBhc3RpbmcgdG8gYWRkIG1vcmUsXG4gIC8vIGZhaWxzIHdoZW4gcGFzdGluZyAxMDArIGl0ZW1zKVxuICBpZiAoIXdpbi5nZXRTZWxlY3Rpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbigpO1xuICB2YXIgbGVuZ3RoID0gbm9kZS50ZXh0Q29udGVudC5sZW5ndGg7XG4gIHZhciBzdGFydCA9IE1hdGgubWluKG9mZnNldHMuc3RhcnQsIGxlbmd0aCk7XG4gIHZhciBlbmQgPSBvZmZzZXRzLmVuZCA9PT0gdW5kZWZpbmVkID8gc3RhcnQgOiBNYXRoLm1pbihvZmZzZXRzLmVuZCwgbGVuZ3RoKTtcblxuICAvLyBJRSAxMSB1c2VzIG1vZGVybiBzZWxlY3Rpb24sIGJ1dCBkb2Vzbid0IHN1cHBvcnQgdGhlIGV4dGVuZCBtZXRob2QuXG4gIC8vIEZsaXAgYmFja3dhcmQgc2VsZWN0aW9ucywgc28gd2UgY2FuIHNldCB3aXRoIGEgc2luZ2xlIHJhbmdlLlxuICBpZiAoIXNlbGVjdGlvbi5leHRlbmQgJiYgc3RhcnQgPiBlbmQpIHtcbiAgICB2YXIgdGVtcCA9IGVuZDtcbiAgICBlbmQgPSBzdGFydDtcbiAgICBzdGFydCA9IHRlbXA7XG4gIH1cblxuICB2YXIgc3RhcnRNYXJrZXIgPSBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KG5vZGUsIHN0YXJ0KTtcbiAgdmFyIGVuZE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQobm9kZSwgZW5kKTtcblxuICBpZiAoc3RhcnRNYXJrZXIgJiYgZW5kTWFya2VyKSB7XG4gICAgaWYgKHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAxICYmIHNlbGVjdGlvbi5hbmNob3JOb2RlID09PSBzdGFydE1hcmtlci5ub2RlICYmIHNlbGVjdGlvbi5hbmNob3JPZmZzZXQgPT09IHN0YXJ0TWFya2VyLm9mZnNldCAmJiBzZWxlY3Rpb24uZm9jdXNOb2RlID09PSBlbmRNYXJrZXIubm9kZSAmJiBzZWxlY3Rpb24uZm9jdXNPZmZzZXQgPT09IGVuZE1hcmtlci5vZmZzZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHJhbmdlID0gZG9jLmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2V0U3RhcnQoc3RhcnRNYXJrZXIubm9kZSwgc3RhcnRNYXJrZXIub2Zmc2V0KTtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG5cbiAgICBpZiAoc3RhcnQgPiBlbmQpIHtcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICBzZWxlY3Rpb24uZXh0ZW5kKGVuZE1hcmtlci5ub2RlLCBlbmRNYXJrZXIub2Zmc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmFuZ2Uuc2V0RW5kKGVuZE1hcmtlci5ub2RlLCBlbmRNYXJrZXIub2Zmc2V0KTtcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzVGV4dE5vZGUobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLm5vZGVUeXBlID09PSBURVhUX05PREU7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zTm9kZShvdXRlck5vZGUsIGlubmVyTm9kZSkge1xuICBpZiAoIW91dGVyTm9kZSB8fCAhaW5uZXJOb2RlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2UgaWYgKG91dGVyTm9kZSA9PT0gaW5uZXJOb2RlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoaXNUZXh0Tm9kZShvdXRlck5vZGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2UgaWYgKGlzVGV4dE5vZGUoaW5uZXJOb2RlKSkge1xuICAgIHJldHVybiBjb250YWluc05vZGUob3V0ZXJOb2RlLCBpbm5lck5vZGUucGFyZW50Tm9kZSk7XG4gIH0gZWxzZSBpZiAoJ2NvbnRhaW5zJyBpbiBvdXRlck5vZGUpIHtcbiAgICByZXR1cm4gb3V0ZXJOb2RlLmNvbnRhaW5zKGlubmVyTm9kZSk7XG4gIH0gZWxzZSBpZiAob3V0ZXJOb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7XG4gICAgcmV0dXJuICEhKG91dGVyTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihpbm5lck5vZGUpICYgMTYpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0luRG9jdW1lbnQobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgY29udGFpbnNOb2RlKG5vZGUub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIG5vZGUpO1xufVxuXG5mdW5jdGlvbiBpc1NhbWVPcmlnaW5GcmFtZShpZnJhbWUpIHtcbiAgdHJ5IHtcbiAgICAvLyBBY2Nlc3NpbmcgdGhlIGNvbnRlbnREb2N1bWVudCBvZiBhIEhUTUxJZnJhbWVFbGVtZW50IGNhbiBjYXVzZSB0aGUgYnJvd3NlclxuICAgIC8vIHRvIHRocm93LCBlLmcuIGlmIGl0IGhhcyBhIGNyb3NzLW9yaWdpbiBzcmMgYXR0cmlidXRlLlxuICAgIC8vIFNhZmFyaSB3aWxsIHNob3cgYW4gZXJyb3IgaW4gdGhlIGNvbnNvbGUgd2hlbiB0aGUgYWNjZXNzIHJlc3VsdHMgaW4gXCJCbG9ja2VkIGEgZnJhbWUgd2l0aCBvcmlnaW5cIi4gZS5nOlxuICAgIC8vIGlmcmFtZS5jb250ZW50RG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gICAgLy8gQSBzYWZldHkgd2F5IGlzIHRvIGFjY2VzcyBvbmUgb2YgdGhlIGNyb3NzIG9yaWdpbiBwcm9wZXJ0aWVzOiBXaW5kb3cgb3IgTG9jYXRpb25cbiAgICAvLyBXaGljaCBtaWdodCByZXN1bHQgaW4gXCJTZWN1cml0eUVycm9yXCIgRE9NIEV4Y2VwdGlvbiBhbmQgaXQgaXMgY29tcGF0aWJsZSB0byBTYWZhcmkuXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvYnJvd3NlcnMuaHRtbCNpbnRlZ3JhdGlvbi13aXRoLWlkbFxuXG4gICAgcmV0dXJuIHR5cGVvZiBpZnJhbWUuY29udGVudFdpbmRvdy5sb2NhdGlvbi5ocmVmID09PSAnc3RyaW5nJztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEFjdGl2ZUVsZW1lbnREZWVwKCkge1xuICB2YXIgd2luID0gd2luZG93O1xuICB2YXIgZWxlbWVudCA9IGdldEFjdGl2ZUVsZW1lbnQoKTtcbiAgd2hpbGUgKGVsZW1lbnQgaW5zdGFuY2VvZiB3aW4uSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICBpZiAoaXNTYW1lT3JpZ2luRnJhbWUoZWxlbWVudCkpIHtcbiAgICAgIHdpbiA9IGVsZW1lbnQuY29udGVudFdpbmRvdztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuICAgIGVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KHdpbi5kb2N1bWVudCk7XG4gIH1cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbi8qKlxuICogQFJlYWN0SW5wdXRTZWxlY3Rpb246IFJlYWN0IGlucHV0IHNlbGVjdGlvbiBtb2R1bGUuIEJhc2VkIG9uIFNlbGVjdGlvbi5qcyxcbiAqIGJ1dCBtb2RpZmllZCB0byBiZSBzdWl0YWJsZSBmb3IgcmVhY3QgYW5kIGhhcyBhIGNvdXBsZSBvZiBidWcgZml4ZXMgKGRvZXNuJ3RcbiAqIGFzc3VtZSBidXR0b25zIGhhdmUgcmFuZ2Ugc2VsZWN0aW9ucyBhbGxvd2VkKS5cbiAqIElucHV0IHNlbGVjdGlvbiBtb2R1bGUgZm9yIFJlYWN0LlxuICovXG5cbi8qKlxuICogQGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllczogd2UgZ2V0IHRoZSBlbGVtZW50IHR5cGVzIHRoYXQgc3VwcG9ydCBzZWxlY3Rpb25cbiAqIGZyb20gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jZG8tbm90LWFwcGx5LCBsb29raW5nIGF0IGBzZWxlY3Rpb25TdGFydGBcbiAqIGFuZCBgc2VsZWN0aW9uRW5kYCByb3dzLlxuICovXG5mdW5jdGlvbiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZWxlbSkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtICYmIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gbm9kZU5hbWUgJiYgKG5vZGVOYW1lID09PSAnaW5wdXQnICYmIChlbGVtLnR5cGUgPT09ICd0ZXh0JyB8fCBlbGVtLnR5cGUgPT09ICdzZWFyY2gnIHx8IGVsZW0udHlwZSA9PT0gJ3RlbCcgfHwgZWxlbS50eXBlID09PSAndXJsJyB8fCBlbGVtLnR5cGUgPT09ICdwYXNzd29yZCcpIHx8IG5vZGVOYW1lID09PSAndGV4dGFyZWEnIHx8IGVsZW0uY29udGVudEVkaXRhYmxlID09PSAndHJ1ZScpO1xufVxuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb25JbmZvcm1hdGlvbigpIHtcbiAgdmFyIGZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxlbWVudERlZXAoKTtcbiAgcmV0dXJuIHtcbiAgICBmb2N1c2VkRWxlbTogZm9jdXNlZEVsZW0sXG4gICAgc2VsZWN0aW9uUmFuZ2U6IGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhmb2N1c2VkRWxlbSkgPyBnZXRTZWxlY3Rpb24kMShmb2N1c2VkRWxlbSkgOiBudWxsXG4gIH07XG59XG5cbi8qKlxuICogQHJlc3RvcmVTZWxlY3Rpb246IElmIGFueSBzZWxlY3Rpb24gaW5mb3JtYXRpb24gd2FzIHBvdGVudGlhbGx5IGxvc3QsXG4gKiByZXN0b3JlIGl0LiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHBlcmZvcm1pbmcgb3BlcmF0aW9ucyB0aGF0IGNvdWxkIHJlbW92ZSBkb21cbiAqIG5vZGVzIGFuZCBwbGFjZSB0aGVtIGJhY2sgaW4sIHJlc3VsdGluZyBpbiBmb2N1cyBiZWluZyBsb3N0LlxuICovXG5mdW5jdGlvbiByZXN0b3JlU2VsZWN0aW9uKHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24pIHtcbiAgdmFyIGN1ckZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxlbWVudERlZXAoKTtcbiAgdmFyIHByaW9yRm9jdXNlZEVsZW0gPSBwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uLmZvY3VzZWRFbGVtO1xuICB2YXIgcHJpb3JTZWxlY3Rpb25SYW5nZSA9IHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24uc2VsZWN0aW9uUmFuZ2U7XG4gIGlmIChjdXJGb2N1c2VkRWxlbSAhPT0gcHJpb3JGb2N1c2VkRWxlbSAmJiBpc0luRG9jdW1lbnQocHJpb3JGb2N1c2VkRWxlbSkpIHtcbiAgICBpZiAocHJpb3JTZWxlY3Rpb25SYW5nZSAhPT0gbnVsbCAmJiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMocHJpb3JGb2N1c2VkRWxlbSkpIHtcbiAgICAgIHNldFNlbGVjdGlvbihwcmlvckZvY3VzZWRFbGVtLCBwcmlvclNlbGVjdGlvblJhbmdlKTtcbiAgICB9XG5cbiAgICAvLyBGb2N1c2luZyBhIG5vZGUgY2FuIGNoYW5nZSB0aGUgc2Nyb2xsIHBvc2l0aW9uLCB3aGljaCBpcyB1bmRlc2lyYWJsZVxuICAgIHZhciBhbmNlc3RvcnMgPSBbXTtcbiAgICB2YXIgYW5jZXN0b3IgPSBwcmlvckZvY3VzZWRFbGVtO1xuICAgIHdoaWxlIChhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudE5vZGUpIHtcbiAgICAgIGlmIChhbmNlc3Rvci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIGFuY2VzdG9ycy5wdXNoKHtcbiAgICAgICAgICBlbGVtZW50OiBhbmNlc3RvcixcbiAgICAgICAgICBsZWZ0OiBhbmNlc3Rvci5zY3JvbGxMZWZ0LFxuICAgICAgICAgIHRvcDogYW5jZXN0b3Iuc2Nyb2xsVG9wXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJpb3JGb2N1c2VkRWxlbS5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJpb3JGb2N1c2VkRWxlbS5mb2N1cygpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5jZXN0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaW5mbyA9IGFuY2VzdG9yc1tpXTtcbiAgICAgIGluZm8uZWxlbWVudC5zY3JvbGxMZWZ0ID0gaW5mby5sZWZ0O1xuICAgICAgaW5mby5lbGVtZW50LnNjcm9sbFRvcCA9IGluZm8udG9wO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBnZXRTZWxlY3Rpb246IEdldHMgdGhlIHNlbGVjdGlvbiBib3VuZHMgb2YgYSBmb2N1c2VkIHRleHRhcmVhLCBpbnB1dCBvclxuICogY29udGVudEVkaXRhYmxlIG5vZGUuXG4gKiAtQGlucHV0OiBMb29rIHVwIHNlbGVjdGlvbiBib3VuZHMgb2YgdGhpcyBpbnB1dFxuICogLUByZXR1cm4ge3N0YXJ0OiBzZWxlY3Rpb25TdGFydCwgZW5kOiBzZWxlY3Rpb25FbmR9XG4gKi9cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbiQxKGlucHV0KSB7XG4gIHZhciBzZWxlY3Rpb24gPSB2b2lkIDA7XG5cbiAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gaW5wdXQpIHtcbiAgICAvLyBNb2Rlcm4gYnJvd3NlciB3aXRoIGlucHV0IG9yIHRleHRhcmVhLlxuICAgIHNlbGVjdGlvbiA9IHtcbiAgICAgIHN0YXJ0OiBpbnB1dC5zZWxlY3Rpb25TdGFydCxcbiAgICAgIGVuZDogaW5wdXQuc2VsZWN0aW9uRW5kXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDb250ZW50IGVkaXRhYmxlIG9yIG9sZCBJRSB0ZXh0YXJlYS5cbiAgICBzZWxlY3Rpb24gPSBnZXRPZmZzZXRzKGlucHV0KTtcbiAgfVxuXG4gIHJldHVybiBzZWxlY3Rpb24gfHwgeyBzdGFydDogMCwgZW5kOiAwIH07XG59XG5cbi8qKlxuICogQHNldFNlbGVjdGlvbjogU2V0cyB0aGUgc2VsZWN0aW9uIGJvdW5kcyBvZiBhIHRleHRhcmVhIG9yIGlucHV0IGFuZCBmb2N1c2VzXG4gKiB0aGUgaW5wdXQuXG4gKiAtQGlucHV0ICAgICBTZXQgc2VsZWN0aW9uIGJvdW5kcyBvZiB0aGlzIGlucHV0IG9yIHRleHRhcmVhXG4gKiAtQG9mZnNldHMgICBPYmplY3Qgb2Ygc2FtZSBmb3JtIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSBnZXQqXG4gKi9cbmZ1bmN0aW9uIHNldFNlbGVjdGlvbihpbnB1dCwgb2Zmc2V0cykge1xuICB2YXIgc3RhcnQgPSBvZmZzZXRzLnN0YXJ0LFxuICAgICAgZW5kID0gb2Zmc2V0cy5lbmQ7XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gc3RhcnQ7XG4gIH1cblxuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgIGlucHV0LnNlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7XG4gICAgaW5wdXQuc2VsZWN0aW9uRW5kID0gTWF0aC5taW4oZW5kLCBpbnB1dC52YWx1ZS5sZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIHNldE9mZnNldHMoaW5wdXQsIG9mZnNldHMpO1xuICB9XG59XG5cbnZhciBza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQgPSBjYW5Vc2VET00gJiYgJ2RvY3VtZW50TW9kZScgaW4gZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDw9IDExO1xuXG52YXIgZXZlbnRUeXBlcyQzID0ge1xuICBzZWxlY3Q6IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogJ29uU2VsZWN0JyxcbiAgICAgIGNhcHR1cmVkOiAnb25TZWxlY3RDYXB0dXJlJ1xuICAgIH0sXG4gICAgZGVwZW5kZW5jaWVzOiBbVE9QX0JMVVIsIFRPUF9DT05URVhUX01FTlUsIFRPUF9EUkFHX0VORCwgVE9QX0ZPQ1VTLCBUT1BfS0VZX0RPV04sIFRPUF9LRVlfVVAsIFRPUF9NT1VTRV9ET1dOLCBUT1BfTU9VU0VfVVAsIFRPUF9TRUxFQ1RJT05fQ0hBTkdFXVxuICB9XG59O1xuXG52YXIgYWN0aXZlRWxlbWVudCQxID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50SW5zdCQxID0gbnVsbDtcbnZhciBsYXN0U2VsZWN0aW9uID0gbnVsbDtcbnZhciBtb3VzZURvd24gPSBmYWxzZTtcblxuLyoqXG4gKiBHZXQgYW4gb2JqZWN0IHdoaWNoIGlzIGEgdW5pcXVlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgbm90IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG5vZGVzIG9yIGJyb3dzZXJzLCBidXRcbiAqIHR3byBpZGVudGljYWwgc2VsZWN0aW9ucyBvbiB0aGUgc2FtZSBub2RlIHdpbGwgcmV0dXJuIGlkZW50aWNhbCBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24obm9kZSkge1xuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBub2RlICYmIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhub2RlKSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGFydDogbm9kZS5zZWxlY3Rpb25TdGFydCxcbiAgICAgIGVuZDogbm9kZS5zZWxlY3Rpb25FbmRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHZhciB3aW4gPSBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbigpO1xuICAgIHJldHVybiB7XG4gICAgICBhbmNob3JOb2RlOiBzZWxlY3Rpb24uYW5jaG9yTm9kZSxcbiAgICAgIGFuY2hvck9mZnNldDogc2VsZWN0aW9uLmFuY2hvck9mZnNldCxcbiAgICAgIGZvY3VzTm9kZTogc2VsZWN0aW9uLmZvY3VzTm9kZSxcbiAgICAgIGZvY3VzT2Zmc2V0OiBzZWxlY3Rpb24uZm9jdXNPZmZzZXRcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogR2V0IGRvY3VtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQgdGFyZ2V0LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFRhcmdldFxuICogQHJldHVybiB7RG9jdW1lbnR9XG4gKi9cbmZ1bmN0aW9uIGdldEV2ZW50VGFyZ2V0RG9jdW1lbnQoZXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIGV2ZW50VGFyZ2V0LndpbmRvdyA9PT0gZXZlbnRUYXJnZXQgPyBldmVudFRhcmdldC5kb2N1bWVudCA6IGV2ZW50VGFyZ2V0Lm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gZXZlbnRUYXJnZXQgOiBldmVudFRhcmdldC5vd25lckRvY3VtZW50O1xufVxuXG4vKipcbiAqIFBvbGwgc2VsZWN0aW9uIHRvIHNlZSB3aGV0aGVyIGl0J3MgY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFRhcmdldFxuICogQHJldHVybiB7P1N5bnRoZXRpY0V2ZW50fVxuICovXG5mdW5jdGlvbiBjb25zdHJ1Y3RTZWxlY3RFdmVudChuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgLy8gRW5zdXJlIHdlIGhhdmUgdGhlIHJpZ2h0IGVsZW1lbnQsIGFuZCB0aGF0IHRoZSB1c2VyIGlzIG5vdCBkcmFnZ2luZyBhXG4gIC8vIHNlbGVjdGlvbiAodGhpcyBtYXRjaGVzIG5hdGl2ZSBgc2VsZWN0YCBldmVudCBiZWhhdmlvcikuIEluIEhUTUw1LCBzZWxlY3RcbiAgLy8gZmlyZXMgb25seSBvbiBpbnB1dCBhbmQgdGV4dGFyZWEgdGh1cyBpZiB0aGVyZSdzIG5vIGZvY3VzZWQgZWxlbWVudCB3ZVxuICAvLyB3b24ndCBkaXNwYXRjaC5cbiAgdmFyIGRvYyA9IGdldEV2ZW50VGFyZ2V0RG9jdW1lbnQobmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGlmIChtb3VzZURvd24gfHwgYWN0aXZlRWxlbWVudCQxID09IG51bGwgfHwgYWN0aXZlRWxlbWVudCQxICE9PSBnZXRBY3RpdmVFbGVtZW50KGRvYykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIE9ubHkgZmlyZSB3aGVuIHNlbGVjdGlvbiBoYXMgYWN0dWFsbHkgY2hhbmdlZC5cbiAgdmFyIGN1cnJlbnRTZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oYWN0aXZlRWxlbWVudCQxKTtcbiAgaWYgKCFsYXN0U2VsZWN0aW9uIHx8ICFzaGFsbG93RXF1YWwobGFzdFNlbGVjdGlvbiwgY3VycmVudFNlbGVjdGlvbikpIHtcbiAgICBsYXN0U2VsZWN0aW9uID0gY3VycmVudFNlbGVjdGlvbjtcblxuICAgIHZhciBzeW50aGV0aWNFdmVudCA9IFN5bnRoZXRpY0V2ZW50LmdldFBvb2xlZChldmVudFR5cGVzJDMuc2VsZWN0LCBhY3RpdmVFbGVtZW50SW5zdCQxLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gICAgc3ludGhldGljRXZlbnQudHlwZSA9ICdzZWxlY3QnO1xuICAgIHN5bnRoZXRpY0V2ZW50LnRhcmdldCA9IGFjdGl2ZUVsZW1lbnQkMTtcblxuICAgIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoc3ludGhldGljRXZlbnQpO1xuXG4gICAgcmV0dXJuIHN5bnRoZXRpY0V2ZW50O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogVGhpcyBwbHVnaW4gY3JlYXRlcyBhbiBgb25TZWxlY3RgIGV2ZW50IHRoYXQgbm9ybWFsaXplcyBzZWxlY3QgZXZlbnRzXG4gKiBhY3Jvc3MgZm9ybSBlbGVtZW50cy5cbiAqXG4gKiBTdXBwb3J0ZWQgZWxlbWVudHMgYXJlOlxuICogLSBpbnB1dCAoc2VlIGBpc1RleHRJbnB1dEVsZW1lbnRgKVxuICogLSB0ZXh0YXJlYVxuICogLSBjb250ZW50RWRpdGFibGVcbiAqXG4gKiBUaGlzIGRpZmZlcnMgZnJvbSBuYXRpdmUgYnJvd3NlciBpbXBsZW1lbnRhdGlvbnMgaW4gdGhlIGZvbGxvd2luZyB3YXlzOlxuICogLSBGaXJlcyBvbiBjb250ZW50RWRpdGFibGUgZmllbGRzIGFzIHdlbGwgYXMgaW5wdXRzLlxuICogLSBGaXJlcyBmb3IgY29sbGFwc2VkIHNlbGVjdGlvbi5cbiAqIC0gRmlyZXMgYWZ0ZXIgdXNlciBpbnB1dC5cbiAqL1xudmFyIFNlbGVjdEV2ZW50UGx1Z2luID0ge1xuICBldmVudFR5cGVzOiBldmVudFR5cGVzJDMsXG5cbiAgZXh0cmFjdEV2ZW50czogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgdmFyIGRvYyA9IGdldEV2ZW50VGFyZ2V0RG9jdW1lbnQobmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIC8vIFRyYWNrIHdoZXRoZXIgYWxsIGxpc3RlbmVycyBleGlzdHMgZm9yIHRoaXMgcGx1Z2luLiBJZiBub25lIGV4aXN0LCB3ZSBkb1xuICAgIC8vIG5vdCBleHRyYWN0IGV2ZW50cy4gU2VlICMzNjM5LlxuICAgIGlmICghZG9jIHx8ICFpc0xpc3RlbmluZ1RvQWxsRGVwZW5kZW5jaWVzKCdvblNlbGVjdCcsIGRvYykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciB0YXJnZXROb2RlID0gdGFyZ2V0SW5zdCA/IGdldE5vZGVGcm9tSW5zdGFuY2UkMSh0YXJnZXRJbnN0KSA6IHdpbmRvdztcblxuICAgIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7XG4gICAgICAvLyBUcmFjayB0aGUgaW5wdXQgbm9kZSB0aGF0IGhhcyBmb2N1cy5cbiAgICAgIGNhc2UgVE9QX0ZPQ1VTOlxuICAgICAgICBpZiAoaXNUZXh0SW5wdXRFbGVtZW50KHRhcmdldE5vZGUpIHx8IHRhcmdldE5vZGUuY29udGVudEVkaXRhYmxlID09PSAndHJ1ZScpIHtcbiAgICAgICAgICBhY3RpdmVFbGVtZW50JDEgPSB0YXJnZXROb2RlO1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSB0YXJnZXRJbnN0O1xuICAgICAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUT1BfQkxVUjpcbiAgICAgICAgYWN0aXZlRWxlbWVudCQxID0gbnVsbDtcbiAgICAgICAgYWN0aXZlRWxlbWVudEluc3QkMSA9IG51bGw7XG4gICAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICBicmVhaztcbiAgICAgIC8vIERvbid0IGZpcmUgdGhlIGV2ZW50IHdoaWxlIHRoZSB1c2VyIGlzIGRyYWdnaW5nLiBUaGlzIG1hdGNoZXMgdGhlXG4gICAgICAvLyBzZW1hbnRpY3Mgb2YgdGhlIG5hdGl2ZSBzZWxlY3QgZXZlbnQuXG4gICAgICBjYXNlIFRPUF9NT1VTRV9ET1dOOlxuICAgICAgICBtb3VzZURvd24gPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVE9QX0NPTlRFWFRfTUVOVTpcbiAgICAgIGNhc2UgVE9QX01PVVNFX1VQOlxuICAgICAgY2FzZSBUT1BfRFJBR19FTkQ6XG4gICAgICAgIG1vdXNlRG93biA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gY29uc3RydWN0U2VsZWN0RXZlbnQobmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICAgIC8vIENocm9tZSBhbmQgSUUgZmlyZSBub24tc3RhbmRhcmQgZXZlbnQgd2hlbiBzZWxlY3Rpb24gaXMgY2hhbmdlZCAoYW5kXG4gICAgICAvLyBzb21ldGltZXMgd2hlbiBpdCBoYXNuJ3QpLiBJRSdzIGV2ZW50IGZpcmVzIG91dCBvZiBvcmRlciB3aXRoIHJlc3BlY3RcbiAgICAgIC8vIHRvIGtleSBhbmQgaW5wdXQgZXZlbnRzIG9uIGRlbGV0aW9uLCBzbyB3ZSBkaXNjYXJkIGl0LlxuICAgICAgLy9cbiAgICAgIC8vIEZpcmVmb3ggZG9lc24ndCBzdXBwb3J0IHNlbGVjdGlvbmNoYW5nZSwgc28gY2hlY2sgc2VsZWN0aW9uIHN0YXR1c1xuICAgICAgLy8gYWZ0ZXIgZWFjaCBrZXkgZW50cnkuIFRoZSBzZWxlY3Rpb24gY2hhbmdlcyBhZnRlciBrZXlkb3duIGFuZCBiZWZvcmVcbiAgICAgIC8vIGtleXVwLCBidXQgd2UgY2hlY2sgb24ga2V5ZG93biBhcyB3ZWxsIGluIHRoZSBjYXNlIG9mIGhvbGRpbmcgZG93biBhXG4gICAgICAvLyBrZXksIHdoZW4gbXVsdGlwbGUga2V5ZG93biBldmVudHMgYXJlIGZpcmVkIGJ1dCBvbmx5IG9uZSBrZXl1cCBpcy5cbiAgICAgIC8vIFRoaXMgaXMgYWxzbyBvdXIgYXBwcm9hY2ggZm9yIElFIGhhbmRsaW5nLCBmb3IgdGhlIHJlYXNvbiBhYm92ZS5cbiAgICAgIGNhc2UgVE9QX1NFTEVDVElPTl9DSEFOR0U6XG4gICAgICAgIGlmIChza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgY2FzZSBUT1BfS0VZX0RPV046XG4gICAgICBjYXNlIFRPUF9LRVlfVVA6XG4gICAgICAgIHJldHVybiBjb25zdHJ1Y3RTZWxlY3RFdmVudChuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG4vKipcbiAqIEluamVjdCBtb2R1bGVzIGZvciByZXNvbHZpbmcgRE9NIGhpZXJhcmNoeSBhbmQgcGx1Z2luIG9yZGVyaW5nLlxuICovXG5pbmplY3Rpb24uaW5qZWN0RXZlbnRQbHVnaW5PcmRlcihET01FdmVudFBsdWdpbk9yZGVyKTtcbnNldENvbXBvbmVudFRyZWUoZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZSQxLCBnZXRJbnN0YW5jZUZyb21Ob2RlJDEsIGdldE5vZGVGcm9tSW5zdGFuY2UkMSk7XG5cbi8qKlxuICogU29tZSBpbXBvcnRhbnQgZXZlbnQgcGx1Z2lucyBpbmNsdWRlZCBieSBkZWZhdWx0ICh3aXRob3V0IGhhdmluZyB0byByZXF1aXJlXG4gKiB0aGVtKS5cbiAqL1xuaW5qZWN0aW9uLmluamVjdEV2ZW50UGx1Z2luc0J5TmFtZSh7XG4gIFNpbXBsZUV2ZW50UGx1Z2luOiBTaW1wbGVFdmVudFBsdWdpbixcbiAgRW50ZXJMZWF2ZUV2ZW50UGx1Z2luOiBFbnRlckxlYXZlRXZlbnRQbHVnaW4sXG4gIENoYW5nZUV2ZW50UGx1Z2luOiBDaGFuZ2VFdmVudFBsdWdpbixcbiAgU2VsZWN0RXZlbnRQbHVnaW46IFNlbGVjdEV2ZW50UGx1Z2luLFxuICBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luOiBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luXG59KTtcblxudmFyIGRpZFdhcm5TZWxlY3RlZFNldE9uT3B0aW9uID0gZmFsc2U7XG52YXIgZGlkV2FybkludmFsaWRDaGlsZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBmbGF0dGVuQ2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgdmFyIGNvbnRlbnQgPSAnJztcblxuICAvLyBGbGF0dGVuIGNoaWxkcmVuLiBXZSdsbCB3YXJuIGlmIHRoZXkgYXJlIGludmFsaWRcbiAgLy8gZHVyaW5nIHZhbGlkYXRlUHJvcHMoKSB3aGljaCBydW5zIGZvciBoeWRyYXRpb24gdG9vLlxuICAvLyBOb3RlIHRoYXQgdGhpcyB3b3VsZCB0aHJvdyBvbiBub24tZWxlbWVudCBvYmplY3RzLlxuICAvLyBFbGVtZW50cyBhcmUgc3RyaW5naWZpZWQgKHdoaWNoIGlzIG5vcm1hbGx5IGlycmVsZXZhbnRcbiAgLy8gYnV0IG1hdHRlcnMgZm9yIDxmYnQ+KS5cbiAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgaWYgKGNoaWxkID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29udGVudCArPSBjaGlsZDtcbiAgICAvLyBOb3RlOiB3ZSBkb24ndCB3YXJuIGFib3V0IGludmFsaWQgY2hpbGRyZW4gaGVyZS5cbiAgICAvLyBJbnN0ZWFkLCB0aGlzIGlzIGRvbmUgc2VwYXJhdGVseSBiZWxvdyBzbyB0aGF0XG4gICAgLy8gaXQgaGFwcGVucyBkdXJpbmcgdGhlIGh5ZHJhdGlvbiBjb2RlcGF0aCB0b28uXG4gIH0pO1xuXG4gIHJldHVybiBjb250ZW50O1xufVxuXG4vKipcbiAqIEltcGxlbWVudHMgYW4gPG9wdGlvbj4gaG9zdCBjb21wb25lbnQgdGhhdCB3YXJucyB3aGVuIGBzZWxlY3RlZGAgaXMgc2V0LlxuICovXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcHMoZWxlbWVudCwgcHJvcHMpIHtcbiAge1xuICAgIC8vIFRoaXMgbWlycm9ycyB0aGUgY29kZXBhdGggYWJvdmUsIGJ1dCBydW5zIGZvciBoeWRyYXRpb24gdG9vLlxuICAgIC8vIFdhcm4gYWJvdXQgaW52YWxpZCBjaGlsZHJlbiBoZXJlIHNvIHRoYXQgY2xpZW50IGFuZCBoeWRyYXRpb24gYXJlIGNvbnNpc3RlbnQuXG4gICAgLy8gVE9ETzogdGhpcyBzZWVtcyBsaWtlIGl0IGNvdWxkIGNhdXNlIGEgREVWLW9ubHkgdGhyb3cgZm9yIGh5ZHJhdGlvblxuICAgIC8vIGlmIGNoaWxkcmVuIGNvbnRhaW5zIGEgbm9uLWVsZW1lbnQgb2JqZWN0LiBXZSBzaG91bGQgdHJ5IHRvIGF2b2lkIHRoYXQuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ29iamVjdCcgJiYgcHJvcHMuY2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgIFJlYWN0LkNoaWxkcmVuLmZvckVhY2gocHJvcHMuY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgY2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY2hpbGQudHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZENoaWxkKSB7XG4gICAgICAgICAgZGlkV2FybkludmFsaWRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgd2FybmluZyQxKGZhbHNlLCAnT25seSBzdHJpbmdzIGFuZCBudW1iZXJzIGFyZSBzdXBwb3J0ZWQgYXMgPG9wdGlvbj4gY2hpbGRyZW4uJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRPRE86IFJlbW92ZSBzdXBwb3J0IGZvciBgc2VsZWN0ZWRgIGluIDxvcHRpb24+LlxuICAgIGlmIChwcm9wcy5zZWxlY3RlZCAhPSBudWxsICYmICFkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbikge1xuICAgICAgd2FybmluZyQxKGZhbHNlLCAnVXNlIHRoZSBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIHByb3BzIG9uIDxzZWxlY3Q+IGluc3RlYWQgb2YgJyArICdzZXR0aW5nIGBzZWxlY3RlZGAgb24gPG9wdGlvbj4uJyk7XG4gICAgICBkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbiA9IHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIkMShlbGVtZW50LCBwcm9wcykge1xuICAvLyB2YWx1ZT1cIlwiIHNob3VsZCBtYWtlIGEgdmFsdWUgYXR0cmlidXRlICgjNjIxOSlcbiAgaWYgKHByb3BzLnZhbHVlICE9IG51bGwpIHtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgndmFsdWUnLCB0b1N0cmluZyhnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlKSkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBob3N0UHJvcHMgPSBfYXNzaWduKHsgY2hpbGRyZW46IHVuZGVmaW5lZCB9LCBwcm9wcyk7XG4gIHZhciBjb250ZW50ID0gZmxhdHRlbkNoaWxkcmVuKHByb3BzLmNoaWxkcmVuKTtcblxuICBpZiAoY29udGVudCkge1xuICAgIGhvc3RQcm9wcy5jaGlsZHJlbiA9IGNvbnRlbnQ7XG4gIH1cblxuICByZXR1cm4gaG9zdFByb3BzO1xufVxuXG4vLyBUT0RPOiBkaXJlY3QgaW1wb3J0cyBsaWtlIHNvbWUtcGFja2FnZS9zcmMvKiBhcmUgYmFkLiBGaXggbWUuXG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSB2b2lkIDA7XG5cbntcbiAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICB2YXIgb3duZXJOYW1lID0gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKTtcbiAgaWYgKG93bmVyTmFtZSkge1xuICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBvd25lck5hbWUgKyAnYC4nO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxudmFyIHZhbHVlUHJvcE5hbWVzID0gWyd2YWx1ZScsICdkZWZhdWx0VmFsdWUnXTtcblxuLyoqXG4gKiBWYWxpZGF0aW9uIGZ1bmN0aW9uIGZvciBgdmFsdWVgIGFuZCBgZGVmYXVsdFZhbHVlYC5cbiAqL1xuZnVuY3Rpb24gY2hlY2tTZWxlY3RQcm9wVHlwZXMocHJvcHMpIHtcbiAgUmVhY3RDb250cm9sbGVkVmFsdWVQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoJ3NlbGVjdCcsIHByb3BzKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlUHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHByb3BOYW1lID0gdmFsdWVQcm9wTmFtZXNbaV07XG4gICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHByb3BzW3Byb3BOYW1lXSk7XG4gICAgaWYgKHByb3BzLm11bHRpcGxlICYmICFpc0FycmF5KSB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICdUaGUgYCVzYCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11c3QgYmUgYW4gYXJyYXkgaWYgJyArICdgbXVsdGlwbGVgIGlzIHRydWUuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkpO1xuICAgIH0gZWxzZSBpZiAoIXByb3BzLm11bHRpcGxlICYmIGlzQXJyYXkpIHtcbiAgICAgIHdhcm5pbmckMShmYWxzZSwgJ1RoZSBgJXNgIHByb3Agc3VwcGxpZWQgdG8gPHNlbGVjdD4gbXVzdCBiZSBhIHNjYWxhciAnICsgJ3ZhbHVlIGlmIGBtdWx0aXBsZWAgaXMgZmFsc2UuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVPcHRpb25zKG5vZGUsIG11bHRpcGxlLCBwcm9wVmFsdWUsIHNldERlZmF1bHRTZWxlY3RlZCkge1xuICB2YXIgb3B0aW9ucyA9IG5vZGUub3B0aW9ucztcblxuICBpZiAobXVsdGlwbGUpIHtcbiAgICB2YXIgc2VsZWN0ZWRWYWx1ZXMgPSBwcm9wVmFsdWU7XG4gICAgdmFyIHNlbGVjdGVkVmFsdWUgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBQcmVmaXggdG8gYXZvaWQgY2hhb3Mgd2l0aCBzcGVjaWFsIGtleXMuXG4gICAgICBzZWxlY3RlZFZhbHVlWyckJyArIHNlbGVjdGVkVmFsdWVzW2ldXSA9IHRydWU7XG4gICAgfVxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBvcHRpb25zLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIHNlbGVjdGVkID0gc2VsZWN0ZWRWYWx1ZS5oYXNPd25Qcm9wZXJ0eSgnJCcgKyBvcHRpb25zW19pXS52YWx1ZSk7XG4gICAgICBpZiAob3B0aW9uc1tfaV0uc2VsZWN0ZWQgIT09IHNlbGVjdGVkKSB7XG4gICAgICAgIG9wdGlvbnNbX2ldLnNlbGVjdGVkID0gc2VsZWN0ZWQ7XG4gICAgICB9XG4gICAgICBpZiAoc2VsZWN0ZWQgJiYgc2V0RGVmYXVsdFNlbGVjdGVkKSB7XG4gICAgICAgIG9wdGlvbnNbX2ldLmRlZmF1bHRTZWxlY3RlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIERvIG5vdCBzZXQgYHNlbGVjdC52YWx1ZWAgYXMgZXhhY3QgYmVoYXZpb3IgaXNuJ3QgY29uc2lzdGVudCBhY3Jvc3MgYWxsXG4gICAgLy8gYnJvd3NlcnMgZm9yIGFsbCBjYXNlcy5cbiAgICB2YXIgX3NlbGVjdGVkVmFsdWUgPSB0b1N0cmluZyhnZXRUb1N0cmluZ1ZhbHVlKHByb3BWYWx1ZSkpO1xuICAgIHZhciBkZWZhdWx0U2VsZWN0ZWQgPSBudWxsO1xuICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG9wdGlvbnMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgaWYgKG9wdGlvbnNbX2kyXS52YWx1ZSA9PT0gX3NlbGVjdGVkVmFsdWUpIHtcbiAgICAgICAgb3B0aW9uc1tfaTJdLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHNldERlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgICAgIG9wdGlvbnNbX2kyXS5kZWZhdWx0U2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkZWZhdWx0U2VsZWN0ZWQgPT09IG51bGwgJiYgIW9wdGlvbnNbX2kyXS5kaXNhYmxlZCkge1xuICAgICAgICBkZWZhdWx0U2VsZWN0ZWQgPSBvcHRpb25zW19pMl07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWZhdWx0U2VsZWN0ZWQgIT09IG51bGwpIHtcbiAgICAgIGRlZmF1bHRTZWxlY3RlZC5zZWxlY3RlZCA9IHRydWU7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBhIDxzZWxlY3Q+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIG9wdGlvbmFsbHkgc2V0dGluZyB0aGVcbiAqIHByb3BzIGB2YWx1ZWAgYW5kIGBkZWZhdWx0VmFsdWVgLiBJZiBgbXVsdGlwbGVgIGlzIGZhbHNlLCB0aGUgcHJvcCBtdXN0IGJlIGFcbiAqIHN0cmluZ2FibGUuIElmIGBtdWx0aXBsZWAgaXMgdHJ1ZSwgdGhlIHByb3AgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdhYmxlcy5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnMgdGhhdCBjaGFuZ2UgdGhlXG4gKiBzZWxlY3RlZCBvcHRpb24gd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIHJlbmRlcmVkIG9wdGlvbnMuXG4gKlxuICogSWYgaXQgaXMgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgb3B0aW9ucyB3aWxsIG5vdFxuICogdXBkYXRlIGluIHJlc3BvbnNlIHRvIHVzZXIgYWN0aW9ucy4gSW5zdGVhZCwgdGhlIGB2YWx1ZWAgcHJvcCBtdXN0IGNoYW5nZSBpblxuICogb3JkZXIgZm9yIHRoZSByZW5kZXJlZCBvcHRpb25zIHRvIHVwZGF0ZS5cbiAqXG4gKiBJZiBgZGVmYXVsdFZhbHVlYCBpcyBwcm92aWRlZCwgYW55IG9wdGlvbnMgd2l0aCB0aGUgc3VwcGxpZWQgdmFsdWVzIHdpbGwgYmVcbiAqIHNlbGVjdGVkLlxuICovXG5cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHJldHVybiBfYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUkMShlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHtcbiAgICBjaGVja1NlbGVjdFByb3BUeXBlcyhwcm9wcyk7XG4gIH1cblxuICBub2RlLl93cmFwcGVyU3RhdGUgPSB7XG4gICAgd2FzTXVsdGlwbGU6ICEhcHJvcHMubXVsdGlwbGVcbiAgfTtcblxuICB7XG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxKSB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICdTZWxlY3QgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIHNlbGVjdCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cycpO1xuICAgICAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICBub2RlLm11bHRpcGxlID0gISFwcm9wcy5tdWx0aXBsZTtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7XG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCB2YWx1ZSwgZmFsc2UpO1xuICB9IGVsc2UgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5kZWZhdWx0VmFsdWUsIHRydWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvc3RVcGRhdGVXcmFwcGVyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHdhc011bHRpcGxlID0gbm9kZS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlO1xuICBub2RlLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGUgPSAhIXByb3BzLm11bHRpcGxlO1xuXG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgdmFsdWUsIGZhbHNlKTtcbiAgfSBlbHNlIGlmICh3YXNNdWx0aXBsZSAhPT0gISFwcm9wcy5tdWx0aXBsZSkge1xuICAgIC8vIEZvciBzaW1wbGljaXR5LCByZWFwcGx5IGBkZWZhdWx0VmFsdWVgIGlmIGBtdWx0aXBsZWAgaXMgdG9nZ2xlZC5cbiAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgcHJvcHMuZGVmYXVsdFZhbHVlLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmV2ZXJ0IHRoZSBzZWxlY3QgYmFjayB0byBpdHMgZGVmYXVsdCB1bnNlbGVjdGVkIHN0YXRlLlxuICAgICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5tdWx0aXBsZSA/IFtdIDogJycsIGZhbHNlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHZhbHVlLCBmYWxzZSk7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5WYWxEZWZhdWx0VmFsID0gZmFsc2U7XG5cbi8qKlxuICogSW1wbGVtZW50cyBhIDx0ZXh0YXJlYT4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgc2V0dGluZyBgdmFsdWVgLCBhbmRcbiAqIGBkZWZhdWx0VmFsdWVgLiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgdHJhZGl0aW9uYWwgRE9NIEFQSSBiZWNhdXNlIHZhbHVlIGlzXG4gKiB1c3VhbGx5IHNldCBhcyBQQ0RBVEEgY2hpbGRyZW4uXG4gKlxuICogSWYgYHZhbHVlYCBpcyBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zIHRoYXQgYWZmZWN0IHRoZVxuICogdmFsdWUgd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogSWYgYHZhbHVlYCBpcyBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGxcbiAqIG5vdCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuIEluc3RlYWQsIHRoZSBgdmFsdWVgIHByb3AgbXVzdCBjaGFuZ2UgaW5cbiAqIG9yZGVyIGZvciB0aGUgcmVuZGVyZWQgZWxlbWVudCB0byBiZSB1cGRhdGVkLlxuICpcbiAqIFRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhbiBlbXB0eSB2YWx1ZSwgdGhlIHByb3BcbiAqIGBkZWZhdWx0VmFsdWVgIGlmIHNwZWNpZmllZCwgb3IgdGhlIGNoaWxkcmVuIGNvbnRlbnQgKGRlcHJlY2F0ZWQpLlxuICovXG5cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyQzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgIShwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PSBudWxsKSA/IGludmFyaWFudChmYWxzZSwgJ2BkYW5nZXJvdXNseVNldElubmVySFRNTGAgZG9lcyBub3QgbWFrZSBzZW5zZSBvbiA8dGV4dGFyZWE+LicpIDogdm9pZCAwO1xuXG4gIC8vIEFsd2F5cyBzZXQgY2hpbGRyZW4gdG8gdGhlIHNhbWUgdGhpbmcuIEluIElFOSwgdGhlIHNlbGVjdGlvbiByYW5nZSB3aWxsXG4gIC8vIGdldCByZXNldCBpZiBgdGV4dENvbnRlbnRgIGlzIG11dGF0ZWQuICBXZSBjb3VsZCBhZGQgYSBjaGVjayBpbiBzZXRUZXh0Q29udGVudFxuICAvLyB0byBvbmx5IHNldCB0aGUgdmFsdWUgaWYvd2hlbiB0aGUgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBub2RlIHZhbHVlICh3aGljaCB3b3VsZFxuICAvLyBjb21wbGV0ZWx5IHNvbHZlIHRoaXMgSUU5IGJ1ZyksIGJ1dCBTZWJhc3RpYW4rU29waGllIHNlZW1lZCB0byBsaWtlIHRoaXNcbiAgLy8gc29sdXRpb24uIFRoZSB2YWx1ZSBjYW4gYmUgYSBib29sZWFuIG9yIG9iamVjdCBzbyB0aGF0J3Mgd2h5IGl0J3MgZm9yY2VkXG4gIC8vIHRvIGJlIGEgc3RyaW5nLlxuICB2YXIgaG9zdFByb3BzID0gX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRWYWx1ZTogdW5kZWZpbmVkLFxuICAgIGNoaWxkcmVuOiB0b1N0cmluZyhub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKVxuICB9KTtcblxuICByZXR1cm4gaG9zdFByb3BzO1xufVxuXG5mdW5jdGlvbiBpbml0V3JhcHBlclN0YXRlJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB7XG4gICAgUmVhY3RDb250cm9sbGVkVmFsdWVQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoJ3RleHRhcmVhJywgcHJvcHMpO1xuICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsRGVmYXVsdFZhbCkge1xuICAgICAgd2FybmluZyQxKGZhbHNlLCAnJXMgY29udGFpbnMgYSB0ZXh0YXJlYSB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1ZSBwcm9wcy4gJyArICdUZXh0YXJlYSBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgdGV4dGFyZWEgJyArICdhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vZmIubWUvcmVhY3QtY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnKTtcbiAgICAgIGRpZFdhcm5WYWxEZWZhdWx0VmFsID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgaW5pdGlhbFZhbHVlID0gcHJvcHMudmFsdWU7XG5cbiAgLy8gT25seSBib3RoZXIgZmV0Y2hpbmcgZGVmYXVsdCB2YWx1ZSBpZiB3ZSdyZSBnb2luZyB0byB1c2UgaXRcbiAgaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKSB7XG4gICAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZTtcbiAgICAvLyBUT0RPICh5dW5nc3RlcnMpOiBSZW1vdmUgc3VwcG9ydCBmb3IgY2hpbGRyZW4gY29udGVudCBpbiA8dGV4dGFyZWE+LlxuICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHdhcm5pbmckMShmYWxzZSwgJ1VzZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBpbnN0ZWFkIG9mIHNldHRpbmcgJyArICdjaGlsZHJlbiBvbiA8dGV4dGFyZWE+LicpO1xuICAgICAgfVxuICAgICAgIShkZWZhdWx0VmFsdWUgPT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICdJZiB5b3Ugc3VwcGx5IGBkZWZhdWx0VmFsdWVgIG9uIGEgPHRleHRhcmVhPiwgZG8gbm90IHBhc3MgY2hpbGRyZW4uJykgOiB2b2lkIDA7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgIShjaGlsZHJlbi5sZW5ndGggPD0gMSkgPyBpbnZhcmlhbnQoZmFsc2UsICc8dGV4dGFyZWE+IGNhbiBvbmx5IGhhdmUgYXQgbW9zdCBvbmUgY2hpbGQuJykgOiB2b2lkIDA7XG4gICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW5bMF07XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHRWYWx1ZSA9IGNoaWxkcmVuO1xuICAgIH1cbiAgICBpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZSA9ICcnO1xuICAgIH1cbiAgICBpbml0aWFsVmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gIH1cblxuICBub2RlLl93cmFwcGVyU3RhdGUgPSB7XG4gICAgaW5pdGlhbFZhbHVlOiBnZXRUb1N0cmluZ1ZhbHVlKGluaXRpYWxWYWx1ZSlcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlV3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSk7XG4gIHZhciBkZWZhdWx0VmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLmRlZmF1bHRWYWx1ZSk7XG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgLy8gQ2FzdCBgdmFsdWVgIHRvIGEgc3RyaW5nIHRvIGVuc3VyZSB0aGUgdmFsdWUgaXMgc2V0IGNvcnJlY3RseS4gV2hpbGVcbiAgICAvLyBicm93c2VycyB0eXBpY2FsbHkgZG8gdGhpcyBhcyBuZWNlc3NhcnksIGpzZG9tIGRvZXNuJ3QuXG4gICAgdmFyIG5ld1ZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgIC8vIFRvIGF2b2lkIHNpZGUgZWZmZWN0cyAoc3VjaCBhcyBsb3NpbmcgdGV4dCBzZWxlY3Rpb24pLCBvbmx5IHNldCB2YWx1ZSBpZiBjaGFuZ2VkXG4gICAgaWYgKG5ld1ZhbHVlICE9PSBub2RlLnZhbHVlKSB7XG4gICAgICBub2RlLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICAgIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgPT0gbnVsbCAmJiBub2RlLmRlZmF1bHRWYWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICB9XG4gIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcoZGVmYXVsdFZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDMoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICAvLyBUaGlzIGlzIGluIHBvc3RNb3VudCBiZWNhdXNlIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBET00gbm9kZSwgd2hpY2ggaXMgbm90XG4gIC8vIGF2YWlsYWJsZSB1bnRpbCBhZnRlciB0aGUgY29tcG9uZW50IGhhcyBtb3VudGVkLlxuICB2YXIgdGV4dENvbnRlbnQgPSBub2RlLnRleHRDb250ZW50O1xuXG4gIC8vIE9ubHkgc2V0IG5vZGUudmFsdWUgaWYgdGV4dENvbnRlbnQgaXMgZXF1YWwgdG8gdGhlIGV4cGVjdGVkXG4gIC8vIGluaXRpYWwgdmFsdWUuIEluIElFMTAvSUUxMSB0aGVyZSBpcyBhIGJ1ZyB3aGVyZSB0aGUgcGxhY2Vob2xkZXIgYXR0cmlidXRlXG4gIC8vIHdpbGwgcG9wdWxhdGUgdGV4dENvbnRlbnQgYXMgd2VsbC5cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvMTAxNTI1L1xuICBpZiAodGV4dENvbnRlbnQgPT09IG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpIHtcbiAgICBub2RlLnZhbHVlID0gdGV4dENvbnRlbnQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQzKGVsZW1lbnQsIHByb3BzKSB7XG4gIC8vIERPTSBjb21wb25lbnQgaXMgc3RpbGwgbW91bnRlZDsgdXBkYXRlXG4gIHVwZGF0ZVdyYXBwZXIkMShlbGVtZW50LCBwcm9wcyk7XG59XG5cbnZhciBIVE1MX05BTUVTUEFDRSQxID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xudmFyIE1BVEhfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnO1xudmFyIFNWR19OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xuXG52YXIgTmFtZXNwYWNlcyA9IHtcbiAgaHRtbDogSFRNTF9OQU1FU1BBQ0UkMSxcbiAgbWF0aG1sOiBNQVRIX05BTUVTUEFDRSxcbiAgc3ZnOiBTVkdfTkFNRVNQQUNFXG59O1xuXG4vLyBBc3N1bWVzIHRoZXJlIGlzIG5vIHBhcmVudCBuYW1lc3BhY2UuXG5mdW5jdGlvbiBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodHlwZSkge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdzdmcnOlxuICAgICAgcmV0dXJuIFNWR19OQU1FU1BBQ0U7XG4gICAgY2FzZSAnbWF0aCc6XG4gICAgICByZXR1cm4gTUFUSF9OQU1FU1BBQ0U7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBIVE1MX05BTUVTUEFDRSQxO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldENoaWxkTmFtZXNwYWNlKHBhcmVudE5hbWVzcGFjZSwgdHlwZSkge1xuICBpZiAocGFyZW50TmFtZXNwYWNlID09IG51bGwgfHwgcGFyZW50TmFtZXNwYWNlID09PSBIVE1MX05BTUVTUEFDRSQxKSB7XG4gICAgLy8gTm8gKG9yIGRlZmF1bHQpIHBhcmVudCBuYW1lc3BhY2U6IHBvdGVudGlhbCBlbnRyeSBwb2ludC5cbiAgICByZXR1cm4gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpO1xuICB9XG4gIGlmIChwYXJlbnROYW1lc3BhY2UgPT09IFNWR19OQU1FU1BBQ0UgJiYgdHlwZSA9PT0gJ2ZvcmVpZ25PYmplY3QnKSB7XG4gICAgLy8gV2UncmUgbGVhdmluZyBTVkcuXG4gICAgcmV0dXJuIEhUTUxfTkFNRVNQQUNFJDE7XG4gIH1cbiAgLy8gQnkgZGVmYXVsdCwgcGFzcyBuYW1lc3BhY2UgYmVsb3cuXG4gIHJldHVybiBwYXJlbnROYW1lc3BhY2U7XG59XG5cbi8qIGdsb2JhbHMgTVNBcHAgKi9cblxuLyoqXG4gKiBDcmVhdGUgYSBmdW5jdGlvbiB3aGljaCBoYXMgJ3Vuc2FmZScgcHJpdmlsZWdlcyAocmVxdWlyZWQgYnkgd2luZG93czggYXBwcylcbiAqL1xudmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSBmdW5jdGlvbiAoZnVuYykge1xuICBpZiAodHlwZW9mIE1TQXBwICE9PSAndW5kZWZpbmVkJyAmJiBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMykge1xuICAgICAgTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuYyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cbn07XG5cbi8vIFNWRyB0ZW1wIGNvbnRhaW5lciBmb3IgSUUgbGFja2luZyBpbm5lckhUTUxcbnZhciByZXVzYWJsZVNWR0NvbnRhaW5lciA9IHZvaWQgMDtcblxuLyoqXG4gKiBTZXQgdGhlIGlubmVySFRNTCBwcm9wZXJ0eSBvZiBhIG5vZGVcbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBodG1sXG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIHNldElubmVySFRNTCA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKG5vZGUsIGh0bWwpIHtcbiAgLy8gSUUgZG9lcyBub3QgaGF2ZSBpbm5lckhUTUwgZm9yIFNWRyBub2Rlcywgc28gaW5zdGVhZCB3ZSBpbmplY3QgdGhlXG4gIC8vIG5ldyBtYXJrdXAgaW4gYSB0ZW1wIG5vZGUgYW5kIHRoZW4gbW92ZSB0aGUgY2hpbGQgbm9kZXMgYWNyb3NzIGludG9cbiAgLy8gdGhlIHRhcmdldCBub2RlXG5cbiAgaWYgKG5vZGUubmFtZXNwYWNlVVJJID09PSBOYW1lc3BhY2VzLnN2ZyAmJiAhKCdpbm5lckhUTUwnIGluIG5vZGUpKSB7XG4gICAgcmV1c2FibGVTVkdDb250YWluZXIgPSByZXVzYWJsZVNWR0NvbnRhaW5lciB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICByZXVzYWJsZVNWR0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPHN2Zz4nICsgaHRtbCArICc8L3N2Zz4nO1xuICAgIHZhciBzdmdOb2RlID0gcmV1c2FibGVTVkdDb250YWluZXIuZmlyc3RDaGlsZDtcbiAgICB3aGlsZSAobm9kZS5maXJzdENoaWxkKSB7XG4gICAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUuZmlyc3RDaGlsZCk7XG4gICAgfVxuICAgIHdoaWxlIChzdmdOb2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoc3ZnTm9kZS5maXJzdENoaWxkKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbm9kZS5pbm5lckhUTUwgPSBodG1sO1xuICB9XG59KTtcblxuLyoqXG4gKiBTZXQgdGhlIHRleHRDb250ZW50IHByb3BlcnR5IG9mIGEgbm9kZS4gRm9yIHRleHQgdXBkYXRlcywgaXQncyBmYXN0ZXJcbiAqIHRvIHNldCB0aGUgYG5vZGVWYWx1ZWAgb2YgdGhlIFRleHQgbm9kZSBkaXJlY3RseSBpbnN0ZWFkIG9mIHVzaW5nXG4gKiBgLnRleHRDb250ZW50YCB3aGljaCB3aWxsIHJlbW92ZSB0aGUgZXhpc3Rpbmcgbm9kZSBhbmQgY3JlYXRlIGEgbmV3IG9uZS5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIHNldFRleHRDb250ZW50ID0gZnVuY3Rpb24gKG5vZGUsIHRleHQpIHtcbiAgaWYgKHRleHQpIHtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcblxuICAgIGlmIChmaXJzdENoaWxkICYmIGZpcnN0Q2hpbGQgPT09IG5vZGUubGFzdENoaWxkICYmIGZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSB0ZXh0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBub2RlLnRleHRDb250ZW50ID0gdGV4dDtcbn07XG5cbi8vIExpc3QgZGVyaXZlZCBmcm9tIEdlY2tvIHNvdXJjZSBjb2RlOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvZ2Vja28tZGV2L2Jsb2IvNGU2MzhlZmM3MS9sYXlvdXQvc3R5bGUvdGVzdC9wcm9wZXJ0eV9kYXRhYmFzZS5qc1xudmFyIHNob3J0aGFuZFRvTG9uZ2hhbmQgPSB7XG4gIGFuaW1hdGlvbjogWydhbmltYXRpb25EZWxheScsICdhbmltYXRpb25EaXJlY3Rpb24nLCAnYW5pbWF0aW9uRHVyYXRpb24nLCAnYW5pbWF0aW9uRmlsbE1vZGUnLCAnYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQnLCAnYW5pbWF0aW9uTmFtZScsICdhbmltYXRpb25QbGF5U3RhdGUnLCAnYW5pbWF0aW9uVGltaW5nRnVuY3Rpb24nXSxcbiAgYmFja2dyb3VuZDogWydiYWNrZ3JvdW5kQXR0YWNobWVudCcsICdiYWNrZ3JvdW5kQ2xpcCcsICdiYWNrZ3JvdW5kQ29sb3InLCAnYmFja2dyb3VuZEltYWdlJywgJ2JhY2tncm91bmRPcmlnaW4nLCAnYmFja2dyb3VuZFBvc2l0aW9uWCcsICdiYWNrZ3JvdW5kUG9zaXRpb25ZJywgJ2JhY2tncm91bmRSZXBlYXQnLCAnYmFja2dyb3VuZFNpemUnXSxcbiAgYmFja2dyb3VuZFBvc2l0aW9uOiBbJ2JhY2tncm91bmRQb3NpdGlvblgnLCAnYmFja2dyb3VuZFBvc2l0aW9uWSddLFxuICBib3JkZXI6IFsnYm9yZGVyQm90dG9tQ29sb3InLCAnYm9yZGVyQm90dG9tU3R5bGUnLCAnYm9yZGVyQm90dG9tV2lkdGgnLCAnYm9yZGVySW1hZ2VPdXRzZXQnLCAnYm9yZGVySW1hZ2VSZXBlYXQnLCAnYm9yZGVySW1hZ2VTbGljZScsICdib3JkZXJJbWFnZVNvdXJjZScsICdib3JkZXJJbWFnZVdpZHRoJywgJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyTGVmdFdpZHRoJywgJ2JvcmRlclJpZ2h0Q29sb3InLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJSaWdodFdpZHRoJywgJ2JvcmRlclRvcENvbG9yJywgJ2JvcmRlclRvcFN0eWxlJywgJ2JvcmRlclRvcFdpZHRoJ10sXG4gIGJvcmRlckJsb2NrRW5kOiBbJ2JvcmRlckJsb2NrRW5kQ29sb3InLCAnYm9yZGVyQmxvY2tFbmRTdHlsZScsICdib3JkZXJCbG9ja0VuZFdpZHRoJ10sXG4gIGJvcmRlckJsb2NrU3RhcnQ6IFsnYm9yZGVyQmxvY2tTdGFydENvbG9yJywgJ2JvcmRlckJsb2NrU3RhcnRTdHlsZScsICdib3JkZXJCbG9ja1N0YXJ0V2lkdGgnXSxcbiAgYm9yZGVyQm90dG9tOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckJvdHRvbVdpZHRoJ10sXG4gIGJvcmRlckNvbG9yOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclRvcENvbG9yJ10sXG4gIGJvcmRlckltYWdlOiBbJ2JvcmRlckltYWdlT3V0c2V0JywgJ2JvcmRlckltYWdlUmVwZWF0JywgJ2JvcmRlckltYWdlU2xpY2UnLCAnYm9yZGVySW1hZ2VTb3VyY2UnLCAnYm9yZGVySW1hZ2VXaWR0aCddLFxuICBib3JkZXJJbmxpbmVFbmQ6IFsnYm9yZGVySW5saW5lRW5kQ29sb3InLCAnYm9yZGVySW5saW5lRW5kU3R5bGUnLCAnYm9yZGVySW5saW5lRW5kV2lkdGgnXSxcbiAgYm9yZGVySW5saW5lU3RhcnQ6IFsnYm9yZGVySW5saW5lU3RhcnRDb2xvcicsICdib3JkZXJJbmxpbmVTdGFydFN0eWxlJywgJ2JvcmRlcklubGluZVN0YXJ0V2lkdGgnXSxcbiAgYm9yZGVyTGVmdDogWydib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyTGVmdFN0eWxlJywgJ2JvcmRlckxlZnRXaWR0aCddLFxuICBib3JkZXJSYWRpdXM6IFsnYm9yZGVyQm90dG9tTGVmdFJhZGl1cycsICdib3JkZXJCb3R0b21SaWdodFJhZGl1cycsICdib3JkZXJUb3BMZWZ0UmFkaXVzJywgJ2JvcmRlclRvcFJpZ2h0UmFkaXVzJ10sXG4gIGJvcmRlclJpZ2h0OiBbJ2JvcmRlclJpZ2h0Q29sb3InLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJSaWdodFdpZHRoJ10sXG4gIGJvcmRlclN0eWxlOiBbJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckxlZnRTdHlsZScsICdib3JkZXJSaWdodFN0eWxlJywgJ2JvcmRlclRvcFN0eWxlJ10sXG4gIGJvcmRlclRvcDogWydib3JkZXJUb3BDb2xvcicsICdib3JkZXJUb3BTdHlsZScsICdib3JkZXJUb3BXaWR0aCddLFxuICBib3JkZXJXaWR0aDogWydib3JkZXJCb3R0b21XaWR0aCcsICdib3JkZXJMZWZ0V2lkdGgnLCAnYm9yZGVyUmlnaHRXaWR0aCcsICdib3JkZXJUb3BXaWR0aCddLFxuICBjb2x1bW5SdWxlOiBbJ2NvbHVtblJ1bGVDb2xvcicsICdjb2x1bW5SdWxlU3R5bGUnLCAnY29sdW1uUnVsZVdpZHRoJ10sXG4gIGNvbHVtbnM6IFsnY29sdW1uQ291bnQnLCAnY29sdW1uV2lkdGgnXSxcbiAgZmxleDogWydmbGV4QmFzaXMnLCAnZmxleEdyb3cnLCAnZmxleFNocmluayddLFxuICBmbGV4RmxvdzogWydmbGV4RGlyZWN0aW9uJywgJ2ZsZXhXcmFwJ10sXG4gIGZvbnQ6IFsnZm9udEZhbWlseScsICdmb250RmVhdHVyZVNldHRpbmdzJywgJ2ZvbnRLZXJuaW5nJywgJ2ZvbnRMYW5ndWFnZU92ZXJyaWRlJywgJ2ZvbnRTaXplJywgJ2ZvbnRTaXplQWRqdXN0JywgJ2ZvbnRTdHJldGNoJywgJ2ZvbnRTdHlsZScsICdmb250VmFyaWFudCcsICdmb250VmFyaWFudEFsdGVybmF0ZXMnLCAnZm9udFZhcmlhbnRDYXBzJywgJ2ZvbnRWYXJpYW50RWFzdEFzaWFuJywgJ2ZvbnRWYXJpYW50TGlnYXR1cmVzJywgJ2ZvbnRWYXJpYW50TnVtZXJpYycsICdmb250VmFyaWFudFBvc2l0aW9uJywgJ2ZvbnRXZWlnaHQnLCAnbGluZUhlaWdodCddLFxuICBmb250VmFyaWFudDogWydmb250VmFyaWFudEFsdGVybmF0ZXMnLCAnZm9udFZhcmlhbnRDYXBzJywgJ2ZvbnRWYXJpYW50RWFzdEFzaWFuJywgJ2ZvbnRWYXJpYW50TGlnYXR1cmVzJywgJ2ZvbnRWYXJpYW50TnVtZXJpYycsICdmb250VmFyaWFudFBvc2l0aW9uJ10sXG4gIGdhcDogWydjb2x1bW5HYXAnLCAncm93R2FwJ10sXG4gIGdyaWQ6IFsnZ3JpZEF1dG9Db2x1bW5zJywgJ2dyaWRBdXRvRmxvdycsICdncmlkQXV0b1Jvd3MnLCAnZ3JpZFRlbXBsYXRlQXJlYXMnLCAnZ3JpZFRlbXBsYXRlQ29sdW1ucycsICdncmlkVGVtcGxhdGVSb3dzJ10sXG4gIGdyaWRBcmVhOiBbJ2dyaWRDb2x1bW5FbmQnLCAnZ3JpZENvbHVtblN0YXJ0JywgJ2dyaWRSb3dFbmQnLCAnZ3JpZFJvd1N0YXJ0J10sXG4gIGdyaWRDb2x1bW46IFsnZ3JpZENvbHVtbkVuZCcsICdncmlkQ29sdW1uU3RhcnQnXSxcbiAgZ3JpZENvbHVtbkdhcDogWydjb2x1bW5HYXAnXSxcbiAgZ3JpZEdhcDogWydjb2x1bW5HYXAnLCAncm93R2FwJ10sXG4gIGdyaWRSb3c6IFsnZ3JpZFJvd0VuZCcsICdncmlkUm93U3RhcnQnXSxcbiAgZ3JpZFJvd0dhcDogWydyb3dHYXAnXSxcbiAgZ3JpZFRlbXBsYXRlOiBbJ2dyaWRUZW1wbGF0ZUFyZWFzJywgJ2dyaWRUZW1wbGF0ZUNvbHVtbnMnLCAnZ3JpZFRlbXBsYXRlUm93cyddLFxuICBsaXN0U3R5bGU6IFsnbGlzdFN0eWxlSW1hZ2UnLCAnbGlzdFN0eWxlUG9zaXRpb24nLCAnbGlzdFN0eWxlVHlwZSddLFxuICBtYXJnaW46IFsnbWFyZ2luQm90dG9tJywgJ21hcmdpbkxlZnQnLCAnbWFyZ2luUmlnaHQnLCAnbWFyZ2luVG9wJ10sXG4gIG1hcmtlcjogWydtYXJrZXJFbmQnLCAnbWFya2VyTWlkJywgJ21hcmtlclN0YXJ0J10sXG4gIG1hc2s6IFsnbWFza0NsaXAnLCAnbWFza0NvbXBvc2l0ZScsICdtYXNrSW1hZ2UnLCAnbWFza01vZGUnLCAnbWFza09yaWdpbicsICdtYXNrUG9zaXRpb25YJywgJ21hc2tQb3NpdGlvblknLCAnbWFza1JlcGVhdCcsICdtYXNrU2l6ZSddLFxuICBtYXNrUG9zaXRpb246IFsnbWFza1Bvc2l0aW9uWCcsICdtYXNrUG9zaXRpb25ZJ10sXG4gIG91dGxpbmU6IFsnb3V0bGluZUNvbG9yJywgJ291dGxpbmVTdHlsZScsICdvdXRsaW5lV2lkdGgnXSxcbiAgb3ZlcmZsb3c6IFsnb3ZlcmZsb3dYJywgJ292ZXJmbG93WSddLFxuICBwYWRkaW5nOiBbJ3BhZGRpbmdCb3R0b20nLCAncGFkZGluZ0xlZnQnLCAncGFkZGluZ1JpZ2h0JywgJ3BhZGRpbmdUb3AnXSxcbiAgcGxhY2VDb250ZW50OiBbJ2FsaWduQ29udGVudCcsICdqdXN0aWZ5Q29udGVudCddLFxuICBwbGFjZUl0ZW1zOiBbJ2FsaWduSXRlbXMnLCAnanVzdGlmeUl0ZW1zJ10sXG4gIHBsYWNlU2VsZjogWydhbGlnblNlbGYnLCAnanVzdGlmeVNlbGYnXSxcbiAgdGV4dERlY29yYXRpb246IFsndGV4dERlY29yYXRpb25Db2xvcicsICd0ZXh0RGVjb3JhdGlvbkxpbmUnLCAndGV4dERlY29yYXRpb25TdHlsZSddLFxuICB0ZXh0RW1waGFzaXM6IFsndGV4dEVtcGhhc2lzQ29sb3InLCAndGV4dEVtcGhhc2lzU3R5bGUnXSxcbiAgdHJhbnNpdGlvbjogWyd0cmFuc2l0aW9uRGVsYXknLCAndHJhbnNpdGlvbkR1cmF0aW9uJywgJ3RyYW5zaXRpb25Qcm9wZXJ0eScsICd0cmFuc2l0aW9uVGltaW5nRnVuY3Rpb24nXSxcbiAgd29yZFdyYXA6IFsnb3ZlcmZsb3dXcmFwJ11cbn07XG5cbi8qKlxuICogQ1NTIHByb3BlcnRpZXMgd2hpY2ggYWNjZXB0IG51bWJlcnMgYnV0IGFyZSBub3QgaW4gdW5pdHMgb2YgXCJweFwiLlxuICovXG52YXIgaXNVbml0bGVzc051bWJlciA9IHtcbiAgYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6IHRydWUsXG4gIGJvcmRlckltYWdlT3V0c2V0OiB0cnVlLFxuICBib3JkZXJJbWFnZVNsaWNlOiB0cnVlLFxuICBib3JkZXJJbWFnZVdpZHRoOiB0cnVlLFxuICBib3hGbGV4OiB0cnVlLFxuICBib3hGbGV4R3JvdXA6IHRydWUsXG4gIGJveE9yZGluYWxHcm91cDogdHJ1ZSxcbiAgY29sdW1uQ291bnQ6IHRydWUsXG4gIGNvbHVtbnM6IHRydWUsXG4gIGZsZXg6IHRydWUsXG4gIGZsZXhHcm93OiB0cnVlLFxuICBmbGV4UG9zaXRpdmU6IHRydWUsXG4gIGZsZXhTaHJpbms6IHRydWUsXG4gIGZsZXhOZWdhdGl2ZTogdHJ1ZSxcbiAgZmxleE9yZGVyOiB0cnVlLFxuICBncmlkQXJlYTogdHJ1ZSxcbiAgZ3JpZFJvdzogdHJ1ZSxcbiAgZ3JpZFJvd0VuZDogdHJ1ZSxcbiAgZ3JpZFJvd1NwYW46IHRydWUsXG4gIGdyaWRSb3dTdGFydDogdHJ1ZSxcbiAgZ3JpZENvbHVtbjogdHJ1ZSxcbiAgZ3JpZENvbHVtbkVuZDogdHJ1ZSxcbiAgZ3JpZENvbHVtblNwYW46IHRydWUsXG4gIGdyaWRDb2x1bW5TdGFydDogdHJ1ZSxcbiAgZm9udFdlaWdodDogdHJ1ZSxcbiAgbGluZUNsYW1wOiB0cnVlLFxuICBsaW5lSGVpZ2h0OiB0cnVlLFxuICBvcGFjaXR5OiB0cnVlLFxuICBvcmRlcjogdHJ1ZSxcbiAgb3JwaGFuczogdHJ1ZSxcbiAgdGFiU2l6ZTogdHJ1ZSxcbiAgd2lkb3dzOiB0cnVlLFxuICB6SW5kZXg6IHRydWUsXG4gIHpvb206IHRydWUsXG5cbiAgLy8gU1ZHLXJlbGF0ZWQgcHJvcGVydGllc1xuICBmaWxsT3BhY2l0eTogdHJ1ZSxcbiAgZmxvb2RPcGFjaXR5OiB0cnVlLFxuICBzdG9wT3BhY2l0eTogdHJ1ZSxcbiAgc3Ryb2tlRGFzaGFycmF5OiB0cnVlLFxuICBzdHJva2VEYXNob2Zmc2V0OiB0cnVlLFxuICBzdHJva2VNaXRlcmxpbWl0OiB0cnVlLFxuICBzdHJva2VPcGFjaXR5OiB0cnVlLFxuICBzdHJva2VXaWR0aDogdHJ1ZVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4IHZlbmRvci1zcGVjaWZpYyBwcmVmaXgsIGVnOiBXZWJraXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgc3R5bGUgbmFtZSwgZWc6IHRyYW5zaXRpb25EdXJhdGlvblxuICogQHJldHVybiB7c3RyaW5nfSBzdHlsZSBuYW1lIHByZWZpeGVkIHdpdGggYHByZWZpeGAsIHByb3Blcmx5IGNhbWVsQ2FzZWQsIGVnOlxuICogV2Via2l0VHJhbnNpdGlvbkR1cmF0aW9uXG4gKi9cbmZ1bmN0aW9uIHByZWZpeEtleShwcmVmaXgsIGtleSkge1xuICByZXR1cm4gcHJlZml4ICsga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnN1YnN0cmluZygxKTtcbn1cblxuLyoqXG4gKiBTdXBwb3J0IHN0eWxlIG5hbWVzIHRoYXQgbWF5IGNvbWUgcGFzc2VkIGluIHByZWZpeGVkIGJ5IGFkZGluZyBwZXJtdXRhdGlvbnNcbiAqIG9mIHZlbmRvciBwcmVmaXhlcy5cbiAqL1xudmFyIHByZWZpeGVzID0gWydXZWJraXQnLCAnbXMnLCAnTW96JywgJ08nXTtcblxuLy8gVXNpbmcgT2JqZWN0LmtleXMgaGVyZSwgb3IgZWxzZSB0aGUgdmFuaWxsYSBmb3ItaW4gbG9vcCBtYWtlcyBJRTggZ28gaW50byBhblxuLy8gaW5maW5pdGUgbG9vcCwgYmVjYXVzZSBpdCBpdGVyYXRlcyBvdmVyIHRoZSBuZXdseSBhZGRlZCBwcm9wcyB0b28uXG5PYmplY3Qua2V5cyhpc1VuaXRsZXNzTnVtYmVyKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gIHByZWZpeGVzLmZvckVhY2goZnVuY3Rpb24gKHByZWZpeCkge1xuICAgIGlzVW5pdGxlc3NOdW1iZXJbcHJlZml4S2V5KHByZWZpeCwgcHJvcCldID0gaXNVbml0bGVzc051bWJlcltwcm9wXTtcbiAgfSk7XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgdmFsdWUgaW50byB0aGUgcHJvcGVyIGNzcyB3cml0YWJsZSB2YWx1ZS4gVGhlIHN0eWxlIG5hbWUgYG5hbWVgXG4gKiBzaG91bGQgYmUgbG9naWNhbCAobm8gaHlwaGVucyksIGFzIHNwZWNpZmllZFxuICogaW4gYENTU1Byb3BlcnR5LmlzVW5pdGxlc3NOdW1iZXJgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENTUyBwcm9wZXJ0eSBuYW1lIHN1Y2ggYXMgYHRvcE1hcmdpbmAuXG4gKiBAcGFyYW0geyp9IHZhbHVlIENTUyBwcm9wZXJ0eSB2YWx1ZSBzdWNoIGFzIGAxMHB4YC5cbiAqIEByZXR1cm4ge3N0cmluZ30gTm9ybWFsaXplZCBzdHlsZSB2YWx1ZSB3aXRoIGRpbWVuc2lvbnMgYXBwbGllZC5cbiAqL1xuZnVuY3Rpb24gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShuYW1lLCB2YWx1ZSwgaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAvLyBOb3RlIHRoYXQgd2UndmUgcmVtb3ZlZCBlc2NhcGVUZXh0Rm9yQnJvd3NlcigpIGNhbGxzIGhlcmUgc2luY2UgdGhlXG4gIC8vIHdob2xlIHN0cmluZyB3aWxsIGJlIGVzY2FwZWQgd2hlbiB0aGUgYXR0cmlidXRlIGlzIGluamVjdGVkIGludG9cbiAgLy8gdGhlIG1hcmt1cC4gSWYgeW91IHByb3ZpZGUgdW5zYWZlIHVzZXIgZGF0YSBoZXJlIHRoZXkgY2FuIGluamVjdFxuICAvLyBhcmJpdHJhcnkgQ1NTIHdoaWNoIG1heSBiZSBwcm9ibGVtYXRpYyAoSSBjb3VsZG4ndCByZXBybyB0aGlzKTpcbiAgLy8gaHR0cHM6Ly93d3cub3dhc3Aub3JnL2luZGV4LnBocC9YU1NfRmlsdGVyX0V2YXNpb25fQ2hlYXRfU2hlZXRcbiAgLy8gaHR0cDovL3d3dy50aGVzcGFubmVyLmNvLnVrLzIwMDcvMTEvMjYvdWx0aW1hdGUteHNzLWNzcy1pbmplY3Rpb24vXG4gIC8vIFRoaXMgaXMgbm90IGFuIFhTUyBob2xlIGJ1dCBpbnN0ZWFkIGEgcG90ZW50aWFsIENTUyBpbmplY3Rpb24gaXNzdWVcbiAgLy8gd2hpY2ggaGFzIGxlYWQgdG8gYSBncmVhdGVyIGRpc2N1c3Npb24gYWJvdXQgaG93IHdlJ3JlIGdvaW5nIHRvXG4gIC8vIHRydXN0IFVSTHMgbW92aW5nIGZvcndhcmQuIFNlZSAjMjExNTkwMVxuXG4gIHZhciBpc0VtcHR5ID0gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB2YWx1ZSA9PT0gJyc7XG4gIGlmIChpc0VtcHR5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKCFpc0N1c3RvbVByb3BlcnR5ICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgdmFsdWUgIT09IDAgJiYgIShpc1VuaXRsZXNzTnVtYmVyLmhhc093blByb3BlcnR5KG5hbWUpICYmIGlzVW5pdGxlc3NOdW1iZXJbbmFtZV0pKSB7XG4gICAgcmV0dXJuIHZhbHVlICsgJ3B4JzsgLy8gUHJlc3VtZXMgaW1wbGljaXQgJ3B4JyBzdWZmaXggZm9yIHVuaXRsZXNzIG51bWJlcnNcbiAgfVxuXG4gIHJldHVybiAoJycgKyB2YWx1ZSkudHJpbSgpO1xufVxuXG52YXIgdXBwZXJjYXNlUGF0dGVybiA9IC8oW0EtWl0pL2c7XG52YXIgbXNQYXR0ZXJuID0gL15tcy0vO1xuXG4vKipcbiAqIEh5cGhlbmF0ZXMgYSBjYW1lbGNhc2VkIENTUyBwcm9wZXJ0eSBuYW1lLCBmb3IgZXhhbXBsZTpcbiAqXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdiYWNrZ3JvdW5kQ29sb3InKVxuICogICA8IFwiYmFja2dyb3VuZC1jb2xvclwiXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdNb3pUcmFuc2l0aW9uJylcbiAqICAgPCBcIi1tb3otdHJhbnNpdGlvblwiXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdtc1RyYW5zaXRpb24nKVxuICogICA8IFwiLW1zLXRyYW5zaXRpb25cIlxuICpcbiAqIEFzIE1vZGVybml6ciBzdWdnZXN0cyAoaHR0cDovL21vZGVybml6ci5jb20vZG9jcy8jcHJlZml4ZWQpLCBhbiBgbXNgIHByZWZpeFxuICogaXMgY29udmVydGVkIHRvIGAtbXMtYC5cbiAqL1xuZnVuY3Rpb24gaHlwaGVuYXRlU3R5bGVOYW1lKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWUucmVwbGFjZSh1cHBlcmNhc2VQYXR0ZXJuLCAnLSQxJykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKG1zUGF0dGVybiwgJy1tcy0nKTtcbn1cblxudmFyIHdhcm5WYWxpZFN0eWxlID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgLy8gJ21zVHJhbnNmb3JtJyBpcyBjb3JyZWN0LCBidXQgdGhlIG90aGVyIHByZWZpeGVzIHNob3VsZCBiZSBjYXBpdGFsaXplZFxuICB2YXIgYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuID0gL14oPzp3ZWJraXR8bW96fG8pW0EtWl0vO1xuICB2YXIgbXNQYXR0ZXJuJDEgPSAvXi1tcy0vO1xuICB2YXIgaHlwaGVuUGF0dGVybiA9IC8tKC4pL2c7XG5cbiAgLy8gc3R5bGUgdmFsdWVzIHNob3VsZG4ndCBjb250YWluIGEgc2VtaWNvbG9uXG4gIHZhciBiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4gPSAvO1xccyokLztcblxuICB2YXIgd2FybmVkU3R5bGVOYW1lcyA9IHt9O1xuICB2YXIgd2FybmVkU3R5bGVWYWx1ZXMgPSB7fTtcbiAgdmFyIHdhcm5lZEZvck5hTlZhbHVlID0gZmFsc2U7XG4gIHZhciB3YXJuZWRGb3JJbmZpbml0eVZhbHVlID0gZmFsc2U7XG5cbiAgdmFyIGNhbWVsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShoeXBoZW5QYXR0ZXJuLCBmdW5jdGlvbiAoXywgY2hhcmFjdGVyKSB7XG4gICAgICByZXR1cm4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRTdHlsZU5hbWVzW25hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSA9IHRydWU7XG4gICAgd2FybmluZyQxKGZhbHNlLCAnVW5zdXBwb3J0ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8nLCBuYW1lLFxuICAgIC8vIEFzIEFuZGkgU21pdGggc3VnZ2VzdHNcbiAgICAvLyAoaHR0cDovL3d3dy5hbmRpc21pdGguY29tL2Jsb2cvMjAxMi8wMi9tb2Rlcm5penItcHJlZml4ZWQvKSwgYW4gYC1tc2AgcHJlZml4XG4gICAgLy8gaXMgY29udmVydGVkIHRvIGxvd2VyY2FzZSBgbXNgLlxuICAgIGNhbWVsaXplKG5hbWUucmVwbGFjZShtc1BhdHRlcm4kMSwgJ21zLScpKSk7XG4gIH07XG5cbiAgdmFyIHdhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlTmFtZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0gPSB0cnVlO1xuICAgIHdhcm5pbmckMShmYWxzZSwgJ1Vuc3VwcG9ydGVkIHZlbmRvci1wcmVmaXhlZCBzdHlsZSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzPycsIG5hbWUsIG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpKTtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlVmFsdWVzLmhhc093blByb3BlcnR5KHZhbHVlKSAmJiB3YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV0gPSB0cnVlO1xuICAgIHdhcm5pbmckMShmYWxzZSwgXCJTdHlsZSBwcm9wZXJ0eSB2YWx1ZXMgc2hvdWxkbid0IGNvbnRhaW4gYSBzZW1pY29sb24uIFwiICsgJ1RyeSBcIiVzOiAlc1wiIGluc3RlYWQuJywgbmFtZSwgdmFsdWUucmVwbGFjZShiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4sICcnKSk7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlSXNOYU4gPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAod2FybmVkRm9yTmFOVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRGb3JOYU5WYWx1ZSA9IHRydWU7XG4gICAgd2FybmluZyQxKGZhbHNlLCAnYE5hTmAgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgdGhlIGAlc2AgY3NzIHN0eWxlIHByb3BlcnR5LicsIG5hbWUpO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZUlzSW5maW5pdHkgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAod2FybmVkRm9ySW5maW5pdHlWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZEZvckluZmluaXR5VmFsdWUgPSB0cnVlO1xuICAgIHdhcm5pbmckMShmYWxzZSwgJ2BJbmZpbml0eWAgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgdGhlIGAlc2AgY3NzIHN0eWxlIHByb3BlcnR5LicsIG5hbWUpO1xuICB9O1xuXG4gIHdhcm5WYWxpZFN0eWxlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKG5hbWUuaW5kZXhPZignLScpID4gLTEpIHtcbiAgICAgIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lKG5hbWUpO1xuICAgIH0gZWxzZSBpZiAoYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuLnRlc3QobmFtZSkpIHtcbiAgICAgIHdhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZShuYW1lKTtcbiAgICB9IGVsc2UgaWYgKGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybi50ZXN0KHZhbHVlKSkge1xuICAgICAgd2FyblN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uKG5hbWUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgICAgICB3YXJuU3R5bGVWYWx1ZUlzTmFOKG5hbWUsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoIWlzRmluaXRlKHZhbHVlKSkge1xuICAgICAgICB3YXJuU3R5bGVWYWx1ZUlzSW5maW5pdHkobmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxudmFyIHdhcm5WYWxpZFN0eWxlJDEgPSB3YXJuVmFsaWRTdHlsZTtcblxuLyoqXG4gKiBPcGVyYXRpb25zIGZvciBkZWFsaW5nIHdpdGggQ1NTIHByb3BlcnRpZXMuXG4gKi9cblxuLyoqXG4gKiBUaGlzIGNyZWF0ZXMgYSBzdHJpbmcgdGhhdCBpcyBleHBlY3RlZCB0byBiZSBlcXVpdmFsZW50IHRvIHRoZSBzdHlsZVxuICogYXR0cmlidXRlIGdlbmVyYXRlZCBieSBzZXJ2ZXItc2lkZSByZW5kZXJpbmcuIEl0IGJ5LXBhc3NlcyB3YXJuaW5ncyBhbmRcbiAqIHNlY3VyaXR5IGNoZWNrcyBzbyBpdCdzIG5vdCBzYWZlIHRvIHVzZSB0aGlzIHZhbHVlIGZvciBhbnl0aGluZyBvdGhlciB0aGFuXG4gKiBjb21wYXJpc29uLiBJdCBpcyBvbmx5IHVzZWQgaW4gREVWIGZvciBTU1IgdmFsaWRhdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRGFuZ2Vyb3VzU3RyaW5nRm9yU3R5bGVzKHN0eWxlcykge1xuICB7XG4gICAgdmFyIHNlcmlhbGl6ZWQgPSAnJztcbiAgICB2YXIgZGVsaW1pdGVyID0gJyc7XG4gICAgZm9yICh2YXIgc3R5bGVOYW1lIGluIHN0eWxlcykge1xuICAgICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBzdHlsZVZhbHVlID0gc3R5bGVzW3N0eWxlTmFtZV07XG4gICAgICBpZiAoc3R5bGVWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBpc0N1c3RvbVByb3BlcnR5ID0gc3R5bGVOYW1lLmluZGV4T2YoJy0tJykgPT09IDA7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gZGVsaW1pdGVyICsgaHlwaGVuYXRlU3R5bGVOYW1lKHN0eWxlTmFtZSkgKyAnOic7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlVmFsdWUsIGlzQ3VzdG9tUHJvcGVydHkpO1xuXG4gICAgICAgIGRlbGltaXRlciA9ICc7JztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQgfHwgbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIGZvciBtdWx0aXBsZSBzdHlsZXMgb24gYSBub2RlLiAgSWYgYSB2YWx1ZSBpcyBzcGVjaWZpZWQgYXNcbiAqICcnIChlbXB0eSBzdHJpbmcpLCB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBwcm9wZXJ0eSB3aWxsIGJlIHVuc2V0LlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtvYmplY3R9IHN0eWxlc1xuICovXG5mdW5jdGlvbiBzZXRWYWx1ZUZvclN0eWxlcyhub2RlLCBzdHlsZXMpIHtcbiAgdmFyIHN0eWxlID0gbm9kZS5zdHlsZTtcbiAgZm9yICh2YXIgc3R5bGVOYW1lIGluIHN0eWxlcykge1xuICAgIGlmICghc3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgaXNDdXN0b21Qcm9wZXJ0eSA9IHN0eWxlTmFtZS5pbmRleE9mKCctLScpID09PSAwO1xuICAgIHtcbiAgICAgIGlmICghaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAgICAgICB3YXJuVmFsaWRTdHlsZSQxKHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0pO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgc3R5bGVWYWx1ZSA9IGRhbmdlcm91c1N0eWxlVmFsdWUoc3R5bGVOYW1lLCBzdHlsZXNbc3R5bGVOYW1lXSwgaXNDdXN0b21Qcm9wZXJ0eSk7XG4gICAgaWYgKHN0eWxlTmFtZSA9PT0gJ2Zsb2F0Jykge1xuICAgICAgc3R5bGVOYW1lID0gJ2Nzc0Zsb2F0JztcbiAgICB9XG4gICAgaWYgKGlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgICAgIHN0eWxlLnNldFByb3BlcnR5KHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlW3N0eWxlTmFtZV0gPSBzdHlsZVZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1ZhbHVlRW1wdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdmFsdWUgPT09ICcnO1xufVxuXG4vKipcbiAqIEdpdmVuIHtjb2xvcjogJ3JlZCcsIG92ZXJmbG93OiAnaGlkZGVuJ30gcmV0dXJucyB7XG4gKiAgIGNvbG9yOiAnY29sb3InLFxuICogICBvdmVyZmxvd1g6ICdvdmVyZmxvdycsXG4gKiAgIG92ZXJmbG93WTogJ292ZXJmbG93JyxcbiAqIH0uIFRoaXMgY2FuIGJlIHJlYWQgYXMgXCJ0aGUgb3ZlcmZsb3dZIHByb3BlcnR5IHdhcyBzZXQgYnkgdGhlIG92ZXJmbG93XG4gKiBzaG9ydGhhbmRcIi4gVGhhdCBpcywgdGhlIHZhbHVlcyBhcmUgdGhlIHByb3BlcnR5IHRoYXQgZWFjaCB3YXMgZGVyaXZlZCBmcm9tLlxuICovXG5mdW5jdGlvbiBleHBhbmRTaG9ydGhhbmRNYXAoc3R5bGVzKSB7XG4gIHZhciBleHBhbmRlZCA9IHt9O1xuICBmb3IgKHZhciBrZXkgaW4gc3R5bGVzKSB7XG4gICAgdmFyIGxvbmdoYW5kcyA9IHNob3J0aGFuZFRvTG9uZ2hhbmRba2V5XSB8fCBba2V5XTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvbmdoYW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgZXhwYW5kZWRbbG9uZ2hhbmRzW2ldXSA9IGtleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4cGFuZGVkO1xufVxuXG4vKipcbiAqIFdoZW4gbWl4aW5nIHNob3J0aGFuZCBhbmQgbG9uZ2hhbmQgcHJvcGVydHkgbmFtZXMsIHdlIHdhcm4gZHVyaW5nIHVwZGF0ZXMgaWZcbiAqIHdlIGV4cGVjdCBhbiBpbmNvcnJlY3QgcmVzdWx0IHRvIG9jY3VyLiBJbiBwYXJ0aWN1bGFyLCB3ZSB3YXJuIGZvcjpcbiAqXG4gKiBVcGRhdGluZyBhIHNob3J0aGFuZCBwcm9wZXJ0eSAobG9uZ2hhbmQgZ2V0cyBvdmVyd3JpdHRlbik6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udDogJ2JheicsIGZvbnRWYXJpYW50OiAnYmFyJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udCA9ICdiYXonXG4gKiBSZW1vdmluZyBhIHNob3J0aGFuZCBwcm9wZXJ0eSAobG9uZ2hhbmQgZ2V0cyBsb3N0IHRvbyk6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udFZhcmlhbnQ6ICdiYXInfVxuICogICBiZWNvbWVzIC5zdHlsZS5mb250ID0gJydcbiAqIFJlbW92aW5nIGEgbG9uZ2hhbmQgcHJvcGVydHkgKHNob3VsZCByZXZlcnQgdG8gc2hvcnRoYW5kOyBkb2Vzbid0KTpcbiAqICAge2ZvbnQ6ICdmb28nLCBmb250VmFyaWFudDogJ2Jhcid9IC0+IHtmb250OiAnZm9vJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udFZhcmlhbnQgPSAnJ1xuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVNob3J0aGFuZFByb3BlcnR5Q29sbGlzaW9uSW5EZXYoc3R5bGVVcGRhdGVzLCBuZXh0U3R5bGVzKSB7XG4gIGlmICghd2FybkFib3V0U2hvcnRoYW5kUHJvcGVydHlDb2xsaXNpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIW5leHRTdHlsZXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZXhwYW5kZWRVcGRhdGVzID0gZXhwYW5kU2hvcnRoYW5kTWFwKHN0eWxlVXBkYXRlcyk7XG4gIHZhciBleHBhbmRlZFN0eWxlcyA9IGV4cGFuZFNob3J0aGFuZE1hcChuZXh0U3R5bGVzKTtcbiAgdmFyIHdhcm5lZEFib3V0ID0ge307XG4gIGZvciAodmFyIGtleSBpbiBleHBhbmRlZFVwZGF0ZXMpIHtcbiAgICB2YXIgb3JpZ2luYWxLZXkgPSBleHBhbmRlZFVwZGF0ZXNba2V5XTtcbiAgICB2YXIgY29ycmVjdE9yaWdpbmFsS2V5ID0gZXhwYW5kZWRTdHlsZXNba2V5XTtcbiAgICBpZiAoY29ycmVjdE9yaWdpbmFsS2V5ICYmIG9yaWdpbmFsS2V5ICE9PSBjb3JyZWN0T3JpZ2luYWxLZXkpIHtcbiAgICAgIHZhciB3YXJuaW5nS2V5ID0gb3JpZ2luYWxLZXkgKyAnLCcgKyBjb3JyZWN0T3JpZ2luYWxLZXk7XG4gICAgICBpZiAod2FybmVkQWJvdXRbd2FybmluZ0tleV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB3YXJuZWRBYm91dFt3YXJuaW5nS2V5XSA9IHRydWU7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICclcyBhIHN0eWxlIHByb3BlcnR5IGR1cmluZyByZXJlbmRlciAoJXMpIHdoZW4gYSAnICsgJ2NvbmZsaWN0aW5nIHByb3BlcnR5IGlzIHNldCAoJXMpIGNhbiBsZWFkIHRvIHN0eWxpbmcgYnVncy4gVG8gJyArIFwiYXZvaWQgdGhpcywgZG9uJ3QgbWl4IHNob3J0aGFuZCBhbmQgbm9uLXNob3J0aGFuZCBwcm9wZXJ0aWVzIFwiICsgJ2ZvciB0aGUgc2FtZSB2YWx1ZTsgaW5zdGVhZCwgcmVwbGFjZSB0aGUgc2hvcnRoYW5kIHdpdGggJyArICdzZXBhcmF0ZSB2YWx1ZXMuJywgaXNWYWx1ZUVtcHR5KHN0eWxlVXBkYXRlc1tvcmlnaW5hbEtleV0pID8gJ1JlbW92aW5nJyA6ICdVcGRhdGluZycsIG9yaWdpbmFsS2V5LCBjb3JyZWN0T3JpZ2luYWxLZXkpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBGb3IgSFRNTCwgY2VydGFpbiB0YWdzIHNob3VsZCBvbWl0IHRoZWlyIGNsb3NlIHRhZy4gV2Uga2VlcCBhIHdoaXRlbGlzdCBmb3Jcbi8vIHRob3NlIHNwZWNpYWwtY2FzZSB0YWdzLlxuXG52YXIgb21pdHRlZENsb3NlVGFncyA9IHtcbiAgYXJlYTogdHJ1ZSxcbiAgYmFzZTogdHJ1ZSxcbiAgYnI6IHRydWUsXG4gIGNvbDogdHJ1ZSxcbiAgZW1iZWQ6IHRydWUsXG4gIGhyOiB0cnVlLFxuICBpbWc6IHRydWUsXG4gIGlucHV0OiB0cnVlLFxuICBrZXlnZW46IHRydWUsXG4gIGxpbms6IHRydWUsXG4gIG1ldGE6IHRydWUsXG4gIHBhcmFtOiB0cnVlLFxuICBzb3VyY2U6IHRydWUsXG4gIHRyYWNrOiB0cnVlLFxuICB3YnI6IHRydWVcbiAgLy8gTk9URTogbWVudWl0ZW0ncyBjbG9zZSB0YWcgc2hvdWxkIGJlIG9taXR0ZWQsIGJ1dCB0aGF0IGNhdXNlcyBwcm9ibGVtcy5cbn07XG5cbi8vIEZvciBIVE1MLCBjZXJ0YWluIHRhZ3MgY2Fubm90IGhhdmUgY2hpbGRyZW4uIFRoaXMgaGFzIHRoZSBzYW1lIHB1cnBvc2UgYXNcbi8vIGBvbWl0dGVkQ2xvc2VUYWdzYCBleGNlcHQgdGhhdCBgbWVudWl0ZW1gIHNob3VsZCBzdGlsbCBoYXZlIGl0cyBjbG9zaW5nIHRhZy5cblxudmFyIHZvaWRFbGVtZW50VGFncyA9IF9hc3NpZ24oe1xuICBtZW51aXRlbTogdHJ1ZVxufSwgb21pdHRlZENsb3NlVGFncyk7XG5cbi8vIFRPRE86IFdlIGNhbiByZW1vdmUgdGhpcyBpZiB3ZSBhZGQgaW52YXJpYW50V2l0aFN0YWNrKClcbi8vIG9yIGFkZCBzdGFjayBieSBkZWZhdWx0IHRvIGludmFyaWFudHMgd2hlcmUgcG9zc2libGUuXG52YXIgSFRNTCQxID0gJ19faHRtbCc7XG5cbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDIgPSBudWxsO1xue1xuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRWYWxpZFByb3BzKHRhZywgcHJvcHMpIHtcbiAgaWYgKCFwcm9wcykge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBOb3RlIHRoZSB1c2Ugb2YgYD09YCB3aGljaCBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkLlxuICBpZiAodm9pZEVsZW1lbnRUYWdzW3RhZ10pIHtcbiAgICAhKHByb3BzLmNoaWxkcmVuID09IG51bGwgJiYgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICclcyBpcyBhIHZvaWQgZWxlbWVudCB0YWcgYW5kIG11c3QgbmVpdGhlciBoYXZlIGBjaGlsZHJlbmAgbm9yIHVzZSBgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLiVzJywgdGFnLCBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDIuZ2V0U3RhY2tBZGRlbmR1bSgpKSA6IHZvaWQgMDtcbiAgfVxuICBpZiAocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgICEocHJvcHMuY2hpbGRyZW4gPT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW4gb25seSBzZXQgb25lIG9mIGBjaGlsZHJlbmAgb3IgYHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKSA6IHZvaWQgMDtcbiAgICAhKHR5cGVvZiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PT0gJ29iamVjdCcgJiYgSFRNTCQxIGluIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSA/IGludmFyaWFudChmYWxzZSwgJ2Bwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAgbXVzdCBiZSBpbiB0aGUgZm9ybSBge19faHRtbDogLi4ufWAuIFBsZWFzZSB2aXNpdCBodHRwczovL2ZiLm1lL3JlYWN0LWludmFyaWFudC1kYW5nZXJvdXNseS1zZXQtaW5uZXItaHRtbCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKSA6IHZvaWQgMDtcbiAgfVxuICB7XG4gICAgIShwcm9wcy5zdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgfHwgIXByb3BzLmNvbnRlbnRFZGl0YWJsZSB8fCBwcm9wcy5jaGlsZHJlbiA9PSBudWxsKSA/IHdhcm5pbmckMShmYWxzZSwgJ0EgY29tcG9uZW50IGlzIGBjb250ZW50RWRpdGFibGVgIGFuZCBjb250YWlucyBgY2hpbGRyZW5gIG1hbmFnZWQgYnkgJyArICdSZWFjdC4gSXQgaXMgbm93IHlvdXIgcmVzcG9uc2liaWxpdHkgdG8gZ3VhcmFudGVlIHRoYXQgbm9uZSBvZiAnICsgJ3Rob3NlIG5vZGVzIGFyZSB1bmV4cGVjdGVkbHkgbW9kaWZpZWQgb3IgZHVwbGljYXRlZC4gVGhpcyBpcyAnICsgJ3Byb2JhYmx5IG5vdCBpbnRlbnRpb25hbC4nKSA6IHZvaWQgMDtcbiAgfVxuICAhKHByb3BzLnN0eWxlID09IG51bGwgfHwgdHlwZW9mIHByb3BzLnN0eWxlID09PSAnb2JqZWN0JykgPyBpbnZhcmlhbnQoZmFsc2UsICdUaGUgYHN0eWxlYCBwcm9wIGV4cGVjdHMgYSBtYXBwaW5nIGZyb20gc3R5bGUgcHJvcGVydGllcyB0byB2YWx1ZXMsIG5vdCBhIHN0cmluZy4gRm9yIGV4YW1wbGUsIHN0eWxlPXt7bWFyZ2luUmlnaHQ6IHNwYWNpbmcgKyBcXCdlbVxcJ319IHdoZW4gdXNpbmcgSlNYLiVzJywgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQyLmdldFN0YWNrQWRkZW5kdW0oKSkgOiB2b2lkIDA7XG59XG5cbmZ1bmN0aW9uIGlzQ3VzdG9tQ29tcG9uZW50KHRhZ05hbWUsIHByb3BzKSB7XG4gIGlmICh0YWdOYW1lLmluZGV4T2YoJy0nKSA9PT0gLTEpIHtcbiAgICByZXR1cm4gdHlwZW9mIHByb3BzLmlzID09PSAnc3RyaW5nJztcbiAgfVxuICBzd2l0Y2ggKHRhZ05hbWUpIHtcbiAgICAvLyBUaGVzZSBhcmUgcmVzZXJ2ZWQgU1ZHIGFuZCBNYXRoTUwgZWxlbWVudHMuXG4gICAgLy8gV2UgZG9uJ3QgbWluZCB0aGlzIHdoaXRlbGlzdCB0b28gbXVjaCBiZWNhdXNlIHdlIGV4cGVjdCBpdCB0byBuZXZlciBncm93LlxuICAgIC8vIFRoZSBhbHRlcm5hdGl2ZSBpcyB0byB0cmFjayB0aGUgbmFtZXNwYWNlIGluIGEgZmV3IHBsYWNlcyB3aGljaCBpcyBjb252b2x1dGVkLlxuICAgIC8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJjb21wb25lbnRzL3NwZWMvY3VzdG9tLyNjdXN0b20tZWxlbWVudHMtY29yZS1jb25jZXB0c1xuICAgIGNhc2UgJ2Fubm90YXRpb24teG1sJzpcbiAgICBjYXNlICdjb2xvci1wcm9maWxlJzpcbiAgICBjYXNlICdmb250LWZhY2UnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS1zcmMnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS11cmknOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS1mb3JtYXQnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS1uYW1lJzpcbiAgICBjYXNlICdtaXNzaW5nLWdseXBoJzpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLy8gV2hlbiBhZGRpbmcgYXR0cmlidXRlcyB0byB0aGUgSFRNTCBvciBTVkcgd2hpdGVsaXN0LCBiZSBzdXJlIHRvXG4vLyBhbHNvIGFkZCB0aGVtIHRvIHRoaXMgbW9kdWxlIHRvIGVuc3VyZSBjYXNpbmcgYW5kIGluY29ycmVjdCBuYW1lXG4vLyB3YXJuaW5ncy5cbnZhciBwb3NzaWJsZVN0YW5kYXJkTmFtZXMgPSB7XG4gIC8vIEhUTUxcbiAgYWNjZXB0OiAnYWNjZXB0JyxcbiAgYWNjZXB0Y2hhcnNldDogJ2FjY2VwdENoYXJzZXQnLFxuICAnYWNjZXB0LWNoYXJzZXQnOiAnYWNjZXB0Q2hhcnNldCcsXG4gIGFjY2Vzc2tleTogJ2FjY2Vzc0tleScsXG4gIGFjdGlvbjogJ2FjdGlvbicsXG4gIGFsbG93ZnVsbHNjcmVlbjogJ2FsbG93RnVsbFNjcmVlbicsXG4gIGFsdDogJ2FsdCcsXG4gIGFzOiAnYXMnLFxuICBhc3luYzogJ2FzeW5jJyxcbiAgYXV0b2NhcGl0YWxpemU6ICdhdXRvQ2FwaXRhbGl6ZScsXG4gIGF1dG9jb21wbGV0ZTogJ2F1dG9Db21wbGV0ZScsXG4gIGF1dG9jb3JyZWN0OiAnYXV0b0NvcnJlY3QnLFxuICBhdXRvZm9jdXM6ICdhdXRvRm9jdXMnLFxuICBhdXRvcGxheTogJ2F1dG9QbGF5JyxcbiAgYXV0b3NhdmU6ICdhdXRvU2F2ZScsXG4gIGNhcHR1cmU6ICdjYXB0dXJlJyxcbiAgY2VsbHBhZGRpbmc6ICdjZWxsUGFkZGluZycsXG4gIGNlbGxzcGFjaW5nOiAnY2VsbFNwYWNpbmcnLFxuICBjaGFsbGVuZ2U6ICdjaGFsbGVuZ2UnLFxuICBjaGFyc2V0OiAnY2hhclNldCcsXG4gIGNoZWNrZWQ6ICdjaGVja2VkJyxcbiAgY2hpbGRyZW46ICdjaGlsZHJlbicsXG4gIGNpdGU6ICdjaXRlJyxcbiAgY2xhc3M6ICdjbGFzc05hbWUnLFxuICBjbGFzc2lkOiAnY2xhc3NJRCcsXG4gIGNsYXNzbmFtZTogJ2NsYXNzTmFtZScsXG4gIGNvbHM6ICdjb2xzJyxcbiAgY29sc3BhbjogJ2NvbFNwYW4nLFxuICBjb250ZW50OiAnY29udGVudCcsXG4gIGNvbnRlbnRlZGl0YWJsZTogJ2NvbnRlbnRFZGl0YWJsZScsXG4gIGNvbnRleHRtZW51OiAnY29udGV4dE1lbnUnLFxuICBjb250cm9sczogJ2NvbnRyb2xzJyxcbiAgY29udHJvbHNsaXN0OiAnY29udHJvbHNMaXN0JyxcbiAgY29vcmRzOiAnY29vcmRzJyxcbiAgY3Jvc3NvcmlnaW46ICdjcm9zc09yaWdpbicsXG4gIGRhbmdlcm91c2x5c2V0aW5uZXJodG1sOiAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnLFxuICBkYXRhOiAnZGF0YScsXG4gIGRhdGV0aW1lOiAnZGF0ZVRpbWUnLFxuICBkZWZhdWx0OiAnZGVmYXVsdCcsXG4gIGRlZmF1bHRjaGVja2VkOiAnZGVmYXVsdENoZWNrZWQnLFxuICBkZWZhdWx0dmFsdWU6ICdkZWZhdWx0VmFsdWUnLFxuICBkZWZlcjogJ2RlZmVyJyxcbiAgZGlyOiAnZGlyJyxcbiAgZGlzYWJsZWQ6ICdkaXNhYmxlZCcsXG4gIGRvd25sb2FkOiAnZG93bmxvYWQnLFxuICBkcmFnZ2FibGU6ICdkcmFnZ2FibGUnLFxuICBlbmN0eXBlOiAnZW5jVHlwZScsXG4gIGZvcjogJ2h0bWxGb3InLFxuICBmb3JtOiAnZm9ybScsXG4gIGZvcm1tZXRob2Q6ICdmb3JtTWV0aG9kJyxcbiAgZm9ybWFjdGlvbjogJ2Zvcm1BY3Rpb24nLFxuICBmb3JtZW5jdHlwZTogJ2Zvcm1FbmNUeXBlJyxcbiAgZm9ybW5vdmFsaWRhdGU6ICdmb3JtTm9WYWxpZGF0ZScsXG4gIGZvcm10YXJnZXQ6ICdmb3JtVGFyZ2V0JyxcbiAgZnJhbWVib3JkZXI6ICdmcmFtZUJvcmRlcicsXG4gIGhlYWRlcnM6ICdoZWFkZXJzJyxcbiAgaGVpZ2h0OiAnaGVpZ2h0JyxcbiAgaGlkZGVuOiAnaGlkZGVuJyxcbiAgaGlnaDogJ2hpZ2gnLFxuICBocmVmOiAnaHJlZicsXG4gIGhyZWZsYW5nOiAnaHJlZkxhbmcnLFxuICBodG1sZm9yOiAnaHRtbEZvcicsXG4gIGh0dHBlcXVpdjogJ2h0dHBFcXVpdicsXG4gICdodHRwLWVxdWl2JzogJ2h0dHBFcXVpdicsXG4gIGljb246ICdpY29uJyxcbiAgaWQ6ICdpZCcsXG4gIGlubmVyaHRtbDogJ2lubmVySFRNTCcsXG4gIGlucHV0bW9kZTogJ2lucHV0TW9kZScsXG4gIGludGVncml0eTogJ2ludGVncml0eScsXG4gIGlzOiAnaXMnLFxuICBpdGVtaWQ6ICdpdGVtSUQnLFxuICBpdGVtcHJvcDogJ2l0ZW1Qcm9wJyxcbiAgaXRlbXJlZjogJ2l0ZW1SZWYnLFxuICBpdGVtc2NvcGU6ICdpdGVtU2NvcGUnLFxuICBpdGVtdHlwZTogJ2l0ZW1UeXBlJyxcbiAga2V5cGFyYW1zOiAna2V5UGFyYW1zJyxcbiAga2V5dHlwZTogJ2tleVR5cGUnLFxuICBraW5kOiAna2luZCcsXG4gIGxhYmVsOiAnbGFiZWwnLFxuICBsYW5nOiAnbGFuZycsXG4gIGxpc3Q6ICdsaXN0JyxcbiAgbG9vcDogJ2xvb3AnLFxuICBsb3c6ICdsb3cnLFxuICBtYW5pZmVzdDogJ21hbmlmZXN0JyxcbiAgbWFyZ2lud2lkdGg6ICdtYXJnaW5XaWR0aCcsXG4gIG1hcmdpbmhlaWdodDogJ21hcmdpbkhlaWdodCcsXG4gIG1heDogJ21heCcsXG4gIG1heGxlbmd0aDogJ21heExlbmd0aCcsXG4gIG1lZGlhOiAnbWVkaWEnLFxuICBtZWRpYWdyb3VwOiAnbWVkaWFHcm91cCcsXG4gIG1ldGhvZDogJ21ldGhvZCcsXG4gIG1pbjogJ21pbicsXG4gIG1pbmxlbmd0aDogJ21pbkxlbmd0aCcsXG4gIG11bHRpcGxlOiAnbXVsdGlwbGUnLFxuICBtdXRlZDogJ211dGVkJyxcbiAgbmFtZTogJ25hbWUnLFxuICBub21vZHVsZTogJ25vTW9kdWxlJyxcbiAgbm9uY2U6ICdub25jZScsXG4gIG5vdmFsaWRhdGU6ICdub1ZhbGlkYXRlJyxcbiAgb3BlbjogJ29wZW4nLFxuICBvcHRpbXVtOiAnb3B0aW11bScsXG4gIHBhdHRlcm46ICdwYXR0ZXJuJyxcbiAgcGxhY2Vob2xkZXI6ICdwbGFjZWhvbGRlcicsXG4gIHBsYXlzaW5saW5lOiAncGxheXNJbmxpbmUnLFxuICBwb3N0ZXI6ICdwb3N0ZXInLFxuICBwcmVsb2FkOiAncHJlbG9hZCcsXG4gIHByb2ZpbGU6ICdwcm9maWxlJyxcbiAgcmFkaW9ncm91cDogJ3JhZGlvR3JvdXAnLFxuICByZWFkb25seTogJ3JlYWRPbmx5JyxcbiAgcmVmZXJyZXJwb2xpY3k6ICdyZWZlcnJlclBvbGljeScsXG4gIHJlbDogJ3JlbCcsXG4gIHJlcXVpcmVkOiAncmVxdWlyZWQnLFxuICByZXZlcnNlZDogJ3JldmVyc2VkJyxcbiAgcm9sZTogJ3JvbGUnLFxuICByb3dzOiAncm93cycsXG4gIHJvd3NwYW46ICdyb3dTcGFuJyxcbiAgc2FuZGJveDogJ3NhbmRib3gnLFxuICBzY29wZTogJ3Njb3BlJyxcbiAgc2NvcGVkOiAnc2NvcGVkJyxcbiAgc2Nyb2xsaW5nOiAnc2Nyb2xsaW5nJyxcbiAgc2VhbWxlc3M6ICdzZWFtbGVzcycsXG4gIHNlbGVjdGVkOiAnc2VsZWN0ZWQnLFxuICBzaGFwZTogJ3NoYXBlJyxcbiAgc2l6ZTogJ3NpemUnLFxuICBzaXplczogJ3NpemVzJyxcbiAgc3BhbjogJ3NwYW4nLFxuICBzcGVsbGNoZWNrOiAnc3BlbGxDaGVjaycsXG4gIHNyYzogJ3NyYycsXG4gIHNyY2RvYzogJ3NyY0RvYycsXG4gIHNyY2xhbmc6ICdzcmNMYW5nJyxcbiAgc3Jjc2V0OiAnc3JjU2V0JyxcbiAgc3RhcnQ6ICdzdGFydCcsXG4gIHN0ZXA6ICdzdGVwJyxcbiAgc3R5bGU6ICdzdHlsZScsXG4gIHN1bW1hcnk6ICdzdW1tYXJ5JyxcbiAgdGFiaW5kZXg6ICd0YWJJbmRleCcsXG4gIHRhcmdldDogJ3RhcmdldCcsXG4gIHRpdGxlOiAndGl0bGUnLFxuICB0eXBlOiAndHlwZScsXG4gIHVzZW1hcDogJ3VzZU1hcCcsXG4gIHZhbHVlOiAndmFsdWUnLFxuICB3aWR0aDogJ3dpZHRoJyxcbiAgd21vZGU6ICd3bW9kZScsXG4gIHdyYXA6ICd3cmFwJyxcblxuICAvLyBTVkdcbiAgYWJvdXQ6ICdhYm91dCcsXG4gIGFjY2VudGhlaWdodDogJ2FjY2VudEhlaWdodCcsXG4gICdhY2NlbnQtaGVpZ2h0JzogJ2FjY2VudEhlaWdodCcsXG4gIGFjY3VtdWxhdGU6ICdhY2N1bXVsYXRlJyxcbiAgYWRkaXRpdmU6ICdhZGRpdGl2ZScsXG4gIGFsaWdubWVudGJhc2VsaW5lOiAnYWxpZ25tZW50QmFzZWxpbmUnLFxuICAnYWxpZ25tZW50LWJhc2VsaW5lJzogJ2FsaWdubWVudEJhc2VsaW5lJyxcbiAgYWxsb3dyZW9yZGVyOiAnYWxsb3dSZW9yZGVyJyxcbiAgYWxwaGFiZXRpYzogJ2FscGhhYmV0aWMnLFxuICBhbXBsaXR1ZGU6ICdhbXBsaXR1ZGUnLFxuICBhcmFiaWNmb3JtOiAnYXJhYmljRm9ybScsXG4gICdhcmFiaWMtZm9ybSc6ICdhcmFiaWNGb3JtJyxcbiAgYXNjZW50OiAnYXNjZW50JyxcbiAgYXR0cmlidXRlbmFtZTogJ2F0dHJpYnV0ZU5hbWUnLFxuICBhdHRyaWJ1dGV0eXBlOiAnYXR0cmlidXRlVHlwZScsXG4gIGF1dG9yZXZlcnNlOiAnYXV0b1JldmVyc2UnLFxuICBhemltdXRoOiAnYXppbXV0aCcsXG4gIGJhc2VmcmVxdWVuY3k6ICdiYXNlRnJlcXVlbmN5JyxcbiAgYmFzZWxpbmVzaGlmdDogJ2Jhc2VsaW5lU2hpZnQnLFxuICAnYmFzZWxpbmUtc2hpZnQnOiAnYmFzZWxpbmVTaGlmdCcsXG4gIGJhc2Vwcm9maWxlOiAnYmFzZVByb2ZpbGUnLFxuICBiYm94OiAnYmJveCcsXG4gIGJlZ2luOiAnYmVnaW4nLFxuICBiaWFzOiAnYmlhcycsXG4gIGJ5OiAnYnknLFxuICBjYWxjbW9kZTogJ2NhbGNNb2RlJyxcbiAgY2FwaGVpZ2h0OiAnY2FwSGVpZ2h0JyxcbiAgJ2NhcC1oZWlnaHQnOiAnY2FwSGVpZ2h0JyxcbiAgY2xpcDogJ2NsaXAnLFxuICBjbGlwcGF0aDogJ2NsaXBQYXRoJyxcbiAgJ2NsaXAtcGF0aCc6ICdjbGlwUGF0aCcsXG4gIGNsaXBwYXRodW5pdHM6ICdjbGlwUGF0aFVuaXRzJyxcbiAgY2xpcHJ1bGU6ICdjbGlwUnVsZScsXG4gICdjbGlwLXJ1bGUnOiAnY2xpcFJ1bGUnLFxuICBjb2xvcjogJ2NvbG9yJyxcbiAgY29sb3JpbnRlcnBvbGF0aW9uOiAnY29sb3JJbnRlcnBvbGF0aW9uJyxcbiAgJ2NvbG9yLWludGVycG9sYXRpb24nOiAnY29sb3JJbnRlcnBvbGF0aW9uJyxcbiAgY29sb3JpbnRlcnBvbGF0aW9uZmlsdGVyczogJ2NvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnMnLFxuICAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJzogJ2NvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnMnLFxuICBjb2xvcnByb2ZpbGU6ICdjb2xvclByb2ZpbGUnLFxuICAnY29sb3ItcHJvZmlsZSc6ICdjb2xvclByb2ZpbGUnLFxuICBjb2xvcnJlbmRlcmluZzogJ2NvbG9yUmVuZGVyaW5nJyxcbiAgJ2NvbG9yLXJlbmRlcmluZyc6ICdjb2xvclJlbmRlcmluZycsXG4gIGNvbnRlbnRzY3JpcHR0eXBlOiAnY29udGVudFNjcmlwdFR5cGUnLFxuICBjb250ZW50c3R5bGV0eXBlOiAnY29udGVudFN0eWxlVHlwZScsXG4gIGN1cnNvcjogJ2N1cnNvcicsXG4gIGN4OiAnY3gnLFxuICBjeTogJ2N5JyxcbiAgZDogJ2QnLFxuICBkYXRhdHlwZTogJ2RhdGF0eXBlJyxcbiAgZGVjZWxlcmF0ZTogJ2RlY2VsZXJhdGUnLFxuICBkZXNjZW50OiAnZGVzY2VudCcsXG4gIGRpZmZ1c2Vjb25zdGFudDogJ2RpZmZ1c2VDb25zdGFudCcsXG4gIGRpcmVjdGlvbjogJ2RpcmVjdGlvbicsXG4gIGRpc3BsYXk6ICdkaXNwbGF5JyxcbiAgZGl2aXNvcjogJ2Rpdmlzb3InLFxuICBkb21pbmFudGJhc2VsaW5lOiAnZG9taW5hbnRCYXNlbGluZScsXG4gICdkb21pbmFudC1iYXNlbGluZSc6ICdkb21pbmFudEJhc2VsaW5lJyxcbiAgZHVyOiAnZHVyJyxcbiAgZHg6ICdkeCcsXG4gIGR5OiAnZHknLFxuICBlZGdlbW9kZTogJ2VkZ2VNb2RlJyxcbiAgZWxldmF0aW9uOiAnZWxldmF0aW9uJyxcbiAgZW5hYmxlYmFja2dyb3VuZDogJ2VuYWJsZUJhY2tncm91bmQnLFxuICAnZW5hYmxlLWJhY2tncm91bmQnOiAnZW5hYmxlQmFja2dyb3VuZCcsXG4gIGVuZDogJ2VuZCcsXG4gIGV4cG9uZW50OiAnZXhwb25lbnQnLFxuICBleHRlcm5hbHJlc291cmNlc3JlcXVpcmVkOiAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gIGZpbGw6ICdmaWxsJyxcbiAgZmlsbG9wYWNpdHk6ICdmaWxsT3BhY2l0eScsXG4gICdmaWxsLW9wYWNpdHknOiAnZmlsbE9wYWNpdHknLFxuICBmaWxscnVsZTogJ2ZpbGxSdWxlJyxcbiAgJ2ZpbGwtcnVsZSc6ICdmaWxsUnVsZScsXG4gIGZpbHRlcjogJ2ZpbHRlcicsXG4gIGZpbHRlcnJlczogJ2ZpbHRlclJlcycsXG4gIGZpbHRlcnVuaXRzOiAnZmlsdGVyVW5pdHMnLFxuICBmbG9vZG9wYWNpdHk6ICdmbG9vZE9wYWNpdHknLFxuICAnZmxvb2Qtb3BhY2l0eSc6ICdmbG9vZE9wYWNpdHknLFxuICBmbG9vZGNvbG9yOiAnZmxvb2RDb2xvcicsXG4gICdmbG9vZC1jb2xvcic6ICdmbG9vZENvbG9yJyxcbiAgZm9jdXNhYmxlOiAnZm9jdXNhYmxlJyxcbiAgZm9udGZhbWlseTogJ2ZvbnRGYW1pbHknLFxuICAnZm9udC1mYW1pbHknOiAnZm9udEZhbWlseScsXG4gIGZvbnRzaXplOiAnZm9udFNpemUnLFxuICAnZm9udC1zaXplJzogJ2ZvbnRTaXplJyxcbiAgZm9udHNpemVhZGp1c3Q6ICdmb250U2l6ZUFkanVzdCcsXG4gICdmb250LXNpemUtYWRqdXN0JzogJ2ZvbnRTaXplQWRqdXN0JyxcbiAgZm9udHN0cmV0Y2g6ICdmb250U3RyZXRjaCcsXG4gICdmb250LXN0cmV0Y2gnOiAnZm9udFN0cmV0Y2gnLFxuICBmb250c3R5bGU6ICdmb250U3R5bGUnLFxuICAnZm9udC1zdHlsZSc6ICdmb250U3R5bGUnLFxuICBmb250dmFyaWFudDogJ2ZvbnRWYXJpYW50JyxcbiAgJ2ZvbnQtdmFyaWFudCc6ICdmb250VmFyaWFudCcsXG4gIGZvbnR3ZWlnaHQ6ICdmb250V2VpZ2h0JyxcbiAgJ2ZvbnQtd2VpZ2h0JzogJ2ZvbnRXZWlnaHQnLFxuICBmb3JtYXQ6ICdmb3JtYXQnLFxuICBmcm9tOiAnZnJvbScsXG4gIGZ4OiAnZngnLFxuICBmeTogJ2Z5JyxcbiAgZzE6ICdnMScsXG4gIGcyOiAnZzInLFxuICBnbHlwaG5hbWU6ICdnbHlwaE5hbWUnLFxuICAnZ2x5cGgtbmFtZSc6ICdnbHlwaE5hbWUnLFxuICBnbHlwaG9yaWVudGF0aW9uaG9yaXpvbnRhbDogJ2dseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsJyxcbiAgJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnOiAnZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWwnLFxuICBnbHlwaG9yaWVudGF0aW9udmVydGljYWw6ICdnbHlwaE9yaWVudGF0aW9uVmVydGljYWwnLFxuICAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnOiAnZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsJyxcbiAgZ2x5cGhyZWY6ICdnbHlwaFJlZicsXG4gIGdyYWRpZW50dHJhbnNmb3JtOiAnZ3JhZGllbnRUcmFuc2Zvcm0nLFxuICBncmFkaWVudHVuaXRzOiAnZ3JhZGllbnRVbml0cycsXG4gIGhhbmdpbmc6ICdoYW5naW5nJyxcbiAgaG9yaXphZHZ4OiAnaG9yaXpBZHZYJyxcbiAgJ2hvcml6LWFkdi14JzogJ2hvcml6QWR2WCcsXG4gIGhvcml6b3JpZ2lueDogJ2hvcml6T3JpZ2luWCcsXG4gICdob3Jpei1vcmlnaW4teCc6ICdob3Jpek9yaWdpblgnLFxuICBpZGVvZ3JhcGhpYzogJ2lkZW9ncmFwaGljJyxcbiAgaW1hZ2VyZW5kZXJpbmc6ICdpbWFnZVJlbmRlcmluZycsXG4gICdpbWFnZS1yZW5kZXJpbmcnOiAnaW1hZ2VSZW5kZXJpbmcnLFxuICBpbjI6ICdpbjInLFxuICBpbjogJ2luJyxcbiAgaW5saXN0OiAnaW5saXN0JyxcbiAgaW50ZXJjZXB0OiAnaW50ZXJjZXB0JyxcbiAgazE6ICdrMScsXG4gIGsyOiAnazInLFxuICBrMzogJ2szJyxcbiAgazQ6ICdrNCcsXG4gIGs6ICdrJyxcbiAga2VybmVsbWF0cml4OiAna2VybmVsTWF0cml4JyxcbiAga2VybmVsdW5pdGxlbmd0aDogJ2tlcm5lbFVuaXRMZW5ndGgnLFxuICBrZXJuaW5nOiAna2VybmluZycsXG4gIGtleXBvaW50czogJ2tleVBvaW50cycsXG4gIGtleXNwbGluZXM6ICdrZXlTcGxpbmVzJyxcbiAga2V5dGltZXM6ICdrZXlUaW1lcycsXG4gIGxlbmd0aGFkanVzdDogJ2xlbmd0aEFkanVzdCcsXG4gIGxldHRlcnNwYWNpbmc6ICdsZXR0ZXJTcGFjaW5nJyxcbiAgJ2xldHRlci1zcGFjaW5nJzogJ2xldHRlclNwYWNpbmcnLFxuICBsaWdodGluZ2NvbG9yOiAnbGlnaHRpbmdDb2xvcicsXG4gICdsaWdodGluZy1jb2xvcic6ICdsaWdodGluZ0NvbG9yJyxcbiAgbGltaXRpbmdjb25lYW5nbGU6ICdsaW1pdGluZ0NvbmVBbmdsZScsXG4gIGxvY2FsOiAnbG9jYWwnLFxuICBtYXJrZXJlbmQ6ICdtYXJrZXJFbmQnLFxuICAnbWFya2VyLWVuZCc6ICdtYXJrZXJFbmQnLFxuICBtYXJrZXJoZWlnaHQ6ICdtYXJrZXJIZWlnaHQnLFxuICBtYXJrZXJtaWQ6ICdtYXJrZXJNaWQnLFxuICAnbWFya2VyLW1pZCc6ICdtYXJrZXJNaWQnLFxuICBtYXJrZXJzdGFydDogJ21hcmtlclN0YXJ0JyxcbiAgJ21hcmtlci1zdGFydCc6ICdtYXJrZXJTdGFydCcsXG4gIG1hcmtlcnVuaXRzOiAnbWFya2VyVW5pdHMnLFxuICBtYXJrZXJ3aWR0aDogJ21hcmtlcldpZHRoJyxcbiAgbWFzazogJ21hc2snLFxuICBtYXNrY29udGVudHVuaXRzOiAnbWFza0NvbnRlbnRVbml0cycsXG4gIG1hc2t1bml0czogJ21hc2tVbml0cycsXG4gIG1hdGhlbWF0aWNhbDogJ21hdGhlbWF0aWNhbCcsXG4gIG1vZGU6ICdtb2RlJyxcbiAgbnVtb2N0YXZlczogJ251bU9jdGF2ZXMnLFxuICBvZmZzZXQ6ICdvZmZzZXQnLFxuICBvcGFjaXR5OiAnb3BhY2l0eScsXG4gIG9wZXJhdG9yOiAnb3BlcmF0b3InLFxuICBvcmRlcjogJ29yZGVyJyxcbiAgb3JpZW50OiAnb3JpZW50JyxcbiAgb3JpZW50YXRpb246ICdvcmllbnRhdGlvbicsXG4gIG9yaWdpbjogJ29yaWdpbicsXG4gIG92ZXJmbG93OiAnb3ZlcmZsb3cnLFxuICBvdmVybGluZXBvc2l0aW9uOiAnb3ZlcmxpbmVQb3NpdGlvbicsXG4gICdvdmVybGluZS1wb3NpdGlvbic6ICdvdmVybGluZVBvc2l0aW9uJyxcbiAgb3ZlcmxpbmV0aGlja25lc3M6ICdvdmVybGluZVRoaWNrbmVzcycsXG4gICdvdmVybGluZS10aGlja25lc3MnOiAnb3ZlcmxpbmVUaGlja25lc3MnLFxuICBwYWludG9yZGVyOiAncGFpbnRPcmRlcicsXG4gICdwYWludC1vcmRlcic6ICdwYWludE9yZGVyJyxcbiAgcGFub3NlMTogJ3Bhbm9zZTEnLFxuICAncGFub3NlLTEnOiAncGFub3NlMScsXG4gIHBhdGhsZW5ndGg6ICdwYXRoTGVuZ3RoJyxcbiAgcGF0dGVybmNvbnRlbnR1bml0czogJ3BhdHRlcm5Db250ZW50VW5pdHMnLFxuICBwYXR0ZXJudHJhbnNmb3JtOiAncGF0dGVyblRyYW5zZm9ybScsXG4gIHBhdHRlcm51bml0czogJ3BhdHRlcm5Vbml0cycsXG4gIHBvaW50ZXJldmVudHM6ICdwb2ludGVyRXZlbnRzJyxcbiAgJ3BvaW50ZXItZXZlbnRzJzogJ3BvaW50ZXJFdmVudHMnLFxuICBwb2ludHM6ICdwb2ludHMnLFxuICBwb2ludHNhdHg6ICdwb2ludHNBdFgnLFxuICBwb2ludHNhdHk6ICdwb2ludHNBdFknLFxuICBwb2ludHNhdHo6ICdwb2ludHNBdFonLFxuICBwcmVmaXg6ICdwcmVmaXgnLFxuICBwcmVzZXJ2ZWFscGhhOiAncHJlc2VydmVBbHBoYScsXG4gIHByZXNlcnZlYXNwZWN0cmF0aW86ICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJyxcbiAgcHJpbWl0aXZldW5pdHM6ICdwcmltaXRpdmVVbml0cycsXG4gIHByb3BlcnR5OiAncHJvcGVydHknLFxuICByOiAncicsXG4gIHJhZGl1czogJ3JhZGl1cycsXG4gIHJlZng6ICdyZWZYJyxcbiAgcmVmeTogJ3JlZlknLFxuICByZW5kZXJpbmdpbnRlbnQ6ICdyZW5kZXJpbmdJbnRlbnQnLFxuICAncmVuZGVyaW5nLWludGVudCc6ICdyZW5kZXJpbmdJbnRlbnQnLFxuICByZXBlYXRjb3VudDogJ3JlcGVhdENvdW50JyxcbiAgcmVwZWF0ZHVyOiAncmVwZWF0RHVyJyxcbiAgcmVxdWlyZWRleHRlbnNpb25zOiAncmVxdWlyZWRFeHRlbnNpb25zJyxcbiAgcmVxdWlyZWRmZWF0dXJlczogJ3JlcXVpcmVkRmVhdHVyZXMnLFxuICByZXNvdXJjZTogJ3Jlc291cmNlJyxcbiAgcmVzdGFydDogJ3Jlc3RhcnQnLFxuICByZXN1bHQ6ICdyZXN1bHQnLFxuICByZXN1bHRzOiAncmVzdWx0cycsXG4gIHJvdGF0ZTogJ3JvdGF0ZScsXG4gIHJ4OiAncngnLFxuICByeTogJ3J5JyxcbiAgc2NhbGU6ICdzY2FsZScsXG4gIHNlY3VyaXR5OiAnc2VjdXJpdHknLFxuICBzZWVkOiAnc2VlZCcsXG4gIHNoYXBlcmVuZGVyaW5nOiAnc2hhcGVSZW5kZXJpbmcnLFxuICAnc2hhcGUtcmVuZGVyaW5nJzogJ3NoYXBlUmVuZGVyaW5nJyxcbiAgc2xvcGU6ICdzbG9wZScsXG4gIHNwYWNpbmc6ICdzcGFjaW5nJyxcbiAgc3BlY3VsYXJjb25zdGFudDogJ3NwZWN1bGFyQ29uc3RhbnQnLFxuICBzcGVjdWxhcmV4cG9uZW50OiAnc3BlY3VsYXJFeHBvbmVudCcsXG4gIHNwZWVkOiAnc3BlZWQnLFxuICBzcHJlYWRtZXRob2Q6ICdzcHJlYWRNZXRob2QnLFxuICBzdGFydG9mZnNldDogJ3N0YXJ0T2Zmc2V0JyxcbiAgc3RkZGV2aWF0aW9uOiAnc3RkRGV2aWF0aW9uJyxcbiAgc3RlbWg6ICdzdGVtaCcsXG4gIHN0ZW12OiAnc3RlbXYnLFxuICBzdGl0Y2h0aWxlczogJ3N0aXRjaFRpbGVzJyxcbiAgc3RvcGNvbG9yOiAnc3RvcENvbG9yJyxcbiAgJ3N0b3AtY29sb3InOiAnc3RvcENvbG9yJyxcbiAgc3RvcG9wYWNpdHk6ICdzdG9wT3BhY2l0eScsXG4gICdzdG9wLW9wYWNpdHknOiAnc3RvcE9wYWNpdHknLFxuICBzdHJpa2V0aHJvdWdocG9zaXRpb246ICdzdHJpa2V0aHJvdWdoUG9zaXRpb24nLFxuICAnc3RyaWtldGhyb3VnaC1wb3NpdGlvbic6ICdzdHJpa2V0aHJvdWdoUG9zaXRpb24nLFxuICBzdHJpa2V0aHJvdWdodGhpY2tuZXNzOiAnc3RyaWtldGhyb3VnaFRoaWNrbmVzcycsXG4gICdzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyc6ICdzdHJpa2V0aHJvdWdoVGhpY2tuZXNzJyxcbiAgc3RyaW5nOiAnc3RyaW5nJyxcbiAgc3Ryb2tlOiAnc3Ryb2tlJyxcbiAgc3Ryb2tlZGFzaGFycmF5OiAnc3Ryb2tlRGFzaGFycmF5JyxcbiAgJ3N0cm9rZS1kYXNoYXJyYXknOiAnc3Ryb2tlRGFzaGFycmF5JyxcbiAgc3Ryb2tlZGFzaG9mZnNldDogJ3N0cm9rZURhc2hvZmZzZXQnLFxuICAnc3Ryb2tlLWRhc2hvZmZzZXQnOiAnc3Ryb2tlRGFzaG9mZnNldCcsXG4gIHN0cm9rZWxpbmVjYXA6ICdzdHJva2VMaW5lY2FwJyxcbiAgJ3N0cm9rZS1saW5lY2FwJzogJ3N0cm9rZUxpbmVjYXAnLFxuICBzdHJva2VsaW5lam9pbjogJ3N0cm9rZUxpbmVqb2luJyxcbiAgJ3N0cm9rZS1saW5lam9pbic6ICdzdHJva2VMaW5lam9pbicsXG4gIHN0cm9rZW1pdGVybGltaXQ6ICdzdHJva2VNaXRlcmxpbWl0JyxcbiAgJ3N0cm9rZS1taXRlcmxpbWl0JzogJ3N0cm9rZU1pdGVybGltaXQnLFxuICBzdHJva2V3aWR0aDogJ3N0cm9rZVdpZHRoJyxcbiAgJ3N0cm9rZS13aWR0aCc6ICdzdHJva2VXaWR0aCcsXG4gIHN0cm9rZW9wYWNpdHk6ICdzdHJva2VPcGFjaXR5JyxcbiAgJ3N0cm9rZS1vcGFjaXR5JzogJ3N0cm9rZU9wYWNpdHknLFxuICBzdXBwcmVzc2NvbnRlbnRlZGl0YWJsZXdhcm5pbmc6ICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLFxuICBzdXBwcmVzc2h5ZHJhdGlvbndhcm5pbmc6ICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnLFxuICBzdXJmYWNlc2NhbGU6ICdzdXJmYWNlU2NhbGUnLFxuICBzeXN0ZW1sYW5ndWFnZTogJ3N5c3RlbUxhbmd1YWdlJyxcbiAgdGFibGV2YWx1ZXM6ICd0YWJsZVZhbHVlcycsXG4gIHRhcmdldHg6ICd0YXJnZXRYJyxcbiAgdGFyZ2V0eTogJ3RhcmdldFknLFxuICB0ZXh0YW5jaG9yOiAndGV4dEFuY2hvcicsXG4gICd0ZXh0LWFuY2hvcic6ICd0ZXh0QW5jaG9yJyxcbiAgdGV4dGRlY29yYXRpb246ICd0ZXh0RGVjb3JhdGlvbicsXG4gICd0ZXh0LWRlY29yYXRpb24nOiAndGV4dERlY29yYXRpb24nLFxuICB0ZXh0bGVuZ3RoOiAndGV4dExlbmd0aCcsXG4gIHRleHRyZW5kZXJpbmc6ICd0ZXh0UmVuZGVyaW5nJyxcbiAgJ3RleHQtcmVuZGVyaW5nJzogJ3RleHRSZW5kZXJpbmcnLFxuICB0bzogJ3RvJyxcbiAgdHJhbnNmb3JtOiAndHJhbnNmb3JtJyxcbiAgdHlwZW9mOiAndHlwZW9mJyxcbiAgdTE6ICd1MScsXG4gIHUyOiAndTInLFxuICB1bmRlcmxpbmVwb3NpdGlvbjogJ3VuZGVybGluZVBvc2l0aW9uJyxcbiAgJ3VuZGVybGluZS1wb3NpdGlvbic6ICd1bmRlcmxpbmVQb3NpdGlvbicsXG4gIHVuZGVybGluZXRoaWNrbmVzczogJ3VuZGVybGluZVRoaWNrbmVzcycsXG4gICd1bmRlcmxpbmUtdGhpY2tuZXNzJzogJ3VuZGVybGluZVRoaWNrbmVzcycsXG4gIHVuaWNvZGU6ICd1bmljb2RlJyxcbiAgdW5pY29kZWJpZGk6ICd1bmljb2RlQmlkaScsXG4gICd1bmljb2RlLWJpZGknOiAndW5pY29kZUJpZGknLFxuICB1bmljb2RlcmFuZ2U6ICd1bmljb2RlUmFuZ2UnLFxuICAndW5pY29kZS1yYW5nZSc6ICd1bmljb2RlUmFuZ2UnLFxuICB1bml0c3BlcmVtOiAndW5pdHNQZXJFbScsXG4gICd1bml0cy1wZXItZW0nOiAndW5pdHNQZXJFbScsXG4gIHVuc2VsZWN0YWJsZTogJ3Vuc2VsZWN0YWJsZScsXG4gIHZhbHBoYWJldGljOiAndkFscGhhYmV0aWMnLFxuICAndi1hbHBoYWJldGljJzogJ3ZBbHBoYWJldGljJyxcbiAgdmFsdWVzOiAndmFsdWVzJyxcbiAgdmVjdG9yZWZmZWN0OiAndmVjdG9yRWZmZWN0JyxcbiAgJ3ZlY3Rvci1lZmZlY3QnOiAndmVjdG9yRWZmZWN0JyxcbiAgdmVyc2lvbjogJ3ZlcnNpb24nLFxuICB2ZXJ0YWR2eTogJ3ZlcnRBZHZZJyxcbiAgJ3ZlcnQtYWR2LXknOiAndmVydEFkdlknLFxuICB2ZXJ0b3JpZ2lueDogJ3ZlcnRPcmlnaW5YJyxcbiAgJ3ZlcnQtb3JpZ2luLXgnOiAndmVydE9yaWdpblgnLFxuICB2ZXJ0b3JpZ2lueTogJ3ZlcnRPcmlnaW5ZJyxcbiAgJ3ZlcnQtb3JpZ2luLXknOiAndmVydE9yaWdpblknLFxuICB2aGFuZ2luZzogJ3ZIYW5naW5nJyxcbiAgJ3YtaGFuZ2luZyc6ICd2SGFuZ2luZycsXG4gIHZpZGVvZ3JhcGhpYzogJ3ZJZGVvZ3JhcGhpYycsXG4gICd2LWlkZW9ncmFwaGljJzogJ3ZJZGVvZ3JhcGhpYycsXG4gIHZpZXdib3g6ICd2aWV3Qm94JyxcbiAgdmlld3RhcmdldDogJ3ZpZXdUYXJnZXQnLFxuICB2aXNpYmlsaXR5OiAndmlzaWJpbGl0eScsXG4gIHZtYXRoZW1hdGljYWw6ICd2TWF0aGVtYXRpY2FsJyxcbiAgJ3YtbWF0aGVtYXRpY2FsJzogJ3ZNYXRoZW1hdGljYWwnLFxuICB2b2NhYjogJ3ZvY2FiJyxcbiAgd2lkdGhzOiAnd2lkdGhzJyxcbiAgd29yZHNwYWNpbmc6ICd3b3JkU3BhY2luZycsXG4gICd3b3JkLXNwYWNpbmcnOiAnd29yZFNwYWNpbmcnLFxuICB3cml0aW5nbW9kZTogJ3dyaXRpbmdNb2RlJyxcbiAgJ3dyaXRpbmctbW9kZSc6ICd3cml0aW5nTW9kZScsXG4gIHgxOiAneDEnLFxuICB4MjogJ3gyJyxcbiAgeDogJ3gnLFxuICB4Y2hhbm5lbHNlbGVjdG9yOiAneENoYW5uZWxTZWxlY3RvcicsXG4gIHhoZWlnaHQ6ICd4SGVpZ2h0JyxcbiAgJ3gtaGVpZ2h0JzogJ3hIZWlnaHQnLFxuICB4bGlua2FjdHVhdGU6ICd4bGlua0FjdHVhdGUnLFxuICAneGxpbms6YWN0dWF0ZSc6ICd4bGlua0FjdHVhdGUnLFxuICB4bGlua2FyY3JvbGU6ICd4bGlua0FyY3JvbGUnLFxuICAneGxpbms6YXJjcm9sZSc6ICd4bGlua0FyY3JvbGUnLFxuICB4bGlua2hyZWY6ICd4bGlua0hyZWYnLFxuICAneGxpbms6aHJlZic6ICd4bGlua0hyZWYnLFxuICB4bGlua3JvbGU6ICd4bGlua1JvbGUnLFxuICAneGxpbms6cm9sZSc6ICd4bGlua1JvbGUnLFxuICB4bGlua3Nob3c6ICd4bGlua1Nob3cnLFxuICAneGxpbms6c2hvdyc6ICd4bGlua1Nob3cnLFxuICB4bGlua3RpdGxlOiAneGxpbmtUaXRsZScsXG4gICd4bGluazp0aXRsZSc6ICd4bGlua1RpdGxlJyxcbiAgeGxpbmt0eXBlOiAneGxpbmtUeXBlJyxcbiAgJ3hsaW5rOnR5cGUnOiAneGxpbmtUeXBlJyxcbiAgeG1sYmFzZTogJ3htbEJhc2UnLFxuICAneG1sOmJhc2UnOiAneG1sQmFzZScsXG4gIHhtbGxhbmc6ICd4bWxMYW5nJyxcbiAgJ3htbDpsYW5nJzogJ3htbExhbmcnLFxuICB4bWxuczogJ3htbG5zJyxcbiAgJ3htbDpzcGFjZSc6ICd4bWxTcGFjZScsXG4gIHhtbG5zeGxpbms6ICd4bWxuc1hsaW5rJyxcbiAgJ3htbG5zOnhsaW5rJzogJ3htbG5zWGxpbmsnLFxuICB4bWxzcGFjZTogJ3htbFNwYWNlJyxcbiAgeTE6ICd5MScsXG4gIHkyOiAneTInLFxuICB5OiAneScsXG4gIHljaGFubmVsc2VsZWN0b3I6ICd5Q2hhbm5lbFNlbGVjdG9yJyxcbiAgejogJ3onLFxuICB6b29tYW5kcGFuOiAnem9vbUFuZFBhbidcbn07XG5cbnZhciBhcmlhUHJvcGVydGllcyA9IHtcbiAgJ2FyaWEtY3VycmVudCc6IDAsIC8vIHN0YXRlXG4gICdhcmlhLWRldGFpbHMnOiAwLFxuICAnYXJpYS1kaXNhYmxlZCc6IDAsIC8vIHN0YXRlXG4gICdhcmlhLWhpZGRlbic6IDAsIC8vIHN0YXRlXG4gICdhcmlhLWludmFsaWQnOiAwLCAvLyBzdGF0ZVxuICAnYXJpYS1rZXlzaG9ydGN1dHMnOiAwLFxuICAnYXJpYS1sYWJlbCc6IDAsXG4gICdhcmlhLXJvbGVkZXNjcmlwdGlvbic6IDAsXG4gIC8vIFdpZGdldCBBdHRyaWJ1dGVzXG4gICdhcmlhLWF1dG9jb21wbGV0ZSc6IDAsXG4gICdhcmlhLWNoZWNrZWQnOiAwLFxuICAnYXJpYS1leHBhbmRlZCc6IDAsXG4gICdhcmlhLWhhc3BvcHVwJzogMCxcbiAgJ2FyaWEtbGV2ZWwnOiAwLFxuICAnYXJpYS1tb2RhbCc6IDAsXG4gICdhcmlhLW11bHRpbGluZSc6IDAsXG4gICdhcmlhLW11bHRpc2VsZWN0YWJsZSc6IDAsXG4gICdhcmlhLW9yaWVudGF0aW9uJzogMCxcbiAgJ2FyaWEtcGxhY2Vob2xkZXInOiAwLFxuICAnYXJpYS1wcmVzc2VkJzogMCxcbiAgJ2FyaWEtcmVhZG9ubHknOiAwLFxuICAnYXJpYS1yZXF1aXJlZCc6IDAsXG4gICdhcmlhLXNlbGVjdGVkJzogMCxcbiAgJ2FyaWEtc29ydCc6IDAsXG4gICdhcmlhLXZhbHVlbWF4JzogMCxcbiAgJ2FyaWEtdmFsdWVtaW4nOiAwLFxuICAnYXJpYS12YWx1ZW5vdyc6IDAsXG4gICdhcmlhLXZhbHVldGV4dCc6IDAsXG4gIC8vIExpdmUgUmVnaW9uIEF0dHJpYnV0ZXNcbiAgJ2FyaWEtYXRvbWljJzogMCxcbiAgJ2FyaWEtYnVzeSc6IDAsXG4gICdhcmlhLWxpdmUnOiAwLFxuICAnYXJpYS1yZWxldmFudCc6IDAsXG4gIC8vIERyYWctYW5kLURyb3AgQXR0cmlidXRlc1xuICAnYXJpYS1kcm9wZWZmZWN0JzogMCxcbiAgJ2FyaWEtZ3JhYmJlZCc6IDAsXG4gIC8vIFJlbGF0aW9uc2hpcCBBdHRyaWJ1dGVzXG4gICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnOiAwLFxuICAnYXJpYS1jb2xjb3VudCc6IDAsXG4gICdhcmlhLWNvbGluZGV4JzogMCxcbiAgJ2FyaWEtY29sc3Bhbic6IDAsXG4gICdhcmlhLWNvbnRyb2xzJzogMCxcbiAgJ2FyaWEtZGVzY3JpYmVkYnknOiAwLFxuICAnYXJpYS1lcnJvcm1lc3NhZ2UnOiAwLFxuICAnYXJpYS1mbG93dG8nOiAwLFxuICAnYXJpYS1sYWJlbGxlZGJ5JzogMCxcbiAgJ2FyaWEtb3ducyc6IDAsXG4gICdhcmlhLXBvc2luc2V0JzogMCxcbiAgJ2FyaWEtcm93Y291bnQnOiAwLFxuICAnYXJpYS1yb3dpbmRleCc6IDAsXG4gICdhcmlhLXJvd3NwYW4nOiAwLFxuICAnYXJpYS1zZXRzaXplJzogMFxufTtcblxudmFyIHdhcm5lZFByb3BlcnRpZXMgPSB7fTtcbnZhciByQVJJQSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xudmFyIHJBUklBQ2FtZWwgPSBuZXcgUmVnRXhwKCdeKGFyaWEpW0EtWl1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSQyID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eSh0YWdOYW1lLCBuYW1lKSB7XG4gIGlmIChoYXNPd25Qcm9wZXJ0eSQyLmNhbGwod2FybmVkUHJvcGVydGllcywgbmFtZSkgJiYgd2FybmVkUHJvcGVydGllc1tuYW1lXSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHJBUklBQ2FtZWwudGVzdChuYW1lKSkge1xuICAgIHZhciBhcmlhTmFtZSA9ICdhcmlhLScgKyBuYW1lLnNsaWNlKDQpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGNvcnJlY3ROYW1lID0gYXJpYVByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoYXJpYU5hbWUpID8gYXJpYU5hbWUgOiBudWxsO1xuXG4gICAgLy8gSWYgdGhpcyBpcyBhbiBhcmlhLSogYXR0cmlidXRlLCBidXQgaXMgbm90IGxpc3RlZCBpbiB0aGUga25vd24gRE9NXG4gICAgLy8gRE9NIHByb3BlcnRpZXMsIHRoZW4gaXQgaXMgYW4gaW52YWxpZCBhcmlhLSogYXR0cmlidXRlLlxuICAgIGlmIChjb3JyZWN0TmFtZSA9PSBudWxsKSB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICdJbnZhbGlkIEFSSUEgYXR0cmlidXRlIGAlc2AuIEFSSUEgYXR0cmlidXRlcyBmb2xsb3cgdGhlIHBhdHRlcm4gYXJpYS0qIGFuZCBtdXN0IGJlIGxvd2VyY2FzZS4nLCBuYW1lKTtcbiAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIGFyaWEtKiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBsb3dlcmNhc2U7IHN1Z2dlc3QgdGhlIGxvd2VyY2FzZSB2ZXJzaW9uLlxuICAgIGlmIChuYW1lICE9PSBjb3JyZWN0TmFtZSkge1xuICAgICAgd2FybmluZyQxKGZhbHNlLCAnSW52YWxpZCBBUklBIGF0dHJpYnV0ZSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBjb3JyZWN0TmFtZSk7XG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyQVJJQS50ZXN0KG5hbWUpKSB7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBzdGFuZGFyZE5hbWUgPSBhcmlhUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkgPyBsb3dlckNhc2VkTmFtZSA6IG51bGw7XG5cbiAgICAvLyBJZiB0aGlzIGlzIGFuIGFyaWEtKiBhdHRyaWJ1dGUsIGJ1dCBpcyBub3QgbGlzdGVkIGluIHRoZSBrbm93biBET01cbiAgICAvLyBET00gcHJvcGVydGllcywgdGhlbiBpdCBpcyBhbiBpbnZhbGlkIGFyaWEtKiBhdHRyaWJ1dGUuXG4gICAgaWYgKHN0YW5kYXJkTmFtZSA9PSBudWxsKSB7XG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gYXJpYS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb24uXG4gICAgaWYgKG5hbWUgIT09IHN0YW5kYXJkTmFtZSkge1xuICAgICAgd2FybmluZyQxKGZhbHNlLCAnVW5rbm93biBBUklBIGF0dHJpYnV0ZSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBzdGFuZGFyZE5hbWUpO1xuICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gd2FybkludmFsaWRBUklBUHJvcHModHlwZSwgcHJvcHMpIHtcbiAgdmFyIGludmFsaWRQcm9wcyA9IFtdO1xuXG4gIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgIHZhciBpc1ZhbGlkID0gdmFsaWRhdGVQcm9wZXJ0eSh0eXBlLCBrZXkpO1xuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgaW52YWxpZFByb3BzLnB1c2goa2V5KTtcbiAgICB9XG4gIH1cblxuICB2YXIgdW5rbm93blByb3BTdHJpbmcgPSBpbnZhbGlkUHJvcHMubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgcmV0dXJuICdgJyArIHByb3AgKyAnYCc7XG4gIH0pLmpvaW4oJywgJyk7XG5cbiAgaWYgKGludmFsaWRQcm9wcy5sZW5ndGggPT09IDEpIHtcbiAgICB3YXJuaW5nJDEoZmFsc2UsICdJbnZhbGlkIGFyaWEgcHJvcCAlcyBvbiA8JXM+IHRhZy4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vZmIubWUvaW52YWxpZC1hcmlhLXByb3AnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gIH0gZWxzZSBpZiAoaW52YWxpZFByb3BzLmxlbmd0aCA+IDEpIHtcbiAgICB3YXJuaW5nJDEoZmFsc2UsICdJbnZhbGlkIGFyaWEgcHJvcHMgJXMgb24gPCVzPiB0YWcuICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL2ZiLm1lL2ludmFsaWQtYXJpYS1wcm9wJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyh0eXBlLCBwcm9wcykge1xuICBpZiAoaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHdhcm5JbnZhbGlkQVJJQVByb3BzKHR5cGUsIHByb3BzKTtcbn1cblxudmFyIGRpZFdhcm5WYWx1ZU51bGwgPSBmYWxzZTtcblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzJDEodHlwZSwgcHJvcHMpIHtcbiAgaWYgKHR5cGUgIT09ICdpbnB1dCcgJiYgdHlwZSAhPT0gJ3RleHRhcmVhJyAmJiB0eXBlICE9PSAnc2VsZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChwcm9wcyAhPSBudWxsICYmIHByb3BzLnZhbHVlID09PSBudWxsICYmICFkaWRXYXJuVmFsdWVOdWxsKSB7XG4gICAgZGlkV2FyblZhbHVlTnVsbCA9IHRydWU7XG4gICAgaWYgKHR5cGUgPT09ICdzZWxlY3QnICYmIHByb3BzLm11bHRpcGxlKSB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICdgdmFsdWVgIHByb3Agb24gYCVzYCBzaG91bGQgbm90IGJlIG51bGwuICcgKyAnQ29uc2lkZXIgdXNpbmcgYW4gZW1wdHkgYXJyYXkgd2hlbiBgbXVsdGlwbGVgIGlzIHNldCB0byBgdHJ1ZWAgJyArICd0byBjbGVhciB0aGUgY29tcG9uZW50IG9yIGB1bmRlZmluZWRgIGZvciB1bmNvbnRyb2xsZWQgY29tcG9uZW50cy4nLCB0eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2FybmluZyQxKGZhbHNlLCAnYHZhbHVlYCBwcm9wIG9uIGAlc2Agc2hvdWxkIG5vdCBiZSBudWxsLiAnICsgJ0NvbnNpZGVyIHVzaW5nIGFuIGVtcHR5IHN0cmluZyB0byBjbGVhciB0aGUgY29tcG9uZW50IG9yIGB1bmRlZmluZWRgICcgKyAnZm9yIHVuY29udHJvbGxlZCBjb21wb25lbnRzLicsIHR5cGUpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgdmFsaWRhdGVQcm9wZXJ0eSQxID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgdmFyIHdhcm5lZFByb3BlcnRpZXMkMSA9IHt9O1xuICB2YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIEVWRU5UX05BTUVfUkVHRVggPSAvXm9uLi87XG4gIHZhciBJTlZBTElEX0VWRU5UX05BTUVfUkVHRVggPSAvXm9uW15BLVpdLztcbiAgdmFyIHJBUklBJDEgPSBuZXcgUmVnRXhwKCdeKGFyaWEpLVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcbiAgdmFyIHJBUklBQ2FtZWwkMSA9IG5ldyBSZWdFeHAoJ14oYXJpYSlbQS1aXVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcblxuICB2YWxpZGF0ZVByb3BlcnR5JDEgPSBmdW5jdGlvbiAodGFnTmFtZSwgbmFtZSwgdmFsdWUsIGNhblVzZUV2ZW50U3lzdGVtKSB7XG4gICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHdhcm5lZFByb3BlcnRpZXMkMSwgbmFtZSkgJiYgd2FybmVkUHJvcGVydGllcyQxW25hbWVdKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnb25mb2N1c2luJyB8fCBsb3dlckNhc2VkTmFtZSA9PT0gJ29uZm9jdXNvdXQnKSB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICdSZWFjdCB1c2VzIG9uRm9jdXMgYW5kIG9uQmx1ciBpbnN0ZWFkIG9mIG9uRm9jdXNJbiBhbmQgb25Gb2N1c091dC4gJyArICdBbGwgUmVhY3QgZXZlbnRzIGFyZSBub3JtYWxpemVkIHRvIGJ1YmJsZSwgc28gb25Gb2N1c0luIGFuZCBvbkZvY3VzT3V0ICcgKyAnYXJlIG5vdCBuZWVkZWQvc3VwcG9ydGVkIGJ5IFJlYWN0LicpO1xuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFdlIGNhbid0IHJlbHkgb24gdGhlIGV2ZW50IHN5c3RlbSBiZWluZyBpbmplY3RlZCBvbiB0aGUgc2VydmVyLlxuICAgIGlmIChjYW5Vc2VFdmVudFN5c3RlbSkge1xuICAgICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUgPSBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSA/IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNbbG93ZXJDYXNlZE5hbWVdIDogbnVsbDtcbiAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lICE9IG51bGwpIHtcbiAgICAgICAgd2FybmluZyQxKGZhbHNlLCAnSW52YWxpZCBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgd2FybmluZyQxKGZhbHNlLCAnVW5rbm93biBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuIEl0IHdpbGwgYmUgaWdub3JlZC4nLCBuYW1lKTtcbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgIC8vIElmIG5vIGV2ZW50IHBsdWdpbnMgaGF2ZSBiZWVuIGluamVjdGVkLCB3ZSBhcmUgaW4gYSBzZXJ2ZXIgZW52aXJvbm1lbnQuXG4gICAgICAvLyBTbyB3ZSBjYW4ndCB0ZWxsIGlmIHRoZSBldmVudCBuYW1lIGlzIGNvcnJlY3QgZm9yIHN1cmUsIGJ1dCB3ZSBjYW4gZmlsdGVyXG4gICAgICAvLyBvdXQga25vd24gYmFkIG9uZXMgbGlrZSBgb25jbGlja2AuIFdlIGNhbid0IHN1Z2dlc3QgYSBzcGVjaWZpYyByZXBsYWNlbWVudCB0aG91Z2guXG4gICAgICBpZiAoSU5WQUxJRF9FVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgd2FybmluZyQxKGZhbHNlLCAnSW52YWxpZCBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuICcgKyAnUmVhY3QgZXZlbnRzIHVzZSB0aGUgY2FtZWxDYXNlIG5hbWluZyBjb252ZW50aW9uLCBmb3IgZXhhbXBsZSBgb25DbGlja2AuJywgbmFtZSk7XG4gICAgICB9XG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gTGV0IHRoZSBBUklBIGF0dHJpYnV0ZSBob29rIHZhbGlkYXRlIEFSSUEgYXR0cmlidXRlc1xuICAgIGlmIChyQVJJQSQxLnRlc3QobmFtZSkgfHwgckFSSUFDYW1lbCQxLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2lubmVyaHRtbCcpIHtcbiAgICAgIHdhcm5pbmckMShmYWxzZSwgJ0RpcmVjdGx5IHNldHRpbmcgcHJvcGVydHkgYGlubmVySFRNTGAgaXMgbm90IHBlcm1pdHRlZC4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgbG9va3VwIGRvY3VtZW50YXRpb24gb24gYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKTtcbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdhcmlhJykge1xuICAgICAgd2FybmluZyQxKGZhbHNlLCAnVGhlIGBhcmlhYCBhdHRyaWJ1dGUgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgaW4gUmVhY3QuICcgKyAnUGFzcyBpbmRpdmlkdWFsIGBhcmlhLWAgYXR0cmlidXRlcyBpbnN0ZWFkLicpO1xuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2lzJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHdhcm5pbmckMShmYWxzZSwgJ1JlY2VpdmVkIGEgYCVzYCBmb3IgYSBzdHJpbmcgYXR0cmlidXRlIGBpc2AuIElmIHRoaXMgaXMgZXhwZWN0ZWQsIGNhc3QgJyArICd0aGUgdmFsdWUgdG8gYSBzdHJpbmcuJywgdHlwZW9mIHZhbHVlKTtcbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWx1ZSkpIHtcbiAgICAgIHdhcm5pbmckMShmYWxzZSwgJ1JlY2VpdmVkIE5hTiBmb3IgdGhlIGAlc2AgYXR0cmlidXRlLiBJZiB0aGlzIGlzIGV4cGVjdGVkLCBjYXN0ICcgKyAndGhlIHZhbHVlIHRvIGEgc3RyaW5nLicsIG5hbWUpO1xuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBwcm9wZXJ0eUluZm8gPSBnZXRQcm9wZXJ0eUluZm8obmFtZSk7XG4gICAgdmFyIGlzUmVzZXJ2ZWQgPSBwcm9wZXJ0eUluZm8gIT09IG51bGwgJiYgcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEO1xuXG4gICAgLy8gS25vd24gYXR0cmlidXRlcyBzaG91bGQgbWF0Y2ggdGhlIGNhc2luZyBzcGVjaWZpZWQgaW4gdGhlIHByb3BlcnR5IGNvbmZpZy5cbiAgICBpZiAocG9zc2libGVTdGFuZGFyZE5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSkge1xuICAgICAgdmFyIHN0YW5kYXJkTmFtZSA9IHBvc3NpYmxlU3RhbmRhcmROYW1lc1tsb3dlckNhc2VkTmFtZV07XG4gICAgICBpZiAoc3RhbmRhcmROYW1lICE9PSBuYW1lKSB7XG4gICAgICAgIHdhcm5pbmckMShmYWxzZSwgJ0ludmFsaWQgRE9NIHByb3BlcnR5IGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIHN0YW5kYXJkTmFtZSk7XG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzUmVzZXJ2ZWQgJiYgbmFtZSAhPT0gbG93ZXJDYXNlZE5hbWUpIHtcbiAgICAgIC8vIFVua25vd24gYXR0cmlidXRlcyBzaG91bGQgaGF2ZSBsb3dlcmNhc2UgY2FzaW5nIHNpbmNlIHRoYXQncyBob3cgdGhleVxuICAgICAgLy8gd2lsbCBiZSBjYXNlZCBhbnl3YXkgd2l0aCBzZXJ2ZXIgcmVuZGVyaW5nLlxuICAgICAgd2FybmluZyQxKGZhbHNlLCAnUmVhY3QgZG9lcyBub3QgcmVjb2duaXplIHRoZSBgJXNgIHByb3Agb24gYSBET00gZWxlbWVudC4gSWYgeW91ICcgKyAnaW50ZW50aW9uYWxseSB3YW50IGl0IHRvIGFwcGVhciBpbiB0aGUgRE9NIGFzIGEgY3VzdG9tICcgKyAnYXR0cmlidXRlLCBzcGVsbCBpdCBhcyBsb3dlcmNhc2UgYCVzYCBpbnN0ZWFkLiAnICsgJ0lmIHlvdSBhY2NpZGVudGFsbHkgcGFzc2VkIGl0IGZyb20gYSBwYXJlbnQgY29tcG9uZW50LCByZW1vdmUgJyArICdpdCBmcm9tIHRoZSBET00gZWxlbWVudC4nLCBuYW1lLCBsb3dlckNhc2VkTmFtZSk7XG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHdhcm5pbmckMShmYWxzZSwgJ1JlY2VpdmVkIGAlc2AgZm9yIGEgbm9uLWJvb2xlYW4gYXR0cmlidXRlIGAlc2AuXFxuXFxuJyArICdJZiB5b3Ugd2FudCB0byB3cml0ZSBpdCB0byB0aGUgRE9NLCBwYXNzIGEgc3RyaW5nIGluc3RlYWQ6ICcgKyAnJXM9XCIlc1wiIG9yICVzPXt2YWx1ZS50b1N0cmluZygpfS4nLCB2YWx1ZSwgbmFtZSwgbmFtZSwgdmFsdWUsIG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybmluZyQxKGZhbHNlLCAnUmVjZWl2ZWQgYCVzYCBmb3IgYSBub24tYm9vbGVhbiBhdHRyaWJ1dGUgYCVzYC5cXG5cXG4nICsgJ0lmIHlvdSB3YW50IHRvIHdyaXRlIGl0IHRvIHRoZSBET00sIHBhc3MgYSBzdHJpbmcgaW5zdGVhZDogJyArICclcz1cIiVzXCIgb3IgJXM9e3ZhbHVlLnRvU3RyaW5nKCl9LlxcblxcbicgKyAnSWYgeW91IHVzZWQgdG8gY29uZGl0aW9uYWxseSBvbWl0IGl0IHdpdGggJXM9e2NvbmRpdGlvbiAmJiB2YWx1ZX0sICcgKyAncGFzcyAlcz17Y29uZGl0aW9uID8gdmFsdWUgOiB1bmRlZmluZWR9IGluc3RlYWQuJywgdmFsdWUsIG5hbWUsIG5hbWUsIHZhbHVlLCBuYW1lLCBuYW1lLCBuYW1lKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBOb3cgdGhhdCB3ZSd2ZSB2YWxpZGF0ZWQgY2FzaW5nLCBkbyBub3QgdmFsaWRhdGVcbiAgICAvLyBkYXRhIHR5cGVzIGZvciByZXNlcnZlZCBwcm9wc1xuICAgIGlmIChpc1Jlc2VydmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBXYXJuIHdoZW4gYSBrbm93biBhdHRyaWJ1dGUgaXMgYSBiYWQgdHlwZVxuICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gV2FybiB3aGVuIHBhc3NpbmcgdGhlIHN0cmluZ3MgJ2ZhbHNlJyBvciAndHJ1ZScgaW50byBhIGJvb2xlYW4gcHJvcFxuICAgIGlmICgodmFsdWUgPT09ICdmYWxzZScgfHwgdmFsdWUgPT09ICd0cnVlJykgJiYgcHJvcGVydHlJbmZvICE9PSBudWxsICYmIHByb3BlcnR5SW5mby50eXBlID09PSBCT09MRUFOKSB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICdSZWNlaXZlZCB0aGUgc3RyaW5nIGAlc2AgZm9yIHRoZSBib29sZWFuIGF0dHJpYnV0ZSBgJXNgLiAnICsgJyVzICcgKyAnRGlkIHlvdSBtZWFuICVzPXslc30/JywgdmFsdWUsIG5hbWUsIHZhbHVlID09PSAnZmFsc2UnID8gJ1RoZSBicm93c2VyIHdpbGwgaW50ZXJwcmV0IGl0IGFzIGEgdHJ1dGh5IHZhbHVlLicgOiAnQWx0aG91Z2ggdGhpcyB3b3JrcywgaXQgd2lsbCBub3Qgd29yayBhcyBleHBlY3RlZCBpZiB5b3UgcGFzcyB0aGUgc3RyaW5nIFwiZmFsc2VcIi4nLCBuYW1lLCB2YWx1ZSk7XG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59XG5cbnZhciB3YXJuVW5rbm93blByb3BlcnRpZXMgPSBmdW5jdGlvbiAodHlwZSwgcHJvcHMsIGNhblVzZUV2ZW50U3lzdGVtKSB7XG4gIHZhciB1bmtub3duUHJvcHMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7XG4gICAgdmFyIGlzVmFsaWQgPSB2YWxpZGF0ZVByb3BlcnR5JDEodHlwZSwga2V5LCBwcm9wc1trZXldLCBjYW5Vc2VFdmVudFN5c3RlbSk7XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICB1bmtub3duUHJvcHMucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuXG4gIHZhciB1bmtub3duUHJvcFN0cmluZyA9IHVua25vd25Qcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICByZXR1cm4gJ2AnICsgcHJvcCArICdgJztcbiAgfSkuam9pbignLCAnKTtcbiAgaWYgKHVua25vd25Qcm9wcy5sZW5ndGggPT09IDEpIHtcbiAgICB3YXJuaW5nJDEoZmFsc2UsICdJbnZhbGlkIHZhbHVlIGZvciBwcm9wICVzIG9uIDwlcz4gdGFnLiBFaXRoZXIgcmVtb3ZlIGl0IGZyb20gdGhlIGVsZW1lbnQsICcgKyAnb3IgcGFzcyBhIHN0cmluZyBvciBudW1iZXIgdmFsdWUgdG8ga2VlcCBpdCBpbiB0aGUgRE9NLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC1hdHRyaWJ1dGUtYmVoYXZpb3InLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gIH0gZWxzZSBpZiAodW5rbm93blByb3BzLmxlbmd0aCA+IDEpIHtcbiAgICB3YXJuaW5nJDEoZmFsc2UsICdJbnZhbGlkIHZhbHVlcyBmb3IgcHJvcHMgJXMgb24gPCVzPiB0YWcuIEVpdGhlciByZW1vdmUgdGhlbSBmcm9tIHRoZSBlbGVtZW50LCAnICsgJ29yIHBhc3MgYSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlIHRvIGtlZXAgdGhlbSBpbiB0aGUgRE9NLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC1hdHRyaWJ1dGUtYmVoYXZpb3InLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyQyKHR5cGUsIHByb3BzLCBjYW5Vc2VFdmVudFN5c3RlbSkge1xuICBpZiAoaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHdhcm5Vbmtub3duUHJvcGVydGllcyh0eXBlLCBwcm9wcywgY2FuVXNlRXZlbnRTeXN0ZW0pO1xufVxuXG4vLyBUT0RPOiBkaXJlY3QgaW1wb3J0cyBsaWtlIHNvbWUtcGFja2FnZS9zcmMvKiBhcmUgYmFkLiBGaXggbWUuXG52YXIgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSBmYWxzZTtcbnZhciBkaWRXYXJuU2hhZHlET00gPSBmYWxzZTtcblxudmFyIERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MID0gJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJztcbnZhciBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgPSAnc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nJztcbnZhciBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxID0gJ3N1cHByZXNzSHlkcmF0aW9uV2FybmluZyc7XG52YXIgQVVUT0ZPQ1VTID0gJ2F1dG9Gb2N1cyc7XG52YXIgQ0hJTERSRU4gPSAnY2hpbGRyZW4nO1xudmFyIFNUWUxFJDEgPSAnc3R5bGUnO1xudmFyIEhUTUwgPSAnX19odG1sJztcblxudmFyIEhUTUxfTkFNRVNQQUNFID0gTmFtZXNwYWNlcy5odG1sO1xuXG5cbnZhciB3YXJuZWRVbmtub3duVGFncyA9IHZvaWQgMDtcbnZhciBzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcgPSB2b2lkIDA7XG5cbnZhciB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50ID0gdm9pZCAwO1xudmFyIHdhcm5Gb3JUZXh0RGlmZmVyZW5jZSA9IHZvaWQgMDtcbnZhciB3YXJuRm9yUHJvcERpZmZlcmVuY2UgPSB2b2lkIDA7XG52YXIgd2FybkZvckV4dHJhQXR0cmlidXRlcyA9IHZvaWQgMDtcbnZhciB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIgPSB2b2lkIDA7XG52YXIgY2FuRGlmZlN0eWxlRm9ySHlkcmF0aW9uV2FybmluZyA9IHZvaWQgMDtcblxudmFyIG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZSA9IHZvaWQgMDtcbnZhciBub3JtYWxpemVIVE1MID0gdm9pZCAwO1xuXG57XG4gIHdhcm5lZFVua25vd25UYWdzID0ge1xuICAgIC8vIENocm9tZSBpcyB0aGUgb25seSBtYWpvciBicm93c2VyIG5vdCBzaGlwcGluZyA8dGltZT4uIEJ1dCBhcyBvZiBKdWx5XG4gICAgLy8gMjAxNyBpdCBpbnRlbmRzIHRvIHNoaXAgaXQgZHVlIHRvIHdpZGVzcHJlYWQgdXNhZ2UuIFdlIGludGVudGlvbmFsbHlcbiAgICAvLyAqZG9uJ3QqIHdhcm4gZm9yIDx0aW1lPiBldmVuIGlmIGl0J3MgdW5yZWNvZ25pemVkIGJ5IENocm9tZSBiZWNhdXNlXG4gICAgLy8gaXQgc29vbiB3aWxsIGJlLCBhbmQgbWFueSBhcHBzIGhhdmUgYmVlbiB1c2luZyBpdCBhbnl3YXkuXG4gICAgdGltZTogdHJ1ZSxcbiAgICAvLyBUaGVyZSBhcmUgd29ya2luZyBwb2x5ZmlsbHMgZm9yIDxkaWFsb2c+LiBMZXQgcGVvcGxlIHVzZSBpdC5cbiAgICBkaWFsb2c6IHRydWUsXG4gICAgLy8gRWxlY3Ryb24gc2hpcHMgYSBjdXN0b20gPHdlYnZpZXc+IHRhZyB0byBkaXNwbGF5IGV4dGVybmFsIHdlYiBjb250ZW50IGluXG4gICAgLy8gYW4gaXNvbGF0ZWQgZnJhbWUgYW5kIHByb2Nlc3MuXG4gICAgLy8gVGhpcyB0YWcgaXMgbm90IHByZXNlbnQgaW4gbm9uIEVsZWN0cm9uIGVudmlyb25tZW50cyBzdWNoIGFzIEpTRG9tIHdoaWNoXG4gICAgLy8gaXMgb2Z0ZW4gdXNlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy5cbiAgICAvLyBAc2VlIGh0dHBzOi8vZWxlY3Ryb25qcy5vcmcvZG9jcy9hcGkvd2Vidmlldy10YWdcbiAgICB3ZWJ2aWV3OiB0cnVlXG4gIH07XG5cbiAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBwcm9wcykge1xuICAgIHZhbGlkYXRlUHJvcGVydGllcyh0eXBlLCBwcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzJDEodHlwZSwgcHJvcHMpO1xuICAgIHZhbGlkYXRlUHJvcGVydGllcyQyKHR5cGUsIHByb3BzLCAvKiBjYW5Vc2VFdmVudFN5c3RlbSAqL3RydWUpO1xuICB9O1xuXG4gIC8vIElFIDExIHBhcnNlcyAmIG5vcm1hbGl6ZXMgdGhlIHN0eWxlIGF0dHJpYnV0ZSBhcyBvcHBvc2VkIHRvIG90aGVyXG4gIC8vIGJyb3dzZXJzLiBJdCBhZGRzIHNwYWNlcyBhbmQgc29ydHMgdGhlIHByb3BlcnRpZXMgaW4gc29tZVxuICAvLyBub24tYWxwaGFiZXRpY2FsIG9yZGVyLiBIYW5kbGluZyB0aGF0IHdvdWxkIHJlcXVpcmUgc29ydGluZyBDU1NcbiAgLy8gcHJvcGVydGllcyBpbiB0aGUgY2xpZW50ICYgc2VydmVyIHZlcnNpb25zIG9yIGFwcGx5aW5nXG4gIC8vIGBleHBlY3RlZFN0eWxlYCB0byBhIHRlbXBvcmFyeSBET00gbm9kZSB0byByZWFkIGl0cyBgc3R5bGVgIGF0dHJpYnV0ZVxuICAvLyBub3JtYWxpemVkLiBTaW5jZSBpdCBvbmx5IGFmZmVjdHMgSUUsIHdlJ3JlIHNraXBwaW5nIHN0eWxlIHdhcm5pbmdzXG4gIC8vIGluIHRoYXQgYnJvd3NlciBjb21wbGV0ZWx5IGluIGZhdm9yIG9mIGRvaW5nIGFsbCB0aGF0IHdvcmsuXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExODA3XG4gIGNhbkRpZmZTdHlsZUZvckh5ZHJhdGlvbldhcm5pbmcgPSBjYW5Vc2VET00gJiYgIWRvY3VtZW50LmRvY3VtZW50TW9kZTtcblxuICAvLyBIVE1MIHBhcnNpbmcgbm9ybWFsaXplcyBDUiBhbmQgQ1JMRiB0byBMRi5cbiAgLy8gSXQgYWxzbyBjYW4gdHVybiBcXHUwMDAwIGludG8gXFx1RkZGRCBpbnNpZGUgYXR0cmlidXRlcy5cbiAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3NpbmdsZS1wYWdlLmh0bWwjcHJlcHJvY2Vzc2luZy10aGUtaW5wdXQtc3RyZWFtXG4gIC8vIElmIHdlIGhhdmUgYSBtaXNtYXRjaCwgaXQgbWlnaHQgYmUgY2F1c2VkIGJ5IHRoYXQuXG4gIC8vIFdlIHdpbGwgc3RpbGwgcGF0Y2ggdXAgaW4gdGhpcyBjYXNlIGJ1dCBub3QgZmlyZSB0aGUgd2FybmluZy5cbiAgdmFyIE5PUk1BTElaRV9ORVdMSU5FU19SRUdFWCA9IC9cXHJcXG4/L2c7XG4gIHZhciBOT1JNQUxJWkVfTlVMTF9BTkRfUkVQTEFDRU1FTlRfUkVHRVggPSAvXFx1MDAwMHxcXHVGRkZEL2c7XG5cbiAgbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlID0gZnVuY3Rpb24gKG1hcmt1cCkge1xuICAgIHZhciBtYXJrdXBTdHJpbmcgPSB0eXBlb2YgbWFya3VwID09PSAnc3RyaW5nJyA/IG1hcmt1cCA6ICcnICsgbWFya3VwO1xuICAgIHJldHVybiBtYXJrdXBTdHJpbmcucmVwbGFjZShOT1JNQUxJWkVfTkVXTElORVNfUkVHRVgsICdcXG4nKS5yZXBsYWNlKE5PUk1BTElaRV9OVUxMX0FORF9SRVBMQUNFTUVOVF9SRUdFWCwgJycpO1xuICB9O1xuXG4gIHdhcm5Gb3JUZXh0RGlmZmVyZW5jZSA9IGZ1bmN0aW9uIChzZXJ2ZXJUZXh0LCBjbGllbnRUZXh0KSB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBub3JtYWxpemVkQ2xpZW50VGV4dCA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShjbGllbnRUZXh0KTtcbiAgICB2YXIgbm9ybWFsaXplZFNlcnZlclRleHQgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoc2VydmVyVGV4dCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRTZXJ2ZXJUZXh0ID09PSBub3JtYWxpemVkQ2xpZW50VGV4dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG4gICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnVGV4dCBjb250ZW50IGRpZCBub3QgbWF0Y2guIFNlcnZlcjogXCIlc1wiIENsaWVudDogXCIlc1wiJywgbm9ybWFsaXplZFNlcnZlclRleHQsIG5vcm1hbGl6ZWRDbGllbnRUZXh0KTtcbiAgfTtcblxuICB3YXJuRm9yUHJvcERpZmZlcmVuY2UgPSBmdW5jdGlvbiAocHJvcE5hbWUsIHNlcnZlclZhbHVlLCBjbGllbnRWYWx1ZSkge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbm9ybWFsaXplZENsaWVudFZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKGNsaWVudFZhbHVlKTtcbiAgICB2YXIgbm9ybWFsaXplZFNlcnZlclZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKHNlcnZlclZhbHVlKTtcbiAgICBpZiAobm9ybWFsaXplZFNlcnZlclZhbHVlID09PSBub3JtYWxpemVkQ2xpZW50VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1Byb3AgYCVzYCBkaWQgbm90IG1hdGNoLiBTZXJ2ZXI6ICVzIENsaWVudDogJXMnLCBwcm9wTmFtZSwgSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplZFNlcnZlclZhbHVlKSwgSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplZENsaWVudFZhbHVlKSk7XG4gIH07XG5cbiAgd2FybkZvckV4dHJhQXR0cmlidXRlcyA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lcykge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG4gICAgdmFyIG5hbWVzID0gW107XG4gICAgYXR0cmlidXRlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgbmFtZXMucHVzaChuYW1lKTtcbiAgICB9KTtcbiAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdFeHRyYSBhdHRyaWJ1dGVzIGZyb20gdGhlIHNlcnZlcjogJXMnLCBuYW1lcyk7XG4gIH07XG5cbiAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHJlZ2lzdHJhdGlvbk5hbWUsIGxpc3RlbmVyKSB7XG4gICAgaWYgKGxpc3RlbmVyID09PSBmYWxzZSkge1xuICAgICAgd2FybmluZyQxKGZhbHNlLCAnRXhwZWN0ZWQgYCVzYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBgZmFsc2VgLlxcblxcbicgKyAnSWYgeW91IHVzZWQgdG8gY29uZGl0aW9uYWxseSBvbWl0IGl0IHdpdGggJXM9e2NvbmRpdGlvbiAmJiB2YWx1ZX0sICcgKyAncGFzcyAlcz17Y29uZGl0aW9uID8gdmFsdWUgOiB1bmRlZmluZWR9IGluc3RlYWQuJywgcmVnaXN0cmF0aW9uTmFtZSwgcmVnaXN0cmF0aW9uTmFtZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm5pbmckMShmYWxzZSwgJ0V4cGVjdGVkIGAlc2AgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYSB2YWx1ZSBvZiBgJXNgIHR5cGUuJywgcmVnaXN0cmF0aW9uTmFtZSwgdHlwZW9mIGxpc3RlbmVyKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gUGFyc2UgdGhlIEhUTUwgYW5kIHJlYWQgaXQgYmFjayB0byBub3JtYWxpemUgdGhlIEhUTUwgc3RyaW5nIHNvIHRoYXQgaXRcbiAgLy8gY2FuIGJlIHVzZWQgZm9yIGNvbXBhcmlzb24uXG4gIG5vcm1hbGl6ZUhUTUwgPSBmdW5jdGlvbiAocGFyZW50LCBodG1sKSB7XG4gICAgLy8gV2UgY291bGQgaGF2ZSBjcmVhdGVkIGEgc2VwYXJhdGUgZG9jdW1lbnQgaGVyZSB0byBhdm9pZFxuICAgIC8vIHJlLWluaXRpYWxpemluZyBjdXN0b20gZWxlbWVudHMgaWYgdGhleSBleGlzdC4gQnV0IHRoaXMgYnJlYWtzXG4gICAgLy8gaG93IDxub3NjcmlwdD4gaXMgYmVpbmcgaGFuZGxlZC4gU28gd2UgdXNlIHRoZSBzYW1lIGRvY3VtZW50LlxuICAgIC8vIFNlZSB0aGUgZGlzY3Vzc2lvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xMTE1Ny5cbiAgICB2YXIgdGVzdEVsZW1lbnQgPSBwYXJlbnQubmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSA/IHBhcmVudC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocGFyZW50LnRhZ05hbWUpIDogcGFyZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHBhcmVudC5uYW1lc3BhY2VVUkksIHBhcmVudC50YWdOYW1lKTtcbiAgICB0ZXN0RWxlbWVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgIHJldHVybiB0ZXN0RWxlbWVudC5pbm5lckhUTUw7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGVuc3VyZUxpc3RlbmluZ1RvKHJvb3RDb250YWluZXJFbGVtZW50LCByZWdpc3RyYXRpb25OYW1lKSB7XG4gIHZhciBpc0RvY3VtZW50T3JGcmFnbWVudCA9IHJvb3RDb250YWluZXJFbGVtZW50Lm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFIHx8IHJvb3RDb250YWluZXJFbGVtZW50Lm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFO1xuICB2YXIgZG9jID0gaXNEb2N1bWVudE9yRnJhZ21lbnQgPyByb290Q29udGFpbmVyRWxlbWVudCA6IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gIGxpc3RlblRvKHJlZ2lzdHJhdGlvbk5hbWUsIGRvYyk7XG59XG5cbmZ1bmN0aW9uIGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCkge1xuICByZXR1cm4gcm9vdENvbnRhaW5lckVsZW1lbnQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyByb290Q29udGFpbmVyRWxlbWVudCA6IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChub2RlKSB7XG4gIC8vIE1vYmlsZSBTYWZhcmkgZG9lcyBub3QgZmlyZSBwcm9wZXJseSBidWJibGUgY2xpY2sgZXZlbnRzIG9uXG4gIC8vIG5vbi1pbnRlcmFjdGl2ZSBlbGVtZW50cywgd2hpY2ggbWVhbnMgZGVsZWdhdGVkIGNsaWNrIGxpc3RlbmVycyBkbyBub3RcbiAgLy8gZmlyZS4gVGhlIHdvcmthcm91bmQgZm9yIHRoaXMgYnVnIGludm9sdmVzIGF0dGFjaGluZyBhbiBlbXB0eSBjbGlja1xuICAvLyBsaXN0ZW5lciBvbiB0aGUgdGFyZ2V0IG5vZGUuXG4gIC8vIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDEwLzA5L2NsaWNrX2V2ZW50X2RlbC5odG1sXG4gIC8vIEp1c3Qgc2V0IGl0IHVzaW5nIHRoZSBvbmNsaWNrIHByb3BlcnR5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBtYW5hZ2UgYW55XG4gIC8vIGJvb2trZWVwaW5nIGZvciBpdC4gTm90IHN1cmUgaWYgd2UgbmVlZCB0byBjbGVhciBpdCB3aGVuIHRoZSBsaXN0ZW5lciBpc1xuICAvLyByZW1vdmVkLlxuICAvLyBUT0RPOiBPbmx5IGRvIHRoaXMgZm9yIHRoZSByZWxldmFudCBTYWZhcmlzIG1heWJlP1xuICBub2RlLm9uY2xpY2sgPSBub29wO1xufVxuXG5mdW5jdGlvbiBzZXRJbml0aWFsRE9NUHJvcGVydGllcyh0YWcsIGRvbUVsZW1lbnQsIHJvb3RDb250YWluZXJFbGVtZW50LCBuZXh0UHJvcHMsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGZvciAodmFyIHByb3BLZXkgaW4gbmV4dFByb3BzKSB7XG4gICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgbmV4dFByb3AgPSBuZXh0UHJvcHNbcHJvcEtleV07XG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFJDEpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKG5leHRQcm9wKSB7XG4gICAgICAgICAgLy8gRnJlZXplIHRoZSBuZXh0IHN0eWxlIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBhc3N1bWUgaXQgd29uJ3QgYmVcbiAgICAgICAgICAvLyBtdXRhdGVkLiBXZSBoYXZlIGFscmVhZHkgd2FybmVkIGZvciB0aGlzIGluIHRoZSBwYXN0LlxuICAgICAgICAgIE9iamVjdC5mcmVlemUobmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBSZWxpZXMgb24gYHVwZGF0ZVN0eWxlc0J5SURgIG5vdCBtdXRhdGluZyBgc3R5bGVVcGRhdGVzYC5cbiAgICAgIHNldFZhbHVlRm9yU3R5bGVzKGRvbUVsZW1lbnQsIG5leHRQcm9wKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICB2YXIgbmV4dEh0bWwgPSBuZXh0UHJvcCA/IG5leHRQcm9wW0hUTUxdIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKG5leHRIdG1sICE9IG51bGwpIHtcbiAgICAgICAgc2V0SW5uZXJIVE1MKGRvbUVsZW1lbnQsIG5leHRIdG1sKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBBdm9pZCBzZXR0aW5nIGluaXRpYWwgdGV4dENvbnRlbnQgd2hlbiB0aGUgdGV4dCBpcyBlbXB0eS4gSW4gSUUxMSBzZXR0aW5nXG4gICAgICAgIC8vIHRleHRDb250ZW50IG9uIGEgPHRleHRhcmVhPiB3aWxsIGNhdXNlIHRoZSBwbGFjZWhvbGRlciB0byBub3RcbiAgICAgICAgLy8gc2hvdyB3aXRoaW4gdGhlIDx0ZXh0YXJlYT4gdW50aWwgaXQgaGFzIGJlZW4gZm9jdXNlZCBhbmQgYmx1cnJlZCBhZ2Fpbi5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy82NzMxI2lzc3VlY29tbWVudC0yNTQ4NzQ1NTNcbiAgICAgICAgdmFyIGNhblNldFRleHRDb250ZW50ID0gdGFnICE9PSAndGV4dGFyZWEnIHx8IG5leHRQcm9wICE9PSAnJztcbiAgICAgICAgaWYgKGNhblNldFRleHRDb250ZW50KSB7XG4gICAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgJycgKyBuZXh0UHJvcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMSkge1xuICAgICAgLy8gTm9vcFxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQVVUT0ZPQ1VTKSB7XG4gICAgICAvLyBXZSBwb2x5ZmlsbCBpdCBzZXBhcmF0ZWx5IG9uIHRoZSBjbGllbnQgZHVyaW5nIGNvbW1pdC5cbiAgICAgIC8vIFdlIGNvdWxkIGhhdmUgZXhjbHVkZWQgaXQgaW4gdGhlIHByb3BlcnR5IGxpc3QgaW5zdGVhZCBvZlxuICAgICAgLy8gYWRkaW5nIGEgc3BlY2lhbCBjYXNlIGhlcmUsIGJ1dCB0aGVuIGl0IHdvdWxkbid0IGJlIGVtaXR0ZWRcbiAgICAgIC8vIG9uIHNlcnZlciByZW5kZXJpbmcgKGJ1dCB3ZSAqZG8qIHdhbnQgdG8gZW1pdCBpdCBpbiBTU1IpLlxuICAgIH0gZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIGlmICh0cnVlICYmIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgICAgZW5zdXJlTGlzdGVuaW5nVG8ocm9vdENvbnRhaW5lckVsZW1lbnQsIHByb3BLZXkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgc2V0VmFsdWVGb3JQcm9wZXJ0eShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCwgaXNDdXN0b21Db21wb25lbnRUYWcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVET01Qcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHdhc0N1c3RvbUNvbXBvbmVudFRhZywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgLy8gVE9ETzogSGFuZGxlIHdhc0N1c3RvbUNvbXBvbmVudFRhZ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHVwZGF0ZVBheWxvYWQubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgcHJvcEtleSA9IHVwZGF0ZVBheWxvYWRbaV07XG4gICAgdmFyIHByb3BWYWx1ZSA9IHVwZGF0ZVBheWxvYWRbaSArIDFdO1xuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSQxKSB7XG4gICAgICBzZXRWYWx1ZUZvclN0eWxlcyhkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgIHNldElubmVySFRNTChkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIHByb3BWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgcHJvcFZhbHVlLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJFbGVtZW50LCBwYXJlbnROYW1lc3BhY2UpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gdm9pZCAwO1xuXG4gIC8vIFdlIGNyZWF0ZSB0YWdzIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhlaXIgcGFyZW50IGNvbnRhaW5lciwgZXhjZXB0IEhUTUxcbiAgLy8gdGFncyBnZXQgbm8gbmFtZXNwYWNlLlxuICB2YXIgb3duZXJEb2N1bWVudCA9IGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCk7XG4gIHZhciBkb21FbGVtZW50ID0gdm9pZCAwO1xuICB2YXIgbmFtZXNwYWNlVVJJID0gcGFyZW50TmFtZXNwYWNlO1xuICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgIG5hbWVzcGFjZVVSSSA9IGdldEludHJpbnNpY05hbWVzcGFjZSh0eXBlKTtcbiAgfVxuICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgIHtcbiAgICAgIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpO1xuICAgICAgLy8gU2hvdWxkIHRoaXMgY2hlY2sgYmUgZ2F0ZWQgYnkgcGFyZW50IG5hbWVzcGFjZT8gTm90IHN1cmUgd2Ugd2FudCB0b1xuICAgICAgLy8gYWxsb3cgPFNWRz4gb3IgPG1BVEg+LlxuICAgICAgIShpc0N1c3RvbUNvbXBvbmVudFRhZyB8fCB0eXBlID09PSB0eXBlLnRvTG93ZXJDYXNlKCkpID8gd2FybmluZyQxKGZhbHNlLCAnPCVzIC8+IGlzIHVzaW5nIGluY29ycmVjdCBjYXNpbmcuICcgKyAnVXNlIFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMsICcgKyAnb3IgbG93ZXJjYXNlIGZvciBIVE1MIGVsZW1lbnRzLicsIHR5cGUpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAnc2NyaXB0Jykge1xuICAgICAgLy8gQ3JlYXRlIHRoZSBzY3JpcHQgdmlhIC5pbm5lckhUTUwgc28gaXRzIFwicGFyc2VyLWluc2VydGVkXCIgZmxhZyBpc1xuICAgICAgLy8gc2V0IHRvIHRydWUgYW5kIGl0IGRvZXMgbm90IGV4ZWN1dGVcbiAgICAgIHZhciBkaXYgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZGl2LmlubmVySFRNTCA9ICc8c2NyaXB0PjwnICsgJy9zY3JpcHQ+JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgLy8gVGhpcyBpcyBndWFyYW50ZWVkIHRvIHlpZWxkIGEgc2NyaXB0IGVsZW1lbnQuXG4gICAgICB2YXIgZmlyc3RDaGlsZCA9IGRpdi5maXJzdENoaWxkO1xuICAgICAgZG9tRWxlbWVudCA9IGRpdi5yZW1vdmVDaGlsZChmaXJzdENoaWxkKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9wcy5pcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vICRGbG93SXNzdWUgYGNyZWF0ZUVsZW1lbnRgIHNob3VsZCBiZSB1cGRhdGVkIGZvciBXZWIgQ29tcG9uZW50c1xuICAgICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlLCB7IGlzOiBwcm9wcy5pcyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2VwYXJhdGUgZWxzZSBicmFuY2ggaW5zdGVhZCBvZiB1c2luZyBgcHJvcHMuaXMgfHwgdW5kZWZpbmVkYCBhYm92ZSBiZWNhdXNlIG9mIGEgRmlyZWZveCBidWcuXG4gICAgICAvLyBTZWUgZGlzY3Vzc2lvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC82ODk2XG4gICAgICAvLyBhbmQgZGlzY3Vzc2lvbiBpbiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjc2MjQwXG4gICAgICBkb21FbGVtZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUpO1xuICAgICAgLy8gTm9ybWFsbHkgYXR0cmlidXRlcyBhcmUgYXNzaWduZWQgaW4gYHNldEluaXRpYWxET01Qcm9wZXJ0aWVzYCwgaG93ZXZlciB0aGUgYG11bHRpcGxlYCBhbmQgYHNpemVgXG4gICAgICAvLyBhdHRyaWJ1dGVzIG9uIGBzZWxlY3RgcyBuZWVkcyB0byBiZSBhZGRlZCBiZWZvcmUgYG9wdGlvbmBzIGFyZSBpbnNlcnRlZC5cbiAgICAgIC8vIFRoaXMgcHJldmVudHM6XG4gICAgICAvLyAtIGEgYnVnIHdoZXJlIHRoZSBgc2VsZWN0YCBkb2VzIG5vdCBzY3JvbGwgdG8gdGhlIGNvcnJlY3Qgb3B0aW9uIGJlY2F1c2Ugc2luZ3VsYXJcbiAgICAgIC8vICBgc2VsZWN0YCBlbGVtZW50cyBhdXRvbWF0aWNhbGx5IHBpY2sgdGhlIGZpcnN0IGl0ZW0gIzEzMjIyXG4gICAgICAvLyAtIGEgYnVnIHdoZXJlIHRoZSBgc2VsZWN0YCBzZXQgdGhlIGZpcnN0IGl0ZW0gYXMgc2VsZWN0ZWQgZGVzcGl0ZSB0aGUgYHNpemVgIGF0dHJpYnV0ZSAjMTQyMzlcbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzMjIyXG4gICAgICAvLyBhbmQgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNDIzOVxuICAgICAgaWYgKHR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgIHZhciBub2RlID0gZG9tRWxlbWVudDtcbiAgICAgICAgaWYgKHByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgICAgbm9kZS5tdWx0aXBsZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvcHMuc2l6ZSkge1xuICAgICAgICAgIC8vIFNldHRpbmcgYSBzaXplIGdyZWF0ZXIgdGhhbiAxIGNhdXNlcyBhIHNlbGVjdCB0byBiZWhhdmUgbGlrZSBgbXVsdGlwbGU9dHJ1ZWAsIHdoZXJlXG4gICAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgdGhhdCBubyBvcHRpb24gaXMgc2VsZWN0ZWQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gYSBzZWxlY3QgaW4gXCJzaW5nbGUgc2VsZWN0aW9uIG1vZGVcIi5cbiAgICAgICAgICBub2RlLnNpemUgPSBwcm9wcy5zaXplO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRvbUVsZW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIHR5cGUpO1xuICB9XG5cbiAge1xuICAgIGlmIChuYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICBpZiAoIWlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkb21FbGVtZW50KSA9PT0gJ1tvYmplY3QgSFRNTFVua25vd25FbGVtZW50XScgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRVbmtub3duVGFncywgdHlwZSkpIHtcbiAgICAgICAgd2FybmVkVW5rbm93blRhZ3NbdHlwZV0gPSB0cnVlO1xuICAgICAgICB3YXJuaW5nJDEoZmFsc2UsICdUaGUgdGFnIDwlcz4gaXMgdW5yZWNvZ25pemVkIGluIHRoaXMgYnJvd3Nlci4gJyArICdJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgUmVhY3QgY29tcG9uZW50LCBzdGFydCBpdHMgbmFtZSB3aXRoICcgKyAnYW4gdXBwZXJjYXNlIGxldHRlci4nLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZG9tRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVGV4dE5vZGUodGV4dCwgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCkuY3JlYXRlVGV4dE5vZGUodGV4dCk7XG59XG5cbmZ1bmN0aW9uIHNldEluaXRpYWxQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgcmF3UHJvcHMsIHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgcmF3UHJvcHMpO1xuICB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0YWcsIHJhd1Byb3BzKTtcbiAgICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcgJiYgIWRpZFdhcm5TaGFkeURPTSAmJiBkb21FbGVtZW50LnNoYWR5Um9vdCkge1xuICAgICAgd2FybmluZyQxKGZhbHNlLCAnJXMgaXMgdXNpbmcgc2hhZHkgRE9NLiBVc2luZyBzaGFkeSBET00gd2l0aCBSZWFjdCBjYW4gJyArICdjYXVzZSB0aGluZ3MgdG8gYnJlYWsgc3VidGx5LicsIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkgfHwgJ0EgY29tcG9uZW50Jyk7XG4gICAgICBkaWRXYXJuU2hhZHlET00gPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE86IE1ha2Ugc3VyZSB0aGF0IHdlIGNoZWNrIGlzTW91bnRlZCBiZWZvcmUgZmlyaW5nIGFueSBvZiB0aGVzZSBldmVudHMuXG4gIHZhciBwcm9wcyA9IHZvaWQgMDtcbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICB0cmFwQnViYmxlZEV2ZW50KFRPUF9MT0FELCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd2aWRlbyc6XG4gICAgY2FzZSAnYXVkaW8nOlxuICAgICAgLy8gQ3JlYXRlIGxpc3RlbmVyIGZvciBlYWNoIG1lZGlhIGV2ZW50XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1lZGlhRXZlbnRUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0cmFwQnViYmxlZEV2ZW50KG1lZGlhRXZlbnRUeXBlc1tpXSwgZG9tRWxlbWVudCk7XG4gICAgICB9XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc291cmNlJzpcbiAgICAgIHRyYXBCdWJibGVkRXZlbnQoVE9QX0VSUk9SLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdpbWcnOlxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIHRyYXBCdWJibGVkRXZlbnQoVE9QX0VSUk9SLCBkb21FbGVtZW50KTtcbiAgICAgIHRyYXBCdWJibGVkRXZlbnQoVE9QX0xPQUQsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Zvcm0nOlxuICAgICAgdHJhcEJ1YmJsZWRFdmVudChUT1BfUkVTRVQsIGRvbUVsZW1lbnQpO1xuICAgICAgdHJhcEJ1YmJsZWRFdmVudChUT1BfU1VCTUlULCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdkZXRhaWxzJzpcbiAgICAgIHRyYXBCdWJibGVkRXZlbnQoVE9QX1RPR0dMRSwgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICB0cmFwQnViYmxlZEV2ZW50KFRPUF9JTlZBTElELCBkb21FbGVtZW50KTtcbiAgICAgIC8vIEZvciBjb250cm9sbGVkIGNvbXBvbmVudHMgd2UgYWx3YXlzIG5lZWQgdG8gZW5zdXJlIHdlJ3JlIGxpc3RlbmluZ1xuICAgICAgLy8gdG8gb25DaGFuZ2UuIEV2ZW4gaWYgdGhlcmUgaXMgbm8gbGlzdGVuZXIuXG4gICAgICBlbnN1cmVMaXN0ZW5pbmdUbyhyb290Q29udGFpbmVyRWxlbWVudCwgJ29uQ2hhbmdlJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgdmFsaWRhdGVQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMkMihkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICB0cmFwQnViYmxlZEV2ZW50KFRPUF9JTlZBTElELCBkb21FbGVtZW50KTtcbiAgICAgIC8vIEZvciBjb250cm9sbGVkIGNvbXBvbmVudHMgd2UgYWx3YXlzIG5lZWQgdG8gZW5zdXJlIHdlJ3JlIGxpc3RlbmluZ1xuICAgICAgLy8gdG8gb25DaGFuZ2UuIEV2ZW4gaWYgdGhlcmUgaXMgbm8gbGlzdGVuZXIuXG4gICAgICBlbnN1cmVMaXN0ZW5pbmdUbyhyb290Q29udGFpbmVyRWxlbWVudCwgJ29uQ2hhbmdlJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMkMyhkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICB0cmFwQnViYmxlZEV2ZW50KFRPUF9JTlZBTElELCBkb21FbGVtZW50KTtcbiAgICAgIC8vIEZvciBjb250cm9sbGVkIGNvbXBvbmVudHMgd2UgYWx3YXlzIG5lZWQgdG8gZW5zdXJlIHdlJ3JlIGxpc3RlbmluZ1xuICAgICAgLy8gdG8gb25DaGFuZ2UuIEV2ZW4gaWYgdGhlcmUgaXMgbm8gbGlzdGVuZXIuXG4gICAgICBlbnN1cmVMaXN0ZW5pbmdUbyhyb290Q29udGFpbmVyRWxlbWVudCwgJ29uQ2hhbmdlJyk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgfVxuXG4gIGFzc2VydFZhbGlkUHJvcHModGFnLCBwcm9wcyk7XG5cbiAgc2V0SW5pdGlhbERPTVByb3BlcnRpZXModGFnLCBkb21FbGVtZW50LCByb290Q29udGFpbmVyRWxlbWVudCwgcHJvcHMsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIoZG9tRWxlbWVudCwgcmF3UHJvcHMsIGZhbHNlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMyhkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgcG9zdE1vdW50V3JhcHBlciQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbi8vIENhbGN1bGF0ZSB0aGUgZGlmZiBiZXR3ZWVuIHRoZSB0d28gb2JqZWN0cy5cbmZ1bmN0aW9uIGRpZmZQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgbGFzdFJhd1Byb3BzLCBuZXh0UmF3UHJvcHMsIHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50KHRhZywgbmV4dFJhd1Byb3BzKTtcbiAgfVxuXG4gIHZhciB1cGRhdGVQYXlsb2FkID0gbnVsbDtcblxuICB2YXIgbGFzdFByb3BzID0gdm9pZCAwO1xuICB2YXIgbmV4dFByb3BzID0gdm9pZCAwO1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCBsYXN0UmF3UHJvcHMpO1xuICAgICAgbmV4dFByb3BzID0gZ2V0SG9zdFByb3BzKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzJDEoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTtcbiAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyQxKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzJDIoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTtcbiAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyQyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBsYXN0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMyhkb21FbGVtZW50LCBsYXN0UmF3UHJvcHMpO1xuICAgICAgbmV4dFByb3BzID0gZ2V0SG9zdFByb3BzJDMoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBsYXN0UHJvcHMgPSBsYXN0UmF3UHJvcHM7XG4gICAgICBuZXh0UHJvcHMgPSBuZXh0UmF3UHJvcHM7XG4gICAgICBpZiAodHlwZW9mIGxhc3RQcm9wcy5vbkNsaWNrICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBuZXh0UHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIG5leHRQcm9wcyk7XG5cbiAgdmFyIHByb3BLZXkgPSB2b2lkIDA7XG4gIHZhciBzdHlsZU5hbWUgPSB2b2lkIDA7XG4gIHZhciBzdHlsZVVwZGF0ZXMgPSBudWxsO1xuICBmb3IgKHByb3BLZXkgaW4gbGFzdFByb3BzKSB7XG4gICAgaWYgKG5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCAhbGFzdFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8IGxhc3RQcm9wc1twcm9wS2V5XSA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFJDEpIHtcbiAgICAgIHZhciBsYXN0U3R5bGUgPSBsYXN0UHJvcHNbcHJvcEtleV07XG4gICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0U3R5bGUpIHtcbiAgICAgICAgaWYgKGxhc3RTdHlsZS5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCB8fCBwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgLy8gTm9vcC4gVGhpcyBpcyBoYW5kbGVkIGJ5IHRoZSBjbGVhciB0ZXh0IG1lY2hhbmlzbS5cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxKSB7XG4gICAgICAvLyBOb29wXG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBBVVRPRk9DVVMpIHtcbiAgICAgIC8vIE5vb3AuIEl0IGRvZXNuJ3Qgd29yayBvbiB1cGRhdGVzIGFueXdheS5cbiAgICB9IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLiBJZiBhbnkgbGlzdGVuZXIgdXBkYXRlcyB3ZSBuZWVkIHRvIGVuc3VyZVxuICAgICAgLy8gdGhhdCB0aGUgXCJjdXJyZW50XCIgZmliZXIgcG9pbnRlciBnZXRzIHVwZGF0ZWQgc28gd2UgbmVlZCBhIGNvbW1pdFxuICAgICAgLy8gdG8gdXBkYXRlIHRoaXMgZWxlbWVudC5cbiAgICAgIGlmICghdXBkYXRlUGF5bG9hZCkge1xuICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBhbGwgb3RoZXIgZGVsZXRlZCBwcm9wZXJ0aWVzIHdlIGFkZCBpdCB0byB0aGUgcXVldWUuIFdlIHVzZVxuICAgICAgLy8gdGhlIHdoaXRlbGlzdCBpbiB0aGUgY29tbWl0IHBoYXNlIGluc3RlYWQuXG4gICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgbnVsbCk7XG4gICAgfVxuICB9XG4gIGZvciAocHJvcEtleSBpbiBuZXh0UHJvcHMpIHtcbiAgICB2YXIgbmV4dFByb3AgPSBuZXh0UHJvcHNbcHJvcEtleV07XG4gICAgdmFyIGxhc3RQcm9wID0gbGFzdFByb3BzICE9IG51bGwgPyBsYXN0UHJvcHNbcHJvcEtleV0gOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbmV4dFByb3AgPT09IGxhc3RQcm9wIHx8IG5leHRQcm9wID09IG51bGwgJiYgbGFzdFByb3AgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSQxKSB7XG4gICAgICB7XG4gICAgICAgIGlmIChuZXh0UHJvcCkge1xuICAgICAgICAgIC8vIEZyZWV6ZSB0aGUgbmV4dCBzdHlsZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gYXNzdW1lIGl0IHdvbid0IGJlXG4gICAgICAgICAgLy8gbXV0YXRlZC4gV2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBmb3IgdGhpcyBpbiB0aGUgcGFzdC5cbiAgICAgICAgICBPYmplY3QuZnJlZXplKG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxhc3RQcm9wKSB7XG4gICAgICAgIC8vIFVuc2V0IHN0eWxlcyBvbiBgbGFzdFByb3BgIGJ1dCBub3Qgb24gYG5leHRQcm9wYC5cbiAgICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbGFzdFByb3ApIHtcbiAgICAgICAgICBpZiAobGFzdFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSAmJiAoIW5leHRQcm9wIHx8ICFuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSkge1xuICAgICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgc3R5bGVzIHRoYXQgY2hhbmdlZCBzaW5jZSBgbGFzdFByb3BgLlxuICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBuZXh0UHJvcCkge1xuICAgICAgICAgIGlmIChuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmIGxhc3RQcm9wW3N0eWxlTmFtZV0gIT09IG5leHRQcm9wW3N0eWxlTmFtZV0pIHtcbiAgICAgICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSBuZXh0UHJvcFtzdHlsZU5hbWVdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVsaWVzIG9uIGB1cGRhdGVTdHlsZXNCeUlEYCBub3QgbXV0YXRpbmcgYHN0eWxlVXBkYXRlc2AuXG4gICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgaWYgKCF1cGRhdGVQYXlsb2FkKSB7XG4gICAgICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQucHVzaChwcm9wS2V5LCBzdHlsZVVwZGF0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHN0eWxlVXBkYXRlcyA9IG5leHRQcm9wO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTF0gOiB1bmRlZmluZWQ7XG4gICAgICB2YXIgbGFzdEh0bWwgPSBsYXN0UHJvcCA/IGxhc3RQcm9wW0hUTUxdIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKG5leHRIdG1sICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGxhc3RIdG1sICE9PSBuZXh0SHRtbCkge1xuICAgICAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCAnJyArIG5leHRIdG1sKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogSXQgbWlnaHQgYmUgdG9vIGxhdGUgdG8gY2xlYXIgdGhpcyBpZiB3ZSBoYXZlIGNoaWxkcmVuXG4gICAgICAgIC8vIGluc2VydGVkIGFscmVhZHkuXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgaWYgKGxhc3RQcm9wICE9PSBuZXh0UHJvcCAmJiAodHlwZW9mIG5leHRQcm9wID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV4dFByb3AgPT09ICdudW1iZXInKSkge1xuICAgICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgJycgKyBuZXh0UHJvcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMSkge1xuICAgICAgLy8gTm9vcFxuICAgIH0gZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIC8vIFdlIGVhZ2VybHkgbGlzdGVuIHRvIHRoaXMgZXZlbiB0aG91Z2ggd2UgaGF2ZW4ndCBjb21taXR0ZWQgeWV0LlxuICAgICAgICBpZiAodHJ1ZSAmJiB0eXBlb2YgbmV4dFByb3AgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIocHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICAgIGVuc3VyZUxpc3RlbmluZ1RvKHJvb3RDb250YWluZXJFbGVtZW50LCBwcm9wS2V5KTtcbiAgICAgIH1cbiAgICAgIGlmICghdXBkYXRlUGF5bG9hZCAmJiBsYXN0UHJvcCAhPT0gbmV4dFByb3ApIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZS4gSWYgYW55IGxpc3RlbmVyIHVwZGF0ZXMgd2UgbmVlZCB0byBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCB0aGUgXCJjdXJyZW50XCIgcHJvcHMgcG9pbnRlciBnZXRzIHVwZGF0ZWQgc28gd2UgbmVlZCBhIGNvbW1pdFxuICAgICAgICAvLyB0byB1cGRhdGUgdGhpcyBlbGVtZW50LlxuICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBhbnkgb3RoZXIgcHJvcGVydHkgd2UgYWx3YXlzIGFkZCBpdCB0byB0aGUgcXVldWUgYW5kIHRoZW4gd2VcbiAgICAgIC8vIGZpbHRlciBpdCBvdXQgdXNpbmcgdGhlIHdoaXRlbGlzdCBkdXJpbmcgdGhlIGNvbW1pdC5cbiAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgfVxuICB9XG4gIGlmIChzdHlsZVVwZGF0ZXMpIHtcbiAgICB7XG4gICAgICB2YWxpZGF0ZVNob3J0aGFuZFByb3BlcnR5Q29sbGlzaW9uSW5EZXYoc3R5bGVVcGRhdGVzLCBuZXh0UHJvcHNbU1RZTEUkMV0pO1xuICAgIH1cbiAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2goU1RZTEUkMSwgc3R5bGVVcGRhdGVzKTtcbiAgfVxuICByZXR1cm4gdXBkYXRlUGF5bG9hZDtcbn1cblxuLy8gQXBwbHkgdGhlIGRpZmYuXG5mdW5jdGlvbiB1cGRhdGVQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHRhZywgbGFzdFJhd1Byb3BzLCBuZXh0UmF3UHJvcHMpIHtcbiAgLy8gVXBkYXRlIGNoZWNrZWQgKmJlZm9yZSogbmFtZS5cbiAgLy8gSW4gdGhlIG1pZGRsZSBvZiBhbiB1cGRhdGUsIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgY2hlY2tlZC5cbiAgLy8gV2hlbiBhIGNoZWNrZWQgcmFkaW8gdHJpZXMgdG8gY2hhbmdlIG5hbWUsIGJyb3dzZXIgbWFrZXMgYW5vdGhlciByYWRpbydzIGNoZWNrZWQgZmFsc2UuXG4gIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgbmV4dFJhd1Byb3BzLnR5cGUgPT09ICdyYWRpbycgJiYgbmV4dFJhd1Byb3BzLm5hbWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZUNoZWNrZWQoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgfVxuXG4gIHZhciB3YXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIGxhc3RSYXdQcm9wcyk7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgbmV4dFJhd1Byb3BzKTtcbiAgLy8gQXBwbHkgdGhlIGRpZmYuXG4gIHVwZGF0ZURPTVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgd2FzQ3VzdG9tQ29tcG9uZW50VGFnLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7XG5cbiAgLy8gVE9ETzogRW5zdXJlIHRoYXQgYW4gdXBkYXRlIGdldHMgc2NoZWR1bGVkIGlmIGFueSBvZiB0aGUgc3BlY2lhbCBwcm9wc1xuICAvLyBjaGFuZ2VkLlxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFVwZGF0ZSB0aGUgd3JhcHBlciBhcm91bmQgaW5wdXRzICphZnRlciogdXBkYXRpbmcgcHJvcHMuIFRoaXMgaGFzIHRvXG4gICAgICAvLyBoYXBwZW4gYWZ0ZXIgYHVwZGF0ZURPTVByb3BlcnRpZXNgLiBPdGhlcndpc2UgSFRNTDUgaW5wdXQgdmFsaWRhdGlvbnNcbiAgICAgIC8vIHJhaXNlIHdhcm5pbmdzIGFuZCBwcmV2ZW50IHRoZSBuZXcgdmFsdWUgZnJvbSBiZWluZyBhc3NpZ25lZC5cbiAgICAgIHVwZGF0ZVdyYXBwZXIoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIHVwZGF0ZVdyYXBwZXIkMShkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIC8vIDxzZWxlY3Q+IHZhbHVlIHVwZGF0ZSBuZWVkcyB0byBvY2N1ciBhZnRlciA8b3B0aW9uPiBjaGlsZHJlblxuICAgICAgLy8gcmVjb25jaWxpYXRpb25cbiAgICAgIHBvc3RVcGRhdGVXcmFwcGVyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZShwcm9wTmFtZSkge1xuICB7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gcHJvcE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIXBvc3NpYmxlU3RhbmRhcmROYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gcG9zc2libGVTdGFuZGFyZE5hbWVzW2xvd2VyQ2FzZWROYW1lXSB8fCBudWxsO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgcmF3UHJvcHMsIHBhcmVudE5hbWVzcGFjZSwgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gdm9pZCAwO1xuICB2YXIgZXh0cmFBdHRyaWJ1dGVOYW1lcyA9IHZvaWQgMDtcblxuICB7XG4gICAgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nID0gcmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMV0gPT09IHRydWU7XG4gICAgaXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIHJhd1Byb3BzKTtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50KHRhZywgcmF3UHJvcHMpO1xuICAgIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZyAmJiAhZGlkV2FyblNoYWR5RE9NICYmIGRvbUVsZW1lbnQuc2hhZHlSb290KSB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICclcyBpcyB1c2luZyBzaGFkeSBET00uIFVzaW5nIHNoYWR5IERPTSB3aXRoIFJlYWN0IGNhbiAnICsgJ2NhdXNlIHRoaW5ncyB0byBicmVhayBzdWJ0bHkuJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnKTtcbiAgICAgIGRpZFdhcm5TaGFkeURPTSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETzogTWFrZSBzdXJlIHRoYXQgd2UgY2hlY2sgaXNNb3VudGVkIGJlZm9yZSBmaXJpbmcgYW55IG9mIHRoZXNlIGV2ZW50cy5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICB0cmFwQnViYmxlZEV2ZW50KFRPUF9MT0FELCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICBjYXNlICdhdWRpbyc6XG4gICAgICAvLyBDcmVhdGUgbGlzdGVuZXIgZm9yIGVhY2ggbWVkaWEgZXZlbnRcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVkaWFFdmVudFR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRyYXBCdWJibGVkRXZlbnQobWVkaWFFdmVudFR5cGVzW2ldLCBkb21FbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NvdXJjZSc6XG4gICAgICB0cmFwQnViYmxlZEV2ZW50KFRPUF9FUlJPUiwgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdpbWcnOlxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIHRyYXBCdWJibGVkRXZlbnQoVE9QX0VSUk9SLCBkb21FbGVtZW50KTtcbiAgICAgIHRyYXBCdWJibGVkRXZlbnQoVE9QX0xPQUQsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZm9ybSc6XG4gICAgICB0cmFwQnViYmxlZEV2ZW50KFRPUF9SRVNFVCwgZG9tRWxlbWVudCk7XG4gICAgICB0cmFwQnViYmxlZEV2ZW50KFRPUF9TVUJNSVQsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICB0cmFwQnViYmxlZEV2ZW50KFRPUF9UT0dHTEUsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICB0cmFwQnViYmxlZEV2ZW50KFRPUF9JTlZBTElELCBkb21FbGVtZW50KTtcbiAgICAgIC8vIEZvciBjb250cm9sbGVkIGNvbXBvbmVudHMgd2UgYWx3YXlzIG5lZWQgdG8gZW5zdXJlIHdlJ3JlIGxpc3RlbmluZ1xuICAgICAgLy8gdG8gb25DaGFuZ2UuIEV2ZW4gaWYgdGhlcmUgaXMgbm8gbGlzdGVuZXIuXG4gICAgICBlbnN1cmVMaXN0ZW5pbmdUbyhyb290Q29udGFpbmVyRWxlbWVudCwgJ29uQ2hhbmdlJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgdmFsaWRhdGVQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHRyYXBCdWJibGVkRXZlbnQoVE9QX0lOVkFMSUQsIGRvbUVsZW1lbnQpO1xuICAgICAgLy8gRm9yIGNvbnRyb2xsZWQgY29tcG9uZW50cyB3ZSBhbHdheXMgbmVlZCB0byBlbnN1cmUgd2UncmUgbGlzdGVuaW5nXG4gICAgICAvLyB0byBvbkNoYW5nZS4gRXZlbiBpZiB0aGVyZSBpcyBubyBsaXN0ZW5lci5cbiAgICAgIGVuc3VyZUxpc3RlbmluZ1RvKHJvb3RDb250YWluZXJFbGVtZW50LCAnb25DaGFuZ2UnKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMihkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICB0cmFwQnViYmxlZEV2ZW50KFRPUF9JTlZBTElELCBkb21FbGVtZW50KTtcbiAgICAgIC8vIEZvciBjb250cm9sbGVkIGNvbXBvbmVudHMgd2UgYWx3YXlzIG5lZWQgdG8gZW5zdXJlIHdlJ3JlIGxpc3RlbmluZ1xuICAgICAgLy8gdG8gb25DaGFuZ2UuIEV2ZW4gaWYgdGhlcmUgaXMgbm8gbGlzdGVuZXIuXG4gICAgICBlbnN1cmVMaXN0ZW5pbmdUbyhyb290Q29udGFpbmVyRWxlbWVudCwgJ29uQ2hhbmdlJyk7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIGFzc2VydFZhbGlkUHJvcHModGFnLCByYXdQcm9wcyk7XG5cbiAge1xuICAgIGV4dHJhQXR0cmlidXRlTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgdmFyIGF0dHJpYnV0ZXMgPSBkb21FbGVtZW50LmF0dHJpYnV0ZXM7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IGF0dHJpYnV0ZXNbX2ldLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAvLyBCdWlsdC1pbiBTU1IgYXR0cmlidXRlIGlzIHdoaXRlbGlzdGVkXG4gICAgICAgIGNhc2UgJ2RhdGEtcmVhY3Ryb290JzpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gQ29udHJvbGxlZCBhdHRyaWJ1dGVzIGFyZSBub3QgdmFsaWRhdGVkXG4gICAgICAgIC8vIFRPRE86IE9ubHkgaWdub3JlIHRoZW0gb24gY29udHJvbGxlZCB0YWdzLlxuICAgICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2NoZWNrZWQnOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzZWxlY3RlZCc6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gSW50ZW50aW9uYWxseSB1c2UgdGhlIG9yaWdpbmFsIG5hbWUuXG4gICAgICAgICAgLy8gU2VlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTA2NzYuXG4gICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5hZGQoYXR0cmlidXRlc1tfaV0ubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBudWxsO1xuICBmb3IgKHZhciBwcm9wS2V5IGluIHJhd1Byb3BzKSB7XG4gICAgaWYgKCFyYXdQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBuZXh0UHJvcCA9IHJhd1Byb3BzW3Byb3BLZXldO1xuICAgIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgLy8gRm9yIHRleHQgY29udGVudCBjaGlsZHJlbiB3ZSBjb21wYXJlIGFnYWluc3QgdGV4dENvbnRlbnQuIFRoaXNcbiAgICAgIC8vIG1pZ2h0IG1hdGNoIGFkZGl0aW9uYWwgSFRNTCB0aGF0IGlzIGhpZGRlbiB3aGVuIHdlIHJlYWQgaXQgdXNpbmdcbiAgICAgIC8vIHRleHRDb250ZW50LiBFLmcuIFwiZm9vXCIgd2lsbCBtYXRjaCBcImY8c3Bhbj5vbzwvc3Bhbj5cIiBidXQgdGhhdCBzdGlsbFxuICAgICAgLy8gc2F0aXNmaWVzIG91ciByZXF1aXJlbWVudC4gT3VyIHJlcXVpcmVtZW50IGlzIG5vdCB0byBwcm9kdWNlIHBlcmZlY3RcbiAgICAgIC8vIEhUTUwgYW5kIGF0dHJpYnV0ZXMuIElkZWFsbHkgd2Ugc2hvdWxkIHByZXNlcnZlIHN0cnVjdHVyZSBidXQgaXQnc1xuICAgICAgLy8gb2sgbm90IHRvIGlmIHRoZSB2aXNpYmxlIGNvbnRlbnQgaXMgc3RpbGwgZW5vdWdoIHRvIGluZGljYXRlIHdoYXRcbiAgICAgIC8vIGV2ZW4gbGlzdGVuZXJzIHRoZXNlIG5vZGVzIG1pZ2h0IGJlIHdpcmVkIHVwIHRvLlxuICAgICAgLy8gVE9ETzogV2FybiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gYSBzaW5nbGUgdGV4dE5vZGUgYXMgYSBjaGlsZC5cbiAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSB1c2UgZG9tRWxlbWVudC5maXJzdENoaWxkLm5vZGVWYWx1ZSB0byBjb21wYXJlP1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQudGV4dENvbnRlbnQgIT09IG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKHRydWUgJiYgIXN1cHByZXNzSHlkcmF0aW9uV2FybmluZykge1xuICAgICAgICAgICAgd2FybkZvclRleHREaWZmZXJlbmNlKGRvbUVsZW1lbnQudGV4dENvbnRlbnQsIG5leHRQcm9wKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtDSElMRFJFTiwgbmV4dFByb3BdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQudGV4dENvbnRlbnQgIT09ICcnICsgbmV4dFByb3ApIHtcbiAgICAgICAgICBpZiAodHJ1ZSAmJiAhc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nKSB7XG4gICAgICAgICAgICB3YXJuRm9yVGV4dERpZmZlcmVuY2UoZG9tRWxlbWVudC50ZXh0Q29udGVudCwgbmV4dFByb3ApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1cGRhdGVQYXlsb2FkID0gW0NISUxEUkVOLCAnJyArIG5leHRQcm9wXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIGlmICh0cnVlICYmIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgICAgZW5zdXJlTGlzdGVuaW5nVG8ocm9vdENvbnRhaW5lckVsZW1lbnQsIHByb3BLZXkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHJ1ZSAmJlxuICAgIC8vIENvbnZpbmNlIEZsb3cgd2UndmUgY2FsY3VsYXRlZCBpdCAoaXQncyBERVYtb25seSBpbiB0aGlzIG1ldGhvZC4pXG4gICAgdHlwZW9mIGlzQ3VzdG9tQ29tcG9uZW50VGFnID09PSAnYm9vbGVhbicpIHtcbiAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIHByb3BlcnRpZXMgY29ycmVzcG9uZCB0byB0aGVpciBleHBlY3RlZCB2YWx1ZXMuXG4gICAgICB2YXIgc2VydmVyVmFsdWUgPSB2b2lkIDA7XG4gICAgICB2YXIgcHJvcGVydHlJbmZvID0gZ2V0UHJvcGVydHlJbmZvKHByb3BLZXkpO1xuICAgICAgaWYgKHN1cHByZXNzSHlkcmF0aW9uV2FybmluZykge1xuICAgICAgICAvLyBEb24ndCBib3RoZXIgY29tcGFyaW5nLiBXZSdyZSBpZ25vcmluZyBhbGwgdGhlc2Ugd2FybmluZ3MuXG4gICAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxIHx8XG4gICAgICAvLyBDb250cm9sbGVkIGF0dHJpYnV0ZXMgYXJlIG5vdCB2YWxpZGF0ZWRcbiAgICAgIC8vIFRPRE86IE9ubHkgaWdub3JlIHRoZW0gb24gY29udHJvbGxlZCB0YWdzLlxuICAgICAgcHJvcEtleSA9PT0gJ3ZhbHVlJyB8fCBwcm9wS2V5ID09PSAnY2hlY2tlZCcgfHwgcHJvcEtleSA9PT0gJ3NlbGVjdGVkJykge1xuICAgICAgICAvLyBOb29wXG4gICAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICAgIHZhciBzZXJ2ZXJIVE1MID0gZG9tRWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTF0gOiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBleHBlY3RlZEhUTUwgPSBub3JtYWxpemVIVE1MKGRvbUVsZW1lbnQsIG5leHRIdG1sICE9IG51bGwgPyBuZXh0SHRtbCA6ICcnKTtcbiAgICAgICAgaWYgKGV4cGVjdGVkSFRNTCAhPT0gc2VydmVySFRNTCkge1xuICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJIVE1MLCBleHBlY3RlZEhUTUwpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IFNUWUxFJDEpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5KTtcblxuICAgICAgICBpZiAoY2FuRGlmZlN0eWxlRm9ySHlkcmF0aW9uV2FybmluZykge1xuICAgICAgICAgIHZhciBleHBlY3RlZFN0eWxlID0gY3JlYXRlRGFuZ2Vyb3VzU3RyaW5nRm9yU3R5bGVzKG5leHRQcm9wKTtcbiAgICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGRvbUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgICAgIGlmIChleHBlY3RlZFN0eWxlICE9PSBzZXJ2ZXJWYWx1ZSkge1xuICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlclZhbHVlLCBleHBlY3RlZFN0eWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGdldFZhbHVlRm9yQXR0cmlidXRlKGRvbUVsZW1lbnQsIHByb3BLZXksIG5leHRQcm9wKTtcblxuICAgICAgICBpZiAobmV4dFByb3AgIT09IHNlcnZlclZhbHVlKSB7XG4gICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlclZhbHVlLCBuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXNob3VsZElnbm9yZUF0dHJpYnV0ZShwcm9wS2V5LCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSAmJiAhc2hvdWxkUmVtb3ZlQXR0cmlidXRlKHByb3BLZXksIG5leHRQcm9wLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgICAgICB2YXIgaXNNaXNtYXRjaER1ZVRvQmFkQ2FzaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgIHNlcnZlclZhbHVlID0gZ2V0VmFsdWVGb3JQcm9wZXJ0eShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCwgcHJvcGVydHlJbmZvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgb3duTmFtZXNwYWNlID0gcGFyZW50TmFtZXNwYWNlO1xuICAgICAgICAgIGlmIChvd25OYW1lc3BhY2UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgICBvd25OYW1lc3BhY2UgPSBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodGFnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG93bk5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZShwcm9wS2V5KTtcbiAgICAgICAgICAgIGlmIChzdGFuZGFyZE5hbWUgIT09IG51bGwgJiYgc3RhbmRhcmROYW1lICE9PSBwcm9wS2V5KSB7XG4gICAgICAgICAgICAgIC8vIElmIGFuIFNWRyBwcm9wIGlzIHN1cHBsaWVkIHdpdGggYmFkIGNhc2luZywgaXQgd2lsbFxuICAgICAgICAgICAgICAvLyBiZSBzdWNjZXNzZnVsbHkgcGFyc2VkIGZyb20gSFRNTCwgYnV0IHdpbGwgcHJvZHVjZSBhIG1pc21hdGNoXG4gICAgICAgICAgICAgIC8vIChhbmQgd291bGQgYmUgaW5jb3JyZWN0bHkgcmVuZGVyZWQgb24gdGhlIGNsaWVudCkuXG4gICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHdlIGFscmVhZHkgd2FybiBhYm91dCBiYWQgY2FzaW5nIGVsc2V3aGVyZS5cbiAgICAgICAgICAgICAgLy8gU28gd2UnbGwgc2tpcCB0aGUgbWlzbGVhZGluZyBleHRyYSBtaXNtYXRjaCB3YXJuaW5nIGluIHRoaXMgY2FzZS5cbiAgICAgICAgICAgICAgaXNNaXNtYXRjaER1ZVRvQmFkQ2FzaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShzdGFuZGFyZE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlcnZlclZhbHVlID0gZ2V0VmFsdWVGb3JBdHRyaWJ1dGUoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRQcm9wICE9PSBzZXJ2ZXJWYWx1ZSAmJiAhaXNNaXNtYXRjaER1ZVRvQmFkQ2FzaW5nKSB7XG4gICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlclZhbHVlLCBuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB7XG4gICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgIGlmIChleHRyYUF0dHJpYnV0ZU5hbWVzLnNpemUgPiAwICYmICFzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcpIHtcbiAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXMoZXh0cmFBdHRyaWJ1dGVOYW1lcyk7XG4gICAgfVxuICB9XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyKGRvbUVsZW1lbnQsIHJhd1Byb3BzLCB0cnVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMyhkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAvLyBGb3IgaW5wdXQgYW5kIHRleHRhcmVhIHdlIGN1cnJlbnQgYWx3YXlzIHNldCB0aGUgdmFsdWUgcHJvcGVydHkgYXRcbiAgICAgIC8vIHBvc3QgbW91bnQgdG8gZm9yY2UgaXQgdG8gZGl2ZXJnZSBmcm9tIGF0dHJpYnV0ZXMuIEhvd2V2ZXIsIGZvclxuICAgICAgLy8gb3B0aW9uIGFuZCBzZWxlY3Qgd2UgZG9uJ3QgcXVpdGUgZG8gdGhlIHNhbWUgdGhpbmcgYW5kIHNlbGVjdFxuICAgICAgLy8gaXMgbm90IHJlc2lsaWVudCB0byB0aGUgRE9NIHN0YXRlIGNoYW5naW5nIHNvIHdlIGRvbid0IGRvIHRoYXQgaGVyZS5cbiAgICAgIC8vIFRPRE86IENvbnNpZGVyIG5vdCBkb2luZyB0aGlzIGZvciBpbnB1dCBhbmQgdGV4dGFyZWEuXG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKHR5cGVvZiByYXdQcm9wcy5vbkNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgY2FzdCBtYXkgbm90IGJlIHNvdW5kIGZvciBTVkcsIE1hdGhNTCBvciBjdXN0b20gZWxlbWVudHMuXG4gICAgICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KGRvbUVsZW1lbnQpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlUGF5bG9hZDtcbn1cblxuZnVuY3Rpb24gZGlmZkh5ZHJhdGVkVGV4dCh0ZXh0Tm9kZSwgdGV4dCkge1xuICB2YXIgaXNEaWZmZXJlbnQgPSB0ZXh0Tm9kZS5ub2RlVmFsdWUgIT09IHRleHQ7XG4gIHJldHVybiBpc0RpZmZlcmVudDtcbn1cblxuZnVuY3Rpb24gd2FybkZvclVubWF0Y2hlZFRleHQodGV4dE5vZGUsIHRleHQpIHtcbiAge1xuICAgIHdhcm5Gb3JUZXh0RGlmZmVyZW5jZSh0ZXh0Tm9kZS5ub2RlVmFsdWUsIHRleHQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50Tm9kZSwgY2hpbGQpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG4gICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnRGlkIG5vdCBleHBlY3Qgc2VydmVyIEhUTUwgdG8gY29udGFpbiBhIDwlcz4gaW4gPCVzPi4nLCBjaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Tm9kZSwgY2hpbGQpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG4gICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnRGlkIG5vdCBleHBlY3Qgc2VydmVyIEhUTUwgdG8gY29udGFpbiB0aGUgdGV4dCBub2RlIFwiJXNcIiBpbiA8JXM+LicsIGNoaWxkLm5vZGVWYWx1ZSwgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50Tm9kZSwgdGFnLCBwcm9wcykge1xuICB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcbiAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdFeHBlY3RlZCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIGEgbWF0Y2hpbmcgPCVzPiBpbiA8JXM+LicsIHRhZywgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50Tm9kZSwgdGV4dCkge1xuICB7XG4gICAgaWYgKHRleHQgPT09ICcnKSB7XG4gICAgICAvLyBXZSBleHBlY3QgdG8gaW5zZXJ0IGVtcHR5IHRleHQgbm9kZXMgc2luY2UgdGhleSdyZSBub3QgcmVwcmVzZW50ZWQgaW5cbiAgICAgIC8vIHRoZSBIVE1MLlxuICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgc3BlY2lhbCBjYXNlIGlmIHdlIGNhbiBqdXN0IGF2b2lkIGluc2VydGluZyBlbXB0eVxuICAgICAgLy8gdGV4dCBub2Rlcy5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcbiAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdFeHBlY3RlZCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIGEgbWF0Y2hpbmcgdGV4dCBub2RlIGZvciBcIiVzXCIgaW4gPCVzPi4nLCB0ZXh0LCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMShkb21FbGVtZW50LCB0YWcsIHByb3BzKSB7XG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZShkb21FbGVtZW50LCBwcm9wcyk7XG4gICAgICByZXR1cm47XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQzKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQyKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcbiAgfVxufVxuXG4vLyBUT0RPOiBkaXJlY3QgaW1wb3J0cyBsaWtlIHNvbWUtcGFja2FnZS9zcmMvKiBhcmUgYmFkLiBGaXggbWUuXG52YXIgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKCkge307XG52YXIgdXBkYXRlZEFuY2VzdG9ySW5mbyA9IGZ1bmN0aW9uICgpIHt9O1xuXG57XG4gIC8vIFRoaXMgdmFsaWRhdGlvbiBjb2RlIHdhcyB3cml0dGVuIGJhc2VkIG9uIHRoZSBIVE1MNSBwYXJzaW5nIHNwZWM6XG4gIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLXNjb3BlXG4gIC8vXG4gIC8vIE5vdGU6IHRoaXMgZG9lcyBub3QgY2F0Y2ggYWxsIGludmFsaWQgbmVzdGluZywgbm9yIGRvZXMgaXQgdHJ5IHRvIChhcyBpdCdzXG4gIC8vIG5vdCBjbGVhciB3aGF0IHByYWN0aWNhbCBiZW5lZml0IGRvaW5nIHNvIHByb3ZpZGVzKTsgaW5zdGVhZCwgd2Ugd2FybiBvbmx5XG4gIC8vIGZvciBjYXNlcyB3aGVyZSB0aGUgcGFyc2VyIHdpbGwgZ2l2ZSBhIHBhcnNlIHRyZWUgZGlmZmVyaW5nIGZyb20gd2hhdCBSZWFjdFxuICAvLyBpbnRlbmRlZC4gRm9yIGV4YW1wbGUsIDxiPjxkaXY+PC9kaXY+PC9iPiBpcyBpbnZhbGlkIGJ1dCB3ZSBkb24ndCB3YXJuXG4gIC8vIGJlY2F1c2UgaXQgc3RpbGwgcGFyc2VzIGNvcnJlY3RseTsgd2UgZG8gd2FybiBmb3Igb3RoZXIgY2FzZXMgbGlrZSBuZXN0ZWRcbiAgLy8gPHA+IHRhZ3Mgd2hlcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Vjb25kIGVsZW1lbnQgaW1wbGljaXRseSBjbG9zZXMgdGhlXG4gIC8vIGZpcnN0LCBjYXVzaW5nIGEgY29uZnVzaW5nIG1lc3MuXG5cbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjc3BlY2lhbFxuICB2YXIgc3BlY2lhbFRhZ3MgPSBbJ2FkZHJlc3MnLCAnYXBwbGV0JywgJ2FyZWEnLCAnYXJ0aWNsZScsICdhc2lkZScsICdiYXNlJywgJ2Jhc2Vmb250JywgJ2Jnc291bmQnLCAnYmxvY2txdW90ZScsICdib2R5JywgJ2JyJywgJ2J1dHRvbicsICdjYXB0aW9uJywgJ2NlbnRlcicsICdjb2wnLCAnY29sZ3JvdXAnLCAnZGQnLCAnZGV0YWlscycsICdkaXInLCAnZGl2JywgJ2RsJywgJ2R0JywgJ2VtYmVkJywgJ2ZpZWxkc2V0JywgJ2ZpZ2NhcHRpb24nLCAnZmlndXJlJywgJ2Zvb3RlcicsICdmb3JtJywgJ2ZyYW1lJywgJ2ZyYW1lc2V0JywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2JywgJ2hlYWQnLCAnaGVhZGVyJywgJ2hncm91cCcsICdocicsICdodG1sJywgJ2lmcmFtZScsICdpbWcnLCAnaW5wdXQnLCAnaXNpbmRleCcsICdsaScsICdsaW5rJywgJ2xpc3RpbmcnLCAnbWFpbicsICdtYXJxdWVlJywgJ21lbnUnLCAnbWVudWl0ZW0nLCAnbWV0YScsICduYXYnLCAnbm9lbWJlZCcsICdub2ZyYW1lcycsICdub3NjcmlwdCcsICdvYmplY3QnLCAnb2wnLCAncCcsICdwYXJhbScsICdwbGFpbnRleHQnLCAncHJlJywgJ3NjcmlwdCcsICdzZWN0aW9uJywgJ3NlbGVjdCcsICdzb3VyY2UnLCAnc3R5bGUnLCAnc3VtbWFyeScsICd0YWJsZScsICd0Ym9keScsICd0ZCcsICd0ZW1wbGF0ZScsICd0ZXh0YXJlYScsICd0Zm9vdCcsICd0aCcsICd0aGVhZCcsICd0aXRsZScsICd0cicsICd0cmFjaycsICd1bCcsICd3YnInLCAneG1wJ107XG5cbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tc2NvcGVcbiAgdmFyIGluU2NvcGVUYWdzID0gWydhcHBsZXQnLCAnY2FwdGlvbicsICdodG1sJywgJ3RhYmxlJywgJ3RkJywgJ3RoJywgJ21hcnF1ZWUnLCAnb2JqZWN0JywgJ3RlbXBsYXRlJyxcblxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNodG1sLWludGVncmF0aW9uLXBvaW50XG4gIC8vIFRPRE86IERpc3Rpbmd1aXNoIGJ5IG5hbWVzcGFjZSBoZXJlIC0tIGZvciA8dGl0bGU+LCBpbmNsdWRpbmcgaXQgaGVyZVxuICAvLyBlcnJzIG9uIHRoZSBzaWRlIG9mIGZld2VyIHdhcm5pbmdzXG4gICdmb3JlaWduT2JqZWN0JywgJ2Rlc2MnLCAndGl0bGUnXTtcblxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMtYW4tZWxlbWVudC1pbi1idXR0b24tc2NvcGVcbiAgdmFyIGJ1dHRvblNjb3BlVGFncyA9IGluU2NvcGVUYWdzLmNvbmNhdChbJ2J1dHRvbiddKTtcblxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNnZW5lcmF0ZS1pbXBsaWVkLWVuZC10YWdzXG4gIHZhciBpbXBsaWVkRW5kVGFncyA9IFsnZGQnLCAnZHQnLCAnbGknLCAnb3B0aW9uJywgJ29wdGdyb3VwJywgJ3AnLCAncnAnLCAncnQnXTtcblxuICB2YXIgZW1wdHlBbmNlc3RvckluZm8gPSB7XG4gICAgY3VycmVudDogbnVsbCxcblxuICAgIGZvcm1UYWc6IG51bGwsXG4gICAgYVRhZ0luU2NvcGU6IG51bGwsXG4gICAgYnV0dG9uVGFnSW5TY29wZTogbnVsbCxcbiAgICBub2JyVGFnSW5TY29wZTogbnVsbCxcbiAgICBwVGFnSW5CdXR0b25TY29wZTogbnVsbCxcblxuICAgIGxpc3RJdGVtVGFnQXV0b2Nsb3Npbmc6IG51bGwsXG4gICAgZGxJdGVtVGFnQXV0b2Nsb3Npbmc6IG51bGxcbiAgfTtcblxuICB1cGRhdGVkQW5jZXN0b3JJbmZvID0gZnVuY3Rpb24gKG9sZEluZm8sIHRhZykge1xuICAgIHZhciBhbmNlc3RvckluZm8gPSBfYXNzaWduKHt9LCBvbGRJbmZvIHx8IGVtcHR5QW5jZXN0b3JJbmZvKTtcbiAgICB2YXIgaW5mbyA9IHsgdGFnOiB0YWcgfTtcblxuICAgIGlmIChpblNjb3BlVGFncy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGJ1dHRvblNjb3BlVGFncy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGUgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIFNlZSBydWxlcyBmb3IgJ2xpJywgJ2RkJywgJ2R0JyBzdGFydCB0YWdzIGluXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluYm9keVxuICAgIGlmIChzcGVjaWFsVGFncy5pbmRleE9mKHRhZykgIT09IC0xICYmIHRhZyAhPT0gJ2FkZHJlc3MnICYmIHRhZyAhPT0gJ2RpdicgJiYgdGFnICE9PSAncCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nID0gbnVsbDtcbiAgICAgIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZyA9IG51bGw7XG4gICAgfVxuXG4gICAgYW5jZXN0b3JJbmZvLmN1cnJlbnQgPSBpbmZvO1xuXG4gICAgaWYgKHRhZyA9PT0gJ2Zvcm0nKSB7XG4gICAgICBhbmNlc3RvckluZm8uZm9ybVRhZyA9IGluZm87XG4gICAgfVxuICAgIGlmICh0YWcgPT09ICdhJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG4gICAgaWYgKHRhZyA9PT0gJ2J1dHRvbicpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG4gICAgaWYgKHRhZyA9PT0gJ25vYnInKSB7XG4gICAgICBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGUgPSBpbmZvO1xuICAgIH1cbiAgICBpZiAodGFnID09PSAncCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZSA9IGluZm87XG4gICAgfVxuICAgIGlmICh0YWcgPT09ICdsaScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICB9XG4gICAgaWYgKHRhZyA9PT0gJ2RkJyB8fCB0YWcgPT09ICdkdCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZyA9IGluZm87XG4gICAgfVxuXG4gICAgcmV0dXJuIGFuY2VzdG9ySW5mbztcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyXG4gICAqL1xuICB2YXIgaXNUYWdWYWxpZFdpdGhQYXJlbnQgPSBmdW5jdGlvbiAodGFnLCBwYXJlbnRUYWcpIHtcbiAgICAvLyBGaXJzdCwgbGV0J3MgY2hlY2sgaWYgd2UncmUgaW4gYW4gdW51c3VhbCBwYXJzaW5nIG1vZGUuLi5cbiAgICBzd2l0Y2ggKHBhcmVudFRhZykge1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluc2VsZWN0XG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnb3B0aW9uJyB8fCB0YWcgPT09ICdvcHRncm91cCcgfHwgdGFnID09PSAnI3RleHQnO1xuICAgICAgY2FzZSAnb3B0Z3JvdXAnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnb3B0aW9uJyB8fCB0YWcgPT09ICcjdGV4dCc7XG4gICAgICAvLyBTdHJpY3RseSBzcGVha2luZywgc2VlaW5nIGFuIDxvcHRpb24+IGRvZXNuJ3QgbWVhbiB3ZSdyZSBpbiBhIDxzZWxlY3Q+XG4gICAgICAvLyBidXRcbiAgICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICcjdGV4dCc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50ZFxuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluY2FwdGlvblxuICAgICAgLy8gTm8gc3BlY2lhbCBiZWhhdmlvciBzaW5jZSB0aGVzZSBydWxlcyBmYWxsIGJhY2sgdG8gXCJpbiBib2R5XCIgbW9kZSBmb3JcbiAgICAgIC8vIGFsbCBleGNlcHQgc3BlY2lhbCB0YWJsZSBub2RlcyB3aGljaCBjYXVzZSBiYWQgcGFyc2luZyBiZWhhdmlvciBhbnl3YXkuXG5cbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRyXG4gICAgICBjYXNlICd0cic6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICd0aCcgfHwgdGFnID09PSAndGQnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRib2R5XG4gICAgICBjYXNlICd0Ym9keSc6XG4gICAgICBjYXNlICd0aGVhZCc6XG4gICAgICBjYXNlICd0Zm9vdCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICd0cicgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluY29sZ3JvdXBcbiAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2NvbCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGFibGVcbiAgICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2NhcHRpb24nIHx8IHRhZyA9PT0gJ2NvbGdyb3VwJyB8fCB0YWcgPT09ICd0Ym9keScgfHwgdGFnID09PSAndGZvb3QnIHx8IHRhZyA9PT0gJ3RoZWFkJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5oZWFkXG4gICAgICBjYXNlICdoZWFkJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2Jhc2UnIHx8IHRhZyA9PT0gJ2Jhc2Vmb250JyB8fCB0YWcgPT09ICdiZ3NvdW5kJyB8fCB0YWcgPT09ICdsaW5rJyB8fCB0YWcgPT09ICdtZXRhJyB8fCB0YWcgPT09ICd0aXRsZScgfHwgdGFnID09PSAnbm9zY3JpcHQnIHx8IHRhZyA9PT0gJ25vZnJhbWVzJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zZW1hbnRpY3MuaHRtbCN0aGUtaHRtbC1lbGVtZW50XG4gICAgICBjYXNlICdodG1sJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2hlYWQnIHx8IHRhZyA9PT0gJ2JvZHknO1xuICAgICAgY2FzZSAnI2RvY3VtZW50JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2h0bWwnO1xuICAgIH1cblxuICAgIC8vIFByb2JhYmx5IGluIHRoZSBcImluIGJvZHlcIiBwYXJzaW5nIG1vZGUsIHNvIHdlIG91dGxhdyBvbmx5IHRhZyBjb21ib3NcbiAgICAvLyB3aGVyZSB0aGUgcGFyc2luZyBydWxlcyBjYXVzZSBpbXBsaWNpdCBvcGVucyBvciBjbG9zZXMgdG8gYmUgYWRkZWQuXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluYm9keVxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdoMSc6XG4gICAgICBjYXNlICdoMic6XG4gICAgICBjYXNlICdoMyc6XG4gICAgICBjYXNlICdoNCc6XG4gICAgICBjYXNlICdoNSc6XG4gICAgICBjYXNlICdoNic6XG4gICAgICAgIHJldHVybiBwYXJlbnRUYWcgIT09ICdoMScgJiYgcGFyZW50VGFnICE9PSAnaDInICYmIHBhcmVudFRhZyAhPT0gJ2gzJyAmJiBwYXJlbnRUYWcgIT09ICdoNCcgJiYgcGFyZW50VGFnICE9PSAnaDUnICYmIHBhcmVudFRhZyAhPT0gJ2g2JztcblxuICAgICAgY2FzZSAncnAnOlxuICAgICAgY2FzZSAncnQnOlxuICAgICAgICByZXR1cm4gaW1wbGllZEVuZFRhZ3MuaW5kZXhPZihwYXJlbnRUYWcpID09PSAtMTtcblxuICAgICAgY2FzZSAnYm9keSc6XG4gICAgICBjYXNlICdjYXB0aW9uJzpcbiAgICAgIGNhc2UgJ2NvbCc6XG4gICAgICBjYXNlICdjb2xncm91cCc6XG4gICAgICBjYXNlICdmcmFtZSc6XG4gICAgICBjYXNlICdoZWFkJzpcbiAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgY2FzZSAndGJvZHknOlxuICAgICAgY2FzZSAndGQnOlxuICAgICAgY2FzZSAndGZvb3QnOlxuICAgICAgY2FzZSAndGgnOlxuICAgICAgY2FzZSAndGhlYWQnOlxuICAgICAgY2FzZSAndHInOlxuICAgICAgICAvLyBUaGVzZSB0YWdzIGFyZSBvbmx5IHZhbGlkIHdpdGggYSBmZXcgcGFyZW50cyB0aGF0IGhhdmUgc3BlY2lhbCBjaGlsZFxuICAgICAgICAvLyBwYXJzaW5nIHJ1bGVzIC0tIGlmIHdlJ3JlIGRvd24gaGVyZSwgdGhlbiBub25lIG9mIHRob3NlIG1hdGNoZWQgYW5kXG4gICAgICAgIC8vIHNvIHdlIGFsbG93IGl0IG9ubHkgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBwYXJlbnQgaXMsIGFzIGFsbCBvdGhlclxuICAgICAgICAvLyBjYXNlcyBhcmUgaW52YWxpZC5cbiAgICAgICAgcmV0dXJuIHBhcmVudFRhZyA9PSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXJcbiAgICovXG4gIHZhciBmaW5kSW52YWxpZEFuY2VzdG9yRm9yVGFnID0gZnVuY3Rpb24gKHRhZywgYW5jZXN0b3JJbmZvKSB7XG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ2FkZHJlc3MnOlxuICAgICAgY2FzZSAnYXJ0aWNsZSc6XG4gICAgICBjYXNlICdhc2lkZSc6XG4gICAgICBjYXNlICdibG9ja3F1b3RlJzpcbiAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICBjYXNlICdkZXRhaWxzJzpcbiAgICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICBjYXNlICdkaXInOlxuICAgICAgY2FzZSAnZGl2JzpcbiAgICAgIGNhc2UgJ2RsJzpcbiAgICAgIGNhc2UgJ2ZpZWxkc2V0JzpcbiAgICAgIGNhc2UgJ2ZpZ2NhcHRpb24nOlxuICAgICAgY2FzZSAnZmlndXJlJzpcbiAgICAgIGNhc2UgJ2Zvb3Rlcic6XG4gICAgICBjYXNlICdoZWFkZXInOlxuICAgICAgY2FzZSAnaGdyb3VwJzpcbiAgICAgIGNhc2UgJ21haW4nOlxuICAgICAgY2FzZSAnbWVudSc6XG4gICAgICBjYXNlICduYXYnOlxuICAgICAgY2FzZSAnb2wnOlxuICAgICAgY2FzZSAncCc6XG4gICAgICBjYXNlICdzZWN0aW9uJzpcbiAgICAgIGNhc2UgJ3N1bW1hcnknOlxuICAgICAgY2FzZSAndWwnOlxuICAgICAgY2FzZSAncHJlJzpcbiAgICAgIGNhc2UgJ2xpc3RpbmcnOlxuICAgICAgY2FzZSAndGFibGUnOlxuICAgICAgY2FzZSAnaHInOlxuICAgICAgY2FzZSAneG1wJzpcbiAgICAgIGNhc2UgJ2gxJzpcbiAgICAgIGNhc2UgJ2gyJzpcbiAgICAgIGNhc2UgJ2gzJzpcbiAgICAgIGNhc2UgJ2g0JzpcbiAgICAgIGNhc2UgJ2g1JzpcbiAgICAgIGNhc2UgJ2g2JzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZTtcblxuICAgICAgY2FzZSAnZm9ybSc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uZm9ybVRhZyB8fCBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2xpJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nO1xuXG4gICAgICBjYXNlICdkZCc6XG4gICAgICBjYXNlICdkdCc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3Npbmc7XG5cbiAgICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZTtcblxuICAgICAgY2FzZSAnYSc6XG4gICAgICAgIC8vIFNwZWMgc2F5cyBzb21ldGhpbmcgYWJvdXQgc3RvcmluZyBhIGxpc3Qgb2YgbWFya2VycywgYnV0IGl0IHNvdW5kc1xuICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoaXMgY2hlY2suXG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGU7XG5cbiAgICAgIGNhc2UgJ25vYnInOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIHZhciBkaWRXYXJuID0ge307XG5cbiAgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKGNoaWxkVGFnLCBjaGlsZFRleHQsIGFuY2VzdG9ySW5mbykge1xuICAgIGFuY2VzdG9ySW5mbyA9IGFuY2VzdG9ySW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbztcbiAgICB2YXIgcGFyZW50SW5mbyA9IGFuY2VzdG9ySW5mby5jdXJyZW50O1xuICAgIHZhciBwYXJlbnRUYWcgPSBwYXJlbnRJbmZvICYmIHBhcmVudEluZm8udGFnO1xuXG4gICAgaWYgKGNoaWxkVGV4dCAhPSBudWxsKSB7XG4gICAgICAhKGNoaWxkVGFnID09IG51bGwpID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAndmFsaWRhdGVET01OZXN0aW5nOiB3aGVuIGNoaWxkVGV4dCBpcyBwYXNzZWQsIGNoaWxkVGFnIHNob3VsZCBiZSBudWxsJykgOiB2b2lkIDA7XG4gICAgICBjaGlsZFRhZyA9ICcjdGV4dCc7XG4gICAgfVxuXG4gICAgdmFyIGludmFsaWRQYXJlbnQgPSBpc1RhZ1ZhbGlkV2l0aFBhcmVudChjaGlsZFRhZywgcGFyZW50VGFnKSA/IG51bGwgOiBwYXJlbnRJbmZvO1xuICAgIHZhciBpbnZhbGlkQW5jZXN0b3IgPSBpbnZhbGlkUGFyZW50ID8gbnVsbCA6IGZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcoY2hpbGRUYWcsIGFuY2VzdG9ySW5mbyk7XG4gICAgdmFyIGludmFsaWRQYXJlbnRPckFuY2VzdG9yID0gaW52YWxpZFBhcmVudCB8fCBpbnZhbGlkQW5jZXN0b3I7XG4gICAgaWYgKCFpbnZhbGlkUGFyZW50T3JBbmNlc3Rvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBhbmNlc3RvclRhZyA9IGludmFsaWRQYXJlbnRPckFuY2VzdG9yLnRhZztcbiAgICB2YXIgYWRkZW5kdW0gPSBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2KCk7XG5cbiAgICB2YXIgd2FybktleSA9ICEhaW52YWxpZFBhcmVudCArICd8JyArIGNoaWxkVGFnICsgJ3wnICsgYW5jZXN0b3JUYWcgKyAnfCcgKyBhZGRlbmR1bTtcbiAgICBpZiAoZGlkV2Fyblt3YXJuS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkaWRXYXJuW3dhcm5LZXldID0gdHJ1ZTtcblxuICAgIHZhciB0YWdEaXNwbGF5TmFtZSA9IGNoaWxkVGFnO1xuICAgIHZhciB3aGl0ZXNwYWNlSW5mbyA9ICcnO1xuICAgIGlmIChjaGlsZFRhZyA9PT0gJyN0ZXh0Jykge1xuICAgICAgaWYgKC9cXFMvLnRlc3QoY2hpbGRUZXh0KSkge1xuICAgICAgICB0YWdEaXNwbGF5TmFtZSA9ICdUZXh0IG5vZGVzJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhZ0Rpc3BsYXlOYW1lID0gJ1doaXRlc3BhY2UgdGV4dCBub2Rlcyc7XG4gICAgICAgIHdoaXRlc3BhY2VJbmZvID0gXCIgTWFrZSBzdXJlIHlvdSBkb24ndCBoYXZlIGFueSBleHRyYSB3aGl0ZXNwYWNlIGJldHdlZW4gdGFncyBvbiBcIiArICdlYWNoIGxpbmUgb2YgeW91ciBzb3VyY2UgY29kZS4nO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0YWdEaXNwbGF5TmFtZSA9ICc8JyArIGNoaWxkVGFnICsgJz4nO1xuICAgIH1cblxuICAgIGlmIChpbnZhbGlkUGFyZW50KSB7XG4gICAgICB2YXIgaW5mbyA9ICcnO1xuICAgICAgaWYgKGFuY2VzdG9yVGFnID09PSAndGFibGUnICYmIGNoaWxkVGFnID09PSAndHInKSB7XG4gICAgICAgIGluZm8gKz0gJyBBZGQgYSA8dGJvZHk+IHRvIHlvdXIgY29kZSB0byBtYXRjaCB0aGUgRE9NIHRyZWUgZ2VuZXJhdGVkIGJ5ICcgKyAndGhlIGJyb3dzZXIuJztcbiAgICAgIH1cbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgY2hpbGQgb2YgPCVzPi4lcyVzJXMnLCB0YWdEaXNwbGF5TmFtZSwgYW5jZXN0b3JUYWcsIHdoaXRlc3BhY2VJbmZvLCBpbmZvLCBhZGRlbmR1bSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgZGVzY2VuZGFudCBvZiAnICsgJzwlcz4uJXMnLCB0YWdEaXNwbGF5TmFtZSwgYW5jZXN0b3JUYWcsIGFkZGVuZHVtKTtcbiAgICB9XG4gIH07XG59XG5cbi8vIFJlbmRlcmVycyB0aGF0IGRvbid0IHN1cHBvcnQgcGVyc2lzdGVuY2Vcbi8vIGNhbiByZS1leHBvcnQgZXZlcnl0aGluZyBmcm9tIHRoaXMgbW9kdWxlLlxuXG5mdW5jdGlvbiBzaGltKCkge1xuICBpbnZhcmlhbnQoZmFsc2UsICdUaGUgY3VycmVudCByZW5kZXJlciBkb2VzIG5vdCBzdXBwb3J0IHBlcnNpc3RlbmNlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG4vLyBQZXJzaXN0ZW5jZSAod2hlbiB1bnN1cHBvcnRlZClcbnZhciBzdXBwb3J0c1BlcnNpc3RlbmNlID0gZmFsc2U7XG52YXIgY2xvbmVJbnN0YW5jZSA9IHNoaW07XG52YXIgY3JlYXRlQ29udGFpbmVyQ2hpbGRTZXQgPSBzaGltO1xudmFyIGFwcGVuZENoaWxkVG9Db250YWluZXJDaGlsZFNldCA9IHNoaW07XG52YXIgZmluYWxpemVDb250YWluZXJDaGlsZHJlbiA9IHNoaW07XG52YXIgcmVwbGFjZUNvbnRhaW5lckNoaWxkcmVuID0gc2hpbTtcbnZhciBjbG9uZUhpZGRlbkluc3RhbmNlID0gc2hpbTtcbnZhciBjbG9uZVVuaGlkZGVuSW5zdGFuY2UgPSBzaGltO1xudmFyIGNyZWF0ZUhpZGRlblRleHRJbnN0YW5jZSA9IHNoaW07XG5cbnZhciBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyA9IHZvaWQgMDtcbntcbiAgU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcgPSAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJztcbn1cblxudmFyIFNVU1BFTlNFX1NUQVJUX0RBVEEgPSAnJCc7XG52YXIgU1VTUEVOU0VfRU5EX0RBVEEgPSAnLyQnO1xuXG52YXIgU1RZTEUgPSAnc3R5bGUnO1xuXG52YXIgZXZlbnRzRW5hYmxlZCA9IG51bGw7XG52YXIgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBudWxsO1xuXG5mdW5jdGlvbiBzaG91bGRBdXRvRm9jdXNIb3N0Q29tcG9uZW50KHR5cGUsIHByb3BzKSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgcmV0dXJuICEhcHJvcHMuYXV0b0ZvY3VzO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250ZXh0KHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICB2YXIgdHlwZSA9IHZvaWQgMDtcbiAgdmFyIG5hbWVzcGFjZSA9IHZvaWQgMDtcbiAgdmFyIG5vZGVUeXBlID0gcm9vdENvbnRhaW5lckluc3RhbmNlLm5vZGVUeXBlO1xuICBzd2l0Y2ggKG5vZGVUeXBlKSB7XG4gICAgY2FzZSBET0NVTUVOVF9OT0RFOlxuICAgIGNhc2UgRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpcbiAgICAgIHtcbiAgICAgICAgdHlwZSA9IG5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gJyNkb2N1bWVudCcgOiAnI2ZyYWdtZW50JztcbiAgICAgICAgdmFyIHJvb3QgPSByb290Q29udGFpbmVySW5zdGFuY2UuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICBuYW1lc3BhY2UgPSByb290ID8gcm9vdC5uYW1lc3BhY2VVUkkgOiBnZXRDaGlsZE5hbWVzcGFjZShudWxsLCAnJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHZhciBjb250YWluZXIgPSBub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gcm9vdENvbnRhaW5lckluc3RhbmNlLnBhcmVudE5vZGUgOiByb290Q29udGFpbmVySW5zdGFuY2U7XG4gICAgICAgIHZhciBvd25OYW1lc3BhY2UgPSBjb250YWluZXIubmFtZXNwYWNlVVJJIHx8IG51bGw7XG4gICAgICAgIHR5cGUgPSBjb250YWluZXIudGFnTmFtZTtcbiAgICAgICAgbmFtZXNwYWNlID0gZ2V0Q2hpbGROYW1lc3BhY2Uob3duTmFtZXNwYWNlLCB0eXBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbiAge1xuICAgIHZhciB2YWxpZGF0ZWRUYWcgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIF9hbmNlc3RvckluZm8gPSB1cGRhdGVkQW5jZXN0b3JJbmZvKG51bGwsIHZhbGlkYXRlZFRhZyk7XG4gICAgcmV0dXJuIHsgbmFtZXNwYWNlOiBuYW1lc3BhY2UsIGFuY2VzdG9ySW5mbzogX2FuY2VzdG9ySW5mbyB9O1xuICB9XG4gIHJldHVybiBuYW1lc3BhY2U7XG59XG5cbmZ1bmN0aW9uIGdldENoaWxkSG9zdENvbnRleHQocGFyZW50SG9zdENvbnRleHQsIHR5cGUsIHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICB7XG4gICAgdmFyIHBhcmVudEhvc3RDb250ZXh0RGV2ID0gcGFyZW50SG9zdENvbnRleHQ7XG4gICAgdmFyIF9uYW1lc3BhY2UgPSBnZXRDaGlsZE5hbWVzcGFjZShwYXJlbnRIb3N0Q29udGV4dERldi5uYW1lc3BhY2UsIHR5cGUpO1xuICAgIHZhciBfYW5jZXN0b3JJbmZvMiA9IHVwZGF0ZWRBbmNlc3RvckluZm8ocGFyZW50SG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICByZXR1cm4geyBuYW1lc3BhY2U6IF9uYW1lc3BhY2UsIGFuY2VzdG9ySW5mbzogX2FuY2VzdG9ySW5mbzIgfTtcbiAgfVxuICB2YXIgcGFyZW50TmFtZXNwYWNlID0gcGFyZW50SG9zdENvbnRleHQ7XG4gIHJldHVybiBnZXRDaGlsZE5hbWVzcGFjZShwYXJlbnROYW1lc3BhY2UsIHR5cGUpO1xufVxuXG5mdW5jdGlvbiBnZXRQdWJsaWNJbnN0YW5jZShpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVGb3JDb21taXQoY29udGFpbmVySW5mbykge1xuICBldmVudHNFbmFibGVkID0gaXNFbmFibGVkKCk7XG4gIHNlbGVjdGlvbkluZm9ybWF0aW9uID0gZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb24oKTtcbiAgc2V0RW5hYmxlZChmYWxzZSk7XG59XG5cbmZ1bmN0aW9uIHJlc2V0QWZ0ZXJDb21taXQoY29udGFpbmVySW5mbykge1xuICByZXN0b3JlU2VsZWN0aW9uKHNlbGVjdGlvbkluZm9ybWF0aW9uKTtcbiAgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBudWxsO1xuICBzZXRFbmFibGVkKGV2ZW50c0VuYWJsZWQpO1xuICBldmVudHNFbmFibGVkID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgdmFyIHBhcmVudE5hbWVzcGFjZSA9IHZvaWQgMDtcbiAge1xuICAgIC8vIFRPRE86IHRha2UgbmFtZXNwYWNlIGludG8gYWNjb3VudCB3aGVuIHZhbGlkYXRpbmcuXG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG4gICAgdmFsaWRhdGVET01OZXN0aW5nKHR5cGUsIG51bGwsIGhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbyk7XG4gICAgaWYgKHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJykge1xuICAgICAgdmFyIHN0cmluZyA9ICcnICsgcHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgb3duQW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8sIHR5cGUpO1xuICAgICAgdmFsaWRhdGVET01OZXN0aW5nKG51bGwsIHN0cmluZywgb3duQW5jZXN0b3JJbmZvKTtcbiAgICB9XG4gICAgcGFyZW50TmFtZXNwYWNlID0gaG9zdENvbnRleHREZXYubmFtZXNwYWNlO1xuICB9XG4gIHZhciBkb21FbGVtZW50ID0gY3JlYXRlRWxlbWVudCh0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBwYXJlbnROYW1lc3BhY2UpO1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBkb21FbGVtZW50KTtcbiAgdXBkYXRlRmliZXJQcm9wcyhkb21FbGVtZW50LCBwcm9wcyk7XG4gIHJldHVybiBkb21FbGVtZW50O1xufVxuXG5mdW5jdGlvbiBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50SW5zdGFuY2UsIGNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLmFwcGVuZENoaWxkKGNoaWxkKTtcbn1cblxuZnVuY3Rpb24gZmluYWxpemVJbml0aWFsQ2hpbGRyZW4oZG9tRWxlbWVudCwgdHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQpIHtcbiAgc2V0SW5pdGlhbFByb3BlcnRpZXMoZG9tRWxlbWVudCwgdHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG4gIHJldHVybiBzaG91bGRBdXRvRm9jdXNIb3N0Q29tcG9uZW50KHR5cGUsIHByb3BzKTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZVVwZGF0ZShkb21FbGVtZW50LCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQpIHtcbiAge1xuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuICAgIGlmICh0eXBlb2YgbmV3UHJvcHMuY2hpbGRyZW4gIT09IHR5cGVvZiBvbGRQcm9wcy5jaGlsZHJlbiAmJiAodHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV3UHJvcHMuY2hpbGRyZW4gPT09ICdudW1iZXInKSkge1xuICAgICAgdmFyIHN0cmluZyA9ICcnICsgbmV3UHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgb3duQW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8sIHR5cGUpO1xuICAgICAgdmFsaWRhdGVET01OZXN0aW5nKG51bGwsIHN0cmluZywgb3duQW5jZXN0b3JJbmZvKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpZmZQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgcHJvcHMpIHtcbiAgcmV0dXJuIHR5cGUgPT09ICd0ZXh0YXJlYScgfHwgdHlwZSA9PT0gJ29wdGlvbicgfHwgdHlwZSA9PT0gJ25vc2NyaXB0JyB8fCB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MID09PSAnb2JqZWN0JyAmJiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPT0gbnVsbCAmJiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWwgIT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRGVwcmlvcml0aXplU3VidHJlZSh0eXBlLCBwcm9wcykge1xuICByZXR1cm4gISFwcm9wcy5oaWRkZW47XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRleHRJbnN0YW5jZSh0ZXh0LCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIHtcbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICB2YWxpZGF0ZURPTU5lc3RpbmcobnVsbCwgdGV4dCwgaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvKTtcbiAgfVxuICB2YXIgdGV4dE5vZGUgPSBjcmVhdGVUZXh0Tm9kZSh0ZXh0LCByb290Q29udGFpbmVySW5zdGFuY2UpO1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCB0ZXh0Tm9kZSk7XG4gIHJldHVybiB0ZXh0Tm9kZTtcbn1cblxudmFyIGlzUHJpbWFyeVJlbmRlcmVyID0gdHJ1ZTtcbi8vIFRoaXMgaW5pdGlhbGl6YXRpb24gY29kZSBtYXkgcnVuIGV2ZW4gb24gc2VydmVyIGVudmlyb25tZW50c1xuLy8gaWYgYSBjb21wb25lbnQganVzdCBpbXBvcnRzIFJlYWN0RE9NIChlLmcuIGZvciBmaW5kRE9NTm9kZSkuXG4vLyBTb21lIGVudmlyb25tZW50cyBtaWdodCBub3QgaGF2ZSBzZXRUaW1lb3V0IG9yIGNsZWFyVGltZW91dC5cbnZhciBzY2hlZHVsZVRpbWVvdXQgPSB0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IHNldFRpbWVvdXQgOiB1bmRlZmluZWQ7XG52YXIgY2FuY2VsVGltZW91dCA9IHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBjbGVhclRpbWVvdXQgOiB1bmRlZmluZWQ7XG52YXIgbm9UaW1lb3V0ID0gLTE7XG52YXIgc2NoZWR1bGVQYXNzaXZlRWZmZWN0cyA9IHNjaGVkdWxlci51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrO1xudmFyIGNhbmNlbFBhc3NpdmVFZmZlY3RzID0gc2NoZWR1bGVyLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyAgICAgTXV0YXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIHN1cHBvcnRzTXV0YXRpb24gPSB0cnVlO1xuXG5mdW5jdGlvbiBjb21taXRNb3VudChkb21FbGVtZW50LCB0eXBlLCBuZXdQcm9wcywgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICAvLyBEZXNwaXRlIHRoZSBuYW1pbmcgdGhhdCBtaWdodCBpbXBseSBvdGhlcndpc2UsIHRoaXMgbWV0aG9kIG9ubHlcbiAgLy8gZmlyZXMgaWYgdGhlcmUgaXMgYW4gYFVwZGF0ZWAgZWZmZWN0IHNjaGVkdWxlZCBkdXJpbmcgbW91bnRpbmcuXG4gIC8vIFRoaXMgaGFwcGVucyBpZiBgZmluYWxpemVJbml0aWFsQ2hpbGRyZW5gIHJldHVybnMgYHRydWVgICh3aGljaCBpdFxuICAvLyBkb2VzIHRvIGltcGxlbWVudCB0aGUgYGF1dG9Gb2N1c2AgYXR0cmlidXRlIG9uIHRoZSBjbGllbnQpLiBCdXRcbiAgLy8gdGhlcmUgYXJlIGFsc28gb3RoZXIgY2FzZXMgd2hlbiB0aGlzIG1pZ2h0IGhhcHBlbiAoc3VjaCBhcyBwYXRjaGluZ1xuICAvLyB1cCB0ZXh0IGNvbnRlbnQgZHVyaW5nIGh5ZHJhdGlvbiBtaXNtYXRjaCkuIFNvIHdlJ2xsIGNoZWNrIHRoaXMgYWdhaW4uXG4gIGlmIChzaG91bGRBdXRvRm9jdXNIb3N0Q29tcG9uZW50KHR5cGUsIG5ld1Byb3BzKSkge1xuICAgIGRvbUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRVcGRhdGUoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzLCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIC8vIFVwZGF0ZSB0aGUgcHJvcHMgaGFuZGxlIHNvIHRoYXQgd2Uga25vdyB3aGljaCBwcm9wcyBhcmUgdGhlIG9uZXMgd2l0aFxuICAvLyB3aXRoIGN1cnJlbnQgZXZlbnQgaGFuZGxlcnMuXG4gIHVwZGF0ZUZpYmVyUHJvcHMoZG9tRWxlbWVudCwgbmV3UHJvcHMpO1xuICAvLyBBcHBseSB0aGUgZGlmZiB0byB0aGUgRE9NIG5vZGUuXG4gIHVwZGF0ZVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzKTtcbn1cblxuZnVuY3Rpb24gcmVzZXRUZXh0Q29udGVudChkb21FbGVtZW50KSB7XG4gIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsICcnKTtcbn1cblxuZnVuY3Rpb24gY29tbWl0VGV4dFVwZGF0ZSh0ZXh0SW5zdGFuY2UsIG9sZFRleHQsIG5ld1RleHQpIHtcbiAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9IG5ld1RleHQ7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZENoaWxkKHBhcmVudEluc3RhbmNlLCBjaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5hcHBlbmRDaGlsZChjaGlsZCk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZENoaWxkVG9Db250YWluZXIoY29udGFpbmVyLCBjaGlsZCkge1xuICB2YXIgcGFyZW50Tm9kZSA9IHZvaWQgMDtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgcGFyZW50Tm9kZSA9IGNvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBjb250YWluZXIpO1xuICB9IGVsc2Uge1xuICAgIHBhcmVudE5vZGUgPSBjb250YWluZXI7XG4gICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gIH1cbiAgLy8gVGhpcyBjb250YWluZXIgbWlnaHQgYmUgdXNlZCBmb3IgYSBwb3J0YWwuXG4gIC8vIElmIHNvbWV0aGluZyBpbnNpZGUgYSBwb3J0YWwgaXMgY2xpY2tlZCwgdGhhdCBjbGljayBzaG91bGQgYnViYmxlXG4gIC8vIHRocm91Z2ggdGhlIFJlYWN0IHRyZWUuIEhvd2V2ZXIsIG9uIE1vYmlsZSBTYWZhcmkgdGhlIGNsaWNrIHdvdWxkXG4gIC8vIG5ldmVyIGJ1YmJsZSB0aHJvdWdoIHRoZSAqRE9NKiB0cmVlIHVubGVzcyBhbiBhbmNlc3RvciB3aXRoIG9uY2xpY2tcbiAgLy8gZXZlbnQgZXhpc3RzLiBTbyB3ZSB3b3VsZG4ndCBzZWUgaXQgYW5kIGRpc3BhdGNoIGl0LlxuICAvLyBUaGlzIGlzIHdoeSB3ZSBlbnN1cmUgdGhhdCBub24gUmVhY3Qgcm9vdCBjb250YWluZXJzIGhhdmUgaW5saW5lIG9uY2xpY2tcbiAgLy8gZGVmaW5lZC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTkxOFxuICB2YXIgcmVhY3RSb290Q29udGFpbmVyID0gY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXI7XG4gIGlmICgocmVhY3RSb290Q29udGFpbmVyID09PSBudWxsIHx8IHJlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSAmJiBwYXJlbnROb2RlLm9uY2xpY2sgPT09IG51bGwpIHtcbiAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KHBhcmVudE5vZGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydEJlZm9yZShwYXJlbnRJbnN0YW5jZSwgY2hpbGQsIGJlZm9yZUNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlQ2hpbGQpO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRJbkNvbnRhaW5lckJlZm9yZShjb250YWluZXIsIGNoaWxkLCBiZWZvcmVDaGlsZCkge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICBjb250YWluZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGNoaWxkLCBiZWZvcmVDaGlsZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGQocGFyZW50SW5zdGFuY2UsIGNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKGNoaWxkKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGRGcm9tQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjaGlsZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KHBhcmVudEluc3RhbmNlLCBzdXNwZW5zZUluc3RhbmNlKSB7XG4gIHZhciBub2RlID0gc3VzcGVuc2VJbnN0YW5jZTtcbiAgLy8gRGVsZXRlIGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS5cbiAgLy8gVGhlcmUgbWlnaHQgYmUgbmVzdGVkIG5vZGVzIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBob3dcbiAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuXG4gIHZhciBkZXB0aCA9IDA7XG4gIGRvIHtcbiAgICB2YXIgbmV4dE5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgIGlmIChuZXh0Tm9kZSAmJiBuZXh0Tm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgZGF0YSA9IG5leHROb2RlLmRhdGE7XG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQobmV4dE5vZGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cbiAgICB9XG4gICAgbm9kZSA9IG5leHROb2RlO1xuICB9IHdoaWxlIChub2RlKTtcbiAgLy8gVE9ETzogV2Fybiwgd2UgZGlkbid0IGZpbmQgdGhlIGVuZCBjb21tZW50IGJvdW5kYXJ5LlxufVxuXG5mdW5jdGlvbiBjbGVhclN1c3BlbnNlQm91bmRhcnlGcm9tQ29udGFpbmVyKGNvbnRhaW5lciwgc3VzcGVuc2VJbnN0YW5jZSkge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICBjbGVhclN1c3BlbnNlQm91bmRhcnkoY29udGFpbmVyLnBhcmVudE5vZGUsIHN1c3BlbnNlSW5zdGFuY2UpO1xuICB9IGVsc2UgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KGNvbnRhaW5lciwgc3VzcGVuc2VJbnN0YW5jZSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gRG9jdW1lbnQgbm9kZXMgc2hvdWxkIG5ldmVyIGNvbnRhaW4gc3VzcGVuc2UgYm91bmRhcmllcy5cbiAgfVxufVxuXG5mdW5jdGlvbiBoaWRlSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgLy8gVE9ETzogRG9lcyB0aGlzIHdvcmsgZm9yIGFsbCBlbGVtZW50IHR5cGVzPyBXaGF0IGFib3V0IE1hdGhNTD8gU2hvdWxkIHdlXG4gIC8vIHBhc3MgaG9zdCBjb250ZXh0IHRvIHRoaXMgbWV0aG9kP1xuICBpbnN0YW5jZSA9IGluc3RhbmNlO1xuICBpbnN0YW5jZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xufVxuXG5mdW5jdGlvbiBoaWRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gJyc7XG59XG5cbmZ1bmN0aW9uIHVuaGlkZUluc3RhbmNlKGluc3RhbmNlLCBwcm9wcykge1xuICBpbnN0YW5jZSA9IGluc3RhbmNlO1xuICB2YXIgc3R5bGVQcm9wID0gcHJvcHNbU1RZTEVdO1xuICB2YXIgZGlzcGxheSA9IHN0eWxlUHJvcCAhPT0gdW5kZWZpbmVkICYmIHN0eWxlUHJvcCAhPT0gbnVsbCAmJiBzdHlsZVByb3AuaGFzT3duUHJvcGVydHkoJ2Rpc3BsYXknKSA/IHN0eWxlUHJvcC5kaXNwbGF5IDogbnVsbDtcbiAgaW5zdGFuY2Uuc3R5bGUuZGlzcGxheSA9IGRhbmdlcm91c1N0eWxlVmFsdWUoJ2Rpc3BsYXknLCBkaXNwbGF5KTtcbn1cblxuZnVuY3Rpb24gdW5oaWRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gdGV4dDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gICAgIEh5ZHJhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgc3VwcG9ydHNIeWRyYXRpb24gPSB0cnVlO1xuXG5mdW5jdGlvbiBjYW5IeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzKSB7XG4gIGlmIChpbnN0YW5jZS5ub2RlVHlwZSAhPT0gRUxFTUVOVF9OT0RFIHx8IHR5cGUudG9Mb3dlckNhc2UoKSAhPT0gaW5zdGFuY2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIFRoaXMgaGFzIG5vdyBiZWVuIHJlZmluZWQgdG8gYW4gZWxlbWVudCBub2RlLlxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIGNhbkh5ZHJhdGVUZXh0SW5zdGFuY2UoaW5zdGFuY2UsIHRleHQpIHtcbiAgaWYgKHRleHQgPT09ICcnIHx8IGluc3RhbmNlLm5vZGVUeXBlICE9PSBURVhUX05PREUpIHtcbiAgICAvLyBFbXB0eSBzdHJpbmdzIGFyZSBub3QgcGFyc2VkIGJ5IEhUTUwgc28gdGhlcmUgd29uJ3QgYmUgYSBjb3JyZWN0IG1hdGNoIGhlcmUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gVGhpcyBoYXMgbm93IGJlZW4gcmVmaW5lZCB0byBhIHRleHQgbm9kZS5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG5mdW5jdGlvbiBjYW5IeWRyYXRlU3VzcGVuc2VJbnN0YW5jZShpbnN0YW5jZSkge1xuICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgIC8vIEVtcHR5IHN0cmluZ3MgYXJlIG5vdCBwYXJzZWQgYnkgSFRNTCBzbyB0aGVyZSB3b24ndCBiZSBhIGNvcnJlY3QgbWF0Y2ggaGVyZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBUaGlzIGhhcyBub3cgYmVlbiByZWZpbmVkIHRvIGEgc3VzcGVuc2Ugbm9kZS5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG5mdW5jdGlvbiBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoaW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSBpbnN0YW5jZS5uZXh0U2libGluZztcbiAgLy8gU2tpcCBub24taHlkcmF0YWJsZSBub2Rlcy5cbiAgd2hpbGUgKG5vZGUgJiYgbm9kZS5ub2RlVHlwZSAhPT0gRUxFTUVOVF9OT0RFICYmIG5vZGUubm9kZVR5cGUgIT09IFRFWFRfTk9ERSAmJiAoIWVuYWJsZVN1c3BlbnNlU2VydmVyUmVuZGVyZXIgfHwgbm9kZS5ub2RlVHlwZSAhPT0gQ09NTUVOVF9OT0RFIHx8IG5vZGUuZGF0YSAhPT0gU1VTUEVOU0VfU1RBUlRfREFUQSkpIHtcbiAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgfVxuICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQocGFyZW50SW5zdGFuY2UpIHtcbiAgdmFyIG5leHQgPSBwYXJlbnRJbnN0YW5jZS5maXJzdENoaWxkO1xuICAvLyBTa2lwIG5vbi1oeWRyYXRhYmxlIG5vZGVzLlxuICB3aGlsZSAobmV4dCAmJiBuZXh0Lm5vZGVUeXBlICE9PSBFTEVNRU5UX05PREUgJiYgbmV4dC5ub2RlVHlwZSAhPT0gVEVYVF9OT0RFICYmICghZW5hYmxlU3VzcGVuc2VTZXJ2ZXJSZW5kZXJlciB8fCBuZXh0Lm5vZGVUeXBlICE9PSBDT01NRU5UX05PREUgfHwgbmV4dC5kYXRhICE9PSBTVVNQRU5TRV9TVEFSVF9EQVRBKSkge1xuICAgIG5leHQgPSBuZXh0Lm5leHRTaWJsaW5nO1xuICB9XG4gIHJldHVybiBuZXh0O1xufVxuXG5mdW5jdGlvbiBoeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIGluc3RhbmNlKTtcbiAgLy8gVE9ETzogUG9zc2libHkgZGVmZXIgdGhpcyB1bnRpbCB0aGUgY29tbWl0IHBoYXNlIHdoZXJlIGFsbCB0aGUgZXZlbnRzXG4gIC8vIGdldCBhdHRhY2hlZC5cbiAgdXBkYXRlRmliZXJQcm9wcyhpbnN0YW5jZSwgcHJvcHMpO1xuICB2YXIgcGFyZW50TmFtZXNwYWNlID0gdm9pZCAwO1xuICB7XG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG4gICAgcGFyZW50TmFtZXNwYWNlID0gaG9zdENvbnRleHREZXYubmFtZXNwYWNlO1xuICB9XG4gIHJldHVybiBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKGluc3RhbmNlLCB0eXBlLCBwcm9wcywgcGFyZW50TmFtZXNwYWNlLCByb290Q29udGFpbmVySW5zdGFuY2UpO1xufVxuXG5mdW5jdGlvbiBoeWRyYXRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCB0ZXh0SW5zdGFuY2UpO1xuICByZXR1cm4gZGlmZkh5ZHJhdGVkVGV4dCh0ZXh0SW5zdGFuY2UsIHRleHQpO1xufVxuXG5mdW5jdGlvbiBnZXROZXh0SHlkcmF0YWJsZUluc3RhbmNlQWZ0ZXJTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSBzdXNwZW5zZUluc3RhbmNlLm5leHRTaWJsaW5nO1xuICAvLyBTa2lwIHBhc3QgYWxsIG5vZGVzIHdpdGhpbiB0aGlzIHN1c3BlbnNlIGJvdW5kYXJ5LlxuICAvLyBUaGVyZSBtaWdodCBiZSBuZXN0ZWQgbm9kZXMgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGhvd1xuICAvLyBkZWVwIHdlIGFyZSBhbmQgb25seSBicmVhayBvdXQgd2hlbiB3ZSdyZSBiYWNrIG9uIHRvcC5cbiAgdmFyIGRlcHRoID0gMDtcbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgZGF0YSA9IG5vZGUuZGF0YTtcbiAgICAgIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKG5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSkge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuICAgIH1cbiAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgfVxuICAvLyBUT0RPOiBXYXJuLCB3ZSBkaWRuJ3QgZmluZCB0aGUgZW5kIGNvbW1lbnQgYm91bmRhcnkuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBkaWROb3RNYXRjaEh5ZHJhdGVkQ29udGFpbmVyVGV4dEluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgdGV4dEluc3RhbmNlLCB0ZXh0KSB7XG4gIHtcbiAgICB3YXJuRm9yVW5tYXRjaGVkVGV4dCh0ZXh0SW5zdGFuY2UsIHRleHQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpZE5vdE1hdGNoSHlkcmF0ZWRUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0SW5zdGFuY2UsIHRleHQpIHtcbiAgaWYgKHRydWUgJiYgcGFyZW50UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddICE9PSB0cnVlKSB7XG4gICAgd2FybkZvclVubWF0Y2hlZFRleHQodGV4dEluc3RhbmNlLCB0ZXh0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaWROb3RIeWRyYXRlQ29udGFpbmVySW5zdGFuY2UocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSkge1xuICB7XG4gICAgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSk7XG4gICAgfSBlbHNlIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICAvLyBUT0RPOiB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVTdXNwZW5zZUJvdW5kYXJ5XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIGluc3RhbmNlKSB7XG4gIGlmICh0cnVlICYmIHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSAhPT0gdHJ1ZSkge1xuICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSk7XG4gICAgfSBlbHNlIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICAvLyBUT0RPOiB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVTdXNwZW5zZUJvdW5kYXJ5XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50SW5zdGFuY2UsIGluc3RhbmNlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVDb250YWluZXJJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHR5cGUsIHByb3BzKSB7XG4gIHtcbiAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50Q29udGFpbmVyLCB0eXBlLCBwcm9wcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVDb250YWluZXJUZXh0SW5zdGFuY2UocGFyZW50Q29udGFpbmVyLCB0ZXh0KSB7XG4gIHtcbiAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50Q29udGFpbmVyLCB0ZXh0KTtcbiAgfVxufVxuXG5cblxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHR5cGUsIHByb3BzKSB7XG4gIGlmICh0cnVlICYmIHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSAhPT0gdHJ1ZSkge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnRJbnN0YW5jZSwgdHlwZSwgcHJvcHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdGV4dCkge1xuICBpZiAodHJ1ZSAmJiBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklOR10gIT09IHRydWUpIHtcbiAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50SW5zdGFuY2UsIHRleHQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UpIHtcbiAgaWYgKHRydWUgJiYgcGFyZW50UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddICE9PSB0cnVlKSB7XG4gICAgLy8gVE9ETzogd2FybkZvckluc2VydGVkSHlkcmF0ZWRTdXNwZW5zZShwYXJlbnRJbnN0YW5jZSk7XG4gIH1cbn1cblxuLy8gUHJlZml4IG1lYXN1cmVtZW50cyBzbyB0aGF0IGl0J3MgcG9zc2libGUgdG8gZmlsdGVyIHRoZW0uXG4vLyBMb25nZXIgcHJlZml4ZXMgYXJlIGhhcmQgdG8gcmVhZCBpbiBEZXZUb29scy5cbnZhciByZWFjdEVtb2ppID0gJ1xcdTI2OUInO1xudmFyIHdhcm5pbmdFbW9qaSA9ICdcXHUyNkQ0JztcbnZhciBzdXBwb3J0c1VzZXJUaW1pbmcgPSB0eXBlb2YgcGVyZm9ybWFuY2UgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwZXJmb3JtYW5jZS5tYXJrID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBwZXJmb3JtYW5jZS5jbGVhck1hcmtzID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBwZXJmb3JtYW5jZS5tZWFzdXJlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBwZXJmb3JtYW5jZS5jbGVhck1lYXN1cmVzID09PSAnZnVuY3Rpb24nO1xuXG4vLyBLZWVwIHRyYWNrIG9mIGN1cnJlbnQgZmliZXIgc28gdGhhdCB3ZSBrbm93IHRoZSBwYXRoIHRvIHVud2luZCBvbiBwYXVzZS5cbi8vIFRPRE86IHRoaXMgbG9va3MgdGhlIHNhbWUgYXMgbmV4dFVuaXRPZldvcmsgaW4gc2NoZWR1bGVyLiBDYW4gd2UgdW5pZnkgdGhlbT9cbnZhciBjdXJyZW50RmliZXIgPSBudWxsO1xuLy8gSWYgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiB1c2VyIGNvZGUsIHdoaWNoIGZpYmVyIGFuZCBtZXRob2QgaXMgaXQ/XG4vLyBSZXVzaW5nIGBjdXJyZW50RmliZXJgIHdvdWxkIGJlIGNvbmZ1c2luZyBmb3IgdGhpcyBiZWNhdXNlIHVzZXIgY29kZSBmaWJlclxuLy8gY2FuIGNoYW5nZSBkdXJpbmcgY29tbWl0IHBoYXNlIHRvbywgYnV0IHdlIGRvbid0IG5lZWQgdG8gdW53aW5kIGl0IChzaW5jZVxuLy8gbGlmZWN5Y2xlcyBpbiB0aGUgY29tbWl0IHBoYXNlIGRvbid0IHJlc2VtYmxlIGEgdHJlZSkuXG52YXIgY3VycmVudFBoYXNlID0gbnVsbDtcbnZhciBjdXJyZW50UGhhc2VGaWJlciA9IG51bGw7XG4vLyBEaWQgbGlmZWN5Y2xlIGhvb2sgc2NoZWR1bGUgYW4gdXBkYXRlPyBUaGlzIGlzIG9mdGVuIGEgcGVyZm9ybWFuY2UgcHJvYmxlbSxcbi8vIHNvIHdlIHdpbGwga2VlcCB0cmFjayBvZiBpdCwgYW5kIGluY2x1ZGUgaXQgaW4gdGhlIHJlcG9ydC5cbi8vIFRyYWNrIGNvbW1pdHMgY2F1c2VkIGJ5IGNhc2NhZGluZyB1cGRhdGVzLlxudmFyIGlzQ29tbWl0dGluZyA9IGZhbHNlO1xudmFyIGhhc1NjaGVkdWxlZFVwZGF0ZUluQ3VycmVudENvbW1pdCA9IGZhbHNlO1xudmFyIGhhc1NjaGVkdWxlZFVwZGF0ZUluQ3VycmVudFBoYXNlID0gZmFsc2U7XG52YXIgY29tbWl0Q291bnRJbkN1cnJlbnRXb3JrTG9vcCA9IDA7XG52YXIgZWZmZWN0Q291bnRJbkN1cnJlbnRDb21taXQgPSAwO1xudmFyIGlzV2FpdGluZ0ZvckNhbGxiYWNrID0gZmFsc2U7XG4vLyBEdXJpbmcgY29tbWl0cywgd2Ugb25seSBzaG93IGEgbWVhc3VyZW1lbnQgb25jZSBwZXIgbWV0aG9kIG5hbWVcbi8vIHRvIGF2b2lkIHN0cmV0Y2ggdGhlIGNvbW1pdCBwaGFzZSB3aXRoIG1lYXN1cmVtZW50IG92ZXJoZWFkLlxudmFyIGxhYmVsc0luQ3VycmVudENvbW1pdCA9IG5ldyBTZXQoKTtcblxudmFyIGZvcm1hdE1hcmtOYW1lID0gZnVuY3Rpb24gKG1hcmtOYW1lKSB7XG4gIHJldHVybiByZWFjdEVtb2ppICsgJyAnICsgbWFya05hbWU7XG59O1xuXG52YXIgZm9ybWF0TGFiZWwgPSBmdW5jdGlvbiAobGFiZWwsIHdhcm5pbmcpIHtcbiAgdmFyIHByZWZpeCA9IHdhcm5pbmcgPyB3YXJuaW5nRW1vamkgKyAnICcgOiByZWFjdEVtb2ppICsgJyAnO1xuICB2YXIgc3VmZml4ID0gd2FybmluZyA/ICcgV2FybmluZzogJyArIHdhcm5pbmcgOiAnJztcbiAgcmV0dXJuICcnICsgcHJlZml4ICsgbGFiZWwgKyBzdWZmaXg7XG59O1xuXG52YXIgYmVnaW5NYXJrID0gZnVuY3Rpb24gKG1hcmtOYW1lKSB7XG4gIHBlcmZvcm1hbmNlLm1hcmsoZm9ybWF0TWFya05hbWUobWFya05hbWUpKTtcbn07XG5cbnZhciBjbGVhck1hcmsgPSBmdW5jdGlvbiAobWFya05hbWUpIHtcbiAgcGVyZm9ybWFuY2UuY2xlYXJNYXJrcyhmb3JtYXRNYXJrTmFtZShtYXJrTmFtZSkpO1xufTtcblxudmFyIGVuZE1hcmsgPSBmdW5jdGlvbiAobGFiZWwsIG1hcmtOYW1lLCB3YXJuaW5nKSB7XG4gIHZhciBmb3JtYXR0ZWRNYXJrTmFtZSA9IGZvcm1hdE1hcmtOYW1lKG1hcmtOYW1lKTtcbiAgdmFyIGZvcm1hdHRlZExhYmVsID0gZm9ybWF0TGFiZWwobGFiZWwsIHdhcm5pbmcpO1xuICB0cnkge1xuICAgIHBlcmZvcm1hbmNlLm1lYXN1cmUoZm9ybWF0dGVkTGFiZWwsIGZvcm1hdHRlZE1hcmtOYW1lKTtcbiAgfSBjYXRjaCAoZXJyKSB7fVxuICAvLyBJZiBwcmV2aW91cyBtYXJrIHdhcyBtaXNzaW5nIGZvciBzb21lIHJlYXNvbiwgdGhpcyB3aWxsIHRocm93LlxuICAvLyBUaGlzIGNvdWxkIG9ubHkgaGFwcGVuIGlmIFJlYWN0IGNyYXNoZWQgaW4gYW4gdW5leHBlY3RlZCBwbGFjZSBlYXJsaWVyLlxuICAvLyBEb24ndCBwaWxlIG9uIHdpdGggbW9yZSBlcnJvcnMuXG5cbiAgLy8gQ2xlYXIgbWFya3MgaW1tZWRpYXRlbHkgdG8gYXZvaWQgZ3Jvd2luZyBidWZmZXIuXG4gIHBlcmZvcm1hbmNlLmNsZWFyTWFya3MoZm9ybWF0dGVkTWFya05hbWUpO1xuICBwZXJmb3JtYW5jZS5jbGVhck1lYXN1cmVzKGZvcm1hdHRlZExhYmVsKTtcbn07XG5cbnZhciBnZXRGaWJlck1hcmtOYW1lID0gZnVuY3Rpb24gKGxhYmVsLCBkZWJ1Z0lEKSB7XG4gIHJldHVybiBsYWJlbCArICcgKCMnICsgZGVidWdJRCArICcpJztcbn07XG5cbnZhciBnZXRGaWJlckxhYmVsID0gZnVuY3Rpb24gKGNvbXBvbmVudE5hbWUsIGlzTW91bnRlZCwgcGhhc2UpIHtcbiAgaWYgKHBoYXNlID09PSBudWxsKSB7XG4gICAgLy8gVGhlc2UgYXJlIGNvbXBvc2l0ZSBjb21wb25lbnQgdG90YWwgdGltZSBtZWFzdXJlbWVudHMuXG4gICAgcmV0dXJuIGNvbXBvbmVudE5hbWUgKyAnIFsnICsgKGlzTW91bnRlZCA/ICd1cGRhdGUnIDogJ21vdW50JykgKyAnXSc7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ29tcG9zaXRlIGNvbXBvbmVudCBtZXRob2RzLlxuICAgIHJldHVybiBjb21wb25lbnROYW1lICsgJy4nICsgcGhhc2U7XG4gIH1cbn07XG5cbnZhciBiZWdpbkZpYmVyTWFyayA9IGZ1bmN0aW9uIChmaWJlciwgcGhhc2UpIHtcbiAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdVbmtub3duJztcbiAgdmFyIGRlYnVnSUQgPSBmaWJlci5fZGVidWdJRDtcbiAgdmFyIGlzTW91bnRlZCA9IGZpYmVyLmFsdGVybmF0ZSAhPT0gbnVsbDtcbiAgdmFyIGxhYmVsID0gZ2V0RmliZXJMYWJlbChjb21wb25lbnROYW1lLCBpc01vdW50ZWQsIHBoYXNlKTtcblxuICBpZiAoaXNDb21taXR0aW5nICYmIGxhYmVsc0luQ3VycmVudENvbW1pdC5oYXMobGFiZWwpKSB7XG4gICAgLy8gRHVyaW5nIHRoZSBjb21taXQgcGhhc2UsIHdlIGRvbid0IHNob3cgZHVwbGljYXRlIGxhYmVscyBiZWNhdXNlXG4gICAgLy8gdGhlcmUgaXMgYSBmaXhlZCBvdmVyaGVhZCBmb3IgZXZlcnkgbWVhc3VyZW1lbnQsIGFuZCB3ZSBkb24ndFxuICAgIC8vIHdhbnQgdG8gc3RyZXRjaCB0aGUgY29tbWl0IHBoYXNlIGJleW9uZCBuZWNlc3NhcnkuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGxhYmVsc0luQ3VycmVudENvbW1pdC5hZGQobGFiZWwpO1xuXG4gIHZhciBtYXJrTmFtZSA9IGdldEZpYmVyTWFya05hbWUobGFiZWwsIGRlYnVnSUQpO1xuICBiZWdpbk1hcmsobWFya05hbWUpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbnZhciBjbGVhckZpYmVyTWFyayA9IGZ1bmN0aW9uIChmaWJlciwgcGhhc2UpIHtcbiAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdVbmtub3duJztcbiAgdmFyIGRlYnVnSUQgPSBmaWJlci5fZGVidWdJRDtcbiAgdmFyIGlzTW91bnRlZCA9IGZpYmVyLmFsdGVybmF0ZSAhPT0gbnVsbDtcbiAgdmFyIGxhYmVsID0gZ2V0RmliZXJMYWJlbChjb21wb25lbnROYW1lLCBpc01vdW50ZWQsIHBoYXNlKTtcbiAgdmFyIG1hcmtOYW1lID0gZ2V0RmliZXJNYXJrTmFtZShsYWJlbCwgZGVidWdJRCk7XG4gIGNsZWFyTWFyayhtYXJrTmFtZSk7XG59O1xuXG52YXIgZW5kRmliZXJNYXJrID0gZnVuY3Rpb24gKGZpYmVyLCBwaGFzZSwgd2FybmluZykge1xuICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUoZmliZXIudHlwZSkgfHwgJ1Vua25vd24nO1xuICB2YXIgZGVidWdJRCA9IGZpYmVyLl9kZWJ1Z0lEO1xuICB2YXIgaXNNb3VudGVkID0gZmliZXIuYWx0ZXJuYXRlICE9PSBudWxsO1xuICB2YXIgbGFiZWwgPSBnZXRGaWJlckxhYmVsKGNvbXBvbmVudE5hbWUsIGlzTW91bnRlZCwgcGhhc2UpO1xuICB2YXIgbWFya05hbWUgPSBnZXRGaWJlck1hcmtOYW1lKGxhYmVsLCBkZWJ1Z0lEKTtcbiAgZW5kTWFyayhsYWJlbCwgbWFya05hbWUsIHdhcm5pbmcpO1xufTtcblxudmFyIHNob3VsZElnbm9yZUZpYmVyID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gIC8vIEhvc3QgY29tcG9uZW50cyBzaG91bGQgYmUgc2tpcHBlZCBpbiB0aGUgdGltZWxpbmUuXG4gIC8vIFdlIGNvdWxkIGNoZWNrIHR5cGVvZiBmaWJlci50eXBlLCBidXQgZG9lcyB0aGlzIHdvcmsgd2l0aCBSTj9cbiAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RSb290OlxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICBjYXNlIEZyYWdtZW50OlxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgIGNhc2UgTW9kZTpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbnZhciBjbGVhclBlbmRpbmdQaGFzZU1lYXN1cmVtZW50ID0gZnVuY3Rpb24gKCkge1xuICBpZiAoY3VycmVudFBoYXNlICE9PSBudWxsICYmIGN1cnJlbnRQaGFzZUZpYmVyICE9PSBudWxsKSB7XG4gICAgY2xlYXJGaWJlck1hcmsoY3VycmVudFBoYXNlRmliZXIsIGN1cnJlbnRQaGFzZSk7XG4gIH1cbiAgY3VycmVudFBoYXNlRmliZXIgPSBudWxsO1xuICBjdXJyZW50UGhhc2UgPSBudWxsO1xuICBoYXNTY2hlZHVsZWRVcGRhdGVJbkN1cnJlbnRQaGFzZSA9IGZhbHNlO1xufTtcblxudmFyIHBhdXNlVGltZXJzID0gZnVuY3Rpb24gKCkge1xuICAvLyBTdG9wcyBhbGwgY3VycmVudGx5IGFjdGl2ZSBtZWFzdXJlbWVudHMgc28gdGhhdCB0aGV5IGNhbiBiZSByZXN1bWVkXG4gIC8vIGlmIHdlIGNvbnRpbnVlIGluIGEgbGF0ZXIgZGVmZXJyZWQgbG9vcCBmcm9tIHRoZSBzYW1lIHVuaXQgb2Ygd29yay5cbiAgdmFyIGZpYmVyID0gY3VycmVudEZpYmVyO1xuICB3aGlsZSAoZmliZXIpIHtcbiAgICBpZiAoZmliZXIuX2RlYnVnSXNDdXJyZW50bHlUaW1pbmcpIHtcbiAgICAgIGVuZEZpYmVyTWFyayhmaWJlciwgbnVsbCwgbnVsbCk7XG4gICAgfVxuICAgIGZpYmVyID0gZmliZXIucmV0dXJuO1xuICB9XG59O1xuXG52YXIgcmVzdW1lVGltZXJzUmVjdXJzaXZlbHkgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgaWYgKGZpYmVyLnJldHVybiAhPT0gbnVsbCkge1xuICAgIHJlc3VtZVRpbWVyc1JlY3Vyc2l2ZWx5KGZpYmVyLnJldHVybik7XG4gIH1cbiAgaWYgKGZpYmVyLl9kZWJ1Z0lzQ3VycmVudGx5VGltaW5nKSB7XG4gICAgYmVnaW5GaWJlck1hcmsoZmliZXIsIG51bGwpO1xuICB9XG59O1xuXG52YXIgcmVzdW1lVGltZXJzID0gZnVuY3Rpb24gKCkge1xuICAvLyBSZXN1bWVzIGFsbCBtZWFzdXJlbWVudHMgdGhhdCB3ZXJlIGFjdGl2ZSBkdXJpbmcgdGhlIGxhc3QgZGVmZXJyZWQgbG9vcC5cbiAgaWYgKGN1cnJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgIHJlc3VtZVRpbWVyc1JlY3Vyc2l2ZWx5KGN1cnJlbnRGaWJlcik7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHJlY29yZEVmZmVjdCgpIHtcbiAgaWYgKGVuYWJsZVVzZXJUaW1pbmdBUEkpIHtcbiAgICBlZmZlY3RDb3VudEluQ3VycmVudENvbW1pdCsrO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlY29yZFNjaGVkdWxlVXBkYXRlKCkge1xuICBpZiAoZW5hYmxlVXNlclRpbWluZ0FQSSkge1xuICAgIGlmIChpc0NvbW1pdHRpbmcpIHtcbiAgICAgIGhhc1NjaGVkdWxlZFVwZGF0ZUluQ3VycmVudENvbW1pdCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChjdXJyZW50UGhhc2UgIT09IG51bGwgJiYgY3VycmVudFBoYXNlICE9PSAnY29tcG9uZW50V2lsbE1vdW50JyAmJiBjdXJyZW50UGhhc2UgIT09ICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJykge1xuICAgICAgaGFzU2NoZWR1bGVkVXBkYXRlSW5DdXJyZW50UGhhc2UgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydFJlcXVlc3RDYWxsYmFja1RpbWVyKCkge1xuICBpZiAoZW5hYmxlVXNlclRpbWluZ0FQSSkge1xuICAgIGlmIChzdXBwb3J0c1VzZXJUaW1pbmcgJiYgIWlzV2FpdGluZ0ZvckNhbGxiYWNrKSB7XG4gICAgICBpc1dhaXRpbmdGb3JDYWxsYmFjayA9IHRydWU7XG4gICAgICBiZWdpbk1hcmsoJyhXYWl0aW5nIGZvciBhc3luYyBjYWxsYmFjay4uLiknKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcFJlcXVlc3RDYWxsYmFja1RpbWVyKGRpZEV4cGlyZSwgZXhwaXJhdGlvblRpbWUpIHtcbiAgaWYgKGVuYWJsZVVzZXJUaW1pbmdBUEkpIHtcbiAgICBpZiAoc3VwcG9ydHNVc2VyVGltaW5nKSB7XG4gICAgICBpc1dhaXRpbmdGb3JDYWxsYmFjayA9IGZhbHNlO1xuICAgICAgdmFyIHdhcm5pbmcgPSBkaWRFeHBpcmUgPyAnUmVhY3Qgd2FzIGJsb2NrZWQgYnkgbWFpbiB0aHJlYWQnIDogbnVsbDtcbiAgICAgIGVuZE1hcmsoJyhXYWl0aW5nIGZvciBhc3luYyBjYWxsYmFjay4uLiB3aWxsIGZvcmNlIGZsdXNoIGluICcgKyBleHBpcmF0aW9uVGltZSArICcgbXMpJywgJyhXYWl0aW5nIGZvciBhc3luYyBjYWxsYmFjay4uLiknLCB3YXJuaW5nKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RhcnRXb3JrVGltZXIoZmliZXIpIHtcbiAgaWYgKGVuYWJsZVVzZXJUaW1pbmdBUEkpIHtcbiAgICBpZiAoIXN1cHBvcnRzVXNlclRpbWluZyB8fCBzaG91bGRJZ25vcmVGaWJlcihmaWJlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gSWYgd2UgcGF1c2UsIHRoaXMgaXMgdGhlIGZpYmVyIHRvIHVud2luZCBmcm9tLlxuICAgIGN1cnJlbnRGaWJlciA9IGZpYmVyO1xuICAgIGlmICghYmVnaW5GaWJlck1hcmsoZmliZXIsIG51bGwpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZpYmVyLl9kZWJ1Z0lzQ3VycmVudGx5VGltaW5nID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYW5jZWxXb3JrVGltZXIoZmliZXIpIHtcbiAgaWYgKGVuYWJsZVVzZXJUaW1pbmdBUEkpIHtcbiAgICBpZiAoIXN1cHBvcnRzVXNlclRpbWluZyB8fCBzaG91bGRJZ25vcmVGaWJlcihmaWJlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUmVtZW1iZXIgd2Ugc2hvdWxkbid0IGNvbXBsZXRlIG1lYXN1cmVtZW50IGZvciB0aGlzIGZpYmVyLlxuICAgIC8vIE90aGVyd2lzZSBmbGFtZWNoYXJ0IHdpbGwgYmUgZGVlcCBldmVuIGZvciBzbWFsbCB1cGRhdGVzLlxuICAgIGZpYmVyLl9kZWJ1Z0lzQ3VycmVudGx5VGltaW5nID0gZmFsc2U7XG4gICAgY2xlYXJGaWJlck1hcmsoZmliZXIsIG51bGwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0b3BXb3JrVGltZXIoZmliZXIpIHtcbiAgaWYgKGVuYWJsZVVzZXJUaW1pbmdBUEkpIHtcbiAgICBpZiAoIXN1cHBvcnRzVXNlclRpbWluZyB8fCBzaG91bGRJZ25vcmVGaWJlcihmaWJlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gSWYgd2UgcGF1c2UsIGl0cyBwYXJlbnQgaXMgdGhlIGZpYmVyIHRvIHVud2luZCBmcm9tLlxuICAgIGN1cnJlbnRGaWJlciA9IGZpYmVyLnJldHVybjtcbiAgICBpZiAoIWZpYmVyLl9kZWJ1Z0lzQ3VycmVudGx5VGltaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZpYmVyLl9kZWJ1Z0lzQ3VycmVudGx5VGltaW5nID0gZmFsc2U7XG4gICAgZW5kRmliZXJNYXJrKGZpYmVyLCBudWxsLCBudWxsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdG9wRmFpbGVkV29ya1RpbWVyKGZpYmVyKSB7XG4gIGlmIChlbmFibGVVc2VyVGltaW5nQVBJKSB7XG4gICAgaWYgKCFzdXBwb3J0c1VzZXJUaW1pbmcgfHwgc2hvdWxkSWdub3JlRmliZXIoZmliZXIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIElmIHdlIHBhdXNlLCBpdHMgcGFyZW50IGlzIHRoZSBmaWJlciB0byB1bndpbmQgZnJvbS5cbiAgICBjdXJyZW50RmliZXIgPSBmaWJlci5yZXR1cm47XG4gICAgaWYgKCFmaWJlci5fZGVidWdJc0N1cnJlbnRseVRpbWluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmaWJlci5fZGVidWdJc0N1cnJlbnRseVRpbWluZyA9IGZhbHNlO1xuICAgIHZhciB3YXJuaW5nID0gZmliZXIudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCB8fCBmaWJlci50YWcgPT09IERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudCA/ICdSZW5kZXJpbmcgd2FzIHN1c3BlbmRlZCcgOiAnQW4gZXJyb3Igd2FzIHRocm93biBpbnNpZGUgdGhpcyBlcnJvciBib3VuZGFyeSc7XG4gICAgZW5kRmliZXJNYXJrKGZpYmVyLCBudWxsLCB3YXJuaW5nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydFBoYXNlVGltZXIoZmliZXIsIHBoYXNlKSB7XG4gIGlmIChlbmFibGVVc2VyVGltaW5nQVBJKSB7XG4gICAgaWYgKCFzdXBwb3J0c1VzZXJUaW1pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2xlYXJQZW5kaW5nUGhhc2VNZWFzdXJlbWVudCgpO1xuICAgIGlmICghYmVnaW5GaWJlck1hcmsoZmliZXIsIHBoYXNlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjdXJyZW50UGhhc2VGaWJlciA9IGZpYmVyO1xuICAgIGN1cnJlbnRQaGFzZSA9IHBoYXNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0b3BQaGFzZVRpbWVyKCkge1xuICBpZiAoZW5hYmxlVXNlclRpbWluZ0FQSSkge1xuICAgIGlmICghc3VwcG9ydHNVc2VyVGltaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjdXJyZW50UGhhc2UgIT09IG51bGwgJiYgY3VycmVudFBoYXNlRmliZXIgIT09IG51bGwpIHtcbiAgICAgIHZhciB3YXJuaW5nID0gaGFzU2NoZWR1bGVkVXBkYXRlSW5DdXJyZW50UGhhc2UgPyAnU2NoZWR1bGVkIGEgY2FzY2FkaW5nIHVwZGF0ZScgOiBudWxsO1xuICAgICAgZW5kRmliZXJNYXJrKGN1cnJlbnRQaGFzZUZpYmVyLCBjdXJyZW50UGhhc2UsIHdhcm5pbmcpO1xuICAgIH1cbiAgICBjdXJyZW50UGhhc2UgPSBudWxsO1xuICAgIGN1cnJlbnRQaGFzZUZpYmVyID0gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydFdvcmtMb29wVGltZXIobmV4dFVuaXRPZldvcmspIHtcbiAgaWYgKGVuYWJsZVVzZXJUaW1pbmdBUEkpIHtcbiAgICBjdXJyZW50RmliZXIgPSBuZXh0VW5pdE9mV29yaztcbiAgICBpZiAoIXN1cHBvcnRzVXNlclRpbWluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb21taXRDb3VudEluQ3VycmVudFdvcmtMb29wID0gMDtcbiAgICAvLyBUaGlzIGlzIHRvcCBsZXZlbCBjYWxsLlxuICAgIC8vIEFueSBvdGhlciBtZWFzdXJlbWVudHMgYXJlIHBlcmZvcm1lZCB3aXRoaW4uXG4gICAgYmVnaW5NYXJrKCcoUmVhY3QgVHJlZSBSZWNvbmNpbGlhdGlvbiknKTtcbiAgICAvLyBSZXN1bWUgYW55IG1lYXN1cmVtZW50cyB0aGF0IHdlcmUgaW4gcHJvZ3Jlc3MgZHVyaW5nIHRoZSBsYXN0IGxvb3AuXG4gICAgcmVzdW1lVGltZXJzKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcFdvcmtMb29wVGltZXIoaW50ZXJydXB0ZWRCeSwgZGlkQ29tcGxldGVSb290KSB7XG4gIGlmIChlbmFibGVVc2VyVGltaW5nQVBJKSB7XG4gICAgaWYgKCFzdXBwb3J0c1VzZXJUaW1pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHdhcm5pbmcgPSBudWxsO1xuICAgIGlmIChpbnRlcnJ1cHRlZEJ5ICE9PSBudWxsKSB7XG4gICAgICBpZiAoaW50ZXJydXB0ZWRCeS50YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIHdhcm5pbmcgPSAnQSB0b3AtbGV2ZWwgdXBkYXRlIGludGVycnVwdGVkIHRoZSBwcmV2aW91cyByZW5kZXInO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKGludGVycnVwdGVkQnkudHlwZSkgfHwgJ1Vua25vd24nO1xuICAgICAgICB3YXJuaW5nID0gJ0FuIHVwZGF0ZSB0byAnICsgY29tcG9uZW50TmFtZSArICcgaW50ZXJydXB0ZWQgdGhlIHByZXZpb3VzIHJlbmRlcic7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb21taXRDb3VudEluQ3VycmVudFdvcmtMb29wID4gMSkge1xuICAgICAgd2FybmluZyA9ICdUaGVyZSB3ZXJlIGNhc2NhZGluZyB1cGRhdGVzJztcbiAgICB9XG4gICAgY29tbWl0Q291bnRJbkN1cnJlbnRXb3JrTG9vcCA9IDA7XG4gICAgdmFyIGxhYmVsID0gZGlkQ29tcGxldGVSb290ID8gJyhSZWFjdCBUcmVlIFJlY29uY2lsaWF0aW9uOiBDb21wbGV0ZWQgUm9vdCknIDogJyhSZWFjdCBUcmVlIFJlY29uY2lsaWF0aW9uOiBZaWVsZGVkKSc7XG4gICAgLy8gUGF1c2UgYW55IG1lYXN1cmVtZW50cyB1bnRpbCB0aGUgbmV4dCBsb29wLlxuICAgIHBhdXNlVGltZXJzKCk7XG4gICAgZW5kTWFyayhsYWJlbCwgJyhSZWFjdCBUcmVlIFJlY29uY2lsaWF0aW9uKScsIHdhcm5pbmcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0Q29tbWl0VGltZXIoKSB7XG4gIGlmIChlbmFibGVVc2VyVGltaW5nQVBJKSB7XG4gICAgaWYgKCFzdXBwb3J0c1VzZXJUaW1pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXNDb21taXR0aW5nID0gdHJ1ZTtcbiAgICBoYXNTY2hlZHVsZWRVcGRhdGVJbkN1cnJlbnRDb21taXQgPSBmYWxzZTtcbiAgICBsYWJlbHNJbkN1cnJlbnRDb21taXQuY2xlYXIoKTtcbiAgICBiZWdpbk1hcmsoJyhDb21taXR0aW5nIENoYW5nZXMpJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcENvbW1pdFRpbWVyKCkge1xuICBpZiAoZW5hYmxlVXNlclRpbWluZ0FQSSkge1xuICAgIGlmICghc3VwcG9ydHNVc2VyVGltaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHdhcm5pbmcgPSBudWxsO1xuICAgIGlmIChoYXNTY2hlZHVsZWRVcGRhdGVJbkN1cnJlbnRDb21taXQpIHtcbiAgICAgIHdhcm5pbmcgPSAnTGlmZWN5Y2xlIGhvb2sgc2NoZWR1bGVkIGEgY2FzY2FkaW5nIHVwZGF0ZSc7XG4gICAgfSBlbHNlIGlmIChjb21taXRDb3VudEluQ3VycmVudFdvcmtMb29wID4gMCkge1xuICAgICAgd2FybmluZyA9ICdDYXVzZWQgYnkgYSBjYXNjYWRpbmcgdXBkYXRlIGluIGVhcmxpZXIgY29tbWl0JztcbiAgICB9XG4gICAgaGFzU2NoZWR1bGVkVXBkYXRlSW5DdXJyZW50Q29tbWl0ID0gZmFsc2U7XG4gICAgY29tbWl0Q291bnRJbkN1cnJlbnRXb3JrTG9vcCsrO1xuICAgIGlzQ29tbWl0dGluZyA9IGZhbHNlO1xuICAgIGxhYmVsc0luQ3VycmVudENvbW1pdC5jbGVhcigpO1xuXG4gICAgZW5kTWFyaygnKENvbW1pdHRpbmcgQ2hhbmdlcyknLCAnKENvbW1pdHRpbmcgQ2hhbmdlcyknLCB3YXJuaW5nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydENvbW1pdFNuYXBzaG90RWZmZWN0c1RpbWVyKCkge1xuICBpZiAoZW5hYmxlVXNlclRpbWluZ0FQSSkge1xuICAgIGlmICghc3VwcG9ydHNVc2VyVGltaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVmZmVjdENvdW50SW5DdXJyZW50Q29tbWl0ID0gMDtcbiAgICBiZWdpbk1hcmsoJyhDb21taXR0aW5nIFNuYXBzaG90IEVmZmVjdHMpJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcENvbW1pdFNuYXBzaG90RWZmZWN0c1RpbWVyKCkge1xuICBpZiAoZW5hYmxlVXNlclRpbWluZ0FQSSkge1xuICAgIGlmICghc3VwcG9ydHNVc2VyVGltaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBjb3VudCA9IGVmZmVjdENvdW50SW5DdXJyZW50Q29tbWl0O1xuICAgIGVmZmVjdENvdW50SW5DdXJyZW50Q29tbWl0ID0gMDtcbiAgICBlbmRNYXJrKCcoQ29tbWl0dGluZyBTbmFwc2hvdCBFZmZlY3RzOiAnICsgY291bnQgKyAnIFRvdGFsKScsICcoQ29tbWl0dGluZyBTbmFwc2hvdCBFZmZlY3RzKScsIG51bGwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0Q29tbWl0SG9zdEVmZmVjdHNUaW1lcigpIHtcbiAgaWYgKGVuYWJsZVVzZXJUaW1pbmdBUEkpIHtcbiAgICBpZiAoIXN1cHBvcnRzVXNlclRpbWluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZmZlY3RDb3VudEluQ3VycmVudENvbW1pdCA9IDA7XG4gICAgYmVnaW5NYXJrKCcoQ29tbWl0dGluZyBIb3N0IEVmZmVjdHMpJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcENvbW1pdEhvc3RFZmZlY3RzVGltZXIoKSB7XG4gIGlmIChlbmFibGVVc2VyVGltaW5nQVBJKSB7XG4gICAgaWYgKCFzdXBwb3J0c1VzZXJUaW1pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGNvdW50ID0gZWZmZWN0Q291bnRJbkN1cnJlbnRDb21taXQ7XG4gICAgZWZmZWN0Q291bnRJbkN1cnJlbnRDb21taXQgPSAwO1xuICAgIGVuZE1hcmsoJyhDb21taXR0aW5nIEhvc3QgRWZmZWN0czogJyArIGNvdW50ICsgJyBUb3RhbCknLCAnKENvbW1pdHRpbmcgSG9zdCBFZmZlY3RzKScsIG51bGwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0Q29tbWl0TGlmZUN5Y2xlc1RpbWVyKCkge1xuICBpZiAoZW5hYmxlVXNlclRpbWluZ0FQSSkge1xuICAgIGlmICghc3VwcG9ydHNVc2VyVGltaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVmZmVjdENvdW50SW5DdXJyZW50Q29tbWl0ID0gMDtcbiAgICBiZWdpbk1hcmsoJyhDYWxsaW5nIExpZmVjeWNsZSBNZXRob2RzKScpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0b3BDb21taXRMaWZlQ3ljbGVzVGltZXIoKSB7XG4gIGlmIChlbmFibGVVc2VyVGltaW5nQVBJKSB7XG4gICAgaWYgKCFzdXBwb3J0c1VzZXJUaW1pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGNvdW50ID0gZWZmZWN0Q291bnRJbkN1cnJlbnRDb21taXQ7XG4gICAgZWZmZWN0Q291bnRJbkN1cnJlbnRDb21taXQgPSAwO1xuICAgIGVuZE1hcmsoJyhDYWxsaW5nIExpZmVjeWNsZSBNZXRob2RzOiAnICsgY291bnQgKyAnIFRvdGFsKScsICcoQ2FsbGluZyBMaWZlY3ljbGUgTWV0aG9kcyknLCBudWxsKTtcbiAgfVxufVxuXG52YXIgdmFsdWVTdGFjayA9IFtdO1xuXG52YXIgZmliZXJTdGFjayA9IHZvaWQgMDtcblxue1xuICBmaWJlclN0YWNrID0gW107XG59XG5cbnZhciBpbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjcmVhdGVDdXJzb3IoZGVmYXVsdFZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgY3VycmVudDogZGVmYXVsdFZhbHVlXG4gIH07XG59XG5cbmZ1bmN0aW9uIHBvcChjdXJzb3IsIGZpYmVyKSB7XG4gIGlmIChpbmRleCA8IDApIHtcbiAgICB7XG4gICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdVbmV4cGVjdGVkIHBvcC4nKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIGlmIChmaWJlciAhPT0gZmliZXJTdGFja1tpbmRleF0pIHtcbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1VuZXhwZWN0ZWQgRmliZXIgcG9wcGVkLicpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnNvci5jdXJyZW50ID0gdmFsdWVTdGFja1tpbmRleF07XG5cbiAgdmFsdWVTdGFja1tpbmRleF0gPSBudWxsO1xuXG4gIHtcbiAgICBmaWJlclN0YWNrW2luZGV4XSA9IG51bGw7XG4gIH1cblxuICBpbmRleC0tO1xufVxuXG5mdW5jdGlvbiBwdXNoKGN1cnNvciwgdmFsdWUsIGZpYmVyKSB7XG4gIGluZGV4Kys7XG5cbiAgdmFsdWVTdGFja1tpbmRleF0gPSBjdXJzb3IuY3VycmVudDtcblxuICB7XG4gICAgZmliZXJTdGFja1tpbmRleF0gPSBmaWJlcjtcbiAgfVxuXG4gIGN1cnNvci5jdXJyZW50ID0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNoZWNrVGhhdFN0YWNrSXNFbXB0eSgpIHtcbiAge1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ0V4cGVjdGVkIGFuIGVtcHR5IHN0YWNrLiBTb21ldGhpbmcgd2FzIG5vdCByZXNldCBwcm9wZXJseS4nKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRTdGFja0FmdGVyRmF0YWxFcnJvckluRGV2KCkge1xuICB7XG4gICAgaW5kZXggPSAtMTtcbiAgICB2YWx1ZVN0YWNrLmxlbmd0aCA9IDA7XG4gICAgZmliZXJTdGFjay5sZW5ndGggPSAwO1xuICB9XG59XG5cbnZhciB3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHQgPSB2b2lkIDA7XG5cbntcbiAgd2FybmVkQWJvdXRNaXNzaW5nR2V0Q2hpbGRDb250ZXh0ID0ge307XG59XG5cbnZhciBlbXB0eUNvbnRleHRPYmplY3QgPSB7fTtcbntcbiAgT2JqZWN0LmZyZWV6ZShlbXB0eUNvbnRleHRPYmplY3QpO1xufVxuXG4vLyBBIGN1cnNvciB0byB0aGUgY3VycmVudCBtZXJnZWQgY29udGV4dCBvYmplY3Qgb24gdGhlIHN0YWNrLlxudmFyIGNvbnRleHRTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihlbXB0eUNvbnRleHRPYmplY3QpO1xuLy8gQSBjdXJzb3IgdG8gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29udGV4dCBoYXMgY2hhbmdlZC5cbnZhciBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKGZhbHNlKTtcbi8vIEtlZXAgdHJhY2sgb2YgdGhlIHByZXZpb3VzIGNvbnRleHQgb2JqZWN0IHRoYXQgd2FzIG9uIHRoZSBzdGFjay5cbi8vIFdlIHVzZSB0aGlzIHRvIGdldCBhY2Nlc3MgdG8gdGhlIHBhcmVudCBjb250ZXh0IGFmdGVyIHdlIGhhdmUgYWxyZWFkeVxuLy8gcHVzaGVkIHRoZSBuZXh0IGNvbnRleHQgcHJvdmlkZXIsIGFuZCBub3cgbmVlZCB0byBtZXJnZSB0aGVpciBjb250ZXh0cy5cbnZhciBwcmV2aW91c0NvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbmZ1bmN0aW9uIGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBkaWRQdXNoT3duQ29udGV4dElmUHJvdmlkZXIpIHtcbiAgaWYgKGRpZFB1c2hPd25Db250ZXh0SWZQcm92aWRlciAmJiBpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgLy8gSWYgdGhlIGZpYmVyIGlzIGEgY29udGV4dCBwcm92aWRlciBpdHNlbGYsIHdoZW4gd2UgcmVhZCBpdHMgY29udGV4dFxuICAgIC8vIHdlIG1heSBoYXZlIGFscmVhZHkgcHVzaGVkIGl0cyBvd24gY2hpbGQgY29udGV4dCBvbiB0aGUgc3RhY2suIEEgY29udGV4dFxuICAgIC8vIHByb3ZpZGVyIHNob3VsZCBub3QgXCJzZWVcIiBpdHMgb3duIGNoaWxkIGNvbnRleHQuIFRoZXJlZm9yZSB3ZSByZWFkIHRoZVxuICAgIC8vIHByZXZpb3VzIChwYXJlbnQpIGNvbnRleHQgaW5zdGVhZCBmb3IgYSBjb250ZXh0IHByb3ZpZGVyLlxuICAgIHJldHVybiBwcmV2aW91c0NvbnRleHQ7XG4gIH1cbiAgcmV0dXJuIGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50O1xufVxuXG5mdW5jdGlvbiBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgbWFza2VkQ29udGV4dCkge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQgPSB1bm1hc2tlZENvbnRleHQ7XG4gIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0ID0gbWFza2VkQ29udGV4dDtcbn1cblxuZnVuY3Rpb24gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KSB7XG4gIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgdmFyIGNvbnRleHRUeXBlcyA9IHR5cGUuY29udGV4dFR5cGVzO1xuICBpZiAoIWNvbnRleHRUeXBlcykge1xuICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIH1cblxuICAvLyBBdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyB1bm1hc2tlZCBjb250ZXh0IGhhcyBjaGFuZ2VkLlxuICAvLyBGYWlsaW5nIHRvIGRvIHRoaXMgd2lsbCByZXN1bHQgaW4gdW5uZWNlc3NhcnkgY2FsbHMgdG8gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5cbiAgLy8gVGhpcyBtYXkgdHJpZ2dlciBpbmZpbml0ZSBsb29wcyBpZiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGNhbGxzIHNldFN0YXRlLlxuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0ID09PSB1bm1hc2tlZENvbnRleHQpIHtcbiAgICByZXR1cm4gaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ7XG4gIH1cblxuICB2YXIgY29udGV4dCA9IHt9O1xuICBmb3IgKHZhciBrZXkgaW4gY29udGV4dFR5cGVzKSB7XG4gICAgY29udGV4dFtrZXldID0gdW5tYXNrZWRDb250ZXh0W2tleV07XG4gIH1cblxuICB7XG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKHR5cGUpIHx8ICdVbmtub3duJztcbiAgICBjaGVja1Byb3BUeXBlcyhjb250ZXh0VHlwZXMsIGNvbnRleHQsICdjb250ZXh0JywgbmFtZSwgZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldik7XG4gIH1cblxuICAvLyBDYWNoZSB1bm1hc2tlZCBjb250ZXh0IHNvIHdlIGNhbiBhdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyBuZWNlc3NhcnkuXG4gIC8vIENvbnRleHQgaXMgY3JlYXRlZCBiZWZvcmUgdGhlIGNsYXNzIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQgc28gY2hlY2sgZm9yIGluc3RhbmNlLlxuICBpZiAoaW5zdGFuY2UpIHtcbiAgICBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgY29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gY29udGV4dDtcbn1cblxuZnVuY3Rpb24gaGFzQ29udGV4dENoYW5nZWQoKSB7XG4gIHJldHVybiBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLmN1cnJlbnQ7XG59XG5cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKHR5cGUpIHtcbiAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gdHlwZS5jaGlsZENvbnRleHRUeXBlcztcbiAgcmV0dXJuIGNoaWxkQ29udGV4dFR5cGVzICE9PSBudWxsICYmIGNoaWxkQ29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHBvcENvbnRleHQoZmliZXIpIHtcbiAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwb3BUb3BMZXZlbENvbnRleHRPYmplY3QoZmliZXIpIHtcbiAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGZpYmVyLCBjb250ZXh0LCBkaWRDaGFuZ2UpIHtcbiAgIShjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudCA9PT0gZW1wdHlDb250ZXh0T2JqZWN0KSA/IGludmFyaWFudChmYWxzZSwgJ1VuZXhwZWN0ZWQgY29udGV4dCBmb3VuZCBvbiBzdGFjay4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKSA6IHZvaWQgMDtcblxuICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciwgY29udGV4dCwgZmliZXIpO1xuICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzQ2hpbGRDb250ZXh0KGZpYmVyLCB0eXBlLCBwYXJlbnRDb250ZXh0KSB7XG4gIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gdHlwZS5jaGlsZENvbnRleHRUeXBlcztcblxuICAvLyBUT0RPIChidmF1Z2huKSBSZXBsYWNlIHRoaXMgYmVoYXZpb3Igd2l0aCBhbiBpbnZhcmlhbnQoKSBpbiB0aGUgZnV0dXJlLlxuICAvLyBJdCBoYXMgb25seSBiZWVuIGFkZGVkIGluIEZpYmVyIHRvIG1hdGNoIHRoZSAodW5pbnRlbnRpb25hbCkgYmVoYXZpb3IgaW4gU3RhY2suXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKHR5cGUpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCF3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHRbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgd2FybmVkQWJvdXRNaXNzaW5nR2V0Q2hpbGRDb250ZXh0W2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnJXMuY2hpbGRDb250ZXh0VHlwZXMgaXMgc3BlY2lmaWVkIGJ1dCB0aGVyZSBpcyBubyBnZXRDaGlsZENvbnRleHQoKSBtZXRob2QgJyArICdvbiB0aGUgaW5zdGFuY2UuIFlvdSBjYW4gZWl0aGVyIGRlZmluZSBnZXRDaGlsZENvbnRleHQoKSBvbiAlcyBvciByZW1vdmUgJyArICdjaGlsZENvbnRleHRUeXBlcyBmcm9tIGl0LicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFyZW50Q29udGV4dDtcbiAgfVxuXG4gIHZhciBjaGlsZENvbnRleHQgPSB2b2lkIDA7XG4gIHtcbiAgICBzZXRDdXJyZW50UGhhc2UoJ2dldENoaWxkQ29udGV4dCcpO1xuICB9XG4gIHN0YXJ0UGhhc2VUaW1lcihmaWJlciwgJ2dldENoaWxkQ29udGV4dCcpO1xuICBjaGlsZENvbnRleHQgPSBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQoKTtcbiAgc3RvcFBoYXNlVGltZXIoKTtcbiAge1xuICAgIHNldEN1cnJlbnRQaGFzZShudWxsKTtcbiAgfVxuICBmb3IgKHZhciBjb250ZXh0S2V5IGluIGNoaWxkQ29udGV4dCkge1xuICAgICEoY29udGV4dEtleSBpbiBjaGlsZENvbnRleHRUeXBlcykgPyBpbnZhcmlhbnQoZmFsc2UsICclcy5nZXRDaGlsZENvbnRleHQoKToga2V5IFwiJXNcIiBpcyBub3QgZGVmaW5lZCBpbiBjaGlsZENvbnRleHRUeXBlcy4nLCBnZXRDb21wb25lbnROYW1lKHR5cGUpIHx8ICdVbmtub3duJywgY29udGV4dEtleSkgOiB2b2lkIDA7XG4gIH1cbiAge1xuICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKSB8fCAnVW5rbm93bic7XG4gICAgY2hlY2tQcm9wVHlwZXMoY2hpbGRDb250ZXh0VHlwZXMsIGNoaWxkQ29udGV4dCwgJ2NoaWxkIGNvbnRleHQnLCBuYW1lLFxuICAgIC8vIEluIHByYWN0aWNlLCB0aGVyZSBpcyBvbmUgY2FzZSBpbiB3aGljaCB3ZSB3b24ndCBnZXQgYSBzdGFjay4gSXQncyB3aGVuXG4gICAgLy8gc29tZWJvZHkgY2FsbHMgdW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIoKSBhbmQgd2UgcHJvY2Vzc1xuICAgIC8vIGNvbnRleHQgZnJvbSB0aGUgcGFyZW50IGNvbXBvbmVudCBpbnN0YW5jZS4gVGhlIHN0YWNrIHdpbGwgYmUgbWlzc2luZ1xuICAgIC8vIGJlY2F1c2UgaXQncyBvdXRzaWRlIG9mIHRoZSByZWNvbmNpbGlhdGlvbiwgYW5kIHNvIHRoZSBwb2ludGVyIGhhcyBub3RcbiAgICAvLyBiZWVuIHNldC4gVGhpcyBpcyByYXJlIGFuZCBkb2Vzbid0IG1hdHRlci4gV2UnbGwgYWxzbyByZW1vdmUgdGhhdCBBUEkuXG4gICAgZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldik7XG4gIH1cblxuICByZXR1cm4gX2Fzc2lnbih7fSwgcGFyZW50Q29udGV4dCwgY2hpbGRDb250ZXh0KTtcbn1cblxuZnVuY3Rpb24gcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcykge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIC8vIFdlIHB1c2ggdGhlIGNvbnRleHQgYXMgZWFybHkgYXMgcG9zc2libGUgdG8gZW5zdXJlIHN0YWNrIGludGVncml0eS5cbiAgLy8gSWYgdGhlIGluc3RhbmNlIGRvZXMgbm90IGV4aXN0IHlldCwgd2Ugd2lsbCBwdXNoIG51bGwgYXQgZmlyc3QsXG4gIC8vIGFuZCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBsYXRlciB3aGVuIGludmFsaWRhdGluZyB0aGUgY29udGV4dC5cbiAgdmFyIG1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0ID0gaW5zdGFuY2UgJiYgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgfHwgZW1wdHlDb250ZXh0T2JqZWN0O1xuXG4gIC8vIFJlbWVtYmVyIHRoZSBwYXJlbnQgY29udGV4dCBzbyB3ZSBjYW4gbWVyZ2Ugd2l0aCBpdCBsYXRlci5cbiAgLy8gSW5oZXJpdCB0aGUgcGFyZW50J3MgZGlkLXBlcmZvcm0td29yayB2YWx1ZSB0byBhdm9pZCBpbmFkdmVydGVudGx5IGJsb2NraW5nIHVwZGF0ZXMuXG4gIHByZXZpb3VzQ29udGV4dCA9IGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50O1xuICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciwgbWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLmN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgdHlwZSwgZGlkQ2hhbmdlKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgIWluc3RhbmNlID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgdG8gaGF2ZSBhbiBpbnN0YW5jZSBieSB0aGlzIHBvaW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpIDogdm9pZCAwO1xuXG4gIGlmIChkaWRDaGFuZ2UpIHtcbiAgICAvLyBNZXJnZSBwYXJlbnQgYW5kIG93biBjb250ZXh0LlxuICAgIC8vIFNraXAgdGhpcyBpZiB3ZSdyZSBub3QgdXBkYXRpbmcgZHVlIHRvIHNDVS5cbiAgICAvLyBUaGlzIGF2b2lkcyB1bm5lY2Vzc2FyaWx5IHJlY29tcHV0aW5nIG1lbW9pemVkIHZhbHVlcy5cbiAgICB2YXIgbWVyZ2VkQ29udGV4dCA9IHByb2Nlc3NDaGlsZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHR5cGUsIHByZXZpb3VzQ29udGV4dCk7XG4gICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgPSBtZXJnZWRDb250ZXh0O1xuXG4gICAgLy8gUmVwbGFjZSB0aGUgb2xkIChvciBlbXB0eSkgY29udGV4dCB3aXRoIHRoZSBuZXcgb25lLlxuICAgIC8vIEl0IGlzIGltcG9ydGFudCB0byB1bndpbmQgdGhlIGNvbnRleHQgaW4gdGhlIHJldmVyc2Ugb3JkZXIuXG4gICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIHdvcmtJblByb2dyZXNzKTtcbiAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgLy8gTm93IHB1c2ggdGhlIG5ldyBjb250ZXh0IGFuZCBtYXJrIHRoYXQgaXQgaGFzIGNoYW5nZWQuXG4gICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lcmdlZENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgd29ya0luUHJvZ3Jlc3MpO1xuICB9IGVsc2Uge1xuICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRDaGFuZ2UsIHdvcmtJblByb2dyZXNzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcikge1xuICAvLyBDdXJyZW50bHkgdGhpcyBpcyBvbmx5IHVzZWQgd2l0aCByZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjsgbm90IHN1cmUgaWYgaXRcbiAgLy8gbWFrZXMgc2Vuc2UgZWxzZXdoZXJlXG4gICEoaXNGaWJlck1vdW50ZWQoZmliZXIpICYmIGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgc3VidHJlZSBwYXJlbnQgdG8gYmUgYSBtb3VudGVkIGNsYXNzIGNvbXBvbmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKSA6IHZvaWQgMDtcblxuICB2YXIgbm9kZSA9IGZpYmVyO1xuICBkbyB7XG4gICAgc3dpdGNoIChub2RlLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlLmNvbnRleHQ7XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIENvbXBvbmVudCA9IG5vZGUudHlwZTtcbiAgICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gIH0gd2hpbGUgKG5vZGUgIT09IG51bGwpO1xuICBpbnZhcmlhbnQoZmFsc2UsICdGb3VuZCB1bmV4cGVjdGVkIGRldGFjaGVkIHN1YnRyZWUgcGFyZW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG52YXIgb25Db21taXRGaWJlclJvb3QgPSBudWxsO1xudmFyIG9uQ29tbWl0RmliZXJVbm1vdW50ID0gbnVsbDtcbnZhciBoYXNMb2dnZWRFcnJvciA9IGZhbHNlO1xuXG5mdW5jdGlvbiBjYXRjaEVycm9ycyhmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKGFyZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZm4oYXJnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICh0cnVlICYmICFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG4gICAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1JlYWN0IERldlRvb2xzIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG52YXIgaXNEZXZUb29sc1ByZXNlbnQgPSB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJztcblxuZnVuY3Rpb24gaW5qZWN0SW50ZXJuYWxzKGludGVybmFscykge1xuICBpZiAodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBObyBEZXZUb29sc1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgaG9vayA9IF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcbiAgaWYgKGhvb2suaXNEaXNhYmxlZCkge1xuICAgIC8vIFRoaXMgaXNuJ3QgYSByZWFsIHByb3BlcnR5IG9uIHRoZSBob29rLCBidXQgaXQgY2FuIGJlIHNldCB0byBvcHQgb3V0XG4gICAgLy8gb2YgRGV2VG9vbHMgaW50ZWdyYXRpb24gYW5kIGFzc29jaWF0ZWQgd2FybmluZ3MgYW5kIGxvZ3MuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zODc3XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCFob29rLnN1cHBvcnRzRmliZXIpIHtcbiAgICB7XG4gICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdUaGUgaW5zdGFsbGVkIHZlcnNpb24gb2YgUmVhY3QgRGV2VG9vbHMgaXMgdG9vIG9sZCBhbmQgd2lsbCBub3Qgd29yayAnICsgJ3dpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBSZWFjdC4gUGxlYXNlIHVwZGF0ZSBSZWFjdCBEZXZUb29scy4gJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWRldnRvb2xzJyk7XG4gICAgfVxuICAgIC8vIERldlRvb2xzIGV4aXN0cywgZXZlbiB0aG91Z2ggaXQgZG9lc24ndCBzdXBwb3J0IEZpYmVyLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHRyeSB7XG4gICAgdmFyIHJlbmRlcmVySUQgPSBob29rLmluamVjdChpbnRlcm5hbHMpO1xuICAgIC8vIFdlIGhhdmUgc3VjY2Vzc2Z1bGx5IGluamVjdGVkLCBzbyBub3cgaXQgaXMgc2FmZSB0byBzZXQgdXAgaG9va3MuXG4gICAgb25Db21taXRGaWJlclJvb3QgPSBjYXRjaEVycm9ycyhmdW5jdGlvbiAocm9vdCkge1xuICAgICAgcmV0dXJuIGhvb2sub25Db21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCk7XG4gICAgfSk7XG4gICAgb25Db21taXRGaWJlclVubW91bnQgPSBjYXRjaEVycm9ycyhmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgIHJldHVybiBob29rLm9uQ29tbWl0RmliZXJVbm1vdW50KHJlbmRlcmVySUQsIGZpYmVyKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gQ2F0Y2ggYWxsIGVycm9ycyBiZWNhdXNlIGl0IGlzIHVuc2FmZSB0byB0aHJvdyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uXG4gICAge1xuICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnUmVhY3QgRGV2VG9vbHMgZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzLicsIGVycik7XG4gICAgfVxuICB9XG4gIC8vIERldlRvb2xzIGV4aXN0c1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gb25Db21taXRSb290KHJvb3QpIHtcbiAgaWYgKHR5cGVvZiBvbkNvbW1pdEZpYmVyUm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG9uQ29tbWl0RmliZXJSb290KHJvb3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9uQ29tbWl0VW5tb3VudChmaWJlcikge1xuICBpZiAodHlwZW9mIG9uQ29tbWl0RmliZXJVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgb25Db21taXRGaWJlclVubW91bnQoZmliZXIpO1xuICB9XG59XG5cbi8vIE1heCAzMSBiaXQgaW50ZWdlci4gVGhlIG1heCBpbnRlZ2VyIHNpemUgaW4gVjggZm9yIDMyLWJpdCBzeXN0ZW1zLlxuLy8gTWF0aC5wb3coMiwgMzApIC0gMVxuLy8gMGIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFcbnZhciBtYXhTaWduZWQzMUJpdEludCA9IDEwNzM3NDE4MjM7XG5cbnZhciBOb1dvcmsgPSAwO1xudmFyIE5ldmVyID0gMTtcbnZhciBTeW5jID0gbWF4U2lnbmVkMzFCaXRJbnQ7XG5cbnZhciBVTklUX1NJWkUgPSAxMDtcbnZhciBNQUdJQ19OVU1CRVJfT0ZGU0VUID0gbWF4U2lnbmVkMzFCaXRJbnQgLSAxO1xuXG4vLyAxIHVuaXQgb2YgZXhwaXJhdGlvbiB0aW1lIHJlcHJlc2VudHMgMTBtcy5cbmZ1bmN0aW9uIG1zVG9FeHBpcmF0aW9uVGltZShtcykge1xuICAvLyBBbHdheXMgYWRkIGFuIG9mZnNldCBzbyB0aGF0IHdlIGRvbid0IGNsYXNoIHdpdGggdGhlIG1hZ2ljIG51bWJlciBmb3IgTm9Xb3JrLlxuICByZXR1cm4gTUFHSUNfTlVNQkVSX09GRlNFVCAtIChtcyAvIFVOSVRfU0laRSB8IDApO1xufVxuXG5mdW5jdGlvbiBleHBpcmF0aW9uVGltZVRvTXMoZXhwaXJhdGlvblRpbWUpIHtcbiAgcmV0dXJuIChNQUdJQ19OVU1CRVJfT0ZGU0VUIC0gZXhwaXJhdGlvblRpbWUpICogVU5JVF9TSVpFO1xufVxuXG5mdW5jdGlvbiBjZWlsaW5nKG51bSwgcHJlY2lzaW9uKSB7XG4gIHJldHVybiAoKG51bSAvIHByZWNpc2lvbiB8IDApICsgMSkgKiBwcmVjaXNpb247XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVFeHBpcmF0aW9uQnVja2V0KGN1cnJlbnRUaW1lLCBleHBpcmF0aW9uSW5NcywgYnVja2V0U2l6ZU1zKSB7XG4gIHJldHVybiBNQUdJQ19OVU1CRVJfT0ZGU0VUIC0gY2VpbGluZyhNQUdJQ19OVU1CRVJfT0ZGU0VUIC0gY3VycmVudFRpbWUgKyBleHBpcmF0aW9uSW5NcyAvIFVOSVRfU0laRSwgYnVja2V0U2l6ZU1zIC8gVU5JVF9TSVpFKTtcbn1cblxudmFyIExPV19QUklPUklUWV9FWFBJUkFUSU9OID0gNTAwMDtcbnZhciBMT1dfUFJJT1JJVFlfQkFUQ0hfU0laRSA9IDI1MDtcblxuZnVuY3Rpb24gY29tcHV0ZUFzeW5jRXhwaXJhdGlvbihjdXJyZW50VGltZSkge1xuICByZXR1cm4gY29tcHV0ZUV4cGlyYXRpb25CdWNrZXQoY3VycmVudFRpbWUsIExPV19QUklPUklUWV9FWFBJUkFUSU9OLCBMT1dfUFJJT1JJVFlfQkFUQ0hfU0laRSk7XG59XG5cbi8vIFdlIGludGVudGlvbmFsbHkgc2V0IGEgaGlnaGVyIGV4cGlyYXRpb24gdGltZSBmb3IgaW50ZXJhY3RpdmUgdXBkYXRlcyBpblxuLy8gZGV2IHRoYW4gaW4gcHJvZHVjdGlvbi5cbi8vXG4vLyBJZiB0aGUgbWFpbiB0aHJlYWQgaXMgYmVpbmcgYmxvY2tlZCBzbyBsb25nIHRoYXQgeW91IGhpdCB0aGUgZXhwaXJhdGlvbixcbi8vIGl0J3MgYSBwcm9ibGVtIHRoYXQgY291bGQgYmUgc29sdmVkIHdpdGggYmV0dGVyIHNjaGVkdWxpbmcuXG4vL1xuLy8gUGVvcGxlIHdpbGwgYmUgbW9yZSBsaWtlbHkgdG8gbm90aWNlIHRoaXMgYW5kIGZpeCBpdCB3aXRoIHRoZSBsb25nXG4vLyBleHBpcmF0aW9uIHRpbWUgaW4gZGV2ZWxvcG1lbnQuXG4vL1xuLy8gSW4gcHJvZHVjdGlvbiB3ZSBvcHQgZm9yIGJldHRlciBVWCBhdCB0aGUgcmlzayBvZiBtYXNraW5nIHNjaGVkdWxpbmdcbi8vIHByb2JsZW1zLCBieSBleHBpcmluZyBmYXN0LlxudmFyIEhJR0hfUFJJT1JJVFlfRVhQSVJBVElPTiA9IDUwMDtcbnZhciBISUdIX1BSSU9SSVRZX0JBVENIX1NJWkUgPSAxMDA7XG5cbmZ1bmN0aW9uIGNvbXB1dGVJbnRlcmFjdGl2ZUV4cGlyYXRpb24oY3VycmVudFRpbWUpIHtcbiAgcmV0dXJuIGNvbXB1dGVFeHBpcmF0aW9uQnVja2V0KGN1cnJlbnRUaW1lLCBISUdIX1BSSU9SSVRZX0VYUElSQVRJT04sIEhJR0hfUFJJT1JJVFlfQkFUQ0hfU0laRSk7XG59XG5cbnZhciBOb0NvbnRleHQgPSAwO1xudmFyIENvbmN1cnJlbnRNb2RlID0gMTtcbnZhciBTdHJpY3RNb2RlID0gMjtcbnZhciBQcm9maWxlTW9kZSA9IDQ7XG5cbnZhciBoYXNCYWRNYXBQb2x5ZmlsbCA9IHZvaWQgMDtcblxue1xuICBoYXNCYWRNYXBQb2x5ZmlsbCA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBub25FeHRlbnNpYmxlT2JqZWN0ID0gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KTtcbiAgICB2YXIgdGVzdE1hcCA9IG5ldyBNYXAoW1tub25FeHRlbnNpYmxlT2JqZWN0LCBudWxsXV0pO1xuICAgIHZhciB0ZXN0U2V0ID0gbmV3IFNldChbbm9uRXh0ZW5zaWJsZU9iamVjdF0pO1xuICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBSb2xsdXAgdG8gbm90IGNvbnNpZGVyIHRoZXNlIHVudXNlZC5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcm9sbHVwL3JvbGx1cC9pc3N1ZXMvMTc3MVxuICAgIC8vIFRPRE86IHdlIGNhbiByZW1vdmUgdGhlc2UgaWYgUm9sbHVwIGZpeGVzIHRoZSBidWcuXG4gICAgdGVzdE1hcC5zZXQoMCwgMCk7XG4gICAgdGVzdFNldC5hZGQoMCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBUT0RPOiBDb25zaWRlciB3YXJuaW5nIGFib3V0IGJhZCBwb2x5ZmlsbHNcbiAgICBoYXNCYWRNYXBQb2x5ZmlsbCA9IHRydWU7XG4gIH1cbn1cblxuLy8gQSBGaWJlciBpcyB3b3JrIG9uIGEgQ29tcG9uZW50IHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBvciB3YXMgZG9uZS4gVGhlcmUgY2FuXG4vLyBiZSBtb3JlIHRoYW4gb25lIHBlciBjb21wb25lbnQuXG5cblxudmFyIGRlYnVnQ291bnRlciA9IHZvaWQgMDtcblxue1xuICBkZWJ1Z0NvdW50ZXIgPSAxO1xufVxuXG5mdW5jdGlvbiBGaWJlck5vZGUodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSkge1xuICAvLyBJbnN0YW5jZVxuICB0aGlzLnRhZyA9IHRhZztcbiAgdGhpcy5rZXkgPSBrZXk7XG4gIHRoaXMuZWxlbWVudFR5cGUgPSBudWxsO1xuICB0aGlzLnR5cGUgPSBudWxsO1xuICB0aGlzLnN0YXRlTm9kZSA9IG51bGw7XG5cbiAgLy8gRmliZXJcbiAgdGhpcy5yZXR1cm4gPSBudWxsO1xuICB0aGlzLmNoaWxkID0gbnVsbDtcbiAgdGhpcy5zaWJsaW5nID0gbnVsbDtcbiAgdGhpcy5pbmRleCA9IDA7XG5cbiAgdGhpcy5yZWYgPSBudWxsO1xuXG4gIHRoaXMucGVuZGluZ1Byb3BzID0gcGVuZGluZ1Byb3BzO1xuICB0aGlzLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICB0aGlzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgdGhpcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgdGhpcy5jb250ZXh0RGVwZW5kZW5jaWVzID0gbnVsbDtcblxuICB0aGlzLm1vZGUgPSBtb2RlO1xuXG4gIC8vIEVmZmVjdHNcbiAgdGhpcy5lZmZlY3RUYWcgPSBOb0VmZmVjdDtcbiAgdGhpcy5uZXh0RWZmZWN0ID0gbnVsbDtcblxuICB0aGlzLmZpcnN0RWZmZWN0ID0gbnVsbDtcbiAgdGhpcy5sYXN0RWZmZWN0ID0gbnVsbDtcblxuICB0aGlzLmV4cGlyYXRpb25UaW1lID0gTm9Xb3JrO1xuICB0aGlzLmNoaWxkRXhwaXJhdGlvblRpbWUgPSBOb1dvcms7XG5cbiAgdGhpcy5hbHRlcm5hdGUgPSBudWxsO1xuXG4gIGlmIChlbmFibGVQcm9maWxlclRpbWVyKSB7XG4gICAgLy8gTm90ZTogVGhlIGZvbGxvd2luZyBpcyBkb25lIHRvIGF2b2lkIGEgdjggcGVyZm9ybWFuY2UgY2xpZmYuXG4gICAgLy9cbiAgICAvLyBJbml0aWFsaXppbmcgdGhlIGZpZWxkcyBiZWxvdyB0byBzbWlzIGFuZCBsYXRlciB1cGRhdGluZyB0aGVtIHdpdGhcbiAgICAvLyBkb3VibGUgdmFsdWVzIHdpbGwgY2F1c2UgRmliZXJzIHRvIGVuZCB1cCBoYXZpbmcgc2VwYXJhdGUgc2hhcGVzLlxuICAgIC8vIFRoaXMgYmVoYXZpb3IvYnVnIGhhcyBzb21ldGhpbmcgdG8gZG8gd2l0aCBPYmplY3QucHJldmVudEV4dGVuc2lvbigpLlxuICAgIC8vIEZvcnR1bmF0ZWx5IHRoaXMgb25seSBpbXBhY3RzIERFViBidWlsZHMuXG4gICAgLy8gVW5mb3J0dW5hdGVseSBpdCBtYWtlcyBSZWFjdCB1bnVzYWJseSBzbG93IGZvciBzb21lIGFwcGxpY2F0aW9ucy5cbiAgICAvLyBUbyB3b3JrIGFyb3VuZCB0aGlzLCBpbml0aWFsaXplIHRoZSBmaWVsZHMgYmVsb3cgd2l0aCBkb3VibGVzLlxuICAgIC8vXG4gICAgLy8gTGVhcm4gbW9yZSBhYm91dCB0aGlzIGhlcmU6XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNDM2NVxuICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTg1MzhcbiAgICB0aGlzLmFjdHVhbER1cmF0aW9uID0gTnVtYmVyLk5hTjtcbiAgICB0aGlzLmFjdHVhbFN0YXJ0VGltZSA9IE51bWJlci5OYU47XG4gICAgdGhpcy5zZWxmQmFzZUR1cmF0aW9uID0gTnVtYmVyLk5hTjtcbiAgICB0aGlzLnRyZWVCYXNlRHVyYXRpb24gPSBOdW1iZXIuTmFOO1xuXG4gICAgLy8gSXQncyBva2F5IHRvIHJlcGxhY2UgdGhlIGluaXRpYWwgZG91YmxlcyB3aXRoIHNtaXMgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXG4gICAgLy8gVGhpcyB3b24ndCB0cmlnZ2VyIHRoZSBwZXJmb3JtYW5jZSBjbGlmZiBtZW50aW9uZWQgYWJvdmUsXG4gICAgLy8gYW5kIGl0IHNpbXBsaWZpZXMgb3RoZXIgcHJvZmlsZXIgY29kZSAoaW5jbHVkaW5nIERldlRvb2xzKS5cbiAgICB0aGlzLmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICB0aGlzLmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgIHRoaXMuc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgdGhpcy50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgfVxuXG4gIHtcbiAgICB0aGlzLl9kZWJ1Z0lEID0gZGVidWdDb3VudGVyKys7XG4gICAgdGhpcy5fZGVidWdTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuX2RlYnVnT3duZXIgPSBudWxsO1xuICAgIHRoaXMuX2RlYnVnSXNDdXJyZW50bHlUaW1pbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9kZWJ1Z0hvb2tUeXBlcyA9IG51bGw7XG4gICAgaWYgKCFoYXNCYWRNYXBQb2x5ZmlsbCAmJiB0eXBlb2YgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnModGhpcyk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRoaXMgaXMgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiwgcmF0aGVyIHRoYW4gYSBQT0pPIGNvbnN0cnVjdG9yLCBzdGlsbFxuLy8gcGxlYXNlIGVuc3VyZSB3ZSBkbyB0aGUgZm9sbG93aW5nOlxuLy8gMSkgTm9ib2R5IHNob3VsZCBhZGQgYW55IGluc3RhbmNlIG1ldGhvZHMgb24gdGhpcy4gSW5zdGFuY2UgbWV0aG9kcyBjYW4gYmVcbi8vICAgIG1vcmUgZGlmZmljdWx0IHRvIHByZWRpY3Qgd2hlbiB0aGV5IGdldCBvcHRpbWl6ZWQgYW5kIHRoZXkgYXJlIGFsbW9zdFxuLy8gICAgbmV2ZXIgaW5saW5lZCBwcm9wZXJseSBpbiBzdGF0aWMgY29tcGlsZXJzLlxuLy8gMikgTm9ib2R5IHNob3VsZCByZWx5IG9uIGBpbnN0YW5jZW9mIEZpYmVyYCBmb3IgdHlwZSB0ZXN0aW5nLiBXZSBzaG91bGRcbi8vICAgIGFsd2F5cyBrbm93IHdoZW4gaXQgaXMgYSBmaWJlci5cbi8vIDMpIFdlIG1pZ2h0IHdhbnQgdG8gZXhwZXJpbWVudCB3aXRoIHVzaW5nIG51bWVyaWMga2V5cyBzaW5jZSB0aGV5IGFyZSBlYXNpZXJcbi8vICAgIHRvIG9wdGltaXplIGluIGEgbm9uLUpJVCBlbnZpcm9ubWVudC5cbi8vIDQpIFdlIGNhbiBlYXNpbHkgZ28gZnJvbSBhIGNvbnN0cnVjdG9yIHRvIGEgY3JlYXRlRmliZXIgb2JqZWN0IGxpdGVyYWwgaWYgdGhhdFxuLy8gICAgaXMgZmFzdGVyLlxuLy8gNSkgSXQgc2hvdWxkIGJlIGVhc3kgdG8gcG9ydCB0aGlzIHRvIGEgQyBzdHJ1Y3QgYW5kIGtlZXAgYSBDIGltcGxlbWVudGF0aW9uXG4vLyAgICBjb21wYXRpYmxlLlxudmFyIGNyZWF0ZUZpYmVyID0gZnVuY3Rpb24gKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpIHtcbiAgLy8gJEZsb3dGaXhNZTogdGhlIHNoYXBlcyBhcmUgZXhhY3QgaGVyZSBidXQgRmxvdyBkb2Vzbid0IGxpa2UgY29uc3RydWN0b3JzXG4gIHJldHVybiBuZXcgRmliZXJOb2RlKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xufTtcblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGlzU2ltcGxlRnVuY3Rpb25Db21wb25lbnQodHlwZSkge1xuICByZXR1cm4gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgJiYgIXNob3VsZENvbnN0cnVjdCh0eXBlKSAmJiB0eXBlLmRlZmF1bHRQcm9wcyA9PT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlTGF6eUNvbXBvbmVudFRhZyhDb21wb25lbnQpIHtcbiAgaWYgKHR5cGVvZiBDb21wb25lbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkgPyBDbGFzc0NvbXBvbmVudCA6IEZ1bmN0aW9uQ29tcG9uZW50O1xuICB9IGVsc2UgaWYgKENvbXBvbmVudCAhPT0gdW5kZWZpbmVkICYmIENvbXBvbmVudCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IENvbXBvbmVudC4kJHR5cGVvZjtcbiAgICBpZiAoJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUpIHtcbiAgICAgIHJldHVybiBGb3J3YXJkUmVmO1xuICAgIH1cbiAgICBpZiAoJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgcmV0dXJuIE1lbW9Db21wb25lbnQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBJbmRldGVybWluYXRlQ29tcG9uZW50O1xufVxuXG4vLyBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIGFuIGFsdGVybmF0ZSBmaWJlciB0byBkbyB3b3JrIG9uLlxuZnVuY3Rpb24gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudCwgcGVuZGluZ1Byb3BzLCBleHBpcmF0aW9uVGltZSkge1xuICB2YXIgd29ya0luUHJvZ3Jlc3MgPSBjdXJyZW50LmFsdGVybmF0ZTtcbiAgaWYgKHdvcmtJblByb2dyZXNzID09PSBudWxsKSB7XG4gICAgLy8gV2UgdXNlIGEgZG91YmxlIGJ1ZmZlcmluZyBwb29saW5nIHRlY2huaXF1ZSBiZWNhdXNlIHdlIGtub3cgdGhhdCB3ZSdsbFxuICAgIC8vIG9ubHkgZXZlciBuZWVkIGF0IG1vc3QgdHdvIHZlcnNpb25zIG9mIGEgdHJlZS4gV2UgcG9vbCB0aGUgXCJvdGhlclwiIHVudXNlZFxuICAgIC8vIG5vZGUgdGhhdCB3ZSdyZSBmcmVlIHRvIHJldXNlLiBUaGlzIGlzIGxhemlseSBjcmVhdGVkIHRvIGF2b2lkIGFsbG9jYXRpbmdcbiAgICAvLyBleHRyYSBvYmplY3RzIGZvciB0aGluZ3MgdGhhdCBhcmUgbmV2ZXIgdXBkYXRlZC4gSXQgYWxzbyBhbGxvdyB1cyB0b1xuICAgIC8vIHJlY2xhaW0gdGhlIGV4dHJhIG1lbW9yeSBpZiBuZWVkZWQuXG4gICAgd29ya0luUHJvZ3Jlc3MgPSBjcmVhdGVGaWJlcihjdXJyZW50LnRhZywgcGVuZGluZ1Byb3BzLCBjdXJyZW50LmtleSwgY3VycmVudC5tb2RlKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9IGN1cnJlbnQuZWxlbWVudFR5cGU7XG4gICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjdXJyZW50LnN0YXRlTm9kZTtcblxuICAgIHtcbiAgICAgIC8vIERFVi1vbmx5IGZpZWxkc1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSUQgPSBjdXJyZW50Ll9kZWJ1Z0lEO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnU291cmNlID0gY3VycmVudC5fZGVidWdTb3VyY2U7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdPd25lciA9IGN1cnJlbnQuX2RlYnVnT3duZXI7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdIb29rVHlwZXMgPSBjdXJyZW50Ll9kZWJ1Z0hvb2tUeXBlcztcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBjdXJyZW50O1xuICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gd29ya0luUHJvZ3Jlc3M7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzID0gcGVuZGluZ1Byb3BzO1xuXG4gICAgLy8gV2UgYWxyZWFkeSBoYXZlIGFuIGFsdGVybmF0ZS5cbiAgICAvLyBSZXNldCB0aGUgZWZmZWN0IHRhZy5cbiAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgPSBOb0VmZmVjdDtcblxuICAgIC8vIFRoZSBlZmZlY3QgbGlzdCBpcyBubyBsb25nZXIgdmFsaWQuXG4gICAgd29ya0luUHJvZ3Jlc3MubmV4dEVmZmVjdCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmlyc3RFZmZlY3QgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLmxhc3RFZmZlY3QgPSBudWxsO1xuXG4gICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIpIHtcbiAgICAgIC8vIFdlIGludGVudGlvbmFsbHkgcmVzZXQsIHJhdGhlciB0aGFuIGNvcHksIGFjdHVhbER1cmF0aW9uICYgYWN0dWFsU3RhcnRUaW1lLlxuICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aW1lIGZyb20gZW5kbGVzc2x5IGFjY3VtdWxhdGluZyBpbiBuZXcgY29tbWl0cy5cbiAgICAgIC8vIFRoaXMgaGFzIHRoZSBkb3duc2lkZSBvZiByZXNldHRpbmcgdmFsdWVzIGZvciBkaWZmZXJlbnQgcHJpb3JpdHkgcmVuZGVycyxcbiAgICAgIC8vIEJ1dCB3b3JrcyBmb3IgeWllbGRpbmcgKHRoZSBjb21tb24gY2FzZSkgYW5kIHNob3VsZCBzdXBwb3J0IHJlc3VtaW5nLlxuICAgICAgd29ya0luUHJvZ3Jlc3MuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgfVxuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGRFeHBpcmF0aW9uVGltZSA9IGN1cnJlbnQuY2hpbGRFeHBpcmF0aW9uVGltZTtcbiAgd29ya0luUHJvZ3Jlc3MuZXhwaXJhdGlvblRpbWUgPSBjdXJyZW50LmV4cGlyYXRpb25UaW1lO1xuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuICB3b3JrSW5Qcm9ncmVzcy5jb250ZXh0RGVwZW5kZW5jaWVzID0gY3VycmVudC5jb250ZXh0RGVwZW5kZW5jaWVzO1xuXG4gIC8vIFRoZXNlIHdpbGwgYmUgb3ZlcnJpZGRlbiBkdXJpbmcgdGhlIHBhcmVudCdzIHJlY29uY2lsaWF0aW9uXG4gIHdvcmtJblByb2dyZXNzLnNpYmxpbmcgPSBjdXJyZW50LnNpYmxpbmc7XG4gIHdvcmtJblByb2dyZXNzLmluZGV4ID0gY3VycmVudC5pbmRleDtcbiAgd29ya0luUHJvZ3Jlc3MucmVmID0gY3VycmVudC5yZWY7XG5cbiAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIpIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50LnRyZWVCYXNlRHVyYXRpb247XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhvc3RSb290RmliZXIoaXNDb25jdXJyZW50KSB7XG4gIHZhciBtb2RlID0gaXNDb25jdXJyZW50ID8gQ29uY3VycmVudE1vZGUgfCBTdHJpY3RNb2RlIDogTm9Db250ZXh0O1xuXG4gIGlmIChlbmFibGVQcm9maWxlclRpbWVyICYmIGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgLy8gQWx3YXlzIGNvbGxlY3QgcHJvZmlsZSB0aW1pbmdzIHdoZW4gRGV2VG9vbHMgYXJlIHByZXNlbnQuXG4gICAgLy8gVGhpcyBlbmFibGVzIERldlRvb2xzIHRvIHN0YXJ0IGNhcHR1cmluZyB0aW1pbmcgYXQgYW55IHBvaW504oCTXG4gICAgLy8gV2l0aG91dCBzb21lIG5vZGVzIGluIHRoZSB0cmVlIGhhdmluZyBlbXB0eSBiYXNlIHRpbWVzLlxuICAgIG1vZGUgfD0gUHJvZmlsZU1vZGU7XG4gIH1cblxuICByZXR1cm4gY3JlYXRlRmliZXIoSG9zdFJvb3QsIG51bGwsIG51bGwsIG1vZGUpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHModHlwZSwgLy8gUmVhY3QkRWxlbWVudFR5cGVcbmtleSwgcGVuZGluZ1Byb3BzLCBvd25lciwgbW9kZSwgZXhwaXJhdGlvblRpbWUpIHtcbiAgdmFyIGZpYmVyID0gdm9pZCAwO1xuXG4gIHZhciBmaWJlclRhZyA9IEluZGV0ZXJtaW5hdGVDb21wb25lbnQ7XG4gIC8vIFRoZSByZXNvbHZlZCB0eXBlIGlzIHNldCBpZiB3ZSBrbm93IHdoYXQgdGhlIGZpbmFsIHR5cGUgd2lsbCBiZS4gSS5lLiBpdCdzIG5vdCBsYXp5LlxuICB2YXIgcmVzb2x2ZWRUeXBlID0gdHlwZTtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHNob3VsZENvbnN0cnVjdCh0eXBlKSkge1xuICAgICAgZmliZXJUYWcgPSBDbGFzc0NvbXBvbmVudDtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgZmliZXJUYWcgPSBIb3N0Q29tcG9uZW50O1xuICB9IGVsc2Uge1xuICAgIGdldFRhZzogc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21GcmFnbWVudChwZW5kaW5nUHJvcHMuY2hpbGRyZW4sIG1vZGUsIGV4cGlyYXRpb25UaW1lLCBrZXkpO1xuICAgICAgY2FzZSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbU1vZGUocGVuZGluZ1Byb3BzLCBtb2RlIHwgQ29uY3VycmVudE1vZGUgfCBTdHJpY3RNb2RlLCBleHBpcmF0aW9uVGltZSwga2V5KTtcbiAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbU1vZGUocGVuZGluZ1Byb3BzLCBtb2RlIHwgU3RyaWN0TW9kZSwgZXhwaXJhdGlvblRpbWUsIGtleSk7XG4gICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21Qcm9maWxlcihwZW5kaW5nUHJvcHMsIG1vZGUsIGV4cGlyYXRpb25UaW1lLCBrZXkpO1xuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2UocGVuZGluZ1Byb3BzLCBtb2RlLCBleHBpcmF0aW9uVGltZSwga2V5KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBDb250ZXh0UHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgY29uc3VtZXJcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IENvbnRleHRDb25zdW1lcjtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IEZvcndhcmRSZWY7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IE1lbW9Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IExhenlDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRUeXBlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBpbmZvID0gJyc7XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgXCIgKyAnbmFtZWQgaW1wb3J0cy4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG93bmVyTmFtZSA9IG93bmVyID8gZ2V0Q29tcG9uZW50TmFtZShvd25lci50eXBlKSA6IG51bGw7XG4gICAgICAgICAgICBpZiAob3duZXJOYW1lKSB7XG4gICAgICAgICAgICAgIGluZm8gKz0gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgb3duZXJOYW1lICsgJ2AuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaW52YXJpYW50KGZhbHNlLCAnRWxlbWVudCB0eXBlIGlzIGludmFsaWQ6IGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSBjb21wb25lbnRzKSBidXQgZ290OiAlcy4lcycsIHR5cGUgPT0gbnVsbCA/IHR5cGUgOiB0eXBlb2YgdHlwZSwgaW5mbyk7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmaWJlciA9IGNyZWF0ZUZpYmVyKGZpYmVyVGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gdHlwZTtcbiAgZmliZXIudHlwZSA9IHJlc29sdmVkVHlwZTtcbiAgZmliZXIuZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTtcblxuICByZXR1cm4gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoZWxlbWVudCwgbW9kZSwgZXhwaXJhdGlvblRpbWUpIHtcbiAgdmFyIG93bmVyID0gbnVsbDtcbiAge1xuICAgIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gIH1cbiAgdmFyIHR5cGUgPSBlbGVtZW50LnR5cGU7XG4gIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgdmFyIHBlbmRpbmdQcm9wcyA9IGVsZW1lbnQucHJvcHM7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh0eXBlLCBrZXksIHBlbmRpbmdQcm9wcywgb3duZXIsIG1vZGUsIGV4cGlyYXRpb25UaW1lKTtcbiAge1xuICAgIGZpYmVyLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICBmaWJlci5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICB9XG4gIHJldHVybiBmaWJlcjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZWxlbWVudHMsIG1vZGUsIGV4cGlyYXRpb25UaW1lLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoRnJhZ21lbnQsIGVsZW1lbnRzLCBrZXksIG1vZGUpO1xuICBmaWJlci5leHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lO1xuICByZXR1cm4gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVByb2ZpbGVyKHBlbmRpbmdQcm9wcywgbW9kZSwgZXhwaXJhdGlvblRpbWUsIGtleSkge1xuICB7XG4gICAgaWYgKHR5cGVvZiBwZW5kaW5nUHJvcHMuaWQgIT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwZW5kaW5nUHJvcHMub25SZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1Byb2ZpbGVyIG11c3Qgc3BlY2lmeSBhbiBcImlkXCIgc3RyaW5nIGFuZCBcIm9uUmVuZGVyXCIgZnVuY3Rpb24gYXMgcHJvcHMnKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihQcm9maWxlciwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUgfCBQcm9maWxlTW9kZSk7XG4gIC8vIFRPRE86IFRoZSBQcm9maWxlciBmaWJlciBzaG91bGRuJ3QgaGF2ZSBhIHR5cGUuIEl0IGhhcyBhIHRhZy5cbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuICBmaWJlci50eXBlID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbiAgZmliZXIuZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTtcblxuICByZXR1cm4gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbU1vZGUocGVuZGluZ1Byb3BzLCBtb2RlLCBleHBpcmF0aW9uVGltZSwga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKE1vZGUsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcblxuICAvLyBUT0RPOiBUaGUgTW9kZSBmaWJlciBzaG91bGRuJ3QgaGF2ZSBhIHR5cGUuIEl0IGhhcyBhIHRhZy5cbiAgdmFyIHR5cGUgPSAobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Db250ZXh0ID8gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA6IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IHR5cGU7XG4gIGZpYmVyLnR5cGUgPSB0eXBlO1xuXG4gIGZpYmVyLmV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gIHJldHVybiBmaWJlcjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2UocGVuZGluZ1Byb3BzLCBtb2RlLCBleHBpcmF0aW9uVGltZSwga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKFN1c3BlbnNlQ29tcG9uZW50LCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG5cbiAgLy8gVE9ETzogVGhlIFN1c3BlbnNlQ29tcG9uZW50IGZpYmVyIHNob3VsZG4ndCBoYXZlIGEgdHlwZS4gSXQgaGFzIGEgdGFnLlxuICB2YXIgdHlwZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gdHlwZTtcbiAgZmliZXIudHlwZSA9IHR5cGU7XG5cbiAgZmliZXIuZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTtcbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UZXh0KGNvbnRlbnQsIG1vZGUsIGV4cGlyYXRpb25UaW1lKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RUZXh0LCBjb250ZW50LCBudWxsLCBtb2RlKTtcbiAgZmliZXIuZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTtcbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21Ib3N0SW5zdGFuY2VGb3JEZWxldGlvbigpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoSG9zdENvbXBvbmVudCwgbnVsbCwgbnVsbCwgTm9Db250ZXh0KTtcbiAgLy8gVE9ETzogVGhlc2Ugc2hvdWxkIG5vdCBuZWVkIGEgdHlwZS5cbiAgZmliZXIuZWxlbWVudFR5cGUgPSAnREVMRVRFRCc7XG4gIGZpYmVyLnR5cGUgPSAnREVMRVRFRCc7XG4gIHJldHVybiBmaWJlcjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgbW9kZSwgZXhwaXJhdGlvblRpbWUpIHtcbiAgdmFyIHBlbmRpbmdQcm9wcyA9IHBvcnRhbC5jaGlsZHJlbiAhPT0gbnVsbCA/IHBvcnRhbC5jaGlsZHJlbiA6IFtdO1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihIb3N0UG9ydGFsLCBwZW5kaW5nUHJvcHMsIHBvcnRhbC5rZXksIG1vZGUpO1xuICBmaWJlci5leHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lO1xuICBmaWJlci5zdGF0ZU5vZGUgPSB7XG4gICAgY29udGFpbmVySW5mbzogcG9ydGFsLmNvbnRhaW5lckluZm8sXG4gICAgcGVuZGluZ0NoaWxkcmVuOiBudWxsLCAvLyBVc2VkIGJ5IHBlcnNpc3RlbnQgdXBkYXRlc1xuICAgIGltcGxlbWVudGF0aW9uOiBwb3J0YWwuaW1wbGVtZW50YXRpb25cbiAgfTtcbiAgcmV0dXJuIGZpYmVyO1xufVxuXG4vLyBVc2VkIGZvciBzdGFzaGluZyBXSVAgcHJvcGVydGllcyB0byByZXBsYXkgZmFpbGVkIHdvcmsgaW4gREVWLlxuZnVuY3Rpb24gYXNzaWduRmliZXJQcm9wZXJ0aWVzSW5ERVYodGFyZ2V0LCBzb3VyY2UpIHtcbiAgaWYgKHRhcmdldCA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgRmliZXIncyBpbml0aWFsIHByb3BlcnRpZXMgd2lsbCBhbHdheXMgYmUgb3ZlcndyaXR0ZW4uXG4gICAgLy8gV2Ugb25seSB1c2UgYSBGaWJlciB0byBlbnN1cmUgdGhlIHNhbWUgaGlkZGVuIGNsYXNzIHNvIERFViBpc24ndCBzbG93LlxuICAgIHRhcmdldCA9IGNyZWF0ZUZpYmVyKEluZGV0ZXJtaW5hdGVDb21wb25lbnQsIG51bGwsIG51bGwsIE5vQ29udGV4dCk7XG4gIH1cblxuICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgd3JpdHRlbiBhcyBhIGxpc3Qgb2YgYWxsIHByb3BlcnRpZXMuXG4gIC8vIFdlIHRyaWVkIHRvIHVzZSBPYmplY3QuYXNzaWduKCkgaW5zdGVhZCBidXQgdGhpcyBpcyBjYWxsZWQgaW5cbiAgLy8gdGhlIGhvdHRlc3QgcGF0aCwgYW5kIE9iamVjdC5hc3NpZ24oKSB3YXMgdG9vIHNsb3c6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTI1MDJcbiAgLy8gVGhpcyBjb2RlIGlzIERFVi1vbmx5IHNvIHNpemUgaXMgbm90IGEgY29uY2Vybi5cblxuICB0YXJnZXQudGFnID0gc291cmNlLnRhZztcbiAgdGFyZ2V0LmtleSA9IHNvdXJjZS5rZXk7XG4gIHRhcmdldC5lbGVtZW50VHlwZSA9IHNvdXJjZS5lbGVtZW50VHlwZTtcbiAgdGFyZ2V0LnR5cGUgPSBzb3VyY2UudHlwZTtcbiAgdGFyZ2V0LnN0YXRlTm9kZSA9IHNvdXJjZS5zdGF0ZU5vZGU7XG4gIHRhcmdldC5yZXR1cm4gPSBzb3VyY2UucmV0dXJuO1xuICB0YXJnZXQuY2hpbGQgPSBzb3VyY2UuY2hpbGQ7XG4gIHRhcmdldC5zaWJsaW5nID0gc291cmNlLnNpYmxpbmc7XG4gIHRhcmdldC5pbmRleCA9IHNvdXJjZS5pbmRleDtcbiAgdGFyZ2V0LnJlZiA9IHNvdXJjZS5yZWY7XG4gIHRhcmdldC5wZW5kaW5nUHJvcHMgPSBzb3VyY2UucGVuZGluZ1Byb3BzO1xuICB0YXJnZXQubWVtb2l6ZWRQcm9wcyA9IHNvdXJjZS5tZW1vaXplZFByb3BzO1xuICB0YXJnZXQudXBkYXRlUXVldWUgPSBzb3VyY2UudXBkYXRlUXVldWU7XG4gIHRhcmdldC5tZW1vaXplZFN0YXRlID0gc291cmNlLm1lbW9pemVkU3RhdGU7XG4gIHRhcmdldC5jb250ZXh0RGVwZW5kZW5jaWVzID0gc291cmNlLmNvbnRleHREZXBlbmRlbmNpZXM7XG4gIHRhcmdldC5tb2RlID0gc291cmNlLm1vZGU7XG4gIHRhcmdldC5lZmZlY3RUYWcgPSBzb3VyY2UuZWZmZWN0VGFnO1xuICB0YXJnZXQubmV4dEVmZmVjdCA9IHNvdXJjZS5uZXh0RWZmZWN0O1xuICB0YXJnZXQuZmlyc3RFZmZlY3QgPSBzb3VyY2UuZmlyc3RFZmZlY3Q7XG4gIHRhcmdldC5sYXN0RWZmZWN0ID0gc291cmNlLmxhc3RFZmZlY3Q7XG4gIHRhcmdldC5leHBpcmF0aW9uVGltZSA9IHNvdXJjZS5leHBpcmF0aW9uVGltZTtcbiAgdGFyZ2V0LmNoaWxkRXhwaXJhdGlvblRpbWUgPSBzb3VyY2UuY2hpbGRFeHBpcmF0aW9uVGltZTtcbiAgdGFyZ2V0LmFsdGVybmF0ZSA9IHNvdXJjZS5hbHRlcm5hdGU7XG4gIGlmIChlbmFibGVQcm9maWxlclRpbWVyKSB7XG4gICAgdGFyZ2V0LmFjdHVhbER1cmF0aW9uID0gc291cmNlLmFjdHVhbER1cmF0aW9uO1xuICAgIHRhcmdldC5hY3R1YWxTdGFydFRpbWUgPSBzb3VyY2UuYWN0dWFsU3RhcnRUaW1lO1xuICAgIHRhcmdldC5zZWxmQmFzZUR1cmF0aW9uID0gc291cmNlLnNlbGZCYXNlRHVyYXRpb247XG4gICAgdGFyZ2V0LnRyZWVCYXNlRHVyYXRpb24gPSBzb3VyY2UudHJlZUJhc2VEdXJhdGlvbjtcbiAgfVxuICB0YXJnZXQuX2RlYnVnSUQgPSBzb3VyY2UuX2RlYnVnSUQ7XG4gIHRhcmdldC5fZGVidWdTb3VyY2UgPSBzb3VyY2UuX2RlYnVnU291cmNlO1xuICB0YXJnZXQuX2RlYnVnT3duZXIgPSBzb3VyY2UuX2RlYnVnT3duZXI7XG4gIHRhcmdldC5fZGVidWdJc0N1cnJlbnRseVRpbWluZyA9IHNvdXJjZS5fZGVidWdJc0N1cnJlbnRseVRpbWluZztcbiAgdGFyZ2V0Ll9kZWJ1Z0hvb2tUeXBlcyA9IHNvdXJjZS5fZGVidWdIb29rVHlwZXM7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8vIFRPRE86IFRoaXMgc2hvdWxkIGJlIGxpZnRlZCBpbnRvIHRoZSByZW5kZXJlci5cblxuXG4vLyBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIG9ubHkgdXNlZCBieSBpbnRlcmFjdGlvbiB0cmFjaW5nIGJ1aWxkcy5cbi8vIFRoZXkgZW5hYmxlIGludGVyYWN0aW9ucyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlaXIgYXN5bmMgd29yayxcbi8vIEFuZCBleHBvc2UgaW50ZXJhY3Rpb24gbWV0YWRhdGEgdG8gdGhlIFJlYWN0IERldlRvb2xzIFByb2ZpbGVyIHBsdWdpbi5cbi8vIE5vdGUgdGhhdCB0aGVzZSBhdHRyaWJ1dGVzIGFyZSBvbmx5IGRlZmluZWQgd2hlbiB0aGUgZW5hYmxlU2NoZWR1bGVyVHJhY2luZyBmbGFnIGlzIGVuYWJsZWQuXG5cblxuLy8gRXhwb3J0ZWQgRmliZXJSb290IHR5cGUgaW5jbHVkZXMgYWxsIHByb3BlcnRpZXMsXG4vLyBUbyBhdm9pZCByZXF1aXJpbmcgcG90ZW50aWFsbHkgZXJyb3ItcHJvbmUgOmFueSBjYXN0cyB0aHJvdWdob3V0IHRoZSBwcm9qZWN0LlxuLy8gUHJvZmlsaW5nIHByb3BlcnRpZXMgYXJlIG9ubHkgc2FmZSB0byBhY2Nlc3MgaW4gcHJvZmlsaW5nIGJ1aWxkcyAod2hlbiBlbmFibGVTY2hlZHVsZXJUcmFjaW5nIGlzIHRydWUpLlxuLy8gVGhlIHR5cGVzIGFyZSBkZWZpbmVkIHNlcGFyYXRlbHkgd2l0aGluIHRoaXMgZmlsZSB0byBlbnN1cmUgdGhleSBzdGF5IGluIHN5bmMuXG4vLyAoV2UgZG9uJ3QgaGF2ZSB0byB1c2UgYW4gaW5saW5lIDphbnkgY2FzdCB3aGVuIGVuYWJsZVNjaGVkdWxlclRyYWNpbmcgaXMgZGlzYWJsZWQuKVxuXG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyUm9vdChjb250YWluZXJJbmZvLCBpc0NvbmN1cnJlbnQsIGh5ZHJhdGUpIHtcbiAgLy8gQ3ljbGljIGNvbnN0cnVjdGlvbi4gVGhpcyBjaGVhdHMgdGhlIHR5cGUgc3lzdGVtIHJpZ2h0IG5vdyBiZWNhdXNlXG4gIC8vIHN0YXRlTm9kZSBpcyBhbnkuXG4gIHZhciB1bmluaXRpYWxpemVkRmliZXIgPSBjcmVhdGVIb3N0Um9vdEZpYmVyKGlzQ29uY3VycmVudCk7XG5cbiAgdmFyIHJvb3QgPSB2b2lkIDA7XG4gIGlmIChlbmFibGVTY2hlZHVsZXJUcmFjaW5nKSB7XG4gICAgcm9vdCA9IHtcbiAgICAgIGN1cnJlbnQ6IHVuaW5pdGlhbGl6ZWRGaWJlcixcbiAgICAgIGNvbnRhaW5lckluZm86IGNvbnRhaW5lckluZm8sXG4gICAgICBwZW5kaW5nQ2hpbGRyZW46IG51bGwsXG5cbiAgICAgIGVhcmxpZXN0UGVuZGluZ1RpbWU6IE5vV29yayxcbiAgICAgIGxhdGVzdFBlbmRpbmdUaW1lOiBOb1dvcmssXG4gICAgICBlYXJsaWVzdFN1c3BlbmRlZFRpbWU6IE5vV29yayxcbiAgICAgIGxhdGVzdFN1c3BlbmRlZFRpbWU6IE5vV29yayxcbiAgICAgIGxhdGVzdFBpbmdlZFRpbWU6IE5vV29yayxcblxuICAgICAgcGluZ0NhY2hlOiBudWxsLFxuXG4gICAgICBkaWRFcnJvcjogZmFsc2UsXG5cbiAgICAgIHBlbmRpbmdDb21taXRFeHBpcmF0aW9uVGltZTogTm9Xb3JrLFxuICAgICAgZmluaXNoZWRXb3JrOiBudWxsLFxuICAgICAgdGltZW91dEhhbmRsZTogbm9UaW1lb3V0LFxuICAgICAgY29udGV4dDogbnVsbCxcbiAgICAgIHBlbmRpbmdDb250ZXh0OiBudWxsLFxuICAgICAgaHlkcmF0ZTogaHlkcmF0ZSxcbiAgICAgIG5leHRFeHBpcmF0aW9uVGltZVRvV29ya09uOiBOb1dvcmssXG4gICAgICBleHBpcmF0aW9uVGltZTogTm9Xb3JrLFxuICAgICAgZmlyc3RCYXRjaDogbnVsbCxcbiAgICAgIG5leHRTY2hlZHVsZWRSb290OiBudWxsLFxuXG4gICAgICBpbnRlcmFjdGlvblRocmVhZElEOiB0cmFjaW5nLnVuc3RhYmxlX2dldFRocmVhZElEKCksXG4gICAgICBtZW1vaXplZEludGVyYWN0aW9uczogbmV3IFNldCgpLFxuICAgICAgcGVuZGluZ0ludGVyYWN0aW9uTWFwOiBuZXcgTWFwKClcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJvb3QgPSB7XG4gICAgICBjdXJyZW50OiB1bmluaXRpYWxpemVkRmliZXIsXG4gICAgICBjb250YWluZXJJbmZvOiBjb250YWluZXJJbmZvLFxuICAgICAgcGVuZGluZ0NoaWxkcmVuOiBudWxsLFxuXG4gICAgICBwaW5nQ2FjaGU6IG51bGwsXG5cbiAgICAgIGVhcmxpZXN0UGVuZGluZ1RpbWU6IE5vV29yayxcbiAgICAgIGxhdGVzdFBlbmRpbmdUaW1lOiBOb1dvcmssXG4gICAgICBlYXJsaWVzdFN1c3BlbmRlZFRpbWU6IE5vV29yayxcbiAgICAgIGxhdGVzdFN1c3BlbmRlZFRpbWU6IE5vV29yayxcbiAgICAgIGxhdGVzdFBpbmdlZFRpbWU6IE5vV29yayxcblxuICAgICAgZGlkRXJyb3I6IGZhbHNlLFxuXG4gICAgICBwZW5kaW5nQ29tbWl0RXhwaXJhdGlvblRpbWU6IE5vV29yayxcbiAgICAgIGZpbmlzaGVkV29yazogbnVsbCxcbiAgICAgIHRpbWVvdXRIYW5kbGU6IG5vVGltZW91dCxcbiAgICAgIGNvbnRleHQ6IG51bGwsXG4gICAgICBwZW5kaW5nQ29udGV4dDogbnVsbCxcbiAgICAgIGh5ZHJhdGU6IGh5ZHJhdGUsXG4gICAgICBuZXh0RXhwaXJhdGlvblRpbWVUb1dvcmtPbjogTm9Xb3JrLFxuICAgICAgZXhwaXJhdGlvblRpbWU6IE5vV29yayxcbiAgICAgIGZpcnN0QmF0Y2g6IG51bGwsXG4gICAgICBuZXh0U2NoZWR1bGVkUm9vdDogbnVsbFxuICAgIH07XG4gIH1cblxuICB1bmluaXRpYWxpemVkRmliZXIuc3RhdGVOb2RlID0gcm9vdDtcblxuICAvLyBUaGUgcmVhc29uIGZvciB0aGUgd2F5IHRoZSBGbG93IHR5cGVzIGFyZSBzdHJ1Y3R1cmVkIGluIHRoaXMgZmlsZSxcbiAgLy8gSXMgdG8gYXZvaWQgbmVlZGluZyA6YW55IGNhc3RzIGV2ZXJ5d2hlcmUgaW50ZXJhY3Rpb24gdHJhY2luZyBmaWVsZHMgYXJlIHVzZWQuXG4gIC8vIFVuZm9ydHVuYXRlbHkgdGhhdCByZXF1aXJlcyBhbiA6YW55IGNhc3QgZm9yIG5vbi1pbnRlcmFjdGlvbiB0cmFjaW5nIGNhcGFibGUgYnVpbGRzLlxuICAvLyAkRmxvd0ZpeE1lIFJlbW92ZSB0aGlzIDphbnkgY2FzdCBhbmQgcmVwbGFjZSBpdCB3aXRoIHNvbWV0aGluZyBiZXR0ZXIuXG4gIHJldHVybiByb290O1xufVxuXG4vKipcbiAqIEZvcmtlZCBmcm9tIGZianMvd2FybmluZzpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mYmpzL2Jsb2IvZTY2YmEyMGFkNWJlNDMzZWI1NDQyM2YyYjA5N2Q4MjkzMjRkOWRlNi9wYWNrYWdlcy9mYmpzL3NyYy9fX2ZvcmtzX18vd2FybmluZy5qc1xuICpcbiAqIE9ubHkgY2hhbmdlIGlzIHdlIHVzZSBjb25zb2xlLndhcm4gaW5zdGVhZCBvZiBjb25zb2xlLmVycm9yLFxuICogYW5kIGRvIG5vdGhpbmcgd2hlbiAnY29uc29sZScgaXMgbm90IHN1cHBvcnRlZC5cbiAqIFRoaXMgcmVhbGx5IHNpbXBsaWZpZXMgdGhlIGNvZGUuXG4gKiAtLS1cbiAqIFNpbWlsYXIgdG8gaW52YXJpYW50IGJ1dCBvbmx5IGxvZ3MgYSB3YXJuaW5nIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldC5cbiAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gbG9nIGlzc3VlcyBpbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMgaW4gY3JpdGljYWxcbiAqIHBhdGhzLiBSZW1vdmluZyB0aGUgbG9nZ2luZyBjb2RlIGZvciBwcm9kdWN0aW9uIGVudmlyb25tZW50cyB3aWxsIGtlZXAgdGhlXG4gKiBzYW1lIGxvZ2ljIGFuZCBmb2xsb3cgdGhlIHNhbWUgY29kZSBwYXRocy5cbiAqL1xuXG52YXIgbG93UHJpb3JpdHlXYXJuaW5nID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgdmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICB9KTtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG5cbiAgbG93UHJpb3JpdHlXYXJuaW5nID0gZnVuY3Rpb24gKGNvbmRpdGlvbiwgZm9ybWF0KSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Bsb3dQcmlvcml0eVdhcm5pbmcoY29uZGl0aW9uLCBmb3JtYXQsIC4uLmFyZ3MpYCByZXF1aXJlcyBhIHdhcm5pbmcgJyArICdtZXNzYWdlIGFyZ3VtZW50Jyk7XG4gICAgfVxuICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMiA+IDIgPyBfbGVuMiAtIDIgOiAwKSwgX2tleTIgPSAyOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTIgLSAyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZy5hcHBseSh1bmRlZmluZWQsIFtmb3JtYXRdLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuICB9O1xufVxuXG52YXIgbG93UHJpb3JpdHlXYXJuaW5nJDEgPSBsb3dQcmlvcml0eVdhcm5pbmc7XG5cbnZhciBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncyA9IHtcbiAgZGlzY2FyZFBlbmRpbmdXYXJuaW5nczogZnVuY3Rpb24gKCkge30sXG4gIGZsdXNoUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZ3M6IGZ1bmN0aW9uICgpIHt9LFxuICBmbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5nczogZnVuY3Rpb24gKCkge30sXG4gIHJlY29yZERlcHJlY2F0aW9uV2FybmluZ3M6IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHt9LFxuICByZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5nczogZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge30sXG4gIHJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nOiBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7fSxcbiAgZmx1c2hMZWdhY3lDb250ZXh0V2FybmluZzogZnVuY3Rpb24gKCkge31cbn07XG5cbntcbiAgdmFyIExJRkVDWUNMRV9TVUdHRVNUSU9OUyA9IHtcbiAgICBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50OiAnY29tcG9uZW50RGlkTW91bnQnLFxuICAgIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzOiAnc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcycsXG4gICAgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGU6ICdjb21wb25lbnREaWRVcGRhdGUnXG4gIH07XG5cbiAgdmFyIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ1Vuc2FmZUxpZmVjeWNsZVdhcm5pbmdzID0gbmV3IE1hcCgpO1xuICB2YXIgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nID0gbmV3IE1hcCgpO1xuXG4gIC8vIFRyYWNrcyBjb21wb25lbnRzIHdlIGhhdmUgYWxyZWFkeSB3YXJuZWQgYWJvdXQuXG4gIHZhciBkaWRXYXJuQWJvdXREZXByZWNhdGVkTGlmZWN5Y2xlcyA9IG5ldyBTZXQoKTtcbiAgdmFyIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMgPSBuZXcgU2V0KCk7XG4gIHZhciBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0ID0gbmV3IFNldCgpO1xuXG4gIHZhciBzZXRUb1NvcnRlZFN0cmluZyA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGFycmF5LnB1c2godmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBhcnJheS5zb3J0KCkuam9pbignLCAnKTtcbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5kaXNjYXJkUGVuZGluZ1dhcm5pbmdzID0gZnVuY3Rpb24gKCkge1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1Vuc2FmZUxpZmVjeWNsZVdhcm5pbmdzID0gbmV3IE1hcCgpO1xuICAgIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZyA9IG5ldyBNYXAoKTtcbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICBwZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAobGlmZWN5Y2xlV2FybmluZ3NNYXAsIHN0cmljdFJvb3QpIHtcbiAgICAgIHZhciBsaWZlY3ljbGVzV2FybmluZ01lc3NhZ2VzID0gW107XG5cbiAgICAgIE9iamVjdC5rZXlzKGxpZmVjeWNsZVdhcm5pbmdzTWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChsaWZlY3ljbGUpIHtcbiAgICAgICAgdmFyIGxpZmVjeWNsZVdhcm5pbmdzID0gbGlmZWN5Y2xlV2FybmluZ3NNYXBbbGlmZWN5Y2xlXTtcbiAgICAgICAgaWYgKGxpZmVjeWNsZVdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB2YXIgY29tcG9uZW50TmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgbGlmZWN5Y2xlV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudE5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdmFyIGZvcm1hdHRlZCA9IGxpZmVjeWNsZS5yZXBsYWNlKCdVTlNBRkVfJywgJycpO1xuICAgICAgICAgIHZhciBzdWdnZXN0aW9uID0gTElGRUNZQ0xFX1NVR0dFU1RJT05TW2xpZmVjeWNsZV07XG4gICAgICAgICAgdmFyIHNvcnRlZENvbXBvbmVudE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoY29tcG9uZW50TmFtZXMpO1xuXG4gICAgICAgICAgbGlmZWN5Y2xlc1dhcm5pbmdNZXNzYWdlcy5wdXNoKGZvcm1hdHRlZCArICc6IFBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzIHRvIHVzZSAnICsgKHN1Z2dlc3Rpb24gKyAnIGluc3RlYWQ6ICcgKyBzb3J0ZWRDb21wb25lbnROYW1lcykpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGxpZmVjeWNsZXNXYXJuaW5nTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgc3RyaWN0Um9vdENvbXBvbmVudFN0YWNrID0gZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHN0cmljdFJvb3QpO1xuXG4gICAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1Vuc2FmZSBsaWZlY3ljbGUgbWV0aG9kcyB3ZXJlIGZvdW5kIHdpdGhpbiBhIHN0cmljdC1tb2RlIHRyZWU6JXMnICsgJ1xcblxcbiVzJyArICdcXG5cXG5MZWFybiBtb3JlIGFib3V0IHRoaXMgd2FybmluZyBoZXJlOicgKyAnXFxuaHR0cHM6Ly9mYi5tZS9yZWFjdC1zdHJpY3QtbW9kZS13YXJuaW5ncycsIHN0cmljdFJvb3RDb21wb25lbnRTdGFjaywgbGlmZWN5Y2xlc1dhcm5pbmdNZXNzYWdlcy5qb2luKCdcXG5cXG4nKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBwZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MgPSBuZXcgTWFwKCk7XG4gIH07XG5cbiAgdmFyIGZpbmRTdHJpY3RSb290ID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgdmFyIG1heWJlU3RyaWN0Um9vdCA9IG51bGw7XG5cbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuICAgIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgICBtYXliZVN0cmljdFJvb3QgPSBub2RlO1xuICAgICAgfVxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBtYXliZVN0cmljdFJvb3Q7XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciB1bmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICB1bmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyh1bmlxdWVOYW1lcyk7XG5cbiAgICAgIGxvd1ByaW9yaXR5V2FybmluZyQxKGZhbHNlLCAnY29tcG9uZW50V2lsbE1vdW50IGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uLiAnICsgJ1VzZSBjb21wb25lbnREaWRNb3VudCBpbnN0ZWFkLiBBcyBhIHRlbXBvcmFyeSB3b3JrYXJvdW5kLCAnICsgJ3lvdSBjYW4gcmVuYW1lIHRvIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQuJyArICdcXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnICsgJ1xcblxcbkxlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6JyArICdcXG5odHRwczovL2ZiLm1lL3JlYWN0LWFzeW5jLWNvbXBvbmVudC1saWZlY3ljbGUtaG9va3MnLCBzb3J0ZWROYW1lcyk7XG5cbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBfdW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIF91bmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgX3NvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoX3VuaXF1ZU5hbWVzKTtcblxuICAgICAgbG93UHJpb3JpdHlXYXJuaW5nJDEoZmFsc2UsICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uLiAnICsgJ1VzZSBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzIGluc3RlYWQuJyArICdcXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnICsgJ1xcblxcbkxlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6JyArICdcXG5odHRwczovL2ZiLm1lL3JlYWN0LWFzeW5jLWNvbXBvbmVudC1saWZlY3ljbGUtaG9va3MnLCBfc29ydGVkTmFtZXMpO1xuXG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgaWYgKHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIF91bmlxdWVOYW1lczIgPSBuZXcgU2V0KCk7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIF91bmlxdWVOYW1lczIuYWRkKGdldENvbXBvbmVudE5hbWUoZmliZXIudHlwZSkgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXREZXByZWNhdGVkTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcblxuICAgICAgdmFyIF9zb3J0ZWROYW1lczIgPSBzZXRUb1NvcnRlZFN0cmluZyhfdW5pcXVlTmFtZXMyKTtcblxuICAgICAgbG93UHJpb3JpdHlXYXJuaW5nJDEoZmFsc2UsICdjb21wb25lbnRXaWxsVXBkYXRlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uLiAnICsgJ1VzZSBjb21wb25lbnREaWRVcGRhdGUgaW5zdGVhZC4gQXMgYSB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCwgJyArICd5b3UgY2FuIHJlbmFtZSB0byBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZS4nICsgJ1xcblxcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycgKyAnXFxuXFxuTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTonICsgJ1xcbmh0dHBzOi8vZmIubWUvcmVhY3QtYXN5bmMtY29tcG9uZW50LWxpZmVjeWNsZS1ob29rcycsIF9zb3J0ZWROYW1lczIpO1xuXG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgfVxuICB9O1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZERlcHJlY2F0aW9uV2FybmluZ3MgPSBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7XG4gICAgLy8gRGVkdXAgc3RyYXRlZ3k6IFdhcm4gb25jZSBwZXIgY29tcG9uZW50LlxuICAgIGlmIChkaWRXYXJuQWJvdXREZXByZWNhdGVkTGlmZWN5Y2xlcy5oYXMoZmliZXIudHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEb24ndCB3YXJuIGFib3V0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cy5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZS5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHtcbiAgICB2YXIgc3RyaWN0Um9vdCA9IGZpbmRTdHJpY3RSb290KGZpYmVyKTtcbiAgICBpZiAoc3RyaWN0Um9vdCA9PT0gbnVsbCkge1xuICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnRXhwZWN0ZWQgdG8gZmluZCBhIFN0cmljdE1vZGUgY29tcG9uZW50IGluIGEgc3RyaWN0IG1vZGUgdHJlZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERlZHVwIHN0cmF0ZWd5OiBXYXJuIG9uY2UgcGVyIGNvbXBvbmVudC5cbiAgICAvLyBUaGlzIGlzIGRpZmZpY3VsdCB0byB0cmFjayBhbnkgb3RoZXIgd2F5IHNpbmNlIGNvbXBvbmVudCBuYW1lc1xuICAgIC8vIGFyZSBvZnRlbiB2YWd1ZSBhbmQgYXJlIGxpa2VseSB0byBjb2xsaWRlIGJldHdlZW4gM3JkIHBhcnR5IGxpYnJhcmllcy5cbiAgICAvLyBBbiBleHBhbmQgcHJvcGVydHkgaXMgcHJvYmFibHkgb2theSB0byB1c2UgaGVyZSBzaW5jZSBpdCdzIERFVi1vbmx5LFxuICAgIC8vIGFuZCB3aWxsIG9ubHkgYmUgc2V0IGluIHRoZSBldmVudCBvZiBzZXJpb3VzIHdhcm5pbmdzLlxuICAgIGlmIChkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmhhcyhmaWJlci50eXBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB3YXJuaW5nc0ZvclJvb3QgPSB2b2lkIDA7XG4gICAgaWYgKCFwZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MuaGFzKHN0cmljdFJvb3QpKSB7XG4gICAgICB3YXJuaW5nc0ZvclJvb3QgPSB7XG4gICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQ6IFtdLFxuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczogW10sXG4gICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlOiBbXVxuICAgICAgfTtcblxuICAgICAgcGVuZGluZ1Vuc2FmZUxpZmVjeWNsZVdhcm5pbmdzLnNldChzdHJpY3RSb290LCB3YXJuaW5nc0ZvclJvb3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuaW5nc0ZvclJvb3QgPSBwZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MuZ2V0KHN0cmljdFJvb3QpO1xuICAgIH1cblxuICAgIHZhciB1bnNhZmVMaWZlY3ljbGVzID0gW107XG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50Ll9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUgfHwgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVuc2FmZUxpZmVjeWNsZXMucHVzaCgnVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCcpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlIHx8IHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdW5zYWZlTGlmZWN5Y2xlcy5wdXNoKCdVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcycpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZS5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlIHx8IHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdW5zYWZlTGlmZWN5Y2xlcy5wdXNoKCdVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZScpO1xuICAgIH1cblxuICAgIGlmICh1bnNhZmVMaWZlY3ljbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHVuc2FmZUxpZmVjeWNsZXMuZm9yRWFjaChmdW5jdGlvbiAobGlmZWN5Y2xlKSB7XG4gICAgICAgIHdhcm5pbmdzRm9yUm9vdFtsaWZlY3ljbGVdLnB1c2goZmliZXIpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nID0gZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge1xuICAgIHZhciBzdHJpY3RSb290ID0gZmluZFN0cmljdFJvb3QoZmliZXIpO1xuICAgIGlmIChzdHJpY3RSb290ID09PSBudWxsKSB7XG4gICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdFeHBlY3RlZCB0byBmaW5kIGEgU3RyaWN0TW9kZSBjb21wb25lbnQgaW4gYSBzdHJpY3QgbW9kZSB0cmVlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRGVkdXAgc3RyYXRlZ3k6IFdhcm4gb25jZSBwZXIgY29tcG9uZW50LlxuICAgIGlmIChkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0LmhhcyhmaWJlci50eXBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB3YXJuaW5nc0ZvclJvb3QgPSBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuZ2V0KHN0cmljdFJvb3QpO1xuXG4gICAgaWYgKGZpYmVyLnR5cGUuY29udGV4dFR5cGVzICE9IG51bGwgfHwgZmliZXIudHlwZS5jaGlsZENvbnRleHRUeXBlcyAhPSBudWxsIHx8IGluc3RhbmNlICE9PSBudWxsICYmIHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh3YXJuaW5nc0ZvclJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3YXJuaW5nc0ZvclJvb3QgPSBbXTtcbiAgICAgICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nLnNldChzdHJpY3RSb290LCB3YXJuaW5nc0ZvclJvb3QpO1xuICAgICAgfVxuICAgICAgd2FybmluZ3NGb3JSb290LnB1c2goZmliZXIpO1xuICAgIH1cbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaExlZ2FjeUNvbnRleHRXYXJuaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlckFycmF5LCBzdHJpY3RSb290KSB7XG4gICAgICB2YXIgdW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgICBmaWJlckFycmF5LmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIHVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dC5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcblxuICAgICAgdmFyIHNvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcodW5pcXVlTmFtZXMpO1xuICAgICAgdmFyIHN0cmljdFJvb3RDb21wb25lbnRTdGFjayA9IGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChzdHJpY3RSb290KTtcblxuICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnTGVnYWN5IGNvbnRleHQgQVBJIGhhcyBiZWVuIGRldGVjdGVkIHdpdGhpbiBhIHN0cmljdC1tb2RlIHRyZWU6ICVzJyArICdcXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnICsgJ1xcblxcbkxlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6JyArICdcXG5odHRwczovL2ZiLm1lL3JlYWN0LXN0cmljdC1tb2RlLXdhcm5pbmdzJywgc3RyaWN0Um9vdENvbXBvbmVudFN0YWNrLCBzb3J0ZWROYW1lcyk7XG4gICAgfSk7XG4gIH07XG59XG5cbi8vIFRoaXMgbGV0cyB1cyBob29rIGludG8gRmliZXIgdG8gZGVidWcgd2hhdCBpdCdzIGRvaW5nLlxuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzgwMzMuXG4vLyBUaGlzIGlzIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLCBub3QgZXZlbiBmb3IgUmVhY3QgRGV2VG9vbHMuXG4vLyBZb3UgbWF5IG9ubHkgaW5qZWN0IGEgZGVidWdUb29sIGlmIHlvdSB3b3JrIG9uIFJlYWN0IEZpYmVyIGl0c2VsZi5cbnZhciBSZWFjdEZpYmVySW5zdHJ1bWVudGF0aW9uID0ge1xuICBkZWJ1Z1Rvb2w6IG51bGxcbn07XG5cbnZhciBSZWFjdEZpYmVySW5zdHJ1bWVudGF0aW9uXzEgPSBSZWFjdEZpYmVySW5zdHJ1bWVudGF0aW9uO1xuXG4vLyBUT0RPOiBPZmZzY3JlZW4gdXBkYXRlcyBzaG91bGQgbmV2ZXIgc3VzcGVuZC4gSG93ZXZlciwgYSBwcm9taXNlIHRoYXRcbi8vIHN1c3BlbmRlZCBpbnNpZGUgYW4gb2Zmc2NyZWVuIHN1YnRyZWUgc2hvdWxkIGJlIGFibGUgdG8gcGluZyBhdCB0aGUgcHJpb3JpdHlcbi8vIG9mIHRoZSBvdXRlciByZW5kZXIuXG5cbmZ1bmN0aW9uIG1hcmtQZW5kaW5nUHJpb3JpdHlMZXZlbChyb290LCBleHBpcmF0aW9uVGltZSkge1xuICAvLyBJZiB0aGVyZSdzIGEgZ2FwIGJldHdlZW4gY29tcGxldGluZyBhIGZhaWxlZCByb290IGFuZCByZXRyeWluZyBpdCxcbiAgLy8gYWRkaXRpb25hbCB1cGRhdGVzIG1heSBiZSBzY2hlZHVsZWQuIENsZWFyIGBkaWRFcnJvcmAsIGluIGNhc2UgdGhlIHVwZGF0ZVxuICAvLyBpcyBzdWZmaWNpZW50IHRvIGZpeCB0aGUgZXJyb3IuXG4gIHJvb3QuZGlkRXJyb3IgPSBmYWxzZTtcblxuICAvLyBVcGRhdGUgdGhlIGxhdGVzdCBhbmQgZWFybGllc3QgcGVuZGluZyB0aW1lc1xuICB2YXIgZWFybGllc3RQZW5kaW5nVGltZSA9IHJvb3QuZWFybGllc3RQZW5kaW5nVGltZTtcbiAgaWYgKGVhcmxpZXN0UGVuZGluZ1RpbWUgPT09IE5vV29yaykge1xuICAgIC8vIE5vIG90aGVyIHBlbmRpbmcgdXBkYXRlcy5cbiAgICByb290LmVhcmxpZXN0UGVuZGluZ1RpbWUgPSByb290LmxhdGVzdFBlbmRpbmdUaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGVhcmxpZXN0UGVuZGluZ1RpbWUgPCBleHBpcmF0aW9uVGltZSkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZWFybGllc3QgcGVuZGluZyB1cGRhdGUuXG4gICAgICByb290LmVhcmxpZXN0UGVuZGluZ1RpbWUgPSBleHBpcmF0aW9uVGltZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGxhdGVzdFBlbmRpbmdUaW1lID0gcm9vdC5sYXRlc3RQZW5kaW5nVGltZTtcbiAgICAgIGlmIChsYXRlc3RQZW5kaW5nVGltZSA+IGV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgdGhlIGxhdGVzdCBwZW5kaW5nIHVwZGF0ZVxuICAgICAgICByb290LmxhdGVzdFBlbmRpbmdUaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZpbmROZXh0RXhwaXJhdGlvblRpbWVUb1dvcmtPbihleHBpcmF0aW9uVGltZSwgcm9vdCk7XG59XG5cbmZ1bmN0aW9uIG1hcmtDb21taXR0ZWRQcmlvcml0eUxldmVscyhyb290LCBlYXJsaWVzdFJlbWFpbmluZ1RpbWUpIHtcbiAgcm9vdC5kaWRFcnJvciA9IGZhbHNlO1xuXG4gIGlmIChlYXJsaWVzdFJlbWFpbmluZ1RpbWUgPT09IE5vV29yaykge1xuICAgIC8vIEZhc3QgcGF0aC4gVGhlcmUncyBubyByZW1haW5pbmcgd29yay4gQ2xlYXIgZXZlcnl0aGluZy5cbiAgICByb290LmVhcmxpZXN0UGVuZGluZ1RpbWUgPSBOb1dvcms7XG4gICAgcm9vdC5sYXRlc3RQZW5kaW5nVGltZSA9IE5vV29yaztcbiAgICByb290LmVhcmxpZXN0U3VzcGVuZGVkVGltZSA9IE5vV29yaztcbiAgICByb290LmxhdGVzdFN1c3BlbmRlZFRpbWUgPSBOb1dvcms7XG4gICAgcm9vdC5sYXRlc3RQaW5nZWRUaW1lID0gTm9Xb3JrO1xuICAgIGZpbmROZXh0RXhwaXJhdGlvblRpbWVUb1dvcmtPbihOb1dvcmssIHJvb3QpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChlYXJsaWVzdFJlbWFpbmluZ1RpbWUgPCByb290LmxhdGVzdFBpbmdlZFRpbWUpIHtcbiAgICByb290LmxhdGVzdFBpbmdlZFRpbWUgPSBOb1dvcms7XG4gIH1cblxuICAvLyBMZXQncyBzZWUgaWYgdGhlIHByZXZpb3VzIGxhdGVzdCBrbm93biBwZW5kaW5nIGxldmVsIHdhcyBqdXN0IGZsdXNoZWQuXG4gIHZhciBsYXRlc3RQZW5kaW5nVGltZSA9IHJvb3QubGF0ZXN0UGVuZGluZ1RpbWU7XG4gIGlmIChsYXRlc3RQZW5kaW5nVGltZSAhPT0gTm9Xb3JrKSB7XG4gICAgaWYgKGxhdGVzdFBlbmRpbmdUaW1lID4gZWFybGllc3RSZW1haW5pbmdUaW1lKSB7XG4gICAgICAvLyBXZSd2ZSBmbHVzaGVkIGFsbCB0aGUga25vd24gcGVuZGluZyBsZXZlbHMuXG4gICAgICByb290LmVhcmxpZXN0UGVuZGluZ1RpbWUgPSByb290LmxhdGVzdFBlbmRpbmdUaW1lID0gTm9Xb3JrO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZWFybGllc3RQZW5kaW5nVGltZSA9IHJvb3QuZWFybGllc3RQZW5kaW5nVGltZTtcbiAgICAgIGlmIChlYXJsaWVzdFBlbmRpbmdUaW1lID4gZWFybGllc3RSZW1haW5pbmdUaW1lKSB7XG4gICAgICAgIC8vIFdlJ3ZlIGZsdXNoZWQgdGhlIGVhcmxpZXN0IGtub3duIHBlbmRpbmcgbGV2ZWwuIFNldCB0aGlzIHRvIHRoZVxuICAgICAgICAvLyBsYXRlc3QgcGVuZGluZyB0aW1lLlxuICAgICAgICByb290LmVhcmxpZXN0UGVuZGluZ1RpbWUgPSByb290LmxhdGVzdFBlbmRpbmdUaW1lO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIE5vdyBsZXQncyBoYW5kbGUgdGhlIGVhcmxpZXN0IHJlbWFpbmluZyBsZXZlbCBpbiB0aGUgd2hvbGUgdHJlZS4gV2UgbmVlZCB0b1xuICAvLyBkZWNpZGUgd2hldGhlciB0byB0cmVhdCBpdCBhcyBhIHBlbmRpbmcgbGV2ZWwgb3IgYXMgc3VzcGVuZGVkLiBDaGVja1xuICAvLyBpdCBmYWxscyB3aXRoaW4gdGhlIHJhbmdlIG9mIGtub3duIHN1c3BlbmRlZCBsZXZlbHMuXG5cbiAgdmFyIGVhcmxpZXN0U3VzcGVuZGVkVGltZSA9IHJvb3QuZWFybGllc3RTdXNwZW5kZWRUaW1lO1xuICBpZiAoZWFybGllc3RTdXNwZW5kZWRUaW1lID09PSBOb1dvcmspIHtcbiAgICAvLyBUaGVyZSdzIG5vIHN1c3BlbmRlZCB3b3JrLiBUcmVhdCB0aGUgZWFybGllc3QgcmVtYWluaW5nIGxldmVsIGFzIGFcbiAgICAvLyBwZW5kaW5nIGxldmVsLlxuICAgIG1hcmtQZW5kaW5nUHJpb3JpdHlMZXZlbChyb290LCBlYXJsaWVzdFJlbWFpbmluZ1RpbWUpO1xuICAgIGZpbmROZXh0RXhwaXJhdGlvblRpbWVUb1dvcmtPbihOb1dvcmssIHJvb3QpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBsYXRlc3RTdXNwZW5kZWRUaW1lID0gcm9vdC5sYXRlc3RTdXNwZW5kZWRUaW1lO1xuICBpZiAoZWFybGllc3RSZW1haW5pbmdUaW1lIDwgbGF0ZXN0U3VzcGVuZGVkVGltZSkge1xuICAgIC8vIFRoZSBlYXJsaWVzdCByZW1haW5pbmcgbGV2ZWwgaXMgbGF0ZXIgdGhhbiBhbGwgdGhlIHN1c3BlbmRlZCB3b3JrLiBUaGF0XG4gICAgLy8gbWVhbnMgd2UndmUgZmx1c2hlZCBhbGwgdGhlIHN1c3BlbmRlZCB3b3JrLlxuICAgIHJvb3QuZWFybGllc3RTdXNwZW5kZWRUaW1lID0gTm9Xb3JrO1xuICAgIHJvb3QubGF0ZXN0U3VzcGVuZGVkVGltZSA9IE5vV29yaztcbiAgICByb290LmxhdGVzdFBpbmdlZFRpbWUgPSBOb1dvcms7XG5cbiAgICAvLyBUaGVyZSdzIG5vIHN1c3BlbmRlZCB3b3JrLiBUcmVhdCB0aGUgZWFybGllc3QgcmVtYWluaW5nIGxldmVsIGFzIGFcbiAgICAvLyBwZW5kaW5nIGxldmVsLlxuICAgIG1hcmtQZW5kaW5nUHJpb3JpdHlMZXZlbChyb290LCBlYXJsaWVzdFJlbWFpbmluZ1RpbWUpO1xuICAgIGZpbmROZXh0RXhwaXJhdGlvblRpbWVUb1dvcmtPbihOb1dvcmssIHJvb3QpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChlYXJsaWVzdFJlbWFpbmluZ1RpbWUgPiBlYXJsaWVzdFN1c3BlbmRlZFRpbWUpIHtcbiAgICAvLyBUaGUgZWFybGllc3QgcmVtYWluaW5nIHRpbWUgaXMgZWFybGllciB0aGFuIGFsbCB0aGUgc3VzcGVuZGVkIHdvcmsuXG4gICAgLy8gVHJlYXQgaXQgYXMgYSBwZW5kaW5nIHVwZGF0ZS5cbiAgICBtYXJrUGVuZGluZ1ByaW9yaXR5TGV2ZWwocm9vdCwgZWFybGllc3RSZW1haW5pbmdUaW1lKTtcbiAgICBmaW5kTmV4dEV4cGlyYXRpb25UaW1lVG9Xb3JrT24oTm9Xb3JrLCByb290KTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUaGUgZWFybGllc3QgcmVtYWluaW5nIHRpbWUgZmFsbHMgd2l0aGluIHRoZSByYW5nZSBvZiBrbm93biBzdXNwZW5kZWRcbiAgLy8gbGV2ZWxzLiBXZSBzaG91bGQgdHJlYXQgdGhpcyBhcyBzdXNwZW5kZWQgd29yay5cbiAgZmluZE5leHRFeHBpcmF0aW9uVGltZVRvV29ya09uKE5vV29yaywgcm9vdCk7XG59XG5cbmZ1bmN0aW9uIGhhc0xvd2VyUHJpb3JpdHlXb3JrKHJvb3QsIGVycm9yZWRFeHBpcmF0aW9uVGltZSkge1xuICB2YXIgbGF0ZXN0UGVuZGluZ1RpbWUgPSByb290LmxhdGVzdFBlbmRpbmdUaW1lO1xuICB2YXIgbGF0ZXN0U3VzcGVuZGVkVGltZSA9IHJvb3QubGF0ZXN0U3VzcGVuZGVkVGltZTtcbiAgdmFyIGxhdGVzdFBpbmdlZFRpbWUgPSByb290LmxhdGVzdFBpbmdlZFRpbWU7XG4gIHJldHVybiBsYXRlc3RQZW5kaW5nVGltZSAhPT0gTm9Xb3JrICYmIGxhdGVzdFBlbmRpbmdUaW1lIDwgZXJyb3JlZEV4cGlyYXRpb25UaW1lIHx8IGxhdGVzdFN1c3BlbmRlZFRpbWUgIT09IE5vV29yayAmJiBsYXRlc3RTdXNwZW5kZWRUaW1lIDwgZXJyb3JlZEV4cGlyYXRpb25UaW1lIHx8IGxhdGVzdFBpbmdlZFRpbWUgIT09IE5vV29yayAmJiBsYXRlc3RQaW5nZWRUaW1lIDwgZXJyb3JlZEV4cGlyYXRpb25UaW1lO1xufVxuXG5mdW5jdGlvbiBpc1ByaW9yaXR5TGV2ZWxTdXNwZW5kZWQocm9vdCwgZXhwaXJhdGlvblRpbWUpIHtcbiAgdmFyIGVhcmxpZXN0U3VzcGVuZGVkVGltZSA9IHJvb3QuZWFybGllc3RTdXNwZW5kZWRUaW1lO1xuICB2YXIgbGF0ZXN0U3VzcGVuZGVkVGltZSA9IHJvb3QubGF0ZXN0U3VzcGVuZGVkVGltZTtcbiAgcmV0dXJuIGVhcmxpZXN0U3VzcGVuZGVkVGltZSAhPT0gTm9Xb3JrICYmIGV4cGlyYXRpb25UaW1lIDw9IGVhcmxpZXN0U3VzcGVuZGVkVGltZSAmJiBleHBpcmF0aW9uVGltZSA+PSBsYXRlc3RTdXNwZW5kZWRUaW1lO1xufVxuXG5mdW5jdGlvbiBtYXJrU3VzcGVuZGVkUHJpb3JpdHlMZXZlbChyb290LCBzdXNwZW5kZWRUaW1lKSB7XG4gIHJvb3QuZGlkRXJyb3IgPSBmYWxzZTtcbiAgY2xlYXJQaW5nKHJvb3QsIHN1c3BlbmRlZFRpbWUpO1xuXG4gIC8vIEZpcnN0LCBjaGVjayB0aGUga25vd24gcGVuZGluZyBsZXZlbHMgYW5kIHVwZGF0ZSB0aGVtIGlmIG5lZWRlZC5cbiAgdmFyIGVhcmxpZXN0UGVuZGluZ1RpbWUgPSByb290LmVhcmxpZXN0UGVuZGluZ1RpbWU7XG4gIHZhciBsYXRlc3RQZW5kaW5nVGltZSA9IHJvb3QubGF0ZXN0UGVuZGluZ1RpbWU7XG4gIGlmIChlYXJsaWVzdFBlbmRpbmdUaW1lID09PSBzdXNwZW5kZWRUaW1lKSB7XG4gICAgaWYgKGxhdGVzdFBlbmRpbmdUaW1lID09PSBzdXNwZW5kZWRUaW1lKSB7XG4gICAgICAvLyBCb3RoIGtub3duIHBlbmRpbmcgbGV2ZWxzIHdlcmUgc3VzcGVuZGVkLiBDbGVhciB0aGVtLlxuICAgICAgcm9vdC5lYXJsaWVzdFBlbmRpbmdUaW1lID0gcm9vdC5sYXRlc3RQZW5kaW5nVGltZSA9IE5vV29yaztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIGVhcmxpZXN0IHBlbmRpbmcgbGV2ZWwgd2FzIHN1c3BlbmRlZC4gQ2xlYXIgYnkgc2V0dGluZyBpdCB0byB0aGVcbiAgICAgIC8vIGxhdGVzdCBwZW5kaW5nIGxldmVsLlxuICAgICAgcm9vdC5lYXJsaWVzdFBlbmRpbmdUaW1lID0gbGF0ZXN0UGVuZGluZ1RpbWU7XG4gICAgfVxuICB9IGVsc2UgaWYgKGxhdGVzdFBlbmRpbmdUaW1lID09PSBzdXNwZW5kZWRUaW1lKSB7XG4gICAgLy8gVGhlIGxhdGVzdCBwZW5kaW5nIGxldmVsIHdhcyBzdXNwZW5kZWQuIENsZWFyIGJ5IHNldHRpbmcgaXQgdG8gdGhlXG4gICAgLy8gbGF0ZXN0IHBlbmRpbmcgbGV2ZWwuXG4gICAgcm9vdC5sYXRlc3RQZW5kaW5nVGltZSA9IGVhcmxpZXN0UGVuZGluZ1RpbWU7XG4gIH1cblxuICAvLyBGaW5hbGx5LCB1cGRhdGUgdGhlIGtub3duIHN1c3BlbmRlZCBsZXZlbHMuXG4gIHZhciBlYXJsaWVzdFN1c3BlbmRlZFRpbWUgPSByb290LmVhcmxpZXN0U3VzcGVuZGVkVGltZTtcbiAgdmFyIGxhdGVzdFN1c3BlbmRlZFRpbWUgPSByb290LmxhdGVzdFN1c3BlbmRlZFRpbWU7XG4gIGlmIChlYXJsaWVzdFN1c3BlbmRlZFRpbWUgPT09IE5vV29yaykge1xuICAgIC8vIE5vIG90aGVyIHN1c3BlbmRlZCBsZXZlbHMuXG4gICAgcm9vdC5lYXJsaWVzdFN1c3BlbmRlZFRpbWUgPSByb290LmxhdGVzdFN1c3BlbmRlZFRpbWUgPSBzdXNwZW5kZWRUaW1lO1xuICB9IGVsc2Uge1xuICAgIGlmIChlYXJsaWVzdFN1c3BlbmRlZFRpbWUgPCBzdXNwZW5kZWRUaW1lKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBlYXJsaWVzdCBzdXNwZW5kZWQgbGV2ZWwuXG4gICAgICByb290LmVhcmxpZXN0U3VzcGVuZGVkVGltZSA9IHN1c3BlbmRlZFRpbWU7XG4gICAgfSBlbHNlIGlmIChsYXRlc3RTdXNwZW5kZWRUaW1lID4gc3VzcGVuZGVkVGltZSkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgbGF0ZXN0IHN1c3BlbmRlZCBsZXZlbFxuICAgICAgcm9vdC5sYXRlc3RTdXNwZW5kZWRUaW1lID0gc3VzcGVuZGVkVGltZTtcbiAgICB9XG4gIH1cblxuICBmaW5kTmV4dEV4cGlyYXRpb25UaW1lVG9Xb3JrT24oc3VzcGVuZGVkVGltZSwgcm9vdCk7XG59XG5cbmZ1bmN0aW9uIG1hcmtQaW5nZWRQcmlvcml0eUxldmVsKHJvb3QsIHBpbmdlZFRpbWUpIHtcbiAgcm9vdC5kaWRFcnJvciA9IGZhbHNlO1xuXG4gIC8vIFRPRE86IFdoZW4gd2UgYWRkIGJhY2sgcmVzdW1pbmcsIHdlIG5lZWQgdG8gZW5zdXJlIHRoZSBwcm9ncmVzc2VkIHdvcmtcbiAgLy8gaXMgdGhyb3duIG91dCBhbmQgbm90IHJldXNlZCBkdXJpbmcgdGhlIHJlc3RhcnRlZCByZW5kZXIuIE9uZSB3YXkgdG9cbiAgLy8gaW52YWxpZGF0ZSB0aGUgcHJvZ3Jlc3NlZCB3b3JrIGlzIHRvIHJlc3RhcnQgYXQgZXhwaXJhdGlvblRpbWUgKyAxLlxuICB2YXIgbGF0ZXN0UGluZ2VkVGltZSA9IHJvb3QubGF0ZXN0UGluZ2VkVGltZTtcbiAgaWYgKGxhdGVzdFBpbmdlZFRpbWUgPT09IE5vV29yayB8fCBsYXRlc3RQaW5nZWRUaW1lID4gcGluZ2VkVGltZSkge1xuICAgIHJvb3QubGF0ZXN0UGluZ2VkVGltZSA9IHBpbmdlZFRpbWU7XG4gIH1cbiAgZmluZE5leHRFeHBpcmF0aW9uVGltZVRvV29ya09uKHBpbmdlZFRpbWUsIHJvb3QpO1xufVxuXG5mdW5jdGlvbiBjbGVhclBpbmcocm9vdCwgY29tcGxldGVkVGltZSkge1xuICB2YXIgbGF0ZXN0UGluZ2VkVGltZSA9IHJvb3QubGF0ZXN0UGluZ2VkVGltZTtcbiAgaWYgKGxhdGVzdFBpbmdlZFRpbWUgPj0gY29tcGxldGVkVGltZSkge1xuICAgIHJvb3QubGF0ZXN0UGluZ2VkVGltZSA9IE5vV29yaztcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kRWFybGllc3RPdXRzdGFuZGluZ1ByaW9yaXR5TGV2ZWwocm9vdCwgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgdmFyIGVhcmxpZXN0RXhwaXJhdGlvblRpbWUgPSByZW5kZXJFeHBpcmF0aW9uVGltZTtcblxuICB2YXIgZWFybGllc3RQZW5kaW5nVGltZSA9IHJvb3QuZWFybGllc3RQZW5kaW5nVGltZTtcbiAgdmFyIGVhcmxpZXN0U3VzcGVuZGVkVGltZSA9IHJvb3QuZWFybGllc3RTdXNwZW5kZWRUaW1lO1xuICBpZiAoZWFybGllc3RQZW5kaW5nVGltZSA+IGVhcmxpZXN0RXhwaXJhdGlvblRpbWUpIHtcbiAgICBlYXJsaWVzdEV4cGlyYXRpb25UaW1lID0gZWFybGllc3RQZW5kaW5nVGltZTtcbiAgfVxuICBpZiAoZWFybGllc3RTdXNwZW5kZWRUaW1lID4gZWFybGllc3RFeHBpcmF0aW9uVGltZSkge1xuICAgIGVhcmxpZXN0RXhwaXJhdGlvblRpbWUgPSBlYXJsaWVzdFN1c3BlbmRlZFRpbWU7XG4gIH1cbiAgcmV0dXJuIGVhcmxpZXN0RXhwaXJhdGlvblRpbWU7XG59XG5cbmZ1bmN0aW9uIGRpZEV4cGlyZUF0RXhwaXJhdGlvblRpbWUocm9vdCwgY3VycmVudFRpbWUpIHtcbiAgdmFyIGV4cGlyYXRpb25UaW1lID0gcm9vdC5leHBpcmF0aW9uVGltZTtcbiAgaWYgKGV4cGlyYXRpb25UaW1lICE9PSBOb1dvcmsgJiYgY3VycmVudFRpbWUgPD0gZXhwaXJhdGlvblRpbWUpIHtcbiAgICAvLyBUaGUgcm9vdCBoYXMgZXhwaXJlZC4gRmx1c2ggYWxsIHdvcmsgdXAgdG8gdGhlIGN1cnJlbnQgdGltZS5cbiAgICByb290Lm5leHRFeHBpcmF0aW9uVGltZVRvV29ya09uID0gY3VycmVudFRpbWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZE5leHRFeHBpcmF0aW9uVGltZVRvV29ya09uKGNvbXBsZXRlZEV4cGlyYXRpb25UaW1lLCByb290KSB7XG4gIHZhciBlYXJsaWVzdFN1c3BlbmRlZFRpbWUgPSByb290LmVhcmxpZXN0U3VzcGVuZGVkVGltZTtcbiAgdmFyIGxhdGVzdFN1c3BlbmRlZFRpbWUgPSByb290LmxhdGVzdFN1c3BlbmRlZFRpbWU7XG4gIHZhciBlYXJsaWVzdFBlbmRpbmdUaW1lID0gcm9vdC5lYXJsaWVzdFBlbmRpbmdUaW1lO1xuICB2YXIgbGF0ZXN0UGluZ2VkVGltZSA9IHJvb3QubGF0ZXN0UGluZ2VkVGltZTtcblxuICAvLyBXb3JrIG9uIHRoZSBlYXJsaWVzdCBwZW5kaW5nIHRpbWUuIEZhaWxpbmcgdGhhdCwgd29yayBvbiB0aGUgbGF0ZXN0XG4gIC8vIHBpbmdlZCB0aW1lLlxuICB2YXIgbmV4dEV4cGlyYXRpb25UaW1lVG9Xb3JrT24gPSBlYXJsaWVzdFBlbmRpbmdUaW1lICE9PSBOb1dvcmsgPyBlYXJsaWVzdFBlbmRpbmdUaW1lIDogbGF0ZXN0UGluZ2VkVGltZTtcblxuICAvLyBJZiB0aGVyZSBpcyBubyBwZW5kaW5nIG9yIHBpbmdlZCB3b3JrLCBjaGVjayBpZiB0aGVyZSdzIHN1c3BlbmRlZCB3b3JrXG4gIC8vIHRoYXQncyBsb3dlciBwcmlvcml0eSB0aGFuIHdoYXQgd2UganVzdCBjb21wbGV0ZWQuXG4gIGlmIChuZXh0RXhwaXJhdGlvblRpbWVUb1dvcmtPbiA9PT0gTm9Xb3JrICYmIChjb21wbGV0ZWRFeHBpcmF0aW9uVGltZSA9PT0gTm9Xb3JrIHx8IGxhdGVzdFN1c3BlbmRlZFRpbWUgPCBjb21wbGV0ZWRFeHBpcmF0aW9uVGltZSkpIHtcbiAgICAvLyBUaGUgbG93ZXN0IHByaW9yaXR5IHN1c3BlbmRlZCB3b3JrIGlzIHRoZSB3b3JrIG1vc3QgbGlrZWx5IHRvIGJlXG4gICAgLy8gY29tbWl0dGVkIG5leHQuIExldCdzIHN0YXJ0IHJlbmRlcmluZyBpdCBhZ2Fpbiwgc28gdGhhdCBpZiBpdCB0aW1lcyBvdXQsXG4gICAgLy8gaXQncyByZWFkeSB0byBjb21taXQuXG4gICAgbmV4dEV4cGlyYXRpb25UaW1lVG9Xb3JrT24gPSBsYXRlc3RTdXNwZW5kZWRUaW1lO1xuICB9XG5cbiAgdmFyIGV4cGlyYXRpb25UaW1lID0gbmV4dEV4cGlyYXRpb25UaW1lVG9Xb3JrT247XG4gIGlmIChleHBpcmF0aW9uVGltZSAhPT0gTm9Xb3JrICYmIGVhcmxpZXN0U3VzcGVuZGVkVGltZSA+IGV4cGlyYXRpb25UaW1lKSB7XG4gICAgLy8gRXhwaXJlIHVzaW5nIHRoZSBlYXJsaWVzdCBrbm93biBleHBpcmF0aW9uIHRpbWUuXG4gICAgZXhwaXJhdGlvblRpbWUgPSBlYXJsaWVzdFN1c3BlbmRlZFRpbWU7XG4gIH1cblxuICByb290Lm5leHRFeHBpcmF0aW9uVGltZVRvV29ya09uID0gbmV4dEV4cGlyYXRpb25UaW1lVG9Xb3JrT247XG4gIHJvb3QuZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIGJhc2VQcm9wcykge1xuICBpZiAoQ29tcG9uZW50ICYmIENvbXBvbmVudC5kZWZhdWx0UHJvcHMpIHtcbiAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHMuIFRha2VuIGZyb20gUmVhY3RFbGVtZW50XG4gICAgdmFyIHByb3BzID0gX2Fzc2lnbih7fSwgYmFzZVByb3BzKTtcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gQ29tcG9uZW50LmRlZmF1bHRQcm9wcztcbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcHM7XG4gIH1cbiAgcmV0dXJuIGJhc2VQcm9wcztcbn1cblxuZnVuY3Rpb24gcmVhZExhenlDb21wb25lbnRUeXBlKGxhenlDb21wb25lbnQpIHtcbiAgdmFyIHN0YXR1cyA9IGxhenlDb21wb25lbnQuX3N0YXR1cztcbiAgdmFyIHJlc3VsdCA9IGxhenlDb21wb25lbnQuX3Jlc3VsdDtcbiAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICBjYXNlIFJlc29sdmVkOlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gcmVzdWx0O1xuICAgICAgICByZXR1cm4gQ29tcG9uZW50O1xuICAgICAgfVxuICAgIGNhc2UgUmVqZWN0ZWQ6XG4gICAgICB7XG4gICAgICAgIHZhciBlcnJvciA9IHJlc3VsdDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgY2FzZSBQZW5kaW5nOlxuICAgICAge1xuICAgICAgICB2YXIgdGhlbmFibGUgPSByZXN1bHQ7XG4gICAgICAgIHRocm93IHRoZW5hYmxlO1xuICAgICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIGxhenlDb21wb25lbnQuX3N0YXR1cyA9IFBlbmRpbmc7XG4gICAgICAgIHZhciBjdG9yID0gbGF6eUNvbXBvbmVudC5fY3RvcjtcbiAgICAgICAgdmFyIF90aGVuYWJsZSA9IGN0b3IoKTtcbiAgICAgICAgX3RoZW5hYmxlLnRoZW4oZnVuY3Rpb24gKG1vZHVsZU9iamVjdCkge1xuICAgICAgICAgIGlmIChsYXp5Q29tcG9uZW50Ll9zdGF0dXMgPT09IFBlbmRpbmcpIHtcbiAgICAgICAgICAgIHZhciBkZWZhdWx0RXhwb3J0ID0gbW9kdWxlT2JqZWN0LmRlZmF1bHQ7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChkZWZhdWx0RXhwb3J0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB3YXJuaW5nJDEoZmFsc2UsICdsYXp5OiBFeHBlY3RlZCB0aGUgcmVzdWx0IG9mIGEgZHluYW1pYyBpbXBvcnQoKSBjYWxsLiAnICsgJ0luc3RlYWQgcmVjZWl2ZWQ6ICVzXFxuXFxuWW91ciBjb2RlIHNob3VsZCBsb29rIGxpa2U6IFxcbiAgJyArIFwiY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcG9ydCgnLi9NeUNvbXBvbmVudCcpKVwiLCBtb2R1bGVPYmplY3QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXp5Q29tcG9uZW50Ll9zdGF0dXMgPSBSZXNvbHZlZDtcbiAgICAgICAgICAgIGxhenlDb21wb25lbnQuX3Jlc3VsdCA9IGRlZmF1bHRFeHBvcnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAobGF6eUNvbXBvbmVudC5fc3RhdHVzID09PSBQZW5kaW5nKSB7XG4gICAgICAgICAgICBsYXp5Q29tcG9uZW50Ll9zdGF0dXMgPSBSZWplY3RlZDtcbiAgICAgICAgICAgIGxhenlDb21wb25lbnQuX3Jlc3VsdCA9IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEhhbmRsZSBzeW5jaHJvbm91cyB0aGVuYWJsZXMuXG4gICAgICAgIHN3aXRjaCAobGF6eUNvbXBvbmVudC5fc3RhdHVzKSB7XG4gICAgICAgICAgY2FzZSBSZXNvbHZlZDpcbiAgICAgICAgICAgIHJldHVybiBsYXp5Q29tcG9uZW50Ll9yZXN1bHQ7XG4gICAgICAgICAgY2FzZSBSZWplY3RlZDpcbiAgICAgICAgICAgIHRocm93IGxhenlDb21wb25lbnQuX3Jlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBsYXp5Q29tcG9uZW50Ll9yZXN1bHQgPSBfdGhlbmFibGU7XG4gICAgICAgIHRocm93IF90aGVuYWJsZTtcbiAgICAgIH1cbiAgfVxufVxuXG52YXIgZmFrZUludGVybmFsSW5zdGFuY2UgPSB7fTtcbnZhciBpc0FycmF5JDEgPSBBcnJheS5pc0FycmF5O1xuXG4vLyBSZWFjdC5Db21wb25lbnQgdXNlcyBhIHNoYXJlZCBmcm96ZW4gb2JqZWN0IGJ5IGRlZmF1bHQuXG4vLyBXZSdsbCB1c2UgaXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgbmVlZCB0byBpbml0aWFsaXplIGxlZ2FjeSByZWZzLlxudmFyIGVtcHR5UmVmc09iamVjdCA9IG5ldyBSZWFjdC5Db21wb25lbnQoKS5yZWZzO1xuXG52YXIgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50ID0gdm9pZCAwO1xudmFyIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZSA9IHZvaWQgMDtcbnZhciBkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUgPSB2b2lkIDA7XG52YXIgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZSA9IHZvaWQgMDtcbnZhciBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGUgPSB2b2lkIDA7XG52YXIgd2Fybk9uVW5kZWZpbmVkRGVyaXZlZFN0YXRlID0gdm9pZCAwO1xudmFyIHdhcm5PbkludmFsaWRDYWxsYmFjayQxID0gdm9pZCAwO1xudmFyIGRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlID0gdm9pZCAwO1xudmFyIGRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzID0gdm9pZCAwO1xudmFyIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZSA9IHZvaWQgMDtcblxue1xuICBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcyA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlID0gbmV3IFNldCgpO1xuXG4gIHZhciBkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2sgPSBuZXcgU2V0KCk7XG5cbiAgd2Fybk9uSW52YWxpZENhbGxiYWNrJDEgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICBpZiAoY2FsbGJhY2sgPT09IG51bGwgfHwgdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBrZXkgPSBjYWxsZXJOYW1lICsgJ18nICsgY2FsbGJhY2s7XG4gICAgaWYgKCFkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2suaGFzKGtleSkpIHtcbiAgICAgIGRpZFdhcm5PbkludmFsaWRDYWxsYmFjay5hZGQoa2V5KTtcbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsZXJOYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuICB9O1xuXG4gIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZSA9IGZ1bmN0aW9uICh0eXBlLCBwYXJ0aWFsU3RhdGUpIHtcbiAgICBpZiAocGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKSB8fCAnQ29tcG9uZW50JztcbiAgICAgIGlmICghZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlLmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuICAgICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICclcy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKTogQSB2YWxpZCBzdGF0ZSBvYmplY3QgKG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQuICcgKyAnWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBUaGlzIGlzIHNvIGdyb3NzIGJ1dCBpdCdzIGF0IGxlYXN0IG5vbi1jcml0aWNhbCBhbmQgY2FuIGJlIHJlbW92ZWQgaWZcbiAgLy8gaXQgY2F1c2VzIHByb2JsZW1zLiBUaGlzIGlzIG1lYW50IHRvIGdpdmUgYSBuaWNlciBlcnJvciBtZXNzYWdlIGZvclxuICAvLyBSZWFjdERPTTE1LnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHJlYWN0RE9NMTZDb21wb25lbnQsXG4gIC8vIC4uLikpIHdoaWNoIG90aGVyd2lzZSB0aHJvd3MgYSBcIl9wcm9jZXNzQ2hpbGRDb250ZXh0IGlzIG5vdCBhIGZ1bmN0aW9uXCJcbiAgLy8gZXhjZXB0aW9uLlxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZmFrZUludGVybmFsSW5zdGFuY2UsICdfcHJvY2Vzc0NoaWxkQ29udGV4dCcsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgaW52YXJpYW50KGZhbHNlLCAnX3Byb2Nlc3NDaGlsZENvbnRleHQgaXMgbm90IGF2YWlsYWJsZSBpbiBSZWFjdCAxNisuIFRoaXMgbGlrZWx5IG1lYW5zIHlvdSBoYXZlIG11bHRpcGxlIGNvcGllcyBvZiBSZWFjdCBhbmQgYXJlIGF0dGVtcHRpbmcgdG8gbmVzdCBhIFJlYWN0IDE1IHRyZWUgaW5zaWRlIGEgUmVhY3QgMTYgdHJlZSB1c2luZyB1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lciwgd2hpY2ggaXNuXFwndCBzdXBwb3J0ZWQuIFRyeSB0byBtYWtlIHN1cmUgeW91IGhhdmUgb25seSBvbmUgY29weSBvZiBSZWFjdCAoYW5kIGlkZWFsbHksIHN3aXRjaCB0byBSZWFjdERPTS5jcmVhdGVQb3J0YWwpLicpO1xuICAgIH1cbiAgfSk7XG4gIE9iamVjdC5mcmVlemUoZmFrZUludGVybmFsSW5zdGFuY2UpO1xufVxuXG5mdW5jdGlvbiBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXh0UHJvcHMpIHtcbiAgdmFyIHByZXZTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAge1xuICAgIGlmIChkZWJ1Z1JlbmRlclBoYXNlU2lkZUVmZmVjdHMgfHwgZGVidWdSZW5kZXJQaGFzZVNpZGVFZmZlY3RzRm9yU3RyaWN0TW9kZSAmJiB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbiBleHRyYSB0aW1lIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cbiAgICAgIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHBhcnRpYWxTdGF0ZSA9IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSk7XG5cbiAge1xuICAgIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZShjdG9yLCBwYXJ0aWFsU3RhdGUpO1xuICB9XG4gIC8vIE1lcmdlIHRoZSBwYXJ0aWFsIHN0YXRlIGFuZCB0aGUgcHJldmlvdXMgc3RhdGUuXG4gIHZhciBtZW1vaXplZFN0YXRlID0gcGFydGlhbFN0YXRlID09PSBudWxsIHx8IHBhcnRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkID8gcHJldlN0YXRlIDogX2Fzc2lnbih7fSwgcHJldlN0YXRlLCBwYXJ0aWFsU3RhdGUpO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbWVtb2l6ZWRTdGF0ZTtcblxuICAvLyBPbmNlIHRoZSB1cGRhdGUgcXVldWUgaXMgZW1wdHksIHBlcnNpc3QgdGhlIGRlcml2ZWQgc3RhdGUgb250byB0aGVcbiAgLy8gYmFzZSBzdGF0ZS5cbiAgdmFyIHVwZGF0ZVF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG4gIGlmICh1cGRhdGVRdWV1ZSAhPT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzcy5leHBpcmF0aW9uVGltZSA9PT0gTm9Xb3JrKSB7XG4gICAgdXBkYXRlUXVldWUuYmFzZVN0YXRlID0gbWVtb2l6ZWRTdGF0ZTtcbiAgfVxufVxuXG52YXIgY2xhc3NDb21wb25lbnRVcGRhdGVyID0ge1xuICBpc01vdW50ZWQ6IGlzTW91bnRlZCxcbiAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAoaW5zdCwgcGF5bG9hZCwgY2FsbGJhY2spIHtcbiAgICB2YXIgZmliZXIgPSBnZXQoaW5zdCk7XG4gICAgdmFyIGN1cnJlbnRUaW1lID0gcmVxdWVzdEN1cnJlbnRUaW1lKCk7XG4gICAgdmFyIGV4cGlyYXRpb25UaW1lID0gY29tcHV0ZUV4cGlyYXRpb25Gb3JGaWJlcihjdXJyZW50VGltZSwgZmliZXIpO1xuXG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShleHBpcmF0aW9uVGltZSk7XG4gICAgdXBkYXRlLnBheWxvYWQgPSBwYXlsb2FkO1xuICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayQxKGNhbGxiYWNrLCAnc2V0U3RhdGUnKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUpO1xuICAgIHNjaGVkdWxlV29yayhmaWJlciwgZXhwaXJhdGlvblRpbWUpO1xuICB9LFxuICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAoaW5zdCwgcGF5bG9hZCwgY2FsbGJhY2spIHtcbiAgICB2YXIgZmliZXIgPSBnZXQoaW5zdCk7XG4gICAgdmFyIGN1cnJlbnRUaW1lID0gcmVxdWVzdEN1cnJlbnRUaW1lKCk7XG4gICAgdmFyIGV4cGlyYXRpb25UaW1lID0gY29tcHV0ZUV4cGlyYXRpb25Gb3JGaWJlcihjdXJyZW50VGltZSwgZmliZXIpO1xuXG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShleHBpcmF0aW9uVGltZSk7XG4gICAgdXBkYXRlLnRhZyA9IFJlcGxhY2VTdGF0ZTtcbiAgICB1cGRhdGUucGF5bG9hZCA9IHBheWxvYWQ7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2skMShjYWxsYmFjaywgJ3JlcGxhY2VTdGF0ZScpO1xuICAgICAgfVxuICAgICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgIGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSk7XG4gICAgc2NoZWR1bGVXb3JrKGZpYmVyLCBleHBpcmF0aW9uVGltZSk7XG4gIH0sXG4gIGVucXVldWVGb3JjZVVwZGF0ZTogZnVuY3Rpb24gKGluc3QsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBjdXJyZW50VGltZSA9IHJlcXVlc3RDdXJyZW50VGltZSgpO1xuICAgIHZhciBleHBpcmF0aW9uVGltZSA9IGNvbXB1dGVFeHBpcmF0aW9uRm9yRmliZXIoY3VycmVudFRpbWUsIGZpYmVyKTtcblxuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXhwaXJhdGlvblRpbWUpO1xuICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTtcblxuICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayQxKGNhbGxiYWNrLCAnZm9yY2VVcGRhdGUnKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUpO1xuICAgIHNjaGVkdWxlV29yayhmaWJlciwgZXhwaXJhdGlvblRpbWUpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3Rvciwgb2xkUHJvcHMsIG5ld1Byb3BzLCBvbGRTdGF0ZSwgbmV3U3RhdGUsIG5leHRDb250ZXh0KSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzdGFydFBoYXNlVGltZXIod29ya0luUHJvZ3Jlc3MsICdzaG91bGRDb21wb25lbnRVcGRhdGUnKTtcbiAgICB2YXIgc2hvdWxkVXBkYXRlID0gaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgIHN0b3BQaGFzZVRpbWVyKCk7XG5cbiAgICB7XG4gICAgICAhKHNob3VsZFVwZGF0ZSAhPT0gdW5kZWZpbmVkKSA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzLnNob3VsZENvbXBvbmVudFVwZGF0ZSgpOiBSZXR1cm5lZCB1bmRlZmluZWQgaW5zdGVhZCBvZiBhICcgKyAnYm9vbGVhbiB2YWx1ZS4gTWFrZSBzdXJlIHRvIHJldHVybiB0cnVlIG9yIGZhbHNlLicsIGdldENvbXBvbmVudE5hbWUoY3RvcikgfHwgJ0NvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIHJldHVybiBzaG91bGRVcGRhdGU7XG4gIH1cblxuICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgY3Rvci5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQpIHtcbiAgICByZXR1cm4gIXNoYWxsb3dFcXVhbChvbGRQcm9wcywgbmV3UHJvcHMpIHx8ICFzaGFsbG93RXF1YWwob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjaGVja0NsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAge1xuICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjdG9yKSB8fCAnQ29tcG9uZW50JztcbiAgICB2YXIgcmVuZGVyUHJlc2VudCA9IGluc3RhbmNlLnJlbmRlcjtcblxuICAgIGlmICghcmVuZGVyUHJlc2VudCkge1xuICAgICAgaWYgKGN0b3IucHJvdG90eXBlICYmIHR5cGVvZiBjdG9yLnByb3RvdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnJXMoLi4uKTogTm8gYHJlbmRlcmAgbWV0aG9kIGZvdW5kIG9uIHRoZSByZXR1cm5lZCBjb21wb25lbnQgJyArICdpbnN0YW5jZTogZGlkIHlvdSBhY2NpZGVudGFsbHkgcmV0dXJuIGFuIG9iamVjdCBmcm9tIHRoZSBjb25zdHJ1Y3Rvcj8nLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzKC4uLik6IE5vIGByZW5kZXJgIG1ldGhvZCBmb3VuZCBvbiB0aGUgcmV0dXJuZWQgY29tcG9uZW50ICcgKyAnaW5zdGFuY2U6IHlvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gZGVmaW5lIGByZW5kZXJgLicsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBub0dldEluaXRpYWxTdGF0ZU9uRVM2ID0gIWluc3RhbmNlLmdldEluaXRpYWxTdGF0ZSB8fCBpbnN0YW5jZS5nZXRJbml0aWFsU3RhdGUuaXNSZWFjdENsYXNzQXBwcm92ZWQgfHwgaW5zdGFuY2Uuc3RhdGU7XG4gICAgIW5vR2V0SW5pdGlhbFN0YXRlT25FUzYgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdnZXRJbml0aWFsU3RhdGUgd2FzIGRlZmluZWQgb24gJXMsIGEgcGxhaW4gSmF2YVNjcmlwdCBjbGFzcy4gJyArICdUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBjbGFzc2VzIGNyZWF0ZWQgdXNpbmcgUmVhY3QuY3JlYXRlQ2xhc3MuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGRlZmluZSBhIHN0YXRlIHByb3BlcnR5IGluc3RlYWQ/JywgbmFtZSkgOiB2b2lkIDA7XG4gICAgdmFyIG5vR2V0RGVmYXVsdFByb3BzT25FUzYgPSAhaW5zdGFuY2UuZ2V0RGVmYXVsdFByb3BzIHx8IGluc3RhbmNlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZDtcbiAgICAhbm9HZXREZWZhdWx0UHJvcHNPbkVTNiA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ2dldERlZmF1bHRQcm9wcyB3YXMgZGVmaW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiAnICsgJ1RoaXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGNsYXNzZXMgY3JlYXRlZCB1c2luZyBSZWFjdC5jcmVhdGVDbGFzcy4gJyArICdVc2UgYSBzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGRlZmF1bHRQcm9wcyBpbnN0ZWFkLicsIG5hbWUpIDogdm9pZCAwO1xuICAgIHZhciBub0luc3RhbmNlUHJvcFR5cGVzID0gIWluc3RhbmNlLnByb3BUeXBlcztcbiAgICAhbm9JbnN0YW5jZVByb3BUeXBlcyA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ3Byb3BUeXBlcyB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIHByb3BUeXBlcyBpbnN0ZWFkLicsIG5hbWUpIDogdm9pZCAwO1xuICAgIHZhciBub0luc3RhbmNlQ29udGV4dFR5cGUgPSAhaW5zdGFuY2UuY29udGV4dFR5cGU7XG4gICAgIW5vSW5zdGFuY2VDb250ZXh0VHlwZSA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ2NvbnRleHRUeXBlIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5cGUgaW5zdGVhZC4nLCBuYW1lKSA6IHZvaWQgMDtcbiAgICB2YXIgbm9JbnN0YW5jZUNvbnRleHRUeXBlcyA9ICFpbnN0YW5jZS5jb250ZXh0VHlwZXM7XG4gICAgIW5vSW5zdGFuY2VDb250ZXh0VHlwZXMgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdjb250ZXh0VHlwZXMgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBjb250ZXh0VHlwZXMgaW5zdGVhZC4nLCBuYW1lKSA6IHZvaWQgMDtcblxuICAgIGlmIChjdG9yLmNvbnRleHRUeXBlICYmIGN0b3IuY29udGV4dFR5cGVzICYmICFkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcy5oYXMoY3RvcikpIHtcbiAgICAgIGRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzLmFkZChjdG9yKTtcbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzIGRlY2xhcmVzIGJvdGggY29udGV4dFR5cGVzIGFuZCBjb250ZXh0VHlwZSBzdGF0aWMgcHJvcGVydGllcy4gJyArICdUaGUgbGVnYWN5IGNvbnRleHRUeXBlcyBwcm9wZXJ0eSB3aWxsIGJlIGlnbm9yZWQuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIG5vQ29tcG9uZW50U2hvdWxkVXBkYXRlID0gdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFNob3VsZFVwZGF0ZSAhPT0gJ2Z1bmN0aW9uJztcbiAgICAhbm9Db21wb25lbnRTaG91bGRVcGRhdGUgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50U2hvdWxkVXBkYXRlKCkuIERpZCB5b3UgbWVhbiBzaG91bGRDb21wb25lbnRVcGRhdGUoKT8gJyArICdUaGUgbmFtZSBpcyBwaHJhc2VkIGFzIGEgcXVlc3Rpb24gYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgJyArICdleHBlY3RlZCB0byByZXR1cm4gYSB2YWx1ZS4nLCBuYW1lKSA6IHZvaWQgMDtcbiAgICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgY3Rvci5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQgJiYgdHlwZW9mIGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgc2hvdWxkQ29tcG9uZW50VXBkYXRlKCkuICcgKyAnc2hvdWxkQ29tcG9uZW50VXBkYXRlIHNob3VsZCBub3QgYmUgdXNlZCB3aGVuIGV4dGVuZGluZyBSZWFjdC5QdXJlQ29tcG9uZW50LiAnICsgJ1BsZWFzZSBleHRlbmQgUmVhY3QuQ29tcG9uZW50IGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSBpcyB1c2VkLicsIGdldENvbXBvbmVudE5hbWUoY3RvcikgfHwgJ0EgcHVyZSBjb21wb25lbnQnKTtcbiAgICB9XG4gICAgdmFyIG5vQ29tcG9uZW50RGlkVW5tb3VudCA9IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVbm1vdW50ICE9PSAnZnVuY3Rpb24nO1xuICAgICFub0NvbXBvbmVudERpZFVubW91bnQgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50RGlkVW5tb3VudCgpLiBCdXQgdGhlcmUgaXMgbm8gc3VjaCBsaWZlY3ljbGUgbWV0aG9kLiAnICsgJ0RpZCB5b3UgbWVhbiBjb21wb25lbnRXaWxsVW5tb3VudCgpPycsIG5hbWUpIDogdm9pZCAwO1xuICAgIHZhciBub0NvbXBvbmVudERpZFJlY2VpdmVQcm9wcyA9IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRSZWNlaXZlUHJvcHMgIT09ICdmdW5jdGlvbic7XG4gICAgIW5vQ29tcG9uZW50RGlkUmVjZWl2ZVByb3BzID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudERpZFJlY2VpdmVQcm9wcygpLiBCdXQgdGhlcmUgaXMgbm8gc3VjaCBsaWZlY3ljbGUgbWV0aG9kLiAnICsgJ0lmIHlvdSBtZWFudCB0byB1cGRhdGUgdGhlIHN0YXRlIGluIHJlc3BvbnNlIHRvIGNoYW5naW5nIHByb3BzLCAnICsgJ3VzZSBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCkuIElmIHlvdSBtZWFudCB0byBmZXRjaCBkYXRhIG9yICcgKyAncnVuIHNpZGUtZWZmZWN0cyBvciBtdXRhdGlvbnMgYWZ0ZXIgUmVhY3QgaGFzIHVwZGF0ZWQgdGhlIFVJLCB1c2UgY29tcG9uZW50RGlkVXBkYXRlKCkuJywgbmFtZSkgOiB2b2lkIDA7XG4gICAgdmFyIG5vQ29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyA9IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzICE9PSAnZnVuY3Rpb24nO1xuICAgICFub0NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsIG5hbWUpIDogdm9pZCAwO1xuICAgIHZhciBub1Vuc2FmZUNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgPSB0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgIT09ICdmdW5jdGlvbic7XG4gICAgIW5vVW5zYWZlQ29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdVTlNBRkVfY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKT8nLCBuYW1lKSA6IHZvaWQgMDtcbiAgICB2YXIgaGFzTXV0YXRlZFByb3BzID0gaW5zdGFuY2UucHJvcHMgIT09IG5ld1Byb3BzO1xuICAgICEoaW5zdGFuY2UucHJvcHMgPT09IHVuZGVmaW5lZCB8fCAhaGFzTXV0YXRlZFByb3BzKSA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzKC4uLik6IFdoZW4gY2FsbGluZyBzdXBlcigpIGluIGAlc2AsIG1ha2Ugc3VyZSB0byBwYXNzICcgKyBcInVwIHRoZSBzYW1lIHByb3BzIHRoYXQgeW91ciBjb21wb25lbnQncyBjb25zdHJ1Y3RvciB3YXMgcGFzc2VkLlwiLCBuYW1lLCBuYW1lKSA6IHZvaWQgMDtcbiAgICB2YXIgbm9JbnN0YW5jZURlZmF1bHRQcm9wcyA9ICFpbnN0YW5jZS5kZWZhdWx0UHJvcHM7XG4gICAgIW5vSW5zdGFuY2VEZWZhdWx0UHJvcHMgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdTZXR0aW5nIGRlZmF1bHRQcm9wcyBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcyBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIGlnbm9yZWQuJyArICcgSW5zdGVhZCwgZGVmaW5lIGRlZmF1bHRQcm9wcyBhcyBhIHN0YXRpYyBwcm9wZXJ0eSBvbiAlcy4nLCBuYW1lLCBuYW1lKSA6IHZvaWQgMDtcblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSAhPT0gJ2Z1bmN0aW9uJyAmJiAhZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlLmhhcyhjdG9yKSkge1xuICAgICAgZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlLmFkZChjdG9yKTtcbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzOiBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIHNob3VsZCBiZSB1c2VkIHdpdGggY29tcG9uZW50RGlkVXBkYXRlKCkuICcgKyAnVGhpcyBjb21wb25lbnQgZGVmaW5lcyBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIG9ubHkuJywgZ2V0Q29tcG9uZW50TmFtZShjdG9yKSk7XG4gICAgfVxuXG4gICAgdmFyIG5vSW5zdGFuY2VHZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSB0eXBlb2YgaW5zdGFuY2UuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzICE9PSAnZnVuY3Rpb24nO1xuICAgICFub0luc3RhbmNlR2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnJXM6IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcygpIGlzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhIHN0YXRpYyBtZXRob2QuJywgbmFtZSkgOiB2b2lkIDA7XG4gICAgdmFyIG5vSW5zdGFuY2VHZXREZXJpdmVkU3RhdGVGcm9tQ2F0Y2ggPSB0eXBlb2YgaW5zdGFuY2UuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nO1xuICAgICFub0luc3RhbmNlR2V0RGVyaXZlZFN0YXRlRnJvbUNhdGNoID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnJXM6IGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcigpIGlzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhIHN0YXRpYyBtZXRob2QuJywgbmFtZSkgOiB2b2lkIDA7XG4gICAgdmFyIG5vU3RhdGljR2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPSB0eXBlb2YgY3Rvci5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSAhPT0gJ2Z1bmN0aW9uJztcbiAgICAhbm9TdGF0aWNHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzOiBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIGlzIGRlZmluZWQgYXMgYSBzdGF0aWMgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhbiBpbnN0YW5jZSBtZXRob2QuJywgbmFtZSkgOiB2b2lkIDA7XG4gICAgdmFyIF9zdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuICAgIGlmIChfc3RhdGUgJiYgKHR5cGVvZiBfc3RhdGUgIT09ICdvYmplY3QnIHx8IGlzQXJyYXkkMShfc3RhdGUpKSkge1xuICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnJXMuc3RhdGU6IG11c3QgYmUgc2V0IHRvIGFuIG9iamVjdCBvciBudWxsJywgbmFtZSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAhKHR5cGVvZiBjdG9yLmNoaWxkQ29udGV4dFR5cGVzID09PSAnb2JqZWN0JykgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICclcy5nZXRDaGlsZENvbnRleHQoKTogY2hpbGRDb250ZXh0VHlwZXMgbXVzdCBiZSBkZWZpbmVkIGluIG9yZGVyIHRvICcgKyAndXNlIGdldENoaWxkQ29udGV4dCgpLicsIG5hbWUpIDogdm9pZCAwO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnVwZGF0ZXIgPSBjbGFzc0NvbXBvbmVudFVwZGF0ZXI7XG4gIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGluc3RhbmNlO1xuICAvLyBUaGUgaW5zdGFuY2UgbmVlZHMgYWNjZXNzIHRvIHRoZSBmaWJlciBzbyB0aGF0IGl0IGNhbiBzY2hlZHVsZSB1cGRhdGVzXG4gIHNldChpbnN0YW5jZSwgd29ya0luUHJvZ3Jlc3MpO1xuICB7XG4gICAgaW5zdGFuY2UuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSA9IGZha2VJbnRlcm5hbEluc3RhbmNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHByb3BzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICB2YXIgaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPSBmYWxzZTtcbiAgdmFyIHVubWFza2VkQ29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgdmFyIGNvbnRleHQgPSBudWxsO1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuXG4gIHtcbiAgICBpZiAoJ2NvbnRleHRUeXBlJyBpbiBjdG9yKSB7XG4gICAgICB2YXIgaXNWYWxpZCA9XG4gICAgICAvLyBBbGxvdyBudWxsIGZvciBjb25kaXRpb25hbCBkZWNsYXJhdGlvblxuICAgICAgY29udGV4dFR5cGUgPT09IG51bGwgfHwgY29udGV4dFR5cGUgIT09IHVuZGVmaW5lZCAmJiBjb250ZXh0VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFICYmIGNvbnRleHRUeXBlLl9jb250ZXh0ID09PSB1bmRlZmluZWQ7IC8vIE5vdCBhIDxDb250ZXh0LkNvbnN1bWVyPlxuXG4gICAgICBpZiAoIWlzVmFsaWQgJiYgIWRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZS5oYXMoY3RvcikpIHtcbiAgICAgICAgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlLmFkZChjdG9yKTtcblxuICAgICAgICB2YXIgYWRkZW5kdW0gPSAnJztcbiAgICAgICAgaWYgKGNvbnRleHRUeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIHVuZGVmaW5lZC4gJyArICdUaGlzIGNhbiBiZSBjYXVzZWQgYnkgYSB0eXBvIG9yIGJ5IG1peGluZyB1cCBuYW1lZCBhbmQgZGVmYXVsdCBpbXBvcnRzLiAnICsgJ1RoaXMgY2FuIGFsc28gaGFwcGVuIGR1ZSB0byBhIGNpcmN1bGFyIGRlcGVuZGVuY3ksIHNvICcgKyAndHJ5IG1vdmluZyB0aGUgY3JlYXRlQ29udGV4dCgpIGNhbGwgdG8gYSBzZXBhcmF0ZSBmaWxlLic7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRleHRUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBIb3dldmVyLCBpdCBpcyBzZXQgdG8gYSAnICsgdHlwZW9mIGNvbnRleHRUeXBlICsgJy4nO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFKSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIERpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgdGhlIENvbnRleHQuUHJvdmlkZXIgaW5zdGVhZD8nO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlLl9jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyA8Q29udGV4dC5Db25zdW1lcj5cbiAgICAgICAgICBhZGRlbmR1bSA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyB0aGUgQ29udGV4dC5Db25zdW1lciBpbnN0ZWFkPyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIEhvd2V2ZXIsIGl0IGlzIHNldCB0byBhbiBvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY29udGV4dFR5cGUpLmpvaW4oJywgJykgKyAnfS4nO1xuICAgICAgICB9XG4gICAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzIGRlZmluZXMgYW4gaW52YWxpZCBjb250ZXh0VHlwZS4gJyArICdjb250ZXh0VHlwZSBzaG91bGQgcG9pbnQgdG8gdGhlIENvbnRleHQgb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZUNvbnRleHQoKS4lcycsIGdldENvbXBvbmVudE5hbWUoY3RvcikgfHwgJ0NvbXBvbmVudCcsIGFkZGVuZHVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgIGNvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICB2YXIgY29udGV4dFR5cGVzID0gY3Rvci5jb250ZXh0VHlwZXM7XG4gICAgaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPSBjb250ZXh0VHlwZXMgIT09IG51bGwgJiYgY29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQ7XG4gICAgY29udGV4dCA9IGlzTGVnYWN5Q29udGV4dENvbnN1bWVyID8gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KSA6IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgfVxuXG4gIC8vIEluc3RhbnRpYXRlIHR3aWNlIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cbiAge1xuICAgIGlmIChkZWJ1Z1JlbmRlclBoYXNlU2lkZUVmZmVjdHMgfHwgZGVidWdSZW5kZXJQaGFzZVNpZGVFZmZlY3RzRm9yU3RyaWN0TW9kZSAmJiB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgbmV3IGN0b3IocHJvcHMsIGNvbnRleHQpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIH1cbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IG5ldyBjdG9yKHByb3BzLCBjb250ZXh0KTtcbiAgdmFyIHN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlICE9PSBudWxsICYmIGluc3RhbmNlLnN0YXRlICE9PSB1bmRlZmluZWQgPyBpbnN0YW5jZS5zdGF0ZSA6IG51bGw7XG4gIGFkb3B0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nICYmIHN0YXRlID09PSBudWxsKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUoY3RvcikgfHwgJ0NvbXBvbmVudCc7XG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlLmFkZChjb21wb25lbnROYW1lKTtcbiAgICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnYCVzYCB1c2VzIGBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNgIGJ1dCBpdHMgaW5pdGlhbCBzdGF0ZSBpcyAnICsgJyVzLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZC4gSW5zdGVhZCwgZGVmaW5lIHRoZSBpbml0aWFsIHN0YXRlIGJ5ICcgKyAnYXNzaWduaW5nIGFuIG9iamVjdCB0byBgdGhpcy5zdGF0ZWAgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIGAlc2AuICcgKyAnVGhpcyBlbnN1cmVzIHRoYXQgYGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc2AgYXJndW1lbnRzIGhhdmUgYSBjb25zaXN0ZW50IHNoYXBlLicsIGNvbXBvbmVudE5hbWUsIGluc3RhbmNlLnN0YXRlID09PSBudWxsID8gJ251bGwnIDogJ3VuZGVmaW5lZCcsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIG5ldyBjb21wb25lbnQgQVBJcyBhcmUgZGVmaW5lZCwgXCJ1bnNhZmVcIiBsaWZlY3ljbGVzIHdvbid0IGJlIGNhbGxlZC5cbiAgICAvLyBXYXJuIGFib3V0IHRoZXNlIGxpZmVjeWNsZXMgaWYgdGhleSBhcmUgcHJlc2VudC5cbiAgICAvLyBEb24ndCB3YXJuIGFib3V0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgbWV0aG9kcyB0aG91Z2guXG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBmb3VuZFdpbGxNb3VudE5hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50Ll9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgICAgZm91bmRXaWxsTW91bnROYW1lID0gJ2NvbXBvbmVudFdpbGxNb3VudCc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvdW5kV2lsbE1vdW50TmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JztcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgICAgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA9ICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSAnVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxVcGRhdGVOYW1lID0gJ2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsVXBkYXRlTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSc7XG4gICAgICB9XG4gICAgICBpZiAoZm91bmRXaWxsTW91bnROYW1lICE9PSBudWxsIHx8IGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgIT09IG51bGwgfHwgZm91bmRXaWxsVXBkYXRlTmFtZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgX2NvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuICAgICAgICB2YXIgbmV3QXBpTmFtZSA9IHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/ICdnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKScgOiAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSc7XG4gICAgICAgIGlmICghZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5oYXMoX2NvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5hZGQoX2NvbXBvbmVudE5hbWUpO1xuICAgICAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1Vuc2FmZSBsZWdhY3kgbGlmZWN5Y2xlcyB3aWxsIG5vdCBiZSBjYWxsZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgbmV3IGNvbXBvbmVudCBBUElzLlxcblxcbicgKyAnJXMgdXNlcyAlcyBidXQgYWxzbyBjb250YWlucyB0aGUgZm9sbG93aW5nIGxlZ2FjeSBsaWZlY3ljbGVzOiVzJXMlc1xcblxcbicgKyAnVGhlIGFib3ZlIGxpZmVjeWNsZXMgc2hvdWxkIGJlIHJlbW92ZWQuIExlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6XFxuJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWFzeW5jLWNvbXBvbmVudC1saWZlY3ljbGUtaG9va3MnLCBfY29tcG9uZW50TmFtZSwgbmV3QXBpTmFtZSwgZm91bmRXaWxsTW91bnROYW1lICE9PSBudWxsID8gJ1xcbiAgJyArIGZvdW5kV2lsbE1vdW50TmFtZSA6ICcnLCBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lICE9PSBudWxsID8gJ1xcbiAgJyArIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgOiAnJywgZm91bmRXaWxsVXBkYXRlTmFtZSAhPT0gbnVsbCA/ICdcXG4gICcgKyBmb3VuZFdpbGxVcGRhdGVOYW1lIDogJycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ2FjaGUgdW5tYXNrZWQgY29udGV4dCBzbyB3ZSBjYW4gYXZvaWQgcmVjcmVhdGluZyBtYXNrZWQgY29udGV4dCB1bmxlc3MgbmVjZXNzYXJ5LlxuICAvLyBSZWFjdEZpYmVyQ29udGV4dCB1c3VhbGx5IHVwZGF0ZXMgdGhpcyBjYWNoZSBidXQgY2FuJ3QgZm9yIG5ld2x5LWNyZWF0ZWQgaW5zdGFuY2VzLlxuICBpZiAoaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIpIHtcbiAgICBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgY29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKSB7XG4gIHN0YXJ0UGhhc2VUaW1lcih3b3JrSW5Qcm9ncmVzcywgJ2NvbXBvbmVudFdpbGxNb3VudCcpO1xuICB2YXIgb2xkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTtcblxuICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCgpO1xuICB9XG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgfVxuXG4gIHN0b3BQaGFzZVRpbWVyKCk7XG5cbiAgaWYgKG9sZFN0YXRlICE9PSBpbnN0YW5jZS5zdGF0ZSkge1xuICAgIHtcbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzLmNvbXBvbmVudFdpbGxNb3VudCgpOiBBc3NpZ25pbmcgZGlyZWN0bHkgdG8gdGhpcy5zdGF0ZSBpcyAnICsgXCJkZXByZWNhdGVkIChleGNlcHQgaW5zaWRlIGEgY29tcG9uZW50J3MgXCIgKyAnY29uc3RydWN0b3IpLiBVc2Ugc2V0U3RhdGUgaW5zdGVhZC4nLCBnZXRDb21wb25lbnROYW1lKHdvcmtJblByb2dyZXNzLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICB9XG4gICAgY2xhc3NDb21wb25lbnRVcGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUoaW5zdGFuY2UsIGluc3RhbmNlLnN0YXRlLCBudWxsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCkge1xuICB2YXIgb2xkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTtcbiAgc3RhcnRQaGFzZVRpbWVyKHdvcmtJblByb2dyZXNzLCAnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcycpO1xuICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gIH1cbiAgc3RvcFBoYXNlVGltZXIoKTtcblxuICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IG9sZFN0YXRlKSB7XG4gICAge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKHdvcmtJblByb2dyZXNzLnR5cGUpIHx8ICdDb21wb25lbnQnO1xuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFN0YXRlQXNzaWdubWVudEZvckNvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSk7XG4gICAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKTogQXNzaWduaW5nIGRpcmVjdGx5IHRvICcgKyBcInRoaXMuc3RhdGUgaXMgZGVwcmVjYXRlZCAoZXhjZXB0IGluc2lkZSBhIGNvbXBvbmVudCdzIFwiICsgJ2NvbnN0cnVjdG9yKS4gVXNlIHNldFN0YXRlIGluc3RlYWQuJywgY29tcG9uZW50TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNsYXNzQ29tcG9uZW50VXBkYXRlci5lbnF1ZXVlUmVwbGFjZVN0YXRlKGluc3RhbmNlLCBpbnN0YW5jZS5zdGF0ZSwgbnVsbCk7XG4gIH1cbn1cblxuLy8gSW52b2tlcyB0aGUgbW91bnQgbGlmZS1jeWNsZXMgb24gYSBwcmV2aW91c2x5IG5ldmVyIHJlbmRlcmVkIGluc3RhbmNlLlxuZnVuY3Rpb24gbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAge1xuICAgIGNoZWNrQ2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMpO1xuICB9XG5cbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIGluc3RhbmNlLnJlZnMgPSBlbXB0eVJlZnNPYmplY3Q7XG5cbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBpbnN0YW5jZS5jb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIGluc3RhbmNlLmNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAge1xuICAgIGlmIChpbnN0YW5jZS5zdGF0ZSA9PT0gbmV3UHJvcHMpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjdG9yKSB8fCAnQ29tcG9uZW50JztcbiAgICAgIGlmICghZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlLmFkZChjb21wb25lbnROYW1lKTtcbiAgICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnJXM6IEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBhc3NpZ24gcHJvcHMgZGlyZWN0bHkgdG8gc3RhdGUgJyArIFwiYmVjYXVzZSB1cGRhdGVzIHRvIHByb3BzIHdvbid0IGJlIHJlZmxlY3RlZCBpbiBzdGF0ZS4gXCIgKyAnSW4gbW9zdCBjYXNlcywgaXQgaXMgYmV0dGVyIHRvIHVzZSBwcm9wcyBkaXJlY3RseS4nLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdE1vZGUpIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7XG5cbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgaWYgKHdhcm5BYm91dERlcHJlY2F0ZWRMaWZlY3ljbGVzKSB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmREZXByZWNhdGlvbldhcm5pbmdzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZVF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG4gIGlmICh1cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgdXBkYXRlUXVldWUsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXdQcm9wcyk7XG4gICAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB9XG5cbiAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG4gIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcbiAgICAvLyBJZiB3ZSBoYWQgYWRkaXRpb25hbCBzdGF0ZSB1cGRhdGVzIGR1cmluZyB0aGlzIGxpZmUtY3ljbGUsIGxldCdzXG4gICAgLy8gcHJvY2VzcyB0aGVtIG5vdy5cbiAgICB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICAgIGlmICh1cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCB1cGRhdGVRdWV1ZSwgbmV3UHJvcHMsIGluc3RhbmNlLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICBpbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBVcGRhdGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lTW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gIHZhciBvbGRQcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7XG4gIGluc3RhbmNlLnByb3BzID0gb2xkUHJvcHM7XG5cbiAgdmFyIG9sZENvbnRleHQgPSBpbnN0YW5jZS5jb250ZXh0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuICB2YXIgbmV4dENvbnRleHQgPSB2b2lkIDA7XG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgbmV4dENvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5leHRMZWdhY3lVbm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIG5leHRDb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgbmV4dExlZ2FjeVVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XG4gIHZhciBoYXNOZXdMaWZlY3ljbGVzID0gdHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbic7XG5cbiAgLy8gTm90ZTogRHVyaW5nIHRoZXNlIGxpZmUtY3ljbGVzLCBpbnN0YW5jZS5wcm9wcy9pbnN0YW5jZS5zdGF0ZSBhcmUgd2hhdFxuICAvLyBldmVyIHRoZSBwcmV2aW91c2x5IGF0dGVtcHRlZCB0byByZW5kZXIgLSBub3QgdGhlIFwiY3VycmVudFwiLiBIb3dldmVyLFxuICAvLyBkdXJpbmcgY29tcG9uZW50RGlkVXBkYXRlIHdlIHBhc3MgdGhlIFwiY3VycmVudFwiIHByb3BzLlxuXG4gIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzIHx8IG9sZENvbnRleHQgIT09IG5leHRDb250ZXh0KSB7XG4gICAgICBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKTtcblxuICB2YXIgb2xkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgbmV3U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSA9IG9sZFN0YXRlO1xuICB2YXIgdXBkYXRlUXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCB1cGRhdGVRdWV1ZSwgbmV3UHJvcHMsIGluc3RhbmNlLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB9XG4gIGlmIChvbGRQcm9wcyA9PT0gbmV3UHJvcHMgJiYgb2xkU3RhdGUgPT09IG5ld1N0YXRlICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpICYmICFjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkpIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBVcGRhdGU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAgIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG4gICAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgc3RhcnRQaGFzZVRpbWVyKHdvcmtJblByb2dyZXNzLCAnY29tcG9uZW50V2lsbE1vdW50Jyk7XG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICB9XG4gICAgICBzdG9wUGhhc2VUaW1lcigpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gVXBkYXRlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBVcGRhdGU7XG4gICAgfVxuXG4gICAgLy8gSWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybmVkIGZhbHNlLCB3ZSBzaG91bGQgc3RpbGwgdXBkYXRlIHRoZVxuICAgIC8vIG1lbW9pemVkIHN0YXRlIHRvIGluZGljYXRlIHRoYXQgdGhpcyB3b3JrIGNhbiBiZSByZXVzZWQuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5ld1Byb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UncyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHBvaW50ZXJzIGV2ZW5cbiAgLy8gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2UuXG4gIGluc3RhbmNlLnByb3BzID0gbmV3UHJvcHM7XG4gIGluc3RhbmNlLnN0YXRlID0gbmV3U3RhdGU7XG4gIGluc3RhbmNlLmNvbnRleHQgPSBuZXh0Q29udGV4dDtcblxuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufVxuXG4vLyBJbnZva2VzIHRoZSB1cGRhdGUgbGlmZS1jeWNsZXMgYW5kIHJldHVybnMgZmFsc2UgaWYgaXQgc2hvdWxkbid0IHJlcmVuZGVyLlxuZnVuY3Rpb24gdXBkYXRlQ2xhc3NJbnN0YW5jZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICBpbnN0YW5jZS5wcm9wcyA9IHdvcmtJblByb2dyZXNzLnR5cGUgPT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID8gb2xkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKHdvcmtJblByb2dyZXNzLnR5cGUsIG9sZFByb3BzKTtcblxuICB2YXIgb2xkQ29udGV4dCA9IGluc3RhbmNlLmNvbnRleHQ7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG4gIHZhciBuZXh0Q29udGV4dCA9IHZvaWQgMDtcbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBuZXh0Q29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmV4dFVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgbmV4dENvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBuZXh0VW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgdmFyIGhhc05ld0xpZmVjeWNsZXMgPSB0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJztcblxuICAvLyBOb3RlOiBEdXJpbmcgdGhlc2UgbGlmZS1jeWNsZXMsIGluc3RhbmNlLnByb3BzL2luc3RhbmNlLnN0YXRlIGFyZSB3aGF0XG4gIC8vIGV2ZXIgdGhlIHByZXZpb3VzbHkgYXR0ZW1wdGVkIHRvIHJlbmRlciAtIG5vdCB0aGUgXCJjdXJyZW50XCIuIEhvd2V2ZXIsXG4gIC8vIGR1cmluZyBjb21wb25lbnREaWRVcGRhdGUgd2UgcGFzcyB0aGUgXCJjdXJyZW50XCIgcHJvcHMuXG5cbiAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG4gIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGlmIChvbGRQcm9wcyAhPT0gbmV3UHJvcHMgfHwgb2xkQ29udGV4dCAhPT0gbmV4dENvbnRleHQpIHtcbiAgICAgIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpO1xuXG4gIHZhciBvbGRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBuZXdTdGF0ZSA9IGluc3RhbmNlLnN0YXRlID0gb2xkU3RhdGU7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIHVwZGF0ZVF1ZXVlLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIH1cblxuICBpZiAob2xkUHJvcHMgPT09IG5ld1Byb3BzICYmIG9sZFN0YXRlID09PSBuZXdTdGF0ZSAmJiAhaGFzQ29udGV4dENoYW5nZWQoKSAmJiAhY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpKSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKG9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gVXBkYXRlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAob2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBTbmFwc2hvdDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXdQcm9wcyk7XG4gICAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB9XG5cbiAgdmFyIHNob3VsZFVwZGF0ZSA9IGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSB8fCBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3Rvciwgb2xkUHJvcHMsIG5ld1Byb3BzLCBvbGRTdGF0ZSwgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcblxuICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gICAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cbiAgICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIHN0YXJ0UGhhc2VUaW1lcih3b3JrSW5Qcm9ncmVzcywgJ2NvbXBvbmVudFdpbGxVcGRhdGUnKTtcbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgIH1cbiAgICAgIHN0b3BQaGFzZVRpbWVyKCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gVXBkYXRlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gU25hcHNob3Q7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChvbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnIHw9IFVwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKG9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gU25hcHNob3Q7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybmVkIGZhbHNlLCB3ZSBzaG91bGQgc3RpbGwgdXBkYXRlIHRoZVxuICAgIC8vIG1lbW9pemVkIHByb3BzL3N0YXRlIHRvIGluZGljYXRlIHRoYXQgdGhpcyB3b3JrIGNhbiBiZSByZXVzZWQuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5ld1Byb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UncyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHBvaW50ZXJzIGV2ZW5cbiAgLy8gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2UuXG4gIGluc3RhbmNlLnByb3BzID0gbmV3UHJvcHM7XG4gIGluc3RhbmNlLnN0YXRlID0gbmV3U3RhdGU7XG4gIGluc3RhbmNlLmNvbnRleHQgPSBuZXh0Q29udGV4dDtcblxuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufVxuXG52YXIgZGlkV2FybkFib3V0TWFwcyA9IHZvaWQgMDtcbnZhciBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzID0gdm9pZCAwO1xudmFyIGRpZFdhcm5BYm91dFN0cmluZ1JlZkluU3RyaWN0TW9kZSA9IHZvaWQgMDtcbnZhciBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB2b2lkIDA7XG52YXIgb3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nID0gdm9pZCAwO1xudmFyIHdhcm5Gb3JNaXNzaW5nS2V5ID0gZnVuY3Rpb24gKGNoaWxkKSB7fTtcblxue1xuICBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dEdlbmVyYXRvcnMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0U3RyaW5nUmVmSW5TdHJpY3RNb2RlID0ge307XG5cbiAgLyoqXG4gICAqIFdhcm4gaWYgdGhlcmUncyBubyBrZXkgZXhwbGljaXRseSBzZXQgb24gZHluYW1pYyBhcnJheXMgb2YgY2hpbGRyZW4gb3JcbiAgICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gICAqIHVwZGF0ZXMuXG4gICAqL1xuICBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTtcbiAgb3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nID0ge307XG5cbiAgd2FybkZvck1pc3NpbmdLZXkgPSBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWNoaWxkLl9zdG9yZSB8fCBjaGlsZC5fc3RvcmUudmFsaWRhdGVkIHx8IGNoaWxkLmtleSAhPSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgICEodHlwZW9mIGNoaWxkLl9zdG9yZSA9PT0gJ29iamVjdCcpID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3QgQ29tcG9uZW50IGluIHdhcm5Gb3JNaXNzaW5nS2V5IHNob3VsZCBoYXZlIGEgX3N0b3JlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpIDogdm9pZCAwO1xuICAgIGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuXG4gICAgdmFyIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8gPSAnRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgJyArICdcImtleVwiIHByb3AuIFNlZSBodHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmcta2V5cyBmb3IgJyArICdtb3JlIGluZm9ybWF0aW9uLicgKyBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2KCk7XG4gICAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBvd25lckhhc0tleVVzZVdhcm5pbmdbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10gPSB0cnVlO1xuXG4gICAgd2FybmluZyQxKGZhbHNlLCAnRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgJyArICdcImtleVwiIHByb3AuIFNlZSBodHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmcta2V5cyBmb3IgJyArICdtb3JlIGluZm9ybWF0aW9uLicpO1xuICB9O1xufVxuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbmZ1bmN0aW9uIGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudCQkMSwgZWxlbWVudCkge1xuICB2YXIgbWl4ZWRSZWYgPSBlbGVtZW50LnJlZjtcbiAgaWYgKG1peGVkUmVmICE9PSBudWxsICYmIHR5cGVvZiBtaXhlZFJlZiAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWl4ZWRSZWYgIT09ICdvYmplY3QnKSB7XG4gICAge1xuICAgICAgaWYgKHJldHVybkZpYmVyLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShyZXR1cm5GaWJlci50eXBlKSB8fCAnQ29tcG9uZW50JztcbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZJblN0cmljdE1vZGVbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdBIHN0cmluZyByZWYsIFwiJXNcIiwgaGFzIGJlZW4gZm91bmQgd2l0aGluIGEgc3RyaWN0IG1vZGUgdHJlZS4gJyArICdTdHJpbmcgcmVmcyBhcmUgYSBzb3VyY2Ugb2YgcG90ZW50aWFsIGJ1Z3MgYW5kIHNob3VsZCBiZSBhdm9pZGVkLiAnICsgJ1dlIHJlY29tbWVuZCB1c2luZyBjcmVhdGVSZWYoKSBpbnN0ZWFkLicgKyAnXFxuJXMnICsgJ1xcblxcbkxlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTonICsgJ1xcbmh0dHBzOi8vZmIubWUvcmVhY3Qtc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIG1peGVkUmVmLCBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2QocmV0dXJuRmliZXIpKTtcbiAgICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZJblN0cmljdE1vZGVbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQuX293bmVyKSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBpbnN0ID0gdm9pZCAwO1xuICAgICAgaWYgKG93bmVyKSB7XG4gICAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7XG4gICAgICAgICEob3duZXJGaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSA/IGludmFyaWFudChmYWxzZSwgJ0Z1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGhhdmUgcmVmcy4gRGlkIHlvdSBtZWFuIHRvIHVzZSBSZWFjdC5mb3J3YXJkUmVmKCk/JykgOiB2b2lkIDA7XG4gICAgICAgIGluc3QgPSBvd25lckZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIH1cbiAgICAgICFpbnN0ID8gaW52YXJpYW50KGZhbHNlLCAnTWlzc2luZyBvd25lciBmb3Igc3RyaW5nIHJlZiAlcy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBtaXhlZFJlZikgOiB2b2lkIDA7XG4gICAgICB2YXIgc3RyaW5nUmVmID0gJycgKyBtaXhlZFJlZjtcbiAgICAgIC8vIENoZWNrIGlmIHByZXZpb3VzIHN0cmluZyByZWYgbWF0Y2hlcyBuZXcgc3RyaW5nIHJlZlxuICAgICAgaWYgKGN1cnJlbnQkJDEgIT09IG51bGwgJiYgY3VycmVudCQkMS5yZWYgIT09IG51bGwgJiYgdHlwZW9mIGN1cnJlbnQkJDEucmVmID09PSAnZnVuY3Rpb24nICYmIGN1cnJlbnQkJDEucmVmLl9zdHJpbmdSZWYgPT09IHN0cmluZ1JlZikge1xuICAgICAgICByZXR1cm4gY3VycmVudCQkMS5yZWY7XG4gICAgICB9XG4gICAgICB2YXIgcmVmID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciByZWZzID0gaW5zdC5yZWZzO1xuICAgICAgICBpZiAocmVmcyA9PT0gZW1wdHlSZWZzT2JqZWN0KSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBhIGxhenkgcG9vbGVkIGZyb3plbiBvYmplY3QsIHNvIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZS5cbiAgICAgICAgICByZWZzID0gaW5zdC5yZWZzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgZGVsZXRlIHJlZnNbc3RyaW5nUmVmXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWZzW3N0cmluZ1JlZl0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJlZi5fc3RyaW5nUmVmID0gc3RyaW5nUmVmO1xuICAgICAgcmV0dXJuIHJlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgISh0eXBlb2YgbWl4ZWRSZWYgPT09ICdzdHJpbmcnKSA/IGludmFyaWFudChmYWxzZSwgJ0V4cGVjdGVkIHJlZiB0byBiZSBhIGZ1bmN0aW9uLCBhIHN0cmluZywgYW4gb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZVJlZigpLCBvciBudWxsLicpIDogdm9pZCAwO1xuICAgICAgIWVsZW1lbnQuX293bmVyID8gaW52YXJpYW50KGZhbHNlLCAnRWxlbWVudCByZWYgd2FzIHNwZWNpZmllZCBhcyBhIHN0cmluZyAoJXMpIGJ1dCBubyBvd25lciB3YXMgc2V0LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4xLiBZb3UgbWF5IGJlIGFkZGluZyBhIHJlZiB0byBhIGZ1bmN0aW9uIGNvbXBvbmVudFxcbjIuIFlvdSBtYXkgYmUgYWRkaW5nIGEgcmVmIHRvIGEgY29tcG9uZW50IHRoYXQgd2FzIG5vdCBjcmVhdGVkIGluc2lkZSBhIGNvbXBvbmVudFxcJ3MgcmVuZGVyIG1ldGhvZFxcbjMuIFlvdSBoYXZlIG11bHRpcGxlIGNvcGllcyBvZiBSZWFjdCBsb2FkZWRcXG5TZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC1yZWZzLW11c3QtaGF2ZS1vd25lciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLCBtaXhlZFJlZikgOiB2b2lkIDA7XG4gICAgfVxuICB9XG4gIHJldHVybiBtaXhlZFJlZjtcbn1cblxuZnVuY3Rpb24gdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCkge1xuICBpZiAocmV0dXJuRmliZXIudHlwZSAhPT0gJ3RleHRhcmVhJykge1xuICAgIHZhciBhZGRlbmR1bSA9ICcnO1xuICAgIHtcbiAgICAgIGFkZGVuZHVtID0gJyBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5ICcgKyAnaW5zdGVhZC4nICsgZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldigpO1xuICAgIH1cbiAgICBpbnZhcmlhbnQoZmFsc2UsICdPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6ICVzKS4lcycsIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXdDaGlsZCkgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhuZXdDaGlsZCkuam9pbignLCAnKSArICd9JyA6IG5ld0NoaWxkLCBhZGRlbmR1bSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gd2Fybk9uRnVuY3Rpb25UeXBlKCkge1xuICB2YXIgY3VycmVudENvbXBvbmVudEVycm9ySW5mbyA9ICdGdW5jdGlvbnMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkLiBUaGlzIG1heSBoYXBwZW4gaWYgJyArICd5b3UgcmV0dXJuIGEgQ29tcG9uZW50IGluc3RlYWQgb2YgPENvbXBvbmVudCAvPiBmcm9tIHJlbmRlci4gJyArICdPciBtYXliZSB5b3UgbWVhbnQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHJhdGhlciB0aGFuIHJldHVybiBpdC4nICsgZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldigpO1xuXG4gIGlmIChvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgb3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dID0gdHJ1ZTtcblxuICB3YXJuaW5nJDEoZmFsc2UsICdGdW5jdGlvbnMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkLiBUaGlzIG1heSBoYXBwZW4gaWYgJyArICd5b3UgcmV0dXJuIGEgQ29tcG9uZW50IGluc3RlYWQgb2YgPENvbXBvbmVudCAvPiBmcm9tIHJlbmRlci4gJyArICdPciBtYXliZSB5b3UgbWVhbnQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHJhdGhlciB0aGFuIHJldHVybiBpdC4nKTtcbn1cblxuLy8gVGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGV4aXN0cyBiZWNhdXNlIEkgZXhwZWN0IHRvIGNsb25lIHRoZSBjb2RlIGluIGVhY2ggcGF0aFxuLy8gdG8gYmUgYWJsZSB0byBvcHRpbWl6ZSBlYWNoIHBhdGggaW5kaXZpZHVhbGx5IGJ5IGJyYW5jaGluZyBlYXJseS4gVGhpcyBuZWVkc1xuLy8gYSBjb21waWxlciBvciB3ZSBjYW4gZG8gaXQgbWFudWFsbHkuIEhlbHBlcnMgdGhhdCBkb24ndCBuZWVkIHRoaXMgYnJhbmNoaW5nXG4vLyBsaXZlIG91dHNpZGUgb2YgdGhpcyBmdW5jdGlvbi5cbmZ1bmN0aW9uIENoaWxkUmVjb25jaWxlcihzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gIGZ1bmN0aW9uIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZFRvRGVsZXRlKSB7XG4gICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBOb29wLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBEZWxldGlvbnMgYXJlIGFkZGVkIGluIHJldmVyc2VkIG9yZGVyIHNvIHdlIGFkZCBpdCB0byB0aGUgZnJvbnQuXG4gICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIHJldHVybiBmaWJlcidzIGVmZmVjdCBsaXN0IGlzIGVtcHR5IGV4Y2VwdCBmb3JcbiAgICAvLyBkZWxldGlvbnMsIHNvIHdlIGNhbiBqdXN0IGFwcGVuZCB0aGUgZGVsZXRpb24gdG8gdGhlIGxpc3QuIFRoZSByZW1haW5pbmdcbiAgICAvLyBlZmZlY3RzIGFyZW4ndCBhZGRlZCB1bnRpbCB0aGUgY29tcGxldGUgcGhhc2UuIE9uY2Ugd2UgaW1wbGVtZW50XG4gICAgLy8gcmVzdW1pbmcsIHRoaXMgbWF5IG5vdCBiZSB0cnVlLlxuICAgIHZhciBsYXN0ID0gcmV0dXJuRmliZXIubGFzdEVmZmVjdDtcbiAgICBpZiAobGFzdCAhPT0gbnVsbCkge1xuICAgICAgbGFzdC5uZXh0RWZmZWN0ID0gY2hpbGRUb0RlbGV0ZTtcbiAgICAgIHJldHVybkZpYmVyLmxhc3RFZmZlY3QgPSBjaGlsZFRvRGVsZXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm5GaWJlci5maXJzdEVmZmVjdCA9IHJldHVybkZpYmVyLmxhc3RFZmZlY3QgPSBjaGlsZFRvRGVsZXRlO1xuICAgIH1cbiAgICBjaGlsZFRvRGVsZXRlLm5leHRFZmZlY3QgPSBudWxsO1xuICAgIGNoaWxkVG9EZWxldGUuZWZmZWN0VGFnID0gRGVsZXRpb247XG4gIH1cblxuICBmdW5jdGlvbiBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpIHtcbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIE5vb3AuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBGb3IgdGhlIHNob3VsZENsb25lIGNhc2UsIHRoaXMgY291bGQgYmUgbWljcm8tb3B0aW1pemVkIGEgYml0IGJ5XG4gICAgLy8gYXNzdW1pbmcgdGhhdCBhZnRlciB0aGUgZmlyc3QgY2hpbGQgd2UndmUgYWxyZWFkeSBhZGRlZCBldmVyeXRoaW5nLlxuICAgIHZhciBjaGlsZFRvRGVsZXRlID0gY3VycmVudEZpcnN0Q2hpbGQ7XG4gICAgd2hpbGUgKGNoaWxkVG9EZWxldGUgIT09IG51bGwpIHtcbiAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZFRvRGVsZXRlKTtcbiAgICAgIGNoaWxkVG9EZWxldGUgPSBjaGlsZFRvRGVsZXRlLnNpYmxpbmc7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKSB7XG4gICAgLy8gQWRkIHRoZSByZW1haW5pbmcgY2hpbGRyZW4gdG8gYSB0ZW1wb3JhcnkgbWFwIHNvIHRoYXQgd2UgY2FuIGZpbmQgdGhlbSBieVxuICAgIC8vIGtleXMgcXVpY2tseS4gSW1wbGljaXQgKG51bGwpIGtleXMgZ2V0IGFkZGVkIHRvIHRoaXMgc2V0IHdpdGggdGhlaXIgaW5kZXhcbiAgICB2YXIgZXhpc3RpbmdDaGlsZHJlbiA9IG5ldyBNYXAoKTtcblxuICAgIHZhciBleGlzdGluZ0NoaWxkID0gY3VycmVudEZpcnN0Q2hpbGQ7XG4gICAgd2hpbGUgKGV4aXN0aW5nQ2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGlmIChleGlzdGluZ0NoaWxkLmtleSAhPT0gbnVsbCkge1xuICAgICAgICBleGlzdGluZ0NoaWxkcmVuLnNldChleGlzdGluZ0NoaWxkLmtleSwgZXhpc3RpbmdDaGlsZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGlzdGluZ0NoaWxkcmVuLnNldChleGlzdGluZ0NoaWxkLmluZGV4LCBleGlzdGluZ0NoaWxkKTtcbiAgICAgIH1cbiAgICAgIGV4aXN0aW5nQ2hpbGQgPSBleGlzdGluZ0NoaWxkLnNpYmxpbmc7XG4gICAgfVxuICAgIHJldHVybiBleGlzdGluZ0NoaWxkcmVuO1xuICB9XG5cbiAgZnVuY3Rpb24gdXNlRmliZXIoZmliZXIsIHBlbmRpbmdQcm9wcywgZXhwaXJhdGlvblRpbWUpIHtcbiAgICAvLyBXZSBjdXJyZW50bHkgc2V0IHNpYmxpbmcgdG8gbnVsbCBhbmQgaW5kZXggdG8gMCBoZXJlIGJlY2F1c2UgaXQgaXMgZWFzeVxuICAgIC8vIHRvIGZvcmdldCB0byBkbyBiZWZvcmUgcmV0dXJuaW5nIGl0LiBFLmcuIGZvciB0aGUgc2luZ2xlIGNoaWxkIGNhc2UuXG4gICAgdmFyIGNsb25lID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoZmliZXIsIHBlbmRpbmdQcm9wcywgZXhwaXJhdGlvblRpbWUpO1xuICAgIGNsb25lLmluZGV4ID0gMDtcbiAgICBjbG9uZS5zaWJsaW5nID0gbnVsbDtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBmdW5jdGlvbiBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0luZGV4KSB7XG4gICAgbmV3RmliZXIuaW5kZXggPSBuZXdJbmRleDtcbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIE5vb3AuXG4gICAgICByZXR1cm4gbGFzdFBsYWNlZEluZGV4O1xuICAgIH1cbiAgICB2YXIgY3VycmVudCQkMSA9IG5ld0ZpYmVyLmFsdGVybmF0ZTtcbiAgICBpZiAoY3VycmVudCQkMSAhPT0gbnVsbCkge1xuICAgICAgdmFyIG9sZEluZGV4ID0gY3VycmVudCQkMS5pbmRleDtcbiAgICAgIGlmIChvbGRJbmRleCA8IGxhc3RQbGFjZWRJbmRleCkge1xuICAgICAgICAvLyBUaGlzIGlzIGEgbW92ZS5cbiAgICAgICAgbmV3RmliZXIuZWZmZWN0VGFnID0gUGxhY2VtZW50O1xuICAgICAgICByZXR1cm4gbGFzdFBsYWNlZEluZGV4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBpdGVtIGNhbiBzdGF5IGluIHBsYWNlLlxuICAgICAgICByZXR1cm4gb2xkSW5kZXg7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgaXMgYW4gaW5zZXJ0aW9uLlxuICAgICAgbmV3RmliZXIuZWZmZWN0VGFnID0gUGxhY2VtZW50O1xuICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwbGFjZVNpbmdsZUNoaWxkKG5ld0ZpYmVyKSB7XG4gICAgLy8gVGhpcyBpcyBzaW1wbGVyIGZvciB0aGUgc2luZ2xlIGNoaWxkIGNhc2UuIFdlIG9ubHkgbmVlZCB0byBkbyBhXG4gICAgLy8gcGxhY2VtZW50IGZvciBpbnNlcnRpbmcgbmV3IGNoaWxkcmVuLlxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgbmV3RmliZXIuZWZmZWN0VGFnID0gUGxhY2VtZW50O1xuICAgIH1cbiAgICByZXR1cm4gbmV3RmliZXI7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudCQkMSwgdGV4dENvbnRlbnQsIGV4cGlyYXRpb25UaW1lKSB7XG4gICAgaWYgKGN1cnJlbnQkJDEgPT09IG51bGwgfHwgY3VycmVudCQkMS50YWcgIT09IEhvc3RUZXh0KSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tVGV4dCh0ZXh0Q29udGVudCwgcmV0dXJuRmliZXIubW9kZSwgZXhwaXJhdGlvblRpbWUpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQkJDEsIHRleHRDb250ZW50LCBleHBpcmF0aW9uVGltZSk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50JCQxLCBlbGVtZW50LCBleHBpcmF0aW9uVGltZSkge1xuICAgIGlmIChjdXJyZW50JCQxICE9PSBudWxsICYmIGN1cnJlbnQkJDEuZWxlbWVudFR5cGUgPT09IGVsZW1lbnQudHlwZSkge1xuICAgICAgLy8gTW92ZSBiYXNlZCBvbiBpbmRleFxuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCQkMSwgZWxlbWVudC5wcm9wcywgZXhwaXJhdGlvblRpbWUpO1xuICAgICAgZXhpc3RpbmcucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50JCQxLCBlbGVtZW50KTtcbiAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAge1xuICAgICAgICBleGlzdGluZy5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgICAgIGV4aXN0aW5nLl9kZWJ1Z093bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluc2VydFxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21FbGVtZW50KGVsZW1lbnQsIHJldHVybkZpYmVyLm1vZGUsIGV4cGlyYXRpb25UaW1lKTtcbiAgICAgIGNyZWF0ZWQucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50JCQxLCBlbGVtZW50KTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnQkJDEsIHBvcnRhbCwgZXhwaXJhdGlvblRpbWUpIHtcbiAgICBpZiAoY3VycmVudCQkMSA9PT0gbnVsbCB8fCBjdXJyZW50JCQxLnRhZyAhPT0gSG9zdFBvcnRhbCB8fCBjdXJyZW50JCQxLnN0YXRlTm9kZS5jb250YWluZXJJbmZvICE9PSBwb3J0YWwuY29udGFpbmVySW5mbyB8fCBjdXJyZW50JCQxLnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiAhPT0gcG9ydGFsLmltcGxlbWVudGF0aW9uKSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgcmV0dXJuRmliZXIubW9kZSwgZXhwaXJhdGlvblRpbWUpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQkJDEsIHBvcnRhbC5jaGlsZHJlbiB8fCBbXSwgZXhwaXJhdGlvblRpbWUpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIGN1cnJlbnQkJDEsIGZyYWdtZW50LCBleHBpcmF0aW9uVGltZSwga2V5KSB7XG4gICAgaWYgKGN1cnJlbnQkJDEgPT09IG51bGwgfHwgY3VycmVudCQkMS50YWcgIT09IEZyYWdtZW50KSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZnJhZ21lbnQsIHJldHVybkZpYmVyLm1vZGUsIGV4cGlyYXRpb25UaW1lLCBrZXkpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQkJDEsIGZyYWdtZW50LCBleHBpcmF0aW9uVGltZSk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgbmV3Q2hpbGQsIGV4cGlyYXRpb25UaW1lKSB7XG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVGV4dCBub2RlcyBkb24ndCBoYXZlIGtleXMuIElmIHRoZSBwcmV2aW91cyBub2RlIGlzIGltcGxpY2l0bHkga2V5ZWRcbiAgICAgIC8vIHdlIGNhbiBjb250aW51ZSB0byByZXBsYWNlIGl0IHdpdGhvdXQgYWJvcnRpbmcgZXZlbiBpZiBpdCBpcyBub3QgYSB0ZXh0XG4gICAgICAvLyBub2RlLlxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KCcnICsgbmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGV4cGlyYXRpb25UaW1lKTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX2NyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21FbGVtZW50KG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBleHBpcmF0aW9uVGltZSk7XG4gICAgICAgICAgICBfY3JlYXRlZC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIG51bGwsIG5ld0NoaWxkKTtcbiAgICAgICAgICAgIF9jcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX2NyZWF0ZWQyID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBleHBpcmF0aW9uVGltZSk7XG4gICAgICAgICAgICBfY3JlYXRlZDIucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgICByZXR1cm4gX2NyZWF0ZWQyO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIHZhciBfY3JlYXRlZDMgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgZXhwaXJhdGlvblRpbWUsIG51bGwpO1xuICAgICAgICBfY3JlYXRlZDMucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgIHJldHVybiBfY3JlYXRlZDM7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGV4cGlyYXRpb25UaW1lKSB7XG4gICAgLy8gVXBkYXRlIHRoZSBmaWJlciBpZiB0aGUga2V5cyBtYXRjaCwgb3RoZXJ3aXNlIHJldHVybiBudWxsLlxuXG4gICAgdmFyIGtleSA9IG9sZEZpYmVyICE9PSBudWxsID8gb2xkRmliZXIua2V5IDogbnVsbDtcblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBrZXlzLiBJZiB0aGUgcHJldmlvdXMgbm9kZSBpcyBpbXBsaWNpdGx5IGtleWVkXG4gICAgICAvLyB3ZSBjYW4gY29udGludWUgdG8gcmVwbGFjZSBpdCB3aXRob3V0IGFib3J0aW5nIGV2ZW4gaWYgaXQgaXMgbm90IGEgdGV4dFxuICAgICAgLy8gbm9kZS5cbiAgICAgIGlmIChrZXkgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIG9sZEZpYmVyLCAnJyArIG5ld0NoaWxkLCBleHBpcmF0aW9uVGltZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKG5ld0NoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgICAgICAgIGlmIChuZXdDaGlsZC50eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQucHJvcHMuY2hpbGRyZW4sIGV4cGlyYXRpb25UaW1lLCBrZXkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAobmV3Q2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBleHBpcmF0aW9uVGltZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICBpZiAoa2V5ICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgZXhwaXJhdGlvblRpbWUsIG51bGwpO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZCwgZXhwaXJhdGlvblRpbWUpIHtcbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cywgc28gd2UgbmVpdGhlciBoYXZlIHRvIGNoZWNrIHRoZSBvbGQgbm9yXG4gICAgICAvLyBuZXcgbm9kZSBmb3IgdGhlIGtleS4gSWYgYm90aCBhcmUgdGV4dCBub2RlcywgdGhleSBtYXRjaC5cbiAgICAgIHZhciBtYXRjaGVkRmliZXIgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdJZHgpIHx8IG51bGw7XG4gICAgICByZXR1cm4gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIG1hdGNoZWRGaWJlciwgJycgKyBuZXdDaGlsZCwgZXhwaXJhdGlvblRpbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfbWF0Y2hlZEZpYmVyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3Q2hpbGQua2V5ID09PSBudWxsID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5KSB8fCBudWxsO1xuICAgICAgICAgICAgaWYgKG5ld0NoaWxkLnR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyLCBuZXdDaGlsZC5wcm9wcy5jaGlsZHJlbiwgZXhwaXJhdGlvblRpbWUsIG5ld0NoaWxkLmtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlRWxlbWVudChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlciwgbmV3Q2hpbGQsIGV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3Q2hpbGQua2V5ID09PSBudWxsID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5KSB8fCBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlcjIsIG5ld0NoaWxkLCBleHBpcmF0aW9uVGltZSk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIzID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3SWR4KSB8fCBudWxsO1xuICAgICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIzLCBuZXdDaGlsZCwgZXhwaXJhdGlvblRpbWUsIG51bGwpO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhcm5zIGlmIHRoZXJlIGlzIGEgZHVwbGljYXRlIG9yIG1pc3Npbmcga2V5XG4gICAqL1xuICBmdW5jdGlvbiB3YXJuT25JbnZhbGlkS2V5KGNoaWxkLCBrbm93bktleXMpIHtcbiAgICB7XG4gICAgICBpZiAodHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JyB8fCBjaGlsZCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ga25vd25LZXlzO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChjaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB3YXJuRm9yTWlzc2luZ0tleShjaGlsZCk7XG4gICAgICAgICAgdmFyIGtleSA9IGNoaWxkLmtleTtcbiAgICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoa25vd25LZXlzID09PSBudWxsKSB7XG4gICAgICAgICAgICBrbm93bktleXMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBrbm93bktleXMuYWRkKGtleSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFrbm93bktleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIGtub3duS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICB3YXJuaW5nJDEoZmFsc2UsICdFbmNvdW50ZXJlZCB0d28gY2hpbGRyZW4gd2l0aCB0aGUgc2FtZSBrZXksIGAlc2AuICcgKyAnS2V5cyBzaG91bGQgYmUgdW5pcXVlIHNvIHRoYXQgY29tcG9uZW50cyBtYWludGFpbiB0aGVpciBpZGVudGl0eSAnICsgJ2Fjcm9zcyB1cGRhdGVzLiBOb24tdW5pcXVlIGtleXMgbWF5IGNhdXNlIGNoaWxkcmVuIHRvIGJlICcgKyAnZHVwbGljYXRlZCBhbmQvb3Igb21pdHRlZCDigJQgdGhlIGJlaGF2aW9yIGlzIHVuc3VwcG9ydGVkIGFuZCAnICsgJ2NvdWxkIGNoYW5nZSBpbiBhIGZ1dHVyZSB2ZXJzaW9uLicsIGtleSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBrbm93bktleXM7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZHJlbkFycmF5KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGRyZW4sIGV4cGlyYXRpb25UaW1lKSB7XG4gICAgLy8gVGhpcyBhbGdvcml0aG0gY2FuJ3Qgb3B0aW1pemUgYnkgc2VhcmNoaW5nIGZyb20gYm90aCBlbmRzIHNpbmNlIHdlXG4gICAgLy8gZG9uJ3QgaGF2ZSBiYWNrcG9pbnRlcnMgb24gZmliZXJzLiBJJ20gdHJ5aW5nIHRvIHNlZSBob3cgZmFyIHdlIGNhbiBnZXRcbiAgICAvLyB3aXRoIHRoYXQgbW9kZWwuIElmIGl0IGVuZHMgdXAgbm90IGJlaW5nIHdvcnRoIHRoZSB0cmFkZW9mZnMsIHdlIGNhblxuICAgIC8vIGFkZCBpdCBsYXRlci5cblxuICAgIC8vIEV2ZW4gd2l0aCBhIHR3byBlbmRlZCBvcHRpbWl6YXRpb24sIHdlJ2Qgd2FudCB0byBvcHRpbWl6ZSBmb3IgdGhlIGNhc2VcbiAgICAvLyB3aGVyZSB0aGVyZSBhcmUgZmV3IGNoYW5nZXMgYW5kIGJydXRlIGZvcmNlIHRoZSBjb21wYXJpc29uIGluc3RlYWQgb2ZcbiAgICAvLyBnb2luZyBmb3IgdGhlIE1hcC4gSXQnZCBsaWtlIHRvIGV4cGxvcmUgaGl0dGluZyB0aGF0IHBhdGggZmlyc3QgaW5cbiAgICAvLyBmb3J3YXJkLW9ubHkgbW9kZSBhbmQgb25seSBnbyBmb3IgdGhlIE1hcCBvbmNlIHdlIG5vdGljZSB0aGF0IHdlIG5lZWRcbiAgICAvLyBsb3RzIG9mIGxvb2sgYWhlYWQuIFRoaXMgZG9lc24ndCBoYW5kbGUgcmV2ZXJzYWwgYXMgd2VsbCBhcyB0d28gZW5kZWRcbiAgICAvLyBzZWFyY2ggYnV0IHRoYXQncyB1bnVzdWFsLiBCZXNpZGVzLCBmb3IgdGhlIHR3byBlbmRlZCBvcHRpbWl6YXRpb24gdG9cbiAgICAvLyB3b3JrIG9uIEl0ZXJhYmxlcywgd2UnZCBuZWVkIHRvIGNvcHkgdGhlIHdob2xlIHNldC5cblxuICAgIC8vIEluIHRoaXMgZmlyc3QgaXRlcmF0aW9uLCB3ZSdsbCBqdXN0IGxpdmUgd2l0aCBoaXR0aW5nIHRoZSBiYWQgY2FzZVxuICAgIC8vIChhZGRpbmcgZXZlcnl0aGluZyB0byBhIE1hcCkgaW4gZm9yIGV2ZXJ5IGluc2VydC9tb3ZlLlxuXG4gICAgLy8gSWYgeW91IGNoYW5nZSB0aGlzIGNvZGUsIGFsc28gdXBkYXRlIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IoKSB3aGljaFxuICAgIC8vIHVzZXMgdGhlIHNhbWUgYWxnb3JpdGhtLlxuXG4gICAge1xuICAgICAgLy8gRmlyc3QsIHZhbGlkYXRlIGtleXMuXG4gICAgICB2YXIga25vd25LZXlzID0gbnVsbDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkID0gbmV3Q2hpbGRyZW5baV07XG4gICAgICAgIGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91c05ld0ZpYmVyID0gbnVsbDtcblxuICAgIHZhciBvbGRGaWJlciA9IGN1cnJlbnRGaXJzdENoaWxkO1xuICAgIHZhciBsYXN0UGxhY2VkSW5kZXggPSAwO1xuICAgIHZhciBuZXdJZHggPSAwO1xuICAgIHZhciBuZXh0T2xkRmliZXIgPSBudWxsO1xuICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICBpZiAob2xkRmliZXIuaW5kZXggPiBuZXdJZHgpIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXI7XG4gICAgICAgIG9sZEZpYmVyID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyLnNpYmxpbmc7XG4gICAgICB9XG4gICAgICB2YXIgbmV3RmliZXIgPSB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGRyZW5bbmV3SWR4XSwgZXhwaXJhdGlvblRpbWUpO1xuICAgICAgaWYgKG5ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgYnJlYWtzIG9uIGVtcHR5IHNsb3RzIGxpa2UgbnVsbCBjaGlsZHJlbi4gVGhhdCdzXG4gICAgICAgIC8vIHVuZm9ydHVuYXRlIGJlY2F1c2UgaXQgdHJpZ2dlcnMgdGhlIHNsb3cgcGF0aCBhbGwgdGhlIHRpbWUuIFdlIG5lZWRcbiAgICAgICAgLy8gYSBiZXR0ZXIgd2F5IHRvIGNvbW11bmljYXRlIHdoZXRoZXIgdGhpcyB3YXMgYSBtaXNzIG9yIG51bGwsXG4gICAgICAgIC8vIGJvb2xlYW4sIHVuZGVmaW5lZCwgZXRjLlxuICAgICAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgIGlmIChvbGRGaWJlciAmJiBuZXdGaWJlci5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBtYXRjaGVkIHRoZSBzbG90LCBidXQgd2UgZGlkbid0IHJldXNlIHRoZSBleGlzdGluZyBmaWJlciwgc28gd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIGRlbGV0ZSB0aGUgZXhpc3RpbmcgY2hpbGQuXG4gICAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChuZXdGaWJlciwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gbmV3RmliZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPOiBEZWZlciBzaWJsaW5ncyBpZiB3ZSdyZSBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IGZvciB0aGlzIHNsb3QuXG4gICAgICAgIC8vIEkuZS4gaWYgd2UgaGFkIG51bGwgdmFsdWVzIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIGRlZmVyIHRoaXNcbiAgICAgICAgLy8gZm9yIGVhY2ggbnVsbCB2YWx1ZS4gSG93ZXZlciwgd2UgYWxzbyBkb24ndCB3YW50IHRvIGNhbGwgdXBkYXRlU2xvdFxuICAgICAgICAvLyB3aXRoIHRoZSBwcmV2aW91cyBvbmUuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5ld0ZpYmVyO1xuICAgICAgfVxuICAgICAgcHJldmlvdXNOZXdGaWJlciA9IG5ld0ZpYmVyO1xuICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgfVxuXG4gICAgaWYgKG5ld0lkeCA9PT0gbmV3Q2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIG5ldyBjaGlsZHJlbi4gV2UgY2FuIGRlbGV0ZSB0aGUgcmVzdC5cbiAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9XG5cbiAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgZXhpc3RpbmcgY2hpbGRyZW4gd2UgY2FuIGNob29zZSBhIGZhc3QgcGF0aFxuICAgICAgLy8gc2luY2UgdGhlIHJlc3Qgd2lsbCBhbGwgYmUgaW5zZXJ0aW9ucy5cbiAgICAgIGZvciAoOyBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICAgIHZhciBfbmV3RmliZXIgPSBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgbmV3Q2hpbGRyZW5bbmV3SWR4XSwgZXhwaXJhdGlvblRpbWUpO1xuICAgICAgICBpZiAoIV9uZXdGaWJlcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyO1xuICAgICAgICB9XG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9XG5cbiAgICAvLyBBZGQgYWxsIGNoaWxkcmVuIHRvIGEga2V5IG1hcCBmb3IgcXVpY2sgbG9va3Vwcy5cbiAgICB2YXIgZXhpc3RpbmdDaGlsZHJlbiA9IG1hcFJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG5cbiAgICAvLyBLZWVwIHNjYW5uaW5nIGFuZCB1c2UgdGhlIG1hcCB0byByZXN0b3JlIGRlbGV0ZWQgaXRlbXMgYXMgbW92ZXMuXG4gICAgZm9yICg7IG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgIHZhciBfbmV3RmliZXIyID0gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZHJlbltuZXdJZHhdLCBleHBpcmF0aW9uVGltZSk7XG4gICAgICBpZiAoX25ld0ZpYmVyMikge1xuICAgICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICAgIGlmIChfbmV3RmliZXIyLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlIG5ldyBmaWJlciBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MsIGJ1dCBpZiB0aGVyZSBleGlzdHMgYVxuICAgICAgICAgICAgLy8gY3VycmVudCwgdGhhdCBtZWFucyB0aGF0IHdlIHJldXNlZCB0aGUgZmliZXIuIFdlIG5lZWQgdG8gZGVsZXRlXG4gICAgICAgICAgICAvLyBpdCBmcm9tIHRoZSBjaGlsZCBsaXN0IHNvIHRoYXQgd2UgZG9uJ3QgYWRkIGl0IHRvIHRoZSBkZWxldGlvblxuICAgICAgICAgICAgLy8gbGlzdC5cbiAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZGVsZXRlKF9uZXdGaWJlcjIua2V5ID09PSBudWxsID8gbmV3SWR4IDogX25ld0ZpYmVyMi5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlcjIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXIyO1xuICAgICAgICB9XG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXIyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBBbnkgZXhpc3RpbmcgY2hpbGRyZW4gdGhhdCB3ZXJlbid0IGNvbnN1bWVkIGFib3ZlIHdlcmUgZGVsZXRlZC4gV2UgbmVlZFxuICAgICAgLy8gdG8gYWRkIHRoZW0gdG8gdGhlIGRlbGV0aW9uIGxpc3QuXG4gICAgICBleGlzdGluZ0NoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGRyZW5JdGVyYWJsZSwgZXhwaXJhdGlvblRpbWUpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uIGFzIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkoKSxcbiAgICAvLyBidXQgdXNpbmcgdGhlIGl0ZXJhdG9yIGluc3RlYWQuXG5cbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG4gICAgISh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykgPyBpbnZhcmlhbnQoZmFsc2UsICdBbiBvYmplY3QgaXMgbm90IGFuIGl0ZXJhYmxlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpIDogdm9pZCAwO1xuXG4gICAge1xuICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCByZW5kZXJpbmcgR2VuZXJhdG9ycyBiZWNhdXNlIGl0J3MgYSBtdXRhdGlvbi5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEyOTk1XG4gICAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCB0b1N0cmluZ1RhZ1xuICAgICAgbmV3Q2hpbGRyZW5JdGVyYWJsZVtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnR2VuZXJhdG9yJykge1xuICAgICAgICAhZGlkV2FybkFib3V0R2VuZXJhdG9ycyA/IHdhcm5pbmckMShmYWxzZSwgJ1VzaW5nIEdlbmVyYXRvcnMgYXMgY2hpbGRyZW4gaXMgdW5zdXBwb3J0ZWQgYW5kIHdpbGwgbGlrZWx5IHlpZWxkICcgKyAndW5leHBlY3RlZCByZXN1bHRzIGJlY2F1c2UgZW51bWVyYXRpbmcgYSBnZW5lcmF0b3IgbXV0YXRlcyBpdC4gJyArICdZb3UgbWF5IGNvbnZlcnQgaXQgdG8gYW4gYXJyYXkgd2l0aCBgQXJyYXkuZnJvbSgpYCBvciB0aGUgJyArICdgWy4uLnNwcmVhZF1gIG9wZXJhdG9yIGJlZm9yZSByZW5kZXJpbmcuIEtlZXAgaW4gbWluZCAnICsgJ3lvdSBtaWdodCBuZWVkIHRvIHBvbHlmaWxsIHRoZXNlIGZlYXR1cmVzIGZvciBvbGRlciBicm93c2Vycy4nKSA6IHZvaWQgMDtcbiAgICAgICAgZGlkV2FybkFib3V0R2VuZXJhdG9ycyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFdhcm4gYWJvdXQgdXNpbmcgTWFwcyBhcyBjaGlsZHJlblxuICAgICAgaWYgKG5ld0NoaWxkcmVuSXRlcmFibGUuZW50cmllcyA9PT0gaXRlcmF0b3JGbikge1xuICAgICAgICAhZGlkV2FybkFib3V0TWFwcyA/IHdhcm5pbmckMShmYWxzZSwgJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgdW5zdXBwb3J0ZWQgYW5kIHdpbGwgbGlrZWx5IHlpZWxkICcgKyAndW5leHBlY3RlZCByZXN1bHRzLiBDb252ZXJ0IGl0IHRvIGEgc2VxdWVuY2UvaXRlcmFibGUgb2Yga2V5ZWQgJyArICdSZWFjdEVsZW1lbnRzIGluc3RlYWQuJykgOiB2b2lkIDA7XG4gICAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBGaXJzdCwgdmFsaWRhdGUga2V5cy5cbiAgICAgIC8vIFdlJ2xsIGdldCBhIGRpZmZlcmVudCBpdGVyYXRvciBsYXRlciBmb3IgdGhlIG1haW4gcGFzcy5cbiAgICAgIHZhciBfbmV3Q2hpbGRyZW4gPSBpdGVyYXRvckZuLmNhbGwobmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG4gICAgICBpZiAoX25ld0NoaWxkcmVuKSB7XG4gICAgICAgIHZhciBrbm93bktleXMgPSBudWxsO1xuICAgICAgICB2YXIgX3N0ZXAgPSBfbmV3Q2hpbGRyZW4ubmV4dCgpO1xuICAgICAgICBmb3IgKDsgIV9zdGVwLmRvbmU7IF9zdGVwID0gX25ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgICAgIHZhciBjaGlsZCA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgIGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbmV3Q2hpbGRyZW4gPSBpdGVyYXRvckZuLmNhbGwobmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG4gICAgIShuZXdDaGlsZHJlbiAhPSBudWxsKSA/IGludmFyaWFudChmYWxzZSwgJ0FuIGl0ZXJhYmxlIG9iamVjdCBwcm92aWRlZCBubyBpdGVyYXRvci4nKSA6IHZvaWQgMDtcblxuICAgIHZhciByZXN1bHRpbmdGaXJzdENoaWxkID0gbnVsbDtcbiAgICB2YXIgcHJldmlvdXNOZXdGaWJlciA9IG51bGw7XG5cbiAgICB2YXIgb2xkRmliZXIgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB2YXIgbGFzdFBsYWNlZEluZGV4ID0gMDtcbiAgICB2YXIgbmV3SWR4ID0gMDtcbiAgICB2YXIgbmV4dE9sZEZpYmVyID0gbnVsbDtcblxuICAgIHZhciBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpO1xuICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgaWYgKG9sZEZpYmVyLmluZGV4ID4gbmV3SWR4KSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyO1xuICAgICAgICBvbGRGaWJlciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlci5zaWJsaW5nO1xuICAgICAgfVxuICAgICAgdmFyIG5ld0ZpYmVyID0gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIHN0ZXAudmFsdWUsIGV4cGlyYXRpb25UaW1lKTtcbiAgICAgIGlmIChuZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGJyZWFrcyBvbiBlbXB0eSBzbG90cyBsaWtlIG51bGwgY2hpbGRyZW4uIFRoYXQnc1xuICAgICAgICAvLyB1bmZvcnR1bmF0ZSBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBzbG93IHBhdGggYWxsIHRoZSB0aW1lLiBXZSBuZWVkXG4gICAgICAgIC8vIGEgYmV0dGVyIHdheSB0byBjb21tdW5pY2F0ZSB3aGV0aGVyIHRoaXMgd2FzIGEgbWlzcyBvciBudWxsLFxuICAgICAgICAvLyBib29sZWFuLCB1bmRlZmluZWQsIGV0Yy5cbiAgICAgICAgaWYgKCFvbGRGaWJlcikge1xuICAgICAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgaWYgKG9sZEZpYmVyICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIG1hdGNoZWQgdGhlIHNsb3QsIGJ1dCB3ZSBkaWRuJ3QgcmV1c2UgdGhlIGV4aXN0aW5nIGZpYmVyLCBzbyB3ZVxuICAgICAgICAgIC8vIG5lZWQgdG8gZGVsZXRlIHRoZSBleGlzdGluZyBjaGlsZC5cbiAgICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG4gICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uXG4gICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBuZXdGaWJlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IERlZmVyIHNpYmxpbmdzIGlmIHdlJ3JlIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXggZm9yIHRoaXMgc2xvdC5cbiAgICAgICAgLy8gSS5lLiBpZiB3ZSBoYWQgbnVsbCB2YWx1ZXMgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gZGVmZXIgdGhpc1xuICAgICAgICAvLyBmb3IgZWFjaCBudWxsIHZhbHVlLiBIb3dldmVyLCB3ZSBhbHNvIGRvbid0IHdhbnQgdG8gY2FsbCB1cGRhdGVTbG90XG4gICAgICAgIC8vIHdpdGggdGhlIHByZXZpb3VzIG9uZS5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gbmV3RmliZXI7XG4gICAgICB9XG4gICAgICBwcmV2aW91c05ld0ZpYmVyID0gbmV3RmliZXI7XG4gICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICB9XG5cbiAgICBpZiAoc3RlcC5kb25lKSB7XG4gICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIG5ldyBjaGlsZHJlbi4gV2UgY2FuIGRlbGV0ZSB0aGUgcmVzdC5cbiAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9XG5cbiAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgZXhpc3RpbmcgY2hpbGRyZW4gd2UgY2FuIGNob29zZSBhIGZhc3QgcGF0aFxuICAgICAgLy8gc2luY2UgdGhlIHJlc3Qgd2lsbCBhbGwgYmUgaW5zZXJ0aW9ucy5cbiAgICAgIGZvciAoOyAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgICB2YXIgX25ld0ZpYmVyMyA9IGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBzdGVwLnZhbHVlLCBleHBpcmF0aW9uVGltZSk7XG4gICAgICAgIGlmIChfbmV3RmliZXIzID09PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIzLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXIzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjM7XG4gICAgICAgIH1cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjM7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9XG5cbiAgICAvLyBBZGQgYWxsIGNoaWxkcmVuIHRvIGEga2V5IG1hcCBmb3IgcXVpY2sgbG9va3Vwcy5cbiAgICB2YXIgZXhpc3RpbmdDaGlsZHJlbiA9IG1hcFJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG5cbiAgICAvLyBLZWVwIHNjYW5uaW5nIGFuZCB1c2UgdGhlIG1hcCB0byByZXN0b3JlIGRlbGV0ZWQgaXRlbXMgYXMgbW92ZXMuXG4gICAgZm9yICg7ICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICB2YXIgX25ld0ZpYmVyNCA9IHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgc3RlcC52YWx1ZSwgZXhwaXJhdGlvblRpbWUpO1xuICAgICAgaWYgKF9uZXdGaWJlcjQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgICBpZiAoX25ld0ZpYmVyNC5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRoZSBuZXcgZmliZXIgaXMgYSB3b3JrIGluIHByb2dyZXNzLCBidXQgaWYgdGhlcmUgZXhpc3RzIGFcbiAgICAgICAgICAgIC8vIGN1cnJlbnQsIHRoYXQgbWVhbnMgdGhhdCB3ZSByZXVzZWQgdGhlIGZpYmVyLiBXZSBuZWVkIHRvIGRlbGV0ZVxuICAgICAgICAgICAgLy8gaXQgZnJvbSB0aGUgY2hpbGQgbGlzdCBzbyB0aGF0IHdlIGRvbid0IGFkZCBpdCB0byB0aGUgZGVsZXRpb25cbiAgICAgICAgICAgIC8vIGxpc3QuXG4gICAgICAgICAgICBleGlzdGluZ0NoaWxkcmVuLmRlbGV0ZShfbmV3RmliZXI0LmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IF9uZXdGaWJlcjQua2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXI0LCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyNDtcbiAgICAgICAgfVxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyNDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gQW55IGV4aXN0aW5nIGNoaWxkcmVuIHRoYXQgd2VyZW4ndCBjb25zdW1lZCBhYm92ZSB3ZXJlIGRlbGV0ZWQuIFdlIG5lZWRcbiAgICAgIC8vIHRvIGFkZCB0aGVtIHRvIHRoZSBkZWxldGlvbiBsaXN0LlxuICAgICAgZXhpc3RpbmdDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlU2luZ2xlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCB0ZXh0Q29udGVudCwgZXhwaXJhdGlvblRpbWUpIHtcbiAgICAvLyBUaGVyZSdzIG5vIG5lZWQgdG8gY2hlY2sgZm9yIGtleXMgb24gdGV4dCBub2RlcyBzaW5jZSB3ZSBkb24ndCBoYXZlIGFcbiAgICAvLyB3YXkgdG8gZGVmaW5lIHRoZW0uXG4gICAgaWYgKGN1cnJlbnRGaXJzdENoaWxkICE9PSBudWxsICYmIGN1cnJlbnRGaXJzdENoaWxkLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgIC8vIFdlIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBub2RlIHNvIGxldCdzIGp1c3QgdXBkYXRlIGl0IGFuZCBkZWxldGVcbiAgICAgIC8vIHRoZSByZXN0LlxuICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLnNpYmxpbmcpO1xuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudEZpcnN0Q2hpbGQsIHRleHRDb250ZW50LCBleHBpcmF0aW9uVGltZSk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gICAgLy8gVGhlIGV4aXN0aW5nIGZpcnN0IGNoaWxkIGlzIG5vdCBhIHRleHQgbm9kZSBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBvbmVcbiAgICAvLyBhbmQgZGVsZXRlIHRoZSBleGlzdGluZyBvbmVzLlxuICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KHRleHRDb250ZW50LCByZXR1cm5GaWJlci5tb2RlLCBleHBpcmF0aW9uVGltZSk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZUVsZW1lbnQocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBlbGVtZW50LCBleHBpcmF0aW9uVGltZSkge1xuICAgIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgICB2YXIgY2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRPRE86IElmIGtleSA9PT0gbnVsbCBhbmQgY2hpbGQua2V5ID09PSBudWxsLCB0aGVuIHRoaXMgb25seSBhcHBsaWVzIHRvXG4gICAgICAvLyB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdC5cbiAgICAgIGlmIChjaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICBpZiAoY2hpbGQudGFnID09PSBGcmFnbWVudCA/IGVsZW1lbnQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSA6IGNoaWxkLmVsZW1lbnRUeXBlID09PSBlbGVtZW50LnR5cGUpIHtcbiAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG4gICAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY2hpbGQsIGVsZW1lbnQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSA/IGVsZW1lbnQucHJvcHMuY2hpbGRyZW4gOiBlbGVtZW50LnByb3BzLCBleHBpcmF0aW9uVGltZSk7XG4gICAgICAgICAgZXhpc3RpbmcucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjaGlsZCwgZWxlbWVudCk7XG4gICAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAge1xuICAgICAgICAgICAgZXhpc3RpbmcuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgICAgICAgICAgZXhpc3RpbmcuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9XG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChlbGVtZW50LnByb3BzLmNoaWxkcmVuLCByZXR1cm5GaWJlci5tb2RlLCBleHBpcmF0aW9uVGltZSwgZWxlbWVudC5rZXkpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NyZWF0ZWQ0ID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBleHBpcmF0aW9uVGltZSk7XG4gICAgICBfY3JlYXRlZDQucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgZWxlbWVudCk7XG4gICAgICBfY3JlYXRlZDQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gX2NyZWF0ZWQ0O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZVBvcnRhbChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIHBvcnRhbCwgZXhwaXJhdGlvblRpbWUpIHtcbiAgICB2YXIga2V5ID0gcG9ydGFsLmtleTtcbiAgICB2YXIgY2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRPRE86IElmIGtleSA9PT0gbnVsbCBhbmQgY2hpbGQua2V5ID09PSBudWxsLCB0aGVuIHRoaXMgb25seSBhcHBsaWVzIHRvXG4gICAgICAvLyB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdC5cbiAgICAgIGlmIChjaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICBpZiAoY2hpbGQudGFnID09PSBIb3N0UG9ydGFsICYmIGNoaWxkLnN0YXRlTm9kZS5jb250YWluZXJJbmZvID09PSBwb3J0YWwuY29udGFpbmVySW5mbyAmJiBjaGlsZC5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24gPT09IHBvcnRhbC5pbXBsZW1lbnRhdGlvbikge1xuICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZC5zaWJsaW5nKTtcbiAgICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjaGlsZCwgcG9ydGFsLmNoaWxkcmVuIHx8IFtdLCBleHBpcmF0aW9uVGltZSk7XG4gICAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9XG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwocG9ydGFsLCByZXR1cm5GaWJlci5tb2RlLCBleHBpcmF0aW9uVGltZSk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIC8vIFRoaXMgQVBJIHdpbGwgdGFnIHRoZSBjaGlsZHJlbiB3aXRoIHRoZSBzaWRlLWVmZmVjdCBvZiB0aGUgcmVjb25jaWxpYXRpb25cbiAgLy8gaXRzZWxmLiBUaGV5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNpZGUtZWZmZWN0IGxpc3QgYXMgd2UgcGFzcyB0aHJvdWdoIHRoZVxuICAvLyBjaGlsZHJlbiBhbmQgdGhlIHBhcmVudC5cbiAgZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRGaWJlcnMocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgZXhwaXJhdGlvblRpbWUpIHtcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWN1cnNpdmUuXG4gICAgLy8gSWYgdGhlIHRvcCBsZXZlbCBpdGVtIGlzIGFuIGFycmF5LCB3ZSB0cmVhdCBpdCBhcyBhIHNldCBvZiBjaGlsZHJlbixcbiAgICAvLyBub3QgYXMgYSBmcmFnbWVudC4gTmVzdGVkIGFycmF5cyBvbiB0aGUgb3RoZXIgaGFuZCB3aWxsIGJlIHRyZWF0ZWQgYXNcbiAgICAvLyBmcmFnbWVudCBub2Rlcy4gUmVjdXJzaW9uIGhhcHBlbnMgYXQgdGhlIG5vcm1hbCBmbG93LlxuXG4gICAgLy8gSGFuZGxlIHRvcCBsZXZlbCB1bmtleWVkIGZyYWdtZW50cyBhcyBpZiB0aGV5IHdlcmUgYXJyYXlzLlxuICAgIC8vIFRoaXMgbGVhZHMgdG8gYW4gYW1iaWd1aXR5IGJldHdlZW4gPD57Wy4uLl19PC8+IGFuZCA8Pi4uLjwvPi5cbiAgICAvLyBXZSB0cmVhdCB0aGUgYW1iaWd1b3VzIGNhc2VzIGFib3ZlIHRoZSBzYW1lLlxuICAgIHZhciBpc1Vua2V5ZWRUb3BMZXZlbEZyYWdtZW50ID0gdHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCAmJiBuZXdDaGlsZC50eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFICYmIG5ld0NoaWxkLmtleSA9PT0gbnVsbDtcbiAgICBpZiAoaXNVbmtleWVkVG9wTGV2ZWxGcmFnbWVudCkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXdDaGlsZC5wcm9wcy5jaGlsZHJlbjtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgb2JqZWN0IHR5cGVzXG4gICAgdmFyIGlzT2JqZWN0ID0gdHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbDtcblxuICAgIGlmIChpc09iamVjdCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZWNvbmNpbGVTaW5nbGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGV4cGlyYXRpb25UaW1lKSk7XG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGV4cGlyYXRpb25UaW1lKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCAnJyArIG5ld0NoaWxkLCBleHBpcmF0aW9uVGltZSkpO1xuICAgIH1cblxuICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSkge1xuICAgICAgcmV0dXJuIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgZXhwaXJhdGlvblRpbWUpO1xuICAgIH1cblxuICAgIGlmIChnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgcmV0dXJuIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgZXhwaXJhdGlvblRpbWUpO1xuICAgIH1cblxuICAgIGlmIChpc09iamVjdCkge1xuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3VuZGVmaW5lZCcgJiYgIWlzVW5rZXllZFRvcExldmVsRnJhZ21lbnQpIHtcbiAgICAgIC8vIElmIHRoZSBuZXcgY2hpbGQgaXMgdW5kZWZpbmVkLCBhbmQgdGhlIHJldHVybiBmaWJlciBpcyBhIGNvbXBvc2l0ZVxuICAgICAgLy8gY29tcG9uZW50LCB0aHJvdyBhbiBlcnJvci4gSWYgRmliZXIgcmV0dXJuIHR5cGVzIGFyZSBkaXNhYmxlZCxcbiAgICAgIC8vIHdlIGFscmVhZHkgdGhyZXcgYWJvdmUuXG4gICAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucmVuZGVyLl9pc01vY2tGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgIC8vIFdlIGFsbG93IGF1dG8tbW9ja3MgdG8gcHJvY2VlZCBhcyBpZiB0aGV5J3JlIHJldHVybmluZyBudWxsLlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGZhbGwgdGhyb3VnaCB0byB0aGUgbmV4dCBjYXNlLCB3aGljaCBoYW5kbGVzIGJvdGhcbiAgICAgICAgLy8gZnVuY3Rpb25zIGFuZCBjbGFzc2VzXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZWQgbm8tZmFsbHRocm91Z2hcbiAgICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgQ29tcG9uZW50ID0gcmV0dXJuRmliZXIudHlwZTtcbiAgICAgICAgICAgIGludmFyaWFudChmYWxzZSwgJyVzKC4uLik6IE5vdGhpbmcgd2FzIHJldHVybmVkIGZyb20gcmVuZGVyLiBUaGlzIHVzdWFsbHkgbWVhbnMgYSByZXR1cm4gc3RhdGVtZW50IGlzIG1pc3NpbmcuIE9yLCB0byByZW5kZXIgbm90aGluZywgcmV0dXJuIG51bGwuJywgQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtYWluaW5nIGNhc2VzIGFyZSBhbGwgdHJlYXRlZCBhcyBlbXB0eS5cbiAgICByZXR1cm4gZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKTtcbiAgfVxuXG4gIHJldHVybiByZWNvbmNpbGVDaGlsZEZpYmVycztcbn1cblxudmFyIHJlY29uY2lsZUNoaWxkRmliZXJzID0gQ2hpbGRSZWNvbmNpbGVyKHRydWUpO1xudmFyIG1vdW50Q2hpbGRGaWJlcnMgPSBDaGlsZFJlY29uY2lsZXIoZmFsc2UpO1xuXG5mdW5jdGlvbiBjbG9uZUNoaWxkRmliZXJzKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzKSB7XG4gICEoY3VycmVudCQkMSA9PT0gbnVsbCB8fCB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9PT0gY3VycmVudCQkMS5jaGlsZCkgPyBpbnZhcmlhbnQoZmFsc2UsICdSZXN1bWluZyB3b3JrIG5vdCB5ZXQgaW1wbGVtZW50ZWQuJykgOiB2b2lkIDA7XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzLmNoaWxkID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRDaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB2YXIgbmV3Q2hpbGQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIGN1cnJlbnRDaGlsZC5wZW5kaW5nUHJvcHMsIGN1cnJlbnRDaGlsZC5leHBpcmF0aW9uVGltZSk7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV3Q2hpbGQ7XG5cbiAgbmV3Q2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHdoaWxlIChjdXJyZW50Q2hpbGQuc2libGluZyAhPT0gbnVsbCkge1xuICAgIGN1cnJlbnRDaGlsZCA9IGN1cnJlbnRDaGlsZC5zaWJsaW5nO1xuICAgIG5ld0NoaWxkID0gbmV3Q2hpbGQuc2libGluZyA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRDaGlsZCwgY3VycmVudENoaWxkLnBlbmRpbmdQcm9wcywgY3VycmVudENoaWxkLmV4cGlyYXRpb25UaW1lKTtcbiAgICBuZXdDaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgfVxuICBuZXdDaGlsZC5zaWJsaW5nID0gbnVsbDtcbn1cblxudmFyIE5PX0NPTlRFWFQgPSB7fTtcblxudmFyIGNvbnRleHRTdGFja0N1cnNvciQxID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xudmFyIGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xudmFyIHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xuXG5mdW5jdGlvbiByZXF1aXJlZENvbnRleHQoYykge1xuICAhKGMgIT09IE5PX0NPTlRFWFQpID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgaG9zdCBjb250ZXh0IHRvIGV4aXN0LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpIDogdm9pZCAwO1xuICByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250YWluZXIoKSB7XG4gIHZhciByb290SW5zdGFuY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gIHJldHVybiByb290SW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Q29udGFpbmVyKGZpYmVyLCBuZXh0Um9vdEluc3RhbmNlKSB7XG4gIC8vIFB1c2ggY3VycmVudCByb290IGluc3RhbmNlIG9udG8gdGhlIHN0YWNrO1xuICAvLyBUaGlzIGFsbG93cyB1cyB0byByZXNldCByb290IHdoZW4gcG9ydGFscyBhcmUgcG9wcGVkLlxuICBwdXNoKHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLCBuZXh0Um9vdEluc3RhbmNlLCBmaWJlcik7XG4gIC8vIFRyYWNrIHRoZSBjb250ZXh0IGFuZCB0aGUgRmliZXIgdGhhdCBwcm92aWRlZCBpdC5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIHBvcCBvbmx5IEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuICBwdXNoKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlciwgZmliZXIpO1xuXG4gIC8vIEZpbmFsbHksIHdlIG5lZWQgdG8gcHVzaCB0aGUgaG9zdCBjb250ZXh0IHRvIHRoZSBzdGFjay5cbiAgLy8gSG93ZXZlciwgd2UgY2FuJ3QganVzdCBjYWxsIGdldFJvb3RIb3N0Q29udGV4dCgpIGFuZCBwdXNoIGl0IGJlY2F1c2VcbiAgLy8gd2UnZCBoYXZlIGEgZGlmZmVyZW50IG51bWJlciBvZiBlbnRyaWVzIG9uIHRoZSBzdGFjayBkZXBlbmRpbmcgb25cbiAgLy8gd2hldGhlciBnZXRSb290SG9zdENvbnRleHQoKSB0aHJvd3Mgc29tZXdoZXJlIGluIHJlbmRlcmVyIGNvZGUgb3Igbm90LlxuICAvLyBTbyB3ZSBwdXNoIGFuIGVtcHR5IHZhbHVlIGZpcnN0LiBUaGlzIGxldHMgdXMgc2FmZWx5IHVud2luZCBvbiBlcnJvcnMuXG4gIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yJDEsIE5PX0NPTlRFWFQsIGZpYmVyKTtcbiAgdmFyIG5leHRSb290Q29udGV4dCA9IGdldFJvb3RIb3N0Q29udGV4dChuZXh0Um9vdEluc3RhbmNlKTtcbiAgLy8gTm93IHRoYXQgd2Uga25vdyB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgdGhyb3csIHJlcGxhY2UgaXQuXG4gIHBvcChjb250ZXh0U3RhY2tDdXJzb3IkMSwgZmliZXIpO1xuICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciQxLCBuZXh0Um9vdENvbnRleHQsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gcG9wSG9zdENvbnRhaW5lcihmaWJlcikge1xuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcG9wKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gIHBvcChyb290SW5zdGFuY2VTdGFja0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRIb3N0Q29udGV4dCgpIHtcbiAgdmFyIGNvbnRleHQgPSByZXF1aXJlZENvbnRleHQoY29udGV4dFN0YWNrQ3Vyc29yJDEuY3VycmVudCk7XG4gIHJldHVybiBjb250ZXh0O1xufVxuXG5mdW5jdGlvbiBwdXNoSG9zdENvbnRleHQoZmliZXIpIHtcbiAgdmFyIHJvb3RJbnN0YW5jZSA9IHJlcXVpcmVkQ29udGV4dChyb290SW5zdGFuY2VTdGFja0N1cnNvci5jdXJyZW50KTtcbiAgdmFyIGNvbnRleHQgPSByZXF1aXJlZENvbnRleHQoY29udGV4dFN0YWNrQ3Vyc29yJDEuY3VycmVudCk7XG4gIHZhciBuZXh0Q29udGV4dCA9IGdldENoaWxkSG9zdENvbnRleHQoY29udGV4dCwgZmliZXIudHlwZSwgcm9vdEluc3RhbmNlKTtcblxuICAvLyBEb24ndCBwdXNoIHRoaXMgRmliZXIncyBjb250ZXh0IHVubGVzcyBpdCdzIHVuaXF1ZS5cbiAgaWYgKGNvbnRleHQgPT09IG5leHRDb250ZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVHJhY2sgdGhlIGNvbnRleHQgYW5kIHRoZSBGaWJlciB0aGF0IHByb3ZpZGVkIGl0LlxuICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gcG9wIG9ubHkgRmliZXJzIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29udGV4dHMuXG4gIHB1c2goY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlcik7XG4gIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yJDEsIG5leHRDb250ZXh0LCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHBvcEhvc3RDb250ZXh0KGZpYmVyKSB7XG4gIC8vIERvIG5vdCBwb3AgdW5sZXNzIHRoaXMgRmliZXIgcHJvdmlkZWQgdGhlIGN1cnJlbnQgY29udGV4dC5cbiAgLy8gcHVzaEhvc3RDb250ZXh0KCkgb25seSBwdXNoZXMgRmliZXJzIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29udGV4dHMuXG4gIGlmIChjb250ZXh0RmliZXJTdGFja0N1cnNvci5jdXJyZW50ICE9PSBmaWJlcikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHBvcChjb250ZXh0U3RhY2tDdXJzb3IkMSwgZmliZXIpO1xuICBwb3AoY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyKTtcbn1cblxudmFyIE5vRWZmZWN0JDEgPSAvKiAgICAgICAgICAgICAqLzA7XG52YXIgVW5tb3VudFNuYXBzaG90ID0gLyogICAgICAqLzI7XG52YXIgVW5tb3VudE11dGF0aW9uID0gLyogICAgICAqLzQ7XG52YXIgTW91bnRNdXRhdGlvbiA9IC8qICAgICAgICAqLzg7XG52YXIgVW5tb3VudExheW91dCA9IC8qICAgICAgICAqLzE2O1xudmFyIE1vdW50TGF5b3V0ID0gLyogICAgICAgICAgKi8zMjtcbnZhciBNb3VudFBhc3NpdmUgPSAvKiAgICAgICAgICovNjQ7XG52YXIgVW5tb3VudFBhc3NpdmUgPSAvKiAgICAgICAqLzEyODtcblxudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG5cblxudmFyIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudCA9IHZvaWQgMDtcbntcbiAgZGlkV2FybkFib3V0TWlzbWF0Y2hlZEhvb2tzRm9yQ29tcG9uZW50ID0gbmV3IFNldCgpO1xufVxuXG4vLyBUaGVzZSBhcmUgc2V0IHJpZ2h0IGJlZm9yZSBjYWxsaW5nIHRoZSBjb21wb25lbnQuXG52YXIgcmVuZGVyRXhwaXJhdGlvblRpbWUgPSBOb1dvcms7XG4vLyBUaGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci4gSSd2ZSBuYW1lZCBpdCBkaWZmZXJlbnRseSB0byBkaXN0aW5ndWlzaCBpdCBmcm9tXG4vLyB0aGUgd29yay1pbi1wcm9ncmVzcyBob29rLlxudmFyIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSBudWxsO1xuXG4vLyBIb29rcyBhcmUgc3RvcmVkIGFzIGEgbGlua2VkIGxpc3Qgb24gdGhlIGZpYmVyJ3MgbWVtb2l6ZWRTdGF0ZSBmaWVsZC4gVGhlXG4vLyBjdXJyZW50IGhvb2sgbGlzdCBpcyB0aGUgbGlzdCB0aGF0IGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgZmliZXIuIFRoZVxuLy8gd29yay1pbi1wcm9ncmVzcyBob29rIGxpc3QgaXMgYSBuZXcgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlXG4vLyB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxudmFyIGN1cnJlbnRIb29rID0gbnVsbDtcbnZhciBuZXh0Q3VycmVudEhvb2sgPSBudWxsO1xudmFyIGZpcnN0V29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbnZhciB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xudmFyIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuXG52YXIgcmVtYWluaW5nRXhwaXJhdGlvblRpbWUgPSBOb1dvcms7XG52YXIgY29tcG9uZW50VXBkYXRlUXVldWUgPSBudWxsO1xudmFyIHNpZGVFZmZlY3RUYWcgPSAwO1xuXG4vLyBVcGRhdGVzIHNjaGVkdWxlZCBkdXJpbmcgcmVuZGVyIHdpbGwgdHJpZ2dlciBhbiBpbW1lZGlhdGUgcmUtcmVuZGVyIGF0IHRoZVxuLy8gZW5kIG9mIHRoZSBjdXJyZW50IHBhc3MuIFdlIGNhbid0IHN0b3JlIHRoZXNlIHVwZGF0ZXMgb24gdGhlIG5vcm1hbCBxdWV1ZSxcbi8vIGJlY2F1c2UgaWYgdGhlIHdvcmsgaXMgYWJvcnRlZCwgdGhleSBzaG91bGQgYmUgZGlzY2FyZGVkLiBCZWNhdXNlIHRoaXMgaXNcbi8vIGEgcmVsYXRpdmVseSByYXJlIGNhc2UsIHdlIGFsc28gZG9uJ3Qgd2FudCB0byBhZGQgYW4gYWRkaXRpb25hbCBmaWVsZCB0b1xuLy8gZWl0aGVyIHRoZSBob29rIG9yIHF1ZXVlIG9iamVjdCB0eXBlcy4gU28gd2Ugc3RvcmUgdGhlbSBpbiBhIGxhemlseSBjcmVhdGVcbi8vIG1hcCBvZiBxdWV1ZSAtPiByZW5kZXItcGhhc2UgdXBkYXRlcywgd2hpY2ggYXJlIGRpc2NhcmRlZCBvbmNlIHRoZSBjb21wb25lbnRcbi8vIGNvbXBsZXRlcyB3aXRob3V0IHJlLXJlbmRlcmluZy5cblxuLy8gV2hldGhlciBhbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBkdXJpbmcgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgcmVuZGVyIHBhc3MuXG52YXIgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlO1xuLy8gTGF6aWx5IGNyZWF0ZWQgbWFwIG9mIHJlbmRlci1waGFzZSB1cGRhdGVzXG52YXIgcmVuZGVyUGhhc2VVcGRhdGVzID0gbnVsbDtcbi8vIENvdW50ZXIgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wcy5cbnZhciBudW1iZXJPZlJlUmVuZGVycyA9IDA7XG52YXIgUkVfUkVOREVSX0xJTUlUID0gMjU7XG5cbi8vIEluIERFViwgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBwcmltaXRpdmUgaG9va1xudmFyIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbDtcblxuLy8gSW4gREVWLCB0aGlzIGxpc3QgZW5zdXJlcyB0aGF0IGhvb2tzIGFyZSBjYWxsZWQgaW4gdGhlIHNhbWUgb3JkZXIgYmV0d2VlbiByZW5kZXJzLlxuLy8gVGhlIGxpc3Qgc3RvcmVzIHRoZSBvcmRlciBvZiBob29rcyB1c2VkIGR1cmluZyB0aGUgaW5pdGlhbCByZW5kZXIgKG1vdW50KS5cbi8vIFN1YnNlcXVlbnQgcmVuZGVycyAodXBkYXRlcykgcmVmZXJlbmNlIHRoaXMgbGlzdC5cbnZhciBob29rVHlwZXNEZXYgPSBudWxsO1xudmFyIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7XG5cbmZ1bmN0aW9uIG1vdW50SG9va1R5cGVzRGV2KCkge1xuICB7XG4gICAgdmFyIGhvb2tOYW1lID0gY3VycmVudEhvb2tOYW1lSW5EZXY7XG5cbiAgICBpZiAoaG9va1R5cGVzRGV2ID09PSBudWxsKSB7XG4gICAgICBob29rVHlwZXNEZXYgPSBbaG9va05hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBob29rVHlwZXNEZXYucHVzaChob29rTmFtZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvb2tUeXBlc0RldigpIHtcbiAge1xuICAgIHZhciBob29rTmFtZSA9IGN1cnJlbnRIb29rTmFtZUluRGV2O1xuXG4gICAgaWYgKGhvb2tUeXBlc0RldiAhPT0gbnVsbCkge1xuICAgICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYrKztcbiAgICAgIGlmIChob29rVHlwZXNEZXZbaG9va1R5cGVzVXBkYXRlSW5kZXhEZXZdICE9PSBob29rTmFtZSkge1xuICAgICAgICB3YXJuT25Ib29rTWlzbWF0Y2hJbkRldihob29rTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5Pbkhvb2tNaXNtYXRjaEluRGV2KGN1cnJlbnRIb29rTmFtZSkge1xuICB7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudHlwZSk7XG4gICAgaWYgKCFkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICAgIHZhciB0YWJsZSA9ICcnO1xuXG4gICAgICAgIHZhciBzZWNvbmRDb2x1bW5TdGFydCA9IDMwO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2OyBpKyspIHtcbiAgICAgICAgICB2YXIgb2xkSG9va05hbWUgPSBob29rVHlwZXNEZXZbaV07XG4gICAgICAgICAgdmFyIG5ld0hvb2tOYW1lID0gaSA9PT0gaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPyBjdXJyZW50SG9va05hbWUgOiBvbGRIb29rTmFtZTtcblxuICAgICAgICAgIHZhciByb3cgPSBpICsgMSArICcuICcgKyBvbGRIb29rTmFtZTtcblxuICAgICAgICAgIC8vIEV4dHJhIHNwYWNlIHNvIHNlY29uZCBjb2x1bW4gbGluZXMgdXBcbiAgICAgICAgICAvLyBsb2wgQCBJRSBub3Qgc3VwcG9ydGluZyBTdHJpbmcjcmVwZWF0XG4gICAgICAgICAgd2hpbGUgKHJvdy5sZW5ndGggPCBzZWNvbmRDb2x1bW5TdGFydCkge1xuICAgICAgICAgICAgcm93ICs9ICcgJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByb3cgKz0gbmV3SG9va05hbWUgKyAnXFxuJztcblxuICAgICAgICAgIHRhYmxlICs9IHJvdztcbiAgICAgICAgfVxuXG4gICAgICAgIHdhcm5pbmckMShmYWxzZSwgJ1JlYWN0IGhhcyBkZXRlY3RlZCBhIGNoYW5nZSBpbiB0aGUgb3JkZXIgb2YgSG9va3MgY2FsbGVkIGJ5ICVzLiAnICsgJ1RoaXMgd2lsbCBsZWFkIHRvIGJ1Z3MgYW5kIGVycm9ycyBpZiBub3QgZml4ZWQuICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlYWQgdGhlIFJ1bGVzIG9mIEhvb2tzOiBodHRwczovL2ZiLm1lL3J1bGVzLW9mLWhvb2tzXFxuXFxuJyArICcgICBQcmV2aW91cyByZW5kZXIgICAgICAgICAgICBOZXh0IHJlbmRlclxcbicgKyAnICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuJyArICclcycgKyAnICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXFxuJywgY29tcG9uZW50TmFtZSwgdGFibGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0aHJvd0ludmFsaWRIb29rRXJyb3IoKSB7XG4gIGludmFyaWFudChmYWxzZSwgJ0ludmFsaWQgaG9vayBjYWxsLiBIb29rcyBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gY29tcG9uZW50LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4xLiBZb3UgbWlnaHQgaGF2ZSBtaXNtYXRjaGluZyB2ZXJzaW9ucyBvZiBSZWFjdCBhbmQgdGhlIHJlbmRlcmVyIChzdWNoIGFzIFJlYWN0IERPTSlcXG4yLiBZb3UgbWlnaHQgYmUgYnJlYWtpbmcgdGhlIFJ1bGVzIG9mIEhvb2tzXFxuMy4gWW91IG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0IGluIHRoZSBzYW1lIGFwcFxcblNlZSBodHRwczovL2ZiLm1lL3JlYWN0LWludmFsaWQtaG9vay1jYWxsIGZvciB0aXBzIGFib3V0IGhvdyB0byBkZWJ1ZyBhbmQgZml4IHRoaXMgcHJvYmxlbS4nKTtcbn1cblxuZnVuY3Rpb24gYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykge1xuICBpZiAocHJldkRlcHMgPT09IG51bGwpIHtcbiAgICB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICclcyByZWNlaXZlZCBhIGZpbmFsIGFyZ3VtZW50IGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IG5vdCBkdXJpbmcgJyArICd0aGUgcHJldmlvdXMgcmVuZGVyLiBFdmVuIHRob3VnaCB0aGUgZmluYWwgYXJndW1lbnQgaXMgb3B0aW9uYWwsICcgKyAnaXRzIHR5cGUgY2Fubm90IGNoYW5nZSBiZXR3ZWVuIHJlbmRlcnMuJywgY3VycmVudEhvb2tOYW1lSW5EZXYpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB7XG4gICAgLy8gRG9uJ3QgYm90aGVyIGNvbXBhcmluZyBsZW5ndGhzIGluIHByb2QgYmVjYXVzZSB0aGVzZSBhcnJheXMgc2hvdWxkIGJlXG4gICAgLy8gcGFzc2VkIGlubGluZS5cbiAgICBpZiAobmV4dERlcHMubGVuZ3RoICE9PSBwcmV2RGVwcy5sZW5ndGgpIHtcbiAgICAgIHdhcm5pbmckMShmYWxzZSwgJ1RoZSBmaW5hbCBhcmd1bWVudCBwYXNzZWQgdG8gJXMgY2hhbmdlZCBzaXplIGJldHdlZW4gcmVuZGVycy4gVGhlICcgKyAnb3JkZXIgYW5kIHNpemUgb2YgdGhpcyBhcnJheSBtdXN0IHJlbWFpbiBjb25zdGFudC5cXG5cXG4nICsgJ1ByZXZpb3VzOiAlc1xcbicgKyAnSW5jb21pbmc6ICVzJywgY3VycmVudEhvb2tOYW1lSW5EZXYsICdbJyArIG5leHREZXBzLmpvaW4oJywgJykgKyAnXScsICdbJyArIHByZXZEZXBzLmpvaW4oJywgJykgKyAnXScpO1xuICAgIH1cbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHByZXZEZXBzLmxlbmd0aCAmJiBpIDwgbmV4dERlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaXMobmV4dERlcHNbaV0sIHByZXZEZXBzW2ldKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCByZWZPckNvbnRleHQsIG5leHRSZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICByZW5kZXJFeHBpcmF0aW9uVGltZSA9IG5leHRSZW5kZXJFeHBpcmF0aW9uVGltZTtcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IHdvcmtJblByb2dyZXNzO1xuICBuZXh0Q3VycmVudEhvb2sgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFN0YXRlIDogbnVsbDtcblxuICB7XG4gICAgaG9va1R5cGVzRGV2ID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQuX2RlYnVnSG9va1R5cGVzIDogbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICB9XG5cbiAgLy8gVGhlIGZvbGxvd2luZyBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVzZXRcbiAgLy8gY3VycmVudEhvb2sgPSBudWxsO1xuICAvLyB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuXG4gIC8vIHJlbWFpbmluZ0V4cGlyYXRpb25UaW1lID0gTm9Xb3JrO1xuICAvLyBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IG51bGw7XG5cbiAgLy8gZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlO1xuICAvLyByZW5kZXJQaGFzZVVwZGF0ZXMgPSBudWxsO1xuICAvLyBudW1iZXJPZlJlUmVuZGVycyA9IDA7XG4gIC8vIHNpZGVFZmZlY3RUYWcgPSAwO1xuXG4gIC8vIFRPRE8gV2FybiBpZiBubyBob29rcyBhcmUgdXNlZCBhdCBhbGwgZHVyaW5nIG1vdW50LCB0aGVuIHNvbWUgYXJlIHVzZWQgZHVyaW5nIHVwZGF0ZS5cbiAgLy8gQ3VycmVudGx5IHdlIHdpbGwgaWRlbnRpZnkgdGhlIHVwZGF0ZSByZW5kZXIgYXMgYSBtb3VudCBiZWNhdXNlIG5leHRDdXJyZW50SG9vayA9PT0gbnVsbC5cbiAgLy8gVGhpcyBpcyB0cmlja3kgYmVjYXVzZSBpdCdzIHZhbGlkIGZvciBjZXJ0YWluIHR5cGVzIG9mIGNvbXBvbmVudHMgKGUuZy4gUmVhY3QubGF6eSlcblxuICAvLyBVc2luZyBuZXh0Q3VycmVudEhvb2sgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG1vdW50L3VwZGF0ZSBvbmx5IHdvcmtzIGlmIGF0IGxlYXN0IG9uZSBzdGF0ZWZ1bCBob29rIGlzIHVzZWQuXG4gIC8vIE5vbi1zdGF0ZWZ1bCBob29rcyAoZS5nLiBjb250ZXh0KSBkb24ndCBnZXQgYWRkZWQgdG8gbWVtb2l6ZWRTdGF0ZSxcbiAgLy8gc28gbmV4dEN1cnJlbnRIb29rIHdvdWxkIGJlIG51bGwgZHVyaW5nIHVwZGF0ZXMgYW5kIG1vdW50cy5cbiAge1xuICAgIGlmIChuZXh0Q3VycmVudEhvb2sgIT09IG51bGwpIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICB9IGVsc2UgaWYgKGhvb2tUeXBlc0RldiAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBkaXNwYXRjaGVyIGhhbmRsZXMgYW4gZWRnZSBjYXNlIHdoZXJlIGEgY29tcG9uZW50IGlzIHVwZGF0aW5nLFxuICAgICAgLy8gYnV0IG5vIHN0YXRlZnVsIGhvb2tzIGhhdmUgYmVlbiB1c2VkLlxuICAgICAgLy8gV2Ugd2FudCB0byBtYXRjaCB0aGUgcHJvZHVjdGlvbiBjb2RlIGJlaGF2aW9yICh3aGljaCB3aWxsIHVzZSBIb29rc0Rpc3BhdGNoZXJPbk1vdW50KSxcbiAgICAgIC8vIGJ1dCB3aXRoIHRoZSBleHRyYSBERVYgdmFsaWRhdGlvbiB0byBlbnN1cmUgaG9va3Mgb3JkZXJpbmcgaGFzbid0IGNoYW5nZWQuXG4gICAgICAvLyBUaGlzIGRpc3BhdGNoZXIgZG9lcyB0aGF0LlxuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPbk1vdW50V2l0aEhvb2tUeXBlc0luREVWO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcbiAgICB9XG4gIH1cblxuICB2YXIgY2hpbGRyZW4gPSBDb21wb25lbnQocHJvcHMsIHJlZk9yQ29udGV4dCk7XG5cbiAgaWYgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUpIHtcbiAgICBkbyB7XG4gICAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7XG4gICAgICBudW1iZXJPZlJlUmVuZGVycyArPSAxO1xuXG4gICAgICAvLyBTdGFydCBvdmVyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdFxuICAgICAgbmV4dEN1cnJlbnRIb29rID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSA6IG51bGw7XG4gICAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gZmlyc3RXb3JrSW5Qcm9ncmVzc0hvb2s7XG5cbiAgICAgIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IG51bGw7XG5cbiAgICAgIHtcbiAgICAgICAgLy8gQWxzbyB2YWxpZGF0ZSBob29rIG9yZGVyIGZvciBjYXNjYWRpbmcgdXBkYXRlcy5cbiAgICAgICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTtcbiAgICAgIH1cblxuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICBjaGlsZHJlbiA9IENvbXBvbmVudChwcm9wcywgcmVmT3JDb250ZXh0KTtcbiAgICB9IHdoaWxlIChkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlKTtcblxuICAgIHJlbmRlclBoYXNlVXBkYXRlcyA9IG51bGw7XG4gICAgbnVtYmVyT2ZSZVJlbmRlcnMgPSAwO1xuICB9XG5cbiAgLy8gV2UgY2FuIGFzc3VtZSB0aGUgcHJldmlvdXMgZGlzcGF0Y2hlciBpcyBhbHdheXMgdGhpcyBvbmUsIHNpbmNlIHdlIHNldCBpdFxuICAvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZW5kZXIgcGhhc2UgYW5kIHRoZXJlJ3Mgbm8gcmUtZW50cmFuY3kuXG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIHZhciByZW5kZXJlZFdvcmsgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxO1xuXG4gIHJlbmRlcmVkV29yay5tZW1vaXplZFN0YXRlID0gZmlyc3RXb3JrSW5Qcm9ncmVzc0hvb2s7XG4gIHJlbmRlcmVkV29yay5leHBpcmF0aW9uVGltZSA9IHJlbWFpbmluZ0V4cGlyYXRpb25UaW1lO1xuICByZW5kZXJlZFdvcmsudXBkYXRlUXVldWUgPSBjb21wb25lbnRVcGRhdGVRdWV1ZTtcbiAgcmVuZGVyZWRXb3JrLmVmZmVjdFRhZyB8PSBzaWRlRWZmZWN0VGFnO1xuXG4gIHtcbiAgICByZW5kZXJlZFdvcmsuX2RlYnVnSG9va1R5cGVzID0gaG9va1R5cGVzRGV2O1xuICB9XG5cbiAgLy8gVGhpcyBjaGVjayB1c2VzIGN1cnJlbnRIb29rIHNvIHRoYXQgaXQgd29ya3MgdGhlIHNhbWUgaW4gREVWIGFuZCBwcm9kIGJ1bmRsZXMuXG4gIC8vIGhvb2tUeXBlc0RldiBjb3VsZCBjYXRjaCBtb3JlIGNhc2VzIChlLmcuIGNvbnRleHQpIGJ1dCBvbmx5IGluIERFViBidW5kbGVzLlxuICB2YXIgZGlkUmVuZGVyVG9vRmV3SG9va3MgPSBjdXJyZW50SG9vayAhPT0gbnVsbCAmJiBjdXJyZW50SG9vay5uZXh0ICE9PSBudWxsO1xuXG4gIHJlbmRlckV4cGlyYXRpb25UaW1lID0gTm9Xb3JrO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcblxuICBjdXJyZW50SG9vayA9IG51bGw7XG4gIG5leHRDdXJyZW50SG9vayA9IG51bGw7XG4gIGZpcnN0V29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgbmV4dFdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG5cbiAge1xuICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbDtcbiAgICBob29rVHlwZXNEZXYgPSBudWxsO1xuICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7XG4gIH1cblxuICByZW1haW5pbmdFeHBpcmF0aW9uVGltZSA9IE5vV29yaztcbiAgY29tcG9uZW50VXBkYXRlUXVldWUgPSBudWxsO1xuICBzaWRlRWZmZWN0VGFnID0gMDtcblxuICAvLyBUaGVzZSB3ZXJlIHJlc2V0IGFib3ZlXG4gIC8vIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTtcbiAgLy8gcmVuZGVyUGhhc2VVcGRhdGVzID0gbnVsbDtcbiAgLy8gbnVtYmVyT2ZSZVJlbmRlcnMgPSAwO1xuXG4gICEhZGlkUmVuZGVyVG9vRmV3SG9va3MgPyBpbnZhcmlhbnQoZmFsc2UsICdSZW5kZXJlZCBmZXdlciBob29rcyB0aGFuIGV4cGVjdGVkLiBUaGlzIG1heSBiZSBjYXVzZWQgYnkgYW4gYWNjaWRlbnRhbCBlYXJseSByZXR1cm4gc3RhdGVtZW50LicpIDogdm9pZCAwO1xuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cblxuZnVuY3Rpb24gYmFpbG91dEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBleHBpcmF0aW9uVGltZSkge1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG4gIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyAmPSB+KFBhc3NpdmUgfCBVcGRhdGUpO1xuICBpZiAoY3VycmVudC5leHBpcmF0aW9uVGltZSA8PSBleHBpcmF0aW9uVGltZSkge1xuICAgIGN1cnJlbnQuZXhwaXJhdGlvblRpbWUgPSBOb1dvcms7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRIb29rcygpIHtcbiAgLy8gV2UgY2FuIGFzc3VtZSB0aGUgcHJldmlvdXMgZGlzcGF0Y2hlciBpcyBhbHdheXMgdGhpcyBvbmUsIHNpbmNlIHdlIHNldCBpdFxuICAvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZW5kZXIgcGhhc2UgYW5kIHRoZXJlJ3Mgbm8gcmUtZW50cmFuY3kuXG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIC8vIFRoaXMgaXMgdXNlZCB0byByZXNldCB0aGUgc3RhdGUgb2YgdGhpcyBtb2R1bGUgd2hlbiBhIGNvbXBvbmVudCB0aHJvd3MuXG4gIC8vIEl0J3MgYWxzbyBjYWxsZWQgaW5zaWRlIG1vdW50SW5kZXRlcm1pbmF0ZUNvbXBvbmVudCBpZiB3ZSBkZXRlcm1pbmUgdGhlXG4gIC8vIGNvbXBvbmVudCBpcyBhIG1vZHVsZS1zdHlsZSBjb21wb25lbnQuXG4gIHJlbmRlckV4cGlyYXRpb25UaW1lID0gTm9Xb3JrO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcblxuICBjdXJyZW50SG9vayA9IG51bGw7XG4gIG5leHRDdXJyZW50SG9vayA9IG51bGw7XG4gIGZpcnN0V29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgbmV4dFdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG5cbiAge1xuICAgIGhvb2tUeXBlc0RldiA9IG51bGw7XG4gICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTtcblxuICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbDtcbiAgfVxuXG4gIHJlbWFpbmluZ0V4cGlyYXRpb25UaW1lID0gTm9Xb3JrO1xuICBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IG51bGw7XG4gIHNpZGVFZmZlY3RUYWcgPSAwO1xuXG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTtcbiAgcmVuZGVyUGhhc2VVcGRhdGVzID0gbnVsbDtcbiAgbnVtYmVyT2ZSZVJlbmRlcnMgPSAwO1xufVxuXG5mdW5jdGlvbiBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpIHtcbiAgdmFyIGhvb2sgPSB7XG4gICAgbWVtb2l6ZWRTdGF0ZTogbnVsbCxcblxuICAgIGJhc2VTdGF0ZTogbnVsbCxcbiAgICBxdWV1ZTogbnVsbCxcbiAgICBiYXNlVXBkYXRlOiBudWxsLFxuXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBob29rIGluIHRoZSBsaXN0XG4gICAgZmlyc3RXb3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBob29rO1xuICB9IGVsc2Uge1xuICAgIC8vIEFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0XG4gICAgd29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQgPSBob29rO1xuICB9XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc0hvb2s7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpIHtcbiAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJvdGggZm9yIHVwZGF0ZXMgYW5kIGZvciByZS1yZW5kZXJzIHRyaWdnZXJlZCBieSBhXG4gIC8vIHJlbmRlciBwaGFzZSB1cGRhdGUuIEl0IGFzc3VtZXMgdGhlcmUgaXMgZWl0aGVyIGEgY3VycmVudCBob29rIHdlIGNhblxuICAvLyBjbG9uZSwgb3IgYSB3b3JrLWluLXByb2dyZXNzIGhvb2sgZnJvbSBhIHByZXZpb3VzIHJlbmRlciBwYXNzIHRoYXQgd2UgY2FuXG4gIC8vIHVzZSBhcyBhIGJhc2UuIFdoZW4gd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgYmFzZSBsaXN0LCB3ZSBtdXN0IHN3aXRjaCB0b1xuICAvLyB0aGUgZGlzcGF0Y2hlciB1c2VkIGZvciBtb3VudHMuXG4gIGlmIChuZXh0V29ya0luUHJvZ3Jlc3NIb29rICE9PSBudWxsKSB7XG4gICAgLy8gVGhlcmUncyBhbHJlYWR5IGEgd29yay1pbi1wcm9ncmVzcy4gUmV1c2UgaXQuXG4gICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbmV4dFdvcmtJblByb2dyZXNzSG9vaztcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQ7XG5cbiAgICBjdXJyZW50SG9vayA9IG5leHRDdXJyZW50SG9vaztcbiAgICBuZXh0Q3VycmVudEhvb2sgPSBjdXJyZW50SG9vayAhPT0gbnVsbCA/IGN1cnJlbnRIb29rLm5leHQgOiBudWxsO1xuICB9IGVsc2Uge1xuICAgIC8vIENsb25lIGZyb20gdGhlIGN1cnJlbnQgaG9vay5cbiAgICAhKG5leHRDdXJyZW50SG9vayAhPT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICdSZW5kZXJlZCBtb3JlIGhvb2tzIHRoYW4gZHVyaW5nIHRoZSBwcmV2aW91cyByZW5kZXIuJykgOiB2b2lkIDA7XG4gICAgY3VycmVudEhvb2sgPSBuZXh0Q3VycmVudEhvb2s7XG5cbiAgICB2YXIgbmV3SG9vayA9IHtcbiAgICAgIG1lbW9pemVkU3RhdGU6IGN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGUsXG5cbiAgICAgIGJhc2VTdGF0ZTogY3VycmVudEhvb2suYmFzZVN0YXRlLFxuICAgICAgcXVldWU6IGN1cnJlbnRIb29rLnF1ZXVlLFxuICAgICAgYmFzZVVwZGF0ZTogY3VycmVudEhvb2suYmFzZVVwZGF0ZSxcblxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3NIb29rID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBob29rIGluIHRoZSBsaXN0LlxuICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID0gZmlyc3RXb3JrSW5Qcm9ncmVzc0hvb2sgPSBuZXdIb29rO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC5cbiAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0ID0gbmV3SG9vaztcbiAgICB9XG4gICAgbmV4dEN1cnJlbnRIb29rID0gY3VycmVudEhvb2submV4dDtcbiAgfVxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NIb29rO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGdW5jdGlvbkNvbXBvbmVudFVwZGF0ZVF1ZXVlKCkge1xuICByZXR1cm4ge1xuICAgIGxhc3RFZmZlY3Q6IG51bGxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYmFzaWNTdGF0ZVJlZHVjZXIoc3RhdGUsIGFjdGlvbikge1xuICByZXR1cm4gdHlwZW9mIGFjdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IGFjdGlvbihzdGF0ZSkgOiBhY3Rpb247XG59XG5cbmZ1bmN0aW9uIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIGluaXRpYWxTdGF0ZSA9IHZvaWQgMDtcbiAgaWYgKGluaXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXQoaW5pdGlhbEFyZyk7XG4gIH0gZWxzZSB7XG4gICAgaW5pdGlhbFN0YXRlID0gaW5pdGlhbEFyZztcbiAgfVxuICBob29rLm1lbW9pemVkU3RhdGUgPSBob29rLmJhc2VTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZSA9IHtcbiAgICBsYXN0OiBudWxsLFxuICAgIGRpc3BhdGNoOiBudWxsLFxuICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IHJlZHVjZXIsXG4gICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVxuICB9O1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoQWN0aW9uLmJpbmQobnVsbCxcbiAgLy8gRmxvdyBkb2Vzbid0IGtub3cgdGhpcyBpcyBub24tbnVsbCwgYnV0IHdlIGRvLlxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBxdWV1ZSk7XG4gIHJldHVybiBbaG9vay5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcXVldWUgPSBob29rLnF1ZXVlO1xuICAhKHF1ZXVlICE9PSBudWxsKSA/IGludmFyaWFudChmYWxzZSwgJ1Nob3VsZCBoYXZlIGEgcXVldWUuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKSA6IHZvaWQgMDtcblxuICBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyID0gcmVkdWNlcjtcblxuICBpZiAobnVtYmVyT2ZSZVJlbmRlcnMgPiAwKSB7XG4gICAgLy8gVGhpcyBpcyBhIHJlLXJlbmRlci4gQXBwbHkgdGhlIG5ldyByZW5kZXIgcGhhc2UgdXBkYXRlcyB0byB0aGUgcHJldmlvdXNcbiAgICB2YXIgX2Rpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2g7XG4gICAgaWYgKHJlbmRlclBoYXNlVXBkYXRlcyAhPT0gbnVsbCkge1xuICAgICAgLy8gUmVuZGVyIHBoYXNlIHVwZGF0ZXMgYXJlIHN0b3JlZCBpbiBhIG1hcCBvZiBxdWV1ZSAtPiBsaW5rZWQgbGlzdFxuICAgICAgdmFyIGZpcnN0UmVuZGVyUGhhc2VVcGRhdGUgPSByZW5kZXJQaGFzZVVwZGF0ZXMuZ2V0KHF1ZXVlKTtcbiAgICAgIGlmIChmaXJzdFJlbmRlclBoYXNlVXBkYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVuZGVyUGhhc2VVcGRhdGVzLmRlbGV0ZShxdWV1ZSk7XG4gICAgICAgIHZhciBuZXdTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgdmFyIHVwZGF0ZSA9IGZpcnN0UmVuZGVyUGhhc2VVcGRhdGU7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAvLyBQcm9jZXNzIHRoaXMgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gV2UgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGVcbiAgICAgICAgICAvLyBwcmlvcml0eSBiZWNhdXNlIGl0IHdpbGwgYWx3YXlzIGJlIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50XG4gICAgICAgICAgLy8gcmVuZGVyJ3MuXG4gICAgICAgICAgdmFyIF9hY3Rpb24gPSB1cGRhdGUuYWN0aW9uO1xuICAgICAgICAgIG5ld1N0YXRlID0gcmVkdWNlcihuZXdTdGF0ZSwgX2FjdGlvbik7XG4gICAgICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gICAgICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gbnVsbCk7XG5cbiAgICAgICAgLy8gTWFyayB0aGF0IHRoZSBmaWJlciBwZXJmb3JtZWQgd29yaywgYnV0IG9ubHkgaWYgdGhlIG5ldyBzdGF0ZSBpc1xuICAgICAgICAvLyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBzdGF0ZS5cbiAgICAgICAgaWYgKCFpcyhuZXdTdGF0ZSwgaG9vay5tZW1vaXplZFN0YXRlKSkge1xuICAgICAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgLy8gRG9uJ3QgcGVyc2lzdCB0aGUgc3RhdGUgYWNjdW1sYXRlZCBmcm9tIHRoZSByZW5kZXIgcGhhc2UgdXBkYXRlcyB0b1xuICAgICAgICAvLyB0aGUgYmFzZSBzdGF0ZSB1bmxlc3MgdGhlIHF1ZXVlIGlzIGVtcHR5LlxuICAgICAgICAvLyBUT0RPOiBOb3Qgc3VyZSBpZiB0aGlzIGlzIHRoZSBkZXNpcmVkIHNlbWFudGljcywgYnV0IGl0J3Mgd2hhdCB3ZVxuICAgICAgICAvLyBkbyBmb3IgZ0RTRlAuIEkgY2FuJ3QgcmVtZW1iZXIgd2h5LlxuICAgICAgICBpZiAoaG9vay5iYXNlVXBkYXRlID09PSBxdWV1ZS5sYXN0KSB7XG4gICAgICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlID0gbmV3U3RhdGU7XG5cbiAgICAgICAgcmV0dXJuIFtuZXdTdGF0ZSwgX2Rpc3BhdGNoXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIF9kaXNwYXRjaF07XG4gIH1cblxuICAvLyBUaGUgbGFzdCB1cGRhdGUgaW4gdGhlIGVudGlyZSBxdWV1ZVxuICB2YXIgbGFzdCA9IHF1ZXVlLmxhc3Q7XG4gIC8vIFRoZSBsYXN0IHVwZGF0ZSB0aGF0IGlzIHBhcnQgb2YgdGhlIGJhc2Ugc3RhdGUuXG4gIHZhciBiYXNlVXBkYXRlID0gaG9vay5iYXNlVXBkYXRlO1xuICB2YXIgYmFzZVN0YXRlID0gaG9vay5iYXNlU3RhdGU7XG5cbiAgLy8gRmluZCB0aGUgZmlyc3QgdW5wcm9jZXNzZWQgdXBkYXRlLlxuICB2YXIgZmlyc3QgPSB2b2lkIDA7XG4gIGlmIChiYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgaWYgKGxhc3QgIT09IG51bGwpIHtcbiAgICAgIC8vIEZvciB0aGUgZmlyc3QgdXBkYXRlLCB0aGUgcXVldWUgaXMgYSBjaXJjdWxhciBsaW5rZWQgbGlzdCB3aGVyZVxuICAgICAgLy8gYHF1ZXVlLmxhc3QubmV4dCA9IHF1ZXVlLmZpcnN0YC4gT25jZSB0aGUgZmlyc3QgdXBkYXRlIGNvbW1pdHMsIGFuZFxuICAgICAgLy8gdGhlIGBiYXNlVXBkYXRlYCBpcyBubyBsb25nZXIgZW1wdHksIHdlIGNhbiB1bnJhdmVsIHRoZSBsaXN0LlxuICAgICAgbGFzdC5uZXh0ID0gbnVsbDtcbiAgICB9XG4gICAgZmlyc3QgPSBiYXNlVXBkYXRlLm5leHQ7XG4gIH0gZWxzZSB7XG4gICAgZmlyc3QgPSBsYXN0ICE9PSBudWxsID8gbGFzdC5uZXh0IDogbnVsbDtcbiAgfVxuICBpZiAoZmlyc3QgIT09IG51bGwpIHtcbiAgICB2YXIgX25ld1N0YXRlID0gYmFzZVN0YXRlO1xuICAgIHZhciBuZXdCYXNlU3RhdGUgPSBudWxsO1xuICAgIHZhciBuZXdCYXNlVXBkYXRlID0gbnVsbDtcbiAgICB2YXIgcHJldlVwZGF0ZSA9IGJhc2VVcGRhdGU7XG4gICAgdmFyIF91cGRhdGUgPSBmaXJzdDtcbiAgICB2YXIgZGlkU2tpcCA9IGZhbHNlO1xuICAgIGRvIHtcbiAgICAgIHZhciB1cGRhdGVFeHBpcmF0aW9uVGltZSA9IF91cGRhdGUuZXhwaXJhdGlvblRpbWU7XG4gICAgICBpZiAodXBkYXRlRXhwaXJhdGlvblRpbWUgPCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAgICAgICAvLyBQcmlvcml0eSBpcyBpbnN1ZmZpY2llbnQuIFNraXAgdGhpcyB1cGRhdGUuIElmIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgIC8vIHNraXBwZWQgdXBkYXRlLCB0aGUgcHJldmlvdXMgdXBkYXRlL3N0YXRlIGlzIHRoZSBuZXcgYmFzZVxuICAgICAgICAvLyB1cGRhdGUvc3RhdGUuXG4gICAgICAgIGlmICghZGlkU2tpcCkge1xuICAgICAgICAgIGRpZFNraXAgPSB0cnVlO1xuICAgICAgICAgIG5ld0Jhc2VVcGRhdGUgPSBwcmV2VXBkYXRlO1xuICAgICAgICAgIG5ld0Jhc2VTdGF0ZSA9IF9uZXdTdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgdGhlIHJlbWFpbmluZyBwcmlvcml0eSBpbiB0aGUgcXVldWUuXG4gICAgICAgIGlmICh1cGRhdGVFeHBpcmF0aW9uVGltZSA+IHJlbWFpbmluZ0V4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgICAgcmVtYWluaW5nRXhwaXJhdGlvblRpbWUgPSB1cGRhdGVFeHBpcmF0aW9uVGltZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUHJvY2VzcyB0aGlzIHVwZGF0ZS5cbiAgICAgICAgaWYgKF91cGRhdGUuZWFnZXJSZWR1Y2VyID09PSByZWR1Y2VyKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyB1cGRhdGUgd2FzIHByb2Nlc3NlZCBlYWdlcmx5LCBhbmQgaXRzIHJlZHVjZXIgbWF0Y2hlcyB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IHJlZHVjZXIsIHdlIGNhbiB1c2UgdGhlIGVhZ2VybHkgY29tcHV0ZWQgc3RhdGUuXG4gICAgICAgICAgX25ld1N0YXRlID0gX3VwZGF0ZS5lYWdlclN0YXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBfYWN0aW9uMiA9IF91cGRhdGUuYWN0aW9uO1xuICAgICAgICAgIF9uZXdTdGF0ZSA9IHJlZHVjZXIoX25ld1N0YXRlLCBfYWN0aW9uMik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHByZXZVcGRhdGUgPSBfdXBkYXRlO1xuICAgICAgX3VwZGF0ZSA9IF91cGRhdGUubmV4dDtcbiAgICB9IHdoaWxlIChfdXBkYXRlICE9PSBudWxsICYmIF91cGRhdGUgIT09IGZpcnN0KTtcblxuICAgIGlmICghZGlkU2tpcCkge1xuICAgICAgbmV3QmFzZVVwZGF0ZSA9IHByZXZVcGRhdGU7XG4gICAgICBuZXdCYXNlU3RhdGUgPSBfbmV3U3RhdGU7XG4gICAgfVxuXG4gICAgLy8gTWFyayB0aGF0IHRoZSBmaWJlciBwZXJmb3JtZWQgd29yaywgYnV0IG9ubHkgaWYgdGhlIG5ldyBzdGF0ZSBpc1xuICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHN0YXRlLlxuICAgIGlmICghaXMoX25ld1N0YXRlLCBob29rLm1lbW9pemVkU3RhdGUpKSB7XG4gICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IF9uZXdTdGF0ZTtcbiAgICBob29rLmJhc2VVcGRhdGUgPSBuZXdCYXNlVXBkYXRlO1xuICAgIGhvb2suYmFzZVN0YXRlID0gbmV3QmFzZVN0YXRlO1xuXG4gICAgcXVldWUubGFzdFJlbmRlcmVkU3RhdGUgPSBfbmV3U3RhdGU7XG4gIH1cblxuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaDtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICBpZiAodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxTdGF0ZSgpO1xuICB9XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGhvb2suYmFzZVN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICB2YXIgcXVldWUgPSBob29rLnF1ZXVlID0ge1xuICAgIGxhc3Q6IG51bGwsXG4gICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogYmFzaWNTdGF0ZVJlZHVjZXIsXG4gICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVxuICB9O1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoQWN0aW9uLmJpbmQobnVsbCxcbiAgLy8gRmxvdyBkb2Vzbid0IGtub3cgdGhpcyBpcyBub24tbnVsbCwgYnV0IHdlIGRvLlxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBxdWV1ZSk7XG4gIHJldHVybiBbaG9vay5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICByZXR1cm4gdXBkYXRlUmVkdWNlcihiYXNpY1N0YXRlUmVkdWNlciwgaW5pdGlhbFN0YXRlKTtcbn1cblxuZnVuY3Rpb24gcHVzaEVmZmVjdCh0YWcsIGNyZWF0ZSwgZGVzdHJveSwgZGVwcykge1xuICB2YXIgZWZmZWN0ID0ge1xuICAgIHRhZzogdGFnLFxuICAgIGNyZWF0ZTogY3JlYXRlLFxuICAgIGRlc3Ryb3k6IGRlc3Ryb3ksXG4gICAgZGVwczogZGVwcyxcbiAgICAvLyBDaXJjdWxhclxuICAgIG5leHQ6IG51bGxcbiAgfTtcbiAgaWYgKGNvbXBvbmVudFVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjcmVhdGVGdW5jdGlvbkNvbXBvbmVudFVwZGF0ZVF1ZXVlKCk7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdCA9IGVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICB9IGVsc2Uge1xuICAgIHZhciBfbGFzdEVmZmVjdCA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3Q7XG4gICAgaWYgKF9sYXN0RWZmZWN0ID09PSBudWxsKSB7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0Lm5leHQgPSBlZmZlY3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBmaXJzdEVmZmVjdCA9IF9sYXN0RWZmZWN0Lm5leHQ7XG4gICAgICBfbGFzdEVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICAgICAgZWZmZWN0Lm5leHQgPSBmaXJzdEVmZmVjdDtcbiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgPSBlZmZlY3Q7XG4gICAgfVxuICB9XG4gIHJldHVybiBlZmZlY3Q7XG59XG5cbmZ1bmN0aW9uIG1vdW50UmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciByZWYgPSB7IGN1cnJlbnQ6IGluaXRpYWxWYWx1ZSB9O1xuICB7XG4gICAgT2JqZWN0LnNlYWwocmVmKTtcbiAgfVxuICBob29rLm1lbW9pemVkU3RhdGUgPSByZWY7XG4gIHJldHVybiByZWY7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlZihpbml0aWFsVmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgcmV0dXJuIGhvb2subWVtb2l6ZWRTdGF0ZTtcbn1cblxuZnVuY3Rpb24gbW91bnRFZmZlY3RJbXBsKGZpYmVyRWZmZWN0VGFnLCBob29rRWZmZWN0VGFnLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgc2lkZUVmZmVjdFRhZyB8PSBmaWJlckVmZmVjdFRhZztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaEVmZmVjdChob29rRWZmZWN0VGFnLCBjcmVhdGUsIHVuZGVmaW5lZCwgbmV4dERlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVFZmZlY3RJbXBsKGZpYmVyRWZmZWN0VGFnLCBob29rRWZmZWN0VGFnLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBkZXN0cm95ID0gdW5kZWZpbmVkO1xuXG4gIGlmIChjdXJyZW50SG9vayAhPT0gbnVsbCkge1xuICAgIHZhciBwcmV2RWZmZWN0ID0gY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgICBkZXN0cm95ID0gcHJldkVmZmVjdC5kZXN0cm95O1xuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldkVmZmVjdC5kZXBzO1xuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIHB1c2hFZmZlY3QoTm9FZmZlY3QkMSwgY3JlYXRlLCBkZXN0cm95LCBuZXh0RGVwcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzaWRlRWZmZWN0VGFnIHw9IGZpYmVyRWZmZWN0VGFnO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoRWZmZWN0KGhvb2tFZmZlY3RUYWcsIGNyZWF0ZSwgZGVzdHJveSwgbmV4dERlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChVcGRhdGUgfCBQYXNzaXZlLCBVbm1vdW50UGFzc2l2ZSB8IE1vdW50UGFzc2l2ZSwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChVcGRhdGUgfCBQYXNzaXZlLCBVbm1vdW50UGFzc2l2ZSB8IE1vdW50UGFzc2l2ZSwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoVXBkYXRlLCBVbm1vdW50TXV0YXRpb24gfCBNb3VudExheW91dCwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChVcGRhdGUsIFVubW91bnRNdXRhdGlvbiB8IE1vdW50TGF5b3V0LCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0KGNyZWF0ZSwgcmVmKSB7XG4gIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIHJlZkNhbGxiYWNrID0gcmVmO1xuICAgIHZhciBfaW5zdCA9IGNyZWF0ZSgpO1xuICAgIHJlZkNhbGxiYWNrKF9pbnN0KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVmQ2FsbGJhY2sobnVsbCk7XG4gICAgfTtcbiAgfSBlbHNlIGlmIChyZWYgIT09IG51bGwgJiYgcmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcmVmT2JqZWN0ID0gcmVmO1xuICAgIHtcbiAgICAgICFyZWZPYmplY3QuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSA/IHdhcm5pbmckMShmYWxzZSwgJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBmaXJzdCBhcmd1bWVudCB0byBlaXRoZXIgYmUgYSAnICsgJ3JlZiBjYWxsYmFjayBvciBSZWFjdC5jcmVhdGVSZWYoKSBvYmplY3QuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsICdhbiBvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMocmVmT2JqZWN0KS5qb2luKCcsICcpICsgJ30nKSA6IHZvaWQgMDtcbiAgICB9XG4gICAgdmFyIF9pbnN0MiA9IGNyZWF0ZSgpO1xuICAgIHJlZk9iamVjdC5jdXJyZW50ID0gX2luc3QyO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZWZPYmplY3QuY3VycmVudCA9IG51bGw7XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAge1xuICAgICEodHlwZW9mIGNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykgPyB3YXJuaW5nJDEoZmFsc2UsICdFeHBlY3RlZCB1c2VJbXBlcmF0aXZlSGFuZGxlKCkgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb24gJyArICd0aGF0IGNyZWF0ZXMgYSBoYW5kbGUuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNyZWF0ZSAhPT0gbnVsbCA/IHR5cGVvZiBjcmVhdGUgOiAnbnVsbCcpIDogdm9pZCAwO1xuICB9XG5cbiAgLy8gVE9ETzogSWYgZGVwcyBhcmUgcHJvdmlkZWQsIHNob3VsZCB3ZSBza2lwIGNvbXBhcmluZyB0aGUgcmVmIGl0c2VsZj9cbiAgdmFyIGVmZmVjdERlcHMgPSBkZXBzICE9PSBudWxsICYmIGRlcHMgIT09IHVuZGVmaW5lZCA/IGRlcHMuY29uY2F0KFtyZWZdKSA6IG51bGw7XG5cbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChVcGRhdGUsIFVubW91bnRNdXRhdGlvbiB8IE1vdW50TGF5b3V0LCBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0LmJpbmQobnVsbCwgY3JlYXRlLCByZWYpLCBlZmZlY3REZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICB7XG4gICAgISh0eXBlb2YgY3JlYXRlID09PSAnZnVuY3Rpb24nKSA/IHdhcm5pbmckMShmYWxzZSwgJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSBmdW5jdGlvbiAnICsgJ3RoYXQgY3JlYXRlcyBhIGhhbmRsZS4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY3JlYXRlICE9PSBudWxsID8gdHlwZW9mIGNyZWF0ZSA6ICdudWxsJykgOiB2b2lkIDA7XG4gIH1cblxuICAvLyBUT0RPOiBJZiBkZXBzIGFyZSBwcm92aWRlZCwgc2hvdWxkIHdlIHNraXAgY29tcGFyaW5nIHRoZSByZWYgaXRzZWxmP1xuICB2YXIgZWZmZWN0RGVwcyA9IGRlcHMgIT09IG51bGwgJiYgZGVwcyAhPT0gdW5kZWZpbmVkID8gZGVwcy5jb25jYXQoW3JlZl0pIDogbnVsbDtcblxuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChVcGRhdGUsIFVubW91bnRNdXRhdGlvbiB8IE1vdW50TGF5b3V0LCBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0LmJpbmQobnVsbCwgY3JlYXRlLCByZWYpLCBlZmZlY3REZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnREZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAvLyBUaGlzIGhvb2sgaXMgbm9ybWFsbHkgYSBuby1vcC5cbiAgLy8gVGhlIHJlYWN0LWRlYnVnLWhvb2tzIHBhY2thZ2UgaW5qZWN0cyBpdHMgb3duIGltcGxlbWVudGF0aW9uXG4gIC8vIHNvIHRoYXQgZS5nLiBEZXZUb29scyBjYW4gZGlzcGxheSBjdXN0b20gaG9vayB2YWx1ZXMuXG59XG5cbnZhciB1cGRhdGVEZWJ1Z1ZhbHVlID0gbW91bnREZWJ1Z1ZhbHVlO1xuXG5mdW5jdGlvbiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtjYWxsYmFjaywgbmV4dERlcHNdO1xuICByZXR1cm4gY2FsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgcHJldlN0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgaWYgKG5leHREZXBzICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldkRlcHMgPSBwcmV2U3RhdGVbMV07XG4gICAgICBpZiAoYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykpIHtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZVswXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW2NhbGxiYWNrLCBuZXh0RGVwc107XG4gIHJldHVybiBjYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gbW91bnRNZW1vKG5leHRDcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIG5leHRWYWx1ZSA9IG5leHRDcmVhdGUoKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW25leHRWYWx1ZSwgbmV4dERlcHNdO1xuICByZXR1cm4gbmV4dFZhbHVlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNZW1vKG5leHRDcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBwcmV2U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAvLyBBc3N1bWUgdGhlc2UgYXJlIGRlZmluZWQuIElmIHRoZXkncmUgbm90LCBhcmVIb29rSW5wdXRzRXF1YWwgd2lsbCB3YXJuLlxuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldlN0YXRlWzFdO1xuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGVbMF07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHZhciBuZXh0VmFsdWUgPSBuZXh0Q3JlYXRlKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtuZXh0VmFsdWUsIG5leHREZXBzXTtcbiAgcmV0dXJuIG5leHRWYWx1ZTtcbn1cblxuLy8gaW4gYSB0ZXN0LWxpa2UgZW52aXJvbm1lbnQsIHdlIHdhbnQgdG8gd2FybiBpZiBkaXNwYXRjaEFjdGlvbigpXG4vLyBpcyBjYWxsZWQgb3V0c2lkZSBvZiBhIGJhdGNoZWRVcGRhdGVzL1Rlc3RVdGlscy5hY3QoLi4uKSBjYWxsLlxudmFyIHNob3VsZFdhcm5Gb3JVbmJhdGNoZWRTZXRTdGF0ZSA9IGZhbHNlO1xuXG57XG4gIC8vIGplc3QgaXNuJ3QgYSAnZ2xvYmFsJywgaXQncyBqdXN0IGV4cG9zZWQgdG8gdGVzdHMgdmlhIGEgd3JhcHBlZCBmdW5jdGlvblxuICAvLyBmdXJ0aGVyLCB0aGlzIGlzbid0IGEgdGVzdCBmaWxlLCBzbyBmbG93IGRvZXNuJ3QgcmVjb2duaXplIHRoZSBzeW1ib2wuIFNvLi4uXG4gIC8vICRGbG93RXhwZWN0ZWRFcnJvciAtIGJlY2F1c2UgcmVxdWlyZW1lbnRzIGRvbid0IGdpdmUgYSBkYW1uIGFib3V0IHlvdXIgdHlwZSBzaWdzLlxuICBpZiAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBqZXN0KSB7XG4gICAgc2hvdWxkV2FybkZvclVuYmF0Y2hlZFNldFN0YXRlID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEFjdGlvbihmaWJlciwgcXVldWUsIGFjdGlvbikge1xuICAhKG51bWJlck9mUmVSZW5kZXJzIDwgUkVfUkVOREVSX0xJTUlUKSA/IGludmFyaWFudChmYWxzZSwgJ1RvbyBtYW55IHJlLXJlbmRlcnMuIFJlYWN0IGxpbWl0cyB0aGUgbnVtYmVyIG9mIHJlbmRlcnMgdG8gcHJldmVudCBhbiBpbmZpbml0ZSBsb29wLicpIDogdm9pZCAwO1xuXG4gIHtcbiAgICAhKGFyZ3VtZW50cy5sZW5ndGggPD0gMykgPyB3YXJuaW5nJDEoZmFsc2UsIFwiU3RhdGUgdXBkYXRlcyBmcm9tIHRoZSB1c2VTdGF0ZSgpIGFuZCB1c2VSZWR1Y2VyKCkgSG9va3MgZG9uJ3Qgc3VwcG9ydCB0aGUgXCIgKyAnc2Vjb25kIGNhbGxiYWNrIGFyZ3VtZW50LiBUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgJyArICdyZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gdGhlIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJykgOiB2b2lkIDA7XG4gIH1cblxuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuICBpZiAoZmliZXIgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZSA9PT0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSkge1xuICAgIC8vIFRoaXMgaXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlLiBTdGFzaCBpdCBpbiBhIGxhemlseS1jcmVhdGVkIG1hcCBvZlxuICAgIC8vIHF1ZXVlIC0+IGxpbmtlZCBsaXN0IG9mIHVwZGF0ZXMuIEFmdGVyIHRoaXMgcmVuZGVyIHBhc3MsIHdlJ2xsIHJlc3RhcnRcbiAgICAvLyBhbmQgYXBwbHkgdGhlIHN0YXNoZWQgdXBkYXRlcyBvbiB0b3Agb2YgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgaG9vay5cbiAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gdHJ1ZTtcbiAgICB2YXIgdXBkYXRlID0ge1xuICAgICAgZXhwaXJhdGlvblRpbWU6IHJlbmRlckV4cGlyYXRpb25UaW1lLFxuICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICBlYWdlclJlZHVjZXI6IG51bGwsXG4gICAgICBlYWdlclN0YXRlOiBudWxsLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG4gICAgaWYgKHJlbmRlclBoYXNlVXBkYXRlcyA9PT0gbnVsbCkge1xuICAgICAgcmVuZGVyUGhhc2VVcGRhdGVzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICB2YXIgZmlyc3RSZW5kZXJQaGFzZVVwZGF0ZSA9IHJlbmRlclBoYXNlVXBkYXRlcy5nZXQocXVldWUpO1xuICAgIGlmIChmaXJzdFJlbmRlclBoYXNlVXBkYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlbmRlclBoYXNlVXBkYXRlcy5zZXQocXVldWUsIHVwZGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFwcGVuZCB0aGUgdXBkYXRlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuXG4gICAgICB2YXIgbGFzdFJlbmRlclBoYXNlVXBkYXRlID0gZmlyc3RSZW5kZXJQaGFzZVVwZGF0ZTtcbiAgICAgIHdoaWxlIChsYXN0UmVuZGVyUGhhc2VVcGRhdGUubmV4dCAhPT0gbnVsbCkge1xuICAgICAgICBsYXN0UmVuZGVyUGhhc2VVcGRhdGUgPSBsYXN0UmVuZGVyUGhhc2VVcGRhdGUubmV4dDtcbiAgICAgIH1cbiAgICAgIGxhc3RSZW5kZXJQaGFzZVVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG5cbiAgICB2YXIgY3VycmVudFRpbWUgPSByZXF1ZXN0Q3VycmVudFRpbWUoKTtcbiAgICB2YXIgX2V4cGlyYXRpb25UaW1lID0gY29tcHV0ZUV4cGlyYXRpb25Gb3JGaWJlcihjdXJyZW50VGltZSwgZmliZXIpO1xuXG4gICAgdmFyIF91cGRhdGUyID0ge1xuICAgICAgZXhwaXJhdGlvblRpbWU6IF9leHBpcmF0aW9uVGltZSxcbiAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgZWFnZXJSZWR1Y2VyOiBudWxsLFxuICAgICAgZWFnZXJTdGF0ZTogbnVsbCxcbiAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuXG4gICAgLy8gQXBwZW5kIHRoZSB1cGRhdGUgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC5cbiAgICB2YXIgX2xhc3QgPSBxdWV1ZS5sYXN0O1xuICAgIGlmIChfbGFzdCA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgICAgX3VwZGF0ZTIubmV4dCA9IF91cGRhdGUyO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZmlyc3QgPSBfbGFzdC5uZXh0O1xuICAgICAgaWYgKGZpcnN0ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIFN0aWxsIGNpcmN1bGFyLlxuICAgICAgICBfdXBkYXRlMi5uZXh0ID0gZmlyc3Q7XG4gICAgICB9XG4gICAgICBfbGFzdC5uZXh0ID0gX3VwZGF0ZTI7XG4gICAgfVxuICAgIHF1ZXVlLmxhc3QgPSBfdXBkYXRlMjtcblxuICAgIGlmIChmaWJlci5leHBpcmF0aW9uVGltZSA9PT0gTm9Xb3JrICYmIChhbHRlcm5hdGUgPT09IG51bGwgfHwgYWx0ZXJuYXRlLmV4cGlyYXRpb25UaW1lID09PSBOb1dvcmspKSB7XG4gICAgICAvLyBUaGUgcXVldWUgaXMgY3VycmVudGx5IGVtcHR5LCB3aGljaCBtZWFucyB3ZSBjYW4gZWFnZXJseSBjb21wdXRlIHRoZVxuICAgICAgLy8gbmV4dCBzdGF0ZSBiZWZvcmUgZW50ZXJpbmcgdGhlIHJlbmRlciBwaGFzZS4gSWYgdGhlIG5ldyBzdGF0ZSBpcyB0aGVcbiAgICAgIC8vIHNhbWUgYXMgdGhlIGN1cnJlbnQgc3RhdGUsIHdlIG1heSBiZSBhYmxlIHRvIGJhaWwgb3V0IGVudGlyZWx5LlxuICAgICAgdmFyIF9sYXN0UmVuZGVyZWRSZWR1Y2VyID0gcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlcjtcbiAgICAgIGlmIChfbGFzdFJlbmRlcmVkUmVkdWNlciAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSB2b2lkIDA7XG4gICAgICAgIHtcbiAgICAgICAgICBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgY3VycmVudFN0YXRlID0gcXVldWUubGFzdFJlbmRlcmVkU3RhdGU7XG4gICAgICAgICAgdmFyIF9lYWdlclN0YXRlID0gX2xhc3RSZW5kZXJlZFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pO1xuICAgICAgICAgIC8vIFN0YXNoIHRoZSBlYWdlcmx5IGNvbXB1dGVkIHN0YXRlLCBhbmQgdGhlIHJlZHVjZXIgdXNlZCB0byBjb21wdXRlXG4gICAgICAgICAgLy8gaXQsIG9uIHRoZSB1cGRhdGUgb2JqZWN0LiBJZiB0aGUgcmVkdWNlciBoYXNuJ3QgY2hhbmdlZCBieSB0aGVcbiAgICAgICAgICAvLyB0aW1lIHdlIGVudGVyIHRoZSByZW5kZXIgcGhhc2UsIHRoZW4gdGhlIGVhZ2VyIHN0YXRlIGNhbiBiZSB1c2VkXG4gICAgICAgICAgLy8gd2l0aG91dCBjYWxsaW5nIHRoZSByZWR1Y2VyIGFnYWluLlxuICAgICAgICAgIF91cGRhdGUyLmVhZ2VyUmVkdWNlciA9IF9sYXN0UmVuZGVyZWRSZWR1Y2VyO1xuICAgICAgICAgIF91cGRhdGUyLmVhZ2VyU3RhdGUgPSBfZWFnZXJTdGF0ZTtcbiAgICAgICAgICBpZiAoaXMoX2VhZ2VyU3RhdGUsIGN1cnJlbnRTdGF0ZSkpIHtcbiAgICAgICAgICAgIC8vIEZhc3QgcGF0aC4gV2UgY2FuIGJhaWwgb3V0IHdpdGhvdXQgc2NoZWR1bGluZyBSZWFjdCB0byByZS1yZW5kZXIuXG4gICAgICAgICAgICAvLyBJdCdzIHN0aWxsIHBvc3NpYmxlIHRoYXQgd2UnbGwgbmVlZCB0byByZWJhc2UgdGhpcyB1cGRhdGUgbGF0ZXIsXG4gICAgICAgICAgICAvLyBpZiB0aGUgY29tcG9uZW50IHJlLXJlbmRlcnMgZm9yIGEgZGlmZmVyZW50IHJlYXNvbiBhbmQgYnkgdGhhdFxuICAgICAgICAgICAgLy8gdGltZSB0aGUgcmVkdWNlciBoYXMgY2hhbmdlZC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gU3VwcHJlc3MgdGhlIGVycm9yLiBJdCB3aWxsIHRocm93IGFnYWluIGluIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAge1xuICAgICAgaWYgKHNob3VsZFdhcm5Gb3JVbmJhdGNoZWRTZXRTdGF0ZSA9PT0gdHJ1ZSkge1xuICAgICAgICB3YXJuSWZOb3RDdXJyZW50bHlCYXRjaGluZ0luRGV2KGZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc2NoZWR1bGVXb3JrKGZpYmVyLCBfZXhwaXJhdGlvblRpbWUpO1xuICB9XG59XG5cbnZhciBDb250ZXh0T25seURpc3BhdGNoZXIgPSB7XG4gIHJlYWRDb250ZXh0OiByZWFkQ29udGV4dCxcblxuICB1c2VDYWxsYmFjazogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VDb250ZXh0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUVmZmVjdDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VJbXBlcmF0aXZlSGFuZGxlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUxheW91dEVmZmVjdDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VNZW1vOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVJlZHVjZXI6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlUmVmOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVN0YXRlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZURlYnVnVmFsdWU6IHRocm93SW52YWxpZEhvb2tFcnJvclxufTtcblxudmFyIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IG51bGw7XG52YXIgSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFViA9IG51bGw7XG52YXIgSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSBudWxsO1xuXG57XG4gIHZhciB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgd2FybmluZyQxKGZhbHNlLCAnQ29udGV4dCBjYW4gb25seSBiZSByZWFkIHdoaWxlIFJlYWN0IGlzIHJlbmRlcmluZy4gJyArICdJbiBjbGFzc2VzLCB5b3UgY2FuIHJlYWQgaXQgaW4gdGhlIHJlbmRlciBtZXRob2Qgb3IgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiAnICsgJ0luIGZ1bmN0aW9uIGNvbXBvbmVudHMsIHlvdSBjYW4gcmVhZCBpdCBkaXJlY3RseSBpbiB0aGUgZnVuY3Rpb24gYm9keSwgYnV0IG5vdCAnICsgJ2luc2lkZSBIb29rcyBsaWtlIHVzZVJlZHVjZXIoKSBvciB1c2VNZW1vKCkuJyk7XG4gIH07XG5cbiAgdmFyIHdhcm5JbnZhbGlkSG9va0FjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICB3YXJuaW5nJDEoZmFsc2UsICdEbyBub3QgY2FsbCBIb29rcyBpbnNpZGUgdXNlRWZmZWN0KC4uLiksIHVzZU1lbW8oLi4uKSwgb3Igb3RoZXIgYnVpbHQtaW4gSG9va3MuICcgKyAnWW91IGNhbiBvbmx5IGNhbGwgSG9va3MgYXQgdGhlIHRvcCBsZXZlbCBvZiB5b3VyIFJlYWN0IGZ1bmN0aW9uLiAnICsgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgJyArICdodHRwczovL2ZiLm1lL3J1bGVzLW9mLWhvb2tzJyk7XG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKTtcbiAgICB9XG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQsIG9ic2VydmVkQml0cykge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cyk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pO1xuICAgIH1cbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZihpbml0aWFsVmFsdWUpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbik7XG4gICAgfVxuICB9O1xuXG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cyk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0LCBvYnNlcnZlZEJpdHMpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFJlZihpbml0aWFsVmFsdWUpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKTtcbiAgICB9XG4gIH07XG5cbiAgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cyk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0LCBvYnNlcnZlZEJpdHMpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbik7XG4gICAgfVxuICB9O1xufVxuXG52YXIgY29tbWl0VGltZSA9IDA7XG52YXIgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcblxuZnVuY3Rpb24gZ2V0Q29tbWl0VGltZSgpIHtcbiAgcmV0dXJuIGNvbW1pdFRpbWU7XG59XG5cbmZ1bmN0aW9uIHJlY29yZENvbW1pdFRpbWUoKSB7XG4gIGlmICghZW5hYmxlUHJvZmlsZXJUaW1lcikge1xuICAgIHJldHVybjtcbiAgfVxuICBjb21taXRUaW1lID0gc2NoZWR1bGVyLnVuc3RhYmxlX25vdygpO1xufVxuXG5mdW5jdGlvbiBzdGFydFByb2ZpbGVyVGltZXIoZmliZXIpIHtcbiAgaWYgKCFlbmFibGVQcm9maWxlclRpbWVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHJvZmlsZXJTdGFydFRpbWUgPSBzY2hlZHVsZXIudW5zdGFibGVfbm93KCk7XG5cbiAgaWYgKGZpYmVyLmFjdHVhbFN0YXJ0VGltZSA8IDApIHtcbiAgICBmaWJlci5hY3R1YWxTdGFydFRpbWUgPSBzY2hlZHVsZXIudW5zdGFibGVfbm93KCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoZmliZXIpIHtcbiAgaWYgKCFlbmFibGVQcm9maWxlclRpbWVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHByb2ZpbGVyU3RhcnRUaW1lID0gLTE7XG59XG5cbmZ1bmN0aW9uIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoZmliZXIsIG92ZXJyaWRlQmFzZVRpbWUpIHtcbiAgaWYgKCFlbmFibGVQcm9maWxlclRpbWVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHByb2ZpbGVyU3RhcnRUaW1lID49IDApIHtcbiAgICB2YXIgZWxhcHNlZFRpbWUgPSBzY2hlZHVsZXIudW5zdGFibGVfbm93KCkgLSBwcm9maWxlclN0YXJ0VGltZTtcbiAgICBmaWJlci5hY3R1YWxEdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICBpZiAob3ZlcnJpZGVCYXNlVGltZSkge1xuICAgICAgZmliZXIuc2VsZkJhc2VEdXJhdGlvbiA9IGVsYXBzZWRUaW1lO1xuICAgIH1cbiAgICBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xuICB9XG59XG5cbi8vIFRoZSBkZWVwZXN0IEZpYmVyIG9uIHRoZSBzdGFjayBpbnZvbHZlZCBpbiBhIGh5ZHJhdGlvbiBjb250ZXh0LlxuLy8gVGhpcyBtYXkgaGF2ZSBiZWVuIGFuIGluc2VydGlvbiBvciBhIGh5ZHJhdGlvbi5cbnZhciBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGw7XG52YXIgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG52YXIgaXNIeWRyYXRpbmcgPSBmYWxzZTtcblxuZnVuY3Rpb24gZW50ZXJIeWRyYXRpb25TdGF0ZShmaWJlcikge1xuICBpZiAoIXN1cHBvcnRzSHlkcmF0aW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHBhcmVudEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZChwYXJlbnRJbnN0YW5jZSk7XG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gIGlzSHlkcmF0aW5nID0gdHJ1ZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlZW50ZXJIeWRyYXRpb25TdGF0ZUZyb21EZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlcikge1xuICBpZiAoIXN1cHBvcnRzSHlkcmF0aW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoc3VzcGVuc2VJbnN0YW5jZSk7XG4gIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpO1xuICBpc0h5ZHJhdGluZyA9IHRydWU7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKSB7XG4gIHtcbiAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgZGlkTm90SHlkcmF0ZUNvbnRhaW5lckluc3RhbmNlKHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLCBpbnN0YW5jZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICBkaWROb3RIeWRyYXRlSW5zdGFuY2UocmV0dXJuRmliZXIudHlwZSwgcmV0dXJuRmliZXIubWVtb2l6ZWRQcm9wcywgcmV0dXJuRmliZXIuc3RhdGVOb2RlLCBpbnN0YW5jZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjaGlsZFRvRGVsZXRlID0gY3JlYXRlRmliZXJGcm9tSG9zdEluc3RhbmNlRm9yRGVsZXRpb24oKTtcbiAgY2hpbGRUb0RlbGV0ZS5zdGF0ZU5vZGUgPSBpbnN0YW5jZTtcbiAgY2hpbGRUb0RlbGV0ZS5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgY2hpbGRUb0RlbGV0ZS5lZmZlY3RUYWcgPSBEZWxldGlvbjtcblxuICAvLyBUaGlzIG1pZ2h0IHNlZW0gbGlrZSBpdCBiZWxvbmdzIG9uIHByb2dyZXNzZWRGaXJzdERlbGV0aW9uLiBIb3dldmVyLFxuICAvLyB0aGVzZSBjaGlsZHJlbiBhcmUgbm90IHBhcnQgb2YgdGhlIHJlY29uY2lsaWF0aW9uIGxpc3Qgb2YgY2hpbGRyZW4uXG4gIC8vIEV2ZW4gaWYgd2UgYWJvcnQgYW5kIHJlcmVjb25jaWxlIHRoZSBjaGlsZHJlbiwgdGhhdCB3aWxsIHRyeSB0byBoeWRyYXRlXG4gIC8vIGFnYWluIGFuZCB0aGUgbm9kZXMgYXJlIHN0aWxsIGluIHRoZSBob3N0IHRyZWUgc28gdGhlc2Ugd2lsbCBiZVxuICAvLyByZWNyZWF0ZWQuXG4gIGlmIChyZXR1cm5GaWJlci5sYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgcmV0dXJuRmliZXIubGFzdEVmZmVjdC5uZXh0RWZmZWN0ID0gY2hpbGRUb0RlbGV0ZTtcbiAgICByZXR1cm5GaWJlci5sYXN0RWZmZWN0ID0gY2hpbGRUb0RlbGV0ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm5GaWJlci5maXJzdEVmZmVjdCA9IHJldHVybkZpYmVyLmxhc3RFZmZlY3QgPSBjaGlsZFRvRGVsZXRlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydE5vbkh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGZpYmVyKSB7XG4gIGZpYmVyLmVmZmVjdFRhZyB8PSBQbGFjZW1lbnQ7XG4gIHtcbiAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBwYXJlbnRDb250YWluZXIgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBwcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVDb250YWluZXJJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHR5cGUsIHByb3BzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICAgICAgICB2YXIgdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVDb250YWluZXJUZXh0SW5zdGFuY2UocGFyZW50Q29udGFpbmVyLCB0ZXh0KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcGFyZW50VHlwZSA9IHJldHVybkZpYmVyLnR5cGU7XG4gICAgICAgICAgdmFyIHBhcmVudFByb3BzID0gcmV0dXJuRmliZXIubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICB2YXIgcGFyZW50SW5zdGFuY2UgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAgdmFyIF90eXBlID0gZmliZXIudHlwZTtcbiAgICAgICAgICAgICAgdmFyIF9wcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIF90eXBlLCBfcHJvcHMpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICAgICAgICAgIHZhciBfdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBfdGV4dCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVTdXNwZW5zZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpIHtcbiAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciB0eXBlID0gZmliZXIudHlwZTtcbiAgICAgICAgdmFyIHByb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBjYW5IeWRyYXRlSW5zdGFuY2UobmV4dEluc3RhbmNlLCB0eXBlLCBwcm9wcyk7XG4gICAgICAgIGlmIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IGluc3RhbmNlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICB2YXIgdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIHRleHRJbnN0YW5jZSA9IGNhbkh5ZHJhdGVUZXh0SW5zdGFuY2UobmV4dEluc3RhbmNlLCB0ZXh0KTtcbiAgICAgICAgaWYgKHRleHRJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IHRleHRJbnN0YW5jZTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKGVuYWJsZVN1c3BlbnNlU2VydmVyUmVuZGVyZXIpIHtcbiAgICAgICAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IGNhbkh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKG5leHRJbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKHN1c3BlbnNlSW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIERvd25ncmFkZSB0aGUgdGFnIHRvIGEgZGVoeWRyYXRlZCBjb21wb25lbnQgdW50aWwgd2UndmUgaHlkcmF0ZWQgaXQuXG4gICAgICAgICAgICBmaWJlci50YWcgPSBEZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQ7XG4gICAgICAgICAgICBmaWJlci5zdGF0ZU5vZGUgPSBzdXNwZW5zZUluc3RhbmNlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKGZpYmVyKSB7XG4gIGlmICghaXNIeWRyYXRpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG5leHRJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG4gIGlmICghbmV4dEluc3RhbmNlKSB7XG4gICAgLy8gTm90aGluZyB0byBoeWRyYXRlLiBNYWtlIGl0IGFuIGluc2VydGlvbi5cbiAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgZmlyc3RBdHRlbXB0ZWRJbnN0YW5jZSA9IG5leHRJbnN0YW5jZTtcbiAgaWYgKCF0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpKSB7XG4gICAgLy8gSWYgd2UgY2FuJ3QgaHlkcmF0ZSB0aGlzIGluc3RhbmNlIGxldCdzIHRyeSB0aGUgbmV4dCBvbmUuXG4gICAgLy8gV2UgdXNlIHRoaXMgYXMgYSBoZXVyaXN0aWMuIEl0J3MgYmFzZWQgb24gaW50dWl0aW9uIGFuZCBub3QgZGF0YSBzbyBpdFxuICAgIC8vIG1pZ2h0IGJlIGZsYXdlZCBvciB1bm5lY2Vzc2FyeS5cbiAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoZmlyc3RBdHRlbXB0ZWRJbnN0YW5jZSk7XG4gICAgaWYgKCFuZXh0SW5zdGFuY2UgfHwgIXRyeUh5ZHJhdGUoZmliZXIsIG5leHRJbnN0YW5jZSkpIHtcbiAgICAgIC8vIE5vdGhpbmcgdG8gaHlkcmF0ZS4gTWFrZSBpdCBhbiBpbnNlcnRpb24uXG4gICAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgICBpc0h5ZHJhdGluZyA9IGZhbHNlO1xuICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gV2UgbWF0Y2hlZCB0aGUgbmV4dCBvbmUsIHdlJ2xsIG5vdyBhc3N1bWUgdGhhdCB0aGUgZmlyc3Qgb25lIHdhc1xuICAgIC8vIHN1cGVyZmx1b3VzIGFuZCB3ZSdsbCBkZWxldGUgaXQuIFNpbmNlIHdlIGNhbid0IGVhZ2VybHkgZGVsZXRlIGl0XG4gICAgLy8gd2UnbGwgaGF2ZSB0byBzY2hlZHVsZSBhIGRlbGV0aW9uLiBUbyBkbyB0aGF0LCB0aGlzIG5vZGUgbmVlZHMgYSBkdW1teVxuICAgIC8vIGZpYmVyIGFzc29jaWF0ZWQgd2l0aCBpdC5cbiAgICBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UoaHlkcmF0aW9uUGFyZW50RmliZXIsIGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UpO1xuICB9XG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZChuZXh0SW5zdGFuY2UpO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKGZpYmVyLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7XG4gIGlmICghc3VwcG9ydHNIeWRyYXRpb24pIHtcbiAgICBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCBwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKCkgdG8gbmV2ZXIgYmUgY2FsbGVkLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICB2YXIgdXBkYXRlUGF5bG9hZCA9IGh5ZHJhdGVJbnN0YW5jZShpbnN0YW5jZSwgZmliZXIudHlwZSwgZmliZXIubWVtb2l6ZWRQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgZmliZXIpO1xuICAvLyBUT0RPOiBUeXBlIHRoaXMgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGNvbXBvbmVudC5cbiAgZmliZXIudXBkYXRlUXVldWUgPSB1cGRhdGVQYXlsb2FkO1xuICAvLyBJZiB0aGUgdXBkYXRlIHBheWxvYWQgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYSBjaGFuZ2Ugb3IgaWYgdGhlcmVcbiAgLy8gaXMgYSBuZXcgcmVmIHdlIG1hcmsgdGhpcyBhcyBhbiB1cGRhdGUuXG4gIGlmICh1cGRhdGVQYXlsb2FkICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZShmaWJlcikge1xuICBpZiAoIXN1cHBvcnRzSHlkcmF0aW9uKSB7XG4gICAgaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgcHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2UoKSB0byBuZXZlciBiZSBjYWxsZWQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICB2YXIgdGV4dEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICB2YXIgdGV4dENvbnRlbnQgPSBmaWJlci5tZW1vaXplZFByb3BzO1xuICB2YXIgc2hvdWxkVXBkYXRlID0gaHlkcmF0ZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UsIHRleHRDb250ZW50LCBmaWJlcik7XG4gIHtcbiAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICAvLyBXZSBhc3N1bWUgdGhhdCBwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZSBpcyBjYWxsZWQgaW4gYSBjb250ZXh0IHdoZXJlIHRoZVxuICAgICAgLy8gaHlkcmF0aW9uIHBhcmVudCBpcyB0aGUgcGFyZW50IGhvc3QgY29tcG9uZW50IG9mIHRoaXMgaG9zdCB0ZXh0LlxuICAgICAgdmFyIHJldHVybkZpYmVyID0gaHlkcmF0aW9uUGFyZW50RmliZXI7XG4gICAgICBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgcGFyZW50Q29udGFpbmVyID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICAgIGRpZE5vdE1hdGNoSHlkcmF0ZWRDb250YWluZXJUZXh0SW5zdGFuY2UocGFyZW50Q29udGFpbmVyLCB0ZXh0SW5zdGFuY2UsIHRleHRDb250ZW50KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgcGFyZW50VHlwZSA9IHJldHVybkZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBwYXJlbnRQcm9wcyA9IHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgZGlkTm90TWF0Y2hIeWRyYXRlZFRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBza2lwUGFzdERlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKGZpYmVyKSB7XG4gIGlmICghc3VwcG9ydHNIeWRyYXRpb24pIHtcbiAgICBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCBza2lwUGFzdERlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKCkgdG8gbmV2ZXIgYmUgY2FsbGVkLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG4gIHZhciBzdXNwZW5zZUluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICAhc3VzcGVuc2VJbnN0YW5jZSA/IGludmFyaWFudChmYWxzZSwgJ0V4cGVjdGVkIHRvIGhhdmUgYSBoeWRyYXRlZCBzdXNwZW5zZSBpbnN0YW5jZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKSA6IHZvaWQgMDtcbiAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlSW5zdGFuY2VBZnRlclN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpIHtcbiAgdmFyIHBhcmVudCA9IGZpYmVyLnJldHVybjtcbiAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCAmJiBwYXJlbnQudGFnICE9PSBIb3N0Q29tcG9uZW50ICYmIHBhcmVudC50YWcgIT09IEhvc3RSb290ICYmIHBhcmVudC50YWcgIT09IERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gIH1cbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBwYXJlbnQ7XG59XG5cbmZ1bmN0aW9uIHBvcEh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG4gIGlmICghc3VwcG9ydHNIeWRyYXRpb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGZpYmVyICE9PSBoeWRyYXRpb25QYXJlbnRGaWJlcikge1xuICAgIC8vIFdlJ3JlIGRlZXBlciB0aGFuIHRoZSBjdXJyZW50IGh5ZHJhdGlvbiBjb250ZXh0LCBpbnNpZGUgYW4gaW5zZXJ0ZWRcbiAgICAvLyB0cmVlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgLy8gSWYgd2UncmUgbm90IGN1cnJlbnRseSBoeWRyYXRpbmcgYnV0IHdlJ3JlIGluIGEgaHlkcmF0aW9uIGNvbnRleHQsIHRoZW5cbiAgICAvLyB3ZSB3ZXJlIGFuIGluc2VydGlvbiBhbmQgbm93IG5lZWQgdG8gcG9wIHVwIHJlZW50ZXIgaHlkcmF0aW9uIG9mIG91clxuICAgIC8vIHNpYmxpbmdzLlxuICAgIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpO1xuICAgIGlzSHlkcmF0aW5nID0gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG5cbiAgLy8gSWYgd2UgaGF2ZSBhbnkgcmVtYWluaW5nIGh5ZHJhdGFibGUgbm9kZXMsIHdlIG5lZWQgdG8gZGVsZXRlIHRoZW0gbm93LlxuICAvLyBXZSBvbmx5IGRvIHRoaXMgZGVlcGVyIHRoYW4gaGVhZCBhbmQgYm9keSBzaW5jZSB0aGV5IHRlbmQgdG8gaGF2ZSByYW5kb21cbiAgLy8gb3RoZXIgbm9kZXMgaW4gdGhlbS4gV2UgYWxzbyBpZ25vcmUgY29tcG9uZW50cyB3aXRoIHB1cmUgdGV4dCBjb250ZW50IGluXG4gIC8vIHNpZGUgb2YgdGhlbS5cbiAgLy8gVE9ETzogQmV0dGVyIGhldXJpc3RpYy5cbiAgaWYgKGZpYmVyLnRhZyAhPT0gSG9zdENvbXBvbmVudCB8fCB0eXBlICE9PSAnaGVhZCcgJiYgdHlwZSAhPT0gJ2JvZHknICYmICFzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBmaWJlci5tZW1vaXplZFByb3BzKSkge1xuICAgIHZhciBuZXh0SW5zdGFuY2UgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlO1xuICAgIHdoaWxlIChuZXh0SW5zdGFuY2UpIHtcbiAgICAgIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShmaWJlciwgbmV4dEluc3RhbmNlKTtcbiAgICAgIG5leHRJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhuZXh0SW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuXG4gIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpO1xuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gaHlkcmF0aW9uUGFyZW50RmliZXIgPyBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoZmliZXIuc3RhdGVOb2RlKSA6IG51bGw7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXNldEh5ZHJhdGlvblN0YXRlKCkge1xuICBpZiAoIXN1cHBvcnRzSHlkcmF0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBudWxsO1xuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbiAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbn1cblxudmFyIFJlYWN0Q3VycmVudE93bmVyJDMgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcblxudmFyIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcblxudmFyIGRpZFdhcm5BYm91dEJhZENsYXNzID0gdm9pZCAwO1xudmFyIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudCA9IHZvaWQgMDtcbnZhciBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50ID0gdm9pZCAwO1xudmFyIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmcyA9IHZvaWQgMDtcbnZhciBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gdm9pZCAwO1xuXG57XG4gIGRpZFdhcm5BYm91dEJhZENsYXNzID0ge307XG4gIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudCA9IHt9O1xuICBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmcyA9IHt9O1xuICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gIGlmIChjdXJyZW50JCQxID09PSBudWxsKSB7XG4gICAgLy8gSWYgdGhpcyBpcyBhIGZyZXNoIG5ldyBjb21wb25lbnQgdGhhdCBoYXNuJ3QgYmVlbiByZW5kZXJlZCB5ZXQsIHdlXG4gICAgLy8gd29uJ3QgdXBkYXRlIGl0cyBjaGlsZCBzZXQgYnkgYXBwbHlpbmcgbWluaW1hbCBzaWRlLWVmZmVjdHMuIEluc3RlYWQsXG4gICAgLy8gd2Ugd2lsbCBhZGQgdGhlbSBhbGwgdG8gdGhlIGNoaWxkIGJlZm9yZSBpdCBnZXRzIHJlbmRlcmVkLiBUaGF0IG1lYW5zXG4gICAgLy8gd2UgY2FuIG9wdGltaXplIHRoaXMgcmVjb25jaWxpYXRpb24gcGFzcyBieSBub3QgdHJhY2tpbmcgc2lkZS1lZmZlY3RzLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbW91bnRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgdGhlIGN1cnJlbnQgY2hpbGQgaXMgdGhlIHNhbWUgYXMgdGhlIHdvcmsgaW4gcHJvZ3Jlc3MsIGl0IG1lYW5zIHRoYXRcbiAgICAvLyB3ZSBoYXZlbid0IHlldCBzdGFydGVkIGFueSB3b3JrIG9uIHRoZXNlIGNoaWxkcmVuLiBUaGVyZWZvcmUsIHdlIHVzZVxuICAgIC8vIHRoZSBjbG9uZSBhbGdvcml0aG0gdG8gY3JlYXRlIGEgY29weSBvZiBhbGwgdGhlIGN1cnJlbnQgY2hpbGRyZW4uXG5cbiAgICAvLyBJZiB3ZSBoYWQgYW55IHByb2dyZXNzZWQgd29yayBhbHJlYWR5LCB0aGF0IGlzIGludmFsaWQgYXQgdGhpcyBwb2ludCBzb1xuICAgIC8vIGxldCdzIHRocm93IGl0IG91dC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50JCQxLmNoaWxkLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JjZVVubW91bnRDdXJyZW50QW5kUmVjb25jaWxlKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgZm9yayBvZiByZWNvbmNpbGVDaGlsZHJlbi4gSXQncyB1c2VkIGluIGNhc2VzIHdoZXJlIHdlXG4gIC8vIHdhbnQgdG8gcmVjb25jaWxlIHdpdGhvdXQgbWF0Y2hpbmcgYWdhaW5zdCB0aGUgZXhpc3Rpbmcgc2V0LiBUaGlzIGhhcyB0aGVcbiAgLy8gZWZmZWN0IG9mIGFsbCBjdXJyZW50IGNoaWxkcmVuIGJlaW5nIHVubW91bnRlZDsgZXZlbiBpZiB0aGUgdHlwZSBhbmQga2V5XG4gIC8vIGFyZSB0aGUgc2FtZSwgdGhlIG9sZCBjaGlsZCBpcyB1bm1vdW50ZWQgYW5kIGEgbmV3IGNoaWxkIGlzIGNyZWF0ZWQuXG4gIC8vXG4gIC8vIFRvIGRvIHRoaXMsIHdlJ3JlIGdvaW5nIHRvIGdvIHRocm91Z2ggdGhlIHJlY29uY2lsZSBhbGdvcml0aG0gdHdpY2UuIEluXG4gIC8vIHRoZSBmaXJzdCBwYXNzLCB3ZSBzY2hlZHVsZSBhIGRlbGV0aW9uIGZvciBhbGwgdGhlIGN1cnJlbnQgY2hpbGRyZW4gYnlcbiAgLy8gcGFzc2luZyBudWxsLlxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50JCQxLmNoaWxkLCBudWxsLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIC8vIEluIHRoZSBzZWNvbmQgcGFzcywgd2UgbW91bnQgdGhlIG5ldyBjaGlsZHJlbi4gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZVxuICAvLyBwYXNzIG51bGwgaW4gcGxhY2Ugb2Ygd2hlcmUgd2UgdXN1YWxseSBwYXNzIHRoZSBjdXJyZW50IGNoaWxkIHNldC4gVGhpcyBoYXNcbiAgLy8gdGhlIGVmZmVjdCBvZiByZW1vdW50aW5nIGFsbCBjaGlsZHJlbiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlaXIgdGhlaXJcbiAgLy8gaWRlbnRpdHkgbWF0Y2hlcy5cbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZvcndhcmRSZWYoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAvLyBUT0RPOiBjdXJyZW50IGNhbiBiZSBub24tbnVsbCBoZXJlIGV2ZW4gaWYgdGhlIGNvbXBvbmVudFxuICAvLyBoYXNuJ3QgeWV0IG1vdW50ZWQuIFRoaXMgaGFwcGVucyBhZnRlciB0aGUgZmlyc3QgcmVuZGVyIHN1c3BlbmRzLlxuICAvLyBXZSdsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBmaW5lIG9yIGNhbiBjYXVzZSBpc3N1ZXMuXG5cbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCksIGdldEN1cnJlbnRGaWJlclN0YWNrSW5EZXYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciByZW5kZXIgPSBDb21wb25lbnQucmVuZGVyO1xuICB2YXIgcmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuXG4gIC8vIFRoZSByZXN0IGlzIGEgZm9yayBvZiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudFxuICB2YXIgbmV4dENoaWxkcmVuID0gdm9pZCAwO1xuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICB7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMy5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgc2V0Q3VycmVudFBoYXNlKCdyZW5kZXInKTtcbiAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlciwgbmV4dFByb3BzLCByZWYsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICBpZiAoZGVidWdSZW5kZXJQaGFzZVNpZGVFZmZlY3RzIHx8IGRlYnVnUmVuZGVyUGhhc2VTaWRlRWZmZWN0c0ZvclN0cmljdE1vZGUgJiYgd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdE1vZGUpIHtcbiAgICAgIC8vIE9ubHkgZG91YmxlLXJlbmRlciBjb21wb25lbnRzIHdpdGggSG9va3NcbiAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyLCBuZXh0UHJvcHMsIHJlZiwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBzZXRDdXJyZW50UGhhc2UobnVsbCk7XG4gIH1cblxuICBpZiAoY3VycmVudCQkMSAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIH1cblxuICAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG4gIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTWVtb0NvbXBvbmVudChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHVwZGF0ZUV4cGlyYXRpb25UaW1lLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICBpZiAoY3VycmVudCQkMSA9PT0gbnVsbCkge1xuICAgIHZhciB0eXBlID0gQ29tcG9uZW50LnR5cGU7XG4gICAgaWYgKGlzU2ltcGxlRnVuY3Rpb25Db21wb25lbnQodHlwZSkgJiYgQ29tcG9uZW50LmNvbXBhcmUgPT09IG51bGwgJiZcbiAgICAvLyBTaW1wbGVNZW1vQ29tcG9uZW50IGNvZGVwYXRoIGRvZXNuJ3QgcmVzb2x2ZSBvdXRlciBwcm9wcyBlaXRoZXIuXG4gICAgQ29tcG9uZW50LmRlZmF1bHRQcm9wcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBJZiB0aGlzIGlzIGEgcGxhaW4gZnVuY3Rpb24gY29tcG9uZW50IHdpdGhvdXQgZGVmYXVsdCBwcm9wcyxcbiAgICAgIC8vIGFuZCB3aXRoIG9ubHkgdGhlIGRlZmF1bHQgc2hhbGxvdyBjb21wYXJpc29uLCB3ZSB1cGdyYWRlIGl0XG4gICAgICAvLyB0byBhIFNpbXBsZU1lbW9Db21wb25lbnQgdG8gYWxsb3cgZmFzdCBwYXRoIHVwZGF0ZXMuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBTaW1wbGVNZW1vQ29tcG9uZW50O1xuICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHR5cGU7XG4gICAgICB7XG4gICAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgdHlwZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgbmV4dFByb3BzLCB1cGRhdGVFeHBpcmF0aW9uVGltZSwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIH1cbiAgICB7XG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICAvLyBJbm5lciBtZW1vIGNvbXBvbmVudCBwcm9wcyBhcmVuJ3QgY3VycmVudGx5IHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50LlxuICAgICAgICAvLyBXZSBjb3VsZCBtb3ZlIGl0IHRoZXJlLCBidXQgd2UnZCBzdGlsbCBuZWVkIHRoaXMgZm9yIGxhenkgY29kZSBwYXRoLlxuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUodHlwZSksIGdldEN1cnJlbnRGaWJlclN0YWNrSW5EZXYpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgY2hpbGQgPSBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMoQ29tcG9uZW50LnR5cGUsIG51bGwsIG5leHRQcm9wcywgbnVsbCwgd29ya0luUHJvZ3Jlc3MubW9kZSwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIGNoaWxkLnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgICBjaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGNoaWxkO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuICB7XG4gICAgdmFyIF90eXBlID0gQ29tcG9uZW50LnR5cGU7XG4gICAgdmFyIF9pbm5lclByb3BUeXBlcyA9IF90eXBlLnByb3BUeXBlcztcbiAgICBpZiAoX2lubmVyUHJvcFR5cGVzKSB7XG4gICAgICAvLyBJbm5lciBtZW1vIGNvbXBvbmVudCBwcm9wcyBhcmVuJ3QgY3VycmVudGx5IHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50LlxuICAgICAgLy8gV2UgY291bGQgbW92ZSBpdCB0aGVyZSwgYnV0IHdlJ2Qgc3RpbGwgbmVlZCB0aGlzIGZvciBsYXp5IGNvZGUgcGF0aC5cbiAgICAgIGNoZWNrUHJvcFR5cGVzKF9pbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lKF90eXBlKSwgZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldik7XG4gICAgfVxuICB9XG4gIHZhciBjdXJyZW50Q2hpbGQgPSBjdXJyZW50JCQxLmNoaWxkOyAvLyBUaGlzIGlzIGFsd2F5cyBleGFjdGx5IG9uZSBjaGlsZFxuICBpZiAodXBkYXRlRXhwaXJhdGlvblRpbWUgPCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAgIC8vIFRoaXMgd2lsbCBiZSB0aGUgcHJvcHMgd2l0aCByZXNvbHZlZCBkZWZhdWx0UHJvcHMsXG4gICAgLy8gdW5saWtlIGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB3aGljaCB3aWxsIGJlIHRoZSB1bnJlc29sdmVkIG9uZXMuXG4gICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnRDaGlsZC5tZW1vaXplZFByb3BzO1xuICAgIC8vIERlZmF1bHQgdG8gc2hhbGxvdyBjb21wYXJpc29uXG4gICAgdmFyIGNvbXBhcmUgPSBDb21wb25lbnQuY29tcGFyZTtcbiAgICBjb21wYXJlID0gY29tcGFyZSAhPT0gbnVsbCA/IGNvbXBhcmUgOiBzaGFsbG93RXF1YWw7XG4gICAgaWYgKGNvbXBhcmUocHJldlByb3BzLCBuZXh0UHJvcHMpICYmIGN1cnJlbnQkJDEucmVmID09PSB3b3JrSW5Qcm9ncmVzcy5yZWYpIHtcbiAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgfVxuICB9XG4gIC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cbiAgd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnIHw9IFBlcmZvcm1lZFdvcms7XG4gIHZhciBuZXdDaGlsZCA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRDaGlsZCwgbmV4dFByb3BzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIG5ld0NoaWxkLnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgbmV3Q2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV3Q2hpbGQ7XG4gIHJldHVybiBuZXdDaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHVwZGF0ZUV4cGlyYXRpb25UaW1lLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAvLyBUT0RPOiBjdXJyZW50IGNhbiBiZSBub24tbnVsbCBoZXJlIGV2ZW4gaWYgdGhlIGNvbXBvbmVudFxuICAvLyBoYXNuJ3QgeWV0IG1vdW50ZWQuIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBpbm5lciByZW5kZXIgc3VzcGVuZHMuXG4gIC8vIFdlJ2xsIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIGlzIGZpbmUgb3IgY2FuIGNhdXNlIGlzc3Vlcy5cblxuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIG91dGVyTWVtb1R5cGUgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZTtcbiAgICAgIGlmIChvdXRlck1lbW9UeXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgLy8gV2Ugd2FybiB3aGVuIHlvdSBkZWZpbmUgcHJvcFR5cGVzIG9uIGxhenkoKVxuICAgICAgICAvLyBzbyBsZXQncyBqdXN0IHNraXAgb3ZlciBpdCB0byBmaW5kIG1lbW8oKSBvdXRlciB3cmFwcGVyLlxuICAgICAgICAvLyBJbm5lciBwcm9wcyBmb3IgbWVtbyBhcmUgdmFsaWRhdGVkIGxhdGVyLlxuICAgICAgICBvdXRlck1lbW9UeXBlID0gcmVmaW5lUmVzb2x2ZWRMYXp5Q29tcG9uZW50KG91dGVyTWVtb1R5cGUpO1xuICAgICAgfVxuICAgICAgdmFyIG91dGVyUHJvcFR5cGVzID0gb3V0ZXJNZW1vVHlwZSAmJiBvdXRlck1lbW9UeXBlLnByb3BUeXBlcztcbiAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCAoU2ltcGxlTWVtb0NvbXBvbmVudCBoYXMgbm8gZGVmYXVsdFByb3BzKVxuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUob3V0ZXJNZW1vVHlwZSksIGdldEN1cnJlbnRGaWJlclN0YWNrSW5EZXYpO1xuICAgICAgfVxuICAgICAgLy8gSW5uZXIgcHJvcFR5cGVzIHdpbGwgYmUgdmFsaWRhdGVkIGluIHRoZSBmdW5jdGlvbiBjb21wb25lbnQgcGF0aC5cbiAgICB9XG4gIH1cbiAgaWYgKGN1cnJlbnQkJDEgIT09IG51bGwpIHtcbiAgICB2YXIgcHJldlByb3BzID0gY3VycmVudCQkMS5tZW1vaXplZFByb3BzO1xuICAgIGlmIChzaGFsbG93RXF1YWwocHJldlByb3BzLCBuZXh0UHJvcHMpICYmIGN1cnJlbnQkJDEucmVmID09PSB3b3JrSW5Qcm9ncmVzcy5yZWYpIHtcbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbiAgICAgIGlmICh1cGRhdGVFeHBpcmF0aW9uVGltZSA8IHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRnJhZ21lbnQoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNb2RlKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUHJvZmlsZXIoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gIGlmIChlbmFibGVQcm9maWxlclRpbWVyKSB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnIHw9IFVwZGF0ZTtcbiAgfVxuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gbWFya1JlZihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcykge1xuICB2YXIgcmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuICBpZiAoY3VycmVudCQkMSA9PT0gbnVsbCAmJiByZWYgIT09IG51bGwgfHwgY3VycmVudCQkMSAhPT0gbnVsbCAmJiBjdXJyZW50JCQxLnJlZiAhPT0gcmVmKSB7XG4gICAgLy8gU2NoZWR1bGUgYSBSZWYgZWZmZWN0XG4gICAgd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnIHw9IFJlZjtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuICAgICAgaWYgKGlubmVyUHJvcFR5cGVzKSB7XG4gICAgICAgIGNoZWNrUHJvcFR5cGVzKGlubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQpLCBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHRydWUpO1xuICB2YXIgY29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCk7XG5cbiAgdmFyIG5leHRDaGlsZHJlbiA9IHZvaWQgMDtcbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDMuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldEN1cnJlbnRQaGFzZSgncmVuZGVyJyk7XG4gICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgY29udGV4dCwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIGlmIChkZWJ1Z1JlbmRlclBoYXNlU2lkZUVmZmVjdHMgfHwgZGVidWdSZW5kZXJQaGFzZVNpZGVFZmZlY3RzRm9yU3RyaWN0TW9kZSAmJiB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgLy8gT25seSBkb3VibGUtcmVuZGVyIGNvbXBvbmVudHMgd2l0aCBIb29rc1xuICAgICAgaWYgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgY29udGV4dCwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBzZXRDdXJyZW50UGhhc2UobnVsbCk7XG4gIH1cblxuICBpZiAoY3VycmVudCQkMSAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIH1cblxuICAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG4gIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ2xhc3NDb21wb25lbnQoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlcztcbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50KSwgZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgLy8gRHVyaW5nIG1vdW50aW5nIHdlIGRvbid0IGtub3cgdGhlIGNoaWxkIGNvbnRleHQgeWV0IGFzIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGV4aXN0LlxuICAvLyBXZSB3aWxsIGludmFsaWRhdGUgdGhlIGNoaWxkIGNvbnRleHQgaW4gZmluaXNoQ2xhc3NDb21wb25lbnQoKSByaWdodCBhZnRlciByZW5kZXJpbmcuXG4gIHZhciBoYXNDb250ZXh0ID0gdm9pZCAwO1xuICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICB9IGVsc2Uge1xuICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgfVxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuXG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgdmFyIHNob3VsZFVwZGF0ZSA9IHZvaWQgMDtcbiAgaWYgKGluc3RhbmNlID09PSBudWxsKSB7XG4gICAgaWYgKGN1cnJlbnQkJDEgIT09IG51bGwpIHtcbiAgICAgIC8vIEFuIGNsYXNzIGNvbXBvbmVudCB3aXRob3V0IGFuIGluc3RhbmNlIG9ubHkgbW91bnRzIGlmIGl0IHN1c3BlbmRlZFxuICAgICAgLy8gaW5zaWRlIGEgbm9uLSBjb25jdXJyZW50IHRyZWUsIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gV2Ugd2FudCB0b1xuICAgICAgLy8gdHJlZSBpdCBsaWtlIGEgbmV3IG1vdW50LCBldmVuIHRob3VnaCBhbiBlbXB0eSB2ZXJzaW9uIG9mIGl0IGFscmVhZHlcbiAgICAgIC8vIGNvbW1pdHRlZC4gRGlzY29ubmVjdCB0aGUgYWx0ZXJuYXRlIHBvaW50ZXJzLlxuICAgICAgY3VycmVudCQkMS5hbHRlcm5hdGUgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICAgIC8vIFNpbmNlIHRoaXMgaXMgY29uY2VwdHVhbGx5IGEgbmV3IGZpYmVyLCBzY2hlZHVsZSBhIFBsYWNlbWVudCBlZmZlY3RcbiAgICAgIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBQbGFjZW1lbnQ7XG4gICAgfVxuICAgIC8vIEluIHRoZSBpbml0aWFsIHBhc3Mgd2UgbWlnaHQgbmVlZCB0byBjb25zdHJ1Y3QgdGhlIGluc3RhbmNlLlxuICAgIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIHNob3VsZFVwZGF0ZSA9IHRydWU7XG4gIH0gZWxzZSBpZiAoY3VycmVudCQkMSA9PT0gbnVsbCkge1xuICAgIC8vIEluIGEgcmVzdW1lLCB3ZSdsbCBhbHJlYWR5IGhhdmUgYW4gaW5zdGFuY2Ugd2UgY2FuIHJldXNlLlxuICAgIHNob3VsZFVwZGF0ZSA9IHJlc3VtZU1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgfSBlbHNlIHtcbiAgICBzaG91bGRVcGRhdGUgPSB1cGRhdGVDbGFzc0luc3RhbmNlKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICB9XG4gIHZhciBuZXh0VW5pdE9mV29yayA9IGZpbmlzaENsYXNzQ29tcG9uZW50KGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHNob3VsZFVwZGF0ZSwgaGFzQ29udGV4dCwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICB7XG4gICAgdmFyIGluc3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgaWYgKGluc3QucHJvcHMgIT09IG5leHRQcm9wcykge1xuICAgICAgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMgPyB3YXJuaW5nJDEoZmFsc2UsICdJdCBsb29rcyBsaWtlICVzIGlzIHJlYXNzaWduaW5nIGl0cyBvd24gYHRoaXMucHJvcHNgIHdoaWxlIHJlbmRlcmluZy4gJyArICdUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGNhbiBsZWFkIHRvIGNvbmZ1c2luZyBidWdzLicsIGdldENvbXBvbmVudE5hbWUod29ya0luUHJvZ3Jlc3MudHlwZSkgfHwgJ2EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5leHRVbml0T2ZXb3JrO1xufVxuXG5mdW5jdGlvbiBmaW5pc2hDbGFzc0NvbXBvbmVudChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBzaG91bGRVcGRhdGUsIGhhc0NvbnRleHQsIHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gIC8vIFJlZnMgc2hvdWxkIHVwZGF0ZSBldmVuIGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5zIGZhbHNlXG4gIG1hcmtSZWYoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gIHZhciBkaWRDYXB0dXJlRXJyb3IgPSAod29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnICYgRGlkQ2FwdHVyZSkgIT09IE5vRWZmZWN0O1xuXG4gIGlmICghc2hvdWxkVXBkYXRlICYmICFkaWRDYXB0dXJlRXJyb3IpIHtcbiAgICAvLyBDb250ZXh0IHByb3ZpZGVycyBzaG91bGQgZGVmZXIgdG8gc0NVIGZvciByZW5kZXJpbmdcbiAgICBpZiAoaGFzQ29udGV4dCkge1xuICAgICAgaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAvLyBSZXJlbmRlclxuICBSZWFjdEN1cnJlbnRPd25lciQzLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IHZvaWQgMDtcbiAgaWYgKGRpZENhcHR1cmVFcnJvciAmJiB0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIElmIHdlIGNhcHR1cmVkIGFuIGVycm9yLCBidXQgZ2V0RGVyaXZlZFN0YXRlRnJvbSBjYXRjaCBpcyBub3QgZGVmaW5lZCxcbiAgICAvLyB1bm1vdW50IGFsbCB0aGUgY2hpbGRyZW4uIGNvbXBvbmVudERpZENhdGNoIHdpbGwgc2NoZWR1bGUgYW4gdXBkYXRlIHRvXG4gICAgLy8gcmUtcmVuZGVyIGEgZmFsbGJhY2suIFRoaXMgaXMgdGVtcG9yYXJ5IHVudGlsIHdlIG1pZ3JhdGUgZXZlcnlvbmUgdG9cbiAgICAvLyB0aGUgbmV3IEFQSS5cbiAgICAvLyBUT0RPOiBXYXJuIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gICAgbmV4dENoaWxkcmVuID0gbnVsbDtcblxuICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyKSB7XG4gICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIHNldEN1cnJlbnRQaGFzZSgncmVuZGVyJyk7XG4gICAgICBuZXh0Q2hpbGRyZW4gPSBpbnN0YW5jZS5yZW5kZXIoKTtcbiAgICAgIGlmIChkZWJ1Z1JlbmRlclBoYXNlU2lkZUVmZmVjdHMgfHwgZGVidWdSZW5kZXJQaGFzZVNpZGVFZmZlY3RzRm9yU3RyaWN0TW9kZSAmJiB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgICBpbnN0YW5jZS5yZW5kZXIoKTtcbiAgICAgIH1cbiAgICAgIHNldEN1cnJlbnRQaGFzZShudWxsKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG4gIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBQZXJmb3JtZWRXb3JrO1xuICBpZiAoY3VycmVudCQkMSAhPT0gbnVsbCAmJiBkaWRDYXB0dXJlRXJyb3IpIHtcbiAgICAvLyBJZiB3ZSdyZSByZWNvdmVyaW5nIGZyb20gYW4gZXJyb3IsIHJlY29uY2lsZSB3aXRob3V0IHJldXNpbmcgYW55IG9mXG4gICAgLy8gdGhlIGV4aXN0aW5nIGNoaWxkcmVuLiBDb25jZXB0dWFsbHksIHRoZSBub3JtYWwgY2hpbGRyZW4gYW5kIHRoZSBjaGlsZHJlblxuICAgIC8vIHRoYXQgYXJlIHNob3duIG9uIGVycm9yIGFyZSB0d28gZGlmZmVyZW50IHNldHMsIHNvIHdlIHNob3VsZG4ndCByZXVzZVxuICAgIC8vIG5vcm1hbCBjaGlsZHJlbiBldmVuIGlmIHRoZWlyIGlkZW50aXRpZXMgbWF0Y2guXG4gICAgZm9yY2VVbm1vdW50Q3VycmVudEFuZFJlY29uY2lsZShjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIH0gZWxzZSB7XG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICB9XG5cbiAgLy8gTWVtb2l6ZSBzdGF0ZSB1c2luZyB0aGUgdmFsdWVzIHdlIGp1c3QgdXNlZCB0byByZW5kZXIuXG4gIC8vIFRPRE86IFJlc3RydWN0dXJlIHNvIHdlIG5ldmVyIHJlYWQgdmFsdWVzIGZyb20gdGhlIGluc3RhbmNlLlxuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG5cbiAgLy8gVGhlIGNvbnRleHQgbWlnaHQgaGF2ZSBjaGFuZ2VkIHNvIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgaXQuXG4gIGlmIChoYXNDb250ZXh0KSB7XG4gICAgaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcykge1xuICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgaWYgKHJvb3QucGVuZGluZ0NvbnRleHQpIHtcbiAgICBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzLCByb290LnBlbmRpbmdDb250ZXh0LCByb290LnBlbmRpbmdDb250ZXh0ICE9PSByb290LmNvbnRleHQpO1xuICB9IGVsc2UgaWYgKHJvb3QuY29udGV4dCkge1xuICAgIC8vIFNob3VsZCBhbHdheXMgYmUgc2V0XG4gICAgcHVzaFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcywgcm9vdC5jb250ZXh0LCBmYWxzZSk7XG4gIH1cbiAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHJvb3QuY29udGFpbmVySW5mbyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvc3RSb290KGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICBwdXNoSG9zdFJvb3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG4gICEodXBkYXRlUXVldWUgIT09IG51bGwpID8gaW52YXJpYW50KGZhbHNlLCAnSWYgdGhlIHJvb3QgZG9lcyBub3QgaGF2ZSBhbiB1cGRhdGVRdWV1ZSwgd2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBiYWlsZWQgb3V0LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpIDogdm9pZCAwO1xuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgcHJldlN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHByZXZDaGlsZHJlbiA9IHByZXZTdGF0ZSAhPT0gbnVsbCA/IHByZXZTdGF0ZS5lbGVtZW50IDogbnVsbDtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCB1cGRhdGVRdWV1ZSwgbmV4dFByb3BzLCBudWxsLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAvLyBDYXV0aW9uOiBSZWFjdCBEZXZUb29scyBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByb3BlcnR5XG4gIC8vIGJlaW5nIGNhbGxlZCBcImVsZW1lbnRcIi5cbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRTdGF0ZS5lbGVtZW50O1xuICBpZiAobmV4dENoaWxkcmVuID09PSBwcmV2Q2hpbGRyZW4pIHtcbiAgICAvLyBJZiB0aGUgc3RhdGUgaXMgdGhlIHNhbWUgYXMgYmVmb3JlLCB0aGF0J3MgYSBiYWlsb3V0IGJlY2F1c2Ugd2UgaGFkXG4gICAgLy8gbm8gd29yayB0aGF0IGV4cGlyZXMgYXQgdGhpcyB0aW1lLlxuICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICB9XG4gIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICBpZiAoKGN1cnJlbnQkJDEgPT09IG51bGwgfHwgY3VycmVudCQkMS5jaGlsZCA9PT0gbnVsbCkgJiYgcm9vdC5oeWRyYXRlICYmIGVudGVySHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgY3VycmVudCBjaGlsZHJlbiB0aGlzIG1pZ2h0IGJlIHRoZSBmaXJzdCBwYXNzLlxuICAgIC8vIFdlIGFsd2F5cyB0cnkgdG8gaHlkcmF0ZS4gSWYgdGhpcyBpc24ndCBhIGh5ZHJhdGlvbiBwYXNzIHRoZXJlIHdvbid0XG4gICAgLy8gYmUgYW55IGNoaWxkcmVuIHRvIGh5ZHJhdGUgd2hpY2ggaXMgZWZmZWN0aXZlbHkgdGhlIHNhbWUgdGhpbmcgYXNcbiAgICAvLyBub3QgaHlkcmF0aW5nLlxuXG4gICAgLy8gVGhpcyBpcyBhIGJpdCBvZiBhIGhhY2suIFdlIHRyYWNrIHRoZSBob3N0IHJvb3QgYXMgYSBwbGFjZW1lbnQgdG9cbiAgICAvLyBrbm93IHRoYXQgd2UncmUgY3VycmVudGx5IGluIGEgbW91bnRpbmcgc3RhdGUuIFRoYXQgd2F5IGlzTW91bnRlZFxuICAgIC8vIHdvcmtzIGFzIGV4cGVjdGVkLiBXZSBtdXN0IHJlc2V0IHRoaXMgYmVmb3JlIGNvbW1pdHRpbmcuXG4gICAgLy8gVE9ETzogRGVsZXRlIHRoaXMgd2hlbiB3ZSBkZWxldGUgaXNNb3VudGVkIGFuZCBmaW5kRE9NTm9kZS5cbiAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gUGxhY2VtZW50O1xuXG4gICAgLy8gRW5zdXJlIHRoYXQgY2hpbGRyZW4gbW91bnQgaW50byB0aGlzIHJvb3Qgd2l0aG91dCB0cmFja2luZ1xuICAgIC8vIHNpZGUtZWZmZWN0cy4gVGhpcyBlbnN1cmVzIHRoYXQgd2UgZG9uJ3Qgc3RvcmUgUGxhY2VtZW50IGVmZmVjdHMgb25cbiAgICAvLyBub2RlcyB0aGF0IHdpbGwgYmUgaHlkcmF0ZWQuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBtb3VudENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2UgcmVzZXQgaHlkcmF0aW9uIHN0YXRlIGluIGNhc2Ugd2UgYWJvcnRlZCBhbmQgcmVzdW1lZCBhbm90aGVyXG4gICAgLy8gcm9vdC5cbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICB9XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdENvbXBvbmVudChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgcHVzaEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBpZiAoY3VycmVudCQkMSA9PT0gbnVsbCkge1xuICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQkJDEgIT09IG51bGwgPyBjdXJyZW50JCQxLm1lbW9pemVkUHJvcHMgOiBudWxsO1xuXG4gIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHZhciBpc0RpcmVjdFRleHRDaGlsZCA9IHNob3VsZFNldFRleHRDb250ZW50KHR5cGUsIG5leHRQcm9wcyk7XG5cbiAgaWYgKGlzRGlyZWN0VGV4dENoaWxkKSB7XG4gICAgLy8gV2Ugc3BlY2lhbCBjYXNlIGEgZGlyZWN0IHRleHQgY2hpbGQgb2YgYSBob3N0IG5vZGUuIFRoaXMgaXMgYSBjb21tb25cbiAgICAvLyBjYXNlLiBXZSB3b24ndCBoYW5kbGUgaXQgYXMgYSByZWlmaWVkIGNoaWxkLiBXZSB3aWxsIGluc3RlYWQgaGFuZGxlXG4gICAgLy8gdGhpcyBpbiB0aGUgaG9zdCBlbnZpcm9ubWVudCB0aGF0IGFsc28gaGF2ZSBhY2Nlc3MgdG8gdGhpcyBwcm9wLiBUaGF0XG4gICAgLy8gYXZvaWRzIGFsbG9jYXRpbmcgYW5vdGhlciBIb3N0VGV4dCBmaWJlciBhbmQgdHJhdmVyc2luZyBpdC5cbiAgICBuZXh0Q2hpbGRyZW4gPSBudWxsO1xuICB9IGVsc2UgaWYgKHByZXZQcm9wcyAhPT0gbnVsbCAmJiBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBwcmV2UHJvcHMpKSB7XG4gICAgLy8gSWYgd2UncmUgc3dpdGNoaW5nIGZyb20gYSBkaXJlY3QgdGV4dCBjaGlsZCB0byBhIG5vcm1hbCBjaGlsZCwgb3IgdG9cbiAgICAvLyBlbXB0eSwgd2UgbmVlZCB0byBzY2hlZHVsZSB0aGUgdGV4dCBjb250ZW50IHRvIGJlIHJlc2V0LlxuICAgIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBDb250ZW50UmVzZXQ7XG4gIH1cblxuICBtYXJrUmVmKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzKTtcblxuICAvLyBDaGVjayB0aGUgaG9zdCBjb25maWcgdG8gc2VlIGlmIHRoZSBjaGlsZHJlbiBhcmUgb2Zmc2NyZWVuL2hpZGRlbi5cbiAgaWYgKHJlbmRlckV4cGlyYXRpb25UaW1lICE9PSBOZXZlciAmJiB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUgJiYgc2hvdWxkRGVwcmlvcml0aXplU3VidHJlZSh0eXBlLCBuZXh0UHJvcHMpKSB7XG4gICAgLy8gU2NoZWR1bGUgdGhpcyBmaWJlciB0byByZS1yZW5kZXIgYXQgb2Zmc2NyZWVuIHByaW9yaXR5LiBUaGVuIGJhaWxvdXQuXG4gICAgd29ya0luUHJvZ3Jlc3MuZXhwaXJhdGlvblRpbWUgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZEV4cGlyYXRpb25UaW1lID0gTmV2ZXI7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdFRleHQoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgaWYgKGN1cnJlbnQkJDEgPT09IG51bGwpIHtcbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cbiAgLy8gTm90aGluZyB0byBkbyBoZXJlLiBUaGlzIGlzIHRlcm1pbmFsLiBXZSdsbCBkbyB0aGUgY29tcGxldGlvbiBzdGVwXG4gIC8vIGltbWVkaWF0ZWx5IGFmdGVyLlxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gbW91bnRMYXp5Q29tcG9uZW50KF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgZWxlbWVudFR5cGUsIHVwZGF0ZUV4cGlyYXRpb25UaW1lLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICBpZiAoX2N1cnJlbnQgIT09IG51bGwpIHtcbiAgICAvLyBBbiBsYXp5IGNvbXBvbmVudCBvbmx5IG1vdW50cyBpZiBpdCBzdXNwZW5kZWQgaW5zaWRlIGEgbm9uLVxuICAgIC8vIGNvbmN1cnJlbnQgdHJlZSwgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBXZSB3YW50IHRvIHRyZWF0IGl0IGxpa2VcbiAgICAvLyBhIG5ldyBtb3VudCwgZXZlbiB0aG91Z2ggYW4gZW1wdHkgdmVyc2lvbiBvZiBpdCBhbHJlYWR5IGNvbW1pdHRlZC5cbiAgICAvLyBEaXNjb25uZWN0IHRoZSBhbHRlcm5hdGUgcG9pbnRlcnMuXG4gICAgX2N1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsO1xuICAgIC8vIFNpbmNlIHRoaXMgaXMgY29uY2VwdHVhbGx5IGEgbmV3IGZpYmVyLCBzY2hlZHVsZSBhIFBsYWNlbWVudCBlZmZlY3RcbiAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gUGxhY2VtZW50O1xuICB9XG5cbiAgdmFyIHByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICAvLyBXZSBjYW4ndCBzdGFydCBhIFVzZXIgVGltaW5nIG1lYXN1cmVtZW50IHdpdGggY29ycmVjdCBsYWJlbCB5ZXQuXG4gIC8vIENhbmNlbCBhbmQgcmVzdW1lIHJpZ2h0IGFmdGVyIHdlIGtub3cgdGhlIHRhZy5cbiAgY2FuY2VsV29ya1RpbWVyKHdvcmtJblByb2dyZXNzKTtcbiAgdmFyIENvbXBvbmVudCA9IHJlYWRMYXp5Q29tcG9uZW50VHlwZShlbGVtZW50VHlwZSk7XG4gIC8vIFN0b3JlIHRoZSB1bndyYXBwZWQgY29tcG9uZW50IGluIHRoZSB0eXBlLlxuICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50O1xuICB2YXIgcmVzb2x2ZWRUYWcgPSB3b3JrSW5Qcm9ncmVzcy50YWcgPSByZXNvbHZlTGF6eUNvbXBvbmVudFRhZyhDb21wb25lbnQpO1xuICBzdGFydFdvcmtUaW1lcih3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciByZXNvbHZlZFByb3BzID0gcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIHByb3BzKTtcbiAgdmFyIGNoaWxkID0gdm9pZCAwO1xuICBzd2l0Y2ggKHJlc29sdmVkVGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgY2hpbGQgPSB1cGRhdGVDbGFzc0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHtcbiAgICAgICAgY2hpbGQgPSB1cGRhdGVGb3J3YXJkUmVmKG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICB2YXIgb3V0ZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuICAgICAgICAgICAgaWYgKG91dGVyUHJvcFR5cGVzKSB7XG4gICAgICAgICAgICAgIGNoZWNrUHJvcFR5cGVzKG91dGVyUHJvcFR5cGVzLCByZXNvbHZlZFByb3BzLCAvLyBSZXNvbHZlZCBmb3Igb3V0ZXIgb25seVxuICAgICAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50KSwgZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNoaWxkID0gdXBkYXRlTWVtb0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudC50eXBlLCByZXNvbHZlZFByb3BzKSwgLy8gVGhlIGlubmVyIHR5cGUgY2FuIGhhdmUgZGVmYXVsdHMgdG9vXG4gICAgICAgIHVwZGF0ZUV4cGlyYXRpb25UaW1lLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHZhciBoaW50ID0gJyc7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoQ29tcG9uZW50ICE9PSBudWxsICYmIHR5cGVvZiBDb21wb25lbnQgPT09ICdvYmplY3QnICYmIENvbXBvbmVudC4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICBoaW50ID0gJyBEaWQgeW91IHdyYXAgYSBjb21wb25lbnQgaW4gUmVhY3QubGF6eSgpIG1vcmUgdGhhbiBvbmNlPyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFRoaXMgbWVzc2FnZSBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgbWVudGlvbiBGb3J3YXJkUmVmIG9yIE1lbW9Db21wb25lbnRcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgZmFjdCB0aGF0IGl0J3MgYSBzZXBhcmF0ZSB0eXBlIG9mIHdvcmsgaXMgYW5cbiAgICAgICAgLy8gaW1wbGVtZW50YXRpb24gZGV0YWlsLlxuICAgICAgICBpbnZhcmlhbnQoZmFsc2UsICdFbGVtZW50IHR5cGUgaXMgaW52YWxpZC4gUmVjZWl2ZWQgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG86ICVzLiBMYXp5IGVsZW1lbnQgdHlwZSBtdXN0IHJlc29sdmUgdG8gYSBjbGFzcyBvciBmdW5jdGlvbi4lcycsIENvbXBvbmVudCwgaGludCk7XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkO1xufVxuXG5mdW5jdGlvbiBtb3VudEluY29tcGxldGVDbGFzc0NvbXBvbmVudChfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICBpZiAoX2N1cnJlbnQgIT09IG51bGwpIHtcbiAgICAvLyBBbiBpbmNvbXBsZXRlIGNvbXBvbmVudCBvbmx5IG1vdW50cyBpZiBpdCBzdXNwZW5kZWQgaW5zaWRlIGEgbm9uLVxuICAgIC8vIGNvbmN1cnJlbnQgdHJlZSwgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBXZSB3YW50IHRvIHRyZWF0IGl0IGxpa2VcbiAgICAvLyBhIG5ldyBtb3VudCwgZXZlbiB0aG91Z2ggYW4gZW1wdHkgdmVyc2lvbiBvZiBpdCBhbHJlYWR5IGNvbW1pdHRlZC5cbiAgICAvLyBEaXNjb25uZWN0IHRoZSBhbHRlcm5hdGUgcG9pbnRlcnMuXG4gICAgX2N1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsO1xuICAgIC8vIFNpbmNlIHRoaXMgaXMgY29uY2VwdHVhbGx5IGEgbmV3IGZpYmVyLCBzY2hlZHVsZSBhIFBsYWNlbWVudCBlZmZlY3RcbiAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gUGxhY2VtZW50O1xuICB9XG5cbiAgLy8gUHJvbW90ZSB0aGUgZmliZXIgdG8gYSBjbGFzcyBhbmQgdHJ5IHJlbmRlcmluZyBhZ2Fpbi5cbiAgd29ya0luUHJvZ3Jlc3MudGFnID0gQ2xhc3NDb21wb25lbnQ7XG5cbiAgLy8gVGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBpcyBhIGZvcmsgb2YgYHVwZGF0ZUNsYXNzQ29tcG9uZW50YFxuXG4gIC8vIFB1c2ggY29udGV4dCBwcm92aWRlcnMgZWFybHkgdG8gcHJldmVudCBjb250ZXh0IHN0YWNrIG1pc21hdGNoZXMuXG4gIC8vIER1cmluZyBtb3VudGluZyB3ZSBkb24ndCBrbm93IHRoZSBjaGlsZCBjb250ZXh0IHlldCBhcyB0aGUgaW5zdGFuY2UgZG9lc24ndCBleGlzdC5cbiAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuICB2YXIgaGFzQ29udGV4dCA9IHZvaWQgMDtcbiAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgfSBlbHNlIHtcbiAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gIH1cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcblxuICBjb25zdHJ1Y3RDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG5cbiAgcmV0dXJuIGZpbmlzaENsYXNzQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHRydWUsIGhhc0NvbnRleHQsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbn1cblxuZnVuY3Rpb24gbW91bnRJbmRldGVybWluYXRlQ29tcG9uZW50KF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICBpZiAoX2N1cnJlbnQgIT09IG51bGwpIHtcbiAgICAvLyBBbiBpbmRldGVybWluYXRlIGNvbXBvbmVudCBvbmx5IG1vdW50cyBpZiBpdCBzdXNwZW5kZWQgaW5zaWRlIGEgbm9uLVxuICAgIC8vIGNvbmN1cnJlbnQgdHJlZSwgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBXZSB3YW50IHRvIHRyZWF0IGl0IGxpa2VcbiAgICAvLyBhIG5ldyBtb3VudCwgZXZlbiB0aG91Z2ggYW4gZW1wdHkgdmVyc2lvbiBvZiBpdCBhbHJlYWR5IGNvbW1pdHRlZC5cbiAgICAvLyBEaXNjb25uZWN0IHRoZSBhbHRlcm5hdGUgcG9pbnRlcnMuXG4gICAgX2N1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsO1xuICAgIC8vIFNpbmNlIHRoaXMgaXMgY29uY2VwdHVhbGx5IGEgbmV3IGZpYmVyLCBzY2hlZHVsZSBhIFBsYWNlbWVudCBlZmZlY3RcbiAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gUGxhY2VtZW50O1xuICB9XG5cbiAgdmFyIHByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIGZhbHNlKTtcbiAgdmFyIGNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG5cbiAgdmFyIHZhbHVlID0gdm9pZCAwO1xuXG4gIHtcbiAgICBpZiAoQ29tcG9uZW50LnByb3RvdHlwZSAmJiB0eXBlb2YgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRCYWRDbGFzc1tjb21wb25lbnROYW1lXSkge1xuICAgICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsIFwiVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBoYXZlIGEgcmVuZGVyIG1ldGhvZCwgYnV0IGRvZXNuJ3QgZXh0ZW5kIFJlYWN0LkNvbXBvbmVudC4gXCIgKyAnVGhpcyBpcyBsaWtlbHkgdG8gY2F1c2UgZXJyb3JzLiBDaGFuZ2UgJXMgdG8gZXh0ZW5kIFJlYWN0LkNvbXBvbmVudCBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICBkaWRXYXJuQWJvdXRCYWRDbGFzc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZyh3b3JrSW5Qcm9ncmVzcywgbnVsbCk7XG4gICAgfVxuXG4gICAgUmVhY3RDdXJyZW50T3duZXIkMy5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgdmFsdWUgPSByZW5kZXJXaXRoSG9va3MobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIGNvbnRleHQsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgfVxuICAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG4gIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBQZXJmb3JtZWRXb3JrO1xuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZS5yZW5kZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUuJCR0eXBlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIFByb2NlZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzIGEgY2xhc3MgaW5zdGFuY2VcbiAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDtcblxuICAgIC8vIFRocm93IG91dCBhbnkgaG9va3MgdGhhdCB3ZXJlIHVzZWQuXG4gICAgcmVzZXRIb29rcygpO1xuXG4gICAgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gICAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuICAgIHZhciBoYXNDb250ZXh0ID0gZmFsc2U7XG4gICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgICAgcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gdmFsdWUuc3RhdGUgIT09IG51bGwgJiYgdmFsdWUuc3RhdGUgIT09IHVuZGVmaW5lZCA/IHZhbHVlLnN0YXRlIDogbnVsbDtcblxuICAgIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIHByb3BzKTtcbiAgICB9XG5cbiAgICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHZhbHVlKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICB9IGVsc2Uge1xuICAgIC8vIFByb2NlZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzIGEgZnVuY3Rpb24gY29tcG9uZW50XG4gICAgd29ya0luUHJvZ3Jlc3MudGFnID0gRnVuY3Rpb25Db21wb25lbnQ7XG4gICAge1xuICAgICAgaWYgKGRlYnVnUmVuZGVyUGhhc2VTaWRlRWZmZWN0cyB8fCBkZWJ1Z1JlbmRlclBoYXNlU2lkZUVmZmVjdHNGb3JTdHJpY3RNb2RlICYmIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICAgIC8vIE9ubHkgZG91YmxlLXJlbmRlciBjb21wb25lbnRzIHdpdGggSG9va3NcbiAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YWx1ZSA9IHJlbmRlcldpdGhIb29rcyhudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgY29udGV4dCwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJlY29uY2lsZUNoaWxkcmVuKG51bGwsIHdvcmtJblByb2dyZXNzLCB2YWx1ZSwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIHtcbiAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KSB7XG4gIGlmIChDb21wb25lbnQpIHtcbiAgICAhIUNvbXBvbmVudC5jaGlsZENvbnRleHRUeXBlcyA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzKC4uLik6IGNoaWxkQ29udGV4dFR5cGVzIGNhbm5vdCBiZSBkZWZpbmVkIG9uIGEgZnVuY3Rpb24gY29tcG9uZW50LicsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JykgOiB2b2lkIDA7XG4gIH1cbiAgaWYgKHdvcmtJblByb2dyZXNzLnJlZiAhPT0gbnVsbCkge1xuICAgIHZhciBpbmZvID0gJyc7XG4gICAgdmFyIG93bmVyTmFtZSA9IGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCk7XG4gICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgaW5mbyArPSAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBvd25lck5hbWUgKyAnYC4nO1xuICAgIH1cblxuICAgIHZhciB3YXJuaW5nS2V5ID0gb3duZXJOYW1lIHx8IHdvcmtJblByb2dyZXNzLl9kZWJ1Z0lEIHx8ICcnO1xuICAgIHZhciBkZWJ1Z1NvdXJjZSA9IHdvcmtJblByb2dyZXNzLl9kZWJ1Z1NvdXJjZTtcbiAgICBpZiAoZGVidWdTb3VyY2UpIHtcbiAgICAgIHdhcm5pbmdLZXkgPSBkZWJ1Z1NvdXJjZS5maWxlTmFtZSArICc6JyArIGRlYnVnU291cmNlLmxpbmVOdW1iZXI7XG4gICAgfVxuICAgIGlmICghZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzW3dhcm5pbmdLZXldKSB7XG4gICAgICBkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnNbd2FybmluZ0tleV0gPSB0cnVlO1xuICAgICAgd2FybmluZyQxKGZhbHNlLCAnRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgYmUgZ2l2ZW4gcmVmcy4gJyArICdBdHRlbXB0cyB0byBhY2Nlc3MgdGhpcyByZWYgd2lsbCBmYWlsLiAnICsgJ0RpZCB5b3UgbWVhbiB0byB1c2UgUmVhY3QuZm9yd2FyZFJlZigpPyVzJywgaW5mbyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgaWYgKCFkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50W2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICclczogRnVuY3Rpb24gY29tcG9uZW50cyBkbyBub3Qgc3VwcG9ydCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuJywgY29tcG9uZW50TmFtZSk7XG4gICAgICBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50W2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIENvbXBvbmVudC5jb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LmNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgdmFyIF9jb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgIGlmICghZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50W19jb21wb25lbnROYW1lXSkge1xuICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgY29udGV4dFR5cGUuJywgX2NvbXBvbmVudE5hbWUpO1xuICAgICAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50W19jb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgLy8gV2Ugc2hvdWxkIGF0dGVtcHQgdG8gcmVuZGVyIHRoZSBwcmltYXJ5IGNoaWxkcmVuIHVubGVzcyB0aGlzIGJvdW5kYXJ5XG4gIC8vIGFscmVhZHkgc3VzcGVuZGVkIGR1cmluZyB0aGlzIHJlbmRlciAoYGFscmVhZHlDYXB0dXJlZGAgaXMgdHJ1ZSkuXG4gIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIHZhciBuZXh0RGlkVGltZW91dCA9IHZvaWQgMDtcbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgJiBEaWRDYXB0dXJlKSA9PT0gTm9FZmZlY3QpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBhdHRlbXB0LlxuICAgIG5leHRTdGF0ZSA9IG51bGw7XG4gICAgbmV4dERpZFRpbWVvdXQgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBTb21ldGhpbmcgaW4gdGhpcyBib3VuZGFyeSdzIHN1YnRyZWUgYWxyZWFkeSBzdXNwZW5kZWQuIFN3aXRjaCB0b1xuICAgIC8vIHJlbmRlcmluZyB0aGUgZmFsbGJhY2sgY2hpbGRyZW4uXG4gICAgbmV4dFN0YXRlID0ge1xuICAgICAgdGltZWRPdXRBdDogbmV4dFN0YXRlICE9PSBudWxsID8gbmV4dFN0YXRlLnRpbWVkT3V0QXQgOiBOb1dvcmtcbiAgICB9O1xuICAgIG5leHREaWRUaW1lb3V0ID0gdHJ1ZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgJj0gfkRpZENhcHR1cmU7XG4gIH1cblxuICAvLyBUaGlzIG5leHQgcGFydCBpcyBhIGJpdCBjb25mdXNpbmcuIElmIHRoZSBjaGlsZHJlbiB0aW1lb3V0LCB3ZSBzd2l0Y2ggdG9cbiAgLy8gc2hvd2luZyB0aGUgZmFsbGJhY2sgY2hpbGRyZW4gaW4gcGxhY2Ugb2YgdGhlIFwicHJpbWFyeVwiIGNoaWxkcmVuLlxuICAvLyBIb3dldmVyLCB3ZSBkb24ndCB3YW50IHRvIGRlbGV0ZSB0aGUgcHJpbWFyeSBjaGlsZHJlbiBiZWNhdXNlIHRoZW4gdGhlaXJcbiAgLy8gc3RhdGUgd2lsbCBiZSBsb3N0IChib3RoIHRoZSBSZWFjdCBzdGF0ZSBhbmQgdGhlIGhvc3Qgc3RhdGUsIGUuZy5cbiAgLy8gdW5jb250cm9sbGVkIGZvcm0gaW5wdXRzKS4gSW5zdGVhZCB3ZSBrZWVwIHRoZW0gbW91bnRlZCBhbmQgaGlkZSB0aGVtLlxuICAvLyBCb3RoIHRoZSBmYWxsYmFjayBjaGlsZHJlbiBBTkQgdGhlIHByaW1hcnkgY2hpbGRyZW4gYXJlIHJlbmRlcmVkIGF0IHRoZVxuICAvLyBzYW1lIHRpbWUuIE9uY2UgdGhlIHByaW1hcnkgY2hpbGRyZW4gYXJlIHVuLXN1c3BlbmRlZCwgd2UgY2FuIGRlbGV0ZVxuICAvLyB0aGUgZmFsbGJhY2sgY2hpbGRyZW4g4oCUIGRvbid0IG5lZWQgdG8gcHJlc2VydmUgdGhlaXIgc3RhdGUuXG4gIC8vXG4gIC8vIFRoZSB0d28gc2V0cyBvZiBjaGlsZHJlbiBhcmUgc2libGluZ3MgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQsIGJ1dFxuICAvLyBzZW1hbnRpY2FsbHksIGZvciBwdXJwb3NlcyBvZiByZWNvbmNpbGlhdGlvbiwgdGhleSBhcmUgdHdvIHNlcGFyYXRlIHNldHMuXG4gIC8vIFNvIHdlIHN0b3JlIHRoZW0gdXNpbmcgdHdvIGZyYWdtZW50IGZpYmVycy5cbiAgLy9cbiAgLy8gSG93ZXZlciwgd2Ugd2FudCB0byBhdm9pZCBhbGxvY2F0aW5nIGV4dHJhIGZpYmVycyBmb3IgZXZlcnkgcGxhY2Vob2xkZXIuXG4gIC8vIFRoZXkncmUgb25seSBuZWNlc3Nhcnkgd2hlbiB0aGUgY2hpbGRyZW4gdGltZSBvdXQsIGJlY2F1c2UgdGhhdCdzIHRoZVxuICAvLyBvbmx5IHRpbWUgd2hlbiBib3RoIHNldHMgYXJlIG1vdW50ZWQuXG4gIC8vXG4gIC8vIFNvLCB0aGUgZXh0cmEgZnJhZ21lbnQgZmliZXJzIGFyZSBvbmx5IHVzZWQgaWYgdGhlIGNoaWxkcmVuIHRpbWUgb3V0LlxuICAvLyBPdGhlcndpc2UsIHdlIHJlbmRlciB0aGUgcHJpbWFyeSBjaGlsZHJlbiBkaXJlY3RseS4gVGhpcyByZXF1aXJlcyBzb21lXG4gIC8vIGN1c3RvbSByZWNvbmNpbGlhdGlvbiBsb2dpYyB0byBwcmVzZXJ2ZSB0aGUgc3RhdGUgb2YgdGhlIHByaW1hcnlcbiAgLy8gY2hpbGRyZW4uIEl0J3MgZXNzZW50aWFsbHkgYSB2ZXJ5IGJhc2ljIGZvcm0gb2YgcmUtcGFyZW50aW5nLlxuXG4gIC8vIGBjaGlsZGAgcG9pbnRzIHRvIHRoZSBjaGlsZCBmaWJlci4gSW4gdGhlIG5vcm1hbCBjYXNlLCB0aGlzIGlzIHRoZSBmaXJzdFxuICAvLyBmaWJlciBvZiB0aGUgcHJpbWFyeSBjaGlsZHJlbiBzZXQuIEluIHRoZSB0aW1lZC1vdXQgY2FzZSwgaXQncyBhXG4gIC8vIGEgZnJhZ21lbnQgZmliZXIgY29udGFpbmluZyB0aGUgcHJpbWFyeSBjaGlsZHJlbi5cbiAgdmFyIGNoaWxkID0gdm9pZCAwO1xuICAvLyBgbmV4dGAgcG9pbnRzIHRvIHRoZSBuZXh0IGZpYmVyIFJlYWN0IHNob3VsZCByZW5kZXIuIEluIHRoZSBub3JtYWwgY2FzZSxcbiAgLy8gaXQncyB0aGUgc2FtZSBhcyBgY2hpbGRgOiB0aGUgZmlyc3QgZmliZXIgb2YgdGhlIHByaW1hcnkgY2hpbGRyZW4gc2V0LlxuICAvLyBJbiB0aGUgdGltZWQtb3V0IGNhc2UsIGl0J3MgYSBmcmFnbWVudCBmaWJlciBjb250YWluaW5nIHRoZSAqZmFsbGJhY2sqXG4gIC8vIGNoaWxkcmVuIC0tIHdlIHNraXAgb3ZlciB0aGUgcHJpbWFyeSBjaGlsZHJlbiBlbnRpcmVseS5cbiAgdmFyIG5leHQgPSB2b2lkIDA7XG4gIGlmIChjdXJyZW50JCQxID09PSBudWxsKSB7XG4gICAgaWYgKGVuYWJsZVN1c3BlbnNlU2VydmVyUmVuZGVyZXIpIHtcbiAgICAgIC8vIElmIHdlJ3JlIGN1cnJlbnRseSBoeWRyYXRpbmcsIHRyeSB0byBoeWRyYXRlIHRoaXMgYm91bmRhcnkuXG4gICAgICAvLyBCdXQgb25seSBpZiB0aGlzIGhhcyBhIGZhbGxiYWNrLlxuICAgICAgaWYgKG5leHRQcm9wcy5mYWxsYmFjayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgLy8gVGhpcyBjb3VsZCd2ZSBjaGFuZ2VkIHRoZSB0YWcgaWYgdGhpcyB3YXMgYSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGNvbXBvbmVudC5cbiAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnRhZyA9PT0gRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZURlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyB0aGUgaW5pdGlhbCBtb3VudC4gVGhpcyBicmFuY2ggaXMgcHJldHR5IHNpbXBsZSBiZWNhdXNlIHRoZXJlJ3NcbiAgICAvLyBubyBwcmV2aW91cyBzdGF0ZSB0aGF0IG5lZWRzIHRvIGJlIHByZXNlcnZlZC5cbiAgICBpZiAobmV4dERpZFRpbWVvdXQpIHtcbiAgICAgIC8vIE1vdW50IHNlcGFyYXRlIGZyYWdtZW50cyBmb3IgcHJpbWFyeSBhbmQgZmFsbGJhY2sgY2hpbGRyZW4uXG4gICAgICB2YXIgbmV4dEZhbGxiYWNrQ2hpbGRyZW4gPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChudWxsLCBtb2RlLCBOb1dvcmssIG51bGwpO1xuXG4gICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vQ29udGV4dCkge1xuICAgICAgICAvLyBPdXRzaWRlIG9mIGNvbmN1cnJlbnQgbW9kZSwgd2UgY29tbWl0IHRoZSBlZmZlY3RzIGZyb20gdGhlXG4gICAgICAgIHZhciBwcm9ncmVzc2VkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICB2YXIgcHJvZ3Jlc3NlZFByaW1hcnlDaGlsZCA9IHByb2dyZXNzZWRTdGF0ZSAhPT0gbnVsbCA/IHdvcmtJblByb2dyZXNzLmNoaWxkLmNoaWxkIDogd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkID0gcHJvZ3Jlc3NlZFByaW1hcnlDaGlsZDtcbiAgICAgIH1cblxuICAgICAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KG5leHRGYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJFeHBpcmF0aW9uVGltZSwgbnVsbCk7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nID0gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICAgICAgY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgICAgIC8vIFNraXAgdGhlIHByaW1hcnkgY2hpbGRyZW4sIGFuZCBjb250aW51ZSB3b3JraW5nIG9uIHRoZVxuICAgICAgLy8gZmFsbGJhY2sgY2hpbGRyZW4uXG4gICAgICBuZXh0ID0gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICAgICAgY2hpbGQucmV0dXJuID0gbmV4dC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTW91bnQgdGhlIHByaW1hcnkgY2hpbGRyZW4gd2l0aG91dCBhbiBpbnRlcm1lZGlhdGUgZnJhZ21lbnQgZmliZXIuXG4gICAgICB2YXIgbmV4dFByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICAgIGNoaWxkID0gbmV4dCA9IG1vdW50Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRQcmltYXJ5Q2hpbGRyZW4sIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhbiB1cGRhdGUuIFRoaXMgYnJhbmNoIGlzIG1vcmUgY29tcGxpY2F0ZWQgYmVjYXVzZSB3ZSBuZWVkIHRvXG4gICAgLy8gZW5zdXJlIHRoZSBzdGF0ZSBvZiB0aGUgcHJpbWFyeSBjaGlsZHJlbiBpcyBwcmVzZXJ2ZWQuXG4gICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQkJDEubWVtb2l6ZWRTdGF0ZTtcbiAgICB2YXIgcHJldkRpZFRpbWVvdXQgPSBwcmV2U3RhdGUgIT09IG51bGw7XG4gICAgaWYgKHByZXZEaWRUaW1lb3V0KSB7XG4gICAgICAvLyBUaGUgY3VycmVudCB0cmVlIGFscmVhZHkgdGltZWQgb3V0LiBUaGF0IG1lYW5zIGVhY2ggY2hpbGQgc2V0IGlzXG4gICAgICB2YXIgY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50ID0gY3VycmVudCQkMS5jaGlsZDtcbiAgICAgIHZhciBjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmc7XG4gICAgICBpZiAobmV4dERpZFRpbWVvdXQpIHtcbiAgICAgICAgLy8gU3RpbGwgdGltZWQgb3V0LiBSZXVzZSB0aGUgY3VycmVudCBwcmltYXJ5IGNoaWxkcmVuIGJ5IGNsb25pbmdcbiAgICAgICAgLy8gaXRzIGZyYWdtZW50LiBXZSdyZSBnb2luZyB0byBza2lwIG92ZXIgdGhlc2UgZW50aXJlbHkuXG4gICAgICAgIHZhciBfbmV4dEZhbGxiYWNrQ2hpbGRyZW4gPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQsIGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5wZW5kaW5nUHJvcHMsIE5vV29yayk7XG5cbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb0NvbnRleHQpIHtcbiAgICAgICAgICAvLyBPdXRzaWRlIG9mIGNvbmN1cnJlbnQgbW9kZSwgd2UgY29tbWl0IHRoZSBlZmZlY3RzIGZyb20gdGhlXG4gICAgICAgICAgdmFyIF9wcm9ncmVzc2VkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBfcHJvZ3Jlc3NlZFByaW1hcnlDaGlsZCA9IF9wcm9ncmVzc2VkU3RhdGUgIT09IG51bGwgPyB3b3JrSW5Qcm9ncmVzcy5jaGlsZC5jaGlsZCA6IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgIGlmIChfcHJvZ3Jlc3NlZFByaW1hcnlDaGlsZCAhPT0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkKSB7XG4gICAgICAgICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQuY2hpbGQgPSBfcHJvZ3Jlc3NlZFByaW1hcnlDaGlsZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZWNhdXNlIHByaW1hcnlDaGlsZEZyYWdtZW50IGlzIGEgbmV3IGZpYmVyIHRoYXQgd2UncmUgaW5zZXJ0aW5nIGFzIHRoZVxuICAgICAgICAvLyBwYXJlbnQgb2YgYSBuZXcgdHJlZSwgd2UgbmVlZCB0byBzZXQgaXRzIHRyZWVCYXNlRHVyYXRpb24uXG4gICAgICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyICYmIHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIC8vIHRyZWVCYXNlRHVyYXRpb24gaXMgdGhlIHN1bSBvZiBhbGwgdGhlIGNoaWxkIHRyZWUgYmFzZSBkdXJhdGlvbnMuXG4gICAgICAgICAgdmFyIHRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICAgICAgICAgIHZhciBoaWRkZW5DaGlsZCA9IF9wcmltYXJ5Q2hpbGRGcmFnbWVudC5jaGlsZDtcbiAgICAgICAgICB3aGlsZSAoaGlkZGVuQ2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRyZWVCYXNlRHVyYXRpb24gKz0gaGlkZGVuQ2hpbGQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgICAgIGhpZGRlbkNoaWxkID0gaGlkZGVuQ2hpbGQuc2libGluZztcbiAgICAgICAgICB9XG4gICAgICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb24gPSB0cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xvbmUgdGhlIGZhbGxiYWNrIGNoaWxkIGZyYWdtZW50LCB0b28uIFRoZXNlIHdlJ2xsIGNvbnRpbnVlXG4gICAgICAgIC8vIHdvcmtpbmcgb24uXG4gICAgICAgIHZhciBfZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gX3ByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50LCBfbmV4dEZhbGxiYWNrQ2hpbGRyZW4sIGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQuZXhwaXJhdGlvblRpbWUpO1xuICAgICAgICBjaGlsZCA9IF9wcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkRXhwaXJhdGlvblRpbWUgPSBOb1dvcms7XG4gICAgICAgIC8vIFNraXAgdGhlIHByaW1hcnkgY2hpbGRyZW4sIGFuZCBjb250aW51ZSB3b3JraW5nIG9uIHRoZVxuICAgICAgICAvLyBmYWxsYmFjayBjaGlsZHJlbi5cbiAgICAgICAgbmV4dCA9IF9mYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gICAgICAgIGNoaWxkLnJldHVybiA9IG5leHQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBObyBsb25nZXIgc3VzcGVuZGVkLiBTd2l0Y2ggYmFjayB0byBzaG93aW5nIHRoZSBwcmltYXJ5IGNoaWxkcmVuLFxuICAgICAgICAvLyBhbmQgcmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGUgZnJhZ21lbnQgZmliZXIuXG4gICAgICAgIHZhciBfbmV4dFByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICAgICAgdmFyIGN1cnJlbnRQcmltYXJ5Q2hpbGQgPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuY2hpbGQ7XG4gICAgICAgIHZhciBwcmltYXJ5Q2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudFByaW1hcnlDaGlsZCwgX25leHRQcmltYXJ5Q2hpbGRyZW4sIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcblxuICAgICAgICAvLyBJZiB0aGlzIHJlbmRlciBkb2Vzbid0IHN1c3BlbmQsIHdlIG5lZWQgdG8gZGVsZXRlIHRoZSBmYWxsYmFja1xuICAgICAgICAvLyBjaGlsZHJlbi4gV2FpdCB1bnRpbCB0aGUgY29tcGxldGUgcGhhc2UsIGFmdGVyIHdlJ3ZlIGNvbmZpcm1lZCB0aGVcbiAgICAgICAgLy8gZmFsbGJhY2sgaXMgbm8gbG9uZ2VyIG5lZWRlZC5cbiAgICAgICAgLy8gVE9ETzogV291bGQgaXQgYmUgYmV0dGVyIHRvIHN0b3JlIHRoZSBmYWxsYmFjayBmcmFnbWVudCBvblxuICAgICAgICAvLyB0aGUgc3RhdGVOb2RlP1xuXG4gICAgICAgIC8vIENvbnRpbnVlIHJlbmRlcmluZyB0aGUgY2hpbGRyZW4sIGxpa2Ugd2Ugbm9ybWFsbHkgZG8uXG4gICAgICAgIGNoaWxkID0gbmV4dCA9IHByaW1hcnlDaGlsZDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIGN1cnJlbnQgdHJlZSBoYXMgbm90IGFscmVhZHkgdGltZWQgb3V0LiBUaGF0IG1lYW5zIHRoZSBwcmltYXJ5XG4gICAgICAvLyBjaGlsZHJlbiBhcmUgbm90IHdyYXBwZWQgaW4gYSBmcmFnbWVudCBmaWJlci5cbiAgICAgIHZhciBfY3VycmVudFByaW1hcnlDaGlsZCA9IGN1cnJlbnQkJDEuY2hpbGQ7XG4gICAgICBpZiAobmV4dERpZFRpbWVvdXQpIHtcbiAgICAgICAgLy8gVGltZWQgb3V0LiBXcmFwIHRoZSBjaGlsZHJlbiBpbiBhIGZyYWdtZW50IGZpYmVyIHRvIGtlZXAgdGhlbVxuICAgICAgICAvLyBzZXBhcmF0ZSBmcm9tIHRoZSBmYWxsYmFjayBjaGlsZHJlbi5cbiAgICAgICAgdmFyIF9uZXh0RmFsbGJhY2tDaGlsZHJlbjIgPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoXG4gICAgICAgIC8vIEl0IHNob3VsZG4ndCBtYXR0ZXIgd2hhdCB0aGUgcGVuZGluZyBwcm9wcyBhcmUgYmVjYXVzZSB3ZSBhcmVuJ3RcbiAgICAgICAgLy8gZ29pbmcgdG8gcmVuZGVyIHRoaXMgZnJhZ21lbnQuXG4gICAgICAgIG51bGwsIG1vZGUsIE5vV29yaywgbnVsbCk7XG4gICAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDIuY2hpbGQgPSBfY3VycmVudFByaW1hcnlDaGlsZDtcblxuICAgICAgICAvLyBFdmVuIHRob3VnaCB3ZSdyZSBjcmVhdGluZyBhIG5ldyBmaWJlciwgdGhlcmUgYXJlIG5vIG5ldyBjaGlsZHJlbixcbiAgICAgICAgLy8gYmVjYXVzZSB3ZSdyZSByZXVzaW5nIGFuIGFscmVhZHkgbW91bnRlZCB0cmVlLiBTbyB3ZSBkb24ndCBuZWVkIHRvXG4gICAgICAgIC8vIHNjaGVkdWxlIGEgcGxhY2VtZW50LlxuICAgICAgICAvLyBwcmltYXJ5Q2hpbGRGcmFnbWVudC5lZmZlY3RUYWcgfD0gUGxhY2VtZW50O1xuXG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICAgICAgLy8gT3V0c2lkZSBvZiBjb25jdXJyZW50IG1vZGUsIHdlIGNvbW1pdCB0aGUgZWZmZWN0cyBmcm9tIHRoZVxuICAgICAgICAgIHZhciBfcHJvZ3Jlc3NlZFN0YXRlMiA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIF9wcm9ncmVzc2VkUHJpbWFyeUNoaWxkMiA9IF9wcm9ncmVzc2VkU3RhdGUyICE9PSBudWxsID8gd29ya0luUHJvZ3Jlc3MuY2hpbGQuY2hpbGQgOiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyLmNoaWxkID0gX3Byb2dyZXNzZWRQcmltYXJ5Q2hpbGQyO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmVjYXVzZSBwcmltYXJ5Q2hpbGRGcmFnbWVudCBpcyBhIG5ldyBmaWJlciB0aGF0IHdlJ3JlIGluc2VydGluZyBhcyB0aGVcbiAgICAgICAgLy8gcGFyZW50IG9mIGEgbmV3IHRyZWUsIHdlIG5lZWQgdG8gc2V0IGl0cyB0cmVlQmFzZUR1cmF0aW9uLlxuICAgICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lciAmJiB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAvLyB0cmVlQmFzZUR1cmF0aW9uIGlzIHRoZSBzdW0gb2YgYWxsIHRoZSBjaGlsZCB0cmVlIGJhc2UgZHVyYXRpb25zLlxuICAgICAgICAgIHZhciBfdHJlZUJhc2VEdXJhdGlvbiA9IDA7XG4gICAgICAgICAgdmFyIF9oaWRkZW5DaGlsZCA9IF9wcmltYXJ5Q2hpbGRGcmFnbWVudDIuY2hpbGQ7XG4gICAgICAgICAgd2hpbGUgKF9oaWRkZW5DaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgX3RyZWVCYXNlRHVyYXRpb24gKz0gX2hpZGRlbkNoaWxkLnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgICAgICBfaGlkZGVuQ2hpbGQgPSBfaGlkZGVuQ2hpbGQuc2libGluZztcbiAgICAgICAgICB9XG4gICAgICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50Mi50cmVlQmFzZUR1cmF0aW9uID0gX3RyZWVCYXNlRHVyYXRpb247XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgYSBmcmFnbWVudCBmcm9tIHRoZSBmYWxsYmFjayBjaGlsZHJlbiwgdG9vLlxuICAgICAgICB2YXIgX2ZhbGxiYWNrQ2hpbGRGcmFnbWVudDIgPSBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyLnNpYmxpbmcgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChfbmV4dEZhbGxiYWNrQ2hpbGRyZW4yLCBtb2RlLCByZW5kZXJFeHBpcmF0aW9uVGltZSwgbnVsbCk7XG4gICAgICAgIF9mYWxsYmFja0NoaWxkRnJhZ21lbnQyLmVmZmVjdFRhZyB8PSBQbGFjZW1lbnQ7XG4gICAgICAgIGNoaWxkID0gX3ByaW1hcnlDaGlsZEZyYWdtZW50MjtcbiAgICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50Mi5jaGlsZEV4cGlyYXRpb25UaW1lID0gTm9Xb3JrO1xuICAgICAgICAvLyBTa2lwIHRoZSBwcmltYXJ5IGNoaWxkcmVuLCBhbmQgY29udGludWUgd29ya2luZyBvbiB0aGVcbiAgICAgICAgLy8gZmFsbGJhY2sgY2hpbGRyZW4uXG4gICAgICAgIG5leHQgPSBfZmFsbGJhY2tDaGlsZEZyYWdtZW50MjtcbiAgICAgICAgY2hpbGQucmV0dXJuID0gbmV4dC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFN0aWxsIGhhdmVuJ3QgdGltZWQgb3V0LiAgQ29udGludWUgcmVuZGVyaW5nIHRoZSBjaGlsZHJlbiwgbGlrZSB3ZVxuICAgICAgICAvLyBub3JtYWxseSBkby5cbiAgICAgICAgdmFyIF9uZXh0UHJpbWFyeUNoaWxkcmVuMiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICAgICAgbmV4dCA9IGNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIF9jdXJyZW50UHJpbWFyeUNoaWxkLCBfbmV4dFByaW1hcnlDaGlsZHJlbjIsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3VycmVudCQkMS5zdGF0ZU5vZGU7XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV4dFN0YXRlO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGNoaWxkO1xuICByZXR1cm4gbmV4dDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICBpZiAoY3VycmVudCQkMSA9PT0gbnVsbCkge1xuICAgIC8vIER1cmluZyB0aGUgZmlyc3QgcGFzcywgd2UnbGwgYmFpbCBvdXQgYW5kIG5vdCBkcmlsbCBpbnRvIHRoZSBjaGlsZHJlbi5cbiAgICAvLyBJbnN0ZWFkLCB3ZSdsbCBsZWF2ZSB0aGUgY29udGVudCBpbiBwbGFjZSBhbmQgdHJ5IHRvIGh5ZHJhdGUgaXQgbGF0ZXIuXG4gICAgd29ya0luUHJvZ3Jlc3MuZXhwaXJhdGlvblRpbWUgPSBOZXZlcjtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBXZSB1c2UgY2hpbGRFeHBpcmF0aW9uVGltZSB0byBpbmRpY2F0ZSB0aGF0IGEgY2hpbGQgbWlnaHQgZGVwZW5kIG9uIGNvbnRleHQsIHNvIGlmXG4gIC8vIGFueSBjb250ZXh0IGhhcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHRyZWF0IGlzIGFzIGlmIHRoZSBpbnB1dCBtaWdodCBoYXZlIGNoYW5nZWQuXG4gIHZhciBoYXNDb250ZXh0Q2hhbmdlZCQkMSA9IGN1cnJlbnQkJDEuY2hpbGRFeHBpcmF0aW9uVGltZSA+PSByZW5kZXJFeHBpcmF0aW9uVGltZTtcbiAgaWYgKGRpZFJlY2VpdmVVcGRhdGUgfHwgaGFzQ29udGV4dENoYW5nZWQkJDEpIHtcbiAgICAvLyBUaGlzIGJvdW5kYXJ5IGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBmaXJzdCByZW5kZXIuIFRoaXMgbWVhbnMgdGhhdCB3ZSBhcmUgbm93IHVuYWJsZSB0b1xuICAgIC8vIGh5ZHJhdGUgaXQuIFdlIG1pZ2h0IHN0aWxsIGJlIGFibGUgdG8gaHlkcmF0ZSBpdCB1c2luZyBhbiBlYXJsaWVyIGV4cGlyYXRpb24gdGltZSBidXRcbiAgICAvLyBkdXJpbmcgdGhpcyByZW5kZXIgd2UgY2FuJ3QuIEluc3RlYWQsIHdlJ3JlIGdvaW5nIHRvIGRlbGV0ZSB0aGUgd2hvbGUgc3VidHJlZSBhbmRcbiAgICAvLyBpbnN0ZWFkIGluamVjdCBhIG5ldyByZWFsIFN1c3BlbnNlIGJvdW5kYXJ5IHRvIHRha2UgaXRzIHBsYWNlLCB3aGljaCBtYXkgcmVuZGVyIGNvbnRlbnRcbiAgICAvLyBvciBmYWxsYmFjay4gVGhlIHJlYWwgU3VzcGVuc2UgYm91bmRhcnkgd2lsbCBzdXNwZW5kIGZvciBhIHdoaWxlIHNvIHdlIGhhdmUgc29tZSB0aW1lXG4gICAgLy8gdG8gZW5zdXJlIGl0IGNhbiBwcm9kdWNlIHJlYWwgY29udGVudCwgYnV0IGFsbCBzdGF0ZSBhbmQgcGVuZGluZyBldmVudHMgd2lsbCBiZSBsb3N0LlxuXG4gICAgLy8gRGV0YWNoIGZyb20gdGhlIGN1cnJlbnQgZGVoeWRyYXRlZCBib3VuZGFyeS5cbiAgICBjdXJyZW50JCQxLmFsdGVybmF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDtcblxuICAgIC8vIEluc2VydCBhIGRlbGV0aW9uIGluIHRoZSBlZmZlY3QgbGlzdC5cbiAgICB2YXIgcmV0dXJuRmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gICAgIShyZXR1cm5GaWJlciAhPT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICdTdXNwZW5zZSBib3VuZGFyaWVzIGFyZSBuZXZlciBvbiB0aGUgcm9vdC4gVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiBSZWFjdC4nKSA6IHZvaWQgMDtcbiAgICB2YXIgbGFzdCA9IHJldHVybkZpYmVyLmxhc3RFZmZlY3Q7XG4gICAgaWYgKGxhc3QgIT09IG51bGwpIHtcbiAgICAgIGxhc3QubmV4dEVmZmVjdCA9IGN1cnJlbnQkJDE7XG4gICAgICByZXR1cm5GaWJlci5sYXN0RWZmZWN0ID0gY3VycmVudCQkMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuRmliZXIuZmlyc3RFZmZlY3QgPSByZXR1cm5GaWJlci5sYXN0RWZmZWN0ID0gY3VycmVudCQkMTtcbiAgICB9XG4gICAgY3VycmVudCQkMS5uZXh0RWZmZWN0ID0gbnVsbDtcbiAgICBjdXJyZW50JCQxLmVmZmVjdFRhZyA9IERlbGV0aW9uO1xuXG4gICAgLy8gVXBncmFkZSB0aGlzIHdvcmsgaW4gcHJvZ3Jlc3MgdG8gYSByZWFsIFN1c3BlbnNlIGNvbXBvbmVudC5cbiAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBTdXNwZW5zZUNvbXBvbmVudDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIC8vIFRoaXMgaXMgbm93IGFuIGluc2VydGlvbi5cbiAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gUGxhY2VtZW50O1xuICAgIC8vIFJldHJ5IGFzIGEgcmVhbCBTdXNwZW5zZSBjb21wb25lbnQuXG4gICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIH1cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgJiBEaWRDYXB0dXJlKSA9PT0gTm9FZmZlY3QpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBhdHRlbXB0LlxuICAgIHJlZW50ZXJIeWRyYXRpb25TdGF0ZUZyb21EZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbW91bnRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB9IGVsc2Uge1xuICAgIC8vIFNvbWV0aGluZyBzdXNwZW5kZWQuIExlYXZlIHRoZSBleGlzdGluZyBjaGlsZHJlbiBpbiBwbGFjZS5cbiAgICAvLyBUT0RPOiBJbiBub24tY29uY3VycmVudCBtb2RlLCBzaG91bGQgd2UgY29tbWl0IHRoZSBub2RlcyB3ZSBoYXZlIGh5ZHJhdGVkIHNvIGZhcj9cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlUG9ydGFsQ29tcG9uZW50KGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICBpZiAoY3VycmVudCQkMSA9PT0gbnVsbCkge1xuICAgIC8vIFBvcnRhbHMgYXJlIHNwZWNpYWwgYmVjYXVzZSB3ZSBkb24ndCBhcHBlbmQgdGhlIGNoaWxkcmVuIGR1cmluZyBtb3VudFxuICAgIC8vIGJ1dCBhdCBjb21taXQuIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIHRyYWNrIGluc2VydGlvbnMgd2hpY2ggdGhlIG5vcm1hbFxuICAgIC8vIGZsb3cgZG9lc24ndCBkbyBkdXJpbmcgbW91bnQuIFRoaXMgZG9lc24ndCBoYXBwZW4gYXQgdGhlIHJvb3QgYmVjYXVzZVxuICAgIC8vIHRoZSByb290IGFsd2F5cyBzdGFydHMgd2l0aCBhIFwiY3VycmVudFwiIHdpdGggYSBudWxsIGNoaWxkLlxuICAgIC8vIFRPRE86IENvbnNpZGVyIHVuaWZ5aW5nIHRoaXMgd2l0aCBob3cgdGhlIHJvb3Qgd29ya3MuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIH0gZWxzZSB7XG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICB9XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ29udGV4dFByb3ZpZGVyKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICB2YXIgcHJvdmlkZXJUeXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgdmFyIGNvbnRleHQgPSBwcm92aWRlclR5cGUuX2NvbnRleHQ7XG5cbiAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuXG4gIHZhciBuZXdWYWx1ZSA9IG5ld1Byb3BzLnZhbHVlO1xuXG4gIHtcbiAgICB2YXIgcHJvdmlkZXJQcm9wVHlwZXMgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLnByb3BUeXBlcztcblxuICAgIGlmIChwcm92aWRlclByb3BUeXBlcykge1xuICAgICAgY2hlY2tQcm9wVHlwZXMocHJvdmlkZXJQcm9wVHlwZXMsIG5ld1Byb3BzLCAncHJvcCcsICdDb250ZXh0LlByb3ZpZGVyJywgZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldik7XG4gICAgfVxuICB9XG5cbiAgcHVzaFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBuZXdWYWx1ZSk7XG5cbiAgaWYgKG9sZFByb3BzICE9PSBudWxsKSB7XG4gICAgdmFyIG9sZFZhbHVlID0gb2xkUHJvcHMudmFsdWU7XG4gICAgdmFyIGNoYW5nZWRCaXRzID0gY2FsY3VsYXRlQ2hhbmdlZEJpdHMoY29udGV4dCwgbmV3VmFsdWUsIG9sZFZhbHVlKTtcbiAgICBpZiAoY2hhbmdlZEJpdHMgPT09IDApIHtcbiAgICAgIC8vIE5vIGNoYW5nZS4gQmFpbG91dCBlYXJseSBpZiBjaGlsZHJlbiBhcmUgdGhlIHNhbWUuXG4gICAgICBpZiAob2xkUHJvcHMuY2hpbGRyZW4gPT09IG5ld1Byb3BzLmNoaWxkcmVuICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpKSB7XG4gICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBjb250ZXh0IHZhbHVlIGNoYW5nZWQuIFNlYXJjaCBmb3IgbWF0Y2hpbmcgY29uc3VtZXJzIGFuZCBzY2hlZHVsZVxuICAgICAgLy8gdGhlbSB0byB1cGRhdGUuXG4gICAgICBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCBjaGFuZ2VkQml0cywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBuZXdDaGlsZHJlbiA9IG5ld1Byb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG52YXIgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRleHRDb25zdW1lcihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAvLyBUaGUgbG9naWMgYmVsb3cgZm9yIENvbnRleHQgZGlmZmVycyBkZXBlbmRpbmcgb24gUFJPRCBvciBERVYgbW9kZS4gSW5cbiAgLy8gREVWIG1vZGUsIHdlIGNyZWF0ZSBhIHNlcGFyYXRlIG9iamVjdCBmb3IgQ29udGV4dC5Db25zdW1lciB0aGF0IGFjdHNcbiAgLy8gbGlrZSBhIHByb3h5IHRvIENvbnRleHQuIFRoaXMgcHJveHkgb2JqZWN0IGFkZHMgdW5uZWNlc3NhcnkgY29kZSBpbiBQUk9EXG4gIC8vIHNvIHdlIHVzZSB0aGUgb2xkIGJlaGF2aW91ciAoQ29udGV4dC5Db25zdW1lciByZWZlcmVuY2VzIENvbnRleHQpIHRvXG4gIC8vIHJlZHVjZSBzaXplIGFuZCBvdmVyaGVhZC4gVGhlIHNlcGFyYXRlIG9iamVjdCByZWZlcmVuY2VzIGNvbnRleHQgdmlhXG4gIC8vIGEgcHJvcGVydHkgY2FsbGVkIFwiX2NvbnRleHRcIiwgd2hpY2ggYWxzbyBnaXZlcyB1cyB0aGUgYWJpbGl0eSB0byBjaGVja1xuICAvLyBpbiBERVYgbW9kZSBpZiB0aGlzIHByb3BlcnR5IGV4aXN0cyBvciBub3QgYW5kIHdhcm4gaWYgaXQgZG9lcyBub3QuXG4gIHtcbiAgICBpZiAoY29udGV4dC5fY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBUaGlzIG1heSBiZSBiZWNhdXNlIGl0J3MgYSBDb250ZXh0IChyYXRoZXIgdGhhbiBhIENvbnN1bWVyKS5cbiAgICAgIC8vIE9yIGl0IG1heSBiZSBiZWNhdXNlIGl0J3Mgb2xkZXIgUmVhY3Qgd2hlcmUgdGhleSdyZSB0aGUgc2FtZSB0aGluZy5cbiAgICAgIC8vIFdlIG9ubHkgd2FudCB0byB3YXJuIGlmIHdlJ3JlIHN1cmUgaXQncyBhIG5ldyBSZWFjdC5cbiAgICAgIGlmIChjb250ZXh0ICE9PSBjb250ZXh0LkNvbnN1bWVyKSB7XG4gICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyKSB7XG4gICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyID0gdHJ1ZTtcbiAgICAgICAgICB3YXJuaW5nJDEoZmFsc2UsICdSZW5kZXJpbmcgPENvbnRleHQ+IGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byByZW5kZXIgPENvbnRleHQuQ29uc3VtZXI+IGluc3RlYWQ/Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dCA9IGNvbnRleHQuX2NvbnRleHQ7XG4gICAgfVxuICB9XG4gIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHJlbmRlciA9IG5ld1Byb3BzLmNoaWxkcmVuO1xuXG4gIHtcbiAgICAhKHR5cGVvZiByZW5kZXIgPT09ICdmdW5jdGlvbicpID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnQSBjb250ZXh0IGNvbnN1bWVyIHdhcyByZW5kZXJlZCB3aXRoIG11bHRpcGxlIGNoaWxkcmVuLCBvciBhIGNoaWxkICcgKyBcInRoYXQgaXNuJ3QgYSBmdW5jdGlvbi4gQSBjb250ZXh0IGNvbnN1bWVyIGV4cGVjdHMgYSBzaW5nbGUgY2hpbGQgXCIgKyAndGhhdCBpcyBhIGZ1bmN0aW9uLiBJZiB5b3UgZGlkIHBhc3MgYSBmdW5jdGlvbiwgbWFrZSBzdXJlIHRoZXJlICcgKyAnaXMgbm8gdHJhaWxpbmcgb3IgbGVhZGluZyB3aGl0ZXNwYWNlIGFyb3VuZCBpdC4nKSA6IHZvaWQgMDtcbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIHZhciBuZXdWYWx1ZSA9IHJlYWRDb250ZXh0KGNvbnRleHQsIG5ld1Byb3BzLnVuc3RhYmxlX29ic2VydmVkQml0cyk7XG4gIHZhciBuZXdDaGlsZHJlbiA9IHZvaWQgMDtcbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDMuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldEN1cnJlbnRQaGFzZSgncmVuZGVyJyk7XG4gICAgbmV3Q2hpbGRyZW4gPSByZW5kZXIobmV3VmFsdWUpO1xuICAgIHNldEN1cnJlbnRQaGFzZShudWxsKTtcbiAgfVxuXG4gIC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cbiAgd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnIHw9IFBlcmZvcm1lZFdvcms7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCBuZXdDaGlsZHJlbiwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCkge1xuICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgY2FuY2VsV29ya1RpbWVyKHdvcmtJblByb2dyZXNzKTtcblxuICBpZiAoY3VycmVudCQkMSAhPT0gbnVsbCkge1xuICAgIC8vIFJldXNlIHByZXZpb3VzIGNvbnRleHQgbGlzdFxuICAgIHdvcmtJblByb2dyZXNzLmNvbnRleHREZXBlbmRlbmNpZXMgPSBjdXJyZW50JCQxLmNvbnRleHREZXBlbmRlbmNpZXM7XG4gIH1cblxuICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lcikge1xuICAgIC8vIERvbid0IHVwZGF0ZSBcImJhc2VcIiByZW5kZXIgdGltZXMgZm9yIGJhaWxvdXRzLlxuICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIHRoZSBjaGlsZHJlbiBoYXZlIGFueSBwZW5kaW5nIHdvcmsuXG4gIHZhciBjaGlsZEV4cGlyYXRpb25UaW1lID0gd29ya0luUHJvZ3Jlc3MuY2hpbGRFeHBpcmF0aW9uVGltZTtcbiAgaWYgKGNoaWxkRXhwaXJhdGlvblRpbWUgPCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAgIC8vIFRoZSBjaGlsZHJlbiBkb24ndCBoYXZlIGFueSB3b3JrIGVpdGhlci4gV2UgY2FuIHNraXAgdGhlbS5cbiAgICAvLyBUT0RPOiBPbmNlIHdlIGFkZCBiYWNrIHJlc3VtaW5nLCB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlIGNoaWxkcmVuIGFyZVxuICAgIC8vIGEgd29yay1pbi1wcm9ncmVzcyBzZXQuIElmIHNvLCB3ZSBuZWVkIHRvIHRyYW5zZmVyIHRoZWlyIGVmZmVjdHMuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBmaWJlciBkb2Vzbid0IGhhdmUgd29yaywgYnV0IGl0cyBzdWJ0cmVlIGRvZXMuIENsb25lIHRoZSBjaGlsZFxuICAgIC8vIGZpYmVycyBhbmQgY29udGludWUuXG4gICAgY2xvbmVDaGlsZEZpYmVycyhjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJlZ2luV29yayhjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgdmFyIHVwZGF0ZUV4cGlyYXRpb25UaW1lID0gd29ya0luUHJvZ3Jlc3MuZXhwaXJhdGlvblRpbWU7XG5cbiAgaWYgKGN1cnJlbnQkJDEgIT09IG51bGwpIHtcbiAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50JCQxLm1lbW9pemVkUHJvcHM7XG4gICAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgaWYgKG9sZFByb3BzICE9PSBuZXdQcm9wcyB8fCBoYXNDb250ZXh0Q2hhbmdlZCgpKSB7XG4gICAgICAvLyBJZiBwcm9wcyBvciBjb250ZXh0IGNoYW5nZWQsIG1hcmsgdGhlIGZpYmVyIGFzIGhhdmluZyBwZXJmb3JtZWQgd29yay5cbiAgICAgIC8vIFRoaXMgbWF5IGJlIHVuc2V0IGlmIHRoZSBwcm9wcyBhcmUgZGV0ZXJtaW5lZCB0byBiZSBlcXVhbCBsYXRlciAobWVtbykuXG4gICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHVwZGF0ZUV4cGlyYXRpb25UaW1lIDwgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbiAgICAgIC8vIFRoaXMgZmliZXIgZG9lcyBub3QgaGF2ZSBhbnkgcGVuZGluZyB3b3JrLiBCYWlsb3V0IHdpdGhvdXQgZW50ZXJpbmdcbiAgICAgIC8vIHRoZSBiZWdpbiBwaGFzZS4gVGhlcmUncyBzdGlsbCBzb21lIGJvb2trZWVwaW5nIHdlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZVxuICAgICAgLy8gaW4gdGhpcyBvcHRpbWl6ZWQgcGF0aCwgbW9zdGx5IHB1c2hpbmcgc3R1ZmYgb250byB0aGUgc3RhY2suXG4gICAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHB1c2hIb3N0Um9vdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIHB1c2hIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIENvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgICAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICAgIHB1c2hIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMudmFsdWU7XG4gICAgICAgICAgICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lcikge1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnIHw9IFVwZGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICAgIHZhciBkaWRUaW1lb3V0ID0gc3RhdGUgIT09IG51bGw7XG4gICAgICAgICAgICBpZiAoZGlkVGltZW91dCkge1xuICAgICAgICAgICAgICAvLyBJZiB0aGlzIGJvdW5kYXJ5IGlzIGN1cnJlbnRseSB0aW1lZCBvdXQsIHdlIG5lZWQgdG8gZGVjaWRlXG4gICAgICAgICAgICAgIC8vIHdoZXRoZXIgdG8gcmV0cnkgdGhlIHByaW1hcnkgY2hpbGRyZW4sIG9yIHRvIHNraXAgb3ZlciBpdCBhbmRcbiAgICAgICAgICAgICAgLy8gZ28gc3RyYWlnaHQgdG8gdGhlIGZhbGxiYWNrLiBDaGVjayB0aGUgcHJpb3JpdHkgb2YgdGhlIHByaW1hcnlcbiAgICAgICAgICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRFeHBpcmF0aW9uVGltZSA9IHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkRXhwaXJhdGlvblRpbWU7XG4gICAgICAgICAgICAgIGlmIChwcmltYXJ5Q2hpbGRFeHBpcmF0aW9uVGltZSAhPT0gTm9Xb3JrICYmIHByaW1hcnlDaGlsZEV4cGlyYXRpb25UaW1lID49IHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHByaW1hcnkgY2hpbGRyZW4gaGF2ZSBwZW5kaW5nIHdvcmsuIFVzZSB0aGUgbm9ybWFsIHBhdGhcbiAgICAgICAgICAgICAgICAvLyB0byBhdHRlbXB0IHRvIHJlbmRlciB0aGUgcHJpbWFyeSBjaGlsZHJlbiBhZ2Fpbi5cbiAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgcHJpbWFyeSBjaGlsZHJlbiBkbyBub3QgaGF2ZSBwZW5kaW5nIHdvcmsgd2l0aCBzdWZmaWNpZW50XG4gICAgICAgICAgICAgICAgLy8gcHJpb3JpdHkuIEJhaWxvdXQuXG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgLy8gVGhlIGZhbGxiYWNrIGNoaWxkcmVuIGhhdmUgcGVuZGluZyB3b3JrLiBTa2lwIG92ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBwcmltYXJ5IGNoaWxkcmVuIGFuZCB3b3JrIG9uIHRoZSBmYWxsYmFjay5cbiAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZC5zaWJsaW5nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBEZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKGVuYWJsZVN1c3BlbnNlU2VydmVyUmVuZGVyZXIpIHtcbiAgICAgICAgICAgICAgLy8gV2Uga25vdyB0aGF0IHRoaXMgY29tcG9uZW50IHdpbGwgc3VzcGVuZCBhZ2FpbiBiZWNhdXNlIGlmIGl0IGhhc1xuICAgICAgICAgICAgICAvLyBiZWVuIHVuc3VzcGVuZGVkIGl0IGhhcyBjb21taXR0ZWQgYXMgYSByZWd1bGFyIFN1c3BlbnNlIGNvbXBvbmVudC5cbiAgICAgICAgICAgICAgLy8gSWYgaXQgbmVlZHMgdG8gYmUgcmV0cmllZCwgaXQgc2hvdWxkIGhhdmUgd29yayBzY2hlZHVsZWQgb24gaXQuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG4gIH1cblxuICAvLyBCZWZvcmUgZW50ZXJpbmcgdGhlIGJlZ2luIHBoYXNlLCBjbGVhciB0aGUgZXhwaXJhdGlvbiB0aW1lLlxuICB3b3JrSW5Qcm9ncmVzcy5leHBpcmF0aW9uVGltZSA9IE5vV29yaztcblxuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGVsZW1lbnRUeXBlID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGU7XG4gICAgICAgIHJldHVybiBtb3VudEluZGV0ZXJtaW5hdGVDb21wb25lbnQoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIGVsZW1lbnRUeXBlLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICB9XG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX2VsZW1lbnRUeXBlID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGU7XG4gICAgICAgIHJldHVybiBtb3VudExhenlDb21wb25lbnQoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIF9lbGVtZW50VHlwZSwgdXBkYXRlRXhwaXJhdGlvblRpbWUsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICAgIH1cbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX0NvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciB1bnJlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gICAgICAgIHZhciByZXNvbHZlZFByb3BzID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IF9Db21wb25lbnQgPyB1bnJlc29sdmVkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKF9Db21wb25lbnQsIHVucmVzb2x2ZWRQcm9wcyk7XG4gICAgICAgIHJldHVybiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgX0NvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgICAgfVxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfQ29tcG9uZW50MiA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gX0NvbXBvbmVudDIgPyBfdW5yZXNvbHZlZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhfQ29tcG9uZW50MiwgX3VucmVzb2x2ZWRQcm9wcyk7XG4gICAgICAgIHJldHVybiB1cGRhdGVDbGFzc0NvbXBvbmVudChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgX0NvbXBvbmVudDIsIF9yZXNvbHZlZFByb3BzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICB9XG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0Um9vdChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0Q29tcG9uZW50KGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0VGV4dChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHJldHVybiB1cGRhdGVQb3J0YWxDb21wb25lbnQoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICB7XG4gICAgICAgIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIF91bnJlc29sdmVkUHJvcHMyID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMyID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IHR5cGUgPyBfdW5yZXNvbHZlZFByb3BzMiA6IHJlc29sdmVEZWZhdWx0UHJvcHModHlwZSwgX3VucmVzb2x2ZWRQcm9wczIpO1xuICAgICAgICByZXR1cm4gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgX3Jlc29sdmVkUHJvcHMyLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICB9XG4gICAgY2FzZSBGcmFnbWVudDpcbiAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIGNhc2UgTW9kZTpcbiAgICAgIHJldHVybiB1cGRhdGVNb2RlKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHJldHVybiB1cGRhdGVQcm9maWxlcihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgcmV0dXJuIHVwZGF0ZUNvbnRleHRQcm92aWRlcihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgICAgcmV0dXJuIHVwZGF0ZUNvbnRleHRDb25zdW1lcihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF90eXBlMiA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzMyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICAgICAgLy8gUmVzb2x2ZSBvdXRlciBwcm9wcyBmaXJzdCwgdGhlbiByZXNvbHZlIGlubmVyIHByb3BzLlxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMzID0gcmVzb2x2ZURlZmF1bHRQcm9wcyhfdHlwZTIsIF91bnJlc29sdmVkUHJvcHMzKTtcbiAgICAgICAge1xuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgICAgICAgdmFyIG91dGVyUHJvcFR5cGVzID0gX3R5cGUyLnByb3BUeXBlcztcbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgX3Jlc29sdmVkUHJvcHMzLCAvLyBSZXNvbHZlZCBmb3Igb3V0ZXIgb25seVxuICAgICAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoX3R5cGUyKSwgZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9yZXNvbHZlZFByb3BzMyA9IHJlc29sdmVEZWZhdWx0UHJvcHMoX3R5cGUyLnR5cGUsIF9yZXNvbHZlZFByb3BzMyk7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vQ29tcG9uZW50KGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCBfdHlwZTIsIF9yZXNvbHZlZFByb3BzMywgdXBkYXRlRXhwaXJhdGlvblRpbWUsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICAgIH1cbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB1cGRhdGVTaW1wbGVNZW1vQ29tcG9uZW50KGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy50eXBlLCB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsIHVwZGF0ZUV4cGlyYXRpb25UaW1lLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICB9XG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfQ29tcG9uZW50MyA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzNCA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzNCA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSBfQ29tcG9uZW50MyA/IF91bnJlc29sdmVkUHJvcHM0IDogcmVzb2x2ZURlZmF1bHRQcm9wcyhfQ29tcG9uZW50MywgX3VucmVzb2x2ZWRQcm9wczQpO1xuICAgICAgICByZXR1cm4gbW91bnRJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIF9Db21wb25lbnQzLCBfcmVzb2x2ZWRQcm9wczQsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICAgIH1cbiAgICBjYXNlIERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKGVuYWJsZVN1c3BlbnNlU2VydmVyUmVuZGVyZXIpIHtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbiAgaW52YXJpYW50KGZhbHNlLCAnVW5rbm93biB1bml0IG9mIHdvcmsgdGFnLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG52YXIgdmFsdWVDdXJzb3IgPSBjcmVhdGVDdXJzb3IobnVsbCk7XG5cbnZhciByZW5kZXJlclNpZ2lsID0gdm9pZCAwO1xue1xuICAvLyBVc2UgdGhpcyB0byBkZXRlY3QgbXVsdGlwbGUgcmVuZGVyZXJzIHVzaW5nIHRoZSBzYW1lIGNvbnRleHRcbiAgcmVuZGVyZXJTaWdpbCA9IHt9O1xufVxuXG52YXIgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSBudWxsO1xudmFyIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG52YXIgbGFzdENvbnRleHRXaXRoQWxsQml0c09ic2VydmVkID0gbnVsbDtcblxudmFyIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcblxuZnVuY3Rpb24gcmVzZXRDb250ZXh0RGVwZW5kZW5jZXMoKSB7XG4gIC8vIFRoaXMgaXMgY2FsbGVkIHJpZ2h0IGJlZm9yZSBSZWFjdCB5aWVsZHMgZXhlY3V0aW9uLCB0byBlbnN1cmUgYHJlYWRDb250ZXh0YFxuICAvLyBjYW5ub3QgYmUgY2FsbGVkIG91dHNpZGUgdGhlIHJlbmRlciBwaGFzZS5cbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSBudWxsO1xuICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBudWxsO1xuICBsYXN0Q29udGV4dFdpdGhBbGxCaXRzT2JzZXJ2ZWQgPSBudWxsO1xuICB7XG4gICAgaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFViA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKSB7XG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKSB7XG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFByb3ZpZGVyKHByb3ZpZGVyRmliZXIsIG5leHRWYWx1ZSkge1xuICB2YXIgY29udGV4dCA9IHByb3ZpZGVyRmliZXIudHlwZS5fY29udGV4dDtcblxuICBpZiAoaXNQcmltYXJ5UmVuZGVyZXIpIHtcbiAgICBwdXNoKHZhbHVlQ3Vyc29yLCBjb250ZXh0Ll9jdXJyZW50VmFsdWUsIHByb3ZpZGVyRmliZXIpO1xuXG4gICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gbmV4dFZhbHVlO1xuICAgIHtcbiAgICAgICEoY29udGV4dC5fY3VycmVudFJlbmRlcmVyID09PSB1bmRlZmluZWQgfHwgY29udGV4dC5fY3VycmVudFJlbmRlcmVyID09PSBudWxsIHx8IGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9PT0gcmVuZGVyZXJTaWdpbCkgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdEZXRlY3RlZCBtdWx0aXBsZSByZW5kZXJlcnMgY29uY3VycmVudGx5IHJlbmRlcmluZyB0aGUgJyArICdzYW1lIGNvbnRleHQgcHJvdmlkZXIuIFRoaXMgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkLicpIDogdm9pZCAwO1xuICAgICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyID0gcmVuZGVyZXJTaWdpbDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcHVzaCh2YWx1ZUN1cnNvciwgY29udGV4dC5fY3VycmVudFZhbHVlMiwgcHJvdmlkZXJGaWJlcik7XG5cbiAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUyID0gbmV4dFZhbHVlO1xuICAgIHtcbiAgICAgICEoY29udGV4dC5fY3VycmVudFJlbmRlcmVyMiA9PT0gdW5kZWZpbmVkIHx8IGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlcjIgPT09IG51bGwgfHwgY29udGV4dC5fY3VycmVudFJlbmRlcmVyMiA9PT0gcmVuZGVyZXJTaWdpbCkgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdEZXRlY3RlZCBtdWx0aXBsZSByZW5kZXJlcnMgY29uY3VycmVudGx5IHJlbmRlcmluZyB0aGUgJyArICdzYW1lIGNvbnRleHQgcHJvdmlkZXIuIFRoaXMgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkLicpIDogdm9pZCAwO1xuICAgICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyMiA9IHJlbmRlcmVyU2lnaWw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHBvcFByb3ZpZGVyKHByb3ZpZGVyRmliZXIpIHtcbiAgdmFyIGN1cnJlbnRWYWx1ZSA9IHZhbHVlQ3Vyc29yLmN1cnJlbnQ7XG5cbiAgcG9wKHZhbHVlQ3Vyc29yLCBwcm92aWRlckZpYmVyKTtcblxuICB2YXIgY29udGV4dCA9IHByb3ZpZGVyRmliZXIudHlwZS5fY29udGV4dDtcbiAgaWYgKGlzUHJpbWFyeVJlbmRlcmVyKSB7XG4gICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTIgPSBjdXJyZW50VmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlQ2hhbmdlZEJpdHMoY29udGV4dCwgbmV3VmFsdWUsIG9sZFZhbHVlKSB7XG4gIGlmIChpcyhvbGRWYWx1ZSwgbmV3VmFsdWUpKSB7XG4gICAgLy8gTm8gY2hhbmdlXG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGNoYW5nZWRCaXRzID0gdHlwZW9mIGNvbnRleHQuX2NhbGN1bGF0ZUNoYW5nZWRCaXRzID09PSAnZnVuY3Rpb24nID8gY29udGV4dC5fY2FsY3VsYXRlQ2hhbmdlZEJpdHMob2xkVmFsdWUsIG5ld1ZhbHVlKSA6IG1heFNpZ25lZDMxQml0SW50O1xuXG4gICAge1xuICAgICAgISgoY2hhbmdlZEJpdHMgJiBtYXhTaWduZWQzMUJpdEludCkgPT09IGNoYW5nZWRCaXRzKSA/IHdhcm5pbmckMShmYWxzZSwgJ2NhbGN1bGF0ZUNoYW5nZWRCaXRzOiBFeHBlY3RlZCB0aGUgcmV0dXJuIHZhbHVlIHRvIGJlIGEgJyArICczMS1iaXQgaW50ZWdlci4gSW5zdGVhZCByZWNlaXZlZDogJXMnLCBjaGFuZ2VkQml0cykgOiB2b2lkIDA7XG4gICAgfVxuICAgIHJldHVybiBjaGFuZ2VkQml0cyB8IDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVXb3JrT25QYXJlbnRQYXRoKHBhcmVudCwgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgLy8gVXBkYXRlIHRoZSBjaGlsZCBleHBpcmF0aW9uIHRpbWUgb2YgYWxsIHRoZSBhbmNlc3RvcnMsIGluY2x1ZGluZ1xuICAvLyB0aGUgYWx0ZXJuYXRlcy5cbiAgdmFyIG5vZGUgPSBwYXJlbnQ7XG4gIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgdmFyIGFsdGVybmF0ZSA9IG5vZGUuYWx0ZXJuYXRlO1xuICAgIGlmIChub2RlLmNoaWxkRXhwaXJhdGlvblRpbWUgPCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAgICAgbm9kZS5jaGlsZEV4cGlyYXRpb25UaW1lID0gcmVuZGVyRXhwaXJhdGlvblRpbWU7XG4gICAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZS5jaGlsZEV4cGlyYXRpb25UaW1lIDwgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgICAgICAgYWx0ZXJuYXRlLmNoaWxkRXhwaXJhdGlvblRpbWUgPSByZW5kZXJFeHBpcmF0aW9uVGltZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUuY2hpbGRFeHBpcmF0aW9uVGltZSA8IHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gICAgICBhbHRlcm5hdGUuY2hpbGRFeHBpcmF0aW9uVGltZSA9IHJlbmRlckV4cGlyYXRpb25UaW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZWl0aGVyIGFsdGVybmF0ZSB3YXMgdXBkYXRlZCwgd2hpY2ggbWVhbnMgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAvLyBhbmNlc3RvciBwYXRoIGFscmVhZHkgaGFzIHN1ZmZpY2llbnQgcHJpb3JpdHkuXG4gICAgICBicmVhaztcbiAgICB9XG4gICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIGNoYW5nZWRCaXRzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICB2YXIgZmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgaWYgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgLy8gU2V0IHRoZSByZXR1cm4gcG9pbnRlciBvZiB0aGUgY2hpbGQgdG8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuXG4gICAgZmliZXIucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIH1cbiAgd2hpbGUgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgdmFyIG5leHRGaWJlciA9IHZvaWQgMDtcblxuICAgIC8vIFZpc2l0IHRoaXMgZmliZXIuXG4gICAgdmFyIGxpc3QgPSBmaWJlci5jb250ZXh0RGVwZW5kZW5jaWVzO1xuICAgIGlmIChsaXN0ICE9PSBudWxsKSB7XG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5jaGlsZDtcblxuICAgICAgdmFyIGRlcGVuZGVuY3kgPSBsaXN0LmZpcnN0O1xuICAgICAgd2hpbGUgKGRlcGVuZGVuY3kgIT09IG51bGwpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNvbnRleHQgbWF0Y2hlcy5cbiAgICAgICAgaWYgKGRlcGVuZGVuY3kuY29udGV4dCA9PT0gY29udGV4dCAmJiAoZGVwZW5kZW5jeS5vYnNlcnZlZEJpdHMgJiBjaGFuZ2VkQml0cykgIT09IDApIHtcbiAgICAgICAgICAvLyBNYXRjaCEgU2NoZWR1bGUgYW4gdXBkYXRlIG9uIHRoaXMgZmliZXIuXG5cbiAgICAgICAgICBpZiAoZmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgLy8gU2NoZWR1bGUgYSBmb3JjZSB1cGRhdGUgb24gdGhlIHdvcmstaW4tcHJvZ3Jlc3MuXG4gICAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTtcbiAgICAgICAgICAgIC8vIFRPRE86IEJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhIHdvcmstaW4tcHJvZ3Jlc3MsIHRoaXMgd2lsbCBhZGQgdGhlXG4gICAgICAgICAgICAvLyB1cGRhdGUgdG8gdGhlIGN1cnJlbnQgZmliZXIsIHRvbywgd2hpY2ggbWVhbnMgaXQgd2lsbCBwZXJzaXN0IGV2ZW4gaWZcbiAgICAgICAgICAgIC8vIHRoaXMgcmVuZGVyIGlzIHRocm93biBhd2F5LiBTaW5jZSBpdCdzIGEgcmFjZSBjb25kaXRpb24sIG5vdCBzdXJlIGl0J3NcbiAgICAgICAgICAgIC8vIHdvcnRoIGZpeGluZy5cbiAgICAgICAgICAgIGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZpYmVyLmV4cGlyYXRpb25UaW1lIDwgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgICAgICAgICAgIGZpYmVyLmV4cGlyYXRpb25UaW1lID0gcmVuZGVyRXhwaXJhdGlvblRpbWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG4gICAgICAgICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUuZXhwaXJhdGlvblRpbWUgPCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAgICAgICAgICAgYWx0ZXJuYXRlLmV4cGlyYXRpb25UaW1lID0gcmVuZGVyRXhwaXJhdGlvblRpbWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2NoZWR1bGVXb3JrT25QYXJlbnRQYXRoKGZpYmVyLnJldHVybiwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuXG4gICAgICAgICAgLy8gTWFyayB0aGUgZXhwaXJhdGlvbiB0aW1lIG9uIHRoZSBsaXN0LCB0b28uXG4gICAgICAgICAgaWYgKGxpc3QuZXhwaXJhdGlvblRpbWUgPCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAgICAgICAgICAgbGlzdC5leHBpcmF0aW9uVGltZSA9IHJlbmRlckV4cGlyYXRpb25UaW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNpbmNlIHdlIGFscmVhZHkgZm91bmQgYSBtYXRjaCwgd2UgY2FuIHN0b3AgdHJhdmVyc2luZyB0aGVcbiAgICAgICAgICAvLyBkZXBlbmRlbmN5IGxpc3QuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVwZW5kZW5jeSA9IGRlcGVuZGVuY3kubmV4dDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gQ29udGV4dFByb3ZpZGVyKSB7XG4gICAgICAvLyBEb24ndCBzY2FuIGRlZXBlciBpZiB0aGlzIGlzIGEgbWF0Y2hpbmcgcHJvdmlkZXJcbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLnR5cGUgPT09IHdvcmtJblByb2dyZXNzLnR5cGUgPyBudWxsIDogZmliZXIuY2hpbGQ7XG4gICAgfSBlbHNlIGlmIChlbmFibGVTdXNwZW5zZVNlcnZlclJlbmRlcmVyICYmIGZpYmVyLnRhZyA9PT0gRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICAvLyBJZiBhIGRlaHlkcmF0ZWQgc3VzcGVuc2UgY29tcG9uZW50IGlzIGluIHRoaXMgc3VidHJlZSwgd2UgZG9uJ3Qga25vd1xuICAgICAgLy8gaWYgaXQgd2lsbCBoYXZlIGFueSBjb250ZXh0IGNvbnN1bWVycyBpbiBpdC4gVGhlIGJlc3Qgd2UgY2FuIGRvIGlzXG4gICAgICAvLyBtYXJrIGl0IGFzIGhhdmluZyB1cGRhdGVzIG9uIGl0cyBjaGlsZHJlbi5cbiAgICAgIGlmIChmaWJlci5leHBpcmF0aW9uVGltZSA8IHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgIGZpYmVyLmV4cGlyYXRpb25UaW1lID0gcmVuZGVyRXhwaXJhdGlvblRpbWU7XG4gICAgICB9XG4gICAgICB2YXIgX2FsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgICAgIGlmIChfYWx0ZXJuYXRlICE9PSBudWxsICYmIF9hbHRlcm5hdGUuZXhwaXJhdGlvblRpbWUgPCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAgICAgICBfYWx0ZXJuYXRlLmV4cGlyYXRpb25UaW1lID0gcmVuZGVyRXhwaXJhdGlvblRpbWU7XG4gICAgICB9XG4gICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgcGFzc2luZyB0aGlzIGZpYmVyIGFzIHRoZSBwYXJlbnRcbiAgICAgIC8vIGJlY2F1c2Ugd2Ugd2FudCB0byBzY2hlZHVsZSB0aGlzIGZpYmVyIGFzIGhhdmluZyB3b3JrXG4gICAgICAvLyBvbiBpdHMgY2hpbGRyZW4uIFdlJ2xsIHVzZSB0aGUgY2hpbGRFeHBpcmF0aW9uVGltZSBvblxuICAgICAgLy8gdGhpcyBmaWJlciB0byBpbmRpY2F0ZSB0aGF0IGEgY29udGV4dCBoYXMgY2hhbmdlZC5cbiAgICAgIHNjaGVkdWxlV29ya09uUGFyZW50UGF0aChmaWJlciwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgICAgbmV4dEZpYmVyID0gZmliZXIuc2libGluZztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVHJhdmVyc2UgZG93bi5cbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLmNoaWxkO1xuICAgIH1cblxuICAgIGlmIChuZXh0RmliZXIgIT09IG51bGwpIHtcbiAgICAgIC8vIFNldCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIGNoaWxkIHRvIHRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuICAgICAgbmV4dEZpYmVyLnJldHVybiA9IGZpYmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBjaGlsZC4gVHJhdmVyc2UgdG8gbmV4dCBzaWJsaW5nLlxuICAgICAgbmV4dEZpYmVyID0gZmliZXI7XG4gICAgICB3aGlsZSAobmV4dEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChuZXh0RmliZXIgPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgICAgLy8gV2UncmUgYmFjayB0byB0aGUgcm9vdCBvZiB0aGlzIHN1YnRyZWUuIEV4aXQuXG4gICAgICAgICAgbmV4dEZpYmVyID0gbnVsbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2libGluZyA9IG5leHRGaWJlci5zaWJsaW5nO1xuICAgICAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFNldCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIHNpYmxpbmcgdG8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuXG4gICAgICAgICAgc2libGluZy5yZXR1cm4gPSBuZXh0RmliZXIucmV0dXJuO1xuICAgICAgICAgIG5leHRGaWJlciA9IHNpYmxpbmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gbW9yZSBzaWJsaW5ncy4gVHJhdmVyc2UgdXAuXG4gICAgICAgIG5leHRGaWJlciA9IG5leHRGaWJlci5yZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGZpYmVyID0gbmV4dEZpYmVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IHdvcmtJblByb2dyZXNzO1xuICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBudWxsO1xuICBsYXN0Q29udGV4dFdpdGhBbGxCaXRzT2JzZXJ2ZWQgPSBudWxsO1xuXG4gIHZhciBjdXJyZW50RGVwZW5kZW5jaWVzID0gd29ya0luUHJvZ3Jlc3MuY29udGV4dERlcGVuZGVuY2llcztcbiAgaWYgKGN1cnJlbnREZXBlbmRlbmNpZXMgIT09IG51bGwgJiYgY3VycmVudERlcGVuZGVuY2llcy5leHBpcmF0aW9uVGltZSA+PSByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAgIC8vIENvbnRleHQgbGlzdCBoYXMgYSBwZW5kaW5nIHVwZGF0ZS4gTWFyayB0aGF0IHRoaXMgZmliZXIgcGVyZm9ybWVkIHdvcmsuXG4gICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgfVxuXG4gIC8vIFJlc2V0IHRoZSB3b3JrLWluLXByb2dyZXNzIGxpc3RcbiAgd29ya0luUHJvZ3Jlc3MuY29udGV4dERlcGVuZGVuY2llcyA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cykge1xuICB7XG4gICAgLy8gVGhpcyB3YXJuaW5nIHdvdWxkIGZpcmUgaWYgeW91IHJlYWQgY29udGV4dCBpbnNpZGUgYSBIb29rIGxpa2UgdXNlTWVtby5cbiAgICAvLyBVbmxpa2UgdGhlIGNsYXNzIGNoZWNrIGJlbG93LCBpdCdzIG5vdCBlbmZvcmNlZCBpbiBwcm9kdWN0aW9uIGZvciBwZXJmLlxuICAgICEhaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFViA/IHdhcm5pbmckMShmYWxzZSwgJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpIDogdm9pZCAwO1xuICB9XG5cbiAgaWYgKGxhc3RDb250ZXh0V2l0aEFsbEJpdHNPYnNlcnZlZCA9PT0gY29udGV4dCkge1xuICAgIC8vIE5vdGhpbmcgdG8gZG8uIFdlIGFscmVhZHkgb2JzZXJ2ZSBldmVyeXRoaW5nIGluIHRoaXMgY29udGV4dC5cbiAgfSBlbHNlIGlmIChvYnNlcnZlZEJpdHMgPT09IGZhbHNlIHx8IG9ic2VydmVkQml0cyA9PT0gMCkge1xuICAgIC8vIERvIG5vdCBvYnNlcnZlIGFueSB1cGRhdGVzLlxuICB9IGVsc2Uge1xuICAgIHZhciByZXNvbHZlZE9ic2VydmVkQml0cyA9IHZvaWQgMDsgLy8gQXZvaWQgZGVvcHRpbmcgb24gb2JzZXJ2YWJsZSBhcmd1bWVudHMgb3IgaGV0ZXJvZ2VuZW91cyB0eXBlcy5cbiAgICBpZiAodHlwZW9mIG9ic2VydmVkQml0cyAhPT0gJ251bWJlcicgfHwgb2JzZXJ2ZWRCaXRzID09PSBtYXhTaWduZWQzMUJpdEludCkge1xuICAgICAgLy8gT2JzZXJ2ZSBhbGwgdXBkYXRlcy5cbiAgICAgIGxhc3RDb250ZXh0V2l0aEFsbEJpdHNPYnNlcnZlZCA9IGNvbnRleHQ7XG4gICAgICByZXNvbHZlZE9ic2VydmVkQml0cyA9IG1heFNpZ25lZDMxQml0SW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlZE9ic2VydmVkQml0cyA9IG9ic2VydmVkQml0cztcbiAgICB9XG5cbiAgICB2YXIgY29udGV4dEl0ZW0gPSB7XG4gICAgICBjb250ZXh0OiBjb250ZXh0LFxuICAgICAgb2JzZXJ2ZWRCaXRzOiByZXNvbHZlZE9ic2VydmVkQml0cyxcbiAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuXG4gICAgaWYgKGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9PT0gbnVsbCkge1xuICAgICAgIShjdXJyZW50bHlSZW5kZXJpbmdGaWJlciAhPT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiBJbiBjbGFzc2VzLCB5b3UgY2FuIHJlYWQgaXQgaW4gdGhlIHJlbmRlciBtZXRob2Qgb3IgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKSA6IHZvaWQgMDtcblxuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgZGVwZW5kZW5jeSBmb3IgdGhpcyBjb21wb25lbnQuIENyZWF0ZSBhIG5ldyBsaXN0LlxuICAgICAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gY29udGV4dEl0ZW07XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5jb250ZXh0RGVwZW5kZW5jaWVzID0ge1xuICAgICAgICBmaXJzdDogY29udGV4dEl0ZW0sXG4gICAgICAgIGV4cGlyYXRpb25UaW1lOiBOb1dvcmtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFwcGVuZCBhIG5ldyBjb250ZXh0IGl0ZW0uXG4gICAgICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBsYXN0Q29udGV4dERlcGVuZGVuY3kubmV4dCA9IGNvbnRleHRJdGVtO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaXNQcmltYXJ5UmVuZGVyZXIgPyBjb250ZXh0Ll9jdXJyZW50VmFsdWUgOiBjb250ZXh0Ll9jdXJyZW50VmFsdWUyO1xufVxuXG4vLyBVcGRhdGVRdWV1ZSBpcyBhIGxpbmtlZCBsaXN0IG9mIHByaW9yaXRpemVkIHVwZGF0ZXMuXG4vL1xuLy8gTGlrZSBmaWJlcnMsIHVwZGF0ZSBxdWV1ZXMgY29tZSBpbiBwYWlyczogYSBjdXJyZW50IHF1ZXVlLCB3aGljaCByZXByZXNlbnRzXG4vLyB0aGUgdmlzaWJsZSBzdGF0ZSBvZiB0aGUgc2NyZWVuLCBhbmQgYSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlLCB3aGljaCBjYW4gYmVcbi8vIG11dGF0ZWQgYW5kIHByb2Nlc3NlZCBhc3luY2hyb25vdXNseSBiZWZvcmUgaXQgaXMgY29tbWl0dGVkIOKAlCBhIGZvcm0gb2Zcbi8vIGRvdWJsZSBidWZmZXJpbmcuIElmIGEgd29yay1pbi1wcm9ncmVzcyByZW5kZXIgaXMgZGlzY2FyZGVkIGJlZm9yZSBmaW5pc2hpbmcsXG4vLyB3ZSBjcmVhdGUgYSBuZXcgd29yay1pbi1wcm9ncmVzcyBieSBjbG9uaW5nIHRoZSBjdXJyZW50IHF1ZXVlLlxuLy9cbi8vIEJvdGggcXVldWVzIHNoYXJlIGEgcGVyc2lzdGVudCwgc2luZ2x5LWxpbmtlZCBsaXN0IHN0cnVjdHVyZS4gVG8gc2NoZWR1bGUgYW5cbi8vIHVwZGF0ZSwgd2UgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgYm90aCBxdWV1ZXMuIEVhY2ggcXVldWUgbWFpbnRhaW5zIGFcbi8vIHBvaW50ZXIgdG8gZmlyc3QgdXBkYXRlIGluIHRoZSBwZXJzaXN0ZW50IGxpc3QgdGhhdCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQuXG4vLyBUaGUgd29yay1pbi1wcm9ncmVzcyBwb2ludGVyIGFsd2F5cyBoYXMgYSBwb3NpdGlvbiBlcXVhbCB0byBvciBncmVhdGVyIHRoYW5cbi8vIHRoZSBjdXJyZW50IHF1ZXVlLCBzaW5jZSB3ZSBhbHdheXMgd29yayBvbiB0aGF0IG9uZS4gVGhlIGN1cnJlbnQgcXVldWUnc1xuLy8gcG9pbnRlciBpcyBvbmx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBjb21taXQgcGhhc2UsIHdoZW4gd2Ugc3dhcCBpbiB0aGVcbi8vIHdvcmstaW4tcHJvZ3Jlc3MuXG4vL1xuLy8gRm9yIGV4YW1wbGU6XG4vL1xuLy8gICBDdXJyZW50IHBvaW50ZXI6ICAgICAgICAgICBBIC0gQiAtIEMgLSBEIC0gRSAtIEZcbi8vICAgV29yay1pbi1wcm9ncmVzcyBwb2ludGVyOiAgICAgICAgICAgICAgRCAtIEUgLSBGXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUgaGFzXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCBtb3JlIHVwZGF0ZXMgdGhhbiBjdXJyZW50LlxuLy9cbi8vIFRoZSByZWFzb24gd2UgYXBwZW5kIHRvIGJvdGggcXVldWVzIGlzIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIG1pZ2h0IGRyb3Bcbi8vIHVwZGF0ZXMgd2l0aG91dCBldmVyIHByb2Nlc3NpbmcgdGhlbS4gRm9yIGV4YW1wbGUsIGlmIHdlIG9ubHkgYWRkIHVwZGF0ZXMgdG9cbi8vIHRoZSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlLCBzb21lIHVwZGF0ZXMgY291bGQgYmUgbG9zdCB3aGVuZXZlciBhIHdvcmstaW5cbi8vIC1wcm9ncmVzcyByZW5kZXIgcmVzdGFydHMgYnkgY2xvbmluZyBmcm9tIGN1cnJlbnQuIFNpbWlsYXJseSwgaWYgd2Ugb25seSBhZGRcbi8vIHVwZGF0ZXMgdG8gdGhlIGN1cnJlbnQgcXVldWUsIHRoZSB1cGRhdGVzIHdpbGwgYmUgbG9zdCB3aGVuZXZlciBhbiBhbHJlYWR5XG4vLyBpbi1wcm9ncmVzcyBxdWV1ZSBjb21taXRzIGFuZCBzd2FwcyB3aXRoIHRoZSBjdXJyZW50IHF1ZXVlLiBIb3dldmVyLCBieVxuLy8gYWRkaW5nIHRvIGJvdGggcXVldWVzLCB3ZSBndWFyYW50ZWUgdGhhdCB0aGUgdXBkYXRlIHdpbGwgYmUgcGFydCBvZiB0aGUgbmV4dFxuLy8gd29yay1pbi1wcm9ncmVzcy4gKEFuZCBiZWNhdXNlIHRoZSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIGJlY29tZXMgdGhlXG4vLyBjdXJyZW50IHF1ZXVlIG9uY2UgaXQgY29tbWl0cywgdGhlcmUncyBubyBkYW5nZXIgb2YgYXBwbHlpbmcgdGhlIHNhbWVcbi8vIHVwZGF0ZSB0d2ljZS4pXG4vL1xuLy8gUHJpb3JpdGl6YXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tXG4vL1xuLy8gVXBkYXRlcyBhcmUgbm90IHNvcnRlZCBieSBwcmlvcml0eSwgYnV0IGJ5IGluc2VydGlvbjsgbmV3IHVwZGF0ZXMgYXJlIGFsd2F5c1xuLy8gYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC5cbi8vXG4vLyBUaGUgcHJpb3JpdHkgaXMgc3RpbGwgaW1wb3J0YW50LCB0aG91Z2guIFdoZW4gcHJvY2Vzc2luZyB0aGUgdXBkYXRlIHF1ZXVlXG4vLyBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSwgb25seSB0aGUgdXBkYXRlcyB3aXRoIHN1ZmZpY2llbnQgcHJpb3JpdHkgYXJlXG4vLyBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0LiBJZiB3ZSBza2lwIGFuIHVwZGF0ZSBiZWNhdXNlIGl0IGhhcyBpbnN1ZmZpY2llbnRcbi8vIHByaW9yaXR5LCBpdCByZW1haW5zIGluIHRoZSBxdWV1ZSB0byBiZSBwcm9jZXNzZWQgbGF0ZXIsIGR1cmluZyBhIGxvd2VyXG4vLyBwcmlvcml0eSByZW5kZXIuIENydWNpYWxseSwgYWxsIHVwZGF0ZXMgc3Vic2VxdWVudCB0byBhIHNraXBwZWQgdXBkYXRlIGFsc29cbi8vIHJlbWFpbiBpbiB0aGUgcXVldWUgKnJlZ2FyZGxlc3Mgb2YgdGhlaXIgcHJpb3JpdHkqLiBUaGF0IG1lYW5zIGhpZ2ggcHJpb3JpdHlcbi8vIHVwZGF0ZXMgYXJlIHNvbWV0aW1lcyBwcm9jZXNzZWQgdHdpY2UsIGF0IHR3byBzZXBhcmF0ZSBwcmlvcml0aWVzLiBXZSBhbHNvXG4vLyBrZWVwIHRyYWNrIG9mIGEgYmFzZSBzdGF0ZSwgdGhhdCByZXByZXNlbnRzIHRoZSBzdGF0ZSBiZWZvcmUgdGhlIGZpcnN0XG4vLyB1cGRhdGUgaW4gdGhlIHF1ZXVlIGlzIGFwcGxpZWQuXG4vL1xuLy8gRm9yIGV4YW1wbGU6XG4vL1xuLy8gICBHaXZlbiBhIGJhc2Ugc3RhdGUgb2YgJycsIGFuZCB0aGUgZm9sbG93aW5nIHF1ZXVlIG9mIHVwZGF0ZXNcbi8vXG4vLyAgICAgQTEgLSBCMiAtIEMxIC0gRDJcbi8vXG4vLyAgIHdoZXJlIHRoZSBudW1iZXIgaW5kaWNhdGVzIHRoZSBwcmlvcml0eSwgYW5kIHRoZSB1cGRhdGUgaXMgYXBwbGllZCB0byB0aGVcbi8vICAgcHJldmlvdXMgc3RhdGUgYnkgYXBwZW5kaW5nIGEgbGV0dGVyLCBSZWFjdCB3aWxsIHByb2Nlc3MgdGhlc2UgdXBkYXRlcyBhc1xuLy8gICB0d28gc2VwYXJhdGUgcmVuZGVycywgb25lIHBlciBkaXN0aW5jdCBwcmlvcml0eSBsZXZlbDpcbi8vXG4vLyAgIEZpcnN0IHJlbmRlciwgYXQgcHJpb3JpdHkgMTpcbi8vICAgICBCYXNlIHN0YXRlOiAnJ1xuLy8gICAgIFVwZGF0ZXM6IFtBMSwgQzFdXG4vLyAgICAgUmVzdWx0IHN0YXRlOiAnQUMnXG4vL1xuLy8gICBTZWNvbmQgcmVuZGVyLCBhdCBwcmlvcml0eSAyOlxuLy8gICAgIEJhc2Ugc3RhdGU6ICdBJyAgICAgICAgICAgIDwtICBUaGUgYmFzZSBzdGF0ZSBkb2VzIG5vdCBpbmNsdWRlIEMxLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIEIyIHdhcyBza2lwcGVkLlxuLy8gICAgIFVwZGF0ZXM6IFtCMiwgQzEsIEQyXSAgICAgIDwtICBDMSB3YXMgcmViYXNlZCBvbiB0b3Agb2YgQjJcbi8vICAgICBSZXN1bHQgc3RhdGU6ICdBQkNEJ1xuLy9cbi8vIEJlY2F1c2Ugd2UgcHJvY2VzcyB1cGRhdGVzIGluIGluc2VydGlvbiBvcmRlciwgYW5kIHJlYmFzZSBoaWdoIHByaW9yaXR5XG4vLyB1cGRhdGVzIHdoZW4gcHJlY2VkaW5nIHVwZGF0ZXMgYXJlIHNraXBwZWQsIHRoZSBmaW5hbCByZXN1bHQgaXMgZGV0ZXJtaW5pc3RpY1xuLy8gcmVnYXJkbGVzcyBvZiBwcmlvcml0eS4gSW50ZXJtZWRpYXRlIHN0YXRlIG1heSB2YXJ5IGFjY29yZGluZyB0byBzeXN0ZW1cbi8vIHJlc291cmNlcywgYnV0IHRoZSBmaW5hbCBzdGF0ZSBpcyBhbHdheXMgdGhlIHNhbWUuXG5cbnZhciBVcGRhdGVTdGF0ZSA9IDA7XG52YXIgUmVwbGFjZVN0YXRlID0gMTtcbnZhciBGb3JjZVVwZGF0ZSA9IDI7XG52YXIgQ2FwdHVyZVVwZGF0ZSA9IDM7XG5cbi8vIEdsb2JhbCBzdGF0ZSB0aGF0IGlzIHJlc2V0IGF0IHRoZSBiZWdpbm5pbmcgb2YgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYC5cbi8vIEl0IHNob3VsZCBvbmx5IGJlIHJlYWQgcmlnaHQgYWZ0ZXIgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYCwgdmlhXG4vLyBgY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZ2AuXG52YXIgaGFzRm9yY2VVcGRhdGUgPSBmYWxzZTtcblxudmFyIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGUgPSB2b2lkIDA7XG52YXIgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gdm9pZCAwO1xudmFyIHJlc2V0Q3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gdm9pZCAwO1xue1xuICBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlID0gZmFsc2U7XG4gIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG4gIHJlc2V0Q3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gZnVuY3Rpb24gKCkge1xuICAgIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVVwZGF0ZVF1ZXVlKGJhc2VTdGF0ZSkge1xuICB2YXIgcXVldWUgPSB7XG4gICAgYmFzZVN0YXRlOiBiYXNlU3RhdGUsXG4gICAgZmlyc3RVcGRhdGU6IG51bGwsXG4gICAgbGFzdFVwZGF0ZTogbnVsbCxcbiAgICBmaXJzdENhcHR1cmVkVXBkYXRlOiBudWxsLFxuICAgIGxhc3RDYXB0dXJlZFVwZGF0ZTogbnVsbCxcbiAgICBmaXJzdEVmZmVjdDogbnVsbCxcbiAgICBsYXN0RWZmZWN0OiBudWxsLFxuICAgIGZpcnN0Q2FwdHVyZWRFZmZlY3Q6IG51bGwsXG4gICAgbGFzdENhcHR1cmVkRWZmZWN0OiBudWxsXG4gIH07XG4gIHJldHVybiBxdWV1ZTtcbn1cblxuZnVuY3Rpb24gY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50UXVldWUpIHtcbiAgdmFyIHF1ZXVlID0ge1xuICAgIGJhc2VTdGF0ZTogY3VycmVudFF1ZXVlLmJhc2VTdGF0ZSxcbiAgICBmaXJzdFVwZGF0ZTogY3VycmVudFF1ZXVlLmZpcnN0VXBkYXRlLFxuICAgIGxhc3RVcGRhdGU6IGN1cnJlbnRRdWV1ZS5sYXN0VXBkYXRlLFxuXG4gICAgLy8gVE9ETzogV2l0aCByZXN1bWluZywgaWYgd2UgYmFpbCBvdXQgYW5kIHJlc3VzZSB0aGUgY2hpbGQgdHJlZSwgd2Ugc2hvdWxkXG4gICAgLy8ga2VlcCB0aGVzZSBlZmZlY3RzLlxuICAgIGZpcnN0Q2FwdHVyZWRVcGRhdGU6IG51bGwsXG4gICAgbGFzdENhcHR1cmVkVXBkYXRlOiBudWxsLFxuXG4gICAgZmlyc3RFZmZlY3Q6IG51bGwsXG4gICAgbGFzdEVmZmVjdDogbnVsbCxcblxuICAgIGZpcnN0Q2FwdHVyZWRFZmZlY3Q6IG51bGwsXG4gICAgbGFzdENhcHR1cmVkRWZmZWN0OiBudWxsXG4gIH07XG4gIHJldHVybiBxdWV1ZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVXBkYXRlKGV4cGlyYXRpb25UaW1lKSB7XG4gIHJldHVybiB7XG4gICAgZXhwaXJhdGlvblRpbWU6IGV4cGlyYXRpb25UaW1lLFxuXG4gICAgdGFnOiBVcGRhdGVTdGF0ZSxcbiAgICBwYXlsb2FkOiBudWxsLFxuICAgIGNhbGxiYWNrOiBudWxsLFxuXG4gICAgbmV4dDogbnVsbCxcbiAgICBuZXh0RWZmZWN0OiBudWxsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFwcGVuZFVwZGF0ZVRvUXVldWUocXVldWUsIHVwZGF0ZSkge1xuICAvLyBBcHBlbmQgdGhlIHVwZGF0ZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuICBpZiAocXVldWUubGFzdFVwZGF0ZSA9PT0gbnVsbCkge1xuICAgIC8vIFF1ZXVlIGlzIGVtcHR5XG4gICAgcXVldWUuZmlyc3RVcGRhdGUgPSBxdWV1ZS5sYXN0VXBkYXRlID0gdXBkYXRlO1xuICB9IGVsc2Uge1xuICAgIHF1ZXVlLmxhc3RVcGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgICBxdWV1ZS5sYXN0VXBkYXRlID0gdXBkYXRlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSkge1xuICAvLyBVcGRhdGUgcXVldWVzIGFyZSBjcmVhdGVkIGxhemlseS5cbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgdmFyIHF1ZXVlMSA9IHZvaWQgMDtcbiAgdmFyIHF1ZXVlMiA9IHZvaWQgMDtcbiAgaWYgKGFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgIC8vIFRoZXJlJ3Mgb25seSBvbmUgZmliZXIuXG4gICAgcXVldWUxID0gZmliZXIudXBkYXRlUXVldWU7XG4gICAgcXVldWUyID0gbnVsbDtcbiAgICBpZiAocXVldWUxID09PSBudWxsKSB7XG4gICAgICBxdWV1ZTEgPSBmaWJlci51cGRhdGVRdWV1ZSA9IGNyZWF0ZVVwZGF0ZVF1ZXVlKGZpYmVyLm1lbW9pemVkU3RhdGUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGVyZSBhcmUgdHdvIG93bmVycy5cbiAgICBxdWV1ZTEgPSBmaWJlci51cGRhdGVRdWV1ZTtcbiAgICBxdWV1ZTIgPSBhbHRlcm5hdGUudXBkYXRlUXVldWU7XG4gICAgaWYgKHF1ZXVlMSA9PT0gbnVsbCkge1xuICAgICAgaWYgKHF1ZXVlMiA9PT0gbnVsbCkge1xuICAgICAgICAvLyBOZWl0aGVyIGZpYmVyIGhhcyBhbiB1cGRhdGUgcXVldWUuIENyZWF0ZSBuZXcgb25lcy5cbiAgICAgICAgcXVldWUxID0gZmliZXIudXBkYXRlUXVldWUgPSBjcmVhdGVVcGRhdGVRdWV1ZShmaWJlci5tZW1vaXplZFN0YXRlKTtcbiAgICAgICAgcXVldWUyID0gYWx0ZXJuYXRlLnVwZGF0ZVF1ZXVlID0gY3JlYXRlVXBkYXRlUXVldWUoYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gT25seSBvbmUgZmliZXIgaGFzIGFuIHVwZGF0ZSBxdWV1ZS4gQ2xvbmUgdG8gY3JlYXRlIGEgbmV3IG9uZS5cbiAgICAgICAgcXVldWUxID0gZmliZXIudXBkYXRlUXVldWUgPSBjbG9uZVVwZGF0ZVF1ZXVlKHF1ZXVlMik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChxdWV1ZTIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gT25seSBvbmUgZmliZXIgaGFzIGFuIHVwZGF0ZSBxdWV1ZS4gQ2xvbmUgdG8gY3JlYXRlIGEgbmV3IG9uZS5cbiAgICAgICAgcXVldWUyID0gYWx0ZXJuYXRlLnVwZGF0ZVF1ZXVlID0gY2xvbmVVcGRhdGVRdWV1ZShxdWV1ZTEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQm90aCBvd25lcnMgaGF2ZSBhbiB1cGRhdGUgcXVldWUuXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChxdWV1ZTIgPT09IG51bGwgfHwgcXVldWUxID09PSBxdWV1ZTIpIHtcbiAgICAvLyBUaGVyZSdzIG9ubHkgYSBzaW5nbGUgcXVldWUuXG4gICAgYXBwZW5kVXBkYXRlVG9RdWV1ZShxdWV1ZTEsIHVwZGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhlcmUgYXJlIHR3byBxdWV1ZXMuIFdlIG5lZWQgdG8gYXBwZW5kIHRoZSB1cGRhdGUgdG8gYm90aCBxdWV1ZXMsXG4gICAgLy8gd2hpbGUgYWNjb3VudGluZyBmb3IgdGhlIHBlcnNpc3RlbnQgc3RydWN0dXJlIG9mIHRoZSBsaXN0IOKAlCB3ZSBkb24ndFxuICAgIC8vIHdhbnQgdGhlIHNhbWUgdXBkYXRlIHRvIGJlIGFkZGVkIG11bHRpcGxlIHRpbWVzLlxuICAgIGlmIChxdWV1ZTEubGFzdFVwZGF0ZSA9PT0gbnVsbCB8fCBxdWV1ZTIubGFzdFVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gT25lIG9mIHRoZSBxdWV1ZXMgaXMgbm90IGVtcHR5LiBXZSBtdXN0IGFkZCB0aGUgdXBkYXRlIHRvIGJvdGggcXVldWVzLlxuICAgICAgYXBwZW5kVXBkYXRlVG9RdWV1ZShxdWV1ZTEsIHVwZGF0ZSk7XG4gICAgICBhcHBlbmRVcGRhdGVUb1F1ZXVlKHF1ZXVlMiwgdXBkYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQm90aCBxdWV1ZXMgYXJlIG5vbi1lbXB0eS4gVGhlIGxhc3QgdXBkYXRlIGlzIHRoZSBzYW1lIGluIGJvdGggbGlzdHMsXG4gICAgICAvLyBiZWNhdXNlIG9mIHN0cnVjdHVyYWwgc2hhcmluZy4gU28sIG9ubHkgYXBwZW5kIHRvIG9uZSBvZiB0aGUgbGlzdHMuXG4gICAgICBhcHBlbmRVcGRhdGVUb1F1ZXVlKHF1ZXVlMSwgdXBkYXRlKTtcbiAgICAgIC8vIEJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHVwZGF0ZSB0aGUgYGxhc3RVcGRhdGVgIHBvaW50ZXIgb2YgcXVldWUyLlxuICAgICAgcXVldWUyLmxhc3RVcGRhdGUgPSB1cGRhdGU7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50ICYmIChjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPT09IHF1ZXVlMSB8fCBxdWV1ZTIgIT09IG51bGwgJiYgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID09PSBxdWV1ZTIpICYmICFkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlKSB7XG4gICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdBbiB1cGRhdGUgKHNldFN0YXRlLCByZXBsYWNlU3RhdGUsIG9yIGZvcmNlVXBkYXRlKSB3YXMgc2NoZWR1bGVkICcgKyAnZnJvbSBpbnNpZGUgYW4gdXBkYXRlIGZ1bmN0aW9uLiBVcGRhdGUgZnVuY3Rpb25zIHNob3VsZCBiZSBwdXJlLCAnICsgJ3dpdGggemVybyBzaWRlLWVmZmVjdHMuIENvbnNpZGVyIHVzaW5nIGNvbXBvbmVudERpZFVwZGF0ZSBvciBhICcgKyAnY2FsbGJhY2suJyk7XG4gICAgICBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCB1cGRhdGUpIHtcbiAgLy8gQ2FwdHVyZWQgdXBkYXRlcyBnbyBpbnRvIGEgc2VwYXJhdGUgbGlzdCwgYW5kIG9ubHkgb24gdGhlIHdvcmstaW4tXG4gIC8vIHByb2dyZXNzIHF1ZXVlLlxuICB2YXIgd29ya0luUHJvZ3Jlc3NRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICBpZiAod29ya0luUHJvZ3Jlc3NRdWV1ZSA9PT0gbnVsbCkge1xuICAgIHdvcmtJblByb2dyZXNzUXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGNyZWF0ZVVwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUpO1xuICB9IGVsc2Uge1xuICAgIC8vIFRPRE86IEkgcHV0IHRoaXMgaGVyZSByYXRoZXIgdGhhbiBjcmVhdGVXb3JrSW5Qcm9ncmVzcyBzbyB0aGF0IHdlIGRvbid0XG4gICAgLy8gY2xvbmUgdGhlIHF1ZXVlIHVubmVjZXNzYXJpbHkuIFRoZXJlJ3MgcHJvYmFibHkgYSBiZXR0ZXIgd2F5IHRvXG4gICAgLy8gc3RydWN0dXJlIHRoaXMuXG4gICAgd29ya0luUHJvZ3Jlc3NRdWV1ZSA9IGVuc3VyZVdvcmtJblByb2dyZXNzUXVldWVJc0FDbG9uZSh3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3NRdWV1ZSk7XG4gIH1cblxuICAvLyBBcHBlbmQgdGhlIHVwZGF0ZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuICBpZiAod29ya0luUHJvZ3Jlc3NRdWV1ZS5sYXN0Q2FwdHVyZWRVcGRhdGUgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCByZW5kZXIgcGhhc2UgdXBkYXRlXG4gICAgd29ya0luUHJvZ3Jlc3NRdWV1ZS5maXJzdENhcHR1cmVkVXBkYXRlID0gd29ya0luUHJvZ3Jlc3NRdWV1ZS5sYXN0Q2FwdHVyZWRVcGRhdGUgPSB1cGRhdGU7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3NRdWV1ZS5sYXN0Q2FwdHVyZWRVcGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgICB3b3JrSW5Qcm9ncmVzc1F1ZXVlLmxhc3RDYXB0dXJlZFVwZGF0ZSA9IHVwZGF0ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbnN1cmVXb3JrSW5Qcm9ncmVzc1F1ZXVlSXNBQ2xvbmUod29ya0luUHJvZ3Jlc3MsIHF1ZXVlKSB7XG4gIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIC8vIElmIHRoZSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIGlzIGVxdWFsIHRvIHRoZSBjdXJyZW50IHF1ZXVlLFxuICAgIC8vIHdlIG5lZWQgdG8gY2xvbmUgaXQgZmlyc3QuXG4gICAgaWYgKHF1ZXVlID09PSBjdXJyZW50LnVwZGF0ZVF1ZXVlKSB7XG4gICAgICBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY2xvbmVVcGRhdGVRdWV1ZShxdWV1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBxdWV1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdGVGcm9tVXBkYXRlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgdXBkYXRlLCBwcmV2U3RhdGUsIG5leHRQcm9wcywgaW5zdGFuY2UpIHtcbiAgc3dpdGNoICh1cGRhdGUudGFnKSB7XG4gICAgY2FzZSBSZXBsYWNlU3RhdGU6XG4gICAgICB7XG4gICAgICAgIHZhciBfcGF5bG9hZCA9IHVwZGF0ZS5wYXlsb2FkO1xuICAgICAgICBpZiAodHlwZW9mIF9wYXlsb2FkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gVXBkYXRlciBmdW5jdGlvblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICAgIGlmIChkZWJ1Z1JlbmRlclBoYXNlU2lkZUVmZmVjdHMgfHwgZGVidWdSZW5kZXJQaGFzZVNpZGVFZmZlY3RzRm9yU3RyaWN0TW9kZSAmJiB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgICAgICAgICBfcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBuZXh0U3RhdGUgPSBfcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG4gICAgICAgICAge1xuICAgICAgICAgICAgZXhpdERpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXh0U3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3RhdGUgb2JqZWN0XG4gICAgICAgIHJldHVybiBfcGF5bG9hZDtcbiAgICAgIH1cbiAgICBjYXNlIENhcHR1cmVVcGRhdGU6XG4gICAgICB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyA9IHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcbiAgICAgIH1cbiAgICAvLyBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaFxuICAgIGNhc2UgVXBkYXRlU3RhdGU6XG4gICAgICB7XG4gICAgICAgIHZhciBfcGF5bG9hZDIgPSB1cGRhdGUucGF5bG9hZDtcbiAgICAgICAgdmFyIHBhcnRpYWxTdGF0ZSA9IHZvaWQgMDtcbiAgICAgICAgaWYgKHR5cGVvZiBfcGF5bG9hZDIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBVcGRhdGVyIGZ1bmN0aW9uXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgICAgaWYgKGRlYnVnUmVuZGVyUGhhc2VTaWRlRWZmZWN0cyB8fCBkZWJ1Z1JlbmRlclBoYXNlU2lkZUVmZmVjdHNGb3JTdHJpY3RNb2RlICYmIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICAgICAgICAgIF9wYXlsb2FkMi5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhcnRpYWxTdGF0ZSA9IF9wYXlsb2FkMi5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG4gICAgICAgICAge1xuICAgICAgICAgICAgZXhpdERpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFBhcnRpYWwgc3RhdGUgb2JqZWN0XG4gICAgICAgICAgcGFydGlhbFN0YXRlID0gX3BheWxvYWQyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0aWFsU3RhdGUgPT09IG51bGwgfHwgcGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBOdWxsIGFuZCB1bmRlZmluZWQgYXJlIHRyZWF0ZWQgYXMgbm8tb3BzLlxuICAgICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWVyZ2UgdGhlIHBhcnRpYWwgc3RhdGUgYW5kIHRoZSBwcmV2aW91cyBzdGF0ZS5cbiAgICAgICAgcmV0dXJuIF9hc3NpZ24oe30sIHByZXZTdGF0ZSwgcGFydGlhbFN0YXRlKTtcbiAgICAgIH1cbiAgICBjYXNlIEZvcmNlVXBkYXRlOlxuICAgICAge1xuICAgICAgICBoYXNGb3JjZVVwZGF0ZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIHByZXZTdGF0ZTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgcHJvcHMsIGluc3RhbmNlLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xuXG4gIHF1ZXVlID0gZW5zdXJlV29ya0luUHJvZ3Jlc3NRdWV1ZUlzQUNsb25lKHdvcmtJblByb2dyZXNzLCBxdWV1ZSk7XG5cbiAge1xuICAgIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IHF1ZXVlO1xuICB9XG5cbiAgLy8gVGhlc2UgdmFsdWVzIG1heSBjaGFuZ2UgYXMgd2UgcHJvY2VzcyB0aGUgcXVldWUuXG4gIHZhciBuZXdCYXNlU3RhdGUgPSBxdWV1ZS5iYXNlU3RhdGU7XG4gIHZhciBuZXdGaXJzdFVwZGF0ZSA9IG51bGw7XG4gIHZhciBuZXdFeHBpcmF0aW9uVGltZSA9IE5vV29yaztcblxuICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGxpc3Qgb2YgdXBkYXRlcyB0byBjb21wdXRlIHRoZSByZXN1bHQuXG4gIHZhciB1cGRhdGUgPSBxdWV1ZS5maXJzdFVwZGF0ZTtcbiAgdmFyIHJlc3VsdFN0YXRlID0gbmV3QmFzZVN0YXRlO1xuICB3aGlsZSAodXBkYXRlICE9PSBudWxsKSB7XG4gICAgdmFyIHVwZGF0ZUV4cGlyYXRpb25UaW1lID0gdXBkYXRlLmV4cGlyYXRpb25UaW1lO1xuICAgIGlmICh1cGRhdGVFeHBpcmF0aW9uVGltZSA8IHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAvLyBUaGlzIHVwZGF0ZSBkb2VzIG5vdCBoYXZlIHN1ZmZpY2llbnQgcHJpb3JpdHkuIFNraXAgaXQuXG4gICAgICBpZiAobmV3Rmlyc3RVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3Qgc2tpcHBlZCB1cGRhdGUuIEl0IHdpbGwgYmUgdGhlIGZpcnN0IHVwZGF0ZSBpblxuICAgICAgICAvLyB0aGUgbmV3IGxpc3QuXG4gICAgICAgIG5ld0ZpcnN0VXBkYXRlID0gdXBkYXRlO1xuICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUgdGhhdCB3YXMgc2tpcHBlZCwgdGhlIGN1cnJlbnQgcmVzdWx0XG4gICAgICAgIC8vIGlzIHRoZSBuZXcgYmFzZSBzdGF0ZS5cbiAgICAgICAgbmV3QmFzZVN0YXRlID0gcmVzdWx0U3RhdGU7XG4gICAgICB9XG4gICAgICAvLyBTaW5jZSB0aGlzIHVwZGF0ZSB3aWxsIHJlbWFpbiBpbiB0aGUgbGlzdCwgdXBkYXRlIHRoZSByZW1haW5pbmdcbiAgICAgIC8vIGV4cGlyYXRpb24gdGltZS5cbiAgICAgIGlmIChuZXdFeHBpcmF0aW9uVGltZSA8IHVwZGF0ZUV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgIG5ld0V4cGlyYXRpb25UaW1lID0gdXBkYXRlRXhwaXJhdGlvblRpbWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgdXBkYXRlIGRvZXMgaGF2ZSBzdWZmaWNpZW50IHByaW9yaXR5LiBQcm9jZXNzIGl0IGFuZCBjb21wdXRlXG4gICAgICAvLyBhIG5ldyByZXN1bHQuXG4gICAgICByZXN1bHRTdGF0ZSA9IGdldFN0YXRlRnJvbVVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgcXVldWUsIHVwZGF0ZSwgcmVzdWx0U3RhdGUsIHByb3BzLCBpbnN0YW5jZSk7XG4gICAgICB2YXIgX2NhbGxiYWNrID0gdXBkYXRlLmNhbGxiYWNrO1xuICAgICAgaWYgKF9jYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gQ2FsbGJhY2s7XG4gICAgICAgIC8vIFNldCB0aGlzIHRvIG51bGwsIGluIGNhc2UgaXQgd2FzIG11dGF0ZWQgZHVyaW5nIGFuIGFib3J0ZWQgcmVuZGVyLlxuICAgICAgICB1cGRhdGUubmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICAgIGlmIChxdWV1ZS5sYXN0RWZmZWN0ID09PSBudWxsKSB7XG4gICAgICAgICAgcXVldWUuZmlyc3RFZmZlY3QgPSBxdWV1ZS5sYXN0RWZmZWN0ID0gdXBkYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHF1ZXVlLmxhc3RFZmZlY3QubmV4dEVmZmVjdCA9IHVwZGF0ZTtcbiAgICAgICAgICBxdWV1ZS5sYXN0RWZmZWN0ID0gdXBkYXRlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIENvbnRpbnVlIHRvIHRoZSBuZXh0IHVwZGF0ZS5cbiAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcbiAgfVxuXG4gIC8vIFNlcGFyYXRlbHksIGl0ZXJhdGUgdGhvdWdoIHRoZSBsaXN0IG9mIGNhcHR1cmVkIHVwZGF0ZXMuXG4gIHZhciBuZXdGaXJzdENhcHR1cmVkVXBkYXRlID0gbnVsbDtcbiAgdXBkYXRlID0gcXVldWUuZmlyc3RDYXB0dXJlZFVwZGF0ZTtcbiAgd2hpbGUgKHVwZGF0ZSAhPT0gbnVsbCkge1xuICAgIHZhciBfdXBkYXRlRXhwaXJhdGlvblRpbWUgPSB1cGRhdGUuZXhwaXJhdGlvblRpbWU7XG4gICAgaWYgKF91cGRhdGVFeHBpcmF0aW9uVGltZSA8IHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAvLyBUaGlzIHVwZGF0ZSBkb2VzIG5vdCBoYXZlIHN1ZmZpY2llbnQgcHJpb3JpdHkuIFNraXAgaXQuXG4gICAgICBpZiAobmV3Rmlyc3RDYXB0dXJlZFVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBza2lwcGVkIGNhcHR1cmVkIHVwZGF0ZS4gSXQgd2lsbCBiZSB0aGUgZmlyc3RcbiAgICAgICAgLy8gdXBkYXRlIGluIHRoZSBuZXcgbGlzdC5cbiAgICAgICAgbmV3Rmlyc3RDYXB0dXJlZFVwZGF0ZSA9IHVwZGF0ZTtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlIHRoYXQgd2FzIHNraXBwZWQsIHRoZSBjdXJyZW50IHJlc3VsdCBpc1xuICAgICAgICAvLyB0aGUgbmV3IGJhc2Ugc3RhdGUuXG4gICAgICAgIGlmIChuZXdGaXJzdFVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIG5ld0Jhc2VTdGF0ZSA9IHJlc3VsdFN0YXRlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTaW5jZSB0aGlzIHVwZGF0ZSB3aWxsIHJlbWFpbiBpbiB0aGUgbGlzdCwgdXBkYXRlIHRoZSByZW1haW5pbmdcbiAgICAgIC8vIGV4cGlyYXRpb24gdGltZS5cbiAgICAgIGlmIChuZXdFeHBpcmF0aW9uVGltZSA8IF91cGRhdGVFeHBpcmF0aW9uVGltZSkge1xuICAgICAgICBuZXdFeHBpcmF0aW9uVGltZSA9IF91cGRhdGVFeHBpcmF0aW9uVGltZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyB1cGRhdGUgZG9lcyBoYXZlIHN1ZmZpY2llbnQgcHJpb3JpdHkuIFByb2Nlc3MgaXQgYW5kIGNvbXB1dGVcbiAgICAgIC8vIGEgbmV3IHJlc3VsdC5cbiAgICAgIHJlc3VsdFN0YXRlID0gZ2V0U3RhdGVGcm9tVXBkYXRlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgdXBkYXRlLCByZXN1bHRTdGF0ZSwgcHJvcHMsIGluc3RhbmNlKTtcbiAgICAgIHZhciBfY2FsbGJhY2syID0gdXBkYXRlLmNhbGxiYWNrO1xuICAgICAgaWYgKF9jYWxsYmFjazIgIT09IG51bGwpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnIHw9IENhbGxiYWNrO1xuICAgICAgICAvLyBTZXQgdGhpcyB0byBudWxsLCBpbiBjYXNlIGl0IHdhcyBtdXRhdGVkIGR1cmluZyBhbiBhYm9ydGVkIHJlbmRlci5cbiAgICAgICAgdXBkYXRlLm5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgICBpZiAocXVldWUubGFzdENhcHR1cmVkRWZmZWN0ID09PSBudWxsKSB7XG4gICAgICAgICAgcXVldWUuZmlyc3RDYXB0dXJlZEVmZmVjdCA9IHF1ZXVlLmxhc3RDYXB0dXJlZEVmZmVjdCA9IHVwZGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBxdWV1ZS5sYXN0Q2FwdHVyZWRFZmZlY3QubmV4dEVmZmVjdCA9IHVwZGF0ZTtcbiAgICAgICAgICBxdWV1ZS5sYXN0Q2FwdHVyZWRFZmZlY3QgPSB1cGRhdGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gIH1cblxuICBpZiAobmV3Rmlyc3RVcGRhdGUgPT09IG51bGwpIHtcbiAgICBxdWV1ZS5sYXN0VXBkYXRlID0gbnVsbDtcbiAgfVxuICBpZiAobmV3Rmlyc3RDYXB0dXJlZFVwZGF0ZSA9PT0gbnVsbCkge1xuICAgIHF1ZXVlLmxhc3RDYXB0dXJlZFVwZGF0ZSA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnIHw9IENhbGxiYWNrO1xuICB9XG4gIGlmIChuZXdGaXJzdFVwZGF0ZSA9PT0gbnVsbCAmJiBuZXdGaXJzdENhcHR1cmVkVXBkYXRlID09PSBudWxsKSB7XG4gICAgLy8gV2UgcHJvY2Vzc2VkIGV2ZXJ5IHVwZGF0ZSwgd2l0aG91dCBza2lwcGluZy4gVGhhdCBtZWFucyB0aGUgbmV3IGJhc2VcbiAgICAvLyBzdGF0ZSBpcyB0aGUgc2FtZSBhcyB0aGUgcmVzdWx0IHN0YXRlLlxuICAgIG5ld0Jhc2VTdGF0ZSA9IHJlc3VsdFN0YXRlO1xuICB9XG5cbiAgcXVldWUuYmFzZVN0YXRlID0gbmV3QmFzZVN0YXRlO1xuICBxdWV1ZS5maXJzdFVwZGF0ZSA9IG5ld0ZpcnN0VXBkYXRlO1xuICBxdWV1ZS5maXJzdENhcHR1cmVkVXBkYXRlID0gbmV3Rmlyc3RDYXB0dXJlZFVwZGF0ZTtcblxuICAvLyBTZXQgdGhlIHJlbWFpbmluZyBleHBpcmF0aW9uIHRpbWUgdG8gYmUgd2hhdGV2ZXIgaXMgcmVtYWluaW5nIGluIHRoZSBxdWV1ZS5cbiAgLy8gVGhpcyBzaG91bGQgYmUgZmluZSBiZWNhdXNlIHRoZSBvbmx5IHR3byBvdGhlciB0aGluZ3MgdGhhdCBjb250cmlidXRlIHRvXG4gIC8vIGV4cGlyYXRpb24gdGltZSBhcmUgcHJvcHMgYW5kIGNvbnRleHQuIFdlJ3JlIGFscmVhZHkgaW4gdGhlIG1pZGRsZSBvZiB0aGVcbiAgLy8gYmVnaW4gcGhhc2UgYnkgdGhlIHRpbWUgd2Ugc3RhcnQgcHJvY2Vzc2luZyB0aGUgcXVldWUsIHNvIHdlJ3ZlIGFscmVhZHlcbiAgLy8gZGVhbHQgd2l0aCB0aGUgcHJvcHMuIENvbnRleHQgaW4gY29tcG9uZW50cyB0aGF0IHNwZWNpZnlcbiAgLy8gc2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIHRyaWNreTsgYnV0IHdlJ2xsIGhhdmUgdG8gYWNjb3VudCBmb3JcbiAgLy8gdGhhdCByZWdhcmRsZXNzLlxuICB3b3JrSW5Qcm9ncmVzcy5leHBpcmF0aW9uVGltZSA9IG5ld0V4cGlyYXRpb25UaW1lO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gcmVzdWx0U3RhdGU7XG5cbiAge1xuICAgIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICEodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSA/IGludmFyaWFudChmYWxzZSwgJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIGFzIGNhbGxiYWNrLiBFeHBlY3RlZCBhIGZ1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcycsIGNhbGxiYWNrKSA6IHZvaWQgMDtcbiAgY2FsbGJhY2suY2FsbChjb250ZXh0KTtcbn1cblxuZnVuY3Rpb24gcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKSB7XG4gIGhhc0ZvcmNlVXBkYXRlID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSB7XG4gIHJldHVybiBoYXNGb3JjZVVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFF1ZXVlLCBpbnN0YW5jZSwgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgLy8gSWYgdGhlIGZpbmlzaGVkIHJlbmRlciBpbmNsdWRlZCBjYXB0dXJlZCB1cGRhdGVzLCBhbmQgdGhlcmUgYXJlIHN0aWxsXG4gIC8vIGxvd2VyIHByaW9yaXR5IHVwZGF0ZXMgbGVmdCBvdmVyLCB3ZSBuZWVkIHRvIGtlZXAgdGhlIGNhcHR1cmVkIHVwZGF0ZXNcbiAgLy8gaW4gdGhlIHF1ZXVlIHNvIHRoYXQgdGhleSBhcmUgcmViYXNlZCBhbmQgbm90IGRyb3BwZWQgb25jZSB3ZSBwcm9jZXNzIHRoZVxuICAvLyBxdWV1ZSBhZ2FpbiBhdCB0aGUgbG93ZXIgcHJpb3JpdHkuXG4gIGlmIChmaW5pc2hlZFF1ZXVlLmZpcnN0Q2FwdHVyZWRVcGRhdGUgIT09IG51bGwpIHtcbiAgICAvLyBKb2luIHRoZSBjYXB0dXJlZCB1cGRhdGUgbGlzdCB0byB0aGUgZW5kIG9mIHRoZSBub3JtYWwgbGlzdC5cbiAgICBpZiAoZmluaXNoZWRRdWV1ZS5sYXN0VXBkYXRlICE9PSBudWxsKSB7XG4gICAgICBmaW5pc2hlZFF1ZXVlLmxhc3RVcGRhdGUubmV4dCA9IGZpbmlzaGVkUXVldWUuZmlyc3RDYXB0dXJlZFVwZGF0ZTtcbiAgICAgIGZpbmlzaGVkUXVldWUubGFzdFVwZGF0ZSA9IGZpbmlzaGVkUXVldWUubGFzdENhcHR1cmVkVXBkYXRlO1xuICAgIH1cbiAgICAvLyBDbGVhciB0aGUgbGlzdCBvZiBjYXB0dXJlZCB1cGRhdGVzLlxuICAgIGZpbmlzaGVkUXVldWUuZmlyc3RDYXB0dXJlZFVwZGF0ZSA9IGZpbmlzaGVkUXVldWUubGFzdENhcHR1cmVkVXBkYXRlID0gbnVsbDtcbiAgfVxuXG4gIC8vIENvbW1pdCB0aGUgZWZmZWN0c1xuICBjb21taXRVcGRhdGVFZmZlY3RzKGZpbmlzaGVkUXVldWUuZmlyc3RFZmZlY3QsIGluc3RhbmNlKTtcbiAgZmluaXNoZWRRdWV1ZS5maXJzdEVmZmVjdCA9IGZpbmlzaGVkUXVldWUubGFzdEVmZmVjdCA9IG51bGw7XG5cbiAgY29tbWl0VXBkYXRlRWZmZWN0cyhmaW5pc2hlZFF1ZXVlLmZpcnN0Q2FwdHVyZWRFZmZlY3QsIGluc3RhbmNlKTtcbiAgZmluaXNoZWRRdWV1ZS5maXJzdENhcHR1cmVkRWZmZWN0ID0gZmluaXNoZWRRdWV1ZS5sYXN0Q2FwdHVyZWRFZmZlY3QgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21taXRVcGRhdGVFZmZlY3RzKGVmZmVjdCwgaW5zdGFuY2UpIHtcbiAgd2hpbGUgKGVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBfY2FsbGJhY2szID0gZWZmZWN0LmNhbGxiYWNrO1xuICAgIGlmIChfY2FsbGJhY2szICE9PSBudWxsKSB7XG4gICAgICBlZmZlY3QuY2FsbGJhY2sgPSBudWxsO1xuICAgICAgY2FsbENhbGxiYWNrKF9jYWxsYmFjazMsIGluc3RhbmNlKTtcbiAgICB9XG4gICAgZWZmZWN0ID0gZWZmZWN0Lm5leHRFZmZlY3Q7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2FwdHVyZWRWYWx1ZSh2YWx1ZSwgc291cmNlKSB7XG4gIC8vIElmIHRoZSB2YWx1ZSBpcyBhbiBlcnJvciwgY2FsbCB0aGlzIGZ1bmN0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIGl0IGlzIHRocm93blxuICAvLyBzbyB0aGUgc3RhY2sgaXMgYWNjdXJhdGUuXG4gIHJldHVybiB7XG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIHNvdXJjZTogc291cmNlLFxuICAgIHN0YWNrOiBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2Qoc291cmNlKVxuICB9O1xufVxuXG5mdW5jdGlvbiBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKSB7XG4gIC8vIFRhZyB0aGUgZmliZXIgd2l0aCBhbiB1cGRhdGUgZWZmZWN0LiBUaGlzIHR1cm5zIGEgUGxhY2VtZW50IGludG9cbiAgLy8gYSBQbGFjZW1lbnRBbmRVcGRhdGUuXG4gIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBVcGRhdGU7XG59XG5cbmZ1bmN0aW9uIG1hcmtSZWYkMSh3b3JrSW5Qcm9ncmVzcykge1xuICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gUmVmO1xufVxuXG52YXIgYXBwZW5kQWxsQ2hpbGRyZW4gPSB2b2lkIDA7XG52YXIgdXBkYXRlSG9zdENvbnRhaW5lciA9IHZvaWQgMDtcbnZhciB1cGRhdGVIb3N0Q29tcG9uZW50JDEgPSB2b2lkIDA7XG52YXIgdXBkYXRlSG9zdFRleHQkMSA9IHZvaWQgMDtcbmlmIChzdXBwb3J0c011dGF0aW9uKSB7XG4gIC8vIE11dGF0aW9uIG1vZGVcblxuICBhcHBlbmRBbGxDaGlsZHJlbiA9IGZ1bmN0aW9uIChwYXJlbnQsIHdvcmtJblByb2dyZXNzLCBuZWVkc1Zpc2liaWxpdHlUb2dnbGUsIGlzSGlkZGVuKSB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgY3JlYXRlZCBidXQgd2UgbmVlZCByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIHZhciBub2RlID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgICAgYXBwZW5kSW5pdGlhbENoaWxkKHBhcmVudCwgbm9kZS5zdGF0ZU5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgcG9ydGFsIGNoaWxkLCB0aGVuIHdlIGRvbid0IHdhbnQgdG8gdHJhdmVyc2VcbiAgICAgICAgLy8gZG93biBpdHMgY2hpbGRyZW4uIEluc3RlYWQsIHdlJ2xsIGdldCBpbnNlcnRpb25zIGZyb20gZWFjaCBjaGlsZCBpblxuICAgICAgICAvLyB0aGUgcG9ydGFsIGRpcmVjdGx5LlxuICAgICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUgPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfTtcblxuICB1cGRhdGVIb3N0Q29udGFpbmVyID0gZnVuY3Rpb24gKHdvcmtJblByb2dyZXNzKSB7XG4gICAgLy8gTm9vcFxuICB9O1xuICB1cGRhdGVIb3N0Q29tcG9uZW50JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGFuIGFsdGVybmF0ZSwgdGhhdCBtZWFucyB0aGlzIGlzIGFuIHVwZGF0ZSBhbmQgd2UgbmVlZCB0b1xuICAgIC8vIHNjaGVkdWxlIGEgc2lkZS1lZmZlY3QgdG8gZG8gdGhlIHVwZGF0ZXMuXG4gICAgdmFyIG9sZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICAgIGlmIChvbGRQcm9wcyA9PT0gbmV3UHJvcHMpIHtcbiAgICAgIC8vIEluIG11dGF0aW9uIG1vZGUsIHRoaXMgaXMgc3VmZmljaWVudCBmb3IgYSBiYWlsb3V0IGJlY2F1c2VcbiAgICAgIC8vIHdlIHdvbid0IHRvdWNoIHRoaXMgbm9kZSBldmVuIGlmIGNoaWxkcmVuIGNoYW5nZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgZ2V0IHVwZGF0ZWQgYmVjYXVzZSBvbmUgb2Ygb3VyIGNoaWxkcmVuIHVwZGF0ZWQsIHdlIGRvbid0XG4gICAgLy8gaGF2ZSBuZXdQcm9wcyBzbyB3ZSdsbCBoYXZlIHRvIHJldXNlIHRoZW0uXG4gICAgLy8gVE9ETzogU3BsaXQgdGhlIHVwZGF0ZSBBUEkgYXMgc2VwYXJhdGUgZm9yIHRoZSBwcm9wcyB2cy4gY2hpbGRyZW4uXG4gICAgLy8gRXZlbiBiZXR0ZXIgd291bGQgYmUgaWYgY2hpbGRyZW4gd2VyZW4ndCBzcGVjaWFsIGNhc2VkIGF0IGFsbCB0aG8uXG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgIHZhciBjdXJyZW50SG9zdENvbnRleHQgPSBnZXRIb3N0Q29udGV4dCgpO1xuICAgIC8vIFRPRE86IEV4cGVyaWVuY2luZyBhbiBlcnJvciB3aGVyZSBvbGRQcm9wcyBpcyBudWxsLiBTdWdnZXN0cyBhIGhvc3RcbiAgICAvLyBjb21wb25lbnQgaXMgaGl0dGluZyB0aGUgcmVzdW1lIHBhdGguIEZpZ3VyZSBvdXQgd2h5LiBQb3NzaWJseVxuICAgIC8vIHJlbGF0ZWQgdG8gYGhpZGRlbmAuXG4gICAgdmFyIHVwZGF0ZVBheWxvYWQgPSBwcmVwYXJlVXBkYXRlKGluc3RhbmNlLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0KTtcbiAgICAvLyBUT0RPOiBUeXBlIHRoaXMgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGNvbXBvbmVudC5cbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IHVwZGF0ZVBheWxvYWQ7XG4gICAgLy8gSWYgdGhlIHVwZGF0ZSBwYXlsb2FkIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEgY2hhbmdlIG9yIGlmIHRoZXJlXG4gICAgLy8gaXMgYSBuZXcgcmVmIHdlIG1hcmsgdGhpcyBhcyBhbiB1cGRhdGUuIEFsbCB0aGUgd29yayBpcyBkb25lIGluIGNvbW1pdFdvcmsuXG4gICAgaWYgKHVwZGF0ZVBheWxvYWQpIHtcbiAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfTtcbiAgdXBkYXRlSG9zdFRleHQkMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgb2xkVGV4dCwgbmV3VGV4dCkge1xuICAgIC8vIElmIHRoZSB0ZXh0IGRpZmZlcnMsIG1hcmsgaXQgYXMgYW4gdXBkYXRlLiBBbGwgdGhlIHdvcmsgaW4gZG9uZSBpbiBjb21taXRXb3JrLlxuICAgIGlmIChvbGRUZXh0ICE9PSBuZXdUZXh0KSB7XG4gICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG4gIH07XG59IGVsc2UgaWYgKHN1cHBvcnRzUGVyc2lzdGVuY2UpIHtcbiAgLy8gUGVyc2lzdGVudCBob3N0IHRyZWUgbW9kZVxuXG4gIGFwcGVuZEFsbENoaWxkcmVuID0gZnVuY3Rpb24gKHBhcmVudCwgd29ya0luUHJvZ3Jlc3MsIG5lZWRzVmlzaWJpbGl0eVRvZ2dsZSwgaXNIaWRkZW4pIHtcbiAgICAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBjcmVhdGVkIGJ1dCB3ZSBuZWVkIHJlY3Vyc2UgZG93biBpdHNcbiAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gICAgdmFyIG5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxhYmVsc1xuICAgICAgYnJhbmNoZXM6IGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBub2RlLnN0YXRlTm9kZTtcbiAgICAgICAgaWYgKG5lZWRzVmlzaWJpbGl0eVRvZ2dsZSkge1xuICAgICAgICAgIHZhciBwcm9wcyA9IG5vZGUubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICB2YXIgdHlwZSA9IG5vZGUudHlwZTtcbiAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgIC8vIFRoaXMgY2hpbGQgaXMgaW5zaWRlIGEgdGltZWQgb3V0IHRyZWUuIEhpZGUgaXQuXG4gICAgICAgICAgICBpbnN0YW5jZSA9IGNsb25lSGlkZGVuSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzLCBub2RlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhpcyBjaGlsZCB3YXMgcHJldmlvdXNseSBpbnNpZGUgYSB0aW1lZCBvdXQgdHJlZS4gSWYgaXQgd2FzIG5vdFxuICAgICAgICAgICAgLy8gdXBkYXRlZCBkdXJpbmcgdGhpcyByZW5kZXIsIGl0IG1heSBuZWVkIHRvIGJlIHVuaGlkZGVuLiBDbG9uZVxuICAgICAgICAgICAgLy8gYWdhaW4gdG8gYmUgc3VyZS5cbiAgICAgICAgICAgIGluc3RhbmNlID0gY2xvbmVVbmhpZGRlbkluc3RhbmNlKGluc3RhbmNlLCB0eXBlLCBwcm9wcywgbm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vZGUuc3RhdGVOb2RlID0gaW5zdGFuY2U7XG4gICAgICAgIH1cbiAgICAgICAgYXBwZW5kSW5pdGlhbENoaWxkKHBhcmVudCwgaW5zdGFuY2UpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgICAgdmFyIF9pbnN0YW5jZSA9IG5vZGUuc3RhdGVOb2RlO1xuICAgICAgICBpZiAobmVlZHNWaXNpYmlsaXR5VG9nZ2xlKSB7XG4gICAgICAgICAgdmFyIHRleHQgPSBub2RlLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgdmFyIHJvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG4gICAgICAgICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7XG4gICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICBfaW5zdGFuY2UgPSBjcmVhdGVIaWRkZW5UZXh0SW5zdGFuY2UodGV4dCwgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX2luc3RhbmNlID0gY3JlYXRlVGV4dEluc3RhbmNlKHRleHQsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vZGUuc3RhdGVOb2RlID0gX2luc3RhbmNlO1xuICAgICAgICB9XG4gICAgICAgIGFwcGVuZEluaXRpYWxDaGlsZChwYXJlbnQsIF9pbnN0YW5jZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSBwb3J0YWwgY2hpbGQsIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byB0cmF2ZXJzZVxuICAgICAgICAvLyBkb3duIGl0cyBjaGlsZHJlbi4gSW5zdGVhZCwgd2UnbGwgZ2V0IGluc2VydGlvbnMgZnJvbSBlYWNoIGNoaWxkIGluXG4gICAgICAgIC8vIHRoZSBwb3J0YWwgZGlyZWN0bHkuXG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgICB2YXIgY3VycmVudCA9IG5vZGUuYWx0ZXJuYXRlO1xuICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBvbGRTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgbmV3U3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIG9sZElzSGlkZGVuID0gb2xkU3RhdGUgIT09IG51bGw7XG4gICAgICAgICAgdmFyIG5ld0lzSGlkZGVuID0gbmV3U3RhdGUgIT09IG51bGw7XG4gICAgICAgICAgaWYgKG9sZElzSGlkZGVuICE9PSBuZXdJc0hpZGRlbikge1xuICAgICAgICAgICAgLy8gVGhlIHBsYWNlaG9sZGVyIGVpdGhlciBqdXN0IHRpbWVkIG91dCBvciBzd2l0Y2hlZCBiYWNrIHRvIHRoZSBub3JtYWxcbiAgICAgICAgICAgIC8vIGNoaWxkcmVuIGFmdGVyIGhhdmluZyBwcmV2aW91c2x5IHRpbWVkIG91dC4gVG9nZ2xlIHRoZSB2aXNpYmlsaXR5IG9mXG4gICAgICAgICAgICAvLyB0aGUgZGlyZWN0IGhvc3QgY2hpbGRyZW4uXG4gICAgICAgICAgICB2YXIgcHJpbWFyeUNoaWxkUGFyZW50ID0gbmV3SXNIaWRkZW4gPyBub2RlLmNoaWxkIDogbm9kZTtcbiAgICAgICAgICAgIGlmIChwcmltYXJ5Q2hpbGRQYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgYXBwZW5kQWxsQ2hpbGRyZW4ocGFyZW50LCBwcmltYXJ5Q2hpbGRQYXJlbnQsIHRydWUsIG5ld0lzSGlkZGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sYWJlbHNcbiAgICAgICAgICAgIGJyZWFrIGJyYW5jaGVzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIENvbnRpbnVlIHRyYXZlcnNpbmcgbGlrZSBub3JtYWxcbiAgICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBjb3JyZWN0IGJ1dCBGbG93IGlzIGNvbmZ1c2VkIGJ5IHRoZSBsYWJlbGVkIGJyZWFrLlxuICAgICAgbm9kZSA9IG5vZGU7XG4gICAgICBpZiAobm9kZSA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cbiAgICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgfVxuICB9O1xuXG4gIC8vIEFuIHVuZm9ydHVuYXRlIGZvcmsgb2YgYXBwZW5kQWxsQ2hpbGRyZW4gYmVjYXVzZSB3ZSBoYXZlIHR3byBkaWZmZXJlbnQgcGFyZW50IHR5cGVzLlxuICB2YXIgYXBwZW5kQWxsQ2hpbGRyZW5Ub0NvbnRhaW5lciA9IGZ1bmN0aW9uIChjb250YWluZXJDaGlsZFNldCwgd29ya0luUHJvZ3Jlc3MsIG5lZWRzVmlzaWJpbGl0eVRvZ2dsZSwgaXNIaWRkZW4pIHtcbiAgICAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBjcmVhdGVkIGJ1dCB3ZSBuZWVkIHJlY3Vyc2UgZG93biBpdHNcbiAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gICAgdmFyIG5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxhYmVsc1xuICAgICAgYnJhbmNoZXM6IGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBub2RlLnN0YXRlTm9kZTtcbiAgICAgICAgaWYgKG5lZWRzVmlzaWJpbGl0eVRvZ2dsZSkge1xuICAgICAgICAgIHZhciBwcm9wcyA9IG5vZGUubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICB2YXIgdHlwZSA9IG5vZGUudHlwZTtcbiAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgIC8vIFRoaXMgY2hpbGQgaXMgaW5zaWRlIGEgdGltZWQgb3V0IHRyZWUuIEhpZGUgaXQuXG4gICAgICAgICAgICBpbnN0YW5jZSA9IGNsb25lSGlkZGVuSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzLCBub2RlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhpcyBjaGlsZCB3YXMgcHJldmlvdXNseSBpbnNpZGUgYSB0aW1lZCBvdXQgdHJlZS4gSWYgaXQgd2FzIG5vdFxuICAgICAgICAgICAgLy8gdXBkYXRlZCBkdXJpbmcgdGhpcyByZW5kZXIsIGl0IG1heSBuZWVkIHRvIGJlIHVuaGlkZGVuLiBDbG9uZVxuICAgICAgICAgICAgLy8gYWdhaW4gdG8gYmUgc3VyZS5cbiAgICAgICAgICAgIGluc3RhbmNlID0gY2xvbmVVbmhpZGRlbkluc3RhbmNlKGluc3RhbmNlLCB0eXBlLCBwcm9wcywgbm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vZGUuc3RhdGVOb2RlID0gaW5zdGFuY2U7XG4gICAgICAgIH1cbiAgICAgICAgYXBwZW5kQ2hpbGRUb0NvbnRhaW5lckNoaWxkU2V0KGNvbnRhaW5lckNoaWxkU2V0LCBpbnN0YW5jZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICB2YXIgX2luc3RhbmNlMiA9IG5vZGUuc3RhdGVOb2RlO1xuICAgICAgICBpZiAobmVlZHNWaXNpYmlsaXR5VG9nZ2xlKSB7XG4gICAgICAgICAgdmFyIHRleHQgPSBub2RlLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgdmFyIHJvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG4gICAgICAgICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7XG4gICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICBfaW5zdGFuY2UyID0gY3JlYXRlSGlkZGVuVGV4dEluc3RhbmNlKHRleHQsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9pbnN0YW5jZTIgPSBjcmVhdGVUZXh0SW5zdGFuY2UodGV4dCwgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZS5zdGF0ZU5vZGUgPSBfaW5zdGFuY2UyO1xuICAgICAgICB9XG4gICAgICAgIGFwcGVuZENoaWxkVG9Db250YWluZXJDaGlsZFNldChjb250YWluZXJDaGlsZFNldCwgX2luc3RhbmNlMik7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSBwb3J0YWwgY2hpbGQsIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byB0cmF2ZXJzZVxuICAgICAgICAvLyBkb3duIGl0cyBjaGlsZHJlbi4gSW5zdGVhZCwgd2UnbGwgZ2V0IGluc2VydGlvbnMgZnJvbSBlYWNoIGNoaWxkIGluXG4gICAgICAgIC8vIHRoZSBwb3J0YWwgZGlyZWN0bHkuXG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgICB2YXIgY3VycmVudCA9IG5vZGUuYWx0ZXJuYXRlO1xuICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBvbGRTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgbmV3U3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIG9sZElzSGlkZGVuID0gb2xkU3RhdGUgIT09IG51bGw7XG4gICAgICAgICAgdmFyIG5ld0lzSGlkZGVuID0gbmV3U3RhdGUgIT09IG51bGw7XG4gICAgICAgICAgaWYgKG9sZElzSGlkZGVuICE9PSBuZXdJc0hpZGRlbikge1xuICAgICAgICAgICAgLy8gVGhlIHBsYWNlaG9sZGVyIGVpdGhlciBqdXN0IHRpbWVkIG91dCBvciBzd2l0Y2hlZCBiYWNrIHRvIHRoZSBub3JtYWxcbiAgICAgICAgICAgIC8vIGNoaWxkcmVuIGFmdGVyIGhhdmluZyBwcmV2aW91c2x5IHRpbWVkIG91dC4gVG9nZ2xlIHRoZSB2aXNpYmlsaXR5IG9mXG4gICAgICAgICAgICAvLyB0aGUgZGlyZWN0IGhvc3QgY2hpbGRyZW4uXG4gICAgICAgICAgICB2YXIgcHJpbWFyeUNoaWxkUGFyZW50ID0gbmV3SXNIaWRkZW4gPyBub2RlLmNoaWxkIDogbm9kZTtcbiAgICAgICAgICAgIGlmIChwcmltYXJ5Q2hpbGRQYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgYXBwZW5kQWxsQ2hpbGRyZW5Ub0NvbnRhaW5lcihjb250YWluZXJDaGlsZFNldCwgcHJpbWFyeUNoaWxkUGFyZW50LCB0cnVlLCBuZXdJc0hpZGRlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbGFiZWxzXG4gICAgICAgICAgICBicmVhayBicmFuY2hlcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBDb250aW51ZSB0cmF2ZXJzaW5nIGxpa2Ugbm9ybWFsXG4gICAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgaXMgY29ycmVjdCBidXQgRmxvdyBpcyBjb25mdXNlZCBieSB0aGUgbGFiZWxlZCBicmVhay5cbiAgICAgIG5vZGUgPSBub2RlO1xuICAgICAgaWYgKG5vZGUgPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfTtcbiAgdXBkYXRlSG9zdENvbnRhaW5lciA9IGZ1bmN0aW9uICh3b3JrSW5Qcm9ncmVzcykge1xuICAgIHZhciBwb3J0YWxPclJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgdmFyIGNoaWxkcmVuVW5jaGFuZ2VkID0gd29ya0luUHJvZ3Jlc3MuZmlyc3RFZmZlY3QgPT09IG51bGw7XG4gICAgaWYgKGNoaWxkcmVuVW5jaGFuZ2VkKSB7XG4gICAgICAvLyBObyBjaGFuZ2VzLCBqdXN0IHJldXNlIHRoZSBleGlzdGluZyBpbnN0YW5jZS5cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGNvbnRhaW5lciA9IHBvcnRhbE9yUm9vdC5jb250YWluZXJJbmZvO1xuICAgICAgdmFyIG5ld0NoaWxkU2V0ID0gY3JlYXRlQ29udGFpbmVyQ2hpbGRTZXQoY29udGFpbmVyKTtcbiAgICAgIC8vIElmIGNoaWxkcmVuIG1pZ2h0IGhhdmUgY2hhbmdlZCwgd2UgaGF2ZSB0byBhZGQgdGhlbSBhbGwgdG8gdGhlIHNldC5cbiAgICAgIGFwcGVuZEFsbENoaWxkcmVuVG9Db250YWluZXIobmV3Q2hpbGRTZXQsIHdvcmtJblByb2dyZXNzLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgcG9ydGFsT3JSb290LnBlbmRpbmdDaGlsZHJlbiA9IG5ld0NoaWxkU2V0O1xuICAgICAgLy8gU2NoZWR1bGUgYW4gdXBkYXRlIG9uIHRoZSBjb250YWluZXIgdG8gc3dhcCBvdXQgdGhlIGNvbnRhaW5lci5cbiAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgZmluYWxpemVDb250YWluZXJDaGlsZHJlbihjb250YWluZXIsIG5ld0NoaWxkU2V0KTtcbiAgICB9XG4gIH07XG4gIHVwZGF0ZUhvc3RDb21wb25lbnQkMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICAgIHZhciBjdXJyZW50SW5zdGFuY2UgPSBjdXJyZW50LnN0YXRlTm9kZTtcbiAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgLy8gSWYgdGhlcmUgYXJlIG5vIGVmZmVjdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZSwgdGhlbiBub25lIG9mIG91ciBjaGlsZHJlbiBoYWQgYW55IHVwZGF0ZXMuXG4gICAgLy8gVGhpcyBndWFyYW50ZWVzIHRoYXQgd2UgY2FuIHJldXNlIGFsbCBvZiB0aGVtLlxuICAgIHZhciBjaGlsZHJlblVuY2hhbmdlZCA9IHdvcmtJblByb2dyZXNzLmZpcnN0RWZmZWN0ID09PSBudWxsO1xuICAgIGlmIChjaGlsZHJlblVuY2hhbmdlZCAmJiBvbGRQcm9wcyA9PT0gbmV3UHJvcHMpIHtcbiAgICAgIC8vIE5vIGNoYW5nZXMsIGp1c3QgcmV1c2UgdGhlIGV4aXN0aW5nIGluc3RhbmNlLlxuICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgbWlnaHQgcmVsZWFzZSBhIHByZXZpb3VzIGNsb25lLlxuICAgICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3VycmVudEluc3RhbmNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgcmVjeWNsYWJsZUluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgIHZhciBjdXJyZW50SG9zdENvbnRleHQgPSBnZXRIb3N0Q29udGV4dCgpO1xuICAgIHZhciB1cGRhdGVQYXlsb2FkID0gbnVsbDtcbiAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzKSB7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gcHJlcGFyZVVwZGF0ZShyZWN5Y2xhYmxlSW5zdGFuY2UsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQpO1xuICAgIH1cbiAgICBpZiAoY2hpbGRyZW5VbmNoYW5nZWQgJiYgdXBkYXRlUGF5bG9hZCA9PT0gbnVsbCkge1xuICAgICAgLy8gTm8gY2hhbmdlcywganVzdCByZXVzZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UuXG4gICAgICAvLyBOb3RlIHRoYXQgdGhpcyBtaWdodCByZWxlYXNlIGEgcHJldmlvdXMgY2xvbmUuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjdXJyZW50SW5zdGFuY2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBuZXdJbnN0YW5jZSA9IGNsb25lSW5zdGFuY2UoY3VycmVudEluc3RhbmNlLCB1cGRhdGVQYXlsb2FkLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIHdvcmtJblByb2dyZXNzLCBjaGlsZHJlblVuY2hhbmdlZCwgcmVjeWNsYWJsZUluc3RhbmNlKTtcbiAgICBpZiAoZmluYWxpemVJbml0aWFsQ2hpbGRyZW4obmV3SW5zdGFuY2UsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGN1cnJlbnRIb3N0Q29udGV4dCkpIHtcbiAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBuZXdJbnN0YW5jZTtcbiAgICBpZiAoY2hpbGRyZW5VbmNoYW5nZWQpIHtcbiAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBvdGhlciBlZmZlY3RzIGluIHRoaXMgdHJlZSwgd2UgbmVlZCB0byBmbGFnIHRoaXMgbm9kZSBhcyBoYXZpbmcgb25lLlxuICAgICAgLy8gRXZlbiB0aG91Z2ggd2UncmUgbm90IGdvaW5nIHRvIHVzZSBpdCBmb3IgYW55dGhpbmcuXG4gICAgICAvLyBPdGhlcndpc2UgcGFyZW50cyB3b24ndCBrbm93IHRoYXQgdGhlcmUgYXJlIG5ldyBjaGlsZHJlbiB0byBwcm9wYWdhdGUgdXB3YXJkcy5cbiAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBjaGlsZHJlbiBtaWdodCBoYXZlIGNoYW5nZWQsIHdlIGhhdmUgdG8gYWRkIHRoZW0gYWxsIHRvIHRoZSBzZXQuXG4gICAgICBhcHBlbmRBbGxDaGlsZHJlbihuZXdJbnN0YW5jZSwgd29ya0luUHJvZ3Jlc3MsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuICB9O1xuICB1cGRhdGVIb3N0VGV4dCQxID0gZnVuY3Rpb24gKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBvbGRUZXh0LCBuZXdUZXh0KSB7XG4gICAgaWYgKG9sZFRleHQgIT09IG5ld1RleHQpIHtcbiAgICAgIC8vIElmIHRoZSB0ZXh0IGNvbnRlbnQgZGlmZmVycywgd2UnbGwgY3JlYXRlIGEgbmV3IHRleHQgaW5zdGFuY2UgZm9yIGl0LlxuICAgICAgdmFyIHJvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG4gICAgICB2YXIgY3VycmVudEhvc3RDb250ZXh0ID0gZ2V0SG9zdENvbnRleHQoKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGNyZWF0ZVRleHRJbnN0YW5jZShuZXdUZXh0LCByb290Q29udGFpbmVySW5zdGFuY2UsIGN1cnJlbnRIb3N0Q29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgLy8gV2UnbGwgaGF2ZSB0byBtYXJrIGl0IGFzIGhhdmluZyBhbiBlZmZlY3QsIGV2ZW4gdGhvdWdoIHdlIHdvbid0IHVzZSB0aGUgZWZmZWN0IGZvciBhbnl0aGluZy5cbiAgICAgIC8vIFRoaXMgbGV0cyB0aGUgcGFyZW50cyBrbm93IHRoYXQgYXQgbGVhc3Qgb25lIG9mIHRoZWlyIGNoaWxkcmVuIGhhcyBjaGFuZ2VkLlxuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9O1xufSBlbHNlIHtcbiAgLy8gTm8gaG9zdCBvcGVyYXRpb25zXG4gIHVwZGF0ZUhvc3RDb250YWluZXIgPSBmdW5jdGlvbiAod29ya0luUHJvZ3Jlc3MpIHtcbiAgICAvLyBOb29wXG4gIH07XG4gIHVwZGF0ZUhvc3RDb21wb25lbnQkMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICAgIC8vIE5vb3BcbiAgfTtcbiAgdXBkYXRlSG9zdFRleHQkMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgb2xkVGV4dCwgbmV3VGV4dCkge1xuICAgIC8vIE5vb3BcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29tcGxldGVXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgICBicmVhaztcbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgICBicmVhaztcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBwb3BUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB2YXIgZmliZXJSb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICBpZiAoZmliZXJSb290LnBlbmRpbmdDb250ZXh0KSB7XG4gICAgICAgICAgZmliZXJSb290LmNvbnRleHQgPSBmaWJlclJvb3QucGVuZGluZ0NvbnRleHQ7XG4gICAgICAgICAgZmliZXJSb290LnBlbmRpbmdDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LmNoaWxkID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gSWYgd2UgaHlkcmF0ZWQsIHBvcCBzbyB0aGF0IHdlIGNhbiBkZWxldGUgYW55IHJlbWFpbmluZyBjaGlsZHJlblxuICAgICAgICAgIC8vIHRoYXQgd2VyZW4ndCBoeWRyYXRlZC5cbiAgICAgICAgICBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgLy8gVGhpcyByZXNldHMgdGhlIGhhY2t5IHN0YXRlIHRvIGZpeCBpc01vdW50ZWQgYmVmb3JlIGNvbW1pdHRpbmcuXG4gICAgICAgICAgLy8gVE9ETzogRGVsZXRlIHRoaXMgd2hlbiB3ZSBkZWxldGUgaXNNb3VudGVkIGFuZCBmaW5kRE9NTm9kZS5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgJj0gflBsYWNlbWVudDtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciByb290Q29udGFpbmVySW5zdGFuY2UgPSBnZXRSb290SG9zdENvbnRhaW5lcigpO1xuICAgICAgICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgdXBkYXRlSG9zdENvbXBvbmVudCQxKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKTtcblxuICAgICAgICAgIGlmIChjdXJyZW50LnJlZiAhPT0gd29ya0luUHJvZ3Jlc3MucmVmKSB7XG4gICAgICAgICAgICBtYXJrUmVmJDEod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIW5ld1Byb3BzKSB7XG4gICAgICAgICAgICAhKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSAhPT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICdXZSBtdXN0IGhhdmUgbmV3IHByb3BzIGZvciBuZXcgbW91bnRzLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpIDogdm9pZCAwO1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYWJvcnQgd29yay5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBjdXJyZW50SG9zdENvbnRleHQgPSBnZXRIb3N0Q29udGV4dCgpO1xuICAgICAgICAgIC8vIFRPRE86IE1vdmUgY3JlYXRlSW5zdGFuY2UgdG8gYmVnaW5Xb3JrIGFuZCBrZWVwIGl0IG9uIGEgY29udGV4dFxuICAgICAgICAgIC8vIFwic3RhY2tcIiBhcyB0aGUgcGFyZW50LiBUaGVuIGFwcGVuZCBjaGlsZHJlbiBhcyB3ZSBnbyBpbiBiZWdpbldvcmtcbiAgICAgICAgICAvLyBvciBjb21wbGV0ZVdvcmsgZGVwZW5kaW5nIG9uIHdlIHdhbnQgdG8gYWRkIHRoZW4gdG9wLT5kb3duIG9yXG4gICAgICAgICAgLy8gYm90dG9tLT51cC4gVG9wLT5kb3duIGlzIGZhc3RlciBpbiBJRTExLlxuICAgICAgICAgIHZhciB3YXNIeWRyYXRlZCA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICBpZiAod2FzSHlkcmF0ZWQpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyBhbmQgY3JlYXRlSW5zdGFuY2Ugc3RlcCBpbnRvIHRoZSBiZWdpblBoYXNlXG4gICAgICAgICAgICAvLyB0byBjb25zb2xpZGF0ZS5cbiAgICAgICAgICAgIGlmIChwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKHdvcmtJblByb2dyZXNzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGN1cnJlbnRIb3N0Q29udGV4dCkpIHtcbiAgICAgICAgICAgICAgLy8gSWYgY2hhbmdlcyB0byB0aGUgaHlkcmF0ZWQgbm9kZSBuZWVkcyB0byBiZSBhcHBsaWVkIGF0IHRoZVxuICAgICAgICAgICAgICAvLyBjb21taXQtcGhhc2Ugd2UgbWFyayB0aGlzIGFzIHN1Y2guXG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBjcmVhdGVJbnN0YW5jZSh0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgICAgYXBwZW5kQWxsQ2hpbGRyZW4oaW5zdGFuY2UsIHdvcmtJblByb2dyZXNzLCBmYWxzZSwgZmFsc2UpO1xuXG4gICAgICAgICAgICAvLyBDZXJ0YWluIHJlbmRlcmVycyByZXF1aXJlIGNvbW1pdC10aW1lIGVmZmVjdHMgZm9yIGluaXRpYWwgbW91bnQuXG4gICAgICAgICAgICAvLyAoZWcgRE9NIHJlbmRlcmVyIHN1cHBvcnRzIGF1dG8tZm9jdXMgZm9yIGNlcnRhaW4gZWxlbWVudHMpLlxuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHN1Y2ggcmVuZGVyZXJzIGdldCBzY2hlZHVsZWQgZm9yIGxhdGVyIHdvcmsuXG4gICAgICAgICAgICBpZiAoZmluYWxpemVJbml0aWFsQ2hpbGRyZW4oaW5zdGFuY2UsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGN1cnJlbnRIb3N0Q29udGV4dCkpIHtcbiAgICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBpbnN0YW5jZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MucmVmICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHJlZiBvbiBhIGhvc3Qgbm9kZSB3ZSBuZWVkIHRvIHNjaGVkdWxlIGEgY2FsbGJhY2tcbiAgICAgICAgICAgIG1hcmtSZWYkMSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIHZhciBuZXdUZXh0ID0gbmV3UHJvcHM7XG4gICAgICAgIGlmIChjdXJyZW50ICYmIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIG9sZFRleHQgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBhbHRlcm5hdGUsIHRoYXQgbWVhbnMgdGhpcyBpcyBhbiB1cGRhdGUgYW5kIHdlIG5lZWRcbiAgICAgICAgICAvLyB0byBzY2hlZHVsZSBhIHNpZGUtZWZmZWN0IHRvIGRvIHRoZSB1cGRhdGVzLlxuICAgICAgICAgIHVwZGF0ZUhvc3RUZXh0JDEoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG9sZFRleHQsIG5ld1RleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV3VGV4dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICEod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9PSBudWxsKSA/IGludmFyaWFudChmYWxzZSwgJ1dlIG11c3QgaGF2ZSBuZXcgcHJvcHMgZm9yIG5ldyBtb3VudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJykgOiB2b2lkIDA7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBhYm9ydCB3b3JrLlxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgX3Jvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG4gICAgICAgICAgdmFyIF9jdXJyZW50SG9zdENvbnRleHQgPSBnZXRIb3N0Q29udGV4dCgpO1xuICAgICAgICAgIHZhciBfd2FzSHlkcmF0ZWQgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgaWYgKF93YXNIeWRyYXRlZCkge1xuICAgICAgICAgICAgaWYgKHByZXBhcmVUb0h5ZHJhdGVIb3N0VGV4dEluc3RhbmNlKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3JlYXRlVGV4dEluc3RhbmNlKG5ld1RleHQsIF9yb290Q29udGFpbmVySW5zdGFuY2UsIF9jdXJyZW50SG9zdENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnICYgRGlkQ2FwdHVyZSkgIT09IE5vRWZmZWN0KSB7XG4gICAgICAgICAgLy8gU29tZXRoaW5nIHN1c3BlbmRlZC4gUmUtcmVuZGVyIHdpdGggdGhlIGZhbGxiYWNrIGNoaWxkcmVuLlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmV4cGlyYXRpb25UaW1lID0gcmVuZGVyRXhwaXJhdGlvblRpbWU7XG4gICAgICAgICAgLy8gRG8gbm90IHJlc2V0IHRoZSBlZmZlY3QgbGlzdC5cbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbmV4dERpZFRpbWVvdXQgPSBuZXh0U3RhdGUgIT09IG51bGw7XG4gICAgICAgIHZhciBwcmV2RGlkVGltZW91dCA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmICFuZXh0RGlkVGltZW91dCAmJiBwcmV2RGlkVGltZW91dCkge1xuICAgICAgICAgIC8vIFdlIGp1c3Qgc3dpdGNoZWQgZnJvbSB0aGUgZmFsbGJhY2sgdG8gdGhlIG5vcm1hbCBjaGlsZHJlbi4gRGVsZXRlXG4gICAgICAgICAgLy8gdGhlIGZhbGxiYWNrLlxuICAgICAgICAgIC8vIFRPRE86IFdvdWxkIGl0IGJlIGJldHRlciB0byBzdG9yZSB0aGUgZmFsbGJhY2sgZnJhZ21lbnQgb25cbiAgICAgICAgICB2YXIgY3VycmVudEZhbGxiYWNrQ2hpbGQgPSBjdXJyZW50LmNoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgaWYgKGN1cnJlbnRGYWxsYmFja0NoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBEZWxldGlvbnMgZ28gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmV0dXJuIGZpYmVyJ3MgZWZmZWN0IGxpc3RcbiAgICAgICAgICAgIHZhciBmaXJzdCA9IHdvcmtJblByb2dyZXNzLmZpcnN0RWZmZWN0O1xuICAgICAgICAgICAgaWYgKGZpcnN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZpcnN0RWZmZWN0ID0gY3VycmVudEZhbGxiYWNrQ2hpbGQ7XG4gICAgICAgICAgICAgIGN1cnJlbnRGYWxsYmFja0NoaWxkLm5leHRFZmZlY3QgPSBmaXJzdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZpcnN0RWZmZWN0ID0gd29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCA9IGN1cnJlbnRGYWxsYmFja0NoaWxkO1xuICAgICAgICAgICAgICBjdXJyZW50RmFsbGJhY2tDaGlsZC5uZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnRGYWxsYmFja0NoaWxkLmVmZmVjdFRhZyA9IERlbGV0aW9uO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0RGlkVGltZW91dCB8fCBwcmV2RGlkVGltZW91dCkge1xuICAgICAgICAgIC8vIElmIHRoZSBjaGlsZHJlbiBhcmUgaGlkZGVuLCBvciBpZiB0aGV5IHdlcmUgcHJldmlvdXMgaGlkZGVuLCBzY2hlZHVsZVxuICAgICAgICAgIC8vIGFuIGVmZmVjdCB0byB0b2dnbGUgdGhlaXIgdmlzaWJpbGl0eS4gVGhpcyBpcyBhbHNvIHVzZWQgdG8gYXR0YWNoIGFcbiAgICAgICAgICAvLyByZXRyeSBsaXN0ZW5lciB0byB0aGUgcHJvbWlzZS5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gVXBkYXRlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgICBicmVhaztcbiAgICBjYXNlIE1vZGU6XG4gICAgICBicmVhaztcbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB1cGRhdGVIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgLy8gUG9wIHByb3ZpZGVyIGZpYmVyXG4gICAgICBwb3BQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIENvbnRleHRDb25zdW1lcjpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICAvLyBTYW1lIGFzIGNsYXNzIGNvbXBvbmVudCBjYXNlLiBJIHB1dCBpdCBkb3duIGhlcmUgc28gdGhhdCB0aGUgdGFncyBhcmVcbiAgICAgICAgLy8gc2VxdWVudGlhbCB0byBlbnN1cmUgdGhpcyBzd2l0Y2ggaXMgY29tcGlsZWQgdG8gYSBqdW1wIHRhYmxlLlxuICAgICAgICB2YXIgX0NvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihfQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNhc2UgRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoZW5hYmxlU3VzcGVuc2VTZXJ2ZXJSZW5kZXJlcikge1xuICAgICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkMiA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgICFfd2FzSHlkcmF0ZWQyID8gaW52YXJpYW50KGZhbHNlLCAnQSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGNvbXBvbmVudCB3YXMgY29tcGxldGVkIHdpdGhvdXQgYSBoeWRyYXRlZCBub2RlLiBUaGlzIGlzIHByb2JhYmx5IGEgYnVnIGluIFJlYWN0LicpIDogdm9pZCAwO1xuICAgICAgICAgICAgc2tpcFBhc3REZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfSBlbHNlIGlmICgod29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnICYgRGlkQ2FwdHVyZSkgPT09IE5vRWZmZWN0KSB7XG4gICAgICAgICAgICAvLyBUaGlzIGJvdW5kYXJ5IGRpZCBub3Qgc3VzcGVuZCBzbyBpdCdzIG5vdyBoeWRyYXRlZC5cbiAgICAgICAgICAgIC8vIFRvIGhhbmRsZSBhbnkgZnV0dXJlIHN1c3BlbnNlIGNhc2VzLCB3ZSdyZSBnb2luZyB0byBub3cgdXBncmFkZSBpdFxuICAgICAgICAgICAgLy8gdG8gYSBTdXNwZW5zZSBjb21wb25lbnQuIFdlIGRldGFjaCBpdCBmcm9tIHRoZSBleGlzdGluZyBjdXJyZW50IGZpYmVyLlxuICAgICAgICAgICAgY3VycmVudC5hbHRlcm5hdGUgPSBudWxsO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRhZyA9IFN1c3BlbnNlQ29tcG9uZW50O1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgaW52YXJpYW50KGZhbHNlLCAnVW5rbm93biB1bml0IG9mIHdvcmsgdGFnLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHNob3VsZENhcHR1cmVTdXNwZW5zZSh3b3JrSW5Qcm9ncmVzcykge1xuICAvLyBJbiBvcmRlciB0byBjYXB0dXJlLCB0aGUgU3VzcGVuc2UgY29tcG9uZW50IG11c3QgaGF2ZSBhIGZhbGxiYWNrIHByb3AuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLmZhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gSWYgaXQgd2FzIHRoZSBwcmltYXJ5IGNoaWxkcmVuIHRoYXQganVzdCBzdXNwZW5kZWQsIGNhcHR1cmUgYW5kIHJlbmRlciB0aGVcbiAgLy8gZmFsbGJhY2suIE90aGVyd2lzZSwgZG9uJ3QgY2FwdHVyZSBhbmQgYnViYmxlIHRvIHRoZSBuZXh0IGJvdW5kYXJ5LlxuICB2YXIgbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIG5leHRTdGF0ZSA9PT0gbnVsbDtcbn1cblxuLy8gVGhpcyBtb2R1bGUgaXMgZm9ya2VkIGluIGRpZmZlcmVudCBlbnZpcm9ubWVudHMuXG4vLyBCeSBkZWZhdWx0LCByZXR1cm4gYHRydWVgIHRvIGxvZyBlcnJvcnMgdG8gdGhlIGNvbnNvbGUuXG4vLyBGb3JrcyBjYW4gcmV0dXJuIGBmYWxzZWAgaWYgdGhpcyBpc24ndCBkZXNpcmFibGUuXG5mdW5jdGlvbiBzaG93RXJyb3JEaWFsb2coY2FwdHVyZWRFcnJvcikge1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gbG9nQ2FwdHVyZWRFcnJvcihjYXB0dXJlZEVycm9yKSB7XG4gIHZhciBsb2dFcnJvciA9IHNob3dFcnJvckRpYWxvZyhjYXB0dXJlZEVycm9yKTtcblxuICAvLyBBbGxvdyBpbmplY3RlZCBzaG93RXJyb3JEaWFsb2coKSB0byBwcmV2ZW50IGRlZmF1bHQgY29uc29sZS5lcnJvciBsb2dnaW5nLlxuICAvLyBUaGlzIGVuYWJsZXMgcmVuZGVyZXJzIGxpa2UgUmVhY3ROYXRpdmUgdG8gYmV0dGVyIG1hbmFnZSByZWRib3ggYmVoYXZpb3IuXG4gIGlmIChsb2dFcnJvciA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZXJyb3IgPSBjYXB0dXJlZEVycm9yLmVycm9yO1xuICB7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBjYXB0dXJlZEVycm9yLmNvbXBvbmVudE5hbWUsXG4gICAgICAgIGNvbXBvbmVudFN0YWNrID0gY2FwdHVyZWRFcnJvci5jb21wb25lbnRTdGFjayxcbiAgICAgICAgZXJyb3JCb3VuZGFyeU5hbWUgPSBjYXB0dXJlZEVycm9yLmVycm9yQm91bmRhcnlOYW1lLFxuICAgICAgICBlcnJvckJvdW5kYXJ5Rm91bmQgPSBjYXB0dXJlZEVycm9yLmVycm9yQm91bmRhcnlGb3VuZCxcbiAgICAgICAgd2lsbFJldHJ5ID0gY2FwdHVyZWRFcnJvci53aWxsUmV0cnk7XG5cbiAgICAvLyBCcm93c2VycyBzdXBwb3J0IHNpbGVuY2luZyB1bmNhdWdodCBlcnJvcnMgYnkgY2FsbGluZ1xuICAgIC8vIGBwcmV2ZW50RGVmYXVsdCgpYCBpbiB3aW5kb3cgYGVycm9yYCBoYW5kbGVyLlxuICAgIC8vIFdlIHJlY29yZCB0aGlzIGluZm9ybWF0aW9uIGFzIGFuIGV4cGFuZG8gb24gdGhlIGVycm9yLlxuXG4gICAgaWYgKGVycm9yICE9IG51bGwgJiYgZXJyb3IuX3N1cHByZXNzTG9nZ2luZykge1xuICAgICAgaWYgKGVycm9yQm91bmRhcnlGb3VuZCAmJiB3aWxsUmV0cnkpIHtcbiAgICAgICAgLy8gVGhlIGVycm9yIGlzIHJlY292ZXJhYmxlIGFuZCB3YXMgc2lsZW5jZWQuXG4gICAgICAgIC8vIElnbm9yZSBpdCBhbmQgZG9uJ3QgcHJpbnQgdGhlIHN0YWNrIGFkZGVuZHVtLlxuICAgICAgICAvLyBUaGlzIGlzIGhhbmR5IGZvciB0ZXN0aW5nIGVycm9yIGJvdW5kYXJpZXMgd2l0aG91dCBub2lzZS5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGVycm9yIGlzIGZhdGFsLiBTaW5jZSB0aGUgc2lsZW5jaW5nIG1pZ2h0IGhhdmVcbiAgICAgIC8vIGJlZW4gYWNjaWRlbnRhbCwgd2UnbGwgc3VyZmFjZSBpdCBhbnl3YXkuXG4gICAgICAvLyBIb3dldmVyLCB0aGUgYnJvd3NlciB3b3VsZCBoYXZlIHNpbGVuY2VkIHRoZSBvcmlnaW5hbCBlcnJvclxuICAgICAgLy8gc28gd2UnbGwgcHJpbnQgaXQgZmlyc3QsIGFuZCB0aGVuIHByaW50IHRoZSBzdGFjayBhZGRlbmR1bS5cbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgLy8gRm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGlzIGJsb2NrLCBzZWU6XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xMzM4NFxuICAgIH1cblxuICAgIHZhciBjb21wb25lbnROYW1lTWVzc2FnZSA9IGNvbXBvbmVudE5hbWUgPyAnVGhlIGFib3ZlIGVycm9yIG9jY3VycmVkIGluIHRoZSA8JyArIGNvbXBvbmVudE5hbWUgKyAnPiBjb21wb25lbnQ6JyA6ICdUaGUgYWJvdmUgZXJyb3Igb2NjdXJyZWQgaW4gb25lIG9mIHlvdXIgUmVhY3QgY29tcG9uZW50czonO1xuXG4gICAgdmFyIGVycm9yQm91bmRhcnlNZXNzYWdlID0gdm9pZCAwO1xuICAgIC8vIGVycm9yQm91bmRhcnlGb3VuZCBjaGVjayBpcyBzdWZmaWNpZW50OyBlcnJvckJvdW5kYXJ5TmFtZSBjaGVjayBpcyB0byBzYXRpc2Z5IEZsb3cuXG4gICAgaWYgKGVycm9yQm91bmRhcnlGb3VuZCAmJiBlcnJvckJvdW5kYXJ5TmFtZSkge1xuICAgICAgaWYgKHdpbGxSZXRyeSkge1xuICAgICAgICBlcnJvckJvdW5kYXJ5TWVzc2FnZSA9ICdSZWFjdCB3aWxsIHRyeSB0byByZWNyZWF0ZSB0aGlzIGNvbXBvbmVudCB0cmVlIGZyb20gc2NyYXRjaCAnICsgKCd1c2luZyB0aGUgZXJyb3IgYm91bmRhcnkgeW91IHByb3ZpZGVkLCAnICsgZXJyb3JCb3VuZGFyeU5hbWUgKyAnLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JCb3VuZGFyeU1lc3NhZ2UgPSAnVGhpcyBlcnJvciB3YXMgaW5pdGlhbGx5IGhhbmRsZWQgYnkgdGhlIGVycm9yIGJvdW5kYXJ5ICcgKyBlcnJvckJvdW5kYXJ5TmFtZSArICcuXFxuJyArICdSZWNyZWF0aW5nIHRoZSB0cmVlIGZyb20gc2NyYXRjaCBmYWlsZWQgc28gUmVhY3Qgd2lsbCB1bm1vdW50IHRoZSB0cmVlLic7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yQm91bmRhcnlNZXNzYWdlID0gJ0NvbnNpZGVyIGFkZGluZyBhbiBlcnJvciBib3VuZGFyeSB0byB5b3VyIHRyZWUgdG8gY3VzdG9taXplIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yLlxcbicgKyAnVmlzaXQgaHR0cHM6Ly9mYi5tZS9yZWFjdC1lcnJvci1ib3VuZGFyaWVzIHRvIGxlYXJuIG1vcmUgYWJvdXQgZXJyb3IgYm91bmRhcmllcy4nO1xuICAgIH1cbiAgICB2YXIgY29tYmluZWRNZXNzYWdlID0gJycgKyBjb21wb25lbnROYW1lTWVzc2FnZSArIGNvbXBvbmVudFN0YWNrICsgJ1xcblxcbicgKyAoJycgKyBlcnJvckJvdW5kYXJ5TWVzc2FnZSk7XG5cbiAgICAvLyBJbiBkZXZlbG9wbWVudCwgd2UgcHJvdmlkZSBvdXIgb3duIG1lc3NhZ2Ugd2l0aCBqdXN0IHRoZSBjb21wb25lbnQgc3RhY2suXG4gICAgLy8gV2UgZG9uJ3QgaW5jbHVkZSB0aGUgb3JpZ2luYWwgZXJyb3IgbWVzc2FnZSBhbmQgSlMgc3RhY2sgYmVjYXVzZSB0aGUgYnJvd3NlclxuICAgIC8vIGhhcyBhbHJlYWR5IHByaW50ZWQgaXQuIEV2ZW4gaWYgdGhlIGFwcGxpY2F0aW9uIHN3YWxsb3dzIHRoZSBlcnJvciwgaXQgaXMgc3RpbGxcbiAgICAvLyBkaXNwbGF5ZWQgYnkgdGhlIGJyb3dzZXIgdGhhbmtzIHRvIHRoZSBERVYtb25seSBmYWtlIGV2ZW50IHRyaWNrIGluIFJlYWN0RXJyb3JVdGlscy5cbiAgICBjb25zb2xlLmVycm9yKGNvbWJpbmVkTWVzc2FnZSk7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlID0gbnVsbDtcbntcbiAgZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGUgPSBuZXcgU2V0KCk7XG59XG5cbnZhciBQb3NzaWJseVdlYWtTZXQkMSA9IHR5cGVvZiBXZWFrU2V0ID09PSAnZnVuY3Rpb24nID8gV2Vha1NldCA6IFNldDtcblxuZnVuY3Rpb24gbG9nRXJyb3IoYm91bmRhcnksIGVycm9ySW5mbykge1xuICB2YXIgc291cmNlID0gZXJyb3JJbmZvLnNvdXJjZTtcbiAgdmFyIHN0YWNrID0gZXJyb3JJbmZvLnN0YWNrO1xuICBpZiAoc3RhY2sgPT09IG51bGwgJiYgc291cmNlICE9PSBudWxsKSB7XG4gICAgc3RhY2sgPSBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2Qoc291cmNlKTtcbiAgfVxuXG4gIHZhciBjYXB0dXJlZEVycm9yID0ge1xuICAgIGNvbXBvbmVudE5hbWU6IHNvdXJjZSAhPT0gbnVsbCA/IGdldENvbXBvbmVudE5hbWUoc291cmNlLnR5cGUpIDogbnVsbCxcbiAgICBjb21wb25lbnRTdGFjazogc3RhY2sgIT09IG51bGwgPyBzdGFjayA6ICcnLFxuICAgIGVycm9yOiBlcnJvckluZm8udmFsdWUsXG4gICAgZXJyb3JCb3VuZGFyeTogbnVsbCxcbiAgICBlcnJvckJvdW5kYXJ5TmFtZTogbnVsbCxcbiAgICBlcnJvckJvdW5kYXJ5Rm91bmQ6IGZhbHNlLFxuICAgIHdpbGxSZXRyeTogZmFsc2VcbiAgfTtcblxuICBpZiAoYm91bmRhcnkgIT09IG51bGwgJiYgYm91bmRhcnkudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgIGNhcHR1cmVkRXJyb3IuZXJyb3JCb3VuZGFyeSA9IGJvdW5kYXJ5LnN0YXRlTm9kZTtcbiAgICBjYXB0dXJlZEVycm9yLmVycm9yQm91bmRhcnlOYW1lID0gZ2V0Q29tcG9uZW50TmFtZShib3VuZGFyeS50eXBlKTtcbiAgICBjYXB0dXJlZEVycm9yLmVycm9yQm91bmRhcnlGb3VuZCA9IHRydWU7XG4gICAgY2FwdHVyZWRFcnJvci53aWxsUmV0cnkgPSB0cnVlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBsb2dDYXB0dXJlZEVycm9yKGNhcHR1cmVkRXJyb3IpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3csIG9yIFJlYWN0IGludGVybmFsIHN0YXRlIHdpbGwgZ2V0IG1lc3NlZCB1cC5cbiAgICAvLyBJZiBjb25zb2xlLmVycm9yIGlzIG92ZXJyaWRkZW4sIG9yIGxvZ0NhcHR1cmVkRXJyb3IoKSBzaG93cyBhIGRpYWxvZyB0aGF0IHRocm93cyxcbiAgICAvLyB3ZSB3YW50IHRvIHJlcG9ydCB0aGlzIGVycm9yIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBzdGFjayBhcyBhIGxhc3QgcmVzb3J0LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTMxODhcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG4gIH1cbn1cblxudmFyIGNhbGxDb21wb25lbnRXaWxsVW5tb3VudFdpdGhUaW1lciA9IGZ1bmN0aW9uIChjdXJyZW50JCQxLCBpbnN0YW5jZSkge1xuICBzdGFydFBoYXNlVGltZXIoY3VycmVudCQkMSwgJ2NvbXBvbmVudFdpbGxVbm1vdW50Jyk7XG4gIGluc3RhbmNlLnByb3BzID0gY3VycmVudCQkMS5tZW1vaXplZFByb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IGN1cnJlbnQkJDEubWVtb2l6ZWRTdGF0ZTtcbiAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgc3RvcFBoYXNlVGltZXIoKTtcbn07XG5cbi8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IHVubW91bnRpbmcuXG5mdW5jdGlvbiBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoY3VycmVudCQkMSwgaW5zdGFuY2UpIHtcbiAge1xuICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCBjYWxsQ29tcG9uZW50V2lsbFVubW91bnRXaXRoVGltZXIsIG51bGwsIGN1cnJlbnQkJDEsIGluc3RhbmNlKTtcbiAgICBpZiAoaGFzQ2F1Z2h0RXJyb3IoKSkge1xuICAgICAgdmFyIHVubW91bnRFcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQkJDEsIHVubW91bnRFcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNhZmVseURldGFjaFJlZihjdXJyZW50JCQxKSB7XG4gIHZhciByZWYgPSBjdXJyZW50JCQxLnJlZjtcbiAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB7XG4gICAgICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCByZWYsIG51bGwsIG51bGwpO1xuICAgICAgICBpZiAoaGFzQ2F1Z2h0RXJyb3IoKSkge1xuICAgICAgICAgIHZhciByZWZFcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50JCQxLCByZWZFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsRGVzdHJveShjdXJyZW50JCQxLCBkZXN0cm95KSB7XG4gIHtcbiAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgZGVzdHJveSwgbnVsbCk7XG4gICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgIHZhciBlcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQkJDEsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25MaWZlQ3ljbGVzKGN1cnJlbnQkJDEsIGZpbmlzaGVkV29yaykge1xuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0KFVubW91bnRTbmFwc2hvdCwgTm9FZmZlY3QkMSwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmIChmaW5pc2hlZFdvcmsuZWZmZWN0VGFnICYgU25hcHNob3QpIHtcbiAgICAgICAgICBpZiAoY3VycmVudCQkMSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQkJDEubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50JCQxLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgICBzdGFydFBoYXNlVGltZXIoZmluaXNoZWRXb3JrLCAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUnKTtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAhKGluc3RhbmNlLnByb3BzID09PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykgPyB3YXJuaW5nJDEoZmFsc2UsICdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpIDogdm9pZCAwO1xuICAgICAgICAgICAgICAgICEoaW5zdGFuY2Uuc3RhdGUgPT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSA/IHdhcm5pbmckMShmYWxzZSwgJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ2dldFNuYXBzaG90QmVmb3JlVXBkYXRlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZShmaW5pc2hlZFdvcmsudHlwZSkgfHwgJ2luc3RhbmNlJykgOiB2b2lkIDA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzbmFwc2hvdCA9IGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSA9PT0gZmluaXNoZWRXb3JrLnR5cGUgPyBwcmV2UHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKGZpbmlzaGVkV29yay50eXBlLCBwcmV2UHJvcHMpLCBwcmV2U3RhdGUpO1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgZGlkV2FyblNldCA9IGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlO1xuICAgICAgICAgICAgICBpZiAoc25hcHNob3QgPT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblNldC5oYXMoZmluaXNoZWRXb3JrLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgZGlkV2FyblNldC5hZGQoZmluaXNoZWRXb3JrLnR5cGUpO1xuICAgICAgICAgICAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCk6IEEgc25hcHNob3QgdmFsdWUgKG9yIG51bGwpICcgKyAnbXVzdCBiZSByZXR1cm5lZC4gWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUgPSBzbmFwc2hvdDtcbiAgICAgICAgICAgIHN0b3BQaGFzZVRpbWVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICBjYXNlIEhvc3RSb290OlxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgIC8vIE5vdGhpbmcgdG8gZG8gZm9yIHRoZXNlIGNvbXBvbmVudCB0eXBlc1xuICAgICAgcmV0dXJuO1xuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIGludmFyaWFudChmYWxzZSwgJ1RoaXMgdW5pdCBvZiB3b3JrIHRhZyBzaG91bGQgbm90IGhhdmUgc2lkZS1lZmZlY3RzLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEhvb2tFZmZlY3RMaXN0KHVubW91bnRUYWcsIG1vdW50VGFnLCBmaW5pc2hlZFdvcmspIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuICB2YXIgbGFzdEVmZmVjdCA9IHVwZGF0ZVF1ZXVlICE9PSBudWxsID8gdXBkYXRlUXVldWUubGFzdEVmZmVjdCA6IG51bGw7XG4gIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcbiAgICBkbyB7XG4gICAgICBpZiAoKGVmZmVjdC50YWcgJiB1bm1vdW50VGFnKSAhPT0gTm9FZmZlY3QkMSkge1xuICAgICAgICAvLyBVbm1vdW50XG4gICAgICAgIHZhciBkZXN0cm95ID0gZWZmZWN0LmRlc3Ryb3k7XG4gICAgICAgIGVmZmVjdC5kZXN0cm95ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoKGVmZmVjdC50YWcgJiBtb3VudFRhZykgIT09IE5vRWZmZWN0JDEpIHtcbiAgICAgICAgLy8gTW91bnRcbiAgICAgICAgdmFyIGNyZWF0ZSA9IGVmZmVjdC5jcmVhdGU7XG4gICAgICAgIGVmZmVjdC5kZXN0cm95ID0gY3JlYXRlKCk7XG5cbiAgICAgICAge1xuICAgICAgICAgIHZhciBfZGVzdHJveSA9IGVmZmVjdC5kZXN0cm95O1xuICAgICAgICAgIGlmIChfZGVzdHJveSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBfZGVzdHJveSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFyIGFkZGVuZHVtID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKF9kZXN0cm95ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJyBZb3UgcmV0dXJuZWQgbnVsbC4gSWYgeW91ciBlZmZlY3QgZG9lcyBub3QgcmVxdWlyZSBjbGVhbiAnICsgJ3VwLCByZXR1cm4gdW5kZWZpbmVkIChvciBub3RoaW5nKS4nO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgX2Rlc3Ryb3kudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBhZGRlbmR1bSA9ICdcXG5cXG5JdCBsb29rcyBsaWtlIHlvdSB3cm90ZSB1c2VFZmZlY3QoYXN5bmMgKCkgPT4gLi4uKSBvciByZXR1cm5lZCBhIFByb21pc2UuICcgKyAnSW5zdGVhZCwgd3JpdGUgdGhlIGFzeW5jIGZ1bmN0aW9uIGluc2lkZSB5b3VyIGVmZmVjdCAnICsgJ2FuZCBjYWxsIGl0IGltbWVkaWF0ZWx5OlxcblxcbicgKyAndXNlRWZmZWN0KCgpID0+IHtcXG4nICsgJyAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hEYXRhKCkge1xcbicgKyAnICAgIC8vIFlvdSBjYW4gYXdhaXQgaGVyZVxcbicgKyAnICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgTXlBUEkuZ2V0RGF0YShzb21lSWQpO1xcbicgKyAnICAgIC8vIC4uLlxcbicgKyAnICB9XFxuJyArICcgIGZldGNoRGF0YSgpO1xcbicgKyAnfSwgW3NvbWVJZF0pOyAvLyBPciBbXSBpZiBlZmZlY3QgZG9lc25cXCd0IG5lZWQgcHJvcHMgb3Igc3RhdGVcXG5cXG4nICsgJ0xlYXJuIG1vcmUgYWJvdXQgZGF0YSBmZXRjaGluZyB3aXRoIEhvb2tzOiBodHRwczovL2ZiLm1lL3JlYWN0LWhvb2tzLWRhdGEtZmV0Y2hpbmcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYWRkZW5kdW0gPSAnIFlvdSByZXR1cm5lZDogJyArIF9kZXN0cm95O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnQW4gZWZmZWN0IGZ1bmN0aW9uIG11c3Qgbm90IHJldHVybiBhbnl0aGluZyBiZXNpZGVzIGEgZnVuY3Rpb24sICcgKyAnd2hpY2ggaXMgdXNlZCBmb3IgY2xlYW4tdXAuJXMlcycsIGFkZGVuZHVtLCBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2QoZmluaXNoZWRXb3JrKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlZmZlY3QgPSBlZmZlY3QubmV4dDtcbiAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlSG9va0VmZmVjdHMoZmluaXNoZWRXb3JrKSB7XG4gIGNvbW1pdEhvb2tFZmZlY3RMaXN0KFVubW91bnRQYXNzaXZlLCBOb0VmZmVjdCQxLCBmaW5pc2hlZFdvcmspO1xuICBjb21taXRIb29rRWZmZWN0TGlzdChOb0VmZmVjdCQxLCBNb3VudFBhc3NpdmUsIGZpbmlzaGVkV29yayk7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExpZmVDeWNsZXMoZmluaXNoZWRSb290LCBjdXJyZW50JCQxLCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZEV4cGlyYXRpb25UaW1lKSB7XG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3QoVW5tb3VudExheW91dCwgTW91bnRMYXlvdXQsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgIGlmIChmaW5pc2hlZFdvcmsuZWZmZWN0VGFnICYgVXBkYXRlKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQkJDEgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHN0YXJ0UGhhc2VUaW1lcihmaW5pc2hlZFdvcmssICdjb21wb25lbnREaWRNb3VudCcpO1xuICAgICAgICAgICAgLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgIShpbnN0YW5jZS5wcm9wcyA9PT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpID8gd2FybmluZyQxKGZhbHNlLCAnRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkTW91bnQuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lKGZpbmlzaGVkV29yay50eXBlKSB8fCAnaW5zdGFuY2UnKSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAhKGluc3RhbmNlLnN0YXRlID09PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkgPyB3YXJuaW5nJDEoZmFsc2UsICdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdjb21wb25lbnREaWRNb3VudC4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpIDogdm9pZCAwO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICAgICAgc3RvcFBoYXNlVGltZXIoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHByZXZQcm9wcyA9IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSA9PT0gZmluaXNoZWRXb3JrLnR5cGUgPyBjdXJyZW50JCQxLm1lbW9pemVkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKGZpbmlzaGVkV29yay50eXBlLCBjdXJyZW50JCQxLm1lbW9pemVkUHJvcHMpO1xuICAgICAgICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQkJDEubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICAgIHN0YXJ0UGhhc2VUaW1lcihmaW5pc2hlZFdvcmssICdjb21wb25lbnREaWRVcGRhdGUnKTtcbiAgICAgICAgICAgIC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgICEoaW5zdGFuY2UucHJvcHMgPT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSA/IHdhcm5pbmckMShmYWxzZSwgJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpIDogdm9pZCAwO1xuICAgICAgICAgICAgICAgICEoaW5zdGFuY2Uuc3RhdGUgPT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSA/IHdhcm5pbmckMShmYWxzZSwgJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpIDogdm9pZCAwO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKTtcbiAgICAgICAgICAgIHN0b3BQaGFzZVRpbWVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgIShpbnN0YW5jZS5wcm9wcyA9PT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpID8gd2FybmluZyQxKGZhbHNlLCAnRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAncHJvY2Vzc2luZyB0aGUgdXBkYXRlIHF1ZXVlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZShmaW5pc2hlZFdvcmsudHlwZSkgfHwgJ2luc3RhbmNlJykgOiB2b2lkIDA7XG4gICAgICAgICAgICAgICEoaW5zdGFuY2Uuc3RhdGUgPT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSA/IHdhcm5pbmckMShmYWxzZSwgJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ3Byb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpIDogdm9pZCAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuICAgICAgICAgIGNvbW1pdFVwZGF0ZVF1ZXVlKGZpbmlzaGVkV29yaywgdXBkYXRlUXVldWUsIGluc3RhbmNlLCBjb21taXR0ZWRFeHBpcmF0aW9uVGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHZhciBfdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gICAgICAgIGlmIChfdXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX2luc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay5jaGlsZC50YWcpIHtcbiAgICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICAgIF9pbnN0YW5jZSA9IGdldFB1YmxpY0luc3RhbmNlKGZpbmlzaGVkV29yay5jaGlsZC5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgICAgICAgIF9pbnN0YW5jZSA9IGZpbmlzaGVkV29yay5jaGlsZC5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbW1pdFVwZGF0ZVF1ZXVlKGZpbmlzaGVkV29yaywgX3VwZGF0ZVF1ZXVlLCBfaW5zdGFuY2UsIGNvbW1pdHRlZEV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX2luc3RhbmNlMiA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICAgICAgLy8gUmVuZGVyZXJzIG1heSBzY2hlZHVsZSB3b3JrIHRvIGJlIGRvbmUgYWZ0ZXIgaG9zdCBjb21wb25lbnRzIGFyZSBtb3VudGVkXG4gICAgICAgIC8vIChlZyBET00gcmVuZGVyZXIgbWF5IHNjaGVkdWxlIGF1dG8tZm9jdXMgZm9yIGlucHV0cyBhbmQgZm9ybSBjb250cm9scykuXG4gICAgICAgIC8vIFRoZXNlIGVmZmVjdHMgc2hvdWxkIG9ubHkgYmUgY29tbWl0dGVkIHdoZW4gY29tcG9uZW50cyBhcmUgZmlyc3QgbW91bnRlZCxcbiAgICAgICAgLy8gYWthIHdoZW4gdGhlcmUgaXMgbm8gY3VycmVudC9hbHRlcm5hdGUuXG4gICAgICAgIGlmIChjdXJyZW50JCQxID09PSBudWxsICYmIGZpbmlzaGVkV29yay5lZmZlY3RUYWcgJiBVcGRhdGUpIHtcbiAgICAgICAgICB2YXIgdHlwZSA9IGZpbmlzaGVkV29yay50eXBlO1xuICAgICAgICAgIHZhciBwcm9wcyA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzO1xuICAgICAgICAgIGNvbW1pdE1vdW50KF9pbnN0YW5jZTIsIHR5cGUsIHByb3BzLCBmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIC8vIFdlIGhhdmUgbm8gbGlmZS1jeWNsZXMgYXNzb2NpYXRlZCB3aXRoIHRleHQuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICB7XG4gICAgICAgIC8vIFdlIGhhdmUgbm8gbGlmZS1jeWNsZXMgYXNzb2NpYXRlZCB3aXRoIHBvcnRhbHMuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAge1xuICAgICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lcikge1xuICAgICAgICAgIHZhciBvblJlbmRlciA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLm9uUmVuZGVyO1xuXG4gICAgICAgICAgaWYgKGVuYWJsZVNjaGVkdWxlclRyYWNpbmcpIHtcbiAgICAgICAgICAgIG9uUmVuZGVyKGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLmlkLCBjdXJyZW50JCQxID09PSBudWxsID8gJ21vdW50JyA6ICd1cGRhdGUnLCBmaW5pc2hlZFdvcmsuYWN0dWFsRHVyYXRpb24sIGZpbmlzaGVkV29yay50cmVlQmFzZUR1cmF0aW9uLCBmaW5pc2hlZFdvcmsuYWN0dWFsU3RhcnRUaW1lLCBnZXRDb21taXRUaW1lKCksIGZpbmlzaGVkUm9vdC5tZW1vaXplZEludGVyYWN0aW9ucyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9uUmVuZGVyKGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLmlkLCBjdXJyZW50JCQxID09PSBudWxsID8gJ21vdW50JyA6ICd1cGRhdGUnLCBmaW5pc2hlZFdvcmsuYWN0dWFsRHVyYXRpb24sIGZpbmlzaGVkV29yay50cmVlQmFzZUR1cmF0aW9uLCBmaW5pc2hlZFdvcmsuYWN0dWFsU3RhcnRUaW1lLCBnZXRDb21taXRUaW1lKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgaW52YXJpYW50KGZhbHNlLCAnVGhpcyB1bml0IG9mIHdvcmsgdGFnIHNob3VsZCBub3QgaGF2ZSBzaWRlLWVmZmVjdHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4oZmluaXNoZWRXb3JrLCBpc0hpZGRlbikge1xuICBpZiAoc3VwcG9ydHNNdXRhdGlvbikge1xuICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGluc2VydGVkIGJ1dCB3ZSBuZWVkIHRvIHJlY3Vyc2UgZG93biBpdHNcbiAgICB2YXIgbm9kZSA9IGZpbmlzaGVkV29yaztcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50KSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IG5vZGUuc3RhdGVOb2RlO1xuICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICBoaWRlSW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuaGlkZUluc3RhbmNlKG5vZGUuc3RhdGVOb2RlLCBub2RlLm1lbW9pemVkUHJvcHMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICB2YXIgX2luc3RhbmNlMyA9IG5vZGUuc3RhdGVOb2RlO1xuICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICBoaWRlVGV4dEluc3RhbmNlKF9pbnN0YW5jZTMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuaGlkZVRleHRJbnN0YW5jZShfaW5zdGFuY2UzLCBub2RlLm1lbW9pemVkUHJvcHMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCAmJiBub2RlLm1lbW9pemVkU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgLy8gRm91bmQgYSBuZXN0ZWQgU3VzcGVuc2UgY29tcG9uZW50IHRoYXQgdGltZWQgb3V0LiBTa2lwIG92ZXIgdGhlXG4gICAgICAgIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBub2RlLmNoaWxkLnNpYmxpbmc7XG4gICAgICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGZpbmlzaGVkV29yaykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRBdHRhY2hSZWYoZmluaXNoZWRXb3JrKSB7XG4gIHZhciByZWYgPSBmaW5pc2hlZFdvcmsucmVmO1xuICBpZiAocmVmICE9PSBudWxsKSB7XG4gICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICB2YXIgaW5zdGFuY2VUb1VzZSA9IHZvaWQgMDtcbiAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgaW5zdGFuY2VUb1VzZSA9IGdldFB1YmxpY0luc3RhbmNlKGluc3RhbmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpbnN0YW5jZVRvVXNlID0gaW5zdGFuY2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZWYoaW5zdGFuY2VUb1VzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFyZWYuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSkge1xuICAgICAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1VuZXhwZWN0ZWQgcmVmIG9iamVjdCBwcm92aWRlZCBmb3IgJXMuICcgKyAnVXNlIGVpdGhlciBhIHJlZi1zZXR0ZXIgZnVuY3Rpb24gb3IgUmVhY3QuY3JlYXRlUmVmKCkuJXMnLCBnZXRDb21wb25lbnROYW1lKGZpbmlzaGVkV29yay50eXBlKSwgZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKGZpbmlzaGVkV29yaykpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlZi5jdXJyZW50ID0gaW5zdGFuY2VUb1VzZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0RGV0YWNoUmVmKGN1cnJlbnQkJDEpIHtcbiAgdmFyIGN1cnJlbnRSZWYgPSBjdXJyZW50JCQxLnJlZjtcbiAgaWYgKGN1cnJlbnRSZWYgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIGN1cnJlbnRSZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGN1cnJlbnRSZWYobnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbi8vIFVzZXItb3JpZ2luYXRpbmcgZXJyb3JzIChsaWZlY3ljbGVzIGFuZCByZWZzKSBzaG91bGQgbm90IGludGVycnVwdFxuLy8gZGVsZXRpb24sIHNvIGRvbid0IGxldCB0aGVtIHRocm93LiBIb3N0LW9yaWdpbmF0aW5nIGVycm9ycyBzaG91bGRcbi8vIGludGVycnVwdCBkZWxldGlvbiwgc28gaXQncyBva2F5XG5mdW5jdGlvbiBjb21taXRVbm1vdW50KGN1cnJlbnQkJDEpIHtcbiAgb25Db21taXRVbm1vdW50KGN1cnJlbnQkJDEpO1xuXG4gIHN3aXRjaCAoY3VycmVudCQkMS50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgdXBkYXRlUXVldWUgPSBjdXJyZW50JCQxLnVwZGF0ZVF1ZXVlO1xuICAgICAgICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgbGFzdEVmZmVjdCA9IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3Q7XG4gICAgICAgICAgaWYgKGxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICAgICAgICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgdmFyIGRlc3Ryb3kgPSBlZmZlY3QuZGVzdHJveTtcbiAgICAgICAgICAgICAgaWYgKGRlc3Ryb3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGN1cnJlbnQkJDEsIGRlc3Ryb3kpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0O1xuICAgICAgICAgICAgfSB3aGlsZSAoZWZmZWN0ICE9PSBmaXJzdEVmZmVjdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50JCQxKTtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gY3VycmVudCQkMS5zdGF0ZU5vZGU7XG4gICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoY3VycmVudCQkMSwgaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50JCQxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAgLy8gVE9ETzogdGhpcyBpcyByZWN1cnNpdmUuXG4gICAgICAgIC8vIFdlIGFyZSBhbHNvIG5vdCB1c2luZyB0aGlzIHBhcmVudCBiZWNhdXNlXG4gICAgICAgIC8vIHRoZSBwb3J0YWwgd2lsbCBnZXQgcHVzaGVkIGltbWVkaWF0ZWx5LlxuICAgICAgICBpZiAoc3VwcG9ydHNNdXRhdGlvbikge1xuICAgICAgICAgIHVubW91bnRIb3N0Q29tcG9uZW50cyhjdXJyZW50JCQxKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdXBwb3J0c1BlcnNpc3RlbmNlKSB7XG4gICAgICAgICAgZW1wdHlQb3J0YWxDb250YWluZXIoY3VycmVudCQkMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdE5lc3RlZFVubW91bnRzKHJvb3QpIHtcbiAgLy8gV2hpbGUgd2UncmUgaW5zaWRlIGEgcmVtb3ZlZCBob3N0IG5vZGUgd2UgZG9uJ3Qgd2FudCB0byBjYWxsXG4gIC8vIHJlbW92ZUNoaWxkIG9uIHRoZSBpbm5lciBub2RlcyBiZWNhdXNlIHRoZXkncmUgcmVtb3ZlZCBieSB0aGUgdG9wXG4gIC8vIGNhbGwgYW55d2F5LiBXZSBhbHNvIHdhbnQgdG8gY2FsbCBjb21wb25lbnRXaWxsVW5tb3VudCBvbiBhbGxcbiAgLy8gY29tcG9zaXRlcyBiZWZvcmUgdGhpcyBob3N0IG5vZGUgaXMgcmVtb3ZlZCBmcm9tIHRoZSB0cmVlLiBUaGVyZWZvcmVcbiAgdmFyIG5vZGUgPSByb290O1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbW1pdFVubW91bnQobm9kZSk7XG4gICAgLy8gVmlzaXQgY2hpbGRyZW4gYmVjYXVzZSB0aGV5IG1heSBjb250YWluIG1vcmUgY29tcG9zaXRlIG9yIGhvc3Qgbm9kZXMuXG4gICAgLy8gU2tpcCBwb3J0YWxzIGJlY2F1c2UgY29tbWl0VW5tb3VudCgpIGN1cnJlbnRseSB2aXNpdHMgdGhlbSByZWN1cnNpdmVseS5cbiAgICBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCAmJiAoXG4gICAgLy8gSWYgd2UgdXNlIG11dGF0aW9uIHdlIGRyaWxsIGRvd24gaW50byBwb3J0YWxzIHVzaW5nIGNvbW1pdFVubW91bnQgYWJvdmUuXG4gICAgLy8gSWYgd2UgZG9uJ3QgdXNlIG11dGF0aW9uIHdlIGRyaWxsIGRvd24gaW50byBwb3J0YWxzIGhlcmUgaW5zdGVhZC5cbiAgICAhc3VwcG9ydHNNdXRhdGlvbiB8fCBub2RlLnRhZyAhPT0gSG9zdFBvcnRhbCkpIHtcbiAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChub2RlID09PSByb290KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gcm9vdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRldGFjaEZpYmVyKGN1cnJlbnQkJDEpIHtcbiAgLy8gQ3V0IG9mZiB0aGUgcmV0dXJuIHBvaW50ZXJzIHRvIGRpc2Nvbm5lY3QgaXQgZnJvbSB0aGUgdHJlZS4gSWRlYWxseSwgd2VcbiAgLy8gc2hvdWxkIGNsZWFyIHRoZSBjaGlsZCBwb2ludGVyIG9mIHRoZSBwYXJlbnQgYWx0ZXJuYXRlIHRvIGxldCB0aGlzXG4gIC8vIGdldCBHQzplZCBidXQgd2UgZG9uJ3Qga25vdyB3aGljaCBmb3Igc3VyZSB3aGljaCBwYXJlbnQgaXMgdGhlIGN1cnJlbnRcbiAgLy8gb25lIHNvIHdlJ2xsIHNldHRsZSBmb3IgR0M6aW5nIHRoZSBzdWJ0cmVlIG9mIHRoaXMgY2hpbGQuIFRoaXMgY2hpbGRcbiAgLy8gaXRzZWxmIHdpbGwgYmUgR0M6ZWQgd2hlbiB0aGUgcGFyZW50IHVwZGF0ZXMgdGhlIG5leHQgdGltZS5cbiAgY3VycmVudCQkMS5yZXR1cm4gPSBudWxsO1xuICBjdXJyZW50JCQxLmNoaWxkID0gbnVsbDtcbiAgY3VycmVudCQkMS5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgY3VycmVudCQkMS51cGRhdGVRdWV1ZSA9IG51bGw7XG4gIHZhciBhbHRlcm5hdGUgPSBjdXJyZW50JCQxLmFsdGVybmF0ZTtcbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGFsdGVybmF0ZS5yZXR1cm4gPSBudWxsO1xuICAgIGFsdGVybmF0ZS5jaGlsZCA9IG51bGw7XG4gICAgYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIGFsdGVybmF0ZS51cGRhdGVRdWV1ZSA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1wdHlQb3J0YWxDb250YWluZXIoY3VycmVudCQkMSkge1xuICBpZiAoIXN1cHBvcnRzUGVyc2lzdGVuY2UpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcG9ydGFsID0gY3VycmVudCQkMS5zdGF0ZU5vZGU7XG4gIHZhciBjb250YWluZXJJbmZvID0gcG9ydGFsLmNvbnRhaW5lckluZm87XG5cbiAgdmFyIGVtcHR5Q2hpbGRTZXQgPSBjcmVhdGVDb250YWluZXJDaGlsZFNldChjb250YWluZXJJbmZvKTtcbiAgcmVwbGFjZUNvbnRhaW5lckNoaWxkcmVuKGNvbnRhaW5lckluZm8sIGVtcHR5Q2hpbGRTZXQpO1xufVxuXG5mdW5jdGlvbiBjb21taXRDb250YWluZXIoZmluaXNoZWRXb3JrKSB7XG4gIGlmICghc3VwcG9ydHNQZXJzaXN0ZW5jZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICB7XG4gICAgICAgIHZhciBwb3J0YWxPclJvb3QgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICB2YXIgY29udGFpbmVySW5mbyA9IHBvcnRhbE9yUm9vdC5jb250YWluZXJJbmZvLFxuICAgICAgICAgICAgX3BlbmRpbmdDaGlsZHJlbiA9IHBvcnRhbE9yUm9vdC5wZW5kaW5nQ2hpbGRyZW47XG5cbiAgICAgICAgcmVwbGFjZUNvbnRhaW5lckNoaWxkcmVuKGNvbnRhaW5lckluZm8sIF9wZW5kaW5nQ2hpbGRyZW4pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgaW52YXJpYW50KGZhbHNlLCAnVGhpcyB1bml0IG9mIHdvcmsgdGFnIHNob3VsZCBub3QgaGF2ZSBzaWRlLWVmZmVjdHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFBhcmVudEZpYmVyKGZpYmVyKSB7XG4gIHZhciBwYXJlbnQgPSBmaWJlci5yZXR1cm47XG4gIHdoaWxlIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICBpZiAoaXNIb3N0UGFyZW50KHBhcmVudCkpIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gIH1cbiAgaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgdG8gZmluZCBhIGhvc3QgcGFyZW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG5mdW5jdGlvbiBpc0hvc3RQYXJlbnQoZmliZXIpIHtcbiAgcmV0dXJuIGZpYmVyLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBmaWJlci50YWcgPT09IEhvc3RSb290IHx8IGZpYmVyLnRhZyA9PT0gSG9zdFBvcnRhbDtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFNpYmxpbmcoZmliZXIpIHtcbiAgLy8gV2UncmUgZ29pbmcgdG8gc2VhcmNoIGZvcndhcmQgaW50byB0aGUgdHJlZSB1bnRpbCB3ZSBmaW5kIGEgc2libGluZyBob3N0XG4gIC8vIG5vZGUuIFVuZm9ydHVuYXRlbHksIGlmIG11bHRpcGxlIGluc2VydGlvbnMgYXJlIGRvbmUgaW4gYSByb3cgd2UgaGF2ZSB0b1xuICAvLyBzZWFyY2ggcGFzdCB0aGVtLiBUaGlzIGxlYWRzIHRvIGV4cG9uZW50aWFsIHNlYXJjaCBmb3IgdGhlIG5leHQgc2libGluZy5cbiAgdmFyIG5vZGUgPSBmaWJlcjtcbiAgc2libGluZ3M6IHdoaWxlICh0cnVlKSB7XG4gICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcsIGxldCdzIHRyeSB0aGUgbmV4dCBzaWJsaW5nLlxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBpc0hvc3RQYXJlbnQobm9kZS5yZXR1cm4pKSB7XG4gICAgICAgIC8vIElmIHdlIHBvcCBvdXQgb2YgdGhlIHJvb3Qgb3IgaGl0IHRoZSBwYXJlbnQgdGhlIGZpYmVyIHdlIGFyZSB0aGVcbiAgICAgICAgLy8gbGFzdCBzaWJsaW5nLlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgd2hpbGUgKG5vZGUudGFnICE9PSBIb3N0Q29tcG9uZW50ICYmIG5vZGUudGFnICE9PSBIb3N0VGV4dCAmJiBub2RlLnRhZyAhPT0gRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICAvLyBJZiBpdCBpcyBub3QgaG9zdCBub2RlIGFuZCwgd2UgbWlnaHQgaGF2ZSBhIGhvc3Qgbm9kZSBpbnNpZGUgaXQuXG4gICAgICAvLyBUcnkgdG8gc2VhcmNoIGRvd24gdW50aWwgd2UgZmluZCBvbmUuXG4gICAgICBpZiAobm9kZS5lZmZlY3RUYWcgJiBQbGFjZW1lbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoaWxkLCB0cnkgdGhlIHNpYmxpbmdzIGluc3RlYWQuXG4gICAgICAgIGNvbnRpbnVlIHNpYmxpbmdzO1xuICAgICAgfVxuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoaWxkLCB0cnkgdGhlIHNpYmxpbmdzIGluc3RlYWQuXG4gICAgICAvLyBXZSBhbHNvIHNraXAgcG9ydGFscyBiZWNhdXNlIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoaXMgaG9zdCB0cmVlLlxuICAgICAgaWYgKG5vZGUuY2hpbGQgPT09IG51bGwgfHwgbm9kZS50YWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgY29udGludWUgc2libGluZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBDaGVjayBpZiB0aGlzIGhvc3Qgbm9kZSBpcyBzdGFibGUgb3IgYWJvdXQgdG8gYmUgcGxhY2VkLlxuICAgIGlmICghKG5vZGUuZWZmZWN0VGFnICYgUGxhY2VtZW50KSkge1xuICAgICAgLy8gRm91bmQgaXQhXG4gICAgICByZXR1cm4gbm9kZS5zdGF0ZU5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBsYWNlbWVudChmaW5pc2hlZFdvcmspIHtcbiAgaWYgKCFzdXBwb3J0c011dGF0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gUmVjdXJzaXZlbHkgaW5zZXJ0IGFsbCBob3N0IG5vZGVzIGludG8gdGhlIHBhcmVudC5cbiAgdmFyIHBhcmVudEZpYmVyID0gZ2V0SG9zdFBhcmVudEZpYmVyKGZpbmlzaGVkV29yayk7XG5cbiAgLy8gTm90ZTogdGhlc2UgdHdvIHZhcmlhYmxlcyAqbXVzdCogYWx3YXlzIGJlIHVwZGF0ZWQgdG9nZXRoZXIuXG4gIHZhciBwYXJlbnQgPSB2b2lkIDA7XG4gIHZhciBpc0NvbnRhaW5lciA9IHZvaWQgMDtcblxuICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHBhcmVudCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIGlzQ29udGFpbmVyID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAgcGFyZW50ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICBpc0NvbnRhaW5lciA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwYXJlbnQgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgIGlzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBpbnZhcmlhbnQoZmFsc2UsICdJbnZhbGlkIGhvc3QgcGFyZW50IGZpYmVyLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG4gIGlmIChwYXJlbnRGaWJlci5lZmZlY3RUYWcgJiBDb250ZW50UmVzZXQpIHtcbiAgICAvLyBSZXNldCB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBwYXJlbnQgYmVmb3JlIGRvaW5nIGFueSBpbnNlcnRpb25zXG4gICAgcmVzZXRUZXh0Q29udGVudChwYXJlbnQpO1xuICAgIC8vIENsZWFyIENvbnRlbnRSZXNldCBmcm9tIHRoZSBlZmZlY3QgdGFnXG4gICAgcGFyZW50RmliZXIuZWZmZWN0VGFnICY9IH5Db250ZW50UmVzZXQ7XG4gIH1cblxuICB2YXIgYmVmb3JlID0gZ2V0SG9zdFNpYmxpbmcoZmluaXNoZWRXb3JrKTtcbiAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgaW5zZXJ0ZWQgYnV0IHdlIG5lZWQgdG8gcmVjdXJzZSBkb3duIGl0c1xuICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gIHZhciBub2RlID0gZmluaXNoZWRXb3JrO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgIGlmIChiZWZvcmUpIHtcbiAgICAgICAgaWYgKGlzQ29udGFpbmVyKSB7XG4gICAgICAgICAgaW5zZXJ0SW5Db250YWluZXJCZWZvcmUocGFyZW50LCBub2RlLnN0YXRlTm9kZSwgYmVmb3JlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbnNlcnRCZWZvcmUocGFyZW50LCBub2RlLnN0YXRlTm9kZSwgYmVmb3JlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzQ29udGFpbmVyKSB7XG4gICAgICAgICAgYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcihwYXJlbnQsIG5vZGUuc3RhdGVOb2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhcHBlbmRDaGlsZChwYXJlbnQsIG5vZGUuc3RhdGVOb2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgIC8vIElmIHRoZSBpbnNlcnRpb24gaXRzZWxmIGlzIGEgcG9ydGFsLCB0aGVuIHdlIGRvbid0IHdhbnQgdG8gdHJhdmVyc2VcbiAgICAgIC8vIGRvd24gaXRzIGNoaWxkcmVuLiBJbnN0ZWFkLCB3ZSdsbCBnZXQgaW5zZXJ0aW9ucyBmcm9tIGVhY2ggY2hpbGQgaW5cbiAgICAgIC8vIHRoZSBwb3J0YWwgZGlyZWN0bHkuXG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAobm9kZSA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5tb3VudEhvc3RDb21wb25lbnRzKGN1cnJlbnQkJDEpIHtcbiAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgZGVsZXRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gIHZhciBub2RlID0gY3VycmVudCQkMTtcblxuICAvLyBFYWNoIGl0ZXJhdGlvbiwgY3VycmVudFBhcmVudCBpcyBwb3B1bGF0ZWQgd2l0aCBub2RlJ3MgaG9zdCBwYXJlbnQgaWYgbm90XG4gIC8vIGN1cnJlbnRQYXJlbnRJc1ZhbGlkLlxuICB2YXIgY3VycmVudFBhcmVudElzVmFsaWQgPSBmYWxzZTtcblxuICAvLyBOb3RlOiB0aGVzZSB0d28gdmFyaWFibGVzICptdXN0KiBhbHdheXMgYmUgdXBkYXRlZCB0b2dldGhlci5cbiAgdmFyIGN1cnJlbnRQYXJlbnQgPSB2b2lkIDA7XG4gIHZhciBjdXJyZW50UGFyZW50SXNDb250YWluZXIgPSB2b2lkIDA7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoIWN1cnJlbnRQYXJlbnRJc1ZhbGlkKSB7XG4gICAgICB2YXIgcGFyZW50ID0gbm9kZS5yZXR1cm47XG4gICAgICBmaW5kUGFyZW50OiB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAhKHBhcmVudCAhPT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCB0byBmaW5kIGEgaG9zdCBwYXJlbnQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJykgOiB2b2lkIDA7XG4gICAgICAgIHN3aXRjaCAocGFyZW50LnRhZykge1xuICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlO1xuICAgICAgICAgICAgY3VycmVudFBhcmVudElzQ29udGFpbmVyID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhayBmaW5kUGFyZW50O1xuICAgICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgICBjdXJyZW50UGFyZW50ID0gcGFyZW50LnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgY3VycmVudFBhcmVudElzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG4gICAgICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICAgICAgY3VycmVudFBhcmVudCA9IHBhcmVudC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICAgIGN1cnJlbnRQYXJlbnRJc0NvbnRhaW5lciA9IHRydWU7XG4gICAgICAgICAgICBicmVhayBmaW5kUGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gICAgICB9XG4gICAgICBjdXJyZW50UGFyZW50SXNWYWxpZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgY29tbWl0TmVzdGVkVW5tb3VudHMobm9kZSk7XG4gICAgICAvLyBBZnRlciBhbGwgdGhlIGNoaWxkcmVuIGhhdmUgdW5tb3VudGVkLCBpdCBpcyBub3cgc2FmZSB0byByZW1vdmUgdGhlXG4gICAgICAvLyBub2RlIGZyb20gdGhlIHRyZWUuXG4gICAgICBpZiAoY3VycmVudFBhcmVudElzQ29udGFpbmVyKSB7XG4gICAgICAgIHJlbW92ZUNoaWxkRnJvbUNvbnRhaW5lcihjdXJyZW50UGFyZW50LCBub2RlLnN0YXRlTm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZW1vdmVDaGlsZChjdXJyZW50UGFyZW50LCBub2RlLnN0YXRlTm9kZSk7XG4gICAgICB9XG4gICAgICAvLyBEb24ndCB2aXNpdCBjaGlsZHJlbiBiZWNhdXNlIHdlIGFscmVhZHkgdmlzaXRlZCB0aGVtLlxuICAgIH0gZWxzZSBpZiAoZW5hYmxlU3VzcGVuc2VTZXJ2ZXJSZW5kZXJlciAmJiBub2RlLnRhZyA9PT0gRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICAvLyBEZWxldGUgdGhlIGRlaHlkcmF0ZWQgc3VzcGVuc2UgYm91bmRhcnkgYW5kIGFsbCBvZiBpdHMgY29udGVudC5cbiAgICAgIGlmIChjdXJyZW50UGFyZW50SXNDb250YWluZXIpIHtcbiAgICAgICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5RnJvbUNvbnRhaW5lcihjdXJyZW50UGFyZW50LCBub2RlLnN0YXRlTm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGVhclN1c3BlbnNlQm91bmRhcnkoY3VycmVudFBhcmVudCwgbm9kZS5zdGF0ZU5vZGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIC8vIFdoZW4gd2UgZ28gaW50byBhIHBvcnRhbCwgaXQgYmVjb21lcyB0aGUgcGFyZW50IHRvIHJlbW92ZSBmcm9tLlxuICAgICAgICAvLyBXZSB3aWxsIHJlYXNzaWduIGl0IGJhY2sgd2hlbiB3ZSBwb3AgdGhlIHBvcnRhbCBvbiB0aGUgd2F5IHVwLlxuICAgICAgICBjdXJyZW50UGFyZW50ID0gbm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgY3VycmVudFBhcmVudElzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgICAgLy8gVmlzaXQgY2hpbGRyZW4gYmVjYXVzZSBwb3J0YWxzIG1pZ2h0IGNvbnRhaW4gaG9zdCBjb21wb25lbnRzLlxuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0VW5tb3VudChub2RlKTtcbiAgICAgIC8vIFZpc2l0IGNoaWxkcmVuIGJlY2F1c2Ugd2UgbWF5IGZpbmQgbW9yZSBob3N0IGNvbXBvbmVudHMgYmVsb3cuXG4gICAgICBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5vZGUgPT09IGN1cnJlbnQkJDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSBjdXJyZW50JCQxKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAvLyBXaGVuIHdlIGdvIG91dCBvZiB0aGUgcG9ydGFsLCB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIHBhcmVudC5cbiAgICAgICAgLy8gU2luY2Ugd2UgZG9uJ3Qga2VlcCBhIHN0YWNrIG9mIHRoZW0sIHdlIHdpbGwgc2VhcmNoIGZvciBpdC5cbiAgICAgICAgY3VycmVudFBhcmVudElzVmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0RGVsZXRpb24oY3VycmVudCQkMSkge1xuICBpZiAoc3VwcG9ydHNNdXRhdGlvbikge1xuICAgIC8vIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBhbGwgaG9zdCBub2RlcyBmcm9tIHRoZSBwYXJlbnQuXG4gICAgLy8gRGV0YWNoIHJlZnMgYW5kIGNhbGwgY29tcG9uZW50V2lsbFVubW91bnQoKSBvbiB0aGUgd2hvbGUgc3VidHJlZS5cbiAgICB1bm1vdW50SG9zdENvbXBvbmVudHMoY3VycmVudCQkMSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gRGV0YWNoIHJlZnMgYW5kIGNhbGwgY29tcG9uZW50V2lsbFVubW91bnQoKSBvbiB0aGUgd2hvbGUgc3VidHJlZS5cbiAgICBjb21taXROZXN0ZWRVbm1vdW50cyhjdXJyZW50JCQxKTtcbiAgfVxuICBkZXRhY2hGaWJlcihjdXJyZW50JCQxKTtcbn1cblxuZnVuY3Rpb24gY29tbWl0V29yayhjdXJyZW50JCQxLCBmaW5pc2hlZFdvcmspIHtcbiAgaWYgKCFzdXBwb3J0c011dGF0aW9uKSB7XG4gICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gTm90ZTogV2UgY3VycmVudGx5IG5ldmVyIHVzZSBNb3VudE11dGF0aW9uLCBidXQgdXNlTGF5b3V0IHVzZXNcbiAgICAgICAgICAvLyBVbm1vdW50TXV0YXRpb24uXG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3QoVW5tb3VudE11dGF0aW9uLCBNb3VudE11dGF0aW9uLCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbW1pdENvbnRhaW5lcihmaW5pc2hlZFdvcmspO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIE5vdGU6IFdlIGN1cnJlbnRseSBuZXZlciB1c2UgTW91bnRNdXRhdGlvbiwgYnV0IHVzZUxheW91dCB1c2VzXG4gICAgICAgIC8vIFVubW91bnRNdXRhdGlvbi5cbiAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3QoVW5tb3VudE11dGF0aW9uLCBNb3VudE11dGF0aW9uLCBmaW5pc2hlZFdvcmspO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgaWYgKGluc3RhbmNlICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBDb21taXQgdGhlIHdvcmsgcHJlcGFyZWQgZWFybGllci5cbiAgICAgICAgICB2YXIgbmV3UHJvcHMgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAvLyBGb3IgaHlkcmF0aW9uIHdlIHJldXNlIHRoZSB1cGRhdGUgcGF0aCBidXQgd2UgdHJlYXQgdGhlIG9sZFByb3BzXG4gICAgICAgICAgLy8gYXMgdGhlIG5ld1Byb3BzLiBUaGUgdXBkYXRlUGF5bG9hZCB3aWxsIGNvbnRhaW4gdGhlIHJlYWwgY2hhbmdlIGluXG4gICAgICAgICAgLy8gdGhpcyBjYXNlLlxuICAgICAgICAgIHZhciBvbGRQcm9wcyA9IGN1cnJlbnQkJDEgIT09IG51bGwgPyBjdXJyZW50JCQxLm1lbW9pemVkUHJvcHMgOiBuZXdQcm9wcztcbiAgICAgICAgICB2YXIgdHlwZSA9IGZpbmlzaGVkV29yay50eXBlO1xuICAgICAgICAgIC8vIFRPRE86IFR5cGUgdGhlIHVwZGF0ZVF1ZXVlIHRvIGJlIHNwZWNpZmljIHRvIGhvc3QgY29tcG9uZW50cy5cbiAgICAgICAgICB2YXIgdXBkYXRlUGF5bG9hZCA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgICAgICAgICBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUgPSBudWxsO1xuICAgICAgICAgIGlmICh1cGRhdGVQYXlsb2FkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21taXRVcGRhdGUoaW5zdGFuY2UsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgICEoZmluaXNoZWRXb3JrLnN0YXRlTm9kZSAhPT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICdUaGlzIHNob3VsZCBoYXZlIGEgdGV4dCBub2RlIGluaXRpYWxpemVkLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpIDogdm9pZCAwO1xuICAgICAgICB2YXIgdGV4dEluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgdmFyIG5ld1RleHQgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgLy8gRm9yIGh5ZHJhdGlvbiB3ZSByZXVzZSB0aGUgdXBkYXRlIHBhdGggYnV0IHdlIHRyZWF0IHRoZSBvbGRQcm9wc1xuICAgICAgICAvLyBhcyB0aGUgbmV3UHJvcHMuIFRoZSB1cGRhdGVQYXlsb2FkIHdpbGwgY29udGFpbiB0aGUgcmVhbCBjaGFuZ2UgaW5cbiAgICAgICAgLy8gdGhpcyBjYXNlLlxuICAgICAgICB2YXIgb2xkVGV4dCA9IGN1cnJlbnQkJDEgIT09IG51bGwgPyBjdXJyZW50JCQxLm1lbW9pemVkUHJvcHMgOiBuZXdUZXh0O1xuICAgICAgICBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBuZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgIHZhciBuZXdEaWRUaW1lb3V0ID0gdm9pZCAwO1xuICAgICAgICB2YXIgcHJpbWFyeUNoaWxkUGFyZW50ID0gZmluaXNoZWRXb3JrO1xuICAgICAgICBpZiAobmV3U3RhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICBuZXdEaWRUaW1lb3V0ID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3RGlkVGltZW91dCA9IHRydWU7XG4gICAgICAgICAgcHJpbWFyeUNoaWxkUGFyZW50ID0gZmluaXNoZWRXb3JrLmNoaWxkO1xuICAgICAgICAgIGlmIChuZXdTdGF0ZS50aW1lZE91dEF0ID09PSBOb1dvcmspIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBjaGlsZHJlbiBoYWQgbm90IGFscmVhZHkgdGltZWQgb3V0LCByZWNvcmQgdGhlIHRpbWUuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGR1cmluZyBzdWJzZXF1ZW50XG4gICAgICAgICAgICAvLyBhdHRlbXB0cyB0byByZW5kZXIgdGhlIGNoaWxkcmVuLlxuICAgICAgICAgICAgbmV3U3RhdGUudGltZWRPdXRBdCA9IHJlcXVlc3RDdXJyZW50VGltZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmltYXJ5Q2hpbGRQYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICBoaWRlT3JVbmhpZGVBbGxDaGlsZHJlbihwcmltYXJ5Q2hpbGRQYXJlbnQsIG5ld0RpZFRpbWVvdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhpcyBib3VuZGFyeSBqdXN0IHRpbWVkIG91dCwgdGhlbiBpdCB3aWxsIGhhdmUgYSBzZXQgb2YgdGhlbmFibGVzLlxuICAgICAgICAvLyBGb3IgZWFjaCB0aGVuYWJsZSwgYXR0YWNoIGEgbGlzdGVuZXIgc28gdGhhdCB3aGVuIGl0IHJlc29sdmVzLCBSZWFjdFxuICAgICAgICAvLyBhdHRlbXB0cyB0byByZS1yZW5kZXIgdGhlIGJvdW5kYXJ5IGluIHRoZSBwcmltYXJ5IChwcmUtdGltZW91dCkgc3RhdGUuXG4gICAgICAgIHZhciB0aGVuYWJsZXMgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gICAgICAgIGlmICh0aGVuYWJsZXMgIT09IG51bGwpIHtcbiAgICAgICAgICBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUgPSBudWxsO1xuICAgICAgICAgIHZhciByZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICBpZiAocmV0cnlDYWNoZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0cnlDYWNoZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUgPSBuZXcgUG9zc2libHlXZWFrU2V0JDEoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhlbmFibGVzLmZvckVhY2goZnVuY3Rpb24gKHRoZW5hYmxlKSB7XG4gICAgICAgICAgICAvLyBNZW1vaXplIHVzaW5nIHRoZSBib3VuZGFyeSBmaWJlciB0byBwcmV2ZW50IHJlZHVuZGFudCBsaXN0ZW5lcnMuXG4gICAgICAgICAgICB2YXIgcmV0cnkgPSByZXRyeVRpbWVkT3V0Qm91bmRhcnkuYmluZChudWxsLCBmaW5pc2hlZFdvcmssIHRoZW5hYmxlKTtcbiAgICAgICAgICAgIGlmIChlbmFibGVTY2hlZHVsZXJUcmFjaW5nKSB7XG4gICAgICAgICAgICAgIHJldHJ5ID0gdHJhY2luZy51bnN0YWJsZV93cmFwKHJldHJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcmV0cnlDYWNoZS5oYXModGhlbmFibGUpKSB7XG4gICAgICAgICAgICAgIHJldHJ5Q2FjaGUuYWRkKHRoZW5hYmxlKTtcbiAgICAgICAgICAgICAgdGhlbmFibGUudGhlbihyZXRyeSwgcmV0cnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgaW52YXJpYW50KGZhbHNlLCAnVGhpcyB1bml0IG9mIHdvcmsgdGFnIHNob3VsZCBub3QgaGF2ZSBzaWRlLWVmZmVjdHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UmVzZXRUZXh0Q29udGVudChjdXJyZW50JCQxKSB7XG4gIGlmICghc3VwcG9ydHNNdXRhdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuICByZXNldFRleHRDb250ZW50KGN1cnJlbnQkJDEuc3RhdGVOb2RlKTtcbn1cblxudmFyIFBvc3NpYmx5V2Vha1NldCA9IHR5cGVvZiBXZWFrU2V0ID09PSAnZnVuY3Rpb24nID8gV2Vha1NldCA6IFNldDtcbnZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvb3RFcnJvclVwZGF0ZShmaWJlciwgZXJyb3JJbmZvLCBleHBpcmF0aW9uVGltZSkge1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV4cGlyYXRpb25UaW1lKTtcbiAgLy8gVW5tb3VudCB0aGUgcm9vdCBieSByZW5kZXJpbmcgbnVsbC5cbiAgdXBkYXRlLnRhZyA9IENhcHR1cmVVcGRhdGU7XG4gIC8vIENhdXRpb246IFJlYWN0IERldlRvb2xzIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJvcGVydHlcbiAgLy8gYmVpbmcgY2FsbGVkIFwiZWxlbWVudFwiLlxuICB1cGRhdGUucGF5bG9hZCA9IHsgZWxlbWVudDogbnVsbCB9O1xuICB2YXIgZXJyb3IgPSBlcnJvckluZm8udmFsdWU7XG4gIHVwZGF0ZS5jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICBvblVuY2F1Z2h0RXJyb3IoZXJyb3IpO1xuICAgIGxvZ0Vycm9yKGZpYmVyLCBlcnJvckluZm8pO1xuICB9O1xuICByZXR1cm4gdXBkYXRlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIGV4cGlyYXRpb25UaW1lKSB7XG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXhwaXJhdGlvblRpbWUpO1xuICB1cGRhdGUudGFnID0gQ2FwdHVyZVVwZGF0ZTtcbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9IGZpYmVyLnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yO1xuICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBlcnJvciA9IGVycm9ySW5mby52YWx1ZTtcbiAgICB1cGRhdGUucGF5bG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZXJyb3IpO1xuICAgIH07XG4gIH1cblxuICB2YXIgaW5zdCA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgaWYgKGluc3QgIT09IG51bGwgJiYgdHlwZW9mIGluc3QuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRvIHByZXNlcnZlIHRoZSBwcmVleGlzdGluZyByZXRyeSBiZWhhdmlvciBvZiBlcnJvciBib3VuZGFyaWVzLFxuICAgICAgICAvLyB3ZSBrZWVwIHRyYWNrIG9mIHdoaWNoIG9uZXMgYWxyZWFkeSBmYWlsZWQgZHVyaW5nIHRoaXMgYmF0Y2guXG4gICAgICAgIC8vIFRoaXMgZ2V0cyByZXNldCBiZWZvcmUgd2UgeWllbGQgYmFjayB0byB0aGUgYnJvd3Nlci5cbiAgICAgICAgLy8gVE9ETzogV2FybiBpbiBzdHJpY3QgbW9kZSBpZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgaXNcbiAgICAgICAgLy8gbm90IGRlZmluZWQuXG4gICAgICAgIG1hcmtMZWdhY3lFcnJvckJvdW5kYXJ5QXNGYWlsZWQodGhpcyk7XG4gICAgICB9XG4gICAgICB2YXIgZXJyb3IgPSBlcnJvckluZm8udmFsdWU7XG4gICAgICB2YXIgc3RhY2sgPSBlcnJvckluZm8uc3RhY2s7XG4gICAgICBsb2dFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcbiAgICAgIHRoaXMuY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IsIHtcbiAgICAgICAgY29tcG9uZW50U3RhY2s6IHN0YWNrICE9PSBudWxsID8gc3RhY2sgOiAnJ1xuICAgICAgfSk7XG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gSWYgY29tcG9uZW50RGlkQ2F0Y2ggaXMgdGhlIG9ubHkgZXJyb3IgYm91bmRhcnkgbWV0aG9kIGRlZmluZWQsXG4gICAgICAgICAgLy8gdGhlbiBpdCBuZWVkcyB0byBjYWxsIHNldFN0YXRlIHRvIHJlY292ZXIgZnJvbSBlcnJvcnMuXG4gICAgICAgICAgLy8gSWYgbm8gc3RhdGUgdXBkYXRlIGlzIHNjaGVkdWxlZCB0aGVuIHRoZSBib3VuZGFyeSB3aWxsIHN3YWxsb3cgdGhlIGVycm9yLlxuICAgICAgICAgICEoZmliZXIuZXhwaXJhdGlvblRpbWUgPT09IFN5bmMpID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnJXM6IEVycm9yIGJvdW5kYXJpZXMgc2hvdWxkIGltcGxlbWVudCBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoKS4gJyArICdJbiB0aGF0IG1ldGhvZCwgcmV0dXJuIGEgc3RhdGUgdXBkYXRlIHRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBvciBmYWxsYmFjayBVSS4nLCBnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdVbmtub3duJykgOiB2b2lkIDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHJldHVybiB1cGRhdGU7XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCByZW5kZXJFeHBpcmF0aW9uVGltZSwgdGhlbmFibGUpIHtcbiAgLy8gQXR0YWNoIGEgbGlzdGVuZXIgdG8gdGhlIHByb21pc2UgdG8gXCJwaW5nXCIgdGhlIHJvb3QgYW5kIHJldHJ5LiBCdXRcbiAgLy8gb25seSBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGN1cnJlbnQgcmVuZGVyIGV4cGlyYXRpb25cbiAgLy8gdGltZSAod2hpY2ggYWN0cyBsaWtlIGEgXCJ0aHJlYWQgSURcIiBoZXJlKS5cbiAgdmFyIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlO1xuICB2YXIgdGhyZWFkSURzID0gdm9pZCAwO1xuICBpZiAocGluZ0NhY2hlID09PSBudWxsKSB7XG4gICAgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG4gICAgdGhyZWFkSURzID0gbmV3IFNldCgpO1xuICAgIHBpbmdDYWNoZS5zZXQodGhlbmFibGUsIHRocmVhZElEcyk7XG4gIH0gZWxzZSB7XG4gICAgdGhyZWFkSURzID0gcGluZ0NhY2hlLmdldCh0aGVuYWJsZSk7XG4gICAgaWYgKHRocmVhZElEcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJlYWRJRHMgPSBuZXcgU2V0KCk7XG4gICAgICBwaW5nQ2FjaGUuc2V0KHRoZW5hYmxlLCB0aHJlYWRJRHMpO1xuICAgIH1cbiAgfVxuICBpZiAoIXRocmVhZElEcy5oYXMocmVuZGVyRXhwaXJhdGlvblRpbWUpKSB7XG4gICAgLy8gTWVtb2l6ZSB1c2luZyB0aGUgdGhyZWFkIElEIHRvIHByZXZlbnQgcmVkdW5kYW50IGxpc3RlbmVycy5cbiAgICB0aHJlYWRJRHMuYWRkKHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICB2YXIgcGluZyA9IHBpbmdTdXNwZW5kZWRSb290LmJpbmQobnVsbCwgcm9vdCwgdGhlbmFibGUsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICBpZiAoZW5hYmxlU2NoZWR1bGVyVHJhY2luZykge1xuICAgICAgcGluZyA9IHRyYWNpbmcudW5zdGFibGVfd3JhcChwaW5nKTtcbiAgICB9XG4gICAgdGhlbmFibGUudGhlbihwaW5nLCBwaW5nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0aHJvd0V4Y2VwdGlvbihyb290LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHZhbHVlLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAvLyBUaGUgc291cmNlIGZpYmVyIGRpZCBub3QgY29tcGxldGUuXG4gIHNvdXJjZUZpYmVyLmVmZmVjdFRhZyB8PSBJbmNvbXBsZXRlO1xuICAvLyBJdHMgZWZmZWN0IGxpc3QgaXMgbm8gbG9uZ2VyIHZhbGlkLlxuICBzb3VyY2VGaWJlci5maXJzdEVmZmVjdCA9IHNvdXJjZUZpYmVyLmxhc3RFZmZlY3QgPSBudWxsO1xuXG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVGhpcyBpcyBhIHRoZW5hYmxlLlxuICAgIHZhciB0aGVuYWJsZSA9IHZhbHVlO1xuXG4gICAgLy8gRmluZCB0aGUgZWFybGllc3QgdGltZW91dCB0aHJlc2hvbGQgb2YgYWxsIHRoZSBwbGFjZWhvbGRlcnMgaW4gdGhlXG4gICAgLy8gYW5jZXN0b3IgcGF0aC4gV2UgY291bGQgYXZvaWQgdGhpcyB0cmF2ZXJzYWwgYnkgc3RvcmluZyB0aGUgdGhyZXNob2xkcyBvblxuICAgIC8vIHRoZSBzdGFjaywgYnV0IHdlIGNob29zZSBub3QgdG8gYmVjYXVzZSB3ZSBvbmx5IGhpdCB0aGlzIHBhdGggaWYgd2UncmVcbiAgICAvLyBJTy1ib3VuZCAoaS5lLiBpZiBzb21ldGhpbmcgc3VzcGVuZHMpLiBXaGVyZWFzIHRoZSBzdGFjayBpcyB1c2VkIGV2ZW4gaW5cbiAgICAvLyB0aGUgbm9uLUlPLSBib3VuZCBjYXNlLlxuICAgIHZhciBfd29ya0luUHJvZ3Jlc3MgPSByZXR1cm5GaWJlcjtcbiAgICB2YXIgZWFybGllc3RUaW1lb3V0TXMgPSAtMTtcbiAgICB2YXIgc3RhcnRUaW1lTXMgPSAtMTtcbiAgICBkbyB7XG4gICAgICBpZiAoX3dvcmtJblByb2dyZXNzLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGN1cnJlbnQkJDEgPSBfd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuICAgICAgICBpZiAoY3VycmVudCQkMSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSBjdXJyZW50JCQxLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gUmVhY2hlZCBhIGJvdW5kYXJ5IHRoYXQgYWxyZWFkeSB0aW1lZCBvdXQuIERvIG5vdCBzZWFyY2hcbiAgICAgICAgICAgIC8vIGFueSBmdXJ0aGVyLlxuICAgICAgICAgICAgdmFyIHRpbWVkT3V0QXQgPSBjdXJyZW50U3RhdGUudGltZWRPdXRBdDtcbiAgICAgICAgICAgIHN0YXJ0VGltZU1zID0gZXhwaXJhdGlvblRpbWVUb01zKHRpbWVkT3V0QXQpO1xuICAgICAgICAgICAgLy8gRG8gbm90IHNlYXJjaCBhbnkgZnVydGhlci5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgdGltZW91dFByb3BNcyA9IF93b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMubWF4RHVyYXRpb247XG4gICAgICAgIGlmICh0eXBlb2YgdGltZW91dFByb3BNcyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBpZiAodGltZW91dFByb3BNcyA8PSAwKSB7XG4gICAgICAgICAgICBlYXJsaWVzdFRpbWVvdXRNcyA9IDA7XG4gICAgICAgICAgfSBlbHNlIGlmIChlYXJsaWVzdFRpbWVvdXRNcyA9PT0gLTEgfHwgdGltZW91dFByb3BNcyA8IGVhcmxpZXN0VGltZW91dE1zKSB7XG4gICAgICAgICAgICBlYXJsaWVzdFRpbWVvdXRNcyA9IHRpbWVvdXRQcm9wTXM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBJZiB0aGVyZSBpcyBhIERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudCB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGJlY2F1c2VcbiAgICAgIC8vIGlmIHNvbWV0aGluZyBzdXNwZW5kcyBpbnNpZGUgaXQsIHdlIHdpbGwgc2ltcGx5IGxlYXZlIHRoYXQgYXMgZGVoeWRyYXRlZC4gSXRcbiAgICAgIC8vIHdpbGwgbmV2ZXIgdGltZW91dC5cbiAgICAgIF93b3JrSW5Qcm9ncmVzcyA9IF93b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gICAgfSB3aGlsZSAoX3dvcmtJblByb2dyZXNzICE9PSBudWxsKTtcblxuICAgIC8vIFNjaGVkdWxlIHRoZSBuZWFyZXN0IFN1c3BlbnNlIHRvIHJlLXJlbmRlciB0aGUgdGltZWQgb3V0IHZpZXcuXG4gICAgX3dvcmtJblByb2dyZXNzID0gcmV0dXJuRmliZXI7XG4gICAgZG8ge1xuICAgICAgaWYgKF93b3JrSW5Qcm9ncmVzcy50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50ICYmIHNob3VsZENhcHR1cmVTdXNwZW5zZShfd29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICAgIC8vIEZvdW5kIHRoZSBuZWFyZXN0IGJvdW5kYXJ5LlxuXG4gICAgICAgIC8vIFN0YXNoIHRoZSBwcm9taXNlIG9uIHRoZSBib3VuZGFyeSBmaWJlci4gSWYgdGhlIGJvdW5kYXJ5IHRpbWVzIG91dCwgd2UnbGxcbiAgICAgICAgdmFyIHRoZW5hYmxlcyA9IF93b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgICAgICAgaWYgKHRoZW5hYmxlcyA9PT0gbnVsbCkge1xuICAgICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IG5ldyBTZXQoKTtcbiAgICAgICAgICB1cGRhdGVRdWV1ZS5hZGQodGhlbmFibGUpO1xuICAgICAgICAgIF93b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IHVwZGF0ZVF1ZXVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoZW5hYmxlcy5hZGQodGhlbmFibGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIGJvdW5kYXJ5IGlzIG91dHNpZGUgb2YgY29uY3VycmVudCBtb2RlLCB3ZSBzaG91bGQgKm5vdCpcbiAgICAgICAgLy8gc3VzcGVuZCB0aGUgY29tbWl0LiBQcmV0ZW5kIGFzIGlmIHRoZSBzdXNwZW5kZWQgY29tcG9uZW50IHJlbmRlcmVkXG4gICAgICAgIC8vIG51bGwgYW5kIGtlZXAgcmVuZGVyaW5nLiBJbiB0aGUgY29tbWl0IHBoYXNlLCB3ZSdsbCBzY2hlZHVsZSBhXG4gICAgICAgIC8vIHN1YnNlcXVlbnQgc3luY2hyb25vdXMgdXBkYXRlIHRvIHJlLXJlbmRlciB0aGUgU3VzcGVuc2UuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE5vdGU6IEl0IGRvZXNuJ3QgbWF0dGVyIHdoZXRoZXIgdGhlIGNvbXBvbmVudCB0aGF0IHN1c3BlbmRlZCB3YXNcbiAgICAgICAgLy8gaW5zaWRlIGEgY29uY3VycmVudCBtb2RlIHRyZWUuIElmIHRoZSBTdXNwZW5zZSBpcyBvdXRzaWRlIG9mIGl0LCB3ZVxuICAgICAgICAvLyBzaG91bGQgKm5vdCogc3VzcGVuZCB0aGUgY29tbWl0LlxuICAgICAgICBpZiAoKF93b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb0VmZmVjdCkge1xuICAgICAgICAgIF93b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gRGlkQ2FwdHVyZTtcblxuICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGNvbW1pdCB0aGlzIGZpYmVyIGV2ZW4gdGhvdWdoIGl0IGRpZG4ndCBjb21wbGV0ZS5cbiAgICAgICAgICAvLyBCdXQgd2Ugc2hvdWxkbid0IGNhbGwgYW55IGxpZmVjeWNsZSBtZXRob2RzIG9yIGNhbGxiYWNrcy4gUmVtb3ZlXG4gICAgICAgICAgLy8gYWxsIGxpZmVjeWNsZSBlZmZlY3QgdGFncy5cbiAgICAgICAgICBzb3VyY2VGaWJlci5lZmZlY3RUYWcgJj0gfihMaWZlY3ljbGVFZmZlY3RNYXNrIHwgSW5jb21wbGV0ZSk7XG5cbiAgICAgICAgICBpZiAoc291cmNlRmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRTb3VyY2VGaWJlciA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50U291cmNlRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG5ldyBtb3VudC4gQ2hhbmdlIHRoZSB0YWcgc28gaXQncyBub3QgbWlzdGFrZW4gZm9yIGFcbiAgICAgICAgICAgICAgLy8gY29tcGxldGVkIGNsYXNzIGNvbXBvbmVudC4gRm9yIGV4YW1wbGUsIHdlIHNob3VsZCBub3QgY2FsbFxuICAgICAgICAgICAgICAvLyBjb21wb25lbnRXaWxsVW5tb3VudCBpZiBpdCBpcyBkZWxldGVkLlxuICAgICAgICAgICAgICBzb3VyY2VGaWJlci50YWcgPSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBXaGVuIHdlIHRyeSByZW5kZXJpbmcgYWdhaW4sIHdlIHNob3VsZCBub3QgcmV1c2UgdGhlIGN1cnJlbnQgZmliZXIsXG4gICAgICAgICAgICAgIC8vIHNpbmNlIGl0J3Mga25vd24gdG8gYmUgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBVc2UgYSBmb3JjZSB1cGR0ZSB0b1xuICAgICAgICAgICAgICAvLyBwcmV2ZW50IGEgYmFpbCBvdXQuXG4gICAgICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoU3luYyk7XG4gICAgICAgICAgICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTtcbiAgICAgICAgICAgICAgZW5xdWV1ZVVwZGF0ZShzb3VyY2VGaWJlciwgdXBkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUaGUgc291cmNlIGZpYmVyIGRpZCBub3QgY29tcGxldGUuIE1hcmsgaXQgd2l0aCBTeW5jIHByaW9yaXR5IHRvXG4gICAgICAgICAgLy8gaW5kaWNhdGUgdGhhdCBpdCBzdGlsbCBoYXMgcGVuZGluZyB3b3JrLlxuICAgICAgICAgIHNvdXJjZUZpYmVyLmV4cGlyYXRpb25UaW1lID0gU3luYztcblxuICAgICAgICAgIC8vIEV4aXQgd2l0aG91dCBzdXNwZW5kaW5nLlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbmZpcm1lZCB0aGF0IHRoZSBib3VuZGFyeSBpcyBpbiBhIGNvbmN1cnJlbnQgbW9kZSB0cmVlLiBDb250aW51ZVxuICAgICAgICAvLyB3aXRoIHRoZSBub3JtYWwgc3VzcGVuZCBwYXRoLlxuXG4gICAgICAgIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCByZW5kZXJFeHBpcmF0aW9uVGltZSwgdGhlbmFibGUpO1xuXG4gICAgICAgIHZhciBhYnNvbHV0ZVRpbWVvdXRNcyA9IHZvaWQgMDtcbiAgICAgICAgaWYgKGVhcmxpZXN0VGltZW91dE1zID09PSAtMSkge1xuICAgICAgICAgIC8vIElmIG5vIGV4cGxpY2l0IHRocmVzaG9sZCBpcyBnaXZlbiwgZGVmYXVsdCB0byBhbiBhcmJpdHJhcmlseSBsYXJnZVxuICAgICAgICAgIC8vIHZhbHVlLiBUaGUgYWN0dWFsIHNpemUgZG9lc24ndCBtYXR0ZXIgYmVjYXVzZSB0aGUgdGhyZXNob2xkIGZvciB0aGVcbiAgICAgICAgICAvLyB3aG9sZSB0cmVlIHdpbGwgYmUgY2xhbXBlZCB0byB0aGUgZXhwaXJhdGlvbiB0aW1lLlxuICAgICAgICAgIGFic29sdXRlVGltZW91dE1zID0gbWF4U2lnbmVkMzFCaXRJbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHN0YXJ0VGltZU1zID09PSAtMSkge1xuICAgICAgICAgICAgLy8gVGhpcyBzdXNwZW5kIGhhcHBlbmVkIG91dHNpZGUgb2YgYW55IGFscmVhZHkgdGltZWQtb3V0XG4gICAgICAgICAgICAvLyBwbGFjZWhvbGRlcnMuIFdlIGRvbid0IGtub3cgZXhhY3RseSB3aGVuIHRoZSB1cGRhdGUgd2FzXG4gICAgICAgICAgICAvLyBzY2hlZHVsZWQsIGJ1dCB3ZSBjYW4gaW5mZXIgYW4gYXBwcm94aW1hdGUgc3RhcnQgdGltZSBmcm9tIHRoZVxuICAgICAgICAgICAgLy8gZXhwaXJhdGlvbiB0aW1lLiBGaXJzdCwgZmluZCB0aGUgZWFybGllc3QgdW5jb21taXR0ZWQgZXhwaXJhdGlvblxuICAgICAgICAgICAgLy8gdGltZSBpbiB0aGUgdHJlZSwgaW5jbHVkaW5nIHdvcmsgdGhhdCBpcyBzdXNwZW5kZWQuIFRoZW4gc3VidHJhY3RcbiAgICAgICAgICAgIC8vIHRoZSBvZmZzZXQgdXNlZCB0byBjb21wdXRlIGFuIGFzeW5jIHVwZGF0ZSdzIGV4cGlyYXRpb24gdGltZS5cbiAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBjYXVzZSBoaWdoIHByaW9yaXR5IChpbnRlcmFjdGl2ZSkgd29yayB0byBleHBpcmVcbiAgICAgICAgICAgIC8vIGVhcmxpZXIgdGhhbiBuZWNlc3NhcnksIGJ1dCB3ZSBjYW4gYWNjb3VudCBmb3IgdGhpcyBieSBhZGp1c3RpbmdcbiAgICAgICAgICAgIC8vIGZvciB0aGUgSnVzdCBOb3RpY2VhYmxlIERpZmZlcmVuY2UuXG4gICAgICAgICAgICB2YXIgZWFybGllc3RFeHBpcmF0aW9uVGltZSA9IGZpbmRFYXJsaWVzdE91dHN0YW5kaW5nUHJpb3JpdHlMZXZlbChyb290LCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICAgICAgICB2YXIgZWFybGllc3RFeHBpcmF0aW9uVGltZU1zID0gZXhwaXJhdGlvblRpbWVUb01zKGVhcmxpZXN0RXhwaXJhdGlvblRpbWUpO1xuICAgICAgICAgICAgc3RhcnRUaW1lTXMgPSBlYXJsaWVzdEV4cGlyYXRpb25UaW1lTXMgLSBMT1dfUFJJT1JJVFlfRVhQSVJBVElPTjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYWJzb2x1dGVUaW1lb3V0TXMgPSBzdGFydFRpbWVNcyArIGVhcmxpZXN0VGltZW91dE1zO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFyayB0aGUgZWFybGllc3QgdGltZW91dCBpbiB0aGUgc3VzcGVuZGVkIGZpYmVyJ3MgYW5jZXN0b3IgcGF0aC5cbiAgICAgICAgLy8gQWZ0ZXIgY29tcGxldGluZyB0aGUgcm9vdCwgd2UnbGwgdGFrZSB0aGUgbGFyZ2VzdCBvZiBhbGwgdGhlXG4gICAgICAgIC8vIHN1c3BlbmRlZCBmaWJlcidzIHRpbWVvdXRzIGFuZCB1c2UgaXQgdG8gY29tcHV0ZSBhIHRpbWVvdXQgZm9yIHRoZVxuICAgICAgICAvLyB3aG9sZSB0cmVlLlxuICAgICAgICByZW5kZXJEaWRTdXNwZW5kKHJvb3QsIGFic29sdXRlVGltZW91dE1zLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG5cbiAgICAgICAgX3dvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBTaG91bGRDYXB0dXJlO1xuICAgICAgICBfd29ya0luUHJvZ3Jlc3MuZXhwaXJhdGlvblRpbWUgPSByZW5kZXJFeHBpcmF0aW9uVGltZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChlbmFibGVTdXNwZW5zZVNlcnZlclJlbmRlcmVyICYmIF93b3JrSW5Qcm9ncmVzcy50YWcgPT09IERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgICBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgcmVuZGVyRXhwaXJhdGlvblRpbWUsIHRoZW5hYmxlKTtcblxuICAgICAgICAvLyBTaW5jZSB3ZSBhbHJlYWR5IGhhdmUgYSBjdXJyZW50IGZpYmVyLCB3ZSBjYW4gZWFnZXJseSBhZGQgYSByZXRyeSBsaXN0ZW5lci5cbiAgICAgICAgdmFyIHJldHJ5Q2FjaGUgPSBfd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgaWYgKHJldHJ5Q2FjaGUgPT09IG51bGwpIHtcbiAgICAgICAgICByZXRyeUNhY2hlID0gX3dvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXcgUG9zc2libHlXZWFrU2V0KCk7XG4gICAgICAgICAgdmFyIF9jdXJyZW50ID0gX3dvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcbiAgICAgICAgICAhX2N1cnJlbnQgPyBpbnZhcmlhbnQoZmFsc2UsICdBIGRlaHlkcmF0ZWQgc3VzcGVuc2UgYm91bmRhcnkgbXVzdCBjb21taXQgYmVmb3JlIHRyeWluZyB0byByZW5kZXIuIFRoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gUmVhY3QuJykgOiB2b2lkIDA7XG4gICAgICAgICAgX2N1cnJlbnQubWVtb2l6ZWRTdGF0ZSA9IHJldHJ5Q2FjaGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWVtb2l6ZSB1c2luZyB0aGUgYm91bmRhcnkgZmliZXIgdG8gcHJldmVudCByZWR1bmRhbnQgbGlzdGVuZXJzLlxuICAgICAgICBpZiAoIXJldHJ5Q2FjaGUuaGFzKHRoZW5hYmxlKSkge1xuICAgICAgICAgIHJldHJ5Q2FjaGUuYWRkKHRoZW5hYmxlKTtcbiAgICAgICAgICB2YXIgcmV0cnkgPSByZXRyeVRpbWVkT3V0Qm91bmRhcnkuYmluZChudWxsLCBfd29ya0luUHJvZ3Jlc3MsIHRoZW5hYmxlKTtcbiAgICAgICAgICBpZiAoZW5hYmxlU2NoZWR1bGVyVHJhY2luZykge1xuICAgICAgICAgICAgcmV0cnkgPSB0cmFjaW5nLnVuc3RhYmxlX3dyYXAocmV0cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGVuYWJsZS50aGVuKHJldHJ5LCByZXRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgX3dvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBTaG91bGRDYXB0dXJlO1xuICAgICAgICBfd29ya0luUHJvZ3Jlc3MuZXhwaXJhdGlvblRpbWUgPSByZW5kZXJFeHBpcmF0aW9uVGltZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gVGhpcyBib3VuZGFyeSBhbHJlYWR5IGNhcHR1cmVkIGR1cmluZyB0aGlzIHJlbmRlci4gQ29udGludWUgdG8gdGhlIG5leHRcbiAgICAgIC8vIGJvdW5kYXJ5LlxuICAgICAgX3dvcmtJblByb2dyZXNzID0gX3dvcmtJblByb2dyZXNzLnJldHVybjtcbiAgICB9IHdoaWxlIChfd29ya0luUHJvZ3Jlc3MgIT09IG51bGwpO1xuICAgIC8vIE5vIGJvdW5kYXJ5IHdhcyBmb3VuZC4gRmFsbHRocm91Z2ggdG8gZXJyb3IgbW9kZS5cbiAgICAvLyBUT0RPOiBVc2UgaW52YXJpYW50IHNvIHRoZSBtZXNzYWdlIGlzIHN0cmlwcGVkIGluIHByb2Q/XG4gICAgdmFsdWUgPSBuZXcgRXJyb3IoKGdldENvbXBvbmVudE5hbWUoc291cmNlRmliZXIudHlwZSkgfHwgJ0EgUmVhY3QgY29tcG9uZW50JykgKyAnIHN1c3BlbmRlZCB3aGlsZSByZW5kZXJpbmcsIGJ1dCBubyBmYWxsYmFjayBVSSB3YXMgc3BlY2lmaWVkLlxcbicgKyAnXFxuJyArICdBZGQgYSA8U3VzcGVuc2UgZmFsbGJhY2s9Li4uPiBjb21wb25lbnQgaGlnaGVyIGluIHRoZSB0cmVlIHRvICcgKyAncHJvdmlkZSBhIGxvYWRpbmcgaW5kaWNhdG9yIG9yIHBsYWNlaG9sZGVyIHRvIGRpc3BsYXkuJyArIGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChzb3VyY2VGaWJlcikpO1xuICB9XG5cbiAgLy8gV2UgZGlkbid0IGZpbmQgYSBib3VuZGFyeSB0aGF0IGNvdWxkIGhhbmRsZSB0aGlzIHR5cGUgb2YgZXhjZXB0aW9uLiBTdGFydFxuICAvLyBvdmVyIGFuZCB0cmF2ZXJzZSBwYXJlbnQgcGF0aCBhZ2FpbiwgdGhpcyB0aW1lIHRyZWF0aW5nIHRoZSBleGNlcHRpb25cbiAgLy8gYXMgYW4gZXJyb3IuXG4gIHJlbmRlckRpZEVycm9yKCk7XG4gIHZhbHVlID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZSh2YWx1ZSwgc291cmNlRmliZXIpO1xuICB2YXIgd29ya0luUHJvZ3Jlc3MgPSByZXR1cm5GaWJlcjtcbiAgZG8ge1xuICAgIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9lcnJvckluZm8gPSB2YWx1ZTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gU2hvdWxkQ2FwdHVyZTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5leHBpcmF0aW9uVGltZSA9IHJlbmRlckV4cGlyYXRpb25UaW1lO1xuICAgICAgICAgIHZhciBfdXBkYXRlID0gY3JlYXRlUm9vdEVycm9yVXBkYXRlKHdvcmtJblByb2dyZXNzLCBfZXJyb3JJbmZvLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCBfdXBkYXRlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIC8vIENhcHR1cmUgYW5kIHJldHJ5XG4gICAgICAgIHZhciBlcnJvckluZm8gPSB2YWx1ZTtcbiAgICAgICAgdmFyIGN0b3IgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnICYgRGlkQ2FwdHVyZSkgPT09IE5vRWZmZWN0ICYmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicgfHwgaW5zdGFuY2UgIT09IG51bGwgJiYgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gU2hvdWxkQ2FwdHVyZTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5leHBpcmF0aW9uVGltZSA9IHJlbmRlckV4cGlyYXRpb25UaW1lO1xuICAgICAgICAgIC8vIFNjaGVkdWxlIHRoZSBlcnJvciBib3VuZGFyeSB0byByZS1yZW5kZXIgdXNpbmcgdXBkYXRlZCBzdGF0ZVxuICAgICAgICAgIHZhciBfdXBkYXRlMiA9IGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGVycm9ySW5mbywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgX3VwZGF0ZTIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcbiAgfSB3aGlsZSAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpO1xufVxuXG5mdW5jdGlvbiB1bndpbmRXb3JrKHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlZmZlY3RUYWcgPSB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWc7XG4gICAgICAgIGlmIChlZmZlY3RUYWcgJiBTaG91bGRDYXB0dXJlKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnID0gZWZmZWN0VGFnICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlO1xuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIF9lZmZlY3RUYWcgPSB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWc7XG4gICAgICAgICEoKF9lZmZlY3RUYWcgJiBEaWRDYXB0dXJlKSA9PT0gTm9FZmZlY3QpID8gaW52YXJpYW50KGZhbHNlLCAnVGhlIHJvb3QgZmFpbGVkIHRvIHVubW91bnQgYWZ0ZXIgYW4gZXJyb3IuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKSA6IHZvaWQgMDtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnID0gX2VmZmVjdFRhZyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcbiAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgfVxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gVE9ETzogcG9wSHlkcmF0aW9uU3RhdGVcbiAgICAgICAgcG9wSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX2VmZmVjdFRhZzIgPSB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWc7XG4gICAgICAgIGlmIChfZWZmZWN0VGFnMiAmIFNob3VsZENhcHR1cmUpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgPSBfZWZmZWN0VGFnMiAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcbiAgICAgICAgICAvLyBDYXB0dXJlZCBhIHN1c3BlbnNlIGVmZmVjdC4gUmUtcmVuZGVyIHRoZSBib3VuZGFyeS5cbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgY2FzZSBEZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmIChlbmFibGVTdXNwZW5zZVNlcnZlclJlbmRlcmVyKSB7XG4gICAgICAgICAgLy8gVE9ETzogcG9wSHlkcmF0aW9uU3RhdGVcbiAgICAgICAgICB2YXIgX2VmZmVjdFRhZzMgPSB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWc7XG4gICAgICAgICAgaWYgKF9lZmZlY3RUYWczICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnID0gX2VmZmVjdFRhZzMgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG4gICAgICAgICAgICAvLyBDYXB0dXJlZCBhIHN1c3BlbnNlIGVmZmVjdC4gUmUtcmVuZGVyIHRoZSBib3VuZGFyeS5cbiAgICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHBvcFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bndpbmRJbnRlcnJ1cHRlZFdvcmsoaW50ZXJydXB0ZWRXb3JrKSB7XG4gIHN3aXRjaCAoaW50ZXJydXB0ZWRXb3JrLnRhZykge1xuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IGludGVycnVwdGVkV29yay50eXBlLmNoaWxkQ29udGV4dFR5cGVzO1xuICAgICAgICBpZiAoY2hpbGRDb250ZXh0VHlwZXMgIT09IG51bGwgJiYgY2hpbGRDb250ZXh0VHlwZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBvcENvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKGludGVycnVwdGVkV29yayk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHBvcEhvc3RDb250YWluZXIoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgcG9wUHJvdmlkZXIoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBicmVhaztcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG52YXIgUmVhY3RDdXJyZW50T3duZXIkMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xuXG5cbnZhciBkaWRXYXJuQWJvdXRTdGF0ZVRyYW5zaXRpb24gPSB2b2lkIDA7XG52YXIgZGlkV2FyblNldFN0YXRlQ2hpbGRDb250ZXh0ID0gdm9pZCAwO1xudmFyIHdhcm5BYm91dFVwZGF0ZU9uVW5tb3VudGVkID0gdm9pZCAwO1xudmFyIHdhcm5BYm91dEludmFsaWRVcGRhdGVzID0gdm9pZCAwO1xuXG5pZiAoZW5hYmxlU2NoZWR1bGVyVHJhY2luZykge1xuICAvLyBQcm92aWRlIGV4cGxpY2l0IGVycm9yIG1lc3NhZ2Ugd2hlbiBwcm9kdWN0aW9uK3Byb2ZpbGluZyBidW5kbGUgb2YgZS5nLiByZWFjdC1kb21cbiAgLy8gaXMgdXNlZCB3aXRoIHByb2R1Y3Rpb24gKG5vbi1wcm9maWxpbmcpIGJ1bmRsZSBvZiBzY2hlZHVsZXIvdHJhY2luZ1xuICAhKHRyYWNpbmcuX19pbnRlcmFjdGlvbnNSZWYgIT0gbnVsbCAmJiB0cmFjaW5nLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgIT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICdJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIHJ1biB0aGUgcHJvZmlsaW5nIHZlcnNpb24gb2YgYSByZW5kZXJlciAoZm9yIGV4YW1wbGUsIGByZWFjdC1kb20vcHJvZmlsaW5nYCkgd2l0aG91dCBhbHNvIHJlcGxhY2luZyB0aGUgYHNjaGVkdWxlci90cmFjaW5nYCBtb2R1bGUgd2l0aCBgc2NoZWR1bGVyL3RyYWNpbmctcHJvZmlsaW5nYC4gWW91ciBidW5kbGVyIG1pZ2h0IGhhdmUgYSBzZXR0aW5nIGZvciBhbGlhc2luZyBib3RoIG1vZHVsZXMuIExlYXJuIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3JlYWN0LXByb2ZpbGluZycpIDogdm9pZCAwO1xufVxuXG57XG4gIGRpZFdhcm5BYm91dFN0YXRlVHJhbnNpdGlvbiA9IGZhbHNlO1xuICBkaWRXYXJuU2V0U3RhdGVDaGlsZENvbnRleHQgPSBmYWxzZTtcbiAgdmFyIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudCA9IHt9O1xuXG4gIHdhcm5BYm91dFVwZGF0ZU9uVW5tb3VudGVkID0gZnVuY3Rpb24gKGZpYmVyLCBpc0NsYXNzKSB7XG4gICAgLy8gV2Ugc2hvdyB0aGUgd2hvbGUgc3RhY2sgYnV0IGRlZHVwZSBvbiB0aGUgdG9wIGNvbXBvbmVudCdzIG5hbWUgYmVjYXVzZVxuICAgIC8vIHRoZSBwcm9ibGVtYXRpYyBjb2RlIGFsbW9zdCBhbHdheXMgbGllcyBpbnNpZGUgdGhhdCBjb21wb25lbnQuXG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdSZWFjdENvbXBvbmVudCc7XG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudFtjb21wb25lbnROYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsIFwiQ2FuJ3QgcGVyZm9ybSBhIFJlYWN0IHN0YXRlIHVwZGF0ZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LiBUaGlzIFwiICsgJ2lzIGEgbm8tb3AsIGJ1dCBpdCBpbmRpY2F0ZXMgYSBtZW1vcnkgbGVhayBpbiB5b3VyIGFwcGxpY2F0aW9uLiBUbyAnICsgJ2ZpeCwgY2FuY2VsIGFsbCBzdWJzY3JpcHRpb25zIGFuZCBhc3luY2hyb25vdXMgdGFza3MgaW4gJXMuJXMnLCBpc0NsYXNzID8gJ3RoZSBjb21wb25lbnRXaWxsVW5tb3VudCBtZXRob2QnIDogJ2EgdXNlRWZmZWN0IGNsZWFudXAgZnVuY3Rpb24nLCBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2QoZmliZXIpKTtcbiAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICB9O1xuXG4gIHdhcm5BYm91dEludmFsaWRVcGRhdGVzID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgc3dpdGNoIChwaGFzZSkge1xuICAgICAgY2FzZSAnZ2V0Q2hpbGRDb250ZXh0JzpcbiAgICAgICAgaWYgKGRpZFdhcm5TZXRTdGF0ZUNoaWxkQ29udGV4dCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdzZXRTdGF0ZSguLi4pOiBDYW5ub3QgY2FsbCBzZXRTdGF0ZSgpIGluc2lkZSBnZXRDaGlsZENvbnRleHQoKScpO1xuICAgICAgICBkaWRXYXJuU2V0U3RhdGVDaGlsZENvbnRleHQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JlbmRlcic6XG4gICAgICAgIGlmIChkaWRXYXJuQWJvdXRTdGF0ZVRyYW5zaXRpb24pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnQ2Fubm90IHVwZGF0ZSBkdXJpbmcgYW4gZXhpc3Rpbmcgc3RhdGUgdHJhbnNpdGlvbiAoc3VjaCBhcyB3aXRoaW4gJyArICdgcmVuZGVyYCkuIFJlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLicpO1xuICAgICAgICBkaWRXYXJuQWJvdXRTdGF0ZVRyYW5zaXRpb24gPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH07XG59XG5cbi8vIFVzZWQgdG8gZW5zdXJlIGNvbXB1dGVVbmlxdWVBc3luY0V4cGlyYXRpb24gaXMgbW9ub3RvbmljYWxseSBkZWNyZWFzaW5nLlxudmFyIGxhc3RVbmlxdWVBc3luY0V4cGlyYXRpb24gPSBTeW5jIC0gMTtcblxudmFyIGlzV29ya2luZyA9IGZhbHNlO1xuXG4vLyBUaGUgbmV4dCB3b3JrIGluIHByb2dyZXNzIGZpYmVyIHRoYXQgd2UncmUgY3VycmVudGx5IHdvcmtpbmcgb24uXG52YXIgbmV4dFVuaXRPZldvcmsgPSBudWxsO1xudmFyIG5leHRSb290ID0gbnVsbDtcbi8vIFRoZSB0aW1lIGF0IHdoaWNoIHdlJ3JlIGN1cnJlbnRseSByZW5kZXJpbmcgd29yay5cbnZhciBuZXh0UmVuZGVyRXhwaXJhdGlvblRpbWUgPSBOb1dvcms7XG52YXIgbmV4dExhdGVzdEFic29sdXRlVGltZW91dE1zID0gLTE7XG52YXIgbmV4dFJlbmRlckRpZEVycm9yID0gZmFsc2U7XG5cbi8vIFRoZSBuZXh0IGZpYmVyIHdpdGggYW4gZWZmZWN0IHRoYXQgd2UncmUgY3VycmVudGx5IGNvbW1pdHRpbmcuXG52YXIgbmV4dEVmZmVjdCA9IG51bGw7XG5cbnZhciBpc0NvbW1pdHRpbmckMSA9IGZhbHNlO1xudmFyIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gbnVsbDtcbnZhciBwYXNzaXZlRWZmZWN0Q2FsbGJhY2tIYW5kbGUgPSBudWxsO1xudmFyIHBhc3NpdmVFZmZlY3RDYWxsYmFjayA9IG51bGw7XG5cbnZhciBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG51bGw7XG5cbi8vIFVzZWQgZm9yIHBlcmZvcm1hbmNlIHRyYWNraW5nLlxudmFyIGludGVycnVwdGVkQnkgPSBudWxsO1xuXG52YXIgc3Rhc2hlZFdvcmtJblByb2dyZXNzUHJvcGVydGllcyA9IHZvaWQgMDtcbnZhciByZXBsYXlVbml0T2ZXb3JrID0gdm9pZCAwO1xudmFyIG1heVJlcGxheUZhaWxlZFVuaXRPZldvcmsgPSB2b2lkIDA7XG52YXIgaXNSZXBsYXlpbmdGYWlsZWRVbml0T2ZXb3JrID0gdm9pZCAwO1xudmFyIG9yaWdpbmFsUmVwbGF5RXJyb3IgPSB2b2lkIDA7XG52YXIgcmV0aHJvd09yaWdpbmFsRXJyb3IgPSB2b2lkIDA7XG5pZiAodHJ1ZSAmJiByZXBsYXlGYWlsZWRVbml0T2ZXb3JrV2l0aEludm9rZUd1YXJkZWRDYWxsYmFjaykge1xuICBzdGFzaGVkV29ya0luUHJvZ3Jlc3NQcm9wZXJ0aWVzID0gbnVsbDtcbiAgbWF5UmVwbGF5RmFpbGVkVW5pdE9mV29yayA9IHRydWU7XG4gIGlzUmVwbGF5aW5nRmFpbGVkVW5pdE9mV29yayA9IGZhbHNlO1xuICBvcmlnaW5hbFJlcGxheUVycm9yID0gbnVsbDtcbiAgcmVwbGF5VW5pdE9mV29yayA9IGZ1bmN0aW9uIChmYWlsZWRVbml0T2ZXb3JrLCB0aHJvd25WYWx1ZSwgaXNZaWVsZHkpIHtcbiAgICBpZiAodGhyb3duVmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHRocm93blZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdGhyb3duVmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gRG9uJ3QgcmVwbGF5IHByb21pc2VzLiBUcmVhdCBldmVyeXRoaW5nIGVsc2UgbGlrZSBhbiBlcnJvci5cbiAgICAgIC8vIFRPRE86IE5lZWQgdG8gZmlndXJlIG91dCBhIGRpZmZlcmVudCBzdHJhdGVneSBpZi93aGVuIHdlIGFkZFxuICAgICAgLy8gc3VwcG9ydCBmb3IgY2F0Y2hpbmcgb3RoZXIgdHlwZXMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgc3RhdGUgb2YgdGhlIHdvcmstaW4tcHJvZ3Jlc3NcbiAgICBpZiAoc3Rhc2hlZFdvcmtJblByb2dyZXNzUHJvcGVydGllcyA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiBEb24ndCB0aHJvdyBiZWNhdXNlIHRoaXMgY29kZSBpcyBERVYtb25seS5cbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ0NvdWxkIG5vdCByZXBsYXkgcmVuZGVyaW5nIGFmdGVyIGFuIGVycm9yLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXNzaWduRmliZXJQcm9wZXJ0aWVzSW5ERVYoZmFpbGVkVW5pdE9mV29yaywgc3Rhc2hlZFdvcmtJblByb2dyZXNzUHJvcGVydGllcyk7XG5cbiAgICBzd2l0Y2ggKGZhaWxlZFVuaXRPZldvcmsudGFnKSB7XG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKGZhaWxlZFVuaXRPZldvcmspO1xuICAgICAgICBwb3BUb3BMZXZlbENvbnRleHRPYmplY3QoZmFpbGVkVW5pdE9mV29yayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICBwb3BIb3N0Q29udGV4dChmYWlsZWRVbml0T2ZXb3JrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIENvbXBvbmVudCA9IGZhaWxlZFVuaXRPZldvcmsudHlwZTtcbiAgICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgICAgcG9wQ29udGV4dChmYWlsZWRVbml0T2ZXb3JrKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcihmYWlsZWRVbml0T2ZXb3JrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgICAgcG9wUHJvdmlkZXIoZmFpbGVkVW5pdE9mV29yayk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBSZXBsYXkgdGhlIGJlZ2luIHBoYXNlLlxuICAgIGlzUmVwbGF5aW5nRmFpbGVkVW5pdE9mV29yayA9IHRydWU7XG4gICAgb3JpZ2luYWxSZXBsYXlFcnJvciA9IHRocm93blZhbHVlO1xuICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCB3b3JrTG9vcCwgbnVsbCwgaXNZaWVsZHkpO1xuICAgIGlzUmVwbGF5aW5nRmFpbGVkVW5pdE9mV29yayA9IGZhbHNlO1xuICAgIG9yaWdpbmFsUmVwbGF5RXJyb3IgPSBudWxsO1xuICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICB2YXIgcmVwbGF5RXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG4gICAgICBpZiAocmVwbGF5RXJyb3IgIT0gbnVsbCAmJiB0aHJvd25WYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gUmVhZGluZyB0aGUgZXhwYW5kbyBwcm9wZXJ0eSBpcyBpbnRlbnRpb25hbGx5XG4gICAgICAgICAgLy8gaW5zaWRlIGB0cnlgIGJlY2F1c2UgaXQgbWlnaHQgYmUgYSBnZXR0ZXIgb3IgUHJveHkuXG4gICAgICAgICAgaWYgKHJlcGxheUVycm9yLl9zdXBwcmVzc0xvZ2dpbmcpIHtcbiAgICAgICAgICAgIC8vIEFsc28gc3VwcHJlc3MgbG9nZ2luZyBmb3IgdGhlIG9yaWdpbmFsIGVycm9yLlxuICAgICAgICAgICAgdGhyb3duVmFsdWUuX3N1cHByZXNzTG9nZ2luZyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChpbm5lcikge1xuICAgICAgICAgIC8vIElnbm9yZS5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGUgYmVnaW4gcGhhc2UgZGlkIG5vdCBmYWlsIHRoZSBzZWNvbmQgdGltZSwgc2V0IHRoaXMgcG9pbnRlclxuICAgICAgLy8gYmFjayB0byB0aGUgb3JpZ2luYWwgdmFsdWUuXG4gICAgICBuZXh0VW5pdE9mV29yayA9IGZhaWxlZFVuaXRPZldvcms7XG4gICAgfVxuICB9O1xuICByZXRocm93T3JpZ2luYWxFcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBvcmlnaW5hbFJlcGxheUVycm9yO1xuICB9O1xufVxuXG5mdW5jdGlvbiByZXNldFN0YWNrKCkge1xuICBpZiAobmV4dFVuaXRPZldvcmsgIT09IG51bGwpIHtcbiAgICB2YXIgaW50ZXJydXB0ZWRXb3JrID0gbmV4dFVuaXRPZldvcmsucmV0dXJuO1xuICAgIHdoaWxlIChpbnRlcnJ1cHRlZFdvcmsgIT09IG51bGwpIHtcbiAgICAgIHVud2luZEludGVycnVwdGVkV29yayhpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgaW50ZXJydXB0ZWRXb3JrID0gaW50ZXJydXB0ZWRXb3JrLnJldHVybjtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZGlzY2FyZFBlbmRpbmdXYXJuaW5ncygpO1xuICAgIGNoZWNrVGhhdFN0YWNrSXNFbXB0eSgpO1xuICB9XG5cbiAgbmV4dFJvb3QgPSBudWxsO1xuICBuZXh0UmVuZGVyRXhwaXJhdGlvblRpbWUgPSBOb1dvcms7XG4gIG5leHRMYXRlc3RBYnNvbHV0ZVRpbWVvdXRNcyA9IC0xO1xuICBuZXh0UmVuZGVyRGlkRXJyb3IgPSBmYWxzZTtcbiAgbmV4dFVuaXRPZldvcmsgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21taXRBbGxIb3N0RWZmZWN0cygpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB7XG4gICAgICBzZXRDdXJyZW50RmliZXIobmV4dEVmZmVjdCk7XG4gICAgfVxuICAgIHJlY29yZEVmZmVjdCgpO1xuXG4gICAgdmFyIGVmZmVjdFRhZyA9IG5leHRFZmZlY3QuZWZmZWN0VGFnO1xuXG4gICAgaWYgKGVmZmVjdFRhZyAmIENvbnRlbnRSZXNldCkge1xuICAgICAgY29tbWl0UmVzZXRUZXh0Q29udGVudChuZXh0RWZmZWN0KTtcbiAgICB9XG5cbiAgICBpZiAoZWZmZWN0VGFnICYgUmVmKSB7XG4gICAgICB2YXIgY3VycmVudCQkMSA9IG5leHRFZmZlY3QuYWx0ZXJuYXRlO1xuICAgICAgaWYgKGN1cnJlbnQkJDEgIT09IG51bGwpIHtcbiAgICAgICAgY29tbWl0RGV0YWNoUmVmKGN1cnJlbnQkJDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBmb2xsb3dpbmcgc3dpdGNoIHN0YXRlbWVudCBpcyBvbmx5IGNvbmNlcm5lZCBhYm91dCBwbGFjZW1lbnQsXG4gICAgLy8gdXBkYXRlcywgYW5kIGRlbGV0aW9ucy4gVG8gYXZvaWQgbmVlZGluZyB0byBhZGQgYSBjYXNlIGZvciBldmVyeVxuICAgIC8vIHBvc3NpYmxlIGJpdG1hcCB2YWx1ZSwgd2UgcmVtb3ZlIHRoZSBzZWNvbmRhcnkgZWZmZWN0cyBmcm9tIHRoZVxuICAgIC8vIGVmZmVjdCB0YWcgYW5kIHN3aXRjaCBvbiB0aGF0IHZhbHVlLlxuICAgIHZhciBwcmltYXJ5RWZmZWN0VGFnID0gZWZmZWN0VGFnICYgKFBsYWNlbWVudCB8IFVwZGF0ZSB8IERlbGV0aW9uKTtcbiAgICBzd2l0Y2ggKHByaW1hcnlFZmZlY3RUYWcpIHtcbiAgICAgIGNhc2UgUGxhY2VtZW50OlxuICAgICAgICB7XG4gICAgICAgICAgY29tbWl0UGxhY2VtZW50KG5leHRFZmZlY3QpO1xuICAgICAgICAgIC8vIENsZWFyIHRoZSBcInBsYWNlbWVudFwiIGZyb20gZWZmZWN0IHRhZyBzbyB0aGF0IHdlIGtub3cgdGhhdCB0aGlzIGlzIGluc2VydGVkLCBiZWZvcmVcbiAgICAgICAgICAvLyBhbnkgbGlmZS1jeWNsZXMgbGlrZSBjb21wb25lbnREaWRNb3VudCBnZXRzIGNhbGxlZC5cbiAgICAgICAgICAvLyBUT0RPOiBmaW5kRE9NTm9kZSBkb2Vzbid0IHJlbHkgb24gdGhpcyBhbnkgbW9yZSBidXQgaXNNb3VudGVkXG4gICAgICAgICAgLy8gZG9lcyBhbmQgaXNNb3VudGVkIGlzIGRlcHJlY2F0ZWQgYW55d2F5IHNvIHdlIHNob3VsZCBiZSBhYmxlXG4gICAgICAgICAgLy8gdG8ga2lsbCB0aGlzLlxuICAgICAgICAgIG5leHRFZmZlY3QuZWZmZWN0VGFnICY9IH5QbGFjZW1lbnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgUGxhY2VtZW50QW5kVXBkYXRlOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gUGxhY2VtZW50XG4gICAgICAgICAgY29tbWl0UGxhY2VtZW50KG5leHRFZmZlY3QpO1xuICAgICAgICAgIC8vIENsZWFyIHRoZSBcInBsYWNlbWVudFwiIGZyb20gZWZmZWN0IHRhZyBzbyB0aGF0IHdlIGtub3cgdGhhdCB0aGlzIGlzIGluc2VydGVkLCBiZWZvcmVcbiAgICAgICAgICAvLyBhbnkgbGlmZS1jeWNsZXMgbGlrZSBjb21wb25lbnREaWRNb3VudCBnZXRzIGNhbGxlZC5cbiAgICAgICAgICBuZXh0RWZmZWN0LmVmZmVjdFRhZyAmPSB+UGxhY2VtZW50O1xuXG4gICAgICAgICAgLy8gVXBkYXRlXG4gICAgICAgICAgdmFyIF9jdXJyZW50ID0gbmV4dEVmZmVjdC5hbHRlcm5hdGU7XG4gICAgICAgICAgY29tbWl0V29yayhfY3VycmVudCwgbmV4dEVmZmVjdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgVXBkYXRlOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9jdXJyZW50MiA9IG5leHRFZmZlY3QuYWx0ZXJuYXRlO1xuICAgICAgICAgIGNvbW1pdFdvcmsoX2N1cnJlbnQyLCBuZXh0RWZmZWN0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgY2FzZSBEZWxldGlvbjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1pdERlbGV0aW9uKG5leHRFZmZlY3QpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5leHRFZmZlY3QgPSBuZXh0RWZmZWN0Lm5leHRFZmZlY3Q7XG4gIH1cblxuICB7XG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkxpZmVjeWNsZXMoKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKG5leHRFZmZlY3QpO1xuICAgIH1cblxuICAgIHZhciBlZmZlY3RUYWcgPSBuZXh0RWZmZWN0LmVmZmVjdFRhZztcbiAgICBpZiAoZWZmZWN0VGFnICYgU25hcHNob3QpIHtcbiAgICAgIHJlY29yZEVmZmVjdCgpO1xuICAgICAgdmFyIGN1cnJlbnQkJDEgPSBuZXh0RWZmZWN0LmFsdGVybmF0ZTtcbiAgICAgIGNvbW1pdEJlZm9yZU11dGF0aW9uTGlmZUN5Y2xlcyhjdXJyZW50JCQxLCBuZXh0RWZmZWN0KTtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gbmV4dEVmZmVjdC5uZXh0RWZmZWN0O1xuICB9XG5cbiAge1xuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QWxsTGlmZUN5Y2xlcyhmaW5pc2hlZFJvb3QsIGNvbW1pdHRlZEV4cGlyYXRpb25UaW1lKSB7XG4gIHtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncygpO1xuICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmcoKTtcblxuICAgIGlmICh3YXJuQWJvdXREZXByZWNhdGVkTGlmZWN5Y2xlcykge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5ncygpO1xuICAgIH1cbiAgfVxuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihuZXh0RWZmZWN0KTtcbiAgICB9XG4gICAgdmFyIGVmZmVjdFRhZyA9IG5leHRFZmZlY3QuZWZmZWN0VGFnO1xuXG4gICAgaWYgKGVmZmVjdFRhZyAmIChVcGRhdGUgfCBDYWxsYmFjaykpIHtcbiAgICAgIHJlY29yZEVmZmVjdCgpO1xuICAgICAgdmFyIGN1cnJlbnQkJDEgPSBuZXh0RWZmZWN0LmFsdGVybmF0ZTtcbiAgICAgIGNvbW1pdExpZmVDeWNsZXMoZmluaXNoZWRSb290LCBjdXJyZW50JCQxLCBuZXh0RWZmZWN0LCBjb21taXR0ZWRFeHBpcmF0aW9uVGltZSk7XG4gICAgfVxuXG4gICAgaWYgKGVmZmVjdFRhZyAmIFJlZikge1xuICAgICAgcmVjb3JkRWZmZWN0KCk7XG4gICAgICBjb21taXRBdHRhY2hSZWYobmV4dEVmZmVjdCk7XG4gICAgfVxuXG4gICAgaWYgKGVmZmVjdFRhZyAmIFBhc3NpdmUpIHtcbiAgICAgIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gZmluaXNoZWRSb290O1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBuZXh0RWZmZWN0Lm5leHRFZmZlY3Q7XG4gIH1cbiAge1xuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZUVmZmVjdHMocm9vdCwgZmlyc3RFZmZlY3QpIHtcbiAgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSBudWxsO1xuICBwYXNzaXZlRWZmZWN0Q2FsbGJhY2tIYW5kbGUgPSBudWxsO1xuICBwYXNzaXZlRWZmZWN0Q2FsbGJhY2sgPSBudWxsO1xuXG4gIC8vIFNldCB0aGlzIHRvIHRydWUgdG8gcHJldmVudCByZS1lbnRyYW5jeVxuICB2YXIgcHJldmlvdXNJc1JlbmRlcmluZyA9IGlzUmVuZGVyaW5nO1xuICBpc1JlbmRlcmluZyA9IHRydWU7XG5cbiAgdmFyIGVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuICBkbyB7XG4gICAge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGVmZmVjdCk7XG4gICAgfVxuXG4gICAgaWYgKGVmZmVjdC5lZmZlY3RUYWcgJiBQYXNzaXZlKSB7XG4gICAgICB2YXIgZGlkRXJyb3IgPSBmYWxzZTtcbiAgICAgIHZhciBlcnJvciA9IHZvaWQgMDtcbiAgICAgIHtcbiAgICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGNvbW1pdFBhc3NpdmVIb29rRWZmZWN0cywgbnVsbCwgZWZmZWN0KTtcbiAgICAgICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgICAgICBkaWRFcnJvciA9IHRydWU7XG4gICAgICAgICAgZXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaWRFcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihlZmZlY3QsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWZmZWN0ID0gZWZmZWN0Lm5leHRFZmZlY3Q7XG4gIH0gd2hpbGUgKGVmZmVjdCAhPT0gbnVsbCk7XG4gIHtcbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICB9XG5cbiAgaXNSZW5kZXJpbmcgPSBwcmV2aW91c0lzUmVuZGVyaW5nO1xuXG4gIC8vIENoZWNrIGlmIHdvcmsgd2FzIHNjaGVkdWxlZCBieSBvbmUgb2YgdGhlIGVmZmVjdHNcbiAgdmFyIHJvb3RFeHBpcmF0aW9uVGltZSA9IHJvb3QuZXhwaXJhdGlvblRpbWU7XG4gIGlmIChyb290RXhwaXJhdGlvblRpbWUgIT09IE5vV29yaykge1xuICAgIHJlcXVlc3RXb3JrKHJvb3QsIHJvb3RFeHBpcmF0aW9uVGltZSk7XG4gIH1cbiAgLy8gRmx1c2ggYW55IHN5bmMgd29yayB0aGF0IHdhcyBzY2hlZHVsZWQgYnkgZWZmZWN0c1xuICBpZiAoIWlzQmF0Y2hpbmdVcGRhdGVzICYmICFpc1JlbmRlcmluZykge1xuICAgIHBlcmZvcm1TeW5jV29yaygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQWxyZWFkeUZhaWxlZExlZ2FjeUVycm9yQm91bmRhcnkoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkICE9PSBudWxsICYmIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkLmhhcyhpbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIG1hcmtMZWdhY3lFcnJvckJvdW5kYXJ5QXNGYWlsZWQoaW5zdGFuY2UpIHtcbiAgaWYgKGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID09PSBudWxsKSB7XG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBuZXcgU2V0KFtpbnN0YW5jZV0pO1xuICB9IGVsc2Uge1xuICAgIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkLmFkZChpbnN0YW5jZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmx1c2hQYXNzaXZlRWZmZWN0cygpIHtcbiAgaWYgKHBhc3NpdmVFZmZlY3RDYWxsYmFja0hhbmRsZSAhPT0gbnVsbCkge1xuICAgIGNhbmNlbFBhc3NpdmVFZmZlY3RzKHBhc3NpdmVFZmZlY3RDYWxsYmFja0hhbmRsZSk7XG4gIH1cbiAgaWYgKHBhc3NpdmVFZmZlY3RDYWxsYmFjayAhPT0gbnVsbCkge1xuICAgIC8vIFdlIGNhbGwgdGhlIHNjaGVkdWxlZCBjYWxsYmFjayBpbnN0ZWFkIG9mIGNvbW1pdFBhc3NpdmVFZmZlY3RzIGRpcmVjdGx5XG4gICAgLy8gdG8gZW5zdXJlIHRyYWNpbmcgd29ya3MgY29ycmVjdGx5LlxuICAgIHBhc3NpdmVFZmZlY3RDYWxsYmFjaygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFJvb3Qocm9vdCwgZmluaXNoZWRXb3JrKSB7XG4gIGlzV29ya2luZyA9IHRydWU7XG4gIGlzQ29tbWl0dGluZyQxID0gdHJ1ZTtcbiAgc3RhcnRDb21taXRUaW1lcigpO1xuXG4gICEocm9vdC5jdXJyZW50ICE9PSBmaW5pc2hlZFdvcmspID8gaW52YXJpYW50KGZhbHNlLCAnQ2Fubm90IGNvbW1pdCB0aGUgc2FtZSB0cmVlIGFzIGJlZm9yZS4gVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyByZWxhdGVkIHRvIHRoZSByZXR1cm4gZmllbGQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJykgOiB2b2lkIDA7XG4gIHZhciBjb21taXR0ZWRFeHBpcmF0aW9uVGltZSA9IHJvb3QucGVuZGluZ0NvbW1pdEV4cGlyYXRpb25UaW1lO1xuICAhKGNvbW1pdHRlZEV4cGlyYXRpb25UaW1lICE9PSBOb1dvcmspID8gaW52YXJpYW50KGZhbHNlLCAnQ2Fubm90IGNvbW1pdCBhbiBpbmNvbXBsZXRlIHJvb3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJykgOiB2b2lkIDA7XG4gIHJvb3QucGVuZGluZ0NvbW1pdEV4cGlyYXRpb25UaW1lID0gTm9Xb3JrO1xuXG4gIC8vIFVwZGF0ZSB0aGUgcGVuZGluZyBwcmlvcml0eSBsZXZlbHMgdG8gYWNjb3VudCBmb3IgdGhlIHdvcmsgdGhhdCB3ZSBhcmVcbiAgLy8gYWJvdXQgdG8gY29tbWl0LiBUaGlzIG5lZWRzIHRvIGhhcHBlbiBiZWZvcmUgY2FsbGluZyB0aGUgbGlmZWN5Y2xlcywgc2luY2VcbiAgLy8gdGhleSBtYXkgc2NoZWR1bGUgYWRkaXRpb25hbCB1cGRhdGVzLlxuICB2YXIgdXBkYXRlRXhwaXJhdGlvblRpbWVCZWZvcmVDb21taXQgPSBmaW5pc2hlZFdvcmsuZXhwaXJhdGlvblRpbWU7XG4gIHZhciBjaGlsZEV4cGlyYXRpb25UaW1lQmVmb3JlQ29tbWl0ID0gZmluaXNoZWRXb3JrLmNoaWxkRXhwaXJhdGlvblRpbWU7XG4gIHZhciBlYXJsaWVzdFJlbWFpbmluZ1RpbWVCZWZvcmVDb21taXQgPSBjaGlsZEV4cGlyYXRpb25UaW1lQmVmb3JlQ29tbWl0ID4gdXBkYXRlRXhwaXJhdGlvblRpbWVCZWZvcmVDb21taXQgPyBjaGlsZEV4cGlyYXRpb25UaW1lQmVmb3JlQ29tbWl0IDogdXBkYXRlRXhwaXJhdGlvblRpbWVCZWZvcmVDb21taXQ7XG4gIG1hcmtDb21taXR0ZWRQcmlvcml0eUxldmVscyhyb290LCBlYXJsaWVzdFJlbWFpbmluZ1RpbWVCZWZvcmVDb21taXQpO1xuXG4gIHZhciBwcmV2SW50ZXJhY3Rpb25zID0gbnVsbDtcbiAgaWYgKGVuYWJsZVNjaGVkdWxlclRyYWNpbmcpIHtcbiAgICAvLyBSZXN0b3JlIGFueSBwZW5kaW5nIGludGVyYWN0aW9ucyBhdCB0aGlzIHBvaW50LFxuICAgIC8vIFNvIHRoYXQgY2FzY2FkaW5nIHdvcmsgdHJpZ2dlcmVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlIHdpbGwgYmUgYWNjb3VudGVkIGZvci5cbiAgICBwcmV2SW50ZXJhY3Rpb25zID0gdHJhY2luZy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50O1xuICAgIHRyYWNpbmcuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudCA9IHJvb3QubWVtb2l6ZWRJbnRlcmFjdGlvbnM7XG4gIH1cblxuICAvLyBSZXNldCB0aGlzIHRvIG51bGwgYmVmb3JlIGNhbGxpbmcgbGlmZWN5Y2xlc1xuICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsO1xuXG4gIHZhciBmaXJzdEVmZmVjdCA9IHZvaWQgMDtcbiAgaWYgKGZpbmlzaGVkV29yay5lZmZlY3RUYWcgPiBQZXJmb3JtZWRXb3JrKSB7XG4gICAgLy8gQSBmaWJlcidzIGVmZmVjdCBsaXN0IGNvbnNpc3RzIG9ubHkgb2YgaXRzIGNoaWxkcmVuLCBub3QgaXRzZWxmLiBTbyBpZlxuICAgIC8vIHRoZSByb290IGhhcyBhbiBlZmZlY3QsIHdlIG5lZWQgdG8gYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuIFRoZVxuICAgIC8vIHJlc3VsdGluZyBsaXN0IGlzIHRoZSBzZXQgdGhhdCB3b3VsZCBiZWxvbmcgdG8gdGhlIHJvb3QncyBwYXJlbnQsIGlmXG4gICAgLy8gaXQgaGFkIG9uZTsgdGhhdCBpcywgYWxsIHRoZSBlZmZlY3RzIGluIHRoZSB0cmVlIGluY2x1ZGluZyB0aGUgcm9vdC5cbiAgICBpZiAoZmluaXNoZWRXb3JrLmxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgIGZpbmlzaGVkV29yay5sYXN0RWZmZWN0Lm5leHRFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gICAgICBmaXJzdEVmZmVjdCA9IGZpbmlzaGVkV29yay5maXJzdEVmZmVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlyc3RFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoZXJlIGlzIG5vIGVmZmVjdCBvbiB0aGUgcm9vdC5cbiAgICBmaXJzdEVmZmVjdCA9IGZpbmlzaGVkV29yay5maXJzdEVmZmVjdDtcbiAgfVxuXG4gIHByZXBhcmVGb3JDb21taXQocm9vdC5jb250YWluZXJJbmZvKTtcblxuICAvLyBJbnZva2UgaW5zdGFuY2VzIG9mIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlIGJlZm9yZSBtdXRhdGlvbi5cbiAgbmV4dEVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuICBzdGFydENvbW1pdFNuYXBzaG90RWZmZWN0c1RpbWVyKCk7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGRpZEVycm9yID0gZmFsc2U7XG4gICAgdmFyIGVycm9yID0gdm9pZCAwO1xuICAgIHtcbiAgICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCBjb21taXRCZWZvcmVNdXRhdGlvbkxpZmVjeWNsZXMsIG51bGwpO1xuICAgICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgICAgZGlkRXJyb3IgPSB0cnVlO1xuICAgICAgICBlcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRpZEVycm9yKSB7XG4gICAgICAhKG5leHRFZmZlY3QgIT09IG51bGwpID8gaW52YXJpYW50KGZhbHNlLCAnU2hvdWxkIGhhdmUgbmV4dCBlZmZlY3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJykgOiB2b2lkIDA7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihuZXh0RWZmZWN0LCBlcnJvcik7XG4gICAgICAvLyBDbGVhbi11cFxuICAgICAgaWYgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgICAgbmV4dEVmZmVjdCA9IG5leHRFZmZlY3QubmV4dEVmZmVjdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgc3RvcENvbW1pdFNuYXBzaG90RWZmZWN0c1RpbWVyKCk7XG5cbiAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIpIHtcbiAgICAvLyBNYXJrIHRoZSBjdXJyZW50IGNvbW1pdCB0aW1lIHRvIGJlIHNoYXJlZCBieSBhbGwgUHJvZmlsZXJzIGluIHRoaXMgYmF0Y2guXG4gICAgLy8gVGhpcyBlbmFibGVzIHRoZW0gdG8gYmUgZ3JvdXBlZCBsYXRlci5cbiAgICByZWNvcmRDb21taXRUaW1lKCk7XG4gIH1cblxuICAvLyBDb21taXQgYWxsIHRoZSBzaWRlLWVmZmVjdHMgd2l0aGluIGEgdHJlZS4gV2UnbGwgZG8gdGhpcyBpbiB0d28gcGFzc2VzLlxuICAvLyBUaGUgZmlyc3QgcGFzcyBwZXJmb3JtcyBhbGwgdGhlIGhvc3QgaW5zZXJ0aW9ucywgdXBkYXRlcywgZGVsZXRpb25zIGFuZFxuICAvLyByZWYgdW5tb3VudHMuXG4gIG5leHRFZmZlY3QgPSBmaXJzdEVmZmVjdDtcbiAgc3RhcnRDb21taXRIb3N0RWZmZWN0c1RpbWVyKCk7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIF9kaWRFcnJvciA9IGZhbHNlO1xuICAgIHZhciBfZXJyb3IgPSB2b2lkIDA7XG4gICAge1xuICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGNvbW1pdEFsbEhvc3RFZmZlY3RzLCBudWxsKTtcbiAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgIF9kaWRFcnJvciA9IHRydWU7XG4gICAgICAgIF9lcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKF9kaWRFcnJvcikge1xuICAgICAgIShuZXh0RWZmZWN0ICE9PSBudWxsKSA/IGludmFyaWFudChmYWxzZSwgJ1Nob3VsZCBoYXZlIG5leHQgZWZmZWN0LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpIDogdm9pZCAwO1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IobmV4dEVmZmVjdCwgX2Vycm9yKTtcbiAgICAgIC8vIENsZWFuLXVwXG4gICAgICBpZiAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgICAgICBuZXh0RWZmZWN0ID0gbmV4dEVmZmVjdC5uZXh0RWZmZWN0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBzdG9wQ29tbWl0SG9zdEVmZmVjdHNUaW1lcigpO1xuXG4gIHJlc2V0QWZ0ZXJDb21taXQocm9vdC5jb250YWluZXJJbmZvKTtcblxuICAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyB0cmVlIGlzIG5vdyB0aGUgY3VycmVudCB0cmVlLiBUaGlzIG11c3QgY29tZSBhZnRlclxuICAvLyB0aGUgZmlyc3QgcGFzcyBvZiB0aGUgY29tbWl0IHBoYXNlLCBzbyB0aGF0IHRoZSBwcmV2aW91cyB0cmVlIGlzIHN0aWxsXG4gIC8vIGN1cnJlbnQgZHVyaW5nIGNvbXBvbmVudFdpbGxVbm1vdW50LCBidXQgYmVmb3JlIHRoZSBzZWNvbmQgcGFzcywgc28gdGhhdFxuICAvLyB0aGUgZmluaXNoZWQgd29yayBpcyBjdXJyZW50IGR1cmluZyBjb21wb25lbnREaWRNb3VudC9VcGRhdGUuXG4gIHJvb3QuY3VycmVudCA9IGZpbmlzaGVkV29yaztcblxuICAvLyBJbiB0aGUgc2Vjb25kIHBhc3Mgd2UnbGwgcGVyZm9ybSBhbGwgbGlmZS1jeWNsZXMgYW5kIHJlZiBjYWxsYmFja3MuXG4gIC8vIExpZmUtY3ljbGVzIGhhcHBlbiBhcyBhIHNlcGFyYXRlIHBhc3Mgc28gdGhhdCBhbGwgcGxhY2VtZW50cywgdXBkYXRlcyxcbiAgLy8gYW5kIGRlbGV0aW9ucyBpbiB0aGUgZW50aXJlIHRyZWUgaGF2ZSBhbHJlYWR5IGJlZW4gaW52b2tlZC5cbiAgLy8gVGhpcyBwYXNzIGFsc28gdHJpZ2dlcnMgYW55IHJlbmRlcmVyLXNwZWNpZmljIGluaXRpYWwgZWZmZWN0cy5cbiAgbmV4dEVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuICBzdGFydENvbW1pdExpZmVDeWNsZXNUaW1lcigpO1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBfZGlkRXJyb3IyID0gZmFsc2U7XG4gICAgdmFyIF9lcnJvcjIgPSB2b2lkIDA7XG4gICAge1xuICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGNvbW1pdEFsbExpZmVDeWNsZXMsIG51bGwsIHJvb3QsIGNvbW1pdHRlZEV4cGlyYXRpb25UaW1lKTtcbiAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgIF9kaWRFcnJvcjIgPSB0cnVlO1xuICAgICAgICBfZXJyb3IyID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoX2RpZEVycm9yMikge1xuICAgICAgIShuZXh0RWZmZWN0ICE9PSBudWxsKSA/IGludmFyaWFudChmYWxzZSwgJ1Nob3VsZCBoYXZlIG5leHQgZWZmZWN0LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpIDogdm9pZCAwO1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IobmV4dEVmZmVjdCwgX2Vycm9yMik7XG4gICAgICBpZiAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgICAgICBuZXh0RWZmZWN0ID0gbmV4dEVmZmVjdC5uZXh0RWZmZWN0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChmaXJzdEVmZmVjdCAhPT0gbnVsbCAmJiByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyAhPT0gbnVsbCkge1xuICAgIC8vIFRoaXMgY29tbWl0IGluY2x1ZGVkIGEgcGFzc2l2ZSBlZmZlY3QuIFRoZXNlIGRvIG5vdCBuZWVkIHRvIGZpcmUgdW50aWxcbiAgICAvLyBhZnRlciB0aGUgbmV4dCBwYWludC4gU2NoZWR1bGUgYW4gY2FsbGJhY2sgdG8gZmlyZSB0aGVtIGluIGFuIGFzeW5jXG4gICAgLy8gZXZlbnQuIFRvIGVuc3VyZSBzZXJpYWwgZXhlY3V0aW9uLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBmbHVzaGVkIGVhcmx5IGlmXG4gICAgLy8gd2UgZW50ZXIgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgY29tbWl0IHBoYXNlIGJlZm9yZSB0aGVuLlxuICAgIHZhciBjYWxsYmFjayA9IGNvbW1pdFBhc3NpdmVFZmZlY3RzLmJpbmQobnVsbCwgcm9vdCwgZmlyc3RFZmZlY3QpO1xuICAgIGlmIChlbmFibGVTY2hlZHVsZXJUcmFjaW5nKSB7XG4gICAgICAvLyBUT0RPOiBBdm9pZCB0aGlzIGV4dHJhIGNhbGxiYWNrIGJ5IG11dGF0aW5nIHRoZSB0cmFjaW5nIHJlZiBkaXJlY3RseSxcbiAgICAgIC8vIGxpa2Ugd2UgZG8gYXQgdGhlIGJlZ2lubmluZyBvZiBjb21taXRSb290LiBJJ3ZlIG9wdGVkIG5vdCB0byBkbyB0aGF0XG4gICAgICAvLyBoZXJlIGJlY2F1c2UgdGhhdCBjb2RlIGlzIHN0aWxsIGluIGZsdXguXG4gICAgICBjYWxsYmFjayA9IHRyYWNpbmcudW5zdGFibGVfd3JhcChjYWxsYmFjayk7XG4gICAgfVxuICAgIHBhc3NpdmVFZmZlY3RDYWxsYmFja0hhbmRsZSA9IHNjaGVkdWxlci51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHkoc2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gc2NoZWR1bGVQYXNzaXZlRWZmZWN0cyhjYWxsYmFjayk7XG4gICAgfSk7XG4gICAgcGFzc2l2ZUVmZmVjdENhbGxiYWNrID0gY2FsbGJhY2s7XG4gIH1cblxuICBpc0NvbW1pdHRpbmckMSA9IGZhbHNlO1xuICBpc1dvcmtpbmcgPSBmYWxzZTtcbiAgc3RvcENvbW1pdExpZmVDeWNsZXNUaW1lcigpO1xuICBzdG9wQ29tbWl0VGltZXIoKTtcbiAgb25Db21taXRSb290KGZpbmlzaGVkV29yay5zdGF0ZU5vZGUpO1xuICBpZiAodHJ1ZSAmJiBSZWFjdEZpYmVySW5zdHJ1bWVudGF0aW9uXzEuZGVidWdUb29sKSB7XG4gICAgUmVhY3RGaWJlckluc3RydW1lbnRhdGlvbl8xLmRlYnVnVG9vbC5vbkNvbW1pdFdvcmsoZmluaXNoZWRXb3JrKTtcbiAgfVxuXG4gIHZhciB1cGRhdGVFeHBpcmF0aW9uVGltZUFmdGVyQ29tbWl0ID0gZmluaXNoZWRXb3JrLmV4cGlyYXRpb25UaW1lO1xuICB2YXIgY2hpbGRFeHBpcmF0aW9uVGltZUFmdGVyQ29tbWl0ID0gZmluaXNoZWRXb3JrLmNoaWxkRXhwaXJhdGlvblRpbWU7XG4gIHZhciBlYXJsaWVzdFJlbWFpbmluZ1RpbWVBZnRlckNvbW1pdCA9IGNoaWxkRXhwaXJhdGlvblRpbWVBZnRlckNvbW1pdCA+IHVwZGF0ZUV4cGlyYXRpb25UaW1lQWZ0ZXJDb21taXQgPyBjaGlsZEV4cGlyYXRpb25UaW1lQWZ0ZXJDb21taXQgOiB1cGRhdGVFeHBpcmF0aW9uVGltZUFmdGVyQ29tbWl0O1xuICBpZiAoZWFybGllc3RSZW1haW5pbmdUaW1lQWZ0ZXJDb21taXQgPT09IE5vV29yaykge1xuICAgIC8vIElmIHRoZXJlJ3Mgbm8gcmVtYWluaW5nIHdvcmssIHdlIGNhbiBjbGVhciB0aGUgc2V0IG9mIGFscmVhZHkgZmFpbGVkXG4gICAgLy8gZXJyb3IgYm91bmRhcmllcy5cbiAgICBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG51bGw7XG4gIH1cbiAgb25Db21taXQocm9vdCwgZWFybGllc3RSZW1haW5pbmdUaW1lQWZ0ZXJDb21taXQpO1xuXG4gIGlmIChlbmFibGVTY2hlZHVsZXJUcmFjaW5nKSB7XG4gICAgdHJhY2luZy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50ID0gcHJldkludGVyYWN0aW9ucztcblxuICAgIHZhciBzdWJzY3JpYmVyID0gdm9pZCAwO1xuXG4gICAgdHJ5IHtcbiAgICAgIHN1YnNjcmliZXIgPSB0cmFjaW5nLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50O1xuICAgICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwgJiYgcm9vdC5tZW1vaXplZEludGVyYWN0aW9ucy5zaXplID4gMCkge1xuICAgICAgICB2YXIgdGhyZWFkSUQgPSBjb21wdXRlVGhyZWFkSUQoY29tbWl0dGVkRXhwaXJhdGlvblRpbWUsIHJvb3QuaW50ZXJhY3Rpb25UaHJlYWRJRCk7XG4gICAgICAgIHN1YnNjcmliZXIub25Xb3JrU3RvcHBlZChyb290Lm1lbW9pemVkSW50ZXJhY3Rpb25zLCB0aHJlYWRJRCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEl0J3Mgbm90IHNhZmUgZm9yIGNvbW1pdFJvb3QoKSB0byB0aHJvdy5cbiAgICAgIC8vIFN0b3JlIHRoZSBlcnJvciBmb3Igbm93IGFuZCB3ZSdsbCByZS10aHJvdyBpbiBmaW5pc2hSZW5kZXJpbmcoKS5cbiAgICAgIGlmICghaGFzVW5oYW5kbGVkRXJyb3IpIHtcbiAgICAgICAgaGFzVW5oYW5kbGVkRXJyb3IgPSB0cnVlO1xuICAgICAgICB1bmhhbmRsZWRFcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBDbGVhciBjb21wbGV0ZWQgaW50ZXJhY3Rpb25zIGZyb20gdGhlIHBlbmRpbmcgTWFwLlxuICAgICAgLy8gVW5sZXNzIHRoZSByZW5kZXIgd2FzIHN1c3BlbmRlZCBvciBjYXNjYWRpbmcgd29yayB3YXMgc2NoZWR1bGVkLFxuICAgICAgLy8gSW4gd2hpY2ggY2FzZeKAkyBsZWF2ZSBwZW5kaW5nIGludGVyYWN0aW9ucyB1bnRpbCB0aGUgc3Vic2VxdWVudCByZW5kZXIuXG4gICAgICB2YXIgcGVuZGluZ0ludGVyYWN0aW9uTWFwID0gcm9vdC5wZW5kaW5nSW50ZXJhY3Rpb25NYXA7XG4gICAgICBwZW5kaW5nSW50ZXJhY3Rpb25NYXAuZm9yRWFjaChmdW5jdGlvbiAoc2NoZWR1bGVkSW50ZXJhY3Rpb25zLCBzY2hlZHVsZWRFeHBpcmF0aW9uVGltZSkge1xuICAgICAgICAvLyBPbmx5IGRlY3JlbWVudCB0aGUgcGVuZGluZyBpbnRlcmFjdGlvbiBjb3VudCBpZiB3ZSdyZSBkb25lLlxuICAgICAgICAvLyBJZiB0aGVyZSdzIHN0aWxsIHdvcmsgYXQgdGhlIGN1cnJlbnQgcHJpb3JpdHksXG4gICAgICAgIC8vIFRoYXQgaW5kaWNhdGVzIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIHN1c3BlbnNlIGRhdGEuXG4gICAgICAgIGlmIChzY2hlZHVsZWRFeHBpcmF0aW9uVGltZSA+IGVhcmxpZXN0UmVtYWluaW5nVGltZUFmdGVyQ29tbWl0KSB7XG4gICAgICAgICAgcGVuZGluZ0ludGVyYWN0aW9uTWFwLmRlbGV0ZShzY2hlZHVsZWRFeHBpcmF0aW9uVGltZSk7XG5cbiAgICAgICAgICBzY2hlZHVsZWRJbnRlcmFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgICAgIGludGVyYWN0aW9uLl9fY291bnQtLTtcblxuICAgICAgICAgICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwgJiYgaW50ZXJhY3Rpb24uX19jb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIub25JbnRlcmFjdGlvblNjaGVkdWxlZFdvcmtDb21wbGV0ZWQoaW50ZXJhY3Rpb24pO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8vIEl0J3Mgbm90IHNhZmUgZm9yIGNvbW1pdFJvb3QoKSB0byB0aHJvdy5cbiAgICAgICAgICAgICAgICAvLyBTdG9yZSB0aGUgZXJyb3IgZm9yIG5vdyBhbmQgd2UnbGwgcmUtdGhyb3cgaW4gZmluaXNoUmVuZGVyaW5nKCkuXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNVbmhhbmRsZWRFcnJvcikge1xuICAgICAgICAgICAgICAgICAgaGFzVW5oYW5kbGVkRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgdW5oYW5kbGVkRXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0Q2hpbGRFeHBpcmF0aW9uVGltZSh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyVGltZSkge1xuICBpZiAocmVuZGVyVGltZSAhPT0gTmV2ZXIgJiYgd29ya0luUHJvZ3Jlc3MuY2hpbGRFeHBpcmF0aW9uVGltZSA9PT0gTmV2ZXIpIHtcbiAgICAvLyBUaGUgY2hpbGRyZW4gb2YgdGhpcyBjb21wb25lbnQgYXJlIGhpZGRlbi4gRG9uJ3QgYnViYmxlIHRoZWlyXG4gICAgLy8gZXhwaXJhdGlvbiB0aW1lcy5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbmV3Q2hpbGRFeHBpcmF0aW9uVGltZSA9IE5vV29yaztcblxuICAvLyBCdWJibGUgdXAgdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZS5cbiAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIgJiYgd29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgLy8gV2UncmUgaW4gcHJvZmlsaW5nIG1vZGUuXG4gICAgLy8gTGV0J3MgdXNlIHRoaXMgc2FtZSB0cmF2ZXJzYWwgdG8gdXBkYXRlIHRoZSByZW5kZXIgZHVyYXRpb25zLlxuICAgIHZhciBhY3R1YWxEdXJhdGlvbiA9IHdvcmtJblByb2dyZXNzLmFjdHVhbER1cmF0aW9uO1xuICAgIHZhciB0cmVlQmFzZUR1cmF0aW9uID0gd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbjtcblxuICAgIC8vIFdoZW4gYSBmaWJlciBpcyBjbG9uZWQsIGl0cyBhY3R1YWxEdXJhdGlvbiBpcyByZXNldCB0byAwLlxuICAgIC8vIFRoaXMgdmFsdWUgd2lsbCBvbmx5IGJlIHVwZGF0ZWQgaWYgd29yayBpcyBkb25lIG9uIHRoZSBmaWJlciAoaS5lLiBpdCBkb2Vzbid0IGJhaWxvdXQpLlxuICAgIC8vIFdoZW4gd29yayBpcyBkb25lLCBpdCBzaG91bGQgYnViYmxlIHRvIHRoZSBwYXJlbnQncyBhY3R1YWxEdXJhdGlvbi5cbiAgICAvLyBJZiB0aGUgZmliZXIgaGFzIG5vdCBiZWVuIGNsb25lZCB0aG91Z2gsIChtZWFuaW5nIG5vIHdvcmsgd2FzIGRvbmUpLFxuICAgIC8vIFRoZW4gdGhpcyB2YWx1ZSB3aWxsIHJlZmxlY3QgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IHdvcmtpbmcgb24gYSBwcmV2aW91cyByZW5kZXIuXG4gICAgLy8gSW4gdGhhdCBjYXNlIGl0IHNob3VsZCBub3QgYnViYmxlLlxuICAgIC8vIFdlIGRldGVybWluZSB3aGV0aGVyIGl0IHdhcyBjbG9uZWQgYnkgY29tcGFyaW5nIHRoZSBjaGlsZCBwb2ludGVyLlxuICAgIHZhciBzaG91bGRCdWJibGVBY3R1YWxEdXJhdGlvbnMgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPT09IG51bGwgfHwgd29ya0luUHJvZ3Jlc3MuY2hpbGQgIT09IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZS5jaGlsZDtcblxuICAgIHZhciBjaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgdmFyIGNoaWxkVXBkYXRlRXhwaXJhdGlvblRpbWUgPSBjaGlsZC5leHBpcmF0aW9uVGltZTtcbiAgICAgIHZhciBjaGlsZENoaWxkRXhwaXJhdGlvblRpbWUgPSBjaGlsZC5jaGlsZEV4cGlyYXRpb25UaW1lO1xuICAgICAgaWYgKGNoaWxkVXBkYXRlRXhwaXJhdGlvblRpbWUgPiBuZXdDaGlsZEV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgIG5ld0NoaWxkRXhwaXJhdGlvblRpbWUgPSBjaGlsZFVwZGF0ZUV4cGlyYXRpb25UaW1lO1xuICAgICAgfVxuICAgICAgaWYgKGNoaWxkQ2hpbGRFeHBpcmF0aW9uVGltZSA+IG5ld0NoaWxkRXhwaXJhdGlvblRpbWUpIHtcbiAgICAgICAgbmV3Q2hpbGRFeHBpcmF0aW9uVGltZSA9IGNoaWxkQ2hpbGRFeHBpcmF0aW9uVGltZTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRCdWJibGVBY3R1YWxEdXJhdGlvbnMpIHtcbiAgICAgICAgYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247XG4gICAgICB9XG4gICAgICB0cmVlQmFzZUR1cmF0aW9uICs9IGNoaWxkLnRyZWVCYXNlRHVyYXRpb247XG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuICAgIHdvcmtJblByb2dyZXNzLmFjdHVhbER1cmF0aW9uID0gYWN0dWFsRHVyYXRpb247XG4gICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiA9IHRyZWVCYXNlRHVyYXRpb247XG4gIH0gZWxzZSB7XG4gICAgdmFyIF9jaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgIHdoaWxlIChfY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHZhciBfY2hpbGRVcGRhdGVFeHBpcmF0aW9uVGltZSA9IF9jaGlsZC5leHBpcmF0aW9uVGltZTtcbiAgICAgIHZhciBfY2hpbGRDaGlsZEV4cGlyYXRpb25UaW1lID0gX2NoaWxkLmNoaWxkRXhwaXJhdGlvblRpbWU7XG4gICAgICBpZiAoX2NoaWxkVXBkYXRlRXhwaXJhdGlvblRpbWUgPiBuZXdDaGlsZEV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgIG5ld0NoaWxkRXhwaXJhdGlvblRpbWUgPSBfY2hpbGRVcGRhdGVFeHBpcmF0aW9uVGltZTtcbiAgICAgIH1cbiAgICAgIGlmIChfY2hpbGRDaGlsZEV4cGlyYXRpb25UaW1lID4gbmV3Q2hpbGRFeHBpcmF0aW9uVGltZSkge1xuICAgICAgICBuZXdDaGlsZEV4cGlyYXRpb25UaW1lID0gX2NoaWxkQ2hpbGRFeHBpcmF0aW9uVGltZTtcbiAgICAgIH1cbiAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkRXhwaXJhdGlvblRpbWUgPSBuZXdDaGlsZEV4cGlyYXRpb25UaW1lO1xufVxuXG5mdW5jdGlvbiBjb21wbGV0ZVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpIHtcbiAgLy8gQXR0ZW1wdCB0byBjb21wbGV0ZSB0aGUgY3VycmVudCB1bml0IG9mIHdvcmssIHRoZW4gbW92ZSB0byB0aGVcbiAgLy8gbmV4dCBzaWJsaW5nLiBJZiB0aGVyZSBhcmUgbm8gbW9yZSBzaWJsaW5ncywgcmV0dXJuIHRvIHRoZVxuICAvLyBwYXJlbnQgZmliZXIuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgLy8gVGhlIGN1cnJlbnQsIGZsdXNoZWQsIHN0YXRlIG9mIHRoaXMgZmliZXIgaXMgdGhlIGFsdGVybmF0ZS5cbiAgICAvLyBJZGVhbGx5IG5vdGhpbmcgc2hvdWxkIHJlbHkgb24gdGhpcywgYnV0IHJlbHlpbmcgb24gaXQgaGVyZVxuICAgIC8vIG1lYW5zIHRoYXQgd2UgZG9uJ3QgbmVlZCBhbiBhZGRpdGlvbmFsIGZpZWxkIG9uIHRoZSB3b3JrIGluXG4gICAgLy8gcHJvZ3Jlc3MuXG4gICAgdmFyIGN1cnJlbnQkJDEgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7XG4gICAge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG5cbiAgICB2YXIgcmV0dXJuRmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gICAgdmFyIHNpYmxpbmdGaWJlciA9IHdvcmtJblByb2dyZXNzLnNpYmxpbmc7XG5cbiAgICBpZiAoKHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyAmIEluY29tcGxldGUpID09PSBOb0VmZmVjdCkge1xuICAgICAgaWYgKHRydWUgJiYgcmVwbGF5RmFpbGVkVW5pdE9mV29ya1dpdGhJbnZva2VHdWFyZGVkQ2FsbGJhY2spIHtcbiAgICAgICAgLy8gRG9uJ3QgcmVwbGF5IGlmIGl0IGZhaWxzIGR1cmluZyBjb21wbGV0aW9uIHBoYXNlLlxuICAgICAgICBtYXlSZXBsYXlGYWlsZWRVbml0T2ZXb3JrID0gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBUaGlzIGZpYmVyIGNvbXBsZXRlZC5cbiAgICAgIC8vIFJlbWVtYmVyIHdlJ3JlIGNvbXBsZXRpbmcgdGhpcyB1bml0IHNvIHdlIGNhbiBmaW5kIGEgYm91bmRhcnkgaWYgaXQgZmFpbHMuXG4gICAgICBuZXh0VW5pdE9mV29yayA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIpIHtcbiAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHN0YXJ0UHJvZmlsZXJUaW1lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dFVuaXRPZldvcmsgPSBjb21wbGV0ZVdvcmsoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIG5leHRSZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAvLyBVcGRhdGUgcmVuZGVyIGR1cmF0aW9uIGFzc3VtaW5nIHdlIGRpZG4ndCBlcnJvci5cbiAgICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKHdvcmtJblByb2dyZXNzLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRVbml0T2ZXb3JrID0gY29tcGxldGVXb3JrKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCBuZXh0UmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgICAgfVxuICAgICAgaWYgKHRydWUgJiYgcmVwbGF5RmFpbGVkVW5pdE9mV29ya1dpdGhJbnZva2VHdWFyZGVkQ2FsbGJhY2spIHtcbiAgICAgICAgLy8gV2UncmUgb3V0IG9mIGNvbXBsZXRpb24gcGhhc2Ugc28gcmVwbGF5aW5nIGlzIGZpbmUgbm93LlxuICAgICAgICBtYXlSZXBsYXlGYWlsZWRVbml0T2ZXb3JrID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHN0b3BXb3JrVGltZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmVzZXRDaGlsZEV4cGlyYXRpb25UaW1lKHdvcmtJblByb2dyZXNzLCBuZXh0UmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgICAge1xuICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV4dFVuaXRPZldvcmsgIT09IG51bGwpIHtcbiAgICAgICAgLy8gQ29tcGxldGluZyB0aGlzIGZpYmVyIHNwYXduZWQgbmV3IHdvcmsuIFdvcmsgb24gdGhhdCBuZXh0LlxuICAgICAgICByZXR1cm4gbmV4dFVuaXRPZldvcms7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCAmJlxuICAgICAgLy8gRG8gbm90IGFwcGVuZCBlZmZlY3RzIHRvIHBhcmVudHMgaWYgYSBzaWJsaW5nIGZhaWxlZCB0byBjb21wbGV0ZVxuICAgICAgKHJldHVybkZpYmVyLmVmZmVjdFRhZyAmIEluY29tcGxldGUpID09PSBOb0VmZmVjdCkge1xuICAgICAgICAvLyBBcHBlbmQgYWxsIHRoZSBlZmZlY3RzIG9mIHRoZSBzdWJ0cmVlIGFuZCB0aGlzIGZpYmVyIG9udG8gdGhlIGVmZmVjdFxuICAgICAgICAvLyBsaXN0IG9mIHRoZSBwYXJlbnQuIFRoZSBjb21wbGV0aW9uIG9yZGVyIG9mIHRoZSBjaGlsZHJlbiBhZmZlY3RzIHRoZVxuICAgICAgICAvLyBzaWRlLWVmZmVjdCBvcmRlci5cbiAgICAgICAgaWYgKHJldHVybkZpYmVyLmZpcnN0RWZmZWN0ID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuRmliZXIuZmlyc3RFZmZlY3QgPSB3b3JrSW5Qcm9ncmVzcy5maXJzdEVmZmVjdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChyZXR1cm5GaWJlci5sYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm5GaWJlci5sYXN0RWZmZWN0Lm5leHRFZmZlY3QgPSB3b3JrSW5Qcm9ncmVzcy5maXJzdEVmZmVjdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuRmliZXIubGFzdEVmZmVjdCA9IHdvcmtJblByb2dyZXNzLmxhc3RFZmZlY3Q7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGlzIGZpYmVyIGhhZCBzaWRlLWVmZmVjdHMsIHdlIGFwcGVuZCBpdCBBRlRFUiB0aGUgY2hpbGRyZW4nc1xuICAgICAgICAvLyBzaWRlLWVmZmVjdHMuIFdlIGNhbiBwZXJmb3JtIGNlcnRhaW4gc2lkZS1lZmZlY3RzIGVhcmxpZXIgaWZcbiAgICAgICAgLy8gbmVlZGVkLCBieSBkb2luZyBtdWx0aXBsZSBwYXNzZXMgb3ZlciB0aGUgZWZmZWN0IGxpc3QuIFdlIGRvbid0IHdhbnRcbiAgICAgICAgLy8gdG8gc2NoZWR1bGUgb3VyIG93biBzaWRlLWVmZmVjdCBvbiBvdXIgb3duIGxpc3QgYmVjYXVzZSBpZiBlbmQgdXBcbiAgICAgICAgLy8gcmV1c2luZyBjaGlsZHJlbiB3ZSdsbCBzY2hlZHVsZSB0aGlzIGVmZmVjdCBvbnRvIGl0c2VsZiBzaW5jZSB3ZSdyZVxuICAgICAgICAvLyBhdCB0aGUgZW5kLlxuICAgICAgICB2YXIgZWZmZWN0VGFnID0gd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnO1xuICAgICAgICAvLyBTa2lwIGJvdGggTm9Xb3JrIGFuZCBQZXJmb3JtZWRXb3JrIHRhZ3Mgd2hlbiBjcmVhdGluZyB0aGUgZWZmZWN0IGxpc3QuXG4gICAgICAgIC8vIFBlcmZvcm1lZFdvcmsgZWZmZWN0IGlzIHJlYWQgYnkgUmVhY3QgRGV2VG9vbHMgYnV0IHNob3VsZG4ndCBiZSBjb21taXR0ZWQuXG4gICAgICAgIGlmIChlZmZlY3RUYWcgPiBQZXJmb3JtZWRXb3JrKSB7XG4gICAgICAgICAgaWYgKHJldHVybkZpYmVyLmxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybkZpYmVyLmxhc3RFZmZlY3QubmV4dEVmZmVjdCA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm5GaWJlci5maXJzdEVmZmVjdCA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm5GaWJlci5sYXN0RWZmZWN0ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRydWUgJiYgUmVhY3RGaWJlckluc3RydW1lbnRhdGlvbl8xLmRlYnVnVG9vbCkge1xuICAgICAgICBSZWFjdEZpYmVySW5zdHJ1bWVudGF0aW9uXzEuZGVidWdUb29sLm9uQ29tcGxldGVXb3JrKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNpYmxpbmdGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiB0aGVyZSBpcyBtb3JlIHdvcmsgdG8gZG8gaW4gdGhpcyByZXR1cm5GaWJlciwgZG8gdGhhdCBuZXh0LlxuICAgICAgICByZXR1cm4gc2libGluZ0ZpYmVyO1xuICAgICAgfSBlbHNlIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIG1vcmUgd29yayBpbiB0aGlzIHJldHVybkZpYmVyLiBDb21wbGV0ZSB0aGUgcmV0dXJuRmliZXIuXG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gcmV0dXJuRmliZXI7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgcm9vdC5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyICYmIHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAvLyBSZWNvcmQgdGhlIHJlbmRlciBkdXJhdGlvbiBmb3IgdGhlIGZpYmVyIHRoYXQgZXJyb3JlZC5cbiAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YSh3b3JrSW5Qcm9ncmVzcywgZmFsc2UpO1xuXG4gICAgICAgIC8vIEluY2x1ZGUgdGhlIHRpbWUgc3BlbnQgd29ya2luZyBvbiBmYWlsZWQgY2hpbGRyZW4gYmVmb3JlIGNvbnRpbnVpbmcuXG4gICAgICAgIHZhciBhY3R1YWxEdXJhdGlvbiA9IHdvcmtJblByb2dyZXNzLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICB2YXIgY2hpbGQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247XG4gICAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmFjdHVhbER1cmF0aW9uID0gYWN0dWFsRHVyYXRpb247XG4gICAgICB9XG5cbiAgICAgIC8vIFRoaXMgZmliZXIgZGlkIG5vdCBjb21wbGV0ZSBiZWNhdXNlIHNvbWV0aGluZyB0aHJldy4gUG9wIHZhbHVlcyBvZmZcbiAgICAgIC8vIHRoZSBzdGFjayB3aXRob3V0IGVudGVyaW5nIHRoZSBjb21wbGV0ZSBwaGFzZS4gSWYgdGhpcyBpcyBhIGJvdW5kYXJ5LFxuICAgICAgLy8gY2FwdHVyZSB2YWx1ZXMgaWYgcG9zc2libGUuXG4gICAgICB2YXIgbmV4dCA9IHVud2luZFdvcmsod29ya0luUHJvZ3Jlc3MsIG5leHRSZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICAvLyBCZWNhdXNlIHRoaXMgZmliZXIgZGlkIG5vdCBjb21wbGV0ZSwgZG9uJ3QgcmVzZXQgaXRzIGV4cGlyYXRpb24gdGltZS5cbiAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgJiBEaWRDYXB0dXJlKSB7XG4gICAgICAgIC8vIFJlc3RhcnRpbmcgYW4gZXJyb3IgYm91bmRhcnlcbiAgICAgICAgc3RvcEZhaWxlZFdvcmtUaW1lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdG9wV29ya1RpbWVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIH1cblxuICAgICAge1xuICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV4dCAhPT0gbnVsbCkge1xuICAgICAgICBzdG9wV29ya1RpbWVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgaWYgKHRydWUgJiYgUmVhY3RGaWJlckluc3RydW1lbnRhdGlvbl8xLmRlYnVnVG9vbCkge1xuICAgICAgICAgIFJlYWN0RmliZXJJbnN0cnVtZW50YXRpb25fMS5kZWJ1Z1Rvb2wub25Db21wbGV0ZVdvcmsod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgY29tcGxldGluZyB0aGlzIHdvcmsgc3Bhd25lZCBuZXcgd29yaywgZG8gdGhhdCBuZXh0LiBXZSdsbCBjb21lXG4gICAgICAgIC8vIGJhY2sgaGVyZSBhZ2Fpbi5cbiAgICAgICAgLy8gU2luY2Ugd2UncmUgcmVzdGFydGluZywgcmVtb3ZlIGFueXRoaW5nIHRoYXQgaXMgbm90IGEgaG9zdCBlZmZlY3RcbiAgICAgICAgLy8gZnJvbSB0aGUgZWZmZWN0IHRhZy5cbiAgICAgICAgbmV4dC5lZmZlY3RUYWcgJj0gSG9zdEVmZmVjdE1hc2s7XG4gICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgfVxuXG4gICAgICBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgLy8gTWFyayB0aGUgcGFyZW50IGZpYmVyIGFzIGluY29tcGxldGUgYW5kIGNsZWFyIGl0cyBlZmZlY3QgbGlzdC5cbiAgICAgICAgcmV0dXJuRmliZXIuZmlyc3RFZmZlY3QgPSByZXR1cm5GaWJlci5sYXN0RWZmZWN0ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuRmliZXIuZWZmZWN0VGFnIHw9IEluY29tcGxldGU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0cnVlICYmIFJlYWN0RmliZXJJbnN0cnVtZW50YXRpb25fMS5kZWJ1Z1Rvb2wpIHtcbiAgICAgICAgUmVhY3RGaWJlckluc3RydW1lbnRhdGlvbl8xLmRlYnVnVG9vbC5vbkNvbXBsZXRlV29yayh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaWJsaW5nRmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgbW9yZSB3b3JrIHRvIGRvIGluIHRoaXMgcmV0dXJuRmliZXIsIGRvIHRoYXQgbmV4dC5cbiAgICAgICAgcmV0dXJuIHNpYmxpbmdGaWJlcjtcbiAgICAgIH0gZWxzZSBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBubyBtb3JlIHdvcmsgaW4gdGhpcyByZXR1cm5GaWJlci4gQ29tcGxldGUgdGhlIHJldHVybkZpYmVyLlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IHJldHVybkZpYmVyO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFdpdGhvdXQgdGhpcyBleHBsaWNpdCBudWxsIHJldHVybiBGbG93IGNvbXBsYWlucyBvZiBpbnZhbGlkIHJldHVybiB0eXBlXG4gIC8vIFRPRE8gUmVtb3ZlIHRoZSBhYm92ZSB3aGlsZSh0cnVlKSBsb29wXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnJlYWNoYWJsZVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpIHtcbiAgLy8gVGhlIGN1cnJlbnQsIGZsdXNoZWQsIHN0YXRlIG9mIHRoaXMgZmliZXIgaXMgdGhlIGFsdGVybmF0ZS5cbiAgLy8gSWRlYWxseSBub3RoaW5nIHNob3VsZCByZWx5IG9uIHRoaXMsIGJ1dCByZWx5aW5nIG9uIGl0IGhlcmVcbiAgLy8gbWVhbnMgdGhhdCB3ZSBkb24ndCBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW5cbiAgLy8gcHJvZ3Jlc3MuXG4gIHZhciBjdXJyZW50JCQxID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gIC8vIFNlZSBpZiBiZWdpbm5pbmcgdGhpcyB3b3JrIHNwYXducyBtb3JlIHdvcmsuXG4gIHN0YXJ0V29ya1RpbWVyKHdvcmtJblByb2dyZXNzKTtcbiAge1xuICAgIHNldEN1cnJlbnRGaWJlcih3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICBpZiAodHJ1ZSAmJiByZXBsYXlGYWlsZWRVbml0T2ZXb3JrV2l0aEludm9rZUd1YXJkZWRDYWxsYmFjaykge1xuICAgIHN0YXNoZWRXb3JrSW5Qcm9ncmVzc1Byb3BlcnRpZXMgPSBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVihzdGFzaGVkV29ya0luUHJvZ3Jlc3NQcm9wZXJ0aWVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB2YXIgbmV4dCA9IHZvaWQgMDtcbiAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIpIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICBzdGFydFByb2ZpbGVyVGltZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cblxuICAgIG5leHQgPSBiZWdpbldvcmsoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIG5leHRSZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgIC8vIFJlY29yZCB0aGUgcmVuZGVyIGR1cmF0aW9uIGFzc3VtaW5nIHdlIGRpZG4ndCBiYWlsb3V0IChvciBlcnJvcikuXG4gICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKHdvcmtJblByb2dyZXNzLCB0cnVlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV4dCA9IGJlZ2luV29yayhjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgbmV4dFJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB9XG5cbiAge1xuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgaWYgKGlzUmVwbGF5aW5nRmFpbGVkVW5pdE9mV29yaykge1xuICAgICAgLy8gQ3VycmVudGx5IHJlcGxheWluZyBhIGZhaWxlZCB1bml0IG9mIHdvcmsuIFRoaXMgc2hvdWxkIGJlIHVucmVhY2hhYmxlLFxuICAgICAgLy8gYmVjYXVzZSB0aGUgcmVuZGVyIHBoYXNlIGlzIG1lYW50IHRvIGJlIGlkZW1wb3RlbnQsIGFuZCBpdCBzaG91bGRcbiAgICAgIC8vIGhhdmUgdGhyb3duIGFnYWluLiBTaW5jZSBpdCBkaWRuJ3QsIHJldGhyb3cgdGhlIG9yaWdpbmFsIGVycm9yLCBzb1xuICAgICAgLy8gUmVhY3QncyBpbnRlcm5hbCBzdGFjayBpcyBub3QgbWlzYWxpZ25lZC5cbiAgICAgIHJldGhyb3dPcmlnaW5hbEVycm9yKCk7XG4gICAgfVxuICB9XG4gIGlmICh0cnVlICYmIFJlYWN0RmliZXJJbnN0cnVtZW50YXRpb25fMS5kZWJ1Z1Rvb2wpIHtcbiAgICBSZWFjdEZpYmVySW5zdHJ1bWVudGF0aW9uXzEuZGVidWdUb29sLm9uQmVnaW5Xb3JrKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIGlmIChuZXh0ID09PSBudWxsKSB7XG4gICAgLy8gSWYgdGhpcyBkb2Vzbid0IHNwYXduIG5ldyB3b3JrLCBjb21wbGV0ZSB0aGUgY3VycmVudCB3b3JrLlxuICAgIG5leHQgPSBjb21wbGV0ZVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAgUmVhY3RDdXJyZW50T3duZXIkMi5jdXJyZW50ID0gbnVsbDtcblxuICByZXR1cm4gbmV4dDtcbn1cblxuZnVuY3Rpb24gd29ya0xvb3AoaXNZaWVsZHkpIHtcbiAgaWYgKCFpc1lpZWxkeSkge1xuICAgIC8vIEZsdXNoIHdvcmsgd2l0aG91dCB5aWVsZGluZ1xuICAgIHdoaWxlIChuZXh0VW5pdE9mV29yayAhPT0gbnVsbCkge1xuICAgICAgbmV4dFVuaXRPZldvcmsgPSBwZXJmb3JtVW5pdE9mV29yayhuZXh0VW5pdE9mV29yayk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIEZsdXNoIGFzeW5jaHJvbm91cyB3b3JrIHVudGlsIHRoZXJlJ3MgYSBoaWdoZXIgcHJpb3JpdHkgZXZlbnRcbiAgICB3aGlsZSAobmV4dFVuaXRPZldvcmsgIT09IG51bGwgJiYgIXNob3VsZFlpZWxkVG9SZW5kZXJlcigpKSB7XG4gICAgICBuZXh0VW5pdE9mV29yayA9IHBlcmZvcm1Vbml0T2ZXb3JrKG5leHRVbml0T2ZXb3JrKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVuZGVyUm9vdChyb290LCBpc1lpZWxkeSkge1xuICAhIWlzV29ya2luZyA/IGludmFyaWFudChmYWxzZSwgJ3JlbmRlclJvb3Qgd2FzIGNhbGxlZCByZWN1cnNpdmVseS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKSA6IHZvaWQgMDtcblxuICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG5cbiAgaXNXb3JraW5nID0gdHJ1ZTtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudDtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIHZhciBleHBpcmF0aW9uVGltZSA9IHJvb3QubmV4dEV4cGlyYXRpb25UaW1lVG9Xb3JrT247XG5cbiAgLy8gQ2hlY2sgaWYgd2UncmUgc3RhcnRpbmcgZnJvbSBhIGZyZXNoIHN0YWNrLCBvciBpZiB3ZSdyZSByZXN1bWluZyBmcm9tXG4gIC8vIHByZXZpb3VzbHkgeWllbGRlZCB3b3JrLlxuICBpZiAoZXhwaXJhdGlvblRpbWUgIT09IG5leHRSZW5kZXJFeHBpcmF0aW9uVGltZSB8fCByb290ICE9PSBuZXh0Um9vdCB8fCBuZXh0VW5pdE9mV29yayA9PT0gbnVsbCkge1xuICAgIC8vIFJlc2V0IHRoZSBzdGFjayBhbmQgc3RhcnQgd29ya2luZyBmcm9tIHRoZSByb290LlxuICAgIHJlc2V0U3RhY2soKTtcbiAgICBuZXh0Um9vdCA9IHJvb3Q7XG4gICAgbmV4dFJlbmRlckV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gICAgbmV4dFVuaXRPZldvcmsgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhuZXh0Um9vdC5jdXJyZW50LCBudWxsLCBuZXh0UmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIHJvb3QucGVuZGluZ0NvbW1pdEV4cGlyYXRpb25UaW1lID0gTm9Xb3JrO1xuXG4gICAgaWYgKGVuYWJsZVNjaGVkdWxlclRyYWNpbmcpIHtcbiAgICAgIC8vIERldGVybWluZSB3aGljaCBpbnRlcmFjdGlvbnMgdGhpcyBiYXRjaCBvZiB3b3JrIGN1cnJlbnRseSBpbmNsdWRlcyxcbiAgICAgIC8vIFNvIHRoYXQgd2UgY2FuIGFjY3VyYXRlbHkgYXR0cmlidXRlIHRpbWUgc3BlbnQgd29ya2luZyBvbiBpdCxcbiAgICAgIHZhciBpbnRlcmFjdGlvbnMgPSBuZXcgU2V0KCk7XG4gICAgICByb290LnBlbmRpbmdJbnRlcmFjdGlvbk1hcC5mb3JFYWNoKGZ1bmN0aW9uIChzY2hlZHVsZWRJbnRlcmFjdGlvbnMsIHNjaGVkdWxlZEV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgIGlmIChzY2hlZHVsZWRFeHBpcmF0aW9uVGltZSA+PSBleHBpcmF0aW9uVGltZSkge1xuICAgICAgICAgIHNjaGVkdWxlZEludGVyYWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpbnRlcmFjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGludGVyYWN0aW9ucy5hZGQoaW50ZXJhY3Rpb24pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gU3RvcmUgdGhlIGN1cnJlbnQgc2V0IG9mIGludGVyYWN0aW9ucyBvbiB0aGUgRmliZXJSb290IGZvciBhIGZldyByZWFzb25zOlxuICAgICAgLy8gV2UgY2FuIHJlLXVzZSBpdCBpbiBob3QgZnVuY3Rpb25zIGxpa2UgcmVuZGVyUm9vdCgpIHdpdGhvdXQgaGF2aW5nIHRvIHJlY2FsY3VsYXRlIGl0LlxuICAgICAgLy8gV2Ugd2lsbCBhbHNvIHVzZSBpdCBpbiBjb21taXRXb3JrKCkgdG8gcGFzcyB0byBhbnkgUHJvZmlsZXIgb25SZW5kZXIoKSBob29rcy5cbiAgICAgIC8vIFRoaXMgYWxzbyBwcm92aWRlcyBEZXZUb29scyB3aXRoIGEgd2F5IHRvIGFjY2VzcyBpdCB3aGVuIHRoZSBvbkNvbW1pdFJvb3QoKSBob29rIGlzIGNhbGxlZC5cbiAgICAgIHJvb3QubWVtb2l6ZWRJbnRlcmFjdGlvbnMgPSBpbnRlcmFjdGlvbnM7XG5cbiAgICAgIGlmIChpbnRlcmFjdGlvbnMuc2l6ZSA+IDApIHtcbiAgICAgICAgdmFyIHN1YnNjcmliZXIgPSB0cmFjaW5nLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50O1xuICAgICAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciB0aHJlYWRJRCA9IGNvbXB1dGVUaHJlYWRJRChleHBpcmF0aW9uVGltZSwgcm9vdC5pbnRlcmFjdGlvblRocmVhZElEKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5vbldvcmtTdGFydGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBXb3JrIHRocm93biBieSBhbiBpbnRlcmFjdGlvbiB0cmFjaW5nIHN1YnNjcmliZXIgc2hvdWxkIGJlIHJldGhyb3duLFxuICAgICAgICAgICAgLy8gQnV0IG9ubHkgb25jZSBpdCdzIHNhZmUgKHRvIGF2b2lkIGxlYXZpbmcgdGhlIHNjaGVkdWxlciBpbiBhbiBpbnZhbGlkIHN0YXRlKS5cbiAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBlcnJvciBmb3Igbm93IGFuZCB3ZSdsbCByZS10aHJvdyBpbiBmaW5pc2hSZW5kZXJpbmcoKS5cbiAgICAgICAgICAgIGlmICghaGFzVW5oYW5kbGVkRXJyb3IpIHtcbiAgICAgICAgICAgICAgaGFzVW5oYW5kbGVkRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICB1bmhhbmRsZWRFcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBwcmV2SW50ZXJhY3Rpb25zID0gbnVsbDtcbiAgaWYgKGVuYWJsZVNjaGVkdWxlclRyYWNpbmcpIHtcbiAgICAvLyBXZSdyZSBhYm91dCB0byBzdGFydCBuZXcgdHJhY2VkIHdvcmsuXG4gICAgLy8gUmVzdG9yZSBwZW5kaW5nIGludGVyYWN0aW9ucyBzbyBjYXNjYWRpbmcgd29yayB0cmlnZ2VyZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2Ugd2lsbCBiZSBhY2NvdW50ZWQgZm9yLlxuICAgIHByZXZJbnRlcmFjdGlvbnMgPSB0cmFjaW5nLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQ7XG4gICAgdHJhY2luZy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50ID0gcm9vdC5tZW1vaXplZEludGVyYWN0aW9ucztcbiAgfVxuXG4gIHZhciBkaWRGYXRhbCA9IGZhbHNlO1xuXG4gIHN0YXJ0V29ya0xvb3BUaW1lcihuZXh0VW5pdE9mV29yayk7XG5cbiAgZG8ge1xuICAgIHRyeSB7XG4gICAgICB3b3JrTG9vcChpc1lpZWxkeSk7XG4gICAgfSBjYXRjaCAodGhyb3duVmFsdWUpIHtcbiAgICAgIHJlc2V0Q29udGV4dERlcGVuZGVuY2VzKCk7XG4gICAgICByZXNldEhvb2tzKCk7XG5cbiAgICAgIC8vIFJlc2V0IGluIGNhc2UgY29tcGxldGlvbiB0aHJvd3MuXG4gICAgICAvLyBUaGlzIGlzIG9ubHkgdXNlZCBpbiBERVYgYW5kIHdoZW4gcmVwbGF5aW5nIGlzIG9uLlxuICAgICAgdmFyIG1heVJlcGxheSA9IHZvaWQgMDtcbiAgICAgIGlmICh0cnVlICYmIHJlcGxheUZhaWxlZFVuaXRPZldvcmtXaXRoSW52b2tlR3VhcmRlZENhbGxiYWNrKSB7XG4gICAgICAgIG1heVJlcGxheSA9IG1heVJlcGxheUZhaWxlZFVuaXRPZldvcms7XG4gICAgICAgIG1heVJlcGxheUZhaWxlZFVuaXRPZldvcmsgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV4dFVuaXRPZldvcmsgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIGZhdGFsIGVycm9yLlxuICAgICAgICBkaWRGYXRhbCA9IHRydWU7XG4gICAgICAgIG9uVW5jYXVnaHRFcnJvcih0aHJvd25WYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lciAmJiBuZXh0VW5pdE9mV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAvLyBSZWNvcmQgdGhlIHRpbWUgc3BlbnQgcmVuZGVyaW5nIGJlZm9yZSBhbiBlcnJvciB3YXMgdGhyb3duLlxuICAgICAgICAgIC8vIFRoaXMgYXZvaWRzIGluYWNjdXJhdGUgUHJvZmlsZXIgZHVyYXRpb25zIGluIHRoZSBjYXNlIG9mIGEgc3VzcGVuZGVkIHJlbmRlci5cbiAgICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKG5leHRVbml0T2ZXb3JrLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBSZXNldCBnbG9iYWwgZGVidWcgc3RhdGVcbiAgICAgICAgICAvLyBXZSBhc3N1bWUgdGhpcyBpcyBkZWZpbmVkIGluIERFVlxuICAgICAgICAgIHJlc2V0Q3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHJ1ZSAmJiByZXBsYXlGYWlsZWRVbml0T2ZXb3JrV2l0aEludm9rZUd1YXJkZWRDYWxsYmFjaykge1xuICAgICAgICAgIGlmIChtYXlSZXBsYXkpIHtcbiAgICAgICAgICAgIHZhciBmYWlsZWRVbml0T2ZXb3JrID0gbmV4dFVuaXRPZldvcms7XG4gICAgICAgICAgICByZXBsYXlVbml0T2ZXb3JrKGZhaWxlZFVuaXRPZldvcmssIHRocm93blZhbHVlLCBpc1lpZWxkeSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogd2UgYWxyZWFkeSBrbm93IHRoaXMgaXNuJ3QgdHJ1ZSBpbiBzb21lIGNhc2VzLlxuICAgICAgICAvLyBBdCBsZWFzdCB0aGlzIHNob3dzIGEgbmljZXIgZXJyb3IgbWVzc2FnZSB1bnRpbCB3ZSBmaWd1cmUgb3V0IHRoZSBjYXVzZS5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjQ0OSNpc3N1ZWNvbW1lbnQtMzg2NzI3NDMxXG4gICAgICAgICEobmV4dFVuaXRPZldvcmsgIT09IG51bGwpID8gaW52YXJpYW50KGZhbHNlLCAnRmFpbGVkIHRvIHJlcGxheSByZW5kZXJpbmcgYWZ0ZXIgYW4gZXJyb3IuIFRoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUgd2l0aCBhIHJlcHJvZHVjaW5nIGNhc2UgdG8gaGVscCB1cyBmaW5kIGl0LicpIDogdm9pZCAwO1xuXG4gICAgICAgIHZhciBzb3VyY2VGaWJlciA9IG5leHRVbml0T2ZXb3JrO1xuICAgICAgICB2YXIgcmV0dXJuRmliZXIgPSBzb3VyY2VGaWJlci5yZXR1cm47XG4gICAgICAgIGlmIChyZXR1cm5GaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJvb3QuIFRoZSByb290IGNvdWxkIGNhcHR1cmUgaXRzIG93biBlcnJvcnMuIEhvd2V2ZXIsXG4gICAgICAgICAgLy8gd2UgZG9uJ3Qga25vdyBpZiBpdCBlcnJvcnMgYmVmb3JlIG9yIGFmdGVyIHdlIHB1c2hlZCB0aGUgaG9zdFxuICAgICAgICAgIC8vIGNvbnRleHQuIFRoaXMgaW5mb3JtYXRpb24gaXMgbmVlZGVkIHRvIGF2b2lkIGEgc3RhY2sgbWlzbWF0Y2guXG4gICAgICAgICAgLy8gQmVjYXVzZSB3ZSdyZSBub3Qgc3VyZSwgdHJlYXQgdGhpcyBhcyBhIGZhdGFsIGVycm9yLiBXZSBjb3VsZCB0cmFja1xuICAgICAgICAgIC8vIHdoaWNoIHBoYXNlIGl0IGZhaWxzIGluLCBidXQgZG9lc24ndCBzZWVtIHdvcnRoIGl0LiBBdCBsZWFzdFxuICAgICAgICAgIC8vIGZvciBub3cuXG4gICAgICAgICAgZGlkRmF0YWwgPSB0cnVlO1xuICAgICAgICAgIG9uVW5jYXVnaHRFcnJvcih0aHJvd25WYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3dFeGNlcHRpb24ocm9vdCwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCB0aHJvd25WYWx1ZSwgbmV4dFJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgICBuZXh0VW5pdE9mV29yayA9IGNvbXBsZXRlVW5pdE9mV29yayhzb3VyY2VGaWJlcik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgYnJlYWs7XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIGlmIChlbmFibGVTY2hlZHVsZXJUcmFjaW5nKSB7XG4gICAgLy8gVHJhY2VkIHdvcmsgaXMgZG9uZSBmb3Igbm93OyByZXN0b3JlIHRoZSBwcmV2aW91cyBpbnRlcmFjdGlvbnMuXG4gICAgdHJhY2luZy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50ID0gcHJldkludGVyYWN0aW9ucztcbiAgfVxuXG4gIC8vIFdlJ3JlIGRvbmUgcGVyZm9ybWluZyB3b3JrLiBUaW1lIHRvIGNsZWFuIHVwLlxuICBpc1dvcmtpbmcgPSBmYWxzZTtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50ID0gcHJldmlvdXNEaXNwYXRjaGVyO1xuICByZXNldENvbnRleHREZXBlbmRlbmNlcygpO1xuICByZXNldEhvb2tzKCk7XG5cbiAgLy8gWWllbGQgYmFjayB0byBtYWluIHRocmVhZC5cbiAgaWYgKGRpZEZhdGFsKSB7XG4gICAgdmFyIF9kaWRDb21wbGV0ZVJvb3QgPSBmYWxzZTtcbiAgICBzdG9wV29ya0xvb3BUaW1lcihpbnRlcnJ1cHRlZEJ5LCBfZGlkQ29tcGxldGVSb290KTtcbiAgICBpbnRlcnJ1cHRlZEJ5ID0gbnVsbDtcbiAgICAvLyBUaGVyZSB3YXMgYSBmYXRhbCBlcnJvci5cbiAgICB7XG4gICAgICByZXNldFN0YWNrQWZ0ZXJGYXRhbEVycm9ySW5EZXYoKTtcbiAgICB9XG4gICAgLy8gYG5leHRSb290YCBwb2ludHMgdG8gdGhlIGluLXByb2dyZXNzIHJvb3QuIEEgbm9uLW51bGwgdmFsdWUgaW5kaWNhdGVzXG4gICAgLy8gdGhhdCB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGFuIGFzeW5jIHJlbmRlci4gU2V0IGl0IHRvIG51bGwgdG8gaW5kaWNhdGVcbiAgICAvLyB0aGVyZSdzIG5vIG1vcmUgd29yayB0byBiZSBkb25lIGluIHRoZSBjdXJyZW50IGJhdGNoLlxuICAgIG5leHRSb290ID0gbnVsbDtcbiAgICBvbkZhdGFsKHJvb3QpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChuZXh0VW5pdE9mV29yayAhPT0gbnVsbCkge1xuICAgIC8vIFRoZXJlJ3Mgc3RpbGwgcmVtYWluaW5nIGFzeW5jIHdvcmsgaW4gdGhpcyB0cmVlLCBidXQgd2UgcmFuIG91dCBvZiB0aW1lXG4gICAgLy8gaW4gdGhlIGN1cnJlbnQgZnJhbWUuIFlpZWxkIGJhY2sgdG8gdGhlIHJlbmRlcmVyLiBVbmxlc3Mgd2UncmVcbiAgICAvLyBpbnRlcnJ1cHRlZCBieSBhIGhpZ2hlciBwcmlvcml0eSB1cGRhdGUsIHdlJ2xsIGNvbnRpbnVlIGxhdGVyIGZyb20gd2hlcmVcbiAgICAvLyB3ZSBsZWZ0IG9mZi5cbiAgICB2YXIgX2RpZENvbXBsZXRlUm9vdDIgPSBmYWxzZTtcbiAgICBzdG9wV29ya0xvb3BUaW1lcihpbnRlcnJ1cHRlZEJ5LCBfZGlkQ29tcGxldGVSb290Mik7XG4gICAgaW50ZXJydXB0ZWRCeSA9IG51bGw7XG4gICAgb25ZaWVsZChyb290KTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBXZSBjb21wbGV0ZWQgdGhlIHdob2xlIHRyZWUuXG4gIHZhciBkaWRDb21wbGV0ZVJvb3QgPSB0cnVlO1xuICBzdG9wV29ya0xvb3BUaW1lcihpbnRlcnJ1cHRlZEJ5LCBkaWRDb21wbGV0ZVJvb3QpO1xuICB2YXIgcm9vdFdvcmtJblByb2dyZXNzID0gcm9vdC5jdXJyZW50LmFsdGVybmF0ZTtcbiAgIShyb290V29ya0luUHJvZ3Jlc3MgIT09IG51bGwpID8gaW52YXJpYW50KGZhbHNlLCAnRmluaXNoZWQgcm9vdCBzaG91bGQgaGF2ZSBhIHdvcmstaW4tcHJvZ3Jlc3MuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJykgOiB2b2lkIDA7XG5cbiAgLy8gYG5leHRSb290YCBwb2ludHMgdG8gdGhlIGluLXByb2dyZXNzIHJvb3QuIEEgbm9uLW51bGwgdmFsdWUgaW5kaWNhdGVzXG4gIC8vIHRoYXQgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhbiBhc3luYyByZW5kZXIuIFNldCBpdCB0byBudWxsIHRvIGluZGljYXRlXG4gIC8vIHRoZXJlJ3Mgbm8gbW9yZSB3b3JrIHRvIGJlIGRvbmUgaW4gdGhlIGN1cnJlbnQgYmF0Y2guXG4gIG5leHRSb290ID0gbnVsbDtcbiAgaW50ZXJydXB0ZWRCeSA9IG51bGw7XG5cbiAgaWYgKG5leHRSZW5kZXJEaWRFcnJvcikge1xuICAgIC8vIFRoZXJlIHdhcyBhbiBlcnJvclxuICAgIGlmIChoYXNMb3dlclByaW9yaXR5V29yayhyb290LCBleHBpcmF0aW9uVGltZSkpIHtcbiAgICAgIC8vIFRoZXJlJ3MgbG93ZXIgcHJpb3JpdHkgd29yay4gSWYgc28sIGl0IG1heSBoYXZlIHRoZSBlZmZlY3Qgb2YgZml4aW5nXG4gICAgICAvLyB0aGUgZXhjZXB0aW9uIHRoYXQgd2FzIGp1c3QgdGhyb3duLiBFeGl0IHdpdGhvdXQgY29tbWl0dGluZy4gVGhpcyBpc1xuICAgICAgLy8gc2ltaWxhciB0byBhIHN1c3BlbmQsIGJ1dCB3aXRob3V0IGEgdGltZW91dCBiZWNhdXNlIHdlJ3JlIG5vdCB3YWl0aW5nXG4gICAgICAvLyBmb3IgYSBwcm9taXNlIHRvIHJlc29sdmUuIFJlYWN0IHdpbGwgcmVzdGFydCBhdCB0aGUgbG93ZXJcbiAgICAgIC8vIHByaW9yaXR5IGxldmVsLlxuICAgICAgbWFya1N1c3BlbmRlZFByaW9yaXR5TGV2ZWwocm9vdCwgZXhwaXJhdGlvblRpbWUpO1xuICAgICAgdmFyIHN1c3BlbmRlZEV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gICAgICB2YXIgcm9vdEV4cGlyYXRpb25UaW1lID0gcm9vdC5leHBpcmF0aW9uVGltZTtcbiAgICAgIG9uU3VzcGVuZChyb290LCByb290V29ya0luUHJvZ3Jlc3MsIHN1c3BlbmRlZEV4cGlyYXRpb25UaW1lLCByb290RXhwaXJhdGlvblRpbWUsIC0xIC8vIEluZGljYXRlcyBubyB0aW1lb3V0XG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgLy8gVGhlcmUncyBubyBsb3dlciBwcmlvcml0eSB3b3JrLCBidXQgd2UncmUgcmVuZGVyaW5nIGFzeW5jaHJvbm91c2x5LlxuICAgIC8vIFN5bmNocm9ub3VzbHkgYXR0ZW1wdCB0byByZW5kZXIgdGhlIHNhbWUgbGV2ZWwgb25lIG1vcmUgdGltZS4gVGhpcyBpc1xuICAgIC8vIHNpbWlsYXIgdG8gYSBzdXNwZW5kLCBidXQgd2l0aG91dCBhIHRpbWVvdXQgYmVjYXVzZSB3ZSdyZSBub3Qgd2FpdGluZ1xuICAgIC8vIGZvciBhIHByb21pc2UgdG8gcmVzb2x2ZS5cbiAgICAhcm9vdC5kaWRFcnJvciAmJiBpc1lpZWxkeSkge1xuICAgICAgcm9vdC5kaWRFcnJvciA9IHRydWU7XG4gICAgICB2YXIgX3N1c3BlbmRlZEV4cGlyYXRpb25UaW1lID0gcm9vdC5uZXh0RXhwaXJhdGlvblRpbWVUb1dvcmtPbiA9IGV4cGlyYXRpb25UaW1lO1xuICAgICAgdmFyIF9yb290RXhwaXJhdGlvblRpbWUgPSByb290LmV4cGlyYXRpb25UaW1lID0gU3luYztcbiAgICAgIG9uU3VzcGVuZChyb290LCByb290V29ya0luUHJvZ3Jlc3MsIF9zdXNwZW5kZWRFeHBpcmF0aW9uVGltZSwgX3Jvb3RFeHBpcmF0aW9uVGltZSwgLTEgLy8gSW5kaWNhdGVzIG5vIHRpbWVvdXRcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzWWllbGR5ICYmIG5leHRMYXRlc3RBYnNvbHV0ZVRpbWVvdXRNcyAhPT0gLTEpIHtcbiAgICAvLyBUaGUgdHJlZSB3YXMgc3VzcGVuZGVkLlxuICAgIHZhciBfc3VzcGVuZGVkRXhwaXJhdGlvblRpbWUyID0gZXhwaXJhdGlvblRpbWU7XG4gICAgbWFya1N1c3BlbmRlZFByaW9yaXR5TGV2ZWwocm9vdCwgX3N1c3BlbmRlZEV4cGlyYXRpb25UaW1lMik7XG5cbiAgICAvLyBGaW5kIHRoZSBlYXJsaWVzdCB1bmNvbW1pdHRlZCBleHBpcmF0aW9uIHRpbWUgaW4gdGhlIHRyZWUsIGluY2x1ZGluZ1xuICAgIC8vIHdvcmsgdGhhdCBpcyBzdXNwZW5kZWQuIFRoZSB0aW1lb3V0IHRocmVzaG9sZCBjYW5ub3QgYmUgbG9uZ2VyIHRoYW5cbiAgICAvLyB0aGUgb3ZlcmFsbCBleHBpcmF0aW9uLlxuICAgIHZhciBlYXJsaWVzdEV4cGlyYXRpb25UaW1lID0gZmluZEVhcmxpZXN0T3V0c3RhbmRpbmdQcmlvcml0eUxldmVsKHJvb3QsIGV4cGlyYXRpb25UaW1lKTtcbiAgICB2YXIgZWFybGllc3RFeHBpcmF0aW9uVGltZU1zID0gZXhwaXJhdGlvblRpbWVUb01zKGVhcmxpZXN0RXhwaXJhdGlvblRpbWUpO1xuICAgIGlmIChlYXJsaWVzdEV4cGlyYXRpb25UaW1lTXMgPCBuZXh0TGF0ZXN0QWJzb2x1dGVUaW1lb3V0TXMpIHtcbiAgICAgIG5leHRMYXRlc3RBYnNvbHV0ZVRpbWVvdXRNcyA9IGVhcmxpZXN0RXhwaXJhdGlvblRpbWVNcztcbiAgICB9XG5cbiAgICAvLyBTdWJ0cmFjdCB0aGUgY3VycmVudCB0aW1lIGZyb20gdGhlIGFic29sdXRlIHRpbWVvdXQgdG8gZ2V0IHRoZSBudW1iZXJcbiAgICAvLyBvZiBtaWxsaXNlY29uZHMgdW50aWwgdGhlIHRpbWVvdXQuIEluIG90aGVyIHdvcmRzLCBjb252ZXJ0IGFuIGFic29sdXRlXG4gICAgLy8gdGltZXN0YW1wIHRvIGEgcmVsYXRpdmUgdGltZS4gVGhpcyBpcyB0aGUgdmFsdWUgdGhhdCBpcyBwYXNzZWRcbiAgICAvLyB0byBgc2V0VGltZW91dGAuXG4gICAgdmFyIGN1cnJlbnRUaW1lTXMgPSBleHBpcmF0aW9uVGltZVRvTXMocmVxdWVzdEN1cnJlbnRUaW1lKCkpO1xuICAgIHZhciBtc1VudGlsVGltZW91dCA9IG5leHRMYXRlc3RBYnNvbHV0ZVRpbWVvdXRNcyAtIGN1cnJlbnRUaW1lTXM7XG4gICAgbXNVbnRpbFRpbWVvdXQgPSBtc1VudGlsVGltZW91dCA8IDAgPyAwIDogbXNVbnRpbFRpbWVvdXQ7XG5cbiAgICAvLyBUT0RPOiBBY2NvdW50IGZvciB0aGUgSnVzdCBOb3RpY2VhYmxlIERpZmZlcmVuY2VcblxuICAgIHZhciBfcm9vdEV4cGlyYXRpb25UaW1lMiA9IHJvb3QuZXhwaXJhdGlvblRpbWU7XG4gICAgb25TdXNwZW5kKHJvb3QsIHJvb3RXb3JrSW5Qcm9ncmVzcywgX3N1c3BlbmRlZEV4cGlyYXRpb25UaW1lMiwgX3Jvb3RFeHBpcmF0aW9uVGltZTIsIG1zVW50aWxUaW1lb3V0KTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBSZWFkeSB0byBjb21taXQuXG4gIG9uQ29tcGxldGUocm9vdCwgcm9vdFdvcmtJblByb2dyZXNzLCBleHBpcmF0aW9uVGltZSk7XG59XG5cbmZ1bmN0aW9uIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKHNvdXJjZUZpYmVyLCB2YWx1ZSkge1xuICB2YXIgZXhwaXJhdGlvblRpbWUgPSBTeW5jO1xuICB2YXIgZmliZXIgPSBzb3VyY2VGaWJlci5yZXR1cm47XG4gIHdoaWxlIChmaWJlciAhPT0gbnVsbCkge1xuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB2YXIgY3RvciA9IGZpYmVyLnR5cGU7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicgJiYgIWlzQWxyZWFkeUZhaWxlZExlZ2FjeUVycm9yQm91bmRhcnkoaW5zdGFuY2UpKSB7XG4gICAgICAgICAgdmFyIGVycm9ySW5mbyA9IGNyZWF0ZUNhcHR1cmVkVmFsdWUodmFsdWUsIHNvdXJjZUZpYmVyKTtcbiAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZShmaWJlciwgZXJyb3JJbmZvLCBleHBpcmF0aW9uVGltZSk7XG4gICAgICAgICAgZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlKTtcbiAgICAgICAgICBzY2hlZHVsZVdvcmsoZmliZXIsIGV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9lcnJvckluZm8gPSBjcmVhdGVDYXB0dXJlZFZhbHVlKHZhbHVlLCBzb3VyY2VGaWJlcik7XG4gICAgICAgICAgdmFyIF91cGRhdGUgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUoZmliZXIsIF9lcnJvckluZm8sIGV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgICBlbnF1ZXVlVXBkYXRlKGZpYmVyLCBfdXBkYXRlKTtcbiAgICAgICAgICBzY2hlZHVsZVdvcmsoZmliZXIsIGV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmliZXIgPSBmaWJlci5yZXR1cm47XG4gIH1cblxuICBpZiAoc291cmNlRmliZXIudGFnID09PSBIb3N0Um9vdCkge1xuICAgIC8vIEVycm9yIHdhcyB0aHJvd24gYXQgdGhlIHJvb3QuIFRoZXJlIGlzIG5vIHBhcmVudCwgc28gdGhlIHJvb3RcbiAgICAvLyBpdHNlbGYgc2hvdWxkIGNhcHR1cmUgaXQuXG4gICAgdmFyIHJvb3RGaWJlciA9IHNvdXJjZUZpYmVyO1xuICAgIHZhciBfZXJyb3JJbmZvMiA9IGNyZWF0ZUNhcHR1cmVkVmFsdWUodmFsdWUsIHJvb3RGaWJlcik7XG4gICAgdmFyIF91cGRhdGUyID0gY3JlYXRlUm9vdEVycm9yVXBkYXRlKHJvb3RGaWJlciwgX2Vycm9ySW5mbzIsIGV4cGlyYXRpb25UaW1lKTtcbiAgICBlbnF1ZXVlVXBkYXRlKHJvb3RGaWJlciwgX3VwZGF0ZTIpO1xuICAgIHNjaGVkdWxlV29yayhyb290RmliZXIsIGV4cGlyYXRpb25UaW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wdXRlVGhyZWFkSUQoZXhwaXJhdGlvblRpbWUsIGludGVyYWN0aW9uVGhyZWFkSUQpIHtcbiAgLy8gSW50ZXJhY3Rpb24gdGhyZWFkcyBhcmUgdW5pcXVlIHBlciByb290IGFuZCBleHBpcmF0aW9uIHRpbWUuXG4gIHJldHVybiBleHBpcmF0aW9uVGltZSAqIDEwMDAgKyBpbnRlcmFjdGlvblRocmVhZElEO1xufVxuXG4vLyBDcmVhdGVzIGEgdW5pcXVlIGFzeW5jIGV4cGlyYXRpb24gdGltZS5cbmZ1bmN0aW9uIGNvbXB1dGVVbmlxdWVBc3luY0V4cGlyYXRpb24oKSB7XG4gIHZhciBjdXJyZW50VGltZSA9IHJlcXVlc3RDdXJyZW50VGltZSgpO1xuICB2YXIgcmVzdWx0ID0gY29tcHV0ZUFzeW5jRXhwaXJhdGlvbihjdXJyZW50VGltZSk7XG4gIGlmIChyZXN1bHQgPj0gbGFzdFVuaXF1ZUFzeW5jRXhwaXJhdGlvbikge1xuICAgIC8vIFNpbmNlIHdlIGFzc3VtZSB0aGUgY3VycmVudCB0aW1lIG1vbm90b25pY2FsbHkgaW5jcmVhc2VzLCB3ZSBvbmx5IGhpdFxuICAgIC8vIHRoaXMgYnJhbmNoIHdoZW4gY29tcHV0ZVVuaXF1ZUFzeW5jRXhwaXJhdGlvbiBpcyBmaXJlZCBtdWx0aXBsZSB0aW1lc1xuICAgIC8vIHdpdGhpbiBhIDIwMG1zIHdpbmRvdyAob3Igd2hhdGV2ZXIgdGhlIGFzeW5jIGJ1Y2tldCBzaXplIGlzKS5cbiAgICByZXN1bHQgPSBsYXN0VW5pcXVlQXN5bmNFeHBpcmF0aW9uIC0gMTtcbiAgfVxuICBsYXN0VW5pcXVlQXN5bmNFeHBpcmF0aW9uID0gcmVzdWx0O1xuICByZXR1cm4gbGFzdFVuaXF1ZUFzeW5jRXhwaXJhdGlvbjtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUV4cGlyYXRpb25Gb3JGaWJlcihjdXJyZW50VGltZSwgZmliZXIpIHtcbiAgdmFyIHByaW9yaXR5TGV2ZWwgPSBzY2hlZHVsZXIudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKTtcblxuICB2YXIgZXhwaXJhdGlvblRpbWUgPSB2b2lkIDA7XG4gIGlmICgoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgLy8gT3V0c2lkZSBvZiBjb25jdXJyZW50IG1vZGUsIHVwZGF0ZXMgYXJlIGFsd2F5cyBzeW5jaHJvbm91cy5cbiAgICBleHBpcmF0aW9uVGltZSA9IFN5bmM7XG4gIH0gZWxzZSBpZiAoaXNXb3JraW5nICYmICFpc0NvbW1pdHRpbmckMSkge1xuICAgIC8vIER1cmluZyByZW5kZXIgcGhhc2UsIHVwZGF0ZXMgZXhwaXJlIGR1cmluZyBhcyB0aGUgY3VycmVudCByZW5kZXIuXG4gICAgZXhwaXJhdGlvblRpbWUgPSBuZXh0UmVuZGVyRXhwaXJhdGlvblRpbWU7XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoIChwcmlvcml0eUxldmVsKSB7XG4gICAgICBjYXNlIHNjaGVkdWxlci51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eTpcbiAgICAgICAgZXhwaXJhdGlvblRpbWUgPSBTeW5jO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugc2NoZWR1bGVyLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgICAgICBleHBpcmF0aW9uVGltZSA9IGNvbXB1dGVJbnRlcmFjdGl2ZUV4cGlyYXRpb24oY3VycmVudFRpbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugc2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5OlxuICAgICAgICAvLyBUaGlzIGlzIGEgbm9ybWFsLCBjb25jdXJyZW50IHVwZGF0ZVxuICAgICAgICBleHBpcmF0aW9uVGltZSA9IGNvbXB1dGVBc3luY0V4cGlyYXRpb24oY3VycmVudFRpbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugc2NoZWR1bGVyLnVuc3RhYmxlX0xvd1ByaW9yaXR5OlxuICAgICAgY2FzZSBzY2hlZHVsZXIudW5zdGFibGVfSWRsZVByaW9yaXR5OlxuICAgICAgICBleHBpcmF0aW9uVGltZSA9IE5ldmVyO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGludmFyaWFudChmYWxzZSwgJ1Vua25vd24gcHJpb3JpdHkgbGV2ZWwuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiByZW5kZXJpbmcgYSB0cmVlLCBkbyBub3QgdXBkYXRlIGF0IHRoZSBzYW1lXG4gICAgLy8gZXhwaXJhdGlvbiB0aW1lIHRoYXQgaXMgYWxyZWFkeSByZW5kZXJpbmcuXG4gICAgaWYgKG5leHRSb290ICE9PSBudWxsICYmIGV4cGlyYXRpb25UaW1lID09PSBuZXh0UmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgICAgIGV4cGlyYXRpb25UaW1lIC09IDE7XG4gICAgfVxuICB9XG5cbiAgLy8gS2VlcCB0cmFjayBvZiB0aGUgbG93ZXN0IHBlbmRpbmcgaW50ZXJhY3RpdmUgZXhwaXJhdGlvbiB0aW1lLiBUaGlzXG4gIC8vIGFsbG93cyB1cyB0byBzeW5jaHJvbm91c2x5IGZsdXNoIGFsbCBpbnRlcmFjdGl2ZSB1cGRhdGVzXG4gIC8vIHdoZW4gbmVlZGVkLlxuICAvLyBUT0RPOiBNb3ZlIHRoaXMgdG8gcmVuZGVyZXI/XG4gIGlmIChwcmlvcml0eUxldmVsID09PSBzY2hlZHVsZXIudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHkgJiYgKGxvd2VzdFByaW9yaXR5UGVuZGluZ0ludGVyYWN0aXZlRXhwaXJhdGlvblRpbWUgPT09IE5vV29yayB8fCBleHBpcmF0aW9uVGltZSA8IGxvd2VzdFByaW9yaXR5UGVuZGluZ0ludGVyYWN0aXZlRXhwaXJhdGlvblRpbWUpKSB7XG4gICAgbG93ZXN0UHJpb3JpdHlQZW5kaW5nSW50ZXJhY3RpdmVFeHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lO1xuICB9XG5cbiAgcmV0dXJuIGV4cGlyYXRpb25UaW1lO1xufVxuXG5mdW5jdGlvbiByZW5kZXJEaWRTdXNwZW5kKHJvb3QsIGFic29sdXRlVGltZW91dE1zLCBzdXNwZW5kZWRUaW1lKSB7XG4gIC8vIFNjaGVkdWxlIHRoZSB0aW1lb3V0LlxuICBpZiAoYWJzb2x1dGVUaW1lb3V0TXMgPj0gMCAmJiBuZXh0TGF0ZXN0QWJzb2x1dGVUaW1lb3V0TXMgPCBhYnNvbHV0ZVRpbWVvdXRNcykge1xuICAgIG5leHRMYXRlc3RBYnNvbHV0ZVRpbWVvdXRNcyA9IGFic29sdXRlVGltZW91dE1zO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlckRpZEVycm9yKCkge1xuICBuZXh0UmVuZGVyRGlkRXJyb3IgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBwaW5nU3VzcGVuZGVkUm9vdChyb290LCB0aGVuYWJsZSwgcGluZ1RpbWUpIHtcbiAgLy8gQSBwcm9taXNlIHRoYXQgcHJldmlvdXNseSBzdXNwZW5kZWQgUmVhY3QgZnJvbSBjb21taXR0aW5nIGhhcyByZXNvbHZlZC5cbiAgLy8gSWYgUmVhY3QgaXMgc3RpbGwgc3VzcGVuZGVkLCB0cnkgYWdhaW4gYXQgdGhlIHByZXZpb3VzIGxldmVsIChwaW5nVGltZSkuXG5cbiAgdmFyIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlO1xuICBpZiAocGluZ0NhY2hlICE9PSBudWxsKSB7XG4gICAgLy8gVGhlIHRoZW5hYmxlIHJlc29sdmVkLCBzbyB3ZSBubyBsb25nZXIgbmVlZCB0byBtZW1vaXplLCBiZWNhdXNlIGl0IHdpbGxcbiAgICAvLyBuZXZlciBiZSB0aHJvd24gYWdhaW4uXG4gICAgcGluZ0NhY2hlLmRlbGV0ZSh0aGVuYWJsZSk7XG4gIH1cblxuICBpZiAobmV4dFJvb3QgIT09IG51bGwgJiYgbmV4dFJlbmRlckV4cGlyYXRpb25UaW1lID09PSBwaW5nVGltZSkge1xuICAgIC8vIFJlY2VpdmVkIGEgcGluZyBhdCB0aGUgc2FtZSBwcmlvcml0eSBsZXZlbCBhdCB3aGljaCB3ZSdyZSBjdXJyZW50bHlcbiAgICAvLyByZW5kZXJpbmcuIFJlc3RhcnQgZnJvbSB0aGUgcm9vdC5cbiAgICBuZXh0Um9vdCA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ29uZmlybSB0aGF0IHRoZSByb290IGlzIHN0aWxsIHN1c3BlbmRlZCBhdCB0aGlzIGxldmVsLiBPdGhlcndpc2UgZXhpdC5cbiAgICBpZiAoaXNQcmlvcml0eUxldmVsU3VzcGVuZGVkKHJvb3QsIHBpbmdUaW1lKSkge1xuICAgICAgLy8gUGluZyBhdCB0aGUgb3JpZ2luYWwgbGV2ZWxcbiAgICAgIG1hcmtQaW5nZWRQcmlvcml0eUxldmVsKHJvb3QsIHBpbmdUaW1lKTtcbiAgICAgIHZhciByb290RXhwaXJhdGlvblRpbWUgPSByb290LmV4cGlyYXRpb25UaW1lO1xuICAgICAgaWYgKHJvb3RFeHBpcmF0aW9uVGltZSAhPT0gTm9Xb3JrKSB7XG4gICAgICAgIHJlcXVlc3RXb3JrKHJvb3QsIHJvb3RFeHBpcmF0aW9uVGltZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCB0aGVuYWJsZSkge1xuICAvLyBUaGUgYm91bmRhcnkgZmliZXIgKGEgU3VzcGVuc2UgY29tcG9uZW50KSBwcmV2aW91c2x5IHRpbWVkIG91dCBhbmQgd2FzXG4gIC8vIHJlbmRlcmVkIGluIGl0cyBmYWxsYmFjayBzdGF0ZS4gT25lIG9mIHRoZSBwcm9taXNlcyB0aGF0IHN1c3BlbmRlZCBpdCBoYXNcbiAgLy8gcmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGF0IGxlYXN0IHBhcnQgb2YgdGhlIHRyZWUgd2FzIGxpa2VseSB1bmJsb2NrZWQuIFRyeVxuICB2YXIgcmV0cnlDYWNoZSA9IHZvaWQgMDtcbiAgaWYgKGVuYWJsZVN1c3BlbnNlU2VydmVyUmVuZGVyZXIpIHtcbiAgICBzd2l0Y2ggKGJvdW5kYXJ5RmliZXIudGFnKSB7XG4gICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICByZXRyeUNhY2hlID0gYm91bmRhcnlGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBEZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICAgIHJldHJ5Q2FjaGUgPSBib3VuZGFyeUZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaW52YXJpYW50KGZhbHNlLCAnUGluZ2VkIHVua25vd24gc3VzcGVuc2UgYm91bmRhcnkgdHlwZS4gVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0cnlDYWNoZSA9IGJvdW5kYXJ5RmliZXIuc3RhdGVOb2RlO1xuICB9XG4gIGlmIChyZXRyeUNhY2hlICE9PSBudWxsKSB7XG4gICAgLy8gVGhlIHRoZW5hYmxlIHJlc29sdmVkLCBzbyB3ZSBubyBsb25nZXIgbmVlZCB0byBtZW1vaXplLCBiZWNhdXNlIGl0IHdpbGxcbiAgICAvLyBuZXZlciBiZSB0aHJvd24gYWdhaW4uXG4gICAgcmV0cnlDYWNoZS5kZWxldGUodGhlbmFibGUpO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRUaW1lID0gcmVxdWVzdEN1cnJlbnRUaW1lKCk7XG4gIHZhciByZXRyeVRpbWUgPSBjb21wdXRlRXhwaXJhdGlvbkZvckZpYmVyKGN1cnJlbnRUaW1lLCBib3VuZGFyeUZpYmVyKTtcbiAgdmFyIHJvb3QgPSBzY2hlZHVsZVdvcmtUb1Jvb3QoYm91bmRhcnlGaWJlciwgcmV0cnlUaW1lKTtcbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBtYXJrUGVuZGluZ1ByaW9yaXR5TGV2ZWwocm9vdCwgcmV0cnlUaW1lKTtcbiAgICB2YXIgcm9vdEV4cGlyYXRpb25UaW1lID0gcm9vdC5leHBpcmF0aW9uVGltZTtcbiAgICBpZiAocm9vdEV4cGlyYXRpb25UaW1lICE9PSBOb1dvcmspIHtcbiAgICAgIHJlcXVlc3RXb3JrKHJvb3QsIHJvb3RFeHBpcmF0aW9uVGltZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlV29ya1RvUm9vdChmaWJlciwgZXhwaXJhdGlvblRpbWUpIHtcbiAgcmVjb3JkU2NoZWR1bGVVcGRhdGUoKTtcblxuICB7XG4gICAgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIHdhcm5BYm91dEludmFsaWRVcGRhdGVzKGluc3RhbmNlKTtcbiAgICB9XG4gIH1cblxuICAvLyBVcGRhdGUgdGhlIHNvdXJjZSBmaWJlcidzIGV4cGlyYXRpb24gdGltZVxuICBpZiAoZmliZXIuZXhwaXJhdGlvblRpbWUgPCBleHBpcmF0aW9uVGltZSkge1xuICAgIGZpYmVyLmV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gIH1cbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUuZXhwaXJhdGlvblRpbWUgPCBleHBpcmF0aW9uVGltZSkge1xuICAgIGFsdGVybmF0ZS5leHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lO1xuICB9XG4gIC8vIFdhbGsgdGhlIHBhcmVudCBwYXRoIHRvIHRoZSByb290IGFuZCB1cGRhdGUgdGhlIGNoaWxkIGV4cGlyYXRpb24gdGltZS5cbiAgdmFyIG5vZGUgPSBmaWJlci5yZXR1cm47XG4gIHZhciByb290ID0gbnVsbDtcbiAgaWYgKG5vZGUgPT09IG51bGwgJiYgZmliZXIudGFnID09PSBIb3N0Um9vdCkge1xuICAgIHJvb3QgPSBmaWJlci5zdGF0ZU5vZGU7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgIGFsdGVybmF0ZSA9IG5vZGUuYWx0ZXJuYXRlO1xuICAgICAgaWYgKG5vZGUuY2hpbGRFeHBpcmF0aW9uVGltZSA8IGV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgIG5vZGUuY2hpbGRFeHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lO1xuICAgICAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZS5jaGlsZEV4cGlyYXRpb25UaW1lIDwgZXhwaXJhdGlvblRpbWUpIHtcbiAgICAgICAgICBhbHRlcm5hdGUuY2hpbGRFeHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUuY2hpbGRFeHBpcmF0aW9uVGltZSA8IGV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgIGFsdGVybmF0ZS5jaGlsZEV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gICAgICB9XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgJiYgbm9kZS50YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIHJvb3QgPSBub2RlLnN0YXRlTm9kZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZVNjaGVkdWxlclRyYWNpbmcpIHtcbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgdmFyIGludGVyYWN0aW9ucyA9IHRyYWNpbmcuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudDtcbiAgICAgIGlmIChpbnRlcmFjdGlvbnMuc2l6ZSA+IDApIHtcbiAgICAgICAgdmFyIHBlbmRpbmdJbnRlcmFjdGlvbk1hcCA9IHJvb3QucGVuZGluZ0ludGVyYWN0aW9uTWFwO1xuICAgICAgICB2YXIgcGVuZGluZ0ludGVyYWN0aW9ucyA9IHBlbmRpbmdJbnRlcmFjdGlvbk1hcC5nZXQoZXhwaXJhdGlvblRpbWUpO1xuICAgICAgICBpZiAocGVuZGluZ0ludGVyYWN0aW9ucyAhPSBudWxsKSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGludGVyYWN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoIXBlbmRpbmdJbnRlcmFjdGlvbnMuaGFzKGludGVyYWN0aW9uKSkge1xuICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHBlbmRpbmcgYXN5bmMgd29yayBjb3VudCBmb3IgcHJldmlvdXNseSB1bnNjaGVkdWxlZCBpbnRlcmFjdGlvbi5cbiAgICAgICAgICAgICAgaW50ZXJhY3Rpb24uX19jb3VudCsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwZW5kaW5nSW50ZXJhY3Rpb25zLmFkZChpbnRlcmFjdGlvbik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVuZGluZ0ludGVyYWN0aW9uTWFwLnNldChleHBpcmF0aW9uVGltZSwgbmV3IFNldChpbnRlcmFjdGlvbnMpKTtcblxuICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcGVuZGluZyBhc3luYyB3b3JrIGNvdW50IGZvciB0aGUgY3VycmVudCBpbnRlcmFjdGlvbnMuXG4gICAgICAgICAgaW50ZXJhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGludGVyYWN0aW9uKSB7XG4gICAgICAgICAgICBpbnRlcmFjdGlvbi5fX2NvdW50Kys7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3Vic2NyaWJlciA9IHRyYWNpbmcuX19zdWJzY3JpYmVyUmVmLmN1cnJlbnQ7XG4gICAgICAgIGlmIChzdWJzY3JpYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIHRocmVhZElEID0gY29tcHV0ZVRocmVhZElEKGV4cGlyYXRpb25UaW1lLCByb290LmludGVyYWN0aW9uVGhyZWFkSUQpO1xuICAgICAgICAgIHN1YnNjcmliZXIub25Xb3JrU2NoZWR1bGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByb290O1xufVxuXG5mdW5jdGlvbiB3YXJuSWZOb3RDdXJyZW50bHlCYXRjaGluZ0luRGV2KGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaXNSZW5kZXJpbmcgPT09IGZhbHNlICYmIGlzQmF0Y2hpbmdVcGRhdGVzID09PSBmYWxzZSkge1xuICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnQW4gdXBkYXRlIHRvICVzIGluc2lkZSBhIHRlc3Qgd2FzIG5vdCB3cmFwcGVkIGluIGFjdCguLi4pLlxcblxcbicgKyAnV2hlbiB0ZXN0aW5nLCBjb2RlIHRoYXQgY2F1c2VzIFJlYWN0IHN0YXRlIHVwZGF0ZXMgc2hvdWxkIGJlIHdyYXBwZWQgaW50byBhY3QoLi4uKTpcXG5cXG4nICsgJ2FjdCgoKSA9PiB7XFxuJyArICcgIC8qIGZpcmUgZXZlbnRzIHRoYXQgdXBkYXRlIHN0YXRlICovXFxuJyArICd9KTtcXG4nICsgJy8qIGFzc2VydCBvbiB0aGUgb3V0cHV0ICovXFxuXFxuJyArIFwiVGhpcyBlbnN1cmVzIHRoYXQgeW91J3JlIHRlc3RpbmcgdGhlIGJlaGF2aW9yIHRoZSB1c2VyIHdvdWxkIHNlZSBpbiB0aGUgYnJvd3Nlci5cIiArICcgTGVhcm4gbW9yZSBhdCBodHRwczovL2ZiLm1lL3JlYWN0LXdyYXAtdGVzdHMtd2l0aC1hY3QnICsgJyVzJywgZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSwgZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKGZpYmVyKSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlV29yayhmaWJlciwgZXhwaXJhdGlvblRpbWUpIHtcbiAgdmFyIHJvb3QgPSBzY2hlZHVsZVdvcmtUb1Jvb3QoZmliZXIsIGV4cGlyYXRpb25UaW1lKTtcbiAgaWYgKHJvb3QgPT09IG51bGwpIHtcbiAgICB7XG4gICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgIHdhcm5BYm91dFVwZGF0ZU9uVW5tb3VudGVkKGZpYmVyLCB0cnVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAgICB3YXJuQWJvdXRVcGRhdGVPblVubW91bnRlZChmaWJlciwgZmFsc2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWlzV29ya2luZyAmJiBuZXh0UmVuZGVyRXhwaXJhdGlvblRpbWUgIT09IE5vV29yayAmJiBleHBpcmF0aW9uVGltZSA+IG5leHRSZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAgIC8vIFRoaXMgaXMgYW4gaW50ZXJydXB0aW9uLiAoVXNlZCBmb3IgcGVyZm9ybWFuY2UgdHJhY2tpbmcuKVxuICAgIGludGVycnVwdGVkQnkgPSBmaWJlcjtcbiAgICByZXNldFN0YWNrKCk7XG4gIH1cbiAgbWFya1BlbmRpbmdQcmlvcml0eUxldmVsKHJvb3QsIGV4cGlyYXRpb25UaW1lKTtcbiAgaWYgKFxuICAvLyBJZiB3ZSdyZSBpbiB0aGUgcmVuZGVyIHBoYXNlLCB3ZSBkb24ndCBuZWVkIHRvIHNjaGVkdWxlIHRoaXMgcm9vdFxuICAvLyBmb3IgYW4gdXBkYXRlLCBiZWNhdXNlIHdlJ2xsIGRvIGl0IGJlZm9yZSB3ZSBleGl0Li4uXG4gICFpc1dvcmtpbmcgfHwgaXNDb21taXR0aW5nJDEgfHxcbiAgLy8gLi4udW5sZXNzIHRoaXMgaXMgYSBkaWZmZXJlbnQgcm9vdCB0aGFuIHRoZSBvbmUgd2UncmUgcmVuZGVyaW5nLlxuICBuZXh0Um9vdCAhPT0gcm9vdCkge1xuICAgIHZhciByb290RXhwaXJhdGlvblRpbWUgPSByb290LmV4cGlyYXRpb25UaW1lO1xuICAgIHJlcXVlc3RXb3JrKHJvb3QsIHJvb3RFeHBpcmF0aW9uVGltZSk7XG4gIH1cbiAgaWYgKG5lc3RlZFVwZGF0ZUNvdW50ID4gTkVTVEVEX1VQREFURV9MSU1JVCkge1xuICAgIC8vIFJlc2V0IHRoaXMgYmFjayB0byB6ZXJvIHNvIHN1YnNlcXVlbnQgdXBkYXRlcyBkb24ndCB0aHJvdy5cbiAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gICAgaW52YXJpYW50KGZhbHNlLCAnTWF4aW11bSB1cGRhdGUgZGVwdGggZXhjZWVkZWQuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgY29tcG9uZW50IHJlcGVhdGVkbHkgY2FsbHMgc2V0U3RhdGUgaW5zaWRlIGNvbXBvbmVudFdpbGxVcGRhdGUgb3IgY29tcG9uZW50RGlkVXBkYXRlLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiBuZXN0ZWQgdXBkYXRlcyB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN5bmNVcGRhdGVzKGZuLCBhLCBiLCBjLCBkKSB7XG4gIHJldHVybiBzY2hlZHVsZXIudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5KHNjaGVkdWxlci51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eSwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmbihhLCBiLCBjLCBkKTtcbiAgfSk7XG59XG5cbi8vIFRPRE86IEV2ZXJ5dGhpbmcgYmVsb3cgdGhpcyBpcyB3cml0dGVuIGFzIGlmIGl0IGhhcyBiZWVuIGxpZnRlZCB0byB0aGVcbi8vIHJlbmRlcmVycy4gSSdsbCBkbyB0aGlzIGluIGEgZm9sbG93LXVwLlxuXG4vLyBMaW5rZWQtbGlzdCBvZiByb290c1xudmFyIGZpcnN0U2NoZWR1bGVkUm9vdCA9IG51bGw7XG52YXIgbGFzdFNjaGVkdWxlZFJvb3QgPSBudWxsO1xuXG52YXIgY2FsbGJhY2tFeHBpcmF0aW9uVGltZSA9IE5vV29yaztcbnZhciBjYWxsYmFja0lEID0gdm9pZCAwO1xudmFyIGlzUmVuZGVyaW5nID0gZmFsc2U7XG52YXIgbmV4dEZsdXNoZWRSb290ID0gbnVsbDtcbnZhciBuZXh0Rmx1c2hlZEV4cGlyYXRpb25UaW1lID0gTm9Xb3JrO1xudmFyIGxvd2VzdFByaW9yaXR5UGVuZGluZ0ludGVyYWN0aXZlRXhwaXJhdGlvblRpbWUgPSBOb1dvcms7XG52YXIgaGFzVW5oYW5kbGVkRXJyb3IgPSBmYWxzZTtcbnZhciB1bmhhbmRsZWRFcnJvciA9IG51bGw7XG5cbnZhciBpc0JhdGNoaW5nVXBkYXRlcyA9IGZhbHNlO1xudmFyIGlzVW5iYXRjaGluZ1VwZGF0ZXMgPSBmYWxzZTtcblxudmFyIGNvbXBsZXRlZEJhdGNoZXMgPSBudWxsO1xuXG52YXIgb3JpZ2luYWxTdGFydFRpbWVNcyA9IHNjaGVkdWxlci51bnN0YWJsZV9ub3coKTtcbnZhciBjdXJyZW50UmVuZGVyZXJUaW1lID0gbXNUb0V4cGlyYXRpb25UaW1lKG9yaWdpbmFsU3RhcnRUaW1lTXMpO1xudmFyIGN1cnJlbnRTY2hlZHVsZXJUaW1lID0gY3VycmVudFJlbmRlcmVyVGltZTtcblxuLy8gVXNlIHRoZXNlIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcCBvZiBuZXN0ZWQgdXBkYXRlc1xudmFyIE5FU1RFRF9VUERBVEVfTElNSVQgPSA1MDtcbnZhciBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG52YXIgbGFzdENvbW1pdHRlZFJvb3REdXJpbmdUaGlzQmF0Y2ggPSBudWxsO1xuXG5mdW5jdGlvbiByZWNvbXB1dGVDdXJyZW50UmVuZGVyZXJUaW1lKCkge1xuICB2YXIgY3VycmVudFRpbWVNcyA9IHNjaGVkdWxlci51bnN0YWJsZV9ub3coKSAtIG9yaWdpbmFsU3RhcnRUaW1lTXM7XG4gIGN1cnJlbnRSZW5kZXJlclRpbWUgPSBtc1RvRXhwaXJhdGlvblRpbWUoY3VycmVudFRpbWVNcyk7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlQ2FsbGJhY2tXaXRoRXhwaXJhdGlvblRpbWUocm9vdCwgZXhwaXJhdGlvblRpbWUpIHtcbiAgaWYgKGNhbGxiYWNrRXhwaXJhdGlvblRpbWUgIT09IE5vV29yaykge1xuICAgIC8vIEEgY2FsbGJhY2sgaXMgYWxyZWFkeSBzY2hlZHVsZWQuIENoZWNrIGl0cyBleHBpcmF0aW9uIHRpbWUgKHRpbWVvdXQpLlxuICAgIGlmIChleHBpcmF0aW9uVGltZSA8IGNhbGxiYWNrRXhwaXJhdGlvblRpbWUpIHtcbiAgICAgIC8vIEV4aXN0aW5nIGNhbGxiYWNrIGhhcyBzdWZmaWNpZW50IHRpbWVvdXQuIEV4aXQuXG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjYWxsYmFja0lEICE9PSBudWxsKSB7XG4gICAgICAgIC8vIEV4aXN0aW5nIGNhbGxiYWNrIGhhcyBpbnN1ZmZpY2llbnQgdGltZW91dC4gQ2FuY2VsIGFuZCBzY2hlZHVsZSBhXG4gICAgICAgIC8vIG5ldyBvbmUuXG4gICAgICAgIHNjaGVkdWxlci51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayhjYWxsYmFja0lEKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gVGhlIHJlcXVlc3QgY2FsbGJhY2sgdGltZXIgaXMgYWxyZWFkeSBydW5uaW5nLiBEb24ndCBzdGFydCBhIG5ldyBvbmUuXG4gIH0gZWxzZSB7XG4gICAgc3RhcnRSZXF1ZXN0Q2FsbGJhY2tUaW1lcigpO1xuICB9XG5cbiAgY2FsbGJhY2tFeHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lO1xuICB2YXIgY3VycmVudE1zID0gc2NoZWR1bGVyLnVuc3RhYmxlX25vdygpIC0gb3JpZ2luYWxTdGFydFRpbWVNcztcbiAgdmFyIGV4cGlyYXRpb25UaW1lTXMgPSBleHBpcmF0aW9uVGltZVRvTXMoZXhwaXJhdGlvblRpbWUpO1xuICB2YXIgdGltZW91dCA9IGV4cGlyYXRpb25UaW1lTXMgLSBjdXJyZW50TXM7XG4gIGNhbGxiYWNrSUQgPSBzY2hlZHVsZXIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhwZXJmb3JtQXN5bmNXb3JrLCB7IHRpbWVvdXQ6IHRpbWVvdXQgfSk7XG59XG5cbi8vIEZvciBldmVyeSBjYWxsIHRvIHJlbmRlclJvb3QsIG9uZSBvZiBvbkZhdGFsLCBvbkNvbXBsZXRlLCBvblN1c3BlbmQsIGFuZFxuLy8gb25ZaWVsZCBpcyBjYWxsZWQgdXBvbiBleGl0aW5nLiBXZSB1c2UgdGhlc2UgaW4gbGlldSBvZiByZXR1cm5pbmcgYSB0dXBsZS5cbi8vIEkndmUgYWxzbyBjaG9zZW4gbm90IHRvIGlubGluZSB0aGVtIGludG8gcmVuZGVyUm9vdCBiZWNhdXNlIHRoZXNlIHdpbGxcbi8vIGV2ZW50dWFsbHkgYmUgbGlmdGVkIGludG8gdGhlIHJlbmRlcmVyLlxuZnVuY3Rpb24gb25GYXRhbChyb290KSB7XG4gIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gb25Db21wbGV0ZShyb290LCBmaW5pc2hlZFdvcmssIGV4cGlyYXRpb25UaW1lKSB7XG4gIHJvb3QucGVuZGluZ0NvbW1pdEV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gIHJvb3QuZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrO1xufVxuXG5mdW5jdGlvbiBvblN1c3BlbmQocm9vdCwgZmluaXNoZWRXb3JrLCBzdXNwZW5kZWRFeHBpcmF0aW9uVGltZSwgcm9vdEV4cGlyYXRpb25UaW1lLCBtc1VudGlsVGltZW91dCkge1xuICByb290LmV4cGlyYXRpb25UaW1lID0gcm9vdEV4cGlyYXRpb25UaW1lO1xuICBpZiAobXNVbnRpbFRpbWVvdXQgPT09IDAgJiYgIXNob3VsZFlpZWxkVG9SZW5kZXJlcigpKSB7XG4gICAgLy8gRG9uJ3Qgd2FpdCBhbiBhZGRpdGlvbmFsIHRpY2suIENvbW1pdCB0aGUgdHJlZSBpbW1lZGlhdGVseS5cbiAgICByb290LnBlbmRpbmdDb21taXRFeHBpcmF0aW9uVGltZSA9IHN1c3BlbmRlZEV4cGlyYXRpb25UaW1lO1xuICAgIHJvb3QuZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrO1xuICB9IGVsc2UgaWYgKG1zVW50aWxUaW1lb3V0ID4gMCkge1xuICAgIC8vIFdhaXQgYG1zVW50aWxUaW1lb3V0YCBtaWxsaXNlY29uZHMgYmVmb3JlIGNvbW1pdHRpbmcuXG4gICAgcm9vdC50aW1lb3V0SGFuZGxlID0gc2NoZWR1bGVUaW1lb3V0KG9uVGltZW91dC5iaW5kKG51bGwsIHJvb3QsIGZpbmlzaGVkV29yaywgc3VzcGVuZGVkRXhwaXJhdGlvblRpbWUpLCBtc1VudGlsVGltZW91dCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gb25ZaWVsZChyb290KSB7XG4gIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gb25UaW1lb3V0KHJvb3QsIGZpbmlzaGVkV29yaywgc3VzcGVuZGVkRXhwaXJhdGlvblRpbWUpIHtcbiAgLy8gVGhlIHJvb3QgdGltZWQgb3V0LiBDb21taXQgaXQuXG4gIHJvb3QucGVuZGluZ0NvbW1pdEV4cGlyYXRpb25UaW1lID0gc3VzcGVuZGVkRXhwaXJhdGlvblRpbWU7XG4gIHJvb3QuZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrO1xuICAvLyBSZWFkIHRoZSBjdXJyZW50IHRpbWUgYmVmb3JlIGVudGVyaW5nIHRoZSBjb21taXQgcGhhc2UuIFdlIGNhbiBiZVxuICAvLyBjZXJ0YWluIHRoaXMgd29uJ3QgY2F1c2UgdGVhcmluZyByZWxhdGVkIHRvIGJhdGNoaW5nIG9mIGV2ZW50IHVwZGF0ZXNcbiAgLy8gYmVjYXVzZSB3ZSdyZSBhdCB0aGUgdG9wIG9mIGEgdGltZXIgZXZlbnQuXG4gIHJlY29tcHV0ZUN1cnJlbnRSZW5kZXJlclRpbWUoKTtcbiAgY3VycmVudFNjaGVkdWxlclRpbWUgPSBjdXJyZW50UmVuZGVyZXJUaW1lO1xuICBmbHVzaFJvb3Qocm9vdCwgc3VzcGVuZGVkRXhwaXJhdGlvblRpbWUpO1xufVxuXG5mdW5jdGlvbiBvbkNvbW1pdChyb290LCBleHBpcmF0aW9uVGltZSkge1xuICByb290LmV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdEN1cnJlbnRUaW1lKCkge1xuICAvLyByZXF1ZXN0Q3VycmVudFRpbWUgaXMgY2FsbGVkIGJ5IHRoZSBzY2hlZHVsZXIgdG8gY29tcHV0ZSBhbiBleHBpcmF0aW9uXG4gIC8vIHRpbWUuXG4gIC8vXG4gIC8vIEV4cGlyYXRpb24gdGltZXMgYXJlIGNvbXB1dGVkIGJ5IGFkZGluZyB0byB0aGUgY3VycmVudCB0aW1lICh0aGUgc3RhcnRcbiAgLy8gdGltZSkuIEhvd2V2ZXIsIGlmIHR3byB1cGRhdGVzIGFyZSBzY2hlZHVsZWQgd2l0aGluIHRoZSBzYW1lIGV2ZW50LCB3ZVxuICAvLyBzaG91bGQgdHJlYXQgdGhlaXIgc3RhcnQgdGltZXMgYXMgc2ltdWx0YW5lb3VzLCBldmVuIGlmIHRoZSBhY3R1YWwgY2xvY2tcbiAgLy8gdGltZSBoYXMgYWR2YW5jZWQgYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHNlY29uZCBjYWxsLlxuXG4gIC8vIEluIG90aGVyIHdvcmRzLCBiZWNhdXNlIGV4cGlyYXRpb24gdGltZXMgZGV0ZXJtaW5lIGhvdyB1cGRhdGVzIGFyZSBiYXRjaGVkLFxuICAvLyB3ZSB3YW50IGFsbCB1cGRhdGVzIG9mIGxpa2UgcHJpb3JpdHkgdGhhdCBvY2N1ciB3aXRoaW4gdGhlIHNhbWUgZXZlbnQgdG9cbiAgLy8gcmVjZWl2ZSB0aGUgc2FtZSBleHBpcmF0aW9uIHRpbWUuIE90aGVyd2lzZSB3ZSBnZXQgdGVhcmluZy5cbiAgLy9cbiAgLy8gV2Uga2VlcCB0cmFjayBvZiB0d28gc2VwYXJhdGUgdGltZXM6IHRoZSBjdXJyZW50IFwicmVuZGVyZXJcIiB0aW1lIGFuZCB0aGVcbiAgLy8gY3VycmVudCBcInNjaGVkdWxlclwiIHRpbWUuIFRoZSByZW5kZXJlciB0aW1lIGNhbiBiZSB1cGRhdGVkIHdoZW5ldmVyOyBpdFxuICAvLyBvbmx5IGV4aXN0cyB0byBtaW5pbWl6ZSB0aGUgY2FsbHMgcGVyZm9ybWFuY2Uubm93LlxuICAvL1xuICAvLyBCdXQgdGhlIHNjaGVkdWxlciB0aW1lIGNhbiBvbmx5IGJlIHVwZGF0ZWQgaWYgdGhlcmUncyBubyBwZW5kaW5nIHdvcmssIG9yXG4gIC8vIGlmIHdlIGtub3cgZm9yIGNlcnRhaW4gdGhhdCB3ZSdyZSBub3QgaW4gdGhlIG1pZGRsZSBvZiBhbiBldmVudC5cblxuICBpZiAoaXNSZW5kZXJpbmcpIHtcbiAgICAvLyBXZSdyZSBhbHJlYWR5IHJlbmRlcmluZy4gUmV0dXJuIHRoZSBtb3N0IHJlY2VudGx5IHJlYWQgdGltZS5cbiAgICByZXR1cm4gY3VycmVudFNjaGVkdWxlclRpbWU7XG4gIH1cbiAgLy8gQ2hlY2sgaWYgdGhlcmUncyBwZW5kaW5nIHdvcmsuXG4gIGZpbmRIaWdoZXN0UHJpb3JpdHlSb290KCk7XG4gIGlmIChuZXh0Rmx1c2hlZEV4cGlyYXRpb25UaW1lID09PSBOb1dvcmsgfHwgbmV4dEZsdXNoZWRFeHBpcmF0aW9uVGltZSA9PT0gTmV2ZXIpIHtcbiAgICAvLyBJZiB0aGVyZSdzIG5vIHBlbmRpbmcgd29yaywgb3IgaWYgdGhlIHBlbmRpbmcgd29yayBpcyBvZmZzY3JlZW4sIHdlIGNhblxuICAgIC8vIHJlYWQgdGhlIGN1cnJlbnQgdGltZSB3aXRob3V0IHJpc2sgb2YgdGVhcmluZy5cbiAgICByZWNvbXB1dGVDdXJyZW50UmVuZGVyZXJUaW1lKCk7XG4gICAgY3VycmVudFNjaGVkdWxlclRpbWUgPSBjdXJyZW50UmVuZGVyZXJUaW1lO1xuICAgIHJldHVybiBjdXJyZW50U2NoZWR1bGVyVGltZTtcbiAgfVxuICAvLyBUaGVyZSdzIGFscmVhZHkgcGVuZGluZyB3b3JrLiBXZSBtaWdodCBiZSBpbiB0aGUgbWlkZGxlIG9mIGEgYnJvd3NlclxuICAvLyBldmVudC4gSWYgd2Ugd2VyZSB0byByZWFkIHRoZSBjdXJyZW50IHRpbWUsIGl0IGNvdWxkIGNhdXNlIG11bHRpcGxlIHVwZGF0ZXNcbiAgLy8gd2l0aGluIHRoZSBzYW1lIGV2ZW50IHRvIHJlY2VpdmUgZGlmZmVyZW50IGV4cGlyYXRpb24gdGltZXMsIGxlYWRpbmcgdG9cbiAgLy8gdGVhcmluZy4gUmV0dXJuIHRoZSBsYXN0IHJlYWQgdGltZS4gRHVyaW5nIHRoZSBuZXh0IGlkbGUgY2FsbGJhY2ssIHRoZVxuICAvLyB0aW1lIHdpbGwgYmUgdXBkYXRlZC5cbiAgcmV0dXJuIGN1cnJlbnRTY2hlZHVsZXJUaW1lO1xufVxuXG4vLyByZXF1ZXN0V29yayBpcyBjYWxsZWQgYnkgdGhlIHNjaGVkdWxlciB3aGVuZXZlciBhIHJvb3QgcmVjZWl2ZXMgYW4gdXBkYXRlLlxuLy8gSXQncyB1cCB0byB0aGUgcmVuZGVyZXIgdG8gY2FsbCByZW5kZXJSb290IGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS5cbmZ1bmN0aW9uIHJlcXVlc3RXb3JrKHJvb3QsIGV4cGlyYXRpb25UaW1lKSB7XG4gIGFkZFJvb3RUb1NjaGVkdWxlKHJvb3QsIGV4cGlyYXRpb25UaW1lKTtcbiAgaWYgKGlzUmVuZGVyaW5nKSB7XG4gICAgLy8gUHJldmVudCByZWVudHJhbmN5LiBSZW1haW5pbmcgd29yayB3aWxsIGJlIHNjaGVkdWxlZCBhdCB0aGUgZW5kIG9mXG4gICAgLy8gdGhlIGN1cnJlbnRseSByZW5kZXJpbmcgYmF0Y2guXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGlzQmF0Y2hpbmdVcGRhdGVzKSB7XG4gICAgLy8gRmx1c2ggd29yayBhdCB0aGUgZW5kIG9mIHRoZSBiYXRjaC5cbiAgICBpZiAoaXNVbmJhdGNoaW5nVXBkYXRlcykge1xuICAgICAgLy8gLi4udW5sZXNzIHdlJ3JlIGluc2lkZSB1bmJhdGNoZWRVcGRhdGVzLCBpbiB3aGljaCBjYXNlIHdlIHNob3VsZFxuICAgICAgLy8gZmx1c2ggaXQgbm93LlxuICAgICAgbmV4dEZsdXNoZWRSb290ID0gcm9vdDtcbiAgICAgIG5leHRGbHVzaGVkRXhwaXJhdGlvblRpbWUgPSBTeW5jO1xuICAgICAgcGVyZm9ybVdvcmtPblJvb3Qocm9vdCwgU3luYywgZmFsc2UpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUT0RPOiBHZXQgcmlkIG9mIFN5bmMgYW5kIHVzZSBjdXJyZW50IHRpbWU/XG4gIGlmIChleHBpcmF0aW9uVGltZSA9PT0gU3luYykge1xuICAgIHBlcmZvcm1TeW5jV29yaygpO1xuICB9IGVsc2Uge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tXaXRoRXhwaXJhdGlvblRpbWUocm9vdCwgZXhwaXJhdGlvblRpbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFJvb3RUb1NjaGVkdWxlKHJvb3QsIGV4cGlyYXRpb25UaW1lKSB7XG4gIC8vIEFkZCB0aGUgcm9vdCB0byB0aGUgc2NoZWR1bGUuXG4gIC8vIENoZWNrIGlmIHRoaXMgcm9vdCBpcyBhbHJlYWR5IHBhcnQgb2YgdGhlIHNjaGVkdWxlLlxuICBpZiAocm9vdC5uZXh0U2NoZWR1bGVkUm9vdCA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgcm9vdCBpcyBub3QgYWxyZWFkeSBzY2hlZHVsZWQuIEFkZCBpdC5cbiAgICByb290LmV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gICAgaWYgKGxhc3RTY2hlZHVsZWRSb290ID09PSBudWxsKSB7XG4gICAgICBmaXJzdFNjaGVkdWxlZFJvb3QgPSBsYXN0U2NoZWR1bGVkUm9vdCA9IHJvb3Q7XG4gICAgICByb290Lm5leHRTY2hlZHVsZWRSb290ID0gcm9vdDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdFNjaGVkdWxlZFJvb3QubmV4dFNjaGVkdWxlZFJvb3QgPSByb290O1xuICAgICAgbGFzdFNjaGVkdWxlZFJvb3QgPSByb290O1xuICAgICAgbGFzdFNjaGVkdWxlZFJvb3QubmV4dFNjaGVkdWxlZFJvb3QgPSBmaXJzdFNjaGVkdWxlZFJvb3Q7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgcm9vdCBpcyBhbHJlYWR5IHNjaGVkdWxlZCwgYnV0IGl0cyBwcmlvcml0eSBtYXkgaGF2ZSBpbmNyZWFzZWQuXG4gICAgdmFyIHJlbWFpbmluZ0V4cGlyYXRpb25UaW1lID0gcm9vdC5leHBpcmF0aW9uVGltZTtcbiAgICBpZiAoZXhwaXJhdGlvblRpbWUgPiByZW1haW5pbmdFeHBpcmF0aW9uVGltZSkge1xuICAgICAgLy8gVXBkYXRlIHRoZSBwcmlvcml0eS5cbiAgICAgIHJvb3QuZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEhpZ2hlc3RQcmlvcml0eVJvb3QoKSB7XG4gIHZhciBoaWdoZXN0UHJpb3JpdHlXb3JrID0gTm9Xb3JrO1xuICB2YXIgaGlnaGVzdFByaW9yaXR5Um9vdCA9IG51bGw7XG4gIGlmIChsYXN0U2NoZWR1bGVkUm9vdCAhPT0gbnVsbCkge1xuICAgIHZhciBwcmV2aW91c1NjaGVkdWxlZFJvb3QgPSBsYXN0U2NoZWR1bGVkUm9vdDtcbiAgICB2YXIgcm9vdCA9IGZpcnN0U2NoZWR1bGVkUm9vdDtcbiAgICB3aGlsZSAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgdmFyIHJlbWFpbmluZ0V4cGlyYXRpb25UaW1lID0gcm9vdC5leHBpcmF0aW9uVGltZTtcbiAgICAgIGlmIChyZW1haW5pbmdFeHBpcmF0aW9uVGltZSA9PT0gTm9Xb3JrKSB7XG4gICAgICAgIC8vIFRoaXMgcm9vdCBubyBsb25nZXIgaGFzIHdvcmsuIFJlbW92ZSBpdCBmcm9tIHRoZSBzY2hlZHVsZXIuXG5cbiAgICAgICAgLy8gVE9ETzogVGhpcyBjaGVjayBpcyByZWR1ZGFudCwgYnV0IEZsb3cgaXMgY29uZnVzZWQgYnkgdGhlIGJyYW5jaFxuICAgICAgICAvLyBiZWxvdyB3aGVyZSB3ZSBzZXQgbGFzdFNjaGVkdWxlZFJvb3QgdG8gbnVsbCwgZXZlbiB0aG91Z2ggd2UgYnJlYWtcbiAgICAgICAgLy8gZnJvbSB0aGUgbG9vcCByaWdodCBhZnRlci5cbiAgICAgICAgIShwcmV2aW91c1NjaGVkdWxlZFJvb3QgIT09IG51bGwgJiYgbGFzdFNjaGVkdWxlZFJvb3QgIT09IG51bGwpID8gaW52YXJpYW50KGZhbHNlLCAnU2hvdWxkIGhhdmUgYSBwcmV2aW91cyBhbmQgbGFzdCByb290LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpIDogdm9pZCAwO1xuICAgICAgICBpZiAocm9vdCA9PT0gcm9vdC5uZXh0U2NoZWR1bGVkUm9vdCkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIG9ubHkgcm9vdCBpbiB0aGUgbGlzdC5cbiAgICAgICAgICByb290Lm5leHRTY2hlZHVsZWRSb290ID0gbnVsbDtcbiAgICAgICAgICBmaXJzdFNjaGVkdWxlZFJvb3QgPSBsYXN0U2NoZWR1bGVkUm9vdCA9IG51bGw7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAocm9vdCA9PT0gZmlyc3RTY2hlZHVsZWRSb290KSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3Qgcm9vdCBpbiB0aGUgbGlzdC5cbiAgICAgICAgICB2YXIgbmV4dCA9IHJvb3QubmV4dFNjaGVkdWxlZFJvb3Q7XG4gICAgICAgICAgZmlyc3RTY2hlZHVsZWRSb290ID0gbmV4dDtcbiAgICAgICAgICBsYXN0U2NoZWR1bGVkUm9vdC5uZXh0U2NoZWR1bGVkUm9vdCA9IG5leHQ7XG4gICAgICAgICAgcm9vdC5uZXh0U2NoZWR1bGVkUm9vdCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAocm9vdCA9PT0gbGFzdFNjaGVkdWxlZFJvb3QpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBsYXN0IHJvb3QgaW4gdGhlIGxpc3QuXG4gICAgICAgICAgbGFzdFNjaGVkdWxlZFJvb3QgPSBwcmV2aW91c1NjaGVkdWxlZFJvb3Q7XG4gICAgICAgICAgbGFzdFNjaGVkdWxlZFJvb3QubmV4dFNjaGVkdWxlZFJvb3QgPSBmaXJzdFNjaGVkdWxlZFJvb3Q7XG4gICAgICAgICAgcm9vdC5uZXh0U2NoZWR1bGVkUm9vdCA9IG51bGw7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNTY2hlZHVsZWRSb290Lm5leHRTY2hlZHVsZWRSb290ID0gcm9vdC5uZXh0U2NoZWR1bGVkUm9vdDtcbiAgICAgICAgICByb290Lm5leHRTY2hlZHVsZWRSb290ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByb290ID0gcHJldmlvdXNTY2hlZHVsZWRSb290Lm5leHRTY2hlZHVsZWRSb290O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHJlbWFpbmluZ0V4cGlyYXRpb25UaW1lID4gaGlnaGVzdFByaW9yaXR5V29yaykge1xuICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcHJpb3JpdHksIGlmIGl0J3MgaGlnaGVyXG4gICAgICAgICAgaGlnaGVzdFByaW9yaXR5V29yayA9IHJlbWFpbmluZ0V4cGlyYXRpb25UaW1lO1xuICAgICAgICAgIGhpZ2hlc3RQcmlvcml0eVJvb3QgPSByb290O1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb290ID09PSBsYXN0U2NoZWR1bGVkUm9vdCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoaWdoZXN0UHJpb3JpdHlXb3JrID09PSBTeW5jKSB7XG4gICAgICAgICAgLy8gU3luYyBpcyBoaWdoZXN0IHByaW9yaXR5IGJ5IGRlZmluaXRpb24gc29cbiAgICAgICAgICAvLyB3ZSBjYW4gc3RvcCBzZWFyY2hpbmcuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcHJldmlvdXNTY2hlZHVsZWRSb290ID0gcm9vdDtcbiAgICAgICAgcm9vdCA9IHJvb3QubmV4dFNjaGVkdWxlZFJvb3Q7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmV4dEZsdXNoZWRSb290ID0gaGlnaGVzdFByaW9yaXR5Um9vdDtcbiAgbmV4dEZsdXNoZWRFeHBpcmF0aW9uVGltZSA9IGhpZ2hlc3RQcmlvcml0eVdvcms7XG59XG5cbi8vIFRPRE86IFRoaXMgd3JhcHBlciBleGlzdHMgYmVjYXVzZSBtYW55IG9mIHRoZSBvbGRlciB0ZXN0cyAodGhlIG9uZXMgdGhhdCB1c2Vcbi8vIGZsdXNoRGVmZXJyZWRQcmkpIHJlbHkgb24gdGhlIG51bWJlciBvZiB0aW1lcyBgc2hvdWxkWWllbGRgIGlzIGNhbGxlZC4gV2Vcbi8vIHNob3VsZCBnZXQgcmlkIG9mIGl0LlxudmFyIGRpZFlpZWxkID0gZmFsc2U7XG5mdW5jdGlvbiBzaG91bGRZaWVsZFRvUmVuZGVyZXIoKSB7XG4gIGlmIChkaWRZaWVsZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChzY2hlZHVsZXIudW5zdGFibGVfc2hvdWxkWWllbGQoKSkge1xuICAgIGRpZFlpZWxkID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBlcmZvcm1Bc3luY1dvcmsoKSB7XG4gIHRyeSB7XG4gICAgaWYgKCFzaG91bGRZaWVsZFRvUmVuZGVyZXIoKSkge1xuICAgICAgLy8gVGhlIGNhbGxiYWNrIHRpbWVkIG91dC4gVGhhdCBtZWFucyBhdCBsZWFzdCBvbmUgdXBkYXRlIGhhcyBleHBpcmVkLlxuICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSByb290IHNjaGVkdWxlLiBJZiB0aGV5IGNvbnRhaW4gZXhwaXJlZCB3b3JrLCBzZXRcbiAgICAgIC8vIHRoZSBuZXh0IHJlbmRlciBleHBpcmF0aW9uIHRpbWUgdG8gdGhlIGN1cnJlbnQgdGltZS4gVGhpcyBoYXMgdGhlIGVmZmVjdFxuICAgICAgLy8gb2YgZmx1c2hpbmcgYWxsIGV4cGlyZWQgd29yayBpbiBhIHNpbmdsZSBiYXRjaCwgaW5zdGVhZCBvZiBmbHVzaGluZyBlYWNoXG4gICAgICAvLyBsZXZlbCBvbmUgYXQgYSB0aW1lLlxuICAgICAgaWYgKGZpcnN0U2NoZWR1bGVkUm9vdCAhPT0gbnVsbCkge1xuICAgICAgICByZWNvbXB1dGVDdXJyZW50UmVuZGVyZXJUaW1lKCk7XG4gICAgICAgIHZhciByb290ID0gZmlyc3RTY2hlZHVsZWRSb290O1xuICAgICAgICBkbyB7XG4gICAgICAgICAgZGlkRXhwaXJlQXRFeHBpcmF0aW9uVGltZShyb290LCBjdXJyZW50UmVuZGVyZXJUaW1lKTtcbiAgICAgICAgICAvLyBUaGUgcm9vdCBzY2hlZHVsZSBpcyBjaXJjdWxhciwgc28gdGhpcyBpcyBuZXZlciBudWxsLlxuICAgICAgICAgIHJvb3QgPSByb290Lm5leHRTY2hlZHVsZWRSb290O1xuICAgICAgICB9IHdoaWxlIChyb290ICE9PSBmaXJzdFNjaGVkdWxlZFJvb3QpO1xuICAgICAgfVxuICAgIH1cbiAgICBwZXJmb3JtV29yayhOb1dvcmssIHRydWUpO1xuICB9IGZpbmFsbHkge1xuICAgIGRpZFlpZWxkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGVyZm9ybVN5bmNXb3JrKCkge1xuICBwZXJmb3JtV29yayhTeW5jLCBmYWxzZSk7XG59XG5cbmZ1bmN0aW9uIHBlcmZvcm1Xb3JrKG1pbkV4cGlyYXRpb25UaW1lLCBpc1lpZWxkeSkge1xuICAvLyBLZWVwIHdvcmtpbmcgb24gcm9vdHMgdW50aWwgdGhlcmUncyBubyBtb3JlIHdvcmssIG9yIHVudGlsIHRoZXJlJ3MgYSBoaWdoZXJcbiAgLy8gcHJpb3JpdHkgZXZlbnQuXG4gIGZpbmRIaWdoZXN0UHJpb3JpdHlSb290KCk7XG5cbiAgaWYgKGlzWWllbGR5KSB7XG4gICAgcmVjb21wdXRlQ3VycmVudFJlbmRlcmVyVGltZSgpO1xuICAgIGN1cnJlbnRTY2hlZHVsZXJUaW1lID0gY3VycmVudFJlbmRlcmVyVGltZTtcblxuICAgIGlmIChlbmFibGVVc2VyVGltaW5nQVBJKSB7XG4gICAgICB2YXIgZGlkRXhwaXJlID0gbmV4dEZsdXNoZWRFeHBpcmF0aW9uVGltZSA+IGN1cnJlbnRSZW5kZXJlclRpbWU7XG4gICAgICB2YXIgdGltZW91dCA9IGV4cGlyYXRpb25UaW1lVG9NcyhuZXh0Rmx1c2hlZEV4cGlyYXRpb25UaW1lKTtcbiAgICAgIHN0b3BSZXF1ZXN0Q2FsbGJhY2tUaW1lcihkaWRFeHBpcmUsIHRpbWVvdXQpO1xuICAgIH1cblxuICAgIHdoaWxlIChuZXh0Rmx1c2hlZFJvb3QgIT09IG51bGwgJiYgbmV4dEZsdXNoZWRFeHBpcmF0aW9uVGltZSAhPT0gTm9Xb3JrICYmIG1pbkV4cGlyYXRpb25UaW1lIDw9IG5leHRGbHVzaGVkRXhwaXJhdGlvblRpbWUgJiYgIShkaWRZaWVsZCAmJiBjdXJyZW50UmVuZGVyZXJUaW1lID4gbmV4dEZsdXNoZWRFeHBpcmF0aW9uVGltZSkpIHtcbiAgICAgIHBlcmZvcm1Xb3JrT25Sb290KG5leHRGbHVzaGVkUm9vdCwgbmV4dEZsdXNoZWRFeHBpcmF0aW9uVGltZSwgY3VycmVudFJlbmRlcmVyVGltZSA+IG5leHRGbHVzaGVkRXhwaXJhdGlvblRpbWUpO1xuICAgICAgZmluZEhpZ2hlc3RQcmlvcml0eVJvb3QoKTtcbiAgICAgIHJlY29tcHV0ZUN1cnJlbnRSZW5kZXJlclRpbWUoKTtcbiAgICAgIGN1cnJlbnRTY2hlZHVsZXJUaW1lID0gY3VycmVudFJlbmRlcmVyVGltZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKG5leHRGbHVzaGVkUm9vdCAhPT0gbnVsbCAmJiBuZXh0Rmx1c2hlZEV4cGlyYXRpb25UaW1lICE9PSBOb1dvcmsgJiYgbWluRXhwaXJhdGlvblRpbWUgPD0gbmV4dEZsdXNoZWRFeHBpcmF0aW9uVGltZSkge1xuICAgICAgcGVyZm9ybVdvcmtPblJvb3QobmV4dEZsdXNoZWRSb290LCBuZXh0Rmx1c2hlZEV4cGlyYXRpb25UaW1lLCBmYWxzZSk7XG4gICAgICBmaW5kSGlnaGVzdFByaW9yaXR5Um9vdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdlJ3JlIGRvbmUgZmx1c2hpbmcgd29yay4gRWl0aGVyIHdlIHJhbiBvdXQgb2YgdGltZSBpbiB0aGlzIGNhbGxiYWNrLFxuICAvLyBvciB0aGVyZSdzIG5vIG1vcmUgd29yayBsZWZ0IHdpdGggc3VmZmljaWVudCBwcmlvcml0eS5cblxuICAvLyBJZiB3ZSdyZSBpbnNpZGUgYSBjYWxsYmFjaywgc2V0IHRoaXMgdG8gZmFsc2Ugc2luY2Ugd2UganVzdCBjb21wbGV0ZWQgaXQuXG4gIGlmIChpc1lpZWxkeSkge1xuICAgIGNhbGxiYWNrRXhwaXJhdGlvblRpbWUgPSBOb1dvcms7XG4gICAgY2FsbGJhY2tJRCA9IG51bGw7XG4gIH1cbiAgLy8gSWYgdGhlcmUncyB3b3JrIGxlZnQgb3Zlciwgc2NoZWR1bGUgYSBuZXcgY2FsbGJhY2suXG4gIGlmIChuZXh0Rmx1c2hlZEV4cGlyYXRpb25UaW1lICE9PSBOb1dvcmspIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrV2l0aEV4cGlyYXRpb25UaW1lKG5leHRGbHVzaGVkUm9vdCwgbmV4dEZsdXNoZWRFeHBpcmF0aW9uVGltZSk7XG4gIH1cblxuICAvLyBDbGVhbi11cC5cbiAgZmluaXNoUmVuZGVyaW5nKCk7XG59XG5cbmZ1bmN0aW9uIGZsdXNoUm9vdChyb290LCBleHBpcmF0aW9uVGltZSkge1xuICAhIWlzUmVuZGVyaW5nID8gaW52YXJpYW50KGZhbHNlLCAnd29yay5jb21taXQoKTogQ2Fubm90IGNvbW1pdCB3aGlsZSBhbHJlYWR5IHJlbmRlcmluZy4gVGhpcyBsaWtlbHkgbWVhbnMgeW91IGF0dGVtcHRlZCB0byBjb21taXQgZnJvbSBpbnNpZGUgYSBsaWZlY3ljbGUgbWV0aG9kLicpIDogdm9pZCAwO1xuICAvLyBQZXJmb3JtIHdvcmsgb24gcm9vdCBhcyBpZiB0aGUgZ2l2ZW4gZXhwaXJhdGlvbiB0aW1lIGlzIHRoZSBjdXJyZW50IHRpbWUuXG4gIC8vIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2Ygc3luY2hyb25vdXNseSBmbHVzaGluZyBhbGwgd29yayB1cCB0byBhbmRcbiAgLy8gaW5jbHVkaW5nIHRoZSBnaXZlbiB0aW1lLlxuICBuZXh0Rmx1c2hlZFJvb3QgPSByb290O1xuICBuZXh0Rmx1c2hlZEV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gIHBlcmZvcm1Xb3JrT25Sb290KHJvb3QsIGV4cGlyYXRpb25UaW1lLCBmYWxzZSk7XG4gIC8vIEZsdXNoIGFueSBzeW5jIHdvcmsgdGhhdCB3YXMgc2NoZWR1bGVkIGJ5IGxpZmVjeWNsZXNcbiAgcGVyZm9ybVN5bmNXb3JrKCk7XG59XG5cbmZ1bmN0aW9uIGZpbmlzaFJlbmRlcmluZygpIHtcbiAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICBsYXN0Q29tbWl0dGVkUm9vdER1cmluZ1RoaXNCYXRjaCA9IG51bGw7XG5cbiAgaWYgKGNvbXBsZXRlZEJhdGNoZXMgIT09IG51bGwpIHtcbiAgICB2YXIgYmF0Y2hlcyA9IGNvbXBsZXRlZEJhdGNoZXM7XG4gICAgY29tcGxldGVkQmF0Y2hlcyA9IG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYXRjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYmF0Y2ggPSBiYXRjaGVzW2ldO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYmF0Y2guX29uQ29tcGxldGUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghaGFzVW5oYW5kbGVkRXJyb3IpIHtcbiAgICAgICAgICBoYXNVbmhhbmRsZWRFcnJvciA9IHRydWU7XG4gICAgICAgICAgdW5oYW5kbGVkRXJyb3IgPSBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChoYXNVbmhhbmRsZWRFcnJvcikge1xuICAgIHZhciBlcnJvciA9IHVuaGFuZGxlZEVycm9yO1xuICAgIHVuaGFuZGxlZEVycm9yID0gbnVsbDtcbiAgICBoYXNVbmhhbmRsZWRFcnJvciA9IGZhbHNlO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBlcmZvcm1Xb3JrT25Sb290KHJvb3QsIGV4cGlyYXRpb25UaW1lLCBpc1lpZWxkeSkge1xuICAhIWlzUmVuZGVyaW5nID8gaW52YXJpYW50KGZhbHNlLCAncGVyZm9ybVdvcmtPblJvb3Qgd2FzIGNhbGxlZCByZWN1cnNpdmVseS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKSA6IHZvaWQgMDtcblxuICBpc1JlbmRlcmluZyA9IHRydWU7XG5cbiAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhc3luYyB3b3JrIG9yIHN5bmMvZXhwaXJlZCB3b3JrLlxuICBpZiAoIWlzWWllbGR5KSB7XG4gICAgLy8gRmx1c2ggd29yayB3aXRob3V0IHlpZWxkaW5nLlxuICAgIC8vIFRPRE86IE5vbi15aWVsZHkgd29yayBkb2VzIG5vdCBuZWNlc3NhcmlseSBpbXBseSBleHBpcmVkIHdvcmsuIEEgcmVuZGVyZXJcbiAgICAvLyBtYXkgd2FudCB0byBwZXJmb3JtIHNvbWUgd29yayB3aXRob3V0IHlpZWxkaW5nLCBidXQgYWxzbyB3aXRob3V0XG4gICAgLy8gcmVxdWlyaW5nIHRoZSByb290IHRvIGNvbXBsZXRlIChieSB0cmlnZ2VyaW5nIHBsYWNlaG9sZGVycykuXG5cbiAgICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5maW5pc2hlZFdvcms7XG4gICAgaWYgKGZpbmlzaGVkV29yayAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyByb290IGlzIGFscmVhZHkgY29tcGxldGUuIFdlIGNhbiBjb21taXQgaXQuXG4gICAgICBjb21wbGV0ZVJvb3Qocm9vdCwgZmluaXNoZWRXb3JrLCBleHBpcmF0aW9uVGltZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcbiAgICAgIC8vIElmIHRoaXMgcm9vdCBwcmV2aW91c2x5IHN1c3BlbmRlZCwgY2xlYXIgaXRzIGV4aXN0aW5nIHRpbWVvdXQsIHNpbmNlXG4gICAgICAvLyB3ZSdyZSBhYm91dCB0byB0cnkgcmVuZGVyaW5nIGFnYWluLlxuICAgICAgdmFyIHRpbWVvdXRIYW5kbGUgPSByb290LnRpbWVvdXRIYW5kbGU7XG4gICAgICBpZiAodGltZW91dEhhbmRsZSAhPT0gbm9UaW1lb3V0KSB7XG4gICAgICAgIHJvb3QudGltZW91dEhhbmRsZSA9IG5vVGltZW91dDtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSBDb21wbGFpbnMgbm9UaW1lb3V0IGlzIG5vdCBhIFRpbWVvdXRJRCwgZGVzcGl0ZSB0aGUgY2hlY2sgYWJvdmVcbiAgICAgICAgY2FuY2VsVGltZW91dCh0aW1lb3V0SGFuZGxlKTtcbiAgICAgIH1cbiAgICAgIHJlbmRlclJvb3Qocm9vdCwgaXNZaWVsZHkpO1xuICAgICAgZmluaXNoZWRXb3JrID0gcm9vdC5maW5pc2hlZFdvcms7XG4gICAgICBpZiAoZmluaXNoZWRXb3JrICE9PSBudWxsKSB7XG4gICAgICAgIC8vIFdlJ3ZlIGNvbXBsZXRlZCB0aGUgcm9vdC4gQ29tbWl0IGl0LlxuICAgICAgICBjb21wbGV0ZVJvb3Qocm9vdCwgZmluaXNoZWRXb3JrLCBleHBpcmF0aW9uVGltZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIEZsdXNoIGFzeW5jIHdvcmsuXG4gICAgdmFyIF9maW5pc2hlZFdvcmsgPSByb290LmZpbmlzaGVkV29yaztcbiAgICBpZiAoX2ZpbmlzaGVkV29yayAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyByb290IGlzIGFscmVhZHkgY29tcGxldGUuIFdlIGNhbiBjb21taXQgaXQuXG4gICAgICBjb21wbGV0ZVJvb3Qocm9vdCwgX2ZpbmlzaGVkV29yaywgZXhwaXJhdGlvblRpbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByb290LmZpbmlzaGVkV29yayA9IG51bGw7XG4gICAgICAvLyBJZiB0aGlzIHJvb3QgcHJldmlvdXNseSBzdXNwZW5kZWQsIGNsZWFyIGl0cyBleGlzdGluZyB0aW1lb3V0LCBzaW5jZVxuICAgICAgLy8gd2UncmUgYWJvdXQgdG8gdHJ5IHJlbmRlcmluZyBhZ2Fpbi5cbiAgICAgIHZhciBfdGltZW91dEhhbmRsZSA9IHJvb3QudGltZW91dEhhbmRsZTtcbiAgICAgIGlmIChfdGltZW91dEhhbmRsZSAhPT0gbm9UaW1lb3V0KSB7XG4gICAgICAgIHJvb3QudGltZW91dEhhbmRsZSA9IG5vVGltZW91dDtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSBDb21wbGFpbnMgbm9UaW1lb3V0IGlzIG5vdCBhIFRpbWVvdXRJRCwgZGVzcGl0ZSB0aGUgY2hlY2sgYWJvdmVcbiAgICAgICAgY2FuY2VsVGltZW91dChfdGltZW91dEhhbmRsZSk7XG4gICAgICB9XG4gICAgICByZW5kZXJSb290KHJvb3QsIGlzWWllbGR5KTtcbiAgICAgIF9maW5pc2hlZFdvcmsgPSByb290LmZpbmlzaGVkV29yaztcbiAgICAgIGlmIChfZmluaXNoZWRXb3JrICE9PSBudWxsKSB7XG4gICAgICAgIC8vIFdlJ3ZlIGNvbXBsZXRlZCB0aGUgcm9vdC4gQ2hlY2sgdGhlIGlmIHdlIHNob3VsZCB5aWVsZCBvbmUgbW9yZSB0aW1lXG4gICAgICAgIC8vIGJlZm9yZSBjb21taXR0aW5nLlxuICAgICAgICBpZiAoIXNob3VsZFlpZWxkVG9SZW5kZXJlcigpKSB7XG4gICAgICAgICAgLy8gU3RpbGwgdGltZSBsZWZ0LiBDb21taXQgdGhlIHJvb3QuXG4gICAgICAgICAgY29tcGxldGVSb290KHJvb3QsIF9maW5pc2hlZFdvcmssIGV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUaGVyZSdzIG5vIHRpbWUgbGVmdC4gTWFyayB0aGlzIHJvb3QgYXMgY29tcGxldGUuIFdlJ2xsIGNvbWVcbiAgICAgICAgICAvLyBiYWNrIGFuZCBjb21taXQgaXQgbGF0ZXIuXG4gICAgICAgICAgcm9vdC5maW5pc2hlZFdvcmsgPSBfZmluaXNoZWRXb3JrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gY29tcGxldGVSb290KHJvb3QsIGZpbmlzaGVkV29yaywgZXhwaXJhdGlvblRpbWUpIHtcbiAgLy8gQ2hlY2sgaWYgdGhlcmUncyBhIGJhdGNoIHRoYXQgbWF0Y2hlcyB0aGlzIGV4cGlyYXRpb24gdGltZS5cbiAgdmFyIGZpcnN0QmF0Y2ggPSByb290LmZpcnN0QmF0Y2g7XG4gIGlmIChmaXJzdEJhdGNoICE9PSBudWxsICYmIGZpcnN0QmF0Y2guX2V4cGlyYXRpb25UaW1lID49IGV4cGlyYXRpb25UaW1lKSB7XG4gICAgaWYgKGNvbXBsZXRlZEJhdGNoZXMgPT09IG51bGwpIHtcbiAgICAgIGNvbXBsZXRlZEJhdGNoZXMgPSBbZmlyc3RCYXRjaF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBsZXRlZEJhdGNoZXMucHVzaChmaXJzdEJhdGNoKTtcbiAgICB9XG4gICAgaWYgKGZpcnN0QmF0Y2guX2RlZmVyKSB7XG4gICAgICAvLyBUaGlzIHJvb3QgaXMgYmxvY2tlZCBmcm9tIGNvbW1pdHRpbmcgYnkgYSBiYXRjaC4gVW5zY2hlZHVsZSBpdCB1bnRpbFxuICAgICAgLy8gd2UgcmVjZWl2ZSBhbm90aGVyIHVwZGF0ZS5cbiAgICAgIHJvb3QuZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrO1xuICAgICAgcm9vdC5leHBpcmF0aW9uVGltZSA9IE5vV29yaztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvLyBDb21taXQgdGhlIHJvb3QuXG4gIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcblxuICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgbmVzdGVkIHVwZGF0ZSAoYSBzeW5jIHVwZGF0ZSBzY2hlZHVsZWQgZHVyaW5nIHRoZVxuICAvLyBjb21taXQgcGhhc2UpLlxuICBpZiAocm9vdCA9PT0gbGFzdENvbW1pdHRlZFJvb3REdXJpbmdUaGlzQmF0Y2gpIHtcbiAgICAvLyBJZiB0aGUgbmV4dCByb290IGlzIHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyByb290LCB0aGlzIGlzIGEgbmVzdGVkXG4gICAgLy8gdXBkYXRlLiBUbyBwcmV2ZW50IGFuIGluZmluaXRlIGxvb3AsIGluY3JlbWVudCB0aGUgbmVzdGVkIHVwZGF0ZSBjb3VudC5cbiAgICBuZXN0ZWRVcGRhdGVDb3VudCsrO1xuICB9IGVsc2Uge1xuICAgIC8vIFJlc2V0IHdoZW5ldmVyIHdlIHN3aXRjaCByb290cy5cbiAgICBsYXN0Q29tbWl0dGVkUm9vdER1cmluZ1RoaXNCYXRjaCA9IHJvb3Q7XG4gICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICB9XG4gIHNjaGVkdWxlci51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHkoc2NoZWR1bGVyLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgY29tbWl0Um9vdChyb290LCBmaW5pc2hlZFdvcmspO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb25VbmNhdWdodEVycm9yKGVycm9yKSB7XG4gICEobmV4dEZsdXNoZWRSb290ICE9PSBudWxsKSA/IGludmFyaWFudChmYWxzZSwgJ1Nob3VsZCBiZSB3b3JraW5nIG9uIGEgcm9vdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKSA6IHZvaWQgMDtcbiAgLy8gVW5zY2hlZHVsZSB0aGlzIHJvb3Qgc28gd2UgZG9uJ3Qgd29yayBvbiBpdCBhZ2FpbiB1bnRpbCB0aGVyZSdzXG4gIC8vIGFub3RoZXIgdXBkYXRlLlxuICBuZXh0Rmx1c2hlZFJvb3QuZXhwaXJhdGlvblRpbWUgPSBOb1dvcms7XG4gIGlmICghaGFzVW5oYW5kbGVkRXJyb3IpIHtcbiAgICBoYXNVbmhhbmRsZWRFcnJvciA9IHRydWU7XG4gICAgdW5oYW5kbGVkRXJyb3IgPSBlcnJvcjtcbiAgfVxufVxuXG4vLyBUT0RPOiBCYXRjaGluZyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYXQgdGhlIHJlbmRlcmVyIGxldmVsLCBub3QgaW5zaWRlXG4vLyB0aGUgcmVjb25jaWxlci5cbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzJDEoZm4sIGEpIHtcbiAgdmFyIHByZXZpb3VzSXNCYXRjaGluZ1VwZGF0ZXMgPSBpc0JhdGNoaW5nVXBkYXRlcztcbiAgaXNCYXRjaGluZ1VwZGF0ZXMgPSB0cnVlO1xuICB0cnkge1xuICAgIHJldHVybiBmbihhKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpc0JhdGNoaW5nVXBkYXRlcyA9IHByZXZpb3VzSXNCYXRjaGluZ1VwZGF0ZXM7XG4gICAgaWYgKCFpc0JhdGNoaW5nVXBkYXRlcyAmJiAhaXNSZW5kZXJpbmcpIHtcbiAgICAgIHBlcmZvcm1TeW5jV29yaygpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUT0RPOiBCYXRjaGluZyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYXQgdGhlIHJlbmRlcmVyIGxldmVsLCBub3QgaW5zaWRlXG4vLyB0aGUgcmVjb25jaWxlci5cbmZ1bmN0aW9uIHVuYmF0Y2hlZFVwZGF0ZXMoZm4sIGEpIHtcbiAgaWYgKGlzQmF0Y2hpbmdVcGRhdGVzICYmICFpc1VuYmF0Y2hpbmdVcGRhdGVzKSB7XG4gICAgaXNVbmJhdGNoaW5nVXBkYXRlcyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmbihhKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaXNVbmJhdGNoaW5nVXBkYXRlcyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZm4oYSk7XG59XG5cbi8vIFRPRE86IEJhdGNoaW5nIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBhdCB0aGUgcmVuZGVyZXIgbGV2ZWwsIG5vdCB3aXRoaW5cbi8vIHRoZSByZWNvbmNpbGVyLlxuZnVuY3Rpb24gZmx1c2hTeW5jKGZuLCBhKSB7XG4gICEhaXNSZW5kZXJpbmcgPyBpbnZhcmlhbnQoZmFsc2UsICdmbHVzaFN5bmMgd2FzIGNhbGxlZCBmcm9tIGluc2lkZSBhIGxpZmVjeWNsZSBtZXRob2QuIEl0IGNhbm5vdCBiZSBjYWxsZWQgd2hlbiBSZWFjdCBpcyBhbHJlYWR5IHJlbmRlcmluZy4nKSA6IHZvaWQgMDtcbiAgdmFyIHByZXZpb3VzSXNCYXRjaGluZ1VwZGF0ZXMgPSBpc0JhdGNoaW5nVXBkYXRlcztcbiAgaXNCYXRjaGluZ1VwZGF0ZXMgPSB0cnVlO1xuICB0cnkge1xuICAgIHJldHVybiBzeW5jVXBkYXRlcyhmbiwgYSk7XG4gIH0gZmluYWxseSB7XG4gICAgaXNCYXRjaGluZ1VwZGF0ZXMgPSBwcmV2aW91c0lzQmF0Y2hpbmdVcGRhdGVzO1xuICAgIHBlcmZvcm1TeW5jV29yaygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludGVyYWN0aXZlVXBkYXRlcyQxKGZuLCBhLCBiKSB7XG4gIC8vIElmIHRoZXJlIGFyZSBhbnkgcGVuZGluZyBpbnRlcmFjdGl2ZSB1cGRhdGVzLCBzeW5jaHJvbm91c2x5IGZsdXNoIHRoZW0uXG4gIC8vIFRoaXMgbmVlZHMgdG8gaGFwcGVuIGJlZm9yZSB3ZSByZWFkIGFueSBoYW5kbGVycywgYmVjYXVzZSB0aGUgZWZmZWN0IG9mXG4gIC8vIHRoZSBwcmV2aW91cyBldmVudCBtYXkgaW5mbHVlbmNlIHdoaWNoIGhhbmRsZXJzIGFyZSBjYWxsZWQgZHVyaW5nXG4gIC8vIHRoaXMgZXZlbnQuXG4gIGlmICghaXNCYXRjaGluZ1VwZGF0ZXMgJiYgIWlzUmVuZGVyaW5nICYmIGxvd2VzdFByaW9yaXR5UGVuZGluZ0ludGVyYWN0aXZlRXhwaXJhdGlvblRpbWUgIT09IE5vV29yaykge1xuICAgIC8vIFN5bmNocm9ub3VzbHkgZmx1c2ggcGVuZGluZyBpbnRlcmFjdGl2ZSB1cGRhdGVzLlxuICAgIHBlcmZvcm1Xb3JrKGxvd2VzdFByaW9yaXR5UGVuZGluZ0ludGVyYWN0aXZlRXhwaXJhdGlvblRpbWUsIGZhbHNlKTtcbiAgICBsb3dlc3RQcmlvcml0eVBlbmRpbmdJbnRlcmFjdGl2ZUV4cGlyYXRpb25UaW1lID0gTm9Xb3JrO1xuICB9XG4gIHZhciBwcmV2aW91c0lzQmF0Y2hpbmdVcGRhdGVzID0gaXNCYXRjaGluZ1VwZGF0ZXM7XG4gIGlzQmF0Y2hpbmdVcGRhdGVzID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gc2NoZWR1bGVyLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eShzY2hlZHVsZXIudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmbihhLCBiKTtcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpc0JhdGNoaW5nVXBkYXRlcyA9IHByZXZpb3VzSXNCYXRjaGluZ1VwZGF0ZXM7XG4gICAgaWYgKCFpc0JhdGNoaW5nVXBkYXRlcyAmJiAhaXNSZW5kZXJpbmcpIHtcbiAgICAgIHBlcmZvcm1TeW5jV29yaygpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaEludGVyYWN0aXZlVXBkYXRlcyQxKCkge1xuICBpZiAoIWlzUmVuZGVyaW5nICYmIGxvd2VzdFByaW9yaXR5UGVuZGluZ0ludGVyYWN0aXZlRXhwaXJhdGlvblRpbWUgIT09IE5vV29yaykge1xuICAgIC8vIFN5bmNocm9ub3VzbHkgZmx1c2ggcGVuZGluZyBpbnRlcmFjdGl2ZSB1cGRhdGVzLlxuICAgIHBlcmZvcm1Xb3JrKGxvd2VzdFByaW9yaXR5UGVuZGluZ0ludGVyYWN0aXZlRXhwaXJhdGlvblRpbWUsIGZhbHNlKTtcbiAgICBsb3dlc3RQcmlvcml0eVBlbmRpbmdJbnRlcmFjdGl2ZUV4cGlyYXRpb25UaW1lID0gTm9Xb3JrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoQ29udHJvbGxlZChmbikge1xuICB2YXIgcHJldmlvdXNJc0JhdGNoaW5nVXBkYXRlcyA9IGlzQmF0Y2hpbmdVcGRhdGVzO1xuICBpc0JhdGNoaW5nVXBkYXRlcyA9IHRydWU7XG4gIHRyeSB7XG4gICAgc3luY1VwZGF0ZXMoZm4pO1xuICB9IGZpbmFsbHkge1xuICAgIGlzQmF0Y2hpbmdVcGRhdGVzID0gcHJldmlvdXNJc0JhdGNoaW5nVXBkYXRlcztcbiAgICBpZiAoIWlzQmF0Y2hpbmdVcGRhdGVzICYmICFpc1JlbmRlcmluZykge1xuICAgICAgcGVyZm9ybVN5bmNXb3JrKCk7XG4gICAgfVxuICB9XG59XG5cbi8vIDAgaXMgUFJPRCwgMSBpcyBERVYuXG4vLyBNaWdodCBhZGQgUFJPRklMRSBsYXRlci5cblxuXG52YXIgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcyA9IHZvaWQgMDtcbnZhciBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZSA9IHZvaWQgMDtcblxue1xuICBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlID0ge307XG59XG5cbmZ1bmN0aW9uIGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCkge1xuICBpZiAoIXBhcmVudENvbXBvbmVudCkge1xuICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQocGFyZW50Q29tcG9uZW50KTtcbiAgdmFyIHBhcmVudENvbnRleHQgPSBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcik7XG5cbiAgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICB2YXIgQ29tcG9uZW50ID0gZmliZXIudHlwZTtcbiAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgcmV0dXJuIHByb2Nlc3NDaGlsZENvbnRleHQoZmliZXIsIENvbXBvbmVudCwgcGFyZW50Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcmVudENvbnRleHQ7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlUm9vdFVwZGF0ZShjdXJyZW50JCQxLCBlbGVtZW50LCBleHBpcmF0aW9uVGltZSwgY2FsbGJhY2spIHtcbiAge1xuICAgIGlmIChwaGFzZSA9PT0gJ3JlbmRlcicgJiYgY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcykge1xuICAgICAgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcyA9IHRydWU7XG4gICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdSZW5kZXIgbWV0aG9kcyBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZTsgJyArICd0cmlnZ2VyaW5nIG5lc3RlZCBjb21wb25lbnQgdXBkYXRlcyBmcm9tIHJlbmRlciBpcyBub3QgYWxsb3dlZC4gJyArICdJZiBuZWNlc3NhcnksIHRyaWdnZXIgbmVzdGVkIHVwZGF0ZXMgaW4gY29tcG9uZW50RGlkVXBkYXRlLlxcblxcbicgKyAnQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgJXMuJywgZ2V0Q29tcG9uZW50TmFtZShjdXJyZW50LnR5cGUpIHx8ICdVbmtub3duJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShleHBpcmF0aW9uVGltZSk7XG4gIC8vIENhdXRpb246IFJlYWN0IERldlRvb2xzIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJvcGVydHlcbiAgLy8gYmVpbmcgY2FsbGVkIFwiZWxlbWVudFwiLlxuICB1cGRhdGUucGF5bG9hZCA9IHsgZWxlbWVudDogZWxlbWVudCB9O1xuXG4gIGNhbGxiYWNrID0gY2FsbGJhY2sgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjaztcbiAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgISh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAncmVuZGVyKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsYmFjaykgOiB2b2lkIDA7XG4gICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gIH1cblxuICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gIGVucXVldWVVcGRhdGUoY3VycmVudCQkMSwgdXBkYXRlKTtcbiAgc2NoZWR1bGVXb3JrKGN1cnJlbnQkJDEsIGV4cGlyYXRpb25UaW1lKTtcblxuICByZXR1cm4gZXhwaXJhdGlvblRpbWU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRhaW5lckF0RXhwaXJhdGlvblRpbWUoZWxlbWVudCwgY29udGFpbmVyLCBwYXJlbnRDb21wb25lbnQsIGV4cGlyYXRpb25UaW1lLCBjYWxsYmFjaykge1xuICAvLyBUT0RPOiBJZiB0aGlzIGlzIGEgbmVzdGVkIGNvbnRhaW5lciwgdGhpcyB3b24ndCBiZSB0aGUgcm9vdC5cbiAgdmFyIGN1cnJlbnQkJDEgPSBjb250YWluZXIuY3VycmVudDtcblxuICB7XG4gICAgaWYgKFJlYWN0RmliZXJJbnN0cnVtZW50YXRpb25fMS5kZWJ1Z1Rvb2wpIHtcbiAgICAgIGlmIChjdXJyZW50JCQxLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICBSZWFjdEZpYmVySW5zdHJ1bWVudGF0aW9uXzEuZGVidWdUb29sLm9uTW91bnRDb250YWluZXIoY29udGFpbmVyKTtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICBSZWFjdEZpYmVySW5zdHJ1bWVudGF0aW9uXzEuZGVidWdUb29sLm9uVW5tb3VudENvbnRhaW5lcihjb250YWluZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgUmVhY3RGaWJlckluc3RydW1lbnRhdGlvbl8xLmRlYnVnVG9vbC5vblVwZGF0ZUNvbnRhaW5lcihjb250YWluZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBjb250ZXh0ID0gZ2V0Q29udGV4dEZvclN1YnRyZWUocGFyZW50Q29tcG9uZW50KTtcbiAgaWYgKGNvbnRhaW5lci5jb250ZXh0ID09PSBudWxsKSB7XG4gICAgY29udGFpbmVyLmNvbnRleHQgPSBjb250ZXh0O1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5wZW5kaW5nQ29udGV4dCA9IGNvbnRleHQ7XG4gIH1cblxuICByZXR1cm4gc2NoZWR1bGVSb290VXBkYXRlKGN1cnJlbnQkJDEsIGVsZW1lbnQsIGV4cGlyYXRpb25UaW1lLCBjYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2UoY29tcG9uZW50KSB7XG4gIHZhciBmaWJlciA9IGdldChjb21wb25lbnQpO1xuICBpZiAoZmliZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2YgY29tcG9uZW50LnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW52YXJpYW50KGZhbHNlLCAnVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnZhcmlhbnQoZmFsc2UsICdBcmd1bWVudCBhcHBlYXJzIHRvIG5vdCBiZSBhIFJlYWN0Q29tcG9uZW50LiBLZXlzOiAlcycsIE9iamVjdC5rZXlzKGNvbXBvbmVudCkpO1xuICAgIH1cbiAgfVxuICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXIoZmliZXIpO1xuICBpZiAoaG9zdEZpYmVyID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VXaXRoV2FybmluZyhjb21wb25lbnQsIG1ldGhvZE5hbWUpIHtcbiAge1xuICAgIHZhciBmaWJlciA9IGdldChjb21wb25lbnQpO1xuICAgIGlmIChmaWJlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW52YXJpYW50KGZhbHNlLCAnVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW52YXJpYW50KGZhbHNlLCAnQXJndW1lbnQgYXBwZWFycyB0byBub3QgYmUgYSBSZWFjdENvbXBvbmVudC4gS2V5czogJXMnLCBPYmplY3Qua2V5cyhjb21wb25lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGhvc3RGaWJlciA9IGZpbmRDdXJyZW50SG9zdEZpYmVyKGZpYmVyKTtcbiAgICBpZiAoaG9zdEZpYmVyID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGhvc3RGaWJlci5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnO1xuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZVtjb21wb25lbnROYW1lXSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZVtjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzIGlzIGRlcHJlY2F0ZWQgaW4gU3RyaWN0TW9kZS4gJyArICclcyB3YXMgcGFzc2VkIGFuIGluc3RhbmNlIG9mICVzIHdoaWNoIGlzIGluc2lkZSBTdHJpY3RNb2RlLiAnICsgJ0luc3RlYWQsIGFkZCBhIHJlZiBkaXJlY3RseSB0byB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byByZWZlcmVuY2UuJyArICdcXG4lcycgKyAnXFxuXFxuTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOicgKyAnXFxuaHR0cHM6Ly9mYi5tZS9yZWFjdC1zdHJpY3QtbW9kZS1maW5kLW5vZGUnLCBtZXRob2ROYW1lLCBtZXRob2ROYW1lLCBjb21wb25lbnROYW1lLCBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2QoaG9zdEZpYmVyKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnJXMgaXMgZGVwcmVjYXRlZCBpbiBTdHJpY3RNb2RlLiAnICsgJyVzIHdhcyBwYXNzZWQgYW4gaW5zdGFuY2Ugb2YgJXMgd2hpY2ggcmVuZGVycyBTdHJpY3RNb2RlIGNoaWxkcmVuLiAnICsgJ0luc3RlYWQsIGFkZCBhIHJlZiBkaXJlY3RseSB0byB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byByZWZlcmVuY2UuJyArICdcXG4lcycgKyAnXFxuXFxuTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOicgKyAnXFxuaHR0cHM6Ly9mYi5tZS9yZWFjdC1zdHJpY3QtbW9kZS1maW5kLW5vZGUnLCBtZXRob2ROYW1lLCBtZXRob2ROYW1lLCBjb21wb25lbnROYW1lLCBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2QoaG9zdEZpYmVyKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG4gIH1cbiAgcmV0dXJuIGZpbmRIb3N0SW5zdGFuY2UoY29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lckluZm8sIGlzQ29uY3VycmVudCwgaHlkcmF0ZSkge1xuICByZXR1cm4gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIGlzQ29uY3VycmVudCwgaHlkcmF0ZSk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRhaW5lcihlbGVtZW50LCBjb250YWluZXIsIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2spIHtcbiAgdmFyIGN1cnJlbnQkJDEgPSBjb250YWluZXIuY3VycmVudDtcbiAgdmFyIGN1cnJlbnRUaW1lID0gcmVxdWVzdEN1cnJlbnRUaW1lKCk7XG4gIHZhciBleHBpcmF0aW9uVGltZSA9IGNvbXB1dGVFeHBpcmF0aW9uRm9yRmliZXIoY3VycmVudFRpbWUsIGN1cnJlbnQkJDEpO1xuICByZXR1cm4gdXBkYXRlQ29udGFpbmVyQXRFeHBpcmF0aW9uVGltZShlbGVtZW50LCBjb250YWluZXIsIHBhcmVudENvbXBvbmVudCwgZXhwaXJhdGlvblRpbWUsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gZ2V0UHVibGljUm9vdEluc3RhbmNlKGNvbnRhaW5lcikge1xuICB2YXIgY29udGFpbmVyRmliZXIgPSBjb250YWluZXIuY3VycmVudDtcbiAgaWYgKCFjb250YWluZXJGaWJlci5jaGlsZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHN3aXRjaCAoY29udGFpbmVyRmliZXIuY2hpbGQudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGdldFB1YmxpY0luc3RhbmNlKGNvbnRhaW5lckZpYmVyLmNoaWxkLnN0YXRlTm9kZSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBjb250YWluZXJGaWJlci5jaGlsZC5zdGF0ZU5vZGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZVdpdGhOb1BvcnRhbHMoZmliZXIpIHtcbiAgdmFyIGhvc3RGaWJlciA9IGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFscyhmaWJlcik7XG4gIGlmIChob3N0RmliZXIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gaG9zdEZpYmVyLnN0YXRlTm9kZTtcbn1cblxudmFyIG92ZXJyaWRlUHJvcHMgPSBudWxsO1xuXG57XG4gIHZhciBjb3B5V2l0aFNldEltcGwgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCBpZHgsIHZhbHVlKSB7XG4gICAgaWYgKGlkeCA+PSBwYXRoLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICB2YXIga2V5ID0gcGF0aFtpZHhdO1xuICAgIHZhciB1cGRhdGVkID0gQXJyYXkuaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBfYXNzaWduKHt9LCBvYmopO1xuICAgIC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcbiAgICB1cGRhdGVkW2tleV0gPSBjb3B5V2l0aFNldEltcGwob2JqW2tleV0sIHBhdGgsIGlkeCArIDEsIHZhbHVlKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhTZXQgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCB2YWx1ZSkge1xuICAgIHJldHVybiBjb3B5V2l0aFNldEltcGwob2JqLCBwYXRoLCAwLCB2YWx1ZSk7XG4gIH07XG5cbiAgLy8gU3VwcG9ydCBEZXZUb29scyBwcm9wcyBmb3IgZnVuY3Rpb24gY29tcG9uZW50cywgZm9yd2FyZFJlZiwgbWVtbywgaG9zdCBjb21wb25lbnRzLCBldGMuXG4gIG92ZXJyaWRlUHJvcHMgPSBmdW5jdGlvbiAoZmliZXIsIHBhdGgsIHZhbHVlKSB7XG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IGNvcHlXaXRoU2V0KGZpYmVyLm1lbW9pemVkUHJvcHMsIHBhdGgsIHZhbHVlKTtcbiAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgICBmaWJlci5hbHRlcm5hdGUucGVuZGluZ1Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgIH1cbiAgICBzY2hlZHVsZVdvcmsoZmliZXIsIFN5bmMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBpbmplY3RJbnRvRGV2VG9vbHMoZGV2VG9vbHNDb25maWcpIHtcbiAgdmFyIGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlID0gZGV2VG9vbHNDb25maWcuZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U7XG4gIHZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcblxuXG4gIHJldHVybiBpbmplY3RJbnRlcm5hbHMoX2Fzc2lnbih7fSwgZGV2VG9vbHNDb25maWcsIHtcbiAgICBvdmVycmlkZVByb3BzOiBvdmVycmlkZVByb3BzLFxuICAgIGN1cnJlbnREaXNwYXRjaGVyUmVmOiBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICAgIGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyOiBmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcihmaWJlcik7XG4gICAgICBpZiAoaG9zdEZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG4gICAgfSxcbiAgICBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTogZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgICBpZiAoIWZpbmRGaWJlckJ5SG9zdEluc3RhbmNlKSB7XG4gICAgICAgIC8vIE1pZ2h0IG5vdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgcmVuZGVyZXIuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlKGluc3RhbmNlKTtcbiAgICB9XG4gIH0pKTtcbn1cblxuLy8gVGhpcyBmaWxlIGludGVudGlvbmFsbHkgZG9lcyAqbm90KiBoYXZlIHRoZSBGbG93IGFubm90YXRpb24uXG4vLyBEb24ndCBhZGQgaXQuIFNlZSBgLi9pbmxpbmUtdHlwZWQuanNgIGZvciBhbiBleHBsYW5hdGlvbi5cblxuZnVuY3Rpb24gY3JlYXRlUG9ydGFsJDEoY2hpbGRyZW4sIGNvbnRhaW5lckluZm8sXG4vLyBUT0RPOiBmaWd1cmUgb3V0IHRoZSBBUEkgZm9yIGNyb3NzLXJlbmRlcmVyIGltcGxlbWVudGF0aW9uLlxuaW1wbGVtZW50YXRpb24pIHtcbiAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbnVsbDtcblxuICByZXR1cm4ge1xuICAgIC8vIFRoaXMgdGFnIGFsbG93IHVzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgYXMgYSBSZWFjdCBQb3J0YWxcbiAgICAkJHR5cGVvZjogUkVBQ1RfUE9SVEFMX1RZUEUsXG4gICAga2V5OiBrZXkgPT0gbnVsbCA/IG51bGwgOiAnJyArIGtleSxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4sXG4gICAgY29udGFpbmVySW5mbzogY29udGFpbmVySW5mbyxcbiAgICBpbXBsZW1lbnRhdGlvbjogaW1wbGVtZW50YXRpb25cbiAgfTtcbn1cblxuLy8gVE9ETzogdGhpcyBpcyBzcGVjaWFsIGJlY2F1c2UgaXQgZ2V0cyBpbXBvcnRlZCBkdXJpbmcgYnVpbGQuXG5cbnZhciBSZWFjdFZlcnNpb24gPSAnMTYuOC42JztcblxuLy8gVE9ETzogVGhpcyB0eXBlIGlzIHNoYXJlZCBiZXR3ZWVuIHRoZSByZWNvbmNpbGVyIGFuZCBSZWFjdERPTSwgYnV0IHdpbGxcbi8vIGV2ZW50dWFsbHkgYmUgbGlmdGVkIG91dCB0byB0aGUgcmVuZGVyZXIuXG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xuXG52YXIgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncyA9IHZvaWQgMDtcbnZhciB3YXJuT25JbnZhbGlkQ2FsbGJhY2sgPSB2b2lkIDA7XG52YXIgZGlkV2FybkFib3V0VW5zdGFibGVDcmVhdGVQb3J0YWwgPSBmYWxzZTtcblxue1xuICBpZiAodHlwZW9mIE1hcCAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAvLyAkRmxvd0lzc3VlIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIE1hcCBoYXMgbm8gcHJvdG90eXBlXG4gIE1hcC5wcm90b3R5cGUgPT0gbnVsbCB8fCB0eXBlb2YgTWFwLnByb3RvdHlwZS5mb3JFYWNoICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBTZXQgIT09ICdmdW5jdGlvbicgfHxcbiAgLy8gJEZsb3dJc3N1ZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBTZXQgaGFzIG5vIHByb3RvdHlwZVxuICBTZXQucHJvdG90eXBlID09IG51bGwgfHwgdHlwZW9mIFNldC5wcm90b3R5cGUuY2xlYXIgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIFNldC5wcm90b3R5cGUuZm9yRWFjaCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1JlYWN0IGRlcGVuZHMgb24gTWFwIGFuZCBTZXQgYnVpbHQtaW4gdHlwZXMuIE1ha2Ugc3VyZSB0aGF0IHlvdSBsb2FkIGEgJyArICdwb2x5ZmlsbCBpbiBvbGRlciBicm93c2Vycy4gaHR0cHM6Ly9mYi5tZS9yZWFjdC1wb2x5ZmlsbHMnKTtcbiAgfVxuXG4gIHRvcExldmVsVXBkYXRlV2FybmluZ3MgPSBmdW5jdGlvbiAoY29udGFpbmVyKSB7XG4gICAgaWYgKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyICYmIGNvbnRhaW5lci5ub2RlVHlwZSAhPT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgaG9zdEluc3RhbmNlID0gZmluZEhvc3RJbnN0YW5jZVdpdGhOb1BvcnRhbHMoY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdC5jdXJyZW50KTtcbiAgICAgIGlmIChob3N0SW5zdGFuY2UpIHtcbiAgICAgICAgIShob3N0SW5zdGFuY2UucGFyZW50Tm9kZSA9PT0gY29udGFpbmVyKSA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ3JlbmRlciguLi4pOiBJdCBsb29rcyBsaWtlIHRoZSBSZWFjdC1yZW5kZXJlZCBjb250ZW50IG9mIHRoaXMgJyArICdjb250YWluZXIgd2FzIHJlbW92ZWQgd2l0aG91dCB1c2luZyBSZWFjdC4gVGhpcyBpcyBub3QgJyArICdzdXBwb3J0ZWQgYW5kIHdpbGwgY2F1c2UgZXJyb3JzLiBJbnN0ZWFkLCBjYWxsICcgKyAnUmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZSB0byBlbXB0eSBhIGNvbnRhaW5lci4nKSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaXNSb290UmVuZGVyZWRCeVNvbWVSZWFjdCA9ICEhY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXI7XG4gICAgdmFyIHJvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICAgIHZhciBoYXNOb25Sb290UmVhY3RDaGlsZCA9ICEhKHJvb3RFbCAmJiBnZXRJbnN0YW5jZUZyb21Ob2RlJDEocm9vdEVsKSk7XG5cbiAgICAhKCFoYXNOb25Sb290UmVhY3RDaGlsZCB8fCBpc1Jvb3RSZW5kZXJlZEJ5U29tZVJlYWN0KSA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ3JlbmRlciguLi4pOiBSZXBsYWNpbmcgUmVhY3QtcmVuZGVyZWQgY2hpbGRyZW4gd2l0aCBhIG5ldyByb290ICcgKyAnY29tcG9uZW50LiBJZiB5b3UgaW50ZW5kZWQgdG8gdXBkYXRlIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUsICcgKyAneW91IHNob3VsZCBpbnN0ZWFkIGhhdmUgdGhlIGV4aXN0aW5nIGNoaWxkcmVuIHVwZGF0ZSB0aGVpciBzdGF0ZSAnICsgJ2FuZCByZW5kZXIgdGhlIG5ldyBjb21wb25lbnRzIGluc3RlYWQgb2YgY2FsbGluZyBSZWFjdERPTS5yZW5kZXIuJykgOiB2b2lkIDA7XG5cbiAgICAhKGNvbnRhaW5lci5ub2RlVHlwZSAhPT0gRUxFTUVOVF9OT0RFIHx8ICFjb250YWluZXIudGFnTmFtZSB8fCBjb250YWluZXIudGFnTmFtZS50b1VwcGVyQ2FzZSgpICE9PSAnQk9EWScpID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAncmVuZGVyKCk6IFJlbmRlcmluZyBjb21wb25lbnRzIGRpcmVjdGx5IGludG8gZG9jdW1lbnQuYm9keSBpcyAnICsgJ2Rpc2NvdXJhZ2VkLCBzaW5jZSBpdHMgY2hpbGRyZW4gYXJlIG9mdGVuIG1hbmlwdWxhdGVkIGJ5IHRoaXJkLXBhcnR5ICcgKyAnc2NyaXB0cyBhbmQgYnJvd3NlciBleHRlbnNpb25zLiBUaGlzIG1heSBsZWFkIHRvIHN1YnRsZSAnICsgJ3JlY29uY2lsaWF0aW9uIGlzc3Vlcy4gVHJ5IHJlbmRlcmluZyBpbnRvIGEgY29udGFpbmVyIGVsZW1lbnQgY3JlYXRlZCAnICsgJ2ZvciB5b3VyIGFwcC4nKSA6IHZvaWQgMDtcbiAgfTtcblxuICB3YXJuT25JbnZhbGlkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICAhKGNhbGxiYWNrID09PSBudWxsIHx8IHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICclcyguLi4pOiBFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGVyTmFtZSwgY2FsbGJhY2spIDogdm9pZCAwO1xuICB9O1xufVxuXG5zZXRSZXN0b3JlSW1wbGVtZW50YXRpb24ocmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQxKTtcblxuZnVuY3Rpb24gUmVhY3RCYXRjaChyb290KSB7XG4gIHZhciBleHBpcmF0aW9uVGltZSA9IGNvbXB1dGVVbmlxdWVBc3luY0V4cGlyYXRpb24oKTtcbiAgdGhpcy5fZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTtcbiAgdGhpcy5fcm9vdCA9IHJvb3Q7XG4gIHRoaXMuX25leHQgPSBudWxsO1xuICB0aGlzLl9jYWxsYmFja3MgPSBudWxsO1xuICB0aGlzLl9kaWRDb21wbGV0ZSA9IGZhbHNlO1xuICB0aGlzLl9oYXNDaGlsZHJlbiA9IGZhbHNlO1xuICB0aGlzLl9jaGlsZHJlbiA9IG51bGw7XG4gIHRoaXMuX2RlZmVyID0gdHJ1ZTtcbn1cblJlYWN0QmF0Y2gucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIChjaGlsZHJlbikge1xuICAhdGhpcy5fZGVmZXIgPyBpbnZhcmlhbnQoZmFsc2UsICdiYXRjaC5yZW5kZXI6IENhbm5vdCByZW5kZXIgYSBiYXRjaCB0aGF0IGFscmVhZHkgY29tbWl0dGVkLicpIDogdm9pZCAwO1xuICB0aGlzLl9oYXNDaGlsZHJlbiA9IHRydWU7XG4gIHRoaXMuX2NoaWxkcmVuID0gY2hpbGRyZW47XG4gIHZhciBpbnRlcm5hbFJvb3QgPSB0aGlzLl9yb290Ll9pbnRlcm5hbFJvb3Q7XG4gIHZhciBleHBpcmF0aW9uVGltZSA9IHRoaXMuX2V4cGlyYXRpb25UaW1lO1xuICB2YXIgd29yayA9IG5ldyBSZWFjdFdvcmsoKTtcbiAgdXBkYXRlQ29udGFpbmVyQXRFeHBpcmF0aW9uVGltZShjaGlsZHJlbiwgaW50ZXJuYWxSb290LCBudWxsLCBleHBpcmF0aW9uVGltZSwgd29yay5fb25Db21taXQpO1xuICByZXR1cm4gd29yaztcbn07XG5SZWFjdEJhdGNoLnByb3RvdHlwZS50aGVuID0gZnVuY3Rpb24gKG9uQ29tcGxldGUpIHtcbiAgaWYgKHRoaXMuX2RpZENvbXBsZXRlKSB7XG4gICAgb25Db21wbGV0ZSgpO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzO1xuICBpZiAoY2FsbGJhY2tzID09PSBudWxsKSB7XG4gICAgY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzID0gW107XG4gIH1cbiAgY2FsbGJhY2tzLnB1c2gob25Db21wbGV0ZSk7XG59O1xuUmVhY3RCYXRjaC5wcm90b3R5cGUuY29tbWl0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaW50ZXJuYWxSb290ID0gdGhpcy5fcm9vdC5faW50ZXJuYWxSb290O1xuICB2YXIgZmlyc3RCYXRjaCA9IGludGVybmFsUm9vdC5maXJzdEJhdGNoO1xuICAhKHRoaXMuX2RlZmVyICYmIGZpcnN0QmF0Y2ggIT09IG51bGwpID8gaW52YXJpYW50KGZhbHNlLCAnYmF0Y2guY29tbWl0OiBDYW5ub3QgY29tbWl0IGEgYmF0Y2ggbXVsdGlwbGUgdGltZXMuJykgOiB2b2lkIDA7XG5cbiAgaWYgKCF0aGlzLl9oYXNDaGlsZHJlbikge1xuICAgIC8vIFRoaXMgYmF0Y2ggaXMgZW1wdHkuIFJldHVybi5cbiAgICB0aGlzLl9uZXh0ID0gbnVsbDtcbiAgICB0aGlzLl9kZWZlciA9IGZhbHNlO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBleHBpcmF0aW9uVGltZSA9IHRoaXMuX2V4cGlyYXRpb25UaW1lO1xuXG4gIC8vIEVuc3VyZSB0aGlzIGlzIHRoZSBmaXJzdCBiYXRjaCBpbiB0aGUgbGlzdC5cbiAgaWYgKGZpcnN0QmF0Y2ggIT09IHRoaXMpIHtcbiAgICAvLyBUaGlzIGJhdGNoIGlzIG5vdCB0aGUgZWFybGllc3QgYmF0Y2guIFdlIG5lZWQgdG8gbW92ZSBpdCB0byB0aGUgZnJvbnQuXG4gICAgLy8gVXBkYXRlIGl0cyBleHBpcmF0aW9uIHRpbWUgdG8gYmUgdGhlIGV4cGlyYXRpb24gdGltZSBvZiB0aGUgZWFybGllc3RcbiAgICAvLyBiYXRjaCwgc28gdGhhdCB3ZSBjYW4gZmx1c2ggaXQgd2l0aG91dCBmbHVzaGluZyB0aGUgb3RoZXIgYmF0Y2hlcy5cbiAgICBpZiAodGhpcy5faGFzQ2hpbGRyZW4pIHtcbiAgICAgIGV4cGlyYXRpb25UaW1lID0gdGhpcy5fZXhwaXJhdGlvblRpbWUgPSBmaXJzdEJhdGNoLl9leHBpcmF0aW9uVGltZTtcbiAgICAgIC8vIFJlbmRlcmluZyB0aGlzIGJhdGNoIGFnYWluIGVuc3VyZXMgaXRzIGNoaWxkcmVuIHdpbGwgYmUgdGhlIGZpbmFsIHN0YXRlXG4gICAgICAvLyB3aGVuIHdlIGZsdXNoICh1cGRhdGVzIGFyZSBwcm9jZXNzZWQgaW4gaW5zZXJ0aW9uIG9yZGVyOiBsYXN0XG4gICAgICAvLyB1cGRhdGUgd2lucykuXG4gICAgICAvLyBUT0RPOiBUaGlzIGZvcmNlcyBhIHJlc3RhcnQuIFNob3VsZCB3ZSBwcmludCBhIHdhcm5pbmc/XG4gICAgICB0aGlzLnJlbmRlcih0aGlzLl9jaGlsZHJlbik7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRoZSBiYXRjaCBmcm9tIHRoZSBsaXN0LlxuICAgIHZhciBwcmV2aW91cyA9IG51bGw7XG4gICAgdmFyIGJhdGNoID0gZmlyc3RCYXRjaDtcbiAgICB3aGlsZSAoYmF0Y2ggIT09IHRoaXMpIHtcbiAgICAgIHByZXZpb3VzID0gYmF0Y2g7XG4gICAgICBiYXRjaCA9IGJhdGNoLl9uZXh0O1xuICAgIH1cbiAgICAhKHByZXZpb3VzICE9PSBudWxsKSA/IGludmFyaWFudChmYWxzZSwgJ2JhdGNoLmNvbW1pdDogQ2Fubm90IGNvbW1pdCBhIGJhdGNoIG11bHRpcGxlIHRpbWVzLicpIDogdm9pZCAwO1xuICAgIHByZXZpb3VzLl9uZXh0ID0gYmF0Y2guX25leHQ7XG5cbiAgICAvLyBBZGQgaXQgdG8gdGhlIGZyb250LlxuICAgIHRoaXMuX25leHQgPSBmaXJzdEJhdGNoO1xuICAgIGZpcnN0QmF0Y2ggPSBpbnRlcm5hbFJvb3QuZmlyc3RCYXRjaCA9IHRoaXM7XG4gIH1cblxuICAvLyBTeW5jaHJvbm91c2x5IGZsdXNoIGFsbCB0aGUgd29yayB1cCB0byB0aGlzIGJhdGNoJ3MgZXhwaXJhdGlvbiB0aW1lLlxuICB0aGlzLl9kZWZlciA9IGZhbHNlO1xuICBmbHVzaFJvb3QoaW50ZXJuYWxSb290LCBleHBpcmF0aW9uVGltZSk7XG5cbiAgLy8gUG9wIHRoZSBiYXRjaCBmcm9tIHRoZSBsaXN0LlxuICB2YXIgbmV4dCA9IHRoaXMuX25leHQ7XG4gIHRoaXMuX25leHQgPSBudWxsO1xuICBmaXJzdEJhdGNoID0gaW50ZXJuYWxSb290LmZpcnN0QmF0Y2ggPSBuZXh0O1xuXG4gIC8vIEFwcGVuZCB0aGUgbmV4dCBlYXJsaWVzdCBiYXRjaCdzIGNoaWxkcmVuIHRvIHRoZSB1cGRhdGUgcXVldWUuXG4gIGlmIChmaXJzdEJhdGNoICE9PSBudWxsICYmIGZpcnN0QmF0Y2guX2hhc0NoaWxkcmVuKSB7XG4gICAgZmlyc3RCYXRjaC5yZW5kZXIoZmlyc3RCYXRjaC5fY2hpbGRyZW4pO1xuICB9XG59O1xuUmVhY3RCYXRjaC5wcm90b3R5cGUuX29uQ29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLl9kaWRDb21wbGV0ZSkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLl9kaWRDb21wbGV0ZSA9IHRydWU7XG4gIHZhciBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3M7XG4gIGlmIChjYWxsYmFja3MgPT09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gVE9ETzogRXJyb3IgaGFuZGxpbmcuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9jYWxsYmFjayA9IGNhbGxiYWNrc1tpXTtcbiAgICBfY2FsbGJhY2soKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gUmVhY3RXb3JrKCkge1xuICB0aGlzLl9jYWxsYmFja3MgPSBudWxsO1xuICB0aGlzLl9kaWRDb21taXQgPSBmYWxzZTtcbiAgLy8gVE9ETzogQXZvaWQgbmVlZCB0byBiaW5kIGJ5IHJlcGxhY2luZyBjYWxsYmFja3MgaW4gdGhlIHVwZGF0ZSBxdWV1ZSB3aXRoXG4gIC8vIGxpc3Qgb2YgV29yayBvYmplY3RzLlxuICB0aGlzLl9vbkNvbW1pdCA9IHRoaXMuX29uQ29tbWl0LmJpbmQodGhpcyk7XG59XG5SZWFjdFdvcmsucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbiAob25Db21taXQpIHtcbiAgaWYgKHRoaXMuX2RpZENvbW1pdCkge1xuICAgIG9uQ29tbWl0KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3M7XG4gIGlmIChjYWxsYmFja3MgPT09IG51bGwpIHtcbiAgICBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgPSBbXTtcbiAgfVxuICBjYWxsYmFja3MucHVzaChvbkNvbW1pdCk7XG59O1xuUmVhY3RXb3JrLnByb3RvdHlwZS5fb25Db21taXQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLl9kaWRDb21taXQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5fZGlkQ29tbWl0ID0gdHJ1ZTtcbiAgdmFyIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcztcbiAgaWYgKGNhbGxiYWNrcyA9PT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBUT0RPOiBFcnJvciBoYW5kbGluZy5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgX2NhbGxiYWNrMiA9IGNhbGxiYWNrc1tpXTtcbiAgICAhKHR5cGVvZiBfY2FsbGJhY2syID09PSAnZnVuY3Rpb24nKSA/IGludmFyaWFudChmYWxzZSwgJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIGFzIGNhbGxiYWNrLiBFeHBlY3RlZCBhIGZ1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcycsIF9jYWxsYmFjazIpIDogdm9pZCAwO1xuICAgIF9jYWxsYmFjazIoKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gUmVhY3RSb290KGNvbnRhaW5lciwgaXNDb25jdXJyZW50LCBoeWRyYXRlKSB7XG4gIHZhciByb290ID0gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lciwgaXNDb25jdXJyZW50LCBoeWRyYXRlKTtcbiAgdGhpcy5faW50ZXJuYWxSb290ID0gcm9vdDtcbn1cblJlYWN0Um9vdC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKGNoaWxkcmVuLCBjYWxsYmFjaykge1xuICB2YXIgcm9vdCA9IHRoaXMuX2ludGVybmFsUm9vdDtcbiAgdmFyIHdvcmsgPSBuZXcgUmVhY3RXb3JrKCk7XG4gIGNhbGxiYWNrID0gY2FsbGJhY2sgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjaztcbiAge1xuICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjaywgJ3JlbmRlcicpO1xuICB9XG4gIGlmIChjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgIHdvcmsudGhlbihjYWxsYmFjayk7XG4gIH1cbiAgdXBkYXRlQ29udGFpbmVyKGNoaWxkcmVuLCByb290LCBudWxsLCB3b3JrLl9vbkNvbW1pdCk7XG4gIHJldHVybiB3b3JrO1xufTtcblJlYWN0Um9vdC5wcm90b3R5cGUudW5tb3VudCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB2YXIgcm9vdCA9IHRoaXMuX2ludGVybmFsUm9vdDtcbiAgdmFyIHdvcmsgPSBuZXcgUmVhY3RXb3JrKCk7XG4gIGNhbGxiYWNrID0gY2FsbGJhY2sgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjaztcbiAge1xuICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjaywgJ3JlbmRlcicpO1xuICB9XG4gIGlmIChjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgIHdvcmsudGhlbihjYWxsYmFjayk7XG4gIH1cbiAgdXBkYXRlQ29udGFpbmVyKG51bGwsIHJvb3QsIG51bGwsIHdvcmsuX29uQ29tbWl0KTtcbiAgcmV0dXJuIHdvcms7XG59O1xuUmVhY3RSb290LnByb3RvdHlwZS5sZWdhY3lfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIgPSBmdW5jdGlvbiAocGFyZW50Q29tcG9uZW50LCBjaGlsZHJlbiwgY2FsbGJhY2spIHtcbiAgdmFyIHJvb3QgPSB0aGlzLl9pbnRlcm5hbFJvb3Q7XG4gIHZhciB3b3JrID0gbmV3IFJlYWN0V29yaygpO1xuICBjYWxsYmFjayA9IGNhbGxiYWNrID09PSB1bmRlZmluZWQgPyBudWxsIDogY2FsbGJhY2s7XG4gIHtcbiAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdyZW5kZXInKTtcbiAgfVxuICBpZiAoY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICB3b3JrLnRoZW4oY2FsbGJhY2spO1xuICB9XG4gIHVwZGF0ZUNvbnRhaW5lcihjaGlsZHJlbiwgcm9vdCwgcGFyZW50Q29tcG9uZW50LCB3b3JrLl9vbkNvbW1pdCk7XG4gIHJldHVybiB3b3JrO1xufTtcblJlYWN0Um9vdC5wcm90b3R5cGUuY3JlYXRlQmF0Y2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBiYXRjaCA9IG5ldyBSZWFjdEJhdGNoKHRoaXMpO1xuICB2YXIgZXhwaXJhdGlvblRpbWUgPSBiYXRjaC5fZXhwaXJhdGlvblRpbWU7XG5cbiAgdmFyIGludGVybmFsUm9vdCA9IHRoaXMuX2ludGVybmFsUm9vdDtcbiAgdmFyIGZpcnN0QmF0Y2ggPSBpbnRlcm5hbFJvb3QuZmlyc3RCYXRjaDtcbiAgaWYgKGZpcnN0QmF0Y2ggPT09IG51bGwpIHtcbiAgICBpbnRlcm5hbFJvb3QuZmlyc3RCYXRjaCA9IGJhdGNoO1xuICAgIGJhdGNoLl9uZXh0ID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICAvLyBJbnNlcnQgc29ydGVkIGJ5IGV4cGlyYXRpb24gdGltZSB0aGVuIGluc2VydGlvbiBvcmRlclxuICAgIHZhciBpbnNlcnRBZnRlciA9IG51bGw7XG4gICAgdmFyIGluc2VydEJlZm9yZSA9IGZpcnN0QmF0Y2g7XG4gICAgd2hpbGUgKGluc2VydEJlZm9yZSAhPT0gbnVsbCAmJiBpbnNlcnRCZWZvcmUuX2V4cGlyYXRpb25UaW1lID49IGV4cGlyYXRpb25UaW1lKSB7XG4gICAgICBpbnNlcnRBZnRlciA9IGluc2VydEJlZm9yZTtcbiAgICAgIGluc2VydEJlZm9yZSA9IGluc2VydEJlZm9yZS5fbmV4dDtcbiAgICB9XG4gICAgYmF0Y2guX25leHQgPSBpbnNlcnRCZWZvcmU7XG4gICAgaWYgKGluc2VydEFmdGVyICE9PSBudWxsKSB7XG4gICAgICBpbnNlcnRBZnRlci5fbmV4dCA9IGJhdGNoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYXRjaDtcbn07XG5cbi8qKlxuICogVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgRE9NIG5vZGUgaXMgYSB2YWxpZCBub2RlIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHs/RE9NRWxlbWVudH0gbm9kZSBUaGUgY2FuZGlkYXRlIERPTSBub2RlLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgRE9NIGlzIGEgdmFsaWQgRE9NIG5vZGUuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZENvbnRhaW5lcihub2RlKSB7XG4gIHJldHVybiAhIShub2RlICYmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gJyByZWFjdC1tb3VudC1wb2ludC11bnN0YWJsZSAnKSk7XG59XG5cbmZ1bmN0aW9uIGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgaWYgKCFjb250YWluZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUpIHtcbiAgICByZXR1cm4gY29udGFpbmVyLmRvY3VtZW50RWxlbWVudDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkSHlkcmF0ZUR1ZVRvTGVnYWN5SGV1cmlzdGljKGNvbnRhaW5lcikge1xuICB2YXIgcm9vdEVsZW1lbnQgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgcmV0dXJuICEhKHJvb3RFbGVtZW50ICYmIHJvb3RFbGVtZW50Lm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiYgcm9vdEVsZW1lbnQuaGFzQXR0cmlidXRlKFJPT1RfQVRUUklCVVRFX05BTUUpKTtcbn1cblxuc2V0QmF0Y2hpbmdJbXBsZW1lbnRhdGlvbihiYXRjaGVkVXBkYXRlcyQxLCBpbnRlcmFjdGl2ZVVwZGF0ZXMkMSwgZmx1c2hJbnRlcmFjdGl2ZVVwZGF0ZXMkMSk7XG5cbnZhciB3YXJuZWRBYm91dEh5ZHJhdGVBUEkgPSBmYWxzZTtcblxuZnVuY3Rpb24gbGVnYWN5Q3JlYXRlUm9vdEZyb21ET01Db250YWluZXIoY29udGFpbmVyLCBmb3JjZUh5ZHJhdGUpIHtcbiAgdmFyIHNob3VsZEh5ZHJhdGUgPSBmb3JjZUh5ZHJhdGUgfHwgc2hvdWxkSHlkcmF0ZUR1ZVRvTGVnYWN5SGV1cmlzdGljKGNvbnRhaW5lcik7XG4gIC8vIEZpcnN0IGNsZWFyIGFueSBleGlzdGluZyBjb250ZW50LlxuICBpZiAoIXNob3VsZEh5ZHJhdGUpIHtcbiAgICB2YXIgd2FybmVkID0gZmFsc2U7XG4gICAgdmFyIHJvb3RTaWJsaW5nID0gdm9pZCAwO1xuICAgIHdoaWxlIChyb290U2libGluZyA9IGNvbnRhaW5lci5sYXN0Q2hpbGQpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCF3YXJuZWQgJiYgcm9vdFNpYmxpbmcubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiByb290U2libGluZy5oYXNBdHRyaWJ1dGUoUk9PVF9BVFRSSUJVVEVfTkFNRSkpIHtcbiAgICAgICAgICB3YXJuZWQgPSB0cnVlO1xuICAgICAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ3JlbmRlcigpOiBUYXJnZXQgbm9kZSBoYXMgbWFya3VwIHJlbmRlcmVkIGJ5IFJlYWN0LCBidXQgdGhlcmUgJyArICdhcmUgdW5yZWxhdGVkIG5vZGVzIGFzIHdlbGwuIFRoaXMgaXMgbW9zdCBjb21tb25seSBjYXVzZWQgYnkgJyArICd3aGl0ZS1zcGFjZSBpbnNlcnRlZCBhcm91bmQgc2VydmVyLXJlbmRlcmVkIG1hcmt1cC4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKHJvb3RTaWJsaW5nKTtcbiAgICB9XG4gIH1cbiAge1xuICAgIGlmIChzaG91bGRIeWRyYXRlICYmICFmb3JjZUh5ZHJhdGUgJiYgIXdhcm5lZEFib3V0SHlkcmF0ZUFQSSkge1xuICAgICAgd2FybmVkQWJvdXRIeWRyYXRlQVBJID0gdHJ1ZTtcbiAgICAgIGxvd1ByaW9yaXR5V2FybmluZyQxKGZhbHNlLCAncmVuZGVyKCk6IENhbGxpbmcgUmVhY3RET00ucmVuZGVyKCkgdG8gaHlkcmF0ZSBzZXJ2ZXItcmVuZGVyZWQgbWFya3VwICcgKyAnd2lsbCBzdG9wIHdvcmtpbmcgaW4gUmVhY3QgdjE3LiBSZXBsYWNlIHRoZSBSZWFjdERPTS5yZW5kZXIoKSBjYWxsICcgKyAnd2l0aCBSZWFjdERPTS5oeWRyYXRlKCkgaWYgeW91IHdhbnQgUmVhY3QgdG8gYXR0YWNoIHRvIHRoZSBzZXJ2ZXIgSFRNTC4nKTtcbiAgICB9XG4gIH1cbiAgLy8gTGVnYWN5IHJvb3RzIGFyZSBub3QgYXN5bmMgYnkgZGVmYXVsdC5cbiAgdmFyIGlzQ29uY3VycmVudCA9IGZhbHNlO1xuICByZXR1cm4gbmV3IFJlYWN0Um9vdChjb250YWluZXIsIGlzQ29uY3VycmVudCwgc2hvdWxkSHlkcmF0ZSk7XG59XG5cbmZ1bmN0aW9uIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgY2hpbGRyZW4sIGNvbnRhaW5lciwgZm9yY2VIeWRyYXRlLCBjYWxsYmFjaykge1xuICB7XG4gICAgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncyhjb250YWluZXIpO1xuICB9XG5cbiAgLy8gVE9ETzogV2l0aG91dCBgYW55YCB0eXBlLCBGbG93IHNheXMgXCJQcm9wZXJ0eSBjYW5ub3QgYmUgYWNjZXNzZWQgb24gYW55XG4gIC8vIG1lbWJlciBvZiBpbnRlcnNlY3Rpb24gdHlwZS5cIiBXaHl5eXl5eS5cbiAgdmFyIHJvb3QgPSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcjtcbiAgaWYgKCFyb290KSB7XG4gICAgLy8gSW5pdGlhbCBtb3VudFxuICAgIHJvb3QgPSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9IGxlZ2FjeUNyZWF0ZVJvb3RGcm9tRE9NQ29udGFpbmVyKGNvbnRhaW5lciwgZm9yY2VIeWRyYXRlKTtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFB1YmxpY1Jvb3RJbnN0YW5jZShyb290Ll9pbnRlcm5hbFJvb3QpO1xuICAgICAgICBvcmlnaW5hbENhbGxiYWNrLmNhbGwoaW5zdGFuY2UpO1xuICAgICAgfTtcbiAgICB9XG4gICAgLy8gSW5pdGlhbCBtb3VudCBzaG91bGQgbm90IGJlIGJhdGNoZWQuXG4gICAgdW5iYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAocGFyZW50Q29tcG9uZW50ICE9IG51bGwpIHtcbiAgICAgICAgcm9vdC5sZWdhY3lfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBjaGlsZHJlbiwgY2FsbGJhY2spO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm9vdC5yZW5kZXIoY2hpbGRyZW4sIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgX29yaWdpbmFsQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRQdWJsaWNSb290SW5zdGFuY2Uocm9vdC5faW50ZXJuYWxSb290KTtcbiAgICAgICAgX29yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH1cbiAgICAvLyBVcGRhdGVcbiAgICBpZiAocGFyZW50Q29tcG9uZW50ICE9IG51bGwpIHtcbiAgICAgIHJvb3QubGVnYWN5X3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgY2hpbGRyZW4sIGNhbGxiYWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm9vdC5yZW5kZXIoY2hpbGRyZW4sIGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGdldFB1YmxpY1Jvb3RJbnN0YW5jZShyb290Ll9pbnRlcm5hbFJvb3QpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQb3J0YWwkJDEoY2hpbGRyZW4sIGNvbnRhaW5lcikge1xuICB2YXIga2V5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBudWxsO1xuXG4gICFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikgPyBpbnZhcmlhbnQoZmFsc2UsICdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpIDogdm9pZCAwO1xuICAvLyBUT0RPOiBwYXNzIFJlYWN0RE9NIHBvcnRhbCBpbXBsZW1lbnRhdGlvbiBhcyB0aGlyZCBhcmd1bWVudFxuICByZXR1cm4gY3JlYXRlUG9ydGFsJDEoY2hpbGRyZW4sIGNvbnRhaW5lciwgbnVsbCwga2V5KTtcbn1cblxudmFyIFJlYWN0RE9NID0ge1xuICBjcmVhdGVQb3J0YWw6IGNyZWF0ZVBvcnRhbCQkMSxcblxuICBmaW5kRE9NTm9kZTogZnVuY3Rpb24gKGNvbXBvbmVudE9yRWxlbWVudCkge1xuICAgIHtcbiAgICAgIHZhciBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ7XG4gICAgICBpZiAob3duZXIgIT09IG51bGwgJiYgb3duZXIuc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciB3YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IG93bmVyLnN0YXRlTm9kZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXI7XG4gICAgICAgICF3YXJuZWRBYm91dFJlZnNJblJlbmRlciA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzIGlzIGFjY2Vzc2luZyBmaW5kRE9NTm9kZSBpbnNpZGUgaXRzIHJlbmRlcigpLiAnICsgJ3JlbmRlcigpIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLiBJdCBzaG91bGQgJyArICduZXZlciBhY2Nlc3Mgc29tZXRoaW5nIHRoYXQgcmVxdWlyZXMgc3RhbGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyAnICsgJ3JlbmRlciwgc3VjaCBhcyByZWZzLiBNb3ZlIHRoaXMgbG9naWMgdG8gY29tcG9uZW50RGlkTW91bnQgYW5kICcgKyAnY29tcG9uZW50RGlkVXBkYXRlIGluc3RlYWQuJywgZ2V0Q29tcG9uZW50TmFtZShvd25lci50eXBlKSB8fCAnQSBjb21wb25lbnQnKSA6IHZvaWQgMDtcbiAgICAgICAgb3duZXIuc3RhdGVOb2RlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb21wb25lbnRPckVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChjb21wb25lbnRPckVsZW1lbnQubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgcmV0dXJuIGNvbXBvbmVudE9yRWxlbWVudDtcbiAgICB9XG4gICAge1xuICAgICAgcmV0dXJuIGZpbmRIb3N0SW5zdGFuY2VXaXRoV2FybmluZyhjb21wb25lbnRPckVsZW1lbnQsICdmaW5kRE9NTm9kZScpO1xuICAgIH1cbiAgICByZXR1cm4gZmluZEhvc3RJbnN0YW5jZShjb21wb25lbnRPckVsZW1lbnQpO1xuICB9LFxuICBoeWRyYXRlOiBmdW5jdGlvbiAoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICAgICFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikgPyBpbnZhcmlhbnQoZmFsc2UsICdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpIDogdm9pZCAwO1xuICAgIHtcbiAgICAgICEhY29udGFpbmVyLl9yZWFjdEhhc0JlZW5QYXNzZWRUb0NyZWF0ZVJvb3RERVYgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00uaHlkcmF0ZSgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET00uJXMoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIGNyZWF0ZVJvb3QoY29udGFpbmVyLCB7aHlkcmF0ZTogdHJ1ZX0pLnJlbmRlcihlbGVtZW50KT8nLCBlbmFibGVTdGFibGVDb25jdXJyZW50TW9kZUFQSXMgPyAnY3JlYXRlUm9vdCcgOiAndW5zdGFibGVfY3JlYXRlUm9vdCcpIDogdm9pZCAwO1xuICAgIH1cbiAgICAvLyBUT0RPOiB0aHJvdyBvciB3YXJuIGlmIHdlIGNvdWxkbid0IGh5ZHJhdGU/XG4gICAgcmV0dXJuIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKG51bGwsIGVsZW1lbnQsIGNvbnRhaW5lciwgdHJ1ZSwgY2FsbGJhY2spO1xuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIChlbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gICAgIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSA/IGludmFyaWFudChmYWxzZSwgJ1RhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJykgOiB2b2lkIDA7XG4gICAge1xuICAgICAgISFjb250YWluZXIuX3JlYWN0SGFzQmVlblBhc3NlZFRvQ3JlYXRlUm9vdERFViA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS5yZW5kZXIoKSBvbiBhIGNvbnRhaW5lciB0aGF0IHdhcyBwcmV2aW91c2x5ICcgKyAncGFzc2VkIHRvIFJlYWN0RE9NLiVzKCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCByb290LnJlbmRlcihlbGVtZW50KT8nLCBlbmFibGVTdGFibGVDb25jdXJyZW50TW9kZUFQSXMgPyAnY3JlYXRlUm9vdCcgOiAndW5zdGFibGVfY3JlYXRlUm9vdCcpIDogdm9pZCAwO1xuICAgIH1cbiAgICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgZWxlbWVudCwgY29udGFpbmVyLCBmYWxzZSwgY2FsbGJhY2spO1xuICB9LFxuICB1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjogZnVuY3Rpb24gKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgY2FsbGJhY2spIHtcbiAgICAhaXNWYWxpZENvbnRhaW5lcihjb250YWluZXJOb2RlKSA/IGludmFyaWFudChmYWxzZSwgJ1RhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJykgOiB2b2lkIDA7XG4gICAgIShwYXJlbnRDb21wb25lbnQgIT0gbnVsbCAmJiBoYXMocGFyZW50Q29tcG9uZW50KSkgPyBpbnZhcmlhbnQoZmFsc2UsICdwYXJlbnRDb21wb25lbnQgbXVzdCBiZSBhIHZhbGlkIFJlYWN0IENvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgIHJldHVybiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGZhbHNlLCBjYWxsYmFjayk7XG4gIH0sXG4gIHVubW91bnRDb21wb25lbnRBdE5vZGU6IGZ1bmN0aW9uIChjb250YWluZXIpIHtcbiAgICAhaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpID8gaW52YXJpYW50KGZhbHNlLCAndW5tb3VudENvbXBvbmVudEF0Tm9kZSguLi4pOiBUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpIDogdm9pZCAwO1xuXG4gICAge1xuICAgICAgISFjb250YWluZXIuX3JlYWN0SGFzQmVlblBhc3NlZFRvQ3JlYXRlUm9vdERFViA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTS4lcygpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuIERpZCB5b3UgbWVhbiB0byBjYWxsIHJvb3QudW5tb3VudCgpPycsIGVuYWJsZVN0YWJsZUNvbmN1cnJlbnRNb2RlQVBJcyA/ICdjcmVhdGVSb290JyA6ICd1bnN0YWJsZV9jcmVhdGVSb290JykgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyKSB7XG4gICAgICB7XG4gICAgICAgIHZhciByb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgICAgICAgdmFyIHJlbmRlcmVkQnlEaWZmZXJlbnRSZWFjdCA9IHJvb3RFbCAmJiAhZ2V0SW5zdGFuY2VGcm9tTm9kZSQxKHJvb3RFbCk7XG4gICAgICAgICEhcmVuZGVyZWRCeURpZmZlcmVudFJlYWN0ID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCBcInVubW91bnRDb21wb25lbnRBdE5vZGUoKTogVGhlIG5vZGUgeW91J3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCBcIiArICd3YXMgcmVuZGVyZWQgYnkgYW5vdGhlciBjb3B5IG9mIFJlYWN0LicpIDogdm9pZCAwO1xuICAgICAgfVxuXG4gICAgICAvLyBVbm1vdW50IHNob3VsZCBub3QgYmUgYmF0Y2hlZC5cbiAgICAgIHVuYmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKCkge1xuICAgICAgICBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBudWxsLCBjb250YWluZXIsIGZhbHNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPSBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgLy8gSWYgeW91IGNhbGwgdW5tb3VudENvbXBvbmVudEF0Tm9kZSB0d2ljZSBpbiBxdWljayBzdWNjZXNzaW9uLCB5b3UnbGxcbiAgICAgIC8vIGdldCBgdHJ1ZWAgdHdpY2UuIFRoYXQncyBwcm9iYWJseSBmaW5lP1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgdmFyIF9yb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgICAgICAgdmFyIGhhc05vblJvb3RSZWFjdENoaWxkID0gISEoX3Jvb3RFbCAmJiBnZXRJbnN0YW5jZUZyb21Ob2RlJDEoX3Jvb3RFbCkpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgaXRzZWxmIGlzIGEgUmVhY3Qgcm9vdCBub2RlLlxuICAgICAgICB2YXIgaXNDb250YWluZXJSZWFjdFJvb3QgPSBjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lci5wYXJlbnROb2RlKSAmJiAhIWNvbnRhaW5lci5wYXJlbnROb2RlLl9yZWFjdFJvb3RDb250YWluZXI7XG5cbiAgICAgICAgISFoYXNOb25Sb290UmVhY3RDaGlsZCA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgXCJ1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFRoZSBub2RlIHlvdSdyZSBhdHRlbXB0aW5nIHRvIHVubW91bnQgXCIgKyAnd2FzIHJlbmRlcmVkIGJ5IFJlYWN0IGFuZCBpcyBub3QgYSB0b3AtbGV2ZWwgY29udGFpbmVyLiAlcycsIGlzQ29udGFpbmVyUmVhY3RSb290ID8gJ1lvdSBtYXkgaGF2ZSBhY2NpZGVudGFsbHkgcGFzc2VkIGluIGEgUmVhY3Qgcm9vdCBub2RlIGluc3RlYWQgJyArICdvZiBpdHMgY29udGFpbmVyLicgOiAnSW5zdGVhZCwgaGF2ZSB0aGUgcGFyZW50IGNvbXBvbmVudCB1cGRhdGUgaXRzIHN0YXRlIGFuZCAnICsgJ3JlcmVuZGVyIGluIG9yZGVyIHRvIHJlbW92ZSB0aGlzIGNvbXBvbmVudC4nKSA6IHZvaWQgMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcblxuXG4gIC8vIFRlbXBvcmFyeSBhbGlhcyBzaW5jZSB3ZSBhbHJlYWR5IHNoaXBwZWQgUmVhY3QgMTYgUkMgd2l0aCBpdC5cbiAgLy8gVE9ETzogcmVtb3ZlIGluIFJlYWN0IDE3LlxuICB1bnN0YWJsZV9jcmVhdGVQb3J0YWw6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWRpZFdhcm5BYm91dFVuc3RhYmxlQ3JlYXRlUG9ydGFsKSB7XG4gICAgICBkaWRXYXJuQWJvdXRVbnN0YWJsZUNyZWF0ZVBvcnRhbCA9IHRydWU7XG4gICAgICBsb3dQcmlvcml0eVdhcm5pbmckMShmYWxzZSwgJ1RoZSBSZWFjdERPTS51bnN0YWJsZV9jcmVhdGVQb3J0YWwoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTcrLiBVcGRhdGUgeW91ciBjb2RlIHRvIHVzZSAnICsgJ1JlYWN0RE9NLmNyZWF0ZVBvcnRhbCgpIGluc3RlYWQuIEl0IGhhcyB0aGUgZXhhY3Qgc2FtZSBBUEksICcgKyAnYnV0IHdpdGhvdXQgdGhlIFwidW5zdGFibGVfXCIgcHJlZml4LicpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlUG9ydGFsJCQxLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgfSxcblxuXG4gIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzOiBiYXRjaGVkVXBkYXRlcyQxLFxuXG4gIHVuc3RhYmxlX2ludGVyYWN0aXZlVXBkYXRlczogaW50ZXJhY3RpdmVVcGRhdGVzJDEsXG5cbiAgZmx1c2hTeW5jOiBmbHVzaFN5bmMsXG5cbiAgdW5zdGFibGVfY3JlYXRlUm9vdDogY3JlYXRlUm9vdCxcbiAgdW5zdGFibGVfZmx1c2hDb250cm9sbGVkOiBmbHVzaENvbnRyb2xsZWQsXG5cbiAgX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ6IHtcbiAgICAvLyBLZWVwIGluIHN5bmMgd2l0aCBSZWFjdERPTVVuc3RhYmxlTmF0aXZlRGVwZW5kZW5jaWVzLmpzXG4gICAgLy8gYW5kIFJlYWN0VGVzdFV0aWxzLmpzLiBUaGlzIGlzIGFuIGFycmF5IGZvciBiZXR0ZXIgbWluaWZpY2F0aW9uLlxuICAgIEV2ZW50czogW2dldEluc3RhbmNlRnJvbU5vZGUkMSwgZ2V0Tm9kZUZyb21JbnN0YW5jZSQxLCBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlJDEsIGluamVjdGlvbi5pbmplY3RFdmVudFBsdWdpbnNCeU5hbWUsIGV2ZW50TmFtZURpc3BhdGNoQ29uZmlncywgYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcywgYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXMsIGVucXVldWVTdGF0ZVJlc3RvcmUsIHJlc3RvcmVTdGF0ZUlmTmVlZGVkLCBkaXNwYXRjaEV2ZW50LCBydW5FdmVudHNJbkJhdGNoXVxuICB9XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVSb290KGNvbnRhaW5lciwgb3B0aW9ucykge1xuICB2YXIgZnVuY3Rpb25OYW1lID0gZW5hYmxlU3RhYmxlQ29uY3VycmVudE1vZGVBUElzID8gJ2NyZWF0ZVJvb3QnIDogJ3Vuc3RhYmxlX2NyZWF0ZVJvb3QnO1xuICAhaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpID8gaW52YXJpYW50KGZhbHNlLCAnJXMoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nLCBmdW5jdGlvbk5hbWUpIDogdm9pZCAwO1xuICB7XG4gICAgISFjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS4lcygpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET00ucmVuZGVyKCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4nLCBlbmFibGVTdGFibGVDb25jdXJyZW50TW9kZUFQSXMgPyAnY3JlYXRlUm9vdCcgOiAndW5zdGFibGVfY3JlYXRlUm9vdCcpIDogdm9pZCAwO1xuICAgIGNvbnRhaW5lci5fcmVhY3RIYXNCZWVuUGFzc2VkVG9DcmVhdGVSb290REVWID0gdHJ1ZTtcbiAgfVxuICB2YXIgaHlkcmF0ZSA9IG9wdGlvbnMgIT0gbnVsbCAmJiBvcHRpb25zLmh5ZHJhdGUgPT09IHRydWU7XG4gIHJldHVybiBuZXcgUmVhY3RSb290KGNvbnRhaW5lciwgdHJ1ZSwgaHlkcmF0ZSk7XG59XG5cbmlmIChlbmFibGVTdGFibGVDb25jdXJyZW50TW9kZUFQSXMpIHtcbiAgUmVhY3RET00uY3JlYXRlUm9vdCA9IGNyZWF0ZVJvb3Q7XG4gIFJlYWN0RE9NLnVuc3RhYmxlX2NyZWF0ZVJvb3QgPSB1bmRlZmluZWQ7XG59XG5cbnZhciBmb3VuZERldlRvb2xzID0gaW5qZWN0SW50b0RldlRvb2xzKHtcbiAgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLFxuICBidW5kbGVUeXBlOiAxLFxuICB2ZXJzaW9uOiBSZWFjdFZlcnNpb24sXG4gIHJlbmRlcmVyUGFja2FnZU5hbWU6ICdyZWFjdC1kb20nXG59KTtcblxue1xuICBpZiAoIWZvdW5kRGV2VG9vbHMgJiYgY2FuVXNlRE9NICYmIHdpbmRvdy50b3AgPT09IHdpbmRvdy5zZWxmKSB7XG4gICAgLy8gSWYgd2UncmUgaW4gQ2hyb21lIG9yIEZpcmVmb3gsIHByb3ZpZGUgYSBkb3dubG9hZCBsaW5rIGlmIG5vdCBpbnN0YWxsZWQuXG4gICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lJykgPiAtMSAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0VkZ2UnKSA9PT0gLTEgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgPiAtMSkge1xuICAgICAgdmFyIHByb3RvY29sID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sO1xuICAgICAgLy8gRG9uJ3Qgd2FybiBpbiBleG90aWMgY2FzZXMgbGlrZSBjaHJvbWUtZXh0ZW5zaW9uOi8vLlxuICAgICAgaWYgKC9eKGh0dHBzP3xmaWxlKTokLy50ZXN0KHByb3RvY29sKSkge1xuICAgICAgICBjb25zb2xlLmluZm8oJyVjRG93bmxvYWQgdGhlIFJlYWN0IERldlRvb2xzICcgKyAnZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6ICcgKyAnaHR0cHM6Ly9mYi5tZS9yZWFjdC1kZXZ0b29scycgKyAocHJvdG9jb2wgPT09ICdmaWxlOicgPyAnXFxuWW91IG1pZ2h0IG5lZWQgdG8gdXNlIGEgbG9jYWwgSFRUUCBzZXJ2ZXIgKGluc3RlYWQgb2YgZmlsZTovLyk6ICcgKyAnaHR0cHM6Ly9mYi5tZS9yZWFjdC1kZXZ0b29scy1mYXEnIDogJycpLCAnZm9udC13ZWlnaHQ6Ym9sZCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5cblxudmFyIFJlYWN0RE9NJDIgPSBPYmplY3QuZnJlZXplKHtcblx0ZGVmYXVsdDogUmVhY3RET01cbn0pO1xuXG52YXIgUmVhY3RET00kMyA9ICggUmVhY3RET00kMiAmJiBSZWFjdERPTSApIHx8IFJlYWN0RE9NJDI7XG5cbi8vIFRPRE86IGRlY2lkZSBvbiB0aGUgdG9wLWxldmVsIGV4cG9ydCBmb3JtLlxuLy8gVGhpcyBpcyBoYWNreSBidXQgbWFrZXMgaXQgd29yayB3aXRoIGJvdGggUm9sbHVwIGFuZCBKZXN0LlxudmFyIHJlYWN0RG9tID0gUmVhY3RET00kMy5kZWZhdWx0IHx8IFJlYWN0RE9NJDM7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVhY3REb207XG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGNoZWNrRENFKCkge1xuICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG4gIGlmIChcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJyB8fFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gVGhpcyBicmFuY2ggaXMgdW5yZWFjaGFibGUgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkXG4gICAgLy8gaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBjb25kaXRpb24gaXMgdHJ1ZSBvbmx5IGluIGRldmVsb3BtZW50LlxuICAgIC8vIFRoZXJlZm9yZSBpZiB0aGUgYnJhbmNoIGlzIHN0aWxsIGhlcmUsIGRlYWQgY29kZSBlbGltaW5hdGlvbiB3YXNuJ3RcbiAgICAvLyBwcm9wZXJseSBhcHBsaWVkLlxuICAgIC8vIERvbid0IGNoYW5nZSB0aGUgbWVzc2FnZS4gUmVhY3QgRGV2VG9vbHMgcmVsaWVzIG9uIGl0LiBBbHNvIG1ha2Ugc3VyZVxuICAgIC8vIHRoaXMgbWVzc2FnZSBkb2Vzbid0IG9jY3VyIGVsc2V3aGVyZSBpbiB0aGlzIGZ1bmN0aW9uLCBvciBpdCB3aWxsIGNhdXNlXG4gICAgLy8gYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ15fXicpO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvZGUgYWJvdmUgaGFzIGJlZW4gZGVhZCBjb2RlIGVsaW1pbmF0ZWQgKERDRSdkKS5cbiAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UoY2hlY2tEQ0UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBEZXZUb29scyBzaG91bGRuJ3QgY3Jhc2ggUmVhY3QsIG5vIG1hdHRlciB3aGF0LlxuICAgIC8vIFdlIHNob3VsZCBzdGlsbCByZXBvcnQgaW4gY2FzZSB3ZSBicmVhayB0aGlzIGNvZGUuXG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIERDRSBjaGVjayBzaG91bGQgaGFwcGVuIGJlZm9yZSBSZWFjdERPTSBidW5kbGUgZXhlY3V0ZXMgc28gdGhhdFxuICAvLyBEZXZUb29scyBjYW4gcmVwb3J0IGJhZCBtaW5pZmljYXRpb24gZHVyaW5nIGluamVjdGlvbi5cbiAgY2hlY2tEQ0UoKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJpbXBvcnQgeyB1c2VTdGF0ZSwgbWVtbywgdXNlTWVtbywgdXNlRWZmZWN0LCBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBvYnNlcnZlLCB1bm9ic2VydmUsIGlzT2JzZXJ2YWJsZSwgcmF3LCBvYnNlcnZhYmxlIH0gZnJvbSAnQG54LWpzL29ic2VydmVyLXV0aWwnO1xuaW1wb3J0IHsgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgfSBmcm9tICcuL3JlYWN0LXBsYXRmb3JtJztcblxuLy8gaXQgaXMgd2luZG93IGluIHRoZSBET00gYW5kIGdsb2JhbCBpbiBOb2RlSlMgYW5kIFJlYWN0IE5hdGl2ZVxuXG5jb25zdCBpc0RPTSA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xuY29uc3QgaXNOYXRpdmUgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJztcbmNvbnN0IGdsb2JhbE9iaiA9IGlzRE9NID8gd2luZG93IDogaXNOYXRpdmUgPyBnbG9iYWwgOiB1bmRlZmluZWQ7XG5jb25zdCBoYXNIb29rcyA9IHR5cGVvZiB1c2VTdGF0ZSA9PT0gJ2Z1bmN0aW9uJztcblxubGV0IGlzSW5zaWRlRnVuY3Rpb25Db21wb25lbnQgPSBmYWxzZTtcbmNvbnN0IENPTVBPTkVOVCA9IFN5bWJvbCgnb3duZXIgY29tcG9uZW50Jyk7XG5mdW5jdGlvbiB2aWV3KENvbXApIHtcbiAgY29uc3QgaXNTdGF0ZWxlc3NDb21wID0gIShDb21wLnByb3RvdHlwZSAmJiBDb21wLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbiAgbGV0IFJlYWN0aXZlQ29tcDtcblxuICBpZiAoaXNTdGF0ZWxlc3NDb21wICYmIGhhc0hvb2tzKSB7XG4gICAgLy8gdXNlIGEgaG9vayBiYXNlZCByZWFjdGl2ZSB3cmFwcGVyIHdoZW4gd2UgY2FuXG4gICAgUmVhY3RpdmVDb21wID0gbWVtbyhwcm9wcyA9PiB7XG4gICAgICAvLyB1c2UgYSBkdW1teSBzZXRTdGF0ZSB0byB1cGRhdGUgdGhlIGNvbXBvbmVudFxuICAgICAgY29uc3QgWywgc2V0U3RhdGVdID0gdXNlU3RhdGUoKTsgLy8gY3JlYXRlIGEgbWVtb2l6ZWQgcmVhY3RpdmUgd3JhcHBlciBvZiB0aGUgb3JpZ2luYWwgY29tcG9uZW50IChyZW5kZXIpXG4gICAgICAvLyBhdCB0aGUgdmVyeSBmaXJzdCBydW4gb2YgdGhlIGNvbXBvbmVudCBmdW5jdGlvblxuXG4gICAgICBjb25zdCByZW5kZXIgPSB1c2VNZW1vKCgpID0+IG9ic2VydmUoQ29tcCwge1xuICAgICAgICBzY2hlZHVsZXI6ICgpID0+IHNldFN0YXRlKHt9KSxcbiAgICAgICAgbGF6eTogdHJ1ZVxuICAgICAgfSksIC8vIEFkZGluZyB0aGUgb3JpZ2luYWwgQ29tcCBoZXJlIGlzIG5lY2Vzc2FyeSB0byBtYWtlIFJlYWN0IEhvdCBSZWxvYWQgd29ya1xuICAgICAgLy8gaXQgZG9lcyBub3QgYWZmZWN0IGJlaGF2aW9yIG90aGVyd2lzZVxuICAgICAgW0NvbXBdKTsgLy8gY2xlYW51cCB0aGUgcmVhY3RpdmUgY29ubmVjdGlvbnMgYWZ0ZXIgdGhlIHZlcnkgbGFzdCByZW5kZXIgb2YgdGhlIGNvbXBvbmVudFxuXG4gICAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICByZXR1cm4gKCkgPT4gdW5vYnNlcnZlKHJlbmRlcik7XG4gICAgICB9LCBbXSk7IC8vIHRoZSBpc0luc2lkZUZ1bmN0aW9uQ29tcG9uZW50IGZsYWcgaXMgdXNlZCB0byB0b2dnbGUgYHN0b3JlYCBiZWhhdmlvclxuICAgICAgLy8gYmFzZWQgb24gd2hlcmUgaXQgd2FzIGNhbGxlZCBmcm9tXG5cbiAgICAgIGlzSW5zaWRlRnVuY3Rpb25Db21wb25lbnQgPSB0cnVlO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBydW4gdGhlIHJlYWN0aXZlIHJlbmRlciBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBvbmVcbiAgICAgICAgcmV0dXJuIHJlbmRlcihwcm9wcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpc0luc2lkZUZ1bmN0aW9uQ29tcG9uZW50ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgQmFzZUNvbXAgPSBpc1N0YXRlbGVzc0NvbXAgPyBDb21wb25lbnQgOiBDb21wOyAvLyBhIEhPQyB3aGljaCBvdmVyd3JpdGVzIHJlbmRlciwgc2hvdWxkQ29tcG9uZW50VXBkYXRlIGFuZCBjb21wb25lbnRXaWxsVW5tb3VudFxuICAgIC8vIGl0IGRlY2lkZXMgd2hlbiB0byBydW4gdGhlIG5ldyByZWFjdGl2ZSBtZXRob2RzIGFuZCB3aGVuIHRvIHByb3h5IHRvIHRoZSBvcmlnaW5hbCBtZXRob2RzXG5cbiAgICBjbGFzcyBSZWFjdGl2ZUNsYXNzQ29tcCBleHRlbmRzIEJhc2VDb21wIHtcbiAgICAgIGNvbnN0cnVjdG9yKHByb3BzLCBjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKHByb3BzLCBjb250ZXh0KTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuc3RhdGUgfHwge307XG4gICAgICAgIHRoaXMuc3RhdGVbQ09NUE9ORU5UXSA9IHRoaXM7IC8vIGNyZWF0ZSBhIHJlYWN0aXZlIHJlbmRlciBmb3IgdGhlIGNvbXBvbmVudFxuXG4gICAgICAgIHRoaXMucmVuZGVyID0gb2JzZXJ2ZSh0aGlzLnJlbmRlciwge1xuICAgICAgICAgIHNjaGVkdWxlcjogKCkgPT4gdGhpcy5zZXRTdGF0ZSh7fSksXG4gICAgICAgICAgbGF6eTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gaXNTdGF0ZWxlc3NDb21wID8gQ29tcCh0aGlzLnByb3BzLCB0aGlzLmNvbnRleHQpIDogc3VwZXIucmVuZGVyKCk7XG4gICAgICB9IC8vIHJlYWN0IHNob3VsZCB0cmlnZ2VyIHVwZGF0ZXMgb24gcHJvcCBjaGFuZ2VzLCB3aGlsZSBlYXN5U3RhdGUgaGFuZGxlcyBzdG9yZSBjaGFuZ2VzXG5cblxuICAgICAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICBzdGF0ZVxuICAgICAgICB9ID0gdGhpczsgLy8gcmVzcGVjdCB0aGUgY2FzZSB3aGVuIHRoZSB1c2VyIGRlZmluZXMgYSBzaG91bGRDb21wb25lbnRVcGRhdGVcblxuICAgICAgICBpZiAoc3VwZXIuc2hvdWxkQ29tcG9uZW50VXBkYXRlKSB7XG4gICAgICAgICAgcmV0dXJuIHN1cGVyLnNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSk7XG4gICAgICAgIH0gLy8gcmV0dXJuIHRydWUgaWYgaXQgaXMgYSByZWFjdGl2ZSByZW5kZXIgb3Igc3RhdGUgY2hhbmdlc1xuXG5cbiAgICAgICAgaWYgKHN0YXRlICE9PSBuZXh0U3RhdGUpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAvLyB0aGUgY29tcG9uZW50IHNob3VsZCB1cGRhdGUgaWYgYW55IG9mIGl0cyBwcm9wcyBzaGFsbG93bHkgY2hhbmdlZCB2YWx1ZVxuXG5cbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3BzKTtcbiAgICAgICAgY29uc3QgbmV4dEtleXMgPSBPYmplY3Qua2V5cyhuZXh0UHJvcHMpO1xuICAgICAgICByZXR1cm4gbmV4dEtleXMubGVuZ3RoICE9PSBrZXlzLmxlbmd0aCB8fCBuZXh0S2V5cy5zb21lKGtleSA9PiBwcm9wc1trZXldICE9PSBuZXh0UHJvcHNba2V5XSk7XG4gICAgICB9IC8vIGFkZCBhIGN1c3RvbSBkZXJpdmVTdG9yZXNGcm9tUHJvcHMgbGlmZWN5bGUgbWV0aG9kXG5cblxuICAgICAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcywgc3RhdGUpIHtcbiAgICAgICAgaWYgKHN1cGVyLmRlcml2ZVN0b3Jlc0Zyb21Qcm9wcykge1xuICAgICAgICAgIC8vIGluamVjdCBhbGwgbG9jYWwgc3RvcmVzIGFuZCBsZXQgdGhlIHVzZXIgbXV0YXRlIHRoZW0gZGlyZWN0bHlcbiAgICAgICAgICBjb25zdCBzdG9yZXMgPSBtYXBTdGF0ZVRvU3RvcmVzKHN0YXRlKTtcbiAgICAgICAgICBzdXBlci5kZXJpdmVTdG9yZXNGcm9tUHJvcHMocHJvcHMsIC4uLnN0b3Jlcyk7XG4gICAgICAgIH0gLy8gcmVzcGVjdCB1c2VyIGRlZmluZWQgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXG5cblxuICAgICAgICBpZiAoc3VwZXIuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKSB7XG4gICAgICAgICAgcmV0dXJuIHN1cGVyLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcywgc3RhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICAvLyBjYWxsIHVzZXIgZGVmaW5lZCBjb21wb25lbnRXaWxsVW5tb3VudFxuICAgICAgICBpZiAoc3VwZXIuY29tcG9uZW50V2lsbFVubW91bnQpIHtcbiAgICAgICAgICBzdXBlci5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuICAgICAgICB9IC8vIGNsZWFuIHVwIG1lbW9yeSB1c2VkIGJ5IEVhc3kgU3RhdGVcblxuXG4gICAgICAgIHVub2JzZXJ2ZSh0aGlzLnJlbmRlcik7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICBSZWFjdGl2ZUNvbXAgPSBSZWFjdGl2ZUNsYXNzQ29tcDtcbiAgfVxuXG4gIFJlYWN0aXZlQ29tcC5kaXNwbGF5TmFtZSA9IENvbXAuZGlzcGxheU5hbWUgfHwgQ29tcC5uYW1lOyAvLyBzdGF0aWMgcHJvcHMgYXJlIGluaGVyaXRlZCBieSBjbGFzcyBjb21wb25lbnRzLFxuICAvLyBidXQgaGF2ZSB0byBiZSBjb3BpZWQgZm9yIGZ1bmN0aW9uIGNvbXBvbmVudHNcblxuICBpZiAoaXNTdGF0ZWxlc3NDb21wKSB7XG4gICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKENvbXApKSB7XG4gICAgICBSZWFjdGl2ZUNvbXBba2V5XSA9IENvbXBba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gUmVhY3RpdmVDb21wO1xufVxuXG5mdW5jdGlvbiBtYXBTdGF0ZVRvU3RvcmVzKHN0YXRlKSB7XG4gIC8vIGZpbmQgc3RvcmUgcHJvcGVydGllcyBhbmQgbWFwIHRoZW0gdG8gdGhlaXIgbm9uZSBvYnNlcnZhYmxlIHJhdyB2YWx1ZVxuICAvLyB0byBkbyBub3QgdHJpZ2dlciBub25lIHN0YXRpYyB0aGlzLnNldFN0YXRlIGNhbGxzXG4gIC8vIGZyb20gdGhlIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgbGlmZWN5Y2xlIG1ldGhvZFxuICBjb25zdCBjb21wb25lbnQgPSBzdGF0ZVtDT01QT05FTlRdO1xuICByZXR1cm4gT2JqZWN0LmtleXMoY29tcG9uZW50KS5tYXAoa2V5ID0+IGNvbXBvbmVudFtrZXldKS5maWx0ZXIoaXNPYnNlcnZhYmxlKS5tYXAocmF3KTtcbn1cblxuZnVuY3Rpb24gc3RvcmUob2JqKSB7XG4gIC8vIGRvIG5vdCBjcmVhdGUgbmV3IHZlcnNpb25zIG9mIHRoZSBzdG9yZSBvbiBldmVyeSByZW5kZXJcbiAgLy8gaWYgaXQgaXMgYSBsb2NhbCBzdG9yZSBpbiBhIGZ1bmN0aW9uIGNvbXBvbmVudFxuICAvLyBjcmVhdGUgYSBtZW1vaXplZCBzdG9yZSBhdCB0aGUgZmlyc3QgY2FsbCBpbnN0ZWFkXG4gIGlmIChoYXNIb29rcyAmJiBpc0luc2lkZUZ1bmN0aW9uQ29tcG9uZW50KSB7XG4gICAgcmV0dXJuIHVzZU1lbW8oKCkgPT4gb2JzZXJ2YWJsZShvYmopLCBbXSk7XG4gIH1cblxuICByZXR1cm4gb2JzZXJ2YWJsZShvYmopO1xufVxuXG4vKiBlc2xpbnQgY2FtZWxjYXNlOiAwICovXG4vLyB1bnRpbCB0aGUgZnVuY3Rpb24gaXMgZmluaXNoZWQgcnVubmluZ1xuXG5mdW5jdGlvbiBiYXRjaChmbiwgY3R4LCBhcmdzKSB7XG4gIGxldCByZXN1bHQ7XG4gIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzKCgpID0+IHJlc3VsdCA9IGZuLmFwcGx5KGN0eCwgYXJncykpO1xuICByZXR1cm4gcmVzdWx0O1xufSAvLyB0aGlzIGNyZWF0ZXMgYW5kIHJldHVybnMgYSBiYXRjaGVkIHZlcnNpb24gb2YgdGhlIHBhc3NlZCBmdW5jdGlvblxuLy8gdGhlIGNhY2hlIGlzIG5lY2Vzc2FyeSB0byBhbHdheXMgbWFwIHRoZSBzYW1lIHRoaW5nIHRvIHRoZSBzYW1lIGZ1bmN0aW9uXG4vLyB3aGljaCBtYWtlcyBzdXJlIHRoYXQgYWRkRXZlbnRMaXN0ZW5lci9yZW1vdmVFdmVudExpc3RlbmVyIHBhaXJzIGRvbid0IGJyZWFrXG5cbmNvbnN0IGNhY2hlID0gbmV3IFdlYWtNYXAoKTtcblxuZnVuY3Rpb24gYmF0Y2hGbihmbikge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgbGV0IGJhdGNoZWQgPSBjYWNoZS5nZXQoZm4pO1xuXG4gIGlmICghYmF0Y2hlZCkge1xuICAgIGJhdGNoZWQgPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgcmV0dXJuIGJhdGNoKGZuLCB0aGlzLCBhcmdzKTtcbiAgICB9O1xuXG4gICAgY2FjaGUuc2V0KGZuLCBiYXRjaGVkKTtcbiAgfVxuXG4gIHJldHVybiBiYXRjaGVkO1xufSAvLyBiYXRjaGVkIG9iai5hZGRFdmVudExpc3RlbmVyKGNiKSBsaWtlIGNhbGxiYWNrc1xuXG5cbmZ1bmN0aW9uIGJhdGNoTWV0aG9kc0NhbGxiYWNrcyhvYmosIG1ldGhvZHMpIHtcbiAgbWV0aG9kcy5mb3JFYWNoKG1ldGhvZCA9PiBiYXRjaE1ldGhvZENhbGxiYWNrcyhvYmosIG1ldGhvZCkpO1xufVxuXG5mdW5jdGlvbiBiYXRjaE1ldGhvZENhbGxiYWNrcyhvYmosIG1ldGhvZCkge1xuICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIG1ldGhvZCk7XG5cbiAgaWYgKGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci53cml0YWJsZSAmJiB0eXBlb2YgZGVzY3JpcHRvci52YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG9ialttZXRob2RdID0gbmV3IFByb3h5KGRlc2NyaXB0b3IudmFsdWUsIHtcbiAgICAgIGFwcGx5KHRhcmdldCwgY3R4LCBhcmdzKSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHRhcmdldCwgY3R4LCBhcmdzLm1hcChiYXRjaEZuKSk7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgfVxufSAvLyBiYXRjaGVzIG9iai5vbmV2ZW50ID0gZm4gbGlrZSBjYWxsc1xuXG5cbmZ1bmN0aW9uIGJhdGNoTWV0aG9kcyhvYmosIG1ldGhvZHMpIHtcbiAgbWV0aG9kcy5mb3JFYWNoKG1ldGhvZCA9PiBiYXRjaE1ldGhvZChvYmosIG1ldGhvZCkpO1xufVxuXG5mdW5jdGlvbiBiYXRjaE1ldGhvZChvYmosIG1ldGhvZCkge1xuICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIG1ldGhvZCk7XG5cbiAgaWYgKGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci5jb25maWd1cmFibGUpIHtcbiAgICBjb25zdCBuZXdEZXNjcmlwdG9yID0gT2JqZWN0LmFzc2lnbih7fSwgZGVzY3JpcHRvciwge1xuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yLnNldC5jYWxsKHRoaXMsIGJhdGNoRm4odmFsdWUpKTtcbiAgICAgIH1cblxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG1ldGhvZCwgbmV3RGVzY3JpcHRvcik7XG4gIH1cbn0gLy8gZG8gYSBzeW5jIGJhdGNoaW5nIGZvciB0aGUgbW9zdCBjb21tb24gdGFzayBzb3VyY2VzXG4vLyB0aGlzIHNob3VsZCBiZSByZW1vdmVkIHdoZW4gUmVhY3QncyBvd24gYmF0Y2hpbmcgaXMgaW1wcm92ZWQgaW4gdGhlIGZ1dHVyZVxuLy8gYmF0Y2ggdGltZXIgZnVuY3Rpb25zXG5cblxuYmF0Y2hNZXRob2RzQ2FsbGJhY2tzKGdsb2JhbE9iaiwgWydzZXRUaW1lb3V0JywgJ3NldEludGVydmFsJywgJ3JlcXVlc3RBbmltYXRpb25GcmFtZScsICdyZXF1ZXN0SWRsZUNhbGxiYWNrJ10pO1xuXG5pZiAoZ2xvYmFsT2JqLlByb21pc2UpIHtcbiAgYmF0Y2hNZXRob2RzQ2FsbGJhY2tzKFByb21pc2UucHJvdG90eXBlLCBbJ3RoZW4nLCAnY2F0Y2gnXSk7XG59IC8vIGJhdGNoIGFkZEV2ZW50TGlzdGVuZXIgY2FsbHNcblxuXG5pZiAoZ2xvYmFsT2JqLkV2ZW50VGFyZ2V0KSB7XG4gIGJhdGNoTWV0aG9kc0NhbGxiYWNrcyhFdmVudFRhcmdldC5wcm90b3R5cGUsIFsnYWRkRXZlbnRMaXN0ZW5lcicsICdyZW1vdmVFdmVudExpc3RlbmVyJ10pO1xufSAvLyB0aGlzIGJhdGNoZXMgd2Vic29ja2V0IGV2ZW50IGhhbmRsZXJzXG5cblxuaWYgKGdsb2JhbE9iai5XZWJTb2NrZXQpIHtcbiAgYmF0Y2hNZXRob2RzKFdlYlNvY2tldC5wcm90b3R5cGUsIFsnb25vcGVuJywgJ29ubWVzc2FnZScsICdvbmVycm9yJywgJ29uY2xvc2UnXSk7XG59IC8vIEhUVFAgZXZlbnQgaGFuZGxlcnMgYXJlIHVzdWFsbHkgd3JhcHBlZCBieSBQcm9taXNlcywgd2hpY2ggaXMgY292ZXJlZCBhYm92ZVxuXG5leHBvcnQgeyBiYXRjaCwgc3RvcmUsIHZpZXcgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVzLmVzNi5qcy5tYXBcbiIsImV4cG9ydCAqIGZyb20gJ3JlYWN0LWRvbSdcbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuOC42XG4gKiByZWFjdC5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcbnZhciBjaGVja1Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMvY2hlY2tQcm9wVHlwZXMnKTtcblxuLy8gVE9ETzogdGhpcyBpcyBzcGVjaWFsIGJlY2F1c2UgaXQgZ2V0cyBpbXBvcnRlZCBkdXJpbmcgYnVpbGQuXG5cbnZhciBSZWFjdFZlcnNpb24gPSAnMTYuOC42JztcblxuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbnZhciBoYXNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3I7XG5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgOiAweGVhYzc7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKSA6IDB4ZWFjYTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKSA6IDB4ZWFjYjtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKSA6IDB4ZWFjYztcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKSA6IDB4ZWFkMjtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucHJvdmlkZXInKSA6IDB4ZWFjZDtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0JykgOiAweGVhY2U7XG5cbnZhciBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbmN1cnJlbnRfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpIDogMHhlYWQwO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpIDogMHhlYWQxO1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKSA6IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5JykgOiAweGVhZDQ7XG5cbnZhciBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcblxuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gIGlmIChtYXliZUl0ZXJhYmxlID09PSBudWxsIHx8IHR5cGVvZiBtYXliZUl0ZXJhYmxlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcbiAgaWYgKHR5cGVvZiBtYXliZUl0ZXJhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1heWJlSXRlcmF0b3I7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogVXNlIGludmFyaWFudCgpIHRvIGFzc2VydCBzdGF0ZSB3aGljaCB5b3VyIHByb2dyYW0gYXNzdW1lcyB0byBiZSB0cnVlLlxuICpcbiAqIFByb3ZpZGUgc3ByaW50Zi1zdHlsZSBmb3JtYXQgKG9ubHkgJXMgaXMgc3VwcG9ydGVkKSBhbmQgYXJndW1lbnRzXG4gKiB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYnJva2UgYW5kIHdoYXQgeW91IHdlcmVcbiAqIGV4cGVjdGluZy5cbiAqXG4gKiBUaGUgaW52YXJpYW50IG1lc3NhZ2Ugd2lsbCBiZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGludmFyaWFudFxuICogd2lsbCByZW1haW4gdG8gZW5zdXJlIGxvZ2ljIGRvZXMgbm90IGRpZmZlciBpbiBwcm9kdWN0aW9uLlxuICovXG5cbnZhciB2YWxpZGF0ZUZvcm1hdCA9IGZ1bmN0aW9uICgpIHt9O1xuXG57XG4gIHZhbGlkYXRlRm9ybWF0ID0gZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhcmlhbnQgcmVxdWlyZXMgYW4gZXJyb3IgbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gaW52YXJpYW50KGNvbmRpdGlvbiwgZm9ybWF0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHZhbGlkYXRlRm9ybWF0KGZvcm1hdCk7XG5cbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB2YXIgZXJyb3IgPSB2b2lkIDA7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcignTWluaWZpZWQgZXhjZXB0aW9uIG9jY3VycmVkOyB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgJyArICdmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXJncyA9IFthLCBiLCBjLCBkLCBlLCBmXTtcbiAgICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcihmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgIH0pKTtcbiAgICAgIGVycm9yLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgfVxuXG4gICAgZXJyb3IuZnJhbWVzVG9Qb3AgPSAxOyAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IGludmFyaWFudCdzIG93biBmcmFtZVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8vIFJlbHlpbmcgb24gdGhlIGBpbnZhcmlhbnQoKWAgaW1wbGVtZW50YXRpb24gbGV0cyB1c1xuLy8gcHJlc2VydmUgdGhlIGZvcm1hdCBhbmQgcGFyYW1zIGluIHRoZSB3d3cgYnVpbGRzLlxuXG4vKipcbiAqIEZvcmtlZCBmcm9tIGZianMvd2FybmluZzpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mYmpzL2Jsb2IvZTY2YmEyMGFkNWJlNDMzZWI1NDQyM2YyYjA5N2Q4MjkzMjRkOWRlNi9wYWNrYWdlcy9mYmpzL3NyYy9fX2ZvcmtzX18vd2FybmluZy5qc1xuICpcbiAqIE9ubHkgY2hhbmdlIGlzIHdlIHVzZSBjb25zb2xlLndhcm4gaW5zdGVhZCBvZiBjb25zb2xlLmVycm9yLFxuICogYW5kIGRvIG5vdGhpbmcgd2hlbiAnY29uc29sZScgaXMgbm90IHN1cHBvcnRlZC5cbiAqIFRoaXMgcmVhbGx5IHNpbXBsaWZpZXMgdGhlIGNvZGUuXG4gKiAtLS1cbiAqIFNpbWlsYXIgdG8gaW52YXJpYW50IGJ1dCBvbmx5IGxvZ3MgYSB3YXJuaW5nIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldC5cbiAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gbG9nIGlzc3VlcyBpbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMgaW4gY3JpdGljYWxcbiAqIHBhdGhzLiBSZW1vdmluZyB0aGUgbG9nZ2luZyBjb2RlIGZvciBwcm9kdWN0aW9uIGVudmlyb25tZW50cyB3aWxsIGtlZXAgdGhlXG4gKiBzYW1lIGxvZ2ljIGFuZCBmb2xsb3cgdGhlIHNhbWUgY29kZSBwYXRocy5cbiAqL1xuXG52YXIgbG93UHJpb3JpdHlXYXJuaW5nID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgdmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICB9KTtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG5cbiAgbG93UHJpb3JpdHlXYXJuaW5nID0gZnVuY3Rpb24gKGNvbmRpdGlvbiwgZm9ybWF0KSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Bsb3dQcmlvcml0eVdhcm5pbmcoY29uZGl0aW9uLCBmb3JtYXQsIC4uLmFyZ3MpYCByZXF1aXJlcyBhIHdhcm5pbmcgJyArICdtZXNzYWdlIGFyZ3VtZW50Jyk7XG4gICAgfVxuICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMiA+IDIgPyBfbGVuMiAtIDIgOiAwKSwgX2tleTIgPSAyOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTIgLSAyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZy5hcHBseSh1bmRlZmluZWQsIFtmb3JtYXRdLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuICB9O1xufVxuXG52YXIgbG93UHJpb3JpdHlXYXJuaW5nJDEgPSBsb3dQcmlvcml0eVdhcm5pbmc7XG5cbi8qKlxuICogU2ltaWxhciB0byBpbnZhcmlhbnQgYnV0IG9ubHkgbG9ncyBhIHdhcm5pbmcgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byBsb2cgaXNzdWVzIGluIGRldmVsb3BtZW50IGVudmlyb25tZW50cyBpbiBjcml0aWNhbFxuICogcGF0aHMuIFJlbW92aW5nIHRoZSBsb2dnaW5nIGNvZGUgZm9yIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIHdpbGwga2VlcCB0aGVcbiAqIHNhbWUgbG9naWMgYW5kIGZvbGxvdyB0aGUgc2FtZSBjb2RlIHBhdGhzLlxuICovXG5cbnZhciB3YXJuaW5nV2l0aG91dFN0YWNrID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgd2FybmluZ1dpdGhvdXRTdGFjayA9IGZ1bmN0aW9uIChjb25kaXRpb24sIGZvcm1hdCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDIgPyBfbGVuIC0gMiA6IDApLCBfa2V5ID0gMjsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMl0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2B3YXJuaW5nV2l0aG91dFN0YWNrKGNvbmRpdGlvbiwgZm9ybWF0LCAuLi5hcmdzKWAgcmVxdWlyZXMgYSB3YXJuaW5nICcgKyAnbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgICBpZiAoYXJncy5sZW5ndGggPiA4KSB7XG4gICAgICAvLyBDaGVjayBiZWZvcmUgdGhlIGNvbmRpdGlvbiB0byBjYXRjaCB2aW9sYXRpb25zIGVhcmx5LlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YXJuaW5nV2l0aG91dFN0YWNrKCkgY3VycmVudGx5IHN1cHBvcnRzIGF0IG1vc3QgOCBhcmd1bWVudHMuJyk7XG4gICAgfVxuICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuICcnICsgaXRlbTtcbiAgICAgIH0pO1xuICAgICAgYXJnc1dpdGhGb3JtYXQudW5zaGlmdCgnV2FybmluZzogJyArIGZvcm1hdCk7XG5cbiAgICAgIC8vIFdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIHNwcmVhZCAob3IgLmFwcGx5KSBkaXJlY3RseSBiZWNhdXNlIGl0XG4gICAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlLmVycm9yLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyBmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG59XG5cbnZhciB3YXJuaW5nV2l0aG91dFN0YWNrJDEgPSB3YXJuaW5nV2l0aG91dFN0YWNrO1xuXG52YXIgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50ID0ge307XG5cbmZ1bmN0aW9uIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCBjYWxsZXJOYW1lKSB7XG4gIHtcbiAgICB2YXIgX2NvbnN0cnVjdG9yID0gcHVibGljSW5zdGFuY2UuY29uc3RydWN0b3I7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBfY29uc3RydWN0b3IgJiYgKF9jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCBfY29uc3RydWN0b3IubmFtZSkgfHwgJ1JlYWN0Q2xhc3MnO1xuICAgIHZhciB3YXJuaW5nS2V5ID0gY29tcG9uZW50TmFtZSArICcuJyArIGNhbGxlck5hbWU7XG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudFt3YXJuaW5nS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsIFwiQ2FuJ3QgY2FsbCAlcyBvbiBhIGNvbXBvbmVudCB0aGF0IGlzIG5vdCB5ZXQgbW91bnRlZC4gXCIgKyAnVGhpcyBpcyBhIG5vLW9wLCBidXQgaXQgbWlnaHQgaW5kaWNhdGUgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gJyArICdJbnN0ZWFkLCBhc3NpZ24gdG8gYHRoaXMuc3RhdGVgIGRpcmVjdGx5IG9yIGRlZmluZSBhIGBzdGF0ZSA9IHt9O2AgJyArICdjbGFzcyBwcm9wZXJ0eSB3aXRoIHRoZSBkZXNpcmVkIHN0YXRlIGluIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFtZSwgY29tcG9uZW50TmFtZSk7XG4gICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50W3dhcm5pbmdLZXldID0gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGFic3RyYWN0IEFQSSBmb3IgYW4gdXBkYXRlIHF1ZXVlLlxuICovXG52YXIgUmVhY3ROb29wVXBkYXRlUXVldWUgPSB7XG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhpcyBjb21wb3NpdGUgY29tcG9uZW50IGlzIG1vdW50ZWQuXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHdlIHdhbnQgdG8gdGVzdC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb3VudGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGZpbmFsXG4gICAqL1xuICBpc01vdW50ZWQ6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAvKipcbiAgICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICAgKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipub3QqKiBpbiBhIERPTSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICAgKiBjb21wb25lbnQncyBzdGF0ZSBoYXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC5cbiAgICpcbiAgICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICAgKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnREaWRVcGRhdGVgLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBjYWxsZXJOYW1lIG5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZUZvcmNlVXBkYXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdmb3JjZVVwZGF0ZScpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgb3IgYHNldFN0YXRlYCB0byBtdXRhdGUgc3RhdGUuXG4gICAqIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAgICpcbiAgICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc29cbiAgICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb21wbGV0ZVN0YXRlIE5leHQgc3RhdGUuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gY2FsbGVyTmFtZSBuYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVSZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY29tcGxldGVTdGF0ZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3JlcGxhY2VTdGF0ZScpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gVGhpcyBvbmx5IGV4aXN0cyBiZWNhdXNlIF9wZW5kaW5nU3RhdGUgaXNcbiAgICogaW50ZXJuYWwuIFRoaXMgcHJvdmlkZXMgYSBtZXJnaW5nIHN0cmF0ZWd5IHRoYXQgaXMgbm90IGF2YWlsYWJsZSB0byBkZWVwXG4gICAqIHByb3BlcnRpZXMgd2hpY2ggaXMgY29uZnVzaW5nLiBUT0RPOiBFeHBvc2UgcGVuZGluZ1N0YXRlIG9yIGRvbid0IHVzZSBpdFxuICAgKiBkdXJpbmcgdGhlIG1lcmdlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggc3RhdGUuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gTmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgcGFydGlhbFN0YXRlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnc2V0U3RhdGUnKTtcbiAgfVxufTtcblxudmFyIGVtcHR5T2JqZWN0ID0ge307XG57XG4gIE9iamVjdC5mcmVlemUoZW1wdHlPYmplY3QpO1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgaGVscGVycyBmb3IgdGhlIHVwZGF0aW5nIHN0YXRlIG9mIGEgY29tcG9uZW50LlxuICovXG5mdW5jdGlvbiBDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHtcbiAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAvLyBJZiBhIGNvbXBvbmVudCBoYXMgc3RyaW5nIHJlZnMsIHdlIHdpbGwgYXNzaWduIGEgZGlmZmVyZW50IG9iamVjdCBsYXRlci5cbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gIC8vIFdlIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgdXBkYXRlciBidXQgdGhlIHJlYWwgb25lIGdldHMgaW5qZWN0ZWQgYnkgdGhlXG4gIC8vIHJlbmRlcmVyLlxuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG5Db21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQgPSB7fTtcblxuLyoqXG4gKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIHRvIG11dGF0ZVxuICogc3RhdGUuIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBjYWxscyB0byBgc2V0U3RhdGVgIHdpbGwgcnVuIHN5bmNocm9ub3VzbHksXG4gKiBhcyB0aGV5IG1heSBldmVudHVhbGx5IGJlIGJhdGNoZWQgdG9nZXRoZXIuICBZb3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWxcbiAqIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBjYWxsIHRvIHNldFN0YXRlIGlzIGFjdHVhbGx5XG4gKiBjb21wbGV0ZWQuXG4gKlxuICogV2hlbiBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIHNldFN0YXRlLCBpdCB3aWxsIGJlIGNhbGxlZCBhdCBzb21lIHBvaW50IGluXG4gKiB0aGUgZnV0dXJlIChub3Qgc3luY2hyb25vdXNseSkuIEl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHVwIHRvIGRhdGVcbiAqIGNvbXBvbmVudCBhcmd1bWVudHMgKHN0YXRlLCBwcm9wcywgY29udGV4dCkuIFRoZXNlIHZhbHVlcyBjYW4gYmUgZGlmZmVyZW50XG4gKiBmcm9tIHRoaXMuKiBiZWNhdXNlIHlvdXIgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBhZnRlciByZWNlaXZlUHJvcHMgYnV0IGJlZm9yZVxuICogc2hvdWxkQ29tcG9uZW50VXBkYXRlLCBhbmQgdGhpcyBuZXcgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCB3aWxsIG5vdCB5ZXQgYmVcbiAqIGFzc2lnbmVkIHRvIHRoaXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rpb259IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgb3IgZnVuY3Rpb24gdG9cbiAqICAgICAgICBwcm9kdWNlIG5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBjdXJyZW50IHN0YXRlLlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLlxuICogQGZpbmFsXG4gKiBAcHJvdGVjdGVkXG4gKi9cbkNvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAocGFydGlhbFN0YXRlLCBjYWxsYmFjaykge1xuICAhKHR5cGVvZiBwYXJ0aWFsU3RhdGUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBwYXJ0aWFsU3RhdGUgPT09ICdmdW5jdGlvbicgfHwgcGFydGlhbFN0YXRlID09IG51bGwpID8gaW52YXJpYW50KGZhbHNlLCAnc2V0U3RhdGUoLi4uKTogdGFrZXMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcyB0byB1cGRhdGUgb3IgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMuJykgOiB2b2lkIDA7XG4gIHRoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcywgcGFydGlhbFN0YXRlLCBjYWxsYmFjaywgJ3NldFN0YXRlJyk7XG59O1xuXG4vKipcbiAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICpcbiAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICpcbiAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gKlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciB1cGRhdGUgaXMgY29tcGxldGUuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuQ29tcG9uZW50LnByb3RvdHlwZS5mb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsIGNhbGxiYWNrLCAnZm9yY2VVcGRhdGUnKTtcbn07XG5cbi8qKlxuICogRGVwcmVjYXRlZCBBUElzLiBUaGVzZSBBUElzIHVzZWQgdG8gZXhpc3Qgb24gY2xhc3NpYyBSZWFjdCBjbGFzc2VzIGJ1dCBzaW5jZVxuICogd2Ugd291bGQgbGlrZSB0byBkZXByZWNhdGUgdGhlbSwgd2UncmUgbm90IGdvaW5nIHRvIG1vdmUgdGhlbSBvdmVyIHRvIHRoaXNcbiAqIG1vZGVybiBiYXNlIGNsYXNzLiBJbnN0ZWFkLCB3ZSBkZWZpbmUgYSBnZXR0ZXIgdGhhdCB3YXJucyBpZiBpdCdzIGFjY2Vzc2VkLlxuICovXG57XG4gIHZhciBkZXByZWNhdGVkQVBJcyA9IHtcbiAgICBpc01vdW50ZWQ6IFsnaXNNb3VudGVkJywgJ0luc3RlYWQsIG1ha2Ugc3VyZSB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zIGFuZCBwZW5kaW5nIHJlcXVlc3RzIGluICcgKyAnY29tcG9uZW50V2lsbFVubW91bnQgdG8gcHJldmVudCBtZW1vcnkgbGVha3MuJ10sXG4gICAgcmVwbGFjZVN0YXRlOiBbJ3JlcGxhY2VTdGF0ZScsICdSZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIHNldFN0YXRlIGluc3RlYWQgKHNlZSAnICsgJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMzIzNikuJ11cbiAgfTtcbiAgdmFyIGRlZmluZURlcHJlY2F0aW9uV2FybmluZyA9IGZ1bmN0aW9uIChtZXRob2ROYW1lLCBpbmZvKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbXBvbmVudC5wcm90b3R5cGUsIG1ldGhvZE5hbWUsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBsb3dQcmlvcml0eVdhcm5pbmckMShmYWxzZSwgJyVzKC4uLikgaXMgZGVwcmVjYXRlZCBpbiBwbGFpbiBKYXZhU2NyaXB0IFJlYWN0IGNsYXNzZXMuICVzJywgaW5mb1swXSwgaW5mb1sxXSk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGZvciAodmFyIGZuTmFtZSBpbiBkZXByZWNhdGVkQVBJcykge1xuICAgIGlmIChkZXByZWNhdGVkQVBJcy5oYXNPd25Qcm9wZXJ0eShmbk5hbWUpKSB7XG4gICAgICBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcoZm5OYW1lLCBkZXByZWNhdGVkQVBJc1tmbk5hbWVdKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gQ29tcG9uZW50RHVtbXkoKSB7fVxuQ29tcG9uZW50RHVtbXkucHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcblxuLyoqXG4gKiBDb252ZW5pZW5jZSBjb21wb25lbnQgd2l0aCBkZWZhdWx0IHNoYWxsb3cgZXF1YWxpdHkgY2hlY2sgZm9yIHNDVS5cbiAqL1xuZnVuY3Rpb24gUHVyZUNvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIC8vIElmIGEgY29tcG9uZW50IGhhcyBzdHJpbmcgcmVmcywgd2Ugd2lsbCBhc3NpZ24gYSBkaWZmZXJlbnQgb2JqZWN0IGxhdGVyLlxuICB0aGlzLnJlZnMgPSBlbXB0eU9iamVjdDtcbiAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcbn1cblxudmFyIHB1cmVDb21wb25lbnRQcm90b3R5cGUgPSBQdXJlQ29tcG9uZW50LnByb3RvdHlwZSA9IG5ldyBDb21wb25lbnREdW1teSgpO1xucHVyZUNvbXBvbmVudFByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFB1cmVDb21wb25lbnQ7XG4vLyBBdm9pZCBhbiBleHRyYSBwcm90b3R5cGUganVtcCBmb3IgdGhlc2UgbWV0aG9kcy5cbl9hc3NpZ24ocHVyZUNvbXBvbmVudFByb3RvdHlwZSwgQ29tcG9uZW50LnByb3RvdHlwZSk7XG5wdXJlQ29tcG9uZW50UHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ID0gdHJ1ZTtcblxuLy8gYW4gaW1tdXRhYmxlIG9iamVjdCB3aXRoIGEgc2luZ2xlIG11dGFibGUgdmFsdWVcbmZ1bmN0aW9uIGNyZWF0ZVJlZigpIHtcbiAgdmFyIHJlZk9iamVjdCA9IHtcbiAgICBjdXJyZW50OiBudWxsXG4gIH07XG4gIHtcbiAgICBPYmplY3Quc2VhbChyZWZPYmplY3QpO1xuICB9XG4gIHJldHVybiByZWZPYmplY3Q7XG59XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgZGlzcGF0Y2hlci5cbiAqL1xudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHR5cGUge1JlYWN0Q29tcG9uZW50fVxuICAgKi9cbiAgY3VycmVudDogbnVsbFxufTtcblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBvd25lci5cbiAqXG4gKiBUaGUgY3VycmVudCBvd25lciBpcyB0aGUgY29tcG9uZW50IHdobyBzaG91bGQgb3duIGFueSBjb21wb25lbnRzIHRoYXQgYXJlXG4gKiBjdXJyZW50bHkgYmVpbmcgY29uc3RydWN0ZWQuXG4gKi9cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAdHlwZSB7UmVhY3RDb21wb25lbnR9XG4gICAqL1xuICBjdXJyZW50OiBudWxsXG59O1xuXG52YXIgQkVGT1JFX1NMQVNIX1JFID0gL14oLiopW1xcXFxcXC9dLztcblxudmFyIGRlc2NyaWJlQ29tcG9uZW50RnJhbWUgPSBmdW5jdGlvbiAobmFtZSwgc291cmNlLCBvd25lck5hbWUpIHtcbiAgdmFyIHNvdXJjZUluZm8gPSAnJztcbiAgaWYgKHNvdXJjZSkge1xuICAgIHZhciBwYXRoID0gc291cmNlLmZpbGVOYW1lO1xuICAgIHZhciBmaWxlTmFtZSA9IHBhdGgucmVwbGFjZShCRUZPUkVfU0xBU0hfUkUsICcnKTtcbiAgICB7XG4gICAgICAvLyBJbiBERVYsIGluY2x1ZGUgY29kZSBmb3IgYSBjb21tb24gc3BlY2lhbCBjYXNlOlxuICAgICAgLy8gcHJlZmVyIFwiZm9sZGVyL2luZGV4LmpzXCIgaW5zdGVhZCBvZiBqdXN0IFwiaW5kZXguanNcIi5cbiAgICAgIGlmICgvXmluZGV4XFwuLy50ZXN0KGZpbGVOYW1lKSkge1xuICAgICAgICB2YXIgbWF0Y2ggPSBwYXRoLm1hdGNoKEJFRk9SRV9TTEFTSF9SRSk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIHZhciBwYXRoQmVmb3JlU2xhc2ggPSBtYXRjaFsxXTtcbiAgICAgICAgICBpZiAocGF0aEJlZm9yZVNsYXNoKSB7XG4gICAgICAgICAgICB2YXIgZm9sZGVyTmFtZSA9IHBhdGhCZWZvcmVTbGFzaC5yZXBsYWNlKEJFRk9SRV9TTEFTSF9SRSwgJycpO1xuICAgICAgICAgICAgZmlsZU5hbWUgPSBmb2xkZXJOYW1lICsgJy8nICsgZmlsZU5hbWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHNvdXJjZUluZm8gPSAnIChhdCAnICsgZmlsZU5hbWUgKyAnOicgKyBzb3VyY2UubGluZU51bWJlciArICcpJztcbiAgfSBlbHNlIGlmIChvd25lck5hbWUpIHtcbiAgICBzb3VyY2VJbmZvID0gJyAoY3JlYXRlZCBieSAnICsgb3duZXJOYW1lICsgJyknO1xuICB9XG4gIHJldHVybiAnXFxuICAgIGluICcgKyAobmFtZSB8fCAnVW5rbm93bicpICsgc291cmNlSW5mbztcbn07XG5cbnZhciBSZXNvbHZlZCA9IDE7XG5cblxuZnVuY3Rpb24gcmVmaW5lUmVzb2x2ZWRMYXp5Q29tcG9uZW50KGxhenlDb21wb25lbnQpIHtcbiAgcmV0dXJuIGxhenlDb21wb25lbnQuX3N0YXR1cyA9PT0gUmVzb2x2ZWQgPyBsYXp5Q29tcG9uZW50Ll9yZXN1bHQgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRXcmFwcGVkTmFtZShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIG91dGVyVHlwZS5kaXNwbGF5TmFtZSB8fCAoZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgJygnICsgZnVuY3Rpb25OYW1lICsgJyknIDogd3JhcHBlck5hbWUpO1xufVxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHtcbiAgICBpZiAodHlwZW9mIHR5cGUudGFnID09PSAnbnVtYmVyJykge1xuICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZSgpLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gIH1cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU6XG4gICAgICByZXR1cm4gJ0NvbmN1cnJlbnRNb2RlJztcbiAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcbiAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7XG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG4gIH1cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgIHJldHVybiAnQ29udGV4dC5Db25zdW1lcic7XG4gICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgIHJldHVybiAnQ29udGV4dC5Qcm92aWRlcic7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBnZXRXcmFwcGVkTmFtZSh0eXBlLCB0eXBlLnJlbmRlciwgJ0ZvcndhcmRSZWYnKTtcbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZSh0eXBlLnR5cGUpO1xuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgdGhlbmFibGUgPSB0eXBlO1xuICAgICAgICAgIHZhciByZXNvbHZlZFRoZW5hYmxlID0gcmVmaW5lUmVzb2x2ZWRMYXp5Q29tcG9uZW50KHRoZW5hYmxlKTtcbiAgICAgICAgICBpZiAocmVzb2x2ZWRUaGVuYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUocmVzb2x2ZWRUaGVuYWJsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IHt9O1xuXG52YXIgY3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQgPSBudWxsO1xuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KSB7XG4gIHtcbiAgICBjdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCA9IGVsZW1lbnQ7XG4gIH1cbn1cblxue1xuICAvLyBTdGFjayBpbXBsZW1lbnRhdGlvbiBpbmplY3RlZCBieSB0aGUgY3VycmVudCByZW5kZXJlci5cbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2sgPSBudWxsO1xuXG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhY2sgPSAnJztcblxuICAgIC8vIEFkZCBhbiBleHRyYSB0b3AgZnJhbWUgd2hpbGUgYW4gZWxlbWVudCBpcyBiZWluZyB2YWxpZGF0ZWRcbiAgICBpZiAoY3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQpIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudC50eXBlKTtcbiAgICAgIHZhciBvd25lciA9IGN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50Ll9vd25lcjtcbiAgICAgIHN0YWNrICs9IGRlc2NyaWJlQ29tcG9uZW50RnJhbWUobmFtZSwgY3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQuX3NvdXJjZSwgb3duZXIgJiYgZ2V0Q29tcG9uZW50TmFtZShvd25lci50eXBlKSk7XG4gICAgfVxuXG4gICAgLy8gRGVsZWdhdGUgdG8gdGhlIGluamVjdGVkIHJlbmRlcmVyLXNwZWNpZmljIGltcGxlbWVudGF0aW9uXG4gICAgdmFyIGltcGwgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjaztcbiAgICBpZiAoaW1wbCkge1xuICAgICAgc3RhY2sgKz0gaW1wbCgpIHx8ICcnO1xuICAgIH1cblxuICAgIHJldHVybiBzdGFjaztcbiAgfTtcbn1cblxudmFyIFJlYWN0U2hhcmVkSW50ZXJuYWxzID0ge1xuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyOiBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICBSZWFjdEN1cnJlbnRPd25lcjogUmVhY3RDdXJyZW50T3duZXIsXG4gIC8vIFVzZWQgYnkgcmVuZGVyZXJzIHRvIGF2b2lkIGJ1bmRsaW5nIG9iamVjdC1hc3NpZ24gdHdpY2UgaW4gVU1EIGJ1bmRsZXM6XG4gIGFzc2lnbjogX2Fzc2lnblxufTtcblxue1xuICBfYXNzaWduKFJlYWN0U2hhcmVkSW50ZXJuYWxzLCB7XG4gICAgLy8gVGhlc2Ugc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiBwcm9kdWN0aW9uLlxuICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWU6IFJlYWN0RGVidWdDdXJyZW50RnJhbWUsXG4gICAgLy8gU2hpbSBmb3IgUmVhY3QgRE9NIDE2LjAuMCB3aGljaCBzdGlsbCBkZXN0cnVjdHVyZWQgKGJ1dCBub3QgdXNlZCkgdGhpcy5cbiAgICAvLyBUT0RPOiByZW1vdmUgaW4gUmVhY3QgMTcuMC5cbiAgICBSZWFjdENvbXBvbmVudFRyZWVIb29rOiB7fVxuICB9KTtcbn1cblxuLyoqXG4gKiBTaW1pbGFyIHRvIGludmFyaWFudCBidXQgb25seSBsb2dzIGEgd2FybmluZyBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBtZXQuXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGxvZyBpc3N1ZXMgaW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzIGluIGNyaXRpY2FsXG4gKiBwYXRocy4gUmVtb3ZpbmcgdGhlIGxvZ2dpbmcgY29kZSBmb3IgcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMgd2lsbCBrZWVwIHRoZVxuICogc2FtZSBsb2dpYyBhbmQgZm9sbG93IHRoZSBzYW1lIGNvZGUgcGF0aHMuXG4gKi9cblxudmFyIHdhcm5pbmcgPSB3YXJuaW5nV2l0aG91dFN0YWNrJDE7XG5cbntcbiAgd2FybmluZyA9IGZ1bmN0aW9uIChjb25kaXRpb24sIGZvcm1hdCkge1xuICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC93YXJuaW5nLWFuZC1pbnZhcmlhbnQtYXJnc1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMiA/IF9sZW4gLSAyIDogMCksIF9rZXkgPSAyOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAyXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEuYXBwbHkodW5kZWZpbmVkLCBbZmFsc2UsIGZvcm1hdCArICclcyddLmNvbmNhdChhcmdzLCBbc3RhY2tdKSk7XG4gIH07XG59XG5cbnZhciB3YXJuaW5nJDEgPSB3YXJuaW5nO1xuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgUkVTRVJWRURfUFJPUFMgPSB7XG4gIGtleTogdHJ1ZSxcbiAgcmVmOiB0cnVlLFxuICBfX3NlbGY6IHRydWUsXG4gIF9fc291cmNlOiB0cnVlXG59O1xuXG52YXIgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24gPSB2b2lkIDA7XG52YXIgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24gPSB2b2lkIDA7XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkUmVmKGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAncmVmJykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ3JlZicpLmdldDtcbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbmZpZy5yZWYgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRLZXkoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdrZXknKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAna2V5JykuZ2V0O1xuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY29uZmlnLmtleSAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ0tleSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duKSB7XG4gICAgICBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9IHRydWU7XG4gICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICclczogYGtleWAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vZmIubWUvcmVhY3Qtc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgfVxuICB9O1xuICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdrZXknLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdLZXksXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ1JlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duKSB7XG4gICAgICBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biA9IHRydWU7XG4gICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICclczogYHJlZmAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vZmIubWUvcmVhY3Qtc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgfVxuICB9O1xuICB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdyZWYnLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBSZWFjdCBlbGVtZW50LiBUaGlzIG5vIGxvbmdlciBhZGhlcmVzIHRvXG4gKiB0aGUgY2xhc3MgcGF0dGVybiwgc28gZG8gbm90IHVzZSBuZXcgdG8gY2FsbCBpdC4gQWxzbywgbm8gaW5zdGFuY2VvZiBjaGVja1xuICogd2lsbCB3b3JrLiBJbnN0ZWFkIHRlc3QgJCR0eXBlb2YgZmllbGQgYWdhaW5zdCBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgdG8gY2hlY2tcbiAqIGlmIHNvbWV0aGluZyBpcyBhIFJlYWN0IEVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHsqfSB0eXBlXG4gKiBAcGFyYW0geyp9IGtleVxuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSByZWZcbiAqIEBwYXJhbSB7Kn0gc2VsZiBBICp0ZW1wb3JhcnkqIGhlbHBlciB0byBkZXRlY3QgcGxhY2VzIHdoZXJlIGB0aGlzYCBpc1xuICogZGlmZmVyZW50IGZyb20gdGhlIGBvd25lcmAgd2hlbiBSZWFjdC5jcmVhdGVFbGVtZW50IGlzIGNhbGxlZCwgc28gdGhhdCB3ZVxuICogY2FuIHdhcm4uIFdlIHdhbnQgdG8gZ2V0IHJpZCBvZiBvd25lciBhbmQgcmVwbGFjZSBzdHJpbmcgYHJlZmBzIHdpdGggYXJyb3dcbiAqIGZ1bmN0aW9ucywgYW5kIGFzIGxvbmcgYXMgYHRoaXNgIGFuZCBvd25lciBhcmUgdGhlIHNhbWUsIHRoZXJlIHdpbGwgYmUgbm9cbiAqIGNoYW5nZSBpbiBiZWhhdmlvci5cbiAqIEBwYXJhbSB7Kn0gc291cmNlIEFuIGFubm90YXRpb24gb2JqZWN0IChhZGRlZCBieSBhIHRyYW5zcGlsZXIgb3Igb3RoZXJ3aXNlKVxuICogaW5kaWNhdGluZyBmaWxlbmFtZSwgbGluZSBudW1iZXIsIGFuZC9vciBvdGhlciBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSB7Kn0gb3duZXJcbiAqIEBwYXJhbSB7Kn0gcHJvcHNcbiAqIEBpbnRlcm5hbFxuICovXG52YXIgUmVhY3RFbGVtZW50ID0gZnVuY3Rpb24gKHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcykge1xuICB2YXIgZWxlbWVudCA9IHtcbiAgICAvLyBUaGlzIHRhZyBhbGxvd3MgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IEVsZW1lbnRcbiAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuXG4gICAgLy8gQnVpbHQtaW4gcHJvcGVydGllcyB0aGF0IGJlbG9uZyBvbiB0aGUgZWxlbWVudFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXksXG4gICAgcmVmOiByZWYsXG4gICAgcHJvcHM6IHByb3BzLFxuXG4gICAgLy8gUmVjb3JkIHRoZSBjb21wb25lbnQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgZWxlbWVudC5cbiAgICBfb3duZXI6IG93bmVyXG4gIH07XG5cbiAge1xuICAgIC8vIFRoZSB2YWxpZGF0aW9uIGZsYWcgaXMgY3VycmVudGx5IG11dGF0aXZlLiBXZSBwdXQgaXQgb25cbiAgICAvLyBhbiBleHRlcm5hbCBiYWNraW5nIHN0b3JlIHNvIHRoYXQgd2UgY2FuIGZyZWV6ZSB0aGUgd2hvbGUgb2JqZWN0LlxuICAgIC8vIFRoaXMgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBXZWFrTWFwIG9uY2UgdGhleSBhcmUgaW1wbGVtZW50ZWQgaW5cbiAgICAvLyBjb21tb25seSB1c2VkIGRldmVsb3BtZW50IGVudmlyb25tZW50cy5cbiAgICBlbGVtZW50Ll9zdG9yZSA9IHt9O1xuXG4gICAgLy8gVG8gbWFrZSBjb21wYXJpbmcgUmVhY3RFbGVtZW50cyBlYXNpZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHdlIG1ha2VcbiAgICAvLyB0aGUgdmFsaWRhdGlvbiBmbGFnIG5vbi1lbnVtZXJhYmxlICh3aGVyZSBwb3NzaWJsZSwgd2hpY2ggc2hvdWxkXG4gICAgLy8gaW5jbHVkZSBldmVyeSBlbnZpcm9ubWVudCB3ZSBydW4gdGVzdHMgaW4pLCBzbyB0aGUgdGVzdCBmcmFtZXdvcmtcbiAgICAvLyBpZ25vcmVzIGl0LlxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50Ll9zdG9yZSwgJ3ZhbGlkYXRlZCcsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGZhbHNlXG4gICAgfSk7XG4gICAgLy8gc2VsZiBhbmQgc291cmNlIGFyZSBERVYgb25seSBwcm9wZXJ0aWVzLlxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NlbGYnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc2VsZlxuICAgIH0pO1xuICAgIC8vIFR3byBlbGVtZW50cyBjcmVhdGVkIGluIHR3byBkaWZmZXJlbnQgcGxhY2VzIHNob3VsZCBiZSBjb25zaWRlcmVkXG4gICAgLy8gZXF1YWwgZm9yIHRlc3RpbmcgcHVycG9zZXMgYW5kIHRoZXJlZm9yZSB3ZSBoaWRlIGl0IGZyb20gZW51bWVyYXRpb24uXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc291cmNlJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNvdXJjZVxuICAgIH0pO1xuICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQucHJvcHMpO1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IG9mIHRoZSBnaXZlbiB0eXBlLlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjcmVhdGVlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodHlwZSwgY29uZmlnLCBjaGlsZHJlbikge1xuICB2YXIgcHJvcE5hbWUgPSB2b2lkIDA7XG5cbiAgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuICB2YXIgcHJvcHMgPSB7fTtcblxuICB2YXIga2V5ID0gbnVsbDtcbiAgdmFyIHJlZiA9IG51bGw7XG4gIHZhciBzZWxmID0gbnVsbDtcbiAgdmFyIHNvdXJjZSA9IG51bGw7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIHJlZiA9IGNvbmZpZy5yZWY7XG4gICAgfVxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfVxuXG4gICAgc2VsZiA9IGNvbmZpZy5fX3NlbGYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zZWxmO1xuICAgIHNvdXJjZSA9IGNvbmZpZy5fX3NvdXJjZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbmZpZy5fX3NvdXJjZTtcbiAgICAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gYSBuZXcgcHJvcHMgb2JqZWN0XG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvXG4gIC8vIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0LlxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cbiAgICB7XG4gICAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgICBPYmplY3QuZnJlZXplKGNoaWxkQXJyYXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gIH1cblxuICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcbiAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7XG4gICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB7XG4gICAgaWYgKGtleSB8fCByZWYpIHtcbiAgICAgIHZhciBkaXNwbGF5TmFtZSA9IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nID8gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgJ1Vua25vd24nIDogdHlwZTtcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFJlYWN0RWxlbWVudCh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LCBwcm9wcyk7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBSZWFjdEVsZW1lbnRzIG9mIGEgZ2l2ZW4gdHlwZS5cbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjY3JlYXRlZmFjdG9yeVxuICovXG5cblxuZnVuY3Rpb24gY2xvbmVBbmRSZXBsYWNlS2V5KG9sZEVsZW1lbnQsIG5ld0tleSkge1xuICB2YXIgbmV3RWxlbWVudCA9IFJlYWN0RWxlbWVudChvbGRFbGVtZW50LnR5cGUsIG5ld0tleSwgb2xkRWxlbWVudC5yZWYsIG9sZEVsZW1lbnQuX3NlbGYsIG9sZEVsZW1lbnQuX3NvdXJjZSwgb2xkRWxlbWVudC5fb3duZXIsIG9sZEVsZW1lbnQucHJvcHMpO1xuXG4gIHJldHVybiBuZXdFbGVtZW50O1xufVxuXG4vKipcbiAqIENsb25lIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IHVzaW5nIGVsZW1lbnQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjbG9uZWVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gY2xvbmVFbGVtZW50KGVsZW1lbnQsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgISEoZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB1bmRlZmluZWQpID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3QuY2xvbmVFbGVtZW50KC4uLik6IFRoZSBhcmd1bWVudCBtdXN0IGJlIGEgUmVhY3QgZWxlbWVudCwgYnV0IHlvdSBwYXNzZWQgJXMuJywgZWxlbWVudCkgOiB2b2lkIDA7XG5cbiAgdmFyIHByb3BOYW1lID0gdm9pZCAwO1xuXG4gIC8vIE9yaWdpbmFsIHByb3BzIGFyZSBjb3BpZWRcbiAgdmFyIHByb3BzID0gX2Fzc2lnbih7fSwgZWxlbWVudC5wcm9wcyk7XG5cbiAgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gIHZhciByZWYgPSBlbGVtZW50LnJlZjtcbiAgLy8gU2VsZiBpcyBwcmVzZXJ2ZWQgc2luY2UgdGhlIG93bmVyIGlzIHByZXNlcnZlZC5cbiAgdmFyIHNlbGYgPSBlbGVtZW50Ll9zZWxmO1xuICAvLyBTb3VyY2UgaXMgcHJlc2VydmVkIHNpbmNlIGNsb25lRWxlbWVudCBpcyB1bmxpa2VseSB0byBiZSB0YXJnZXRlZCBieSBhXG4gIC8vIHRyYW5zcGlsZXIsIGFuZCB0aGUgb3JpZ2luYWwgc291cmNlIGlzIHByb2JhYmx5IGEgYmV0dGVyIGluZGljYXRvciBvZiB0aGVcbiAgLy8gdHJ1ZSBvd25lci5cbiAgdmFyIHNvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcblxuICAvLyBPd25lciB3aWxsIGJlIHByZXNlcnZlZCwgdW5sZXNzIHJlZiBpcyBvdmVycmlkZGVuXG4gIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuXG4gIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgIGlmIChoYXNWYWxpZFJlZihjb25maWcpKSB7XG4gICAgICAvLyBTaWxlbnRseSBzdGVhbCB0aGUgcmVmIGZyb20gdGhlIHBhcmVudC5cbiAgICAgIHJlZiA9IGNvbmZpZy5yZWY7XG4gICAgICBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ7XG4gICAgfVxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfVxuXG4gICAgLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgb3ZlcnJpZGUgZXhpc3RpbmcgcHJvcHNcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gdm9pZCAwO1xuICAgIGlmIChlbGVtZW50LnR5cGUgJiYgZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcykge1xuICAgICAgZGVmYXVsdFByb3BzID0gZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcztcbiAgICB9XG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgaWYgKGNvbmZpZ1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgfVxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfVxuXG4gIHJldHVybiBSZWFjdEVsZW1lbnQoZWxlbWVudC50eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpO1xufVxuXG4vKipcbiAqIFZlcmlmaWVzIHRoZSBvYmplY3QgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2lzdmFsaWRlbGVtZW50XG4gKiBAcGFyYW0gez9vYmplY3R9IG9iamVjdFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgb2JqZWN0YCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIEBmaW5hbFxuICovXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cblxudmFyIFNFUEFSQVRPUiA9ICcuJztcbnZhciBTVUJTRVBBUkFUT1IgPSAnOic7XG5cbi8qKlxuICogRXNjYXBlIGFuZCB3cmFwIGtleSBzbyBpdCBpcyBzYWZlIHRvIHVzZSBhcyBhIHJlYWN0aWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRvIGJlIGVzY2FwZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBlc2NhcGVkIGtleS5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlKGtleSkge1xuICB2YXIgZXNjYXBlUmVnZXggPSAvWz06XS9nO1xuICB2YXIgZXNjYXBlckxvb2t1cCA9IHtcbiAgICAnPSc6ICc9MCcsXG4gICAgJzonOiAnPTInXG4gIH07XG4gIHZhciBlc2NhcGVkU3RyaW5nID0gKCcnICsga2V5KS5yZXBsYWNlKGVzY2FwZVJlZ2V4LCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICByZXR1cm4gZXNjYXBlckxvb2t1cFttYXRjaF07XG4gIH0pO1xuXG4gIHJldHVybiAnJCcgKyBlc2NhcGVkU3RyaW5nO1xufVxuXG4vKipcbiAqIFRPRE86IFRlc3QgdGhhdCBhIHNpbmdsZSBjaGlsZCBhbmQgYW4gYXJyYXkgd2l0aCBvbmUgaXRlbSBoYXZlIHRoZSBzYW1lIGtleVxuICogcGF0dGVybi5cbiAqL1xuXG52YXIgZGlkV2FybkFib3V0TWFwcyA9IGZhbHNlO1xuXG52YXIgdXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXggPSAvXFwvKy9nO1xuZnVuY3Rpb24gZXNjYXBlVXNlclByb3ZpZGVkS2V5KHRleHQpIHtcbiAgcmV0dXJuICgnJyArIHRleHQpLnJlcGxhY2UodXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXgsICckJi8nKTtcbn1cblxudmFyIFBPT0xfU0laRSA9IDEwO1xudmFyIHRyYXZlcnNlQ29udGV4dFBvb2wgPSBbXTtcbmZ1bmN0aW9uIGdldFBvb2xlZFRyYXZlcnNlQ29udGV4dChtYXBSZXN1bHQsIGtleVByZWZpeCwgbWFwRnVuY3Rpb24sIG1hcENvbnRleHQpIHtcbiAgaWYgKHRyYXZlcnNlQ29udGV4dFBvb2wubGVuZ3RoKSB7XG4gICAgdmFyIHRyYXZlcnNlQ29udGV4dCA9IHRyYXZlcnNlQ29udGV4dFBvb2wucG9wKCk7XG4gICAgdHJhdmVyc2VDb250ZXh0LnJlc3VsdCA9IG1hcFJlc3VsdDtcbiAgICB0cmF2ZXJzZUNvbnRleHQua2V5UHJlZml4ID0ga2V5UHJlZml4O1xuICAgIHRyYXZlcnNlQ29udGV4dC5mdW5jID0gbWFwRnVuY3Rpb247XG4gICAgdHJhdmVyc2VDb250ZXh0LmNvbnRleHQgPSBtYXBDb250ZXh0O1xuICAgIHRyYXZlcnNlQ29udGV4dC5jb3VudCA9IDA7XG4gICAgcmV0dXJuIHRyYXZlcnNlQ29udGV4dDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdWx0OiBtYXBSZXN1bHQsXG4gICAgICBrZXlQcmVmaXg6IGtleVByZWZpeCxcbiAgICAgIGZ1bmM6IG1hcEZ1bmN0aW9uLFxuICAgICAgY29udGV4dDogbWFwQ29udGV4dCxcbiAgICAgIGNvdW50OiAwXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWxlYXNlVHJhdmVyc2VDb250ZXh0KHRyYXZlcnNlQ29udGV4dCkge1xuICB0cmF2ZXJzZUNvbnRleHQucmVzdWx0ID0gbnVsbDtcbiAgdHJhdmVyc2VDb250ZXh0LmtleVByZWZpeCA9IG51bGw7XG4gIHRyYXZlcnNlQ29udGV4dC5mdW5jID0gbnVsbDtcbiAgdHJhdmVyc2VDb250ZXh0LmNvbnRleHQgPSBudWxsO1xuICB0cmF2ZXJzZUNvbnRleHQuY291bnQgPSAwO1xuICBpZiAodHJhdmVyc2VDb250ZXh0UG9vbC5sZW5ndGggPCBQT09MX1NJWkUpIHtcbiAgICB0cmF2ZXJzZUNvbnRleHRQb29sLnB1c2godHJhdmVyc2VDb250ZXh0KTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHshc3RyaW5nfSBuYW1lU29GYXIgTmFtZSBvZiB0aGUga2V5IHBhdGggc28gZmFyLlxuICogQHBhcmFtIHshZnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIHRvIGludm9rZSB3aXRoIGVhY2ggY2hpbGQgZm91bmQuXG4gKiBAcGFyYW0gez8qfSB0cmF2ZXJzZUNvbnRleHQgVXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRocm91Z2hvdXQgdGhlIHRyYXZlcnNhbFxuICogcHJvY2Vzcy5cbiAqIEByZXR1cm4geyFudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhpcyBzdWJ0cmVlLlxuICovXG5mdW5jdGlvbiB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZHJlbiwgbmFtZVNvRmFyLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGNoaWxkcmVuO1xuXG4gIGlmICh0eXBlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAvLyBBbGwgb2YgdGhlIGFib3ZlIGFyZSBwZXJjZWl2ZWQgYXMgbnVsbC5cbiAgICBjaGlsZHJlbiA9IG51bGw7XG4gIH1cblxuICB2YXIgaW52b2tlQ2FsbGJhY2sgPSBmYWxzZTtcblxuICBpZiAoY2hpbGRyZW4gPT09IG51bGwpIHtcbiAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHN3aXRjaCAoY2hpbGRyZW4uJCR0eXBlb2YpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGludm9rZUNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sodHJhdmVyc2VDb250ZXh0LCBjaGlsZHJlbixcbiAgICAvLyBJZiBpdCdzIHRoZSBvbmx5IGNoaWxkLCB0cmVhdCB0aGUgbmFtZSBhcyBpZiBpdCB3YXMgd3JhcHBlZCBpbiBhbiBhcnJheVxuICAgIC8vIHNvIHRoYXQgaXQncyBjb25zaXN0ZW50IGlmIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gZ3Jvd3MuXG4gICAgbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiArIGdldENvbXBvbmVudEtleShjaGlsZHJlbiwgMCkgOiBuYW1lU29GYXIpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgdmFyIGNoaWxkID0gdm9pZCAwO1xuICB2YXIgbmV4dE5hbWUgPSB2b2lkIDA7XG4gIHZhciBzdWJ0cmVlQ291bnQgPSAwOyAvLyBDb3VudCBvZiBjaGlsZHJlbiBmb3VuZCBpbiB0aGUgY3VycmVudCBzdWJ0cmVlLlxuICB2YXIgbmV4dE5hbWVQcmVmaXggPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SIDogbmFtZVNvRmFyICsgU1VCU0VQQVJBVE9SO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkLCBpKTtcbiAgICAgIHN1YnRyZWVDb3VudCArPSB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZCwgbmV4dE5hbWUsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4oY2hpbGRyZW4pO1xuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAge1xuICAgICAgICAvLyBXYXJuIGFib3V0IHVzaW5nIE1hcHMgYXMgY2hpbGRyZW5cbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4gPT09IGNoaWxkcmVuLmVudHJpZXMpIHtcbiAgICAgICAgICAhZGlkV2FybkFib3V0TWFwcyA/IHdhcm5pbmckMShmYWxzZSwgJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgdW5zdXBwb3J0ZWQgYW5kIHdpbGwgbGlrZWx5IHlpZWxkICcgKyAndW5leHBlY3RlZCByZXN1bHRzLiBDb252ZXJ0IGl0IHRvIGEgc2VxdWVuY2UvaXRlcmFibGUgb2Yga2V5ZWQgJyArICdSZWFjdEVsZW1lbnRzIGluc3RlYWQuJykgOiB2b2lkIDA7XG4gICAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGNoaWxkcmVuKTtcbiAgICAgIHZhciBzdGVwID0gdm9pZCAwO1xuICAgICAgdmFyIGlpID0gMDtcbiAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgY2hpbGQgPSBzdGVwLnZhbHVlO1xuICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkLCBpaSsrKTtcbiAgICAgICAgc3VidHJlZUNvdW50ICs9IHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkLCBuZXh0TmFtZSwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIGFkZGVuZHVtID0gJyc7XG4gICAgICB7XG4gICAgICAgIGFkZGVuZHVtID0gJyBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5ICcgKyAnaW5zdGVhZC4nICsgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKCk7XG4gICAgICB9XG4gICAgICB2YXIgY2hpbGRyZW5TdHJpbmcgPSAnJyArIGNoaWxkcmVuO1xuICAgICAgaW52YXJpYW50KGZhbHNlLCAnT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiAlcykuJXMnLCBjaGlsZHJlblN0cmluZyA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKGNoaWxkcmVuKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRyZW5TdHJpbmcsIGFkZGVuZHVtKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3VidHJlZUNvdW50O1xufVxuXG4vKipcbiAqIFRyYXZlcnNlcyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAsIGJ1dFxuICogbWlnaHQgYWxzbyBiZSBzcGVjaWZpZWQgdGhyb3VnaCBhdHRyaWJ1dGVzOlxuICpcbiAqIC0gYHRyYXZlcnNlQWxsQ2hpbGRyZW4odGhpcy5wcm9wcy5jaGlsZHJlbiwgLi4uKWBcbiAqIC0gYHRyYXZlcnNlQWxsQ2hpbGRyZW4odGhpcy5wcm9wcy5sZWZ0UGFuZWxDaGlsZHJlbiwgLi4uKWBcbiAqXG4gKiBUaGUgYHRyYXZlcnNlQ29udGV4dGAgaXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdGhyb3VnaCB0aGVcbiAqIGVudGlyZSB0cmF2ZXJzYWwuIEl0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIGFjY3VtdWxhdGlvbnMgb3IgYW55dGhpbmcgZWxzZSB0aGF0XG4gKiB0aGUgY2FsbGJhY2sgbWlnaHQgZmluZCByZWxldmFudC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIG9iamVjdC5cbiAqIEBwYXJhbSB7IWZ1bmN0aW9ufSBjYWxsYmFjayBUbyBpbnZva2UgdXBvbiB0cmF2ZXJzaW5nIGVhY2ggY2hpbGQuXG4gKiBAcGFyYW0gez8qfSB0cmF2ZXJzZUNvbnRleHQgQ29udGV4dCBmb3IgdHJhdmVyc2FsLlxuICogQHJldHVybiB7IW51bWJlcn0gVGhlIG51bWJlciBvZiBjaGlsZHJlbiBpbiB0aGlzIHN1YnRyZWUuXG4gKi9cbmZ1bmN0aW9uIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZHJlbiwgJycsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEga2V5IHN0cmluZyB0aGF0IGlkZW50aWZpZXMgYSBjb21wb25lbnQgd2l0aGluIGEgc2V0LlxuICpcbiAqIEBwYXJhbSB7Kn0gY29tcG9uZW50IEEgY29tcG9uZW50IHRoYXQgY291bGQgY29udGFpbiBhIG1hbnVhbCBrZXkuXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggdGhhdCBpcyB1c2VkIGlmIGEgbWFudWFsIGtleSBpcyBub3QgcHJvdmlkZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldENvbXBvbmVudEtleShjb21wb25lbnQsIGluZGV4KSB7XG4gIC8vIERvIHNvbWUgdHlwZWNoZWNraW5nIGhlcmUgc2luY2Ugd2UgY2FsbCB0aGlzIGJsaW5kbHkuIFdlIHdhbnQgdG8gZW5zdXJlXG4gIC8vIHRoYXQgd2UgZG9uJ3QgYmxvY2sgcG90ZW50aWFsIGZ1dHVyZSBFUyBBUElzLlxuICBpZiAodHlwZW9mIGNvbXBvbmVudCA9PT0gJ29iamVjdCcgJiYgY29tcG9uZW50ICE9PSBudWxsICYmIGNvbXBvbmVudC5rZXkgIT0gbnVsbCkge1xuICAgIC8vIEV4cGxpY2l0IGtleVxuICAgIHJldHVybiBlc2NhcGUoY29tcG9uZW50LmtleSk7XG4gIH1cbiAgLy8gSW1wbGljaXQga2V5IGRldGVybWluZWQgYnkgdGhlIGluZGV4IGluIHRoZSBzZXRcbiAgcmV0dXJuIGluZGV4LnRvU3RyaW5nKDM2KTtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaFNpbmdsZUNoaWxkKGJvb2tLZWVwaW5nLCBjaGlsZCwgbmFtZSkge1xuICB2YXIgZnVuYyA9IGJvb2tLZWVwaW5nLmZ1bmMsXG4gICAgICBjb250ZXh0ID0gYm9va0tlZXBpbmcuY29udGV4dDtcblxuICBmdW5jLmNhbGwoY29udGV4dCwgY2hpbGQsIGJvb2tLZWVwaW5nLmNvdW50KyspO1xufVxuXG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmZvcmVhY2hcbiAqXG4gKiBUaGUgcHJvdmlkZWQgZm9yRWFjaEZ1bmMoY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZm9yRWFjaEZ1bmNcbiAqIEBwYXJhbSB7Kn0gZm9yRWFjaENvbnRleHQgQ29udGV4dCBmb3IgZm9yRWFjaENvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG4gIHZhciB0cmF2ZXJzZUNvbnRleHQgPSBnZXRQb29sZWRUcmF2ZXJzZUNvbnRleHQobnVsbCwgbnVsbCwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KTtcbiAgdHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaFNpbmdsZUNoaWxkLCB0cmF2ZXJzZUNvbnRleHQpO1xuICByZWxlYXNlVHJhdmVyc2VDb250ZXh0KHRyYXZlcnNlQ29udGV4dCk7XG59XG5cbmZ1bmN0aW9uIG1hcFNpbmdsZUNoaWxkSW50b0NvbnRleHQoYm9va0tlZXBpbmcsIGNoaWxkLCBjaGlsZEtleSkge1xuICB2YXIgcmVzdWx0ID0gYm9va0tlZXBpbmcucmVzdWx0LFxuICAgICAga2V5UHJlZml4ID0gYm9va0tlZXBpbmcua2V5UHJlZml4LFxuICAgICAgZnVuYyA9IGJvb2tLZWVwaW5nLmZ1bmMsXG4gICAgICBjb250ZXh0ID0gYm9va0tlZXBpbmcuY29udGV4dDtcblxuXG4gIHZhciBtYXBwZWRDaGlsZCA9IGZ1bmMuY2FsbChjb250ZXh0LCBjaGlsZCwgYm9va0tlZXBpbmcuY291bnQrKyk7XG4gIGlmIChBcnJheS5pc0FycmF5KG1hcHBlZENoaWxkKSkge1xuICAgIG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWwobWFwcGVkQ2hpbGQsIHJlc3VsdCwgY2hpbGRLZXksIGZ1bmN0aW9uIChjKSB7XG4gICAgICByZXR1cm4gYztcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChtYXBwZWRDaGlsZCAhPSBudWxsKSB7XG4gICAgaWYgKGlzVmFsaWRFbGVtZW50KG1hcHBlZENoaWxkKSkge1xuICAgICAgbWFwcGVkQ2hpbGQgPSBjbG9uZUFuZFJlcGxhY2VLZXkobWFwcGVkQ2hpbGQsXG4gICAgICAvLyBLZWVwIGJvdGggdGhlIChtYXBwZWQpIGFuZCBvbGQga2V5cyBpZiB0aGV5IGRpZmZlciwganVzdCBhc1xuICAgICAgLy8gdHJhdmVyc2VBbGxDaGlsZHJlbiB1c2VkIHRvIGRvIGZvciBvYmplY3RzIGFzIGNoaWxkcmVuXG4gICAgICBrZXlQcmVmaXggKyAobWFwcGVkQ2hpbGQua2V5ICYmICghY2hpbGQgfHwgY2hpbGQua2V5ICE9PSBtYXBwZWRDaGlsZC5rZXkpID8gZXNjYXBlVXNlclByb3ZpZGVkS2V5KG1hcHBlZENoaWxkLmtleSkgKyAnLycgOiAnJykgKyBjaGlsZEtleSk7XG4gICAgfVxuICAgIHJlc3VsdC5wdXNoKG1hcHBlZENoaWxkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXBJbnRvV2l0aEtleVByZWZpeEludGVybmFsKGNoaWxkcmVuLCBhcnJheSwgcHJlZml4LCBmdW5jLCBjb250ZXh0KSB7XG4gIHZhciBlc2NhcGVkUHJlZml4ID0gJyc7XG4gIGlmIChwcmVmaXggIT0gbnVsbCkge1xuICAgIGVzY2FwZWRQcmVmaXggPSBlc2NhcGVVc2VyUHJvdmlkZWRLZXkocHJlZml4KSArICcvJztcbiAgfVxuICB2YXIgdHJhdmVyc2VDb250ZXh0ID0gZ2V0UG9vbGVkVHJhdmVyc2VDb250ZXh0KGFycmF5LCBlc2NhcGVkUHJlZml4LCBmdW5jLCBjb250ZXh0KTtcbiAgdHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgbWFwU2luZ2xlQ2hpbGRJbnRvQ29udGV4dCwgdHJhdmVyc2VDb250ZXh0KTtcbiAgcmVsZWFzZVRyYXZlcnNlQ29udGV4dCh0cmF2ZXJzZUNvbnRleHQpO1xufVxuXG4vKipcbiAqIE1hcHMgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbm1hcFxuICpcbiAqIFRoZSBwcm92aWRlZCBtYXBGdW5jdGlvbihjaGlsZCwga2V5LCBpbmRleCkgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2hcbiAqIGxlYWYgY2hpbGQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZ1bmMgVGhlIG1hcCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBDb250ZXh0IGZvciBtYXBGdW5jdGlvbi5cbiAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yZGVyZWQgbWFwIG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jLCBjb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5hbChjaGlsZHJlbiwgcmVzdWx0LCBudWxsLCBmdW5jLCBjb250ZXh0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb3VudCB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXNcbiAqIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVuY291bnRcbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiBjaGlsZHJlbi5cbiAqL1xuZnVuY3Rpb24gY291bnRDaGlsZHJlbihjaGlsZHJlbikge1xuICByZXR1cm4gdHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9LCBudWxsKTtcbn1cblxuLyoqXG4gKiBGbGF0dGVuIGEgY2hpbGRyZW4gb2JqZWN0ICh0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmApIGFuZFxuICogcmV0dXJuIGFuIGFycmF5IHdpdGggYXBwcm9wcmlhdGVseSByZS1rZXllZCBjaGlsZHJlbi5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW50b2FycmF5XG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXkoY2hpbGRyZW4pIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBtYXBJbnRvV2l0aEtleVByZWZpeEludGVybmFsKGNoaWxkcmVuLCByZXN1bHQsIG51bGwsIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZDtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgaW4gYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuIGFuZCB2ZXJpZmllcyB0aGF0IHRoZXJlXG4gKiBpcyBvbmx5IG9uZSBjaGlsZCBpbiB0aGUgY29sbGVjdGlvbi5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5vbmx5XG4gKlxuICogVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgYSBzaW5nbGUgY2hpbGQgZ2V0c1xuICogcGFzc2VkIHdpdGhvdXQgYSB3cmFwcGVyLCBidXQgdGhlIHB1cnBvc2Ugb2YgdGhpcyBoZWxwZXIgZnVuY3Rpb24gaXMgdG9cbiAqIGFic3RyYWN0IGF3YXkgdGhlIHBhcnRpY3VsYXIgc3RydWN0dXJlIG9mIGNoaWxkcmVuLlxuICpcbiAqIEBwYXJhbSB7P29iamVjdH0gY2hpbGRyZW4gQ2hpbGQgY29sbGVjdGlvbiBzdHJ1Y3R1cmUuXG4gKiBAcmV0dXJuIHtSZWFjdEVsZW1lbnR9IFRoZSBmaXJzdCBhbmQgb25seSBgUmVhY3RFbGVtZW50YCBjb250YWluZWQgaW4gdGhlXG4gKiBzdHJ1Y3R1cmUuXG4gKi9cbmZ1bmN0aW9uIG9ubHlDaGlsZChjaGlsZHJlbikge1xuICAhaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3QuQ2hpbGRyZW4ub25seSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuJykgOiB2b2lkIDA7XG4gIHJldHVybiBjaGlsZHJlbjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChkZWZhdWx0VmFsdWUsIGNhbGN1bGF0ZUNoYW5nZWRCaXRzKSB7XG4gIGlmIChjYWxjdWxhdGVDaGFuZ2VkQml0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2FsY3VsYXRlQ2hhbmdlZEJpdHMgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgICEoY2FsY3VsYXRlQ2hhbmdlZEJpdHMgPT09IG51bGwgfHwgdHlwZW9mIGNhbGN1bGF0ZUNoYW5nZWRCaXRzID09PSAnZnVuY3Rpb24nKSA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ2NyZWF0ZUNvbnRleHQ6IEV4cGVjdGVkIHRoZSBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcycsIGNhbGN1bGF0ZUNoYW5nZWRCaXRzKSA6IHZvaWQgMDtcbiAgICB9XG4gIH1cblxuICB2YXIgY29udGV4dCA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgIF9jYWxjdWxhdGVDaGFuZ2VkQml0czogY2FsY3VsYXRlQ2hhbmdlZEJpdHMsXG4gICAgLy8gQXMgYSB3b3JrYXJvdW5kIHRvIHN1cHBvcnQgbXVsdGlwbGUgY29uY3VycmVudCByZW5kZXJlcnMsIHdlIGNhdGVnb3JpemVcbiAgICAvLyBzb21lIHJlbmRlcmVycyBhcyBwcmltYXJ5IGFuZCBvdGhlcnMgYXMgc2Vjb25kYXJ5LiBXZSBvbmx5IGV4cGVjdFxuICAgIC8vIHRoZXJlIHRvIGJlIHR3byBjb25jdXJyZW50IHJlbmRlcmVycyBhdCBtb3N0OiBSZWFjdCBOYXRpdmUgKHByaW1hcnkpIGFuZFxuICAgIC8vIEZhYnJpYyAoc2Vjb25kYXJ5KTsgUmVhY3QgRE9NIChwcmltYXJ5KSBhbmQgUmVhY3QgQVJUIChzZWNvbmRhcnkpLlxuICAgIC8vIFNlY29uZGFyeSByZW5kZXJlcnMgc3RvcmUgdGhlaXIgY29udGV4dCB2YWx1ZXMgb24gc2VwYXJhdGUgZmllbGRzLlxuICAgIF9jdXJyZW50VmFsdWU6IGRlZmF1bHRWYWx1ZSxcbiAgICBfY3VycmVudFZhbHVlMjogZGVmYXVsdFZhbHVlLFxuICAgIC8vIFVzZWQgdG8gdHJhY2sgaG93IG1hbnkgY29uY3VycmVudCByZW5kZXJlcnMgdGhpcyBjb250ZXh0IGN1cnJlbnRseVxuICAgIC8vIHN1cHBvcnRzIHdpdGhpbiBpbiBhIHNpbmdsZSByZW5kZXJlci4gU3VjaCBhcyBwYXJhbGxlbCBzZXJ2ZXIgcmVuZGVyaW5nLlxuICAgIF90aHJlYWRDb3VudDogMCxcbiAgICAvLyBUaGVzZSBhcmUgY2lyY3VsYXJcbiAgICBQcm92aWRlcjogbnVsbCxcbiAgICBDb25zdW1lcjogbnVsbFxuICB9O1xuXG4gIGNvbnRleHQuUHJvdmlkZXIgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX1BST1ZJREVSX1RZUEUsXG4gICAgX2NvbnRleHQ6IGNvbnRleHRcbiAgfTtcblxuICB2YXIgaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMgPSBmYWxzZTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gZmFsc2U7XG5cbiAge1xuICAgIC8vIEEgc2VwYXJhdGUgb2JqZWN0LCBidXQgcHJveGllcyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjb250ZXh0IG9iamVjdCBmb3JcbiAgICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSXQgaGFzIGEgZGlmZmVyZW50ICQkdHlwZW9mLCBzbyB3ZSBjYW4gcHJvcGVybHlcbiAgICAvLyB3YXJuIGZvciB0aGUgaW5jb3JyZWN0IHVzYWdlIG9mIENvbnRleHQgYXMgYSBDb25zdW1lci5cbiAgICB2YXIgQ29uc3VtZXIgPSB7XG4gICAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgICAgX2NvbnRleHQ6IGNvbnRleHQsXG4gICAgICBfY2FsY3VsYXRlQ2hhbmdlZEJpdHM6IGNvbnRleHQuX2NhbGN1bGF0ZUNoYW5nZWRCaXRzXG4gICAgfTtcbiAgICAvLyAkRmxvd0ZpeE1lOiBGbG93IGNvbXBsYWlucyBhYm91dCBub3Qgc2V0dGluZyBhIHZhbHVlLCB3aGljaCBpcyBpbnRlbnRpb25hbCBoZXJlXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ29uc3VtZXIsIHtcbiAgICAgIFByb3ZpZGVyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIHdhcm5pbmckMShmYWxzZSwgJ1JlbmRlcmluZyA8Q29udGV4dC5Db25zdW1lci5Qcm92aWRlcj4gaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Qcm92aWRlcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuUHJvdmlkZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF9Qcm92aWRlcikge1xuICAgICAgICAgIGNvbnRleHQuUHJvdmlkZXIgPSBfUHJvdmlkZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfY3VycmVudFZhbHVlOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9jdXJyZW50VmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF9jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgPSBfY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX2N1cnJlbnRWYWx1ZTI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTI7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF9jdXJyZW50VmFsdWUyKSB7XG4gICAgICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlMiA9IF9jdXJyZW50VmFsdWUyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX3RocmVhZENvdW50OiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll90aHJlYWRDb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX3RocmVhZENvdW50KSB7XG4gICAgICAgICAgY29udGV4dC5fdGhyZWFkQ291bnQgPSBfdGhyZWFkQ291bnQ7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBDb25zdW1lcjoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdOZXN0ZWRDb250ZXh0Q29uc3VtZXJzKSB7XG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycyA9IHRydWU7XG4gICAgICAgICAgICB3YXJuaW5nJDEoZmFsc2UsICdSZW5kZXJpbmcgPENvbnRleHQuQ29uc3VtZXIuQ29uc3VtZXI+IGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byByZW5kZXIgPENvbnRleHQuQ29uc3VtZXI+IGluc3RlYWQ/Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjb250ZXh0LkNvbnN1bWVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gJEZsb3dGaXhNZTogRmxvdyBjb21wbGFpbnMgYWJvdXQgbWlzc2luZyBwcm9wZXJ0aWVzIGJlY2F1c2UgaXQgZG9lc24ndCB1bmRlcnN0YW5kIGRlZmluZVByb3BlcnR5XG4gICAgY29udGV4dC5Db25zdW1lciA9IENvbnN1bWVyO1xuICB9XG5cbiAge1xuICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IG51bGw7XG4gICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyMiA9IG51bGw7XG4gIH1cblxuICByZXR1cm4gY29udGV4dDtcbn1cblxuZnVuY3Rpb24gbGF6eShjdG9yKSB7XG4gIHZhciBsYXp5VHlwZSA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfTEFaWV9UWVBFLFxuICAgIF9jdG9yOiBjdG9yLFxuICAgIC8vIFJlYWN0IHVzZXMgdGhlc2UgZmllbGRzIHRvIHN0b3JlIHRoZSByZXN1bHQuXG4gICAgX3N0YXR1czogLTEsXG4gICAgX3Jlc3VsdDogbnVsbFxuICB9O1xuXG4gIHtcbiAgICAvLyBJbiBwcm9kdWN0aW9uLCB0aGlzIHdvdWxkIGp1c3Qgc2V0IGl0IG9uIHRoZSBvYmplY3QuXG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IHZvaWQgMDtcbiAgICB2YXIgcHJvcFR5cGVzID0gdm9pZCAwO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGxhenlUeXBlLCB7XG4gICAgICBkZWZhdWx0UHJvcHM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFByb3BzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdEZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgICB3YXJuaW5nJDEoZmFsc2UsICdSZWFjdC5sYXp5KC4uLik6IEl0IGlzIG5vdCBzdXBwb3J0ZWQgdG8gYXNzaWduIGBkZWZhdWx0UHJvcHNgIHRvICcgKyAnYSBsYXp5IGNvbXBvbmVudCBpbXBvcnQuIEVpdGhlciBzcGVjaWZ5IHRoZW0gd2hlcmUgdGhlIGNvbXBvbmVudCAnICsgJ2lzIGRlZmluZWQsIG9yIGNyZWF0ZSBhIHdyYXBwaW5nIGNvbXBvbmVudCBhcm91bmQgaXQuJyk7XG4gICAgICAgICAgZGVmYXVsdFByb3BzID0gbmV3RGVmYXVsdFByb3BzO1xuICAgICAgICAgIC8vIE1hdGNoIHByb2R1Y3Rpb24gYmVoYXZpb3IgbW9yZSBjbG9zZWx5OlxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsYXp5VHlwZSwgJ2RlZmF1bHRQcm9wcycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHByb3BUeXBlczoge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBwcm9wVHlwZXM7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKG5ld1Byb3BUeXBlcykge1xuICAgICAgICAgIHdhcm5pbmckMShmYWxzZSwgJ1JlYWN0LmxhenkoLi4uKTogSXQgaXMgbm90IHN1cHBvcnRlZCB0byBhc3NpZ24gYHByb3BUeXBlc2AgdG8gJyArICdhIGxhenkgY29tcG9uZW50IGltcG9ydC4gRWl0aGVyIHNwZWNpZnkgdGhlbSB3aGVyZSB0aGUgY29tcG9uZW50ICcgKyAnaXMgZGVmaW5lZCwgb3IgY3JlYXRlIGEgd3JhcHBpbmcgY29tcG9uZW50IGFyb3VuZCBpdC4nKTtcbiAgICAgICAgICBwcm9wVHlwZXMgPSBuZXdQcm9wVHlwZXM7XG4gICAgICAgICAgLy8gTWF0Y2ggcHJvZHVjdGlvbiBiZWhhdmlvciBtb3JlIGNsb3NlbHk6XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxhenlUeXBlLCAncHJvcFR5cGVzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbGF6eVR5cGU7XG59XG5cbmZ1bmN0aW9uIGZvcndhcmRSZWYocmVuZGVyKSB7XG4gIHtcbiAgICBpZiAocmVuZGVyICE9IG51bGwgJiYgcmVuZGVyLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpIHtcbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHJlY2VpdmVkIGEgYG1lbW9gICcgKyAnY29tcG9uZW50LiBJbnN0ZWFkIG9mIGZvcndhcmRSZWYobWVtbyguLi4pKSwgdXNlICcgKyAnbWVtbyhmb3J3YXJkUmVmKC4uLikpLicpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnZm9yd2FyZFJlZiByZXF1aXJlcyBhIHJlbmRlciBmdW5jdGlvbiBidXQgd2FzIGdpdmVuICVzLicsIHJlbmRlciA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiByZW5kZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAhKFxuICAgICAgLy8gRG8gbm90IHdhcm4gZm9yIDAgYXJndW1lbnRzIGJlY2F1c2UgaXQgY291bGQgYmUgZHVlIHRvIHVzYWdlIG9mIHRoZSAnYXJndW1lbnRzJyBvYmplY3RcbiAgICAgIHJlbmRlci5sZW5ndGggPT09IDAgfHwgcmVuZGVyLmxlbmd0aCA9PT0gMikgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdmb3J3YXJkUmVmIHJlbmRlciBmdW5jdGlvbnMgYWNjZXB0IGV4YWN0bHkgdHdvIHBhcmFtZXRlcnM6IHByb3BzIGFuZCByZWYuICVzJywgcmVuZGVyLmxlbmd0aCA9PT0gMSA/ICdEaWQgeW91IGZvcmdldCB0byB1c2UgdGhlIHJlZiBwYXJhbWV0ZXI/JyA6ICdBbnkgYWRkaXRpb25hbCBwYXJhbWV0ZXIgd2lsbCBiZSB1bmRlZmluZWQuJykgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgaWYgKHJlbmRlciAhPSBudWxsKSB7XG4gICAgICAhKHJlbmRlci5kZWZhdWx0UHJvcHMgPT0gbnVsbCAmJiByZW5kZXIucHJvcFR5cGVzID09IG51bGwpID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGRvIG5vdCBzdXBwb3J0IHByb3BUeXBlcyBvciBkZWZhdWx0UHJvcHMuICcgKyAnRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyBhIFJlYWN0IGNvbXBvbmVudD8nKSA6IHZvaWQgMDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgIHJlbmRlcjogcmVuZGVyXG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgfHxcbiAgLy8gTm90ZTogaXRzIHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIGlmIGl0J3MgYSBwb2x5ZmlsbC5cbiAgdHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFKTtcbn1cblxuZnVuY3Rpb24gbWVtbyh0eXBlLCBjb21wYXJlKSB7XG4gIHtcbiAgICBpZiAoIWlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSkge1xuICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnbWVtbzogVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBjb21wb25lbnQuIEluc3RlYWQgJyArICdyZWNlaXZlZDogJXMnLCB0eXBlID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHR5cGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9NRU1PX1RZUEUsXG4gICAgdHlwZTogdHlwZSxcbiAgICBjb21wYXJlOiBjb21wYXJlID09PSB1bmRlZmluZWQgPyBudWxsIDogY29tcGFyZVxuICB9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGlzcGF0Y2hlcigpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQ7XG4gICEoZGlzcGF0Y2hlciAhPT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICdJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuMS4gWW91IG1pZ2h0IGhhdmUgbWlzbWF0Y2hpbmcgdmVyc2lvbnMgb2YgUmVhY3QgYW5kIHRoZSByZW5kZXJlciAoc3VjaCBhcyBSZWFjdCBET00pXFxuMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbjMuIFlvdSBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdCBpbiB0aGUgc2FtZSBhcHBcXG5TZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC1pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uJykgOiB2b2lkIDA7XG4gIHJldHVybiBkaXNwYXRjaGVyO1xufVxuXG5mdW5jdGlvbiB1c2VDb250ZXh0KENvbnRleHQsIHVuc3RhYmxlX29ic2VydmVkQml0cykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHtcbiAgICAhKHVuc3RhYmxlX29ic2VydmVkQml0cyA9PT0gdW5kZWZpbmVkKSA/IHdhcm5pbmckMShmYWxzZSwgJ3VzZUNvbnRleHQoKSBzZWNvbmQgYXJndW1lbnQgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSAnICsgJ3VzZSBpbiBSZWFjdC4gUGFzc2luZyBpdCBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1lvdSBwYXNzZWQ6ICVzLiVzJywgdW5zdGFibGVfb2JzZXJ2ZWRCaXRzLCB0eXBlb2YgdW5zdGFibGVfb2JzZXJ2ZWRCaXRzID09PSAnbnVtYmVyJyAmJiBBcnJheS5pc0FycmF5KGFyZ3VtZW50c1syXSkgPyAnXFxuXFxuRGlkIHlvdSBjYWxsIGFycmF5Lm1hcCh1c2VDb250ZXh0KT8gJyArICdDYWxsaW5nIEhvb2tzIGluc2lkZSBhIGxvb3AgaXMgbm90IHN1cHBvcnRlZC4gJyArICdMZWFybiBtb3JlIGF0IGh0dHBzOi8vZmIubWUvcnVsZXMtb2YtaG9va3MnIDogJycpIDogdm9pZCAwO1xuXG4gICAgLy8gVE9ETzogYWRkIGEgbW9yZSBnZW5lcmljIHdhcm5pbmcgZm9yIGludmFsaWQgdmFsdWVzLlxuICAgIGlmIChDb250ZXh0Ll9jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZWFsQ29udGV4dCA9IENvbnRleHQuX2NvbnRleHQ7XG4gICAgICAvLyBEb24ndCBkZWR1cGxpY2F0ZSBiZWNhdXNlIHRoaXMgbGVnaXRpbWF0ZWx5IGNhdXNlcyBidWdzXG4gICAgICAvLyBhbmQgbm9ib2R5IHNob3VsZCBiZSB1c2luZyB0aGlzIGluIGV4aXN0aW5nIGNvZGUuXG4gICAgICBpZiAocmVhbENvbnRleHQuQ29uc3VtZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgd2FybmluZyQxKGZhbHNlLCAnQ2FsbGluZyB1c2VDb250ZXh0KENvbnRleHQuQ29uc3VtZXIpIGlzIG5vdCBzdXBwb3J0ZWQsIG1heSBjYXVzZSBidWdzLCBhbmQgd2lsbCBiZSAnICsgJ3JlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIGNhbGwgdXNlQ29udGV4dChDb250ZXh0KSBpbnN0ZWFkPycpO1xuICAgICAgfSBlbHNlIGlmIChyZWFsQ29udGV4dC5Qcm92aWRlciA9PT0gQ29udGV4dCkge1xuICAgICAgICB3YXJuaW5nJDEoZmFsc2UsICdDYWxsaW5nIHVzZUNvbnRleHQoQ29udGV4dC5Qcm92aWRlcikgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCB1c2VDb250ZXh0KENvbnRleHQpIGluc3RlYWQ/Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUNvbnRleHQoQ29udGV4dCwgdW5zdGFibGVfb2JzZXJ2ZWRCaXRzKTtcbn1cblxuZnVuY3Rpb24gdXNlU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlU3RhdGUoaW5pdGlhbFN0YXRlKTtcbn1cblxuZnVuY3Rpb24gdXNlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbn1cblxuZnVuY3Rpb24gdXNlUmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVJlZihpbml0aWFsVmFsdWUpO1xufVxuXG5mdW5jdGlvbiB1c2VFZmZlY3QoY3JlYXRlLCBpbnB1dHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VFZmZlY3QoY3JlYXRlLCBpbnB1dHMpO1xufVxuXG5mdW5jdGlvbiB1c2VMYXlvdXRFZmZlY3QoY3JlYXRlLCBpbnB1dHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VMYXlvdXRFZmZlY3QoY3JlYXRlLCBpbnB1dHMpO1xufVxuXG5mdW5jdGlvbiB1c2VDYWxsYmFjayhjYWxsYmFjaywgaW5wdXRzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlQ2FsbGJhY2soY2FsbGJhY2ssIGlucHV0cyk7XG59XG5cbmZ1bmN0aW9uIHVzZU1lbW8oY3JlYXRlLCBpbnB1dHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VNZW1vKGNyZWF0ZSwgaW5wdXRzKTtcbn1cblxuZnVuY3Rpb24gdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgaW5wdXRzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgaW5wdXRzKTtcbn1cblxuZnVuY3Rpb24gdXNlRGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAge1xuICAgIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgICByZXR1cm4gZGlzcGF0Y2hlci51c2VEZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbik7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWFjdEVsZW1lbnRWYWxpZGF0b3IgcHJvdmlkZXMgYSB3cmFwcGVyIGFyb3VuZCBhIGVsZW1lbnQgZmFjdG9yeVxuICogd2hpY2ggdmFsaWRhdGVzIHRoZSBwcm9wcyBwYXNzZWQgdG8gdGhlIGVsZW1lbnQuIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmVcbiAqIHVzZWQgb25seSBpbiBERVYgYW5kIGNvdWxkIGJlIHJlcGxhY2VkIGJ5IGEgc3RhdGljIHR5cGUgY2hlY2tlciBmb3IgbGFuZ3VhZ2VzXG4gKiB0aGF0IHN1cHBvcnQgaXQuXG4gKi9cblxudmFyIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gdm9pZCAwO1xuXG57XG4gIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpIHtcbiAgaWYgKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcbiAgICBpZiAobmFtZSkge1xuICAgICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgIH1cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKGVsZW1lbnRQcm9wcykge1xuICBpZiAoZWxlbWVudFByb3BzICE9PSBudWxsICYmIGVsZW1lbnRQcm9wcyAhPT0gdW5kZWZpbmVkICYmIGVsZW1lbnRQcm9wcy5fX3NvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIHNvdXJjZSA9IGVsZW1lbnRQcm9wcy5fX3NvdXJjZTtcbiAgICB2YXIgZmlsZU5hbWUgPSBzb3VyY2UuZmlsZU5hbWUucmVwbGFjZSgvXi4qW1xcXFxcXC9dLywgJycpO1xuICAgIHZhciBsaW5lTnVtYmVyID0gc291cmNlLmxpbmVOdW1iZXI7XG4gICAgcmV0dXJuICdcXG5cXG5DaGVjayB5b3VyIGNvZGUgYXQgJyArIGZpbGVOYW1lICsgJzonICsgbGluZU51bWJlciArICcuJztcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogV2FybiBpZiB0aGVyZSdzIG5vIGtleSBleHBsaWNpdGx5IHNldCBvbiBkeW5hbWljIGFycmF5cyBvZiBjaGlsZHJlbiBvclxuICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gKiB1cGRhdGVzLlxuICovXG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICB2YXIgaW5mbyA9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuXG4gIGlmICghaW5mbykge1xuICAgIHZhciBwYXJlbnROYW1lID0gdHlwZW9mIHBhcmVudFR5cGUgPT09ICdzdHJpbmcnID8gcGFyZW50VHlwZSA6IHBhcmVudFR5cGUuZGlzcGxheU5hbWUgfHwgcGFyZW50VHlwZS5uYW1lO1xuICAgIGlmIChwYXJlbnROYW1lKSB7XG4gICAgICBpbmZvID0gJ1xcblxcbkNoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPCcgKyBwYXJlbnROYW1lICsgJz4uJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluZm87XG59XG5cbi8qKlxuICogV2FybiBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW4gZXhwbGljaXQga2V5IGFzc2lnbmVkIHRvIGl0LlxuICogVGhpcyBlbGVtZW50IGlzIGluIGFuIGFycmF5LiBUaGUgYXJyYXkgY291bGQgZ3JvdyBhbmQgc2hyaW5rIG9yIGJlXG4gKiByZW9yZGVyZWQuIEFsbCBjaGlsZHJlbiB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcmUgcmVxdWlyZWQgdG9cbiAqIGhhdmUgYSBcImtleVwiIHByb3BlcnR5IGFzc2lnbmVkIHRvIGl0LiBFcnJvciBzdGF0dXNlcyBhcmUgY2FjaGVkIHNvIGEgd2FybmluZ1xuICogd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IHRoYXQgcmVxdWlyZXMgYSBrZXkuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgZWxlbWVudCdzIHBhcmVudCdzIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRXhwbGljaXRLZXkoZWxlbWVudCwgcGFyZW50VHlwZSkge1xuICBpZiAoIWVsZW1lbnQuX3N0b3JlIHx8IGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCB8fCBlbGVtZW50LmtleSAhPSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG5cbiAgdmFyIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8gPSBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpO1xuICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSA9IHRydWU7XG5cbiAgLy8gVXN1YWxseSB0aGUgY3VycmVudCBvd25lciBpcyB0aGUgb2ZmZW5kZXIsIGJ1dCBpZiBpdCBhY2NlcHRzIGNoaWxkcmVuIGFzIGFcbiAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAvLyBhc3NpZ25pbmcgaXQgYSBrZXkuXG4gIHZhciBjaGlsZE93bmVyID0gJyc7XG4gIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX293bmVyICE9PSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgLy8gR2l2ZSB0aGUgY29tcG9uZW50IHRoYXQgb3JpZ2luYWxseSBjcmVhdGVkIHRoaXMgY2hpbGQuXG4gICAgY2hpbGRPd25lciA9ICcgSXQgd2FzIHBhc3NlZCBhIGNoaWxkIGZyb20gJyArIGdldENvbXBvbmVudE5hbWUoZWxlbWVudC5fb3duZXIudHlwZSkgKyAnLic7XG4gIH1cblxuICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcbiAge1xuICAgIHdhcm5pbmckMShmYWxzZSwgJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCIgcHJvcC4nICsgJyVzJXMgU2VlIGh0dHBzOi8vZmIubWUvcmVhY3Qtd2FybmluZy1rZXlzIGZvciBtb3JlIGluZm9ybWF0aW9uLicsIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8sIGNoaWxkT3duZXIpO1xuICB9XG4gIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xufVxuXG4vKipcbiAqIEVuc3VyZSB0aGF0IGV2ZXJ5IGVsZW1lbnQgZWl0aGVyIGlzIHBhc3NlZCBpbiBhIHN0YXRpYyBsb2NhdGlvbiwgaW4gYW5cbiAqIGFycmF5IHdpdGggYW4gZXhwbGljaXQga2V5cyBwcm9wZXJ0eSBkZWZpbmVkLCBvciBpbiBhbiBvYmplY3QgbGl0ZXJhbFxuICogd2l0aCB2YWxpZCBrZXkgcHJvcGVydHkuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZSBTdGF0aWNhbGx5IHBhc3NlZCBjaGlsZCBvZiBhbnkgdHlwZS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBub2RlJ3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDaGlsZEtleXMobm9kZSwgcGFyZW50VHlwZSkge1xuICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KGNoaWxkLCBwYXJlbnRUeXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNWYWxpZEVsZW1lbnQobm9kZSkpIHtcbiAgICAvLyBUaGlzIGVsZW1lbnQgd2FzIHBhc3NlZCBpbiBhIHZhbGlkIGxvY2F0aW9uLlxuICAgIGlmIChub2RlLl9zdG9yZSkge1xuICAgICAgbm9kZS5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAobm9kZSkge1xuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihub2RlKTtcbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEVudHJ5IGl0ZXJhdG9ycyB1c2VkIHRvIHByb3ZpZGUgaW1wbGljaXQga2V5cyxcbiAgICAgIC8vIGJ1dCBub3cgd2UgcHJpbnQgYSBzZXBhcmF0ZSB3YXJuaW5nIGZvciB0aGVtIGxhdGVyLlxuICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IG5vZGUuZW50cmllcykge1xuICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobm9kZSk7XG4gICAgICAgIHZhciBzdGVwID0gdm9pZCAwO1xuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KHN0ZXAudmFsdWUsIHBhcmVudFR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEdpdmVuIGFuIGVsZW1lbnQsIHZhbGlkYXRlIHRoYXQgaXRzIHByb3BzIGZvbGxvdyB0aGUgcHJvcFR5cGVzIGRlZmluaXRpb24sXG4gKiBwcm92aWRlZCBieSB0aGUgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KSB7XG4gIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuICBpZiAodHlwZSA9PT0gbnVsbCB8fCB0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKTtcbiAgdmFyIHByb3BUeXBlcyA9IHZvaWQgMDtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8XG4gIC8vIE5vdGU6IE1lbW8gb25seSBjaGVja3Mgb3V0ZXIgcHJvcHMgaGVyZS5cbiAgLy8gSW5uZXIgcHJvcHMgYXJlIGNoZWNrZWQgaW4gdGhlIHJlY29uY2lsZXIuXG4gIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkpIHtcbiAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHByb3BUeXBlcykge1xuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuICAgIGNoZWNrUHJvcFR5cGVzKHByb3BUeXBlcywgZWxlbWVudC5wcm9wcywgJ3Byb3AnLCBuYW1lLCBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0pO1xuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICB9IGVsc2UgaWYgKHR5cGUuUHJvcFR5cGVzICE9PSB1bmRlZmluZWQgJiYgIXByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duKSB7XG4gICAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSB0cnVlO1xuICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ0NvbXBvbmVudCAlcyBkZWNsYXJlZCBgUHJvcFR5cGVzYCBpbnN0ZWFkIG9mIGBwcm9wVHlwZXNgLiBEaWQgeW91IG1pc3NwZWxsIHRoZSBwcm9wZXJ0eSBhc3NpZ25tZW50PycsIG5hbWUgfHwgJ1Vua25vd24nKTtcbiAgfVxuICBpZiAodHlwZW9mIHR5cGUuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgIXR5cGUuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnZ2V0RGVmYXVsdFByb3BzIGlzIG9ubHkgdXNlZCBvbiBjbGFzc2ljIFJlYWN0LmNyZWF0ZUNsYXNzICcgKyAnZGVmaW5pdGlvbnMuIFVzZSBhIHN0YXRpYyBwcm9wZXJ0eSBuYW1lZCBgZGVmYXVsdFByb3BzYCBpbnN0ZWFkLicpIDogdm9pZCAwO1xuICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYSBmcmFnbWVudCwgdmFsaWRhdGUgdGhhdCBpdCBjYW4gb25seSBiZSBwcm92aWRlZCB3aXRoIGZyYWdtZW50IHByb3BzXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZnJhZ21lbnRcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVGcmFnbWVudFByb3BzKGZyYWdtZW50KSB7XG4gIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGZyYWdtZW50KTtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZyYWdtZW50LnByb3BzKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgaWYgKGtleSAhPT0gJ2NoaWxkcmVuJyAmJiBrZXkgIT09ICdrZXknKSB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICdJbnZhbGlkIHByb3AgYCVzYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLiAnICsgJ1JlYWN0LkZyYWdtZW50IGNhbiBvbmx5IGhhdmUgYGtleWAgYW5kIGBjaGlsZHJlbmAgcHJvcHMuJywga2V5KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChmcmFnbWVudC5yZWYgIT09IG51bGwpIHtcbiAgICB3YXJuaW5nJDEoZmFsc2UsICdJbnZhbGlkIGF0dHJpYnV0ZSBgcmVmYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLicpO1xuICB9XG5cbiAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbih0eXBlLCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIHZhbGlkVHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKTtcblxuICAvLyBXZSB3YXJuIGluIHRoaXMgY2FzZSBidXQgZG9uJ3QgdGhyb3cuIFdlIGV4cGVjdCB0aGUgZWxlbWVudCBjcmVhdGlvbiB0b1xuICAvLyBzdWNjZWVkIGFuZCB0aGVyZSB3aWxsIGxpa2VseSBiZSBlcnJvcnMgaW4gcmVuZGVyLlxuICBpZiAoIXZhbGlkVHlwZSkge1xuICAgIHZhciBpbmZvID0gJyc7XG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGluZm8gKz0gJyBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSAnICsgXCJpdCdzIGRlZmluZWQgaW4sIG9yIHlvdSBtaWdodCBoYXZlIG1peGVkIHVwIGRlZmF1bHQgYW5kIG5hbWVkIGltcG9ydHMuXCI7XG4gICAgfVxuXG4gICAgdmFyIHNvdXJjZUluZm8gPSBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShwcm9wcyk7XG4gICAgaWYgKHNvdXJjZUluZm8pIHtcbiAgICAgIGluZm8gKz0gc291cmNlSW5mbztcbiAgICB9IGVsc2Uge1xuICAgICAgaW5mbyArPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcbiAgICB9XG5cbiAgICB2YXIgdHlwZVN0cmluZyA9IHZvaWQgMDtcbiAgICBpZiAodHlwZSA9PT0gbnVsbCkge1xuICAgICAgdHlwZVN0cmluZyA9ICdudWxsJztcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkpIHtcbiAgICAgIHR5cGVTdHJpbmcgPSAnYXJyYXknO1xuICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgdHlwZVN0cmluZyA9ICc8JyArIChnZXRDb21wb25lbnROYW1lKHR5cGUudHlwZSkgfHwgJ1Vua25vd24nKSArICcgLz4nO1xuICAgICAgaW5mbyA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgZXhwb3J0IGEgSlNYIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNvbXBvbmVudD8nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlU3RyaW5nID0gdHlwZW9mIHR5cGU7XG4gICAgfVxuXG4gICAgd2FybmluZyQxKGZhbHNlLCAnUmVhY3QuY3JlYXRlRWxlbWVudDogdHlwZSBpcyBpbnZhbGlkIC0tIGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgJyArICdidWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlICcgKyAnY29tcG9uZW50cykgYnV0IGdvdDogJXMuJXMnLCB0eXBlU3RyaW5nLCBpbmZvKTtcbiAgfVxuXG4gIHZhciBlbGVtZW50ID0gY3JlYXRlRWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIC8vIFRoZSByZXN1bHQgY2FuIGJlIG51bGxpc2ggaWYgYSBtb2NrIG9yIGEgY3VzdG9tIGZ1bmN0aW9uIGlzIHVzZWQuXG4gIC8vIFRPRE86IERyb3AgdGhpcyB3aGVuIHRoZXNlIGFyZSBubyBsb25nZXIgYWxsb3dlZCBhcyB0aGUgdHlwZSBhcmd1bWVudC5cbiAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgLy8gU2tpcCBrZXkgd2FybmluZyBpZiB0aGUgdHlwZSBpc24ndCB2YWxpZCBzaW5jZSBvdXIga2V5IHZhbGlkYXRpb24gbG9naWNcbiAgLy8gZG9lc24ndCBleHBlY3QgYSBub24tc3RyaW5nL2Z1bmN0aW9uIHR5cGUgYW5kIGNhbiB0aHJvdyBjb25mdXNpbmcgZXJyb3JzLlxuICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBiZWhhdmlvciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuXG4gIC8vIChSZW5kZXJpbmcgd2lsbCB0aHJvdyB3aXRoIGEgaGVscGZ1bCBtZXNzYWdlIGFuZCBhcyBzb29uIGFzIHRoZSB0eXBlIGlzXG4gIC8vIGZpeGVkLCB0aGUga2V5IHdhcm5pbmdzIHdpbGwgYXBwZWFyLilcbiAgaWYgKHZhbGlkVHlwZSkge1xuICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIHR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgdmFsaWRhdGVGcmFnbWVudFByb3BzKGVsZW1lbnQpO1xuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbih0eXBlKSB7XG4gIHZhciB2YWxpZGF0ZWRGYWN0b3J5ID0gY3JlYXRlRWxlbWVudFdpdGhWYWxpZGF0aW9uLmJpbmQobnVsbCwgdHlwZSk7XG4gIHZhbGlkYXRlZEZhY3RvcnkudHlwZSA9IHR5cGU7XG4gIC8vIExlZ2FjeSBob29rOiByZW1vdmUgaXRcbiAge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWxpZGF0ZWRGYWN0b3J5LCAndHlwZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxvd1ByaW9yaXR5V2FybmluZyQxKGZhbHNlLCAnRmFjdG9yeS50eXBlIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB0aGUgY2xhc3MgZGlyZWN0bHkgJyArICdiZWZvcmUgcGFzc2luZyBpdCB0byBjcmVhdGVGYWN0b3J5LicpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3R5cGUnLCB7XG4gICAgICAgICAgdmFsdWU6IHR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlZEZhY3Rvcnk7XG59XG5cbmZ1bmN0aW9uIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uKGVsZW1lbnQsIHByb3BzLCBjaGlsZHJlbikge1xuICB2YXIgbmV3RWxlbWVudCA9IGNsb25lRWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGFyZ3VtZW50c1tpXSwgbmV3RWxlbWVudC50eXBlKTtcbiAgfVxuICB2YWxpZGF0ZVByb3BUeXBlcyhuZXdFbGVtZW50KTtcbiAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG5cbi8vIEhlbHBzIGlkZW50aWZ5IHNpZGUgZWZmZWN0cyBpbiBiZWdpbi1waGFzZSBsaWZlY3ljbGUgaG9va3MgYW5kIHNldFN0YXRlIHJlZHVjZXJzOlxuXG5cbi8vIEluIHNvbWUgY2FzZXMsIFN0cmljdE1vZGUgc2hvdWxkIGFsc28gZG91YmxlLXJlbmRlciBsaWZlY3ljbGVzLlxuLy8gVGhpcyBjYW4gYmUgY29uZnVzaW5nIGZvciB0ZXN0cyB0aG91Z2gsXG4vLyBBbmQgaXQgY2FuIGJlIGJhZCBmb3IgcGVyZm9ybWFuY2UgaW4gcHJvZHVjdGlvbi5cbi8vIFRoaXMgZmVhdHVyZSBmbGFnIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGJlaGF2aW9yOlxuXG5cbi8vIFRvIHByZXNlcnZlIHRoZSBcIlBhdXNlIG9uIGNhdWdodCBleGNlcHRpb25zXCIgYmVoYXZpb3Igb2YgdGhlIGRlYnVnZ2VyLCB3ZVxuLy8gcmVwbGF5IHRoZSBiZWdpbiBwaGFzZSBvZiBhIGZhaWxlZCBjb21wb25lbnQgaW5zaWRlIGludm9rZUd1YXJkZWRDYWxsYmFjay5cblxuXG4vLyBXYXJuIGFib3V0IGRlcHJlY2F0ZWQsIGFzeW5jLXVuc2FmZSBsaWZlY3ljbGVzOyByZWxhdGVzIHRvIFJGQyAjNjpcblxuXG4vLyBHYXRoZXIgYWR2YW5jZWQgdGltaW5nIG1ldHJpY3MgZm9yIFByb2ZpbGVyIHN1YnRyZWVzLlxuXG5cbi8vIFRyYWNlIHdoaWNoIGludGVyYWN0aW9ucyB0cmlnZ2VyIGVhY2ggY29tbWl0LlxuXG5cbi8vIE9ubHkgdXNlZCBpbiB3d3cgYnVpbGRzLlxuIC8vIFRPRE86IHRydWU/IEhlcmUgaXQgbWlnaHQganVzdCBiZSBmYWxzZS5cblxuLy8gT25seSB1c2VkIGluIHd3dyBidWlsZHMuXG5cblxuLy8gT25seSB1c2VkIGluIHd3dyBidWlsZHMuXG5cblxuLy8gUmVhY3QgRmlyZTogcHJldmVudCB0aGUgdmFsdWUgYW5kIGNoZWNrZWQgYXR0cmlidXRlcyBmcm9tIHN5bmNpbmdcbi8vIHdpdGggdGhlaXIgcmVsYXRlZCBET00gcHJvcGVydGllc1xuXG5cbi8vIFRoZXNlIEFQSXMgd2lsbCBubyBsb25nZXIgYmUgXCJ1bnN0YWJsZVwiIGluIHRoZSB1cGNvbWluZyAxNi43IHJlbGVhc2UsXG4vLyBDb250cm9sIHRoaXMgYmVoYXZpb3Igd2l0aCBhIGZsYWcgdG8gc3VwcG9ydCAxNi42IG1pbm9yIHJlbGVhc2VzIGluIHRoZSBtZWFud2hpbGUuXG52YXIgZW5hYmxlU3RhYmxlQ29uY3VycmVudE1vZGVBUElzID0gZmFsc2U7XG5cbnZhciBSZWFjdCA9IHtcbiAgQ2hpbGRyZW46IHtcbiAgICBtYXA6IG1hcENoaWxkcmVuLFxuICAgIGZvckVhY2g6IGZvckVhY2hDaGlsZHJlbixcbiAgICBjb3VudDogY291bnRDaGlsZHJlbixcbiAgICB0b0FycmF5OiB0b0FycmF5LFxuICAgIG9ubHk6IG9ubHlDaGlsZFxuICB9LFxuXG4gIGNyZWF0ZVJlZjogY3JlYXRlUmVmLFxuICBDb21wb25lbnQ6IENvbXBvbmVudCxcbiAgUHVyZUNvbXBvbmVudDogUHVyZUNvbXBvbmVudCxcblxuICBjcmVhdGVDb250ZXh0OiBjcmVhdGVDb250ZXh0LFxuICBmb3J3YXJkUmVmOiBmb3J3YXJkUmVmLFxuICBsYXp5OiBsYXp5LFxuICBtZW1vOiBtZW1vLFxuXG4gIHVzZUNhbGxiYWNrOiB1c2VDYWxsYmFjayxcbiAgdXNlQ29udGV4dDogdXNlQ29udGV4dCxcbiAgdXNlRWZmZWN0OiB1c2VFZmZlY3QsXG4gIHVzZUltcGVyYXRpdmVIYW5kbGU6IHVzZUltcGVyYXRpdmVIYW5kbGUsXG4gIHVzZURlYnVnVmFsdWU6IHVzZURlYnVnVmFsdWUsXG4gIHVzZUxheW91dEVmZmVjdDogdXNlTGF5b3V0RWZmZWN0LFxuICB1c2VNZW1vOiB1c2VNZW1vLFxuICB1c2VSZWR1Y2VyOiB1c2VSZWR1Y2VyLFxuICB1c2VSZWY6IHVzZVJlZixcbiAgdXNlU3RhdGU6IHVzZVN0YXRlLFxuXG4gIEZyYWdtZW50OiBSRUFDVF9GUkFHTUVOVF9UWVBFLFxuICBTdHJpY3RNb2RlOiBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFLFxuICBTdXNwZW5zZTogUkVBQ1RfU1VTUEVOU0VfVFlQRSxcblxuICBjcmVhdGVFbGVtZW50OiBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24sXG4gIGNsb25lRWxlbWVudDogY2xvbmVFbGVtZW50V2l0aFZhbGlkYXRpb24sXG4gIGNyZWF0ZUZhY3Rvcnk6IGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbixcbiAgaXNWYWxpZEVsZW1lbnQ6IGlzVmFsaWRFbGVtZW50LFxuXG4gIHZlcnNpb246IFJlYWN0VmVyc2lvbixcblxuICB1bnN0YWJsZV9Db25jdXJyZW50TW9kZTogUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEUsXG4gIHVuc3RhYmxlX1Byb2ZpbGVyOiBSRUFDVF9QUk9GSUxFUl9UWVBFLFxuXG4gIF9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEOiBSZWFjdFNoYXJlZEludGVybmFsc1xufTtcblxuLy8gTm90ZTogc29tZSBBUElzIGFyZSBhZGRlZCB3aXRoIGZlYXR1cmUgZmxhZ3MuXG4vLyBNYWtlIHN1cmUgdGhhdCBzdGFibGUgYnVpbGRzIGZvciBvcGVuIHNvdXJjZVxuLy8gZG9uJ3QgbW9kaWZ5IHRoZSBSZWFjdCBvYmplY3QgdG8gYXZvaWQgZGVvcHRzLlxuLy8gQWxzbyBsZXQncyBub3QgZXhwb3NlIHRoZWlyIG5hbWVzIGluIHN0YWJsZSBidWlsZHMuXG5cbmlmIChlbmFibGVTdGFibGVDb25jdXJyZW50TW9kZUFQSXMpIHtcbiAgUmVhY3QuQ29uY3VycmVudE1vZGUgPSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbiAgUmVhY3QuUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuICBSZWFjdC51bnN0YWJsZV9Db25jdXJyZW50TW9kZSA9IHVuZGVmaW5lZDtcbiAgUmVhY3QudW5zdGFibGVfUHJvZmlsZXIgPSB1bmRlZmluZWQ7XG59XG5cblxuXG52YXIgUmVhY3QkMiA9IE9iamVjdC5mcmVlemUoe1xuXHRkZWZhdWx0OiBSZWFjdFxufSk7XG5cbnZhciBSZWFjdCQzID0gKCBSZWFjdCQyICYmIFJlYWN0ICkgfHwgUmVhY3QkMjtcblxuLy8gVE9ETzogZGVjaWRlIG9uIHRoZSB0b3AtbGV2ZWwgZXhwb3J0IGZvcm0uXG4vLyBUaGlzIGlzIGhhY2t5IGJ1dCBtYWtlcyBpdCB3b3JrIHdpdGggYm90aCBSb2xsdXAgYW5kIEplc3QuXG52YXIgcmVhY3QgPSBSZWFjdCQzLmRlZmF1bHQgfHwgUmVhY3QkMztcblxubW9kdWxlLmV4cG9ydHMgPSByZWFjdDtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYwLjEzLjZcbiAqIHNjaGVkdWxlci10cmFjaW5nLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbi8vIEhlbHBzIGlkZW50aWZ5IHNpZGUgZWZmZWN0cyBpbiBiZWdpbi1waGFzZSBsaWZlY3ljbGUgaG9va3MgYW5kIHNldFN0YXRlIHJlZHVjZXJzOlxuXG5cbi8vIEluIHNvbWUgY2FzZXMsIFN0cmljdE1vZGUgc2hvdWxkIGFsc28gZG91YmxlLXJlbmRlciBsaWZlY3ljbGVzLlxuLy8gVGhpcyBjYW4gYmUgY29uZnVzaW5nIGZvciB0ZXN0cyB0aG91Z2gsXG4vLyBBbmQgaXQgY2FuIGJlIGJhZCBmb3IgcGVyZm9ybWFuY2UgaW4gcHJvZHVjdGlvbi5cbi8vIFRoaXMgZmVhdHVyZSBmbGFnIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGJlaGF2aW9yOlxuXG5cbi8vIFRvIHByZXNlcnZlIHRoZSBcIlBhdXNlIG9uIGNhdWdodCBleGNlcHRpb25zXCIgYmVoYXZpb3Igb2YgdGhlIGRlYnVnZ2VyLCB3ZVxuLy8gcmVwbGF5IHRoZSBiZWdpbiBwaGFzZSBvZiBhIGZhaWxlZCBjb21wb25lbnQgaW5zaWRlIGludm9rZUd1YXJkZWRDYWxsYmFjay5cblxuXG4vLyBXYXJuIGFib3V0IGRlcHJlY2F0ZWQsIGFzeW5jLXVuc2FmZSBsaWZlY3ljbGVzOyByZWxhdGVzIHRvIFJGQyAjNjpcblxuXG4vLyBHYXRoZXIgYWR2YW5jZWQgdGltaW5nIG1ldHJpY3MgZm9yIFByb2ZpbGVyIHN1YnRyZWVzLlxuXG5cbi8vIFRyYWNlIHdoaWNoIGludGVyYWN0aW9ucyB0cmlnZ2VyIGVhY2ggY29tbWl0LlxudmFyIGVuYWJsZVNjaGVkdWxlclRyYWNpbmcgPSB0cnVlO1xuXG4vLyBPbmx5IHVzZWQgaW4gd3d3IGJ1aWxkcy5cbiAvLyBUT0RPOiB0cnVlPyBIZXJlIGl0IG1pZ2h0IGp1c3QgYmUgZmFsc2UuXG5cbi8vIE9ubHkgdXNlZCBpbiB3d3cgYnVpbGRzLlxuXG5cbi8vIE9ubHkgdXNlZCBpbiB3d3cgYnVpbGRzLlxuXG5cbi8vIFJlYWN0IEZpcmU6IHByZXZlbnQgdGhlIHZhbHVlIGFuZCBjaGVja2VkIGF0dHJpYnV0ZXMgZnJvbSBzeW5jaW5nXG4vLyB3aXRoIHRoZWlyIHJlbGF0ZWQgRE9NIHByb3BlcnRpZXNcblxuXG4vLyBUaGVzZSBBUElzIHdpbGwgbm8gbG9uZ2VyIGJlIFwidW5zdGFibGVcIiBpbiB0aGUgdXBjb21pbmcgMTYuNyByZWxlYXNlLFxuLy8gQ29udHJvbCB0aGlzIGJlaGF2aW9yIHdpdGggYSBmbGFnIHRvIHN1cHBvcnQgMTYuNiBtaW5vciByZWxlYXNlcyBpbiB0aGUgbWVhbndoaWxlLlxuXG52YXIgREVGQVVMVF9USFJFQURfSUQgPSAwO1xuXG4vLyBDb3VudGVycyB1c2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMuXG52YXIgaW50ZXJhY3Rpb25JRENvdW50ZXIgPSAwO1xudmFyIHRocmVhZElEQ291bnRlciA9IDA7XG5cbi8vIFNldCBvZiBjdXJyZW50bHkgdHJhY2VkIGludGVyYWN0aW9ucy5cbi8vIEludGVyYWN0aW9ucyBcInN0YWNrXCLigJNcbi8vIE1lYW5pbmcgdGhhdCBuZXdseSB0cmFjZWQgaW50ZXJhY3Rpb25zIGFyZSBhcHBlbmRlZCB0byB0aGUgcHJldmlvdXNseSBhY3RpdmUgc2V0LlxuLy8gV2hlbiBhbiBpbnRlcmFjdGlvbiBnb2VzIG91dCBvZiBzY29wZSwgdGhlIHByZXZpb3VzIHNldCAoaWYgYW55KSBpcyByZXN0b3JlZC5cbmV4cG9ydHMuX19pbnRlcmFjdGlvbnNSZWYgPSBudWxsO1xuXG4vLyBMaXN0ZW5lcihzKSB0byBub3RpZnkgd2hlbiBpbnRlcmFjdGlvbnMgYmVnaW4gYW5kIGVuZC5cbmV4cG9ydHMuX19zdWJzY3JpYmVyUmVmID0gbnVsbDtcblxuaWYgKGVuYWJsZVNjaGVkdWxlclRyYWNpbmcpIHtcbiAgZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZiA9IHtcbiAgICBjdXJyZW50OiBuZXcgU2V0KClcbiAgfTtcbiAgZXhwb3J0cy5fX3N1YnNjcmliZXJSZWYgPSB7XG4gICAgY3VycmVudDogbnVsbFxuICB9O1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9jbGVhcihjYWxsYmFjaykge1xuICBpZiAoIWVuYWJsZVNjaGVkdWxlclRyYWNpbmcpIHtcbiAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgfVxuXG4gIHZhciBwcmV2SW50ZXJhY3Rpb25zID0gZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50O1xuICBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSBuZXcgU2V0KCk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSBwcmV2SW50ZXJhY3Rpb25zO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2dldEN1cnJlbnQoKSB7XG4gIGlmICghZW5hYmxlU2NoZWR1bGVyVHJhY2luZykge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfZ2V0VGhyZWFkSUQoKSB7XG4gIHJldHVybiArK3RocmVhZElEQ291bnRlcjtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfdHJhY2UobmFtZSwgdGltZXN0YW1wLCBjYWxsYmFjaykge1xuICB2YXIgdGhyZWFkSUQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IERFRkFVTFRfVEhSRUFEX0lEO1xuXG4gIGlmICghZW5hYmxlU2NoZWR1bGVyVHJhY2luZykge1xuICAgIHJldHVybiBjYWxsYmFjaygpO1xuICB9XG5cbiAgdmFyIGludGVyYWN0aW9uID0ge1xuICAgIF9fY291bnQ6IDEsXG4gICAgaWQ6IGludGVyYWN0aW9uSURDb3VudGVyKyssXG4gICAgbmFtZTogbmFtZSxcbiAgICB0aW1lc3RhbXA6IHRpbWVzdGFtcFxuICB9O1xuXG4gIHZhciBwcmV2SW50ZXJhY3Rpb25zID0gZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50O1xuXG4gIC8vIFRyYWNlZCBpbnRlcmFjdGlvbnMgc2hvdWxkIHN0YWNrL2FjY3VtdWxhdGUuXG4gIC8vIFRvIGRvIHRoYXQsIGNsb25lIHRoZSBjdXJyZW50IGludGVyYWN0aW9ucy5cbiAgLy8gVGhlIHByZXZpb3VzIHNldCB3aWxsIGJlIHJlc3RvcmVkIHVwb24gY29tcGxldGlvbi5cbiAgdmFyIGludGVyYWN0aW9ucyA9IG5ldyBTZXQocHJldkludGVyYWN0aW9ucyk7XG4gIGludGVyYWN0aW9ucy5hZGQoaW50ZXJhY3Rpb24pO1xuICBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSBpbnRlcmFjdGlvbnM7XG5cbiAgdmFyIHN1YnNjcmliZXIgPSBleHBvcnRzLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50O1xuICB2YXIgcmV0dXJuVmFsdWUgPSB2b2lkIDA7XG5cbiAgdHJ5IHtcbiAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgc3Vic2NyaWJlci5vbkludGVyYWN0aW9uVHJhY2VkKGludGVyYWN0aW9uKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChzdWJzY3JpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIHN1YnNjcmliZXIub25Xb3JrU3RhcnRlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuVmFsdWUgPSBjYWxsYmFjaygpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50ID0gcHJldkludGVyYWN0aW9ucztcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChzdWJzY3JpYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm9uV29ya1N0b3BwZWQoaW50ZXJhY3Rpb25zLCB0aHJlYWRJRCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGludGVyYWN0aW9uLl9fY291bnQtLTtcblxuICAgICAgICAgIC8vIElmIG5vIGFzeW5jIHdvcmsgd2FzIHNjaGVkdWxlZCBmb3IgdGhpcyBpbnRlcmFjdGlvbixcbiAgICAgICAgICAvLyBOb3RpZnkgc3Vic2NyaWJlcnMgdGhhdCBpdCdzIGNvbXBsZXRlZC5cbiAgICAgICAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCAmJiBpbnRlcmFjdGlvbi5fX2NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm9uSW50ZXJhY3Rpb25TY2hlZHVsZWRXb3JrQ29tcGxldGVkKGludGVyYWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0dXJuVmFsdWU7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3dyYXAoY2FsbGJhY2spIHtcbiAgdmFyIHRocmVhZElEID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBERUZBVUxUX1RIUkVBRF9JRDtcblxuICBpZiAoIWVuYWJsZVNjaGVkdWxlclRyYWNpbmcpIHtcbiAgICByZXR1cm4gY2FsbGJhY2s7XG4gIH1cblxuICB2YXIgd3JhcHBlZEludGVyYWN0aW9ucyA9IGV4cG9ydHMuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudDtcblxuICB2YXIgc3Vic2NyaWJlciA9IGV4cG9ydHMuX19zdWJzY3JpYmVyUmVmLmN1cnJlbnQ7XG4gIGlmIChzdWJzY3JpYmVyICE9PSBudWxsKSB7XG4gICAgc3Vic2NyaWJlci5vbldvcmtTY2hlZHVsZWQod3JhcHBlZEludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICB9XG5cbiAgLy8gVXBkYXRlIHRoZSBwZW5kaW5nIGFzeW5jIHdvcmsgY291bnQgZm9yIHRoZSBjdXJyZW50IGludGVyYWN0aW9ucy5cbiAgLy8gVXBkYXRlIGFmdGVyIGNhbGxpbmcgc3Vic2NyaWJlcnMgaW4gY2FzZSBvZiBlcnJvci5cbiAgd3JhcHBlZEludGVyYWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpbnRlcmFjdGlvbikge1xuICAgIGludGVyYWN0aW9uLl9fY291bnQrKztcbiAgfSk7XG5cbiAgdmFyIGhhc1J1biA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIHdyYXBwZWQoKSB7XG4gICAgdmFyIHByZXZJbnRlcmFjdGlvbnMgPSBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQ7XG4gICAgZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50ID0gd3JhcHBlZEludGVyYWN0aW9ucztcblxuICAgIHN1YnNjcmliZXIgPSBleHBvcnRzLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50O1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXR1cm5WYWx1ZSA9IHZvaWQgMDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLm9uV29ya1N0YXJ0ZWQod3JhcHBlZEludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVyblZhbHVlID0gY2FsbGJhY2suYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGV4cG9ydHMuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudCA9IHByZXZJbnRlcmFjdGlvbnM7XG5cbiAgICAgICAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5vbldvcmtTdG9wcGVkKHdyYXBwZWRJbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoIWhhc1J1bikge1xuICAgICAgICAvLyBXZSBvbmx5IGV4cGVjdCBhIHdyYXBwZWQgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgb25jZSxcbiAgICAgICAgLy8gQnV0IGluIHRoZSBldmVudCB0aGF0IGl0J3MgZXhlY3V0ZWQgbW9yZSB0aGFuIG9uY2XigJNcbiAgICAgICAgLy8gT25seSBkZWNyZW1lbnQgdGhlIG91dHN0YW5kaW5nIGludGVyYWN0aW9uIGNvdW50cyBvbmNlLlxuICAgICAgICBoYXNSdW4gPSB0cnVlO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBwZW5kaW5nIGFzeW5jIGNvdW50cyBmb3IgYWxsIHdyYXBwZWQgaW50ZXJhY3Rpb25zLlxuICAgICAgICAvLyBJZiB0aGlzIHdhcyB0aGUgbGFzdCBzY2hlZHVsZWQgYXN5bmMgd29yayBmb3IgYW55IG9mIHRoZW0sXG4gICAgICAgIC8vIE1hcmsgdGhlbSBhcyBjb21wbGV0ZWQuXG4gICAgICAgIHdyYXBwZWRJbnRlcmFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgICBpbnRlcmFjdGlvbi5fX2NvdW50LS07XG5cbiAgICAgICAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCAmJiBpbnRlcmFjdGlvbi5fX2NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm9uSW50ZXJhY3Rpb25TY2hlZHVsZWRXb3JrQ29tcGxldGVkKGludGVyYWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHdyYXBwZWQuY2FuY2VsID0gZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIHN1YnNjcmliZXIgPSBleHBvcnRzLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50O1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChzdWJzY3JpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIHN1YnNjcmliZXIub25Xb3JrQ2FuY2VsZWQod3JhcHBlZEludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBVcGRhdGUgcGVuZGluZyBhc3luYyBjb3VudHMgZm9yIGFsbCB3cmFwcGVkIGludGVyYWN0aW9ucy5cbiAgICAgIC8vIElmIHRoaXMgd2FzIHRoZSBsYXN0IHNjaGVkdWxlZCBhc3luYyB3b3JrIGZvciBhbnkgb2YgdGhlbSxcbiAgICAgIC8vIE1hcmsgdGhlbSBhcyBjb21wbGV0ZWQuXG4gICAgICB3cmFwcGVkSW50ZXJhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGludGVyYWN0aW9uKSB7XG4gICAgICAgIGludGVyYWN0aW9uLl9fY291bnQtLTtcblxuICAgICAgICBpZiAoc3Vic2NyaWJlciAmJiBpbnRlcmFjdGlvbi5fX2NvdW50ID09PSAwKSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5vbkludGVyYWN0aW9uU2NoZWR1bGVkV29ya0NvbXBsZXRlZChpbnRlcmFjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gd3JhcHBlZDtcbn1cblxudmFyIHN1YnNjcmliZXJzID0gbnVsbDtcbmlmIChlbmFibGVTY2hlZHVsZXJUcmFjaW5nKSB7XG4gIHN1YnNjcmliZXJzID0gbmV3IFNldCgpO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9zdWJzY3JpYmUoc3Vic2NyaWJlcikge1xuICBpZiAoZW5hYmxlU2NoZWR1bGVyVHJhY2luZykge1xuICAgIHN1YnNjcmliZXJzLmFkZChzdWJzY3JpYmVyKTtcblxuICAgIGlmIChzdWJzY3JpYmVycy5zaXplID09PSAxKSB7XG4gICAgICBleHBvcnRzLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50ID0ge1xuICAgICAgICBvbkludGVyYWN0aW9uU2NoZWR1bGVkV29ya0NvbXBsZXRlZDogb25JbnRlcmFjdGlvblNjaGVkdWxlZFdvcmtDb21wbGV0ZWQsXG4gICAgICAgIG9uSW50ZXJhY3Rpb25UcmFjZWQ6IG9uSW50ZXJhY3Rpb25UcmFjZWQsXG4gICAgICAgIG9uV29ya0NhbmNlbGVkOiBvbldvcmtDYW5jZWxlZCxcbiAgICAgICAgb25Xb3JrU2NoZWR1bGVkOiBvbldvcmtTY2hlZHVsZWQsXG4gICAgICAgIG9uV29ya1N0YXJ0ZWQ6IG9uV29ya1N0YXJ0ZWQsXG4gICAgICAgIG9uV29ya1N0b3BwZWQ6IG9uV29ya1N0b3BwZWRcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3Vuc3Vic2NyaWJlKHN1YnNjcmliZXIpIHtcbiAgaWYgKGVuYWJsZVNjaGVkdWxlclRyYWNpbmcpIHtcbiAgICBzdWJzY3JpYmVycy5kZWxldGUoc3Vic2NyaWJlcik7XG5cbiAgICBpZiAoc3Vic2NyaWJlcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgZXhwb3J0cy5fX3N1YnNjcmliZXJSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uSW50ZXJhY3Rpb25UcmFjZWQoaW50ZXJhY3Rpb24pIHtcbiAgdmFyIGRpZENhdGNoRXJyb3IgPSBmYWxzZTtcbiAgdmFyIGNhdWdodEVycm9yID0gbnVsbDtcblxuICBzdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN1YnNjcmliZXIub25JbnRlcmFjdGlvblRyYWNlZChpbnRlcmFjdGlvbik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghZGlkQ2F0Y2hFcnJvcikge1xuICAgICAgICBkaWRDYXRjaEVycm9yID0gdHJ1ZTtcbiAgICAgICAgY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGlmIChkaWRDYXRjaEVycm9yKSB7XG4gICAgdGhyb3cgY2F1Z2h0RXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gb25JbnRlcmFjdGlvblNjaGVkdWxlZFdvcmtDb21wbGV0ZWQoaW50ZXJhY3Rpb24pIHtcbiAgdmFyIGRpZENhdGNoRXJyb3IgPSBmYWxzZTtcbiAgdmFyIGNhdWdodEVycm9yID0gbnVsbDtcblxuICBzdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN1YnNjcmliZXIub25JbnRlcmFjdGlvblNjaGVkdWxlZFdvcmtDb21wbGV0ZWQoaW50ZXJhY3Rpb24pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWRpZENhdGNoRXJyb3IpIHtcbiAgICAgICAgZGlkQ2F0Y2hFcnJvciA9IHRydWU7XG4gICAgICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBpZiAoZGlkQ2F0Y2hFcnJvcikge1xuICAgIHRocm93IGNhdWdodEVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9uV29ya1NjaGVkdWxlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKSB7XG4gIHZhciBkaWRDYXRjaEVycm9yID0gZmFsc2U7XG4gIHZhciBjYXVnaHRFcnJvciA9IG51bGw7XG5cbiAgc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgIHRyeSB7XG4gICAgICBzdWJzY3JpYmVyLm9uV29ya1NjaGVkdWxlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFkaWRDYXRjaEVycm9yKSB7XG4gICAgICAgIGRpZENhdGNoRXJyb3IgPSB0cnVlO1xuICAgICAgICBjYXVnaHRFcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGRpZENhdGNoRXJyb3IpIHtcbiAgICB0aHJvdyBjYXVnaHRFcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbldvcmtTdGFydGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpIHtcbiAgdmFyIGRpZENhdGNoRXJyb3IgPSBmYWxzZTtcbiAgdmFyIGNhdWdodEVycm9yID0gbnVsbDtcblxuICBzdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN1YnNjcmliZXIub25Xb3JrU3RhcnRlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFkaWRDYXRjaEVycm9yKSB7XG4gICAgICAgIGRpZENhdGNoRXJyb3IgPSB0cnVlO1xuICAgICAgICBjYXVnaHRFcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGRpZENhdGNoRXJyb3IpIHtcbiAgICB0aHJvdyBjYXVnaHRFcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbldvcmtTdG9wcGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpIHtcbiAgdmFyIGRpZENhdGNoRXJyb3IgPSBmYWxzZTtcbiAgdmFyIGNhdWdodEVycm9yID0gbnVsbDtcblxuICBzdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN1YnNjcmliZXIub25Xb3JrU3RvcHBlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFkaWRDYXRjaEVycm9yKSB7XG4gICAgICAgIGRpZENhdGNoRXJyb3IgPSB0cnVlO1xuICAgICAgICBjYXVnaHRFcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGRpZENhdGNoRXJyb3IpIHtcbiAgICB0aHJvdyBjYXVnaHRFcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbldvcmtDYW5jZWxlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKSB7XG4gIHZhciBkaWRDYXRjaEVycm9yID0gZmFsc2U7XG4gIHZhciBjYXVnaHRFcnJvciA9IG51bGw7XG5cbiAgc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgIHRyeSB7XG4gICAgICBzdWJzY3JpYmVyLm9uV29ya0NhbmNlbGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWRpZENhdGNoRXJyb3IpIHtcbiAgICAgICAgZGlkQ2F0Y2hFcnJvciA9IHRydWU7XG4gICAgICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBpZiAoZGlkQ2F0Y2hFcnJvcikge1xuICAgIHRocm93IGNhdWdodEVycm9yO1xuICB9XG59XG5cbmV4cG9ydHMudW5zdGFibGVfY2xlYXIgPSB1bnN0YWJsZV9jbGVhcjtcbmV4cG9ydHMudW5zdGFibGVfZ2V0Q3VycmVudCA9IHVuc3RhYmxlX2dldEN1cnJlbnQ7XG5leHBvcnRzLnVuc3RhYmxlX2dldFRocmVhZElEID0gdW5zdGFibGVfZ2V0VGhyZWFkSUQ7XG5leHBvcnRzLnVuc3RhYmxlX3RyYWNlID0gdW5zdGFibGVfdHJhY2U7XG5leHBvcnRzLnVuc3RhYmxlX3dyYXAgPSB1bnN0YWJsZV93cmFwO1xuZXhwb3J0cy51bnN0YWJsZV9zdWJzY3JpYmUgPSB1bnN0YWJsZV9zdWJzY3JpYmU7XG5leHBvcnRzLnVuc3RhYmxlX3Vuc3Vic2NyaWJlID0gdW5zdGFibGVfdW5zdWJzY3JpYmU7XG4gIH0pKCk7XG59XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjAuMTMuNlxuICogc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbnZhciBlbmFibGVTY2hlZHVsZXJEZWJ1Z2dpbmcgPSBmYWxzZTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG5cbi8vIFRPRE86IFVzZSBzeW1ib2xzP1xudmFyIEltbWVkaWF0ZVByaW9yaXR5ID0gMTtcbnZhciBVc2VyQmxvY2tpbmdQcmlvcml0eSA9IDI7XG52YXIgTm9ybWFsUHJpb3JpdHkgPSAzO1xudmFyIExvd1ByaW9yaXR5ID0gNDtcbnZhciBJZGxlUHJpb3JpdHkgPSA1O1xuXG4vLyBNYXggMzEgYml0IGludGVnZXIuIFRoZSBtYXggaW50ZWdlciBzaXplIGluIFY4IGZvciAzMi1iaXQgc3lzdGVtcy5cbi8vIE1hdGgucG93KDIsIDMwKSAtIDFcbi8vIDBiMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExXG52YXIgbWF4U2lnbmVkMzFCaXRJbnQgPSAxMDczNzQxODIzO1xuXG4vLyBUaW1lcyBvdXQgaW1tZWRpYXRlbHlcbnZhciBJTU1FRElBVEVfUFJJT1JJVFlfVElNRU9VVCA9IC0xO1xuLy8gRXZlbnR1YWxseSB0aW1lcyBvdXRcbnZhciBVU0VSX0JMT0NLSU5HX1BSSU9SSVRZID0gMjUwO1xudmFyIE5PUk1BTF9QUklPUklUWV9USU1FT1VUID0gNTAwMDtcbnZhciBMT1dfUFJJT1JJVFlfVElNRU9VVCA9IDEwMDAwO1xuLy8gTmV2ZXIgdGltZXMgb3V0XG52YXIgSURMRV9QUklPUklUWSA9IG1heFNpZ25lZDMxQml0SW50O1xuXG4vLyBDYWxsYmFja3MgYXJlIHN0b3JlZCBhcyBhIGNpcmN1bGFyLCBkb3VibHkgbGlua2VkIGxpc3QuXG52YXIgZmlyc3RDYWxsYmFja05vZGUgPSBudWxsO1xuXG52YXIgY3VycmVudERpZFRpbWVvdXQgPSBmYWxzZTtcbi8vIFBhdXNpbmcgdGhlIHNjaGVkdWxlciBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbnZhciBpc1NjaGVkdWxlclBhdXNlZCA9IGZhbHNlO1xuXG52YXIgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbnZhciBjdXJyZW50RXZlbnRTdGFydFRpbWUgPSAtMTtcbnZhciBjdXJyZW50RXhwaXJhdGlvblRpbWUgPSAtMTtcblxuLy8gVGhpcyBpcyBzZXQgd2hlbiBhIGNhbGxiYWNrIGlzIGJlaW5nIGV4ZWN1dGVkLCB0byBwcmV2ZW50IHJlLWVudHJhbmN5LlxudmFyIGlzRXhlY3V0aW5nQ2FsbGJhY2sgPSBmYWxzZTtcblxudmFyIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gZmFsc2U7XG5cbnZhciBoYXNOYXRpdmVQZXJmb3JtYW5jZU5vdyA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLm5vdyA9PT0gJ2Z1bmN0aW9uJztcblxuZnVuY3Rpb24gZW5zdXJlSG9zdENhbGxiYWNrSXNTY2hlZHVsZWQoKSB7XG4gIGlmIChpc0V4ZWN1dGluZ0NhbGxiYWNrKSB7XG4gICAgLy8gRG9uJ3Qgc2NoZWR1bGUgd29yayB5ZXQ7IHdhaXQgdW50aWwgdGhlIG5leHQgdGltZSB3ZSB5aWVsZC5cbiAgICByZXR1cm47XG4gIH1cbiAgLy8gU2NoZWR1bGUgdGhlIGhvc3QgY2FsbGJhY2sgdXNpbmcgdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gaW4gdGhlIGxpc3QuXG4gIHZhciBleHBpcmF0aW9uVGltZSA9IGZpcnN0Q2FsbGJhY2tOb2RlLmV4cGlyYXRpb25UaW1lO1xuICBpZiAoIWlzSG9zdENhbGxiYWNrU2NoZWR1bGVkKSB7XG4gICAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIC8vIENhbmNlbCB0aGUgZXhpc3RpbmcgaG9zdCBjYWxsYmFjay5cbiAgICBjYW5jZWxIb3N0Q2FsbGJhY2soKTtcbiAgfVxuICByZXF1ZXN0SG9zdENhbGxiYWNrKGZsdXNoV29yaywgZXhwaXJhdGlvblRpbWUpO1xufVxuXG5mdW5jdGlvbiBmbHVzaEZpcnN0Q2FsbGJhY2soKSB7XG4gIHZhciBmbHVzaGVkTm9kZSA9IGZpcnN0Q2FsbGJhY2tOb2RlO1xuXG4gIC8vIFJlbW92ZSB0aGUgbm9kZSBmcm9tIHRoZSBsaXN0IGJlZm9yZSBjYWxsaW5nIHRoZSBjYWxsYmFjay4gVGhhdCB3YXkgdGhlXG4gIC8vIGxpc3QgaXMgaW4gYSBjb25zaXN0ZW50IHN0YXRlIGV2ZW4gaWYgdGhlIGNhbGxiYWNrIHRocm93cy5cbiAgdmFyIG5leHQgPSBmaXJzdENhbGxiYWNrTm9kZS5uZXh0O1xuICBpZiAoZmlyc3RDYWxsYmFja05vZGUgPT09IG5leHQpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBsYXN0IGNhbGxiYWNrIGluIHRoZSBsaXN0LlxuICAgIGZpcnN0Q2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgICBuZXh0ID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGFzdENhbGxiYWNrTm9kZSA9IGZpcnN0Q2FsbGJhY2tOb2RlLnByZXZpb3VzO1xuICAgIGZpcnN0Q2FsbGJhY2tOb2RlID0gbGFzdENhbGxiYWNrTm9kZS5uZXh0ID0gbmV4dDtcbiAgICBuZXh0LnByZXZpb3VzID0gbGFzdENhbGxiYWNrTm9kZTtcbiAgfVxuXG4gIGZsdXNoZWROb2RlLm5leHQgPSBmbHVzaGVkTm9kZS5wcmV2aW91cyA9IG51bGw7XG5cbiAgLy8gTm93IGl0J3Mgc2FmZSB0byBjYWxsIHRoZSBjYWxsYmFjay5cbiAgdmFyIGNhbGxiYWNrID0gZmx1c2hlZE5vZGUuY2FsbGJhY2s7XG4gIHZhciBleHBpcmF0aW9uVGltZSA9IGZsdXNoZWROb2RlLmV4cGlyYXRpb25UaW1lO1xuICB2YXIgcHJpb3JpdHlMZXZlbCA9IGZsdXNoZWROb2RlLnByaW9yaXR5TGV2ZWw7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgdmFyIHByZXZpb3VzRXhwaXJhdGlvblRpbWUgPSBjdXJyZW50RXhwaXJhdGlvblRpbWU7XG4gIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcbiAgY3VycmVudEV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gIHZhciBjb250aW51YXRpb25DYWxsYmFjaztcbiAgdHJ5IHtcbiAgICBjb250aW51YXRpb25DYWxsYmFjayA9IGNhbGxiYWNrKCk7XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gICAgY3VycmVudEV4cGlyYXRpb25UaW1lID0gcHJldmlvdXNFeHBpcmF0aW9uVGltZTtcbiAgfVxuXG4gIC8vIEEgY2FsbGJhY2sgbWF5IHJldHVybiBhIGNvbnRpbnVhdGlvbi4gVGhlIGNvbnRpbnVhdGlvbiBzaG91bGQgYmUgc2NoZWR1bGVkXG4gIC8vIHdpdGggdGhlIHNhbWUgcHJpb3JpdHkgYW5kIGV4cGlyYXRpb24gYXMgdGhlIGp1c3QtZmluaXNoZWQgY2FsbGJhY2suXG4gIGlmICh0eXBlb2YgY29udGludWF0aW9uQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgY29udGludWF0aW9uTm9kZSA9IHtcbiAgICAgIGNhbGxiYWNrOiBjb250aW51YXRpb25DYWxsYmFjayxcbiAgICAgIHByaW9yaXR5TGV2ZWw6IHByaW9yaXR5TGV2ZWwsXG4gICAgICBleHBpcmF0aW9uVGltZTogZXhwaXJhdGlvblRpbWUsXG4gICAgICBuZXh0OiBudWxsLFxuICAgICAgcHJldmlvdXM6IG51bGxcbiAgICB9O1xuXG4gICAgLy8gSW5zZXJ0IHRoZSBuZXcgY2FsbGJhY2sgaW50byB0aGUgbGlzdCwgc29ydGVkIGJ5IGl0cyBleHBpcmF0aW9uLiBUaGlzIGlzXG4gICAgLy8gYWxtb3N0IHRoZSBzYW1lIGFzIHRoZSBjb2RlIGluIGBzY2hlZHVsZUNhbGxiYWNrYCwgZXhjZXB0IHRoZSBjYWxsYmFja1xuICAgIC8vIGlzIGluc2VydGVkIGludG8gdGhlIGxpc3QgKmJlZm9yZSogY2FsbGJhY2tzIG9mIGVxdWFsIGV4cGlyYXRpb24gaW5zdGVhZFxuICAgIC8vIG9mIGFmdGVyLlxuICAgIGlmIChmaXJzdENhbGxiYWNrTm9kZSA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgY2FsbGJhY2sgaW4gdGhlIGxpc3QuXG4gICAgICBmaXJzdENhbGxiYWNrTm9kZSA9IGNvbnRpbnVhdGlvbk5vZGUubmV4dCA9IGNvbnRpbnVhdGlvbk5vZGUucHJldmlvdXMgPSBjb250aW51YXRpb25Ob2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbmV4dEFmdGVyQ29udGludWF0aW9uID0gbnVsbDtcbiAgICAgIHZhciBub2RlID0gZmlyc3RDYWxsYmFja05vZGU7XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChub2RlLmV4cGlyYXRpb25UaW1lID49IGV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgICAgLy8gVGhpcyBjYWxsYmFjayBleHBpcmVzIGF0IG9yIGFmdGVyIHRoZSBjb250aW51YXRpb24uIFdlIHdpbGwgaW5zZXJ0XG4gICAgICAgICAgLy8gdGhlIGNvbnRpbnVhdGlvbiAqYmVmb3JlKiB0aGlzIGNhbGxiYWNrLlxuICAgICAgICAgIG5leHRBZnRlckNvbnRpbnVhdGlvbiA9IG5vZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgIH0gd2hpbGUgKG5vZGUgIT09IGZpcnN0Q2FsbGJhY2tOb2RlKTtcblxuICAgICAgaWYgKG5leHRBZnRlckNvbnRpbnVhdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICAvLyBObyBlcXVhbCBvciBsb3dlciBwcmlvcml0eSBjYWxsYmFjayB3YXMgZm91bmQsIHdoaWNoIG1lYW5zIHRoZSBuZXdcbiAgICAgICAgLy8gY2FsbGJhY2sgaXMgdGhlIGxvd2VzdCBwcmlvcml0eSBjYWxsYmFjayBpbiB0aGUgbGlzdC5cbiAgICAgICAgbmV4dEFmdGVyQ29udGludWF0aW9uID0gZmlyc3RDYWxsYmFja05vZGU7XG4gICAgICB9IGVsc2UgaWYgKG5leHRBZnRlckNvbnRpbnVhdGlvbiA9PT0gZmlyc3RDYWxsYmFja05vZGUpIHtcbiAgICAgICAgLy8gVGhlIG5ldyBjYWxsYmFjayBpcyB0aGUgaGlnaGVzdCBwcmlvcml0eSBjYWxsYmFjayBpbiB0aGUgbGlzdC5cbiAgICAgICAgZmlyc3RDYWxsYmFja05vZGUgPSBjb250aW51YXRpb25Ob2RlO1xuICAgICAgICBlbnN1cmVIb3N0Q2FsbGJhY2tJc1NjaGVkdWxlZCgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJldmlvdXMgPSBuZXh0QWZ0ZXJDb250aW51YXRpb24ucHJldmlvdXM7XG4gICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dEFmdGVyQ29udGludWF0aW9uLnByZXZpb3VzID0gY29udGludWF0aW9uTm9kZTtcbiAgICAgIGNvbnRpbnVhdGlvbk5vZGUubmV4dCA9IG5leHRBZnRlckNvbnRpbnVhdGlvbjtcbiAgICAgIGNvbnRpbnVhdGlvbk5vZGUucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmx1c2hJbW1lZGlhdGVXb3JrKCkge1xuICBpZiAoXG4gIC8vIENvbmZpcm0gd2UndmUgZXhpdGVkIHRoZSBvdXRlciBtb3N0IGV2ZW50IGhhbmRsZXJcbiAgY3VycmVudEV2ZW50U3RhcnRUaW1lID09PSAtMSAmJiBmaXJzdENhbGxiYWNrTm9kZSAhPT0gbnVsbCAmJiBmaXJzdENhbGxiYWNrTm9kZS5wcmlvcml0eUxldmVsID09PSBJbW1lZGlhdGVQcmlvcml0eSkge1xuICAgIGlzRXhlY3V0aW5nQ2FsbGJhY2sgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBkbyB7XG4gICAgICAgIGZsdXNoRmlyc3RDYWxsYmFjaygpO1xuICAgICAgfSB3aGlsZSAoXG4gICAgICAvLyBLZWVwIGZsdXNoaW5nIHVudGlsIHRoZXJlIGFyZSBubyBtb3JlIGltbWVkaWF0ZSBjYWxsYmFja3NcbiAgICAgIGZpcnN0Q2FsbGJhY2tOb2RlICE9PSBudWxsICYmIGZpcnN0Q2FsbGJhY2tOb2RlLnByaW9yaXR5TGV2ZWwgPT09IEltbWVkaWF0ZVByaW9yaXR5KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaXNFeGVjdXRpbmdDYWxsYmFjayA9IGZhbHNlO1xuICAgICAgaWYgKGZpcnN0Q2FsbGJhY2tOb2RlICE9PSBudWxsKSB7XG4gICAgICAgIC8vIFRoZXJlJ3Mgc3RpbGwgd29yayByZW1haW5pbmcuIFJlcXVlc3QgYW5vdGhlciBjYWxsYmFjay5cbiAgICAgICAgZW5zdXJlSG9zdENhbGxiYWNrSXNTY2hlZHVsZWQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoV29yayhkaWRUaW1lb3V0KSB7XG4gIC8vIEV4aXQgcmlnaHQgYXdheSBpZiB3ZSdyZSBjdXJyZW50bHkgcGF1c2VkXG5cbiAgaWYgKGVuYWJsZVNjaGVkdWxlckRlYnVnZ2luZyAmJiBpc1NjaGVkdWxlclBhdXNlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlzRXhlY3V0aW5nQ2FsbGJhY2sgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNEaWRUaW1lb3V0ID0gY3VycmVudERpZFRpbWVvdXQ7XG4gIGN1cnJlbnREaWRUaW1lb3V0ID0gZGlkVGltZW91dDtcbiAgdHJ5IHtcbiAgICBpZiAoZGlkVGltZW91dCkge1xuICAgICAgLy8gRmx1c2ggYWxsIHRoZSBleHBpcmVkIGNhbGxiYWNrcyB3aXRob3V0IHlpZWxkaW5nLlxuICAgICAgd2hpbGUgKGZpcnN0Q2FsbGJhY2tOb2RlICE9PSBudWxsICYmICEoZW5hYmxlU2NoZWR1bGVyRGVidWdnaW5nICYmIGlzU2NoZWR1bGVyUGF1c2VkKSkge1xuICAgICAgICAvLyBUT0RPIFdyYXAgaW4gZmVhdHVyZSBmbGFnXG4gICAgICAgIC8vIFJlYWQgdGhlIGN1cnJlbnQgdGltZS4gRmx1c2ggYWxsIHRoZSBjYWxsYmFja3MgdGhhdCBleHBpcmUgYXQgb3JcbiAgICAgICAgLy8gZWFybGllciB0aGFuIHRoYXQgdGltZS4gVGhlbiByZWFkIHRoZSBjdXJyZW50IHRpbWUgYWdhaW4gYW5kIHJlcGVhdC5cbiAgICAgICAgLy8gVGhpcyBvcHRpbWl6ZXMgZm9yIGFzIGZldyBwZXJmb3JtYW5jZS5ub3cgY2FsbHMgYXMgcG9zc2libGUuXG4gICAgICAgIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG4gICAgICAgIGlmIChmaXJzdENhbGxiYWNrTm9kZS5leHBpcmF0aW9uVGltZSA8PSBjdXJyZW50VGltZSkge1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGZsdXNoRmlyc3RDYWxsYmFjaygpO1xuICAgICAgICAgIH0gd2hpbGUgKGZpcnN0Q2FsbGJhY2tOb2RlICE9PSBudWxsICYmIGZpcnN0Q2FsbGJhY2tOb2RlLmV4cGlyYXRpb25UaW1lIDw9IGN1cnJlbnRUaW1lICYmICEoZW5hYmxlU2NoZWR1bGVyRGVidWdnaW5nICYmIGlzU2NoZWR1bGVyUGF1c2VkKSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEtlZXAgZmx1c2hpbmcgY2FsbGJhY2tzIHVudGlsIHdlIHJ1biBvdXQgb2YgdGltZSBpbiB0aGUgZnJhbWUuXG4gICAgICBpZiAoZmlyc3RDYWxsYmFja05vZGUgIT09IG51bGwpIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIGlmIChlbmFibGVTY2hlZHVsZXJEZWJ1Z2dpbmcgJiYgaXNTY2hlZHVsZXJQYXVzZWQpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaEZpcnN0Q2FsbGJhY2soKTtcbiAgICAgICAgfSB3aGlsZSAoZmlyc3RDYWxsYmFja05vZGUgIT09IG51bGwgJiYgIXNob3VsZFlpZWxkVG9Ib3N0KCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpc0V4ZWN1dGluZ0NhbGxiYWNrID0gZmFsc2U7XG4gICAgY3VycmVudERpZFRpbWVvdXQgPSBwcmV2aW91c0RpZFRpbWVvdXQ7XG4gICAgaWYgKGZpcnN0Q2FsbGJhY2tOb2RlICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGVyZSdzIHN0aWxsIHdvcmsgcmVtYWluaW5nLiBSZXF1ZXN0IGFub3RoZXIgY2FsbGJhY2suXG4gICAgICBlbnN1cmVIb3N0Q2FsbGJhY2tJc1NjaGVkdWxlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyBCZWZvcmUgZXhpdGluZywgZmx1c2ggYWxsIHRoZSBpbW1lZGlhdGUgd29yayB0aGF0IHdhcyBzY2hlZHVsZWQuXG4gICAgZmx1c2hJbW1lZGlhdGVXb3JrKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfcnVuV2l0aFByaW9yaXR5KHByaW9yaXR5TGV2ZWwsIGV2ZW50SGFuZGxlcikge1xuICBzd2l0Y2ggKHByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgIGNhc2UgSWRsZVByaW9yaXR5OlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgfVxuXG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgdmFyIHByZXZpb3VzRXZlbnRTdGFydFRpbWUgPSBjdXJyZW50RXZlbnRTdGFydFRpbWU7XG4gIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcbiAgY3VycmVudEV2ZW50U3RhcnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcblxuICB0cnkge1xuICAgIHJldHVybiBldmVudEhhbmRsZXIoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgICBjdXJyZW50RXZlbnRTdGFydFRpbWUgPSBwcmV2aW91c0V2ZW50U3RhcnRUaW1lO1xuXG4gICAgLy8gQmVmb3JlIGV4aXRpbmcsIGZsdXNoIGFsbCB0aGUgaW1tZWRpYXRlIHdvcmsgdGhhdCB3YXMgc2NoZWR1bGVkLlxuICAgIGZsdXNoSW1tZWRpYXRlV29yaygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX25leHQoZXZlbnRIYW5kbGVyKSB7XG4gIHZhciBwcmlvcml0eUxldmVsID0gdm9pZCAwO1xuICBzd2l0Y2ggKGN1cnJlbnRQcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgICAvLyBTaGlmdCBkb3duIHRvIG5vcm1hbCBwcmlvcml0eVxuICAgICAgcHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIEFueXRoaW5nIGxvd2VyIHRoYW4gbm9ybWFsIHByaW9yaXR5IHNob3VsZCByZW1haW4gYXQgdGhlIGN1cnJlbnQgbGV2ZWwuXG4gICAgICBwcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgdmFyIHByZXZpb3VzRXZlbnRTdGFydFRpbWUgPSBjdXJyZW50RXZlbnRTdGFydFRpbWU7XG4gIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcbiAgY3VycmVudEV2ZW50U3RhcnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcblxuICB0cnkge1xuICAgIHJldHVybiBldmVudEhhbmRsZXIoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgICBjdXJyZW50RXZlbnRTdGFydFRpbWUgPSBwcmV2aW91c0V2ZW50U3RhcnRUaW1lO1xuXG4gICAgLy8gQmVmb3JlIGV4aXRpbmcsIGZsdXNoIGFsbCB0aGUgaW1tZWRpYXRlIHdvcmsgdGhhdCB3YXMgc2NoZWR1bGVkLlxuICAgIGZsdXNoSW1tZWRpYXRlV29yaygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3dyYXBDYWxsYmFjayhjYWxsYmFjaykge1xuICB2YXIgcGFyZW50UHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIC8vIFRoaXMgaXMgYSBmb3JrIG9mIHJ1bldpdGhQcmlvcml0eSwgaW5saW5lZCBmb3IgcGVyZm9ybWFuY2UuXG4gICAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICAgIHZhciBwcmV2aW91c0V2ZW50U3RhcnRUaW1lID0gY3VycmVudEV2ZW50U3RhcnRUaW1lO1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcGFyZW50UHJpb3JpdHlMZXZlbDtcbiAgICBjdXJyZW50RXZlbnRTdGFydFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgICAgIGN1cnJlbnRFdmVudFN0YXJ0VGltZSA9IHByZXZpb3VzRXZlbnRTdGFydFRpbWU7XG4gICAgICBmbHVzaEltbWVkaWF0ZVdvcmsoKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHJlY2F0ZWRfb3B0aW9ucykge1xuICB2YXIgc3RhcnRUaW1lID0gY3VycmVudEV2ZW50U3RhcnRUaW1lICE9PSAtMSA/IGN1cnJlbnRFdmVudFN0YXJ0VGltZSA6IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG5cbiAgdmFyIGV4cGlyYXRpb25UaW1lO1xuICBpZiAodHlwZW9mIGRlcHJlY2F0ZWRfb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgZGVwcmVjYXRlZF9vcHRpb25zICE9PSBudWxsICYmIHR5cGVvZiBkZXByZWNhdGVkX29wdGlvbnMudGltZW91dCA9PT0gJ251bWJlcicpIHtcbiAgICAvLyBGSVhNRTogUmVtb3ZlIHRoaXMgYnJhbmNoIG9uY2Ugd2UgbGlmdCBleHBpcmF0aW9uIHRpbWVzIG91dCBvZiBSZWFjdC5cbiAgICBleHBpcmF0aW9uVGltZSA9IHN0YXJ0VGltZSArIGRlcHJlY2F0ZWRfb3B0aW9ucy50aW1lb3V0O1xuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAoY3VycmVudFByaW9yaXR5TGV2ZWwpIHtcbiAgICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgICAgIGV4cGlyYXRpb25UaW1lID0gc3RhcnRUaW1lICsgSU1NRURJQVRFX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICAgICAgZXhwaXJhdGlvblRpbWUgPSBzdGFydFRpbWUgKyBVU0VSX0JMT0NLSU5HX1BSSU9SSVRZO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgSWRsZVByaW9yaXR5OlxuICAgICAgICBleHBpcmF0aW9uVGltZSA9IHN0YXJ0VGltZSArIElETEVfUFJJT1JJVFk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMb3dQcmlvcml0eTpcbiAgICAgICAgZXhwaXJhdGlvblRpbWUgPSBzdGFydFRpbWUgKyBMT1dfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE5vcm1hbFByaW9yaXR5OlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZXhwaXJhdGlvblRpbWUgPSBzdGFydFRpbWUgKyBOT1JNQUxfUFJJT1JJVFlfVElNRU9VVDtcbiAgICB9XG4gIH1cblxuICB2YXIgbmV3Tm9kZSA9IHtcbiAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgcHJpb3JpdHlMZXZlbDogY3VycmVudFByaW9yaXR5TGV2ZWwsXG4gICAgZXhwaXJhdGlvblRpbWU6IGV4cGlyYXRpb25UaW1lLFxuICAgIG5leHQ6IG51bGwsXG4gICAgcHJldmlvdXM6IG51bGxcbiAgfTtcblxuICAvLyBJbnNlcnQgdGhlIG5ldyBjYWxsYmFjayBpbnRvIHRoZSBsaXN0LCBvcmRlcmVkIGZpcnN0IGJ5IGV4cGlyYXRpb24sIHRoZW5cbiAgLy8gYnkgaW5zZXJ0aW9uLiBTbyB0aGUgbmV3IGNhbGxiYWNrIGlzIGluc2VydGVkIGFueSBvdGhlciBjYWxsYmFjayB3aXRoXG4gIC8vIGVxdWFsIGV4cGlyYXRpb24uXG4gIGlmIChmaXJzdENhbGxiYWNrTm9kZSA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGNhbGxiYWNrIGluIHRoZSBsaXN0LlxuICAgIGZpcnN0Q2FsbGJhY2tOb2RlID0gbmV3Tm9kZS5uZXh0ID0gbmV3Tm9kZS5wcmV2aW91cyA9IG5ld05vZGU7XG4gICAgZW5zdXJlSG9zdENhbGxiYWNrSXNTY2hlZHVsZWQoKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmV4dCA9IG51bGw7XG4gICAgdmFyIG5vZGUgPSBmaXJzdENhbGxiYWNrTm9kZTtcbiAgICBkbyB7XG4gICAgICBpZiAobm9kZS5leHBpcmF0aW9uVGltZSA+IGV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgIC8vIFRoZSBuZXcgY2FsbGJhY2sgZXhwaXJlcyBiZWZvcmUgdGhpcyBvbmUuXG4gICAgICAgIG5leHQgPSBub2RlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgfSB3aGlsZSAobm9kZSAhPT0gZmlyc3RDYWxsYmFja05vZGUpO1xuXG4gICAgaWYgKG5leHQgPT09IG51bGwpIHtcbiAgICAgIC8vIE5vIGNhbGxiYWNrIHdpdGggYSBsYXRlciBleHBpcmF0aW9uIHdhcyBmb3VuZCwgd2hpY2ggbWVhbnMgdGhlIG5ld1xuICAgICAgLy8gY2FsbGJhY2sgaGFzIHRoZSBsYXRlc3QgZXhwaXJhdGlvbiBpbiB0aGUgbGlzdC5cbiAgICAgIG5leHQgPSBmaXJzdENhbGxiYWNrTm9kZTtcbiAgICB9IGVsc2UgaWYgKG5leHQgPT09IGZpcnN0Q2FsbGJhY2tOb2RlKSB7XG4gICAgICAvLyBUaGUgbmV3IGNhbGxiYWNrIGhhcyB0aGUgZWFybGllc3QgZXhwaXJhdGlvbiBpbiB0aGUgZW50aXJlIGxpc3QuXG4gICAgICBmaXJzdENhbGxiYWNrTm9kZSA9IG5ld05vZGU7XG4gICAgICBlbnN1cmVIb3N0Q2FsbGJhY2tJc1NjaGVkdWxlZCgpO1xuICAgIH1cblxuICAgIHZhciBwcmV2aW91cyA9IG5leHQucHJldmlvdXM7XG4gICAgcHJldmlvdXMubmV4dCA9IG5leHQucHJldmlvdXMgPSBuZXdOb2RlO1xuICAgIG5ld05vZGUubmV4dCA9IG5leHQ7XG4gICAgbmV3Tm9kZS5wcmV2aW91cyA9IHByZXZpb3VzO1xuICB9XG5cbiAgcmV0dXJuIG5ld05vZGU7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uKCkge1xuICBpc1NjaGVkdWxlclBhdXNlZCA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uKCkge1xuICBpc1NjaGVkdWxlclBhdXNlZCA9IGZhbHNlO1xuICBpZiAoZmlyc3RDYWxsYmFja05vZGUgIT09IG51bGwpIHtcbiAgICBlbnN1cmVIb3N0Q2FsbGJhY2tJc1NjaGVkdWxlZCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlKCkge1xuICByZXR1cm4gZmlyc3RDYWxsYmFja05vZGU7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2NhbmNlbENhbGxiYWNrKGNhbGxiYWNrTm9kZSkge1xuICB2YXIgbmV4dCA9IGNhbGxiYWNrTm9kZS5uZXh0O1xuICBpZiAobmV4dCA9PT0gbnVsbCkge1xuICAgIC8vIEFscmVhZHkgY2FuY2VsbGVkLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChuZXh0ID09PSBjYWxsYmFja05vZGUpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBvbmx5IHNjaGVkdWxlZCBjYWxsYmFjay4gQ2xlYXIgdGhlIGxpc3QuXG4gICAgZmlyc3RDYWxsYmFja05vZGUgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIC8vIFJlbW92ZSB0aGUgY2FsbGJhY2sgZnJvbSBpdHMgcG9zaXRpb24gaW4gdGhlIGxpc3QuXG4gICAgaWYgKGNhbGxiYWNrTm9kZSA9PT0gZmlyc3RDYWxsYmFja05vZGUpIHtcbiAgICAgIGZpcnN0Q2FsbGJhY2tOb2RlID0gbmV4dDtcbiAgICB9XG4gICAgdmFyIHByZXZpb3VzID0gY2FsbGJhY2tOb2RlLnByZXZpb3VzO1xuICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgfVxuXG4gIGNhbGxiYWNrTm9kZS5uZXh0ID0gY2FsbGJhY2tOb2RlLnByZXZpb3VzID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKSB7XG4gIHJldHVybiBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfc2hvdWxkWWllbGQoKSB7XG4gIHJldHVybiAhY3VycmVudERpZFRpbWVvdXQgJiYgKGZpcnN0Q2FsbGJhY2tOb2RlICE9PSBudWxsICYmIGZpcnN0Q2FsbGJhY2tOb2RlLmV4cGlyYXRpb25UaW1lIDwgY3VycmVudEV4cGlyYXRpb25UaW1lIHx8IHNob3VsZFlpZWxkVG9Ib3N0KCkpO1xufVxuXG4vLyBUaGUgcmVtYWluaW5nIGNvZGUgaXMgZXNzZW50aWFsbHkgYSBwb2x5ZmlsbCBmb3IgcmVxdWVzdElkbGVDYWxsYmFjay4gSXRcbi8vIHdvcmtzIGJ5IHNjaGVkdWxpbmcgYSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUsIHN0b3JpbmcgdGhlIHRpbWUgZm9yIHRoZSBzdGFydFxuLy8gb2YgdGhlIGZyYW1lLCB0aGVuIHNjaGVkdWxpbmcgYSBwb3N0TWVzc2FnZSB3aGljaCBnZXRzIHNjaGVkdWxlZCBhZnRlciBwYWludC5cbi8vIFdpdGhpbiB0aGUgcG9zdE1lc3NhZ2UgaGFuZGxlciBkbyBhcyBtdWNoIHdvcmsgYXMgcG9zc2libGUgdW50aWwgdGltZSArIGZyYW1lXG4vLyByYXRlLiBCeSBzZXBhcmF0aW5nIHRoZSBpZGxlIGNhbGwgaW50byBhIHNlcGFyYXRlIGV2ZW50IHRpY2sgd2UgZW5zdXJlIHRoYXRcbi8vIGxheW91dCwgcGFpbnQgYW5kIG90aGVyIGJyb3dzZXIgd29yayBpcyBjb3VudGVkIGFnYWluc3QgdGhlIGF2YWlsYWJsZSB0aW1lLlxuLy8gVGhlIGZyYW1lIHJhdGUgaXMgZHluYW1pY2FsbHkgYWRqdXN0ZWQuXG5cbi8vIFdlIGNhcHR1cmUgYSBsb2NhbCByZWZlcmVuY2UgdG8gYW55IGdsb2JhbCwgaW4gY2FzZSBpdCBnZXRzIHBvbHlmaWxsZWQgYWZ0ZXJcbi8vIHRoaXMgbW9kdWxlIGlzIGluaXRpYWxseSBldmFsdWF0ZWQuIFdlIHdhbnQgdG8gYmUgdXNpbmcgYVxuLy8gY29uc2lzdGVudCBpbXBsZW1lbnRhdGlvbi5cbnZhciBsb2NhbERhdGUgPSBEYXRlO1xuXG4vLyBUaGlzIGluaXRpYWxpemF0aW9uIGNvZGUgbWF5IHJ1biBldmVuIG9uIHNlcnZlciBlbnZpcm9ubWVudHMgaWYgYSBjb21wb25lbnRcbi8vIGp1c3QgaW1wb3J0cyBSZWFjdERPTSAoZS5nLiBmb3IgZmluZERPTU5vZGUpLiBTb21lIGVudmlyb25tZW50cyBtaWdodCBub3Rcbi8vIGhhdmUgc2V0VGltZW91dCBvciBjbGVhclRpbWVvdXQuIEhvd2V2ZXIsIHdlIGFsd2F5cyBleHBlY3QgdGhlbSB0byBiZSBkZWZpbmVkXG4vLyBvbiB0aGUgY2xpZW50LiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xMzA4OFxudmFyIGxvY2FsU2V0VGltZW91dCA9IHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gc2V0VGltZW91dCA6IHVuZGVmaW5lZDtcbnZhciBsb2NhbENsZWFyVGltZW91dCA9IHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBjbGVhclRpbWVvdXQgOiB1bmRlZmluZWQ7XG5cbi8vIFdlIGRvbid0IGV4cGVjdCBlaXRoZXIgb2YgdGhlc2UgdG8gbmVjZXNzYXJpbHkgYmUgZGVmaW5lZCwgYnV0IHdlIHdpbGwgZXJyb3Jcbi8vIGxhdGVyIGlmIHRoZXkgYXJlIG1pc3Npbmcgb24gdGhlIGNsaWVudC5cbnZhciBsb2NhbFJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbicgPyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgOiB1bmRlZmluZWQ7XG52YXIgbG9jYWxDYW5jZWxBbmltYXRpb25GcmFtZSA9IHR5cGVvZiBjYW5jZWxBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJyA/IGNhbmNlbEFuaW1hdGlvbkZyYW1lIDogdW5kZWZpbmVkO1xuXG4vLyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgZG9lcyBub3QgcnVuIHdoZW4gdGhlIHRhYiBpcyBpbiB0aGUgYmFja2dyb3VuZC4gSWZcbi8vIHdlJ3JlIGJhY2tncm91bmRlZCB3ZSBwcmVmZXIgZm9yIHRoYXQgd29yayB0byBoYXBwZW4gc28gdGhhdCB0aGUgcGFnZVxuLy8gY29udGludWVzIHRvIGxvYWQgaW4gdGhlIGJhY2tncm91bmQuIFNvIHdlIGFsc28gc2NoZWR1bGUgYSAnc2V0VGltZW91dCcgYXNcbi8vIGEgZmFsbGJhY2suXG4vLyBUT0RPOiBOZWVkIGEgYmV0dGVyIGhldXJpc3RpYyBmb3IgYmFja2dyb3VuZGVkIHdvcmsuXG52YXIgQU5JTUFUSU9OX0ZSQU1FX1RJTUVPVVQgPSAxMDA7XG52YXIgckFGSUQ7XG52YXIgckFGVGltZW91dElEO1xudmFyIHJlcXVlc3RBbmltYXRpb25GcmFtZVdpdGhUaW1lb3V0ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIC8vIHNjaGVkdWxlIHJBRiBhbmQgYWxzbyBhIHNldFRpbWVvdXRcbiAgckFGSUQgPSBsb2NhbFJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAodGltZXN0YW1wKSB7XG4gICAgLy8gY2FuY2VsIHRoZSBzZXRUaW1lb3V0XG4gICAgbG9jYWxDbGVhclRpbWVvdXQockFGVGltZW91dElEKTtcbiAgICBjYWxsYmFjayh0aW1lc3RhbXApO1xuICB9KTtcbiAgckFGVGltZW91dElEID0gbG9jYWxTZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBjYW5jZWwgdGhlIHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgIGxvY2FsQ2FuY2VsQW5pbWF0aW9uRnJhbWUockFGSUQpO1xuICAgIGNhbGxiYWNrKGV4cG9ydHMudW5zdGFibGVfbm93KCkpO1xuICB9LCBBTklNQVRJT05fRlJBTUVfVElNRU9VVCk7XG59O1xuXG5pZiAoaGFzTmF0aXZlUGVyZm9ybWFuY2VOb3cpIHtcbiAgdmFyIFBlcmZvcm1hbmNlID0gcGVyZm9ybWFuY2U7XG4gIGV4cG9ydHMudW5zdGFibGVfbm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBQZXJmb3JtYW5jZS5ub3coKTtcbiAgfTtcbn0gZWxzZSB7XG4gIGV4cG9ydHMudW5zdGFibGVfbm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBsb2NhbERhdGUubm93KCk7XG4gIH07XG59XG5cbnZhciByZXF1ZXN0SG9zdENhbGxiYWNrO1xudmFyIGNhbmNlbEhvc3RDYWxsYmFjaztcbnZhciBzaG91bGRZaWVsZFRvSG9zdDtcblxudmFyIGdsb2JhbFZhbHVlID0gbnVsbDtcbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICBnbG9iYWxWYWx1ZSA9IHdpbmRvdztcbn0gZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgZ2xvYmFsVmFsdWUgPSBnbG9iYWw7XG59XG5cbmlmIChnbG9iYWxWYWx1ZSAmJiBnbG9iYWxWYWx1ZS5fc2NoZWRNb2NrKSB7XG4gIC8vIER5bmFtaWMgaW5qZWN0aW9uLCBvbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICB2YXIgZ2xvYmFsSW1wbCA9IGdsb2JhbFZhbHVlLl9zY2hlZE1vY2s7XG4gIHJlcXVlc3RIb3N0Q2FsbGJhY2sgPSBnbG9iYWxJbXBsWzBdO1xuICBjYW5jZWxIb3N0Q2FsbGJhY2sgPSBnbG9iYWxJbXBsWzFdO1xuICBzaG91bGRZaWVsZFRvSG9zdCA9IGdsb2JhbEltcGxbMl07XG4gIGV4cG9ydHMudW5zdGFibGVfbm93ID0gZ2xvYmFsSW1wbFszXTtcbn0gZWxzZSBpZiAoXG4vLyBJZiBTY2hlZHVsZXIgcnVucyBpbiBhIG5vbi1ET00gZW52aXJvbm1lbnQsIGl0IGZhbGxzIGJhY2sgdG8gYSBuYWl2ZVxuLy8gaW1wbGVtZW50YXRpb24gdXNpbmcgc2V0VGltZW91dC5cbnR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8XG4vLyBDaGVjayBpZiBNZXNzYWdlQ2hhbm5lbCBpcyBzdXBwb3J0ZWQsIHRvby5cbnR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ2Z1bmN0aW9uJykge1xuICAvLyBJZiB0aGlzIGFjY2lkZW50YWxseSBnZXRzIGltcG9ydGVkIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnQsIGUuZy4gSmF2YVNjcmlwdENvcmUsXG4gIC8vIGZhbGxiYWNrIHRvIGEgbmFpdmUgaW1wbGVtZW50YXRpb24uXG4gIHZhciBfY2FsbGJhY2sgPSBudWxsO1xuICB2YXIgX2ZsdXNoQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZGlkVGltZW91dCkge1xuICAgIGlmIChfY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIF9jYWxsYmFjayhkaWRUaW1lb3V0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9jYWxsYmFjayA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXF1ZXN0SG9zdENhbGxiYWNrID0gZnVuY3Rpb24gKGNiLCBtcykge1xuICAgIGlmIChfY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIC8vIFByb3RlY3QgYWdhaW5zdCByZS1lbnRyYW5jeS5cbiAgICAgIHNldFRpbWVvdXQocmVxdWVzdEhvc3RDYWxsYmFjaywgMCwgY2IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfY2FsbGJhY2sgPSBjYjtcbiAgICAgIHNldFRpbWVvdXQoX2ZsdXNoQ2FsbGJhY2ssIDAsIGZhbHNlKTtcbiAgICB9XG4gIH07XG4gIGNhbmNlbEhvc3RDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICBfY2FsbGJhY2sgPSBudWxsO1xuICB9O1xuICBzaG91bGRZaWVsZFRvSG9zdCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG59IGVsc2Uge1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gVE9ETzogUmVtb3ZlIGZiLm1lIGxpbmtcbiAgICBpZiAodHlwZW9mIGxvY2FsUmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiVGhpcyBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuIFwiICsgJ01ha2Ugc3VyZSB0aGF0IHlvdSBsb2FkIGEgJyArICdwb2x5ZmlsbCBpbiBvbGRlciBicm93c2Vycy4gaHR0cHM6Ly9mYi5tZS9yZWFjdC1wb2x5ZmlsbHMnKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBsb2NhbENhbmNlbEFuaW1hdGlvbkZyYW1lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiVGhpcyBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBjYW5jZWxBbmltYXRpb25GcmFtZS4gXCIgKyAnTWFrZSBzdXJlIHRoYXQgeW91IGxvYWQgYSAnICsgJ3BvbHlmaWxsIGluIG9sZGVyIGJyb3dzZXJzLiBodHRwczovL2ZiLm1lL3JlYWN0LXBvbHlmaWxscycpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBudWxsO1xuICB2YXIgaXNNZXNzYWdlRXZlbnRTY2hlZHVsZWQgPSBmYWxzZTtcbiAgdmFyIHRpbWVvdXRUaW1lID0gLTE7XG5cbiAgdmFyIGlzQW5pbWF0aW9uRnJhbWVTY2hlZHVsZWQgPSBmYWxzZTtcblxuICB2YXIgaXNGbHVzaGluZ0hvc3RDYWxsYmFjayA9IGZhbHNlO1xuXG4gIHZhciBmcmFtZURlYWRsaW5lID0gMDtcbiAgLy8gV2Ugc3RhcnQgb3V0IGFzc3VtaW5nIHRoYXQgd2UgcnVuIGF0IDMwZnBzIGJ1dCB0aGVuIHRoZSBoZXVyaXN0aWMgdHJhY2tpbmdcbiAgLy8gd2lsbCBhZGp1c3QgdGhpcyB2YWx1ZSB0byBhIGZhc3RlciBmcHMgaWYgd2UgZ2V0IG1vcmUgZnJlcXVlbnQgYW5pbWF0aW9uXG4gIC8vIGZyYW1lcy5cbiAgdmFyIHByZXZpb3VzRnJhbWVUaW1lID0gMzM7XG4gIHZhciBhY3RpdmVGcmFtZVRpbWUgPSAzMztcblxuICBzaG91bGRZaWVsZFRvSG9zdCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnJhbWVEZWFkbGluZSA8PSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuICB9O1xuXG4gIC8vIFdlIHVzZSB0aGUgcG9zdE1lc3NhZ2UgdHJpY2sgdG8gZGVmZXIgaWRsZSB3b3JrIHVudGlsIGFmdGVyIHRoZSByZXBhaW50LlxuICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICB2YXIgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaXNNZXNzYWdlRXZlbnRTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAgIHZhciBwcmV2U2NoZWR1bGVkQ2FsbGJhY2sgPSBzY2hlZHVsZWRIb3N0Q2FsbGJhY2s7XG4gICAgdmFyIHByZXZUaW1lb3V0VGltZSA9IHRpbWVvdXRUaW1lO1xuICAgIHNjaGVkdWxlZEhvc3RDYWxsYmFjayA9IG51bGw7XG4gICAgdGltZW91dFRpbWUgPSAtMTtcblxuICAgIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG5cbiAgICB2YXIgZGlkVGltZW91dCA9IGZhbHNlO1xuICAgIGlmIChmcmFtZURlYWRsaW5lIC0gY3VycmVudFRpbWUgPD0gMCkge1xuICAgICAgLy8gVGhlcmUncyBubyB0aW1lIGxlZnQgaW4gdGhpcyBpZGxlIHBlcmlvZC4gQ2hlY2sgaWYgdGhlIGNhbGxiYWNrIGhhc1xuICAgICAgLy8gYSB0aW1lb3V0IGFuZCB3aGV0aGVyIGl0J3MgYmVlbiBleGNlZWRlZC5cbiAgICAgIGlmIChwcmV2VGltZW91dFRpbWUgIT09IC0xICYmIHByZXZUaW1lb3V0VGltZSA8PSBjdXJyZW50VGltZSkge1xuICAgICAgICAvLyBFeGNlZWRlZCB0aGUgdGltZW91dC4gSW52b2tlIHRoZSBjYWxsYmFjayBldmVuIHRob3VnaCB0aGVyZSdzIG5vXG4gICAgICAgIC8vIHRpbWUgbGVmdC5cbiAgICAgICAgZGlkVGltZW91dCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBObyB0aW1lb3V0LlxuICAgICAgICBpZiAoIWlzQW5pbWF0aW9uRnJhbWVTY2hlZHVsZWQpIHtcbiAgICAgICAgICAvLyBTY2hlZHVsZSBhbm90aGVyIGFuaW1hdGlvbiBjYWxsYmFjayBzbyB3ZSByZXRyeSBsYXRlci5cbiAgICAgICAgICBpc0FuaW1hdGlvbkZyYW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWVXaXRoVGltZW91dChhbmltYXRpb25UaWNrKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBFeGl0IHdpdGhvdXQgaW52b2tpbmcgdGhlIGNhbGxiYWNrLlxuICAgICAgICBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBwcmV2U2NoZWR1bGVkQ2FsbGJhY2s7XG4gICAgICAgIHRpbWVvdXRUaW1lID0gcHJldlRpbWVvdXRUaW1lO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHByZXZTY2hlZHVsZWRDYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgaXNGbHVzaGluZ0hvc3RDYWxsYmFjayA9IHRydWU7XG4gICAgICB0cnkge1xuICAgICAgICBwcmV2U2NoZWR1bGVkQ2FsbGJhY2soZGlkVGltZW91dCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpc0ZsdXNoaW5nSG9zdENhbGxiYWNrID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHZhciBhbmltYXRpb25UaWNrID0gZnVuY3Rpb24gKHJhZlRpbWUpIHtcbiAgICBpZiAoc2NoZWR1bGVkSG9zdENhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICAvLyBFYWdlcmx5IHNjaGVkdWxlIHRoZSBuZXh0IGFuaW1hdGlvbiBjYWxsYmFjayBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuICAgICAgLy8gZnJhbWUuIElmIHRoZSBzY2hlZHVsZXIgcXVldWUgaXMgbm90IGVtcHR5IGF0IHRoZSBlbmQgb2YgdGhlIGZyYW1lLCBpdFxuICAgICAgLy8gd2lsbCBjb250aW51ZSBmbHVzaGluZyBpbnNpZGUgdGhhdCBjYWxsYmFjay4gSWYgdGhlIHF1ZXVlICppcyogZW1wdHksXG4gICAgICAvLyB0aGVuIGl0IHdpbGwgZXhpdCBpbW1lZGlhdGVseS4gUG9zdGluZyB0aGUgY2FsbGJhY2sgYXQgdGhlIHN0YXJ0IG9mIHRoZVxuICAgICAgLy8gZnJhbWUgZW5zdXJlcyBpdCdzIGZpcmVkIHdpdGhpbiB0aGUgZWFybGllc3QgcG9zc2libGUgZnJhbWUuIElmIHdlXG4gICAgICAvLyB3YWl0ZWQgdW50aWwgdGhlIGVuZCBvZiB0aGUgZnJhbWUgdG8gcG9zdCB0aGUgY2FsbGJhY2ssIHdlIHJpc2sgdGhlXG4gICAgICAvLyBicm93c2VyIHNraXBwaW5nIGEgZnJhbWUgYW5kIG5vdCBmaXJpbmcgdGhlIGNhbGxiYWNrIHVudGlsIHRoZSBmcmFtZVxuICAgICAgLy8gYWZ0ZXIgdGhhdC5cbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZVdpdGhUaW1lb3V0KGFuaW1hdGlvblRpY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBwZW5kaW5nIHdvcmsuIEV4aXQuXG4gICAgICBpc0FuaW1hdGlvbkZyYW1lU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5leHRGcmFtZVRpbWUgPSByYWZUaW1lIC0gZnJhbWVEZWFkbGluZSArIGFjdGl2ZUZyYW1lVGltZTtcbiAgICBpZiAobmV4dEZyYW1lVGltZSA8IGFjdGl2ZUZyYW1lVGltZSAmJiBwcmV2aW91c0ZyYW1lVGltZSA8IGFjdGl2ZUZyYW1lVGltZSkge1xuICAgICAgaWYgKG5leHRGcmFtZVRpbWUgPCA4KSB7XG4gICAgICAgIC8vIERlZmVuc2l2ZSBjb2RpbmcuIFdlIGRvbid0IHN1cHBvcnQgaGlnaGVyIGZyYW1lIHJhdGVzIHRoYW4gMTIwaHouXG4gICAgICAgIC8vIElmIHRoZSBjYWxjdWxhdGVkIGZyYW1lIHRpbWUgZ2V0cyBsb3dlciB0aGFuIDgsIGl0IGlzIHByb2JhYmx5IGEgYnVnLlxuICAgICAgICBuZXh0RnJhbWVUaW1lID0gODtcbiAgICAgIH1cbiAgICAgIC8vIElmIG9uZSBmcmFtZSBnb2VzIGxvbmcsIHRoZW4gdGhlIG5leHQgb25lIGNhbiBiZSBzaG9ydCB0byBjYXRjaCB1cC5cbiAgICAgIC8vIElmIHR3byBmcmFtZXMgYXJlIHNob3J0IGluIGEgcm93LCB0aGVuIHRoYXQncyBhbiBpbmRpY2F0aW9uIHRoYXQgd2VcbiAgICAgIC8vIGFjdHVhbGx5IGhhdmUgYSBoaWdoZXIgZnJhbWUgcmF0ZSB0aGFuIHdoYXQgd2UncmUgY3VycmVudGx5IG9wdGltaXppbmcuXG4gICAgICAvLyBXZSBhZGp1c3Qgb3VyIGhldXJpc3RpYyBkeW5hbWljYWxseSBhY2NvcmRpbmdseS4gRm9yIGV4YW1wbGUsIGlmIHdlJ3JlXG4gICAgICAvLyBydW5uaW5nIG9uIDEyMGh6IGRpc3BsYXkgb3IgOTBoeiBWUiBkaXNwbGF5LlxuICAgICAgLy8gVGFrZSB0aGUgbWF4IG9mIHRoZSB0d28gaW4gY2FzZSBvbmUgb2YgdGhlbSB3YXMgYW4gYW5vbWFseSBkdWUgdG9cbiAgICAgIC8vIG1pc3NlZCBmcmFtZSBkZWFkbGluZXMuXG4gICAgICBhY3RpdmVGcmFtZVRpbWUgPSBuZXh0RnJhbWVUaW1lIDwgcHJldmlvdXNGcmFtZVRpbWUgPyBwcmV2aW91c0ZyYW1lVGltZSA6IG5leHRGcmFtZVRpbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZXZpb3VzRnJhbWVUaW1lID0gbmV4dEZyYW1lVGltZTtcbiAgICB9XG4gICAgZnJhbWVEZWFkbGluZSA9IHJhZlRpbWUgKyBhY3RpdmVGcmFtZVRpbWU7XG4gICAgaWYgKCFpc01lc3NhZ2VFdmVudFNjaGVkdWxlZCkge1xuICAgICAgaXNNZXNzYWdlRXZlbnRTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgcG9ydC5wb3N0TWVzc2FnZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgfTtcblxuICByZXF1ZXN0SG9zdENhbGxiYWNrID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBhYnNvbHV0ZVRpbWVvdXQpIHtcbiAgICBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB0aW1lb3V0VGltZSA9IGFic29sdXRlVGltZW91dDtcbiAgICBpZiAoaXNGbHVzaGluZ0hvc3RDYWxsYmFjayB8fCBhYnNvbHV0ZVRpbWVvdXQgPCAwKSB7XG4gICAgICAvLyBEb24ndCB3YWl0IGZvciB0aGUgbmV4dCBmcmFtZS4gQ29udGludWUgd29ya2luZyBBU0FQLCBpbiBhIG5ldyBldmVudC5cbiAgICAgIHBvcnQucG9zdE1lc3NhZ2UodW5kZWZpbmVkKTtcbiAgICB9IGVsc2UgaWYgKCFpc0FuaW1hdGlvbkZyYW1lU2NoZWR1bGVkKSB7XG4gICAgICAvLyBJZiByQUYgZGlkbid0IGFscmVhZHkgc2NoZWR1bGUgb25lLCB3ZSBuZWVkIHRvIHNjaGVkdWxlIGEgZnJhbWUuXG4gICAgICAvLyBUT0RPOiBJZiB0aGlzIHJBRiBkb2Vzbid0IG1hdGVyaWFsaXplIGJlY2F1c2UgdGhlIGJyb3dzZXIgdGhyb3R0bGVzLCB3ZVxuICAgICAgLy8gbWlnaHQgd2FudCB0byBzdGlsbCBoYXZlIHNldFRpbWVvdXQgdHJpZ2dlciBySUMgYXMgYSBiYWNrdXAgdG8gZW5zdXJlXG4gICAgICAvLyB0aGF0IHdlIGtlZXAgcGVyZm9ybWluZyB3b3JrLlxuICAgICAgaXNBbmltYXRpb25GcmFtZVNjaGVkdWxlZCA9IHRydWU7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWVXaXRoVGltZW91dChhbmltYXRpb25UaWNrKTtcbiAgICB9XG4gIH07XG5cbiAgY2FuY2VsSG9zdENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgIHNjaGVkdWxlZEhvc3RDYWxsYmFjayA9IG51bGw7XG4gICAgaXNNZXNzYWdlRXZlbnRTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICB0aW1lb3V0VGltZSA9IC0xO1xuICB9O1xufVxuXG5leHBvcnRzLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5ID0gSW1tZWRpYXRlUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5ID0gVXNlckJsb2NraW5nUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5ID0gTm9ybWFsUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX0lkbGVQcmlvcml0eSA9IElkbGVQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfTG93UHJpb3JpdHkgPSBMb3dQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5ID0gdW5zdGFibGVfcnVuV2l0aFByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9uZXh0ID0gdW5zdGFibGVfbmV4dDtcbmV4cG9ydHMudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayA9IHVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2s7XG5leHBvcnRzLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrID0gdW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s7XG5leHBvcnRzLnVuc3RhYmxlX3dyYXBDYWxsYmFjayA9IHVuc3RhYmxlX3dyYXBDYWxsYmFjaztcbmV4cG9ydHMudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSB1bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbDtcbmV4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQgPSB1bnN0YWJsZV9zaG91bGRZaWVsZDtcbmV4cG9ydHMudW5zdGFibGVfY29udGludWVFeGVjdXRpb24gPSB1bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbjtcbmV4cG9ydHMudW5zdGFibGVfcGF1c2VFeGVjdXRpb24gPSB1bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbjtcbmV4cG9ydHMudW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGUgPSB1bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZTtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXIucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLXRyYWNpbmcucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLXRyYWNpbmcuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsIi8qXG5cdE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG5cdEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcbiovXG5cbnZhciBzdHlsZXNJbkRvbSA9IHt9O1xuXG52YXJcdG1lbW9pemUgPSBmdW5jdGlvbiAoZm4pIHtcblx0dmFyIG1lbW87XG5cblx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRpZiAodHlwZW9mIG1lbW8gPT09IFwidW5kZWZpbmVkXCIpIG1lbW8gPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHRcdHJldHVybiBtZW1vO1xuXHR9O1xufTtcblxudmFyIGlzT2xkSUUgPSBtZW1vaXplKGZ1bmN0aW9uICgpIHtcblx0Ly8gVGVzdCBmb3IgSUUgPD0gOSBhcyBwcm9wb3NlZCBieSBCcm93c2VyaGFja3Ncblx0Ly8gQHNlZSBodHRwOi8vYnJvd3NlcmhhY2tzLmNvbS8jaGFjay1lNzFkODY5MmY2NTMzNDE3M2ZlZTcxNWMyMjJjYjgwNVxuXHQvLyBUZXN0cyBmb3IgZXhpc3RlbmNlIG9mIHN0YW5kYXJkIGdsb2JhbHMgaXMgdG8gYWxsb3cgc3R5bGUtbG9hZGVyXG5cdC8vIHRvIG9wZXJhdGUgY29ycmVjdGx5IGludG8gbm9uLXN0YW5kYXJkIGVudmlyb25tZW50c1xuXHQvLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJwYWNrLWNvbnRyaWIvc3R5bGUtbG9hZGVyL2lzc3Vlcy8xNzdcblx0cmV0dXJuIHdpbmRvdyAmJiBkb2N1bWVudCAmJiBkb2N1bWVudC5hbGwgJiYgIXdpbmRvdy5hdG9iO1xufSk7XG5cbnZhciBnZXRUYXJnZXQgPSBmdW5jdGlvbiAodGFyZ2V0LCBwYXJlbnQpIHtcbiAgaWYgKHBhcmVudCl7XG4gICAgcmV0dXJuIHBhcmVudC5xdWVyeVNlbGVjdG9yKHRhcmdldCk7XG4gIH1cbiAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcbn07XG5cbnZhciBnZXRFbGVtZW50ID0gKGZ1bmN0aW9uIChmbikge1xuXHR2YXIgbWVtbyA9IHt9O1xuXG5cdHJldHVybiBmdW5jdGlvbih0YXJnZXQsIHBhcmVudCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHBhc3NpbmcgZnVuY3Rpb24gaW4gb3B0aW9ucywgdGhlbiB1c2UgaXQgZm9yIHJlc29sdmUgXCJoZWFkXCIgZWxlbWVudC5cbiAgICAgICAgICAgICAgICAvLyBVc2VmdWwgZm9yIFNoYWRvdyBSb290IHN0eWxlIGkuZVxuICAgICAgICAgICAgICAgIC8vIHtcbiAgICAgICAgICAgICAgICAvLyAgIGluc2VydEludG86IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjZm9vXCIpLnNoYWRvd1Jvb3QgfVxuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0dmFyIHN0eWxlVGFyZ2V0ID0gZ2V0VGFyZ2V0LmNhbGwodGhpcywgdGFyZ2V0LCBwYXJlbnQpO1xuXHRcdFx0Ly8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcblx0XHRcdGlmICh3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQgJiYgc3R5bGVUYXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHQvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuXHRcdFx0XHRcdC8vIGR1ZSB0byBjcm9zcy1vcmlnaW4gcmVzdHJpY3Rpb25zXG5cdFx0XHRcdFx0c3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcblx0XHRcdFx0fSBjYXRjaChlKSB7XG5cdFx0XHRcdFx0c3R5bGVUYXJnZXQgPSBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcblx0XHR9XG5cdFx0cmV0dXJuIG1lbW9bdGFyZ2V0XVxuXHR9O1xufSkoKTtcblxudmFyIHNpbmdsZXRvbiA9IG51bGw7XG52YXJcdHNpbmdsZXRvbkNvdW50ZXIgPSAwO1xudmFyXHRzdHlsZXNJbnNlcnRlZEF0VG9wID0gW107XG5cbnZhclx0Zml4VXJscyA9IHJlcXVpcmUoXCIuL3VybHNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obGlzdCwgb3B0aW9ucykge1xuXHRpZiAodHlwZW9mIERFQlVHICE9PSBcInVuZGVmaW5lZFwiICYmIERFQlVHKSB7XG5cdFx0aWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHN0eWxlLWxvYWRlciBjYW5ub3QgYmUgdXNlZCBpbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50XCIpO1xuXHR9XG5cblx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0b3B0aW9ucy5hdHRycyA9IHR5cGVvZiBvcHRpb25zLmF0dHJzID09PSBcIm9iamVjdFwiID8gb3B0aW9ucy5hdHRycyA6IHt9O1xuXG5cdC8vIEZvcmNlIHNpbmdsZS10YWcgc29sdXRpb24gb24gSUU2LTksIHdoaWNoIGhhcyBhIGhhcmQgbGltaXQgb24gdGhlICMgb2YgPHN0eWxlPlxuXHQvLyB0YWdzIGl0IHdpbGwgYWxsb3cgb24gYSBwYWdlXG5cdGlmICghb3B0aW9ucy5zaW5nbGV0b24gJiYgdHlwZW9mIG9wdGlvbnMuc2luZ2xldG9uICE9PSBcImJvb2xlYW5cIikgb3B0aW9ucy5zaW5nbGV0b24gPSBpc09sZElFKCk7XG5cblx0Ly8gQnkgZGVmYXVsdCwgYWRkIDxzdHlsZT4gdGFncyB0byB0aGUgPGhlYWQ+IGVsZW1lbnRcbiAgICAgICAgaWYgKCFvcHRpb25zLmluc2VydEludG8pIG9wdGlvbnMuaW5zZXJ0SW50byA9IFwiaGVhZFwiO1xuXG5cdC8vIEJ5IGRlZmF1bHQsIGFkZCA8c3R5bGU+IHRhZ3MgdG8gdGhlIGJvdHRvbSBvZiB0aGUgdGFyZ2V0XG5cdGlmICghb3B0aW9ucy5pbnNlcnRBdCkgb3B0aW9ucy5pbnNlcnRBdCA9IFwiYm90dG9tXCI7XG5cblx0dmFyIHN0eWxlcyA9IGxpc3RUb1N0eWxlcyhsaXN0LCBvcHRpb25zKTtcblxuXHRhZGRTdHlsZXNUb0RvbShzdHlsZXMsIG9wdGlvbnMpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUgKG5ld0xpc3QpIHtcblx0XHR2YXIgbWF5UmVtb3ZlID0gW107XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGl0ZW0gPSBzdHlsZXNbaV07XG5cdFx0XHR2YXIgZG9tU3R5bGUgPSBzdHlsZXNJbkRvbVtpdGVtLmlkXTtcblxuXHRcdFx0ZG9tU3R5bGUucmVmcy0tO1xuXHRcdFx0bWF5UmVtb3ZlLnB1c2goZG9tU3R5bGUpO1xuXHRcdH1cblxuXHRcdGlmKG5ld0xpc3QpIHtcblx0XHRcdHZhciBuZXdTdHlsZXMgPSBsaXN0VG9TdHlsZXMobmV3TGlzdCwgb3B0aW9ucyk7XG5cdFx0XHRhZGRTdHlsZXNUb0RvbShuZXdTdHlsZXMsIG9wdGlvbnMpO1xuXHRcdH1cblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbWF5UmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgZG9tU3R5bGUgPSBtYXlSZW1vdmVbaV07XG5cblx0XHRcdGlmKGRvbVN0eWxlLnJlZnMgPT09IDApIHtcblx0XHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBkb21TdHlsZS5wYXJ0cy5sZW5ndGg7IGorKykgZG9tU3R5bGUucGFydHNbal0oKTtcblxuXHRcdFx0XHRkZWxldGUgc3R5bGVzSW5Eb21bZG9tU3R5bGUuaWRdO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn07XG5cbmZ1bmN0aW9uIGFkZFN0eWxlc1RvRG9tIChzdHlsZXMsIG9wdGlvbnMpIHtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgaXRlbSA9IHN0eWxlc1tpXTtcblx0XHR2YXIgZG9tU3R5bGUgPSBzdHlsZXNJbkRvbVtpdGVtLmlkXTtcblxuXHRcdGlmKGRvbVN0eWxlKSB7XG5cdFx0XHRkb21TdHlsZS5yZWZzKys7XG5cblx0XHRcdGZvcih2YXIgaiA9IDA7IGogPCBkb21TdHlsZS5wYXJ0cy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRkb21TdHlsZS5wYXJ0c1tqXShpdGVtLnBhcnRzW2pdKTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yKDsgaiA8IGl0ZW0ucGFydHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0ZG9tU3R5bGUucGFydHMucHVzaChhZGRTdHlsZShpdGVtLnBhcnRzW2pdLCBvcHRpb25zKSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciBwYXJ0cyA9IFtdO1xuXG5cdFx0XHRmb3IodmFyIGogPSAwOyBqIDwgaXRlbS5wYXJ0cy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRwYXJ0cy5wdXNoKGFkZFN0eWxlKGl0ZW0ucGFydHNbal0sIG9wdGlvbnMpKTtcblx0XHRcdH1cblxuXHRcdFx0c3R5bGVzSW5Eb21baXRlbS5pZF0gPSB7aWQ6IGl0ZW0uaWQsIHJlZnM6IDEsIHBhcnRzOiBwYXJ0c307XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGxpc3RUb1N0eWxlcyAobGlzdCwgb3B0aW9ucykge1xuXHR2YXIgc3R5bGVzID0gW107XG5cdHZhciBuZXdTdHlsZXMgPSB7fTtcblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgaXRlbSA9IGxpc3RbaV07XG5cdFx0dmFyIGlkID0gb3B0aW9ucy5iYXNlID8gaXRlbVswXSArIG9wdGlvbnMuYmFzZSA6IGl0ZW1bMF07XG5cdFx0dmFyIGNzcyA9IGl0ZW1bMV07XG5cdFx0dmFyIG1lZGlhID0gaXRlbVsyXTtcblx0XHR2YXIgc291cmNlTWFwID0gaXRlbVszXTtcblx0XHR2YXIgcGFydCA9IHtjc3M6IGNzcywgbWVkaWE6IG1lZGlhLCBzb3VyY2VNYXA6IHNvdXJjZU1hcH07XG5cblx0XHRpZighbmV3U3R5bGVzW2lkXSkgc3R5bGVzLnB1c2gobmV3U3R5bGVzW2lkXSA9IHtpZDogaWQsIHBhcnRzOiBbcGFydF19KTtcblx0XHRlbHNlIG5ld1N0eWxlc1tpZF0ucGFydHMucHVzaChwYXJ0KTtcblx0fVxuXG5cdHJldHVybiBzdHlsZXM7XG59XG5cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudCAob3B0aW9ucywgc3R5bGUpIHtcblx0dmFyIHRhcmdldCA9IGdldEVsZW1lbnQob3B0aW9ucy5pbnNlcnRJbnRvKVxuXG5cdGlmICghdGFyZ2V0KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnRJbnRvJyBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cIik7XG5cdH1cblxuXHR2YXIgbGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3AgPSBzdHlsZXNJbnNlcnRlZEF0VG9wW3N0eWxlc0luc2VydGVkQXRUb3AubGVuZ3RoIC0gMV07XG5cblx0aWYgKG9wdGlvbnMuaW5zZXJ0QXQgPT09IFwidG9wXCIpIHtcblx0XHRpZiAoIWxhc3RTdHlsZUVsZW1lbnRJbnNlcnRlZEF0VG9wKSB7XG5cdFx0XHR0YXJnZXQuaW5zZXJ0QmVmb3JlKHN0eWxlLCB0YXJnZXQuZmlyc3RDaGlsZCk7XG5cdFx0fSBlbHNlIGlmIChsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcC5uZXh0U2libGluZykge1xuXHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZShzdHlsZSwgbGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3AubmV4dFNpYmxpbmcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuXHRcdH1cblx0XHRzdHlsZXNJbnNlcnRlZEF0VG9wLnB1c2goc3R5bGUpO1xuXHR9IGVsc2UgaWYgKG9wdGlvbnMuaW5zZXJ0QXQgPT09IFwiYm90dG9tXCIpIHtcblx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLmluc2VydEF0ID09PSBcIm9iamVjdFwiICYmIG9wdGlvbnMuaW5zZXJ0QXQuYmVmb3JlKSB7XG5cdFx0dmFyIG5leHRTaWJsaW5nID0gZ2V0RWxlbWVudChvcHRpb25zLmluc2VydEF0LmJlZm9yZSwgdGFyZ2V0KTtcblx0XHR0YXJnZXQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBuZXh0U2libGluZyk7XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiW1N0eWxlIExvYWRlcl1cXG5cXG4gSW52YWxpZCB2YWx1ZSBmb3IgcGFyYW1ldGVyICdpbnNlcnRBdCcgKCdvcHRpb25zLmluc2VydEF0JykgZm91bmQuXFxuIE11c3QgYmUgJ3RvcCcsICdib3R0b20nLCBvciBPYmplY3QuXFxuIChodHRwczovL2dpdGh1Yi5jb20vd2VicGFjay1jb250cmliL3N0eWxlLWxvYWRlciNpbnNlcnRhdClcXG5cIik7XG5cdH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50IChzdHlsZSkge1xuXHRpZiAoc3R5bGUucGFyZW50Tm9kZSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXHRzdHlsZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlKTtcblxuXHR2YXIgaWR4ID0gc3R5bGVzSW5zZXJ0ZWRBdFRvcC5pbmRleE9mKHN0eWxlKTtcblx0aWYoaWR4ID49IDApIHtcblx0XHRzdHlsZXNJbnNlcnRlZEF0VG9wLnNwbGljZShpZHgsIDEpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0eWxlRWxlbWVudCAob3B0aW9ucykge1xuXHR2YXIgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG5cblx0aWYob3B0aW9ucy5hdHRycy50eXBlID09PSB1bmRlZmluZWQpIHtcblx0XHRvcHRpb25zLmF0dHJzLnR5cGUgPSBcInRleHQvY3NzXCI7XG5cdH1cblxuXHRpZihvcHRpb25zLmF0dHJzLm5vbmNlID09PSB1bmRlZmluZWQpIHtcblx0XHR2YXIgbm9uY2UgPSBnZXROb25jZSgpO1xuXHRcdGlmIChub25jZSkge1xuXHRcdFx0b3B0aW9ucy5hdHRycy5ub25jZSA9IG5vbmNlO1xuXHRcdH1cblx0fVxuXG5cdGFkZEF0dHJzKHN0eWxlLCBvcHRpb25zLmF0dHJzKTtcblx0aW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMsIHN0eWxlKTtcblxuXHRyZXR1cm4gc3R5bGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxpbmtFbGVtZW50IChvcHRpb25zKSB7XG5cdHZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XG5cblx0aWYob3B0aW9ucy5hdHRycy50eXBlID09PSB1bmRlZmluZWQpIHtcblx0XHRvcHRpb25zLmF0dHJzLnR5cGUgPSBcInRleHQvY3NzXCI7XG5cdH1cblx0b3B0aW9ucy5hdHRycy5yZWwgPSBcInN0eWxlc2hlZXRcIjtcblxuXHRhZGRBdHRycyhsaW5rLCBvcHRpb25zLmF0dHJzKTtcblx0aW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMsIGxpbmspO1xuXG5cdHJldHVybiBsaW5rO1xufVxuXG5mdW5jdGlvbiBhZGRBdHRycyAoZWwsIGF0dHJzKSB7XG5cdE9iamVjdC5rZXlzKGF0dHJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcblx0XHRlbC5zZXRBdHRyaWJ1dGUoa2V5LCBhdHRyc1trZXldKTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIGdldE5vbmNlKCkge1xuXHRpZiAodHlwZW9mIF9fd2VicGFja19ub25jZV9fID09PSAndW5kZWZpbmVkJykge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0cmV0dXJuIF9fd2VicGFja19ub25jZV9fO1xufVxuXG5mdW5jdGlvbiBhZGRTdHlsZSAob2JqLCBvcHRpb25zKSB7XG5cdHZhciBzdHlsZSwgdXBkYXRlLCByZW1vdmUsIHJlc3VsdDtcblxuXHQvLyBJZiBhIHRyYW5zZm9ybSBmdW5jdGlvbiB3YXMgZGVmaW5lZCwgcnVuIGl0IG9uIHRoZSBjc3Ncblx0aWYgKG9wdGlvbnMudHJhbnNmb3JtICYmIG9iai5jc3MpIHtcblx0ICAgIHJlc3VsdCA9IHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJ1xuXHRcdCA/IG9wdGlvbnMudHJhbnNmb3JtKG9iai5jc3MpIFxuXHRcdCA6IG9wdGlvbnMudHJhbnNmb3JtLmRlZmF1bHQob2JqLmNzcyk7XG5cblx0ICAgIGlmIChyZXN1bHQpIHtcblx0ICAgIFx0Ly8gSWYgdHJhbnNmb3JtIHJldHVybnMgYSB2YWx1ZSwgdXNlIHRoYXQgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwgY3NzLlxuXHQgICAgXHQvLyBUaGlzIGFsbG93cyBydW5uaW5nIHJ1bnRpbWUgdHJhbnNmb3JtYXRpb25zIG9uIHRoZSBjc3MuXG5cdCAgICBcdG9iai5jc3MgPSByZXN1bHQ7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgXHQvLyBJZiB0aGUgdHJhbnNmb3JtIGZ1bmN0aW9uIHJldHVybnMgYSBmYWxzeSB2YWx1ZSwgZG9uJ3QgYWRkIHRoaXMgY3NzLlxuXHQgICAgXHQvLyBUaGlzIGFsbG93cyBjb25kaXRpb25hbCBsb2FkaW5nIG9mIGNzc1xuXHQgICAgXHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdCAgICBcdFx0Ly8gbm9vcFxuXHQgICAgXHR9O1xuXHQgICAgfVxuXHR9XG5cblx0aWYgKG9wdGlvbnMuc2luZ2xldG9uKSB7XG5cdFx0dmFyIHN0eWxlSW5kZXggPSBzaW5nbGV0b25Db3VudGVyKys7XG5cblx0XHRzdHlsZSA9IHNpbmdsZXRvbiB8fCAoc2luZ2xldG9uID0gY3JlYXRlU3R5bGVFbGVtZW50KG9wdGlvbnMpKTtcblxuXHRcdHVwZGF0ZSA9IGFwcGx5VG9TaW5nbGV0b25UYWcuYmluZChudWxsLCBzdHlsZSwgc3R5bGVJbmRleCwgZmFsc2UpO1xuXHRcdHJlbW92ZSA9IGFwcGx5VG9TaW5nbGV0b25UYWcuYmluZChudWxsLCBzdHlsZSwgc3R5bGVJbmRleCwgdHJ1ZSk7XG5cblx0fSBlbHNlIGlmIChcblx0XHRvYmouc291cmNlTWFwICYmXG5cdFx0dHlwZW9mIFVSTCA9PT0gXCJmdW5jdGlvblwiICYmXG5cdFx0dHlwZW9mIFVSTC5jcmVhdGVPYmplY3RVUkwgPT09IFwiZnVuY3Rpb25cIiAmJlxuXHRcdHR5cGVvZiBVUkwucmV2b2tlT2JqZWN0VVJMID09PSBcImZ1bmN0aW9uXCIgJiZcblx0XHR0eXBlb2YgQmxvYiA9PT0gXCJmdW5jdGlvblwiICYmXG5cdFx0dHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0XHRzdHlsZSA9IGNyZWF0ZUxpbmtFbGVtZW50KG9wdGlvbnMpO1xuXHRcdHVwZGF0ZSA9IHVwZGF0ZUxpbmsuYmluZChudWxsLCBzdHlsZSwgb3B0aW9ucyk7XG5cdFx0cmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlKTtcblxuXHRcdFx0aWYoc3R5bGUuaHJlZikgVVJMLnJldm9rZU9iamVjdFVSTChzdHlsZS5ocmVmKTtcblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdHN0eWxlID0gY3JlYXRlU3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuXHRcdHVwZGF0ZSA9IGFwcGx5VG9UYWcuYmluZChudWxsLCBzdHlsZSk7XG5cdFx0cmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlKTtcblx0XHR9O1xuXHR9XG5cblx0dXBkYXRlKG9iaik7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZVN0eWxlIChuZXdPYmopIHtcblx0XHRpZiAobmV3T2JqKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdG5ld09iai5jc3MgPT09IG9iai5jc3MgJiZcblx0XHRcdFx0bmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiZcblx0XHRcdFx0bmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcFxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dXBkYXRlKG9iaiA9IG5ld09iaik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlbW92ZSgpO1xuXHRcdH1cblx0fTtcbn1cblxudmFyIHJlcGxhY2VUZXh0ID0gKGZ1bmN0aW9uICgpIHtcblx0dmFyIHRleHRTdG9yZSA9IFtdO1xuXG5cdHJldHVybiBmdW5jdGlvbiAoaW5kZXgsIHJlcGxhY2VtZW50KSB7XG5cdFx0dGV4dFN0b3JlW2luZGV4XSA9IHJlcGxhY2VtZW50O1xuXG5cdFx0cmV0dXJuIHRleHRTdG9yZS5maWx0ZXIoQm9vbGVhbikuam9pbignXFxuJyk7XG5cdH07XG59KSgpO1xuXG5mdW5jdGlvbiBhcHBseVRvU2luZ2xldG9uVGFnIChzdHlsZSwgaW5kZXgsIHJlbW92ZSwgb2JqKSB7XG5cdHZhciBjc3MgPSByZW1vdmUgPyBcIlwiIDogb2JqLmNzcztcblxuXHRpZiAoc3R5bGUuc3R5bGVTaGVldCkge1xuXHRcdHN0eWxlLnN0eWxlU2hlZXQuY3NzVGV4dCA9IHJlcGxhY2VUZXh0KGluZGV4LCBjc3MpO1xuXHR9IGVsc2Uge1xuXHRcdHZhciBjc3NOb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKTtcblx0XHR2YXIgY2hpbGROb2RlcyA9IHN0eWxlLmNoaWxkTm9kZXM7XG5cblx0XHRpZiAoY2hpbGROb2Rlc1tpbmRleF0pIHN0eWxlLnJlbW92ZUNoaWxkKGNoaWxkTm9kZXNbaW5kZXhdKTtcblxuXHRcdGlmIChjaGlsZE5vZGVzLmxlbmd0aCkge1xuXHRcdFx0c3R5bGUuaW5zZXJ0QmVmb3JlKGNzc05vZGUsIGNoaWxkTm9kZXNbaW5kZXhdKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3R5bGUuYXBwZW5kQ2hpbGQoY3NzTm9kZSk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGFwcGx5VG9UYWcgKHN0eWxlLCBvYmopIHtcblx0dmFyIGNzcyA9IG9iai5jc3M7XG5cdHZhciBtZWRpYSA9IG9iai5tZWRpYTtcblxuXHRpZihtZWRpYSkge1xuXHRcdHN0eWxlLnNldEF0dHJpYnV0ZShcIm1lZGlhXCIsIG1lZGlhKVxuXHR9XG5cblx0aWYoc3R5bGUuc3R5bGVTaGVldCkge1xuXHRcdHN0eWxlLnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcblx0fSBlbHNlIHtcblx0XHR3aGlsZShzdHlsZS5maXJzdENoaWxkKSB7XG5cdFx0XHRzdHlsZS5yZW1vdmVDaGlsZChzdHlsZS5maXJzdENoaWxkKTtcblx0XHR9XG5cblx0XHRzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcblx0fVxufVxuXG5mdW5jdGlvbiB1cGRhdGVMaW5rIChsaW5rLCBvcHRpb25zLCBvYmopIHtcblx0dmFyIGNzcyA9IG9iai5jc3M7XG5cdHZhciBzb3VyY2VNYXAgPSBvYmouc291cmNlTWFwO1xuXG5cdC8qXG5cdFx0SWYgY29udmVydFRvQWJzb2x1dGVVcmxzIGlzbid0IGRlZmluZWQsIGJ1dCBzb3VyY2VtYXBzIGFyZSBlbmFibGVkXG5cdFx0YW5kIHRoZXJlIGlzIG5vIHB1YmxpY1BhdGggZGVmaW5lZCB0aGVuIGxldHMgdHVybiBjb252ZXJ0VG9BYnNvbHV0ZVVybHNcblx0XHRvbiBieSBkZWZhdWx0LiAgT3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIGNvbnZlcnRUb0Fic29sdXRlVXJscyBvcHRpb25cblx0XHRkaXJlY3RseVxuXHQqL1xuXHR2YXIgYXV0b0ZpeFVybHMgPSBvcHRpb25zLmNvbnZlcnRUb0Fic29sdXRlVXJscyA9PT0gdW5kZWZpbmVkICYmIHNvdXJjZU1hcDtcblxuXHRpZiAob3B0aW9ucy5jb252ZXJ0VG9BYnNvbHV0ZVVybHMgfHwgYXV0b0ZpeFVybHMpIHtcblx0XHRjc3MgPSBmaXhVcmxzKGNzcyk7XG5cdH1cblxuXHRpZiAoc291cmNlTWFwKSB7XG5cdFx0Ly8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjY2MDM4NzVcblx0XHRjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiICsgYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSArIFwiICovXCI7XG5cdH1cblxuXHR2YXIgYmxvYiA9IG5ldyBCbG9iKFtjc3NdLCB7IHR5cGU6IFwidGV4dC9jc3NcIiB9KTtcblxuXHR2YXIgb2xkU3JjID0gbGluay5ocmVmO1xuXG5cdGxpbmsuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG5cblx0aWYob2xkU3JjKSBVUkwucmV2b2tlT2JqZWN0VVJMKG9sZFNyYyk7XG59XG4iLCJcbi8qKlxuICogV2hlbiBzb3VyY2UgbWFwcyBhcmUgZW5hYmxlZCwgYHN0eWxlLWxvYWRlcmAgdXNlcyBhIGxpbmsgZWxlbWVudCB3aXRoIGEgZGF0YS11cmkgdG9cbiAqIGVtYmVkIHRoZSBjc3Mgb24gdGhlIHBhZ2UuIFRoaXMgYnJlYWtzIGFsbCByZWxhdGl2ZSB1cmxzIGJlY2F1c2Ugbm93IHRoZXkgYXJlIHJlbGF0aXZlIHRvIGFcbiAqIGJ1bmRsZSBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHBhZ2UuXG4gKlxuICogT25lIHNvbHV0aW9uIGlzIHRvIG9ubHkgdXNlIGZ1bGwgdXJscywgYnV0IHRoYXQgbWF5IGJlIGltcG9zc2libGUuXG4gKlxuICogSW5zdGVhZCwgdGhpcyBmdW5jdGlvbiBcImZpeGVzXCIgdGhlIHJlbGF0aXZlIHVybHMgdG8gYmUgYWJzb2x1dGUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHBhZ2UgbG9jYXRpb24uXG4gKlxuICogQSBydWRpbWVudGFyeSB0ZXN0IHN1aXRlIGlzIGxvY2F0ZWQgYXQgYHRlc3QvZml4VXJscy5qc2AgYW5kIGNhbiBiZSBydW4gdmlhIHRoZSBgbnBtIHRlc3RgIGNvbW1hbmQuXG4gKlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzcykge1xuICAvLyBnZXQgY3VycmVudCBsb2NhdGlvblxuICB2YXIgbG9jYXRpb24gPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5sb2NhdGlvbjtcblxuICBpZiAoIWxvY2F0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiZml4VXJscyByZXF1aXJlcyB3aW5kb3cubG9jYXRpb25cIik7XG4gIH1cblxuXHQvLyBibGFuayBvciBudWxsP1xuXHRpZiAoIWNzcyB8fCB0eXBlb2YgY3NzICE9PSBcInN0cmluZ1wiKSB7XG5cdCAgcmV0dXJuIGNzcztcbiAgfVxuXG4gIHZhciBiYXNlVXJsID0gbG9jYXRpb24ucHJvdG9jb2wgKyBcIi8vXCIgKyBsb2NhdGlvbi5ob3N0O1xuICB2YXIgY3VycmVudERpciA9IGJhc2VVcmwgKyBsb2NhdGlvbi5wYXRobmFtZS5yZXBsYWNlKC9cXC9bXlxcL10qJC8sIFwiL1wiKTtcblxuXHQvLyBjb252ZXJ0IGVhY2ggdXJsKC4uLilcblx0Lypcblx0VGhpcyByZWd1bGFyIGV4cHJlc3Npb24gaXMganVzdCBhIHdheSB0byByZWN1cnNpdmVseSBtYXRjaCBicmFja2V0cyB3aXRoaW5cblx0YSBzdHJpbmcuXG5cblx0IC91cmxcXHMqXFwoICA9IE1hdGNoIG9uIHRoZSB3b3JkIFwidXJsXCIgd2l0aCBhbnkgd2hpdGVzcGFjZSBhZnRlciBpdCBhbmQgdGhlbiBhIHBhcmVuc1xuXHQgICAoICA9IFN0YXJ0IGEgY2FwdHVyaW5nIGdyb3VwXG5cdCAgICAgKD86ICA9IFN0YXJ0IGEgbm9uLWNhcHR1cmluZyBncm91cFxuXHQgICAgICAgICBbXikoXSAgPSBNYXRjaCBhbnl0aGluZyB0aGF0IGlzbid0IGEgcGFyZW50aGVzZXNcblx0ICAgICAgICAgfCAgPSBPUlxuXHQgICAgICAgICBcXCggID0gTWF0Y2ggYSBzdGFydCBwYXJlbnRoZXNlc1xuXHQgICAgICAgICAgICAgKD86ICA9IFN0YXJ0IGFub3RoZXIgbm9uLWNhcHR1cmluZyBncm91cHNcblx0ICAgICAgICAgICAgICAgICBbXikoXSsgID0gTWF0Y2ggYW55dGhpbmcgdGhhdCBpc24ndCBhIHBhcmVudGhlc2VzXG5cdCAgICAgICAgICAgICAgICAgfCAgPSBPUlxuXHQgICAgICAgICAgICAgICAgIFxcKCAgPSBNYXRjaCBhIHN0YXJ0IHBhcmVudGhlc2VzXG5cdCAgICAgICAgICAgICAgICAgICAgIFteKShdKiAgPSBNYXRjaCBhbnl0aGluZyB0aGF0IGlzbid0IGEgcGFyZW50aGVzZXNcblx0ICAgICAgICAgICAgICAgICBcXCkgID0gTWF0Y2ggYSBlbmQgcGFyZW50aGVzZXNcblx0ICAgICAgICAgICAgICkgID0gRW5kIEdyb3VwXG4gICAgICAgICAgICAgICpcXCkgPSBNYXRjaCBhbnl0aGluZyBhbmQgdGhlbiBhIGNsb3NlIHBhcmVuc1xuICAgICAgICAgICkgID0gQ2xvc2Ugbm9uLWNhcHR1cmluZyBncm91cFxuICAgICAgICAgICogID0gTWF0Y2ggYW55dGhpbmdcbiAgICAgICApICA9IENsb3NlIGNhcHR1cmluZyBncm91cFxuXHQgXFwpICA9IE1hdGNoIGEgY2xvc2UgcGFyZW5zXG5cblx0IC9naSAgPSBHZXQgYWxsIG1hdGNoZXMsIG5vdCB0aGUgZmlyc3QuICBCZSBjYXNlIGluc2Vuc2l0aXZlLlxuXHQgKi9cblx0dmFyIGZpeGVkQ3NzID0gY3NzLnJlcGxhY2UoL3VybFxccypcXCgoKD86W14pKF18XFwoKD86W14pKF0rfFxcKFteKShdKlxcKSkqXFwpKSopXFwpL2dpLCBmdW5jdGlvbihmdWxsTWF0Y2gsIG9yaWdVcmwpIHtcblx0XHQvLyBzdHJpcCBxdW90ZXMgKGlmIHRoZXkgZXhpc3QpXG5cdFx0dmFyIHVucXVvdGVkT3JpZ1VybCA9IG9yaWdVcmxcblx0XHRcdC50cmltKClcblx0XHRcdC5yZXBsYWNlKC9eXCIoLiopXCIkLywgZnVuY3Rpb24obywgJDEpeyByZXR1cm4gJDE7IH0pXG5cdFx0XHQucmVwbGFjZSgvXicoLiopJyQvLCBmdW5jdGlvbihvLCAkMSl7IHJldHVybiAkMTsgfSk7XG5cblx0XHQvLyBhbHJlYWR5IGEgZnVsbCB1cmw/IG5vIGNoYW5nZVxuXHRcdGlmICgvXigjfGRhdGE6fGh0dHA6XFwvXFwvfGh0dHBzOlxcL1xcL3xmaWxlOlxcL1xcL1xcL3xcXHMqJCkvaS50ZXN0KHVucXVvdGVkT3JpZ1VybCkpIHtcblx0XHQgIHJldHVybiBmdWxsTWF0Y2g7XG5cdFx0fVxuXG5cdFx0Ly8gY29udmVydCB0aGUgdXJsIHRvIGEgZnVsbCB1cmxcblx0XHR2YXIgbmV3VXJsO1xuXG5cdFx0aWYgKHVucXVvdGVkT3JpZ1VybC5pbmRleE9mKFwiLy9cIikgPT09IDApIHtcblx0XHQgIFx0Ly9UT0RPOiBzaG91bGQgd2UgYWRkIHByb3RvY29sP1xuXHRcdFx0bmV3VXJsID0gdW5xdW90ZWRPcmlnVXJsO1xuXHRcdH0gZWxzZSBpZiAodW5xdW90ZWRPcmlnVXJsLmluZGV4T2YoXCIvXCIpID09PSAwKSB7XG5cdFx0XHQvLyBwYXRoIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgYmFzZSB1cmxcblx0XHRcdG5ld1VybCA9IGJhc2VVcmwgKyB1bnF1b3RlZE9yaWdVcmw7IC8vIGFscmVhZHkgc3RhcnRzIHdpdGggJy8nXG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHBhdGggc2hvdWxkIGJlIHJlbGF0aXZlIHRvIGN1cnJlbnQgZGlyZWN0b3J5XG5cdFx0XHRuZXdVcmwgPSBjdXJyZW50RGlyICsgdW5xdW90ZWRPcmlnVXJsLnJlcGxhY2UoL15cXC5cXC8vLCBcIlwiKTsgLy8gU3RyaXAgbGVhZGluZyAnLi8nXG5cdFx0fVxuXG5cdFx0Ly8gc2VuZCBiYWNrIHRoZSBmaXhlZCB1cmwoLi4uKVxuXHRcdHJldHVybiBcInVybChcIiArIEpTT04uc3RyaW5naWZ5KG5ld1VybCkgKyBcIilcIjtcblx0fSk7XG5cblx0Ly8gc2VuZCBiYWNrIHRoZSBmaXhlZCBjc3Ncblx0cmV0dXJuIGZpeGVkQ3NzO1xufTtcbiIsIiFmdW5jdGlvbih0LGUpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPWUoKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLGUpOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuVG9uZT1lKCk6dC5Ub25lPWUoKX0oXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIGkobil7aWYoZVtuXSlyZXR1cm4gZVtuXS5leHBvcnRzO3ZhciBvPWVbbl09e2k6bixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W25dLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLGkpLG8ubD0hMCxvLmV4cG9ydHN9cmV0dXJuIGkubT10LGkuYz1lLGkuZD1mdW5jdGlvbih0LGUsbil7aS5vKHQsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLGdldDpufSl9LGkucj1mdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0saS5uPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiB0LmRlZmF1bHR9OmZ1bmN0aW9uKCl7cmV0dXJuIHR9O3JldHVybiBpLmQoZSxcImFcIixlKSxlfSxpLm89ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9LGkucD1cIlwiLGkoaS5zPTE1NSl9KFtmdW5jdGlvbih0LGUsaSl7KGZ1bmN0aW9uKG4pe3ZhciBvLHM7XG4vKipcbiAqICBUb25lLmpzXG4gKiAgQGF1dGhvciBZb3RhbSBNYW5uXG4gKiAgQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQgTGljZW5zZVxuICogIEBjb3B5cmlnaHQgMjAxNC0yMDE5IFlvdGFtIE1hbm5cbiAqL289W2koMTUzKV0sdm9pZCAwPT09KHM9ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGU9ZnVuY3Rpb24oKXtpZighKHRoaXMgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgRXJyb3IoXCJjb25zdHJ1Y3RvciBuZWVkcyB0byBiZSBjYWxsZWQgd2l0aCB0aGUgJ25ldycga2V5d29yZFwiKX07cmV0dXJuIGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIGUpe3ZhciBpPXRbMF0ubWF0Y2goL15bQS1aXSQvKSxuPWVbdF09PT10aGlzLmNvbnN0cnVjdG9yO2lmKGUuaXNGdW5jdGlvbihlW3RdKSYmaSYmbilyZXR1cm4gdH1yZXR1cm5cIlRvbmVcIn0sZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxlLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxpLG4pe2lmKGUuaXNPYmplY3QodCkpbj1pO2Vsc2UgaWYoZS5pc1N0cmluZyh0KSl7dmFyIG89e307b1t0XT1pLHQ9b310OmZvcih2YXIgcyBpbiB0KXtpPXRbc107dmFyIHI9dGhpcztpZigtMSE9PXMuaW5kZXhPZihcIi5cIikpe2Zvcih2YXIgYT1zLnNwbGl0KFwiLlwiKSxsPTA7bDxhLmxlbmd0aC0xO2wrKylpZigocj1yW2FbbF1dKWluc3RhbmNlb2YgZSl7YS5zcGxpY2UoMCxsKzEpO3ZhciBoPWEuam9pbihcIi5cIik7ci5zZXQoaCxpKTtjb250aW51ZSB0fXM9YVthLmxlbmd0aC0xXX12YXIgdT1yW3NdO2UuaXNVbmRlZih1KXx8KGUuU2lnbmFsJiZ1IGluc3RhbmNlb2YgZS5TaWduYWx8fGUuUGFyYW0mJnUgaW5zdGFuY2VvZiBlLlBhcmFtP3UudmFsdWUhPT1pJiYoZS5pc1VuZGVmKG4pP3UudmFsdWU9aTp1LnJhbXBUbyhpLG4pKTp1IGluc3RhbmNlb2YgQXVkaW9QYXJhbT91LnZhbHVlIT09aSYmKHUudmFsdWU9aSk6ZS5UaW1lQmFzZSYmdSBpbnN0YW5jZW9mIGUuVGltZUJhc2U/cltzXT1pOnUgaW5zdGFuY2VvZiBlP3Uuc2V0KGkpOnUhPT1pJiYocltzXT1pKSl9cmV0dXJuIHRoaXN9LGUucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtlLmlzVW5kZWYodCk/dD10aGlzLl9jb2xsZWN0RGVmYXVsdHModGhpcy5jb25zdHJ1Y3Rvcik6ZS5pc1N0cmluZyh0KSYmKHQ9W3RdKTtmb3IodmFyIGk9e30sbj0wO248dC5sZW5ndGg7bisrKXt2YXIgbz10W25dLHM9dGhpcyxyPWk7aWYoLTEhPT1vLmluZGV4T2YoXCIuXCIpKXtmb3IodmFyIGE9by5zcGxpdChcIi5cIiksbD0wO2w8YS5sZW5ndGgtMTtsKyspe3ZhciBoPWFbbF07cltoXT1yW2hdfHx7fSxyPXJbaF0scz1zW2hdfW89YVthLmxlbmd0aC0xXX12YXIgdT1zW29dO2UuaXNPYmplY3QodFtvXSk/cltvXT11LmdldCgpOmUuU2lnbmFsJiZ1IGluc3RhbmNlb2YgZS5TaWduYWw/cltvXT11LnZhbHVlOmUuUGFyYW0mJnUgaW5zdGFuY2VvZiBlLlBhcmFtP3Jbb109dS52YWx1ZTp1IGluc3RhbmNlb2YgQXVkaW9QYXJhbT9yW29dPXUudmFsdWU6dSBpbnN0YW5jZW9mIGU/cltvXT11LmdldCgpOiFlLmlzRnVuY3Rpb24odSkmJmUuaXNEZWZpbmVkKHUpJiYocltvXT11KX1yZXR1cm4gaX0sZS5wcm90b3R5cGUuX2NvbGxlY3REZWZhdWx0cz1mdW5jdGlvbih0KXt2YXIgaT1bXTtpZihlLmlzRGVmaW5lZCh0LmRlZmF1bHRzKSYmKGk9T2JqZWN0LmtleXModC5kZWZhdWx0cykpLGUuaXNEZWZpbmVkKHQuX3N1cGVyKSlmb3IodmFyIG49dGhpcy5fY29sbGVjdERlZmF1bHRzKHQuX3N1cGVyKSxvPTA7bzxuLmxlbmd0aDtvKyspLTE9PT1pLmluZGV4T2YobltvXSkmJmkucHVzaChuW29dKTtyZXR1cm4gaX0sZS5kZWZhdWx0cz1mdW5jdGlvbih0LGksbil7dmFyIG89e307aWYoMT09PXQubGVuZ3RoJiZlLmlzT2JqZWN0KHRbMF0pKW89dFswXTtlbHNlIGZvcih2YXIgcz0wO3M8aS5sZW5ndGg7cysrKW9baVtzXV09dFtzXTtyZXR1cm4gZS5pc0RlZmluZWQobi5kZWZhdWx0cyk/ZS5kZWZhdWx0QXJnKG8sbi5kZWZhdWx0cyk6ZS5pc09iamVjdChuKT9lLmRlZmF1bHRBcmcobyxuKTpvfSxlLmRlZmF1bHRBcmc9ZnVuY3Rpb24odCxpKXtpZihlLmlzT2JqZWN0KHQpJiZlLmlzT2JqZWN0KGkpKXt2YXIgbj17fTtmb3IodmFyIG8gaW4gdCluW29dPWUuZGVmYXVsdEFyZyhpW29dLHRbb10pO2Zvcih2YXIgcyBpbiBpKW5bc109ZS5kZWZhdWx0QXJnKHRbc10saVtzXSk7cmV0dXJuIG59cmV0dXJuIGUuaXNVbmRlZih0KT9pOnR9LGUucHJvdG90eXBlLmxvZz1mdW5jdGlvbigpe2lmKHRoaXMuZGVidWd8fHRoaXMudG9TdHJpbmcoKT09PWUuZ2xvYmFsLlRPTkVfREVCVUdfQ0xBU1Mpe3ZhciB0PUFycmF5LmZyb20oYXJndW1lbnRzKTt0LnVuc2hpZnQodGhpcy50b1N0cmluZygpK1wiOlwiKSxjb25zb2xlLmxvZy5hcHBseSh2b2lkIDAsdCl9fSxlLnByb3RvdHlwZS5hc3NlcnQ9ZnVuY3Rpb24odCxlKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoZSl9LGUuY29ubmVjdFNlcmllcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHNbMF0saT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBuPWFyZ3VtZW50c1tpXTt0LmNvbm5lY3QobiksdD1ufXJldHVybiBlfSxlLmlzVW5kZWY9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXR9LGUuaXNEZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiFlLmlzVW5kZWYodCl9LGUuaXNGdW5jdGlvbj1mdW5jdGlvbih0KXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0fSxlLmlzTnVtYmVyPWZ1bmN0aW9uKHQpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiB0fSxlLmlzT2JqZWN0PWZ1bmN0aW9uKHQpe3JldHVyblwiW29iamVjdCBPYmplY3RdXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkmJnQuY29uc3RydWN0b3I9PT1PYmplY3R9LGUuaXNCb29sZWFuPWZ1bmN0aW9uKHQpe3JldHVyblwiYm9vbGVhblwiPT10eXBlb2YgdH0sZS5pc0FycmF5PWZ1bmN0aW9uKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpfSxlLmlzU3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiB0fSxlLmlzTm90ZT1mdW5jdGlvbih0KXtyZXR1cm4gZS5pc1N0cmluZyh0KSYmL14oW2EtZ117MX0oPzpifCN8eHxiYik/KSgtP1swLTldKykvaS50ZXN0KHQpfSxlLm5vT3A9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLl9yZWFkT25seT1mdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHQpKWZvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKXRoaXMuX3JlYWRPbmx5KHRbZV0pO2Vsc2UgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsdCx7d3JpdGFibGU6ITEsZW51bWVyYWJsZTohMH0pfSxlLnByb3RvdHlwZS5fd3JpdGFibGU9ZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKyl0aGlzLl93cml0YWJsZSh0W2VdKTtlbHNlIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHQse3dyaXRhYmxlOiEwfSl9LGUuU3RhdGU9e1N0YXJ0ZWQ6XCJzdGFydGVkXCIsU3RvcHBlZDpcInN0b3BwZWRcIixQYXVzZWQ6XCJwYXVzZWRcIn0sZS5nbG9iYWw9ZS5pc1VuZGVmKG4pP3dpbmRvdzpuLGUuZXF1YWxQb3dlclNjYWxlPWZ1bmN0aW9uKHQpe3ZhciBlPS41Kk1hdGguUEk7cmV0dXJuIE1hdGguc2luKHQqZSl9LGUuZGJUb0dhaW49ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KDEwLHQvMjApfSxlLmdhaW5Ub0RiPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmxvZyh0KS9NYXRoLkxOMTAqMjB9LGUuaW50ZXJ2YWxUb0ZyZXF1ZW5jeVJhdGlvPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdygyLHQvMTIpfSxlLnByb3RvdHlwZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gZS5jb250ZXh0Lm5vdygpfSxlLm5vdz1mdW5jdGlvbigpe3JldHVybiBlLmNvbnRleHQubm93KCl9LGUucHJvdG90eXBlLmltbWVkaWF0ZT1mdW5jdGlvbigpe3JldHVybiBlLmNvbnRleHQuY3VycmVudFRpbWV9LGUuaW1tZWRpYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIGUuY29udGV4dC5jdXJyZW50VGltZX0sZS5leHRlbmQ9ZnVuY3Rpb24odCxpKXtmdW5jdGlvbiBuKCl7fWUuaXNVbmRlZihpKSYmKGk9ZSksbi5wcm90b3R5cGU9aS5wcm90b3R5cGUsdC5wcm90b3R5cGU9bmV3IG4sdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dCx0Ll9zdXBlcj1pfSxlLl9hdWRpb0NvbnRleHQ9bnVsbCxlLnN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIGUuY29udGV4dC5yZXN1bWUoKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJjb250ZXh0XCIse2dldDpmdW5jdGlvbigpe3JldHVybiBlLl9hdWRpb0NvbnRleHR9LHNldDpmdW5jdGlvbih0KXt0LmlzQ29udGV4dD9lLl9hdWRpb0NvbnRleHQ9dDplLl9hdWRpb0NvbnRleHQ9bmV3IGUuQ29udGV4dCh0KSxlLkNvbnRleHQuZW1pdChcImluaXRcIixlLl9hdWRpb0NvbnRleHQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImNvbnRleHRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGUuY29udGV4dH19KSxlLnNldENvbnRleHQ9ZnVuY3Rpb24odCl7ZS5jb250ZXh0PXR9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImJsb2NrVGltZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMTI4L3RoaXMuY29udGV4dC5zYW1wbGVSYXRlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcInNhbXBsZVRpbWVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDEvdGhpcy5jb250ZXh0LnNhbXBsZVJhdGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzdXBwb3J0ZWRcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9ZS5nbG9iYWwuaGFzT3duUHJvcGVydHkoXCJBdWRpb0NvbnRleHRcIil8fGUuZ2xvYmFsLmhhc093blByb3BlcnR5KFwid2Via2l0QXVkaW9Db250ZXh0XCIpLGk9ZS5nbG9iYWwuaGFzT3duUHJvcGVydHkoXCJQcm9taXNlXCIpO3JldHVybiB0JiZpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiaW5pdGlhbGl6ZWRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4oZS5jb250ZXh0KX19KSxlLmdldENvbnRleHQ9ZnVuY3Rpb24odCl7aWYoZS5pbml0aWFsaXplZCl0KGUuY29udGV4dCk7ZWxzZXt2YXIgaT1mdW5jdGlvbigpe3QoZS5jb250ZXh0KSxlLkNvbnRleHQub2ZmKFwiaW5pdFwiLGkpfTtlLkNvbnRleHQub24oXCJpbml0XCIsaSl9cmV0dXJuIGV9LGUudmVyc2lvbj10LGV9LmFwcGx5KGUsbykpfHwodC5leHBvcnRzPXMpfSkuY2FsbCh0aGlzLGkoMTU0KSl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg3KSxpKDQpLGkoMTQpLGkoOTcpLGkoMyldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlNpZ25hbD1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcInZhbHVlXCIsXCJ1bml0c1wiXSx0LlNpZ25hbCk7dC5QYXJhbS5jYWxsKHRoaXMsZSksdGhpcy5fY29uc3RhbnRTb3VyY2U9dGhpcy5jb250ZXh0LmNyZWF0ZUNvbnN0YW50U291cmNlKCksdGhpcy5fY29uc3RhbnRTb3VyY2Uuc3RhcnQoMCksdGhpcy5fcGFyYW09dGhpcy5fY29uc3RhbnRTb3VyY2Uub2Zmc2V0LHRoaXMudmFsdWU9ZS52YWx1ZSx0aGlzLm91dHB1dD10aGlzLl9jb25zdGFudFNvdXJjZSx0aGlzLmlucHV0PXRoaXMuX3BhcmFtPXRoaXMub3V0cHV0Lm9mZnNldH0sdC5leHRlbmQodC5TaWduYWwsdC5QYXJhbSksdC5TaWduYWwuZGVmYXVsdHM9e3ZhbHVlOjAsdW5pdHM6dC5UeXBlLkRlZmF1bHQsY29udmVydDohMH0sdC5TaWduYWwucHJvdG90eXBlLmNvbm5lY3Q9dC5TaWduYWxCYXNlLnByb3RvdHlwZS5jb25uZWN0LHQuU2lnbmFsLnByb3RvdHlwZS5kaXNjb25uZWN0PXQuU2lnbmFsQmFzZS5wcm90b3R5cGUuZGlzY29ubmVjdCx0LlNpZ25hbC5wcm90b3R5cGUuZ2V0VmFsdWVBdFRpbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3BhcmFtLmdldFZhbHVlQXRUaW1lP3RoaXMuX3BhcmFtLmdldFZhbHVlQXRUaW1lKGUpOnQuUGFyYW0ucHJvdG90eXBlLmdldFZhbHVlQXRUaW1lLmNhbGwodGhpcyxlKX0sdC5TaWduYWwucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5QYXJhbS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX2NvbnN0YW50U291cmNlLmRpc2Nvbm5lY3QoKSx0aGlzLl9jb25zdGFudFNvdXJjZT1udWxsLHRoaXN9LHQuU2lnbmFsfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDIwKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuQXVkaW9Ob2RlPWZ1bmN0aW9uKCl7dC5jYWxsKHRoaXMpO3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcImNvbnRleHRcIl0se2NvbnRleHQ6dC5jb250ZXh0fSk7dGhpcy5fY29udGV4dD1lLmNvbnRleHR9LHQuZXh0ZW5kKHQuQXVkaW9Ob2RlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BdWRpb05vZGUucHJvdG90eXBlLFwiY29udGV4dFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGV4dH19KSx0LkF1ZGlvTm9kZS5wcm90b3R5cGUuY3JlYXRlSW5zT3V0cz1mdW5jdGlvbih0LGUpezE9PT10P3RoaXMuaW5wdXQ9dGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKTp0PjEmJih0aGlzLmlucHV0PW5ldyBBcnJheSh0KSksMT09PWU/dGhpcy5vdXRwdXQ9dGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKTplPjEmJih0aGlzLm91dHB1dD1uZXcgQXJyYXkoZSkpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BdWRpb05vZGUucHJvdG90eXBlLFwiY2hhbm5lbENvdW50XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm91dHB1dC5jaGFubmVsQ291bnR9LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vdXRwdXQuY2hhbm5lbENvdW50PXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQXVkaW9Ob2RlLnByb3RvdHlwZSxcImNoYW5uZWxDb3VudE1vZGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3V0cHV0LmNoYW5uZWxDb3VudE1vZGV9LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vdXRwdXQuY2hhbm5lbENvdW50TW9kZT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkF1ZGlvTm9kZS5wcm90b3R5cGUsXCJjaGFubmVsSW50ZXJwcmV0YXRpb25cIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3V0cHV0LmNoYW5uZWxJbnRlcnByZXRhdGlvbn0sc2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm91dHB1dC5jaGFubmVsSW50ZXJwcmV0YXRpb249dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BdWRpb05vZGUucHJvdG90eXBlLFwibnVtYmVyT2ZJbnB1dHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5wdXQ/dC5pc0FycmF5KHRoaXMuaW5wdXQpP3RoaXMuaW5wdXQubGVuZ3RoOjE6MH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BdWRpb05vZGUucHJvdG90eXBlLFwibnVtYmVyT2ZPdXRwdXRzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm91dHB1dD90LmlzQXJyYXkodGhpcy5vdXRwdXQpP3RoaXMub3V0cHV0Lmxlbmd0aDoxOjB9fSksdC5BdWRpb05vZGUucHJvdG90eXBlLmNvbm5lY3Q9ZnVuY3Rpb24oZSxpLG4pe3JldHVybiB0LmlzQXJyYXkodGhpcy5vdXRwdXQpPyhpPXQuZGVmYXVsdEFyZyhpLDApLHRoaXMub3V0cHV0W2ldLmNvbm5lY3QoZSwwLG4pKTp0aGlzLm91dHB1dC5jb25uZWN0KGUsaSxuKSx0aGlzfSx0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzY29ubmVjdD1mdW5jdGlvbihlLGksbil7dC5pc0FycmF5KHRoaXMub3V0cHV0KT90LmlzTnVtYmVyKGUpP3RoaXMub3V0cHV0W2VdLmRpc2Nvbm5lY3QoKTooaT10LmRlZmF1bHRBcmcoaSwwKSx0aGlzLm91dHB1dFtpXS5kaXNjb25uZWN0KGUsMCxuKSk6dGhpcy5vdXRwdXQuZGlzY29ubmVjdC5hcHBseSh0aGlzLm91dHB1dCxhcmd1bWVudHMpfSx0LkF1ZGlvTm9kZS5wcm90b3R5cGUuY2hhaW49ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIGk9YXJndW1lbnRzW2VdO3QuY29ubmVjdChpKSx0PWl9cmV0dXJuIHRoaXN9LHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5mYW49ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXRoaXMuY29ubmVjdChhcmd1bWVudHNbdF0pO3JldHVybiB0aGlzfSx0Lmdsb2JhbC5BdWRpb05vZGUmJihBdWRpb05vZGUucHJvdG90eXBlLmNoYWluPXQuQXVkaW9Ob2RlLnByb3RvdHlwZS5jaGFpbixBdWRpb05vZGUucHJvdG90eXBlLmZhbj10LkF1ZGlvTm9kZS5wcm90b3R5cGUuZmFuKSx0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LmlzRGVmaW5lZCh0aGlzLmlucHV0KSYmKHRoaXMuaW5wdXQgaW5zdGFuY2VvZiBBdWRpb05vZGUmJnRoaXMuaW5wdXQuZGlzY29ubmVjdCgpLHRoaXMuaW5wdXQ9bnVsbCksdC5pc0RlZmluZWQodGhpcy5vdXRwdXQpJiYodGhpcy5vdXRwdXQgaW5zdGFuY2VvZiBBdWRpb05vZGUmJnRoaXMub3V0cHV0LmRpc2Nvbm5lY3QoKSx0aGlzLm91dHB1dD1udWxsKSx0aGlzLl9jb250ZXh0PW51bGwsdGhpc30sdC5BdWRpb05vZGV9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMTQpLGkoNCksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuR2Fpbj1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcImdhaW5cIixcInVuaXRzXCJdLHQuR2Fpbik7dC5BdWRpb05vZGUuY2FsbCh0aGlzLGUpLHRoaXMuaW5wdXQ9dGhpcy5vdXRwdXQ9dGhpcy5fZ2Fpbk5vZGU9dGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKSx0aGlzLmdhaW49bmV3IHQuUGFyYW0oe3BhcmFtOnRoaXMuX2dhaW5Ob2RlLmdhaW4sdW5pdHM6ZS51bml0cyx2YWx1ZTplLmdhaW4sY29udmVydDplLmNvbnZlcnR9KSx0aGlzLl9yZWFkT25seShcImdhaW5cIil9LHQuZXh0ZW5kKHQuR2Fpbix0LkF1ZGlvTm9kZSksdC5HYWluLmRlZmF1bHRzPXtnYWluOjEsY29udmVydDohMH0sdC5HYWluLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dC5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9nYWluTm9kZS5kaXNjb25uZWN0KCksdGhpcy5fZ2Fpbk5vZGU9bnVsbCx0aGlzLl93cml0YWJsZShcImdhaW5cIiksdGhpcy5nYWluLmRpc3Bvc2UoKSx0aGlzLmdhaW49bnVsbH0sdC5HYWlufS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDY1KSxpKDQ2KSxpKDQ1KSxpKDIwKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuVHlwZT17RGVmYXVsdDpcIm51bWJlclwiLFRpbWU6XCJ0aW1lXCIsRnJlcXVlbmN5OlwiZnJlcXVlbmN5XCIsVHJhbnNwb3J0VGltZTpcInRyYW5zcG9ydFRpbWVcIixUaWNrczpcInRpY2tzXCIsTm9ybWFsUmFuZ2U6XCJub3JtYWxSYW5nZVwiLEF1ZGlvUmFuZ2U6XCJhdWRpb1JhbmdlXCIsRGVjaWJlbHM6XCJkYlwiLEludGVydmFsOlwiaW50ZXJ2YWxcIixCUE06XCJicG1cIixQb3NpdGl2ZTpcInBvc2l0aXZlXCIsR2FpbjpcImdhaW5cIixDZW50czpcImNlbnRzXCIsRGVncmVlczpcImRlZ3JlZXNcIixNSURJOlwibWlkaVwiLEJhcnNCZWF0c1NpeHRlZW50aHM6XCJiYXJzQmVhdHNTaXh0ZWVudGhzXCIsU2FtcGxlczpcInNhbXBsZXNcIixIZXJ0ejpcImhlcnR6XCIsTm90ZTpcIm5vdGVcIixNaWxsaXNlY29uZHM6XCJtaWxsaXNlY29uZHNcIixTZWNvbmRzOlwic2Vjb25kc1wiLE5vdGF0aW9uOlwibm90YXRpb25cIn0sdC5wcm90b3R5cGUudG9TZWNvbmRzPWZ1bmN0aW9uKGUpe3JldHVybiB0LmlzTnVtYmVyKGUpP2U6dC5pc1VuZGVmKGUpP3RoaXMubm93KCk6dC5pc1N0cmluZyhlKXx8dC5pc09iamVjdChlKT9uZXcgdC5UaW1lKGUpLnRvU2Vjb25kcygpOmUgaW5zdGFuY2VvZiB0LlRpbWVCYXNlP2UudG9TZWNvbmRzKCk6dm9pZCAwfSx0LnByb3RvdHlwZS50b0ZyZXF1ZW5jeT1mdW5jdGlvbihlKXtyZXR1cm4gdC5pc051bWJlcihlKT9lOnQuaXNTdHJpbmcoZSl8fHQuaXNVbmRlZihlKXx8dC5pc09iamVjdChlKT9uZXcgdC5GcmVxdWVuY3koZSkudmFsdWVPZigpOmUgaW5zdGFuY2VvZiB0LlRpbWVCYXNlP2UudG9GcmVxdWVuY3koKTp2b2lkIDB9LHQucHJvdG90eXBlLnRvVGlja3M9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuaXNOdW1iZXIoZSl8fHQuaXNTdHJpbmcoZSl8fHQuaXNPYmplY3QoZSk/bmV3IHQuVHJhbnNwb3J0VGltZShlKS50b1RpY2tzKCk6dC5pc1VuZGVmKGUpP3QuVHJhbnNwb3J0LnRpY2tzOmUgaW5zdGFuY2VvZiB0LlRpbWVCYXNlP2UudG9UaWNrcygpOnZvaWQgMH0sdH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxNCksaSgzKSxpKDM2KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuTXVsdGlwbHk9ZnVuY3Rpb24oZSl7dC5TaWduYWwuY2FsbCh0aGlzKSx0aGlzLmNyZWF0ZUluc091dHMoMiwwKSx0aGlzLl9tdWx0PXRoaXMuaW5wdXRbMF09dGhpcy5vdXRwdXQ9bmV3IHQuR2Fpbix0aGlzLl9wYXJhbT10aGlzLmlucHV0WzFdPXRoaXMub3V0cHV0LmdhaW4sdGhpcy52YWx1ZT10LmRlZmF1bHRBcmcoZSwwKSx0aGlzLnByb3h5PSExfSx0LmV4dGVuZCh0Lk11bHRpcGx5LHQuU2lnbmFsKSx0Lk11bHRpcGx5LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU2lnbmFsLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fbXVsdC5kaXNwb3NlKCksdGhpcy5fbXVsdD1udWxsLHRoaXMuX3BhcmFtPW51bGwsdGhpc30sdC5NdWx0aXBseX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxNiksaSgyNyksaSg0MCksaSg0KSxpKDMzKSxpKDEpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlNvdXJjZT1mdW5jdGlvbihlKXtlPXQuZGVmYXVsdEFyZyhlLHQuU291cmNlLmRlZmF1bHRzKSx0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLHRoaXMuX3ZvbHVtZT10aGlzLm91dHB1dD1uZXcgdC5Wb2x1bWUoZS52b2x1bWUpLHRoaXMudm9sdW1lPXRoaXMuX3ZvbHVtZS52b2x1bWUsdGhpcy5fcmVhZE9ubHkoXCJ2b2x1bWVcIiksdGhpcy5fc3RhdGU9bmV3IHQuVGltZWxpbmVTdGF0ZSh0LlN0YXRlLlN0b3BwZWQpLHRoaXMuX3N0YXRlLm1lbW9yeT0xMDAsdGhpcy5fc3luY2VkPSExLHRoaXMuX3NjaGVkdWxlZD1bXSx0aGlzLl92b2x1bWUub3V0cHV0Lm91dHB1dC5jaGFubmVsQ291bnQ9Mix0aGlzLl92b2x1bWUub3V0cHV0Lm91dHB1dC5jaGFubmVsQ291bnRNb2RlPVwiZXhwbGljaXRcIix0aGlzLm11dGU9ZS5tdXRlfSx0LmV4dGVuZCh0LlNvdXJjZSx0LkF1ZGlvTm9kZSksdC5Tb3VyY2UuZGVmYXVsdHM9e3ZvbHVtZTowLG11dGU6ITF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlNvdXJjZS5wcm90b3R5cGUsXCJzdGF0ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3luY2VkP3QuVHJhbnNwb3J0LnN0YXRlPT09dC5TdGF0ZS5TdGFydGVkP3RoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKHQuVHJhbnNwb3J0LnNlY29uZHMpOnQuU3RhdGUuU3RvcHBlZDp0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZSh0aGlzLm5vdygpKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5Tb3VyY2UucHJvdG90eXBlLFwibXV0ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdm9sdW1lLm11dGV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl92b2x1bWUubXV0ZT10fX0pLHQuU291cmNlLnByb3RvdHlwZS5fc3RhcnQ9dC5ub09wLHQuU291cmNlLnByb3RvdHlwZS5yZXN0YXJ0PXQubm9PcCx0LlNvdXJjZS5wcm90b3R5cGUuX3N0b3A9dC5ub09wLHQuU291cmNlLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbihlLGksbil7aWYoZT10LmlzVW5kZWYoZSkmJnRoaXMuX3N5bmNlZD90LlRyYW5zcG9ydC5zZWNvbmRzOnRoaXMudG9TZWNvbmRzKGUpLHRoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKGUpPT09dC5TdGF0ZS5TdGFydGVkKXRoaXMuX3N0YXRlLmNhbmNlbChlKSx0aGlzLl9zdGF0ZS5zZXRTdGF0ZUF0VGltZSh0LlN0YXRlLlN0YXJ0ZWQsZSksdGhpcy5yZXN0YXJ0KGUsaSxuKTtlbHNlIGlmKHRoaXMuX3N0YXRlLnNldFN0YXRlQXRUaW1lKHQuU3RhdGUuU3RhcnRlZCxlKSx0aGlzLl9zeW5jZWQpe3ZhciBvPXRoaXMuX3N0YXRlLmdldChlKTtvLm9mZnNldD10LmRlZmF1bHRBcmcoaSwwKSxvLmR1cmF0aW9uPW47dmFyIHM9dC5UcmFuc3BvcnQuc2NoZWR1bGUoZnVuY3Rpb24odCl7dGhpcy5fc3RhcnQodCxpLG4pfS5iaW5kKHRoaXMpLGUpO3RoaXMuX3NjaGVkdWxlZC5wdXNoKHMpLHQuVHJhbnNwb3J0LnN0YXRlPT09dC5TdGF0ZS5TdGFydGVkJiZ0aGlzLl9zeW5jZWRTdGFydCh0aGlzLm5vdygpLHQuVHJhbnNwb3J0LnNlY29uZHMpfWVsc2UgdGhpcy5fc3RhcnQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiB0aGlzfSx0LlNvdXJjZS5wcm90b3R5cGUuc3RvcD1mdW5jdGlvbihlKXtpZihlPXQuaXNVbmRlZihlKSYmdGhpcy5fc3luY2VkP3QuVHJhbnNwb3J0LnNlY29uZHM6dGhpcy50b1NlY29uZHMoZSksdGhpcy5fc3luY2VkKXt2YXIgaT10LlRyYW5zcG9ydC5zY2hlZHVsZSh0aGlzLl9zdG9wLmJpbmQodGhpcyksZSk7dGhpcy5fc2NoZWR1bGVkLnB1c2goaSl9ZWxzZSB0aGlzLl9zdG9wLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gdGhpcy5fc3RhdGUuY2FuY2VsKGUpLHRoaXMuX3N0YXRlLnNldFN0YXRlQXRUaW1lKHQuU3RhdGUuU3RvcHBlZCxlKSx0aGlzfSx0LlNvdXJjZS5wcm90b3R5cGUuc3luYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zeW5jZWQ9ITAsdGhpcy5fc3luY2VkU3RhcnQ9ZnVuY3Rpb24oZSxpKXtpZihpPjApe3ZhciBuPXRoaXMuX3N0YXRlLmdldChpKTtpZihuJiZuLnN0YXRlPT09dC5TdGF0ZS5TdGFydGVkJiZuLnRpbWUhPT1pKXt2YXIgbyxzPWktdGhpcy50b1NlY29uZHMobi50aW1lKTtuLmR1cmF0aW9uJiYobz10aGlzLnRvU2Vjb25kcyhuLmR1cmF0aW9uKS1zKSx0aGlzLl9zdGFydChlLHRoaXMudG9TZWNvbmRzKG4ub2Zmc2V0KStzLG8pfX19LmJpbmQodGhpcyksdGhpcy5fc3luY2VkU3RvcD1mdW5jdGlvbihlKXt2YXIgaT10LlRyYW5zcG9ydC5nZXRTZWNvbmRzQXRUaW1lKE1hdGgubWF4KGUtdGhpcy5zYW1wbGVUaW1lLDApKTt0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZShpKT09PXQuU3RhdGUuU3RhcnRlZCYmdGhpcy5fc3RvcChlKX0uYmluZCh0aGlzKSx0LlRyYW5zcG9ydC5vbihcInN0YXJ0IGxvb3BTdGFydFwiLHRoaXMuX3N5bmNlZFN0YXJ0KSx0LlRyYW5zcG9ydC5vbihcInN0b3AgcGF1c2UgbG9vcEVuZFwiLHRoaXMuX3N5bmNlZFN0b3ApLHRoaXN9LHQuU291cmNlLnByb3RvdHlwZS51bnN5bmM9ZnVuY3Rpb24oKXt0aGlzLl9zeW5jZWQmJih0LlRyYW5zcG9ydC5vZmYoXCJzdG9wIHBhdXNlIGxvb3BFbmRcIix0aGlzLl9zeW5jZWRTdG9wKSx0LlRyYW5zcG9ydC5vZmYoXCJzdGFydCBsb29wU3RhcnRcIix0aGlzLl9zeW5jZWRTdGFydCkpLHRoaXMuX3N5bmNlZD0hMTtmb3IodmFyIGU9MDtlPHRoaXMuX3NjaGVkdWxlZC5sZW5ndGg7ZSsrKXt2YXIgaT10aGlzLl9zY2hlZHVsZWRbZV07dC5UcmFuc3BvcnQuY2xlYXIoaSl9cmV0dXJuIHRoaXMuX3NjaGVkdWxlZD1bXSx0aGlzLl9zdGF0ZS5jYW5jZWwoMCksdGhpc30sdC5Tb3VyY2UucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMudW5zeW5jKCksdGhpcy5fc2NoZWR1bGVkPW51bGwsdGhpcy5fd3JpdGFibGUoXCJ2b2x1bWVcIiksdGhpcy5fdm9sdW1lLmRpc3Bvc2UoKSx0aGlzLl92b2x1bWU9bnVsbCx0aGlzLnZvbHVtZT1udWxsLHRoaXMuX3N0YXRlLmRpc3Bvc2UoKSx0aGlzLl9zdGF0ZT1udWxsfSx0LlNvdXJjZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgzNiksaSg5OCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LldhdmVTaGFwZXI9ZnVuY3Rpb24oZSxpKXt0LlNpZ25hbEJhc2UuY2FsbCh0aGlzKSx0aGlzLl9zaGFwZXI9dGhpcy5pbnB1dD10aGlzLm91dHB1dD10aGlzLmNvbnRleHQuY3JlYXRlV2F2ZVNoYXBlcigpLHRoaXMuX2N1cnZlPW51bGwsQXJyYXkuaXNBcnJheShlKT90aGlzLmN1cnZlPWU6aXNGaW5pdGUoZSl8fHQuaXNVbmRlZihlKT90aGlzLl9jdXJ2ZT1uZXcgRmxvYXQzMkFycmF5KHQuZGVmYXVsdEFyZyhlLDEwMjQpKTp0LmlzRnVuY3Rpb24oZSkmJih0aGlzLl9jdXJ2ZT1uZXcgRmxvYXQzMkFycmF5KHQuZGVmYXVsdEFyZyhpLDEwMjQpKSx0aGlzLnNldE1hcChlKSl9LHQuZXh0ZW5kKHQuV2F2ZVNoYXBlcix0LlNpZ25hbEJhc2UpLHQuV2F2ZVNoYXBlci5wcm90b3R5cGUuc2V0TWFwPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodGhpcy5fY3VydmUubGVuZ3RoKSxpPTAsbj10aGlzLl9jdXJ2ZS5sZW5ndGg7aTxuO2krKyl7dmFyIG89aS8obi0xKSoyLTE7ZVtpXT10KG8saSl9cmV0dXJuIHRoaXMuY3VydmU9ZSx0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5XYXZlU2hhcGVyLnByb3RvdHlwZSxcImN1cnZlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGFwZXIuY3VydmV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9jdXJ2ZT1uZXcgRmxvYXQzMkFycmF5KHQpLHRoaXMuX3NoYXBlci5jdXJ2ZT10aGlzLl9jdXJ2ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5XYXZlU2hhcGVyLnByb3RvdHlwZSxcIm92ZXJzYW1wbGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NoYXBlci5vdmVyc2FtcGxlfSxzZXQ6ZnVuY3Rpb24odCl7aWYoIVtcIm5vbmVcIixcIjJ4XCIsXCI0eFwiXS5pbmNsdWRlcyh0KSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRvbmUuV2F2ZVNoYXBlcjogb3ZlcnNhbXBsaW5nIG11c3QgYmUgZWl0aGVyICdub25lJywgJzJ4Jywgb3IgJzR4J1wiKTt0aGlzLl9zaGFwZXIub3ZlcnNhbXBsZT10fX0pLHQuV2F2ZVNoYXBlci5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LlNpZ25hbEJhc2UucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9zaGFwZXIuZGlzY29ubmVjdCgpLHRoaXMuX3NoYXBlcj1udWxsLHRoaXMuX2N1cnZlPW51bGwsdGhpc30sdC5XYXZlU2hhcGVyfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDIzKSxpKDIpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5FZmZlY3Q9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJ3ZXRcIl0sdC5FZmZlY3QpO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5jcmVhdGVJbnNPdXRzKDEsMSksdGhpcy5fZHJ5V2V0PW5ldyB0LkNyb3NzRmFkZShlLndldCksdGhpcy53ZXQ9dGhpcy5fZHJ5V2V0LmZhZGUsdGhpcy5lZmZlY3RTZW5kPW5ldyB0LkdhaW4sdGhpcy5lZmZlY3RSZXR1cm49bmV3IHQuR2Fpbix0aGlzLmlucHV0LmNvbm5lY3QodGhpcy5fZHJ5V2V0LmEpLHRoaXMuaW5wdXQuY29ubmVjdCh0aGlzLmVmZmVjdFNlbmQpLHRoaXMuZWZmZWN0UmV0dXJuLmNvbm5lY3QodGhpcy5fZHJ5V2V0LmIpLHRoaXMuX2RyeVdldC5jb25uZWN0KHRoaXMub3V0cHV0KSx0aGlzLl9yZWFkT25seShbXCJ3ZXRcIl0pfSx0LmV4dGVuZCh0LkVmZmVjdCx0LkF1ZGlvTm9kZSksdC5FZmZlY3QuZGVmYXVsdHM9e3dldDoxfSx0LkVmZmVjdC5wcm90b3R5cGUuY29ubmVjdEVmZmVjdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lZmZlY3RTZW5kLmNoYWluKHQsdGhpcy5lZmZlY3RSZXR1cm4pLHRoaXN9LHQuRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fZHJ5V2V0LmRpc3Bvc2UoKSx0aGlzLl9kcnlXZXQ9bnVsbCx0aGlzLmVmZmVjdFNlbmQuZGlzcG9zZSgpLHRoaXMuZWZmZWN0U2VuZD1udWxsLHRoaXMuZWZmZWN0UmV0dXJuLmRpc3Bvc2UoKSx0aGlzLmVmZmVjdFJldHVybj1udWxsLHRoaXMuX3dyaXRhYmxlKFtcIndldFwiXSksdGhpcy53ZXQ9bnVsbCx0aGlzfSx0LkVmZmVjdH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxKSxpKDIpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5GaWx0ZXI9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJmcmVxdWVuY3lcIixcInR5cGVcIixcInJvbGxvZmZcIl0sdC5GaWx0ZXIpO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5jcmVhdGVJbnNPdXRzKDEsMSksdGhpcy5fZmlsdGVycz1bXSx0aGlzLmZyZXF1ZW5jeT1uZXcgdC5TaWduYWwoZS5mcmVxdWVuY3ksdC5UeXBlLkZyZXF1ZW5jeSksdGhpcy5kZXR1bmU9bmV3IHQuU2lnbmFsKDAsdC5UeXBlLkNlbnRzKSx0aGlzLmdhaW49bmV3IHQuU2lnbmFsKHt2YWx1ZTplLmdhaW4sY29udmVydDohMCx0eXBlOnQuVHlwZS5EZWNpYmVsc30pLHRoaXMuUT1uZXcgdC5TaWduYWwoZS5RKSx0aGlzLl90eXBlPWUudHlwZSx0aGlzLl9yb2xsb2ZmPWUucm9sbG9mZix0aGlzLnJvbGxvZmY9ZS5yb2xsb2ZmLHRoaXMuX3JlYWRPbmx5KFtcImRldHVuZVwiLFwiZnJlcXVlbmN5XCIsXCJnYWluXCIsXCJRXCJdKX0sdC5leHRlbmQodC5GaWx0ZXIsdC5BdWRpb05vZGUpLHQuRmlsdGVyLmRlZmF1bHRzPXt0eXBlOlwibG93cGFzc1wiLGZyZXF1ZW5jeTozNTAscm9sbG9mZjotMTIsUToxLGdhaW46MH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuRmlsdGVyLnByb3RvdHlwZSxcInR5cGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3R5cGV9LHNldDpmdW5jdGlvbih0KXtpZigtMT09PVtcImxvd3Bhc3NcIixcImhpZ2hwYXNzXCIsXCJiYW5kcGFzc1wiLFwibG93c2hlbGZcIixcImhpZ2hzaGVsZlwiLFwibm90Y2hcIixcImFsbHBhc3NcIixcInBlYWtpbmdcIl0uaW5kZXhPZih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVG9uZS5GaWx0ZXI6IGludmFsaWQgdHlwZSBcIit0KTt0aGlzLl90eXBlPXQ7Zm9yKHZhciBlPTA7ZTx0aGlzLl9maWx0ZXJzLmxlbmd0aDtlKyspdGhpcy5fZmlsdGVyc1tlXS50eXBlPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuRmlsdGVyLnByb3RvdHlwZSxcInJvbGxvZmZcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JvbGxvZmZ9LHNldDpmdW5jdGlvbihlKXtlPXBhcnNlSW50KGUsMTApO3ZhciBpPVstMTIsLTI0LC00OCwtOTZdLmluZGV4T2YoZSk7aWYoLTE9PT1pKXRocm93IG5ldyBSYW5nZUVycm9yKFwiVG9uZS5GaWx0ZXI6IHJvbGxvZmYgY2FuIG9ubHkgYmUgLTEyLCAtMjQsIC00OCBvciAtOTZcIik7aSs9MSx0aGlzLl9yb2xsb2ZmPWUsdGhpcy5pbnB1dC5kaXNjb25uZWN0KCk7Zm9yKHZhciBuPTA7bjx0aGlzLl9maWx0ZXJzLmxlbmd0aDtuKyspdGhpcy5fZmlsdGVyc1tuXS5kaXNjb25uZWN0KCksdGhpcy5fZmlsdGVyc1tuXT1udWxsO3RoaXMuX2ZpbHRlcnM9bmV3IEFycmF5KGkpO2Zvcih2YXIgbz0wO288aTtvKyspe3ZhciBzPXRoaXMuY29udGV4dC5jcmVhdGVCaXF1YWRGaWx0ZXIoKTtzLnR5cGU9dGhpcy5fdHlwZSx0aGlzLmZyZXF1ZW5jeS5jb25uZWN0KHMuZnJlcXVlbmN5KSx0aGlzLmRldHVuZS5jb25uZWN0KHMuZGV0dW5lKSx0aGlzLlEuY29ubmVjdChzLlEpLHRoaXMuZ2Fpbi5jb25uZWN0KHMuZ2FpbiksdGhpcy5fZmlsdGVyc1tvXT1zfXZhciByPVt0aGlzLmlucHV0XS5jb25jYXQodGhpcy5fZmlsdGVycykuY29uY2F0KFt0aGlzLm91dHB1dF0pO3QuY29ubmVjdFNlcmllcy5hcHBseSh0LHIpfX0pLHQuRmlsdGVyLnByb3RvdHlwZS5nZXRGcmVxdWVuY3lSZXNwb25zZT1mdW5jdGlvbihlKXtlPXQuZGVmYXVsdEFyZyhlLDEyOCk7Zm9yKHZhciBpPW5ldyBGbG9hdDMyQXJyYXkoZSkubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIDF9KSxuPW5ldyBGbG9hdDMyQXJyYXkoZSksbz0wO288ZTtvKyspe3ZhciBzPTE5OTgwKk1hdGgucG93KG8vZSwyKSsyMDtuW29dPXN9dmFyIHI9bmV3IEZsb2F0MzJBcnJheShlKSxhPW5ldyBGbG9hdDMyQXJyYXkoZSk7cmV0dXJuIHRoaXMuX2ZpbHRlcnMuZm9yRWFjaChmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udGV4dC5jcmVhdGVCaXF1YWRGaWx0ZXIoKTt0LnR5cGU9dGhpcy5fdHlwZSx0LlEudmFsdWU9dGhpcy5RLnZhbHVlLHQuZnJlcXVlbmN5LnZhbHVlPXRoaXMuZnJlcXVlbmN5LnZhbHVlLHQuZ2Fpbi52YWx1ZT10aGlzLmdhaW4udmFsdWUsdC5nZXRGcmVxdWVuY3lSZXNwb25zZShuLHIsYSksci5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7aVtlXSo9dH0pfS5iaW5kKHRoaXMpKSxpfSx0LkZpbHRlci5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3QuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7Zm9yKHZhciBlPTA7ZTx0aGlzLl9maWx0ZXJzLmxlbmd0aDtlKyspdGhpcy5fZmlsdGVyc1tlXS5kaXNjb25uZWN0KCksdGhpcy5fZmlsdGVyc1tlXT1udWxsO3JldHVybiB0aGlzLl9maWx0ZXJzPW51bGwsdGhpcy5fd3JpdGFibGUoW1wiZGV0dW5lXCIsXCJmcmVxdWVuY3lcIixcImdhaW5cIixcIlFcIl0pLHRoaXMuZnJlcXVlbmN5LmRpc3Bvc2UoKSx0aGlzLlEuZGlzcG9zZSgpLHRoaXMuZnJlcXVlbmN5PW51bGwsdGhpcy5RPW51bGwsdGhpcy5kZXR1bmUuZGlzcG9zZSgpLHRoaXMuZGV0dW5lPW51bGwsdGhpcy5nYWluLmRpc3Bvc2UoKSx0aGlzLmdhaW49bnVsbCx0aGlzfSx0LkZpbHRlcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuTWVyZ2U9ZnVuY3Rpb24oKXt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLHRoaXMuY3JlYXRlSW5zT3V0cygyLDApLHRoaXMubGVmdD10aGlzLmlucHV0WzBdPW5ldyB0LkdhaW4sdGhpcy5yaWdodD10aGlzLmlucHV0WzFdPW5ldyB0LkdhaW4sdGhpcy5fbWVyZ2VyPXRoaXMub3V0cHV0PXRoaXMuY29udGV4dC5jcmVhdGVDaGFubmVsTWVyZ2VyKDIpLHRoaXMubGVmdC5jb25uZWN0KHRoaXMuX21lcmdlciwwLDApLHRoaXMucmlnaHQuY29ubmVjdCh0aGlzLl9tZXJnZXIsMCwxKSx0aGlzLmxlZnQuY2hhbm5lbENvdW50PTEsdGhpcy5yaWdodC5jaGFubmVsQ291bnQ9MSx0aGlzLmxlZnQuY2hhbm5lbENvdW50TW9kZT1cImV4cGxpY2l0XCIsdGhpcy5yaWdodC5jaGFubmVsQ291bnRNb2RlPVwiZXhwbGljaXRcIn0sdC5leHRlbmQodC5NZXJnZSx0LkF1ZGlvTm9kZSksdC5NZXJnZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMubGVmdC5kaXNwb3NlKCksdGhpcy5sZWZ0PW51bGwsdGhpcy5yaWdodC5kaXNwb3NlKCksdGhpcy5yaWdodD1udWxsLHRoaXMuX21lcmdlci5kaXNjb25uZWN0KCksdGhpcy5fbWVyZ2VyPW51bGwsdGhpc30sdC5NZXJnZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgzNSksaSg0KSxpKDgxKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuQnVmZmVyPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1widXJsXCIsXCJvbmxvYWRcIixcIm9uZXJyb3JcIl0sdC5CdWZmZXIpO3QuY2FsbCh0aGlzKSx0aGlzLl9idWZmZXI9bnVsbCx0aGlzLl9yZXZlcnNlZD1lLnJldmVyc2UsdGhpcy5feGhyPW51bGwsdGhpcy5vbmxvYWQ9dC5ub09wLGUudXJsIGluc3RhbmNlb2YgQXVkaW9CdWZmZXJ8fGUudXJsIGluc3RhbmNlb2YgdC5CdWZmZXI/KHRoaXMuc2V0KGUudXJsKSx0aGlzLmxvYWRlZHx8KHRoaXMub25sb2FkPWUub25sb2FkKSk6dC5pc1N0cmluZyhlLnVybCkmJnRoaXMubG9hZChlLnVybCkudGhlbihlLm9ubG9hZCkuY2F0Y2goZS5vbmVycm9yKX0sdC5leHRlbmQodC5CdWZmZXIpLHQuQnVmZmVyLmRlZmF1bHRzPXt1cmw6dm9pZCAwLHJldmVyc2U6ITEsb25sb2FkOnQubm9PcCxvbmVycm9yOnQubm9PcH0sdC5CdWZmZXIucHJvdG90eXBlLnNldD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHQuQnVmZmVyP2UubG9hZGVkP3RoaXMuX2J1ZmZlcj1lLmdldCgpOmUub25sb2FkPWZ1bmN0aW9uKCl7dGhpcy5zZXQoZSksdGhpcy5vbmxvYWQodGhpcyl9LmJpbmQodGhpcyk6dGhpcy5fYnVmZmVyPWUsdGhpc30sdC5CdWZmZXIucHJvdG90eXBlLmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9idWZmZXJ9LHQuQnVmZmVyLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKGUsaSxuKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24obyxzKXt0aGlzLl94aHI9dC5CdWZmZXIubG9hZChlLGZ1bmN0aW9uKHQpe3RoaXMuX3hocj1udWxsLHRoaXMuc2V0KHQpLG8odGhpcyksdGhpcy5vbmxvYWQodGhpcyksaSYmaSh0aGlzKX0uYmluZCh0aGlzKSxmdW5jdGlvbih0KXt0aGlzLl94aHI9bnVsbCxzKHQpLG4mJm4odCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX0sdC5CdWZmZXIucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX2J1ZmZlcj1udWxsLHRoaXMuX3hociYmKHQuQnVmZmVyLl9yZW1vdmVGcm9tRG93bmxvYWRRdWV1ZSh0aGlzLl94aHIpLHRoaXMuX3hoci5hYm9ydCgpLHRoaXMuX3hocj1udWxsKSx0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5CdWZmZXIucHJvdG90eXBlLFwibG9hZGVkXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aD4wfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkJ1ZmZlci5wcm90b3R5cGUsXCJkdXJhdGlvblwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYnVmZmVyP3RoaXMuX2J1ZmZlci5kdXJhdGlvbjowfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkJ1ZmZlci5wcm90b3R5cGUsXCJsZW5ndGhcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2J1ZmZlcj90aGlzLl9idWZmZXIubGVuZ3RoOjB9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQnVmZmVyLnByb3RvdHlwZSxcIm51bWJlck9mQ2hhbm5lbHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2J1ZmZlcj90aGlzLl9idWZmZXIubnVtYmVyT2ZDaGFubmVsczowfX0pLHQuQnVmZmVyLnByb3RvdHlwZS5mcm9tQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9dFswXS5sZW5ndGg+MCxpPWU/dC5sZW5ndGg6MSxuPWU/dFswXS5sZW5ndGg6dC5sZW5ndGgsbz10aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyKGksbix0aGlzLmNvbnRleHQuc2FtcGxlUmF0ZSk7ZXx8MSE9PWl8fCh0PVt0XSk7Zm9yKHZhciBzPTA7czxpO3MrKylvLmNvcHlUb0NoYW5uZWwodFtzXSxzKTtyZXR1cm4gdGhpcy5fYnVmZmVyPW8sdGhpc30sdC5CdWZmZXIucHJvdG90eXBlLnRvTW9ubz1mdW5jdGlvbihlKXtpZih0LmlzTnVtYmVyKGUpKXRoaXMuZnJvbUFycmF5KHRoaXMudG9BcnJheShlKSk7ZWxzZXtmb3IodmFyIGk9bmV3IEZsb2F0MzJBcnJheSh0aGlzLmxlbmd0aCksbj10aGlzLm51bWJlck9mQ2hhbm5lbHMsbz0wO288bjtvKyspZm9yKHZhciBzPXRoaXMudG9BcnJheShvKSxyPTA7cjxzLmxlbmd0aDtyKyspaVtyXSs9c1tyXTtpPWkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0L259KSx0aGlzLmZyb21BcnJheShpKX1yZXR1cm4gdGhpc30sdC5CdWZmZXIucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oZSl7aWYodC5pc051bWJlcihlKSlyZXR1cm4gdGhpcy5nZXRDaGFubmVsRGF0YShlKTtpZigxPT09dGhpcy5udW1iZXJPZkNoYW5uZWxzKXJldHVybiB0aGlzLnRvQXJyYXkoMCk7Zm9yKHZhciBpPVtdLG49MDtuPHRoaXMubnVtYmVyT2ZDaGFubmVscztuKyspaVtuXT10aGlzLmdldENoYW5uZWxEYXRhKG4pO3JldHVybiBpfSx0LkJ1ZmZlci5wcm90b3R5cGUuZ2V0Q2hhbm5lbERhdGE9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2J1ZmZlci5nZXRDaGFubmVsRGF0YSh0KX0sdC5CdWZmZXIucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKGUsaSl7aT10LmRlZmF1bHRBcmcoaSx0aGlzLmR1cmF0aW9uKTtmb3IodmFyIG49TWF0aC5mbG9vcih0aGlzLmNvbnRleHQuc2FtcGxlUmF0ZSp0aGlzLnRvU2Vjb25kcyhlKSksbz1NYXRoLmZsb29yKHRoaXMuY29udGV4dC5zYW1wbGVSYXRlKnRoaXMudG9TZWNvbmRzKGkpKSxzPVtdLHI9MDtyPHRoaXMubnVtYmVyT2ZDaGFubmVscztyKyspc1tyXT10aGlzLnRvQXJyYXkocikuc2xpY2UobixvKTtyZXR1cm4obmV3IHQuQnVmZmVyKS5mcm9tQXJyYXkocyl9LHQuQnVmZmVyLnByb3RvdHlwZS5fcmV2ZXJzZT1mdW5jdGlvbigpe2lmKHRoaXMubG9hZGVkKWZvcih2YXIgdD0wO3Q8dGhpcy5udW1iZXJPZkNoYW5uZWxzO3QrKylBcnJheS5wcm90b3R5cGUucmV2ZXJzZS5jYWxsKHRoaXMuZ2V0Q2hhbm5lbERhdGEodCkpO3JldHVybiB0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5CdWZmZXIucHJvdG90eXBlLFwicmV2ZXJzZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmV2ZXJzZWR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9yZXZlcnNlZCE9PXQmJih0aGlzLl9yZXZlcnNlZD10LHRoaXMuX3JldmVyc2UoKSl9fSksdC5FbWl0dGVyLm1peGluKHQuQnVmZmVyKSx0LkJ1ZmZlci5fZG93bmxvYWRRdWV1ZT1bXSx0LkJ1ZmZlci5iYXNlVXJsPVwiXCIsdC5CdWZmZXIuZnJvbUFycmF5PWZ1bmN0aW9uKGUpe3JldHVybihuZXcgdC5CdWZmZXIpLmZyb21BcnJheShlKX0sdC5CdWZmZXIuZnJvbVVybD1mdW5jdGlvbihlKXt2YXIgaT1uZXcgdC5CdWZmZXI7cmV0dXJuIGkubG9hZChlKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGl9KX0sdC5CdWZmZXIuX3JlbW92ZUZyb21Eb3dubG9hZFF1ZXVlPWZ1bmN0aW9uKGUpe3ZhciBpPXQuQnVmZmVyLl9kb3dubG9hZFF1ZXVlLmluZGV4T2YoZSk7LTEhPT1pJiZ0LkJ1ZmZlci5fZG93bmxvYWRRdWV1ZS5zcGxpY2UoaSwxKX0sdC5CdWZmZXIubG9hZD1mdW5jdGlvbihlLGksbil7aT10LmRlZmF1bHRBcmcoaSx0Lm5vT3ApO3ZhciBvPWUubWF0Y2goL1xcWyguK1xcfD8pK1xcXSQvKTtpZihvKXtmb3IodmFyIHM9b1sxXS5zcGxpdChcInxcIikscj1zWzBdLGE9MDthPHMubGVuZ3RoO2ErKylpZih0LkJ1ZmZlci5zdXBwb3J0c1R5cGUoc1thXSkpe3I9c1thXTticmVha31lPWUucmVwbGFjZShvWzBdLHIpfWZ1bmN0aW9uIGwoZSl7aWYodC5CdWZmZXIuX3JlbW92ZUZyb21Eb3dubG9hZFF1ZXVlKHUpLHQuQnVmZmVyLmVtaXQoXCJlcnJvclwiLGUpLCFuKXRocm93IGU7bihlKX1mdW5jdGlvbiBoKCl7Zm9yKHZhciBlPTAsaT0wO2k8dC5CdWZmZXIuX2Rvd25sb2FkUXVldWUubGVuZ3RoO2krKyllKz10LkJ1ZmZlci5fZG93bmxvYWRRdWV1ZVtpXS5wcm9ncmVzczt0LkJ1ZmZlci5lbWl0KFwicHJvZ3Jlc3NcIixlL3QuQnVmZmVyLl9kb3dubG9hZFF1ZXVlLmxlbmd0aCl9dmFyIHU9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiB1Lm9wZW4oXCJHRVRcIix0LkJ1ZmZlci5iYXNlVXJsK2UsITApLHUucmVzcG9uc2VUeXBlPVwiYXJyYXlidWZmZXJcIix1LnByb2dyZXNzPTAsdC5CdWZmZXIuX2Rvd25sb2FkUXVldWUucHVzaCh1KSx1LmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsZnVuY3Rpb24oKXsyMDA9PT11LnN0YXR1cz90LmNvbnRleHQuZGVjb2RlQXVkaW9EYXRhKHUucmVzcG9uc2UpLnRoZW4oZnVuY3Rpb24oZSl7dS5wcm9ncmVzcz0xLGgoKSxpKGUpLHQuQnVmZmVyLl9yZW1vdmVGcm9tRG93bmxvYWRRdWV1ZSh1KSwwPT09dC5CdWZmZXIuX2Rvd25sb2FkUXVldWUubGVuZ3RoJiZ0LkJ1ZmZlci5lbWl0KFwibG9hZFwiKX0pLmNhdGNoKGZ1bmN0aW9uKCl7dC5CdWZmZXIuX3JlbW92ZUZyb21Eb3dubG9hZFF1ZXVlKHUpLGwoXCJUb25lLkJ1ZmZlcjogY291bGQgbm90IGRlY29kZSBhdWRpbyBkYXRhOiBcIitlKX0pOmwoXCJUb25lLkJ1ZmZlcjogY291bGQgbm90IGxvY2F0ZSBmaWxlOiBcIitlKX0pLHUuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsbCksdS5hZGRFdmVudExpc3RlbmVyKFwicHJvZ3Jlc3NcIixmdW5jdGlvbih0KXt0Lmxlbmd0aENvbXB1dGFibGUmJih1LnByb2dyZXNzPXQubG9hZGVkL3QudG90YWwqLjk1LGgoKSl9KSx1LnNlbmQoKSx1fSx0LkJ1ZmZlci5jYW5jZWxEb3dubG9hZHM9ZnVuY3Rpb24oKXtyZXR1cm4gdC5CdWZmZXIuX2Rvd25sb2FkUXVldWUuc2xpY2UoKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuQnVmZmVyLl9yZW1vdmVGcm9tRG93bmxvYWRRdWV1ZShlKSxlLmFib3J0KCl9KSx0LkJ1ZmZlcn0sdC5CdWZmZXIuc3VwcG9ydHNUeXBlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc3BsaXQoXCIuXCIpO3JldHVybiBlPWVbZS5sZW5ndGgtMV0sXCJcIiE9PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhdWRpb1wiKS5jYW5QbGF5VHlwZShcImF1ZGlvL1wiK2UpfSx0LmxvYWRlZD1mdW5jdGlvbigpe3ZhciBlLGk7ZnVuY3Rpb24gbigpe3QuQnVmZmVyLm9mZihcImxvYWRcIixlKSx0LkJ1ZmZlci5vZmYoXCJlcnJvclwiLGkpfXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuLG8pe2U9ZnVuY3Rpb24oKXtuKCl9LGk9ZnVuY3Rpb24oKXtvKCl9LHQuQnVmZmVyLm9uKFwibG9hZFwiLGUpLHQuQnVmZmVyLm9uKFwiZXJyb3JcIixpKX0pLnRoZW4obikuY2F0Y2goZnVuY3Rpb24odCl7dGhyb3cgbigpLG5ldyBFcnJvcih0KX0pfSx0LkJ1ZmZlcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxNyksaSgyNiksaSgyKSxpKDEpLGkoMjIpLGkoNCksaSgyOCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkxGTz1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcImZyZXF1ZW5jeVwiLFwibWluXCIsXCJtYXhcIl0sdC5MRk8pO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5fb3NjaWxsYXRvcj1uZXcgdC5Pc2NpbGxhdG9yKHtmcmVxdWVuY3k6ZS5mcmVxdWVuY3ksdHlwZTplLnR5cGV9KSx0aGlzLmZyZXF1ZW5jeT10aGlzLl9vc2NpbGxhdG9yLmZyZXF1ZW5jeSx0aGlzLmFtcGxpdHVkZT10aGlzLl9vc2NpbGxhdG9yLnZvbHVtZSx0aGlzLmFtcGxpdHVkZS51bml0cz10LlR5cGUuTm9ybWFsUmFuZ2UsdGhpcy5hbXBsaXR1ZGUudmFsdWU9ZS5hbXBsaXR1ZGUsdGhpcy5fc3RvcHBlZFNpZ25hbD1uZXcgdC5TaWduYWwoMCx0LlR5cGUuQXVkaW9SYW5nZSksdGhpcy5femVyb3M9bmV3IHQuWmVybyx0aGlzLl9zdG9wcGVkVmFsdWU9MCx0aGlzLl9hMmc9bmV3IHQuQXVkaW9Ub0dhaW4sdGhpcy5fc2NhbGVyPXRoaXMub3V0cHV0PW5ldyB0LlNjYWxlKGUubWluLGUubWF4KSx0aGlzLl91bml0cz10LlR5cGUuRGVmYXVsdCx0aGlzLnVuaXRzPWUudW5pdHMsdGhpcy5fb3NjaWxsYXRvci5jaGFpbih0aGlzLl9hMmcsdGhpcy5fc2NhbGVyKSx0aGlzLl96ZXJvcy5jb25uZWN0KHRoaXMuX2EyZyksdGhpcy5fc3RvcHBlZFNpZ25hbC5jb25uZWN0KHRoaXMuX2EyZyksdGhpcy5fcmVhZE9ubHkoW1wiYW1wbGl0dWRlXCIsXCJmcmVxdWVuY3lcIl0pLHRoaXMucGhhc2U9ZS5waGFzZX0sdC5leHRlbmQodC5MRk8sdC5BdWRpb05vZGUpLHQuTEZPLmRlZmF1bHRzPXt0eXBlOlwic2luZVwiLG1pbjowLG1heDoxLHBoYXNlOjAsZnJlcXVlbmN5OlwiNG5cIixhbXBsaXR1ZGU6MSx1bml0czp0LlR5cGUuRGVmYXVsdH0sdC5MRk8ucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0PXRoaXMudG9TZWNvbmRzKHQpLHRoaXMuX3N0b3BwZWRTaWduYWwuc2V0VmFsdWVBdFRpbWUoMCx0KSx0aGlzLl9vc2NpbGxhdG9yLnN0YXJ0KHQpLHRoaXN9LHQuTEZPLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKHQpe3JldHVybiB0PXRoaXMudG9TZWNvbmRzKHQpLHRoaXMuX3N0b3BwZWRTaWduYWwuc2V0VmFsdWVBdFRpbWUodGhpcy5fc3RvcHBlZFZhbHVlLHQpLHRoaXMuX29zY2lsbGF0b3Iuc3RvcCh0KSx0aGlzfSx0LkxGTy5wcm90b3R5cGUuc3luYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9vc2NpbGxhdG9yLnN5bmMoKSx0aGlzLl9vc2NpbGxhdG9yLnN5bmNGcmVxdWVuY3koKSx0aGlzfSx0LkxGTy5wcm90b3R5cGUudW5zeW5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29zY2lsbGF0b3IudW5zeW5jKCksdGhpcy5fb3NjaWxsYXRvci51bnN5bmNGcmVxdWVuY3koKSx0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5MRk8ucHJvdG90eXBlLFwibWluXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90b1VuaXRzKHRoaXMuX3NjYWxlci5taW4pfSxzZXQ6ZnVuY3Rpb24odCl7dD10aGlzLl9mcm9tVW5pdHModCksdGhpcy5fc2NhbGVyLm1pbj10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkxGTy5wcm90b3R5cGUsXCJtYXhcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RvVW5pdHModGhpcy5fc2NhbGVyLm1heCl9LHNldDpmdW5jdGlvbih0KXt0PXRoaXMuX2Zyb21Vbml0cyh0KSx0aGlzLl9zY2FsZXIubWF4PXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuTEZPLnByb3RvdHlwZSxcInR5cGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29zY2lsbGF0b3IudHlwZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX29zY2lsbGF0b3IudHlwZT10LHRoaXMuX3N0b3BwZWRWYWx1ZT10aGlzLl9vc2NpbGxhdG9yLl9nZXRJbml0aWFsVmFsdWUoKSx0aGlzLl9zdG9wcGVkU2lnbmFsLnZhbHVlPXRoaXMuX3N0b3BwZWRWYWx1ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5MRk8ucHJvdG90eXBlLFwicGhhc2VcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29zY2lsbGF0b3IucGhhc2V9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9vc2NpbGxhdG9yLnBoYXNlPXQsdGhpcy5fc3RvcHBlZFZhbHVlPXRoaXMuX29zY2lsbGF0b3IuX2dldEluaXRpYWxWYWx1ZSgpLHRoaXMuX3N0b3BwZWRTaWduYWwudmFsdWU9dGhpcy5fc3RvcHBlZFZhbHVlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkxGTy5wcm90b3R5cGUsXCJ1bml0c1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdW5pdHN9LHNldDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm1pbixpPXRoaXMubWF4O3RoaXMuX3VuaXRzPXQsdGhpcy5taW49ZSx0aGlzLm1heD1pfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkxGTy5wcm90b3R5cGUsXCJtdXRlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vc2NpbGxhdG9yLm11dGV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9vc2NpbGxhdG9yLm11dGU9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5MRk8ucHJvdG90eXBlLFwic3RhdGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29zY2lsbGF0b3Iuc3RhdGV9fSksdC5MRk8ucHJvdG90eXBlLmNvbm5lY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29uc3RydWN0b3IhPT10LlNpZ25hbCYmZS5jb25zdHJ1Y3RvciE9PXQuUGFyYW18fCh0aGlzLmNvbnZlcnQ9ZS5jb252ZXJ0LHRoaXMudW5pdHM9ZS51bml0cyksdC5TaWduYWxCYXNlLnByb3RvdHlwZS5jb25uZWN0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzfSx0LkxGTy5wcm90b3R5cGUuX2Zyb21Vbml0cz10LlBhcmFtLnByb3RvdHlwZS5fZnJvbVVuaXRzLHQuTEZPLnByb3RvdHlwZS5fdG9Vbml0cz10LlBhcmFtLnByb3RvdHlwZS5fdG9Vbml0cyx0LkxGTy5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcImFtcGxpdHVkZVwiLFwiZnJlcXVlbmN5XCJdKSx0aGlzLl9vc2NpbGxhdG9yLmRpc3Bvc2UoKSx0aGlzLl9vc2NpbGxhdG9yPW51bGwsdGhpcy5fc3RvcHBlZFNpZ25hbC5kaXNwb3NlKCksdGhpcy5fc3RvcHBlZFNpZ25hbD1udWxsLHRoaXMuX3plcm9zLmRpc3Bvc2UoKSx0aGlzLl96ZXJvcz1udWxsLHRoaXMuX3NjYWxlci5kaXNwb3NlKCksdGhpcy5fc2NhbGVyPW51bGwsdGhpcy5fYTJnLmRpc3Bvc2UoKSx0aGlzLl9hMmc9bnVsbCx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXMuYW1wbGl0dWRlPW51bGwsdGhpc30sdC5MRk99LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMjkpLGkoOTQpLGkoMSksaSgzKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuU3VidHJhY3Q9ZnVuY3Rpb24oZSl7dC5TaWduYWwuY2FsbCh0aGlzKSx0aGlzLmNyZWF0ZUluc091dHMoMiwwKSx0aGlzLl9zdW09dGhpcy5pbnB1dFswXT10aGlzLm91dHB1dD1uZXcgdC5HYWluLHRoaXMuX25lZz1uZXcgdC5OZWdhdGUsdGhpcy5fcGFyYW09dGhpcy5pbnB1dFsxXT1uZXcgdC5TaWduYWwoZSksdGhpcy5fcGFyYW0uY2hhaW4odGhpcy5fbmVnLHRoaXMuX3N1bSksdGhpcy5wcm94eT0hMX0sdC5leHRlbmQodC5TdWJ0cmFjdCx0LlNpZ25hbCksdC5TdWJ0cmFjdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LlNpZ25hbC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX25lZy5kaXNwb3NlKCksdGhpcy5fbmVnPW51bGwsdGhpcy5fc3VtLmRpc2Nvbm5lY3QoKSx0aGlzLl9zdW09bnVsbCx0aGlzfSx0LlN1YnRyYWN0fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDQpLGkoMiksaSgyNCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlBhcmFtPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wicGFyYW1cIixcInVuaXRzXCIsXCJjb252ZXJ0XCJdLHQuUGFyYW0pO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyxlKSx0aGlzLl9wYXJhbT10aGlzLmlucHV0PWUucGFyYW0sdGhpcy51bml0cz1lLnVuaXRzLHRoaXMuY29udmVydD1lLmNvbnZlcnQsdGhpcy5vdmVycmlkZGVuPSExLHRoaXMuX2V2ZW50cz1uZXcgdC5UaW1lbGluZSgxZTMpLHQuaXNEZWZpbmVkKGUudmFsdWUpJiZ0aGlzLl9wYXJhbSYmdGhpcy5zZXRWYWx1ZUF0VGltZShlLnZhbHVlLDApfSx0LmV4dGVuZCh0LlBhcmFtLHQuQXVkaW9Ob2RlKSx0LlBhcmFtLmRlZmF1bHRzPXt1bml0czp0LlR5cGUuRGVmYXVsdCxjb252ZXJ0OiEwLHBhcmFtOnZvaWQgMH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGFyYW0ucHJvdG90eXBlLFwidmFsdWVcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ub3coKTtyZXR1cm4gdGhpcy5fdG9Vbml0cyh0aGlzLmdldFZhbHVlQXRUaW1lKHQpKX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2luaXRpYWxWYWx1ZT10aGlzLl9mcm9tVW5pdHModCksdGhpcy5jYW5jZWxTY2hlZHVsZWRWYWx1ZXModGhpcy5ub3coKSksdGhpcy5zZXRWYWx1ZUF0VGltZSh0LHRoaXMubm93KCkpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlBhcmFtLnByb3RvdHlwZSxcIm1pblZhbHVlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVuaXRzPT09dC5UeXBlLlRpbWV8fHRoaXMudW5pdHM9PT10LlR5cGUuRnJlcXVlbmN5fHx0aGlzLnVuaXRzPT09dC5UeXBlLk5vcm1hbFJhbmdlfHx0aGlzLnVuaXRzPT09dC5UeXBlLlBvc2l0aXZlfHx0aGlzLnVuaXRzPT09dC5UeXBlLkJQTT8wOnRoaXMudW5pdHM9PT10LlR5cGUuQXVkaW9SYW5nZT8tMTp0aGlzLnVuaXRzPT09dC5UeXBlLkRlY2liZWxzPy0xLzA6dGhpcy5fcGFyYW0ubWluVmFsdWV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGFyYW0ucHJvdG90eXBlLFwibWF4VmFsdWVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pdHM9PT10LlR5cGUuTm9ybWFsUmFuZ2V8fHRoaXMudW5pdHM9PT10LlR5cGUuQXVkaW9SYW5nZT8xOnRoaXMuX3BhcmFtLm1heFZhbHVlfX0pLHQuUGFyYW0ucHJvdG90eXBlLl9mcm9tVW5pdHM9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuY29udmVydCYmIXQuaXNVbmRlZih0aGlzLmNvbnZlcnQpfHx0aGlzLm92ZXJyaWRkZW4pcmV0dXJuIGU7c3dpdGNoKHRoaXMudW5pdHMpe2Nhc2UgdC5UeXBlLlRpbWU6cmV0dXJuIHRoaXMudG9TZWNvbmRzKGUpO2Nhc2UgdC5UeXBlLkZyZXF1ZW5jeTpyZXR1cm4gdGhpcy50b0ZyZXF1ZW5jeShlKTtjYXNlIHQuVHlwZS5EZWNpYmVsczpyZXR1cm4gdC5kYlRvR2FpbihlKTtjYXNlIHQuVHlwZS5Ob3JtYWxSYW5nZTpyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoZSwwKSwxKTtjYXNlIHQuVHlwZS5BdWRpb1JhbmdlOnJldHVybiBNYXRoLm1pbihNYXRoLm1heChlLC0xKSwxKTtjYXNlIHQuVHlwZS5Qb3NpdGl2ZTpyZXR1cm4gTWF0aC5tYXgoZSwwKTtkZWZhdWx0OnJldHVybiBlfX0sdC5QYXJhbS5wcm90b3R5cGUuX3RvVW5pdHM9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuY29udmVydCYmIXQuaXNVbmRlZih0aGlzLmNvbnZlcnQpKXJldHVybiBlO3N3aXRjaCh0aGlzLnVuaXRzKXtjYXNlIHQuVHlwZS5EZWNpYmVsczpyZXR1cm4gdC5nYWluVG9EYihlKTtkZWZhdWx0OnJldHVybiBlfX0sdC5QYXJhbS5wcm90b3R5cGUuX21pbk91dHB1dD0xZS01LHQuUGFyYW0uQXV0b21hdGlvblR5cGU9e0xpbmVhcjpcImxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lXCIsRXhwb25lbnRpYWw6XCJleHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lXCIsVGFyZ2V0Olwic2V0VGFyZ2V0QXRUaW1lXCIsU2V0VmFsdWU6XCJzZXRWYWx1ZUF0VGltZVwiLENhbmNlbDpcImNhbmNlbFNjaGVkdWxlZFZhbHVlc1wifSx0LlBhcmFtLnByb3RvdHlwZS5zZXRWYWx1ZUF0VGltZT1mdW5jdGlvbihlLGkpe3JldHVybiBpPXRoaXMudG9TZWNvbmRzKGkpLGU9dGhpcy5fZnJvbVVuaXRzKGUpLHRoaXMuX2V2ZW50cy5hZGQoe3R5cGU6dC5QYXJhbS5BdXRvbWF0aW9uVHlwZS5TZXRWYWx1ZSx2YWx1ZTplLHRpbWU6aX0pLHRoaXMubG9nKHQuUGFyYW0uQXV0b21hdGlvblR5cGUuU2V0VmFsdWUsZSxpKSx0aGlzLl9wYXJhbS5zZXRWYWx1ZUF0VGltZShlLGkpLHRoaXN9LHQuUGFyYW0ucHJvdG90eXBlLmdldFZhbHVlQXRUaW1lPWZ1bmN0aW9uKGUpe2U9dGhpcy50b1NlY29uZHMoZSk7dmFyIGk9dGhpcy5fZXZlbnRzLmdldEFmdGVyKGUpLG49dGhpcy5fZXZlbnRzLmdldChlKSxvPXQuZGVmYXVsdEFyZyh0aGlzLl9pbml0aWFsVmFsdWUsdGhpcy5fcGFyYW0uZGVmYXVsdFZhbHVlKSxzPW87aWYobnVsbD09PW4pcz1vO2Vsc2UgaWYobi50eXBlPT09dC5QYXJhbS5BdXRvbWF0aW9uVHlwZS5UYXJnZXQpe3ZhciByLGE9dGhpcy5fZXZlbnRzLmdldEJlZm9yZShuLnRpbWUpO3I9bnVsbD09PWE/bzphLnZhbHVlLHM9dGhpcy5fZXhwb25lbnRpYWxBcHByb2FjaChuLnRpbWUscixuLnZhbHVlLG4uY29uc3RhbnQsZSl9ZWxzZSBzPW51bGw9PT1pP24udmFsdWU6aS50eXBlPT09dC5QYXJhbS5BdXRvbWF0aW9uVHlwZS5MaW5lYXI/dGhpcy5fbGluZWFySW50ZXJwb2xhdGUobi50aW1lLG4udmFsdWUsaS50aW1lLGkudmFsdWUsZSk6aS50eXBlPT09dC5QYXJhbS5BdXRvbWF0aW9uVHlwZS5FeHBvbmVudGlhbD90aGlzLl9leHBvbmVudGlhbEludGVycG9sYXRlKG4udGltZSxuLnZhbHVlLGkudGltZSxpLnZhbHVlLGUpOm4udmFsdWU7cmV0dXJuIHN9LHQuUGFyYW0ucHJvdG90eXBlLnNldFJhbXBQb2ludD1mdW5jdGlvbih0KXt0PXRoaXMudG9TZWNvbmRzKHQpO3ZhciBlPXRoaXMuZ2V0VmFsdWVBdFRpbWUodCk7cmV0dXJuIHRoaXMuY2FuY2VsQW5kSG9sZEF0VGltZSh0KSwwPT09ZSYmKGU9dGhpcy5fbWluT3V0cHV0KSx0aGlzLnNldFZhbHVlQXRUaW1lKHRoaXMuX3RvVW5pdHMoZSksdCksdGhpc30sdC5QYXJhbS5wcm90b3R5cGUubGluZWFyUmFtcFRvVmFsdWVBdFRpbWU9ZnVuY3Rpb24oZSxpKXtyZXR1cm4gZT10aGlzLl9mcm9tVW5pdHMoZSksaT10aGlzLnRvU2Vjb25kcyhpKSx0aGlzLl9ldmVudHMuYWRkKHt0eXBlOnQuUGFyYW0uQXV0b21hdGlvblR5cGUuTGluZWFyLHZhbHVlOmUsdGltZTppfSksdGhpcy5sb2codC5QYXJhbS5BdXRvbWF0aW9uVHlwZS5MaW5lYXIsZSxpKSx0aGlzLl9wYXJhbS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShlLGkpLHRoaXN9LHQuUGFyYW0ucHJvdG90eXBlLmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWU9ZnVuY3Rpb24oZSxpKXtyZXR1cm4gZT10aGlzLl9mcm9tVW5pdHMoZSksZT1NYXRoLm1heCh0aGlzLl9taW5PdXRwdXQsZSksaT10aGlzLnRvU2Vjb25kcyhpKSx0aGlzLl9ldmVudHMuYWRkKHt0eXBlOnQuUGFyYW0uQXV0b21hdGlvblR5cGUuRXhwb25lbnRpYWwsdGltZTppLHZhbHVlOmV9KSx0aGlzLmxvZyh0LlBhcmFtLkF1dG9tYXRpb25UeXBlLkV4cG9uZW50aWFsLGUsaSksdGhpcy5fcGFyYW0uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZShlLGkpLHRoaXN9LHQuUGFyYW0ucHJvdG90eXBlLmV4cG9uZW50aWFsUmFtcFRvPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gaT10aGlzLnRvU2Vjb25kcyhpKSx0aGlzLnNldFJhbXBQb2ludChpKSx0aGlzLmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUodCxpK3RoaXMudG9TZWNvbmRzKGUpKSx0aGlzfSx0LlBhcmFtLnByb3RvdHlwZS5saW5lYXJSYW1wVG89ZnVuY3Rpb24odCxlLGkpe3JldHVybiBpPXRoaXMudG9TZWNvbmRzKGkpLHRoaXMuc2V0UmFtcFBvaW50KGkpLHRoaXMubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUodCxpK3RoaXMudG9TZWNvbmRzKGUpKSx0aGlzfSx0LlBhcmFtLnByb3RvdHlwZS50YXJnZXRSYW1wVG89ZnVuY3Rpb24odCxlLGkpe3JldHVybiBpPXRoaXMudG9TZWNvbmRzKGkpLHRoaXMuc2V0UmFtcFBvaW50KGkpLHRoaXMuZXhwb25lbnRpYWxBcHByb2FjaFZhbHVlQXRUaW1lKHQsaSxlKSx0aGlzfSx0LlBhcmFtLnByb3RvdHlwZS5leHBvbmVudGlhbEFwcHJvYWNoVmFsdWVBdFRpbWU9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPU1hdGgubG9nKHRoaXMudG9TZWNvbmRzKGkpKzEpL01hdGgubG9nKDIwMCk7cmV0dXJuIGU9dGhpcy50b1NlY29uZHMoZSksdGhpcy5zZXRUYXJnZXRBdFRpbWUodCxlLG4pfSx0LlBhcmFtLnByb3RvdHlwZS5zZXRUYXJnZXRBdFRpbWU9ZnVuY3Rpb24oZSxpLG4pe2lmKGU9dGhpcy5fZnJvbVVuaXRzKGUpLG48PTApdGhyb3cgbmV3IEVycm9yKFwidGltZUNvbnN0YW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDBcIik7cmV0dXJuIGk9dGhpcy50b1NlY29uZHMoaSksdGhpcy5fZXZlbnRzLmFkZCh7dHlwZTp0LlBhcmFtLkF1dG9tYXRpb25UeXBlLlRhcmdldCx2YWx1ZTplLHRpbWU6aSxjb25zdGFudDpufSksdGhpcy5sb2codC5QYXJhbS5BdXRvbWF0aW9uVHlwZS5UYXJnZXQsZSxpLG4pLHRoaXMuX3BhcmFtLnNldFRhcmdldEF0VGltZShlLGksbiksdGhpc30sdC5QYXJhbS5wcm90b3R5cGUuc2V0VmFsdWVDdXJ2ZUF0VGltZT1mdW5jdGlvbihlLGksbixvKXtvPXQuZGVmYXVsdEFyZyhvLDEpLG49dGhpcy50b1NlY29uZHMobiksaT10aGlzLnRvU2Vjb25kcyhpKSx0aGlzLnNldFZhbHVlQXRUaW1lKGVbMF0qbyxpKTtmb3IodmFyIHM9bi8oZS5sZW5ndGgtMSkscj0xO3I8ZS5sZW5ndGg7cisrKXRoaXMubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoZVtyXSpvLGkrcipzKTtyZXR1cm4gdGhpc30sdC5QYXJhbS5wcm90b3R5cGUuY2FuY2VsU2NoZWR1bGVkVmFsdWVzPWZ1bmN0aW9uKGUpe3JldHVybiBlPXRoaXMudG9TZWNvbmRzKGUpLHRoaXMuX2V2ZW50cy5jYW5jZWwoZSksdGhpcy5fcGFyYW0uY2FuY2VsU2NoZWR1bGVkVmFsdWVzKGUpLHRoaXMubG9nKHQuUGFyYW0uQXV0b21hdGlvblR5cGUuQ2FuY2VsLGUpLHRoaXN9LHQuUGFyYW0ucHJvdG90eXBlLmNhbmNlbEFuZEhvbGRBdFRpbWU9ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5nZXRWYWx1ZUF0VGltZShlKTt0aGlzLmxvZyhcImNhbmNlbEFuZEhvbGRBdFRpbWVcIixlLFwidmFsdWU9XCIraSksdGhpcy5fcGFyYW0uY2FuY2VsU2NoZWR1bGVkVmFsdWVzKGUpO3ZhciBuPXRoaXMuX2V2ZW50cy5nZXQoZSksbz10aGlzLl9ldmVudHMuZ2V0QWZ0ZXIoZSk7cmV0dXJuIG4mJm4udGltZT09PWU/bz90aGlzLl9ldmVudHMuY2FuY2VsKG8udGltZSk6dGhpcy5fZXZlbnRzLmNhbmNlbChlK3RoaXMuc2FtcGxlVGltZSk6byYmKHRoaXMuX2V2ZW50cy5jYW5jZWwoby50aW1lKSxvLnR5cGU9PT10LlBhcmFtLkF1dG9tYXRpb25UeXBlLkxpbmVhcj90aGlzLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGksZSk6by50eXBlPT09dC5QYXJhbS5BdXRvbWF0aW9uVHlwZS5FeHBvbmVudGlhbCYmdGhpcy5leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lKGksZSkpLHRoaXMuX2V2ZW50cy5hZGQoe3R5cGU6dC5QYXJhbS5BdXRvbWF0aW9uVHlwZS5TZXRWYWx1ZSx2YWx1ZTppLHRpbWU6ZX0pLHRoaXMuX3BhcmFtLnNldFZhbHVlQXRUaW1lKGksZSksdGhpc30sdC5QYXJhbS5wcm90b3R5cGUucmFtcFRvPWZ1bmN0aW9uKGUsaSxuKXtyZXR1cm4gaT10LmRlZmF1bHRBcmcoaSwuMSksdGhpcy51bml0cz09PXQuVHlwZS5GcmVxdWVuY3l8fHRoaXMudW5pdHM9PT10LlR5cGUuQlBNfHx0aGlzLnVuaXRzPT09dC5UeXBlLkRlY2liZWxzP3RoaXMuZXhwb25lbnRpYWxSYW1wVG8oZSxpLG4pOnRoaXMubGluZWFyUmFtcFRvKGUsaSxuKSx0aGlzfSx0LlBhcmFtLnByb3RvdHlwZS5fZXhwb25lbnRpYWxBcHByb2FjaD1mdW5jdGlvbih0LGUsaSxuLG8pe3JldHVybiBpKyhlLWkpKk1hdGguZXhwKC0oby10KS9uKX0sdC5QYXJhbS5wcm90b3R5cGUuX2xpbmVhckludGVycG9sYXRlPWZ1bmN0aW9uKHQsZSxpLG4sbyl7cmV0dXJuIGUrKG8tdCkvKGktdCkqKG4tZSl9LHQuUGFyYW0ucHJvdG90eXBlLl9leHBvbmVudGlhbEludGVycG9sYXRlPWZ1bmN0aW9uKHQsZSxpLG4sbyl7cmV0dXJuIGUqTWF0aC5wb3cobi9lLChvLXQpLyhpLXQpKX0sdC5QYXJhbS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3BhcmFtPW51bGwsdGhpcy5fZXZlbnRzPW51bGwsdGhpc30sdC5QYXJhbX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg4KSxpKDE5KSxpKDEwKSxpKDIzKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuU3RlcmVvRWZmZWN0PWZ1bmN0aW9uKCl7dC5BdWRpb05vZGUuY2FsbCh0aGlzKTt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJ3ZXRcIl0sdC5FZmZlY3QpO3RoaXMuY3JlYXRlSW5zT3V0cygxLDEpLHRoaXMuX2RyeVdldD1uZXcgdC5Dcm9zc0ZhZGUoZS53ZXQpLHRoaXMud2V0PXRoaXMuX2RyeVdldC5mYWRlLHRoaXMuX3NwbGl0PW5ldyB0LlNwbGl0LHRoaXMuZWZmZWN0U2VuZEw9dGhpcy5fc3BsaXQubGVmdCx0aGlzLmVmZmVjdFNlbmRSPXRoaXMuX3NwbGl0LnJpZ2h0LHRoaXMuX21lcmdlPW5ldyB0Lk1lcmdlLHRoaXMuZWZmZWN0UmV0dXJuTD10aGlzLl9tZXJnZS5sZWZ0LHRoaXMuZWZmZWN0UmV0dXJuUj10aGlzLl9tZXJnZS5yaWdodCx0aGlzLmlucHV0LmNvbm5lY3QodGhpcy5fc3BsaXQpLHRoaXMuaW5wdXQuY29ubmVjdCh0aGlzLl9kcnlXZXQsMCwwKSx0aGlzLl9tZXJnZS5jb25uZWN0KHRoaXMuX2RyeVdldCwwLDEpLHRoaXMuX2RyeVdldC5jb25uZWN0KHRoaXMub3V0cHV0KSx0aGlzLl9yZWFkT25seShbXCJ3ZXRcIl0pfSx0LmV4dGVuZCh0LlN0ZXJlb0VmZmVjdCx0LkVmZmVjdCksdC5TdGVyZW9FZmZlY3QucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9kcnlXZXQuZGlzcG9zZSgpLHRoaXMuX2RyeVdldD1udWxsLHRoaXMuX3NwbGl0LmRpc3Bvc2UoKSx0aGlzLl9zcGxpdD1udWxsLHRoaXMuX21lcmdlLmRpc3Bvc2UoKSx0aGlzLl9tZXJnZT1udWxsLHRoaXMuZWZmZWN0U2VuZEw9bnVsbCx0aGlzLmVmZmVjdFNlbmRSPW51bGwsdGhpcy5lZmZlY3RSZXR1cm5MPW51bGwsdGhpcy5lZmZlY3RSZXR1cm5SPW51bGwsdGhpcy5fd3JpdGFibGUoW1wid2V0XCJdKSx0aGlzLndldD1udWxsLHRoaXN9LHQuU3RlcmVvRWZmZWN0fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDg2KSxpKDQpLGkoMjQpLGkoMzUpLGkoMyksaSg4NCksaSg4MyksaSg1NSldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3QuVHJhbnNwb3J0PWZ1bmN0aW9uKCl7dC5FbWl0dGVyLmNhbGwodGhpcyksdC5nZXRDb250ZXh0KGZ1bmN0aW9uKCl7dGhpcy5sb29wPSExLHRoaXMuX2xvb3BTdGFydD0wLHRoaXMuX2xvb3BFbmQ9MCx0aGlzLl9wcHE9ZS5kZWZhdWx0cy5QUFEsdGhpcy5fY2xvY2s9bmV3IHQuQ2xvY2soe2NhbGxiYWNrOnRoaXMuX3Byb2Nlc3NUaWNrLmJpbmQodGhpcyksZnJlcXVlbmN5OjB9KSx0aGlzLl9iaW5kQ2xvY2tFdmVudHMoKSx0aGlzLmJwbT10aGlzLl9jbG9jay5mcmVxdWVuY3ksdGhpcy5icG0uX3RvVW5pdHM9dGhpcy5fdG9Vbml0cy5iaW5kKHRoaXMpLHRoaXMuYnBtLl9mcm9tVW5pdHM9dGhpcy5fZnJvbVVuaXRzLmJpbmQodGhpcyksdGhpcy5icG0udW5pdHM9dC5UeXBlLkJQTSx0aGlzLmJwbS52YWx1ZT1lLmRlZmF1bHRzLmJwbSx0aGlzLl9yZWFkT25seShcImJwbVwiKSx0aGlzLl90aW1lU2lnbmF0dXJlPWUuZGVmYXVsdHMudGltZVNpZ25hdHVyZSx0aGlzLl9zY2hlZHVsZWRFdmVudHM9e30sdGhpcy5fdGltZWxpbmU9bmV3IHQuVGltZWxpbmUsdGhpcy5fcmVwZWF0ZWRFdmVudHM9bmV3IHQuSW50ZXJ2YWxUaW1lbGluZSx0aGlzLl9zeW5jZWRTaWduYWxzPVtdLHRoaXMuX3N3aW5nVGlja3M9ZS5kZWZhdWx0cy5QUFEvMix0aGlzLl9zd2luZ0Ftb3VudD0wLHRoaXMuY29udGV4dC50cmFuc3BvcnQ9dGhpc30uYmluZCh0aGlzKSl9LHQuZXh0ZW5kKHQuVHJhbnNwb3J0LHQuRW1pdHRlciksdC5UcmFuc3BvcnQuZGVmYXVsdHM9e2JwbToxMjAsc3dpbmc6MCxzd2luZ1N1YmRpdmlzaW9uOlwiOG5cIix0aW1lU2lnbmF0dXJlOjQsbG9vcFN0YXJ0OjAsbG9vcEVuZDpcIjRtXCIsUFBROjE5Mn0sdC5UcmFuc3BvcnQucHJvdG90eXBlLmlzVHJhbnNwb3J0PSEwLHQuVHJhbnNwb3J0LnByb3RvdHlwZS5fcHJvY2Vzc1RpY2s9ZnVuY3Rpb24oZSxpKXtpZih0aGlzLl9zd2luZ0Ftb3VudD4wJiZpJXRoaXMuX3BwcSE9MCYmaSUoMip0aGlzLl9zd2luZ1RpY2tzKSE9MCl7dmFyIG49aSUoMip0aGlzLl9zd2luZ1RpY2tzKS8oMip0aGlzLl9zd2luZ1RpY2tzKSxvPU1hdGguc2luKG4qTWF0aC5QSSkqdGhpcy5fc3dpbmdBbW91bnQ7ZSs9dC5UaWNrcygyKnRoaXMuX3N3aW5nVGlja3MvMykudG9TZWNvbmRzKCkqb310aGlzLmxvb3AmJmk+PXRoaXMuX2xvb3BFbmQmJih0aGlzLmVtaXQoXCJsb29wRW5kXCIsZSksdGhpcy5fY2xvY2suc2V0VGlja3NBdFRpbWUodGhpcy5fbG9vcFN0YXJ0LGUpLGk9dGhpcy5fbG9vcFN0YXJ0LHRoaXMuZW1pdChcImxvb3BTdGFydFwiLGUsdGhpcy5fY2xvY2suZ2V0U2Vjb25kc0F0VGltZShlKSksdGhpcy5lbWl0KFwibG9vcFwiLGUpKSx0aGlzLl90aW1lbGluZS5mb3JFYWNoQXRUaW1lKGksZnVuY3Rpb24odCl7dC5pbnZva2UoZSl9KX0sdC5UcmFuc3BvcnQucHJvdG90eXBlLnNjaGVkdWxlPWZ1bmN0aW9uKGUsaSl7dmFyIG49bmV3IHQuVHJhbnNwb3J0RXZlbnQodGhpcyx7dGltZTp0LlRyYW5zcG9ydFRpbWUoaSksY2FsbGJhY2s6ZX0pO3JldHVybiB0aGlzLl9hZGRFdmVudChuLHRoaXMuX3RpbWVsaW5lKX0sdC5UcmFuc3BvcnQucHJvdG90eXBlLnNjaGVkdWxlUmVwZWF0PWZ1bmN0aW9uKGUsaSxuLG8pe3ZhciBzPW5ldyB0LlRyYW5zcG9ydFJlcGVhdEV2ZW50KHRoaXMse2NhbGxiYWNrOmUsaW50ZXJ2YWw6dC5UaW1lKGkpLHRpbWU6dC5UcmFuc3BvcnRUaW1lKG4pLGR1cmF0aW9uOnQuVGltZSh0LmRlZmF1bHRBcmcobywxLzApKX0pO3JldHVybiB0aGlzLl9hZGRFdmVudChzLHRoaXMuX3JlcGVhdGVkRXZlbnRzKX0sdC5UcmFuc3BvcnQucHJvdG90eXBlLnNjaGVkdWxlT25jZT1mdW5jdGlvbihlLGkpe3ZhciBuPW5ldyB0LlRyYW5zcG9ydEV2ZW50KHRoaXMse3RpbWU6dC5UcmFuc3BvcnRUaW1lKGkpLGNhbGxiYWNrOmUsb25jZTohMH0pO3JldHVybiB0aGlzLl9hZGRFdmVudChuLHRoaXMuX3RpbWVsaW5lKX0sdC5UcmFuc3BvcnQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX3NjaGVkdWxlZEV2ZW50cy5oYXNPd25Qcm9wZXJ0eSh0KSl7dmFyIGU9dGhpcy5fc2NoZWR1bGVkRXZlbnRzW3QudG9TdHJpbmcoKV07ZS50aW1lbGluZS5yZW1vdmUoZS5ldmVudCksZS5ldmVudC5kaXNwb3NlKCksZGVsZXRlIHRoaXMuX3NjaGVkdWxlZEV2ZW50c1t0LnRvU3RyaW5nKCldfXJldHVybiB0aGlzfSx0LlRyYW5zcG9ydC5wcm90b3R5cGUuX2FkZEV2ZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3NjaGVkdWxlZEV2ZW50c1t0LmlkLnRvU3RyaW5nKCldPXtldmVudDp0LHRpbWVsaW5lOmV9LGUuYWRkKHQpLHQuaWR9LHQuVHJhbnNwb3J0LnByb3RvdHlwZS5jYW5jZWw9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dC5kZWZhdWx0QXJnKGUsMCksZT10aGlzLnRvVGlja3MoZSksdGhpcy5fdGltZWxpbmUuZm9yRWFjaEZyb20oZSxmdW5jdGlvbih0KXt0aGlzLmNsZWFyKHQuaWQpfS5iaW5kKHRoaXMpKSx0aGlzLl9yZXBlYXRlZEV2ZW50cy5mb3JFYWNoRnJvbShlLGZ1bmN0aW9uKHQpe3RoaXMuY2xlYXIodC5pZCl9LmJpbmQodGhpcykpLHRoaXN9LHQuVHJhbnNwb3J0LnByb3RvdHlwZS5fYmluZENsb2NrRXZlbnRzPWZ1bmN0aW9uKCl7dGhpcy5fY2xvY2sub24oXCJzdGFydFwiLGZ1bmN0aW9uKGUsaSl7aT10LlRpY2tzKGkpLnRvU2Vjb25kcygpLHRoaXMuZW1pdChcInN0YXJ0XCIsZSxpKX0uYmluZCh0aGlzKSksdGhpcy5fY2xvY2sub24oXCJzdG9wXCIsZnVuY3Rpb24odCl7dGhpcy5lbWl0KFwic3RvcFwiLHQpfS5iaW5kKHRoaXMpKSx0aGlzLl9jbG9jay5vbihcInBhdXNlXCIsZnVuY3Rpb24odCl7dGhpcy5lbWl0KFwicGF1c2VcIix0KX0uYmluZCh0aGlzKSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRyYW5zcG9ydC5wcm90b3R5cGUsXCJzdGF0ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2xvY2suZ2V0U3RhdGVBdFRpbWUodGhpcy5ub3coKSl9fSksdC5UcmFuc3BvcnQucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKGUsaSl7cmV0dXJuIHQuaXNEZWZpbmVkKGkpJiYoaT10aGlzLnRvVGlja3MoaSkpLHRoaXMuX2Nsb2NrLnN0YXJ0KGUsaSksdGhpc30sdC5UcmFuc3BvcnQucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2Nsb2NrLnN0b3AodCksdGhpc30sdC5UcmFuc3BvcnQucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jbG9jay5wYXVzZSh0KSx0aGlzfSx0LlRyYW5zcG9ydC5wcm90b3R5cGUudG9nZ2xlPWZ1bmN0aW9uKGUpe3JldHVybiBlPXRoaXMudG9TZWNvbmRzKGUpLHRoaXMuX2Nsb2NrLmdldFN0YXRlQXRUaW1lKGUpIT09dC5TdGF0ZS5TdGFydGVkP3RoaXMuc3RhcnQoZSk6dGhpcy5zdG9wKGUpLHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRyYW5zcG9ydC5wcm90b3R5cGUsXCJ0aW1lU2lnbmF0dXJlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90aW1lU2lnbmF0dXJlfSxzZXQ6ZnVuY3Rpb24oZSl7dC5pc0FycmF5KGUpJiYoZT1lWzBdL2VbMV0qNCksdGhpcy5fdGltZVNpZ25hdHVyZT1lfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRyYW5zcG9ydC5wcm90b3R5cGUsXCJsb29wU3RhcnRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHQuVGlja3ModGhpcy5fbG9vcFN0YXJ0KS50b1NlY29uZHMoKX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2xvb3BTdGFydD10aGlzLnRvVGlja3ModCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuVHJhbnNwb3J0LnByb3RvdHlwZSxcImxvb3BFbmRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHQuVGlja3ModGhpcy5fbG9vcEVuZCkudG9TZWNvbmRzKCl9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9sb29wRW5kPXRoaXMudG9UaWNrcyh0KX19KSx0LlRyYW5zcG9ydC5wcm90b3R5cGUuc2V0TG9vcFBvaW50cz1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmxvb3BTdGFydD10LHRoaXMubG9vcEVuZD1lLHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRyYW5zcG9ydC5wcm90b3R5cGUsXCJzd2luZ1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3dpbmdBbW91bnR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9zd2luZ0Ftb3VudD10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRyYW5zcG9ydC5wcm90b3R5cGUsXCJzd2luZ1N1YmRpdmlzaW9uXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0LlRpY2tzKHRoaXMuX3N3aW5nVGlja3MpLnRvTm90YXRpb24oKX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3N3aW5nVGlja3M9dGhpcy50b1RpY2tzKHQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRyYW5zcG9ydC5wcm90b3R5cGUsXCJwb3NpdGlvblwiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm5vdygpLGk9dGhpcy5fY2xvY2suZ2V0VGlja3NBdFRpbWUoZSk7cmV0dXJuIHQuVGlja3MoaSkudG9CYXJzQmVhdHNTaXh0ZWVudGhzKCl9LHNldDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnRvVGlja3ModCk7dGhpcy50aWNrcz1lfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRyYW5zcG9ydC5wcm90b3R5cGUsXCJzZWNvbmRzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jbG9jay5zZWNvbmRzfSxzZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ub3coKSxpPXRoaXMuYnBtLnRpbWVUb1RpY2tzKHQsZSk7dGhpcy50aWNrcz1pfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRyYW5zcG9ydC5wcm90b3R5cGUsXCJwcm9ncmVzc1wiLHtnZXQ6ZnVuY3Rpb24oKXtpZih0aGlzLmxvb3Ape3ZhciB0PXRoaXMubm93KCk7cmV0dXJuKHRoaXMuX2Nsb2NrLmdldFRpY2tzQXRUaW1lKHQpLXRoaXMuX2xvb3BTdGFydCkvKHRoaXMuX2xvb3BFbmQtdGhpcy5fbG9vcFN0YXJ0KX1yZXR1cm4gMH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5UcmFuc3BvcnQucHJvdG90eXBlLFwidGlja3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Nsb2NrLnRpY2tzfSxzZXQ6ZnVuY3Rpb24oZSl7aWYodGhpcy5fY2xvY2sudGlja3MhPT1lKXt2YXIgaT10aGlzLm5vdygpO3RoaXMuc3RhdGU9PT10LlN0YXRlLlN0YXJ0ZWQ/KHRoaXMuZW1pdChcInN0b3BcIixpKSx0aGlzLl9jbG9jay5zZXRUaWNrc0F0VGltZShlLGkpLHRoaXMuZW1pdChcInN0YXJ0XCIsaSx0aGlzLnNlY29uZHMpKTp0aGlzLl9jbG9jay5zZXRUaWNrc0F0VGltZShlLGkpfX19KSx0LlRyYW5zcG9ydC5wcm90b3R5cGUuZ2V0VGlja3NBdFRpbWU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodGhpcy5fY2xvY2suZ2V0VGlja3NBdFRpbWUodCkpfSx0LlRyYW5zcG9ydC5wcm90b3R5cGUuZ2V0U2Vjb25kc0F0VGltZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY2xvY2suZ2V0U2Vjb25kc0F0VGltZSh0KX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuVHJhbnNwb3J0LnByb3RvdHlwZSxcIlBQUVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHBxfSxzZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5icG0udmFsdWU7dGhpcy5fcHBxPXQsdGhpcy5icG0udmFsdWU9ZX19KSx0LlRyYW5zcG9ydC5wcm90b3R5cGUuX2Zyb21Vbml0cz1mdW5jdGlvbih0KXtyZXR1cm4gMS8oNjAvdC90aGlzLlBQUSl9LHQuVHJhbnNwb3J0LnByb3RvdHlwZS5fdG9Vbml0cz1mdW5jdGlvbih0KXtyZXR1cm4gdC90aGlzLlBQUSo2MH0sdC5UcmFuc3BvcnQucHJvdG90eXBlLm5leHRTdWJkaXZpc2lvbj1mdW5jdGlvbihlKXtpZihlPXRoaXMudG9UaWNrcyhlKSx0aGlzLnN0YXRlIT09dC5TdGF0ZS5TdGFydGVkKXJldHVybiAwO3ZhciBpPXRoaXMubm93KCksbj1lLXRoaXMuZ2V0VGlja3NBdFRpbWUoaSklZTtyZXR1cm4gdGhpcy5fY2xvY2submV4dFRpY2tUaW1lKG4saSl9LHQuVHJhbnNwb3J0LnByb3RvdHlwZS5zeW5jU2lnbmFsPWZ1bmN0aW9uKGUsaSl7aWYoIWkpe3ZhciBuPXRoaXMubm93KCk7aT0wIT09ZS5nZXRWYWx1ZUF0VGltZShuKT9lLmdldFZhbHVlQXRUaW1lKG4pL3RoaXMuYnBtLmdldFZhbHVlQXRUaW1lKG4pOjB9dmFyIG89bmV3IHQuR2FpbihpKTtyZXR1cm4gdGhpcy5icG0uY2hhaW4obyxlLl9wYXJhbSksdGhpcy5fc3luY2VkU2lnbmFscy5wdXNoKHtyYXRpbzpvLHNpZ25hbDplLGluaXRpYWw6ZS52YWx1ZX0pLGUudmFsdWU9MCx0aGlzfSx0LlRyYW5zcG9ydC5wcm90b3R5cGUudW5zeW5jU2lnbmFsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9zeW5jZWRTaWduYWxzLmxlbmd0aC0xO2U+PTA7ZS0tKXt2YXIgaT10aGlzLl9zeW5jZWRTaWduYWxzW2VdO2kuc2lnbmFsPT09dCYmKGkucmF0aW8uZGlzcG9zZSgpLGkuc2lnbmFsLnZhbHVlPWkuaW5pdGlhbCx0aGlzLl9zeW5jZWRTaWduYWxzLnNwbGljZShlLDEpKX1yZXR1cm4gdGhpc30sdC5UcmFuc3BvcnQucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5FbWl0dGVyLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fY2xvY2suZGlzcG9zZSgpLHRoaXMuX2Nsb2NrPW51bGwsdGhpcy5fd3JpdGFibGUoXCJicG1cIiksdGhpcy5icG09bnVsbCx0aGlzLl90aW1lbGluZS5kaXNwb3NlKCksdGhpcy5fdGltZWxpbmU9bnVsbCx0aGlzLl9yZXBlYXRlZEV2ZW50cy5kaXNwb3NlKCksdGhpcy5fcmVwZWF0ZWRFdmVudHM9bnVsbCx0aGlzfTt2YXIgZT10LlRyYW5zcG9ydDtyZXR1cm4gdC5UcmFuc3BvcnQ9bmV3IGUsdC5Db250ZXh0Lm9uKFwiaW5pdFwiLGZ1bmN0aW9uKGkpe2kudHJhbnNwb3J0JiZpLnRyYW5zcG9ydC5pc1RyYW5zcG9ydD90LlRyYW5zcG9ydD1pLnRyYW5zcG9ydDp0LlRyYW5zcG9ydD1uZXcgZX0pLHQuQ29udGV4dC5vbihcImNsb3NlXCIsZnVuY3Rpb24odCl7dC50cmFuc3BvcnQmJnQudHJhbnNwb3J0LmlzVHJhbnNwb3J0JiZ0LnRyYW5zcG9ydC5kaXNwb3NlKCl9KSx0LlRyYW5zcG9ydH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxKSxpKDYpLGkoMTYpLGkoODIpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5Pc2NpbGxhdG9yPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiZnJlcXVlbmN5XCIsXCJ0eXBlXCJdLHQuT3NjaWxsYXRvcik7dC5Tb3VyY2UuY2FsbCh0aGlzLGUpLHRoaXMuX29zY2lsbGF0b3I9bnVsbCx0aGlzLmZyZXF1ZW5jeT1uZXcgdC5TaWduYWwoZS5mcmVxdWVuY3ksdC5UeXBlLkZyZXF1ZW5jeSksdGhpcy5kZXR1bmU9bmV3IHQuU2lnbmFsKGUuZGV0dW5lLHQuVHlwZS5DZW50cyksdGhpcy5fd2F2ZT1udWxsLHRoaXMuX3BhcnRpYWxzPWUucGFydGlhbHMsdGhpcy5fcGFydGlhbENvdW50PWUucGFydGlhbENvdW50LHRoaXMuX3BoYXNlPWUucGhhc2UsdGhpcy5fdHlwZT1lLnR5cGUsZS5wYXJ0aWFsQ291bnQmJmUudHlwZSE9PXQuT3NjaWxsYXRvci5UeXBlLkN1c3RvbSYmKHRoaXMuX3R5cGU9dGhpcy5iYXNlVHlwZStlLnBhcnRpYWxDb3VudC50b1N0cmluZygpKSx0aGlzLnBoYXNlPXRoaXMuX3BoYXNlLHRoaXMuX3JlYWRPbmx5KFtcImZyZXF1ZW5jeVwiLFwiZGV0dW5lXCJdKX0sdC5leHRlbmQodC5Pc2NpbGxhdG9yLHQuU291cmNlKSx0Lk9zY2lsbGF0b3IuZGVmYXVsdHM9e3R5cGU6XCJzaW5lXCIsZnJlcXVlbmN5OjQ0MCxkZXR1bmU6MCxwaGFzZTowLHBhcnRpYWxzOltdLHBhcnRpYWxDb3VudDowfSx0Lk9zY2lsbGF0b3IuVHlwZT17U2luZTpcInNpbmVcIixUcmlhbmdsZTpcInRyaWFuZ2xlXCIsU2F3dG9vdGg6XCJzYXd0b290aFwiLFNxdWFyZTpcInNxdWFyZVwiLEN1c3RvbTpcImN1c3RvbVwifSx0Lk9zY2lsbGF0b3IucHJvdG90eXBlLl9zdGFydD1mdW5jdGlvbihlKXt0aGlzLmxvZyhcInN0YXJ0XCIsZSksdGhpcy5fb3NjaWxsYXRvcj1uZXcgdC5Pc2NpbGxhdG9yTm9kZSx0aGlzLl93YXZlP3RoaXMuX29zY2lsbGF0b3Iuc2V0UGVyaW9kaWNXYXZlKHRoaXMuX3dhdmUpOnRoaXMuX29zY2lsbGF0b3IudHlwZT10aGlzLl90eXBlLHRoaXMuX29zY2lsbGF0b3IuY29ubmVjdCh0aGlzLm91dHB1dCksdGhpcy5mcmVxdWVuY3kuY29ubmVjdCh0aGlzLl9vc2NpbGxhdG9yLmZyZXF1ZW5jeSksdGhpcy5kZXR1bmUuY29ubmVjdCh0aGlzLl9vc2NpbGxhdG9yLmRldHVuZSksZT10aGlzLnRvU2Vjb25kcyhlKSx0aGlzLl9vc2NpbGxhdG9yLnN0YXJ0KGUpfSx0Lk9zY2lsbGF0b3IucHJvdG90eXBlLl9zdG9wPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxvZyhcInN0b3BcIix0KSx0aGlzLl9vc2NpbGxhdG9yJiYodD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl9vc2NpbGxhdG9yLnN0b3AodCkpLHRoaXN9LHQuT3NjaWxsYXRvci5wcm90b3R5cGUucmVzdGFydD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fb3NjaWxsYXRvciYmdGhpcy5fb3NjaWxsYXRvci5jYW5jZWxTdG9wKCksdGhpcy5fc3RhdGUuY2FuY2VsKHRoaXMudG9TZWNvbmRzKHQpKSx0aGlzfSx0Lk9zY2lsbGF0b3IucHJvdG90eXBlLnN5bmNGcmVxdWVuY3k9ZnVuY3Rpb24oKXtyZXR1cm4gdC5UcmFuc3BvcnQuc3luY1NpZ25hbCh0aGlzLmZyZXF1ZW5jeSksdGhpc30sdC5Pc2NpbGxhdG9yLnByb3RvdHlwZS51bnN5bmNGcmVxdWVuY3k9ZnVuY3Rpb24oKXtyZXR1cm4gdC5UcmFuc3BvcnQudW5zeW5jU2lnbmFsKHRoaXMuZnJlcXVlbmN5KSx0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5Pc2NpbGxhdG9yLnByb3RvdHlwZSxcInR5cGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3R5cGV9LHNldDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9nZXRSZWFsSW1hZ2luYXJ5KHQsdGhpcy5fcGhhc2UpLGk9dGhpcy5jb250ZXh0LmNyZWF0ZVBlcmlvZGljV2F2ZShlWzBdLGVbMV0pO3RoaXMuX3dhdmU9aSxudWxsIT09dGhpcy5fb3NjaWxsYXRvciYmdGhpcy5fb3NjaWxsYXRvci5zZXRQZXJpb2RpY1dhdmUodGhpcy5fd2F2ZSksdGhpcy5fdHlwZT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk9zY2lsbGF0b3IucHJvdG90eXBlLFwiYmFzZVR5cGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3R5cGUucmVwbGFjZSh0aGlzLnBhcnRpYWxDb3VudCxcIlwiKX0sc2V0OmZ1bmN0aW9uKGUpe3RoaXMucGFydGlhbENvdW50JiZ0aGlzLl90eXBlIT09dC5Pc2NpbGxhdG9yLlR5cGUuQ3VzdG9tJiZlIT09dC5Pc2NpbGxhdG9yLlR5cGUuQ3VzdG9tP3RoaXMudHlwZT1lK3RoaXMucGFydGlhbENvdW50OnRoaXMudHlwZT1lfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk9zY2lsbGF0b3IucHJvdG90eXBlLFwicGFydGlhbENvdW50XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYXJ0aWFsQ291bnR9LHNldDpmdW5jdGlvbihlKXt2YXIgaT10aGlzLl90eXBlLG49L14oc2luZXx0cmlhbmdsZXxzcXVhcmV8c2F3dG9vdGgpKFxcZCspJC8uZXhlYyh0aGlzLl90eXBlKTtuJiYoaT1uWzFdKSx0aGlzLl90eXBlIT09dC5Pc2NpbGxhdG9yLlR5cGUuQ3VzdG9tJiYodGhpcy50eXBlPTA9PT1lP2k6aStlLnRvU3RyaW5nKCkpfX0pLHQuT3NjaWxsYXRvci5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKCl7Y29uc3QgZT10LnByb3RvdHlwZS5nZXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBlLnR5cGUhPT10Lk9zY2lsbGF0b3IuVHlwZS5DdXN0b20mJmRlbGV0ZSBlLnBhcnRpYWxzLGV9LHQuT3NjaWxsYXRvci5wcm90b3R5cGUuX2dldFJlYWxJbWFnaW5hcnk9ZnVuY3Rpb24oZSxpKXt2YXIgbj0yMDQ4LG89bmV3IEZsb2F0MzJBcnJheShuKSxzPW5ldyBGbG9hdDMyQXJyYXkobikscj0xO2lmKGU9PT10Lk9zY2lsbGF0b3IuVHlwZS5DdXN0b20pcj10aGlzLl9wYXJ0aWFscy5sZW5ndGgrMSx0aGlzLl9wYXJ0aWFsQ291bnQ9dGhpcy5fcGFydGlhbHMubGVuZ3RoLG49cjtlbHNle3ZhciBhPS9eKHNpbmV8dHJpYW5nbGV8c3F1YXJlfHNhd3Rvb3RoKShcXGQrKSQvLmV4ZWMoZSk7YT8ocj1wYXJzZUludChhWzJdKSsxLHRoaXMuX3BhcnRpYWxDb3VudD1wYXJzZUludChhWzJdKSxlPWFbMV0sbj1yPU1hdGgubWF4KHIsMikpOnRoaXMuX3BhcnRpYWxDb3VudD0wLHRoaXMuX3BhcnRpYWxzPVtdfWZvcih2YXIgbD0xO2w8bjsrK2wpe3ZhciBoLHU9Mi8obCpNYXRoLlBJKTtzd2l0Y2goZSl7Y2FzZSB0Lk9zY2lsbGF0b3IuVHlwZS5TaW5lOmg9bDw9cj8xOjAsdGhpcy5fcGFydGlhbHNbbC0xXT1oO2JyZWFrO2Nhc2UgdC5Pc2NpbGxhdG9yLlR5cGUuU3F1YXJlOmg9MSZsPzIqdTowLHRoaXMuX3BhcnRpYWxzW2wtMV09aDticmVhaztjYXNlIHQuT3NjaWxsYXRvci5UeXBlLlNhd3Rvb3RoOmg9dSooMSZsPzE6LTEpLHRoaXMuX3BhcnRpYWxzW2wtMV09aDticmVhaztjYXNlIHQuT3NjaWxsYXRvci5UeXBlLlRyaWFuZ2xlOmg9MSZsP3UqdSoyKihsLTE+PjEmMT8tMToxKTowLHRoaXMuX3BhcnRpYWxzW2wtMV09aDticmVhaztjYXNlIHQuT3NjaWxsYXRvci5UeXBlLkN1c3RvbTpoPXRoaXMuX3BhcnRpYWxzW2wtMV07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKFwiVG9uZS5Pc2NpbGxhdG9yOiBpbnZhbGlkIHR5cGU6IFwiK2UpfTAhPT1oPyhvW2xdPS1oKk1hdGguc2luKGkqbCksc1tsXT1oKk1hdGguY29zKGkqbCkpOihvW2xdPTAsc1tsXT0wKX1yZXR1cm5bbyxzXX0sdC5Pc2NpbGxhdG9yLnByb3RvdHlwZS5faW52ZXJzZUZGVD1mdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBuPTAsbz10Lmxlbmd0aCxzPTA7czxvO3MrKyluKz10W3NdKk1hdGguY29zKHMqaSkrZVtzXSpNYXRoLnNpbihzKmkpO3JldHVybiBufSx0Lk9zY2lsbGF0b3IucHJvdG90eXBlLl9nZXRJbml0aWFsVmFsdWU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ2V0UmVhbEltYWdpbmFyeSh0aGlzLl90eXBlLDApLGU9dFswXSxpPXRbMV0sbj0wLG89MipNYXRoLlBJLHM9MDtzPDg7cysrKW49TWF0aC5tYXgodGhpcy5faW52ZXJzZUZGVChlLGkscy84Km8pLG4pO3JldHVybi10aGlzLl9pbnZlcnNlRkZUKGUsaSx0aGlzLl9waGFzZSkvbn0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuT3NjaWxsYXRvci5wcm90b3R5cGUsXCJwYXJ0aWFsc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFydGlhbHN9LHNldDpmdW5jdGlvbihlKXt0aGlzLl9wYXJ0aWFscz1lLHRoaXMudHlwZT10Lk9zY2lsbGF0b3IuVHlwZS5DdXN0b219fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuT3NjaWxsYXRvci5wcm90b3R5cGUsXCJwaGFzZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGhhc2UqKDE4MC9NYXRoLlBJKX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3BoYXNlPXQqTWF0aC5QSS8xODAsdGhpcy50eXBlPXRoaXMuX3R5cGV9fSksdC5Pc2NpbGxhdG9yLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU291cmNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksbnVsbCE9PXRoaXMuX29zY2lsbGF0b3ImJih0aGlzLl9vc2NpbGxhdG9yLmRpc3Bvc2UoKSx0aGlzLl9vc2NpbGxhdG9yPW51bGwpLHRoaXMuX3dhdmU9bnVsbCx0aGlzLl93cml0YWJsZShbXCJmcmVxdWVuY3lcIixcImRldHVuZVwiXSksdGhpcy5mcmVxdWVuY3kuZGlzcG9zZSgpLHRoaXMuZnJlcXVlbmN5PW51bGwsdGhpcy5kZXR1bmUuZGlzcG9zZSgpLHRoaXMuZGV0dW5lPW51bGwsdGhpcy5fcGFydGlhbHM9bnVsbCx0aGlzfSx0Lk9zY2lsbGF0b3J9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMTQpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkRlbGF5PWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiZGVsYXlUaW1lXCIsXCJtYXhEZWxheVwiXSx0LkRlbGF5KTt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMsZSksdGhpcy5fbWF4RGVsYXk9TWF0aC5tYXgodGhpcy50b1NlY29uZHMoZS5tYXhEZWxheSksdGhpcy50b1NlY29uZHMoZS5kZWxheVRpbWUpKSx0aGlzLl9kZWxheU5vZGU9dGhpcy5pbnB1dD10aGlzLm91dHB1dD10aGlzLmNvbnRleHQuY3JlYXRlRGVsYXkodGhpcy5fbWF4RGVsYXkpLHRoaXMuZGVsYXlUaW1lPW5ldyB0LlBhcmFtKHtwYXJhbTp0aGlzLl9kZWxheU5vZGUuZGVsYXlUaW1lLHVuaXRzOnQuVHlwZS5UaW1lLHZhbHVlOmUuZGVsYXlUaW1lfSksdGhpcy5fcmVhZE9ubHkoXCJkZWxheVRpbWVcIil9LHQuZXh0ZW5kKHQuRGVsYXksdC5BdWRpb05vZGUpLHQuRGVsYXkuZGVmYXVsdHM9e21heERlbGF5OjEsZGVsYXlUaW1lOjB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkRlbGF5LnByb3RvdHlwZSxcIm1heERlbGF5XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhEZWxheX19KSx0LkRlbGF5LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fZGVsYXlOb2RlLmRpc2Nvbm5lY3QoKSx0aGlzLl9kZWxheU5vZGU9bnVsbCx0aGlzLl93cml0YWJsZShcImRlbGF5VGltZVwiKSx0aGlzLmRlbGF5VGltZT1udWxsLHRoaXN9LHQuRGVsYXl9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMyksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuU3BsaXQ9ZnVuY3Rpb24oKXt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLHRoaXMuY3JlYXRlSW5zT3V0cygwLDIpLHRoaXMuX3NwbGl0dGVyPXRoaXMuaW5wdXQ9dGhpcy5jb250ZXh0LmNyZWF0ZUNoYW5uZWxTcGxpdHRlcigyKSx0aGlzLmxlZnQ9dGhpcy5vdXRwdXRbMF09bmV3IHQuR2Fpbix0aGlzLnJpZ2h0PXRoaXMub3V0cHV0WzFdPW5ldyB0LkdhaW4sdGhpcy5fc3BsaXR0ZXIuY29ubmVjdCh0aGlzLmxlZnQsMCwwKSx0aGlzLl9zcGxpdHRlci5jb25uZWN0KHRoaXMucmlnaHQsMSwwKX0sdC5leHRlbmQodC5TcGxpdCx0LkF1ZGlvTm9kZSksdC5TcGxpdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3NwbGl0dGVyLmRpc2Nvbm5lY3QoKSx0aGlzLmxlZnQuZGlzcG9zZSgpLHRoaXMubGVmdD1udWxsLHRoaXMucmlnaHQuZGlzcG9zZSgpLHRoaXMucmlnaHQ9bnVsbCx0aGlzLl9zcGxpdHRlcj1udWxsLHRoaXN9LHQuU3BsaXR9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMzUpLGkoMjQpLGkoMzQpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXt0LkNvbnRleHQ9ZnVuY3Rpb24oKXt0LkVtaXR0ZXIuY2FsbCh0aGlzKTt2YXIgaT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJjb250ZXh0XCJdLHQuQ29udGV4dCk7aWYoIWkuY29udGV4dCYmKGkuY29udGV4dD1uZXcgdC5nbG9iYWwuQXVkaW9Db250ZXh0LCFpLmNvbnRleHQpKXRocm93IG5ldyBFcnJvcihcImNvdWxkIG5vdCBjcmVhdGUgQXVkaW9Db250ZXh0LiBQb3NzaWJseSB0b28gbWFueSBBdWRpb0NvbnRleHRzIHJ1bm5pbmcgYWxyZWFkeS5cIik7Zm9yKHRoaXMuX2NvbnRleHQ9aS5jb250ZXh0O3RoaXMuX2NvbnRleHQucmF3Q29udGV4dDspdGhpcy5fY29udGV4dD10aGlzLl9jb250ZXh0LnJhd0NvbnRleHQ7Zm9yKHZhciBuIGluIHRoaXMuX2NvbnRleHQpdGhpcy5fZGVmaW5lUHJvcGVydHkodGhpcy5fY29udGV4dCxuKTt0aGlzLl9sYXRlbmN5SGludD1pLmxhdGVuY3lIaW50LHRoaXMuX2NvbnN0YW50cz17fSx0aGlzLmxvb2tBaGVhZD1pLmxvb2tBaGVhZCx0aGlzLl9jb21wdXRlZFVwZGF0ZUludGVydmFsPTAsdGhpcy5fdGlja2VyPW5ldyBlKHRoaXMuZW1pdC5iaW5kKHRoaXMsXCJ0aWNrXCIpLGkuY2xvY2tTb3VyY2UsaS51cGRhdGVJbnRlcnZhbCksdGhpcy5fdGltZW91dHM9bmV3IHQuVGltZWxpbmUsdGhpcy5fdGltZW91dElkcz0wLHRoaXMub24oXCJ0aWNrXCIsdGhpcy5fdGltZW91dExvb3AuYmluZCh0aGlzKSksdGhpcy5fY29udGV4dC5vbnN0YXRlY2hhbmdlPWZ1bmN0aW9uKHQpe3RoaXMuZW1pdChcInN0YXRlY2hhbmdlXCIsdCl9LmJpbmQodGhpcyl9LHQuZXh0ZW5kKHQuQ29udGV4dCx0LkVtaXR0ZXIpLHQuRW1pdHRlci5taXhpbih0LkNvbnRleHQpLHQuQ29udGV4dC5kZWZhdWx0cz17Y2xvY2tTb3VyY2U6XCJ3b3JrZXJcIixsYXRlbmN5SGludDpcImludGVyYWN0aXZlXCIsbG9va0FoZWFkOi4xLHVwZGF0ZUludGVydmFsOi4wM30sdC5Db250ZXh0LnByb3RvdHlwZS5pc0NvbnRleHQ9ITAsdC5Db250ZXh0LnByb3RvdHlwZS5fZGVmaW5lUHJvcGVydHk9ZnVuY3Rpb24oZSxpKXt0LmlzVW5kZWYodGhpc1tpXSkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGkse2dldDpmdW5jdGlvbigpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIGVbaV0/ZVtpXS5iaW5kKGUpOmVbaV19LHNldDpmdW5jdGlvbih0KXtlW2ldPXR9fSl9LHQuQ29udGV4dC5wcm90b3R5cGUubm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRleHQuY3VycmVudFRpbWUrdGhpcy5sb29rQWhlYWR9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkNvbnRleHQucHJvdG90eXBlLFwiZGVzdGluYXRpb25cIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFzdGVyP3RoaXMubWFzdGVyOnRoaXMuX2NvbnRleHQuZGVzdGluYXRpb259fSksdC5Db250ZXh0LnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm5cInN1c3BlbmRlZFwiPT09dGhpcy5fY29udGV4dC5zdGF0ZSYmdGhpcy5fY29udGV4dCBpbnN0YW5jZW9mIEF1ZGlvQ29udGV4dD90aGlzLl9jb250ZXh0LnJlc3VtZSgpOlByb21pc2UucmVzb2x2ZSgpfSx0LkNvbnRleHQucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dmFyIGU9UHJvbWlzZS5yZXNvbHZlKCk7cmV0dXJuIHRoaXMhPT10Lmdsb2JhbC5UT05FX0FVRElPX0NPTlRFWFQmJihlPXRoaXMucmF3Q29udGV4dC5jbG9zZSgpKSxlLnRoZW4oZnVuY3Rpb24oKXt0LkNvbnRleHQuZW1pdChcImNsb3NlXCIsdGhpcyl9LmJpbmQodGhpcykpfSx0LkNvbnRleHQucHJvdG90eXBlLmdldENvbnN0YW50PWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2NvbnN0YW50c1t0XSlyZXR1cm4gdGhpcy5fY29uc3RhbnRzW3RdO2Zvcih2YXIgZT10aGlzLl9jb250ZXh0LmNyZWF0ZUJ1ZmZlcigxLDEyOCx0aGlzLl9jb250ZXh0LnNhbXBsZVJhdGUpLGk9ZS5nZXRDaGFubmVsRGF0YSgwKSxuPTA7bjxpLmxlbmd0aDtuKyspaVtuXT10O3ZhciBvPXRoaXMuX2NvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7cmV0dXJuIG8uY2hhbm5lbENvdW50PTEsby5jaGFubmVsQ291bnRNb2RlPVwiZXhwbGljaXRcIixvLmJ1ZmZlcj1lLG8ubG9vcD0hMCxvLnN0YXJ0KDApLHRoaXMuX2NvbnN0YW50c1t0XT1vLG99LHQuQ29udGV4dC5wcm90b3R5cGUuX3RpbWVvdXRMb29wPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMubm93KCk7dGhpcy5fdGltZW91dHMmJnRoaXMuX3RpbWVvdXRzLmxlbmd0aCYmdGhpcy5fdGltZW91dHMucGVlaygpLnRpbWU8PXQ7KXRoaXMuX3RpbWVvdXRzLnNoaWZ0KCkuY2FsbGJhY2soKX0sdC5Db250ZXh0LnByb3RvdHlwZS5zZXRUaW1lb3V0PWZ1bmN0aW9uKHQsZSl7dGhpcy5fdGltZW91dElkcysrO3ZhciBpPXRoaXMubm93KCk7cmV0dXJuIHRoaXMuX3RpbWVvdXRzLmFkZCh7Y2FsbGJhY2s6dCx0aW1lOmkrZSxpZDp0aGlzLl90aW1lb3V0SWRzfSksdGhpcy5fdGltZW91dElkc30sdC5Db250ZXh0LnByb3RvdHlwZS5jbGVhclRpbWVvdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3RpbWVvdXRzLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5pZD09PXQmJnRoaXMucmVtb3ZlKGUpfSksdGhpc30sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQ29udGV4dC5wcm90b3R5cGUsXCJ1cGRhdGVJbnRlcnZhbFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGlja2VyLnVwZGF0ZUludGVydmFsfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fdGlja2VyLnVwZGF0ZUludGVydmFsPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQ29udGV4dC5wcm90b3R5cGUsXCJyYXdDb250ZXh0XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb250ZXh0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkNvbnRleHQucHJvdG90eXBlLFwiY2xvY2tTb3VyY2VcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpY2tlci50eXBlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fdGlja2VyLnR5cGU9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5Db250ZXh0LnByb3RvdHlwZSxcImxhdGVuY3lIaW50XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYXRlbmN5SGludH0sc2V0OmZ1bmN0aW9uKGUpe3ZhciBpPWU7aWYodGhpcy5fbGF0ZW5jeUhpbnQ9ZSx0LmlzU3RyaW5nKGUpKXN3aXRjaChlKXtjYXNlXCJpbnRlcmFjdGl2ZVwiOmk9LjEsdGhpcy5fY29udGV4dC5sYXRlbmN5SGludD1lO2JyZWFrO2Nhc2VcInBsYXliYWNrXCI6aT0uOCx0aGlzLl9jb250ZXh0LmxhdGVuY3lIaW50PWU7YnJlYWs7Y2FzZVwiYmFsYW5jZWRcIjppPS4yNSx0aGlzLl9jb250ZXh0LmxhdGVuY3lIaW50PWU7YnJlYWs7Y2FzZVwiZmFzdGVzdFwiOnRoaXMuX2NvbnRleHQubGF0ZW5jeUhpbnQ9XCJpbnRlcmFjdGl2ZVwiLGk9LjAxfXRoaXMubG9va0FoZWFkPWksdGhpcy51cGRhdGVJbnRlcnZhbD1pLzN9fSksdC5Db250ZXh0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvc2UoKS50aGVuKGZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHQuRW1pdHRlci5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3RpY2tlci5kaXNwb3NlKCksdGhpcy5fdGlja2VyPW51bGwsdGhpcy5fdGltZW91dHMuZGlzcG9zZSgpLHRoaXMuX3RpbWVvdXRzPW51bGwsdGhpcy5fY29uc3RhbnRzKXRoaXMuX2NvbnN0YW50c1tlXS5kaXNjb25uZWN0KCk7dGhpcy5fY29uc3RhbnRzPW51bGx9LmJpbmQodGhpcykpfTt2YXIgZT1mdW5jdGlvbihlLGksbil7dGhpcy5fdHlwZT1pLHRoaXMuX3VwZGF0ZUludGVydmFsPW4sdGhpcy5fY2FsbGJhY2s9dC5kZWZhdWx0QXJnKGUsdC5ub09wKSx0aGlzLl9jcmVhdGVDbG9jaygpfTtpZihlLlR5cGU9e1dvcmtlcjpcIndvcmtlclwiLFRpbWVvdXQ6XCJ0aW1lb3V0XCIsT2ZmbGluZTpcIm9mZmxpbmVcIn0sZS5wcm90b3R5cGUuX2NyZWF0ZVdvcmtlcj1mdW5jdGlvbigpe3QuZ2xvYmFsLlVSTD10Lmdsb2JhbC5VUkx8fHQuZ2xvYmFsLndlYmtpdFVSTDt2YXIgZT1uZXcgQmxvYihbXCJ2YXIgdGltZW91dFRpbWUgPSBcIisoMWUzKnRoaXMuX3VwZGF0ZUludGVydmFsKS50b0ZpeGVkKDEpK1wiO3NlbGYub25tZXNzYWdlID0gZnVuY3Rpb24obXNnKXtcXHR0aW1lb3V0VGltZSA9IHBhcnNlSW50KG1zZy5kYXRhKTt9O2Z1bmN0aW9uIHRpY2soKXtcXHRzZXRUaW1lb3V0KHRpY2ssIHRpbWVvdXRUaW1lKTtcXHRzZWxmLnBvc3RNZXNzYWdlKCd0aWNrJyk7fXRpY2soKTtcIl0pLGk9VVJMLmNyZWF0ZU9iamVjdFVSTChlKSxuPW5ldyBXb3JrZXIoaSk7bi5vbm1lc3NhZ2U9dGhpcy5fY2FsbGJhY2suYmluZCh0aGlzKSx0aGlzLl93b3JrZXI9bn0sZS5wcm90b3R5cGUuX2NyZWF0ZVRpbWVvdXQ9ZnVuY3Rpb24oKXt0aGlzLl90aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLl9jcmVhdGVUaW1lb3V0KCksdGhpcy5fY2FsbGJhY2soKX0uYmluZCh0aGlzKSwxZTMqdGhpcy5fdXBkYXRlSW50ZXJ2YWwpfSxlLnByb3RvdHlwZS5fY3JlYXRlQ2xvY2s9ZnVuY3Rpb24oKXtpZih0aGlzLl90eXBlPT09ZS5UeXBlLldvcmtlcil0cnl7dGhpcy5fY3JlYXRlV29ya2VyKCl9Y2F0Y2godCl7dGhpcy5fdHlwZT1lLlR5cGUuVGltZW91dCx0aGlzLl9jcmVhdGVDbG9jaygpfWVsc2UgdGhpcy5fdHlwZT09PWUuVHlwZS5UaW1lb3V0JiZ0aGlzLl9jcmVhdGVUaW1lb3V0KCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcInVwZGF0ZUludGVydmFsXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl91cGRhdGVJbnRlcnZhbH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3VwZGF0ZUludGVydmFsPU1hdGgubWF4KHQsMTI4LzQ0MTAwKSx0aGlzLl90eXBlPT09ZS5UeXBlLldvcmtlciYmdGhpcy5fd29ya2VyLnBvc3RNZXNzYWdlKE1hdGgubWF4KDFlMyp0LDEpKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJ0eXBlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90eXBlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fZGlzcG9zZUNsb2NrKCksdGhpcy5fdHlwZT10LHRoaXMuX2NyZWF0ZUNsb2NrKCl9fSksZS5wcm90b3R5cGUuX2Rpc3Bvc2VDbG9jaz1mdW5jdGlvbigpe3RoaXMuX3RpbWVvdXQmJihjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCksdGhpcy5fdGltZW91dD1udWxsKSx0aGlzLl93b3JrZXImJih0aGlzLl93b3JrZXIudGVybWluYXRlKCksdGhpcy5fd29ya2VyLm9ubWVzc2FnZT1udWxsLHRoaXMuX3dvcmtlcj1udWxsKX0sZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuX2Rpc3Bvc2VDbG9jaygpLHRoaXMuX2NhbGxiYWNrPW51bGx9LHQuZ2V0Q29udGV4dChmdW5jdGlvbigpe3ZhciBlPUF1ZGlvTm9kZS5wcm90b3R5cGUuY29ubmVjdCxpPUF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzY29ubmVjdDtmdW5jdGlvbiBuKGksbixvKXtpZihpLmlucHV0KXJldHVybiBvPXQuZGVmYXVsdEFyZyhvLDApLHQuaXNBcnJheShpLmlucHV0KT90aGlzLmNvbm5lY3QoaS5pbnB1dFtvXSk6dGhpcy5jb25uZWN0KGkuaW5wdXQsbixvKTt0cnl7cmV0dXJuIGkgaW5zdGFuY2VvZiBBdWRpb05vZGU/KGUuY2FsbCh0aGlzLGksbixvKSxpKTooZS5jYWxsKHRoaXMsaSxuKSxpKX1jYXRjaCh0KXt0aHJvdyBuZXcgRXJyb3IoXCJlcnJvciBjb25uZWN0aW5nIHRvIG5vZGU6IFwiK2krXCJcXG5cIit0KX19QXVkaW9Ob2RlLnByb3RvdHlwZS5jb25uZWN0IT09biYmKEF1ZGlvTm9kZS5wcm90b3R5cGUuY29ubmVjdD1uLEF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzY29ubmVjdD1mdW5jdGlvbihlLG4sbyl7aWYoZSYmZS5pbnB1dCYmdC5pc0FycmF5KGUuaW5wdXQpKW89dC5kZWZhdWx0QXJnKG8sMCksdGhpcy5kaXNjb25uZWN0KGUuaW5wdXRbb10sbiwwKTtlbHNlIGlmKGUmJmUuaW5wdXQpdGhpcy5kaXNjb25uZWN0KGUuaW5wdXQsbixvKTtlbHNlIHRyeXtlIGluc3RhbmNlb2YgQXVkaW9QYXJhbT9pLmNhbGwodGhpcyxlLG4pOmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfWNhdGNoKHQpe3Rocm93IG5ldyBFcnJvcihcImVycm9yIGRpc2Nvbm5lY3Rpbmcgbm9kZTogXCIrZStcIlxcblwiK3QpfX0pfSksdC5zdXBwb3J0ZWQmJiF0LmluaXRpYWxpemVkKXtpZih0Lmdsb2JhbC5UT05FX0FVRElPX0NPTlRFWFR8fCh0Lmdsb2JhbC5UT05FX0FVRElPX0NPTlRFWFQ9bmV3IHQuQ29udGV4dCksdC5jb250ZXh0PXQuZ2xvYmFsLlRPTkVfQVVESU9fQ09OVEVYVCwhdC5nbG9iYWwuVE9ORV9TSUxFTkNFX1ZFUlNJT05fTE9HR0lORyl7dmFyIGk9XCJ2XCI7XCJkZXZcIj09PXQudmVyc2lvbiYmKGk9XCJcIik7dmFyIG49XCIgKiBUb25lLmpzIFwiK2krdC52ZXJzaW9uK1wiICogXCI7Y29uc29sZS5sb2coXCIlY1wiK24sXCJiYWNrZ3JvdW5kOiAjMDAwOyBjb2xvcjogI2ZmZlwiKX19ZWxzZSB0LnN1cHBvcnRlZHx8Y29uc29sZS53YXJuKFwiVGhpcyBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgVG9uZS5qc1wiKTtyZXR1cm4gdC5Db250ZXh0fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDQpLGkoNDApXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5JbnN0cnVtZW50PWZ1bmN0aW9uKGUpe2U9dC5kZWZhdWx0QXJnKGUsdC5JbnN0cnVtZW50LmRlZmF1bHRzKSx0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLHRoaXMuX3ZvbHVtZT10aGlzLm91dHB1dD1uZXcgdC5Wb2x1bWUoZS52b2x1bWUpLHRoaXMudm9sdW1lPXRoaXMuX3ZvbHVtZS52b2x1bWUsdGhpcy5fcmVhZE9ubHkoXCJ2b2x1bWVcIiksdGhpcy5fc2NoZWR1bGVkRXZlbnRzPVtdfSx0LmV4dGVuZCh0Lkluc3RydW1lbnQsdC5BdWRpb05vZGUpLHQuSW5zdHJ1bWVudC5kZWZhdWx0cz17dm9sdW1lOjB9LHQuSW5zdHJ1bWVudC5wcm90b3R5cGUudHJpZ2dlckF0dGFjaz10Lm5vT3AsdC5JbnN0cnVtZW50LnByb3RvdHlwZS50cmlnZ2VyUmVsZWFzZT10Lm5vT3AsdC5JbnN0cnVtZW50LnByb3RvdHlwZS5zeW5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N5bmNNZXRob2QoXCJ0cmlnZ2VyQXR0YWNrXCIsMSksdGhpcy5fc3luY01ldGhvZChcInRyaWdnZXJSZWxlYXNlXCIsMCksdGhpc30sdC5JbnN0cnVtZW50LnByb3RvdHlwZS5fc3luY01ldGhvZD1mdW5jdGlvbihlLGkpe3ZhciBuPXRoaXNbXCJfb3JpZ2luYWxfXCIrZV09dGhpc1tlXTt0aGlzW2VdPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSxvPWVbaV0scz10LlRyYW5zcG9ydC5zY2hlZHVsZShmdW5jdGlvbih0KXtlW2ldPXQsbi5hcHBseSh0aGlzLGUpfS5iaW5kKHRoaXMpLG8pO3RoaXMuX3NjaGVkdWxlZEV2ZW50cy5wdXNoKHMpfS5iaW5kKHRoaXMpfSx0Lkluc3RydW1lbnQucHJvdG90eXBlLnVuc3luYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY2hlZHVsZWRFdmVudHMuZm9yRWFjaChmdW5jdGlvbihlKXt0LlRyYW5zcG9ydC5jbGVhcihlKX0pLHRoaXMuX3NjaGVkdWxlZEV2ZW50cz1bXSx0aGlzLl9vcmlnaW5hbF90cmlnZ2VyQXR0YWNrJiYodGhpcy50cmlnZ2VyQXR0YWNrPXRoaXMuX29yaWdpbmFsX3RyaWdnZXJBdHRhY2ssdGhpcy50cmlnZ2VyUmVsZWFzZT10aGlzLl9vcmlnaW5hbF90cmlnZ2VyUmVsZWFzZSksdGhpc30sdC5JbnN0cnVtZW50LnByb3RvdHlwZS50cmlnZ2VyQXR0YWNrUmVsZWFzZT1mdW5jdGlvbih0LGUsaSxuKXtyZXR1cm4gaT10aGlzLnRvU2Vjb25kcyhpKSxlPXRoaXMudG9TZWNvbmRzKGUpLHRoaXMudHJpZ2dlckF0dGFjayh0LGksbiksdGhpcy50cmlnZ2VyUmVsZWFzZShpK2UpLHRoaXN9LHQuSW5zdHJ1bWVudC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3ZvbHVtZS5kaXNwb3NlKCksdGhpcy5fdm9sdW1lPW51bGwsdGhpcy5fd3JpdGFibGUoW1widm9sdW1lXCJdKSx0aGlzLnZvbHVtZT1udWxsLHRoaXMudW5zeW5jKCksdGhpcy5fc2NoZWR1bGVkRXZlbnRzPW51bGwsdGhpc30sdC5JbnN0cnVtZW50fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDcpLGkoMSldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkF1ZGlvVG9HYWluPWZ1bmN0aW9uKCl7dC5TaWduYWxCYXNlLmNhbGwodGhpcyksdGhpcy5fbm9ybT10aGlzLmlucHV0PXRoaXMub3V0cHV0PW5ldyB0LldhdmVTaGFwZXIoZnVuY3Rpb24odCl7cmV0dXJuKHQrMSkvMn0pfSx0LmV4dGVuZCh0LkF1ZGlvVG9HYWluLHQuU2lnbmFsQmFzZSksdC5BdWRpb1RvR2Fpbi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LlNpZ25hbEJhc2UucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9ub3JtLmRpc3Bvc2UoKSx0aGlzLl9ub3JtPW51bGwsdGhpc30sdC5BdWRpb1RvR2Fpbn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxKSxpKDEzKSxpKDkzKSxpKDMpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkNyb3NzRmFkZT1mdW5jdGlvbihlKXt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLHRoaXMuY3JlYXRlSW5zT3V0cygyLDEpLHRoaXMuYT10aGlzLmlucHV0WzBdPW5ldyB0LkdhaW4sdGhpcy5iPXRoaXMuaW5wdXRbMV09bmV3IHQuR2Fpbix0aGlzLmZhZGU9bmV3IHQuU2lnbmFsKHQuZGVmYXVsdEFyZyhlLC41KSx0LlR5cGUuTm9ybWFsUmFuZ2UpLHRoaXMuX2VxdWFsUG93ZXJBPW5ldyB0LkVxdWFsUG93ZXJHYWluLHRoaXMuX2VxdWFsUG93ZXJCPW5ldyB0LkVxdWFsUG93ZXJHYWluLHRoaXMuX29uZT10aGlzLmNvbnRleHQuZ2V0Q29uc3RhbnQoMSksdGhpcy5faW52ZXJ0PW5ldyB0LlN1YnRyYWN0LHRoaXMuYS5jb25uZWN0KHRoaXMub3V0cHV0KSx0aGlzLmIuY29ubmVjdCh0aGlzLm91dHB1dCksdGhpcy5mYWRlLmNoYWluKHRoaXMuX2VxdWFsUG93ZXJCLHRoaXMuYi5nYWluKSx0aGlzLl9vbmUuY29ubmVjdCh0aGlzLl9pbnZlcnQsMCwwKSx0aGlzLmZhZGUuY29ubmVjdCh0aGlzLl9pbnZlcnQsMCwxKSx0aGlzLl9pbnZlcnQuY2hhaW4odGhpcy5fZXF1YWxQb3dlckEsdGhpcy5hLmdhaW4pLHRoaXMuX3JlYWRPbmx5KFwiZmFkZVwiKX0sdC5leHRlbmQodC5Dcm9zc0ZhZGUsdC5BdWRpb05vZGUpLHQuQ3Jvc3NGYWRlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fd3JpdGFibGUoXCJmYWRlXCIpLHRoaXMuX2VxdWFsUG93ZXJBLmRpc3Bvc2UoKSx0aGlzLl9lcXVhbFBvd2VyQT1udWxsLHRoaXMuX2VxdWFsUG93ZXJCLmRpc3Bvc2UoKSx0aGlzLl9lcXVhbFBvd2VyQj1udWxsLHRoaXMuZmFkZS5kaXNwb3NlKCksdGhpcy5mYWRlPW51bGwsdGhpcy5faW52ZXJ0LmRpc3Bvc2UoKSx0aGlzLl9pbnZlcnQ9bnVsbCx0aGlzLl9vbmU9bnVsbCx0aGlzLmEuZGlzcG9zZSgpLHRoaXMuYT1udWxsLHRoaXMuYi5kaXNwb3NlKCksdGhpcy5iPW51bGwsdGhpc30sdC5Dcm9zc0ZhZGV9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5UaW1lbGluZT1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcIm1lbW9yeVwiXSx0LlRpbWVsaW5lKTt0LmNhbGwodGhpcyksdGhpcy5fdGltZWxpbmU9W10sdGhpcy5tZW1vcnk9ZS5tZW1vcnl9LHQuZXh0ZW5kKHQuVGltZWxpbmUpLHQuVGltZWxpbmUuZGVmYXVsdHM9e21lbW9yeToxLzB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRpbWVsaW5lLnByb3RvdHlwZSxcImxlbmd0aFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGltZWxpbmUubGVuZ3RofX0pLHQuVGltZWxpbmUucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXtpZih0LmlzVW5kZWYoZS50aW1lKSl0aHJvdyBuZXcgRXJyb3IoXCJUb25lLlRpbWVsaW5lOiBldmVudHMgbXVzdCBoYXZlIGEgdGltZSBhdHRyaWJ1dGVcIik7ZS50aW1lPWUudGltZS52YWx1ZU9mKCk7dmFyIGk9dGhpcy5fc2VhcmNoKGUudGltZSk7aWYodGhpcy5fdGltZWxpbmUuc3BsaWNlKGkrMSwwLGUpLHRoaXMubGVuZ3RoPnRoaXMubWVtb3J5KXt2YXIgbj10aGlzLmxlbmd0aC10aGlzLm1lbW9yeTt0aGlzLl90aW1lbGluZS5zcGxpY2UoMCxuKX1yZXR1cm4gdGhpc30sdC5UaW1lbGluZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3RpbWVsaW5lLmluZGV4T2YodCk7cmV0dXJuLTEhPT1lJiZ0aGlzLl90aW1lbGluZS5zcGxpY2UoZSwxKSx0aGlzfSx0LlRpbWVsaW5lLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZSxpKXtpPXQuZGVmYXVsdEFyZyhpLFwidGltZVwiKTt2YXIgbj10aGlzLl9zZWFyY2goZSxpKTtyZXR1cm4tMSE9PW4/dGhpcy5fdGltZWxpbmVbbl06bnVsbH0sdC5UaW1lbGluZS5wcm90b3R5cGUucGVlaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90aW1lbGluZVswXX0sdC5UaW1lbGluZS5wcm90b3R5cGUuc2hpZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGltZWxpbmUuc2hpZnQoKX0sdC5UaW1lbGluZS5wcm90b3R5cGUuZ2V0QWZ0ZXI9ZnVuY3Rpb24oZSxpKXtpPXQuZGVmYXVsdEFyZyhpLFwidGltZVwiKTt2YXIgbj10aGlzLl9zZWFyY2goZSxpKTtyZXR1cm4gbisxPHRoaXMuX3RpbWVsaW5lLmxlbmd0aD90aGlzLl90aW1lbGluZVtuKzFdOm51bGx9LHQuVGltZWxpbmUucHJvdG90eXBlLmdldEJlZm9yZT1mdW5jdGlvbihlLGkpe2k9dC5kZWZhdWx0QXJnKGksXCJ0aW1lXCIpO3ZhciBuPXRoaXMuX3RpbWVsaW5lLmxlbmd0aDtpZihuPjAmJnRoaXMuX3RpbWVsaW5lW24tMV1baV08ZSlyZXR1cm4gdGhpcy5fdGltZWxpbmVbbi0xXTt2YXIgbz10aGlzLl9zZWFyY2goZSxpKTtyZXR1cm4gby0xPj0wP3RoaXMuX3RpbWVsaW5lW28tMV06bnVsbH0sdC5UaW1lbGluZS5wcm90b3R5cGUuY2FuY2VsPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX3RpbWVsaW5lLmxlbmd0aD4xKXt2YXIgZT10aGlzLl9zZWFyY2godCk7aWYoZT49MClpZih0aGlzLl90aW1lbGluZVtlXS50aW1lPT09dCl7Zm9yKHZhciBpPWU7aT49MCYmdGhpcy5fdGltZWxpbmVbaV0udGltZT09PXQ7aS0tKWU9aTt0aGlzLl90aW1lbGluZT10aGlzLl90aW1lbGluZS5zbGljZSgwLGUpfWVsc2UgdGhpcy5fdGltZWxpbmU9dGhpcy5fdGltZWxpbmUuc2xpY2UoMCxlKzEpO2Vsc2UgdGhpcy5fdGltZWxpbmU9W119ZWxzZSAxPT09dGhpcy5fdGltZWxpbmUubGVuZ3RoJiZ0aGlzLl90aW1lbGluZVswXS50aW1lPj10JiYodGhpcy5fdGltZWxpbmU9W10pO3JldHVybiB0aGlzfSx0LlRpbWVsaW5lLnByb3RvdHlwZS5jYW5jZWxCZWZvcmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fc2VhcmNoKHQpO3JldHVybiBlPj0wJiYodGhpcy5fdGltZWxpbmU9dGhpcy5fdGltZWxpbmUuc2xpY2UoZSsxKSksdGhpc30sdC5UaW1lbGluZS5wcm90b3R5cGUucHJldmlvdXNFdmVudD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl90aW1lbGluZS5pbmRleE9mKHQpO3JldHVybiBlPjA/dGhpcy5fdGltZWxpbmVbZS0xXTpudWxsfSx0LlRpbWVsaW5lLnByb3RvdHlwZS5fc2VhcmNoPWZ1bmN0aW9uKGUsaSl7aWYoMD09PXRoaXMuX3RpbWVsaW5lLmxlbmd0aClyZXR1cm4tMTtpPXQuZGVmYXVsdEFyZyhpLFwidGltZVwiKTt2YXIgbj0wLG89dGhpcy5fdGltZWxpbmUubGVuZ3RoLHM9bztpZihvPjAmJnRoaXMuX3RpbWVsaW5lW28tMV1baV08PWUpcmV0dXJuIG8tMTtmb3IoO248czspe3ZhciByPU1hdGguZmxvb3Iobisocy1uKS8yKSxhPXRoaXMuX3RpbWVsaW5lW3JdLGw9dGhpcy5fdGltZWxpbmVbcisxXTtpZihhW2ldPT09ZSl7Zm9yKHZhciBoPXI7aDx0aGlzLl90aW1lbGluZS5sZW5ndGg7aCsrKXt0aGlzLl90aW1lbGluZVtoXVtpXT09PWUmJihyPWgpfXJldHVybiByfWlmKGFbaV08ZSYmbFtpXT5lKXJldHVybiByO2FbaV0+ZT9zPXI6bj1yKzF9cmV0dXJuLTF9LHQuVGltZWxpbmUucHJvdG90eXBlLl9pdGVyYXRlPWZ1bmN0aW9uKGUsaSxuKXtpPXQuZGVmYXVsdEFyZyhpLDApLG49dC5kZWZhdWx0QXJnKG4sdGhpcy5fdGltZWxpbmUubGVuZ3RoLTEpLHRoaXMuX3RpbWVsaW5lLnNsaWNlKGksbisxKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UuY2FsbCh0aGlzLHQpfS5iaW5kKHRoaXMpKX0sdC5UaW1lbGluZS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faXRlcmF0ZSh0KSx0aGlzfSx0LlRpbWVsaW5lLnByb3RvdHlwZS5mb3JFYWNoQmVmb3JlPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fc2VhcmNoKHQpO3JldHVybi0xIT09aSYmdGhpcy5faXRlcmF0ZShlLDAsaSksdGhpc30sdC5UaW1lbGluZS5wcm90b3R5cGUuZm9yRWFjaEFmdGVyPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fc2VhcmNoKHQpO3JldHVybiB0aGlzLl9pdGVyYXRlKGUsaSsxKSx0aGlzfSx0LlRpbWVsaW5lLnByb3RvdHlwZS5mb3JFYWNoQmV0d2Vlbj1mdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5fc2VhcmNoKHQpLG89dGhpcy5fc2VhcmNoKGUpO3JldHVybi0xIT09biYmLTEhPT1vPyh0aGlzLl90aW1lbGluZVtuXS50aW1lIT09dCYmKG4rPTEpLHRoaXMuX3RpbWVsaW5lW29dLnRpbWU9PT1lJiYoby09MSksdGhpcy5faXRlcmF0ZShpLG4sbykpOi0xPT09biYmdGhpcy5faXRlcmF0ZShpLDAsbyksdGhpc30sdC5UaW1lbGluZS5wcm90b3R5cGUuZm9yRWFjaEZyb209ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9dGhpcy5fc2VhcmNoKHQpO2k+PTAmJnRoaXMuX3RpbWVsaW5lW2ldLnRpbWU+PXQ7KWktLTtyZXR1cm4gdGhpcy5faXRlcmF0ZShlLGkrMSksdGhpc30sdC5UaW1lbGluZS5wcm90b3R5cGUuZm9yRWFjaEF0VGltZT1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX3NlYXJjaCh0KTtyZXR1cm4tMSE9PWkmJnRoaXMuX2l0ZXJhdGUoZnVuY3Rpb24oaSl7aS50aW1lPT09dCYmZS5jYWxsKHRoaXMsaSl9LDAsaSksdGhpc30sdC5UaW1lbGluZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fdGltZWxpbmU9bnVsbCx0aGlzfSx0LlRpbWVsaW5lfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDIxKSxpKDEpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5Nb25vcGhvbmljPWZ1bmN0aW9uKGUpe2U9dC5kZWZhdWx0QXJnKGUsdC5Nb25vcGhvbmljLmRlZmF1bHRzKSx0Lkluc3RydW1lbnQuY2FsbCh0aGlzLGUpLHRoaXMucG9ydGFtZW50bz1lLnBvcnRhbWVudG99LHQuZXh0ZW5kKHQuTW9ub3Bob25pYyx0Lkluc3RydW1lbnQpLHQuTW9ub3Bob25pYy5kZWZhdWx0cz17cG9ydGFtZW50bzowfSx0Lk1vbm9waG9uaWMucHJvdG90eXBlLnRyaWdnZXJBdHRhY2s9ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLmxvZyhcInRyaWdnZXJBdHRhY2tcIix0LGUsaSksZT10aGlzLnRvU2Vjb25kcyhlKSx0aGlzLl90cmlnZ2VyRW52ZWxvcGVBdHRhY2soZSxpKSx0aGlzLnNldE5vdGUodCxlKSx0aGlzfSx0Lk1vbm9waG9uaWMucHJvdG90eXBlLnRyaWdnZXJSZWxlYXNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxvZyhcInRyaWdnZXJSZWxlYXNlXCIsdCksdD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl90cmlnZ2VyRW52ZWxvcGVSZWxlYXNlKHQpLHRoaXN9LHQuTW9ub3Bob25pYy5wcm90b3R5cGUuX3RyaWdnZXJFbnZlbG9wZUF0dGFjaz1mdW5jdGlvbigpe30sdC5Nb25vcGhvbmljLnByb3RvdHlwZS5fdHJpZ2dlckVudmVsb3BlUmVsZWFzZT1mdW5jdGlvbigpe30sdC5Nb25vcGhvbmljLnByb3RvdHlwZS5nZXRMZXZlbEF0VGltZT1mdW5jdGlvbih0KXtyZXR1cm4gdD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLmVudmVsb3BlLmdldFZhbHVlQXRUaW1lKHQpfSx0Lk1vbm9waG9uaWMucHJvdG90eXBlLnNldE5vdGU9ZnVuY3Rpb24odCxlKXtpZihlPXRoaXMudG9TZWNvbmRzKGUpLHRoaXMucG9ydGFtZW50bz4wJiZ0aGlzLmdldExldmVsQXRUaW1lKGUpPi4wNSl7dmFyIGk9dGhpcy50b1NlY29uZHModGhpcy5wb3J0YW1lbnRvKTt0aGlzLmZyZXF1ZW5jeS5leHBvbmVudGlhbFJhbXBUbyh0LGksZSl9ZWxzZSB0aGlzLmZyZXF1ZW5jeS5zZXRWYWx1ZUF0VGltZSh0LGUpO3JldHVybiB0aGlzfSx0Lk1vbm9waG9uaWN9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMjkpLGkoNSksaSgxKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuU2NhbGU9ZnVuY3Rpb24oZSxpKXt0LlNpZ25hbEJhc2UuY2FsbCh0aGlzKSx0aGlzLl9vdXRwdXRNaW49dC5kZWZhdWx0QXJnKGUsMCksdGhpcy5fb3V0cHV0TWF4PXQuZGVmYXVsdEFyZyhpLDEpLHRoaXMuX3NjYWxlPXRoaXMuaW5wdXQ9bmV3IHQuTXVsdGlwbHkoMSksdGhpcy5fYWRkPXRoaXMub3V0cHV0PW5ldyB0LkFkZCgwKSx0aGlzLl9zY2FsZS5jb25uZWN0KHRoaXMuX2FkZCksdGhpcy5fc2V0UmFuZ2UoKX0sdC5leHRlbmQodC5TY2FsZSx0LlNpZ25hbEJhc2UpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlNjYWxlLnByb3RvdHlwZSxcIm1pblwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3V0cHV0TWlufSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fb3V0cHV0TWluPXQsdGhpcy5fc2V0UmFuZ2UoKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5TY2FsZS5wcm90b3R5cGUsXCJtYXhcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX291dHB1dE1heH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX291dHB1dE1heD10LHRoaXMuX3NldFJhbmdlKCl9fSksdC5TY2FsZS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKCl7dGhpcy5fYWRkLnZhbHVlPXRoaXMuX291dHB1dE1pbix0aGlzLl9zY2FsZS52YWx1ZT10aGlzLl9vdXRwdXRNYXgtdGhpcy5fb3V0cHV0TWlufSx0LlNjYWxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU2lnbmFsQmFzZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX2FkZC5kaXNwb3NlKCksdGhpcy5fYWRkPW51bGwsdGhpcy5fc2NhbGUuZGlzcG9zZSgpLHRoaXMuX3NjYWxlPW51bGwsdGhpc30sdC5TY2FsZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxKSxpKDMpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlZvbHVtZT1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcInZvbHVtZVwiXSx0LlZvbHVtZSk7dC5BdWRpb05vZGUuY2FsbCh0aGlzLGUpLHRoaXMub3V0cHV0PXRoaXMuaW5wdXQ9bmV3IHQuR2FpbihlLnZvbHVtZSx0LlR5cGUuRGVjaWJlbHMpLHRoaXMuX3VubXV0ZWRWb2x1bWU9ZS52b2x1bWUsdGhpcy52b2x1bWU9dGhpcy5vdXRwdXQuZ2Fpbix0aGlzLl9yZWFkT25seShcInZvbHVtZVwiKSx0aGlzLm11dGU9ZS5tdXRlfSx0LmV4dGVuZCh0LlZvbHVtZSx0LkF1ZGlvTm9kZSksdC5Wb2x1bWUuZGVmYXVsdHM9e3ZvbHVtZTowLG11dGU6ITF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlZvbHVtZS5wcm90b3R5cGUsXCJtdXRlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZvbHVtZS52YWx1ZT09PS0xLzB9LHNldDpmdW5jdGlvbih0KXshdGhpcy5tdXRlJiZ0Pyh0aGlzLl91bm11dGVkVm9sdW1lPXRoaXMudm9sdW1lLnZhbHVlLHRoaXMudm9sdW1lLnZhbHVlPS0xLzApOnRoaXMubXV0ZSYmIXQmJih0aGlzLnZvbHVtZS52YWx1ZT10aGlzLl91bm11dGVkVm9sdW1lKX19KSx0LlZvbHVtZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlucHV0LmRpc3Bvc2UoKSx0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFwidm9sdW1lXCIpLHRoaXMudm9sdW1lLmRpc3Bvc2UoKSx0aGlzLnZvbHVtZT1udWxsLHRoaXN9LHQuVm9sdW1lfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDMpLGkoMzYpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtyZXR1cm4gdC5aZXJvPWZ1bmN0aW9uKCl7dC5TaWduYWxCYXNlLmNhbGwodGhpcyksdGhpcy5fZ2Fpbj10aGlzLmlucHV0PXRoaXMub3V0cHV0PW5ldyB0LkdhaW4sdGhpcy5jb250ZXh0LmdldENvbnN0YW50KDApLmNvbm5lY3QodGhpcy5fZ2Fpbil9LHQuZXh0ZW5kKHQuWmVybyx0LlNpZ25hbEJhc2UpLHQuWmVyby5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LlNpZ25hbEJhc2UucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9nYWluLmRpc3Bvc2UoKSx0aGlzLl9nYWluPW51bGwsdGhpc30sdC5aZXJvfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDEpLGkoMyldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkFkZD1mdW5jdGlvbihlKXt0LlNpZ25hbC5jYWxsKHRoaXMpLHRoaXMuY3JlYXRlSW5zT3V0cygyLDApLHRoaXMuX3N1bT10aGlzLmlucHV0WzBdPXRoaXMuaW5wdXRbMV09dGhpcy5vdXRwdXQ9bmV3IHQuR2Fpbix0aGlzLl9wYXJhbT10aGlzLmlucHV0WzFdPW5ldyB0LlNpZ25hbChlKSx0aGlzLl9wYXJhbS5jb25uZWN0KHRoaXMuX3N1bSksdGhpcy5wcm94eT0hMX0sdC5leHRlbmQodC5BZGQsdC5TaWduYWwpLHQuQWRkLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU2lnbmFsLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fc3VtLmRpc3Bvc2UoKSx0aGlzLl9zdW09bnVsbCx0aGlzfSx0LkFkZH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg0NyksaSgzKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuQW1wbGl0dWRlRW52ZWxvcGU9ZnVuY3Rpb24oKXt0LkVudmVsb3BlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmlucHV0PXRoaXMub3V0cHV0PW5ldyB0LkdhaW4sdGhpcy5fc2lnLmNvbm5lY3QodGhpcy5vdXRwdXQuZ2Fpbil9LHQuZXh0ZW5kKHQuQW1wbGl0dWRlRW52ZWxvcGUsdC5FbnZlbG9wZSksdC5BbXBsaXR1ZGVFbnZlbG9wZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkVudmVsb3BlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpc30sdC5BbXBsaXR1ZGVFbnZlbG9wZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxMSksaSg2KSxpKDMpLGkoMiksaSg2MyldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe3JldHVybiB0LkJ1ZmZlclNvdXJjZT1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcImJ1ZmZlclwiLFwib25sb2FkXCJdLHQuQnVmZmVyU291cmNlKTt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMsZSksdGhpcy5vbmVuZGVkPWUub25lbmRlZCx0aGlzLl9zdGFydFRpbWU9LTEsdGhpcy5fc291cmNlU3RhcnRlZD0hMSx0aGlzLl9zb3VyY2VTdG9wcGVkPSExLHRoaXMuX3N0b3BUaW1lPS0xLHRoaXMuX2dhaW5Ob2RlPXRoaXMub3V0cHV0PW5ldyB0LkdhaW4oMCksdGhpcy5fc291cmNlPXRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXJTb3VyY2UoKSx0aGlzLl9zb3VyY2UuY29ubmVjdCh0aGlzLl9nYWluTm9kZSksdGhpcy5fc291cmNlLm9uZW5kZWQ9dGhpcy5fb25lbmRlZC5iaW5kKHRoaXMpLHRoaXMuX2J1ZmZlcj1uZXcgdC5CdWZmZXIoZS5idWZmZXIsZS5vbmxvYWQpLHRoaXMucGxheWJhY2tSYXRlPW5ldyB0LlBhcmFtKHtwYXJhbTp0aGlzLl9zb3VyY2UucGxheWJhY2tSYXRlLHVuaXRzOnQuVHlwZS5Qb3NpdGl2ZSx2YWx1ZTplLnBsYXliYWNrUmF0ZX0pLHRoaXMuZmFkZUluPWUuZmFkZUluLHRoaXMuZmFkZU91dD1lLmZhZGVPdXQsdGhpcy5jdXJ2ZT1lLmN1cnZlLHRoaXMuX29uZW5kZWRUaW1lb3V0PS0xLHRoaXMubG9vcD1lLmxvb3AsdGhpcy5sb29wU3RhcnQ9ZS5sb29wU3RhcnQsdGhpcy5sb29wRW5kPWUubG9vcEVuZH0sdC5leHRlbmQodC5CdWZmZXJTb3VyY2UsdC5BdWRpb05vZGUpLHQuQnVmZmVyU291cmNlLmRlZmF1bHRzPXtvbmVuZGVkOnQubm9PcCxvbmxvYWQ6dC5ub09wLGxvb3A6ITEsbG9vcFN0YXJ0OjAsbG9vcEVuZDowLGZhZGVJbjowLGZhZGVPdXQ6MCxjdXJ2ZTpcImxpbmVhclwiLHBsYXliYWNrUmF0ZToxfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5CdWZmZXJTb3VyY2UucHJvdG90eXBlLFwic3RhdGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0U3RhdGVBdFRpbWUodGhpcy5ub3coKSl9fSksdC5CdWZmZXJTb3VyY2UucHJvdG90eXBlLmdldFN0YXRlQXRUaW1lPWZ1bmN0aW9uKGUpe3JldHVybiBlPXRoaXMudG9TZWNvbmRzKGUpLC0xIT09dGhpcy5fc3RhcnRUaW1lJiZ0aGlzLl9zdGFydFRpbWU8PWUmJigtMT09PXRoaXMuX3N0b3BUaW1lfHxlPHRoaXMuX3N0b3BUaW1lKSYmIXRoaXMuX3NvdXJjZVN0b3BwZWQ/dC5TdGF0ZS5TdGFydGVkOnQuU3RhdGUuU3RvcHBlZH0sdC5CdWZmZXJTb3VyY2UucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKGUsaSxuLG8pe3RoaXMubG9nKFwic3RhcnRcIixlLGksbixvKSx0aGlzLmFzc2VydCgtMT09PXRoaXMuX3N0YXJ0VGltZSxcImNhbiBvbmx5IGJlIHN0YXJ0ZWQgb25jZVwiKSx0aGlzLmFzc2VydCh0aGlzLmJ1ZmZlci5sb2FkZWQsXCJidWZmZXIgaXMgZWl0aGVyIG5vdCBzZXQgb3Igbm90IGxvYWRlZFwiKSx0aGlzLmFzc2VydCghdGhpcy5fc291cmNlU3RvcHBlZCxcInNvdXJjZSBpcyBhbHJlYWR5IHN0b3BwZWRcIiksZT10aGlzLnRvU2Vjb25kcyhlKSxpPXRoaXMubG9vcD90LmRlZmF1bHRBcmcoaSx0aGlzLmxvb3BTdGFydCk6dC5kZWZhdWx0QXJnKGksMCksaT10aGlzLnRvU2Vjb25kcyhpKSxpPU1hdGgubWF4KGksMCksbz10LmRlZmF1bHRBcmcobywxKTt2YXIgcz10aGlzLnRvU2Vjb25kcyh0aGlzLmZhZGVJbik7aWYocz4wPyh0aGlzLl9nYWluTm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKDAsZSksXCJsaW5lYXJcIj09PXRoaXMuY3VydmU/dGhpcy5fZ2Fpbk5vZGUuZ2Fpbi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShvLGUrcyk6dGhpcy5fZ2Fpbk5vZGUuZ2Fpbi5leHBvbmVudGlhbEFwcHJvYWNoVmFsdWVBdFRpbWUobyxlLHMpKTp0aGlzLl9nYWluTm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKG8sZSksdGhpcy5fc3RhcnRUaW1lPWUsdC5pc0RlZmluZWQobikpe3ZhciByPXRoaXMudG9TZWNvbmRzKG4pO3I9TWF0aC5tYXgociwwKSx0aGlzLnN0b3AoZStyKX1pZih0aGlzLmxvb3Ape3ZhciBhPXRoaXMubG9vcEVuZHx8dGhpcy5idWZmZXIuZHVyYXRpb24sbD10aGlzLmxvb3BTdGFydDtpPj1hJiYoaT0oaS1sKSUoYS1sKStsKX1yZXR1cm4gdGhpcy5fc291cmNlLmJ1ZmZlcj10aGlzLmJ1ZmZlci5nZXQoKSx0aGlzLl9zb3VyY2UubG9vcEVuZD10aGlzLmxvb3BFbmR8fHRoaXMuYnVmZmVyLmR1cmF0aW9uLGk8dGhpcy5idWZmZXIuZHVyYXRpb24mJih0aGlzLl9zb3VyY2VTdGFydGVkPSEwLHRoaXMuX3NvdXJjZS5zdGFydChlLGkpKSx0aGlzfSx0LkJ1ZmZlclNvdXJjZS5wcm90b3R5cGUuc3RvcD1mdW5jdGlvbihlKXt0aGlzLmxvZyhcInN0b3BcIixlKSx0aGlzLmFzc2VydCh0aGlzLmJ1ZmZlci5sb2FkZWQsXCJidWZmZXIgaXMgZWl0aGVyIG5vdCBzZXQgb3Igbm90IGxvYWRlZFwiKSx0aGlzLmFzc2VydCghdGhpcy5fc291cmNlU3RvcHBlZCxcInNvdXJjZSBpcyBhbHJlYWR5IHN0b3BwZWRcIiksZT10aGlzLnRvU2Vjb25kcyhlKSwtMSE9PXRoaXMuX3N0b3BUaW1lJiZ0aGlzLmNhbmNlbFN0b3AoKTt2YXIgaT10aGlzLnRvU2Vjb25kcyh0aGlzLmZhZGVPdXQpO3JldHVybiB0aGlzLl9zdG9wVGltZT1lK2ksaT4wP1wibGluZWFyXCI9PT10aGlzLmN1cnZlP3RoaXMuX2dhaW5Ob2RlLmdhaW4ubGluZWFyUmFtcFRvKDAsaSxlKTp0aGlzLl9nYWluTm9kZS5nYWluLnRhcmdldFJhbXBUbygwLGksZSk6KHRoaXMuX2dhaW5Ob2RlLmdhaW4uY2FuY2VsQW5kSG9sZEF0VGltZShlKSx0aGlzLl9nYWluTm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKDAsZSkpLHQuY29udGV4dC5jbGVhclRpbWVvdXQodGhpcy5fb25lbmRlZFRpbWVvdXQpLHRoaXMuX29uZW5kZWRUaW1lb3V0PXQuY29udGV4dC5zZXRUaW1lb3V0KHRoaXMuX29uZW5kZWQuYmluZCh0aGlzKSx0aGlzLl9zdG9wVGltZS10aGlzLm5vdygpKSx0aGlzfSx0LkJ1ZmZlclNvdXJjZS5wcm90b3R5cGUuY2FuY2VsU3RvcD1mdW5jdGlvbigpe2lmKC0xIT09dGhpcy5fc3RhcnRUaW1lJiYhdGhpcy5fc291cmNlU3RvcHBlZCl7dmFyIHQ9dGhpcy50b1NlY29uZHModGhpcy5mYWRlSW4pO3RoaXMuX2dhaW5Ob2RlLmdhaW4uY2FuY2VsU2NoZWR1bGVkVmFsdWVzKHRoaXMuX3N0YXJ0VGltZSt0K3RoaXMuc2FtcGxlVGltZSksdGhpcy5jb250ZXh0LmNsZWFyVGltZW91dCh0aGlzLl9vbmVuZGVkVGltZW91dCksdGhpcy5fc3RvcFRpbWU9LTF9cmV0dXJuIHRoaXN9LHQuQnVmZmVyU291cmNlLnByb3RvdHlwZS5fb25lbmRlZD1mdW5jdGlvbigpe2lmKCF0aGlzLl9zb3VyY2VTdG9wcGVkKXt0aGlzLl9zb3VyY2VTdG9wcGVkPSEwO3ZhciB0PVwiZXhwb25lbnRpYWxcIj09PXRoaXMuY3VydmU/Mip0aGlzLmZhZGVPdXQ6MDt0aGlzLl9zb3VyY2VTdGFydGVkJiYtMSE9PXRoaXMuX3N0b3BUaW1lJiZ0aGlzLl9zb3VyY2Uuc3RvcCh0aGlzLl9zdG9wVGltZSt0KSx0aGlzLm9uZW5kZWQodGhpcyl9fSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5CdWZmZXJTb3VyY2UucHJvdG90eXBlLFwibG9vcFN0YXJ0XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zb3VyY2UubG9vcFN0YXJ0fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fc291cmNlLmxvb3BTdGFydD10aGlzLnRvU2Vjb25kcyh0KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5CdWZmZXJTb3VyY2UucHJvdG90eXBlLFwibG9vcEVuZFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc291cmNlLmxvb3BFbmR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9zb3VyY2UubG9vcEVuZD10aGlzLnRvU2Vjb25kcyh0KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5CdWZmZXJTb3VyY2UucHJvdG90eXBlLFwiYnVmZmVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9idWZmZXJ9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9idWZmZXIuc2V0KHQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkJ1ZmZlclNvdXJjZS5wcm90b3R5cGUsXCJsb29wXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zb3VyY2UubG9vcH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3NvdXJjZS5sb29wPXQsdGhpcy5jYW5jZWxTdG9wKCl9fSksdC5CdWZmZXJTb3VyY2UucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLm9uZW5kZWQ9bnVsbCx0aGlzLl9zb3VyY2Uub25lbmRlZD1udWxsLHRoaXMuX3NvdXJjZS5kaXNjb25uZWN0KCksdGhpcy5fc291cmNlPW51bGwsdGhpcy5fZ2Fpbk5vZGUuZGlzcG9zZSgpLHRoaXMuX2dhaW5Ob2RlPW51bGwsdGhpcy5fYnVmZmVyLmRpc3Bvc2UoKSx0aGlzLl9idWZmZXI9bnVsbCx0aGlzLl9zdGFydFRpbWU9LTEsdGhpcy5wbGF5YmFja1JhdGU9bnVsbCx0LmNvbnRleHQuY2xlYXJUaW1lb3V0KHRoaXMuX29uZW5kZWRUaW1lb3V0KSx0aGlzfSx0LkJ1ZmZlclNvdXJjZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg4KSxpKDEpLGkoNSksaSgzKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuRmVlZGJhY2tFZmZlY3Q9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJmZWVkYmFja1wiXSx0LkZlZWRiYWNrRWZmZWN0KTt0LkVmZmVjdC5jYWxsKHRoaXMsZSksdGhpcy5fZmVlZGJhY2tHYWluPW5ldyB0LkdhaW4oZS5mZWVkYmFjayx0LlR5cGUuTm9ybWFsUmFuZ2UpLHRoaXMuZmVlZGJhY2s9dGhpcy5fZmVlZGJhY2tHYWluLmdhaW4sdGhpcy5lZmZlY3RSZXR1cm4uY2hhaW4odGhpcy5fZmVlZGJhY2tHYWluLHRoaXMuZWZmZWN0U2VuZCksdGhpcy5fcmVhZE9ubHkoW1wiZmVlZGJhY2tcIl0pfSx0LmV4dGVuZCh0LkZlZWRiYWNrRWZmZWN0LHQuRWZmZWN0KSx0LkZlZWRiYWNrRWZmZWN0LmRlZmF1bHRzPXtmZWVkYmFjazouMTI1fSx0LkZlZWRiYWNrRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fd3JpdGFibGUoW1wiZmVlZGJhY2tcIl0pLHRoaXMuX2ZlZWRiYWNrR2Fpbi5kaXNwb3NlKCksdGhpcy5fZmVlZGJhY2tHYWluPW51bGwsdGhpcy5mZWVkYmFjaz1udWxsLHRoaXN9LHQuRmVlZGJhY2tFZmZlY3R9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMjQpLGkoNCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlRpbWVsaW5lU3RhdGU9ZnVuY3Rpb24oZSl7dC5UaW1lbGluZS5jYWxsKHRoaXMpLHRoaXMuX2luaXRpYWw9ZX0sdC5leHRlbmQodC5UaW1lbGluZVN0YXRlLHQuVGltZWxpbmUpLHQuVGltZWxpbmVTdGF0ZS5wcm90b3R5cGUuZ2V0VmFsdWVBdFRpbWU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXQodCk7cmV0dXJuIG51bGwhPT1lP2Uuc3RhdGU6dGhpcy5faW5pdGlhbH0sdC5UaW1lbGluZVN0YXRlLnByb3RvdHlwZS5zZXRTdGF0ZUF0VGltZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmFkZCh7c3RhdGU6dCx0aW1lOmV9KSx0aGlzfSx0LlRpbWVsaW5lU3RhdGUucHJvdG90eXBlLmdldExhc3RTdGF0ZT1mdW5jdGlvbih0LGUpe2U9dGhpcy50b1NlY29uZHMoZSk7Zm9yKHZhciBpPXRoaXMuX3NlYXJjaChlKTtpPj0wO2ktLSl7dmFyIG49dGhpcy5fdGltZWxpbmVbaV07aWYobi5zdGF0ZT09PXQpcmV0dXJuIG59fSx0LlRpbWVsaW5lU3RhdGUucHJvdG90eXBlLmdldE5leHRTdGF0ZT1mdW5jdGlvbih0LGUpe2U9dGhpcy50b1NlY29uZHMoZSk7dmFyIGk9dGhpcy5fc2VhcmNoKGUpO2lmKC0xIT09aSlmb3IodmFyIG49aTtuPHRoaXMuX3RpbWVsaW5lLmxlbmd0aDtuKyspe3ZhciBvPXRoaXMuX3RpbWVsaW5lW25dO2lmKG8uc3RhdGU9PT10KXJldHVybiBvfX0sdC5UaW1lbGluZVN0YXRlfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDY2KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7aWYodC5zdXBwb3J0ZWQpeyF0Lmdsb2JhbC5oYXNPd25Qcm9wZXJ0eShcIkF1ZGlvQ29udGV4dFwiKSYmdC5nbG9iYWwuaGFzT3duUHJvcGVydHkoXCJ3ZWJraXRBdWRpb0NvbnRleHRcIikmJih0Lmdsb2JhbC5BdWRpb0NvbnRleHQ9dC5nbG9iYWwud2Via2l0QXVkaW9Db250ZXh0KSxBdWRpb0NvbnRleHQucHJvdG90eXBlLmNsb3NlfHwoQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3JldHVybiB0LmlzRnVuY3Rpb24odGhpcy5zdXNwZW5kKSYmdGhpcy5zdXNwZW5kKCksUHJvbWlzZS5yZXNvbHZlKCl9KSxBdWRpb0NvbnRleHQucHJvdG90eXBlLnJlc3VtZXx8KEF1ZGlvQ29udGV4dC5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jcmVhdGVCdWZmZXIoMSwxLHRoaXMuc2FtcGxlUmF0ZSksZT10aGlzLmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO3JldHVybiBlLmJ1ZmZlcj10LGUuY29ubmVjdCh0aGlzLmRlc3RpbmF0aW9uKSxlLnN0YXJ0KDApLFByb21pc2UucmVzb2x2ZSgpfSksIUF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlR2FpbiYmQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVHYWluTm9kZSYmKEF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlR2Fpbj1BdWRpb0NvbnRleHQucHJvdG90eXBlLmNyZWF0ZUdhaW5Ob2RlKSwhQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVEZWxheSYmQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVEZWxheU5vZGUmJihBdWRpb0NvbnRleHQucHJvdG90eXBlLmNyZWF0ZURlbGF5PUF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlRGVsYXlOb2RlKTt2YXIgZT0hMSxpPW5ldyBPZmZsaW5lQXVkaW9Db250ZXh0KDEsMSw0NDEwMCksbj1uZXcgVWludDMyQXJyYXkoWzExNzkwMTE0MTAsNDgsMTE2MzI4MDcyNyw1NDQ1MDEwOTQsMTYsMTMxMDczLDQ0MTAwLDE3NjQwMCwxMDQ4NTgwLDE2MzUwMTcwNjAsOCwwLDAsMCwwXSkuYnVmZmVyO3RyeXt2YXIgbz1pLmRlY29kZUF1ZGlvRGF0YShuKTtvJiZ0LmlzRnVuY3Rpb24oby50aGVuKSYmKGU9ITApfWNhdGNoKHQpe2U9ITF9ZXx8KEF1ZGlvQ29udGV4dC5wcm90b3R5cGUuX25hdGl2ZV9kZWNvZGVBdWRpb0RhdGE9QXVkaW9Db250ZXh0LnByb3RvdHlwZS5kZWNvZGVBdWRpb0RhdGEsQXVkaW9Db250ZXh0LnByb3RvdHlwZS5kZWNvZGVBdWRpb0RhdGE9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsaSl7dGhpcy5fbmF0aXZlX2RlY29kZUF1ZGlvRGF0YSh0LGUsaSl9LmJpbmQodGhpcykpfSl9fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuRW1pdHRlcj1mdW5jdGlvbigpe3QuY2FsbCh0aGlzKSx0aGlzLl9ldmVudHM9e319LHQuZXh0ZW5kKHQuRW1pdHRlciksdC5FbWl0dGVyLnByb3RvdHlwZS5vbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT10LnNwbGl0KC9cXFcrLyksbj0wO248aS5sZW5ndGg7bisrKXt2YXIgbz1pW25dO3RoaXMuX2V2ZW50cy5oYXNPd25Qcm9wZXJ0eShvKXx8KHRoaXMuX2V2ZW50c1tvXT1bXSksdGhpcy5fZXZlbnRzW29dLnB1c2goZSl9cmV0dXJuIHRoaXN9LHQuRW1pdHRlci5wcm90b3R5cGUub25jZT1mdW5jdGlvbih0LGUpe3ZhciBpPWZ1bmN0aW9uKCl7ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5vZmYodCxpKX0uYmluZCh0aGlzKTtyZXR1cm4gdGhpcy5vbih0LGkpLHRoaXN9LHQuRW1pdHRlci5wcm90b3R5cGUub2ZmPWZ1bmN0aW9uKGUsaSl7Zm9yKHZhciBuPWUuc3BsaXQoL1xcVysvKSxvPTA7bzxuLmxlbmd0aDtvKyspaWYoZT1uW29dLHRoaXMuX2V2ZW50cy5oYXNPd25Qcm9wZXJ0eShlKSlpZih0LmlzVW5kZWYoaSkpdGhpcy5fZXZlbnRzW2VdPVtdO2Vsc2UgZm9yKHZhciBzPXRoaXMuX2V2ZW50c1tlXSxyPTA7cjxzLmxlbmd0aDtyKyspc1tyXT09PWkmJnMuc3BsaWNlKHIsMSk7cmV0dXJuIHRoaXN9LHQuRW1pdHRlci5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbih0KXtpZih0aGlzLl9ldmVudHMpe3ZhciBlPUFycmF5LmFwcGx5KG51bGwsYXJndW1lbnRzKS5zbGljZSgxKTtpZih0aGlzLl9ldmVudHMuaGFzT3duUHJvcGVydHkodCkpZm9yKHZhciBpPXRoaXMuX2V2ZW50c1t0XS5zbGljZSgwKSxuPTAsbz1pLmxlbmd0aDtuPG87bisrKWlbbl0uYXBwbHkodGhpcyxlKX1yZXR1cm4gdGhpc30sdC5FbWl0dGVyLm1peGluPWZ1bmN0aW9uKGUpe3ZhciBpPVtcIm9uXCIsXCJvbmNlXCIsXCJvZmZcIixcImVtaXRcIl07ZS5fZXZlbnRzPXt9O2Zvcih2YXIgbj0wO248aS5sZW5ndGg7bisrKXt2YXIgbz1pW25dLHM9dC5FbWl0dGVyLnByb3RvdHlwZVtvXTtlW29dPXN9cmV0dXJuIHQuRW1pdHRlcn0sdC5FbWl0dGVyLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9ldmVudHM9bnVsbCx0aGlzfSx0LkVtaXR0ZXJ9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlNpZ25hbEJhc2U9ZnVuY3Rpb24oKXt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpfSx0LmV4dGVuZCh0LlNpZ25hbEJhc2UsdC5BdWRpb05vZGUpLHQuU2lnbmFsQmFzZS5wcm90b3R5cGUuY29ubmVjdD1mdW5jdGlvbihlLGksbil7cmV0dXJuIHQuU2lnbmFsJiZ0LlNpZ25hbD09PWUuY29uc3RydWN0b3J8fHQuUGFyYW0mJnQuUGFyYW09PT1lLmNvbnN0cnVjdG9yPyhlLl9wYXJhbS5jYW5jZWxTY2hlZHVsZWRWYWx1ZXMoMCksZS5fcGFyYW0uc2V0VmFsdWVBdFRpbWUoMCwwKSxlLm92ZXJyaWRkZW49ITApOmUgaW5zdGFuY2VvZiBBdWRpb1BhcmFtJiYoZS5jYW5jZWxTY2hlZHVsZWRWYWx1ZXMoMCksZS5zZXRWYWx1ZUF0VGltZSgwLDApKSx0LkF1ZGlvTm9kZS5wcm90b3R5cGUuY29ubmVjdC5jYWxsKHRoaXMsZSxpLG4pLHRoaXN9LHQuU2lnbmFsQmFzZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg2KSxpKDE3KSxpKDQ5KSxpKDcxKSxpKDQ4KSxpKDcwKSxpKDY5KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7dC5PbW5pT3NjaWxsYXRvcj1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcImZyZXF1ZW5jeVwiLFwidHlwZVwiXSx0Lk9tbmlPc2NpbGxhdG9yKTt0LlNvdXJjZS5jYWxsKHRoaXMsZSksdGhpcy5mcmVxdWVuY3k9bmV3IHQuU2lnbmFsKGUuZnJlcXVlbmN5LHQuVHlwZS5GcmVxdWVuY3kpLHRoaXMuZGV0dW5lPW5ldyB0LlNpZ25hbChlLmRldHVuZSx0LlR5cGUuQ2VudHMpLHRoaXMuX3NvdXJjZVR5cGU9dm9pZCAwLHRoaXMuX29zY2lsbGF0b3I9bnVsbCx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuX3JlYWRPbmx5KFtcImZyZXF1ZW5jeVwiLFwiZGV0dW5lXCJdKSx0aGlzLnNldChlKX0sdC5leHRlbmQodC5PbW5pT3NjaWxsYXRvcix0LlNvdXJjZSksdC5PbW5pT3NjaWxsYXRvci5kZWZhdWx0cz17ZnJlcXVlbmN5OjQ0MCxkZXR1bmU6MCx0eXBlOlwic2luZVwiLHBoYXNlOjB9O3ZhciBlPVwiUHVsc2VPc2NpbGxhdG9yXCIsaT1cIlBXTU9zY2lsbGF0b3JcIixuPVwiT3NjaWxsYXRvclwiLG89XCJGTU9zY2lsbGF0b3JcIixzPVwiQU1Pc2NpbGxhdG9yXCIscj1cIkZhdE9zY2lsbGF0b3JcIjt0Lk9tbmlPc2NpbGxhdG9yLnByb3RvdHlwZS5fc3RhcnQ9ZnVuY3Rpb24odCl7dGhpcy5fb3NjaWxsYXRvci5zdGFydCh0KX0sdC5PbW5pT3NjaWxsYXRvci5wcm90b3R5cGUuX3N0b3A9ZnVuY3Rpb24odCl7dGhpcy5fb3NjaWxsYXRvci5zdG9wKHQpfSx0Lk9tbmlPc2NpbGxhdG9yLnByb3RvdHlwZS5yZXN0YXJ0PWZ1bmN0aW9uKHQpe3RoaXMuX29zY2lsbGF0b3IucmVzdGFydCh0KX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuT21uaU9zY2lsbGF0b3IucHJvdG90eXBlLFwidHlwZVwiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1cIlwiO3JldHVybiB0aGlzLl9zb3VyY2VUeXBlPT09bz90PVwiZm1cIjp0aGlzLl9zb3VyY2VUeXBlPT09cz90PVwiYW1cIjp0aGlzLl9zb3VyY2VUeXBlPT09ciYmKHQ9XCJmYXRcIiksdCt0aGlzLl9vc2NpbGxhdG9yLnR5cGV9LHNldDpmdW5jdGlvbih0KXtcImZtXCI9PT10LnN1YnN0cigwLDIpPyh0aGlzLl9jcmVhdGVOZXdPc2NpbGxhdG9yKG8pLHRoaXMuX29zY2lsbGF0b3IudHlwZT10LnN1YnN0cigyKSk6XCJhbVwiPT09dC5zdWJzdHIoMCwyKT8odGhpcy5fY3JlYXRlTmV3T3NjaWxsYXRvcihzKSx0aGlzLl9vc2NpbGxhdG9yLnR5cGU9dC5zdWJzdHIoMikpOlwiZmF0XCI9PT10LnN1YnN0cigwLDMpPyh0aGlzLl9jcmVhdGVOZXdPc2NpbGxhdG9yKHIpLHRoaXMuX29zY2lsbGF0b3IudHlwZT10LnN1YnN0cigzKSk6XCJwd21cIj09PXQ/dGhpcy5fY3JlYXRlTmV3T3NjaWxsYXRvcihpKTpcInB1bHNlXCI9PT10P3RoaXMuX2NyZWF0ZU5ld09zY2lsbGF0b3IoZSk6KHRoaXMuX2NyZWF0ZU5ld09zY2lsbGF0b3IobiksdGhpcy5fb3NjaWxsYXRvci50eXBlPXQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk9tbmlPc2NpbGxhdG9yLnByb3RvdHlwZSxcInBhcnRpYWxzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vc2NpbGxhdG9yLnBhcnRpYWxzfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fb3NjaWxsYXRvci5wYXJ0aWFscz10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk9tbmlPc2NpbGxhdG9yLnByb3RvdHlwZSxcInBhcnRpYWxDb3VudFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3NjaWxsYXRvci5wYXJ0aWFsQ291bnR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9vc2NpbGxhdG9yLnBhcnRpYWxDb3VudD10fX0pLHQuT21uaU9zY2lsbGF0b3IucHJvdG90eXBlLnNldD1mdW5jdGlvbihlLGkpe3JldHVyblwidHlwZVwiPT09ZT90aGlzLnR5cGU9aTp0LmlzT2JqZWN0KGUpJiZlLmhhc093blByb3BlcnR5KFwidHlwZVwiKSYmKHRoaXMudHlwZT1lLnR5cGUpLHQucHJvdG90eXBlLnNldC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpc30sdC5PbW5pT3NjaWxsYXRvci5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX29zY2lsbGF0b3IuZ2V0KHQpO3JldHVybiBlLnR5cGU9dGhpcy50eXBlLGV9LHQuT21uaU9zY2lsbGF0b3IucHJvdG90eXBlLl9jcmVhdGVOZXdPc2NpbGxhdG9yPWZ1bmN0aW9uKGUpe2lmKGUhPT10aGlzLl9zb3VyY2VUeXBlKXt0aGlzLl9zb3VyY2VUeXBlPWU7dmFyIGk9dFtlXSxuPXRoaXMubm93KCk7aWYobnVsbCE9PXRoaXMuX29zY2lsbGF0b3Ipe3ZhciBvPXRoaXMuX29zY2lsbGF0b3I7by5zdG9wKG4pLHRoaXMuY29udGV4dC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7by5kaXNwb3NlKCksbz1udWxsfSx0aGlzLmJsb2NrVGltZSl9dGhpcy5fb3NjaWxsYXRvcj1uZXcgaSx0aGlzLmZyZXF1ZW5jeS5jb25uZWN0KHRoaXMuX29zY2lsbGF0b3IuZnJlcXVlbmN5KSx0aGlzLmRldHVuZS5jb25uZWN0KHRoaXMuX29zY2lsbGF0b3IuZGV0dW5lKSx0aGlzLl9vc2NpbGxhdG9yLmNvbm5lY3QodGhpcy5vdXRwdXQpLHRoaXMuc3RhdGU9PT10LlN0YXRlLlN0YXJ0ZWQmJnRoaXMuX29zY2lsbGF0b3Iuc3RhcnQobil9fSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5PbW5pT3NjaWxsYXRvci5wcm90b3R5cGUsXCJwaGFzZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3NjaWxsYXRvci5waGFzZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX29zY2lsbGF0b3IucGhhc2U9dH19KTt2YXIgYT17UHVsc2VPc2NpbGxhdG9yOlwicHVsc2VcIixQV01Pc2NpbGxhdG9yOlwicHdtXCIsT3NjaWxsYXRvcjpcIm9zY2lsbGF0b3JcIixGTU9zY2lsbGF0b3I6XCJmbVwiLEFNT3NjaWxsYXRvcjpcImFtXCIsRmF0T3NjaWxsYXRvcjpcImZhdFwifTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuT21uaU9zY2lsbGF0b3IucHJvdG90eXBlLFwic291cmNlVHlwZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYVt0aGlzLl9zb3VyY2VUeXBlXX0sc2V0OmZ1bmN0aW9uKHQpe3ZhciBlPVwic2luZVwiO1wicHdtXCIhPT10aGlzLl9vc2NpbGxhdG9yLnR5cGUmJlwicHVsc2VcIiE9PXRoaXMuX29zY2lsbGF0b3IudHlwZSYmKGU9dGhpcy5fb3NjaWxsYXRvci50eXBlKSx0PT09YS5GTU9zY2lsbGF0b3I/dGhpcy50eXBlPVwiZm1cIitlOnQ9PT1hLkFNT3NjaWxsYXRvcj90aGlzLnR5cGU9XCJhbVwiK2U6dD09PWEuRmF0T3NjaWxsYXRvcj90aGlzLnR5cGU9XCJmYXRcIitlOnQ9PT1hLk9zY2lsbGF0b3I/dGhpcy50eXBlPWU6dD09PWEuUHVsc2VPc2NpbGxhdG9yP3RoaXMudHlwZT1cInB1bHNlXCI6dD09PWEuUFdNT3NjaWxsYXRvciYmKHRoaXMudHlwZT1cInB3bVwiKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5PbW5pT3NjaWxsYXRvci5wcm90b3R5cGUsXCJiYXNlVHlwZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3NjaWxsYXRvci5iYXNlVHlwZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuc291cmNlVHlwZSE9PWEuUHVsc2VPc2NpbGxhdG9yJiZ0aGlzLnNvdXJjZVR5cGUhPT1hLlBXTU9zY2lsbGF0b3ImJih0aGlzLl9vc2NpbGxhdG9yLmJhc2VUeXBlPXQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk9tbmlPc2NpbGxhdG9yLnByb3RvdHlwZSxcIndpZHRoXCIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMuX3NvdXJjZVR5cGU9PT1lKXJldHVybiB0aGlzLl9vc2NpbGxhdG9yLndpZHRofX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk9tbmlPc2NpbGxhdG9yLnByb3RvdHlwZSxcImNvdW50XCIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMuX3NvdXJjZVR5cGU9PT1yKXJldHVybiB0aGlzLl9vc2NpbGxhdG9yLmNvdW50fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fc291cmNlVHlwZT09PXImJih0aGlzLl9vc2NpbGxhdG9yLmNvdW50PXQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk9tbmlPc2NpbGxhdG9yLnByb3RvdHlwZSxcInNwcmVhZFwiLHtnZXQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9zb3VyY2VUeXBlPT09cilyZXR1cm4gdGhpcy5fb3NjaWxsYXRvci5zcHJlYWR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9zb3VyY2VUeXBlPT09ciYmKHRoaXMuX29zY2lsbGF0b3Iuc3ByZWFkPXQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk9tbmlPc2NpbGxhdG9yLnByb3RvdHlwZSxcIm1vZHVsYXRpb25UeXBlXCIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMuX3NvdXJjZVR5cGU9PT1vfHx0aGlzLl9zb3VyY2VUeXBlPT09cylyZXR1cm4gdGhpcy5fb3NjaWxsYXRvci5tb2R1bGF0aW9uVHlwZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3NvdXJjZVR5cGUhPT1vJiZ0aGlzLl9zb3VyY2VUeXBlIT09c3x8KHRoaXMuX29zY2lsbGF0b3IubW9kdWxhdGlvblR5cGU9dCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuT21uaU9zY2lsbGF0b3IucHJvdG90eXBlLFwibW9kdWxhdGlvbkluZGV4XCIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMuX3NvdXJjZVR5cGU9PT1vKXJldHVybiB0aGlzLl9vc2NpbGxhdG9yLm1vZHVsYXRpb25JbmRleH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5PbW5pT3NjaWxsYXRvci5wcm90b3R5cGUsXCJoYXJtb25pY2l0eVwiLHtnZXQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9zb3VyY2VUeXBlPT09b3x8dGhpcy5fc291cmNlVHlwZT09PXMpcmV0dXJuIHRoaXMuX29zY2lsbGF0b3IuaGFybW9uaWNpdHl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuT21uaU9zY2lsbGF0b3IucHJvdG90eXBlLFwibW9kdWxhdGlvbkZyZXF1ZW5jeVwiLHtnZXQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9zb3VyY2VUeXBlPT09aSlyZXR1cm4gdGhpcy5fb3NjaWxsYXRvci5tb2R1bGF0aW9uRnJlcXVlbmN5fX0pLHQuT21uaU9zY2lsbGF0b3IucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5Tb3VyY2UucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl93cml0YWJsZShbXCJmcmVxdWVuY3lcIixcImRldHVuZVwiXSksdGhpcy5kZXR1bmUuZGlzcG9zZSgpLHRoaXMuZGV0dW5lPW51bGwsdGhpcy5mcmVxdWVuY3kuZGlzcG9zZSgpLHRoaXMuZnJlcXVlbmN5PW51bGwsdGhpcy5fb3NjaWxsYXRvci5kaXNwb3NlKCksdGhpcy5fb3NjaWxsYXRvcj1udWxsLHRoaXMuX3NvdXJjZVR5cGU9bnVsbCx0aGlzfSx0Lk9tbmlPc2NpbGxhdG9yfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDMwKSxpKDM3KSxpKDEpLGkoMjUpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5TeW50aD1mdW5jdGlvbihlKXtlPXQuZGVmYXVsdEFyZyhlLHQuU3ludGguZGVmYXVsdHMpLHQuTW9ub3Bob25pYy5jYWxsKHRoaXMsZSksdGhpcy5vc2NpbGxhdG9yPW5ldyB0Lk9tbmlPc2NpbGxhdG9yKGUub3NjaWxsYXRvciksdGhpcy5mcmVxdWVuY3k9dGhpcy5vc2NpbGxhdG9yLmZyZXF1ZW5jeSx0aGlzLmRldHVuZT10aGlzLm9zY2lsbGF0b3IuZGV0dW5lLHRoaXMuZW52ZWxvcGU9bmV3IHQuQW1wbGl0dWRlRW52ZWxvcGUoZS5lbnZlbG9wZSksdGhpcy5vc2NpbGxhdG9yLmNoYWluKHRoaXMuZW52ZWxvcGUsdGhpcy5vdXRwdXQpLHRoaXMuX3JlYWRPbmx5KFtcIm9zY2lsbGF0b3JcIixcImZyZXF1ZW5jeVwiLFwiZGV0dW5lXCIsXCJlbnZlbG9wZVwiXSl9LHQuZXh0ZW5kKHQuU3ludGgsdC5Nb25vcGhvbmljKSx0LlN5bnRoLmRlZmF1bHRzPXtvc2NpbGxhdG9yOnt0eXBlOlwidHJpYW5nbGVcIn0sZW52ZWxvcGU6e2F0dGFjazouMDA1LGRlY2F5Oi4xLHN1c3RhaW46LjMscmVsZWFzZToxfX0sdC5TeW50aC5wcm90b3R5cGUuX3RyaWdnZXJFbnZlbG9wZUF0dGFjaz1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmVudmVsb3BlLnRyaWdnZXJBdHRhY2sodCxlKSx0aGlzLm9zY2lsbGF0b3Iuc3RhcnQodCksMD09PXRoaXMuZW52ZWxvcGUuc3VzdGFpbiYmdGhpcy5vc2NpbGxhdG9yLnN0b3AodCt0aGlzLmVudmVsb3BlLmF0dGFjayt0aGlzLmVudmVsb3BlLmRlY2F5KSx0aGlzfSx0LlN5bnRoLnByb3RvdHlwZS5fdHJpZ2dlckVudmVsb3BlUmVsZWFzZT1mdW5jdGlvbih0KXtyZXR1cm4gdD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLmVudmVsb3BlLnRyaWdnZXJSZWxlYXNlKHQpLHRoaXMub3NjaWxsYXRvci5zdG9wKHQrdGhpcy5lbnZlbG9wZS5yZWxlYXNlKSx0aGlzfSx0LlN5bnRoLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuTW9ub3Bob25pYy5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcIm9zY2lsbGF0b3JcIixcImZyZXF1ZW5jeVwiLFwiZGV0dW5lXCIsXCJlbnZlbG9wZVwiXSksdGhpcy5vc2NpbGxhdG9yLmRpc3Bvc2UoKSx0aGlzLm9zY2lsbGF0b3I9bnVsbCx0aGlzLmVudmVsb3BlLmRpc3Bvc2UoKSx0aGlzLmVudmVsb3BlPW51bGwsdGhpcy5mcmVxdWVuY3k9bnVsbCx0aGlzLmRldHVuZT1udWxsLHRoaXN9LHQuU3ludGh9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNiksaSgxMSksaSgzMSldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3QuTm9pc2U9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJ0eXBlXCJdLHQuTm9pc2UpO3QuU291cmNlLmNhbGwodGhpcyxlKSx0aGlzLl9zb3VyY2U9bnVsbCx0aGlzLl90eXBlPWUudHlwZSx0aGlzLl9wbGF5YmFja1JhdGU9ZS5wbGF5YmFja1JhdGV9LHQuZXh0ZW5kKHQuTm9pc2UsdC5Tb3VyY2UpLHQuTm9pc2UuZGVmYXVsdHM9e3R5cGU6XCJ3aGl0ZVwiLHBsYXliYWNrUmF0ZToxfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5Ob2lzZS5wcm90b3R5cGUsXCJ0eXBlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90eXBlfSxzZXQ6ZnVuY3Rpb24oaSl7aWYodGhpcy5fdHlwZSE9PWkpe2lmKCEoaSBpbiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVG9uZS5Ob2lzZTogaW52YWxpZCB0eXBlOiBcIitpKTtpZih0aGlzLl90eXBlPWksdGhpcy5zdGF0ZT09PXQuU3RhdGUuU3RhcnRlZCl7dmFyIG49dGhpcy5ub3coKTt0aGlzLl9zdG9wKG4pLHRoaXMuX3N0YXJ0KG4pfX19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuTm9pc2UucHJvdG90eXBlLFwicGxheWJhY2tSYXRlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9wbGF5YmFja1JhdGU9dCx0aGlzLl9zb3VyY2UmJih0aGlzLl9zb3VyY2UucGxheWJhY2tSYXRlLnZhbHVlPXQpfX0pLHQuTm9pc2UucHJvdG90eXBlLl9zdGFydD1mdW5jdGlvbihpKXt2YXIgbj1lW3RoaXMuX3R5cGVdO3RoaXMuX3NvdXJjZT1uZXcgdC5CdWZmZXJTb3VyY2UobikuY29ubmVjdCh0aGlzLm91dHB1dCksdGhpcy5fc291cmNlLmxvb3A9ITAsdGhpcy5fc291cmNlLnBsYXliYWNrUmF0ZS52YWx1ZT10aGlzLl9wbGF5YmFja1JhdGUsdGhpcy5fc291cmNlLnN0YXJ0KHRoaXMudG9TZWNvbmRzKGkpLE1hdGgucmFuZG9tKCkqKG4uZHVyYXRpb24tLjAwMSkpfSx0Lk5vaXNlLnByb3RvdHlwZS5fc3RvcD1mdW5jdGlvbih0KXt0aGlzLl9zb3VyY2UmJih0aGlzLl9zb3VyY2Uuc3RvcCh0aGlzLnRvU2Vjb25kcyh0KSksdGhpcy5fc291cmNlPW51bGwpfSx0Lk5vaXNlLnByb3RvdHlwZS5yZXN0YXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9zdG9wKHQpLHRoaXMuX3N0YXJ0KHQpLHRoaXN9LHQuTm9pc2UucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5Tb3VyY2UucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSxudWxsIT09dGhpcy5fc291cmNlJiYodGhpcy5fc291cmNlLmRpc2Nvbm5lY3QoKSx0aGlzLl9zb3VyY2U9bnVsbCksdGhpcy5fYnVmZmVyPW51bGwsdGhpc307dmFyIGU9e30saT17fTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJwaW5rXCIse2dldDpmdW5jdGlvbigpe2lmKCFpLnBpbmspe2Zvcih2YXIgZT1bXSxuPTA7bjwyO24rKyl7dmFyIG8scyxyLGEsbCxoLHUsYz1uZXcgRmxvYXQzMkFycmF5KDIyMDUwMCk7ZVtuXT1jLG89cz1yPWE9bD1oPXU9MDtmb3IodmFyIHA9MDtwPDIyMDUwMDtwKyspe3ZhciBmPTIqTWF0aC5yYW5kb20oKS0xO289Ljk5ODg2Km8rLjA1NTUxNzkqZixzPS45OTMzMipzKy4wNzUwNzU5KmYscj0uOTY5KnIrLjE1Mzg1MipmLGE9Ljg2NjUqYSsuMzEwNDg1NipmLGw9LjU1KmwrLjUzMjk1MjIqZixoPS0uNzYxNipoLS4wMTY4OTgqZixjW3BdPW8rcytyK2ErbCtoK3UrLjUzNjIqZixjW3BdKj0uMTEsdT0uMTE1OTI2KmZ9fWkucGluaz0obmV3IHQuQnVmZmVyKS5mcm9tQXJyYXkoZSl9cmV0dXJuIGkucGlua319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImJyb3duXCIse2dldDpmdW5jdGlvbigpe2lmKCFpLmJyb3duKXtmb3IodmFyIGU9W10sbj0wO248MjtuKyspe3ZhciBvPW5ldyBGbG9hdDMyQXJyYXkoMjIwNTAwKTtlW25dPW87Zm9yKHZhciBzPTAscj0wO3I8MjIwNTAwO3IrKyl7dmFyIGE9MipNYXRoLnJhbmRvbSgpLTE7b1tyXT0ocysuMDIqYSkvMS4wMixzPW9bcl0sb1tyXSo9My41fX1pLmJyb3duPShuZXcgdC5CdWZmZXIpLmZyb21BcnJheShlKX1yZXR1cm4gaS5icm93bn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIndoaXRlXCIse2dldDpmdW5jdGlvbigpe2lmKCFpLndoaXRlKXtmb3IodmFyIGU9W10sbj0wO248MjtuKyspe3ZhciBvPW5ldyBGbG9hdDMyQXJyYXkoMjIwNTAwKTtlW25dPW87Zm9yKHZhciBzPTA7czwyMjA1MDA7cysrKW9bc109MipNYXRoLnJhbmRvbSgpLTF9aS53aGl0ZT0obmV3IHQuQnVmZmVyKS5mcm9tQXJyYXkoZSl9cmV0dXJuIGkud2hpdGV9fSksdC5Ob2lzZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgyNyksaSgyMCksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7dC5NYXN0ZXI9ZnVuY3Rpb24oKXt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLHQuZ2V0Q29udGV4dChmdW5jdGlvbigpe3RoaXMuY3JlYXRlSW5zT3V0cygxLDApLHRoaXMuX3ZvbHVtZT10aGlzLm91dHB1dD1uZXcgdC5Wb2x1bWUsdGhpcy52b2x1bWU9dGhpcy5fdm9sdW1lLnZvbHVtZSx0aGlzLl9yZWFkT25seShcInZvbHVtZVwiKSx0aGlzLmlucHV0LmNoYWluKHRoaXMub3V0cHV0LHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiksdGhpcy5jb250ZXh0Lm1hc3Rlcj10aGlzfS5iaW5kKHRoaXMpKX0sdC5leHRlbmQodC5NYXN0ZXIsdC5BdWRpb05vZGUpLHQuTWFzdGVyLmRlZmF1bHRzPXt2b2x1bWU6MCxtdXRlOiExfSx0Lk1hc3Rlci5wcm90b3R5cGUuaXNNYXN0ZXI9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuTWFzdGVyLnByb3RvdHlwZSxcIm11dGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZvbHVtZS5tdXRlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fdm9sdW1lLm11dGU9dH19KSx0Lk1hc3Rlci5wcm90b3R5cGUuY2hhaW49ZnVuY3Rpb24oKXt0aGlzLmlucHV0LmRpc2Nvbm5lY3QoKSx0aGlzLmlucHV0LmNoYWluLmFwcGx5KHRoaXMuaW5wdXQsYXJndW1lbnRzKSxhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aC0xXS5jb25uZWN0KHRoaXMub3V0cHV0KX0sdC5NYXN0ZXIucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFwidm9sdW1lXCIpLHRoaXMuX3ZvbHVtZS5kaXNwb3NlKCksdGhpcy5fdm9sdW1lPW51bGwsdGhpcy52b2x1bWU9bnVsbH0sdC5BdWRpb05vZGUucHJvdG90eXBlLnRvTWFzdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29ubmVjdCh0aGlzLmNvbnRleHQubWFzdGVyKSx0aGlzfTt2YXIgZT10Lk1hc3RlcjtyZXR1cm4gdC5NYXN0ZXI9bmV3IGUsdC5Db250ZXh0Lm9uKFwiaW5pdFwiLGZ1bmN0aW9uKGkpe2kubWFzdGVyJiZpLm1hc3Rlci5pc01hc3Rlcj90Lk1hc3Rlcj1pLm1hc3Rlcjp0Lk1hc3Rlcj1uZXcgZX0pLHQuQ29udGV4dC5vbihcImNsb3NlXCIsZnVuY3Rpb24odCl7dC5tYXN0ZXImJnQubWFzdGVyLmlzTWFzdGVyJiZ0Lm1hc3Rlci5kaXNwb3NlKCl9KSx0Lk1hc3Rlcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg4OSksaSg0NyldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkZyZXF1ZW5jeUVudmVsb3BlPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiYXR0YWNrXCIsXCJkZWNheVwiLFwic3VzdGFpblwiLFwicmVsZWFzZVwiXSx0LkVudmVsb3BlKTtlPXQuZGVmYXVsdEFyZyhlLHQuRnJlcXVlbmN5RW52ZWxvcGUuZGVmYXVsdHMpLHQuU2NhbGVkRW52ZWxvcGUuY2FsbCh0aGlzLGUpLHRoaXMuX29jdGF2ZXM9ZS5vY3RhdmVzLHRoaXMuYmFzZUZyZXF1ZW5jeT1lLmJhc2VGcmVxdWVuY3ksdGhpcy5vY3RhdmVzPWUub2N0YXZlcyx0aGlzLmV4cG9uZW50PWUuZXhwb25lbnR9LHQuZXh0ZW5kKHQuRnJlcXVlbmN5RW52ZWxvcGUsdC5FbnZlbG9wZSksdC5GcmVxdWVuY3lFbnZlbG9wZS5kZWZhdWx0cz17YmFzZUZyZXF1ZW5jeToyMDAsb2N0YXZlczo0LGV4cG9uZW50OjF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkZyZXF1ZW5jeUVudmVsb3BlLnByb3RvdHlwZSxcImJhc2VGcmVxdWVuY3lcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NjYWxlLm1pbn0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3NjYWxlLm1pbj10aGlzLnRvRnJlcXVlbmN5KHQpLHRoaXMub2N0YXZlcz10aGlzLl9vY3RhdmVzfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkZyZXF1ZW5jeUVudmVsb3BlLnByb3RvdHlwZSxcIm9jdGF2ZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29jdGF2ZXN9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9vY3RhdmVzPXQsdGhpcy5fc2NhbGUubWF4PXRoaXMuYmFzZUZyZXF1ZW5jeSpNYXRoLnBvdygyLHQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkZyZXF1ZW5jeUVudmVsb3BlLnByb3RvdHlwZSxcImV4cG9uZW50XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9leHAudmFsdWV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9leHAudmFsdWU9dH19KSx0LkZyZXF1ZW5jeUVudmVsb3BlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU2NhbGVkRW52ZWxvcGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzfSx0LkZyZXF1ZW5jeUVudmVsb3BlfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDI2KSxpKDYxKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuU2NhbGVFeHA9ZnVuY3Rpb24oZSxpLG4pe3QuU2lnbmFsQmFzZS5jYWxsKHRoaXMpLHRoaXMuX3NjYWxlPXRoaXMub3V0cHV0PW5ldyB0LlNjYWxlKGUsaSksdGhpcy5fZXhwPXRoaXMuaW5wdXQ9bmV3IHQuUG93KHQuZGVmYXVsdEFyZyhuLDIpKSx0aGlzLl9leHAuY29ubmVjdCh0aGlzLl9zY2FsZSl9LHQuZXh0ZW5kKHQuU2NhbGVFeHAsdC5TaWduYWxCYXNlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5TY2FsZUV4cC5wcm90b3R5cGUsXCJleHBvbmVudFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXhwLnZhbHVlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fZXhwLnZhbHVlPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuU2NhbGVFeHAucHJvdG90eXBlLFwibWluXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY2FsZS5taW59LHNldDpmdW5jdGlvbih0KXt0aGlzLl9zY2FsZS5taW49dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5TY2FsZUV4cC5wcm90b3R5cGUsXCJtYXhcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NjYWxlLm1heH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3NjYWxlLm1heD10fX0pLHQuU2NhbGVFeHAucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5TaWduYWxCYXNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fc2NhbGUuZGlzcG9zZSgpLHRoaXMuX3NjYWxlPW51bGwsdGhpcy5fZXhwLmRpc3Bvc2UoKSx0aGlzLl9leHA9bnVsbCx0aGlzfSx0LlNjYWxlRXhwfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDE0KSxpKDIpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5Db21wcmVzc29yPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1widGhyZXNob2xkXCIsXCJyYXRpb1wiXSx0LkNvbXByZXNzb3IpO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5fY29tcHJlc3Nvcj10aGlzLmlucHV0PXRoaXMub3V0cHV0PXRoaXMuY29udGV4dC5jcmVhdGVEeW5hbWljc0NvbXByZXNzb3IoKSx0aGlzLnRocmVzaG9sZD1uZXcgdC5QYXJhbSh7cGFyYW06dGhpcy5fY29tcHJlc3Nvci50aHJlc2hvbGQsdW5pdHM6dC5UeXBlLkRlY2liZWxzLGNvbnZlcnQ6ITF9KSx0aGlzLmF0dGFjaz1uZXcgdC5QYXJhbSh0aGlzLl9jb21wcmVzc29yLmF0dGFjayx0LlR5cGUuVGltZSksdGhpcy5yZWxlYXNlPW5ldyB0LlBhcmFtKHRoaXMuX2NvbXByZXNzb3IucmVsZWFzZSx0LlR5cGUuVGltZSksdGhpcy5rbmVlPW5ldyB0LlBhcmFtKHtwYXJhbTp0aGlzLl9jb21wcmVzc29yLmtuZWUsdW5pdHM6dC5UeXBlLkRlY2liZWxzLGNvbnZlcnQ6ITF9KSx0aGlzLnJhdGlvPW5ldyB0LlBhcmFtKHtwYXJhbTp0aGlzLl9jb21wcmVzc29yLnJhdGlvLGNvbnZlcnQ6ITF9KSx0aGlzLl9yZWFkT25seShbXCJrbmVlXCIsXCJyZWxlYXNlXCIsXCJhdHRhY2tcIixcInJhdGlvXCIsXCJ0aHJlc2hvbGRcIl0pLHRoaXMuc2V0KGUpfSx0LmV4dGVuZCh0LkNvbXByZXNzb3IsdC5BdWRpb05vZGUpLHQuQ29tcHJlc3Nvci5kZWZhdWx0cz17cmF0aW86MTIsdGhyZXNob2xkOi0yNCxyZWxlYXNlOi4yNSxhdHRhY2s6LjAwMyxrbmVlOjMwfSx0LkNvbXByZXNzb3IucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl93cml0YWJsZShbXCJrbmVlXCIsXCJyZWxlYXNlXCIsXCJhdHRhY2tcIixcInJhdGlvXCIsXCJ0aHJlc2hvbGRcIl0pLHRoaXMuX2NvbXByZXNzb3IuZGlzY29ubmVjdCgpLHRoaXMuX2NvbXByZXNzb3I9bnVsbCx0aGlzLmF0dGFjay5kaXNwb3NlKCksdGhpcy5hdHRhY2s9bnVsbCx0aGlzLnJlbGVhc2UuZGlzcG9zZSgpLHRoaXMucmVsZWFzZT1udWxsLHRoaXMudGhyZXNob2xkLmRpc3Bvc2UoKSx0aGlzLnRocmVzaG9sZD1udWxsLHRoaXMucmF0aW8uZGlzcG9zZSgpLHRoaXMucmF0aW89bnVsbCx0aGlzLmtuZWUuZGlzcG9zZSgpLHRoaXMua25lZT1udWxsLHRoaXN9LHQuQ29tcHJlc3Nvcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgyKSxpKDk2KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuQW5hbHlzZXI9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJ0eXBlXCIsXCJzaXplXCJdLHQuQW5hbHlzZXIpO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5fYW5hbHlzZXI9dGhpcy5pbnB1dD10aGlzLm91dHB1dD10aGlzLmNvbnRleHQuY3JlYXRlQW5hbHlzZXIoKSx0aGlzLl90eXBlPWUudHlwZSx0aGlzLl9idWZmZXI9bnVsbCx0aGlzLnNpemU9ZS5zaXplLHRoaXMudHlwZT1lLnR5cGV9LHQuZXh0ZW5kKHQuQW5hbHlzZXIsdC5BdWRpb05vZGUpLHQuQW5hbHlzZXIuZGVmYXVsdHM9e3NpemU6MTAyNCx0eXBlOlwiZmZ0XCIsc21vb3RoaW5nOi44fSx0LkFuYWx5c2VyLlR5cGU9e1dhdmVmb3JtOlwid2F2ZWZvcm1cIixGRlQ6XCJmZnRcIn0sdC5BbmFseXNlci5wcm90b3R5cGUuZ2V0VmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdHlwZT09PXQuQW5hbHlzZXIuVHlwZS5GRlQ/dGhpcy5fYW5hbHlzZXIuZ2V0RmxvYXRGcmVxdWVuY3lEYXRhKHRoaXMuX2J1ZmZlcik6dGhpcy5fdHlwZT09PXQuQW5hbHlzZXIuVHlwZS5XYXZlZm9ybSYmdGhpcy5fYW5hbHlzZXIuZ2V0RmxvYXRUaW1lRG9tYWluRGF0YSh0aGlzLl9idWZmZXIpLHRoaXMuX2J1ZmZlcn0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQW5hbHlzZXIucHJvdG90eXBlLFwic2l6ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYW5hbHlzZXIuZnJlcXVlbmN5QmluQ291bnR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9hbmFseXNlci5mZnRTaXplPTIqdCx0aGlzLl9idWZmZXI9bmV3IEZsb2F0MzJBcnJheSh0KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BbmFseXNlci5wcm90b3R5cGUsXCJ0eXBlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90eXBlfSxzZXQ6ZnVuY3Rpb24oZSl7aWYoZSE9PXQuQW5hbHlzZXIuVHlwZS5XYXZlZm9ybSYmZSE9PXQuQW5hbHlzZXIuVHlwZS5GRlQpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRvbmUuQW5hbHlzZXI6IGludmFsaWQgdHlwZTogXCIrZSk7dGhpcy5fdHlwZT1lfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkFuYWx5c2VyLnByb3RvdHlwZSxcInNtb290aGluZ1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYW5hbHlzZXIuc21vb3RoaW5nVGltZUNvbnN0YW50fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fYW5hbHlzZXIuc21vb3RoaW5nVGltZUNvbnN0YW50PXR9fSksdC5BbmFseXNlci5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3QuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fYW5hbHlzZXIuZGlzY29ubmVjdCgpLHRoaXMuX2FuYWx5c2VyPW51bGwsdGhpcy5fYnVmZmVyPW51bGx9LHQuQW5hbHlzZXJ9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNjUpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtyZXR1cm4gdC5UcmFuc3BvcnRUaW1lPWZ1bmN0aW9uKGUsaSl7aWYoISh0aGlzIGluc3RhbmNlb2YgdC5UcmFuc3BvcnRUaW1lKSlyZXR1cm4gbmV3IHQuVHJhbnNwb3J0VGltZShlLGkpO3QuVGltZS5jYWxsKHRoaXMsZSxpKX0sdC5leHRlbmQodC5UcmFuc3BvcnRUaW1lLHQuVGltZSksdC5UcmFuc3BvcnRUaW1lLnByb3RvdHlwZS5fbm93PWZ1bmN0aW9uKCl7cmV0dXJuIHQuVHJhbnNwb3J0LnNlY29uZHN9LHQuVHJhbnNwb3J0VGltZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg2NCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe3QuRnJlcXVlbmN5PWZ1bmN0aW9uKGUsaSl7aWYoISh0aGlzIGluc3RhbmNlb2YgdC5GcmVxdWVuY3kpKXJldHVybiBuZXcgdC5GcmVxdWVuY3koZSxpKTt0LlRpbWVCYXNlLmNhbGwodGhpcyxlLGkpfSx0LmV4dGVuZCh0LkZyZXF1ZW5jeSx0LlRpbWVCYXNlKSx0LkZyZXF1ZW5jeS5wcm90b3R5cGUuX2V4cHJlc3Npb25zPU9iamVjdC5hc3NpZ24oe30sdC5UaW1lQmFzZS5wcm90b3R5cGUuX2V4cHJlc3Npb25zLHttaWRpOntyZWdleHA6L14oXFxkKyg/OlxcLlxcZCspP21pZGkpLyxtZXRob2Q6ZnVuY3Rpb24oZSl7cmV0dXJuXCJtaWRpXCI9PT10aGlzLl9kZWZhdWx0VW5pdHM/ZTp0LkZyZXF1ZW5jeS5tdG9mKGUpfX0sbm90ZTp7cmVnZXhwOi9eKFthLWddezF9KD86YnwjfHh8YmIpPykoLT9bMC05XSspL2ksbWV0aG9kOmZ1bmN0aW9uKGksbil7dmFyIG89ZVtpLnRvTG93ZXJDYXNlKCldKzEyKihwYXJzZUludChuKSsxKTtyZXR1cm5cIm1pZGlcIj09PXRoaXMuX2RlZmF1bHRVbml0cz9vOnQuRnJlcXVlbmN5Lm10b2Yobyl9fSx0cjp7cmVnZXhwOi9eKFxcZCsoPzpcXC5cXGQrKT8pOihcXGQrKD86XFwuXFxkKyk/KTo/KFxcZCsoPzpcXC5cXGQrKT8pPy8sbWV0aG9kOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj0xO3JldHVybiB0JiZcIjBcIiE9PXQmJihuKj10aGlzLl9iZWF0c1RvVW5pdHModGhpcy5fZ2V0VGltZVNpZ25hdHVyZSgpKnBhcnNlRmxvYXQodCkpKSxlJiZcIjBcIiE9PWUmJihuKj10aGlzLl9iZWF0c1RvVW5pdHMocGFyc2VGbG9hdChlKSkpLGkmJlwiMFwiIT09aSYmKG4qPXRoaXMuX2JlYXRzVG9Vbml0cyhwYXJzZUZsb2F0KGkpLzQpKSxufX19KSx0LkZyZXF1ZW5jeS5wcm90b3R5cGUudHJhbnNwb3NlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnZhbHVlT2YoKSp0LmludGVydmFsVG9GcmVxdWVuY3lSYXRpbyhlKSl9LHQuRnJlcXVlbmN5LnByb3RvdHlwZS5oYXJtb25pemU9ZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRyYW5zcG9zZSh0KX0uYmluZCh0aGlzKSl9LHQuRnJlcXVlbmN5LnByb3RvdHlwZS50b01pZGk9ZnVuY3Rpb24oKXtyZXR1cm4gdC5GcmVxdWVuY3kuZnRvbSh0aGlzLnZhbHVlT2YoKSl9LHQuRnJlcXVlbmN5LnByb3RvdHlwZS50b05vdGU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnRvRnJlcXVlbmN5KCksbj1NYXRoLmxvZzIoZS90LkZyZXF1ZW5jeS5BNCksbz1NYXRoLnJvdW5kKDEyKm4pKzU3LHM9TWF0aC5mbG9vcihvLzEyKTtyZXR1cm4gczwwJiYobys9LTEyKnMpLGlbbyUxMl0rcy50b1N0cmluZygpfSx0LkZyZXF1ZW5jeS5wcm90b3R5cGUudG9TZWNvbmRzPWZ1bmN0aW9uKCl7cmV0dXJuIDEvdC5UaW1lQmFzZS5wcm90b3R5cGUudG9TZWNvbmRzLmNhbGwodGhpcyl9LHQuRnJlcXVlbmN5LnByb3RvdHlwZS50b0ZyZXF1ZW5jeT1mdW5jdGlvbigpe3JldHVybiB0LlRpbWVCYXNlLnByb3RvdHlwZS50b0ZyZXF1ZW5jeS5jYWxsKHRoaXMpfSx0LkZyZXF1ZW5jeS5wcm90b3R5cGUudG9UaWNrcz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX2JlYXRzVG9Vbml0cygxKSxpPXRoaXMudmFsdWVPZigpL2U7cmV0dXJuIE1hdGguZmxvb3IoaSp0LlRyYW5zcG9ydC5QUFEpfSx0LkZyZXF1ZW5jeS5wcm90b3R5cGUuX25vQXJnPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LHQuRnJlcXVlbmN5LnByb3RvdHlwZS5fZnJlcXVlbmN5VG9Vbml0cz1mdW5jdGlvbih0KXtyZXR1cm4gdH0sdC5GcmVxdWVuY3kucHJvdG90eXBlLl90aWNrc1RvVW5pdHM9ZnVuY3Rpb24oZSl7cmV0dXJuIDEvKDYwKmUvKHQuVHJhbnNwb3J0LmJwbS52YWx1ZSp0LlRyYW5zcG9ydC5QUFEpKX0sdC5GcmVxdWVuY3kucHJvdG90eXBlLl9iZWF0c1RvVW5pdHM9ZnVuY3Rpb24oZSl7cmV0dXJuIDEvdC5UaW1lQmFzZS5wcm90b3R5cGUuX2JlYXRzVG9Vbml0cy5jYWxsKHRoaXMsZSl9LHQuRnJlcXVlbmN5LnByb3RvdHlwZS5fc2Vjb25kc1RvVW5pdHM9ZnVuY3Rpb24odCl7cmV0dXJuIDEvdH0sdC5GcmVxdWVuY3kucHJvdG90eXBlLl9kZWZhdWx0VW5pdHM9XCJoelwiO3ZhciBlPXtjYmI6LTIsY2I6LTEsYzowLFwiYyNcIjoxLGN4OjIsZGJiOjAsZGI6MSxkOjIsXCJkI1wiOjMsZHg6NCxlYmI6MixlYjozLGU6NCxcImUjXCI6NSxleDo2LGZiYjozLGZiOjQsZjo1LFwiZiNcIjo2LGZ4OjcsZ2JiOjUsZ2I6NixnOjcsXCJnI1wiOjgsZ3g6OSxhYmI6NyxhYjo4LGE6OSxcImEjXCI6MTAsYXg6MTEsYmJiOjksYmI6MTAsYjoxMSxcImIjXCI6MTIsYng6MTN9LGk9W1wiQ1wiLFwiQyNcIixcIkRcIixcIkQjXCIsXCJFXCIsXCJGXCIsXCJGI1wiLFwiR1wiLFwiRyNcIixcIkFcIixcIkEjXCIsXCJCXCJdO3JldHVybiB0LkZyZXF1ZW5jeS5BND00NDAsdC5GcmVxdWVuY3kubXRvZj1mdW5jdGlvbihlKXtyZXR1cm4gdC5GcmVxdWVuY3kuQTQqTWF0aC5wb3coMiwoZS02OSkvMTIpfSx0LkZyZXF1ZW5jeS5mdG9tPWZ1bmN0aW9uKGUpe3JldHVybiA2OStNYXRoLnJvdW5kKDEyKk1hdGgubG9nMihlL3QuRnJlcXVlbmN5LkE0KSl9LHQuRnJlcXVlbmN5fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDEpLGkoNjEpLGkoNCksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuRW52ZWxvcGU9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJhdHRhY2tcIixcImRlY2F5XCIsXCJzdXN0YWluXCIsXCJyZWxlYXNlXCJdLHQuRW52ZWxvcGUpO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5hdHRhY2s9ZS5hdHRhY2ssdGhpcy5kZWNheT1lLmRlY2F5LHRoaXMuc3VzdGFpbj1lLnN1c3RhaW4sdGhpcy5yZWxlYXNlPWUucmVsZWFzZSx0aGlzLl9hdHRhY2tDdXJ2ZT1cImxpbmVhclwiLHRoaXMuX3JlbGVhc2VDdXJ2ZT1cImV4cG9uZW50aWFsXCIsdGhpcy5fc2lnPXRoaXMub3V0cHV0PW5ldyB0LlNpZ25hbCgwKSx0aGlzLmF0dGFja0N1cnZlPWUuYXR0YWNrQ3VydmUsdGhpcy5yZWxlYXNlQ3VydmU9ZS5yZWxlYXNlQ3VydmUsdGhpcy5kZWNheUN1cnZlPWUuZGVjYXlDdXJ2ZX0sdC5leHRlbmQodC5FbnZlbG9wZSx0LkF1ZGlvTm9kZSksdC5FbnZlbG9wZS5kZWZhdWx0cz17YXR0YWNrOi4wMSxkZWNheTouMSxzdXN0YWluOi41LHJlbGVhc2U6MSxhdHRhY2tDdXJ2ZTpcImxpbmVhclwiLGRlY2F5Q3VydmU6XCJleHBvbmVudGlhbFwiLHJlbGVhc2VDdXJ2ZTpcImV4cG9uZW50aWFsXCJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkVudmVsb3BlLnByb3RvdHlwZSxcInZhbHVlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFZhbHVlQXRUaW1lKHRoaXMubm93KCkpfX0pLHQuRW52ZWxvcGUucHJvdG90eXBlLl9nZXRDdXJ2ZT1mdW5jdGlvbihlLGkpe2lmKHQuaXNTdHJpbmcoZSkpcmV0dXJuIGU7aWYodC5pc0FycmF5KGUpKXtmb3IodmFyIG4gaW4gdC5FbnZlbG9wZS5UeXBlKWlmKHQuRW52ZWxvcGUuVHlwZVtuXVtpXT09PWUpcmV0dXJuIG47cmV0dXJuIGV9fSx0LkVudmVsb3BlLnByb3RvdHlwZS5fc2V0Q3VydmU9ZnVuY3Rpb24oZSxpLG4pe2lmKHQuRW52ZWxvcGUuVHlwZS5oYXNPd25Qcm9wZXJ0eShuKSl7dmFyIG89dC5FbnZlbG9wZS5UeXBlW25dO3QuaXNPYmplY3Qobyk/dGhpc1tlXT1vW2ldOnRoaXNbZV09b31lbHNle2lmKCF0LmlzQXJyYXkobikpdGhyb3cgbmV3IEVycm9yKFwiVG9uZS5FbnZlbG9wZTogaW52YWxpZCBjdXJ2ZTogXCIrbik7dGhpc1tlXT1ufX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuRW52ZWxvcGUucHJvdG90eXBlLFwiYXR0YWNrQ3VydmVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldEN1cnZlKHRoaXMuX2F0dGFja0N1cnZlLFwiSW5cIil9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9zZXRDdXJ2ZShcIl9hdHRhY2tDdXJ2ZVwiLFwiSW5cIix0KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5FbnZlbG9wZS5wcm90b3R5cGUsXCJyZWxlYXNlQ3VydmVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldEN1cnZlKHRoaXMuX3JlbGVhc2VDdXJ2ZSxcIk91dFwiKX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3NldEN1cnZlKFwiX3JlbGVhc2VDdXJ2ZVwiLFwiT3V0XCIsdCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuRW52ZWxvcGUucHJvdG90eXBlLFwiZGVjYXlDdXJ2ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVjYXlDdXJ2ZX0sc2V0OmZ1bmN0aW9uKHQpe2lmKCFbXCJsaW5lYXJcIixcImV4cG9uZW50aWFsXCJdLmluY2x1ZGVzKHQpKXRocm93IG5ldyBFcnJvcihcIlRvbmUuRW52ZWxvcGU6IGludmFsaWQgY3VydmU6IFwiK3QpO3RoaXMuX2RlY2F5Q3VydmU9dH19KSx0LkVudmVsb3BlLnByb3RvdHlwZS50cmlnZ2VyQXR0YWNrPWZ1bmN0aW9uKGUsaSl7dGhpcy5sb2coXCJ0cmlnZ2VyQXR0YWNrXCIsZSxpKSxlPXRoaXMudG9TZWNvbmRzKGUpO3ZhciBuPXRoaXMudG9TZWNvbmRzKHRoaXMuYXR0YWNrKSxvPXRoaXMudG9TZWNvbmRzKHRoaXMuZGVjYXkpO2k9dC5kZWZhdWx0QXJnKGksMSk7dmFyIHM9dGhpcy5nZXRWYWx1ZUF0VGltZShlKTtzPjAmJihuPSgxLXMpLygxL24pKTtpZihcImxpbmVhclwiPT09dGhpcy5fYXR0YWNrQ3VydmUpdGhpcy5fc2lnLmxpbmVhclJhbXBUbyhpLG4sZSk7ZWxzZSBpZihcImV4cG9uZW50aWFsXCI9PT10aGlzLl9hdHRhY2tDdXJ2ZSl0aGlzLl9zaWcudGFyZ2V0UmFtcFRvKGksbixlKTtlbHNlIGlmKG4+MCl7dGhpcy5fc2lnLmNhbmNlbEFuZEhvbGRBdFRpbWUoZSk7Zm9yKHZhciByPXRoaXMuX2F0dGFja0N1cnZlLGE9MTthPHIubGVuZ3RoO2ErKylpZihyW2EtMV08PXMmJnM8PXJbYV0peyhyPXRoaXMuX2F0dGFja0N1cnZlLnNsaWNlKGEpKVswXT1zO2JyZWFrfXRoaXMuX3NpZy5zZXRWYWx1ZUN1cnZlQXRUaW1lKHIsZSxuLGkpfWlmKG8pe3ZhciBsPWkqdGhpcy5zdXN0YWluLGg9ZStuO3RoaXMubG9nKFwiZGVjYXlcIixoKSxcImxpbmVhclwiPT09dGhpcy5fZGVjYXlDdXJ2ZT90aGlzLl9zaWcubGluZWFyUmFtcFRvKGwsbyxoK3RoaXMuc2FtcGxlVGltZSk6XCJleHBvbmVudGlhbFwiPT09dGhpcy5fZGVjYXlDdXJ2ZSYmdGhpcy5fc2lnLmV4cG9uZW50aWFsQXBwcm9hY2hWYWx1ZUF0VGltZShsLGgsbyl9cmV0dXJuIHRoaXN9LHQuRW52ZWxvcGUucHJvdG90eXBlLnRyaWdnZXJSZWxlYXNlPWZ1bmN0aW9uKGUpe3RoaXMubG9nKFwidHJpZ2dlclJlbGVhc2VcIixlKSxlPXRoaXMudG9TZWNvbmRzKGUpO3ZhciBpPXRoaXMuZ2V0VmFsdWVBdFRpbWUoZSk7aWYoaT4wKXt2YXIgbj10aGlzLnRvU2Vjb25kcyh0aGlzLnJlbGVhc2UpO2lmKFwibGluZWFyXCI9PT10aGlzLl9yZWxlYXNlQ3VydmUpdGhpcy5fc2lnLmxpbmVhclJhbXBUbygwLG4sZSk7ZWxzZSBpZihcImV4cG9uZW50aWFsXCI9PT10aGlzLl9yZWxlYXNlQ3VydmUpdGhpcy5fc2lnLnRhcmdldFJhbXBUbygwLG4sZSk7ZWxzZXt2YXIgbz10aGlzLl9yZWxlYXNlQ3VydmU7dC5pc0FycmF5KG8pJiYodGhpcy5fc2lnLmNhbmNlbEFuZEhvbGRBdFRpbWUoZSksdGhpcy5fc2lnLnNldFZhbHVlQ3VydmVBdFRpbWUobyxlLG4saSkpfX1yZXR1cm4gdGhpc30sdC5FbnZlbG9wZS5wcm90b3R5cGUuZ2V0VmFsdWVBdFRpbWU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3NpZy5nZXRWYWx1ZUF0VGltZSh0KX0sdC5FbnZlbG9wZS5wcm90b3R5cGUudHJpZ2dlckF0dGFja1JlbGVhc2U9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBlPXRoaXMudG9TZWNvbmRzKGUpLHRoaXMudHJpZ2dlckF0dGFjayhlLGkpLHRoaXMudHJpZ2dlclJlbGVhc2UoZSt0aGlzLnRvU2Vjb25kcyh0KSksdGhpc30sdC5FbnZlbG9wZS5wcm90b3R5cGUuY2FuY2VsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9zaWcuY2FuY2VsU2NoZWR1bGVkVmFsdWVzKHQpLHRoaXN9LHQuRW52ZWxvcGUucHJvdG90eXBlLmNvbm5lY3Q9dC5TaWduYWxCYXNlLnByb3RvdHlwZS5jb25uZWN0LGZ1bmN0aW9uKCl7dmFyIGUsaSxuPVtdO2ZvcihlPTA7ZTwxMjg7ZSsrKW5bZV09TWF0aC5zaW4oZS8xMjcqKE1hdGguUEkvMikpO3ZhciBvPVtdO2ZvcihlPTA7ZTwxMjc7ZSsrKXtpPWUvMTI3O3ZhciBzPU1hdGguc2luKGkqKDIqTWF0aC5QSSkqNi40LU1hdGguUEkvMikrMTtvW2VdPXMvMTArLjgzKml9b1sxMjddPTE7dmFyIHI9W107Zm9yKGU9MDtlPDEyODtlKyspcltlXT1NYXRoLmNlaWwoZS8xMjcqNSkvNTt2YXIgYT1bXTtmb3IoZT0wO2U8MTI4O2UrKylpPWUvMTI3LGFbZV09LjUqKDEtTWF0aC5jb3MoTWF0aC5QSSppKSk7dmFyIGwsaD1bXTtmb3IoZT0wO2U8MTI4O2UrKyl7aT1lLzEyNzt2YXIgdT00Kk1hdGgucG93KGksMykrLjIsYz1NYXRoLmNvcyh1Kk1hdGguUEkqMippKTtoW2VdPU1hdGguYWJzKGMqKDEtaSkpfWZ1bmN0aW9uIHAodCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0Lmxlbmd0aCksaT0wO2k8dC5sZW5ndGg7aSsrKWVbaV09MS10W2ldO3JldHVybiBlfXQuRW52ZWxvcGUuVHlwZT17bGluZWFyOlwibGluZWFyXCIsZXhwb25lbnRpYWw6XCJleHBvbmVudGlhbFwiLGJvdW5jZTp7SW46cChoKSxPdXQ6aH0sY29zaW5lOntJbjpuLE91dDoobD1uLGwuc2xpY2UoMCkucmV2ZXJzZSgpKX0sc3RlcDp7SW46cixPdXQ6cChyKX0scmlwcGxlOntJbjpvLE91dDpwKG8pfSxzaW5lOntJbjphLE91dDpwKGEpfX19KCksdC5FbnZlbG9wZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3NpZy5kaXNwb3NlKCksdGhpcy5fc2lnPW51bGwsdGhpcy5fYXR0YWNrQ3VydmU9bnVsbCx0aGlzLl9yZWxlYXNlQ3VydmU9bnVsbCx0aGlzfSx0LkVudmVsb3BlfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDYpLGkoMTcpLGkoNSksaSgzKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuRk1Pc2NpbGxhdG9yPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiZnJlcXVlbmN5XCIsXCJ0eXBlXCIsXCJtb2R1bGF0aW9uVHlwZVwiXSx0LkZNT3NjaWxsYXRvcik7dC5Tb3VyY2UuY2FsbCh0aGlzLGUpLHRoaXMuX2NhcnJpZXI9bmV3IHQuT3NjaWxsYXRvcihlLmZyZXF1ZW5jeSxlLnR5cGUpLHRoaXMuZnJlcXVlbmN5PW5ldyB0LlNpZ25hbChlLmZyZXF1ZW5jeSx0LlR5cGUuRnJlcXVlbmN5KSx0aGlzLmRldHVuZT10aGlzLl9jYXJyaWVyLmRldHVuZSx0aGlzLmRldHVuZS52YWx1ZT1lLmRldHVuZSx0aGlzLm1vZHVsYXRpb25JbmRleD1uZXcgdC5NdWx0aXBseShlLm1vZHVsYXRpb25JbmRleCksdGhpcy5tb2R1bGF0aW9uSW5kZXgudW5pdHM9dC5UeXBlLlBvc2l0aXZlLHRoaXMuX21vZHVsYXRvcj1uZXcgdC5Pc2NpbGxhdG9yKGUuZnJlcXVlbmN5LGUubW9kdWxhdGlvblR5cGUpLHRoaXMuaGFybW9uaWNpdHk9bmV3IHQuTXVsdGlwbHkoZS5oYXJtb25pY2l0eSksdGhpcy5oYXJtb25pY2l0eS51bml0cz10LlR5cGUuUG9zaXRpdmUsdGhpcy5fbW9kdWxhdGlvbk5vZGU9bmV3IHQuR2FpbigwKSx0aGlzLmZyZXF1ZW5jeS5jb25uZWN0KHRoaXMuX2NhcnJpZXIuZnJlcXVlbmN5KSx0aGlzLmZyZXF1ZW5jeS5jaGFpbih0aGlzLmhhcm1vbmljaXR5LHRoaXMuX21vZHVsYXRvci5mcmVxdWVuY3kpLHRoaXMuZnJlcXVlbmN5LmNoYWluKHRoaXMubW9kdWxhdGlvbkluZGV4LHRoaXMuX21vZHVsYXRpb25Ob2RlKSx0aGlzLl9tb2R1bGF0b3IuY29ubmVjdCh0aGlzLl9tb2R1bGF0aW9uTm9kZS5nYWluKSx0aGlzLl9tb2R1bGF0aW9uTm9kZS5jb25uZWN0KHRoaXMuX2NhcnJpZXIuZnJlcXVlbmN5KSx0aGlzLl9jYXJyaWVyLmNvbm5lY3QodGhpcy5vdXRwdXQpLHRoaXMuZGV0dW5lLmNvbm5lY3QodGhpcy5fbW9kdWxhdG9yLmRldHVuZSksdGhpcy5waGFzZT1lLnBoYXNlLHRoaXMuX3JlYWRPbmx5KFtcIm1vZHVsYXRpb25JbmRleFwiLFwiZnJlcXVlbmN5XCIsXCJkZXR1bmVcIixcImhhcm1vbmljaXR5XCJdKX0sdC5leHRlbmQodC5GTU9zY2lsbGF0b3IsdC5Tb3VyY2UpLHQuRk1Pc2NpbGxhdG9yLmRlZmF1bHRzPXtmcmVxdWVuY3k6NDQwLGRldHVuZTowLHBoYXNlOjAsdHlwZTpcInNpbmVcIixtb2R1bGF0aW9uSW5kZXg6Mixtb2R1bGF0aW9uVHlwZTpcInNxdWFyZVwiLGhhcm1vbmljaXR5OjF9LHQuRk1Pc2NpbGxhdG9yLnByb3RvdHlwZS5fc3RhcnQ9ZnVuY3Rpb24odCl7dGhpcy5fbW9kdWxhdG9yLnN0YXJ0KHQpLHRoaXMuX2NhcnJpZXIuc3RhcnQodCl9LHQuRk1Pc2NpbGxhdG9yLnByb3RvdHlwZS5fc3RvcD1mdW5jdGlvbih0KXt0aGlzLl9tb2R1bGF0b3Iuc3RvcCh0KSx0aGlzLl9jYXJyaWVyLnN0b3AodCl9LHQuRk1Pc2NpbGxhdG9yLnByb3RvdHlwZS5yZXN0YXJ0PWZ1bmN0aW9uKHQpe3RoaXMuX21vZHVsYXRvci5yZXN0YXJ0KHQpLHRoaXMuX2NhcnJpZXIucmVzdGFydCh0KX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuRk1Pc2NpbGxhdG9yLnByb3RvdHlwZSxcInR5cGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NhcnJpZXIudHlwZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhcnJpZXIudHlwZT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkZNT3NjaWxsYXRvci5wcm90b3R5cGUsXCJiYXNlVHlwZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2Fycmllci5iYXNlVHlwZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhcnJpZXIuYmFzZVR5cGU9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5GTU9zY2lsbGF0b3IucHJvdG90eXBlLFwicGFydGlhbENvdW50XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jYXJyaWVyLnBhcnRpYWxDb3VudH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhcnJpZXIucGFydGlhbENvdW50PXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuRk1Pc2NpbGxhdG9yLnByb3RvdHlwZSxcIm1vZHVsYXRpb25UeXBlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb2R1bGF0b3IudHlwZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX21vZHVsYXRvci50eXBlPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuRk1Pc2NpbGxhdG9yLnByb3RvdHlwZSxcInBoYXNlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jYXJyaWVyLnBoYXNlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2Fycmllci5waGFzZT10LHRoaXMuX21vZHVsYXRvci5waGFzZT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkZNT3NjaWxsYXRvci5wcm90b3R5cGUsXCJwYXJ0aWFsc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2Fycmllci5wYXJ0aWFsc30sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhcnJpZXIucGFydGlhbHM9dH19KSx0LkZNT3NjaWxsYXRvci5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LlNvdXJjZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcIm1vZHVsYXRpb25JbmRleFwiLFwiZnJlcXVlbmN5XCIsXCJkZXR1bmVcIixcImhhcm1vbmljaXR5XCJdKSx0aGlzLmZyZXF1ZW5jeS5kaXNwb3NlKCksdGhpcy5mcmVxdWVuY3k9bnVsbCx0aGlzLmRldHVuZT1udWxsLHRoaXMuaGFybW9uaWNpdHkuZGlzcG9zZSgpLHRoaXMuaGFybW9uaWNpdHk9bnVsbCx0aGlzLl9jYXJyaWVyLmRpc3Bvc2UoKSx0aGlzLl9jYXJyaWVyPW51bGwsdGhpcy5fbW9kdWxhdG9yLmRpc3Bvc2UoKSx0aGlzLl9tb2R1bGF0b3I9bnVsbCx0aGlzLl9tb2R1bGF0aW9uTm9kZS5kaXNwb3NlKCksdGhpcy5fbW9kdWxhdGlvbk5vZGU9bnVsbCx0aGlzLm1vZHVsYXRpb25JbmRleC5kaXNwb3NlKCksdGhpcy5tb2R1bGF0aW9uSW5kZXg9bnVsbCx0aGlzfSx0LkZNT3NjaWxsYXRvcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg2KSxpKDE3KSxpKDEpLGkoNyksaSgzKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuUHVsc2VPc2NpbGxhdG9yPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiZnJlcXVlbmN5XCIsXCJ3aWR0aFwiXSx0Lk9zY2lsbGF0b3IpO3QuU291cmNlLmNhbGwodGhpcyxlKSx0aGlzLndpZHRoPW5ldyB0LlNpZ25hbChlLndpZHRoLHQuVHlwZS5Ob3JtYWxSYW5nZSksdGhpcy5fd2lkdGhHYXRlPW5ldyB0LkdhaW4oMCksdGhpcy5fc2F3dG9vdGg9bmV3IHQuT3NjaWxsYXRvcih7ZnJlcXVlbmN5OmUuZnJlcXVlbmN5LGRldHVuZTplLmRldHVuZSx0eXBlOlwic2F3dG9vdGhcIixwaGFzZTplLnBoYXNlfSksdGhpcy5mcmVxdWVuY3k9dGhpcy5fc2F3dG9vdGguZnJlcXVlbmN5LHRoaXMuZGV0dW5lPXRoaXMuX3Nhd3Rvb3RoLmRldHVuZSx0aGlzLl90aHJlc2g9bmV3IHQuV2F2ZVNoYXBlcihmdW5jdGlvbih0KXtyZXR1cm4gdDwwPy0xOjF9KSx0aGlzLl9zYXd0b290aC5jaGFpbih0aGlzLl90aHJlc2gsdGhpcy5vdXRwdXQpLHRoaXMud2lkdGguY2hhaW4odGhpcy5fd2lkdGhHYXRlLHRoaXMuX3RocmVzaCksdGhpcy5fcmVhZE9ubHkoW1wid2lkdGhcIixcImZyZXF1ZW5jeVwiLFwiZGV0dW5lXCJdKX0sdC5leHRlbmQodC5QdWxzZU9zY2lsbGF0b3IsdC5Tb3VyY2UpLHQuUHVsc2VPc2NpbGxhdG9yLmRlZmF1bHRzPXtmcmVxdWVuY3k6NDQwLGRldHVuZTowLHBoYXNlOjAsd2lkdGg6LjJ9LHQuUHVsc2VPc2NpbGxhdG9yLnByb3RvdHlwZS5fc3RhcnQ9ZnVuY3Rpb24odCl7dD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl9zYXd0b290aC5zdGFydCh0KSx0aGlzLl93aWR0aEdhdGUuZ2Fpbi5zZXRWYWx1ZUF0VGltZSgxLHQpfSx0LlB1bHNlT3NjaWxsYXRvci5wcm90b3R5cGUuX3N0b3A9ZnVuY3Rpb24odCl7dD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl9zYXd0b290aC5zdG9wKHQpLHRoaXMuX3dpZHRoR2F0ZS5nYWluLnNldFZhbHVlQXRUaW1lKDAsdCl9LHQuUHVsc2VPc2NpbGxhdG9yLnByb3RvdHlwZS5yZXN0YXJ0PWZ1bmN0aW9uKHQpe3RoaXMuX3Nhd3Rvb3RoLnJlc3RhcnQodCksdGhpcy5fd2lkdGhHYXRlLmdhaW4uY2FuY2VsU2NoZWR1bGVkVmFsdWVzKHQpLHRoaXMuX3dpZHRoR2F0ZS5nYWluLnNldFZhbHVlQXRUaW1lKDEsdCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlB1bHNlT3NjaWxsYXRvci5wcm90b3R5cGUsXCJwaGFzZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2F3dG9vdGgucGhhc2V9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9zYXd0b290aC5waGFzZT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlB1bHNlT3NjaWxsYXRvci5wcm90b3R5cGUsXCJ0eXBlXCIse2dldDpmdW5jdGlvbigpe3JldHVyblwicHVsc2VcIn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QdWxzZU9zY2lsbGF0b3IucHJvdG90eXBlLFwiYmFzZVR5cGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuXCJwdWxzZVwifX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlB1bHNlT3NjaWxsYXRvci5wcm90b3R5cGUsXCJwYXJ0aWFsc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm5bXX19KSx0LlB1bHNlT3NjaWxsYXRvci5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LlNvdXJjZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3Nhd3Rvb3RoLmRpc3Bvc2UoKSx0aGlzLl9zYXd0b290aD1udWxsLHRoaXMuX3dyaXRhYmxlKFtcIndpZHRoXCIsXCJmcmVxdWVuY3lcIixcImRldHVuZVwiXSksdGhpcy53aWR0aC5kaXNwb3NlKCksdGhpcy53aWR0aD1udWxsLHRoaXMuX3dpZHRoR2F0ZS5kaXNwb3NlKCksdGhpcy5fd2lkdGhHYXRlPW51bGwsdGhpcy5fdGhyZXNoLmRpc3Bvc2UoKSx0aGlzLl90aHJlc2g9bnVsbCx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXMuZGV0dW5lPW51bGwsdGhpc30sdC5QdWxzZU9zY2lsbGF0b3J9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMTYpLGkoNCksaSgzMyldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkV2ZW50PWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiY2FsbGJhY2tcIixcInZhbHVlXCJdLHQuRXZlbnQpO3QuY2FsbCh0aGlzKSx0aGlzLl9sb29wPWUubG9vcCx0aGlzLmNhbGxiYWNrPWUuY2FsbGJhY2ssdGhpcy52YWx1ZT1lLnZhbHVlLHRoaXMuX2xvb3BTdGFydD10aGlzLnRvVGlja3MoZS5sb29wU3RhcnQpLHRoaXMuX2xvb3BFbmQ9dGhpcy50b1RpY2tzKGUubG9vcEVuZCksdGhpcy5fc3RhdGU9bmV3IHQuVGltZWxpbmVTdGF0ZSh0LlN0YXRlLlN0b3BwZWQpLHRoaXMuX3BsYXliYWNrUmF0ZT0xLHRoaXMuX3N0YXJ0T2Zmc2V0PTAsdGhpcy5fcHJvYmFiaWxpdHk9ZS5wcm9iYWJpbGl0eSx0aGlzLl9odW1hbml6ZT1lLmh1bWFuaXplLHRoaXMubXV0ZT1lLm11dGUsdGhpcy5wbGF5YmFja1JhdGU9ZS5wbGF5YmFja1JhdGV9LHQuZXh0ZW5kKHQuRXZlbnQpLHQuRXZlbnQuZGVmYXVsdHM9e2NhbGxiYWNrOnQubm9PcCxsb29wOiExLGxvb3BFbmQ6XCIxbVwiLGxvb3BTdGFydDowLHBsYXliYWNrUmF0ZToxLHZhbHVlOm51bGwscHJvYmFiaWxpdHk6MSxtdXRlOiExLGh1bWFuaXplOiExfSx0LkV2ZW50LnByb3RvdHlwZS5fcmVzY2hlZHVsZUV2ZW50cz1mdW5jdGlvbihlKXtyZXR1cm4gZT10LmRlZmF1bHRBcmcoZSwtMSksdGhpcy5fc3RhdGUuZm9yRWFjaEZyb20oZSxmdW5jdGlvbihlKXt2YXIgaTtpZihlLnN0YXRlPT09dC5TdGF0ZS5TdGFydGVkKXt0LmlzRGVmaW5lZChlLmlkKSYmdC5UcmFuc3BvcnQuY2xlYXIoZS5pZCk7dmFyIG49ZS50aW1lK01hdGgucm91bmQodGhpcy5zdGFydE9mZnNldC90aGlzLl9wbGF5YmFja1JhdGUpO2lmKHRoaXMuX2xvb3Ape2k9MS8wLHQuaXNOdW1iZXIodGhpcy5fbG9vcCkmJihpPXRoaXMuX2xvb3AqdGhpcy5fZ2V0TG9vcER1cmF0aW9uKCkpO3ZhciBvPXRoaXMuX3N0YXRlLmdldEFmdGVyKG4pO251bGwhPT1vJiYoaT1NYXRoLm1pbihpLG8udGltZS1uKSksaSE9PTEvMCYmKHRoaXMuX3N0YXRlLnNldFN0YXRlQXRUaW1lKHQuU3RhdGUuU3RvcHBlZCxuK2krMSksaT10LlRpY2tzKGkpKTt2YXIgcz10LlRpY2tzKHRoaXMuX2dldExvb3BEdXJhdGlvbigpKTtlLmlkPXQuVHJhbnNwb3J0LnNjaGVkdWxlUmVwZWF0KHRoaXMuX3RpY2suYmluZCh0aGlzKSxzLHQuVGlja3MobiksaSl9ZWxzZSBlLmlkPXQuVHJhbnNwb3J0LnNjaGVkdWxlKHRoaXMuX3RpY2suYmluZCh0aGlzKSx0LlRpY2tzKG4pKX19LmJpbmQodGhpcykpLHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkV2ZW50LnByb3RvdHlwZSxcInN0YXRlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZSh0LlRyYW5zcG9ydC50aWNrcyl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuRXZlbnQucHJvdG90eXBlLFwic3RhcnRPZmZzZXRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N0YXJ0T2Zmc2V0fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fc3RhcnRPZmZzZXQ9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5FdmVudC5wcm90b3R5cGUsXCJwcm9iYWJpbGl0eVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvYmFiaWxpdHl9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9wcm9iYWJpbGl0eT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkV2ZW50LnByb3RvdHlwZSxcImh1bWFuaXplXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9odW1hbml6ZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2h1bWFuaXplPXR9fSksdC5FdmVudC5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dGhpcy50b1RpY2tzKGUpLHRoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKGUpPT09dC5TdGF0ZS5TdG9wcGVkJiYodGhpcy5fc3RhdGUuYWRkKHtzdGF0ZTp0LlN0YXRlLlN0YXJ0ZWQsdGltZTplLGlkOnZvaWQgMH0pLHRoaXMuX3Jlc2NoZWR1bGVFdmVudHMoZSkpLHRoaXN9LHQuRXZlbnQucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oZSl7aWYodGhpcy5jYW5jZWwoZSksZT10aGlzLnRvVGlja3MoZSksdGhpcy5fc3RhdGUuZ2V0VmFsdWVBdFRpbWUoZSk9PT10LlN0YXRlLlN0YXJ0ZWQpe3RoaXMuX3N0YXRlLnNldFN0YXRlQXRUaW1lKHQuU3RhdGUuU3RvcHBlZCxlKTt2YXIgaT10aGlzLl9zdGF0ZS5nZXRCZWZvcmUoZSksbj1lO251bGwhPT1pJiYobj1pLnRpbWUpLHRoaXMuX3Jlc2NoZWR1bGVFdmVudHMobil9cmV0dXJuIHRoaXN9LHQuRXZlbnQucHJvdG90eXBlLmNhbmNlbD1mdW5jdGlvbihlKXtyZXR1cm4gZT10LmRlZmF1bHRBcmcoZSwtMS8wKSxlPXRoaXMudG9UaWNrcyhlKSx0aGlzLl9zdGF0ZS5mb3JFYWNoRnJvbShlLGZ1bmN0aW9uKGUpe3QuVHJhbnNwb3J0LmNsZWFyKGUuaWQpfSksdGhpcy5fc3RhdGUuY2FuY2VsKGUpLHRoaXN9LHQuRXZlbnQucHJvdG90eXBlLl90aWNrPWZ1bmN0aW9uKGUpe3ZhciBpPXQuVHJhbnNwb3J0LmdldFRpY2tzQXRUaW1lKGUpO2lmKCF0aGlzLm11dGUmJnRoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKGkpPT09dC5TdGF0ZS5TdGFydGVkKXtpZih0aGlzLnByb2JhYmlsaXR5PDEmJk1hdGgucmFuZG9tKCk+dGhpcy5wcm9iYWJpbGl0eSlyZXR1cm47aWYodGhpcy5odW1hbml6ZSl7dmFyIG49LjAyO3QuaXNCb29sZWFuKHRoaXMuaHVtYW5pemUpfHwobj10aGlzLnRvU2Vjb25kcyh0aGlzLmh1bWFuaXplKSksZSs9KDIqTWF0aC5yYW5kb20oKS0xKSpufXRoaXMuY2FsbGJhY2soZSx0aGlzLnZhbHVlKX19LHQuRXZlbnQucHJvdG90eXBlLl9nZXRMb29wRHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZCgodGhpcy5fbG9vcEVuZC10aGlzLl9sb29wU3RhcnQpL3RoaXMuX3BsYXliYWNrUmF0ZSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkV2ZW50LnByb3RvdHlwZSxcImxvb3BcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xvb3B9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9sb29wPXQsdGhpcy5fcmVzY2hlZHVsZUV2ZW50cygpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkV2ZW50LnByb3RvdHlwZSxcInBsYXliYWNrUmF0ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGxheWJhY2tSYXRlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fcGxheWJhY2tSYXRlPXQsdGhpcy5fcmVzY2hlZHVsZUV2ZW50cygpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkV2ZW50LnByb3RvdHlwZSxcImxvb3BFbmRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHQuVGlja3ModGhpcy5fbG9vcEVuZCkudG9TZWNvbmRzKCl9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9sb29wRW5kPXRoaXMudG9UaWNrcyh0KSx0aGlzLl9sb29wJiZ0aGlzLl9yZXNjaGVkdWxlRXZlbnRzKCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuRXZlbnQucHJvdG90eXBlLFwibG9vcFN0YXJ0XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0LlRpY2tzKHRoaXMuX2xvb3BTdGFydCkudG9TZWNvbmRzKCl9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9sb29wU3RhcnQ9dGhpcy50b1RpY2tzKHQpLHRoaXMuX2xvb3AmJnRoaXMuX3Jlc2NoZWR1bGVFdmVudHMoKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5FdmVudC5wcm90b3R5cGUsXCJwcm9ncmVzc1wiLHtnZXQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9sb29wKXt2YXIgZT10LlRyYW5zcG9ydC50aWNrcyxpPXRoaXMuX3N0YXRlLmdldChlKTtpZihudWxsIT09aSYmaS5zdGF0ZT09PXQuU3RhdGUuU3RhcnRlZCl7dmFyIG49dGhpcy5fZ2V0TG9vcER1cmF0aW9uKCk7cmV0dXJuKGUtaS50aW1lKSVuL259cmV0dXJuIDB9cmV0dXJuIDB9fSksdC5FdmVudC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuY2FuY2VsKCksdGhpcy5fc3RhdGUuZGlzcG9zZSgpLHRoaXMuX3N0YXRlPW51bGwsdGhpcy5jYWxsYmFjaz1udWxsLHRoaXMudmFsdWU9bnVsbH0sdC5FdmVudH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxKSxpKDEzKSxpKDI5KSxpKDEwKSxpKDMpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0Lk1pZFNpZGVNZXJnZT1mdW5jdGlvbigpe3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5jcmVhdGVJbnNPdXRzKDIsMCksdGhpcy5taWQ9dGhpcy5pbnB1dFswXT1uZXcgdC5HYWluLHRoaXMuX2xlZnQ9bmV3IHQuQWRkLHRoaXMuX3RpbWVzVHdvTGVmdD1uZXcgdC5NdWx0aXBseShNYXRoLlNRUlQxXzIpLHRoaXMuc2lkZT10aGlzLmlucHV0WzFdPW5ldyB0LkdhaW4sdGhpcy5fcmlnaHQ9bmV3IHQuU3VidHJhY3QsdGhpcy5fdGltZXNUd29SaWdodD1uZXcgdC5NdWx0aXBseShNYXRoLlNRUlQxXzIpLHRoaXMuX21lcmdlPXRoaXMub3V0cHV0PW5ldyB0Lk1lcmdlLHRoaXMubWlkLmNvbm5lY3QodGhpcy5fbGVmdCwwLDApLHRoaXMuc2lkZS5jb25uZWN0KHRoaXMuX2xlZnQsMCwxKSx0aGlzLm1pZC5jb25uZWN0KHRoaXMuX3JpZ2h0LDAsMCksdGhpcy5zaWRlLmNvbm5lY3QodGhpcy5fcmlnaHQsMCwxKSx0aGlzLl9sZWZ0LmNvbm5lY3QodGhpcy5fdGltZXNUd29MZWZ0KSx0aGlzLl9yaWdodC5jb25uZWN0KHRoaXMuX3RpbWVzVHdvUmlnaHQpLHRoaXMuX3RpbWVzVHdvTGVmdC5jb25uZWN0KHRoaXMuX21lcmdlLDAsMCksdGhpcy5fdGltZXNUd29SaWdodC5jb25uZWN0KHRoaXMuX21lcmdlLDAsMSl9LHQuZXh0ZW5kKHQuTWlkU2lkZU1lcmdlLHQuQXVkaW9Ob2RlKSx0Lk1pZFNpZGVNZXJnZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMubWlkLmRpc3Bvc2UoKSx0aGlzLm1pZD1udWxsLHRoaXMuc2lkZS5kaXNwb3NlKCksdGhpcy5zaWRlPW51bGwsdGhpcy5fbGVmdC5kaXNwb3NlKCksdGhpcy5fbGVmdD1udWxsLHRoaXMuX3RpbWVzVHdvTGVmdC5kaXNwb3NlKCksdGhpcy5fdGltZXNUd29MZWZ0PW51bGwsdGhpcy5fcmlnaHQuZGlzcG9zZSgpLHRoaXMuX3JpZ2h0PW51bGwsdGhpcy5fdGltZXNUd29SaWdodC5kaXNwb3NlKCksdGhpcy5fdGltZXNUd29SaWdodD1udWxsLHRoaXMuX21lcmdlLmRpc3Bvc2UoKSx0aGlzLl9tZXJnZT1udWxsLHRoaXN9LHQuTWlkU2lkZU1lcmdlfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDI5KSxpKDEzKSxpKDEpLGkoMTkpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0Lk1pZFNpZGVTcGxpdD1mdW5jdGlvbigpe3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5jcmVhdGVJbnNPdXRzKDAsMiksdGhpcy5fc3BsaXQ9dGhpcy5pbnB1dD1uZXcgdC5TcGxpdCx0aGlzLl9taWRBZGQ9bmV3IHQuQWRkLHRoaXMubWlkPXRoaXMub3V0cHV0WzBdPW5ldyB0Lk11bHRpcGx5KE1hdGguU1FSVDFfMiksdGhpcy5fc2lkZVN1YnRyYWN0PW5ldyB0LlN1YnRyYWN0LHRoaXMuc2lkZT10aGlzLm91dHB1dFsxXT1uZXcgdC5NdWx0aXBseShNYXRoLlNRUlQxXzIpLHRoaXMuX3NwbGl0LmNvbm5lY3QodGhpcy5fbWlkQWRkLDAsMCksdGhpcy5fc3BsaXQuY29ubmVjdCh0aGlzLl9taWRBZGQsMSwxKSx0aGlzLl9zcGxpdC5jb25uZWN0KHRoaXMuX3NpZGVTdWJ0cmFjdCwwLDApLHRoaXMuX3NwbGl0LmNvbm5lY3QodGhpcy5fc2lkZVN1YnRyYWN0LDEsMSksdGhpcy5fbWlkQWRkLmNvbm5lY3QodGhpcy5taWQpLHRoaXMuX3NpZGVTdWJ0cmFjdC5jb25uZWN0KHRoaXMuc2lkZSl9LHQuZXh0ZW5kKHQuTWlkU2lkZVNwbGl0LHQuQXVkaW9Ob2RlKSx0Lk1pZFNpZGVTcGxpdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMubWlkLmRpc3Bvc2UoKSx0aGlzLm1pZD1udWxsLHRoaXMuc2lkZS5kaXNwb3NlKCksdGhpcy5zaWRlPW51bGwsdGhpcy5fbWlkQWRkLmRpc3Bvc2UoKSx0aGlzLl9taWRBZGQ9bnVsbCx0aGlzLl9zaWRlU3VidHJhY3QuZGlzcG9zZSgpLHRoaXMuX3NpZGVTdWJ0cmFjdD1udWxsLHRoaXMuX3NwbGl0LmRpc3Bvc2UoKSx0aGlzLl9zcGxpdD1udWxsLHRoaXN9LHQuTWlkU2lkZVNwbGl0fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDEpLGkoOSksaSgyKSxpKDU4KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuTG93cGFzc0NvbWJGaWx0ZXI9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJkZWxheVRpbWVcIixcInJlc29uYW5jZVwiLFwiZGFtcGVuaW5nXCJdLHQuTG93cGFzc0NvbWJGaWx0ZXIpO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5fY29tYkZpbHRlcj10aGlzLm91dHB1dD1uZXcgdC5GZWVkYmFja0NvbWJGaWx0ZXIoZS5kZWxheVRpbWUsZS5yZXNvbmFuY2UpLHRoaXMuZGVsYXlUaW1lPXRoaXMuX2NvbWJGaWx0ZXIuZGVsYXlUaW1lLHRoaXMuX2xvd3Bhc3M9dGhpcy5pbnB1dD1uZXcgdC5GaWx0ZXIoe2ZyZXF1ZW5jeTplLmRhbXBlbmluZyx0eXBlOlwibG93cGFzc1wiLFE6MCxyb2xsb2ZmOi0xMn0pLHRoaXMuZGFtcGVuaW5nPXRoaXMuX2xvd3Bhc3MuZnJlcXVlbmN5LHRoaXMucmVzb25hbmNlPXRoaXMuX2NvbWJGaWx0ZXIucmVzb25hbmNlLHRoaXMuX2xvd3Bhc3MuY29ubmVjdCh0aGlzLl9jb21iRmlsdGVyKSx0aGlzLl9yZWFkT25seShbXCJkYW1wZW5pbmdcIixcInJlc29uYW5jZVwiLFwiZGVsYXlUaW1lXCJdKX0sdC5leHRlbmQodC5Mb3dwYXNzQ29tYkZpbHRlcix0LkF1ZGlvTm9kZSksdC5Mb3dwYXNzQ29tYkZpbHRlci5kZWZhdWx0cz17ZGVsYXlUaW1lOi4xLHJlc29uYW5jZTouNSxkYW1wZW5pbmc6M2UzfSx0Lkxvd3Bhc3NDb21iRmlsdGVyLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fd3JpdGFibGUoW1wiZGFtcGVuaW5nXCIsXCJyZXNvbmFuY2VcIixcImRlbGF5VGltZVwiXSksdGhpcy5fY29tYkZpbHRlci5kaXNwb3NlKCksdGhpcy5fY29tYkZpbHRlcj1udWxsLHRoaXMucmVzb25hbmNlPW51bGwsdGhpcy5kZWxheVRpbWU9bnVsbCx0aGlzLl9sb3dwYXNzLmRpc3Bvc2UoKSx0aGlzLl9sb3dwYXNzPW51bGwsdGhpcy5kYW1wZW5pbmc9bnVsbCx0aGlzfSx0Lkxvd3Bhc3NDb21iRmlsdGVyfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDQ1KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuVGlja3M9ZnVuY3Rpb24oZSxpKXtpZighKHRoaXMgaW5zdGFuY2VvZiB0LlRpY2tzKSlyZXR1cm4gbmV3IHQuVGlja3MoZSxpKTt0LlRyYW5zcG9ydFRpbWUuY2FsbCh0aGlzLGUsaSl9LHQuZXh0ZW5kKHQuVGlja3MsdC5UcmFuc3BvcnRUaW1lKSx0LlRpY2tzLnByb3RvdHlwZS5fZGVmYXVsdFVuaXRzPVwiaVwiLHQuVGlja3MucHJvdG90eXBlLl9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gdC5UcmFuc3BvcnQudGlja3N9LHQuVGlja3MucHJvdG90eXBlLl9iZWF0c1RvVW5pdHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2dldFBQUSgpKnR9LHQuVGlja3MucHJvdG90eXBlLl9zZWNvbmRzVG9Vbml0cz1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5mbG9vcih0Lyg2MC90aGlzLl9nZXRCcG0oKSkqdGhpcy5fZ2V0UFBRKCkpfSx0LlRpY2tzLnByb3RvdHlwZS5fdGlja3NUb1VuaXRzPWZ1bmN0aW9uKHQpe3JldHVybiB0fSx0LlRpY2tzLnByb3RvdHlwZS50b1RpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWVPZigpfSx0LlRpY2tzLnByb3RvdHlwZS50b1NlY29uZHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZU9mKCkvdGhpcy5fZ2V0UFBRKCkqKDYwL3RoaXMuX2dldEJwbSgpKX0sdC5UaWNrc30uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg1NCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe3JldHVybiB0LlRyYW5zcG9ydEV2ZW50PWZ1bmN0aW9uKGUsaSl7aT10LmRlZmF1bHRBcmcoaSx0LlRyYW5zcG9ydEV2ZW50LmRlZmF1bHRzKSx0LmNhbGwodGhpcyksdGhpcy5UcmFuc3BvcnQ9ZSx0aGlzLmlkPXQuVHJhbnNwb3J0RXZlbnQuX2V2ZW50SWQrKyx0aGlzLnRpbWU9dC5UaWNrcyhpLnRpbWUpLHRoaXMuY2FsbGJhY2s9aS5jYWxsYmFjayx0aGlzLl9vbmNlPWkub25jZX0sdC5leHRlbmQodC5UcmFuc3BvcnRFdmVudCksdC5UcmFuc3BvcnRFdmVudC5kZWZhdWx0cz17b25jZTohMSxjYWxsYmFjazp0Lm5vT3B9LHQuVHJhbnNwb3J0RXZlbnQuX2V2ZW50SWQ9MCx0LlRyYW5zcG9ydEV2ZW50LnByb3RvdHlwZS5pbnZva2U9ZnVuY3Rpb24odCl7dGhpcy5jYWxsYmFjayYmKHRoaXMuY2FsbGJhY2sodCksdGhpcy5fb25jZSYmdGhpcy5UcmFuc3BvcnQmJnRoaXMuVHJhbnNwb3J0LmNsZWFyKHRoaXMuaWQpKX0sdC5UcmFuc3BvcnRFdmVudC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5UcmFuc3BvcnQ9bnVsbCx0aGlzLmNhbGxiYWNrPW51bGwsdGhpcy50aW1lPW51bGwsdGhpc30sdC5UcmFuc3BvcnRFdmVudH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg4NSksaSgzMyksaSgyNCksaSgxNCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlRpY2tTb3VyY2U9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJmcmVxdWVuY3lcIl0sdC5UaWNrU291cmNlKTt0aGlzLmZyZXF1ZW5jeT1uZXcgdC5UaWNrU2lnbmFsKGUuZnJlcXVlbmN5KSx0aGlzLl9yZWFkT25seShcImZyZXF1ZW5jeVwiKSx0aGlzLl9zdGF0ZT1uZXcgdC5UaW1lbGluZVN0YXRlKHQuU3RhdGUuU3RvcHBlZCksdGhpcy5fc3RhdGUuc2V0U3RhdGVBdFRpbWUodC5TdGF0ZS5TdG9wcGVkLDApLHRoaXMuX3RpY2tPZmZzZXQ9bmV3IHQuVGltZWxpbmUsdGhpcy5zZXRUaWNrc0F0VGltZSgwLDApfSx0LmV4dGVuZCh0LlRpY2tTb3VyY2UpLHQuVGlja1NvdXJjZS5kZWZhdWx0cz17ZnJlcXVlbmN5OjF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRpY2tTb3VyY2UucHJvdG90eXBlLFwic3RhdGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKHRoaXMubm93KCkpfX0pLHQuVGlja1NvdXJjZS5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oZSxpKXtyZXR1cm4gZT10aGlzLnRvU2Vjb25kcyhlKSx0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZShlKSE9PXQuU3RhdGUuU3RhcnRlZCYmKHRoaXMuX3N0YXRlLnNldFN0YXRlQXRUaW1lKHQuU3RhdGUuU3RhcnRlZCxlKSx0LmlzRGVmaW5lZChpKSYmdGhpcy5zZXRUaWNrc0F0VGltZShpLGUpKSx0aGlzfSx0LlRpY2tTb3VyY2UucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oZSl7aWYoZT10aGlzLnRvU2Vjb25kcyhlKSx0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZShlKT09PXQuU3RhdGUuU3RvcHBlZCl7dmFyIGk9dGhpcy5fc3RhdGUuZ2V0KGUpO2kudGltZT4wJiYodGhpcy5fdGlja09mZnNldC5jYW5jZWwoaS50aW1lKSx0aGlzLl9zdGF0ZS5jYW5jZWwoaS50aW1lKSl9cmV0dXJuIHRoaXMuX3N0YXRlLmNhbmNlbChlKSx0aGlzLl9zdGF0ZS5zZXRTdGF0ZUF0VGltZSh0LlN0YXRlLlN0b3BwZWQsZSksdGhpcy5zZXRUaWNrc0F0VGltZSgwLGUpLHRoaXN9LHQuVGlja1NvdXJjZS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dGhpcy50b1NlY29uZHMoZSksdGhpcy5fc3RhdGUuZ2V0VmFsdWVBdFRpbWUoZSk9PT10LlN0YXRlLlN0YXJ0ZWQmJnRoaXMuX3N0YXRlLnNldFN0YXRlQXRUaW1lKHQuU3RhdGUuUGF1c2VkLGUpLHRoaXN9LHQuVGlja1NvdXJjZS5wcm90b3R5cGUuY2FuY2VsPWZ1bmN0aW9uKHQpe3JldHVybiB0PXRoaXMudG9TZWNvbmRzKHQpLHRoaXMuX3N0YXRlLmNhbmNlbCh0KSx0aGlzLl90aWNrT2Zmc2V0LmNhbmNlbCh0KSx0aGlzfSx0LlRpY2tTb3VyY2UucHJvdG90eXBlLmdldFRpY2tzQXRUaW1lPWZ1bmN0aW9uKGUpe2U9dGhpcy50b1NlY29uZHMoZSk7dmFyIGk9dGhpcy5fc3RhdGUuZ2V0TGFzdFN0YXRlKHQuU3RhdGUuU3RvcHBlZCxlKSxuPXtzdGF0ZTp0LlN0YXRlLlBhdXNlZCx0aW1lOmV9O3RoaXMuX3N0YXRlLmFkZChuKTt2YXIgbz1pLHM9MDtyZXR1cm4gdGhpcy5fc3RhdGUuZm9yRWFjaEJldHdlZW4oaS50aW1lLGUrdGhpcy5zYW1wbGVUaW1lLGZ1bmN0aW9uKGUpe3ZhciBpPW8udGltZSxuPXRoaXMuX3RpY2tPZmZzZXQuZ2V0KGUudGltZSk7bi50aW1lPj1vLnRpbWUmJihzPW4udGlja3MsaT1uLnRpbWUpLG8uc3RhdGU9PT10LlN0YXRlLlN0YXJ0ZWQmJmUuc3RhdGUhPT10LlN0YXRlLlN0YXJ0ZWQmJihzKz10aGlzLmZyZXF1ZW5jeS5nZXRUaWNrc0F0VGltZShlLnRpbWUpLXRoaXMuZnJlcXVlbmN5LmdldFRpY2tzQXRUaW1lKGkpKSxvPWV9LmJpbmQodGhpcykpLHRoaXMuX3N0YXRlLnJlbW92ZShuKSxzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5UaWNrU291cmNlLnByb3RvdHlwZSxcInRpY2tzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFRpY2tzQXRUaW1lKHRoaXMubm93KCkpfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5zZXRUaWNrc0F0VGltZSh0LHRoaXMubm93KCkpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRpY2tTb3VyY2UucHJvdG90eXBlLFwic2Vjb25kc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRTZWNvbmRzQXRUaW1lKHRoaXMubm93KCkpfSxzZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ub3coKSxpPXRoaXMuZnJlcXVlbmN5LnRpbWVUb1RpY2tzKHQsZSk7dGhpcy5zZXRUaWNrc0F0VGltZShpLGUpfX0pLHQuVGlja1NvdXJjZS5wcm90b3R5cGUuZ2V0U2Vjb25kc0F0VGltZT1mdW5jdGlvbihlKXtlPXRoaXMudG9TZWNvbmRzKGUpO3ZhciBpPXRoaXMuX3N0YXRlLmdldExhc3RTdGF0ZSh0LlN0YXRlLlN0b3BwZWQsZSksbj17c3RhdGU6dC5TdGF0ZS5QYXVzZWQsdGltZTplfTt0aGlzLl9zdGF0ZS5hZGQobik7dmFyIG89aSxzPTA7cmV0dXJuIHRoaXMuX3N0YXRlLmZvckVhY2hCZXR3ZWVuKGkudGltZSxlK3RoaXMuc2FtcGxlVGltZSxmdW5jdGlvbihlKXt2YXIgaT1vLnRpbWUsbj10aGlzLl90aWNrT2Zmc2V0LmdldChlLnRpbWUpO24udGltZT49by50aW1lJiYocz1uLnNlY29uZHMsaT1uLnRpbWUpLG8uc3RhdGU9PT10LlN0YXRlLlN0YXJ0ZWQmJmUuc3RhdGUhPT10LlN0YXRlLlN0YXJ0ZWQmJihzKz1lLnRpbWUtaSksbz1lfS5iaW5kKHRoaXMpKSx0aGlzLl9zdGF0ZS5yZW1vdmUobiksc30sdC5UaWNrU291cmNlLnByb3RvdHlwZS5zZXRUaWNrc0F0VGltZT1mdW5jdGlvbih0LGUpe3JldHVybiBlPXRoaXMudG9TZWNvbmRzKGUpLHRoaXMuX3RpY2tPZmZzZXQuY2FuY2VsKGUpLHRoaXMuX3RpY2tPZmZzZXQuYWRkKHt0aW1lOmUsdGlja3M6dCxzZWNvbmRzOnRoaXMuZnJlcXVlbmN5LmdldER1cmF0aW9uT2ZUaWNrcyh0LGUpfSksdGhpc30sdC5UaWNrU291cmNlLnByb3RvdHlwZS5nZXRTdGF0ZUF0VGltZT1mdW5jdGlvbih0KXtyZXR1cm4gdD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZSh0KX0sdC5UaWNrU291cmNlLnByb3RvdHlwZS5nZXRUaW1lT2ZUaWNrPWZ1bmN0aW9uKGUsaSl7aT10LmRlZmF1bHRBcmcoaSx0aGlzLm5vdygpKTt2YXIgbj10aGlzLl90aWNrT2Zmc2V0LmdldChpKSxvPXRoaXMuX3N0YXRlLmdldChpKSxzPU1hdGgubWF4KG4udGltZSxvLnRpbWUpLHI9dGhpcy5mcmVxdWVuY3kuZ2V0VGlja3NBdFRpbWUocykrZS1uLnRpY2tzO3JldHVybiB0aGlzLmZyZXF1ZW5jeS5nZXRUaW1lT2ZUaWNrKHIpfSx0LlRpY2tTb3VyY2UucHJvdG90eXBlLmZvckVhY2hUaWNrQmV0d2Vlbj1mdW5jdGlvbihlLGksbil7dmFyIG89dGhpcy5fc3RhdGUuZ2V0KGUpO2lmKHRoaXMuX3N0YXRlLmZvckVhY2hCZXR3ZWVuKGUsaSxmdW5jdGlvbihpKXtvLnN0YXRlPT09dC5TdGF0ZS5TdGFydGVkJiZpLnN0YXRlIT09dC5TdGF0ZS5TdGFydGVkJiZ0aGlzLmZvckVhY2hUaWNrQmV0d2VlbihNYXRoLm1heChvLnRpbWUsZSksaS50aW1lLXRoaXMuc2FtcGxlVGltZSxuKSxvPWl9LmJpbmQodGhpcykpLGU9TWF0aC5tYXgoby50aW1lLGUpLG8uc3RhdGU9PT10LlN0YXRlLlN0YXJ0ZWQmJnRoaXMuX3N0YXRlKXt2YXIgcz10aGlzLmZyZXF1ZW5jeS5nZXRUaWNrc0F0VGltZShlKSxyPShzLXRoaXMuZnJlcXVlbmN5LmdldFRpY2tzQXRUaW1lKG8udGltZSkpJTE7MCE9PXImJihyPTEtcik7Zm9yKHZhciBhPXRoaXMuZnJlcXVlbmN5LmdldFRpbWVPZlRpY2socytyKSxsPW51bGw7YTxpJiZ0aGlzLl9zdGF0ZTspe3RyeXtuKGEsTWF0aC5yb3VuZCh0aGlzLmdldFRpY2tzQXRUaW1lKGEpKSl9Y2F0Y2godCl7bD10O2JyZWFrfXRoaXMuX3N0YXRlJiYoYSs9dGhpcy5mcmVxdWVuY3kuZ2V0RHVyYXRpb25PZlRpY2tzKDEsYSkpfX1pZihsKXRocm93IGw7cmV0dXJuIHRoaXN9LHQuVGlja1NvdXJjZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LlBhcmFtLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fc3RhdGUuZGlzcG9zZSgpLHRoaXMuX3N0YXRlPW51bGwsdGhpcy5fdGlja09mZnNldC5kaXNwb3NlKCksdGhpcy5fdGlja09mZnNldD1udWxsLHRoaXMuX3dyaXRhYmxlKFwiZnJlcXVlbmN5XCIpLHRoaXMuZnJlcXVlbmN5LmRpc3Bvc2UoKSx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXN9LHQuVGlja1NvdXJjZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg5MCksaSgxMyksaSgxKSxpKDQpLGkoMTgpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkZvbGxvd2VyPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wic21vb3RoaW5nXCJdLHQuRm9sbG93ZXIpO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5jcmVhdGVJbnNPdXRzKDEsMSksdGhpcy5fYWJzPW5ldyB0LkFicyx0aGlzLl9maWx0ZXI9dGhpcy5jb250ZXh0LmNyZWF0ZUJpcXVhZEZpbHRlcigpLHRoaXMuX2ZpbHRlci50eXBlPVwibG93cGFzc1wiLHRoaXMuX2ZpbHRlci5mcmVxdWVuY3kudmFsdWU9MCx0aGlzLl9maWx0ZXIuUS52YWx1ZT0wLHRoaXMuX3N1Yj1uZXcgdC5TdWJ0cmFjdCx0aGlzLl9kZWxheT1uZXcgdC5EZWxheSh0aGlzLmJsb2NrVGltZSksdGhpcy5fc21vb3RoaW5nPWUuc21vb3RoaW5nLHRoaXMuaW5wdXQuY29ubmVjdCh0aGlzLl9kZWxheSx0aGlzLl9zdWIpLHRoaXMuaW5wdXQuY29ubmVjdCh0aGlzLl9zdWIsMCwxKSx0aGlzLl9zdWIuY2hhaW4odGhpcy5fYWJzLHRoaXMuX2ZpbHRlcix0aGlzLm91dHB1dCksdGhpcy5zbW9vdGhpbmc9ZS5zbW9vdGhpbmd9LHQuZXh0ZW5kKHQuRm9sbG93ZXIsdC5BdWRpb05vZGUpLHQuRm9sbG93ZXIuZGVmYXVsdHM9e3Ntb290aGluZzouMDV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkZvbGxvd2VyLnByb3RvdHlwZSxcInNtb290aGluZ1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc21vb3RoaW5nfSxzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5fc21vb3RoaW5nPWUsdGhpcy5fZmlsdGVyLmZyZXF1ZW5jeS52YWx1ZT0uNSp0LlRpbWUoZSkudG9GcmVxdWVuY3koKX19KSx0LkZvbGxvd2VyLnByb3RvdHlwZS5jb25uZWN0PXQuU2lnbmFsQmFzZS5wcm90b3R5cGUuY29ubmVjdCx0LkZvbGxvd2VyLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fZmlsdGVyLmRpc2Nvbm5lY3QoKSx0aGlzLl9maWx0ZXI9bnVsbCx0aGlzLl9kZWxheS5kaXNwb3NlKCksdGhpcy5fZGVsYXk9bnVsbCx0aGlzLl9zdWIuZGlzY29ubmVjdCgpLHRoaXMuX3N1Yj1udWxsLHRoaXMuX2Ficy5kaXNwb3NlKCksdGhpcy5fYWJzPW51bGwsdGhpc30sdC5Gb2xsb3dlcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg0MiksaSgxKSxpKDE0KSxpKDE4KSxpKDMpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkZlZWRiYWNrQ29tYkZpbHRlcj1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcImRlbGF5VGltZVwiLFwicmVzb25hbmNlXCJdLHQuRmVlZGJhY2tDb21iRmlsdGVyKTt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLHRoaXMuX2RlbGF5PXRoaXMuaW5wdXQ9dGhpcy5vdXRwdXQ9bmV3IHQuRGVsYXkoZS5kZWxheVRpbWUpLHRoaXMuZGVsYXlUaW1lPXRoaXMuX2RlbGF5LmRlbGF5VGltZSx0aGlzLl9mZWVkYmFjaz1uZXcgdC5HYWluKGUucmVzb25hbmNlLHQuVHlwZS5Ob3JtYWxSYW5nZSksdGhpcy5yZXNvbmFuY2U9dGhpcy5fZmVlZGJhY2suZ2Fpbix0aGlzLl9kZWxheS5jaGFpbih0aGlzLl9mZWVkYmFjayx0aGlzLl9kZWxheSksdGhpcy5fcmVhZE9ubHkoW1wicmVzb25hbmNlXCIsXCJkZWxheVRpbWVcIl0pfSx0LmV4dGVuZCh0LkZlZWRiYWNrQ29tYkZpbHRlcix0LkF1ZGlvTm9kZSksdC5GZWVkYmFja0NvbWJGaWx0ZXIuZGVmYXVsdHM9e2RlbGF5VGltZTouMSxyZXNvbmFuY2U6LjV9LHQuRmVlZGJhY2tDb21iRmlsdGVyLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fd3JpdGFibGUoW1wicmVzb25hbmNlXCIsXCJkZWxheVRpbWVcIl0pLHRoaXMuX2RlbGF5LmRpc3Bvc2UoKSx0aGlzLl9kZWxheT1udWxsLHRoaXMuZGVsYXlUaW1lPW51bGwsdGhpcy5fZmVlZGJhY2suZGlzcG9zZSgpLHRoaXMuX2ZlZWRiYWNrPW51bGwsdGhpcy5yZXNvbmFuY2U9bnVsbCx0aGlzfSx0LkZlZWRiYWNrQ29tYkZpbHRlcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg5KSxpKDEpLGkoMyksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuTXVsdGliYW5kU3BsaXQ9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJsb3dGcmVxdWVuY3lcIixcImhpZ2hGcmVxdWVuY3lcIl0sdC5NdWx0aWJhbmRTcGxpdCk7dC5BdWRpb05vZGUuY2FsbCh0aGlzKSx0aGlzLmlucHV0PW5ldyB0LkdhaW4sdGhpcy5vdXRwdXQ9bmV3IEFycmF5KDMpLHRoaXMubG93PXRoaXMub3V0cHV0WzBdPW5ldyB0LkZpbHRlcigwLFwibG93cGFzc1wiKSx0aGlzLl9sb3dNaWRGaWx0ZXI9bmV3IHQuRmlsdGVyKDAsXCJoaWdocGFzc1wiKSx0aGlzLm1pZD10aGlzLm91dHB1dFsxXT1uZXcgdC5GaWx0ZXIoMCxcImxvd3Bhc3NcIiksdGhpcy5oaWdoPXRoaXMub3V0cHV0WzJdPW5ldyB0LkZpbHRlcigwLFwiaGlnaHBhc3NcIiksdGhpcy5sb3dGcmVxdWVuY3k9bmV3IHQuU2lnbmFsKGUubG93RnJlcXVlbmN5LHQuVHlwZS5GcmVxdWVuY3kpLHRoaXMuaGlnaEZyZXF1ZW5jeT1uZXcgdC5TaWduYWwoZS5oaWdoRnJlcXVlbmN5LHQuVHlwZS5GcmVxdWVuY3kpLHRoaXMuUT1uZXcgdC5TaWduYWwoZS5RKSx0aGlzLmlucHV0LmZhbih0aGlzLmxvdyx0aGlzLmhpZ2gpLHRoaXMuaW5wdXQuY2hhaW4odGhpcy5fbG93TWlkRmlsdGVyLHRoaXMubWlkKSx0aGlzLmxvd0ZyZXF1ZW5jeS5jb25uZWN0KHRoaXMubG93LmZyZXF1ZW5jeSksdGhpcy5sb3dGcmVxdWVuY3kuY29ubmVjdCh0aGlzLl9sb3dNaWRGaWx0ZXIuZnJlcXVlbmN5KSx0aGlzLmhpZ2hGcmVxdWVuY3kuY29ubmVjdCh0aGlzLm1pZC5mcmVxdWVuY3kpLHRoaXMuaGlnaEZyZXF1ZW5jeS5jb25uZWN0KHRoaXMuaGlnaC5mcmVxdWVuY3kpLHRoaXMuUS5jb25uZWN0KHRoaXMubG93LlEpLHRoaXMuUS5jb25uZWN0KHRoaXMuX2xvd01pZEZpbHRlci5RKSx0aGlzLlEuY29ubmVjdCh0aGlzLm1pZC5RKSx0aGlzLlEuY29ubmVjdCh0aGlzLmhpZ2guUSksdGhpcy5fcmVhZE9ubHkoW1wiaGlnaFwiLFwibWlkXCIsXCJsb3dcIixcImhpZ2hGcmVxdWVuY3lcIixcImxvd0ZyZXF1ZW5jeVwiXSl9LHQuZXh0ZW5kKHQuTXVsdGliYW5kU3BsaXQsdC5BdWRpb05vZGUpLHQuTXVsdGliYW5kU3BsaXQuZGVmYXVsdHM9e2xvd0ZyZXF1ZW5jeTo0MDAsaGlnaEZyZXF1ZW5jeToyNTAwLFE6MX0sdC5NdWx0aWJhbmRTcGxpdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcImhpZ2hcIixcIm1pZFwiLFwibG93XCIsXCJoaWdoRnJlcXVlbmN5XCIsXCJsb3dGcmVxdWVuY3lcIl0pLHRoaXMubG93LmRpc3Bvc2UoKSx0aGlzLmxvdz1udWxsLHRoaXMuX2xvd01pZEZpbHRlci5kaXNwb3NlKCksdGhpcy5fbG93TWlkRmlsdGVyPW51bGwsdGhpcy5taWQuZGlzcG9zZSgpLHRoaXMubWlkPW51bGwsdGhpcy5oaWdoLmRpc3Bvc2UoKSx0aGlzLmhpZ2g9bnVsbCx0aGlzLmxvd0ZyZXF1ZW5jeS5kaXNwb3NlKCksdGhpcy5sb3dGcmVxdWVuY3k9bnVsbCx0aGlzLmhpZ2hGcmVxdWVuY3kuZGlzcG9zZSgpLHRoaXMuaGlnaEZyZXF1ZW5jeT1udWxsLHRoaXMuUS5kaXNwb3NlKCksdGhpcy5RPW51bGwsdGhpc30sdC5NdWx0aWJhbmRTcGxpdH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgyMyksaSgxMCksaSgxOSksaSg5MiksaSgxKSxpKDIyKSxpKDI4KSxpKDIpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5QYW5uZXI9ZnVuY3Rpb24oZSl7dC5BdWRpb05vZGUuY2FsbCh0aGlzKSx0aGlzLl9wYW5uZXI9dGhpcy5pbnB1dD10aGlzLm91dHB1dD10aGlzLmNvbnRleHQuY3JlYXRlU3RlcmVvUGFubmVyKCksdGhpcy5wYW49dGhpcy5fcGFubmVyLnBhbix0aGlzLnBhbi52YWx1ZT10LmRlZmF1bHRBcmcoZSwwKSx0aGlzLl9yZWFkT25seShcInBhblwiKX0sdC5leHRlbmQodC5QYW5uZXIsdC5BdWRpb05vZGUpLHQuUGFubmVyLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fd3JpdGFibGUoXCJwYW5cIiksdGhpcy5fcGFubmVyLmRpc2Nvbm5lY3QoKSx0aGlzLl9wYW5uZXI9bnVsbCx0aGlzLnBhbj1udWxsLHRoaXN9LHQuUGFubmVyfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDcpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5Qb3c9ZnVuY3Rpb24oZSl7dC5TaWduYWxCYXNlLmNhbGwodGhpcyksdGhpcy5fZXhwPXQuZGVmYXVsdEFyZyhlLDEpLHRoaXMuX2V4cFNjYWxlcj10aGlzLmlucHV0PXRoaXMub3V0cHV0PW5ldyB0LldhdmVTaGFwZXIodGhpcy5fZXhwRnVuYyh0aGlzLl9leHApLDgxOTIpfSx0LmV4dGVuZCh0LlBvdyx0LlNpZ25hbEJhc2UpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlBvdy5wcm90b3R5cGUsXCJ2YWx1ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXhwfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fZXhwPXQsdGhpcy5fZXhwU2NhbGVyLnNldE1hcCh0aGlzLl9leHBGdW5jKHRoaXMuX2V4cCkpfX0pLHQuUG93LnByb3RvdHlwZS5fZXhwRnVuYz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucG93KE1hdGguYWJzKGUpLHQpfX0sdC5Qb3cucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5TaWduYWxCYXNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fZXhwU2NhbGVyLmRpc3Bvc2UoKSx0aGlzLl9leHBTY2FsZXI9bnVsbCx0aGlzfSx0LlBvd30uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgyMCksaSg2NildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe3JldHVybiB0Lk9mZmxpbmVDb250ZXh0PWZ1bmN0aW9uKGUsaSxuKXt2YXIgbz1uZXcgT2ZmbGluZUF1ZGlvQ29udGV4dChlLGkqbixuKTt0LkNvbnRleHQuY2FsbCh0aGlzLHtjb250ZXh0Om8sY2xvY2tTb3VyY2U6XCJvZmZsaW5lXCIsbG9va0FoZWFkOjAsdXBkYXRlSW50ZXJ2YWw6MTI4L259KSx0aGlzLl9kdXJhdGlvbj1pLHRoaXMuX2N1cnJlbnRUaW1lPTB9LHQuZXh0ZW5kKHQuT2ZmbGluZUNvbnRleHQsdC5Db250ZXh0KSx0Lk9mZmxpbmVDb250ZXh0LnByb3RvdHlwZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY3VycmVudFRpbWV9LHQuT2ZmbGluZUNvbnRleHQucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBQcm9taXNlLnJlc29sdmUoKX0sdC5PZmZsaW5lQ29udGV4dC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7Zm9yKDt0aGlzLl9kdXJhdGlvbi10aGlzLl9jdXJyZW50VGltZT49MDspdGhpcy5lbWl0KFwidGlja1wiKSx0aGlzLl9jdXJyZW50VGltZSs9dGhpcy5ibG9ja1RpbWU7cmV0dXJuIHRoaXMuX2NvbnRleHQuc3RhcnRSZW5kZXJpbmcoKX0sdC5PZmZsaW5lQ29udGV4dC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGV4dD1udWxsLFByb21pc2UucmVzb2x2ZSgpfSx0Lk9mZmxpbmVDb250ZXh0fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDYyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7aWYodC5zdXBwb3J0ZWQpe3ZhciBlPW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtlLmluY2x1ZGVzKFwic2FmYXJpXCIpJiYhZS5pbmNsdWRlcyhcImNocm9tZVwiKSYmZS5pbmNsdWRlcyhcIm1vYmlsZVwiKSYmKHQuT2ZmbGluZUNvbnRleHQucHJvdG90eXBlLmNyZWF0ZUJ1ZmZlclNvdXJjZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCksZT10LnN0YXJ0O3JldHVybiB0LnN0YXJ0PWZ1bmN0aW9uKGkpe3RoaXMuc2V0VGltZW91dChmdW5jdGlvbigpe2UuY2FsbCh0LGkpfS5iaW5kKHRoaXMpLDApfS5iaW5kKHRoaXMpLHR9KX19LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtyZXR1cm4gdC5UaW1lQmFzZT1mdW5jdGlvbihlLGkpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHQuVGltZUJhc2UpKXJldHVybiBuZXcgdC5UaW1lQmFzZShlLGkpO2lmKHRoaXMuX3ZhbD1lLHRoaXMuX3VuaXRzPWksdC5pc1VuZGVmKHRoaXMuX3VuaXRzKSYmdC5pc1N0cmluZyh0aGlzLl92YWwpJiZwYXJzZUZsb2F0KHRoaXMuX3ZhbCk9PXRoaXMuX3ZhbCYmXCIrXCIhPT10aGlzLl92YWwuY2hhckF0KDApKXRoaXMuX3ZhbD1wYXJzZUZsb2F0KHRoaXMuX3ZhbCksdGhpcy5fdW5pdHM9dGhpcy5fZGVmYXVsdFVuaXRzO2Vsc2UgaWYoZSYmZS5jb25zdHJ1Y3Rvcj09PXRoaXMuY29uc3RydWN0b3IpdGhpcy5fdmFsPWUuX3ZhbCx0aGlzLl91bml0cz1lLl91bml0cztlbHNlIGlmKGUgaW5zdGFuY2VvZiB0LlRpbWVCYXNlKXN3aXRjaCh0aGlzLl9kZWZhdWx0VW5pdHMpe2Nhc2VcInNcIjp0aGlzLl92YWw9ZS50b1NlY29uZHMoKTticmVhaztjYXNlXCJpXCI6dGhpcy5fdmFsPWUudG9UaWNrcygpO2JyZWFrO2Nhc2VcImh6XCI6dGhpcy5fdmFsPWUudG9GcmVxdWVuY3koKTticmVhaztjYXNlXCJtaWRpXCI6dGhpcy5fdmFsPWUudG9NaWRpKCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgZGVmYXVsdCB1bml0cyBcIit0aGlzLl9kZWZhdWx0VW5pdHMpfX0sdC5leHRlbmQodC5UaW1lQmFzZSksdC5UaW1lQmFzZS5wcm90b3R5cGUuX2V4cHJlc3Npb25zPXtuOntyZWdleHA6L14oXFxkKyluKFxcLj8pJC9pLG1ldGhvZDpmdW5jdGlvbih0LGUpe3Q9cGFyc2VJbnQodCk7dmFyIGk9XCIuXCI9PT1lPzEuNToxO3JldHVybiAxPT09dD90aGlzLl9iZWF0c1RvVW5pdHModGhpcy5fZ2V0VGltZVNpZ25hdHVyZSgpKSppOnRoaXMuX2JlYXRzVG9Vbml0cyg0L3QpKml9fSx0OntyZWdleHA6L14oXFxkKyl0JC9pLG1ldGhvZDpmdW5jdGlvbih0KXtyZXR1cm4gdD1wYXJzZUludCh0KSx0aGlzLl9iZWF0c1RvVW5pdHMoOC8oMypwYXJzZUludCh0KSkpfX0sbTp7cmVnZXhwOi9eKFxcZCspbSQvaSxtZXRob2Q6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2JlYXRzVG9Vbml0cyhwYXJzZUludCh0KSp0aGlzLl9nZXRUaW1lU2lnbmF0dXJlKCkpfX0saTp7cmVnZXhwOi9eKFxcZCspaSQvaSxtZXRob2Q6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3RpY2tzVG9Vbml0cyhwYXJzZUludCh0KSl9fSxoejp7cmVnZXhwOi9eKFxcZCsoPzpcXC5cXGQrKT8paHokL2ksbWV0aG9kOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9mcmVxdWVuY3lUb1VuaXRzKHBhcnNlRmxvYXQodCkpfX0sdHI6e3JlZ2V4cDovXihcXGQrKD86XFwuXFxkKyk/KTooXFxkKyg/OlxcLlxcZCspPyk6PyhcXGQrKD86XFwuXFxkKyk/KT8kLyxtZXRob2Q6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPTA7cmV0dXJuIHQmJlwiMFwiIT09dCYmKG4rPXRoaXMuX2JlYXRzVG9Vbml0cyh0aGlzLl9nZXRUaW1lU2lnbmF0dXJlKCkqcGFyc2VGbG9hdCh0KSkpLGUmJlwiMFwiIT09ZSYmKG4rPXRoaXMuX2JlYXRzVG9Vbml0cyhwYXJzZUZsb2F0KGUpKSksaSYmXCIwXCIhPT1pJiYobis9dGhpcy5fYmVhdHNUb1VuaXRzKHBhcnNlRmxvYXQoaSkvNCkpLG59fSxzOntyZWdleHA6L14oXFxkKyg/OlxcLlxcZCspPylzJC8sbWV0aG9kOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9zZWNvbmRzVG9Vbml0cyhwYXJzZUZsb2F0KHQpKX19LHNhbXBsZXM6e3JlZ2V4cDovXihcXGQrKXNhbXBsZXMkLyxtZXRob2Q6ZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlSW50KHQpL3RoaXMuY29udGV4dC5zYW1wbGVSYXRlfX0sZGVmYXVsdDp7cmVnZXhwOi9eKFxcZCsoPzpcXC5cXGQrKT8pJC8sbWV0aG9kOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9leHByZXNzaW9uc1t0aGlzLl9kZWZhdWx0VW5pdHNdLm1ldGhvZC5jYWxsKHRoaXMsdCl9fX0sdC5UaW1lQmFzZS5wcm90b3R5cGUuX2RlZmF1bHRVbml0cz1cInNcIix0LlRpbWVCYXNlLnByb3RvdHlwZS5fZ2V0QnBtPWZ1bmN0aW9uKCl7cmV0dXJuIHQuVHJhbnNwb3J0P3QuVHJhbnNwb3J0LmJwbS52YWx1ZToxMjB9LHQuVGltZUJhc2UucHJvdG90eXBlLl9nZXRUaW1lU2lnbmF0dXJlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuVHJhbnNwb3J0P3QuVHJhbnNwb3J0LnRpbWVTaWduYXR1cmU6NH0sdC5UaW1lQmFzZS5wcm90b3R5cGUuX2dldFBQUT1mdW5jdGlvbigpe3JldHVybiB0LlRyYW5zcG9ydD90LlRyYW5zcG9ydC5QUFE6MTkyfSx0LlRpbWVCYXNlLnByb3RvdHlwZS5fbm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm93KCl9LHQuVGltZUJhc2UucHJvdG90eXBlLl9mcmVxdWVuY3lUb1VuaXRzPWZ1bmN0aW9uKHQpe3JldHVybiAxL3R9LHQuVGltZUJhc2UucHJvdG90eXBlLl9iZWF0c1RvVW5pdHM9ZnVuY3Rpb24odCl7cmV0dXJuIDYwL3RoaXMuX2dldEJwbSgpKnR9LHQuVGltZUJhc2UucHJvdG90eXBlLl9zZWNvbmRzVG9Vbml0cz1mdW5jdGlvbih0KXtyZXR1cm4gdH0sdC5UaW1lQmFzZS5wcm90b3R5cGUuX3RpY2tzVG9Vbml0cz1mdW5jdGlvbih0KXtyZXR1cm4gdCoodGhpcy5fYmVhdHNUb1VuaXRzKDEpL3RoaXMuX2dldFBQUSgpKX0sdC5UaW1lQmFzZS5wcm90b3R5cGUuX25vQXJnPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vdygpfSx0LlRpbWVCYXNlLnByb3RvdHlwZS52YWx1ZU9mPWZ1bmN0aW9uKCl7aWYodC5pc1VuZGVmKHRoaXMuX3ZhbCkpcmV0dXJuIHRoaXMuX25vQXJnKCk7aWYodC5pc1N0cmluZyh0aGlzLl92YWwpJiZ0LmlzVW5kZWYodGhpcy5fdW5pdHMpKXtmb3IodmFyIGUgaW4gdGhpcy5fZXhwcmVzc2lvbnMpaWYodGhpcy5fZXhwcmVzc2lvbnNbZV0ucmVnZXhwLnRlc3QodGhpcy5fdmFsLnRyaW0oKSkpe3RoaXMuX3VuaXRzPWU7YnJlYWt9fWVsc2UgaWYodC5pc09iamVjdCh0aGlzLl92YWwpKXt2YXIgaT0wO2Zvcih2YXIgbiBpbiB0aGlzLl92YWwpe3ZhciBvPXRoaXMuX3ZhbFtuXTtpKz1uZXcgdGhpcy5jb25zdHJ1Y3RvcihuKS52YWx1ZU9mKCkqb31yZXR1cm4gaX1pZih0LmlzRGVmaW5lZCh0aGlzLl91bml0cykpe3ZhciBzPXRoaXMuX2V4cHJlc3Npb25zW3RoaXMuX3VuaXRzXSxyPXRoaXMuX3ZhbC50b1N0cmluZygpLnRyaW0oKS5tYXRjaChzLnJlZ2V4cCk7cmV0dXJuIHI/cy5tZXRob2QuYXBwbHkodGhpcyxyLnNsaWNlKDEpKTpzLm1ldGhvZC5jYWxsKHRoaXMscGFyc2VGbG9hdCh0aGlzLl92YWwpKX1yZXR1cm4gdGhpcy5fdmFsfSx0LlRpbWVCYXNlLnByb3RvdHlwZS50b1NlY29uZHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZU9mKCl9LHQuVGltZUJhc2UucHJvdG90eXBlLnRvRnJlcXVlbmN5PWZ1bmN0aW9uKCl7cmV0dXJuIDEvdGhpcy50b1NlY29uZHMoKX0sdC5UaW1lQmFzZS5wcm90b3R5cGUudG9TYW1wbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9TZWNvbmRzKCkqdGhpcy5jb250ZXh0LnNhbXBsZVJhdGV9LHQuVGltZUJhc2UucHJvdG90eXBlLnRvTWlsbGlzZWNvbmRzPWZ1bmN0aW9uKCl7cmV0dXJuIDFlMyp0aGlzLnRvU2Vjb25kcygpfSx0LlRpbWVCYXNlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5fdmFsPW51bGwsdGhpcy5fdW5pdHM9bnVsbH0sdC5UaW1lQmFzZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg2NCksaSg0NildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe3JldHVybiB0LlRpbWU9ZnVuY3Rpb24oZSxpKXtpZighKHRoaXMgaW5zdGFuY2VvZiB0LlRpbWUpKXJldHVybiBuZXcgdC5UaW1lKGUsaSk7dC5UaW1lQmFzZS5jYWxsKHRoaXMsZSxpKX0sdC5leHRlbmQodC5UaW1lLHQuVGltZUJhc2UpLHQuVGltZS5wcm90b3R5cGUuX2V4cHJlc3Npb25zPU9iamVjdC5hc3NpZ24oe30sdC5UaW1lQmFzZS5wcm90b3R5cGUuX2V4cHJlc3Npb25zLHtxdWFudGl6ZTp7cmVnZXhwOi9eQCguKykvLG1ldGhvZDpmdW5jdGlvbihlKXtpZih0LlRyYW5zcG9ydCl7dmFyIGk9bmV3IHRoaXMuY29uc3RydWN0b3IoZSk7cmV0dXJuIHRoaXMuX3NlY29uZHNUb1VuaXRzKHQuVHJhbnNwb3J0Lm5leHRTdWJkaXZpc2lvbihpKSl9cmV0dXJuIDB9fSxub3c6e3JlZ2V4cDovXlxcKyguKykvLG1ldGhvZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbm93KCkrbmV3IHRoaXMuY29uc3RydWN0b3IodCl9fX0pLHQuVGltZS5wcm90b3R5cGUucXVhbnRpemU9ZnVuY3Rpb24oZSxpKXtpPXQuZGVmYXVsdEFyZyhpLDEpO3ZhciBuPW5ldyB0aGlzLmNvbnN0cnVjdG9yKGUpLG89dGhpcy52YWx1ZU9mKCk7cmV0dXJuIG8rKE1hdGgucm91bmQoby9uKSpuLW8pKml9LHQuVGltZS5wcm90b3R5cGUudG9Ob3RhdGlvbj1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLnRvU2Vjb25kcygpLGk9W1wiMW1cIl0sbj0xO248ODtuKyspe3ZhciBvPU1hdGgucG93KDIsbik7aS5wdXNoKG8rXCJuLlwiKSxpLnB1c2gobytcIm5cIiksaS5wdXNoKG8rXCJ0XCIpfWkucHVzaChcIjBcIik7dmFyIHM9aVswXSxyPXQuVGltZShpWzBdKS50b1NlY29uZHMoKTtyZXR1cm4gaS5mb3JFYWNoKGZ1bmN0aW9uKGkpe3ZhciBuPXQuVGltZShpKS50b1NlY29uZHMoKTtNYXRoLmFicyhuLWUpPE1hdGguYWJzKHItZSkmJihzPWkscj1uKX0pLHN9LHQuVGltZS5wcm90b3R5cGUudG9CYXJzQmVhdHNTaXh0ZWVudGhzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fYmVhdHNUb1VuaXRzKDEpLGU9dGhpcy52YWx1ZU9mKCkvdDtlPXBhcnNlRmxvYXQoZS50b0ZpeGVkKDQpKTt2YXIgaT1NYXRoLmZsb29yKGUvdGhpcy5fZ2V0VGltZVNpZ25hdHVyZSgpKSxuPWUlMSo0O3JldHVybiBlPU1hdGguZmxvb3IoZSkldGhpcy5fZ2V0VGltZVNpZ25hdHVyZSgpLChuPW4udG9TdHJpbmcoKSkubGVuZ3RoPjMmJihuPXBhcnNlRmxvYXQocGFyc2VGbG9hdChuKS50b0ZpeGVkKDMpKSksW2ksZSxuXS5qb2luKFwiOlwiKX0sdC5UaW1lLnByb3RvdHlwZS50b1RpY2tzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fYmVhdHNUb1VuaXRzKDEpLGU9dGhpcy52YWx1ZU9mKCkvdDtyZXR1cm4gTWF0aC5yb3VuZChlKnRoaXMuX2dldFBQUSgpKX0sdC5UaW1lLnByb3RvdHlwZS50b1NlY29uZHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZU9mKCl9LHQuVGltZS5wcm90b3R5cGUudG9NaWRpPWZ1bmN0aW9uKCl7cmV0dXJuIHQuRnJlcXVlbmN5LmZ0b20odGhpcy50b0ZyZXF1ZW5jeSgpKX0sdC5UaW1lfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7aWYodC5zdXBwb3J0ZWQpeyF0Lmdsb2JhbC5oYXNPd25Qcm9wZXJ0eShcIk9mZmxpbmVBdWRpb0NvbnRleHRcIikmJnQuZ2xvYmFsLmhhc093blByb3BlcnR5KFwid2Via2l0T2ZmbGluZUF1ZGlvQ29udGV4dFwiKSYmKHQuZ2xvYmFsLk9mZmxpbmVBdWRpb0NvbnRleHQ9dC5nbG9iYWwud2Via2l0T2ZmbGluZUF1ZGlvQ29udGV4dCk7dmFyIGU9bmV3IE9mZmxpbmVBdWRpb0NvbnRleHQoMSwxLDQ0MTAwKS5zdGFydFJlbmRlcmluZygpO2UmJnQuaXNGdW5jdGlvbihlLnRoZW4pfHwoT2ZmbGluZUF1ZGlvQ29udGV4dC5wcm90b3R5cGUuX25hdGl2ZV9zdGFydFJlbmRlcmluZz1PZmZsaW5lQXVkaW9Db250ZXh0LnByb3RvdHlwZS5zdGFydFJlbmRlcmluZyxPZmZsaW5lQXVkaW9Db250ZXh0LnByb3RvdHlwZS5zdGFydFJlbmRlcmluZz1mdW5jdGlvbigpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0KXt0aGlzLm9uY29tcGxldGU9ZnVuY3Rpb24oZSl7dChlLnJlbmRlcmVkQnVmZmVyKX0sdGhpcy5fbmF0aXZlX3N0YXJ0UmVuZGVyaW5nKCl9LmJpbmQodGhpcykpfSl9fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDExKSxpKDYpLGkoNTYpLGkoMzEpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5QbGF5ZXI9ZnVuY3Rpb24oZSl7dmFyIGk7ZSBpbnN0YW5jZW9mIHQuQnVmZmVyJiZlLmxvYWRlZD8oZT1lLmdldCgpLGk9dC5QbGF5ZXIuZGVmYXVsdHMpOmk9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1widXJsXCIsXCJvbmxvYWRcIl0sdC5QbGF5ZXIpLHQuU291cmNlLmNhbGwodGhpcyxpKSx0aGlzLmF1dG9zdGFydD1pLmF1dG9zdGFydCx0aGlzLl9idWZmZXI9bmV3IHQuQnVmZmVyKHt1cmw6aS51cmwsb25sb2FkOnRoaXMuX29ubG9hZC5iaW5kKHRoaXMsaS5vbmxvYWQpLHJldmVyc2U6aS5yZXZlcnNlfSksZSBpbnN0YW5jZW9mIEF1ZGlvQnVmZmVyJiZ0aGlzLl9idWZmZXIuc2V0KGUpLHRoaXMuX2xvb3A9aS5sb29wLHRoaXMuX2xvb3BTdGFydD1pLmxvb3BTdGFydCx0aGlzLl9sb29wRW5kPWkubG9vcEVuZCx0aGlzLl9wbGF5YmFja1JhdGU9aS5wbGF5YmFja1JhdGUsdGhpcy5fYWN0aXZlU291cmNlcz1bXSx0aGlzLmZhZGVJbj1pLmZhZGVJbix0aGlzLmZhZGVPdXQ9aS5mYWRlT3V0fSx0LmV4dGVuZCh0LlBsYXllcix0LlNvdXJjZSksdC5QbGF5ZXIuZGVmYXVsdHM9e29ubG9hZDp0Lm5vT3AscGxheWJhY2tSYXRlOjEsbG9vcDohMSxhdXRvc3RhcnQ6ITEsbG9vcFN0YXJ0OjAsbG9vcEVuZDowLHJldmVyc2U6ITEsZmFkZUluOjAsZmFkZU91dDowfSx0LlBsYXllci5wcm90b3R5cGUubG9hZD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9idWZmZXIubG9hZCh0LHRoaXMuX29ubG9hZC5iaW5kKHRoaXMsZSkpfSx0LlBsYXllci5wcm90b3R5cGUuX29ubG9hZD1mdW5jdGlvbihlKXsoZT10LmRlZmF1bHRBcmcoZSx0Lm5vT3ApKSh0aGlzKSx0aGlzLmF1dG9zdGFydCYmdGhpcy5zdGFydCgpfSx0LlBsYXllci5wcm90b3R5cGUuX29uU291cmNlRW5kPWZ1bmN0aW9uKGUpe3ZhciBpPXRoaXMuX2FjdGl2ZVNvdXJjZXMuaW5kZXhPZihlKTt0aGlzLl9hY3RpdmVTb3VyY2VzLnNwbGljZShpLDEpLDAhPT10aGlzLl9hY3RpdmVTb3VyY2VzLmxlbmd0aHx8dGhpcy5fc3luY2VkfHx0aGlzLl9zdGF0ZS5zZXRTdGF0ZUF0VGltZSh0LlN0YXRlLlN0b3BwZWQsdC5ub3coKSl9LHQuUGxheWVyLnByb3RvdHlwZS5fc3RhcnQ9ZnVuY3Rpb24oZSxpLG4pe2k9dGhpcy5fbG9vcD90LmRlZmF1bHRBcmcoaSx0aGlzLl9sb29wU3RhcnQpOnQuZGVmYXVsdEFyZyhpLDApLGk9dGhpcy50b1NlY29uZHMoaSk7dmFyIG89dC5kZWZhdWx0QXJnKG4sTWF0aC5tYXgodGhpcy5fYnVmZmVyLmR1cmF0aW9uLWksMCkpO289dGhpcy50b1NlY29uZHMobyksby89dGhpcy5fcGxheWJhY2tSYXRlLGU9dGhpcy50b1NlY29uZHMoZSk7dmFyIHM9bmV3IHQuQnVmZmVyU291cmNlKHtidWZmZXI6dGhpcy5fYnVmZmVyLGxvb3A6dGhpcy5fbG9vcCxsb29wU3RhcnQ6dGhpcy5fbG9vcFN0YXJ0LGxvb3BFbmQ6dGhpcy5fbG9vcEVuZCxvbmVuZGVkOnRoaXMuX29uU291cmNlRW5kLmJpbmQodGhpcykscGxheWJhY2tSYXRlOnRoaXMuX3BsYXliYWNrUmF0ZSxmYWRlSW46dGhpcy5mYWRlSW4sZmFkZU91dDp0aGlzLmZhZGVPdXR9KS5jb25uZWN0KHRoaXMub3V0cHV0KTtyZXR1cm4gdGhpcy5fbG9vcHx8dGhpcy5fc3luY2VkfHx0aGlzLl9zdGF0ZS5zZXRTdGF0ZUF0VGltZSh0LlN0YXRlLlN0b3BwZWQsZStvKSx0aGlzLl9hY3RpdmVTb3VyY2VzLnB1c2gocyksdGhpcy5fbG9vcCYmdC5pc1VuZGVmKG4pP3Muc3RhcnQoZSxpKTpzLnN0YXJ0KGUsaSxvLXRoaXMudG9TZWNvbmRzKHRoaXMuZmFkZU91dCkpLHRoaXN9LHQuUGxheWVyLnByb3RvdHlwZS5fc3RvcD1mdW5jdGlvbih0KXtyZXR1cm4gdD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl9hY3RpdmVTb3VyY2VzLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5zdG9wKHQpfSksdGhpc30sdC5QbGF5ZXIucHJvdG90eXBlLnJlc3RhcnQ9ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLl9zdG9wKHQpLHRoaXMuX3N0YXJ0KHQsZSxpKSx0aGlzfSx0LlBsYXllci5wcm90b3R5cGUuc2Vlaz1mdW5jdGlvbihlLGkpe3JldHVybiBpPXRoaXMudG9TZWNvbmRzKGkpLHRoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKGkpPT09dC5TdGF0ZS5TdGFydGVkJiYoZT10aGlzLnRvU2Vjb25kcyhlKSx0aGlzLl9zdG9wKGkpLHRoaXMuX3N0YXJ0KGksZSkpLHRoaXN9LHQuUGxheWVyLnByb3RvdHlwZS5zZXRMb29wUG9pbnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubG9vcFN0YXJ0PXQsdGhpcy5sb29wRW5kPWUsdGhpc30sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGxheWVyLnByb3RvdHlwZSxcImxvb3BTdGFydFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbG9vcFN0YXJ0fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbG9vcFN0YXJ0PXQsdGhpcy5fYWN0aXZlU291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UubG9vcFN0YXJ0PXR9KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QbGF5ZXIucHJvdG90eXBlLFwibG9vcEVuZFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbG9vcEVuZH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2xvb3BFbmQ9dCx0aGlzLl9hY3RpdmVTb3VyY2VzLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5sb29wRW5kPXR9KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QbGF5ZXIucHJvdG90eXBlLFwiYnVmZmVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9idWZmZXJ9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9idWZmZXIuc2V0KHQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlBsYXllci5wcm90b3R5cGUsXCJsb29wXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb29wfSxzZXQ6ZnVuY3Rpb24oZSl7aWYodGhpcy5fbG9vcCE9PWUmJih0aGlzLl9sb29wPWUsdGhpcy5fYWN0aXZlU291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QubG9vcD1lfSksZSkpe3ZhciBpPXRoaXMuX3N0YXRlLmdldE5leHRTdGF0ZSh0LlN0YXRlLlN0b3BwZWQsdGhpcy5ub3coKSk7aSYmdGhpcy5fc3RhdGUuY2FuY2VsKGkudGltZSl9fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlBsYXllci5wcm90b3R5cGUsXCJwbGF5YmFja1JhdGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BsYXliYWNrUmF0ZX0sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX3BsYXliYWNrUmF0ZT1lO3ZhciBpPXRoaXMubm93KCksbj10aGlzLl9zdGF0ZS5nZXROZXh0U3RhdGUodC5TdGF0ZS5TdG9wcGVkLGkpO24mJnRoaXMuX3N0YXRlLmNhbmNlbChuLnRpbWUpLHRoaXMuX2FjdGl2ZVNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbih0KXt0LmNhbmNlbFN0b3AoKSx0LnBsYXliYWNrUmF0ZS5zZXRWYWx1ZUF0VGltZShlLGkpfSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGxheWVyLnByb3RvdHlwZSxcInJldmVyc2VcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2J1ZmZlci5yZXZlcnNlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fYnVmZmVyLnJldmVyc2U9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QbGF5ZXIucHJvdG90eXBlLFwibG9hZGVkXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9idWZmZXIubG9hZGVkfX0pLHQuUGxheWVyLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZVNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbih0KXt0LmRpc3Bvc2UoKX0pLHRoaXMuX2FjdGl2ZVNvdXJjZXM9bnVsbCx0LlNvdXJjZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX2J1ZmZlci5kaXNwb3NlKCksdGhpcy5fYnVmZmVyPW51bGwsdGhpc30sdC5QbGF5ZXJ9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMzApLGkoNDEpLGkoMzcpLGkoMSksaSg5KSxpKDI1KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuTW9ub1N5bnRoPWZ1bmN0aW9uKGUpe2U9dC5kZWZhdWx0QXJnKGUsdC5Nb25vU3ludGguZGVmYXVsdHMpLHQuTW9ub3Bob25pYy5jYWxsKHRoaXMsZSksdGhpcy5vc2NpbGxhdG9yPW5ldyB0Lk9tbmlPc2NpbGxhdG9yKGUub3NjaWxsYXRvciksdGhpcy5mcmVxdWVuY3k9dGhpcy5vc2NpbGxhdG9yLmZyZXF1ZW5jeSx0aGlzLmRldHVuZT10aGlzLm9zY2lsbGF0b3IuZGV0dW5lLHRoaXMuZmlsdGVyPW5ldyB0LkZpbHRlcihlLmZpbHRlciksdGhpcy5maWx0ZXIuZnJlcXVlbmN5LnZhbHVlPTVlMyx0aGlzLmZpbHRlckVudmVsb3BlPW5ldyB0LkZyZXF1ZW5jeUVudmVsb3BlKGUuZmlsdGVyRW52ZWxvcGUpLHRoaXMuZW52ZWxvcGU9bmV3IHQuQW1wbGl0dWRlRW52ZWxvcGUoZS5lbnZlbG9wZSksdGhpcy5vc2NpbGxhdG9yLmNoYWluKHRoaXMuZmlsdGVyLHRoaXMuZW52ZWxvcGUsdGhpcy5vdXRwdXQpLHRoaXMuZmlsdGVyRW52ZWxvcGUuY29ubmVjdCh0aGlzLmZpbHRlci5mcmVxdWVuY3kpLHRoaXMuX3JlYWRPbmx5KFtcIm9zY2lsbGF0b3JcIixcImZyZXF1ZW5jeVwiLFwiZGV0dW5lXCIsXCJmaWx0ZXJcIixcImZpbHRlckVudmVsb3BlXCIsXCJlbnZlbG9wZVwiXSl9LHQuZXh0ZW5kKHQuTW9ub1N5bnRoLHQuTW9ub3Bob25pYyksdC5Nb25vU3ludGguZGVmYXVsdHM9e2ZyZXF1ZW5jeTpcIkM0XCIsZGV0dW5lOjAsb3NjaWxsYXRvcjp7dHlwZTpcInNxdWFyZVwifSxmaWx0ZXI6e1E6Nix0eXBlOlwibG93cGFzc1wiLHJvbGxvZmY6LTI0fSxlbnZlbG9wZTp7YXR0YWNrOi4wMDUsZGVjYXk6LjEsc3VzdGFpbjouOSxyZWxlYXNlOjF9LGZpbHRlckVudmVsb3BlOnthdHRhY2s6LjA2LGRlY2F5Oi4yLHN1c3RhaW46LjUscmVsZWFzZToyLGJhc2VGcmVxdWVuY3k6MjAwLG9jdGF2ZXM6NyxleHBvbmVudDoyfX0sdC5Nb25vU3ludGgucHJvdG90eXBlLl90cmlnZ2VyRW52ZWxvcGVBdHRhY2s9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLmVudmVsb3BlLnRyaWdnZXJBdHRhY2sodCxlKSx0aGlzLmZpbHRlckVudmVsb3BlLnRyaWdnZXJBdHRhY2sodCksdGhpcy5vc2NpbGxhdG9yLnN0YXJ0KHQpLDA9PT10aGlzLmVudmVsb3BlLnN1c3RhaW4mJnRoaXMub3NjaWxsYXRvci5zdG9wKHQrdGhpcy5lbnZlbG9wZS5hdHRhY2srdGhpcy5lbnZlbG9wZS5kZWNheSksdGhpc30sdC5Nb25vU3ludGgucHJvdG90eXBlLl90cmlnZ2VyRW52ZWxvcGVSZWxlYXNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVudmVsb3BlLnRyaWdnZXJSZWxlYXNlKHQpLHRoaXMuZmlsdGVyRW52ZWxvcGUudHJpZ2dlclJlbGVhc2UodCksdGhpcy5vc2NpbGxhdG9yLnN0b3AodCt0aGlzLmVudmVsb3BlLnJlbGVhc2UpLHRoaXN9LHQuTW9ub1N5bnRoLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuTW9ub3Bob25pYy5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcIm9zY2lsbGF0b3JcIixcImZyZXF1ZW5jeVwiLFwiZGV0dW5lXCIsXCJmaWx0ZXJcIixcImZpbHRlckVudmVsb3BlXCIsXCJlbnZlbG9wZVwiXSksdGhpcy5vc2NpbGxhdG9yLmRpc3Bvc2UoKSx0aGlzLm9zY2lsbGF0b3I9bnVsbCx0aGlzLmVudmVsb3BlLmRpc3Bvc2UoKSx0aGlzLmVudmVsb3BlPW51bGwsdGhpcy5maWx0ZXJFbnZlbG9wZS5kaXNwb3NlKCksdGhpcy5maWx0ZXJFbnZlbG9wZT1udWxsLHRoaXMuZmlsdGVyLmRpc3Bvc2UoKSx0aGlzLmZpbHRlcj1udWxsLHRoaXMuZnJlcXVlbmN5PW51bGwsdGhpcy5kZXR1bmU9bnVsbCx0aGlzfSx0Lk1vbm9TeW50aH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg2KSxpKDE3KSxpKDUpLGkoMyldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkZhdE9zY2lsbGF0b3I9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJmcmVxdWVuY3lcIixcInR5cGVcIixcInNwcmVhZFwiXSx0LkZhdE9zY2lsbGF0b3IpO3QuU291cmNlLmNhbGwodGhpcyxlKSx0aGlzLmZyZXF1ZW5jeT1uZXcgdC5TaWduYWwoZS5mcmVxdWVuY3ksdC5UeXBlLkZyZXF1ZW5jeSksdGhpcy5kZXR1bmU9bmV3IHQuU2lnbmFsKGUuZGV0dW5lLHQuVHlwZS5DZW50cyksdGhpcy5fb3NjaWxsYXRvcnM9W10sdGhpcy5fc3ByZWFkPWUuc3ByZWFkLHRoaXMuX3R5cGU9ZS50eXBlLHRoaXMuX3BoYXNlPWUucGhhc2UsdGhpcy5fcGFydGlhbHM9ZS5wYXJ0aWFscyx0aGlzLl9wYXJ0aWFsQ291bnQ9ZS5wYXJ0aWFsQ291bnQsdGhpcy5jb3VudD1lLmNvdW50LHRoaXMuX3JlYWRPbmx5KFtcImZyZXF1ZW5jeVwiLFwiZGV0dW5lXCJdKX0sdC5leHRlbmQodC5GYXRPc2NpbGxhdG9yLHQuU291cmNlKSx0LkZhdE9zY2lsbGF0b3IuZGVmYXVsdHM9e2ZyZXF1ZW5jeTo0NDAsZGV0dW5lOjAscGhhc2U6MCxzcHJlYWQ6MjAsY291bnQ6Myx0eXBlOlwic2F3dG9vdGhcIixwYXJ0aWFsczpbXSxwYXJ0aWFsQ291bnQ6MH0sdC5GYXRPc2NpbGxhdG9yLnByb3RvdHlwZS5fc3RhcnQ9ZnVuY3Rpb24odCl7dD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uuc3RhcnQodCl9KX0sdC5GYXRPc2NpbGxhdG9yLnByb3RvdHlwZS5fc3RvcD1mdW5jdGlvbih0KXt0PXRoaXMudG9TZWNvbmRzKHQpLHRoaXMuX2ZvckVhY2goZnVuY3Rpb24oZSl7ZS5zdG9wKHQpfSl9LHQuRmF0T3NjaWxsYXRvci5wcm90b3R5cGUucmVzdGFydD1mdW5jdGlvbih0KXt0PXRoaXMudG9TZWNvbmRzKHQpLHRoaXMuX2ZvckVhY2goZnVuY3Rpb24oZSl7ZS5yZXN0YXJ0KHQpfSl9LHQuRmF0T3NjaWxsYXRvci5wcm90b3R5cGUuX2ZvckVhY2g9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9vc2NpbGxhdG9ycy5sZW5ndGg7ZSsrKXQuY2FsbCh0aGlzLHRoaXMuX29zY2lsbGF0b3JzW2VdLGUpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5GYXRPc2NpbGxhdG9yLnByb3RvdHlwZSxcInR5cGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3R5cGV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl90eXBlPXQsdGhpcy5fZm9yRWFjaChmdW5jdGlvbihlKXtlLnR5cGU9dH0pfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkZhdE9zY2lsbGF0b3IucHJvdG90eXBlLFwic3ByZWFkXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zcHJlYWR9LHNldDpmdW5jdGlvbih0KXtpZih0aGlzLl9zcHJlYWQ9dCx0aGlzLl9vc2NpbGxhdG9ycy5sZW5ndGg+MSl7dmFyIGU9LXQvMixpPXQvKHRoaXMuX29zY2lsbGF0b3JzLmxlbmd0aC0xKTt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKHQsbil7dC5kZXR1bmUudmFsdWU9ZStpKm59KX19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuRmF0T3NjaWxsYXRvci5wcm90b3R5cGUsXCJjb3VudFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3NjaWxsYXRvcnMubGVuZ3RofSxzZXQ6ZnVuY3Rpb24oZSl7aWYoZT1NYXRoLm1heChlLDEpLHRoaXMuX29zY2lsbGF0b3JzLmxlbmd0aCE9PWUpe3RoaXMuX2ZvckVhY2goZnVuY3Rpb24odCl7dC5kaXNwb3NlKCl9KSx0aGlzLl9vc2NpbGxhdG9ycz1bXTtmb3IodmFyIGk9MDtpPGU7aSsrKXt2YXIgbj1uZXcgdC5Pc2NpbGxhdG9yO3RoaXMudHlwZT09PXQuT3NjaWxsYXRvci5UeXBlLkN1c3RvbT9uLnBhcnRpYWxzPXRoaXMuX3BhcnRpYWxzOm4udHlwZT10aGlzLl90eXBlLG4ucGFydGlhbENvdW50PXRoaXMuX3BhcnRpYWxDb3VudCxuLnBoYXNlPXRoaXMuX3BoYXNlK2kvZSozNjAsbi52b2x1bWUudmFsdWU9LTYtMS4xKmUsdGhpcy5mcmVxdWVuY3kuY29ubmVjdChuLmZyZXF1ZW5jeSksdGhpcy5kZXR1bmUuY29ubmVjdChuLmRldHVuZSksbi5jb25uZWN0KHRoaXMub3V0cHV0KSx0aGlzLl9vc2NpbGxhdG9yc1tpXT1ufXRoaXMuc3ByZWFkPXRoaXMuX3NwcmVhZCx0aGlzLnN0YXRlPT09dC5TdGF0ZS5TdGFydGVkJiZ0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKHQpe3Quc3RhcnQoKX0pfX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5GYXRPc2NpbGxhdG9yLnByb3RvdHlwZSxcInBoYXNlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9waGFzZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3BoYXNlPXQsdGhpcy5fZm9yRWFjaChmdW5jdGlvbihlKXtlLnBoYXNlPXR9KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5GYXRPc2NpbGxhdG9yLnByb3RvdHlwZSxcImJhc2VUeXBlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vc2NpbGxhdG9yc1swXS5iYXNlVHlwZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2ZvckVhY2goZnVuY3Rpb24oZSl7ZS5iYXNlVHlwZT10fSksdGhpcy5fdHlwZT10aGlzLl9vc2NpbGxhdG9yc1swXS50eXBlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkZhdE9zY2lsbGF0b3IucHJvdG90eXBlLFwicGFydGlhbHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29zY2lsbGF0b3JzWzBdLnBhcnRpYWxzfSxzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5fcGFydGlhbHM9ZSx0aGlzLl90eXBlPXQuT3NjaWxsYXRvci5UeXBlLkN1c3RvbSx0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKHQpe3QucGFydGlhbHM9ZX0pfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkZhdE9zY2lsbGF0b3IucHJvdG90eXBlLFwicGFydGlhbENvdW50XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vc2NpbGxhdG9yc1swXS5wYXJ0aWFsQ291bnR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9wYXJ0aWFsQ291bnQ9dCx0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucGFydGlhbENvdW50PXR9KSx0aGlzLl90eXBlPXRoaXMuX29zY2lsbGF0b3JzWzBdLnR5cGV9fSksdC5GYXRPc2NpbGxhdG9yLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU291cmNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fd3JpdGFibGUoW1wiZnJlcXVlbmN5XCIsXCJkZXR1bmVcIl0pLHRoaXMuZnJlcXVlbmN5LmRpc3Bvc2UoKSx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXMuZGV0dW5lLmRpc3Bvc2UoKSx0aGlzLmRldHVuZT1udWxsLHRoaXMuX2ZvckVhY2goZnVuY3Rpb24odCl7dC5kaXNwb3NlKCl9KSx0aGlzLl9vc2NpbGxhdG9ycz1udWxsLHRoaXMuX3BhcnRpYWxzPW51bGwsdGhpc30sdC5GYXRPc2NpbGxhdG9yfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDYpLGkoMTcpLGkoNSksaSgzKSxpKDIyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuQU1Pc2NpbGxhdG9yPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiZnJlcXVlbmN5XCIsXCJ0eXBlXCIsXCJtb2R1bGF0aW9uVHlwZVwiXSx0LkFNT3NjaWxsYXRvcik7dC5Tb3VyY2UuY2FsbCh0aGlzLGUpLHRoaXMuX2NhcnJpZXI9bmV3IHQuT3NjaWxsYXRvcihlLmZyZXF1ZW5jeSxlLnR5cGUpLHRoaXMuZnJlcXVlbmN5PXRoaXMuX2NhcnJpZXIuZnJlcXVlbmN5LHRoaXMuZGV0dW5lPXRoaXMuX2NhcnJpZXIuZGV0dW5lLHRoaXMuZGV0dW5lLnZhbHVlPWUuZGV0dW5lLHRoaXMuX21vZHVsYXRvcj1uZXcgdC5Pc2NpbGxhdG9yKGUuZnJlcXVlbmN5LGUubW9kdWxhdGlvblR5cGUpLHRoaXMuX21vZHVsYXRpb25TY2FsZT1uZXcgdC5BdWRpb1RvR2Fpbix0aGlzLmhhcm1vbmljaXR5PW5ldyB0Lk11bHRpcGx5KGUuaGFybW9uaWNpdHkpLHRoaXMuaGFybW9uaWNpdHkudW5pdHM9dC5UeXBlLlBvc2l0aXZlLHRoaXMuX21vZHVsYXRpb25Ob2RlPW5ldyB0LkdhaW4oMCksdGhpcy5mcmVxdWVuY3kuY2hhaW4odGhpcy5oYXJtb25pY2l0eSx0aGlzLl9tb2R1bGF0b3IuZnJlcXVlbmN5KSx0aGlzLmRldHVuZS5jb25uZWN0KHRoaXMuX21vZHVsYXRvci5kZXR1bmUpLHRoaXMuX21vZHVsYXRvci5jaGFpbih0aGlzLl9tb2R1bGF0aW9uU2NhbGUsdGhpcy5fbW9kdWxhdGlvbk5vZGUuZ2FpbiksdGhpcy5fY2Fycmllci5jaGFpbih0aGlzLl9tb2R1bGF0aW9uTm9kZSx0aGlzLm91dHB1dCksdGhpcy5waGFzZT1lLnBoYXNlLHRoaXMuX3JlYWRPbmx5KFtcImZyZXF1ZW5jeVwiLFwiZGV0dW5lXCIsXCJoYXJtb25pY2l0eVwiXSl9LHQuZXh0ZW5kKHQuQU1Pc2NpbGxhdG9yLHQuT3NjaWxsYXRvciksdC5BTU9zY2lsbGF0b3IuZGVmYXVsdHM9e2ZyZXF1ZW5jeTo0NDAsZGV0dW5lOjAscGhhc2U6MCx0eXBlOlwic2luZVwiLG1vZHVsYXRpb25UeXBlOlwic3F1YXJlXCIsaGFybW9uaWNpdHk6MX0sdC5BTU9zY2lsbGF0b3IucHJvdG90eXBlLl9zdGFydD1mdW5jdGlvbih0KXt0aGlzLl9tb2R1bGF0b3Iuc3RhcnQodCksdGhpcy5fY2Fycmllci5zdGFydCh0KX0sdC5BTU9zY2lsbGF0b3IucHJvdG90eXBlLl9zdG9wPWZ1bmN0aW9uKHQpe3RoaXMuX21vZHVsYXRvci5zdG9wKHQpLHRoaXMuX2NhcnJpZXIuc3RvcCh0KX0sdC5BTU9zY2lsbGF0b3IucHJvdG90eXBlLnJlc3RhcnQ9ZnVuY3Rpb24odCl7dGhpcy5fbW9kdWxhdG9yLnJlc3RhcnQodCksdGhpcy5fY2Fycmllci5yZXN0YXJ0KHQpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BTU9zY2lsbGF0b3IucHJvdG90eXBlLFwidHlwZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2Fycmllci50eXBlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2Fycmllci50eXBlPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQU1Pc2NpbGxhdG9yLnByb3RvdHlwZSxcImJhc2VUeXBlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jYXJyaWVyLmJhc2VUeXBlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2Fycmllci5iYXNlVHlwZT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkFNT3NjaWxsYXRvci5wcm90b3R5cGUsXCJwYXJ0aWFsQ291bnRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NhcnJpZXIucGFydGlhbENvdW50fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2Fycmllci5wYXJ0aWFsQ291bnQ9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BTU9zY2lsbGF0b3IucHJvdG90eXBlLFwibW9kdWxhdGlvblR5cGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vZHVsYXRvci50eXBlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbW9kdWxhdG9yLnR5cGU9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BTU9zY2lsbGF0b3IucHJvdG90eXBlLFwicGhhc2VcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NhcnJpZXIucGhhc2V9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9jYXJyaWVyLnBoYXNlPXQsdGhpcy5fbW9kdWxhdG9yLnBoYXNlPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQU1Pc2NpbGxhdG9yLnByb3RvdHlwZSxcInBhcnRpYWxzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jYXJyaWVyLnBhcnRpYWxzfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2Fycmllci5wYXJ0aWFscz10fX0pLHQuQU1Pc2NpbGxhdG9yLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU291cmNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fd3JpdGFibGUoW1wiZnJlcXVlbmN5XCIsXCJkZXR1bmVcIixcImhhcm1vbmljaXR5XCJdKSx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXMuZGV0dW5lPW51bGwsdGhpcy5oYXJtb25pY2l0eS5kaXNwb3NlKCksdGhpcy5oYXJtb25pY2l0eT1udWxsLHRoaXMuX2NhcnJpZXIuZGlzcG9zZSgpLHRoaXMuX2NhcnJpZXI9bnVsbCx0aGlzLl9tb2R1bGF0b3IuZGlzcG9zZSgpLHRoaXMuX21vZHVsYXRvcj1udWxsLHRoaXMuX21vZHVsYXRpb25Ob2RlLmRpc3Bvc2UoKSx0aGlzLl9tb2R1bGF0aW9uTm9kZT1udWxsLHRoaXMuX21vZHVsYXRpb25TY2FsZS5kaXNwb3NlKCksdGhpcy5fbW9kdWxhdGlvblNjYWxlPW51bGwsdGhpc30sdC5BTU9zY2lsbGF0b3J9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNiksaSg0OSksaSgxNyksaSg1KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuUFdNT3NjaWxsYXRvcj1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcImZyZXF1ZW5jeVwiLFwibW9kdWxhdGlvbkZyZXF1ZW5jeVwiXSx0LlBXTU9zY2lsbGF0b3IpO3QuU291cmNlLmNhbGwodGhpcyxlKSx0aGlzLl9wdWxzZT1uZXcgdC5QdWxzZU9zY2lsbGF0b3IoZS5tb2R1bGF0aW9uRnJlcXVlbmN5KSx0aGlzLl9wdWxzZS5fc2F3dG9vdGgudHlwZT1cInNpbmVcIix0aGlzLl9tb2R1bGF0b3I9bmV3IHQuT3NjaWxsYXRvcih7ZnJlcXVlbmN5OmUuZnJlcXVlbmN5LGRldHVuZTplLmRldHVuZSxwaGFzZTplLnBoYXNlfSksdGhpcy5fc2NhbGU9bmV3IHQuTXVsdGlwbHkoMiksdGhpcy5mcmVxdWVuY3k9dGhpcy5fbW9kdWxhdG9yLmZyZXF1ZW5jeSx0aGlzLmRldHVuZT10aGlzLl9tb2R1bGF0b3IuZGV0dW5lLHRoaXMubW9kdWxhdGlvbkZyZXF1ZW5jeT10aGlzLl9wdWxzZS5mcmVxdWVuY3ksdGhpcy5fbW9kdWxhdG9yLmNoYWluKHRoaXMuX3NjYWxlLHRoaXMuX3B1bHNlLndpZHRoKSx0aGlzLl9wdWxzZS5jb25uZWN0KHRoaXMub3V0cHV0KSx0aGlzLl9yZWFkT25seShbXCJtb2R1bGF0aW9uRnJlcXVlbmN5XCIsXCJmcmVxdWVuY3lcIixcImRldHVuZVwiXSl9LHQuZXh0ZW5kKHQuUFdNT3NjaWxsYXRvcix0LlNvdXJjZSksdC5QV01Pc2NpbGxhdG9yLmRlZmF1bHRzPXtmcmVxdWVuY3k6NDQwLGRldHVuZTowLHBoYXNlOjAsbW9kdWxhdGlvbkZyZXF1ZW5jeTouNH0sdC5QV01Pc2NpbGxhdG9yLnByb3RvdHlwZS5fc3RhcnQ9ZnVuY3Rpb24odCl7dD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl9tb2R1bGF0b3Iuc3RhcnQodCksdGhpcy5fcHVsc2Uuc3RhcnQodCl9LHQuUFdNT3NjaWxsYXRvci5wcm90b3R5cGUuX3N0b3A9ZnVuY3Rpb24odCl7dD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl9tb2R1bGF0b3Iuc3RvcCh0KSx0aGlzLl9wdWxzZS5zdG9wKHQpfSx0LlBXTU9zY2lsbGF0b3IucHJvdG90eXBlLnJlc3RhcnQ9ZnVuY3Rpb24odCl7dGhpcy5fbW9kdWxhdG9yLnJlc3RhcnQodCksdGhpcy5fcHVsc2UucmVzdGFydCh0KX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUFdNT3NjaWxsYXRvci5wcm90b3R5cGUsXCJ0eXBlXCIse2dldDpmdW5jdGlvbigpe3JldHVyblwicHdtXCJ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUFdNT3NjaWxsYXRvci5wcm90b3R5cGUsXCJiYXNlVHlwZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm5cInB3bVwifX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlBXTU9zY2lsbGF0b3IucHJvdG90eXBlLFwicGFydGlhbHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuW119fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUFdNT3NjaWxsYXRvci5wcm90b3R5cGUsXCJwaGFzZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW9kdWxhdG9yLnBoYXNlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbW9kdWxhdG9yLnBoYXNlPXR9fSksdC5QV01Pc2NpbGxhdG9yLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU291cmNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fcHVsc2UuZGlzcG9zZSgpLHRoaXMuX3B1bHNlPW51bGwsdGhpcy5fc2NhbGUuZGlzcG9zZSgpLHRoaXMuX3NjYWxlPW51bGwsdGhpcy5fbW9kdWxhdG9yLmRpc3Bvc2UoKSx0aGlzLl9tb2R1bGF0b3I9bnVsbCx0aGlzLl93cml0YWJsZShbXCJtb2R1bGF0aW9uRnJlcXVlbmN5XCIsXCJmcmVxdWVuY3lcIixcImRldHVuZVwiXSksdGhpcy5mcmVxdWVuY3k9bnVsbCx0aGlzLmRldHVuZT1udWxsLHRoaXMubW9kdWxhdGlvbkZyZXF1ZW5jeT1udWxsLHRoaXN9LHQuUFdNT3NjaWxsYXRvcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg1MCksaSg0KSxpKDE2KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuUGFydD1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcImNhbGxiYWNrXCIsXCJldmVudHNcIl0sdC5QYXJ0KTt0LkV2ZW50LmNhbGwodGhpcyxlKSx0aGlzLl9ldmVudHM9W107Zm9yKHZhciBpPTA7aTxlLmV2ZW50cy5sZW5ndGg7aSsrKUFycmF5LmlzQXJyYXkoZS5ldmVudHNbaV0pP3RoaXMuYWRkKGUuZXZlbnRzW2ldWzBdLGUuZXZlbnRzW2ldWzFdKTp0aGlzLmFkZChlLmV2ZW50c1tpXSl9LHQuZXh0ZW5kKHQuUGFydCx0LkV2ZW50KSx0LlBhcnQuZGVmYXVsdHM9e2NhbGxiYWNrOnQubm9PcCxsb29wOiExLGxvb3BFbmQ6XCIxbVwiLGxvb3BTdGFydDowLHBsYXliYWNrUmF0ZToxLHByb2JhYmlsaXR5OjEsaHVtYW5pemU6ITEsbXV0ZTohMSxldmVudHM6W119LHQuUGFydC5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oZSxpKXt2YXIgbj10aGlzLnRvVGlja3MoZSk7cmV0dXJuIHRoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKG4pIT09dC5TdGF0ZS5TdGFydGVkJiYoaT10aGlzLl9sb29wP3QuZGVmYXVsdEFyZyhpLHRoaXMuX2xvb3BTdGFydCk6dC5kZWZhdWx0QXJnKGksMCksaT10aGlzLnRvVGlja3MoaSksdGhpcy5fc3RhdGUuYWRkKHtzdGF0ZTp0LlN0YXRlLlN0YXJ0ZWQsdGltZTpuLG9mZnNldDppfSksdGhpcy5fZm9yRWFjaChmdW5jdGlvbih0KXt0aGlzLl9zdGFydE5vdGUodCxuLGkpfSkpLHRoaXN9LHQuUGFydC5wcm90b3R5cGUuX3N0YXJ0Tm90ZT1mdW5jdGlvbihlLGksbil7aS09bix0aGlzLl9sb29wP2Uuc3RhcnRPZmZzZXQ+PXRoaXMuX2xvb3BTdGFydCYmZS5zdGFydE9mZnNldDx0aGlzLl9sb29wRW5kPyhlLnN0YXJ0T2Zmc2V0PG4mJihpKz10aGlzLl9nZXRMb29wRHVyYXRpb24oKSksZS5zdGFydCh0LlRpY2tzKGkpKSk6ZS5zdGFydE9mZnNldDx0aGlzLl9sb29wU3RhcnQmJmUuc3RhcnRPZmZzZXQ+PW4mJihlLmxvb3A9ITEsZS5zdGFydCh0LlRpY2tzKGkpKSk6ZS5zdGFydE9mZnNldD49biYmZS5zdGFydCh0LlRpY2tzKGkpKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGFydC5wcm90b3R5cGUsXCJzdGFydE9mZnNldFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RhcnRPZmZzZXR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9zdGFydE9mZnNldD10LHRoaXMuX2ZvckVhY2goZnVuY3Rpb24odCl7dC5zdGFydE9mZnNldCs9dGhpcy5fc3RhcnRPZmZzZXR9KX19KSx0LlBhcnQucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy50b1RpY2tzKGUpO3JldHVybiB0aGlzLl9zdGF0ZS5jYW5jZWwoaSksdGhpcy5fc3RhdGUuc2V0U3RhdGVBdFRpbWUodC5TdGF0ZS5TdG9wcGVkLGkpLHRoaXMuX2ZvckVhY2goZnVuY3Rpb24odCl7dC5zdG9wKGUpfSksdGhpc30sdC5QYXJ0LnByb3RvdHlwZS5hdD1mdW5jdGlvbihlLGkpe2U9dC5UcmFuc3BvcnRUaW1lKGUpO2Zvcih2YXIgbj10LlRpY2tzKDEpLnRvU2Vjb25kcygpLG89MDtvPHRoaXMuX2V2ZW50cy5sZW5ndGg7bysrKXt2YXIgcz10aGlzLl9ldmVudHNbb107aWYoTWF0aC5hYnMoZS50b1RpY2tzKCktcy5zdGFydE9mZnNldCk8bilyZXR1cm4gdC5pc0RlZmluZWQoaSkmJihzLnZhbHVlPWkpLHN9cmV0dXJuIHQuaXNEZWZpbmVkKGkpPyh0aGlzLmFkZChlLGkpLHRoaXMuX2V2ZW50c1t0aGlzLl9ldmVudHMubGVuZ3RoLTFdKTpudWxsfSx0LlBhcnQucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlLGkpe3ZhciBuO3JldHVybiBlLmhhc093blByb3BlcnR5KFwidGltZVwiKSYmKGU9KGk9ZSkudGltZSksZT10aGlzLnRvVGlja3MoZSksaSBpbnN0YW5jZW9mIHQuRXZlbnQ/KG49aSkuY2FsbGJhY2s9dGhpcy5fdGljay5iaW5kKHRoaXMpOm49bmV3IHQuRXZlbnQoe2NhbGxiYWNrOnRoaXMuX3RpY2suYmluZCh0aGlzKSx2YWx1ZTppfSksbi5zdGFydE9mZnNldD1lLG4uc2V0KHtsb29wRW5kOnRoaXMubG9vcEVuZCxsb29wU3RhcnQ6dGhpcy5sb29wU3RhcnQsbG9vcDp0aGlzLmxvb3AsaHVtYW5pemU6dGhpcy5odW1hbml6ZSxwbGF5YmFja1JhdGU6dGhpcy5wbGF5YmFja1JhdGUscHJvYmFiaWxpdHk6dGhpcy5wcm9iYWJpbGl0eX0pLHRoaXMuX2V2ZW50cy5wdXNoKG4pLHRoaXMuX3Jlc3RhcnRFdmVudChuKSx0aGlzfSx0LlBhcnQucHJvdG90eXBlLl9yZXN0YXJ0RXZlbnQ9ZnVuY3Rpb24oZSl7dGhpcy5fc3RhdGUuZm9yRWFjaChmdW5jdGlvbihpKXtpLnN0YXRlPT09dC5TdGF0ZS5TdGFydGVkP3RoaXMuX3N0YXJ0Tm90ZShlLGkudGltZSxpLm9mZnNldCk6ZS5zdG9wKHQuVGlja3MoaS50aW1lKSl9LmJpbmQodGhpcykpfSx0LlBhcnQucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihlLGkpe2UuaGFzT3duUHJvcGVydHkoXCJ0aW1lXCIpJiYoZT0oaT1lKS50aW1lKSxlPXRoaXMudG9UaWNrcyhlKTtmb3IodmFyIG49dGhpcy5fZXZlbnRzLmxlbmd0aC0xO24+PTA7bi0tKXt2YXIgbz10aGlzLl9ldmVudHNbbl07by5zdGFydE9mZnNldD09PWUmJih0LmlzVW5kZWYoaSl8fHQuaXNEZWZpbmVkKGkpJiZvLnZhbHVlPT09aSkmJih0aGlzLl9ldmVudHMuc3BsaWNlKG4sMSksby5kaXNwb3NlKCkpfXJldHVybiB0aGlzfSx0LlBhcnQucHJvdG90eXBlLnJlbW92ZUFsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuZGlzcG9zZSgpfSksdGhpcy5fZXZlbnRzPVtdLHRoaXN9LHQuUGFydC5wcm90b3R5cGUuY2FuY2VsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2FuY2VsKHQpfSksdGhpcy5fc3RhdGUuY2FuY2VsKHRoaXMudG9UaWNrcyh0KSksdGhpc30sdC5QYXJ0LnByb3RvdHlwZS5fZm9yRWFjaD1mdW5jdGlvbihlLGkpe2lmKHRoaXMuX2V2ZW50cyl7aT10LmRlZmF1bHRBcmcoaSx0aGlzKTtmb3IodmFyIG49dGhpcy5fZXZlbnRzLmxlbmd0aC0xO24+PTA7bi0tKXt2YXIgbz10aGlzLl9ldmVudHNbbl07byBpbnN0YW5jZW9mIHQuUGFydD9vLl9mb3JFYWNoKGUsaSk6ZS5jYWxsKGksbyl9fXJldHVybiB0aGlzfSx0LlBhcnQucHJvdG90eXBlLl9zZXRBbGw9ZnVuY3Rpb24odCxlKXt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKGkpe2lbdF09ZX0pfSx0LlBhcnQucHJvdG90eXBlLl90aWNrPWZ1bmN0aW9uKHQsZSl7dGhpcy5tdXRlfHx0aGlzLmNhbGxiYWNrKHQsZSl9LHQuUGFydC5wcm90b3R5cGUuX3Rlc3RMb29wQm91bmRyaWVzPWZ1bmN0aW9uKGUpe2Uuc3RhcnRPZmZzZXQ8dGhpcy5fbG9vcFN0YXJ0fHxlLnN0YXJ0T2Zmc2V0Pj10aGlzLl9sb29wRW5kP2UuY2FuY2VsKDApOmUuc3RhdGU9PT10LlN0YXRlLlN0b3BwZWQmJnRoaXMuX3Jlc3RhcnRFdmVudChlKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGFydC5wcm90b3R5cGUsXCJwcm9iYWJpbGl0eVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvYmFiaWxpdHl9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9wcm9iYWJpbGl0eT10LHRoaXMuX3NldEFsbChcInByb2JhYmlsaXR5XCIsdCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGFydC5wcm90b3R5cGUsXCJodW1hbml6ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faHVtYW5pemV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9odW1hbml6ZT10LHRoaXMuX3NldEFsbChcImh1bWFuaXplXCIsdCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGFydC5wcm90b3R5cGUsXCJsb29wXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb29wfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbG9vcD10LHRoaXMuX2ZvckVhY2goZnVuY3Rpb24oZSl7ZS5fbG9vcFN0YXJ0PXRoaXMuX2xvb3BTdGFydCxlLl9sb29wRW5kPXRoaXMuX2xvb3BFbmQsZS5sb29wPXQsdGhpcy5fdGVzdExvb3BCb3VuZHJpZXMoZSl9KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QYXJ0LnByb3RvdHlwZSxcImxvb3BFbmRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHQuVGlja3ModGhpcy5fbG9vcEVuZCkudG9TZWNvbmRzKCl9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9sb29wRW5kPXRoaXMudG9UaWNrcyh0KSx0aGlzLl9sb29wJiZ0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKGUpe2UubG9vcEVuZD10LHRoaXMuX3Rlc3RMb29wQm91bmRyaWVzKGUpfSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGFydC5wcm90b3R5cGUsXCJsb29wU3RhcnRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHQuVGlja3ModGhpcy5fbG9vcFN0YXJ0KS50b1NlY29uZHMoKX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2xvb3BTdGFydD10aGlzLnRvVGlja3ModCksdGhpcy5fbG9vcCYmdGhpcy5fZm9yRWFjaChmdW5jdGlvbih0KXt0Lmxvb3BTdGFydD10aGlzLmxvb3BTdGFydCx0aGlzLl90ZXN0TG9vcEJvdW5kcmllcyh0KX0pfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlBhcnQucHJvdG90eXBlLFwicGxheWJhY2tSYXRlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9wbGF5YmFja1JhdGU9dCx0aGlzLl9zZXRBbGwoXCJwbGF5YmFja1JhdGVcIix0KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QYXJ0LnByb3RvdHlwZSxcImxlbmd0aFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRzLmxlbmd0aH19KSx0LlBhcnQucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5FdmVudC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMucmVtb3ZlQWxsKCksdGhpcy5jYWxsYmFjaz1udWxsLHRoaXMuX2V2ZW50cz1udWxsLHRoaXN9LHQuUGFydH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg1MCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe3JldHVybiB0Lkxvb3A9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJjYWxsYmFja1wiLFwiaW50ZXJ2YWxcIl0sdC5Mb29wKTt0LmNhbGwodGhpcyksdGhpcy5fZXZlbnQ9bmV3IHQuRXZlbnQoe2NhbGxiYWNrOnRoaXMuX3RpY2suYmluZCh0aGlzKSxsb29wOiEwLGxvb3BFbmQ6ZS5pbnRlcnZhbCxwbGF5YmFja1JhdGU6ZS5wbGF5YmFja1JhdGUscHJvYmFiaWxpdHk6ZS5wcm9iYWJpbGl0eX0pLHRoaXMuY2FsbGJhY2s9ZS5jYWxsYmFjayx0aGlzLml0ZXJhdGlvbnM9ZS5pdGVyYXRpb25zfSx0LmV4dGVuZCh0Lkxvb3ApLHQuTG9vcC5kZWZhdWx0cz17aW50ZXJ2YWw6XCI0blwiLGNhbGxiYWNrOnQubm9PcCxwbGF5YmFja1JhdGU6MSxpdGVyYXRpb25zOjEvMCxwcm9iYWJpbGl0eTohMCxtdXRlOiExfSx0Lkxvb3AucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ldmVudC5zdGFydCh0KSx0aGlzfSx0Lkxvb3AucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2V2ZW50LnN0b3AodCksdGhpc30sdC5Mb29wLnByb3RvdHlwZS5jYW5jZWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2V2ZW50LmNhbmNlbCh0KSx0aGlzfSx0Lkxvb3AucHJvdG90eXBlLl90aWNrPWZ1bmN0aW9uKHQpe3RoaXMuY2FsbGJhY2sodCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lkxvb3AucHJvdG90eXBlLFwic3RhdGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50LnN0YXRlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lkxvb3AucHJvdG90eXBlLFwicHJvZ3Jlc3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50LnByb2dyZXNzfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lkxvb3AucHJvdG90eXBlLFwiaW50ZXJ2YWxcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50Lmxvb3BFbmR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9ldmVudC5sb29wRW5kPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuTG9vcC5wcm90b3R5cGUsXCJwbGF5YmFja1JhdGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50LnBsYXliYWNrUmF0ZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2V2ZW50LnBsYXliYWNrUmF0ZT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lkxvb3AucHJvdG90eXBlLFwiaHVtYW5pemVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50Lmh1bWFuaXplfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fZXZlbnQuaHVtYW5pemU9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5Mb29wLnByb3RvdHlwZSxcInByb2JhYmlsaXR5XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudC5wcm9iYWJpbGl0eX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2V2ZW50LnByb2JhYmlsaXR5PXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuTG9vcC5wcm90b3R5cGUsXCJtdXRlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudC5tdXRlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fZXZlbnQubXV0ZT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lkxvb3AucHJvdG90eXBlLFwiaXRlcmF0aW9uc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hMD09PXRoaXMuX2V2ZW50Lmxvb3A/MS8wOnRoaXMuX2V2ZW50Lmxvb3B9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9ldmVudC5sb29wPXQ9PT0xLzB8fHR9fSksdC5Mb29wLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5fZXZlbnQuZGlzcG9zZSgpLHRoaXMuX2V2ZW50PW51bGwsdGhpcy5jYWxsYmFjaz1udWxsfSx0Lkxvb3B9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMTUpLGkoMzIpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5TdGVyZW9YRmVlZGJhY2tFZmZlY3Q9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJmZWVkYmFja1wiXSx0LkZlZWRiYWNrRWZmZWN0KTt0LlN0ZXJlb0VmZmVjdC5jYWxsKHRoaXMsZSksdGhpcy5mZWVkYmFjaz1uZXcgdC5TaWduYWwoZS5mZWVkYmFjayx0LlR5cGUuTm9ybWFsUmFuZ2UpLHRoaXMuX2ZlZWRiYWNrTFI9bmV3IHQuR2Fpbix0aGlzLl9mZWVkYmFja1JMPW5ldyB0LkdhaW4sdGhpcy5lZmZlY3RSZXR1cm5MLmNoYWluKHRoaXMuX2ZlZWRiYWNrTFIsdGhpcy5lZmZlY3RTZW5kUiksdGhpcy5lZmZlY3RSZXR1cm5SLmNoYWluKHRoaXMuX2ZlZWRiYWNrUkwsdGhpcy5lZmZlY3RTZW5kTCksdGhpcy5mZWVkYmFjay5mYW4odGhpcy5fZmVlZGJhY2tMUi5nYWluLHRoaXMuX2ZlZWRiYWNrUkwuZ2FpbiksdGhpcy5fcmVhZE9ubHkoW1wiZmVlZGJhY2tcIl0pfSx0LmV4dGVuZCh0LlN0ZXJlb1hGZWVkYmFja0VmZmVjdCx0LlN0ZXJlb0VmZmVjdCksdC5TdGVyZW9YRmVlZGJhY2tFZmZlY3QucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5TdGVyZW9FZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl93cml0YWJsZShbXCJmZWVkYmFja1wiXSksdGhpcy5mZWVkYmFjay5kaXNwb3NlKCksdGhpcy5mZWVkYmFjaz1udWxsLHRoaXMuX2ZlZWRiYWNrTFIuZGlzcG9zZSgpLHRoaXMuX2ZlZWRiYWNrTFI9bnVsbCx0aGlzLl9mZWVkYmFja1JMLmRpc3Bvc2UoKSx0aGlzLl9mZWVkYmFja1JMPW51bGwsdGhpc30sdC5TdGVyZW9YRmVlZGJhY2tFZmZlY3R9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoOCksaSg1MiksaSg1MSldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0Lk1pZFNpZGVFZmZlY3Q9ZnVuY3Rpb24oKXt0LkVmZmVjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fbWlkU2lkZVNwbGl0PW5ldyB0Lk1pZFNpZGVTcGxpdCx0aGlzLl9taWRTaWRlTWVyZ2U9bmV3IHQuTWlkU2lkZU1lcmdlLHRoaXMubWlkU2VuZD10aGlzLl9taWRTaWRlU3BsaXQubWlkLHRoaXMuc2lkZVNlbmQ9dGhpcy5fbWlkU2lkZVNwbGl0LnNpZGUsdGhpcy5taWRSZXR1cm49dGhpcy5fbWlkU2lkZU1lcmdlLm1pZCx0aGlzLnNpZGVSZXR1cm49dGhpcy5fbWlkU2lkZU1lcmdlLnNpZGUsdGhpcy5lZmZlY3RTZW5kLmNvbm5lY3QodGhpcy5fbWlkU2lkZVNwbGl0KSx0aGlzLl9taWRTaWRlTWVyZ2UuY29ubmVjdCh0aGlzLmVmZmVjdFJldHVybil9LHQuZXh0ZW5kKHQuTWlkU2lkZUVmZmVjdCx0LkVmZmVjdCksdC5NaWRTaWRlRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fbWlkU2lkZVNwbGl0LmRpc3Bvc2UoKSx0aGlzLl9taWRTaWRlU3BsaXQ9bnVsbCx0aGlzLl9taWRTaWRlTWVyZ2UuZGlzcG9zZSgpLHRoaXMuX21pZFNpZGVNZXJnZT1udWxsLHRoaXMubWlkU2VuZD1udWxsLHRoaXMuc2lkZVNlbmQ9bnVsbCx0aGlzLm1pZFJldHVybj1udWxsLHRoaXMuc2lkZVJldHVybj1udWxsLHRoaXN9LHQuTWlkU2lkZUVmZmVjdH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxMSksaSg4KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuQ29udm9sdmVyPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1widXJsXCIsXCJvbmxvYWRcIl0sdC5Db252b2x2ZXIpO3QuRWZmZWN0LmNhbGwodGhpcyxlKSx0aGlzLl9jb252b2x2ZXI9dGhpcy5jb250ZXh0LmNyZWF0ZUNvbnZvbHZlcigpLHRoaXMuX2J1ZmZlcj1uZXcgdC5CdWZmZXIoZS51cmwsZnVuY3Rpb24odCl7dGhpcy5idWZmZXI9dC5nZXQoKSxlLm9ubG9hZCgpfS5iaW5kKHRoaXMpKSx0aGlzLl9idWZmZXIubG9hZGVkJiYodGhpcy5idWZmZXI9dGhpcy5fYnVmZmVyKSx0aGlzLm5vcm1hbGl6ZT1lLm5vcm1hbGl6ZSx0aGlzLmNvbm5lY3RFZmZlY3QodGhpcy5fY29udm9sdmVyKX0sdC5leHRlbmQodC5Db252b2x2ZXIsdC5FZmZlY3QpLHQuQ29udm9sdmVyLmRlZmF1bHRzPXtvbmxvYWQ6dC5ub09wLG5vcm1hbGl6ZTohMH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQ29udm9sdmVyLnByb3RvdHlwZSxcImJ1ZmZlclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYnVmZmVyLmxlbmd0aD90aGlzLl9idWZmZXI6bnVsbH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2J1ZmZlci5zZXQodCksdGhpcy5fY29udm9sdmVyLmJ1ZmZlciYmKHRoaXMuZWZmZWN0U2VuZC5kaXNjb25uZWN0KCksdGhpcy5fY29udm9sdmVyLmRpc2Nvbm5lY3QoKSx0aGlzLl9jb252b2x2ZXI9dGhpcy5jb250ZXh0LmNyZWF0ZUNvbnZvbHZlcigpLHRoaXMuY29ubmVjdEVmZmVjdCh0aGlzLl9jb252b2x2ZXIpKSx0aGlzLl9jb252b2x2ZXIuYnVmZmVyPXRoaXMuX2J1ZmZlci5nZXQoKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5Db252b2x2ZXIucHJvdG90eXBlLFwibm9ybWFsaXplXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb252b2x2ZXIubm9ybWFsaXplfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY29udm9sdmVyLm5vcm1hbGl6ZT10fX0pLHQuQ29udm9sdmVyLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2J1ZmZlci5sb2FkKHQsZnVuY3Rpb24odCl7dGhpcy5idWZmZXI9dCxlJiZlKCl9LmJpbmQodGhpcykpfSx0LkNvbnZvbHZlci5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkVmZmVjdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX2J1ZmZlci5kaXNwb3NlKCksdGhpcy5fYnVmZmVyPW51bGwsdGhpcy5fY29udm9sdmVyLmRpc2Nvbm5lY3QoKSx0aGlzLl9jb252b2x2ZXI9bnVsbCx0aGlzfSx0LkNvbnZvbHZlcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg3KSxpKDUpLGkoMTMpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5Nb2R1bG89ZnVuY3Rpb24oZSl7dC5TaWduYWxCYXNlLmNhbGwodGhpcyksdGhpcy5jcmVhdGVJbnNPdXRzKDEsMCksdGhpcy5fc2hhcGVyPW5ldyB0LldhdmVTaGFwZXIoTWF0aC5wb3coMiwxNikpLHRoaXMuX211bHRpcGx5PW5ldyB0Lk11bHRpcGx5LHRoaXMuX3N1YnRyYWN0PXRoaXMub3V0cHV0PW5ldyB0LlN1YnRyYWN0LHRoaXMuX21vZFNpZ25hbD1uZXcgdC5TaWduYWwoZSksdGhpcy5pbnB1dC5mYW4odGhpcy5fc2hhcGVyLHRoaXMuX3N1YnRyYWN0KSx0aGlzLl9tb2RTaWduYWwuY29ubmVjdCh0aGlzLl9tdWx0aXBseSwwLDApLHRoaXMuX3NoYXBlci5jb25uZWN0KHRoaXMuX211bHRpcGx5LDAsMSksdGhpcy5fbXVsdGlwbHkuY29ubmVjdCh0aGlzLl9zdWJ0cmFjdCwwLDEpLHRoaXMuX3NldFdhdmVTaGFwZXIoZSl9LHQuZXh0ZW5kKHQuTW9kdWxvLHQuU2lnbmFsQmFzZSksdC5Nb2R1bG8ucHJvdG90eXBlLl9zZXRXYXZlU2hhcGVyPWZ1bmN0aW9uKHQpe3RoaXMuX3NoYXBlci5zZXRNYXAoZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguZmxvb3IoKGUrMWUtNCkvdCl9KX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuTW9kdWxvLnByb3RvdHlwZSxcInZhbHVlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb2RTaWduYWwudmFsdWV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9tb2RTaWduYWwudmFsdWU9dCx0aGlzLl9zZXRXYXZlU2hhcGVyKHQpfX0pLHQuTW9kdWxvLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU2lnbmFsQmFzZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3NoYXBlci5kaXNwb3NlKCksdGhpcy5fc2hhcGVyPW51bGwsdGhpcy5fbXVsdGlwbHkuZGlzcG9zZSgpLHRoaXMuX211bHRpcGx5PW51bGwsdGhpcy5fc3VidHJhY3QuZGlzcG9zZSgpLHRoaXMuX3N1YnRyYWN0PW51bGwsdGhpcy5fbW9kU2lnbmFsLmRpc3Bvc2UoKSx0aGlzLl9tb2RTaWduYWw9bnVsbCx0aGlzfSx0Lk1vZHVsb30uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxNiksaSgxMSksaSg2MiksaSg0MCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe3JldHVybiB0Lk9mZmxpbmU9ZnVuY3Rpb24oZSxpKXt2YXIgbj10LmNvbnRleHQuc2FtcGxlUmF0ZSxvPXQuY29udGV4dCxzPW5ldyB0Lk9mZmxpbmVDb250ZXh0KDIsaSxuKTt0LmNvbnRleHQ9czt2YXIgcj1lKHQuVHJhbnNwb3J0KSxhPW51bGw7cmV0dXJuIGE9ciYmdC5pc0Z1bmN0aW9uKHIudGhlbik/ci50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIHMucmVuZGVyKCl9KTpzLnJlbmRlcigpLHQuY29udGV4dD1vLGEudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQuQnVmZmVyKGUpfSl9LHQuT2ZmbGluZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxMSldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe3JldHVybiB0LkJ1ZmZlcnM9ZnVuY3Rpb24oZSl7dmFyIGk9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtpLnNoaWZ0KCk7dmFyIG49dC5kZWZhdWx0cyhpLFtcIm9ubG9hZFwiLFwiYmFzZVVybFwiXSx0LkJ1ZmZlcnMpO2Zvcih2YXIgbyBpbiB0LmNhbGwodGhpcyksdGhpcy5fYnVmZmVycz17fSx0aGlzLmJhc2VVcmw9bi5iYXNlVXJsLHRoaXMuX2xvYWRpbmdDb3VudD0wLGUpdGhpcy5fbG9hZGluZ0NvdW50KyssdGhpcy5hZGQobyxlW29dLHRoaXMuX2J1ZmZlckxvYWRlZC5iaW5kKHRoaXMsbi5vbmxvYWQpKX0sdC5leHRlbmQodC5CdWZmZXJzKSx0LkJ1ZmZlcnMuZGVmYXVsdHM9e29ubG9hZDp0Lm5vT3AsYmFzZVVybDpcIlwifSx0LkJ1ZmZlcnMucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYnVmZmVycy5oYXNPd25Qcm9wZXJ0eSh0KX0sdC5CdWZmZXJzLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7aWYodGhpcy5oYXModCkpcmV0dXJuIHRoaXMuX2J1ZmZlcnNbdF07dGhyb3cgbmV3IEVycm9yKFwiVG9uZS5CdWZmZXJzOiBubyBidWZmZXIgbmFtZWQgXCIrdCl9LHQuQnVmZmVycy5wcm90b3R5cGUuX2J1ZmZlckxvYWRlZD1mdW5jdGlvbih0KXt0aGlzLl9sb2FkaW5nQ291bnQtLSwwPT09dGhpcy5fbG9hZGluZ0NvdW50JiZ0JiZ0KHRoaXMpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5CdWZmZXJzLnByb3RvdHlwZSxcImxvYWRlZFwiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD0hMDtmb3IodmFyIGUgaW4gdGhpcy5fYnVmZmVycyl7dmFyIGk9dGhpcy5nZXQoZSk7dD10JiZpLmxvYWRlZH1yZXR1cm4gdH19KSx0LkJ1ZmZlcnMucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlLGksbil7cmV0dXJuIG49dC5kZWZhdWx0QXJnKG4sdC5ub09wKSxpIGluc3RhbmNlb2YgdC5CdWZmZXI/KHRoaXMuX2J1ZmZlcnNbZV09aSxuKHRoaXMpKTppIGluc3RhbmNlb2YgQXVkaW9CdWZmZXI/KHRoaXMuX2J1ZmZlcnNbZV09bmV3IHQuQnVmZmVyKGkpLG4odGhpcykpOnQuaXNTdHJpbmcoaSkmJih0aGlzLl9idWZmZXJzW2VdPW5ldyB0LkJ1ZmZlcih0aGlzLmJhc2VVcmwraSxuKSksdGhpc30sdC5CdWZmZXJzLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9idWZmZXJzKXRoaXMuX2J1ZmZlcnNbZV0uZGlzcG9zZSgpO3JldHVybiB0aGlzLl9idWZmZXJzPW51bGwsdGhpc30sdC5CdWZmZXJzfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuQ3RybFBhdHRlcm49ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJ2YWx1ZXNcIixcInR5cGVcIl0sdC5DdHJsUGF0dGVybik7dC5jYWxsKHRoaXMpLHRoaXMudmFsdWVzPWUudmFsdWVzLHRoaXMuaW5kZXg9MCx0aGlzLl90eXBlPW51bGwsdGhpcy5fc2h1ZmZsZWQ9bnVsbCx0aGlzLl9kaXJlY3Rpb249bnVsbCx0aGlzLnR5cGU9ZS50eXBlfSx0LmV4dGVuZCh0LkN0cmxQYXR0ZXJuKSx0LkN0cmxQYXR0ZXJuLlR5cGU9e1VwOlwidXBcIixEb3duOlwiZG93blwiLFVwRG93bjpcInVwRG93blwiLERvd25VcDpcImRvd25VcFwiLEFsdGVybmF0ZVVwOlwiYWx0ZXJuYXRlVXBcIixBbHRlcm5hdGVEb3duOlwiYWx0ZXJuYXRlRG93blwiLFJhbmRvbTpcInJhbmRvbVwiLFJhbmRvbVdhbGs6XCJyYW5kb21XYWxrXCIsUmFuZG9tT25jZTpcInJhbmRvbU9uY2VcIn0sdC5DdHJsUGF0dGVybi5kZWZhdWx0cz17dHlwZTp0LkN0cmxQYXR0ZXJuLlR5cGUuVXAsdmFsdWVzOltdfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5DdHJsUGF0dGVybi5wcm90b3R5cGUsXCJ2YWx1ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtpZigwIT09dGhpcy52YWx1ZXMubGVuZ3RoKXtpZigxPT09dGhpcy52YWx1ZXMubGVuZ3RoKXJldHVybiB0aGlzLnZhbHVlc1swXTt0aGlzLmluZGV4PU1hdGgubWluKHRoaXMuaW5kZXgsdGhpcy52YWx1ZXMubGVuZ3RoLTEpO3ZhciBlPXRoaXMudmFsdWVzW3RoaXMuaW5kZXhdO3JldHVybiB0aGlzLnR5cGU9PT10LkN0cmxQYXR0ZXJuLlR5cGUuUmFuZG9tT25jZSYmKHRoaXMudmFsdWVzLmxlbmd0aCE9PXRoaXMuX3NodWZmbGVkLmxlbmd0aCYmdGhpcy5fc2h1ZmZsZVZhbHVlcygpLGU9dGhpcy52YWx1ZXNbdGhpcy5fc2h1ZmZsZWRbdGhpcy5pbmRleF1dKSxlfX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5DdHJsUGF0dGVybi5wcm90b3R5cGUsXCJ0eXBlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90eXBlfSxzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5fdHlwZT1lLHRoaXMuX3NodWZmbGVkPW51bGwsdGhpcy5fdHlwZT09PXQuQ3RybFBhdHRlcm4uVHlwZS5VcHx8dGhpcy5fdHlwZT09PXQuQ3RybFBhdHRlcm4uVHlwZS5VcERvd258fHRoaXMuX3R5cGU9PT10LkN0cmxQYXR0ZXJuLlR5cGUuUmFuZG9tT25jZXx8dGhpcy5fdHlwZT09PXQuQ3RybFBhdHRlcm4uVHlwZS5BbHRlcm5hdGVVcD90aGlzLmluZGV4PTA6dGhpcy5fdHlwZSE9PXQuQ3RybFBhdHRlcm4uVHlwZS5Eb3duJiZ0aGlzLl90eXBlIT09dC5DdHJsUGF0dGVybi5UeXBlLkRvd25VcCYmdGhpcy5fdHlwZSE9PXQuQ3RybFBhdHRlcm4uVHlwZS5BbHRlcm5hdGVEb3dufHwodGhpcy5pbmRleD10aGlzLnZhbHVlcy5sZW5ndGgtMSksdGhpcy5fdHlwZT09PXQuQ3RybFBhdHRlcm4uVHlwZS5VcERvd258fHRoaXMuX3R5cGU9PT10LkN0cmxQYXR0ZXJuLlR5cGUuQWx0ZXJuYXRlVXA/dGhpcy5fZGlyZWN0aW9uPXQuQ3RybFBhdHRlcm4uVHlwZS5VcDp0aGlzLl90eXBlIT09dC5DdHJsUGF0dGVybi5UeXBlLkRvd25VcCYmdGhpcy5fdHlwZSE9PXQuQ3RybFBhdHRlcm4uVHlwZS5BbHRlcm5hdGVEb3dufHwodGhpcy5fZGlyZWN0aW9uPXQuQ3RybFBhdHRlcm4uVHlwZS5Eb3duKSx0aGlzLl90eXBlPT09dC5DdHJsUGF0dGVybi5UeXBlLlJhbmRvbU9uY2U/dGhpcy5fc2h1ZmZsZVZhbHVlcygpOnRoaXMuX3R5cGU9PT10LkN0cmxQYXR0ZXJuLlJhbmRvbSYmKHRoaXMuaW5kZXg9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMudmFsdWVzLmxlbmd0aCkpfX0pLHQuQ3RybFBhdHRlcm4ucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnR5cGU7cmV0dXJuIGU9PT10LkN0cmxQYXR0ZXJuLlR5cGUuVXA/KHRoaXMuaW5kZXgrKyx0aGlzLmluZGV4Pj10aGlzLnZhbHVlcy5sZW5ndGgmJih0aGlzLmluZGV4PTApKTplPT09dC5DdHJsUGF0dGVybi5UeXBlLkRvd24/KHRoaXMuaW5kZXgtLSx0aGlzLmluZGV4PDAmJih0aGlzLmluZGV4PXRoaXMudmFsdWVzLmxlbmd0aC0xKSk6ZT09PXQuQ3RybFBhdHRlcm4uVHlwZS5VcERvd258fGU9PT10LkN0cmxQYXR0ZXJuLlR5cGUuRG93blVwPyh0aGlzLl9kaXJlY3Rpb249PT10LkN0cmxQYXR0ZXJuLlR5cGUuVXA/dGhpcy5pbmRleCsrOnRoaXMuaW5kZXgtLSx0aGlzLmluZGV4PDA/KHRoaXMuaW5kZXg9MSx0aGlzLl9kaXJlY3Rpb249dC5DdHJsUGF0dGVybi5UeXBlLlVwKTp0aGlzLmluZGV4Pj10aGlzLnZhbHVlcy5sZW5ndGgmJih0aGlzLmluZGV4PXRoaXMudmFsdWVzLmxlbmd0aC0yLHRoaXMuX2RpcmVjdGlvbj10LkN0cmxQYXR0ZXJuLlR5cGUuRG93bikpOmU9PT10LkN0cmxQYXR0ZXJuLlR5cGUuUmFuZG9tP3RoaXMuaW5kZXg9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMudmFsdWVzLmxlbmd0aCk6ZT09PXQuQ3RybFBhdHRlcm4uVHlwZS5SYW5kb21XYWxrP01hdGgucmFuZG9tKCk8LjU/KHRoaXMuaW5kZXgtLSx0aGlzLmluZGV4PU1hdGgubWF4KHRoaXMuaW5kZXgsMCkpOih0aGlzLmluZGV4KyssdGhpcy5pbmRleD1NYXRoLm1pbih0aGlzLmluZGV4LHRoaXMudmFsdWVzLmxlbmd0aC0xKSk6ZT09PXQuQ3RybFBhdHRlcm4uVHlwZS5SYW5kb21PbmNlPyh0aGlzLmluZGV4KyssdGhpcy5pbmRleD49dGhpcy52YWx1ZXMubGVuZ3RoJiYodGhpcy5pbmRleD0wLHRoaXMuX3NodWZmbGVWYWx1ZXMoKSkpOmU9PT10LkN0cmxQYXR0ZXJuLlR5cGUuQWx0ZXJuYXRlVXA/KHRoaXMuX2RpcmVjdGlvbj09PXQuQ3RybFBhdHRlcm4uVHlwZS5VcD8odGhpcy5pbmRleCs9Mix0aGlzLl9kaXJlY3Rpb249dC5DdHJsUGF0dGVybi5UeXBlLkRvd24pOih0aGlzLmluZGV4LT0xLHRoaXMuX2RpcmVjdGlvbj10LkN0cmxQYXR0ZXJuLlR5cGUuVXApLHRoaXMuaW5kZXg+PXRoaXMudmFsdWVzLmxlbmd0aCYmKHRoaXMuaW5kZXg9MCx0aGlzLl9kaXJlY3Rpb249dC5DdHJsUGF0dGVybi5UeXBlLlVwKSk6ZT09PXQuQ3RybFBhdHRlcm4uVHlwZS5BbHRlcm5hdGVEb3duJiYodGhpcy5fZGlyZWN0aW9uPT09dC5DdHJsUGF0dGVybi5UeXBlLlVwPyh0aGlzLmluZGV4Kz0xLHRoaXMuX2RpcmVjdGlvbj10LkN0cmxQYXR0ZXJuLlR5cGUuRG93bik6KHRoaXMuaW5kZXgtPTIsdGhpcy5fZGlyZWN0aW9uPXQuQ3RybFBhdHRlcm4uVHlwZS5VcCksdGhpcy5pbmRleDwwJiYodGhpcy5pbmRleD10aGlzLnZhbHVlcy5sZW5ndGgtMSx0aGlzLl9kaXJlY3Rpb249dC5DdHJsUGF0dGVybi5UeXBlLkRvd24pKSx0aGlzLnZhbHVlfSx0LkN0cmxQYXR0ZXJuLnByb3RvdHlwZS5fc2h1ZmZsZVZhbHVlcz1mdW5jdGlvbigpe3ZhciB0PVtdO3RoaXMuX3NodWZmbGVkPVtdO2Zvcih2YXIgZT0wO2U8dGhpcy52YWx1ZXMubGVuZ3RoO2UrKyl0W2VdPWU7Zm9yKDt0Lmxlbmd0aD4wOyl7dmFyIGk9dC5zcGxpY2UoTWF0aC5mbG9vcih0Lmxlbmd0aCpNYXRoLnJhbmRvbSgpKSwxKTt0aGlzLl9zaHVmZmxlZC5wdXNoKGlbMF0pfX0sdC5DdHJsUGF0dGVybi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuX3NodWZmbGVkPW51bGwsdGhpcy52YWx1ZXM9bnVsbH0sdC5DdHJsUGF0dGVybn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe3Quc3VwcG9ydGVkJiYoQXVkaW9CdWZmZXIucHJvdG90eXBlLmNvcHlUb0NoYW5uZWx8fChBdWRpb0J1ZmZlci5wcm90b3R5cGUuY29weVRvQ2hhbm5lbD1mdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5nZXRDaGFubmVsRGF0YShlKTtpPWl8fDA7Zm9yKHZhciBvPTA7bzxuLmxlbmd0aDtvKyspbltvK2ldPXRbb119LEF1ZGlvQnVmZmVyLnByb3RvdHlwZS5jb3B5RnJvbUNoYW5uZWw9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuZ2V0Q2hhbm5lbERhdGEoZSk7aT1pfHwwO2Zvcih2YXIgbz0wO288dC5sZW5ndGg7bysrKXRbb109bltvK2ldfSkpfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDExKSxpKDYpLGkoMyksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuT3NjaWxsYXRvck5vZGU9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJmcmVxdWVuY3lcIixcInR5cGVcIl0sdC5Pc2NpbGxhdG9yTm9kZSk7dC5BdWRpb05vZGUuY2FsbCh0aGlzLGUpLHRoaXMub25lbmRlZD1lLm9uZW5kZWQsdGhpcy5fc3RhcnRUaW1lPS0xLHRoaXMuX3N0b3BUaW1lPS0xLHRoaXMuX2dhaW5Ob2RlPXRoaXMub3V0cHV0PW5ldyB0LkdhaW4oMCksdGhpcy5fb3NjaWxsYXRvcj10aGlzLmNvbnRleHQuY3JlYXRlT3NjaWxsYXRvcigpLHRoaXMuX29zY2lsbGF0b3IuY29ubmVjdCh0aGlzLl9nYWluTm9kZSksdGhpcy50eXBlPWUudHlwZSx0aGlzLmZyZXF1ZW5jeT1uZXcgdC5QYXJhbSh7cGFyYW06dGhpcy5fb3NjaWxsYXRvci5mcmVxdWVuY3ksdW5pdHM6dC5UeXBlLkZyZXF1ZW5jeSx2YWx1ZTplLmZyZXF1ZW5jeX0pLHRoaXMuZGV0dW5lPW5ldyB0LlBhcmFtKHtwYXJhbTp0aGlzLl9vc2NpbGxhdG9yLmRldHVuZSx1bml0czp0LlR5cGUuQ2VudHMsdmFsdWU6ZS5kZXR1bmV9KSx0aGlzLl9nYWluPTF9LHQuZXh0ZW5kKHQuT3NjaWxsYXRvck5vZGUsdC5BdWRpb05vZGUpLHQuT3NjaWxsYXRvck5vZGUuZGVmYXVsdHM9e2ZyZXF1ZW5jeTo0NDAsZGV0dW5lOjAsdHlwZTpcInNpbmVcIixvbmVuZGVkOnQubm9PcH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuT3NjaWxsYXRvck5vZGUucHJvdG90eXBlLFwic3RhdGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0U3RhdGVBdFRpbWUodGhpcy5ub3coKSl9fSksdC5Pc2NpbGxhdG9yTm9kZS5wcm90b3R5cGUuZ2V0U3RhdGVBdFRpbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dGhpcy50b1NlY29uZHMoZSksLTEhPT10aGlzLl9zdGFydFRpbWUmJmU+PXRoaXMuX3N0YXJ0VGltZSYmKC0xPT09dGhpcy5fc3RvcFRpbWV8fGU8PXRoaXMuX3N0b3BUaW1lKT90LlN0YXRlLlN0YXJ0ZWQ6dC5TdGF0ZS5TdG9wcGVkfSx0Lk9zY2lsbGF0b3JOb2RlLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbih0KXtpZih0aGlzLmxvZyhcInN0YXJ0XCIsdCksLTEhPT10aGlzLl9zdGFydFRpbWUpdGhyb3cgbmV3IEVycm9yKFwiY2Fubm90IGNhbGwgT3NjaWxsYXRvck5vZGUuc3RhcnQgbW9yZSB0aGFuIG9uY2VcIik7cmV0dXJuIHRoaXMuX3N0YXJ0VGltZT10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl9vc2NpbGxhdG9yLnN0YXJ0KHRoaXMuX3N0YXJ0VGltZSksdGhpcy5fZ2Fpbk5vZGUuZ2Fpbi5zZXRWYWx1ZUF0VGltZSgxLHRoaXMuX3N0YXJ0VGltZSksdGhpc30sdC5Pc2NpbGxhdG9yTm9kZS5wcm90b3R5cGUuc2V0UGVyaW9kaWNXYXZlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9vc2NpbGxhdG9yLnNldFBlcmlvZGljV2F2ZSh0KSx0aGlzfSx0Lk9zY2lsbGF0b3JOb2RlLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxvZyhcInN0b3BcIix0KSx0aGlzLmFzc2VydCgtMSE9PXRoaXMuX3N0YXJ0VGltZSxcIidzdGFydCcgbXVzdCBiZSBjYWxsZWQgYmVmb3JlICdzdG9wJ1wiKSx0aGlzLmNhbmNlbFN0b3AoKSx0aGlzLl9zdG9wVGltZT10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl9zdG9wVGltZT50aGlzLl9zdGFydFRpbWU/KHRoaXMuX2dhaW5Ob2RlLmdhaW4uc2V0VmFsdWVBdFRpbWUoMCx0aGlzLl9zdG9wVGltZSksdGhpcy5jb250ZXh0LmNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KSx0aGlzLl90aW1lb3V0PXRoaXMuY29udGV4dC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5fb3NjaWxsYXRvci5zdG9wKHRoaXMubm93KCkpLHRoaXMub25lbmRlZCgpfS5iaW5kKHRoaXMpLHRoaXMuX3N0b3BUaW1lLXRoaXMuY29udGV4dC5jdXJyZW50VGltZSkpOnRoaXMuX2dhaW5Ob2RlLmdhaW4uY2FuY2VsU2NoZWR1bGVkVmFsdWVzKHRoaXMuX3N0YXJ0VGltZSksdGhpc30sdC5Pc2NpbGxhdG9yTm9kZS5wcm90b3R5cGUuY2FuY2VsU3RvcD1mdW5jdGlvbigpe3JldHVybi0xIT09dGhpcy5fc3RhcnRUaW1lJiYodGhpcy5fZ2Fpbk5vZGUuZ2Fpbi5jYW5jZWxTY2hlZHVsZWRWYWx1ZXModGhpcy5fc3RhcnRUaW1lK3RoaXMuc2FtcGxlVGltZSksdGhpcy5jb250ZXh0LmNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KSx0aGlzLl9zdG9wVGltZT0tMSksdGhpc30sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuT3NjaWxsYXRvck5vZGUucHJvdG90eXBlLFwidHlwZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3NjaWxsYXRvci50eXBlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fb3NjaWxsYXRvci50eXBlPXR9fSksdC5Pc2NpbGxhdG9yTm9kZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRleHQuY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpLHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5vbmVuZGVkPW51bGwsdGhpcy5fb3NjaWxsYXRvci5kaXNjb25uZWN0KCksdGhpcy5fb3NjaWxsYXRvcj1udWxsLHRoaXMuX2dhaW5Ob2RlLmRpc3Bvc2UoKSx0aGlzLl9nYWluTm9kZT1udWxsLHRoaXMuZnJlcXVlbmN5LmRpc3Bvc2UoKSx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXMuZGV0dW5lLmRpc3Bvc2UoKSx0aGlzLmRldHVuZT1udWxsLHRoaXN9LHQuT3NjaWxsYXRvck5vZGV9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNTUpLGkoNTQpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtyZXR1cm4gdC5UcmFuc3BvcnRSZXBlYXRFdmVudD1mdW5jdGlvbihlLGkpe3QuVHJhbnNwb3J0RXZlbnQuY2FsbCh0aGlzLGUsaSksaT10LmRlZmF1bHRBcmcoaSx0LlRyYW5zcG9ydFJlcGVhdEV2ZW50LmRlZmF1bHRzKSx0aGlzLmR1cmF0aW9uPXQuVGlja3MoaS5kdXJhdGlvbiksdGhpcy5faW50ZXJ2YWw9dC5UaWNrcyhpLmludGVydmFsKSx0aGlzLl9jdXJyZW50SWQ9LTEsdGhpcy5fbmV4dElkPS0xLHRoaXMuX25leHRUaWNrPXRoaXMudGltZSx0aGlzLl9ib3VuZFJlc3RhcnQ9dGhpcy5fcmVzdGFydC5iaW5kKHRoaXMpLHRoaXMuVHJhbnNwb3J0Lm9uKFwic3RhcnQgbG9vcFN0YXJ0XCIsdGhpcy5fYm91bmRSZXN0YXJ0KSx0aGlzLl9yZXN0YXJ0KCl9LHQuZXh0ZW5kKHQuVHJhbnNwb3J0UmVwZWF0RXZlbnQsdC5UcmFuc3BvcnRFdmVudCksdC5UcmFuc3BvcnRSZXBlYXRFdmVudC5kZWZhdWx0cz17ZHVyYXRpb246MS8wLGludGVydmFsOjF9LHQuVHJhbnNwb3J0UmVwZWF0RXZlbnQucHJvdG90eXBlLmludm9rZT1mdW5jdGlvbihlKXt0aGlzLl9jcmVhdGVFdmVudHMoZSksdC5UcmFuc3BvcnRFdmVudC5wcm90b3R5cGUuaW52b2tlLmNhbGwodGhpcyxlKX0sdC5UcmFuc3BvcnRSZXBlYXRFdmVudC5wcm90b3R5cGUuX2NyZWF0ZUV2ZW50cz1mdW5jdGlvbihlKXt2YXIgaT10aGlzLlRyYW5zcG9ydC5nZXRUaWNrc0F0VGltZShlKTtpPj10aGlzLnRpbWUmJmk+PXRoaXMuX25leHRUaWNrJiZ0aGlzLl9uZXh0VGljayt0aGlzLl9pbnRlcnZhbDx0aGlzLnRpbWUrdGhpcy5kdXJhdGlvbiYmKHRoaXMuX25leHRUaWNrKz10aGlzLl9pbnRlcnZhbCx0aGlzLl9jdXJyZW50SWQ9dGhpcy5fbmV4dElkLHRoaXMuX25leHRJZD10aGlzLlRyYW5zcG9ydC5zY2hlZHVsZU9uY2UodGhpcy5pbnZva2UuYmluZCh0aGlzKSx0LlRpY2tzKHRoaXMuX25leHRUaWNrKSkpfSx0LlRyYW5zcG9ydFJlcGVhdEV2ZW50LnByb3RvdHlwZS5fcmVzdGFydD1mdW5jdGlvbihlKXt0aGlzLlRyYW5zcG9ydC5jbGVhcih0aGlzLl9jdXJyZW50SWQpLHRoaXMuVHJhbnNwb3J0LmNsZWFyKHRoaXMuX25leHRJZCksdGhpcy5fbmV4dFRpY2s9dGhpcy50aW1lO3ZhciBpPXRoaXMuVHJhbnNwb3J0LmdldFRpY2tzQXRUaW1lKGUpO2k+dGhpcy50aW1lJiYodGhpcy5fbmV4dFRpY2s9dGhpcy50aW1lK01hdGguY2VpbCgoaS10aGlzLnRpbWUpL3RoaXMuX2ludGVydmFsKSp0aGlzLl9pbnRlcnZhbCksdGhpcy5fY3VycmVudElkPXRoaXMuVHJhbnNwb3J0LnNjaGVkdWxlT25jZSh0aGlzLmludm9rZS5iaW5kKHRoaXMpLHQuVGlja3ModGhpcy5fbmV4dFRpY2spKSx0aGlzLl9uZXh0VGljays9dGhpcy5faW50ZXJ2YWwsdGhpcy5fbmV4dElkPXRoaXMuVHJhbnNwb3J0LnNjaGVkdWxlT25jZSh0aGlzLmludm9rZS5iaW5kKHRoaXMpLHQuVGlja3ModGhpcy5fbmV4dFRpY2spKX0sdC5UcmFuc3BvcnRSZXBlYXRFdmVudC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlRyYW5zcG9ydC5jbGVhcih0aGlzLl9jdXJyZW50SWQpLHRoaXMuVHJhbnNwb3J0LmNsZWFyKHRoaXMuX25leHRJZCksdGhpcy5UcmFuc3BvcnQub2ZmKFwic3RhcnQgbG9vcFN0YXJ0XCIsdGhpcy5fYm91bmRSZXN0YXJ0KSx0aGlzLl9ib3VuZENyZWF0ZUV2ZW50cz1udWxsLHQuVHJhbnNwb3J0RXZlbnQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLmR1cmF0aW9uPW51bGwsdGhpcy5faW50ZXJ2YWw9bnVsbCx0aGlzfSx0LlRyYW5zcG9ydFJlcGVhdEV2ZW50fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDQpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjt0LkludGVydmFsVGltZWxpbmU9ZnVuY3Rpb24oKXt0LmNhbGwodGhpcyksdGhpcy5fcm9vdD1udWxsLHRoaXMuX2xlbmd0aD0wfSx0LmV4dGVuZCh0LkludGVydmFsVGltZWxpbmUpLHQuSW50ZXJ2YWxUaW1lbGluZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGkpe2lmKHQuaXNVbmRlZihpLnRpbWUpfHx0LmlzVW5kZWYoaS5kdXJhdGlvbikpdGhyb3cgbmV3IEVycm9yKFwiVG9uZS5JbnRlcnZhbFRpbWVsaW5lOiBldmVudHMgbXVzdCBoYXZlIHRpbWUgYW5kIGR1cmF0aW9uIHBhcmFtZXRlcnNcIik7aS50aW1lPWkudGltZS52YWx1ZU9mKCk7dmFyIG49bmV3IGUoaS50aW1lLGkudGltZStpLmR1cmF0aW9uLGkpO2ZvcihudWxsPT09dGhpcy5fcm9vdD90aGlzLl9yb290PW46dGhpcy5fcm9vdC5pbnNlcnQobiksdGhpcy5fbGVuZ3RoKys7bnVsbCE9PW47KW4udXBkYXRlSGVpZ2h0KCksbi51cGRhdGVNYXgoKSx0aGlzLl9yZWJhbGFuY2Uobiksbj1uLnBhcmVudDtyZXR1cm4gdGhpc30sdC5JbnRlcnZhbFRpbWVsaW5lLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7aWYobnVsbCE9PXRoaXMuX3Jvb3Qpe3ZhciBlPVtdO3RoaXMuX3Jvb3Quc2VhcmNoKHQudGltZSxlKTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG49ZVtpXTtpZihuLmV2ZW50PT09dCl7dGhpcy5fcmVtb3ZlTm9kZShuKSx0aGlzLl9sZW5ndGgtLTticmVha319fXJldHVybiB0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5JbnRlcnZhbFRpbWVsaW5lLnByb3RvdHlwZSxcImxlbmd0aFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGVuZ3RofX0pLHQuSW50ZXJ2YWxUaW1lbGluZS5wcm90b3R5cGUuY2FuY2VsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZvckVhY2hGcm9tKHQsZnVuY3Rpb24odCl7dGhpcy5yZW1vdmUodCl9LmJpbmQodGhpcykpLHRoaXN9LHQuSW50ZXJ2YWxUaW1lbGluZS5wcm90b3R5cGUuX3NldFJvb3Q9ZnVuY3Rpb24odCl7dGhpcy5fcm9vdD10LG51bGwhPT10aGlzLl9yb290JiYodGhpcy5fcm9vdC5wYXJlbnQ9bnVsbCl9LHQuSW50ZXJ2YWxUaW1lbGluZS5wcm90b3R5cGUuX3JlcGxhY2VOb2RlSW5QYXJlbnQ9ZnVuY3Rpb24odCxlKXtudWxsIT09dC5wYXJlbnQ/KHQuaXNMZWZ0Q2hpbGQoKT90LnBhcmVudC5sZWZ0PWU6dC5wYXJlbnQucmlnaHQ9ZSx0aGlzLl9yZWJhbGFuY2UodC5wYXJlbnQpKTp0aGlzLl9zZXRSb290KGUpfSx0LkludGVydmFsVGltZWxpbmUucHJvdG90eXBlLl9yZW1vdmVOb2RlPWZ1bmN0aW9uKHQpe2lmKG51bGw9PT10LmxlZnQmJm51bGw9PT10LnJpZ2h0KXRoaXMuX3JlcGxhY2VOb2RlSW5QYXJlbnQodCxudWxsKTtlbHNlIGlmKG51bGw9PT10LnJpZ2h0KXRoaXMuX3JlcGxhY2VOb2RlSW5QYXJlbnQodCx0LmxlZnQpO2Vsc2UgaWYobnVsbD09PXQubGVmdCl0aGlzLl9yZXBsYWNlTm9kZUluUGFyZW50KHQsdC5yaWdodCk7ZWxzZXt2YXIgZSxpO2lmKHQuZ2V0QmFsYW5jZSgpPjApaWYobnVsbD09PXQubGVmdC5yaWdodCkoZT10LmxlZnQpLnJpZ2h0PXQucmlnaHQsaT1lO2Vsc2V7Zm9yKGU9dC5sZWZ0LnJpZ2h0O251bGwhPT1lLnJpZ2h0OyllPWUucmlnaHQ7ZS5wYXJlbnQucmlnaHQ9ZS5sZWZ0LGk9ZS5wYXJlbnQsZS5sZWZ0PXQubGVmdCxlLnJpZ2h0PXQucmlnaHR9ZWxzZSBpZihudWxsPT09dC5yaWdodC5sZWZ0KShlPXQucmlnaHQpLmxlZnQ9dC5sZWZ0LGk9ZTtlbHNle2ZvcihlPXQucmlnaHQubGVmdDtudWxsIT09ZS5sZWZ0OyllPWUubGVmdDtlLnBhcmVudD1lLnBhcmVudCxlLnBhcmVudC5sZWZ0PWUucmlnaHQsaT1lLnBhcmVudCxlLmxlZnQ9dC5sZWZ0LGUucmlnaHQ9dC5yaWdodH1udWxsIT09dC5wYXJlbnQ/dC5pc0xlZnRDaGlsZCgpP3QucGFyZW50LmxlZnQ9ZTp0LnBhcmVudC5yaWdodD1lOnRoaXMuX3NldFJvb3QoZSksdGhpcy5fcmViYWxhbmNlKGkpfXQuZGlzcG9zZSgpfSx0LkludGVydmFsVGltZWxpbmUucHJvdG90eXBlLl9yb3RhdGVMZWZ0PWZ1bmN0aW9uKHQpe3ZhciBlPXQucGFyZW50LGk9dC5pc0xlZnRDaGlsZCgpLG49dC5yaWdodDt0LnJpZ2h0PW4ubGVmdCxuLmxlZnQ9dCxudWxsIT09ZT9pP2UubGVmdD1uOmUucmlnaHQ9bjp0aGlzLl9zZXRSb290KG4pfSx0LkludGVydmFsVGltZWxpbmUucHJvdG90eXBlLl9yb3RhdGVSaWdodD1mdW5jdGlvbih0KXt2YXIgZT10LnBhcmVudCxpPXQuaXNMZWZ0Q2hpbGQoKSxuPXQubGVmdDt0LmxlZnQ9bi5yaWdodCxuLnJpZ2h0PXQsbnVsbCE9PWU/aT9lLmxlZnQ9bjplLnJpZ2h0PW46dGhpcy5fc2V0Um9vdChuKX0sdC5JbnRlcnZhbFRpbWVsaW5lLnByb3RvdHlwZS5fcmViYWxhbmNlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QmFsYW5jZSgpO2U+MT90LmxlZnQuZ2V0QmFsYW5jZSgpPDA/dGhpcy5fcm90YXRlTGVmdCh0LmxlZnQpOnRoaXMuX3JvdGF0ZVJpZ2h0KHQpOmU8LTEmJih0LnJpZ2h0LmdldEJhbGFuY2UoKT4wP3RoaXMuX3JvdGF0ZVJpZ2h0KHQucmlnaHQpOnRoaXMuX3JvdGF0ZUxlZnQodCkpfSx0LkludGVydmFsVGltZWxpbmUucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtpZihudWxsIT09dGhpcy5fcm9vdCl7dmFyIGU9W107aWYodGhpcy5fcm9vdC5zZWFyY2godCxlKSxlLmxlbmd0aD4wKXtmb3IodmFyIGk9ZVswXSxuPTE7bjxlLmxlbmd0aDtuKyspZVtuXS5sb3c+aS5sb3cmJihpPWVbbl0pO3JldHVybiBpLmV2ZW50fX1yZXR1cm4gbnVsbH0sdC5JbnRlcnZhbFRpbWVsaW5lLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQpe2lmKG51bGwhPT10aGlzLl9yb290KXt2YXIgZT1bXTt0aGlzLl9yb290LnRyYXZlcnNlKGZ1bmN0aW9uKHQpe2UucHVzaCh0KX0pO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbj1lW2ldLmV2ZW50O24mJnQobil9fXJldHVybiB0aGlzfSx0LkludGVydmFsVGltZWxpbmUucHJvdG90eXBlLmZvckVhY2hBdFRpbWU9ZnVuY3Rpb24odCxlKXtpZihudWxsIT09dGhpcy5fcm9vdCl7dmFyIGk9W107dGhpcy5fcm9vdC5zZWFyY2godCxpKTtmb3IodmFyIG49aS5sZW5ndGgtMTtuPj0wO24tLSl7dmFyIG89aVtuXS5ldmVudDtvJiZlKG8pfX1yZXR1cm4gdGhpc30sdC5JbnRlcnZhbFRpbWVsaW5lLnByb3RvdHlwZS5mb3JFYWNoRnJvbT1mdW5jdGlvbih0LGUpe2lmKG51bGwhPT10aGlzLl9yb290KXt2YXIgaT1bXTt0aGlzLl9yb290LnNlYXJjaEFmdGVyKHQsaSk7Zm9yKHZhciBuPWkubGVuZ3RoLTE7bj49MDtuLS0pe2UoaVtuXS5ldmVudCl9fXJldHVybiB0aGlzfSx0LkludGVydmFsVGltZWxpbmUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt2YXIgdD1bXTtudWxsIT09dGhpcy5fcm9vdCYmdGhpcy5fcm9vdC50cmF2ZXJzZShmdW5jdGlvbihlKXt0LnB1c2goZSl9KTtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdLmRpc3Bvc2UoKTtyZXR1cm4gdD1udWxsLHRoaXMuX3Jvb3Q9bnVsbCx0aGlzfTt2YXIgZT1mdW5jdGlvbih0LGUsaSl7dGhpcy5ldmVudD1pLHRoaXMubG93PXQsdGhpcy5oaWdoPWUsdGhpcy5tYXg9dGhpcy5oaWdoLHRoaXMuX2xlZnQ9bnVsbCx0aGlzLl9yaWdodD1udWxsLHRoaXMucGFyZW50PW51bGwsdGhpcy5oZWlnaHQ9MH07cmV0dXJuIGUucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0KXt0Lmxvdzw9dGhpcy5sb3c/bnVsbD09PXRoaXMubGVmdD90aGlzLmxlZnQ9dDp0aGlzLmxlZnQuaW5zZXJ0KHQpOm51bGw9PT10aGlzLnJpZ2h0P3RoaXMucmlnaHQ9dDp0aGlzLnJpZ2h0Lmluc2VydCh0KX0sZS5wcm90b3R5cGUuc2VhcmNoPWZ1bmN0aW9uKHQsZSl7dD50aGlzLm1heHx8KG51bGwhPT10aGlzLmxlZnQmJnRoaXMubGVmdC5zZWFyY2godCxlKSx0aGlzLmxvdzw9dCYmdGhpcy5oaWdoPnQmJmUucHVzaCh0aGlzKSx0aGlzLmxvdz50fHxudWxsIT09dGhpcy5yaWdodCYmdGhpcy5yaWdodC5zZWFyY2godCxlKSl9LGUucHJvdG90eXBlLnNlYXJjaEFmdGVyPWZ1bmN0aW9uKHQsZSl7dGhpcy5sb3c+PXQmJihlLnB1c2godGhpcyksbnVsbCE9PXRoaXMubGVmdCYmdGhpcy5sZWZ0LnNlYXJjaEFmdGVyKHQsZSkpLG51bGwhPT10aGlzLnJpZ2h0JiZ0aGlzLnJpZ2h0LnNlYXJjaEFmdGVyKHQsZSl9LGUucHJvdG90eXBlLnRyYXZlcnNlPWZ1bmN0aW9uKHQpe3QodGhpcyksbnVsbCE9PXRoaXMubGVmdCYmdGhpcy5sZWZ0LnRyYXZlcnNlKHQpLG51bGwhPT10aGlzLnJpZ2h0JiZ0aGlzLnJpZ2h0LnRyYXZlcnNlKHQpfSxlLnByb3RvdHlwZS51cGRhdGVIZWlnaHQ9ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5sZWZ0JiZudWxsIT09dGhpcy5yaWdodD90aGlzLmhlaWdodD1NYXRoLm1heCh0aGlzLmxlZnQuaGVpZ2h0LHRoaXMucmlnaHQuaGVpZ2h0KSsxOm51bGwhPT10aGlzLnJpZ2h0P3RoaXMuaGVpZ2h0PXRoaXMucmlnaHQuaGVpZ2h0KzE6bnVsbCE9PXRoaXMubGVmdD90aGlzLmhlaWdodD10aGlzLmxlZnQuaGVpZ2h0KzE6dGhpcy5oZWlnaHQ9MH0sZS5wcm90b3R5cGUudXBkYXRlTWF4PWZ1bmN0aW9uKCl7dGhpcy5tYXg9dGhpcy5oaWdoLG51bGwhPT10aGlzLmxlZnQmJih0aGlzLm1heD1NYXRoLm1heCh0aGlzLm1heCx0aGlzLmxlZnQubWF4KSksbnVsbCE9PXRoaXMucmlnaHQmJih0aGlzLm1heD1NYXRoLm1heCh0aGlzLm1heCx0aGlzLnJpZ2h0Lm1heCkpfSxlLnByb3RvdHlwZS5nZXRCYWxhbmNlPWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gbnVsbCE9PXRoaXMubGVmdCYmbnVsbCE9PXRoaXMucmlnaHQ/dD10aGlzLmxlZnQuaGVpZ2h0LXRoaXMucmlnaHQuaGVpZ2h0Om51bGwhPT10aGlzLmxlZnQ/dD10aGlzLmxlZnQuaGVpZ2h0KzE6bnVsbCE9PXRoaXMucmlnaHQmJih0PS0odGhpcy5yaWdodC5oZWlnaHQrMSkpLHR9LGUucHJvdG90eXBlLmlzTGVmdENoaWxkPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT10aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQubGVmdD09PXRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImxlZnRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xlZnR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9sZWZ0PXQsbnVsbCE9PXQmJih0LnBhcmVudD10aGlzKSx0aGlzLnVwZGF0ZUhlaWdodCgpLHRoaXMudXBkYXRlTWF4KCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwicmlnaHRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JpZ2h0fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fcmlnaHQ9dCxudWxsIT09dCYmKHQucGFyZW50PXRoaXMpLHRoaXMudXBkYXRlSGVpZ2h0KCksdGhpcy51cGRhdGVNYXgoKX19KSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5wYXJlbnQ9bnVsbCx0aGlzLl9sZWZ0PW51bGwsdGhpcy5fcmlnaHQ9bnVsbCx0aGlzLmV2ZW50PW51bGx9LHQuSW50ZXJ2YWxUaW1lbGluZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxpKXtpPXRoaXMudG9TZWNvbmRzKGkpLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBuPXRoaXMuX2V2ZW50cy5nZXQoaSksbz10aGlzLl9ldmVudHMucHJldmlvdXNFdmVudChuKSxzPXRoaXMuX2dldFRpY2tzVW50aWxFdmVudChvLGkpO3JldHVybiBuLnRpY2tzPU1hdGgubWF4KHMsMCksdGhpc319cmV0dXJuIHQuVGlja1NpZ25hbD1mdW5jdGlvbihlKXtlPXQuZGVmYXVsdEFyZyhlLDEpLHQuU2lnbmFsLmNhbGwodGhpcyx7dW5pdHM6dC5UeXBlLlRpY2tzLHZhbHVlOmV9KSx0aGlzLl9ldmVudHMubWVtb3J5PTEvMCx0aGlzLmNhbmNlbFNjaGVkdWxlZFZhbHVlcygwKSx0aGlzLl9ldmVudHMuYWRkKHt0eXBlOnQuUGFyYW0uQXV0b21hdGlvblR5cGUuU2V0VmFsdWUsdGltZTowLHZhbHVlOmV9KX0sdC5leHRlbmQodC5UaWNrU2lnbmFsLHQuU2lnbmFsKSx0LlRpY2tTaWduYWwucHJvdG90eXBlLnNldFZhbHVlQXRUaW1lPWUodC5TaWduYWwucHJvdG90eXBlLnNldFZhbHVlQXRUaW1lKSx0LlRpY2tTaWduYWwucHJvdG90eXBlLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lPWUodC5TaWduYWwucHJvdG90eXBlLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKSx0LlRpY2tTaWduYWwucHJvdG90eXBlLnNldFRhcmdldEF0VGltZT1mdW5jdGlvbih0LGUsaSl7ZT10aGlzLnRvU2Vjb25kcyhlKSx0aGlzLnNldFJhbXBQb2ludChlKSx0PXRoaXMuX2Zyb21Vbml0cyh0KTtmb3IodmFyIG49dGhpcy5fZXZlbnRzLmdldChlKSxvPU1hdGgucm91bmQoTWF0aC5tYXgoMS9pLDEpKSxzPTA7czw9bztzKyspe3ZhciByPWkqcytlLGE9dGhpcy5fZXhwb25lbnRpYWxBcHByb2FjaChuLnRpbWUsbi52YWx1ZSx0LGkscik7dGhpcy5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSh0aGlzLl90b1VuaXRzKGEpLHIpfXJldHVybiB0aGlzfSx0LlRpY2tTaWduYWwucHJvdG90eXBlLmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWU9ZnVuY3Rpb24odCxlKXtlPXRoaXMudG9TZWNvbmRzKGUpLHQ9dGhpcy5fZnJvbVVuaXRzKHQpO3ZhciBpPXRoaXMuX2V2ZW50cy5nZXQoZSk7bnVsbD09PWkmJihpPXt2YWx1ZTp0aGlzLl9pbml0aWFsVmFsdWUsdGltZTowfSk7Zm9yKHZhciBuPU1hdGgucm91bmQoTWF0aC5tYXgoMTAqKGUtaS50aW1lKSwxKSksbz0oZS1pLnRpbWUpL24scz0wO3M8PW47cysrKXt2YXIgcj1vKnMraS50aW1lLGE9dGhpcy5fZXhwb25lbnRpYWxJbnRlcnBvbGF0ZShpLnRpbWUsaS52YWx1ZSxlLHQscik7dGhpcy5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSh0aGlzLl90b1VuaXRzKGEpLHIpfXJldHVybiB0aGlzfSx0LlRpY2tTaWduYWwucHJvdG90eXBlLl9nZXRUaWNrc1VudGlsRXZlbnQ9ZnVuY3Rpb24oZSxpKXtpZihudWxsPT09ZSllPXt0aWNrczowLHRpbWU6MH07ZWxzZSBpZih0LmlzVW5kZWYoZS50aWNrcykpe3ZhciBuPXRoaXMuX2V2ZW50cy5wcmV2aW91c0V2ZW50KGUpO2UudGlja3M9dGhpcy5fZ2V0VGlja3NVbnRpbEV2ZW50KG4sZS50aW1lKX12YXIgbz10aGlzLmdldFZhbHVlQXRUaW1lKGUudGltZSkscz10aGlzLmdldFZhbHVlQXRUaW1lKGkpO3JldHVybiB0aGlzLl9ldmVudHMuZ2V0KGkpLnRpbWU9PT1pJiZ0aGlzLl9ldmVudHMuZ2V0KGkpLnR5cGU9PT10LlBhcmFtLkF1dG9tYXRpb25UeXBlLlNldFZhbHVlJiYocz10aGlzLmdldFZhbHVlQXRUaW1lKGktdGhpcy5zYW1wbGVUaW1lKSksLjUqKGktZS50aW1lKSoobytzKStlLnRpY2tzfSx0LlRpY2tTaWduYWwucHJvdG90eXBlLmdldFRpY2tzQXRUaW1lPWZ1bmN0aW9uKHQpe3Q9dGhpcy50b1NlY29uZHModCk7dmFyIGU9dGhpcy5fZXZlbnRzLmdldCh0KTtyZXR1cm4gTWF0aC5tYXgodGhpcy5fZ2V0VGlja3NVbnRpbEV2ZW50KGUsdCksMCl9LHQuVGlja1NpZ25hbC5wcm90b3R5cGUuZ2V0RHVyYXRpb25PZlRpY2tzPWZ1bmN0aW9uKHQsZSl7ZT10aGlzLnRvU2Vjb25kcyhlKTt2YXIgaT10aGlzLmdldFRpY2tzQXRUaW1lKGUpO3JldHVybiB0aGlzLmdldFRpbWVPZlRpY2soaSt0KS1lfSx0LlRpY2tTaWduYWwucHJvdG90eXBlLmdldFRpbWVPZlRpY2s9ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5fZXZlbnRzLmdldChlLFwidGlja3NcIiksbj10aGlzLl9ldmVudHMuZ2V0QWZ0ZXIoZSxcInRpY2tzXCIpO2lmKGkmJmkudGlja3M9PT1lKXJldHVybiBpLnRpbWU7aWYoaSYmbiYmbi50eXBlPT09dC5QYXJhbS5BdXRvbWF0aW9uVHlwZS5MaW5lYXImJmkudmFsdWUhPT1uLnZhbHVlKXt2YXIgbz10aGlzLmdldFZhbHVlQXRUaW1lKGkudGltZSkscz0odGhpcy5nZXRWYWx1ZUF0VGltZShuLnRpbWUpLW8pLyhuLnRpbWUtaS50aW1lKSxyPU1hdGguc3FydChNYXRoLnBvdyhvLDIpLTIqcyooaS50aWNrcy1lKSksYT0oLW8rcikvcztyZXR1cm4oYT4wP2E6KC1vLXIpL3MpK2kudGltZX1yZXR1cm4gaT8wPT09aS52YWx1ZT8xLzA6aS50aW1lKyhlLWkudGlja3MpL2kudmFsdWU6ZS90aGlzLl9pbml0aWFsVmFsdWV9LHQuVGlja1NpZ25hbC5wcm90b3R5cGUudGlja3NUb1RpbWU9ZnVuY3Rpb24oZSxpKXtyZXR1cm4gaT10aGlzLnRvU2Vjb25kcyhpKSxuZXcgdC5UaW1lKHRoaXMuZ2V0RHVyYXRpb25PZlRpY2tzKGUsaSkpfSx0LlRpY2tTaWduYWwucHJvdG90eXBlLnRpbWVUb1RpY2tzPWZ1bmN0aW9uKGUsaSl7aT10aGlzLnRvU2Vjb25kcyhpKSxlPXRoaXMudG9TZWNvbmRzKGUpO3ZhciBuPXRoaXMuZ2V0VGlja3NBdFRpbWUoaSksbz10aGlzLmdldFRpY2tzQXRUaW1lKGkrZSk7cmV0dXJuIG5ldyB0LlRpY2tzKG8tbil9LHQuVGlja1NpZ25hbH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg1NiksaSgzMyksaSgzNSksaSgyMCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkNsb2NrPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiY2FsbGJhY2tcIixcImZyZXF1ZW5jeVwiXSx0LkNsb2NrKTt0LkVtaXR0ZXIuY2FsbCh0aGlzKSx0aGlzLmNhbGxiYWNrPWUuY2FsbGJhY2ssdGhpcy5fbmV4dFRpY2s9MCx0aGlzLl90aWNrU291cmNlPW5ldyB0LlRpY2tTb3VyY2UoZS5mcmVxdWVuY3kpLHRoaXMuX2xhc3RVcGRhdGU9MCx0aGlzLmZyZXF1ZW5jeT10aGlzLl90aWNrU291cmNlLmZyZXF1ZW5jeSx0aGlzLl9yZWFkT25seShcImZyZXF1ZW5jeVwiKSx0aGlzLl9zdGF0ZT1uZXcgdC5UaW1lbGluZVN0YXRlKHQuU3RhdGUuU3RvcHBlZCksdGhpcy5fc3RhdGUuc2V0U3RhdGVBdFRpbWUodC5TdGF0ZS5TdG9wcGVkLDApLHRoaXMuX2JvdW5kTG9vcD10aGlzLl9sb29wLmJpbmQodGhpcyksdGhpcy5jb250ZXh0Lm9uKFwidGlja1wiLHRoaXMuX2JvdW5kTG9vcCl9LHQuZXh0ZW5kKHQuQ2xvY2ssdC5FbWl0dGVyKSx0LkNsb2NrLmRlZmF1bHRzPXtjYWxsYmFjazp0Lm5vT3AsZnJlcXVlbmN5OjF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkNsb2NrLnByb3RvdHlwZSxcInN0YXRlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZSh0aGlzLm5vdygpKX19KSx0LkNsb2NrLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbihlLGkpe3JldHVybiB0aGlzLmNvbnRleHQucmVzdW1lKCksZT10aGlzLnRvU2Vjb25kcyhlKSx0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZShlKSE9PXQuU3RhdGUuU3RhcnRlZCYmKHRoaXMuX3N0YXRlLnNldFN0YXRlQXRUaW1lKHQuU3RhdGUuU3RhcnRlZCxlKSx0aGlzLl90aWNrU291cmNlLnN0YXJ0KGUsaSksZTx0aGlzLl9sYXN0VXBkYXRlJiZ0aGlzLmVtaXQoXCJzdGFydFwiLGUsaSkpLHRoaXN9LHQuQ2xvY2sucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dGhpcy50b1NlY29uZHMoZSksdGhpcy5fc3RhdGUuY2FuY2VsKGUpLHRoaXMuX3N0YXRlLnNldFN0YXRlQXRUaW1lKHQuU3RhdGUuU3RvcHBlZCxlKSx0aGlzLl90aWNrU291cmNlLnN0b3AoZSksZTx0aGlzLl9sYXN0VXBkYXRlJiZ0aGlzLmVtaXQoXCJzdG9wXCIsZSksdGhpc30sdC5DbG9jay5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dGhpcy50b1NlY29uZHMoZSksdGhpcy5fc3RhdGUuZ2V0VmFsdWVBdFRpbWUoZSk9PT10LlN0YXRlLlN0YXJ0ZWQmJih0aGlzLl9zdGF0ZS5zZXRTdGF0ZUF0VGltZSh0LlN0YXRlLlBhdXNlZCxlKSx0aGlzLl90aWNrU291cmNlLnBhdXNlKGUpLGU8dGhpcy5fbGFzdFVwZGF0ZSYmdGhpcy5lbWl0KFwicGF1c2VcIixlKSksdGhpc30sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQ2xvY2sucHJvdG90eXBlLFwidGlja3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLmdldFRpY2tzQXRUaW1lKHRoaXMubm93KCkpKX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3RpY2tTb3VyY2UudGlja3M9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5DbG9jay5wcm90b3R5cGUsXCJzZWNvbmRzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90aWNrU291cmNlLnNlY29uZHN9LHNldDpmdW5jdGlvbih0KXt0aGlzLl90aWNrU291cmNlLnNlY29uZHM9dH19KSx0LkNsb2NrLnByb3RvdHlwZS5nZXRTZWNvbmRzQXRUaW1lPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl90aWNrU291cmNlLmdldFNlY29uZHNBdFRpbWUodCl9LHQuQ2xvY2sucHJvdG90eXBlLnNldFRpY2tzQXRUaW1lPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3RpY2tTb3VyY2Uuc2V0VGlja3NBdFRpbWUodCxlKSx0aGlzfSx0LkNsb2NrLnByb3RvdHlwZS5nZXRUaWNrc0F0VGltZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fdGlja1NvdXJjZS5nZXRUaWNrc0F0VGltZSh0KX0sdC5DbG9jay5wcm90b3R5cGUubmV4dFRpY2tUaW1lPWZ1bmN0aW9uKHQsZSl7ZT10aGlzLnRvU2Vjb25kcyhlKTt2YXIgaT10aGlzLmdldFRpY2tzQXRUaW1lKGUpO3JldHVybiB0aGlzLl90aWNrU291cmNlLmdldFRpbWVPZlRpY2soaSt0LGUpfSx0LkNsb2NrLnByb3RvdHlwZS5fbG9vcD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX2xhc3RVcGRhdGUsaT10aGlzLm5vdygpO3RoaXMuX2xhc3RVcGRhdGU9aSxlIT09aSYmKHRoaXMuX3N0YXRlLmZvckVhY2hCZXR3ZWVuKGUsaSxmdW5jdGlvbihlKXtzd2l0Y2goZS5zdGF0ZSl7Y2FzZSB0LlN0YXRlLlN0YXJ0ZWQ6dmFyIGk9dGhpcy5fdGlja1NvdXJjZS5nZXRUaWNrc0F0VGltZShlLnRpbWUpO3RoaXMuZW1pdChcInN0YXJ0XCIsZS50aW1lLGkpO2JyZWFrO2Nhc2UgdC5TdGF0ZS5TdG9wcGVkOjAhPT1lLnRpbWUmJnRoaXMuZW1pdChcInN0b3BcIixlLnRpbWUpO2JyZWFrO2Nhc2UgdC5TdGF0ZS5QYXVzZWQ6dGhpcy5lbWl0KFwicGF1c2VcIixlLnRpbWUpfX0uYmluZCh0aGlzKSksdGhpcy5fdGlja1NvdXJjZS5mb3JFYWNoVGlja0JldHdlZW4oZSxpLGZ1bmN0aW9uKHQsZSl7dGhpcy5jYWxsYmFjayh0LGUpfS5iaW5kKHRoaXMpKSl9LHQuQ2xvY2sucHJvdG90eXBlLmdldFN0YXRlQXRUaW1lPWZ1bmN0aW9uKHQpe3JldHVybiB0PXRoaXMudG9TZWNvbmRzKHQpLHRoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKHQpfSx0LkNsb2NrLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dC5FbWl0dGVyLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5jb250ZXh0Lm9mZihcInRpY2tcIix0aGlzLl9ib3VuZExvb3ApLHRoaXMuX3dyaXRhYmxlKFwiZnJlcXVlbmN5XCIpLHRoaXMuX3RpY2tTb3VyY2UuZGlzcG9zZSgpLHRoaXMuX3RpY2tTb3VyY2U9bnVsbCx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXMuX2JvdW5kTG9vcD1udWxsLHRoaXMuX25leHRUaWNrPTEvMCx0aGlzLmNhbGxiYWNrPW51bGwsdGhpcy5fc3RhdGUuZGlzcG9zZSgpLHRoaXMuX3N0YXRlPW51bGx9LHQuQ2xvY2t9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMSksaSg1KSxpKDcpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5HcmVhdGVyVGhhblplcm89ZnVuY3Rpb24oKXt0LlNpZ25hbEJhc2UuY2FsbCh0aGlzKSx0aGlzLl90aHJlc2g9dGhpcy5vdXRwdXQ9bmV3IHQuV2F2ZVNoYXBlcihmdW5jdGlvbih0KXtyZXR1cm4gdDw9MD8wOjF9LDEyNyksdGhpcy5fc2NhbGU9dGhpcy5pbnB1dD1uZXcgdC5NdWx0aXBseSgxZTQpLHRoaXMuX3NjYWxlLmNvbm5lY3QodGhpcy5fdGhyZXNoKX0sdC5leHRlbmQodC5HcmVhdGVyVGhhblplcm8sdC5TaWduYWxCYXNlKSx0LkdyZWF0ZXJUaGFuWmVyby5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LlNpZ25hbEJhc2UucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9zY2FsZS5kaXNwb3NlKCksdGhpcy5fc2NhbGU9bnVsbCx0aGlzLl90aHJlc2guZGlzcG9zZSgpLHRoaXMuX3RocmVzaD1udWxsLHRoaXN9LHQuR3JlYXRlclRoYW5aZXJvfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDg3KSxpKDEzKSxpKDEpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5HcmVhdGVyVGhhbj1mdW5jdGlvbihlKXt0LlNpZ25hbC5jYWxsKHRoaXMpLHRoaXMuY3JlYXRlSW5zT3V0cygyLDApLHRoaXMuX3BhcmFtPXRoaXMuaW5wdXRbMF09bmV3IHQuU3VidHJhY3QoZSksdGhpcy5pbnB1dFsxXT10aGlzLl9wYXJhbS5pbnB1dFsxXSx0aGlzLl9ndHo9dGhpcy5vdXRwdXQ9bmV3IHQuR3JlYXRlclRoYW5aZXJvLHRoaXMuX3BhcmFtLmNvbm5lY3QodGhpcy5fZ3R6KSx0aGlzLnByb3h5PSExfSx0LmV4dGVuZCh0LkdyZWF0ZXJUaGFuLHQuU2lnbmFsKSx0LkdyZWF0ZXJUaGFuLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU2lnbmFsLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fZ3R6LmRpc3Bvc2UoKSx0aGlzLl9ndHo9bnVsbCx0aGlzfSx0LkdyZWF0ZXJUaGFufS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDQ3KSxpKDI2KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuU2NhbGVkRW52ZWxvcGU9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJhdHRhY2tcIixcImRlY2F5XCIsXCJzdXN0YWluXCIsXCJyZWxlYXNlXCJdLHQuRW52ZWxvcGUpO3QuRW52ZWxvcGUuY2FsbCh0aGlzLGUpLGU9dC5kZWZhdWx0QXJnKGUsdC5TY2FsZWRFbnZlbG9wZS5kZWZhdWx0cyksdGhpcy5fZXhwPXRoaXMub3V0cHV0PW5ldyB0LlBvdyhlLmV4cG9uZW50KSx0aGlzLl9zY2FsZT10aGlzLm91dHB1dD1uZXcgdC5TY2FsZShlLm1pbixlLm1heCksdGhpcy5fc2lnLmNoYWluKHRoaXMuX2V4cCx0aGlzLl9zY2FsZSl9LHQuZXh0ZW5kKHQuU2NhbGVkRW52ZWxvcGUsdC5FbnZlbG9wZSksdC5TY2FsZWRFbnZlbG9wZS5kZWZhdWx0cz17bWluOjAsbWF4OjEsZXhwb25lbnQ6MX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuU2NhbGVkRW52ZWxvcGUucHJvdG90eXBlLFwibWluXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY2FsZS5taW59LHNldDpmdW5jdGlvbih0KXt0aGlzLl9zY2FsZS5taW49dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5TY2FsZWRFbnZlbG9wZS5wcm90b3R5cGUsXCJtYXhcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NjYWxlLm1heH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3NjYWxlLm1heD10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlNjYWxlZEVudmVsb3BlLnByb3RvdHlwZSxcImV4cG9uZW50XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9leHAudmFsdWV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9leHAudmFsdWU9dH19KSx0LlNjYWxlZEVudmVsb3BlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuRW52ZWxvcGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9zY2FsZS5kaXNwb3NlKCksdGhpcy5fc2NhbGU9bnVsbCx0aGlzLl9leHAuZGlzcG9zZSgpLHRoaXMuX2V4cD1udWxsLHRoaXN9LHQuU2NhbGVkRW52ZWxvcGV9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNyksaSgzNildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkFicz1mdW5jdGlvbigpe3QuU2lnbmFsQmFzZS5jYWxsKHRoaXMpLHRoaXMuX2Ficz10aGlzLmlucHV0PXRoaXMub3V0cHV0PW5ldyB0LldhdmVTaGFwZXIoZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguYWJzKHQpPC4wMDE/MDpNYXRoLmFicyh0KX0sMTAyNCl9LHQuZXh0ZW5kKHQuQWJzLHQuU2lnbmFsQmFzZSksdC5BYnMucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5TaWduYWxCYXNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fYWJzLmRpc3Bvc2UoKSx0aGlzLl9hYnM9bnVsbCx0aGlzfSx0LkFic30uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgzKSxpKDIpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtyZXR1cm4gdC5Tb2xvPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wic29sb1wiXSx0LlNvbG8pO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5pbnB1dD10aGlzLm91dHB1dD1uZXcgdC5HYWluLHRoaXMuX3NvbG9CaW5kPXRoaXMuX3NvbG9lZC5iaW5kKHRoaXMpLHRoaXMuY29udGV4dC5vbihcInNvbG9cIix0aGlzLl9zb2xvQmluZCksdGhpcy5zb2xvPWUuc29sb30sdC5leHRlbmQodC5Tb2xvLHQuQXVkaW9Ob2RlKSx0LlNvbG8uZGVmYXVsdHM9e3NvbG86ITF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlNvbG8ucHJvdG90eXBlLFwic29sb1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNTb2xvZWQoKX0sc2V0OmZ1bmN0aW9uKHQpe3Q/dGhpcy5fYWRkU29sbygpOnRoaXMuX3JlbW92ZVNvbG8oKSx0aGlzLmNvbnRleHQuZW1pdChcInNvbG9cIix0aGlzKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5Tb2xvLnByb3RvdHlwZSxcIm11dGVkXCIse2dldDpmdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5pbnB1dC5nYWluLnZhbHVlfX0pLHQuU29sby5wcm90b3R5cGUuX2FkZFNvbG89ZnVuY3Rpb24oKXt0LmlzQXJyYXkodGhpcy5jb250ZXh0Ll9jdXJyZW50U29sbyl8fCh0aGlzLmNvbnRleHQuX2N1cnJlbnRTb2xvPVtdKSx0aGlzLl9pc1NvbG9lZCgpfHx0aGlzLmNvbnRleHQuX2N1cnJlbnRTb2xvLnB1c2godGhpcyl9LHQuU29sby5wcm90b3R5cGUuX3JlbW92ZVNvbG89ZnVuY3Rpb24oKXtpZih0aGlzLl9pc1NvbG9lZCgpKXt2YXIgdD10aGlzLmNvbnRleHQuX2N1cnJlbnRTb2xvLmluZGV4T2YodGhpcyk7dGhpcy5jb250ZXh0Ll9jdXJyZW50U29sby5zcGxpY2UodCwxKX19LHQuU29sby5wcm90b3R5cGUuX2lzU29sb2VkPWZ1bmN0aW9uKCl7cmV0dXJuISF0LmlzQXJyYXkodGhpcy5jb250ZXh0Ll9jdXJyZW50U29sbykmJigwIT09dGhpcy5jb250ZXh0Ll9jdXJyZW50U29sby5sZW5ndGgmJi0xIT09dGhpcy5jb250ZXh0Ll9jdXJyZW50U29sby5pbmRleE9mKHRoaXMpKX0sdC5Tb2xvLnByb3RvdHlwZS5fbm9Tb2xvcz1mdW5jdGlvbigpe3JldHVybiF0LmlzQXJyYXkodGhpcy5jb250ZXh0Ll9jdXJyZW50U29sbyl8fDA9PT10aGlzLmNvbnRleHQuX2N1cnJlbnRTb2xvLmxlbmd0aH0sdC5Tb2xvLnByb3RvdHlwZS5fc29sb2VkPWZ1bmN0aW9uKCl7dGhpcy5faXNTb2xvZWQoKT90aGlzLmlucHV0LmdhaW4udmFsdWU9MTp0aGlzLl9ub1NvbG9zKCk/dGhpcy5pbnB1dC5nYWluLnZhbHVlPTE6dGhpcy5pbnB1dC5nYWluLnZhbHVlPTB9LHQuU29sby5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRleHQub2ZmKFwic29sb1wiLHRoaXMuX3NvbG9CaW5kKSx0aGlzLl9yZW1vdmVTb2xvKCksdGhpcy5fc29sb0JpbmQ9bnVsbCx0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXN9LHQuU29sb30uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg3KSxpKDEwKSxpKDI4KSxpKDE5KSxpKDMpLGkoMSksaSgyMCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe2lmKHQuc3VwcG9ydGVkJiYhdC5nbG9iYWwuQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVTdGVyZW9QYW5uZXIpe3ZhciBlPWZ1bmN0aW9uKGUpe3RoaXMuY29udGV4dD1lLHRoaXMucGFuPW5ldyB0LlNpZ25hbCgwLHQuVHlwZS5BdWRpb1JhbmdlKTt2YXIgaT1uZXcgdC5XYXZlU2hhcGVyKGZ1bmN0aW9uKGUpe3JldHVybiB0LmVxdWFsUG93ZXJTY2FsZSgoZSsxKS8yKX0sNDA5Niksbj1uZXcgdC5XYXZlU2hhcGVyKGZ1bmN0aW9uKGUpe3JldHVybiB0LmVxdWFsUG93ZXJTY2FsZSgxLShlKzEpLzIpfSw0MDk2KSxvPW5ldyB0LkdhaW4scz1uZXcgdC5HYWluLHI9dGhpcy5pbnB1dD1uZXcgdC5TcGxpdDtyLl9zcGxpdHRlci5jaGFubmVsQ291bnRNb2RlPVwiZXhwbGljaXRcIiwobmV3IHQuWmVybykuZmFuKGksbik7dmFyIGE9dGhpcy5vdXRwdXQ9bmV3IHQuTWVyZ2U7ci5sZWZ0LmNoYWluKG8sYS5sZWZ0KSxyLnJpZ2h0LmNoYWluKHMsYS5yaWdodCksdGhpcy5wYW4uY2hhaW4obixvLmdhaW4pLHRoaXMucGFuLmNoYWluKGkscy5nYWluKX07ZS5wcm90b3R5cGUuZGlzY29ubmVjdD1mdW5jdGlvbigpe3RoaXMub3V0cHV0LmRpc2Nvbm5lY3QuYXBwbHkodGhpcy5vdXRwdXQsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuY29ubmVjdD1mdW5jdGlvbigpe3RoaXMub3V0cHV0LmNvbm5lY3QuYXBwbHkodGhpcy5vdXRwdXQsYXJndW1lbnRzKX0sQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVTdGVyZW9QYW5uZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGUodGhpcyl9LHQuQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlU3RlcmVvUGFubmVyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBlKHRoaXMpfX19LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNyldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkVxdWFsUG93ZXJHYWluPWZ1bmN0aW9uKCl7dC5TaWduYWxCYXNlLmNhbGwodGhpcyksdGhpcy5fZXFQb3dlcj10aGlzLmlucHV0PXRoaXMub3V0cHV0PW5ldyB0LldhdmVTaGFwZXIoZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguYWJzKGUpPC4wMDE/MDp0LmVxdWFsUG93ZXJTY2FsZShlKX0uYmluZCh0aGlzKSw0MDk2KX0sdC5leHRlbmQodC5FcXVhbFBvd2VyR2Fpbix0LlNpZ25hbEJhc2UpLHQuRXF1YWxQb3dlckdhaW4ucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5TaWduYWxCYXNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fZXFQb3dlci5kaXNwb3NlKCksdGhpcy5fZXFQb3dlcj1udWxsLHRoaXN9LHQuRXF1YWxQb3dlckdhaW59LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNSksaSgxKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuTmVnYXRlPWZ1bmN0aW9uKCl7dC5TaWduYWxCYXNlLmNhbGwodGhpcyksdGhpcy5fbXVsdGlwbHk9dGhpcy5pbnB1dD10aGlzLm91dHB1dD1uZXcgdC5NdWx0aXBseSgtMSl9LHQuZXh0ZW5kKHQuTmVnYXRlLHQuU2lnbmFsQmFzZSksdC5OZWdhdGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5TaWduYWxCYXNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fbXVsdGlwbHkuZGlzcG9zZSgpLHRoaXMuX211bHRpcGx5PW51bGwsdGhpc30sdC5OZWdhdGV9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNjApLGkoMjcpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlBhblZvbD1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcInBhblwiLFwidm9sdW1lXCJdLHQuUGFuVm9sKTt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLHRoaXMuX3Bhbm5lcj10aGlzLmlucHV0PW5ldyB0LlBhbm5lcihlLnBhbiksdGhpcy5wYW49dGhpcy5fcGFubmVyLnBhbix0aGlzLl92b2x1bWU9dGhpcy5vdXRwdXQ9bmV3IHQuVm9sdW1lKGUudm9sdW1lKSx0aGlzLnZvbHVtZT10aGlzLl92b2x1bWUudm9sdW1lLHRoaXMuX3Bhbm5lci5jb25uZWN0KHRoaXMuX3ZvbHVtZSksdGhpcy5tdXRlPWUubXV0ZSx0aGlzLl9yZWFkT25seShbXCJwYW5cIixcInZvbHVtZVwiXSl9LHQuZXh0ZW5kKHQuUGFuVm9sLHQuQXVkaW9Ob2RlKSx0LlBhblZvbC5kZWZhdWx0cz17cGFuOjAsdm9sdW1lOjAsbXV0ZTohMX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGFuVm9sLnByb3RvdHlwZSxcIm11dGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZvbHVtZS5tdXRlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fdm9sdW1lLm11dGU9dH19KSx0LlBhblZvbC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcInBhblwiLFwidm9sdW1lXCJdKSx0aGlzLl9wYW5uZXIuZGlzcG9zZSgpLHRoaXMuX3Bhbm5lcj1udWxsLHRoaXMucGFuPW51bGwsdGhpcy5fdm9sdW1lLmRpc3Bvc2UoKSx0aGlzLl92b2x1bWU9bnVsbCx0aGlzLnZvbHVtZT1udWxsLHRoaXN9LHQuUGFuVm9sfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDM0KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7dC5zdXBwb3J0ZWQmJihBbmFseXNlck5vZGUucHJvdG90eXBlLmdldEZsb2F0VGltZURvbWFpbkRhdGF8fChBbmFseXNlck5vZGUucHJvdG90eXBlLmdldEZsb2F0VGltZURvbWFpbkRhdGE9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkodC5sZW5ndGgpO3RoaXMuZ2V0Qnl0ZVRpbWVEb21haW5EYXRhKGUpO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXRbaV09KGVbaV0tMTI4KS8xMjh9KSl9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMzQpLGkoNjMpLGkoMjApLGkoMyldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe2lmKHQuc3VwcG9ydGVkJiYhdC5nbG9iYWwuQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVDb25zdGFudFNvdXJjZSl7dmFyIGU9ZnVuY3Rpb24odCl7dGhpcy5jb250ZXh0PXQ7Zm9yKHZhciBlPXQuY3JlYXRlQnVmZmVyKDEsMTI4LHQuc2FtcGxlUmF0ZSksaT1lLmdldENoYW5uZWxEYXRhKDApLG49MDtuPGkubGVuZ3RoO24rKylpW25dPTE7dGhpcy5fYnVmZmVyU291cmNlPXQuY3JlYXRlQnVmZmVyU291cmNlKCksdGhpcy5fYnVmZmVyU291cmNlLmNoYW5uZWxDb3VudD0xLHRoaXMuX2J1ZmZlclNvdXJjZS5jaGFubmVsQ291bnRNb2RlPVwiZXhwbGljaXRcIix0aGlzLl9idWZmZXJTb3VyY2UuYnVmZmVyPWUsdGhpcy5fYnVmZmVyU291cmNlLmxvb3A9ITA7dmFyIG89dGhpcy5fb3V0cHV0PXQuY3JlYXRlR2FpbigpO3RoaXMub2Zmc2V0PW8uZ2Fpbix0aGlzLl9idWZmZXJTb3VyY2UuY29ubmVjdChvKX07ZS5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2J1ZmZlclNvdXJjZS5zdGFydCh0KSx0aGlzfSxlLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9idWZmZXJTb3VyY2Uuc3RvcCh0KSx0aGlzfSxlLnByb3RvdHlwZS5jb25uZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX291dHB1dC5jb25uZWN0LmFwcGx5KHRoaXMuX291dHB1dCxhcmd1bWVudHMpLHRoaXN9LGUucHJvdG90eXBlLmRpc2Nvbm5lY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3V0cHV0LmRpc2Nvbm5lY3QuYXBwbHkodGhpcy5fb3V0cHV0LGFyZ3VtZW50cyksdGhpc30sQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVDb25zdGFudFNvdXJjZT1mdW5jdGlvbigpe3JldHVybiBuZXcgZSh0aGlzKX0sdC5Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVDb25zdGFudFNvdXJjZT1mdW5jdGlvbigpe3JldHVybiBuZXcgZSh0aGlzKX19fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDM0KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7aWYodC5zdXBwb3J0ZWQmJiF0Lmdsb2JhbC5BdWRpb0NvbnRleHQucHJvdG90eXBlLl9uYXRpdmVfY3JlYXRlV2F2ZVNoYXBlcil7dmFyIGU9bmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO2lmKGUuaW5jbHVkZXMoXCJzYWZhcmlcIikmJiFlLmluY2x1ZGVzKFwiY2hyb21lXCIpKXt2YXIgaT1mdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdGhpcy5faW50ZXJuYWxOb2RlPXRoaXMuaW5wdXQ9dGhpcy5vdXRwdXQ9dC5fbmF0aXZlX2NyZWF0ZVdhdmVTaGFwZXIoKSx0aGlzLl9jdXJ2ZT1udWxsLHRoaXMuX2ludGVybmFsTm9kZSl0aGlzLl9kZWZpbmVQcm9wZXJ0eSh0aGlzLl9pbnRlcm5hbE5vZGUsZSl9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLnByb3RvdHlwZSxcImN1cnZlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jdXJ2ZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2N1cnZlPXQ7dmFyIGU9bmV3IEZsb2F0MzJBcnJheSh0Lmxlbmd0aCsxKTtlLnNldCh0LDEpLGVbMF09dFswXSx0aGlzLl9pbnRlcm5hbE5vZGUuY3VydmU9ZX19KSxpLnByb3RvdHlwZS5fZGVmaW5lUHJvcGVydHk9ZnVuY3Rpb24oZSxpKXt0LmlzVW5kZWYodGhpc1tpXSkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGkse2dldDpmdW5jdGlvbigpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIGVbaV0/ZVtpXS5iaW5kKGUpOmVbaV19LHNldDpmdW5jdGlvbih0KXtlW2ldPXR9fSl9LHQuZ2xvYmFsLkF1ZGlvQ29udGV4dC5wcm90b3R5cGUuX25hdGl2ZV9jcmVhdGVXYXZlU2hhcGVyPXQuZ2xvYmFsLkF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlV2F2ZVNoYXBlcix0Lmdsb2JhbC5BdWRpb0NvbnRleHQucHJvdG90eXBlLmNyZWF0ZVdhdmVTaGFwZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGkodGhpcyl9fX19LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNDYpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtyZXR1cm4gdC5NaWRpPWZ1bmN0aW9uKGUsaSl7aWYoISh0aGlzIGluc3RhbmNlb2YgdC5NaWRpKSlyZXR1cm4gbmV3IHQuTWlkaShlLGkpO3QuRnJlcXVlbmN5LmNhbGwodGhpcyxlLGkpfSx0LmV4dGVuZCh0Lk1pZGksdC5GcmVxdWVuY3kpLHQuTWlkaS5wcm90b3R5cGUuX2RlZmF1bHRVbml0cz1cIm1pZGlcIix0Lk1pZGkucHJvdG90eXBlLl9mcmVxdWVuY3lUb1VuaXRzPWZ1bmN0aW9uKGUpe3JldHVybiB0LkZyZXF1ZW5jeS5mdG9tKHQuRnJlcXVlbmN5LnByb3RvdHlwZS5fZnJlcXVlbmN5VG9Vbml0cy5jYWxsKHRoaXMsZSkpfSx0Lk1pZGkucHJvdG90eXBlLl90aWNrc1RvVW5pdHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuRnJlcXVlbmN5LmZ0b20odC5GcmVxdWVuY3kucHJvdG90eXBlLl90aWNrc1RvVW5pdHMuY2FsbCh0aGlzLGUpKX0sdC5NaWRpLnByb3RvdHlwZS5fYmVhdHNUb1VuaXRzPWZ1bmN0aW9uKGUpe3JldHVybiB0LkZyZXF1ZW5jeS5mdG9tKHQuRnJlcXVlbmN5LnByb3RvdHlwZS5fYmVhdHNUb1VuaXRzLmNhbGwodGhpcyxlKSl9LHQuTWlkaS5wcm90b3R5cGUuX3NlY29uZHNUb1VuaXRzPWZ1bmN0aW9uKGUpe3JldHVybiB0LkZyZXF1ZW5jeS5mdG9tKHQuRnJlcXVlbmN5LnByb3RvdHlwZS5fc2Vjb25kc1RvVW5pdHMuY2FsbCh0aGlzLGUpKX0sdC5NaWRpLnByb3RvdHlwZS50b01pZGk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZU9mKCl9LHQuTWlkaS5wcm90b3R5cGUudG9GcmVxdWVuY3k9ZnVuY3Rpb24oKXtyZXR1cm4gdC5GcmVxdWVuY3kubXRvZih0aGlzLnRvTWlkaSgpKX0sdC5NaWRpLnByb3RvdHlwZS50cmFuc3Bvc2U9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMudG9NaWRpKCkrdCl9LHQuTWlkaX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgyNyksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuVXNlck1lZGlhPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1widm9sdW1lXCJdLHQuVXNlck1lZGlhKTt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLHRoaXMuX21lZGlhU3RyZWFtPW51bGwsdGhpcy5fc3RyZWFtPW51bGwsdGhpcy5fZGV2aWNlPW51bGwsdGhpcy5fdm9sdW1lPXRoaXMub3V0cHV0PW5ldyB0LlZvbHVtZShlLnZvbHVtZSksdGhpcy52b2x1bWU9dGhpcy5fdm9sdW1lLnZvbHVtZSx0aGlzLl9yZWFkT25seShcInZvbHVtZVwiKSx0aGlzLm11dGU9ZS5tdXRlfSx0LmV4dGVuZCh0LlVzZXJNZWRpYSx0LkF1ZGlvTm9kZSksdC5Vc2VyTWVkaWEuZGVmYXVsdHM9e3ZvbHVtZTowLG11dGU6ITF9LHQuVXNlck1lZGlhLnByb3RvdHlwZS5vcGVuPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnN0YXRlPT09dC5TdGF0ZS5TdGFydGVkJiZ0aGlzLmNsb3NlKCksdC5Vc2VyTWVkaWEuZW51bWVyYXRlRGV2aWNlcygpLnRoZW4oZnVuY3Rpb24oaSl7dmFyIG47aWYodC5pc051bWJlcihlKSluPWlbZV07ZWxzZSBpZighKG49aS5maW5kKGZ1bmN0aW9uKHQpe3JldHVybiB0LmxhYmVsPT09ZXx8dC5kZXZpY2VJZD09PWV9KSkmJmkubGVuZ3RoPjApbj1pWzBdO2Vsc2UgaWYoIW4mJnQuaXNEZWZpbmVkKGUpKXRocm93IG5ldyBFcnJvcihcIlRvbmUuVXNlck1lZGlhOiBubyBtYXRjaGluZyBkZXZpY2U6IFwiK2UpO3RoaXMuX2RldmljZT1uO3ZhciBvPXthdWRpbzp7ZWNob0NhbmNlbGxhdGlvbjohMSxzYW1wbGVSYXRlOnRoaXMuY29udGV4dC5zYW1wbGVSYXRlLG5vaXNlU3VwcHJlc3Npb246ITEsbW96Tm9pc2VTdXBwcmVzc2lvbjohMX19O3JldHVybiBuJiYoby5hdWRpby5kZXZpY2VJZD1uLmRldmljZUlkKSxuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShvKS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9zdHJlYW18fCh0aGlzLl9zdHJlYW09dCx0aGlzLl9tZWRpYVN0cmVhbT10aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFTdHJlYW1Tb3VyY2UodCksdGhpcy5fbWVkaWFTdHJlYW0uY29ubmVjdCh0aGlzLm91dHB1dCkpLHRoaXN9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX0sdC5Vc2VyTWVkaWEucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N0cmVhbSYmKHRoaXMuX3N0cmVhbS5nZXRBdWRpb1RyYWNrcygpLmZvckVhY2goZnVuY3Rpb24odCl7dC5zdG9wKCl9KSx0aGlzLl9zdHJlYW09bnVsbCx0aGlzLl9tZWRpYVN0cmVhbS5kaXNjb25uZWN0KCksdGhpcy5fbWVkaWFTdHJlYW09bnVsbCksdGhpcy5fZGV2aWNlPW51bGwsdGhpc30sdC5Vc2VyTWVkaWEuZW51bWVyYXRlRGV2aWNlcz1mdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiB0LmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm5cImF1ZGlvaW5wdXRcIj09PXQua2luZH0pfSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlVzZXJNZWRpYS5wcm90b3R5cGUsXCJzdGF0ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RyZWFtJiZ0aGlzLl9zdHJlYW0uYWN0aXZlP3QuU3RhdGUuU3RhcnRlZDp0LlN0YXRlLlN0b3BwZWR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuVXNlck1lZGlhLnByb3RvdHlwZSxcImRldmljZUlkXCIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMuX2RldmljZSlyZXR1cm4gdGhpcy5fZGV2aWNlLmRldmljZUlkfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlVzZXJNZWRpYS5wcm90b3R5cGUsXCJncm91cElkXCIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMuX2RldmljZSlyZXR1cm4gdGhpcy5fZGV2aWNlLmdyb3VwSWR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuVXNlck1lZGlhLnByb3RvdHlwZSxcImxhYmVsXCIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMuX2RldmljZSlyZXR1cm4gdGhpcy5fZGV2aWNlLmxhYmVsfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlVzZXJNZWRpYS5wcm90b3R5cGUsXCJtdXRlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl92b2x1bWUubXV0ZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3ZvbHVtZS5tdXRlPXR9fSksdC5Vc2VyTWVkaWEucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLmNsb3NlKCksdGhpcy5fd3JpdGFibGUoXCJ2b2x1bWVcIiksdGhpcy5fdm9sdW1lLmRpc3Bvc2UoKSx0aGlzLl92b2x1bWU9bnVsbCx0aGlzLnZvbHVtZT1udWxsLHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlVzZXJNZWRpYSxcInN1cHBvcnRlZFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5pc0RlZmluZWQobmF2aWdhdG9yLm1lZGlhRGV2aWNlcykmJnQuaXNGdW5jdGlvbihuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSl9fSksdC5Vc2VyTWVkaWF9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNjcpLGkoMjcpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlBsYXllcnM9ZnVuY3Rpb24oZSl7dmFyIGk9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtpLnNoaWZ0KCk7dmFyIG49dC5kZWZhdWx0cyhpLFtcIm9ubG9hZFwiXSx0LlBsYXllcnMpO2Zvcih2YXIgbyBpbiB0LkF1ZGlvTm9kZS5jYWxsKHRoaXMsbiksdGhpcy5fdm9sdW1lPXRoaXMub3V0cHV0PW5ldyB0LlZvbHVtZShuLnZvbHVtZSksdGhpcy52b2x1bWU9dGhpcy5fdm9sdW1lLnZvbHVtZSx0aGlzLl9yZWFkT25seShcInZvbHVtZVwiKSx0aGlzLl92b2x1bWUub3V0cHV0Lm91dHB1dC5jaGFubmVsQ291bnQ9Mix0aGlzLl92b2x1bWUub3V0cHV0Lm91dHB1dC5jaGFubmVsQ291bnRNb2RlPVwiZXhwbGljaXRcIix0aGlzLm11dGU9bi5tdXRlLHRoaXMuX3BsYXllcnM9e30sdGhpcy5fbG9hZGluZ0NvdW50PTAsdGhpcy5fZmFkZUluPW4uZmFkZUluLHRoaXMuX2ZhZGVPdXQ9bi5mYWRlT3V0LGUpdGhpcy5fbG9hZGluZ0NvdW50KyssdGhpcy5hZGQobyxlW29dLHRoaXMuX2J1ZmZlckxvYWRlZC5iaW5kKHRoaXMsbi5vbmxvYWQpKX0sdC5leHRlbmQodC5QbGF5ZXJzLHQuQXVkaW9Ob2RlKSx0LlBsYXllcnMuZGVmYXVsdHM9e3ZvbHVtZTowLG11dGU6ITEsb25sb2FkOnQubm9PcCxmYWRlSW46MCxmYWRlT3V0OjB9LHQuUGxheWVycy5wcm90b3R5cGUuX2J1ZmZlckxvYWRlZD1mdW5jdGlvbih0KXt0aGlzLl9sb2FkaW5nQ291bnQtLSwwPT09dGhpcy5fbG9hZGluZ0NvdW50JiZ0JiZ0KHRoaXMpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QbGF5ZXJzLnByb3RvdHlwZSxcIm11dGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZvbHVtZS5tdXRlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fdm9sdW1lLm11dGU9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QbGF5ZXJzLnByb3RvdHlwZSxcImZhZGVJblwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZmFkZUlufSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fZmFkZUluPXQsdGhpcy5fZm9yRWFjaChmdW5jdGlvbihlKXtlLmZhZGVJbj10fSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGxheWVycy5wcm90b3R5cGUsXCJmYWRlT3V0XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9mYWRlT3V0fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fZmFkZU91dD10LHRoaXMuX2ZvckVhY2goZnVuY3Rpb24oZSl7ZS5mYWRlT3V0PXR9KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QbGF5ZXJzLnByb3RvdHlwZSxcInN0YXRlXCIse2dldDpmdW5jdGlvbigpe3ZhciBlPSExO3JldHVybiB0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKGkpe2U9ZXx8aS5zdGF0ZT09PXQuU3RhdGUuU3RhcnRlZH0pLGU/dC5TdGF0ZS5TdGFydGVkOnQuU3RhdGUuU3RvcHBlZH19KSx0LlBsYXllcnMucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGxheWVycy5oYXNPd25Qcm9wZXJ0eSh0KX0sdC5QbGF5ZXJzLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7aWYodGhpcy5oYXModCkpcmV0dXJuIHRoaXMuX3BsYXllcnNbdF07dGhyb3cgbmV3IEVycm9yKFwiVG9uZS5QbGF5ZXJzOiBubyBwbGF5ZXIgbmFtZWQgXCIrdCl9LHQuUGxheWVycy5wcm90b3R5cGUuX2ZvckVhY2g9ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHRoaXMuX3BsYXllcnMpdCh0aGlzLl9wbGF5ZXJzW2VdLGUpO3JldHVybiB0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QbGF5ZXJzLnByb3RvdHlwZSxcImxvYWRlZFwiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD0hMDtyZXR1cm4gdGhpcy5fZm9yRWFjaChmdW5jdGlvbihlKXt0PXQmJmUubG9hZGVkfSksdH19KSx0LlBsYXllcnMucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlLGksbil7cmV0dXJuIHRoaXMuX3BsYXllcnNbZV09bmV3IHQuUGxheWVyKGksbikuY29ubmVjdCh0aGlzLm91dHB1dCksdGhpcy5fcGxheWVyc1tlXS5mYWRlSW49dGhpcy5fZmFkZUluLHRoaXMuX3BsYXllcnNbZV0uZmFkZU91dD10aGlzLl9mYWRlT3V0LHRoaXN9LHQuUGxheWVycy5wcm90b3R5cGUuc3RvcEFsbD1mdW5jdGlvbih0KXt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uuc3RvcCh0KX0pfSx0LlBsYXllcnMucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl92b2x1bWUuZGlzcG9zZSgpLHRoaXMuX3ZvbHVtZT1udWxsLHRoaXMuX3dyaXRhYmxlKFwidm9sdW1lXCIpLHRoaXMudm9sdW1lPW51bGwsdGhpcy5vdXRwdXQ9bnVsbCx0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuZGlzcG9zZSgpfSksdGhpcy5fcGxheWVycz1udWxsLHRoaXN9LHQuUGxheWVyc30uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg2KSxpKDExKSxpKDMxKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuR3JhaW5QbGF5ZXI9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJ1cmxcIixcIm9ubG9hZFwiXSx0LkdyYWluUGxheWVyKTt0LlNvdXJjZS5jYWxsKHRoaXMsZSksdGhpcy5idWZmZXI9bmV3IHQuQnVmZmVyKGUudXJsLGUub25sb2FkKSx0aGlzLl9jbG9jaz1uZXcgdC5DbG9jayh0aGlzLl90aWNrLmJpbmQodGhpcyksZS5ncmFpblNpemUpLHRoaXMuX2xvb3BTdGFydD0wLHRoaXMuX2xvb3BFbmQ9MCx0aGlzLl9hY3RpdmVTb3VyY2VzPVtdLHRoaXMuX3BsYXliYWNrUmF0ZT1lLnBsYXliYWNrUmF0ZSx0aGlzLl9ncmFpblNpemU9ZS5ncmFpblNpemUsdGhpcy5fb3ZlcmxhcD1lLm92ZXJsYXAsdGhpcy5kZXR1bmU9ZS5kZXR1bmUsdGhpcy5vdmVybGFwPWUub3ZlcmxhcCx0aGlzLmxvb3A9ZS5sb29wLHRoaXMucGxheWJhY2tSYXRlPWUucGxheWJhY2tSYXRlLHRoaXMuZ3JhaW5TaXplPWUuZ3JhaW5TaXplLHRoaXMubG9vcFN0YXJ0PWUubG9vcFN0YXJ0LHRoaXMubG9vcEVuZD1lLmxvb3BFbmQsdGhpcy5yZXZlcnNlPWUucmV2ZXJzZSx0aGlzLl9jbG9jay5vbihcInN0b3BcIix0aGlzLl9vbnN0b3AuYmluZCh0aGlzKSl9LHQuZXh0ZW5kKHQuR3JhaW5QbGF5ZXIsdC5Tb3VyY2UpLHQuR3JhaW5QbGF5ZXIuZGVmYXVsdHM9e29ubG9hZDp0Lm5vT3Asb3ZlcmxhcDouMSxncmFpblNpemU6LjIscGxheWJhY2tSYXRlOjEsZGV0dW5lOjAsbG9vcDohMSxsb29wU3RhcnQ6MCxsb29wRW5kOjAscmV2ZXJzZTohMX0sdC5HcmFpblBsYXllci5wcm90b3R5cGUuX3N0YXJ0PWZ1bmN0aW9uKGUsaSxuKXtpPXQuZGVmYXVsdEFyZyhpLDApLGk9dGhpcy50b1NlY29uZHMoaSksZT10aGlzLnRvU2Vjb25kcyhlKSx0aGlzLl9vZmZzZXQ9aSx0aGlzLl9jbG9jay5zdGFydChlKSxuJiZ0aGlzLnN0b3AoZSt0aGlzLnRvU2Vjb25kcyhuKSl9LHQuR3JhaW5QbGF5ZXIucHJvdG90eXBlLl9zdG9wPWZ1bmN0aW9uKHQpe3RoaXMuX2Nsb2NrLnN0b3AodCl9LHQuR3JhaW5QbGF5ZXIucHJvdG90eXBlLl9vbnN0b3A9ZnVuY3Rpb24odCl7dGhpcy5fYWN0aXZlU291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZmFkZU91dD0wLGUuc3RvcCh0KX0pfSx0LkdyYWluUGxheWVyLnByb3RvdHlwZS5fdGljaz1mdW5jdGlvbihlKXtpZighdGhpcy5sb29wJiZ0aGlzLl9vZmZzZXQ+dGhpcy5idWZmZXIuZHVyYXRpb24pdGhpcy5zdG9wKGUpO2Vsc2V7dmFyIGk9dGhpcy5fb2Zmc2V0PHRoaXMuX292ZXJsYXA/MDp0aGlzLl9vdmVybGFwLG49bmV3IHQuQnVmZmVyU291cmNlKHtidWZmZXI6dGhpcy5idWZmZXIsZmFkZUluOmksZmFkZU91dDp0aGlzLl9vdmVybGFwLGxvb3A6dGhpcy5sb29wLGxvb3BTdGFydDp0aGlzLl9sb29wU3RhcnQsbG9vcEVuZDp0aGlzLl9sb29wRW5kLHBsYXliYWNrUmF0ZTp0LmludGVydmFsVG9GcmVxdWVuY3lSYXRpbyh0aGlzLmRldHVuZS8xMDApfSkuY29ubmVjdCh0aGlzLm91dHB1dCk7bi5zdGFydChlLHRoaXMuX29mZnNldCksdGhpcy5fb2Zmc2V0Kz10aGlzLmdyYWluU2l6ZSxuLnN0b3AoZSt0aGlzLmdyYWluU2l6ZS90aGlzLnBsYXliYWNrUmF0ZSksdGhpcy5fYWN0aXZlU291cmNlcy5wdXNoKG4pLG4ub25lbmRlZD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2FjdGl2ZVNvdXJjZXMuaW5kZXhPZihuKTstMSE9PXQmJnRoaXMuX2FjdGl2ZVNvdXJjZXMuc3BsaWNlKHQsMSl9LmJpbmQodGhpcyl9fSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5HcmFpblBsYXllci5wcm90b3R5cGUsXCJwbGF5YmFja1JhdGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BsYXliYWNrUmF0ZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3BsYXliYWNrUmF0ZT10LHRoaXMuZ3JhaW5TaXplPXRoaXMuX2dyYWluU2l6ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5HcmFpblBsYXllci5wcm90b3R5cGUsXCJsb29wU3RhcnRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xvb3BTdGFydH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2xvb3BTdGFydD10aGlzLnRvU2Vjb25kcyh0KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5HcmFpblBsYXllci5wcm90b3R5cGUsXCJsb29wRW5kXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb29wRW5kfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbG9vcEVuZD10aGlzLnRvU2Vjb25kcyh0KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5HcmFpblBsYXllci5wcm90b3R5cGUsXCJyZXZlcnNlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1ZmZlci5yZXZlcnNlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5idWZmZXIucmV2ZXJzZT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkdyYWluUGxheWVyLnByb3RvdHlwZSxcImdyYWluU2l6ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ3JhaW5TaXplfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fZ3JhaW5TaXplPXRoaXMudG9TZWNvbmRzKHQpLHRoaXMuX2Nsb2NrLmZyZXF1ZW5jeS52YWx1ZT10aGlzLl9wbGF5YmFja1JhdGUvdGhpcy5fZ3JhaW5TaXplfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkdyYWluUGxheWVyLnByb3RvdHlwZSxcIm92ZXJsYXBcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX292ZXJsYXB9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9vdmVybGFwPXRoaXMudG9TZWNvbmRzKHQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkdyYWluUGxheWVyLnByb3RvdHlwZSxcImxvYWRlZFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idWZmZXIubG9hZGVkfX0pLHQuR3JhaW5QbGF5ZXIucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5Tb3VyY2UucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLmJ1ZmZlci5kaXNwb3NlKCksdGhpcy5idWZmZXI9bnVsbCx0aGlzLl9jbG9jay5kaXNwb3NlKCksdGhpcy5fY2xvY2s9bnVsbCx0aGlzLl9hY3RpdmVTb3VyY2VzLmZvckVhY2goZnVuY3Rpb24odCl7dC5kaXNwb3NlKCl9KSx0aGlzLl9hY3RpdmVTb3VyY2VzPW51bGwsdGhpc30sdC5HcmFpblBsYXllcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxNiksaSgxKSxpKDQ1KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuVHJhbnNwb3J0VGltZWxpbmVTaWduYWw9ZnVuY3Rpb24oKXt0LlNpZ25hbC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5vdXRwdXQ9dGhpcy5fb3V0cHV0U2lnPW5ldyB0LlNpZ25hbCh0aGlzLl9pbml0aWFsVmFsdWUpLHRoaXMuX2xhc3RWYWw9dGhpcy52YWx1ZSx0aGlzLl9zeW5jZWQ9dC5UcmFuc3BvcnQuc2NoZWR1bGVSZXBlYXQodGhpcy5fb25UaWNrLmJpbmQodGhpcyksXCIxaVwiKSx0aGlzLl9iaW5kQW5jaG9yVmFsdWU9dGhpcy5fYW5jaG9yVmFsdWUuYmluZCh0aGlzKSx0LlRyYW5zcG9ydC5vbihcInN0YXJ0IHN0b3AgcGF1c2VcIix0aGlzLl9iaW5kQW5jaG9yVmFsdWUpLHRoaXMuX2V2ZW50cy5tZW1vcnk9MS8wfSx0LmV4dGVuZCh0LlRyYW5zcG9ydFRpbWVsaW5lU2lnbmFsLHQuU2lnbmFsKSx0LlRyYW5zcG9ydFRpbWVsaW5lU2lnbmFsLnByb3RvdHlwZS5fb25UaWNrPWZ1bmN0aW9uKGUpe3ZhciBpPXRoaXMuZ2V0VmFsdWVBdFRpbWUodC5UcmFuc3BvcnQuc2Vjb25kcyk7dGhpcy5fbGFzdFZhbCE9PWkmJih0aGlzLl9sYXN0VmFsPWksdGhpcy5fb3V0cHV0U2lnLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGksZSkpfSx0LlRyYW5zcG9ydFRpbWVsaW5lU2lnbmFsLnByb3RvdHlwZS5fYW5jaG9yVmFsdWU9ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5nZXRWYWx1ZUF0VGltZSh0LlRyYW5zcG9ydC5zZWNvbmRzKTtyZXR1cm4gdGhpcy5fbGFzdFZhbD1pLHRoaXMuX291dHB1dFNpZy5jYW5jZWxTY2hlZHVsZWRWYWx1ZXMoZSksdGhpcy5fb3V0cHV0U2lnLnNldFZhbHVlQXRUaW1lKGksZSksdGhpc30sdC5UcmFuc3BvcnRUaW1lbGluZVNpZ25hbC5wcm90b3R5cGUuZ2V0VmFsdWVBdFRpbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dC5UcmFuc3BvcnRUaW1lKGUpLHQuU2lnbmFsLnByb3RvdHlwZS5nZXRWYWx1ZUF0VGltZS5jYWxsKHRoaXMsZSl9LHQuVHJhbnNwb3J0VGltZWxpbmVTaWduYWwucHJvdG90eXBlLnNldFZhbHVlQXRUaW1lPWZ1bmN0aW9uKGUsaSl7cmV0dXJuIGk9dC5UcmFuc3BvcnRUaW1lKGkpLHQuU2lnbmFsLnByb3RvdHlwZS5zZXRWYWx1ZUF0VGltZS5jYWxsKHRoaXMsZSxpKSx0aGlzfSx0LlRyYW5zcG9ydFRpbWVsaW5lU2lnbmFsLnByb3RvdHlwZS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZT1mdW5jdGlvbihlLGkpe3JldHVybiBpPXQuVHJhbnNwb3J0VGltZShpKSx0LlNpZ25hbC5wcm90b3R5cGUubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUuY2FsbCh0aGlzLGUsaSksdGhpc30sdC5UcmFuc3BvcnRUaW1lbGluZVNpZ25hbC5wcm90b3R5cGUuZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZT1mdW5jdGlvbihlLGkpe3JldHVybiBpPXQuVHJhbnNwb3J0VGltZShpKSx0LlNpZ25hbC5wcm90b3R5cGUuZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZS5jYWxsKHRoaXMsZSxpKSx0aGlzfSx0LlRyYW5zcG9ydFRpbWVsaW5lU2lnbmFsLnByb3RvdHlwZS5zZXRUYXJnZXRBdFRpbWU9ZnVuY3Rpb24oZSxpLG4pe3JldHVybiBpPXQuVHJhbnNwb3J0VGltZShpKSx0LlNpZ25hbC5wcm90b3R5cGUuc2V0VGFyZ2V0QXRUaW1lLmNhbGwodGhpcyxlLGksbiksdGhpc30sdC5UcmFuc3BvcnRUaW1lbGluZVNpZ25hbC5wcm90b3R5cGUuY2FuY2VsU2NoZWR1bGVkVmFsdWVzPWZ1bmN0aW9uKGUpe3JldHVybiBlPXQuVHJhbnNwb3J0VGltZShlKSx0LlNpZ25hbC5wcm90b3R5cGUuY2FuY2VsU2NoZWR1bGVkVmFsdWVzLmNhbGwodGhpcyxlKSx0aGlzfSx0LlRyYW5zcG9ydFRpbWVsaW5lU2lnbmFsLnByb3RvdHlwZS5zZXRWYWx1ZUN1cnZlQXRUaW1lPWZ1bmN0aW9uKGUsaSxuLG8pe3JldHVybiBpPXQuVHJhbnNwb3J0VGltZShpKSxuPXQuVHJhbnNwb3J0VGltZShuKSx0LlNpZ25hbC5wcm90b3R5cGUuc2V0VmFsdWVDdXJ2ZUF0VGltZS5jYWxsKHRoaXMsZSxpLG4sbyksdGhpc30sdC5UcmFuc3BvcnRUaW1lbGluZVNpZ25hbC5wcm90b3R5cGUuY2FuY2VsQW5kSG9sZEF0VGltZT1mdW5jdGlvbihlKXtyZXR1cm4gdC5TaWduYWwucHJvdG90eXBlLmNhbmNlbEFuZEhvbGRBdFRpbWUuY2FsbCh0aGlzLHQuVHJhbnNwb3J0VGltZShlKSl9LHQuVHJhbnNwb3J0VGltZWxpbmVTaWduYWwucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0LlRyYW5zcG9ydC5jbGVhcih0aGlzLl9zeW5jZWQpLHQuVHJhbnNwb3J0Lm9mZihcInN0YXJ0IHN0b3AgcGF1c2VcIix0aGlzLl9zeW5jZWRDYWxsYmFjayksdGhpcy5fZXZlbnRzLmNhbmNlbCgwKSx0LlNpZ25hbC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX291dHB1dFNpZy5kaXNwb3NlKCksdGhpcy5fb3V0cHV0U2lnPW51bGx9LHQuVHJhbnNwb3J0VGltZWxpbmVTaWduYWx9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMjkpLGkoNSldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0Lk5vcm1hbGl6ZT1mdW5jdGlvbihlLGkpe3QuU2lnbmFsQmFzZS5jYWxsKHRoaXMpLHRoaXMuX2lucHV0TWluPXQuZGVmYXVsdEFyZyhlLDApLHRoaXMuX2lucHV0TWF4PXQuZGVmYXVsdEFyZyhpLDEpLHRoaXMuX3N1Yj10aGlzLmlucHV0PW5ldyB0LkFkZCgwKSx0aGlzLl9kaXY9dGhpcy5vdXRwdXQ9bmV3IHQuTXVsdGlwbHkoMSksdGhpcy5fc3ViLmNvbm5lY3QodGhpcy5fZGl2KSx0aGlzLl9zZXRSYW5nZSgpfSx0LmV4dGVuZCh0Lk5vcm1hbGl6ZSx0LlNpZ25hbEJhc2UpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk5vcm1hbGl6ZS5wcm90b3R5cGUsXCJtaW5cIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lucHV0TWlufSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5faW5wdXRNaW49dCx0aGlzLl9zZXRSYW5nZSgpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk5vcm1hbGl6ZS5wcm90b3R5cGUsXCJtYXhcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lucHV0TWF4fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5faW5wdXRNYXg9dCx0aGlzLl9zZXRSYW5nZSgpfX0pLHQuTm9ybWFsaXplLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24oKXt0aGlzLl9zdWIudmFsdWU9LXRoaXMuX2lucHV0TWluLHRoaXMuX2Rpdi52YWx1ZT0xLyh0aGlzLl9pbnB1dE1heC10aGlzLl9pbnB1dE1pbil9LHQuTm9ybWFsaXplLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU2lnbmFsQmFzZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3N1Yi5kaXNwb3NlKCksdGhpcy5fc3ViPW51bGwsdGhpcy5fZGl2LmRpc3Bvc2UoKSx0aGlzLl9kaXY9bnVsbCx0aGlzfSx0Lk5vcm1hbGl6ZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg3KSxpKDEpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5HYWluVG9BdWRpbz1mdW5jdGlvbigpe3QuU2lnbmFsQmFzZS5jYWxsKHRoaXMpLHRoaXMuX25vcm09dGhpcy5pbnB1dD10aGlzLm91dHB1dD1uZXcgdC5XYXZlU2hhcGVyKGZ1bmN0aW9uKHQpe3JldHVybiAyKk1hdGguYWJzKHQpLTF9KX0sdC5leHRlbmQodC5HYWluVG9BdWRpbyx0LlNpZ25hbEJhc2UpLHQuR2FpblRvQXVkaW8ucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5TaWduYWxCYXNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fbm9ybS5kaXNwb3NlKCksdGhpcy5fbm9ybT1udWxsLHRoaXN9LHQuR2FpblRvQXVkaW99LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXt0LnN1cHBvcnRlZCYmKE9zY2lsbGF0b3JOb2RlLnByb3RvdHlwZS5zZXRQZXJpb2RpY1dhdmV8fChPc2NpbGxhdG9yTm9kZS5wcm90b3R5cGUuc2V0UGVyaW9kaWNXYXZlPU9zY2lsbGF0b3JOb2RlLnByb3RvdHlwZS5zZXRXYXZlVGFibGUpLEF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlUGVyaW9kaWNXYXZlfHwoQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVQZXJpb2RpY1dhdmU9QXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVXYXZlVGFibGUpKX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgyMSksaSg3OSksaSgzMSldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe3JldHVybiB0LlNhbXBsZXI9ZnVuY3Rpb24oZSl7dmFyIGk9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtpLnNoaWZ0KCk7dmFyIG49dC5kZWZhdWx0cyhpLFtcIm9ubG9hZFwiLFwiYmFzZVVybFwiXSx0LlNhbXBsZXIpO3QuSW5zdHJ1bWVudC5jYWxsKHRoaXMsbik7dmFyIG89e307Zm9yKHZhciBzIGluIGUpaWYodC5pc05vdGUocykpe29bdC5GcmVxdWVuY3kocykudG9NaWRpKCldPWVbc119ZWxzZXtpZihpc05hTihwYXJzZUZsb2F0KHMpKSl0aHJvdyBuZXcgRXJyb3IoXCJUb25lLlNhbXBsZXI6IHVybCBrZXlzIG11c3QgYmUgdGhlIG5vdGUncyBwaXRjaFwiKTtvW3NdPWVbc119dGhpcy5fYnVmZmVycz1uZXcgdC5CdWZmZXJzKG8sbi5vbmxvYWQsbi5iYXNlVXJsKSx0aGlzLl9hY3RpdmVTb3VyY2VzPXt9LHRoaXMuYXR0YWNrPW4uYXR0YWNrLHRoaXMucmVsZWFzZT1uLnJlbGVhc2UsdGhpcy5jdXJ2ZT1uLmN1cnZlfSx0LmV4dGVuZCh0LlNhbXBsZXIsdC5JbnN0cnVtZW50KSx0LlNhbXBsZXIuZGVmYXVsdHM9e2F0dGFjazowLHJlbGVhc2U6LjEsb25sb2FkOnQubm9PcCxiYXNlVXJsOlwiXCIsY3VydmU6XCJleHBvbmVudGlhbFwifSx0LlNhbXBsZXIucHJvdG90eXBlLl9maW5kQ2xvc2VzdD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPDk2Oyl7aWYodGhpcy5fYnVmZmVycy5oYXModCtlKSlyZXR1cm4tZTtpZih0aGlzLl9idWZmZXJzLmhhcyh0LWUpKXJldHVybiBlO2UrK31yZXR1cm4gbnVsbH0sdC5TYW1wbGVyLnByb3RvdHlwZS50cmlnZ2VyQXR0YWNrPWZ1bmN0aW9uKGUsaSxuKXt0aGlzLmxvZyhcInRyaWdnZXJBdHRhY2tcIixlLGksbiksQXJyYXkuaXNBcnJheShlKXx8KGU9W2VdKTtmb3IodmFyIG89MDtvPGUubGVuZ3RoO28rKyl7dmFyIHM9dC5GcmVxdWVuY3koZVtvXSkudG9NaWRpKCkscj10aGlzLl9maW5kQ2xvc2VzdChzKTtpZihudWxsIT09cil7dmFyIGE9cy1yLGw9dGhpcy5fYnVmZmVycy5nZXQoYSksaD10LmludGVydmFsVG9GcmVxdWVuY3lSYXRpbyhyKSx1PW5ldyB0LkJ1ZmZlclNvdXJjZSh7YnVmZmVyOmwscGxheWJhY2tSYXRlOmgsZmFkZUluOnRoaXMuYXR0YWNrLGZhZGVPdXQ6dGhpcy5yZWxlYXNlLGN1cnZlOnRoaXMuY3VydmV9KS5jb25uZWN0KHRoaXMub3V0cHV0KTt1LnN0YXJ0KGksMCxsLmR1cmF0aW9uL2gsbiksdC5pc0FycmF5KHRoaXMuX2FjdGl2ZVNvdXJjZXNbc10pfHwodGhpcy5fYWN0aXZlU291cmNlc1tzXT1bXSksdGhpcy5fYWN0aXZlU291cmNlc1tzXS5wdXNoKHUpLHUub25lbmRlZD1mdW5jdGlvbigpe2lmKHRoaXMuX2FjdGl2ZVNvdXJjZXMmJnRoaXMuX2FjdGl2ZVNvdXJjZXNbc10pe3ZhciB0PXRoaXMuX2FjdGl2ZVNvdXJjZXNbc10uaW5kZXhPZih1KTstMSE9PXQmJnRoaXMuX2FjdGl2ZVNvdXJjZXNbc10uc3BsaWNlKHQsMSl9fS5iaW5kKHRoaXMpfX1yZXR1cm4gdGhpc30sdC5TYW1wbGVyLnByb3RvdHlwZS50cmlnZ2VyUmVsZWFzZT1mdW5jdGlvbihlLGkpe3RoaXMubG9nKFwidHJpZ2dlclJlbGVhc2VcIixlLGkpLEFycmF5LmlzQXJyYXkoZSl8fChlPVtlXSk7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBvPXQuRnJlcXVlbmN5KGVbbl0pLnRvTWlkaSgpO2lmKHRoaXMuX2FjdGl2ZVNvdXJjZXNbb10mJnRoaXMuX2FjdGl2ZVNvdXJjZXNbb10ubGVuZ3RoKXt2YXIgcz10aGlzLl9hY3RpdmVTb3VyY2VzW29dLnNoaWZ0KCk7aT10aGlzLnRvU2Vjb25kcyhpKSxzLnN0b3AoaSl9fXJldHVybiB0aGlzfSx0LlNhbXBsZXIucHJvdG90eXBlLnJlbGVhc2VBbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHQ9dGhpcy50b1NlY29uZHModCksdGhpcy5fYWN0aXZlU291cmNlcylmb3IodmFyIGk9dGhpcy5fYWN0aXZlU291cmNlc1tlXTtpLmxlbmd0aDspe2kuc2hpZnQoKS5zdG9wKHQpfXJldHVybiB0aGlzfSx0LlNhbXBsZXIucHJvdG90eXBlLnN5bmM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3luY01ldGhvZChcInRyaWdnZXJBdHRhY2tcIiwxKSx0aGlzLl9zeW5jTWV0aG9kKFwidHJpZ2dlclJlbGVhc2VcIiwxKSx0aGlzfSx0LlNhbXBsZXIucHJvdG90eXBlLnRyaWdnZXJBdHRhY2tSZWxlYXNlPWZ1bmN0aW9uKGUsaSxuLG8pe2lmKG49dGhpcy50b1NlY29uZHMobiksdGhpcy50cmlnZ2VyQXR0YWNrKGUsbixvKSx0LmlzQXJyYXkoaSkmJnQuaXNBcnJheShlKSlmb3IodmFyIHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIHI9aVtNYXRoLm1pbihzLGkubGVuZ3RoLTEpXTt0aGlzLnRyaWdnZXJSZWxlYXNlKGVbc10sbit0aGlzLnRvU2Vjb25kcyhyKSl9ZWxzZSB0aGlzLnRyaWdnZXJSZWxlYXNlKGUsbit0aGlzLnRvU2Vjb25kcyhpKSk7cmV0dXJuIHRoaXN9LHQuU2FtcGxlci5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUsaSxuKXtpZih0LmlzTm90ZShlKSl7dmFyIG89dC5GcmVxdWVuY3koZSkudG9NaWRpKCk7dGhpcy5fYnVmZmVycy5hZGQobyxpLG4pfWVsc2V7aWYoaXNOYU4ocGFyc2VGbG9hdChlKSkpdGhyb3cgbmV3IEVycm9yKFwiVG9uZS5TYW1wbGVyOiBub3RlIG11c3QgYmUgdGhlIG5vdGUncyBwaXRjaC4gSW5zdGVhZCBnb3QgXCIrZSk7dGhpcy5fYnVmZmVycy5hZGQoZSxpLG4pfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuU2FtcGxlci5wcm90b3R5cGUsXCJsb2FkZWRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2J1ZmZlcnMubG9hZGVkfX0pLHQuU2FtcGxlci5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe2Zvcih2YXIgZSBpbiB0Lkluc3RydW1lbnQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9idWZmZXJzLmRpc3Bvc2UoKSx0aGlzLl9idWZmZXJzPW51bGwsdGhpcy5fYWN0aXZlU291cmNlcyl0aGlzLl9hY3RpdmVTb3VyY2VzW2VdLmZvckVhY2goZnVuY3Rpb24odCl7dC5kaXNwb3NlKCl9KTtyZXR1cm4gdGhpcy5fYWN0aXZlU291cmNlcz1udWxsLHRoaXN9LHQuU2FtcGxlcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgzOCksaSg2KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuUG9seVN5bnRoPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wicG9seXBob255XCIsXCJ2b2ljZVwiXSx0LlBvbHlTeW50aCk7dC5JbnN0cnVtZW50LmNhbGwodGhpcyxlKSwoZT10LmRlZmF1bHRBcmcoZSx0Lkluc3RydW1lbnQuZGVmYXVsdHMpKS5wb2x5cGhvbnk9TWF0aC5taW4odC5Qb2x5U3ludGguTUFYX1BPTFlQSE9OWSxlLnBvbHlwaG9ueSksdGhpcy52b2ljZXM9bmV3IEFycmF5KGUucG9seXBob255KSx0aGlzLmFzc2VydChlLnBvbHlwaG9ueT4wLFwicG9seXBob255IG11c3QgYmUgZ3JlYXRlciB0aGFuIDBcIiksdGhpcy5kZXR1bmU9bmV3IHQuU2lnbmFsKGUuZGV0dW5lLHQuVHlwZS5DZW50cyksdGhpcy5fcmVhZE9ubHkoXCJkZXR1bmVcIik7Zm9yKHZhciBpPTA7aTxlLnBvbHlwaG9ueTtpKyspe3ZhciBuPW5ldyBlLnZvaWNlKGFyZ3VtZW50c1syXSxhcmd1bWVudHNbM10pO2lmKCEobiBpbnN0YW5jZW9mIHQuTW9ub3Bob25pYykpdGhyb3cgbmV3IEVycm9yKFwiU3ludGggY29uc3RydWN0b3IgbXVzdCBiZSBpbnN0YW5jZSBvZiBUb25lLk1vbm9waG9uaWNcIik7dGhpcy52b2ljZXNbaV09bixuLmluZGV4PWksbi5jb25uZWN0KHRoaXMub3V0cHV0KSxuLmhhc093blByb3BlcnR5KFwiZGV0dW5lXCIpJiZ0aGlzLmRldHVuZS5jb25uZWN0KG4uZGV0dW5lKX19LHQuZXh0ZW5kKHQuUG9seVN5bnRoLHQuSW5zdHJ1bWVudCksdC5Qb2x5U3ludGguZGVmYXVsdHM9e3BvbHlwaG9ueTo0LHZvbHVtZTowLGRldHVuZTowLHZvaWNlOnQuU3ludGh9LHQuUG9seVN5bnRoLnByb3RvdHlwZS5fZ2V0Q2xvc2VzdFZvaWNlPWZ1bmN0aW9uKGUsaSl7dmFyIG49dGhpcy52b2ljZXMuZmluZChmdW5jdGlvbihuKXtpZihNYXRoLmFicyhuLmZyZXF1ZW5jeS5nZXRWYWx1ZUF0VGltZShlKS10LkZyZXF1ZW5jeShpKSk8MWUtNCYmbi5nZXRMZXZlbEF0VGltZShlKT4xZS01KXJldHVybiBufSk7cmV0dXJuIG58fHRoaXMudm9pY2VzLnNsaWNlKCkuc29ydChmdW5jdGlvbih0LGkpe3ZhciBuPXQuZ2V0TGV2ZWxBdFRpbWUoZSt0aGlzLmJsb2NrVGltZSksbz1pLmdldExldmVsQXRUaW1lKGUrdGhpcy5ibG9ja1RpbWUpO3JldHVybiBuPDFlLTUmJihuPTApLG88MWUtNSYmKG89MCksbi1vfS5iaW5kKHRoaXMpKVswXX0sdC5Qb2x5U3ludGgucHJvdG90eXBlLnRyaWdnZXJBdHRhY2s9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBBcnJheS5pc0FycmF5KHQpfHwodD1bdF0pLGU9dGhpcy50b1NlY29uZHMoZSksdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2dldENsb3Nlc3RWb2ljZShlLHQpO24udHJpZ2dlckF0dGFjayh0LGUsaSksdGhpcy5sb2coXCJ0cmlnZ2VyQXR0YWNrXCIsbi5pbmRleCx0KX0uYmluZCh0aGlzKSksdGhpc30sdC5Qb2x5U3ludGgucHJvdG90eXBlLnRyaWdnZXJSZWxlYXNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl8fCh0PVt0XSksZT10aGlzLnRvU2Vjb25kcyhlKSx0LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fZ2V0Q2xvc2VzdFZvaWNlKGUsdCk7dGhpcy5sb2coXCJ0cmlnZ2VyUmVsZWFzZVwiLGkuaW5kZXgsdCksaS50cmlnZ2VyUmVsZWFzZShlKX0uYmluZCh0aGlzKSksdGhpc30sdC5Qb2x5U3ludGgucHJvdG90eXBlLnRyaWdnZXJBdHRhY2tSZWxlYXNlPWZ1bmN0aW9uKGUsaSxuLG8pe2lmKG49dGhpcy50b1NlY29uZHMobiksdGhpcy50cmlnZ2VyQXR0YWNrKGUsbixvKSx0LmlzQXJyYXkoaSkmJnQuaXNBcnJheShlKSlmb3IodmFyIHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIHI9aVtNYXRoLm1pbihzLGkubGVuZ3RoLTEpXTt0aGlzLnRyaWdnZXJSZWxlYXNlKGVbc10sbit0aGlzLnRvU2Vjb25kcyhyKSl9ZWxzZSB0aGlzLnRyaWdnZXJSZWxlYXNlKGUsbit0aGlzLnRvU2Vjb25kcyhpKSk7cmV0dXJuIHRoaXN9LHQuUG9seVN5bnRoLnByb3RvdHlwZS5zeW5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N5bmNNZXRob2QoXCJ0cmlnZ2VyQXR0YWNrXCIsMSksdGhpcy5fc3luY01ldGhvZChcInRyaWdnZXJSZWxlYXNlXCIsMSksdGhpc30sdC5Qb2x5U3ludGgucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBuPTA7bjx0aGlzLnZvaWNlcy5sZW5ndGg7bisrKXRoaXMudm9pY2VzW25dLnNldCh0LGUsaSk7cmV0dXJuIHRoaXN9LHQuUG9seVN5bnRoLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudm9pY2VzWzBdLmdldCh0KX0sdC5Qb2x5U3ludGgucHJvdG90eXBlLnJlbGVhc2VBbGw9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dGhpcy50b1NlY29uZHModCksdGhpcy52b2ljZXMuZm9yRWFjaChmdW5jdGlvbihlKXtlLnRyaWdnZXJSZWxlYXNlKHQpfSksdGhpc30sdC5Qb2x5U3ludGgucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5JbnN0cnVtZW50LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy52b2ljZXMuZm9yRWFjaChmdW5jdGlvbih0KXt0LmRpc3Bvc2UoKX0pLHRoaXMuX3dyaXRhYmxlKFwiZGV0dW5lXCIpLHRoaXMuZGV0dW5lLmRpc3Bvc2UoKSx0aGlzLmRldHVuZT1udWxsLHRoaXMudm9pY2VzPW51bGwsdGhpc30sdC5Qb2x5U3ludGguTUFYX1BPTFlQSE9OWT0yMCx0LlBvbHlTeW50aH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgyMSksaSgzOSksaSg1MyldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlBsdWNrU3ludGg9ZnVuY3Rpb24oZSl7ZT10LmRlZmF1bHRBcmcoZSx0LlBsdWNrU3ludGguZGVmYXVsdHMpLHQuSW5zdHJ1bWVudC5jYWxsKHRoaXMsZSksdGhpcy5fbm9pc2U9bmV3IHQuTm9pc2UoXCJwaW5rXCIpLHRoaXMuYXR0YWNrTm9pc2U9ZS5hdHRhY2tOb2lzZSx0aGlzLl9sZmNmPW5ldyB0Lkxvd3Bhc3NDb21iRmlsdGVyKHtyZXNvbmFuY2U6ZS5yZXNvbmFuY2UsZGFtcGVuaW5nOmUuZGFtcGVuaW5nfSksdGhpcy5yZXNvbmFuY2U9dGhpcy5fbGZjZi5yZXNvbmFuY2UsdGhpcy5kYW1wZW5pbmc9dGhpcy5fbGZjZi5kYW1wZW5pbmcsdGhpcy5fbm9pc2UuY29ubmVjdCh0aGlzLl9sZmNmKSx0aGlzLl9sZmNmLmNvbm5lY3QodGhpcy5vdXRwdXQpLHRoaXMuX3JlYWRPbmx5KFtcInJlc29uYW5jZVwiLFwiZGFtcGVuaW5nXCJdKX0sdC5leHRlbmQodC5QbHVja1N5bnRoLHQuSW5zdHJ1bWVudCksdC5QbHVja1N5bnRoLmRlZmF1bHRzPXthdHRhY2tOb2lzZToxLGRhbXBlbmluZzo0ZTMscmVzb25hbmNlOi43fSx0LlBsdWNrU3ludGgucHJvdG90eXBlLnRyaWdnZXJBdHRhY2s9ZnVuY3Rpb24odCxlKXt0PXRoaXMudG9GcmVxdWVuY3kodCksZT10aGlzLnRvU2Vjb25kcyhlKTt2YXIgaT0xL3Q7cmV0dXJuIHRoaXMuX2xmY2YuZGVsYXlUaW1lLnNldFZhbHVlQXRUaW1lKGksZSksdGhpcy5fbm9pc2Uuc3RhcnQoZSksdGhpcy5fbm9pc2Uuc3RvcChlK2kqdGhpcy5hdHRhY2tOb2lzZSksdGhpc30sdC5QbHVja1N5bnRoLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuSW5zdHJ1bWVudC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX25vaXNlLmRpc3Bvc2UoKSx0aGlzLl9sZmNmLmRpc3Bvc2UoKSx0aGlzLl9ub2lzZT1udWxsLHRoaXMuX2xmY2Y9bnVsbCx0aGlzLl93cml0YWJsZShbXCJyZXNvbmFuY2VcIixcImRhbXBlbmluZ1wiXSksdGhpcy5kYW1wZW5pbmc9bnVsbCx0aGlzLnJlc29uYW5jZT1udWxsLHRoaXN9LHQuUGx1Y2tTeW50aH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgzMCksaSg0MSksaSgzOSksaSgxKSxpKDkpLGkoMjEpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5Ob2lzZVN5bnRoPWZ1bmN0aW9uKGUpe2U9dC5kZWZhdWx0QXJnKGUsdC5Ob2lzZVN5bnRoLmRlZmF1bHRzKSx0Lkluc3RydW1lbnQuY2FsbCh0aGlzLGUpLHRoaXMubm9pc2U9bmV3IHQuTm9pc2UoZS5ub2lzZSksdGhpcy5lbnZlbG9wZT1uZXcgdC5BbXBsaXR1ZGVFbnZlbG9wZShlLmVudmVsb3BlKSx0aGlzLm5vaXNlLmNoYWluKHRoaXMuZW52ZWxvcGUsdGhpcy5vdXRwdXQpLHRoaXMuX3JlYWRPbmx5KFtcIm5vaXNlXCIsXCJlbnZlbG9wZVwiXSl9LHQuZXh0ZW5kKHQuTm9pc2VTeW50aCx0Lkluc3RydW1lbnQpLHQuTm9pc2VTeW50aC5kZWZhdWx0cz17bm9pc2U6e3R5cGU6XCJ3aGl0ZVwifSxlbnZlbG9wZTp7YXR0YWNrOi4wMDUsZGVjYXk6LjEsc3VzdGFpbjowfX0sdC5Ob2lzZVN5bnRoLnByb3RvdHlwZS50cmlnZ2VyQXR0YWNrPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9dGhpcy50b1NlY29uZHModCksdGhpcy5lbnZlbG9wZS50cmlnZ2VyQXR0YWNrKHQsZSksdGhpcy5ub2lzZS5zdGFydCh0KSwwPT09dGhpcy5lbnZlbG9wZS5zdXN0YWluJiZ0aGlzLm5vaXNlLnN0b3AodCt0aGlzLmVudmVsb3BlLmF0dGFjayt0aGlzLmVudmVsb3BlLmRlY2F5KSx0aGlzfSx0Lk5vaXNlU3ludGgucHJvdG90eXBlLnRyaWdnZXJSZWxlYXNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVudmVsb3BlLnRyaWdnZXJSZWxlYXNlKHQpLHRoaXMubm9pc2Uuc3RvcCh0K3RoaXMuZW52ZWxvcGUucmVsZWFzZSksdGhpc30sdC5Ob2lzZVN5bnRoLnByb3RvdHlwZS5zeW5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N5bmNNZXRob2QoXCJ0cmlnZ2VyQXR0YWNrXCIsMCksdGhpcy5fc3luY01ldGhvZChcInRyaWdnZXJSZWxlYXNlXCIsMCksdGhpc30sdC5Ob2lzZVN5bnRoLnByb3RvdHlwZS50cmlnZ2VyQXR0YWNrUmVsZWFzZT1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIGU9dGhpcy50b1NlY29uZHMoZSksdD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLnRyaWdnZXJBdHRhY2soZSxpKSx0aGlzLnRyaWdnZXJSZWxlYXNlKGUrdCksdGhpc30sdC5Ob2lzZVN5bnRoLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuSW5zdHJ1bWVudC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcIm5vaXNlXCIsXCJlbnZlbG9wZVwiXSksdGhpcy5ub2lzZS5kaXNwb3NlKCksdGhpcy5ub2lzZT1udWxsLHRoaXMuZW52ZWxvcGUuZGlzcG9zZSgpLHRoaXMuZW52ZWxvcGU9bnVsbCx0aGlzfSx0Lk5vaXNlU3ludGh9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMjEpLGkoNDgpLGkoOSksaSg0MSksaSgzMCksaSgzKSxpKDI2KSxpKDUpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXt2YXIgZT1bMSwxLjQ4MywxLjkzMiwyLjU0NiwyLjYzLDMuODk3XTtyZXR1cm4gdC5NZXRhbFN5bnRoPWZ1bmN0aW9uKGkpe2k9dC5kZWZhdWx0QXJnKGksdC5NZXRhbFN5bnRoLmRlZmF1bHRzKSx0Lkluc3RydW1lbnQuY2FsbCh0aGlzLGkpLHRoaXMuZnJlcXVlbmN5PW5ldyB0LlNpZ25hbChpLmZyZXF1ZW5jeSx0LlR5cGUuRnJlcXVlbmN5KSx0aGlzLl9vc2NpbGxhdG9ycz1bXSx0aGlzLl9mcmVxTXVsdGlwbGllcnM9W10sdGhpcy5fYW1wbGl0dWU9bmV3IHQuR2FpbigwKS5jb25uZWN0KHRoaXMub3V0cHV0KSx0aGlzLl9oaWdocGFzcz1uZXcgdC5GaWx0ZXIoe3R5cGU6XCJoaWdocGFzc1wiLFE6LTMuMDEwMjk5OTU2NjM5ODEyNX0pLmNvbm5lY3QodGhpcy5fYW1wbGl0dWUpLHRoaXMuX29jdGF2ZXM9aS5vY3RhdmVzLHRoaXMuX2ZpbHRlckZyZXFTY2FsZXI9bmV3IHQuU2NhbGUoaS5yZXNvbmFuY2UsN2UzKSx0aGlzLmVudmVsb3BlPW5ldyB0LkVudmVsb3BlKHthdHRhY2s6aS5lbnZlbG9wZS5hdHRhY2ssYXR0YWNrQ3VydmU6XCJsaW5lYXJcIixkZWNheTppLmVudmVsb3BlLmRlY2F5LHN1c3RhaW46MCxyZWxlYXNlOmkuZW52ZWxvcGUucmVsZWFzZX0pLmNoYWluKHRoaXMuX2ZpbHRlckZyZXFTY2FsZXIsdGhpcy5faGlnaHBhc3MuZnJlcXVlbmN5KSx0aGlzLmVudmVsb3BlLmNvbm5lY3QodGhpcy5fYW1wbGl0dWUuZ2Fpbik7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBvPW5ldyB0LkZNT3NjaWxsYXRvcih7dHlwZTpcInNxdWFyZVwiLG1vZHVsYXRpb25UeXBlOlwic3F1YXJlXCIsaGFybW9uaWNpdHk6aS5oYXJtb25pY2l0eSxtb2R1bGF0aW9uSW5kZXg6aS5tb2R1bGF0aW9uSW5kZXh9KTtvLmNvbm5lY3QodGhpcy5faGlnaHBhc3MpLHRoaXMuX29zY2lsbGF0b3JzW25dPW87dmFyIHM9bmV3IHQuTXVsdGlwbHkoZVtuXSk7dGhpcy5fZnJlcU11bHRpcGxpZXJzW25dPXMsdGhpcy5mcmVxdWVuY3kuY2hhaW4ocyxvLmZyZXF1ZW5jeSl9dGhpcy5vY3RhdmVzPWkub2N0YXZlc30sdC5leHRlbmQodC5NZXRhbFN5bnRoLHQuSW5zdHJ1bWVudCksdC5NZXRhbFN5bnRoLmRlZmF1bHRzPXtmcmVxdWVuY3k6MjAwLGVudmVsb3BlOnthdHRhY2s6LjAwMSxkZWNheToxLjQscmVsZWFzZTouMn0saGFybW9uaWNpdHk6NS4xLG1vZHVsYXRpb25JbmRleDozMixyZXNvbmFuY2U6NGUzLG9jdGF2ZXM6MS41fSx0Lk1ldGFsU3ludGgucHJvdG90eXBlLnRyaWdnZXJBdHRhY2s9ZnVuY3Rpb24oZSxpKXtyZXR1cm4gZT10aGlzLnRvU2Vjb25kcyhlKSxpPXQuZGVmYXVsdEFyZyhpLDEpLHRoaXMuZW52ZWxvcGUudHJpZ2dlckF0dGFjayhlLGkpLHRoaXMuX29zY2lsbGF0b3JzLmZvckVhY2goZnVuY3Rpb24odCl7dC5zdGFydChlKX0pLDA9PT10aGlzLmVudmVsb3BlLnN1c3RhaW4mJnRoaXMuX29zY2lsbGF0b3JzLmZvckVhY2goZnVuY3Rpb24odCl7dC5zdG9wKGUrdGhpcy5lbnZlbG9wZS5hdHRhY2srdGhpcy5lbnZlbG9wZS5kZWNheSl9LmJpbmQodGhpcykpLHRoaXN9LHQuTWV0YWxTeW50aC5wcm90b3R5cGUudHJpZ2dlclJlbGVhc2U9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dGhpcy50b1NlY29uZHModCksdGhpcy5lbnZlbG9wZS50cmlnZ2VyUmVsZWFzZSh0KSx0aGlzLl9vc2NpbGxhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uuc3RvcCh0K3RoaXMuZW52ZWxvcGUucmVsZWFzZSl9LmJpbmQodGhpcykpLHRoaXN9LHQuTWV0YWxTeW50aC5wcm90b3R5cGUuc3luYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zeW5jTWV0aG9kKFwidHJpZ2dlckF0dGFja1wiLDApLHRoaXMuX3N5bmNNZXRob2QoXCJ0cmlnZ2VyUmVsZWFzZVwiLDApLHRoaXN9LHQuTWV0YWxTeW50aC5wcm90b3R5cGUudHJpZ2dlckF0dGFja1JlbGVhc2U9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBlPXRoaXMudG9TZWNvbmRzKGUpLHQ9dGhpcy50b1NlY29uZHModCksdGhpcy50cmlnZ2VyQXR0YWNrKGUsaSksdGhpcy50cmlnZ2VyUmVsZWFzZShlK3QpLHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk1ldGFsU3ludGgucHJvdG90eXBlLFwibW9kdWxhdGlvbkluZGV4XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vc2NpbGxhdG9yc1swXS5tb2R1bGF0aW9uSW5kZXgudmFsdWV9LHNldDpmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX29zY2lsbGF0b3JzLmxlbmd0aDtlKyspdGhpcy5fb3NjaWxsYXRvcnNbZV0ubW9kdWxhdGlvbkluZGV4LnZhbHVlPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuTWV0YWxTeW50aC5wcm90b3R5cGUsXCJoYXJtb25pY2l0eVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3NjaWxsYXRvcnNbMF0uaGFybW9uaWNpdHkudmFsdWV9LHNldDpmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX29zY2lsbGF0b3JzLmxlbmd0aDtlKyspdGhpcy5fb3NjaWxsYXRvcnNbZV0uaGFybW9uaWNpdHkudmFsdWU9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5NZXRhbFN5bnRoLnByb3RvdHlwZSxcInJlc29uYW5jZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZmlsdGVyRnJlcVNjYWxlci5taW59LHNldDpmdW5jdGlvbih0KXt0aGlzLl9maWx0ZXJGcmVxU2NhbGVyLm1pbj10LHRoaXMub2N0YXZlcz10aGlzLl9vY3RhdmVzfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk1ldGFsU3ludGgucHJvdG90eXBlLFwib2N0YXZlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb2N0YXZlc30sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX29jdGF2ZXM9dCx0aGlzLl9maWx0ZXJGcmVxU2NhbGVyLm1heD10aGlzLl9maWx0ZXJGcmVxU2NhbGVyLm1pbipNYXRoLnBvdygyLHQpfX0pLHQuTWV0YWxTeW50aC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3QuSW5zdHJ1bWVudC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO2Zvcih2YXIgZT0wO2U8dGhpcy5fb3NjaWxsYXRvcnMubGVuZ3RoO2UrKyl0aGlzLl9vc2NpbGxhdG9yc1tlXS5kaXNwb3NlKCksdGhpcy5fZnJlcU11bHRpcGxpZXJzW2VdLmRpc3Bvc2UoKTt0aGlzLl9vc2NpbGxhdG9ycz1udWxsLHRoaXMuX2ZyZXFNdWx0aXBsaWVycz1udWxsLHRoaXMuZnJlcXVlbmN5LmRpc3Bvc2UoKSx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXMuX2ZpbHRlckZyZXFTY2FsZXIuZGlzcG9zZSgpLHRoaXMuX2ZpbHRlckZyZXFTY2FsZXI9bnVsbCx0aGlzLl9hbXBsaXR1ZS5kaXNwb3NlKCksdGhpcy5fYW1wbGl0dWU9bnVsbCx0aGlzLmVudmVsb3BlLmRpc3Bvc2UoKSx0aGlzLmVudmVsb3BlPW51bGwsdGhpcy5faGlnaHBhc3MuZGlzcG9zZSgpLHRoaXMuX2hpZ2hwYXNzPW51bGx9LHQuTWV0YWxTeW50aH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgzNyksaSgyMSksaSgzMCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0Lk1lbWJyYW5lU3ludGg9ZnVuY3Rpb24oZSl7ZT10LmRlZmF1bHRBcmcoZSx0Lk1lbWJyYW5lU3ludGguZGVmYXVsdHMpLHQuSW5zdHJ1bWVudC5jYWxsKHRoaXMsZSksdGhpcy5vc2NpbGxhdG9yPW5ldyB0Lk9tbmlPc2NpbGxhdG9yKGUub3NjaWxsYXRvciksdGhpcy5lbnZlbG9wZT1uZXcgdC5BbXBsaXR1ZGVFbnZlbG9wZShlLmVudmVsb3BlKSx0aGlzLm9jdGF2ZXM9ZS5vY3RhdmVzLHRoaXMucGl0Y2hEZWNheT1lLnBpdGNoRGVjYXksdGhpcy5vc2NpbGxhdG9yLmNoYWluKHRoaXMuZW52ZWxvcGUsdGhpcy5vdXRwdXQpLHRoaXMuX3JlYWRPbmx5KFtcIm9zY2lsbGF0b3JcIixcImVudmVsb3BlXCJdKX0sdC5leHRlbmQodC5NZW1icmFuZVN5bnRoLHQuSW5zdHJ1bWVudCksdC5NZW1icmFuZVN5bnRoLmRlZmF1bHRzPXtwaXRjaERlY2F5Oi4wNSxvY3RhdmVzOjEwLG9zY2lsbGF0b3I6e3R5cGU6XCJzaW5lXCJ9LGVudmVsb3BlOnthdHRhY2s6LjAwMSxkZWNheTouNCxzdXN0YWluOi4wMSxyZWxlYXNlOjEuNCxhdHRhY2tDdXJ2ZTpcImV4cG9uZW50aWFsXCJ9fSx0Lk1lbWJyYW5lU3ludGgucHJvdG90eXBlLnRyaWdnZXJBdHRhY2s9ZnVuY3Rpb24odCxlLGkpe2U9dGhpcy50b1NlY29uZHMoZSk7dmFyIG49KHQ9dGhpcy50b0ZyZXF1ZW5jeSh0KSkqdGhpcy5vY3RhdmVzO3JldHVybiB0aGlzLm9zY2lsbGF0b3IuZnJlcXVlbmN5LnNldFZhbHVlQXRUaW1lKG4sZSksdGhpcy5vc2NpbGxhdG9yLmZyZXF1ZW5jeS5leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lKHQsZSt0aGlzLnRvU2Vjb25kcyh0aGlzLnBpdGNoRGVjYXkpKSx0aGlzLmVudmVsb3BlLnRyaWdnZXJBdHRhY2soZSxpKSx0aGlzLm9zY2lsbGF0b3Iuc3RhcnQoZSksMD09PXRoaXMuZW52ZWxvcGUuc3VzdGFpbiYmdGhpcy5vc2NpbGxhdG9yLnN0b3AoZSt0aGlzLmVudmVsb3BlLmF0dGFjayt0aGlzLmVudmVsb3BlLmRlY2F5KSx0aGlzfSx0Lk1lbWJyYW5lU3ludGgucHJvdG90eXBlLnRyaWdnZXJSZWxlYXNlPWZ1bmN0aW9uKHQpe3JldHVybiB0PXRoaXMudG9TZWNvbmRzKHQpLHRoaXMuZW52ZWxvcGUudHJpZ2dlclJlbGVhc2UodCksdGhpcy5vc2NpbGxhdG9yLnN0b3AodCt0aGlzLmVudmVsb3BlLnJlbGVhc2UpLHRoaXN9LHQuTWVtYnJhbmVTeW50aC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0Lkluc3RydW1lbnQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl93cml0YWJsZShbXCJvc2NpbGxhdG9yXCIsXCJlbnZlbG9wZVwiXSksdGhpcy5vc2NpbGxhdG9yLmRpc3Bvc2UoKSx0aGlzLm9zY2lsbGF0b3I9bnVsbCx0aGlzLmVudmVsb3BlLmRpc3Bvc2UoKSx0aGlzLmVudmVsb3BlPW51bGwsdGhpc30sdC5NZW1icmFuZVN5bnRofS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDM4KSxpKDEpLGkoNSksaSgyNSldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkZNU3ludGg9ZnVuY3Rpb24oZSl7ZT10LmRlZmF1bHRBcmcoZSx0LkZNU3ludGguZGVmYXVsdHMpLHQuTW9ub3Bob25pYy5jYWxsKHRoaXMsZSksdGhpcy5fY2Fycmllcj1uZXcgdC5TeW50aChlLmNhcnJpZXIpLHRoaXMuX2NhcnJpZXIudm9sdW1lLnZhbHVlPS0xMCx0aGlzLm9zY2lsbGF0b3I9dGhpcy5fY2Fycmllci5vc2NpbGxhdG9yLHRoaXMuZW52ZWxvcGU9dGhpcy5fY2Fycmllci5lbnZlbG9wZS5zZXQoZS5lbnZlbG9wZSksdGhpcy5fbW9kdWxhdG9yPW5ldyB0LlN5bnRoKGUubW9kdWxhdG9yKSx0aGlzLl9tb2R1bGF0b3Iudm9sdW1lLnZhbHVlPS0xMCx0aGlzLm1vZHVsYXRpb249dGhpcy5fbW9kdWxhdG9yLm9zY2lsbGF0b3Iuc2V0KGUubW9kdWxhdGlvbiksdGhpcy5tb2R1bGF0aW9uRW52ZWxvcGU9dGhpcy5fbW9kdWxhdG9yLmVudmVsb3BlLnNldChlLm1vZHVsYXRpb25FbnZlbG9wZSksdGhpcy5mcmVxdWVuY3k9bmV3IHQuU2lnbmFsKDQ0MCx0LlR5cGUuRnJlcXVlbmN5KSx0aGlzLmRldHVuZT1uZXcgdC5TaWduYWwoZS5kZXR1bmUsdC5UeXBlLkNlbnRzKSx0aGlzLmhhcm1vbmljaXR5PW5ldyB0Lk11bHRpcGx5KGUuaGFybW9uaWNpdHkpLHRoaXMuaGFybW9uaWNpdHkudW5pdHM9dC5UeXBlLlBvc2l0aXZlLHRoaXMubW9kdWxhdGlvbkluZGV4PW5ldyB0Lk11bHRpcGx5KGUubW9kdWxhdGlvbkluZGV4KSx0aGlzLm1vZHVsYXRpb25JbmRleC51bml0cz10LlR5cGUuUG9zaXRpdmUsdGhpcy5fbW9kdWxhdGlvbk5vZGU9bmV3IHQuR2FpbigwKSx0aGlzLmZyZXF1ZW5jeS5jb25uZWN0KHRoaXMuX2NhcnJpZXIuZnJlcXVlbmN5KSx0aGlzLmZyZXF1ZW5jeS5jaGFpbih0aGlzLmhhcm1vbmljaXR5LHRoaXMuX21vZHVsYXRvci5mcmVxdWVuY3kpLHRoaXMuZnJlcXVlbmN5LmNoYWluKHRoaXMubW9kdWxhdGlvbkluZGV4LHRoaXMuX21vZHVsYXRpb25Ob2RlKSx0aGlzLmRldHVuZS5mYW4odGhpcy5fY2Fycmllci5kZXR1bmUsdGhpcy5fbW9kdWxhdG9yLmRldHVuZSksdGhpcy5fbW9kdWxhdG9yLmNvbm5lY3QodGhpcy5fbW9kdWxhdGlvbk5vZGUuZ2FpbiksdGhpcy5fbW9kdWxhdGlvbk5vZGUuY29ubmVjdCh0aGlzLl9jYXJyaWVyLmZyZXF1ZW5jeSksdGhpcy5fY2Fycmllci5jb25uZWN0KHRoaXMub3V0cHV0KSx0aGlzLl9yZWFkT25seShbXCJmcmVxdWVuY3lcIixcImhhcm1vbmljaXR5XCIsXCJtb2R1bGF0aW9uSW5kZXhcIixcIm9zY2lsbGF0b3JcIixcImVudmVsb3BlXCIsXCJtb2R1bGF0aW9uXCIsXCJtb2R1bGF0aW9uRW52ZWxvcGVcIixcImRldHVuZVwiXSl9LHQuZXh0ZW5kKHQuRk1TeW50aCx0Lk1vbm9waG9uaWMpLHQuRk1TeW50aC5kZWZhdWx0cz17aGFybW9uaWNpdHk6Myxtb2R1bGF0aW9uSW5kZXg6MTAsZGV0dW5lOjAsb3NjaWxsYXRvcjp7dHlwZTpcInNpbmVcIn0sZW52ZWxvcGU6e2F0dGFjazouMDEsZGVjYXk6LjAxLHN1c3RhaW46MSxyZWxlYXNlOi41fSxtb2R1bGF0aW9uOnt0eXBlOlwic3F1YXJlXCJ9LG1vZHVsYXRpb25FbnZlbG9wZTp7YXR0YWNrOi41LGRlY2F5OjAsc3VzdGFpbjoxLHJlbGVhc2U6LjV9fSx0LkZNU3ludGgucHJvdG90eXBlLl90cmlnZ2VyRW52ZWxvcGVBdHRhY2s9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl9jYXJyaWVyLl90cmlnZ2VyRW52ZWxvcGVBdHRhY2sodCxlKSx0aGlzLl9tb2R1bGF0b3IuX3RyaWdnZXJFbnZlbG9wZUF0dGFjayh0KSx0aGlzfSx0LkZNU3ludGgucHJvdG90eXBlLl90cmlnZ2VyRW52ZWxvcGVSZWxlYXNlPWZ1bmN0aW9uKHQpe3JldHVybiB0PXRoaXMudG9TZWNvbmRzKHQpLHRoaXMuX2NhcnJpZXIuX3RyaWdnZXJFbnZlbG9wZVJlbGVhc2UodCksdGhpcy5fbW9kdWxhdG9yLl90cmlnZ2VyRW52ZWxvcGVSZWxlYXNlKHQpLHRoaXN9LHQuRk1TeW50aC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0Lk1vbm9waG9uaWMucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl93cml0YWJsZShbXCJmcmVxdWVuY3lcIixcImhhcm1vbmljaXR5XCIsXCJtb2R1bGF0aW9uSW5kZXhcIixcIm9zY2lsbGF0b3JcIixcImVudmVsb3BlXCIsXCJtb2R1bGF0aW9uXCIsXCJtb2R1bGF0aW9uRW52ZWxvcGVcIixcImRldHVuZVwiXSksdGhpcy5fY2Fycmllci5kaXNwb3NlKCksdGhpcy5fY2Fycmllcj1udWxsLHRoaXMuX21vZHVsYXRvci5kaXNwb3NlKCksdGhpcy5fbW9kdWxhdG9yPW51bGwsdGhpcy5mcmVxdWVuY3kuZGlzcG9zZSgpLHRoaXMuZnJlcXVlbmN5PW51bGwsdGhpcy5kZXR1bmUuZGlzcG9zZSgpLHRoaXMuZGV0dW5lPW51bGwsdGhpcy5tb2R1bGF0aW9uSW5kZXguZGlzcG9zZSgpLHRoaXMubW9kdWxhdGlvbkluZGV4PW51bGwsdGhpcy5oYXJtb25pY2l0eS5kaXNwb3NlKCksdGhpcy5oYXJtb25pY2l0eT1udWxsLHRoaXMuX21vZHVsYXRpb25Ob2RlLmRpc3Bvc2UoKSx0aGlzLl9tb2R1bGF0aW9uTm9kZT1udWxsLHRoaXMub3NjaWxsYXRvcj1udWxsLHRoaXMuZW52ZWxvcGU9bnVsbCx0aGlzLm1vZHVsYXRpb25FbnZlbG9wZT1udWxsLHRoaXMubW9kdWxhdGlvbj1udWxsLHRoaXN9LHQuRk1TeW50aH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg2OCksaSgxMiksaSgxKSxpKDUpLGkoMjUpLGkoMTQpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5EdW9TeW50aD1mdW5jdGlvbihlKXtlPXQuZGVmYXVsdEFyZyhlLHQuRHVvU3ludGguZGVmYXVsdHMpLHQuTW9ub3Bob25pYy5jYWxsKHRoaXMsZSksdGhpcy52b2ljZTA9bmV3IHQuTW9ub1N5bnRoKGUudm9pY2UwKSx0aGlzLnZvaWNlMC52b2x1bWUudmFsdWU9LTEwLHRoaXMudm9pY2UxPW5ldyB0Lk1vbm9TeW50aChlLnZvaWNlMSksdGhpcy52b2ljZTEudm9sdW1lLnZhbHVlPS0xMCx0aGlzLl92aWJyYXRvPW5ldyB0LkxGTyhlLnZpYnJhdG9SYXRlLC01MCw1MCksdGhpcy5fdmlicmF0by5zdGFydCgpLHRoaXMudmlicmF0b1JhdGU9dGhpcy5fdmlicmF0by5mcmVxdWVuY3ksdGhpcy5fdmlicmF0b0dhaW49bmV3IHQuR2FpbihlLnZpYnJhdG9BbW91bnQsdC5UeXBlLlBvc2l0aXZlKSx0aGlzLnZpYnJhdG9BbW91bnQ9dGhpcy5fdmlicmF0b0dhaW4uZ2Fpbix0aGlzLmZyZXF1ZW5jeT1uZXcgdC5TaWduYWwoNDQwLHQuVHlwZS5GcmVxdWVuY3kpLHRoaXMuaGFybW9uaWNpdHk9bmV3IHQuTXVsdGlwbHkoZS5oYXJtb25pY2l0eSksdGhpcy5oYXJtb25pY2l0eS51bml0cz10LlR5cGUuUG9zaXRpdmUsdGhpcy5mcmVxdWVuY3kuY29ubmVjdCh0aGlzLnZvaWNlMC5mcmVxdWVuY3kpLHRoaXMuZnJlcXVlbmN5LmNoYWluKHRoaXMuaGFybW9uaWNpdHksdGhpcy52b2ljZTEuZnJlcXVlbmN5KSx0aGlzLl92aWJyYXRvLmNvbm5lY3QodGhpcy5fdmlicmF0b0dhaW4pLHRoaXMuX3ZpYnJhdG9HYWluLmZhbih0aGlzLnZvaWNlMC5kZXR1bmUsdGhpcy52b2ljZTEuZGV0dW5lKSx0aGlzLnZvaWNlMC5jb25uZWN0KHRoaXMub3V0cHV0KSx0aGlzLnZvaWNlMS5jb25uZWN0KHRoaXMub3V0cHV0KSx0aGlzLl9yZWFkT25seShbXCJ2b2ljZTBcIixcInZvaWNlMVwiLFwiZnJlcXVlbmN5XCIsXCJ2aWJyYXRvQW1vdW50XCIsXCJ2aWJyYXRvUmF0ZVwiXSl9LHQuZXh0ZW5kKHQuRHVvU3ludGgsdC5Nb25vcGhvbmljKSx0LkR1b1N5bnRoLmRlZmF1bHRzPXt2aWJyYXRvQW1vdW50Oi41LHZpYnJhdG9SYXRlOjUsaGFybW9uaWNpdHk6MS41LHZvaWNlMDp7dm9sdW1lOi0xMCxwb3J0YW1lbnRvOjAsb3NjaWxsYXRvcjp7dHlwZTpcInNpbmVcIn0sZmlsdGVyRW52ZWxvcGU6e2F0dGFjazouMDEsZGVjYXk6MCxzdXN0YWluOjEscmVsZWFzZTouNX0sZW52ZWxvcGU6e2F0dGFjazouMDEsZGVjYXk6MCxzdXN0YWluOjEscmVsZWFzZTouNX19LHZvaWNlMTp7dm9sdW1lOi0xMCxwb3J0YW1lbnRvOjAsb3NjaWxsYXRvcjp7dHlwZTpcInNpbmVcIn0sZmlsdGVyRW52ZWxvcGU6e2F0dGFjazouMDEsZGVjYXk6MCxzdXN0YWluOjEscmVsZWFzZTouNX0sZW52ZWxvcGU6e2F0dGFjazouMDEsZGVjYXk6MCxzdXN0YWluOjEscmVsZWFzZTouNX19fSx0LkR1b1N5bnRoLnByb3RvdHlwZS5fdHJpZ2dlckVudmVsb3BlQXR0YWNrPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9dGhpcy50b1NlY29uZHModCksdGhpcy52b2ljZTAuX3RyaWdnZXJFbnZlbG9wZUF0dGFjayh0LGUpLHRoaXMudm9pY2UxLl90cmlnZ2VyRW52ZWxvcGVBdHRhY2sodCxlKSx0aGlzfSx0LkR1b1N5bnRoLnByb3RvdHlwZS5fdHJpZ2dlckVudmVsb3BlUmVsZWFzZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy52b2ljZTAuX3RyaWdnZXJFbnZlbG9wZVJlbGVhc2UodCksdGhpcy52b2ljZTEuX3RyaWdnZXJFbnZlbG9wZVJlbGVhc2UodCksdGhpc30sdC5EdW9TeW50aC5wcm90b3R5cGUuZ2V0TGV2ZWxBdFRpbWU9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMudm9pY2UwLmdldExldmVsQXRUaW1lKHQpK3RoaXMudm9pY2UxLmdldExldmVsQXRUaW1lKHQpKS8yfSx0LkR1b1N5bnRoLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuTW9ub3Bob25pYy5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcInZvaWNlMFwiLFwidm9pY2UxXCIsXCJmcmVxdWVuY3lcIixcInZpYnJhdG9BbW91bnRcIixcInZpYnJhdG9SYXRlXCJdKSx0aGlzLnZvaWNlMC5kaXNwb3NlKCksdGhpcy52b2ljZTA9bnVsbCx0aGlzLnZvaWNlMS5kaXNwb3NlKCksdGhpcy52b2ljZTE9bnVsbCx0aGlzLmZyZXF1ZW5jeS5kaXNwb3NlKCksdGhpcy5mcmVxdWVuY3k9bnVsbCx0aGlzLl92aWJyYXRvR2Fpbi5kaXNwb3NlKCksdGhpcy5fdmlicmF0b0dhaW49bnVsbCx0aGlzLl92aWJyYXRvPW51bGwsdGhpcy5oYXJtb25pY2l0eS5kaXNwb3NlKCksdGhpcy5oYXJtb25pY2l0eT1udWxsLHRoaXMudmlicmF0b0Ftb3VudC5kaXNwb3NlKCksdGhpcy52aWJyYXRvQW1vdW50PW51bGwsdGhpcy52aWJyYXRvUmF0ZT1udWxsLHRoaXN9LHQuRHVvU3ludGh9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMzgpLGkoMSksaSg1KSxpKDI1KSxpKDIyKSxpKDMpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5BTVN5bnRoPWZ1bmN0aW9uKGUpe2U9dC5kZWZhdWx0QXJnKGUsdC5BTVN5bnRoLmRlZmF1bHRzKSx0Lk1vbm9waG9uaWMuY2FsbCh0aGlzLGUpLHRoaXMuX2NhcnJpZXI9bmV3IHQuU3ludGgsdGhpcy5fY2Fycmllci52b2x1bWUudmFsdWU9LTEwLHRoaXMub3NjaWxsYXRvcj10aGlzLl9jYXJyaWVyLm9zY2lsbGF0b3Iuc2V0KGUub3NjaWxsYXRvciksdGhpcy5lbnZlbG9wZT10aGlzLl9jYXJyaWVyLmVudmVsb3BlLnNldChlLmVudmVsb3BlKSx0aGlzLl9tb2R1bGF0b3I9bmV3IHQuU3ludGgsdGhpcy5fbW9kdWxhdG9yLnZvbHVtZS52YWx1ZT0tMTAsdGhpcy5tb2R1bGF0aW9uPXRoaXMuX21vZHVsYXRvci5vc2NpbGxhdG9yLnNldChlLm1vZHVsYXRpb24pLHRoaXMubW9kdWxhdGlvbkVudmVsb3BlPXRoaXMuX21vZHVsYXRvci5lbnZlbG9wZS5zZXQoZS5tb2R1bGF0aW9uRW52ZWxvcGUpLHRoaXMuZnJlcXVlbmN5PW5ldyB0LlNpZ25hbCg0NDAsdC5UeXBlLkZyZXF1ZW5jeSksdGhpcy5kZXR1bmU9bmV3IHQuU2lnbmFsKGUuZGV0dW5lLHQuVHlwZS5DZW50cyksdGhpcy5oYXJtb25pY2l0eT1uZXcgdC5NdWx0aXBseShlLmhhcm1vbmljaXR5KSx0aGlzLmhhcm1vbmljaXR5LnVuaXRzPXQuVHlwZS5Qb3NpdGl2ZSx0aGlzLl9tb2R1bGF0aW9uU2NhbGU9bmV3IHQuQXVkaW9Ub0dhaW4sdGhpcy5fbW9kdWxhdGlvbk5vZGU9bmV3IHQuR2Fpbix0aGlzLmZyZXF1ZW5jeS5jb25uZWN0KHRoaXMuX2NhcnJpZXIuZnJlcXVlbmN5KSx0aGlzLmZyZXF1ZW5jeS5jaGFpbih0aGlzLmhhcm1vbmljaXR5LHRoaXMuX21vZHVsYXRvci5mcmVxdWVuY3kpLHRoaXMuZGV0dW5lLmZhbih0aGlzLl9jYXJyaWVyLmRldHVuZSx0aGlzLl9tb2R1bGF0b3IuZGV0dW5lKSx0aGlzLl9tb2R1bGF0b3IuY2hhaW4odGhpcy5fbW9kdWxhdGlvblNjYWxlLHRoaXMuX21vZHVsYXRpb25Ob2RlLmdhaW4pLHRoaXMuX2NhcnJpZXIuY2hhaW4odGhpcy5fbW9kdWxhdGlvbk5vZGUsdGhpcy5vdXRwdXQpLHRoaXMuX3JlYWRPbmx5KFtcImZyZXF1ZW5jeVwiLFwiaGFybW9uaWNpdHlcIixcIm9zY2lsbGF0b3JcIixcImVudmVsb3BlXCIsXCJtb2R1bGF0aW9uXCIsXCJtb2R1bGF0aW9uRW52ZWxvcGVcIixcImRldHVuZVwiXSl9LHQuZXh0ZW5kKHQuQU1TeW50aCx0Lk1vbm9waG9uaWMpLHQuQU1TeW50aC5kZWZhdWx0cz17aGFybW9uaWNpdHk6MyxkZXR1bmU6MCxvc2NpbGxhdG9yOnt0eXBlOlwic2luZVwifSxlbnZlbG9wZTp7YXR0YWNrOi4wMSxkZWNheTouMDEsc3VzdGFpbjoxLHJlbGVhc2U6LjV9LG1vZHVsYXRpb246e3R5cGU6XCJzcXVhcmVcIn0sbW9kdWxhdGlvbkVudmVsb3BlOnthdHRhY2s6LjUsZGVjYXk6MCxzdXN0YWluOjEscmVsZWFzZTouNX19LHQuQU1TeW50aC5wcm90b3R5cGUuX3RyaWdnZXJFbnZlbG9wZUF0dGFjaz1mdW5jdGlvbih0LGUpe3JldHVybiB0PXRoaXMudG9TZWNvbmRzKHQpLHRoaXMuX2NhcnJpZXIuX3RyaWdnZXJFbnZlbG9wZUF0dGFjayh0LGUpLHRoaXMuX21vZHVsYXRvci5fdHJpZ2dlckVudmVsb3BlQXR0YWNrKHQpLHRoaXN9LHQuQU1TeW50aC5wcm90b3R5cGUuX3RyaWdnZXJFbnZlbG9wZVJlbGVhc2U9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NhcnJpZXIuX3RyaWdnZXJFbnZlbG9wZVJlbGVhc2UodCksdGhpcy5fbW9kdWxhdG9yLl90cmlnZ2VyRW52ZWxvcGVSZWxlYXNlKHQpLHRoaXN9LHQuQU1TeW50aC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0Lk1vbm9waG9uaWMucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl93cml0YWJsZShbXCJmcmVxdWVuY3lcIixcImhhcm1vbmljaXR5XCIsXCJvc2NpbGxhdG9yXCIsXCJlbnZlbG9wZVwiLFwibW9kdWxhdGlvblwiLFwibW9kdWxhdGlvbkVudmVsb3BlXCIsXCJkZXR1bmVcIl0pLHRoaXMuX2NhcnJpZXIuZGlzcG9zZSgpLHRoaXMuX2NhcnJpZXI9bnVsbCx0aGlzLl9tb2R1bGF0b3IuZGlzcG9zZSgpLHRoaXMuX21vZHVsYXRvcj1udWxsLHRoaXMuZnJlcXVlbmN5LmRpc3Bvc2UoKSx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXMuZGV0dW5lLmRpc3Bvc2UoKSx0aGlzLmRldHVuZT1udWxsLHRoaXMuaGFybW9uaWNpdHkuZGlzcG9zZSgpLHRoaXMuaGFybW9uaWNpdHk9bnVsbCx0aGlzLl9tb2R1bGF0aW9uU2NhbGUuZGlzcG9zZSgpLHRoaXMuX21vZHVsYXRpb25TY2FsZT1udWxsLHRoaXMuX21vZHVsYXRpb25Ob2RlLmRpc3Bvc2UoKSx0aGlzLl9tb2R1bGF0aW9uTm9kZT1udWxsLHRoaXMub3NjaWxsYXRvcj1udWxsLHRoaXMuZW52ZWxvcGU9bnVsbCx0aGlzLm1vZHVsYXRpb25FbnZlbG9wZT1udWxsLHRoaXMubW9kdWxhdGlvbj1udWxsLHRoaXN9LHQuQU1TeW50aH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg3MiksaSgxNildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlNlcXVlbmNlPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiY2FsbGJhY2tcIixcImV2ZW50c1wiLFwic3ViZGl2aXNpb25cIl0sdC5TZXF1ZW5jZSksaT1lLmV2ZW50cztpZihkZWxldGUgZS5ldmVudHMsdC5QYXJ0LmNhbGwodGhpcyxlKSx0aGlzLl9zdWJkaXZpc2lvbj10aGlzLnRvVGlja3MoZS5zdWJkaXZpc2lvbiksdC5pc1VuZGVmKGUubG9vcEVuZCkmJnQuaXNEZWZpbmVkKGkpJiYodGhpcy5fbG9vcEVuZD1pLmxlbmd0aCp0aGlzLl9zdWJkaXZpc2lvbiksdGhpcy5fbG9vcD0hMCx0LmlzRGVmaW5lZChpKSlmb3IodmFyIG49MDtuPGkubGVuZ3RoO24rKyl0aGlzLmFkZChuLGlbbl0pfSx0LmV4dGVuZCh0LlNlcXVlbmNlLHQuUGFydCksdC5TZXF1ZW5jZS5kZWZhdWx0cz17c3ViZGl2aXNpb246XCI0blwifSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5TZXF1ZW5jZS5wcm90b3R5cGUsXCJzdWJkaXZpc2lvblwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5UaWNrcyh0aGlzLl9zdWJkaXZpc2lvbikudG9TZWNvbmRzKCl9fSksdC5TZXF1ZW5jZS5wcm90b3R5cGUuYXQ9ZnVuY3Rpb24oZSxpKXtyZXR1cm4gdC5pc0FycmF5KGkpJiZ0aGlzLnJlbW92ZShlKSx0LlBhcnQucHJvdG90eXBlLmF0LmNhbGwodGhpcyx0aGlzLl9pbmRleFRpbWUoZSksaSl9LHQuU2VxdWVuY2UucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlLGkpe2lmKG51bGw9PT1pKXJldHVybiB0aGlzO2lmKHQuaXNBcnJheShpKSl7dmFyIG49TWF0aC5yb3VuZCh0aGlzLl9zdWJkaXZpc2lvbi9pLmxlbmd0aCk7aT1uZXcgdC5TZXF1ZW5jZSh0aGlzLl90aWNrLmJpbmQodGhpcyksaSx0LlRpY2tzKG4pKX1yZXR1cm4gdC5QYXJ0LnByb3RvdHlwZS5hZGQuY2FsbCh0aGlzLHRoaXMuX2luZGV4VGltZShlKSxpKSx0aGlzfSx0LlNlcXVlbmNlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oZSxpKXtyZXR1cm4gdC5QYXJ0LnByb3RvdHlwZS5yZW1vdmUuY2FsbCh0aGlzLHRoaXMuX2luZGV4VGltZShlKSxpKSx0aGlzfSx0LlNlcXVlbmNlLnByb3RvdHlwZS5faW5kZXhUaW1lPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgdC5UcmFuc3BvcnRUaW1lP2U6dC5UaWNrcyhlKnRoaXMuX3N1YmRpdmlzaW9uK3RoaXMuc3RhcnRPZmZzZXQpLnRvU2Vjb25kcygpfSx0LlNlcXVlbmNlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuUGFydC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXN9LHQuU2VxdWVuY2V9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNzMpLGkoODApXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtyZXR1cm4gdC5QYXR0ZXJuPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiY2FsbGJhY2tcIixcInZhbHVlc1wiLFwicGF0dGVyblwiXSx0LlBhdHRlcm4pO3QuTG9vcC5jYWxsKHRoaXMsZSksdGhpcy5fcGF0dGVybj1uZXcgdC5DdHJsUGF0dGVybih7dmFsdWVzOmUudmFsdWVzLHR5cGU6ZS5wYXR0ZXJuLGluZGV4OmUuaW5kZXh9KX0sdC5leHRlbmQodC5QYXR0ZXJuLHQuTG9vcCksdC5QYXR0ZXJuLmRlZmF1bHRzPXtwYXR0ZXJuOnQuQ3RybFBhdHRlcm4uVHlwZS5VcCxjYWxsYmFjazp0Lm5vT3AsdmFsdWVzOltdfSx0LlBhdHRlcm4ucHJvdG90eXBlLl90aWNrPWZ1bmN0aW9uKHQpe3RoaXMuY2FsbGJhY2sodCx0aGlzLl9wYXR0ZXJuLnZhbHVlKSx0aGlzLl9wYXR0ZXJuLm5leHQoKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGF0dGVybi5wcm90b3R5cGUsXCJpbmRleFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGF0dGVybi5pbmRleH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3BhdHRlcm4uaW5kZXg9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QYXR0ZXJuLnByb3RvdHlwZSxcInZhbHVlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGF0dGVybi52YWx1ZXN9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9wYXR0ZXJuLnZhbHVlcz10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlBhdHRlcm4ucHJvdG90eXBlLFwidmFsdWVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhdHRlcm4udmFsdWV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGF0dGVybi5wcm90b3R5cGUsXCJwYXR0ZXJuXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYXR0ZXJuLnR5cGV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9wYXR0ZXJuLnR5cGU9dH19KSx0LlBhdHRlcm4ucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0Lkxvb3AucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9wYXR0ZXJuLmRpc3Bvc2UoKSx0aGlzLl9wYXR0ZXJuPW51bGx9LHQuUGF0dGVybn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg4KSxpKDE4KSxpKDEyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuVmlicmF0bz1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcImZyZXF1ZW5jeVwiLFwiZGVwdGhcIl0sdC5WaWJyYXRvKTt0LkVmZmVjdC5jYWxsKHRoaXMsZSksdGhpcy5fZGVsYXlOb2RlPW5ldyB0LkRlbGF5KDAsZS5tYXhEZWxheSksdGhpcy5fbGZvPW5ldyB0LkxGTyh7dHlwZTplLnR5cGUsbWluOjAsbWF4OmUubWF4RGVsYXksZnJlcXVlbmN5OmUuZnJlcXVlbmN5LHBoYXNlOi05MH0pLnN0YXJ0KCkuY29ubmVjdCh0aGlzLl9kZWxheU5vZGUuZGVsYXlUaW1lKSx0aGlzLmZyZXF1ZW5jeT10aGlzLl9sZm8uZnJlcXVlbmN5LHRoaXMuZGVwdGg9dGhpcy5fbGZvLmFtcGxpdHVkZSx0aGlzLmRlcHRoLnZhbHVlPWUuZGVwdGgsdGhpcy5fcmVhZE9ubHkoW1wiZnJlcXVlbmN5XCIsXCJkZXB0aFwiXSksdGhpcy5lZmZlY3RTZW5kLmNoYWluKHRoaXMuX2RlbGF5Tm9kZSx0aGlzLmVmZmVjdFJldHVybil9LHQuZXh0ZW5kKHQuVmlicmF0byx0LkVmZmVjdCksdC5WaWJyYXRvLmRlZmF1bHRzPXttYXhEZWxheTouMDA1LGZyZXF1ZW5jeTo1LGRlcHRoOi4xLHR5cGU6XCJzaW5lXCJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlZpYnJhdG8ucHJvdG90eXBlLFwidHlwZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGZvLnR5cGV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9sZm8udHlwZT10fX0pLHQuVmlicmF0by5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3QuRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fZGVsYXlOb2RlLmRpc3Bvc2UoKSx0aGlzLl9kZWxheU5vZGU9bnVsbCx0aGlzLl9sZm8uZGlzcG9zZSgpLHRoaXMuX2xmbz1udWxsLHRoaXMuX3dyaXRhYmxlKFtcImZyZXF1ZW5jeVwiLFwiZGVwdGhcIl0pLHRoaXMuZnJlcXVlbmN5PW51bGwsdGhpcy5kZXB0aD1udWxsfSx0LlZpYnJhdG99LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMTIpLGkoMTUpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5UcmVtb2xvPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiZnJlcXVlbmN5XCIsXCJkZXB0aFwiXSx0LlRyZW1vbG8pO3QuU3RlcmVvRWZmZWN0LmNhbGwodGhpcyxlKSx0aGlzLl9sZm9MPW5ldyB0LkxGTyh7cGhhc2U6ZS5zcHJlYWQsbWluOjEsbWF4OjB9KSx0aGlzLl9sZm9SPW5ldyB0LkxGTyh7cGhhc2U6ZS5zcHJlYWQsbWluOjEsbWF4OjB9KSx0aGlzLl9hbXBsaXR1ZGVMPW5ldyB0LkdhaW4sdGhpcy5fYW1wbGl0dWRlUj1uZXcgdC5HYWluLHRoaXMuZnJlcXVlbmN5PW5ldyB0LlNpZ25hbChlLmZyZXF1ZW5jeSx0LlR5cGUuRnJlcXVlbmN5KSx0aGlzLmRlcHRoPW5ldyB0LlNpZ25hbChlLmRlcHRoLHQuVHlwZS5Ob3JtYWxSYW5nZSksdGhpcy5fcmVhZE9ubHkoW1wiZnJlcXVlbmN5XCIsXCJkZXB0aFwiXSksdGhpcy5lZmZlY3RTZW5kTC5jaGFpbih0aGlzLl9hbXBsaXR1ZGVMLHRoaXMuZWZmZWN0UmV0dXJuTCksdGhpcy5lZmZlY3RTZW5kUi5jaGFpbih0aGlzLl9hbXBsaXR1ZGVSLHRoaXMuZWZmZWN0UmV0dXJuUiksdGhpcy5fbGZvTC5jb25uZWN0KHRoaXMuX2FtcGxpdHVkZUwuZ2FpbiksdGhpcy5fbGZvUi5jb25uZWN0KHRoaXMuX2FtcGxpdHVkZVIuZ2FpbiksdGhpcy5mcmVxdWVuY3kuZmFuKHRoaXMuX2xmb0wuZnJlcXVlbmN5LHRoaXMuX2xmb1IuZnJlcXVlbmN5KSx0aGlzLmRlcHRoLmZhbih0aGlzLl9sZm9SLmFtcGxpdHVkZSx0aGlzLl9sZm9MLmFtcGxpdHVkZSksdGhpcy50eXBlPWUudHlwZSx0aGlzLnNwcmVhZD1lLnNwcmVhZH0sdC5leHRlbmQodC5UcmVtb2xvLHQuU3RlcmVvRWZmZWN0KSx0LlRyZW1vbG8uZGVmYXVsdHM9e2ZyZXF1ZW5jeToxMCx0eXBlOlwic2luZVwiLGRlcHRoOi41LHNwcmVhZDoxODB9LHQuVHJlbW9sby5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2xmb0wuc3RhcnQodCksdGhpcy5fbGZvUi5zdGFydCh0KSx0aGlzfSx0LlRyZW1vbG8ucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2xmb0wuc3RvcCh0KSx0aGlzLl9sZm9SLnN0b3AodCksdGhpc30sdC5UcmVtb2xvLnByb3RvdHlwZS5zeW5jPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9sZm9MLnN5bmMoZSksdGhpcy5fbGZvUi5zeW5jKGUpLHQuVHJhbnNwb3J0LnN5bmNTaWduYWwodGhpcy5mcmVxdWVuY3kpLHRoaXN9LHQuVHJlbW9sby5wcm90b3R5cGUudW5zeW5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xmb0wudW5zeW5jKCksdGhpcy5fbGZvUi51bnN5bmMoKSx0LlRyYW5zcG9ydC51bnN5bmNTaWduYWwodGhpcy5mcmVxdWVuY3kpLHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRyZW1vbG8ucHJvdG90eXBlLFwidHlwZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGZvTC50eXBlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbGZvTC50eXBlPXQsdGhpcy5fbGZvUi50eXBlPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuVHJlbW9sby5wcm90b3R5cGUsXCJzcHJlYWRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xmb1IucGhhc2UtdGhpcy5fbGZvTC5waGFzZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2xmb0wucGhhc2U9OTAtdC8yLHRoaXMuX2xmb1IucGhhc2U9dC8yKzkwfX0pLHQuVHJlbW9sby5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LlN0ZXJlb0VmZmVjdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcImZyZXF1ZW5jeVwiLFwiZGVwdGhcIl0pLHRoaXMuX2xmb0wuZGlzcG9zZSgpLHRoaXMuX2xmb0w9bnVsbCx0aGlzLl9sZm9SLmRpc3Bvc2UoKSx0aGlzLl9sZm9SPW51bGwsdGhpcy5fYW1wbGl0dWRlTC5kaXNwb3NlKCksdGhpcy5fYW1wbGl0dWRlTD1udWxsLHRoaXMuX2FtcGxpdHVkZVIuZGlzcG9zZSgpLHRoaXMuX2FtcGxpdHVkZVI9bnVsbCx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXMuZGVwdGg9bnVsbCx0aGlzfSx0LlRyZW1vbG99LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNzUpLGkoMSksaSg1KSxpKDEzKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuU3RlcmVvV2lkZW5lcj1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcIndpZHRoXCJdLHQuU3RlcmVvV2lkZW5lcik7dC5NaWRTaWRlRWZmZWN0LmNhbGwodGhpcyxlKSx0aGlzLndpZHRoPW5ldyB0LlNpZ25hbChlLndpZHRoLHQuVHlwZS5Ob3JtYWxSYW5nZSksdGhpcy5fcmVhZE9ubHkoW1wid2lkdGhcIl0pLHRoaXMuX3R3b1RpbWVzV2lkdGhNaWQ9bmV3IHQuTXVsdGlwbHkoMiksdGhpcy5fdHdvVGltZXNXaWR0aFNpZGU9bmV3IHQuTXVsdGlwbHkoMiksdGhpcy5fbWlkTXVsdD1uZXcgdC5NdWx0aXBseSx0aGlzLl90d29UaW1lc1dpZHRoTWlkLmNvbm5lY3QodGhpcy5fbWlkTXVsdCwwLDEpLHRoaXMubWlkU2VuZC5jaGFpbih0aGlzLl9taWRNdWx0LHRoaXMubWlkUmV0dXJuKSx0aGlzLl9vbmVNaW51c1dpZHRoPW5ldyB0LlN1YnRyYWN0LHRoaXMuX29uZU1pbnVzV2lkdGguY29ubmVjdCh0aGlzLl90d29UaW1lc1dpZHRoTWlkKSx0aGlzLmNvbnRleHQuZ2V0Q29uc3RhbnQoMSkuY29ubmVjdCh0aGlzLl9vbmVNaW51c1dpZHRoLDAsMCksdGhpcy53aWR0aC5jb25uZWN0KHRoaXMuX29uZU1pbnVzV2lkdGgsMCwxKSx0aGlzLl9zaWRlTXVsdD1uZXcgdC5NdWx0aXBseSx0aGlzLndpZHRoLmNvbm5lY3QodGhpcy5fdHdvVGltZXNXaWR0aFNpZGUpLHRoaXMuX3R3b1RpbWVzV2lkdGhTaWRlLmNvbm5lY3QodGhpcy5fc2lkZU11bHQsMCwxKSx0aGlzLnNpZGVTZW5kLmNoYWluKHRoaXMuX3NpZGVNdWx0LHRoaXMuc2lkZVJldHVybil9LHQuZXh0ZW5kKHQuU3RlcmVvV2lkZW5lcix0Lk1pZFNpZGVFZmZlY3QpLHQuU3RlcmVvV2lkZW5lci5kZWZhdWx0cz17d2lkdGg6LjV9LHQuU3RlcmVvV2lkZW5lci5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0Lk1pZFNpZGVFZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl93cml0YWJsZShbXCJ3aWR0aFwiXSksdGhpcy53aWR0aC5kaXNwb3NlKCksdGhpcy53aWR0aD1udWxsLHRoaXMuX21pZE11bHQuZGlzcG9zZSgpLHRoaXMuX21pZE11bHQ9bnVsbCx0aGlzLl9zaWRlTXVsdC5kaXNwb3NlKCksdGhpcy5fc2lkZU11bHQ9bnVsbCx0aGlzLl90d29UaW1lc1dpZHRoTWlkLmRpc3Bvc2UoKSx0aGlzLl90d29UaW1lc1dpZHRoTWlkPW51bGwsdGhpcy5fdHdvVGltZXNXaWR0aFNpZGUuZGlzcG9zZSgpLHRoaXMuX3R3b1RpbWVzV2lkdGhTaWRlPW51bGwsdGhpcy5fb25lTWludXNXaWR0aC5kaXNwb3NlKCksdGhpcy5fb25lTWludXNXaWR0aD1udWxsLHRoaXN9LHQuU3RlcmVvV2lkZW5lcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxNSksaSgzMiksaSgzKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuU3RlcmVvRmVlZGJhY2tFZmZlY3Q9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJmZWVkYmFja1wiXSx0LkZlZWRiYWNrRWZmZWN0KTt0LlN0ZXJlb0VmZmVjdC5jYWxsKHRoaXMsZSksdGhpcy5mZWVkYmFjaz1uZXcgdC5TaWduYWwoZS5mZWVkYmFjayx0LlR5cGUuTm9ybWFsUmFuZ2UpLHRoaXMuX2ZlZWRiYWNrTD1uZXcgdC5HYWluLHRoaXMuX2ZlZWRiYWNrUj1uZXcgdC5HYWluLHRoaXMuZWZmZWN0UmV0dXJuTC5jaGFpbih0aGlzLl9mZWVkYmFja0wsdGhpcy5lZmZlY3RTZW5kTCksdGhpcy5lZmZlY3RSZXR1cm5SLmNoYWluKHRoaXMuX2ZlZWRiYWNrUix0aGlzLmVmZmVjdFNlbmRSKSx0aGlzLmZlZWRiYWNrLmZhbih0aGlzLl9mZWVkYmFja0wuZ2Fpbix0aGlzLl9mZWVkYmFja1IuZ2FpbiksdGhpcy5fcmVhZE9ubHkoW1wiZmVlZGJhY2tcIl0pfSx0LmV4dGVuZCh0LlN0ZXJlb0ZlZWRiYWNrRWZmZWN0LHQuU3RlcmVvRWZmZWN0KSx0LlN0ZXJlb0ZlZWRiYWNrRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU3RlcmVvRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fd3JpdGFibGUoW1wiZmVlZGJhY2tcIl0pLHRoaXMuZmVlZGJhY2suZGlzcG9zZSgpLHRoaXMuZmVlZGJhY2s9bnVsbCx0aGlzLl9mZWVkYmFja0wuZGlzcG9zZSgpLHRoaXMuX2ZlZWRiYWNrTD1udWxsLHRoaXMuX2ZlZWRiYWNrUi5kaXNwb3NlKCksdGhpcy5fZmVlZGJhY2tSPW51bGwsdGhpc30sdC5TdGVyZW9GZWVkYmFja0VmZmVjdH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg3OCksaSg5KSxpKDEwKSxpKDM5KSxpKDMpLGkoNzYpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5SZXZlcmI9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJkZWNheVwiXSx0LlJldmVyYik7dC5FZmZlY3QuY2FsbCh0aGlzLGUpLHRoaXMuX2NvbnZvbHZlcj10aGlzLmNvbnRleHQuY3JlYXRlQ29udm9sdmVyKCksdGhpcy5kZWNheT1lLmRlY2F5LHRoaXMucHJlRGVsYXk9ZS5wcmVEZWxheSx0aGlzLmNvbm5lY3RFZmZlY3QodGhpcy5fY29udm9sdmVyKX0sdC5leHRlbmQodC5SZXZlcmIsdC5FZmZlY3QpLHQuUmV2ZXJiLmRlZmF1bHRzPXtkZWNheToxLjUscHJlRGVsYXk6LjAxfSx0LlJldmVyYi5wcm90b3R5cGUuZ2VuZXJhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdC5PZmZsaW5lKGZ1bmN0aW9uKCl7dmFyIGU9bmV3IHQuTm9pc2UsaT1uZXcgdC5Ob2lzZSxuPW5ldyB0Lk1lcmdlO2UuY29ubmVjdChuLmxlZnQpLGkuY29ubmVjdChuLnJpZ2h0KTt2YXIgbz0obmV3IHQuR2FpbikudG9NYXN0ZXIoKTtuLmNvbm5lY3QobyksZS5zdGFydCgwKSxpLnN0YXJ0KDApLG8uZ2Fpbi5zZXRWYWx1ZUF0VGltZSgwLDApLG8uZ2Fpbi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSgxLHRoaXMucHJlRGVsYXkpLG8uZ2Fpbi5leHBvbmVudGlhbEFwcHJvYWNoVmFsdWVBdFRpbWUoMCx0aGlzLnByZURlbGF5LHRoaXMuZGVjYXktdGhpcy5wcmVEZWxheSl9LmJpbmQodGhpcyksdGhpcy5kZWNheSkudGhlbihmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY29udm9sdmVyLmJ1ZmZlcj10LmdldCgpLHRoaXN9LmJpbmQodGhpcykpfSx0LlJldmVyYi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkVmZmVjdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX2NvbnZvbHZlci5kaXNjb25uZWN0KCksdGhpcy5fY29udm9sdmVyPW51bGwsdGhpc30sdC5SZXZlcmJ9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMTIpLGkoMjMpLGkoMSksaSgzMiksaSgxOCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlBpdGNoU2hpZnQ9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJwaXRjaFwiXSx0LlBpdGNoU2hpZnQpO3QuRmVlZGJhY2tFZmZlY3QuY2FsbCh0aGlzLGUpLHRoaXMuX2ZyZXF1ZW5jeT1uZXcgdC5TaWduYWwoMCksdGhpcy5fZGVsYXlBPW5ldyB0LkRlbGF5KDAsMSksdGhpcy5fbGZvQT1uZXcgdC5MRk8oe21pbjowLG1heDouMSx0eXBlOlwic2F3dG9vdGhcIn0pLmNvbm5lY3QodGhpcy5fZGVsYXlBLmRlbGF5VGltZSksdGhpcy5fZGVsYXlCPW5ldyB0LkRlbGF5KDAsMSksdGhpcy5fbGZvQj1uZXcgdC5MRk8oe21pbjowLG1heDouMSx0eXBlOlwic2F3dG9vdGhcIixwaGFzZToxODB9KS5jb25uZWN0KHRoaXMuX2RlbGF5Qi5kZWxheVRpbWUpLHRoaXMuX2Nyb3NzRmFkZT1uZXcgdC5Dcm9zc0ZhZGUsdGhpcy5fY3Jvc3NGYWRlTEZPPW5ldyB0LkxGTyh7bWluOjAsbWF4OjEsdHlwZTpcInRyaWFuZ2xlXCIscGhhc2U6OTB9KS5jb25uZWN0KHRoaXMuX2Nyb3NzRmFkZS5mYWRlKSx0aGlzLl9mZWVkYmFja0RlbGF5PW5ldyB0LkRlbGF5KGUuZGVsYXlUaW1lKSx0aGlzLmRlbGF5VGltZT10aGlzLl9mZWVkYmFja0RlbGF5LmRlbGF5VGltZSx0aGlzLl9yZWFkT25seShcImRlbGF5VGltZVwiKSx0aGlzLl9waXRjaD1lLnBpdGNoLHRoaXMuX3dpbmRvd1NpemU9ZS53aW5kb3dTaXplLHRoaXMuX2RlbGF5QS5jb25uZWN0KHRoaXMuX2Nyb3NzRmFkZS5hKSx0aGlzLl9kZWxheUIuY29ubmVjdCh0aGlzLl9jcm9zc0ZhZGUuYiksdGhpcy5fZnJlcXVlbmN5LmZhbih0aGlzLl9sZm9BLmZyZXF1ZW5jeSx0aGlzLl9sZm9CLmZyZXF1ZW5jeSx0aGlzLl9jcm9zc0ZhZGVMRk8uZnJlcXVlbmN5KSx0aGlzLmVmZmVjdFNlbmQuZmFuKHRoaXMuX2RlbGF5QSx0aGlzLl9kZWxheUIpLHRoaXMuX2Nyb3NzRmFkZS5jaGFpbih0aGlzLl9mZWVkYmFja0RlbGF5LHRoaXMuZWZmZWN0UmV0dXJuKTt2YXIgaT10aGlzLm5vdygpO3RoaXMuX2xmb0Euc3RhcnQoaSksdGhpcy5fbGZvQi5zdGFydChpKSx0aGlzLl9jcm9zc0ZhZGVMRk8uc3RhcnQoaSksdGhpcy53aW5kb3dTaXplPXRoaXMuX3dpbmRvd1NpemV9LHQuZXh0ZW5kKHQuUGl0Y2hTaGlmdCx0LkZlZWRiYWNrRWZmZWN0KSx0LlBpdGNoU2hpZnQuZGVmYXVsdHM9e3BpdGNoOjAsd2luZG93U2l6ZTouMSxkZWxheVRpbWU6MCxmZWVkYmFjazowfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QaXRjaFNoaWZ0LnByb3RvdHlwZSxcInBpdGNoXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9waXRjaH0sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX3BpdGNoPWU7dmFyIGk9MDtlPDA/KHRoaXMuX2xmb0EubWluPTAsdGhpcy5fbGZvQS5tYXg9dGhpcy5fd2luZG93U2l6ZSx0aGlzLl9sZm9CLm1pbj0wLHRoaXMuX2xmb0IubWF4PXRoaXMuX3dpbmRvd1NpemUsaT10LmludGVydmFsVG9GcmVxdWVuY3lSYXRpbyhlLTEpKzEpOih0aGlzLl9sZm9BLm1pbj10aGlzLl93aW5kb3dTaXplLHRoaXMuX2xmb0EubWF4PTAsdGhpcy5fbGZvQi5taW49dGhpcy5fd2luZG93U2l6ZSx0aGlzLl9sZm9CLm1heD0wLGk9dC5pbnRlcnZhbFRvRnJlcXVlbmN5UmF0aW8oZSktMSksdGhpcy5fZnJlcXVlbmN5LnZhbHVlPWkqKDEuMi90aGlzLl93aW5kb3dTaXplKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QaXRjaFNoaWZ0LnByb3RvdHlwZSxcIndpbmRvd1NpemVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dpbmRvd1NpemV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl93aW5kb3dTaXplPXRoaXMudG9TZWNvbmRzKHQpLHRoaXMucGl0Y2g9dGhpcy5fcGl0Y2h9fSksdC5QaXRjaFNoaWZ0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuRmVlZGJhY2tFZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9mcmVxdWVuY3kuZGlzcG9zZSgpLHRoaXMuX2ZyZXF1ZW5jeT1udWxsLHRoaXMuX2RlbGF5QS5kaXNjb25uZWN0KCksdGhpcy5fZGVsYXlBPW51bGwsdGhpcy5fZGVsYXlCLmRpc2Nvbm5lY3QoKSx0aGlzLl9kZWxheUI9bnVsbCx0aGlzLl9sZm9BLmRpc3Bvc2UoKSx0aGlzLl9sZm9BPW51bGwsdGhpcy5fbGZvQi5kaXNwb3NlKCksdGhpcy5fbGZvQj1udWxsLHRoaXMuX2Nyb3NzRmFkZS5kaXNwb3NlKCksdGhpcy5fY3Jvc3NGYWRlPW51bGwsdGhpcy5fY3Jvc3NGYWRlTEZPLmRpc3Bvc2UoKSx0aGlzLl9jcm9zc0ZhZGVMRk89bnVsbCx0aGlzLl93cml0YWJsZShcImRlbGF5VGltZVwiKSx0aGlzLl9mZWVkYmFja0RlbGF5LmRpc3Bvc2UoKSx0aGlzLl9mZWVkYmFja0RlbGF5PW51bGwsdGhpcy5kZWxheVRpbWU9bnVsbCx0aGlzfSx0LlBpdGNoU2hpZnR9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNzQpLGkoMSksaSgxOCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlBpbmdQb25nRGVsYXk9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJkZWxheVRpbWVcIixcImZlZWRiYWNrXCJdLHQuUGluZ1BvbmdEZWxheSk7dC5TdGVyZW9YRmVlZGJhY2tFZmZlY3QuY2FsbCh0aGlzLGUpLHRoaXMuX2xlZnREZWxheT1uZXcgdC5EZWxheSgwLGUubWF4RGVsYXlUaW1lKSx0aGlzLl9yaWdodERlbGF5PW5ldyB0LkRlbGF5KDAsZS5tYXhEZWxheVRpbWUpLHRoaXMuX3JpZ2h0UHJlRGVsYXk9bmV3IHQuRGVsYXkoMCxlLm1heERlbGF5VGltZSksdGhpcy5kZWxheVRpbWU9bmV3IHQuU2lnbmFsKGUuZGVsYXlUaW1lLHQuVHlwZS5UaW1lKSx0aGlzLmVmZmVjdFNlbmRMLmNoYWluKHRoaXMuX2xlZnREZWxheSx0aGlzLmVmZmVjdFJldHVybkwpLHRoaXMuZWZmZWN0U2VuZFIuY2hhaW4odGhpcy5fcmlnaHRQcmVEZWxheSx0aGlzLl9yaWdodERlbGF5LHRoaXMuZWZmZWN0UmV0dXJuUiksdGhpcy5kZWxheVRpbWUuZmFuKHRoaXMuX2xlZnREZWxheS5kZWxheVRpbWUsdGhpcy5fcmlnaHREZWxheS5kZWxheVRpbWUsdGhpcy5fcmlnaHRQcmVEZWxheS5kZWxheVRpbWUpLHRoaXMuX2ZlZWRiYWNrTFIuZGlzY29ubmVjdCgpLHRoaXMuX2ZlZWRiYWNrTFIuY29ubmVjdCh0aGlzLl9yaWdodERlbGF5KSx0aGlzLl9yZWFkT25seShbXCJkZWxheVRpbWVcIl0pfSx0LmV4dGVuZCh0LlBpbmdQb25nRGVsYXksdC5TdGVyZW9YRmVlZGJhY2tFZmZlY3QpLHQuUGluZ1BvbmdEZWxheS5kZWZhdWx0cz17ZGVsYXlUaW1lOi4yNSxtYXhEZWxheVRpbWU6MX0sdC5QaW5nUG9uZ0RlbGF5LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU3RlcmVvWEZlZWRiYWNrRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fbGVmdERlbGF5LmRpc3Bvc2UoKSx0aGlzLl9sZWZ0RGVsYXk9bnVsbCx0aGlzLl9yaWdodERlbGF5LmRpc3Bvc2UoKSx0aGlzLl9yaWdodERlbGF5PW51bGwsdGhpcy5fcmlnaHRQcmVEZWxheS5kaXNwb3NlKCksdGhpcy5fcmlnaHRQcmVEZWxheT1udWxsLHRoaXMuX3dyaXRhYmxlKFtcImRlbGF5VGltZVwiXSksdGhpcy5kZWxheVRpbWUuZGlzcG9zZSgpLHRoaXMuZGVsYXlUaW1lPW51bGwsdGhpc30sdC5QaW5nUG9uZ0RlbGF5fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDEyKSxpKDkpLGkoMTUpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5QaGFzZXI9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJmcmVxdWVuY3lcIixcIm9jdGF2ZXNcIixcImJhc2VGcmVxdWVuY3lcIl0sdC5QaGFzZXIpO3QuU3RlcmVvRWZmZWN0LmNhbGwodGhpcyxlKSx0aGlzLl9sZm9MPW5ldyB0LkxGTyhlLmZyZXF1ZW5jeSwwLDEpLHRoaXMuX2xmb1I9bmV3IHQuTEZPKGUuZnJlcXVlbmN5LDAsMSksdGhpcy5fbGZvUi5waGFzZT0xODAsdGhpcy5fYmFzZUZyZXF1ZW5jeT1lLmJhc2VGcmVxdWVuY3ksdGhpcy5fb2N0YXZlcz1lLm9jdGF2ZXMsdGhpcy5RPW5ldyB0LlNpZ25hbChlLlEsdC5UeXBlLlBvc2l0aXZlKSx0aGlzLl9maWx0ZXJzTD10aGlzLl9tYWtlRmlsdGVycyhlLnN0YWdlcyx0aGlzLl9sZm9MLHRoaXMuUSksdGhpcy5fZmlsdGVyc1I9dGhpcy5fbWFrZUZpbHRlcnMoZS5zdGFnZXMsdGhpcy5fbGZvUix0aGlzLlEpLHRoaXMuZnJlcXVlbmN5PXRoaXMuX2xmb0wuZnJlcXVlbmN5LHRoaXMuZnJlcXVlbmN5LnZhbHVlPWUuZnJlcXVlbmN5LHRoaXMuZWZmZWN0U2VuZEwuY29ubmVjdCh0aGlzLl9maWx0ZXJzTFswXSksdGhpcy5lZmZlY3RTZW5kUi5jb25uZWN0KHRoaXMuX2ZpbHRlcnNSWzBdKSx0aGlzLl9maWx0ZXJzTFtlLnN0YWdlcy0xXS5jb25uZWN0KHRoaXMuZWZmZWN0UmV0dXJuTCksdGhpcy5fZmlsdGVyc1JbZS5zdGFnZXMtMV0uY29ubmVjdCh0aGlzLmVmZmVjdFJldHVyblIpLHRoaXMuX2xmb0wuZnJlcXVlbmN5LmNvbm5lY3QodGhpcy5fbGZvUi5mcmVxdWVuY3kpLHRoaXMuYmFzZUZyZXF1ZW5jeT1lLmJhc2VGcmVxdWVuY3ksdGhpcy5vY3RhdmVzPWUub2N0YXZlcyx0aGlzLl9sZm9MLnN0YXJ0KCksdGhpcy5fbGZvUi5zdGFydCgpLHRoaXMuX3JlYWRPbmx5KFtcImZyZXF1ZW5jeVwiLFwiUVwiXSl9LHQuZXh0ZW5kKHQuUGhhc2VyLHQuU3RlcmVvRWZmZWN0KSx0LlBoYXNlci5kZWZhdWx0cz17ZnJlcXVlbmN5Oi41LG9jdGF2ZXM6MyxzdGFnZXM6MTAsUToxMCxiYXNlRnJlcXVlbmN5OjM1MH0sdC5QaGFzZXIucHJvdG90eXBlLl9tYWtlRmlsdGVycz1mdW5jdGlvbihlLGksbil7Zm9yKHZhciBvPW5ldyBBcnJheShlKSxzPTA7czxlO3MrKyl7dmFyIHI9dGhpcy5jb250ZXh0LmNyZWF0ZUJpcXVhZEZpbHRlcigpO3IudHlwZT1cImFsbHBhc3NcIixuLmNvbm5lY3Qoci5RKSxpLmNvbm5lY3Qoci5mcmVxdWVuY3kpLG9bc109cn1yZXR1cm4gdC5jb25uZWN0U2VyaWVzLmFwcGx5KHQsbyksb30sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGhhc2VyLnByb3RvdHlwZSxcIm9jdGF2ZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29jdGF2ZXN9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9vY3RhdmVzPXQ7dmFyIGU9dGhpcy5fYmFzZUZyZXF1ZW5jeSpNYXRoLnBvdygyLHQpO3RoaXMuX2xmb0wubWF4PWUsdGhpcy5fbGZvUi5tYXg9ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QaGFzZXIucHJvdG90eXBlLFwiYmFzZUZyZXF1ZW5jeVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFzZUZyZXF1ZW5jeX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2Jhc2VGcmVxdWVuY3k9dCx0aGlzLl9sZm9MLm1pbj10LHRoaXMuX2xmb1IubWluPXQsdGhpcy5vY3RhdmVzPXRoaXMuX29jdGF2ZXN9fSksdC5QaGFzZXIucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0LlN0ZXJlb0VmZmVjdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcImZyZXF1ZW5jeVwiLFwiUVwiXSksdGhpcy5RLmRpc3Bvc2UoKSx0aGlzLlE9bnVsbCx0aGlzLl9sZm9MLmRpc3Bvc2UoKSx0aGlzLl9sZm9MPW51bGwsdGhpcy5fbGZvUi5kaXNwb3NlKCksdGhpcy5fbGZvUj1udWxsO2Zvcih2YXIgZT0wO2U8dGhpcy5fZmlsdGVyc0wubGVuZ3RoO2UrKyl0aGlzLl9maWx0ZXJzTFtlXS5kaXNjb25uZWN0KCksdGhpcy5fZmlsdGVyc0xbZV09bnVsbDt0aGlzLl9maWx0ZXJzTD1udWxsO2Zvcih2YXIgaT0wO2k8dGhpcy5fZmlsdGVyc1IubGVuZ3RoO2krKyl0aGlzLl9maWx0ZXJzUltpXS5kaXNjb25uZWN0KCksdGhpcy5fZmlsdGVyc1JbaV09bnVsbDtyZXR1cm4gdGhpcy5fZmlsdGVyc1I9bnVsbCx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXN9LHQuUGhhc2VyfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDU4KSxpKDE1KSxpKDI2KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGU9Wy4wNjc0OCwuMDY0MDQsLjA4MjEyLC4wOTAwNF0saT1bLjc3MywuODAyLC43NTMsLjczM10sbj1bMzQ3LDExMywzN107cmV0dXJuIHQuSkNSZXZlcmI9ZnVuY3Rpb24oKXt2YXIgbz10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJyb29tU2l6ZVwiXSx0LkpDUmV2ZXJiKTt0LlN0ZXJlb0VmZmVjdC5jYWxsKHRoaXMsbyksdGhpcy5yb29tU2l6ZT1uZXcgdC5TaWduYWwoby5yb29tU2l6ZSx0LlR5cGUuTm9ybWFsUmFuZ2UpLHRoaXMuX3NjYWxlUm9vbVNpemU9bmV3IHQuU2NhbGUoLS43MzMsLjE5NyksdGhpcy5fYWxscGFzc0ZpbHRlcnM9W10sdGhpcy5fZmVlZGJhY2tDb21iRmlsdGVycz1bXTtmb3IodmFyIHM9MDtzPG4ubGVuZ3RoO3MrKyl7dmFyIHI9dGhpcy5jb250ZXh0LmNyZWF0ZUJpcXVhZEZpbHRlcigpO3IudHlwZT1cImFsbHBhc3NcIixyLmZyZXF1ZW5jeS52YWx1ZT1uW3NdLHRoaXMuX2FsbHBhc3NGaWx0ZXJzLnB1c2gocil9Zm9yKHZhciBhPTA7YTxlLmxlbmd0aDthKyspe3ZhciBsPW5ldyB0LkZlZWRiYWNrQ29tYkZpbHRlcihlW2FdLC4xKTt0aGlzLl9zY2FsZVJvb21TaXplLmNvbm5lY3QobC5yZXNvbmFuY2UpLGwucmVzb25hbmNlLnZhbHVlPWlbYV0sdGhpcy5fYWxscGFzc0ZpbHRlcnNbdGhpcy5fYWxscGFzc0ZpbHRlcnMubGVuZ3RoLTFdLmNvbm5lY3QobCksYTxlLmxlbmd0aC8yP2wuY29ubmVjdCh0aGlzLmVmZmVjdFJldHVybkwpOmwuY29ubmVjdCh0aGlzLmVmZmVjdFJldHVyblIpLHRoaXMuX2ZlZWRiYWNrQ29tYkZpbHRlcnMucHVzaChsKX10aGlzLnJvb21TaXplLmNvbm5lY3QodGhpcy5fc2NhbGVSb29tU2l6ZSksdC5jb25uZWN0U2VyaWVzLmFwcGx5KHQsdGhpcy5fYWxscGFzc0ZpbHRlcnMpLHRoaXMuZWZmZWN0U2VuZEwuY29ubmVjdCh0aGlzLl9hbGxwYXNzRmlsdGVyc1swXSksdGhpcy5lZmZlY3RTZW5kUi5jb25uZWN0KHRoaXMuX2FsbHBhc3NGaWx0ZXJzWzBdKSx0aGlzLl9yZWFkT25seShbXCJyb29tU2l6ZVwiXSl9LHQuZXh0ZW5kKHQuSkNSZXZlcmIsdC5TdGVyZW9FZmZlY3QpLHQuSkNSZXZlcmIuZGVmYXVsdHM9e3Jvb21TaXplOi41fSx0LkpDUmV2ZXJiLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dC5TdGVyZW9FZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtmb3IodmFyIGU9MDtlPHRoaXMuX2FsbHBhc3NGaWx0ZXJzLmxlbmd0aDtlKyspdGhpcy5fYWxscGFzc0ZpbHRlcnNbZV0uZGlzY29ubmVjdCgpLHRoaXMuX2FsbHBhc3NGaWx0ZXJzW2VdPW51bGw7dGhpcy5fYWxscGFzc0ZpbHRlcnM9bnVsbDtmb3IodmFyIGk9MDtpPHRoaXMuX2ZlZWRiYWNrQ29tYkZpbHRlcnMubGVuZ3RoO2krKyl0aGlzLl9mZWVkYmFja0NvbWJGaWx0ZXJzW2ldLmRpc3Bvc2UoKSx0aGlzLl9mZWVkYmFja0NvbWJGaWx0ZXJzW2ldPW51bGw7cmV0dXJuIHRoaXMuX2ZlZWRiYWNrQ29tYkZpbHRlcnM9bnVsbCx0aGlzLl93cml0YWJsZShbXCJyb29tU2l6ZVwiXSksdGhpcy5yb29tU2l6ZS5kaXNwb3NlKCksdGhpcy5yb29tU2l6ZT1udWxsLHRoaXMuX3NjYWxlUm9vbVNpemUuZGlzcG9zZSgpLHRoaXMuX3NjYWxlUm9vbVNpemU9bnVsbCx0aGlzfSx0LkpDUmV2ZXJifS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDUzKSxpKDE1KSxpKDEpLGkoMTkpLGkoMTApLGkoNDIpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjt2YXIgZT1bMTU1Ny80NDEwMCwxNjE3LzQ0MTAwLDE0OTEvNDQxMDAsMTQyMi80NDEwMCwxMjc3LzQ0MTAwLDEzNTYvNDQxMDAsMTE4OC80NDEwMCwxMTE2LzQ0MTAwXSxpPVsyMjUsNTU2LDQ0MSwzNDFdO3JldHVybiB0LkZyZWV2ZXJiPWZ1bmN0aW9uKCl7dmFyIG49dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wicm9vbVNpemVcIixcImRhbXBlbmluZ1wiXSx0LkZyZWV2ZXJiKTt0LlN0ZXJlb0VmZmVjdC5jYWxsKHRoaXMsbiksdGhpcy5yb29tU2l6ZT1uZXcgdC5TaWduYWwobi5yb29tU2l6ZSx0LlR5cGUuTm9ybWFsUmFuZ2UpLHRoaXMuZGFtcGVuaW5nPW5ldyB0LlNpZ25hbChuLmRhbXBlbmluZyx0LlR5cGUuRnJlcXVlbmN5KSx0aGlzLl9jb21iRmlsdGVycz1bXSx0aGlzLl9hbGxwYXNzRmlsdGVyc0w9W10sdGhpcy5fYWxscGFzc0ZpbHRlcnNSPVtdO2Zvcih2YXIgbz0wO288aS5sZW5ndGg7bysrKXt2YXIgcz10aGlzLmNvbnRleHQuY3JlYXRlQmlxdWFkRmlsdGVyKCk7cy50eXBlPVwiYWxscGFzc1wiLHMuZnJlcXVlbmN5LnZhbHVlPWlbb10sdGhpcy5fYWxscGFzc0ZpbHRlcnNMLnB1c2gocyl9Zm9yKHZhciByPTA7cjxpLmxlbmd0aDtyKyspe3ZhciBhPXRoaXMuY29udGV4dC5jcmVhdGVCaXF1YWRGaWx0ZXIoKTthLnR5cGU9XCJhbGxwYXNzXCIsYS5mcmVxdWVuY3kudmFsdWU9aVtyXSx0aGlzLl9hbGxwYXNzRmlsdGVyc1IucHVzaChhKX1mb3IodmFyIGw9MDtsPGUubGVuZ3RoO2wrKyl7dmFyIGg9bmV3IHQuTG93cGFzc0NvbWJGaWx0ZXIoZVtsXSk7bDxlLmxlbmd0aC8yP3RoaXMuZWZmZWN0U2VuZEwuY2hhaW4oaCx0aGlzLl9hbGxwYXNzRmlsdGVyc0xbMF0pOnRoaXMuZWZmZWN0U2VuZFIuY2hhaW4oaCx0aGlzLl9hbGxwYXNzRmlsdGVyc1JbMF0pLHRoaXMucm9vbVNpemUuY29ubmVjdChoLnJlc29uYW5jZSksdGhpcy5kYW1wZW5pbmcuY29ubmVjdChoLmRhbXBlbmluZyksdGhpcy5fY29tYkZpbHRlcnMucHVzaChoKX10LmNvbm5lY3RTZXJpZXMuYXBwbHkodCx0aGlzLl9hbGxwYXNzRmlsdGVyc0wpLHQuY29ubmVjdFNlcmllcy5hcHBseSh0LHRoaXMuX2FsbHBhc3NGaWx0ZXJzUiksdGhpcy5fYWxscGFzc0ZpbHRlcnNMW3RoaXMuX2FsbHBhc3NGaWx0ZXJzTC5sZW5ndGgtMV0uY29ubmVjdCh0aGlzLmVmZmVjdFJldHVybkwpLHRoaXMuX2FsbHBhc3NGaWx0ZXJzUlt0aGlzLl9hbGxwYXNzRmlsdGVyc1IubGVuZ3RoLTFdLmNvbm5lY3QodGhpcy5lZmZlY3RSZXR1cm5SKSx0aGlzLl9yZWFkT25seShbXCJyb29tU2l6ZVwiLFwiZGFtcGVuaW5nXCJdKX0sdC5leHRlbmQodC5GcmVldmVyYix0LlN0ZXJlb0VmZmVjdCksdC5GcmVldmVyYi5kZWZhdWx0cz17cm9vbVNpemU6LjcsZGFtcGVuaW5nOjNlM30sdC5GcmVldmVyYi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3QuU3RlcmVvRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7Zm9yKHZhciBlPTA7ZTx0aGlzLl9hbGxwYXNzRmlsdGVyc0wubGVuZ3RoO2UrKyl0aGlzLl9hbGxwYXNzRmlsdGVyc0xbZV0uZGlzY29ubmVjdCgpLHRoaXMuX2FsbHBhc3NGaWx0ZXJzTFtlXT1udWxsO3RoaXMuX2FsbHBhc3NGaWx0ZXJzTD1udWxsO2Zvcih2YXIgaT0wO2k8dGhpcy5fYWxscGFzc0ZpbHRlcnNSLmxlbmd0aDtpKyspdGhpcy5fYWxscGFzc0ZpbHRlcnNSW2ldLmRpc2Nvbm5lY3QoKSx0aGlzLl9hbGxwYXNzRmlsdGVyc1JbaV09bnVsbDt0aGlzLl9hbGxwYXNzRmlsdGVyc1I9bnVsbDtmb3IodmFyIG49MDtuPHRoaXMuX2NvbWJGaWx0ZXJzLmxlbmd0aDtuKyspdGhpcy5fY29tYkZpbHRlcnNbbl0uZGlzcG9zZSgpLHRoaXMuX2NvbWJGaWx0ZXJzW25dPW51bGw7cmV0dXJuIHRoaXMuX2NvbWJGaWx0ZXJzPW51bGwsdGhpcy5fd3JpdGFibGUoW1wicm9vbVNpemVcIixcImRhbXBlbmluZ1wiXSksdGhpcy5yb29tU2l6ZS5kaXNwb3NlKCksdGhpcy5yb29tU2l6ZT1udWxsLHRoaXMuZGFtcGVuaW5nLmRpc3Bvc2UoKSx0aGlzLmRhbXBlbmluZz1udWxsLHRoaXN9LHQuRnJlZXZlcmJ9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMzIpLGkoMSksaSgxOCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkZlZWRiYWNrRGVsYXk9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJkZWxheVRpbWVcIixcImZlZWRiYWNrXCJdLHQuRmVlZGJhY2tEZWxheSk7dC5GZWVkYmFja0VmZmVjdC5jYWxsKHRoaXMsZSksdGhpcy5fZGVsYXlOb2RlPW5ldyB0LkRlbGF5KGUuZGVsYXlUaW1lLGUubWF4RGVsYXkpLHRoaXMuZGVsYXlUaW1lPXRoaXMuX2RlbGF5Tm9kZS5kZWxheVRpbWUsdGhpcy5jb25uZWN0RWZmZWN0KHRoaXMuX2RlbGF5Tm9kZSksdGhpcy5fcmVhZE9ubHkoW1wiZGVsYXlUaW1lXCJdKX0sdC5leHRlbmQodC5GZWVkYmFja0RlbGF5LHQuRmVlZGJhY2tFZmZlY3QpLHQuRmVlZGJhY2tEZWxheS5kZWZhdWx0cz17ZGVsYXlUaW1lOi4yNSxtYXhEZWxheToxfSx0LkZlZWRiYWNrRGVsYXkucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5GZWVkYmFja0VmZmVjdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX2RlbGF5Tm9kZS5kaXNwb3NlKCksdGhpcy5fZGVsYXlOb2RlPW51bGwsdGhpcy5fd3JpdGFibGUoW1wiZGVsYXlUaW1lXCJdKSx0aGlzLmRlbGF5VGltZT1udWxsLHRoaXN9LHQuRmVlZGJhY2tEZWxheX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg4KSxpKDcpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5EaXN0b3J0aW9uPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiZGlzdG9ydGlvblwiXSx0LkRpc3RvcnRpb24pO3QuRWZmZWN0LmNhbGwodGhpcyxlKSx0aGlzLl9zaGFwZXI9bmV3IHQuV2F2ZVNoYXBlcig0MDk2KSx0aGlzLl9kaXN0b3J0aW9uPWUuZGlzdG9ydGlvbix0aGlzLmNvbm5lY3RFZmZlY3QodGhpcy5fc2hhcGVyKSx0aGlzLmRpc3RvcnRpb249ZS5kaXN0b3J0aW9uLHRoaXMub3ZlcnNhbXBsZT1lLm92ZXJzYW1wbGV9LHQuZXh0ZW5kKHQuRGlzdG9ydGlvbix0LkVmZmVjdCksdC5EaXN0b3J0aW9uLmRlZmF1bHRzPXtkaXN0b3J0aW9uOi40LG92ZXJzYW1wbGU6XCJub25lXCJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkRpc3RvcnRpb24ucHJvdG90eXBlLFwiZGlzdG9ydGlvblwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzdG9ydGlvbn0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2Rpc3RvcnRpb249dDt2YXIgZT0xMDAqdCxpPU1hdGguUEkvMTgwO3RoaXMuX3NoYXBlci5zZXRNYXAoZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguYWJzKHQpPC4wMDE/MDooMytlKSp0KjIwKmkvKE1hdGguUEkrZSpNYXRoLmFicyh0KSl9KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5EaXN0b3J0aW9uLnByb3RvdHlwZSxcIm92ZXJzYW1wbGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NoYXBlci5vdmVyc2FtcGxlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fc2hhcGVyLm92ZXJzYW1wbGU9dH19KSx0LkRpc3RvcnRpb24ucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5FZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9zaGFwZXIuZGlzcG9zZSgpLHRoaXMuX3NoYXBlcj1udWxsLHRoaXN9LHQuRGlzdG9ydGlvbn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxMiksaSgxNSksaSgxOCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkNob3J1cz1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcImZyZXF1ZW5jeVwiLFwiZGVsYXlUaW1lXCIsXCJkZXB0aFwiXSx0LkNob3J1cyk7dC5TdGVyZW9FZmZlY3QuY2FsbCh0aGlzLGUpLHRoaXMuX2RlcHRoPWUuZGVwdGgsdGhpcy5fZGVsYXlUaW1lPWUuZGVsYXlUaW1lLzFlMyx0aGlzLl9sZm9MPW5ldyB0LkxGTyh7ZnJlcXVlbmN5OmUuZnJlcXVlbmN5LG1pbjowLG1heDoxfSksdGhpcy5fbGZvUj1uZXcgdC5MRk8oe2ZyZXF1ZW5jeTplLmZyZXF1ZW5jeSxtaW46MCxtYXg6MSxwaGFzZToxODB9KSx0aGlzLl9kZWxheU5vZGVMPW5ldyB0LkRlbGF5LHRoaXMuX2RlbGF5Tm9kZVI9bmV3IHQuRGVsYXksdGhpcy5mcmVxdWVuY3k9dGhpcy5fbGZvTC5mcmVxdWVuY3ksdGhpcy5lZmZlY3RTZW5kTC5jaGFpbih0aGlzLl9kZWxheU5vZGVMLHRoaXMuZWZmZWN0UmV0dXJuTCksdGhpcy5lZmZlY3RTZW5kUi5jaGFpbih0aGlzLl9kZWxheU5vZGVSLHRoaXMuZWZmZWN0UmV0dXJuUiksdGhpcy5lZmZlY3RTZW5kTC5jb25uZWN0KHRoaXMuZWZmZWN0UmV0dXJuTCksdGhpcy5lZmZlY3RTZW5kUi5jb25uZWN0KHRoaXMuZWZmZWN0UmV0dXJuUiksdGhpcy5fbGZvTC5jb25uZWN0KHRoaXMuX2RlbGF5Tm9kZUwuZGVsYXlUaW1lKSx0aGlzLl9sZm9SLmNvbm5lY3QodGhpcy5fZGVsYXlOb2RlUi5kZWxheVRpbWUpLHRoaXMuX2xmb0wuc3RhcnQoKSx0aGlzLl9sZm9SLnN0YXJ0KCksdGhpcy5fbGZvTC5mcmVxdWVuY3kuY29ubmVjdCh0aGlzLl9sZm9SLmZyZXF1ZW5jeSksdGhpcy5kZXB0aD10aGlzLl9kZXB0aCx0aGlzLmZyZXF1ZW5jeS52YWx1ZT1lLmZyZXF1ZW5jeSx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuX3JlYWRPbmx5KFtcImZyZXF1ZW5jeVwiXSksdGhpcy5zcHJlYWQ9ZS5zcHJlYWR9LHQuZXh0ZW5kKHQuQ2hvcnVzLHQuU3RlcmVvRWZmZWN0KSx0LkNob3J1cy5kZWZhdWx0cz17ZnJlcXVlbmN5OjEuNSxkZWxheVRpbWU6My41LGRlcHRoOi43LHR5cGU6XCJzaW5lXCIsc3ByZWFkOjE4MH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQ2hvcnVzLnByb3RvdHlwZSxcImRlcHRoXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZXB0aH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2RlcHRoPXQ7dmFyIGU9dGhpcy5fZGVsYXlUaW1lKnQ7dGhpcy5fbGZvTC5taW49TWF0aC5tYXgodGhpcy5fZGVsYXlUaW1lLWUsMCksdGhpcy5fbGZvTC5tYXg9dGhpcy5fZGVsYXlUaW1lK2UsdGhpcy5fbGZvUi5taW49TWF0aC5tYXgodGhpcy5fZGVsYXlUaW1lLWUsMCksdGhpcy5fbGZvUi5tYXg9dGhpcy5fZGVsYXlUaW1lK2V9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQ2hvcnVzLnByb3RvdHlwZSxcImRlbGF5VGltZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMWUzKnRoaXMuX2RlbGF5VGltZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2RlbGF5VGltZT10LzFlMyx0aGlzLmRlcHRoPXRoaXMuX2RlcHRofX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkNob3J1cy5wcm90b3R5cGUsXCJ0eXBlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sZm9MLnR5cGV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9sZm9MLnR5cGU9dCx0aGlzLl9sZm9SLnR5cGU9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5DaG9ydXMucHJvdG90eXBlLFwic3ByZWFkXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sZm9SLnBoYXNlLXRoaXMuX2xmb0wucGhhc2V9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9sZm9MLnBoYXNlPTkwLXQvMix0aGlzLl9sZm9SLnBoYXNlPXQvMis5MH19KSx0LkNob3J1cy5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LlN0ZXJlb0VmZmVjdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX2xmb0wuZGlzcG9zZSgpLHRoaXMuX2xmb0w9bnVsbCx0aGlzLl9sZm9SLmRpc3Bvc2UoKSx0aGlzLl9sZm9SPW51bGwsdGhpcy5fZGVsYXlOb2RlTC5kaXNwb3NlKCksdGhpcy5fZGVsYXlOb2RlTD1udWxsLHRoaXMuX2RlbGF5Tm9kZVIuZGlzcG9zZSgpLHRoaXMuX2RlbGF5Tm9kZVI9bnVsbCx0aGlzLl93cml0YWJsZShcImZyZXF1ZW5jeVwiKSx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXN9LHQuQ2hvcnVzfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDgpLGkoNyldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkNoZWJ5c2hldj1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcIm9yZGVyXCJdLHQuQ2hlYnlzaGV2KTt0LkVmZmVjdC5jYWxsKHRoaXMsZSksdGhpcy5fc2hhcGVyPW5ldyB0LldhdmVTaGFwZXIoNDA5NiksdGhpcy5fb3JkZXI9ZS5vcmRlcix0aGlzLmNvbm5lY3RFZmZlY3QodGhpcy5fc2hhcGVyKSx0aGlzLm9yZGVyPWUub3JkZXIsdGhpcy5vdmVyc2FtcGxlPWUub3ZlcnNhbXBsZX0sdC5leHRlbmQodC5DaGVieXNoZXYsdC5FZmZlY3QpLHQuQ2hlYnlzaGV2LmRlZmF1bHRzPXtvcmRlcjoxLG92ZXJzYW1wbGU6XCJub25lXCJ9LHQuQ2hlYnlzaGV2LnByb3RvdHlwZS5fZ2V0Q29lZmZpY2llbnQ9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBpLmhhc093blByb3BlcnR5KGUpP2lbZV06KGlbZV09MD09PWU/MDoxPT09ZT90OjIqdCp0aGlzLl9nZXRDb2VmZmljaWVudCh0LGUtMSxpKS10aGlzLl9nZXRDb2VmZmljaWVudCh0LGUtMixpKSxpW2VdKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQ2hlYnlzaGV2LnByb3RvdHlwZSxcIm9yZGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vcmRlcn0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX29yZGVyPXQ7Zm9yKHZhciBlPW5ldyBBcnJheSg0MDk2KSxpPWUubGVuZ3RoLG49MDtuPGk7KytuKXt2YXIgbz0yKm4vaS0xO2Vbbl09MD09PW8/MDp0aGlzLl9nZXRDb2VmZmljaWVudChvLHQse30pfXRoaXMuX3NoYXBlci5jdXJ2ZT1lfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkNoZWJ5c2hldi5wcm90b3R5cGUsXCJvdmVyc2FtcGxlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGFwZXIub3ZlcnNhbXBsZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3NoYXBlci5vdmVyc2FtcGxlPXR9fSksdC5DaGVieXNoZXYucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5FZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9zaGFwZXIuZGlzcG9zZSgpLHRoaXMuX3NoYXBlcj1udWxsLHRoaXN9LHQuQ2hlYnlzaGV2fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDgpLGkoMTMpLGkoNzcpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5CaXRDcnVzaGVyPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiYml0c1wiXSx0LkJpdENydXNoZXIpO3QuRWZmZWN0LmNhbGwodGhpcyxlKTt2YXIgaT0xL01hdGgucG93KDIsZS5iaXRzLTEpO3RoaXMuX3N1YnRyYWN0PW5ldyB0LlN1YnRyYWN0LHRoaXMuX21vZHVsbz1uZXcgdC5Nb2R1bG8oaSksdGhpcy5fYml0cz1lLmJpdHMsdGhpcy5lZmZlY3RTZW5kLmZhbih0aGlzLl9zdWJ0cmFjdCx0aGlzLl9tb2R1bG8pLHRoaXMuX21vZHVsby5jb25uZWN0KHRoaXMuX3N1YnRyYWN0LDAsMSksdGhpcy5fc3VidHJhY3QuY29ubmVjdCh0aGlzLmVmZmVjdFJldHVybil9LHQuZXh0ZW5kKHQuQml0Q3J1c2hlcix0LkVmZmVjdCksdC5CaXRDcnVzaGVyLmRlZmF1bHRzPXtiaXRzOjR9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkJpdENydXNoZXIucHJvdG90eXBlLFwiYml0c1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYml0c30sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2JpdHM9dDt2YXIgZT0xL01hdGgucG93KDIsdC0xKTt0aGlzLl9tb2R1bG8udmFsdWU9ZX19KSx0LkJpdENydXNoZXIucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5FZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9zdWJ0cmFjdC5kaXNwb3NlKCksdGhpcy5fc3VidHJhY3Q9bnVsbCx0aGlzLl9tb2R1bG8uZGlzcG9zZSgpLHRoaXMuX21vZHVsbz1udWxsLHRoaXN9LHQuQml0Q3J1c2hlcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg1NyksaSg0MiksaSg4KSxpKDkpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5BdXRvV2FoPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiYmFzZUZyZXF1ZW5jeVwiLFwib2N0YXZlc1wiLFwic2Vuc2l0aXZpdHlcIl0sdC5BdXRvV2FoKTt0LkVmZmVjdC5jYWxsKHRoaXMsZSksdGhpcy5mb2xsb3dlcj1uZXcgdC5Gb2xsb3dlcihlLmZvbGxvd2VyKSx0aGlzLl9zd2VlcFJhbmdlPW5ldyB0LlNjYWxlRXhwKDAsMSwuNSksdGhpcy5fYmFzZUZyZXF1ZW5jeT1lLmJhc2VGcmVxdWVuY3ksdGhpcy5fb2N0YXZlcz1lLm9jdGF2ZXMsdGhpcy5faW5wdXRCb29zdD1uZXcgdC5HYWluLHRoaXMuX2JhbmRwYXNzPW5ldyB0LkZpbHRlcih7cm9sbG9mZjotNDgsZnJlcXVlbmN5OjAsUTplLlF9KSx0aGlzLl9wZWFraW5nPW5ldyB0LkZpbHRlcigwLFwicGVha2luZ1wiKSx0aGlzLl9wZWFraW5nLmdhaW4udmFsdWU9ZS5nYWluLHRoaXMuZ2Fpbj10aGlzLl9wZWFraW5nLmdhaW4sdGhpcy5RPXRoaXMuX2JhbmRwYXNzLlEsdGhpcy5lZmZlY3RTZW5kLmNoYWluKHRoaXMuX2lucHV0Qm9vc3QsdGhpcy5mb2xsb3dlcix0aGlzLl9zd2VlcFJhbmdlKSx0aGlzLl9zd2VlcFJhbmdlLmNvbm5lY3QodGhpcy5fYmFuZHBhc3MuZnJlcXVlbmN5KSx0aGlzLl9zd2VlcFJhbmdlLmNvbm5lY3QodGhpcy5fcGVha2luZy5mcmVxdWVuY3kpLHRoaXMuZWZmZWN0U2VuZC5jaGFpbih0aGlzLl9iYW5kcGFzcyx0aGlzLl9wZWFraW5nLHRoaXMuZWZmZWN0UmV0dXJuKSx0aGlzLl9zZXRTd2VlcFJhbmdlKCksdGhpcy5zZW5zaXRpdml0eT1lLnNlbnNpdGl2aXR5LHRoaXMuX3JlYWRPbmx5KFtcImdhaW5cIixcIlFcIl0pfSx0LmV4dGVuZCh0LkF1dG9XYWgsdC5FZmZlY3QpLHQuQXV0b1dhaC5kZWZhdWx0cz17YmFzZUZyZXF1ZW5jeToxMDAsb2N0YXZlczo2LHNlbnNpdGl2aXR5OjAsUToyLGdhaW46Mixmb2xsb3dlcjp7YXR0YWNrOi4zLHJlbGVhc2U6LjV9fSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BdXRvV2FoLnByb3RvdHlwZSxcIm9jdGF2ZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29jdGF2ZXN9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9vY3RhdmVzPXQsdGhpcy5fc2V0U3dlZXBSYW5nZSgpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkF1dG9XYWgucHJvdG90eXBlLFwiYmFzZUZyZXF1ZW5jeVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFzZUZyZXF1ZW5jeX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2Jhc2VGcmVxdWVuY3k9dCx0aGlzLl9zZXRTd2VlcFJhbmdlKCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQXV0b1dhaC5wcm90b3R5cGUsXCJzZW5zaXRpdml0eVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5nYWluVG9EYigxL3RoaXMuX2lucHV0Qm9vc3QuZ2Fpbi52YWx1ZSl9LHNldDpmdW5jdGlvbihlKXt0aGlzLl9pbnB1dEJvb3N0LmdhaW4udmFsdWU9MS90LmRiVG9HYWluKGUpfX0pLHQuQXV0b1dhaC5wcm90b3R5cGUuX3NldFN3ZWVwUmFuZ2U9ZnVuY3Rpb24oKXt0aGlzLl9zd2VlcFJhbmdlLm1pbj10aGlzLl9iYXNlRnJlcXVlbmN5LHRoaXMuX3N3ZWVwUmFuZ2UubWF4PU1hdGgubWluKHRoaXMuX2Jhc2VGcmVxdWVuY3kqTWF0aC5wb3coMix0aGlzLl9vY3RhdmVzKSx0aGlzLmNvbnRleHQuc2FtcGxlUmF0ZS8yKX0sdC5BdXRvV2FoLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5mb2xsb3dlci5kaXNwb3NlKCksdGhpcy5mb2xsb3dlcj1udWxsLHRoaXMuX3N3ZWVwUmFuZ2UuZGlzcG9zZSgpLHRoaXMuX3N3ZWVwUmFuZ2U9bnVsbCx0aGlzLl9iYW5kcGFzcy5kaXNwb3NlKCksdGhpcy5fYmFuZHBhc3M9bnVsbCx0aGlzLl9wZWFraW5nLmRpc3Bvc2UoKSx0aGlzLl9wZWFraW5nPW51bGwsdGhpcy5faW5wdXRCb29zdC5kaXNwb3NlKCksdGhpcy5faW5wdXRCb29zdD1udWxsLHRoaXMuX3dyaXRhYmxlKFtcImdhaW5cIixcIlFcIl0pLHRoaXMuZ2Fpbj1udWxsLHRoaXMuUT1udWxsLHRoaXN9LHQuQXV0b1dhaH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg4KSxpKDEyKSxpKDYwKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuQXV0b1Bhbm5lcj1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcImZyZXF1ZW5jeVwiXSx0LkF1dG9QYW5uZXIpO3QuRWZmZWN0LmNhbGwodGhpcyxlKSx0aGlzLl9sZm89bmV3IHQuTEZPKHtmcmVxdWVuY3k6ZS5mcmVxdWVuY3ksYW1wbGl0dWRlOmUuZGVwdGgsbWluOi0xLG1heDoxfSksdGhpcy5kZXB0aD10aGlzLl9sZm8uYW1wbGl0dWRlLHRoaXMuX3Bhbm5lcj1uZXcgdC5QYW5uZXIsdGhpcy5mcmVxdWVuY3k9dGhpcy5fbGZvLmZyZXF1ZW5jeSx0aGlzLmNvbm5lY3RFZmZlY3QodGhpcy5fcGFubmVyKSx0aGlzLl9sZm8uY29ubmVjdCh0aGlzLl9wYW5uZXIucGFuKSx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuX3JlYWRPbmx5KFtcImRlcHRoXCIsXCJmcmVxdWVuY3lcIl0pfSx0LmV4dGVuZCh0LkF1dG9QYW5uZXIsdC5FZmZlY3QpLHQuQXV0b1Bhbm5lci5kZWZhdWx0cz17ZnJlcXVlbmN5OjEsdHlwZTpcInNpbmVcIixkZXB0aDoxfSx0LkF1dG9QYW5uZXIucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9sZm8uc3RhcnQodCksdGhpc30sdC5BdXRvUGFubmVyLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9sZm8uc3RvcCh0KSx0aGlzfSx0LkF1dG9QYW5uZXIucHJvdG90eXBlLnN5bmM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2xmby5zeW5jKHQpLHRoaXN9LHQuQXV0b1Bhbm5lci5wcm90b3R5cGUudW5zeW5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xmby51bnN5bmMoKSx0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BdXRvUGFubmVyLnByb3RvdHlwZSxcInR5cGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xmby50eXBlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbGZvLnR5cGU9dH19KSx0LkF1dG9QYW5uZXIucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5FZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9sZm8uZGlzcG9zZSgpLHRoaXMuX2xmbz1udWxsLHRoaXMuX3Bhbm5lci5kaXNwb3NlKCksdGhpcy5fcGFubmVyPW51bGwsdGhpcy5fd3JpdGFibGUoW1wiZGVwdGhcIixcImZyZXF1ZW5jeVwiXSksdGhpcy5mcmVxdWVuY3k9bnVsbCx0aGlzLmRlcHRoPW51bGwsdGhpc30sdC5BdXRvUGFubmVyfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDgpLGkoMTIpLGkoOSldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkF1dG9GaWx0ZXI9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJmcmVxdWVuY3lcIixcImJhc2VGcmVxdWVuY3lcIixcIm9jdGF2ZXNcIl0sdC5BdXRvRmlsdGVyKTt0LkVmZmVjdC5jYWxsKHRoaXMsZSksdGhpcy5fbGZvPW5ldyB0LkxGTyh7ZnJlcXVlbmN5OmUuZnJlcXVlbmN5LGFtcGxpdHVkZTplLmRlcHRofSksdGhpcy5kZXB0aD10aGlzLl9sZm8uYW1wbGl0dWRlLHRoaXMuZnJlcXVlbmN5PXRoaXMuX2xmby5mcmVxdWVuY3ksdGhpcy5maWx0ZXI9bmV3IHQuRmlsdGVyKGUuZmlsdGVyKSx0aGlzLl9vY3RhdmVzPTAsdGhpcy5jb25uZWN0RWZmZWN0KHRoaXMuZmlsdGVyKSx0aGlzLl9sZm8uY29ubmVjdCh0aGlzLmZpbHRlci5mcmVxdWVuY3kpLHRoaXMudHlwZT1lLnR5cGUsdGhpcy5fcmVhZE9ubHkoW1wiZnJlcXVlbmN5XCIsXCJkZXB0aFwiXSksdGhpcy5vY3RhdmVzPWUub2N0YXZlcyx0aGlzLmJhc2VGcmVxdWVuY3k9ZS5iYXNlRnJlcXVlbmN5fSx0LmV4dGVuZCh0LkF1dG9GaWx0ZXIsdC5FZmZlY3QpLHQuQXV0b0ZpbHRlci5kZWZhdWx0cz17ZnJlcXVlbmN5OjEsdHlwZTpcInNpbmVcIixkZXB0aDoxLGJhc2VGcmVxdWVuY3k6MjAwLG9jdGF2ZXM6Mi42LGZpbHRlcjp7dHlwZTpcImxvd3Bhc3NcIixyb2xsb2ZmOi0xMixROjF9fSx0LkF1dG9GaWx0ZXIucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9sZm8uc3RhcnQodCksdGhpc30sdC5BdXRvRmlsdGVyLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9sZm8uc3RvcCh0KSx0aGlzfSx0LkF1dG9GaWx0ZXIucHJvdG90eXBlLnN5bmM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2xmby5zeW5jKHQpLHRoaXN9LHQuQXV0b0ZpbHRlci5wcm90b3R5cGUudW5zeW5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xmby51bnN5bmMoKSx0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BdXRvRmlsdGVyLnByb3RvdHlwZSxcInR5cGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xmby50eXBlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbGZvLnR5cGU9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BdXRvRmlsdGVyLnByb3RvdHlwZSxcImJhc2VGcmVxdWVuY3lcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xmby5taW59LHNldDpmdW5jdGlvbih0KXt0aGlzLl9sZm8ubWluPXRoaXMudG9GcmVxdWVuY3kodCksdGhpcy5vY3RhdmVzPXRoaXMuX29jdGF2ZXN9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQXV0b0ZpbHRlci5wcm90b3R5cGUsXCJvY3RhdmVzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vY3RhdmVzfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fb2N0YXZlcz10LHRoaXMuX2xmby5tYXg9dGhpcy5iYXNlRnJlcXVlbmN5Kk1hdGgucG93KDIsdCl9fSksdC5BdXRvRmlsdGVyLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fbGZvLmRpc3Bvc2UoKSx0aGlzLl9sZm89bnVsbCx0aGlzLmZpbHRlci5kaXNwb3NlKCksdGhpcy5maWx0ZXI9bnVsbCx0aGlzLl93cml0YWJsZShbXCJmcmVxdWVuY3lcIixcImRlcHRoXCJdKSx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXMuZGVwdGg9bnVsbCx0aGlzfSx0LkF1dG9GaWx0ZXJ9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMjMpLGkoMTApLGkoMTkpLGkoMSksaSgyMiksaSgyOCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3QuTGlzdGVuZXI9ZnVuY3Rpb24oKXt0LmNhbGwodGhpcyksdGhpcy5fb3JpZW50YXRpb249WzAsMCwwLDAsMCwwXSx0aGlzLl9wb3NpdGlvbj1bMCwwLDBdLHQuZ2V0Q29udGV4dChmdW5jdGlvbigpe3RoaXMuc2V0KGUuZGVmYXVsdHMpLHRoaXMuY29udGV4dC5saXN0ZW5lcj10aGlzfS5iaW5kKHRoaXMpKX0sdC5leHRlbmQodC5MaXN0ZW5lciksdC5MaXN0ZW5lci5kZWZhdWx0cz17cG9zaXRpb25YOjAscG9zaXRpb25ZOjAscG9zaXRpb25aOjAsZm9yd2FyZFg6MCxmb3J3YXJkWTowLGZvcndhcmRaOjEsdXBYOjAsdXBZOjEsdXBaOjB9LHQuTGlzdGVuZXIucHJvdG90eXBlLmlzTGlzdGVuZXI9ITAsdC5MaXN0ZW5lci5wcm90b3R5cGUuX3JhbXBUaW1lQ29uc3RhbnQ9LjAxLHQuTGlzdGVuZXIucHJvdG90eXBlLnNldFBvc2l0aW9uPWZ1bmN0aW9uKHQsZSxpKXtpZih0aGlzLmNvbnRleHQucmF3Q29udGV4dC5saXN0ZW5lci5wb3NpdGlvblgpe3ZhciBuPXRoaXMubm93KCk7dGhpcy5jb250ZXh0LnJhd0NvbnRleHQubGlzdGVuZXIucG9zaXRpb25YLnNldFRhcmdldEF0VGltZSh0LG4sdGhpcy5fcmFtcFRpbWVDb25zdGFudCksdGhpcy5jb250ZXh0LnJhd0NvbnRleHQubGlzdGVuZXIucG9zaXRpb25ZLnNldFRhcmdldEF0VGltZShlLG4sdGhpcy5fcmFtcFRpbWVDb25zdGFudCksdGhpcy5jb250ZXh0LnJhd0NvbnRleHQubGlzdGVuZXIucG9zaXRpb25aLnNldFRhcmdldEF0VGltZShpLG4sdGhpcy5fcmFtcFRpbWVDb25zdGFudCl9ZWxzZSB0aGlzLmNvbnRleHQucmF3Q29udGV4dC5saXN0ZW5lci5zZXRQb3NpdGlvbih0LGUsaSk7cmV0dXJuIHRoaXMuX3Bvc2l0aW9uPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksdGhpc30sdC5MaXN0ZW5lci5wcm90b3R5cGUuc2V0T3JpZW50YXRpb249ZnVuY3Rpb24odCxlLGksbixvLHMpe2lmKHRoaXMuY29udGV4dC5yYXdDb250ZXh0Lmxpc3RlbmVyLmZvcndhcmRYKXt2YXIgcj10aGlzLm5vdygpO3RoaXMuY29udGV4dC5yYXdDb250ZXh0Lmxpc3RlbmVyLmZvcndhcmRYLnNldFRhcmdldEF0VGltZSh0LHIsdGhpcy5fcmFtcFRpbWVDb25zdGFudCksdGhpcy5jb250ZXh0LnJhd0NvbnRleHQubGlzdGVuZXIuZm9yd2FyZFkuc2V0VGFyZ2V0QXRUaW1lKGUscix0aGlzLl9yYW1wVGltZUNvbnN0YW50KSx0aGlzLmNvbnRleHQucmF3Q29udGV4dC5saXN0ZW5lci5mb3J3YXJkWi5zZXRUYXJnZXRBdFRpbWUoaSxyLHRoaXMuX3JhbXBUaW1lQ29uc3RhbnQpLHRoaXMuY29udGV4dC5yYXdDb250ZXh0Lmxpc3RlbmVyLnVwWC5zZXRUYXJnZXRBdFRpbWUobixyLHRoaXMuX3JhbXBUaW1lQ29uc3RhbnQpLHRoaXMuY29udGV4dC5yYXdDb250ZXh0Lmxpc3RlbmVyLnVwWS5zZXRUYXJnZXRBdFRpbWUobyxyLHRoaXMuX3JhbXBUaW1lQ29uc3RhbnQpLHRoaXMuY29udGV4dC5yYXdDb250ZXh0Lmxpc3RlbmVyLnVwWi5zZXRUYXJnZXRBdFRpbWUocyxyLHRoaXMuX3JhbXBUaW1lQ29uc3RhbnQpfWVsc2UgdGhpcy5jb250ZXh0LnJhd0NvbnRleHQubGlzdGVuZXIuc2V0T3JpZW50YXRpb24odCxlLGksbixvLHMpO3JldHVybiB0aGlzLl9vcmllbnRhdGlvbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lkxpc3RlbmVyLnByb3RvdHlwZSxcInBvc2l0aW9uWFwiLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fcG9zaXRpb25bMF09dCx0aGlzLnNldFBvc2l0aW9uLmFwcGx5KHRoaXMsdGhpcy5fcG9zaXRpb24pfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9zaXRpb25bMF19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuTGlzdGVuZXIucHJvdG90eXBlLFwicG9zaXRpb25ZXCIse3NldDpmdW5jdGlvbih0KXt0aGlzLl9wb3NpdGlvblsxXT10LHRoaXMuc2V0UG9zaXRpb24uYXBwbHkodGhpcyx0aGlzLl9wb3NpdGlvbil9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3NpdGlvblsxXX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5MaXN0ZW5lci5wcm90b3R5cGUsXCJwb3NpdGlvblpcIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3Bvc2l0aW9uWzJdPXQsdGhpcy5zZXRQb3NpdGlvbi5hcHBseSh0aGlzLHRoaXMuX3Bvc2l0aW9uKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Bvc2l0aW9uWzJdfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lkxpc3RlbmVyLnByb3RvdHlwZSxcImZvcndhcmRYXCIse3NldDpmdW5jdGlvbih0KXt0aGlzLl9vcmllbnRhdGlvblswXT10LHRoaXMuc2V0T3JpZW50YXRpb24uYXBwbHkodGhpcyx0aGlzLl9vcmllbnRhdGlvbil9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vcmllbnRhdGlvblswXX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5MaXN0ZW5lci5wcm90b3R5cGUsXCJmb3J3YXJkWVwiLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fb3JpZW50YXRpb25bMV09dCx0aGlzLnNldE9yaWVudGF0aW9uLmFwcGx5KHRoaXMsdGhpcy5fb3JpZW50YXRpb24pfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JpZW50YXRpb25bMV19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuTGlzdGVuZXIucHJvdG90eXBlLFwiZm9yd2FyZFpcIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX29yaWVudGF0aW9uWzJdPXQsdGhpcy5zZXRPcmllbnRhdGlvbi5hcHBseSh0aGlzLHRoaXMuX29yaWVudGF0aW9uKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGF0aW9uWzJdfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lkxpc3RlbmVyLnByb3RvdHlwZSxcInVwWFwiLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fb3JpZW50YXRpb25bM109dCx0aGlzLnNldE9yaWVudGF0aW9uLmFwcGx5KHRoaXMsdGhpcy5fb3JpZW50YXRpb24pfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JpZW50YXRpb25bM119fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuTGlzdGVuZXIucHJvdG90eXBlLFwidXBZXCIse3NldDpmdW5jdGlvbih0KXt0aGlzLl9vcmllbnRhdGlvbls0XT10LHRoaXMuc2V0T3JpZW50YXRpb24uYXBwbHkodGhpcyx0aGlzLl9vcmllbnRhdGlvbil9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vcmllbnRhdGlvbls0XX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5MaXN0ZW5lci5wcm90b3R5cGUsXCJ1cFpcIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX29yaWVudGF0aW9uWzVdPXQsdGhpcy5zZXRPcmllbnRhdGlvbi5hcHBseSh0aGlzLHRoaXMuX29yaWVudGF0aW9uKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGF0aW9uWzVdfX0pLHQuTGlzdGVuZXIucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JpZW50YXRpb249bnVsbCx0aGlzLl9wb3NpdGlvbj1udWxsLHRoaXN9O3ZhciBlPXQuTGlzdGVuZXI7cmV0dXJuIHQuTGlzdGVuZXI9bmV3IGUsdC5Db250ZXh0Lm9uKFwiaW5pdFwiLGZ1bmN0aW9uKGkpe2kubGlzdGVuZXImJmkubGlzdGVuZXIuaXNMaXN0ZW5lcj90Lkxpc3RlbmVyPWkubGlzdGVuZXI6dC5MaXN0ZW5lcj1uZXcgZX0pLHQuTGlzdGVuZXJ9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMjQpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5EcmF3PWZ1bmN0aW9uKCl7dC5jYWxsKHRoaXMpLHRoaXMuX2V2ZW50cz1uZXcgdC5UaW1lbGluZSx0aGlzLmV4cGlyYXRpb249LjI1LHRoaXMuYW50aWNpcGF0aW9uPS4wMDgsdGhpcy5fYm91bmREcmF3TG9vcD10aGlzLl9kcmF3TG9vcC5iaW5kKHRoaXMpfSx0LmV4dGVuZCh0LkRyYXcpLHQuRHJhdy5wcm90b3R5cGUuc2NoZWR1bGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZXZlbnRzLmFkZCh7Y2FsbGJhY2s6dCx0aW1lOnRoaXMudG9TZWNvbmRzKGUpfSksMT09PXRoaXMuX2V2ZW50cy5sZW5ndGgmJnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9ib3VuZERyYXdMb29wKSx0aGlzfSx0LkRyYXcucHJvdG90eXBlLmNhbmNlbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZXZlbnRzLmNhbmNlbCh0aGlzLnRvU2Vjb25kcyh0KSksdGhpc30sdC5EcmF3LnByb3RvdHlwZS5fZHJhd0xvb3A9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dC5jb250ZXh0LmN1cnJlbnRUaW1lO3RoaXMuX2V2ZW50cy5sZW5ndGgmJnRoaXMuX2V2ZW50cy5wZWVrKCkudGltZS10aGlzLmFudGljaXBhdGlvbjw9ZTspe3ZhciBpPXRoaXMuX2V2ZW50cy5zaGlmdCgpO2UtaS50aW1lPD10aGlzLmV4cGlyYXRpb24mJmkuY2FsbGJhY2soKX10aGlzLl9ldmVudHMubGVuZ3RoPjAmJnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9ib3VuZERyYXdMb29wKX0sdC5EcmF3PW5ldyB0LkRyYXcsdC5EcmF3fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDMpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjt2YXIgZT17fTtyZXR1cm4gdC5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihpLG4pe2UuaGFzT3duUHJvcGVydHkoaSl8fChlW2ldPXRoaXMuY29udGV4dC5jcmVhdGVHYWluKCkpLG49dC5kZWZhdWx0QXJnKG4sMCk7dmFyIG89bmV3IHQuR2FpbihuLHQuVHlwZS5EZWNpYmVscyk7cmV0dXJuIHRoaXMuY29ubmVjdChvKSxvLmNvbm5lY3QoZVtpXSksb30sdC5wcm90b3R5cGUucmVjZWl2ZT1mdW5jdGlvbih0LGkpe3JldHVybiBlLmhhc093blByb3BlcnR5KHQpfHwoZVt0XT10aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpKSxlW3RdLmNvbm5lY3QodGhpcywwLGkpLHRoaXN9LHQuQ29udGV4dC5vbihcImluaXRcIixmdW5jdGlvbih0KXt0LmJ1c2VzP2U9dC5idXNlczooZT17fSx0LmJ1c2VzPWUpfSksdH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg0KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuQ3RybFJhbmRvbT1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcIm1pblwiLFwibWF4XCJdLHQuQ3RybFJhbmRvbSk7dC5jYWxsKHRoaXMpLHRoaXMubWluPWUubWluLHRoaXMubWF4PWUubWF4LHRoaXMuaW50ZWdlcj1lLmludGVnZXJ9LHQuZXh0ZW5kKHQuQ3RybFJhbmRvbSksdC5DdHJsUmFuZG9tLmRlZmF1bHRzPXttaW46MCxtYXg6MSxpbnRlZ2VyOiExfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5DdHJsUmFuZG9tLnByb3RvdHlwZSxcInZhbHVlXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMudG9TZWNvbmRzKHRoaXMubWluKSxlPXRoaXMudG9TZWNvbmRzKHRoaXMubWF4KSxpPU1hdGgucmFuZG9tKCksbj1pKnQrKDEtaSkqZTtyZXR1cm4gdGhpcy5pbnRlZ2VyJiYobj1NYXRoLmZsb29yKG4pKSxufX0pLHQuQ3RybFJhbmRvbX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkN0cmxNYXJrb3Y9ZnVuY3Rpb24oZSxpKXt0LmNhbGwodGhpcyksdGhpcy52YWx1ZXM9dC5kZWZhdWx0QXJnKGUse30pLHRoaXMudmFsdWU9dC5kZWZhdWx0QXJnKGksT2JqZWN0LmtleXModGhpcy52YWx1ZXMpWzBdKX0sdC5leHRlbmQodC5DdHJsTWFya292KSx0LkN0cmxNYXJrb3YucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtpZih0aGlzLnZhbHVlcy5oYXNPd25Qcm9wZXJ0eSh0aGlzLnZhbHVlKSl7dmFyIGU9dGhpcy52YWx1ZXNbdGhpcy52YWx1ZV07aWYodC5pc0FycmF5KGUpKWZvcih2YXIgaT10aGlzLl9nZXRQcm9iRGlzdHJpYnV0aW9uKGUpLG49TWF0aC5yYW5kb20oKSxvPTAscz0wO3M8aS5sZW5ndGg7cysrKXt2YXIgcj1pW3NdO2lmKG4+byYmbjxvK3Ipe3ZhciBhPWVbc107dC5pc09iamVjdChhKT90aGlzLnZhbHVlPWEudmFsdWU6dGhpcy52YWx1ZT1hfW8rPXJ9ZWxzZSB0aGlzLnZhbHVlPWV9cmV0dXJuIHRoaXMudmFsdWV9LHQuQ3RybE1hcmtvdi5wcm90b3R5cGUuX2dldFByb2JEaXN0cmlidXRpb249ZnVuY3Rpb24oZSl7Zm9yKHZhciBpPVtdLG49MCxvPSExLHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIHI9ZVtzXTt0LmlzT2JqZWN0KHIpPyhvPSEwLGlbc109ci5wcm9iYWJpbGl0eSk6aVtzXT0xL2UubGVuZ3RoLG4rPWlbc119aWYobylmb3IodmFyIGE9MDthPGkubGVuZ3RoO2ErKylpW2FdPWlbYV0vbjtyZXR1cm4gaX0sdC5DdHJsTWFya292LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy52YWx1ZXM9bnVsbH0sdC5DdHJsTWFya292fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDQpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5DdHJsSW50ZXJwb2xhdGU9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJ2YWx1ZXNcIixcImluZGV4XCJdLHQuQ3RybEludGVycG9sYXRlKTt0LmNhbGwodGhpcyksdGhpcy52YWx1ZXM9ZS52YWx1ZXMsdGhpcy5pbmRleD1lLmluZGV4fSx0LmV4dGVuZCh0LkN0cmxJbnRlcnBvbGF0ZSksdC5DdHJsSW50ZXJwb2xhdGUuZGVmYXVsdHM9e2luZGV4OjAsdmFsdWVzOltdfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5DdHJsSW50ZXJwb2xhdGUucHJvdG90eXBlLFwidmFsdWVcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5pbmRleDt0PU1hdGgubWluKHQsdGhpcy52YWx1ZXMubGVuZ3RoLTEpO3ZhciBlPU1hdGguZmxvb3IodCksaT10aGlzLnZhbHVlc1tlXSxuPXRoaXMudmFsdWVzW01hdGguY2VpbCh0KV07cmV0dXJuIHRoaXMuX2ludGVycG9sYXRlKHQtZSxpLG4pfX0pLHQuQ3RybEludGVycG9sYXRlLnByb3RvdHlwZS5faW50ZXJwb2xhdGU9ZnVuY3Rpb24oZSxpLG4pe2lmKHQuaXNBcnJheShpKSl7Zm9yKHZhciBvPVtdLHM9MDtzPGkubGVuZ3RoO3MrKylvW3NdPXRoaXMuX2ludGVycG9sYXRlKGUsaVtzXSxuW3NdKTtyZXR1cm4gb31pZih0LmlzT2JqZWN0KGkpKXt2YXIgcj17fTtmb3IodmFyIGEgaW4gaSlyW2FdPXRoaXMuX2ludGVycG9sYXRlKGUsaVthXSxuW2FdKTtyZXR1cm4gcn1yZXR1cm4oMS1lKSooaT10aGlzLl90b051bWJlcihpKSkrZSoobj10aGlzLl90b051bWJlcihuKSl9LHQuQ3RybEludGVycG9sYXRlLnByb3RvdHlwZS5fdG9OdW1iZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuaXNOdW1iZXIoZSk/ZTp0aGlzLnRvU2Vjb25kcyhlKX0sdC5DdHJsSW50ZXJwb2xhdGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLnZhbHVlcz1udWxsfSx0LkN0cmxJbnRlcnBvbGF0ZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg0NCksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuV2F2ZWZvcm09ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJzaXplXCJdLHQuV2F2ZWZvcm0pO2UudHlwZT10LkFuYWx5c2VyLlR5cGUuV2F2ZWZvcm0sdC5BdWRpb05vZGUuY2FsbCh0aGlzKSx0aGlzLl9hbmFseXNlcj10aGlzLmlucHV0PXRoaXMub3V0cHV0PW5ldyB0LkFuYWx5c2VyKGUpfSx0LmV4dGVuZCh0LldhdmVmb3JtLHQuQXVkaW9Ob2RlKSx0LldhdmVmb3JtLmRlZmF1bHRzPXtzaXplOjEwMjR9LHQuV2F2ZWZvcm0ucHJvdG90eXBlLmdldFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FuYWx5c2VyLmdldFZhbHVlKCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LldhdmVmb3JtLnByb3RvdHlwZSxcInNpemVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FuYWx5c2VyLnNpemV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9hbmFseXNlci5zaXplPXR9fSksdC5XYXZlZm9ybS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3QuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fYW5hbHlzZXIuZGlzcG9zZSgpLHRoaXMuX2FuYWx5c2VyPW51bGx9LHQuV2F2ZWZvcm19LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMjMpLGkoMTApLGkoMTkpLGkoMSksaSgyMiksaSgyOCksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuUGFubmVyM0Q9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJwb3NpdGlvblhcIixcInBvc2l0aW9uWVwiLFwicG9zaXRpb25aXCJdLHQuUGFubmVyM0QpO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5fcGFubmVyPXRoaXMuaW5wdXQ9dGhpcy5vdXRwdXQ9dGhpcy5jb250ZXh0LmNyZWF0ZVBhbm5lcigpLHRoaXMuX3Bhbm5lci5wYW5uaW5nTW9kZWw9ZS5wYW5uaW5nTW9kZWwsdGhpcy5fcGFubmVyLm1heERpc3RhbmNlPWUubWF4RGlzdGFuY2UsdGhpcy5fcGFubmVyLmRpc3RhbmNlTW9kZWw9ZS5kaXN0YW5jZU1vZGVsLHRoaXMuX3Bhbm5lci5jb25lT3V0ZXJHYWluPWUuY29uZU91dGVyR2Fpbix0aGlzLl9wYW5uZXIuY29uZU91dGVyQW5nbGU9ZS5jb25lT3V0ZXJBbmdsZSx0aGlzLl9wYW5uZXIuY29uZUlubmVyQW5nbGU9ZS5jb25lSW5uZXJBbmdsZSx0aGlzLl9wYW5uZXIucmVmRGlzdGFuY2U9ZS5yZWZEaXN0YW5jZSx0aGlzLl9wYW5uZXIucm9sbG9mZkZhY3Rvcj1lLnJvbGxvZmZGYWN0b3IsdGhpcy5fb3JpZW50YXRpb249W2Uub3JpZW50YXRpb25YLGUub3JpZW50YXRpb25ZLGUub3JpZW50YXRpb25aXSx0aGlzLl9wb3NpdGlvbj1bZS5wb3NpdGlvblgsZS5wb3NpdGlvblksZS5wb3NpdGlvblpdLHRoaXMub3JpZW50YXRpb25YPWUub3JpZW50YXRpb25YLHRoaXMub3JpZW50YXRpb25ZPWUub3JpZW50YXRpb25ZLHRoaXMub3JpZW50YXRpb25aPWUub3JpZW50YXRpb25aLHRoaXMucG9zaXRpb25YPWUucG9zaXRpb25YLHRoaXMucG9zaXRpb25ZPWUucG9zaXRpb25ZLHRoaXMucG9zaXRpb25aPWUucG9zaXRpb25afSx0LmV4dGVuZCh0LlBhbm5lcjNELHQuQXVkaW9Ob2RlKSx0LlBhbm5lcjNELmRlZmF1bHRzPXtwb3NpdGlvblg6MCxwb3NpdGlvblk6MCxwb3NpdGlvblo6MCxvcmllbnRhdGlvblg6MCxvcmllbnRhdGlvblk6MCxvcmllbnRhdGlvblo6MCxwYW5uaW5nTW9kZWw6XCJlcXVhbHBvd2VyXCIsbWF4RGlzdGFuY2U6MWU0LGRpc3RhbmNlTW9kZWw6XCJpbnZlcnNlXCIsY29uZU91dGVyR2FpbjowLGNvbmVPdXRlckFuZ2xlOjM2MCxjb25lSW5uZXJBbmdsZTozNjAscmVmRGlzdGFuY2U6MSxyb2xsb2ZmRmFjdG9yOjF9LHQuUGFubmVyM0QucHJvdG90eXBlLl9yYW1wVGltZUNvbnN0YW50PS4wMSx0LlBhbm5lcjNELnByb3RvdHlwZS5zZXRQb3NpdGlvbj1mdW5jdGlvbih0LGUsaSl7aWYodGhpcy5fcGFubmVyLnBvc2l0aW9uWCl7dmFyIG49dGhpcy5ub3coKTt0aGlzLl9wYW5uZXIucG9zaXRpb25YLnNldFRhcmdldEF0VGltZSh0LG4sdGhpcy5fcmFtcFRpbWVDb25zdGFudCksdGhpcy5fcGFubmVyLnBvc2l0aW9uWS5zZXRUYXJnZXRBdFRpbWUoZSxuLHRoaXMuX3JhbXBUaW1lQ29uc3RhbnQpLHRoaXMuX3Bhbm5lci5wb3NpdGlvblouc2V0VGFyZ2V0QXRUaW1lKGksbix0aGlzLl9yYW1wVGltZUNvbnN0YW50KX1lbHNlIHRoaXMuX3Bhbm5lci5zZXRQb3NpdGlvbih0LGUsaSk7cmV0dXJuIHRoaXMuX3Bvc2l0aW9uPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksdGhpc30sdC5QYW5uZXIzRC5wcm90b3R5cGUuc2V0T3JpZW50YXRpb249ZnVuY3Rpb24odCxlLGkpe2lmKHRoaXMuX3Bhbm5lci5vcmllbnRhdGlvblgpe3ZhciBuPXRoaXMubm93KCk7dGhpcy5fcGFubmVyLm9yaWVudGF0aW9uWC5zZXRUYXJnZXRBdFRpbWUodCxuLHRoaXMuX3JhbXBUaW1lQ29uc3RhbnQpLHRoaXMuX3Bhbm5lci5vcmllbnRhdGlvblkuc2V0VGFyZ2V0QXRUaW1lKGUsbix0aGlzLl9yYW1wVGltZUNvbnN0YW50KSx0aGlzLl9wYW5uZXIub3JpZW50YXRpb25aLnNldFRhcmdldEF0VGltZShpLG4sdGhpcy5fcmFtcFRpbWVDb25zdGFudCl9ZWxzZSB0aGlzLl9wYW5uZXIuc2V0T3JpZW50YXRpb24odCxlLGkpO3JldHVybiB0aGlzLl9vcmllbnRhdGlvbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlBhbm5lcjNELnByb3RvdHlwZSxcInBvc2l0aW9uWFwiLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fcG9zaXRpb25bMF09dCx0aGlzLnNldFBvc2l0aW9uLmFwcGx5KHRoaXMsdGhpcy5fcG9zaXRpb24pfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9zaXRpb25bMF19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGFubmVyM0QucHJvdG90eXBlLFwicG9zaXRpb25ZXCIse3NldDpmdW5jdGlvbih0KXt0aGlzLl9wb3NpdGlvblsxXT10LHRoaXMuc2V0UG9zaXRpb24uYXBwbHkodGhpcyx0aGlzLl9wb3NpdGlvbil9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3NpdGlvblsxXX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QYW5uZXIzRC5wcm90b3R5cGUsXCJwb3NpdGlvblpcIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3Bvc2l0aW9uWzJdPXQsdGhpcy5zZXRQb3NpdGlvbi5hcHBseSh0aGlzLHRoaXMuX3Bvc2l0aW9uKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Bvc2l0aW9uWzJdfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlBhbm5lcjNELnByb3RvdHlwZSxcIm9yaWVudGF0aW9uWFwiLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fb3JpZW50YXRpb25bMF09dCx0aGlzLnNldE9yaWVudGF0aW9uLmFwcGx5KHRoaXMsdGhpcy5fb3JpZW50YXRpb24pfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JpZW50YXRpb25bMF19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGFubmVyM0QucHJvdG90eXBlLFwib3JpZW50YXRpb25ZXCIse3NldDpmdW5jdGlvbih0KXt0aGlzLl9vcmllbnRhdGlvblsxXT10LHRoaXMuc2V0T3JpZW50YXRpb24uYXBwbHkodGhpcyx0aGlzLl9vcmllbnRhdGlvbil9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vcmllbnRhdGlvblsxXX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QYW5uZXIzRC5wcm90b3R5cGUsXCJvcmllbnRhdGlvblpcIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX29yaWVudGF0aW9uWzJdPXQsdGhpcy5zZXRPcmllbnRhdGlvbi5hcHBseSh0aGlzLHRoaXMuX29yaWVudGF0aW9uKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGF0aW9uWzJdfX0pLHQuUGFubmVyM0QuX2FsaWFzUHJvcGVydHk9ZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGFubmVyM0QucHJvdG90eXBlLGUse3NldDpmdW5jdGlvbih0KXt0aGlzLl9wYW5uZXJbZV09dH0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Bhbm5lcltlXX19KX0sdC5QYW5uZXIzRC5fYWxpYXNQcm9wZXJ0eShcInBhbm5pbmdNb2RlbFwiKSx0LlBhbm5lcjNELl9hbGlhc1Byb3BlcnR5KFwicmVmRGlzdGFuY2VcIiksdC5QYW5uZXIzRC5fYWxpYXNQcm9wZXJ0eShcInJvbGxvZmZGYWN0b3JcIiksdC5QYW5uZXIzRC5fYWxpYXNQcm9wZXJ0eShcImRpc3RhbmNlTW9kZWxcIiksdC5QYW5uZXIzRC5fYWxpYXNQcm9wZXJ0eShcImNvbmVJbm5lckFuZ2xlXCIpLHQuUGFubmVyM0QuX2FsaWFzUHJvcGVydHkoXCJjb25lT3V0ZXJBbmdsZVwiKSx0LlBhbm5lcjNELl9hbGlhc1Byb3BlcnR5KFwiY29uZU91dGVyR2FpblwiKSx0LlBhbm5lcjNELl9hbGlhc1Byb3BlcnR5KFwibWF4RGlzdGFuY2VcIiksdC5QYW5uZXIzRC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3Bhbm5lci5kaXNjb25uZWN0KCksdGhpcy5fcGFubmVyPW51bGwsdGhpcy5fb3JpZW50YXRpb249bnVsbCx0aGlzLl9wb3NpdGlvbj1udWxsLHRoaXN9LHQuUGFubmVyM0R9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNTkpLGkoNDMpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0Lk11bHRpYmFuZENvbXByZXNzb3I9ZnVuY3Rpb24oZSl7dC5BdWRpb05vZGUuY2FsbCh0aGlzKSxlPXQuZGVmYXVsdEFyZyhhcmd1bWVudHMsdC5NdWx0aWJhbmRDb21wcmVzc29yLmRlZmF1bHRzKSx0aGlzLl9zcGxpdHRlcj10aGlzLmlucHV0PW5ldyB0Lk11bHRpYmFuZFNwbGl0KHtsb3dGcmVxdWVuY3k6ZS5sb3dGcmVxdWVuY3ksaGlnaEZyZXF1ZW5jeTplLmhpZ2hGcmVxdWVuY3l9KSx0aGlzLmxvd0ZyZXF1ZW5jeT10aGlzLl9zcGxpdHRlci5sb3dGcmVxdWVuY3ksdGhpcy5oaWdoRnJlcXVlbmN5PXRoaXMuX3NwbGl0dGVyLmhpZ2hGcmVxdWVuY3ksdGhpcy5vdXRwdXQ9bmV3IHQuR2Fpbix0aGlzLmxvdz1uZXcgdC5Db21wcmVzc29yKGUubG93KSx0aGlzLm1pZD1uZXcgdC5Db21wcmVzc29yKGUubWlkKSx0aGlzLmhpZ2g9bmV3IHQuQ29tcHJlc3NvcihlLmhpZ2gpLHRoaXMuX3NwbGl0dGVyLmxvdy5jaGFpbih0aGlzLmxvdyx0aGlzLm91dHB1dCksdGhpcy5fc3BsaXR0ZXIubWlkLmNoYWluKHRoaXMubWlkLHRoaXMub3V0cHV0KSx0aGlzLl9zcGxpdHRlci5oaWdoLmNoYWluKHRoaXMuaGlnaCx0aGlzLm91dHB1dCksdGhpcy5fcmVhZE9ubHkoW1wiaGlnaFwiLFwibWlkXCIsXCJsb3dcIixcImhpZ2hGcmVxdWVuY3lcIixcImxvd0ZyZXF1ZW5jeVwiXSl9LHQuZXh0ZW5kKHQuTXVsdGliYW5kQ29tcHJlc3Nvcix0LkF1ZGlvTm9kZSksdC5NdWx0aWJhbmRDb21wcmVzc29yLmRlZmF1bHRzPXtsb3c6dC5Db21wcmVzc29yLmRlZmF1bHRzLG1pZDp0LkNvbXByZXNzb3IuZGVmYXVsdHMsaGlnaDp0LkNvbXByZXNzb3IuZGVmYXVsdHMsbG93RnJlcXVlbmN5OjI1MCxoaWdoRnJlcXVlbmN5OjJlM30sdC5NdWx0aWJhbmRDb21wcmVzc29yLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fc3BsaXR0ZXIuZGlzcG9zZSgpLHRoaXMuX3dyaXRhYmxlKFtcImhpZ2hcIixcIm1pZFwiLFwibG93XCIsXCJoaWdoRnJlcXVlbmN5XCIsXCJsb3dGcmVxdWVuY3lcIl0pLHRoaXMubG93LmRpc3Bvc2UoKSx0aGlzLm1pZC5kaXNwb3NlKCksdGhpcy5oaWdoLmRpc3Bvc2UoKSx0aGlzLl9zcGxpdHRlcj1udWxsLHRoaXMubG93PW51bGwsdGhpcy5taWQ9bnVsbCx0aGlzLmhpZ2g9bnVsbCx0aGlzLmxvd0ZyZXF1ZW5jeT1udWxsLHRoaXMuaGlnaEZyZXF1ZW5jeT1udWxsLHRoaXN9LHQuTXVsdGliYW5kQ29tcHJlc3Nvcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxMCksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuTW9ubz1mdW5jdGlvbigpe3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5jcmVhdGVJbnNPdXRzKDEsMCksdGhpcy5fbWVyZ2U9dGhpcy5vdXRwdXQ9bmV3IHQuTWVyZ2UsdGhpcy5pbnB1dC5jb25uZWN0KHRoaXMuX21lcmdlLDAsMCksdGhpcy5pbnB1dC5jb25uZWN0KHRoaXMuX21lcmdlLDAsMSl9LHQuZXh0ZW5kKHQuTW9ubyx0LkF1ZGlvTm9kZSksdC5Nb25vLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fbWVyZ2UuZGlzcG9zZSgpLHRoaXMuX21lcmdlPW51bGwsdGhpc30sdC5Nb25vfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDUyKSxpKDUxKSxpKDQzKSxpKDIpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5NaWRTaWRlQ29tcHJlc3Nvcj1mdW5jdGlvbihlKXt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLGU9dC5kZWZhdWx0QXJnKGUsdC5NaWRTaWRlQ29tcHJlc3Nvci5kZWZhdWx0cyksdGhpcy5fbWlkU2lkZVNwbGl0PXRoaXMuaW5wdXQ9bmV3IHQuTWlkU2lkZVNwbGl0LHRoaXMuX21pZFNpZGVNZXJnZT10aGlzLm91dHB1dD1uZXcgdC5NaWRTaWRlTWVyZ2UsdGhpcy5taWQ9bmV3IHQuQ29tcHJlc3NvcihlLm1pZCksdGhpcy5zaWRlPW5ldyB0LkNvbXByZXNzb3IoZS5zaWRlKSx0aGlzLl9taWRTaWRlU3BsaXQubWlkLmNoYWluKHRoaXMubWlkLHRoaXMuX21pZFNpZGVNZXJnZS5taWQpLHRoaXMuX21pZFNpZGVTcGxpdC5zaWRlLmNoYWluKHRoaXMuc2lkZSx0aGlzLl9taWRTaWRlTWVyZ2Uuc2lkZSksdGhpcy5fcmVhZE9ubHkoW1wibWlkXCIsXCJzaWRlXCJdKX0sdC5leHRlbmQodC5NaWRTaWRlQ29tcHJlc3Nvcix0LkF1ZGlvTm9kZSksdC5NaWRTaWRlQ29tcHJlc3Nvci5kZWZhdWx0cz17bWlkOntyYXRpbzozLHRocmVzaG9sZDotMjQscmVsZWFzZTouMDMsYXR0YWNrOi4wMixrbmVlOjE2fSxzaWRlOntyYXRpbzo2LHRocmVzaG9sZDotMzAscmVsZWFzZTouMjUsYXR0YWNrOi4wMyxrbmVlOjEwfX0sdC5NaWRTaWRlQ29tcHJlc3Nvci5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcIm1pZFwiLFwic2lkZVwiXSksdGhpcy5taWQuZGlzcG9zZSgpLHRoaXMubWlkPW51bGwsdGhpcy5zaWRlLmRpc3Bvc2UoKSx0aGlzLnNpZGU9bnVsbCx0aGlzLl9taWRTaWRlU3BsaXQuZGlzcG9zZSgpLHRoaXMuX21pZFNpZGVTcGxpdD1udWxsLHRoaXMuX21pZFNpZGVNZXJnZS5kaXNwb3NlKCksdGhpcy5fbWlkU2lkZU1lcmdlPW51bGwsdGhpc30sdC5NaWRTaWRlQ29tcHJlc3Nvcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg0NCksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuTWV0ZXI9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJzbW9vdGhpbmdcIl0sdC5NZXRlcik7dC5BdWRpb05vZGUuY2FsbCh0aGlzKSx0aGlzLnNtb290aGluZz1lLnNtb290aGluZyx0aGlzLl9ybXM9MCx0aGlzLmlucHV0PXRoaXMub3V0cHV0PXRoaXMuX2FuYWx5c2VyPW5ldyB0LkFuYWx5c2VyKFwid2F2ZWZvcm1cIiwyNTYpfSx0LmV4dGVuZCh0Lk1ldGVyLHQuQXVkaW9Ob2RlKSx0Lk1ldGVyLmRlZmF1bHRzPXtzbW9vdGhpbmc6Ljh9LHQuTWV0ZXIucHJvdG90eXBlLmdldExldmVsPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuX2FuYWx5c2VyLmdldFZhbHVlKCksaT0wLG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXTtpKz1vKm99dmFyIHM9TWF0aC5zcXJ0KGkvZS5sZW5ndGgpO3JldHVybiB0aGlzLl9ybXM9TWF0aC5tYXgocyx0aGlzLl9ybXMqdGhpcy5zbW9vdGhpbmcpLHQuZ2FpblRvRGIodGhpcy5fcm1zKX0sdC5NZXRlci5wcm90b3R5cGUuZ2V0VmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYW5hbHlzZXIuZ2V0VmFsdWUoKVswXX0sdC5NZXRlci5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX2FuYWx5c2VyLmRpc3Bvc2UoKSx0aGlzLl9hbmFseXNlcj1udWxsLHRoaXN9LHQuTWV0ZXJ9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNDMpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkxpbWl0ZXI9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJ0aHJlc2hvbGRcIl0sdC5MaW1pdGVyKTt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLHRoaXMuX2NvbXByZXNzb3I9dGhpcy5pbnB1dD10aGlzLm91dHB1dD1uZXcgdC5Db21wcmVzc29yKHthdHRhY2s6LjAwMSxkZWNheTouMDAxLHRocmVzaG9sZDplLnRocmVzaG9sZH0pLHRoaXMudGhyZXNob2xkPXRoaXMuX2NvbXByZXNzb3IudGhyZXNob2xkLHRoaXMuX3JlYWRPbmx5KFwidGhyZXNob2xkXCIpfSx0LmV4dGVuZCh0LkxpbWl0ZXIsdC5BdWRpb05vZGUpLHQuTGltaXRlci5kZWZhdWx0cz17dGhyZXNob2xkOi0xMn0sdC5MaW1pdGVyLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fY29tcHJlc3Nvci5kaXNwb3NlKCksdGhpcy5fY29tcHJlc3Nvcj1udWxsLHRoaXMuX3dyaXRhYmxlKFwidGhyZXNob2xkXCIpLHRoaXMudGhyZXNob2xkPW51bGwsdGhpc30sdC5MaW1pdGVyfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDU3KSxpKDg4KSxpKDIpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5HYXRlPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1widGhyZXNob2xkXCIsXCJzbW9vdGhpbmdcIl0sdC5HYXRlKTt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLHRoaXMuY3JlYXRlSW5zT3V0cygxLDEpLHRoaXMuX2ZvbGxvd2VyPW5ldyB0LkZvbGxvd2VyKGUuc21vb3RoaW5nKSx0aGlzLl9ndD1uZXcgdC5HcmVhdGVyVGhhbih0LmRiVG9HYWluKGUudGhyZXNob2xkKSksdGhpcy5pbnB1dC5jb25uZWN0KHRoaXMub3V0cHV0KSx0aGlzLmlucHV0LmNoYWluKHRoaXMuX2ZvbGxvd2VyLHRoaXMuX2d0LHRoaXMub3V0cHV0LmdhaW4pfSx0LmV4dGVuZCh0LkdhdGUsdC5BdWRpb05vZGUpLHQuR2F0ZS5kZWZhdWx0cz17c21vb3RoaW5nOi4xLHRocmVzaG9sZDotNDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkdhdGUucHJvdG90eXBlLFwidGhyZXNob2xkXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0LmdhaW5Ub0RiKHRoaXMuX2d0LnZhbHVlKX0sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX2d0LnZhbHVlPXQuZGJUb0dhaW4oZSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuR2F0ZS5wcm90b3R5cGUsXCJzbW9vdGhpbmdcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZvbGxvd2VyLnNtb290aGluZ30sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2ZvbGxvd2VyLnNtb290aGluZz10fX0pLHQuR2F0ZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX2ZvbGxvd2VyLmRpc3Bvc2UoKSx0aGlzLl9ndC5kaXNwb3NlKCksdGhpcy5fZm9sbG93ZXI9bnVsbCx0aGlzLl9ndD1udWxsLHRoaXN9LHQuR2F0ZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg0NCksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuRkZUPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wic2l6ZVwiXSx0LkZGVCk7ZS50eXBlPXQuQW5hbHlzZXIuVHlwZS5GRlQsdC5BdWRpb05vZGUuY2FsbCh0aGlzKSx0aGlzLl9hbmFseXNlcj10aGlzLmlucHV0PXRoaXMub3V0cHV0PW5ldyB0LkFuYWx5c2VyKGUpfSx0LmV4dGVuZCh0LkZGVCx0LkF1ZGlvTm9kZSksdC5GRlQuZGVmYXVsdHM9e3NpemU6MTAyNH0sdC5GRlQucHJvdG90eXBlLmdldFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FuYWx5c2VyLmdldFZhbHVlKCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkZGVC5wcm90b3R5cGUsXCJzaXplXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbmFseXNlci5zaXplfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fYW5hbHlzZXIuc2l6ZT10fX0pLHQuRkZULnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dC5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9hbmFseXNlci5kaXNwb3NlKCksdGhpcy5fYW5hbHlzZXI9bnVsbH0sdC5GRlR9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNTkpLGkoMyksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuRVEzPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wibG93XCIsXCJtaWRcIixcImhpZ2hcIl0sdC5FUTMpO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5vdXRwdXQ9bmV3IHQuR2Fpbix0aGlzLl9tdWx0aWJhbmRTcGxpdD10aGlzLmlucHV0PW5ldyB0Lk11bHRpYmFuZFNwbGl0KHtsb3dGcmVxdWVuY3k6ZS5sb3dGcmVxdWVuY3ksaGlnaEZyZXF1ZW5jeTplLmhpZ2hGcmVxdWVuY3l9KSx0aGlzLl9sb3dHYWluPW5ldyB0LkdhaW4oZS5sb3csdC5UeXBlLkRlY2liZWxzKSx0aGlzLl9taWRHYWluPW5ldyB0LkdhaW4oZS5taWQsdC5UeXBlLkRlY2liZWxzKSx0aGlzLl9oaWdoR2Fpbj1uZXcgdC5HYWluKGUuaGlnaCx0LlR5cGUuRGVjaWJlbHMpLHRoaXMubG93PXRoaXMuX2xvd0dhaW4uZ2Fpbix0aGlzLm1pZD10aGlzLl9taWRHYWluLmdhaW4sdGhpcy5oaWdoPXRoaXMuX2hpZ2hHYWluLmdhaW4sdGhpcy5RPXRoaXMuX211bHRpYmFuZFNwbGl0LlEsdGhpcy5sb3dGcmVxdWVuY3k9dGhpcy5fbXVsdGliYW5kU3BsaXQubG93RnJlcXVlbmN5LHRoaXMuaGlnaEZyZXF1ZW5jeT10aGlzLl9tdWx0aWJhbmRTcGxpdC5oaWdoRnJlcXVlbmN5LHRoaXMuX211bHRpYmFuZFNwbGl0Lmxvdy5jaGFpbih0aGlzLl9sb3dHYWluLHRoaXMub3V0cHV0KSx0aGlzLl9tdWx0aWJhbmRTcGxpdC5taWQuY2hhaW4odGhpcy5fbWlkR2Fpbix0aGlzLm91dHB1dCksdGhpcy5fbXVsdGliYW5kU3BsaXQuaGlnaC5jaGFpbih0aGlzLl9oaWdoR2Fpbix0aGlzLm91dHB1dCksdGhpcy5fcmVhZE9ubHkoW1wibG93XCIsXCJtaWRcIixcImhpZ2hcIixcImxvd0ZyZXF1ZW5jeVwiLFwiaGlnaEZyZXF1ZW5jeVwiXSl9LHQuZXh0ZW5kKHQuRVEzLHQuQXVkaW9Ob2RlKSx0LkVRMy5kZWZhdWx0cz17bG93OjAsbWlkOjAsaGlnaDowLGxvd0ZyZXF1ZW5jeTo0MDAsaGlnaEZyZXF1ZW5jeToyNTAwfSx0LkVRMy5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcImxvd1wiLFwibWlkXCIsXCJoaWdoXCIsXCJsb3dGcmVxdWVuY3lcIixcImhpZ2hGcmVxdWVuY3lcIl0pLHRoaXMuX211bHRpYmFuZFNwbGl0LmRpc3Bvc2UoKSx0aGlzLl9tdWx0aWJhbmRTcGxpdD1udWxsLHRoaXMubG93RnJlcXVlbmN5PW51bGwsdGhpcy5oaWdoRnJlcXVlbmN5PW51bGwsdGhpcy5fbG93R2Fpbi5kaXNwb3NlKCksdGhpcy5fbG93R2Fpbj1udWxsLHRoaXMuX21pZEdhaW4uZGlzcG9zZSgpLHRoaXMuX21pZEdhaW49bnVsbCx0aGlzLl9oaWdoR2Fpbi5kaXNwb3NlKCksdGhpcy5faGlnaEdhaW49bnVsbCx0aGlzLmxvdz1udWxsLHRoaXMubWlkPW51bGwsdGhpcy5oaWdoPW51bGwsdGhpcy5RPW51bGwsdGhpc30sdC5FUTN9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoOTUpLGkoOTEpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe3JldHVybiB0LkNoYW5uZWw9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJ2b2x1bWVcIixcInBhblwiXSx0LlBhblZvbCk7dC5BdWRpb05vZGUuY2FsbCh0aGlzLGUpLHRoaXMuX3NvbG89dGhpcy5pbnB1dD1uZXcgdC5Tb2xvKGUuc29sbyksdGhpcy5fcGFuVm9sPXRoaXMub3V0cHV0PW5ldyB0LlBhblZvbCh7cGFuOmUucGFuLHZvbHVtZTplLnZvbHVtZSxtdXRlOmUubXV0ZX0pLHRoaXMucGFuPXRoaXMuX3BhblZvbC5wYW4sdGhpcy52b2x1bWU9dGhpcy5fcGFuVm9sLnZvbHVtZSx0aGlzLl9zb2xvLmNvbm5lY3QodGhpcy5fcGFuVm9sKSx0aGlzLl9yZWFkT25seShbXCJwYW5cIixcInZvbHVtZVwiXSl9LHQuZXh0ZW5kKHQuQ2hhbm5lbCx0LkF1ZGlvTm9kZSksdC5DaGFubmVsLmRlZmF1bHRzPXtwYW46MCx2b2x1bWU6MCxtdXRlOiExLHNvbG86ITF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkNoYW5uZWwucHJvdG90eXBlLFwic29sb1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc29sby5zb2xvfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fc29sby5zb2xvPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQ2hhbm5lbC5wcm90b3R5cGUsXCJtdXRlZFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc29sby5tdXRlZHx8dGhpcy5tdXRlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkNoYW5uZWwucHJvdG90eXBlLFwibXV0ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFuVm9sLm11dGV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9wYW5Wb2wubXV0ZT10fX0pLHQuQ2hhbm5lbC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcInBhblwiLFwidm9sdW1lXCJdKSx0aGlzLl9wYW5Wb2wuZGlzcG9zZSgpLHRoaXMuX3BhblZvbD1udWxsLHRoaXMucGFuPW51bGwsdGhpcy52b2x1bWU9bnVsbCx0aGlzLl9zb2xvLmRpc3Bvc2UoKSx0aGlzLl9zb2xvPW51bGwsdGhpc30sdC5DaGFubmVsfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9XCIxMy40LjlcIn0sZnVuY3Rpb24odCxlKXt2YXIgaTtpPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7dHJ5e2k9aXx8RnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpfHwoMCxldmFsKShcInRoaXNcIil9Y2F0Y2godCl7XCJvYmplY3RcIj09dHlwZW9mIHdpbmRvdyYmKGk9d2luZG93KX10LmV4cG9ydHM9aX0sZnVuY3Rpb24odCxlLGkpe2koMzApLGkoNDQpLGkoMTUyKSxpKDQzKSxpKDIzKSxpKDQ3KSxpKDE1MSksaSg1OCksaSgxNTApLGkoOSksaSg1NyksaSg0MSksaSgxNDkpLGkoMTIpLGkoMTQ4KSxpKDUzKSxpKDEwKSxpKDE0NyksaSgxNDYpLGkoNTEpLGkoNTIpLGkoMTQ1KSxpKDE0NCksaSg1OSksaSg2MCksaSgxNDMpLGkoOTUpLGkoODkpLGkoOTEpLGkoMTkpLGkoMjcpLGkoMTQyKSxpKDE0MSksaSgxNDApLGkoODApLGkoMTM5KSxpKDIpLGkoMTEpLGkoNzkpLGkoMTM4KSxpKDg2KSxpKDIwKSxpKDE4KSxpKDEzNyksaSgzNSksaSgzKSxpKDg0KSxpKDEzNiksaSg0MCksaSg3OCksaSg2MiksaSgxNCksaSgyNCksaSgzMyksaSgxNiksaSg1NSksaSg4MyksaSgxMzUpLGkoMTM0KSxpKDEzMyksaSgxMzIpLGkoMTMxKSxpKDEzMCksaSg3NiksaSgxMjkpLGkoOCksaSgxMjgpLGkoMzIpLGkoMTI3KSxpKDEyNiksaSg3NSksaSgxMjUpLGkoMTI0KSxpKDEyMyksaSgxMjIpLGkoMTUpLGkoMTIxKSxpKDEyMCksaSg3NCksaSgxMTkpLGkoMTE4KSxpKDUwKSxpKDczKSxpKDcyKSxpKDExNyksaSgxMTYpLGkoMTE1KSxpKDExNCksaSgxMTMpLGkoMjEpLGkoMTEyKSxpKDExMSksaSgyNSksaSg2OCksaSgxMTApLGkoMTA5KSxpKDEwOCksaSgxMDcpLGkoMzgpLGkoOTYpLGkoODEpLGkoMzQpLGkoNjMpLGkoOTcpLGkoNjYpLGkoMTA2KSxpKDkyKSxpKDk4KSxpKDkwKSxpKDI5KSxpKDIyKSxpKDkzKSxpKDEwNSksaSg4OCksaSg4NyksaSg3NyksaSg1KSxpKDk0KSxpKDEwNCksaSg2MSksaSgyNiksaSg0MiksaSgxKSxpKDM2KSxpKDEzKSxpKDg1KSxpKDEwMyksaSg3KSxpKDI4KSxpKDcwKSxpKDMxKSxpKDY5KSxpKDQ4KSxpKDEwMiksaSgzOSksaSgzNyksaSgxNyksaSg4MiksaSg2NyksaSgxMDEpLGkoNDkpLGkoNzEpLGkoNiksaSg1NiksaSgxMDApLGkoNDYpLGkoOTkpLGkoNTQpLGkoNjUpLGkoNjQpLGkoNDUpLGkoNCksdC5leHBvcnRzPWkoMCl9XSl9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRvbmUuanMubWFwIiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIiwiaW1wb3J0IHRvbmUgZnJvbSBcInRvbmVcIjtcclxuaW1wb3J0IHsgYXNzZXJ0TmV2ZXIsIG5vdGVzIH0gZnJvbSBcIi4vaW5kZXhcIjtcclxuaW1wb3J0IHsgaW5zdHJ1bWVudERhdGEgfSBmcm9tIFwiLi9kYXRhXCI7XHJcblxyXG5mdW5jdGlvbiBzZXRTYW1wbGVyUmVsZWFzZShzYW1wbGVyOiB0b25lLlNhbXBsZXIsIGluc3RydW1lbnQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgaW5zdHJ1bWVudER1cmF0aW9uID0gaW5zdHJ1bWVudERhdGFbaW5zdHJ1bWVudF1bXCJkdXJhdGlvblwiXTtcclxuXHJcbiAgICBzd2l0Y2ggKGluc3RydW1lbnREdXJhdGlvbikge1xyXG4gICAgICAgIGNhc2UgXCJpbnN0YW50XCI6XHJcbiAgICAgICAgICAgIHNhbXBsZXIucmVsZWFzZSA9IDAuMDU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJtaW5pXCI6XHJcbiAgICAgICAgICAgIHNhbXBsZXIucmVsZWFzZSA9IDAuMTI1O1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwic2hvcnRcIjpcclxuICAgICAgICAgICAgc2FtcGxlci5yZWxlYXNlID0gMC4yNTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcIm1pZFwiOlxyXG4gICAgICAgICAgICBzYW1wbGVyLnJlbGVhc2UgPSAwLjQ7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJsb25nXCI6XHJcbiAgICAgICAgICAgIHNhbXBsZXIucmVsZWFzZSA9IDE7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJleHRlbmRlZFwiOlxyXG4gICAgICAgICAgICBzYW1wbGVyLnJlbGVhc2UgPSAxLjU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJtZWdhXCI6XHJcbiAgICAgICAgICAgIHNhbXBsZXIucmVsZWFzZSA9IDU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJjb25zdGFudFwiOlxyXG4gICAgICAgICAgICBzYW1wbGVyLnJlbGVhc2UgPSAzMDtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcImluZmluaXRlXCI6XHJcbiAgICAgICAgICAgIHNhbXBsZXIucmVsZWFzZSA9IDAuMTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYXNzZXJ0TmV2ZXIoaW5zdHJ1bWVudER1cmF0aW9uKTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0U2FtcGxlckN1cnZlKHNhbXBsZXI6IHRvbmUuU2FtcGxlcikge1xyXG4gICAgKHNhbXBsZXIgYXMgYW55KS5jdXJ2ZSA9IFwibGluZWFyXCI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTYW1wbGVyKFxyXG4gICAgaW5zdHJ1bWVudDogc3RyaW5nLFxyXG4gICAgZXh0ZW5zaW9uOiBzdHJpbmcgPSBcIm9nZ1wiLFxyXG4gICAgYmFzZVVybDogc3RyaW5nID0gXCIvYm9zY2EtY2VvaWwtanMvYXVkaW8vXCJcclxuKTogdG9uZS5TYW1wbGVyIHtcclxuICAgIGxldCBzYW1wbGVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XHJcbiAgICBmb3IgKGNvbnN0IG5vdGUgb2Ygbm90ZXMpIHtcclxuICAgICAgICBzYW1wbGVzW25vdGVdID0gYCR7aW5zdHJ1bWVudH0vJHtub3RlLnRvTG93ZXJDYXNlKCl9LiR7ZXh0ZW5zaW9ufWA7XHJcbiAgICB9XHJcbiAgICBsZXQgc2FtcGxlciA9IG5ldyB0b25lLlNhbXBsZXIoc2FtcGxlcywgdW5kZWZpbmVkLCBiYXNlVXJsKTtcclxuICAgIHNldFNhbXBsZXJDdXJ2ZShzYW1wbGVyKTtcclxuICAgIHNldFNhbXBsZXJSZWxlYXNlKHNhbXBsZXIsIGluc3RydW1lbnQpO1xyXG4gICAgcmV0dXJuIHNhbXBsZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VTYW1wbGVyKFxyXG4gICAgc2FtcGxlcjogdG9uZS5TYW1wbGVyLFxyXG4gICAgaW5zdHJ1bWVudDogc3RyaW5nLFxyXG4gICAgZXh0ZW5zaW9uOiBzdHJpbmcgPSBcIm9nZ1wiLFxyXG4pOiB0b25lLlNhbXBsZXIge1xyXG4gICAgZm9yIChjb25zdCBub3RlIG9mIG5vdGVzKSB7XHJcbiAgICAgICAgc2FtcGxlci5hZGQobm90ZSwgYCR7aW5zdHJ1bWVudH0vJHtub3RlLnRvTG93ZXJDYXNlKCl9LiR7ZXh0ZW5zaW9ufWApO1xyXG4gICAgfVxyXG4gICAgc2V0U2FtcGxlckN1cnZlKHNhbXBsZXIpO1xyXG4gICAgc2V0U2FtcGxlclJlbGVhc2Uoc2FtcGxlciwgaW5zdHJ1bWVudCk7XHJcbiAgICByZXR1cm4gc2FtcGxlcjtcclxufVxyXG4iLCJpbXBvcnQgeyBJbnN0cnVtZW50RGF0YSB9IGZyb20gXCIuL2luZGV4XCI7XHJcblxyXG5leHBvcnQgY29uc3QgaW5zdHJ1bWVudERhdGE6IEluc3RydW1lbnREYXRhID0gcmVxdWlyZShcIi4uL2luc3RydW1lbnRzLnlhbWxcIik7XHJcbiIsImV4cG9ydCBmdW5jdGlvbiBhc3NlcnROZXZlcih4OiBuZXZlcik6IG5ldmVyIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihgVW5leGhhdXN0aXZlIGNvbmRpdGlvbiBsZWFkaW5nIHRvIHZhbHVlOiAke3h9YCk7XHJcbn1cclxuXHJcbi8vIER1cmF0aW9uczpcclxuLy8gLSBDb25zdGFudCBtZWFucyB0aGF0IHRoZSBzb3VuZCBwbGF5cyBmb3IgdGhlIHNhbWUgYW1vdW50IG9mIHRpbWVcclxuLy8gICByZWdhcmRsZXNzIG9mIHRoZSBsZW5ndGggb2YgdGhlIG5vdGUgaW4gQm9zY2EgQ2VvaWwuXHJcbi8vIC0gSW5maW5pdGUgbWVhbnMgdGhhdCB0aGUgc291bmQgcGxheXMgZm9yIGhvd2V2ZXIgYXJiaXRyYXJpbHkgbG9uZ1xyXG4vLyAgIHRoZSBCb3NjYSBDZW9pbCBub3RlIGlzLlxyXG4vLyAtIFRoZSBvdGhlcnMgYXJlIGZpbml0ZSB0aW1lcywgbWVhbmluZyB0aGF0IHRoZSBzb3VuZCB3aWxsIHBsYXkgdXAgdG9cclxuLy8gICBhIG1heCB0aW1lLCBidXQgYWZ0ZXIgdGhhdCBwb2ludCwgaXQgd2lsbCBnbyBzaWxlbnQgcmVnYXJkbGVzcyBvZiBob3dcclxuLy8gICBsb25nIHRoZSBub3RlIGlzIGluIEJvc2NhIENlb2lsLlxyXG5leHBvcnQgaW50ZXJmYWNlIEluc3RydW1lbnQge1xyXG4gICAgaW5kZXg6IG51bWJlcjtcclxuICAgIGR1cmF0aW9uOiBcImluc3RhbnRcIiB8IFwibWluaVwiIHwgXCJzaG9ydFwiIHwgXCJtaWRcIiB8IFwibG9uZ1wiIHwgXCJleHRlbmRlZFwiIHwgXCJtZWdhXCIgfCBcImNvbnN0YW50XCIgfCBcImluZmluaXRlXCI7XHJcbiAgICByZWxlYXNlOiBudW1iZXI7XHJcbiAgICBjYXRlZ29yeTogQXJyYXk8c3RyaW5nPjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSW5zdHJ1bWVudERhdGEgPSB7IFtrZXk6IHN0cmluZ106IEluc3RydW1lbnQgfTtcclxuXHJcbmV4cG9ydCBjb25zdCBub3RlcyA9IFtcIkMxXCIsIFwiQzJcIiwgXCJDM1wiLCBcIkM0XCIsIFwiQzVcIiwgXCJDNlwiLCBcIkM3XCIsIFwiQzhcIiwgXCJDOVwiXTtcclxuIiwicmVxdWlyZShcIkBtYXRlcmlhbC9yZWFjdC1idXR0b24vZGlzdC9idXR0b24uY3NzXCIpO1xyXG5yZXF1aXJlKFwiQG1hdGVyaWFsL3JlYWN0LXNlbGVjdC9kaXN0L3NlbGVjdC5jc3NcIik7XHJcbnJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtdGV4dC1maWVsZC9kaXN0L3RleHQtZmllbGQuY3NzXCIpO1xyXG5yZXF1aXJlKFwiQG1hdGVyaWFsL3JlYWN0LW1lbnUtc3VyZmFjZS9kaXN0L21lbnUtc3VyZmFjZS5jc3NcIik7XHJcbnJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtZGlhbG9nL2Rpc3QvZGlhbG9nLmNzc1wiKTtcclxuXHJcbmltcG9ydCB7IHN0b3JlLCB2aWV3IH0gZnJvbSBcInJlYWN0LWVhc3ktc3RhdGVcIjtcclxuaW1wb3J0IHRvbmUgZnJvbSBcInRvbmVcIjtcclxuXHJcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IFJlYWN0RG9tIGZyb20gXCJyZWFjdC1kb21cIjtcclxuaW1wb3J0IEJ1dHRvbiBmcm9tIFwiQG1hdGVyaWFsL3JlYWN0LWJ1dHRvblwiO1xyXG5pbXBvcnQgU2VsZWN0LCB7IE9wdGlvbiB9IGZyb20gXCJAbWF0ZXJpYWwvcmVhY3Qtc2VsZWN0XCI7XHJcbmltcG9ydCBUZXh0RmllbGQsIHsgSW5wdXQgfSBmcm9tIFwiQG1hdGVyaWFsL3JlYWN0LXRleHQtZmllbGRcIjtcclxuaW1wb3J0IE1lbnVTdXJmYWNlLCB7IENvcm5lciB9IGZyb20gXCJAbWF0ZXJpYWwvcmVhY3QtbWVudS1zdXJmYWNlXCI7XHJcbmltcG9ydCBEaWFsb2csIHsgRGlhbG9nVGl0bGUsIERpYWxvZ0NvbnRlbnQsIERpYWxvZ0Zvb3RlciwgRGlhbG9nQnV0dG9uIH0gZnJvbSBcIkBtYXRlcmlhbC9yZWFjdC1kaWFsb2dcIjtcclxuXHJcbmltcG9ydCB7IGNoYW5nZVNhbXBsZXIsIGdldFNhbXBsZXIgfSBmcm9tIFwiLi9hdWRpb1wiO1xyXG5pbXBvcnQgeyBpbnN0cnVtZW50RGF0YSB9IGZyb20gXCIuL2RhdGFcIjtcclxuaW1wb3J0IHsgYXNzZXJ0TmV2ZXIgfSBmcm9tIFwiLi9pbmRleFwiO1xyXG5cclxubGV0IHBsYXlpbmcgPSBmYWxzZTtcclxuY29uc3QgbGV0dGVycyA9IFtcIkNcIiwgXCJDI1wiLCBcIkRcIiwgXCJEI1wiLCBcIkVcIiwgXCJGXCIsIFwiRiNcIiwgXCJHXCIsIFwiRyNcIiwgXCJBXCIsIFwiQSNcIiwgXCJCXCJdO1xyXG5jb25zdCBjaG9yZHMgPSBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV07XHJcblxyXG5mdW5jdGlvbiBmcm9tTWF5YmVzPFQ+KG1heWJlczogQXJyYXk8VCB8IG51bGwgfCB1bmRlZmluZWQ+LCBmYWxsYmFjazogVCkge1xyXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBtYXliZXMpIHtcclxuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbGxiYWNrO1xyXG59XHJcblxyXG5jbGFzcyBTb25nIHtcclxuICAgIG1ldGE6IFNvbmdNZXRhID0gbmV3IFNvbmdNZXRhKCk7XHJcbiAgICBlZmZlY3RzOiBFZmZlY3RzID0gbmV3IEVmZmVjdHMoKTtcclxuICAgIHBhdHRlcm5zOiBBcnJheTxQYXR0ZXJuPiA9IFtuZXcgUGF0dGVybigpXTtcclxuICAgIGNoYW5uZWxzOiBBcnJheTxDaGFubmVsPiA9IFtuZXcgQ2hhbm5lbCgpXTtcclxuICAgIHBsYXlpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICB0b2dnbGVBdWRpbygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5wbGF5aW5nKSB7XHJcbiAgICAgICAgICAgIHRvbmUuVHJhbnNwb3J0LnN0b3AoKTtcclxuICAgICAgICAgICAgdG9uZS5UcmFuc3BvcnQucG9zaXRpb24gPSBcIjBcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXN1bWVBdWRpb0NvbnRleHQoKTtcclxuICAgICAgICAgICAgdG9uZS5UcmFuc3BvcnQubG9vcEVuZCA9IFwiMW1cIjtcclxuICAgICAgICAgICAgdG9uZS5UcmFuc3BvcnQubG9vcCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRvbmUuVHJhbnNwb3J0LnRvZ2dsZSgwKTtcclxuICAgICAgICB0aGlzLnBsYXlpbmcgPSAhdGhpcy5wbGF5aW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEVmZmVjdChlZmZlY3Q6IGtleW9mIEVmZmVjdHMsIGNoYW5uZWw6IG51bWJlciwgcGF0dGVybjogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gZnJvbU1heWJlcyhcclxuICAgICAgICAgICAgW1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXR0ZXJuc1twYXR0ZXJuXS5lZmZlY3RzW2VmZmVjdF0sXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxzW2NoYW5uZWxdLmVmZmVjdHNbZWZmZWN0XSxcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgdGhpcy5lZmZlY3RzW2VmZmVjdF1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEVmZmVjdEJ5KGVmZmVjdDoga2V5b2YgRWZmZWN0cywgbGV2ZWw6IFwic29uZ1wiIHwgXCJjaGFubmVsXCIgfCBcInBhdHRlcm5cIiwgaW5kZXg6IG51bWJlciA9IDApIHtcclxuICAgICAgICBzd2l0Y2ggKGxldmVsKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJzb25nXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lZmZlY3RzW2VmZmVjdF07XHJcbiAgICAgICAgICAgIGNhc2UgXCJjaGFubmVsXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFubmVsc1tpbmRleF0uZWZmZWN0c1tlZmZlY3RdO1xyXG4gICAgICAgICAgICBjYXNlIFwicGF0dGVyblwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGF0dGVybnNbaW5kZXhdLmVmZmVjdHNbZWZmZWN0XTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RWZmZWN0QnkoZWZmZWN0OiBrZXlvZiBFZmZlY3RzLCB2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBsZXZlbDogXCJzb25nXCIgfCBcImNoYW5uZWxcIiB8IFwicGF0dGVyblwiLCBpbmRleDogbnVtYmVyID0gMCkge1xyXG4gICAgICAgIHN3aXRjaCAobGV2ZWwpIHtcclxuICAgICAgICAgICAgY2FzZSBcInNvbmdcIjpcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uZy1sZXZlbCBlZmZlY3RzIGNhbm5vdCBiZSB1bmRlZmluZWRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdHNbZWZmZWN0XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCB0aGlzLmNoYW5uZWxzLmxlbmd0aDsgY2hhbm5lbCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHRoaXMuY2hhbm5lbHNbY2hhbm5lbF0ucGF0dGVybnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGF0dGVybnNbcGF0dGVybl0ucGlwZWxpbmUuc2V0RWZmZWN0KGVmZmVjdCwgdGhpcy5nZXRFZmZlY3QoZWZmZWN0LCBjaGFubmVsLCBwYXR0ZXJuKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImNoYW5uZWxcIjpcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbHNbaW5kZXhdLmVmZmVjdHNbZWZmZWN0XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHRoaXMuY2hhbm5lbHNbaW5kZXhdLnBhdHRlcm5zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXR0ZXJuc1twYXR0ZXJuXS5waXBlbGluZS5zZXRFZmZlY3QoZWZmZWN0LCB0aGlzLmdldEVmZmVjdChlZmZlY3QsIGluZGV4LCBwYXR0ZXJuKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJwYXR0ZXJuXCI6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhdHRlcm5zW2luZGV4XS5lZmZlY3RzW2VmZmVjdF0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgdGhpcy5jaGFubmVscy5sZW5ndGg7IGNoYW5uZWwrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiB0aGlzLmNoYW5uZWxzW2NoYW5uZWxdLnBhdHRlcm5zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuID09PSBpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXR0ZXJuc1twYXR0ZXJuXS5waXBlbGluZS5zZXRFZmZlY3QoZWZmZWN0LCB0aGlzLmdldEVmZmVjdChlZmZlY3QsIGNoYW5uZWwsIGluZGV4KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5zdHJ1bWVudCh2YWx1ZTogc3RyaW5nLCBwYXR0ZXJuOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnBhdHRlcm5zW3BhdHRlcm5dLmluc3RydW1lbnQgPSB2YWx1ZTtcclxuICAgICAgICBjaGFuZ2VTYW1wbGVyKHRoaXMucGF0dGVybnNbcGF0dGVybl0ucGlwZWxpbmUuc2FtcGxlciwgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEJwbSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5tZXRhLmJwbSA9IHZhbHVlO1xyXG4gICAgICAgIHRvbmUuVHJhbnNwb3J0LmJwbS52YWx1ZSA9IHNvbmcubWV0YS5icG07XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U3dpbmcodmFsdWU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubWV0YS5zd2luZyA9IHZhbHVlO1xyXG4gICAgICAgIHRvbmUuVHJhbnNwb3J0LnN3aW5nID0gc29uZy5tZXRhLnN3aW5nO1xyXG4gICAgICAgIHRvbmUuVHJhbnNwb3J0LnN3aW5nU3ViZGl2aXNpb24gPSBcIjE2blwiO1xyXG4gICAgfVxyXG5cclxuICAgIHNjaGVkdWxlTm90ZShjaGFubmVsOiBudW1iZXIsIHBhdHRlcm46IG51bWJlciwgY2hvcmQ6IG51bWJlciwgbGV0dGVyOiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyLCBub3RlQ2VsbDogTm90ZUNlbGwpIHtcclxuICAgICAgICB0aGlzLnVuc2NoZWR1bGVOb3RlKGNoYW5uZWwsIHBhdHRlcm4sIGNob3JkLCBsZXR0ZXIsIGluZGV4KTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhgU29uZy5zY2hlZHVsZU5vdGUoY2hvcmQ9JHtjaG9yZH0sIGxldHRlcj0ke2xldHRlcn0sIGluZGV4PSR7aW5kZXh9LCBsZW5ndGg9JHtsZW5ndGh9KWApO1xyXG4gICAgICAgIHRoaXMucGF0dGVybnNbcGF0dGVybl0ubm90ZXNbY2hvcmRdW2xldHRlcl1baW5kZXhdLmxlbmd0aCA9IGxlbmd0aDtcclxuXHJcbiAgICAgICAgdGhpcy5wYXR0ZXJuc1twYXR0ZXJuXS5ub3Rlc1tjaG9yZF1bbGV0dGVyXVtpbmRleF0uc2NoZWR1bGVkRXZlbnQgPSB0b25lLlRyYW5zcG9ydC5zY2hlZHVsZShcclxuICAgICAgICAgICAgdGltZSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhdHRlcm5zW3BhdHRlcm5dLnBpcGVsaW5lLnNhbXBsZXIudHJpZ2dlckF0dGFja1JlbGVhc2UoXHJcbiAgICAgICAgICAgICAgICAgICAgYCR7bGV0dGVyfSR7Y2hvcmR9YCwgdG9uZS5UaW1lKFwiMTZuXCIpICogbGVuZ3RoLCB0aW1lXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgdG9uZS5EcmF3LnNjaGVkdWxlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBub3RlQ2VsbC5zZXRTdGF0ZSh7IHBsYXlpbmc6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGVDZWxsLnNldFN0YXRlKHsgcGxheWluZzogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgMTAwICogbGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIH0sIHRpbWUpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBgMDowOiR7aW5kZXh9YFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgdW5zY2hlZHVsZU5vdGUoY2hhbm5lbDogbnVtYmVyLCBwYXR0ZXJuOiBudW1iZXIsIGNob3JkOiBudW1iZXIsIGxldHRlcjogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFNvbmcudW5zY2hlZHVsZU5vdGUoY2hvcmQ9JHtjaG9yZH0sIGxldHRlcj0ke2xldHRlcn0sIGluZGV4PSR7aW5kZXh9LCBsZW5ndGg9JHtsZW5ndGh9KWApO1xyXG4gICAgICAgIHRoaXMucGF0dGVybnNbcGF0dGVybl0ubm90ZXNbY2hvcmRdW2xldHRlcl1baW5kZXhdLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgY29uc3Qgc2NoZWR1bGVlID0gdGhpcy5wYXR0ZXJuc1twYXR0ZXJuXS5ub3Rlc1tjaG9yZF1bbGV0dGVyXVtpbmRleF0uc2NoZWR1bGVkRXZlbnQ7XHJcbiAgICAgICAgaWYgKHNjaGVkdWxlZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0b25lLlRyYW5zcG9ydC5jbGVhcihzY2hlZHVsZWUpO1xyXG4gICAgICAgICAgICB0aGlzLnBhdHRlcm5zW3BhdHRlcm5dLm5vdGVzW2Nob3JkXVtsZXR0ZXJdW2luZGV4XS5zY2hlZHVsZWRFdmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBTb25nTWV0YSB7XHJcbiAgICBicG06IG51bWJlciA9IDEyMDtcclxuICAgIHN3aW5nOiBudW1iZXIgPSAwO1xyXG59XHJcblxyXG5jbGFzcyBFZmZlY3RzIHtcclxuICAgIHZvbHVtZTogbnVtYmVyID0gMTAwO1xyXG4gICAgcmVzb25hbmNlOiBudW1iZXIgPSAwO1xyXG4gICAgZGFtcGVuaW5nOiBudW1iZXIgPSAwO1xyXG4gICAgZGVsYXk6IG51bWJlciA9IDA7XHJcbiAgICBjaG9ydXM6IG51bWJlciA9IDA7XHJcbiAgICByZXZlcmI6IG51bWJlciA9IDA7XHJcbiAgICBkaXN0b3J0aW9uOiBudW1iZXIgPSAwO1xyXG4gICAgbG93Qm9vc3Q6IG51bWJlciA9IDA7XHJcbiAgICBjb21wcmVzc29yOiBudW1iZXIgPSAwO1xyXG4gICAgaGlnaFBhc3M6IG51bWJlciA9IDA7XHJcbn1cclxuXHJcbmNsYXNzIFBpcGVsaW5lIHtcclxuICAgIHNhbXBsZXI6IHRvbmUuU2FtcGxlcjtcclxuICAgIHZvbHVtZSA9IG5ldyB0b25lLlZvbHVtZSgwKTtcclxuICAgIGxvd1Bhc3MgPSBuZXcgdG9uZS5Mb3dwYXNzQ29tYkZpbHRlcigwLCAwKTtcclxuICAgIGRlbGF5RWZmZWN0ID0gbmV3IHRvbmUuRmVlZGJhY2tEZWxheSgwLCAwKTtcclxuICAgIGNob3J1c0VmZmVjdCA9IG5ldyB0b25lLkNob3J1cygpO1xyXG4gICAgcmV2ZXJiRWZmZWN0ID0gbmV3IHRvbmUuRnJlZXZlcmIoMCwgMzAwMCk7XHJcbiAgICBkaXN0b3J0aW9uRWZmZWN0ID0gbmV3IHRvbmUuQml0Q3J1c2hlcig0KTtcclxuICAgIGxvd0Jvb3N0RWZmZWN0ID0gbmV3IHRvbmUuRmlsdGVyKDAsIFwibG93c2hlbGZcIik7XHJcbiAgICBjb21wcmVzc29yRWZmZWN0ID0gbmV3IHRvbmUuQ29tcHJlc3NvcigwKTtcclxuICAgIGhpZ2hQYXNzRWZmZWN0ID0gbmV3IHRvbmUuRmlsdGVyKDAsIFwiaGlnaHBhc3NcIik7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaW5zdHJ1bWVudDogc3RyaW5nID0gXCJtaWRpLnBpYW5vMVwiKSB7XHJcbiAgICAgICAgdGhpcy5zYW1wbGVyID0gZ2V0U2FtcGxlcihpbnN0cnVtZW50KTtcclxuICAgICAgICB0aGlzLmNob3J1c0VmZmVjdC53ZXQudmFsdWUgPSAwO1xyXG4gICAgICAgIHRoaXMucmV2ZXJiRWZmZWN0LndldC52YWx1ZSA9IDA7XHJcbiAgICAgICAgdGhpcy5kaXN0b3J0aW9uRWZmZWN0LndldC52YWx1ZSA9IDA7XHJcblxyXG4gICAgICAgIHRoaXMuc2FtcGxlci5jaGFpbihcclxuICAgICAgICAgICAgdGhpcy52b2x1bWUsXHJcbiAgICAgICAgICAgIHRoaXMubG93UGFzcyxcclxuICAgICAgICAgICAgdGhpcy5kZWxheUVmZmVjdCxcclxuICAgICAgICAgICAgdGhpcy5jaG9ydXNFZmZlY3QsXHJcbiAgICAgICAgICAgIHRoaXMucmV2ZXJiRWZmZWN0LFxyXG4gICAgICAgICAgICB0aGlzLmRpc3RvcnRpb25FZmZlY3QsXHJcbiAgICAgICAgICAgIHRoaXMubG93Qm9vc3RFZmZlY3QsXHJcbiAgICAgICAgICAgIHRoaXMuY29tcHJlc3NvckVmZmVjdCxcclxuICAgICAgICAgICAgdGhpcy5oaWdoUGFzc0VmZmVjdCxcclxuICAgICAgICAgICAgdG9uZS5NYXN0ZXIsXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRFZmZlY3QoZWZmZWN0OiBrZXlvZiBFZmZlY3RzLCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgc3dpdGNoIChlZmZlY3QpIHtcclxuICAgICAgICAgICAgY2FzZSBcInZvbHVtZVwiOlxyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52b2x1bWUubXV0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudm9sdW1lLnZvbHVtZS52YWx1ZSA9ICh2YWx1ZSAtIDEwMCkgLyA1O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudm9sdW1lLm11dGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwicmVzb25hbmNlXCI6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvd1Bhc3MucmVzb25hbmNlLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImRhbXBlbmluZ1wiOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5sb3dQYXNzLmRhbXBlbmluZy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJkZWxheVwiOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5kZWxheUVmZmVjdC5kZWxheVRpbWUudmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB0b25lLlRpbWUoXCI4blwiKSAqIDIgKiB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGVsYXlFZmZlY3QuZmVlZGJhY2sudmFsdWUgPSAwLjE1ICogMiAqIHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJjaG9ydXNcIjpcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hvcnVzRWZmZWN0LndldC52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJyZXZlcmJcIjpcclxuICAgICAgICAgICAgICAgIHRoaXMucmV2ZXJiRWZmZWN0LnJvb21TaXplLnZhbHVlID0gdmFsdWUgKiAwLjk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJldmVyYkVmZmVjdC53ZXQudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiZGlzdG9ydGlvblwiOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5kaXN0b3J0aW9uRWZmZWN0LndldC52YWx1ZSA9IHZhbHVlID09PSAwID8gMCA6IDE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3RvcnRpb25FZmZlY3QuYml0cyA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJsb3dCb29zdFwiOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5sb3dCb29zdEVmZmVjdC5mcmVxdWVuY3kudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMubG93Qm9vc3RFZmZlY3QuZ2Fpbi52YWx1ZSA9IHZhbHVlID09PSAwID8gMCA6IDIwO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJjb21wcmVzc29yXCI6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXByZXNzb3JFZmZlY3QudGhyZXNob2xkLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImhpZ2hQYXNzXCI6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hQYXNzRWZmZWN0LmZyZXF1ZW5jeS52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBhc3NlcnROZXZlcihlZmZlY3QpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgUGF0dGVybiB7XHJcbiAgICBlZmZlY3RzOiBQYXJ0aWFsPEVmZmVjdHM+ID0ge307XHJcbiAgICBub3RlczogeyBba2V5OiBudW1iZXJdOiB7IFtrZXk6IHN0cmluZ106IEFycmF5PE5vdGU+IH0gfSA9IHt9O1xyXG4gICAgcGlwZWxpbmU6IFBpcGVsaW5lO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBpbnN0cnVtZW50OiBzdHJpbmcgPSBcIm1pZGkucGlhbm8xXCIpIHtcclxuICAgICAgICB0aGlzLnBpcGVsaW5lID0gbmV3IFBpcGVsaW5lKHRoaXMuaW5zdHJ1bWVudCk7XHJcbiAgICAgICAgZm9yIChjb25zdCBjaG9yZCBvZiBjaG9yZHMpIHtcclxuICAgICAgICAgICAgdGhpcy5ub3Rlc1tjaG9yZF0gPSB7fTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBsZXR0ZXIgb2YgbGV0dGVycykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3Rlc1tjaG9yZF1bbGV0dGVyXSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDE2IH0sICgpID0+ICh7IGxlbmd0aDogMCwgc2NoZWR1bGVkRXZlbnQ6IG51bGwgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBDaGFubmVsIHtcclxuICAgIGVmZmVjdHM6IFBhcnRpYWw8RWZmZWN0cz4gPSB7fTtcclxuICAgIHBhdHRlcm5zOiBBcnJheTxudW1iZXIgfCBudWxsPjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwYXR0ZXJuczogQXJyYXk8bnVtYmVyIHwgbnVsbD4gPSBbMF0pIHtcclxuICAgICAgICB0aGlzLnBhdHRlcm5zID0gcGF0dGVybnM7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IHNvbmc6IFNvbmcgPSBzdG9yZShuZXcgU29uZygpKTtcclxuXHJcbkB2aWV3XHJcbmNsYXNzIEVmZmVjdENob2ljZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDx7XHJcbiAgICBlZmZlY3Q6IGtleW9mIEVmZmVjdHMsXHJcbiAgICBtb2RlOiBcInNvbmdcIiB8IFwiY2hhbm5lbFwiIHwgXCJwYXR0ZXJuXCIsXHJcbiAgICBtb2RlSW5kZXg6IG51bWJlcixcclxuICAgIG1pbjogbnVtYmVyLFxyXG4gICAgbWF4OiBudW1iZXIsXHJcbiAgICBzdGVwOiBudW1iZXIsXHJcbn0+IHtcclxuICAgIGdldExhYmVsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLnByb3BzLmVmZmVjdCkge1xyXG4gICAgICAgICAgICBjYXNlIFwiY2hvcnVzXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJDaG9ydXNcIjtcclxuICAgICAgICAgICAgY2FzZSBcImNvbXByZXNzb3JcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIkNvbXByZXNzb3JcIjtcclxuICAgICAgICAgICAgY2FzZSBcImRhbXBlbmluZ1wiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiRGFtcGVuaW5nXCI7XHJcbiAgICAgICAgICAgIGNhc2UgXCJkZWxheVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiRGVsYXlcIjtcclxuICAgICAgICAgICAgY2FzZSBcImRpc3RvcnRpb25cIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIkRpc3RvcnRpb25cIjtcclxuICAgICAgICAgICAgY2FzZSBcImhpZ2hQYXNzXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJIaWdoIHBhc3NcIjtcclxuICAgICAgICAgICAgY2FzZSBcImxvd0Jvb3N0XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJMb3cgYm9vc3RcIjtcclxuICAgICAgICAgICAgY2FzZSBcInJlc29uYW5jZVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiUmVzb25hbmNlXCI7XHJcbiAgICAgICAgICAgIGNhc2UgXCJyZXZlcmJcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIlJldmVyYlwiO1xyXG4gICAgICAgICAgICBjYXNlIFwidm9sdW1lXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJWb2x1bWVcIjtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBhc3NlcnROZXZlcih0aGlzLnByb3BzLmVmZmVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XHJcbiAgICAgICAgcmV0dXJuIDxUZXh0RmllbGQgbGFiZWw9e3RoaXMuZ2V0TGFiZWwoKX0+XHJcbiAgICAgICAgICAgIDxJbnB1dFxyXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ9e3RoaXMucHJvcHMubW9kZSA9PT0gXCJzb25nXCJ9XHJcbiAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgIG1pbj17dGhpcy5wcm9wcy5taW59XHJcbiAgICAgICAgICAgICAgICBtYXg9e3RoaXMucHJvcHMubWF4fVxyXG4gICAgICAgICAgICAgICAgc3RlcD17dGhpcy5wcm9wcy5zdGVwfVxyXG4gICAgICAgICAgICAgICAgdmFsdWU9e3NvbmcuZ2V0RWZmZWN0QnkodGhpcy5wcm9wcy5lZmZlY3QsIHRoaXMucHJvcHMubW9kZSwgdGhpcy5wcm9wcy5tb2RlSW5kZXgpfVxyXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLm1vZGUgIT09IFwic29uZ1wiICYmIGUuY3VycmVudFRhcmdldC52YWx1ZSA9PT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb25nLnNldEVmZmVjdEJ5KHRoaXMucHJvcHMuZWZmZWN0LCB1bmRlZmluZWQsIHRoaXMucHJvcHMubW9kZSwgdGhpcy5wcm9wcy5tb2RlSW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gcGFyc2VGbG9hdChlLmN1cnJlbnRUYXJnZXQudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obmV3VmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvbmcuc2V0RWZmZWN0QnkodGhpcy5wcm9wcy5lZmZlY3QsIG5ld1ZhbHVlLCB0aGlzLnByb3BzLm1vZGUsIHRoaXMucHJvcHMubW9kZUluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuY3VycmVudFRhcmdldC52YWx1ZSA9PT0gdW5kZWZpbmVkICYmIHRoaXMucHJvcHMubW9kZSAhPT0gXCJzb25nXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc29uZy5zZXRFZmZlY3RCeSh0aGlzLnByb3BzLmVmZmVjdCwgdW5kZWZpbmVkLCB0aGlzLnByb3BzLm1vZGUsIHRoaXMucHJvcHMubW9kZUluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgIDwvVGV4dEZpZWxkPjtcclxuICAgIH1cclxufVxyXG5cclxuQHZpZXdcclxuY2xhc3MgRWZmZWN0UGFuZWwgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8e1xyXG4gICAgbW9kZTogXCJzb25nXCIgfCBcImNoYW5uZWxcIiB8IFwicGF0dGVyblwiLFxyXG4gICAgbW9kZUluZGV4OiBudW1iZXIsXHJcbn0+IHtcclxuICAgIHN0YXRlID0ge1xyXG4gICAgICAgIG9wZW46IGZhbHNlLFxyXG4gICAgICAgIGFuY2hvckVsZW1lbnQ6IHVuZGVmaW5lZCxcclxuICAgIH07XHJcblxyXG4gICAgZ2V0QnV0dG9uVGV4dCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5wcm9wcy5tb2RlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJzb25nXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJTb25nXCI7XHJcbiAgICAgICAgICAgIGNhc2UgXCJjaGFubmVsXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJDaGFubmVsXCI7XHJcbiAgICAgICAgICAgIGNhc2UgXCJwYXR0ZXJuXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJQYXR0ZXJuXCJcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBhc3NlcnROZXZlcih0aGlzLnByb3BzLm1vZGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRBbmNob3JFbGVtZW50ID0gKGVsZW1lbnQ6IEhUTUxEaXZFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuYW5jaG9yRWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBhbmNob3JFbGVtZW50OiBlbGVtZW50IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJtZGMtbWVudS1zdXJmYWNlLS1hbmNob3IgZWZmZWN0LXBhbmVsXCJcclxuICAgICAgICAgICAgICAgIHJlZj17dGhpcy5zZXRBbmNob3JFbGVtZW50fVxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8QnV0dG9uIHJhaXNlZCBvbkNsaWNrPXsoKSA9PiB0aGlzLnNldFN0YXRlKHsgb3BlbjogdHJ1ZSB9KX0+e3RoaXMuZ2V0QnV0dG9uVGV4dCgpfTwvQnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgIDxNZW51U3VyZmFjZVxyXG4gICAgICAgICAgICAgICAgICAgIG9wZW49e3RoaXMuc3RhdGUub3Blbn1cclxuICAgICAgICAgICAgICAgICAgICBhbmNob3JDb3JuZXI9e0Nvcm5lci5CT1RUT01fTEVGVH1cclxuICAgICAgICAgICAgICAgICAgICBvbkNsb3NlPXsoKSA9PiB0aGlzLnNldFN0YXRlKHsgb3BlbjogZmFsc2UgfSl9XHJcbiAgICAgICAgICAgICAgICAgICAgYW5jaG9yRWxlbWVudD17dGhpcy5zdGF0ZS5hbmNob3JFbGVtZW50fVxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZWZmZWN0LXBhbmVsLXBvcHVwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxFZmZlY3RDaG9pY2UgZWZmZWN0PVwidm9sdW1lXCIgbWluPXswfSBtYXg9ezIwMH0gc3RlcD17NX0gbW9kZT17dGhpcy5wcm9wcy5tb2RlfSBtb2RlSW5kZXg9e3RoaXMucHJvcHMubW9kZUluZGV4fSAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8RWZmZWN0Q2hvaWNlIGVmZmVjdD1cInJlc29uYW5jZVwiIG1pbj17MH0gbWF4PXsxfSBzdGVwPXswLjA1fSBtb2RlPXt0aGlzLnByb3BzLm1vZGV9IG1vZGVJbmRleD17dGhpcy5wcm9wcy5tb2RlSW5kZXh9IC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxFZmZlY3RDaG9pY2UgZWZmZWN0PVwiZGFtcGVuaW5nXCIgbWluPXswfSBtYXg9ezMwMDB9IHN0ZXA9ezEwMH0gbW9kZT17dGhpcy5wcm9wcy5tb2RlfSBtb2RlSW5kZXg9e3RoaXMucHJvcHMubW9kZUluZGV4fSAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8RWZmZWN0Q2hvaWNlIGVmZmVjdD1cImRlbGF5XCIgbWluPXswfSBtYXg9ezF9IHN0ZXA9ezAuMDV9IG1vZGU9e3RoaXMucHJvcHMubW9kZX0gbW9kZUluZGV4PXt0aGlzLnByb3BzLm1vZGVJbmRleH0gLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPEVmZmVjdENob2ljZSBlZmZlY3Q9XCJjaG9ydXNcIiBtaW49ezB9IG1heD17MX0gc3RlcD17MC4wNX0gbW9kZT17dGhpcy5wcm9wcy5tb2RlfSBtb2RlSW5kZXg9e3RoaXMucHJvcHMubW9kZUluZGV4fSAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8RWZmZWN0Q2hvaWNlIGVmZmVjdD1cInJldmVyYlwiIG1pbj17MH0gbWF4PXsxfSBzdGVwPXswLjA1fSBtb2RlPXt0aGlzLnByb3BzLm1vZGV9IG1vZGVJbmRleD17dGhpcy5wcm9wcy5tb2RlSW5kZXh9IC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxFZmZlY3RDaG9pY2UgZWZmZWN0PVwiZGlzdG9ydGlvblwiIG1pbj17MH0gbWF4PXsxfSBzdGVwPXswLjA1fSBtb2RlPXt0aGlzLnByb3BzLm1vZGV9IG1vZGVJbmRleD17dGhpcy5wcm9wcy5tb2RlSW5kZXh9IC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxFZmZlY3RDaG9pY2UgZWZmZWN0PVwibG93Qm9vc3RcIiBtaW49ezB9IG1heD17MX0gc3RlcD17MC4wNX0gbW9kZT17dGhpcy5wcm9wcy5tb2RlfSBtb2RlSW5kZXg9e3RoaXMucHJvcHMubW9kZUluZGV4fSAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8RWZmZWN0Q2hvaWNlIGVmZmVjdD1cImNvbXByZXNzb3JcIiBtaW49ezB9IG1heD17MX0gc3RlcD17MC4wNX0gbW9kZT17dGhpcy5wcm9wcy5tb2RlfSBtb2RlSW5kZXg9e3RoaXMucHJvcHMubW9kZUluZGV4fSAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8RWZmZWN0Q2hvaWNlIGVmZmVjdD1cImhpZ2hQYXNzXCIgbWluPXswfSBtYXg9ezF9IHN0ZXA9ezAuMDV9IG1vZGU9e3RoaXMucHJvcHMubW9kZX0gbW9kZUluZGV4PXt0aGlzLnByb3BzLm1vZGVJbmRleH0gLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvTWVudVN1cmZhY2U+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuXHJcbkB2aWV3XHJcbmNsYXNzIFBsYXlCdXR0b24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgb25DbGljaygpIHtcclxuICAgICAgICBzb25nLnRvZ2dsZUF1ZGlvKCk7XHJcbiAgICB9XHJcbiAgICByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcclxuICAgICAgICByZXR1cm4gPEJ1dHRvbiBpZD1cInBsYXlCdXR0b25cIiBvbkNsaWNrPXsoKSA9PiB0aGlzLm9uQ2xpY2soKX0gcmFpc2VkPlxyXG4gICAgICAgICAgICB7c29uZy5wbGF5aW5nID8gXCJTdG9wXCIgOiBcIlBsYXlcIn1cclxuICAgICAgICA8L0J1dHRvbj47XHJcbiAgICB9XHJcbn1cclxuXHJcbkB2aWV3XHJcbmNsYXNzIEhlbHAgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgc3RhdGUgPSB7XHJcbiAgICAgICAgZGlzcGxheWVkOiBmYWxzZSxcclxuICAgIH07XHJcbiAgICByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcclxuICAgICAgICByZXR1cm4gPGE+XHJcbiAgICAgICAgICAgIDxCdXR0b24gaWQ9XCJoZWxwQnV0dG9uXCIgb25DbGljaz17KCkgPT4gdGhpcy5zZXRTdGF0ZSh7ZGlzcGxheWVkOiB0cnVlfSl9IHJhaXNlZD5IZWxwPC9CdXR0b24+XHJcbiAgICAgICAgICAgIDxEaWFsb2cgb3Blbj17dGhpcy5zdGF0ZS5kaXNwbGF5ZWR9IG9uQ2xvc2U9eygpID0+IHRoaXMuc2V0U3RhdGUoe2Rpc3BsYXllZDogZmFsc2V9KX0+XHJcbiAgICAgICAgICAgICAgICA8RGlhbG9nVGl0bGU+SGVscDwvRGlhbG9nVGl0bGU+XHJcbiAgICAgICAgICAgICAgICA8RGlhbG9nQ29udGVudD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+Q2xpY2sgaW4gYSBib3ggdG8gYWRkIG9yIHJlbW92ZSBhIG5vdGUuPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5TaGlmdCBjbGljayB0byBleHRlbmQgYSBub3RlLCBhbmQgY3RybC1zaGlmdCBjbGljayB0byBzaG9ydGVuIGl0LjwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+UHJlc3MgdGhlIHNwYWNlIGJhciB0byBwbGF5IG9yIHN0b3AgdGhlIHNvbmcuPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5BZnRlciBjbGlja2luZyBpbiBhbiBlbnRyeSBmaWVsZCwgdXNlIHRoZSBhcnJvdyBrZXlzIHRvIHF1aWNrbHkgY2hhbmdlIHRoZSB2YWx1ZS48L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9EaWFsb2dDb250ZW50PlxyXG4gICAgICAgICAgICAgICAgPERpYWxvZ0Zvb3Rlcj5cclxuICAgICAgICAgICAgICAgICAgICA8RGlhbG9nQnV0dG9uIGFjdGlvbj1cImNsb3NlXCIgaXNEZWZhdWx0PkNsb3NlPC9EaWFsb2dCdXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L0RpYWxvZ0Zvb3Rlcj5cclxuICAgICAgICAgICAgPC9EaWFsb2c+XHJcbiAgICAgICAgPC9hPjtcclxuICAgIH1cclxufVxyXG5cclxuQHZpZXdcclxuY2xhc3MgTWV0YVdvcmtzcGFjZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDx7IGFjdGl2ZUNoYW5uZWw6IG51bWJlciwgYWN0aXZlUGF0dGVybjogbnVtYmVyIH0+IHtcclxuICAgIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xyXG4gICAgICAgIGNvbnN0IGluc3RydW1lbnRzID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBbaW5zdHJ1bWVudCwgeyBjYXRlZ29yeSB9XSBvZiBPYmplY3QuZW50cmllcyhpbnN0cnVtZW50RGF0YSkpIHtcclxuICAgICAgICAgICAgaW5zdHJ1bWVudHMucHVzaChcclxuICAgICAgICAgICAgICAgIDxPcHRpb24ga2V5PXtpbnN0cnVtZW50fSB2YWx1ZT17aW5zdHJ1bWVudH0+e2NhdGVnb3J5LmpvaW4oXCIgPiBcIil9PC9PcHRpb24+XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gPGRpdiBpZD1cIm1ldGFXb3Jrc3BhY2VcIj5cclxuICAgICAgICAgICAgPFBsYXlCdXR0b24gLz5cclxuICAgICAgICAgICAgPFNlbGVjdFxyXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJQYXR0ZXJuIGluc3RydW1lbnRcIlxyXG4gICAgICAgICAgICAgICAgdmFsdWU9e3NvbmcucGF0dGVybnNbdGhpcy5wcm9wcy5hY3RpdmVQYXR0ZXJuXS5pbnN0cnVtZW50fVxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNvbmcuc2V0SW5zdHJ1bWVudChlLmN1cnJlbnRUYXJnZXQudmFsdWUsIHRoaXMucHJvcHMuYWN0aXZlQ2hhbm5lbCk7XHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7aW5zdHJ1bWVudHN9XHJcbiAgICAgICAgICAgIDwvU2VsZWN0PlxyXG4gICAgICAgICAgICA8VGV4dEZpZWxkIGxhYmVsPVwiQlBNXCI+XHJcbiAgICAgICAgICAgICAgICA8SW5wdXRcclxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIG1pbj17MTB9XHJcbiAgICAgICAgICAgICAgICAgICAgbWF4PXsyMjB9XHJcbiAgICAgICAgICAgICAgICAgICAgc3RlcD17NX1cclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c29uZy5tZXRhLmJwbX1cclxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcnNlSW50KGUuY3VycmVudFRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTih2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb25nLnNldEJwbSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvVGV4dEZpZWxkPlxyXG4gICAgICAgICAgICA8VGV4dEZpZWxkIGxhYmVsPVwiU3dpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxJbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgbWluPXswfVxyXG4gICAgICAgICAgICAgICAgICAgIG1heD17MX1cclxuICAgICAgICAgICAgICAgICAgICBzdGVwPXswLjA1fVxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzb25nLm1ldGEuc3dpbmd9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJzZUludChlLmN1cnJlbnRUYXJnZXQudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4odmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgc29uZy5zZXRTd2luZyh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvVGV4dEZpZWxkPlxyXG4gICAgICAgICAgICA8RWZmZWN0UGFuZWwgbW9kZT1cInNvbmdcIiBtb2RlSW5kZXg9ezB9IC8+XHJcbiAgICAgICAgICAgIDxFZmZlY3RQYW5lbCBtb2RlPVwiY2hhbm5lbFwiIG1vZGVJbmRleD17MH0gLz5cclxuICAgICAgICAgICAgPEVmZmVjdFBhbmVsIG1vZGU9XCJwYXR0ZXJuXCIgbW9kZUluZGV4PXswfSAvPlxyXG4gICAgICAgICAgICA8SGVscCAvPlxyXG4gICAgICAgIDwvZGl2PjtcclxuICAgIH1cclxufVxyXG5cclxuQHZpZXdcclxuY2xhc3MgTm90ZUNlbGwgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8eyBjaGFubmVsOiBudW1iZXIsIHBhdHRlcm46IG51bWJlciwgY2hvcmQ6IG51bWJlciwgbGV0dGVyOiBzdHJpbmcsIGluZGV4OiBudW1iZXIgfT4ge1xyXG4gICAgc3RhdGUgPSB7XHJcbiAgICAgICAgY2hvcmQ6IHRoaXMucHJvcHMuY2hvcmQsXHJcbiAgICAgICAgbGV0dGVyOiB0aGlzLnByb3BzLmxldHRlcixcclxuICAgICAgICBpbmRleDogdGhpcy5wcm9wcy5pbmRleCxcclxuICAgICAgICBsZW5ndGg6IDAsXHJcbiAgICAgICAgcGxheWluZzogZmFsc2UsXHJcbiAgICB9O1xyXG5cclxuICAgIG9uQ2xpY2soY2hvcmQ6IG51bWJlciwgbGV0dGVyOiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIHdpdGhTaGlmdDogYm9vbGVhbiwgd2l0aEN0cmw6IGJvb2xlYW4pIHtcclxuICAgICAgICBsZXQgbGVuZ3RoID0gdGhpcy5zdGF0ZS5sZW5ndGg7XHJcblxyXG4gICAgICAgIGlmICh3aXRoU2hpZnQgJiYgd2l0aEN0cmwpIHtcclxuICAgICAgICAgICAgbGVuZ3RoID0gTWF0aC5tYXgobGVuZ3RoIC0gMSwgMCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh3aXRoU2hpZnQpIHtcclxuICAgICAgICAgICAgbGVuZ3RoID0gTWF0aC5tYXgoTWF0aC5taW4obGVuZ3RoICsgMSwgMTYpLCAyKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGVuZ3RoID0gMDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZW5ndGggPSAxO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGxlbmd0aCA+IDAgJiYgbGVuZ3RoICE9PSB0aGlzLnN0YXRlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBzb25nLnNjaGVkdWxlTm90ZSh0aGlzLnByb3BzLmNoYW5uZWwsIHRoaXMucHJvcHMucGF0dGVybiwgY2hvcmQsIGxldHRlciwgaW5kZXgsIGxlbmd0aCwgdGhpcyk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChsZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgc29uZy51bnNjaGVkdWxlTm90ZSh0aGlzLnByb3BzLmNoYW5uZWwsIHRoaXMucHJvcHMucGF0dGVybiwgY2hvcmQsIGxldHRlciwgaW5kZXgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGxlbmd0aDogbGVuZ3RoIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xyXG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBbYG5vdGUtJHt0aGlzLnN0YXRlLmxldHRlcn1gXTtcclxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaChcImFjdGl2ZVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goXCJub3RlTG9uZ1wiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUucGxheWluZykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goXCJwbGF5aW5nTG9uZ1wiKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaChcInBsYXlpbmdcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiA8dGRcclxuICAgICAgICAgICAgaWQ9e2Ake3RoaXMuc3RhdGUubGV0dGVyfS0ke3RoaXMuc3RhdGUuY2hvcmR9LSR7dGhpcy5zdGF0ZS5pbmRleH1gfVxyXG4gICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMuam9pbihcIiBcIil9XHJcbiAgICAgICAgICAgIG9uQ2xpY2s9e2V2ZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25DbGljayh0aGlzLnN0YXRlLmNob3JkLCB0aGlzLnN0YXRlLmxldHRlciwgdGhpcy5zdGF0ZS5pbmRleCwgZXZlbnQuc2hpZnRLZXksIGV2ZW50LmN0cmxLZXkpO1xyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgID5cclxuICAgICAgICAgICAge3RoaXMuc3RhdGUubGVuZ3RoID09PSAwID8gXCJcIiA6IHRoaXMuc3RhdGUubGVuZ3RofVxyXG4gICAgICAgIDwvdGQ+O1xyXG4gICAgfVxyXG59XHJcblxyXG5Admlld1xyXG5jbGFzcyBQYXR0ZXJuV29ya3NwYWNlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PHsgY2hhbm5lbDogbnVtYmVyLCBwYXR0ZXJuOiBudW1iZXIgfT4ge1xyXG4gICAgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XHJcbiAgICAgICAgbGV0IHJvd3MgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IGNob3JkIG9mIGNob3Jkcy5zbGljZSgpLnJldmVyc2UoKSkge1xyXG4gICAgICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxldHRlciBvZiBsZXR0ZXJzLnNsaWNlKCkucmV2ZXJzZSgpKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgICAgIGlmIChmaXJzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaCg8dGgga2V5PXtgY2hvcmRIZWFkZXItJHtjaG9yZH1gfSByb3dTcGFuPXtsZXR0ZXJzLmxlbmd0aH0+e2Nob3JkfTwvdGg+KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKDx0aCBrZXk9e2BsZXR0ZXJIZWFkZXItJHtjaG9yZH0tJHtsZXR0ZXJ9YH0+e2xldHRlcn08L3RoPik7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIG9mIEFycmF5KDE2KS5rZXlzKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Tm90ZUNlbGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17YGNlbGwtJHtjaG9yZH0tJHtsZXR0ZXJ9LSR7aX1gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbD17dGhpcy5wcm9wcy5jaGFubmVsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybj17dGhpcy5wcm9wcy5wYXR0ZXJufVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvcmQ9e2Nob3JkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0dGVyPXtsZXR0ZXJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleD17aX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcm93cy5wdXNoKDx0ciBrZXk9e2Byb3ctJHtjaG9yZH0tJHtsZXR0ZXJ9YH0+e2l0ZW1zfTwvdHI+KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIDxkaXYgaWQ9XCJwYXR0ZXJuV29ya3NwYWNlXCIgY2xhc3NOYW1lPVwibm8tc2VsZWN0XCI+XHJcbiAgICAgICAgICAgIDx0YWJsZSBpZD1cInBhdHRlcm5cIj48dGJvZHk+e3Jvd3N9PC90Ym9keT48L3RhYmxlPlxyXG4gICAgICAgIDwvZGl2PjtcclxuICAgIH1cclxufVxyXG5cclxuQHZpZXdcclxuY2xhc3MgQXBwIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHN0YXRlID0ge1xyXG4gICAgICAgIGFjdGl2ZUNoYW5uZWw6IDAsXHJcbiAgICAgICAgYWN0aXZlUGF0dGVybjogMCxcclxuICAgIH07XHJcbiAgICBzYW1wbGVyczogeyBba2V5OiBudW1iZXJdOiB0b25lLlNhbXBsZXIgfSA9IHt9O1xyXG4gICAgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XHJcbiAgICAgICAgcmV0dXJuIDxkaXYgaWQ9XCJhcHBcIj5cclxuICAgICAgICAgICAgPE1ldGFXb3Jrc3BhY2UgYWN0aXZlQ2hhbm5lbD17dGhpcy5zdGF0ZS5hY3RpdmVDaGFubmVsfSBhY3RpdmVQYXR0ZXJuPXt0aGlzLnN0YXRlLmFjdGl2ZVBhdHRlcm59IC8+XHJcbiAgICAgICAgICAgIDxQYXR0ZXJuV29ya3NwYWNlIGNoYW5uZWw9e3RoaXMuc3RhdGUuYWN0aXZlQ2hhbm5lbH0gcGF0dGVybj17dGhpcy5zdGF0ZS5hY3RpdmVQYXR0ZXJufSAvPlxyXG4gICAgICAgIDwvZGl2PjtcclxuICAgIH1cclxufVxyXG5cclxuaW50ZXJmYWNlIE5vdGUge1xyXG4gICAgbGVuZ3RoOiBudW1iZXI7XHJcbiAgICBzY2hlZHVsZWRFdmVudDogbnVtYmVyIHwgbnVsbDtcclxufVxyXG5cclxubGV0IHBhdHRlcm5zOiB7IFtrZXk6IG51bWJlcl06IHsgW2tleTogc3RyaW5nXTogQXJyYXk8Tm90ZT4gfSB9ID0ge307XHJcbmZvciAoY29uc3QgY2hvcmQgb2YgY2hvcmRzKSB7XHJcbiAgICBwYXR0ZXJuc1tjaG9yZF0gPSB7fTtcclxuICAgIGZvciAoY29uc3QgbGV0dGVyIG9mIGxldHRlcnMpIHtcclxuICAgICAgICBwYXR0ZXJuc1tjaG9yZF1bbGV0dGVyXSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDE2IH0sICgpID0+IHsgcmV0dXJuIHsgbGVuZ3RoOiAwLCBzY2hlZHVsZWRFdmVudDogbnVsbCB9OyB9KTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdG9nZ2xlQXVkaW8oKSB7XHJcbiAgICBpZiAocGxheWluZykge1xyXG4gICAgICAgIHRvbmUuVHJhbnNwb3J0LnN0b3AoKTtcclxuICAgICAgICB0b25lLlRyYW5zcG9ydC5wb3NpdGlvbiA9IFwiMFwiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bWVBdWRpb0NvbnRleHQoKTtcclxuICAgICAgICB0b25lLlRyYW5zcG9ydC5sb29wRW5kID0gXCIxbVwiO1xyXG4gICAgICAgIHRvbmUuVHJhbnNwb3J0Lmxvb3AgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdG9uZS5UcmFuc3BvcnQudG9nZ2xlKDApO1xyXG4gICAgcGxheWluZyA9ICFwbGF5aW5nO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZXN1bWVBdWRpb0NvbnRleHQoKSB7XHJcbiAgICBsZXQgYWMgPSAodG9uZSBhcyBhbnkpLmNvbnRleHQ7XHJcbiAgICBpZiAoYWMuc3RhdGUgIT09IFwicnVubmluZ1wiKSB7XHJcbiAgICAgICAgYWMucmVzdW1lKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG9uTG9hZCgpIHtcclxuICAgIFJlYWN0RG9tLnJlbmRlcig8QXBwIC8+LCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI3Jvb3RcIikpO1xyXG5cclxuICAgIGRvY3VtZW50Lm9ua2V5cHJlc3MgPSBldmVudCA9PiB7XHJcbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDMyKSB7XHJcbiAgICAgICAgICAgIHNvbmcudG9nZ2xlQXVkaW8oKTtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBjZW50cmFsUm93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJGLTUtMFwiKTtcclxuICAgIGlmIChjZW50cmFsUm93ICE9PSBudWxsKSB7XHJcbiAgICAgICAgY2VudHJhbFJvdy5zY3JvbGxJbnRvVmlldyh7IFwiYmVoYXZpb3JcIjogXCJzbW9vdGhcIiwgXCJibG9ja1wiOiBcImNlbnRlclwiIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG53aW5kb3cub25sb2FkID0gb25Mb2FkO1xyXG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vaW5zdHJ1bWVudHMueWFtbCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LWJ1dHRvbi9kaXN0L2J1dHRvbi5jc3M/ZWJkZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LWJ1dHRvbi9kaXN0L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AbWF0ZXJpYWwvcmVhY3QtZGlhbG9nL2Rpc3QvZGlhbG9nLmNzcz9hNTczIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AbWF0ZXJpYWwvcmVhY3QtZGlhbG9nL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BtYXRlcmlhbC9yZWFjdC1kaWFsb2cvbm9kZV9tb2R1bGVzL0BtYXRlcmlhbC9yZWFjdC1idXR0b24vZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LWRpYWxvZy9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LXJpcHBsZS9kaXN0L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AbWF0ZXJpYWwvcmVhY3QtZmxvYXRpbmctbGFiZWwvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LWxpbmUtcmlwcGxlL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BtYXRlcmlhbC9yZWFjdC1saXN0L2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BtYXRlcmlhbC9yZWFjdC1tZW51LXN1cmZhY2UvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LW1lbnUtc3VyZmFjZS9kaXN0L21lbnUtc3VyZmFjZS5jc3M/MjM2NyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LW1lbnUvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LW1lbnUvbm9kZV9tb2R1bGVzL0BtYXRlcmlhbC9yZWFjdC1tZW51LXN1cmZhY2UvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LW5vdGNoZWQtb3V0bGluZS9kaXN0L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AbWF0ZXJpYWwvcmVhY3QtcmlwcGxlL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BtYXRlcmlhbC9yZWFjdC1zZWxlY3QvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LXNlbGVjdC9kaXN0L3NlbGVjdC5jc3M/M2JiMSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LXRleHQtZmllbGQvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LXRleHQtZmllbGQvZGlzdC90ZXh0LWZpZWxkLmNzcz9kZGViIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AbngtanMvb2JzZXJ2ZXItdXRpbC9kaXN0L2VzLmVzNS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY2xhc3NuYW1lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LWJ1dHRvbi9kaXN0L2J1dHRvbi5jc3MiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BtYXRlcmlhbC9yZWFjdC1kaWFsb2cvZGlzdC9kaWFsb2cuY3NzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AbWF0ZXJpYWwvcmVhY3QtbWVudS1zdXJmYWNlL2Rpc3QvbWVudS1zdXJmYWNlLmNzcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQG1hdGVyaWFsL3JlYWN0LXNlbGVjdC9kaXN0L3NlbGVjdC5jc3MiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BtYXRlcmlhbC9yZWFjdC10ZXh0LWZpZWxkL2Rpc3QvdGV4dC1maWVsZC5jc3MiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9jaGVja1Byb3BUeXBlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWVhc3ktc3RhdGUvZGlzdC9lcy5lczYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWVhc3ktc3RhdGUvZGlzdC9yZWFjdC1wbGF0Zm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LmRldmVsb3BtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2Nqcy9zY2hlZHVsZXItdHJhY2luZy5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2Nqcy9zY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL3RyYWNpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvbGliL3VybHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3RvbmUvYnVpbGQvVG9uZS5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL3NyYy9hdWRpby50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZGF0YS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsYXllci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0RBQTBDLGdDQUFnQztBQUMxRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdFQUF3RCxrQkFBa0I7QUFDMUU7QUFDQSx5REFBaUQsY0FBYztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQXlDLGlDQUFpQztBQUMxRSx3SEFBZ0gsbUJBQW1CLEVBQUU7QUFDckk7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFD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QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFlBQVksUUFBUTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0Es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OztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFD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QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLE9BQU87QUFDbEIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUIsMEJBQTBCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFlBQVksZUFBZTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNGQUFzRixhQUFhO0FBQ25HO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsV0FBVztBQUN0QixXQUFXLE9BQU87QUFDbEIsV0FBVyxFQUFFO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0RBQWtEO0FBQ2xEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHlDQUF5Qzs7QUFFekM7OztBQUdBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsa0JBQWtCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsYUFBYTtBQUMvQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSCxpQkFBaUIsa0NBQWtDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFlBQVksUUFBUTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUIseUJBQXlCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQix5QkFBeUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsdUJBQXVCO0FBQ2xDLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsdUJBQXVCO0FBQ2xDLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyx1QkFBdUI7QUFDbEMsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFdBQVc7QUFDdEIsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFlBQVksV0FBVztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsdUJBQXVCO0FBQ2xDLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixzQkFBc0I7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBLHVCQUF1QjtBQUN2Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQixzQkFBc0I7QUFDakQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUIsMkJBQTJCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDJCQUEyQjtBQUM5QztBQUNBO0FBQ0E7QUFDQSxvQkFBb0IscUJBQXFCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsc0JBQXNCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFdBQVc7QUFDdEIsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixZQUFZLE9BQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsRUFBRTtBQUNiLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCO0FBQ3hCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNENBQTRDOztBQUU1QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsV0FBVztBQUN0QixXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVSxpQ0FBaUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixzQkFBc0I7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxnQ0FBZ0MsS0FBSztBQUMzQztBQUNBO0FBQ0EsTUFBTSxnQ0FBZ0MsS0FBSztBQUMzQztBQUNBLDREQUE0RDtBQUM1RCxNQUFNLGdDQUFnQyxLQUFLO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscU9BQXFPO0FBQ3JPO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhLQUE4SyxZQUFZO0FBQzFMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUxBQXVMLCtCQUErQjtBQUN0Tjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpS0FBaUssaUJBQWlCO0FBQ2xMLE9BQU87QUFDUCxpS0FBaUssaUJBQWlCLHdEQUF3RCxtQkFBbUIsZ0JBQWdCLDhCQUE4QjtBQUMzUztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLCtHQUErRyxHQUFHO0FBQ2xIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRJQUE0SSxtQkFBbUIsZ0JBQWdCLDhCQUE4QjtBQUM3TSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxZQUFZLEtBQUk7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQiwwQkFBMEI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0Esc0RBQXNELGVBQWU7QUFDckUsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLDRCQUE0QjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxZQUFZLEtBQUk7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQiw0QkFBNEI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isd0JBQXdCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxLQUFJO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsY0FBYyxLQUFJO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxZQUFZLEtBQUk7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLFVBQVUsS0FBSTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUNBQWlDO0FBQ2pDLGdCQUFnQjs7QUFFaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNLEtBQUk7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNLEtBQUk7QUFDVjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0EsTUFBTSxLQUFJO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTSxLQUFJO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTSxLQUFJO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1CQUFtQjtBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpRUFBaUU7QUFDakU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsVUFBVSxLQUFJO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLHNGQUFzRixhQUFhO0FBQ25HO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRGQUE0RixlQUFlO0FBQzNHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSx3Q0FBd0M7QUFDeEMsaURBQWlEO0FBQ2pELHFEQUFxRDtBQUNyRCwwREFBMEQ7QUFDMUQsOERBQThEO0FBQzlELDJEQUEyRDtBQUMzRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtHQUFrRztBQUNsRzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNklBQTZJOztBQUU3STtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNULGtFQUFrRSw0Q0FBNEM7QUFDOUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtLQUFrSyx5Q0FBeUM7QUFDM007QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQix3QkFBd0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsa0RBQWtEO0FBQzVEO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWSw2QkFBNkI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFVBQVUsNkJBQTZCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxhQUFhO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVSxpQ0FBaUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFlBQVk7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFVBQVUsWUFBWTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkNBQTZDLE1BQU07QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLHVCQUF1Qiw4QkFBOEI7QUFDckQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsNENBQTRDO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSx5TkFBeU4sMENBQTBDO0FBQ25RO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSCxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLHlOQUF5TixxQ0FBcUMsd0ZBQXdGLDJCQUEyQixxQkFBcUIsUUFBUSxZQUFZO0FBQzFaLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksS0FBSTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUFJO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsVUFBVSxLQUFJO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxVQUFVLEtBQUk7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLEtBQUk7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWSxLQUFJO0FBQ2hCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLEtBQUk7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxNQUFNLEtBQUk7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQUk7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsS0FBSTtBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsWUFBWSxLQUFJO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsOE1BQThNLG9EQUFvRCxFQUFFO0FBQ3BRO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFLG1CQUFtQjtBQUN6Rjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUVBQXlFO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixvQkFBb0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnR0FBZ0c7QUFDaEc7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7O0FBRXBCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStEO0FBQy9EO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixzQkFBc0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsc0JBQXNCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLGlRQUFpUSxjQUFjO0FBQy9RO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNB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QixhQUFhLFVBQVU7QUFDdkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFdBQVc7QUFDeEIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsVUFBVTtBQUN2QixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsZ0JBQWdCO0FBQzNCO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0ZBQXNGLGFBQWE7QUFDbkc7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsRUFBRTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLEVBQUU7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsaUJBQWlCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLGlCQUFpQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsc0JBQXNCO0FBQ3pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLHNCQUFzQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7O0FBR0Esa0RBQWtEOzs7QUFHbEQ7OztBQUdBOzs7QUFHQTtBQUNBOztBQUVBOzs7QUFHQTs7O0FBR0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7Ozs7Ozs7Ozs7Ozs7QUM1MkRhOztBQUViLElBQUksS0FBcUMsRUFBRSxFQUUxQztBQUNELG1CQUFtQixtQkFBTyxDQUFDLGlGQUE0QjtBQUN2RDs7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7Ozs7QUFJYixJQUFJLElBQXFDO0FBQ3pDO0FBQ0E7O0FBRUEsOENBQThDLGNBQWM7O0FBRTVEOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7O0FBR0Esa0RBQWtEOzs7QUFHbEQ7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7O0FBR0E7OztBQUdBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7Ozs7Ozs7Ozs7O0FDdGFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7Ozs7QUFJYixJQUFJLElBQXFDO0FBQ3pDO0FBQ0E7O0FBRUEsOENBQThDLGNBQWM7O0FBRTVEOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtB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QUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQ7O0FBRUEsNkJBQTZCLG1CQUFtQjs7QUFFaEQ7O0FBRUE7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7OztBQzlZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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LEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUk7b0JBQ3ZILDJEQUFDLFlBQVksSUFBQyxNQUFNLEVBQUMsV0FBVyxFQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUk7b0JBQ3pILDJEQUFDLFlBQVksSUFBQyxNQUFNLEVBQUMsT0FBTyxFQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUk7b0JBQ25ILDJEQUFDLFlBQVksSUFBQyxNQUFNLEVBQUMsUUFBUSxFQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUk7b0JBQ3BILDJEQUFDLFlBQVksSUFBQyxNQUFNLEVBQUMsUUFBUSxFQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUk7b0JBQ3BILDJEQUFDLFlBQVksSUFBQyxNQUFNLEVBQUMsWUFBWSxFQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFF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QUNmO0FBQ0wsQ0FBQztBQUVELFNBQVMsTUFBTTtJQUNYLGdEQUFRLENBQUMsTUFBTSxDQUFDLDJEQUFDLEdBQUcsT0FBRyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUUxRCxRQUFRLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxFQUFFO1FBQzFCLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxFQUFFLEVBQUU7WUFDdEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25CLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDMUI7SUFDTCxDQUFDLENBQUM7SUFFRixNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BELElBQUksVUFBVSxLQUFLLElBQUksRUFBRTtRQUNyQixVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztLQUMxRTtBQUNMLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL3BsYXllci50c3hcIik7XG4iLCJjb25zdCBkb2MgPSBbKHtcIm1pZGkucGlhbm8xXCI6KHtcImluZGV4XCI6MCwgXCJkdXJhdGlvblwiOlwic2hvcnRcIiwgXCJjYXRlZ29yeVwiOltcIk1JRElcIiwgXCJQaWFub1wiLCBcIkdyYW5kIFBpYW5vXCJdfSksIFwibWlkaS5jaHJvbTFcIjooe1wiaW5kZXhcIjo4LCBcImR1cmF0aW9uXCI6XCJjb25zdGFudFwiLCBcImNhdGVnb3J5XCI6W1wiTUlESVwiLCBcIkJlbGxzXCIsIFwiQ2VsZXN0YVwiXX0pLCBcIm1pZGkub3JnYW4xXCI6KHtcImluZGV4XCI6MTYsIFwiZHVyYXRpb25cIjpcImluc3RhbnRcIiwgXCJjYXRlZ29yeVwiOltcIk1JRElcIiwgXCJPcmdhblwiLCBcIkRyYXdiYXIgT3JnYW5cIl19KSwgXCJtaWRpLmd1aXRhcjFcIjooe1wiaW5kZXhcIjoyNCwgXCJkdXJhdGlvblwiOlwic2hvcnRcIiwgXCJjYXRlZ29yeVwiOltcIk1JRElcIiwgXCJHdWl0YXJcIiwgXCJOeWxvbiBHdWl0YXJcIl19KSwgXCJtaWRpLmJhc3MxXCI6KHtcImluZGV4XCI6MzIsIFwiZHVyYXRpb25cIjpcImluc3RhbnRcIiwgXCJjYXRlZ29yeVwiOltcIk1JRElcIiwgXCJCYXNzXCIsIFwiQWNvdXN0aWMgQmFzc1wiXX0pLCBcIm1pZGkuc3RyaW5nczFcIjooe1wiaW5kZXhcIjo0MCwgXCJkdXJhdGlvblwiOlwibWluaVwiLCBcImNhdGVnb3J5XCI6W1wiTUlESVwiLCBcIlN0cmluZ3NcIiwgXCJWaW9saW5cIl19KSwgXCJtaWRpLmVuc2VtYmxlMVwiOih7XCJpbmRleFwiOjQ4LCBcImR1cmF0aW9uXCI6XCJtaWRcIiwgXCJjYXRlZ29yeVwiOltcIk1JRElcIiwgXCJFbnNlbWJsZVwiLCBcIlN0cmluZyBFbnNlbWJsZSAxXCJdfSksIFwibWlkaS5icmFzczFcIjooe1wiaW5kZXhcIjo1NiwgXCJkdXJhdGlvblwiOlwibWluaVwiLCBcImNhdGVnb3J5XCI6W1wiTUlESVwiLCBcIkJyYXNzXCIsIFwiVHJ1bXBldFwiXX0pLCBcIm1pZGkucmVlZDFcIjooe1wiaW5kZXhcIjo2NCwgXCJkdXJhdGlvblwiOlwibWluaVwiLCBcImNhdGVnb3J5XCI6W1wiTUlESVwiLCBcIlJlZWRcIiwgXCJTb3ByYW5vIFNheFwiXX0pLCBcIm1pZGkucGlwZTFcIjooe1wiaW5kZXhcIjo3MiwgXCJkdXJhdGlvblwiOlwibWluaVwiLCBcImNhdGVnb3J5XCI6W1wiTUlESVwiLCBcIlBpcGVcIiwgXCJQaWNjb2xvXCJdfSksIFwibWlkaS5sZWFkMVwiOih7XCJpbmRleFwiOjgwLCBcImR1cmF0aW9uXCI6XCJtaW5pXCIsIFwiY2F0ZWdvcnlcIjpbXCJNSURJXCIsIFwiTGVhZFwiLCBcIlNxdWFyZSBMZWFkXCJdfSksIFwibWlkaS5wYWQxXCI6KHtcImluZGV4XCI6ODgsIFwiZHVyYXRpb25cIjpcImxvbmdcIiwgXCJjYXRlZ29yeVwiOltcIk1JRElcIiwgXCJQYWRzXCIsIFwiTmV3IEFnZSBQYWRcIl19KSwgXCJtaWRpLmZ4MVwiOih7XCJpbmRleFwiOjk2LCBcImR1cmF0aW9uXCI6XCJtZWdhXCIsIFwiY2F0ZWdvcnlcIjpbXCJNSURJXCIsIFwiU3ludGhcIiwgXCJSYWluXCJdfSksIFwibWlkaS53b3JsZDFcIjooe1wiaW5kZXhcIjoxMDQsIFwiZHVyYXRpb25cIjpcImV4dGVuZGVkXCIsIFwiY2F0ZWdvcnlcIjpbXCJNSURJXCIsIFwiV29ybGRcIiwgXCJTaXRhclwiXX0pLCBcIm1pZGkucGVyY3VzMVwiOih7XCJpbmRleFwiOjExMiwgXCJkdXJhdGlvblwiOlwibG9uZ1wiLCBcImNhdGVnb3J5XCI6W1wiTUlESVwiLCBcIkRydW1zXCIsIFwiVGlua2xlIEJlbGxcIl19KSwgXCJtaWRpLnNlMVwiOih7XCJpbmRleFwiOjEyMCwgXCJkdXJhdGlvblwiOlwibWluaVwiLCBcImNhdGVnb3J5XCI6W1wiTUlESVwiLCBcIkVmZmVjdHNcIiwgXCJGcmV0IE5vaXNlXCJdfSksIFwic3F1YXJlXCI6KHtcImluZGV4XCI6MTI4LCBcImR1cmF0aW9uXCI6XCJpbmZpbml0ZVwiLCBcImNhdGVnb3J5XCI6W1wiQ2hpcHR1bmVcIiwgXCJTcXVhcmUgV2F2ZVwiXX0pfSldO1xubW9kdWxlLmV4cG9ydHMgPSBkb2MubGVuZ3RoIDw9IDEgPyBkb2NbMF0gOiBkb2M7IiwiXG52YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9idXR0b24uY3NzXCIpO1xuXG5pZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblxudmFyIHRyYW5zZm9ybTtcbnZhciBpbnNlcnRJbnRvO1xuXG5cblxudmFyIG9wdGlvbnMgPSB7XCJobXJcIjp0cnVlfVxuXG5vcHRpb25zLnRyYW5zZm9ybSA9IHRyYW5zZm9ybVxub3B0aW9ucy5pbnNlcnRJbnRvID0gdW5kZWZpbmVkO1xuXG52YXIgdXBkYXRlID0gcmVxdWlyZShcIiEuLi8uLi8uLi9zdHlsZS1sb2FkZXIvbGliL2FkZFN0eWxlcy5qc1wiKShjb250ZW50LCBvcHRpb25zKTtcblxuaWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cbmlmKG1vZHVsZS5ob3QpIHtcblx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9idXR0b24uY3NzXCIsIGZ1bmN0aW9uKCkge1xuXHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2J1dHRvbi5jc3NcIik7XG5cblx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblxuXHRcdHZhciBsb2NhbHMgPSAoZnVuY3Rpb24oYSwgYikge1xuXHRcdFx0dmFyIGtleSwgaWR4ID0gMDtcblxuXHRcdFx0Zm9yKGtleSBpbiBhKSB7XG5cdFx0XHRcdGlmKCFiIHx8IGFba2V5XSAhPT0gYltrZXldKSByZXR1cm4gZmFsc2U7XG5cdFx0XHRcdGlkeCsrO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3Ioa2V5IGluIGIpIGlkeC0tO1xuXG5cdFx0XHRyZXR1cm4gaWR4ID09PSAwO1xuXHRcdH0oY29udGVudC5sb2NhbHMsIG5ld0NvbnRlbnQubG9jYWxzKSk7XG5cblx0XHRpZighbG9jYWxzKSB0aHJvdyBuZXcgRXJyb3IoJ0Fib3J0aW5nIENTUyBITVIgZHVlIHRvIGNoYW5nZWQgY3NzLW1vZHVsZXMgbG9jYWxzLicpO1xuXG5cdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHR9KTtcblxuXHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcbn0iLCIhZnVuY3Rpb24oZSx0KXtpZihcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZSltb2R1bGUuZXhwb3J0cz10KHJlcXVpcmUoXCJyZWFjdFwiKSxyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSxyZXF1aXJlKFwiQG1hdGVyaWFsL3JlYWN0LXJpcHBsZS9kaXN0L2luZGV4LmpzXCIpKTtlbHNlIGlmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW1wicmVhY3RcIixcImNsYXNzbmFtZXNcIixcIkBtYXRlcmlhbC9yZWFjdC1yaXBwbGUvZGlzdC9pbmRleC5qc1wiXSx0KTtlbHNle3ZhciBuPVwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP3QocmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpLHJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtcmlwcGxlL2Rpc3QvaW5kZXguanNcIikpOnQoZS5yZWFjdCxlLmNsYXNzbmFtZXMsZVtcIkBtYXRlcmlhbC9yZWFjdC1yaXBwbGUvZGlzdC9pbmRleC5qc1wiXSk7Zm9yKHZhciByIGluIG4pKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6ZSlbcl09bltyXX19KFwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcyxmdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Z1bmN0aW9uIG4ocil7aWYodFtyXSlyZXR1cm4gdFtyXS5leHBvcnRzO3ZhciBvPXRbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiBlW3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9cmV0dXJuIG4ubT1lLG4uYz10LG4uZD1mdW5jdGlvbihlLHQscil7bi5vKGUsdCl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6ITAsZ2V0OnJ9KX0sbi5yPWZ1bmN0aW9uKGUpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbihlLHQpe2lmKDEmdCYmKGU9bihlKSksOCZ0KXJldHVybiBlO2lmKDQmdCYmXCJvYmplY3RcIj09dHlwZW9mIGUmJmUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTplfSksMiZ0JiZcInN0cmluZ1wiIT10eXBlb2YgZSlmb3IodmFyIG8gaW4gZSluLmQocixvLGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfS5iaW5kKG51bGwsbykpO3JldHVybiByfSxuLm49ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIG4uZCh0LFwiYVwiLHQpLHR9LG4ubz1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX0sbi5wPVwiXCIsbihuLnM9NDUpfSh7MDpmdW5jdGlvbih0LG4pe3QuZXhwb3J0cz1lfSwxOmZ1bmN0aW9uKGUsbil7ZS5leHBvcnRzPXR9LDQ1OmZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPTEscj1hcmd1bWVudHMubGVuZ3RoO248cjtuKyspZm9yKHZhciBvIGluIHQ9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG8pJiYoZVtvXT10W29dKTtyZXR1cm4gZX0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sbz10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtmb3IodmFyIHIgaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmdC5pbmRleE9mKHIpPDAmJihuW3JdPWVbcl0pO2lmKG51bGwhPWUmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBvPTA7Zm9yKHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtvPHIubGVuZ3RoO28rKyl0LmluZGV4T2YocltvXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUscltvXSkmJihuW3Jbb11dPWVbcltvXV0pfXJldHVybiBufSxpPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBsPWkobigwKSksdT1pKG4oMSkpLGE9big1KSxzPW4oNDYpO3QuQnV0dG9uPWZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5jbGFzc05hbWUsaT12b2lkIDA9PT1uP1wiXCI6bixhPWUucmFpc2VkLGQ9dm9pZCAwIT09YSYmYSxmPWUudW5lbGV2YXRlZCxwPXZvaWQgMCE9PWYmJmYsUz1lLm91dGxpbmVkLGI9dm9pZCAwIT09UyYmUyxtPWUuZGVuc2UseT12b2lkIDAhPT1tJiZtLEU9ZS5kaXNhYmxlZCxfPXZvaWQgMCE9PUUmJkUsdj1lLmljb24sTz1lLmhyZWYsaj1lLmNoaWxkcmVuLEM9ZS5pbml0UmlwcGxlLGg9ZS50cmFpbGluZ0ljb24seD0oZS51bmJvdW5kZWQsbyhlLFtcImNsYXNzTmFtZVwiLFwicmFpc2VkXCIsXCJ1bmVsZXZhdGVkXCIsXCJvdXRsaW5lZFwiLFwiZGVuc2VcIixcImRpc2FibGVkXCIsXCJpY29uXCIsXCJocmVmXCIsXCJjaGlsZHJlblwiLFwiaW5pdFJpcHBsZVwiLFwidHJhaWxpbmdJY29uXCIsXCJ1bmJvdW5kZWRcIl0pKSxMPXIoe2NsYXNzTmFtZTp1LmRlZmF1bHQocy5DU1NfQ0xBU1NFUy5ST09ULGksKHQ9e30sdFtzLkNTU19DTEFTU0VTLlJBSVNFRF09ZCx0W3MuQ1NTX0NMQVNTRVMuVU5FTEVWQVRFRF09cCx0W3MuQ1NTX0NMQVNTRVMuT1VUTElORURdPWIsdFtzLkNTU19DTEFTU0VTLkRFTlNFXT15LHQpKSxyZWY6QyxkaXNhYmxlZDpffSx4KTtyZXR1cm4gTz9sLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImFcIixyKHt9LEwse2hyZWY6T30pLGg/bnVsbDpjKHYpLGwuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6cy5DU1NfQ0xBU1NFUy5MQUJFTH0saiksaD9jKGgpOm51bGwpOmwuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIscih7fSxMKSxoP251bGw6Yyh2KSxsLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7Y2xhc3NOYW1lOnMuQ1NTX0NMQVNTRVMuTEFCRUx9LGopLGg/YyhoKTpudWxsKX07dmFyIGM9ZnVuY3Rpb24oZSl7cmV0dXJuIGU/bC5kZWZhdWx0LmNsb25lRWxlbWVudChlLHtjbGFzc05hbWU6dS5kZWZhdWx0KHMuQ1NTX0NMQVNTRVMuSUNPTixlLnByb3BzLmNsYXNzTmFtZSl9KTpudWxsfTt0LkJ1dHRvbi5kZWZhdWx0UHJvcHM9e2luaXRSaXBwbGU6ZnVuY3Rpb24oKXt9fSx0LmRlZmF1bHQ9YS53aXRoUmlwcGxlKHQuQnV0dG9uKX0sNDY6ZnVuY3Rpb24oZSx0LG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3QuQ1NTX0NMQVNTRVM9e1JPT1Q6XCJtZGMtYnV0dG9uXCIsSUNPTjpcIm1kYy1idXR0b25fX2ljb25cIixMQUJFTDpcIm1kYy1idXR0b25fX2xhYmVsXCIsREVOU0U6XCJtZGMtYnV0dG9uLS1kZW5zZVwiLFJBSVNFRDpcIm1kYy1idXR0b24tLXJhaXNlZFwiLE9VVExJTkVEOlwibWRjLWJ1dHRvbi0tb3V0bGluZWRcIixVTkVMRVZBVEVEOlwibWRjLWJ1dHRvbi0tdW5lbGV2YXRlZFwifX0sNTpmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1ufX0pfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1idXR0b24uanMubWFwIiwiXG52YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kaWFsb2cuY3NzXCIpO1xuXG5pZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblxudmFyIHRyYW5zZm9ybTtcbnZhciBpbnNlcnRJbnRvO1xuXG5cblxudmFyIG9wdGlvbnMgPSB7XCJobXJcIjp0cnVlfVxuXG5vcHRpb25zLnRyYW5zZm9ybSA9IHRyYW5zZm9ybVxub3B0aW9ucy5pbnNlcnRJbnRvID0gdW5kZWZpbmVkO1xuXG52YXIgdXBkYXRlID0gcmVxdWlyZShcIiEuLi8uLi8uLi9zdHlsZS1sb2FkZXIvbGliL2FkZFN0eWxlcy5qc1wiKShjb250ZW50LCBvcHRpb25zKTtcblxuaWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cbmlmKG1vZHVsZS5ob3QpIHtcblx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kaWFsb2cuY3NzXCIsIGZ1bmN0aW9uKCkge1xuXHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2RpYWxvZy5jc3NcIik7XG5cblx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblxuXHRcdHZhciBsb2NhbHMgPSAoZnVuY3Rpb24oYSwgYikge1xuXHRcdFx0dmFyIGtleSwgaWR4ID0gMDtcblxuXHRcdFx0Zm9yKGtleSBpbiBhKSB7XG5cdFx0XHRcdGlmKCFiIHx8IGFba2V5XSAhPT0gYltrZXldKSByZXR1cm4gZmFsc2U7XG5cdFx0XHRcdGlkeCsrO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3Ioa2V5IGluIGIpIGlkeC0tO1xuXG5cdFx0XHRyZXR1cm4gaWR4ID09PSAwO1xuXHRcdH0oY29udGVudC5sb2NhbHMsIG5ld0NvbnRlbnQubG9jYWxzKSk7XG5cblx0XHRpZighbG9jYWxzKSB0aHJvdyBuZXcgRXJyb3IoJ0Fib3J0aW5nIENTUyBITVIgZHVlIHRvIGNoYW5nZWQgY3NzLW1vZHVsZXMgbG9jYWxzLicpO1xuXG5cdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHR9KTtcblxuXHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcbn0iLCIhZnVuY3Rpb24odCxlKXtpZihcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZSltb2R1bGUuZXhwb3J0cz1lKHJlcXVpcmUoXCJyZWFjdFwiKSxyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSxyZXF1aXJlKFwiQG1hdGVyaWFsL3JlYWN0LWJ1dHRvbi9kaXN0L2luZGV4LmpzXCIpKTtlbHNlIGlmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW1wicmVhY3RcIixcImNsYXNzbmFtZXNcIixcIkBtYXRlcmlhbC9yZWFjdC1idXR0b24vZGlzdC9pbmRleC5qc1wiXSxlKTtlbHNle3ZhciBuPVwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2UocmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpLHJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtYnV0dG9uL2Rpc3QvaW5kZXguanNcIikpOmUodC5yZWFjdCx0LmNsYXNzbmFtZXMsdFtcIkBtYXRlcmlhbC9yZWFjdC1idXR0b24vZGlzdC9pbmRleC5qc1wiXSk7Zm9yKHZhciBvIGluIG4pKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6dClbb109bltvXX19KFwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcyxmdW5jdGlvbih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4obyl7aWYoZVtvXSlyZXR1cm4gZVtvXS5leHBvcnRzO3ZhciByPWVbb109e2k6byxsOiExLGV4cG9ydHM6e319O3JldHVybiB0W29dLmNhbGwoci5leHBvcnRzLHIsci5leHBvcnRzLG4pLHIubD0hMCxyLmV4cG9ydHN9cmV0dXJuIG4ubT10LG4uYz1lLG4uZD1mdW5jdGlvbih0LGUsbyl7bi5vKHQsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2VudW1lcmFibGU6ITAsZ2V0Om99KX0sbi5yPWZ1bmN0aW9uKHQpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbih0LGUpe2lmKDEmZSYmKHQ9bih0KSksOCZlKXJldHVybiB0O2lmKDQmZSYmXCJvYmplY3RcIj09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgbz1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihvKSxPYmplY3QuZGVmaW5lUHJvcGVydHkobyxcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTp0fSksMiZlJiZcInN0cmluZ1wiIT10eXBlb2YgdClmb3IodmFyIHIgaW4gdCluLmQobyxyLGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfS5iaW5kKG51bGwscikpO3JldHVybiBvfSxuLm49ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIG4uZChlLFwiYVwiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPVwiXCIsbihuLnM9NjApfSh7MDpmdW5jdGlvbihlLG4pe2UuZXhwb3J0cz10fSwxOmZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWV9LDE2MTpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5yKGUpO1wiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yO1xuLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxuXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovdmFyIG89ZnVuY3Rpb24odCxlKXtyZXR1cm4obz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9O3ZhciByPWZ1bmN0aW9uKCl7cmV0dXJuKHI9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxvPWFyZ3VtZW50cy5sZW5ndGg7bjxvO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZvaWQgMD09PXQmJih0PXt9KSx0aGlzLmFkYXB0ZXJfPXR9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcInN0cmluZ3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJudW1iZXJzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe30sdH0oKSxhPW4oNCk7bi5kKGUsXCJNRENEaWFsb2dGb3VuZGF0aW9uXCIsZnVuY3Rpb24oKXtyZXR1cm4gc30pO1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG52YXIgcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciBvPXQuY2FsbCh0aGlzLHIoe30sZS5kZWZhdWx0QWRhcHRlcixuKSl8fHRoaXM7cmV0dXJuIG8uaXNPcGVuXz0hMSxvLmFuaW1hdGlvbkZyYW1lXz0wLG8uYW5pbWF0aW9uVGltZXJfPTAsby5sYXlvdXRGcmFtZV89MCxvLmVzY2FwZUtleUFjdGlvbl89YS5zdHJpbmdzLkNMT1NFX0FDVElPTixvLnNjcmltQ2xpY2tBY3Rpb25fPWEuc3RyaW5ncy5DTE9TRV9BQ1RJT04sby5hdXRvU3RhY2tCdXR0b25zXz0hMCxvLmFyZUJ1dHRvbnNTdGFja2VkXz0hMSxvfXJldHVybiBmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9byh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0oZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEuY3NzQ2xhc3Nlc30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcInN0cmluZ3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEuc3RyaW5nc30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIm51bWJlcnNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEubnVtYmVyc30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybnthZGRCb2R5Q2xhc3M6ZnVuY3Rpb24oKXt9LGFkZENsYXNzOmZ1bmN0aW9uKCl7fSxhcmVCdXR0b25zU3RhY2tlZDpmdW5jdGlvbigpe3JldHVybiExfSxjbGlja0RlZmF1bHRCdXR0b246ZnVuY3Rpb24oKXt9LGV2ZW50VGFyZ2V0TWF0Y2hlczpmdW5jdGlvbigpe3JldHVybiExfSxnZXRBY3Rpb25Gcm9tRXZlbnQ6ZnVuY3Rpb24oKXtyZXR1cm5cIlwifSxoYXNDbGFzczpmdW5jdGlvbigpe3JldHVybiExfSxpc0NvbnRlbnRTY3JvbGxhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LG5vdGlmeUNsb3NlZDpmdW5jdGlvbigpe30sbm90aWZ5Q2xvc2luZzpmdW5jdGlvbigpe30sbm90aWZ5T3BlbmVkOmZ1bmN0aW9uKCl7fSxub3RpZnlPcGVuaW5nOmZ1bmN0aW9uKCl7fSxyZWxlYXNlRm9jdXM6ZnVuY3Rpb24oKXt9LHJlbW92ZUJvZHlDbGFzczpmdW5jdGlvbigpe30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oKXt9LHJldmVyc2VCdXR0b25zOmZ1bmN0aW9uKCl7fSx0cmFwRm9jdXM6ZnVuY3Rpb24oKXt9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dGhpcy5hZGFwdGVyXy5oYXNDbGFzcyhhLmNzc0NsYXNzZXMuU1RBQ0tFRCkmJnRoaXMuc2V0QXV0b1N0YWNrQnV0dG9ucyghMSl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmlzT3Blbl8mJnRoaXMuY2xvc2UoYS5zdHJpbmdzLkRFU1RST1lfQUNUSU9OKSx0aGlzLmFuaW1hdGlvblRpbWVyXyYmKGNsZWFyVGltZW91dCh0aGlzLmFuaW1hdGlvblRpbWVyXyksdGhpcy5oYW5kbGVBbmltYXRpb25UaW1lckVuZF8oKSksdGhpcy5sYXlvdXRGcmFtZV8mJihjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmxheW91dEZyYW1lXyksdGhpcy5sYXlvdXRGcmFtZV89MCl9LGUucHJvdG90eXBlLm9wZW49ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuaXNPcGVuXz0hMCx0aGlzLmFkYXB0ZXJfLm5vdGlmeU9wZW5pbmcoKSx0aGlzLmFkYXB0ZXJfLmFkZENsYXNzKGEuY3NzQ2xhc3Nlcy5PUEVOSU5HKSx0aGlzLnJ1bk5leHRBbmltYXRpb25GcmFtZV8oZnVuY3Rpb24oKXt0LmFkYXB0ZXJfLmFkZENsYXNzKGEuY3NzQ2xhc3Nlcy5PUEVOKSx0LmFkYXB0ZXJfLmFkZEJvZHlDbGFzcyhhLmNzc0NsYXNzZXMuU0NST0xMX0xPQ0spLHQubGF5b3V0KCksdC5hbmltYXRpb25UaW1lcl89c2V0VGltZW91dChmdW5jdGlvbigpe3QuaGFuZGxlQW5pbWF0aW9uVGltZXJFbmRfKCksdC5hZGFwdGVyXy50cmFwRm9jdXMoKSx0LmFkYXB0ZXJfLm5vdGlmeU9wZW5lZCgpfSxhLm51bWJlcnMuRElBTE9HX0FOSU1BVElPTl9PUEVOX1RJTUVfTVMpfSl9LGUucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dm9pZCAwPT09dCYmKHQ9XCJcIiksdGhpcy5pc09wZW5fJiYodGhpcy5pc09wZW5fPSExLHRoaXMuYWRhcHRlcl8ubm90aWZ5Q2xvc2luZyh0KSx0aGlzLmFkYXB0ZXJfLmFkZENsYXNzKGEuY3NzQ2xhc3Nlcy5DTE9TSU5HKSx0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGEuY3NzQ2xhc3Nlcy5PUEVOKSx0aGlzLmFkYXB0ZXJfLnJlbW92ZUJvZHlDbGFzcyhhLmNzc0NsYXNzZXMuU0NST0xMX0xPQ0spLGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uRnJhbWVfKSx0aGlzLmFuaW1hdGlvbkZyYW1lXz0wLGNsZWFyVGltZW91dCh0aGlzLmFuaW1hdGlvblRpbWVyXyksdGhpcy5hbmltYXRpb25UaW1lcl89c2V0VGltZW91dChmdW5jdGlvbigpe2UuYWRhcHRlcl8ucmVsZWFzZUZvY3VzKCksZS5oYW5kbGVBbmltYXRpb25UaW1lckVuZF8oKSxlLmFkYXB0ZXJfLm5vdGlmeUNsb3NlZCh0KX0sYS5udW1iZXJzLkRJQUxPR19BTklNQVRJT05fQ0xPU0VfVElNRV9NUykpfSxlLnByb3RvdHlwZS5pc09wZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc09wZW5ffSxlLnByb3RvdHlwZS5nZXRFc2NhcGVLZXlBY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lc2NhcGVLZXlBY3Rpb25ffSxlLnByb3RvdHlwZS5zZXRFc2NhcGVLZXlBY3Rpb249ZnVuY3Rpb24odCl7dGhpcy5lc2NhcGVLZXlBY3Rpb25fPXR9LGUucHJvdG90eXBlLmdldFNjcmltQ2xpY2tBY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zY3JpbUNsaWNrQWN0aW9uX30sZS5wcm90b3R5cGUuc2V0U2NyaW1DbGlja0FjdGlvbj1mdW5jdGlvbih0KXt0aGlzLnNjcmltQ2xpY2tBY3Rpb25fPXR9LGUucHJvdG90eXBlLmdldEF1dG9TdGFja0J1dHRvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hdXRvU3RhY2tCdXR0b25zX30sZS5wcm90b3R5cGUuc2V0QXV0b1N0YWNrQnV0dG9ucz1mdW5jdGlvbih0KXt0aGlzLmF1dG9TdGFja0J1dHRvbnNfPXR9LGUucHJvdG90eXBlLmxheW91dD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5sYXlvdXRGcmFtZV8mJmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMubGF5b3V0RnJhbWVfKSx0aGlzLmxheW91dEZyYW1lXz1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt0LmxheW91dEludGVybmFsXygpLHQubGF5b3V0RnJhbWVfPTB9KX0sZS5wcm90b3R5cGUuaGFuZGxlSW50ZXJhY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9XCJjbGlja1wiPT09dC50eXBlLG49XCJFbnRlclwiPT09dC5rZXl8fDEzPT09dC5rZXlDb2RlLG89XCJTcGFjZVwiPT09dC5rZXl8fDMyPT09dC5rZXlDb2RlLHI9dGhpcy5hZGFwdGVyXy5ldmVudFRhcmdldE1hdGNoZXModC50YXJnZXQsYS5zdHJpbmdzLlNDUklNX1NFTEVDVE9SKSxpPSF0aGlzLmFkYXB0ZXJfLmV2ZW50VGFyZ2V0TWF0Y2hlcyh0LnRhcmdldCxhLnN0cmluZ3MuU1VQUFJFU1NfREVGQVVMVF9QUkVTU19TRUxFQ1RPUik7aWYoZSYmciYmXCJcIiE9PXRoaXMuc2NyaW1DbGlja0FjdGlvbl8pdGhpcy5jbG9zZSh0aGlzLnNjcmltQ2xpY2tBY3Rpb25fKTtlbHNlIGlmKGV8fG98fG4pe3ZhciBzPXRoaXMuYWRhcHRlcl8uZ2V0QWN0aW9uRnJvbUV2ZW50KHQpO3M/dGhpcy5jbG9zZShzKTpuJiZpJiZ0aGlzLmFkYXB0ZXJfLmNsaWNrRGVmYXVsdEJ1dHRvbigpfX0sZS5wcm90b3R5cGUuaGFuZGxlRG9jdW1lbnRLZXlkb3duPWZ1bmN0aW9uKHQpeyhcIkVzY2FwZVwiPT09dC5rZXl8fDI3PT09dC5rZXlDb2RlKSYmXCJcIiE9PXRoaXMuZXNjYXBlS2V5QWN0aW9uXyYmdGhpcy5jbG9zZSh0aGlzLmVzY2FwZUtleUFjdGlvbl8pfSxlLnByb3RvdHlwZS5sYXlvdXRJbnRlcm5hbF89ZnVuY3Rpb24oKXt0aGlzLmF1dG9TdGFja0J1dHRvbnNfJiZ0aGlzLmRldGVjdFN0YWNrZWRCdXR0b25zXygpLHRoaXMuZGV0ZWN0U2Nyb2xsYWJsZUNvbnRlbnRfKCl9LGUucHJvdG90eXBlLmhhbmRsZUFuaW1hdGlvblRpbWVyRW5kXz1mdW5jdGlvbigpe3RoaXMuYW5pbWF0aW9uVGltZXJfPTAsdGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyhhLmNzc0NsYXNzZXMuT1BFTklORyksdGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyhhLmNzc0NsYXNzZXMuQ0xPU0lORyl9LGUucHJvdG90eXBlLnJ1bk5leHRBbmltYXRpb25GcmFtZV89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbkZyYW1lXyksdGhpcy5hbmltYXRpb25GcmFtZV89cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7ZS5hbmltYXRpb25GcmFtZV89MCxjbGVhclRpbWVvdXQoZS5hbmltYXRpb25UaW1lcl8pLGUuYW5pbWF0aW9uVGltZXJfPXNldFRpbWVvdXQodCwwKX0pfSxlLnByb3RvdHlwZS5kZXRlY3RTdGFja2VkQnV0dG9uc189ZnVuY3Rpb24oKXt0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGEuY3NzQ2xhc3Nlcy5TVEFDS0VEKTt2YXIgdD10aGlzLmFkYXB0ZXJfLmFyZUJ1dHRvbnNTdGFja2VkKCk7dCYmdGhpcy5hZGFwdGVyXy5hZGRDbGFzcyhhLmNzc0NsYXNzZXMuU1RBQ0tFRCksdCE9PXRoaXMuYXJlQnV0dG9uc1N0YWNrZWRfJiYodGhpcy5hZGFwdGVyXy5yZXZlcnNlQnV0dG9ucygpLHRoaXMuYXJlQnV0dG9uc1N0YWNrZWRfPXQpfSxlLnByb3RvdHlwZS5kZXRlY3RTY3JvbGxhYmxlQ29udGVudF89ZnVuY3Rpb24oKXt0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGEuY3NzQ2xhc3Nlcy5TQ1JPTExBQkxFKSx0aGlzLmFkYXB0ZXJfLmlzQ29udGVudFNjcm9sbGFibGUoKSYmdGhpcy5hZGFwdGVyXy5hZGRDbGFzcyhhLmNzc0NsYXNzZXMuU0NST0xMQUJMRSl9LGV9KGkpO2UuZGVmYXVsdD1zfSwxNzI6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24ucihlKTt2YXIgbz17fTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xuZnVuY3Rpb24gcih0LGUpe2lmKHQuY2xvc2VzdClyZXR1cm4gdC5jbG9zZXN0KGUpO2Zvcih2YXIgbj10O247KXtpZihpKG4sZSkpcmV0dXJuIG47bj1uLnBhcmVudEVsZW1lbnR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gaSh0LGUpe3JldHVybih0Lm1hdGNoZXN8fHQud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHx0Lm1zTWF0Y2hlc1NlbGVjdG9yKS5jYWxsKHQsZSl9bi5yKG8pLG4uZChvLFwiY2xvc2VzdFwiLGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KSxuLmQobyxcIm1hdGNoZXNcIixmdW5jdGlvbigpe3JldHVybiBpfSksbi5kKGUsXCJwb255ZmlsbFwiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KX0sMjM6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBvPVwibWRjLWRpYWxvZ1wiLHI9e0JBU0U6byxDT05UQUlORVI6bytcIl9fY29udGFpbmVyXCIsU1VSRkFDRTpvK1wiX19zdXJmYWNlXCIsVElUTEU6bytcIl9fdGl0bGVcIixDT05URU5UOm8rXCJfX2NvbnRlbnRcIixBQ1RJT05TOm8rXCJfX2FjdGlvbnNcIixCVVRUT046bytcIl9fYnV0dG9uXCIsREVGQVVMVF9CVVRUT046bytcIl9fYnV0dG9uLS1kZWZhdWx0XCIsU0NSSU06bytcIl9fc2NyaW1cIn07ZS5jc3NDbGFzc2VzPXI7ZS5MQVlPVVRfRVZFTlRTPVtcInJlc2l6ZVwiLFwib3JpZW50YXRpb25jaGFuZ2VcIl19LDQ6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24ucihlKSxuLmQoZSxcImNzc0NsYXNzZXNcIixmdW5jdGlvbigpe3JldHVybiBvfSksbi5kKGUsXCJzdHJpbmdzXCIsZnVuY3Rpb24oKXtyZXR1cm4gcn0pLG4uZChlLFwibnVtYmVyc1wiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIG89e0NMT1NJTkc6XCJtZGMtZGlhbG9nLS1jbG9zaW5nXCIsT1BFTjpcIm1kYy1kaWFsb2ctLW9wZW5cIixPUEVOSU5HOlwibWRjLWRpYWxvZy0tb3BlbmluZ1wiLFNDUk9MTEFCTEU6XCJtZGMtZGlhbG9nLS1zY3JvbGxhYmxlXCIsU0NST0xMX0xPQ0s6XCJtZGMtZGlhbG9nLXNjcm9sbC1sb2NrXCIsU1RBQ0tFRDpcIm1kYy1kaWFsb2ctLXN0YWNrZWRcIn0scj17QUNUSU9OX0FUVFJJQlVURTpcImRhdGEtbWRjLWRpYWxvZy1hY3Rpb25cIixCVVRUT05fU0VMRUNUT1I6XCIubWRjLWRpYWxvZ19fYnV0dG9uXCIsQ0xPU0VEX0VWRU5UOlwiTURDRGlhbG9nOmNsb3NlZFwiLENMT1NFX0FDVElPTjpcImNsb3NlXCIsQ0xPU0lOR19FVkVOVDpcIk1EQ0RpYWxvZzpjbG9zaW5nXCIsQ09OVEFJTkVSX1NFTEVDVE9SOlwiLm1kYy1kaWFsb2dfX2NvbnRhaW5lclwiLENPTlRFTlRfU0VMRUNUT1I6XCIubWRjLWRpYWxvZ19fY29udGVudFwiLERFRkFVTFRfQlVUVE9OX1NFTEVDVE9SOlwiLm1kYy1kaWFsb2dfX2J1dHRvbi0tZGVmYXVsdFwiLERFU1RST1lfQUNUSU9OOlwiZGVzdHJveVwiLE9QRU5FRF9FVkVOVDpcIk1EQ0RpYWxvZzpvcGVuZWRcIixPUEVOSU5HX0VWRU5UOlwiTURDRGlhbG9nOm9wZW5pbmdcIixTQ1JJTV9TRUxFQ1RPUjpcIi5tZGMtZGlhbG9nX19zY3JpbVwiLFNVUFBSRVNTX0RFRkFVTFRfUFJFU1NfU0VMRUNUT1I6W1widGV4dGFyZWFcIixcIi5tZGMtbWVudSAubWRjLWxpc3QtaXRlbVwiXS5qb2luKFwiLCBcIiksU1VSRkFDRV9TRUxFQ1RPUjpcIi5tZGMtZGlhbG9nX19zdXJmYWNlXCJ9LGk9e0RJQUxPR19BTklNQVRJT05fQ0xPU0VfVElNRV9NUzo3NSxESUFMT0dfQU5JTUFUSU9OX09QRU5fVElNRV9NUzoxNTB9fSw0NDpmdW5jdGlvbih0LGUsbil7dmFyIG8scixpPW4oNjIpLGE9big2Mykscz0ocj1bXSx7YWN0aXZhdGVUcmFwOmZ1bmN0aW9uKHQpe2lmKHIubGVuZ3RoPjApe3ZhciBlPXJbci5sZW5ndGgtMV07ZSE9PXQmJmUucGF1c2UoKX12YXIgbj1yLmluZGV4T2YodCk7LTE9PT1uP3IucHVzaCh0KTooci5zcGxpY2UobiwxKSxyLnB1c2godCkpfSxkZWFjdGl2YXRlVHJhcDpmdW5jdGlvbih0KXt2YXIgZT1yLmluZGV4T2YodCk7LTEhPT1lJiZyLnNwbGljZShlLDEpLHIubGVuZ3RoPjAmJnJbci5sZW5ndGgtMV0udW5wYXVzZSgpfX0pO2Z1bmN0aW9uIGModCl7cmV0dXJuIHNldFRpbWVvdXQodCwwKX10LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj1kb2N1bWVudCxyPVwic3RyaW5nXCI9PXR5cGVvZiB0P24ucXVlcnlTZWxlY3Rvcih0KTp0LHU9YSh7cmV0dXJuRm9jdXNPbkRlYWN0aXZhdGU6ITAsZXNjYXBlRGVhY3RpdmF0ZXM6ITB9LGUpLGw9e2ZpcnN0VGFiYmFibGVOb2RlOm51bGwsbGFzdFRhYmJhYmxlTm9kZTpudWxsLG5vZGVGb2N1c2VkQmVmb3JlQWN0aXZhdGlvbjpudWxsLG1vc3RSZWNlbnRseUZvY3VzZWROb2RlOm51bGwsYWN0aXZlOiExLHBhdXNlZDohMX0sZj17YWN0aXZhdGU6ZnVuY3Rpb24odCl7aWYoIWwuYWN0aXZlKXtnKCksbC5hY3RpdmU9ITAsbC5wYXVzZWQ9ITEsbC5ub2RlRm9jdXNlZEJlZm9yZUFjdGl2YXRpb249bi5hY3RpdmVFbGVtZW50O3ZhciBlPXQmJnQub25BY3RpdmF0ZT90Lm9uQWN0aXZhdGU6dS5vbkFjdGl2YXRlO3JldHVybiBlJiZlKCkscCgpLGZ9fSxkZWFjdGl2YXRlOmQscGF1c2U6ZnVuY3Rpb24oKXshbC5wYXVzZWQmJmwuYWN0aXZlJiYobC5wYXVzZWQ9ITAsbSgpKX0sdW5wYXVzZTpmdW5jdGlvbigpe2wucGF1c2VkJiZsLmFjdGl2ZSYmKGwucGF1c2VkPSExLGcoKSxwKCkpfX07cmV0dXJuIGY7ZnVuY3Rpb24gZCh0KXtpZihsLmFjdGl2ZSl7Y2xlYXJUaW1lb3V0KG8pLG0oKSxsLmFjdGl2ZT0hMSxsLnBhdXNlZD0hMSxzLmRlYWN0aXZhdGVUcmFwKGYpO3ZhciBlPXQmJnZvaWQgMCE9PXQub25EZWFjdGl2YXRlP3Qub25EZWFjdGl2YXRlOnUub25EZWFjdGl2YXRlO3JldHVybiBlJiZlKCksKHQmJnZvaWQgMCE9PXQucmV0dXJuRm9jdXM/dC5yZXR1cm5Gb2N1czp1LnJldHVybkZvY3VzT25EZWFjdGl2YXRlKSYmYyhmdW5jdGlvbigpe0MobC5ub2RlRm9jdXNlZEJlZm9yZUFjdGl2YXRpb24pfSksZn19ZnVuY3Rpb24gcCgpe2lmKGwuYWN0aXZlKXJldHVybiBzLmFjdGl2YXRlVHJhcChmKSxvPWMoZnVuY3Rpb24oKXtDKGgoKSl9KSxuLmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsdiwhMCksbi5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsXyx7Y2FwdHVyZTohMCxwYXNzaXZlOiExfSksbi5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLF8se2NhcHR1cmU6ITAscGFzc2l2ZTohMX0pLG4uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsYix7Y2FwdHVyZTohMCxwYXNzaXZlOiExfSksbi5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLE8se2NhcHR1cmU6ITAscGFzc2l2ZTohMX0pLGZ9ZnVuY3Rpb24gbSgpe2lmKGwuYWN0aXZlKXJldHVybiBuLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsdiwhMCksbi5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsXywhMCksbi5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLF8sITApLG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsYiwhMCksbi5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLE8sITApLGZ9ZnVuY3Rpb24geSh0KXt2YXIgZT11W3RdLG89ZTtpZighZSlyZXR1cm4gbnVsbDtpZihcInN0cmluZ1wiPT10eXBlb2YgZSYmIShvPW4ucXVlcnlTZWxlY3RvcihlKSkpdGhyb3cgbmV3IEVycm9yKFwiYFwiK3QrXCJgIHJlZmVycyB0byBubyBrbm93biBub2RlXCIpO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGUmJiEobz1lKCkpKXRocm93IG5ldyBFcnJvcihcImBcIit0K1wiYCBkaWQgbm90IHJldHVybiBhIG5vZGVcIik7cmV0dXJuIG99ZnVuY3Rpb24gaCgpe3ZhciB0O2lmKCEodD1udWxsIT09eShcImluaXRpYWxGb2N1c1wiKT95KFwiaW5pdGlhbEZvY3VzXCIpOnIuY29udGFpbnMobi5hY3RpdmVFbGVtZW50KT9uLmFjdGl2ZUVsZW1lbnQ6bC5maXJzdFRhYmJhYmxlTm9kZXx8eShcImZhbGxiYWNrRm9jdXNcIikpKXRocm93IG5ldyBFcnJvcihcIllvdSBjYW4ndCBoYXZlIGEgZm9jdXMtdHJhcCB3aXRob3V0IGF0IGxlYXN0IG9uZSBmb2N1c2FibGUgZWxlbWVudFwiKTtyZXR1cm4gdH1mdW5jdGlvbiBfKHQpe3IuY29udGFpbnModC50YXJnZXQpfHwodS5jbGlja091dHNpZGVEZWFjdGl2YXRlcz9kKHtyZXR1cm5Gb2N1czohaS5pc0ZvY3VzYWJsZSh0LnRhcmdldCl9KTp0LnByZXZlbnREZWZhdWx0KCkpfWZ1bmN0aW9uIHYodCl7ci5jb250YWlucyh0LnRhcmdldCl8fHQudGFyZ2V0IGluc3RhbmNlb2YgRG9jdW1lbnR8fCh0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLEMobC5tb3N0UmVjZW50bHlGb2N1c2VkTm9kZXx8aCgpKSl9ZnVuY3Rpb24gTyh0KXtpZighMSE9PXUuZXNjYXBlRGVhY3RpdmF0ZXMmJmZ1bmN0aW9uKHQpe3JldHVyblwiRXNjYXBlXCI9PT10LmtleXx8XCJFc2NcIj09PXQua2V5fHwyNz09PXQua2V5Q29kZX0odCkpcmV0dXJuIHQucHJldmVudERlZmF1bHQoKSx2b2lkIGQoKTsoZnVuY3Rpb24odCl7cmV0dXJuXCJUYWJcIj09PXQua2V5fHw5PT09dC5rZXlDb2RlfSkodCkmJmZ1bmN0aW9uKHQpe2lmKGcoKSx0LnNoaWZ0S2V5JiZ0LnRhcmdldD09PWwuZmlyc3RUYWJiYWJsZU5vZGUpcmV0dXJuIHQucHJldmVudERlZmF1bHQoKSx2b2lkIEMobC5sYXN0VGFiYmFibGVOb2RlKTt0LnNoaWZ0S2V5fHx0LnRhcmdldCE9PWwubGFzdFRhYmJhYmxlTm9kZXx8KHQucHJldmVudERlZmF1bHQoKSxDKGwuZmlyc3RUYWJiYWJsZU5vZGUpKX0odCl9ZnVuY3Rpb24gYih0KXt1LmNsaWNrT3V0c2lkZURlYWN0aXZhdGVzfHxyLmNvbnRhaW5zKHQudGFyZ2V0KXx8KHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpKX1mdW5jdGlvbiBnKCl7dmFyIHQ9aShyKTtsLmZpcnN0VGFiYmFibGVOb2RlPXRbMF18fGgoKSxsLmxhc3RUYWJiYWJsZU5vZGU9dFt0Lmxlbmd0aC0xXXx8aCgpfWZ1bmN0aW9uIEModCl7dCE9PW4uYWN0aXZlRWxlbWVudCYmKHQmJnQuZm9jdXM/KHQuZm9jdXMoKSxsLm1vc3RSZWNlbnRseUZvY3VzZWROb2RlPXQsZnVuY3Rpb24odCl7cmV0dXJuIHQudGFnTmFtZSYmXCJpbnB1dFwiPT09dC50YWdOYW1lLnRvTG93ZXJDYXNlKCkmJlwiZnVuY3Rpb25cIj09dHlwZW9mIHQuc2VsZWN0fSh0KSYmdC5zZWxlY3QoKSk6QyhoKCkpKX19fSw2MDpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG8scj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KG89ZnVuY3Rpb24odCxlKXtyZXR1cm4obz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1vKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSksaT10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihpPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsbz1hcmd1bWVudHMubGVuZ3RoO248bztuKyspZm9yKHZhciByIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYT10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIG8gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxvKSYmZS5pbmRleE9mKG8pPDAmJihuW29dPXRbb10pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPTA7Zm9yKG89T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtyPG8ubGVuZ3RoO3IrKyllLmluZGV4T2Yob1tyXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsb1tyXSkmJihuW29bcl1dPXRbb1tyXV0pfXJldHVybiBufSxzPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBjPXMobigwKSksdT1zKG4oMSkpLGw9bigxNjEpLGY9big2MSksZD1uKDQpLHA9bigxNzIpLG09cyhuKDY0KSk7ZS5EaWFsb2dDb250ZW50PW0uZGVmYXVsdDt2YXIgeT1zKG4oNjUpKTtlLkRpYWxvZ0Zvb3Rlcj15LmRlZmF1bHQ7dmFyIGg9cyhuKDY2KSk7ZS5EaWFsb2dUaXRsZT1oLmRlZmF1bHQ7dmFyIF89cyhuKDY3KSk7ZS5EaWFsb2dCdXR0b249Xy5kZWZhdWx0O3ZhciB2PW4oMjMpO2Z1bmN0aW9uIE8odCl7cmV0dXJuIHQudHlwZT09PWguZGVmYXVsdH12YXIgYj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBlLmRpYWxvZ0VsZW1lbnQ9Yy5kZWZhdWx0LmNyZWF0ZVJlZigpLGUuc3RhdGU9e2NsYXNzTGlzdDpuZXcgU2V0fSxlLm9wZW49ZnVuY3Rpb24oKXtlLmluaXRpYWxpemVGb2N1c1RyYXAoKSxlLmZvdW5kYXRpb24ub3BlbigpfSxlLmluaXRpYWxpemVGb2N1c1RyYXA9ZnVuY3Rpb24oKXtlLmZvY3VzVHJhcD1lLnByb3BzLmNoaWxkcmVuJiZmLmNyZWF0ZUZvY3VzVHJhcEluc3RhbmNlKGUuZGlhbG9nRWxlbWVudC5jdXJyZW50KX0sZS5oYW5kbGVPcGVuaW5nPWZ1bmN0aW9uKCl7ZS5wcm9wcy5vbk9wZW5pbmcoKSx2LkxBWU9VVF9FVkVOVFMuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIodCxlLmhhbmRsZUxheW91dCl9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLGUuaGFuZGxlRG9jdW1lbnRLZXlEb3duKX0sZS5oYW5kbGVDbG9zaW5nPWZ1bmN0aW9uKHQpe2UucHJvcHMub25DbG9zaW5nKHQpLHYuTEFZT1VUX0VWRU5UUy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LGUuaGFuZGxlTGF5b3V0KX0pLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsZS5oYW5kbGVEb2N1bWVudEtleURvd24pfSxlLmhhbmRsZUludGVyYWN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBlLmZvdW5kYXRpb24uaGFuZGxlSW50ZXJhY3Rpb24odC5uYXRpdmVFdmVudCl9LGUuaGFuZGxlRG9jdW1lbnRLZXlEb3duPWZ1bmN0aW9uKHQpe3JldHVybiBlLmZvdW5kYXRpb24uaGFuZGxlRG9jdW1lbnRLZXlkb3duKHQpfSxlLmhhbmRsZUxheW91dD1mdW5jdGlvbigpe3JldHVybiBlLmZvdW5kYXRpb24ubGF5b3V0KCl9LGUucmVuZGVyQ29udGFpbmVyPWZ1bmN0aW9uKHQpe3JldHVybiB0P2MuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTp2LmNzc0NsYXNzZXMuQ09OVEFJTkVSfSxjLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6di5jc3NDbGFzc2VzLlNVUkZBQ0V9LGMuZGVmYXVsdC5DaGlsZHJlbi5tYXAodCxlLnJlbmRlckNoaWxkKSkpOnZvaWQgMH0sZS5yZW5kZXJDaGlsZD1mdW5jdGlvbih0LG4pe3JldHVybiBPKHQpfHx0LnR5cGU9PT1tLmRlZmF1bHQ/Yy5kZWZhdWx0LmNsb25lRWxlbWVudCh0LGkoe2tleTpcImNoaWxkLVwiK259LHQucHJvcHMse2lkOmUuc2V0SWQodCx0LnByb3BzLmlkKX0pKTp0fSxlLnNldElkPWZ1bmN0aW9uKHQsbil7dmFyIG89ZS5wcm9wcy5pZDtpZihPKHQpKXt2YXIgcj1ufHxvK1wiLXRpdGxlXCI7cmV0dXJuIGUubGFiZWxsZWRCeT1yLHJ9dmFyIGk9bnx8bytcIi1jb250ZW50XCI7cmV0dXJuIGUuZGVzY3JpYmVkQnk9aSxpfSxlfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9dC5vcGVuLG49dC5hdXRvU3RhY2tCdXR0b25zLG89dC5lc2NhcGVLZXlBY3Rpb24scj10LnNjcmltQ2xpY2tBY3Rpb247dGhpcy5mb3VuZGF0aW9uPW5ldyBsLk1EQ0RpYWxvZ0ZvdW5kYXRpb24odGhpcy5hZGFwdGVyKSx0aGlzLmZvdW5kYXRpb24uaW5pdCgpLGUmJnRoaXMub3BlbigpLG58fHRoaXMuZm91bmRhdGlvbi5zZXRBdXRvU3RhY2tCdXR0b25zKG4pLFwic3RyaW5nXCI9PXR5cGVvZiBvJiZ0aGlzLmZvdW5kYXRpb24uc2V0RXNjYXBlS2V5QWN0aW9uKG8pLFwic3RyaW5nXCI9PXR5cGVvZiByJiZ0aGlzLmZvdW5kYXRpb24uc2V0U2NyaW1DbGlja0FjdGlvbihyKX0sZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLmZvdW5kYXRpb24uZGVzdHJveSgpfSxlLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wcm9wcyxuPWUub3BlbixvPWUuYXV0b1N0YWNrQnV0dG9ucyxyPWUuZXNjYXBlS2V5QWN0aW9uLGk9ZS5zY3JpbUNsaWNrQWN0aW9uO2lmKHQuYXV0b1N0YWNrQnV0dG9ucyE9PW8mJnRoaXMuZm91bmRhdGlvbi5zZXRBdXRvU3RhY2tCdXR0b25zKG8pLHQuZXNjYXBlS2V5QWN0aW9uIT09ciYmdGhpcy5mb3VuZGF0aW9uLnNldEVzY2FwZUtleUFjdGlvbihyKSx0LnNjcmltQ2xpY2tBY3Rpb24hPT1pJiZ0aGlzLmZvdW5kYXRpb24uc2V0U2NyaW1DbGlja0FjdGlvbihpKSx0Lm9wZW4hPT1uKXJldHVybiBuP3RoaXMub3BlbigpOnRoaXMuZm91bmRhdGlvbi5jbG9zZSgpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJjbGFzc2VzXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuc3RhdGUuY2xhc3NMaXN0LGU9dGhpcy5wcm9wcy5jbGFzc05hbWU7cmV0dXJuIHUuZGVmYXVsdCh2LmNzc0NsYXNzZXMuQkFTRSxBcnJheS5mcm9tKHQpLGUpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImJ1dHRvbnNcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kaWFsb2dFbGVtZW50LmN1cnJlbnQmJltdLnNsaWNlLmNhbGwodGhpcy5kaWFsb2dFbGVtZW50LmN1cnJlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh2LmNzc0NsYXNzZXMuQlVUVE9OKSk7cmV0dXJuIHR8fFtdfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImNvbnRlbnRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlhbG9nRWxlbWVudC5jdXJyZW50JiZ0aGlzLmRpYWxvZ0VsZW1lbnQuY3VycmVudC5xdWVyeVNlbGVjdG9yKFwiLlwiK3YuY3NzQ2xhc3Nlcy5DT05URU5UKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJkZWZhdWx0QnV0dG9uXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpYWxvZ0VsZW1lbnQuY3VycmVudCYmdGhpcy5kaWFsb2dFbGVtZW50LmN1cnJlbnQucXVlcnlTZWxlY3RvcihcIi5cIit2LmNzc0NsYXNzZXMuREVGQVVMVF9CVVRUT04pfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPWwuTURDRGlhbG9nRm91bmRhdGlvbi5zdHJpbmdzLG49cC5wb255ZmlsbC5jbG9zZXN0LG89cC5wb255ZmlsbC5tYXRjaGVzO3JldHVybnthZGRDbGFzczpmdW5jdGlvbihlKXt2YXIgbj10LnN0YXRlLmNsYXNzTGlzdDtuLmFkZChlKSx0LnNldFN0YXRlKHtjbGFzc0xpc3Q6bn0pfSxyZW1vdmVDbGFzczpmdW5jdGlvbihlKXt2YXIgbj10LnN0YXRlLmNsYXNzTGlzdDtuLmRlbGV0ZShlKSx0LnNldFN0YXRlKHtjbGFzc0xpc3Q6bn0pfSxoYXNDbGFzczpmdW5jdGlvbihlKXtyZXR1cm4gdC5jbGFzc2VzLnNwbGl0KFwiIFwiKS5pbmNsdWRlcyhlKX0sYWRkQm9keUNsYXNzOmZ1bmN0aW9uKHQpe3JldHVybiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQodCl9LHJlbW92ZUJvZHlDbGFzczpmdW5jdGlvbih0KXtyZXR1cm4gZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKHQpfSxldmVudFRhcmdldE1hdGNoZXM6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbyh0LGUpfSx0cmFwRm9jdXM6ZnVuY3Rpb24oKXtyZXR1cm4gdC5mb2N1c1RyYXAmJnQuZm9jdXNUcmFwLmFjdGl2YXRlKCl9LHJlbGVhc2VGb2N1czpmdW5jdGlvbigpe3JldHVybiB0LmZvY3VzVHJhcCYmdC5mb2N1c1RyYXAuZGVhY3RpdmF0ZSgpfSxpc0NvbnRlbnRTY3JvbGxhYmxlOmZ1bmN0aW9uKCl7dmFyIGU9dC5jb250ZW50O3JldHVybiEhZSYmZi5pc1Njcm9sbGFibGUoZSl9LGFyZUJ1dHRvbnNTdGFja2VkOmZ1bmN0aW9uKCl7cmV0dXJuISF0LmJ1dHRvbnMmJmYuYXJlVG9wc01pc2FsaWduZWQodC5idXR0b25zKX0sZ2V0QWN0aW9uRnJvbUV2ZW50OmZ1bmN0aW9uKHQpe3ZhciBvPW4odC50YXJnZXQsXCJbXCIrZS5BQ1RJT05fQVRUUklCVVRFK1wiXVwiKTtyZXR1cm4gbyYmby5nZXRBdHRyaWJ1dGUoZS5BQ1RJT05fQVRUUklCVVRFKX0sY2xpY2tEZWZhdWx0QnV0dG9uOmZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0QnV0dG9uO2UmJmUuY2xpY2soKX0scmV2ZXJzZUJ1dHRvbnM6ZnVuY3Rpb24oKXt2YXIgZT10LmJ1dHRvbnM7cmV0dXJuIGUmJmUucmV2ZXJzZSgpLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHQucGFyZW50RWxlbWVudCYmdC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHQpfSl9LG5vdGlmeU9wZW5pbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdC5oYW5kbGVPcGVuaW5nKCl9LG5vdGlmeU9wZW5lZDpmdW5jdGlvbigpe3JldHVybiB0LnByb3BzLm9uT3BlbiYmdC5wcm9wcy5vbk9wZW4oKX0sbm90aWZ5Q2xvc2luZzpmdW5jdGlvbihlKXtyZXR1cm4gdC5oYW5kbGVDbG9zaW5nKGUpfSxub3RpZnlDbG9zZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHQucHJvcHMub25DbG9zZSYmdC5wcm9wcy5vbkNsb3NlKGUpfX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcyxlPSh0LmF1dG9TdGFja0J1dHRvbnMsdC5jbGFzc05hbWUsdC5jaGlsZHJlbiksbj0odC5lc2NhcGVLZXlBY3Rpb24sdC5pZCksbz0odC5vbk9wZW5pbmcsdC5vbk9wZW4sdC5vbkNsaWNrLHQub25DbG9zaW5nLHQub25DbG9zZSx0Lm9uS2V5RG93bix0Lm9wZW4sdC5zY3JpbUNsaWNrQWN0aW9uLHQudGFnKSxyPWEodCxbXCJhdXRvU3RhY2tCdXR0b25zXCIsXCJjbGFzc05hbWVcIixcImNoaWxkcmVuXCIsXCJlc2NhcGVLZXlBY3Rpb25cIixcImlkXCIsXCJvbk9wZW5pbmdcIixcIm9uT3BlblwiLFwib25DbGlja1wiLFwib25DbG9zaW5nXCIsXCJvbkNsb3NlXCIsXCJvbktleURvd25cIixcIm9wZW5cIixcInNjcmltQ2xpY2tBY3Rpb25cIixcInRhZ1wiXSkscz10aGlzLnJlbmRlckNvbnRhaW5lcihlKTtyZXR1cm4gYy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobyxpKHt9LHIse1wiYXJpYS1sYWJlbGxlZGJ5XCI6dGhpcy5sYWJlbGxlZEJ5LFwiYXJpYS1kZXNjcmliZWRieVwiOnRoaXMuZGVzY3JpYmVkQnksXCJhcmlhLW1vZGFsXCI6ITAsY2xhc3NOYW1lOnRoaXMuY2xhc3NlcyxpZDpuLG9uS2V5RG93bjp0aGlzLmhhbmRsZUludGVyYWN0aW9uLG9uQ2xpY2s6dGhpcy5oYW5kbGVJbnRlcmFjdGlvbixyZWY6dGhpcy5kaWFsb2dFbGVtZW50fSkscyxjLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6di5jc3NDbGFzc2VzLlNDUklNfSkpfSxlLmRlZmF1bHRQcm9wcz17YXV0b1N0YWNrQnV0dG9uczohMCxjbGFzc05hbWU6XCJcIixvbk9wZW5pbmc6ZnVuY3Rpb24oKXt9LG9uQ2xvc2luZzpmdW5jdGlvbigpe30sdGFnOlwiZGl2XCIsaWQ6XCJtZGMtZGlhbG9nXCIsb3BlbjohMSxyb2xlOlwiYWxlcnRkaWFsb2dcIixlc2NhcGVLZXlBY3Rpb246ZC5zdHJpbmdzLkNMT1NFX0FDVElPTixzY3JpbUNsaWNrQWN0aW9uOmQuc3RyaW5ncy5DTE9TRV9BQ1RJT059LGV9KGMuZGVmYXVsdC5Db21wb25lbnQpO2UuZGVmYXVsdD1ifSw2MTpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5yKGUpLG4uZChlLFwiY3JlYXRlRm9jdXNUcmFwSW5zdGFuY2VcIixmdW5jdGlvbigpe3JldHVybiBpfSksbi5kKGUsXCJpc1Njcm9sbGFibGVcIixmdW5jdGlvbigpe3JldHVybiBhfSksbi5kKGUsXCJhcmVUb3BzTWlzYWxpZ25lZFwiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KTt2YXIgbz1uKDQ0KSxyPW4ubihvKTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xuZnVuY3Rpb24gaSh0LGUsbil7cmV0dXJuIHZvaWQgMD09PWUmJihlPXIuYSksZSh0LHtjbGlja091dHNpZGVEZWFjdGl2YXRlczohMCxlc2NhcGVEZWFjdGl2YXRlczohMSxpbml0aWFsRm9jdXM6bn0pfWZ1bmN0aW9uIGEodCl7cmV0dXJuISF0JiZ0LnNjcm9sbEhlaWdodD50Lm9mZnNldEhlaWdodH1mdW5jdGlvbiBzKHQpe3ZhciBlPW5ldyBTZXQ7cmV0dXJuW10uZm9yRWFjaC5jYWxsKHQsZnVuY3Rpb24odCl7cmV0dXJuIGUuYWRkKHQub2Zmc2V0VG9wKX0pLGUuc2l6ZT4xfX0sNjI6ZnVuY3Rpb24odCxlKXt2YXIgbj1bXCJpbnB1dFwiLFwic2VsZWN0XCIsXCJ0ZXh0YXJlYVwiLFwiYVtocmVmXVwiLFwiYnV0dG9uXCIsXCJbdGFiaW5kZXhdXCIsXCJhdWRpb1tjb250cm9sc11cIixcInZpZGVvW2NvbnRyb2xzXVwiLCdbY29udGVudGVkaXRhYmxlXTpub3QoW2NvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCJdKSddLG89bi5qb2luKFwiLFwiKSxyPVwidW5kZWZpbmVkXCI9PXR5cGVvZiBFbGVtZW50P2Z1bmN0aW9uKCl7fTpFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzfHxFbGVtZW50LnByb3RvdHlwZS5tc01hdGNoZXNTZWxlY3Rvcnx8RWxlbWVudC5wcm90b3R5cGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yO2Z1bmN0aW9uIGkodCxlKXtlPWV8fHt9O3ZhciBuLGkscyxjPVtdLGY9W10sZD10LnF1ZXJ5U2VsZWN0b3JBbGwobyk7Zm9yKGUuaW5jbHVkZUNvbnRhaW5lciYmci5jYWxsKHQsbykmJihkPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShkKSkudW5zaGlmdCh0KSxuPTA7bjxkLmxlbmd0aDtuKyspYShpPWRbbl0pJiYoMD09PShzPXUoaSkpP2MucHVzaChpKTpmLnB1c2goe2RvY3VtZW50T3JkZXI6bix0YWJJbmRleDpzLG5vZGU6aX0pKTtyZXR1cm4gZi5zb3J0KGwpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5ub2RlfSkuY29uY2F0KGMpfWZ1bmN0aW9uIGEodCl7cmV0dXJuISghcyh0KXx8ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBmKHQpJiZcInJhZGlvXCI9PT10LnR5cGV9KHQpJiYhZnVuY3Rpb24odCl7aWYoIXQubmFtZSlyZXR1cm4hMDt2YXIgZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpZih0W2VdLmNoZWNrZWQpcmV0dXJuIHRbZV19KHQub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPVwicmFkaW9cIl1bbmFtZT1cIicrdC5uYW1lKydcIl0nKSk7cmV0dXJuIWV8fGU9PT10fSh0KX0odCl8fHUodCk8MCl9ZnVuY3Rpb24gcyh0KXtyZXR1cm4hKHQuZGlzYWJsZWR8fGZ1bmN0aW9uKHQpe3JldHVybiBmKHQpJiZcImhpZGRlblwiPT09dC50eXBlfSh0KXx8ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PT10Lm9mZnNldFBhcmVudHx8XCJoaWRkZW5cIj09PWdldENvbXB1dGVkU3R5bGUodCkudmlzaWJpbGl0eX0odCkpfWkuaXNUYWJiYWJsZT1mdW5jdGlvbih0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoXCJObyBub2RlIHByb3ZpZGVkXCIpO3JldHVybiExIT09ci5jYWxsKHQsbykmJmEodCl9LGkuaXNGb2N1c2FibGU9ZnVuY3Rpb24odCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKFwiTm8gbm9kZSBwcm92aWRlZFwiKTtyZXR1cm4hMSE9PXIuY2FsbCh0LGMpJiZzKHQpfTt2YXIgYz1uLmNvbmNhdChcImlmcmFtZVwiKS5qb2luKFwiLFwiKTtmdW5jdGlvbiB1KHQpe3ZhciBlPXBhcnNlSW50KHQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiksMTApO3JldHVybiBpc05hTihlKT9mdW5jdGlvbih0KXtyZXR1cm5cInRydWVcIj09PXQuY29udGVudEVkaXRhYmxlfSh0KT8wOnQudGFiSW5kZXg6ZX1mdW5jdGlvbiBsKHQsZSl7cmV0dXJuIHQudGFiSW5kZXg9PT1lLnRhYkluZGV4P3QuZG9jdW1lbnRPcmRlci1lLmRvY3VtZW50T3JkZXI6dC50YWJJbmRleC1lLnRhYkluZGV4fWZ1bmN0aW9uIGYodCl7cmV0dXJuXCJJTlBVVFwiPT09dC50YWdOYW1lfXQuZXhwb3J0cz1pfSw2MzpmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbigpe2Zvcih2YXIgdD17fSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG89YXJndW1lbnRzW2VdO2Zvcih2YXIgciBpbiBvKW4uY2FsbChvLHIpJiYodFtyXT1vW3JdKX1yZXR1cm4gdH07dmFyIG49T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eX0sNjQ6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciBvPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKG89T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxvPWFyZ3VtZW50cy5sZW5ndGg7bjxvO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxyPXRoaXMmJnRoaXMuX19yZXN0fHxmdW5jdGlvbih0LGUpe3ZhciBuPXt9O2Zvcih2YXIgbyBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG8pJiZlLmluZGV4T2Yobyk8MCYmKG5bb109dFtvXSk7aWYobnVsbCE9dCYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9MDtmb3Iobz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO3I8by5sZW5ndGg7cisrKWUuaW5kZXhPZihvW3JdKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodCxvW3JdKSYmKG5bb1tyXV09dFtvW3JdXSl9cmV0dXJuIG59LGk9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIGE9aShuKDApKSxzPWkobigxKSksYz1uKDIzKTtlLmRlZmF1bHQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5jbGFzc05hbWUsbj12b2lkIDA9PT1lP1wiXCI6ZSxpPXQuY2hpbGRyZW4sdT10LnRhZyxsPXZvaWQgMD09PXU/XCJkaXZcIjp1LGY9cih0LFtcImNsYXNzTmFtZVwiLFwiY2hpbGRyZW5cIixcInRhZ1wiXSk7cmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGwsbyh7Y2xhc3NOYW1lOnMuZGVmYXVsdChuLGMuY3NzQ2xhc3Nlcy5DT05URU5UKX0sZiksaSl9fSw2NTpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG89dGhpcyYmdGhpcy5fX2Fzc2lnbnx8ZnVuY3Rpb24oKXtyZXR1cm4obz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLG89YXJndW1lbnRzLmxlbmd0aDtuPG87bisrKWZvcih2YXIgciBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmKHRbcl09ZVtyXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHI9dGhpcyYmdGhpcy5fX3Jlc3R8fGZ1bmN0aW9uKHQsZSl7dmFyIG49e307Zm9yKHZhciBvIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbykmJmUuaW5kZXhPZihvKTwwJiYobltvXT10W29dKTtpZihudWxsIT10JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj0wO2ZvcihvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7cjxvLmxlbmd0aDtyKyspZS5pbmRleE9mKG9bcl0pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LG9bcl0pJiYobltvW3JdXT10W29bcl1dKX1yZXR1cm4gbn0saT10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgYT1pKG4oMCkpLHM9aShuKDEpKSxjPW4oMjMpO2UuZGVmYXVsdD1mdW5jdGlvbih0KXt2YXIgZT10LmNsYXNzTmFtZSxuPXZvaWQgMD09PWU/XCJcIjplLGk9dC5jaGlsZHJlbix1PXQudGFnLGw9dm9pZCAwPT09dT9cImZvb3RlclwiOnUsZj1yKHQsW1wiY2xhc3NOYW1lXCIsXCJjaGlsZHJlblwiLFwidGFnXCJdKTtyZXR1cm4gYS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQobCxvKHtjbGFzc05hbWU6cy5kZWZhdWx0KG4sYy5jc3NDbGFzc2VzLkFDVElPTlMpfSxmKSxpKX19LDY2OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgbz10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihvPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsbz1hcmd1bWVudHMubGVuZ3RoO248bztuKyspZm9yKHZhciByIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scj10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIG8gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxvKSYmZS5pbmRleE9mKG8pPDAmJihuW29dPXRbb10pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPTA7Zm9yKG89T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtyPG8ubGVuZ3RoO3IrKyllLmluZGV4T2Yob1tyXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsb1tyXSkmJihuW29bcl1dPXRbb1tyXV0pfXJldHVybiBufSxpPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBhPWkobigwKSkscz1pKG4oMSkpLGM9bigyMyk7ZS5kZWZhdWx0PWZ1bmN0aW9uKHQpe3ZhciBlPXQuY2xhc3NOYW1lLG49dm9pZCAwPT09ZT9cIlwiOmUsaT10LmNoaWxkcmVuLHU9dC50YWcsbD12b2lkIDA9PT11P1wiaDJcIjp1LGY9cih0LFtcImNsYXNzTmFtZVwiLFwiY2hpbGRyZW5cIixcInRhZ1wiXSk7cmV0dXJuIGEuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGwsbyh7Y2xhc3NOYW1lOnMuZGVmYXVsdChuLGMuY3NzQ2xhc3Nlcy5USVRMRSl9LGYpLGkpfX0sNjc6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciBvPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKG89T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxvPWFyZ3VtZW50cy5sZW5ndGg7bjxvO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxyPXRoaXMmJnRoaXMuX19yZXN0fHxmdW5jdGlvbih0LGUpe3ZhciBuPXt9O2Zvcih2YXIgbyBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG8pJiZlLmluZGV4T2Yobyk8MCYmKG5bb109dFtvXSk7aWYobnVsbCE9dCYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9MDtmb3Iobz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO3I8by5sZW5ndGg7cisrKWUuaW5kZXhPZihvW3JdKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodCxvW3JdKSYmKG5bb1tyXV09dFtvW3JdXSl9cmV0dXJuIG59LGk9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIGE9aShuKDApKSxzPWkobigxKSksYz1uKDIzKSx1PWkobig2OCkpO2UuZGVmYXVsdD1mdW5jdGlvbih0KXt2YXIgZSxuPXQuYWN0aW9uLGk9dC5jbGFzc05hbWUsbD12b2lkIDA9PT1pP1wiXCI6aSxmPXQuY2hpbGRyZW4sZD10LmlzRGVmYXVsdCxwPXZvaWQgMCE9PWQmJmQsbT1yKHQsW1wiYWN0aW9uXCIsXCJjbGFzc05hbWVcIixcImNoaWxkcmVuXCIsXCJpc0RlZmF1bHRcIl0pO3JldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh1LmRlZmF1bHQsbyh7Y2xhc3NOYW1lOnMuZGVmYXVsdChsLGMuY3NzQ2xhc3Nlcy5CVVRUT04sKGU9e30sZVtjLmNzc0NsYXNzZXMuREVGQVVMVF9CVVRUT05dPXAsZSkpLFwiZGF0YS1tZGMtZGlhbG9nLWFjdGlvblwiOm59LG0pLGYpfX0sNjg6ZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9bn19KX0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGlhbG9nLmpzLm1hcCIsIiFmdW5jdGlvbihlLHQpe2lmKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPXQocmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpLHJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtcmlwcGxlL2Rpc3QvaW5kZXguanNcIikpO2Vsc2UgaWYoXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXCJyZWFjdFwiLFwiY2xhc3NuYW1lc1wiLFwiQG1hdGVyaWFsL3JlYWN0LXJpcHBsZS9kaXN0L2luZGV4LmpzXCJdLHQpO2Vsc2V7dmFyIG49XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/dChyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcImNsYXNzbmFtZXNcIikscmVxdWlyZShcIkBtYXRlcmlhbC9yZWFjdC1yaXBwbGUvZGlzdC9pbmRleC5qc1wiKSk6dChlLnJlYWN0LGUuY2xhc3NuYW1lcyxlW1wiQG1hdGVyaWFsL3JlYWN0LXJpcHBsZS9kaXN0L2luZGV4LmpzXCJdKTtmb3IodmFyIHIgaW4gbikoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czplKVtyXT1uW3JdfX0oXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9e307ZnVuY3Rpb24gbihyKXtpZih0W3JdKXJldHVybiB0W3JdLmV4cG9ydHM7dmFyIG89dFtyXT17aTpyLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIGVbcl0uY2FsbChvLmV4cG9ydHMsbyxvLmV4cG9ydHMsbiksby5sPSEwLG8uZXhwb3J0c31yZXR1cm4gbi5tPWUsbi5jPXQsbi5kPWZ1bmN0aW9uKGUsdCxyKXtuLm8oZSx0KXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxuLnI9ZnVuY3Rpb24oZSl7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOlwiTW9kdWxlXCJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKGUsdCl7aWYoMSZ0JiYoZT1uKGUpKSw4JnQpcmV0dXJuIGU7aWYoNCZ0JiZcIm9iamVjdFwiPT10eXBlb2YgZSYmZSYmZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciByPU9iamVjdC5jcmVhdGUobnVsbCk7aWYobi5yKHIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLFwiZGVmYXVsdFwiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOmV9KSwyJnQmJlwic3RyaW5nXCIhPXR5cGVvZiBlKWZvcih2YXIgbyBpbiBlKW4uZChyLG8sZnVuY3Rpb24odCl7cmV0dXJuIGVbdF19LmJpbmQobnVsbCxvKSk7cmV0dXJuIHJ9LG4ubj1mdW5jdGlvbihlKXt2YXIgdD1lJiZlLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gZS5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiBlfTtyZXR1cm4gbi5kKHQsXCJhXCIsdCksdH0sbi5vPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfSxuLnA9XCJcIixuKG4ucz00NSl9KHswOmZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWV9LDE6ZnVuY3Rpb24oZSxuKXtlLmV4cG9ydHM9dH0sNDU6ZnVuY3Rpb24oZSx0LG4pe1widXNlIHN0cmljdFwiO3ZhciByPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKHI9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rKylmb3IodmFyIG8gaW4gdD1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbykmJihlW29dPXRbb10pO3JldHVybiBlfSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxvPXRoaXMmJnRoaXMuX19yZXN0fHxmdW5jdGlvbihlLHQpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiZ0LmluZGV4T2Yocik8MCYmKG5bcl09ZVtyXSk7aWYobnVsbCE9ZSYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG89MDtmb3Iocj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO288ci5sZW5ndGg7bysrKXQuaW5kZXhPZihyW29dKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyW29dKSYmKG5bcltvXV09ZVtyW29dXSl9cmV0dXJuIG59LGk9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIGw9aShuKDApKSx1PWkobigxKSksYT1uKDUpLHM9big0Nik7dC5CdXR0b249ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLmNsYXNzTmFtZSxpPXZvaWQgMD09PW4/XCJcIjpuLGE9ZS5yYWlzZWQsZD12b2lkIDAhPT1hJiZhLGY9ZS51bmVsZXZhdGVkLHA9dm9pZCAwIT09ZiYmZixTPWUub3V0bGluZWQsYj12b2lkIDAhPT1TJiZTLG09ZS5kZW5zZSx5PXZvaWQgMCE9PW0mJm0sRT1lLmRpc2FibGVkLF89dm9pZCAwIT09RSYmRSx2PWUuaWNvbixPPWUuaHJlZixqPWUuY2hpbGRyZW4sQz1lLmluaXRSaXBwbGUsaD1lLnRyYWlsaW5nSWNvbix4PShlLnVuYm91bmRlZCxvKGUsW1wiY2xhc3NOYW1lXCIsXCJyYWlzZWRcIixcInVuZWxldmF0ZWRcIixcIm91dGxpbmVkXCIsXCJkZW5zZVwiLFwiZGlzYWJsZWRcIixcImljb25cIixcImhyZWZcIixcImNoaWxkcmVuXCIsXCJpbml0UmlwcGxlXCIsXCJ0cmFpbGluZ0ljb25cIixcInVuYm91bmRlZFwiXSkpLEw9cih7Y2xhc3NOYW1lOnUuZGVmYXVsdChzLkNTU19DTEFTU0VTLlJPT1QsaSwodD17fSx0W3MuQ1NTX0NMQVNTRVMuUkFJU0VEXT1kLHRbcy5DU1NfQ0xBU1NFUy5VTkVMRVZBVEVEXT1wLHRbcy5DU1NfQ0xBU1NFUy5PVVRMSU5FRF09Yix0W3MuQ1NTX0NMQVNTRVMuREVOU0VdPXksdCkpLHJlZjpDLGRpc2FibGVkOl99LHgpO3JldHVybiBPP2wuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYVwiLHIoe30sTCx7aHJlZjpPfSksaD9udWxsOmModiksbC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse2NsYXNzTmFtZTpzLkNTU19DTEFTU0VTLkxBQkVMfSxqKSxoP2MoaCk6bnVsbCk6bC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIixyKHt9LEwpLGg/bnVsbDpjKHYpLGwuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6cy5DU1NfQ0xBU1NFUy5MQUJFTH0saiksaD9jKGgpOm51bGwpfTt2YXIgYz1mdW5jdGlvbihlKXtyZXR1cm4gZT9sLmRlZmF1bHQuY2xvbmVFbGVtZW50KGUse2NsYXNzTmFtZTp1LmRlZmF1bHQocy5DU1NfQ0xBU1NFUy5JQ09OLGUucHJvcHMuY2xhc3NOYW1lKX0pOm51bGx9O3QuQnV0dG9uLmRlZmF1bHRQcm9wcz17aW5pdFJpcHBsZTpmdW5jdGlvbigpe319LHQuZGVmYXVsdD1hLndpdGhSaXBwbGUodC5CdXR0b24pfSw0NjpmdW5jdGlvbihlLHQsbil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dC5DU1NfQ0xBU1NFUz17Uk9PVDpcIm1kYy1idXR0b25cIixJQ09OOlwibWRjLWJ1dHRvbl9faWNvblwiLExBQkVMOlwibWRjLWJ1dHRvbl9fbGFiZWxcIixERU5TRTpcIm1kYy1idXR0b24tLWRlbnNlXCIsUkFJU0VEOlwibWRjLWJ1dHRvbi0tcmFpc2VkXCIsT1VUTElORUQ6XCJtZGMtYnV0dG9uLS1vdXRsaW5lZFwiLFVORUxFVkFURUQ6XCJtZGMtYnV0dG9uLS11bmVsZXZhdGVkXCJ9fSw1OmZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPW59fSl9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJ1dHRvbi5qcy5tYXAiLCIhZnVuY3Rpb24odCxlKXtpZihcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZSltb2R1bGUuZXhwb3J0cz1lKHJlcXVpcmUoXCJyZWFjdFwiKSxyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7ZWxzZSBpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQpZGVmaW5lKFtcInJlYWN0XCIsXCJjbGFzc25hbWVzXCJdLGUpO2Vsc2V7dmFyIG49XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZShyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcImNsYXNzbmFtZXNcIikpOmUodC5yZWFjdCx0LmNsYXNzbmFtZXMpO2Zvcih2YXIgaSBpbiBuKShcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnQpW2ldPW5baV19fShcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZj9zZWxmOnRoaXMsZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9e307ZnVuY3Rpb24gbihpKXtpZihlW2ldKXJldHVybiBlW2ldLmV4cG9ydHM7dmFyIGE9ZVtpXT17aTppLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIHRbaV0uY2FsbChhLmV4cG9ydHMsYSxhLmV4cG9ydHMsbiksYS5sPSEwLGEuZXhwb3J0c31yZXR1cm4gbi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxpKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6aX0pfSxuLnI9ZnVuY3Rpb24odCl7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOlwiTW9kdWxlXCJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiZcIm9iamVjdFwiPT10eXBlb2YgdCYmdCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCk7aWYobi5yKGkpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLFwiZGVmYXVsdFwiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KSwyJmUmJlwic3RyaW5nXCIhPXR5cGVvZiB0KWZvcih2YXIgYSBpbiB0KW4uZChpLGEsZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxhKSk7cmV0dXJuIGl9LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsXCJhXCIsZSksZX0sbi5vPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfSxuLnA9XCJcIixuKG4ucz0xMDcpfSh7MDpmdW5jdGlvbihlLG4pe2UuZXhwb3J0cz10fSwxOmZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWV9LDEwNzpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGksYT10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4oaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSkscj10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciBhIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLGEpJiYodFthXT1lW2FdKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sbz10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIGkgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKSYmZS5pbmRleE9mKGkpPDAmJihuW2ldPXRbaV0pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBhPTA7Zm9yKGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTthPGkubGVuZ3RoO2ErKyllLmluZGV4T2YoaVthXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsaVthXSkmJihuW2lbYV1dPXRbaVthXV0pfXJldHVybiBufSxzPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciB1PXMobigwKSksYz1zKG4oMSkpLGQ9bigxNTUpLHA9bigzOCksbD1uKDEwOCk7ZS53aXRoUmlwcGxlPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybihlPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oKXt2YXIgbj1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4uaXNDb21wb25lbnRNb3VudGVkPSEwLG4uaXNUb3VjaGVkPSExLG4uZGlzcGxheU5hbWU9XCJXaXRoUmlwcGxlKFwiK2Z1bmN0aW9uKHQpe3JldHVybiB0LmRpc3BsYXlOYW1lfHx0Lm5hbWV8fFwiQ29tcG9uZW50XCJ9KHQpK1wiKVwiLG4uc3RhdGU9e2NsYXNzTGlzdDpuZXcgU2V0LHN0eWxlOnt9fSxuLmluaXRpYWxpemVGb3VuZGF0aW9uPWZ1bmN0aW9uKHQsZSl7dmFyIGk9bi5jcmVhdGVBZGFwdGVyKHQsZSk7bi5mb3VuZGF0aW9uPW5ldyBkLk1EQ1JpcHBsZUZvdW5kYXRpb24oaSksbi5mb3VuZGF0aW9uLmluaXQoKX0sbi5jcmVhdGVBZGFwdGVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJue2Jyb3dzZXJTdXBwb3J0c0Nzc1ZhcnM6ZnVuY3Rpb24oKXtyZXR1cm4gcC5zdXBwb3J0c0Nzc1ZhcmlhYmxlcyh3aW5kb3cpfSxpc1VuYm91bmRlZDpmdW5jdGlvbigpe3JldHVybiBuLnByb3BzLnVuYm91bmRlZH0saXNTdXJmYWNlQWN0aXZlOmZ1bmN0aW9uKCl7cmV0dXJuIGU/bC5tYXRjaGVzKGUsXCI6YWN0aXZlXCIpOmwubWF0Y2hlcyh0LFwiOmFjdGl2ZVwiKX0saXNTdXJmYWNlRGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5wcm9wcy5kaXNhYmxlZH0sYWRkQ2xhc3M6ZnVuY3Rpb24odCl7bi5pc0NvbXBvbmVudE1vdW50ZWQmJm4uc2V0U3RhdGUoe2NsYXNzTGlzdDpuLnN0YXRlLmNsYXNzTGlzdC5hZGQodCl9KX0scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24odCl7aWYobi5pc0NvbXBvbmVudE1vdW50ZWQpe3ZhciBlPW4uc3RhdGUuY2xhc3NMaXN0O2UuZGVsZXRlKHQpLG4uc2V0U3RhdGUoe2NsYXNzTGlzdDplfSl9fSxyZWdpc3RlckRvY3VtZW50SW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHQsZSxwLmFwcGx5UGFzc2l2ZSgpKX0sZGVyZWdpc3RlckRvY3VtZW50SW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHQsZSxwLmFwcGx5UGFzc2l2ZSgpKX0scmVnaXN0ZXJSZXNpemVIYW5kbGVyOmZ1bmN0aW9uKHQpe3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLHQpfSxkZXJlZ2lzdGVyUmVzaXplSGFuZGxlcjpmdW5jdGlvbih0KXtyZXR1cm4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIix0KX0sdXBkYXRlQ3NzVmFyaWFibGU6bi51cGRhdGVDc3NWYXJpYWJsZSxjb21wdXRlQm91bmRpbmdSZWN0OmZ1bmN0aW9uKCl7cmV0dXJuIG4uaXNDb21wb25lbnRNb3VudGVkP24ucHJvcHMuY29tcHV0ZUJvdW5kaW5nUmVjdD9uLnByb3BzLmNvbXB1dGVCb3VuZGluZ1JlY3QodCk6dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTp7Ym90dG9tOjAsaGVpZ2h0OjAsbGVmdDowLHJpZ2h0OjAsdG9wOjAsd2lkdGg6MCx4OjAseTowfX0sY29udGFpbnNFdmVudFRhcmdldDpmdW5jdGlvbih0KXtyZXR1cm4hKCFlfHxudWxsPT09dCkmJmUuY29udGFpbnModCl9LHJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGRlcmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sZ2V0V2luZG93UGFnZU9mZnNldDpmdW5jdGlvbigpe3JldHVybnt4OndpbmRvdy5wYWdlWE9mZnNldCx5OndpbmRvdy5wYWdlWU9mZnNldH19fX0sbi5oYW5kbGVGb2N1cz1mdW5jdGlvbih0KXtuLnByb3BzLm9uRm9jdXMmJm4ucHJvcHMub25Gb2N1cyh0KSxuLmZvdW5kYXRpb24uaGFuZGxlRm9jdXMoKX0sbi5oYW5kbGVCbHVyPWZ1bmN0aW9uKHQpe24ucHJvcHMub25CbHVyJiZuLnByb3BzLm9uQmx1cih0KSxuLmZvdW5kYXRpb24uaGFuZGxlQmx1cigpfSxuLmhhbmRsZU1vdXNlRG93bj1mdW5jdGlvbih0KXtuLnByb3BzLm9uTW91c2VEb3duJiZuLnByb3BzLm9uTW91c2VEb3duKHQpLG4uaXNUb3VjaGVkP24uaXNUb3VjaGVkPSExOm4uYWN0aXZhdGVSaXBwbGUodCl9LG4uaGFuZGxlTW91c2VVcD1mdW5jdGlvbih0KXtuLnByb3BzLm9uTW91c2VVcCYmbi5wcm9wcy5vbk1vdXNlVXAodCksbi5kZWFjdGl2YXRlUmlwcGxlKCl9LG4uaGFuZGxlVG91Y2hTdGFydD1mdW5jdGlvbih0KXtuLmlzVG91Y2hlZD0hMCxuLnByb3BzLm9uVG91Y2hTdGFydCYmbi5wcm9wcy5vblRvdWNoU3RhcnQodCksbi5hY3RpdmF0ZVJpcHBsZSh0KX0sbi5oYW5kbGVUb3VjaEVuZD1mdW5jdGlvbih0KXtuLnByb3BzLm9uVG91Y2hFbmQmJm4ucHJvcHMub25Ub3VjaEVuZCh0KSxuLmRlYWN0aXZhdGVSaXBwbGUoKX0sbi5oYW5kbGVLZXlEb3duPWZ1bmN0aW9uKHQpe24ucHJvcHMub25LZXlEb3duJiZuLnByb3BzLm9uS2V5RG93bih0KSxuLmFjdGl2YXRlUmlwcGxlKHQpfSxuLmhhbmRsZUtleVVwPWZ1bmN0aW9uKHQpe24ucHJvcHMub25LZXlVcCYmbi5wcm9wcy5vbktleVVwKHQpLG4uZGVhY3RpdmF0ZVJpcHBsZSgpfSxuLmFjdGl2YXRlUmlwcGxlPWZ1bmN0aW9uKHQpe3QucGVyc2lzdCgpLG4uZm91bmRhdGlvbi5hY3RpdmF0ZSh0Lm5hdGl2ZUV2ZW50KX0sbi5kZWFjdGl2YXRlUmlwcGxlPWZ1bmN0aW9uKCl7bi5mb3VuZGF0aW9uLmRlYWN0aXZhdGUoKX0sbi51cGRhdGVDc3NWYXJpYWJsZT1mdW5jdGlvbih0LGUpe24uaXNDb21wb25lbnRNb3VudGVkJiZuLnNldFN0YXRlKGZ1bmN0aW9uKGkpe3ZhciBhPU9iamVjdC5hc3NpZ24oe30sbi5zdGF0ZS5zdHlsZSxpLnN0eWxlKTtyZXR1cm4gbnVsbD09PWU/ZGVsZXRlIGFbdF06YVt0XT1lLE9iamVjdC5hc3NpZ24oaSx7c3R5bGU6YX0pfSl9LG59cmV0dXJuIGEobixlKSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe2lmKCF0aGlzLmZvdW5kYXRpb24pdGhyb3cgbmV3IEVycm9yKFwiWW91IG11c3QgY2FsbCBpbml0UmlwcGxlIGZyb20gdGhlIGVsZW1lbnQncyByZWYgcHJvcCB0byBpbml0aWFsaXplIHRoZSBhZGFwdGVyIGZvciB3aXRoUmlwcGxlXCIpfSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9ZnVuY3Rpb24odCl7dGhpcy5wcm9wcy5kaXNhYmxlZCE9PXQuZGlzYWJsZWQmJnRoaXMucHJvcHMuZGlzYWJsZWQmJnRoaXMuZm91bmRhdGlvbi5oYW5kbGVCbHVyKCl9LG4ucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7dGhpcy5mb3VuZGF0aW9uJiYodGhpcy5pc0NvbXBvbmVudE1vdW50ZWQ9ITEsdGhpcy5mb3VuZGF0aW9uLmRlc3Ryb3koKSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSxcImNsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcy5jbGFzc05hbWUsZT10aGlzLnN0YXRlLmNsYXNzTGlzdDtyZXR1cm4gYy5kZWZhdWx0KEFycmF5LmZyb20oZSksdCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLFwic3R5bGVcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcy5zdHlsZSxlPXRoaXMuc3RhdGUuc3R5bGU7cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sZSx0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxuLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLG49KGUudW5ib3VuZGVkLGUuc3R5bGUsZS5jbGFzc05hbWUsZS5vbk1vdXNlRG93bixlLm9uTW91c2VVcCxlLm9uVG91Y2hTdGFydCxlLm9uVG91Y2hFbmQsZS5vbktleURvd24sZS5vbktleVVwLGUub25Gb2N1cyxlLm9uQmx1cixvKGUsW1widW5ib3VuZGVkXCIsXCJzdHlsZVwiLFwiY2xhc3NOYW1lXCIsXCJvbk1vdXNlRG93blwiLFwib25Nb3VzZVVwXCIsXCJvblRvdWNoU3RhcnRcIixcIm9uVG91Y2hFbmRcIixcIm9uS2V5RG93blwiLFwib25LZXlVcFwiLFwib25Gb2N1c1wiLFwib25CbHVyXCJdKSksaT1yKHt9LG4se29uTW91c2VEb3duOnRoaXMuaGFuZGxlTW91c2VEb3duLG9uTW91c2VVcDp0aGlzLmhhbmRsZU1vdXNlVXAsb25Ub3VjaFN0YXJ0OnRoaXMuaGFuZGxlVG91Y2hTdGFydCxvblRvdWNoRW5kOnRoaXMuaGFuZGxlVG91Y2hFbmQsb25LZXlEb3duOnRoaXMuaGFuZGxlS2V5RG93bixvbktleVVwOnRoaXMuaGFuZGxlS2V5VXAsb25Gb2N1czp0aGlzLmhhbmRsZUZvY3VzLG9uQmx1cjp0aGlzLmhhbmRsZUJsdXIsaW5pdFJpcHBsZTp0aGlzLmluaXRpYWxpemVGb3VuZGF0aW9uLGNsYXNzTmFtZTp0aGlzLmNsYXNzZXMsc3R5bGU6dGhpcy5zdHlsZX0pO3JldHVybiB1LmRlZmF1bHQuY3JlYXRlRWxlbWVudCh0LHIoe30saSkpfSxufSh1LmRlZmF1bHQuQ29tcG9uZW50KSkuZGVmYXVsdFByb3BzPXIoe3VuYm91bmRlZDohMSxkaXNhYmxlZDohMSxzdHlsZTp7fSxjbGFzc05hbWU6XCJcIixvbk1vdXNlRG93bjpmdW5jdGlvbigpe30sb25Nb3VzZVVwOmZ1bmN0aW9uKCl7fSxvblRvdWNoU3RhcnQ6ZnVuY3Rpb24oKXt9LG9uVG91Y2hFbmQ6ZnVuY3Rpb24oKXt9LG9uS2V5RG93bjpmdW5jdGlvbigpe30sb25LZXlVcDpmdW5jdGlvbigpe30sb25Gb2N1czpmdW5jdGlvbigpe30sb25CbHVyOmZ1bmN0aW9uKCl7fX0sdC5kZWZhdWx0UHJvcHMpLGV9fSwxMDg6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG5mdW5jdGlvbiBpKHQsZSl7aWYodC5jbG9zZXN0KXJldHVybiB0LmNsb3Nlc3QoZSk7Zm9yKHZhciBuPXQ7bjspe2lmKGEobixlKSlyZXR1cm4gbjtuPW4ucGFyZW50RWxlbWVudH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBhKHQsZSl7cmV0dXJuKHQubWF0Y2hlc3x8dC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fHQubXNNYXRjaGVzU2VsZWN0b3IpLmNhbGwodCxlKX1uLnIoZSksbi5kKGUsXCJjbG9zZXN0XCIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLG4uZChlLFwibWF0Y2hlc1wiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KX0sMTU1OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSk7XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3I7XG4vKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXG50aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZVxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcbk1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuXG5cblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xuYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi92YXIgaT1mdW5jdGlvbih0LGUpe3JldHVybihpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSkodCxlKX07dmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4oYT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgYSBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxhKSYmKHRbYV09ZVthXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG52YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dm9pZCAwPT09dCYmKHQ9e30pLHRoaXMuYWRhcHRlcl89dH1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJjc3NDbGFzc2VzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwic3RyaW5nc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIm51bWJlcnNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJkZWZhdWx0QWRhcHRlclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7fSx0fSgpLG89e0JHX0ZPQ1VTRUQ6XCJtZGMtcmlwcGxlLXVwZ3JhZGVkLS1iYWNrZ3JvdW5kLWZvY3VzZWRcIixGR19BQ1RJVkFUSU9OOlwibWRjLXJpcHBsZS11cGdyYWRlZC0tZm9yZWdyb3VuZC1hY3RpdmF0aW9uXCIsRkdfREVBQ1RJVkFUSU9OOlwibWRjLXJpcHBsZS11cGdyYWRlZC0tZm9yZWdyb3VuZC1kZWFjdGl2YXRpb25cIixST09UOlwibWRjLXJpcHBsZS11cGdyYWRlZFwiLFVOQk9VTkRFRDpcIm1kYy1yaXBwbGUtdXBncmFkZWQtLXVuYm91bmRlZFwifSxzPXtWQVJfRkdfU0NBTEU6XCItLW1kYy1yaXBwbGUtZmctc2NhbGVcIixWQVJfRkdfU0laRTpcIi0tbWRjLXJpcHBsZS1mZy1zaXplXCIsVkFSX0ZHX1RSQU5TTEFURV9FTkQ6XCItLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLWVuZFwiLFZBUl9GR19UUkFOU0xBVEVfU1RBUlQ6XCItLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLXN0YXJ0XCIsVkFSX0xFRlQ6XCItLW1kYy1yaXBwbGUtbGVmdFwiLFZBUl9UT1A6XCItLW1kYy1yaXBwbGUtdG9wXCJ9LHU9e0RFQUNUSVZBVElPTl9USU1FT1VUX01TOjIyNSxGR19ERUFDVElWQVRJT05fTVM6MTUwLElOSVRJQUxfT1JJR0lOX1NDQUxFOi42LFBBRERJTkc6MTAsVEFQX0RFTEFZX01TOjMwMH0sYz1uKDM4KTtuLmQoZSxcIk1EQ1JpcHBsZUZvdW5kYXRpb25cIixmdW5jdGlvbigpe3JldHVybiBmfSk7XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cbnZhciBkPVtcInRvdWNoc3RhcnRcIixcInBvaW50ZXJkb3duXCIsXCJtb3VzZWRvd25cIixcImtleWRvd25cIl0scD1bXCJ0b3VjaGVuZFwiLFwicG9pbnRlcnVwXCIsXCJtb3VzZXVwXCIsXCJjb250ZXh0bWVudVwiXSxsPVtdLGY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXt2YXIgaT10LmNhbGwodGhpcyxhKHt9LGUuZGVmYXVsdEFkYXB0ZXIsbikpfHx0aGlzO3JldHVybiBpLmFjdGl2YXRpb25BbmltYXRpb25IYXNFbmRlZF89ITEsaS5hY3RpdmF0aW9uVGltZXJfPTAsaS5mZ0RlYWN0aXZhdGlvblJlbW92YWxUaW1lcl89MCxpLmZnU2NhbGVfPVwiMFwiLGkuZnJhbWVfPXt3aWR0aDowLGhlaWdodDowfSxpLmluaXRpYWxTaXplXz0wLGkubGF5b3V0RnJhbWVfPTAsaS5tYXhSYWRpdXNfPTAsaS51bmJvdW5kZWRDb29yZHNfPXtsZWZ0OjAsdG9wOjB9LGkuYWN0aXZhdGlvblN0YXRlXz1pLmRlZmF1bHRBY3RpdmF0aW9uU3RhdGVfKCksaS5hY3RpdmF0aW9uVGltZXJDYWxsYmFja189ZnVuY3Rpb24oKXtpLmFjdGl2YXRpb25BbmltYXRpb25IYXNFbmRlZF89ITAsaS5ydW5EZWFjdGl2YXRpb25VWExvZ2ljSWZSZWFkeV8oKX0saS5hY3RpdmF0ZUhhbmRsZXJfPWZ1bmN0aW9uKHQpe3JldHVybiBpLmFjdGl2YXRlXyh0KX0saS5kZWFjdGl2YXRlSGFuZGxlcl89ZnVuY3Rpb24oKXtyZXR1cm4gaS5kZWFjdGl2YXRlXygpfSxpLmZvY3VzSGFuZGxlcl89ZnVuY3Rpb24oKXtyZXR1cm4gaS5oYW5kbGVGb2N1cygpfSxpLmJsdXJIYW5kbGVyXz1mdW5jdGlvbigpe3JldHVybiBpLmhhbmRsZUJsdXIoKX0saS5yZXNpemVIYW5kbGVyXz1mdW5jdGlvbigpe3JldHVybiBpLmxheW91dCgpfSxpfXJldHVybiBmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0oZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzdHJpbmdzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwibnVtYmVyc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybnthZGRDbGFzczpmdW5jdGlvbigpe30sYnJvd3NlclN1cHBvcnRzQ3NzVmFyczpmdW5jdGlvbigpe3JldHVybiEwfSxjb21wdXRlQm91bmRpbmdSZWN0OmZ1bmN0aW9uKCl7cmV0dXJue3RvcDowLHJpZ2h0OjAsYm90dG9tOjAsbGVmdDowLHdpZHRoOjAsaGVpZ2h0OjB9fSxjb250YWluc0V2ZW50VGFyZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuITB9LGRlcmVnaXN0ZXJEb2N1bWVudEludGVyYWN0aW9uSGFuZGxlcjpmdW5jdGlvbigpe30sZGVyZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcjpmdW5jdGlvbigpe30sZGVyZWdpc3RlclJlc2l6ZUhhbmRsZXI6ZnVuY3Rpb24oKXt9LGdldFdpbmRvd1BhZ2VPZmZzZXQ6ZnVuY3Rpb24oKXtyZXR1cm57eDowLHk6MH19LGlzU3VyZmFjZUFjdGl2ZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1N1cmZhY2VEaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiEwfSxpc1VuYm91bmRlZDpmdW5jdGlvbigpe3JldHVybiEwfSxyZWdpc3RlckRvY3VtZW50SW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxyZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcjpmdW5jdGlvbigpe30scmVnaXN0ZXJSZXNpemVIYW5kbGVyOmZ1bmN0aW9uKCl7fSxyZW1vdmVDbGFzczpmdW5jdGlvbigpe30sdXBkYXRlQ3NzVmFyaWFibGU6ZnVuY3Rpb24oKXt9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPXRoaXMuc3VwcG9ydHNQcmVzc1JpcHBsZV8oKTtpZih0aGlzLnJlZ2lzdGVyUm9vdEhhbmRsZXJzXyhuKSxuKXt2YXIgaT1lLmNzc0NsYXNzZXMsYT1pLlJPT1Qscj1pLlVOQk9VTkRFRDtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt0LmFkYXB0ZXJfLmFkZENsYXNzKGEpLHQuYWRhcHRlcl8uaXNVbmJvdW5kZWQoKSYmKHQuYWRhcHRlcl8uYWRkQ2xhc3MociksdC5sYXlvdXRJbnRlcm5hbF8oKSl9KX19LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKHRoaXMuc3VwcG9ydHNQcmVzc1JpcHBsZV8oKSl7dGhpcy5hY3RpdmF0aW9uVGltZXJfJiYoY2xlYXJUaW1lb3V0KHRoaXMuYWN0aXZhdGlvblRpbWVyXyksdGhpcy5hY3RpdmF0aW9uVGltZXJfPTAsdGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyhlLmNzc0NsYXNzZXMuRkdfQUNUSVZBVElPTikpLHRoaXMuZmdEZWFjdGl2YXRpb25SZW1vdmFsVGltZXJfJiYoY2xlYXJUaW1lb3V0KHRoaXMuZmdEZWFjdGl2YXRpb25SZW1vdmFsVGltZXJfKSx0aGlzLmZnRGVhY3RpdmF0aW9uUmVtb3ZhbFRpbWVyXz0wLHRoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoZS5jc3NDbGFzc2VzLkZHX0RFQUNUSVZBVElPTikpO3ZhciBuPWUuY3NzQ2xhc3NlcyxpPW4uUk9PVCxhPW4uVU5CT1VOREVEO3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3QuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoaSksdC5hZGFwdGVyXy5yZW1vdmVDbGFzcyhhKSx0LnJlbW92ZUNzc1ZhcnNfKCl9KX10aGlzLmRlcmVnaXN0ZXJSb290SGFuZGxlcnNfKCksdGhpcy5kZXJlZ2lzdGVyRGVhY3RpdmF0aW9uSGFuZGxlcnNfKCl9LGUucHJvdG90eXBlLmFjdGl2YXRlPWZ1bmN0aW9uKHQpe3RoaXMuYWN0aXZhdGVfKHQpfSxlLnByb3RvdHlwZS5kZWFjdGl2YXRlPWZ1bmN0aW9uKCl7dGhpcy5kZWFjdGl2YXRlXygpfSxlLnByb3RvdHlwZS5sYXlvdXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMubGF5b3V0RnJhbWVfJiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmxheW91dEZyYW1lXyksdGhpcy5sYXlvdXRGcmFtZV89cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7dC5sYXlvdXRJbnRlcm5hbF8oKSx0LmxheW91dEZyYW1lXz0wfSl9LGUucHJvdG90eXBlLnNldFVuYm91bmRlZD1mdW5jdGlvbih0KXt2YXIgbj1lLmNzc0NsYXNzZXMuVU5CT1VOREVEO3Q/dGhpcy5hZGFwdGVyXy5hZGRDbGFzcyhuKTp0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKG4pfSxlLnByb3RvdHlwZS5oYW5kbGVGb2N1cz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7cmV0dXJuIHQuYWRhcHRlcl8uYWRkQ2xhc3MoZS5jc3NDbGFzc2VzLkJHX0ZPQ1VTRUQpfSl9LGUucHJvdG90eXBlLmhhbmRsZUJsdXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3JldHVybiB0LmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGUuY3NzQ2xhc3Nlcy5CR19GT0NVU0VEKX0pfSxlLnByb3RvdHlwZS5zdXBwb3J0c1ByZXNzUmlwcGxlXz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFkYXB0ZXJfLmJyb3dzZXJTdXBwb3J0c0Nzc1ZhcnMoKX0sZS5wcm90b3R5cGUuZGVmYXVsdEFjdGl2YXRpb25TdGF0ZV89ZnVuY3Rpb24oKXtyZXR1cm57YWN0aXZhdGlvbkV2ZW50OnZvaWQgMCxoYXNEZWFjdGl2YXRpb25VWFJ1bjohMSxpc0FjdGl2YXRlZDohMSxpc1Byb2dyYW1tYXRpYzohMSx3YXNBY3RpdmF0ZWRCeVBvaW50ZXI6ITEsd2FzRWxlbWVudE1hZGVBY3RpdmU6ITF9fSxlLnByb3RvdHlwZS5yZWdpc3RlclJvb3RIYW5kbGVyc189ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0JiYoZC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UuYWRhcHRlcl8ucmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXIodCxlLmFjdGl2YXRlSGFuZGxlcl8pfSksdGhpcy5hZGFwdGVyXy5pc1VuYm91bmRlZCgpJiZ0aGlzLmFkYXB0ZXJfLnJlZ2lzdGVyUmVzaXplSGFuZGxlcih0aGlzLnJlc2l6ZUhhbmRsZXJfKSksdGhpcy5hZGFwdGVyXy5yZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcihcImZvY3VzXCIsdGhpcy5mb2N1c0hhbmRsZXJfKSx0aGlzLmFkYXB0ZXJfLnJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyKFwiYmx1clwiLHRoaXMuYmx1ckhhbmRsZXJfKX0sZS5wcm90b3R5cGUucmVnaXN0ZXJEZWFjdGl2YXRpb25IYW5kbGVyc189ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztcImtleWRvd25cIj09PXQudHlwZT90aGlzLmFkYXB0ZXJfLnJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyKFwia2V5dXBcIix0aGlzLmRlYWN0aXZhdGVIYW5kbGVyXyk6cC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UuYWRhcHRlcl8ucmVnaXN0ZXJEb2N1bWVudEludGVyYWN0aW9uSGFuZGxlcih0LGUuZGVhY3RpdmF0ZUhhbmRsZXJfKX0pfSxlLnByb3RvdHlwZS5kZXJlZ2lzdGVyUm9vdEhhbmRsZXJzXz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7ZC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuYWRhcHRlcl8uZGVyZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcihlLHQuYWN0aXZhdGVIYW5kbGVyXyl9KSx0aGlzLmFkYXB0ZXJfLmRlcmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXIoXCJmb2N1c1wiLHRoaXMuZm9jdXNIYW5kbGVyXyksdGhpcy5hZGFwdGVyXy5kZXJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyKFwiYmx1clwiLHRoaXMuYmx1ckhhbmRsZXJfKSx0aGlzLmFkYXB0ZXJfLmlzVW5ib3VuZGVkKCkmJnRoaXMuYWRhcHRlcl8uZGVyZWdpc3RlclJlc2l6ZUhhbmRsZXIodGhpcy5yZXNpemVIYW5kbGVyXyl9LGUucHJvdG90eXBlLmRlcmVnaXN0ZXJEZWFjdGl2YXRpb25IYW5kbGVyc189ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuYWRhcHRlcl8uZGVyZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcihcImtleXVwXCIsdGhpcy5kZWFjdGl2YXRlSGFuZGxlcl8pLHAuZm9yRWFjaChmdW5jdGlvbihlKXt0LmFkYXB0ZXJfLmRlcmVnaXN0ZXJEb2N1bWVudEludGVyYWN0aW9uSGFuZGxlcihlLHQuZGVhY3RpdmF0ZUhhbmRsZXJfKX0pfSxlLnByb3RvdHlwZS5yZW1vdmVDc3NWYXJzXz1mdW5jdGlvbigpe3ZhciB0PXRoaXMsbj1lLnN0cmluZ3M7T2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXswPT09ZS5pbmRleE9mKFwiVkFSX1wiKSYmdC5hZGFwdGVyXy51cGRhdGVDc3NWYXJpYWJsZShuW2VdLG51bGwpfSl9LGUucHJvdG90eXBlLmFjdGl2YXRlXz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKCF0aGlzLmFkYXB0ZXJfLmlzU3VyZmFjZURpc2FibGVkKCkpe3ZhciBuPXRoaXMuYWN0aXZhdGlvblN0YXRlXztpZighbi5pc0FjdGl2YXRlZCl7dmFyIGk9dGhpcy5wcmV2aW91c0FjdGl2YXRpb25FdmVudF87aWYoIShpJiZ2b2lkIDAhPT10JiZpLnR5cGUhPT10LnR5cGUpKW4uaXNBY3RpdmF0ZWQ9ITAsbi5pc1Byb2dyYW1tYXRpYz12b2lkIDA9PT10LG4uYWN0aXZhdGlvbkV2ZW50PXQsbi53YXNBY3RpdmF0ZWRCeVBvaW50ZXI9IW4uaXNQcm9ncmFtbWF0aWMmJih2b2lkIDAhPT10JiYoXCJtb3VzZWRvd25cIj09PXQudHlwZXx8XCJ0b3VjaHN0YXJ0XCI9PT10LnR5cGV8fFwicG9pbnRlcmRvd25cIj09PXQudHlwZSkpLHZvaWQgMCE9PXQmJmwubGVuZ3RoPjAmJmwuc29tZShmdW5jdGlvbih0KXtyZXR1cm4gZS5hZGFwdGVyXy5jb250YWluc0V2ZW50VGFyZ2V0KHQpfSk/dGhpcy5yZXNldEFjdGl2YXRpb25TdGF0ZV8oKToodm9pZCAwIT09dCYmKGwucHVzaCh0LnRhcmdldCksdGhpcy5yZWdpc3RlckRlYWN0aXZhdGlvbkhhbmRsZXJzXyh0KSksbi53YXNFbGVtZW50TWFkZUFjdGl2ZT10aGlzLmNoZWNrRWxlbWVudE1hZGVBY3RpdmVfKHQpLG4ud2FzRWxlbWVudE1hZGVBY3RpdmUmJnRoaXMuYW5pbWF0ZUFjdGl2YXRpb25fKCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7bD1bXSxuLndhc0VsZW1lbnRNYWRlQWN0aXZlfHx2b2lkIDA9PT10fHxcIiBcIiE9PXQua2V5JiYzMiE9PXQua2V5Q29kZXx8KG4ud2FzRWxlbWVudE1hZGVBY3RpdmU9ZS5jaGVja0VsZW1lbnRNYWRlQWN0aXZlXyh0KSxuLndhc0VsZW1lbnRNYWRlQWN0aXZlJiZlLmFuaW1hdGVBY3RpdmF0aW9uXygpKSxuLndhc0VsZW1lbnRNYWRlQWN0aXZlfHwoZS5hY3RpdmF0aW9uU3RhdGVfPWUuZGVmYXVsdEFjdGl2YXRpb25TdGF0ZV8oKSl9KSl9fX0sZS5wcm90b3R5cGUuY2hlY2tFbGVtZW50TWFkZUFjdGl2ZV89ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXR8fFwia2V5ZG93blwiIT09dC50eXBlfHx0aGlzLmFkYXB0ZXJfLmlzU3VyZmFjZUFjdGl2ZSgpfSxlLnByb3RvdHlwZS5hbmltYXRlQWN0aXZhdGlvbl89ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49ZS5zdHJpbmdzLGk9bi5WQVJfRkdfVFJBTlNMQVRFX1NUQVJULGE9bi5WQVJfRkdfVFJBTlNMQVRFX0VORCxyPWUuY3NzQ2xhc3NlcyxvPXIuRkdfREVBQ1RJVkFUSU9OLHM9ci5GR19BQ1RJVkFUSU9OLHU9ZS5udW1iZXJzLkRFQUNUSVZBVElPTl9USU1FT1VUX01TO3RoaXMubGF5b3V0SW50ZXJuYWxfKCk7dmFyIGM9XCJcIixkPVwiXCI7aWYoIXRoaXMuYWRhcHRlcl8uaXNVbmJvdW5kZWQoKSl7dmFyIHA9dGhpcy5nZXRGZ1RyYW5zbGF0aW9uQ29vcmRpbmF0ZXNfKCksbD1wLnN0YXJ0UG9pbnQsZj1wLmVuZFBvaW50O2M9bC54K1wicHgsIFwiK2wueStcInB4XCIsZD1mLngrXCJweCwgXCIrZi55K1wicHhcIn10aGlzLmFkYXB0ZXJfLnVwZGF0ZUNzc1ZhcmlhYmxlKGksYyksdGhpcy5hZGFwdGVyXy51cGRhdGVDc3NWYXJpYWJsZShhLGQpLGNsZWFyVGltZW91dCh0aGlzLmFjdGl2YXRpb25UaW1lcl8pLGNsZWFyVGltZW91dCh0aGlzLmZnRGVhY3RpdmF0aW9uUmVtb3ZhbFRpbWVyXyksdGhpcy5ybUJvdW5kZWRBY3RpdmF0aW9uQ2xhc3Nlc18oKSx0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKG8pLHRoaXMuYWRhcHRlcl8uY29tcHV0ZUJvdW5kaW5nUmVjdCgpLHRoaXMuYWRhcHRlcl8uYWRkQ2xhc3MocyksdGhpcy5hY3RpdmF0aW9uVGltZXJfPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gdC5hY3RpdmF0aW9uVGltZXJDYWxsYmFja18oKX0sdSl9LGUucHJvdG90eXBlLmdldEZnVHJhbnNsYXRpb25Db29yZGluYXRlc189ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuYWN0aXZhdGlvblN0YXRlXyxuPWUuYWN0aXZhdGlvbkV2ZW50O3JldHVybntzdGFydFBvaW50OnQ9e3g6KHQ9ZS53YXNBY3RpdmF0ZWRCeVBvaW50ZXI/T2JqZWN0KGMuZ2V0Tm9ybWFsaXplZEV2ZW50Q29vcmRzKShuLHRoaXMuYWRhcHRlcl8uZ2V0V2luZG93UGFnZU9mZnNldCgpLHRoaXMuYWRhcHRlcl8uY29tcHV0ZUJvdW5kaW5nUmVjdCgpKTp7eDp0aGlzLmZyYW1lXy53aWR0aC8yLHk6dGhpcy5mcmFtZV8uaGVpZ2h0LzJ9KS54LXRoaXMuaW5pdGlhbFNpemVfLzIseTp0LnktdGhpcy5pbml0aWFsU2l6ZV8vMn0sZW5kUG9pbnQ6e3g6dGhpcy5mcmFtZV8ud2lkdGgvMi10aGlzLmluaXRpYWxTaXplXy8yLHk6dGhpcy5mcmFtZV8uaGVpZ2h0LzItdGhpcy5pbml0aWFsU2l6ZV8vMn19fSxlLnByb3RvdHlwZS5ydW5EZWFjdGl2YXRpb25VWExvZ2ljSWZSZWFkeV89ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49ZS5jc3NDbGFzc2VzLkZHX0RFQUNUSVZBVElPTixpPXRoaXMuYWN0aXZhdGlvblN0YXRlXyxhPWkuaGFzRGVhY3RpdmF0aW9uVVhSdW4scj1pLmlzQWN0aXZhdGVkOyhhfHwhcikmJnRoaXMuYWN0aXZhdGlvbkFuaW1hdGlvbkhhc0VuZGVkXyYmKHRoaXMucm1Cb3VuZGVkQWN0aXZhdGlvbkNsYXNzZXNfKCksdGhpcy5hZGFwdGVyXy5hZGRDbGFzcyhuKSx0aGlzLmZnRGVhY3RpdmF0aW9uUmVtb3ZhbFRpbWVyXz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5hZGFwdGVyXy5yZW1vdmVDbGFzcyhuKX0sdS5GR19ERUFDVElWQVRJT05fTVMpKX0sZS5wcm90b3R5cGUucm1Cb3VuZGVkQWN0aXZhdGlvbkNsYXNzZXNfPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5jc3NDbGFzc2VzLkZHX0FDVElWQVRJT047dGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyh0KSx0aGlzLmFjdGl2YXRpb25BbmltYXRpb25IYXNFbmRlZF89ITEsdGhpcy5hZGFwdGVyXy5jb21wdXRlQm91bmRpbmdSZWN0KCl9LGUucHJvdG90eXBlLnJlc2V0QWN0aXZhdGlvblN0YXRlXz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5wcmV2aW91c0FjdGl2YXRpb25FdmVudF89dGhpcy5hY3RpdmF0aW9uU3RhdGVfLmFjdGl2YXRpb25FdmVudCx0aGlzLmFjdGl2YXRpb25TdGF0ZV89dGhpcy5kZWZhdWx0QWN0aXZhdGlvblN0YXRlXygpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gdC5wcmV2aW91c0FjdGl2YXRpb25FdmVudF89dm9pZCAwfSxlLm51bWJlcnMuVEFQX0RFTEFZX01TKX0sZS5wcm90b3R5cGUuZGVhY3RpdmF0ZV89ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5hY3RpdmF0aW9uU3RhdGVfO2lmKGUuaXNBY3RpdmF0ZWQpe3ZhciBuPWEoe30sZSk7ZS5pc1Byb2dyYW1tYXRpYz8ocmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7cmV0dXJuIHQuYW5pbWF0ZURlYWN0aXZhdGlvbl8obil9KSx0aGlzLnJlc2V0QWN0aXZhdGlvblN0YXRlXygpKToodGhpcy5kZXJlZ2lzdGVyRGVhY3RpdmF0aW9uSGFuZGxlcnNfKCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7dC5hY3RpdmF0aW9uU3RhdGVfLmhhc0RlYWN0aXZhdGlvblVYUnVuPSEwLHQuYW5pbWF0ZURlYWN0aXZhdGlvbl8obiksdC5yZXNldEFjdGl2YXRpb25TdGF0ZV8oKX0pKX19LGUucHJvdG90eXBlLmFuaW1hdGVEZWFjdGl2YXRpb25fPWZ1bmN0aW9uKHQpe3ZhciBlPXQud2FzQWN0aXZhdGVkQnlQb2ludGVyLG49dC53YXNFbGVtZW50TWFkZUFjdGl2ZTsoZXx8bikmJnRoaXMucnVuRGVhY3RpdmF0aW9uVVhMb2dpY0lmUmVhZHlfKCl9LGUucHJvdG90eXBlLmxheW91dEludGVybmFsXz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5mcmFtZV89dGhpcy5hZGFwdGVyXy5jb21wdXRlQm91bmRpbmdSZWN0KCk7dmFyIG49TWF0aC5tYXgodGhpcy5mcmFtZV8uaGVpZ2h0LHRoaXMuZnJhbWVfLndpZHRoKTt0aGlzLm1heFJhZGl1c189dGhpcy5hZGFwdGVyXy5pc1VuYm91bmRlZCgpP246TWF0aC5zcXJ0KE1hdGgucG93KHQuZnJhbWVfLndpZHRoLDIpK01hdGgucG93KHQuZnJhbWVfLmhlaWdodCwyKSkrZS5udW1iZXJzLlBBRERJTkcsdGhpcy5pbml0aWFsU2l6ZV89TWF0aC5mbG9vcihuKmUubnVtYmVycy5JTklUSUFMX09SSUdJTl9TQ0FMRSksdGhpcy5mZ1NjYWxlXz1cIlwiK3RoaXMubWF4UmFkaXVzXy90aGlzLmluaXRpYWxTaXplXyx0aGlzLnVwZGF0ZUxheW91dENzc1ZhcnNfKCl9LGUucHJvdG90eXBlLnVwZGF0ZUxheW91dENzc1ZhcnNfPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5zdHJpbmdzLG49dC5WQVJfRkdfU0laRSxpPXQuVkFSX0xFRlQsYT10LlZBUl9UT1Ascj10LlZBUl9GR19TQ0FMRTt0aGlzLmFkYXB0ZXJfLnVwZGF0ZUNzc1ZhcmlhYmxlKG4sdGhpcy5pbml0aWFsU2l6ZV8rXCJweFwiKSx0aGlzLmFkYXB0ZXJfLnVwZGF0ZUNzc1ZhcmlhYmxlKHIsdGhpcy5mZ1NjYWxlXyksdGhpcy5hZGFwdGVyXy5pc1VuYm91bmRlZCgpJiYodGhpcy51bmJvdW5kZWRDb29yZHNfPXtsZWZ0Ok1hdGgucm91bmQodGhpcy5mcmFtZV8ud2lkdGgvMi10aGlzLmluaXRpYWxTaXplXy8yKSx0b3A6TWF0aC5yb3VuZCh0aGlzLmZyYW1lXy5oZWlnaHQvMi10aGlzLmluaXRpYWxTaXplXy8yKX0sdGhpcy5hZGFwdGVyXy51cGRhdGVDc3NWYXJpYWJsZShpLHRoaXMudW5ib3VuZGVkQ29vcmRzXy5sZWZ0K1wicHhcIiksdGhpcy5hZGFwdGVyXy51cGRhdGVDc3NWYXJpYWJsZShhLHRoaXMudW5ib3VuZGVkQ29vcmRzXy50b3ArXCJweFwiKSl9LGV9KHIpO2UuZGVmYXVsdD1mfSwzODpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGksYTtmdW5jdGlvbiByKHQsZSl7dm9pZCAwPT09ZSYmKGU9ITEpO3ZhciBuPXQuQ1NTLGE9aTtpZihcImJvb2xlYW5cIj09dHlwZW9mIGkmJiFlKXJldHVybiBpO2lmKCEobiYmXCJmdW5jdGlvblwiPT10eXBlb2Ygbi5zdXBwb3J0cykpcmV0dXJuITE7dmFyIHI9bi5zdXBwb3J0cyhcIi0tY3NzLXZhcnNcIixcInllc1wiKSxvPW4uc3VwcG9ydHMoXCIoLS1jc3MtdmFyczogeWVzKVwiKSYmbi5zdXBwb3J0cyhcImNvbG9yXCIsXCIjMDAwMDAwMDBcIik7cmV0dXJuIGE9ISghciYmIW8pJiYhZnVuY3Rpb24odCl7dmFyIGU9dC5kb2N1bWVudCxuPWUuY3JlYXRlRWxlbWVudChcImRpdlwiKTtuLmNsYXNzTmFtZT1cIm1kYy1yaXBwbGUtc3VyZmFjZS0tdGVzdC1lZGdlLXZhci1idWdcIixlLmJvZHkuYXBwZW5kQ2hpbGQobik7dmFyIGk9dC5nZXRDb21wdXRlZFN0eWxlKG4pLGE9bnVsbCE9PWkmJlwic29saWRcIj09PWkuYm9yZGVyVG9wU3R5bGU7cmV0dXJuIG4ucmVtb3ZlKCksYX0odCksZXx8KGk9YSksYX1mdW5jdGlvbiBvKHQsZSl7aWYodm9pZCAwPT09dCYmKHQ9d2luZG93KSx2b2lkIDA9PT1lJiYoZT0hMSksdm9pZCAwPT09YXx8ZSl7dmFyIG49ITE7dHJ5e3QuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRlc3RcIixmdW5jdGlvbigpe30se2dldCBwYXNzaXZlKCl7cmV0dXJuIG49ITB9fSl9Y2F0Y2godCl7fWE9bn1yZXR1cm4hIWEmJntwYXNzaXZlOiEwfX1mdW5jdGlvbiBzKHQsZSxuKXtpZighdClyZXR1cm57eDowLHk6MH07dmFyIGksYSxyPWUueCxvPWUueSxzPXIrbi5sZWZ0LHU9bytuLnRvcDtpZihcInRvdWNoc3RhcnRcIj09PXQudHlwZSl7dmFyIGM9dDtpPWMuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVgtcyxhPWMuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVktdX1lbHNle3ZhciBkPXQ7aT1kLnBhZ2VYLXMsYT1kLnBhZ2VZLXV9cmV0dXJue3g6aSx5OmF9fW4ucihlKSxuLmQoZSxcInN1cHBvcnRzQ3NzVmFyaWFibGVzXCIsZnVuY3Rpb24oKXtyZXR1cm4gcn0pLG4uZChlLFwiYXBwbHlQYXNzaXZlXCIsZnVuY3Rpb24oKXtyZXR1cm4gb30pLG4uZChlLFwiZ2V0Tm9ybWFsaXplZEV2ZW50Q29vcmRzXCIsZnVuY3Rpb24oKXtyZXR1cm4gc30pfX0pfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yaXBwbGUuanMubWFwIiwiIWZ1bmN0aW9uKHQsZSl7aWYoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUpbW9kdWxlLmV4cG9ydHM9ZShyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcImNsYXNzbmFtZXNcIikpO2Vsc2UgaWYoXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXCJyZWFjdFwiLFwiY2xhc3NuYW1lc1wiXSxlKTtlbHNle3ZhciBuPVwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2UocmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTplKHQucmVhY3QsdC5jbGFzc25hbWVzKTtmb3IodmFyIHIgaW4gbikoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czp0KVtyXT1uW3JdfX0oXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4ocil7aWYoZVtyXSlyZXR1cm4gZVtyXS5leHBvcnRzO3ZhciBvPWVbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9cmV0dXJuIG4ubT10LG4uYz1lLG4uZD1mdW5jdGlvbih0LGUscil7bi5vKHQsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2VudW1lcmFibGU6ITAsZ2V0OnJ9KX0sbi5yPWZ1bmN0aW9uKHQpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbih0LGUpe2lmKDEmZSYmKHQ9bih0KSksOCZlKXJldHVybiB0O2lmKDQmZSYmXCJvYmplY3RcIj09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTp0fSksMiZlJiZcInN0cmluZ1wiIT10eXBlb2YgdClmb3IodmFyIG8gaW4gdCluLmQocixvLGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfS5iaW5kKG51bGwsbykpO3JldHVybiByfSxuLm49ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIG4uZChlLFwiYVwiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPVwiXCIsbihuLnM9NzkpfSh7MDpmdW5jdGlvbihlLG4pe2UuZXhwb3J0cz10fSwxOmZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWV9LDE2MDpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5yKGUpO1wiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yO1xuLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxuXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovdmFyIHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4ocj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9O3ZhciBvPWZ1bmN0aW9uKCl7cmV0dXJuKG89T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rKylmb3IodmFyIG8gaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbykmJih0W29dPWVbb10pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZvaWQgMD09PXQmJih0PXt9KSx0aGlzLmFkYXB0ZXJfPXR9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcInN0cmluZ3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJudW1iZXJzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe30sdH0oKSxpPW4oMzcpO24uZChlLFwiTURDRmxvYXRpbmdMYWJlbEZvdW5kYXRpb25cIixmdW5jdGlvbigpe3JldHVybiBzfSk7XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cbnZhciBzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobil7dmFyIHI9dC5jYWxsKHRoaXMsbyh7fSxlLmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpcztyZXR1cm4gci5zaGFrZUFuaW1hdGlvbkVuZEhhbmRsZXJfPWZ1bmN0aW9uKCl7cmV0dXJuIHIuaGFuZGxlU2hha2VBbmltYXRpb25FbmRfKCl9LHJ9cmV0dXJuIGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1yKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfShlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5jc3NDbGFzc2VzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2FkZENsYXNzOmZ1bmN0aW9uKCl7fSxyZW1vdmVDbGFzczpmdW5jdGlvbigpe30sZ2V0V2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gMH0scmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXI6ZnVuY3Rpb24oKXt9LGRlcmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXI6ZnVuY3Rpb24oKXt9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dGhpcy5hZGFwdGVyXy5yZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcihcImFuaW1hdGlvbmVuZFwiLHRoaXMuc2hha2VBbmltYXRpb25FbmRIYW5kbGVyXyl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmFkYXB0ZXJfLmRlcmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXIoXCJhbmltYXRpb25lbmRcIix0aGlzLnNoYWtlQW5pbWF0aW9uRW5kSGFuZGxlcl8pfSxlLnByb3RvdHlwZS5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFkYXB0ZXJfLmdldFdpZHRoKCl9LGUucHJvdG90eXBlLnNoYWtlPWZ1bmN0aW9uKHQpe3ZhciBuPWUuY3NzQ2xhc3Nlcy5MQUJFTF9TSEFLRTt0P3RoaXMuYWRhcHRlcl8uYWRkQ2xhc3Mobik6dGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyhuKX0sZS5wcm90b3R5cGUuZmxvYXQ9ZnVuY3Rpb24odCl7dmFyIG49ZS5jc3NDbGFzc2VzLHI9bi5MQUJFTF9GTE9BVF9BQk9WRSxvPW4uTEFCRUxfU0hBS0U7dD90aGlzLmFkYXB0ZXJfLmFkZENsYXNzKHIpOih0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKHIpLHRoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MobykpfSxlLnByb3RvdHlwZS5oYW5kbGVTaGFrZUFuaW1hdGlvbkVuZF89ZnVuY3Rpb24oKXt2YXIgdD1lLmNzc0NsYXNzZXMuTEFCRUxfU0hBS0U7dGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyh0KX0sZX0oYSk7ZS5kZWZhdWx0PXN9LDM3OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSksbi5kKGUsXCJjc3NDbGFzc2VzXCIsZnVuY3Rpb24oKXtyZXR1cm4gcn0pO1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG52YXIgcj17TEFCRUxfRkxPQVRfQUJPVkU6XCJtZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlXCIsTEFCRUxfU0hBS0U6XCJtZGMtZmxvYXRpbmctbGFiZWwtLXNoYWtlXCIsUk9PVDpcIm1kYy1mbG9hdGluZy1sYWJlbFwifX0sNzk6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByLG89dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKHI9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9KSh0LGUpfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9cih0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLGE9dGhpcyYmdGhpcy5fX2Fzc2lnbnx8ZnVuY3Rpb24oKXtyZXR1cm4oYT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLHI9YXJndW1lbnRzLmxlbmd0aDtuPHI7bisrKWZvcih2YXIgbyBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxvKSYmKHRbb109ZVtvXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGk9dGhpcyYmdGhpcy5fX3Jlc3R8fGZ1bmN0aW9uKHQsZSl7dmFyIG49e307Zm9yKHZhciByIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscikmJmUuaW5kZXhPZihyKTwwJiYobltyXT10W3JdKTtpZihudWxsIT10JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgbz0wO2ZvcihyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7bzxyLmxlbmd0aDtvKyspZS5pbmRleE9mKHJbb10pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LHJbb10pJiYobltyW29dXT10W3Jbb11dKX1yZXR1cm4gbn0scz10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbD1zKG4oMCkpLHU9cyhuKDEpKSxjPW4oMTYwKSxmPW4oMzcpLHA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5sYWJlbEVsZW1lbnQ9bC5kZWZhdWx0LmNyZWF0ZVJlZigpLGUuc3RhdGU9e2NsYXNzTGlzdDpuZXcgU2V0fSxlLmluaXRpYWxpemVGb3VuZGF0aW9uPWZ1bmN0aW9uKCl7ZS5mb3VuZGF0aW9uPW5ldyBjLk1EQ0Zsb2F0aW5nTGFiZWxGb3VuZGF0aW9uKGUuYWRhcHRlciksZS5mb3VuZGF0aW9uLmluaXQoKX0sZS5zaGFrZT1mdW5jdGlvbigpe2UuZm91bmRhdGlvbi5zaGFrZSghMCl9LGUucmVtb3ZlQ2xhc3NGcm9tQ2xhc3NMaXN0PWZ1bmN0aW9uKHQpe3ZhciBuPWUuc3RhdGUuY2xhc3NMaXN0O24uZGVsZXRlKHQpLGUuc2V0U3RhdGUoe2NsYXNzTGlzdDpufSl9LGUuaGFuZGxlV2lkdGhDaGFuZ2U9ZnVuY3Rpb24oKXtlLnByb3BzLmhhbmRsZVdpZHRoQ2hhbmdlJiZlLmxhYmVsRWxlbWVudC5jdXJyZW50JiZlLnByb3BzLmhhbmRsZVdpZHRoQ2hhbmdlKGUubGFiZWxFbGVtZW50LmN1cnJlbnQub2Zmc2V0V2lkdGgpfSxlLm9uU2hha2VFbmQ9ZnVuY3Rpb24oKXtlLnJlbW92ZUNsYXNzRnJvbUNsYXNzTGlzdChmLmNzc0NsYXNzZXMuTEFCRUxfU0hBS0UpfSxlfXJldHVybiBvKGUsdCksZS5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt0aGlzLmluaXRpYWxpemVGb3VuZGF0aW9uKCksdGhpcy5oYW5kbGVXaWR0aENoYW5nZSgpLHRoaXMucHJvcHMuZmxvYXQmJnRoaXMuZm91bmRhdGlvbi5mbG9hdCghMCl9LGUucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7dGhpcy5mb3VuZGF0aW9uLmRlc3Ryb3koKX0sZS5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPWZ1bmN0aW9uKHQpe3RoaXMucHJvcHMuY2hpbGRyZW4hPT10LmNoaWxkcmVuJiZ0aGlzLmhhbmRsZVdpZHRoQ2hhbmdlKCksdGhpcy5wcm9wcy5mbG9hdCE9PXQuZmxvYXQmJnRoaXMuZm91bmRhdGlvbi5mbG9hdCh0aGlzLnByb3BzLmZsb2F0KX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiY2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnN0YXRlLmNsYXNzTGlzdCxlPXRoaXMucHJvcHMuY2xhc3NOYW1lO3JldHVybiB1LmRlZmF1bHQoZi5jc3NDbGFzc2VzLlJPT1QsQXJyYXkuZnJvbSh0KSxlKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJhZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJue2FkZENsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnNldFN0YXRlKHtjbGFzc0xpc3Q6dC5zdGF0ZS5jbGFzc0xpc3QuYWRkKGUpfSl9LHJlbW92ZUNsYXNzOnRoaXMucmVtb3ZlQ2xhc3NGcm9tQ2xhc3NMaXN0LHJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxkZXJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxnZXRXaWR0aDpmdW5jdGlvbigpe3JldHVybiAwfX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcyxlPSh0LmNsYXNzTmFtZSx0LmNoaWxkcmVuKSxuPSh0LmhhbmRsZVdpZHRoQ2hhbmdlLHQuZmxvYXQsaSh0LFtcImNsYXNzTmFtZVwiLFwiY2hpbGRyZW5cIixcImhhbmRsZVdpZHRoQ2hhbmdlXCIsXCJmbG9hdFwiXSkpO3JldHVybiBsLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIsYSh7Y2xhc3NOYW1lOnRoaXMuY2xhc3NlcyxyZWY6dGhpcy5sYWJlbEVsZW1lbnQsb25BbmltYXRpb25FbmQ6dGhpcy5vblNoYWtlRW5kfSxuKSxlKX0sZS5kZWZhdWx0UHJvcHM9e2NsYXNzTmFtZTpcIlwiLGZsb2F0OiExfSxlfShsLmRlZmF1bHQuQ29tcG9uZW50KTtlLmRlZmF1bHQ9cH19KX0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmxvYXRpbmctbGFiZWwuanMubWFwIiwiIWZ1bmN0aW9uKHQsZSl7aWYoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUpbW9kdWxlLmV4cG9ydHM9ZShyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcImNsYXNzbmFtZXNcIikpO2Vsc2UgaWYoXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXCJyZWFjdFwiLFwiY2xhc3NuYW1lc1wiXSxlKTtlbHNle3ZhciBuPVwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2UocmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTplKHQucmVhY3QsdC5jbGFzc25hbWVzKTtmb3IodmFyIHIgaW4gbikoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czp0KVtyXT1uW3JdfX0oXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4ocil7aWYoZVtyXSlyZXR1cm4gZVtyXS5leHBvcnRzO3ZhciBvPWVbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9cmV0dXJuIG4ubT10LG4uYz1lLG4uZD1mdW5jdGlvbih0LGUscil7bi5vKHQsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2VudW1lcmFibGU6ITAsZ2V0OnJ9KX0sbi5yPWZ1bmN0aW9uKHQpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbih0LGUpe2lmKDEmZSYmKHQ9bih0KSksOCZlKXJldHVybiB0O2lmKDQmZSYmXCJvYmplY3RcIj09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTp0fSksMiZlJiZcInN0cmluZ1wiIT10eXBlb2YgdClmb3IodmFyIG8gaW4gdCluLmQocixvLGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfS5iaW5kKG51bGwsbykpO3JldHVybiByfSxuLm49ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIG4uZChlLFwiYVwiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPVwiXCIsbihuLnM9ODYpfSh7MDpmdW5jdGlvbihlLG4pe2UuZXhwb3J0cz10fSwxOmZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWV9LDE1MTpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5yKGUpO1wiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yO1xuLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxuXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovdmFyIHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4ocj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9O3ZhciBvPWZ1bmN0aW9uKCl7cmV0dXJuKG89T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rKylmb3IodmFyIG8gaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbykmJih0W29dPWVbb10pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZvaWQgMD09PXQmJih0PXt9KSx0aGlzLmFkYXB0ZXJfPXR9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcInN0cmluZ3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJudW1iZXJzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe30sdH0oKSxhPXtMSU5FX1JJUFBMRV9BQ1RJVkU6XCJtZGMtbGluZS1yaXBwbGUtLWFjdGl2ZVwiLExJTkVfUklQUExFX0RFQUNUSVZBVElORzpcIm1kYy1saW5lLXJpcHBsZS0tZGVhY3RpdmF0aW5nXCJ9O24uZChlLFwiTURDTGluZVJpcHBsZUZvdW5kYXRpb25cIixmdW5jdGlvbigpe3JldHVybiBzfSk7XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cbnZhciBzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobil7dmFyIHI9dC5jYWxsKHRoaXMsbyh7fSxlLmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpcztyZXR1cm4gci50cmFuc2l0aW9uRW5kSGFuZGxlcl89ZnVuY3Rpb24odCl7cmV0dXJuIHIuaGFuZGxlVHJhbnNpdGlvbkVuZCh0KX0scn1yZXR1cm4gZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fXIodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJjc3NDbGFzc2VzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBhfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2FkZENsYXNzOmZ1bmN0aW9uKCl7fSxyZW1vdmVDbGFzczpmdW5jdGlvbigpe30saGFzQ2xhc3M6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sc2V0U3R5bGU6ZnVuY3Rpb24oKXt9LHJlZ2lzdGVyRXZlbnRIYW5kbGVyOmZ1bmN0aW9uKCl7fSxkZXJlZ2lzdGVyRXZlbnRIYW5kbGVyOmZ1bmN0aW9uKCl7fX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3RoaXMuYWRhcHRlcl8ucmVnaXN0ZXJFdmVudEhhbmRsZXIoXCJ0cmFuc2l0aW9uZW5kXCIsdGhpcy50cmFuc2l0aW9uRW5kSGFuZGxlcl8pfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5hZGFwdGVyXy5kZXJlZ2lzdGVyRXZlbnRIYW5kbGVyKFwidHJhbnNpdGlvbmVuZFwiLHRoaXMudHJhbnNpdGlvbkVuZEhhbmRsZXJfKX0sZS5wcm90b3R5cGUuYWN0aXZhdGU9ZnVuY3Rpb24oKXt0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGEuTElORV9SSVBQTEVfREVBQ1RJVkFUSU5HKSx0aGlzLmFkYXB0ZXJfLmFkZENsYXNzKGEuTElORV9SSVBQTEVfQUNUSVZFKX0sZS5wcm90b3R5cGUuc2V0UmlwcGxlQ2VudGVyPWZ1bmN0aW9uKHQpe3RoaXMuYWRhcHRlcl8uc2V0U3R5bGUoXCJ0cmFuc2Zvcm0tb3JpZ2luXCIsdCtcInB4IGNlbnRlclwiKX0sZS5wcm90b3R5cGUuZGVhY3RpdmF0ZT1mdW5jdGlvbigpe3RoaXMuYWRhcHRlcl8uYWRkQ2xhc3MoYS5MSU5FX1JJUFBMRV9ERUFDVElWQVRJTkcpfSxlLnByb3RvdHlwZS5oYW5kbGVUcmFuc2l0aW9uRW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYWRhcHRlcl8uaGFzQ2xhc3MoYS5MSU5FX1JJUFBMRV9ERUFDVElWQVRJTkcpO1wib3BhY2l0eVwiPT09dC5wcm9wZXJ0eU5hbWUmJmUmJih0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGEuTElORV9SSVBQTEVfQUNUSVZFKSx0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGEuTElORV9SSVBQTEVfREVBQ1RJVkFUSU5HKSl9LGV9KGkpO2UuZGVmYXVsdD1zfSw4NjpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHIsbz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4ocj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1yKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSksaT10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihpPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEscj1hcmd1bWVudHMubGVuZ3RoO248cjtuKyspZm9yKHZhciBvIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG8pJiYodFtvXT1lW29dKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYT10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIHIgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxyKSYmZS5pbmRleE9mKHIpPDAmJihuW3JdPXRbcl0pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBvPTA7Zm9yKHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtvPHIubGVuZ3RoO28rKyllLmluZGV4T2YocltvXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQscltvXSkmJihuW3Jbb11dPXRbcltvXV0pfXJldHVybiBufSxzPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciB1PXMobigwKSksYz1zKG4oMSkpLHA9bigxNTEpLGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5zdGF0ZT17Y2xhc3NMaXN0Om5ldyBTZXQsc3R5bGU6e319LGUuc2V0U3R5bGU9ZnVuY3Rpb24odCxuKXt2YXIgcj10LnJlcGxhY2UoLy0oXFx3KS9nLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUudG9VcHBlckNhc2UoKX0pLG89T2JqZWN0LmFzc2lnbih7fSxlLnN0YXRlLnN0eWxlKTtvW3JdPW4sZS5zZXRTdGF0ZSh7c3R5bGU6b30pfSxlLmdldE1lcmdlZFN0eWxlcz1mdW5jdGlvbigpe3ZhciB0PWUucHJvcHMuc3R5bGUsbj1lLnN0YXRlLnN0eWxlO3JldHVybiBPYmplY3QuYXNzaWduKHt9LG4sdCl9LGUub25UcmFuc2l0aW9uRW5kPWZ1bmN0aW9uKHQpe3JldHVybiBlLmZvdW5kYXRpb25fLmhhbmRsZVRyYW5zaXRpb25FbmQodC5uYXRpdmVFdmVudCl9LGV9cmV0dXJuIG8oZSx0KSxlLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3RoaXMuZm91bmRhdGlvbl89bmV3IHAuTURDTGluZVJpcHBsZUZvdW5kYXRpb24odGhpcy5hZGFwdGVyKSx0aGlzLmZvdW5kYXRpb25fLmluaXQoKSx0aGlzLnByb3BzLmFjdGl2ZSYmdGhpcy5mb3VuZGF0aW9uXy5hY3RpdmF0ZSgpfSxlLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9ZnVuY3Rpb24odCl7dGhpcy5wcm9wcy5hY3RpdmUhPT10LmFjdGl2ZSYmKHRoaXMucHJvcHMuYWN0aXZlP3RoaXMuZm91bmRhdGlvbl8uYWN0aXZhdGUoKTp0aGlzLmZvdW5kYXRpb25fLmRlYWN0aXZhdGUoKSk7dmFyIGU9dGhpcy5wcm9wcy5yaXBwbGVDZW50ZXI7ZSYmZSE9PXQucmlwcGxlQ2VudGVyJiYhaXNOYU4oZSkmJnRoaXMuZm91bmRhdGlvbl8uc2V0UmlwcGxlQ2VudGVyKGUpfSxlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMuZm91bmRhdGlvbl8uZGVzdHJveSgpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJhZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJue2FkZENsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnNldFN0YXRlKHtjbGFzc0xpc3Q6dC5zdGF0ZS5jbGFzc0xpc3QuYWRkKGUpfSl9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciBuPXQuc3RhdGUuY2xhc3NMaXN0O24uZGVsZXRlKGUpLHQuc2V0U3RhdGUoe2NsYXNzTGlzdDpufSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnN0YXRlLmNsYXNzTGlzdC5oYXMoZSl9LHNldFN0eWxlOnRoaXMuc2V0U3R5bGUscmVnaXN0ZXJFdmVudEhhbmRsZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sZGVyZWdpc3RlckV2ZW50SGFuZGxlcjpmdW5jdGlvbigpe3JldHVybiBudWxsfX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiY2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLmNsYXNzTmFtZSxlPXRoaXMuc3RhdGUuY2xhc3NMaXN0O3JldHVybiBjLmRlZmF1bHQoXCJtZGMtbGluZS1yaXBwbGVcIixBcnJheS5mcm9tKGUpLHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMsZT0odC5zdHlsZSx0LmNsYXNzTmFtZSx0LmFjdGl2ZSx0LnJpcHBsZUNlbnRlcixhKHQsW1wic3R5bGVcIixcImNsYXNzTmFtZVwiLFwiYWN0aXZlXCIsXCJyaXBwbGVDZW50ZXJcIl0pKTtyZXR1cm4gdS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIixpKHtjbGFzc05hbWU6dGhpcy5jbGFzc2VzLHN0eWxlOnRoaXMuZ2V0TWVyZ2VkU3R5bGVzKCksb25UcmFuc2l0aW9uRW5kOnRoaXMub25UcmFuc2l0aW9uRW5kfSxlKSl9LGUuZGVmYXVsdFByb3BzPXtjbGFzc05hbWU6XCJcIixzdHlsZTp7fSxhY3RpdmU6ITEscmlwcGxlQ2VudGVyOjB9LGV9KHUuZGVmYXVsdC5Db21wb25lbnQpO2UuZGVmYXVsdD1sfX0pfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saW5lLXJpcHBsZS5qcy5tYXAiLCIhZnVuY3Rpb24oZSx0KXtpZihcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZSltb2R1bGUuZXhwb3J0cz10KHJlcXVpcmUoXCJyZWFjdFwiKSxyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSxyZXF1aXJlKFwiQG1hdGVyaWFsL3JlYWN0LXJpcHBsZS9kaXN0L2luZGV4LmpzXCIpKTtlbHNlIGlmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW1wicmVhY3RcIixcImNsYXNzbmFtZXNcIixcIkBtYXRlcmlhbC9yZWFjdC1yaXBwbGUvZGlzdC9pbmRleC5qc1wiXSx0KTtlbHNle3ZhciBuPVwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP3QocmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpLHJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtcmlwcGxlL2Rpc3QvaW5kZXguanNcIikpOnQoZS5yZWFjdCxlLmNsYXNzbmFtZXMsZVtcIkBtYXRlcmlhbC9yZWFjdC1yaXBwbGUvZGlzdC9pbmRleC5qc1wiXSk7Zm9yKHZhciByIGluIG4pKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6ZSlbcl09bltyXX19KFwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcyxmdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Z1bmN0aW9uIG4ocil7aWYodFtyXSlyZXR1cm4gdFtyXS5leHBvcnRzO3ZhciBpPXRbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiBlW3JdLmNhbGwoaS5leHBvcnRzLGksaS5leHBvcnRzLG4pLGkubD0hMCxpLmV4cG9ydHN9cmV0dXJuIG4ubT1lLG4uYz10LG4uZD1mdW5jdGlvbihlLHQscil7bi5vKGUsdCl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6ITAsZ2V0OnJ9KX0sbi5yPWZ1bmN0aW9uKGUpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbihlLHQpe2lmKDEmdCYmKGU9bihlKSksOCZ0KXJldHVybiBlO2lmKDQmdCYmXCJvYmplY3RcIj09dHlwZW9mIGUmJmUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTplfSksMiZ0JiZcInN0cmluZ1wiIT10eXBlb2YgZSlmb3IodmFyIGkgaW4gZSluLmQocixpLGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfS5iaW5kKG51bGwsaSkpO3JldHVybiByfSxuLm49ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIG4uZCh0LFwiYVwiLHQpLHR9LG4ubz1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX0sbi5wPVwiXCIsbihuLnM9NDEpfSh7MDpmdW5jdGlvbih0LG4pe3QuZXhwb3J0cz1lfSwxOmZ1bmN0aW9uKGUsbil7ZS5leHBvcnRzPXR9LDQxOmZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcixpPXRoaXMmJnRoaXMuX19leHRlbmRzfHwocj1mdW5jdGlvbihlLHQpe3JldHVybihyPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihlLHQpe2UuX19wcm90b19fPXR9fHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJihlW25dPXRbbl0pfSkoZSx0KX0sZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfXIoZSx0KSxlLnByb3RvdHlwZT1udWxsPT09dD9PYmplY3QuY3JlYXRlKHQpOihuLnByb3RvdHlwZT10LnByb3RvdHlwZSxuZXcgbil9KSxvPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKG89T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rKylmb3IodmFyIGkgaW4gdD1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsaSkmJihlW2ldPXRbaV0pO3JldHVybiBlfSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxzPXRoaXMmJnRoaXMuX19yZXN0fHxmdW5jdGlvbihlLHQpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiZ0LmluZGV4T2Yocik8MCYmKG5bcl09ZVtyXSk7aWYobnVsbCE9ZSYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGk9MDtmb3Iocj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO2k8ci5sZW5ndGg7aSsrKXQuaW5kZXhPZihyW2ldKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyW2ldKSYmKG5bcltpXV09ZVtyW2ldXSl9cmV0dXJuIG59LGE9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIGw9YShuKDApKSxjPWEobigxKSksdT1uKDQyKSxkPWEobig4OCkpLGY9YShuKDg5KSk7dC5MaXN0SXRlbT1mLmRlZmF1bHQ7dmFyIHA9YShuKDkxKSk7dC5MaXN0SXRlbUdyYXBoaWM9cC5kZWZhdWx0O3ZhciBoPWEobig5MikpO3QuTGlzdEl0ZW1UZXh0PWguZGVmYXVsdDt2YXIgXz1hKG4oOTMpKTt0Lkxpc3RJdGVtTWV0YT1fLmRlZmF1bHQ7dmFyIG09YShuKDk0KSk7dC5MaXN0RGl2aWRlcj1tLmRlZmF1bHQ7dmFyIEk9YShuKDk1KSk7dC5MaXN0R3JvdXA9SS5kZWZhdWx0O3ZhciB5PWEobig5NikpO3QuTGlzdEdyb3VwU3ViaGVhZGVyPXkuZGVmYXVsdDtmdW5jdGlvbiBiKGUpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiBlJiYhaXNOYU4oZSl8fEFycmF5LmlzQXJyYXkoZSl9dC5kZWZhdWx0TGlzdEl0ZW1Db250ZXh0PXtoYW5kbGVDbGljazpmdW5jdGlvbigpe30saGFuZGxlS2V5RG93bjpmdW5jdGlvbigpe30saGFuZGxlQmx1cjpmdW5jdGlvbigpe30saGFuZGxlRm9jdXM6ZnVuY3Rpb24oKXt9LG9uRGVzdHJveTpmdW5jdGlvbigpe30sZ2V0TGlzdEl0ZW1Jbml0aWFsVGFiSW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4tMX0sZ2V0Q2xhc3NOYW1lc0Zyb21MaXN0OmZ1bmN0aW9uKCl7cmV0dXJue319fSx0Lkxpc3RJdGVtQ29udGV4dD1sLmRlZmF1bHQuY3JlYXRlQ29udGV4dCh0LmRlZmF1bHRMaXN0SXRlbUNvbnRleHQpO3ZhciB4PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oKXt2YXIgdD1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIHQuaGFzSW5pdGlhbGl6ZWRMaXN0SXRlbVRhYkluZGV4PSExLHQubGlzdEVsZW1lbnQ9bC5kZWZhdWx0LmNyZWF0ZVJlZigpLHQuc3RhdGU9e2xpc3RJdGVtQ2xhc3NOYW1lczp7fX0sdC5pbml0aWFsaXplTGlzdFR5cGU9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3BzLnNpbmdsZVNlbGVjdGlvbixuPXUuTURDTGlzdEZvdW5kYXRpb24uY3NzQ2xhc3NlcyxyPXUuTURDTGlzdEZvdW5kYXRpb24uc3RyaW5ncztpZih0Lmxpc3RFbGVtZW50LmN1cnJlbnQpe3ZhciBpPXQubGlzdEVsZW1lbnQuY3VycmVudC5xdWVyeVNlbGVjdG9yQWxsKHIuQVJJQV9ST0xFX0NIRUNLQk9YX1NFTEVDVE9SKSxvPXQubGlzdEVsZW1lbnQuY3VycmVudC5xdWVyeVNlbGVjdG9yKHIuQVJJQV9DSEVDS0VEX1JBRElPX1NFTEVDVE9SKTtpZihpLmxlbmd0aCl7dmFyIHM9dC5saXN0RWxlbWVudC5jdXJyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoci5BUklBX0NIRUNLRURfQ0hFQ0tCT1hfU0VMRUNUT1IpLGE9W10ubWFwLmNhbGwocyxmdW5jdGlvbihlKXtyZXR1cm4gdC5saXN0RWxlbWVudHMuaW5kZXhPZihlKX0pO3QuZm91bmRhdGlvbi5zZXRTZWxlY3RlZEluZGV4KGEpfWVsc2UgaWYoZSl7dC5saXN0RWxlbWVudC5jdXJyZW50LnF1ZXJ5U2VsZWN0b3Iobi5MSVNUX0lURU1fQUNUSVZBVEVEX0NMQVNTKSYmdC5mb3VuZGF0aW9uLnNldFVzZUFjdGl2YXRlZENsYXNzKCEwKX1lbHNlIG8mJnQuZm91bmRhdGlvbi5zZXRTZWxlY3RlZEluZGV4KHQubGlzdEVsZW1lbnRzLmluZGV4T2YobykpfX0sdC5nZXRMaXN0SXRlbUluaXRpYWxUYWJJbmRleD1mdW5jdGlvbihlKXt2YXIgbj10LnByb3BzLnNlbGVjdGVkSW5kZXgscj0tMTt0Lmhhc0luaXRpYWxpemVkTGlzdEl0ZW1UYWJJbmRleHx8KEFycmF5LmlzQXJyYXkobikmJm4ubGVuZ3RoPjAmJmU9PT1uWzBdfHxuPT09ZXx8LTE9PT1uKSYmKHI9MCx0Lmhhc0luaXRpYWxpemVkTGlzdEl0ZW1UYWJJbmRleD0hMCk7cmV0dXJuIHJ9LHQuZ2V0TGlzdEl0ZW1DbGFzc05hbWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHQuc3RhdGUubGlzdEl0ZW1DbGFzc05hbWVzfSx0LmhhbmRsZUtleURvd249ZnVuY3Rpb24oZSxuKXtlLnBlcnNpc3QoKSx0LmZvdW5kYXRpb24uaGFuZGxlS2V5ZG93bihlLm5hdGl2ZUV2ZW50LCEwLG4pfSx0LmhhbmRsZUNsaWNrPWZ1bmN0aW9uKGUsbil7dC5mb3VuZGF0aW9uLmhhbmRsZUNsaWNrKG4sITEpfSx0LmhhbmRsZUZvY3VzPWZ1bmN0aW9uKGUsbil7dC5mb3VuZGF0aW9uLmhhbmRsZUZvY3VzSW4oZS5uYXRpdmVFdmVudCxuKX0sdC5oYW5kbGVCbHVyPWZ1bmN0aW9uKGUsbil7dC5mb3VuZGF0aW9uLmhhbmRsZUZvY3VzT3V0KGUubmF0aXZlRXZlbnQsbil9LHQub25EZXN0cm95PWZ1bmN0aW9uKGUpe3ZhciBuPXQuc3RhdGUubGlzdEl0ZW1DbGFzc05hbWVzO2RlbGV0ZSBuW2VdLHQuc2V0U3RhdGUoe2xpc3RJdGVtQ2xhc3NOYW1lczpufSl9LHQuZ2V0TGlzdFByb3BzPWZ1bmN0aW9uKGUsbil7cmV0dXJue2NoZWNrYm94TGlzdDpCb29sZWFuKGUpLHJhZGlvTGlzdDpCb29sZWFuKG4pLGhhbmRsZUtleURvd246dC5oYW5kbGVLZXlEb3duLGhhbmRsZUNsaWNrOnQuaGFuZGxlQ2xpY2ssaGFuZGxlRm9jdXM6dC5oYW5kbGVGb2N1cyxoYW5kbGVCbHVyOnQuaGFuZGxlQmx1cixvbkRlc3Ryb3k6dC5vbkRlc3Ryb3ksZ2V0Q2xhc3NOYW1lc0Zyb21MaXN0OnQuZ2V0TGlzdEl0ZW1DbGFzc05hbWVzLGdldExpc3RJdGVtSW5pdGlhbFRhYkluZGV4OnQuZ2V0TGlzdEl0ZW1Jbml0aWFsVGFiSW5kZXh9fSx0LmdldExpc3RQcm9wc01lbW9pemVkPWQuZGVmYXVsdCh0LmdldExpc3RQcm9wcyksdH1yZXR1cm4gaShuLGUpLG4ucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyx0PWUuc2luZ2xlU2VsZWN0aW9uLG49ZS53cmFwRm9jdXMscj1lLnNlbGVjdGVkSW5kZXg7dGhpcy5mb3VuZGF0aW9uPW5ldyB1Lk1EQ0xpc3RGb3VuZGF0aW9uKHRoaXMuYWRhcHRlciksdGhpcy5mb3VuZGF0aW9uLmluaXQoKSx0aGlzLmZvdW5kYXRpb24uc2V0U2luZ2xlU2VsZWN0aW9uKHQpLHRoaXMuZm91bmRhdGlvbi5sYXlvdXQoKSxiKHIpJiZ0aGlzLmZvdW5kYXRpb24uc2V0U2VsZWN0ZWRJbmRleChyKSx0aGlzLmZvdW5kYXRpb24uc2V0V3JhcEZvY3VzKG4pLHRoaXMuZm91bmRhdGlvbi5zZXRWZXJ0aWNhbE9yaWVudGF0aW9uKFwidmVydGljYWxcIj09PXRoaXMucHJvcHNbXCJhcmlhLW9yaWVudGF0aW9uXCJdKSx0aGlzLmluaXRpYWxpemVMaXN0VHlwZSgpfSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wcm9wcyxuPXQuc2luZ2xlU2VsZWN0aW9uLHI9dC53cmFwRm9jdXMsaT10LnNlbGVjdGVkSW5kZXgsbz1pIT09ZS5zZWxlY3RlZEluZGV4O24hPT1lLnNpbmdsZVNlbGVjdGlvbiYmdGhpcy5mb3VuZGF0aW9uLnNldFNpbmdsZVNlbGVjdGlvbihuKSxvJiZiKGkpJiZ0aGlzLmZvdW5kYXRpb24uc2V0U2VsZWN0ZWRJbmRleChpKSxyIT09ZS53cmFwRm9jdXMmJnRoaXMuZm91bmRhdGlvbi5zZXRXcmFwRm9jdXMociksdGhpcy5wcm9wc1tcImFyaWEtb3JpZW50YXRpb25cIl0hPT1lW1wiYXJpYS1vcmllbnRhdGlvblwiXSYmdGhpcy5mb3VuZGF0aW9uLnNldFZlcnRpY2FsT3JpZW50YXRpb24oXCJ2ZXJ0aWNhbFwiPT09dGhpcy5wcm9wc1tcImFyaWEtb3JpZW50YXRpb25cIl0pfSxuLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMuZm91bmRhdGlvbi5kZXN0cm95KCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSxcImxpc3RFbGVtZW50c1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5saXN0RWxlbWVudC5jdXJyZW50P1tdLnNsaWNlLmNhbGwodGhpcy5saXN0RWxlbWVudC5jdXJyZW50LnF1ZXJ5U2VsZWN0b3JBbGwodS5NRENMaXN0Rm91bmRhdGlvbi5zdHJpbmdzLkVOQUJMRURfSVRFTVNfU0VMRUNUT1IpKTpbXX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsXCJjbGFzc2VzXCIse2dldDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLmNsYXNzTmFtZSxuPWUubm9uSW50ZXJhY3RpdmUscj1lLmRlbnNlLGk9ZS5hdmF0YXJMaXN0LG89ZS50d29MaW5lO3JldHVybiBjLmRlZmF1bHQoXCJtZGMtbGlzdFwiLHQse1wibWRjLWxpc3QtLW5vbi1pbnRlcmFjdGl2ZVwiOm4sXCJtZGMtbGlzdC0tZGVuc2VcIjpyLFwibWRjLWxpc3QtLWF2YXRhci1saXN0XCI6aSxcIm1kYy1saXN0LS10d28tbGluZVwiOm99KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsXCJhZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJue2dldExpc3RJdGVtQ291bnQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5saXN0RWxlbWVudHMubGVuZ3RofSxnZXRGb2N1c2VkRWxlbWVudEluZGV4OmZ1bmN0aW9uKCl7cmV0dXJuIGUubGlzdEVsZW1lbnRzLmluZGV4T2YoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCl9LHNldEF0dHJpYnV0ZUZvckVsZW1lbnRJbmRleDpmdW5jdGlvbih0LG4scil7dmFyIGk9ZS5saXN0RWxlbWVudHNbdF07aSYmaS5zZXRBdHRyaWJ1dGUobixyKX0sZ2V0QXR0cmlidXRlRm9yRWxlbWVudEluZGV4OmZ1bmN0aW9uKCl7cmV0dXJuXCJcIn0sYWRkQ2xhc3NGb3JFbGVtZW50SW5kZXg6ZnVuY3Rpb24odCxuKXt2YXIgcj1lLnN0YXRlLmxpc3RJdGVtQ2xhc3NOYW1lcztyW3RdJiYtMT09PXJbdF0uaW5kZXhPZihuKT9yW3RdLnB1c2gobik6clt0XT1bbl0sZS5zZXRTdGF0ZSh7bGlzdEl0ZW1DbGFzc05hbWVzOnJ9KX0scmVtb3ZlQ2xhc3NGb3JFbGVtZW50SW5kZXg6ZnVuY3Rpb24odCxuKXt2YXIgcj1lLnN0YXRlLmxpc3RJdGVtQ2xhc3NOYW1lcztpZihyW3RdKXt2YXIgaT1yW3RdLmluZGV4T2Yobik7LTEhPT1pJiYoclt0XS5zcGxpY2UoaSwxKSxlLnNldFN0YXRlKHtsaXN0SXRlbUNsYXNzTmFtZXM6cn0pKX19LHNldFRhYkluZGV4Rm9yTGlzdEl0ZW1DaGlsZHJlbjpmdW5jdGlvbih0LG4pe3ZhciByPWUubGlzdEVsZW1lbnRzW3RdLGk9dS5NRENMaXN0Rm91bmRhdGlvbi5zdHJpbmdzLkNISUxEX0VMRU1FTlRTX1RPX1RPR0dMRV9UQUJJTkRFWDtbXS5zbGljZS5jYWxsKHIucXVlcnlTZWxlY3RvckFsbChpKSkuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gZS5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLG4pfSl9LGZvY3VzSXRlbUF0SW5kZXg6ZnVuY3Rpb24odCl7dmFyIG49ZS5saXN0RWxlbWVudHNbdF07biYmbi5mb2N1cygpfSxzZXRDaGVja2VkQ2hlY2tib3hPclJhZGlvQXRJbmRleDpmdW5jdGlvbigpe30saGFzQ2hlY2tib3hBdEluZGV4OmZ1bmN0aW9uKHQpe3JldHVybiEhZS5saXN0RWxlbWVudHNbdF0ucXVlcnlTZWxlY3Rvcih1Lk1EQ0xpc3RGb3VuZGF0aW9uLnN0cmluZ3MuQ0hFQ0tCT1hfU0VMRUNUT1IpfSxoYXNSYWRpb0F0SW5kZXg6ZnVuY3Rpb24odCl7cmV0dXJuISFlLmxpc3RFbGVtZW50c1t0XS5xdWVyeVNlbGVjdG9yKHUuTURDTGlzdEZvdW5kYXRpb24uc3RyaW5ncy5SQURJT19TRUxFQ1RPUil9LGlzQ2hlY2tib3hDaGVja2VkQXRJbmRleDpmdW5jdGlvbih0KXt2YXIgbj1lLmxpc3RFbGVtZW50c1t0XSxyPXUuTURDTGlzdEZvdW5kYXRpb24uc3RyaW5ncy5DSEVDS0JPWF9TRUxFQ1RPUjtyZXR1cm4gbi5xdWVyeVNlbGVjdG9yKHIpLmNoZWNrZWR9LGlzRm9jdXNJbnNpZGVMaXN0OmZ1bmN0aW9uKCl7cmV0dXJuISFlLmxpc3RFbGVtZW50LmN1cnJlbnQmJmUubGlzdEVsZW1lbnQuY3VycmVudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KX0sbm90aWZ5QWN0aW9uOmZ1bmN0aW9uKHQpe2UucHJvcHMuaGFuZGxlU2VsZWN0KHQsZS5mb3VuZGF0aW9uLmdldFNlbGVjdGVkSW5kZXgoKSl9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsXCJyb2xlXCIse2dldDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLmNoZWNrYm94TGlzdCxuPWUucmFkaW9MaXN0LHI9ZS5yb2xlO3JldHVybiByfHwodD9cImdyb3VwXCI6bj9cInJhZGlvZ3JvdXBcIjpudWxsKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxuLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLG49KGUuY2xhc3NOYW1lLGUuY2hlY2tib3hMaXN0KSxyPWUucmFkaW9MaXN0LGk9KGUubm9uSW50ZXJhY3RpdmUsZS5kZW5zZSxlLmF2YXRhckxpc3QsZS50d29MaW5lLGUuc2luZ2xlU2VsZWN0aW9uLGUucm9sZSxlLnNlbGVjdGVkSW5kZXgsZS5oYW5kbGVTZWxlY3QsZS53cmFwRm9jdXMsZS5jaGlsZHJlbiksYT1lLnRhZyxjPXMoZSxbXCJjbGFzc05hbWVcIixcImNoZWNrYm94TGlzdFwiLFwicmFkaW9MaXN0XCIsXCJub25JbnRlcmFjdGl2ZVwiLFwiZGVuc2VcIixcImF2YXRhckxpc3RcIixcInR3b0xpbmVcIixcInNpbmdsZVNlbGVjdGlvblwiLFwicm9sZVwiLFwic2VsZWN0ZWRJbmRleFwiLFwiaGFuZGxlU2VsZWN0XCIsXCJ3cmFwRm9jdXNcIixcImNoaWxkcmVuXCIsXCJ0YWdcIl0pO3JldHVybiBsLmRlZmF1bHQuY3JlYXRlRWxlbWVudChhLG8oe2NsYXNzTmFtZTp0aGlzLmNsYXNzZXMscmVmOnRoaXMubGlzdEVsZW1lbnQscm9sZTp0aGlzLnJvbGV9LGMpLGwuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHQuTGlzdEl0ZW1Db250ZXh0LlByb3ZpZGVyLHt2YWx1ZTp0aGlzLmdldExpc3RQcm9wc01lbW9pemVkKG4scil9LGkpKX0sbi5kZWZhdWx0UHJvcHM9e2NsYXNzTmFtZTpcIlwiLGNoZWNrYm94TGlzdDohMSxyYWRpb0xpc3Q6ITEsbm9uSW50ZXJhY3RpdmU6ITEsZGVuc2U6ITEsYXZhdGFyTGlzdDohMSx0d29MaW5lOiExLHNpbmdsZVNlbGVjdGlvbjohMSxzZWxlY3RlZEluZGV4Oi0xLGhhbmRsZVNlbGVjdDpmdW5jdGlvbigpe30sd3JhcEZvY3VzOiEwLFwiYXJpYS1vcmllbnRhdGlvblwiOlwidmVydGljYWxcIix0YWc6XCJ1bFwifSxufShsLmRlZmF1bHQuQ29tcG9uZW50KTt0LmRlZmF1bHQ9eH0sNDI6ZnVuY3Rpb24oZSx0LG4pe1widXNlIHN0cmljdFwiO24ucih0KTtcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvcjtcbi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXG5MaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG5LSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVEXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cblxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL3ZhciByPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKHI9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKGUsdCl7ZS5fX3Byb3RvX189dH18fGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmKGVbbl09dFtuXSl9KShlLHQpfTt2YXIgaT1mdW5jdGlvbigpe3JldHVybihpPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPTEscj1hcmd1bWVudHMubGVuZ3RoO248cjtuKyspZm9yKHZhciBpIGluIHQ9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGkpJiYoZVtpXT10W2ldKTtyZXR1cm4gZX0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cbnZhciBvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT17fSksdGhpcy5hZGFwdGVyXz1lfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzdHJpbmdzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwibnVtYmVyc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt9LGV9KCkscz17TElTVF9JVEVNX0FDVElWQVRFRF9DTEFTUzpcIm1kYy1saXN0LWl0ZW0tLWFjdGl2YXRlZFwiLExJU1RfSVRFTV9DTEFTUzpcIm1kYy1saXN0LWl0ZW1cIixMSVNUX0lURU1fU0VMRUNURURfQ0xBU1M6XCJtZGMtbGlzdC1pdGVtLS1zZWxlY3RlZFwiLFJPT1Q6XCJtZGMtbGlzdFwifSxhPXtBQ1RJT05fRVZFTlQ6XCJNRENMaXN0OmFjdGlvblwiLEFSSUFfQ0hFQ0tFRDpcImFyaWEtY2hlY2tlZFwiLEFSSUFfQ0hFQ0tFRF9DSEVDS0JPWF9TRUxFQ1RPUjonW3JvbGU9XCJjaGVja2JveFwiXVthcmlhLWNoZWNrZWQ9XCJ0cnVlXCJdJyxBUklBX0NIRUNLRURfUkFESU9fU0VMRUNUT1I6J1tyb2xlPVwicmFkaW9cIl1bYXJpYS1jaGVja2VkPVwidHJ1ZVwiXScsQVJJQV9DVVJSRU5UOlwiYXJpYS1jdXJyZW50XCIsQVJJQV9PUklFTlRBVElPTjpcImFyaWEtb3JpZW50YXRpb25cIixBUklBX09SSUVOVEFUSU9OX0hPUklaT05UQUw6XCJob3Jpem9udGFsXCIsQVJJQV9ST0xFX0NIRUNLQk9YX1NFTEVDVE9SOidbcm9sZT1cImNoZWNrYm94XCJdJyxBUklBX1NFTEVDVEVEOlwiYXJpYS1zZWxlY3RlZFwiLENIRUNLQk9YX1JBRElPX1NFTEVDVE9SOidpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06bm90KDpkaXNhYmxlZCksIGlucHV0W3R5cGU9XCJyYWRpb1wiXTpub3QoOmRpc2FibGVkKScsQ0hFQ0tCT1hfU0VMRUNUT1I6J2lucHV0W3R5cGU9XCJjaGVja2JveFwiXTpub3QoOmRpc2FibGVkKScsQ0hJTERfRUxFTUVOVFNfVE9fVE9HR0xFX1RBQklOREVYOlwiXFxuICAgIC5cIitzLkxJU1RfSVRFTV9DTEFTUytcIiBidXR0b246bm90KDpkaXNhYmxlZCksXFxuICAgIC5cIitzLkxJU1RfSVRFTV9DTEFTUytcIiBhXFxuICBcIixFTkFCTEVEX0lURU1TX1NFTEVDVE9SOlwiLm1kYy1saXN0LWl0ZW06bm90KC5tZGMtbGlzdC1pdGVtLS1kaXNhYmxlZClcIixGT0NVU0FCTEVfQ0hJTERfRUxFTUVOVFM6XCJcXG4gICAgLlwiK3MuTElTVF9JVEVNX0NMQVNTK1wiIGJ1dHRvbjpub3QoOmRpc2FibGVkKSxcXG4gICAgLlwiK3MuTElTVF9JVEVNX0NMQVNTK1wiIGEsXFxuICAgIC5cIitzLkxJU1RfSVRFTV9DTEFTUysnIGlucHV0W3R5cGU9XCJyYWRpb1wiXTpub3QoOmRpc2FibGVkKSxcXG4gICAgLicrcy5MSVNUX0lURU1fQ0xBU1MrJyBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06bm90KDpkaXNhYmxlZClcXG4gICcsUkFESU9fU0VMRUNUT1I6J2lucHV0W3R5cGU9XCJyYWRpb1wiXTpub3QoOmRpc2FibGVkKSd9LGw9e1VOU0VUX0lOREVYOi0xfTtuLmQodCxcIk1EQ0xpc3RGb3VuZGF0aW9uXCIsZnVuY3Rpb24oKXtyZXR1cm4gdX0pO1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG52YXIgYz1bXCJpbnB1dFwiLFwiYnV0dG9uXCIsXCJ0ZXh0YXJlYVwiLFwic2VsZWN0XCJdO3ZhciB1PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobil7dmFyIHI9ZS5jYWxsKHRoaXMsaSh7fSx0LmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpcztyZXR1cm4gci53cmFwRm9jdXNfPSExLHIuaXNWZXJ0aWNhbF89ITAsci5pc1NpbmdsZVNlbGVjdGlvbkxpc3RfPSExLHIuc2VsZWN0ZWRJbmRleF89bC5VTlNFVF9JTkRFWCxyLmZvY3VzZWRJdGVtSW5kZXhfPWwuVU5TRVRfSU5ERVgsci51c2VBY3RpdmF0ZWRDbGFzc189ITEsci5hcmlhQ3VycmVudEF0dHJWYWx1ZV89bnVsbCxyLmlzQ2hlY2tib3hMaXN0Xz0hMSxyLmlzUmFkaW9MaXN0Xz0hMSxyfXJldHVybiBmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPWV9cihlLHQpLGUucHJvdG90eXBlPW51bGw9PT10P09iamVjdC5jcmVhdGUodCk6KG4ucHJvdG90eXBlPXQucHJvdG90eXBlLG5ldyBuKX0odCxlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcInN0cmluZ3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJjc3NDbGFzc2VzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwibnVtYmVyc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybnthZGRDbGFzc0ZvckVsZW1lbnRJbmRleDpmdW5jdGlvbigpe30sZm9jdXNJdGVtQXRJbmRleDpmdW5jdGlvbigpe30sZ2V0QXR0cmlidXRlRm9yRWxlbWVudEluZGV4OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGdldEZvY3VzZWRFbGVtZW50SW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sZ2V0TGlzdEl0ZW1Db3VudDpmdW5jdGlvbigpe3JldHVybiAwfSxoYXNDaGVja2JveEF0SW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saGFzUmFkaW9BdEluZGV4OmZ1bmN0aW9uKCl7cmV0dXJuITF9LGlzQ2hlY2tib3hDaGVja2VkQXRJbmRleDpmdW5jdGlvbigpe3JldHVybiExfSxpc0ZvY3VzSW5zaWRlTGlzdDpmdW5jdGlvbigpe3JldHVybiExfSxub3RpZnlBY3Rpb246ZnVuY3Rpb24oKXt9LHJlbW92ZUNsYXNzRm9yRWxlbWVudEluZGV4OmZ1bmN0aW9uKCl7fSxzZXRBdHRyaWJ1dGVGb3JFbGVtZW50SW5kZXg6ZnVuY3Rpb24oKXt9LHNldENoZWNrZWRDaGVja2JveE9yUmFkaW9BdEluZGV4OmZ1bmN0aW9uKCl7fSxzZXRUYWJJbmRleEZvckxpc3RJdGVtQ2hpbGRyZW46ZnVuY3Rpb24oKXt9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5sYXlvdXQ9ZnVuY3Rpb24oKXswIT09dGhpcy5hZGFwdGVyXy5nZXRMaXN0SXRlbUNvdW50KCkmJih0aGlzLmFkYXB0ZXJfLmhhc0NoZWNrYm94QXRJbmRleCgwKT90aGlzLmlzQ2hlY2tib3hMaXN0Xz0hMDp0aGlzLmFkYXB0ZXJfLmhhc1JhZGlvQXRJbmRleCgwKSYmKHRoaXMuaXNSYWRpb0xpc3RfPSEwKSl9LHQucHJvdG90eXBlLnNldFdyYXBGb2N1cz1mdW5jdGlvbihlKXt0aGlzLndyYXBGb2N1c189ZX0sdC5wcm90b3R5cGUuc2V0VmVydGljYWxPcmllbnRhdGlvbj1mdW5jdGlvbihlKXt0aGlzLmlzVmVydGljYWxfPWV9LHQucHJvdG90eXBlLnNldFNpbmdsZVNlbGVjdGlvbj1mdW5jdGlvbihlKXt0aGlzLmlzU2luZ2xlU2VsZWN0aW9uTGlzdF89ZX0sdC5wcm90b3R5cGUuc2V0VXNlQWN0aXZhdGVkQ2xhc3M9ZnVuY3Rpb24oZSl7dGhpcy51c2VBY3RpdmF0ZWRDbGFzc189ZX0sdC5wcm90b3R5cGUuZ2V0U2VsZWN0ZWRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGVkSW5kZXhffSx0LnByb3RvdHlwZS5zZXRTZWxlY3RlZEluZGV4PWZ1bmN0aW9uKGUpe3RoaXMuaXNJbmRleFZhbGlkXyhlKSYmKHRoaXMuaXNDaGVja2JveExpc3RfP3RoaXMuc2V0Q2hlY2tib3hBdEluZGV4XyhlKTp0aGlzLmlzUmFkaW9MaXN0Xz90aGlzLnNldFJhZGlvQXRJbmRleF8oZSk6dGhpcy5zZXRTaW5nbGVTZWxlY3Rpb25BdEluZGV4XyhlKSl9LHQucHJvdG90eXBlLmhhbmRsZUZvY3VzSW49ZnVuY3Rpb24oZSx0KXt0Pj0wJiZ0aGlzLmFkYXB0ZXJfLnNldFRhYkluZGV4Rm9yTGlzdEl0ZW1DaGlsZHJlbih0LFwiMFwiKX0sdC5wcm90b3R5cGUuaGFuZGxlRm9jdXNPdXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3Q+PTAmJnRoaXMuYWRhcHRlcl8uc2V0VGFiSW5kZXhGb3JMaXN0SXRlbUNoaWxkcmVuKHQsXCItMVwiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5hZGFwdGVyXy5pc0ZvY3VzSW5zaWRlTGlzdCgpfHxuLnNldFRhYmluZGV4VG9GaXJzdFNlbGVjdGVkSXRlbV8oKX0sMCl9LHQucHJvdG90eXBlLmhhbmRsZUtleWRvd249ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVwiQXJyb3dMZWZ0XCI9PT1lLmtleXx8Mzc9PT1lLmtleUNvZGUsaT1cIkFycm93VXBcIj09PWUua2V5fHwzOD09PWUua2V5Q29kZSxvPVwiQXJyb3dSaWdodFwiPT09ZS5rZXl8fDM5PT09ZS5rZXlDb2RlLHM9XCJBcnJvd0Rvd25cIj09PWUua2V5fHw0MD09PWUua2V5Q29kZSxhPVwiSG9tZVwiPT09ZS5rZXl8fDM2PT09ZS5rZXlDb2RlLGM9XCJFbmRcIj09PWUua2V5fHwzNT09PWUua2V5Q29kZSx1PVwiRW50ZXJcIj09PWUua2V5fHwxMz09PWUua2V5Q29kZSxkPVwiU3BhY2VcIj09PWUua2V5fHwzMj09PWUua2V5Q29kZSxmPXRoaXMuYWRhcHRlcl8uZ2V0Rm9jdXNlZEVsZW1lbnRJbmRleCgpLHA9bC5VTlNFVF9JTkRFWDtpZighKGY9PT1sLlVOU0VUX0lOREVYJiYoZj1uKTwwKSl7aWYodGhpcy5pc1ZlcnRpY2FsXyYmc3x8IXRoaXMuaXNWZXJ0aWNhbF8mJm8pdGhpcy5wcmV2ZW50RGVmYXVsdEV2ZW50XyhlKSxwPXRoaXMuZm9jdXNOZXh0RWxlbWVudChmKTtlbHNlIGlmKHRoaXMuaXNWZXJ0aWNhbF8mJml8fCF0aGlzLmlzVmVydGljYWxfJiZyKXRoaXMucHJldmVudERlZmF1bHRFdmVudF8oZSkscD10aGlzLmZvY3VzUHJldkVsZW1lbnQoZik7ZWxzZSBpZihhKXRoaXMucHJldmVudERlZmF1bHRFdmVudF8oZSkscD10aGlzLmZvY3VzRmlyc3RFbGVtZW50KCk7ZWxzZSBpZihjKXRoaXMucHJldmVudERlZmF1bHRFdmVudF8oZSkscD10aGlzLmZvY3VzTGFzdEVsZW1lbnQoKTtlbHNlIGlmKCh1fHxkKSYmdCl7dmFyIGg9ZS50YXJnZXQ7aWYoaCYmXCJBXCI9PT1oLnRhZ05hbWUmJnUpcmV0dXJuO3RoaXMucHJldmVudERlZmF1bHRFdmVudF8oZSksdGhpcy5pc1NlbGVjdGFibGVMaXN0XygpJiZ0aGlzLnNldFNlbGVjdGVkSW5kZXhPbkFjdGlvbl8oZiksdGhpcy5hZGFwdGVyXy5ub3RpZnlBY3Rpb24oZil9dGhpcy5mb2N1c2VkSXRlbUluZGV4Xz1mLHA+PTAmJih0aGlzLnNldFRhYmluZGV4QXRJbmRleF8ocCksdGhpcy5mb2N1c2VkSXRlbUluZGV4Xz1wKX19LHQucHJvdG90eXBlLmhhbmRsZUNsaWNrPWZ1bmN0aW9uKGUsdCl7ZSE9PWwuVU5TRVRfSU5ERVgmJih0aGlzLmlzU2VsZWN0YWJsZUxpc3RfKCkmJnRoaXMuc2V0U2VsZWN0ZWRJbmRleE9uQWN0aW9uXyhlLHQpLHRoaXMuYWRhcHRlcl8ubm90aWZ5QWN0aW9uKGUpLHRoaXMuc2V0VGFiaW5kZXhBdEluZGV4XyhlKSx0aGlzLmZvY3VzZWRJdGVtSW5kZXhfPWUpfSx0LnByb3RvdHlwZS5mb2N1c05leHRFbGVtZW50PWZ1bmN0aW9uKGUpe3ZhciB0PWUrMTtpZih0Pj10aGlzLmFkYXB0ZXJfLmdldExpc3RJdGVtQ291bnQoKSl7aWYoIXRoaXMud3JhcEZvY3VzXylyZXR1cm4gZTt0PTB9cmV0dXJuIHRoaXMuYWRhcHRlcl8uZm9jdXNJdGVtQXRJbmRleCh0KSx0fSx0LnByb3RvdHlwZS5mb2N1c1ByZXZFbGVtZW50PWZ1bmN0aW9uKGUpe3ZhciB0PWUtMTtpZih0PDApe2lmKCF0aGlzLndyYXBGb2N1c18pcmV0dXJuIGU7dD10aGlzLmFkYXB0ZXJfLmdldExpc3RJdGVtQ291bnQoKS0xfXJldHVybiB0aGlzLmFkYXB0ZXJfLmZvY3VzSXRlbUF0SW5kZXgodCksdH0sdC5wcm90b3R5cGUuZm9jdXNGaXJzdEVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZGFwdGVyXy5mb2N1c0l0ZW1BdEluZGV4KDApLDB9LHQucHJvdG90eXBlLmZvY3VzTGFzdEVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmFkYXB0ZXJfLmdldExpc3RJdGVtQ291bnQoKS0xO3JldHVybiB0aGlzLmFkYXB0ZXJfLmZvY3VzSXRlbUF0SW5kZXgoZSksZX0sdC5wcm90b3R5cGUucHJldmVudERlZmF1bHRFdmVudF89ZnVuY3Rpb24oZSl7dmFyIHQ9KFwiXCIrZS50YXJnZXQudGFnTmFtZSkudG9Mb3dlckNhc2UoKTstMT09PWMuaW5kZXhPZih0KSYmZS5wcmV2ZW50RGVmYXVsdCgpfSx0LnByb3RvdHlwZS5zZXRTaW5nbGVTZWxlY3Rpb25BdEluZGV4Xz1mdW5jdGlvbihlKXtpZih0aGlzLnNlbGVjdGVkSW5kZXhfIT09ZSl7dmFyIHQ9cy5MSVNUX0lURU1fU0VMRUNURURfQ0xBU1M7dGhpcy51c2VBY3RpdmF0ZWRDbGFzc18mJih0PXMuTElTVF9JVEVNX0FDVElWQVRFRF9DTEFTUyksdGhpcy5zZWxlY3RlZEluZGV4XyE9PWwuVU5TRVRfSU5ERVgmJnRoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3NGb3JFbGVtZW50SW5kZXgodGhpcy5zZWxlY3RlZEluZGV4Xyx0KSx0aGlzLmFkYXB0ZXJfLmFkZENsYXNzRm9yRWxlbWVudEluZGV4KGUsdCksdGhpcy5zZXRBcmlhRm9yU2luZ2xlU2VsZWN0aW9uQXRJbmRleF8oZSksdGhpcy5zZWxlY3RlZEluZGV4Xz1lfX0sdC5wcm90b3R5cGUuc2V0QXJpYUZvclNpbmdsZVNlbGVjdGlvbkF0SW5kZXhfPWZ1bmN0aW9uKGUpe3RoaXMuc2VsZWN0ZWRJbmRleF89PT1sLlVOU0VUX0lOREVYJiYodGhpcy5hcmlhQ3VycmVudEF0dHJWYWx1ZV89dGhpcy5hZGFwdGVyXy5nZXRBdHRyaWJ1dGVGb3JFbGVtZW50SW5kZXgoZSxhLkFSSUFfQ1VSUkVOVCkpO3ZhciB0PW51bGwhPT10aGlzLmFyaWFDdXJyZW50QXR0clZhbHVlXyxuPXQ/YS5BUklBX0NVUlJFTlQ6YS5BUklBX1NFTEVDVEVEO3RoaXMuc2VsZWN0ZWRJbmRleF8hPT1sLlVOU0VUX0lOREVYJiZ0aGlzLmFkYXB0ZXJfLnNldEF0dHJpYnV0ZUZvckVsZW1lbnRJbmRleCh0aGlzLnNlbGVjdGVkSW5kZXhfLG4sXCJmYWxzZVwiKTt2YXIgcj10P3RoaXMuYXJpYUN1cnJlbnRBdHRyVmFsdWVfOlwidHJ1ZVwiO3RoaXMuYWRhcHRlcl8uc2V0QXR0cmlidXRlRm9yRWxlbWVudEluZGV4KGUsbixyKX0sdC5wcm90b3R5cGUuc2V0UmFkaW9BdEluZGV4Xz1mdW5jdGlvbihlKXt0aGlzLmFkYXB0ZXJfLnNldENoZWNrZWRDaGVja2JveE9yUmFkaW9BdEluZGV4KGUsITApLHRoaXMuc2VsZWN0ZWRJbmRleF8hPT1sLlVOU0VUX0lOREVYJiZ0aGlzLmFkYXB0ZXJfLnNldEF0dHJpYnV0ZUZvckVsZW1lbnRJbmRleCh0aGlzLnNlbGVjdGVkSW5kZXhfLGEuQVJJQV9DSEVDS0VELFwiZmFsc2VcIiksdGhpcy5hZGFwdGVyXy5zZXRBdHRyaWJ1dGVGb3JFbGVtZW50SW5kZXgoZSxhLkFSSUFfQ0hFQ0tFRCxcInRydWVcIiksdGhpcy5zZWxlY3RlZEluZGV4Xz1lfSx0LnByb3RvdHlwZS5zZXRDaGVja2JveEF0SW5kZXhfPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8dGhpcy5hZGFwdGVyXy5nZXRMaXN0SXRlbUNvdW50KCk7dCsrKXt2YXIgbj0hMTtlLmluZGV4T2YodCk+PTAmJihuPSEwKSx0aGlzLmFkYXB0ZXJfLnNldENoZWNrZWRDaGVja2JveE9yUmFkaW9BdEluZGV4KHQsbiksdGhpcy5hZGFwdGVyXy5zZXRBdHRyaWJ1dGVGb3JFbGVtZW50SW5kZXgodCxhLkFSSUFfQ0hFQ0tFRCxuP1widHJ1ZVwiOlwiZmFsc2VcIil9dGhpcy5zZWxlY3RlZEluZGV4Xz1lfSx0LnByb3RvdHlwZS5zZXRUYWJpbmRleEF0SW5kZXhfPWZ1bmN0aW9uKGUpe3RoaXMuZm9jdXNlZEl0ZW1JbmRleF89PT1sLlVOU0VUX0lOREVYJiYwIT09ZT90aGlzLmFkYXB0ZXJfLnNldEF0dHJpYnV0ZUZvckVsZW1lbnRJbmRleCgwLFwidGFiaW5kZXhcIixcIi0xXCIpOnRoaXMuZm9jdXNlZEl0ZW1JbmRleF8+PTAmJnRoaXMuZm9jdXNlZEl0ZW1JbmRleF8hPT1lJiZ0aGlzLmFkYXB0ZXJfLnNldEF0dHJpYnV0ZUZvckVsZW1lbnRJbmRleCh0aGlzLmZvY3VzZWRJdGVtSW5kZXhfLFwidGFiaW5kZXhcIixcIi0xXCIpLHRoaXMuYWRhcHRlcl8uc2V0QXR0cmlidXRlRm9yRWxlbWVudEluZGV4KGUsXCJ0YWJpbmRleFwiLFwiMFwiKX0sdC5wcm90b3R5cGUuaXNTZWxlY3RhYmxlTGlzdF89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc1NpbmdsZVNlbGVjdGlvbkxpc3RffHx0aGlzLmlzQ2hlY2tib3hMaXN0X3x8dGhpcy5pc1JhZGlvTGlzdF99LHQucHJvdG90eXBlLnNldFRhYmluZGV4VG9GaXJzdFNlbGVjdGVkSXRlbV89ZnVuY3Rpb24oKXt2YXIgZT0wO3RoaXMuaXNTZWxlY3RhYmxlTGlzdF8oKSYmKFwibnVtYmVyXCI9PXR5cGVvZiB0aGlzLnNlbGVjdGVkSW5kZXhfJiZ0aGlzLnNlbGVjdGVkSW5kZXhfIT09bC5VTlNFVF9JTkRFWD9lPXRoaXMuc2VsZWN0ZWRJbmRleF86dGhpcy5zZWxlY3RlZEluZGV4XyBpbnN0YW5jZW9mIEFycmF5JiZ0aGlzLnNlbGVjdGVkSW5kZXhfLmxlbmd0aD4wJiYoZT10aGlzLnNlbGVjdGVkSW5kZXhfLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBNYXRoLm1pbihlLHQpfSkpKSx0aGlzLnNldFRhYmluZGV4QXRJbmRleF8oZSl9LHQucHJvdG90eXBlLmlzSW5kZXhWYWxpZF89ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZihlIGluc3RhbmNlb2YgQXJyYXkpe2lmKCF0aGlzLmlzQ2hlY2tib3hMaXN0Xyl0aHJvdyBuZXcgRXJyb3IoXCJNRENMaXN0Rm91bmRhdGlvbjogQXJyYXkgb2YgaW5kZXggaXMgb25seSBzdXBwb3J0ZWQgZm9yIGNoZWNrYm94IGJhc2VkIGxpc3RcIik7cmV0dXJuIDA9PT1lLmxlbmd0aHx8ZS5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiB0LmlzSW5kZXhJblJhbmdlXyhlKX0pfWlmKFwibnVtYmVyXCI9PXR5cGVvZiBlKXtpZih0aGlzLmlzQ2hlY2tib3hMaXN0Xyl0aHJvdyBuZXcgRXJyb3IoXCJNRENMaXN0Rm91bmRhdGlvbjogRXhwZWN0ZWQgYXJyYXkgb2YgaW5kZXggZm9yIGNoZWNrYm94IGJhc2VkIGxpc3QgYnV0IGdvdCBudW1iZXI6IFwiK2UpO3JldHVybiB0aGlzLmlzSW5kZXhJblJhbmdlXyhlKX1yZXR1cm4hMX0sdC5wcm90b3R5cGUuaXNJbmRleEluUmFuZ2VfPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuYWRhcHRlcl8uZ2V0TGlzdEl0ZW1Db3VudCgpO3JldHVybiBlPj0wJiZlPHR9LHQucHJvdG90eXBlLnNldFNlbGVjdGVkSW5kZXhPbkFjdGlvbl89ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT10JiYodD0hMCksdGhpcy5pc0NoZWNrYm94TGlzdF8/dGhpcy50b2dnbGVDaGVja2JveEF0SW5kZXhfKGUsdCk6dGhpcy5zZXRTZWxlY3RlZEluZGV4KGUpfSx0LnByb3RvdHlwZS50b2dnbGVDaGVja2JveEF0SW5kZXhfPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5hZGFwdGVyXy5pc0NoZWNrYm94Q2hlY2tlZEF0SW5kZXgoZSk7dCYmKG49IW4sdGhpcy5hZGFwdGVyXy5zZXRDaGVja2VkQ2hlY2tib3hPclJhZGlvQXRJbmRleChlLG4pKSx0aGlzLmFkYXB0ZXJfLnNldEF0dHJpYnV0ZUZvckVsZW1lbnRJbmRleChlLGEuQVJJQV9DSEVDS0VELG4/XCJ0cnVlXCI6XCJmYWxzZVwiKTt2YXIgcj10aGlzLnNlbGVjdGVkSW5kZXhfPT09bC5VTlNFVF9JTkRFWD9bXTp0aGlzLnNlbGVjdGVkSW5kZXhfLnNsaWNlKCk7bj9yLnB1c2goZSk6cj1yLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdCE9PWV9KSx0aGlzLnNlbGVjdGVkSW5kZXhfPXJ9LHR9KG8pO3QuZGVmYXVsdD11fSw1OmZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPW59LDg4OmZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiByKGUsdCl7aWYoZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZihlW25dIT09dFtuXSlyZXR1cm4hMTtyZXR1cm4hMH1lLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbjt2b2lkIDA9PT10JiYodD1yKTt2YXIgaSxvPVtdLHM9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciByPWFyZ3VtZW50cy5sZW5ndGgsYT1uZXcgQXJyYXkociksbD0wO2w8cjtsKyspYVtsXT1hcmd1bWVudHNbbF07cmV0dXJuIHMmJm49PT10aGlzJiZ0KGEsbyk/aTooaT1lLmFwcGx5KHRoaXMsYSkscz0hMCxuPXRoaXMsbz1hLGkpfX19LDg5OmZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcixpPXRoaXMmJnRoaXMuX19leHRlbmRzfHwocj1mdW5jdGlvbihlLHQpe3JldHVybihyPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihlLHQpe2UuX19wcm90b19fPXR9fHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJihlW25dPXRbbl0pfSkoZSx0KX0sZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfXIoZSx0KSxlLnByb3RvdHlwZT1udWxsPT09dD9PYmplY3QuY3JlYXRlKHQpOihuLnByb3RvdHlwZT10LnByb3RvdHlwZSxuZXcgbil9KSxvPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKG89T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rKylmb3IodmFyIGkgaW4gdD1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsaSkmJihlW2ldPXRbaV0pO3JldHVybiBlfSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxzPXRoaXMmJnRoaXMuX19yZXN0fHxmdW5jdGlvbihlLHQpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiZ0LmluZGV4T2Yocik8MCYmKG5bcl09ZVtyXSk7aWYobnVsbCE9ZSYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGk9MDtmb3Iocj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO2k8ci5sZW5ndGg7aSsrKXQuaW5kZXhPZihyW2ldKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyW2ldKSYmKG5bcltpXV09ZVtyW2ldXSl9cmV0dXJuIG59LGE9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIGw9YShuKDApKSxjPWEobigxKSksdT1uKDkwKSxkPW4oNSksZj1uKDQyKSxwPW4oNDEpLGg9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3ZhciB0PW51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gdC5saXN0SXRlbUVsZW1lbnQ9bC5kZWZhdWx0LmNyZWF0ZVJlZigpLHQuc3RhdGU9e3RhYkluZGV4OnQucHJvcHMudGFiSW5kZXh9LHQuaW5pdGlhbGl6ZVRhYkluZGV4PWZ1bmN0aW9uKCl7aWYodC5saXN0SXRlbUVsZW1lbnQuY3VycmVudCl7dmFyIGU9dC5nZXRJbmRleCh0Lmxpc3RJdGVtRWxlbWVudC5jdXJyZW50KSxuPXQucHJvcHMuZ2V0TGlzdEl0ZW1Jbml0aWFsVGFiSW5kZXgoZSk7dC5zZXRTdGF0ZSh7dGFiSW5kZXg6bn0pfX0sdC5nZXRJbmRleD1mdW5jdGlvbihlKXtyZXR1cm4gdC5saXN0RWxlbWVudHMuaW5kZXhPZihlKX0sdC5oYW5kbGVDbGljaz1mdW5jdGlvbihlKXsoMCx0LnByb3BzLm9uQ2xpY2spKGUpLHQucHJvcHMuaGFuZGxlQ2xpY2soZSx0LmdldEluZGV4KGUuY3VycmVudFRhcmdldCkpfSx0LmhhbmRsZUtleURvd249ZnVuY3Rpb24oZSl7KDAsdC5wcm9wcy5vbktleURvd24pKGUpLHQucHJvcHMuaGFuZGxlS2V5RG93bihlLHQuZ2V0SW5kZXgoZS5jdXJyZW50VGFyZ2V0KSl9LHQuaGFuZGxlRm9jdXM9ZnVuY3Rpb24oZSl7KDAsdC5wcm9wcy5vbkZvY3VzKShlKSx0LnByb3BzLmhhbmRsZUZvY3VzKGUsdC5nZXRJbmRleChlLmN1cnJlbnRUYXJnZXQpKX0sdC5oYW5kbGVCbHVyPWZ1bmN0aW9uKGUpeygwLHQucHJvcHMub25CbHVyKShlKSx0LnByb3BzLmhhbmRsZUJsdXIoZSx0LmdldEluZGV4KGUuY3VycmVudFRhcmdldCkpfSx0fXJldHVybiBpKHQsZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwibGlzdEVsZW1lbnRzXCIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMubGlzdEl0ZW1FbGVtZW50LmN1cnJlbnQpe3ZhciBlPXUuY2xvc2VzdCh0aGlzLmxpc3RJdGVtRWxlbWVudC5jdXJyZW50LFwiLlwiK2YuTURDTGlzdEZvdW5kYXRpb24uY3NzQ2xhc3Nlcy5ST09UKTtyZXR1cm4gZT9bXS5zbGljZS5jYWxsKGUucXVlcnlTZWxlY3RvckFsbChmLk1EQ0xpc3RGb3VuZGF0aW9uLnN0cmluZ3MuRU5BQkxFRF9JVEVNU19TRUxFQ1RPUikpOltdfXJldHVybltdfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dGhpcy5pbml0aWFsaXplVGFiSW5kZXgoKSx0aGlzLnByb3BzLmluaXRSaXBwbGUmJnRoaXMucHJvcHMuaW5pdFJpcHBsZSh0aGlzLmxpc3RJdGVtRWxlbWVudC5jdXJyZW50KX0sdC5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPWZ1bmN0aW9uKGUpe2UudGFiSW5kZXghPT10aGlzLnByb3BzLnRhYkluZGV4JiZ0aGlzLnNldFN0YXRlKHt0YWJJbmRleDp0aGlzLnByb3BzLnRhYkluZGV4fSl9LHQucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7aWYodGhpcy5saXN0SXRlbUVsZW1lbnQuY3VycmVudCl7dmFyIGU9dGhpcy5nZXRJbmRleCh0aGlzLmxpc3RJdGVtRWxlbWVudC5jdXJyZW50KTt0aGlzLnByb3BzLm9uRGVzdHJveShlKX19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcImNsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLnByb3BzLG49dC5jbGFzc05hbWUscj10LmFjdGl2YXRlZCxpPXQuZGlzYWJsZWQsbz10LnNlbGVjdGVkLHM9dC5nZXRDbGFzc05hbWVzRnJvbUxpc3QsYT1bXCJcIl07aWYodGhpcy5saXN0SXRlbUVsZW1lbnQuY3VycmVudCl7dmFyIGw9dGhpcy5nZXRJbmRleCh0aGlzLmxpc3RJdGVtRWxlbWVudC5jdXJyZW50KTthPXMoKVtsXX1yZXR1cm4gYy5kZWZhdWx0KFwibWRjLWxpc3QtaXRlbVwiLG4sYSwoKGU9e30pW2YuTURDTGlzdEZvdW5kYXRpb24uY3NzQ2xhc3Nlcy5MSVNUX0lURU1fQUNUSVZBVEVEX0NMQVNTXT1yLGVbZi5NRENMaXN0Rm91bmRhdGlvbi5jc3NDbGFzc2VzLkxJU1RfSVRFTV9TRUxFQ1RFRF9DTEFTU109byxlW1wibWRjLWxpc3QtaXRlbS0tZGlzYWJsZWRcIl09aSxlKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLFwicm9sZVwiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHQ9ZS5jaGVja2JveExpc3Qsbj1lLnJhZGlvTGlzdCxyPWUucm9sZTtyZXR1cm4gcnx8KHQ/XCJjaGVja2JveFwiOm4/XCJyYWRpb1wiOm51bGwpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD0oZS5jbGFzc05hbWUsZS5jaGlsZHJlbiksbj0oZS5yb2xlLGUuaW5pdFJpcHBsZSxlLmNoZWNrYm94TGlzdCxlLnJhZGlvTGlzdCxlLm9uRGVzdHJveSxlLm9uQ2xpY2ssZS5vbktleURvd24sZS5vbkZvY3VzLGUub25CbHVyLGUuaGFuZGxlQ2xpY2ssZS5oYW5kbGVLZXlEb3duLGUuaGFuZGxlRm9jdXMsZS5oYW5kbGVCbHVyLGUuZ2V0TGlzdEl0ZW1Jbml0aWFsVGFiSW5kZXgsZS5nZXRDbGFzc05hbWVzRnJvbUxpc3QsZS50YWJJbmRleCxlLnRhZykscj1zKGUsW1wiY2xhc3NOYW1lXCIsXCJjaGlsZHJlblwiLFwicm9sZVwiLFwiaW5pdFJpcHBsZVwiLFwiY2hlY2tib3hMaXN0XCIsXCJyYWRpb0xpc3RcIixcIm9uRGVzdHJveVwiLFwib25DbGlja1wiLFwib25LZXlEb3duXCIsXCJvbkZvY3VzXCIsXCJvbkJsdXJcIixcImhhbmRsZUNsaWNrXCIsXCJoYW5kbGVLZXlEb3duXCIsXCJoYW5kbGVGb2N1c1wiLFwiaGFuZGxlQmx1clwiLFwiZ2V0TGlzdEl0ZW1Jbml0aWFsVGFiSW5kZXhcIixcImdldENsYXNzTmFtZXNGcm9tTGlzdFwiLFwidGFiSW5kZXhcIixcInRhZ1wiXSk7cmV0dXJuIGwuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG4sbyh7fSxyLHRoaXMuY29udGV4dCx7cm9sZTp0aGlzLnJvbGUsY2xhc3NOYW1lOnRoaXMuY2xhc3NlcyxyZWY6dGhpcy5saXN0SXRlbUVsZW1lbnQsb25DbGljazp0aGlzLmhhbmRsZUNsaWNrLG9uS2V5RG93bjp0aGlzLmhhbmRsZUtleURvd24sb25Gb2N1czp0aGlzLmhhbmRsZUZvY3VzLG9uQmx1cjp0aGlzLmhhbmRsZUJsdXIsdGFiSW5kZXg6dGhpcy5zdGF0ZS50YWJJbmRleH0pLHQpfSx0LmRlZmF1bHRQcm9wcz17Y2hlY2tib3hMaXN0OiExLHJhZGlvTGlzdDohMSxjbGFzc05hbWU6XCJcIix0YWJJbmRleDotMSxvbktleURvd246ZnVuY3Rpb24oKXt9LG9uQ2xpY2s6ZnVuY3Rpb24oKXt9LG9uRm9jdXM6ZnVuY3Rpb24oKXt9LG9uQmx1cjpmdW5jdGlvbigpe30sb25EZXN0cm95OmZ1bmN0aW9uKCl7fSx0YWc6XCJsaVwiLGhhbmRsZUNsaWNrOmZ1bmN0aW9uKCl7fSxoYW5kbGVLZXlEb3duOmZ1bmN0aW9uKCl7fSxoYW5kbGVCbHVyOmZ1bmN0aW9uKCl7fSxoYW5kbGVGb2N1czpmdW5jdGlvbigpe30sZ2V0TGlzdEl0ZW1Jbml0aWFsVGFiSW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4tMX0sZ2V0Q2xhc3NOYW1lc0Zyb21MaXN0OmZ1bmN0aW9uKCl7cmV0dXJue319fSx0fShsLmRlZmF1bHQuQ29tcG9uZW50KTt0Lkxpc3RJdGVtQmFzZT1oO3QuZGVmYXVsdD1kLndpdGhSaXBwbGUoZnVuY3Rpb24oZSl7cmV0dXJuIGwuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHAuTGlzdEl0ZW1Db250ZXh0LkNvbnN1bWVyLG51bGwsZnVuY3Rpb24odCl7cmV0dXJuIGwuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGgsbyh7fSx0LGUpKX0pfSl9LDkwOmZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xuZnVuY3Rpb24gcihlLHQpe2lmKGUuY2xvc2VzdClyZXR1cm4gZS5jbG9zZXN0KHQpO2Zvcih2YXIgbj1lO247KXtpZihpKG4sdCkpcmV0dXJuIG47bj1uLnBhcmVudEVsZW1lbnR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gaShlLHQpe3JldHVybihlLm1hdGNoZXN8fGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxlLm1zTWF0Y2hlc1NlbGVjdG9yKS5jYWxsKGUsdCl9bi5yKHQpLG4uZCh0LFwiY2xvc2VzdFwiLGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KSxuLmQodCxcIm1hdGNoZXNcIixmdW5jdGlvbigpe3JldHVybiBpfSl9LDkxOmZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPTEscj1hcmd1bWVudHMubGVuZ3RoO248cjtuKyspZm9yKHZhciBpIGluIHQ9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGkpJiYoZVtpXT10W2ldKTtyZXR1cm4gZX0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0saT10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtmb3IodmFyIHIgaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmdC5pbmRleE9mKHIpPDAmJihuW3JdPWVbcl0pO2lmKG51bGwhPWUmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBpPTA7Zm9yKHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtpPHIubGVuZ3RoO2krKyl0LmluZGV4T2YocltpXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUscltpXSkmJihuW3JbaV1dPWVbcltpXV0pfXJldHVybiBufSxvPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBzPW8obigwKSksYT1vKG4oMSkpO3QuZGVmYXVsdD1mdW5jdGlvbihlKXt2YXIgdD1lLnRhYkluZGV4LG49dm9pZCAwPT09dD8tMTp0LG89ZS5ncmFwaGljLGw9ZS5jbGFzc05hbWUsYz12b2lkIDA9PT1sP1wiXCI6bCx1PWkoZSxbXCJ0YWJJbmRleFwiLFwiZ3JhcGhpY1wiLFwiY2xhc3NOYW1lXCJdKSxkPXIoe2NsYXNzTmFtZTphLmRlZmF1bHQoXCJtZGMtbGlzdC1pdGVtX19ncmFwaGljXCIsYyksdGFiSW5kZXg6dm9pZCAwIT09bj9uOi0xfSx1KTtyZXR1cm4gcy5kZWZhdWx0LmNsb25lRWxlbWVudChvLGQpfX0sOTI6ZnVuY3Rpb24oZSx0LG4pe1widXNlIHN0cmljdFwiO3ZhciByPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKHI9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rKylmb3IodmFyIGkgaW4gdD1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsaSkmJihlW2ldPXRbaV0pO3JldHVybiBlfSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxpPXRoaXMmJnRoaXMuX19yZXN0fHxmdW5jdGlvbihlLHQpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiZ0LmluZGV4T2Yocik8MCYmKG5bcl09ZVtyXSk7aWYobnVsbCE9ZSYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGk9MDtmb3Iocj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO2k8ci5sZW5ndGg7aSsrKXQuaW5kZXhPZihyW2ldKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyW2ldKSYmKG5bcltpXV09ZVtyW2ldXSl9cmV0dXJuIG59LG89dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIHM9byhuKDApKSxhPW8obigxKSk7dC5kZWZhdWx0PWZ1bmN0aW9uKGUpe3ZhciB0PWUucHJpbWFyeVRleHQsbj12b2lkIDA9PT10P1wiXCI6dCxvPWUuc2Vjb25kYXJ5VGV4dCxsPXZvaWQgMD09PW8/XCJcIjpvLGM9ZS50YWJJbmRleCx1PXZvaWQgMD09PWM/LTE6YyxkPWUuY2xhc3NOYW1lLGY9dm9pZCAwPT09ZD9cIlwiOmQscD1pKGUsW1wicHJpbWFyeVRleHRcIixcInNlY29uZGFyeVRleHRcIixcInRhYkluZGV4XCIsXCJjbGFzc05hbWVcIl0pLGg9ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDA9PT1lKXJldHVybiBudWxsO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlfHxcIm51bWJlclwiPT10eXBlb2YgZSlyZXR1cm4gcy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse2NsYXNzTmFtZTp0LHRhYkluZGV4OnZvaWQgMCE9PXU/dTotMX0sZSk7aWYobnVsbD09PShuPWUpfHx2b2lkIDA9PT1uLnByb3BzKXJldHVybiBudWxsO3ZhciBuLG89ZS5wcm9wcyxsPW8uY2xhc3NOYW1lLGM9aShvLFtcImNsYXNzTmFtZVwiXSk7dD1hLmRlZmF1bHQodCxsKTt2YXIgZD1yKHt9LGMse2NsYXNzTmFtZTp0fSk7cmV0dXJuIHMuZGVmYXVsdC5jbG9uZUVsZW1lbnQoZSxkKX07cmV0dXJuIGw/cy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIscih7Y2xhc3NOYW1lOmEuZGVmYXVsdChcIm1kYy1saXN0LWl0ZW1fX3RleHRcIixmKSx0YWJJbmRleDp2b2lkIDAhPT11P3U6LTF9LHApLGgobixcIm1kYy1saXN0LWl0ZW1fX3ByaW1hcnktdGV4dFwiKSxoKGwsXCJtZGMtbGlzdC1pdGVtX19zZWNvbmRhcnktdGV4dFwiKSk6aChuLGEuZGVmYXVsdChcIm1kYy1saXN0LWl0ZW1fX3RleHRcIixmKSl9fSw5MzpmdW5jdGlvbihlLHQsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9dGhpcyYmdGhpcy5fX2Fzc2lnbnx8ZnVuY3Rpb24oKXtyZXR1cm4ocj1PYmplY3QuYXNzaWdufHxmdW5jdGlvbihlKXtmb3IodmFyIHQsbj0xLHI9YXJndW1lbnRzLmxlbmd0aDtuPHI7bisrKWZvcih2YXIgaSBpbiB0PWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKSYmKGVbaV09dFtpXSk7cmV0dXJuIGV9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGk9dGhpcyYmdGhpcy5fX3Jlc3R8fGZ1bmN0aW9uKGUsdCl7dmFyIG49e307Zm9yKHZhciByIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJnQuaW5kZXhPZihyKTwwJiYobltyXT1lW3JdKTtpZihudWxsIT1lJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgaT0wO2ZvcihyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7aTxyLmxlbmd0aDtpKyspdC5pbmRleE9mKHJbaV0pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLHJbaV0pJiYobltyW2ldXT1lW3JbaV1dKX1yZXR1cm4gbn0sbz10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgcz1vKG4oMCkpLGE9byhuKDEpKTt0LmRlZmF1bHQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLnRhYkluZGV4LG89ZS5tZXRhLGw9ZS5jbGFzc05hbWUsYz12b2lkIDA9PT1sP1wiXCI6bCx1PWkoZSxbXCJ0YWJJbmRleFwiLFwibWV0YVwiLFwiY2xhc3NOYW1lXCJdKTt0PVwic3RyaW5nXCI9PXR5cGVvZiBvP3MuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLG51bGwsbyk6bzt2YXIgZD1yKHtjbGFzc05hbWU6YS5kZWZhdWx0KFwibWRjLWxpc3QtaXRlbV9fbWV0YVwiLGMsdC5wcm9wcy5jbGFzc05hbWUpLHRhYkluZGV4OnZvaWQgMCE9PW4/bjotMX0sdSk7cmV0dXJuIHMuZGVmYXVsdC5jbG9uZUVsZW1lbnQodCxkKX19LDk0OmZ1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPTEscj1hcmd1bWVudHMubGVuZ3RoO248cjtuKyspZm9yKHZhciBpIGluIHQ9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGkpJiYoZVtpXT10W2ldKTtyZXR1cm4gZX0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0saT10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtmb3IodmFyIHIgaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmdC5pbmRleE9mKHIpPDAmJihuW3JdPWVbcl0pO2lmKG51bGwhPWUmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBpPTA7Zm9yKHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtpPHIubGVuZ3RoO2krKyl0LmluZGV4T2YocltpXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUscltpXSkmJihuW3JbaV1dPWVbcltpXV0pfXJldHVybiBufSxvPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBzPW8obigwKSksYT1vKG4oMSkpO3QuZGVmYXVsdD1mdW5jdGlvbihlKXt2YXIgdD1lLnRhZyxuPXZvaWQgMD09PXQ/XCJsaVwiOnQsbz1lLmNsYXNzTmFtZSxsPXZvaWQgMD09PW8/XCJcIjpvLGM9ZS5yb2xlLHU9dm9pZCAwPT09Yz9cInNlcGFyYXRvclwiOmMsZD1pKGUsW1widGFnXCIsXCJjbGFzc05hbWVcIixcInJvbGVcIl0pO3JldHVybiBzLmRlZmF1bHQuY3JlYXRlRWxlbWVudChuLHIoe2NsYXNzTmFtZTphLmRlZmF1bHQoXCJtZGMtbGlzdC1kaXZpZGVyXCIsbCkscm9sZTp1fSxkKSl9fSw5NTpmdW5jdGlvbihlLHQsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9dGhpcyYmdGhpcy5fX2Fzc2lnbnx8ZnVuY3Rpb24oKXtyZXR1cm4ocj1PYmplY3QuYXNzaWdufHxmdW5jdGlvbihlKXtmb3IodmFyIHQsbj0xLHI9YXJndW1lbnRzLmxlbmd0aDtuPHI7bisrKWZvcih2YXIgaSBpbiB0PWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKSYmKGVbaV09dFtpXSk7cmV0dXJuIGV9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGk9dGhpcyYmdGhpcy5fX3Jlc3R8fGZ1bmN0aW9uKGUsdCl7dmFyIG49e307Zm9yKHZhciByIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJnQuaW5kZXhPZihyKTwwJiYobltyXT1lW3JdKTtpZihudWxsIT1lJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgaT0wO2ZvcihyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7aTxyLmxlbmd0aDtpKyspdC5pbmRleE9mKHJbaV0pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLHJbaV0pJiYobltyW2ldXT1lW3JbaV1dKX1yZXR1cm4gbn0sbz10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgcz1vKG4oMCkpLGE9byhuKDEpKTt0LmRlZmF1bHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YWcsbj12b2lkIDA9PT10P1wiZGl2XCI6dCxvPWUuY2xhc3NOYW1lLGw9dm9pZCAwPT09bz9cIlwiOm8sYz1lLmNoaWxkcmVuLHU9aShlLFtcInRhZ1wiLFwiY2xhc3NOYW1lXCIsXCJjaGlsZHJlblwiXSk7cmV0dXJuIHMuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG4scih7Y2xhc3NOYW1lOmEuZGVmYXVsdChcIm1kYy1saXN0LWdyb3VwXCIsbCl9LHUpLGMpfX0sOTY6ZnVuY3Rpb24oZSx0LG4pe1widXNlIHN0cmljdFwiO3ZhciByPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKHI9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rKylmb3IodmFyIGkgaW4gdD1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsaSkmJihlW2ldPXRbaV0pO3JldHVybiBlfSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxpPXRoaXMmJnRoaXMuX19yZXN0fHxmdW5jdGlvbihlLHQpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiZ0LmluZGV4T2Yocik8MCYmKG5bcl09ZVtyXSk7aWYobnVsbCE9ZSYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGk9MDtmb3Iocj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO2k8ci5sZW5ndGg7aSsrKXQuaW5kZXhPZihyW2ldKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyW2ldKSYmKG5bcltpXV09ZVtyW2ldXSl9cmV0dXJuIG59LG89dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIHM9byhuKDApKSxhPW8obigxKSk7dC5kZWZhdWx0PWZ1bmN0aW9uKGUpe3ZhciB0PWUudGFnLG49dm9pZCAwPT09dD9cImgzXCI6dCxvPWUuY2xhc3NOYW1lLGw9dm9pZCAwPT09bz9cIlwiOm8sYz1lLmNoaWxkcmVuLHU9aShlLFtcInRhZ1wiLFwiY2xhc3NOYW1lXCIsXCJjaGlsZHJlblwiXSk7cmV0dXJuIHMuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG4scih7Y2xhc3NOYW1lOmEuZGVmYXVsdChcIm1kYy1saXN0LWdyb3VwX19zdWJoZWFkZXJcIixsKX0sdSksYyl9fX0pfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saXN0LmpzLm1hcCIsIiFmdW5jdGlvbih0LGUpe2lmKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPWUocmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpLHJlcXVpcmUoXCJyZWFjdC1kb21cIikpO2Vsc2UgaWYoXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXCJyZWFjdFwiLFwiY2xhc3NuYW1lc1wiLFwicmVhY3QtZG9tXCJdLGUpO2Vsc2V7dmFyIG49XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZShyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcImNsYXNzbmFtZXNcIikscmVxdWlyZShcInJlYWN0LWRvbVwiKSk6ZSh0LnJlYWN0LHQuY2xhc3NuYW1lcyx0W1wicmVhY3QtZG9tXCJdKTtmb3IodmFyIG8gaW4gbikoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czp0KVtvXT1uW29dfX0oXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9e307ZnVuY3Rpb24gbihvKXtpZihlW29dKXJldHVybiBlW29dLmV4cG9ydHM7dmFyIGk9ZVtvXT17aTpvLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIHRbb10uY2FsbChpLmV4cG9ydHMsaSxpLmV4cG9ydHMsbiksaS5sPSEwLGkuZXhwb3J0c31yZXR1cm4gbi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxvKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6b30pfSxuLnI9ZnVuY3Rpb24odCl7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOlwiTW9kdWxlXCJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiZcIm9iamVjdFwiPT10eXBlb2YgdCYmdCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBvPU9iamVjdC5jcmVhdGUobnVsbCk7aWYobi5yKG8pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLFwiZGVmYXVsdFwiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KSwyJmUmJlwic3RyaW5nXCIhPXR5cGVvZiB0KWZvcih2YXIgaSBpbiB0KW4uZChvLGksZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxpKSk7cmV0dXJuIG99LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsXCJhXCIsZSksZX0sbi5vPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfSxuLnA9XCJcIixuKG4ucz0xMDIpfSh7MDpmdW5jdGlvbihlLG4pe2UuZXhwb3J0cz10fSwxOmZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWV9LDEwMjpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG8saT10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KG89ZnVuY3Rpb24odCxlKXtyZXR1cm4obz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1vKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSkscj10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsbz1hcmd1bWVudHMubGVuZ3RoO248bztuKyspZm9yKHZhciBpIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLGkpJiYodFtpXT1lW2ldKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scz10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIG8gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxvKSYmZS5pbmRleE9mKG8pPDAmJihuW29dPXRbb10pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBpPTA7Zm9yKG89T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtpPG8ubGVuZ3RoO2krKyllLmluZGV4T2Yob1tpXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsb1tpXSkmJihuW29baV1dPXRbb1tpXV0pfXJldHVybiBufSx1PXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBhPXUobigwKSksYz11KG4oMTAzKSksbD11KG4oMSkpLGY9bigxNiksaD1uKDE1OSk7ZS5Db3JuZXI9aC5Db3JuZXI7dmFyIGQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5tZW51U3VyZmFjZUVsZW1lbnQ9YS5kZWZhdWx0LmNyZWF0ZVJlZigpLGUucHJldmlvdXNGb2N1cz1udWxsLGUuZmlyc3RGb2N1c2FibGVFbGVtZW50PW51bGwsZS5sYXN0Rm9jdXNhYmxlRWxlbWVudD1udWxsLGUuc3RhdGU9e3RyYW5zZm9ybU9yaWdpbjpcIlwiLG1heEhlaWdodDp2b2lkIDAsc3R5bGVMZWZ0OnZvaWQgMCxzdHlsZVJpZ2h0OnZvaWQgMCxzdHlsZVRvcDp2b2lkIDAsc3R5bGVCb3R0b206dm9pZCAwLGNsYXNzTGlzdDpuZXcgU2V0LG1vdW50ZWQ6ITF9LGUub3Blbl89ZnVuY3Rpb24oKXtpZihlLnByb3BzLm9wZW4pe2lmKCFlLm1lbnVTdXJmYWNlRWxlbWVudC5jdXJyZW50KXJldHVybjt2YXIgdD1lLm1lbnVTdXJmYWNlRWxlbWVudC5jdXJyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZi5NRENNZW51U3VyZmFjZUZvdW5kYXRpb24uc3RyaW5ncy5GT0NVU0FCTEVfRUxFTUVOVFMpO2UuZmlyc3RGb2N1c2FibGVFbGVtZW50PXQubGVuZ3RoPjA/dFswXTpudWxsLGUubGFzdEZvY3VzYWJsZUVsZW1lbnQ9dC5sZW5ndGg+MD90W3QubGVuZ3RoLTFdOm51bGwsZS5mb3VuZGF0aW9uLm9wZW4oKX1lbHNlIGUuZm91bmRhdGlvbi5jbG9zZSgpfSxlLmhhbmRsZUtleWRvd249ZnVuY3Rpb24odCl7ZS5wcm9wcy5vbktleURvd24odCksZS5mb3VuZGF0aW9uLmhhbmRsZUtleWRvd24odC5uYXRpdmVFdmVudCl9LGUuaGFuZGxlT3Blbj1mdW5jdGlvbigpe2UucmVnaXN0ZXJXaW5kb3dDbGlja0xpc3RlbmVyJiZlLnJlZ2lzdGVyV2luZG93Q2xpY2tMaXN0ZW5lcigpfSxlLmhhbmRsZUNsb3NlPWZ1bmN0aW9uKCl7ZS5kZXJlZ2lzdGVyV2luZG93Q2xpY2tMaXN0ZW5lciYmZS5kZXJlZ2lzdGVyV2luZG93Q2xpY2tMaXN0ZW5lcigpfSxlfXJldHVybiBpKGUsdCksZS5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5wcm9wcyxuPWUuYW5jaG9yQ29ybmVyLG89ZS5hbmNob3JNYXJnaW4saT1lLmNvb3JkaW5hdGVzLHI9ZS5maXhlZCxzPWUucXVpY2tPcGVuO3RoaXMuaGFuZGxlV2luZG93Q2xpY2s9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuZm91bmRhdGlvbi5oYW5kbGVCb2R5Q2xpY2soZSl9LHRoaXMucmVnaXN0ZXJXaW5kb3dDbGlja0xpc3RlbmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIix0LmhhbmRsZVdpbmRvd0NsaWNrKX0sdGhpcy5kZXJlZ2lzdGVyV2luZG93Q2xpY2tMaXN0ZW5lcj1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsdC5oYW5kbGVXaW5kb3dDbGljayl9LHRoaXMuZm91bmRhdGlvbj1uZXcgZi5NRENNZW51U3VyZmFjZUZvdW5kYXRpb24odGhpcy5hZGFwdGVyKSx0aGlzLmZvdW5kYXRpb24uaW5pdCgpLHRoaXMuZm91bmRhdGlvbi5zZXRJc0hvaXN0ZWQoITApLHRoaXMuZm91bmRhdGlvbi5zZXRGaXhlZFBvc2l0aW9uKHIpLGkmJnRoaXMuc2V0Q29vcmRpbmF0ZXMoKSxuJiZ0aGlzLmZvdW5kYXRpb24uc2V0QW5jaG9yQ29ybmVyKG4pLG8mJnRoaXMuZm91bmRhdGlvbi5zZXRBbmNob3JNYXJnaW4obykscyYmdGhpcy5mb3VuZGF0aW9uLnNldFF1aWNrT3BlbihzKSx0aGlzLnNldFN0YXRlKHttb3VudGVkOiEwfSl9LGUucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbih0LGUpeyh0aGlzLnByb3BzLm9wZW4hPT10Lm9wZW58fHRoaXMucHJvcHMub3BlbiYmdGhpcy5zdGF0ZS5tb3VudGVkIT09ZS5tb3VudGVkKSYmdGhpcy5vcGVuXygpLHRoaXMucHJvcHMuY29vcmRpbmF0ZXMhPT10LmNvb3JkaW5hdGVzJiZ0aGlzLnNldENvb3JkaW5hdGVzKCksdGhpcy5wcm9wcy5hbmNob3JDb3JuZXIhPT10LmFuY2hvckNvcm5lciYmdGhpcy5mb3VuZGF0aW9uLnNldEFuY2hvckNvcm5lcih0aGlzLnByb3BzLmFuY2hvckNvcm5lciksdGhpcy5wcm9wcy5hbmNob3JNYXJnaW4hPT10LmFuY2hvck1hcmdpbiYmdGhpcy5mb3VuZGF0aW9uLnNldEFuY2hvck1hcmdpbih0aGlzLnByb3BzLmFuY2hvck1hcmdpbiksdGhpcy5wcm9wcy5xdWlja09wZW4hPT10LnF1aWNrT3BlbiYmdGhpcy5mb3VuZGF0aW9uLnNldFF1aWNrT3Blbih0aGlzLnByb3BzLnF1aWNrT3BlbiksdGhpcy5zdGF0ZS5tb3VudGVkIT09ZS5tb3VudGVkJiZ0aGlzLnByb3BzLm9uTW91bnQmJnRoaXMucHJvcHMub25Nb3VudCh0aGlzLnN0YXRlLm1vdW50ZWQpfSxlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMuZGVyZWdpc3RlcldpbmRvd0NsaWNrTGlzdGVuZXImJnRoaXMuZGVyZWdpc3RlcldpbmRvd0NsaWNrTGlzdGVuZXIoKSx0aGlzLmZvdW5kYXRpb24mJnRoaXMuZm91bmRhdGlvbi5kZXN0cm95KCl9LGUucHJvdG90eXBlLnNldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7aWYodGhpcy5wcm9wcy5jb29yZGluYXRlcyl7dmFyIHQ9dGhpcy5wcm9wcy5jb29yZGluYXRlcyxlPXQueCxuPXQueTt0aGlzLmZvdW5kYXRpb24uc2V0QWJzb2x1dGVQb3NpdGlvbihlLG4pfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiY2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9dC5maXhlZCxuPXQuY2xhc3NOYW1lLG89dGhpcy5zdGF0ZS5jbGFzc0xpc3Q7cmV0dXJuIGwuZGVmYXVsdChcIm1kYy1tZW51LXN1cmZhY2VcIixBcnJheS5mcm9tKG8pLG4se1wibWRjLW1lbnUtc3VyZmFjZS0tZml4ZWRcIjplfSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwic3R5bGVzXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuc3RhdGUsZT10LnN0eWxlTGVmdCxuPXQuc3R5bGVSaWdodCxvPXQuc3R5bGVUb3AsaT10LnN0eWxlQm90dG9tLHI9dC50cmFuc2Zvcm1PcmlnaW4scz10Lm1heEhlaWdodDtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSx0aGlzLnByb3BzLnN0eWxlcyx7dHJhbnNmb3JtT3JpZ2luOnIsbWF4SGVpZ2h0OnMsbGVmdDplLHJpZ2h0Om4sdG9wOm8sYm90dG9tOml9KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJhZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHIoe2FkZENsYXNzOmZ1bmN0aW9uKGUpe3ZhciBuPW5ldyBTZXQodC5zdGF0ZS5jbGFzc0xpc3QpO24uYWRkKGUpLHQuc2V0U3RhdGUoe2NsYXNzTGlzdDpufSl9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciBuPW5ldyBTZXQodC5zdGF0ZS5jbGFzc0xpc3QpO24uZGVsZXRlKGUpLHQuc2V0U3RhdGUoe2NsYXNzTGlzdDpufSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiB0LmNsYXNzZXMuc3BsaXQoXCIgXCIpLmluY2x1ZGVzKGUpfSxoYXNBbmNob3I6ZnVuY3Rpb24oKXtyZXR1cm4hIXQucHJvcHMuYW5jaG9yRWxlbWVudH0sbm90aWZ5T3BlbjpmdW5jdGlvbigpe3QuaGFuZGxlT3BlbigpLHQucHJvcHMub25PcGVuKCl9LG5vdGlmeUNsb3NlOmZ1bmN0aW9uKCl7dC5oYW5kbGVDbG9zZSgpLHQucHJvcHMub25DbG9zZSgpfSxpc0VsZW1lbnRJbkNvbnRhaW5lcjpmdW5jdGlvbihlKXtyZXR1cm4hIXQubWVudVN1cmZhY2VFbGVtZW50LmN1cnJlbnQmJnQubWVudVN1cmZhY2VFbGVtZW50LmN1cnJlbnQuY29udGFpbnMoZSl9LGlzUnRsOmZ1bmN0aW9uKCl7cmV0dXJuISF0Lm1lbnVTdXJmYWNlRWxlbWVudCYmKCEhdC5tZW51U3VyZmFjZUVsZW1lbnQuY3VycmVudCYmXCJydGxcIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQubWVudVN1cmZhY2VFbGVtZW50LmN1cnJlbnQpLmdldFByb3BlcnR5VmFsdWUoXCJkaXJlY3Rpb25cIikpfSxzZXRUcmFuc2Zvcm1PcmlnaW46ZnVuY3Rpb24oZSl7cmV0dXJuIHQuc2V0U3RhdGUoe3RyYW5zZm9ybU9yaWdpbjplfSl9fSx7aXNGb2N1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuIHQubWVudVN1cmZhY2VFbGVtZW50JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09dC5tZW51U3VyZmFjZUVsZW1lbnQuY3VycmVudH0sc2F2ZUZvY3VzOmZ1bmN0aW9uKCl7dC5wcmV2aW91c0ZvY3VzPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9LHJlc3RvcmVGb2N1czpmdW5jdGlvbigpe3ZhciBlPXQubWVudVN1cmZhY2VFbGVtZW50O2UmJmUuY3VycmVudCYmZS5jdXJyZW50LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpJiZ0LnByZXZpb3VzRm9jdXMmJnQucHJldmlvdXNGb2N1cy5mb2N1cyYmdC5wcmV2aW91c0ZvY3VzLmZvY3VzKCl9LGlzRmlyc3RFbGVtZW50Rm9jdXNlZDpmdW5jdGlvbigpe3JldHVybiB0LmZpcnN0Rm9jdXNhYmxlRWxlbWVudD09PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9LGlzTGFzdEVsZW1lbnRGb2N1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuIHQubGFzdEZvY3VzYWJsZUVsZW1lbnQ9PT1kb2N1bWVudC5hY3RpdmVFbGVtZW50fSxmb2N1c0ZpcnN0RWxlbWVudDpmdW5jdGlvbigpe3JldHVybiEhdC5maXJzdEZvY3VzYWJsZUVsZW1lbnQmJih0LmZpcnN0Rm9jdXNhYmxlRWxlbWVudC5mb2N1cyYmdC5maXJzdEZvY3VzYWJsZUVsZW1lbnQuZm9jdXMoKSl9LGZvY3VzTGFzdEVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5sYXN0Rm9jdXNhYmxlRWxlbWVudCYmdC5sYXN0Rm9jdXNhYmxlRWxlbWVudC5mb2N1cyYmdC5sYXN0Rm9jdXNhYmxlRWxlbWVudC5mb2N1cygpfX0se2dldElubmVyRGltZW5zaW9uczpmdW5jdGlvbigpe3ZhciBlPXQubWVudVN1cmZhY2VFbGVtZW50LmN1cnJlbnQ7cmV0dXJuIGU/e3dpZHRoOmUub2Zmc2V0V2lkdGgsaGVpZ2h0OmUub2Zmc2V0SGVpZ2h0fTp7d2lkdGg6MCxoZWlnaHQ6MH19LGdldEFuY2hvckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gdC5wcm9wcy5hbmNob3JFbGVtZW50P3QucHJvcHMuYW5jaG9yRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTpudWxsfSxnZXRXaW5kb3dEaW1lbnNpb25zOmZ1bmN0aW9uKCl7cmV0dXJue3dpZHRoOndpbmRvdy5pbm5lcldpZHRoLGhlaWdodDp3aW5kb3cuaW5uZXJIZWlnaHR9fSxnZXRCb2R5RGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybnt3aWR0aDpkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLGhlaWdodDpkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodH19LGdldFdpbmRvd1Njcm9sbDpmdW5jdGlvbigpe3JldHVybnt4OndpbmRvdy5wYWdlWE9mZnNldCx5OndpbmRvdy5wYWdlWU9mZnNldH19LHNldFBvc2l0aW9uOmZ1bmN0aW9uKGUpe3Quc2V0U3RhdGUoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5hc3NpZ24odCx7c3R5bGVMZWZ0OlwibGVmdFwiaW4gZT9lLmxlZnQ6bnVsbCxzdHlsZVJpZ2h0OlwicmlnaHRcImluIGU/ZS5yaWdodDpudWxsLHN0eWxlVG9wOlwidG9wXCJpbiBlP2UudG9wOm51bGwsc3R5bGVCb3R0b206XCJib3R0b21cImluIGU/ZS5ib3R0b206bnVsbH0pfSl9LHNldE1heEhlaWdodDpmdW5jdGlvbihlKXtyZXR1cm4gdC5zZXRTdGF0ZSh7bWF4SGVpZ2h0OmV9KX19KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9KHQuYW5jaG9yQ29ybmVyLHQuYW5jaG9yRWxlbWVudCx0LmFuY2hvck1hcmdpbix0LmNsYXNzTmFtZSx0LmNvb3JkaW5hdGVzLHQuZml4ZWQsdC5vbkNsb3NlLHQub25PcGVuLHQub25LZXlEb3duLHQuc3R5bGVzLHQucXVpY2tPcGVuLHQub25Nb3VudCx0LmNoaWxkcmVuKSxuPXModCxbXCJhbmNob3JDb3JuZXJcIixcImFuY2hvckVsZW1lbnRcIixcImFuY2hvck1hcmdpblwiLFwiY2xhc3NOYW1lXCIsXCJjb29yZGluYXRlc1wiLFwiZml4ZWRcIixcIm9uQ2xvc2VcIixcIm9uT3BlblwiLFwib25LZXlEb3duXCIsXCJzdHlsZXNcIixcInF1aWNrT3BlblwiLFwib25Nb3VudFwiLFwiY2hpbGRyZW5cIl0pO3JldHVybiB0aGlzLnN0YXRlLm1vdW50ZWQ/Yy5kZWZhdWx0LmNyZWF0ZVBvcnRhbChhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHIoe2NsYXNzTmFtZTp0aGlzLmNsYXNzZXMsb25LZXlEb3duOnRoaXMuaGFuZGxlS2V5ZG93bixyZWY6dGhpcy5tZW51U3VyZmFjZUVsZW1lbnQsc3R5bGU6dGhpcy5zdHlsZXN9LG4pLGUpLGRvY3VtZW50LmJvZHkpOm51bGx9LGUuZGVmYXVsdFByb3BzPXtjbGFzc05hbWU6XCJcIixzdHlsZXM6e30sYW5jaG9yQ29ybmVyOjAsYW5jaG9yTWFyZ2luOnt9LG9uQ2xvc2U6ZnVuY3Rpb24oKXt9LG9uT3BlbjpmdW5jdGlvbigpe30sb25LZXlEb3duOmZ1bmN0aW9uKCl7fSxxdWlja09wZW46ITEsb3BlbjohMSxmaXhlZDohMX0sZX0oYS5kZWZhdWx0LkNvbXBvbmVudCk7ZS5kZWZhdWx0PWR9LDEwMzpmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1ufSwxNTpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJiXCIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLG4uZChlLFwiYVwiLGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KSxuLmQoZSxcImRcIixmdW5jdGlvbigpe3JldHVybiBzfSksbi5kKGUsXCJjXCIsZnVuY3Rpb24oKXtyZXR1cm4gYX0pO1wiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yO1xuLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxuXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovdmFyIG89ZnVuY3Rpb24odCxlKXtyZXR1cm4obz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9O2Z1bmN0aW9uIGkodCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fW8odCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9dmFyIHI9ZnVuY3Rpb24oKXtyZXR1cm4ocj1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLG89YXJndW1lbnRzLmxlbmd0aDtuPG87bisrKWZvcih2YXIgaSBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxpKSYmKHRbaV09ZVtpXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2Z1bmN0aW9uIHModCl7dmFyIGU9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0W1N5bWJvbC5pdGVyYXRvcl0sbj0wO3JldHVybiBlP2UuY2FsbCh0KTp7bmV4dDpmdW5jdGlvbigpe3JldHVybiB0JiZuPj10Lmxlbmd0aCYmKHQ9dm9pZCAwKSx7dmFsdWU6dCYmdFtuKytdLGRvbmU6IXR9fX19ZnVuY3Rpb24gdSh0LGUpe3ZhciBuPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdO2lmKCFuKXJldHVybiB0O3ZhciBvLGkscj1uLmNhbGwodCkscz1bXTt0cnl7Zm9yKDsodm9pZCAwPT09ZXx8ZS0tID4wKSYmIShvPXIubmV4dCgpKS5kb25lOylzLnB1c2goby52YWx1ZSl9Y2F0Y2godCl7aT17ZXJyb3I6dH19ZmluYWxseXt0cnl7byYmIW8uZG9uZSYmKG49ci5yZXR1cm4pJiZuLmNhbGwocil9ZmluYWxseXtpZihpKXRocm93IGkuZXJyb3J9fXJldHVybiBzfWZ1bmN0aW9uIGEoKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdD10LmNvbmNhdCh1KGFyZ3VtZW50c1tlXSkpO3JldHVybiB0fX0sMTU5OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSk7dmFyIG8saT17fTtmdW5jdGlvbiByKHQsZSl7aWYodm9pZCAwPT09ZSYmKGU9ITEpLHZvaWQgMD09PW98fGUpe3ZhciBuPXQuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtvPVwidHJhbnNmb3JtXCJpbiBuLnN0eWxlP1widHJhbnNmb3JtXCI6XCJ3ZWJraXRUcmFuc2Zvcm1cIn1yZXR1cm4gb31uLnIoaSksbi5kKGksXCJnZXRUcmFuc2Zvcm1Qcm9wZXJ0eU5hbWVcIixmdW5jdGlvbigpe3JldHVybiByfSk7dmFyIHM9bigzKSx1PW4oMTUpLGE9bigyOCksYz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIG49W10sbz0yO288YXJndW1lbnRzLmxlbmd0aDtvKyspbltvLTJdPWFyZ3VtZW50c1tvXTt0aGlzLnJvb3RfPXQsdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsdS5jKG4pKSx0aGlzLmZvdW5kYXRpb25fPXZvaWQgMD09PWU/dGhpcy5nZXREZWZhdWx0Rm91bmRhdGlvbigpOmUsdGhpcy5mb3VuZGF0aW9uXy5pbml0KCksdGhpcy5pbml0aWFsU3luY1dpdGhET00oKX1yZXR1cm4gdC5hdHRhY2hUbz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQoZSxuZXcgYS5hKHt9KSl9LHQucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV19LHQucHJvdG90eXBlLmdldERlZmF1bHRGb3VuZGF0aW9uPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFwiU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIGdldERlZmF1bHRGb3VuZGF0aW9uIHRvIHJldHVybiBhIHByb3Blcmx5IGNvbmZpZ3VyZWQgZm91bmRhdGlvbiBjbGFzc1wiKX0sdC5wcm90b3R5cGUuaW5pdGlhbFN5bmNXaXRoRE9NPWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5mb3VuZGF0aW9uXy5kZXN0cm95KCl9LHQucHJvdG90eXBlLmxpc3Rlbj1mdW5jdGlvbih0LGUpe3RoaXMucm9vdF8uYWRkRXZlbnRMaXN0ZW5lcih0LGUpfSx0LnByb3RvdHlwZS51bmxpc3Rlbj1mdW5jdGlvbih0LGUpe3RoaXMucm9vdF8ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LGUpfSx0LnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKHQsZSxuKXt2YXIgbzt2b2lkIDA9PT1uJiYobj0hMSksXCJmdW5jdGlvblwiPT10eXBlb2YgQ3VzdG9tRXZlbnQ/bz1uZXcgQ3VzdG9tRXZlbnQodCx7YnViYmxlczpuLGRldGFpbDplfSk6KG89ZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJDdXN0b21FdmVudFwiKSkuaW5pdEN1c3RvbUV2ZW50KHQsbiwhMSxlKSx0aGlzLnJvb3RfLmRpc3BhdGNoRXZlbnQobyl9LHR9KCksbD1uKDE2KSxmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiB1LmIoZSx0KSxlLmF0dGFjaFRvPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5wcm90b3R5cGUuaW5pdGlhbFN5bmNXaXRoRE9NPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMucm9vdF8ucGFyZW50RWxlbWVudDt0aGlzLmFuY2hvckVsZW1lbnQ9ZSYmZS5jbGFzc0xpc3QuY29udGFpbnMocy5jLkFOQ0hPUik/ZTpudWxsLHRoaXMucm9vdF8uY2xhc3NMaXN0LmNvbnRhaW5zKHMuYy5GSVhFRCkmJnRoaXMuc2V0Rml4ZWRQb3NpdGlvbighMCksdGhpcy5oYW5kbGVLZXlkb3duXz1mdW5jdGlvbihlKXtyZXR1cm4gdC5mb3VuZGF0aW9uXy5oYW5kbGVLZXlkb3duKGUpfSx0aGlzLmhhbmRsZUJvZHlDbGlja189ZnVuY3Rpb24oZSl7cmV0dXJuIHQuZm91bmRhdGlvbl8uaGFuZGxlQm9keUNsaWNrKGUpfSx0aGlzLnJlZ2lzdGVyQm9keUNsaWNrTGlzdGVuZXJfPWZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsdC5oYW5kbGVCb2R5Q2xpY2tfKX0sdGhpcy5kZXJlZ2lzdGVyQm9keUNsaWNrTGlzdGVuZXJfPWZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsdC5oYW5kbGVCb2R5Q2xpY2tfKX0sdGhpcy5saXN0ZW4oXCJrZXlkb3duXCIsdGhpcy5oYW5kbGVLZXlkb3duXyksdGhpcy5saXN0ZW4ocy5lLk9QRU5FRF9FVkVOVCx0aGlzLnJlZ2lzdGVyQm9keUNsaWNrTGlzdGVuZXJfKSx0aGlzLmxpc3RlbihzLmUuQ0xPU0VEX0VWRU5ULHRoaXMuZGVyZWdpc3RlckJvZHlDbGlja0xpc3RlbmVyXyl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLnVubGlzdGVuKFwia2V5ZG93blwiLHRoaXMuaGFuZGxlS2V5ZG93bl8pLHRoaXMudW5saXN0ZW4ocy5lLk9QRU5FRF9FVkVOVCx0aGlzLnJlZ2lzdGVyQm9keUNsaWNrTGlzdGVuZXJfKSx0aGlzLnVubGlzdGVuKHMuZS5DTE9TRURfRVZFTlQsdGhpcy5kZXJlZ2lzdGVyQm9keUNsaWNrTGlzdGVuZXJfKSx0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcIm9wZW5cIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZm91bmRhdGlvbl8uaXNPcGVuKCl9LHNldDpmdW5jdGlvbih0KXtpZih0KXt2YXIgZT10aGlzLnJvb3RfLnF1ZXJ5U2VsZWN0b3JBbGwocy5lLkZPQ1VTQUJMRV9FTEVNRU5UUyk7dGhpcy5maXJzdEZvY3VzYWJsZUVsZW1lbnRfPWVbMF0sdGhpcy5sYXN0Rm9jdXNhYmxlRWxlbWVudF89ZVtlLmxlbmd0aC0xXSx0aGlzLmZvdW5kYXRpb25fLm9wZW4oKX1lbHNlIHRoaXMuZm91bmRhdGlvbl8uY2xvc2UoKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJxdWlja09wZW5cIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuZm91bmRhdGlvbl8uc2V0UXVpY2tPcGVuKHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmhvaXN0TWVudVRvQm9keT1mdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5yb290XyksdGhpcy5zZXRJc0hvaXN0ZWQoITApfSxlLnByb3RvdHlwZS5zZXRJc0hvaXN0ZWQ9ZnVuY3Rpb24odCl7dGhpcy5mb3VuZGF0aW9uXy5zZXRJc0hvaXN0ZWQodCl9LGUucHJvdG90eXBlLnNldE1lbnVTdXJmYWNlQW5jaG9yRWxlbWVudD1mdW5jdGlvbih0KXt0aGlzLmFuY2hvckVsZW1lbnQ9dH0sZS5wcm90b3R5cGUuc2V0Rml4ZWRQb3NpdGlvbj1mdW5jdGlvbih0KXt0P3RoaXMucm9vdF8uY2xhc3NMaXN0LmFkZChzLmMuRklYRUQpOnRoaXMucm9vdF8uY2xhc3NMaXN0LnJlbW92ZShzLmMuRklYRUQpLHRoaXMuZm91bmRhdGlvbl8uc2V0Rml4ZWRQb3NpdGlvbih0KX0sZS5wcm90b3R5cGUuc2V0QWJzb2x1dGVQb3NpdGlvbj1mdW5jdGlvbih0LGUpe3RoaXMuZm91bmRhdGlvbl8uc2V0QWJzb2x1dGVQb3NpdGlvbih0LGUpLHRoaXMuc2V0SXNIb2lzdGVkKCEwKX0sZS5wcm90b3R5cGUuc2V0QW5jaG9yQ29ybmVyPWZ1bmN0aW9uKHQpe3RoaXMuZm91bmRhdGlvbl8uc2V0QW5jaG9yQ29ybmVyKHQpfSxlLnByb3RvdHlwZS5zZXRBbmNob3JNYXJnaW49ZnVuY3Rpb24odCl7dGhpcy5mb3VuZGF0aW9uXy5zZXRBbmNob3JNYXJnaW4odCl9LGUucHJvdG90eXBlLmdldERlZmF1bHRGb3VuZGF0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXthZGRDbGFzczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yb290Xy5jbGFzc0xpc3QuYWRkKGUpfSxyZW1vdmVDbGFzczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yb290Xy5jbGFzc0xpc3QucmVtb3ZlKGUpfSxoYXNDbGFzczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yb290Xy5jbGFzc0xpc3QuY29udGFpbnMoZSl9LGhhc0FuY2hvcjpmdW5jdGlvbigpe3JldHVybiEhdC5hbmNob3JFbGVtZW50fSxub3RpZnlDbG9zZTpmdW5jdGlvbigpe3JldHVybiB0LmVtaXQobC5NRENNZW51U3VyZmFjZUZvdW5kYXRpb24uc3RyaW5ncy5DTE9TRURfRVZFTlQse30pfSxub3RpZnlPcGVuOmZ1bmN0aW9uKCl7cmV0dXJuIHQuZW1pdChsLk1EQ01lbnVTdXJmYWNlRm91bmRhdGlvbi5zdHJpbmdzLk9QRU5FRF9FVkVOVCx7fSl9LGlzRWxlbWVudEluQ29udGFpbmVyOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJvb3RfLmNvbnRhaW5zKGUpfSxpc1J0bDpmdW5jdGlvbigpe3JldHVyblwicnRsXCI9PT1nZXRDb21wdXRlZFN0eWxlKHQucm9vdF8pLmdldFByb3BlcnR5VmFsdWUoXCJkaXJlY3Rpb25cIil9LHNldFRyYW5zZm9ybU9yaWdpbjpmdW5jdGlvbihlKXt2YXIgbj1yKHdpbmRvdykrXCItb3JpZ2luXCI7dC5yb290Xy5zdHlsZS5zZXRQcm9wZXJ0eShuLGUpfSxpc0ZvY3VzZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PXQucm9vdF99LHNhdmVGb2N1czpmdW5jdGlvbigpe3QucHJldmlvdXNGb2N1c189ZG9jdW1lbnQuYWN0aXZlRWxlbWVudH0scmVzdG9yZUZvY3VzOmZ1bmN0aW9uKCl7dC5yb290Xy5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSYmdC5wcmV2aW91c0ZvY3VzXyYmdC5wcmV2aW91c0ZvY3VzXy5mb2N1cyYmdC5wcmV2aW91c0ZvY3VzXy5mb2N1cygpfSxpc0ZpcnN0RWxlbWVudEZvY3VzZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXQuZmlyc3RGb2N1c2FibGVFbGVtZW50XyYmdC5maXJzdEZvY3VzYWJsZUVsZW1lbnRfPT09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudH0saXNMYXN0RWxlbWVudEZvY3VzZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXQubGFzdEZvY3VzYWJsZUVsZW1lbnRfJiZ0Lmxhc3RGb2N1c2FibGVFbGVtZW50Xz09PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9LGZvY3VzRmlyc3RFbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHQuZmlyc3RGb2N1c2FibGVFbGVtZW50XyYmdC5maXJzdEZvY3VzYWJsZUVsZW1lbnRfLmZvY3VzJiZ0LmZpcnN0Rm9jdXNhYmxlRWxlbWVudF8uZm9jdXMoKX0sZm9jdXNMYXN0RWxlbWVudDpmdW5jdGlvbigpe3JldHVybiB0Lmxhc3RGb2N1c2FibGVFbGVtZW50XyYmdC5sYXN0Rm9jdXNhYmxlRWxlbWVudF8uZm9jdXMmJnQubGFzdEZvY3VzYWJsZUVsZW1lbnRfLmZvY3VzKCl9LGdldElubmVyRGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybnt3aWR0aDp0LnJvb3RfLm9mZnNldFdpZHRoLGhlaWdodDp0LnJvb3RfLm9mZnNldEhlaWdodH19LGdldEFuY2hvckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gdC5hbmNob3JFbGVtZW50P3QuYW5jaG9yRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTpudWxsfSxnZXRXaW5kb3dEaW1lbnNpb25zOmZ1bmN0aW9uKCl7cmV0dXJue3dpZHRoOndpbmRvdy5pbm5lcldpZHRoLGhlaWdodDp3aW5kb3cuaW5uZXJIZWlnaHR9fSxnZXRCb2R5RGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybnt3aWR0aDpkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLGhlaWdodDpkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodH19LGdldFdpbmRvd1Njcm9sbDpmdW5jdGlvbigpe3JldHVybnt4OndpbmRvdy5wYWdlWE9mZnNldCx5OndpbmRvdy5wYWdlWU9mZnNldH19LHNldFBvc2l0aW9uOmZ1bmN0aW9uKGUpe3Qucm9vdF8uc3R5bGUubGVmdD1cImxlZnRcImluIGU/ZS5sZWZ0K1wicHhcIjpcIlwiLHQucm9vdF8uc3R5bGUucmlnaHQ9XCJyaWdodFwiaW4gZT9lLnJpZ2h0K1wicHhcIjpcIlwiLHQucm9vdF8uc3R5bGUudG9wPVwidG9wXCJpbiBlP2UudG9wK1wicHhcIjpcIlwiLHQucm9vdF8uc3R5bGUuYm90dG9tPVwiYm90dG9tXCJpbiBlP2UuYm90dG9tK1wicHhcIjpcIlwifSxzZXRNYXhIZWlnaHQ6ZnVuY3Rpb24oZSl7dC5yb290Xy5zdHlsZS5tYXhIZWlnaHQ9ZX19O3JldHVybiBuZXcgbC5NRENNZW51U3VyZmFjZUZvdW5kYXRpb24oZSl9LGV9KGMpO24uZChlLFwiQ29ybmVyXCIsZnVuY3Rpb24oKXtyZXR1cm4gcy5hfSksbi5kKGUsXCJDb3JuZXJCaXRcIixmdW5jdGlvbigpe3JldHVybiBzLmJ9KSxuLmQoZSxcInV0aWxcIixmdW5jdGlvbigpe3JldHVybiBpfSksbi5kKGUsXCJNRENNZW51U3VyZmFjZVwiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KSxuLmQoZSxcIk1EQ01lbnVTdXJmYWNlRm91bmRhdGlvblwiLGZ1bmN0aW9uKCl7cmV0dXJuIGwuTURDTWVudVN1cmZhY2VGb3VuZGF0aW9ufSl9LDE2OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSksbi5kKGUsXCJNRENNZW51U3VyZmFjZUZvdW5kYXRpb25cIixmdW5jdGlvbigpe3JldHVybiBzfSk7dmFyIG89bigxNSksaT1uKDI4KSxyPW4oMykscz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciBpPXQuY2FsbCh0aGlzLG8uYSh7fSxlLmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpcztyZXR1cm4gaS5pc09wZW5fPSExLGkuaXNRdWlja09wZW5fPSExLGkuaXNIb2lzdGVkRWxlbWVudF89ITEsaS5pc0ZpeGVkUG9zaXRpb25fPSExLGkub3BlbkFuaW1hdGlvbkVuZFRpbWVySWRfPTAsaS5jbG9zZUFuaW1hdGlvbkVuZFRpbWVySWRfPTAsaS5hbmltYXRpb25SZXF1ZXN0SWRfPTAsaS5hbmNob3JDb3JuZXJfPXIuYS5UT1BfU1RBUlQsaS5hbmNob3JNYXJnaW5fPXt0b3A6MCxyaWdodDowLGJvdHRvbTowLGxlZnQ6MH0saS5wb3NpdGlvbl89e3g6MCx5OjB9LGl9cmV0dXJuIG8uYihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5jfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwic3RyaW5nc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5lfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwibnVtYmVyc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5kfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiQ29ybmVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybiByLmF9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJkZWZhdWx0QWRhcHRlclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57YWRkQ2xhc3M6ZnVuY3Rpb24oKXt9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKCl7fSxoYXNDbGFzczpmdW5jdGlvbigpe3JldHVybiExfSxoYXNBbmNob3I6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXNFbGVtZW50SW5Db250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXNGb2N1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGlzRmlyc3RFbGVtZW50Rm9jdXNlZDpmdW5jdGlvbigpe3JldHVybiExfSxpc0xhc3RFbGVtZW50Rm9jdXNlZDpmdW5jdGlvbigpe3JldHVybiExfSxpc1J0bDpmdW5jdGlvbigpe3JldHVybiExfSxnZXRJbm5lckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm57aGVpZ2h0OjAsd2lkdGg6MH19LGdldEFuY2hvckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sZ2V0V2luZG93RGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybntoZWlnaHQ6MCx3aWR0aDowfX0sZ2V0Qm9keURpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm57aGVpZ2h0OjAsd2lkdGg6MH19LGdldFdpbmRvd1Njcm9sbDpmdW5jdGlvbigpe3JldHVybnt4OjAseTowfX0sc2V0UG9zaXRpb246ZnVuY3Rpb24oKXt9LHNldE1heEhlaWdodDpmdW5jdGlvbigpe30sc2V0VHJhbnNmb3JtT3JpZ2luOmZ1bmN0aW9uKCl7fSxzYXZlRm9jdXM6ZnVuY3Rpb24oKXt9LHJlc3RvcmVGb2N1czpmdW5jdGlvbigpe30sZm9jdXNGaXJzdEVsZW1lbnQ6ZnVuY3Rpb24oKXt9LGZvY3VzTGFzdEVsZW1lbnQ6ZnVuY3Rpb24oKXt9LG5vdGlmeUNsb3NlOmZ1bmN0aW9uKCl7fSxub3RpZnlPcGVuOmZ1bmN0aW9uKCl7fX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciB0PWUuY3NzQ2xhc3NlcyxuPXQuUk9PVCxvPXQuT1BFTjtpZighdGhpcy5hZGFwdGVyXy5oYXNDbGFzcyhuKSl0aHJvdyBuZXcgRXJyb3IobitcIiBjbGFzcyByZXF1aXJlZCBpbiByb290IGVsZW1lbnQuXCIpO3RoaXMuYWRhcHRlcl8uaGFzQ2xhc3MobykmJih0aGlzLmlzT3Blbl89ITApfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMub3BlbkFuaW1hdGlvbkVuZFRpbWVySWRfKSxjbGVhclRpbWVvdXQodGhpcy5jbG9zZUFuaW1hdGlvbkVuZFRpbWVySWRfKSxjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvblJlcXVlc3RJZF8pfSxlLnByb3RvdHlwZS5zZXRBbmNob3JDb3JuZXI9ZnVuY3Rpb24odCl7dGhpcy5hbmNob3JDb3JuZXJfPXR9LGUucHJvdG90eXBlLnNldEFuY2hvck1hcmdpbj1mdW5jdGlvbih0KXt0aGlzLmFuY2hvck1hcmdpbl8udG9wPXQudG9wfHwwLHRoaXMuYW5jaG9yTWFyZ2luXy5yaWdodD10LnJpZ2h0fHwwLHRoaXMuYW5jaG9yTWFyZ2luXy5ib3R0b209dC5ib3R0b218fDAsdGhpcy5hbmNob3JNYXJnaW5fLmxlZnQ9dC5sZWZ0fHwwfSxlLnByb3RvdHlwZS5zZXRJc0hvaXN0ZWQ9ZnVuY3Rpb24odCl7dGhpcy5pc0hvaXN0ZWRFbGVtZW50Xz10fSxlLnByb3RvdHlwZS5zZXRGaXhlZFBvc2l0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuaXNGaXhlZFBvc2l0aW9uXz10fSxlLnByb3RvdHlwZS5zZXRBYnNvbHV0ZVBvc2l0aW9uPWZ1bmN0aW9uKHQsZSl7dGhpcy5wb3NpdGlvbl8ueD10aGlzLmlzRmluaXRlXyh0KT90OjAsdGhpcy5wb3NpdGlvbl8ueT10aGlzLmlzRmluaXRlXyhlKT9lOjB9LGUucHJvdG90eXBlLnNldFF1aWNrT3Blbj1mdW5jdGlvbih0KXt0aGlzLmlzUXVpY2tPcGVuXz10fSxlLnByb3RvdHlwZS5pc09wZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc09wZW5ffSxlLnByb3RvdHlwZS5vcGVuPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmFkYXB0ZXJfLnNhdmVGb2N1cygpLHRoaXMuaXNRdWlja09wZW5ffHx0aGlzLmFkYXB0ZXJfLmFkZENsYXNzKGUuY3NzQ2xhc3Nlcy5BTklNQVRJTkdfT1BFTiksdGhpcy5hbmltYXRpb25SZXF1ZXN0SWRfPXJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3QuYWRhcHRlcl8uYWRkQ2xhc3MoZS5jc3NDbGFzc2VzLk9QRU4pLHQuZGltZW5zaW9uc189dC5hZGFwdGVyXy5nZXRJbm5lckRpbWVuc2lvbnMoKSx0LmF1dG9Qb3NpdGlvbl8oKSx0LmlzUXVpY2tPcGVuXz90LmFkYXB0ZXJfLm5vdGlmeU9wZW4oKTp0Lm9wZW5BbmltYXRpb25FbmRUaW1lcklkXz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5vcGVuQW5pbWF0aW9uRW5kVGltZXJJZF89MCx0LmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGUuY3NzQ2xhc3Nlcy5BTklNQVRJTkdfT1BFTiksdC5hZGFwdGVyXy5ub3RpZnlPcGVuKCl9LHIuZC5UUkFOU0lUSU9OX09QRU5fRFVSQVRJT04pfSksdGhpcy5pc09wZW5fPSEwfSxlLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5pc1F1aWNrT3Blbl98fHRoaXMuYWRhcHRlcl8uYWRkQ2xhc3MoZS5jc3NDbGFzc2VzLkFOSU1BVElOR19DTE9TRUQpLHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3QuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoZS5jc3NDbGFzc2VzLk9QRU4pLHQuaXNRdWlja09wZW5fP3QuYWRhcHRlcl8ubm90aWZ5Q2xvc2UoKTp0LmNsb3NlQW5pbWF0aW9uRW5kVGltZXJJZF89c2V0VGltZW91dChmdW5jdGlvbigpe3QuY2xvc2VBbmltYXRpb25FbmRUaW1lcklkXz0wLHQuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoZS5jc3NDbGFzc2VzLkFOSU1BVElOR19DTE9TRUQpLHQuYWRhcHRlcl8ubm90aWZ5Q2xvc2UoKX0sci5kLlRSQU5TSVRJT05fQ0xPU0VfRFVSQVRJT04pfSksdGhpcy5pc09wZW5fPSExLHRoaXMubWF5YmVSZXN0b3JlRm9jdXNfKCl9LGUucHJvdG90eXBlLmhhbmRsZUJvZHlDbGljaz1mdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldDt0aGlzLmFkYXB0ZXJfLmlzRWxlbWVudEluQ29udGFpbmVyKGUpfHx0aGlzLmNsb3NlKCl9LGUucHJvdG90eXBlLmhhbmRsZUtleWRvd249ZnVuY3Rpb24odCl7dmFyIGU9dC5rZXlDb2RlLG49dC5rZXksbz10LnNoaWZ0S2V5LGk9XCJUYWJcIj09PW58fDk9PT1lO1wiRXNjYXBlXCI9PT1ufHwyNz09PWU/dGhpcy5jbG9zZSgpOmkmJih0aGlzLmFkYXB0ZXJfLmlzTGFzdEVsZW1lbnRGb2N1c2VkKCkmJiFvPyh0aGlzLmFkYXB0ZXJfLmZvY3VzRmlyc3RFbGVtZW50KCksdC5wcmV2ZW50RGVmYXVsdCgpKTp0aGlzLmFkYXB0ZXJfLmlzRmlyc3RFbGVtZW50Rm9jdXNlZCgpJiZvJiYodGhpcy5hZGFwdGVyXy5mb2N1c0xhc3RFbGVtZW50KCksdC5wcmV2ZW50RGVmYXVsdCgpKSl9LGUucHJvdG90eXBlLmF1dG9Qb3NpdGlvbl89ZnVuY3Rpb24oKXt2YXIgdDt0aGlzLm1lYXN1cmVtZW50c189dGhpcy5nZXRBdXRvTGF5b3V0TWVhc3VyZW1lbnRzXygpO3ZhciBlPXRoaXMuZ2V0T3JpZ2luQ29ybmVyXygpLG49dGhpcy5nZXRNZW51U3VyZmFjZU1heEhlaWdodF8oZSksbz10aGlzLmhhc0JpdF8oZSxyLmIuQk9UVE9NKT9cImJvdHRvbVwiOlwidG9wXCIsaT10aGlzLmhhc0JpdF8oZSxyLmIuUklHSFQpP1wicmlnaHRcIjpcImxlZnRcIixzPXRoaXMuZ2V0SG9yaXpvbnRhbE9yaWdpbk9mZnNldF8oZSksdT10aGlzLmdldFZlcnRpY2FsT3JpZ2luT2Zmc2V0XyhlKSxhPXRoaXMubWVhc3VyZW1lbnRzXyxjPWEuYW5jaG9yU2l6ZSxsPWEuc3VyZmFjZVNpemUsZj0oKHQ9e30pW2ldPXMsdFtvXT11LHQpO2Mud2lkdGgvbC53aWR0aD5yLmQuQU5DSE9SX1RPX01FTlVfU1VSRkFDRV9XSURUSF9SQVRJTyYmKGk9XCJjZW50ZXJcIiksKHRoaXMuaXNIb2lzdGVkRWxlbWVudF98fHRoaXMuaXNGaXhlZFBvc2l0aW9uXykmJnRoaXMuYWRqdXN0UG9zaXRpb25Gb3JIb2lzdGVkRWxlbWVudF8oZiksdGhpcy5hZGFwdGVyXy5zZXRUcmFuc2Zvcm1PcmlnaW4oaStcIiBcIitvKSx0aGlzLmFkYXB0ZXJfLnNldFBvc2l0aW9uKGYpLHRoaXMuYWRhcHRlcl8uc2V0TWF4SGVpZ2h0KG4/bitcInB4XCI6XCJcIil9LGUucHJvdG90eXBlLmdldEF1dG9MYXlvdXRNZWFzdXJlbWVudHNfPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5hZGFwdGVyXy5nZXRBbmNob3JEaW1lbnNpb25zKCksZT10aGlzLmFkYXB0ZXJfLmdldEJvZHlEaW1lbnNpb25zKCksbj10aGlzLmFkYXB0ZXJfLmdldFdpbmRvd0RpbWVuc2lvbnMoKSxvPXRoaXMuYWRhcHRlcl8uZ2V0V2luZG93U2Nyb2xsKCk7cmV0dXJuIHR8fCh0PXt0b3A6dGhpcy5wb3NpdGlvbl8ueSxyaWdodDp0aGlzLnBvc2l0aW9uXy54LGJvdHRvbTp0aGlzLnBvc2l0aW9uXy55LGxlZnQ6dGhpcy5wb3NpdGlvbl8ueCx3aWR0aDowLGhlaWdodDowfSkse2FuY2hvclNpemU6dCxib2R5U2l6ZTplLHN1cmZhY2VTaXplOnRoaXMuZGltZW5zaW9uc18sdmlld3BvcnREaXN0YW5jZTp7dG9wOnQudG9wLHJpZ2h0Om4ud2lkdGgtdC5yaWdodCxib3R0b206bi5oZWlnaHQtdC5ib3R0b20sbGVmdDp0LmxlZnR9LHZpZXdwb3J0U2l6ZTpuLHdpbmRvd1Njcm9sbDpvfX0sZS5wcm90b3R5cGUuZ2V0T3JpZ2luQ29ybmVyXz1mdW5jdGlvbigpe3ZhciB0PXIuYS5UT1BfTEVGVCxlPXRoaXMubWVhc3VyZW1lbnRzXyxuPWUudmlld3BvcnREaXN0YW5jZSxvPWUuYW5jaG9yU2l6ZSxpPWUuc3VyZmFjZVNpemUscz10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLHIuYi5CT1RUT00pLHU9cz9uLnRvcCtvLmhlaWdodCt0aGlzLmFuY2hvck1hcmdpbl8uYm90dG9tOm4udG9wK3RoaXMuYW5jaG9yTWFyZ2luXy50b3AsYT1zP24uYm90dG9tLXRoaXMuYW5jaG9yTWFyZ2luXy5ib3R0b206bi5ib3R0b20rby5oZWlnaHQtdGhpcy5hbmNob3JNYXJnaW5fLnRvcCxjPWkuaGVpZ2h0LXUsbD1pLmhlaWdodC1hO2w+MCYmYzxsJiYodD10aGlzLnNldEJpdF8odCxyLmIuQk9UVE9NKSk7dmFyIGY9dGhpcy5hZGFwdGVyXy5pc1J0bCgpLGg9dGhpcy5oYXNCaXRfKHRoaXMuYW5jaG9yQ29ybmVyXyxyLmIuRkxJUF9SVEwpLGQ9dGhpcy5oYXNCaXRfKHRoaXMuYW5jaG9yQ29ybmVyXyxyLmIuUklHSFQpLHA9ZCYmIWZ8fCFkJiZoJiZmLG09cD9uLmxlZnQrby53aWR0aCt0aGlzLmFuY2hvck1hcmdpbl8ucmlnaHQ6bi5sZWZ0K3RoaXMuYW5jaG9yTWFyZ2luXy5sZWZ0LF89cD9uLnJpZ2h0LXRoaXMuYW5jaG9yTWFyZ2luXy5yaWdodDpuLnJpZ2h0K28ud2lkdGgtdGhpcy5hbmNob3JNYXJnaW5fLmxlZnQseT1pLndpZHRoLW0sZz1pLndpZHRoLV87cmV0dXJuKHk8MCYmcCYmZnx8ZCYmIXAmJnk8MHx8Zz4wJiZ5PGcpJiYodD10aGlzLnNldEJpdF8odCxyLmIuUklHSFQpKSx0fSxlLnByb3RvdHlwZS5nZXRNZW51U3VyZmFjZU1heEhlaWdodF89ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5tZWFzdXJlbWVudHNfLnZpZXdwb3J0RGlzdGFuY2Usbz0wLGk9dGhpcy5oYXNCaXRfKHQsci5iLkJPVFRPTSkscz10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLHIuYi5CT1RUT00pLHU9ZS5udW1iZXJzLk1BUkdJTl9UT19FREdFO3JldHVybiBpPyhvPW4udG9wK3RoaXMuYW5jaG9yTWFyZ2luXy50b3AtdSxzfHwobys9dGhpcy5tZWFzdXJlbWVudHNfLmFuY2hvclNpemUuaGVpZ2h0KSk6KG89bi5ib3R0b20tdGhpcy5hbmNob3JNYXJnaW5fLmJvdHRvbSt0aGlzLm1lYXN1cmVtZW50c18uYW5jaG9yU2l6ZS5oZWlnaHQtdSxzJiYoby09dGhpcy5tZWFzdXJlbWVudHNfLmFuY2hvclNpemUuaGVpZ2h0KSksb30sZS5wcm90b3R5cGUuZ2V0SG9yaXpvbnRhbE9yaWdpbk9mZnNldF89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5tZWFzdXJlbWVudHNfLmFuY2hvclNpemUsbj10aGlzLmhhc0JpdF8odCxyLmIuUklHSFQpLG89dGhpcy5oYXNCaXRfKHRoaXMuYW5jaG9yQ29ybmVyXyxyLmIuUklHSFQpO2lmKG4pe3ZhciBpPW8/ZS53aWR0aC10aGlzLmFuY2hvck1hcmdpbl8ubGVmdDp0aGlzLmFuY2hvck1hcmdpbl8ucmlnaHQ7cmV0dXJuIHRoaXMuaXNIb2lzdGVkRWxlbWVudF98fHRoaXMuaXNGaXhlZFBvc2l0aW9uXz9pLSh0aGlzLm1lYXN1cmVtZW50c18udmlld3BvcnRTaXplLndpZHRoLXRoaXMubWVhc3VyZW1lbnRzXy5ib2R5U2l6ZS53aWR0aCk6aX1yZXR1cm4gbz9lLndpZHRoLXRoaXMuYW5jaG9yTWFyZ2luXy5yaWdodDp0aGlzLmFuY2hvck1hcmdpbl8ubGVmdH0sZS5wcm90b3R5cGUuZ2V0VmVydGljYWxPcmlnaW5PZmZzZXRfPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubWVhc3VyZW1lbnRzXy5hbmNob3JTaXplLG49dGhpcy5oYXNCaXRfKHQsci5iLkJPVFRPTSksbz10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLHIuYi5CT1RUT00pO3JldHVybiBuP28/ZS5oZWlnaHQtdGhpcy5hbmNob3JNYXJnaW5fLnRvcDotdGhpcy5hbmNob3JNYXJnaW5fLmJvdHRvbTpvP2UuaGVpZ2h0K3RoaXMuYW5jaG9yTWFyZ2luXy5ib3R0b206dGhpcy5hbmNob3JNYXJnaW5fLnRvcH0sZS5wcm90b3R5cGUuYWRqdXN0UG9zaXRpb25Gb3JIb2lzdGVkRWxlbWVudF89ZnVuY3Rpb24odCl7dmFyIGUsbixpPXRoaXMubWVhc3VyZW1lbnRzXyxyPWkud2luZG93U2Nyb2xsLHM9aS52aWV3cG9ydERpc3RhbmNlLHU9T2JqZWN0LmtleXModCk7dHJ5e2Zvcih2YXIgYT1vLmQodSksYz1hLm5leHQoKTshYy5kb25lO2M9YS5uZXh0KCkpe3ZhciBsPWMudmFsdWUsZj10W2xdfHwwO2YrPXNbbF0sdGhpcy5pc0ZpeGVkUG9zaXRpb25ffHwoXCJ0b3BcIj09PWw/Zis9ci55OlwiYm90dG9tXCI9PT1sP2YtPXIueTpcImxlZnRcIj09PWw/Zis9ci54OmYtPXIueCksdFtsXT1mfX1jYXRjaCh0KXtlPXtlcnJvcjp0fX1maW5hbGx5e3RyeXtjJiYhYy5kb25lJiYobj1hLnJldHVybikmJm4uY2FsbChhKX1maW5hbGx5e2lmKGUpdGhyb3cgZS5lcnJvcn19fSxlLnByb3RvdHlwZS5tYXliZVJlc3RvcmVGb2N1c189ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmFkYXB0ZXJfLmlzRm9jdXNlZCgpLGU9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCYmdGhpcy5hZGFwdGVyXy5pc0VsZW1lbnRJbkNvbnRhaW5lcihkb2N1bWVudC5hY3RpdmVFbGVtZW50KTsodHx8ZSkmJnRoaXMuYWRhcHRlcl8ucmVzdG9yZUZvY3VzKCl9LGUucHJvdG90eXBlLmhhc0JpdF89ZnVuY3Rpb24odCxlKXtyZXR1cm4gQm9vbGVhbih0JmUpfSxlLnByb3RvdHlwZS5zZXRCaXRfPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHR8ZX0sZS5wcm90b3R5cGUuaXNGaW5pdGVfPWZ1bmN0aW9uKHQpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiB0JiZpc0Zpbml0ZSh0KX0sZX0oaS5hKTtlLmRlZmF1bHQ9c30sMjg6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24uZChlLFwiYVwiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZvaWQgMD09PXQmJih0PXt9KSx0aGlzLmFkYXB0ZXJfPXR9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcInN0cmluZ3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJudW1iZXJzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe30sdH0oKX0sMzpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJjXCIsZnVuY3Rpb24oKXtyZXR1cm4gcn0pLG4uZChlLFwiZVwiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSxuLmQoZSxcImRcIixmdW5jdGlvbigpe3JldHVybiB1fSksbi5kKGUsXCJiXCIsZnVuY3Rpb24oKXtyZXR1cm4gb30pLG4uZChlLFwiYVwiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIG8saSxyPXtBTkNIT1I6XCJtZGMtbWVudS1zdXJmYWNlLS1hbmNob3JcIixBTklNQVRJTkdfQ0xPU0VEOlwibWRjLW1lbnUtc3VyZmFjZS0tYW5pbWF0aW5nLWNsb3NlZFwiLEFOSU1BVElOR19PUEVOOlwibWRjLW1lbnUtc3VyZmFjZS0tYW5pbWF0aW5nLW9wZW5cIixGSVhFRDpcIm1kYy1tZW51LXN1cmZhY2UtLWZpeGVkXCIsT1BFTjpcIm1kYy1tZW51LXN1cmZhY2UtLW9wZW5cIixST09UOlwibWRjLW1lbnUtc3VyZmFjZVwifSxzPXtDTE9TRURfRVZFTlQ6XCJNRENNZW51U3VyZmFjZTpjbG9zZWRcIixPUEVORURfRVZFTlQ6XCJNRENNZW51U3VyZmFjZTpvcGVuZWRcIixGT0NVU0FCTEVfRUxFTUVOVFM6W1wiYnV0dG9uOm5vdCg6ZGlzYWJsZWQpXCIsJ1tocmVmXTpub3QoW2FyaWEtZGlzYWJsZWQ9XCJ0cnVlXCJdKScsXCJpbnB1dDpub3QoOmRpc2FibGVkKVwiLFwic2VsZWN0Om5vdCg6ZGlzYWJsZWQpXCIsXCJ0ZXh0YXJlYTpub3QoOmRpc2FibGVkKVwiLCdbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9XCItMVwiXSk6bm90KFthcmlhLWRpc2FibGVkPVwidHJ1ZVwiXSknXS5qb2luKFwiLCBcIil9LHU9e1RSQU5TSVRJT05fT1BFTl9EVVJBVElPTjoxMjAsVFJBTlNJVElPTl9DTE9TRV9EVVJBVElPTjo3NSxNQVJHSU5fVE9fRURHRTozMixBTkNIT1JfVE9fTUVOVV9TVVJGQUNFX1dJRFRIX1JBVElPOi42N307IWZ1bmN0aW9uKHQpe3RbdC5CT1RUT009MV09XCJCT1RUT01cIix0W3QuQ0VOVEVSPTJdPVwiQ0VOVEVSXCIsdFt0LlJJR0hUPTRdPVwiUklHSFRcIix0W3QuRkxJUF9SVEw9OF09XCJGTElQX1JUTFwifShvfHwobz17fSkpLGZ1bmN0aW9uKHQpe3RbdC5UT1BfTEVGVD0wXT1cIlRPUF9MRUZUXCIsdFt0LlRPUF9SSUdIVD00XT1cIlRPUF9SSUdIVFwiLHRbdC5CT1RUT01fTEVGVD0xXT1cIkJPVFRPTV9MRUZUXCIsdFt0LkJPVFRPTV9SSUdIVD01XT1cIkJPVFRPTV9SSUdIVFwiLHRbdC5UT1BfU1RBUlQ9OF09XCJUT1BfU1RBUlRcIix0W3QuVE9QX0VORD0xMl09XCJUT1BfRU5EXCIsdFt0LkJPVFRPTV9TVEFSVD05XT1cIkJPVFRPTV9TVEFSVFwiLHRbdC5CT1RUT01fRU5EPTEzXT1cIkJPVFRPTV9FTkRcIn0oaXx8KGk9e30pKX19KX0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVudS1zdXJmYWNlLmpzLm1hcCIsIlxudmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbWVudS1zdXJmYWNlLmNzc1wiKTtcblxuaWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cbnZhciB0cmFuc2Zvcm07XG52YXIgaW5zZXJ0SW50bztcblxuXG5cbnZhciBvcHRpb25zID0ge1wiaG1yXCI6dHJ1ZX1cblxub3B0aW9ucy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1cbm9wdGlvbnMuaW5zZXJ0SW50byA9IHVuZGVmaW5lZDtcblxudmFyIHVwZGF0ZSA9IHJlcXVpcmUoXCIhLi4vLi4vLi4vc3R5bGUtbG9hZGVyL2xpYi9hZGRTdHlsZXMuanNcIikoY29udGVudCwgb3B0aW9ucyk7XG5cbmlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXG5pZihtb2R1bGUuaG90KSB7XG5cdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbWVudS1zdXJmYWNlLmNzc1wiLCBmdW5jdGlvbigpIHtcblx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9tZW51LXN1cmZhY2UuY3NzXCIpO1xuXG5cdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cblx0XHR2YXIgbG9jYWxzID0gKGZ1bmN0aW9uKGEsIGIpIHtcblx0XHRcdHZhciBrZXksIGlkeCA9IDA7XG5cblx0XHRcdGZvcihrZXkgaW4gYSkge1xuXHRcdFx0XHRpZighYiB8fCBhW2tleV0gIT09IGJba2V5XSkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRpZHgrKztcblx0XHRcdH1cblxuXHRcdFx0Zm9yKGtleSBpbiBiKSBpZHgtLTtcblxuXHRcdFx0cmV0dXJuIGlkeCA9PT0gMDtcblx0XHR9KGNvbnRlbnQubG9jYWxzLCBuZXdDb250ZW50LmxvY2FscykpO1xuXG5cdFx0aWYoIWxvY2FscykgdGhyb3cgbmV3IEVycm9yKCdBYm9ydGluZyBDU1MgSE1SIGR1ZSB0byBjaGFuZ2VkIGNzcy1tb2R1bGVzIGxvY2Fscy4nKTtcblxuXHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0fSk7XG5cblx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG59IiwiIWZ1bmN0aW9uKHQsZSl7aWYoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUpbW9kdWxlLmV4cG9ydHM9ZShyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcImNsYXNzbmFtZXNcIikscmVxdWlyZShcIkBtYXRlcmlhbC9yZWFjdC1saXN0L2Rpc3QvaW5kZXguanNcIikscmVxdWlyZShcIkBtYXRlcmlhbC9yZWFjdC1tZW51LXN1cmZhY2UvZGlzdC9pbmRleC5qc1wiKSk7ZWxzZSBpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQpZGVmaW5lKFtcInJlYWN0XCIsXCJjbGFzc25hbWVzXCIsXCJAbWF0ZXJpYWwvcmVhY3QtbGlzdC9kaXN0L2luZGV4LmpzXCIsXCJAbWF0ZXJpYWwvcmVhY3QtbWVudS1zdXJmYWNlL2Rpc3QvaW5kZXguanNcIl0sZSk7ZWxzZXt2YXIgbj1cIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9lKHJlcXVpcmUoXCJyZWFjdFwiKSxyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSxyZXF1aXJlKFwiQG1hdGVyaWFsL3JlYWN0LWxpc3QvZGlzdC9pbmRleC5qc1wiKSxyZXF1aXJlKFwiQG1hdGVyaWFsL3JlYWN0LW1lbnUtc3VyZmFjZS9kaXN0L2luZGV4LmpzXCIpKTplKHQucmVhY3QsdC5jbGFzc25hbWVzLHRbXCJAbWF0ZXJpYWwvcmVhY3QtbGlzdC9kaXN0L2luZGV4LmpzXCJdLHRbXCJAbWF0ZXJpYWwvcmVhY3QtbWVudS1zdXJmYWNlL2Rpc3QvaW5kZXguanNcIl0pO2Zvcih2YXIgaSBpbiBuKShcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnQpW2ldPW5baV19fShcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZj9zZWxmOnRoaXMsZnVuY3Rpb24odCxlLG4saSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4oaSl7aWYoZVtpXSlyZXR1cm4gZVtpXS5leHBvcnRzO3ZhciByPWVbaV09e2k6aSxsOiExLGV4cG9ydHM6e319O3JldHVybiB0W2ldLmNhbGwoci5leHBvcnRzLHIsci5leHBvcnRzLG4pLHIubD0hMCxyLmV4cG9ydHN9cmV0dXJuIG4ubT10LG4uYz1lLG4uZD1mdW5jdGlvbih0LGUsaSl7bi5vKHQsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2VudW1lcmFibGU6ITAsZ2V0Oml9KX0sbi5yPWZ1bmN0aW9uKHQpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbih0LGUpe2lmKDEmZSYmKHQ9bih0KSksOCZlKXJldHVybiB0O2lmKDQmZSYmXCJvYmplY3RcIj09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgaT1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihpKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTp0fSksMiZlJiZcInN0cmluZ1wiIT10eXBlb2YgdClmb3IodmFyIHIgaW4gdCluLmQoaSxyLGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfS5iaW5kKG51bGwscikpO3JldHVybiBpfSxuLm49ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIG4uZChlLFwiYVwiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPVwiXCIsbihuLnM9OTgpfSh7MDpmdW5jdGlvbihlLG4pe2UuZXhwb3J0cz10fSwxOmZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWV9LDEwMDpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4oaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSksbz10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihvPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciByIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scz10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIGkgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKSYmZS5pbmRleE9mKGkpPDAmJihuW2ldPXRbaV0pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPTA7Zm9yKGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtyPGkubGVuZ3RoO3IrKyllLmluZGV4T2YoaVtyXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsaVtyXSkmJihuW2lbcl1dPXRbaVtyXV0pfXJldHVybiBufSxhPXRoaXMmJnRoaXMuX19pbXBvcnRTdGFyfHxmdW5jdGlvbih0KXtpZih0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIGU9e307aWYobnVsbCE9dClmb3IodmFyIG4gaW4gdClPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pJiYoZVtuXT10W25dKTtyZXR1cm4gZS5kZWZhdWx0PXQsZX0sdT10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgYz1hKG4oMCkpLGQ9dShuKDMyKSksbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBlLmxpc3RJbnN0YW5jZT1jLmNyZWF0ZVJlZigpLGUuaGFuZGxlU2VsZWN0PWZ1bmN0aW9uKHQsbil7ZS5wcm9wcy5oYW5kbGVTZWxlY3QodCxuKSxlLnByb3BzLmhhbmRsZUl0ZW1BY3Rpb24oZS5saXN0RWxlbWVudHNbdF0pfSxlLmF0dGFjaFJlZj1mdW5jdGlvbih0KXt2YXIgbj1lLnByb3BzLmlubmVyUmVmO2UubGlzdEluc3RhbmNlLmN1cnJlbnQ9dCxuJiYoXCJmdW5jdGlvblwiIT10eXBlb2Ygbj9uLmN1cnJlbnQ9dDpuKHQpKX0sZX1yZXR1cm4gcihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImxpc3RFbGVtZW50c1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5saXN0SW5zdGFuY2UuY3VycmVudD90aGlzLmxpc3RJbnN0YW5jZS5jdXJyZW50Lmxpc3RFbGVtZW50czpbXX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9dFtcImFyaWEtaGlkZGVuXCJdLG49KHQuaGFuZGxlU2VsZWN0LHQuaGFuZGxlSXRlbUFjdGlvbix0LnJvbGUpLGk9KHQuaW5uZXJSZWYsdC5jaGlsZHJlbikscj0odC5yZWYscyh0LFtcImFyaWEtaGlkZGVuXCIsXCJoYW5kbGVTZWxlY3RcIixcImhhbmRsZUl0ZW1BY3Rpb25cIixcInJvbGVcIixcImlubmVyUmVmXCIsXCJjaGlsZHJlblwiLFwicmVmXCJdKSk7cmV0dXJuIGMuY3JlYXRlRWxlbWVudChkLmRlZmF1bHQsbyh7XCJhcmlhLWhpZGRlblwiOnZvaWQgMCE9PWU/ZTpcInRydWVcIixyb2xlOm58fFwibWVudVwiLGhhbmRsZVNlbGVjdDp0aGlzLmhhbmRsZVNlbGVjdCxyZWY6dGhpcy5hdHRhY2hSZWZ9LHIpLGkpfSxlLmRlZmF1bHRQcm9wcz17Y2xhc3NOYW1lOlwiXCIsaGFuZGxlU2VsZWN0OmZ1bmN0aW9uKCl7fSxoYW5kbGVJdGVtQWN0aW9uOmZ1bmN0aW9uKCl7fX0sZX0oYy5Db21wb25lbnQpO2UuZGVmYXVsdD1sfSwxMDE6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9KSh0LGUpfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLG89dGhpcyYmdGhpcy5fX2Fzc2lnbnx8ZnVuY3Rpb24oKXtyZXR1cm4obz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgciBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmKHRbcl09ZVtyXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHM9dGhpcyYmdGhpcy5fX3Jlc3R8fGZ1bmN0aW9uKHQsZSl7dmFyIG49e307Zm9yKHZhciBpIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsaSkmJmUuaW5kZXhPZihpKTwwJiYobltpXT10W2ldKTtpZihudWxsIT10JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj0wO2ZvcihpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7cjxpLmxlbmd0aDtyKyspZS5pbmRleE9mKGlbcl0pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LGlbcl0pJiYobltpW3JdXT10W2lbcl1dKX1yZXR1cm4gbn0sYT10aGlzJiZ0aGlzLl9faW1wb3J0U3Rhcnx8ZnVuY3Rpb24odCl7aWYodCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBlPXt9O2lmKG51bGwhPXQpZm9yKHZhciBuIGluIHQpT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGVbbl09dFtuXSk7cmV0dXJuIGUuZGVmYXVsdD10LGV9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciB1PWEobigwKSksYz1uKDMyKSxkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcyxlPXQucm9sZSxuPXZvaWQgMD09PWU/XCJtZW51aXRlbVwiOmUsaT10LmNoaWxkcmVuLHI9KHQuY29tcHV0ZUJvdW5kaW5nUmVjdCxzKHQsW1wicm9sZVwiLFwiY2hpbGRyZW5cIixcImNvbXB1dGVCb3VuZGluZ1JlY3RcIl0pKTtyZXR1cm4gdS5jcmVhdGVFbGVtZW50KGMuTGlzdEl0ZW0sbyh7cm9sZTpufSxyKSxpKX0sZX0odS5Db21wb25lbnQpO2UuZGVmYXVsdD1kfSwxNDg6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24ucihlKTtcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvcjtcbi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXG5MaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG5LSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVEXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cblxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL3ZhciBpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9KSh0LGUpfTtmdW5jdGlvbiByKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfXZhciBvPWZ1bmN0aW9uKCl7cmV0dXJuKG89T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtmdW5jdGlvbiBzKHQpe3ZhciBlPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdLG49MDtyZXR1cm4gZT9lLmNhbGwodCk6e25leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdCYmbj49dC5sZW5ndGgmJih0PXZvaWQgMCkse3ZhbHVlOnQmJnRbbisrXSxkb25lOiF0fX19fVxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG52YXIgYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dm9pZCAwPT09dCYmKHQ9e30pLHRoaXMuYWRhcHRlcl89dH1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJjc3NDbGFzc2VzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwic3RyaW5nc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIm51bWJlcnNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJkZWZhdWx0QWRhcHRlclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7fSx0fSgpLHU9e0xJU1RfSVRFTV9BQ1RJVkFURURfQ0xBU1M6XCJtZGMtbGlzdC1pdGVtLS1hY3RpdmF0ZWRcIixMSVNUX0lURU1fQ0xBU1M6XCJtZGMtbGlzdC1pdGVtXCIsTElTVF9JVEVNX1NFTEVDVEVEX0NMQVNTOlwibWRjLWxpc3QtaXRlbS0tc2VsZWN0ZWRcIixST09UOlwibWRjLWxpc3RcIn0sYz17QUNUSU9OX0VWRU5UOlwiTURDTGlzdDphY3Rpb25cIixBUklBX0NIRUNLRUQ6XCJhcmlhLWNoZWNrZWRcIixBUklBX0NIRUNLRURfQ0hFQ0tCT1hfU0VMRUNUT1I6J1tyb2xlPVwiY2hlY2tib3hcIl1bYXJpYS1jaGVja2VkPVwidHJ1ZVwiXScsQVJJQV9DSEVDS0VEX1JBRElPX1NFTEVDVE9SOidbcm9sZT1cInJhZGlvXCJdW2FyaWEtY2hlY2tlZD1cInRydWVcIl0nLEFSSUFfQ1VSUkVOVDpcImFyaWEtY3VycmVudFwiLEFSSUFfT1JJRU5UQVRJT046XCJhcmlhLW9yaWVudGF0aW9uXCIsQVJJQV9PUklFTlRBVElPTl9IT1JJWk9OVEFMOlwiaG9yaXpvbnRhbFwiLEFSSUFfUk9MRV9DSEVDS0JPWF9TRUxFQ1RPUjonW3JvbGU9XCJjaGVja2JveFwiXScsQVJJQV9TRUxFQ1RFRDpcImFyaWEtc2VsZWN0ZWRcIixDSEVDS0JPWF9SQURJT19TRUxFQ1RPUjonaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOm5vdCg6ZGlzYWJsZWQpLCBpbnB1dFt0eXBlPVwicmFkaW9cIl06bm90KDpkaXNhYmxlZCknLENIRUNLQk9YX1NFTEVDVE9SOidpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06bm90KDpkaXNhYmxlZCknLENISUxEX0VMRU1FTlRTX1RPX1RPR0dMRV9UQUJJTkRFWDpcIlxcbiAgICAuXCIrdS5MSVNUX0lURU1fQ0xBU1MrXCIgYnV0dG9uOm5vdCg6ZGlzYWJsZWQpLFxcbiAgICAuXCIrdS5MSVNUX0lURU1fQ0xBU1MrXCIgYVxcbiAgXCIsRU5BQkxFRF9JVEVNU19TRUxFQ1RPUjpcIi5tZGMtbGlzdC1pdGVtOm5vdCgubWRjLWxpc3QtaXRlbS0tZGlzYWJsZWQpXCIsRk9DVVNBQkxFX0NISUxEX0VMRU1FTlRTOlwiXFxuICAgIC5cIit1LkxJU1RfSVRFTV9DTEFTUytcIiBidXR0b246bm90KDpkaXNhYmxlZCksXFxuICAgIC5cIit1LkxJU1RfSVRFTV9DTEFTUytcIiBhLFxcbiAgICAuXCIrdS5MSVNUX0lURU1fQ0xBU1MrJyBpbnB1dFt0eXBlPVwicmFkaW9cIl06bm90KDpkaXNhYmxlZCksXFxuICAgIC4nK3UuTElTVF9JVEVNX0NMQVNTKycgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOm5vdCg6ZGlzYWJsZWQpXFxuICAnLFJBRElPX1NFTEVDVE9SOidpbnB1dFt0eXBlPVwicmFkaW9cIl06bm90KDpkaXNhYmxlZCknfSxkPXtVTlNFVF9JTkRFWDotMX0sbD1bXCJpbnB1dFwiLFwiYnV0dG9uXCIsXCJ0ZXh0YXJlYVwiLFwic2VsZWN0XCJdO3ZhciBoLHAsZj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciBpPXQuY2FsbCh0aGlzLG8oe30sZS5kZWZhdWx0QWRhcHRlcixuKSl8fHRoaXM7cmV0dXJuIGkud3JhcEZvY3VzXz0hMSxpLmlzVmVydGljYWxfPSEwLGkuaXNTaW5nbGVTZWxlY3Rpb25MaXN0Xz0hMSxpLnNlbGVjdGVkSW5kZXhfPWQuVU5TRVRfSU5ERVgsaS5mb2N1c2VkSXRlbUluZGV4Xz1kLlVOU0VUX0lOREVYLGkudXNlQWN0aXZhdGVkQ2xhc3NfPSExLGkuYXJpYUN1cnJlbnRBdHRyVmFsdWVfPW51bGwsaS5pc0NoZWNrYm94TGlzdF89ITEsaS5pc1JhZGlvTGlzdF89ITEsaX1yZXR1cm4gcihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwic3RyaW5nc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJudW1iZXJzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2FkZENsYXNzRm9yRWxlbWVudEluZGV4OmZ1bmN0aW9uKCl7fSxmb2N1c0l0ZW1BdEluZGV4OmZ1bmN0aW9uKCl7fSxnZXRBdHRyaWJ1dGVGb3JFbGVtZW50SW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sZ2V0Rm9jdXNlZEVsZW1lbnRJbmRleDpmdW5jdGlvbigpe3JldHVybiAwfSxnZXRMaXN0SXRlbUNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGhhc0NoZWNrYm94QXRJbmRleDpmdW5jdGlvbigpe3JldHVybiExfSxoYXNSYWRpb0F0SW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXNDaGVja2JveENoZWNrZWRBdEluZGV4OmZ1bmN0aW9uKCl7cmV0dXJuITF9LGlzRm9jdXNJbnNpZGVMaXN0OmZ1bmN0aW9uKCl7cmV0dXJuITF9LG5vdGlmeUFjdGlvbjpmdW5jdGlvbigpe30scmVtb3ZlQ2xhc3NGb3JFbGVtZW50SW5kZXg6ZnVuY3Rpb24oKXt9LHNldEF0dHJpYnV0ZUZvckVsZW1lbnRJbmRleDpmdW5jdGlvbigpe30sc2V0Q2hlY2tlZENoZWNrYm94T3JSYWRpb0F0SW5kZXg6ZnVuY3Rpb24oKXt9LHNldFRhYkluZGV4Rm9yTGlzdEl0ZW1DaGlsZHJlbjpmdW5jdGlvbigpe319fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmxheW91dD1mdW5jdGlvbigpezAhPT10aGlzLmFkYXB0ZXJfLmdldExpc3RJdGVtQ291bnQoKSYmKHRoaXMuYWRhcHRlcl8uaGFzQ2hlY2tib3hBdEluZGV4KDApP3RoaXMuaXNDaGVja2JveExpc3RfPSEwOnRoaXMuYWRhcHRlcl8uaGFzUmFkaW9BdEluZGV4KDApJiYodGhpcy5pc1JhZGlvTGlzdF89ITApKX0sZS5wcm90b3R5cGUuc2V0V3JhcEZvY3VzPWZ1bmN0aW9uKHQpe3RoaXMud3JhcEZvY3VzXz10fSxlLnByb3RvdHlwZS5zZXRWZXJ0aWNhbE9yaWVudGF0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuaXNWZXJ0aWNhbF89dH0sZS5wcm90b3R5cGUuc2V0U2luZ2xlU2VsZWN0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuaXNTaW5nbGVTZWxlY3Rpb25MaXN0Xz10fSxlLnByb3RvdHlwZS5zZXRVc2VBY3RpdmF0ZWRDbGFzcz1mdW5jdGlvbih0KXt0aGlzLnVzZUFjdGl2YXRlZENsYXNzXz10fSxlLnByb3RvdHlwZS5nZXRTZWxlY3RlZEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0ZWRJbmRleF99LGUucHJvdG90eXBlLnNldFNlbGVjdGVkSW5kZXg9ZnVuY3Rpb24odCl7dGhpcy5pc0luZGV4VmFsaWRfKHQpJiYodGhpcy5pc0NoZWNrYm94TGlzdF8/dGhpcy5zZXRDaGVja2JveEF0SW5kZXhfKHQpOnRoaXMuaXNSYWRpb0xpc3RfP3RoaXMuc2V0UmFkaW9BdEluZGV4Xyh0KTp0aGlzLnNldFNpbmdsZVNlbGVjdGlvbkF0SW5kZXhfKHQpKX0sZS5wcm90b3R5cGUuaGFuZGxlRm9jdXNJbj1mdW5jdGlvbih0LGUpe2U+PTAmJnRoaXMuYWRhcHRlcl8uc2V0VGFiSW5kZXhGb3JMaXN0SXRlbUNoaWxkcmVuKGUsXCIwXCIpfSxlLnByb3RvdHlwZS5oYW5kbGVGb2N1c091dD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7ZT49MCYmdGhpcy5hZGFwdGVyXy5zZXRUYWJJbmRleEZvckxpc3RJdGVtQ2hpbGRyZW4oZSxcIi0xXCIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtuLmFkYXB0ZXJfLmlzRm9jdXNJbnNpZGVMaXN0KCl8fG4uc2V0VGFiaW5kZXhUb0ZpcnN0U2VsZWN0ZWRJdGVtXygpfSwwKX0sZS5wcm90b3R5cGUuaGFuZGxlS2V5ZG93bj1mdW5jdGlvbih0LGUsbil7dmFyIGk9XCJBcnJvd0xlZnRcIj09PXQua2V5fHwzNz09PXQua2V5Q29kZSxyPVwiQXJyb3dVcFwiPT09dC5rZXl8fDM4PT09dC5rZXlDb2RlLG89XCJBcnJvd1JpZ2h0XCI9PT10LmtleXx8Mzk9PT10LmtleUNvZGUscz1cIkFycm93RG93blwiPT09dC5rZXl8fDQwPT09dC5rZXlDb2RlLGE9XCJIb21lXCI9PT10LmtleXx8MzY9PT10LmtleUNvZGUsdT1cIkVuZFwiPT09dC5rZXl8fDM1PT09dC5rZXlDb2RlLGM9XCJFbnRlclwiPT09dC5rZXl8fDEzPT09dC5rZXlDb2RlLGw9XCJTcGFjZVwiPT09dC5rZXl8fDMyPT09dC5rZXlDb2RlLGg9dGhpcy5hZGFwdGVyXy5nZXRGb2N1c2VkRWxlbWVudEluZGV4KCkscD1kLlVOU0VUX0lOREVYO2lmKCEoaD09PWQuVU5TRVRfSU5ERVgmJihoPW4pPDApKXtpZih0aGlzLmlzVmVydGljYWxfJiZzfHwhdGhpcy5pc1ZlcnRpY2FsXyYmbyl0aGlzLnByZXZlbnREZWZhdWx0RXZlbnRfKHQpLHA9dGhpcy5mb2N1c05leHRFbGVtZW50KGgpO2Vsc2UgaWYodGhpcy5pc1ZlcnRpY2FsXyYmcnx8IXRoaXMuaXNWZXJ0aWNhbF8mJmkpdGhpcy5wcmV2ZW50RGVmYXVsdEV2ZW50Xyh0KSxwPXRoaXMuZm9jdXNQcmV2RWxlbWVudChoKTtlbHNlIGlmKGEpdGhpcy5wcmV2ZW50RGVmYXVsdEV2ZW50Xyh0KSxwPXRoaXMuZm9jdXNGaXJzdEVsZW1lbnQoKTtlbHNlIGlmKHUpdGhpcy5wcmV2ZW50RGVmYXVsdEV2ZW50Xyh0KSxwPXRoaXMuZm9jdXNMYXN0RWxlbWVudCgpO2Vsc2UgaWYoKGN8fGwpJiZlKXt2YXIgZj10LnRhcmdldDtpZihmJiZcIkFcIj09PWYudGFnTmFtZSYmYylyZXR1cm47dGhpcy5wcmV2ZW50RGVmYXVsdEV2ZW50Xyh0KSx0aGlzLmlzU2VsZWN0YWJsZUxpc3RfKCkmJnRoaXMuc2V0U2VsZWN0ZWRJbmRleE9uQWN0aW9uXyhoKSx0aGlzLmFkYXB0ZXJfLm5vdGlmeUFjdGlvbihoKX10aGlzLmZvY3VzZWRJdGVtSW5kZXhfPWgscD49MCYmKHRoaXMuc2V0VGFiaW5kZXhBdEluZGV4XyhwKSx0aGlzLmZvY3VzZWRJdGVtSW5kZXhfPXApfX0sZS5wcm90b3R5cGUuaGFuZGxlQ2xpY2s9ZnVuY3Rpb24odCxlKXt0IT09ZC5VTlNFVF9JTkRFWCYmKHRoaXMuaXNTZWxlY3RhYmxlTGlzdF8oKSYmdGhpcy5zZXRTZWxlY3RlZEluZGV4T25BY3Rpb25fKHQsZSksdGhpcy5hZGFwdGVyXy5ub3RpZnlBY3Rpb24odCksdGhpcy5zZXRUYWJpbmRleEF0SW5kZXhfKHQpLHRoaXMuZm9jdXNlZEl0ZW1JbmRleF89dCl9LGUucHJvdG90eXBlLmZvY3VzTmV4dEVsZW1lbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dCsxO2lmKGU+PXRoaXMuYWRhcHRlcl8uZ2V0TGlzdEl0ZW1Db3VudCgpKXtpZighdGhpcy53cmFwRm9jdXNfKXJldHVybiB0O2U9MH1yZXR1cm4gdGhpcy5hZGFwdGVyXy5mb2N1c0l0ZW1BdEluZGV4KGUpLGV9LGUucHJvdG90eXBlLmZvY3VzUHJldkVsZW1lbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dC0xO2lmKGU8MCl7aWYoIXRoaXMud3JhcEZvY3VzXylyZXR1cm4gdDtlPXRoaXMuYWRhcHRlcl8uZ2V0TGlzdEl0ZW1Db3VudCgpLTF9cmV0dXJuIHRoaXMuYWRhcHRlcl8uZm9jdXNJdGVtQXRJbmRleChlKSxlfSxlLnByb3RvdHlwZS5mb2N1c0ZpcnN0RWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFkYXB0ZXJfLmZvY3VzSXRlbUF0SW5kZXgoMCksMH0sZS5wcm90b3R5cGUuZm9jdXNMYXN0RWxlbWVudD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYWRhcHRlcl8uZ2V0TGlzdEl0ZW1Db3VudCgpLTE7cmV0dXJuIHRoaXMuYWRhcHRlcl8uZm9jdXNJdGVtQXRJbmRleCh0KSx0fSxlLnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdEV2ZW50Xz1mdW5jdGlvbih0KXt2YXIgZT0oXCJcIit0LnRhcmdldC50YWdOYW1lKS50b0xvd2VyQ2FzZSgpOy0xPT09bC5pbmRleE9mKGUpJiZ0LnByZXZlbnREZWZhdWx0KCl9LGUucHJvdG90eXBlLnNldFNpbmdsZVNlbGVjdGlvbkF0SW5kZXhfPWZ1bmN0aW9uKHQpe2lmKHRoaXMuc2VsZWN0ZWRJbmRleF8hPT10KXt2YXIgZT11LkxJU1RfSVRFTV9TRUxFQ1RFRF9DTEFTUzt0aGlzLnVzZUFjdGl2YXRlZENsYXNzXyYmKGU9dS5MSVNUX0lURU1fQUNUSVZBVEVEX0NMQVNTKSx0aGlzLnNlbGVjdGVkSW5kZXhfIT09ZC5VTlNFVF9JTkRFWCYmdGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzc0ZvckVsZW1lbnRJbmRleCh0aGlzLnNlbGVjdGVkSW5kZXhfLGUpLHRoaXMuYWRhcHRlcl8uYWRkQ2xhc3NGb3JFbGVtZW50SW5kZXgodCxlKSx0aGlzLnNldEFyaWFGb3JTaW5nbGVTZWxlY3Rpb25BdEluZGV4Xyh0KSx0aGlzLnNlbGVjdGVkSW5kZXhfPXR9fSxlLnByb3RvdHlwZS5zZXRBcmlhRm9yU2luZ2xlU2VsZWN0aW9uQXRJbmRleF89ZnVuY3Rpb24odCl7dGhpcy5zZWxlY3RlZEluZGV4Xz09PWQuVU5TRVRfSU5ERVgmJih0aGlzLmFyaWFDdXJyZW50QXR0clZhbHVlXz10aGlzLmFkYXB0ZXJfLmdldEF0dHJpYnV0ZUZvckVsZW1lbnRJbmRleCh0LGMuQVJJQV9DVVJSRU5UKSk7dmFyIGU9bnVsbCE9PXRoaXMuYXJpYUN1cnJlbnRBdHRyVmFsdWVfLG49ZT9jLkFSSUFfQ1VSUkVOVDpjLkFSSUFfU0VMRUNURUQ7dGhpcy5zZWxlY3RlZEluZGV4XyE9PWQuVU5TRVRfSU5ERVgmJnRoaXMuYWRhcHRlcl8uc2V0QXR0cmlidXRlRm9yRWxlbWVudEluZGV4KHRoaXMuc2VsZWN0ZWRJbmRleF8sbixcImZhbHNlXCIpO3ZhciBpPWU/dGhpcy5hcmlhQ3VycmVudEF0dHJWYWx1ZV86XCJ0cnVlXCI7dGhpcy5hZGFwdGVyXy5zZXRBdHRyaWJ1dGVGb3JFbGVtZW50SW5kZXgodCxuLGkpfSxlLnByb3RvdHlwZS5zZXRSYWRpb0F0SW5kZXhfPWZ1bmN0aW9uKHQpe3RoaXMuYWRhcHRlcl8uc2V0Q2hlY2tlZENoZWNrYm94T3JSYWRpb0F0SW5kZXgodCwhMCksdGhpcy5zZWxlY3RlZEluZGV4XyE9PWQuVU5TRVRfSU5ERVgmJnRoaXMuYWRhcHRlcl8uc2V0QXR0cmlidXRlRm9yRWxlbWVudEluZGV4KHRoaXMuc2VsZWN0ZWRJbmRleF8sYy5BUklBX0NIRUNLRUQsXCJmYWxzZVwiKSx0aGlzLmFkYXB0ZXJfLnNldEF0dHJpYnV0ZUZvckVsZW1lbnRJbmRleCh0LGMuQVJJQV9DSEVDS0VELFwidHJ1ZVwiKSx0aGlzLnNlbGVjdGVkSW5kZXhfPXR9LGUucHJvdG90eXBlLnNldENoZWNrYm94QXRJbmRleF89ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmFkYXB0ZXJfLmdldExpc3RJdGVtQ291bnQoKTtlKyspe3ZhciBuPSExO3QuaW5kZXhPZihlKT49MCYmKG49ITApLHRoaXMuYWRhcHRlcl8uc2V0Q2hlY2tlZENoZWNrYm94T3JSYWRpb0F0SW5kZXgoZSxuKSx0aGlzLmFkYXB0ZXJfLnNldEF0dHJpYnV0ZUZvckVsZW1lbnRJbmRleChlLGMuQVJJQV9DSEVDS0VELG4/XCJ0cnVlXCI6XCJmYWxzZVwiKX10aGlzLnNlbGVjdGVkSW5kZXhfPXR9LGUucHJvdG90eXBlLnNldFRhYmluZGV4QXRJbmRleF89ZnVuY3Rpb24odCl7dGhpcy5mb2N1c2VkSXRlbUluZGV4Xz09PWQuVU5TRVRfSU5ERVgmJjAhPT10P3RoaXMuYWRhcHRlcl8uc2V0QXR0cmlidXRlRm9yRWxlbWVudEluZGV4KDAsXCJ0YWJpbmRleFwiLFwiLTFcIik6dGhpcy5mb2N1c2VkSXRlbUluZGV4Xz49MCYmdGhpcy5mb2N1c2VkSXRlbUluZGV4XyE9PXQmJnRoaXMuYWRhcHRlcl8uc2V0QXR0cmlidXRlRm9yRWxlbWVudEluZGV4KHRoaXMuZm9jdXNlZEl0ZW1JbmRleF8sXCJ0YWJpbmRleFwiLFwiLTFcIiksdGhpcy5hZGFwdGVyXy5zZXRBdHRyaWJ1dGVGb3JFbGVtZW50SW5kZXgodCxcInRhYmluZGV4XCIsXCIwXCIpfSxlLnByb3RvdHlwZS5pc1NlbGVjdGFibGVMaXN0Xz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzU2luZ2xlU2VsZWN0aW9uTGlzdF98fHRoaXMuaXNDaGVja2JveExpc3RffHx0aGlzLmlzUmFkaW9MaXN0X30sZS5wcm90b3R5cGUuc2V0VGFiaW5kZXhUb0ZpcnN0U2VsZWN0ZWRJdGVtXz1mdW5jdGlvbigpe3ZhciB0PTA7dGhpcy5pc1NlbGVjdGFibGVMaXN0XygpJiYoXCJudW1iZXJcIj09dHlwZW9mIHRoaXMuc2VsZWN0ZWRJbmRleF8mJnRoaXMuc2VsZWN0ZWRJbmRleF8hPT1kLlVOU0VUX0lOREVYP3Q9dGhpcy5zZWxlY3RlZEluZGV4Xzp0aGlzLnNlbGVjdGVkSW5kZXhfIGluc3RhbmNlb2YgQXJyYXkmJnRoaXMuc2VsZWN0ZWRJbmRleF8ubGVuZ3RoPjAmJih0PXRoaXMuc2VsZWN0ZWRJbmRleF8ucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgubWluKHQsZSl9KSkpLHRoaXMuc2V0VGFiaW5kZXhBdEluZGV4Xyh0KX0sZS5wcm90b3R5cGUuaXNJbmRleFZhbGlkXz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKHQgaW5zdGFuY2VvZiBBcnJheSl7aWYoIXRoaXMuaXNDaGVja2JveExpc3RfKXRocm93IG5ldyBFcnJvcihcIk1EQ0xpc3RGb3VuZGF0aW9uOiBBcnJheSBvZiBpbmRleCBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2hlY2tib3ggYmFzZWQgbGlzdFwiKTtyZXR1cm4gMD09PXQubGVuZ3RofHx0LnNvbWUoZnVuY3Rpb24odCl7cmV0dXJuIGUuaXNJbmRleEluUmFuZ2VfKHQpfSl9aWYoXCJudW1iZXJcIj09dHlwZW9mIHQpe2lmKHRoaXMuaXNDaGVja2JveExpc3RfKXRocm93IG5ldyBFcnJvcihcIk1EQ0xpc3RGb3VuZGF0aW9uOiBFeHBlY3RlZCBhcnJheSBvZiBpbmRleCBmb3IgY2hlY2tib3ggYmFzZWQgbGlzdCBidXQgZ290IG51bWJlcjogXCIrdCk7cmV0dXJuIHRoaXMuaXNJbmRleEluUmFuZ2VfKHQpfXJldHVybiExfSxlLnByb3RvdHlwZS5pc0luZGV4SW5SYW5nZV89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hZGFwdGVyXy5nZXRMaXN0SXRlbUNvdW50KCk7cmV0dXJuIHQ+PTAmJnQ8ZX0sZS5wcm90b3R5cGUuc2V0U2VsZWN0ZWRJbmRleE9uQWN0aW9uXz1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPSEwKSx0aGlzLmlzQ2hlY2tib3hMaXN0Xz90aGlzLnRvZ2dsZUNoZWNrYm94QXRJbmRleF8odCxlKTp0aGlzLnNldFNlbGVjdGVkSW5kZXgodCl9LGUucHJvdG90eXBlLnRvZ2dsZUNoZWNrYm94QXRJbmRleF89ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmFkYXB0ZXJfLmlzQ2hlY2tib3hDaGVja2VkQXRJbmRleCh0KTtlJiYobj0hbix0aGlzLmFkYXB0ZXJfLnNldENoZWNrZWRDaGVja2JveE9yUmFkaW9BdEluZGV4KHQsbikpLHRoaXMuYWRhcHRlcl8uc2V0QXR0cmlidXRlRm9yRWxlbWVudEluZGV4KHQsYy5BUklBX0NIRUNLRUQsbj9cInRydWVcIjpcImZhbHNlXCIpO3ZhciBpPXRoaXMuc2VsZWN0ZWRJbmRleF89PT1kLlVOU0VUX0lOREVYP1tdOnRoaXMuc2VsZWN0ZWRJbmRleF8uc2xpY2UoKTtuP2kucHVzaCh0KTppPWkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlIT09dH0pLHRoaXMuc2VsZWN0ZWRJbmRleF89aX0sZX0oYSksXz17QU5DSE9SOlwibWRjLW1lbnUtc3VyZmFjZS0tYW5jaG9yXCIsQU5JTUFUSU5HX0NMT1NFRDpcIm1kYy1tZW51LXN1cmZhY2UtLWFuaW1hdGluZy1jbG9zZWRcIixBTklNQVRJTkdfT1BFTjpcIm1kYy1tZW51LXN1cmZhY2UtLWFuaW1hdGluZy1vcGVuXCIsRklYRUQ6XCJtZGMtbWVudS1zdXJmYWNlLS1maXhlZFwiLE9QRU46XCJtZGMtbWVudS1zdXJmYWNlLS1vcGVuXCIsUk9PVDpcIm1kYy1tZW51LXN1cmZhY2VcIn0sbT17Q0xPU0VEX0VWRU5UOlwiTURDTWVudVN1cmZhY2U6Y2xvc2VkXCIsT1BFTkVEX0VWRU5UOlwiTURDTWVudVN1cmZhY2U6b3BlbmVkXCIsRk9DVVNBQkxFX0VMRU1FTlRTOltcImJ1dHRvbjpub3QoOmRpc2FibGVkKVwiLCdbaHJlZl06bm90KFthcmlhLWRpc2FibGVkPVwidHJ1ZVwiXSknLFwiaW5wdXQ6bm90KDpkaXNhYmxlZClcIixcInNlbGVjdDpub3QoOmRpc2FibGVkKVwiLFwidGV4dGFyZWE6bm90KDpkaXNhYmxlZClcIiwnW3RhYmluZGV4XTpub3QoW3RhYmluZGV4PVwiLTFcIl0pOm5vdChbYXJpYS1kaXNhYmxlZD1cInRydWVcIl0pJ10uam9pbihcIiwgXCIpfSxFPXtUUkFOU0lUSU9OX09QRU5fRFVSQVRJT046MTIwLFRSQU5TSVRJT05fQ0xPU0VfRFVSQVRJT046NzUsTUFSR0lOX1RPX0VER0U6MzIsQU5DSE9SX1RPX01FTlVfU1VSRkFDRV9XSURUSF9SQVRJTzouNjd9OyFmdW5jdGlvbih0KXt0W3QuQk9UVE9NPTFdPVwiQk9UVE9NXCIsdFt0LkNFTlRFUj0yXT1cIkNFTlRFUlwiLHRbdC5SSUdIVD00XT1cIlJJR0hUXCIsdFt0LkZMSVBfUlRMPThdPVwiRkxJUF9SVExcIn0oaHx8KGg9e30pKSxmdW5jdGlvbih0KXt0W3QuVE9QX0xFRlQ9MF09XCJUT1BfTEVGVFwiLHRbdC5UT1BfUklHSFQ9NF09XCJUT1BfUklHSFRcIix0W3QuQk9UVE9NX0xFRlQ9MV09XCJCT1RUT01fTEVGVFwiLHRbdC5CT1RUT01fUklHSFQ9NV09XCJCT1RUT01fUklHSFRcIix0W3QuVE9QX1NUQVJUPThdPVwiVE9QX1NUQVJUXCIsdFt0LlRPUF9FTkQ9MTJdPVwiVE9QX0VORFwiLHRbdC5CT1RUT01fU1RBUlQ9OV09XCJCT1RUT01fU1RBUlRcIix0W3QuQk9UVE9NX0VORD0xM109XCJCT1RUT01fRU5EXCJ9KHB8fChwPXt9KSk7XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cbnZhciBJPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobil7dmFyIGk9dC5jYWxsKHRoaXMsbyh7fSxlLmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpcztyZXR1cm4gaS5pc09wZW5fPSExLGkuaXNRdWlja09wZW5fPSExLGkuaXNIb2lzdGVkRWxlbWVudF89ITEsaS5pc0ZpeGVkUG9zaXRpb25fPSExLGkub3BlbkFuaW1hdGlvbkVuZFRpbWVySWRfPTAsaS5jbG9zZUFuaW1hdGlvbkVuZFRpbWVySWRfPTAsaS5hbmltYXRpb25SZXF1ZXN0SWRfPTAsaS5hbmNob3JDb3JuZXJfPXAuVE9QX1NUQVJULGkuYW5jaG9yTWFyZ2luXz17dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjB9LGkucG9zaXRpb25fPXt4OjAseTowfSxpfXJldHVybiByKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJjc3NDbGFzc2VzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBffSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwic3RyaW5nc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIm51bWJlcnNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJDb3JuZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHB9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJkZWZhdWx0QWRhcHRlclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57YWRkQ2xhc3M6ZnVuY3Rpb24oKXt9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKCl7fSxoYXNDbGFzczpmdW5jdGlvbigpe3JldHVybiExfSxoYXNBbmNob3I6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXNFbGVtZW50SW5Db250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXNGb2N1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGlzRmlyc3RFbGVtZW50Rm9jdXNlZDpmdW5jdGlvbigpe3JldHVybiExfSxpc0xhc3RFbGVtZW50Rm9jdXNlZDpmdW5jdGlvbigpe3JldHVybiExfSxpc1J0bDpmdW5jdGlvbigpe3JldHVybiExfSxnZXRJbm5lckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm57aGVpZ2h0OjAsd2lkdGg6MH19LGdldEFuY2hvckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sZ2V0V2luZG93RGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybntoZWlnaHQ6MCx3aWR0aDowfX0sZ2V0Qm9keURpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm57aGVpZ2h0OjAsd2lkdGg6MH19LGdldFdpbmRvd1Njcm9sbDpmdW5jdGlvbigpe3JldHVybnt4OjAseTowfX0sc2V0UG9zaXRpb246ZnVuY3Rpb24oKXt9LHNldE1heEhlaWdodDpmdW5jdGlvbigpe30sc2V0VHJhbnNmb3JtT3JpZ2luOmZ1bmN0aW9uKCl7fSxzYXZlRm9jdXM6ZnVuY3Rpb24oKXt9LHJlc3RvcmVGb2N1czpmdW5jdGlvbigpe30sZm9jdXNGaXJzdEVsZW1lbnQ6ZnVuY3Rpb24oKXt9LGZvY3VzTGFzdEVsZW1lbnQ6ZnVuY3Rpb24oKXt9LG5vdGlmeUNsb3NlOmZ1bmN0aW9uKCl7fSxub3RpZnlPcGVuOmZ1bmN0aW9uKCl7fX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciB0PWUuY3NzQ2xhc3NlcyxuPXQuUk9PVCxpPXQuT1BFTjtpZighdGhpcy5hZGFwdGVyXy5oYXNDbGFzcyhuKSl0aHJvdyBuZXcgRXJyb3IobitcIiBjbGFzcyByZXF1aXJlZCBpbiByb290IGVsZW1lbnQuXCIpO3RoaXMuYWRhcHRlcl8uaGFzQ2xhc3MoaSkmJih0aGlzLmlzT3Blbl89ITApfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMub3BlbkFuaW1hdGlvbkVuZFRpbWVySWRfKSxjbGVhclRpbWVvdXQodGhpcy5jbG9zZUFuaW1hdGlvbkVuZFRpbWVySWRfKSxjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvblJlcXVlc3RJZF8pfSxlLnByb3RvdHlwZS5zZXRBbmNob3JDb3JuZXI9ZnVuY3Rpb24odCl7dGhpcy5hbmNob3JDb3JuZXJfPXR9LGUucHJvdG90eXBlLnNldEFuY2hvck1hcmdpbj1mdW5jdGlvbih0KXt0aGlzLmFuY2hvck1hcmdpbl8udG9wPXQudG9wfHwwLHRoaXMuYW5jaG9yTWFyZ2luXy5yaWdodD10LnJpZ2h0fHwwLHRoaXMuYW5jaG9yTWFyZ2luXy5ib3R0b209dC5ib3R0b218fDAsdGhpcy5hbmNob3JNYXJnaW5fLmxlZnQ9dC5sZWZ0fHwwfSxlLnByb3RvdHlwZS5zZXRJc0hvaXN0ZWQ9ZnVuY3Rpb24odCl7dGhpcy5pc0hvaXN0ZWRFbGVtZW50Xz10fSxlLnByb3RvdHlwZS5zZXRGaXhlZFBvc2l0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuaXNGaXhlZFBvc2l0aW9uXz10fSxlLnByb3RvdHlwZS5zZXRBYnNvbHV0ZVBvc2l0aW9uPWZ1bmN0aW9uKHQsZSl7dGhpcy5wb3NpdGlvbl8ueD10aGlzLmlzRmluaXRlXyh0KT90OjAsdGhpcy5wb3NpdGlvbl8ueT10aGlzLmlzRmluaXRlXyhlKT9lOjB9LGUucHJvdG90eXBlLnNldFF1aWNrT3Blbj1mdW5jdGlvbih0KXt0aGlzLmlzUXVpY2tPcGVuXz10fSxlLnByb3RvdHlwZS5pc09wZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc09wZW5ffSxlLnByb3RvdHlwZS5vcGVuPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmFkYXB0ZXJfLnNhdmVGb2N1cygpLHRoaXMuaXNRdWlja09wZW5ffHx0aGlzLmFkYXB0ZXJfLmFkZENsYXNzKGUuY3NzQ2xhc3Nlcy5BTklNQVRJTkdfT1BFTiksdGhpcy5hbmltYXRpb25SZXF1ZXN0SWRfPXJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3QuYWRhcHRlcl8uYWRkQ2xhc3MoZS5jc3NDbGFzc2VzLk9QRU4pLHQuZGltZW5zaW9uc189dC5hZGFwdGVyXy5nZXRJbm5lckRpbWVuc2lvbnMoKSx0LmF1dG9Qb3NpdGlvbl8oKSx0LmlzUXVpY2tPcGVuXz90LmFkYXB0ZXJfLm5vdGlmeU9wZW4oKTp0Lm9wZW5BbmltYXRpb25FbmRUaW1lcklkXz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5vcGVuQW5pbWF0aW9uRW5kVGltZXJJZF89MCx0LmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGUuY3NzQ2xhc3Nlcy5BTklNQVRJTkdfT1BFTiksdC5hZGFwdGVyXy5ub3RpZnlPcGVuKCl9LEUuVFJBTlNJVElPTl9PUEVOX0RVUkFUSU9OKX0pLHRoaXMuaXNPcGVuXz0hMH0sZS5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuaXNRdWlja09wZW5ffHx0aGlzLmFkYXB0ZXJfLmFkZENsYXNzKGUuY3NzQ2xhc3Nlcy5BTklNQVRJTkdfQ0xPU0VEKSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt0LmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGUuY3NzQ2xhc3Nlcy5PUEVOKSx0LmlzUXVpY2tPcGVuXz90LmFkYXB0ZXJfLm5vdGlmeUNsb3NlKCk6dC5jbG9zZUFuaW1hdGlvbkVuZFRpbWVySWRfPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmNsb3NlQW5pbWF0aW9uRW5kVGltZXJJZF89MCx0LmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGUuY3NzQ2xhc3Nlcy5BTklNQVRJTkdfQ0xPU0VEKSx0LmFkYXB0ZXJfLm5vdGlmeUNsb3NlKCl9LEUuVFJBTlNJVElPTl9DTE9TRV9EVVJBVElPTil9KSx0aGlzLmlzT3Blbl89ITEsdGhpcy5tYXliZVJlc3RvcmVGb2N1c18oKX0sZS5wcm90b3R5cGUuaGFuZGxlQm9keUNsaWNrPWZ1bmN0aW9uKHQpe3ZhciBlPXQudGFyZ2V0O3RoaXMuYWRhcHRlcl8uaXNFbGVtZW50SW5Db250YWluZXIoZSl8fHRoaXMuY2xvc2UoKX0sZS5wcm90b3R5cGUuaGFuZGxlS2V5ZG93bj1mdW5jdGlvbih0KXt2YXIgZT10LmtleUNvZGUsbj10LmtleSxpPXQuc2hpZnRLZXkscj1cIlRhYlwiPT09bnx8OT09PWU7XCJFc2NhcGVcIj09PW58fDI3PT09ZT90aGlzLmNsb3NlKCk6ciYmKHRoaXMuYWRhcHRlcl8uaXNMYXN0RWxlbWVudEZvY3VzZWQoKSYmIWk/KHRoaXMuYWRhcHRlcl8uZm9jdXNGaXJzdEVsZW1lbnQoKSx0LnByZXZlbnREZWZhdWx0KCkpOnRoaXMuYWRhcHRlcl8uaXNGaXJzdEVsZW1lbnRGb2N1c2VkKCkmJmkmJih0aGlzLmFkYXB0ZXJfLmZvY3VzTGFzdEVsZW1lbnQoKSx0LnByZXZlbnREZWZhdWx0KCkpKX0sZS5wcm90b3R5cGUuYXV0b1Bvc2l0aW9uXz1mdW5jdGlvbigpe3ZhciB0O3RoaXMubWVhc3VyZW1lbnRzXz10aGlzLmdldEF1dG9MYXlvdXRNZWFzdXJlbWVudHNfKCk7dmFyIGU9dGhpcy5nZXRPcmlnaW5Db3JuZXJfKCksbj10aGlzLmdldE1lbnVTdXJmYWNlTWF4SGVpZ2h0XyhlKSxpPXRoaXMuaGFzQml0XyhlLGguQk9UVE9NKT9cImJvdHRvbVwiOlwidG9wXCIscj10aGlzLmhhc0JpdF8oZSxoLlJJR0hUKT9cInJpZ2h0XCI6XCJsZWZ0XCIsbz10aGlzLmdldEhvcml6b250YWxPcmlnaW5PZmZzZXRfKGUpLHM9dGhpcy5nZXRWZXJ0aWNhbE9yaWdpbk9mZnNldF8oZSksYT10aGlzLm1lYXN1cmVtZW50c18sdT1hLmFuY2hvclNpemUsYz1hLnN1cmZhY2VTaXplLGQ9KCh0PXt9KVtyXT1vLHRbaV09cyx0KTt1LndpZHRoL2Mud2lkdGg+RS5BTkNIT1JfVE9fTUVOVV9TVVJGQUNFX1dJRFRIX1JBVElPJiYocj1cImNlbnRlclwiKSwodGhpcy5pc0hvaXN0ZWRFbGVtZW50X3x8dGhpcy5pc0ZpeGVkUG9zaXRpb25fKSYmdGhpcy5hZGp1c3RQb3NpdGlvbkZvckhvaXN0ZWRFbGVtZW50XyhkKSx0aGlzLmFkYXB0ZXJfLnNldFRyYW5zZm9ybU9yaWdpbihyK1wiIFwiK2kpLHRoaXMuYWRhcHRlcl8uc2V0UG9zaXRpb24oZCksdGhpcy5hZGFwdGVyXy5zZXRNYXhIZWlnaHQobj9uK1wicHhcIjpcIlwiKX0sZS5wcm90b3R5cGUuZ2V0QXV0b0xheW91dE1lYXN1cmVtZW50c189ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmFkYXB0ZXJfLmdldEFuY2hvckRpbWVuc2lvbnMoKSxlPXRoaXMuYWRhcHRlcl8uZ2V0Qm9keURpbWVuc2lvbnMoKSxuPXRoaXMuYWRhcHRlcl8uZ2V0V2luZG93RGltZW5zaW9ucygpLGk9dGhpcy5hZGFwdGVyXy5nZXRXaW5kb3dTY3JvbGwoKTtyZXR1cm4gdHx8KHQ9e3RvcDp0aGlzLnBvc2l0aW9uXy55LHJpZ2h0OnRoaXMucG9zaXRpb25fLngsYm90dG9tOnRoaXMucG9zaXRpb25fLnksbGVmdDp0aGlzLnBvc2l0aW9uXy54LHdpZHRoOjAsaGVpZ2h0OjB9KSx7YW5jaG9yU2l6ZTp0LGJvZHlTaXplOmUsc3VyZmFjZVNpemU6dGhpcy5kaW1lbnNpb25zXyx2aWV3cG9ydERpc3RhbmNlOnt0b3A6dC50b3AscmlnaHQ6bi53aWR0aC10LnJpZ2h0LGJvdHRvbTpuLmhlaWdodC10LmJvdHRvbSxsZWZ0OnQubGVmdH0sdmlld3BvcnRTaXplOm4sd2luZG93U2Nyb2xsOml9fSxlLnByb3RvdHlwZS5nZXRPcmlnaW5Db3JuZXJfPWZ1bmN0aW9uKCl7dmFyIHQ9cC5UT1BfTEVGVCxlPXRoaXMubWVhc3VyZW1lbnRzXyxuPWUudmlld3BvcnREaXN0YW5jZSxpPWUuYW5jaG9yU2l6ZSxyPWUuc3VyZmFjZVNpemUsbz10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLGguQk9UVE9NKSxzPW8/bi50b3AraS5oZWlnaHQrdGhpcy5hbmNob3JNYXJnaW5fLmJvdHRvbTpuLnRvcCt0aGlzLmFuY2hvck1hcmdpbl8udG9wLGE9bz9uLmJvdHRvbS10aGlzLmFuY2hvck1hcmdpbl8uYm90dG9tOm4uYm90dG9tK2kuaGVpZ2h0LXRoaXMuYW5jaG9yTWFyZ2luXy50b3AsdT1yLmhlaWdodC1zLGM9ci5oZWlnaHQtYTtjPjAmJnU8YyYmKHQ9dGhpcy5zZXRCaXRfKHQsaC5CT1RUT00pKTt2YXIgZD10aGlzLmFkYXB0ZXJfLmlzUnRsKCksbD10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLGguRkxJUF9SVEwpLGY9dGhpcy5oYXNCaXRfKHRoaXMuYW5jaG9yQ29ybmVyXyxoLlJJR0hUKSxfPWYmJiFkfHwhZiYmbCYmZCxtPV8/bi5sZWZ0K2kud2lkdGgrdGhpcy5hbmNob3JNYXJnaW5fLnJpZ2h0Om4ubGVmdCt0aGlzLmFuY2hvck1hcmdpbl8ubGVmdCxFPV8/bi5yaWdodC10aGlzLmFuY2hvck1hcmdpbl8ucmlnaHQ6bi5yaWdodCtpLndpZHRoLXRoaXMuYW5jaG9yTWFyZ2luXy5sZWZ0LEk9ci53aWR0aC1tLHk9ci53aWR0aC1FO3JldHVybihJPDAmJl8mJmR8fGYmJiFfJiZJPDB8fHk+MCYmSTx5KSYmKHQ9dGhpcy5zZXRCaXRfKHQsaC5SSUdIVCkpLHR9LGUucHJvdG90eXBlLmdldE1lbnVTdXJmYWNlTWF4SGVpZ2h0Xz1mdW5jdGlvbih0KXt2YXIgbj10aGlzLm1lYXN1cmVtZW50c18udmlld3BvcnREaXN0YW5jZSxpPTAscj10aGlzLmhhc0JpdF8odCxoLkJPVFRPTSksbz10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLGguQk9UVE9NKSxzPWUubnVtYmVycy5NQVJHSU5fVE9fRURHRTtyZXR1cm4gcj8oaT1uLnRvcCt0aGlzLmFuY2hvck1hcmdpbl8udG9wLXMsb3x8KGkrPXRoaXMubWVhc3VyZW1lbnRzXy5hbmNob3JTaXplLmhlaWdodCkpOihpPW4uYm90dG9tLXRoaXMuYW5jaG9yTWFyZ2luXy5ib3R0b20rdGhpcy5tZWFzdXJlbWVudHNfLmFuY2hvclNpemUuaGVpZ2h0LXMsbyYmKGktPXRoaXMubWVhc3VyZW1lbnRzXy5hbmNob3JTaXplLmhlaWdodCkpLGl9LGUucHJvdG90eXBlLmdldEhvcml6b250YWxPcmlnaW5PZmZzZXRfPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubWVhc3VyZW1lbnRzXy5hbmNob3JTaXplLG49dGhpcy5oYXNCaXRfKHQsaC5SSUdIVCksaT10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLGguUklHSFQpO2lmKG4pe3ZhciByPWk/ZS53aWR0aC10aGlzLmFuY2hvck1hcmdpbl8ubGVmdDp0aGlzLmFuY2hvck1hcmdpbl8ucmlnaHQ7cmV0dXJuIHRoaXMuaXNIb2lzdGVkRWxlbWVudF98fHRoaXMuaXNGaXhlZFBvc2l0aW9uXz9yLSh0aGlzLm1lYXN1cmVtZW50c18udmlld3BvcnRTaXplLndpZHRoLXRoaXMubWVhc3VyZW1lbnRzXy5ib2R5U2l6ZS53aWR0aCk6cn1yZXR1cm4gaT9lLndpZHRoLXRoaXMuYW5jaG9yTWFyZ2luXy5yaWdodDp0aGlzLmFuY2hvck1hcmdpbl8ubGVmdH0sZS5wcm90b3R5cGUuZ2V0VmVydGljYWxPcmlnaW5PZmZzZXRfPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubWVhc3VyZW1lbnRzXy5hbmNob3JTaXplLG49dGhpcy5oYXNCaXRfKHQsaC5CT1RUT00pLGk9dGhpcy5oYXNCaXRfKHRoaXMuYW5jaG9yQ29ybmVyXyxoLkJPVFRPTSk7cmV0dXJuIG4/aT9lLmhlaWdodC10aGlzLmFuY2hvck1hcmdpbl8udG9wOi10aGlzLmFuY2hvck1hcmdpbl8uYm90dG9tOmk/ZS5oZWlnaHQrdGhpcy5hbmNob3JNYXJnaW5fLmJvdHRvbTp0aGlzLmFuY2hvck1hcmdpbl8udG9wfSxlLnByb3RvdHlwZS5hZGp1c3RQb3NpdGlvbkZvckhvaXN0ZWRFbGVtZW50Xz1mdW5jdGlvbih0KXt2YXIgZSxuLGk9dGhpcy5tZWFzdXJlbWVudHNfLHI9aS53aW5kb3dTY3JvbGwsbz1pLnZpZXdwb3J0RGlzdGFuY2UsYT1PYmplY3Qua2V5cyh0KTt0cnl7Zm9yKHZhciB1PXMoYSksYz11Lm5leHQoKTshYy5kb25lO2M9dS5uZXh0KCkpe3ZhciBkPWMudmFsdWUsbD10W2RdfHwwO2wrPW9bZF0sdGhpcy5pc0ZpeGVkUG9zaXRpb25ffHwoXCJ0b3BcIj09PWQ/bCs9ci55OlwiYm90dG9tXCI9PT1kP2wtPXIueTpcImxlZnRcIj09PWQ/bCs9ci54OmwtPXIueCksdFtkXT1sfX1jYXRjaCh0KXtlPXtlcnJvcjp0fX1maW5hbGx5e3RyeXtjJiYhYy5kb25lJiYobj11LnJldHVybikmJm4uY2FsbCh1KX1maW5hbGx5e2lmKGUpdGhyb3cgZS5lcnJvcn19fSxlLnByb3RvdHlwZS5tYXliZVJlc3RvcmVGb2N1c189ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmFkYXB0ZXJfLmlzRm9jdXNlZCgpLGU9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCYmdGhpcy5hZGFwdGVyXy5pc0VsZW1lbnRJbkNvbnRhaW5lcihkb2N1bWVudC5hY3RpdmVFbGVtZW50KTsodHx8ZSkmJnRoaXMuYWRhcHRlcl8ucmVzdG9yZUZvY3VzKCl9LGUucHJvdG90eXBlLmhhc0JpdF89ZnVuY3Rpb24odCxlKXtyZXR1cm4gQm9vbGVhbih0JmUpfSxlLnByb3RvdHlwZS5zZXRCaXRfPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHR8ZX0sZS5wcm90b3R5cGUuaXNGaW5pdGVfPWZ1bmN0aW9uKHQpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiB0JiZpc0Zpbml0ZSh0KX0sZX0oYSkseT17TUVOVV9TRUxFQ1RFRF9MSVNUX0lURU06XCJtZGMtbWVudS1pdGVtLS1zZWxlY3RlZFwiLE1FTlVfU0VMRUNUSU9OX0dST1VQOlwibWRjLW1lbnVfX3NlbGVjdGlvbi1ncm91cFwiLFJPT1Q6XCJtZGMtbWVudVwifSxPPXtBUklBX1NFTEVDVEVEX0FUVFI6XCJhcmlhLXNlbGVjdGVkXCIsQ0hFQ0tCT1hfU0VMRUNUT1I6J2lucHV0W3R5cGU9XCJjaGVja2JveFwiXScsTElTVF9TRUxFQ1RPUjpcIi5tZGMtbGlzdFwiLFNFTEVDVEVEX0VWRU5UOlwiTURDTWVudTpzZWxlY3RlZFwifTtuLmQoZSxcIk1EQ01lbnVGb3VuZGF0aW9uXCIsZnVuY3Rpb24oKXtyZXR1cm4gVH0pO1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG52YXIgVD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciBpPXQuY2FsbCh0aGlzLG8oe30sZS5kZWZhdWx0QWRhcHRlcixuKSl8fHRoaXM7cmV0dXJuIGkuY2xvc2VBbmltYXRpb25FbmRUaW1lcklkXz0wLGl9cmV0dXJuIHIoZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzdHJpbmdzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBPfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2FkZENsYXNzVG9FbGVtZW50QXRJbmRleDpmdW5jdGlvbigpe30scmVtb3ZlQ2xhc3NGcm9tRWxlbWVudEF0SW5kZXg6ZnVuY3Rpb24oKXt9LGFkZEF0dHJpYnV0ZVRvRWxlbWVudEF0SW5kZXg6ZnVuY3Rpb24oKXt9LHJlbW92ZUF0dHJpYnV0ZUZyb21FbGVtZW50QXRJbmRleDpmdW5jdGlvbigpe30sZWxlbWVudENvbnRhaW5zQ2xhc3M6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sY2xvc2VTdXJmYWNlOmZ1bmN0aW9uKCl7fSxnZXRFbGVtZW50SW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4tMX0sZ2V0UGFyZW50RWxlbWVudDpmdW5jdGlvbigpe3JldHVybiBudWxsfSxnZXRTZWxlY3RlZEVsZW1lbnRJbmRleDpmdW5jdGlvbigpe3JldHVybi0xfSxub3RpZnlTZWxlY3RlZDpmdW5jdGlvbigpe319fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmNsb3NlQW5pbWF0aW9uRW5kVGltZXJJZF8mJmNsZWFyVGltZW91dCh0aGlzLmNsb3NlQW5pbWF0aW9uRW5kVGltZXJJZF8pLHRoaXMuYWRhcHRlcl8uY2xvc2VTdXJmYWNlKCl9LGUucHJvdG90eXBlLmhhbmRsZUtleWRvd249ZnVuY3Rpb24odCl7dmFyIGU9dC5rZXksbj10LmtleUNvZGU7KFwiVGFiXCI9PT1lfHw5PT09bikmJnRoaXMuYWRhcHRlcl8uY2xvc2VTdXJmYWNlKCl9LGUucHJvdG90eXBlLmhhbmRsZUl0ZW1BY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXRoaXMuYWRhcHRlcl8uZ2V0RWxlbWVudEluZGV4KHQpO248MHx8KHRoaXMuYWRhcHRlcl8ubm90aWZ5U2VsZWN0ZWQoe2luZGV4Om59KSx0aGlzLmFkYXB0ZXJfLmNsb3NlU3VyZmFjZSgpLHRoaXMuY2xvc2VBbmltYXRpb25FbmRUaW1lcklkXz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGk9ZS5nZXRTZWxlY3Rpb25Hcm91cF8odCk7aSYmZS5oYW5kbGVTZWxlY3Rpb25Hcm91cF8oaSxuKX0sSS5udW1iZXJzLlRSQU5TSVRJT05fQ0xPU0VfRFVSQVRJT04pKX0sZS5wcm90b3R5cGUuaGFuZGxlU2VsZWN0aW9uR3JvdXBfPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5hZGFwdGVyXy5nZXRTZWxlY3RlZEVsZW1lbnRJbmRleCh0KTtuPj0wJiYodGhpcy5hZGFwdGVyXy5yZW1vdmVBdHRyaWJ1dGVGcm9tRWxlbWVudEF0SW5kZXgobixPLkFSSUFfU0VMRUNURURfQVRUUiksdGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzc0Zyb21FbGVtZW50QXRJbmRleChuLHkuTUVOVV9TRUxFQ1RFRF9MSVNUX0lURU0pKSx0aGlzLmFkYXB0ZXJfLmFkZENsYXNzVG9FbGVtZW50QXRJbmRleChlLHkuTUVOVV9TRUxFQ1RFRF9MSVNUX0lURU0pLHRoaXMuYWRhcHRlcl8uYWRkQXR0cmlidXRlVG9FbGVtZW50QXRJbmRleChlLE8uQVJJQV9TRUxFQ1RFRF9BVFRSLFwidHJ1ZVwiKX0sZS5wcm90b3R5cGUuZ2V0U2VsZWN0aW9uR3JvdXBfPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYWRhcHRlcl8uZ2V0UGFyZW50RWxlbWVudCh0KTtpZighZSlyZXR1cm4gbnVsbDtmb3IodmFyIG49dGhpcy5hZGFwdGVyXy5lbGVtZW50Q29udGFpbnNDbGFzcyhlLHkuTUVOVV9TRUxFQ1RJT05fR1JPVVApOyFuJiZlJiYhdGhpcy5hZGFwdGVyXy5lbGVtZW50Q29udGFpbnNDbGFzcyhlLGYuY3NzQ2xhc3Nlcy5ST09UKTspbj0hIShlPXRoaXMuYWRhcHRlcl8uZ2V0UGFyZW50RWxlbWVudChlKSkmJnRoaXMuYWRhcHRlcl8uZWxlbWVudENvbnRhaW5zQ2xhc3MoZSx5Lk1FTlVfU0VMRUNUSU9OX0dST1VQKTtyZXR1cm4gbj9lOm51bGx9LGV9KGEpO2UuZGVmYXVsdD1UfSwzMjpmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1ufSw5ODpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGkscj10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4oaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSksbz10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihvPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciByIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYodFtyXT1lW3JdKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scz10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIGkgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKSYmZS5pbmRleE9mKGkpPDAmJihuW2ldPXRbaV0pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPTA7Zm9yKGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtyPGkubGVuZ3RoO3IrKyllLmluZGV4T2YoaVtyXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsaVtyXSkmJihuW2lbcl1dPXRbaVtyXV0pfXJldHVybiBufSxhPXRoaXMmJnRoaXMuX19pbXBvcnRTdGFyfHxmdW5jdGlvbih0KXtpZih0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIGU9e307aWYobnVsbCE9dClmb3IodmFyIG4gaW4gdClPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pJiYoZVtuXT10W25dKTtyZXR1cm4gZS5kZWZhdWx0PXQsZX0sdT10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgYz1hKG4oMCkpLGQ9dShuKDEpKSxsPW4oMTQ4KSxoPXUobig5OSkpLHA9dShuKDEwMCkpO2UuTWVudUxpc3Q9cC5kZWZhdWx0O3ZhciBmPXUobigxMDEpKTtlLk1lbnVMaXN0SXRlbT1mLmRlZmF1bHQ7dmFyIF89bC5NRENNZW51Rm91bmRhdGlvbi5jc3NDbGFzc2VzLG09ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5tZW51TGlzdEVsZW1lbnQ9Yy5jcmVhdGVSZWYoKSxlLnN0YXRlPXtmb3VuZGF0aW9uOnZvaWQgMCxvcGVuOmUucHJvcHMub3Blbnx8ITF9LGUuaGFuZGxlS2V5RG93bj1mdW5jdGlvbih0KXt2YXIgbj1lLnByb3BzLm9uS2V5RG93bjtuJiZuKHQpLGUuc3RhdGUuZm91bmRhdGlvbiYmZS5zdGF0ZS5mb3VuZGF0aW9uLmhhbmRsZUtleWRvd24odC5uYXRpdmVFdmVudCl9LGUuaGFuZGxlT3Blbj1mdW5jdGlvbigpe3ZhciB0PWUucHJvcHMub25PcGVuO3QmJnQoKX0sZX1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGwuTURDTWVudUZvdW5kYXRpb24odGhpcy5hZGFwdGVyKTt0LmluaXQoKSx0aGlzLnNldFN0YXRlKHtmb3VuZGF0aW9uOnR9KX0sZS5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPWZ1bmN0aW9uKHQpe3RoaXMucHJvcHMub3BlbiE9PXQub3BlbiYmdGhpcy5zZXRTdGF0ZSh7b3Blbjp0aGlzLnByb3BzLm9wZW59KX0sZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLnN0YXRlLmZvdW5kYXRpb24mJnRoaXMuc3RhdGUuZm91bmRhdGlvbi5kZXN0cm95KCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImxpc3RFbGVtZW50c1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZW51TGlzdEVsZW1lbnQuY3VycmVudCYmdGhpcy5tZW51TGlzdEVsZW1lbnQuY3VycmVudC5saXN0RWxlbWVudHMmJnRoaXMubWVudUxpc3RFbGVtZW50LmN1cnJlbnQubGlzdEVsZW1lbnRzLmxlbmd0aD49MD90aGlzLm1lbnVMaXN0RWxlbWVudC5jdXJyZW50Lmxpc3RFbGVtZW50czpbXX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJhZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJue2FkZENsYXNzVG9FbGVtZW50QXRJbmRleDpmdW5jdGlvbihlLG4pe3QubGlzdEVsZW1lbnRzW2VdLmNsYXNzTGlzdC5hZGQobil9LHJlbW92ZUNsYXNzRnJvbUVsZW1lbnRBdEluZGV4OmZ1bmN0aW9uKGUsbil7dC5saXN0RWxlbWVudHNbZV0uY2xhc3NMaXN0LnJlbW92ZShuKX0sYWRkQXR0cmlidXRlVG9FbGVtZW50QXRJbmRleDpmdW5jdGlvbihlLG4saSl7dC5saXN0RWxlbWVudHNbZV0uc2V0QXR0cmlidXRlKG4saSl9LHJlbW92ZUF0dHJpYnV0ZUZyb21FbGVtZW50QXRJbmRleDpmdW5jdGlvbihlLG4pe3QubGlzdEVsZW1lbnRzW2VdLnJlbW92ZUF0dHJpYnV0ZShuKX0sZWxlbWVudENvbnRhaW5zQ2xhc3M6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jbGFzc0xpc3QuY29udGFpbnMoZSl9LGNsb3NlU3VyZmFjZTpmdW5jdGlvbigpe3JldHVybiB0LnNldFN0YXRlKHtvcGVuOiExfSl9LGdldEVsZW1lbnRJbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gdC5saXN0RWxlbWVudHMuaW5kZXhPZihlKX0sZ2V0UGFyZW50RWxlbWVudDpmdW5jdGlvbih0KXtyZXR1cm4gdC5wYXJlbnRFbGVtZW50fSxnZXRTZWxlY3RlZEVsZW1lbnRJbmRleDpmdW5jdGlvbihlKXt2YXIgbj1lLnF1ZXJ5U2VsZWN0b3IoXCIuXCIrXy5NRU5VX1NFTEVDVEVEX0xJU1RfSVRFTSk7cmV0dXJuIG4/dC5saXN0RWxlbWVudHMuaW5kZXhPZihuKTotMX0sbm90aWZ5U2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHQucHJvcHMub25TZWxlY3RlZChlLmluZGV4LHQubGlzdEVsZW1lbnRzW2UuaW5kZXhdKX19fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMsZT10LmNsYXNzTmFtZSxuPSh0Lm9wZW4sdC5vbktleURvd24sdC5vbk9wZW4sdC5jaGlsZHJlbix0Lm9uU2VsZWN0ZWQscyh0LFtcImNsYXNzTmFtZVwiLFwib3BlblwiLFwib25LZXlEb3duXCIsXCJvbk9wZW5cIixcImNoaWxkcmVuXCIsXCJvblNlbGVjdGVkXCJdKSk7cmV0dXJuIGMuY3JlYXRlRWxlbWVudChoLmRlZmF1bHQsbyh7dGFiSW5kZXg6LTEsb3Blbjp0aGlzLnN0YXRlLm9wZW4sY2xhc3NOYW1lOmQuZGVmYXVsdChcIm1kYy1tZW51XCIsZSksb25LZXlEb3duOnRoaXMuaGFuZGxlS2V5RG93bixvbk9wZW46dGhpcy5oYW5kbGVPcGVufSxuKSx0aGlzLnJlbmRlckNoaWxkKCkpfSxlLnByb3RvdHlwZS5yZW5kZXJDaGlsZD1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMuY2hpbGRyZW4sZT10aGlzLnN0YXRlLmZvdW5kYXRpb247aWYodCl7dmFyIG49ZnVuY3Rpb24oKXt9O2UmJihuPWUuaGFuZGxlSXRlbUFjdGlvbi5iaW5kKGUpKTt2YXIgaT1vKHt9LHQucHJvcHMse2hhbmRsZUl0ZW1BY3Rpb246bixyZWY6dGhpcy5tZW51TGlzdEVsZW1lbnQsd3JhcEZvY3VzOiEwfSk7cmV0dXJuIGMuY2xvbmVFbGVtZW50KHQsaSl9fSxlLmRlZmF1bHRQcm9wcz17Y2xhc3NOYW1lOlwiXCIsb3BlbjohMSxvbktleURvd246ZnVuY3Rpb24oKXt9LG9uU2VsZWN0ZWQ6ZnVuY3Rpb24oKXt9fSxlfShjLkNvbXBvbmVudCk7ZS5kZWZhdWx0PW07dmFyIEU9bigzMik7ZS5NZW51TGlzdERpdmlkZXI9RS5MaXN0RGl2aWRlcixlLk1lbnVMaXN0R3JvdXA9RS5MaXN0R3JvdXAsZS5NZW51TGlzdEdyb3VwU3ViaGVhZGVyPUUuTGlzdEdyb3VwU3ViaGVhZGVyLGUuTWVudUxpc3RJdGVtR3JhcGhpYz1FLkxpc3RJdGVtR3JhcGhpYyxlLk1lbnVMaXN0SXRlbU1ldGE9RS5MaXN0SXRlbU1ldGEsZS5NZW51TGlzdEl0ZW1UZXh0PUUuTGlzdEl0ZW1UZXh0fSw5OTpmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1pfX0pfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZW51LmpzLm1hcCIsIiFmdW5jdGlvbih0LGUpe2lmKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPWUocmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpLHJlcXVpcmUoXCJyZWFjdC1kb21cIikpO2Vsc2UgaWYoXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXCJyZWFjdFwiLFwiY2xhc3NuYW1lc1wiLFwicmVhY3QtZG9tXCJdLGUpO2Vsc2V7dmFyIG49XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZShyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcImNsYXNzbmFtZXNcIikscmVxdWlyZShcInJlYWN0LWRvbVwiKSk6ZSh0LnJlYWN0LHQuY2xhc3NuYW1lcyx0W1wicmVhY3QtZG9tXCJdKTtmb3IodmFyIG8gaW4gbikoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czp0KVtvXT1uW29dfX0oXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9e307ZnVuY3Rpb24gbihvKXtpZihlW29dKXJldHVybiBlW29dLmV4cG9ydHM7dmFyIGk9ZVtvXT17aTpvLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIHRbb10uY2FsbChpLmV4cG9ydHMsaSxpLmV4cG9ydHMsbiksaS5sPSEwLGkuZXhwb3J0c31yZXR1cm4gbi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxvKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6b30pfSxuLnI9ZnVuY3Rpb24odCl7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOlwiTW9kdWxlXCJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiZcIm9iamVjdFwiPT10eXBlb2YgdCYmdCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBvPU9iamVjdC5jcmVhdGUobnVsbCk7aWYobi5yKG8pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLFwiZGVmYXVsdFwiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KSwyJmUmJlwic3RyaW5nXCIhPXR5cGVvZiB0KWZvcih2YXIgaSBpbiB0KW4uZChvLGksZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxpKSk7cmV0dXJuIG99LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsXCJhXCIsZSksZX0sbi5vPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfSxuLnA9XCJcIixuKG4ucz0xMDIpfSh7MDpmdW5jdGlvbihlLG4pe2UuZXhwb3J0cz10fSwxOmZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWV9LDEwMjpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG8saT10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KG89ZnVuY3Rpb24odCxlKXtyZXR1cm4obz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1vKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSkscj10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsbz1hcmd1bWVudHMubGVuZ3RoO248bztuKyspZm9yKHZhciBpIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLGkpJiYodFtpXT1lW2ldKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scz10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIG8gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxvKSYmZS5pbmRleE9mKG8pPDAmJihuW29dPXRbb10pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBpPTA7Zm9yKG89T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtpPG8ubGVuZ3RoO2krKyllLmluZGV4T2Yob1tpXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsb1tpXSkmJihuW29baV1dPXRbb1tpXV0pfXJldHVybiBufSx1PXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBhPXUobigwKSksYz11KG4oMTAzKSksbD11KG4oMSkpLGY9bigxNiksaD1uKDE1OSk7ZS5Db3JuZXI9aC5Db3JuZXI7dmFyIGQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5tZW51U3VyZmFjZUVsZW1lbnQ9YS5kZWZhdWx0LmNyZWF0ZVJlZigpLGUucHJldmlvdXNGb2N1cz1udWxsLGUuZmlyc3RGb2N1c2FibGVFbGVtZW50PW51bGwsZS5sYXN0Rm9jdXNhYmxlRWxlbWVudD1udWxsLGUuc3RhdGU9e3RyYW5zZm9ybU9yaWdpbjpcIlwiLG1heEhlaWdodDp2b2lkIDAsc3R5bGVMZWZ0OnZvaWQgMCxzdHlsZVJpZ2h0OnZvaWQgMCxzdHlsZVRvcDp2b2lkIDAsc3R5bGVCb3R0b206dm9pZCAwLGNsYXNzTGlzdDpuZXcgU2V0LG1vdW50ZWQ6ITF9LGUub3Blbl89ZnVuY3Rpb24oKXtpZihlLnByb3BzLm9wZW4pe2lmKCFlLm1lbnVTdXJmYWNlRWxlbWVudC5jdXJyZW50KXJldHVybjt2YXIgdD1lLm1lbnVTdXJmYWNlRWxlbWVudC5jdXJyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZi5NRENNZW51U3VyZmFjZUZvdW5kYXRpb24uc3RyaW5ncy5GT0NVU0FCTEVfRUxFTUVOVFMpO2UuZmlyc3RGb2N1c2FibGVFbGVtZW50PXQubGVuZ3RoPjA/dFswXTpudWxsLGUubGFzdEZvY3VzYWJsZUVsZW1lbnQ9dC5sZW5ndGg+MD90W3QubGVuZ3RoLTFdOm51bGwsZS5mb3VuZGF0aW9uLm9wZW4oKX1lbHNlIGUuZm91bmRhdGlvbi5jbG9zZSgpfSxlLmhhbmRsZUtleWRvd249ZnVuY3Rpb24odCl7ZS5wcm9wcy5vbktleURvd24odCksZS5mb3VuZGF0aW9uLmhhbmRsZUtleWRvd24odC5uYXRpdmVFdmVudCl9LGUuaGFuZGxlT3Blbj1mdW5jdGlvbigpe2UucmVnaXN0ZXJXaW5kb3dDbGlja0xpc3RlbmVyJiZlLnJlZ2lzdGVyV2luZG93Q2xpY2tMaXN0ZW5lcigpfSxlLmhhbmRsZUNsb3NlPWZ1bmN0aW9uKCl7ZS5kZXJlZ2lzdGVyV2luZG93Q2xpY2tMaXN0ZW5lciYmZS5kZXJlZ2lzdGVyV2luZG93Q2xpY2tMaXN0ZW5lcigpfSxlfXJldHVybiBpKGUsdCksZS5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5wcm9wcyxuPWUuYW5jaG9yQ29ybmVyLG89ZS5hbmNob3JNYXJnaW4saT1lLmNvb3JkaW5hdGVzLHI9ZS5maXhlZCxzPWUucXVpY2tPcGVuO3RoaXMuaGFuZGxlV2luZG93Q2xpY2s9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuZm91bmRhdGlvbi5oYW5kbGVCb2R5Q2xpY2soZSl9LHRoaXMucmVnaXN0ZXJXaW5kb3dDbGlja0xpc3RlbmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIix0LmhhbmRsZVdpbmRvd0NsaWNrKX0sdGhpcy5kZXJlZ2lzdGVyV2luZG93Q2xpY2tMaXN0ZW5lcj1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsdC5oYW5kbGVXaW5kb3dDbGljayl9LHRoaXMuZm91bmRhdGlvbj1uZXcgZi5NRENNZW51U3VyZmFjZUZvdW5kYXRpb24odGhpcy5hZGFwdGVyKSx0aGlzLmZvdW5kYXRpb24uaW5pdCgpLHRoaXMuZm91bmRhdGlvbi5zZXRJc0hvaXN0ZWQoITApLHRoaXMuZm91bmRhdGlvbi5zZXRGaXhlZFBvc2l0aW9uKHIpLGkmJnRoaXMuc2V0Q29vcmRpbmF0ZXMoKSxuJiZ0aGlzLmZvdW5kYXRpb24uc2V0QW5jaG9yQ29ybmVyKG4pLG8mJnRoaXMuZm91bmRhdGlvbi5zZXRBbmNob3JNYXJnaW4obykscyYmdGhpcy5mb3VuZGF0aW9uLnNldFF1aWNrT3BlbihzKSx0aGlzLnNldFN0YXRlKHttb3VudGVkOiEwfSl9LGUucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbih0LGUpeyh0aGlzLnByb3BzLm9wZW4hPT10Lm9wZW58fHRoaXMucHJvcHMub3BlbiYmdGhpcy5zdGF0ZS5tb3VudGVkIT09ZS5tb3VudGVkKSYmdGhpcy5vcGVuXygpLHRoaXMucHJvcHMuY29vcmRpbmF0ZXMhPT10LmNvb3JkaW5hdGVzJiZ0aGlzLnNldENvb3JkaW5hdGVzKCksdGhpcy5wcm9wcy5hbmNob3JDb3JuZXIhPT10LmFuY2hvckNvcm5lciYmdGhpcy5mb3VuZGF0aW9uLnNldEFuY2hvckNvcm5lcih0aGlzLnByb3BzLmFuY2hvckNvcm5lciksdGhpcy5wcm9wcy5hbmNob3JNYXJnaW4hPT10LmFuY2hvck1hcmdpbiYmdGhpcy5mb3VuZGF0aW9uLnNldEFuY2hvck1hcmdpbih0aGlzLnByb3BzLmFuY2hvck1hcmdpbiksdGhpcy5wcm9wcy5xdWlja09wZW4hPT10LnF1aWNrT3BlbiYmdGhpcy5mb3VuZGF0aW9uLnNldFF1aWNrT3Blbih0aGlzLnByb3BzLnF1aWNrT3BlbiksdGhpcy5zdGF0ZS5tb3VudGVkIT09ZS5tb3VudGVkJiZ0aGlzLnByb3BzLm9uTW91bnQmJnRoaXMucHJvcHMub25Nb3VudCh0aGlzLnN0YXRlLm1vdW50ZWQpfSxlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMuZGVyZWdpc3RlcldpbmRvd0NsaWNrTGlzdGVuZXImJnRoaXMuZGVyZWdpc3RlcldpbmRvd0NsaWNrTGlzdGVuZXIoKSx0aGlzLmZvdW5kYXRpb24mJnRoaXMuZm91bmRhdGlvbi5kZXN0cm95KCl9LGUucHJvdG90eXBlLnNldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7aWYodGhpcy5wcm9wcy5jb29yZGluYXRlcyl7dmFyIHQ9dGhpcy5wcm9wcy5jb29yZGluYXRlcyxlPXQueCxuPXQueTt0aGlzLmZvdW5kYXRpb24uc2V0QWJzb2x1dGVQb3NpdGlvbihlLG4pfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiY2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9dC5maXhlZCxuPXQuY2xhc3NOYW1lLG89dGhpcy5zdGF0ZS5jbGFzc0xpc3Q7cmV0dXJuIGwuZGVmYXVsdChcIm1kYy1tZW51LXN1cmZhY2VcIixBcnJheS5mcm9tKG8pLG4se1wibWRjLW1lbnUtc3VyZmFjZS0tZml4ZWRcIjplfSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwic3R5bGVzXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuc3RhdGUsZT10LnN0eWxlTGVmdCxuPXQuc3R5bGVSaWdodCxvPXQuc3R5bGVUb3AsaT10LnN0eWxlQm90dG9tLHI9dC50cmFuc2Zvcm1PcmlnaW4scz10Lm1heEhlaWdodDtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSx0aGlzLnByb3BzLnN0eWxlcyx7dHJhbnNmb3JtT3JpZ2luOnIsbWF4SGVpZ2h0OnMsbGVmdDplLHJpZ2h0Om4sdG9wOm8sYm90dG9tOml9KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJhZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHIoe2FkZENsYXNzOmZ1bmN0aW9uKGUpe3ZhciBuPW5ldyBTZXQodC5zdGF0ZS5jbGFzc0xpc3QpO24uYWRkKGUpLHQuc2V0U3RhdGUoe2NsYXNzTGlzdDpufSl9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciBuPW5ldyBTZXQodC5zdGF0ZS5jbGFzc0xpc3QpO24uZGVsZXRlKGUpLHQuc2V0U3RhdGUoe2NsYXNzTGlzdDpufSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiB0LmNsYXNzZXMuc3BsaXQoXCIgXCIpLmluY2x1ZGVzKGUpfSxoYXNBbmNob3I6ZnVuY3Rpb24oKXtyZXR1cm4hIXQucHJvcHMuYW5jaG9yRWxlbWVudH0sbm90aWZ5T3BlbjpmdW5jdGlvbigpe3QuaGFuZGxlT3BlbigpLHQucHJvcHMub25PcGVuKCl9LG5vdGlmeUNsb3NlOmZ1bmN0aW9uKCl7dC5oYW5kbGVDbG9zZSgpLHQucHJvcHMub25DbG9zZSgpfSxpc0VsZW1lbnRJbkNvbnRhaW5lcjpmdW5jdGlvbihlKXtyZXR1cm4hIXQubWVudVN1cmZhY2VFbGVtZW50LmN1cnJlbnQmJnQubWVudVN1cmZhY2VFbGVtZW50LmN1cnJlbnQuY29udGFpbnMoZSl9LGlzUnRsOmZ1bmN0aW9uKCl7cmV0dXJuISF0Lm1lbnVTdXJmYWNlRWxlbWVudCYmKCEhdC5tZW51U3VyZmFjZUVsZW1lbnQuY3VycmVudCYmXCJydGxcIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQubWVudVN1cmZhY2VFbGVtZW50LmN1cnJlbnQpLmdldFByb3BlcnR5VmFsdWUoXCJkaXJlY3Rpb25cIikpfSxzZXRUcmFuc2Zvcm1PcmlnaW46ZnVuY3Rpb24oZSl7cmV0dXJuIHQuc2V0U3RhdGUoe3RyYW5zZm9ybU9yaWdpbjplfSl9fSx7aXNGb2N1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuIHQubWVudVN1cmZhY2VFbGVtZW50JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09dC5tZW51U3VyZmFjZUVsZW1lbnQuY3VycmVudH0sc2F2ZUZvY3VzOmZ1bmN0aW9uKCl7dC5wcmV2aW91c0ZvY3VzPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9LHJlc3RvcmVGb2N1czpmdW5jdGlvbigpe3ZhciBlPXQubWVudVN1cmZhY2VFbGVtZW50O2UmJmUuY3VycmVudCYmZS5jdXJyZW50LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpJiZ0LnByZXZpb3VzRm9jdXMmJnQucHJldmlvdXNGb2N1cy5mb2N1cyYmdC5wcmV2aW91c0ZvY3VzLmZvY3VzKCl9LGlzRmlyc3RFbGVtZW50Rm9jdXNlZDpmdW5jdGlvbigpe3JldHVybiB0LmZpcnN0Rm9jdXNhYmxlRWxlbWVudD09PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9LGlzTGFzdEVsZW1lbnRGb2N1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuIHQubGFzdEZvY3VzYWJsZUVsZW1lbnQ9PT1kb2N1bWVudC5hY3RpdmVFbGVtZW50fSxmb2N1c0ZpcnN0RWxlbWVudDpmdW5jdGlvbigpe3JldHVybiEhdC5maXJzdEZvY3VzYWJsZUVsZW1lbnQmJih0LmZpcnN0Rm9jdXNhYmxlRWxlbWVudC5mb2N1cyYmdC5maXJzdEZvY3VzYWJsZUVsZW1lbnQuZm9jdXMoKSl9LGZvY3VzTGFzdEVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5sYXN0Rm9jdXNhYmxlRWxlbWVudCYmdC5sYXN0Rm9jdXNhYmxlRWxlbWVudC5mb2N1cyYmdC5sYXN0Rm9jdXNhYmxlRWxlbWVudC5mb2N1cygpfX0se2dldElubmVyRGltZW5zaW9uczpmdW5jdGlvbigpe3ZhciBlPXQubWVudVN1cmZhY2VFbGVtZW50LmN1cnJlbnQ7cmV0dXJuIGU/e3dpZHRoOmUub2Zmc2V0V2lkdGgsaGVpZ2h0OmUub2Zmc2V0SGVpZ2h0fTp7d2lkdGg6MCxoZWlnaHQ6MH19LGdldEFuY2hvckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gdC5wcm9wcy5hbmNob3JFbGVtZW50P3QucHJvcHMuYW5jaG9yRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTpudWxsfSxnZXRXaW5kb3dEaW1lbnNpb25zOmZ1bmN0aW9uKCl7cmV0dXJue3dpZHRoOndpbmRvdy5pbm5lcldpZHRoLGhlaWdodDp3aW5kb3cuaW5uZXJIZWlnaHR9fSxnZXRCb2R5RGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybnt3aWR0aDpkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLGhlaWdodDpkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodH19LGdldFdpbmRvd1Njcm9sbDpmdW5jdGlvbigpe3JldHVybnt4OndpbmRvdy5wYWdlWE9mZnNldCx5OndpbmRvdy5wYWdlWU9mZnNldH19LHNldFBvc2l0aW9uOmZ1bmN0aW9uKGUpe3Quc2V0U3RhdGUoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5hc3NpZ24odCx7c3R5bGVMZWZ0OlwibGVmdFwiaW4gZT9lLmxlZnQ6bnVsbCxzdHlsZVJpZ2h0OlwicmlnaHRcImluIGU/ZS5yaWdodDpudWxsLHN0eWxlVG9wOlwidG9wXCJpbiBlP2UudG9wOm51bGwsc3R5bGVCb3R0b206XCJib3R0b21cImluIGU/ZS5ib3R0b206bnVsbH0pfSl9LHNldE1heEhlaWdodDpmdW5jdGlvbihlKXtyZXR1cm4gdC5zZXRTdGF0ZSh7bWF4SGVpZ2h0OmV9KX19KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9KHQuYW5jaG9yQ29ybmVyLHQuYW5jaG9yRWxlbWVudCx0LmFuY2hvck1hcmdpbix0LmNsYXNzTmFtZSx0LmNvb3JkaW5hdGVzLHQuZml4ZWQsdC5vbkNsb3NlLHQub25PcGVuLHQub25LZXlEb3duLHQuc3R5bGVzLHQucXVpY2tPcGVuLHQub25Nb3VudCx0LmNoaWxkcmVuKSxuPXModCxbXCJhbmNob3JDb3JuZXJcIixcImFuY2hvckVsZW1lbnRcIixcImFuY2hvck1hcmdpblwiLFwiY2xhc3NOYW1lXCIsXCJjb29yZGluYXRlc1wiLFwiZml4ZWRcIixcIm9uQ2xvc2VcIixcIm9uT3BlblwiLFwib25LZXlEb3duXCIsXCJzdHlsZXNcIixcInF1aWNrT3BlblwiLFwib25Nb3VudFwiLFwiY2hpbGRyZW5cIl0pO3JldHVybiB0aGlzLnN0YXRlLm1vdW50ZWQ/Yy5kZWZhdWx0LmNyZWF0ZVBvcnRhbChhLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHIoe2NsYXNzTmFtZTp0aGlzLmNsYXNzZXMsb25LZXlEb3duOnRoaXMuaGFuZGxlS2V5ZG93bixyZWY6dGhpcy5tZW51U3VyZmFjZUVsZW1lbnQsc3R5bGU6dGhpcy5zdHlsZXN9LG4pLGUpLGRvY3VtZW50LmJvZHkpOm51bGx9LGUuZGVmYXVsdFByb3BzPXtjbGFzc05hbWU6XCJcIixzdHlsZXM6e30sYW5jaG9yQ29ybmVyOjAsYW5jaG9yTWFyZ2luOnt9LG9uQ2xvc2U6ZnVuY3Rpb24oKXt9LG9uT3BlbjpmdW5jdGlvbigpe30sb25LZXlEb3duOmZ1bmN0aW9uKCl7fSxxdWlja09wZW46ITEsb3BlbjohMSxmaXhlZDohMX0sZX0oYS5kZWZhdWx0LkNvbXBvbmVudCk7ZS5kZWZhdWx0PWR9LDEwMzpmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1ufSwxNTpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJiXCIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLG4uZChlLFwiYVwiLGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KSxuLmQoZSxcImRcIixmdW5jdGlvbigpe3JldHVybiBzfSksbi5kKGUsXCJjXCIsZnVuY3Rpb24oKXtyZXR1cm4gYX0pO1wiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yO1xuLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxuXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovdmFyIG89ZnVuY3Rpb24odCxlKXtyZXR1cm4obz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9O2Z1bmN0aW9uIGkodCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fW8odCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9dmFyIHI9ZnVuY3Rpb24oKXtyZXR1cm4ocj1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLG89YXJndW1lbnRzLmxlbmd0aDtuPG87bisrKWZvcih2YXIgaSBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxpKSYmKHRbaV09ZVtpXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2Z1bmN0aW9uIHModCl7dmFyIGU9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0W1N5bWJvbC5pdGVyYXRvcl0sbj0wO3JldHVybiBlP2UuY2FsbCh0KTp7bmV4dDpmdW5jdGlvbigpe3JldHVybiB0JiZuPj10Lmxlbmd0aCYmKHQ9dm9pZCAwKSx7dmFsdWU6dCYmdFtuKytdLGRvbmU6IXR9fX19ZnVuY3Rpb24gdSh0LGUpe3ZhciBuPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdO2lmKCFuKXJldHVybiB0O3ZhciBvLGkscj1uLmNhbGwodCkscz1bXTt0cnl7Zm9yKDsodm9pZCAwPT09ZXx8ZS0tID4wKSYmIShvPXIubmV4dCgpKS5kb25lOylzLnB1c2goby52YWx1ZSl9Y2F0Y2godCl7aT17ZXJyb3I6dH19ZmluYWxseXt0cnl7byYmIW8uZG9uZSYmKG49ci5yZXR1cm4pJiZuLmNhbGwocil9ZmluYWxseXtpZihpKXRocm93IGkuZXJyb3J9fXJldHVybiBzfWZ1bmN0aW9uIGEoKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdD10LmNvbmNhdCh1KGFyZ3VtZW50c1tlXSkpO3JldHVybiB0fX0sMTU5OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSk7dmFyIG8saT17fTtmdW5jdGlvbiByKHQsZSl7aWYodm9pZCAwPT09ZSYmKGU9ITEpLHZvaWQgMD09PW98fGUpe3ZhciBuPXQuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtvPVwidHJhbnNmb3JtXCJpbiBuLnN0eWxlP1widHJhbnNmb3JtXCI6XCJ3ZWJraXRUcmFuc2Zvcm1cIn1yZXR1cm4gb31uLnIoaSksbi5kKGksXCJnZXRUcmFuc2Zvcm1Qcm9wZXJ0eU5hbWVcIixmdW5jdGlvbigpe3JldHVybiByfSk7dmFyIHM9bigzKSx1PW4oMTUpLGE9bigyOCksYz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIG49W10sbz0yO288YXJndW1lbnRzLmxlbmd0aDtvKyspbltvLTJdPWFyZ3VtZW50c1tvXTt0aGlzLnJvb3RfPXQsdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsdS5jKG4pKSx0aGlzLmZvdW5kYXRpb25fPXZvaWQgMD09PWU/dGhpcy5nZXREZWZhdWx0Rm91bmRhdGlvbigpOmUsdGhpcy5mb3VuZGF0aW9uXy5pbml0KCksdGhpcy5pbml0aWFsU3luY1dpdGhET00oKX1yZXR1cm4gdC5hdHRhY2hUbz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQoZSxuZXcgYS5hKHt9KSl9LHQucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV19LHQucHJvdG90eXBlLmdldERlZmF1bHRGb3VuZGF0aW9uPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFwiU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIGdldERlZmF1bHRGb3VuZGF0aW9uIHRvIHJldHVybiBhIHByb3Blcmx5IGNvbmZpZ3VyZWQgZm91bmRhdGlvbiBjbGFzc1wiKX0sdC5wcm90b3R5cGUuaW5pdGlhbFN5bmNXaXRoRE9NPWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5mb3VuZGF0aW9uXy5kZXN0cm95KCl9LHQucHJvdG90eXBlLmxpc3Rlbj1mdW5jdGlvbih0LGUpe3RoaXMucm9vdF8uYWRkRXZlbnRMaXN0ZW5lcih0LGUpfSx0LnByb3RvdHlwZS51bmxpc3Rlbj1mdW5jdGlvbih0LGUpe3RoaXMucm9vdF8ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LGUpfSx0LnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKHQsZSxuKXt2YXIgbzt2b2lkIDA9PT1uJiYobj0hMSksXCJmdW5jdGlvblwiPT10eXBlb2YgQ3VzdG9tRXZlbnQ/bz1uZXcgQ3VzdG9tRXZlbnQodCx7YnViYmxlczpuLGRldGFpbDplfSk6KG89ZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJDdXN0b21FdmVudFwiKSkuaW5pdEN1c3RvbUV2ZW50KHQsbiwhMSxlKSx0aGlzLnJvb3RfLmRpc3BhdGNoRXZlbnQobyl9LHR9KCksbD1uKDE2KSxmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiB1LmIoZSx0KSxlLmF0dGFjaFRvPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5wcm90b3R5cGUuaW5pdGlhbFN5bmNXaXRoRE9NPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMucm9vdF8ucGFyZW50RWxlbWVudDt0aGlzLmFuY2hvckVsZW1lbnQ9ZSYmZS5jbGFzc0xpc3QuY29udGFpbnMocy5jLkFOQ0hPUik/ZTpudWxsLHRoaXMucm9vdF8uY2xhc3NMaXN0LmNvbnRhaW5zKHMuYy5GSVhFRCkmJnRoaXMuc2V0Rml4ZWRQb3NpdGlvbighMCksdGhpcy5oYW5kbGVLZXlkb3duXz1mdW5jdGlvbihlKXtyZXR1cm4gdC5mb3VuZGF0aW9uXy5oYW5kbGVLZXlkb3duKGUpfSx0aGlzLmhhbmRsZUJvZHlDbGlja189ZnVuY3Rpb24oZSl7cmV0dXJuIHQuZm91bmRhdGlvbl8uaGFuZGxlQm9keUNsaWNrKGUpfSx0aGlzLnJlZ2lzdGVyQm9keUNsaWNrTGlzdGVuZXJfPWZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsdC5oYW5kbGVCb2R5Q2xpY2tfKX0sdGhpcy5kZXJlZ2lzdGVyQm9keUNsaWNrTGlzdGVuZXJfPWZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsdC5oYW5kbGVCb2R5Q2xpY2tfKX0sdGhpcy5saXN0ZW4oXCJrZXlkb3duXCIsdGhpcy5oYW5kbGVLZXlkb3duXyksdGhpcy5saXN0ZW4ocy5lLk9QRU5FRF9FVkVOVCx0aGlzLnJlZ2lzdGVyQm9keUNsaWNrTGlzdGVuZXJfKSx0aGlzLmxpc3RlbihzLmUuQ0xPU0VEX0VWRU5ULHRoaXMuZGVyZWdpc3RlckJvZHlDbGlja0xpc3RlbmVyXyl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLnVubGlzdGVuKFwia2V5ZG93blwiLHRoaXMuaGFuZGxlS2V5ZG93bl8pLHRoaXMudW5saXN0ZW4ocy5lLk9QRU5FRF9FVkVOVCx0aGlzLnJlZ2lzdGVyQm9keUNsaWNrTGlzdGVuZXJfKSx0aGlzLnVubGlzdGVuKHMuZS5DTE9TRURfRVZFTlQsdGhpcy5kZXJlZ2lzdGVyQm9keUNsaWNrTGlzdGVuZXJfKSx0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcIm9wZW5cIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZm91bmRhdGlvbl8uaXNPcGVuKCl9LHNldDpmdW5jdGlvbih0KXtpZih0KXt2YXIgZT10aGlzLnJvb3RfLnF1ZXJ5U2VsZWN0b3JBbGwocy5lLkZPQ1VTQUJMRV9FTEVNRU5UUyk7dGhpcy5maXJzdEZvY3VzYWJsZUVsZW1lbnRfPWVbMF0sdGhpcy5sYXN0Rm9jdXNhYmxlRWxlbWVudF89ZVtlLmxlbmd0aC0xXSx0aGlzLmZvdW5kYXRpb25fLm9wZW4oKX1lbHNlIHRoaXMuZm91bmRhdGlvbl8uY2xvc2UoKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJxdWlja09wZW5cIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuZm91bmRhdGlvbl8uc2V0UXVpY2tPcGVuKHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmhvaXN0TWVudVRvQm9keT1mdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5yb290XyksdGhpcy5zZXRJc0hvaXN0ZWQoITApfSxlLnByb3RvdHlwZS5zZXRJc0hvaXN0ZWQ9ZnVuY3Rpb24odCl7dGhpcy5mb3VuZGF0aW9uXy5zZXRJc0hvaXN0ZWQodCl9LGUucHJvdG90eXBlLnNldE1lbnVTdXJmYWNlQW5jaG9yRWxlbWVudD1mdW5jdGlvbih0KXt0aGlzLmFuY2hvckVsZW1lbnQ9dH0sZS5wcm90b3R5cGUuc2V0Rml4ZWRQb3NpdGlvbj1mdW5jdGlvbih0KXt0P3RoaXMucm9vdF8uY2xhc3NMaXN0LmFkZChzLmMuRklYRUQpOnRoaXMucm9vdF8uY2xhc3NMaXN0LnJlbW92ZShzLmMuRklYRUQpLHRoaXMuZm91bmRhdGlvbl8uc2V0Rml4ZWRQb3NpdGlvbih0KX0sZS5wcm90b3R5cGUuc2V0QWJzb2x1dGVQb3NpdGlvbj1mdW5jdGlvbih0LGUpe3RoaXMuZm91bmRhdGlvbl8uc2V0QWJzb2x1dGVQb3NpdGlvbih0LGUpLHRoaXMuc2V0SXNIb2lzdGVkKCEwKX0sZS5wcm90b3R5cGUuc2V0QW5jaG9yQ29ybmVyPWZ1bmN0aW9uKHQpe3RoaXMuZm91bmRhdGlvbl8uc2V0QW5jaG9yQ29ybmVyKHQpfSxlLnByb3RvdHlwZS5zZXRBbmNob3JNYXJnaW49ZnVuY3Rpb24odCl7dGhpcy5mb3VuZGF0aW9uXy5zZXRBbmNob3JNYXJnaW4odCl9LGUucHJvdG90eXBlLmdldERlZmF1bHRGb3VuZGF0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXthZGRDbGFzczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yb290Xy5jbGFzc0xpc3QuYWRkKGUpfSxyZW1vdmVDbGFzczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yb290Xy5jbGFzc0xpc3QucmVtb3ZlKGUpfSxoYXNDbGFzczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yb290Xy5jbGFzc0xpc3QuY29udGFpbnMoZSl9LGhhc0FuY2hvcjpmdW5jdGlvbigpe3JldHVybiEhdC5hbmNob3JFbGVtZW50fSxub3RpZnlDbG9zZTpmdW5jdGlvbigpe3JldHVybiB0LmVtaXQobC5NRENNZW51U3VyZmFjZUZvdW5kYXRpb24uc3RyaW5ncy5DTE9TRURfRVZFTlQse30pfSxub3RpZnlPcGVuOmZ1bmN0aW9uKCl7cmV0dXJuIHQuZW1pdChsLk1EQ01lbnVTdXJmYWNlRm91bmRhdGlvbi5zdHJpbmdzLk9QRU5FRF9FVkVOVCx7fSl9LGlzRWxlbWVudEluQ29udGFpbmVyOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJvb3RfLmNvbnRhaW5zKGUpfSxpc1J0bDpmdW5jdGlvbigpe3JldHVyblwicnRsXCI9PT1nZXRDb21wdXRlZFN0eWxlKHQucm9vdF8pLmdldFByb3BlcnR5VmFsdWUoXCJkaXJlY3Rpb25cIil9LHNldFRyYW5zZm9ybU9yaWdpbjpmdW5jdGlvbihlKXt2YXIgbj1yKHdpbmRvdykrXCItb3JpZ2luXCI7dC5yb290Xy5zdHlsZS5zZXRQcm9wZXJ0eShuLGUpfSxpc0ZvY3VzZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PXQucm9vdF99LHNhdmVGb2N1czpmdW5jdGlvbigpe3QucHJldmlvdXNGb2N1c189ZG9jdW1lbnQuYWN0aXZlRWxlbWVudH0scmVzdG9yZUZvY3VzOmZ1bmN0aW9uKCl7dC5yb290Xy5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSYmdC5wcmV2aW91c0ZvY3VzXyYmdC5wcmV2aW91c0ZvY3VzXy5mb2N1cyYmdC5wcmV2aW91c0ZvY3VzXy5mb2N1cygpfSxpc0ZpcnN0RWxlbWVudEZvY3VzZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXQuZmlyc3RGb2N1c2FibGVFbGVtZW50XyYmdC5maXJzdEZvY3VzYWJsZUVsZW1lbnRfPT09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudH0saXNMYXN0RWxlbWVudEZvY3VzZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXQubGFzdEZvY3VzYWJsZUVsZW1lbnRfJiZ0Lmxhc3RGb2N1c2FibGVFbGVtZW50Xz09PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9LGZvY3VzRmlyc3RFbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHQuZmlyc3RGb2N1c2FibGVFbGVtZW50XyYmdC5maXJzdEZvY3VzYWJsZUVsZW1lbnRfLmZvY3VzJiZ0LmZpcnN0Rm9jdXNhYmxlRWxlbWVudF8uZm9jdXMoKX0sZm9jdXNMYXN0RWxlbWVudDpmdW5jdGlvbigpe3JldHVybiB0Lmxhc3RGb2N1c2FibGVFbGVtZW50XyYmdC5sYXN0Rm9jdXNhYmxlRWxlbWVudF8uZm9jdXMmJnQubGFzdEZvY3VzYWJsZUVsZW1lbnRfLmZvY3VzKCl9LGdldElubmVyRGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybnt3aWR0aDp0LnJvb3RfLm9mZnNldFdpZHRoLGhlaWdodDp0LnJvb3RfLm9mZnNldEhlaWdodH19LGdldEFuY2hvckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gdC5hbmNob3JFbGVtZW50P3QuYW5jaG9yRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTpudWxsfSxnZXRXaW5kb3dEaW1lbnNpb25zOmZ1bmN0aW9uKCl7cmV0dXJue3dpZHRoOndpbmRvdy5pbm5lcldpZHRoLGhlaWdodDp3aW5kb3cuaW5uZXJIZWlnaHR9fSxnZXRCb2R5RGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybnt3aWR0aDpkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLGhlaWdodDpkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodH19LGdldFdpbmRvd1Njcm9sbDpmdW5jdGlvbigpe3JldHVybnt4OndpbmRvdy5wYWdlWE9mZnNldCx5OndpbmRvdy5wYWdlWU9mZnNldH19LHNldFBvc2l0aW9uOmZ1bmN0aW9uKGUpe3Qucm9vdF8uc3R5bGUubGVmdD1cImxlZnRcImluIGU/ZS5sZWZ0K1wicHhcIjpcIlwiLHQucm9vdF8uc3R5bGUucmlnaHQ9XCJyaWdodFwiaW4gZT9lLnJpZ2h0K1wicHhcIjpcIlwiLHQucm9vdF8uc3R5bGUudG9wPVwidG9wXCJpbiBlP2UudG9wK1wicHhcIjpcIlwiLHQucm9vdF8uc3R5bGUuYm90dG9tPVwiYm90dG9tXCJpbiBlP2UuYm90dG9tK1wicHhcIjpcIlwifSxzZXRNYXhIZWlnaHQ6ZnVuY3Rpb24oZSl7dC5yb290Xy5zdHlsZS5tYXhIZWlnaHQ9ZX19O3JldHVybiBuZXcgbC5NRENNZW51U3VyZmFjZUZvdW5kYXRpb24oZSl9LGV9KGMpO24uZChlLFwiQ29ybmVyXCIsZnVuY3Rpb24oKXtyZXR1cm4gcy5hfSksbi5kKGUsXCJDb3JuZXJCaXRcIixmdW5jdGlvbigpe3JldHVybiBzLmJ9KSxuLmQoZSxcInV0aWxcIixmdW5jdGlvbigpe3JldHVybiBpfSksbi5kKGUsXCJNRENNZW51U3VyZmFjZVwiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KSxuLmQoZSxcIk1EQ01lbnVTdXJmYWNlRm91bmRhdGlvblwiLGZ1bmN0aW9uKCl7cmV0dXJuIGwuTURDTWVudVN1cmZhY2VGb3VuZGF0aW9ufSl9LDE2OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSksbi5kKGUsXCJNRENNZW51U3VyZmFjZUZvdW5kYXRpb25cIixmdW5jdGlvbigpe3JldHVybiBzfSk7dmFyIG89bigxNSksaT1uKDI4KSxyPW4oMykscz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciBpPXQuY2FsbCh0aGlzLG8uYSh7fSxlLmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpcztyZXR1cm4gaS5pc09wZW5fPSExLGkuaXNRdWlja09wZW5fPSExLGkuaXNIb2lzdGVkRWxlbWVudF89ITEsaS5pc0ZpeGVkUG9zaXRpb25fPSExLGkub3BlbkFuaW1hdGlvbkVuZFRpbWVySWRfPTAsaS5jbG9zZUFuaW1hdGlvbkVuZFRpbWVySWRfPTAsaS5hbmltYXRpb25SZXF1ZXN0SWRfPTAsaS5hbmNob3JDb3JuZXJfPXIuYS5UT1BfU1RBUlQsaS5hbmNob3JNYXJnaW5fPXt0b3A6MCxyaWdodDowLGJvdHRvbTowLGxlZnQ6MH0saS5wb3NpdGlvbl89e3g6MCx5OjB9LGl9cmV0dXJuIG8uYihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5jfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwic3RyaW5nc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5lfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwibnVtYmVyc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5kfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiQ29ybmVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybiByLmF9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJkZWZhdWx0QWRhcHRlclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57YWRkQ2xhc3M6ZnVuY3Rpb24oKXt9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKCl7fSxoYXNDbGFzczpmdW5jdGlvbigpe3JldHVybiExfSxoYXNBbmNob3I6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXNFbGVtZW50SW5Db250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXNGb2N1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGlzRmlyc3RFbGVtZW50Rm9jdXNlZDpmdW5jdGlvbigpe3JldHVybiExfSxpc0xhc3RFbGVtZW50Rm9jdXNlZDpmdW5jdGlvbigpe3JldHVybiExfSxpc1J0bDpmdW5jdGlvbigpe3JldHVybiExfSxnZXRJbm5lckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm57aGVpZ2h0OjAsd2lkdGg6MH19LGdldEFuY2hvckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sZ2V0V2luZG93RGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybntoZWlnaHQ6MCx3aWR0aDowfX0sZ2V0Qm9keURpbWVuc2lvbnM6ZnVuY3Rpb24oKXtyZXR1cm57aGVpZ2h0OjAsd2lkdGg6MH19LGdldFdpbmRvd1Njcm9sbDpmdW5jdGlvbigpe3JldHVybnt4OjAseTowfX0sc2V0UG9zaXRpb246ZnVuY3Rpb24oKXt9LHNldE1heEhlaWdodDpmdW5jdGlvbigpe30sc2V0VHJhbnNmb3JtT3JpZ2luOmZ1bmN0aW9uKCl7fSxzYXZlRm9jdXM6ZnVuY3Rpb24oKXt9LHJlc3RvcmVGb2N1czpmdW5jdGlvbigpe30sZm9jdXNGaXJzdEVsZW1lbnQ6ZnVuY3Rpb24oKXt9LGZvY3VzTGFzdEVsZW1lbnQ6ZnVuY3Rpb24oKXt9LG5vdGlmeUNsb3NlOmZ1bmN0aW9uKCl7fSxub3RpZnlPcGVuOmZ1bmN0aW9uKCl7fX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciB0PWUuY3NzQ2xhc3NlcyxuPXQuUk9PVCxvPXQuT1BFTjtpZighdGhpcy5hZGFwdGVyXy5oYXNDbGFzcyhuKSl0aHJvdyBuZXcgRXJyb3IobitcIiBjbGFzcyByZXF1aXJlZCBpbiByb290IGVsZW1lbnQuXCIpO3RoaXMuYWRhcHRlcl8uaGFzQ2xhc3MobykmJih0aGlzLmlzT3Blbl89ITApfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMub3BlbkFuaW1hdGlvbkVuZFRpbWVySWRfKSxjbGVhclRpbWVvdXQodGhpcy5jbG9zZUFuaW1hdGlvbkVuZFRpbWVySWRfKSxjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvblJlcXVlc3RJZF8pfSxlLnByb3RvdHlwZS5zZXRBbmNob3JDb3JuZXI9ZnVuY3Rpb24odCl7dGhpcy5hbmNob3JDb3JuZXJfPXR9LGUucHJvdG90eXBlLnNldEFuY2hvck1hcmdpbj1mdW5jdGlvbih0KXt0aGlzLmFuY2hvck1hcmdpbl8udG9wPXQudG9wfHwwLHRoaXMuYW5jaG9yTWFyZ2luXy5yaWdodD10LnJpZ2h0fHwwLHRoaXMuYW5jaG9yTWFyZ2luXy5ib3R0b209dC5ib3R0b218fDAsdGhpcy5hbmNob3JNYXJnaW5fLmxlZnQ9dC5sZWZ0fHwwfSxlLnByb3RvdHlwZS5zZXRJc0hvaXN0ZWQ9ZnVuY3Rpb24odCl7dGhpcy5pc0hvaXN0ZWRFbGVtZW50Xz10fSxlLnByb3RvdHlwZS5zZXRGaXhlZFBvc2l0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuaXNGaXhlZFBvc2l0aW9uXz10fSxlLnByb3RvdHlwZS5zZXRBYnNvbHV0ZVBvc2l0aW9uPWZ1bmN0aW9uKHQsZSl7dGhpcy5wb3NpdGlvbl8ueD10aGlzLmlzRmluaXRlXyh0KT90OjAsdGhpcy5wb3NpdGlvbl8ueT10aGlzLmlzRmluaXRlXyhlKT9lOjB9LGUucHJvdG90eXBlLnNldFF1aWNrT3Blbj1mdW5jdGlvbih0KXt0aGlzLmlzUXVpY2tPcGVuXz10fSxlLnByb3RvdHlwZS5pc09wZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc09wZW5ffSxlLnByb3RvdHlwZS5vcGVuPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmFkYXB0ZXJfLnNhdmVGb2N1cygpLHRoaXMuaXNRdWlja09wZW5ffHx0aGlzLmFkYXB0ZXJfLmFkZENsYXNzKGUuY3NzQ2xhc3Nlcy5BTklNQVRJTkdfT1BFTiksdGhpcy5hbmltYXRpb25SZXF1ZXN0SWRfPXJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3QuYWRhcHRlcl8uYWRkQ2xhc3MoZS5jc3NDbGFzc2VzLk9QRU4pLHQuZGltZW5zaW9uc189dC5hZGFwdGVyXy5nZXRJbm5lckRpbWVuc2lvbnMoKSx0LmF1dG9Qb3NpdGlvbl8oKSx0LmlzUXVpY2tPcGVuXz90LmFkYXB0ZXJfLm5vdGlmeU9wZW4oKTp0Lm9wZW5BbmltYXRpb25FbmRUaW1lcklkXz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5vcGVuQW5pbWF0aW9uRW5kVGltZXJJZF89MCx0LmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGUuY3NzQ2xhc3Nlcy5BTklNQVRJTkdfT1BFTiksdC5hZGFwdGVyXy5ub3RpZnlPcGVuKCl9LHIuZC5UUkFOU0lUSU9OX09QRU5fRFVSQVRJT04pfSksdGhpcy5pc09wZW5fPSEwfSxlLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5pc1F1aWNrT3Blbl98fHRoaXMuYWRhcHRlcl8uYWRkQ2xhc3MoZS5jc3NDbGFzc2VzLkFOSU1BVElOR19DTE9TRUQpLHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3QuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoZS5jc3NDbGFzc2VzLk9QRU4pLHQuaXNRdWlja09wZW5fP3QuYWRhcHRlcl8ubm90aWZ5Q2xvc2UoKTp0LmNsb3NlQW5pbWF0aW9uRW5kVGltZXJJZF89c2V0VGltZW91dChmdW5jdGlvbigpe3QuY2xvc2VBbmltYXRpb25FbmRUaW1lcklkXz0wLHQuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoZS5jc3NDbGFzc2VzLkFOSU1BVElOR19DTE9TRUQpLHQuYWRhcHRlcl8ubm90aWZ5Q2xvc2UoKX0sci5kLlRSQU5TSVRJT05fQ0xPU0VfRFVSQVRJT04pfSksdGhpcy5pc09wZW5fPSExLHRoaXMubWF5YmVSZXN0b3JlRm9jdXNfKCl9LGUucHJvdG90eXBlLmhhbmRsZUJvZHlDbGljaz1mdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldDt0aGlzLmFkYXB0ZXJfLmlzRWxlbWVudEluQ29udGFpbmVyKGUpfHx0aGlzLmNsb3NlKCl9LGUucHJvdG90eXBlLmhhbmRsZUtleWRvd249ZnVuY3Rpb24odCl7dmFyIGU9dC5rZXlDb2RlLG49dC5rZXksbz10LnNoaWZ0S2V5LGk9XCJUYWJcIj09PW58fDk9PT1lO1wiRXNjYXBlXCI9PT1ufHwyNz09PWU/dGhpcy5jbG9zZSgpOmkmJih0aGlzLmFkYXB0ZXJfLmlzTGFzdEVsZW1lbnRGb2N1c2VkKCkmJiFvPyh0aGlzLmFkYXB0ZXJfLmZvY3VzRmlyc3RFbGVtZW50KCksdC5wcmV2ZW50RGVmYXVsdCgpKTp0aGlzLmFkYXB0ZXJfLmlzRmlyc3RFbGVtZW50Rm9jdXNlZCgpJiZvJiYodGhpcy5hZGFwdGVyXy5mb2N1c0xhc3RFbGVtZW50KCksdC5wcmV2ZW50RGVmYXVsdCgpKSl9LGUucHJvdG90eXBlLmF1dG9Qb3NpdGlvbl89ZnVuY3Rpb24oKXt2YXIgdDt0aGlzLm1lYXN1cmVtZW50c189dGhpcy5nZXRBdXRvTGF5b3V0TWVhc3VyZW1lbnRzXygpO3ZhciBlPXRoaXMuZ2V0T3JpZ2luQ29ybmVyXygpLG49dGhpcy5nZXRNZW51U3VyZmFjZU1heEhlaWdodF8oZSksbz10aGlzLmhhc0JpdF8oZSxyLmIuQk9UVE9NKT9cImJvdHRvbVwiOlwidG9wXCIsaT10aGlzLmhhc0JpdF8oZSxyLmIuUklHSFQpP1wicmlnaHRcIjpcImxlZnRcIixzPXRoaXMuZ2V0SG9yaXpvbnRhbE9yaWdpbk9mZnNldF8oZSksdT10aGlzLmdldFZlcnRpY2FsT3JpZ2luT2Zmc2V0XyhlKSxhPXRoaXMubWVhc3VyZW1lbnRzXyxjPWEuYW5jaG9yU2l6ZSxsPWEuc3VyZmFjZVNpemUsZj0oKHQ9e30pW2ldPXMsdFtvXT11LHQpO2Mud2lkdGgvbC53aWR0aD5yLmQuQU5DSE9SX1RPX01FTlVfU1VSRkFDRV9XSURUSF9SQVRJTyYmKGk9XCJjZW50ZXJcIiksKHRoaXMuaXNIb2lzdGVkRWxlbWVudF98fHRoaXMuaXNGaXhlZFBvc2l0aW9uXykmJnRoaXMuYWRqdXN0UG9zaXRpb25Gb3JIb2lzdGVkRWxlbWVudF8oZiksdGhpcy5hZGFwdGVyXy5zZXRUcmFuc2Zvcm1PcmlnaW4oaStcIiBcIitvKSx0aGlzLmFkYXB0ZXJfLnNldFBvc2l0aW9uKGYpLHRoaXMuYWRhcHRlcl8uc2V0TWF4SGVpZ2h0KG4/bitcInB4XCI6XCJcIil9LGUucHJvdG90eXBlLmdldEF1dG9MYXlvdXRNZWFzdXJlbWVudHNfPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5hZGFwdGVyXy5nZXRBbmNob3JEaW1lbnNpb25zKCksZT10aGlzLmFkYXB0ZXJfLmdldEJvZHlEaW1lbnNpb25zKCksbj10aGlzLmFkYXB0ZXJfLmdldFdpbmRvd0RpbWVuc2lvbnMoKSxvPXRoaXMuYWRhcHRlcl8uZ2V0V2luZG93U2Nyb2xsKCk7cmV0dXJuIHR8fCh0PXt0b3A6dGhpcy5wb3NpdGlvbl8ueSxyaWdodDp0aGlzLnBvc2l0aW9uXy54LGJvdHRvbTp0aGlzLnBvc2l0aW9uXy55LGxlZnQ6dGhpcy5wb3NpdGlvbl8ueCx3aWR0aDowLGhlaWdodDowfSkse2FuY2hvclNpemU6dCxib2R5U2l6ZTplLHN1cmZhY2VTaXplOnRoaXMuZGltZW5zaW9uc18sdmlld3BvcnREaXN0YW5jZTp7dG9wOnQudG9wLHJpZ2h0Om4ud2lkdGgtdC5yaWdodCxib3R0b206bi5oZWlnaHQtdC5ib3R0b20sbGVmdDp0LmxlZnR9LHZpZXdwb3J0U2l6ZTpuLHdpbmRvd1Njcm9sbDpvfX0sZS5wcm90b3R5cGUuZ2V0T3JpZ2luQ29ybmVyXz1mdW5jdGlvbigpe3ZhciB0PXIuYS5UT1BfTEVGVCxlPXRoaXMubWVhc3VyZW1lbnRzXyxuPWUudmlld3BvcnREaXN0YW5jZSxvPWUuYW5jaG9yU2l6ZSxpPWUuc3VyZmFjZVNpemUscz10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLHIuYi5CT1RUT00pLHU9cz9uLnRvcCtvLmhlaWdodCt0aGlzLmFuY2hvck1hcmdpbl8uYm90dG9tOm4udG9wK3RoaXMuYW5jaG9yTWFyZ2luXy50b3AsYT1zP24uYm90dG9tLXRoaXMuYW5jaG9yTWFyZ2luXy5ib3R0b206bi5ib3R0b20rby5oZWlnaHQtdGhpcy5hbmNob3JNYXJnaW5fLnRvcCxjPWkuaGVpZ2h0LXUsbD1pLmhlaWdodC1hO2w+MCYmYzxsJiYodD10aGlzLnNldEJpdF8odCxyLmIuQk9UVE9NKSk7dmFyIGY9dGhpcy5hZGFwdGVyXy5pc1J0bCgpLGg9dGhpcy5oYXNCaXRfKHRoaXMuYW5jaG9yQ29ybmVyXyxyLmIuRkxJUF9SVEwpLGQ9dGhpcy5oYXNCaXRfKHRoaXMuYW5jaG9yQ29ybmVyXyxyLmIuUklHSFQpLHA9ZCYmIWZ8fCFkJiZoJiZmLG09cD9uLmxlZnQrby53aWR0aCt0aGlzLmFuY2hvck1hcmdpbl8ucmlnaHQ6bi5sZWZ0K3RoaXMuYW5jaG9yTWFyZ2luXy5sZWZ0LF89cD9uLnJpZ2h0LXRoaXMuYW5jaG9yTWFyZ2luXy5yaWdodDpuLnJpZ2h0K28ud2lkdGgtdGhpcy5hbmNob3JNYXJnaW5fLmxlZnQseT1pLndpZHRoLW0sZz1pLndpZHRoLV87cmV0dXJuKHk8MCYmcCYmZnx8ZCYmIXAmJnk8MHx8Zz4wJiZ5PGcpJiYodD10aGlzLnNldEJpdF8odCxyLmIuUklHSFQpKSx0fSxlLnByb3RvdHlwZS5nZXRNZW51U3VyZmFjZU1heEhlaWdodF89ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5tZWFzdXJlbWVudHNfLnZpZXdwb3J0RGlzdGFuY2Usbz0wLGk9dGhpcy5oYXNCaXRfKHQsci5iLkJPVFRPTSkscz10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLHIuYi5CT1RUT00pLHU9ZS5udW1iZXJzLk1BUkdJTl9UT19FREdFO3JldHVybiBpPyhvPW4udG9wK3RoaXMuYW5jaG9yTWFyZ2luXy50b3AtdSxzfHwobys9dGhpcy5tZWFzdXJlbWVudHNfLmFuY2hvclNpemUuaGVpZ2h0KSk6KG89bi5ib3R0b20tdGhpcy5hbmNob3JNYXJnaW5fLmJvdHRvbSt0aGlzLm1lYXN1cmVtZW50c18uYW5jaG9yU2l6ZS5oZWlnaHQtdSxzJiYoby09dGhpcy5tZWFzdXJlbWVudHNfLmFuY2hvclNpemUuaGVpZ2h0KSksb30sZS5wcm90b3R5cGUuZ2V0SG9yaXpvbnRhbE9yaWdpbk9mZnNldF89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5tZWFzdXJlbWVudHNfLmFuY2hvclNpemUsbj10aGlzLmhhc0JpdF8odCxyLmIuUklHSFQpLG89dGhpcy5oYXNCaXRfKHRoaXMuYW5jaG9yQ29ybmVyXyxyLmIuUklHSFQpO2lmKG4pe3ZhciBpPW8/ZS53aWR0aC10aGlzLmFuY2hvck1hcmdpbl8ubGVmdDp0aGlzLmFuY2hvck1hcmdpbl8ucmlnaHQ7cmV0dXJuIHRoaXMuaXNIb2lzdGVkRWxlbWVudF98fHRoaXMuaXNGaXhlZFBvc2l0aW9uXz9pLSh0aGlzLm1lYXN1cmVtZW50c18udmlld3BvcnRTaXplLndpZHRoLXRoaXMubWVhc3VyZW1lbnRzXy5ib2R5U2l6ZS53aWR0aCk6aX1yZXR1cm4gbz9lLndpZHRoLXRoaXMuYW5jaG9yTWFyZ2luXy5yaWdodDp0aGlzLmFuY2hvck1hcmdpbl8ubGVmdH0sZS5wcm90b3R5cGUuZ2V0VmVydGljYWxPcmlnaW5PZmZzZXRfPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubWVhc3VyZW1lbnRzXy5hbmNob3JTaXplLG49dGhpcy5oYXNCaXRfKHQsci5iLkJPVFRPTSksbz10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLHIuYi5CT1RUT00pO3JldHVybiBuP28/ZS5oZWlnaHQtdGhpcy5hbmNob3JNYXJnaW5fLnRvcDotdGhpcy5hbmNob3JNYXJnaW5fLmJvdHRvbTpvP2UuaGVpZ2h0K3RoaXMuYW5jaG9yTWFyZ2luXy5ib3R0b206dGhpcy5hbmNob3JNYXJnaW5fLnRvcH0sZS5wcm90b3R5cGUuYWRqdXN0UG9zaXRpb25Gb3JIb2lzdGVkRWxlbWVudF89ZnVuY3Rpb24odCl7dmFyIGUsbixpPXRoaXMubWVhc3VyZW1lbnRzXyxyPWkud2luZG93U2Nyb2xsLHM9aS52aWV3cG9ydERpc3RhbmNlLHU9T2JqZWN0LmtleXModCk7dHJ5e2Zvcih2YXIgYT1vLmQodSksYz1hLm5leHQoKTshYy5kb25lO2M9YS5uZXh0KCkpe3ZhciBsPWMudmFsdWUsZj10W2xdfHwwO2YrPXNbbF0sdGhpcy5pc0ZpeGVkUG9zaXRpb25ffHwoXCJ0b3BcIj09PWw/Zis9ci55OlwiYm90dG9tXCI9PT1sP2YtPXIueTpcImxlZnRcIj09PWw/Zis9ci54OmYtPXIueCksdFtsXT1mfX1jYXRjaCh0KXtlPXtlcnJvcjp0fX1maW5hbGx5e3RyeXtjJiYhYy5kb25lJiYobj1hLnJldHVybikmJm4uY2FsbChhKX1maW5hbGx5e2lmKGUpdGhyb3cgZS5lcnJvcn19fSxlLnByb3RvdHlwZS5tYXliZVJlc3RvcmVGb2N1c189ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmFkYXB0ZXJfLmlzRm9jdXNlZCgpLGU9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCYmdGhpcy5hZGFwdGVyXy5pc0VsZW1lbnRJbkNvbnRhaW5lcihkb2N1bWVudC5hY3RpdmVFbGVtZW50KTsodHx8ZSkmJnRoaXMuYWRhcHRlcl8ucmVzdG9yZUZvY3VzKCl9LGUucHJvdG90eXBlLmhhc0JpdF89ZnVuY3Rpb24odCxlKXtyZXR1cm4gQm9vbGVhbih0JmUpfSxlLnByb3RvdHlwZS5zZXRCaXRfPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHR8ZX0sZS5wcm90b3R5cGUuaXNGaW5pdGVfPWZ1bmN0aW9uKHQpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiB0JiZpc0Zpbml0ZSh0KX0sZX0oaS5hKTtlLmRlZmF1bHQ9c30sMjg6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24uZChlLFwiYVwiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZvaWQgMD09PXQmJih0PXt9KSx0aGlzLmFkYXB0ZXJfPXR9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcInN0cmluZ3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJudW1iZXJzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe30sdH0oKX0sMzpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJjXCIsZnVuY3Rpb24oKXtyZXR1cm4gcn0pLG4uZChlLFwiZVwiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSxuLmQoZSxcImRcIixmdW5jdGlvbigpe3JldHVybiB1fSksbi5kKGUsXCJiXCIsZnVuY3Rpb24oKXtyZXR1cm4gb30pLG4uZChlLFwiYVwiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIG8saSxyPXtBTkNIT1I6XCJtZGMtbWVudS1zdXJmYWNlLS1hbmNob3JcIixBTklNQVRJTkdfQ0xPU0VEOlwibWRjLW1lbnUtc3VyZmFjZS0tYW5pbWF0aW5nLWNsb3NlZFwiLEFOSU1BVElOR19PUEVOOlwibWRjLW1lbnUtc3VyZmFjZS0tYW5pbWF0aW5nLW9wZW5cIixGSVhFRDpcIm1kYy1tZW51LXN1cmZhY2UtLWZpeGVkXCIsT1BFTjpcIm1kYy1tZW51LXN1cmZhY2UtLW9wZW5cIixST09UOlwibWRjLW1lbnUtc3VyZmFjZVwifSxzPXtDTE9TRURfRVZFTlQ6XCJNRENNZW51U3VyZmFjZTpjbG9zZWRcIixPUEVORURfRVZFTlQ6XCJNRENNZW51U3VyZmFjZTpvcGVuZWRcIixGT0NVU0FCTEVfRUxFTUVOVFM6W1wiYnV0dG9uOm5vdCg6ZGlzYWJsZWQpXCIsJ1tocmVmXTpub3QoW2FyaWEtZGlzYWJsZWQ9XCJ0cnVlXCJdKScsXCJpbnB1dDpub3QoOmRpc2FibGVkKVwiLFwic2VsZWN0Om5vdCg6ZGlzYWJsZWQpXCIsXCJ0ZXh0YXJlYTpub3QoOmRpc2FibGVkKVwiLCdbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9XCItMVwiXSk6bm90KFthcmlhLWRpc2FibGVkPVwidHJ1ZVwiXSknXS5qb2luKFwiLCBcIil9LHU9e1RSQU5TSVRJT05fT1BFTl9EVVJBVElPTjoxMjAsVFJBTlNJVElPTl9DTE9TRV9EVVJBVElPTjo3NSxNQVJHSU5fVE9fRURHRTozMixBTkNIT1JfVE9fTUVOVV9TVVJGQUNFX1dJRFRIX1JBVElPOi42N307IWZ1bmN0aW9uKHQpe3RbdC5CT1RUT009MV09XCJCT1RUT01cIix0W3QuQ0VOVEVSPTJdPVwiQ0VOVEVSXCIsdFt0LlJJR0hUPTRdPVwiUklHSFRcIix0W3QuRkxJUF9SVEw9OF09XCJGTElQX1JUTFwifShvfHwobz17fSkpLGZ1bmN0aW9uKHQpe3RbdC5UT1BfTEVGVD0wXT1cIlRPUF9MRUZUXCIsdFt0LlRPUF9SSUdIVD00XT1cIlRPUF9SSUdIVFwiLHRbdC5CT1RUT01fTEVGVD0xXT1cIkJPVFRPTV9MRUZUXCIsdFt0LkJPVFRPTV9SSUdIVD01XT1cIkJPVFRPTV9SSUdIVFwiLHRbdC5UT1BfU1RBUlQ9OF09XCJUT1BfU1RBUlRcIix0W3QuVE9QX0VORD0xMl09XCJUT1BfRU5EXCIsdFt0LkJPVFRPTV9TVEFSVD05XT1cIkJPVFRPTV9TVEFSVFwiLHRbdC5CT1RUT01fRU5EPTEzXT1cIkJPVFRPTV9FTkRcIn0oaXx8KGk9e30pKX19KX0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVudS1zdXJmYWNlLmpzLm1hcCIsIiFmdW5jdGlvbih0LGUpe2lmKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPWUocmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtlbHNlIGlmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW1wicmVhY3RcIixcImNsYXNzbmFtZXNcIl0sZSk7ZWxzZXt2YXIgbj1cIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9lKHJlcXVpcmUoXCJyZWFjdFwiKSxyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk6ZSh0LnJlYWN0LHQuY2xhc3NuYW1lcyk7Zm9yKHZhciByIGluIG4pKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6dClbcl09bltyXX19KFwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcyxmdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT17fTtmdW5jdGlvbiBuKHIpe2lmKGVbcl0pcmV0dXJuIGVbcl0uZXhwb3J0czt2YXIgbz1lW3JdPXtpOnIsbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gdFtyXS5jYWxsKG8uZXhwb3J0cyxvLG8uZXhwb3J0cyxuKSxvLmw9ITAsby5leHBvcnRzfXJldHVybiBuLm09dCxuLmM9ZSxuLmQ9ZnVuY3Rpb24odCxlLHIpe24ubyh0LGUpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHtlbnVtZXJhYmxlOiEwLGdldDpyfSl9LG4ucj1mdW5jdGlvbih0KXtcInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6XCJNb2R1bGVcIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSxuLnQ9ZnVuY3Rpb24odCxlKXtpZigxJmUmJih0PW4odCkpLDgmZSlyZXR1cm4gdDtpZig0JmUmJlwib2JqZWN0XCI9PXR5cGVvZiB0JiZ0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIHI9T2JqZWN0LmNyZWF0ZShudWxsKTtpZihuLnIociksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsXCJkZWZhdWx0XCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pLDImZSYmXCJzdHJpbmdcIiE9dHlwZW9mIHQpZm9yKHZhciBvIGluIHQpbi5kKHIsbyxmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0uYmluZChudWxsLG8pKTtyZXR1cm4gcn0sbi5uPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiB0LmRlZmF1bHR9OmZ1bmN0aW9uKCl7cmV0dXJuIHR9O3JldHVybiBuLmQoZSxcImFcIixlKSxlfSxuLm89ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9LG4ucD1cIlwiLG4obi5zPTEwNCl9KHswOmZ1bmN0aW9uKGUsbil7ZS5leHBvcnRzPXR9LDE6ZnVuY3Rpb24odCxuKXt0LmV4cG9ydHM9ZX0sMTA0OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcixvPXRoaXMmJnRoaXMuX19leHRlbmRzfHwocj1mdW5jdGlvbih0LGUpe3JldHVybihyPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSkodCxlKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fXIodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxpPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKGk9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rKylmb3IodmFyIG8gaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbykmJih0W29dPWVbb10pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxhPXRoaXMmJnRoaXMuX19yZXN0fHxmdW5jdGlvbih0LGUpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LHIpJiZlLmluZGV4T2Yocik8MCYmKG5bcl09dFtyXSk7aWYobnVsbCE9dCYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG89MDtmb3Iocj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO288ci5sZW5ndGg7bysrKWUuaW5kZXhPZihyW29dKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodCxyW29dKSYmKG5bcltvXV09dFtyW29dXSl9cmV0dXJuIG59LHM9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIGM9cyhuKDApKSx1PXMobigxKSksbD1uKDE2OCksZD1uKDE2NSksZj1sLk1EQ05vdGNoZWRPdXRsaW5lRm91bmRhdGlvbi5jc3NDbGFzc2VzLHA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5ub3RjaGVkRWw9Yy5kZWZhdWx0LmNyZWF0ZVJlZigpLGUuc3RhdGU9e2NsYXNzTGlzdDpuZXcgU2V0LGZvdW5kYXRpb25Ob3RjaFdpZHRoOnZvaWQgMH0sZS5hZGRDbGFzcz1mdW5jdGlvbih0KXtlLnNldFN0YXRlKGZ1bmN0aW9uKGUpe3ZhciBuPW5ldyBTZXQoZS5jbGFzc0xpc3QpO3JldHVybiBuLmFkZCh0KSx7Y2xhc3NMaXN0Om59fSl9LGUubm90Y2g9ZnVuY3Rpb24oKXt2YXIgdD1lLnByb3BzLG49dC5ub3RjaFdpZHRoLHI9dC5ub3RjaDtlLmZvdW5kYXRpb24mJihyP2UuZm91bmRhdGlvbi5ub3RjaChuKTplLmZvdW5kYXRpb24uY2xvc2VOb3RjaCgpKX0sZX1yZXR1cm4gbyhlLHQpLGUucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmZvdW5kYXRpb249bmV3IGwuTURDTm90Y2hlZE91dGxpbmVGb3VuZGF0aW9uKHRoaXMuYWRhcHRlciksdGhpcy5mb3VuZGF0aW9uLmluaXQoKSx0aGlzLm5vdGNoKCksdGhpcy5sYWJlbCYmKHRoaXMubGFiZWwuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPVwiMHNcIix0aGlzLmFkZENsYXNzKGYuT1VUTElORV9VUEdSQURFRCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7dC5sYWJlbCYmKHQubGFiZWwuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPVwiXCIpfSkpfSxlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMuZm91bmRhdGlvbiYmdGhpcy5mb3VuZGF0aW9uLmRlc3Ryb3koKX0sZS5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPWZ1bmN0aW9uKHQpe3RoaXMucHJvcHMubm90Y2hXaWR0aD09PXQubm90Y2hXaWR0aCYmdGhpcy5wcm9wcy5ub3RjaD09PXQubm90Y2h8fHRoaXMubm90Y2goKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiY2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuc3RhdGUuY2xhc3NMaXN0LG49dGhpcy5wcm9wcy5jbGFzc05hbWU7cmV0dXJuIHUuZGVmYXVsdChcIm1kYy1ub3RjaGVkLW91dGxpbmVcIixBcnJheS5mcm9tKGUpLG4sKCh0PXt9KVtmLk5PX0xBQkVMXT0hdGhpcy5sYWJlbCx0KSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwibGFiZWxcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm90Y2hlZEVsLmN1cnJlbnQ/dGhpcy5ub3RjaGVkRWwuY3VycmVudC5xdWVyeVNlbGVjdG9yKFwiLlwiK2QuTURDRmxvYXRpbmdMYWJlbEZvdW5kYXRpb24uY3NzQ2xhc3Nlcy5ST09UKTpudWxsfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm57YWRkQ2xhc3M6dGhpcy5hZGRDbGFzcyxyZW1vdmVDbGFzczpmdW5jdGlvbihlKXt0LnNldFN0YXRlKGZ1bmN0aW9uKHQpe3ZhciBuPW5ldyBTZXQodC5jbGFzc0xpc3QpO3JldHVybiBuLmRlbGV0ZShlKSx7Y2xhc3NMaXN0Om59fSl9LHNldE5vdGNoV2lkdGhQcm9wZXJ0eTpmdW5jdGlvbihlKXtyZXR1cm4gdC5zZXRTdGF0ZSh7Zm91bmRhdGlvbk5vdGNoV2lkdGg6ZX0pfSxyZW1vdmVOb3RjaFdpZHRoUHJvcGVydHk6ZnVuY3Rpb24oKXtyZXR1cm4gdC5zZXRTdGF0ZSh7Zm91bmRhdGlvbk5vdGNoV2lkdGg6dm9pZCAwfSl9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9dC5jaGlsZHJlbixuPSh0LmNsYXNzTmFtZSx0Lm5vdGNoV2lkdGgsdC5ub3RjaCxhKHQsW1wiY2hpbGRyZW5cIixcImNsYXNzTmFtZVwiLFwibm90Y2hXaWR0aFwiLFwibm90Y2hcIl0pKSxyPXRoaXMuc3RhdGUuZm91bmRhdGlvbk5vdGNoV2lkdGgsbz17d2lkdGg6cj9yK1wicHhcIjp2b2lkIDB9O3JldHVybiBjLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLGkoe2NsYXNzTmFtZTp0aGlzLmNsYXNzZXMscmVmOnRoaXMubm90Y2hlZEVsfSxuKSxjLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJtZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nXCJ9KSxlP2MuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcIm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoXCIsc3R5bGU6b30sYy5kZWZhdWx0LkNoaWxkcmVuLm9ubHkoZSkpOm51bGwsYy5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwibWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmdcIn0pKX0sZS5kZWZhdWx0UHJvcHM9e2NsYXNzTmFtZTpcIlwiLG5vdGNoV2lkdGg6MCxub3RjaDohMX0sZX0oYy5kZWZhdWx0LkNvbXBvbmVudCk7ZS5kZWZhdWx0PXB9LDE2NTpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5yKGUpO3ZhciByPW4oMjIpLG89bigyOSksaT17TEFCRUxfRkxPQVRfQUJPVkU6XCJtZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlXCIsTEFCRUxfU0hBS0U6XCJtZGMtZmxvYXRpbmctbGFiZWwtLXNoYWtlXCIsUk9PVDpcIm1kYy1mbG9hdGluZy1sYWJlbFwifTtuLmQoZSxcIk1EQ0Zsb2F0aW5nTGFiZWxGb3VuZGF0aW9uXCIsZnVuY3Rpb24oKXtyZXR1cm4gYX0pO1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG52YXIgYT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciBvPXQuY2FsbCh0aGlzLHIuYSh7fSxlLmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpcztyZXR1cm4gby5zaGFrZUFuaW1hdGlvbkVuZEhhbmRsZXJfPWZ1bmN0aW9uKCl7cmV0dXJuIG8uaGFuZGxlU2hha2VBbmltYXRpb25FbmRfKCl9LG99cmV0dXJuIHIuYihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybnthZGRDbGFzczpmdW5jdGlvbigpe30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oKXt9LGdldFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LHJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxkZXJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3RoaXMuYWRhcHRlcl8ucmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXIoXCJhbmltYXRpb25lbmRcIix0aGlzLnNoYWtlQW5pbWF0aW9uRW5kSGFuZGxlcl8pfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5hZGFwdGVyXy5kZXJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyKFwiYW5pbWF0aW9uZW5kXCIsdGhpcy5zaGFrZUFuaW1hdGlvbkVuZEhhbmRsZXJfKX0sZS5wcm90b3R5cGUuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZGFwdGVyXy5nZXRXaWR0aCgpfSxlLnByb3RvdHlwZS5zaGFrZT1mdW5jdGlvbih0KXt2YXIgbj1lLmNzc0NsYXNzZXMuTEFCRUxfU0hBS0U7dD90aGlzLmFkYXB0ZXJfLmFkZENsYXNzKG4pOnRoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3Mobil9LGUucHJvdG90eXBlLmZsb2F0PWZ1bmN0aW9uKHQpe3ZhciBuPWUuY3NzQ2xhc3NlcyxyPW4uTEFCRUxfRkxPQVRfQUJPVkUsbz1uLkxBQkVMX1NIQUtFO3Q/dGhpcy5hZGFwdGVyXy5hZGRDbGFzcyhyKToodGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyhyKSx0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKG8pKX0sZS5wcm90b3R5cGUuaGFuZGxlU2hha2VBbmltYXRpb25FbmRfPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5jc3NDbGFzc2VzLkxBQkVMX1NIQUtFO3RoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3ModCl9LGV9KG8uYSk7ZS5kZWZhdWx0PWF9LDE2ODpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5yKGUpO3ZhciByPW4oMjIpLG89bigyOSksaT17Tk9UQ0hfRUxFTUVOVF9TRUxFQ1RPUjpcIi5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaFwifSxhPXtOT1RDSF9FTEVNRU5UX1BBRERJTkc6OH0scz17Tk9fTEFCRUw6XCJtZGMtbm90Y2hlZC1vdXRsaW5lLS1uby1sYWJlbFwiLE9VVExJTkVfTk9UQ0hFRDpcIm1kYy1ub3RjaGVkLW91dGxpbmUtLW5vdGNoZWRcIixPVVRMSU5FX1VQR1JBREVEOlwibWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWRcIn07bi5kKGUsXCJNRENOb3RjaGVkT3V0bGluZUZvdW5kYXRpb25cIixmdW5jdGlvbigpe3JldHVybiBjfSk7XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cbnZhciBjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobil7cmV0dXJuIHQuY2FsbCh0aGlzLHIuYSh7fSxlLmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpc31yZXR1cm4gci5iKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzdHJpbmdzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gc30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIm51bWJlcnNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJkZWZhdWx0QWRhcHRlclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57YWRkQ2xhc3M6ZnVuY3Rpb24oKXt9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKCl7fSxzZXROb3RjaFdpZHRoUHJvcGVydHk6ZnVuY3Rpb24oKXt9LHJlbW92ZU5vdGNoV2lkdGhQcm9wZXJ0eTpmdW5jdGlvbigpe319fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLm5vdGNoPWZ1bmN0aW9uKHQpe3ZhciBuPWUuY3NzQ2xhc3Nlcy5PVVRMSU5FX05PVENIRUQ7dD4wJiYodCs9YS5OT1RDSF9FTEVNRU5UX1BBRERJTkcpLHRoaXMuYWRhcHRlcl8uc2V0Tm90Y2hXaWR0aFByb3BlcnR5KHQpLHRoaXMuYWRhcHRlcl8uYWRkQ2xhc3Mobil9LGUucHJvdG90eXBlLmNsb3NlTm90Y2g9ZnVuY3Rpb24oKXt2YXIgdD1lLmNzc0NsYXNzZXMuT1VUTElORV9OT1RDSEVEO3RoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3ModCksdGhpcy5hZGFwdGVyXy5yZW1vdmVOb3RjaFdpZHRoUHJvcGVydHkoKX0sZX0oby5hKTtlLmRlZmF1bHQ9Y30sMjI6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24uZChlLFwiYlwiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KSxuLmQoZSxcImFcIixmdW5jdGlvbigpe3JldHVybiBpfSk7XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3I7XG4vKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXG50aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZVxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcbk1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuXG5cblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xuYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi92YXIgcj1mdW5jdGlvbih0LGUpe3JldHVybihyPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSkodCxlKX07ZnVuY3Rpb24gbyh0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9cih0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX12YXIgaT1mdW5jdGlvbigpe3JldHVybihpPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEscj1hcmd1bWVudHMubGVuZ3RoO248cjtuKyspZm9yKHZhciBvIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG8pJiYodFtvXT1lW29dKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19LDI5OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImFcIixmdW5jdGlvbigpe3JldHVybiByfSk7XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cbnZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2b2lkIDA9PT10JiYodD17fSksdGhpcy5hZGFwdGVyXz10fXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJzdHJpbmdzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwibnVtYmVyc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt9LHQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt9LHR9KCl9fSl9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5vdGNoZWQtb3V0bGluZS5qcy5tYXAiLCIhZnVuY3Rpb24odCxlKXtpZihcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZSltb2R1bGUuZXhwb3J0cz1lKHJlcXVpcmUoXCJyZWFjdFwiKSxyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7ZWxzZSBpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQpZGVmaW5lKFtcInJlYWN0XCIsXCJjbGFzc25hbWVzXCJdLGUpO2Vsc2V7dmFyIG49XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZShyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcImNsYXNzbmFtZXNcIikpOmUodC5yZWFjdCx0LmNsYXNzbmFtZXMpO2Zvcih2YXIgaSBpbiBuKShcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnQpW2ldPW5baV19fShcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZj9zZWxmOnRoaXMsZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9e307ZnVuY3Rpb24gbihpKXtpZihlW2ldKXJldHVybiBlW2ldLmV4cG9ydHM7dmFyIGE9ZVtpXT17aTppLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIHRbaV0uY2FsbChhLmV4cG9ydHMsYSxhLmV4cG9ydHMsbiksYS5sPSEwLGEuZXhwb3J0c31yZXR1cm4gbi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxpKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6aX0pfSxuLnI9ZnVuY3Rpb24odCl7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOlwiTW9kdWxlXCJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiZcIm9iamVjdFwiPT10eXBlb2YgdCYmdCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCk7aWYobi5yKGkpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLFwiZGVmYXVsdFwiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KSwyJmUmJlwic3RyaW5nXCIhPXR5cGVvZiB0KWZvcih2YXIgYSBpbiB0KW4uZChpLGEsZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxhKSk7cmV0dXJuIGl9LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsXCJhXCIsZSksZX0sbi5vPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfSxuLnA9XCJcIixuKG4ucz0xMDcpfSh7MDpmdW5jdGlvbihlLG4pe2UuZXhwb3J0cz10fSwxOmZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWV9LDEwNzpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGksYT10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4oaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSkscj10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciBhIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLGEpJiYodFthXT1lW2FdKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sbz10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIGkgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKSYmZS5pbmRleE9mKGkpPDAmJihuW2ldPXRbaV0pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBhPTA7Zm9yKGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTthPGkubGVuZ3RoO2ErKyllLmluZGV4T2YoaVthXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsaVthXSkmJihuW2lbYV1dPXRbaVthXV0pfXJldHVybiBufSxzPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciB1PXMobigwKSksYz1zKG4oMSkpLGQ9bigxNTUpLHA9bigzOCksbD1uKDEwOCk7ZS53aXRoUmlwcGxlPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybihlPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oKXt2YXIgbj1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG4uaXNDb21wb25lbnRNb3VudGVkPSEwLG4uaXNUb3VjaGVkPSExLG4uZGlzcGxheU5hbWU9XCJXaXRoUmlwcGxlKFwiK2Z1bmN0aW9uKHQpe3JldHVybiB0LmRpc3BsYXlOYW1lfHx0Lm5hbWV8fFwiQ29tcG9uZW50XCJ9KHQpK1wiKVwiLG4uc3RhdGU9e2NsYXNzTGlzdDpuZXcgU2V0LHN0eWxlOnt9fSxuLmluaXRpYWxpemVGb3VuZGF0aW9uPWZ1bmN0aW9uKHQsZSl7dmFyIGk9bi5jcmVhdGVBZGFwdGVyKHQsZSk7bi5mb3VuZGF0aW9uPW5ldyBkLk1EQ1JpcHBsZUZvdW5kYXRpb24oaSksbi5mb3VuZGF0aW9uLmluaXQoKX0sbi5jcmVhdGVBZGFwdGVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJue2Jyb3dzZXJTdXBwb3J0c0Nzc1ZhcnM6ZnVuY3Rpb24oKXtyZXR1cm4gcC5zdXBwb3J0c0Nzc1ZhcmlhYmxlcyh3aW5kb3cpfSxpc1VuYm91bmRlZDpmdW5jdGlvbigpe3JldHVybiBuLnByb3BzLnVuYm91bmRlZH0saXNTdXJmYWNlQWN0aXZlOmZ1bmN0aW9uKCl7cmV0dXJuIGU/bC5tYXRjaGVzKGUsXCI6YWN0aXZlXCIpOmwubWF0Y2hlcyh0LFwiOmFjdGl2ZVwiKX0saXNTdXJmYWNlRGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5wcm9wcy5kaXNhYmxlZH0sYWRkQ2xhc3M6ZnVuY3Rpb24odCl7bi5pc0NvbXBvbmVudE1vdW50ZWQmJm4uc2V0U3RhdGUoe2NsYXNzTGlzdDpuLnN0YXRlLmNsYXNzTGlzdC5hZGQodCl9KX0scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24odCl7aWYobi5pc0NvbXBvbmVudE1vdW50ZWQpe3ZhciBlPW4uc3RhdGUuY2xhc3NMaXN0O2UuZGVsZXRlKHQpLG4uc2V0U3RhdGUoe2NsYXNzTGlzdDplfSl9fSxyZWdpc3RlckRvY3VtZW50SW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHQsZSxwLmFwcGx5UGFzc2l2ZSgpKX0sZGVyZWdpc3RlckRvY3VtZW50SW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHQsZSxwLmFwcGx5UGFzc2l2ZSgpKX0scmVnaXN0ZXJSZXNpemVIYW5kbGVyOmZ1bmN0aW9uKHQpe3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLHQpfSxkZXJlZ2lzdGVyUmVzaXplSGFuZGxlcjpmdW5jdGlvbih0KXtyZXR1cm4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIix0KX0sdXBkYXRlQ3NzVmFyaWFibGU6bi51cGRhdGVDc3NWYXJpYWJsZSxjb21wdXRlQm91bmRpbmdSZWN0OmZ1bmN0aW9uKCl7cmV0dXJuIG4uaXNDb21wb25lbnRNb3VudGVkP24ucHJvcHMuY29tcHV0ZUJvdW5kaW5nUmVjdD9uLnByb3BzLmNvbXB1dGVCb3VuZGluZ1JlY3QodCk6dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTp7Ym90dG9tOjAsaGVpZ2h0OjAsbGVmdDowLHJpZ2h0OjAsdG9wOjAsd2lkdGg6MCx4OjAseTowfX0sY29udGFpbnNFdmVudFRhcmdldDpmdW5jdGlvbih0KXtyZXR1cm4hKCFlfHxudWxsPT09dCkmJmUuY29udGFpbnModCl9LHJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGRlcmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sZ2V0V2luZG93UGFnZU9mZnNldDpmdW5jdGlvbigpe3JldHVybnt4OndpbmRvdy5wYWdlWE9mZnNldCx5OndpbmRvdy5wYWdlWU9mZnNldH19fX0sbi5oYW5kbGVGb2N1cz1mdW5jdGlvbih0KXtuLnByb3BzLm9uRm9jdXMmJm4ucHJvcHMub25Gb2N1cyh0KSxuLmZvdW5kYXRpb24uaGFuZGxlRm9jdXMoKX0sbi5oYW5kbGVCbHVyPWZ1bmN0aW9uKHQpe24ucHJvcHMub25CbHVyJiZuLnByb3BzLm9uQmx1cih0KSxuLmZvdW5kYXRpb24uaGFuZGxlQmx1cigpfSxuLmhhbmRsZU1vdXNlRG93bj1mdW5jdGlvbih0KXtuLnByb3BzLm9uTW91c2VEb3duJiZuLnByb3BzLm9uTW91c2VEb3duKHQpLG4uaXNUb3VjaGVkP24uaXNUb3VjaGVkPSExOm4uYWN0aXZhdGVSaXBwbGUodCl9LG4uaGFuZGxlTW91c2VVcD1mdW5jdGlvbih0KXtuLnByb3BzLm9uTW91c2VVcCYmbi5wcm9wcy5vbk1vdXNlVXAodCksbi5kZWFjdGl2YXRlUmlwcGxlKCl9LG4uaGFuZGxlVG91Y2hTdGFydD1mdW5jdGlvbih0KXtuLmlzVG91Y2hlZD0hMCxuLnByb3BzLm9uVG91Y2hTdGFydCYmbi5wcm9wcy5vblRvdWNoU3RhcnQodCksbi5hY3RpdmF0ZVJpcHBsZSh0KX0sbi5oYW5kbGVUb3VjaEVuZD1mdW5jdGlvbih0KXtuLnByb3BzLm9uVG91Y2hFbmQmJm4ucHJvcHMub25Ub3VjaEVuZCh0KSxuLmRlYWN0aXZhdGVSaXBwbGUoKX0sbi5oYW5kbGVLZXlEb3duPWZ1bmN0aW9uKHQpe24ucHJvcHMub25LZXlEb3duJiZuLnByb3BzLm9uS2V5RG93bih0KSxuLmFjdGl2YXRlUmlwcGxlKHQpfSxuLmhhbmRsZUtleVVwPWZ1bmN0aW9uKHQpe24ucHJvcHMub25LZXlVcCYmbi5wcm9wcy5vbktleVVwKHQpLG4uZGVhY3RpdmF0ZVJpcHBsZSgpfSxuLmFjdGl2YXRlUmlwcGxlPWZ1bmN0aW9uKHQpe3QucGVyc2lzdCgpLG4uZm91bmRhdGlvbi5hY3RpdmF0ZSh0Lm5hdGl2ZUV2ZW50KX0sbi5kZWFjdGl2YXRlUmlwcGxlPWZ1bmN0aW9uKCl7bi5mb3VuZGF0aW9uLmRlYWN0aXZhdGUoKX0sbi51cGRhdGVDc3NWYXJpYWJsZT1mdW5jdGlvbih0LGUpe24uaXNDb21wb25lbnRNb3VudGVkJiZuLnNldFN0YXRlKGZ1bmN0aW9uKGkpe3ZhciBhPU9iamVjdC5hc3NpZ24oe30sbi5zdGF0ZS5zdHlsZSxpLnN0eWxlKTtyZXR1cm4gbnVsbD09PWU/ZGVsZXRlIGFbdF06YVt0XT1lLE9iamVjdC5hc3NpZ24oaSx7c3R5bGU6YX0pfSl9LG59cmV0dXJuIGEobixlKSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe2lmKCF0aGlzLmZvdW5kYXRpb24pdGhyb3cgbmV3IEVycm9yKFwiWW91IG11c3QgY2FsbCBpbml0UmlwcGxlIGZyb20gdGhlIGVsZW1lbnQncyByZWYgcHJvcCB0byBpbml0aWFsaXplIHRoZSBhZGFwdGVyIGZvciB3aXRoUmlwcGxlXCIpfSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9ZnVuY3Rpb24odCl7dGhpcy5wcm9wcy5kaXNhYmxlZCE9PXQuZGlzYWJsZWQmJnRoaXMucHJvcHMuZGlzYWJsZWQmJnRoaXMuZm91bmRhdGlvbi5oYW5kbGVCbHVyKCl9LG4ucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7dGhpcy5mb3VuZGF0aW9uJiYodGhpcy5pc0NvbXBvbmVudE1vdW50ZWQ9ITEsdGhpcy5mb3VuZGF0aW9uLmRlc3Ryb3koKSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSxcImNsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcy5jbGFzc05hbWUsZT10aGlzLnN0YXRlLmNsYXNzTGlzdDtyZXR1cm4gYy5kZWZhdWx0KEFycmF5LmZyb20oZSksdCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLFwic3R5bGVcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcy5zdHlsZSxlPXRoaXMuc3RhdGUuc3R5bGU7cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sZSx0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxuLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLG49KGUudW5ib3VuZGVkLGUuc3R5bGUsZS5jbGFzc05hbWUsZS5vbk1vdXNlRG93bixlLm9uTW91c2VVcCxlLm9uVG91Y2hTdGFydCxlLm9uVG91Y2hFbmQsZS5vbktleURvd24sZS5vbktleVVwLGUub25Gb2N1cyxlLm9uQmx1cixvKGUsW1widW5ib3VuZGVkXCIsXCJzdHlsZVwiLFwiY2xhc3NOYW1lXCIsXCJvbk1vdXNlRG93blwiLFwib25Nb3VzZVVwXCIsXCJvblRvdWNoU3RhcnRcIixcIm9uVG91Y2hFbmRcIixcIm9uS2V5RG93blwiLFwib25LZXlVcFwiLFwib25Gb2N1c1wiLFwib25CbHVyXCJdKSksaT1yKHt9LG4se29uTW91c2VEb3duOnRoaXMuaGFuZGxlTW91c2VEb3duLG9uTW91c2VVcDp0aGlzLmhhbmRsZU1vdXNlVXAsb25Ub3VjaFN0YXJ0OnRoaXMuaGFuZGxlVG91Y2hTdGFydCxvblRvdWNoRW5kOnRoaXMuaGFuZGxlVG91Y2hFbmQsb25LZXlEb3duOnRoaXMuaGFuZGxlS2V5RG93bixvbktleVVwOnRoaXMuaGFuZGxlS2V5VXAsb25Gb2N1czp0aGlzLmhhbmRsZUZvY3VzLG9uQmx1cjp0aGlzLmhhbmRsZUJsdXIsaW5pdFJpcHBsZTp0aGlzLmluaXRpYWxpemVGb3VuZGF0aW9uLGNsYXNzTmFtZTp0aGlzLmNsYXNzZXMsc3R5bGU6dGhpcy5zdHlsZX0pO3JldHVybiB1LmRlZmF1bHQuY3JlYXRlRWxlbWVudCh0LHIoe30saSkpfSxufSh1LmRlZmF1bHQuQ29tcG9uZW50KSkuZGVmYXVsdFByb3BzPXIoe3VuYm91bmRlZDohMSxkaXNhYmxlZDohMSxzdHlsZTp7fSxjbGFzc05hbWU6XCJcIixvbk1vdXNlRG93bjpmdW5jdGlvbigpe30sb25Nb3VzZVVwOmZ1bmN0aW9uKCl7fSxvblRvdWNoU3RhcnQ6ZnVuY3Rpb24oKXt9LG9uVG91Y2hFbmQ6ZnVuY3Rpb24oKXt9LG9uS2V5RG93bjpmdW5jdGlvbigpe30sb25LZXlVcDpmdW5jdGlvbigpe30sb25Gb2N1czpmdW5jdGlvbigpe30sb25CbHVyOmZ1bmN0aW9uKCl7fX0sdC5kZWZhdWx0UHJvcHMpLGV9fSwxMDg6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG5mdW5jdGlvbiBpKHQsZSl7aWYodC5jbG9zZXN0KXJldHVybiB0LmNsb3Nlc3QoZSk7Zm9yKHZhciBuPXQ7bjspe2lmKGEobixlKSlyZXR1cm4gbjtuPW4ucGFyZW50RWxlbWVudH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBhKHQsZSl7cmV0dXJuKHQubWF0Y2hlc3x8dC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fHQubXNNYXRjaGVzU2VsZWN0b3IpLmNhbGwodCxlKX1uLnIoZSksbi5kKGUsXCJjbG9zZXN0XCIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLG4uZChlLFwibWF0Y2hlc1wiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KX0sMTU1OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSk7XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3I7XG4vKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXG50aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZVxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcbk1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuXG5cblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xuYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi92YXIgaT1mdW5jdGlvbih0LGUpe3JldHVybihpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSkodCxlKX07dmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4oYT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgYSBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxhKSYmKHRbYV09ZVthXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG52YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dm9pZCAwPT09dCYmKHQ9e30pLHRoaXMuYWRhcHRlcl89dH1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJjc3NDbGFzc2VzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwic3RyaW5nc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIm51bWJlcnNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJkZWZhdWx0QWRhcHRlclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7fSx0fSgpLG89e0JHX0ZPQ1VTRUQ6XCJtZGMtcmlwcGxlLXVwZ3JhZGVkLS1iYWNrZ3JvdW5kLWZvY3VzZWRcIixGR19BQ1RJVkFUSU9OOlwibWRjLXJpcHBsZS11cGdyYWRlZC0tZm9yZWdyb3VuZC1hY3RpdmF0aW9uXCIsRkdfREVBQ1RJVkFUSU9OOlwibWRjLXJpcHBsZS11cGdyYWRlZC0tZm9yZWdyb3VuZC1kZWFjdGl2YXRpb25cIixST09UOlwibWRjLXJpcHBsZS11cGdyYWRlZFwiLFVOQk9VTkRFRDpcIm1kYy1yaXBwbGUtdXBncmFkZWQtLXVuYm91bmRlZFwifSxzPXtWQVJfRkdfU0NBTEU6XCItLW1kYy1yaXBwbGUtZmctc2NhbGVcIixWQVJfRkdfU0laRTpcIi0tbWRjLXJpcHBsZS1mZy1zaXplXCIsVkFSX0ZHX1RSQU5TTEFURV9FTkQ6XCItLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLWVuZFwiLFZBUl9GR19UUkFOU0xBVEVfU1RBUlQ6XCItLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLXN0YXJ0XCIsVkFSX0xFRlQ6XCItLW1kYy1yaXBwbGUtbGVmdFwiLFZBUl9UT1A6XCItLW1kYy1yaXBwbGUtdG9wXCJ9LHU9e0RFQUNUSVZBVElPTl9USU1FT1VUX01TOjIyNSxGR19ERUFDVElWQVRJT05fTVM6MTUwLElOSVRJQUxfT1JJR0lOX1NDQUxFOi42LFBBRERJTkc6MTAsVEFQX0RFTEFZX01TOjMwMH0sYz1uKDM4KTtuLmQoZSxcIk1EQ1JpcHBsZUZvdW5kYXRpb25cIixmdW5jdGlvbigpe3JldHVybiBmfSk7XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cbnZhciBkPVtcInRvdWNoc3RhcnRcIixcInBvaW50ZXJkb3duXCIsXCJtb3VzZWRvd25cIixcImtleWRvd25cIl0scD1bXCJ0b3VjaGVuZFwiLFwicG9pbnRlcnVwXCIsXCJtb3VzZXVwXCIsXCJjb250ZXh0bWVudVwiXSxsPVtdLGY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXt2YXIgaT10LmNhbGwodGhpcyxhKHt9LGUuZGVmYXVsdEFkYXB0ZXIsbikpfHx0aGlzO3JldHVybiBpLmFjdGl2YXRpb25BbmltYXRpb25IYXNFbmRlZF89ITEsaS5hY3RpdmF0aW9uVGltZXJfPTAsaS5mZ0RlYWN0aXZhdGlvblJlbW92YWxUaW1lcl89MCxpLmZnU2NhbGVfPVwiMFwiLGkuZnJhbWVfPXt3aWR0aDowLGhlaWdodDowfSxpLmluaXRpYWxTaXplXz0wLGkubGF5b3V0RnJhbWVfPTAsaS5tYXhSYWRpdXNfPTAsaS51bmJvdW5kZWRDb29yZHNfPXtsZWZ0OjAsdG9wOjB9LGkuYWN0aXZhdGlvblN0YXRlXz1pLmRlZmF1bHRBY3RpdmF0aW9uU3RhdGVfKCksaS5hY3RpdmF0aW9uVGltZXJDYWxsYmFja189ZnVuY3Rpb24oKXtpLmFjdGl2YXRpb25BbmltYXRpb25IYXNFbmRlZF89ITAsaS5ydW5EZWFjdGl2YXRpb25VWExvZ2ljSWZSZWFkeV8oKX0saS5hY3RpdmF0ZUhhbmRsZXJfPWZ1bmN0aW9uKHQpe3JldHVybiBpLmFjdGl2YXRlXyh0KX0saS5kZWFjdGl2YXRlSGFuZGxlcl89ZnVuY3Rpb24oKXtyZXR1cm4gaS5kZWFjdGl2YXRlXygpfSxpLmZvY3VzSGFuZGxlcl89ZnVuY3Rpb24oKXtyZXR1cm4gaS5oYW5kbGVGb2N1cygpfSxpLmJsdXJIYW5kbGVyXz1mdW5jdGlvbigpe3JldHVybiBpLmhhbmRsZUJsdXIoKX0saS5yZXNpemVIYW5kbGVyXz1mdW5jdGlvbigpe3JldHVybiBpLmxheW91dCgpfSxpfXJldHVybiBmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0oZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzdHJpbmdzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwibnVtYmVyc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybnthZGRDbGFzczpmdW5jdGlvbigpe30sYnJvd3NlclN1cHBvcnRzQ3NzVmFyczpmdW5jdGlvbigpe3JldHVybiEwfSxjb21wdXRlQm91bmRpbmdSZWN0OmZ1bmN0aW9uKCl7cmV0dXJue3RvcDowLHJpZ2h0OjAsYm90dG9tOjAsbGVmdDowLHdpZHRoOjAsaGVpZ2h0OjB9fSxjb250YWluc0V2ZW50VGFyZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuITB9LGRlcmVnaXN0ZXJEb2N1bWVudEludGVyYWN0aW9uSGFuZGxlcjpmdW5jdGlvbigpe30sZGVyZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcjpmdW5jdGlvbigpe30sZGVyZWdpc3RlclJlc2l6ZUhhbmRsZXI6ZnVuY3Rpb24oKXt9LGdldFdpbmRvd1BhZ2VPZmZzZXQ6ZnVuY3Rpb24oKXtyZXR1cm57eDowLHk6MH19LGlzU3VyZmFjZUFjdGl2ZTpmdW5jdGlvbigpe3JldHVybiEwfSxpc1N1cmZhY2VEaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiEwfSxpc1VuYm91bmRlZDpmdW5jdGlvbigpe3JldHVybiEwfSxyZWdpc3RlckRvY3VtZW50SW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxyZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcjpmdW5jdGlvbigpe30scmVnaXN0ZXJSZXNpemVIYW5kbGVyOmZ1bmN0aW9uKCl7fSxyZW1vdmVDbGFzczpmdW5jdGlvbigpe30sdXBkYXRlQ3NzVmFyaWFibGU6ZnVuY3Rpb24oKXt9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPXRoaXMuc3VwcG9ydHNQcmVzc1JpcHBsZV8oKTtpZih0aGlzLnJlZ2lzdGVyUm9vdEhhbmRsZXJzXyhuKSxuKXt2YXIgaT1lLmNzc0NsYXNzZXMsYT1pLlJPT1Qscj1pLlVOQk9VTkRFRDtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt0LmFkYXB0ZXJfLmFkZENsYXNzKGEpLHQuYWRhcHRlcl8uaXNVbmJvdW5kZWQoKSYmKHQuYWRhcHRlcl8uYWRkQ2xhc3MociksdC5sYXlvdXRJbnRlcm5hbF8oKSl9KX19LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKHRoaXMuc3VwcG9ydHNQcmVzc1JpcHBsZV8oKSl7dGhpcy5hY3RpdmF0aW9uVGltZXJfJiYoY2xlYXJUaW1lb3V0KHRoaXMuYWN0aXZhdGlvblRpbWVyXyksdGhpcy5hY3RpdmF0aW9uVGltZXJfPTAsdGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyhlLmNzc0NsYXNzZXMuRkdfQUNUSVZBVElPTikpLHRoaXMuZmdEZWFjdGl2YXRpb25SZW1vdmFsVGltZXJfJiYoY2xlYXJUaW1lb3V0KHRoaXMuZmdEZWFjdGl2YXRpb25SZW1vdmFsVGltZXJfKSx0aGlzLmZnRGVhY3RpdmF0aW9uUmVtb3ZhbFRpbWVyXz0wLHRoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoZS5jc3NDbGFzc2VzLkZHX0RFQUNUSVZBVElPTikpO3ZhciBuPWUuY3NzQ2xhc3NlcyxpPW4uUk9PVCxhPW4uVU5CT1VOREVEO3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3QuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoaSksdC5hZGFwdGVyXy5yZW1vdmVDbGFzcyhhKSx0LnJlbW92ZUNzc1ZhcnNfKCl9KX10aGlzLmRlcmVnaXN0ZXJSb290SGFuZGxlcnNfKCksdGhpcy5kZXJlZ2lzdGVyRGVhY3RpdmF0aW9uSGFuZGxlcnNfKCl9LGUucHJvdG90eXBlLmFjdGl2YXRlPWZ1bmN0aW9uKHQpe3RoaXMuYWN0aXZhdGVfKHQpfSxlLnByb3RvdHlwZS5kZWFjdGl2YXRlPWZ1bmN0aW9uKCl7dGhpcy5kZWFjdGl2YXRlXygpfSxlLnByb3RvdHlwZS5sYXlvdXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMubGF5b3V0RnJhbWVfJiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmxheW91dEZyYW1lXyksdGhpcy5sYXlvdXRGcmFtZV89cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7dC5sYXlvdXRJbnRlcm5hbF8oKSx0LmxheW91dEZyYW1lXz0wfSl9LGUucHJvdG90eXBlLnNldFVuYm91bmRlZD1mdW5jdGlvbih0KXt2YXIgbj1lLmNzc0NsYXNzZXMuVU5CT1VOREVEO3Q/dGhpcy5hZGFwdGVyXy5hZGRDbGFzcyhuKTp0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKG4pfSxlLnByb3RvdHlwZS5oYW5kbGVGb2N1cz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7cmV0dXJuIHQuYWRhcHRlcl8uYWRkQ2xhc3MoZS5jc3NDbGFzc2VzLkJHX0ZPQ1VTRUQpfSl9LGUucHJvdG90eXBlLmhhbmRsZUJsdXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3JldHVybiB0LmFkYXB0ZXJfLnJlbW92ZUNsYXNzKGUuY3NzQ2xhc3Nlcy5CR19GT0NVU0VEKX0pfSxlLnByb3RvdHlwZS5zdXBwb3J0c1ByZXNzUmlwcGxlXz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFkYXB0ZXJfLmJyb3dzZXJTdXBwb3J0c0Nzc1ZhcnMoKX0sZS5wcm90b3R5cGUuZGVmYXVsdEFjdGl2YXRpb25TdGF0ZV89ZnVuY3Rpb24oKXtyZXR1cm57YWN0aXZhdGlvbkV2ZW50OnZvaWQgMCxoYXNEZWFjdGl2YXRpb25VWFJ1bjohMSxpc0FjdGl2YXRlZDohMSxpc1Byb2dyYW1tYXRpYzohMSx3YXNBY3RpdmF0ZWRCeVBvaW50ZXI6ITEsd2FzRWxlbWVudE1hZGVBY3RpdmU6ITF9fSxlLnByb3RvdHlwZS5yZWdpc3RlclJvb3RIYW5kbGVyc189ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0JiYoZC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UuYWRhcHRlcl8ucmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXIodCxlLmFjdGl2YXRlSGFuZGxlcl8pfSksdGhpcy5hZGFwdGVyXy5pc1VuYm91bmRlZCgpJiZ0aGlzLmFkYXB0ZXJfLnJlZ2lzdGVyUmVzaXplSGFuZGxlcih0aGlzLnJlc2l6ZUhhbmRsZXJfKSksdGhpcy5hZGFwdGVyXy5yZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcihcImZvY3VzXCIsdGhpcy5mb2N1c0hhbmRsZXJfKSx0aGlzLmFkYXB0ZXJfLnJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyKFwiYmx1clwiLHRoaXMuYmx1ckhhbmRsZXJfKX0sZS5wcm90b3R5cGUucmVnaXN0ZXJEZWFjdGl2YXRpb25IYW5kbGVyc189ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztcImtleWRvd25cIj09PXQudHlwZT90aGlzLmFkYXB0ZXJfLnJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyKFwia2V5dXBcIix0aGlzLmRlYWN0aXZhdGVIYW5kbGVyXyk6cC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UuYWRhcHRlcl8ucmVnaXN0ZXJEb2N1bWVudEludGVyYWN0aW9uSGFuZGxlcih0LGUuZGVhY3RpdmF0ZUhhbmRsZXJfKX0pfSxlLnByb3RvdHlwZS5kZXJlZ2lzdGVyUm9vdEhhbmRsZXJzXz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7ZC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuYWRhcHRlcl8uZGVyZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcihlLHQuYWN0aXZhdGVIYW5kbGVyXyl9KSx0aGlzLmFkYXB0ZXJfLmRlcmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXIoXCJmb2N1c1wiLHRoaXMuZm9jdXNIYW5kbGVyXyksdGhpcy5hZGFwdGVyXy5kZXJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyKFwiYmx1clwiLHRoaXMuYmx1ckhhbmRsZXJfKSx0aGlzLmFkYXB0ZXJfLmlzVW5ib3VuZGVkKCkmJnRoaXMuYWRhcHRlcl8uZGVyZWdpc3RlclJlc2l6ZUhhbmRsZXIodGhpcy5yZXNpemVIYW5kbGVyXyl9LGUucHJvdG90eXBlLmRlcmVnaXN0ZXJEZWFjdGl2YXRpb25IYW5kbGVyc189ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuYWRhcHRlcl8uZGVyZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcihcImtleXVwXCIsdGhpcy5kZWFjdGl2YXRlSGFuZGxlcl8pLHAuZm9yRWFjaChmdW5jdGlvbihlKXt0LmFkYXB0ZXJfLmRlcmVnaXN0ZXJEb2N1bWVudEludGVyYWN0aW9uSGFuZGxlcihlLHQuZGVhY3RpdmF0ZUhhbmRsZXJfKX0pfSxlLnByb3RvdHlwZS5yZW1vdmVDc3NWYXJzXz1mdW5jdGlvbigpe3ZhciB0PXRoaXMsbj1lLnN0cmluZ3M7T2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXswPT09ZS5pbmRleE9mKFwiVkFSX1wiKSYmdC5hZGFwdGVyXy51cGRhdGVDc3NWYXJpYWJsZShuW2VdLG51bGwpfSl9LGUucHJvdG90eXBlLmFjdGl2YXRlXz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKCF0aGlzLmFkYXB0ZXJfLmlzU3VyZmFjZURpc2FibGVkKCkpe3ZhciBuPXRoaXMuYWN0aXZhdGlvblN0YXRlXztpZighbi5pc0FjdGl2YXRlZCl7dmFyIGk9dGhpcy5wcmV2aW91c0FjdGl2YXRpb25FdmVudF87aWYoIShpJiZ2b2lkIDAhPT10JiZpLnR5cGUhPT10LnR5cGUpKW4uaXNBY3RpdmF0ZWQ9ITAsbi5pc1Byb2dyYW1tYXRpYz12b2lkIDA9PT10LG4uYWN0aXZhdGlvbkV2ZW50PXQsbi53YXNBY3RpdmF0ZWRCeVBvaW50ZXI9IW4uaXNQcm9ncmFtbWF0aWMmJih2b2lkIDAhPT10JiYoXCJtb3VzZWRvd25cIj09PXQudHlwZXx8XCJ0b3VjaHN0YXJ0XCI9PT10LnR5cGV8fFwicG9pbnRlcmRvd25cIj09PXQudHlwZSkpLHZvaWQgMCE9PXQmJmwubGVuZ3RoPjAmJmwuc29tZShmdW5jdGlvbih0KXtyZXR1cm4gZS5hZGFwdGVyXy5jb250YWluc0V2ZW50VGFyZ2V0KHQpfSk/dGhpcy5yZXNldEFjdGl2YXRpb25TdGF0ZV8oKToodm9pZCAwIT09dCYmKGwucHVzaCh0LnRhcmdldCksdGhpcy5yZWdpc3RlckRlYWN0aXZhdGlvbkhhbmRsZXJzXyh0KSksbi53YXNFbGVtZW50TWFkZUFjdGl2ZT10aGlzLmNoZWNrRWxlbWVudE1hZGVBY3RpdmVfKHQpLG4ud2FzRWxlbWVudE1hZGVBY3RpdmUmJnRoaXMuYW5pbWF0ZUFjdGl2YXRpb25fKCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7bD1bXSxuLndhc0VsZW1lbnRNYWRlQWN0aXZlfHx2b2lkIDA9PT10fHxcIiBcIiE9PXQua2V5JiYzMiE9PXQua2V5Q29kZXx8KG4ud2FzRWxlbWVudE1hZGVBY3RpdmU9ZS5jaGVja0VsZW1lbnRNYWRlQWN0aXZlXyh0KSxuLndhc0VsZW1lbnRNYWRlQWN0aXZlJiZlLmFuaW1hdGVBY3RpdmF0aW9uXygpKSxuLndhc0VsZW1lbnRNYWRlQWN0aXZlfHwoZS5hY3RpdmF0aW9uU3RhdGVfPWUuZGVmYXVsdEFjdGl2YXRpb25TdGF0ZV8oKSl9KSl9fX0sZS5wcm90b3R5cGUuY2hlY2tFbGVtZW50TWFkZUFjdGl2ZV89ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXR8fFwia2V5ZG93blwiIT09dC50eXBlfHx0aGlzLmFkYXB0ZXJfLmlzU3VyZmFjZUFjdGl2ZSgpfSxlLnByb3RvdHlwZS5hbmltYXRlQWN0aXZhdGlvbl89ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49ZS5zdHJpbmdzLGk9bi5WQVJfRkdfVFJBTlNMQVRFX1NUQVJULGE9bi5WQVJfRkdfVFJBTlNMQVRFX0VORCxyPWUuY3NzQ2xhc3NlcyxvPXIuRkdfREVBQ1RJVkFUSU9OLHM9ci5GR19BQ1RJVkFUSU9OLHU9ZS5udW1iZXJzLkRFQUNUSVZBVElPTl9USU1FT1VUX01TO3RoaXMubGF5b3V0SW50ZXJuYWxfKCk7dmFyIGM9XCJcIixkPVwiXCI7aWYoIXRoaXMuYWRhcHRlcl8uaXNVbmJvdW5kZWQoKSl7dmFyIHA9dGhpcy5nZXRGZ1RyYW5zbGF0aW9uQ29vcmRpbmF0ZXNfKCksbD1wLnN0YXJ0UG9pbnQsZj1wLmVuZFBvaW50O2M9bC54K1wicHgsIFwiK2wueStcInB4XCIsZD1mLngrXCJweCwgXCIrZi55K1wicHhcIn10aGlzLmFkYXB0ZXJfLnVwZGF0ZUNzc1ZhcmlhYmxlKGksYyksdGhpcy5hZGFwdGVyXy51cGRhdGVDc3NWYXJpYWJsZShhLGQpLGNsZWFyVGltZW91dCh0aGlzLmFjdGl2YXRpb25UaW1lcl8pLGNsZWFyVGltZW91dCh0aGlzLmZnRGVhY3RpdmF0aW9uUmVtb3ZhbFRpbWVyXyksdGhpcy5ybUJvdW5kZWRBY3RpdmF0aW9uQ2xhc3Nlc18oKSx0aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKG8pLHRoaXMuYWRhcHRlcl8uY29tcHV0ZUJvdW5kaW5nUmVjdCgpLHRoaXMuYWRhcHRlcl8uYWRkQ2xhc3MocyksdGhpcy5hY3RpdmF0aW9uVGltZXJfPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gdC5hY3RpdmF0aW9uVGltZXJDYWxsYmFja18oKX0sdSl9LGUucHJvdG90eXBlLmdldEZnVHJhbnNsYXRpb25Db29yZGluYXRlc189ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuYWN0aXZhdGlvblN0YXRlXyxuPWUuYWN0aXZhdGlvbkV2ZW50O3JldHVybntzdGFydFBvaW50OnQ9e3g6KHQ9ZS53YXNBY3RpdmF0ZWRCeVBvaW50ZXI/T2JqZWN0KGMuZ2V0Tm9ybWFsaXplZEV2ZW50Q29vcmRzKShuLHRoaXMuYWRhcHRlcl8uZ2V0V2luZG93UGFnZU9mZnNldCgpLHRoaXMuYWRhcHRlcl8uY29tcHV0ZUJvdW5kaW5nUmVjdCgpKTp7eDp0aGlzLmZyYW1lXy53aWR0aC8yLHk6dGhpcy5mcmFtZV8uaGVpZ2h0LzJ9KS54LXRoaXMuaW5pdGlhbFNpemVfLzIseTp0LnktdGhpcy5pbml0aWFsU2l6ZV8vMn0sZW5kUG9pbnQ6e3g6dGhpcy5mcmFtZV8ud2lkdGgvMi10aGlzLmluaXRpYWxTaXplXy8yLHk6dGhpcy5mcmFtZV8uaGVpZ2h0LzItdGhpcy5pbml0aWFsU2l6ZV8vMn19fSxlLnByb3RvdHlwZS5ydW5EZWFjdGl2YXRpb25VWExvZ2ljSWZSZWFkeV89ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49ZS5jc3NDbGFzc2VzLkZHX0RFQUNUSVZBVElPTixpPXRoaXMuYWN0aXZhdGlvblN0YXRlXyxhPWkuaGFzRGVhY3RpdmF0aW9uVVhSdW4scj1pLmlzQWN0aXZhdGVkOyhhfHwhcikmJnRoaXMuYWN0aXZhdGlvbkFuaW1hdGlvbkhhc0VuZGVkXyYmKHRoaXMucm1Cb3VuZGVkQWN0aXZhdGlvbkNsYXNzZXNfKCksdGhpcy5hZGFwdGVyXy5hZGRDbGFzcyhuKSx0aGlzLmZnRGVhY3RpdmF0aW9uUmVtb3ZhbFRpbWVyXz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5hZGFwdGVyXy5yZW1vdmVDbGFzcyhuKX0sdS5GR19ERUFDVElWQVRJT05fTVMpKX0sZS5wcm90b3R5cGUucm1Cb3VuZGVkQWN0aXZhdGlvbkNsYXNzZXNfPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5jc3NDbGFzc2VzLkZHX0FDVElWQVRJT047dGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyh0KSx0aGlzLmFjdGl2YXRpb25BbmltYXRpb25IYXNFbmRlZF89ITEsdGhpcy5hZGFwdGVyXy5jb21wdXRlQm91bmRpbmdSZWN0KCl9LGUucHJvdG90eXBlLnJlc2V0QWN0aXZhdGlvblN0YXRlXz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5wcmV2aW91c0FjdGl2YXRpb25FdmVudF89dGhpcy5hY3RpdmF0aW9uU3RhdGVfLmFjdGl2YXRpb25FdmVudCx0aGlzLmFjdGl2YXRpb25TdGF0ZV89dGhpcy5kZWZhdWx0QWN0aXZhdGlvblN0YXRlXygpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gdC5wcmV2aW91c0FjdGl2YXRpb25FdmVudF89dm9pZCAwfSxlLm51bWJlcnMuVEFQX0RFTEFZX01TKX0sZS5wcm90b3R5cGUuZGVhY3RpdmF0ZV89ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5hY3RpdmF0aW9uU3RhdGVfO2lmKGUuaXNBY3RpdmF0ZWQpe3ZhciBuPWEoe30sZSk7ZS5pc1Byb2dyYW1tYXRpYz8ocmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7cmV0dXJuIHQuYW5pbWF0ZURlYWN0aXZhdGlvbl8obil9KSx0aGlzLnJlc2V0QWN0aXZhdGlvblN0YXRlXygpKToodGhpcy5kZXJlZ2lzdGVyRGVhY3RpdmF0aW9uSGFuZGxlcnNfKCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7dC5hY3RpdmF0aW9uU3RhdGVfLmhhc0RlYWN0aXZhdGlvblVYUnVuPSEwLHQuYW5pbWF0ZURlYWN0aXZhdGlvbl8obiksdC5yZXNldEFjdGl2YXRpb25TdGF0ZV8oKX0pKX19LGUucHJvdG90eXBlLmFuaW1hdGVEZWFjdGl2YXRpb25fPWZ1bmN0aW9uKHQpe3ZhciBlPXQud2FzQWN0aXZhdGVkQnlQb2ludGVyLG49dC53YXNFbGVtZW50TWFkZUFjdGl2ZTsoZXx8bikmJnRoaXMucnVuRGVhY3RpdmF0aW9uVVhMb2dpY0lmUmVhZHlfKCl9LGUucHJvdG90eXBlLmxheW91dEludGVybmFsXz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5mcmFtZV89dGhpcy5hZGFwdGVyXy5jb21wdXRlQm91bmRpbmdSZWN0KCk7dmFyIG49TWF0aC5tYXgodGhpcy5mcmFtZV8uaGVpZ2h0LHRoaXMuZnJhbWVfLndpZHRoKTt0aGlzLm1heFJhZGl1c189dGhpcy5hZGFwdGVyXy5pc1VuYm91bmRlZCgpP246TWF0aC5zcXJ0KE1hdGgucG93KHQuZnJhbWVfLndpZHRoLDIpK01hdGgucG93KHQuZnJhbWVfLmhlaWdodCwyKSkrZS5udW1iZXJzLlBBRERJTkcsdGhpcy5pbml0aWFsU2l6ZV89TWF0aC5mbG9vcihuKmUubnVtYmVycy5JTklUSUFMX09SSUdJTl9TQ0FMRSksdGhpcy5mZ1NjYWxlXz1cIlwiK3RoaXMubWF4UmFkaXVzXy90aGlzLmluaXRpYWxTaXplXyx0aGlzLnVwZGF0ZUxheW91dENzc1ZhcnNfKCl9LGUucHJvdG90eXBlLnVwZGF0ZUxheW91dENzc1ZhcnNfPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5zdHJpbmdzLG49dC5WQVJfRkdfU0laRSxpPXQuVkFSX0xFRlQsYT10LlZBUl9UT1Ascj10LlZBUl9GR19TQ0FMRTt0aGlzLmFkYXB0ZXJfLnVwZGF0ZUNzc1ZhcmlhYmxlKG4sdGhpcy5pbml0aWFsU2l6ZV8rXCJweFwiKSx0aGlzLmFkYXB0ZXJfLnVwZGF0ZUNzc1ZhcmlhYmxlKHIsdGhpcy5mZ1NjYWxlXyksdGhpcy5hZGFwdGVyXy5pc1VuYm91bmRlZCgpJiYodGhpcy51bmJvdW5kZWRDb29yZHNfPXtsZWZ0Ok1hdGgucm91bmQodGhpcy5mcmFtZV8ud2lkdGgvMi10aGlzLmluaXRpYWxTaXplXy8yKSx0b3A6TWF0aC5yb3VuZCh0aGlzLmZyYW1lXy5oZWlnaHQvMi10aGlzLmluaXRpYWxTaXplXy8yKX0sdGhpcy5hZGFwdGVyXy51cGRhdGVDc3NWYXJpYWJsZShpLHRoaXMudW5ib3VuZGVkQ29vcmRzXy5sZWZ0K1wicHhcIiksdGhpcy5hZGFwdGVyXy51cGRhdGVDc3NWYXJpYWJsZShhLHRoaXMudW5ib3VuZGVkQ29vcmRzXy50b3ArXCJweFwiKSl9LGV9KHIpO2UuZGVmYXVsdD1mfSwzODpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGksYTtmdW5jdGlvbiByKHQsZSl7dm9pZCAwPT09ZSYmKGU9ITEpO3ZhciBuPXQuQ1NTLGE9aTtpZihcImJvb2xlYW5cIj09dHlwZW9mIGkmJiFlKXJldHVybiBpO2lmKCEobiYmXCJmdW5jdGlvblwiPT10eXBlb2Ygbi5zdXBwb3J0cykpcmV0dXJuITE7dmFyIHI9bi5zdXBwb3J0cyhcIi0tY3NzLXZhcnNcIixcInllc1wiKSxvPW4uc3VwcG9ydHMoXCIoLS1jc3MtdmFyczogeWVzKVwiKSYmbi5zdXBwb3J0cyhcImNvbG9yXCIsXCIjMDAwMDAwMDBcIik7cmV0dXJuIGE9ISghciYmIW8pJiYhZnVuY3Rpb24odCl7dmFyIGU9dC5kb2N1bWVudCxuPWUuY3JlYXRlRWxlbWVudChcImRpdlwiKTtuLmNsYXNzTmFtZT1cIm1kYy1yaXBwbGUtc3VyZmFjZS0tdGVzdC1lZGdlLXZhci1idWdcIixlLmJvZHkuYXBwZW5kQ2hpbGQobik7dmFyIGk9dC5nZXRDb21wdXRlZFN0eWxlKG4pLGE9bnVsbCE9PWkmJlwic29saWRcIj09PWkuYm9yZGVyVG9wU3R5bGU7cmV0dXJuIG4ucmVtb3ZlKCksYX0odCksZXx8KGk9YSksYX1mdW5jdGlvbiBvKHQsZSl7aWYodm9pZCAwPT09dCYmKHQ9d2luZG93KSx2b2lkIDA9PT1lJiYoZT0hMSksdm9pZCAwPT09YXx8ZSl7dmFyIG49ITE7dHJ5e3QuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRlc3RcIixmdW5jdGlvbigpe30se2dldCBwYXNzaXZlKCl7cmV0dXJuIG49ITB9fSl9Y2F0Y2godCl7fWE9bn1yZXR1cm4hIWEmJntwYXNzaXZlOiEwfX1mdW5jdGlvbiBzKHQsZSxuKXtpZighdClyZXR1cm57eDowLHk6MH07dmFyIGksYSxyPWUueCxvPWUueSxzPXIrbi5sZWZ0LHU9bytuLnRvcDtpZihcInRvdWNoc3RhcnRcIj09PXQudHlwZSl7dmFyIGM9dDtpPWMuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVgtcyxhPWMuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVktdX1lbHNle3ZhciBkPXQ7aT1kLnBhZ2VYLXMsYT1kLnBhZ2VZLXV9cmV0dXJue3g6aSx5OmF9fW4ucihlKSxuLmQoZSxcInN1cHBvcnRzQ3NzVmFyaWFibGVzXCIsZnVuY3Rpb24oKXtyZXR1cm4gcn0pLG4uZChlLFwiYXBwbHlQYXNzaXZlXCIsZnVuY3Rpb24oKXtyZXR1cm4gb30pLG4uZChlLFwiZ2V0Tm9ybWFsaXplZEV2ZW50Q29vcmRzXCIsZnVuY3Rpb24oKXtyZXR1cm4gc30pfX0pfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yaXBwbGUuanMubWFwIiwiIWZ1bmN0aW9uKHQsZSl7aWYoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUpbW9kdWxlLmV4cG9ydHM9ZShyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcImNsYXNzbmFtZXNcIikscmVxdWlyZShcIkBtYXRlcmlhbC9yZWFjdC1mbG9hdGluZy1sYWJlbC9kaXN0L2luZGV4LmpzXCIpLHJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtbGluZS1yaXBwbGUvZGlzdC9pbmRleC5qc1wiKSxyZXF1aXJlKFwiQG1hdGVyaWFsL3JlYWN0LW5vdGNoZWQtb3V0bGluZS9kaXN0L2luZGV4LmpzXCIpLHJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtbWVudS9kaXN0L2luZGV4LmpzXCIpKTtlbHNlIGlmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW1wicmVhY3RcIixcImNsYXNzbmFtZXNcIixcIkBtYXRlcmlhbC9yZWFjdC1mbG9hdGluZy1sYWJlbC9kaXN0L2luZGV4LmpzXCIsXCJAbWF0ZXJpYWwvcmVhY3QtbGluZS1yaXBwbGUvZGlzdC9pbmRleC5qc1wiLFwiQG1hdGVyaWFsL3JlYWN0LW5vdGNoZWQtb3V0bGluZS9kaXN0L2luZGV4LmpzXCIsXCJAbWF0ZXJpYWwvcmVhY3QtbWVudS9kaXN0L2luZGV4LmpzXCJdLGUpO2Vsc2V7dmFyIG49XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZShyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcImNsYXNzbmFtZXNcIikscmVxdWlyZShcIkBtYXRlcmlhbC9yZWFjdC1mbG9hdGluZy1sYWJlbC9kaXN0L2luZGV4LmpzXCIpLHJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtbGluZS1yaXBwbGUvZGlzdC9pbmRleC5qc1wiKSxyZXF1aXJlKFwiQG1hdGVyaWFsL3JlYWN0LW5vdGNoZWQtb3V0bGluZS9kaXN0L2luZGV4LmpzXCIpLHJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtbWVudS9kaXN0L2luZGV4LmpzXCIpKTplKHQucmVhY3QsdC5jbGFzc25hbWVzLHRbXCJAbWF0ZXJpYWwvcmVhY3QtZmxvYXRpbmctbGFiZWwvZGlzdC9pbmRleC5qc1wiXSx0W1wiQG1hdGVyaWFsL3JlYWN0LWxpbmUtcmlwcGxlL2Rpc3QvaW5kZXguanNcIl0sdFtcIkBtYXRlcmlhbC9yZWFjdC1ub3RjaGVkLW91dGxpbmUvZGlzdC9pbmRleC5qc1wiXSx0W1wiQG1hdGVyaWFsL3JlYWN0LW1lbnUvZGlzdC9pbmRleC5qc1wiXSk7Zm9yKHZhciBpIGluIG4pKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6dClbaV09bltpXX19KFwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcyxmdW5jdGlvbih0LGUsbixpLG8scil7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4oaSl7aWYoZVtpXSlyZXR1cm4gZVtpXS5leHBvcnRzO3ZhciBvPWVbaV09e2k6aSxsOiExLGV4cG9ydHM6e319O3JldHVybiB0W2ldLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9cmV0dXJuIG4ubT10LG4uYz1lLG4uZD1mdW5jdGlvbih0LGUsaSl7bi5vKHQsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2VudW1lcmFibGU6ITAsZ2V0Oml9KX0sbi5yPWZ1bmN0aW9uKHQpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbih0LGUpe2lmKDEmZSYmKHQ9bih0KSksOCZlKXJldHVybiB0O2lmKDQmZSYmXCJvYmplY3RcIj09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgaT1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihpKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaSxcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTp0fSksMiZlJiZcInN0cmluZ1wiIT10eXBlb2YgdClmb3IodmFyIG8gaW4gdCluLmQoaSxvLGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfS5iaW5kKG51bGwsbykpO3JldHVybiBpfSxuLm49ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIG4uZChlLFwiYVwiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPVwiXCIsbihuLnM9MTA5KX0oezA6ZnVuY3Rpb24oZSxuKXtlLmV4cG9ydHM9dH0sMTpmdW5jdGlvbih0LG4pe3QuZXhwb3J0cz1lfSwxMDk6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciBpLG89dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9KSh0LGUpfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLHI9dGhpcyYmdGhpcy5fX2Fzc2lnbnx8ZnVuY3Rpb24oKXtyZXR1cm4ocj1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgbyBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxvKSYmKHRbb109ZVtvXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGE9dGhpcyYmdGhpcy5fX3Jlc3R8fGZ1bmN0aW9uKHQsZSl7dmFyIG49e307Zm9yKHZhciBpIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsaSkmJmUuaW5kZXhPZihpKTwwJiYobltpXT10W2ldKTtpZihudWxsIT10JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgbz0wO2ZvcihpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7bzxpLmxlbmd0aDtvKyspZS5pbmRleE9mKGlbb10pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LGlbb10pJiYobltpW29dXT10W2lbb11dKX1yZXR1cm4gbn0scz10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgdT1zKG4oMCkpLGw9cyhuKDEpKSxjPW4oNDMpLGQ9cyhuKDMzKSkscD1zKG4oMzQpKSxmPXMobigzNSkpLGg9bigxMTApLF89cyhuKDExMykpO2UuT3B0aW9uPV8uZGVmYXVsdDt2YXIgbT1jLk1EQ1NlbGVjdEZvdW5kYXRpb24uY3NzQ2xhc3Nlcyx5PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG49dC5jYWxsKHRoaXMsZSl8fHRoaXM7cmV0dXJuIG4ubmF0aXZlQ29udHJvbD11LmRlZmF1bHQuY3JlYXRlUmVmKCksbi5jbGFzc2VzQmVpbmdSZW1vdmVkPW5ldyBTZXQsbi5jbGFzc2VzQmVpbmdBZGRlZD1uZXcgU2V0LG4uY3JlYXRlRm91bmRhdGlvbj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgYy5NRENTZWxlY3RGb3VuZGF0aW9uKG4uYWRhcHRlcixuLmZvdW5kYXRpb25NYXApO2UuaW5pdCgpLG4uc2V0U3RhdGUoe2ZvdW5kYXRpb246ZX0sdCl9LG4uZGVzdHJveUZvdW5kYXRpb249ZnVuY3Rpb24oKXtuLnN0YXRlLmZvdW5kYXRpb24mJm4uc3RhdGUuZm91bmRhdGlvbi5kZXN0cm95KCl9LG4uYWRkQ2xhc3M9ZnVuY3Rpb24odCl7bi5jbGFzc2VzQmVpbmdBZGRlZC5hZGQodCksbi5zZXRTdGF0ZShmdW5jdGlvbihlKXt2YXIgbj1uZXcgU2V0KGUuY2xhc3NMaXN0KTtyZXR1cm4gbi5hZGQodCkse2NsYXNzTGlzdDpufX0sZnVuY3Rpb24oKXtuLmNsYXNzZXNCZWluZ0FkZGVkLmRlbGV0ZSh0KX0pfSxuLnJlbW92ZUNsYXNzPWZ1bmN0aW9uKHQpe24uY2xhc3Nlc0JlaW5nUmVtb3ZlZC5hZGQodCksbi5zZXRTdGF0ZShmdW5jdGlvbihlKXt2YXIgbj1uZXcgU2V0KGUuY2xhc3NMaXN0KTtyZXR1cm4gbi5kZWxldGUodCkse2NsYXNzTGlzdDpufX0sZnVuY3Rpb24oKXtuLmNsYXNzZXNCZWluZ1JlbW92ZWQuZGVsZXRlKHQpfSl9LG4uY2xvc2VNZW51PWZ1bmN0aW9uKCl7cmV0dXJuIG4uc2V0U3RhdGUoe29wZW46ITF9KX0sbi5zZXRWYWxpZENsYXNzZXM9ZnVuY3Rpb24odCl7dD9uLnJlbW92ZUNsYXNzKG0uSU5WQUxJRCk6bi5hZGRDbGFzcyhtLklOVkFMSUQpfSxuLnNldEhlbHBlclRleHRGb3VuZGF0aW9uPWZ1bmN0aW9uKHQpe24uc2V0U3RhdGUoe2hlbHBlclRleHRGb3VuZGF0aW9uOnR9KX0sbi5zZXRJY29uRm91bmRhdGlvbj1mdW5jdGlvbih0KXtuLnNldFN0YXRlKHtpY29uRm91bmRhdGlvbjp0fSl9LG4uc3RhdGU9e2NsYXNzTGlzdDpuZXcgU2V0LGRpc2FibGVkOmUuZGlzYWJsZWQsdmFsdWU6ZS52YWx1ZSxsYWJlbElzRmxvYXRlZDohMSxsYWJlbFdpZHRoOjAsYWN0aXZlTGluZVJpcHBsZTohMSxsaW5lUmlwcGxlQ2VudGVyOnZvaWQgMCxvdXRsaW5lSXNOb3RjaGVkOiExLG9wZW46ITEsc2VsZWN0RWxlbWVudDp1LmRlZmF1bHQuY3JlYXRlUmVmKCksaXNJbnZhbGlkOiExLGhlbHBlclRleHRGb3VuZGF0aW9uOnZvaWQgMCxpY29uRm91bmRhdGlvbjp2b2lkIDAsZm91bmRhdGlvbjp2b2lkIDB9LG59cmV0dXJuIG8oZSx0KSxlLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5jcmVhdGVGb3VuZGF0aW9uKGZ1bmN0aW9uKCl7dC5zdGF0ZS5mb3VuZGF0aW9uLmhhbmRsZUNoYW5nZSghMSl9KX0sZS5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPWZ1bmN0aW9uKHQsZSl7dGhpcy5wcm9wcy52YWx1ZSE9PXQudmFsdWUmJnRoaXMuc2V0U3RhdGUoe3ZhbHVlOnRoaXMucHJvcHMudmFsdWV9KSx0aGlzLnN0YXRlLmZvdW5kYXRpb24mJnRoaXMuc3RhdGUudmFsdWUhPT1lLnZhbHVlJiZ0aGlzLnN0YXRlLmZvdW5kYXRpb24uaGFuZGxlQ2hhbmdlKCEwKSx0aGlzLnN0YXRlLmZvdW5kYXRpb24mJnRoaXMucHJvcHMuZGlzYWJsZWQhPT10LmRpc2FibGVkJiZ0aGlzLnN0YXRlLmZvdW5kYXRpb24uc2V0RGlzYWJsZWQodGhpcy5wcm9wcy5kaXNhYmxlZCksdGhpcy5zdGF0ZS5oZWxwZXJUZXh0Rm91bmRhdGlvbj09PWUuaGVscGVyVGV4dEZvdW5kYXRpb24mJnRoaXMuc3RhdGUuaWNvbkZvdW5kYXRpb249PT1lLmljb25Gb3VuZGF0aW9ufHwodGhpcy5kZXN0cm95Rm91bmRhdGlvbigpLHRoaXMuY3JlYXRlRm91bmRhdGlvbigpKX0sZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLmRlc3Ryb3lGb3VuZGF0aW9uKCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImNsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zdGF0ZSxlPXQuY2xhc3NMaXN0LG49dC5kaXNhYmxlZCxpPXRoaXMucHJvcHMsbz1pLmNsYXNzTmFtZSxyPWkubGVhZGluZ0ljb24sYT1pLnJlcXVpcmVkLHM9aS5vdXRsaW5lZDtyZXR1cm4gbC5kZWZhdWx0KFwibWRjLXNlbGVjdFwiLEFycmF5LmZyb20oZSksbyx7XCJtZGMtc2VsZWN0LS1vdXRsaW5lZFwiOnMsXCJtZGMtc2VsZWN0LS1kaXNhYmxlZFwiOm4sXCJtZGMtc2VsZWN0LS1yZXF1aXJlZFwiOmEsXCJtZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvblwiOnJ9KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJhZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLnByb3BzLmVuaGFuY2VkLG49e2FkZENsYXNzOnRoaXMuYWRkQ2xhc3MscmVtb3ZlQ2xhc3M6dGhpcy5yZW1vdmVDbGFzcyxoYXNDbGFzczpmdW5jdGlvbihlKXt2YXIgbj10LmNsYXNzZXMuc3BsaXQoXCIgXCIpLmluY2x1ZGVzKGUpLGk9dC5jbGFzc2VzQmVpbmdBZGRlZC5oYXMoZSksbz10LmNsYXNzZXNCZWluZ1JlbW92ZWQuaGFzKGUpO3JldHVybihufHxpKSYmIW99LHNldFJpcHBsZUNlbnRlcjpmdW5jdGlvbihlKXtyZXR1cm4gdC5zZXRTdGF0ZSh7bGluZVJpcHBsZUNlbnRlcjplfSl9LGdldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHQuc3RhdGUudmFsdWV9LHNldFZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0LnNldFN0YXRlKHt2YWx1ZTplfSl9LHNldERpc2FibGVkOmZ1bmN0aW9uKGUpe3JldHVybiB0LnNldFN0YXRlKHtkaXNhYmxlZDplfSl9LHNldFNlbGVjdGVkSW5kZXg6ZnVuY3Rpb24oKXt9LGNsb3NlTWVudTp0aGlzLmNsb3NlTWVudSxvcGVuTWVudTpmdW5jdGlvbigpe3JldHVybiB0LnNldFN0YXRlKHtvcGVuOiEwfSl9fSxpPXtpc01lbnVPcGVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGNoZWNrVmFsaWRpdHk6ZnVuY3Rpb24oKXtyZXR1cm4hIXQubmF0aXZlQ29udHJvbC5jdXJyZW50JiZ0Lm5hdGl2ZUNvbnRyb2wuY3VycmVudC5jaGVja1ZhbGlkaXR5KCl9LHNldFZhbGlkOnRoaXMuc2V0VmFsaWRDbGFzc2VzfTtyZXR1cm4gcih7fSxlP3tpc01lbnVPcGVuOmZ1bmN0aW9uKCl7cmV0dXJuIHQuc3RhdGUub3Blbn0sY2hlY2tWYWxpZGl0eTpmdW5jdGlvbigpe3JldHVybiEoIXQucHJvcHMuZGlzYWJsZWQmJnQucHJvcHMucmVxdWlyZWQpfHxCb29sZWFuKHQuc3RhdGUudmFsdWUpfSxzZXRWYWxpZDpmdW5jdGlvbihlKXt0LnNldFN0YXRlKHtpc0ludmFsaWQ6IWV9KSx0LnNldFZhbGlkQ2xhc3NlcyhlKX19Omksbix7ZmxvYXRMYWJlbDpmdW5jdGlvbihlKXtyZXR1cm4gdC5zZXRTdGF0ZSh7bGFiZWxJc0Zsb2F0ZWQ6ZX0pfSxnZXRMYWJlbFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHQuc3RhdGUubGFiZWxXaWR0aH19LHthY3RpdmF0ZUJvdHRvbUxpbmU6ZnVuY3Rpb24oKXtyZXR1cm4gdC5zZXRTdGF0ZSh7YWN0aXZlTGluZVJpcHBsZTohMH0pfSxkZWFjdGl2YXRlQm90dG9tTGluZTpmdW5jdGlvbigpe3JldHVybiB0LnNldFN0YXRlKHthY3RpdmVMaW5lUmlwcGxlOiExfSl9LG5vdGlmeUNoYW5nZTpmdW5jdGlvbihlKXtyZXR1cm4gdC5wcm9wcy5hZnRlckNoYW5nZShlKX19LHtub3RjaE91dGxpbmU6ZnVuY3Rpb24oKXtyZXR1cm4gdC5zZXRTdGF0ZSh7b3V0bGluZUlzTm90Y2hlZDohMH0pfSxjbG9zZU91dGxpbmU6ZnVuY3Rpb24oKXtyZXR1cm4gdC5zZXRTdGF0ZSh7b3V0bGluZUlzTm90Y2hlZDohMX0pfSxoYXNPdXRsaW5lOmZ1bmN0aW9uKCl7cmV0dXJuISF0LnByb3BzLm91dGxpbmVkfX0pfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImZvdW5kYXRpb25NYXBcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zdGF0ZTtyZXR1cm57aGVscGVyVGV4dDp0LmhlbHBlclRleHRGb3VuZGF0aW9uLGxlYWRpbmdJY29uOnQuaWNvbkZvdW5kYXRpb259fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3JldHVybiB1LmRlZmF1bHQuY3JlYXRlRWxlbWVudCh1LmRlZmF1bHQuRnJhZ21lbnQsbnVsbCx1LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6dGhpcy5jbGFzc2VzLHJlZjp0aGlzLnN0YXRlLnNlbGVjdEVsZW1lbnR9LHRoaXMucmVuZGVySWNvbigpLHUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaVwiLHtjbGFzc05hbWU6XCJtZGMtc2VsZWN0X19kcm9wZG93bi1pY29uXCJ9KSx0aGlzLnJlbmRlclNlbGVjdCgpLHRoaXMucHJvcHMub3V0bGluZWQ/bnVsbDp0aGlzLnJlbmRlckxhYmVsKCksdGhpcy5wcm9wcy5vdXRsaW5lZD90aGlzLnJlbmRlck5vdGNoZWRPdXRsaW5lKCk6dGhpcy5yZW5kZXJMaW5lUmlwcGxlKCkpLHRoaXMucmVuZGVySGVscGVyVGV4dCgpKX0sZS5wcm90b3R5cGUucmVuZGVyU2VsZWN0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcyxlPXQuc2VsZWN0Q2xhc3NOYW1lLG49KHQuY2xhc3NOYW1lLHQuZmxvYXRpbmdMYWJlbENsYXNzTmFtZSx0LmxpbmVSaXBwbGVDbGFzc05hbWUsdC5ub3RjaGVkT3V0bGluZUNsYXNzTmFtZSx0Lm91dGxpbmVkLHQucmVmLHQudmFsdWUsdC5hZnRlckNoYW5nZSx0Lm9uRW5oYW5jZWRDaGFuZ2UpLGk9KHQuaGVscGVyVGV4dCx0LmxlYWRpbmdJY29uLHQuZW5oYW5jZWQpLG89YSh0LFtcInNlbGVjdENsYXNzTmFtZVwiLFwiY2xhc3NOYW1lXCIsXCJmbG9hdGluZ0xhYmVsQ2xhc3NOYW1lXCIsXCJsaW5lUmlwcGxlQ2xhc3NOYW1lXCIsXCJub3RjaGVkT3V0bGluZUNsYXNzTmFtZVwiLFwib3V0bGluZWRcIixcInJlZlwiLFwidmFsdWVcIixcImFmdGVyQ2hhbmdlXCIsXCJvbkVuaGFuY2VkQ2hhbmdlXCIsXCJoZWxwZXJUZXh0XCIsXCJsZWFkaW5nSWNvblwiLFwiZW5oYW5jZWRcIl0pLHM9dGhpcy5zdGF0ZSxsPXMub3BlbixjPXMuc2VsZWN0RWxlbWVudCxkPXMuaXNJbnZhbGlkLHA9cy52YWx1ZSxmPXtvbkVuaGFuY2VkQ2hhbmdlOm4sY2xvc2VNZW51OnRoaXMuY2xvc2VNZW51LGFuY2hvckVsZW1lbnQ6Yy5jdXJyZW50LGVuaGFuY2VkOmksaXNJbnZhbGlkOmR9O3JldHVybiB1LmRlZmF1bHQuY3JlYXRlRWxlbWVudChoLkJhc2VTZWxlY3Qscih7b3BlbjpsLHZhbHVlOnAsaW5uZXJSZWY6dGhpcy5uYXRpdmVDb250cm9sLGZvdW5kYXRpb246dGhpcy5zdGF0ZS5mb3VuZGF0aW9uLGNsYXNzTmFtZTplfSxpP2Y6e30sbyksdGhpcy5yZW5kZXJPcHRpb25zKCkpfSxlLnByb3RvdHlwZS5yZW5kZXJPcHRpb25zPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcyxlPXQuY2hpbGRyZW4sbj10Lm9wdGlvbnM7cmV0dXJuIHZvaWQgMCE9PW4mJm4ubGVuZ3RoP24ubWFwKGZ1bmN0aW9uKHQsZSl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpcmV0dXJuIHUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF8uZGVmYXVsdCx7a2V5OmUsdmFsdWU6dH0sdCk7dmFyIG49dC5sYWJlbCxpPWEodCxbXCJsYWJlbFwiXSk7cmV0dXJuIHUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF8uZGVmYXVsdCxyKHtrZXk6ZX0saSksbil9KTplfSxlLnByb3RvdHlwZS5yZW5kZXJMYWJlbD1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLnByb3BzLG49ZS5pZCxpPWUubGFiZWwsbz1lLmZsb2F0aW5nTGFiZWxDbGFzc05hbWU7aWYoaSlyZXR1cm4gdS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoZC5kZWZhdWx0LHtjbGFzc05hbWU6byxmbG9hdDp0aGlzLnN0YXRlLmxhYmVsSXNGbG9hdGVkLGhhbmRsZVdpZHRoQ2hhbmdlOmZ1bmN0aW9uKGUpe3JldHVybiB0LnNldFN0YXRlKHtsYWJlbFdpZHRoOmV9KX0saHRtbEZvcjpufSxpKX0sZS5wcm90b3R5cGUucmVuZGVyTGluZVJpcHBsZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMubGluZVJpcHBsZUNsYXNzTmFtZSxlPXRoaXMuc3RhdGUsbj1lLmFjdGl2ZUxpbmVSaXBwbGUsaT1lLmxpbmVSaXBwbGVDZW50ZXI7cmV0dXJuIHUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHAuZGVmYXVsdCx7cmlwcGxlQ2VudGVyOmksY2xhc3NOYW1lOnQsYWN0aXZlOm59KX0sZS5wcm90b3R5cGUucmVuZGVyTm90Y2hlZE91dGxpbmU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLm5vdGNoZWRPdXRsaW5lQ2xhc3NOYW1lLGU9dGhpcy5zdGF0ZSxuPWUub3V0bGluZUlzTm90Y2hlZCxpPWUubGFiZWxXaWR0aDtyZXR1cm4gdS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoZi5kZWZhdWx0LHtjbGFzc05hbWU6dCxub3RjaDpuLG5vdGNoV2lkdGg6aX0sdGhpcy5yZW5kZXJMYWJlbCgpKX0sZS5wcm90b3R5cGUucmVuZGVySGVscGVyVGV4dD1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMuaGVscGVyVGV4dDtpZih0KXt2YXIgZT1yKHt9LHQucHJvcHMse3NldEhlbHBlclRleHRGb3VuZGF0aW9uOnRoaXMuc2V0SGVscGVyVGV4dEZvdW5kYXRpb259KTtyZXR1cm4gdS5kZWZhdWx0LmNsb25lRWxlbWVudCh0LGUpfX0sZS5wcm90b3R5cGUucmVuZGVySWNvbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMubGVhZGluZ0ljb247aWYodCl7dmFyIGU9cih7fSx0LnByb3BzLHtzZXRJY29uRm91bmRhdGlvbjp0aGlzLnNldEljb25Gb3VuZGF0aW9ufSk7cmV0dXJuIHUuZGVmYXVsdC5jbG9uZUVsZW1lbnQodCxlKX19LGUuZGVmYXVsdFByb3BzPXtlbmhhbmNlZDohMSxjbGFzc05hbWU6XCJcIixkaXNhYmxlZDohMSxmbG9hdGluZ0xhYmVsQ2xhc3NOYW1lOlwiXCIsbGluZVJpcHBsZUNsYXNzTmFtZTpcIlwiLHNlbGVjdENsYXNzTmFtZTpcIlwiLG5vdGNoZWRPdXRsaW5lQ2xhc3NOYW1lOlwiXCIsb3V0bGluZWQ6ITEsb3B0aW9uczpbXSxvbkNoYW5nZTpmdW5jdGlvbigpe30sb25FbmhhbmNlZENoYW5nZTpmdW5jdGlvbigpe30sdmFsdWU6XCJcIixhZnRlckNoYW5nZTpmdW5jdGlvbigpe319LGV9KHUuZGVmYXVsdC5Db21wb25lbnQpO2UuZGVmYXVsdD15O3ZhciBPPW4oMTE0KTtlLlNlbGVjdEhlbHBlclRleHQ9Ty5TZWxlY3RIZWxwZXJUZXh0O3ZhciB2PW4oMTE1KTtlLlNlbGVjdEljb249di5TZWxlY3RJY29uO3ZhciBiPW4oMzYpO2UuT3B0aW9uRGl2aWRlcj1iLk1lbnVMaXN0RGl2aWRlcixlLk9wdGlvbkdyb3VwPWIuTWVudUxpc3RHcm91cCxlLk9wdGlvbkdyb3VwU3ViaGVhZGVyPWIuTWVudUxpc3RHcm91cFN1YmhlYWRlcixlLk9wdGlvbkdyYXBoaWM9Yi5NZW51TGlzdEl0ZW1HcmFwaGljLGUuT3B0aW9uTWV0YT1iLk1lbnVMaXN0SXRlbU1ldGEsZS5PcHRpb25UZXh0PWIuTWVudUxpc3RJdGVtVGV4dH0sMTEwOmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgaSxvPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1mdW5jdGlvbih0LGUpe3JldHVybihpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSkodCxlKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxyPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKHI9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIG8gaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbykmJih0W29dPWVbb10pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxhPXRoaXMmJnRoaXMuX19yZXN0fHxmdW5jdGlvbih0LGUpe3ZhciBuPXt9O2Zvcih2YXIgaSBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGkpJiZlLmluZGV4T2YoaSk8MCYmKG5baV09dFtpXSk7aWYobnVsbCE9dCYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG89MDtmb3IoaT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO288aS5sZW5ndGg7bysrKWUuaW5kZXhPZihpW29dKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodCxpW29dKSYmKG5baVtvXV09dFtpW29dXSl9cmV0dXJuIG59LHM9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIHU9cyhuKDApKSxsPXMobigxMTEpKSxjPXMobigxMTIpKSxkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUuaGFuZGxlRm9jdXM9ZnVuY3Rpb24odCl7dmFyIG49ZS5wcm9wcyxpPW4uZm91bmRhdGlvbixvPW4ub25Gb2N1cztpJiZpLmhhbmRsZUZvY3VzKCksbyYmbyh0KX0sZS5oYW5kbGVCbHVyPWZ1bmN0aW9uKHQpe3ZhciBuPWUucHJvcHMsaT1uLmZvdW5kYXRpb24sbz1uLm9uQmx1cjtpJiZpLmhhbmRsZUJsdXIoKSxvJiZvKHQpfSxlLmhhbmRsZVRvdWNoU3RhcnQ9ZnVuY3Rpb24odCl7dmFyIG49ZS5wcm9wcyxpPW4uZm91bmRhdGlvbixvPW4ub25Ub3VjaFN0YXJ0O2kmJmkuaGFuZGxlQ2xpY2soZS5nZXROb3JtYWxpemVkWENvb3JkaW5hdGUodCkpLG8mJm8odCl9LGUuaGFuZGxlTW91c2VEb3duPWZ1bmN0aW9uKHQpe3ZhciBuPWUucHJvcHMsaT1uLmZvdW5kYXRpb24sbz1uLm9uTW91c2VEb3duO2kmJmkuaGFuZGxlQ2xpY2soZS5nZXROb3JtYWxpemVkWENvb3JkaW5hdGUodCkpLG8mJm8odCl9LGUuaGFuZGxlQ2xpY2s9ZnVuY3Rpb24odCl7dmFyIG49ZS5wcm9wcyxpPW4uZm91bmRhdGlvbixvPW4ub25DbGljaztpJiZpLmhhbmRsZUNsaWNrKGUuZ2V0Tm9ybWFsaXplZFhDb29yZGluYXRlKHQpKSxvJiZvKHQpfSxlLmhhbmRsZUtleURvd249ZnVuY3Rpb24odCl7dmFyIG49ZS5wcm9wcyxpPW4uZm91bmRhdGlvbixvPW4ub25LZXlEb3duO2kmJmkuaGFuZGxlS2V5ZG93bih0Lm5hdGl2ZUV2ZW50KSxvJiZvKHQpfSxlLmlzVG91Y2hFdmVudD1mdW5jdGlvbih0KXtyZXR1cm4gQm9vbGVhbih0LnRvdWNoZXMpfSxlLmdldE5vcm1hbGl6ZWRYQ29vcmRpbmF0ZT1mdW5jdGlvbih0KXt2YXIgbj10LmN1cnJlbnRUYXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuKGUuaXNUb3VjaEV2ZW50KHQubmF0aXZlRXZlbnQpP3QubmF0aXZlRXZlbnQudG91Y2hlc1swXS5jbGllbnRYOnQubmF0aXZlRXZlbnQuY2xpZW50WCktbi5sZWZ0fSxlfXJldHVybiBvKGUsdCksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcyxlPSh0Lm9uRm9jdXMsdC5vbkJsdXIsdC5vbkNsaWNrLHQub25Nb3VzZURvd24sdC5vblRvdWNoU3RhcnQsdC5yZWYsdC5lbmhhbmNlZCksbj10LmNoaWxkcmVuLGk9dC5vbktleURvd24sbz10LnNlbGVjdENsYXNzTmFtZSxzPWEodCxbXCJvbkZvY3VzXCIsXCJvbkJsdXJcIixcIm9uQ2xpY2tcIixcIm9uTW91c2VEb3duXCIsXCJvblRvdWNoU3RhcnRcIixcInJlZlwiLFwiZW5oYW5jZWRcIixcImNoaWxkcmVuXCIsXCJvbktleURvd25cIixcInNlbGVjdENsYXNzTmFtZVwiXSksZD1yKHtvbkZvY3VzOnRoaXMuaGFuZGxlRm9jdXMsb25CbHVyOnRoaXMuaGFuZGxlQmx1cixvbk1vdXNlRG93bjp0aGlzLmhhbmRsZU1vdXNlRG93bixvbkNsaWNrOnRoaXMuaGFuZGxlQ2xpY2ssb25Ub3VjaFN0YXJ0OnRoaXMuaGFuZGxlVG91Y2hTdGFydCxjbGFzc05hbWU6b30scyk7cmV0dXJuIGU/dS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoYy5kZWZhdWx0LHIoe29uS2V5RG93bjp0aGlzLmhhbmRsZUtleURvd259LGQpLG4pOnUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGwuZGVmYXVsdCxyKHtvbktleURvd246aX0sZCksbil9LGUuZGVmYXVsdFByb3BzPXtlbmhhbmNlZDohMSxzZWxlY3RDbGFzc05hbWU6XCJcIn0sZX0odS5kZWZhdWx0LkNvbXBvbmVudCk7ZS5CYXNlU2VsZWN0PWR9LDExMTpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGksbz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4oaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSkscj10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciBvIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG8pJiYodFtvXT1lW29dKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYT10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIGkgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKSYmZS5pbmRleE9mKGkpPDAmJihuW2ldPXRbaV0pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBvPTA7Zm9yKGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtvPGkubGVuZ3RoO28rKyllLmluZGV4T2YoaVtvXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsaVtvXSkmJihuW2lbb11dPXRbaVtvXV0pfXJldHVybiBufSxzPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciB1PXMobigwKSksbD1zKG4oMSkpLGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5OYXRpdmVTZWxlY3Q9dS5kZWZhdWx0LmNyZWF0ZVJlZigpLGUuYXR0YWNoUmVmPWZ1bmN0aW9uKHQpe3ZhciBuPWUucHJvcHMuaW5uZXJSZWY7ZS5OYXRpdmVTZWxlY3QuY3VycmVudD10LG4mJihcImZ1bmN0aW9uXCIhPXR5cGVvZiBuP24uY3VycmVudD10Om4odCkpfSxlfXJldHVybiBvKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiY2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbC5kZWZhdWx0KFwibWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2xcIix0aGlzLnByb3BzLmNsYXNzTmFtZSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcyxlPSh0LmNsYXNzTmFtZSx0LmNoaWxkcmVuKSxuPSh0LmZvdW5kYXRpb24sdC5pbm5lclJlZixhKHQsW1wiY2xhc3NOYW1lXCIsXCJjaGlsZHJlblwiLFwiZm91bmRhdGlvblwiLFwiaW5uZXJSZWZcIl0pKTtyZXR1cm4gdS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIixyKHtjbGFzc05hbWU6dGhpcy5jbGFzc2VzLHJlZjp0aGlzLmF0dGFjaFJlZn0sbiksZSl9LGUuZGVmYXVsdFByb3BzPXtjbGFzc05hbWU6XCJcIixjaGlsZHJlbjpudWxsLGRpc2FibGVkOiExLHZhbHVlOlwiXCJ9LGV9KHUuZGVmYXVsdC5Db21wb25lbnQpO2UuZGVmYXVsdD1jfSwxMTI6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciBpLG89dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9KSh0LGUpfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLHI9dGhpcyYmdGhpcy5fX2Fzc2lnbnx8ZnVuY3Rpb24oKXtyZXR1cm4ocj1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgbyBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxvKSYmKHRbb109ZVtvXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGE9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0scz10aGlzJiZ0aGlzLl9faW1wb3J0U3Rhcnx8ZnVuY3Rpb24odCl7aWYodCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBlPXt9O2lmKG51bGwhPXQpZm9yKHZhciBuIGluIHQpT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGVbbl09dFtuXSk7cmV0dXJuIGUuZGVmYXVsdD10LGV9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciB1PWEobigwKSksbD1uKDE3NCksYz1zKG4oMzYpKSxkPWEobig0MykpLHA9bC5NRENNZW51U3VyZmFjZUZvdW5kYXRpb24uQ29ybmVyLGY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5uYXRpdmVDb250cm9sPXUuZGVmYXVsdC5jcmVhdGVSZWYoKSxlLnNlbGVjdGVkVGV4dEVsPXUuZGVmYXVsdC5jcmVhdGVSZWYoKSxlLm1lbnVFbD11LmRlZmF1bHQuY3JlYXRlUmVmKCksZS5zdGF0ZT17XCJhcmlhLWV4cGFuZGVkXCI6dm9pZCAwLHNlbGVjdGVkSXRlbTpudWxsLHNlbGVjdGVkVmFsdWU6XCJcIn0sZS5zZXRTZWxlY3RlZD1mdW5jdGlvbigpe3ZhciB0PW51bGwhPT1lLm1lbnVFbC5jdXJyZW50JiZlLm1lbnVFbC5jdXJyZW50Lmxpc3RFbGVtZW50cztpZih0JiZ0Lmxlbmd0aCl7dmFyIG49dFtlLmdldEluZGV4QnlWYWx1ZSh0KV0saT1uJiZuLmdldEF0dHJpYnV0ZShkLmRlZmF1bHQuc3RyaW5ncy5FTkhBTkNFRF9WQUxVRV9BVFRSKXx8XCJcIjtlLnNldFN0YXRlKHtzZWxlY3RlZEl0ZW06bixzZWxlY3RlZFZhbHVlOml9KX19LGUuZ2V0SW5kZXhCeVZhbHVlPWZ1bmN0aW9uKHQpe3ZhciBuPWUucHJvcHMudmFsdWUsaT0tMTtyZXR1cm4gaTwwJiZuJiZ0LnNvbWUoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoZC5kZWZhdWx0LnN0cmluZ3MuRU5IQU5DRURfVkFMVUVfQVRUUik9PT1uJiYoaT1lLCEwKX0pLGl9LGUuaGFuZGxlTWVudUNsb3NlPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5wcm9wcyxuPXQuY2xvc2VNZW51LGk9dC5mb3VuZGF0aW9uO24oKSxlLnNldFN0YXRlKHtcImFyaWEtZXhwYW5kZWRcIjp2b2lkIDB9KSxpJiZkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09ZS5zZWxlY3RlZFRleHRFbC5jdXJyZW50JiZpLmhhbmRsZUJsdXIoKX0sZS5oYW5kbGVNZW51T3Blbj1mdW5jdGlvbigpe2lmKGUuc2V0U3RhdGUoe1wiYXJpYS1leHBhbmRlZFwiOiEwfSksZS5saXN0RWxlbWVudHMmJmUubGlzdEVsZW1lbnRzLmxlbmd0aD4wKXt2YXIgdD1lLmdldEluZGV4QnlWYWx1ZShlLmxpc3RFbGVtZW50cyk7dD10Pi0xP3Q6MCxlLmxpc3RFbGVtZW50c1t0XS5mb2N1cygpfX0sZX1yZXR1cm4gbyhlLHQpLGUucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbih0KXt0aGlzLnByb3BzLnZhbHVlIT09dC52YWx1ZSYmdGhpcy5zZXRTZWxlY3RlZCgpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJsaXN0RWxlbWVudHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT10aGlzLm1lbnVFbC5jdXJyZW50JiZ0aGlzLm1lbnVFbC5jdXJyZW50Lmxpc3RFbGVtZW50c30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9dC5jaGlsZHJlbixuPXQucmVxdWlyZWQsaT10Lm9wZW4sbz10LmRpc2FibGVkLGE9dC5hbmNob3JFbGVtZW50LHM9dC5vbk1vdXNlRG93bixsPXQub25Ub3VjaFN0YXJ0LGQ9dC5vbktleURvd24sZj10Lm9uRm9jdXMsaD10Lm9uQ2xpY2ssXz10Lm9uQmx1cixtPXQub25FbmhhbmNlZENoYW5nZSx5PXQuaXNJbnZhbGlkLE89dGhpcy5zdGF0ZSx2PU9bXCJhcmlhLWV4cGFuZGVkXCJdLGI9Ty5zZWxlY3RlZFZhbHVlLGc9Ty5zZWxlY3RlZEl0ZW0sRT17fTtyZXR1cm4gbiYmKEVbXCJhcmlhLXJlcXVpcmVkXCJdPW4udG9TdHJpbmcoKSksdiYmXCJmYWxzZVwiIT09diYmKEVbXCJhcmlhLWV4cGFuZGVkXCJdPVwidHJ1ZVwiKSx5JiYoRVtcImFyaWEtaW52YWxpZFwiXT1cInRydWVcIiksRVtcImFyaWEtZGlzYWJsZWRcIl09bz9cInRydWVcIjpcImZhbHNlXCIsdS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQodS5kZWZhdWx0LkZyYWdtZW50LG51bGwsdS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLHt0eXBlOlwiaGlkZGVuXCIsbmFtZTpcImVuaGFuY2VkLXNlbGVjdFwiLGRpc2FibGVkOm8sdmFsdWU6Yn0pLHUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIscih7Y2xhc3NOYW1lOlwibWRjLXNlbGVjdF9fc2VsZWN0ZWQtdGV4dFwifSxFLHtyZWY6dGhpcy5zZWxlY3RlZFRleHRFbCx0YWJJbmRleDpvPy0xOjAsb25Nb3VzZURvd246cyxvblRvdWNoU3RhcnQ6bCxvbktleURvd246ZCxvbkZvY3VzOmYsb25DbGljazpoLG9uQmx1cjpffSksZz9nLnRleHRDb250ZW50LnRyaW0oKTpcIlwiKSx1LmRlZmF1bHQuY3JlYXRlRWxlbWVudChjLmRlZmF1bHQse2NsYXNzTmFtZTpcIm1kYy1zZWxlY3RfX21lbnVcIixvbkNsb3NlOnRoaXMuaGFuZGxlTWVudUNsb3NlLG9uT3Blbjp0aGlzLmhhbmRsZU1lbnVPcGVuLG9wZW46aSxvblNlbGVjdGVkOm0sYW5jaG9yRWxlbWVudDphfHx2b2lkIDAsYW5jaG9yQ29ybmVyOnAuQk9UVE9NX1NUQVJULHJlZjp0aGlzLm1lbnVFbCxvbk1vdW50OnRoaXMuc2V0U2VsZWN0ZWR9LHUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGMuTWVudUxpc3QsbnVsbCx1LmRlZmF1bHQuQ2hpbGRyZW4ubWFwKGUsZnVuY3Rpb24odCl7dmFyIGU9dDtyZXR1cm4gdS5kZWZhdWx0LmNsb25lRWxlbWVudChlLHIoe30sZS5wcm9wcyx7ZW5oYW5jZWQ6ITB9KSl9KSkpKX0sZS5kZWZhdWx0UHJvcHM9e2Rpc2FibGVkOiExLGNsb3NlTWVudTpmdW5jdGlvbigpe30sb25FbmhhbmNlZENoYW5nZTpmdW5jdGlvbigpe30sdmFsdWU6XCJcIixhbmNob3JFbGVtZW50Om51bGwsaXNJbnZhbGlkOiExfSxlfSh1LmRlZmF1bHQuQ29tcG9uZW50KTtlLmRlZmF1bHQ9Zn0sMTEzOmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgaSxvPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1mdW5jdGlvbih0LGUpe3JldHVybihpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSkodCxlKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxyPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKHI9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIG8gaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbykmJih0W29dPWVbb10pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxhPXRoaXMmJnRoaXMuX19yZXN0fHxmdW5jdGlvbih0LGUpe3ZhciBuPXt9O2Zvcih2YXIgaSBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGkpJiZlLmluZGV4T2YoaSk8MCYmKG5baV09dFtpXSk7aWYobnVsbCE9dCYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG89MDtmb3IoaT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO288aS5sZW5ndGg7bysrKWUuaW5kZXhPZihpW29dKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodCxpW29dKSYmKG5baVtvXV09dFtpW29dXSl9cmV0dXJuIG59LHM9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIHU9cyhuKDApKSxsPW4oMzYpLGM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIG8oZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9dC52YWx1ZSxuPXQuZW5oYW5jZWQsaT10LmNoaWxkcmVuLG89YSh0LFtcInZhbHVlXCIsXCJlbmhhbmNlZFwiLFwiY2hpbGRyZW5cIl0pO3JldHVybiBuP3UuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGwuTWVudUxpc3RJdGVtLHIoe1wiZGF0YS12YWx1ZVwiOmV9LG8pLGkpOnUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIscih7dmFsdWU6ZX0sbyksaSl9LGUuZGVmYXVsdFByb3BzPXtlbmhhbmNlZDohMX0sZX0odS5kZWZhdWx0LkNvbXBvbmVudCk7ZS5kZWZhdWx0PWN9LDExNDpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGksbz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4oaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSkscj10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciBvIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG8pJiYodFtvXT1lW29dKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYT10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIGkgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKSYmZS5pbmRleE9mKGkpPDAmJihuW2ldPXRbaV0pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBvPTA7Zm9yKGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtvPGkubGVuZ3RoO28rKyllLmluZGV4T2YoaVtvXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsaVtvXSkmJihuW2lbb11dPXRbaVtvXV0pfXJldHVybiBufSxzPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciB1PXMobigwKSksbD1zKG4oMSkpLGM9bigxNjYpLGQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5zdGF0ZT17XCJhcmlhLWhpZGRlblwiOnZvaWQgMCxyb2xlOnZvaWQgMCxjbGFzc0xpc3Q6bmV3IFNldH0sZX1yZXR1cm4gbyhlLHQpLGUucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcy5zZXRIZWxwZXJUZXh0Rm91bmRhdGlvbjt0aGlzLmZvdW5kYXRpb249bmV3IGMuTURDU2VsZWN0SGVscGVyVGV4dEZvdW5kYXRpb24odGhpcy5hZGFwdGVyKSx0aGlzLmZvdW5kYXRpb24uaW5pdCgpLHQmJnQodGhpcy5mb3VuZGF0aW9uKX0sZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLnNldEhlbHBlclRleHRGb3VuZGF0aW9uO3RoaXMuZm91bmRhdGlvbiYmKHRoaXMuZm91bmRhdGlvbi5kZXN0cm95KCksdCYmdCh2b2lkIDApKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiY2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9dC5jbGFzc05hbWUsbj10LnBlcnNpc3RlbnQsaT10aGlzLnN0YXRlLmNsYXNzTGlzdDtyZXR1cm4gbC5kZWZhdWx0KFwibWRjLXNlbGVjdC1oZWxwZXItdGV4dFwiLEFycmF5LmZyb20oaSksZSx7XCJtZGMtc2VsZWN0LWhlbHBlci10ZXh0LS1wZXJzaXN0ZW50XCI6bn0pfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm57YWRkQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIG49bmV3IFNldCh0LnN0YXRlLmNsYXNzTGlzdCk7bi5hZGQoZSksdC5zZXRTdGF0ZSh7Y2xhc3NMaXN0Om59KX0scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIG49bmV3IFNldCh0LnN0YXRlLmNsYXNzTGlzdCk7bi5kZWxldGUoZSksdC5zZXRTdGF0ZSh7Y2xhc3NMaXN0Om59KX0saGFzQ2xhc3M6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY2xhc3Nlcy5zcGxpdChcIiBcIikuaW5jbHVkZXMoZSl9LHNldEF0dHI6ZnVuY3Rpb24oZSxuKXt0LnNldFN0YXRlKGZ1bmN0aW9uKHQpe3ZhciBpO3JldHVybiByKHt9LHQsKChpPXt9KVtlXT1uLGkpKX0pfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3Quc2V0U3RhdGUoZnVuY3Rpb24odCl7dmFyIG47cmV0dXJuIHIoe30sdCwoKG49e30pW2VdPW51bGwsbikpfSl9LHNldENvbnRlbnQ6ZnVuY3Rpb24oKXt9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9dC5jaGlsZHJlbixuPSh0LnBlcnNpc3RlbnQsdC5jbGFzc05hbWUsdC5zZXRIZWxwZXJUZXh0Rm91bmRhdGlvbixhKHQsW1wiY2hpbGRyZW5cIixcInBlcnNpc3RlbnRcIixcImNsYXNzTmFtZVwiLFwic2V0SGVscGVyVGV4dEZvdW5kYXRpb25cIl0pKSxpPXRoaXMuc3RhdGUsbz1pW1wiYXJpYS1oaWRkZW5cIl0scz1pLnJvbGU7cmV0dXJuIHUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwicFwiLHIoe2NsYXNzTmFtZTp0aGlzLmNsYXNzZXMsXCJhcmlhLWhpZGRlblwiOm8scm9sZTpzfSxuKSxlKX0sZX0odS5kZWZhdWx0LkNvbXBvbmVudCk7ZS5TZWxlY3RIZWxwZXJUZXh0PWR9LDExNTpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGksbz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4oaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1pKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSkscj10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciBvIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG8pJiYodFtvXT1lW29dKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYT10aGlzJiZ0aGlzLl9fcmVzdHx8ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIGkgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKSYmZS5pbmRleE9mKGkpPDAmJihuW2ldPXRbaV0pO2lmKG51bGwhPXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBvPTA7Zm9yKGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtvPGkubGVuZ3RoO28rKyllLmluZGV4T2YoaVtvXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsaVtvXSkmJihuW2lbb11dPXRbaVtvXV0pfXJldHVybiBufSxzPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciB1PXMobigwKSksbD1zKG4oMSkpLGM9bigxNzEpLGQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5zdGF0ZT17dGFiaW5kZXg6dm9pZCAwLHJvbGU6dm9pZCAwfSxlfXJldHVybiBvKGUsdCksZS5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLnNldEljb25Gb3VuZGF0aW9uO3RoaXMuZm91bmRhdGlvbj1uZXcgYy5NRENTZWxlY3RJY29uRm91bmRhdGlvbih0aGlzLmFkYXB0ZXIpLHRoaXMuZm91bmRhdGlvbi5pbml0KCksdCYmdCh0aGlzLmZvdW5kYXRpb24pfSxlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMuc2V0SWNvbkZvdW5kYXRpb247dGhpcy5mb3VuZGF0aW9uJiYodGhpcy5mb3VuZGF0aW9uLmRlc3Ryb3koKSx0JiZ0KHZvaWQgMCkpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJhZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJue2dldEF0dHI6ZnVuY3Rpb24oZSl7aWYodm9pZCAwIT09dC5zdGF0ZVtlXSlyZXR1cm4gdC5zdGF0ZVtlXS50b1N0cmluZygpO3ZhciBuPVwidGFiaW5kZXhcIj09PWU/XCJ0YWJJbmRleFwiOmU7cmV0dXJuIHZvaWQgMCE9PXQucHJvcHNbbl0/dC5wcm9wc1tuXS50b1N0cmluZygpOm51bGx9LHNldEF0dHI6ZnVuY3Rpb24oZSxuKXt0LnNldFN0YXRlKGZ1bmN0aW9uKHQpe3ZhciBpO3JldHVybiByKHt9LHQsKChpPXt9KVtlXT1uLGkpKX0pfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3Quc2V0U3RhdGUoZnVuY3Rpb24odCl7dmFyIG47cmV0dXJuIHIoe30sdCwoKG49e30pW2VdPW51bGwsbikpfSl9LHNldENvbnRlbnQ6ZnVuY3Rpb24oKXt9LHJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxkZXJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxub3RpZnlJY29uQWN0aW9uOmZ1bmN0aW9uKCl7fX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcyxlPXQudGFnLG49KHQuc2V0SWNvbkZvdW5kYXRpb24sdC5jaGlsZHJlbiksaT10LmNsYXNzTmFtZSxvPWEodCxbXCJ0YWdcIixcInNldEljb25Gb3VuZGF0aW9uXCIsXCJjaGlsZHJlblwiLFwiY2xhc3NOYW1lXCJdKSxzPXRoaXMuc3RhdGUsYz1zLnRhYmluZGV4LGQ9cy5yb2xlO3JldHVybiB1LmRlZmF1bHQuY3JlYXRlRWxlbWVudChlLHIoe2NsYXNzTmFtZTpsLmRlZmF1bHQoXCJtZGMtc2VsZWN0X19pY29uXCIsaSkscm9sZTpkLHRhYkluZGV4OmN9LG8pLG4pfSxlLmRlZmF1bHRQcm9wcz17dGFnOlwiaVwifSxlfSh1LmRlZmF1bHQuQ29tcG9uZW50KTtlLlNlbGVjdEljb249ZH0sMTM6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24uZChlLFwiYVwiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZvaWQgMD09PXQmJih0PXt9KSx0aGlzLmFkYXB0ZXJfPXR9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcInN0cmluZ3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJudW1iZXJzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe30sdH0oKX0sMTY2OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSk7dmFyIGk9big5KSxvPW4oMTMpLHI9e0FSSUFfSElEREVOOlwiYXJpYS1oaWRkZW5cIixST0xFOlwicm9sZVwifSxhPXtIRUxQRVJfVEVYVF9QRVJTSVNURU5UOlwibWRjLXNlbGVjdC1oZWxwZXItdGV4dC0tcGVyc2lzdGVudFwiLEhFTFBFUl9URVhUX1ZBTElEQVRJT05fTVNHOlwibWRjLXNlbGVjdC1oZWxwZXItdGV4dC0tdmFsaWRhdGlvbi1tc2dcIn07bi5kKGUsXCJNRENTZWxlY3RIZWxwZXJUZXh0Rm91bmRhdGlvblwiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIHM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXtyZXR1cm4gdC5jYWxsKHRoaXMsaS5hKHt9LGUuZGVmYXVsdEFkYXB0ZXIsbikpfHx0aGlzfXJldHVybiBpLmIoZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzdHJpbmdzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiByfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2FkZENsYXNzOmZ1bmN0aW9uKCl7fSxyZW1vdmVDbGFzczpmdW5jdGlvbigpe30saGFzQ2xhc3M6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sc2V0QXR0cjpmdW5jdGlvbigpe30scmVtb3ZlQXR0cjpmdW5jdGlvbigpe30sc2V0Q29udGVudDpmdW5jdGlvbigpe319fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnNldENvbnRlbnQ9ZnVuY3Rpb24odCl7dGhpcy5hZGFwdGVyXy5zZXRDb250ZW50KHQpfSxlLnByb3RvdHlwZS5zZXRQZXJzaXN0ZW50PWZ1bmN0aW9uKHQpe3Q/dGhpcy5hZGFwdGVyXy5hZGRDbGFzcyhhLkhFTFBFUl9URVhUX1BFUlNJU1RFTlQpOnRoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoYS5IRUxQRVJfVEVYVF9QRVJTSVNURU5UKX0sZS5wcm90b3R5cGUuc2V0VmFsaWRhdGlvbj1mdW5jdGlvbih0KXt0P3RoaXMuYWRhcHRlcl8uYWRkQ2xhc3MoYS5IRUxQRVJfVEVYVF9WQUxJREFUSU9OX01TRyk6dGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyhhLkhFTFBFUl9URVhUX1ZBTElEQVRJT05fTVNHKX0sZS5wcm90b3R5cGUuc2hvd1RvU2NyZWVuUmVhZGVyPWZ1bmN0aW9uKCl7dGhpcy5hZGFwdGVyXy5yZW1vdmVBdHRyKHIuQVJJQV9ISURERU4pfSxlLnByb3RvdHlwZS5zZXRWYWxpZGl0eT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmFkYXB0ZXJfLmhhc0NsYXNzKGEuSEVMUEVSX1RFWFRfUEVSU0lTVEVOVCksbj10aGlzLmFkYXB0ZXJfLmhhc0NsYXNzKGEuSEVMUEVSX1RFWFRfVkFMSURBVElPTl9NU0cpJiYhdDtuP3RoaXMuYWRhcHRlcl8uc2V0QXR0cihyLlJPTEUsXCJhbGVydFwiKTp0aGlzLmFkYXB0ZXJfLnJlbW92ZUF0dHIoci5ST0xFKSxlfHxufHx0aGlzLmhpZGVfKCl9LGUucHJvdG90eXBlLmhpZGVfPWZ1bmN0aW9uKCl7dGhpcy5hZGFwdGVyXy5zZXRBdHRyKHIuQVJJQV9ISURERU4sXCJ0cnVlXCIpfSxlfShvLmEpO2UuZGVmYXVsdD1zfSwxNzE6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24ucihlKTt2YXIgaT1uKDkpLG89bigxMykscj17SUNPTl9FVkVOVDpcIk1EQ1NlbGVjdDppY29uXCIsSUNPTl9ST0xFOlwiYnV0dG9uXCJ9O24uZChlLFwiTURDU2VsZWN0SWNvbkZvdW5kYXRpb25cIixmdW5jdGlvbigpe3JldHVybiBzfSk7XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cbnZhciBhPVtcImNsaWNrXCIsXCJrZXlkb3duXCJdLHM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXt2YXIgbz10LmNhbGwodGhpcyxpLmEoe30sZS5kZWZhdWx0QWRhcHRlcixuKSl8fHRoaXM7cmV0dXJuIG8uc2F2ZWRUYWJJbmRleF89bnVsbCxvLmludGVyYWN0aW9uSGFuZGxlcl89ZnVuY3Rpb24odCl7cmV0dXJuIG8uaGFuZGxlSW50ZXJhY3Rpb24odCl9LG99cmV0dXJuIGkuYihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwic3RyaW5nc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcn0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybntnZXRBdHRyOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LHNldEF0dHI6ZnVuY3Rpb24oKXt9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oKXt9LHNldENvbnRlbnQ6ZnVuY3Rpb24oKXt9LHJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxkZXJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxub3RpZnlJY29uQWN0aW9uOmZ1bmN0aW9uKCl7fX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5zYXZlZFRhYkluZGV4Xz10aGlzLmFkYXB0ZXJfLmdldEF0dHIoXCJ0YWJpbmRleFwiKSxhLmZvckVhY2goZnVuY3Rpb24oZSl7dC5hZGFwdGVyXy5yZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcihlLHQuaW50ZXJhY3Rpb25IYW5kbGVyXyl9KX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7YS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuYWRhcHRlcl8uZGVyZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcihlLHQuaW50ZXJhY3Rpb25IYW5kbGVyXyl9KX0sZS5wcm90b3R5cGUuc2V0RGlzYWJsZWQ9ZnVuY3Rpb24odCl7dGhpcy5zYXZlZFRhYkluZGV4XyYmKHQ/KHRoaXMuYWRhcHRlcl8uc2V0QXR0cihcInRhYmluZGV4XCIsXCItMVwiKSx0aGlzLmFkYXB0ZXJfLnJlbW92ZUF0dHIoXCJyb2xlXCIpKToodGhpcy5hZGFwdGVyXy5zZXRBdHRyKFwidGFiaW5kZXhcIix0aGlzLnNhdmVkVGFiSW5kZXhfKSx0aGlzLmFkYXB0ZXJfLnNldEF0dHIoXCJyb2xlXCIsci5JQ09OX1JPTEUpKSl9LGUucHJvdG90eXBlLnNldEFyaWFMYWJlbD1mdW5jdGlvbih0KXt0aGlzLmFkYXB0ZXJfLnNldEF0dHIoXCJhcmlhLWxhYmVsXCIsdCl9LGUucHJvdG90eXBlLnNldENvbnRlbnQ9ZnVuY3Rpb24odCl7dGhpcy5hZGFwdGVyXy5zZXRDb250ZW50KHQpfSxlLnByb3RvdHlwZS5oYW5kbGVJbnRlcmFjdGlvbj1mdW5jdGlvbih0KXt2YXIgZT1cIkVudGVyXCI9PT10LmtleXx8MTM9PT10LmtleUNvZGU7KFwiY2xpY2tcIj09PXQudHlwZXx8ZSkmJnRoaXMuYWRhcHRlcl8ubm90aWZ5SWNvbkFjdGlvbigpfSxlfShvLmEpO2UuZGVmYXVsdD1zfSwxNzQ6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24ucihlKTt2YXIgaSxvLHI9big5KSxhPW4oMTMpLHM9e0FOQ0hPUjpcIm1kYy1tZW51LXN1cmZhY2UtLWFuY2hvclwiLEFOSU1BVElOR19DTE9TRUQ6XCJtZGMtbWVudS1zdXJmYWNlLS1hbmltYXRpbmctY2xvc2VkXCIsQU5JTUFUSU5HX09QRU46XCJtZGMtbWVudS1zdXJmYWNlLS1hbmltYXRpbmctb3BlblwiLEZJWEVEOlwibWRjLW1lbnUtc3VyZmFjZS0tZml4ZWRcIixPUEVOOlwibWRjLW1lbnUtc3VyZmFjZS0tb3BlblwiLFJPT1Q6XCJtZGMtbWVudS1zdXJmYWNlXCJ9LHU9e0NMT1NFRF9FVkVOVDpcIk1EQ01lbnVTdXJmYWNlOmNsb3NlZFwiLE9QRU5FRF9FVkVOVDpcIk1EQ01lbnVTdXJmYWNlOm9wZW5lZFwiLEZPQ1VTQUJMRV9FTEVNRU5UUzpbXCJidXR0b246bm90KDpkaXNhYmxlZClcIiwnW2hyZWZdOm5vdChbYXJpYS1kaXNhYmxlZD1cInRydWVcIl0pJyxcImlucHV0Om5vdCg6ZGlzYWJsZWQpXCIsXCJzZWxlY3Q6bm90KDpkaXNhYmxlZClcIixcInRleHRhcmVhOm5vdCg6ZGlzYWJsZWQpXCIsJ1t0YWJpbmRleF06bm90KFt0YWJpbmRleD1cIi0xXCJdKTpub3QoW2FyaWEtZGlzYWJsZWQ9XCJ0cnVlXCJdKSddLmpvaW4oXCIsIFwiKX0sbD17VFJBTlNJVElPTl9PUEVOX0RVUkFUSU9OOjEyMCxUUkFOU0lUSU9OX0NMT1NFX0RVUkFUSU9OOjc1LE1BUkdJTl9UT19FREdFOjMyLEFOQ0hPUl9UT19NRU5VX1NVUkZBQ0VfV0lEVEhfUkFUSU86LjY3fTshZnVuY3Rpb24odCl7dFt0LkJPVFRPTT0xXT1cIkJPVFRPTVwiLHRbdC5DRU5URVI9Ml09XCJDRU5URVJcIix0W3QuUklHSFQ9NF09XCJSSUdIVFwiLHRbdC5GTElQX1JUTD04XT1cIkZMSVBfUlRMXCJ9KGl8fChpPXt9KSksZnVuY3Rpb24odCl7dFt0LlRPUF9MRUZUPTBdPVwiVE9QX0xFRlRcIix0W3QuVE9QX1JJR0hUPTRdPVwiVE9QX1JJR0hUXCIsdFt0LkJPVFRPTV9MRUZUPTFdPVwiQk9UVE9NX0xFRlRcIix0W3QuQk9UVE9NX1JJR0hUPTVdPVwiQk9UVE9NX1JJR0hUXCIsdFt0LlRPUF9TVEFSVD04XT1cIlRPUF9TVEFSVFwiLHRbdC5UT1BfRU5EPTEyXT1cIlRPUF9FTkRcIix0W3QuQk9UVE9NX1NUQVJUPTldPVwiQk9UVE9NX1NUQVJUXCIsdFt0LkJPVFRPTV9FTkQ9MTNdPVwiQk9UVE9NX0VORFwifShvfHwobz17fSkpLG4uZChlLFwiTURDTWVudVN1cmZhY2VGb3VuZGF0aW9uXCIsZnVuY3Rpb24oKXtyZXR1cm4gY30pO1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG52YXIgYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciBpPXQuY2FsbCh0aGlzLHIuYSh7fSxlLmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpcztyZXR1cm4gaS5pc09wZW5fPSExLGkuaXNRdWlja09wZW5fPSExLGkuaXNIb2lzdGVkRWxlbWVudF89ITEsaS5pc0ZpeGVkUG9zaXRpb25fPSExLGkub3BlbkFuaW1hdGlvbkVuZFRpbWVySWRfPTAsaS5jbG9zZUFuaW1hdGlvbkVuZFRpbWVySWRfPTAsaS5hbmltYXRpb25SZXF1ZXN0SWRfPTAsaS5hbmNob3JDb3JuZXJfPW8uVE9QX1NUQVJULGkuYW5jaG9yTWFyZ2luXz17dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjB9LGkucG9zaXRpb25fPXt4OjAseTowfSxpfXJldHVybiByLmIoZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHN9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzdHJpbmdzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB1fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwibnVtYmVyc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIkNvcm5lclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybnthZGRDbGFzczpmdW5jdGlvbigpe30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oKXt9LGhhc0NsYXNzOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGhhc0FuY2hvcjpmdW5jdGlvbigpe3JldHVybiExfSxpc0VsZW1lbnRJbkNvbnRhaW5lcjpmdW5jdGlvbigpe3JldHVybiExfSxpc0ZvY3VzZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saXNGaXJzdEVsZW1lbnRGb2N1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGlzTGFzdEVsZW1lbnRGb2N1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGlzUnRsOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGdldElubmVyRGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybntoZWlnaHQ6MCx3aWR0aDowfX0sZ2V0QW5jaG9yRGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybiBudWxsfSxnZXRXaW5kb3dEaW1lbnNpb25zOmZ1bmN0aW9uKCl7cmV0dXJue2hlaWdodDowLHdpZHRoOjB9fSxnZXRCb2R5RGltZW5zaW9uczpmdW5jdGlvbigpe3JldHVybntoZWlnaHQ6MCx3aWR0aDowfX0sZ2V0V2luZG93U2Nyb2xsOmZ1bmN0aW9uKCl7cmV0dXJue3g6MCx5OjB9fSxzZXRQb3NpdGlvbjpmdW5jdGlvbigpe30sc2V0TWF4SGVpZ2h0OmZ1bmN0aW9uKCl7fSxzZXRUcmFuc2Zvcm1PcmlnaW46ZnVuY3Rpb24oKXt9LHNhdmVGb2N1czpmdW5jdGlvbigpe30scmVzdG9yZUZvY3VzOmZ1bmN0aW9uKCl7fSxmb2N1c0ZpcnN0RWxlbWVudDpmdW5jdGlvbigpe30sZm9jdXNMYXN0RWxlbWVudDpmdW5jdGlvbigpe30sbm90aWZ5Q2xvc2U6ZnVuY3Rpb24oKXt9LG5vdGlmeU9wZW46ZnVuY3Rpb24oKXt9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dmFyIHQ9ZS5jc3NDbGFzc2VzLG49dC5ST09ULGk9dC5PUEVOO2lmKCF0aGlzLmFkYXB0ZXJfLmhhc0NsYXNzKG4pKXRocm93IG5ldyBFcnJvcihuK1wiIGNsYXNzIHJlcXVpcmVkIGluIHJvb3QgZWxlbWVudC5cIik7dGhpcy5hZGFwdGVyXy5oYXNDbGFzcyhpKSYmKHRoaXMuaXNPcGVuXz0hMCl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodGhpcy5vcGVuQW5pbWF0aW9uRW5kVGltZXJJZF8pLGNsZWFyVGltZW91dCh0aGlzLmNsb3NlQW5pbWF0aW9uRW5kVGltZXJJZF8pLGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uUmVxdWVzdElkXyl9LGUucHJvdG90eXBlLnNldEFuY2hvckNvcm5lcj1mdW5jdGlvbih0KXt0aGlzLmFuY2hvckNvcm5lcl89dH0sZS5wcm90b3R5cGUuc2V0QW5jaG9yTWFyZ2luPWZ1bmN0aW9uKHQpe3RoaXMuYW5jaG9yTWFyZ2luXy50b3A9dC50b3B8fDAsdGhpcy5hbmNob3JNYXJnaW5fLnJpZ2h0PXQucmlnaHR8fDAsdGhpcy5hbmNob3JNYXJnaW5fLmJvdHRvbT10LmJvdHRvbXx8MCx0aGlzLmFuY2hvck1hcmdpbl8ubGVmdD10LmxlZnR8fDB9LGUucHJvdG90eXBlLnNldElzSG9pc3RlZD1mdW5jdGlvbih0KXt0aGlzLmlzSG9pc3RlZEVsZW1lbnRfPXR9LGUucHJvdG90eXBlLnNldEZpeGVkUG9zaXRpb249ZnVuY3Rpb24odCl7dGhpcy5pc0ZpeGVkUG9zaXRpb25fPXR9LGUucHJvdG90eXBlLnNldEFic29sdXRlUG9zaXRpb249ZnVuY3Rpb24odCxlKXt0aGlzLnBvc2l0aW9uXy54PXRoaXMuaXNGaW5pdGVfKHQpP3Q6MCx0aGlzLnBvc2l0aW9uXy55PXRoaXMuaXNGaW5pdGVfKGUpP2U6MH0sZS5wcm90b3R5cGUuc2V0UXVpY2tPcGVuPWZ1bmN0aW9uKHQpe3RoaXMuaXNRdWlja09wZW5fPXR9LGUucHJvdG90eXBlLmlzT3Blbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzT3Blbl99LGUucHJvdG90eXBlLm9wZW49ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuYWRhcHRlcl8uc2F2ZUZvY3VzKCksdGhpcy5pc1F1aWNrT3Blbl98fHRoaXMuYWRhcHRlcl8uYWRkQ2xhc3MoZS5jc3NDbGFzc2VzLkFOSU1BVElOR19PUEVOKSx0aGlzLmFuaW1hdGlvblJlcXVlc3RJZF89cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7dC5hZGFwdGVyXy5hZGRDbGFzcyhlLmNzc0NsYXNzZXMuT1BFTiksdC5kaW1lbnNpb25zXz10LmFkYXB0ZXJfLmdldElubmVyRGltZW5zaW9ucygpLHQuYXV0b1Bvc2l0aW9uXygpLHQuaXNRdWlja09wZW5fP3QuYWRhcHRlcl8ubm90aWZ5T3BlbigpOnQub3BlbkFuaW1hdGlvbkVuZFRpbWVySWRfPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0Lm9wZW5BbmltYXRpb25FbmRUaW1lcklkXz0wLHQuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoZS5jc3NDbGFzc2VzLkFOSU1BVElOR19PUEVOKSx0LmFkYXB0ZXJfLm5vdGlmeU9wZW4oKX0sbC5UUkFOU0lUSU9OX09QRU5fRFVSQVRJT04pfSksdGhpcy5pc09wZW5fPSEwfSxlLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5pc1F1aWNrT3Blbl98fHRoaXMuYWRhcHRlcl8uYWRkQ2xhc3MoZS5jc3NDbGFzc2VzLkFOSU1BVElOR19DTE9TRUQpLHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3QuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoZS5jc3NDbGFzc2VzLk9QRU4pLHQuaXNRdWlja09wZW5fP3QuYWRhcHRlcl8ubm90aWZ5Q2xvc2UoKTp0LmNsb3NlQW5pbWF0aW9uRW5kVGltZXJJZF89c2V0VGltZW91dChmdW5jdGlvbigpe3QuY2xvc2VBbmltYXRpb25FbmRUaW1lcklkXz0wLHQuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoZS5jc3NDbGFzc2VzLkFOSU1BVElOR19DTE9TRUQpLHQuYWRhcHRlcl8ubm90aWZ5Q2xvc2UoKX0sbC5UUkFOU0lUSU9OX0NMT1NFX0RVUkFUSU9OKX0pLHRoaXMuaXNPcGVuXz0hMSx0aGlzLm1heWJlUmVzdG9yZUZvY3VzXygpfSxlLnByb3RvdHlwZS5oYW5kbGVCb2R5Q2xpY2s9ZnVuY3Rpb24odCl7dmFyIGU9dC50YXJnZXQ7dGhpcy5hZGFwdGVyXy5pc0VsZW1lbnRJbkNvbnRhaW5lcihlKXx8dGhpcy5jbG9zZSgpfSxlLnByb3RvdHlwZS5oYW5kbGVLZXlkb3duPWZ1bmN0aW9uKHQpe3ZhciBlPXQua2V5Q29kZSxuPXQua2V5LGk9dC5zaGlmdEtleSxvPVwiVGFiXCI9PT1ufHw5PT09ZTtcIkVzY2FwZVwiPT09bnx8Mjc9PT1lP3RoaXMuY2xvc2UoKTpvJiYodGhpcy5hZGFwdGVyXy5pc0xhc3RFbGVtZW50Rm9jdXNlZCgpJiYhaT8odGhpcy5hZGFwdGVyXy5mb2N1c0ZpcnN0RWxlbWVudCgpLHQucHJldmVudERlZmF1bHQoKSk6dGhpcy5hZGFwdGVyXy5pc0ZpcnN0RWxlbWVudEZvY3VzZWQoKSYmaSYmKHRoaXMuYWRhcHRlcl8uZm9jdXNMYXN0RWxlbWVudCgpLHQucHJldmVudERlZmF1bHQoKSkpfSxlLnByb3RvdHlwZS5hdXRvUG9zaXRpb25fPWZ1bmN0aW9uKCl7dmFyIHQ7dGhpcy5tZWFzdXJlbWVudHNfPXRoaXMuZ2V0QXV0b0xheW91dE1lYXN1cmVtZW50c18oKTt2YXIgZT10aGlzLmdldE9yaWdpbkNvcm5lcl8oKSxuPXRoaXMuZ2V0TWVudVN1cmZhY2VNYXhIZWlnaHRfKGUpLG89dGhpcy5oYXNCaXRfKGUsaS5CT1RUT00pP1wiYm90dG9tXCI6XCJ0b3BcIixyPXRoaXMuaGFzQml0XyhlLGkuUklHSFQpP1wicmlnaHRcIjpcImxlZnRcIixhPXRoaXMuZ2V0SG9yaXpvbnRhbE9yaWdpbk9mZnNldF8oZSkscz10aGlzLmdldFZlcnRpY2FsT3JpZ2luT2Zmc2V0XyhlKSx1PXRoaXMubWVhc3VyZW1lbnRzXyxjPXUuYW5jaG9yU2l6ZSxkPXUuc3VyZmFjZVNpemUscD0oKHQ9e30pW3JdPWEsdFtvXT1zLHQpO2Mud2lkdGgvZC53aWR0aD5sLkFOQ0hPUl9UT19NRU5VX1NVUkZBQ0VfV0lEVEhfUkFUSU8mJihyPVwiY2VudGVyXCIpLCh0aGlzLmlzSG9pc3RlZEVsZW1lbnRffHx0aGlzLmlzRml4ZWRQb3NpdGlvbl8pJiZ0aGlzLmFkanVzdFBvc2l0aW9uRm9ySG9pc3RlZEVsZW1lbnRfKHApLHRoaXMuYWRhcHRlcl8uc2V0VHJhbnNmb3JtT3JpZ2luKHIrXCIgXCIrbyksdGhpcy5hZGFwdGVyXy5zZXRQb3NpdGlvbihwKSx0aGlzLmFkYXB0ZXJfLnNldE1heEhlaWdodChuP24rXCJweFwiOlwiXCIpfSxlLnByb3RvdHlwZS5nZXRBdXRvTGF5b3V0TWVhc3VyZW1lbnRzXz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYWRhcHRlcl8uZ2V0QW5jaG9yRGltZW5zaW9ucygpLGU9dGhpcy5hZGFwdGVyXy5nZXRCb2R5RGltZW5zaW9ucygpLG49dGhpcy5hZGFwdGVyXy5nZXRXaW5kb3dEaW1lbnNpb25zKCksaT10aGlzLmFkYXB0ZXJfLmdldFdpbmRvd1Njcm9sbCgpO3JldHVybiB0fHwodD17dG9wOnRoaXMucG9zaXRpb25fLnkscmlnaHQ6dGhpcy5wb3NpdGlvbl8ueCxib3R0b206dGhpcy5wb3NpdGlvbl8ueSxsZWZ0OnRoaXMucG9zaXRpb25fLngsd2lkdGg6MCxoZWlnaHQ6MH0pLHthbmNob3JTaXplOnQsYm9keVNpemU6ZSxzdXJmYWNlU2l6ZTp0aGlzLmRpbWVuc2lvbnNfLHZpZXdwb3J0RGlzdGFuY2U6e3RvcDp0LnRvcCxyaWdodDpuLndpZHRoLXQucmlnaHQsYm90dG9tOm4uaGVpZ2h0LXQuYm90dG9tLGxlZnQ6dC5sZWZ0fSx2aWV3cG9ydFNpemU6bix3aW5kb3dTY3JvbGw6aX19LGUucHJvdG90eXBlLmdldE9yaWdpbkNvcm5lcl89ZnVuY3Rpb24oKXt2YXIgdD1vLlRPUF9MRUZULGU9dGhpcy5tZWFzdXJlbWVudHNfLG49ZS52aWV3cG9ydERpc3RhbmNlLHI9ZS5hbmNob3JTaXplLGE9ZS5zdXJmYWNlU2l6ZSxzPXRoaXMuaGFzQml0Xyh0aGlzLmFuY2hvckNvcm5lcl8saS5CT1RUT00pLHU9cz9uLnRvcCtyLmhlaWdodCt0aGlzLmFuY2hvck1hcmdpbl8uYm90dG9tOm4udG9wK3RoaXMuYW5jaG9yTWFyZ2luXy50b3AsbD1zP24uYm90dG9tLXRoaXMuYW5jaG9yTWFyZ2luXy5ib3R0b206bi5ib3R0b20rci5oZWlnaHQtdGhpcy5hbmNob3JNYXJnaW5fLnRvcCxjPWEuaGVpZ2h0LXUsZD1hLmhlaWdodC1sO2Q+MCYmYzxkJiYodD10aGlzLnNldEJpdF8odCxpLkJPVFRPTSkpO3ZhciBwPXRoaXMuYWRhcHRlcl8uaXNSdGwoKSxmPXRoaXMuaGFzQml0Xyh0aGlzLmFuY2hvckNvcm5lcl8saS5GTElQX1JUTCksaD10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLGkuUklHSFQpLF89aCYmIXB8fCFoJiZmJiZwLG09Xz9uLmxlZnQrci53aWR0aCt0aGlzLmFuY2hvck1hcmdpbl8ucmlnaHQ6bi5sZWZ0K3RoaXMuYW5jaG9yTWFyZ2luXy5sZWZ0LHk9Xz9uLnJpZ2h0LXRoaXMuYW5jaG9yTWFyZ2luXy5yaWdodDpuLnJpZ2h0K3Iud2lkdGgtdGhpcy5hbmNob3JNYXJnaW5fLmxlZnQsTz1hLndpZHRoLW0sdj1hLndpZHRoLXk7cmV0dXJuKE88MCYmXyYmcHx8aCYmIV8mJk88MHx8dj4wJiZPPHYpJiYodD10aGlzLnNldEJpdF8odCxpLlJJR0hUKSksdH0sZS5wcm90b3R5cGUuZ2V0TWVudVN1cmZhY2VNYXhIZWlnaHRfPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMubWVhc3VyZW1lbnRzXy52aWV3cG9ydERpc3RhbmNlLG89MCxyPXRoaXMuaGFzQml0Xyh0LGkuQk9UVE9NKSxhPXRoaXMuaGFzQml0Xyh0aGlzLmFuY2hvckNvcm5lcl8saS5CT1RUT00pLHM9ZS5udW1iZXJzLk1BUkdJTl9UT19FREdFO3JldHVybiByPyhvPW4udG9wK3RoaXMuYW5jaG9yTWFyZ2luXy50b3AtcyxhfHwobys9dGhpcy5tZWFzdXJlbWVudHNfLmFuY2hvclNpemUuaGVpZ2h0KSk6KG89bi5ib3R0b20tdGhpcy5hbmNob3JNYXJnaW5fLmJvdHRvbSt0aGlzLm1lYXN1cmVtZW50c18uYW5jaG9yU2l6ZS5oZWlnaHQtcyxhJiYoby09dGhpcy5tZWFzdXJlbWVudHNfLmFuY2hvclNpemUuaGVpZ2h0KSksb30sZS5wcm90b3R5cGUuZ2V0SG9yaXpvbnRhbE9yaWdpbk9mZnNldF89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5tZWFzdXJlbWVudHNfLmFuY2hvclNpemUsbj10aGlzLmhhc0JpdF8odCxpLlJJR0hUKSxvPXRoaXMuaGFzQml0Xyh0aGlzLmFuY2hvckNvcm5lcl8saS5SSUdIVCk7aWYobil7dmFyIHI9bz9lLndpZHRoLXRoaXMuYW5jaG9yTWFyZ2luXy5sZWZ0OnRoaXMuYW5jaG9yTWFyZ2luXy5yaWdodDtyZXR1cm4gdGhpcy5pc0hvaXN0ZWRFbGVtZW50X3x8dGhpcy5pc0ZpeGVkUG9zaXRpb25fP3ItKHRoaXMubWVhc3VyZW1lbnRzXy52aWV3cG9ydFNpemUud2lkdGgtdGhpcy5tZWFzdXJlbWVudHNfLmJvZHlTaXplLndpZHRoKTpyfXJldHVybiBvP2Uud2lkdGgtdGhpcy5hbmNob3JNYXJnaW5fLnJpZ2h0OnRoaXMuYW5jaG9yTWFyZ2luXy5sZWZ0fSxlLnByb3RvdHlwZS5nZXRWZXJ0aWNhbE9yaWdpbk9mZnNldF89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5tZWFzdXJlbWVudHNfLmFuY2hvclNpemUsbj10aGlzLmhhc0JpdF8odCxpLkJPVFRPTSksbz10aGlzLmhhc0JpdF8odGhpcy5hbmNob3JDb3JuZXJfLGkuQk9UVE9NKTtyZXR1cm4gbj9vP2UuaGVpZ2h0LXRoaXMuYW5jaG9yTWFyZ2luXy50b3A6LXRoaXMuYW5jaG9yTWFyZ2luXy5ib3R0b206bz9lLmhlaWdodCt0aGlzLmFuY2hvck1hcmdpbl8uYm90dG9tOnRoaXMuYW5jaG9yTWFyZ2luXy50b3B9LGUucHJvdG90eXBlLmFkanVzdFBvc2l0aW9uRm9ySG9pc3RlZEVsZW1lbnRfPWZ1bmN0aW9uKHQpe3ZhciBlLG4saT10aGlzLm1lYXN1cmVtZW50c18sbz1pLndpbmRvd1Njcm9sbCxhPWkudmlld3BvcnREaXN0YW5jZSxzPU9iamVjdC5rZXlzKHQpO3RyeXtmb3IodmFyIHU9ci5jKHMpLGw9dS5uZXh0KCk7IWwuZG9uZTtsPXUubmV4dCgpKXt2YXIgYz1sLnZhbHVlLGQ9dFtjXXx8MDtkKz1hW2NdLHRoaXMuaXNGaXhlZFBvc2l0aW9uX3x8KFwidG9wXCI9PT1jP2QrPW8ueTpcImJvdHRvbVwiPT09Yz9kLT1vLnk6XCJsZWZ0XCI9PT1jP2QrPW8ueDpkLT1vLngpLHRbY109ZH19Y2F0Y2godCl7ZT17ZXJyb3I6dH19ZmluYWxseXt0cnl7bCYmIWwuZG9uZSYmKG49dS5yZXR1cm4pJiZuLmNhbGwodSl9ZmluYWxseXtpZihlKXRocm93IGUuZXJyb3J9fX0sZS5wcm90b3R5cGUubWF5YmVSZXN0b3JlRm9jdXNfPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5hZGFwdGVyXy5pc0ZvY3VzZWQoKSxlPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQmJnRoaXMuYWRhcHRlcl8uaXNFbGVtZW50SW5Db250YWluZXIoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7KHR8fGUpJiZ0aGlzLmFkYXB0ZXJfLnJlc3RvcmVGb2N1cygpfSxlLnByb3RvdHlwZS5oYXNCaXRfPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEJvb2xlYW4odCZlKX0sZS5wcm90b3R5cGUuc2V0Qml0Xz1mdW5jdGlvbih0LGUpe3JldHVybiB0fGV9LGUucHJvdG90eXBlLmlzRmluaXRlXz1mdW5jdGlvbih0KXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgdCYmaXNGaW5pdGUodCl9LGV9KGEuYSk7ZS5kZWZhdWx0PWN9LDMzOmZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPW59LDM0OmZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWl9LDM1OmZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPW99LDM2OmZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPXJ9LDQzOmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSk7dmFyIGk9big5KSxvPW4oMTMpLHI9e0RJU0FCTEVEOlwibWRjLXNlbGVjdC0tZGlzYWJsZWRcIixGT0NVU0VEOlwibWRjLXNlbGVjdC0tZm9jdXNlZFwiLElOVkFMSUQ6XCJtZGMtc2VsZWN0LS1pbnZhbGlkXCIsT1VUTElORUQ6XCJtZGMtc2VsZWN0LS1vdXRsaW5lZFwiLFJFUVVJUkVEOlwibWRjLXNlbGVjdC0tcmVxdWlyZWRcIixST09UOlwibWRjLXNlbGVjdFwiLFNFTEVDVEVEX0lURU1fQ0xBU1M6XCJtZGMtbGlzdC1pdGVtLS1zZWxlY3RlZFwiLFdJVEhfTEVBRElOR19JQ09OOlwibWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb25cIn0sYT17QVJJQV9DT05UUk9MUzpcImFyaWEtY29udHJvbHNcIixBUklBX1NFTEVDVEVEX0FUVFI6XCJhcmlhLXNlbGVjdGVkXCIsQ0hBTkdFX0VWRU5UOlwiTURDU2VsZWN0OmNoYW5nZVwiLEVOSEFOQ0VEX1ZBTFVFX0FUVFI6XCJkYXRhLXZhbHVlXCIsSElEREVOX0lOUFVUX1NFTEVDVE9SOidpbnB1dFt0eXBlPVwiaGlkZGVuXCJdJyxMQUJFTF9TRUxFQ1RPUjpcIi5tZGMtZmxvYXRpbmctbGFiZWxcIixMRUFESU5HX0lDT05fU0VMRUNUT1I6XCIubWRjLXNlbGVjdF9faWNvblwiLExJTkVfUklQUExFX1NFTEVDVE9SOlwiLm1kYy1saW5lLXJpcHBsZVwiLE1FTlVfU0VMRUNUT1I6XCIubWRjLXNlbGVjdF9fbWVudVwiLE5BVElWRV9DT05UUk9MX1NFTEVDVE9SOlwiLm1kYy1zZWxlY3RfX25hdGl2ZS1jb250cm9sXCIsT1VUTElORV9TRUxFQ1RPUjpcIi5tZGMtbm90Y2hlZC1vdXRsaW5lXCIsU0VMRUNURURfSVRFTV9TRUxFQ1RPUjpcIi5cIityLlNFTEVDVEVEX0lURU1fQ0xBU1MsU0VMRUNURURfVEVYVF9TRUxFQ1RPUjpcIi5tZGMtc2VsZWN0X19zZWxlY3RlZC10ZXh0XCJ9LHM9e0xBQkVMX1NDQUxFOi43NX07bi5kKGUsXCJNRENTZWxlY3RGb3VuZGF0aW9uXCIsZnVuY3Rpb24oKXtyZXR1cm4gdX0pO1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG52YXIgdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4sbyl7dm9pZCAwPT09byYmKG89e30pO3ZhciByPXQuY2FsbCh0aGlzLGkuYSh7fSxlLmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpcztyZXR1cm4gci5sZWFkaW5nSWNvbl89by5sZWFkaW5nSWNvbixyLmhlbHBlclRleHRfPW8uaGVscGVyVGV4dCxyfXJldHVybiBpLmIoZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJudW1iZXJzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwic3RyaW5nc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybnthZGRDbGFzczpmdW5jdGlvbigpe30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oKXt9LGhhc0NsYXNzOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGFjdGl2YXRlQm90dG9tTGluZTpmdW5jdGlvbigpe30sZGVhY3RpdmF0ZUJvdHRvbUxpbmU6ZnVuY3Rpb24oKXt9LHNldFZhbHVlOmZ1bmN0aW9uKCl7fSxnZXRWYWx1ZTpmdW5jdGlvbigpe3JldHVyblwiXCJ9LGZsb2F0TGFiZWw6ZnVuY3Rpb24oKXt9LGdldExhYmVsV2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gMH0saGFzT3V0bGluZTpmdW5jdGlvbigpe3JldHVybiExfSxub3RjaE91dGxpbmU6ZnVuY3Rpb24oKXt9LGNsb3NlT3V0bGluZTpmdW5jdGlvbigpe30sb3Blbk1lbnU6ZnVuY3Rpb24oKXt9LGNsb3NlTWVudTpmdW5jdGlvbigpe30saXNNZW51T3BlbjpmdW5jdGlvbigpe3JldHVybiExfSxzZXRTZWxlY3RlZEluZGV4OmZ1bmN0aW9uKCl7fSxzZXREaXNhYmxlZDpmdW5jdGlvbigpe30sc2V0UmlwcGxlQ2VudGVyOmZ1bmN0aW9uKCl7fSxub3RpZnlDaGFuZ2U6ZnVuY3Rpb24oKXt9LGNoZWNrVmFsaWRpdHk6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sc2V0VmFsaWQ6ZnVuY3Rpb24oKXt9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5zZXRTZWxlY3RlZEluZGV4PWZ1bmN0aW9uKHQpe3RoaXMuYWRhcHRlcl8uc2V0U2VsZWN0ZWRJbmRleCh0KSx0aGlzLmFkYXB0ZXJfLmNsb3NlTWVudSgpO3RoaXMuaGFuZGxlQ2hhbmdlKCEwKX0sZS5wcm90b3R5cGUuc2V0VmFsdWU9ZnVuY3Rpb24odCl7dGhpcy5hZGFwdGVyXy5zZXRWYWx1ZSh0KTt0aGlzLmhhbmRsZUNoYW5nZSghMCl9LGUucHJvdG90eXBlLmdldFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRhcHRlcl8uZ2V0VmFsdWUoKX0sZS5wcm90b3R5cGUuc2V0RGlzYWJsZWQ9ZnVuY3Rpb24odCl7dD90aGlzLmFkYXB0ZXJfLmFkZENsYXNzKHIuRElTQUJMRUQpOnRoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3Moci5ESVNBQkxFRCksdGhpcy5hZGFwdGVyXy5zZXREaXNhYmxlZCh0KSx0aGlzLmFkYXB0ZXJfLmNsb3NlTWVudSgpLHRoaXMubGVhZGluZ0ljb25fJiZ0aGlzLmxlYWRpbmdJY29uXy5zZXREaXNhYmxlZCh0KX0sZS5wcm90b3R5cGUuc2V0SGVscGVyVGV4dENvbnRlbnQ9ZnVuY3Rpb24odCl7dGhpcy5oZWxwZXJUZXh0XyYmdGhpcy5oZWxwZXJUZXh0Xy5zZXRDb250ZW50KHQpfSxlLnByb3RvdHlwZS5sYXlvdXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFZhbHVlKCkubGVuZ3RoPjA7dGhpcy5ub3RjaE91dGxpbmUodCl9LGUucHJvdG90eXBlLmhhbmRsZUNoYW5nZT1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD0hMCk7dmFyIGU9dGhpcy5nZXRWYWx1ZSgpLG49ZS5sZW5ndGg+MCxpPXRoaXMuYWRhcHRlcl8uaGFzQ2xhc3Moci5SRVFVSVJFRCk7dGhpcy5ub3RjaE91dGxpbmUobiksdGhpcy5hZGFwdGVyXy5oYXNDbGFzcyhyLkZPQ1VTRUQpfHx0aGlzLmFkYXB0ZXJfLmZsb2F0TGFiZWwobiksdCYmKHRoaXMuYWRhcHRlcl8ubm90aWZ5Q2hhbmdlKGUpLGkmJih0aGlzLnNldFZhbGlkKHRoaXMuaXNWYWxpZCgpKSx0aGlzLmhlbHBlclRleHRfJiZ0aGlzLmhlbHBlclRleHRfLnNldFZhbGlkaXR5KHRoaXMuaXNWYWxpZCgpKSkpfSxlLnByb3RvdHlwZS5oYW5kbGVGb2N1cz1mdW5jdGlvbigpe3RoaXMuYWRhcHRlcl8uYWRkQ2xhc3Moci5GT0NVU0VEKSx0aGlzLmFkYXB0ZXJfLmZsb2F0TGFiZWwoITApLHRoaXMubm90Y2hPdXRsaW5lKCEwKSx0aGlzLmFkYXB0ZXJfLmFjdGl2YXRlQm90dG9tTGluZSgpLHRoaXMuaGVscGVyVGV4dF8mJnRoaXMuaGVscGVyVGV4dF8uc2hvd1RvU2NyZWVuUmVhZGVyKCl9LGUucHJvdG90eXBlLmhhbmRsZUJsdXI9ZnVuY3Rpb24oKXt0aGlzLmFkYXB0ZXJfLmlzTWVudU9wZW4oKXx8KHRoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3Moci5GT0NVU0VEKSx0aGlzLmhhbmRsZUNoYW5nZSghMSksdGhpcy5hZGFwdGVyXy5kZWFjdGl2YXRlQm90dG9tTGluZSgpLHRoaXMuYWRhcHRlcl8uaGFzQ2xhc3Moci5SRVFVSVJFRCkmJih0aGlzLnNldFZhbGlkKHRoaXMuaXNWYWxpZCgpKSx0aGlzLmhlbHBlclRleHRfJiZ0aGlzLmhlbHBlclRleHRfLnNldFZhbGlkaXR5KHRoaXMuaXNWYWxpZCgpKSkpfSxlLnByb3RvdHlwZS5oYW5kbGVDbGljaz1mdW5jdGlvbih0KXt0aGlzLmFkYXB0ZXJfLmlzTWVudU9wZW4oKXx8KHRoaXMuYWRhcHRlcl8uc2V0UmlwcGxlQ2VudGVyKHQpLHRoaXMuYWRhcHRlcl8ub3Blbk1lbnUoKSl9LGUucHJvdG90eXBlLmhhbmRsZUtleWRvd249ZnVuY3Rpb24odCl7aWYoIXRoaXMuYWRhcHRlcl8uaXNNZW51T3BlbigpKXt2YXIgZT1cIkVudGVyXCI9PT10LmtleXx8MTM9PT10LmtleUNvZGUsbj1cIlNwYWNlXCI9PT10LmtleXx8MzI9PT10LmtleUNvZGUsaT1cIkFycm93VXBcIj09PXQua2V5fHwzOD09PXQua2V5Q29kZSxvPVwiQXJyb3dEb3duXCI9PT10LmtleXx8NDA9PT10LmtleUNvZGU7dGhpcy5hZGFwdGVyXy5oYXNDbGFzcyhyLkZPQ1VTRUQpJiYoZXx8bnx8aXx8bykmJih0aGlzLmFkYXB0ZXJfLm9wZW5NZW51KCksdC5wcmV2ZW50RGVmYXVsdCgpKX19LGUucHJvdG90eXBlLm5vdGNoT3V0bGluZT1mdW5jdGlvbih0KXtpZih0aGlzLmFkYXB0ZXJfLmhhc091dGxpbmUoKSl7dmFyIGU9dGhpcy5hZGFwdGVyXy5oYXNDbGFzcyhyLkZPQ1VTRUQpO2lmKHQpe3ZhciBuPXMuTEFCRUxfU0NBTEUsaT10aGlzLmFkYXB0ZXJfLmdldExhYmVsV2lkdGgoKSpuO3RoaXMuYWRhcHRlcl8ubm90Y2hPdXRsaW5lKGkpfWVsc2UgZXx8dGhpcy5hZGFwdGVyXy5jbG9zZU91dGxpbmUoKX19LGUucHJvdG90eXBlLnNldExlYWRpbmdJY29uQXJpYUxhYmVsPWZ1bmN0aW9uKHQpe3RoaXMubGVhZGluZ0ljb25fJiZ0aGlzLmxlYWRpbmdJY29uXy5zZXRBcmlhTGFiZWwodCl9LGUucHJvdG90eXBlLnNldExlYWRpbmdJY29uQ29udGVudD1mdW5jdGlvbih0KXt0aGlzLmxlYWRpbmdJY29uXyYmdGhpcy5sZWFkaW5nSWNvbl8uc2V0Q29udGVudCh0KX0sZS5wcm90b3R5cGUuc2V0VmFsaWQ9ZnVuY3Rpb24odCl7dGhpcy5hZGFwdGVyXy5zZXRWYWxpZCh0KX0sZS5wcm90b3R5cGUuaXNWYWxpZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFkYXB0ZXJfLmNoZWNrVmFsaWRpdHkoKX0sZX0oby5hKTtlLmRlZmF1bHQ9dX0sOTpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5kKGUsXCJiXCIsZnVuY3Rpb24oKXtyZXR1cm4gb30pLG4uZChlLFwiYVwiLGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KSxuLmQoZSxcImNcIixmdW5jdGlvbigpe3JldHVybiBhfSk7XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3I7XG4vKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXG50aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZVxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcbk1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuXG5cblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xuYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi92YXIgaT1mdW5jdGlvbih0LGUpe3JldHVybihpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSkodCxlKX07ZnVuY3Rpb24gbyh0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX12YXIgcj1mdW5jdGlvbigpe3JldHVybihyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTEsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspZm9yKHZhciBvIGluIGU9YXJndW1lbnRzW25dKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG8pJiYodFtvXT1lW29dKTtyZXR1cm4gdH0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07ZnVuY3Rpb24gYSh0KXt2YXIgZT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJnRbU3ltYm9sLml0ZXJhdG9yXSxuPTA7cmV0dXJuIGU/ZS5jYWxsKHQpOntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIHQmJm4+PXQubGVuZ3RoJiYodD12b2lkIDApLHt2YWx1ZTp0JiZ0W24rK10sZG9uZTohdH19fX19fSl9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlbGVjdC5qcy5tYXAiLCJcbnZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NlbGVjdC5jc3NcIik7XG5cbmlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXG52YXIgdHJhbnNmb3JtO1xudmFyIGluc2VydEludG87XG5cblxuXG52YXIgb3B0aW9ucyA9IHtcImhtclwiOnRydWV9XG5cbm9wdGlvbnMudHJhbnNmb3JtID0gdHJhbnNmb3JtXG5vcHRpb25zLmluc2VydEludG8gPSB1bmRlZmluZWQ7XG5cbnZhciB1cGRhdGUgPSByZXF1aXJlKFwiIS4uLy4uLy4uL3N0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzLmpzXCIpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5pZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2FscztcblxuaWYobW9kdWxlLmhvdCkge1xuXHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NlbGVjdC5jc3NcIiwgZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc2VsZWN0LmNzc1wiKTtcblxuXHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXG5cdFx0dmFyIGxvY2FscyA9IChmdW5jdGlvbihhLCBiKSB7XG5cdFx0XHR2YXIga2V5LCBpZHggPSAwO1xuXG5cdFx0XHRmb3Ioa2V5IGluIGEpIHtcblx0XHRcdFx0aWYoIWIgfHwgYVtrZXldICE9PSBiW2tleV0pIHJldHVybiBmYWxzZTtcblx0XHRcdFx0aWR4Kys7XG5cdFx0XHR9XG5cblx0XHRcdGZvcihrZXkgaW4gYikgaWR4LS07XG5cblx0XHRcdHJldHVybiBpZHggPT09IDA7XG5cdFx0fShjb250ZW50LmxvY2FscywgbmV3Q29udGVudC5sb2NhbHMpKTtcblxuXHRcdGlmKCFsb2NhbHMpIHRocm93IG5ldyBFcnJvcignQWJvcnRpbmcgQ1NTIEhNUiBkdWUgdG8gY2hhbmdlZCBjc3MtbW9kdWxlcyBsb2NhbHMuJyk7XG5cblx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdH0pO1xuXG5cdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xufSIsIiFmdW5jdGlvbih0LGUpe2lmKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPWUocmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpLHJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtZmxvYXRpbmctbGFiZWwvZGlzdC9pbmRleC5qc1wiKSxyZXF1aXJlKFwiQG1hdGVyaWFsL3JlYWN0LWxpbmUtcmlwcGxlL2Rpc3QvaW5kZXguanNcIikscmVxdWlyZShcIkBtYXRlcmlhbC9yZWFjdC1ub3RjaGVkLW91dGxpbmUvZGlzdC9pbmRleC5qc1wiKSk7ZWxzZSBpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQpZGVmaW5lKFtcInJlYWN0XCIsXCJjbGFzc25hbWVzXCIsXCJAbWF0ZXJpYWwvcmVhY3QtZmxvYXRpbmctbGFiZWwvZGlzdC9pbmRleC5qc1wiLFwiQG1hdGVyaWFsL3JlYWN0LWxpbmUtcmlwcGxlL2Rpc3QvaW5kZXguanNcIixcIkBtYXRlcmlhbC9yZWFjdC1ub3RjaGVkLW91dGxpbmUvZGlzdC9pbmRleC5qc1wiXSxlKTtlbHNle3ZhciBuPVwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2UocmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpLHJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtZmxvYXRpbmctbGFiZWwvZGlzdC9pbmRleC5qc1wiKSxyZXF1aXJlKFwiQG1hdGVyaWFsL3JlYWN0LWxpbmUtcmlwcGxlL2Rpc3QvaW5kZXguanNcIikscmVxdWlyZShcIkBtYXRlcmlhbC9yZWFjdC1ub3RjaGVkLW91dGxpbmUvZGlzdC9pbmRleC5qc1wiKSk6ZSh0LnJlYWN0LHQuY2xhc3NuYW1lcyx0W1wiQG1hdGVyaWFsL3JlYWN0LWZsb2F0aW5nLWxhYmVsL2Rpc3QvaW5kZXguanNcIl0sdFtcIkBtYXRlcmlhbC9yZWFjdC1saW5lLXJpcHBsZS9kaXN0L2luZGV4LmpzXCJdLHRbXCJAbWF0ZXJpYWwvcmVhY3Qtbm90Y2hlZC1vdXRsaW5lL2Rpc3QvaW5kZXguanNcIl0pO2Zvcih2YXIgaSBpbiBuKShcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnQpW2ldPW5baV19fShcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZj9zZWxmOnRoaXMsZnVuY3Rpb24odCxlLG4saSxyKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9e307ZnVuY3Rpb24gbihpKXtpZihlW2ldKXJldHVybiBlW2ldLmV4cG9ydHM7dmFyIHI9ZVtpXT17aTppLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIHRbaV0uY2FsbChyLmV4cG9ydHMscixyLmV4cG9ydHMsbiksci5sPSEwLHIuZXhwb3J0c31yZXR1cm4gbi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxpKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6aX0pfSxuLnI9ZnVuY3Rpb24odCl7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOlwiTW9kdWxlXCJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiZcIm9iamVjdFwiPT10eXBlb2YgdCYmdCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCk7aWYobi5yKGkpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLFwiZGVmYXVsdFwiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KSwyJmUmJlwic3RyaW5nXCIhPXR5cGVvZiB0KWZvcih2YXIgciBpbiB0KW4uZChpLHIsZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxyKSk7cmV0dXJuIGl9LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsXCJhXCIsZSksZX0sbi5vPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfSxuLnA9XCJcIixuKG4ucz0xMzIpfSh7MDpmdW5jdGlvbihlLG4pe2UuZXhwb3J0cz10fSwxOmZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWV9LDEwOmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImJcIixmdW5jdGlvbigpe3JldHVybiByfSksbi5kKGUsXCJhXCIsZnVuY3Rpb24oKXtyZXR1cm4gYX0pO1wiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yO1xuLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxuXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovdmFyIGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4oaT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX0pKHQsZSl9O2Z1bmN0aW9uIHIodCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9dmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4oYT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgciBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmKHRbcl09ZVtyXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSwxMzI6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9KSh0LGUpfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLGE9dGhpcyYmdGhpcy5fX2Fzc2lnbnx8ZnVuY3Rpb24oKXtyZXR1cm4oYT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgciBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmKHRbcl09ZVtyXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG89dGhpcyYmdGhpcy5fX3Jlc3R8fGZ1bmN0aW9uKHQsZSl7dmFyIG49e307Zm9yKHZhciBpIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsaSkmJmUuaW5kZXhPZihpKTwwJiYobltpXT10W2ldKTtpZihudWxsIT10JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj0wO2ZvcihpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7cjxpLmxlbmd0aDtyKyspZS5pbmRleE9mKGlbcl0pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LGlbcl0pJiYobltpW3JdXT10W2lbcl1dKX1yZXR1cm4gbn0scz10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbD1zKG4oMCkpLHU9cyhuKDEpKSxkPW4oMTY0KSxjPXMobigxMzMpKTtlLklucHV0PWMuZGVmYXVsdDt2YXIgcD1zKG4oMTM0KSk7ZS5JY29uPXAuZGVmYXVsdDt2YXIgZj1zKG4oMTM1KSk7ZS5IZWxwZXJUZXh0PWYuZGVmYXVsdDt2YXIgaD1zKG4oMTM2KSk7ZS5DaGFyYWN0ZXJDb3VudGVyPWguZGVmYXVsdDt2YXIgYj1zKG4oMzMpKSxfPXMobigzNCkpLGc9cyhuKDM1KSkseT1kLk1EQ1RleHRGaWVsZEZvdW5kYXRpb24uY3NzQ2xhc3NlcyxtPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG4saT10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gaS50ZXh0RmllbGRFbGVtZW50PWwuZGVmYXVsdC5jcmVhdGVSZWYoKSxpLmZsb2F0aW5nTGFiZWxFbGVtZW50PWwuZGVmYXVsdC5jcmVhdGVSZWYoKSxpLmlucHV0Q29tcG9uZW50Xz1udWxsLGUuY2hpbGRyZW4mJmwuZGVmYXVsdC5DaGlsZHJlbi5vbmx5KGUuY2hpbGRyZW4pJiYobj1lLmNoaWxkcmVuLnByb3BzLmlkKSxpLnN0YXRlPXtjbGFzc0xpc3Q6bmV3IFNldCxpbnB1dElkOm4saXNGb2N1c2VkOiExLGRpcjpcImx0clwiLGRpc2FibGVkOiExLGxhYmVsSXNGbG9hdGVkOiExLGluaXRpYWxMYWJlbFdpZHRoOjAsbm90Y2hlZExhYmVsV2lkdGg6MCxhY3RpdmVMaW5lUmlwcGxlOiExLGxpbmVSaXBwbGVDZW50ZXI6MCxvdXRsaW5lSXNOb3RjaGVkOiExLGlzVmFsaWQ6ITAsZm91bmRhdGlvbjp2b2lkIDB9LGl9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3ZhciB0PW5ldyBkLk1EQ1RleHRGaWVsZEZvdW5kYXRpb24odGhpcy5hZGFwdGVyKTt0aGlzLnNldFN0YXRlKHtmb3VuZGF0aW9uOnR9KSx0LmluaXQoKX0sZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLnN0YXRlLmZvdW5kYXRpb24mJnRoaXMuc3RhdGUuZm91bmRhdGlvbi5kZXN0cm95KCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImNsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLnN0YXRlLG49ZS5jbGFzc0xpc3QsaT1lLmRpc2FibGVkLHI9ZS5pc0ZvY3VzZWQsYT1lLmlzVmFsaWQsbz10aGlzLnByb3BzLHM9by5jbGFzc05hbWUsbD1vLmRlbnNlLGQ9by5mdWxsV2lkdGgsYz1vLnRleHRhcmVhLHA9by50cmFpbGluZ0ljb24sZj1vLmxlYWRpbmdJY29uLGg9by5ub0xhYmVsO3JldHVybiB1LmRlZmF1bHQoeS5ST09ULEFycmF5LmZyb20obikscywoKHQ9e30pW3kuREVOU0VdPWwsdFt5LkRJU0FCTEVEXT1pLHRbeS5GT0NVU0VEXT1yLHRbeS5JTlZBTElEXT0hYSx0W3kuT1VUTElORURdPXRoaXMubm90Y2hlZE91dGxpbmVBZGFwdGVyLmhhc091dGxpbmUoKSYmIWQsdFt5LlRFWFRBUkVBXT1jLHRbeS5XSVRIX0xFQURJTkdfSUNPTl09Zix0W1wibWRjLXRleHQtZmllbGQtLWZ1bGx3aWR0aFwiXT1kLHRbXCJtZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uXCJdPXAsdFtcIm1kYy10ZXh0LWZpZWxkLS1uby1sYWJlbFwiXT0hdGhpcy5sYWJlbEFkYXB0ZXIuaGFzTGFiZWwoKXx8aCx0KSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwib3RoZXJQcm9wc1wiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzO3QuY2hpbGRyZW4sdC5jbGFzc05hbWUsdC5kZW5zZSx0LmZsb2F0aW5nTGFiZWxDbGFzc05hbWUsdC5mdWxsV2lkdGgsdC5oZWxwZXJUZXh0LHQuY2hhcmFjdGVyQ291bnRlcix0LmxhYmVsLHQubGVhZGluZ0ljb24sdC5saW5lUmlwcGxlQ2xhc3NOYW1lLHQubm90Y2hlZE91dGxpbmVDbGFzc05hbWUsdC5vbkxlYWRpbmdJY29uU2VsZWN0LHQub25UcmFpbGluZ0ljb25TZWxlY3QsdC5vdXRsaW5lZCx0LnRleHRhcmVhLHQudHJhaWxpbmdJY29uLHQubm9MYWJlbDtyZXR1cm4gbyh0LFtcImNoaWxkcmVuXCIsXCJjbGFzc05hbWVcIixcImRlbnNlXCIsXCJmbG9hdGluZ0xhYmVsQ2xhc3NOYW1lXCIsXCJmdWxsV2lkdGhcIixcImhlbHBlclRleHRcIixcImNoYXJhY3RlckNvdW50ZXJcIixcImxhYmVsXCIsXCJsZWFkaW5nSWNvblwiLFwibGluZVJpcHBsZUNsYXNzTmFtZVwiLFwibm90Y2hlZE91dGxpbmVDbGFzc05hbWVcIixcIm9uTGVhZGluZ0ljb25TZWxlY3RcIixcIm9uVHJhaWxpbmdJY29uU2VsZWN0XCIsXCJvdXRsaW5lZFwiLFwidGV4dGFyZWFcIixcInRyYWlsaW5nSWNvblwiLFwibm9MYWJlbFwiXSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiYWRhcHRlclwiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9e2FkZENsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnNldFN0YXRlKHtjbGFzc0xpc3Q6dC5zdGF0ZS5jbGFzc0xpc3QuYWRkKGUpfSl9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciBuPXQuc3RhdGUuY2xhc3NMaXN0O24uZGVsZXRlKGUpLHQuc2V0U3RhdGUoe2NsYXNzTGlzdDpufSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiB0LmNsYXNzZXMuc3BsaXQoXCIgXCIpLmluY2x1ZGVzKGUpfSxyZWdpc3RlclRleHRGaWVsZEludGVyYWN0aW9uSGFuZGxlcjpmdW5jdGlvbigpe30sZGVyZWdpc3RlclRleHRGaWVsZEludGVyYWN0aW9uSGFuZGxlcjpmdW5jdGlvbigpe30scmVnaXN0ZXJWYWxpZGF0aW9uQXR0cmlidXRlQ2hhbmdlSGFuZGxlcjpmdW5jdGlvbigpe30sZGVyZWdpc3RlclZhbGlkYXRpb25BdHRyaWJ1dGVDaGFuZ2VIYW5kbGVyOmZ1bmN0aW9uKCl7fX07cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sZSx0aGlzLmlucHV0QWRhcHRlcix0aGlzLmxhYmVsQWRhcHRlcix0aGlzLmxpbmVSaXBwbGVBZGFwdGVyLHRoaXMubm90Y2hlZE91dGxpbmVBZGFwdGVyKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJpbnB1dEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm57aXNGb2N1c2VkOmZ1bmN0aW9uKCl7cmV0dXJuIHQuc3RhdGUuaXNGb2N1c2VkfSxnZXROYXRpdmVJbnB1dDpmdW5jdGlvbigpe3ZhciBlPXQuaW5wdXRDb21wb25lbnRfO2lmKGUpcmV0dXJue2Rpc2FibGVkOmUuaXNEaXNhYmxlZCgpLHZhbHVlOmUuZ2V0VmFsdWUoKSxtYXhMZW5ndGg6ZS5nZXRNYXhMZW5ndGgoKSx0eXBlOmUuZ2V0SW5wdXRUeXBlKCksdmFsaWRpdHk6e2JhZElucHV0OiEhZS5pc0JhZElucHV0KCksdmFsaWQ6ISFlLmlzVmFsaWQoKX19O3Rocm93IEVycm9yKFwiTURDUmVhY3RUZXh0RmllbGQ6IFRoZSBpbnB1dCBkaWQgbm90IHJlbmRlciBwcm9wZXJseVwiKX0scmVnaXN0ZXJJbnB1dEludGVyYWN0aW9uSGFuZGxlcjpmdW5jdGlvbigpe30sZGVyZWdpc3RlcklucHV0SW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwibGFiZWxBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJue3NoYWtlTGFiZWw6ZnVuY3Rpb24oZSl7dmFyIG49dC5mbG9hdGluZ0xhYmVsRWxlbWVudDtlJiZuJiZuLmN1cnJlbnQmJm4uY3VycmVudC5zaGFrZSgpfSxmbG9hdExhYmVsOmZ1bmN0aW9uKGUpe3JldHVybiB0LnNldFN0YXRlKHtsYWJlbElzRmxvYXRlZDplfSl9LGhhc0xhYmVsOmZ1bmN0aW9uKCl7cmV0dXJuISF0LnByb3BzLmxhYmVsJiYhdC5wcm9wcy5mdWxsV2lkdGh9LGdldExhYmVsV2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gdC5zdGF0ZS5pbml0aWFsTGFiZWxXaWR0aH19fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImxpbmVSaXBwbGVBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJue2FjdGl2YXRlTGluZVJpcHBsZTpmdW5jdGlvbigpe3JldHVybiB0LnNldFN0YXRlKHthY3RpdmVMaW5lUmlwcGxlOiEwfSl9LGRlYWN0aXZhdGVMaW5lUmlwcGxlOmZ1bmN0aW9uKCl7cmV0dXJuIHQuc2V0U3RhdGUoe2FjdGl2ZUxpbmVSaXBwbGU6ITF9KX0sc2V0TGluZVJpcHBsZVRyYW5zZm9ybU9yaWdpbjpmdW5jdGlvbihlKXtyZXR1cm4gdC5zZXRTdGF0ZSh7bGluZVJpcHBsZUNlbnRlcjplfSl9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJub3RjaGVkT3V0bGluZUFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm57bm90Y2hPdXRsaW5lOmZ1bmN0aW9uKGUpe3JldHVybiB0LnNldFN0YXRlKHtvdXRsaW5lSXNOb3RjaGVkOiEwLG5vdGNoZWRMYWJlbFdpZHRoOmV9KX0sY2xvc2VPdXRsaW5lOmZ1bmN0aW9uKCl7cmV0dXJuIHQuc2V0U3RhdGUoe291dGxpbmVJc05vdGNoZWQ6ITF9KX0saGFzT3V0bGluZTpmdW5jdGlvbigpe3JldHVybiEhdC5wcm9wcy5vdXRsaW5lZHx8ISF0LnByb3BzLnRleHRhcmVhfX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiaW5wdXRQcm9wc1wiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9bC5kZWZhdWx0LkNoaWxkcmVuLm9ubHkodGhpcy5wcm9wcy5jaGlsZHJlbikucHJvcHM7cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sZSx7Zm91bmRhdGlvbjp0aGlzLnN0YXRlLmZvdW5kYXRpb24saGFuZGxlRm9jdXNDaGFuZ2U6ZnVuY3Rpb24oZSl7dC5zZXRTdGF0ZSh7aXNGb2N1c2VkOmV9KSx0LnN0YXRlLmZvdW5kYXRpb24mJihlP3Quc3RhdGUuZm91bmRhdGlvbi5hY3RpdmF0ZUZvY3VzKCk6dC5zdGF0ZS5mb3VuZGF0aW9uLmRlYWN0aXZhdGVGb2N1cygpKX0sc2V0RGlzYWJsZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuc2V0U3RhdGUoe2Rpc2FibGVkOmV9KX0sc2V0SW5wdXRJZDpmdW5jdGlvbihlKXtyZXR1cm4gdC5zZXRTdGF0ZSh7aW5wdXRJZDplfSl9LHN5bmNJbnB1dDpmdW5jdGlvbihlKXtyZXR1cm4gdC5pbnB1dENvbXBvbmVudF89ZX0saW5wdXRUeXBlOnRoaXMucHJvcHMudGV4dGFyZWE/XCJ0ZXh0YXJlYVwiOlwiaW5wdXRcIixwbGFjZWhvbGRlcjp0aGlzLnByb3BzLm5vTGFiZWw/dGhpcy5wcm9wcy5sYWJlbDpudWxsfSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiY2hhcmFjdGVyQ291bnRlclByb3BzXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaW5wdXRQcm9wcyxlPXQudmFsdWUsbj10Lm1heExlbmd0aDtyZXR1cm57Y291bnQ6ZT9lLmxlbmd0aDowLG1heExlbmd0aDpuP3BhcnNlSW50KG4pOjB9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMsZT10LmZ1bGxXaWR0aCxuPXQuaGVscGVyVGV4dCxpPXQuY2hhcmFjdGVyQ291bnRlcixyPXQub25MZWFkaW5nSWNvblNlbGVjdCxvPXQub25UcmFpbGluZ0ljb25TZWxlY3Qscz10LmxlYWRpbmdJY29uLHU9dC50cmFpbGluZ0ljb24sZD10LnRleHRhcmVhLGM9dC5ub0xhYmVsLHA9dGhpcy5zdGF0ZS5mb3VuZGF0aW9uO3JldHVybiBsLmRlZmF1bHQuY3JlYXRlRWxlbWVudChsLmRlZmF1bHQuRnJhZ21lbnQsbnVsbCxsLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLGEoe30sdGhpcy5vdGhlclByb3BzLHtjbGFzc05hbWU6dGhpcy5jbGFzc2VzLG9uQ2xpY2s6ZnVuY3Rpb24oKXtyZXR1cm4gcC5oYW5kbGVUZXh0RmllbGRJbnRlcmFjdGlvbigpfSxvbktleURvd246ZnVuY3Rpb24oKXtyZXR1cm4gcC5oYW5kbGVUZXh0RmllbGRJbnRlcmFjdGlvbigpfSxyZWY6dGhpcy50ZXh0RmllbGRFbGVtZW50LGtleTpcInRleHQtZmllbGQtY29udGFpbmVyXCJ9KSxzP3RoaXMucmVuZGVySWNvbihzLHIpOm51bGwsZCYmaSYmdGhpcy5yZW5kZXJDaGFyYWN0ZXJDb3VudGVyKGkpLHRoaXMucmVuZGVySW5wdXQoKSx0aGlzLm5vdGNoZWRPdXRsaW5lQWRhcHRlci5oYXNPdXRsaW5lKCk/dGhpcy5yZW5kZXJOb3RjaGVkT3V0bGluZSgpOmwuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGwuZGVmYXVsdC5GcmFnbWVudCxudWxsLHRoaXMubGFiZWxBZGFwdGVyLmhhc0xhYmVsKCkmJiFjP3RoaXMucmVuZGVyTGFiZWwoKTpudWxsLGR8fGU/bnVsbDp0aGlzLnJlbmRlckxpbmVSaXBwbGUoKSksdT90aGlzLnJlbmRlckljb24odSxvKTpudWxsKSxufHxpP3RoaXMucmVuZGVySGVscGVyTGluZShuLGkpOm51bGwpfSxlLnByb3RvdHlwZS5yZW5kZXJJbnB1dD1mdW5jdGlvbigpe3ZhciB0PWwuZGVmYXVsdC5DaGlsZHJlbi5vbmx5KHRoaXMucHJvcHMuY2hpbGRyZW4pO3JldHVybiBsLmRlZmF1bHQuY2xvbmVFbGVtZW50KHQsdGhpcy5pbnB1dFByb3BzKX0sZS5wcm90b3R5cGUucmVuZGVyTGFiZWw9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5wcm9wcyxuPWUubGFiZWwsaT1lLmZsb2F0aW5nTGFiZWxDbGFzc05hbWUscj10aGlzLnN0YXRlLmlucHV0SWQ7cmV0dXJuIGwuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGIuZGVmYXVsdCx7Y2xhc3NOYW1lOmksZmxvYXQ6dGhpcy5zdGF0ZS5sYWJlbElzRmxvYXRlZCxoYW5kbGVXaWR0aENoYW5nZTpmdW5jdGlvbihlKXtyZXR1cm4gdC5zZXRTdGF0ZSh7aW5pdGlhbExhYmVsV2lkdGg6ZX0pfSxyZWY6dGhpcy5mbG9hdGluZ0xhYmVsRWxlbWVudCxodG1sRm9yOnJ9LG4pfSxlLnByb3RvdHlwZS5yZW5kZXJMaW5lUmlwcGxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcy5saW5lUmlwcGxlQ2xhc3NOYW1lLGU9dGhpcy5zdGF0ZSxuPWUuYWN0aXZlTGluZVJpcHBsZSxpPWUubGluZVJpcHBsZUNlbnRlcjtyZXR1cm4gbC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXy5kZWZhdWx0LHtyaXBwbGVDZW50ZXI6aSxjbGFzc05hbWU6dCxhY3RpdmU6bn0pfSxlLnByb3RvdHlwZS5yZW5kZXJOb3RjaGVkT3V0bGluZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMubm90Y2hlZE91dGxpbmVDbGFzc05hbWUsZT10aGlzLnN0YXRlLG49ZS5ub3RjaGVkTGFiZWxXaWR0aCxpPWUub3V0bGluZUlzTm90Y2hlZDtyZXR1cm4gbC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoZy5kZWZhdWx0LHtjbGFzc05hbWU6dCxub3RjaFdpZHRoOm4sbm90Y2g6aX0sdGhpcy5sYWJlbEFkYXB0ZXIuaGFzTGFiZWwoKT90aGlzLnJlbmRlckxhYmVsKCk6bnVsbCl9LGUucHJvdG90eXBlLnJlbmRlckhlbHBlckxpbmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOnkuSEVMUEVSX0xJTkV9LHQmJnRoaXMucmVuZGVySGVscGVyVGV4dCh0KSxlJiYhdGhpcy5wcm9wcy50ZXh0YXJlYSYmdGhpcy5yZW5kZXJDaGFyYWN0ZXJDb3VudGVyKGUpKX0sZS5wcm90b3R5cGUucmVuZGVySGVscGVyVGV4dD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnN0YXRlLmlzVmFsaWQsbj1PYmplY3QuYXNzaWduKHtpc1ZhbGlkOmUsa2V5OlwidGV4dC1maWVsZC1oZWxwZXItdGV4dFwifSx0LnByb3BzKTtyZXR1cm4gbC5kZWZhdWx0LmNsb25lRWxlbWVudCh0LG4pfSxlLnByb3RvdHlwZS5yZW5kZXJJY29uPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5zdGF0ZS5kaXNhYmxlZDtyZXR1cm4gbC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQocC5kZWZhdWx0LHtkaXNhYmxlZDpuLG9uU2VsZWN0OmV9LHQpfSxlLnByb3RvdHlwZS5yZW5kZXJDaGFyYWN0ZXJDb3VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBsLmRlZmF1bHQuY2xvbmVFbGVtZW50KHQsT2JqZWN0LmFzc2lnbih0aGlzLmNoYXJhY3RlckNvdW50ZXJQcm9wcyx0LnByb3BzKSl9LGUuZGVmYXVsdFByb3BzPXtjbGFzc05hbWU6XCJcIixkZW5zZTohMSxmbG9hdGluZ0xhYmVsQ2xhc3NOYW1lOlwiXCIsZnVsbFdpZHRoOiExLGxpbmVSaXBwbGVDbGFzc05hbWU6XCJcIixub3RjaGVkT3V0bGluZUNsYXNzTmFtZTpcIlwiLG91dGxpbmVkOiExLHRleHRhcmVhOiExLG5vTGFiZWw6ITF9LGV9KGwuZGVmYXVsdC5Db21wb25lbnQpO2UuZGVmYXVsdD1tfSwxMzM6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9KSh0LGUpfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLGE9dGhpcyYmdGhpcy5fX2Fzc2lnbnx8ZnVuY3Rpb24oKXtyZXR1cm4oYT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgciBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmKHRbcl09ZVtyXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG89dGhpcyYmdGhpcy5fX3Jlc3R8fGZ1bmN0aW9uKHQsZSl7dmFyIG49e307Zm9yKHZhciBpIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsaSkmJmUuaW5kZXhPZihpKTwwJiYobltpXT10W2ldKTtpZihudWxsIT10JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj0wO2ZvcihpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7cjxpLmxlbmd0aDtyKyspZS5pbmRleE9mKGlbcl0pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LGlbcl0pJiYobltpW3JdXT10W2lbcl1dKX1yZXR1cm4gbn0scz10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbD1zKG4oMCkpLHU9cyhuKDEpKSxkPVtcInBhdHRlcm5cIixcIm1pblwiLFwibWF4XCIsXCJyZXF1aXJlZFwiLFwic3RlcFwiLFwibWlubGVuZ3RoXCIsXCJtYXhsZW5ndGhcIl0sYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBlLmlucHV0RWxlbWVudF89bC5kZWZhdWx0LmNyZWF0ZVJlZigpLGUuc3RhdGU9e3dhc1VzZXJUcmlnZ2VyZWRDaGFuZ2U6ITEsaXNNb3VudGVkOiExfSxlLmluaXRpYWxpemVDb21wb25lbnRXaXRoRm91bmRhdGlvbj1mdW5jdGlvbigpe3ZhciB0PWUucHJvcHMsbj10LmhhbmRsZUZvY3VzQ2hhbmdlLGk9dC5mb3VuZGF0aW9uLHI9dC5hdXRvRm9jdXMsYT10LmlzVmFsaWQ7ciYmbiYmbighMCksaSYmdm9pZCAwIT09YSYmKGkuc2V0VXNlTmF0aXZlVmFsaWRhdGlvbighMSksaS5zZXRWYWxpZChhKSl9LGUuaGFuZGxlRm9jdXM9ZnVuY3Rpb24odCl7dmFyIG49ZS5wcm9wcyxpPW4uaGFuZGxlRm9jdXNDaGFuZ2Uscj1uLm9uRm9jdXMsYT12b2lkIDA9PT1yP2Z1bmN0aW9uKCl7fTpyO2kmJmkoITApLGEodCl9LGUuaGFuZGxlQmx1cj1mdW5jdGlvbih0KXt2YXIgbj1lLnByb3BzLGk9bi5oYW5kbGVGb2N1c0NoYW5nZSxyPW4ub25CbHVyLGE9dm9pZCAwPT09cj9mdW5jdGlvbigpe306cjtpJiZpKCExKSxhKHQpfSxlLmhhbmRsZU1vdXNlRG93bj1mdW5jdGlvbih0KXt2YXIgbj1lLnByb3BzLGk9bi5mb3VuZGF0aW9uLHI9bi5vbk1vdXNlRG93bixhPXZvaWQgMD09PXI/ZnVuY3Rpb24oKXt9OnI7aSYmaS5zZXRUcmFuc2Zvcm1PcmlnaW4odC5uYXRpdmVFdmVudCksYSh0KX0sZS5oYW5kbGVUb3VjaFN0YXJ0PWZ1bmN0aW9uKHQpe3ZhciBuPWUucHJvcHMsaT1uLmZvdW5kYXRpb24scj1uLm9uVG91Y2hTdGFydCxhPXZvaWQgMD09PXI/ZnVuY3Rpb24oKXt9OnI7aSYmaS5zZXRUcmFuc2Zvcm1PcmlnaW4odC5uYXRpdmVFdmVudCksYSh0KX0sZS5oYW5kbGVDaGFuZ2U9ZnVuY3Rpb24odCl7dmFyIG49ZS5wcm9wcyxpPW4uZm91bmRhdGlvbixyPW4ub25DaGFuZ2UsYT12b2lkIDA9PT1yP2Z1bmN0aW9uKCl7fTpyO2kmJmkuYXV0b0NvbXBsZXRlRm9jdXMoKSxlLnNldFN0YXRlKHt3YXNVc2VyVHJpZ2dlcmVkQ2hhbmdlOiEwfSksYSh0KX0sZS5oYW5kbGVWYWxpZGF0aW9uQXR0cmlidXRlVXBkYXRlPWZ1bmN0aW9uKHQpe3ZhciBuPXQuZm91bmRhdGlvbjtkLnNvbWUoZnVuY3Rpb24oaSl7dmFyIHI7cmV0dXJuIHI9XCJtaW5sZW5ndGhcIj09PWk/XCJtaW5MZW5ndGhcIjpcIm1heGxlbmd0aFwiPT09aT9cIm1heExlbmd0aFwiOmksZS5wcm9wc1tyXSE9PXRbcl0mJihuLmhhbmRsZVZhbGlkYXRpb25BdHRyaWJ1dGVDaGFuZ2UoW2ldKSwhMCl9KX0sZS5pc0JhZElucHV0PWZ1bmN0aW9uKCl7dmFyIHQ9ZS5pbnB1dEVsZW1lbnQ7cmV0dXJuIHQmJnQudmFsaWRpdHkuYmFkSW5wdXR9LGUuaXNWYWxpZD1mdW5jdGlvbigpe3JldHVybiBlLmlucHV0RWxlbWVudCYmdm9pZCAwPT09ZS5wcm9wcy5pc1ZhbGlkP2UuaW5wdXRFbGVtZW50LnZhbGlkaXR5LnZhbGlkOmUucHJvcHMuaXNWYWxpZH0sZS5pc0Rpc2FibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISFlLnByb3BzLmRpc2FibGVkfSxlLmdldE1heExlbmd0aD1mdW5jdGlvbigpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiBlLnByb3BzLm1heExlbmd0aD9lLnByb3BzLm1heExlbmd0aDotMX0sZS5nZXRJbnB1dFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gU3RyaW5nKGUucHJvcHMuaW5wdXRUeXBlKX0sZS5nZXRWYWx1ZT1mdW5jdGlvbigpe3JldHVybiBlLnZhbHVlVG9TdHJpbmcoZS5wcm9wcy52YWx1ZSl9LGV9cmV0dXJuIHIoZSx0KSxlLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMsZT10LmlkLG49dC5zeW5jSW5wdXQsaT10LmRpc2FibGVkLHI9dC52YWx1ZSxhPXQuc2V0SW5wdXRJZCxvPXQuc2V0RGlzYWJsZWQscz10LmZvdW5kYXRpb247biYmbih0aGlzKSxhJiZlJiZhKGUpLG8mJmkmJm8oITApLHImJnMmJnMuc2V0VmFsdWUodGhpcy52YWx1ZVRvU3RyaW5nKHIpKSx0aGlzLnNldFN0YXRlKHtpc01vdW50ZWQ6ITB9KX0sZS5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5wcm9wcyxpPW4uaWQscj1uLmZvdW5kYXRpb24sYT1uLnZhbHVlLG89bi5kaXNhYmxlZCxzPW4uaXNWYWxpZCxsPW4uc2V0SW5wdXRJZCx1PW4uc2V0RGlzYWJsZWQ7aWYoKCFlLmlzTW91bnRlZCYmdGhpcy5zdGF0ZS5pc01vdW50ZWQmJnRoaXMucHJvcHMuZm91bmRhdGlvbnx8dGhpcy5zdGF0ZS5pc01vdW50ZWQmJiF0LmZvdW5kYXRpb24mJnRoaXMucHJvcHMuZm91bmRhdGlvbikmJnRoaXMuaW5pdGlhbGl6ZUNvbXBvbmVudFdpdGhGb3VuZGF0aW9uKCksdGhpcy5oYW5kbGVWYWxpZGF0aW9uQXR0cmlidXRlVXBkYXRlKHQpLG8hPT10LmRpc2FibGVkJiYodSYmdShvKSxyJiZyLnNldERpc2FibGVkKCEhbykpLGkhPT10LmlkJiZsJiZsKGkpLGEhPT10LnZhbHVlKXt2YXIgZD10aGlzLnZhbHVlVG9TdHJpbmcoYSk7IXRoaXMuc3RhdGUud2FzVXNlclRyaWdnZXJlZENoYW5nZSYmciYmci5zZXRWYWx1ZShkKSx0aGlzLnNldFN0YXRlKHt3YXNVc2VyVHJpZ2dlcmVkQ2hhbmdlOiExfSl9cyE9PXQuaXNWYWxpZCYmciYmKHZvaWQgMD09PXM/ci5zZXRVc2VOYXRpdmVWYWxpZGF0aW9uKCEwKTooci5zZXRVc2VOYXRpdmVWYWxpZGF0aW9uKCExKSxyLnNldFZhbGlkKCEhcykpKX0sZS5wcm90b3R5cGUudmFsdWVUb1N0cmluZz1mdW5jdGlvbih0KXtyZXR1cm5cIm9iamVjdFwiPT10eXBlb2YgdD90LmpvaW4oXCJcIik6XCJudW1iZXJcIj09dHlwZW9mIHQ/dC50b1N0cmluZygpOnR8fFwiXCJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImNsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHUuZGVmYXVsdChcIm1kYy10ZXh0LWZpZWxkX19pbnB1dFwiLHRoaXMucHJvcHMuY2xhc3NOYW1lKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJpbnB1dEVsZW1lbnRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5wdXRFbGVtZW50Xy5jdXJyZW50fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMsZT10LmlucHV0VHlwZSxuPXQuZGlzYWJsZWQsaT0odC5jbGFzc05hbWUsdC5mb3VuZGF0aW9uLHQuc3luY0lucHV0LHQuaXNWYWxpZCx0LnZhbHVlKSxyPSh0LmhhbmRsZUZvY3VzQ2hhbmdlLHQuc2V0RGlzYWJsZWQsdC5zZXRJbnB1dElkLHQub25Gb2N1cyx0Lm9uQmx1cix0Lm9uTW91c2VEb3duLHQub25Ub3VjaFN0YXJ0LHQub25DaGFuZ2Usbyh0LFtcImlucHV0VHlwZVwiLFwiZGlzYWJsZWRcIixcImNsYXNzTmFtZVwiLFwiZm91bmRhdGlvblwiLFwic3luY0lucHV0XCIsXCJpc1ZhbGlkXCIsXCJ2YWx1ZVwiLFwiaGFuZGxlRm9jdXNDaGFuZ2VcIixcInNldERpc2FibGVkXCIsXCJzZXRJbnB1dElkXCIsXCJvbkZvY3VzXCIsXCJvbkJsdXJcIixcIm9uTW91c2VEb3duXCIsXCJvblRvdWNoU3RhcnRcIixcIm9uQ2hhbmdlXCJdKSkscz1PYmplY3QuYXNzaWduKHt9LHtvbkZvY3VzOnRoaXMuaGFuZGxlRm9jdXMsb25CbHVyOnRoaXMuaGFuZGxlQmx1cixvbk1vdXNlRG93bjp0aGlzLmhhbmRsZU1vdXNlRG93bixvblRvdWNoU3RhcnQ6dGhpcy5oYW5kbGVUb3VjaFN0YXJ0LG9uQ2hhbmdlOnRoaXMuaGFuZGxlQ2hhbmdlLGRpc2FibGVkOm4sdmFsdWU6aSxyZWY6dGhpcy5pbnB1dEVsZW1lbnRfLGNsYXNzTmFtZTp0aGlzLmNsYXNzZXN9LHIpO3JldHVyblwiaW5wdXRcIj09PWU/bC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLGEoe30scykpOmwuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIixhKHt9LHMpKX0sZS5kZWZhdWx0UHJvcHM9e2NsYXNzTmFtZTpcIlwiLGlucHV0VHlwZTpcImlucHV0XCIsZGlzYWJsZWQ6ITEsaWQ6XCJcIixzZXREaXNhYmxlZDpmdW5jdGlvbigpe30sc2V0SW5wdXRJZDpmdW5jdGlvbigpe30saGFuZGxlRm9jdXNDaGFuZ2U6ZnVuY3Rpb24oKXt9LHZhbHVlOlwiXCJ9LGV9KGwuZGVmYXVsdC5Db21wb25lbnQpO2UuZGVmYXVsdD1jfSwxMzQ6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciBpLHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fChpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9KSh0LGUpfSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9aSh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0pLGE9dGhpcyYmdGhpcy5fX2Fzc2lnbnx8ZnVuY3Rpb24oKXtyZXR1cm4oYT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKWZvcih2YXIgciBpbiBlPWFyZ3VtZW50c1tuXSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmKHRbcl09ZVtyXSk7cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG89dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIHM9byhuKDApKSxsPW8obigxKSksdT1uKDE3MCksZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzLGUpfHx0aGlzO24uaGFuZGxlQ2xpY2s9ZnVuY3Rpb24odCl7cmV0dXJuIG4uZm91bmRhdGlvbi5oYW5kbGVJbnRlcmFjdGlvbih0Lm5hdGl2ZUV2ZW50KX0sbi5oYW5kbGVLZXlEb3duPWZ1bmN0aW9uKHQpe3JldHVybiBuLmZvdW5kYXRpb24uaGFuZGxlSW50ZXJhY3Rpb24odC5uYXRpdmVFdmVudCl9LG4uYWRkSWNvbkF0dHJzVG9DaGlsZHJlbj1mdW5jdGlvbigpe3ZhciB0PW4uc3RhdGUsZT10LnRhYmluZGV4LGk9dC5yb2xlLHI9cy5kZWZhdWx0LkNoaWxkcmVuLm9ubHkobi5wcm9wcy5jaGlsZHJlbiksYT1sLmRlZmF1bHQoXCJtZGMtdGV4dC1maWVsZF9faWNvblwiLHIucHJvcHMuY2xhc3NOYW1lKSxvPU9iamVjdC5hc3NpZ24oe30sci5wcm9wcyx7Y2xhc3NOYW1lOmEsb25DbGljazpuLmhhbmRsZUNsaWNrLG9uS2V5RG93bjpuLmhhbmRsZUtleURvd24sdGFiSW5kZXg6ZSxyb2xlOml9KTtyZXR1cm4gcy5kZWZhdWx0LmNsb25lRWxlbWVudChyLG8pfTt2YXIgaT1lLmNoaWxkcmVuLnByb3BzLnJvbGU7cmV0dXJuIG4uc3RhdGU9e3RhYmluZGV4Om4udGFiaW5kZXgscm9sZTppfSxufXJldHVybiByKGUsdCksZS5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt0aGlzLmZvdW5kYXRpb249bmV3IHUuTURDVGV4dEZpZWxkSWNvbkZvdW5kYXRpb24odGhpcy5hZGFwdGVyKSx0aGlzLmZvdW5kYXRpb24uaW5pdCgpLHRoaXMucHJvcHMuZGlzYWJsZWQmJnRoaXMuZm91bmRhdGlvbi5zZXREaXNhYmxlZCghMCl9LGUucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbih0KXt0aGlzLnByb3BzLmRpc2FibGVkIT09dC5kaXNhYmxlZCYmdGhpcy5mb3VuZGF0aW9uLnNldERpc2FibGVkKCEhdGhpcy5wcm9wcy5kaXNhYmxlZCksdGhpcy5wcm9wcy5vblNlbGVjdCE9PXQub25TZWxlY3QmJnRoaXMuc2V0U3RhdGUoe3RhYmluZGV4OnRoaXMudGFiaW5kZXh9KX0sZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLmZvdW5kYXRpb24uZGVzdHJveSgpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJ0YWJpbmRleFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgdGhpcy5wcm9wcy5jaGlsZHJlbi5wcm9wcy50YWJJbmRleD90aGlzLnByb3BzLmNoaWxkcmVuLnByb3BzLnRhYkluZGV4OnRoaXMucHJvcHMub25TZWxlY3Q/MDotMX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJhZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJue2dldEF0dHI6ZnVuY3Rpb24oZSl7dmFyIG49dC5zdGF0ZVtlXTtyZXR1cm4gbnx8XCJudW1iZXJcIj09dHlwZW9mIG4mJiFpc05hTihuKT9uLnRvU3RyaW5nKCk6XCJcIn0sc2V0QXR0cjpmdW5jdGlvbihlLG4pe3JldHVybiB0LnNldFN0YXRlKGZ1bmN0aW9uKHQpe3ZhciBpO3JldHVybiBhKHt9LHQsKChpPXt9KVtlXT1cInRhYmluZGV4XCI9PT1lP051bWJlcihuKTpuLGkpKX0pfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0LnNldFN0YXRlKGZ1bmN0aW9uKHQpe3ZhciBuO3JldHVybiBhKHt9LHQsKChuPXt9KVtlXT1udWxsLG4pKX0pfSxub3RpZnlJY29uQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvcHMub25TZWxlY3QmJnQucHJvcHMub25TZWxlY3QoKX0sc2V0Q29udGVudDpmdW5jdGlvbigpe30scmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXI6ZnVuY3Rpb24oKXt9LGRlcmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXI6ZnVuY3Rpb24oKXt9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZGRJY29uQXR0cnNUb0NoaWxkcmVuKCl9LGUuZGVmYXVsdFByb3BzPXtkaXNhYmxlZDohMX0sZX0ocy5kZWZhdWx0LkNvbXBvbmVudCk7ZS5kZWZhdWx0PWR9LDEzNTpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGkscixhPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1mdW5jdGlvbih0LGUpe3JldHVybihpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSkodCxlKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxvPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKG89T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxzPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBsPXMobigwKSksdT1zKG4oMSkpLGQ9bigxNjkpLGM9ZC5NRENUZXh0RmllbGRIZWxwZXJUZXh0Rm91bmRhdGlvbi5jc3NDbGFzc2VzLHA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbixpPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiBpLnN0YXRlPSgobj17fSlbXCJhcmlhLWhpZGRlblwiXT1lW1wiYXJpYS1oaWRkZW5cIl0sbi5yb2xlPWUucm9sZSxuLmNsYXNzTGlzdD1uZXcgU2V0LG4pLGl9cmV0dXJuIGEoZSx0KSxlLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3RoaXMuZm91bmRhdGlvbj1uZXcgZC5NRENUZXh0RmllbGRIZWxwZXJUZXh0Rm91bmRhdGlvbih0aGlzLmFkYXB0ZXIpLHRoaXMuZm91bmRhdGlvbi5pbml0KCksdGhpcy5wcm9wcy5zaG93VG9TY3JlZW5SZWFkZXImJnRoaXMuZm91bmRhdGlvbi5zaG93VG9TY3JlZW5SZWFkZXIoKSx0aGlzLnByb3BzLmlzVmFsaWR8fHRoaXMuZm91bmRhdGlvbi5zZXRWYWxpZGl0eSghMSksdGhpcy5wcm9wcy5pc1ZhbGlkYXRpb25NZXNzYWdlJiZ0aGlzLmZvdW5kYXRpb24uc2V0VmFsaWRhdGlvbighMCl9LGUucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbih0KXt0aGlzLnByb3BzLnNob3dUb1NjcmVlblJlYWRlciE9PXQuc2hvd1RvU2NyZWVuUmVhZGVyJiZ0aGlzLnByb3BzLnNob3dUb1NjcmVlblJlYWRlciYmdGhpcy5mb3VuZGF0aW9uLnNob3dUb1NjcmVlblJlYWRlcigpLHRoaXMucHJvcHMuaXNWYWxpZCE9PXQuaXNWYWxpZCYmdGhpcy5mb3VuZGF0aW9uLnNldFZhbGlkaXR5KCEhdGhpcy5wcm9wcy5pc1ZhbGlkKSx0aGlzLnByb3BzLmlzVmFsaWRhdGlvbk1lc3NhZ2UhPT10LmlzVmFsaWRhdGlvbk1lc3NhZ2UmJnRoaXMucHJvcHMuaXNWYWxpZGF0aW9uTWVzc2FnZSYmdGhpcy5mb3VuZGF0aW9uLnNldFZhbGlkYXRpb24odGhpcy5wcm9wcy5pc1ZhbGlkYXRpb25NZXNzYWdlKX0sZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLmZvdW5kYXRpb24uZGVzdHJveSgpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJjbGFzc2VzXCIse2dldDpmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5wcm9wcyxuPWUuY2xhc3NOYW1lLGk9ZS5wZXJzaXN0ZW50LHI9ZS52YWxpZGF0aW9uO3JldHVybiB1LmRlZmF1bHQoYy5ST09ULG4sKCh0PXt9KVtjLkhFTFBFUl9URVhUX1BFUlNJU1RFTlRdPWksdFtjLkhFTFBFUl9URVhUX1ZBTElEQVRJT05fTVNHXT1yLHQpKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJhZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJue2FkZENsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnNldFN0YXRlKHtjbGFzc0xpc3Q6dC5zdGF0ZS5jbGFzc0xpc3QuYWRkKGUpfSl9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciBuPXQuc3RhdGUuY2xhc3NMaXN0O24uZGVsZXRlKGUpLHQuc2V0U3RhdGUoe2NsYXNzTGlzdDpufSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiB0LmNsYXNzZXMuc3BsaXQoXCIgXCIpLmluY2x1ZGVzKGUpfSxzZXRBdHRyOmZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuc2V0U3RhdGUoZnVuY3Rpb24odCl7dmFyIGk7cmV0dXJuIG8oe30sdCwoKGk9e30pW2VdPW4saSkpfSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuc2V0U3RhdGUoZnVuY3Rpb24odCl7dmFyIG47cmV0dXJuIG8oe30sdCwoKG49e30pW2VdPW51bGwsbikpfSl9LHNldENvbnRlbnQ6ZnVuY3Rpb24oKXt9fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJwXCIse2NsYXNzTmFtZTp0aGlzLmNsYXNzZXMscm9sZTp0aGlzLnN0YXRlLnJvbGUsXCJhcmlhLWhpZGRlblwiOnRoaXMuc3RhdGVbXCJhcmlhLWhpZGRlblwiXX0sdGhpcy5wcm9wcy5jaGlsZHJlbil9LGUuZGVmYXVsdFByb3BzPSgocj17fSlbXCJhcmlhLWhpZGRlblwiXT0hMSxyLmNsYXNzTmFtZT1cIlwiLHIuaXNWYWxpZD0hMCxyLmlzVmFsaWRhdGlvbk1lc3NhZ2U9ITEsci5wZXJzaXN0ZW50PSExLHIuc2hvd1RvU2NyZWVuUmVhZGVyPSExLHIudmFsaWRhdGlvbj0hMSxyKSxlfShsLmRlZmF1bHQuQ29tcG9uZW50KTtlLmRlZmF1bHQ9cH0sMTM2OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgaSxyPXRoaXMmJnRoaXMuX19leHRlbmRzfHwoaT1mdW5jdGlvbih0LGUpe3JldHVybihpPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSkodCxlKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWkodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9KSxhPXRoaXMmJnRoaXMuX19hc3NpZ258fGZ1bmN0aW9uKCl7cmV0dXJuKGE9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylmb3IodmFyIHIgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJih0W3JdPWVbcl0pO3JldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxvPXRoaXMmJnRoaXMuX19yZXN0fHxmdW5jdGlvbih0LGUpe3ZhciBuPXt9O2Zvcih2YXIgaSBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGkpJiZlLmluZGV4T2YoaSk8MCYmKG5baV09dFtpXSk7aWYobnVsbCE9dCYmXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9MDtmb3IoaT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO3I8aS5sZW5ndGg7cisrKWUuaW5kZXhPZihpW3JdKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodCxpW3JdKSYmKG5baVtyXV09dFtpW3JdXSl9cmV0dXJuIG59LHM9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIGw9cyhuKDApKSx1PXMobigxKSksZD1uKDE2MyksYz1kLk1EQ1RleHRGaWVsZENoYXJhY3RlckNvdW50ZXJGb3VuZGF0aW9uLmNzc0NsYXNzZXMscD1cIiR7Y291bnR9XCIsZj1cIiR7bWF4TGVuZ3RofVwiLGg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5mb3VuZGF0aW9uPW5ldyBkLk1EQ1RleHRGaWVsZENoYXJhY3RlckNvdW50ZXJGb3VuZGF0aW9uKGUuYWRhcHRlciksZX1yZXR1cm4gcihlLHQpLGUucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7dGhpcy5mb3VuZGF0aW9uLmRlc3Ryb3koKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiYWRhcHRlclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57c2V0Q29udGVudDpmdW5jdGlvbigpe319fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnJlbmRlclRlbXBsYXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucHJvcHMsbj1lLmNvdW50LGk9dm9pZCAwPT09bj8wOm4scj1lLm1heExlbmd0aCxhPXZvaWQgMD09PXI/MDpyO3JldHVybiB0LnJlcGxhY2UocCxpLnRvU3RyaW5nKCkpLnJlcGxhY2UoZixhLnRvU3RyaW5nKCkpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJjbGFzc2VzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB1LmRlZmF1bHQoYy5ST09ULHRoaXMucHJvcHMuY2xhc3NOYW1lKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJvdGhlclByb3BzXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHM7dC5jbGFzc05hbWUsdC5jb3VudCx0Lm1heExlbmd0aCx0LnRlbXBsYXRlO3JldHVybiBvKHQsW1wiY2xhc3NOYW1lXCIsXCJjb3VudFwiLFwibWF4TGVuZ3RoXCIsXCJ0ZW1wbGF0ZVwiXSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wcm9wcy50ZW1wbGF0ZTtyZXR1cm4gbC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIixhKHtjbGFzc05hbWU6dGhpcy5jbGFzc2VzfSx0aGlzLm90aGVyUHJvcHMpLHRoaXMucmVuZGVyVGVtcGxhdGUodHx8cCtcIiAvIFwiK2YpKX0sZX0obC5kZWZhdWx0LkNvbXBvbmVudCk7ZS5kZWZhdWx0PWh9LDE0OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLmQoZSxcImFcIixmdW5jdGlvbigpe3JldHVybiBpfSk7XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cbnZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2b2lkIDA9PT10JiYodD17fSksdGhpcy5hZGFwdGVyXz10fXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJzdHJpbmdzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwibnVtYmVyc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt9LHQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt9LHR9KCl9LDE2MzpmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5yKGUpO3ZhciBpPW4oMTApLHI9bigxNCksYT17Uk9PVDpcIm1kYy10ZXh0LWZpZWxkLWNoYXJhY3Rlci1jb3VudGVyXCJ9LG89e1JPT1RfU0VMRUNUT1I6XCIuXCIrYS5ST09UfTtuLmQoZSxcIk1EQ1RleHRGaWVsZENoYXJhY3RlckNvdW50ZXJGb3VuZGF0aW9uXCIsZnVuY3Rpb24oKXtyZXR1cm4gc30pO1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG52YXIgcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3JldHVybiB0LmNhbGwodGhpcyxpLmEoe30sZS5kZWZhdWx0QWRhcHRlcixuKSl8fHRoaXN9cmV0dXJuIGkuYihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcInN0cmluZ3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJkZWZhdWx0QWRhcHRlclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57c2V0Q29udGVudDpmdW5jdGlvbigpe319fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnNldENvdW50ZXJWYWx1ZT1mdW5jdGlvbih0LGUpe3Q9TWF0aC5taW4odCxlKSx0aGlzLmFkYXB0ZXJfLnNldENvbnRlbnQodCtcIiAvIFwiK2UpfSxlfShyLmEpO2UuZGVmYXVsdD1zfSwxNjQ6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24ucihlKTt2YXIgaT1uKDEwKSxyPW4oMTQpLGE9e0FSSUFfQ09OVFJPTFM6XCJhcmlhLWNvbnRyb2xzXCIsSUNPTl9TRUxFQ1RPUjpcIi5tZGMtdGV4dC1maWVsZF9faWNvblwiLElOUFVUX1NFTEVDVE9SOlwiLm1kYy10ZXh0LWZpZWxkX19pbnB1dFwiLExBQkVMX1NFTEVDVE9SOlwiLm1kYy1mbG9hdGluZy1sYWJlbFwiLExJTkVfUklQUExFX1NFTEVDVE9SOlwiLm1kYy1saW5lLXJpcHBsZVwiLE9VVExJTkVfU0VMRUNUT1I6XCIubWRjLW5vdGNoZWQtb3V0bGluZVwifSxvPXtERU5TRTpcIm1kYy10ZXh0LWZpZWxkLS1kZW5zZVwiLERJU0FCTEVEOlwibWRjLXRleHQtZmllbGQtLWRpc2FibGVkXCIsRk9DVVNFRDpcIm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkXCIsRlVMTFdJRFRIOlwibWRjLXRleHQtZmllbGQtLWZ1bGx3aWR0aFwiLEhFTFBFUl9MSU5FOlwibWRjLXRleHQtZmllbGQtaGVscGVyLWxpbmVcIixJTlZBTElEOlwibWRjLXRleHQtZmllbGQtLWludmFsaWRcIixOT19MQUJFTDpcIm1kYy10ZXh0LWZpZWxkLS1uby1sYWJlbFwiLE9VVExJTkVEOlwibWRjLXRleHQtZmllbGQtLW91dGxpbmVkXCIsUk9PVDpcIm1kYy10ZXh0LWZpZWxkXCIsVEVYVEFSRUE6XCJtZGMtdGV4dC1maWVsZC0tdGV4dGFyZWFcIixXSVRIX0xFQURJTkdfSUNPTjpcIm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvblwiLFdJVEhfVFJBSUxJTkdfSUNPTjpcIm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb25cIn0scz17REVOU0VfTEFCRUxfU0NBTEU6LjkyMyxMQUJFTF9TQ0FMRTouNzV9LGw9W1wicGF0dGVyblwiLFwibWluXCIsXCJtYXhcIixcInJlcXVpcmVkXCIsXCJzdGVwXCIsXCJtaW5sZW5ndGhcIixcIm1heGxlbmd0aFwiXSx1PVtcImNvbG9yXCIsXCJkYXRlXCIsXCJkYXRldGltZS1sb2NhbFwiLFwibW9udGhcIixcInJhbmdlXCIsXCJ0aW1lXCIsXCJ3ZWVrXCJdO24uZChlLFwiTURDVGV4dEZpZWxkRm91bmRhdGlvblwiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIGQ9W1wibW91c2Vkb3duXCIsXCJ0b3VjaHN0YXJ0XCJdLGM9W1wiY2xpY2tcIixcImtleWRvd25cIl0scD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4scil7dm9pZCAwPT09ciYmKHI9e30pO3ZhciBhPXQuY2FsbCh0aGlzLGkuYSh7fSxlLmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpcztyZXR1cm4gYS5pc0ZvY3VzZWRfPSExLGEucmVjZWl2ZWRVc2VySW5wdXRfPSExLGEuaXNWYWxpZF89ITAsYS51c2VOYXRpdmVWYWxpZGF0aW9uXz0hMCxhLmhlbHBlclRleHRfPXIuaGVscGVyVGV4dCxhLmNoYXJhY3RlckNvdW50ZXJfPXIuY2hhcmFjdGVyQ291bnRlcixhLmxlYWRpbmdJY29uXz1yLmxlYWRpbmdJY29uLGEudHJhaWxpbmdJY29uXz1yLnRyYWlsaW5nSWNvbixhLmlucHV0Rm9jdXNIYW5kbGVyXz1mdW5jdGlvbigpe3JldHVybiBhLmFjdGl2YXRlRm9jdXMoKX0sYS5pbnB1dEJsdXJIYW5kbGVyXz1mdW5jdGlvbigpe3JldHVybiBhLmRlYWN0aXZhdGVGb2N1cygpfSxhLmlucHV0SW5wdXRIYW5kbGVyXz1mdW5jdGlvbigpe3JldHVybiBhLmhhbmRsZUlucHV0KCl9LGEuc2V0UG9pbnRlclhPZmZzZXRfPWZ1bmN0aW9uKHQpe3JldHVybiBhLnNldFRyYW5zZm9ybU9yaWdpbih0KX0sYS50ZXh0RmllbGRJbnRlcmFjdGlvbkhhbmRsZXJfPWZ1bmN0aW9uKCl7cmV0dXJuIGEuaGFuZGxlVGV4dEZpZWxkSW50ZXJhY3Rpb24oKX0sYS52YWxpZGF0aW9uQXR0cmlidXRlQ2hhbmdlSGFuZGxlcl89ZnVuY3Rpb24odCl7cmV0dXJuIGEuaGFuZGxlVmFsaWRhdGlvbkF0dHJpYnV0ZUNoYW5nZSh0KX0sYX1yZXR1cm4gaS5iKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJjc3NDbGFzc2VzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBvfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwic3RyaW5nc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIm51bWJlcnNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHN9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwic2hvdWxkQWx3YXlzRmxvYXRfXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0TmF0aXZlSW5wdXRfKCkudHlwZTtyZXR1cm4gdS5pbmRleE9mKHQpPj0wfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcInNob3VsZEZsb2F0XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNob3VsZEFsd2F5c0Zsb2F0X3x8dGhpcy5pc0ZvY3VzZWRffHxCb29sZWFuKHRoaXMuZ2V0VmFsdWUoKSl8fHRoaXMuaXNCYWRJbnB1dF8oKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJzaG91bGRTaGFrZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc0ZvY3VzZWRfJiYhdGhpcy5pc1ZhbGlkKCkmJkJvb2xlYW4odGhpcy5nZXRWYWx1ZSgpKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybnthZGRDbGFzczpmdW5jdGlvbigpe30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oKXt9LGhhc0NsYXNzOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHJlZ2lzdGVyVGV4dEZpZWxkSW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxkZXJlZ2lzdGVyVGV4dEZpZWxkSW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxyZWdpc3RlcklucHV0SW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxkZXJlZ2lzdGVySW5wdXRJbnRlcmFjdGlvbkhhbmRsZXI6ZnVuY3Rpb24oKXt9LHJlZ2lzdGVyVmFsaWRhdGlvbkF0dHJpYnV0ZUNoYW5nZUhhbmRsZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXt9KX0sZGVyZWdpc3RlclZhbGlkYXRpb25BdHRyaWJ1dGVDaGFuZ2VIYW5kbGVyOmZ1bmN0aW9uKCl7fSxnZXROYXRpdmVJbnB1dDpmdW5jdGlvbigpe3JldHVybiBudWxsfSxpc0ZvY3VzZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sYWN0aXZhdGVMaW5lUmlwcGxlOmZ1bmN0aW9uKCl7fSxkZWFjdGl2YXRlTGluZVJpcHBsZTpmdW5jdGlvbigpe30sc2V0TGluZVJpcHBsZVRyYW5zZm9ybU9yaWdpbjpmdW5jdGlvbigpe30sc2hha2VMYWJlbDpmdW5jdGlvbigpe30sZmxvYXRMYWJlbDpmdW5jdGlvbigpe30saGFzTGFiZWw6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZ2V0TGFiZWxXaWR0aDpmdW5jdGlvbigpe3JldHVybiAwfSxoYXNPdXRsaW5lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LG5vdGNoT3V0bGluZTpmdW5jdGlvbigpe30sY2xvc2VPdXRsaW5lOmZ1bmN0aW9uKCl7fX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5hZGFwdGVyXy5pc0ZvY3VzZWQoKT90aGlzLmlucHV0Rm9jdXNIYW5kbGVyXygpOnRoaXMuYWRhcHRlcl8uaGFzTGFiZWwoKSYmdGhpcy5zaG91bGRGbG9hdCYmKHRoaXMubm90Y2hPdXRsaW5lKCEwKSx0aGlzLmFkYXB0ZXJfLmZsb2F0TGFiZWwoITApKSx0aGlzLmFkYXB0ZXJfLnJlZ2lzdGVySW5wdXRJbnRlcmFjdGlvbkhhbmRsZXIoXCJmb2N1c1wiLHRoaXMuaW5wdXRGb2N1c0hhbmRsZXJfKSx0aGlzLmFkYXB0ZXJfLnJlZ2lzdGVySW5wdXRJbnRlcmFjdGlvbkhhbmRsZXIoXCJibHVyXCIsdGhpcy5pbnB1dEJsdXJIYW5kbGVyXyksdGhpcy5hZGFwdGVyXy5yZWdpc3RlcklucHV0SW50ZXJhY3Rpb25IYW5kbGVyKFwiaW5wdXRcIix0aGlzLmlucHV0SW5wdXRIYW5kbGVyXyksZC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuYWRhcHRlcl8ucmVnaXN0ZXJJbnB1dEludGVyYWN0aW9uSGFuZGxlcihlLHQuc2V0UG9pbnRlclhPZmZzZXRfKX0pLGMuZm9yRWFjaChmdW5jdGlvbihlKXt0LmFkYXB0ZXJfLnJlZ2lzdGVyVGV4dEZpZWxkSW50ZXJhY3Rpb25IYW5kbGVyKGUsdC50ZXh0RmllbGRJbnRlcmFjdGlvbkhhbmRsZXJfKX0pLHRoaXMudmFsaWRhdGlvbk9ic2VydmVyXz10aGlzLmFkYXB0ZXJfLnJlZ2lzdGVyVmFsaWRhdGlvbkF0dHJpYnV0ZUNoYW5nZUhhbmRsZXIodGhpcy52YWxpZGF0aW9uQXR0cmlidXRlQ2hhbmdlSGFuZGxlcl8pLHRoaXMuc2V0Q2hhcmFjdGVyQ291bnRlcl8odGhpcy5nZXRWYWx1ZSgpLmxlbmd0aCl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuYWRhcHRlcl8uZGVyZWdpc3RlcklucHV0SW50ZXJhY3Rpb25IYW5kbGVyKFwiZm9jdXNcIix0aGlzLmlucHV0Rm9jdXNIYW5kbGVyXyksdGhpcy5hZGFwdGVyXy5kZXJlZ2lzdGVySW5wdXRJbnRlcmFjdGlvbkhhbmRsZXIoXCJibHVyXCIsdGhpcy5pbnB1dEJsdXJIYW5kbGVyXyksdGhpcy5hZGFwdGVyXy5kZXJlZ2lzdGVySW5wdXRJbnRlcmFjdGlvbkhhbmRsZXIoXCJpbnB1dFwiLHRoaXMuaW5wdXRJbnB1dEhhbmRsZXJfKSxkLmZvckVhY2goZnVuY3Rpb24oZSl7dC5hZGFwdGVyXy5kZXJlZ2lzdGVySW5wdXRJbnRlcmFjdGlvbkhhbmRsZXIoZSx0LnNldFBvaW50ZXJYT2Zmc2V0Xyl9KSxjLmZvckVhY2goZnVuY3Rpb24oZSl7dC5hZGFwdGVyXy5kZXJlZ2lzdGVyVGV4dEZpZWxkSW50ZXJhY3Rpb25IYW5kbGVyKGUsdC50ZXh0RmllbGRJbnRlcmFjdGlvbkhhbmRsZXJfKX0pLHRoaXMuYWRhcHRlcl8uZGVyZWdpc3RlclZhbGlkYXRpb25BdHRyaWJ1dGVDaGFuZ2VIYW5kbGVyKHRoaXMudmFsaWRhdGlvbk9ic2VydmVyXyl9LGUucHJvdG90eXBlLmhhbmRsZVRleHRGaWVsZEludGVyYWN0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5hZGFwdGVyXy5nZXROYXRpdmVJbnB1dCgpO3QmJnQuZGlzYWJsZWR8fCh0aGlzLnJlY2VpdmVkVXNlcklucHV0Xz0hMCl9LGUucHJvdG90eXBlLmhhbmRsZVZhbGlkYXRpb25BdHRyaWJ1dGVDaGFuZ2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0LnNvbWUoZnVuY3Rpb24odCl7cmV0dXJuIGwuaW5kZXhPZih0KT4tMSYmKGUuc3R5bGVWYWxpZGl0eV8oITApLCEwKX0pLHQuaW5kZXhPZihcIm1heGxlbmd0aFwiKT4tMSYmdGhpcy5zZXRDaGFyYWN0ZXJDb3VudGVyXyh0aGlzLmdldFZhbHVlKCkubGVuZ3RoKX0sZS5wcm90b3R5cGUubm90Y2hPdXRsaW5lPWZ1bmN0aW9uKHQpe2lmKHRoaXMuYWRhcHRlcl8uaGFzT3V0bGluZSgpKWlmKHQpe3ZhciBlPXRoaXMuYWRhcHRlcl8uaGFzQ2xhc3Moby5ERU5TRSk/cy5ERU5TRV9MQUJFTF9TQ0FMRTpzLkxBQkVMX1NDQUxFLG49dGhpcy5hZGFwdGVyXy5nZXRMYWJlbFdpZHRoKCkqZTt0aGlzLmFkYXB0ZXJfLm5vdGNoT3V0bGluZShuKX1lbHNlIHRoaXMuYWRhcHRlcl8uY2xvc2VPdXRsaW5lKCl9LGUucHJvdG90eXBlLmFjdGl2YXRlRm9jdXM9ZnVuY3Rpb24oKXt0aGlzLmlzRm9jdXNlZF89ITAsdGhpcy5zdHlsZUZvY3VzZWRfKHRoaXMuaXNGb2N1c2VkXyksdGhpcy5hZGFwdGVyXy5hY3RpdmF0ZUxpbmVSaXBwbGUoKSx0aGlzLmFkYXB0ZXJfLmhhc0xhYmVsKCkmJih0aGlzLm5vdGNoT3V0bGluZSh0aGlzLnNob3VsZEZsb2F0KSx0aGlzLmFkYXB0ZXJfLmZsb2F0TGFiZWwodGhpcy5zaG91bGRGbG9hdCksdGhpcy5hZGFwdGVyXy5zaGFrZUxhYmVsKHRoaXMuc2hvdWxkU2hha2UpKSx0aGlzLmhlbHBlclRleHRfJiZ0aGlzLmhlbHBlclRleHRfLnNob3dUb1NjcmVlblJlYWRlcigpfSxlLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1PcmlnaW49ZnVuY3Rpb24odCl7dmFyIGU9dC50b3VjaGVzLG49ZT9lWzBdOnQsaT1uLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxyPW4uY2xpZW50WC1pLmxlZnQ7dGhpcy5hZGFwdGVyXy5zZXRMaW5lUmlwcGxlVHJhbnNmb3JtT3JpZ2luKHIpfSxlLnByb3RvdHlwZS5oYW5kbGVJbnB1dD1mdW5jdGlvbigpe3RoaXMuYXV0b0NvbXBsZXRlRm9jdXMoKSx0aGlzLnNldENoYXJhY3RlckNvdW50ZXJfKHRoaXMuZ2V0VmFsdWUoKS5sZW5ndGgpfSxlLnByb3RvdHlwZS5hdXRvQ29tcGxldGVGb2N1cz1mdW5jdGlvbigpe3RoaXMucmVjZWl2ZWRVc2VySW5wdXRffHx0aGlzLmFjdGl2YXRlRm9jdXMoKX0sZS5wcm90b3R5cGUuZGVhY3RpdmF0ZUZvY3VzPWZ1bmN0aW9uKCl7dGhpcy5pc0ZvY3VzZWRfPSExLHRoaXMuYWRhcHRlcl8uZGVhY3RpdmF0ZUxpbmVSaXBwbGUoKTt2YXIgdD10aGlzLmlzVmFsaWQoKTt0aGlzLnN0eWxlVmFsaWRpdHlfKHQpLHRoaXMuc3R5bGVGb2N1c2VkXyh0aGlzLmlzRm9jdXNlZF8pLHRoaXMuYWRhcHRlcl8uaGFzTGFiZWwoKSYmKHRoaXMubm90Y2hPdXRsaW5lKHRoaXMuc2hvdWxkRmxvYXQpLHRoaXMuYWRhcHRlcl8uZmxvYXRMYWJlbCh0aGlzLnNob3VsZEZsb2F0KSx0aGlzLmFkYXB0ZXJfLnNoYWtlTGFiZWwodGhpcy5zaG91bGRTaGFrZSkpLHRoaXMuc2hvdWxkRmxvYXR8fCh0aGlzLnJlY2VpdmVkVXNlcklucHV0Xz0hMSl9LGUucHJvdG90eXBlLmdldFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TmF0aXZlSW5wdXRfKCkudmFsdWV9LGUucHJvdG90eXBlLnNldFZhbHVlPWZ1bmN0aW9uKHQpe3RoaXMuZ2V0VmFsdWUoKSE9PXQmJih0aGlzLmdldE5hdGl2ZUlucHV0XygpLnZhbHVlPXQpLHRoaXMuc2V0Q2hhcmFjdGVyQ291bnRlcl8odC5sZW5ndGgpO3ZhciBlPXRoaXMuaXNWYWxpZCgpO3RoaXMuc3R5bGVWYWxpZGl0eV8oZSksdGhpcy5hZGFwdGVyXy5oYXNMYWJlbCgpJiYodGhpcy5ub3RjaE91dGxpbmUodGhpcy5zaG91bGRGbG9hdCksdGhpcy5hZGFwdGVyXy5mbG9hdExhYmVsKHRoaXMuc2hvdWxkRmxvYXQpLHRoaXMuYWRhcHRlcl8uc2hha2VMYWJlbCh0aGlzLnNob3VsZFNoYWtlKSl9LGUucHJvdG90eXBlLmlzVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51c2VOYXRpdmVWYWxpZGF0aW9uXz90aGlzLmlzTmF0aXZlSW5wdXRWYWxpZF8oKTp0aGlzLmlzVmFsaWRffSxlLnByb3RvdHlwZS5zZXRWYWxpZD1mdW5jdGlvbih0KXt0aGlzLmlzVmFsaWRfPXQsdGhpcy5zdHlsZVZhbGlkaXR5Xyh0KTt2YXIgZT0hdCYmIXRoaXMuaXNGb2N1c2VkXzt0aGlzLmFkYXB0ZXJfLmhhc0xhYmVsKCkmJnRoaXMuYWRhcHRlcl8uc2hha2VMYWJlbChlKX0sZS5wcm90b3R5cGUuc2V0VXNlTmF0aXZlVmFsaWRhdGlvbj1mdW5jdGlvbih0KXt0aGlzLnVzZU5hdGl2ZVZhbGlkYXRpb25fPXR9LGUucHJvdG90eXBlLmlzRGlzYWJsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXROYXRpdmVJbnB1dF8oKS5kaXNhYmxlZH0sZS5wcm90b3R5cGUuc2V0RGlzYWJsZWQ9ZnVuY3Rpb24odCl7dGhpcy5nZXROYXRpdmVJbnB1dF8oKS5kaXNhYmxlZD10LHRoaXMuc3R5bGVEaXNhYmxlZF8odCl9LGUucHJvdG90eXBlLnNldEhlbHBlclRleHRDb250ZW50PWZ1bmN0aW9uKHQpe3RoaXMuaGVscGVyVGV4dF8mJnRoaXMuaGVscGVyVGV4dF8uc2V0Q29udGVudCh0KX0sZS5wcm90b3R5cGUuc2V0TGVhZGluZ0ljb25BcmlhTGFiZWw9ZnVuY3Rpb24odCl7dGhpcy5sZWFkaW5nSWNvbl8mJnRoaXMubGVhZGluZ0ljb25fLnNldEFyaWFMYWJlbCh0KX0sZS5wcm90b3R5cGUuc2V0TGVhZGluZ0ljb25Db250ZW50PWZ1bmN0aW9uKHQpe3RoaXMubGVhZGluZ0ljb25fJiZ0aGlzLmxlYWRpbmdJY29uXy5zZXRDb250ZW50KHQpfSxlLnByb3RvdHlwZS5zZXRUcmFpbGluZ0ljb25BcmlhTGFiZWw9ZnVuY3Rpb24odCl7dGhpcy50cmFpbGluZ0ljb25fJiZ0aGlzLnRyYWlsaW5nSWNvbl8uc2V0QXJpYUxhYmVsKHQpfSxlLnByb3RvdHlwZS5zZXRUcmFpbGluZ0ljb25Db250ZW50PWZ1bmN0aW9uKHQpe3RoaXMudHJhaWxpbmdJY29uXyYmdGhpcy50cmFpbGluZ0ljb25fLnNldENvbnRlbnQodCl9LGUucHJvdG90eXBlLnNldENoYXJhY3RlckNvdW50ZXJfPWZ1bmN0aW9uKHQpe2lmKHRoaXMuY2hhcmFjdGVyQ291bnRlcl8pe3ZhciBlPXRoaXMuZ2V0TmF0aXZlSW5wdXRfKCkubWF4TGVuZ3RoO2lmKC0xPT09ZSl0aHJvdyBuZXcgRXJyb3IoXCJNRENUZXh0RmllbGRGb3VuZGF0aW9uOiBFeHBlY3RlZCBtYXhsZW5ndGggaHRtbCBwcm9wZXJ0eSBvbiB0ZXh0IGlucHV0IG9yIHRleHRhcmVhLlwiKTt0aGlzLmNoYXJhY3RlckNvdW50ZXJfLnNldENvdW50ZXJWYWx1ZSh0LGUpfX0sZS5wcm90b3R5cGUuaXNCYWRJbnB1dF89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXROYXRpdmVJbnB1dF8oKS52YWxpZGl0eS5iYWRJbnB1dHx8ITF9LGUucHJvdG90eXBlLmlzTmF0aXZlSW5wdXRWYWxpZF89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXROYXRpdmVJbnB1dF8oKS52YWxpZGl0eS52YWxpZH0sZS5wcm90b3R5cGUuc3R5bGVWYWxpZGl0eV89ZnVuY3Rpb24odCl7dmFyIG49ZS5jc3NDbGFzc2VzLklOVkFMSUQ7dD90aGlzLmFkYXB0ZXJfLnJlbW92ZUNsYXNzKG4pOnRoaXMuYWRhcHRlcl8uYWRkQ2xhc3MobiksdGhpcy5oZWxwZXJUZXh0XyYmdGhpcy5oZWxwZXJUZXh0Xy5zZXRWYWxpZGl0eSh0KX0sZS5wcm90b3R5cGUuc3R5bGVGb2N1c2VkXz1mdW5jdGlvbih0KXt2YXIgbj1lLmNzc0NsYXNzZXMuRk9DVVNFRDt0P3RoaXMuYWRhcHRlcl8uYWRkQ2xhc3Mobik6dGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyhuKX0sZS5wcm90b3R5cGUuc3R5bGVEaXNhYmxlZF89ZnVuY3Rpb24odCl7dmFyIG49ZS5jc3NDbGFzc2VzLGk9bi5ESVNBQkxFRCxyPW4uSU5WQUxJRDt0Pyh0aGlzLmFkYXB0ZXJfLmFkZENsYXNzKGkpLHRoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MocikpOnRoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoaSksdGhpcy5sZWFkaW5nSWNvbl8mJnRoaXMubGVhZGluZ0ljb25fLnNldERpc2FibGVkKHQpLHRoaXMudHJhaWxpbmdJY29uXyYmdGhpcy50cmFpbGluZ0ljb25fLnNldERpc2FibGVkKHQpfSxlLnByb3RvdHlwZS5nZXROYXRpdmVJbnB1dF89ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5hZGFwdGVyXz90aGlzLmFkYXB0ZXJfLmdldE5hdGl2ZUlucHV0KCk6bnVsbCl8fHtkaXNhYmxlZDohMSxtYXhMZW5ndGg6LTEsdHlwZTpcImlucHV0XCIsdmFsaWRpdHk6e2JhZElucHV0OiExLHZhbGlkOiEwfSx2YWx1ZTpcIlwifX0sZX0oci5hKTtlLmRlZmF1bHQ9cH0sMTY5OmZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSk7dmFyIGk9bigxMCkscj1uKDE0KSxhPXtIRUxQRVJfVEVYVF9QRVJTSVNURU5UOlwibWRjLXRleHQtZmllbGQtaGVscGVyLXRleHQtLXBlcnNpc3RlbnRcIixIRUxQRVJfVEVYVF9WQUxJREFUSU9OX01TRzpcIm1kYy10ZXh0LWZpZWxkLWhlbHBlci10ZXh0LS12YWxpZGF0aW9uLW1zZ1wiLFJPT1Q6XCJtZGMtdGV4dC1maWVsZC1oZWxwZXItdGV4dFwifSxvPXtBUklBX0hJRERFTjpcImFyaWEtaGlkZGVuXCIsUk9MRTpcInJvbGVcIixST09UX1NFTEVDVE9SOlwiLlwiK2EuUk9PVH07bi5kKGUsXCJNRENUZXh0RmllbGRIZWxwZXJUZXh0Rm91bmRhdGlvblwiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIHM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXtyZXR1cm4gdC5jYWxsKHRoaXMsaS5hKHt9LGUuZGVmYXVsdEFkYXB0ZXIsbikpfHx0aGlzfXJldHVybiBpLmIoZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImNzc0NsYXNzZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzdHJpbmdzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBvfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiZGVmYXVsdEFkYXB0ZXJcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2FkZENsYXNzOmZ1bmN0aW9uKCl7fSxyZW1vdmVDbGFzczpmdW5jdGlvbigpe30saGFzQ2xhc3M6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sc2V0QXR0cjpmdW5jdGlvbigpe30scmVtb3ZlQXR0cjpmdW5jdGlvbigpe30sc2V0Q29udGVudDpmdW5jdGlvbigpe319fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnNldENvbnRlbnQ9ZnVuY3Rpb24odCl7dGhpcy5hZGFwdGVyXy5zZXRDb250ZW50KHQpfSxlLnByb3RvdHlwZS5zZXRQZXJzaXN0ZW50PWZ1bmN0aW9uKHQpe3Q/dGhpcy5hZGFwdGVyXy5hZGRDbGFzcyhhLkhFTFBFUl9URVhUX1BFUlNJU1RFTlQpOnRoaXMuYWRhcHRlcl8ucmVtb3ZlQ2xhc3MoYS5IRUxQRVJfVEVYVF9QRVJTSVNURU5UKX0sZS5wcm90b3R5cGUuc2V0VmFsaWRhdGlvbj1mdW5jdGlvbih0KXt0P3RoaXMuYWRhcHRlcl8uYWRkQ2xhc3MoYS5IRUxQRVJfVEVYVF9WQUxJREFUSU9OX01TRyk6dGhpcy5hZGFwdGVyXy5yZW1vdmVDbGFzcyhhLkhFTFBFUl9URVhUX1ZBTElEQVRJT05fTVNHKX0sZS5wcm90b3R5cGUuc2hvd1RvU2NyZWVuUmVhZGVyPWZ1bmN0aW9uKCl7dGhpcy5hZGFwdGVyXy5yZW1vdmVBdHRyKG8uQVJJQV9ISURERU4pfSxlLnByb3RvdHlwZS5zZXRWYWxpZGl0eT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmFkYXB0ZXJfLmhhc0NsYXNzKGEuSEVMUEVSX1RFWFRfUEVSU0lTVEVOVCksbj10aGlzLmFkYXB0ZXJfLmhhc0NsYXNzKGEuSEVMUEVSX1RFWFRfVkFMSURBVElPTl9NU0cpJiYhdDtuP3RoaXMuYWRhcHRlcl8uc2V0QXR0cihvLlJPTEUsXCJhbGVydFwiKTp0aGlzLmFkYXB0ZXJfLnJlbW92ZUF0dHIoby5ST0xFKSxlfHxufHx0aGlzLmhpZGVfKCl9LGUucHJvdG90eXBlLmhpZGVfPWZ1bmN0aW9uKCl7dGhpcy5hZGFwdGVyXy5zZXRBdHRyKG8uQVJJQV9ISURERU4sXCJ0cnVlXCIpfSxlfShyLmEpO2UuZGVmYXVsdD1zfSwxNzA6ZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24ucihlKTt2YXIgaT1uKDEwKSxyPW4oMTQpLGE9e0lDT05fRVZFTlQ6XCJNRENUZXh0RmllbGQ6aWNvblwiLElDT05fUk9MRTpcImJ1dHRvblwifSxvPXtST09UOlwibWRjLXRleHQtZmllbGRfX2ljb25cIn07bi5kKGUsXCJNRENUZXh0RmllbGRJY29uRm91bmRhdGlvblwiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIHM9W1wiY2xpY2tcIixcImtleWRvd25cIl0sbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciByPXQuY2FsbCh0aGlzLGkuYSh7fSxlLmRlZmF1bHRBZGFwdGVyLG4pKXx8dGhpcztyZXR1cm4gci5zYXZlZFRhYkluZGV4Xz1udWxsLHIuaW50ZXJhY3Rpb25IYW5kbGVyXz1mdW5jdGlvbih0KXtyZXR1cm4gci5oYW5kbGVJbnRlcmFjdGlvbih0KX0scn1yZXR1cm4gaS5iKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzdHJpbmdzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBhfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiY3NzQ2xhc3Nlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImRlZmF1bHRBZGFwdGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybntnZXRBdHRyOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LHNldEF0dHI6ZnVuY3Rpb24oKXt9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oKXt9LHNldENvbnRlbnQ6ZnVuY3Rpb24oKXt9LHJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxkZXJlZ2lzdGVySW50ZXJhY3Rpb25IYW5kbGVyOmZ1bmN0aW9uKCl7fSxub3RpZnlJY29uQWN0aW9uOmZ1bmN0aW9uKCl7fX19LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5zYXZlZFRhYkluZGV4Xz10aGlzLmFkYXB0ZXJfLmdldEF0dHIoXCJ0YWJpbmRleFwiKSxzLmZvckVhY2goZnVuY3Rpb24oZSl7dC5hZGFwdGVyXy5yZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcihlLHQuaW50ZXJhY3Rpb25IYW5kbGVyXyl9KX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuYWRhcHRlcl8uZGVyZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcihlLHQuaW50ZXJhY3Rpb25IYW5kbGVyXyl9KX0sZS5wcm90b3R5cGUuc2V0RGlzYWJsZWQ9ZnVuY3Rpb24odCl7dGhpcy5zYXZlZFRhYkluZGV4XyYmKHQ/KHRoaXMuYWRhcHRlcl8uc2V0QXR0cihcInRhYmluZGV4XCIsXCItMVwiKSx0aGlzLmFkYXB0ZXJfLnJlbW92ZUF0dHIoXCJyb2xlXCIpKToodGhpcy5hZGFwdGVyXy5zZXRBdHRyKFwidGFiaW5kZXhcIix0aGlzLnNhdmVkVGFiSW5kZXhfKSx0aGlzLmFkYXB0ZXJfLnNldEF0dHIoXCJyb2xlXCIsYS5JQ09OX1JPTEUpKSl9LGUucHJvdG90eXBlLnNldEFyaWFMYWJlbD1mdW5jdGlvbih0KXt0aGlzLmFkYXB0ZXJfLnNldEF0dHIoXCJhcmlhLWxhYmVsXCIsdCl9LGUucHJvdG90eXBlLnNldENvbnRlbnQ9ZnVuY3Rpb24odCl7dGhpcy5hZGFwdGVyXy5zZXRDb250ZW50KHQpfSxlLnByb3RvdHlwZS5oYW5kbGVJbnRlcmFjdGlvbj1mdW5jdGlvbih0KXt2YXIgZT1cIkVudGVyXCI9PT10LmtleXx8MTM9PT10LmtleUNvZGU7KFwiY2xpY2tcIj09PXQudHlwZXx8ZSkmJnRoaXMuYWRhcHRlcl8ubm90aWZ5SWNvbkFjdGlvbigpfSxlfShyLmEpO2UuZGVmYXVsdD1sfSwzMzpmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1ufSwzNDpmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1pfSwzNTpmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1yfX0pfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZXh0LWZpZWxkLmpzLm1hcCIsIlxudmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdGV4dC1maWVsZC5jc3NcIik7XG5cbmlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXG52YXIgdHJhbnNmb3JtO1xudmFyIGluc2VydEludG87XG5cblxuXG52YXIgb3B0aW9ucyA9IHtcImhtclwiOnRydWV9XG5cbm9wdGlvbnMudHJhbnNmb3JtID0gdHJhbnNmb3JtXG5vcHRpb25zLmluc2VydEludG8gPSB1bmRlZmluZWQ7XG5cbnZhciB1cGRhdGUgPSByZXF1aXJlKFwiIS4uLy4uLy4uL3N0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzLmpzXCIpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5pZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2FscztcblxuaWYobW9kdWxlLmhvdCkge1xuXHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3RleHQtZmllbGQuY3NzXCIsIGZ1bmN0aW9uKCkge1xuXHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3RleHQtZmllbGQuY3NzXCIpO1xuXG5cdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cblx0XHR2YXIgbG9jYWxzID0gKGZ1bmN0aW9uKGEsIGIpIHtcblx0XHRcdHZhciBrZXksIGlkeCA9IDA7XG5cblx0XHRcdGZvcihrZXkgaW4gYSkge1xuXHRcdFx0XHRpZighYiB8fCBhW2tleV0gIT09IGJba2V5XSkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRpZHgrKztcblx0XHRcdH1cblxuXHRcdFx0Zm9yKGtleSBpbiBiKSBpZHgtLTtcblxuXHRcdFx0cmV0dXJuIGlkeCA9PT0gMDtcblx0XHR9KGNvbnRlbnQubG9jYWxzLCBuZXdDb250ZW50LmxvY2FscykpO1xuXG5cdFx0aWYoIWxvY2FscykgdGhyb3cgbmV3IEVycm9yKCdBYm9ydGluZyBDU1MgSE1SIGR1ZSB0byBjaGFuZ2VkIGNzcy1tb2R1bGVzIGxvY2Fscy4nKTtcblxuXHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0fSk7XG5cblx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG59IiwidmFyIGNvbm5lY3Rpb25TdG9yZSA9IG5ldyBXZWFrTWFwKCk7XG52YXIgSVRFUkFUSU9OX0tFWSA9IFN5bWJvbCgnaXRlcmF0aW9uIGtleScpO1xuXG5mdW5jdGlvbiBzdG9yZU9ic2VydmFibGUob2JqKSB7XG4gIC8vIHRoaXMgd2lsbCBiZSB1c2VkIHRvIHNhdmUgKG9iai5rZXkgLT4gcmVhY3Rpb24pIGNvbm5lY3Rpb25zIGxhdGVyXG4gIGNvbm5lY3Rpb25TdG9yZS5zZXQob2JqLCBuZXcgTWFwKCkpO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlclJlYWN0aW9uRm9yT3BlcmF0aW9uKHJlYWN0aW9uLCByZWYpIHtcbiAgdmFyIHRhcmdldCA9IHJlZi50YXJnZXQ7XG4gIHZhciBrZXkgPSByZWYua2V5O1xuICB2YXIgdHlwZSA9IHJlZi50eXBlO1xuXG4gIGlmICh0eXBlID09PSAnaXRlcmF0ZScpIHtcbiAgICBrZXkgPSBJVEVSQVRJT05fS0VZO1xuICB9XG5cbiAgdmFyIHJlYWN0aW9uc0Zvck9iaiA9IGNvbm5lY3Rpb25TdG9yZS5nZXQodGFyZ2V0KTtcbiAgdmFyIHJlYWN0aW9uc0ZvcktleSA9IHJlYWN0aW9uc0Zvck9iai5nZXQoa2V5KTtcbiAgaWYgKCFyZWFjdGlvbnNGb3JLZXkpIHtcbiAgICByZWFjdGlvbnNGb3JLZXkgPSBuZXcgU2V0KCk7XG4gICAgcmVhY3Rpb25zRm9yT2JqLnNldChrZXksIHJlYWN0aW9uc0ZvcktleSk7XG4gIH1cbiAgLy8gc2F2ZSB0aGUgZmFjdCB0aGF0IHRoZSBrZXkgaXMgdXNlZCBieSB0aGUgcmVhY3Rpb24gZHVyaW5nIGl0cyBjdXJyZW50IHJ1blxuICBpZiAoIXJlYWN0aW9uc0ZvcktleS5oYXMocmVhY3Rpb24pKSB7XG4gICAgcmVhY3Rpb25zRm9yS2V5LmFkZChyZWFjdGlvbik7XG4gICAgcmVhY3Rpb24uY2xlYW5lcnMucHVzaChyZWFjdGlvbnNGb3JLZXkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlYWN0aW9uc0Zvck9wZXJhdGlvbihyZWYpIHtcbiAgdmFyIHRhcmdldCA9IHJlZi50YXJnZXQ7XG4gIHZhciBrZXkgPSByZWYua2V5O1xuICB2YXIgdHlwZSA9IHJlZi50eXBlO1xuXG4gIHZhciByZWFjdGlvbnNGb3JUYXJnZXQgPSBjb25uZWN0aW9uU3RvcmUuZ2V0KHRhcmdldCk7XG4gIHZhciByZWFjdGlvbnNGb3JLZXkgPSBuZXcgU2V0KCk7XG5cbiAgaWYgKHR5cGUgPT09ICdjbGVhcicpIHtcbiAgICByZWFjdGlvbnNGb3JUYXJnZXQuZm9yRWFjaChmdW5jdGlvbiAoXywga2V5KSB7XG4gICAgICBhZGRSZWFjdGlvbnNGb3JLZXkocmVhY3Rpb25zRm9yS2V5LCByZWFjdGlvbnNGb3JUYXJnZXQsIGtleSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgYWRkUmVhY3Rpb25zRm9yS2V5KHJlYWN0aW9uc0ZvcktleSwgcmVhY3Rpb25zRm9yVGFyZ2V0LCBrZXkpO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09ICdhZGQnIHx8IHR5cGUgPT09ICdkZWxldGUnIHx8IHR5cGUgPT09ICdjbGVhcicpIHtcbiAgICB2YXIgaXRlcmF0aW9uS2V5ID0gQXJyYXkuaXNBcnJheSh0YXJnZXQpID8gJ2xlbmd0aCcgOiBJVEVSQVRJT05fS0VZO1xuICAgIGFkZFJlYWN0aW9uc0ZvcktleShyZWFjdGlvbnNGb3JLZXksIHJlYWN0aW9uc0ZvclRhcmdldCwgaXRlcmF0aW9uS2V5KTtcbiAgfVxuXG4gIHJldHVybiByZWFjdGlvbnNGb3JLZXk7XG59XG5cbmZ1bmN0aW9uIGFkZFJlYWN0aW9uc0ZvcktleShyZWFjdGlvbnNGb3JLZXksIHJlYWN0aW9uc0ZvclRhcmdldCwga2V5KSB7XG4gIHZhciByZWFjdGlvbnMgPSByZWFjdGlvbnNGb3JUYXJnZXQuZ2V0KGtleSk7XG4gIHJlYWN0aW9ucyAmJiByZWFjdGlvbnMuZm9yRWFjaChyZWFjdGlvbnNGb3JLZXkuYWRkLCByZWFjdGlvbnNGb3JLZXkpO1xufVxuXG5mdW5jdGlvbiByZWxlYXNlUmVhY3Rpb24ocmVhY3Rpb24pIHtcbiAgaWYgKHJlYWN0aW9uLmNsZWFuZXJzKSB7XG4gICAgcmVhY3Rpb24uY2xlYW5lcnMuZm9yRWFjaChyZWxlYXNlUmVhY3Rpb25LZXlDb25uZWN0aW9uLCByZWFjdGlvbik7XG4gIH1cbiAgcmVhY3Rpb24uY2xlYW5lcnMgPSBbXTtcbn1cblxuZnVuY3Rpb24gcmVsZWFzZVJlYWN0aW9uS2V5Q29ubmVjdGlvbihyZWFjdGlvbnNGb3JLZXkpIHtcbiAgcmVhY3Rpb25zRm9yS2V5LmRlbGV0ZSh0aGlzKTtcbn1cblxuLy8gcmVhY3Rpb25zIGNhbiBjYWxsIGVhY2ggb3RoZXIgYW5kIGZvcm0gYSBjYWxsIHN0YWNrXG52YXIgcmVhY3Rpb25TdGFjayA9IFtdO1xudmFyIGlzRGVidWdnaW5nID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHJ1bkFzUmVhY3Rpb24ocmVhY3Rpb24sIGZuLCBjb250ZXh0LCBhcmdzKSB7XG4gIC8vIGRvIG5vdCBidWlsZCByZWFjdGl2ZSByZWxhdGlvbnMsIGlmIHRoZSByZWFjdGlvbiBpcyB1bm9ic2VydmVkXG4gIGlmIChyZWFjdGlvbi51bm9ic2VydmVkKSB7XG4gICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkoZm4sIGNvbnRleHQsIGFyZ3MpO1xuICB9XG5cbiAgLy8gb25seSBydW4gdGhlIHJlYWN0aW9uIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGluIHRoZSByZWFjdGlvbiBzdGFja1xuICAvLyBUT0RPOiBpbXByb3ZlIHRoaXMgdG8gYWxsb3cgZXhwbGljaXRseSByZWN1cnNpdmUgcmVhY3Rpb25zXG4gIGlmIChyZWFjdGlvblN0YWNrLmluZGV4T2YocmVhY3Rpb24pID09PSAtMSkge1xuICAgIC8vIHJlbGVhc2UgdGhlIChvYmogLT4ga2V5IC0+IHJlYWN0aW9ucykgY29ubmVjdGlvbnNcbiAgICAvLyBhbmQgcmVzZXQgdGhlIGNsZWFuZXIgY29ubmVjdGlvbnNcbiAgICByZWxlYXNlUmVhY3Rpb24ocmVhY3Rpb24pO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIHNldCB0aGUgcmVhY3Rpb24gYXMgdGhlIGN1cnJlbnRseSBydW5uaW5nIG9uZVxuICAgICAgLy8gdGhpcyBpcyByZXF1aXJlZCBzbyB0aGF0IHdlIGNhbiBjcmVhdGUgKG9ic2VydmFibGUucHJvcCAtPiByZWFjdGlvbikgcGFpcnMgaW4gdGhlIGdldCB0cmFwXG4gICAgICByZWFjdGlvblN0YWNrLnB1c2gocmVhY3Rpb24pO1xuICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkoZm4sIGNvbnRleHQsIGFyZ3MpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBhbHdheXMgcmVtb3ZlIHRoZSBjdXJyZW50bHkgcnVubmluZyBmbGFnIGZyb20gdGhlIHJlYWN0aW9uIHdoZW4gaXQgc3RvcHMgZXhlY3V0aW9uXG4gICAgICByZWFjdGlvblN0YWNrLnBvcCgpO1xuICAgIH1cbiAgfVxufVxuXG4vLyByZWdpc3RlciB0aGUgY3VycmVudGx5IHJ1bm5pbmcgcmVhY3Rpb24gdG8gYmUgcXVldWVkIGFnYWluIG9uIG9iai5rZXkgbXV0YXRpb25zXG5mdW5jdGlvbiByZWdpc3RlclJ1bm5pbmdSZWFjdGlvbkZvck9wZXJhdGlvbihvcGVyYXRpb24pIHtcbiAgLy8gZ2V0IHRoZSBjdXJyZW50IHJlYWN0aW9uIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2tcbiAgdmFyIHJ1bm5pbmdSZWFjdGlvbiA9IHJlYWN0aW9uU3RhY2tbcmVhY3Rpb25TdGFjay5sZW5ndGggLSAxXTtcbiAgaWYgKHJ1bm5pbmdSZWFjdGlvbikge1xuICAgIGRlYnVnT3BlcmF0aW9uKHJ1bm5pbmdSZWFjdGlvbiwgb3BlcmF0aW9uKTtcbiAgICByZWdpc3RlclJlYWN0aW9uRm9yT3BlcmF0aW9uKHJ1bm5pbmdSZWFjdGlvbiwgb3BlcmF0aW9uKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBxdWV1ZVJlYWN0aW9uc0Zvck9wZXJhdGlvbihvcGVyYXRpb24pIHtcbiAgLy8gaXRlcmF0ZSBhbmQgcXVldWUgZXZlcnkgcmVhY3Rpb24sIHdoaWNoIGlzIHRyaWdnZXJlZCBieSBvYmoua2V5IG11dGF0aW9uXG4gIGdldFJlYWN0aW9uc0Zvck9wZXJhdGlvbihvcGVyYXRpb24pLmZvckVhY2gocXVldWVSZWFjdGlvbiwgb3BlcmF0aW9uKTtcbn1cblxuZnVuY3Rpb24gcXVldWVSZWFjdGlvbihyZWFjdGlvbikge1xuICBkZWJ1Z09wZXJhdGlvbihyZWFjdGlvbiwgdGhpcyk7XG4gIC8vIHF1ZXVlIHRoZSByZWFjdGlvbiBmb3IgbGF0ZXIgZXhlY3V0aW9uIG9yIHJ1biBpdCBpbW1lZGlhdGVseVxuICBpZiAodHlwZW9mIHJlYWN0aW9uLnNjaGVkdWxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJlYWN0aW9uLnNjaGVkdWxlcihyZWFjdGlvbik7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHJlYWN0aW9uLnNjaGVkdWxlciA9PT0gJ29iamVjdCcpIHtcbiAgICByZWFjdGlvbi5zY2hlZHVsZXIuYWRkKHJlYWN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICByZWFjdGlvbigpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlYnVnT3BlcmF0aW9uKHJlYWN0aW9uLCBvcGVyYXRpb24pIHtcbiAgaWYgKHJlYWN0aW9uLmRlYnVnZ2VyICYmICFpc0RlYnVnZ2luZykge1xuICAgIHRyeSB7XG4gICAgICBpc0RlYnVnZ2luZyA9IHRydWU7XG4gICAgICByZWFjdGlvbi5kZWJ1Z2dlcihvcGVyYXRpb24pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpc0RlYnVnZ2luZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNSdW5uaW5nUmVhY3Rpb24oKSB7XG4gIHJldHVybiByZWFjdGlvblN0YWNrLmxlbmd0aCA+IDA7XG59XG5cbnZhciBJU19SRUFDVElPTiA9IFN5bWJvbCgnaXMgcmVhY3Rpb24nKTtcblxuZnVuY3Rpb24gb2JzZXJ2ZShmbiwgb3B0aW9ucykge1xuICBpZiAoIG9wdGlvbnMgPT09IHZvaWQgMCApIG9wdGlvbnMgPSB7fTtcblxuICAvLyB3cmFwIHRoZSBwYXNzZWQgZnVuY3Rpb24gaW4gYSByZWFjdGlvbiwgaWYgaXQgaXMgbm90IGFscmVhZHkgb25lXG4gIHZhciByZWFjdGlvbiA9IGZuW0lTX1JFQUNUSU9OXSA/IGZuIDogZnVuY3Rpb24gcmVhY3Rpb24oKSB7XG4gICAgcmV0dXJuIHJ1bkFzUmVhY3Rpb24ocmVhY3Rpb24sIGZuLCB0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xuICAvLyBzYXZlIHRoZSBzY2hlZHVsZXIgYW5kIGRlYnVnZ2VyIG9uIHRoZSByZWFjdGlvblxuICByZWFjdGlvbi5zY2hlZHVsZXIgPSBvcHRpb25zLnNjaGVkdWxlcjtcbiAgcmVhY3Rpb24uZGVidWdnZXIgPSBvcHRpb25zLmRlYnVnZ2VyO1xuICAvLyBzYXZlIHRoZSBmYWN0IHRoYXQgdGhpcyBpcyBhIHJlYWN0aW9uXG4gIHJlYWN0aW9uW0lTX1JFQUNUSU9OXSA9IHRydWU7XG4gIC8vIHJ1biB0aGUgcmVhY3Rpb24gb25jZSBpZiBpdCBpcyBub3QgYSBsYXp5IG9uZVxuICBpZiAoIW9wdGlvbnMubGF6eSkge1xuICAgIHJlYWN0aW9uKCk7XG4gIH1cbiAgcmV0dXJuIHJlYWN0aW9uO1xufVxuXG5mdW5jdGlvbiB1bm9ic2VydmUocmVhY3Rpb24pIHtcbiAgLy8gZG8gbm90aGluZywgaWYgdGhlIHJlYWN0aW9uIGlzIGFscmVhZHkgdW5vYnNlcnZlZFxuICBpZiAoIXJlYWN0aW9uLnVub2JzZXJ2ZWQpIHtcbiAgICAvLyBpbmRpY2F0ZSB0aGF0IHRoZSByZWFjdGlvbiBzaG91bGQgbm90IGJlIHRyaWdnZXJlZCBhbnkgbW9yZVxuICAgIHJlYWN0aW9uLnVub2JzZXJ2ZWQgPSB0cnVlO1xuICAgIC8vIHJlbGVhc2UgKG9iaiAtPiBrZXkgLT4gcmVhY3Rpb24pIGNvbm5lY3Rpb25zXG4gICAgcmVsZWFzZVJlYWN0aW9uKHJlYWN0aW9uKTtcbiAgfVxuICAvLyB1bnNjaGVkdWxlIHRoZSByZWFjdGlvbiwgaWYgaXQgaXMgc2NoZWR1bGVkXG4gIGlmICh0eXBlb2YgcmVhY3Rpb24uc2NoZWR1bGVyID09PSAnb2JqZWN0Jykge1xuICAgIHJlYWN0aW9uLnNjaGVkdWxlci5kZWxldGUocmVhY3Rpb24pO1xuICB9XG59XG5cbnZhciBwcm94eVRvUmF3ID0gbmV3IFdlYWtNYXAoKTtcbnZhciByYXdUb1Byb3h5ID0gbmV3IFdlYWtNYXAoKTtcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gZmluZE9ic2VydmFibGUob2JqKSB7XG4gIHZhciBvYnNlcnZhYmxlT2JqID0gcmF3VG9Qcm94eS5nZXQob2JqKTtcbiAgaWYgKGhhc1J1bm5pbmdSZWFjdGlvbigpICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCkge1xuICAgIGlmIChvYnNlcnZhYmxlT2JqKSB7XG4gICAgICByZXR1cm4gb2JzZXJ2YWJsZU9iajtcbiAgICB9XG4gICAgcmV0dXJuIG9ic2VydmFibGUob2JqKTtcbiAgfVxuICByZXR1cm4gb2JzZXJ2YWJsZU9iaiB8fCBvYmo7XG59XG5cbmZ1bmN0aW9uIHBhdGNoSXRlcmF0b3IoaXRlcmF0b3IsIGlzRW50cmllcykge1xuICB2YXIgb3JpZ2luYWxOZXh0ID0gaXRlcmF0b3IubmV4dDtcbiAgaXRlcmF0b3IubmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVmID0gb3JpZ2luYWxOZXh0LmNhbGwoaXRlcmF0b3IpO1xuICAgIHZhciBkb25lID0gcmVmLmRvbmU7XG4gICAgdmFyIHZhbHVlID0gcmVmLnZhbHVlO1xuICAgIGlmICghZG9uZSkge1xuICAgICAgaWYgKGlzRW50cmllcykge1xuICAgICAgICB2YWx1ZVsxXSA9IGZpbmRPYnNlcnZhYmxlKHZhbHVlWzFdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gZmluZE9ic2VydmFibGUodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBkb25lOiBkb25lLCB2YWx1ZTogdmFsdWUgfTtcbiAgfTtcbiAgcmV0dXJuIGl0ZXJhdG9yO1xufVxuXG52YXIgaW5zdHJ1bWVudGF0aW9ucyA9IHtcbiAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgdmFyIHRhcmdldCA9IHByb3h5VG9SYXcuZ2V0KHRoaXMpO1xuICAgIHZhciBwcm90byA9IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7XG4gICAgcmVnaXN0ZXJSdW5uaW5nUmVhY3Rpb25Gb3JPcGVyYXRpb24oeyB0YXJnZXQ6IHRhcmdldCwga2V5OiBrZXksIHR5cGU6ICdoYXMnIH0pO1xuICAgIHJldHVybiBwcm90by5oYXMuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpO1xuICB9LFxuICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICB2YXIgdGFyZ2V0ID0gcHJveHlUb1Jhdy5nZXQodGhpcyk7XG4gICAgdmFyIHByb3RvID0gUmVmbGVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTtcbiAgICByZWdpc3RlclJ1bm5pbmdSZWFjdGlvbkZvck9wZXJhdGlvbih7IHRhcmdldDogdGFyZ2V0LCBrZXk6IGtleSwgdHlwZTogJ2dldCcgfSk7XG4gICAgcmV0dXJuIGZpbmRPYnNlcnZhYmxlKHByb3RvLmdldC5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cykpO1xuICB9LFxuICBhZGQ6IGZ1bmN0aW9uIGFkZChrZXkpIHtcbiAgICB2YXIgdGFyZ2V0ID0gcHJveHlUb1Jhdy5nZXQodGhpcyk7XG4gICAgdmFyIHByb3RvID0gUmVmbGVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTtcbiAgICB2YXIgaGFkS2V5ID0gcHJvdG8uaGFzLmNhbGwodGFyZ2V0LCBrZXkpO1xuICAgIC8vIGZvcndhcmQgdGhlIG9wZXJhdGlvbiBiZWZvcmUgcXVldWVpbmcgcmVhY3Rpb25zXG4gICAgdmFyIHJlc3VsdCA9IHByb3RvLmFkZC5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cyk7XG4gICAgaWYgKCFoYWRLZXkpIHtcbiAgICAgIHF1ZXVlUmVhY3Rpb25zRm9yT3BlcmF0aW9uKHsgdGFyZ2V0OiB0YXJnZXQsIGtleToga2V5LCB2YWx1ZToga2V5LCB0eXBlOiAnYWRkJyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIHZhciB0YXJnZXQgPSBwcm94eVRvUmF3LmdldCh0aGlzKTtcbiAgICB2YXIgcHJvdG8gPSBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO1xuICAgIHZhciBoYWRLZXkgPSBwcm90by5oYXMuY2FsbCh0YXJnZXQsIGtleSk7XG4gICAgdmFyIG9sZFZhbHVlID0gcHJvdG8uZ2V0LmNhbGwodGFyZ2V0LCBrZXkpO1xuICAgIC8vIGZvcndhcmQgdGhlIG9wZXJhdGlvbiBiZWZvcmUgcXVldWVpbmcgcmVhY3Rpb25zXG4gICAgdmFyIHJlc3VsdCA9IHByb3RvLnNldC5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cyk7XG4gICAgaWYgKCFoYWRLZXkpIHtcbiAgICAgIHF1ZXVlUmVhY3Rpb25zRm9yT3BlcmF0aW9uKHsgdGFyZ2V0OiB0YXJnZXQsIGtleToga2V5LCB2YWx1ZTogdmFsdWUsIHR5cGU6ICdhZGQnIH0pO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IG9sZFZhbHVlKSB7XG4gICAgICBxdWV1ZVJlYWN0aW9uc0Zvck9wZXJhdGlvbih7IHRhcmdldDogdGFyZ2V0LCBrZXk6IGtleSwgdmFsdWU6IHZhbHVlLCBvbGRWYWx1ZTogb2xkVmFsdWUsIHR5cGU6ICdzZXQnIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LFxuICBkZWxldGU6IGZ1bmN0aW9uIGRlbGV0ZSQxKGtleSkge1xuICAgIHZhciB0YXJnZXQgPSBwcm94eVRvUmF3LmdldCh0aGlzKTtcbiAgICB2YXIgcHJvdG8gPSBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO1xuICAgIHZhciBoYWRLZXkgPSBwcm90by5oYXMuY2FsbCh0YXJnZXQsIGtleSk7XG4gICAgdmFyIG9sZFZhbHVlID0gcHJvdG8uZ2V0ID8gcHJvdG8uZ2V0LmNhbGwodGFyZ2V0LCBrZXkpIDogdW5kZWZpbmVkO1xuICAgIC8vIGZvcndhcmQgdGhlIG9wZXJhdGlvbiBiZWZvcmUgcXVldWVpbmcgcmVhY3Rpb25zXG4gICAgdmFyIHJlc3VsdCA9IHByb3RvLmRlbGV0ZS5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGhhZEtleSkge1xuICAgICAgcXVldWVSZWFjdGlvbnNGb3JPcGVyYXRpb24oeyB0YXJnZXQ6IHRhcmdldCwga2V5OiBrZXksIG9sZFZhbHVlOiBvbGRWYWx1ZSwgdHlwZTogJ2RlbGV0ZScgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG4gIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICB2YXIgdGFyZ2V0ID0gcHJveHlUb1Jhdy5nZXQodGhpcyk7XG4gICAgdmFyIHByb3RvID0gUmVmbGVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTtcbiAgICB2YXIgaGFkSXRlbXMgPSB0YXJnZXQuc2l6ZSAhPT0gMDtcbiAgICB2YXIgb2xkVGFyZ2V0ID0gdGFyZ2V0IGluc3RhbmNlb2YgTWFwID8gbmV3IE1hcCh0YXJnZXQpIDogbmV3IFNldCh0YXJnZXQpO1xuICAgIC8vIGZvcndhcmQgdGhlIG9wZXJhdGlvbiBiZWZvcmUgcXVldWVpbmcgcmVhY3Rpb25zXG4gICAgdmFyIHJlc3VsdCA9IHByb3RvLmNsZWFyLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTtcbiAgICBpZiAoaGFkSXRlbXMpIHtcbiAgICAgIHF1ZXVlUmVhY3Rpb25zRm9yT3BlcmF0aW9uKHsgdGFyZ2V0OiB0YXJnZXQsIG9sZFRhcmdldDogb2xkVGFyZ2V0LCB0eXBlOiAnY2xlYXInIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LFxuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNiKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKCBsZW4tLSA+IDAgKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuICsgMSBdO1xuXG4gICAgdmFyIHRhcmdldCA9IHByb3h5VG9SYXcuZ2V0KHRoaXMpO1xuICAgIHZhciBwcm90byA9IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7XG4gICAgcmVnaXN0ZXJSdW5uaW5nUmVhY3Rpb25Gb3JPcGVyYXRpb24oeyB0YXJnZXQ6IHRhcmdldCwgdHlwZTogJ2l0ZXJhdGUnIH0pO1xuICAgIC8vIHN3YXAgb3V0IHRoZSByYXcgdmFsdWVzIHdpdGggdGhlaXIgb2JzZXJ2YWJsZSBwYWlyc1xuICAgIC8vIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlIGNhbGxiYWNrXG4gICAgdmFyIHdyYXBwZWRDYiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgdmFyIHJlc3QgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICB3aGlsZSAoIGxlbi0tID4gMCApIHJlc3RbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gKyAxIF07XG5cbiAgICAgIHJldHVybiBjYi5hcHBseSh2b2lkIDAsIFsgZmluZE9ic2VydmFibGUodmFsdWUpIF0uY29uY2F0KCByZXN0ICkpO1xuICAgIH07XG4gICAgcmV0dXJuIChyZWYgPSBwcm90by5mb3JFYWNoKS5jYWxsLmFwcGx5KHJlZiwgWyB0YXJnZXQsIHdyYXBwZWRDYiBdLmNvbmNhdCggYXJncyApKTtcbiAgICB2YXIgcmVmO1xuICB9LFxuICBrZXlzOiBmdW5jdGlvbiBrZXlzKCkge1xuICAgIHZhciB0YXJnZXQgPSBwcm94eVRvUmF3LmdldCh0aGlzKTtcbiAgICB2YXIgcHJvdG8gPSBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO1xuICAgIHJlZ2lzdGVyUnVubmluZ1JlYWN0aW9uRm9yT3BlcmF0aW9uKHsgdGFyZ2V0OiB0YXJnZXQsIHR5cGU6ICdpdGVyYXRlJyB9KTtcbiAgICByZXR1cm4gcHJvdG8ua2V5cy5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cyk7XG4gIH0sXG4gIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKCkge1xuICAgIHZhciB0YXJnZXQgPSBwcm94eVRvUmF3LmdldCh0aGlzKTtcbiAgICB2YXIgcHJvdG8gPSBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO1xuICAgIHJlZ2lzdGVyUnVubmluZ1JlYWN0aW9uRm9yT3BlcmF0aW9uKHsgdGFyZ2V0OiB0YXJnZXQsIHR5cGU6ICdpdGVyYXRlJyB9KTtcbiAgICB2YXIgaXRlcmF0b3IgPSBwcm90by52YWx1ZXMuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpO1xuICAgIHJldHVybiBwYXRjaEl0ZXJhdG9yKGl0ZXJhdG9yLCBmYWxzZSk7XG4gIH0sXG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoKSB7XG4gICAgdmFyIHRhcmdldCA9IHByb3h5VG9SYXcuZ2V0KHRoaXMpO1xuICAgIHZhciBwcm90byA9IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7XG4gICAgcmVnaXN0ZXJSdW5uaW5nUmVhY3Rpb25Gb3JPcGVyYXRpb24oeyB0YXJnZXQ6IHRhcmdldCwgdHlwZTogJ2l0ZXJhdGUnIH0pO1xuICAgIHZhciBpdGVyYXRvciA9IHByb3RvLmVudHJpZXMuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpO1xuICAgIHJldHVybiBwYXRjaEl0ZXJhdG9yKGl0ZXJhdG9yLCB0cnVlKTtcbiAgfSxcbiAgZ2V0IHNpemUoKSB7XG4gICAgdmFyIHRhcmdldCA9IHByb3h5VG9SYXcuZ2V0KHRoaXMpO1xuICAgIHZhciBwcm90byA9IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7XG4gICAgcmVnaXN0ZXJSdW5uaW5nUmVhY3Rpb25Gb3JPcGVyYXRpb24oeyB0YXJnZXQ6IHRhcmdldCwgdHlwZTogJ2l0ZXJhdGUnIH0pO1xuICAgIHJldHVybiBSZWZsZWN0LmdldChwcm90bywgJ3NpemUnLCB0YXJnZXQpO1xuICB9XG59O1xuaW5zdHJ1bWVudGF0aW9uc1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0YXJnZXQgPSBwcm94eVRvUmF3LmdldCh0aGlzKTtcbiAgICB2YXIgcHJvdG8gPSBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO1xuICAgIHJlZ2lzdGVyUnVubmluZ1JlYWN0aW9uRm9yT3BlcmF0aW9uKHsgdGFyZ2V0OiB0YXJnZXQsIHR5cGU6ICdpdGVyYXRlJyB9KTtcbiAgICB2YXIgaXRlcmF0b3IgPSBwcm90b1tTeW1ib2wuaXRlcmF0b3JdLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gcGF0Y2hJdGVyYXRvcihpdGVyYXRvciwgdGFyZ2V0IGluc3RhbmNlb2YgTWFwKTtcbiAgfTtcblxudmFyIGNvbGxlY3Rpb25IYW5kbGVycyA9IHtcbiAgZ2V0OiBmdW5jdGlvbiBnZXQodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSB7XG4gICAgLy8gaW5zdHJ1bWVudCBtZXRob2RzIGFuZCBwcm9wZXJ0eSBhY2Nlc3NvcnMgdG8gYmUgcmVhY3RpdmVcbiAgICB0YXJnZXQgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKGluc3RydW1lbnRhdGlvbnMsIGtleSkgPyBpbnN0cnVtZW50YXRpb25zIDogdGFyZ2V0O1xuICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpO1xuICB9XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbnZhciBnbG9iYWxPYmogPSB0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JyA/IHdpbmRvdyA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbi8vIGJ1aWx0LWluIG9iamVjdCBjYW4gbm90IGJlIHdyYXBwZWQgYnkgUHJveGllc1xuLy8gdGhlaXIgbWV0aG9kcyBleHBlY3QgdGhlIG9iamVjdCBpbnN0YW5jZSBhcyB0aGUgJ3RoaXMnIGluc3RlYWQgb2YgdGhlIFByb3h5IHdyYXBwZXJcbi8vIGNvbXBsZXggb2JqZWN0cyBhcmUgd3JhcHBlZCB3aXRoIGEgUHJveHkgb2YgaW5zdHJ1bWVudGVkIG1ldGhvZHNcbi8vIHdoaWNoIHN3aXRjaCB0aGUgcHJveHkgdG8gdGhlIHJhdyBvYmplY3QgYW5kIHRvIGFkZCByZWFjdGl2ZSB3aXJpbmdcbnZhciBoYW5kbGVycyA9IG5ldyBNYXAoW1tNYXAsIGNvbGxlY3Rpb25IYW5kbGVyc10sIFtTZXQsIGNvbGxlY3Rpb25IYW5kbGVyc10sIFtXZWFrTWFwLCBjb2xsZWN0aW9uSGFuZGxlcnNdLCBbV2Vha1NldCwgY29sbGVjdGlvbkhhbmRsZXJzXSwgW09iamVjdCwgZmFsc2VdLCBbQXJyYXksIGZhbHNlXSwgW0ludDhBcnJheSwgZmFsc2VdLCBbVWludDhBcnJheSwgZmFsc2VdLCBbVWludDhDbGFtcGVkQXJyYXksIGZhbHNlXSwgW0ludDE2QXJyYXksIGZhbHNlXSwgW1VpbnQxNkFycmF5LCBmYWxzZV0sIFtJbnQzMkFycmF5LCBmYWxzZV0sIFtVaW50MzJBcnJheSwgZmFsc2VdLCBbRmxvYXQzMkFycmF5LCBmYWxzZV0sIFtGbG9hdDY0QXJyYXksIGZhbHNlXV0pO1xuXG5mdW5jdGlvbiBzaG91bGRJbnN0cnVtZW50KHJlZikge1xuICB2YXIgY29uc3RydWN0b3IgPSByZWYuY29uc3RydWN0b3I7XG5cbiAgdmFyIGlzQnVpbHRJbiA9IHR5cGVvZiBjb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyAmJiBjb25zdHJ1Y3Rvci5uYW1lIGluIGdsb2JhbE9iaiAmJiBnbG9iYWxPYmpbY29uc3RydWN0b3IubmFtZV0gPT09IGNvbnN0cnVjdG9yO1xuICByZXR1cm4gIWlzQnVpbHRJbiB8fCBoYW5kbGVycy5oYXMoY29uc3RydWN0b3IpO1xufVxuXG5mdW5jdGlvbiBnZXRIYW5kbGVycyhvYmopIHtcbiAgcmV0dXJuIGhhbmRsZXJzLmdldChvYmouY29uc3RydWN0b3IpO1xufVxuXG52YXIgaGFzT3duUHJvcGVydHkkMSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgd2VsbEtub3duU3ltYm9scyA9IG5ldyBTZXQoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoU3ltYm9sKS5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gU3ltYm9sW2tleV07IH0pLmZpbHRlcihmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N5bWJvbCc7IH0pKTtcblxuLy8gaW50ZXJjZXB0IGdldCBvcGVyYXRpb25zIG9uIG9ic2VydmFibGVzIHRvIGtub3cgd2hpY2ggcmVhY3Rpb24gdXNlcyB0aGVpciBwcm9wZXJ0aWVzXG5mdW5jdGlvbiBnZXQodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSB7XG4gIHZhciByZXN1bHQgPSBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpO1xuICAvLyBkbyBub3QgcmVnaXN0ZXIgKG9ic2VydmFibGUucHJvcCAtPiByZWFjdGlvbikgcGFpcnMgZm9yIHdlbGwga25vd24gc3ltYm9sc1xuICAvLyB0aGVzZSBzeW1ib2xzIGFyZSBmcmVxdWVudGx5IHJldHJpZXZlZCBpbiBsb3cgbGV2ZWwgSmF2YVNjcmlwdCB1bmRlciB0aGUgaG9vZFxuICBpZiAodHlwZW9mIGtleSA9PT0gJ3N5bWJvbCcgJiYgd2VsbEtub3duU3ltYm9scy5oYXMoa2V5KSkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLy8gcmVnaXN0ZXIgYW5kIHNhdmUgKG9ic2VydmFibGUucHJvcCAtPiBydW5uaW5nUmVhY3Rpb24pXG4gIHJlZ2lzdGVyUnVubmluZ1JlYWN0aW9uRm9yT3BlcmF0aW9uKHsgdGFyZ2V0OiB0YXJnZXQsIGtleToga2V5LCByZWNlaXZlcjogcmVjZWl2ZXIsIHR5cGU6ICdnZXQnIH0pO1xuICAvLyBpZiB3ZSBhcmUgaW5zaWRlIGEgcmVhY3Rpb24gYW5kIG9ic2VydmFibGUucHJvcCBpcyBhbiBvYmplY3Qgd3JhcCBpdCBpbiBhbiBvYnNlcnZhYmxlIHRvb1xuICAvLyB0aGlzIGlzIG5lZWRlZCB0byBpbnRlcmNlcHQgcHJvcGVydHkgYWNjZXNzIG9uIHRoYXQgb2JqZWN0IHRvbyAoZHluYW1pYyBvYnNlcnZhYmxlIHRyZWUpXG4gIHZhciBvYnNlcnZhYmxlUmVzdWx0ID0gcmF3VG9Qcm94eS5nZXQocmVzdWx0KTtcbiAgaWYgKGhhc1J1bm5pbmdSZWFjdGlvbigpICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdCAhPT0gbnVsbCkge1xuICAgIGlmIChvYnNlcnZhYmxlUmVzdWx0KSB7XG4gICAgICByZXR1cm4gb2JzZXJ2YWJsZVJlc3VsdDtcbiAgICB9XG4gICAgLy8gZG8gbm90IHZpb2xhdGUgdGhlIG5vbmUtY29uZmlndXJhYmxlIG5vbmUtd3JpdGFibGUgcHJvcCBnZXQgaGFuZGxlciBpbnZhcmlhbnRcbiAgICAvLyBmYWxsIGJhY2sgdG8gbm9uZSByZWFjdGl2ZSBtb2RlIGluIHRoaXMgY2FzZSwgaW5zdGVhZCBvZiBsZXR0aW5nIHRoZSBQcm94eSB0aHJvdyBhIFR5cGVFcnJvclxuICAgIHZhciBkZXNjcmlwdG9yID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpO1xuICAgIGlmICghZGVzY3JpcHRvciB8fCAhKGRlc2NyaXB0b3Iud3JpdGFibGUgPT09IGZhbHNlICYmIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID09PSBmYWxzZSkpIHtcbiAgICAgIHJldHVybiBvYnNlcnZhYmxlKHJlc3VsdCk7XG4gICAgfVxuICB9XG4gIC8vIG90aGVyd2lzZSByZXR1cm4gdGhlIG9ic2VydmFibGUgd3JhcHBlciBpZiBpdCBpcyBhbHJlYWR5IGNyZWF0ZWQgYW5kIGNhY2hlZCBvciB0aGUgcmF3IG9iamVjdFxuICByZXR1cm4gb2JzZXJ2YWJsZVJlc3VsdCB8fCByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGhhcyh0YXJnZXQsIGtleSkge1xuICB2YXIgcmVzdWx0ID0gUmVmbGVjdC5oYXModGFyZ2V0LCBrZXkpO1xuICAvLyByZWdpc3RlciBhbmQgc2F2ZSAob2JzZXJ2YWJsZS5wcm9wIC0+IHJ1bm5pbmdSZWFjdGlvbilcbiAgcmVnaXN0ZXJSdW5uaW5nUmVhY3Rpb25Gb3JPcGVyYXRpb24oeyB0YXJnZXQ6IHRhcmdldCwga2V5OiBrZXksIHR5cGU6ICdoYXMnIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBvd25LZXlzKHRhcmdldCkge1xuICByZWdpc3RlclJ1bm5pbmdSZWFjdGlvbkZvck9wZXJhdGlvbih7IHRhcmdldDogdGFyZ2V0LCB0eXBlOiAnaXRlcmF0ZScgfSk7XG4gIHJldHVybiBSZWZsZWN0Lm93bktleXModGFyZ2V0KTtcbn1cblxuLy8gaW50ZXJjZXB0IHNldCBvcGVyYXRpb25zIG9uIG9ic2VydmFibGVzIHRvIGtub3cgd2hlbiB0byB0cmlnZ2VyIHJlYWN0aW9uc1xuZnVuY3Rpb24gc2V0KHRhcmdldCwga2V5LCB2YWx1ZSwgcmVjZWl2ZXIpIHtcbiAgLy8gbWFrZSBzdXJlIHRvIGRvIG5vdCBwb2xsdXRlIHRoZSByYXcgb2JqZWN0IHdpdGggb2JzZXJ2YWJsZXNcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICB2YWx1ZSA9IHByb3h5VG9SYXcuZ2V0KHZhbHVlKSB8fCB2YWx1ZTtcbiAgfVxuICAvLyBzYXZlIGlmIHRoZSBvYmplY3QgaGFkIGEgZGVzY3JpcHRvciBmb3IgdGhpcyBrZXlcbiAgdmFyIGhhZEtleSA9IGhhc093blByb3BlcnR5JDEuY2FsbCh0YXJnZXQsIGtleSk7XG4gIC8vIHNhdmUgaWYgdGhlIHZhbHVlIGNoYW5nZWQgYmVjYXVzZSBvZiB0aGlzIHNldCBvcGVyYXRpb25cbiAgdmFyIG9sZFZhbHVlID0gdGFyZ2V0W2tleV07XG4gIC8vIGV4ZWN1dGUgdGhlIHNldCBvcGVyYXRpb24gYmVmb3JlIHJ1bm5pbmcgYW55IHJlYWN0aW9uXG4gIHZhciByZXN1bHQgPSBSZWZsZWN0LnNldCh0YXJnZXQsIGtleSwgdmFsdWUsIHJlY2VpdmVyKTtcbiAgLy8gZG8gbm90IHF1ZXVlIHJlYWN0aW9ucyBpZiB0aGUgdGFyZ2V0IG9mIHRoZSBvcGVyYXRpb24gaXMgbm90IHRoZSByYXcgcmVjZWl2ZXJcbiAgLy8gKHBvc3NpYmxlIGJlY2F1c2Ugb2YgcHJvdG90eXBhbCBpbmhlcml0YW5jZSlcbiAgaWYgKHRhcmdldCAhPT0gcHJveHlUb1Jhdy5nZXQocmVjZWl2ZXIpKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvLyBxdWV1ZSBhIHJlYWN0aW9uIGlmIGl0J3MgYSBuZXcgcHJvcGVydHkgb3IgaXRzIHZhbHVlIGNoYW5nZWRcbiAgaWYgKCFoYWRLZXkpIHtcbiAgICBxdWV1ZVJlYWN0aW9uc0Zvck9wZXJhdGlvbih7IHRhcmdldDogdGFyZ2V0LCBrZXk6IGtleSwgdmFsdWU6IHZhbHVlLCByZWNlaXZlcjogcmVjZWl2ZXIsIHR5cGU6ICdhZGQnIH0pO1xuICB9IGVsc2UgaWYgKHZhbHVlICE9PSBvbGRWYWx1ZSkge1xuICAgIHF1ZXVlUmVhY3Rpb25zRm9yT3BlcmF0aW9uKHtcbiAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAga2V5OiBrZXksXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBvbGRWYWx1ZTogb2xkVmFsdWUsXG4gICAgICByZWNlaXZlcjogcmVjZWl2ZXIsXG4gICAgICB0eXBlOiAnc2V0J1xuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwga2V5KSB7XG4gIC8vIHNhdmUgaWYgdGhlIG9iamVjdCBoYWQgdGhlIGtleVxuICB2YXIgaGFkS2V5ID0gaGFzT3duUHJvcGVydHkkMS5jYWxsKHRhcmdldCwga2V5KTtcbiAgdmFyIG9sZFZhbHVlID0gdGFyZ2V0W2tleV07XG4gIC8vIGV4ZWN1dGUgdGhlIGRlbGV0ZSBvcGVyYXRpb24gYmVmb3JlIHJ1bm5pbmcgYW55IHJlYWN0aW9uXG4gIHZhciByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHRhcmdldCwga2V5KTtcbiAgLy8gb25seSBxdWV1ZSByZWFjdGlvbnMgZm9yIGRlbGV0ZSBvcGVyYXRpb25zIHdoaWNoIHJlc3VsdGVkIGluIGFuIGFjdHVhbCBjaGFuZ2VcbiAgaWYgKGhhZEtleSkge1xuICAgIHF1ZXVlUmVhY3Rpb25zRm9yT3BlcmF0aW9uKHsgdGFyZ2V0OiB0YXJnZXQsIGtleToga2V5LCBvbGRWYWx1ZTogb2xkVmFsdWUsIHR5cGU6ICdkZWxldGUnIH0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbnZhciBiYXNlSGFuZGxlcnMgPSB7IGdldDogZ2V0LCBoYXM6IGhhcywgb3duS2V5czogb3duS2V5cywgc2V0OiBzZXQsIGRlbGV0ZVByb3BlcnR5OiBkZWxldGVQcm9wZXJ0eSB9O1xuXG5mdW5jdGlvbiBvYnNlcnZhYmxlKG9iaikge1xuICBpZiAoIG9iaiA9PT0gdm9pZCAwICkgb2JqID0ge307XG5cbiAgLy8gaWYgaXQgaXMgYWxyZWFkeSBhbiBvYnNlcnZhYmxlIG9yIGl0IHNob3VsZCBub3QgYmUgd3JhcHBlZCwgcmV0dXJuIGl0XG4gIGlmIChwcm94eVRvUmF3LmhhcyhvYmopIHx8ICFzaG91bGRJbnN0cnVtZW50KG9iaikpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIC8vIGlmIGl0IGFscmVhZHkgaGFzIGEgY2FjaGVkIG9ic2VydmFibGUgd3JhcHBlciwgcmV0dXJuIGl0XG4gIC8vIG90aGVyd2lzZSBjcmVhdGUgYSBuZXcgb2JzZXJ2YWJsZVxuICByZXR1cm4gcmF3VG9Qcm94eS5nZXQob2JqKSB8fCBjcmVhdGVPYnNlcnZhYmxlKG9iaik7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU9ic2VydmFibGUob2JqKSB7XG4gIC8vIGlmIGl0IGlzIGEgY29tcGxleCBidWlsdC1pbiBvYmplY3Qgb3IgYSBub3JtYWwgb2JqZWN0LCB3cmFwIGl0XG4gIHZhciBoYW5kbGVycyA9IGdldEhhbmRsZXJzKG9iaikgfHwgYmFzZUhhbmRsZXJzO1xuICB2YXIgb2JzZXJ2YWJsZSA9IG5ldyBQcm94eShvYmosIGhhbmRsZXJzKTtcbiAgLy8gc2F2ZSB0aGVzZSB0byBzd2l0Y2ggYmV0d2VlbiB0aGUgcmF3IG9iamVjdCBhbmQgdGhlIHdyYXBwZWQgb2JqZWN0IHdpdGggZWFzZSBsYXRlclxuICByYXdUb1Byb3h5LnNldChvYmosIG9ic2VydmFibGUpO1xuICBwcm94eVRvUmF3LnNldChvYnNlcnZhYmxlLCBvYmopO1xuICAvLyBpbml0IGJhc2ljIGRhdGEgc3RydWN0dXJlcyB0byBzYXZlIGFuZCBjbGVhbnVwIGxhdGVyIChvYnNlcnZhYmxlLnByb3AgLT4gcmVhY3Rpb24pIGNvbm5lY3Rpb25zXG4gIHN0b3JlT2JzZXJ2YWJsZShvYmopO1xuICByZXR1cm4gb2JzZXJ2YWJsZTtcbn1cblxuZnVuY3Rpb24gaXNPYnNlcnZhYmxlKG9iaikge1xuICByZXR1cm4gcHJveHlUb1Jhdy5oYXMob2JqKTtcbn1cblxuZnVuY3Rpb24gcmF3KG9iaikge1xuICByZXR1cm4gcHJveHlUb1Jhdy5nZXQob2JqKSB8fCBvYmo7XG59XG5cbmV4cG9ydCB7IG9ic2VydmUsIHVub2JzZXJ2ZSwgb2JzZXJ2YWJsZSwgaXNPYnNlcnZhYmxlLCByYXcgfTtcbiIsIi8qIVxuICBDb3B5cmlnaHQgKGMpIDIwMTcgSmVkIFdhdHNvbi5cbiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChNSVQpLCBzZWVcbiAgaHR0cDovL2plZHdhdHNvbi5naXRodWIuaW8vY2xhc3NuYW1lc1xuKi9cbi8qIGdsb2JhbCBkZWZpbmUgKi9cblxuKGZ1bmN0aW9uICgpIHtcblx0J3VzZSBzdHJpY3QnO1xuXG5cdHZhciBoYXNPd24gPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuXHRmdW5jdGlvbiBjbGFzc05hbWVzICgpIHtcblx0XHR2YXIgY2xhc3NlcyA9IFtdO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBhcmcgPSBhcmd1bWVudHNbaV07XG5cdFx0XHRpZiAoIWFyZykgY29udGludWU7XG5cblx0XHRcdHZhciBhcmdUeXBlID0gdHlwZW9mIGFyZztcblxuXHRcdFx0aWYgKGFyZ1R5cGUgPT09ICdzdHJpbmcnIHx8IGFyZ1R5cGUgPT09ICdudW1iZXInKSB7XG5cdFx0XHRcdGNsYXNzZXMucHVzaChhcmcpO1xuXHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZykgJiYgYXJnLmxlbmd0aCkge1xuXHRcdFx0XHR2YXIgaW5uZXIgPSBjbGFzc05hbWVzLmFwcGx5KG51bGwsIGFyZyk7XG5cdFx0XHRcdGlmIChpbm5lcikge1xuXHRcdFx0XHRcdGNsYXNzZXMucHVzaChpbm5lcik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYXJnVHlwZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0Zm9yICh2YXIga2V5IGluIGFyZykge1xuXHRcdFx0XHRcdGlmIChoYXNPd24uY2FsbChhcmcsIGtleSkgJiYgYXJnW2tleV0pIHtcblx0XHRcdFx0XHRcdGNsYXNzZXMucHVzaChrZXkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcblx0fVxuXG5cdGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuXHRcdGNsYXNzTmFtZXMuZGVmYXVsdCA9IGNsYXNzTmFtZXM7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBjbGFzc05hbWVzO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT09ICdvYmplY3QnICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyByZWdpc3RlciBhcyAnY2xhc3NuYW1lcycsIGNvbnNpc3RlbnQgd2l0aCBucG0gcGFja2FnZSBuYW1lXG5cdFx0ZGVmaW5lKCdjbGFzc25hbWVzJywgW10sIGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBjbGFzc05hbWVzO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHdpbmRvdy5jbGFzc05hbWVzID0gY2xhc3NOYW1lcztcblx0fVxufSgpKTtcbiIsImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIikoZmFsc2UpO1xuLy8gTW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCIubWRjLWJ1dHRvbiB7XFxuICBmb250LWZhbWlseTogUm9ib3RvLCBzYW5zLXNlcmlmO1xcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcXG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcXG4gIGxpbmUtaGVpZ2h0OiAyLjI1cmVtO1xcbiAgZm9udC13ZWlnaHQ6IDUwMDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA4OTI5ZW07XFxuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcbiAgcGFkZGluZzogMCA4cHggMCA4cHg7XFxuICBkaXNwbGF5OiAtd2Via2l0LWlubGluZS1ib3g7XFxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIC13ZWJraXQtYm94LWFsaWduOiBjZW50ZXI7XFxuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAtd2Via2l0LWJveC1wYWNrOiBjZW50ZXI7XFxuICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIG1pbi13aWR0aDogNjRweDtcXG4gIGhlaWdodDogMzZweDtcXG4gIGJvcmRlcjogbm9uZTtcXG4gIG91dGxpbmU6IG5vbmU7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcXG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xcbiAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gIGJvcmRlci1yYWRpdXM6IDRweDsgfVxcbiAgLm1kYy1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIge1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBib3JkZXI6IDA7IH1cXG4gIC5tZGMtYnV0dG9uOmFjdGl2ZSB7XFxuICAgIG91dGxpbmU6IG5vbmU7IH1cXG4gIC5tZGMtYnV0dG9uOmhvdmVyIHtcXG4gICAgY3Vyc29yOiBwb2ludGVyOyB9XFxuICAubWRjLWJ1dHRvbjpkaXNhYmxlZCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM3KTtcXG4gICAgY3Vyc29yOiBkZWZhdWx0O1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsgfVxcbiAgLm1kYy1idXR0b24ubWRjLWJ1dHRvbi0tZGVuc2Uge1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7IH1cXG4gIC5tZGMtYnV0dG9uOm5vdCg6ZGlzYWJsZWQpIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IH1cXG4gIC5tZGMtYnV0dG9uIC5tZGMtYnV0dG9uX19pY29uIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBtYXJnaW4tbGVmdDogMDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBtYXJnaW4tcmlnaHQ6IDhweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICB3aWR0aDogMThweDtcXG4gICAgaGVpZ2h0OiAxOHB4O1xcbiAgICBmb250LXNpemU6IDE4cHg7XFxuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7IH1cXG4gICAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy1idXR0b24gLm1kYy1idXR0b25fX2ljb24sIC5tZGMtYnV0dG9uIC5tZGMtYnV0dG9uX19pY29uW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBtYXJnaW4tbGVmdDogOHB4O1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBtYXJnaW4tcmlnaHQ6IDA7IH1cXG4gIC5tZGMtYnV0dG9uOm5vdCg6ZGlzYWJsZWQpIHtcXG4gICAgY29sb3I6ICM2MjAwZWU7XFxuICAgIC8qIEBhbHRlcm5hdGUgKi9cXG4gICAgY29sb3I6IHZhcigtLW1kYy10aGVtZS1wcmltYXJ5LCAjNjIwMGVlKTsgfVxcblxcbi5tZGMtYnV0dG9uX19sYWJlbCArIC5tZGMtYnV0dG9uX19pY29uIHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIG1hcmdpbi1sZWZ0OiA4cHg7XFxuICAvKiBAbm9mbGlwICovXFxuICBtYXJnaW4tcmlnaHQ6IDA7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtYnV0dG9uX19sYWJlbCArIC5tZGMtYnV0dG9uX19pY29uLCAubWRjLWJ1dHRvbl9fbGFiZWwgKyAubWRjLWJ1dHRvbl9faWNvbltkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBtYXJnaW4tbGVmdDogMDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBtYXJnaW4tcmlnaHQ6IDhweDsgfVxcblxcbnN2Zy5tZGMtYnV0dG9uX19pY29uIHtcXG4gIGZpbGw6IGN1cnJlbnRDb2xvcjsgfVxcblxcbi5tZGMtYnV0dG9uLS1yYWlzZWQgLm1kYy1idXR0b25fX2ljb24sXFxuLm1kYy1idXR0b24tLXVuZWxldmF0ZWQgLm1kYy1idXR0b25fX2ljb24sXFxuLm1kYy1idXR0b24tLW91dGxpbmVkIC5tZGMtYnV0dG9uX19pY29uIHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIG1hcmdpbi1sZWZ0OiAtNHB4O1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgbWFyZ2luLXJpZ2h0OiA4cHg7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtYnV0dG9uLS1yYWlzZWQgLm1kYy1idXR0b25fX2ljb24sIC5tZGMtYnV0dG9uLS1yYWlzZWQgLm1kYy1idXR0b25fX2ljb25bZGlyPVxcXCJydGxcXFwiXSwgW2Rpcj1cXFwicnRsXFxcIl1cXG4gIC5tZGMtYnV0dG9uLS11bmVsZXZhdGVkIC5tZGMtYnV0dG9uX19pY29uLFxcbiAgLm1kYy1idXR0b24tLXVuZWxldmF0ZWQgLm1kYy1idXR0b25fX2ljb25bZGlyPVxcXCJydGxcXFwiXSwgW2Rpcj1cXFwicnRsXFxcIl1cXG4gIC5tZGMtYnV0dG9uLS1vdXRsaW5lZCAubWRjLWJ1dHRvbl9faWNvbixcXG4gIC5tZGMtYnV0dG9uLS1vdXRsaW5lZCAubWRjLWJ1dHRvbl9faWNvbltkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBtYXJnaW4tbGVmdDogOHB4O1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIG1hcmdpbi1yaWdodDogLTRweDsgfVxcblxcbi5tZGMtYnV0dG9uLS1yYWlzZWQgLm1kYy1idXR0b25fX2xhYmVsICsgLm1kYy1idXR0b25fX2ljb24sXFxuLm1kYy1idXR0b24tLXVuZWxldmF0ZWQgLm1kYy1idXR0b25fX2xhYmVsICsgLm1kYy1idXR0b25fX2ljb24sXFxuLm1kYy1idXR0b24tLW91dGxpbmVkIC5tZGMtYnV0dG9uX19sYWJlbCArIC5tZGMtYnV0dG9uX19pY29uIHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIG1hcmdpbi1sZWZ0OiA4cHg7XFxuICAvKiBAbm9mbGlwICovXFxuICBtYXJnaW4tcmlnaHQ6IC00cHg7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtYnV0dG9uLS1yYWlzZWQgLm1kYy1idXR0b25fX2xhYmVsICsgLm1kYy1idXR0b25fX2ljb24sIC5tZGMtYnV0dG9uLS1yYWlzZWQgLm1kYy1idXR0b25fX2xhYmVsICsgLm1kYy1idXR0b25fX2ljb25bZGlyPVxcXCJydGxcXFwiXSwgW2Rpcj1cXFwicnRsXFxcIl1cXG4gIC5tZGMtYnV0dG9uLS11bmVsZXZhdGVkIC5tZGMtYnV0dG9uX19sYWJlbCArIC5tZGMtYnV0dG9uX19pY29uLFxcbiAgLm1kYy1idXR0b24tLXVuZWxldmF0ZWQgLm1kYy1idXR0b25fX2xhYmVsICsgLm1kYy1idXR0b25fX2ljb25bZGlyPVxcXCJydGxcXFwiXSwgW2Rpcj1cXFwicnRsXFxcIl1cXG4gIC5tZGMtYnV0dG9uLS1vdXRsaW5lZCAubWRjLWJ1dHRvbl9fbGFiZWwgKyAubWRjLWJ1dHRvbl9faWNvbixcXG4gIC5tZGMtYnV0dG9uLS1vdXRsaW5lZCAubWRjLWJ1dHRvbl9fbGFiZWwgKyAubWRjLWJ1dHRvbl9faWNvbltkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBtYXJnaW4tbGVmdDogLTRweDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBtYXJnaW4tcmlnaHQ6IDhweDsgfVxcblxcbi5tZGMtYnV0dG9uLS1yYWlzZWQsXFxuLm1kYy1idXR0b24tLXVuZWxldmF0ZWQge1xcbiAgcGFkZGluZzogMCAxNnB4IDAgMTZweDsgfVxcbiAgLm1kYy1idXR0b24tLXJhaXNlZDpkaXNhYmxlZCxcXG4gIC5tZGMtYnV0dG9uLS11bmVsZXZhdGVkOmRpc2FibGVkIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEyKTtcXG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNyk7IH1cXG4gIC5tZGMtYnV0dG9uLS1yYWlzZWQ6bm90KDpkaXNhYmxlZCksXFxuICAubWRjLWJ1dHRvbi0tdW5lbGV2YXRlZDpub3QoOmRpc2FibGVkKSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM2MjAwZWU7IH1cXG4gICAgQHN1cHBvcnRzIG5vdCAoLW1zLWltZS1hbGlnbjogYXV0bykge1xcbiAgICAgIC5tZGMtYnV0dG9uLS1yYWlzZWQ6bm90KDpkaXNhYmxlZCksXFxuICAgICAgLm1kYy1idXR0b24tLXVuZWxldmF0ZWQ6bm90KDpkaXNhYmxlZCkge1xcbiAgICAgICAgLyogQGFsdGVybmF0ZSAqL1xcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWRjLXRoZW1lLXByaW1hcnksICM2MjAwZWUpOyB9IH1cXG4gIC5tZGMtYnV0dG9uLS1yYWlzZWQ6bm90KDpkaXNhYmxlZCksXFxuICAubWRjLWJ1dHRvbi0tdW5lbGV2YXRlZDpub3QoOmRpc2FibGVkKSB7XFxuICAgIGNvbG9yOiAjZmZmO1xcbiAgICAvKiBAYWx0ZXJuYXRlICovXFxuICAgIGNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtb24tcHJpbWFyeSwgI2ZmZik7IH1cXG5cXG4ubWRjLWJ1dHRvbi0tcmFpc2VkIHtcXG4gIGJveC1zaGFkb3c6IDBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IGJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gIHRyYW5zaXRpb246IGJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsgfVxcbiAgLm1kYy1idXR0b24tLXJhaXNlZDpob3ZlciwgLm1kYy1idXR0b24tLXJhaXNlZDpmb2N1cyB7XFxuICAgIGJveC1zaGFkb3c6IDBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XFxuICAubWRjLWJ1dHRvbi0tcmFpc2VkOmFjdGl2ZSB7XFxuICAgIGJveC1zaGFkb3c6IDBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxcbiAgLm1kYy1idXR0b24tLXJhaXNlZDpkaXNhYmxlZCB7XFxuICAgIGJveC1zaGFkb3c6IDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxcblxcbi5tZGMtYnV0dG9uLS1vdXRsaW5lZCB7XFxuICBib3JkZXItc3R5bGU6IHNvbGlkO1xcbiAgcGFkZGluZzogMCAxNHB4IDAgMTRweDtcXG4gIGJvcmRlci13aWR0aDogMnB4OyB9XFxuICAubWRjLWJ1dHRvbi0tb3V0bGluZWQ6ZGlzYWJsZWQge1xcbiAgICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNyk7IH1cXG4gIC5tZGMtYnV0dG9uLS1vdXRsaW5lZDpub3QoOmRpc2FibGVkKSB7XFxuICAgIGJvcmRlci1jb2xvcjogIzYyMDBlZTtcXG4gICAgLyogQGFsdGVybmF0ZSAqL1xcbiAgICBib3JkZXItY29sb3I6IHZhcigtLW1kYy10aGVtZS1wcmltYXJ5LCAjNjIwMGVlKTsgfVxcblxcbi5tZGMtYnV0dG9uLS1kZW5zZSB7XFxuICBoZWlnaHQ6IDMycHg7XFxuICBmb250LXNpemU6IC44MTI1cmVtOyB9XFxuXFxuQC13ZWJraXQta2V5ZnJhbWVzIG1kYy1yaXBwbGUtZmctcmFkaXVzLWluIHtcXG4gIGZyb20ge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1zdGFydCwgMCkpIHNjYWxlKDEpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLXN0YXJ0LCAwKSkgc2NhbGUoMSk7IH1cXG4gIHRvIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1lbmQsIDApKSBzY2FsZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXNjYWxlLCAxKSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tbWRjLXJpcHBsZS1mZy10cmFuc2xhdGUtZW5kLCAwKSkgc2NhbGUodmFyKC0tbWRjLXJpcHBsZS1mZy1zY2FsZSwgMSkpOyB9IH1cXG5cXG5Aa2V5ZnJhbWVzIG1kYy1yaXBwbGUtZmctcmFkaXVzLWluIHtcXG4gIGZyb20ge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1zdGFydCwgMCkpIHNjYWxlKDEpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLXN0YXJ0LCAwKSkgc2NhbGUoMSk7IH1cXG4gIHRvIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1lbmQsIDApKSBzY2FsZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXNjYWxlLCAxKSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tbWRjLXJpcHBsZS1mZy10cmFuc2xhdGUtZW5kLCAwKSkgc2NhbGUodmFyKC0tbWRjLXJpcHBsZS1mZy1zY2FsZSwgMSkpOyB9IH1cXG5cXG5ALXdlYmtpdC1rZXlmcmFtZXMgbWRjLXJpcHBsZS1mZy1vcGFjaXR5LWluIHtcXG4gIGZyb20ge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7XFxuICAgIG9wYWNpdHk6IDA7IH1cXG4gIHRvIHtcXG4gICAgb3BhY2l0eTogdmFyKC0tbWRjLXJpcHBsZS1mZy1vcGFjaXR5LCAwKTsgfSB9XFxuXFxuQGtleWZyYW1lcyBtZGMtcmlwcGxlLWZnLW9wYWNpdHktaW4ge1xcbiAgZnJvbSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjtcXG4gICAgb3BhY2l0eTogMDsgfVxcbiAgdG8ge1xcbiAgICBvcGFjaXR5OiB2YXIoLS1tZGMtcmlwcGxlLWZnLW9wYWNpdHksIDApOyB9IH1cXG5cXG5ALXdlYmtpdC1rZXlmcmFtZXMgbWRjLXJpcHBsZS1mZy1vcGFjaXR5LW91dCB7XFxuICBmcm9tIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyO1xcbiAgICBvcGFjaXR5OiB2YXIoLS1tZGMtcmlwcGxlLWZnLW9wYWNpdHksIDApOyB9XFxuICB0byB7XFxuICAgIG9wYWNpdHk6IDA7IH0gfVxcblxcbkBrZXlmcmFtZXMgbWRjLXJpcHBsZS1mZy1vcGFjaXR5LW91dCB7XFxuICBmcm9tIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyO1xcbiAgICBvcGFjaXR5OiB2YXIoLS1tZGMtcmlwcGxlLWZnLW9wYWNpdHksIDApOyB9XFxuICB0byB7XFxuICAgIG9wYWNpdHk6IDA7IH0gfVxcblxcbi5tZGMtcmlwcGxlLXN1cmZhY2UtLXRlc3QtZWRnZS12YXItYnVnIHtcXG4gIC0tbWRjLXJpcHBsZS1zdXJmYWNlLXRlc3QtZWRnZS12YXI6IDFweCBzb2xpZCAjMDAwO1xcbiAgdmlzaWJpbGl0eTogaGlkZGVuOyB9XFxuICAubWRjLXJpcHBsZS1zdXJmYWNlLS10ZXN0LWVkZ2UtdmFyLWJ1Zzo6YmVmb3JlIHtcXG4gICAgYm9yZGVyOiB2YXIoLS1tZGMtcmlwcGxlLXN1cmZhY2UtdGVzdC1lZGdlLXZhcik7IH1cXG5cXG4ubWRjLWJ1dHRvbiB7XFxuICAtLW1kYy1yaXBwbGUtZmctc2l6ZTogMDtcXG4gIC0tbWRjLXJpcHBsZS1sZWZ0OiAwO1xcbiAgLS1tZGMtcmlwcGxlLXRvcDogMDtcXG4gIC0tbWRjLXJpcHBsZS1mZy1zY2FsZTogMTtcXG4gIC0tbWRjLXJpcHBsZS1mZy10cmFuc2xhdGUtZW5kOiAwO1xcbiAgLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1zdGFydDogMDtcXG4gIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTtcXG4gIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm0sIG9wYWNpdHk7IH1cXG4gIC5tZGMtYnV0dG9uOjpiZWZvcmUsIC5tZGMtYnV0dG9uOjphZnRlciB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xcbiAgICBvcGFjaXR5OiAwO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gICAgY29udGVudDogXFxcIlxcXCI7IH1cXG4gIC5tZGMtYnV0dG9uOjpiZWZvcmUge1xcbiAgICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgMTVtcyBsaW5lYXIsIGJhY2tncm91bmQtY29sb3IgMTVtcyBsaW5lYXI7XFxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTVtcyBsaW5lYXIsIGJhY2tncm91bmQtY29sb3IgMTVtcyBsaW5lYXI7XFxuICAgIHotaW5kZXg6IDE7IH1cXG4gIC5tZGMtYnV0dG9uLm1kYy1yaXBwbGUtdXBncmFkZWQ6OmJlZm9yZSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXNjYWxlLCAxKSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXNjYWxlLCAxKSk7IH1cXG4gIC5tZGMtYnV0dG9uLm1kYy1yaXBwbGUtdXBncmFkZWQ6OmFmdGVyIHtcXG4gICAgdG9wOiAwO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IDA7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7XFxuICAgICAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsgfVxcbiAgLm1kYy1idXR0b24ubWRjLXJpcHBsZS11cGdyYWRlZC0tdW5ib3VuZGVkOjphZnRlciB7XFxuICAgIHRvcDogdmFyKC0tbWRjLXJpcHBsZS10b3AsIDApO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IHZhcigtLW1kYy1yaXBwbGUtbGVmdCwgMCk7IH1cXG4gIC5tZGMtYnV0dG9uLm1kYy1yaXBwbGUtdXBncmFkZWQtLWZvcmVncm91bmQtYWN0aXZhdGlvbjo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogbWRjLXJpcHBsZS1mZy1yYWRpdXMtaW4gMjI1bXMgZm9yd2FyZHMsIG1kYy1yaXBwbGUtZmctb3BhY2l0eS1pbiA3NW1zIGZvcndhcmRzO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbjogbWRjLXJpcHBsZS1mZy1yYWRpdXMtaW4gMjI1bXMgZm9yd2FyZHMsIG1kYy1yaXBwbGUtZmctb3BhY2l0eS1pbiA3NW1zIGZvcndhcmRzOyB9XFxuICAubWRjLWJ1dHRvbi5tZGMtcmlwcGxlLXVwZ3JhZGVkLS1mb3JlZ3JvdW5kLWRlYWN0aXZhdGlvbjo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogbWRjLXJpcHBsZS1mZy1vcGFjaXR5LW91dCAxNTBtcztcXG4gICAgICAgICAgICBhbmltYXRpb246IG1kYy1yaXBwbGUtZmctb3BhY2l0eS1vdXQgMTUwbXM7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tbWRjLXJpcHBsZS1mZy10cmFuc2xhdGUtZW5kLCAwKSkgc2NhbGUodmFyKC0tbWRjLXJpcHBsZS1mZy1zY2FsZSwgMSkpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLWVuZCwgMCkpIHNjYWxlKHZhcigtLW1kYy1yaXBwbGUtZmctc2NhbGUsIDEpKTsgfVxcbiAgLm1kYy1idXR0b246OmJlZm9yZSwgLm1kYy1idXR0b246OmFmdGVyIHtcXG4gICAgdG9wOiBjYWxjKDUwJSAtIDEwMCUpO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IGNhbGMoNTAlIC0gMTAwJSk7XFxuICAgIHdpZHRoOiAyMDAlO1xcbiAgICBoZWlnaHQ6IDIwMCU7IH1cXG4gIC5tZGMtYnV0dG9uLm1kYy1yaXBwbGUtdXBncmFkZWQ6OmFmdGVyIHtcXG4gICAgd2lkdGg6IHZhcigtLW1kYy1yaXBwbGUtZmctc2l6ZSwgMTAwJSk7XFxuICAgIGhlaWdodDogdmFyKC0tbWRjLXJpcHBsZS1mZy1zaXplLCAxMDAlKTsgfVxcbiAgLm1kYy1idXR0b246OmJlZm9yZSwgLm1kYy1idXR0b246OmFmdGVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzYyMDBlZTsgfVxcbiAgICBAc3VwcG9ydHMgbm90ICgtbXMtaW1lLWFsaWduOiBhdXRvKSB7XFxuICAgICAgLm1kYy1idXR0b246OmJlZm9yZSwgLm1kYy1idXR0b246OmFmdGVyIHtcXG4gICAgICAgIC8qIEBhbHRlcm5hdGUgKi9cXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1kYy10aGVtZS1wcmltYXJ5LCAjNjIwMGVlKTsgfSB9XFxuICAubWRjLWJ1dHRvbjpob3Zlcjo6YmVmb3JlIHtcXG4gICAgb3BhY2l0eTogMC4wNDsgfVxcbiAgLm1kYy1idXR0b246bm90KC5tZGMtcmlwcGxlLXVwZ3JhZGVkKTpmb2N1czo6YmVmb3JlLCAubWRjLWJ1dHRvbi5tZGMtcmlwcGxlLXVwZ3JhZGVkLS1iYWNrZ3JvdW5kLWZvY3VzZWQ6OmJlZm9yZSB7XFxuICAgIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogNzVtcztcXG4gICAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiA3NW1zO1xcbiAgICBvcGFjaXR5OiAwLjEyOyB9XFxuICAubWRjLWJ1dHRvbjpub3QoLm1kYy1yaXBwbGUtdXBncmFkZWQpOjphZnRlciB7XFxuICAgIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSAxNTBtcyBsaW5lYXI7XFxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTUwbXMgbGluZWFyOyB9XFxuICAubWRjLWJ1dHRvbjpub3QoLm1kYy1yaXBwbGUtdXBncmFkZWQpOmFjdGl2ZTo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDc1bXM7XFxuICAgICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogNzVtcztcXG4gICAgb3BhY2l0eTogMC4xMjsgfVxcbiAgLm1kYy1idXR0b24ubWRjLXJpcHBsZS11cGdyYWRlZCB7XFxuICAgIC0tbWRjLXJpcHBsZS1mZy1vcGFjaXR5OiAwLjEyOyB9XFxuXFxuLm1kYy1idXR0b24tLXJhaXNlZDo6YmVmb3JlLCAubWRjLWJ1dHRvbi0tcmFpc2VkOjphZnRlcixcXG4ubWRjLWJ1dHRvbi0tdW5lbGV2YXRlZDo6YmVmb3JlLFxcbi5tZGMtYnV0dG9uLS11bmVsZXZhdGVkOjphZnRlciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOyB9XFxuICBAc3VwcG9ydHMgbm90ICgtbXMtaW1lLWFsaWduOiBhdXRvKSB7XFxuICAgIC5tZGMtYnV0dG9uLS1yYWlzZWQ6OmJlZm9yZSwgLm1kYy1idXR0b24tLXJhaXNlZDo6YWZ0ZXIsXFxuICAgIC5tZGMtYnV0dG9uLS11bmVsZXZhdGVkOjpiZWZvcmUsXFxuICAgIC5tZGMtYnV0dG9uLS11bmVsZXZhdGVkOjphZnRlciB7XFxuICAgICAgLyogQGFsdGVybmF0ZSAqL1xcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1kYy10aGVtZS1vbi1wcmltYXJ5LCAjZmZmKTsgfSB9XFxuXFxuLm1kYy1idXR0b24tLXJhaXNlZDpob3Zlcjo6YmVmb3JlLFxcbi5tZGMtYnV0dG9uLS11bmVsZXZhdGVkOmhvdmVyOjpiZWZvcmUge1xcbiAgb3BhY2l0eTogMC4wODsgfVxcblxcbi5tZGMtYnV0dG9uLS1yYWlzZWQ6bm90KC5tZGMtcmlwcGxlLXVwZ3JhZGVkKTpmb2N1czo6YmVmb3JlLCAubWRjLWJ1dHRvbi0tcmFpc2VkLm1kYy1yaXBwbGUtdXBncmFkZWQtLWJhY2tncm91bmQtZm9jdXNlZDo6YmVmb3JlLFxcbi5tZGMtYnV0dG9uLS11bmVsZXZhdGVkOm5vdCgubWRjLXJpcHBsZS11cGdyYWRlZCk6Zm9jdXM6OmJlZm9yZSxcXG4ubWRjLWJ1dHRvbi0tdW5lbGV2YXRlZC5tZGMtcmlwcGxlLXVwZ3JhZGVkLS1iYWNrZ3JvdW5kLWZvY3VzZWQ6OmJlZm9yZSB7XFxuICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDc1bXM7XFxuICAgICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDc1bXM7XFxuICBvcGFjaXR5OiAwLjI0OyB9XFxuXFxuLm1kYy1idXR0b24tLXJhaXNlZDpub3QoLm1kYy1yaXBwbGUtdXBncmFkZWQpOjphZnRlcixcXG4ubWRjLWJ1dHRvbi0tdW5lbGV2YXRlZDpub3QoLm1kYy1yaXBwbGUtdXBncmFkZWQpOjphZnRlciB7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgMTUwbXMgbGluZWFyO1xcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAxNTBtcyBsaW5lYXI7IH1cXG5cXG4ubWRjLWJ1dHRvbi0tcmFpc2VkOm5vdCgubWRjLXJpcHBsZS11cGdyYWRlZCk6YWN0aXZlOjphZnRlcixcXG4ubWRjLWJ1dHRvbi0tdW5lbGV2YXRlZDpub3QoLm1kYy1yaXBwbGUtdXBncmFkZWQpOmFjdGl2ZTo6YWZ0ZXIge1xcbiAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiA3NW1zO1xcbiAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiA3NW1zO1xcbiAgb3BhY2l0eTogMC4yNDsgfVxcblxcbi5tZGMtYnV0dG9uLS1yYWlzZWQubWRjLXJpcHBsZS11cGdyYWRlZCxcXG4ubWRjLWJ1dHRvbi0tdW5lbGV2YXRlZC5tZGMtcmlwcGxlLXVwZ3JhZGVkIHtcXG4gIC0tbWRjLXJpcHBsZS1mZy1vcGFjaXR5OiAwLjI0OyB9XCIsIFwiXCJdKTtcbiIsImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIikoZmFsc2UpO1xuLy8gTW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCIubWRjLWRpYWxvZyxcXG4ubWRjLWRpYWxvZ19fc2NyaW0ge1xcbiAgcG9zaXRpb246IGZpeGVkO1xcbiAgdG9wOiAwO1xcbiAgbGVmdDogMDtcXG4gIC13ZWJraXQtYm94LWFsaWduOiBjZW50ZXI7XFxuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAtd2Via2l0LWJveC1wYWNrOiBjZW50ZXI7XFxuICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlOyB9XFxuXFxuLm1kYy1kaWFsb2cge1xcbiAgZGlzcGxheTogbm9uZTtcXG4gIHotaW5kZXg6IDc7IH1cXG4gIC5tZGMtZGlhbG9nIC5tZGMtZGlhbG9nX19zdXJmYWNlIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXG4gICAgLyogQGFsdGVybmF0ZSAqL1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtc3VyZmFjZSwgI2ZmZik7IH1cXG4gIC5tZGMtZGlhbG9nIC5tZGMtZGlhbG9nX19zY3JpbSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zMik7IH1cXG4gIC5tZGMtZGlhbG9nIC5tZGMtZGlhbG9nX190aXRsZSB7XFxuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XFxuICAubWRjLWRpYWxvZyAubWRjLWRpYWxvZ19fY29udGVudCB7XFxuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNik7IH1cXG4gIC5tZGMtZGlhbG9nLm1kYy1kaWFsb2ctLXNjcm9sbGFibGUgLm1kYy1kaWFsb2dfX3RpdGxlLFxcbiAgLm1kYy1kaWFsb2cubWRjLWRpYWxvZy0tc2Nyb2xsYWJsZSAubWRjLWRpYWxvZ19fYWN0aW9ucyB7XFxuICAgIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxcbiAgLm1kYy1kaWFsb2cgLm1kYy1kaWFsb2dfX3N1cmZhY2Uge1xcbiAgICBtaW4td2lkdGg6IDI4MHB4OyB9XFxuICBAbWVkaWEgKG1heC13aWR0aDogNTkycHgpIHtcXG4gICAgLm1kYy1kaWFsb2cgLm1kYy1kaWFsb2dfX3N1cmZhY2Uge1xcbiAgICAgIG1heC13aWR0aDogY2FsYygxMDB2dyAtIDMycHgpOyB9IH1cXG4gIEBtZWRpYSAobWluLXdpZHRoOiA1OTJweCkge1xcbiAgICAubWRjLWRpYWxvZyAubWRjLWRpYWxvZ19fc3VyZmFjZSB7XFxuICAgICAgbWF4LXdpZHRoOiA1NjBweDsgfSB9XFxuICAubWRjLWRpYWxvZyAubWRjLWRpYWxvZ19fc3VyZmFjZSB7XFxuICAgIG1heC1oZWlnaHQ6IGNhbGMoMTAwdmggLSAzMnB4KTsgfVxcbiAgLm1kYy1kaWFsb2cgLm1kYy1kaWFsb2dfX3N1cmZhY2Uge1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7IH1cXG5cXG4ubWRjLWRpYWxvZ19fc2NyaW0ge1xcbiAgb3BhY2l0eTogMDtcXG4gIHotaW5kZXg6IC0xOyB9XFxuXFxuLm1kYy1kaWFsb2dfX2NvbnRhaW5lciB7XFxuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICAtd2Via2l0LWJveC1vcmllbnQ6IGhvcml6b250YWw7XFxuICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcXG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjgpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOCk7XFxuICBvcGFjaXR5OiAwOyB9XFxuXFxuLm1kYy1kaWFsb2dfX3N1cmZhY2Uge1xcbiAgYm94LXNoYWRvdzogMHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xcbiAgZGlzcGxheTogLXdlYmtpdC1ib3g7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcXG4gIC13ZWJraXQtYm94LWRpcmVjdGlvbjogbm9ybWFsO1xcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgLXdlYmtpdC1ib3gtZmxleDogMDtcXG4gICAgICAgICAgZmxleC1ncm93OiAwO1xcbiAgZmxleC1zaHJpbms6IDA7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgbWF4LXdpZHRoOiAxMDAlO1xcbiAgbWF4LWhlaWdodDogMTAwJTsgfVxcbiAgLm1kYy1kaWFsb2dbZGlyPVxcXCJydGxcXFwiXSAubWRjLWRpYWxvZ19fc3VyZmFjZSxcXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtZGlhbG9nIC5tZGMtZGlhbG9nX19zdXJmYWNlIHtcXG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7IH1cXG5cXG4ubWRjLWRpYWxvZ19fdGl0bGUge1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBtYXJnaW4tdG9wOiAwO1xcbiAgLyogQGFsdGVybmF0ZSAqL1xcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcXG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIHNhbnMtc2VyaWY7XFxuICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XFxuICBmb250LXNpemU6IDEuMjVyZW07XFxuICBsaW5lLWhlaWdodDogMnJlbTtcXG4gIGZvbnQtd2VpZ2h0OiA1MDA7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LWRlY29yYXRpb246IGluaGVyaXQ7XFxuICB0ZXh0LXRyYW5zZm9ybTogaW5oZXJpdDtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgZmxleC1zaHJpbms6IDA7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgbWFyZ2luOiAwO1xcbiAgcGFkZGluZzogMCAyNHB4IDlweDtcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB0cmFuc3BhcmVudDsgfVxcbiAgLm1kYy1kaWFsb2dfX3RpdGxlOjpiZWZvcmUge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIHdpZHRoOiAwO1xcbiAgICBoZWlnaHQ6IDQwcHg7XFxuICAgIGNvbnRlbnQ6IFxcXCJcXFwiO1xcbiAgICB2ZXJ0aWNhbC1hbGlnbjogMDsgfVxcbiAgLm1kYy1kaWFsb2dbZGlyPVxcXCJydGxcXFwiXSAubWRjLWRpYWxvZ19fdGl0bGUsXFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLWRpYWxvZyAubWRjLWRpYWxvZ19fdGl0bGUge1xcbiAgICB0ZXh0LWFsaWduOiByaWdodDsgfVxcblxcbi5tZGMtZGlhbG9nLS1zY3JvbGxhYmxlIC5tZGMtZGlhbG9nX190aXRsZSB7XFxuICBwYWRkaW5nLWJvdHRvbTogMTVweDsgfVxcblxcbi5tZGMtZGlhbG9nX19jb250ZW50IHtcXG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIHNhbnMtc2VyaWY7XFxuICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XFxuICBmb250LXNpemU6IDFyZW07XFxuICBsaW5lLWhlaWdodDogMS41cmVtO1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAzMTI1ZW07XFxuICB0ZXh0LWRlY29yYXRpb246IGluaGVyaXQ7XFxuICB0ZXh0LXRyYW5zZm9ybTogaW5oZXJpdDtcXG4gIC13ZWJraXQtYm94LWZsZXg6IDE7XFxuICAgICAgICAgIGZsZXgtZ3JvdzogMTtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICBtYXJnaW46IDA7XFxuICBwYWRkaW5nOiAyMHB4IDI0cHg7XFxuICBvdmVyZmxvdzogYXV0bztcXG4gIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsgfVxcbiAgLm1kYy1kaWFsb2dfX2NvbnRlbnQgPiA6Zmlyc3QtY2hpbGQge1xcbiAgICBtYXJnaW4tdG9wOiAwOyB9XFxuICAubWRjLWRpYWxvZ19fY29udGVudCA+IDpsYXN0LWNoaWxkIHtcXG4gICAgbWFyZ2luLWJvdHRvbTogMDsgfVxcblxcbi5tZGMtZGlhbG9nX190aXRsZSArIC5tZGMtZGlhbG9nX19jb250ZW50IHtcXG4gIHBhZGRpbmctdG9wOiAwOyB9XFxuXFxuLm1kYy1kaWFsb2ctLXNjcm9sbGFibGUgLm1kYy1kaWFsb2dfX2NvbnRlbnQge1xcbiAgcGFkZGluZy10b3A6IDhweDtcXG4gIHBhZGRpbmctYm90dG9tOiA4cHg7IH1cXG5cXG4ubWRjLWRpYWxvZ19fY29udGVudCAubWRjLWxpc3Q6Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZCB7XFxuICBwYWRkaW5nOiA2cHggMCAwOyB9XFxuXFxuLm1kYy1kaWFsb2ctLXNjcm9sbGFibGUgLm1kYy1kaWFsb2dfX2NvbnRlbnQgLm1kYy1saXN0OmZpcnN0LWNoaWxkOmxhc3QtY2hpbGQge1xcbiAgcGFkZGluZzogMDsgfVxcblxcbi5tZGMtZGlhbG9nX19hY3Rpb25zIHtcXG4gIGRpc3BsYXk6IC13ZWJraXQtYm94O1xcbiAgZGlzcGxheTogZmxleDtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGZsZXgtc2hyaW5rOiAwO1xcbiAgZmxleC13cmFwOiB3cmFwO1xcbiAgLXdlYmtpdC1ib3gtYWxpZ246IGNlbnRlcjtcXG4gICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIC13ZWJraXQtYm94LXBhY2s6IGVuZDtcXG4gICAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICBtaW4taGVpZ2h0OiA1MnB4O1xcbiAgbWFyZ2luOiAwO1xcbiAgcGFkZGluZzogOHB4O1xcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHRyYW5zcGFyZW50OyB9XFxuICAubWRjLWRpYWxvZy0tc3RhY2tlZCAubWRjLWRpYWxvZ19fYWN0aW9ucyB7XFxuICAgIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7XFxuICAgIC13ZWJraXQtYm94LWRpcmVjdGlvbjogbm9ybWFsO1xcbiAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIC13ZWJraXQtYm94LWFsaWduOiBlbmQ7XFxuICAgICAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kOyB9XFxuXFxuLm1kYy1kaWFsb2dfX2J1dHRvbiB7XFxuICAvKiBAbm9mbGlwICovXFxuICBtYXJnaW4tbGVmdDogOHB4O1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgbWFyZ2luLXJpZ2h0OiAwO1xcbiAgbWF4LXdpZHRoOiAxMDAlO1xcbiAgdGV4dC1hbGlnbjogcmlnaHQ7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtZGlhbG9nX19idXR0b24sIC5tZGMtZGlhbG9nX19idXR0b25bZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbWFyZ2luLWxlZnQ6IDA7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbWFyZ2luLXJpZ2h0OiA4cHg7IH1cXG4gIC5tZGMtZGlhbG9nX19idXR0b246Zmlyc3QtY2hpbGQge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIG1hcmdpbi1sZWZ0OiAwO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIG1hcmdpbi1yaWdodDogMDsgfVxcbiAgICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLWRpYWxvZ19fYnV0dG9uOmZpcnN0LWNoaWxkLCAubWRjLWRpYWxvZ19fYnV0dG9uOmZpcnN0LWNoaWxkW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBtYXJnaW4tbGVmdDogMDtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgbWFyZ2luLXJpZ2h0OiAwOyB9XFxuICAubWRjLWRpYWxvZ1tkaXI9XFxcInJ0bFxcXCJdIC5tZGMtZGlhbG9nX19idXR0b24sXFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLWRpYWxvZyAubWRjLWRpYWxvZ19fYnV0dG9uIHtcXG4gICAgdGV4dC1hbGlnbjogbGVmdDsgfVxcbiAgLm1kYy1kaWFsb2ctLXN0YWNrZWQgLm1kYy1kaWFsb2dfX2J1dHRvbjpub3QoOmZpcnN0LWNoaWxkKSB7XFxuICAgIG1hcmdpbi10b3A6IDEycHg7IH1cXG5cXG4ubWRjLWRpYWxvZy0tb3BlbixcXG4ubWRjLWRpYWxvZy0tb3BlbmluZyxcXG4ubWRjLWRpYWxvZy0tY2xvc2luZyB7XFxuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcXG4gIGRpc3BsYXk6IGZsZXg7IH1cXG5cXG4ubWRjLWRpYWxvZy0tb3BlbmluZyAubWRjLWRpYWxvZ19fc2NyaW0ge1xcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IDE1MG1zIGxpbmVhcjtcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMTUwbXMgbGluZWFyOyB9XFxuXFxuLm1kYy1kaWFsb2ctLW9wZW5pbmcgLm1kYy1kaWFsb2dfX2NvbnRhaW5lciB7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgNzVtcyBsaW5lYXIsIC13ZWJraXQtdHJhbnNmb3JtIDE1MG1zIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgNzVtcyBsaW5lYXIsIC13ZWJraXQtdHJhbnNmb3JtIDE1MG1zIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgNzVtcyBsaW5lYXIsIHRyYW5zZm9ybSAxNTBtcyAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDc1bXMgbGluZWFyLCB0cmFuc2Zvcm0gMTUwbXMgMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpLCAtd2Via2l0LXRyYW5zZm9ybSAxNTBtcyAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7IH1cXG5cXG4ubWRjLWRpYWxvZy0tY2xvc2luZyAubWRjLWRpYWxvZ19fc2NyaW0sXFxuLm1kYy1kaWFsb2ctLWNsb3NpbmcgLm1kYy1kaWFsb2dfX2NvbnRhaW5lciB7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgNzVtcyBsaW5lYXI7XFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDc1bXMgbGluZWFyOyB9XFxuXFxuLm1kYy1kaWFsb2ctLWNsb3NpbmcgLm1kYy1kaWFsb2dfX2NvbnRhaW5lciB7XFxuICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7XFxuICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7IH1cXG5cXG4ubWRjLWRpYWxvZy0tb3BlbiAubWRjLWRpYWxvZ19fc2NyaW0ge1xcbiAgb3BhY2l0eTogMTsgfVxcblxcbi5tZGMtZGlhbG9nLS1vcGVuIC5tZGMtZGlhbG9nX19jb250YWluZXIge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgb3BhY2l0eTogMTsgfVxcblxcbi5tZGMtZGlhbG9nLXNjcm9sbC1sb2NrIHtcXG4gIG92ZXJmbG93OiBoaWRkZW47IH1cIiwgXCJcIl0pO1xuIiwiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiKShmYWxzZSk7XG4vLyBNb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIi5tZGMtbWVudS1zdXJmYWNlIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgbWF4LXdpZHRoOiBjYWxjKDEwMHZ3IC0gMzJweCk7XFxuICBtYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gMzJweCk7XFxuICBtYXJnaW46IDA7XFxuICBwYWRkaW5nOiAwO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiB0b3AgbGVmdDtcXG4gICAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIGxlZnQ7XFxuICBvcGFjaXR5OiAwO1xcbiAgb3ZlcmZsb3c6IGF1dG87XFxuICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtLCBvcGFjaXR5O1xcbiAgei1pbmRleDogODtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSAwLjAzcyBsaW5lYXIsIC13ZWJraXQtdHJhbnNmb3JtIDAuMTJzIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO1xcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjAzcyBsaW5lYXIsIC13ZWJraXQtdHJhbnNmb3JtIDAuMTJzIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO1xcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjAzcyBsaW5lYXIsIHRyYW5zZm9ybSAwLjEycyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMC4wM3MgbGluZWFyLCB0cmFuc2Zvcm0gMC4xMnMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSksIC13ZWJraXQtdHJhbnNmb3JtIDAuMTJzIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO1xcbiAgYm94LXNoYWRvdzogMHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1kYy10aGVtZS1zdXJmYWNlLCAjZmZmKTtcXG4gIGNvbG9yOiAjMDAwO1xcbiAgLyogQGFsdGVybmF0ZSAqL1xcbiAgY29sb3I6IHZhcigtLW1kYy10aGVtZS1vbi1zdXJmYWNlLCAjMDAwKTtcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHRyYW5zZm9ybS1vcmlnaW4tbGVmdDogdG9wIGxlZnQ7XFxuICAvKiBAbm9mbGlwICovXFxuICB0cmFuc2Zvcm0tb3JpZ2luLXJpZ2h0OiB0b3AgcmlnaHQ7IH1cXG4gIC5tZGMtbWVudS1zdXJmYWNlOmZvY3VzIHtcXG4gICAgb3V0bGluZTogbm9uZTsgfVxcbiAgLm1kYy1tZW51LXN1cmZhY2UtLW9wZW4ge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICBvcGFjaXR5OiAxOyB9XFxuICAubWRjLW1lbnUtc3VyZmFjZS0tYW5pbWF0aW5nLW9wZW4ge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC44KTtcXG4gICAgb3BhY2l0eTogMDsgfVxcbiAgLm1kYy1tZW51LXN1cmZhY2UtLWFuaW1hdGluZy1jbG9zZWQge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIG9wYWNpdHk6IDA7XFxuICAgIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSAwLjA3NXMgbGluZWFyO1xcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMDc1cyBsaW5lYXI7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtbWVudS1zdXJmYWNlLCAubWRjLW1lbnUtc3VyZmFjZVtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICB0cmFuc2Zvcm0tb3JpZ2luLWxlZnQ6IHRvcCByaWdodDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICB0cmFuc2Zvcm0tb3JpZ2luLXJpZ2h0OiB0b3AgbGVmdDsgfVxcblxcbi5tZGMtbWVudS1zdXJmYWNlLS1hbmNob3Ige1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgb3ZlcmZsb3c6IHZpc2libGU7IH1cXG5cXG4ubWRjLW1lbnUtc3VyZmFjZS0tZml4ZWQge1xcbiAgcG9zaXRpb246IGZpeGVkOyB9XCIsIFwiXCJdKTtcbiIsImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIikoZmFsc2UpO1xuLy8gTW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJALXdlYmtpdC1rZXlmcmFtZXMgbWRjLXNlbGVjdC1mbG9hdC1uYXRpdmUtY29udHJvbCB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7XFxuICAgIG9wYWNpdHk6IDA7IH1cXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XFxuICAgIG9wYWNpdHk6IDE7IH0gfVxcblxcbkBrZXlmcmFtZXMgbWRjLXNlbGVjdC1mbG9hdC1uYXRpdmUtY29udHJvbCB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7XFxuICAgIG9wYWNpdHk6IDA7IH1cXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XFxuICAgIG9wYWNpdHk6IDE7IH0gfVxcblxcbi5tZGMtbGluZS1yaXBwbGUge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgYm90dG9tOiAwO1xcbiAgbGVmdDogMDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAycHg7XFxuICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDApO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgwKTtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSAxODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpLCAtd2Via2l0LXRyYW5zZm9ybSAxODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAxODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpLCAtd2Via2l0LXRyYW5zZm9ybSAxODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDE4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksIG9wYWNpdHkgMTgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAxODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpLCBvcGFjaXR5IDE4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksIC13ZWJraXQtdHJhbnNmb3JtIDE4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICBvcGFjaXR5OiAwO1xcbiAgei1pbmRleDogMjsgfVxcblxcbi5tZGMtbGluZS1yaXBwbGUtLWFjdGl2ZSB7XFxuICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKTtcXG4gIG9wYWNpdHk6IDE7IH1cXG5cXG4ubWRjLWxpbmUtcmlwcGxlLS1kZWFjdGl2YXRpbmcge1xcbiAgb3BhY2l0eTogMDsgfVxcblxcbi5tZGMtbm90Y2hlZC1vdXRsaW5lIHtcXG4gIGRpc3BsYXk6IC13ZWJraXQtYm94O1xcbiAgZGlzcGxheTogZmxleDtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHJpZ2h0OiAwO1xcbiAgbGVmdDogMDtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICB3aWR0aDogMTAwJTtcXG4gIG1heC13aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHRleHQtYWxpZ246IGxlZnQ7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTsgfVxcbiAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy1ub3RjaGVkLW91dGxpbmUsIC5tZGMtbm90Y2hlZC1vdXRsaW5lW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHRleHQtYWxpZ246IHJpZ2h0OyB9XFxuICAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZywgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLCAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcge1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBoZWlnaHQ6IDEwMCU7XFxuICAgIC13ZWJraXQtdHJhbnNpdGlvbjogYm9yZGVyIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAgIHRyYW5zaXRpb246IGJvcmRlciAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQ7XFxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZDtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7IH1cXG4gIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGJvcmRlci1yaWdodDogbm9uZTtcXG4gICAgd2lkdGg6IDEycHg7IH1cXG4gICAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBib3JkZXItbGVmdDogbm9uZTtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQ7IH1cXG4gIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgYm9yZGVyLWxlZnQ6IG5vbmU7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQ7XFxuICAgIC13ZWJraXQtYm94LWZsZXg6IDE7XFxuICAgICAgICAgICAgZmxleC1ncm93OiAxOyB9XFxuICAgIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZywgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkO1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBib3JkZXItcmlnaHQ6IG5vbmU7IH1cXG4gIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCB7XFxuICAgIC13ZWJraXQtYm94LWZsZXg6IDA7XFxuICAgICAgICAgICAgZmxleDogMCAwIGF1dG87XFxuICAgIHdpZHRoOiBhdXRvO1xcbiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDEycHggKiAyKTsgfVxcbiAgLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICB0b3A6IDE3cHg7XFxuICAgIGJvdHRvbTogYXV0bztcXG4gICAgbWF4LXdpZHRoOiAxMDAlOyB9XFxuICAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICAgIHRleHQtb3ZlcmZsb3c6IGNsaXA7IH1cXG4gIC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICAgIG1heC13aWR0aDogY2FsYygxMDAlIC8gLjc1KTsgfVxcblxcbi5tZGMtbm90Y2hlZC1vdXRsaW5lLS1ub3RjaGVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCB7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLWxlZnQ6IDA7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLXJpZ2h0OiA4cHg7XFxuICBib3JkZXItdG9wOiBub25lOyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLW5vdGNoZWQtb3V0bGluZS0tbm90Y2hlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsIC5tZGMtbm90Y2hlZC1vdXRsaW5lLS1ub3RjaGVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLWxlZnQ6IDhweDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLXJpZ2h0OiAwOyB9XFxuXFxuLm1kYy1ub3RjaGVkLW91dGxpbmUtLW5vLWxhYmVsIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCB7XFxuICBwYWRkaW5nOiAwOyB9XFxuXFxuLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICBmb250LWZhbWlseTogUm9ib3RvLCBzYW5zLXNlcmlmO1xcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcXG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xcbiAgZm9udC1zaXplOiAxcmVtO1xcbiAgbGluZS1oZWlnaHQ6IDEuNzVyZW07XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDA5MzdlbTtcXG4gIHRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDtcXG4gIHRleHQtdHJhbnNmb3JtOiBpbmhlcml0O1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgbGVmdDogMDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7XFxuICAgICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgdG9wO1xcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBjb2xvciAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpLCAtd2Via2l0LXRyYW5zZm9ybSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgdHJhbnNpdGlvbjogY29sb3IgMTUwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKSwgLXdlYmtpdC10cmFuc2Zvcm0gMTUwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpLCBjb2xvciAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksIGNvbG9yIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksIC13ZWJraXQtdHJhbnNmb3JtIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBsaW5lLWhlaWdodDogMS4xNXJlbTtcXG4gIHRleHQtYWxpZ246IGxlZnQ7XFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICBjdXJzb3I6IHRleHQ7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsgfVxcbiAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy1mbG9hdGluZy1sYWJlbCwgLm1kYy1mbG9hdGluZy1sYWJlbFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogMDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBsZWZ0OiBhdXRvO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IHRvcDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICB0ZXh0LWFsaWduOiByaWdodDsgfVxcblxcbi5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gIGN1cnNvcjogYXV0bzsgfVxcblxcbi5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7IH1cXG5cXG4ubWRjLWZsb2F0aW5nLWxhYmVsLS1zaGFrZSB7XFxuICAtd2Via2l0LWFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXN0YW5kYXJkIDI1MG1zIDE7XFxuICAgICAgICAgIGFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXN0YW5kYXJkIDI1MG1zIDE7IH1cXG5cXG5ALXdlYmtpdC1rZXlmcmFtZXMgbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXN0YW5kYXJkIHtcXG4gIDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC01MCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDMzJSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDY2JSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMCUpKSB0cmFuc2xhdGVZKC01MCUpIHNjYWxlKDAuNzUpOyB9XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC01MCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7IH0gfVxcblxcbkBrZXlmcmFtZXMgbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXN0YW5kYXJkIHtcXG4gIDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC01MCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDMzJSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDY2JSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMCUpKSB0cmFuc2xhdGVZKC01MCUpIHNjYWxlKDAuNzUpOyB9XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC01MCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7IH0gfVxcblxcbkAtd2Via2l0LWtleWZyYW1lcyBtZGMtcmlwcGxlLWZnLXJhZGl1cy1pbiB7XFxuICBmcm9tIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tbWRjLXJpcHBsZS1mZy10cmFuc2xhdGUtc3RhcnQsIDApKSBzY2FsZSgxKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1zdGFydCwgMCkpIHNjYWxlKDEpOyB9XFxuICB0byB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tbWRjLXJpcHBsZS1mZy10cmFuc2xhdGUtZW5kLCAwKSkgc2NhbGUodmFyKC0tbWRjLXJpcHBsZS1mZy1zY2FsZSwgMSkpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLWVuZCwgMCkpIHNjYWxlKHZhcigtLW1kYy1yaXBwbGUtZmctc2NhbGUsIDEpKTsgfSB9XFxuXFxuQGtleWZyYW1lcyBtZGMtcmlwcGxlLWZnLXJhZGl1cy1pbiB7XFxuICBmcm9tIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tbWRjLXJpcHBsZS1mZy10cmFuc2xhdGUtc3RhcnQsIDApKSBzY2FsZSgxKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1zdGFydCwgMCkpIHNjYWxlKDEpOyB9XFxuICB0byB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tbWRjLXJpcHBsZS1mZy10cmFuc2xhdGUtZW5kLCAwKSkgc2NhbGUodmFyKC0tbWRjLXJpcHBsZS1mZy1zY2FsZSwgMSkpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLWVuZCwgMCkpIHNjYWxlKHZhcigtLW1kYy1yaXBwbGUtZmctc2NhbGUsIDEpKTsgfSB9XFxuXFxuQC13ZWJraXQta2V5ZnJhbWVzIG1kYy1yaXBwbGUtZmctb3BhY2l0eS1pbiB7XFxuICBmcm9tIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyO1xcbiAgICBvcGFjaXR5OiAwOyB9XFxuICB0byB7XFxuICAgIG9wYWNpdHk6IHZhcigtLW1kYy1yaXBwbGUtZmctb3BhY2l0eSwgMCk7IH0gfVxcblxcbkBrZXlmcmFtZXMgbWRjLXJpcHBsZS1mZy1vcGFjaXR5LWluIHtcXG4gIGZyb20ge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7XFxuICAgIG9wYWNpdHk6IDA7IH1cXG4gIHRvIHtcXG4gICAgb3BhY2l0eTogdmFyKC0tbWRjLXJpcHBsZS1mZy1vcGFjaXR5LCAwKTsgfSB9XFxuXFxuQC13ZWJraXQta2V5ZnJhbWVzIG1kYy1yaXBwbGUtZmctb3BhY2l0eS1vdXQge1xcbiAgZnJvbSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjtcXG4gICAgb3BhY2l0eTogdmFyKC0tbWRjLXJpcHBsZS1mZy1vcGFjaXR5LCAwKTsgfVxcbiAgdG8ge1xcbiAgICBvcGFjaXR5OiAwOyB9IH1cXG5cXG5Aa2V5ZnJhbWVzIG1kYy1yaXBwbGUtZmctb3BhY2l0eS1vdXQge1xcbiAgZnJvbSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjtcXG4gICAgb3BhY2l0eTogdmFyKC0tbWRjLXJpcHBsZS1mZy1vcGFjaXR5LCAwKTsgfVxcbiAgdG8ge1xcbiAgICBvcGFjaXR5OiAwOyB9IH1cXG5cXG4ubWRjLXJpcHBsZS1zdXJmYWNlLS10ZXN0LWVkZ2UtdmFyLWJ1ZyB7XFxuICAtLW1kYy1yaXBwbGUtc3VyZmFjZS10ZXN0LWVkZ2UtdmFyOiAxcHggc29saWQgIzAwMDtcXG4gIHZpc2liaWxpdHk6IGhpZGRlbjsgfVxcbiAgLm1kYy1yaXBwbGUtc3VyZmFjZS0tdGVzdC1lZGdlLXZhci1idWc6OmJlZm9yZSB7XFxuICAgIGJvcmRlcjogdmFyKC0tbWRjLXJpcHBsZS1zdXJmYWNlLXRlc3QtZWRnZS12YXIpOyB9XFxuXFxuLm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpIC5tZGMtc2VsZWN0X19pY29uIHtcXG4gIGNvbG9yOiAjMDAwO1xcbiAgLyogQGFsdGVybmF0ZSAqL1xcbiAgY29sb3I6IHZhcigtLW1kYy10aGVtZS1vbi1zdXJmYWNlLCAjMDAwKTsgfVxcblxcbi5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbiAubWRjLXNlbGVjdF9faWNvbiB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBib3R0b206IDE2cHg7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgd2lkdGg6IDI0cHg7XFxuICBoZWlnaHQ6IDI0cHg7XFxuICBib3JkZXI6IG5vbmU7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gIGZpbGw6IGN1cnJlbnRDb2xvcjtcXG4gIG9wYWNpdHk6IDAuNTQ7XFxuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xcbiAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lOyB9XFxuXFxuLm1kYy1zZWxlY3RfX2ljb246bm90KFt0YWJpbmRleF0pLFxcbi5tZGMtc2VsZWN0X19pY29uW3RhYmluZGV4PVxcXCItMVxcXCJdIHtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lOyB9XFxuXFxuLm1kYy1zZWxlY3QtaGVscGVyLXRleHQge1xcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgc2Fucy1zZXJpZjtcXG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XFxuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcXG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcXG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAzMzMzZW07XFxuICB0ZXh0LWRlY29yYXRpb246IGluaGVyaXQ7XFxuICB0ZXh0LXRyYW5zZm9ybTogaW5oZXJpdDtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWFyZ2luLXRvcDogMDtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGxpbmUtaGVpZ2h0OiBub3JtYWw7XFxuICBtYXJnaW46IDA7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgMTgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMTgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gIG9wYWNpdHk6IDA7XFxuICB3aWxsLWNoYW5nZTogb3BhY2l0eTsgfVxcbiAgLm1kYy1zZWxlY3QtaGVscGVyLXRleHQ6OmJlZm9yZSB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgd2lkdGg6IDA7XFxuICAgIGhlaWdodDogMTZweDtcXG4gICAgY29udGVudDogXFxcIlxcXCI7XFxuICAgIHZlcnRpY2FsLWFsaWduOiAwOyB9XFxuXFxuLm1kYy1zZWxlY3QtaGVscGVyLXRleHQtLXBlcnNpc3RlbnQge1xcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBub25lO1xcbiAgdHJhbnNpdGlvbjogbm9uZTtcXG4gIG9wYWNpdHk6IDE7XFxuICB3aWxsLWNoYW5nZTogaW5pdGlhbDsgfVxcblxcbi5tZGMtc2VsZWN0IHtcXG4gIC0tbWRjLXJpcHBsZS1mZy1zaXplOiAwO1xcbiAgLS1tZGMtcmlwcGxlLWxlZnQ6IDA7XFxuICAtLW1kYy1yaXBwbGUtdG9wOiAwO1xcbiAgLS1tZGMtcmlwcGxlLWZnLXNjYWxlOiAxO1xcbiAgLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1lbmQ6IDA7XFxuICAtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLXN0YXJ0OiAwO1xcbiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApO1xcbiAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybSwgb3BhY2l0eTtcXG4gIGRpc3BsYXk6IC13ZWJraXQtaW5saW5lLWJveDtcXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIGhlaWdodDogNTZweDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICB3aWxsLWNoYW5nZTogb3BhY2l0eSwgdHJhbnNmb3JtLCBjb2xvcjsgfVxcbiAgLm1kYy1zZWxlY3Q6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZXNtb2tlOyB9XFxuICAubWRjLXNlbGVjdDo6YmVmb3JlLCAubWRjLXNlbGVjdDo6YWZ0ZXIge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcXG4gICAgb3BhY2l0eTogMDtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxuICAgIGNvbnRlbnQ6IFxcXCJcXFwiOyB9XFxuICAubWRjLXNlbGVjdDo6YmVmb3JlIHtcXG4gICAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IDE1bXMgbGluZWFyLCBiYWNrZ3JvdW5kLWNvbG9yIDE1bXMgbGluZWFyO1xcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDE1bXMgbGluZWFyLCBiYWNrZ3JvdW5kLWNvbG9yIDE1bXMgbGluZWFyO1xcbiAgICB6LWluZGV4OiAxOyB9XFxuICAubWRjLXNlbGVjdC5tZGMtcmlwcGxlLXVwZ3JhZGVkOjpiZWZvcmUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUodmFyKC0tbWRjLXJpcHBsZS1mZy1zY2FsZSwgMSkpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tbWRjLXJpcHBsZS1mZy1zY2FsZSwgMSkpOyB9XFxuICAubWRjLXNlbGVjdC5tZGMtcmlwcGxlLXVwZ3JhZGVkOjphZnRlciB7XFxuICAgIHRvcDogMDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBsZWZ0OiAwO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7IH1cXG4gIC5tZGMtc2VsZWN0Lm1kYy1yaXBwbGUtdXBncmFkZWQtLXVuYm91bmRlZDo6YWZ0ZXIge1xcbiAgICB0b3A6IHZhcigtLW1kYy1yaXBwbGUtdG9wLCAwKTtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBsZWZ0OiB2YXIoLS1tZGMtcmlwcGxlLWxlZnQsIDApOyB9XFxuICAubWRjLXNlbGVjdC5tZGMtcmlwcGxlLXVwZ3JhZGVkLS1mb3JlZ3JvdW5kLWFjdGl2YXRpb246OmFmdGVyIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb246IG1kYy1yaXBwbGUtZmctcmFkaXVzLWluIDIyNW1zIGZvcndhcmRzLCBtZGMtcmlwcGxlLWZnLW9wYWNpdHktaW4gNzVtcyBmb3J3YXJkcztcXG4gICAgICAgICAgICBhbmltYXRpb246IG1kYy1yaXBwbGUtZmctcmFkaXVzLWluIDIyNW1zIGZvcndhcmRzLCBtZGMtcmlwcGxlLWZnLW9wYWNpdHktaW4gNzVtcyBmb3J3YXJkczsgfVxcbiAgLm1kYy1zZWxlY3QubWRjLXJpcHBsZS11cGdyYWRlZC0tZm9yZWdyb3VuZC1kZWFjdGl2YXRpb246OmFmdGVyIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb246IG1kYy1yaXBwbGUtZmctb3BhY2l0eS1vdXQgMTUwbXM7XFxuICAgICAgICAgICAgYW5pbWF0aW9uOiBtZGMtcmlwcGxlLWZnLW9wYWNpdHktb3V0IDE1MG1zO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLWVuZCwgMCkpIHNjYWxlKHZhcigtLW1kYy1yaXBwbGUtZmctc2NhbGUsIDEpKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1lbmQsIDApKSBzY2FsZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXNjYWxlLCAxKSk7IH1cXG4gIC5tZGMtc2VsZWN0OjpiZWZvcmUsIC5tZGMtc2VsZWN0OjphZnRlciB7XFxuICAgIHRvcDogY2FsYyg1MCUgLSAxMDAlKTtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBsZWZ0OiBjYWxjKDUwJSAtIDEwMCUpO1xcbiAgICB3aWR0aDogMjAwJTtcXG4gICAgaGVpZ2h0OiAyMDAlOyB9XFxuICAubWRjLXNlbGVjdC5tZGMtcmlwcGxlLXVwZ3JhZGVkOjphZnRlciB7XFxuICAgIHdpZHRoOiB2YXIoLS1tZGMtcmlwcGxlLWZnLXNpemUsIDEwMCUpO1xcbiAgICBoZWlnaHQ6IHZhcigtLW1kYy1yaXBwbGUtZmctc2l6ZSwgMTAwJSk7IH1cXG4gIC5tZGMtc2VsZWN0OjpiZWZvcmUsIC5tZGMtc2VsZWN0OjphZnRlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cXG4gIC5tZGMtc2VsZWN0OmhvdmVyOjpiZWZvcmUge1xcbiAgICBvcGFjaXR5OiAwLjA0OyB9XFxuICAubWRjLXNlbGVjdDpub3QoLm1kYy1yaXBwbGUtdXBncmFkZWQpOmZvY3VzOjpiZWZvcmUsIC5tZGMtc2VsZWN0Lm1kYy1yaXBwbGUtdXBncmFkZWQtLWJhY2tncm91bmQtZm9jdXNlZDo6YmVmb3JlIHtcXG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiA3NW1zO1xcbiAgICAgICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDc1bXM7XFxuICAgIG9wYWNpdHk6IDAuMTI7IH1cXG4gIC5tZGMtc2VsZWN0Om5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpIC5tZGMtc2VsZWN0X19uYXRpdmUtY29udHJvbCxcXG4gIC5tZGMtc2VsZWN0Om5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpIC5tZGMtc2VsZWN0X19zZWxlY3RlZC10ZXh0IHtcXG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cXG4gIC5tZGMtc2VsZWN0Om5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpIC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjYpOyB9XFxuICAubWRjLXNlbGVjdDpub3QoLm1kYy1zZWxlY3QtLWRpc2FibGVkKSAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2wsXFxuICAubWRjLXNlbGVjdDpub3QoLm1kYy1zZWxlY3QtLWRpc2FibGVkKSAubWRjLXNlbGVjdF9fc2VsZWN0ZWQtdGV4dCB7XFxuICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40Mik7IH1cXG4gIC5tZGMtc2VsZWN0Om5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpICsgLm1kYy1zZWxlY3QtaGVscGVyLXRleHQge1xcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjYpOyB9XFxuICAubWRjLXNlbGVjdCwgLm1kYy1zZWxlY3RfX25hdGl2ZS1jb250cm9sIHtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4IDRweCAwIDA7IH1cXG4gIC5tZGMtc2VsZWN0Om5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpLm1kYy1zZWxlY3QtLWZvY3VzZWQgLm1kYy1saW5lLXJpcHBsZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM2MjAwZWU7XFxuICAgIC8qIEBhbHRlcm5hdGUgKi9cXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWRjLXRoZW1lLXByaW1hcnksICM2MjAwZWUpOyB9XFxuICAubWRjLXNlbGVjdDpub3QoLm1kYy1zZWxlY3QtLWRpc2FibGVkKS5tZGMtc2VsZWN0LS1mb2N1c2VkIC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgICBjb2xvcjogcmdiYSg5OCwgMCwgMjM4LCAwLjg3KTsgfVxcbiAgLm1kYy1zZWxlY3Q6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkgLm1kYy1zZWxlY3RfX25hdGl2ZS1jb250cm9sOmhvdmVyIHtcXG4gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxcbiAgLm1kYy1zZWxlY3QgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTcwJSkgc2NhbGUoMC43NSk7IH1cXG4gIC5tZGMtc2VsZWN0IC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IDE2cHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcmlnaHQ6IGluaXRpYWw7XFxuICAgIHRvcDogMjFweDtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7IH1cXG4gICAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy1zZWxlY3QgLm1kYy1mbG9hdGluZy1sYWJlbCwgLm1kYy1zZWxlY3QgLm1kYy1mbG9hdGluZy1sYWJlbFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgbGVmdDogaW5pdGlhbDtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgcmlnaHQ6IDE2cHg7IH1cXG4gIC5tZGMtc2VsZWN0Lm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uIC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IDQ4cHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcmlnaHQ6IGluaXRpYWw7IH1cXG4gICAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy1zZWxlY3QubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy1mbG9hdGluZy1sYWJlbCwgLm1kYy1zZWxlY3QubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy1mbG9hdGluZy1sYWJlbFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgbGVmdDogaW5pdGlhbDtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgcmlnaHQ6IDQ4cHg7IH1cXG4gIC5tZGMtc2VsZWN0Lm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IDRweDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogaW5pdGlhbDtcXG4gICAgdG9wOiAxN3B4OyB9XFxuICAgIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtc2VsZWN0Lm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtZmxvYXRpbmctbGFiZWwsIC5tZGMtc2VsZWN0Lm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtZmxvYXRpbmctbGFiZWxbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIGxlZnQ6IGluaXRpYWw7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIHJpZ2h0OiA0cHg7IH1cXG4gIC5tZGMtc2VsZWN0Lm1kYy1zZWxlY3QtLW91dGxpbmVkLm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uIC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IDM2cHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcmlnaHQ6IGluaXRpYWw7IH1cXG4gICAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy1zZWxlY3QubWRjLXNlbGVjdC0tb3V0bGluZWQubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy1mbG9hdGluZy1sYWJlbCwgLm1kYy1zZWxlY3QubWRjLXNlbGVjdC0tb3V0bGluZWQubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy1mbG9hdGluZy1sYWJlbFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgbGVmdDogaW5pdGlhbDtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgcmlnaHQ6IDM2cHg7IH1cXG4gICAgLm1kYy1zZWxlY3QubWRjLXNlbGVjdC0tb3V0bGluZWQubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBsZWZ0OiAzNnB4O1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICByaWdodDogaW5pdGlhbDsgfVxcbiAgICAgIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtc2VsZWN0Lm1kYy1zZWxlY3QtLW91dGxpbmVkLm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlLCAubWRjLXNlbGVjdC5tZGMtc2VsZWN0LS1vdXRsaW5lZC5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbiAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZVtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICAgIGxlZnQ6IGluaXRpYWw7XFxuICAgICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgICByaWdodDogMzZweDsgfVxcbiAgLm1kYy1zZWxlY3RfX2Ryb3Bkb3duLWljb24ge1xcbiAgICBiYWNrZ3JvdW5kOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmclMjB3aWR0aCUzRCUyMjEwcHglMjIlMjBoZWlnaHQlM0QlMjI1cHglMjIlMjB2aWV3Qm94JTNEJTIyNyUyMDEwJTIwMTAlMjA1JTIyJTIwdmVyc2lvbiUzRCUyMjEuMSUyMiUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJTIyJTIweG1sbnMlM0F4bGluayUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMTk5OSUyRnhsaW5rJTIyJTNFJTBBJTIwJTIwJTIwJTIwJTNDcG9seWdvbiUyMGlkJTNEJTIyU2hhcGUlMjIlMjBzdHJva2UlM0QlMjJub25lJTIyJTIwZmlsbCUzRCUyMiUyMzAwMCUyMiUyMGZpbGwtcnVsZSUzRCUyMmV2ZW5vZGQlMjIlMjBvcGFjaXR5JTNEJTIyMC41NCUyMiUyMHBvaW50cyUzRCUyMjclMjAxMCUyMDEyJTIwMTUlMjAxNyUyMDEwJTIyJTNFJTNDJTJGcG9seWdvbiUzRSUwQSUzQyUyRnN2ZyUzRVxcXCIpIG5vLXJlcGVhdCBjZW50ZXI7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogYXV0bztcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogOHB4O1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGJvdHRvbTogMTZweDtcXG4gICAgd2lkdGg6IDI0cHg7XFxuICAgIGhlaWdodDogMjRweDtcXG4gICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMTUwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksIC13ZWJraXQtdHJhbnNmb3JtIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lOyB9XFxuICAgIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtc2VsZWN0X19kcm9wZG93bi1pY29uLCAubWRjLXNlbGVjdF9fZHJvcGRvd24taWNvbltkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgbGVmdDogOHB4O1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICByaWdodDogYXV0bzsgfVxcbiAgICAubWRjLXNlbGVjdC0tZm9jdXNlZCAubWRjLXNlbGVjdF9fZHJvcGRvd24taWNvbiB7XFxuICAgICAgYmFja2dyb3VuZDogdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnJTIwd2lkdGglM0QlMjIxMHB4JTIyJTIwaGVpZ2h0JTNEJTIyNXB4JTIyJTIwdmlld0JveCUzRCUyMjclMjAxMCUyMDEwJTIwNSUyMiUyMHZlcnNpb24lM0QlMjIxLjElMjIlMjB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMjAwMCUyRnN2ZyUyMiUyMHhtbG5zJTNBeGxpbmslM0QlMjJodHRwJTNBJTJGJTJGd3d3LnczLm9yZyUyRjE5OTklMkZ4bGluayUyMiUzRSUwQSUyMCUyMCUyMCUyMCUzQ3BvbHlnb24lMjBpZCUzRCUyMlNoYXBlJTIyJTIwc3Ryb2tlJTNEJTIybm9uZSUyMiUyMGZpbGwlM0QlMjIlMjM2MjAwZWUlMjIlMjBmaWxsLXJ1bGUlM0QlMjJldmVub2RkJTIyJTIwb3BhY2l0eSUzRCUyMjElMjIlMjBwb2ludHMlM0QlMjI3JTIwMTAlMjAxMiUyMDE1JTIwMTclMjAxMCUyMiUzRSUzQyUyRnBvbHlnb24lM0UlMEElM0MlMkZzdmclM0VcXFwiKSBuby1yZXBlYXQgY2VudGVyO1xcbiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKSB0cmFuc2xhdGVZKC01cHgpO1xcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKSB0cmFuc2xhdGVZKC01cHgpO1xcbiAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMTUwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpLCAtd2Via2l0LXRyYW5zZm9ybSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOyB9XFxuICAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2wge1xcbiAgICBwYWRkaW5nLXRvcDogMjBweDsgfVxcbiAgLm1kYy1zZWxlY3QubWRjLXNlbGVjdC0tZm9jdXNlZCAubWRjLWxpbmUtcmlwcGxlOjphZnRlciB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLCAyKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEsIDIpO1xcbiAgICBvcGFjaXR5OiAxOyB9XFxuXFxuLm1kYy1zZWxlY3QgKyAubWRjLXNlbGVjdC1oZWxwZXItdGV4dCB7XFxuICBtYXJnaW4tcmlnaHQ6IDEycHg7XFxuICBtYXJnaW4tbGVmdDogMTJweDsgfVxcblxcbi5tZGMtc2VsZWN0LS1vdXRsaW5lZCArIC5tZGMtc2VsZWN0LWhlbHBlci10ZXh0IHtcXG4gIG1hcmdpbi1yaWdodDogMTZweDtcXG4gIG1hcmdpbi1sZWZ0OiAxNnB4OyB9XFxuXFxuLm1kYy1zZWxlY3QtLWZvY3VzZWQgKyAubWRjLXNlbGVjdC1oZWxwZXItdGV4dDpub3QoLm1kYy1zZWxlY3QtaGVscGVyLXRleHQtLXZhbGlkYXRpb24tbXNnKSB7XFxuICBvcGFjaXR5OiAxOyB9XFxuXFxuLm1kYy1zZWxlY3RfX3NlbGVjdGVkLXRleHQge1xcbiAgbWluLXdpZHRoOiAyMDBweDtcXG4gIHBhZGRpbmctdG9wOiAyMnB4OyB9XFxuXFxuLm1kYy1zZWxlY3RfX25hdGl2ZS1jb250cm9sLFxcbi5tZGMtc2VsZWN0X19zZWxlY3RlZC10ZXh0IHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctbGVmdDogMTZweDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctcmlnaHQ6IDUycHg7XFxuICBmb250LWZhbWlseTogUm9ib3RvLCBzYW5zLXNlcmlmO1xcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcXG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xcbiAgZm9udC1zaXplOiAxcmVtO1xcbiAgbGluZS1oZWlnaHQ6IDEuNzVyZW07XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDA5MzdlbTtcXG4gIHRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDtcXG4gIHRleHQtdHJhbnNmb3JtOiBpbmhlcml0O1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiA1NnB4O1xcbiAgcGFkZGluZy10b3A6IDIwcHg7XFxuICBwYWRkaW5nLWJvdHRvbTogNHB4O1xcbiAgYm9yZGVyOiBub25lO1xcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkO1xcbiAgb3V0bGluZTogbm9uZTtcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgY29sb3I6IGluaGVyaXQ7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xcbiAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xcbiAgICAgICAgICBhcHBlYXJhbmNlOiBub25lOyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2wsIC5tZGMtc2VsZWN0X19uYXRpdmUtY29udHJvbFtkaXI9XFxcInJ0bFxcXCJdLCBbZGlyPVxcXCJydGxcXFwiXVxcbiAgLm1kYy1zZWxlY3RfX3NlbGVjdGVkLXRleHQsXFxuICAubWRjLXNlbGVjdF9fc2VsZWN0ZWQtdGV4dFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLWxlZnQ6IDUycHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcGFkZGluZy1yaWdodDogMTZweDsgfVxcbiAgLm1kYy1zZWxlY3RfX25hdGl2ZS1jb250cm9sOjotbXMtZXhwYW5kLFxcbiAgLm1kYy1zZWxlY3RfX3NlbGVjdGVkLXRleHQ6Oi1tcy1leHBhbmQge1xcbiAgICBkaXNwbGF5OiBub25lOyB9XFxuICAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2w6Oi1tcy12YWx1ZSxcXG4gIC5tZGMtc2VsZWN0X19zZWxlY3RlZC10ZXh0OjotbXMtdmFsdWUge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgY29sb3I6IGluaGVyaXQ7IH1cXG5cXG5ALW1vei1kb2N1bWVudCB1cmwtcHJlZml4KFxcXCJcXFwiKSB7XFxuICAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2wsXFxuICAubWRjLXNlbGVjdF9fc2VsZWN0ZWQtdGV4dCB7XFxuICAgIHRleHQtaW5kZW50OiAtMnB4OyB9IH1cXG5cXG4ubWRjLXNlbGVjdC0tb3V0bGluZWQge1xcbiAgYm9yZGVyOiBub25lO1xcbiAgb3ZlcmZsb3c6IHZpc2libGU7IH1cXG4gIC5tZGMtc2VsZWN0LS1vdXRsaW5lZDpub3QoLm1kYy1zZWxlY3QtLWRpc2FibGVkKSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyB9XFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbiAgLm1kYy1zZWxlY3QtLW91dGxpbmVkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICAgIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI0KTsgfVxcbiAgLm1kYy1zZWxlY3QtLW91dGxpbmVkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpOm5vdCgubWRjLXNlbGVjdC0tZm9jdXNlZCkgLm1kYy1zZWxlY3RfX25hdGl2ZS1jb250cm9sOmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCk6bm90KC5tZGMtc2VsZWN0LS1mb2N1c2VkKSAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2w6aG92ZXIgfiAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCk6bm90KC5tZGMtc2VsZWN0LS1mb2N1c2VkKSAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2w6aG92ZXIgfiAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcsXFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCk6bm90KC5tZGMtc2VsZWN0LS1mb2N1c2VkKSAubWRjLXNlbGVjdF9fc2VsZWN0ZWQtdGV4dDpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nLFxcbiAgLm1kYy1zZWxlY3QtLW91dGxpbmVkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpOm5vdCgubWRjLXNlbGVjdC0tZm9jdXNlZCkgLm1kYy1zZWxlY3RfX3NlbGVjdGVkLXRleHQ6aG92ZXIgfiAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCk6bm90KC5tZGMtc2VsZWN0LS1mb2N1c2VkKSAubWRjLXNlbGVjdF9fc2VsZWN0ZWQtdGV4dDpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICAgIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxcbiAgLm1kYy1zZWxlY3QtLW91dGxpbmVkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpLm1kYy1zZWxlY3QtLWZvY3VzZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkubWRjLXNlbGVjdC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkubWRjLXNlbGVjdC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcge1xcbiAgICBib3JkZXItd2lkdGg6IDJweDsgfVxcbiAgLm1kYy1zZWxlY3QtLW91dGxpbmVkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpLm1kYy1zZWxlY3QtLWZvY3VzZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkubWRjLXNlbGVjdC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkubWRjLXNlbGVjdC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcge1xcbiAgICBib3JkZXItY29sb3I6ICM2MjAwZWU7XFxuICAgIC8qIEBhbHRlcm5hdGUgKi9cXG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtcHJpbWFyeSwgIzYyMDBlZSk7IH1cXG4gIC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1zaGFrZSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1vdXRsaW5lZCAyNTBtcyAxO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXRleHQtZmllbGQtb3V0bGluZWQgMjUwbXMgMTsgfVxcbiAgLm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHggMCAwIDRweDsgfVxcbiAgICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXNlbGVjdC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsIC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZ1tkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgYm9yZGVyLXJhZGl1czogMCA0cHggNHB4IDA7IH1cXG4gIC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGJvcmRlci1yYWRpdXM6IDAgNHB4IDRweCAwOyB9XFxuICAgIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcsIC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmdbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweCAwIDAgNHB4OyB9XFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQgLm1kYy1zZWxlY3RfX25hdGl2ZS1jb250cm9sIHtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4OyB9XFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQ6OmJlZm9yZSwgLm1kYy1zZWxlY3QtLW91dGxpbmVkOjphZnRlciB7XFxuICAgIGNvbnRlbnQ6IG5vbmU7IH1cXG4gIC5tZGMtc2VsZWN0LS1vdXRsaW5lZDpub3QoLm1kYy1zZWxlY3QtLWRpc2FibGVkKSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyB9XFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTQ0JSkgc2NhbGUoMSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xNDQlKSBzY2FsZSgxKTsgfVxcbiAgLm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gICAgZm9udC1zaXplOiAwLjc1cmVtOyB9XFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUsXFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH1cXG4gIC5tZGMtc2VsZWN0LS1vdXRsaW5lZC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSxcXG4gIC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgICBmb250LXNpemU6IDFyZW07IH1cXG4gIC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2wsXFxuICAubWRjLXNlbGVjdC0tb3V0bGluZWQgLm1kYy1zZWxlY3RfX3NlbGVjdGVkLXRleHQge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHBhZGRpbmctbGVmdDogMTZweDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLXJpZ2h0OiA1MnB4O1xcbiAgICBkaXNwbGF5OiAtd2Via2l0LWJveDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgcGFkZGluZy10b3A6IDEycHg7XFxuICAgIHBhZGRpbmctYm90dG9tOiAxMnB4O1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgICB6LWluZGV4OiAxOyB9XFxuICAgIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2wsIC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2xbZGlyPVxcXCJydGxcXFwiXSwgW2Rpcj1cXFwicnRsXFxcIl1cXG4gICAgLm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtc2VsZWN0X19zZWxlY3RlZC10ZXh0LFxcbiAgICAubWRjLXNlbGVjdC0tb3V0bGluZWQgLm1kYy1zZWxlY3RfX3NlbGVjdGVkLXRleHRbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIHBhZGRpbmctbGVmdDogNTJweDtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgcGFkZGluZy1yaWdodDogMTZweDsgfVxcbiAgLm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtc2VsZWN0X19zZWxlY3RlZC10ZXh0IHtcXG4gICAgcGFkZGluZy10b3A6IDE0cHg7IH1cXG4gIC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLXNlbGVjdF9faWNvbiB7XFxuICAgIHotaW5kZXg6IDI7IH1cXG4gIC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLWZsb2F0aW5nLWxhYmVsIHtcXG4gICAgbGluZS1oZWlnaHQ6IDEuMTVyZW07XFxuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOyB9XFxuXFxuLm1kYy1zZWxlY3QtLWludmFsaWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkgLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICBjb2xvcjogI2IwMDAyMDtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy1zZWxlY3QtLWludmFsaWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkgLm1kYy1zZWxlY3RfX25hdGl2ZS1jb250cm9sLFxcbi5tZGMtc2VsZWN0LS1pbnZhbGlkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpIC5tZGMtc2VsZWN0X19zZWxlY3RlZC10ZXh0IHtcXG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy1zZWxlY3QtLWludmFsaWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkubWRjLXNlbGVjdC0tZm9jdXNlZCAubWRjLWxpbmUtcmlwcGxlIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy1zZWxlY3QtLWludmFsaWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkubWRjLXNlbGVjdC0tZm9jdXNlZCAubWRjLWZsb2F0aW5nLWxhYmVsIHtcXG4gIGNvbG9yOiAjYjAwMDIwOyB9XFxuXFxuLm1kYy1zZWxlY3QtLWludmFsaWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkubWRjLXNlbGVjdC0taW52YWxpZCArIC5tZGMtc2VsZWN0LWhlbHBlci10ZXh0LS12YWxpZGF0aW9uLW1zZyB7XFxuICBjb2xvcjogI2IwMDAyMDtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy1zZWxlY3QtLWludmFsaWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkgLm1kYy1zZWxlY3RfX25hdGl2ZS1jb250cm9sOmhvdmVyIHtcXG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy1zZWxlY3QtLWludmFsaWQubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuLm1kYy1zZWxlY3QtLWludmFsaWQubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbi5tZGMtc2VsZWN0LS1pbnZhbGlkLm1kYy1zZWxlY3QtLW91dGxpbmVkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICBib3JkZXItY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBib3JkZXItY29sb3I6IHZhcigtLW1kYy10aGVtZS1lcnJvciwgI2IwMDAyMCk7IH1cXG5cXG4ubWRjLXNlbGVjdC0taW52YWxpZC5tZGMtc2VsZWN0LS1vdXRsaW5lZDpub3QoLm1kYy1zZWxlY3QtLWRpc2FibGVkKTpub3QoLm1kYy1zZWxlY3QtLWZvY3VzZWQpIC5tZGMtc2VsZWN0X19uYXRpdmUtY29udHJvbDpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nLFxcbi5tZGMtc2VsZWN0LS1pbnZhbGlkLm1kYy1zZWxlY3QtLW91dGxpbmVkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpOm5vdCgubWRjLXNlbGVjdC0tZm9jdXNlZCkgLm1kYy1zZWxlY3RfX25hdGl2ZS1jb250cm9sOmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbi5tZGMtc2VsZWN0LS1pbnZhbGlkLm1kYy1zZWxlY3QtLW91dGxpbmVkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpOm5vdCgubWRjLXNlbGVjdC0tZm9jdXNlZCkgLm1kYy1zZWxlY3RfX25hdGl2ZS1jb250cm9sOmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nLFxcbi5tZGMtc2VsZWN0LS1pbnZhbGlkLm1kYy1zZWxlY3QtLW91dGxpbmVkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpOm5vdCgubWRjLXNlbGVjdC0tZm9jdXNlZCkgLm1kYy1zZWxlY3RfX3NlbGVjdGVkLXRleHQ6aG92ZXIgfiAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyxcXG4ubWRjLXNlbGVjdC0taW52YWxpZC5tZGMtc2VsZWN0LS1vdXRsaW5lZDpub3QoLm1kYy1zZWxlY3QtLWRpc2FibGVkKTpub3QoLm1kYy1zZWxlY3QtLWZvY3VzZWQpIC5tZGMtc2VsZWN0X19zZWxlY3RlZC10ZXh0OmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbi5tZGMtc2VsZWN0LS1pbnZhbGlkLm1kYy1zZWxlY3QtLW91dGxpbmVkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpOm5vdCgubWRjLXNlbGVjdC0tZm9jdXNlZCkgLm1kYy1zZWxlY3RfX3NlbGVjdGVkLXRleHQ6aG92ZXIgfiAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcge1xcbiAgYm9yZGVyLWNvbG9yOiAjYjAwMDIwO1xcbiAgLyogQGFsdGVybmF0ZSAqL1xcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy1zZWxlY3QtLWludmFsaWQubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkubWRjLXNlbGVjdC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyxcXG4ubWRjLXNlbGVjdC0taW52YWxpZC5tZGMtc2VsZWN0LS1vdXRsaW5lZDpub3QoLm1kYy1zZWxlY3QtLWRpc2FibGVkKS5tZGMtc2VsZWN0LS1mb2N1c2VkIC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCxcXG4ubWRjLXNlbGVjdC0taW52YWxpZC5tZGMtc2VsZWN0LS1vdXRsaW5lZDpub3QoLm1kYy1zZWxlY3QtLWRpc2FibGVkKS5tZGMtc2VsZWN0LS1mb2N1c2VkIC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICBib3JkZXItd2lkdGg6IDJweDsgfVxcblxcbi5tZGMtc2VsZWN0LS1pbnZhbGlkLm1kYy1zZWxlY3QtLW91dGxpbmVkOm5vdCgubWRjLXNlbGVjdC0tZGlzYWJsZWQpLm1kYy1zZWxlY3QtLWZvY3VzZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuLm1kYy1zZWxlY3QtLWludmFsaWQubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkubWRjLXNlbGVjdC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXFxuLm1kYy1zZWxlY3QtLWludmFsaWQubWRjLXNlbGVjdC0tb3V0bGluZWQ6bm90KC5tZGMtc2VsZWN0LS1kaXNhYmxlZCkubWRjLXNlbGVjdC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcge1xcbiAgYm9yZGVyLWNvbG9yOiAjYjAwMDIwO1xcbiAgLyogQGFsdGVybmF0ZSAqL1xcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy1zZWxlY3QtLWludmFsaWQgLm1kYy1zZWxlY3RfX2Ryb3Bkb3duLWljb24ge1xcbiAgYmFja2dyb3VuZDogdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnJTIwd2lkdGglM0QlMjIxMHB4JTIyJTIwaGVpZ2h0JTNEJTIyNXB4JTIyJTIwdmlld0JveCUzRCUyMjclMjAxMCUyMDEwJTIwNSUyMiUyMHZlcnNpb24lM0QlMjIxLjElMjIlMjB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMjAwMCUyRnN2ZyUyMiUyMHhtbG5zJTNBeGxpbmslM0QlMjJodHRwJTNBJTJGJTJGd3d3LnczLm9yZyUyRjE5OTklMkZ4bGluayUyMiUzRSUwQSUyMCUyMCUyMCUyMCUzQ3BvbHlnb24lMjBpZCUzRCUyMlNoYXBlJTIyJTIwc3Ryb2tlJTNEJTIybm9uZSUyMiUyMGZpbGwlM0QlMjIlMjNiMDAwMjAlMjIlMjBmaWxsLXJ1bGUlM0QlMjJldmVub2RkJTIyJTIwb3BhY2l0eSUzRCUyMjElMjIlMjBwb2ludHMlM0QlMjI3JTIwMTAlMjAxMiUyMDE1JTIwMTclMjAxMCUyMiUzRSUzQyUyRnBvbHlnb24lM0UlMEElM0MlMkZzdmclM0VcXFwiKSBuby1yZXBlYXQgY2VudGVyOyB9XFxuXFxuLm1kYy1zZWxlY3QtLWludmFsaWQgKyAubWRjLXNlbGVjdC1oZWxwZXItdGV4dC0tdmFsaWRhdGlvbi1tc2cge1xcbiAgb3BhY2l0eTogMTsgfVxcblxcbi5tZGMtc2VsZWN0LS1yZXF1aXJlZCAubWRjLWZsb2F0aW5nLWxhYmVsOjphZnRlciB7XFxuICBjb250ZW50OiBcXFwiKlxcXCI7IH1cXG5cXG4ubWRjLXNlbGVjdC0tZGlzYWJsZWQge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lOyB9XFxuICAubWRjLXNlbGVjdC0tZGlzYWJsZWQgLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzcpOyB9XFxuICAubWRjLXNlbGVjdC0tZGlzYWJsZWQgLm1kYy1zZWxlY3RfX2Ryb3Bkb3duLWljb24ge1xcbiAgICBiYWNrZ3JvdW5kOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmclMjB3aWR0aCUzRCUyMjEwcHglMjIlMjBoZWlnaHQlM0QlMjI1cHglMjIlMjB2aWV3Qm94JTNEJTIyNyUyMDEwJTIwMTAlMjA1JTIyJTIwdmVyc2lvbiUzRCUyMjEuMSUyMiUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJTIyJTIweG1sbnMlM0F4bGluayUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMTk5OSUyRnhsaW5rJTIyJTNFJTBBJTIwJTIwJTIwJTIwJTNDcG9seWdvbiUyMGlkJTNEJTIyU2hhcGUlMjIlMjBzdHJva2UlM0QlMjJub25lJTIyJTIwZmlsbCUzRCUyMiUyMzAwMCUyMiUyMGZpbGwtcnVsZSUzRCUyMmV2ZW5vZGQlMjIlMjBvcGFjaXR5JTNEJTIyMC4zNyUyMiUyMHBvaW50cyUzRCUyMjclMjAxMCUyMDEyJTIwMTUlMjAxNyUyMDEwJTIyJTNFJTNDJTJGcG9seWdvbiUzRSUwQSUzQyUyRnN2ZyUzRVxcXCIpIG5vLXJlcGVhdCBjZW50ZXI7IH1cXG4gIC5tZGMtc2VsZWN0LS1kaXNhYmxlZCAubWRjLWxpbmUtcmlwcGxlIHtcXG4gICAgZGlzcGxheTogbm9uZTsgfVxcbiAgLm1kYy1zZWxlY3QtLWRpc2FibGVkIC5tZGMtc2VsZWN0X19pY29uIHtcXG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNyk7IH1cXG4gIC5tZGMtc2VsZWN0LS1kaXNhYmxlZCAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2wsXFxuICAubWRjLXNlbGVjdC0tZGlzYWJsZWQgLm1kYy1zZWxlY3RfX3NlbGVjdGVkLXRleHQge1xcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM3KTtcXG4gICAgYm9yZGVyLWJvdHRvbS1zdHlsZTogZG90dGVkOyB9XFxuICAubWRjLXNlbGVjdC0tZGlzYWJsZWQgLm1kYy1zZWxlY3RfX3NlbGVjdGVkLXRleHQge1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsgfVxcbiAgLm1kYy1zZWxlY3QtLWRpc2FibGVkLm1kYy1zZWxlY3QtLW91dGxpbmVkIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IH1cXG4gICAgLm1kYy1zZWxlY3QtLWRpc2FibGVkLm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtc2VsZWN0X19uYXRpdmUtY29udHJvbCxcXG4gICAgLm1kYy1zZWxlY3QtLWRpc2FibGVkLm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtc2VsZWN0X19zZWxlY3RlZC10ZXh0IHtcXG4gICAgICBib3JkZXItYm90dG9tLXN0eWxlOiBub25lOyB9XFxuICAgIC5tZGMtc2VsZWN0LS1kaXNhYmxlZC5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyxcXG4gICAgLm1kYy1zZWxlY3QtLWRpc2FibGVkLm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCxcXG4gICAgLm1kYy1zZWxlY3QtLWRpc2FibGVkLm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICAgICAgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTYpOyB9XFxuXFxuLm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uIC5tZGMtc2VsZWN0X19pY29uIHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIGxlZnQ6IDE2cHg7XFxuICAvKiBAbm9mbGlwICovXFxuICByaWdodDogaW5pdGlhbDsgfVxcbiAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uIC5tZGMtc2VsZWN0X19pY29uLCAubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy1zZWxlY3RfX2ljb25bZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogaW5pdGlhbDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogMTZweDsgfVxcblxcbi5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbiAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2wsXFxuLm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uIC5tZGMtc2VsZWN0X19zZWxlY3RlZC10ZXh0IHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctbGVmdDogNDhweDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctcmlnaHQ6IDMycHg7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbiAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2wsIC5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbiAubWRjLXNlbGVjdF9fbmF0aXZlLWNvbnRyb2xbZGlyPVxcXCJydGxcXFwiXSwgW2Rpcj1cXFwicnRsXFxcIl1cXG4gIC5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbiAubWRjLXNlbGVjdF9fc2VsZWN0ZWQtdGV4dCxcXG4gIC5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbiAubWRjLXNlbGVjdF9fc2VsZWN0ZWQtdGV4dFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLWxlZnQ6IDMycHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcGFkZGluZy1yaWdodDogNDhweDsgfVxcblxcbi5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbi5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTQ0JSkgdHJhbnNsYXRlWCgtMzJweCkgc2NhbGUoMSk7XFxuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTQ0JSkgdHJhbnNsYXRlWCgtMzJweCkgc2NhbGUoMSk7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbi5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSwgLm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uLm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTQ0JSkgdHJhbnNsYXRlWCgzMnB4KSBzY2FsZSgxKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTE0NCUpIHRyYW5zbGF0ZVgoMzJweCkgc2NhbGUoMSk7IH1cXG5cXG4ubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXNlbGVjdC0tb3V0bGluZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgZm9udC1zaXplOiAwLjc1cmVtOyB9XFxuXFxuLm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uLm1kYy1zZWxlY3QtLW91dGxpbmVkLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlLFxcbi5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbi5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEzMCUpIHRyYW5zbGF0ZVgoLTMycHgpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEzMCUpIHRyYW5zbGF0ZVgoLTMycHgpIHNjYWxlKDAuNzUpOyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXNlbGVjdC0tb3V0bGluZWQubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUsIC5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbi5tZGMtc2VsZWN0LS1vdXRsaW5lZC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZVtkaXI9XFxcInJ0bFxcXCJdLCBbZGlyPVxcXCJydGxcXFwiXVxcbiAgLm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uLm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSxcXG4gIC5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbi5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmVbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMzAlKSB0cmFuc2xhdGVYKDMycHgpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTMwJSkgdHJhbnNsYXRlWCgzMnB4KSBzY2FsZSgwLjc1KTsgfVxcblxcbi5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbi5tZGMtc2VsZWN0LS1vdXRsaW5lZC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSxcXG4ubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXNlbGVjdC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gIGZvbnQtc2l6ZTogMXJlbTsgfVxcblxcbi5tZGMtc2VsZWN0LS13aXRoLWxlYWRpbmctaWNvbi5tZGMtc2VsZWN0LS1vdXRsaW5lZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1zaGFrZSB7XFxuICAtd2Via2l0LWFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXNlbGVjdC1vdXRsaW5lZC1sZWFkaW5nLWljb24gMjUwbXMgMTtcXG4gICAgICAgICAgYW5pbWF0aW9uOiBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtc2VsZWN0LW91dGxpbmVkLWxlYWRpbmctaWNvbiAyNTBtcyAxOyB9XFxuXFxuW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uLm1kYy1zZWxlY3QtLW91dGxpbmVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLXNoYWtlLCAubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXNlbGVjdC0tb3V0bGluZWRbZGlyPVxcXCJydGxcXFwiXSAubWRjLWZsb2F0aW5nLWxhYmVsLS1zaGFrZSB7XFxuICAtd2Via2l0LWFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXNlbGVjdC1vdXRsaW5lZC1sZWFkaW5nLWljb24tcnRsIDI1MG1zIDE7XFxuICAgICAgICAgIGFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXNlbGVjdC1vdXRsaW5lZC1sZWFkaW5nLWljb24tcnRsIDI1MG1zIDE7IH1cXG5cXG4ubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXNlbGVjdF9fbWVudSAubWRjLWxpc3QtaXRlbV9fdGV4dCB7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLWxlZnQ6IDMycHg7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLXJpZ2h0OiAzMnB4OyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXNlbGVjdC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXNlbGVjdF9fbWVudSAubWRjLWxpc3QtaXRlbV9fdGV4dCwgLm1kYy1zZWxlY3QtLXdpdGgtbGVhZGluZy1pY29uLm1kYy1zZWxlY3RfX21lbnUgLm1kYy1saXN0LWl0ZW1fX3RleHRbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcGFkZGluZy1sZWZ0OiAzMnB4O1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHBhZGRpbmctcmlnaHQ6IDMycHg7IH1cXG5cXG4ubWRjLXNlbGVjdF9fbWVudSAubWRjLWxpc3QgLm1kYy1saXN0LWl0ZW0tLXNlbGVjdGVkIHtcXG4gIGNvbG9yOiAjMDAwO1xcbiAgLyogQGFsdGVybmF0ZSAqL1xcbiAgY29sb3I6IHZhcigtLW1kYy10aGVtZS1vbi1zdXJmYWNlLCAjMDAwKTsgfVxcbiAgLm1kYy1zZWxlY3RfX21lbnUgLm1kYy1saXN0IC5tZGMtbGlzdC1pdGVtLS1zZWxlY3RlZDo6YmVmb3JlLCAubWRjLXNlbGVjdF9fbWVudSAubWRjLWxpc3QgLm1kYy1saXN0LWl0ZW0tLXNlbGVjdGVkOjphZnRlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDA7IH1cXG4gICAgQHN1cHBvcnRzIG5vdCAoLW1zLWltZS1hbGlnbjogYXV0bykge1xcbiAgICAgIC5tZGMtc2VsZWN0X19tZW51IC5tZGMtbGlzdCAubWRjLWxpc3QtaXRlbS0tc2VsZWN0ZWQ6OmJlZm9yZSwgLm1kYy1zZWxlY3RfX21lbnUgLm1kYy1saXN0IC5tZGMtbGlzdC1pdGVtLS1zZWxlY3RlZDo6YWZ0ZXIge1xcbiAgICAgICAgLyogQGFsdGVybmF0ZSAqL1xcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWRjLXRoZW1lLW9uLXN1cmZhY2UsICMwMDApOyB9IH1cXG4gIC5tZGMtc2VsZWN0X19tZW51IC5tZGMtbGlzdCAubWRjLWxpc3QtaXRlbS0tc2VsZWN0ZWQ6aG92ZXI6OmJlZm9yZSB7XFxuICAgIG9wYWNpdHk6IDAuMDQ7IH1cXG4gIC5tZGMtc2VsZWN0X19tZW51IC5tZGMtbGlzdCAubWRjLWxpc3QtaXRlbS0tc2VsZWN0ZWQ6bm90KC5tZGMtcmlwcGxlLXVwZ3JhZGVkKTpmb2N1czo6YmVmb3JlLCAubWRjLXNlbGVjdF9fbWVudSAubWRjLWxpc3QgLm1kYy1saXN0LWl0ZW0tLXNlbGVjdGVkLm1kYy1yaXBwbGUtdXBncmFkZWQtLWJhY2tncm91bmQtZm9jdXNlZDo6YmVmb3JlIHtcXG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiA3NW1zO1xcbiAgICAgICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDc1bXM7XFxuICAgIG9wYWNpdHk6IDAuMTI7IH1cXG4gIC5tZGMtc2VsZWN0X19tZW51IC5tZGMtbGlzdCAubWRjLWxpc3QtaXRlbS0tc2VsZWN0ZWQ6bm90KC5tZGMtcmlwcGxlLXVwZ3JhZGVkKTo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgMTUwbXMgbGluZWFyO1xcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDE1MG1zIGxpbmVhcjsgfVxcbiAgLm1kYy1zZWxlY3RfX21lbnUgLm1kYy1saXN0IC5tZGMtbGlzdC1pdGVtLS1zZWxlY3RlZDpub3QoLm1kYy1yaXBwbGUtdXBncmFkZWQpOmFjdGl2ZTo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDc1bXM7XFxuICAgICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogNzVtcztcXG4gICAgb3BhY2l0eTogMC4xMjsgfVxcbiAgLm1kYy1zZWxlY3RfX21lbnUgLm1kYy1saXN0IC5tZGMtbGlzdC1pdGVtLS1zZWxlY3RlZC5tZGMtcmlwcGxlLXVwZ3JhZGVkIHtcXG4gICAgLS1tZGMtcmlwcGxlLWZnLW9wYWNpdHk6IDAuMTI7IH1cXG5cXG5ALXdlYmtpdC1rZXlmcmFtZXMgbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXNlbGVjdC1vdXRsaW5lZC1sZWFkaW5nLWljb24ge1xcbiAgMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAzMnB4KSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgNjYlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIDMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAzMnB4KSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAzMnB4KSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfSB9XFxuXFxuQGtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtc2VsZWN0LW91dGxpbmVkLWxlYWRpbmctaWNvbiB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICAzMyUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNzAxNzMsIDAuNDk1ODIpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNzAxNzMsIDAuNDk1ODIpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICA2NiUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIDMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMTAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9IH1cXG5cXG5ALXdlYmtpdC1rZXlmcmFtZXMgbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXNlbGVjdC1vdXRsaW5lZC1sZWFkaW5nLWljb24tcnRsIHtcXG4gIDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gLTMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gLTMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIC0zMnB4KSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAtMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICA2NiUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gLTMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAtMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gLTMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gLTMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfSB9XFxuXFxuQGtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtc2VsZWN0LW91dGxpbmVkLWxlYWRpbmctaWNvbi1ydGwge1xcbiAgMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAtMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAtMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICAzMyUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNzAxNzMsIDAuNDk1ODIpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNzAxNzMsIDAuNDk1ODIpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gLTMycHgpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIC0zMnB4KSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDY2JSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAtMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIC0zMnB4KSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAtMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAtMzJweCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9IH1cIiwgXCJcIl0pO1xuIiwiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiKShmYWxzZSk7XG4vLyBNb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy10ZXh0LWZpZWxkX19pY29uLFxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uIC5tZGMtdGV4dC1maWVsZF9faWNvbiB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBib3R0b206IDE2cHg7XFxuICBjdXJzb3I6IHBvaW50ZXI7IH1cXG5cXG4ubWRjLXRleHQtZmllbGRfX2ljb246bm90KFt0YWJpbmRleF0pLFxcbi5tZGMtdGV4dC1maWVsZF9faWNvblt0YWJpbmRleD1cXFwiLTFcXFwiXSB7XFxuICBjdXJzb3I6IGRlZmF1bHQ7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC1oZWxwZXItdGV4dCB7XFxuICBmb250LWZhbWlseTogUm9ib3RvLCBzYW5zLXNlcmlmO1xcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcXG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDMzMzNlbTtcXG4gIHRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDtcXG4gIHRleHQtdHJhbnNmb3JtOiBpbmhlcml0O1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBtYXJnaW4tdG9wOiAwO1xcbiAgLyogQGFsdGVybmF0ZSAqL1xcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcXG4gIG1hcmdpbjogMDtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgb3BhY2l0eTogMDtcXG4gIHdpbGwtY2hhbmdlOiBvcGFjaXR5OyB9XFxuICAubWRjLXRleHQtZmllbGQtaGVscGVyLXRleHQ6OmJlZm9yZSB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgd2lkdGg6IDA7XFxuICAgIGhlaWdodDogMTZweDtcXG4gICAgY29udGVudDogXFxcIlxcXCI7XFxuICAgIHZlcnRpY2FsLWFsaWduOiAwOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLWhlbHBlci10ZXh0LS1wZXJzaXN0ZW50IHtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogbm9uZTtcXG4gIHRyYW5zaXRpb246IG5vbmU7XFxuICBvcGFjaXR5OiAxO1xcbiAgd2lsbC1jaGFuZ2U6IGluaXRpYWw7IH1cXG5cXG4ubWRjLWZsb2F0aW5nLWxhYmVsIHtcXG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIHNhbnMtc2VyaWY7XFxuICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XFxuICBmb250LXNpemU6IDFyZW07XFxuICBsaW5lLWhlaWdodDogMS43NXJlbTtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMDkzN2VtO1xcbiAgdGV4dC1kZWNvcmF0aW9uOiBpbmhlcml0O1xcbiAgdGV4dC10cmFuc2Zvcm06IGluaGVyaXQ7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAvKiBAbm9mbGlwICovXFxuICBsZWZ0OiAwO1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IHRvcDtcXG4gICAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IGNvbG9yIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksIC13ZWJraXQtdHJhbnNmb3JtIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICB0cmFuc2l0aW9uOiBjb2xvciAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpLCAtd2Via2l0LXRyYW5zZm9ybSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksIGNvbG9yIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMTUwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKSwgY29sb3IgMTUwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKSwgLXdlYmtpdC10cmFuc2Zvcm0gMTUwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGxpbmUtaGVpZ2h0OiAxLjE1cmVtO1xcbiAgdGV4dC1hbGlnbjogbGVmdDtcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG4gIGN1cnNvcjogdGV4dDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLWZsb2F0aW5nLWxhYmVsLCAubWRjLWZsb2F0aW5nLWxhYmVsW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHJpZ2h0OiAwO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IGF1dG87XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCB0b3A7XFxuICAgICAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHRleHQtYWxpZ246IHJpZ2h0OyB9XFxuXFxuLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgY3Vyc29yOiBhdXRvOyB9XFxuXFxuLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwLjc1KTsgfVxcblxcbi5tZGMtZmxvYXRpbmctbGFiZWwtLXNoYWtlIHtcXG4gIC13ZWJraXQtYW5pbWF0aW9uOiBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtc3RhbmRhcmQgMjUwbXMgMTtcXG4gICAgICAgICAgYW5pbWF0aW9uOiBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtc3RhbmRhcmQgMjUwbXMgMTsgfVxcblxcbkAtd2Via2l0LWtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtc3RhbmRhcmQge1xcbiAgMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDAlKSkgdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDAlKSkgdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgNjYlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIDAlKSkgdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwLjc1KTsgfSB9XFxuXFxuQGtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtc3RhbmRhcmQge1xcbiAgMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDAlKSkgdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDAlKSkgdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgNjYlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIDAlKSkgdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwLjc1KTsgfSB9XFxuXFxuLm1kYy1saW5lLXJpcHBsZSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBib3R0b206IDA7XFxuICBsZWZ0OiAwO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDJweDtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMCk7XFxuICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDApO1xcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IDE4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksIC13ZWJraXQtdHJhbnNmb3JtIDE4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDE4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksIC13ZWJraXQtdHJhbnNmb3JtIDE4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMTgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKSwgb3BhY2l0eSAxODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDE4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksIG9wYWNpdHkgMTgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKSwgLXdlYmtpdC10cmFuc2Zvcm0gMTgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gIG9wYWNpdHk6IDA7XFxuICB6LWluZGV4OiAyOyB9XFxuXFxuLm1kYy1saW5lLXJpcHBsZS0tYWN0aXZlIHtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMSk7XFxuICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDEpO1xcbiAgb3BhY2l0eTogMTsgfVxcblxcbi5tZGMtbGluZS1yaXBwbGUtLWRlYWN0aXZhdGluZyB7XFxuICBvcGFjaXR5OiAwOyB9XFxuXFxuLm1kYy1ub3RjaGVkLW91dGxpbmUge1xcbiAgZGlzcGxheTogLXdlYmtpdC1ib3g7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgcmlnaHQ6IDA7XFxuICBsZWZ0OiAwO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgbWF4LXdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgdGV4dC1hbGlnbjogbGVmdDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lOyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLW5vdGNoZWQtb3V0bGluZSwgLm1kYy1ub3RjaGVkLW91dGxpbmVbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7IH1cXG4gIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nLCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIGhlaWdodDogMTAwJTtcXG4gICAgLXdlYmtpdC10cmFuc2l0aW9uOiBib3JkZXIgMTUwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gICAgdHJhbnNpdGlvbjogYm9yZGVyIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZDtcXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsgfVxcbiAgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQ7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgYm9yZGVyLXJpZ2h0OiBub25lO1xcbiAgICB3aWR0aDogMTJweDsgfVxcbiAgICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZywgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmdbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIGJvcmRlci1sZWZ0OiBub25lO1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZDsgfVxcbiAgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBib3JkZXItbGVmdDogbm9uZTtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZDtcXG4gICAgLXdlYmtpdC1ib3gtZmxleDogMTtcXG4gICAgICAgICAgICBmbGV4LWdyb3c6IDE7IH1cXG4gICAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nLCAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmdbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQ7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIGJvcmRlci1yaWdodDogbm9uZTsgfVxcbiAgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoIHtcXG4gICAgLXdlYmtpdC1ib3gtZmxleDogMDtcXG4gICAgICAgICAgICBmbGV4OiAwIDAgYXV0bztcXG4gICAgd2lkdGg6IGF1dG87XFxuICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gMTJweCAqIDIpOyB9XFxuICAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLWZsb2F0aW5nLWxhYmVsIHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHRvcDogMTdweDtcXG4gICAgYm90dG9tOiBhdXRvO1xcbiAgICBtYXgtd2lkdGg6IDEwMCU7IH1cXG4gIC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gICAgdGV4dC1vdmVyZmxvdzogY2xpcDsgfVxcbiAgLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLyAuNzUpOyB9XFxuXFxuLm1kYy1ub3RjaGVkLW91dGxpbmUtLW5vdGNoZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoIHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctbGVmdDogMDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctcmlnaHQ6IDhweDtcXG4gIGJvcmRlci10b3A6IG5vbmU7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtbm90Y2hlZC1vdXRsaW5lLS1ub3RjaGVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCwgLm1kYy1ub3RjaGVkLW91dGxpbmUtLW5vdGNoZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHBhZGRpbmctbGVmdDogOHB4O1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHBhZGRpbmctcmlnaHQ6IDA7IH1cXG5cXG4ubWRjLW5vdGNoZWQtb3V0bGluZS0tbm8tbGFiZWwgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoIHtcXG4gIHBhZGRpbmc6IDA7IH1cXG5cXG5ALXdlYmtpdC1rZXlmcmFtZXMgbWRjLXJpcHBsZS1mZy1yYWRpdXMtaW4ge1xcbiAgZnJvbSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLXN0YXJ0LCAwKSkgc2NhbGUoMSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tbWRjLXJpcHBsZS1mZy10cmFuc2xhdGUtc3RhcnQsIDApKSBzY2FsZSgxKTsgfVxcbiAgdG8ge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLWVuZCwgMCkpIHNjYWxlKHZhcigtLW1kYy1yaXBwbGUtZmctc2NhbGUsIDEpKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1lbmQsIDApKSBzY2FsZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXNjYWxlLCAxKSk7IH0gfVxcblxcbkBrZXlmcmFtZXMgbWRjLXJpcHBsZS1mZy1yYWRpdXMtaW4ge1xcbiAgZnJvbSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLXN0YXJ0LCAwKSkgc2NhbGUoMSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tbWRjLXJpcHBsZS1mZy10cmFuc2xhdGUtc3RhcnQsIDApKSBzY2FsZSgxKTsgfVxcbiAgdG8ge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLWVuZCwgMCkpIHNjYWxlKHZhcigtLW1kYy1yaXBwbGUtZmctc2NhbGUsIDEpKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1lbmQsIDApKSBzY2FsZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXNjYWxlLCAxKSk7IH0gfVxcblxcbkAtd2Via2l0LWtleWZyYW1lcyBtZGMtcmlwcGxlLWZnLW9wYWNpdHktaW4ge1xcbiAgZnJvbSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjtcXG4gICAgb3BhY2l0eTogMDsgfVxcbiAgdG8ge1xcbiAgICBvcGFjaXR5OiB2YXIoLS1tZGMtcmlwcGxlLWZnLW9wYWNpdHksIDApOyB9IH1cXG5cXG5Aa2V5ZnJhbWVzIG1kYy1yaXBwbGUtZmctb3BhY2l0eS1pbiB7XFxuICBmcm9tIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogbGluZWFyO1xcbiAgICBvcGFjaXR5OiAwOyB9XFxuICB0byB7XFxuICAgIG9wYWNpdHk6IHZhcigtLW1kYy1yaXBwbGUtZmctb3BhY2l0eSwgMCk7IH0gfVxcblxcbkAtd2Via2l0LWtleWZyYW1lcyBtZGMtcmlwcGxlLWZnLW9wYWNpdHktb3V0IHtcXG4gIGZyb20ge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7XFxuICAgIG9wYWNpdHk6IHZhcigtLW1kYy1yaXBwbGUtZmctb3BhY2l0eSwgMCk7IH1cXG4gIHRvIHtcXG4gICAgb3BhY2l0eTogMDsgfSB9XFxuXFxuQGtleWZyYW1lcyBtZGMtcmlwcGxlLWZnLW9wYWNpdHktb3V0IHtcXG4gIGZyb20ge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBsaW5lYXI7XFxuICAgIG9wYWNpdHk6IHZhcigtLW1kYy1yaXBwbGUtZmctb3BhY2l0eSwgMCk7IH1cXG4gIHRvIHtcXG4gICAgb3BhY2l0eTogMDsgfSB9XFxuXFxuLm1kYy1yaXBwbGUtc3VyZmFjZS0tdGVzdC1lZGdlLXZhci1idWcge1xcbiAgLS1tZGMtcmlwcGxlLXN1cmZhY2UtdGVzdC1lZGdlLXZhcjogMXB4IHNvbGlkICMwMDA7XFxuICB2aXNpYmlsaXR5OiBoaWRkZW47IH1cXG4gIC5tZGMtcmlwcGxlLXN1cmZhY2UtLXRlc3QtZWRnZS12YXItYnVnOjpiZWZvcmUge1xcbiAgICBib3JkZXI6IHZhcigtLW1kYy1yaXBwbGUtc3VyZmFjZS10ZXN0LWVkZ2UtdmFyKTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC1oZWxwZXItdGV4dCB7XFxuICBmb250LWZhbWlseTogUm9ib3RvLCBzYW5zLXNlcmlmO1xcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcXG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDMzMzNlbTtcXG4gIHRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDtcXG4gIHRleHQtdHJhbnNmb3JtOiBpbmhlcml0O1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBtYXJnaW4tdG9wOiAwO1xcbiAgLyogQGFsdGVybmF0ZSAqL1xcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcXG4gIG1hcmdpbjogMDtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgb3BhY2l0eTogMDtcXG4gIHdpbGwtY2hhbmdlOiBvcGFjaXR5OyB9XFxuICAubWRjLXRleHQtZmllbGQtaGVscGVyLXRleHQ6OmJlZm9yZSB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgd2lkdGg6IDA7XFxuICAgIGhlaWdodDogMTZweDtcXG4gICAgY29udGVudDogXFxcIlxcXCI7XFxuICAgIHZlcnRpY2FsLWFsaWduOiAwOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLWhlbHBlci10ZXh0LS1wZXJzaXN0ZW50IHtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogbm9uZTtcXG4gIHRyYW5zaXRpb246IG5vbmU7XFxuICBvcGFjaXR5OiAxO1xcbiAgd2lsbC1jaGFuZ2U6IGluaXRpYWw7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtY2hhcmFjdGVyLWNvdW50ZXIge1xcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgc2Fucy1zZXJpZjtcXG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XFxuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcXG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcXG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAzMzMzZW07XFxuICB0ZXh0LWRlY29yYXRpb246IGluaGVyaXQ7XFxuICB0ZXh0LXRyYW5zZm9ybTogaW5oZXJpdDtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWFyZ2luLXRvcDogMDtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGxpbmUtaGVpZ2h0OiBub3JtYWw7XFxuICAvKiBAbm9mbGlwICovXFxuICBtYXJnaW4tbGVmdDogYXV0bztcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIG1hcmdpbi1yaWdodDogMDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctbGVmdDogMTZweDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctcmlnaHQ6IDA7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwOyB9XFxuICAubWRjLXRleHQtZmllbGQtY2hhcmFjdGVyLWNvdW50ZXI6OmJlZm9yZSB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgd2lkdGg6IDA7XFxuICAgIGhlaWdodDogMTZweDtcXG4gICAgY29udGVudDogXFxcIlxcXCI7XFxuICAgIHZlcnRpY2FsLWFsaWduOiAwOyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtY2hhcmFjdGVyLWNvdW50ZXIsIC5tZGMtdGV4dC1maWVsZC1jaGFyYWN0ZXItY291bnRlcltkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBtYXJnaW4tbGVmdDogMDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC1jaGFyYWN0ZXItY291bnRlciwgLm1kYy10ZXh0LWZpZWxkLWNoYXJhY3Rlci1jb3VudGVyW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHBhZGRpbmctbGVmdDogMDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLXJpZ2h0OiAxNnB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbiAubWRjLXRleHQtZmllbGRfX2ljb24sXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24gLm1kYy10ZXh0LWZpZWxkX19pY29uIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGJvdHRvbTogMTZweDtcXG4gIGN1cnNvcjogcG9pbnRlcjsgfVxcblxcbi5tZGMtdGV4dC1maWVsZF9faWNvbjpub3QoW3RhYmluZGV4XSksXFxuLm1kYy10ZXh0LWZpZWxkX19pY29uW3RhYmluZGV4PVxcXCItMVxcXCJdIHtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkIHtcXG4gIC0tbWRjLXJpcHBsZS1mZy1zaXplOiAwO1xcbiAgLS1tZGMtcmlwcGxlLWxlZnQ6IDA7XFxuICAtLW1kYy1yaXBwbGUtdG9wOiAwO1xcbiAgLS1tZGMtcmlwcGxlLWZnLXNjYWxlOiAxO1xcbiAgLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1lbmQ6IDA7XFxuICAtLW1kYy1yaXBwbGUtZmctdHJhbnNsYXRlLXN0YXJ0OiAwO1xcbiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApO1xcbiAgYm9yZGVyLXJhZGl1czogNHB4IDRweCAwIDA7XFxuICBkaXNwbGF5OiAtd2Via2l0LWlubGluZS1ib3g7XFxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICBoZWlnaHQ6IDU2cHg7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgLyogQGFsdGVybmF0ZSAqL1xcbiAgd2lsbC1jaGFuZ2U6IG9wYWNpdHksIHRyYW5zZm9ybSwgY29sb3I7IH1cXG4gIC5tZGMtdGV4dC1maWVsZDo6YmVmb3JlLCAubWRjLXRleHQtZmllbGQ6OmFmdGVyIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XFxuICAgIG9wYWNpdHk6IDA7XFxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgICBjb250ZW50OiBcXFwiXFxcIjsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkOjpiZWZvcmUge1xcbiAgICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgMTVtcyBsaW5lYXIsIGJhY2tncm91bmQtY29sb3IgMTVtcyBsaW5lYXI7XFxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTVtcyBsaW5lYXIsIGJhY2tncm91bmQtY29sb3IgMTVtcyBsaW5lYXI7XFxuICAgIHotaW5kZXg6IDE7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC5tZGMtcmlwcGxlLXVwZ3JhZGVkOjpiZWZvcmUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUodmFyKC0tbWRjLXJpcHBsZS1mZy1zY2FsZSwgMSkpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tbWRjLXJpcHBsZS1mZy1zY2FsZSwgMSkpOyB9XFxuICAubWRjLXRleHQtZmllbGQubWRjLXJpcHBsZS11cGdyYWRlZDo6YWZ0ZXIge1xcbiAgICB0b3A6IDA7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogMDtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjtcXG4gICAgICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOyB9XFxuICAubWRjLXRleHQtZmllbGQubWRjLXJpcHBsZS11cGdyYWRlZC0tdW5ib3VuZGVkOjphZnRlciB7XFxuICAgIHRvcDogdmFyKC0tbWRjLXJpcHBsZS10b3AsIDApO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IHZhcigtLW1kYy1yaXBwbGUtbGVmdCwgMCk7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC5tZGMtcmlwcGxlLXVwZ3JhZGVkLS1mb3JlZ3JvdW5kLWFjdGl2YXRpb246OmFmdGVyIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb246IG1kYy1yaXBwbGUtZmctcmFkaXVzLWluIDIyNW1zIGZvcndhcmRzLCBtZGMtcmlwcGxlLWZnLW9wYWNpdHktaW4gNzVtcyBmb3J3YXJkcztcXG4gICAgICAgICAgICBhbmltYXRpb246IG1kYy1yaXBwbGUtZmctcmFkaXVzLWluIDIyNW1zIGZvcndhcmRzLCBtZGMtcmlwcGxlLWZnLW9wYWNpdHktaW4gNzVtcyBmb3J3YXJkczsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLm1kYy1yaXBwbGUtdXBncmFkZWQtLWZvcmVncm91bmQtZGVhY3RpdmF0aW9uOjphZnRlciB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBtZGMtcmlwcGxlLWZnLW9wYWNpdHktb3V0IDE1MG1zO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbjogbWRjLXJpcHBsZS1mZy1vcGFjaXR5LW91dCAxNTBtcztcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXRyYW5zbGF0ZS1lbmQsIDApKSBzY2FsZSh2YXIoLS1tZGMtcmlwcGxlLWZnLXNjYWxlLCAxKSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tbWRjLXJpcHBsZS1mZy10cmFuc2xhdGUtZW5kLCAwKSkgc2NhbGUodmFyKC0tbWRjLXJpcHBsZS1mZy1zY2FsZSwgMSkpOyB9XFxuICAubWRjLXRleHQtZmllbGQ6OmJlZm9yZSwgLm1kYy10ZXh0LWZpZWxkOjphZnRlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cXG4gIC5tZGMtdGV4dC1maWVsZDpob3Zlcjo6YmVmb3JlIHtcXG4gICAgb3BhY2l0eTogMC4wNDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkOm5vdCgubWRjLXJpcHBsZS11cGdyYWRlZCk6Zm9jdXM6OmJlZm9yZSwgLm1kYy10ZXh0LWZpZWxkLm1kYy1yaXBwbGUtdXBncmFkZWQtLWJhY2tncm91bmQtZm9jdXNlZDo6YmVmb3JlIHtcXG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiA3NW1zO1xcbiAgICAgICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDc1bXM7XFxuICAgIG9wYWNpdHk6IDAuMTI7IH1cXG4gIC5tZGMtdGV4dC1maWVsZDo6YmVmb3JlLCAubWRjLXRleHQtZmllbGQ6OmFmdGVyIHtcXG4gICAgdG9wOiBjYWxjKDUwJSAtIDEwMCUpO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IGNhbGMoNTAlIC0gMTAwJSk7XFxuICAgIHdpZHRoOiAyMDAlO1xcbiAgICBoZWlnaHQ6IDIwMCU7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC5tZGMtcmlwcGxlLXVwZ3JhZGVkOjphZnRlciB7XFxuICAgIHdpZHRoOiB2YXIoLS1tZGMtcmlwcGxlLWZnLXNpemUsIDEwMCUpO1xcbiAgICBoZWlnaHQ6IHZhcigtLW1kYy1yaXBwbGUtZmctc2l6ZSwgMTAwJSk7IH1cXG4gIC5tZGMtdGV4dC1maWVsZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNik7IH1cXG4gIC5tZGMtdGV4dC1maWVsZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy10ZXh0LWZpZWxkX19pbnB1dCB7XFxuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XFxuICAubWRjLXRleHQtZmllbGQgLm1kYy10ZXh0LWZpZWxkX19pbnB1dCB7XFxuICAgIGNhcmV0LWNvbG9yOiAjNjIwMGVlO1xcbiAgICAvKiBAYWx0ZXJuYXRlICovXFxuICAgIGNhcmV0LWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtcHJpbWFyeSwgIzYyMDBlZSk7IH1cXG4gIC5tZGMtdGV4dC1maWVsZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLXRleHRhcmVhKSAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjQyKTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKTpub3QoLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEpIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6aG92ZXIge1xcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XFxuICAubWRjLXRleHQtZmllbGQgLm1kYy1saW5lLXJpcHBsZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM2MjAwZWU7XFxuICAgIC8qIEBhbHRlcm5hdGUgKi9cXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbWRjLXRoZW1lLXByaW1hcnksICM2MjAwZWUpOyB9XFxuICAubWRjLXRleHQtZmllbGQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLXRleHRhcmVhKSB7XFxuICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cXG4gIC5tZGMtdGV4dC1maWVsZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgKyAubWRjLXRleHQtZmllbGQtaGVscGVyLWxpbmUgLm1kYy10ZXh0LWZpZWxkLWhlbHBlci10ZXh0IHtcXG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC42KTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKSAubWRjLXRleHQtZmllbGQtY2hhcmFjdGVyLWNvdW50ZXIsXFxuICAubWRjLXRleHQtZmllbGQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpICsgLm1kYy10ZXh0LWZpZWxkLWhlbHBlci1saW5lIC5tZGMtdGV4dC1maWVsZC1jaGFyYWN0ZXItY291bnRlciB7XFxuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNik7IH1cXG4gIC5tZGMtdGV4dC1maWVsZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy10ZXh0LWZpZWxkX19pY29uIHtcXG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cXG4gIC5tZGMtdGV4dC1maWVsZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZXNtb2tlOyB9XFxuICAubWRjLXRleHQtZmllbGQgLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogMTZweDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogaW5pdGlhbDtcXG4gICAgdG9wOiAxOHB4O1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsgfVxcbiAgICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQgLm1kYy1mbG9hdGluZy1sYWJlbCwgLm1kYy10ZXh0LWZpZWxkIC5tZGMtZmxvYXRpbmctbGFiZWxbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIGxlZnQ6IGluaXRpYWw7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIHJpZ2h0OiAxNnB4OyB9XFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhIC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IDRweDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogaW5pdGlhbDsgfVxcbiAgICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhIC5tZGMtZmxvYXRpbmctbGFiZWwsIC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEgLm1kYy1mbG9hdGluZy1sYWJlbFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgbGVmdDogaW5pdGlhbDtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgcmlnaHQ6IDRweDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLWZsb2F0aW5nLWxhYmVsIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBsZWZ0OiA0cHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcmlnaHQ6IGluaXRpYWw7XFxuICAgIHRvcDogMTdweDsgfVxcbiAgICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtZmxvYXRpbmctbGFiZWwsIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1mbG9hdGluZy1sYWJlbFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgbGVmdDogaW5pdGlhbDtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgcmlnaHQ6IDRweDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogMzZweDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogaW5pdGlhbDsgfVxcbiAgICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLS13aXRoLWxlYWRpbmctaWNvbiAubWRjLWZsb2F0aW5nLWxhYmVsLCAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLS13aXRoLWxlYWRpbmctaWNvbiAubWRjLWZsb2F0aW5nLWxhYmVsW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBsZWZ0OiBpbml0aWFsO1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICByaWdodDogMzZweDsgfVxcbiAgICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLS13aXRoLWxlYWRpbmctaWNvbiAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIGxlZnQ6IDQwcHg7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIHJpZ2h0OiBpbml0aWFsOyB9XFxuICAgICAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUsIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQtLXdpdGgtbGVhZGluZy1pY29uIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgICAgbGVmdDogaW5pdGlhbDtcXG4gICAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICAgIHJpZ2h0OiA0MHB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkX19pbnB1dCB7XFxuICBmb250LWZhbWlseTogUm9ib3RvLCBzYW5zLXNlcmlmO1xcbiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcXG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xcbiAgZm9udC1zaXplOiAxcmVtO1xcbiAgbGluZS1oZWlnaHQ6IDEuNzVyZW07XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDA5MzdlbTtcXG4gIHRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDtcXG4gIHRleHQtdHJhbnNmb3JtOiBpbmhlcml0O1xcbiAgYWxpZ24tc2VsZjogZmxleC1lbmQ7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICBwYWRkaW5nOiAyMHB4IDE2cHggNnB4O1xcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICBib3JkZXI6IG5vbmU7XFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQ7XFxuICBib3JkZXItcmFkaXVzOiAwO1xcbiAgYmFja2dyb3VuZDogbm9uZTtcXG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcXG4gICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcXG4gICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XFxuICAgIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSA2N21zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgNjdtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICBvcGFjaXR5OiAwO1xcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjU0KTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6LW1vei1wbGFjZWhvbGRlciB7XFxuICAgIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSA2N21zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgNjdtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICBvcGFjaXR5OiAwO1xcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjU0KTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHtcXG4gICAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IDY3bXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSA2N21zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAgIG9wYWNpdHk6IDA7XFxuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XFxuICAubWRjLXRleHQtZmllbGRfX2lucHV0OjpwbGFjZWhvbGRlciB7XFxuICAgIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSA2N21zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XFxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgNjdtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xcbiAgICBvcGFjaXR5OiAwO1xcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjU0KTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIge1xcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjU0KSAhaW1wb3J0YW50OyB9XFxuICAubWRjLXRleHQtZmllbGQtLWZ1bGx3aWR0aCAubWRjLXRleHQtZmllbGRfX2lucHV0Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS1uby1sYWJlbCAubWRjLXRleHQtZmllbGRfX2lucHV0Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIge1xcbiAgICAtd2Via2l0LXRyYW5zaXRpb24tZGVsYXk6IDQwbXM7XFxuICAgICAgICAgICAgdHJhbnNpdGlvbi1kZWxheTogNDBtcztcXG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAxMTBtcztcXG4gICAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAxMTBtcztcXG4gICAgb3BhY2l0eTogMTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1mdWxsd2lkdGggLm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6LW1vei1wbGFjZWhvbGRlcixcXG4gIC5tZGMtdGV4dC1maWVsZC0tbm8tbGFiZWwgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6LW1vei1wbGFjZWhvbGRlcixcXG4gIC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLXRleHQtZmllbGRfX2lucHV0OjotbW96LXBsYWNlaG9sZGVyIHtcXG4gICAgdHJhbnNpdGlvbi1kZWxheTogNDBtcztcXG4gICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMTEwbXM7XFxuICAgIG9wYWNpdHk6IDE7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tZnVsbHdpZHRoIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6Oi1tcy1pbnB1dC1wbGFjZWhvbGRlcixcXG4gIC5tZGMtdGV4dC1maWVsZC0tbm8tbGFiZWwgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6LW1zLWlucHV0LXBsYWNlaG9sZGVyLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6Oi1tcy1pbnB1dC1wbGFjZWhvbGRlciB7XFxuICAgIHRyYW5zaXRpb24tZGVsYXk6IDQwbXM7XFxuICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDExMG1zO1xcbiAgICBvcGFjaXR5OiAxOyB9XFxuICAubWRjLXRleHQtZmllbGQtLWZ1bGx3aWR0aCAubWRjLXRleHQtZmllbGRfX2lucHV0OjpwbGFjZWhvbGRlcixcXG4gIC5tZGMtdGV4dC1maWVsZC0tbm8tbGFiZWwgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6cGxhY2Vob2xkZXIsXFxuICAubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6cGxhY2Vob2xkZXIge1xcbiAgICAtd2Via2l0LXRyYW5zaXRpb24tZGVsYXk6IDQwbXM7XFxuICAgICAgICAgICAgdHJhbnNpdGlvbi1kZWxheTogNDBtcztcXG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAxMTBtcztcXG4gICAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAxMTBtcztcXG4gICAgb3BhY2l0eTogMTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDpmb2N1cyB7XFxuICAgIG91dGxpbmU6IG5vbmU7IH1cXG4gIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6aW52YWxpZCB7XFxuICAgIGJveC1zaGFkb3c6IG5vbmU7IH1cXG4gIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6LXdlYmtpdC1hdXRvZmlsbCB7XFxuICAgIHotaW5kZXg6IGF1dG8gIWltcG9ydGFudDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1uby1sYWJlbDpub3QoLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEpIC5tZGMtdGV4dC1maWVsZF9faW5wdXQge1xcbiAgICBwYWRkaW5nLXRvcDogMTZweDtcXG4gICAgcGFkZGluZy1ib3R0b206IDE2cHg7IH1cXG5cXG4ubWRjLXRleHQtZmllbGRfX2lucHV0Oi13ZWJraXQtYXV0b2ZpbGwgKyAubWRjLWZsb2F0aW5nLWxhYmVsIHtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMC43NSk7XFxuICBjdXJzb3I6IGF1dG87IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIHtcXG4gIGJvcmRlcjogbm9uZTtcXG4gIG92ZXJmbG93OiB2aXNpYmxlOyB9XFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyxcXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCxcXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICAgIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCkgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCkgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCxcXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLWZvY3VzZWQpIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6aG92ZXIgfiAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcsXFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKTpub3QoLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkKSAubWRjLXRleHQtZmllbGRfX2ljb246aG92ZXIgfiAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyxcXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLWZvY3VzZWQpIC5tZGMtdGV4dC1maWVsZF9faWNvbjpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCxcXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLWZvY3VzZWQpIC5tZGMtdGV4dC1maWVsZF9faWNvbjpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICAgIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKS5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKS5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcge1xcbiAgICBib3JkZXItY29sb3I6ICM2MjAwZWU7XFxuICAgIC8qIEBhbHRlcm5hdGUgKi9cXG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtcHJpbWFyeSwgIzYyMDBlZSk7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tc2hha2Uge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXRleHQtZmllbGQtb3V0bGluZWQgMjUwbXMgMTtcXG4gICAgICAgICAgICBhbmltYXRpb246IG1kYy1mbG9hdGluZy1sYWJlbC1zaGFrZS1mbG9hdC1hYm92ZS10ZXh0LWZpZWxkLW91dGxpbmVkIDI1MG1zIDE7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGJvcmRlci1yYWRpdXM6IDRweCAwIDAgNHB4OyB9XFxuICAgIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmdbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIGJvcmRlci1yYWRpdXM6IDAgNHB4IDRweCAwOyB9XFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgYm9yZGVyLXJhZGl1czogMCA0cHggNHB4IDA7IH1cXG4gICAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcsIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBib3JkZXItcmFkaXVzOiA0cHggMCAwIDRweDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xNDQlKSBzY2FsZSgxKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTE0NCUpIHNjYWxlKDEpOyB9XFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gICAgZm9udC1zaXplOiAwLjc1cmVtOyB9XFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSxcXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gICAgZm9udC1zaXplOiAxcmVtOyB9XFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkOjpiZWZvcmUsIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQ6OmFmdGVyIHtcXG4gICAgY29udGVudDogbm9uZTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gICAgZGlzcGxheTogLXdlYmtpdC1ib3g7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIHBhZGRpbmc6IDEycHggMTZweCAxNHB4O1xcbiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIHotaW5kZXg6IDE7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy10ZXh0LWZpZWxkX19pY29uIHtcXG4gICAgei1pbmRleDogMjsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXFxuLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcge1xcbiAgYm9yZGVyLXdpZHRoOiAycHg7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcge1xcbiAgICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNik7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWRpc2FibGVkIC5tZGMtdGV4dC1maWVsZF9faW5wdXQge1xcbiAgICBib3JkZXItYm90dG9tOiBub25lOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGVuc2Uge1xcbiAgaGVpZ2h0OiA0OHB4OyB9XFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMzQlKSBzY2FsZSgxKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEzNCUpIHNjYWxlKDEpOyB9XFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICAgIGZvbnQtc2l6ZTogMC44cmVtOyB9XFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kZW5zZS5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSxcXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGVuc2UubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUsXFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgICBmb250LXNpemU6IDFyZW07IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtZmxvYXRpbmctbGFiZWwtLXNoYWtlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb246IG1kYy1mbG9hdGluZy1sYWJlbC1zaGFrZS1mbG9hdC1hYm92ZS10ZXh0LWZpZWxkLW91dGxpbmVkLWRlbnNlIDI1MG1zIDE7XFxuICAgICAgICAgICAgYW5pbWF0aW9uOiBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1vdXRsaW5lZC1kZW5zZSAyNTBtcyAxOyB9XFxuICAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gICAgcGFkZGluZzogMTJweCAxMnB4IDdweDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICAgIHRvcDogMTRweDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy10ZXh0LWZpZWxkX19pY29uIHtcXG4gICAgdG9wOiAxMnB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbiAubWRjLXRleHQtZmllbGRfX2ljb24ge1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgbGVmdDogMTZweDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHJpZ2h0OiBpbml0aWFsOyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uIC5tZGMtdGV4dC1maWVsZF9faWNvbiwgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbiAubWRjLXRleHQtZmllbGRfX2ljb25bZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogaW5pdGlhbDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogMTZweDsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy10ZXh0LWZpZWxkX19pbnB1dCB7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLWxlZnQ6IDQ4cHg7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLXJpZ2h0OiAxNnB4OyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uIC5tZGMtdGV4dC1maWVsZF9faW5wdXQsIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy10ZXh0LWZpZWxkX19pbnB1dFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLWxlZnQ6IDE2cHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcGFkZGluZy1yaWdodDogNDhweDsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICAvKiBAbm9mbGlwICovXFxuICBsZWZ0OiA0OHB4O1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgcmlnaHQ6IGluaXRpYWw7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24gLm1kYy1mbG9hdGluZy1sYWJlbCwgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbiAubWRjLWZsb2F0aW5nLWxhYmVsW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IGluaXRpYWw7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcmlnaHQ6IDQ4cHg7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLXRleHQtZmllbGRfX2ljb24ge1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgbGVmdDogMTZweDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHJpZ2h0OiBpbml0aWFsOyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLXRleHQtZmllbGRfX2ljb24sIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtdGV4dC1maWVsZF9faWNvbltkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBsZWZ0OiBpbml0aWFsO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHJpZ2h0OiAxNnB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy10ZXh0LWZpZWxkX19pbnB1dCB7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLWxlZnQ6IDQ4cHg7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLXJpZ2h0OiAxNnB4OyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLXRleHQtZmllbGRfX2lucHV0LCAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLXRleHQtZmllbGRfX2lucHV0W2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHBhZGRpbmctbGVmdDogMTZweDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLXJpZ2h0OiA0OHB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTE0NCUpIHRyYW5zbGF0ZVgoLTMycHgpIHNjYWxlKDEpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTE0NCUpIHRyYW5zbGF0ZVgoLTMycHgpIHNjYWxlKDEpOyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSwgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmVbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xNDQlKSB0cmFuc2xhdGVYKDMycHgpIHNjYWxlKDEpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTQ0JSkgdHJhbnNsYXRlWCgzMnB4KSBzY2FsZSgxKTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gIGZvbnQtc2l6ZTogMC43NXJlbTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlLFxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTMwJSkgdHJhbnNsYXRlWCgtMzJweCkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTMwJSkgdHJhbnNsYXRlWCgtMzJweCkgc2NhbGUoMC43NSk7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlLCAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZVtkaXI9XFxcInJ0bFxcXCJdLCBbZGlyPVxcXCJydGxcXFwiXVxcbiAgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTMwJSkgdHJhbnNsYXRlWCgzMnB4KSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEzMCUpIHRyYW5zbGF0ZVgoMzJweCkgc2NhbGUoMC43NSk7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSxcXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgZm9udC1zaXplOiAxcmVtOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tc2hha2Uge1xcbiAgLXdlYmtpdC1hbmltYXRpb246IG1kYy1mbG9hdGluZy1sYWJlbC1zaGFrZS1mbG9hdC1hYm92ZS10ZXh0LWZpZWxkLW91dGxpbmVkLWxlYWRpbmctaWNvbiAyNTBtcyAxO1xcbiAgICAgICAgICBhbmltYXRpb246IG1kYy1mbG9hdGluZy1sYWJlbC1zaGFrZS1mbG9hdC1hYm92ZS10ZXh0LWZpZWxkLW91dGxpbmVkLWxlYWRpbmctaWNvbiAyNTBtcyAxOyB9XFxuXFxuW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tc2hha2UsIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy1mbG9hdGluZy1sYWJlbC0tc2hha2Uge1xcbiAgLXdlYmtpdC1hbmltYXRpb246IG1kYy1mbG9hdGluZy1sYWJlbC1zaGFrZS1mbG9hdC1hYm92ZS10ZXh0LWZpZWxkLW91dGxpbmVkLWxlYWRpbmctaWNvbi1ydGwgMjUwbXMgMTtcXG4gICAgICAgICAgYW5pbWF0aW9uOiBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1vdXRsaW5lZC1sZWFkaW5nLWljb24tcnRsIDI1MG1zIDE7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLWZsb2F0aW5nLWxhYmVsIHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIGxlZnQ6IDM2cHg7XFxuICAvKiBAbm9mbGlwICovXFxuICByaWdodDogaW5pdGlhbDsgfVxcbiAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1mbG9hdGluZy1sYWJlbCwgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1mbG9hdGluZy1sYWJlbFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBsZWZ0OiBpbml0aWFsO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHJpZ2h0OiAzNnB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMzQlKSB0cmFuc2xhdGVYKC0yMXB4KSBzY2FsZSgxKTtcXG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMzQlKSB0cmFuc2xhdGVYKC0yMXB4KSBzY2FsZSgxKTsgfVxcbiAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlLCAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmVbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMzQlKSB0cmFuc2xhdGVYKDIxcHgpIHNjYWxlKDEpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTM0JSkgdHJhbnNsYXRlWCgyMXB4KSBzY2FsZSgxKTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICBmb250LXNpemU6IDAuOHJlbTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kZW5zZS5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSxcXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMjAlKSB0cmFuc2xhdGVYKC0yMXB4KSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEyMCUpIHRyYW5zbGF0ZVgoLTIxcHgpIHNjYWxlKDAuOCk7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kZW5zZS5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSwgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWRlbnNlLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlW2Rpcj1cXFwicnRsXFxcIl0sIFtkaXI9XFxcInJ0bFxcXCJdXFxuICAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZVtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEyMCUpIHRyYW5zbGF0ZVgoMjFweCkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEyMCUpIHRyYW5zbGF0ZVgoMjFweCkgc2NhbGUoMC44KTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kZW5zZS5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSxcXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gIGZvbnQtc2l6ZTogMXJlbTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLWZsb2F0aW5nLWxhYmVsLS1zaGFrZSB7XFxuICAtd2Via2l0LWFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXRleHQtZmllbGQtb3V0bGluZWQtbGVhZGluZy1pY29uLWRlbnNlIDI1MG1zIDE7XFxuICAgICAgICAgIGFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXRleHQtZmllbGQtb3V0bGluZWQtbGVhZGluZy1pY29uLWRlbnNlIDI1MG1zIDE7IH1cXG5cXG5bZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy1mbG9hdGluZy1sYWJlbC0tc2hha2UsIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kZW5zZVtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtZmxvYXRpbmctbGFiZWwtLXNoYWtlIHtcXG4gIC13ZWJraXQtYW5pbWF0aW9uOiBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1vdXRsaW5lZC1sZWFkaW5nLWljb24tZGVuc2UtcnRsIDI1MG1zIDE7XFxuICAgICAgICAgIGFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXRleHQtZmllbGQtb3V0bGluZWQtbGVhZGluZy1pY29uLWRlbnNlLXJ0bCAyNTBtcyAxOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgbGVmdDogMzJweDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHJpZ2h0OiBpbml0aWFsOyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy1mbG9hdGluZy1sYWJlbCwgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtZmxvYXRpbmctbGFiZWxbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogaW5pdGlhbDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogMzJweDsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uIC5tZGMtdGV4dC1maWVsZF9faWNvbiB7XFxuICAvKiBAbm9mbGlwICovXFxuICBsZWZ0OiBpbml0aWFsO1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgcmlnaHQ6IDEycHg7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uIC5tZGMtdGV4dC1maWVsZF9faWNvbiwgLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24gLm1kYy10ZXh0LWZpZWxkX19pY29uW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IDEycHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcmlnaHQ6IGluaXRpYWw7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbiAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctbGVmdDogMTZweDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctcmlnaHQ6IDQ4cHg7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uIC5tZGMtdGV4dC1maWVsZF9faW5wdXQsIC5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uIC5tZGMtdGV4dC1maWVsZF9faW5wdXRbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcGFkZGluZy1sZWZ0OiA0OHB4O1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHBhZGRpbmctcmlnaHQ6IDE2cHg7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy10ZXh0LWZpZWxkX19pY29uIHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIGxlZnQ6IGluaXRpYWw7XFxuICAvKiBAbm9mbGlwICovXFxuICByaWdodDogMTZweDsgfVxcbiAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtdGV4dC1maWVsZF9faWNvbiwgLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtdGV4dC1maWVsZF9faWNvbltkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBsZWZ0OiAxNnB4O1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHJpZ2h0OiBpbml0aWFsOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtdGV4dC1maWVsZF9faW5wdXQge1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgcGFkZGluZy1sZWZ0OiAxNnB4O1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgcGFkZGluZy1yaWdodDogNDhweDsgfVxcbiAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtdGV4dC1maWVsZF9faW5wdXQsIC5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLXRleHQtZmllbGRfX2lucHV0W2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHBhZGRpbmctbGVmdDogNDhweDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLXJpZ2h0OiAxNnB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uIC5tZGMtdGV4dC1maWVsZF9faWNvbiB7XFxuICAvKiBAbm9mbGlwICovXFxuICBsZWZ0OiAxNnB4O1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgcmlnaHQ6IGF1dG87IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbiAubWRjLXRleHQtZmllbGRfX2ljb24sIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbiAubWRjLXRleHQtZmllbGRfX2ljb25bZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogYXV0bztcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogMTZweDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uIC5tZGMtdGV4dC1maWVsZF9faWNvbiB+IC5tZGMtdGV4dC1maWVsZF9faWNvbiB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcmlnaHQ6IDEycHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogYXV0bzsgfVxcbiAgICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24gLm1kYy10ZXh0LWZpZWxkX19pY29uIH4gLm1kYy10ZXh0LWZpZWxkX19pY29uLCAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24gLm1kYy10ZXh0LWZpZWxkX19pY29uIH4gLm1kYy10ZXh0LWZpZWxkX19pY29uW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICByaWdodDogYXV0bztcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgbGVmdDogMTJweDsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbiAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctbGVmdDogNDhweDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctcmlnaHQ6IDQ4cHg7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbiAubWRjLXRleHQtZmllbGRfX2lucHV0LCAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24gLm1kYy10ZXh0LWZpZWxkX19pbnB1dFtkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLWxlZnQ6IDQ4cHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcGFkZGluZy1yaWdodDogNDhweDsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtdGV4dC1maWVsZF9faWNvbixcXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy10ZXh0LWZpZWxkX19pY29uIHtcXG4gIGJvdHRvbTogMTZweDtcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjgpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOCk7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLXRleHQtZmllbGRfX2ljb24ge1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgbGVmdDogMTJweDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHJpZ2h0OiBpbml0aWFsOyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLXRleHQtZmllbGRfX2ljb24sIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtdGV4dC1maWVsZF9faWNvbltkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBsZWZ0OiBpbml0aWFsO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHJpZ2h0OiAxMnB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy10ZXh0LWZpZWxkX19pbnB1dCB7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLWxlZnQ6IDQ0cHg7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLXJpZ2h0OiAxNnB4OyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLXRleHQtZmllbGRfX2lucHV0LCAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLXRleHQtZmllbGRfX2lucHV0W2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHBhZGRpbmctbGVmdDogMTZweDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLXJpZ2h0OiA0NHB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICAvKiBAbm9mbGlwICovXFxuICBsZWZ0OiA0NHB4O1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgcmlnaHQ6IGluaXRpYWw7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtZmxvYXRpbmctbGFiZWwsIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtZmxvYXRpbmctbGFiZWxbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogaW5pdGlhbDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogNDRweDsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLXRleHQtZmllbGRfX2ljb24ge1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgbGVmdDogaW5pdGlhbDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHJpZ2h0OiAxMnB4OyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy10ZXh0LWZpZWxkX19pY29uLCAubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy10ZXh0LWZpZWxkX19pY29uW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIGxlZnQ6IDEycHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcmlnaHQ6IGluaXRpYWw7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy10ZXh0LWZpZWxkX19pbnB1dCB7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLWxlZnQ6IDE2cHg7XFxuICAvKiBAbm9mbGlwICovXFxuICBwYWRkaW5nLXJpZ2h0OiA0NHB4OyB9XFxuICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy10ZXh0LWZpZWxkX19pbnB1dCwgLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24ubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtdGV4dC1maWVsZF9faW5wdXRbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcGFkZGluZy1sZWZ0OiA0NHB4O1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHBhZGRpbmctcmlnaHQ6IDE2cHg7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24ubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtdGV4dC1maWVsZF9faWNvbiB7XFxuICAvKiBAbm9mbGlwICovXFxuICBsZWZ0OiAxMnB4O1xcbiAgLyogQG5vZmxpcCAqL1xcbiAgcmlnaHQ6IGF1dG87IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy10ZXh0LWZpZWxkX19pY29uLCAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24ubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtdGV4dC1maWVsZF9faWNvbltkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBsZWZ0OiBhdXRvO1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHJpZ2h0OiAxMnB4OyB9XFxuICAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24ubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtdGV4dC1maWVsZF9faWNvbiB+IC5tZGMtdGV4dC1maWVsZF9faWNvbiB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgcmlnaHQ6IDEycHg7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogYXV0bzsgfVxcbiAgICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXdpdGgtbGVhZGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb24ubWRjLXRleHQtZmllbGQtLWRlbnNlIC5tZGMtdGV4dC1maWVsZF9faWNvbiB+IC5tZGMtdGV4dC1maWVsZF9faWNvbiwgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLXRleHQtZmllbGRfX2ljb24gfiAubWRjLXRleHQtZmllbGRfX2ljb25bZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIHJpZ2h0OiBhdXRvO1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBsZWZ0OiAxMnB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctbGVmdDogNDRweDtcXG4gIC8qIEBub2ZsaXAgKi9cXG4gIHBhZGRpbmctcmlnaHQ6IDQ0cHg7IH1cXG4gIFtkaXI9XFxcInJ0bFxcXCJdIC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24ubWRjLXRleHQtZmllbGQtLXdpdGgtdHJhaWxpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy10ZXh0LWZpZWxkX19pbnB1dCwgLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLXRleHQtZmllbGRfX2lucHV0W2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAvKiBAbm9mbGlwICovXFxuICAgIHBhZGRpbmctbGVmdDogNDRweDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBwYWRkaW5nLXJpZ2h0OiA0NHB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS1kZW5zZSAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNzAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTcwJSkgc2NhbGUoMC44KTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy1mbG9hdGluZy1sYWJlbC0tc2hha2Uge1xcbiAgLXdlYmtpdC1hbmltYXRpb246IG1kYy1mbG9hdGluZy1sYWJlbC1zaGFrZS1mbG9hdC1hYm92ZS10ZXh0LWZpZWxkLWRlbnNlIDI1MG1zIDE7XFxuICAgICAgICAgIGFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXRleHQtZmllbGQtZGVuc2UgMjUwbXMgMTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy10ZXh0LWZpZWxkX19pbnB1dCB7XFxuICBwYWRkaW5nOiAxMnB4IDEycHggMDsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICBmb250LXNpemU6IC44MTNyZW07IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tZGVuc2UgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgICBmb250LXNpemU6IC44MTNyZW07IH1cXG5cXG4ubWRjLXRleHQtZmllbGRfX2lucHV0OnJlcXVpcmVkIH4gLm1kYy1mbG9hdGluZy1sYWJlbDo6YWZ0ZXIsXFxuLm1kYy10ZXh0LWZpZWxkX19pbnB1dDpyZXF1aXJlZCB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtZmxvYXRpbmctbGFiZWw6OmFmdGVyIHtcXG4gIG1hcmdpbi1sZWZ0OiAxcHg7XFxuICBjb250ZW50OiBcXFwiKlxcXCI7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLXRleHRhcmVhIHtcXG4gIGRpc3BsYXk6IC13ZWJraXQtaW5saW5lLWJveDtcXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcbiAgd2lkdGg6IGF1dG87XFxuICBoZWlnaHQ6IGF1dG87XFxuICAtd2Via2l0LXRyYW5zaXRpb246IG5vbmU7XFxuICB0cmFuc2l0aW9uOiBub25lO1xcbiAgb3ZlcmZsb3c6IHZpc2libGU7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWE6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYTpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYTpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIHtcXG4gICAgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzgpOyB9XFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKTpub3QoLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkKSAubWRjLXRleHQtZmllbGRfX2lucHV0OmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKTpub3QoLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkKSAubWRjLXRleHQtZmllbGRfX2lucHV0OmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYTpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCkgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyxcXG4gIC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWE6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLWZvY3VzZWQpIC5tZGMtdGV4dC1maWVsZF9faWNvbjpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYTpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCkgLm1kYy10ZXh0LWZpZWxkX19pY29uOmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYTpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCkgLm1kYy10ZXh0LWZpZWxkX19pY29uOmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIHtcXG4gICAgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKS5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyxcXG4gIC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWE6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCxcXG4gIC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWE6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICAgIGJvcmRlci1jb2xvcjogIzYyMDBlZTtcXG4gICAgLyogQGFsdGVybmF0ZSAqL1xcbiAgICBib3JkZXItY29sb3I6IHZhcigtLW1kYy10aGVtZS1wcmltYXJ5LCAjNjIwMGVlKTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYSAubWRjLWZsb2F0aW5nLWxhYmVsLS1zaGFrZSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1vdXRsaW5lZCAyNTBtcyAxO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbjogbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXRleHQtZmllbGQtb3V0bGluZWQgMjUwbXMgMTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYSAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgYm9yZGVyLXJhZGl1czogNHB4IDAgMCA0cHg7IH1cXG4gICAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYSAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZywgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYSAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZ1tkaXI9XFxcInJ0bFxcXCJdIHtcXG4gICAgICAvKiBAbm9mbGlwICovXFxuICAgICAgYm9yZGVyLXJhZGl1czogMCA0cHggNHB4IDA7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEgLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIHtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICBib3JkZXItcmFkaXVzOiAwIDRweCA0cHggMDsgfVxcbiAgICBbZGlyPVxcXCJydGxcXFwiXSAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhIC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZywgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYSAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmdbZGlyPVxcXCJydGxcXFwiXSB7XFxuICAgICAgLyogQG5vZmxpcCAqL1xcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweCAwIDAgNHB4OyB9XFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhOjpiZWZvcmUsIC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWE6OmFmdGVyIHtcXG4gICAgY29udGVudDogbm9uZTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYTpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYSAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xNDQlKSBzY2FsZSgxKTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTE0NCUpIHNjYWxlKDEpOyB9XFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gICAgZm9udC1zaXplOiAwLjc1cmVtOyB9XFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYSAubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYS5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSxcXG4gIC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEgLm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3ZlIHtcXG4gICAgZm9udC1zaXplOiAxcmVtOyB9XFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhIC5tZGMtdGV4dC1maWVsZC1jaGFyYWN0ZXItY291bnRlciB7XFxuICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgbGVmdDogaW5pdGlhbDtcXG4gICAgLyogQG5vZmxpcCAqL1xcbiAgICByaWdodDogMTZweDtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBib3R0b206IDEzcHg7IH1cXG4gICAgW2Rpcj1cXFwicnRsXFxcIl0gLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYSAubWRjLXRleHQtZmllbGQtY2hhcmFjdGVyLWNvdW50ZXIsIC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEgLm1kYy10ZXh0LWZpZWxkLWNoYXJhY3Rlci1jb3VudGVyW2Rpcj1cXFwicnRsXFxcIl0ge1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICBsZWZ0OiAxNnB4O1xcbiAgICAgIC8qIEBub2ZsaXAgKi9cXG4gICAgICByaWdodDogaW5pdGlhbDsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYSAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gICAgYWxpZ24tc2VsZjogYXV0bztcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgaGVpZ2h0OiBhdXRvO1xcbiAgICBtYXJnaW46IDhweCAxcHggMXB4IDA7XFxuICAgIHBhZGRpbmc6IDAgMTZweCAxNnB4O1xcbiAgICBib3JkZXI6IG5vbmU7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEgLm1kYy10ZXh0LWZpZWxkLWNoYXJhY3Rlci1jb3VudGVyICsgLm1kYy10ZXh0LWZpZWxkX19pbnB1dCB7XFxuICAgIG1hcmdpbi1ib3R0b206IDI4cHg7XFxuICAgIHBhZGRpbmctYm90dG9tOiAwOyB9XFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhIC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgICB0b3A6IDE3cHg7XFxuICAgIGJvdHRvbTogYXV0bztcXG4gICAgd2lkdGg6IGF1dG87XFxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lOyB9XFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYS5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICAgIGJvcmRlci13aWR0aDogMnB4OyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS1mdWxsd2lkdGgge1xcbiAgd2lkdGg6IDEwMCU7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tZnVsbHdpZHRoOm5vdCgubWRjLXRleHQtZmllbGQtLXRleHRhcmVhKSB7XFxuICAgIGRpc3BsYXk6IGJsb2NrOyB9XFxuICAgIC5tZGMtdGV4dC1maWVsZC0tZnVsbHdpZHRoOm5vdCgubWRjLXRleHQtZmllbGQtLXRleHRhcmVhKTo6YmVmb3JlLCAubWRjLXRleHQtZmllbGQtLWZ1bGx3aWR0aDpub3QoLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYSk6OmFmdGVyIHtcXG4gICAgICBjb250ZW50OiBub25lOyB9XFxuICAgIC5tZGMtdGV4dC1maWVsZC0tZnVsbHdpZHRoOm5vdCgubWRjLXRleHQtZmllbGQtLXRleHRhcmVhKTpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkge1xcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyB9XFxuICAgIC5tZGMtdGV4dC1maWVsZC0tZnVsbHdpZHRoOm5vdCgubWRjLXRleHQtZmllbGQtLXRleHRhcmVhKSAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gICAgICBwYWRkaW5nOiAwOyB9XFxuICAubWRjLXRleHQtZmllbGQtLWZ1bGx3aWR0aC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEgLm1kYy10ZXh0LWZpZWxkX19pbnB1dCB7XFxuICAgIHJlc2l6ZTogdmVydGljYWw7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLWZ1bGx3aWR0aC5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEpIHtcXG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLWhlbHBlci1saW5lIHtcXG4gIGRpc3BsYXk6IC13ZWJraXQtYm94O1xcbiAgZGlzcGxheTogZmxleDtcXG4gIC13ZWJraXQtYm94LXBhY2s6IGp1c3RpZnk7XFxuICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tZGVuc2UgKyAubWRjLXRleHQtZmllbGQtaGVscGVyLWxpbmUge1xcbiAgICBtYXJnaW4tYm90dG9tOiA0cHg7IH1cXG4gIC5tZGMtdGV4dC1maWVsZCArIC5tZGMtdGV4dC1maWVsZC1oZWxwZXItbGluZSB7XFxuICAgIHBhZGRpbmctcmlnaHQ6IDE2cHg7XFxuICAgIHBhZGRpbmctbGVmdDogMTZweDsgfVxcblxcbi5tZGMtZm9ybS1maWVsZCA+IC5tZGMtdGV4dC1maWVsZCArIGxhYmVsIHtcXG4gIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLWZvY3VzZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgY29sb3I6IHJnYmEoOTgsIDAsIDIzOCwgMC44Nyk7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDpyZXF1aXJlZCB+IC5tZGMtZmxvYXRpbmctbGFiZWw6OmFmdGVyLFxcbi5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLXRleHQtZmllbGRfX2lucHV0OnJlcXVpcmVkIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1mbG9hdGluZy1sYWJlbDo6YWZ0ZXIge1xcbiAgY29sb3I6IHJnYmEoOTgsIDAsIDIzOCwgMC44Nyk7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgKyAubWRjLXRleHQtZmllbGQtaGVscGVyLWxpbmUgLm1kYy10ZXh0LWZpZWxkLWhlbHBlci10ZXh0Om5vdCgubWRjLXRleHQtZmllbGQtaGVscGVyLXRleHQtLXZhbGlkYXRpb24tbXNnKSB7XFxuICBvcGFjaXR5OiAxOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYS5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYS5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbi5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEubWRjLXRleHQtZmllbGQtLWZvY3VzZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICBib3JkZXItY29sb3I6ICM2MjAwZWU7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBib3JkZXItY29sb3I6IHZhcigtLW1kYy10aGVtZS1wcmltYXJ5LCAjNjIwMGVlKTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLXRleHRhcmVhKSAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKTpub3QoLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEpIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6aG92ZXIge1xcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogI2IwMDAyMDtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGJvcmRlci1ib3R0b20tY29sb3I6IHZhcigtLW1kYy10aGVtZS1lcnJvciwgI2IwMDAyMCk7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLWludmFsaWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtbGluZS1yaXBwbGUge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2IwMDAyMDtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1kYy10aGVtZS1lcnJvciwgI2IwMDAyMCk7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLWludmFsaWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBjb2xvcjogdmFyKC0tbWRjLXRoZW1lLWVycm9yLCAjYjAwMDIwKTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkubWRjLXRleHQtZmllbGQtLWludmFsaWQgKyAubWRjLXRleHQtZmllbGQtaGVscGVyLWxpbmUgLm1kYy10ZXh0LWZpZWxkLWhlbHBlci10ZXh0LS12YWxpZGF0aW9uLW1zZyB7XFxuICBjb2xvcjogI2IwMDAyMDtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkIC5tZGMtdGV4dC1maWVsZF9faW5wdXQge1xcbiAgY2FyZXQtY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBjYXJldC1jb2xvcjogdmFyKC0tbWRjLXRoZW1lLWVycm9yLCAjYjAwMDIwKTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0taW52YWxpZCAubWRjLXRleHQtZmllbGRfX2lucHV0OnJlcXVpcmVkIH4gLm1kYy1mbG9hdGluZy1sYWJlbDo6YWZ0ZXIsXFxuLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6cmVxdWlyZWQgfiAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLWZsb2F0aW5nLWxhYmVsOjphZnRlciB7XFxuICBjb2xvcjogI2IwMDAyMDtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkLm1kYy10ZXh0LWZpZWxkLS13aXRoLXRyYWlsaW5nLWljb246bm90KC5tZGMtdGV4dC1maWVsZC0td2l0aC1sZWFkaW5nLWljb24pOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKSAubWRjLXRleHQtZmllbGRfX2ljb24ge1xcbiAgY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBjb2xvcjogdmFyKC0tbWRjLXRoZW1lLWVycm9yLCAjYjAwMDIwKTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0taW52YWxpZC5tZGMtdGV4dC1maWVsZC0td2l0aC10cmFpbGluZy1pY29uLm1kYy10ZXh0LWZpZWxkLS13aXRoLWxlYWRpbmctaWNvbjpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy10ZXh0LWZpZWxkX19pY29uIH4gLm1kYy10ZXh0LWZpZWxkX19pY29uIHtcXG4gIGNvbG9yOiAjYjAwMDIwO1xcbiAgLyogQGFsdGVybmF0ZSAqL1xcbiAgY29sb3I6IHZhcigtLW1kYy10aGVtZS1lcnJvciwgI2IwMDAyMCk7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLWludmFsaWQgKyAubWRjLXRleHQtZmllbGQtaGVscGVyLWxpbmUgLm1kYy10ZXh0LWZpZWxkLWhlbHBlci10ZXh0LS12YWxpZGF0aW9uLW1zZyB7XFxuICBvcGFjaXR5OiAxOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYS5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYS5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbi5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEubWRjLXRleHQtZmllbGQtLWludmFsaWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICBib3JkZXItY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBib3JkZXItY29sb3I6IHZhcigtLW1kYy10aGVtZS1lcnJvciwgI2IwMDAyMCk7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLXRleHRhcmVhLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKTpub3QoLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkKSAubWRjLXRleHQtZmllbGRfX2lucHV0OmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYS5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCkgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCxcXG4ubWRjLXRleHQtZmllbGQtLXRleHRhcmVhLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKTpub3QoLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkKSAubWRjLXRleHQtZmllbGRfX2lucHV0OmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nLFxcbi5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEubWRjLXRleHQtZmllbGQtLWludmFsaWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLWZvY3VzZWQpIC5tZGMtdGV4dC1maWVsZF9faWNvbjpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nLFxcbi5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEubWRjLXRleHQtZmllbGQtLWludmFsaWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLWZvY3VzZWQpIC5tZGMtdGV4dC1maWVsZF9faWNvbjpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCxcXG4ubWRjLXRleHQtZmllbGQtLXRleHRhcmVhLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKTpub3QoLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkKSAubWRjLXRleHQtZmllbGRfX2ljb246aG92ZXIgfiAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcge1xcbiAgYm9yZGVyLWNvbG9yOiAjYjAwMDIwO1xcbiAgLyogQGFsdGVybmF0ZSAqL1xcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1tZGMtdGhlbWUtZXJyb3IsICNiMDAwMjApOyB9XFxuXFxuLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYS5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYS5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbi5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEubWRjLXRleHQtZmllbGQtLWludmFsaWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICBib3JkZXItY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBib3JkZXItY29sb3I6IHZhcigtLW1kYy10aGVtZS1lcnJvciwgI2IwMDAyMCk7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyxcXG4ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXFxuLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIHtcXG4gIGJvcmRlci1jb2xvcjogI2IwMDAyMDtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGJvcmRlci1jb2xvcjogdmFyKC0tbWRjLXRoZW1lLWVycm9yLCAjYjAwMDIwKTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWludmFsaWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLWZvY3VzZWQpIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6aG92ZXIgfiAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyxcXG4ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKTpub3QoLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkKSAubWRjLXRleHQtZmllbGRfX2lucHV0OmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWludmFsaWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLWZvY3VzZWQpIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6aG92ZXIgfiAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmcsXFxuLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCkgLm1kYy10ZXh0LWZpZWxkX19pY29uOmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXFxuLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCkgLm1kYy10ZXh0LWZpZWxkX19pY29uOmhvdmVyIH4gLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbi5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWludmFsaWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLWZvY3VzZWQpIC5tZGMtdGV4dC1maWVsZF9faWNvbjpob3ZlciB+IC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZyB7XFxuICBib3JkZXItY29sb3I6ICNiMDAwMjA7XFxuICAvKiBAYWx0ZXJuYXRlICovXFxuICBib3JkZXItY29sb3I6IHZhcigtLW1kYy10aGVtZS1lcnJvciwgI2IwMDAyMCk7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKS5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyxcXG4ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKS5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXFxuLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIHtcXG4gIGJvcmRlci1jb2xvcjogI2IwMDAyMDtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGJvcmRlci1jb2xvcjogdmFyKC0tbWRjLXRoZW1lLWVycm9yLCAjYjAwMDIwKTsgfVxcblxcbi5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcXG4gIGJvcmRlci1ib3R0b206IG5vbmU7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA2KTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNyk7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQgLm1kYy1mbG9hdGluZy1sYWJlbCB7XFxuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzcpOyB9XFxuICAubWRjLXRleHQtZmllbGQtLWRpc2FibGVkICsgLm1kYy10ZXh0LWZpZWxkLWhlbHBlci1saW5lIC5tZGMtdGV4dC1maWVsZC1oZWxwZXItdGV4dCB7XFxuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzcpOyB9XFxuICAubWRjLXRleHQtZmllbGQtLWRpc2FibGVkIC5tZGMtdGV4dC1maWVsZC1jaGFyYWN0ZXItY291bnRlcixcXG4gIC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQgKyAubWRjLXRleHQtZmllbGQtaGVscGVyLWxpbmUgLm1kYy10ZXh0LWZpZWxkLWNoYXJhY3Rlci1jb3VudGVyIHtcXG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNyk7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQgLm1kYy10ZXh0LWZpZWxkX19pY29uIHtcXG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zKTsgfVxcbiAgLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZDpub3QoLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYSkge1xcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XFxuICAubWRjLXRleHQtZmllbGQtLWRpc2FibGVkIC5tZGMtZmxvYXRpbmctbGFiZWwge1xcbiAgICBjdXJzb3I6IGRlZmF1bHQ7IH1cXG5cXG4ubWRjLXRleHQtZmllbGQtLXRleHRhcmVhLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gIC8qIEBhbHRlcm5hdGUgKi9cXG4gIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7IH1cXG4gIC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEubWRjLXRleHQtZmllbGQtLWRpc2FibGVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYS5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLFxcbiAgLm1kYy10ZXh0LWZpZWxkLS10ZXh0YXJlYS5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIHtcXG4gICAgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDYpOyB9XFxuICAubWRjLXRleHQtZmllbGQtLXRleHRhcmVhLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCAubWRjLXRleHQtZmllbGRfX2lucHV0IHtcXG4gICAgYm9yZGVyLWJvdHRvbTogbm9uZTsgfVxcblxcbkAtd2Via2l0LWtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1kZW5zZSB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtNzAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTcwJSkgc2NhbGUoMC44KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDAlKSkgdHJhbnNsYXRlWSgtNzAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gMCUpKSB0cmFuc2xhdGVZKC03MCUpIHNjYWxlKDAuOCk7IH1cXG4gIDY2JSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTcwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTcwJSkgc2NhbGUoMC44KTsgfVxcbiAgMTAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtNzAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTcwJSkgc2NhbGUoMC44KTsgfSB9XFxuXFxuQGtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1kZW5zZSB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtNzAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTcwJSkgc2NhbGUoMC44KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDAlKSkgdHJhbnNsYXRlWSgtNzAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gMCUpKSB0cmFuc2xhdGVZKC03MCUpIHNjYWxlKDAuOCk7IH1cXG4gIDY2JSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTcwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTcwJSkgc2NhbGUoMC44KTsgfVxcbiAgMTAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtNzAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTcwJSkgc2NhbGUoMC44KTsgfSB9XFxuXFxuQC13ZWJraXQta2V5ZnJhbWVzIG1kYy1mbG9hdGluZy1sYWJlbC1zaGFrZS1mbG9hdC1hYm92ZS10ZXh0LWZpZWxkLW91dGxpbmVkIHtcXG4gIDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICA2NiUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfSB9XFxuXFxuQGtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1vdXRsaW5lZCB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDMzJSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgNjYlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMTAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH0gfVxcblxcbkAtd2Via2l0LWtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1vdXRsaW5lZC1kZW5zZSB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpOyB9XFxuICAzMyUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNzAxNzMsIDAuNDk1ODIpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNzAxNzMsIDAuNDk1ODIpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gMCUpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gMCUpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpOyB9XFxuICA2NiUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMCUpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIDAlKSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTsgfVxcbiAgMTAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpOyB9IH1cXG5cXG5Aa2V5ZnJhbWVzIG1kYy1mbG9hdGluZy1sYWJlbC1zaGFrZS1mbG9hdC1hYm92ZS10ZXh0LWZpZWxkLW91dGxpbmVkLWRlbnNlIHtcXG4gIDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7IH1cXG4gIDMzJSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7IH1cXG4gIDY2JSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMCUpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpOyB9XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwJSkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7IH0gfVxcblxcbkAtd2Via2l0LWtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1vdXRsaW5lZC1sZWFkaW5nLWljb24ge1xcbiAgMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgNjYlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfSB9XFxuXFxuQGtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1vdXRsaW5lZC1sZWFkaW5nLWljb24ge1xcbiAgMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgNjYlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfSB9XFxuXFxuQC13ZWJraXQta2V5ZnJhbWVzIG1kYy1mbG9hdGluZy1sYWJlbC1zaGFrZS1mbG9hdC1hYm92ZS10ZXh0LWZpZWxkLW91dGxpbmVkLWxlYWRpbmctaWNvbi1kZW5zZSB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDIxcHgpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAyMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDIxcHgpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gMjFweCkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7IH1cXG4gIDY2JSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAyMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAyMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTsgfVxcbiAgMTAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDIxcHgpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAyMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTsgfSB9XFxuXFxuQGtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1vdXRsaW5lZC1sZWFkaW5nLWljb24tZGVuc2Uge1xcbiAgMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAyMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMjFweCkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7IH1cXG4gIDMzJSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAyMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDIxcHgpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpOyB9XFxuICA2NiUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMjFweCkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMjFweCkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7IH1cXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAyMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMjFweCkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7IH0gfVxcblxcbkAtd2Via2l0LWtleWZyYW1lcyBtZGMtZmxvYXRpbmctbGFiZWwtc2hha2UtZmxvYXQtYWJvdmUtdGV4dC1maWVsZC1vdXRsaW5lZC1sZWFkaW5nLWljb24tcnRsIHtcXG4gIDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDMzJSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDY2JSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAwKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH0gfVxcblxcbkBrZXlmcmFtZXMgbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXRleHQtZmllbGQtb3V0bGluZWQtbGVhZGluZy1pY29uLXJ0bCB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICAzMyUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNzAxNzMsIDAuNDk1ODIpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNzAxNzMsIDAuNDk1ODIpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gMCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gMCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICA2NiUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMTAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDApKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9IH1cXG5cXG5ALXdlYmtpdC1rZXlmcmFtZXMgbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXRleHQtZmllbGQtb3V0bGluZWQtbGVhZGluZy1pY29uLWRlbnNlLXJ0bCB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIC0yMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gLTIxcHgpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpOyB9XFxuICAzMyUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNzAxNzMsIDAuNDk1ODIpO1xcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjUsIDAsIDAuNzAxNzMsIDAuNDk1ODIpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gLTIxcHgpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gLTIxcHgpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpOyB9XFxuICA2NiUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gLTIxcHgpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIC0yMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTsgfVxcbiAgMTAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIC0yMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gLTIxcHgpKSB0cmFuc2xhdGVZKC0xMjAlKSBzY2FsZSgwLjgpOyB9IH1cXG5cXG5Aa2V5ZnJhbWVzIG1kYy1mbG9hdGluZy1sYWJlbC1zaGFrZS1mbG9hdC1hYm92ZS10ZXh0LWZpZWxkLW91dGxpbmVkLWxlYWRpbmctaWNvbi1kZW5zZS1ydGwge1xcbiAgMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAtMjFweCkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIC0yMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIC0yMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIC0yMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTsgfVxcbiAgNjYlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIC0yMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAtMjFweCkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7IH1cXG4gIDEwMCUge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDAgLSAtMjFweCkpIHRyYW5zbGF0ZVkoLTEyMCUpIHNjYWxlKDAuOCk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIC0yMXB4KSkgdHJhbnNsYXRlWSgtMTIwJSkgc2NhbGUoMC44KTsgfSB9XFxuXFxuQC13ZWJraXQta2V5ZnJhbWVzIG1kYy1mbG9hdGluZy1sYWJlbC1zaGFrZS1mbG9hdC1hYm92ZS10ZXh0YXJlYSB7XFxuICAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH1cXG4gIDMzJSB7XFxuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MywgMC40OTU4Mik7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpO1xcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKDQlIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgNjYlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMzAyNDQsIDAuMzgxMzUsIDAuNTUsIDAuOTU2MzUpO1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWChjYWxjKC00JSAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMTAwJSB7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoMCAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7IH0gfVxcblxcbkBrZXlmcmFtZXMgbWRjLWZsb2F0aW5nLWxhYmVsLXNoYWtlLWZsb2F0LWFib3ZlLXRleHRhcmVhIHtcXG4gIDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfVxcbiAgMzMlIHtcXG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC41LCAwLCAwLjcwMTczLCAwLjQ5NTgyKTtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYyg0JSAtIDAlKSkgdHJhbnNsYXRlWSgtMTMwJSkgc2NhbGUoMC43NSk7XFxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICA2NiUge1xcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjMwMjQ0LCAwLjM4MTM1LCAwLjU1LCAwLjk1NjM1KTtcXG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4zMDI0NCwgMC4zODEzNSwgMC41NSwgMC45NTYzNSk7XFxuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoLTQlIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNCUgLSAwJSkpIHRyYW5zbGF0ZVkoLTEzMCUpIHNjYWxlKDAuNzUpOyB9XFxuICAxMDAlIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTtcXG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygwIC0gMCUpKSB0cmFuc2xhdGVZKC0xMzAlKSBzY2FsZSgwLjc1KTsgfSB9XCIsIFwiXCJdKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xuLy8gY3NzIGJhc2UgY29kZSwgaW5qZWN0ZWQgYnkgdGhlIGNzcy1sb2FkZXJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh1c2VTb3VyY2VNYXApIHtcbiAgdmFyIGxpc3QgPSBbXTsgLy8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZ1xuXG4gIGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjb250ZW50ID0gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtLCB1c2VTb3VyY2VNYXApO1xuXG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICByZXR1cm4gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwie1wiKS5jb25jYXQoY29udGVudCwgXCJ9XCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKCcnKTtcbiAgfTsgLy8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcblxuXG4gIGxpc3QuaSA9IGZ1bmN0aW9uIChtb2R1bGVzLCBtZWRpYVF1ZXJ5KSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCAnJ11dO1xuICAgIH1cblxuICAgIHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItZGVzdHJ1Y3R1cmluZ1xuICAgICAgdmFyIGlkID0gdGhpc1tpXVswXTtcblxuICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBtb2R1bGVzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIGl0ZW0gPSBtb2R1bGVzW19pXTsgLy8gc2tpcCBhbHJlYWR5IGltcG9ydGVkIG1vZHVsZVxuICAgICAgLy8gdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3QgMTAwJSBwZXJmZWN0IGZvciB3ZWlyZCBtZWRpYSBxdWVyeSBjb21iaW5hdGlvbnNcbiAgICAgIC8vIHdoZW4gYSBtb2R1bGUgaXMgaW1wb3J0ZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgbWVkaWEgcXVlcmllcy5cbiAgICAgIC8vIEkgaG9wZSB0aGlzIHdpbGwgbmV2ZXIgb2NjdXIgKEhleSB0aGlzIHdheSB3ZSBoYXZlIHNtYWxsZXIgYnVuZGxlcylcblxuICAgICAgaWYgKGl0ZW1bMF0gPT0gbnVsbCB8fCAhYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xuICAgICAgICBpZiAobWVkaWFRdWVyeSAmJiAhaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYVF1ZXJ5O1xuICAgICAgICB9IGVsc2UgaWYgKG1lZGlhUXVlcnkpIHtcbiAgICAgICAgICBpdGVtWzJdID0gXCIoXCIuY29uY2F0KGl0ZW1bMl0sIFwiKSBhbmQgKFwiKS5jb25jYXQobWVkaWFRdWVyeSwgXCIpXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gbGlzdDtcbn07XG5cbmZ1bmN0aW9uIGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSwgdXNlU291cmNlTWFwKSB7XG4gIHZhciBjb250ZW50ID0gaXRlbVsxXSB8fCAnJzsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1kZXN0cnVjdHVyaW5nXG5cbiAgdmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuXG4gIGlmICghY3NzTWFwcGluZykge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgaWYgKHVzZVNvdXJjZU1hcCAmJiB0eXBlb2YgYnRvYSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBzb3VyY2VNYXBwaW5nID0gdG9Db21tZW50KGNzc01hcHBpbmcpO1xuICAgIHZhciBzb3VyY2VVUkxzID0gY3NzTWFwcGluZy5zb3VyY2VzLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICByZXR1cm4gXCIvKiMgc291cmNlVVJMPVwiLmNvbmNhdChjc3NNYXBwaW5nLnNvdXJjZVJvb3QpLmNvbmNhdChzb3VyY2UsIFwiICovXCIpO1xuICAgIH0pO1xuICAgIHJldHVybiBbY29udGVudF0uY29uY2F0KHNvdXJjZVVSTHMpLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKCdcXG4nKTtcbn0gLy8gQWRhcHRlZCBmcm9tIGNvbnZlcnQtc291cmNlLW1hcCAoTUlUKVxuXG5cbmZ1bmN0aW9uIHRvQ29tbWVudChzb3VyY2VNYXApIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpO1xuICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gIHJldHVybiBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG59IiwiLypcbm9iamVjdC1hc3NpZ25cbihjKSBTaW5kcmUgU29yaHVzXG5AbGljZW5zZSBNSVRcbiovXG5cbid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KHZhbCkge1xuXHRpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTtcblx0fVxuXG5cdHJldHVybiBPYmplY3QodmFsKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKCkge1xuXHR0cnkge1xuXHRcdGlmICghT2JqZWN0LmFzc2lnbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIERldGVjdCBidWdneSBwcm9wZXJ0eSBlbnVtZXJhdGlvbiBvcmRlciBpbiBvbGRlciBWOCB2ZXJzaW9ucy5cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQxMThcblx0XHR2YXIgdGVzdDEgPSBuZXcgU3RyaW5nKCdhYmMnKTsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3LXdyYXBwZXJzXG5cdFx0dGVzdDFbNV0gPSAnZGUnO1xuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MSlbMF0gPT09ICc1Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDIgPSB7fTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcblx0XHRcdHRlc3QyWydfJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTtcblx0XHR9XG5cdFx0dmFyIG9yZGVyMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24gKG4pIHtcblx0XHRcdHJldHVybiB0ZXN0MltuXTtcblx0XHR9KTtcblx0XHRpZiAob3JkZXIyLmpvaW4oJycpICE9PSAnMDEyMzQ1Njc4OScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QzID0ge307XG5cdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAobGV0dGVyKSB7XG5cdFx0XHR0ZXN0M1tsZXR0ZXJdID0gbGV0dGVyO1xuXHRcdH0pO1xuXHRcdGlmIChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PVxuXHRcdFx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdC8vIFdlIGRvbid0IGV4cGVjdCBhbnkgb2YgdGhlIGFib3ZlIHRvIHRocm93LCBidXQgYmV0dGVyIHRvIGJlIHNhZmUuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hvdWxkVXNlTmF0aXZlKCkgPyBPYmplY3QuYXNzaWduIDogZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG5cdHZhciBmcm9tO1xuXHR2YXIgdG8gPSB0b09iamVjdCh0YXJnZXQpO1xuXHR2YXIgc3ltYm9scztcblxuXHRmb3IgKHZhciBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKykge1xuXHRcdGZyb20gPSBPYmplY3QoYXJndW1lbnRzW3NdKTtcblxuXHRcdGZvciAodmFyIGtleSBpbiBmcm9tKSB7XG5cdFx0XHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB7XG5cdFx0XHRcdHRvW2tleV0gPSBmcm9tW2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuXHRcdFx0c3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9scyhmcm9tKTtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocHJvcElzRW51bWVyYWJsZS5jYWxsKGZyb20sIHN5bWJvbHNbaV0pKSB7XG5cdFx0XHRcdFx0dG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRvO1xufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcbiAgdmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xuICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuXG4gIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICsgdGV4dDtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gLS0tIFdlbGNvbWUgdG8gZGVidWdnaW5nIFJlYWN0IC0tLVxuICAgICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHN0YWNrXG4gICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9IGNhdGNoICh4KSB7fVxuICB9O1xufVxuXG4vKipcbiAqIEFzc2VydCB0aGF0IHRoZSB2YWx1ZXMgbWF0Y2ggd2l0aCB0aGUgdHlwZSBzcGVjcy5cbiAqIEVycm9yIG1lc3NhZ2VzIGFyZSBtZW1vcml6ZWQgYW5kIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0eXBlU3BlY3MgTWFwIG9mIG5hbWUgdG8gYSBSZWFjdFByb3BUeXBlXG4gKiBAcGFyYW0ge29iamVjdH0gdmFsdWVzIFJ1bnRpbWUgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSB0eXBlLWNoZWNrZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBlLmcuIFwicHJvcFwiLCBcImNvbnRleHRcIiwgXCJjaGlsZCBjb250ZXh0XCJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21wb25lbnROYW1lIE5hbWUgb2YgdGhlIGNvbXBvbmVudCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gez9GdW5jdGlvbn0gZ2V0U3RhY2sgUmV0dXJucyB0aGUgY29tcG9uZW50IHN0YWNrLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBnZXRTdGFjaykge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvcjtcbiAgICAgICAgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcihcbiAgICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICtcbiAgICAgICAgICAgICAgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvciA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yID0gZXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yICYmICEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAnICtcbiAgICAgICAgICAgIGxvY2F0aW9uICsgJyBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArXG4gICAgICAgICAgICAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJyArIHR5cGVvZiBlcnJvciArICcuICcgK1xuICAgICAgICAgICAgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgK1xuICAgICAgICAgICAgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArXG4gICAgICAgICAgICAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IubWVzc2FnZV0gPSB0cnVlO1xuXG4gICAgICAgICAgdmFyIHN0YWNrID0gZ2V0U3RhY2sgPyBnZXRTdGFjaygpIDogJyc7XG5cbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAnRmFpbGVkICcgKyBsb2NhdGlvbiArICcgdHlwZTogJyArIGVycm9yLm1lc3NhZ2UgKyAoc3RhY2sgIT0gbnVsbCA/IHN0YWNrIDogJycpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlc2V0cyB3YXJuaW5nIGNhY2hlIHdoZW4gdGVzdGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jaGVja1Byb3BUeXBlcy5yZXNldFdhcm5pbmdDYWNoZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2hlY2tQcm9wVHlwZXM7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJztcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlc1NlY3JldDtcbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuOC42XG4gKiByZWFjdC1kb20uZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cblxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xudmFyIGNoZWNrUHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcy9jaGVja1Byb3BUeXBlcycpO1xudmFyIHNjaGVkdWxlciA9IHJlcXVpcmUoJ3NjaGVkdWxlcicpO1xudmFyIHRyYWNpbmcgPSByZXF1aXJlKCdzY2hlZHVsZXIvdHJhY2luZycpO1xuXG4vKipcbiAqIFVzZSBpbnZhcmlhbnQoKSB0byBhc3NlcnQgc3RhdGUgd2hpY2ggeW91ciBwcm9ncmFtIGFzc3VtZXMgdG8gYmUgdHJ1ZS5cbiAqXG4gKiBQcm92aWRlIHNwcmludGYtc3R5bGUgZm9ybWF0IChvbmx5ICVzIGlzIHN1cHBvcnRlZCkgYW5kIGFyZ3VtZW50c1xuICogdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGJyb2tlIGFuZCB3aGF0IHlvdSB3ZXJlXG4gKiBleHBlY3RpbmcuXG4gKlxuICogVGhlIGludmFyaWFudCBtZXNzYWdlIHdpbGwgYmUgc3RyaXBwZWQgaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBpbnZhcmlhbnRcbiAqIHdpbGwgcmVtYWluIHRvIGVuc3VyZSBsb2dpYyBkb2VzIG5vdCBkaWZmZXIgaW4gcHJvZHVjdGlvbi5cbiAqL1xuXG52YXIgdmFsaWRhdGVGb3JtYXQgPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICB2YWxpZGF0ZUZvcm1hdCA9IGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YXJpYW50IHJlcXVpcmVzIGFuIGVycm9yIG1lc3NhZ2UgYXJndW1lbnQnKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGludmFyaWFudChjb25kaXRpb24sIGZvcm1hdCwgYSwgYiwgYywgZCwgZSwgZikge1xuICB2YWxpZGF0ZUZvcm1hdChmb3JtYXQpO1xuXG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgdmFyIGVycm9yID0gdm9pZCAwO1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ01pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50ICcgKyAnZm9yIHRoZSBmdWxsIGVycm9yIG1lc3NhZ2UgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFyZ3MgPSBbYSwgYiwgYywgZCwgZSwgZl07XG4gICAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107XG4gICAgICB9KSk7XG4gICAgICBlcnJvci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgIH1cblxuICAgIGVycm9yLmZyYW1lc1RvUG9wID0gMTsgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCBpbnZhcmlhbnQncyBvd24gZnJhbWVcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vLyBSZWx5aW5nIG9uIHRoZSBgaW52YXJpYW50KClgIGltcGxlbWVudGF0aW9uIGxldHMgdXNcbi8vIHByZXNlcnZlIHRoZSBmb3JtYXQgYW5kIHBhcmFtcyBpbiB0aGUgd3d3IGJ1aWxkcy5cblxuIVJlYWN0ID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RET00gd2FzIGxvYWRlZCBiZWZvcmUgUmVhY3QuIE1ha2Ugc3VyZSB5b3UgbG9hZCB0aGUgUmVhY3QgcGFja2FnZSBiZWZvcmUgbG9hZGluZyBSZWFjdERPTS4nKSA6IHZvaWQgMDtcblxudmFyIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwgPSBmdW5jdGlvbiAobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICB2YXIgZnVuY0FyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpO1xuICB0cnkge1xuICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgZnVuY0FyZ3MpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gIH1cbn07XG5cbntcbiAgLy8gSW4gREVWIG1vZGUsIHdlIHN3YXAgb3V0IGludm9rZUd1YXJkZWRDYWxsYmFjayBmb3IgYSBzcGVjaWFsIHZlcnNpb25cbiAgLy8gdGhhdCBwbGF5cyBtb3JlIG5pY2VseSB3aXRoIHRoZSBicm93c2VyJ3MgRGV2VG9vbHMuIFRoZSBpZGVhIGlzIHRvIHByZXNlcnZlXG4gIC8vIFwiUGF1c2Ugb24gZXhjZXB0aW9uc1wiIGJlaGF2aW9yLiBCZWNhdXNlIFJlYWN0IHdyYXBzIGFsbCB1c2VyLXByb3ZpZGVkXG4gIC8vIGZ1bmN0aW9ucyBpbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2ssIGFuZCB0aGUgcHJvZHVjdGlvbiB2ZXJzaW9uIG9mXG4gIC8vIGludm9rZUd1YXJkZWRDYWxsYmFjayB1c2VzIGEgdHJ5LWNhdGNoLCBhbGwgdXNlciBleGNlcHRpb25zIGFyZSB0cmVhdGVkXG4gIC8vIGxpa2UgY2F1Z2h0IGV4Y2VwdGlvbnMsIGFuZCB0aGUgRGV2VG9vbHMgd29uJ3QgcGF1c2UgdW5sZXNzIHRoZSBkZXZlbG9wZXJcbiAgLy8gdGFrZXMgdGhlIGV4dHJhIHN0ZXAgb2YgZW5hYmxpbmcgcGF1c2Ugb24gY2F1Z2h0IGV4Y2VwdGlvbnMuIFRoaXMgaXNcbiAgLy8gdW5pbnR1aXRpdmUsIHRob3VnaCwgYmVjYXVzZSBldmVuIHRob3VnaCBSZWFjdCBoYXMgY2F1Z2h0IHRoZSBlcnJvciwgZnJvbVxuICAvLyB0aGUgZGV2ZWxvcGVyJ3MgcGVyc3BlY3RpdmUsIHRoZSBlcnJvciBpcyB1bmNhdWdodC5cbiAgLy9cbiAgLy8gVG8gcHJlc2VydmUgdGhlIGV4cGVjdGVkIFwiUGF1c2Ugb24gZXhjZXB0aW9uc1wiIGJlaGF2aW9yLCB3ZSBkb24ndCB1c2UgYVxuICAvLyB0cnktY2F0Y2ggaW4gREVWLiBJbnN0ZWFkLCB3ZSBzeW5jaHJvbm91c2x5IGRpc3BhdGNoIGEgZmFrZSBldmVudCB0byBhIGZha2VcbiAgLy8gRE9NIG5vZGUsIGFuZCBjYWxsIHRoZSB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrIGZyb20gaW5zaWRlIGFuIGV2ZW50IGhhbmRsZXJcbiAgLy8gZm9yIHRoYXQgZmFrZSBldmVudC4gSWYgdGhlIGNhbGxiYWNrIHRocm93cywgdGhlIGVycm9yIGlzIFwiY2FwdHVyZWRcIiB1c2luZ1xuICAvLyBhIGdsb2JhbCBldmVudCBoYW5kbGVyLiBCdXQgYmVjYXVzZSB0aGUgZXJyb3IgaGFwcGVucyBpbiBhIGRpZmZlcmVudFxuICAvLyBldmVudCBsb29wIGNvbnRleHQsIGl0IGRvZXMgbm90IGludGVycnVwdCB0aGUgbm9ybWFsIHByb2dyYW0gZmxvdy5cbiAgLy8gRWZmZWN0aXZlbHksIHRoaXMgZ2l2ZXMgdXMgdHJ5LWNhdGNoIGJlaGF2aW9yIHdpdGhvdXQgYWN0dWFsbHkgdXNpbmdcbiAgLy8gdHJ5LWNhdGNoLiBOZWF0IVxuXG4gIC8vIENoZWNrIHRoYXQgdGhlIGJyb3dzZXIgc3VwcG9ydHMgdGhlIEFQSXMgd2UgbmVlZCB0byBpbXBsZW1lbnQgb3VyIHNwZWNpYWxcbiAgLy8gREVWIHZlcnNpb24gb2YgaW52b2tlR3VhcmRlZENhbGxiYWNrXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRpc3BhdGNoRXZlbnQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZmFrZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdyZWFjdCcpO1xuXG4gICAgdmFyIGludm9rZUd1YXJkZWRDYWxsYmFja0RldiA9IGZ1bmN0aW9uIChuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgICAvLyBJZiBkb2N1bWVudCBkb2Vzbid0IGV4aXN0IHdlIGtub3cgZm9yIHN1cmUgd2Ugd2lsbCBjcmFzaCBpbiB0aGlzIG1ldGhvZFxuICAgICAgLy8gd2hlbiB3ZSBjYWxsIGRvY3VtZW50LmNyZWF0ZUV2ZW50KCkuIEhvd2V2ZXIgdGhpcyBjYW4gY2F1c2UgY29uZnVzaW5nXG4gICAgICAvLyBlcnJvcnM6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9va2luY3ViYXRvci9jcmVhdGUtcmVhY3QtYXBwL2lzc3Vlcy8zNDgyXG4gICAgICAvLyBTbyB3ZSBwcmVlbXB0aXZlbHkgdGhyb3cgd2l0aCBhIGJldHRlciBtZXNzYWdlIGluc3RlYWQuXG4gICAgICAhKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpID8gaW52YXJpYW50KGZhbHNlLCAnVGhlIGBkb2N1bWVudGAgZ2xvYmFsIHdhcyBkZWZpbmVkIHdoZW4gUmVhY3Qgd2FzIGluaXRpYWxpemVkLCBidXQgaXMgbm90IGRlZmluZWQgYW55bW9yZS4gVGhpcyBjYW4gaGFwcGVuIGluIGEgdGVzdCBlbnZpcm9ubWVudCBpZiBhIGNvbXBvbmVudCBzY2hlZHVsZXMgYW4gdXBkYXRlIGZyb20gYW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrLCBidXQgdGhlIHRlc3QgaGFzIGFscmVhZHkgZmluaXNoZWQgcnVubmluZy4gVG8gc29sdmUgdGhpcywgeW91IGNhbiBlaXRoZXIgdW5tb3VudCB0aGUgY29tcG9uZW50IGF0IHRoZSBlbmQgb2YgeW91ciB0ZXN0IChhbmQgZW5zdXJlIHRoYXQgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGdldCBjYW5jZWxlZCBpbiBgY29tcG9uZW50V2lsbFVubW91bnRgKSwgb3IgeW91IGNhbiBjaGFuZ2UgdGhlIHRlc3QgaXRzZWxmIHRvIGJlIGFzeW5jaHJvbm91cy4nKSA6IHZvaWQgMDtcbiAgICAgIHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcblxuICAgICAgLy8gS2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjayB0aHJldyBhbiBlcnJvci4gV2VcbiAgICAgIC8vIHNldCB0aGlzIHRvIHRydWUgYXQgdGhlIGJlZ2lubmluZywgdGhlbiBzZXQgaXQgdG8gZmFsc2UgcmlnaHQgYWZ0ZXJcbiAgICAgIC8vIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLiBJZiB0aGUgZnVuY3Rpb24gZXJyb3JzLCBgZGlkRXJyb3JgIHdpbGwgbmV2ZXIgYmVcbiAgICAgIC8vIHNldCB0byBmYWxzZS4gVGhpcyBzdHJhdGVneSB3b3JrcyBldmVuIGlmIHRoZSBicm93c2VyIGlzIGZsYWt5IGFuZFxuICAgICAgLy8gZmFpbHMgdG8gY2FsbCBvdXIgZ2xvYmFsIGVycm9yIGhhbmRsZXIsIGJlY2F1c2UgaXQgZG9lc24ndCByZWx5IG9uXG4gICAgICAvLyB0aGUgZXJyb3IgZXZlbnQgYXQgYWxsLlxuICAgICAgdmFyIGRpZEVycm9yID0gdHJ1ZTtcblxuICAgICAgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIHZhbHVlIG9mIHdpbmRvdy5ldmVudCBzbyB0aGF0IHdlIGNhbiByZXNldCBpdFxuICAgICAgLy8gZHVyaW5nIHRoZSBjYWxsYmFjayB0byBsZXQgdXNlciBjb2RlIGFjY2VzcyB3aW5kb3cuZXZlbnQgaW4gdGhlXG4gICAgICAvLyBicm93c2VycyB0aGF0IHN1cHBvcnQgaXQuXG4gICAgICB2YXIgd2luZG93RXZlbnQgPSB3aW5kb3cuZXZlbnQ7XG5cbiAgICAgIC8vIEtlZXBzIHRyYWNrIG9mIHRoZSBkZXNjcmlwdG9yIG9mIHdpbmRvdy5ldmVudCB0byByZXN0b3JlIGl0IGFmdGVyIGV2ZW50XG4gICAgICAvLyBkaXNwYXRjaGluZzogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzY4OFxuICAgICAgdmFyIHdpbmRvd0V2ZW50RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnZXZlbnQnKTtcblxuICAgICAgLy8gQ3JlYXRlIGFuIGV2ZW50IGhhbmRsZXIgZm9yIG91ciBmYWtlIGV2ZW50LiBXZSB3aWxsIHN5bmNocm9ub3VzbHlcbiAgICAgIC8vIGRpc3BhdGNoIG91ciBmYWtlIGV2ZW50IHVzaW5nIGBkaXNwYXRjaEV2ZW50YC4gSW5zaWRlIHRoZSBoYW5kbGVyLCB3ZVxuICAgICAgLy8gY2FsbCB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjay5cbiAgICAgIHZhciBmdW5jQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMyk7XG4gICAgICBmdW5jdGlvbiBjYWxsQ2FsbGJhY2soKSB7XG4gICAgICAgIC8vIFdlIGltbWVkaWF0ZWx5IHJlbW92ZSB0aGUgY2FsbGJhY2sgZnJvbSBldmVudCBsaXN0ZW5lcnMgc28gdGhhdFxuICAgICAgICAvLyBuZXN0ZWQgYGludm9rZUd1YXJkZWRDYWxsYmFja2AgY2FsbHMgZG8gbm90IGNsYXNoLiBPdGhlcndpc2UsIGFcbiAgICAgICAgLy8gbmVzdGVkIGNhbGwgd291bGQgdHJpZ2dlciB0aGUgZmFrZSBldmVudCBoYW5kbGVycyBvZiBhbnkgY2FsbCBoaWdoZXJcbiAgICAgICAgLy8gaW4gdGhlIHN0YWNrLlxuICAgICAgICBmYWtlTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2dFR5cGUsIGNhbGxDYWxsYmFjaywgZmFsc2UpO1xuXG4gICAgICAgIC8vIFdlIGNoZWNrIGZvciB3aW5kb3cuaGFzT3duUHJvcGVydHkoJ2V2ZW50JykgdG8gcHJldmVudCB0aGVcbiAgICAgICAgLy8gd2luZG93LmV2ZW50IGFzc2lnbm1lbnQgaW4gYm90aCBJRSA8PSAxMCBhcyB0aGV5IHRocm93IGFuIGVycm9yXG4gICAgICAgIC8vIFwiTWVtYmVyIG5vdCBmb3VuZFwiIGluIHN0cmljdCBtb2RlLCBhbmQgaW4gRmlyZWZveCB3aGljaCBkb2VzIG5vdFxuICAgICAgICAvLyBzdXBwb3J0IHdpbmRvdy5ldmVudC5cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuZXZlbnQgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnZXZlbnQnKSkge1xuICAgICAgICAgIHdpbmRvdy5ldmVudCA9IHdpbmRvd0V2ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBmdW5jQXJncyk7XG4gICAgICAgIGRpZEVycm9yID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBhIGdsb2JhbCBlcnJvciBldmVudCBoYW5kbGVyLiBXZSB1c2UgdGhpcyB0byBjYXB0dXJlIHRoZSB2YWx1ZVxuICAgICAgLy8gdGhhdCB3YXMgdGhyb3duLiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgZmlyZSBtb3JlXG4gICAgICAvLyB0aGFuIG9uY2U7IGZvciBleGFtcGxlLCBpZiBub24tUmVhY3QgY29kZSBhbHNvIGNhbGxzIGBkaXNwYXRjaEV2ZW50YFxuICAgICAgLy8gYW5kIGEgaGFuZGxlciBmb3IgdGhhdCBldmVudCB0aHJvd3MuIFdlIHNob3VsZCBiZSByZXNpbGllbnQgdG8gbW9zdCBvZlxuICAgICAgLy8gdGhvc2UgY2FzZXMuIEV2ZW4gaWYgb3VyIGVycm9yIGV2ZW50IGhhbmRsZXIgZmlyZXMgbW9yZSB0aGFuIG9uY2UsIHRoZVxuICAgICAgLy8gbGFzdCBlcnJvciBldmVudCBpcyBhbHdheXMgdXNlZC4gSWYgdGhlIGNhbGxiYWNrIGFjdHVhbGx5IGRvZXMgZXJyb3IsXG4gICAgICAvLyB3ZSBrbm93IHRoYXQgdGhlIGxhc3QgZXJyb3IgZXZlbnQgaXMgdGhlIGNvcnJlY3Qgb25lLCBiZWNhdXNlIGl0J3Mgbm90XG4gICAgICAvLyBwb3NzaWJsZSBmb3IgYW55dGhpbmcgZWxzZSB0byBoYXZlIGhhcHBlbmVkIGluIGJldHdlZW4gb3VyIGNhbGxiYWNrXG4gICAgICAvLyBlcnJvcmluZyBhbmQgdGhlIGNvZGUgdGhhdCBmb2xsb3dzIHRoZSBgZGlzcGF0Y2hFdmVudGAgY2FsbCBiZWxvdy4gSWZcbiAgICAgIC8vIHRoZSBjYWxsYmFjayBkb2Vzbid0IGVycm9yLCBidXQgdGhlIGVycm9yIGV2ZW50IHdhcyBmaXJlZCwgd2Uga25vdyB0b1xuICAgICAgLy8gaWdub3JlIGl0IGJlY2F1c2UgYGRpZEVycm9yYCB3aWxsIGJlIGZhbHNlLCBhcyBkZXNjcmliZWQgYWJvdmUuXG4gICAgICB2YXIgZXJyb3IgPSB2b2lkIDA7XG4gICAgICAvLyBVc2UgdGhpcyB0byB0cmFjayB3aGV0aGVyIHRoZSBlcnJvciBldmVudCBpcyBldmVyIGNhbGxlZC5cbiAgICAgIHZhciBkaWRTZXRFcnJvciA9IGZhbHNlO1xuICAgICAgdmFyIGlzQ3Jvc3NPcmlnaW5FcnJvciA9IGZhbHNlO1xuXG4gICAgICBmdW5jdGlvbiBoYW5kbGVXaW5kb3dFcnJvcihldmVudCkge1xuICAgICAgICBlcnJvciA9IGV2ZW50LmVycm9yO1xuICAgICAgICBkaWRTZXRFcnJvciA9IHRydWU7XG4gICAgICAgIGlmIChlcnJvciA9PT0gbnVsbCAmJiBldmVudC5jb2xubyA9PT0gMCAmJiBldmVudC5saW5lbm8gPT09IDApIHtcbiAgICAgICAgICBpc0Nyb3NzT3JpZ2luRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgLy8gU29tZSBvdGhlciBlcnJvciBoYW5kbGVyIGhhcyBwcmV2ZW50ZWQgZGVmYXVsdC5cbiAgICAgICAgICAvLyBCcm93c2VycyBzaWxlbmNlIHRoZSBlcnJvciByZXBvcnQgaWYgdGhpcyBoYXBwZW5zLlxuICAgICAgICAgIC8vIFdlJ2xsIHJlbWVtYmVyIHRoaXMgdG8gbGF0ZXIgZGVjaWRlIHdoZXRoZXIgdG8gbG9nIGl0IG9yIG5vdC5cbiAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBlcnJvci5fc3VwcHJlc3NMb2dnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGlubmVyKSB7XG4gICAgICAgICAgICAgIC8vIElnbm9yZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGEgZmFrZSBldmVudCB0eXBlLlxuICAgICAgdmFyIGV2dFR5cGUgPSAncmVhY3QtJyArIChuYW1lID8gbmFtZSA6ICdpbnZva2VndWFyZGVkY2FsbGJhY2snKTtcblxuICAgICAgLy8gQXR0YWNoIG91ciBldmVudCBoYW5kbGVyc1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgaGFuZGxlV2luZG93RXJyb3IpO1xuICAgICAgZmFrZU5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldnRUeXBlLCBjYWxsQ2FsbGJhY2ssIGZhbHNlKTtcblxuICAgICAgLy8gU3luY2hyb25vdXNseSBkaXNwYXRjaCBvdXIgZmFrZSBldmVudC4gSWYgdGhlIHVzZXItcHJvdmlkZWQgZnVuY3Rpb25cbiAgICAgIC8vIGVycm9ycywgaXQgd2lsbCB0cmlnZ2VyIG91ciBnbG9iYWwgZXJyb3IgaGFuZGxlci5cbiAgICAgIGV2dC5pbml0RXZlbnQoZXZ0VHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgIGZha2VOb2RlLmRpc3BhdGNoRXZlbnQoZXZ0KTtcblxuICAgICAgaWYgKHdpbmRvd0V2ZW50RGVzY3JpcHRvcikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnZXZlbnQnLCB3aW5kb3dFdmVudERlc2NyaXB0b3IpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlkRXJyb3IpIHtcbiAgICAgICAgaWYgKCFkaWRTZXRFcnJvcikge1xuICAgICAgICAgIC8vIFRoZSBjYWxsYmFjayBlcnJvcmVkLCBidXQgdGhlIGVycm9yIGV2ZW50IG5ldmVyIGZpcmVkLlxuICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKCdBbiBlcnJvciB3YXMgdGhyb3duIGluc2lkZSBvbmUgb2YgeW91ciBjb21wb25lbnRzLCBidXQgUmVhY3QgJyArIFwiZG9lc24ndCBrbm93IHdoYXQgaXQgd2FzLiBUaGlzIGlzIGxpa2VseSBkdWUgdG8gYnJvd3NlciBcIiArICdmbGFraW5lc3MuIFJlYWN0IGRvZXMgaXRzIGJlc3QgdG8gcHJlc2VydmUgdGhlIFwiUGF1c2Ugb24gJyArICdleGNlcHRpb25zXCIgYmVoYXZpb3Igb2YgdGhlIERldlRvb2xzLCB3aGljaCByZXF1aXJlcyBzb21lICcgKyBcIkRFVi1tb2RlIG9ubHkgdHJpY2tzLiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlc2UgZG9uJ3Qgd29yayBpbiBcIiArICd5b3VyIGJyb3dzZXIuIFRyeSB0cmlnZ2VyaW5nIHRoZSBlcnJvciBpbiBwcm9kdWN0aW9uIG1vZGUsICcgKyAnb3Igc3dpdGNoaW5nIHRvIGEgbW9kZXJuIGJyb3dzZXIuIElmIHlvdSBzdXNwZWN0IHRoYXQgdGhpcyBpcyAnICsgJ2FjdHVhbGx5IGFuIGlzc3VlIHdpdGggUmVhY3QsIHBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQ3Jvc3NPcmlnaW5FcnJvcikge1xuICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKFwiQSBjcm9zcy1vcmlnaW4gZXJyb3Igd2FzIHRocm93bi4gUmVhY3QgZG9lc24ndCBoYXZlIGFjY2VzcyB0byBcIiArICd0aGUgYWN0dWFsIGVycm9yIG9iamVjdCBpbiBkZXZlbG9wbWVudC4gJyArICdTZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC1jcm9zc29yaWdpbi1lcnJvciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgb3VyIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgaGFuZGxlV2luZG93RXJyb3IpO1xuICAgIH07XG5cbiAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsID0gaW52b2tlR3VhcmRlZENhbGxiYWNrRGV2O1xuICB9XG59XG5cbnZhciBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsJDEgPSBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsO1xuXG4vLyBVc2VkIGJ5IEZpYmVyIHRvIHNpbXVsYXRlIGEgdHJ5LWNhdGNoLlxudmFyIGhhc0Vycm9yID0gZmFsc2U7XG52YXIgY2F1Z2h0RXJyb3IgPSBudWxsO1xuXG4vLyBVc2VkIGJ5IGV2ZW50IHN5c3RlbSB0byBjYXB0dXJlL3JldGhyb3cgdGhlIGZpcnN0IGVycm9yLlxudmFyIGhhc1JldGhyb3dFcnJvciA9IGZhbHNlO1xudmFyIHJldGhyb3dFcnJvciA9IG51bGw7XG5cbnZhciByZXBvcnRlciA9IHtcbiAgb25FcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gIH1cbn07XG5cbi8qKlxuICogQ2FsbCBhIGZ1bmN0aW9uIHdoaWxlIGd1YXJkaW5nIGFnYWluc3QgZXJyb3JzIHRoYXQgaGFwcGVucyB3aXRoaW4gaXQuXG4gKiBSZXR1cm5zIGFuIGVycm9yIGlmIGl0IHRocm93cywgb3RoZXJ3aXNlIG51bGwuXG4gKlxuICogSW4gcHJvZHVjdGlvbiwgdGhpcyBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIHRyeS1jYXRjaC4gVGhlIHJlYXNvbiB3ZSBkb24ndFxuICogdXNlIGEgdHJ5LWNhdGNoIGRpcmVjdGx5IGlzIHNvIHRoYXQgd2UgY2FuIHN3YXAgb3V0IGEgZGlmZmVyZW50XG4gKiBpbXBsZW1lbnRhdGlvbiBpbiBERVYgbW9kZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiB0aGUgZ3VhcmQgdG8gdXNlIGZvciBsb2dnaW5nIG9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgVGhlIGNvbnRleHQgdG8gdXNlIHdoZW4gY2FsbGluZyB0aGUgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcmd1bWVudHMgZm9yIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFjayhuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGhhc0Vycm9yID0gZmFsc2U7XG4gIGNhdWdodEVycm9yID0gbnVsbDtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxLmFwcGx5KHJlcG9ydGVyLCBhcmd1bWVudHMpO1xufVxuXG4vKipcbiAqIFNhbWUgYXMgaW52b2tlR3VhcmRlZENhbGxiYWNrLCBidXQgaW5zdGVhZCBvZiByZXR1cm5pbmcgYW4gZXJyb3IsIGl0IHN0b3Jlc1xuICogaXQgaW4gYSBnbG9iYWwgc28gaXQgY2FuIGJlIHJldGhyb3duIGJ5IGByZXRocm93Q2F1Z2h0RXJyb3JgIGxhdGVyLlxuICogVE9ETzogU2VlIGlmIGNhdWdodEVycm9yIGFuZCByZXRocm93RXJyb3IgY2FuIGJlIHVuaWZpZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgdGhlIGd1YXJkIHRvIHVzZSBmb3IgbG9nZ2luZyBvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZVxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIHVzZSB3aGVuIGNhbGxpbmcgdGhlIGZ1bmN0aW9uXG4gKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJndW1lbnRzIGZvciBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tBbmRDYXRjaEZpcnN0RXJyb3IobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgaWYgKGhhc0Vycm9yKSB7XG4gICAgdmFyIGVycm9yID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuICAgIGlmICghaGFzUmV0aHJvd0Vycm9yKSB7XG4gICAgICBoYXNSZXRocm93RXJyb3IgPSB0cnVlO1xuICAgICAgcmV0aHJvd0Vycm9yID0gZXJyb3I7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRHVyaW5nIGV4ZWN1dGlvbiBvZiBndWFyZGVkIGZ1bmN0aW9ucyB3ZSB3aWxsIGNhcHR1cmUgdGhlIGZpcnN0IGVycm9yIHdoaWNoXG4gKiB3ZSB3aWxsIHJldGhyb3cgdG8gYmUgaGFuZGxlZCBieSB0aGUgdG9wIGxldmVsIGVycm9yIGhhbmRsZXIuXG4gKi9cbmZ1bmN0aW9uIHJldGhyb3dDYXVnaHRFcnJvcigpIHtcbiAgaWYgKGhhc1JldGhyb3dFcnJvcikge1xuICAgIHZhciBlcnJvciA9IHJldGhyb3dFcnJvcjtcbiAgICBoYXNSZXRocm93RXJyb3IgPSBmYWxzZTtcbiAgICByZXRocm93RXJyb3IgPSBudWxsO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0NhdWdodEVycm9yKCkge1xuICByZXR1cm4gaGFzRXJyb3I7XG59XG5cbmZ1bmN0aW9uIGNsZWFyQ2F1Z2h0RXJyb3IoKSB7XG4gIGlmIChoYXNFcnJvcikge1xuICAgIHZhciBlcnJvciA9IGNhdWdodEVycm9yO1xuICAgIGhhc0Vycm9yID0gZmFsc2U7XG4gICAgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICAgIHJldHVybiBlcnJvcjtcbiAgfSBlbHNlIHtcbiAgICBpbnZhcmlhbnQoZmFsc2UsICdjbGVhckNhdWdodEVycm9yIHdhcyBjYWxsZWQgYnV0IG5vIGVycm9yIHdhcyBjYXB0dXJlZC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxufVxuXG4vKipcbiAqIEluamVjdGFibGUgb3JkZXJpbmcgb2YgZXZlbnQgcGx1Z2lucy5cbiAqL1xudmFyIGV2ZW50UGx1Z2luT3JkZXIgPSBudWxsO1xuXG4vKipcbiAqIEluamVjdGFibGUgbWFwcGluZyBmcm9tIG5hbWVzIHRvIGV2ZW50IHBsdWdpbiBtb2R1bGVzLlxuICovXG52YXIgbmFtZXNUb1BsdWdpbnMgPSB7fTtcblxuLyoqXG4gKiBSZWNvbXB1dGVzIHRoZSBwbHVnaW4gbGlzdCB1c2luZyB0aGUgaW5qZWN0ZWQgcGx1Z2lucyBhbmQgcGx1Z2luIG9yZGVyaW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY29tcHV0ZVBsdWdpbk9yZGVyaW5nKCkge1xuICBpZiAoIWV2ZW50UGx1Z2luT3JkZXIpIHtcbiAgICAvLyBXYWl0IHVudGlsIGFuIGBldmVudFBsdWdpbk9yZGVyYCBpcyBpbmplY3RlZC5cbiAgICByZXR1cm47XG4gIH1cbiAgZm9yICh2YXIgcGx1Z2luTmFtZSBpbiBuYW1lc1RvUGx1Z2lucykge1xuICAgIHZhciBwbHVnaW5Nb2R1bGUgPSBuYW1lc1RvUGx1Z2luc1twbHVnaW5OYW1lXTtcbiAgICB2YXIgcGx1Z2luSW5kZXggPSBldmVudFBsdWdpbk9yZGVyLmluZGV4T2YocGx1Z2luTmFtZSk7XG4gICAgIShwbHVnaW5JbmRleCA+IC0xKSA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luUmVnaXN0cnk6IENhbm5vdCBpbmplY3QgZXZlbnQgcGx1Z2lucyB0aGF0IGRvIG5vdCBleGlzdCBpbiB0aGUgcGx1Z2luIG9yZGVyaW5nLCBgJXNgLicsIHBsdWdpbk5hbWUpIDogdm9pZCAwO1xuICAgIGlmIChwbHVnaW5zW3BsdWdpbkluZGV4XSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgICFwbHVnaW5Nb2R1bGUuZXh0cmFjdEV2ZW50cyA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luUmVnaXN0cnk6IEV2ZW50IHBsdWdpbnMgbXVzdCBpbXBsZW1lbnQgYW4gYGV4dHJhY3RFdmVudHNgIG1ldGhvZCwgYnV0IGAlc2AgZG9lcyBub3QuJywgcGx1Z2luTmFtZSkgOiB2b2lkIDA7XG4gICAgcGx1Z2luc1twbHVnaW5JbmRleF0gPSBwbHVnaW5Nb2R1bGU7XG4gICAgdmFyIHB1Ymxpc2hlZEV2ZW50cyA9IHBsdWdpbk1vZHVsZS5ldmVudFR5cGVzO1xuICAgIGZvciAodmFyIGV2ZW50TmFtZSBpbiBwdWJsaXNoZWRFdmVudHMpIHtcbiAgICAgICFwdWJsaXNoRXZlbnRGb3JQbHVnaW4ocHVibGlzaGVkRXZlbnRzW2V2ZW50TmFtZV0sIHBsdWdpbk1vZHVsZSwgZXZlbnROYW1lKSA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luUmVnaXN0cnk6IEZhaWxlZCB0byBwdWJsaXNoIGV2ZW50IGAlc2AgZm9yIHBsdWdpbiBgJXNgLicsIGV2ZW50TmFtZSwgcGx1Z2luTmFtZSkgOiB2b2lkIDA7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUHVibGlzaGVzIGFuIGV2ZW50IHNvIHRoYXQgaXQgY2FuIGJlIGRpc3BhdGNoZWQgYnkgdGhlIHN1cHBsaWVkIHBsdWdpbi5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgRGlzcGF0Y2ggY29uZmlndXJhdGlvbiBmb3IgdGhlIGV2ZW50LlxuICogQHBhcmFtIHtvYmplY3R9IFBsdWdpbk1vZHVsZSBQbHVnaW4gcHVibGlzaGluZyB0aGUgZXZlbnQuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBldmVudCB3YXMgc3VjY2Vzc2Z1bGx5IHB1Ymxpc2hlZC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHB1Ymxpc2hFdmVudEZvclBsdWdpbihkaXNwYXRjaENvbmZpZywgcGx1Z2luTW9kdWxlLCBldmVudE5hbWUpIHtcbiAgISFldmVudE5hbWVEaXNwYXRjaENvbmZpZ3MuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luSHViOiBNb3JlIHRoYW4gb25lIHBsdWdpbiBhdHRlbXB0ZWQgdG8gcHVibGlzaCB0aGUgc2FtZSBldmVudCBuYW1lLCBgJXNgLicsIGV2ZW50TmFtZSkgOiB2b2lkIDA7XG4gIGV2ZW50TmFtZURpc3BhdGNoQ29uZmlnc1tldmVudE5hbWVdID0gZGlzcGF0Y2hDb25maWc7XG5cbiAgdmFyIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzID0gZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM7XG4gIGlmIChwaGFzZWRSZWdpc3RyYXRpb25OYW1lcykge1xuICAgIGZvciAodmFyIHBoYXNlTmFtZSBpbiBwaGFzZWRSZWdpc3RyYXRpb25OYW1lcykge1xuICAgICAgaWYgKHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzLmhhc093blByb3BlcnR5KHBoYXNlTmFtZSkpIHtcbiAgICAgICAgdmFyIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWUgPSBwaGFzZWRSZWdpc3RyYXRpb25OYW1lc1twaGFzZU5hbWVdO1xuICAgICAgICBwdWJsaXNoUmVnaXN0cmF0aW9uTmFtZShwaGFzZWRSZWdpc3RyYXRpb25OYW1lLCBwbHVnaW5Nb2R1bGUsIGV2ZW50TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUpIHtcbiAgICBwdWJsaXNoUmVnaXN0cmF0aW9uTmFtZShkaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lLCBwbHVnaW5Nb2R1bGUsIGV2ZW50TmFtZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFB1Ymxpc2hlcyBhIHJlZ2lzdHJhdGlvbiBuYW1lIHRoYXQgaXMgdXNlZCB0byBpZGVudGlmeSBkaXNwYXRjaGVkIGV2ZW50cy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBSZWdpc3RyYXRpb24gbmFtZSB0byBhZGQuXG4gKiBAcGFyYW0ge29iamVjdH0gUGx1Z2luTW9kdWxlIFBsdWdpbiBwdWJsaXNoaW5nIHRoZSBldmVudC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHB1Ymxpc2hSZWdpc3RyYXRpb25OYW1lKHJlZ2lzdHJhdGlvbk5hbWUsIHBsdWdpbk1vZHVsZSwgZXZlbnROYW1lKSB7XG4gICEhcmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV0gPyBpbnZhcmlhbnQoZmFsc2UsICdFdmVudFBsdWdpbkh1YjogTW9yZSB0aGFuIG9uZSBwbHVnaW4gYXR0ZW1wdGVkIHRvIHB1Ymxpc2ggdGhlIHNhbWUgcmVnaXN0cmF0aW9uIG5hbWUsIGAlc2AuJywgcmVnaXN0cmF0aW9uTmFtZSkgOiB2b2lkIDA7XG4gIHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3JlZ2lzdHJhdGlvbk5hbWVdID0gcGx1Z2luTW9kdWxlO1xuICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdID0gcGx1Z2luTW9kdWxlLmV2ZW50VHlwZXNbZXZlbnROYW1lXS5kZXBlbmRlbmNpZXM7XG5cbiAge1xuICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IHJlZ2lzdHJhdGlvbk5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzW2xvd2VyQ2FzZWROYW1lXSA9IHJlZ2lzdHJhdGlvbk5hbWU7XG5cbiAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSA9PT0gJ29uRG91YmxlQ2xpY2snKSB7XG4gICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzLm9uZGJsY2xpY2sgPSByZWdpc3RyYXRpb25OYW1lO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBwbHVnaW5zIHNvIHRoYXQgdGhleSBjYW4gZXh0cmFjdCBhbmQgZGlzcGF0Y2ggZXZlbnRzLlxuICpcbiAqIEBzZWUge0V2ZW50UGx1Z2luSHVifVxuICovXG5cbi8qKlxuICogT3JkZXJlZCBsaXN0IG9mIGluamVjdGVkIHBsdWdpbnMuXG4gKi9cbnZhciBwbHVnaW5zID0gW107XG5cbi8qKlxuICogTWFwcGluZyBmcm9tIGV2ZW50IG5hbWUgdG8gZGlzcGF0Y2ggY29uZmlnXG4gKi9cbnZhciBldmVudE5hbWVEaXNwYXRjaENvbmZpZ3MgPSB7fTtcblxuLyoqXG4gKiBNYXBwaW5nIGZyb20gcmVnaXN0cmF0aW9uIG5hbWUgdG8gcGx1Z2luIG1vZHVsZVxuICovXG52YXIgcmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMgPSB7fTtcblxuLyoqXG4gKiBNYXBwaW5nIGZyb20gcmVnaXN0cmF0aW9uIG5hbWUgdG8gZXZlbnQgbmFtZVxuICovXG52YXIgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyA9IHt9O1xuXG4vKipcbiAqIE1hcHBpbmcgZnJvbSBsb3dlcmNhc2UgcmVnaXN0cmF0aW9uIG5hbWVzIHRvIHRoZSBwcm9wZXJseSBjYXNlZCB2ZXJzaW9uLFxuICogdXNlZCB0byB3YXJuIGluIHRoZSBjYXNlIG9mIG1pc3NpbmcgZXZlbnQgaGFuZGxlcnMuIEF2YWlsYWJsZVxuICogb25seSBpbiB0cnVlLlxuICogQHR5cGUge09iamVjdH1cbiAqL1xudmFyIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgPSB7fTtcbi8vIFRydXN0IHRoZSBkZXZlbG9wZXIgdG8gb25seSB1c2UgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyBpbiB0cnVlXG5cbi8qKlxuICogSW5qZWN0cyBhbiBvcmRlcmluZyBvZiBwbHVnaW5zIChieSBwbHVnaW4gbmFtZSkuIFRoaXMgYWxsb3dzIHRoZSBvcmRlcmluZ1xuICogdG8gYmUgZGVjb3VwbGVkIGZyb20gaW5qZWN0aW9uIG9mIHRoZSBhY3R1YWwgcGx1Z2lucyBzbyB0aGF0IG9yZGVyaW5nIGlzXG4gKiBhbHdheXMgZGV0ZXJtaW5pc3RpYyByZWdhcmRsZXNzIG9mIHBhY2thZ2luZywgb24tdGhlLWZseSBpbmplY3Rpb24sIGV0Yy5cbiAqXG4gKiBAcGFyYW0ge2FycmF5fSBJbmplY3RlZEV2ZW50UGx1Z2luT3JkZXJcbiAqIEBpbnRlcm5hbFxuICogQHNlZSB7RXZlbnRQbHVnaW5IdWIuaW5qZWN0aW9uLmluamVjdEV2ZW50UGx1Z2luT3JkZXJ9XG4gKi9cbmZ1bmN0aW9uIGluamVjdEV2ZW50UGx1Z2luT3JkZXIoaW5qZWN0ZWRFdmVudFBsdWdpbk9yZGVyKSB7XG4gICEhZXZlbnRQbHVnaW5PcmRlciA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luUmVnaXN0cnk6IENhbm5vdCBpbmplY3QgZXZlbnQgcGx1Z2luIG9yZGVyaW5nIG1vcmUgdGhhbiBvbmNlLiBZb3UgYXJlIGxpa2VseSB0cnlpbmcgdG8gbG9hZCBtb3JlIHRoYW4gb25lIGNvcHkgb2YgUmVhY3QuJykgOiB2b2lkIDA7XG4gIC8vIENsb25lIHRoZSBvcmRlcmluZyBzbyBpdCBjYW5ub3QgYmUgZHluYW1pY2FsbHkgbXV0YXRlZC5cbiAgZXZlbnRQbHVnaW5PcmRlciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGluamVjdGVkRXZlbnRQbHVnaW5PcmRlcik7XG4gIHJlY29tcHV0ZVBsdWdpbk9yZGVyaW5nKCk7XG59XG5cbi8qKlxuICogSW5qZWN0cyBwbHVnaW5zIHRvIGJlIHVzZWQgYnkgYEV2ZW50UGx1Z2luSHViYC4gVGhlIHBsdWdpbiBuYW1lcyBtdXN0IGJlXG4gKiBpbiB0aGUgb3JkZXJpbmcgaW5qZWN0ZWQgYnkgYGluamVjdEV2ZW50UGx1Z2luT3JkZXJgLlxuICpcbiAqIFBsdWdpbnMgY2FuIGJlIGluamVjdGVkIGFzIHBhcnQgb2YgcGFnZSBpbml0aWFsaXphdGlvbiBvciBvbi10aGUtZmx5LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBpbmplY3RlZE5hbWVzVG9QbHVnaW5zIE1hcCBmcm9tIG5hbWVzIHRvIHBsdWdpbiBtb2R1bGVzLlxuICogQGludGVybmFsXG4gKiBAc2VlIHtFdmVudFBsdWdpbkh1Yi5pbmplY3Rpb24uaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lfVxuICovXG5mdW5jdGlvbiBpbmplY3RFdmVudFBsdWdpbnNCeU5hbWUoaW5qZWN0ZWROYW1lc1RvUGx1Z2lucykge1xuICB2YXIgaXNPcmRlcmluZ0RpcnR5ID0gZmFsc2U7XG4gIGZvciAodmFyIHBsdWdpbk5hbWUgaW4gaW5qZWN0ZWROYW1lc1RvUGx1Z2lucykge1xuICAgIGlmICghaW5qZWN0ZWROYW1lc1RvUGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShwbHVnaW5OYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBwbHVnaW5Nb2R1bGUgPSBpbmplY3RlZE5hbWVzVG9QbHVnaW5zW3BsdWdpbk5hbWVdO1xuICAgIGlmICghbmFtZXNUb1BsdWdpbnMuaGFzT3duUHJvcGVydHkocGx1Z2luTmFtZSkgfHwgbmFtZXNUb1BsdWdpbnNbcGx1Z2luTmFtZV0gIT09IHBsdWdpbk1vZHVsZSkge1xuICAgICAgISFuYW1lc1RvUGx1Z2luc1twbHVnaW5OYW1lXSA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luUmVnaXN0cnk6IENhbm5vdCBpbmplY3QgdHdvIGRpZmZlcmVudCBldmVudCBwbHVnaW5zIHVzaW5nIHRoZSBzYW1lIG5hbWUsIGAlc2AuJywgcGx1Z2luTmFtZSkgOiB2b2lkIDA7XG4gICAgICBuYW1lc1RvUGx1Z2luc1twbHVnaW5OYW1lXSA9IHBsdWdpbk1vZHVsZTtcbiAgICAgIGlzT3JkZXJpbmdEaXJ0eSA9IHRydWU7XG4gICAgfVxuICB9XG4gIGlmIChpc09yZGVyaW5nRGlydHkpIHtcbiAgICByZWNvbXB1dGVQbHVnaW5PcmRlcmluZygpO1xuICB9XG59XG5cbi8qKlxuICogU2ltaWxhciB0byBpbnZhcmlhbnQgYnV0IG9ubHkgbG9ncyBhIHdhcm5pbmcgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byBsb2cgaXNzdWVzIGluIGRldmVsb3BtZW50IGVudmlyb25tZW50cyBpbiBjcml0aWNhbFxuICogcGF0aHMuIFJlbW92aW5nIHRoZSBsb2dnaW5nIGNvZGUgZm9yIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIHdpbGwga2VlcCB0aGVcbiAqIHNhbWUgbG9naWMgYW5kIGZvbGxvdyB0aGUgc2FtZSBjb2RlIHBhdGhzLlxuICovXG5cbnZhciB3YXJuaW5nV2l0aG91dFN0YWNrID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgd2FybmluZ1dpdGhvdXRTdGFjayA9IGZ1bmN0aW9uIChjb25kaXRpb24sIGZvcm1hdCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDIgPyBfbGVuIC0gMiA6IDApLCBfa2V5ID0gMjsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMl0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2B3YXJuaW5nV2l0aG91dFN0YWNrKGNvbmRpdGlvbiwgZm9ybWF0LCAuLi5hcmdzKWAgcmVxdWlyZXMgYSB3YXJuaW5nICcgKyAnbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgICBpZiAoYXJncy5sZW5ndGggPiA4KSB7XG4gICAgICAvLyBDaGVjayBiZWZvcmUgdGhlIGNvbmRpdGlvbiB0byBjYXRjaCB2aW9sYXRpb25zIGVhcmx5LlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YXJuaW5nV2l0aG91dFN0YWNrKCkgY3VycmVudGx5IHN1cHBvcnRzIGF0IG1vc3QgOCBhcmd1bWVudHMuJyk7XG4gICAgfVxuICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuICcnICsgaXRlbTtcbiAgICAgIH0pO1xuICAgICAgYXJnc1dpdGhGb3JtYXQudW5zaGlmdCgnV2FybmluZzogJyArIGZvcm1hdCk7XG5cbiAgICAgIC8vIFdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIHNwcmVhZCAob3IgLmFwcGx5KSBkaXJlY3RseSBiZWNhdXNlIGl0XG4gICAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlLmVycm9yLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyBmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG59XG5cbnZhciB3YXJuaW5nV2l0aG91dFN0YWNrJDEgPSB3YXJuaW5nV2l0aG91dFN0YWNrO1xuXG52YXIgZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZSA9IG51bGw7XG52YXIgZ2V0SW5zdGFuY2VGcm9tTm9kZSA9IG51bGw7XG52YXIgZ2V0Tm9kZUZyb21JbnN0YW5jZSA9IG51bGw7XG5cbmZ1bmN0aW9uIHNldENvbXBvbmVudFRyZWUoZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZUltcGwsIGdldEluc3RhbmNlRnJvbU5vZGVJbXBsLCBnZXROb2RlRnJvbUluc3RhbmNlSW1wbCkge1xuICBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZUltcGw7XG4gIGdldEluc3RhbmNlRnJvbU5vZGUgPSBnZXRJbnN0YW5jZUZyb21Ob2RlSW1wbDtcbiAgZ2V0Tm9kZUZyb21JbnN0YW5jZSA9IGdldE5vZGVGcm9tSW5zdGFuY2VJbXBsO1xuICB7XG4gICAgIShnZXROb2RlRnJvbUluc3RhbmNlICYmIGdldEluc3RhbmNlRnJvbU5vZGUpID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnRXZlbnRQbHVnaW5VdGlscy5zZXRDb21wb25lbnRUcmVlKC4uLik6IEluamVjdGVkICcgKyAnbW9kdWxlIGlzIG1pc3NpbmcgZ2V0Tm9kZUZyb21JbnN0YW5jZSBvciBnZXRJbnN0YW5jZUZyb21Ob2RlLicpIDogdm9pZCAwO1xuICB9XG59XG5cbnZhciB2YWxpZGF0ZUV2ZW50RGlzcGF0Y2hlcyA9IHZvaWQgMDtcbntcbiAgdmFsaWRhdGVFdmVudERpc3BhdGNoZXMgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICB2YXIgZGlzcGF0Y2hMaXN0ZW5lcnMgPSBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnM7XG4gICAgdmFyIGRpc3BhdGNoSW5zdGFuY2VzID0gZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzO1xuXG4gICAgdmFyIGxpc3RlbmVyc0lzQXJyID0gQXJyYXkuaXNBcnJheShkaXNwYXRjaExpc3RlbmVycyk7XG4gICAgdmFyIGxpc3RlbmVyc0xlbiA9IGxpc3RlbmVyc0lzQXJyID8gZGlzcGF0Y2hMaXN0ZW5lcnMubGVuZ3RoIDogZGlzcGF0Y2hMaXN0ZW5lcnMgPyAxIDogMDtcblxuICAgIHZhciBpbnN0YW5jZXNJc0FyciA9IEFycmF5LmlzQXJyYXkoZGlzcGF0Y2hJbnN0YW5jZXMpO1xuICAgIHZhciBpbnN0YW5jZXNMZW4gPSBpbnN0YW5jZXNJc0FyciA/IGRpc3BhdGNoSW5zdGFuY2VzLmxlbmd0aCA6IGRpc3BhdGNoSW5zdGFuY2VzID8gMSA6IDA7XG5cbiAgICAhKGluc3RhbmNlc0lzQXJyID09PSBsaXN0ZW5lcnNJc0FyciAmJiBpbnN0YW5jZXNMZW4gPT09IGxpc3RlbmVyc0xlbikgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdFdmVudFBsdWdpblV0aWxzOiBJbnZhbGlkIGBldmVudGAuJykgOiB2b2lkIDA7XG4gIH07XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggdGhlIGV2ZW50IHRvIHRoZSBsaXN0ZW5lci5cbiAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IFN5bnRoZXRpY0V2ZW50IHRvIGhhbmRsZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXIgQXBwbGljYXRpb24tbGV2ZWwgY2FsbGJhY2tcbiAqIEBwYXJhbSB7Kn0gaW5zdCBJbnRlcm5hbCBjb21wb25lbnQgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBsaXN0ZW5lciwgaW5zdCkge1xuICB2YXIgdHlwZSA9IGV2ZW50LnR5cGUgfHwgJ3Vua25vd24tZXZlbnQnO1xuICBldmVudC5jdXJyZW50VGFyZ2V0ID0gZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrQW5kQ2F0Y2hGaXJzdEVycm9yKHR5cGUsIGxpc3RlbmVyLCB1bmRlZmluZWQsIGV2ZW50KTtcbiAgZXZlbnQuY3VycmVudFRhcmdldCA9IG51bGw7XG59XG5cbi8qKlxuICogU3RhbmRhcmQvc2ltcGxlIGl0ZXJhdGlvbiB0aHJvdWdoIGFuIGV2ZW50J3MgY29sbGVjdGVkIGRpc3BhdGNoZXMuXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlcihldmVudCkge1xuICB2YXIgZGlzcGF0Y2hMaXN0ZW5lcnMgPSBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnM7XG4gIHZhciBkaXNwYXRjaEluc3RhbmNlcyA9IGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcztcbiAge1xuICAgIHZhbGlkYXRlRXZlbnREaXNwYXRjaGVzKGV2ZW50KTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShkaXNwYXRjaExpc3RlbmVycykpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vIExpc3RlbmVycyBhbmQgSW5zdGFuY2VzIGFyZSB0d28gcGFyYWxsZWwgYXJyYXlzIHRoYXQgYXJlIGFsd2F5cyBpbiBzeW5jLlxuICAgICAgZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBkaXNwYXRjaExpc3RlbmVyc1tpXSwgZGlzcGF0Y2hJbnN0YW5jZXNbaV0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChkaXNwYXRjaExpc3RlbmVycykge1xuICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgZGlzcGF0Y2hMaXN0ZW5lcnMsIGRpc3BhdGNoSW5zdGFuY2VzKTtcbiAgfVxuICBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMgPSBudWxsO1xuICBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMgPSBudWxsO1xufVxuXG4vKipcbiAqIEBzZWUgZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyU3RvcEF0VHJ1ZUltcGxcbiAqL1xuXG5cbi8qKlxuICogRXhlY3V0aW9uIG9mIGEgXCJkaXJlY3RcIiBkaXNwYXRjaCAtIHRoZXJlIG11c3QgYmUgYXQgbW9zdCBvbmUgZGlzcGF0Y2hcbiAqIGFjY3VtdWxhdGVkIG9uIHRoZSBldmVudCBvciBpdCBpcyBjb25zaWRlcmVkIGFuIGVycm9yLiBJdCBkb2Vzbid0IHJlYWxseSBtYWtlXG4gKiBzZW5zZSBmb3IgYW4gZXZlbnQgd2l0aCBtdWx0aXBsZSBkaXNwYXRjaGVzIChidWJibGVkKSB0byBrZWVwIHRyYWNrIG9mIHRoZVxuICogcmV0dXJuIHZhbHVlcyBhdCBlYWNoIGRpc3BhdGNoIGV4ZWN1dGlvbiwgYnV0IGl0IGRvZXMgdGVuZCB0byBtYWtlIHNlbnNlIHdoZW5cbiAqIGRlYWxpbmcgd2l0aCBcImRpcmVjdFwiIGRpc3BhdGNoZXMuXG4gKlxuICogQHJldHVybiB7Kn0gVGhlIHJldHVybiB2YWx1ZSBvZiBleGVjdXRpbmcgdGhlIHNpbmdsZSBkaXNwYXRjaC5cbiAqL1xuXG5cbi8qKlxuICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWZmIG51bWJlciBvZiBkaXNwYXRjaGVzIGFjY3VtdWxhdGVkIGlzIGdyZWF0ZXIgdGhhbiAwLlxuICovXG5cbi8qKlxuICogQWNjdW11bGF0ZXMgaXRlbXMgdGhhdCBtdXN0IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZCBpbnRvIHRoZSBmaXJzdCBvbmUuIFRoaXNcbiAqIGlzIHVzZWQgdG8gY29uc2VydmUgbWVtb3J5IGJ5IGF2b2lkaW5nIGFycmF5IGFsbG9jYXRpb25zLCBhbmQgdGh1cyBzYWNyaWZpY2VzXG4gKiBBUEkgY2xlYW5uZXNzLiBTaW5jZSBgY3VycmVudGAgY2FuIGJlIG51bGwgYmVmb3JlIGJlaW5nIHBhc3NlZCBpbiBhbmQgbm90XG4gKiBudWxsIGFmdGVyIHRoaXMgZnVuY3Rpb24sIG1ha2Ugc3VyZSB0byBhc3NpZ24gaXQgYmFjayB0byBgY3VycmVudGA6XG4gKlxuICogYGEgPSBhY2N1bXVsYXRlSW50byhhLCBiKTtgXG4gKlxuICogVGhpcyBBUEkgc2hvdWxkIGJlIHNwYXJpbmdseSB1c2VkLiBUcnkgYGFjY3VtdWxhdGVgIGZvciBzb21ldGhpbmcgY2xlYW5lci5cbiAqXG4gKiBAcmV0dXJuIHsqfGFycmF5PCo+fSBBbiBhY2N1bXVsYXRpb24gb2YgaXRlbXMuXG4gKi9cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUludG8oY3VycmVudCwgbmV4dCkge1xuICAhKG5leHQgIT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICdhY2N1bXVsYXRlSW50byguLi4pOiBBY2N1bXVsYXRlZCBpdGVtcyBtdXN0IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4nKSA6IHZvaWQgMDtcblxuICBpZiAoY3VycmVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cblxuICAvLyBCb3RoIGFyZSBub3QgZW1wdHkuIFdhcm5pbmc6IE5ldmVyIGNhbGwgeC5jb25jYXQoeSkgd2hlbiB5b3UgYXJlIG5vdFxuICAvLyBjZXJ0YWluIHRoYXQgeCBpcyBhbiBBcnJheSAoeCBjb3VsZCBiZSBhIHN0cmluZyB3aXRoIGNvbmNhdCBtZXRob2QpLlxuICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50KSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG5leHQpKSB7XG4gICAgICBjdXJyZW50LnB1c2guYXBwbHkoY3VycmVudCwgbmV4dCk7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgY3VycmVudC5wdXNoKG5leHQpO1xuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkobmV4dCkpIHtcbiAgICAvLyBBIGJpdCB0b28gZGFuZ2Vyb3VzIHRvIG11dGF0ZSBgbmV4dGAuXG4gICAgcmV0dXJuIFtjdXJyZW50XS5jb25jYXQobmV4dCk7XG4gIH1cblxuICByZXR1cm4gW2N1cnJlbnQsIG5leHRdO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7YXJyYXl9IGFyciBhbiBcImFjY3VtdWxhdGlvblwiIG9mIGl0ZW1zIHdoaWNoIGlzIGVpdGhlciBhbiBBcnJheSBvclxuICogYSBzaW5nbGUgaXRlbS4gVXNlZnVsIHdoZW4gcGFpcmVkIHdpdGggdGhlIGBhY2N1bXVsYXRlYCBtb2R1bGUuIFRoaXMgaXMgYVxuICogc2ltcGxlIHV0aWxpdHkgdGhhdCBhbGxvd3MgdXMgdG8gcmVhc29uIGFib3V0IGEgY29sbGVjdGlvbiBvZiBpdGVtcywgYnV0XG4gKiBoYW5kbGluZyB0aGUgY2FzZSB3aGVuIHRoZXJlIGlzIGV4YWN0bHkgb25lIGl0ZW0gKGFuZCB3ZSBkbyBub3QgbmVlZCB0b1xuICogYWxsb2NhdGUgYW4gYXJyYXkpLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2IgQ2FsbGJhY2sgaW52b2tlZCB3aXRoIGVhY2ggZWxlbWVudCBvciBhIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0gez99IFtzY29wZV0gU2NvcGUgdXNlZCBhcyBgdGhpc2AgaW4gYSBjYWxsYmFjay5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaEFjY3VtdWxhdGVkKGFyciwgY2IsIHNjb3BlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICBhcnIuZm9yRWFjaChjYiwgc2NvcGUpO1xuICB9IGVsc2UgaWYgKGFycikge1xuICAgIGNiLmNhbGwoc2NvcGUsIGFycik7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBxdWV1ZSBvZiBldmVudHMgdGhhdCBoYXZlIGFjY3VtdWxhdGVkIHRoZWlyIGRpc3BhdGNoZXMgYW5kIGFyZVxuICogd2FpdGluZyB0byBoYXZlIHRoZWlyIGRpc3BhdGNoZXMgZXhlY3V0ZWQuXG4gKi9cbnZhciBldmVudFF1ZXVlID0gbnVsbDtcblxuLyoqXG4gKiBEaXNwYXRjaGVzIGFuIGV2ZW50IGFuZCByZWxlYXNlcyBpdCBiYWNrIGludG8gdGhlIHBvb2wsIHVubGVzcyBwZXJzaXN0ZW50LlxuICpcbiAqIEBwYXJhbSB7P29iamVjdH0gZXZlbnQgU3ludGhldGljIGV2ZW50IHRvIGJlIGRpc3BhdGNoZWQuXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGlmIChldmVudCkge1xuICAgIGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlcihldmVudCk7XG5cbiAgICBpZiAoIWV2ZW50LmlzUGVyc2lzdGVudCgpKSB7XG4gICAgICBldmVudC5jb25zdHJ1Y3Rvci5yZWxlYXNlKGV2ZW50KTtcbiAgICB9XG4gIH1cbn07XG52YXIgZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlVG9wTGV2ZWwgPSBmdW5jdGlvbiAoZSkge1xuICByZXR1cm4gZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlKGUpO1xufTtcblxuZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZSh0YWcpIHtcbiAgcmV0dXJuIHRhZyA9PT0gJ2J1dHRvbicgfHwgdGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3NlbGVjdCcgfHwgdGFnID09PSAndGV4dGFyZWEnO1xufVxuXG5mdW5jdGlvbiBzaG91bGRQcmV2ZW50TW91c2VFdmVudChuYW1lLCB0eXBlLCBwcm9wcykge1xuICBzd2l0Y2ggKG5hbWUpIHtcbiAgICBjYXNlICdvbkNsaWNrJzpcbiAgICBjYXNlICdvbkNsaWNrQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Eb3VibGVDbGljayc6XG4gICAgY2FzZSAnb25Eb3VibGVDbGlja0NhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VEb3duJzpcbiAgICBjYXNlICdvbk1vdXNlRG93bkNhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VNb3ZlJzpcbiAgICBjYXNlICdvbk1vdXNlTW92ZUNhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VVcCc6XG4gICAgY2FzZSAnb25Nb3VzZVVwQ2FwdHVyZSc6XG4gICAgICByZXR1cm4gISEocHJvcHMuZGlzYWJsZWQgJiYgaXNJbnRlcmFjdGl2ZSh0eXBlKSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgYSB1bmlmaWVkIGludGVyZmFjZSBmb3IgZXZlbnQgcGx1Z2lucyB0byBiZSBpbnN0YWxsZWQgYW5kIGNvbmZpZ3VyZWQuXG4gKlxuICogRXZlbnQgcGx1Z2lucyBjYW4gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIGBleHRyYWN0RXZlbnRzYCB7ZnVuY3Rpb24oc3RyaW5nLCBET01FdmVudFRhcmdldCwgc3RyaW5nLCBvYmplY3QpOiAqfVxuICogICAgIFJlcXVpcmVkLiBXaGVuIGEgdG9wLWxldmVsIGV2ZW50IGlzIGZpcmVkLCB0aGlzIG1ldGhvZCBpcyBleHBlY3RlZCB0b1xuICogICAgIGV4dHJhY3Qgc3ludGhldGljIGV2ZW50cyB0aGF0IHdpbGwgaW4gdHVybiBiZSBxdWV1ZWQgYW5kIGRpc3BhdGNoZWQuXG4gKlxuICogICBgZXZlbnRUeXBlc2Age29iamVjdH1cbiAqICAgICBPcHRpb25hbCwgcGx1Z2lucyB0aGF0IGZpcmUgZXZlbnRzIG11c3QgcHVibGlzaCBhIG1hcHBpbmcgb2YgcmVnaXN0cmF0aW9uXG4gKiAgICAgbmFtZXMgdGhhdCBhcmUgdXNlZCB0byByZWdpc3RlciBsaXN0ZW5lcnMuIFZhbHVlcyBvZiB0aGlzIG1hcHBpbmcgbXVzdFxuICogICAgIGJlIG9iamVjdHMgdGhhdCBjb250YWluIGByZWdpc3RyYXRpb25OYW1lYCBvciBgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXNgLlxuICpcbiAqICAgYGV4ZWN1dGVEaXNwYXRjaGAge2Z1bmN0aW9uKG9iamVjdCwgZnVuY3Rpb24sIHN0cmluZyl9XG4gKiAgICAgT3B0aW9uYWwsIGFsbG93cyBwbHVnaW5zIHRvIG92ZXJyaWRlIGhvdyBhbiBldmVudCBnZXRzIGRpc3BhdGNoZWQuIEJ5XG4gKiAgICAgZGVmYXVsdCwgdGhlIGxpc3RlbmVyIGlzIHNpbXBseSBpbnZva2VkLlxuICpcbiAqIEVhY2ggcGx1Z2luIHRoYXQgaXMgaW5qZWN0ZWQgaW50byBgRXZlbnRzUGx1Z2luSHViYCBpcyBpbW1lZGlhdGVseSBvcGVyYWJsZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cblxuLyoqXG4gKiBNZXRob2RzIGZvciBpbmplY3RpbmcgZGVwZW5kZW5jaWVzLlxuICovXG52YXIgaW5qZWN0aW9uID0ge1xuICAvKipcbiAgICogQHBhcmFtIHthcnJheX0gSW5qZWN0ZWRFdmVudFBsdWdpbk9yZGVyXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGluamVjdEV2ZW50UGx1Z2luT3JkZXI6IGluamVjdEV2ZW50UGx1Z2luT3JkZXIsXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpbmplY3RlZE5hbWVzVG9QbHVnaW5zIE1hcCBmcm9tIG5hbWVzIHRvIHBsdWdpbiBtb2R1bGVzLlxuICAgKi9cbiAgaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lOiBpbmplY3RFdmVudFBsdWdpbnNCeU5hbWVcbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGluc3QgVGhlIGluc3RhbmNlLCB3aGljaCBpcyB0aGUgc291cmNlIG9mIGV2ZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb25OYW1lIE5hbWUgb2YgbGlzdGVuZXIgKGUuZy4gYG9uQ2xpY2tgKS5cbiAqIEByZXR1cm4gez9mdW5jdGlvbn0gVGhlIHN0b3JlZCBjYWxsYmFjay5cbiAqL1xuZnVuY3Rpb24gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkge1xuICB2YXIgbGlzdGVuZXIgPSB2b2lkIDA7XG5cbiAgLy8gVE9ETzogc2hvdWxkUHJldmVudE1vdXNlRXZlbnQgaXMgRE9NLXNwZWNpZmljIGFuZCBkZWZpbml0ZWx5IHNob3VsZCBub3RcbiAgLy8gbGl2ZSBoZXJlOyBuZWVkcyB0byBiZSBtb3ZlZCB0byBhIGJldHRlciBwbGFjZSBzb29uXG4gIHZhciBzdGF0ZU5vZGUgPSBpbnN0LnN0YXRlTm9kZTtcbiAgaWYgKCFzdGF0ZU5vZGUpIHtcbiAgICAvLyBXb3JrIGluIHByb2dyZXNzIChleDogb25sb2FkIGV2ZW50cyBpbiBpbmNyZW1lbnRhbCBtb2RlKS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgcHJvcHMgPSBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlKHN0YXRlTm9kZSk7XG4gIGlmICghcHJvcHMpIHtcbiAgICAvLyBXb3JrIGluIHByb2dyZXNzLlxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGxpc3RlbmVyID0gcHJvcHNbcmVnaXN0cmF0aW9uTmFtZV07XG4gIGlmIChzaG91bGRQcmV2ZW50TW91c2VFdmVudChyZWdpc3RyYXRpb25OYW1lLCBpbnN0LnR5cGUsIHByb3BzKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gICEoIWxpc3RlbmVyIHx8IHR5cGVvZiBsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCBgJXNgIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24sIGluc3RlYWQgZ290IGEgdmFsdWUgb2YgYCVzYCB0eXBlLicsIHJlZ2lzdHJhdGlvbk5hbWUsIHR5cGVvZiBsaXN0ZW5lcikgOiB2b2lkIDA7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cblxuLyoqXG4gKiBBbGxvd3MgcmVnaXN0ZXJlZCBwbHVnaW5zIGFuIG9wcG9ydHVuaXR5IHRvIGV4dHJhY3QgZXZlbnRzIGZyb20gdG9wLWxldmVsXG4gKiBuYXRpdmUgYnJvd3NlciBldmVudHMuXG4gKlxuICogQHJldHVybiB7Kn0gQW4gYWNjdW11bGF0aW9uIG9mIHN5bnRoZXRpYyBldmVudHMuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICB2YXIgZXZlbnRzID0gbnVsbDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gTm90IGV2ZXJ5IHBsdWdpbiBpbiB0aGUgb3JkZXJpbmcgbWF5IGJlIGxvYWRlZCBhdCBydW50aW1lLlxuICAgIHZhciBwb3NzaWJsZVBsdWdpbiA9IHBsdWdpbnNbaV07XG4gICAgaWYgKHBvc3NpYmxlUGx1Z2luKSB7XG4gICAgICB2YXIgZXh0cmFjdGVkRXZlbnRzID0gcG9zc2libGVQbHVnaW4uZXh0cmFjdEV2ZW50cyh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICBpZiAoZXh0cmFjdGVkRXZlbnRzKSB7XG4gICAgICAgIGV2ZW50cyA9IGFjY3VtdWxhdGVJbnRvKGV2ZW50cywgZXh0cmFjdGVkRXZlbnRzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV2ZW50cztcbn1cblxuZnVuY3Rpb24gcnVuRXZlbnRzSW5CYXRjaChldmVudHMpIHtcbiAgaWYgKGV2ZW50cyAhPT0gbnVsbCkge1xuICAgIGV2ZW50UXVldWUgPSBhY2N1bXVsYXRlSW50byhldmVudFF1ZXVlLCBldmVudHMpO1xuICB9XG5cbiAgLy8gU2V0IGBldmVudFF1ZXVlYCB0byBudWxsIGJlZm9yZSBwcm9jZXNzaW5nIGl0IHNvIHRoYXQgd2UgY2FuIHRlbGwgaWYgbW9yZVxuICAvLyBldmVudHMgZ2V0IGVucXVldWVkIHdoaWxlIHByb2Nlc3NpbmcuXG4gIHZhciBwcm9jZXNzaW5nRXZlbnRRdWV1ZSA9IGV2ZW50UXVldWU7XG4gIGV2ZW50UXVldWUgPSBudWxsO1xuXG4gIGlmICghcHJvY2Vzc2luZ0V2ZW50UXVldWUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3JFYWNoQWNjdW11bGF0ZWQocHJvY2Vzc2luZ0V2ZW50UXVldWUsIGV4ZWN1dGVEaXNwYXRjaGVzQW5kUmVsZWFzZVRvcExldmVsKTtcbiAgISFldmVudFF1ZXVlID8gaW52YXJpYW50KGZhbHNlLCAncHJvY2Vzc0V2ZW50UXVldWUoKTogQWRkaXRpb25hbCBldmVudHMgd2VyZSBlbnF1ZXVlZCB3aGlsZSBwcm9jZXNzaW5nIGFuIGV2ZW50IHF1ZXVlLiBTdXBwb3J0IGZvciB0aGlzIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQuJykgOiB2b2lkIDA7XG4gIC8vIFRoaXMgd291bGQgYmUgYSBnb29kIHRpbWUgdG8gcmV0aHJvdyBpZiBhbnkgb2YgdGhlIGV2ZW50IGhhbmRsZXJzIHRocmV3LlxuICByZXRocm93Q2F1Z2h0RXJyb3IoKTtcbn1cblxuZnVuY3Rpb24gcnVuRXh0cmFjdGVkRXZlbnRzSW5CYXRjaCh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICB2YXIgZXZlbnRzID0gZXh0cmFjdEV2ZW50cyh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIHJ1bkV2ZW50c0luQmF0Y2goZXZlbnRzKTtcbn1cblxudmFyIEZ1bmN0aW9uQ29tcG9uZW50ID0gMDtcbnZhciBDbGFzc0NvbXBvbmVudCA9IDE7XG52YXIgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudCA9IDI7IC8vIEJlZm9yZSB3ZSBrbm93IHdoZXRoZXIgaXQgaXMgZnVuY3Rpb24gb3IgY2xhc3NcbnZhciBIb3N0Um9vdCA9IDM7IC8vIFJvb3Qgb2YgYSBob3N0IHRyZWUuIENvdWxkIGJlIG5lc3RlZCBpbnNpZGUgYW5vdGhlciBub2RlLlxudmFyIEhvc3RQb3J0YWwgPSA0OyAvLyBBIHN1YnRyZWUuIENvdWxkIGJlIGFuIGVudHJ5IHBvaW50IHRvIGEgZGlmZmVyZW50IHJlbmRlcmVyLlxudmFyIEhvc3RDb21wb25lbnQgPSA1O1xudmFyIEhvc3RUZXh0ID0gNjtcbnZhciBGcmFnbWVudCA9IDc7XG52YXIgTW9kZSA9IDg7XG52YXIgQ29udGV4dENvbnN1bWVyID0gOTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSAxMDtcbnZhciBGb3J3YXJkUmVmID0gMTE7XG52YXIgUHJvZmlsZXIgPSAxMjtcbnZhciBTdXNwZW5zZUNvbXBvbmVudCA9IDEzO1xudmFyIE1lbW9Db21wb25lbnQgPSAxNDtcbnZhciBTaW1wbGVNZW1vQ29tcG9uZW50ID0gMTU7XG52YXIgTGF6eUNvbXBvbmVudCA9IDE2O1xudmFyIEluY29tcGxldGVDbGFzc0NvbXBvbmVudCA9IDE3O1xudmFyIERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudCA9IDE4O1xuXG52YXIgcmFuZG9tS2V5ID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7XG52YXIgaW50ZXJuYWxJbnN0YW5jZUtleSA9ICdfX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsRXZlbnRIYW5kbGVyc0tleSA9ICdfX3JlYWN0RXZlbnRIYW5kbGVycyQnICsgcmFuZG9tS2V5O1xuXG5mdW5jdGlvbiBwcmVjYWNoZUZpYmVyTm9kZShob3N0SW5zdCwgbm9kZSkge1xuICBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldID0gaG9zdEluc3Q7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBjbG9zZXN0IFJlYWN0RE9NQ29tcG9uZW50IG9yXG4gKiBSZWFjdERPTVRleHRDb21wb25lbnQgaW5zdGFuY2UgYW5jZXN0b3IuXG4gKi9cbmZ1bmN0aW9uIGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5vZGUpIHtcbiAgaWYgKG5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV0pIHtcbiAgICByZXR1cm4gbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcbiAgfVxuXG4gIHdoaWxlICghbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSkge1xuICAgIGlmIChub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRvcCBvZiB0aGUgdHJlZS4gVGhpcyBub2RlIG11c3Qgbm90IGJlIHBhcnQgb2YgYSBSZWFjdCB0cmVlIChvciBpc1xuICAgICAgLy8gdW5tb3VudGVkLCBwb3RlbnRpYWxseSkuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICB2YXIgaW5zdCA9IG5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG4gIGlmIChpbnN0LnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAvLyBJbiBGaWJlciwgdGhpcyB3aWxsIGFsd2F5cyBiZSB0aGUgZGVlcGVzdCByb290LlxuICAgIHJldHVybiBpbnN0O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnRcbiAqIGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBub2RlIHdhcyBub3QgcmVuZGVyZWQgYnkgdGhpcyBSZWFjdC5cbiAqL1xuZnVuY3Rpb24gZ2V0SW5zdGFuY2VGcm9tTm9kZSQxKG5vZGUpIHtcbiAgdmFyIGluc3QgPSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuICBpZiAoaW5zdCkge1xuICAgIGlmIChpbnN0LnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgIHJldHVybiBpbnN0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnQsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZ1xuICogRE9NIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIGdldE5vZGVGcm9tSW5zdGFuY2UkMShpbnN0KSB7XG4gIGlmIChpbnN0LnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAvLyBJbiBGaWJlciB0aGlzLCBpcyBqdXN0IHRoZSBzdGF0ZSBub2RlIHJpZ2h0IG5vdy4gV2UgYXNzdW1lIGl0IHdpbGwgYmVcbiAgICAvLyBhIGhvc3QgY29tcG9uZW50IG9yIGhvc3QgdGV4dC5cbiAgICByZXR1cm4gaW5zdC5zdGF0ZU5vZGU7XG4gIH1cblxuICAvLyBXaXRob3V0IHRoaXMgZmlyc3QgaW52YXJpYW50LCBwYXNzaW5nIGEgbm9uLURPTS1jb21wb25lbnQgdHJpZ2dlcnMgdGhlIG5leHRcbiAgLy8gaW52YXJpYW50IGZvciBhIG1pc3NpbmcgcGFyZW50LCB3aGljaCBpcyBzdXBlciBjb25mdXNpbmcuXG4gIGludmFyaWFudChmYWxzZSwgJ2dldE5vZGVGcm9tSW5zdGFuY2U6IEludmFsaWQgYXJndW1lbnQuJyk7XG59XG5cbmZ1bmN0aW9uIGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUkMShub2RlKSB7XG4gIHJldHVybiBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyc0tleV0gfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRmliZXJQcm9wcyhub2RlLCBwcm9wcykge1xuICBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyc0tleV0gPSBwcm9wcztcbn1cblxuZnVuY3Rpb24gZ2V0UGFyZW50KGluc3QpIHtcbiAgZG8ge1xuICAgIGluc3QgPSBpbnN0LnJldHVybjtcbiAgICAvLyBUT0RPOiBJZiB0aGlzIGlzIGEgSG9zdFJvb3Qgd2UgbWlnaHQgd2FudCB0byBiYWlsIG91dC5cbiAgICAvLyBUaGF0IGlzIGRlcGVuZGluZyBvbiBpZiB3ZSB3YW50IG5lc3RlZCBzdWJ0cmVlcyAobGF5ZXJzKSB0byBidWJibGVcbiAgICAvLyBldmVudHMgdG8gdGhlaXIgcGFyZW50LiBXZSBjb3VsZCBhbHNvIGdvIHRocm91Z2ggcGFyZW50Tm9kZSBvbiB0aGVcbiAgICAvLyBob3N0IG5vZGUgYnV0IHRoYXQgd291bGRuJ3Qgd29yayBmb3IgUmVhY3QgTmF0aXZlIGFuZCBkb2Vzbid0IGxldCB1c1xuICAgIC8vIGRvIHRoZSBwb3J0YWwgZmVhdHVyZS5cbiAgfSB3aGlsZSAoaW5zdCAmJiBpbnN0LnRhZyAhPT0gSG9zdENvbXBvbmVudCk7XG4gIGlmIChpbnN0KSB7XG4gICAgcmV0dXJuIGluc3Q7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBsb3dlc3QgY29tbW9uIGFuY2VzdG9yIG9mIEEgYW5kIEIsIG9yIG51bGwgaWYgdGhleSBhcmUgaW5cbiAqIGRpZmZlcmVudCB0cmVlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoaW5zdEEsIGluc3RCKSB7XG4gIHZhciBkZXB0aEEgPSAwO1xuICBmb3IgKHZhciB0ZW1wQSA9IGluc3RBOyB0ZW1wQTsgdGVtcEEgPSBnZXRQYXJlbnQodGVtcEEpKSB7XG4gICAgZGVwdGhBKys7XG4gIH1cbiAgdmFyIGRlcHRoQiA9IDA7XG4gIGZvciAodmFyIHRlbXBCID0gaW5zdEI7IHRlbXBCOyB0ZW1wQiA9IGdldFBhcmVudCh0ZW1wQikpIHtcbiAgICBkZXB0aEIrKztcbiAgfVxuXG4gIC8vIElmIEEgaXMgZGVlcGVyLCBjcmF3bCB1cC5cbiAgd2hpbGUgKGRlcHRoQSAtIGRlcHRoQiA+IDApIHtcbiAgICBpbnN0QSA9IGdldFBhcmVudChpbnN0QSk7XG4gICAgZGVwdGhBLS07XG4gIH1cblxuICAvLyBJZiBCIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG4gIHdoaWxlIChkZXB0aEIgLSBkZXB0aEEgPiAwKSB7XG4gICAgaW5zdEIgPSBnZXRQYXJlbnQoaW5zdEIpO1xuICAgIGRlcHRoQi0tO1xuICB9XG5cbiAgLy8gV2FsayBpbiBsb2Nrc3RlcCB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guXG4gIHZhciBkZXB0aCA9IGRlcHRoQTtcbiAgd2hpbGUgKGRlcHRoLS0pIHtcbiAgICBpZiAoaW5zdEEgPT09IGluc3RCIHx8IGluc3RBID09PSBpbnN0Qi5hbHRlcm5hdGUpIHtcbiAgICAgIHJldHVybiBpbnN0QTtcbiAgICB9XG4gICAgaW5zdEEgPSBnZXRQYXJlbnQoaW5zdEEpO1xuICAgIGluc3RCID0gZ2V0UGFyZW50KGluc3RCKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gaWYgQSBpcyBhbiBhbmNlc3RvciBvZiBCLlxuICovXG5cblxuLyoqXG4gKiBSZXR1cm4gdGhlIHBhcmVudCBpbnN0YW5jZSBvZiB0aGUgcGFzc2VkLWluIGluc3RhbmNlLlxuICovXG5cblxuLyoqXG4gKiBTaW11bGF0ZXMgdGhlIHRyYXZlcnNhbCBvZiBhIHR3by1waGFzZSwgY2FwdHVyZS9idWJibGUgZXZlbnQgZGlzcGF0Y2guXG4gKi9cbmZ1bmN0aW9uIHRyYXZlcnNlVHdvUGhhc2UoaW5zdCwgZm4sIGFyZykge1xuICB2YXIgcGF0aCA9IFtdO1xuICB3aGlsZSAoaW5zdCkge1xuICAgIHBhdGgucHVzaChpbnN0KTtcbiAgICBpbnN0ID0gZ2V0UGFyZW50KGluc3QpO1xuICB9XG4gIHZhciBpID0gdm9pZCAwO1xuICBmb3IgKGkgPSBwYXRoLmxlbmd0aDsgaS0tID4gMDspIHtcbiAgICBmbihwYXRoW2ldLCAnY2FwdHVyZWQnLCBhcmcpO1xuICB9XG4gIGZvciAoaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgZm4ocGF0aFtpXSwgJ2J1YmJsZWQnLCBhcmcpO1xuICB9XG59XG5cbi8qKlxuICogVHJhdmVyc2VzIHRoZSBJRCBoaWVyYXJjaHkgYW5kIGludm9rZXMgdGhlIHN1cHBsaWVkIGBjYmAgb24gYW55IElEcyB0aGF0XG4gKiBzaG91bGQgd291bGQgcmVjZWl2ZSBhIGBtb3VzZUVudGVyYCBvciBgbW91c2VMZWF2ZWAgZXZlbnQuXG4gKlxuICogRG9lcyBub3QgaW52b2tlIHRoZSBjYWxsYmFjayBvbiB0aGUgbmVhcmVzdCBjb21tb24gYW5jZXN0b3IgYmVjYXVzZSBub3RoaW5nXG4gKiBcImVudGVyZWRcIiBvciBcImxlZnRcIiB0aGF0IGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIHRyYXZlcnNlRW50ZXJMZWF2ZShmcm9tLCB0bywgZm4sIGFyZ0Zyb20sIGFyZ1RvKSB7XG4gIHZhciBjb21tb24gPSBmcm9tICYmIHRvID8gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoZnJvbSwgdG8pIDogbnVsbDtcbiAgdmFyIHBhdGhGcm9tID0gW107XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKCFmcm9tKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKGZyb20gPT09IGNvbW1vbikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBhbHRlcm5hdGUgPSBmcm9tLmFsdGVybmF0ZTtcbiAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZSA9PT0gY29tbW9uKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcGF0aEZyb20ucHVzaChmcm9tKTtcbiAgICBmcm9tID0gZ2V0UGFyZW50KGZyb20pO1xuICB9XG4gIHZhciBwYXRoVG8gPSBbXTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoIXRvKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKHRvID09PSBjb21tb24pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgX2FsdGVybmF0ZSA9IHRvLmFsdGVybmF0ZTtcbiAgICBpZiAoX2FsdGVybmF0ZSAhPT0gbnVsbCAmJiBfYWx0ZXJuYXRlID09PSBjb21tb24pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBwYXRoVG8ucHVzaCh0byk7XG4gICAgdG8gPSBnZXRQYXJlbnQodG8pO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aEZyb20ubGVuZ3RoOyBpKyspIHtcbiAgICBmbihwYXRoRnJvbVtpXSwgJ2J1YmJsZWQnLCBhcmdGcm9tKTtcbiAgfVxuICBmb3IgKHZhciBfaSA9IHBhdGhUby5sZW5ndGg7IF9pLS0gPiAwOykge1xuICAgIGZuKHBhdGhUb1tfaV0sICdjYXB0dXJlZCcsIGFyZ1RvKTtcbiAgfVxufVxuXG4vKipcbiAqIFNvbWUgZXZlbnQgdHlwZXMgaGF2ZSBhIG5vdGlvbiBvZiBkaWZmZXJlbnQgcmVnaXN0cmF0aW9uIG5hbWVzIGZvciBkaWZmZXJlbnRcbiAqIFwicGhhc2VzXCIgb2YgcHJvcGFnYXRpb24uIFRoaXMgZmluZHMgbGlzdGVuZXJzIGJ5IGEgZ2l2ZW4gcGhhc2UuXG4gKi9cbmZ1bmN0aW9uIGxpc3RlbmVyQXRQaGFzZShpbnN0LCBldmVudCwgcHJvcGFnYXRpb25QaGFzZSkge1xuICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IGV2ZW50LmRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzW3Byb3BhZ2F0aW9uUGhhc2VdO1xuICByZXR1cm4gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSk7XG59XG5cbi8qKlxuICogQSBzbWFsbCBzZXQgb2YgcHJvcGFnYXRpb24gcGF0dGVybnMsIGVhY2ggb2Ygd2hpY2ggd2lsbCBhY2NlcHQgYSBzbWFsbCBhbW91bnRcbiAqIG9mIGluZm9ybWF0aW9uLCBhbmQgZ2VuZXJhdGUgYSBzZXQgb2YgXCJkaXNwYXRjaCByZWFkeSBldmVudCBvYmplY3RzXCIgLSB3aGljaFxuICogYXJlIHNldHMgb2YgZXZlbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYW5ub3RhdGVkIHdpdGggYSBzZXQgb2YgZGlzcGF0Y2hlZFxuICogbGlzdGVuZXIgZnVuY3Rpb25zL2lkcy4gVGhlIEFQSSBpcyBkZXNpZ25lZCB0aGlzIHdheSB0byBkaXNjb3VyYWdlIHRoZXNlXG4gKiBwcm9wYWdhdGlvbiBzdHJhdGVnaWVzIGZyb20gYWN0dWFsbHkgZXhlY3V0aW5nIHRoZSBkaXNwYXRjaGVzLCBzaW5jZSB3ZVxuICogYWx3YXlzIHdhbnQgdG8gY29sbGVjdCB0aGUgZW50aXJlIHNldCBvZiBkaXNwYXRjaGVzIGJlZm9yZSBleGVjdXRpbmcgZXZlbiBhXG4gKiBzaW5nbGUgb25lLlxuICovXG5cbi8qKlxuICogVGFncyBhIGBTeW50aGV0aWNFdmVudGAgd2l0aCBkaXNwYXRjaGVkIGxpc3RlbmVycy4gQ3JlYXRpbmcgdGhpcyBmdW5jdGlvblxuICogaGVyZSwgYWxsb3dzIHVzIHRvIG5vdCBoYXZlIHRvIGJpbmQgb3IgY3JlYXRlIGZ1bmN0aW9ucyBmb3IgZWFjaCBldmVudC5cbiAqIE11dGF0aW5nIHRoZSBldmVudCdzIG1lbWJlcnMgYWxsb3dzIHVzIHRvIG5vdCBoYXZlIHRvIGNyZWF0ZSBhIHdyYXBwaW5nXG4gKiBcImRpc3BhdGNoXCIgb2JqZWN0IHRoYXQgcGFpcnMgdGhlIGV2ZW50IHdpdGggdGhlIGxpc3RlbmVyLlxuICovXG5mdW5jdGlvbiBhY2N1bXVsYXRlRGlyZWN0aW9uYWxEaXNwYXRjaGVzKGluc3QsIHBoYXNlLCBldmVudCkge1xuICB7XG4gICAgIWluc3QgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdEaXNwYXRjaGluZyBpbnN0IG11c3Qgbm90IGJlIG51bGwnKSA6IHZvaWQgMDtcbiAgfVxuICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lckF0UGhhc2UoaW5zdCwgZXZlbnQsIHBoYXNlKTtcbiAgaWYgKGxpc3RlbmVyKSB7XG4gICAgZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzID0gYWNjdW11bGF0ZUludG8oZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzLCBsaXN0ZW5lcik7XG4gICAgZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzID0gYWNjdW11bGF0ZUludG8oZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzLCBpbnN0KTtcbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3QgZGlzcGF0Y2hlcyAobXVzdCBiZSBlbnRpcmVseSBjb2xsZWN0ZWQgYmVmb3JlIGRpc3BhdGNoaW5nIC0gc2VlIHVuaXRcbiAqIHRlc3RzKS4gTGF6aWx5IGFsbG9jYXRlIHRoZSBhcnJheSB0byBjb25zZXJ2ZSBtZW1vcnkuICBXZSBtdXN0IGxvb3AgdGhyb3VnaFxuICogZWFjaCBldmVudCBhbmQgcGVyZm9ybSB0aGUgdHJhdmVyc2FsIGZvciBlYWNoIG9uZS4gV2UgY2Fubm90IHBlcmZvcm0gYVxuICogc2luZ2xlIHRyYXZlcnNhbCBmb3IgdGhlIGVudGlyZSBjb2xsZWN0aW9uIG9mIGV2ZW50cyBiZWNhdXNlIGVhY2ggZXZlbnQgbWF5XG4gKiBoYXZlIGEgZGlmZmVyZW50IHRhcmdldC5cbiAqL1xuZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NpbmdsZShldmVudCkge1xuICBpZiAoZXZlbnQgJiYgZXZlbnQuZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMpIHtcbiAgICB0cmF2ZXJzZVR3b1BoYXNlKGV2ZW50Ll90YXJnZXRJbnN0LCBhY2N1bXVsYXRlRGlyZWN0aW9uYWxEaXNwYXRjaGVzLCBldmVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBY2N1bXVsYXRlcyB3aXRob3V0IHJlZ2FyZCB0byBkaXJlY3Rpb24sIGRvZXMgbm90IGxvb2sgZm9yIHBoYXNlZFxuICogcmVnaXN0cmF0aW9uIG5hbWVzLiBTYW1lIGFzIGBhY2N1bXVsYXRlRGlyZWN0RGlzcGF0Y2hlc1NpbmdsZWAgYnV0IHdpdGhvdXRcbiAqIHJlcXVpcmluZyB0aGF0IHRoZSBgZGlzcGF0Y2hNYXJrZXJgIGJlIHRoZSBzYW1lIGFzIHRoZSBkaXNwYXRjaGVkIElELlxuICovXG5mdW5jdGlvbiBhY2N1bXVsYXRlRGlzcGF0Y2hlcyhpbnN0LCBpZ25vcmVkRGlyZWN0aW9uLCBldmVudCkge1xuICBpZiAoaW5zdCAmJiBldmVudCAmJiBldmVudC5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lKSB7XG4gICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUgPSBldmVudC5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lO1xuICAgIHZhciBsaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzID0gYWNjdW11bGF0ZUludG8oZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzLCBsaXN0ZW5lcik7XG4gICAgICBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMgPSBhY2N1bXVsYXRlSW50byhldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMsIGluc3QpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFjY3VtdWxhdGVzIGRpc3BhdGNoZXMgb24gYW4gYFN5bnRoZXRpY0V2ZW50YCwgYnV0IG9ubHkgZm9yIHRoZVxuICogYGRpc3BhdGNoTWFya2VyYC5cbiAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVzU2luZ2xlKGV2ZW50KSB7XG4gIGlmIChldmVudCAmJiBldmVudC5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lKSB7XG4gICAgYWNjdW11bGF0ZURpc3BhdGNoZXMoZXZlbnQuX3RhcmdldEluc3QsIG51bGwsIGV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50cykge1xuICBmb3JFYWNoQWNjdW11bGF0ZWQoZXZlbnRzLCBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2luZ2xlKTtcbn1cblxuXG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVFbnRlckxlYXZlRGlzcGF0Y2hlcyhsZWF2ZSwgZW50ZXIsIGZyb20sIHRvKSB7XG4gIHRyYXZlcnNlRW50ZXJMZWF2ZShmcm9tLCB0bywgYWNjdW11bGF0ZURpc3BhdGNoZXMsIGxlYXZlLCBlbnRlcik7XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVzKGV2ZW50cykge1xuICBmb3JFYWNoQWNjdW11bGF0ZWQoZXZlbnRzLCBhY2N1bXVsYXRlRGlyZWN0RGlzcGF0Y2hlc1NpbmdsZSk7XG59XG5cbnZhciBjYW5Vc2VET00gPSAhISh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuZG9jdW1lbnQgJiYgd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXG4vLyBEbyBub3QgdXNlcyB0aGUgYmVsb3cgdHdvIG1ldGhvZHMgZGlyZWN0bHkhXG4vLyBJbnN0ZWFkIHVzZSBjb25zdGFudHMgZXhwb3J0ZWQgZnJvbSBET01Ub3BMZXZlbEV2ZW50VHlwZXMgaW4gUmVhY3RET00uXG4vLyAoSXQgaXMgdGhlIG9ubHkgbW9kdWxlIHRoYXQgaXMgYWxsb3dlZCB0byBhY2Nlc3MgdGhlc2UgbWV0aG9kcy4pXG5cbmZ1bmN0aW9uIHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSh0b3BMZXZlbFR5cGUpIHtcbiAgcmV0dXJuIHRvcExldmVsVHlwZTtcbn1cblxuZnVuY3Rpb24gdW5zYWZlQ2FzdERPTVRvcExldmVsVHlwZVRvU3RyaW5nKHRvcExldmVsVHlwZSkge1xuICByZXR1cm4gdG9wTGV2ZWxUeXBlO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgbWFwcGluZyBvZiBzdGFuZGFyZCB2ZW5kb3IgcHJlZml4ZXMgdXNpbmcgdGhlIGRlZmluZWQgc3R5bGUgcHJvcGVydHkgYW5kIGV2ZW50IG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0eWxlUHJvcFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuZnVuY3Rpb24gbWFrZVByZWZpeE1hcChzdHlsZVByb3AsIGV2ZW50TmFtZSkge1xuICB2YXIgcHJlZml4ZXMgPSB7fTtcblxuICBwcmVmaXhlc1tzdHlsZVByb3AudG9Mb3dlckNhc2UoKV0gPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcHJlZml4ZXNbJ1dlYmtpdCcgKyBzdHlsZVByb3BdID0gJ3dlYmtpdCcgKyBldmVudE5hbWU7XG4gIHByZWZpeGVzWydNb3onICsgc3R5bGVQcm9wXSA9ICdtb3onICsgZXZlbnROYW1lO1xuXG4gIHJldHVybiBwcmVmaXhlcztcbn1cblxuLyoqXG4gKiBBIGxpc3Qgb2YgZXZlbnQgbmFtZXMgdG8gYSBjb25maWd1cmFibGUgbGlzdCBvZiB2ZW5kb3IgcHJlZml4ZXMuXG4gKi9cbnZhciB2ZW5kb3JQcmVmaXhlcyA9IHtcbiAgYW5pbWF0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uRW5kJyksXG4gIGFuaW1hdGlvbml0ZXJhdGlvbjogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkl0ZXJhdGlvbicpLFxuICBhbmltYXRpb25zdGFydDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvblN0YXJ0JyksXG4gIHRyYW5zaXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ1RyYW5zaXRpb24nLCAnVHJhbnNpdGlvbkVuZCcpXG59O1xuXG4vKipcbiAqIEV2ZW50IG5hbWVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gZGV0ZWN0ZWQgYW5kIHByZWZpeGVkIChpZiBhcHBsaWNhYmxlKS5cbiAqL1xudmFyIHByZWZpeGVkRXZlbnROYW1lcyA9IHt9O1xuXG4vKipcbiAqIEVsZW1lbnQgdG8gY2hlY2sgZm9yIHByZWZpeGVzIG9uLlxuICovXG52YXIgc3R5bGUgPSB7fTtcblxuLyoqXG4gKiBCb290c3RyYXAgaWYgYSBET00gZXhpc3RzLlxuICovXG5pZiAoY2FuVXNlRE9NKSB7XG4gIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGU7XG5cbiAgLy8gT24gc29tZSBwbGF0Zm9ybXMsIGluIHBhcnRpY3VsYXIgc29tZSByZWxlYXNlcyBvZiBBbmRyb2lkIDQueCxcbiAgLy8gdGhlIHVuLXByZWZpeGVkIFwiYW5pbWF0aW9uXCIgYW5kIFwidHJhbnNpdGlvblwiIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgb24gdGhlXG4gIC8vIHN0eWxlIG9iamVjdCBidXQgdGhlIGV2ZW50cyB0aGF0IGZpcmUgd2lsbCBzdGlsbCBiZSBwcmVmaXhlZCwgc28gd2UgbmVlZFxuICAvLyB0byBjaGVjayBpZiB0aGUgdW4tcHJlZml4ZWQgZXZlbnRzIGFyZSB1c2FibGUsIGFuZCBpZiBub3QgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgbWFwLlxuICBpZiAoISgnQW5pbWF0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uO1xuICB9XG5cbiAgLy8gU2FtZSBhcyBhYm92ZVxuICBpZiAoISgnVHJhbnNpdGlvbkV2ZW50JyBpbiB3aW5kb3cpKSB7XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEF0dGVtcHRzIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCB2ZW5kb3IgcHJlZml4ZWQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShldmVudE5hbWUpIHtcbiAgaWYgKHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdO1xuICB9IGVsc2UgaWYgKCF2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZTtcbiAgfVxuXG4gIHZhciBwcmVmaXhNYXAgPSB2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdO1xuXG4gIGZvciAodmFyIHN0eWxlUHJvcCBpbiBwcmVmaXhNYXApIHtcbiAgICBpZiAocHJlZml4TWFwLmhhc093blByb3BlcnR5KHN0eWxlUHJvcCkgJiYgc3R5bGVQcm9wIGluIHN0eWxlKSB7XG4gICAgICByZXR1cm4gcHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV0gPSBwcmVmaXhNYXBbc3R5bGVQcm9wXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXZlbnROYW1lO1xufVxuXG4vKipcbiAqIFRvIGlkZW50aWZ5IHRvcCBsZXZlbCBldmVudHMgaW4gUmVhY3RET00sIHdlIHVzZSBjb25zdGFudHMgZGVmaW5lZCBieSB0aGlzXG4gKiBtb2R1bGUuIFRoaXMgaXMgdGhlIG9ubHkgbW9kdWxlIHRoYXQgdXNlcyB0aGUgdW5zYWZlKiBtZXRob2RzIHRvIGV4cHJlc3NcbiAqIHRoYXQgdGhlIGNvbnN0YW50cyBhY3R1YWxseSBjb3JyZXNwb25kIHRvIHRoZSBicm93c2VyIGV2ZW50IG5hbWVzLiBUaGlzIGxldHNcbiAqIHVzIHNhdmUgc29tZSBidW5kbGUgc2l6ZSBieSBhdm9pZGluZyBhIHRvcCBsZXZlbCB0eXBlIC0+IGV2ZW50IG5hbWUgbWFwLlxuICogVGhlIHJlc3Qgb2YgUmVhY3RET00gY29kZSBzaG91bGQgaW1wb3J0IHRvcCBsZXZlbCB0eXBlcyBmcm9tIHRoaXMgZmlsZS5cbiAqL1xudmFyIFRPUF9BQk9SVCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnYWJvcnQnKTtcbnZhciBUT1BfQU5JTUFUSU9OX0VORCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZShnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uZW5kJykpO1xudmFyIFRPUF9BTklNQVRJT05fSVRFUkFUSU9OID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25pdGVyYXRpb24nKSk7XG52YXIgVE9QX0FOSU1BVElPTl9TVEFSVCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZShnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uc3RhcnQnKSk7XG52YXIgVE9QX0JMVVIgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2JsdXInKTtcbnZhciBUT1BfQ0FOX1BMQVkgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2NhbnBsYXknKTtcbnZhciBUT1BfQ0FOX1BMQVlfVEhST1VHSCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnY2FucGxheXRocm91Z2gnKTtcbnZhciBUT1BfQ0FOQ0VMID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdjYW5jZWwnKTtcbnZhciBUT1BfQ0hBTkdFID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdjaGFuZ2UnKTtcbnZhciBUT1BfQ0xJQ0sgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2NsaWNrJyk7XG52YXIgVE9QX0NMT1NFID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdjbG9zZScpO1xudmFyIFRPUF9DT01QT1NJVElPTl9FTkQgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2NvbXBvc2l0aW9uZW5kJyk7XG52YXIgVE9QX0NPTVBPU0lUSU9OX1NUQVJUID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdjb21wb3NpdGlvbnN0YXJ0Jyk7XG52YXIgVE9QX0NPTVBPU0lUSU9OX1VQREFURSA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnY29tcG9zaXRpb251cGRhdGUnKTtcbnZhciBUT1BfQ09OVEVYVF9NRU5VID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdjb250ZXh0bWVudScpO1xudmFyIFRPUF9DT1BZID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdjb3B5Jyk7XG52YXIgVE9QX0NVVCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnY3V0Jyk7XG52YXIgVE9QX0RPVUJMRV9DTElDSyA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnZGJsY2xpY2snKTtcbnZhciBUT1BfQVVYX0NMSUNLID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdhdXhjbGljaycpO1xudmFyIFRPUF9EUkFHID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdkcmFnJyk7XG52YXIgVE9QX0RSQUdfRU5EID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdkcmFnZW5kJyk7XG52YXIgVE9QX0RSQUdfRU5URVIgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2RyYWdlbnRlcicpO1xudmFyIFRPUF9EUkFHX0VYSVQgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2RyYWdleGl0Jyk7XG52YXIgVE9QX0RSQUdfTEVBVkUgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2RyYWdsZWF2ZScpO1xudmFyIFRPUF9EUkFHX09WRVIgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2RyYWdvdmVyJyk7XG52YXIgVE9QX0RSQUdfU1RBUlQgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2RyYWdzdGFydCcpO1xudmFyIFRPUF9EUk9QID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdkcm9wJyk7XG52YXIgVE9QX0RVUkFUSU9OX0NIQU5HRSA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnZHVyYXRpb25jaGFuZ2UnKTtcbnZhciBUT1BfRU1QVElFRCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnZW1wdGllZCcpO1xudmFyIFRPUF9FTkNSWVBURUQgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2VuY3J5cHRlZCcpO1xudmFyIFRPUF9FTkRFRCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnZW5kZWQnKTtcbnZhciBUT1BfRVJST1IgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2Vycm9yJyk7XG52YXIgVE9QX0ZPQ1VTID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdmb2N1cycpO1xudmFyIFRPUF9HT1RfUE9JTlRFUl9DQVBUVVJFID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdnb3Rwb2ludGVyY2FwdHVyZScpO1xudmFyIFRPUF9JTlBVVCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnaW5wdXQnKTtcbnZhciBUT1BfSU5WQUxJRCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnaW52YWxpZCcpO1xudmFyIFRPUF9LRVlfRE9XTiA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgna2V5ZG93bicpO1xudmFyIFRPUF9LRVlfUFJFU1MgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2tleXByZXNzJyk7XG52YXIgVE9QX0tFWV9VUCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgna2V5dXAnKTtcbnZhciBUT1BfTE9BRCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnbG9hZCcpO1xudmFyIFRPUF9MT0FEX1NUQVJUID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdsb2Fkc3RhcnQnKTtcbnZhciBUT1BfTE9BREVEX0RBVEEgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ2xvYWRlZGRhdGEnKTtcbnZhciBUT1BfTE9BREVEX01FVEFEQVRBID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdsb2FkZWRtZXRhZGF0YScpO1xudmFyIFRPUF9MT1NUX1BPSU5URVJfQ0FQVFVSRSA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnbG9zdHBvaW50ZXJjYXB0dXJlJyk7XG52YXIgVE9QX01PVVNFX0RPV04gPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ21vdXNlZG93bicpO1xudmFyIFRPUF9NT1VTRV9NT1ZFID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdtb3VzZW1vdmUnKTtcbnZhciBUT1BfTU9VU0VfT1VUID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdtb3VzZW91dCcpO1xudmFyIFRPUF9NT1VTRV9PVkVSID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdtb3VzZW92ZXInKTtcbnZhciBUT1BfTU9VU0VfVVAgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ21vdXNldXAnKTtcbnZhciBUT1BfUEFTVEUgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3Bhc3RlJyk7XG52YXIgVE9QX1BBVVNFID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdwYXVzZScpO1xudmFyIFRPUF9QTEFZID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdwbGF5Jyk7XG52YXIgVE9QX1BMQVlJTkcgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3BsYXlpbmcnKTtcbnZhciBUT1BfUE9JTlRFUl9DQU5DRUwgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3BvaW50ZXJjYW5jZWwnKTtcbnZhciBUT1BfUE9JTlRFUl9ET1dOID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdwb2ludGVyZG93bicpO1xuXG5cbnZhciBUT1BfUE9JTlRFUl9NT1ZFID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdwb2ludGVybW92ZScpO1xudmFyIFRPUF9QT0lOVEVSX09VVCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgncG9pbnRlcm91dCcpO1xudmFyIFRPUF9QT0lOVEVSX09WRVIgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3BvaW50ZXJvdmVyJyk7XG52YXIgVE9QX1BPSU5URVJfVVAgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3BvaW50ZXJ1cCcpO1xudmFyIFRPUF9QUk9HUkVTUyA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgncHJvZ3Jlc3MnKTtcbnZhciBUT1BfUkFURV9DSEFOR0UgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3JhdGVjaGFuZ2UnKTtcbnZhciBUT1BfUkVTRVQgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3Jlc2V0Jyk7XG52YXIgVE9QX1NDUk9MTCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnc2Nyb2xsJyk7XG52YXIgVE9QX1NFRUtFRCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnc2Vla2VkJyk7XG52YXIgVE9QX1NFRUtJTkcgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3NlZWtpbmcnKTtcbnZhciBUT1BfU0VMRUNUSU9OX0NIQU5HRSA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnc2VsZWN0aW9uY2hhbmdlJyk7XG52YXIgVE9QX1NUQUxMRUQgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3N0YWxsZWQnKTtcbnZhciBUT1BfU1VCTUlUID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCdzdWJtaXQnKTtcbnZhciBUT1BfU1VTUEVORCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgnc3VzcGVuZCcpO1xudmFyIFRPUF9URVhUX0lOUFVUID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCd0ZXh0SW5wdXQnKTtcbnZhciBUT1BfVElNRV9VUERBVEUgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3RpbWV1cGRhdGUnKTtcbnZhciBUT1BfVE9HR0xFID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCd0b2dnbGUnKTtcbnZhciBUT1BfVE9VQ0hfQ0FOQ0VMID0gdW5zYWZlQ2FzdFN0cmluZ1RvRE9NVG9wTGV2ZWxUeXBlKCd0b3VjaGNhbmNlbCcpO1xudmFyIFRPUF9UT1VDSF9FTkQgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3RvdWNoZW5kJyk7XG52YXIgVE9QX1RPVUNIX01PVkUgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3RvdWNobW92ZScpO1xudmFyIFRPUF9UT1VDSF9TVEFSVCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgndG91Y2hzdGFydCcpO1xudmFyIFRPUF9UUkFOU0lUSU9OX0VORCA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZShnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgndHJhbnNpdGlvbmVuZCcpKTtcbnZhciBUT1BfVk9MVU1FX0NIQU5HRSA9IHVuc2FmZUNhc3RTdHJpbmdUb0RPTVRvcExldmVsVHlwZSgndm9sdW1lY2hhbmdlJyk7XG52YXIgVE9QX1dBSVRJTkcgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3dhaXRpbmcnKTtcbnZhciBUT1BfV0hFRUwgPSB1bnNhZmVDYXN0U3RyaW5nVG9ET01Ub3BMZXZlbFR5cGUoJ3doZWVsJyk7XG5cbi8vIExpc3Qgb2YgZXZlbnRzIHRoYXQgbmVlZCB0byBiZSBpbmRpdmlkdWFsbHkgYXR0YWNoZWQgdG8gbWVkaWEgZWxlbWVudHMuXG4vLyBOb3RlIHRoYXQgZXZlbnRzIGluIHRoaXMgbGlzdCB3aWxsICpub3QqIGJlIGxpc3RlbmVkIHRvIGF0IHRoZSB0b3AgbGV2ZWxcbi8vIHVubGVzcyB0aGV5J3JlIGV4cGxpY2l0bHkgd2hpdGVsaXN0ZWQgaW4gYFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5saXN0ZW5Ub2AuXG52YXIgbWVkaWFFdmVudFR5cGVzID0gW1RPUF9BQk9SVCwgVE9QX0NBTl9QTEFZLCBUT1BfQ0FOX1BMQVlfVEhST1VHSCwgVE9QX0RVUkFUSU9OX0NIQU5HRSwgVE9QX0VNUFRJRUQsIFRPUF9FTkNSWVBURUQsIFRPUF9FTkRFRCwgVE9QX0VSUk9SLCBUT1BfTE9BREVEX0RBVEEsIFRPUF9MT0FERURfTUVUQURBVEEsIFRPUF9MT0FEX1NUQVJULCBUT1BfUEFVU0UsIFRPUF9QTEFZLCBUT1BfUExBWUlORywgVE9QX1BST0dSRVNTLCBUT1BfUkFURV9DSEFOR0UsIFRPUF9TRUVLRUQsIFRPUF9TRUVLSU5HLCBUT1BfU1RBTExFRCwgVE9QX1NVU1BFTkQsIFRPUF9USU1FX1VQREFURSwgVE9QX1ZPTFVNRV9DSEFOR0UsIFRPUF9XQUlUSU5HXTtcblxuZnVuY3Rpb24gZ2V0UmF3RXZlbnROYW1lKHRvcExldmVsVHlwZSkge1xuICByZXR1cm4gdW5zYWZlQ2FzdERPTVRvcExldmVsVHlwZVRvU3RyaW5nKHRvcExldmVsVHlwZSk7XG59XG5cbi8qKlxuICogVGhlc2UgdmFyaWFibGVzIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHRleHQgY29udGVudCBvZiBhIHRhcmdldCBub2RlLFxuICogYWxsb3dpbmcgY29tcGFyaXNvbiBvZiBjb250ZW50IGJlZm9yZSBhbmQgYWZ0ZXIgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBJZGVudGlmeSB0aGUgbm9kZSB3aGVyZSBzZWxlY3Rpb24gY3VycmVudGx5IGJlZ2lucywgdGhlbiBvYnNlcnZlXG4gKiBib3RoIGl0cyB0ZXh0IGNvbnRlbnQgYW5kIGl0cyBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBET00uIFNpbmNlIHRoZVxuICogYnJvd3NlciBtYXkgbmF0aXZlbHkgcmVwbGFjZSB0aGUgdGFyZ2V0IG5vZGUgZHVyaW5nIGNvbXBvc2l0aW9uLCB3ZSBjYW5cbiAqIHVzZSBpdHMgcG9zaXRpb24gdG8gZmluZCBpdHMgcmVwbGFjZW1lbnQuXG4gKlxuICpcbiAqL1xuXG52YXIgcm9vdCA9IG51bGw7XG52YXIgc3RhcnRUZXh0ID0gbnVsbDtcbnZhciBmYWxsYmFja1RleHQgPSBudWxsO1xuXG5mdW5jdGlvbiBpbml0aWFsaXplKG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJvb3QgPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgc3RhcnRUZXh0ID0gZ2V0VGV4dCgpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVzZXQoKSB7XG4gIHJvb3QgPSBudWxsO1xuICBzdGFydFRleHQgPSBudWxsO1xuICBmYWxsYmFja1RleHQgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXREYXRhKCkge1xuICBpZiAoZmFsbGJhY2tUZXh0KSB7XG4gICAgcmV0dXJuIGZhbGxiYWNrVGV4dDtcbiAgfVxuXG4gIHZhciBzdGFydCA9IHZvaWQgMDtcbiAgdmFyIHN0YXJ0VmFsdWUgPSBzdGFydFRleHQ7XG4gIHZhciBzdGFydExlbmd0aCA9IHN0YXJ0VmFsdWUubGVuZ3RoO1xuICB2YXIgZW5kID0gdm9pZCAwO1xuICB2YXIgZW5kVmFsdWUgPSBnZXRUZXh0KCk7XG4gIHZhciBlbmRMZW5ndGggPSBlbmRWYWx1ZS5sZW5ndGg7XG5cbiAgZm9yIChzdGFydCA9IDA7IHN0YXJ0IDwgc3RhcnRMZW5ndGg7IHN0YXJ0KyspIHtcbiAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydF0gIT09IGVuZFZhbHVlW3N0YXJ0XSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIG1pbkVuZCA9IHN0YXJ0TGVuZ3RoIC0gc3RhcnQ7XG4gIGZvciAoZW5kID0gMTsgZW5kIDw9IG1pbkVuZDsgZW5kKyspIHtcbiAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydExlbmd0aCAtIGVuZF0gIT09IGVuZFZhbHVlW2VuZExlbmd0aCAtIGVuZF0pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzbGljZVRhaWwgPSBlbmQgPiAxID8gMSAtIGVuZCA6IHVuZGVmaW5lZDtcbiAgZmFsbGJhY2tUZXh0ID0gZW5kVmFsdWUuc2xpY2Uoc3RhcnQsIHNsaWNlVGFpbCk7XG4gIHJldHVybiBmYWxsYmFja1RleHQ7XG59XG5cbmZ1bmN0aW9uIGdldFRleHQoKSB7XG4gIGlmICgndmFsdWUnIGluIHJvb3QpIHtcbiAgICByZXR1cm4gcm9vdC52YWx1ZTtcbiAgfVxuICByZXR1cm4gcm9vdC50ZXh0Q29udGVudDtcbn1cblxuLyogZXNsaW50IHZhbGlkLXR5cGVvZjogMCAqL1xuXG52YXIgRVZFTlRfUE9PTF9TSVpFID0gMTA7XG5cbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cbnZhciBFdmVudEludGVyZmFjZSA9IHtcbiAgdHlwZTogbnVsbCxcbiAgdGFyZ2V0OiBudWxsLFxuICAvLyBjdXJyZW50VGFyZ2V0IGlzIHNldCB3aGVuIGRpc3BhdGNoaW5nOyBubyB1c2UgaW4gY29weWluZyBpdCBoZXJlXG4gIGN1cnJlbnRUYXJnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcbiAgZXZlbnRQaGFzZTogbnVsbCxcbiAgYnViYmxlczogbnVsbCxcbiAgY2FuY2VsYWJsZTogbnVsbCxcbiAgdGltZVN0YW1wOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG4gIH0sXG4gIGRlZmF1bHRQcmV2ZW50ZWQ6IG51bGwsXG4gIGlzVHJ1c3RlZDogbnVsbFxufTtcblxuZnVuY3Rpb24gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWUoKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2UoKSB7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTeW50aGV0aWMgZXZlbnRzIGFyZSBkaXNwYXRjaGVkIGJ5IGV2ZW50IHBsdWdpbnMsIHR5cGljYWxseSBpbiByZXNwb25zZSB0byBhXG4gKiB0b3AtbGV2ZWwgZXZlbnQgZGVsZWdhdGlvbiBoYW5kbGVyLlxuICpcbiAqIFRoZXNlIHN5c3RlbXMgc2hvdWxkIGdlbmVyYWxseSB1c2UgcG9vbGluZyB0byByZWR1Y2UgdGhlIGZyZXF1ZW5jeSBvZiBnYXJiYWdlXG4gKiBjb2xsZWN0aW9uLiBUaGUgc3lzdGVtIHNob3VsZCBjaGVjayBgaXNQZXJzaXN0ZW50YCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVcbiAqIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBpbnRvIHRoZSBwb29sIGFmdGVyIGJlaW5nIGRpc3BhdGNoZWQuIFVzZXJzIHRoYXRcbiAqIG5lZWQgYSBwZXJzaXN0ZWQgZXZlbnQgc2hvdWxkIGludm9rZSBgcGVyc2lzdGAuXG4gKlxuICogU3ludGhldGljIGV2ZW50cyAoYW5kIHN1YmNsYXNzZXMpIGltcGxlbWVudCB0aGUgRE9NIExldmVsIDMgRXZlbnRzIEFQSSBieVxuICogbm9ybWFsaXppbmcgYnJvd3NlciBxdWlya3MuIFN1YmNsYXNzZXMgZG8gbm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8gaW1wbGVtZW50IGFcbiAqIERPTSBpbnRlcmZhY2U7IGN1c3RvbSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBldmVudHMgY2FuIGFsc28gc3ViY2xhc3MgdGhpcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuXG4gKiBAcGFyYW0geyp9IHRhcmdldEluc3QgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcGFyYW0ge0RPTUV2ZW50VGFyZ2V0fSBuYXRpdmVFdmVudFRhcmdldCBUYXJnZXQgbm9kZS5cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljRXZlbnQoZGlzcGF0Y2hDb25maWcsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICB7XG4gICAgLy8gdGhlc2UgaGF2ZSBhIGdldHRlci9zZXR0ZXIgZm9yIHdhcm5pbmdzXG4gICAgZGVsZXRlIHRoaXMubmF0aXZlRXZlbnQ7XG4gICAgZGVsZXRlIHRoaXMucHJldmVudERlZmF1bHQ7XG4gICAgZGVsZXRlIHRoaXMuc3RvcFByb3BhZ2F0aW9uO1xuICAgIGRlbGV0ZSB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZDtcbiAgICBkZWxldGUgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZDtcbiAgfVxuXG4gIHRoaXMuZGlzcGF0Y2hDb25maWcgPSBkaXNwYXRjaENvbmZpZztcbiAgdGhpcy5fdGFyZ2V0SW5zdCA9IHRhcmdldEluc3Q7XG4gIHRoaXMubmF0aXZlRXZlbnQgPSBuYXRpdmVFdmVudDtcblxuICB2YXIgSW50ZXJmYWNlID0gdGhpcy5jb25zdHJ1Y3Rvci5JbnRlcmZhY2U7XG4gIGZvciAodmFyIHByb3BOYW1lIGluIEludGVyZmFjZSkge1xuICAgIGlmICghSW50ZXJmYWNlLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHtcbiAgICAgIGRlbGV0ZSB0aGlzW3Byb3BOYW1lXTsgLy8gdGhpcyBoYXMgYSBnZXR0ZXIvc2V0dGVyIGZvciB3YXJuaW5nc1xuICAgIH1cbiAgICB2YXIgbm9ybWFsaXplID0gSW50ZXJmYWNlW3Byb3BOYW1lXTtcbiAgICBpZiAobm9ybWFsaXplKSB7XG4gICAgICB0aGlzW3Byb3BOYW1lXSA9IG5vcm1hbGl6ZShuYXRpdmVFdmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ3RhcmdldCcpIHtcbiAgICAgICAgdGhpcy50YXJnZXQgPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXNbcHJvcE5hbWVdID0gbmF0aXZlRXZlbnRbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBkZWZhdWx0UHJldmVudGVkID0gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCAhPSBudWxsID8gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCA6IG5hdGl2ZUV2ZW50LnJldHVyblZhbHVlID09PSBmYWxzZTtcbiAgaWYgKGRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlO1xuICB9XG4gIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2U7XG4gIHJldHVybiB0aGlzO1xufVxuXG5fYXNzaWduKFN5bnRoZXRpY0V2ZW50LnByb3RvdHlwZSwge1xuICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgdmFyIGV2ZW50ID0gdGhpcy5uYXRpdmVFdmVudDtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnByZXZlbnREZWZhdWx0KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LnJldHVyblZhbHVlICE9PSAndW5rbm93bicpIHtcbiAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gIH0sXG5cbiAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV2ZW50ID0gdGhpcy5uYXRpdmVFdmVudDtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQuY2FuY2VsQnViYmxlICE9PSAndW5rbm93bicpIHtcbiAgICAgIC8vIFRoZSBDaGFuZ2VFdmVudFBsdWdpbiByZWdpc3RlcnMgYSBcInByb3BlcnR5Y2hhbmdlXCIgZXZlbnQgZm9yXG4gICAgICAvLyBJRS4gVGhpcyBldmVudCBkb2VzIG5vdCBzdXBwb3J0IGJ1YmJsaW5nIG9yIGNhbmNlbGxpbmcsIGFuZFxuICAgICAgLy8gYW55IHJlZmVyZW5jZXMgdG8gY2FuY2VsQnViYmxlIHRocm93IFwiTWVtYmVyIG5vdCBmb3VuZFwiLiAgQVxuICAgICAgLy8gdHlwZW9mIGNoZWNrIG9mIFwidW5rbm93blwiIGNpcmN1bXZlbnRzIHRoaXMgaXNzdWUgKGFuZCBpcyBhbHNvXG4gICAgICAvLyBJRSBzcGVjaWZpYykuXG4gICAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZTtcbiAgfSxcblxuICAvKipcbiAgICogV2UgcmVsZWFzZSBhbGwgZGlzcGF0Y2hlZCBgU3ludGhldGljRXZlbnRgcyBhZnRlciBlYWNoIGV2ZW50IGxvb3AsIGFkZGluZ1xuICAgKiB0aGVtIGJhY2sgaW50byB0aGUgcG9vbC4gVGhpcyBhbGxvd3MgYSB3YXkgdG8gaG9sZCBvbnRvIGEgcmVmZXJlbmNlIHRoYXRcbiAgICogd29uJ3QgYmUgYWRkZWQgYmFjayBpbnRvIHRoZSBwb29sLlxuICAgKi9cbiAgcGVyc2lzdDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuaXNQZXJzaXN0ZW50ID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGlzIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBiYWNrIGludG8gdGhlIHBvb2wuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhpcyBzaG91bGQgbm90IGJlIHJlbGVhc2VkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBpc1BlcnNpc3RlbnQ6IGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZSxcblxuICAvKipcbiAgICogYFBvb2xlZENsYXNzYCBsb29rcyBmb3IgYGRlc3RydWN0b3JgIG9uIGVhY2ggaW5zdGFuY2UgaXQgcmVsZWFzZXMuXG4gICAqL1xuICBkZXN0cnVjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIEludGVyZmFjZSA9IHRoaXMuY29uc3RydWN0b3IuSW50ZXJmYWNlO1xuICAgIGZvciAodmFyIHByb3BOYW1lIGluIEludGVyZmFjZSkge1xuICAgICAge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcE5hbWUsIGdldFBvb2xlZFdhcm5pbmdQcm9wZXJ0eURlZmluaXRpb24ocHJvcE5hbWUsIEludGVyZmFjZVtwcm9wTmFtZV0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5kaXNwYXRjaENvbmZpZyA9IG51bGw7XG4gICAgdGhpcy5fdGFyZ2V0SW5zdCA9IG51bGw7XG4gICAgdGhpcy5uYXRpdmVFdmVudCA9IG51bGw7XG4gICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2U7XG4gICAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZTtcbiAgICB0aGlzLl9kaXNwYXRjaExpc3RlbmVycyA9IG51bGw7XG4gICAgdGhpcy5fZGlzcGF0Y2hJbnN0YW5jZXMgPSBudWxsO1xuICAgIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbmF0aXZlRXZlbnQnLCBnZXRQb29sZWRXYXJuaW5nUHJvcGVydHlEZWZpbml0aW9uKCduYXRpdmVFdmVudCcsIG51bGwpKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaXNEZWZhdWx0UHJldmVudGVkJywgZ2V0UG9vbGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbignaXNEZWZhdWx0UHJldmVudGVkJywgZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlKSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2lzUHJvcGFnYXRpb25TdG9wcGVkJywgZ2V0UG9vbGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbignaXNQcm9wYWdhdGlvblN0b3BwZWQnLCBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2UpKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncHJldmVudERlZmF1bHQnLCBnZXRQb29sZWRXYXJuaW5nUHJvcGVydHlEZWZpbml0aW9uKCdwcmV2ZW50RGVmYXVsdCcsIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3N0b3BQcm9wYWdhdGlvbicsIGdldFBvb2xlZFdhcm5pbmdQcm9wZXJ0eURlZmluaXRpb24oJ3N0b3BQcm9wYWdhdGlvbicsIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgfVxuICB9XG59KTtcblxuU3ludGhldGljRXZlbnQuSW50ZXJmYWNlID0gRXZlbnRJbnRlcmZhY2U7XG5cbi8qKlxuICogSGVscGVyIHRvIHJlZHVjZSBib2lsZXJwbGF0ZSB3aGVuIGNyZWF0aW5nIHN1YmNsYXNzZXMuXG4gKi9cblN5bnRoZXRpY0V2ZW50LmV4dGVuZCA9IGZ1bmN0aW9uIChJbnRlcmZhY2UpIHtcbiAgdmFyIFN1cGVyID0gdGhpcztcblxuICB2YXIgRSA9IGZ1bmN0aW9uICgpIHt9O1xuICBFLnByb3RvdHlwZSA9IFN1cGVyLnByb3RvdHlwZTtcbiAgdmFyIHByb3RvdHlwZSA9IG5ldyBFKCk7XG5cbiAgZnVuY3Rpb24gQ2xhc3MoKSB7XG4gICAgcmV0dXJuIFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cbiAgX2Fzc2lnbihwcm90b3R5cGUsIENsYXNzLnByb3RvdHlwZSk7XG4gIENsYXNzLnByb3RvdHlwZSA9IHByb3RvdHlwZTtcbiAgQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2xhc3M7XG5cbiAgQ2xhc3MuSW50ZXJmYWNlID0gX2Fzc2lnbih7fSwgU3VwZXIuSW50ZXJmYWNlLCBJbnRlcmZhY2UpO1xuICBDbGFzcy5leHRlbmQgPSBTdXBlci5leHRlbmQ7XG4gIGFkZEV2ZW50UG9vbGluZ1RvKENsYXNzKTtcblxuICByZXR1cm4gQ2xhc3M7XG59O1xuXG5hZGRFdmVudFBvb2xpbmdUbyhTeW50aGV0aWNFdmVudCk7XG5cbi8qKlxuICogSGVscGVyIHRvIG51bGxpZnkgc3ludGhldGljRXZlbnQgaW5zdGFuY2UgcHJvcGVydGllcyB3aGVuIGRlc3RydWN0aW5nXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHByb3BOYW1lXG4gKiBAcGFyYW0gez9vYmplY3R9IGdldFZhbFxuICogQHJldHVybiB7b2JqZWN0fSBkZWZpbmVQcm9wZXJ0eSBvYmplY3RcbiAqL1xuZnVuY3Rpb24gZ2V0UG9vbGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbihwcm9wTmFtZSwgZ2V0VmFsKSB7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIGdldFZhbCA9PT0gJ2Z1bmN0aW9uJztcbiAgcmV0dXJuIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgc2V0OiBzZXQsXG4gICAgZ2V0OiBnZXRcbiAgfTtcblxuICBmdW5jdGlvbiBzZXQodmFsKSB7XG4gICAgdmFyIGFjdGlvbiA9IGlzRnVuY3Rpb24gPyAnc2V0dGluZyB0aGUgbWV0aG9kJyA6ICdzZXR0aW5nIHRoZSBwcm9wZXJ0eSc7XG4gICAgd2FybihhY3Rpb24sICdUaGlzIGlzIGVmZmVjdGl2ZWx5IGEgbm8tb3AnKTtcbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0KCkge1xuICAgIHZhciBhY3Rpb24gPSBpc0Z1bmN0aW9uID8gJ2FjY2Vzc2luZyB0aGUgbWV0aG9kJyA6ICdhY2Nlc3NpbmcgdGhlIHByb3BlcnR5JztcbiAgICB2YXIgcmVzdWx0ID0gaXNGdW5jdGlvbiA/ICdUaGlzIGlzIGEgbm8tb3AgZnVuY3Rpb24nIDogJ1RoaXMgaXMgc2V0IHRvIG51bGwnO1xuICAgIHdhcm4oYWN0aW9uLCByZXN1bHQpO1xuICAgIHJldHVybiBnZXRWYWw7XG4gIH1cblxuICBmdW5jdGlvbiB3YXJuKGFjdGlvbiwgcmVzdWx0KSB7XG4gICAgdmFyIHdhcm5pbmdDb25kaXRpb24gPSBmYWxzZTtcbiAgICAhd2FybmluZ0NvbmRpdGlvbiA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgXCJUaGlzIHN5bnRoZXRpYyBldmVudCBpcyByZXVzZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIElmIHlvdSdyZSBzZWVpbmcgdGhpcywgXCIgKyBcInlvdSdyZSAlcyBgJXNgIG9uIGEgcmVsZWFzZWQvbnVsbGlmaWVkIHN5bnRoZXRpYyBldmVudC4gJXMuIFwiICsgJ0lmIHlvdSBtdXN0IGtlZXAgdGhlIG9yaWdpbmFsIHN5bnRoZXRpYyBldmVudCBhcm91bmQsIHVzZSBldmVudC5wZXJzaXN0KCkuICcgKyAnU2VlIGh0dHBzOi8vZmIubWUvcmVhY3QtZXZlbnQtcG9vbGluZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLCBhY3Rpb24sIHByb3BOYW1lLCByZXN1bHQpIDogdm9pZCAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFBvb2xlZEV2ZW50KGRpc3BhdGNoQ29uZmlnLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlSW5zdCkge1xuICB2YXIgRXZlbnRDb25zdHJ1Y3RvciA9IHRoaXM7XG4gIGlmIChFdmVudENvbnN0cnVjdG9yLmV2ZW50UG9vbC5sZW5ndGgpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBFdmVudENvbnN0cnVjdG9yLmV2ZW50UG9vbC5wb3AoKTtcbiAgICBFdmVudENvbnN0cnVjdG9yLmNhbGwoaW5zdGFuY2UsIGRpc3BhdGNoQ29uZmlnLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlSW5zdCk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG4gIHJldHVybiBuZXcgRXZlbnRDb25zdHJ1Y3RvcihkaXNwYXRjaENvbmZpZywgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUluc3QpO1xufVxuXG5mdW5jdGlvbiByZWxlYXNlUG9vbGVkRXZlbnQoZXZlbnQpIHtcbiAgdmFyIEV2ZW50Q29uc3RydWN0b3IgPSB0aGlzO1xuICAhKGV2ZW50IGluc3RhbmNlb2YgRXZlbnRDb25zdHJ1Y3RvcikgPyBpbnZhcmlhbnQoZmFsc2UsICdUcnlpbmcgdG8gcmVsZWFzZSBhbiBldmVudCBpbnN0YW5jZSBpbnRvIGEgcG9vbCBvZiBhIGRpZmZlcmVudCB0eXBlLicpIDogdm9pZCAwO1xuICBldmVudC5kZXN0cnVjdG9yKCk7XG4gIGlmIChFdmVudENvbnN0cnVjdG9yLmV2ZW50UG9vbC5sZW5ndGggPCBFVkVOVF9QT09MX1NJWkUpIHtcbiAgICBFdmVudENvbnN0cnVjdG9yLmV2ZW50UG9vbC5wdXNoKGV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRFdmVudFBvb2xpbmdUbyhFdmVudENvbnN0cnVjdG9yKSB7XG4gIEV2ZW50Q29uc3RydWN0b3IuZXZlbnRQb29sID0gW107XG4gIEV2ZW50Q29uc3RydWN0b3IuZ2V0UG9vbGVkID0gZ2V0UG9vbGVkRXZlbnQ7XG4gIEV2ZW50Q29uc3RydWN0b3IucmVsZWFzZSA9IHJlbGVhc2VQb29sZWRFdmVudDtcbn1cblxuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRzLWNvbXBvc2l0aW9uZXZlbnRzXG4gKi9cbnZhciBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50ID0gU3ludGhldGljRXZlbnQuZXh0ZW5kKHtcbiAgZGF0YTogbnVsbFxufSk7XG5cbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDEzMTEwNVxuICogICAgICAvI2V2ZW50cy1pbnB1dGV2ZW50c1xuICovXG52YXIgU3ludGhldGljSW5wdXRFdmVudCA9IFN5bnRoZXRpY0V2ZW50LmV4dGVuZCh7XG4gIGRhdGE6IG51bGxcbn0pO1xuXG52YXIgRU5EX0tFWUNPREVTID0gWzksIDEzLCAyNywgMzJdOyAvLyBUYWIsIFJldHVybiwgRXNjLCBTcGFjZVxudmFyIFNUQVJUX0tFWUNPREUgPSAyMjk7XG5cbnZhciBjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ID0gY2FuVXNlRE9NICYmICdDb21wb3NpdGlvbkV2ZW50JyBpbiB3aW5kb3c7XG5cbnZhciBkb2N1bWVudE1vZGUgPSBudWxsO1xuaWYgKGNhblVzZURPTSAmJiAnZG9jdW1lbnRNb2RlJyBpbiBkb2N1bWVudCkge1xuICBkb2N1bWVudE1vZGUgPSBkb2N1bWVudC5kb2N1bWVudE1vZGU7XG59XG5cbi8vIFdlYmtpdCBvZmZlcnMgYSB2ZXJ5IHVzZWZ1bCBgdGV4dElucHV0YCBldmVudCB0aGF0IGNhbiBiZSB1c2VkIHRvXG4vLyBkaXJlY3RseSByZXByZXNlbnQgYGJlZm9yZUlucHV0YC4gVGhlIElFIGB0ZXh0aW5wdXRgIGV2ZW50IGlzIG5vdCBhc1xuLy8gdXNlZnVsLCBzbyB3ZSBkb24ndCB1c2UgaXQuXG52YXIgY2FuVXNlVGV4dElucHV0RXZlbnQgPSBjYW5Vc2VET00gJiYgJ1RleHRFdmVudCcgaW4gd2luZG93ICYmICFkb2N1bWVudE1vZGU7XG5cbi8vIEluIElFOSssIHdlIGhhdmUgYWNjZXNzIHRvIGNvbXBvc2l0aW9uIGV2ZW50cywgYnV0IHRoZSBkYXRhIHN1cHBsaWVkXG4vLyBieSB0aGUgbmF0aXZlIGNvbXBvc2l0aW9uZW5kIGV2ZW50IG1heSBiZSBpbmNvcnJlY3QuIEphcGFuZXNlIGlkZW9ncmFwaGljXG4vLyBzcGFjZXMsIGZvciBpbnN0YW5jZSAoXFx1MzAwMCkgYXJlIG5vdCByZWNvcmRlZCBjb3JyZWN0bHkuXG52YXIgdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgPSBjYW5Vc2VET00gJiYgKCFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50IHx8IGRvY3VtZW50TW9kZSAmJiBkb2N1bWVudE1vZGUgPiA4ICYmIGRvY3VtZW50TW9kZSA8PSAxMSk7XG5cbnZhciBTUEFDRUJBUl9DT0RFID0gMzI7XG52YXIgU1BBQ0VCQVJfQ0hBUiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoU1BBQ0VCQVJfQ09ERSk7XG5cbi8vIEV2ZW50cyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBuYW1lcy5cbnZhciBldmVudFR5cGVzID0ge1xuICBiZWZvcmVJbnB1dDoge1xuICAgIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOiB7XG4gICAgICBidWJibGVkOiAnb25CZWZvcmVJbnB1dCcsXG4gICAgICBjYXB0dXJlZDogJ29uQmVmb3JlSW5wdXRDYXB0dXJlJ1xuICAgIH0sXG4gICAgZGVwZW5kZW5jaWVzOiBbVE9QX0NPTVBPU0lUSU9OX0VORCwgVE9QX0tFWV9QUkVTUywgVE9QX1RFWFRfSU5QVVQsIFRPUF9QQVNURV1cbiAgfSxcbiAgY29tcG9zaXRpb25FbmQ6IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogJ29uQ29tcG9zaXRpb25FbmQnLFxuICAgICAgY2FwdHVyZWQ6ICdvbkNvbXBvc2l0aW9uRW5kQ2FwdHVyZSdcbiAgICB9LFxuICAgIGRlcGVuZGVuY2llczogW1RPUF9CTFVSLCBUT1BfQ09NUE9TSVRJT05fRU5ELCBUT1BfS0VZX0RPV04sIFRPUF9LRVlfUFJFU1MsIFRPUF9LRVlfVVAsIFRPUF9NT1VTRV9ET1dOXVxuICB9LFxuICBjb21wb3NpdGlvblN0YXJ0OiB7XG4gICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHtcbiAgICAgIGJ1YmJsZWQ6ICdvbkNvbXBvc2l0aW9uU3RhcnQnLFxuICAgICAgY2FwdHVyZWQ6ICdvbkNvbXBvc2l0aW9uU3RhcnRDYXB0dXJlJ1xuICAgIH0sXG4gICAgZGVwZW5kZW5jaWVzOiBbVE9QX0JMVVIsIFRPUF9DT01QT1NJVElPTl9TVEFSVCwgVE9QX0tFWV9ET1dOLCBUT1BfS0VZX1BSRVNTLCBUT1BfS0VZX1VQLCBUT1BfTU9VU0VfRE9XTl1cbiAgfSxcbiAgY29tcG9zaXRpb25VcGRhdGU6IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogJ29uQ29tcG9zaXRpb25VcGRhdGUnLFxuICAgICAgY2FwdHVyZWQ6ICdvbkNvbXBvc2l0aW9uVXBkYXRlQ2FwdHVyZSdcbiAgICB9LFxuICAgIGRlcGVuZGVuY2llczogW1RPUF9CTFVSLCBUT1BfQ09NUE9TSVRJT05fVVBEQVRFLCBUT1BfS0VZX0RPV04sIFRPUF9LRVlfUFJFU1MsIFRPUF9LRVlfVVAsIFRPUF9NT1VTRV9ET1dOXVxuICB9XG59O1xuXG4vLyBUcmFjayB3aGV0aGVyIHdlJ3ZlIGV2ZXIgaGFuZGxlZCBhIGtleXByZXNzIG9uIHRoZSBzcGFjZSBrZXkuXG52YXIgaGFzU3BhY2VLZXlwcmVzcyA9IGZhbHNlO1xuXG4vKipcbiAqIFJldHVybiB3aGV0aGVyIGEgbmF0aXZlIGtleXByZXNzIGV2ZW50IGlzIGFzc3VtZWQgdG8gYmUgYSBjb21tYW5kLlxuICogVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIEZpcmVmb3ggZmlyZXMgYGtleXByZXNzYCBldmVudHMgZm9yIGtleSBjb21tYW5kc1xuICogKGN1dCwgY29weSwgc2VsZWN0LWFsbCwgZXRjLikgZXZlbiB0aG91Z2ggbm8gY2hhcmFjdGVyIGlzIGluc2VydGVkLlxuICovXG5mdW5jdGlvbiBpc0tleXByZXNzQ29tbWFuZChuYXRpdmVFdmVudCkge1xuICByZXR1cm4gKG5hdGl2ZUV2ZW50LmN0cmxLZXkgfHwgbmF0aXZlRXZlbnQuYWx0S2V5IHx8IG5hdGl2ZUV2ZW50Lm1ldGFLZXkpICYmXG4gIC8vIGN0cmxLZXkgJiYgYWx0S2V5IGlzIGVxdWl2YWxlbnQgdG8gQWx0R3IsIGFuZCBpcyBub3QgYSBjb21tYW5kLlxuICAhKG5hdGl2ZUV2ZW50LmN0cmxLZXkgJiYgbmF0aXZlRXZlbnQuYWx0S2V5KTtcbn1cblxuLyoqXG4gKiBUcmFuc2xhdGUgbmF0aXZlIHRvcCBsZXZlbCBldmVudHMgaW50byBldmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdG9wTGV2ZWxUeXBlXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGdldENvbXBvc2l0aW9uRXZlbnRUeXBlKHRvcExldmVsVHlwZSkge1xuICBzd2l0Y2ggKHRvcExldmVsVHlwZSkge1xuICAgIGNhc2UgVE9QX0NPTVBPU0lUSU9OX1NUQVJUOlxuICAgICAgcmV0dXJuIGV2ZW50VHlwZXMuY29tcG9zaXRpb25TdGFydDtcbiAgICBjYXNlIFRPUF9DT01QT1NJVElPTl9FTkQ6XG4gICAgICByZXR1cm4gZXZlbnRUeXBlcy5jb21wb3NpdGlvbkVuZDtcbiAgICBjYXNlIFRPUF9DT01QT1NJVElPTl9VUERBVEU6XG4gICAgICByZXR1cm4gZXZlbnRUeXBlcy5jb21wb3NpdGlvblVwZGF0ZTtcbiAgfVxufVxuXG4vKipcbiAqIERvZXMgb3VyIGZhbGxiYWNrIGJlc3QtZ3Vlc3MgbW9kZWwgdGhpbmsgdGhpcyBldmVudCBzaWduaWZpZXMgdGhhdFxuICogY29tcG9zaXRpb24gaGFzIGJlZ3VuP1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b3BMZXZlbFR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNGYWxsYmFja0NvbXBvc2l0aW9uU3RhcnQodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkge1xuICByZXR1cm4gdG9wTGV2ZWxUeXBlID09PSBUT1BfS0VZX0RPV04gJiYgbmF0aXZlRXZlbnQua2V5Q29kZSA9PT0gU1RBUlRfS0VZQ09ERTtcbn1cblxuLyoqXG4gKiBEb2VzIG91ciBmYWxsYmFjayBtb2RlIHRoaW5rIHRoYXQgdGhpcyBldmVudCBpcyB0aGUgZW5kIG9mIGNvbXBvc2l0aW9uP1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b3BMZXZlbFR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoICh0b3BMZXZlbFR5cGUpIHtcbiAgICBjYXNlIFRPUF9LRVlfVVA6XG4gICAgICAvLyBDb21tYW5kIGtleXMgaW5zZXJ0IG9yIGNsZWFyIElNRSBpbnB1dC5cbiAgICAgIHJldHVybiBFTkRfS0VZQ09ERVMuaW5kZXhPZihuYXRpdmVFdmVudC5rZXlDb2RlKSAhPT0gLTE7XG4gICAgY2FzZSBUT1BfS0VZX0RPV046XG4gICAgICAvLyBFeHBlY3QgSU1FIGtleUNvZGUgb24gZWFjaCBrZXlkb3duLiBJZiB3ZSBnZXQgYW55IG90aGVyXG4gICAgICAvLyBjb2RlIHdlIG11c3QgaGF2ZSBleGl0ZWQgZWFybGllci5cbiAgICAgIHJldHVybiBuYXRpdmVFdmVudC5rZXlDb2RlICE9PSBTVEFSVF9LRVlDT0RFO1xuICAgIGNhc2UgVE9QX0tFWV9QUkVTUzpcbiAgICBjYXNlIFRPUF9NT1VTRV9ET1dOOlxuICAgIGNhc2UgVE9QX0JMVVI6XG4gICAgICAvLyBFdmVudHMgYXJlIG5vdCBwb3NzaWJsZSB3aXRob3V0IGNhbmNlbGxpbmcgSU1FLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEdvb2dsZSBJbnB1dCBUb29scyBwcm92aWRlcyBjb21wb3NpdGlvbiBkYXRhIHZpYSBhIEN1c3RvbUV2ZW50LFxuICogd2l0aCB0aGUgYGRhdGFgIHByb3BlcnR5IHBvcHVsYXRlZCBpbiB0aGUgYGRldGFpbGAgb2JqZWN0LiBJZiB0aGlzXG4gKiBpcyBhdmFpbGFibGUgb24gdGhlIGV2ZW50IG9iamVjdCwgdXNlIGl0LiBJZiBub3QsIHRoaXMgaXMgYSBwbGFpblxuICogY29tcG9zaXRpb24gZXZlbnQgYW5kIHdlIGhhdmUgbm90aGluZyBzcGVjaWFsIHRvIGV4dHJhY3QuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHs/c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBkZXRhaWwgPSBuYXRpdmVFdmVudC5kZXRhaWw7XG4gIGlmICh0eXBlb2YgZGV0YWlsID09PSAnb2JqZWN0JyAmJiAnZGF0YScgaW4gZGV0YWlsKSB7XG4gICAgcmV0dXJuIGRldGFpbC5kYXRhO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgY29tcG9zaXRpb24gZXZlbnQgd2FzIHRyaWdnZXJlZCBieSBLb3JlYW4gSU1FLlxuICogT3VyIGZhbGxiYWNrIG1vZGUgZG9lcyBub3Qgd29yayB3ZWxsIHdpdGggSUUncyBLb3JlYW4gSU1FLFxuICogc28ganVzdCB1c2UgbmF0aXZlIGNvbXBvc2l0aW9uIGV2ZW50cyB3aGVuIEtvcmVhbiBJTUUgaXMgdXNlZC5cbiAqIEFsdGhvdWdoIENvbXBvc2l0aW9uRXZlbnQubG9jYWxlIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQsXG4gKiBpdCBpcyBhdmFpbGFibGUgaW4gSUUsIHdoZXJlIG91ciBmYWxsYmFjayBtb2RlIGlzIGVuYWJsZWQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc1VzaW5nS29yZWFuSU1FKG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBuYXRpdmVFdmVudC5sb2NhbGUgPT09ICdrbyc7XG59XG5cbi8vIFRyYWNrIHRoZSBjdXJyZW50IElNRSBjb21wb3NpdGlvbiBzdGF0dXMsIGlmIGFueS5cbnZhciBpc0NvbXBvc2luZyA9IGZhbHNlO1xuXG4vKipcbiAqIEByZXR1cm4gez9vYmplY3R9IEEgU3ludGhldGljQ29tcG9zaXRpb25FdmVudC5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgdmFyIGV2ZW50VHlwZSA9IHZvaWQgMDtcbiAgdmFyIGZhbGxiYWNrRGF0YSA9IHZvaWQgMDtcblxuICBpZiAoY2FuVXNlQ29tcG9zaXRpb25FdmVudCkge1xuICAgIGV2ZW50VHlwZSA9IGdldENvbXBvc2l0aW9uRXZlbnRUeXBlKHRvcExldmVsVHlwZSk7XG4gIH0gZWxzZSBpZiAoIWlzQ29tcG9zaW5nKSB7XG4gICAgaWYgKGlzRmFsbGJhY2tDb21wb3NpdGlvblN0YXJ0KHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgICBldmVudFR5cGUgPSBldmVudFR5cGVzLmNvbXBvc2l0aW9uU3RhcnQ7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZCh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSkge1xuICAgIGV2ZW50VHlwZSA9IGV2ZW50VHlwZXMuY29tcG9zaXRpb25FbmQ7XG4gIH1cblxuICBpZiAoIWV2ZW50VHlwZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKHVzZUZhbGxiYWNrQ29tcG9zaXRpb25EYXRhICYmICFpc1VzaW5nS29yZWFuSU1FKG5hdGl2ZUV2ZW50KSkge1xuICAgIC8vIFRoZSBjdXJyZW50IGNvbXBvc2l0aW9uIGlzIHN0b3JlZCBzdGF0aWNhbGx5IGFuZCBtdXN0IG5vdCBiZVxuICAgIC8vIG92ZXJ3cml0dGVuIHdoaWxlIGNvbXBvc2l0aW9uIGNvbnRpbnVlcy5cbiAgICBpZiAoIWlzQ29tcG9zaW5nICYmIGV2ZW50VHlwZSA9PT0gZXZlbnRUeXBlcy5jb21wb3NpdGlvblN0YXJ0KSB7XG4gICAgICBpc0NvbXBvc2luZyA9IGluaXRpYWxpemUobmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBldmVudFR5cGVzLmNvbXBvc2l0aW9uRW5kKSB7XG4gICAgICBpZiAoaXNDb21wb3NpbmcpIHtcbiAgICAgICAgZmFsbGJhY2tEYXRhID0gZ2V0RGF0YSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBldmVudCA9IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQuZ2V0UG9vbGVkKGV2ZW50VHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBpZiAoZmFsbGJhY2tEYXRhKSB7XG4gICAgLy8gSW5qZWN0IGRhdGEgZ2VuZXJhdGVkIGZyb20gZmFsbGJhY2sgcGF0aCBpbnRvIHRoZSBzeW50aGV0aWMgZXZlbnQuXG4gICAgLy8gVGhpcyBtYXRjaGVzIHRoZSBwcm9wZXJ0eSBvZiBuYXRpdmUgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZS5cbiAgICBldmVudC5kYXRhID0gZmFsbGJhY2tEYXRhO1xuICB9IGVsc2Uge1xuICAgIHZhciBjdXN0b21EYXRhID0gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCk7XG4gICAgaWYgKGN1c3RvbURhdGEgIT09IG51bGwpIHtcbiAgICAgIGV2ZW50LmRhdGEgPSBjdXN0b21EYXRhO1xuICAgIH1cbiAgfVxuXG4gIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoZXZlbnQpO1xuICByZXR1cm4gZXZlbnQ7XG59XG5cbi8qKlxuICogQHBhcmFtIHtUb3BMZXZlbFR5cGV9IHRvcExldmVsVHlwZSBOdW1iZXIgZnJvbSBgVG9wTGV2ZWxUeXBlYC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGlzIGBiZWZvcmVJbnB1dGAgZXZlbnQuXG4gKi9cbmZ1bmN0aW9uIGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnModG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKHRvcExldmVsVHlwZSkge1xuICAgIGNhc2UgVE9QX0NPTVBPU0lUSU9OX0VORDpcbiAgICAgIHJldHVybiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KTtcbiAgICBjYXNlIFRPUF9LRVlfUFJFU1M6XG4gICAgICAvKipcbiAgICAgICAqIElmIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudHMgYXJlIGF2YWlsYWJsZSwgb3VyIGdvYWwgaXMgdG8gbWFrZVxuICAgICAgICogdXNlIG9mIHRoZW0uIEhvd2V2ZXIsIHRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlOiB0aGUgc3BhY2ViYXIga2V5LlxuICAgICAgICogSW4gV2Via2l0LCBwcmV2ZW50aW5nIGRlZmF1bHQgb24gYSBzcGFjZWJhciBgdGV4dElucHV0YCBldmVudFxuICAgICAgICogY2FuY2VscyBjaGFyYWN0ZXIgaW5zZXJ0aW9uLCBidXQgaXQgKmFsc28qIGNhdXNlcyB0aGUgYnJvd3NlclxuICAgICAgICogdG8gZmFsbCBiYWNrIHRvIGl0cyBkZWZhdWx0IHNwYWNlYmFyIGJlaGF2aW9yIG9mIHNjcm9sbGluZyB0aGVcbiAgICAgICAqIHBhZ2UuXG4gICAgICAgKlxuICAgICAgICogVHJhY2tpbmcgYXQ6XG4gICAgICAgKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzU1MTAzXG4gICAgICAgKlxuICAgICAgICogVG8gYXZvaWQgdGhpcyBpc3N1ZSwgdXNlIHRoZSBrZXlwcmVzcyBldmVudCBhcyBpZiBubyBgdGV4dElucHV0YFxuICAgICAgICogZXZlbnQgaXMgYXZhaWxhYmxlLlxuICAgICAgICovXG4gICAgICB2YXIgd2hpY2ggPSBuYXRpdmVFdmVudC53aGljaDtcbiAgICAgIGlmICh3aGljaCAhPT0gU1BBQ0VCQVJfQ09ERSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaGFzU3BhY2VLZXlwcmVzcyA9IHRydWU7XG4gICAgICByZXR1cm4gU1BBQ0VCQVJfQ0hBUjtcblxuICAgIGNhc2UgVE9QX1RFWFRfSU5QVVQ6XG4gICAgICAvLyBSZWNvcmQgdGhlIGNoYXJhY3RlcnMgdG8gYmUgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgIHZhciBjaGFycyA9IG5hdGl2ZUV2ZW50LmRhdGE7XG5cbiAgICAgIC8vIElmIGl0J3MgYSBzcGFjZWJhciBjaGFyYWN0ZXIsIGFzc3VtZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkXG4gICAgICAvLyBpdCBhdCB0aGUga2V5cHJlc3MgbGV2ZWwgYW5kIGJhaWwgaW1tZWRpYXRlbHkuIEFuZHJvaWQgQ2hyb21lXG4gICAgICAvLyBkb2Vzbid0IGdpdmUgdXMga2V5Y29kZXMsIHNvIHdlIG5lZWQgdG8gaWdub3JlIGl0LlxuICAgICAgaWYgKGNoYXJzID09PSBTUEFDRUJBUl9DSEFSICYmIGhhc1NwYWNlS2V5cHJlc3MpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjaGFycztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBGb3Igb3RoZXIgbmF0aXZlIGV2ZW50IHR5cGVzLCBkbyBub3RoaW5nLlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3IgYnJvd3NlcnMgdGhhdCBkbyBub3QgcHJvdmlkZSB0aGUgYHRleHRJbnB1dGAgZXZlbnQsIGV4dHJhY3QgdGhlXG4gKiBhcHByb3ByaWF0ZSBzdHJpbmcgdG8gdXNlIGZvciBTeW50aGV0aWNJbnB1dEV2ZW50LlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB0b3BMZXZlbFR5cGUgTnVtYmVyIGZyb20gYFRvcExldmVsRXZlbnRUeXBlc2AuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgZmFsbGJhY2sgc3RyaW5nIGZvciB0aGlzIGBiZWZvcmVJbnB1dGAgZXZlbnQuXG4gKi9cbmZ1bmN0aW9uIGdldEZhbGxiYWNrQmVmb3JlSW5wdXRDaGFycyh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSB7XG4gIC8vIElmIHdlIGFyZSBjdXJyZW50bHkgY29tcG9zaW5nIChJTUUpIGFuZCB1c2luZyBhIGZhbGxiYWNrIHRvIGRvIHNvLFxuICAvLyB0cnkgdG8gZXh0cmFjdCB0aGUgY29tcG9zZWQgY2hhcmFjdGVycyBmcm9tIHRoZSBmYWxsYmFjayBvYmplY3QuXG4gIC8vIElmIGNvbXBvc2l0aW9uIGV2ZW50IGlzIGF2YWlsYWJsZSwgd2UgZXh0cmFjdCBhIHN0cmluZyBvbmx5IGF0XG4gIC8vIGNvbXBvc2l0aW9uZXZlbnQsIG90aGVyd2lzZSBleHRyYWN0IGl0IGF0IGZhbGxiYWNrIGV2ZW50cy5cbiAgaWYgKGlzQ29tcG9zaW5nKSB7XG4gICAgaWYgKHRvcExldmVsVHlwZSA9PT0gVE9QX0NPTVBPU0lUSU9OX0VORCB8fCAhY2FuVXNlQ29tcG9zaXRpb25FdmVudCAmJiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkpIHtcbiAgICAgIHZhciBjaGFycyA9IGdldERhdGEoKTtcbiAgICAgIHJlc2V0KCk7XG4gICAgICBpc0NvbXBvc2luZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGNoYXJzO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7XG4gICAgY2FzZSBUT1BfUEFTVEU6XG4gICAgICAvLyBJZiBhIHBhc3RlIGV2ZW50IG9jY3VycyBhZnRlciBhIGtleXByZXNzLCB0aHJvdyBvdXQgdGhlIGlucHV0XG4gICAgICAvLyBjaGFycy4gUGFzdGUgZXZlbnRzIHNob3VsZCBub3QgbGVhZCB0byBCZWZvcmVJbnB1dCBldmVudHMuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjYXNlIFRPUF9LRVlfUFJFU1M6XG4gICAgICAvKipcbiAgICAgICAqIEFzIG9mIHYyNywgRmlyZWZveCBtYXkgZmlyZSBrZXlwcmVzcyBldmVudHMgZXZlbiB3aGVuIG5vIGNoYXJhY3RlclxuICAgICAgICogd2lsbCBiZSBpbnNlcnRlZC4gQSBmZXcgcG9zc2liaWxpdGllczpcbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgYDBgLiBBcnJvdyBrZXlzLCBFc2Mga2V5LCBldGMuXG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIHRoZSBwcmVzc2VkIGtleSBjb2RlLCBidXQgbm8gY2hhciBpcyBhdmFpbGFibGUuXG4gICAgICAgKiAgIEV4OiAnQWx0R3IgKyBkYCBpbiBQb2xpc2guIFRoZXJlIGlzIG5vIG1vZGlmaWVkIGNoYXJhY3RlciBmb3JcbiAgICAgICAqICAgdGhpcyBrZXkgY29tYmluYXRpb24gYW5kIG5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZCBpbnRvIHRoZVxuICAgICAgICogICBkb2N1bWVudCwgYnV0IEZGIGZpcmVzIHRoZSBrZXlwcmVzcyBmb3IgY2hhciBjb2RlIGAxMDBgIGFueXdheS5cbiAgICAgICAqICAgTm8gYGlucHV0YCBldmVudCB3aWxsIG9jY3VyLlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyB0aGUgcHJlc3NlZCBrZXkgY29kZSwgYnV0IGEgY29tbWFuZCBjb21iaW5hdGlvbiBpc1xuICAgICAgICogICBiZWluZyB1c2VkLiBFeDogYENtZCtDYC4gTm8gY2hhcmFjdGVyIGlzIGluc2VydGVkLCBhbmQgbm9cbiAgICAgICAqICAgYGlucHV0YCBldmVudCB3aWxsIG9jY3VyLlxuICAgICAgICovXG4gICAgICBpZiAoIWlzS2V5cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KSkge1xuICAgICAgICAvLyBJRSBmaXJlcyB0aGUgYGtleXByZXNzYCBldmVudCB3aGVuIGEgdXNlciB0eXBlcyBhbiBlbW9qaSB2aWFcbiAgICAgICAgLy8gVG91Y2gga2V5Ym9hcmQgb2YgV2luZG93cy4gIEluIHN1Y2ggYSBjYXNlLCB0aGUgYGNoYXJgIHByb3BlcnR5XG4gICAgICAgIC8vIGhvbGRzIGFuIGVtb2ppIGNoYXJhY3RlciBsaWtlIGBcXHVEODNEXFx1REUwQWAuICBCZWNhdXNlIGl0cyBsZW5ndGhcbiAgICAgICAgLy8gaXMgMiwgdGhlIHByb3BlcnR5IGB3aGljaGAgZG9lcyBub3QgcmVwcmVzZW50IGFuIGVtb2ppIGNvcnJlY3RseS5cbiAgICAgICAgLy8gSW4gc3VjaCBhIGNhc2UsIHdlIGRpcmVjdGx5IHJldHVybiB0aGUgYGNoYXJgIHByb3BlcnR5IGluc3RlYWQgb2ZcbiAgICAgICAgLy8gdXNpbmcgYHdoaWNoYC5cbiAgICAgICAgaWYgKG5hdGl2ZUV2ZW50LmNoYXIgJiYgbmF0aXZlRXZlbnQuY2hhci5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAobmF0aXZlRXZlbnQud2hpY2gpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShuYXRpdmVFdmVudC53aGljaCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNhc2UgVE9QX0NPTVBPU0lUSU9OX0VORDpcbiAgICAgIHJldHVybiB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSAmJiAhaXNVc2luZ0tvcmVhbklNRShuYXRpdmVFdmVudCkgPyBudWxsIDogbmF0aXZlRXZlbnQuZGF0YTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0IGEgU3ludGhldGljSW5wdXRFdmVudCBmb3IgYGJlZm9yZUlucHV0YCwgYmFzZWQgb24gZWl0aGVyIG5hdGl2ZVxuICogYHRleHRJbnB1dGAgb3IgZmFsbGJhY2sgYmVoYXZpb3IuXG4gKlxuICogQHJldHVybiB7P29iamVjdH0gQSBTeW50aGV0aWNJbnB1dEV2ZW50LlxuICovXG5mdW5jdGlvbiBleHRyYWN0QmVmb3JlSW5wdXRFdmVudCh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICB2YXIgY2hhcnMgPSB2b2lkIDA7XG5cbiAgaWYgKGNhblVzZVRleHRJbnB1dEV2ZW50KSB7XG4gICAgY2hhcnMgPSBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpO1xuICB9IGVsc2Uge1xuICAgIGNoYXJzID0gZ2V0RmFsbGJhY2tCZWZvcmVJbnB1dENoYXJzKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpO1xuICB9XG5cbiAgLy8gSWYgbm8gY2hhcmFjdGVycyBhcmUgYmVpbmcgaW5zZXJ0ZWQsIG5vIEJlZm9yZUlucHV0IGV2ZW50IHNob3VsZFxuICAvLyBiZSBmaXJlZC5cbiAgaWYgKCFjaGFycykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGV2ZW50ID0gU3ludGhldGljSW5wdXRFdmVudC5nZXRQb29sZWQoZXZlbnRUeXBlcy5iZWZvcmVJbnB1dCwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBldmVudC5kYXRhID0gY2hhcnM7XG4gIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoZXZlbnQpO1xuICByZXR1cm4gZXZlbnQ7XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIGBvbkJlZm9yZUlucHV0YCBldmVudCB0byBtYXRjaFxuICogaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAxMzExMDUvI2V2ZW50cy1pbnB1dGV2ZW50cy5cbiAqXG4gKiBUaGlzIGV2ZW50IHBsdWdpbiBpcyBiYXNlZCBvbiB0aGUgbmF0aXZlIGB0ZXh0SW5wdXRgIGV2ZW50XG4gKiBhdmFpbGFibGUgaW4gQ2hyb21lLCBTYWZhcmksIE9wZXJhLCBhbmQgSUUuIFRoaXMgZXZlbnQgZmlyZXMgYWZ0ZXJcbiAqIGBvbktleVByZXNzYCBhbmQgYG9uQ29tcG9zaXRpb25FbmRgLCBidXQgYmVmb3JlIGBvbklucHV0YC5cbiAqXG4gKiBgYmVmb3JlSW5wdXRgIGlzIHNwZWMnZCBidXQgbm90IGltcGxlbWVudGVkIGluIGFueSBicm93c2VycywgYW5kXG4gKiB0aGUgYGlucHV0YCBldmVudCBkb2VzIG5vdCBwcm92aWRlIGFueSB1c2VmdWwgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBoYXNcbiAqIGFjdHVhbGx5IGJlZW4gYWRkZWQsIGNvbnRyYXJ5IHRvIHRoZSBzcGVjLiBUaHVzLCBgdGV4dElucHV0YCBpcyB0aGUgYmVzdFxuICogYXZhaWxhYmxlIGV2ZW50IHRvIGlkZW50aWZ5IHRoZSBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBhY3R1YWxseSBiZWVuIGluc2VydGVkXG4gKiBpbnRvIHRoZSB0YXJnZXQgbm9kZS5cbiAqXG4gKiBUaGlzIHBsdWdpbiBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBgY29tcG9zaXRpb25gIGV2ZW50cywgdGh1c1xuICogYWxsb3dpbmcgdXMgdG8gc2hhcmUgY29tcG9zaXRpb24gZmFsbGJhY2sgY29kZSBmb3IgYm90aCBgYmVmb3JlSW5wdXRgIGFuZFxuICogYGNvbXBvc2l0aW9uYCBldmVudCB0eXBlcy5cbiAqL1xudmFyIEJlZm9yZUlucHV0RXZlbnRQbHVnaW4gPSB7XG4gIGV2ZW50VHlwZXM6IGV2ZW50VHlwZXMsXG5cbiAgZXh0cmFjdEV2ZW50czogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgdmFyIGNvbXBvc2l0aW9uID0gZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gICAgdmFyIGJlZm9yZUlucHV0ID0gZXh0cmFjdEJlZm9yZUlucHV0RXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gICAgaWYgKGNvbXBvc2l0aW9uID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gYmVmb3JlSW5wdXQ7XG4gICAgfVxuXG4gICAgaWYgKGJlZm9yZUlucHV0ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gY29tcG9zaXRpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIFtjb21wb3NpdGlvbiwgYmVmb3JlSW5wdXRdO1xuICB9XG59O1xuXG4vLyBVc2UgdG8gcmVzdG9yZSBjb250cm9sbGVkIHN0YXRlIGFmdGVyIGEgY2hhbmdlIGV2ZW50IGhhcyBmaXJlZC5cblxudmFyIHJlc3RvcmVJbXBsID0gbnVsbDtcbnZhciByZXN0b3JlVGFyZ2V0ID0gbnVsbDtcbnZhciByZXN0b3JlUXVldWUgPSBudWxsO1xuXG5mdW5jdGlvbiByZXN0b3JlU3RhdGVPZlRhcmdldCh0YXJnZXQpIHtcbiAgLy8gV2UgcGVyZm9ybSB0aGlzIHRyYW5zbGF0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGV2ZW50IGxvb3Agc28gdGhhdCB3ZVxuICAvLyBhbHdheXMgcmVjZWl2ZSB0aGUgY29ycmVjdCBmaWJlciBoZXJlXG4gIHZhciBpbnRlcm5hbEluc3RhbmNlID0gZ2V0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXQpO1xuICBpZiAoIWludGVybmFsSW5zdGFuY2UpIHtcbiAgICAvLyBVbm1vdW50ZWRcbiAgICByZXR1cm47XG4gIH1cbiAgISh0eXBlb2YgcmVzdG9yZUltcGwgPT09ICdmdW5jdGlvbicpID8gaW52YXJpYW50KGZhbHNlLCAnc2V0UmVzdG9yZUltcGxlbWVudGF0aW9uKCkgbmVlZHMgdG8gYmUgY2FsbGVkIHRvIGhhbmRsZSBhIHRhcmdldCBmb3IgY29udHJvbGxlZCBldmVudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJykgOiB2b2lkIDA7XG4gIHZhciBwcm9wcyA9IGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUoaW50ZXJuYWxJbnN0YW5jZS5zdGF0ZU5vZGUpO1xuICByZXN0b3JlSW1wbChpbnRlcm5hbEluc3RhbmNlLnN0YXRlTm9kZSwgaW50ZXJuYWxJbnN0YW5jZS50eXBlLCBwcm9wcyk7XG59XG5cbmZ1bmN0aW9uIHNldFJlc3RvcmVJbXBsZW1lbnRhdGlvbihpbXBsKSB7XG4gIHJlc3RvcmVJbXBsID0gaW1wbDtcbn1cblxuZnVuY3Rpb24gZW5xdWV1ZVN0YXRlUmVzdG9yZSh0YXJnZXQpIHtcbiAgaWYgKHJlc3RvcmVUYXJnZXQpIHtcbiAgICBpZiAocmVzdG9yZVF1ZXVlKSB7XG4gICAgICByZXN0b3JlUXVldWUucHVzaCh0YXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN0b3JlUXVldWUgPSBbdGFyZ2V0XTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmVzdG9yZVRhcmdldCA9IHRhcmdldDtcbiAgfVxufVxuXG5mdW5jdGlvbiBuZWVkc1N0YXRlUmVzdG9yZSgpIHtcbiAgcmV0dXJuIHJlc3RvcmVUYXJnZXQgIT09IG51bGwgfHwgcmVzdG9yZVF1ZXVlICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiByZXN0b3JlU3RhdGVJZk5lZWRlZCgpIHtcbiAgaWYgKCFyZXN0b3JlVGFyZ2V0KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciB0YXJnZXQgPSByZXN0b3JlVGFyZ2V0O1xuICB2YXIgcXVldWVkVGFyZ2V0cyA9IHJlc3RvcmVRdWV1ZTtcbiAgcmVzdG9yZVRhcmdldCA9IG51bGw7XG4gIHJlc3RvcmVRdWV1ZSA9IG51bGw7XG5cbiAgcmVzdG9yZVN0YXRlT2ZUYXJnZXQodGFyZ2V0KTtcbiAgaWYgKHF1ZXVlZFRhcmdldHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlZFRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHF1ZXVlZFRhcmdldHNbaV0pO1xuICAgIH1cbiAgfVxufVxuXG4vLyBVc2VkIGFzIGEgd2F5IHRvIGNhbGwgYmF0Y2hlZFVwZGF0ZXMgd2hlbiB3ZSBkb24ndCBoYXZlIGEgcmVmZXJlbmNlIHRvXG4vLyB0aGUgcmVuZGVyZXIuIFN1Y2ggYXMgd2hlbiB3ZSdyZSBkaXNwYXRjaGluZyBldmVudHMgb3IgaWYgdGhpcmQgcGFydHlcbi8vIGxpYnJhcmllcyBuZWVkIHRvIGNhbGwgYmF0Y2hlZFVwZGF0ZXMuIEV2ZW50dWFsbHksIHRoaXMgQVBJIHdpbGwgZ28gYXdheSB3aGVuXG4vLyBldmVyeXRoaW5nIGlzIGJhdGNoZWQgYnkgZGVmYXVsdC4gV2UnbGwgdGhlbiBoYXZlIGEgc2ltaWxhciBBUEkgdG8gb3B0LW91dCBvZlxuLy8gc2NoZWR1bGVkIHdvcmsgYW5kIGluc3RlYWQgZG8gc3luY2hyb25vdXMgd29yay5cblxuLy8gRGVmYXVsdHNcbnZhciBfYmF0Y2hlZFVwZGF0ZXNJbXBsID0gZnVuY3Rpb24gKGZuLCBib29ra2VlcGluZykge1xuICByZXR1cm4gZm4oYm9va2tlZXBpbmcpO1xufTtcbnZhciBfaW50ZXJhY3RpdmVVcGRhdGVzSW1wbCA9IGZ1bmN0aW9uIChmbiwgYSwgYikge1xuICByZXR1cm4gZm4oYSwgYik7XG59O1xudmFyIF9mbHVzaEludGVyYWN0aXZlVXBkYXRlc0ltcGwgPSBmdW5jdGlvbiAoKSB7fTtcblxudmFyIGlzQmF0Y2hpbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzKGZuLCBib29ra2VlcGluZykge1xuICBpZiAoaXNCYXRjaGluZykge1xuICAgIC8vIElmIHdlIGFyZSBjdXJyZW50bHkgaW5zaWRlIGFub3RoZXIgYmF0Y2gsIHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdFxuICAgIC8vIGZ1bGx5IGNvbXBsZXRlcyBiZWZvcmUgcmVzdG9yaW5nIHN0YXRlLlxuICAgIHJldHVybiBmbihib29ra2VlcGluZyk7XG4gIH1cbiAgaXNCYXRjaGluZyA9IHRydWU7XG4gIHRyeSB7XG4gICAgcmV0dXJuIF9iYXRjaGVkVXBkYXRlc0ltcGwoZm4sIGJvb2trZWVwaW5nKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBIZXJlIHdlIHdhaXQgdW50aWwgYWxsIHVwZGF0ZXMgaGF2ZSBwcm9wYWdhdGVkLCB3aGljaCBpcyBpbXBvcnRhbnRcbiAgICAvLyB3aGVuIHVzaW5nIGNvbnRyb2xsZWQgY29tcG9uZW50cyB3aXRoaW4gbGF5ZXJzOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY5OFxuICAgIC8vIFRoZW4gd2UgcmVzdG9yZSBzdGF0ZSBvZiBhbnkgY29udHJvbGxlZCBjb21wb25lbnQuXG4gICAgaXNCYXRjaGluZyA9IGZhbHNlO1xuICAgIHZhciBjb250cm9sbGVkQ29tcG9uZW50c0hhdmVQZW5kaW5nVXBkYXRlcyA9IG5lZWRzU3RhdGVSZXN0b3JlKCk7XG4gICAgaWYgKGNvbnRyb2xsZWRDb21wb25lbnRzSGF2ZVBlbmRpbmdVcGRhdGVzKSB7XG4gICAgICAvLyBJZiBhIGNvbnRyb2xsZWQgZXZlbnQgd2FzIGZpcmVkLCB3ZSBtYXkgbmVlZCB0byByZXN0b3JlIHRoZSBzdGF0ZSBvZlxuICAgICAgLy8gdGhlIERPTSBub2RlIGJhY2sgdG8gdGhlIGNvbnRyb2xsZWQgdmFsdWUuIFRoaXMgaXMgbmVjZXNzYXJ5IHdoZW4gUmVhY3RcbiAgICAgIC8vIGJhaWxzIG91dCBvZiB0aGUgdXBkYXRlIHdpdGhvdXQgdG91Y2hpbmcgdGhlIERPTS5cbiAgICAgIF9mbHVzaEludGVyYWN0aXZlVXBkYXRlc0ltcGwoKTtcbiAgICAgIHJlc3RvcmVTdGF0ZUlmTmVlZGVkKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGludGVyYWN0aXZlVXBkYXRlcyhmbiwgYSwgYikge1xuICByZXR1cm4gX2ludGVyYWN0aXZlVXBkYXRlc0ltcGwoZm4sIGEsIGIpO1xufVxuXG5cblxuZnVuY3Rpb24gc2V0QmF0Y2hpbmdJbXBsZW1lbnRhdGlvbihiYXRjaGVkVXBkYXRlc0ltcGwsIGludGVyYWN0aXZlVXBkYXRlc0ltcGwsIGZsdXNoSW50ZXJhY3RpdmVVcGRhdGVzSW1wbCkge1xuICBfYmF0Y2hlZFVwZGF0ZXNJbXBsID0gYmF0Y2hlZFVwZGF0ZXNJbXBsO1xuICBfaW50ZXJhY3RpdmVVcGRhdGVzSW1wbCA9IGludGVyYWN0aXZlVXBkYXRlc0ltcGw7XG4gIF9mbHVzaEludGVyYWN0aXZlVXBkYXRlc0ltcGwgPSBmbHVzaEludGVyYWN0aXZlVXBkYXRlc0ltcGw7XG59XG5cbi8qKlxuICogQHNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS90aGUtaW5wdXQtZWxlbWVudC5odG1sI2lucHV0LXR5cGUtYXR0ci1zdW1tYXJ5XG4gKi9cbnZhciBzdXBwb3J0ZWRJbnB1dFR5cGVzID0ge1xuICBjb2xvcjogdHJ1ZSxcbiAgZGF0ZTogdHJ1ZSxcbiAgZGF0ZXRpbWU6IHRydWUsXG4gICdkYXRldGltZS1sb2NhbCc6IHRydWUsXG4gIGVtYWlsOiB0cnVlLFxuICBtb250aDogdHJ1ZSxcbiAgbnVtYmVyOiB0cnVlLFxuICBwYXNzd29yZDogdHJ1ZSxcbiAgcmFuZ2U6IHRydWUsXG4gIHNlYXJjaDogdHJ1ZSxcbiAgdGVsOiB0cnVlLFxuICB0ZXh0OiB0cnVlLFxuICB0aW1lOiB0cnVlLFxuICB1cmw6IHRydWUsXG4gIHdlZWs6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGlzVGV4dElucHV0RWxlbWVudChlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKG5vZGVOYW1lID09PSAnaW5wdXQnKSB7XG4gICAgcmV0dXJuICEhc3VwcG9ydGVkSW5wdXRUeXBlc1tlbGVtLnR5cGVdO1xuICB9XG5cbiAgaWYgKG5vZGVOYW1lID09PSAndGV4dGFyZWEnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogSFRNTCBub2RlVHlwZSB2YWx1ZXMgdGhhdCByZXByZXNlbnQgdGhlIHR5cGUgb2YgdGhlIG5vZGVcbiAqL1xuXG52YXIgRUxFTUVOVF9OT0RFID0gMTtcbnZhciBURVhUX05PREUgPSAzO1xudmFyIENPTU1FTlRfTk9ERSA9IDg7XG52YXIgRE9DVU1FTlRfTk9ERSA9IDk7XG52YXIgRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA9IDExO1xuXG4vKipcbiAqIEdldHMgdGhlIHRhcmdldCBub2RlIGZyb20gYSBuYXRpdmUgYnJvd3NlciBldmVudCBieSBhY2NvdW50aW5nIGZvclxuICogaW5jb25zaXN0ZW5jaWVzIGluIGJyb3dzZXIgRE9NIEFQSXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7RE9NRXZlbnRUYXJnZXR9IFRhcmdldCBub2RlLlxuICovXG5mdW5jdGlvbiBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCkge1xuICAvLyBGYWxsYmFjayB0byBuYXRpdmVFdmVudC5zcmNFbGVtZW50IGZvciBJRTlcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjUwNlxuICB2YXIgdGFyZ2V0ID0gbmF0aXZlRXZlbnQudGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LnNyY0VsZW1lbnQgfHwgd2luZG93O1xuXG4gIC8vIE5vcm1hbGl6ZSBTVkcgPHVzZT4gZWxlbWVudCBldmVudHMgIzQ5NjNcbiAgaWYgKHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCkge1xuICAgIHRhcmdldCA9IHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudDtcbiAgfVxuXG4gIC8vIFNhZmFyaSBtYXkgZmlyZSBldmVudHMgb24gdGV4dCBub2RlcyAoTm9kZS5URVhUX05PREUgaXMgMykuXG4gIC8vIEBzZWUgaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9qcy9ldmVudHNfcHJvcGVydGllcy5odG1sXG4gIHJldHVybiB0YXJnZXQubm9kZVR5cGUgPT09IFRFWFRfTk9ERSA/IHRhcmdldC5wYXJlbnROb2RlIDogdGFyZ2V0O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBldmVudCBpcyBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuICpcbiAqIE5PVEU6IFRoaXMgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkgZm9yIG5vbi1nZW5lcmljIGV2ZW50cyBzdWNoIGFzIGBjaGFuZ2VgLFxuICogYHJlc2V0YCwgYGxvYWRgLCBgZXJyb3JgLCBhbmQgYHNlbGVjdGAuXG4gKlxuICogQm9ycm93cyBmcm9tIE1vZGVybml6ci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lU3VmZml4IEV2ZW50IG5hbWUsIGUuZy4gXCJjbGlja1wiLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZXZlbnQgaXMgc3VwcG9ydGVkLlxuICogQGludGVybmFsXG4gKiBAbGljZW5zZSBNb2Rlcm5penIgMy4wLjBwcmUgKEN1c3RvbSBCdWlsZCkgfCBNSVRcbiAqL1xuZnVuY3Rpb24gaXNFdmVudFN1cHBvcnRlZChldmVudE5hbWVTdWZmaXgpIHtcbiAgaWYgKCFjYW5Vc2VET00pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgZXZlbnROYW1lID0gJ29uJyArIGV2ZW50TmFtZVN1ZmZpeDtcbiAgdmFyIGlzU3VwcG9ydGVkID0gZXZlbnROYW1lIGluIGRvY3VtZW50O1xuXG4gIGlmICghaXNTdXBwb3J0ZWQpIHtcbiAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGV2ZW50TmFtZSwgJ3JldHVybjsnKTtcbiAgICBpc1N1cHBvcnRlZCA9IHR5cGVvZiBlbGVtZW50W2V2ZW50TmFtZV0gPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICByZXR1cm4gaXNTdXBwb3J0ZWQ7XG59XG5cbmZ1bmN0aW9uIGlzQ2hlY2thYmxlKGVsZW0pIHtcbiAgdmFyIHR5cGUgPSBlbGVtLnR5cGU7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWU7XG4gIHJldHVybiBub2RlTmFtZSAmJiBub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmICh0eXBlID09PSAnY2hlY2tib3gnIHx8IHR5cGUgPT09ICdyYWRpbycpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFja2VyKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuX3ZhbHVlVHJhY2tlcjtcbn1cblxuZnVuY3Rpb24gZGV0YWNoVHJhY2tlcihub2RlKSB7XG4gIG5vZGUuX3ZhbHVlVHJhY2tlciA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlRnJvbU5vZGUobm9kZSkge1xuICB2YXIgdmFsdWUgPSAnJztcbiAgaWYgKCFub2RlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgaWYgKGlzQ2hlY2thYmxlKG5vZGUpKSB7XG4gICAgdmFsdWUgPSBub2RlLmNoZWNrZWQgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gbm9kZS52YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gdHJhY2tWYWx1ZU9uTm9kZShub2RlKSB7XG4gIHZhciB2YWx1ZUZpZWxkID0gaXNDaGVja2FibGUobm9kZSkgPyAnY2hlY2tlZCcgOiAndmFsdWUnO1xuICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobm9kZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHZhbHVlRmllbGQpO1xuXG4gIHZhciBjdXJyZW50VmFsdWUgPSAnJyArIG5vZGVbdmFsdWVGaWVsZF07XG5cbiAgLy8gaWYgc29tZW9uZSBoYXMgYWxyZWFkeSBkZWZpbmVkIGEgdmFsdWUgb3IgU2FmYXJpLCB0aGVuIGJhaWxcbiAgLy8gYW5kIGRvbid0IHRyYWNrIHZhbHVlIHdpbGwgY2F1c2Ugb3ZlciByZXBvcnRpbmcgb2YgY2hhbmdlcyxcbiAgLy8gYnV0IGl0J3MgYmV0dGVyIHRoZW4gYSBoYXJkIGZhaWx1cmVcbiAgLy8gKG5lZWRlZCBmb3IgY2VydGFpbiB0ZXN0cyB0aGF0IHNweU9uIGlucHV0IHZhbHVlcyBhbmQgU2FmYXJpKVxuICBpZiAobm9kZS5oYXNPd25Qcm9wZXJ0eSh2YWx1ZUZpZWxkKSB8fCB0eXBlb2YgZGVzY3JpcHRvciA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIGRlc2NyaXB0b3IuZ2V0ICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBkZXNjcmlwdG9yLnNldCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgZ2V0ID0gZGVzY3JpcHRvci5nZXQsXG4gICAgICBzZXQgPSBkZXNjcmlwdG9yLnNldDtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobm9kZSwgdmFsdWVGaWVsZCwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXQuY2FsbCh0aGlzKTtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50VmFsdWUgPSAnJyArIHZhbHVlO1xuICAgICAgc2V0LmNhbGwodGhpcywgdmFsdWUpO1xuICAgIH1cbiAgfSk7XG4gIC8vIFdlIGNvdWxkJ3ZlIHBhc3NlZCB0aGlzIHRoZSBmaXJzdCB0aW1lXG4gIC8vIGJ1dCBpdCB0cmlnZ2VycyBhIGJ1ZyBpbiBJRTExIGFuZCBFZGdlIDE0LzE1LlxuICAvLyBDYWxsaW5nIGRlZmluZVByb3BlcnR5KCkgYWdhaW4gc2hvdWxkIGJlIGVxdWl2YWxlbnQuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTE3NjhcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGUsIHZhbHVlRmllbGQsIHtcbiAgICBlbnVtZXJhYmxlOiBkZXNjcmlwdG9yLmVudW1lcmFibGVcbiAgfSk7XG5cbiAgdmFyIHRyYWNrZXIgPSB7XG4gICAgZ2V0VmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7XG4gICAgfSxcbiAgICBzZXRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50VmFsdWUgPSAnJyArIHZhbHVlO1xuICAgIH0sXG4gICAgc3RvcFRyYWNraW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBkZXRhY2hUcmFja2VyKG5vZGUpO1xuICAgICAgZGVsZXRlIG5vZGVbdmFsdWVGaWVsZF07XG4gICAgfVxuICB9O1xuICByZXR1cm4gdHJhY2tlcjtcbn1cblxuZnVuY3Rpb24gdHJhY2sobm9kZSkge1xuICBpZiAoZ2V0VHJhY2tlcihub2RlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRPRE86IE9uY2UgaXQncyBqdXN0IEZpYmVyIHdlIGNhbiBtb3ZlIHRoaXMgdG8gbm9kZS5fd3JhcHBlclN0YXRlXG4gIG5vZGUuX3ZhbHVlVHJhY2tlciA9IHRyYWNrVmFsdWVPbk5vZGUobm9kZSk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVZhbHVlSWZDaGFuZ2VkKG5vZGUpIHtcbiAgaWYgKCFub2RlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHRyYWNrZXIgPSBnZXRUcmFja2VyKG5vZGUpO1xuICAvLyBpZiB0aGVyZSBpcyBubyB0cmFja2VyIGF0IHRoaXMgcG9pbnQgaXQncyB1bmxpa2VseVxuICAvLyB0aGF0IHRyeWluZyBhZ2FpbiB3aWxsIHN1Y2NlZWRcbiAgaWYgKCF0cmFja2VyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgbGFzdFZhbHVlID0gdHJhY2tlci5nZXRWYWx1ZSgpO1xuICB2YXIgbmV4dFZhbHVlID0gZ2V0VmFsdWVGcm9tTm9kZShub2RlKTtcbiAgaWYgKG5leHRWYWx1ZSAhPT0gbGFzdFZhbHVlKSB7XG4gICAgdHJhY2tlci5zZXRWYWx1ZShuZXh0VmFsdWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxudmFyIFJlYWN0U2hhcmVkSW50ZXJuYWxzID0gUmVhY3QuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7XG5cbi8vIFByZXZlbnQgbmV3ZXIgcmVuZGVyZXJzIGZyb20gUlRFIHdoZW4gdXNlZCB3aXRoIG9sZGVyIHJlYWN0IHBhY2thZ2UgdmVyc2lvbnMuXG4vLyBDdXJyZW50IG93bmVyIGFuZCBkaXNwYXRjaGVyIHVzZWQgdG8gc2hhcmUgdGhlIHNhbWUgcmVmLFxuLy8gYnV0IFBSICMxNDU0OCBzcGxpdCB0aGVtIG91dCB0byBiZXR0ZXIgc3VwcG9ydCB0aGUgcmVhY3QtZGVidWctdG9vbHMgcGFja2FnZS5cbmlmICghUmVhY3RTaGFyZWRJbnRlcm5hbHMuaGFzT3duUHJvcGVydHkoJ1JlYWN0Q3VycmVudERpc3BhdGNoZXInKSkge1xuICBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyID0ge1xuICAgIGN1cnJlbnQ6IG51bGxcbiAgfTtcbn1cblxudmFyIEJFRk9SRV9TTEFTSF9SRSA9IC9eKC4qKVtcXFxcXFwvXS87XG5cbnZhciBkZXNjcmliZUNvbXBvbmVudEZyYW1lID0gZnVuY3Rpb24gKG5hbWUsIHNvdXJjZSwgb3duZXJOYW1lKSB7XG4gIHZhciBzb3VyY2VJbmZvID0gJyc7XG4gIGlmIChzb3VyY2UpIHtcbiAgICB2YXIgcGF0aCA9IHNvdXJjZS5maWxlTmFtZTtcbiAgICB2YXIgZmlsZU5hbWUgPSBwYXRoLnJlcGxhY2UoQkVGT1JFX1NMQVNIX1JFLCAnJyk7XG4gICAge1xuICAgICAgLy8gSW4gREVWLCBpbmNsdWRlIGNvZGUgZm9yIGEgY29tbW9uIHNwZWNpYWwgY2FzZTpcbiAgICAgIC8vIHByZWZlciBcImZvbGRlci9pbmRleC5qc1wiIGluc3RlYWQgb2YganVzdCBcImluZGV4LmpzXCIuXG4gICAgICBpZiAoL15pbmRleFxcLi8udGVzdChmaWxlTmFtZSkpIHtcbiAgICAgICAgdmFyIG1hdGNoID0gcGF0aC5tYXRjaChCRUZPUkVfU0xBU0hfUkUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICB2YXIgcGF0aEJlZm9yZVNsYXNoID0gbWF0Y2hbMV07XG4gICAgICAgICAgaWYgKHBhdGhCZWZvcmVTbGFzaCkge1xuICAgICAgICAgICAgdmFyIGZvbGRlck5hbWUgPSBwYXRoQmVmb3JlU2xhc2gucmVwbGFjZShCRUZPUkVfU0xBU0hfUkUsICcnKTtcbiAgICAgICAgICAgIGZpbGVOYW1lID0gZm9sZGVyTmFtZSArICcvJyArIGZpbGVOYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBzb3VyY2VJbmZvID0gJyAoYXQgJyArIGZpbGVOYW1lICsgJzonICsgc291cmNlLmxpbmVOdW1iZXIgKyAnKSc7XG4gIH0gZWxzZSBpZiAob3duZXJOYW1lKSB7XG4gICAgc291cmNlSW5mbyA9ICcgKGNyZWF0ZWQgYnkgJyArIG93bmVyTmFtZSArICcpJztcbiAgfVxuICByZXR1cm4gJ1xcbiAgICBpbiAnICsgKG5hbWUgfHwgJ1Vua25vd24nKSArIHNvdXJjZUluZm87XG59O1xuXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy4gSWYgdGhlcmUgaXMgbm8gbmF0aXZlIFN5bWJvbFxuLy8gbm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlLlxudmFyIGhhc1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvcjtcblxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSA6IDB4ZWFjNztcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpIDogMHhlYWNhO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpIDogMHhlYWNiO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpIDogMHhlYWNjO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpIDogMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpIDogMHhlYWNkO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKSA6IDB4ZWFjZTtcblxudmFyIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29uY3VycmVudF9tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJykgOiAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJykgOiAweGVhZDE7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QubWVtbycpIDogMHhlYWQzO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKSA6IDB4ZWFkNDtcblxudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InO1xuXG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgaWYgKG1heWJlSXRlcmFibGUgPT09IG51bGwgfHwgdHlwZW9mIG1heWJlSXRlcmFibGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIG1heWJlSXRlcmF0b3IgPSBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtNQVlCRV9JVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdO1xuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIFBlbmRpbmcgPSAwO1xudmFyIFJlc29sdmVkID0gMTtcbnZhciBSZWplY3RlZCA9IDI7XG5cbmZ1bmN0aW9uIHJlZmluZVJlc29sdmVkTGF6eUNvbXBvbmVudChsYXp5Q29tcG9uZW50KSB7XG4gIHJldHVybiBsYXp5Q29tcG9uZW50Ll9zdGF0dXMgPT09IFJlc29sdmVkID8gbGF6eUNvbXBvbmVudC5fcmVzdWx0IDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBvdXRlclR5cGUuZGlzcGxheU5hbWUgfHwgKGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArICcoJyArIGZ1bmN0aW9uTmFtZSArICcpJyA6IHdyYXBwZXJOYW1lKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKSB7XG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICAvLyBIb3N0IHJvb3QsIHRleHQgbm9kZSBvciBqdXN0IGludmFsaWQgdHlwZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB7XG4gICAgaWYgKHR5cGVvZiB0eXBlLnRhZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1JlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgb2JqZWN0IGluIGdldENvbXBvbmVudE5hbWUoKS4gJyArICdUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICB9XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFOlxuICAgICAgcmV0dXJuICdDb25jdXJyZW50TW9kZSc7XG4gICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG4gICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcbiAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcbiAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuICB9XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICByZXR1cm4gJ0NvbnRleHQuQ29uc3VtZXInO1xuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICByZXR1cm4gJ0NvbnRleHQuUHJvdmlkZXInO1xuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUodHlwZS50eXBlKTtcbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHRoZW5hYmxlID0gdHlwZTtcbiAgICAgICAgICB2YXIgcmVzb2x2ZWRUaGVuYWJsZSA9IHJlZmluZVJlc29sdmVkTGF6eUNvbXBvbmVudCh0aGVuYWJsZSk7XG4gICAgICAgICAgaWYgKHJlc29sdmVkVGhlbmFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lKHJlc29sdmVkVGhlbmFibGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuXG5mdW5jdGlvbiBkZXNjcmliZUZpYmVyKGZpYmVyKSB7XG4gIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICBjYXNlIEZyYWdtZW50OlxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgICAgcmV0dXJuICcnO1xuICAgIGRlZmF1bHQ6XG4gICAgICB2YXIgb3duZXIgPSBmaWJlci5fZGVidWdPd25lcjtcbiAgICAgIHZhciBzb3VyY2UgPSBmaWJlci5fZGVidWdTb3VyY2U7XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoZmliZXIudHlwZSk7XG4gICAgICB2YXIgb3duZXJOYW1lID0gbnVsbDtcbiAgICAgIGlmIChvd25lcikge1xuICAgICAgICBvd25lck5hbWUgPSBnZXRDb21wb25lbnROYW1lKG93bmVyLnR5cGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlc2NyaWJlQ29tcG9uZW50RnJhbWUobmFtZSwgc291cmNlLCBvd25lck5hbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZCh3b3JrSW5Qcm9ncmVzcykge1xuICB2YXIgaW5mbyA9ICcnO1xuICB2YXIgbm9kZSA9IHdvcmtJblByb2dyZXNzO1xuICBkbyB7XG4gICAgaW5mbyArPSBkZXNjcmliZUZpYmVyKG5vZGUpO1xuICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgfSB3aGlsZSAobm9kZSk7XG4gIHJldHVybiBpbmZvO1xufVxuXG52YXIgY3VycmVudCA9IG51bGw7XG52YXIgcGhhc2UgPSBudWxsO1xuXG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHtcbiAge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIG93bmVyID0gY3VycmVudC5fZGVidWdPd25lcjtcbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgdHlwZW9mIG93bmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUob3duZXIudHlwZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2KCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgLy8gU2FmZSBiZWNhdXNlIGlmIGN1cnJlbnQgZmliZXIgZXhpc3RzLCB3ZSBhcmUgcmVjb25jaWxpbmcsXG4gICAgLy8gYW5kIGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgdmVyc2lvbi5cbiAgICByZXR1cm4gZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKGN1cnJlbnQpO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gcmVzZXRDdXJyZW50RmliZXIoKSB7XG4gIHtcbiAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjayA9IG51bGw7XG4gICAgY3VycmVudCA9IG51bGw7XG4gICAgcGhhc2UgPSBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRGaWJlcihmaWJlcikge1xuICB7XG4gICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2sgPSBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2O1xuICAgIGN1cnJlbnQgPSBmaWJlcjtcbiAgICBwaGFzZSA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0Q3VycmVudFBoYXNlKGxpZmVDeWNsZVBoYXNlKSB7XG4gIHtcbiAgICBwaGFzZSA9IGxpZmVDeWNsZVBoYXNlO1xuICB9XG59XG5cbi8qKlxuICogU2ltaWxhciB0byBpbnZhcmlhbnQgYnV0IG9ubHkgbG9ncyBhIHdhcm5pbmcgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byBsb2cgaXNzdWVzIGluIGRldmVsb3BtZW50IGVudmlyb25tZW50cyBpbiBjcml0aWNhbFxuICogcGF0aHMuIFJlbW92aW5nIHRoZSBsb2dnaW5nIGNvZGUgZm9yIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIHdpbGwga2VlcCB0aGVcbiAqIHNhbWUgbG9naWMgYW5kIGZvbGxvdyB0aGUgc2FtZSBjb2RlIHBhdGhzLlxuICovXG5cbnZhciB3YXJuaW5nID0gd2FybmluZ1dpdGhvdXRTdGFjayQxO1xuXG57XG4gIHdhcm5pbmcgPSBmdW5jdGlvbiAoY29uZGl0aW9uLCBmb3JtYXQpIHtcbiAgICBpZiAoY29uZGl0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbiAgICB2YXIgc3RhY2sgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0oKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvd2FybmluZy1hbmQtaW52YXJpYW50LWFyZ3NcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDIgPyBfbGVuIC0gMiA6IDApLCBfa2V5ID0gMjsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMl0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgd2FybmluZ1dpdGhvdXRTdGFjayQxLmFwcGx5KHVuZGVmaW5lZCwgW2ZhbHNlLCBmb3JtYXQgKyAnJXMnXS5jb25jYXQoYXJncywgW3N0YWNrXSkpO1xuICB9O1xufVxuXG52YXIgd2FybmluZyQxID0gd2FybmluZztcblxuLy8gQSByZXNlcnZlZCBhdHRyaWJ1dGUuXG4vLyBJdCBpcyBoYW5kbGVkIGJ5IFJlYWN0IHNlcGFyYXRlbHkgYW5kIHNob3VsZG4ndCBiZSB3cml0dGVuIHRvIHRoZSBET00uXG52YXIgUkVTRVJWRUQgPSAwO1xuXG4vLyBBIHNpbXBsZSBzdHJpbmcgYXR0cmlidXRlLlxuLy8gQXR0cmlidXRlcyB0aGF0IGFyZW4ndCBpbiB0aGUgd2hpdGVsaXN0IGFyZSBwcmVzdW1lZCB0byBoYXZlIHRoaXMgdHlwZS5cbnZhciBTVFJJTkcgPSAxO1xuXG4vLyBBIHN0cmluZyBhdHRyaWJ1dGUgdGhhdCBhY2NlcHRzIGJvb2xlYW5zIGluIFJlYWN0LiBJbiBIVE1MLCB0aGVzZSBhcmUgY2FsbGVkXG4vLyBcImVudW1lcmF0ZWRcIiBhdHRyaWJ1dGVzIHdpdGggXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIiBhcyBwb3NzaWJsZSB2YWx1ZXMuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBzZXQgdG8gYSBcInRydWVcIiBzdHJpbmcuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgc2V0IHRvIGEgXCJmYWxzZVwiIHN0cmluZy5cbnZhciBCT09MRUFOSVNIX1NUUklORyA9IDI7XG5cbi8vIEEgcmVhbCBib29sZWFuIGF0dHJpYnV0ZS5cbi8vIFdoZW4gdHJ1ZSwgaXQgc2hvdWxkIGJlIHByZXNlbnQgKHNldCBlaXRoZXIgdG8gYW4gZW1wdHkgc3RyaW5nIG9yIGl0cyBuYW1lKS5cbi8vIFdoZW4gZmFsc2UsIGl0IHNob3VsZCBiZSBvbWl0dGVkLlxudmFyIEJPT0xFQU4gPSAzO1xuXG4vLyBBbiBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIGZsYWcgYXMgd2VsbCBhcyB3aXRoIGEgdmFsdWUuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBwcmVzZW50IChzZXQgZWl0aGVyIHRvIGFuIGVtcHR5IHN0cmluZyBvciBpdHMgbmFtZSkuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgb21pdHRlZC5cbi8vIEZvciBhbnkgb3RoZXIgdmFsdWUsIHNob3VsZCBiZSBwcmVzZW50IHdpdGggdGhhdCB2YWx1ZS5cbnZhciBPVkVSTE9BREVEX0JPT0xFQU4gPSA0O1xuXG4vLyBBbiBhdHRyaWJ1dGUgdGhhdCBtdXN0IGJlIG51bWVyaWMgb3IgcGFyc2UgYXMgYSBudW1lcmljLlxuLy8gV2hlbiBmYWxzeSwgaXQgc2hvdWxkIGJlIHJlbW92ZWQuXG52YXIgTlVNRVJJQyA9IDU7XG5cbi8vIEFuIGF0dHJpYnV0ZSB0aGF0IG11c3QgYmUgcG9zaXRpdmUgbnVtZXJpYyBvciBwYXJzZSBhcyBhIHBvc2l0aXZlIG51bWVyaWMuXG4vLyBXaGVuIGZhbHN5LCBpdCBzaG91bGQgYmUgcmVtb3ZlZC5cbnZhciBQT1NJVElWRV9OVU1FUklDID0gNjtcblxuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xudmFyIEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgPSAnOkEtWl9hLXpcXFxcdTAwQzAtXFxcXHUwMEQ2XFxcXHUwMEQ4LVxcXFx1MDBGNlxcXFx1MDBGOC1cXFxcdTAyRkZcXFxcdTAzNzAtXFxcXHUwMzdEXFxcXHUwMzdGLVxcXFx1MUZGRlxcXFx1MjAwQy1cXFxcdTIwMERcXFxcdTIwNzAtXFxcXHUyMThGXFxcXHUyQzAwLVxcXFx1MkZFRlxcXFx1MzAwMS1cXFxcdUQ3RkZcXFxcdUY5MDAtXFxcXHVGRENGXFxcXHVGREYwLVxcXFx1RkZGRCc7XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi9cbnZhciBBVFRSSUJVVEVfTkFNRV9DSEFSID0gQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiArICdcXFxcLS4wLTlcXFxcdTAwQjdcXFxcdTAzMDAtXFxcXHUwMzZGXFxcXHUyMDNGLVxcXFx1MjA0MCc7XG5cblxudmFyIFJPT1RfQVRUUklCVVRFX05BTUUgPSAnZGF0YS1yZWFjdHJvb3QnO1xudmFyIFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYID0gbmV3IFJlZ0V4cCgnXlsnICsgQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiArICddWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUgPSB7fTtcbnZhciB2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGUgPSB7fTtcblxuZnVuY3Rpb24gaXNBdHRyaWJ1dGVOYW1lU2FmZShhdHRyaWJ1dGVOYW1lKSB7XG4gIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZSwgYXR0cmlidXRlTmFtZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlLCBhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVgudGVzdChhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG4gIHtcbiAgICB3YXJuaW5nJDEoZmFsc2UsICdJbnZhbGlkIGF0dHJpYnV0ZSBuYW1lOiBgJXNgJywgYXR0cmlidXRlTmFtZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBzaG91bGRJZ25vcmVBdHRyaWJ1dGUobmFtZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHByb3BlcnR5SW5mby50eXBlID09PSBSRVNFUlZFRDtcbiAgfVxuICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKG5hbWUubGVuZ3RoID4gMiAmJiAobmFtZVswXSA9PT0gJ28nIHx8IG5hbWVbMF0gPT09ICdPJykgJiYgKG5hbWVbMV0gPT09ICduJyB8fCBuYW1lWzFdID09PSAnTicpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsICYmIHByb3BlcnR5SW5mby50eXBlID09PSBSRVNFUlZFRCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAvLyAkRmxvd0lzc3VlIHN5bWJvbCBpcyBwZXJmZWN0bHkgdmFsaWQgaGVyZVxuICAgIGNhc2UgJ3N5bWJvbCc6XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHtcbiAgICAgICAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gIXByb3BlcnR5SW5mby5hY2NlcHRzQm9vbGVhbnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHByZWZpeCA9IG5hbWUudG9Mb3dlckNhc2UoKS5zbGljZSgwLCA1KTtcbiAgICAgICAgICByZXR1cm4gcHJlZml4ICE9PSAnZGF0YS0nICYmIHByZWZpeCAhPT0gJ2FyaWEtJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG4gICAgc3dpdGNoIChwcm9wZXJ0eUluZm8udHlwZSkge1xuICAgICAgY2FzZSBCT09MRUFOOlxuICAgICAgICByZXR1cm4gIXZhbHVlO1xuICAgICAgY2FzZSBPVkVSTE9BREVEX0JPT0xFQU46XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gZmFsc2U7XG4gICAgICBjYXNlIE5VTUVSSUM6XG4gICAgICAgIHJldHVybiBpc05hTih2YWx1ZSk7XG4gICAgICBjYXNlIFBPU0lUSVZFX05VTUVSSUM6XG4gICAgICAgIHJldHVybiBpc05hTih2YWx1ZSkgfHwgdmFsdWUgPCAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldFByb3BlcnR5SW5mbyhuYW1lKSB7XG4gIHJldHVybiBwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG5hbWUpID8gcHJvcGVydGllc1tuYW1lXSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCB0eXBlLCBtdXN0VXNlUHJvcGVydHksIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZU5hbWVzcGFjZSkge1xuICB0aGlzLmFjY2VwdHNCb29sZWFucyA9IHR5cGUgPT09IEJPT0xFQU5JU0hfU1RSSU5HIHx8IHR5cGUgPT09IEJPT0xFQU4gfHwgdHlwZSA9PT0gT1ZFUkxPQURFRF9CT09MRUFOO1xuICB0aGlzLmF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lO1xuICB0aGlzLmF0dHJpYnV0ZU5hbWVzcGFjZSA9IGF0dHJpYnV0ZU5hbWVzcGFjZTtcbiAgdGhpcy5tdXN0VXNlUHJvcGVydHkgPSBtdXN0VXNlUHJvcGVydHk7XG4gIHRoaXMucHJvcGVydHlOYW1lID0gbmFtZTtcbiAgdGhpcy50eXBlID0gdHlwZTtcbn1cblxuLy8gV2hlbiBhZGRpbmcgYXR0cmlidXRlcyB0byB0aGlzIGxpc3QsIGJlIHN1cmUgdG8gYWxzbyBhZGQgdGhlbSB0b1xuLy8gdGhlIGBwb3NzaWJsZVN0YW5kYXJkTmFtZXNgIG1vZHVsZSB0byBlbnN1cmUgY2FzaW5nIGFuZCBpbmNvcnJlY3Rcbi8vIG5hbWUgd2FybmluZ3MuXG52YXIgcHJvcGVydGllcyA9IHt9O1xuXG4vLyBUaGVzZSBwcm9wcyBhcmUgcmVzZXJ2ZWQgYnkgUmVhY3QuIFRoZXkgc2hvdWxkbid0IGJlIHdyaXR0ZW4gdG8gdGhlIERPTS5cblsnY2hpbGRyZW4nLCAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnLFxuLy8gVE9ETzogVGhpcyBwcmV2ZW50cyB0aGUgYXNzaWdubWVudCBvZiBkZWZhdWx0VmFsdWUgdG8gcmVndWxhclxuLy8gZWxlbWVudHMgKG5vdCBqdXN0IGlucHV0cykuIE5vdyB0aGF0IFJlYWN0RE9NSW5wdXQgYXNzaWducyB0byB0aGVcbi8vIGRlZmF1bHRWYWx1ZSBwcm9wZXJ0eSAtLSBkbyB3ZSBuZWVkIHRoaXM/XG4nZGVmYXVsdFZhbHVlJywgJ2RlZmF1bHRDaGVja2VkJywgJ2lubmVySFRNTCcsICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLCAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJywgJ3N0eWxlJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBSRVNFUlZFRCwgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwpO1xufSAvLyBhdHRyaWJ1dGVOYW1lc3BhY2Vcbik7XG5cbi8vIEEgZmV3IFJlYWN0IHN0cmluZyBhdHRyaWJ1dGVzIGhhdmUgYSBkaWZmZXJlbnQgbmFtZS5cbi8vIFRoaXMgaXMgYSBtYXBwaW5nIGZyb20gUmVhY3QgcHJvcCBuYW1lcyB0byB0aGUgYXR0cmlidXRlIG5hbWVzLlxuW1snYWNjZXB0Q2hhcnNldCcsICdhY2NlcHQtY2hhcnNldCddLCBbJ2NsYXNzTmFtZScsICdjbGFzcyddLCBbJ2h0bWxGb3InLCAnZm9yJ10sIFsnaHR0cEVxdWl2JywgJ2h0dHAtZXF1aXYnXV0uZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgbmFtZSA9IF9yZWZbMF0sXG4gICAgICBhdHRyaWJ1dGVOYW1lID0gX3JlZlsxXTtcblxuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsKTtcbn0gLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4pO1xuXG4vLyBUaGVzZSBhcmUgXCJlbnVtZXJhdGVkXCIgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgYWNjZXB0IFwidHJ1ZVwiIGFuZCBcImZhbHNlXCIuXG4vLyBJbiBSZWFjdCwgd2UgbGV0IHVzZXJzIHBhc3MgYHRydWVgIGFuZCBgZmFsc2VgIGV2ZW4gdGhvdWdoIHRlY2huaWNhbGx5XG4vLyB0aGVzZSBhcmVuJ3QgYm9vbGVhbiBhdHRyaWJ1dGVzICh0aGV5IGFyZSBjb2VyY2VkIHRvIHN0cmluZ3MpLlxuWydjb250ZW50RWRpdGFibGUnLCAnZHJhZ2dhYmxlJywgJ3NwZWxsQ2hlY2snLCAndmFsdWUnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU5JU0hfU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsKTtcbn0gLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4pO1xuXG4vLyBUaGVzZSBhcmUgXCJlbnVtZXJhdGVkXCIgU1ZHIGF0dHJpYnV0ZXMgdGhhdCBhY2NlcHQgXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIi5cbi8vIEluIFJlYWN0LCB3ZSBsZXQgdXNlcnMgcGFzcyBgdHJ1ZWAgYW5kIGBmYWxzZWAgZXZlbiB0aG91Z2ggdGVjaG5pY2FsbHlcbi8vIHRoZXNlIGFyZW4ndCBib29sZWFuIGF0dHJpYnV0ZXMgKHRoZXkgYXJlIGNvZXJjZWQgdG8gc3RyaW5ncykuXG4vLyBTaW5jZSB0aGVzZSBhcmUgU1ZHIGF0dHJpYnV0ZXMsIHRoZWlyIGF0dHJpYnV0ZSBuYW1lcyBhcmUgY2FzZS1zZW5zaXRpdmUuXG5bJ2F1dG9SZXZlcnNlJywgJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLCAnZm9jdXNhYmxlJywgJ3ByZXNlcnZlQWxwaGEnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU5JU0hfU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCk7XG59IC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuKTtcblxuLy8gVGhlc2UgYXJlIEhUTUwgYm9vbGVhbiBhdHRyaWJ1dGVzLlxuWydhbGxvd0Z1bGxTY3JlZW4nLCAnYXN5bmMnLFxuLy8gTm90ZTogdGhlcmUgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHdyaXR0ZW4gdG8gdGhlIERPTVxuLy8gb24gdGhlIGNsaWVudCBzaWRlIGJlY2F1c2UgdGhlIGJyb3dzZXJzIGFyZSBpbmNvbnNpc3RlbnQuIEluc3RlYWQgd2UgY2FsbCBmb2N1cygpLlxuJ2F1dG9Gb2N1cycsICdhdXRvUGxheScsICdjb250cm9scycsICdkZWZhdWx0JywgJ2RlZmVyJywgJ2Rpc2FibGVkJywgJ2Zvcm1Ob1ZhbGlkYXRlJywgJ2hpZGRlbicsICdsb29wJywgJ25vTW9kdWxlJywgJ25vVmFsaWRhdGUnLCAnb3BlbicsICdwbGF5c0lubGluZScsICdyZWFkT25seScsICdyZXF1aXJlZCcsICdyZXZlcnNlZCcsICdzY29wZWQnLCAnc2VhbWxlc3MnLFxuLy8gTWljcm9kYXRhXG4naXRlbVNjb3BlJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsKTtcbn0gLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4pO1xuXG4vLyBUaGVzZSBhcmUgdGhlIGZldyBSZWFjdCBwcm9wcyB0aGF0IHdlIHNldCBhcyBET00gcHJvcGVydGllc1xuLy8gcmF0aGVyIHRoYW4gYXR0cmlidXRlcy4gVGhlc2UgYXJlIGFsbCBib29sZWFucy5cblsnY2hlY2tlZCcsXG4vLyBOb3RlOiBgb3B0aW9uLnNlbGVjdGVkYCBpcyBub3QgdXBkYXRlZCBpZiBgc2VsZWN0Lm11bHRpcGxlYCBpc1xuLy8gZGlzYWJsZWQgd2l0aCBgcmVtb3ZlQXR0cmlidXRlYC4gV2UgaGF2ZSBzcGVjaWFsIGxvZ2ljIGZvciBoYW5kbGluZyB0aGlzLlxuJ211bHRpcGxlJywgJ211dGVkJywgJ3NlbGVjdGVkJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOLCB0cnVlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsKTtcbn0gLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4pO1xuXG4vLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgYXJlIFwib3ZlcmxvYWRlZCBib29sZWFuc1wiOiB0aGV5IGJlaGF2ZSBsaWtlXG4vLyBib29sZWFucywgYnV0IGNhbiBhbHNvIGFjY2VwdCBhIHN0cmluZyB2YWx1ZS5cblsnY2FwdHVyZScsICdkb3dubG9hZCddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgT1ZFUkxPQURFRF9CT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCk7XG59IC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuKTtcblxuLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IG11c3QgYmUgcG9zaXRpdmUgbnVtYmVycy5cblsnY29scycsICdyb3dzJywgJ3NpemUnLCAnc3BhbiddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgUE9TSVRJVkVfTlVNRVJJQywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwpO1xufSAvLyBhdHRyaWJ1dGVOYW1lc3BhY2Vcbik7XG5cbi8vIFRoZXNlIGFyZSBIVE1MIGF0dHJpYnV0ZXMgdGhhdCBtdXN0IGJlIG51bWJlcnMuXG5bJ3Jvd1NwYW4nLCAnc3RhcnQnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIE5VTUVSSUMsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwpO1xufSAvLyBhdHRyaWJ1dGVOYW1lc3BhY2Vcbik7XG5cbnZhciBDQU1FTElaRSA9IC9bXFwtXFw6XShbYS16XSkvZztcbnZhciBjYXBpdGFsaXplID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gIHJldHVybiB0b2tlblsxXS50b1VwcGVyQ2FzZSgpO1xufTtcblxuLy8gVGhpcyBpcyBhIGxpc3Qgb2YgYWxsIFNWRyBhdHRyaWJ1dGVzIHRoYXQgbmVlZCBzcGVjaWFsIGNhc2luZywgbmFtZXNwYWNpbmcsXG4vLyBvciBib29sZWFuIHZhbHVlIGFzc2lnbm1lbnQuIFJlZ3VsYXIgYXR0cmlidXRlcyB0aGF0IGp1c3QgYWNjZXB0IHN0cmluZ3Ncbi8vIGFuZCBoYXZlIHRoZSBzYW1lIG5hbWVzIGFyZSBvbWl0dGVkLCBqdXN0IGxpa2UgaW4gdGhlIEhUTUwgd2hpdGVsaXN0LlxuLy8gU29tZSBvZiB0aGVzZSBhdHRyaWJ1dGVzIGNhbiBiZSBoYXJkIHRvIGZpbmQuIFRoaXMgbGlzdCB3YXMgY3JlYXRlZCBieVxuLy8gc2NyYXBwaW5nIHRoZSBNRE4gZG9jdW1lbnRhdGlvbi5cblsnYWNjZW50LWhlaWdodCcsICdhbGlnbm1lbnQtYmFzZWxpbmUnLCAnYXJhYmljLWZvcm0nLCAnYmFzZWxpbmUtc2hpZnQnLCAnY2FwLWhlaWdodCcsICdjbGlwLXBhdGgnLCAnY2xpcC1ydWxlJywgJ2NvbG9yLWludGVycG9sYXRpb24nLCAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJywgJ2NvbG9yLXByb2ZpbGUnLCAnY29sb3ItcmVuZGVyaW5nJywgJ2RvbWluYW50LWJhc2VsaW5lJywgJ2VuYWJsZS1iYWNrZ3JvdW5kJywgJ2ZpbGwtb3BhY2l0eScsICdmaWxsLXJ1bGUnLCAnZmxvb2QtY29sb3InLCAnZmxvb2Qtb3BhY2l0eScsICdmb250LWZhbWlseScsICdmb250LXNpemUnLCAnZm9udC1zaXplLWFkanVzdCcsICdmb250LXN0cmV0Y2gnLCAnZm9udC1zdHlsZScsICdmb250LXZhcmlhbnQnLCAnZm9udC13ZWlnaHQnLCAnZ2x5cGgtbmFtZScsICdnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsJywgJ2dseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsJywgJ2hvcml6LWFkdi14JywgJ2hvcml6LW9yaWdpbi14JywgJ2ltYWdlLXJlbmRlcmluZycsICdsZXR0ZXItc3BhY2luZycsICdsaWdodGluZy1jb2xvcicsICdtYXJrZXItZW5kJywgJ21hcmtlci1taWQnLCAnbWFya2VyLXN0YXJ0JywgJ292ZXJsaW5lLXBvc2l0aW9uJywgJ292ZXJsaW5lLXRoaWNrbmVzcycsICdwYWludC1vcmRlcicsICdwYW5vc2UtMScsICdwb2ludGVyLWV2ZW50cycsICdyZW5kZXJpbmctaW50ZW50JywgJ3NoYXBlLXJlbmRlcmluZycsICdzdG9wLWNvbG9yJywgJ3N0b3Atb3BhY2l0eScsICdzdHJpa2V0aHJvdWdoLXBvc2l0aW9uJywgJ3N0cmlrZXRocm91Z2gtdGhpY2tuZXNzJywgJ3N0cm9rZS1kYXNoYXJyYXknLCAnc3Ryb2tlLWRhc2hvZmZzZXQnLCAnc3Ryb2tlLWxpbmVjYXAnLCAnc3Ryb2tlLWxpbmVqb2luJywgJ3N0cm9rZS1taXRlcmxpbWl0JywgJ3N0cm9rZS1vcGFjaXR5JywgJ3N0cm9rZS13aWR0aCcsICd0ZXh0LWFuY2hvcicsICd0ZXh0LWRlY29yYXRpb24nLCAndGV4dC1yZW5kZXJpbmcnLCAndW5kZXJsaW5lLXBvc2l0aW9uJywgJ3VuZGVybGluZS10aGlja25lc3MnLCAndW5pY29kZS1iaWRpJywgJ3VuaWNvZGUtcmFuZ2UnLCAndW5pdHMtcGVyLWVtJywgJ3YtYWxwaGFiZXRpYycsICd2LWhhbmdpbmcnLCAndi1pZGVvZ3JhcGhpYycsICd2LW1hdGhlbWF0aWNhbCcsICd2ZWN0b3ItZWZmZWN0JywgJ3ZlcnQtYWR2LXknLCAndmVydC1vcmlnaW4teCcsICd2ZXJ0LW9yaWdpbi15JywgJ3dvcmQtc3BhY2luZycsICd3cml0aW5nLW1vZGUnLCAneG1sbnM6eGxpbmsnLCAneC1oZWlnaHQnXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsIG51bGwpO1xufSAvLyBhdHRyaWJ1dGVOYW1lc3BhY2Vcbik7XG5cbi8vIFN0cmluZyBTVkcgYXR0cmlidXRlcyB3aXRoIHRoZSB4bGluayBuYW1lc3BhY2UuXG5bJ3hsaW5rOmFjdHVhdGUnLCAneGxpbms6YXJjcm9sZScsICd4bGluazpocmVmJywgJ3hsaW5rOnJvbGUnLCAneGxpbms6c2hvdycsICd4bGluazp0aXRsZScsICd4bGluazp0eXBlJ10uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICB2YXIgbmFtZSA9IGF0dHJpYnV0ZU5hbWUucmVwbGFjZShDQU1FTElaRSwgY2FwaXRhbGl6ZSk7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycpO1xufSk7XG5cbi8vIFN0cmluZyBTVkcgYXR0cmlidXRlcyB3aXRoIHRoZSB4bWwgbmFtZXNwYWNlLlxuWyd4bWw6YmFzZScsICd4bWw6bGFuZycsICd4bWw6c3BhY2UnXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsICdodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnKTtcbn0pO1xuXG4vLyBUaGVzZSBhdHRyaWJ1dGUgZXhpc3RzIGJvdGggaW4gSFRNTCBhbmQgU1ZHLlxuLy8gVGhlIGF0dHJpYnV0ZSBuYW1lIGlzIGNhc2Utc2Vuc2l0aXZlIGluIFNWRyBzbyB3ZSBjYW4ndCBqdXN0IHVzZVxuLy8gdGhlIFJlYWN0IG5hbWUgbGlrZSB3ZSBkbyBmb3IgYXR0cmlidXRlcyB0aGF0IGV4aXN0IG9ubHkgaW4gSFRNTC5cblsndGFiSW5kZXgnLCAnY3Jvc3NPcmlnaW4nXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHByb3BlcnRpZXNbYXR0cmlidXRlTmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKGF0dHJpYnV0ZU5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCk7XG59IC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuKTtcblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgXCJleHBlY3RlZFwiIGFyZ3VtZW50IGlzIHVzZWQgYXMgYSBoaW50IG9mIHdoYXQgdGhlIGV4cGVjdGVkIHZhbHVlIGlzLlxuICogU29tZSBwcm9wZXJ0aWVzIGhhdmUgbXVsdGlwbGUgZXF1aXZhbGVudCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgbmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbykge1xuICB7XG4gICAgaWYgKHByb3BlcnR5SW5mby5tdXN0VXNlUHJvcGVydHkpIHtcbiAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eUluZm8ucHJvcGVydHlOYW1lO1xuXG4gICAgICByZXR1cm4gbm9kZVtwcm9wZXJ0eU5hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lO1xuXG4gICAgICB2YXIgc3RyaW5nVmFsdWUgPSBudWxsO1xuXG4gICAgICBpZiAocHJvcGVydHlJbmZvLnR5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTikge1xuICAgICAgICBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhbHVlID09PSAnJyArIGV4cGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub2RlLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIGV4cGVjdGVkLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgICAgIC8vIFdlIGhhZCBhbiBhdHRyaWJ1dGUgYnV0IHNob3VsZG4ndCBoYXZlIGhhZCBvbmUsIHNvIHJlYWQgaXRcbiAgICAgICAgICAvLyBmb3IgdGhlIGVycm9yIG1lc3NhZ2UuXG4gICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8udHlwZSA9PT0gQk9PTEVBTikge1xuICAgICAgICAgIC8vIElmIHRoaXMgd2FzIGEgYm9vbGVhbiwgaXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgdmFsdWUgaXNcbiAgICAgICAgICAvLyB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgaXQgaXMgdGhlIHNhbWUgYXMgdGhlIGV4cGVjdGVkLlxuICAgICAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFdmVuIGlmIHRoaXMgcHJvcGVydHkgdXNlcyBhIG5hbWVzcGFjZSB3ZSB1c2UgZ2V0QXR0cmlidXRlXG4gICAgICAgIC8vIGJlY2F1c2Ugd2UgYXNzdW1lIGl0cyBuYW1lc3BhY2VkIG5hbWUgaXMgdGhlIHNhbWUgYXMgb3VyIGNvbmZpZy5cbiAgICAgICAgLy8gVG8gdXNlIGdldEF0dHJpYnV0ZU5TIHdlIG5lZWQgdGhlIGxvY2FsIG5hbWUgd2hpY2ggd2UgZG9uJ3QgaGF2ZVxuICAgICAgICAvLyBpbiBvdXIgY29uZmlnIGF0bS5cbiAgICAgICAgc3RyaW5nVmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1ZhbHVlID09PSBudWxsID8gZXhwZWN0ZWQgOiBzdHJpbmdWYWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoc3RyaW5nVmFsdWUgPT09ICcnICsgZXhwZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGV4cGVjdGVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1ZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9yIGEgYXR0cmlidXRlIG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdXNlZCBhcyBhIGhpbnQgb2Ygd2hhdCB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMuIFNvbWVcbiAqIGF0dHJpYnV0ZXMgaGF2ZSBtdWx0aXBsZSBlcXVpdmFsZW50IHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWVGb3JBdHRyaWJ1dGUobm9kZSwgbmFtZSwgZXhwZWN0ZWQpIHtcbiAge1xuICAgIGlmICghaXNBdHRyaWJ1dGVOYW1lU2FmZShuYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIW5vZGUuaGFzQXR0cmlidXRlKG5hbWUpKSB7XG4gICAgICByZXR1cm4gZXhwZWN0ZWQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG51bGw7XG4gICAgfVxuICAgIHZhciB2YWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgIGlmICh2YWx1ZSA9PT0gJycgKyBleHBlY3RlZCkge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBmb3IgYSBwcm9wZXJ0eSBvbiBhIG5vZGUuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICovXG5mdW5jdGlvbiBzZXRWYWx1ZUZvclByb3BlcnR5KG5vZGUsIG5hbWUsIHZhbHVlLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICB2YXIgcHJvcGVydHlJbmZvID0gZ2V0UHJvcGVydHlJbmZvKG5hbWUpO1xuICBpZiAoc2hvdWxkSWdub3JlQXR0cmlidXRlKG5hbWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgdmFsdWUgPSBudWxsO1xuICB9XG4gIC8vIElmIHRoZSBwcm9wIGlzbid0IGluIHRoZSBzcGVjaWFsIGxpc3QsIHRyZWF0IGl0IGFzIGEgc2ltcGxlIGF0dHJpYnV0ZS5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnIHx8IHByb3BlcnR5SW5mbyA9PT0gbnVsbCkge1xuICAgIGlmIChpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICB2YXIgX2F0dHJpYnV0ZU5hbWUgPSBuYW1lO1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKF9hdHRyaWJ1dGVOYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKF9hdHRyaWJ1dGVOYW1lLCAnJyArIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtdXN0VXNlUHJvcGVydHkgPSBwcm9wZXJ0eUluZm8ubXVzdFVzZVByb3BlcnR5O1xuXG4gIGlmIChtdXN0VXNlUHJvcGVydHkpIHtcbiAgICB2YXIgcHJvcGVydHlOYW1lID0gcHJvcGVydHlJbmZvLnByb3BlcnR5TmFtZTtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdmFyIHR5cGUgPSBwcm9wZXJ0eUluZm8udHlwZTtcblxuICAgICAgbm9kZVtwcm9wZXJ0eU5hbWVdID0gdHlwZSA9PT0gQk9PTEVBTiA/IGZhbHNlIDogJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvbnRyYXJ5IHRvIGBzZXRBdHRyaWJ1dGVgLCBvYmplY3QgcHJvcGVydGllcyBhcmUgcHJvcGVybHlcbiAgICAgIC8vIGB0b1N0cmluZ2BlZCBieSBJRTgvOS5cbiAgICAgIG5vZGVbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgLy8gVGhlIHJlc3QgYXJlIHRyZWF0ZWQgYXMgYXR0cmlidXRlcyB3aXRoIHNwZWNpYWwgY2FzZXMuXG4gIHZhciBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWUsXG4gICAgICBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZXNwYWNlO1xuXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBfdHlwZSA9IHByb3BlcnR5SW5mby50eXBlO1xuXG4gICAgdmFyIGF0dHJpYnV0ZVZhbHVlID0gdm9pZCAwO1xuICAgIGlmIChfdHlwZSA9PT0gQk9PTEVBTiB8fCBfdHlwZSA9PT0gT1ZFUkxPQURFRF9CT09MRUFOICYmIHZhbHVlID09PSB0cnVlKSB7XG4gICAgICBhdHRyaWJ1dGVWYWx1ZSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBgc2V0QXR0cmlidXRlYCB3aXRoIG9iamVjdHMgYmVjb21lcyBvbmx5IGBbb2JqZWN0XWAgaW4gSUU4LzksXG4gICAgICAvLyAoJycgKyB2YWx1ZSkgbWFrZXMgaXQgb3V0cHV0IHRoZSBjb3JyZWN0IHRvU3RyaW5nKCktdmFsdWUuXG4gICAgICBhdHRyaWJ1dGVWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgfVxuICAgIGlmIChhdHRyaWJ1dGVOYW1lc3BhY2UpIHtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlTlMoYXR0cmlidXRlTmFtZXNwYWNlLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gRmxvdyBkb2VzIG5vdCBhbGxvdyBzdHJpbmcgY29uY2F0ZW5hdGlvbiBvZiBtb3N0IG5vbi1zdHJpbmcgdHlwZXMuIFRvIHdvcmtcbi8vIGFyb3VuZCB0aGlzIGxpbWl0YXRpb24sIHdlIHVzZSBhbiBvcGFxdWUgdHlwZSB0aGF0IGNhbiBvbmx5IGJlIG9idGFpbmVkIGJ5XG4vLyBwYXNzaW5nIHRoZSB2YWx1ZSB0aHJvdWdoIGdldFRvU3RyaW5nVmFsdWUgZmlyc3QuXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0VG9TdHJpbmdWYWx1ZSh2YWx1ZSkge1xuICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGZ1bmN0aW9uLCBzeW1ib2wgYXJlIGFzc2lnbmVkIGFzIGVtcHR5IHN0cmluZ3NcbiAgICAgIHJldHVybiAnJztcbiAgfVxufVxuXG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gbnVsbDtcblxudmFyIFJlYWN0Q29udHJvbGxlZFZhbHVlUHJvcFR5cGVzID0ge1xuICBjaGVja1Byb3BUeXBlczogbnVsbFxufTtcblxue1xuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuXG4gIHZhciBoYXNSZWFkT25seVZhbHVlID0ge1xuICAgIGJ1dHRvbjogdHJ1ZSxcbiAgICBjaGVja2JveDogdHJ1ZSxcbiAgICBpbWFnZTogdHJ1ZSxcbiAgICBoaWRkZW46IHRydWUsXG4gICAgcmFkaW86IHRydWUsXG4gICAgcmVzZXQ6IHRydWUsXG4gICAgc3VibWl0OiB0cnVlXG4gIH07XG5cbiAgdmFyIHByb3BUeXBlcyA9IHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICAgICAgaWYgKGhhc1JlYWRPbmx5VmFsdWVbcHJvcHMudHlwZV0gfHwgcHJvcHMub25DaGFuZ2UgfHwgcHJvcHMucmVhZE9ubHkgfHwgcHJvcHMuZGlzYWJsZWQgfHwgcHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdZb3UgcHJvdmlkZWQgYSBgdmFsdWVgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gJyArICdgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmICcgKyAndGhlIGZpZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVsdFZhbHVlYC4gT3RoZXJ3aXNlLCAnICsgJ3NldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLicpO1xuICAgIH0sXG4gICAgY2hlY2tlZDogZnVuY3Rpb24gKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICAgICAgaWYgKHByb3BzLm9uQ2hhbmdlIHx8IHByb3BzLnJlYWRPbmx5IHx8IHByb3BzLmRpc2FibGVkIHx8IHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBFcnJvcignWW91IHByb3ZpZGVkIGEgYGNoZWNrZWRgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gJyArICdgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmICcgKyAndGhlIGZpZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVsdENoZWNrZWRgLiBPdGhlcndpc2UsICcgKyAnc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuJyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBQcm92aWRlIGEgbGlua2VkIGB2YWx1ZWAgYXR0cmlidXRlIGZvciBjb250cm9sbGVkIGZvcm1zLiBZb3Ugc2hvdWxkIG5vdCB1c2VcbiAgICogdGhpcyBvdXRzaWRlIG9mIHRoZSBSZWFjdERPTSBjb250cm9sbGVkIGZvcm0gY29tcG9uZW50cy5cbiAgICovXG4gIFJlYWN0Q29udHJvbGxlZFZhbHVlUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzID0gZnVuY3Rpb24gKHRhZ05hbWUsIHByb3BzKSB7XG4gICAgY2hlY2tQcm9wVHlwZXMocHJvcFR5cGVzLCBwcm9wcywgJ3Byb3AnLCB0YWdOYW1lLCBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuZ2V0U3RhY2tBZGRlbmR1bSk7XG4gIH07XG59XG5cbnZhciBlbmFibGVVc2VyVGltaW5nQVBJID0gdHJ1ZTtcblxuLy8gSGVscHMgaWRlbnRpZnkgc2lkZSBlZmZlY3RzIGluIGJlZ2luLXBoYXNlIGxpZmVjeWNsZSBob29rcyBhbmQgc2V0U3RhdGUgcmVkdWNlcnM6XG52YXIgZGVidWdSZW5kZXJQaGFzZVNpZGVFZmZlY3RzID0gZmFsc2U7XG5cbi8vIEluIHNvbWUgY2FzZXMsIFN0cmljdE1vZGUgc2hvdWxkIGFsc28gZG91YmxlLXJlbmRlciBsaWZlY3ljbGVzLlxuLy8gVGhpcyBjYW4gYmUgY29uZnVzaW5nIGZvciB0ZXN0cyB0aG91Z2gsXG4vLyBBbmQgaXQgY2FuIGJlIGJhZCBmb3IgcGVyZm9ybWFuY2UgaW4gcHJvZHVjdGlvbi5cbi8vIFRoaXMgZmVhdHVyZSBmbGFnIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGJlaGF2aW9yOlxudmFyIGRlYnVnUmVuZGVyUGhhc2VTaWRlRWZmZWN0c0ZvclN0cmljdE1vZGUgPSB0cnVlO1xuXG4vLyBUbyBwcmVzZXJ2ZSB0aGUgXCJQYXVzZSBvbiBjYXVnaHQgZXhjZXB0aW9uc1wiIGJlaGF2aW9yIG9mIHRoZSBkZWJ1Z2dlciwgd2Vcbi8vIHJlcGxheSB0aGUgYmVnaW4gcGhhc2Ugb2YgYSBmYWlsZWQgY29tcG9uZW50IGluc2lkZSBpbnZva2VHdWFyZGVkQ2FsbGJhY2suXG52YXIgcmVwbGF5RmFpbGVkVW5pdE9mV29ya1dpdGhJbnZva2VHdWFyZGVkQ2FsbGJhY2sgPSB0cnVlO1xuXG4vLyBXYXJuIGFib3V0IGRlcHJlY2F0ZWQsIGFzeW5jLXVuc2FmZSBsaWZlY3ljbGVzOyByZWxhdGVzIHRvIFJGQyAjNjpcbnZhciB3YXJuQWJvdXREZXByZWNhdGVkTGlmZWN5Y2xlcyA9IGZhbHNlO1xuXG4vLyBHYXRoZXIgYWR2YW5jZWQgdGltaW5nIG1ldHJpY3MgZm9yIFByb2ZpbGVyIHN1YnRyZWVzLlxudmFyIGVuYWJsZVByb2ZpbGVyVGltZXIgPSB0cnVlO1xuXG4vLyBUcmFjZSB3aGljaCBpbnRlcmFjdGlvbnMgdHJpZ2dlciBlYWNoIGNvbW1pdC5cbnZhciBlbmFibGVTY2hlZHVsZXJUcmFjaW5nID0gdHJ1ZTtcblxuLy8gT25seSB1c2VkIGluIHd3dyBidWlsZHMuXG52YXIgZW5hYmxlU3VzcGVuc2VTZXJ2ZXJSZW5kZXJlciA9IGZhbHNlOyAvLyBUT0RPOiB0cnVlPyBIZXJlIGl0IG1pZ2h0IGp1c3QgYmUgZmFsc2UuXG5cbi8vIE9ubHkgdXNlZCBpbiB3d3cgYnVpbGRzLlxuXG5cbi8vIE9ubHkgdXNlZCBpbiB3d3cgYnVpbGRzLlxuXG5cbi8vIFJlYWN0IEZpcmU6IHByZXZlbnQgdGhlIHZhbHVlIGFuZCBjaGVja2VkIGF0dHJpYnV0ZXMgZnJvbSBzeW5jaW5nXG4vLyB3aXRoIHRoZWlyIHJlbGF0ZWQgRE9NIHByb3BlcnRpZXNcbnZhciBkaXNhYmxlSW5wdXRBdHRyaWJ1dGVTeW5jaW5nID0gZmFsc2U7XG5cbi8vIFRoZXNlIEFQSXMgd2lsbCBubyBsb25nZXIgYmUgXCJ1bnN0YWJsZVwiIGluIHRoZSB1cGNvbWluZyAxNi43IHJlbGVhc2UsXG4vLyBDb250cm9sIHRoaXMgYmVoYXZpb3Igd2l0aCBhIGZsYWcgdG8gc3VwcG9ydCAxNi42IG1pbm9yIHJlbGVhc2VzIGluIHRoZSBtZWFud2hpbGUuXG52YXIgZW5hYmxlU3RhYmxlQ29uY3VycmVudE1vZGVBUElzID0gZmFsc2U7XG5cbnZhciB3YXJuQWJvdXRTaG9ydGhhbmRQcm9wZXJ0eUNvbGxpc2lvbiA9IGZhbHNlO1xuXG4vLyBUT0RPOiBkaXJlY3QgaW1wb3J0cyBsaWtlIHNvbWUtcGFja2FnZS9zcmMvKiBhcmUgYmFkLiBGaXggbWUuXG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gZmFsc2U7XG52YXIgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSBmYWxzZTtcbnZhciBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGlzQ29udHJvbGxlZChwcm9wcykge1xuICB2YXIgdXNlc0NoZWNrZWQgPSBwcm9wcy50eXBlID09PSAnY2hlY2tib3gnIHx8IHByb3BzLnR5cGUgPT09ICdyYWRpbyc7XG4gIHJldHVybiB1c2VzQ2hlY2tlZCA/IHByb3BzLmNoZWNrZWQgIT0gbnVsbCA6IHByb3BzLnZhbHVlICE9IG51bGw7XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBhbiA8aW5wdXQ+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIHNldHRpbmcgdGhlc2Ugb3B0aW9uYWxcbiAqIHByb3BzOiBgY2hlY2tlZGAsIGB2YWx1ZWAsIGBkZWZhdWx0Q2hlY2tlZGAsIGFuZCBgZGVmYXVsdFZhbHVlYC5cbiAqXG4gKiBJZiBgY2hlY2tlZGAgb3IgYHZhbHVlYCBhcmUgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9uc1xuICogdGhhdCBhZmZlY3QgdGhlIGNoZWNrZWQgc3RhdGUgb3IgdmFsdWUgd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogSWYgdGhleSBhcmUgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIG5vdFxuICogdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LiBJbnN0ZWFkLCB0aGUgcHJvcHMgbXVzdCBjaGFuZ2UgaW4gb3JkZXIgZm9yXG4gKiB0aGUgcmVuZGVyZWQgZWxlbWVudCB0byBiZSB1cGRhdGVkLlxuICpcbiAqIFRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgYmUgaW5pdGlhbGl6ZWQgYXMgdW5jaGVja2VkIChvciBgZGVmYXVsdENoZWNrZWRgKVxuICogd2l0aCBhbiBlbXB0eSB2YWx1ZSAob3IgYGRlZmF1bHRWYWx1ZWApLlxuICpcbiAqIFNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEyL1dELWh0bWw1LTIwMTIxMDI1L3RoZS1pbnB1dC1lbGVtZW50Lmh0bWxcbiAqL1xuXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG5cbiAgdmFyIGhvc3RQcm9wcyA9IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgZGVmYXVsdENoZWNrZWQ6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIGNoZWNrZWQ6IGNoZWNrZWQgIT0gbnVsbCA/IGNoZWNrZWQgOiBub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWRcbiAgfSk7XG5cbiAgcmV0dXJuIGhvc3RQcm9wcztcbn1cblxuZnVuY3Rpb24gaW5pdFdyYXBwZXJTdGF0ZShlbGVtZW50LCBwcm9wcykge1xuICB7XG4gICAgUmVhY3RDb250cm9sbGVkVmFsdWVQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoJ2lucHV0JywgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLmNoZWNrZWQgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkKSB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICclcyBjb250YWlucyBhbiBpbnB1dCBvZiB0eXBlICVzIHdpdGggYm90aCBjaGVja2VkIGFuZCBkZWZhdWx0Q2hlY2tlZCBwcm9wcy4gJyArICdJbnB1dCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgY2hlY2tlZCBwcm9wLCBvciB0aGUgZGVmYXVsdENoZWNrZWQgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vZmIubWUvcmVhY3QtY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKTtcbiAgICAgIGRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlKSB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICclcyBjb250YWlucyBhbiBpbnB1dCBvZiB0eXBlICVzIHdpdGggYm90aCB2YWx1ZSBhbmQgZGVmYXVsdFZhbHVlIHByb3BzLiAnICsgJ0lucHV0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cycsIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkgfHwgJ0EgY29tcG9uZW50JywgcHJvcHMudHlwZSk7XG4gICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZSA9PSBudWxsID8gJycgOiBwcm9wcy5kZWZhdWx0VmFsdWU7XG5cbiAgbm9kZS5fd3JhcHBlclN0YXRlID0ge1xuICAgIGluaXRpYWxDaGVja2VkOiBwcm9wcy5jaGVja2VkICE9IG51bGwgPyBwcm9wcy5jaGVja2VkIDogcHJvcHMuZGVmYXVsdENoZWNrZWQsXG4gICAgaW5pdGlhbFZhbHVlOiBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlICE9IG51bGwgPyBwcm9wcy52YWx1ZSA6IGRlZmF1bHRWYWx1ZSksXG4gICAgY29udHJvbGxlZDogaXNDb250cm9sbGVkKHByb3BzKVxuICB9O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDaGVja2VkKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIGNoZWNrZWQgPSBwcm9wcy5jaGVja2VkO1xuICBpZiAoY2hlY2tlZCAhPSBudWxsKSB7XG4gICAgc2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCAnY2hlY2tlZCcsIGNoZWNrZWQsIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVXcmFwcGVyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAge1xuICAgIHZhciBfY29udHJvbGxlZCA9IGlzQ29udHJvbGxlZChwcm9wcyk7XG5cbiAgICBpZiAoIW5vZGUuX3dyYXBwZXJTdGF0ZS5jb250cm9sbGVkICYmIF9jb250cm9sbGVkICYmICFkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkKSB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICdBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyBhbiB1bmNvbnRyb2xsZWQgaW5wdXQgb2YgdHlwZSAlcyB0byBiZSBjb250cm9sbGVkLiAnICsgJ0lucHV0IGVsZW1lbnRzIHNob3VsZCBub3Qgc3dpdGNoIGZyb20gdW5jb250cm9sbGVkIHRvIGNvbnRyb2xsZWQgKG9yIHZpY2UgdmVyc2EpLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cycsIHByb3BzLnR5cGUpO1xuICAgICAgZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChub2RlLl93cmFwcGVyU3RhdGUuY29udHJvbGxlZCAmJiAhX2NvbnRyb2xsZWQgJiYgIWRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQpIHtcbiAgICAgIHdhcm5pbmckMShmYWxzZSwgJ0EgY29tcG9uZW50IGlzIGNoYW5naW5nIGEgY29udHJvbGxlZCBpbnB1dCBvZiB0eXBlICVzIHRvIGJlIHVuY29udHJvbGxlZC4gJyArICdJbnB1dCBlbGVtZW50cyBzaG91bGQgbm90IHN3aXRjaCBmcm9tIGNvbnRyb2xsZWQgdG8gdW5jb250cm9sbGVkIChvciB2aWNlIHZlcnNhKS4gJyArICdEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9mYi5tZS9yZWFjdC1jb250cm9sbGVkLWNvbXBvbmVudHMnLCBwcm9wcy50eXBlKTtcbiAgICAgIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNoZWNrZWQoZWxlbWVudCwgcHJvcHMpO1xuXG4gIHZhciB2YWx1ZSA9IGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUpO1xuICB2YXIgdHlwZSA9IHByb3BzLnR5cGU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICBpZiAodHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gMCAmJiBub2RlLnZhbHVlID09PSAnJyB8fFxuICAgICAgLy8gV2UgZXhwbGljaXRseSB3YW50IHRvIGNvZXJjZSB0byBudW1iZXIgaGVyZSBpZiBwb3NzaWJsZS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgbm9kZS52YWx1ZSAhPSB2YWx1ZSkge1xuICAgICAgICBub2RlLnZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS52YWx1ZSAhPT0gdG9TdHJpbmcodmFsdWUpKSB7XG4gICAgICBub2RlLnZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlID09PSAnc3VibWl0JyB8fCB0eXBlID09PSAncmVzZXQnKSB7XG4gICAgLy8gU3VibWl0L3Jlc2V0IGlucHV0cyBuZWVkIHRoZSBhdHRyaWJ1dGUgcmVtb3ZlZCBjb21wbGV0ZWx5IHRvIGF2b2lkXG4gICAgLy8gYmxhbmstdGV4dCBidXR0b25zLlxuICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChkaXNhYmxlSW5wdXRBdHRyaWJ1dGVTeW5jaW5nKSB7XG4gICAgLy8gV2hlbiBub3Qgc3luY2luZyB0aGUgdmFsdWUgYXR0cmlidXRlLCBSZWFjdCBvbmx5IGFzc2lnbnMgYSBuZXcgdmFsdWVcbiAgICAvLyB3aGVuZXZlciB0aGUgZGVmYXVsdFZhbHVlIFJlYWN0IHByb3AgaGFzIGNoYW5nZWQuIFdoZW4gbm90IHByZXNlbnQsXG4gICAgLy8gUmVhY3QgZG9lcyBub3RoaW5nXG4gICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmFsdWUnKSkge1xuICAgICAgc2V0RGVmYXVsdFZhbHVlKG5vZGUsIHByb3BzLnR5cGUsIGdldFRvU3RyaW5nVmFsdWUocHJvcHMuZGVmYXVsdFZhbHVlKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFdoZW4gc3luY2luZyB0aGUgdmFsdWUgYXR0cmlidXRlLCB0aGUgdmFsdWUgY29tZXMgZnJvbSBhIGNhc2NhZGUgb2ZcbiAgICAvLyBwcm9wZXJ0aWVzOlxuICAgIC8vICAxLiBUaGUgdmFsdWUgUmVhY3QgcHJvcGVydHlcbiAgICAvLyAgMi4gVGhlIGRlZmF1bHRWYWx1ZSBSZWFjdCBwcm9wZXJ0eVxuICAgIC8vICAzLiBPdGhlcndpc2UgdGhlcmUgc2hvdWxkIGJlIG5vIGNoYW5nZVxuICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSkge1xuICAgICAgc2V0RGVmYXVsdFZhbHVlKG5vZGUsIHByb3BzLnR5cGUsIHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmFsdWUnKSkge1xuICAgICAgc2V0RGVmYXVsdFZhbHVlKG5vZGUsIHByb3BzLnR5cGUsIGdldFRvU3RyaW5nVmFsdWUocHJvcHMuZGVmYXVsdFZhbHVlKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRpc2FibGVJbnB1dEF0dHJpYnV0ZVN5bmNpbmcpIHtcbiAgICAvLyBXaGVuIG5vdCBzeW5jaW5nIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSwgdGhlIGF0dHJpYnV0ZSBpcyBkaXJlY3RseVxuICAgIC8vIGNvbnRyb2xsYWJsZSBmcm9tIHRoZSBkZWZhdWx0VmFsdWUgUmVhY3QgcHJvcGVydHkuIEl0IG5lZWRzIHRvIGJlXG4gICAgLy8gdXBkYXRlZCBhcyBuZXcgcHJvcHMgY29tZSBpbi5cbiAgICBpZiAocHJvcHMuZGVmYXVsdENoZWNrZWQgPT0gbnVsbCkge1xuICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ2NoZWNrZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICEhcHJvcHMuZGVmYXVsdENoZWNrZWQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFdoZW4gc3luY2luZyB0aGUgY2hlY2tlZCBhdHRyaWJ1dGUsIGl0IG9ubHkgY2hhbmdlcyB3aGVuIGl0IG5lZWRzXG4gICAgLy8gdG8gYmUgcmVtb3ZlZCwgc3VjaCBhcyB0cmFuc2l0aW9uaW5nIGZyb20gYSBjaGVja2JveCBpbnRvIGEgdGV4dCBpbnB1dFxuICAgIGlmIChwcm9wcy5jaGVja2VkID09IG51bGwgJiYgcHJvcHMuZGVmYXVsdENoZWNrZWQgIT0gbnVsbCkge1xuICAgICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICEhcHJvcHMuZGVmYXVsdENoZWNrZWQ7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIoZWxlbWVudCwgcHJvcHMsIGlzSHlkcmF0aW5nKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICAvLyBEbyBub3QgYXNzaWduIHZhbHVlIGlmIGl0IGlzIGFscmVhZHkgc2V0LiBUaGlzIHByZXZlbnRzIHVzZXIgdGV4dCBpbnB1dFxuICAvLyBmcm9tIGJlaW5nIGxvc3QgZHVyaW5nIFNTUiBoeWRyYXRpb24uXG4gIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSB8fCBwcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdFZhbHVlJykpIHtcbiAgICB2YXIgdHlwZSA9IHByb3BzLnR5cGU7XG4gICAgdmFyIGlzQnV0dG9uID0gdHlwZSA9PT0gJ3N1Ym1pdCcgfHwgdHlwZSA9PT0gJ3Jlc2V0JztcblxuICAgIC8vIEF2b2lkIHNldHRpbmcgdmFsdWUgYXR0cmlidXRlIG9uIHN1Ym1pdC9yZXNldCBpbnB1dHMgYXMgaXQgb3ZlcnJpZGVzIHRoZVxuICAgIC8vIGRlZmF1bHQgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGJyb3dzZXIuIFNlZTogIzEyODcyXG4gICAgaWYgKGlzQnV0dG9uICYmIChwcm9wcy52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHByb3BzLnZhbHVlID09PSBudWxsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBfaW5pdGlhbFZhbHVlID0gdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSk7XG5cbiAgICAvLyBEbyBub3QgYXNzaWduIHZhbHVlIGlmIGl0IGlzIGFscmVhZHkgc2V0LiBUaGlzIHByZXZlbnRzIHVzZXIgdGV4dCBpbnB1dFxuICAgIC8vIGZyb20gYmVpbmcgbG9zdCBkdXJpbmcgU1NSIGh5ZHJhdGlvbi5cbiAgICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgICBpZiAoZGlzYWJsZUlucHV0QXR0cmlidXRlU3luY2luZykge1xuICAgICAgICB2YXIgdmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlKTtcblxuICAgICAgICAvLyBXaGVuIG5vdCBzeW5jaW5nIHRoZSB2YWx1ZSBhdHRyaWJ1dGUsIHRoZSB2YWx1ZSBwcm9wZXJ0eSBwb2ludHNcbiAgICAgICAgLy8gZGlyZWN0bHkgdG8gdGhlIFJlYWN0IHByb3AuIE9ubHkgYXNzaWduIGl0IGlmIGl0IGV4aXN0cy5cbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBBbHdheXMgYXNzaWduIG9uIGJ1dHRvbnMgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBhc3NpZ24gYW5cbiAgICAgICAgICAvLyBlbXB0eSBzdHJpbmcgdG8gY2xlYXIgYnV0dG9uIHRleHQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBPdGhlcndpc2UsIGRvIG5vdCByZS1hc3NpZ24gdGhlIHZhbHVlIHByb3BlcnR5IGlmIGlzIGVtcHR5LiBUaGlzXG4gICAgICAgICAgLy8gcG90ZW50aWFsbHkgYXZvaWRzIGEgRE9NIHdyaXRlIGFuZCBwcmV2ZW50cyBGaXJlZm94ICh+NjAuMC4xKSBmcm9tXG4gICAgICAgICAgLy8gcHJlbWF0dXJlbHkgbWFya2luZyByZXF1aXJlZCBpbnB1dHMgYXMgaW52YWxpZC4gRXF1YWxpdHkgaXMgY29tcGFyZWRcbiAgICAgICAgICAvLyB0byB0aGUgY3VycmVudCB2YWx1ZSBpbiBjYXNlIHRoZSBicm93c2VyIHByb3ZpZGVkIHZhbHVlIGlzIG5vdCBhblxuICAgICAgICAgIC8vIGVtcHR5IHN0cmluZy5cbiAgICAgICAgICBpZiAoaXNCdXR0b24gfHwgdmFsdWUgIT09IG5vZGUudmFsdWUpIHtcbiAgICAgICAgICAgIG5vZGUudmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIHZhbHVlIGF0dHJpYnV0ZSwgdGhlIHZhbHVlIHByb3BlcnR5IHNob3VsZCB1c2VcbiAgICAgICAgLy8gdGhlIHdyYXBwZXJTdGF0ZS5faW5pdGlhbFZhbHVlIHByb3BlcnR5LiBUaGlzIHVzZXM6XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgMS4gVGhlIHZhbHVlIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgICAgICAvLyAgIDIuIFRoZSBkZWZhdWx0VmFsdWUgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgICAgIC8vICAgMy4gQW4gZW1wdHkgc3RyaW5nXG4gICAgICAgIGlmIChfaW5pdGlhbFZhbHVlICE9PSBub2RlLnZhbHVlKSB7XG4gICAgICAgICAgbm9kZS52YWx1ZSA9IF9pbml0aWFsVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZUlucHV0QXR0cmlidXRlU3luY2luZykge1xuICAgICAgLy8gV2hlbiBub3Qgc3luY2luZyB0aGUgdmFsdWUgYXR0cmlidXRlLCBhc3NpZ24gdGhlIHZhbHVlIGF0dHJpYnV0ZVxuICAgICAgLy8gZGlyZWN0bHkgZnJvbSB0aGUgZGVmYXVsdFZhbHVlIFJlYWN0IHByb3BlcnR5ICh3aGVuIHByZXNlbnQpXG4gICAgICB2YXIgZGVmYXVsdFZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy5kZWZhdWx0VmFsdWUpO1xuICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcoZGVmYXVsdFZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgYXR0cmlidXRlIGlzIHN5bmNocm9uaXplZCB0byB0aGUgcHJvcGVydHksXG4gICAgICAvLyBzbyB3ZSBhc3NpZ24gZGVmYXVsdFZhbHVlIHRvIHRoZSBzYW1lIHRoaW5nIGFzIHRoZSB2YWx1ZSBwcm9wZXJ0eVxuICAgICAgLy8gYXNzaWdubWVudCBzdGVwIGFib3ZlLlxuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSBfaW5pdGlhbFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vcm1hbGx5LCB3ZSdkIGp1c3QgZG8gYG5vZGUuY2hlY2tlZCA9IG5vZGUuY2hlY2tlZGAgdXBvbiBpbml0aWFsIG1vdW50LCBsZXNzIHRoaXMgYnVnXG4gIC8vIHRoaXMgaXMgbmVlZGVkIHRvIHdvcmsgYXJvdW5kIGEgY2hyb21lIGJ1ZyB3aGVyZSBzZXR0aW5nIGRlZmF1bHRDaGVja2VkXG4gIC8vIHdpbGwgc29tZXRpbWVzIGluZmx1ZW5jZSB0aGUgdmFsdWUgb2YgY2hlY2tlZCAoZXZlbiBhZnRlciBkZXRhY2htZW50KS5cbiAgLy8gUmVmZXJlbmNlOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD02MDg0MTZcbiAgLy8gV2UgbmVlZCB0byB0ZW1wb3JhcmlseSB1bnNldCBuYW1lIHRvIGF2b2lkIGRpc3J1cHRpbmcgcmFkaW8gYnV0dG9uIGdyb3Vwcy5cbiAgdmFyIG5hbWUgPSBub2RlLm5hbWU7XG4gIGlmIChuYW1lICE9PSAnJykge1xuICAgIG5vZGUubmFtZSA9ICcnO1xuICB9XG5cbiAgaWYgKGRpc2FibGVJbnB1dEF0dHJpYnV0ZVN5bmNpbmcpIHtcbiAgICAvLyBXaGVuIG5vdCBzeW5jaW5nIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSwgdGhlIGNoZWNrZWQgcHJvcGVydHlcbiAgICAvLyBuZXZlciBnZXRzIGFzc2lnbmVkLiBJdCBtdXN0IGJlIG1hbnVhbGx5IHNldC4gV2UgZG9uJ3Qgd2FudFxuICAgIC8vIHRvIGRvIHRoaXMgd2hlbiBoeWRyYXRpbmcgc28gdGhhdCBleGlzdGluZyB1c2VyIGlucHV0IGlzbid0XG4gICAgLy8gbW9kaWZpZWRcbiAgICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgICB1cGRhdGVDaGVja2VkKGVsZW1lbnQsIHByb3BzKTtcbiAgICB9XG5cbiAgICAvLyBPbmx5IGFzc2lnbiB0aGUgY2hlY2tlZCBhdHRyaWJ1dGUgaWYgaXQgaXMgZGVmaW5lZC4gVGhpcyBzYXZlc1xuICAgIC8vIGEgRE9NIHdyaXRlIHdoZW4gY29udHJvbGxpbmcgdGhlIGNoZWNrZWQgYXR0cmlidXRlIGlzbid0IG5lZWRlZFxuICAgIC8vICh0ZXh0IGlucHV0cywgc3VibWl0L3Jlc2V0KVxuICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdENoZWNrZWQnKSkge1xuICAgICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICFub2RlLmRlZmF1bHRDaGVja2VkO1xuICAgICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICEhcHJvcHMuZGVmYXVsdENoZWNrZWQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFdoZW4gc3luY2luZyB0aGUgY2hlY2tlZCBhdHRyaWJ1dGUsIGJvdGggdGhlIGNoZWNrZWQgcHJvcGVydHkgYW5kXG4gICAgLy8gYXR0cmlidXRlIGFyZSBhc3NpZ25lZCBhdCB0aGUgc2FtZSB0aW1lIHVzaW5nIGRlZmF1bHRDaGVja2VkLiBUaGlzIHVzZXM6XG4gICAgLy9cbiAgICAvLyAgIDEuIFRoZSBjaGVja2VkIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgIC8vICAgMi4gVGhlIGRlZmF1bHRDaGVja2VkIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgIC8vICAgMy4gT3RoZXJ3aXNlLCBmYWxzZVxuICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhbm9kZS5kZWZhdWx0Q2hlY2tlZDtcbiAgICBub2RlLmRlZmF1bHRDaGVja2VkID0gISFub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWQ7XG4gIH1cblxuICBpZiAobmFtZSAhPT0gJycpIHtcbiAgICBub2RlLm5hbWUgPSBuYW1lO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB1cGRhdGVXcmFwcGVyKG5vZGUsIHByb3BzKTtcbiAgdXBkYXRlTmFtZWRDb3VzaW5zKG5vZGUsIHByb3BzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTmFtZWRDb3VzaW5zKHJvb3ROb2RlLCBwcm9wcykge1xuICB2YXIgbmFtZSA9IHByb3BzLm5hbWU7XG4gIGlmIChwcm9wcy50eXBlID09PSAncmFkaW8nICYmIG5hbWUgIT0gbnVsbCkge1xuICAgIHZhciBxdWVyeVJvb3QgPSByb290Tm9kZTtcblxuICAgIHdoaWxlIChxdWVyeVJvb3QucGFyZW50Tm9kZSkge1xuICAgICAgcXVlcnlSb290ID0gcXVlcnlSb290LnBhcmVudE5vZGU7XG4gICAgfVxuXG4gICAgLy8gSWYgYHJvb3ROb2RlLmZvcm1gIHdhcyBub24tbnVsbCwgdGhlbiB3ZSBjb3VsZCB0cnkgYGZvcm0uZWxlbWVudHNgLFxuICAgIC8vIGJ1dCB0aGF0IHNvbWV0aW1lcyBiZWhhdmVzIHN0cmFuZ2VseSBpbiBJRTguIFdlIGNvdWxkIGFsc28gdHJ5IHVzaW5nXG4gICAgLy8gYGZvcm0uZ2V0RWxlbWVudHNCeU5hbWVgLCBidXQgdGhhdCB3aWxsIG9ubHkgcmV0dXJuIGRpcmVjdCBjaGlsZHJlblxuICAgIC8vIGFuZCB3b24ndCBpbmNsdWRlIGlucHV0cyB0aGF0IHVzZSB0aGUgSFRNTDUgYGZvcm09YCBhdHRyaWJ1dGUuIFNpbmNlXG4gICAgLy8gdGhlIGlucHV0IG1pZ2h0IG5vdCBldmVuIGJlIGluIGEgZm9ybS4gSXQgbWlnaHQgbm90IGV2ZW4gYmUgaW4gdGhlXG4gICAgLy8gZG9jdW1lbnQuIExldCdzIGp1c3QgdXNlIHRoZSBsb2NhbCBgcXVlcnlTZWxlY3RvckFsbGAgdG8gZW5zdXJlIHdlIGRvbid0XG4gICAgLy8gbWlzcyBhbnl0aGluZy5cbiAgICB2YXIgZ3JvdXAgPSBxdWVyeVJvb3QucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbbmFtZT0nICsgSlNPTi5zdHJpbmdpZnkoJycgKyBuYW1lKSArICddW3R5cGU9XCJyYWRpb1wiXScpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG90aGVyTm9kZSA9IGdyb3VwW2ldO1xuICAgICAgaWYgKG90aGVyTm9kZSA9PT0gcm9vdE5vZGUgfHwgb3RoZXJOb2RlLmZvcm0gIT09IHJvb3ROb2RlLmZvcm0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgaWYgcmFkaW8gYnV0dG9ucyByZW5kZXJlZCBieSBkaWZmZXJlbnQgY29waWVzIG9mIFJlYWN0XG4gICAgICAvLyBhbmQgdGhlIHNhbWUgbmFtZSBhcmUgcmVuZGVyZWQgaW50byB0aGUgc2FtZSBmb3JtIChzYW1lIGFzICMxOTM5KS5cbiAgICAgIC8vIFRoYXQncyBwcm9iYWJseSBva2F5OyB3ZSBkb24ndCBzdXBwb3J0IGl0IGp1c3QgYXMgd2UgZG9uJ3Qgc3VwcG9ydFxuICAgICAgLy8gbWl4aW5nIFJlYWN0IHJhZGlvIGJ1dHRvbnMgd2l0aCBub24tUmVhY3Qgb25lcy5cbiAgICAgIHZhciBvdGhlclByb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZSQxKG90aGVyTm9kZSk7XG4gICAgICAhb3RoZXJQcm9wcyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0RE9NSW5wdXQ6IE1peGluZyBSZWFjdCBhbmQgbm9uLVJlYWN0IHJhZGlvIGlucHV0cyB3aXRoIHRoZSBzYW1lIGBuYW1lYCBpcyBub3Qgc3VwcG9ydGVkLicpIDogdm9pZCAwO1xuXG4gICAgICAvLyBXZSBuZWVkIHVwZGF0ZSB0aGUgdHJhY2tlZCB2YWx1ZSBvbiB0aGUgbmFtZWQgY291c2luIHNpbmNlIHRoZSB2YWx1ZVxuICAgICAgLy8gd2FzIGNoYW5nZWQgYnV0IHRoZSBpbnB1dCBzYXcgbm8gZXZlbnQgb3IgdmFsdWUgc2V0XG4gICAgICB1cGRhdGVWYWx1ZUlmQ2hhbmdlZChvdGhlck5vZGUpO1xuXG4gICAgICAvLyBJZiB0aGlzIGlzIGEgY29udHJvbGxlZCByYWRpbyBidXR0b24gZ3JvdXAsIGZvcmNpbmcgdGhlIGlucHV0IHRoYXRcbiAgICAgIC8vIHdhcyBwcmV2aW91c2x5IGNoZWNrZWQgdG8gdXBkYXRlIHdpbGwgY2F1c2UgaXQgdG8gYmUgY29tZSByZS1jaGVja2VkXG4gICAgICAvLyBhcyBhcHByb3ByaWF0ZS5cbiAgICAgIHVwZGF0ZVdyYXBwZXIob3RoZXJOb2RlLCBvdGhlclByb3BzKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gSW4gQ2hyb21lLCBhc3NpZ25pbmcgZGVmYXVsdFZhbHVlIHRvIGNlcnRhaW4gaW5wdXQgdHlwZXMgdHJpZ2dlcnMgaW5wdXQgdmFsaWRhdGlvbi5cbi8vIEZvciBudW1iZXIgaW5wdXRzLCB0aGUgZGlzcGxheSB2YWx1ZSBsb3NlcyB0cmFpbGluZyBkZWNpbWFsIHBvaW50cy4gRm9yIGVtYWlsIGlucHV0cyxcbi8vIENocm9tZSByYWlzZXMgXCJUaGUgc3BlY2lmaWVkIHZhbHVlIDx4PiBpcyBub3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzXCIuXG4vL1xuLy8gSGVyZSB3ZSBjaGVjayB0byBzZWUgaWYgdGhlIGRlZmF1bHRWYWx1ZSBoYXMgYWN0dWFsbHkgY2hhbmdlZCwgYXZvaWRpbmcgdGhlc2UgcHJvYmxlbXNcbi8vIHdoZW4gdGhlIHVzZXIgaXMgaW5wdXR0aW5nIHRleHRcbi8vXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyNTNcbmZ1bmN0aW9uIHNldERlZmF1bHRWYWx1ZShub2RlLCB0eXBlLCB2YWx1ZSkge1xuICBpZiAoXG4gIC8vIEZvY3VzZWQgbnVtYmVyIGlucHV0cyBzeW5jaHJvbml6ZSBvbiBibHVyLiBTZWUgQ2hhbmdlRXZlbnRQbHVnaW4uanNcbiAgdHlwZSAhPT0gJ251bWJlcicgfHwgbm9kZS5vd25lckRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IG5vZGUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSB0b1N0cmluZyhub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUuZGVmYXVsdFZhbHVlICE9PSB0b1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZXZlbnRUeXBlcyQxID0ge1xuICBjaGFuZ2U6IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogJ29uQ2hhbmdlJyxcbiAgICAgIGNhcHR1cmVkOiAnb25DaGFuZ2VDYXB0dXJlJ1xuICAgIH0sXG4gICAgZGVwZW5kZW5jaWVzOiBbVE9QX0JMVVIsIFRPUF9DSEFOR0UsIFRPUF9DTElDSywgVE9QX0ZPQ1VTLCBUT1BfSU5QVVQsIFRPUF9LRVlfRE9XTiwgVE9QX0tFWV9VUCwgVE9QX1NFTEVDVElPTl9DSEFOR0VdXG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChpbnN0LCBuYXRpdmVFdmVudCwgdGFyZ2V0KSB7XG4gIHZhciBldmVudCA9IFN5bnRoZXRpY0V2ZW50LmdldFBvb2xlZChldmVudFR5cGVzJDEuY2hhbmdlLCBpbnN0LCBuYXRpdmVFdmVudCwgdGFyZ2V0KTtcbiAgZXZlbnQudHlwZSA9ICdjaGFuZ2UnO1xuICAvLyBGbGFnIHRoaXMgZXZlbnQgbG9vcCBhcyBuZWVkaW5nIHN0YXRlIHJlc3RvcmUuXG4gIGVucXVldWVTdGF0ZVJlc3RvcmUodGFyZ2V0KTtcbiAgYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhldmVudCk7XG4gIHJldHVybiBldmVudDtcbn1cbi8qKlxuICogRm9yIElFIHNoaW1zXG4gKi9cbnZhciBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG5cbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBjaGFuZ2VgIGV2ZW50XG4gKi9cbmZ1bmN0aW9uIHNob3VsZFVzZUNoYW5nZUV2ZW50KGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBub2RlTmFtZSA9PT0gJ3NlbGVjdCcgfHwgbm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgZWxlbS50eXBlID09PSAnZmlsZSc7XG59XG5cbmZ1bmN0aW9uIG1hbnVhbERpc3BhdGNoQ2hhbmdlRXZlbnQobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGV2ZW50ID0gY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGFjdGl2ZUVsZW1lbnRJbnN0LCBuYXRpdmVFdmVudCwgZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpKTtcblxuICAvLyBJZiBjaGFuZ2UgYW5kIHByb3BlcnR5Y2hhbmdlIGJ1YmJsZWQsIHdlJ2QganVzdCBiaW5kIHRvIGl0IGxpa2UgYWxsIHRoZVxuICAvLyBvdGhlciBldmVudHMgYW5kIGhhdmUgaXQgZ28gdGhyb3VnaCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuIFNpbmNlIGl0XG4gIC8vIGRvZXNuJ3QsIHdlIG1hbnVhbGx5IGxpc3RlbiBmb3IgdGhlIGV2ZW50cyBhbmQgc28gd2UgaGF2ZSB0byBlbnF1ZXVlIGFuZFxuICAvLyBwcm9jZXNzIHRoZSBhYnN0cmFjdCBldmVudCBtYW51YWxseS5cbiAgLy9cbiAgLy8gQmF0Y2hpbmcgaXMgbmVjZXNzYXJ5IGhlcmUgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgYWxsIGV2ZW50IGhhbmRsZXJzIHJ1blxuICAvLyBiZWZvcmUgdGhlIG5leHQgcmVyZW5kZXIgKGluY2x1ZGluZyBldmVudCBoYW5kbGVycyBhdHRhY2hlZCB0byBhbmNlc3RvclxuICAvLyBlbGVtZW50cyBpbnN0ZWFkIG9mIGRpcmVjdGx5IG9uIHRoZSBpbnB1dCkuIFdpdGhvdXQgdGhpcywgY29udHJvbGxlZFxuICAvLyBjb21wb25lbnRzIGRvbid0IHdvcmsgcHJvcGVybHkgaW4gY29uanVuY3Rpb24gd2l0aCBldmVudCBidWJibGluZyBiZWNhdXNlXG4gIC8vIHRoZSBjb21wb25lbnQgaXMgcmVyZW5kZXJlZCBhbmQgdGhlIHZhbHVlIHJldmVydGVkIGJlZm9yZSBhbGwgdGhlIGV2ZW50XG4gIC8vIGhhbmRsZXJzIGNhbiBydW4uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcwOC5cbiAgYmF0Y2hlZFVwZGF0ZXMocnVuRXZlbnRJbkJhdGNoLCBldmVudCk7XG59XG5cbmZ1bmN0aW9uIHJ1bkV2ZW50SW5CYXRjaChldmVudCkge1xuICBydW5FdmVudHNJbkJhdGNoKGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpIHtcbiAgdmFyIHRhcmdldE5vZGUgPSBnZXROb2RlRnJvbUluc3RhbmNlJDEodGFyZ2V0SW5zdCk7XG4gIGlmICh1cGRhdGVWYWx1ZUlmQ2hhbmdlZCh0YXJnZXROb2RlKSkge1xuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudCh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QpIHtcbiAgaWYgKHRvcExldmVsVHlwZSA9PT0gVE9QX0NIQU5HRSkge1xuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG5cbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBpbnB1dGAgZXZlbnRcbiAqL1xudmFyIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGZhbHNlO1xuaWYgKGNhblVzZURPTSkge1xuICAvLyBJRTkgY2xhaW1zIHRvIHN1cHBvcnQgdGhlIGlucHV0IGV2ZW50IGJ1dCBmYWlscyB0byB0cmlnZ2VyIGl0IHdoZW5cbiAgLy8gZGVsZXRpbmcgdGV4dCwgc28gd2UgaWdub3JlIGl0cyBpbnB1dCBldmVudHMuXG4gIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGlzRXZlbnRTdXBwb3J0ZWQoJ2lucHV0JykgJiYgKCFkb2N1bWVudC5kb2N1bWVudE1vZGUgfHwgZG9jdW1lbnQuZG9jdW1lbnRNb2RlID4gOSk7XG59XG5cbi8qKlxuICogKEZvciBJRSA8PTkpIFN0YXJ0cyB0cmFja2luZyBwcm9wZXJ0eWNoYW5nZSBldmVudHMgb24gdGhlIHBhc3NlZC1pbiBlbGVtZW50XG4gKiBhbmQgb3ZlcnJpZGUgdGhlIHZhbHVlIHByb3BlcnR5IHNvIHRoYXQgd2UgY2FuIGRpc3Rpbmd1aXNoIHVzZXIgZXZlbnRzIGZyb21cbiAqIHZhbHVlIGNoYW5nZXMgaW4gSlMuXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0V2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSh0YXJnZXQsIHRhcmdldEluc3QpIHtcbiAgYWN0aXZlRWxlbWVudCA9IHRhcmdldDtcbiAgYWN0aXZlRWxlbWVudEluc3QgPSB0YXJnZXRJbnN0O1xuICBhY3RpdmVFbGVtZW50LmF0dGFjaEV2ZW50KCdvbnByb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UpO1xufVxuXG4vKipcbiAqIChGb3IgSUUgPD05KSBSZW1vdmVzIHRoZSBldmVudCBsaXN0ZW5lcnMgZnJvbSB0aGUgY3VycmVudGx5LXRyYWNrZWQgZWxlbWVudCxcbiAqIGlmIGFueSBleGlzdHMuXG4gKi9cbmZ1bmN0aW9uIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCkge1xuICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYWN0aXZlRWxlbWVudC5kZXRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTtcbiAgYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbn1cblxuLyoqXG4gKiAoRm9yIElFIDw9OSkgSGFuZGxlcyBhIHByb3BlcnR5Y2hhbmdlIGV2ZW50LCBzZW5kaW5nIGEgYGNoYW5nZWAgZXZlbnQgaWZcbiAqIHRoZSB2YWx1ZSBvZiB0aGUgYWN0aXZlIGVsZW1lbnQgaGFzIGNoYW5nZWQuXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZVByb3BlcnR5Q2hhbmdlKG5hdGl2ZUV2ZW50KSB7XG4gIGlmIChuYXRpdmVFdmVudC5wcm9wZXJ0eU5hbWUgIT09ICd2YWx1ZScpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGdldEluc3RJZlZhbHVlQ2hhbmdlZChhY3RpdmVFbGVtZW50SW5zdCkpIHtcbiAgICBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KG5hdGl2ZUV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVFdmVudHNGb3JJbnB1dEV2ZW50UG9seWZpbGwodG9wTGV2ZWxUeXBlLCB0YXJnZXQsIHRhcmdldEluc3QpIHtcbiAgaWYgKHRvcExldmVsVHlwZSA9PT0gVE9QX0ZPQ1VTKSB7XG4gICAgLy8gSW4gSUU5LCBwcm9wZXJ0eWNoYW5nZSBmaXJlcyBmb3IgbW9zdCBpbnB1dCBldmVudHMgYnV0IGlzIGJ1Z2d5IGFuZFxuICAgIC8vIGRvZXNuJ3QgZmlyZSB3aGVuIHRleHQgaXMgZGVsZXRlZCwgYnV0IGNvbnZlbmllbnRseSwgc2VsZWN0aW9uY2hhbmdlXG4gICAgLy8gYXBwZWFycyB0byBmaXJlIGluIGFsbCBvZiB0aGUgcmVtYWluaW5nIGNhc2VzIHNvIHdlIGNhdGNoIHRob3NlIGFuZFxuICAgIC8vIGZvcndhcmQgdGhlIGV2ZW50IGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZFxuICAgIC8vIEluIGVpdGhlciBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIGNhbGwgdGhlIGV2ZW50IGhhbmRsZXIgaWYgdGhlIHZhbHVlXG4gICAgLy8gaXMgY2hhbmdlZCBmcm9tIEpTIHNvIHdlIHJlZGVmaW5lIGEgc2V0dGVyIGZvciBgLnZhbHVlYCB0aGF0IHVwZGF0ZXNcbiAgICAvLyBvdXIgYWN0aXZlRWxlbWVudFZhbHVlIHZhcmlhYmxlLCBhbGxvd2luZyB1cyB0byBpZ25vcmUgdGhvc2UgY2hhbmdlc1xuICAgIC8vXG4gICAgLy8gc3RvcFdhdGNoaW5nKCkgc2hvdWxkIGJlIGEgbm9vcCBoZXJlIGJ1dCB3ZSBjYWxsIGl0IGp1c3QgaW4gY2FzZSB3ZVxuICAgIC8vIG1pc3NlZCBhIGJsdXIgZXZlbnQgc29tZWhvdy5cbiAgICBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpO1xuICAgIHN0YXJ0V2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSh0YXJnZXQsIHRhcmdldEluc3QpO1xuICB9IGVsc2UgaWYgKHRvcExldmVsVHlwZSA9PT0gVE9QX0JMVVIpIHtcbiAgICBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpO1xuICB9XG59XG5cbi8vIEZvciBJRTggYW5kIElFOS5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50UG9seWZpbGwodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0KSB7XG4gIGlmICh0b3BMZXZlbFR5cGUgPT09IFRPUF9TRUxFQ1RJT05fQ0hBTkdFIHx8IHRvcExldmVsVHlwZSA9PT0gVE9QX0tFWV9VUCB8fCB0b3BMZXZlbFR5cGUgPT09IFRPUF9LRVlfRE9XTikge1xuICAgIC8vIE9uIHRoZSBzZWxlY3Rpb25jaGFuZ2UgZXZlbnQsIHRoZSB0YXJnZXQgaXMganVzdCBkb2N1bWVudCB3aGljaCBpc24ndFxuICAgIC8vIGhlbHBmdWwgZm9yIHVzIHNvIGp1c3QgY2hlY2sgYWN0aXZlRWxlbWVudCBpbnN0ZWFkLlxuICAgIC8vXG4gICAgLy8gOTklIG9mIHRoZSB0aW1lLCBrZXlkb3duIGFuZCBrZXl1cCBhcmVuJ3QgbmVjZXNzYXJ5LiBJRTggZmFpbHMgdG8gZmlyZVxuICAgIC8vIHByb3BlcnR5Y2hhbmdlIG9uIHRoZSBmaXJzdCBpbnB1dCBldmVudCBhZnRlciBzZXR0aW5nIGB2YWx1ZWAgZnJvbSBhXG4gICAgLy8gc2NyaXB0IGFuZCBmaXJlcyBvbmx5IGtleWRvd24sIGtleXByZXNzLCBrZXl1cC4gQ2F0Y2hpbmcga2V5dXAgdXN1YWxseVxuICAgIC8vIGdldHMgaXQgYW5kIGNhdGNoaW5nIGtleWRvd24gbGV0cyB1cyBmaXJlIGFuIGV2ZW50IGZvciB0aGUgZmlyc3RcbiAgICAvLyBrZXlzdHJva2UgaWYgdXNlciBkb2VzIGEga2V5IHJlcGVhdCAoaXQnbGwgYmUgYSBsaXR0bGUgZGVsYXllZDogcmlnaHRcbiAgICAvLyBiZWZvcmUgdGhlIHNlY29uZCBrZXlzdHJva2UpLiBPdGhlciBpbnB1dCBtZXRob2RzIChlLmcuLCBwYXN0ZSkgc2VlbSB0b1xuICAgIC8vIGZpcmUgc2VsZWN0aW9uY2hhbmdlIG5vcm1hbGx5LlxuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQoYWN0aXZlRWxlbWVudEluc3QpO1xuICB9XG59XG5cbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBjbGlja2AgZXZlbnRcbiAqL1xuZnVuY3Rpb24gc2hvdWxkVXNlQ2xpY2tFdmVudChlbGVtKSB7XG4gIC8vIFVzZSB0aGUgYGNsaWNrYCBldmVudCB0byBkZXRlY3QgY2hhbmdlcyB0byBjaGVja2JveCBhbmQgcmFkaW8gaW5wdXRzLlxuICAvLyBUaGlzIGFwcHJvYWNoIHdvcmtzIGFjcm9zcyBhbGwgYnJvd3NlcnMsIHdoZXJlYXMgYGNoYW5nZWAgZG9lcyBub3QgZmlyZVxuICAvLyB1bnRpbCBgYmx1cmAgaW4gSUU4LlxuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lO1xuICByZXR1cm4gbm9kZU5hbWUgJiYgbm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiAoZWxlbS50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW0udHlwZSA9PT0gJ3JhZGlvJyk7XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JDbGlja0V2ZW50KHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAodG9wTGV2ZWxUeXBlID09PSBUT1BfQ0xJQ0spIHtcbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0KSB7XG4gIGlmICh0b3BMZXZlbFR5cGUgPT09IFRPUF9JTlBVVCB8fCB0b3BMZXZlbFR5cGUgPT09IFRPUF9DSEFOR0UpIHtcbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUNvbnRyb2xsZWRJbnB1dEJsdXIobm9kZSkge1xuICB2YXIgc3RhdGUgPSBub2RlLl93cmFwcGVyU3RhdGU7XG5cbiAgaWYgKCFzdGF0ZSB8fCAhc3RhdGUuY29udHJvbGxlZCB8fCBub2RlLnR5cGUgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFkaXNhYmxlSW5wdXRBdHRyaWJ1dGVTeW5jaW5nKSB7XG4gICAgLy8gSWYgY29udHJvbGxlZCwgYXNzaWduIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb24gYmx1clxuICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCAnbnVtYmVyJywgbm9kZS52YWx1ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIHBsdWdpbiBjcmVhdGVzIGFuIGBvbkNoYW5nZWAgZXZlbnQgdGhhdCBub3JtYWxpemVzIGNoYW5nZSBldmVudHNcbiAqIGFjcm9zcyBmb3JtIGVsZW1lbnRzLiBUaGlzIGV2ZW50IGZpcmVzIGF0IGEgdGltZSB3aGVuIGl0J3MgcG9zc2libGUgdG9cbiAqIGNoYW5nZSB0aGUgZWxlbWVudCdzIHZhbHVlIHdpdGhvdXQgc2VlaW5nIGEgZmxpY2tlci5cbiAqXG4gKiBTdXBwb3J0ZWQgZWxlbWVudHMgYXJlOlxuICogLSBpbnB1dCAoc2VlIGBpc1RleHRJbnB1dEVsZW1lbnRgKVxuICogLSB0ZXh0YXJlYVxuICogLSBzZWxlY3RcbiAqL1xudmFyIENoYW5nZUV2ZW50UGx1Z2luID0ge1xuICBldmVudFR5cGVzOiBldmVudFR5cGVzJDEsXG5cbiAgX2lzSW5wdXRFdmVudFN1cHBvcnRlZDogaXNJbnB1dEV2ZW50U3VwcG9ydGVkLFxuXG4gIGV4dHJhY3RFdmVudHM6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIHZhciB0YXJnZXROb2RlID0gdGFyZ2V0SW5zdCA/IGdldE5vZGVGcm9tSW5zdGFuY2UkMSh0YXJnZXRJbnN0KSA6IHdpbmRvdztcblxuICAgIHZhciBnZXRUYXJnZXRJbnN0RnVuYyA9IHZvaWQgMCxcbiAgICAgICAgaGFuZGxlRXZlbnRGdW5jID0gdm9pZCAwO1xuICAgIGlmIChzaG91bGRVc2VDaGFuZ2VFdmVudCh0YXJnZXROb2RlKSkge1xuICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9yQ2hhbmdlRXZlbnQ7XG4gICAgfSBlbHNlIGlmIChpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICAgIGlmIChpc0lucHV0RXZlbnRTdXBwb3J0ZWQpIHtcbiAgICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRPckNoYW5nZUV2ZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudFBvbHlmaWxsO1xuICAgICAgICBoYW5kbGVFdmVudEZ1bmMgPSBoYW5kbGVFdmVudHNGb3JJbnB1dEV2ZW50UG9seWZpbGw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzaG91bGRVc2VDbGlja0V2ZW50KHRhcmdldE5vZGUpKSB7XG4gICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDbGlja0V2ZW50O1xuICAgIH1cblxuICAgIGlmIChnZXRUYXJnZXRJbnN0RnVuYykge1xuICAgICAgdmFyIGluc3QgPSBnZXRUYXJnZXRJbnN0RnVuYyh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QpO1xuICAgICAgaWYgKGluc3QpIHtcbiAgICAgICAgdmFyIGV2ZW50ID0gY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICAgIHJldHVybiBldmVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFuZGxlRXZlbnRGdW5jKSB7XG4gICAgICBoYW5kbGVFdmVudEZ1bmModG9wTGV2ZWxUeXBlLCB0YXJnZXROb2RlLCB0YXJnZXRJbnN0KTtcbiAgICB9XG5cbiAgICAvLyBXaGVuIGJsdXJyaW5nLCBzZXQgdGhlIHZhbHVlIGF0dHJpYnV0ZSBmb3IgbnVtYmVyIGlucHV0c1xuICAgIGlmICh0b3BMZXZlbFR5cGUgPT09IFRPUF9CTFVSKSB7XG4gICAgICBoYW5kbGVDb250cm9sbGVkSW5wdXRCbHVyKHRhcmdldE5vZGUpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBNb2R1bGUgdGhhdCBpcyBpbmplY3RhYmxlIGludG8gYEV2ZW50UGx1Z2luSHViYCwgdGhhdCBzcGVjaWZpZXMgYVxuICogZGV0ZXJtaW5pc3RpYyBvcmRlcmluZyBvZiBgRXZlbnRQbHVnaW5gcy4gQSBjb252ZW5pZW50IHdheSB0byByZWFzb24gYWJvdXRcbiAqIHBsdWdpbnMsIHdpdGhvdXQgaGF2aW5nIHRvIHBhY2thZ2UgZXZlcnkgb25lIG9mIHRoZW0uIFRoaXMgaXMgYmV0dGVyIHRoYW5cbiAqIGhhdmluZyBwbHVnaW5zIGJlIG9yZGVyZWQgaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCB0aGV5IGFyZSBpbmplY3RlZCBiZWNhdXNlXG4gKiB0aGF0IG9yZGVyaW5nIHdvdWxkIGJlIGluZmx1ZW5jZWQgYnkgdGhlIHBhY2thZ2luZyBvcmRlci5cbiAqIGBSZXNwb25kZXJFdmVudFBsdWdpbmAgbXVzdCBvY2N1ciBiZWZvcmUgYFNpbXBsZUV2ZW50UGx1Z2luYCBzbyB0aGF0XG4gKiBwcmV2ZW50aW5nIGRlZmF1bHQgb24gZXZlbnRzIGlzIGNvbnZlbmllbnQgaW4gYFNpbXBsZUV2ZW50UGx1Z2luYCBoYW5kbGVycy5cbiAqL1xudmFyIERPTUV2ZW50UGx1Z2luT3JkZXIgPSBbJ1Jlc3BvbmRlckV2ZW50UGx1Z2luJywgJ1NpbXBsZUV2ZW50UGx1Z2luJywgJ0VudGVyTGVhdmVFdmVudFBsdWdpbicsICdDaGFuZ2VFdmVudFBsdWdpbicsICdTZWxlY3RFdmVudFBsdWdpbicsICdCZWZvcmVJbnB1dEV2ZW50UGx1Z2luJ107XG5cbnZhciBTeW50aGV0aWNVSUV2ZW50ID0gU3ludGhldGljRXZlbnQuZXh0ZW5kKHtcbiAgdmlldzogbnVsbCxcbiAgZGV0YWlsOiBudWxsXG59KTtcblxudmFyIG1vZGlmaWVyS2V5VG9Qcm9wID0ge1xuICBBbHQ6ICdhbHRLZXknLFxuICBDb250cm9sOiAnY3RybEtleScsXG4gIE1ldGE6ICdtZXRhS2V5JyxcbiAgU2hpZnQ6ICdzaGlmdEtleSdcbn07XG5cbi8vIE9sZGVyIGJyb3dzZXJzIChTYWZhcmkgPD0gMTAsIGlPUyBTYWZhcmkgPD0gMTAuMikgZG8gbm90IHN1cHBvcnRcbi8vIGdldE1vZGlmaWVyU3RhdGUuIElmIGdldE1vZGlmaWVyU3RhdGUgaXMgbm90IHN1cHBvcnRlZCwgd2UgbWFwIGl0IHRvIGEgc2V0IG9mXG4vLyBtb2RpZmllciBrZXlzIGV4cG9zZWQgYnkgdGhlIGV2ZW50LiBJbiB0aGlzIGNhc2UsIExvY2sta2V5cyBhcmUgbm90IHN1cHBvcnRlZC5cbi8qKlxuICogVHJhbnNsYXRpb24gZnJvbSBtb2RpZmllciBrZXkgdG8gdGhlIGFzc29jaWF0ZWQgcHJvcGVydHkgaW4gdGhlIGV2ZW50LlxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2tleXMtTW9kaWZpZXJzXG4gKi9cblxuZnVuY3Rpb24gbW9kaWZpZXJTdGF0ZUdldHRlcihrZXlBcmcpIHtcbiAgdmFyIHN5bnRoZXRpY0V2ZW50ID0gdGhpcztcbiAgdmFyIG5hdGl2ZUV2ZW50ID0gc3ludGhldGljRXZlbnQubmF0aXZlRXZlbnQ7XG4gIGlmIChuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0YXRlKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUoa2V5QXJnKTtcbiAgfVxuICB2YXIga2V5UHJvcCA9IG1vZGlmaWVyS2V5VG9Qcm9wW2tleUFyZ107XG4gIHJldHVybiBrZXlQcm9wID8gISFuYXRpdmVFdmVudFtrZXlQcm9wXSA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudE1vZGlmaWVyU3RhdGUobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIG1vZGlmaWVyU3RhdGVHZXR0ZXI7XG59XG5cbnZhciBwcmV2aW91c1NjcmVlblggPSAwO1xudmFyIHByZXZpb3VzU2NyZWVuWSA9IDA7XG4vLyBVc2UgZmxhZ3MgdG8gc2lnbmFsIG1vdmVtZW50WC9ZIGhhcyBhbHJlYWR5IGJlZW4gc2V0XG52YXIgaXNNb3ZlbWVudFhTZXQgPSBmYWxzZTtcbnZhciBpc01vdmVtZW50WVNldCA9IGZhbHNlO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgTW91c2VFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cbnZhciBTeW50aGV0aWNNb3VzZUV2ZW50ID0gU3ludGhldGljVUlFdmVudC5leHRlbmQoe1xuICBzY3JlZW5YOiBudWxsLFxuICBzY3JlZW5ZOiBudWxsLFxuICBjbGllbnRYOiBudWxsLFxuICBjbGllbnRZOiBudWxsLFxuICBwYWdlWDogbnVsbCxcbiAgcGFnZVk6IG51bGwsXG4gIGN0cmxLZXk6IG51bGwsXG4gIHNoaWZ0S2V5OiBudWxsLFxuICBhbHRLZXk6IG51bGwsXG4gIG1ldGFLZXk6IG51bGwsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgYnV0dG9uOiBudWxsLFxuICBidXR0b25zOiBudWxsLFxuICByZWxhdGVkVGFyZ2V0OiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQucmVsYXRlZFRhcmdldCB8fCAoZXZlbnQuZnJvbUVsZW1lbnQgPT09IGV2ZW50LnNyY0VsZW1lbnQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudCk7XG4gIH0sXG4gIG1vdmVtZW50WDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKCdtb3ZlbWVudFgnIGluIGV2ZW50KSB7XG4gICAgICByZXR1cm4gZXZlbnQubW92ZW1lbnRYO1xuICAgIH1cblxuICAgIHZhciBzY3JlZW5YID0gcHJldmlvdXNTY3JlZW5YO1xuICAgIHByZXZpb3VzU2NyZWVuWCA9IGV2ZW50LnNjcmVlblg7XG5cbiAgICBpZiAoIWlzTW92ZW1lbnRYU2V0KSB7XG4gICAgICBpc01vdmVtZW50WFNldCA9IHRydWU7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gZXZlbnQudHlwZSA9PT0gJ21vdXNlbW92ZScgPyBldmVudC5zY3JlZW5YIC0gc2NyZWVuWCA6IDA7XG4gIH0sXG4gIG1vdmVtZW50WTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKCdtb3ZlbWVudFknIGluIGV2ZW50KSB7XG4gICAgICByZXR1cm4gZXZlbnQubW92ZW1lbnRZO1xuICAgIH1cblxuICAgIHZhciBzY3JlZW5ZID0gcHJldmlvdXNTY3JlZW5ZO1xuICAgIHByZXZpb3VzU2NyZWVuWSA9IGV2ZW50LnNjcmVlblk7XG5cbiAgICBpZiAoIWlzTW92ZW1lbnRZU2V0KSB7XG4gICAgICBpc01vdmVtZW50WVNldCA9IHRydWU7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gZXZlbnQudHlwZSA9PT0gJ21vdXNlbW92ZScgPyBldmVudC5zY3JlZW5ZIC0gc2NyZWVuWSA6IDA7XG4gIH1cbn0pO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgUG9pbnRlckV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3BvaW50ZXJldmVudHMvXG4gKi9cbnZhciBTeW50aGV0aWNQb2ludGVyRXZlbnQgPSBTeW50aGV0aWNNb3VzZUV2ZW50LmV4dGVuZCh7XG4gIHBvaW50ZXJJZDogbnVsbCxcbiAgd2lkdGg6IG51bGwsXG4gIGhlaWdodDogbnVsbCxcbiAgcHJlc3N1cmU6IG51bGwsXG4gIHRhbmdlbnRpYWxQcmVzc3VyZTogbnVsbCxcbiAgdGlsdFg6IG51bGwsXG4gIHRpbHRZOiBudWxsLFxuICB0d2lzdDogbnVsbCxcbiAgcG9pbnRlclR5cGU6IG51bGwsXG4gIGlzUHJpbWFyeTogbnVsbFxufSk7XG5cbnZhciBldmVudFR5cGVzJDIgPSB7XG4gIG1vdXNlRW50ZXI6IHtcbiAgICByZWdpc3RyYXRpb25OYW1lOiAnb25Nb3VzZUVudGVyJyxcbiAgICBkZXBlbmRlbmNpZXM6IFtUT1BfTU9VU0VfT1VULCBUT1BfTU9VU0VfT1ZFUl1cbiAgfSxcbiAgbW91c2VMZWF2ZToge1xuICAgIHJlZ2lzdHJhdGlvbk5hbWU6ICdvbk1vdXNlTGVhdmUnLFxuICAgIGRlcGVuZGVuY2llczogW1RPUF9NT1VTRV9PVVQsIFRPUF9NT1VTRV9PVkVSXVxuICB9LFxuICBwb2ludGVyRW50ZXI6IHtcbiAgICByZWdpc3RyYXRpb25OYW1lOiAnb25Qb2ludGVyRW50ZXInLFxuICAgIGRlcGVuZGVuY2llczogW1RPUF9QT0lOVEVSX09VVCwgVE9QX1BPSU5URVJfT1ZFUl1cbiAgfSxcbiAgcG9pbnRlckxlYXZlOiB7XG4gICAgcmVnaXN0cmF0aW9uTmFtZTogJ29uUG9pbnRlckxlYXZlJyxcbiAgICBkZXBlbmRlbmNpZXM6IFtUT1BfUE9JTlRFUl9PVVQsIFRPUF9QT0lOVEVSX09WRVJdXG4gIH1cbn07XG5cbnZhciBFbnRlckxlYXZlRXZlbnRQbHVnaW4gPSB7XG4gIGV2ZW50VHlwZXM6IGV2ZW50VHlwZXMkMixcblxuICAvKipcbiAgICogRm9yIGFsbW9zdCBldmVyeSBpbnRlcmFjdGlvbiB3ZSBjYXJlIGFib3V0LCB0aGVyZSB3aWxsIGJlIGJvdGggYSB0b3AtbGV2ZWxcbiAgICogYG1vdXNlb3ZlcmAgYW5kIGBtb3VzZW91dGAgZXZlbnQgdGhhdCBvY2N1cnMuIE9ubHkgdXNlIGBtb3VzZW91dGAgc28gdGhhdFxuICAgKiB3ZSBkbyBub3QgZXh0cmFjdCBkdXBsaWNhdGUgZXZlbnRzLiBIb3dldmVyLCBtb3ZpbmcgdGhlIG1vdXNlIGludG8gdGhlXG4gICAqIGJyb3dzZXIgZnJvbSBvdXRzaWRlIHdpbGwgbm90IGZpcmUgYSBgbW91c2VvdXRgIGV2ZW50LiBJbiB0aGlzIGNhc2UsIHdlIHVzZVxuICAgKiB0aGUgYG1vdXNlb3ZlcmAgdG9wLWxldmVsIGV2ZW50LlxuICAgKi9cbiAgZXh0cmFjdEV2ZW50czogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgdmFyIGlzT3ZlckV2ZW50ID0gdG9wTGV2ZWxUeXBlID09PSBUT1BfTU9VU0VfT1ZFUiB8fCB0b3BMZXZlbFR5cGUgPT09IFRPUF9QT0lOVEVSX09WRVI7XG4gICAgdmFyIGlzT3V0RXZlbnQgPSB0b3BMZXZlbFR5cGUgPT09IFRPUF9NT1VTRV9PVVQgfHwgdG9wTGV2ZWxUeXBlID09PSBUT1BfUE9JTlRFUl9PVVQ7XG5cbiAgICBpZiAoaXNPdmVyRXZlbnQgJiYgKG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQuZnJvbUVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIWlzT3V0RXZlbnQgJiYgIWlzT3ZlckV2ZW50KSB7XG4gICAgICAvLyBNdXN0IG5vdCBiZSBhIG1vdXNlIG9yIHBvaW50ZXIgaW4gb3Igb3V0IC0gaWdub3JpbmcuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgd2luID0gdm9pZCAwO1xuICAgIGlmIChuYXRpdmVFdmVudFRhcmdldC53aW5kb3cgPT09IG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgICAvLyBgbmF0aXZlRXZlbnRUYXJnZXRgIGlzIHByb2JhYmx5IGEgd2luZG93IG9iamVjdC5cbiAgICAgIHdpbiA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoeSBgb3duZXJEb2N1bWVudGAgaXMgc29tZXRpbWVzIHVuZGVmaW5lZCBpbiBJRTguXG4gICAgICB2YXIgZG9jID0gbmF0aXZlRXZlbnRUYXJnZXQub3duZXJEb2N1bWVudDtcbiAgICAgIGlmIChkb2MpIHtcbiAgICAgICAgd2luID0gZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3c7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW4gPSB3aW5kb3c7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGZyb20gPSB2b2lkIDA7XG4gICAgdmFyIHRvID0gdm9pZCAwO1xuICAgIGlmIChpc091dEV2ZW50KSB7XG4gICAgICBmcm9tID0gdGFyZ2V0SW5zdDtcbiAgICAgIHZhciByZWxhdGVkID0gbmF0aXZlRXZlbnQucmVsYXRlZFRhcmdldCB8fCBuYXRpdmVFdmVudC50b0VsZW1lbnQ7XG4gICAgICB0byA9IHJlbGF0ZWQgPyBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShyZWxhdGVkKSA6IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE1vdmluZyB0byBhIG5vZGUgZnJvbSBvdXRzaWRlIHRoZSB3aW5kb3cuXG4gICAgICBmcm9tID0gbnVsbDtcbiAgICAgIHRvID0gdGFyZ2V0SW5zdDtcbiAgICB9XG5cbiAgICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAgIC8vIE5vdGhpbmcgcGVydGFpbnMgdG8gb3VyIG1hbmFnZWQgY29tcG9uZW50cy5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBldmVudEludGVyZmFjZSA9IHZvaWQgMCxcbiAgICAgICAgbGVhdmVFdmVudFR5cGUgPSB2b2lkIDAsXG4gICAgICAgIGVudGVyRXZlbnRUeXBlID0gdm9pZCAwLFxuICAgICAgICBldmVudFR5cGVQcmVmaXggPSB2b2lkIDA7XG5cbiAgICBpZiAodG9wTGV2ZWxUeXBlID09PSBUT1BfTU9VU0VfT1VUIHx8IHRvcExldmVsVHlwZSA9PT0gVE9QX01PVVNFX09WRVIpIHtcbiAgICAgIGV2ZW50SW50ZXJmYWNlID0gU3ludGhldGljTW91c2VFdmVudDtcbiAgICAgIGxlYXZlRXZlbnRUeXBlID0gZXZlbnRUeXBlcyQyLm1vdXNlTGVhdmU7XG4gICAgICBlbnRlckV2ZW50VHlwZSA9IGV2ZW50VHlwZXMkMi5tb3VzZUVudGVyO1xuICAgICAgZXZlbnRUeXBlUHJlZml4ID0gJ21vdXNlJztcbiAgICB9IGVsc2UgaWYgKHRvcExldmVsVHlwZSA9PT0gVE9QX1BPSU5URVJfT1VUIHx8IHRvcExldmVsVHlwZSA9PT0gVE9QX1BPSU5URVJfT1ZFUikge1xuICAgICAgZXZlbnRJbnRlcmZhY2UgPSBTeW50aGV0aWNQb2ludGVyRXZlbnQ7XG4gICAgICBsZWF2ZUV2ZW50VHlwZSA9IGV2ZW50VHlwZXMkMi5wb2ludGVyTGVhdmU7XG4gICAgICBlbnRlckV2ZW50VHlwZSA9IGV2ZW50VHlwZXMkMi5wb2ludGVyRW50ZXI7XG4gICAgICBldmVudFR5cGVQcmVmaXggPSAncG9pbnRlcic7XG4gICAgfVxuXG4gICAgdmFyIGZyb21Ob2RlID0gZnJvbSA9PSBudWxsID8gd2luIDogZ2V0Tm9kZUZyb21JbnN0YW5jZSQxKGZyb20pO1xuICAgIHZhciB0b05vZGUgPSB0byA9PSBudWxsID8gd2luIDogZ2V0Tm9kZUZyb21JbnN0YW5jZSQxKHRvKTtcblxuICAgIHZhciBsZWF2ZSA9IGV2ZW50SW50ZXJmYWNlLmdldFBvb2xlZChsZWF2ZUV2ZW50VHlwZSwgZnJvbSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBsZWF2ZS50eXBlID0gZXZlbnRUeXBlUHJlZml4ICsgJ2xlYXZlJztcbiAgICBsZWF2ZS50YXJnZXQgPSBmcm9tTm9kZTtcbiAgICBsZWF2ZS5yZWxhdGVkVGFyZ2V0ID0gdG9Ob2RlO1xuXG4gICAgdmFyIGVudGVyID0gZXZlbnRJbnRlcmZhY2UuZ2V0UG9vbGVkKGVudGVyRXZlbnRUeXBlLCB0bywgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBlbnRlci50eXBlID0gZXZlbnRUeXBlUHJlZml4ICsgJ2VudGVyJztcbiAgICBlbnRlci50YXJnZXQgPSB0b05vZGU7XG4gICAgZW50ZXIucmVsYXRlZFRhcmdldCA9IGZyb21Ob2RlO1xuXG4gICAgYWNjdW11bGF0ZUVudGVyTGVhdmVEaXNwYXRjaGVzKGxlYXZlLCBlbnRlciwgZnJvbSwgdG8pO1xuXG4gICAgcmV0dXJuIFtsZWF2ZSwgZW50ZXJdO1xuICB9XG59O1xuXG4vKipcbiAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBvd25cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuICovXG5mdW5jdGlvbiBpcyh4LCB5KSB7XG4gIHJldHVybiB4ID09PSB5ICYmICh4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geSkgfHwgeCAhPT0geCAmJiB5ICE9PSB5IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIDtcbn1cblxudmFyIGhhc093blByb3BlcnR5JDEgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFBlcmZvcm1zIGVxdWFsaXR5IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGtleXMgb24gYW4gb2JqZWN0IGFuZCByZXR1cm5pbmcgZmFsc2VcbiAqIHdoZW4gYW55IGtleSBoYXMgdmFsdWVzIHdoaWNoIGFyZSBub3Qgc3RyaWN0bHkgZXF1YWwgYmV0d2VlbiB0aGUgYXJndW1lbnRzLlxuICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHZhbHVlcyBvZiBhbGwga2V5cyBhcmUgc3RyaWN0bHkgZXF1YWwuXG4gKi9cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gIGlmIChpcyhvYmpBLCBvYmpCKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSAnb2JqZWN0JyB8fCBvYmpBID09PSBudWxsIHx8IHR5cGVvZiBvYmpCICE9PSAnb2JqZWN0JyB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRlc3QgZm9yIEEncyBrZXlzIGRpZmZlcmVudCBmcm9tIEIuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5c0EubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWhhc093blByb3BlcnR5JDEuY2FsbChvYmpCLCBrZXlzQVtpXSkgfHwgIWlzKG9iakFba2V5c0FbaV1dLCBvYmpCW2tleXNBW2ldXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBgUmVhY3RJbnN0YW5jZU1hcGAgbWFpbnRhaW5zIGEgbWFwcGluZyBmcm9tIGEgcHVibGljIGZhY2luZyBzdGF0ZWZ1bFxuICogaW5zdGFuY2UgKGtleSkgYW5kIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAodmFsdWUpLiBUaGlzIGFsbG93cyBwdWJsaWNcbiAqIG1ldGhvZHMgdG8gYWNjZXB0IHRoZSB1c2VyIGZhY2luZyBpbnN0YW5jZSBhcyBhbiBhcmd1bWVudCBhbmQgbWFwIHRoZW0gYmFja1xuICogdG8gaW50ZXJuYWwgbWV0aG9kcy5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBtb2R1bGUgaXMgY3VycmVudGx5IHNoYXJlZCBhbmQgYXNzdW1lZCB0byBiZSBzdGF0ZWxlc3MuXG4gKiBJZiB0aGlzIGJlY29tZXMgYW4gYWN0dWFsIE1hcCwgdGhhdCB3aWxsIGJyZWFrLlxuICovXG5cbi8qKlxuICogVGhpcyBBUEkgc2hvdWxkIGJlIGNhbGxlZCBgZGVsZXRlYCBidXQgd2UnZCBoYXZlIHRvIG1ha2Ugc3VyZSB0byBhbHdheXNcbiAqIHRyYW5zZm9ybSB0aGVzZSB0byBzdHJpbmdzIGZvciBJRSBzdXBwb3J0LiBXaGVuIHRoaXMgdHJhbnNmb3JtIGlzIGZ1bGx5XG4gKiBzdXBwb3J0ZWQgd2UgY2FuIHJlbmFtZSBpdC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldChrZXkpIHtcbiAgcmV0dXJuIGtleS5fcmVhY3RJbnRlcm5hbEZpYmVyO1xufVxuXG5mdW5jdGlvbiBoYXMoa2V5KSB7XG4gIHJldHVybiBrZXkuX3JlYWN0SW50ZXJuYWxGaWJlciAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICBrZXkuX3JlYWN0SW50ZXJuYWxGaWJlciA9IHZhbHVlO1xufVxuXG4vLyBEb24ndCBjaGFuZ2UgdGhlc2UgdHdvIHZhbHVlcy4gVGhleSdyZSB1c2VkIGJ5IFJlYWN0IERldiBUb29scy5cbnZhciBOb0VmZmVjdCA9IC8qICAgICAgICAgICAgICAqLzA7XG52YXIgUGVyZm9ybWVkV29yayA9IC8qICAgICAgICAgKi8xO1xuXG4vLyBZb3UgY2FuIGNoYW5nZSB0aGUgcmVzdCAoYW5kIGFkZCBtb3JlKS5cbnZhciBQbGFjZW1lbnQgPSAvKiAgICAgICAgICAgICAqLzI7XG52YXIgVXBkYXRlID0gLyogICAgICAgICAgICAgICAgKi80O1xudmFyIFBsYWNlbWVudEFuZFVwZGF0ZSA9IC8qICAgICovNjtcbnZhciBEZWxldGlvbiA9IC8qICAgICAgICAgICAgICAqLzg7XG52YXIgQ29udGVudFJlc2V0ID0gLyogICAgICAgICAgKi8xNjtcbnZhciBDYWxsYmFjayA9IC8qICAgICAgICAgICAgICAqLzMyO1xudmFyIERpZENhcHR1cmUgPSAvKiAgICAgICAgICAgICovNjQ7XG52YXIgUmVmID0gLyogICAgICAgICAgICAgICAgICAgKi8xMjg7XG52YXIgU25hcHNob3QgPSAvKiAgICAgICAgICAgICAgKi8yNTY7XG52YXIgUGFzc2l2ZSA9IC8qICAgICAgICAgICAgICAgKi81MTI7XG5cbi8vIFBhc3NpdmUgJiBVcGRhdGUgJiBDYWxsYmFjayAmIFJlZiAmIFNuYXBzaG90XG52YXIgTGlmZWN5Y2xlRWZmZWN0TWFzayA9IC8qICAgKi85MzI7XG5cbi8vIFVuaW9uIG9mIGFsbCBob3N0IGVmZmVjdHNcbnZhciBIb3N0RWZmZWN0TWFzayA9IC8qICAgICAgICAqLzEwMjM7XG5cbnZhciBJbmNvbXBsZXRlID0gLyogICAgICAgICAgICAqLzEwMjQ7XG52YXIgU2hvdWxkQ2FwdHVyZSA9IC8qICAgICAgICAgKi8yMDQ4O1xuXG52YXIgUmVhY3RDdXJyZW50T3duZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xuXG52YXIgTU9VTlRJTkcgPSAxO1xudmFyIE1PVU5URUQgPSAyO1xudmFyIFVOTU9VTlRFRCA9IDM7XG5cbmZ1bmN0aW9uIGlzRmliZXJNb3VudGVkSW1wbChmaWJlcikge1xuICB2YXIgbm9kZSA9IGZpYmVyO1xuICBpZiAoIWZpYmVyLmFsdGVybmF0ZSkge1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIGFsdGVybmF0ZSwgdGhpcyBtaWdodCBiZSBhIG5ldyB0cmVlIHRoYXQgaXNuJ3QgaW5zZXJ0ZWRcbiAgICAvLyB5ZXQuIElmIGl0IGlzLCB0aGVuIGl0IHdpbGwgaGF2ZSBhIHBlbmRpbmcgaW5zZXJ0aW9uIGVmZmVjdCBvbiBpdC5cbiAgICBpZiAoKG5vZGUuZWZmZWN0VGFnICYgUGxhY2VtZW50KSAhPT0gTm9FZmZlY3QpIHtcbiAgICAgIHJldHVybiBNT1VOVElORztcbiAgICB9XG4gICAgd2hpbGUgKG5vZGUucmV0dXJuKSB7XG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICBpZiAoKG5vZGUuZWZmZWN0VGFnICYgUGxhY2VtZW50KSAhPT0gTm9FZmZlY3QpIHtcbiAgICAgICAgcmV0dXJuIE1PVU5USU5HO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAobm9kZS5yZXR1cm4pIHtcbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG4gIH1cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Um9vdCkge1xuICAgIC8vIFRPRE86IENoZWNrIGlmIHRoaXMgd2FzIGEgbmVzdGVkIEhvc3RSb290IHdoZW4gdXNlZCB3aXRoXG4gICAgLy8gcmVuZGVyQ29udGFpbmVySW50b1N1YnRyZWUuXG4gICAgcmV0dXJuIE1PVU5URUQ7XG4gIH1cbiAgLy8gSWYgd2UgZGlkbid0IGhpdCB0aGUgcm9vdCwgdGhhdCBtZWFucyB0aGF0IHdlJ3JlIGluIGFuIGRpc2Nvbm5lY3RlZCB0cmVlXG4gIC8vIHRoYXQgaGFzIGJlZW4gdW5tb3VudGVkLlxuICByZXR1cm4gVU5NT1VOVEVEO1xufVxuXG5mdW5jdGlvbiBpc0ZpYmVyTW91bnRlZChmaWJlcikge1xuICByZXR1cm4gaXNGaWJlck1vdW50ZWRJbXBsKGZpYmVyKSA9PT0gTU9VTlRFRDtcbn1cblxuZnVuY3Rpb24gaXNNb3VudGVkKGNvbXBvbmVudCkge1xuICB7XG4gICAgdmFyIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50O1xuICAgIGlmIChvd25lciAhPT0gbnVsbCAmJiBvd25lci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICB2YXIgb3duZXJGaWJlciA9IG93bmVyO1xuICAgICAgdmFyIGluc3RhbmNlID0gb3duZXJGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAhaW5zdGFuY2UuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnJXMgaXMgYWNjZXNzaW5nIGlzTW91bnRlZCBpbnNpZGUgaXRzIHJlbmRlcigpIGZ1bmN0aW9uLiAnICsgJ3JlbmRlcigpIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLiBJdCBzaG91bGQgJyArICduZXZlciBhY2Nlc3Mgc29tZXRoaW5nIHRoYXQgcmVxdWlyZXMgc3RhbGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyAnICsgJ3JlbmRlciwgc3VjaCBhcyByZWZzLiBNb3ZlIHRoaXMgbG9naWMgdG8gY29tcG9uZW50RGlkTW91bnQgYW5kICcgKyAnY29tcG9uZW50RGlkVXBkYXRlIGluc3RlYWQuJywgZ2V0Q29tcG9uZW50TmFtZShvd25lckZpYmVyLnR5cGUpIHx8ICdBIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgaW5zdGFuY2UuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQoY29tcG9uZW50KTtcbiAgaWYgKCFmaWJlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gaXNGaWJlck1vdW50ZWRJbXBsKGZpYmVyKSA9PT0gTU9VTlRFRDtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0SXNNb3VudGVkKGZpYmVyKSB7XG4gICEoaXNGaWJlck1vdW50ZWRJbXBsKGZpYmVyKSA9PT0gTU9VTlRFRCkgPyBpbnZhcmlhbnQoZmFsc2UsICdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJykgOiB2b2lkIDA7XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoKGZpYmVyKSB7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG4gIGlmICghYWx0ZXJuYXRlKSB7XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gYWx0ZXJuYXRlLCB0aGVuIHdlIG9ubHkgbmVlZCB0byBjaGVjayBpZiBpdCBpcyBtb3VudGVkLlxuICAgIHZhciBzdGF0ZSA9IGlzRmliZXJNb3VudGVkSW1wbChmaWJlcik7XG4gICAgIShzdGF0ZSAhPT0gVU5NT1VOVEVEKSA/IGludmFyaWFudChmYWxzZSwgJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKSA6IHZvaWQgMDtcbiAgICBpZiAoc3RhdGUgPT09IE1PVU5USU5HKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZpYmVyO1xuICB9XG4gIC8vIElmIHdlIGhhdmUgdHdvIHBvc3NpYmxlIGJyYW5jaGVzLCB3ZSdsbCB3YWxrIGJhY2t3YXJkcyB1cCB0byB0aGUgcm9vdFxuICAvLyB0byBzZWUgd2hhdCBwYXRoIHRoZSByb290IHBvaW50cyB0by4gT24gdGhlIHdheSB3ZSBtYXkgaGl0IG9uZSBvZiB0aGVcbiAgLy8gc3BlY2lhbCBjYXNlcyBhbmQgd2UnbGwgZGVhbCB3aXRoIHRoZW0uXG4gIHZhciBhID0gZmliZXI7XG4gIHZhciBiID0gYWx0ZXJuYXRlO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBwYXJlbnRBID0gYS5yZXR1cm47XG4gICAgdmFyIHBhcmVudEIgPSBwYXJlbnRBID8gcGFyZW50QS5hbHRlcm5hdGUgOiBudWxsO1xuICAgIGlmICghcGFyZW50QSB8fCAhcGFyZW50Qikge1xuICAgICAgLy8gV2UncmUgYXQgdGhlIHJvb3QuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyBJZiBib3RoIGNvcGllcyBvZiB0aGUgcGFyZW50IGZpYmVyIHBvaW50IHRvIHRoZSBzYW1lIGNoaWxkLCB3ZSBjYW5cbiAgICAvLyBhc3N1bWUgdGhhdCB0aGUgY2hpbGQgaXMgY3VycmVudC4gVGhpcyBoYXBwZW5zIHdoZW4gd2UgYmFpbG91dCBvbiBsb3dcbiAgICAvLyBwcmlvcml0eTogdGhlIGJhaWxlZCBvdXQgZmliZXIncyBjaGlsZCByZXVzZXMgdGhlIGN1cnJlbnQgY2hpbGQuXG4gICAgaWYgKHBhcmVudEEuY2hpbGQgPT09IHBhcmVudEIuY2hpbGQpIHtcbiAgICAgIHZhciBjaGlsZCA9IHBhcmVudEEuY2hpbGQ7XG4gICAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgICAgaWYgKGNoaWxkID09PSBhKSB7XG4gICAgICAgICAgLy8gV2UndmUgZGV0ZXJtaW5lZCB0aGF0IEEgaXMgdGhlIGN1cnJlbnQgYnJhbmNoLlxuICAgICAgICAgIGFzc2VydElzTW91bnRlZChwYXJlbnRBKTtcbiAgICAgICAgICByZXR1cm4gZmliZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkID09PSBiKSB7XG4gICAgICAgICAgLy8gV2UndmUgZGV0ZXJtaW5lZCB0aGF0IEIgaXMgdGhlIGN1cnJlbnQgYnJhbmNoLlxuICAgICAgICAgIGFzc2VydElzTW91bnRlZChwYXJlbnRBKTtcbiAgICAgICAgICByZXR1cm4gYWx0ZXJuYXRlO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgIH1cbiAgICAgIC8vIFdlIHNob3VsZCBuZXZlciBoYXZlIGFuIGFsdGVybmF0ZSBmb3IgYW55IG1vdW50aW5nIG5vZGUuIFNvIHRoZSBvbmx5XG4gICAgICAvLyB3YXkgdGhpcyBjb3VsZCBwb3NzaWJseSBoYXBwZW4gaXMgaWYgdGhpcyB3YXMgdW5tb3VudGVkLCBpZiBhdCBhbGwuXG4gICAgICBpbnZhcmlhbnQoZmFsc2UsICdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKGEucmV0dXJuICE9PSBiLnJldHVybikge1xuICAgICAgLy8gVGhlIHJldHVybiBwb2ludGVyIG9mIEEgYW5kIHRoZSByZXR1cm4gcG9pbnRlciBvZiBCIHBvaW50IHRvIGRpZmZlcmVudFxuICAgICAgLy8gZmliZXJzLiBXZSBhc3N1bWUgdGhhdCByZXR1cm4gcG9pbnRlcnMgbmV2ZXIgY3Jpc3MtY3Jvc3MsIHNvIEEgbXVzdFxuICAgICAgLy8gYmVsb25nIHRvIHRoZSBjaGlsZCBzZXQgb2YgQS5yZXR1cm4sIGFuZCBCIG11c3QgYmVsb25nIHRvIHRoZSBjaGlsZFxuICAgICAgLy8gc2V0IG9mIEIucmV0dXJuLlxuICAgICAgYSA9IHBhcmVudEE7XG4gICAgICBiID0gcGFyZW50QjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHJldHVybiBwb2ludGVycyBwb2ludCB0byB0aGUgc2FtZSBmaWJlci4gV2UnbGwgaGF2ZSB0byB1c2UgdGhlXG4gICAgICAvLyBkZWZhdWx0LCBzbG93IHBhdGg6IHNjYW4gdGhlIGNoaWxkIHNldHMgb2YgZWFjaCBwYXJlbnQgYWx0ZXJuYXRlIHRvIHNlZVxuICAgICAgLy8gd2hpY2ggY2hpbGQgYmVsb25ncyB0byB3aGljaCBzZXQuXG4gICAgICAvL1xuICAgICAgLy8gU2VhcmNoIHBhcmVudCBBJ3MgY2hpbGQgc2V0XG4gICAgICB2YXIgZGlkRmluZENoaWxkID0gZmFsc2U7XG4gICAgICB2YXIgX2NoaWxkID0gcGFyZW50QS5jaGlsZDtcbiAgICAgIHdoaWxlIChfY2hpbGQpIHtcbiAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkge1xuICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgYSA9IHBhcmVudEE7XG4gICAgICAgICAgYiA9IHBhcmVudEI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9jaGlsZCA9PT0gYikge1xuICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgYiA9IHBhcmVudEE7XG4gICAgICAgICAgYSA9IHBhcmVudEI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7XG4gICAgICB9XG4gICAgICBpZiAoIWRpZEZpbmRDaGlsZCkge1xuICAgICAgICAvLyBTZWFyY2ggcGFyZW50IEIncyBjaGlsZCBzZXRcbiAgICAgICAgX2NoaWxkID0gcGFyZW50Qi5jaGlsZDtcbiAgICAgICAgd2hpbGUgKF9jaGlsZCkge1xuICAgICAgICAgIGlmIChfY2hpbGQgPT09IGEpIHtcbiAgICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgICBhID0gcGFyZW50QjtcbiAgICAgICAgICAgIGIgPSBwYXJlbnRBO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChfY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgICBiID0gcGFyZW50QjtcbiAgICAgICAgICAgIGEgPSBwYXJlbnRBO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgICFkaWRGaW5kQ2hpbGQgPyBpbnZhcmlhbnQoZmFsc2UsICdDaGlsZCB3YXMgbm90IGZvdW5kIGluIGVpdGhlciBwYXJlbnQgc2V0LiBUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiBSZWFjdCByZWxhdGVkIHRvIHRoZSByZXR1cm4gcG9pbnRlci4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJykgOiB2b2lkIDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgIShhLmFsdGVybmF0ZSA9PT0gYikgPyBpbnZhcmlhbnQoZmFsc2UsICdSZXR1cm4gZmliZXJzIHNob3VsZCBhbHdheXMgYmUgZWFjaCBvdGhlcnNcXCcgYWx0ZXJuYXRlcy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKSA6IHZvaWQgMDtcbiAgfVxuICAvLyBJZiB0aGUgcm9vdCBpcyBub3QgYSBob3N0IGNvbnRhaW5lciwgd2UncmUgaW4gYSBkaXNjb25uZWN0ZWQgdHJlZS4gSS5lLlxuICAvLyB1bm1vdW50ZWQuXG4gICEoYS50YWcgPT09IEhvc3RSb290KSA/IGludmFyaWFudChmYWxzZSwgJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKSA6IHZvaWQgMDtcbiAgaWYgKGEuc3RhdGVOb2RlLmN1cnJlbnQgPT09IGEpIHtcbiAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQSBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgcmV0dXJuIGZpYmVyO1xuICB9XG4gIC8vIE90aGVyd2lzZSBCIGhhcyB0byBiZSBjdXJyZW50IGJyYW5jaC5cbiAgcmV0dXJuIGFsdGVybmF0ZTtcbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRIb3N0RmliZXIocGFyZW50KSB7XG4gIHZhciBjdXJyZW50UGFyZW50ID0gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgocGFyZW50KTtcbiAgaWYgKCFjdXJyZW50UGFyZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBOZXh0IHdlJ2xsIGRyaWxsIGRvd24gdGhpcyBjb21wb25lbnQgdG8gZmluZCB0aGUgZmlyc3QgSG9zdENvbXBvbmVudC9UZXh0LlxuICB2YXIgbm9kZSA9IGN1cnJlbnRQYXJlbnQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAobm9kZSA9PT0gY3VycmVudFBhcmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHdoaWxlICghbm9kZS5zaWJsaW5nKSB7XG4gICAgICBpZiAoIW5vZGUucmV0dXJuIHx8IG5vZGUucmV0dXJuID09PSBjdXJyZW50UGFyZW50KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxuICAvLyBGbG93IG5lZWRzIHRoZSByZXR1cm4gbnVsbCBoZXJlLCBidXQgRVNMaW50IGNvbXBsYWlucyBhYm91dCBpdC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVucmVhY2hhYmxlXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHMocGFyZW50KSB7XG4gIHZhciBjdXJyZW50UGFyZW50ID0gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgocGFyZW50KTtcbiAgaWYgKCFjdXJyZW50UGFyZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBOZXh0IHdlJ2xsIGRyaWxsIGRvd24gdGhpcyBjb21wb25lbnQgdG8gZmluZCB0aGUgZmlyc3QgSG9zdENvbXBvbmVudC9UZXh0LlxuICB2YXIgbm9kZSA9IGN1cnJlbnRQYXJlbnQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICYmIG5vZGUudGFnICE9PSBIb3N0UG9ydGFsKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAobm9kZSA9PT0gY3VycmVudFBhcmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHdoaWxlICghbm9kZS5zaWJsaW5nKSB7XG4gICAgICBpZiAoIW5vZGUucmV0dXJuIHx8IG5vZGUucmV0dXJuID09PSBjdXJyZW50UGFyZW50KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxuICAvLyBGbG93IG5lZWRzIHRoZSByZXR1cm4gbnVsbCBoZXJlLCBidXQgRVNMaW50IGNvbXBsYWlucyBhYm91dCBpdC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVucmVhY2hhYmxlXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBhZGRFdmVudEJ1YmJsZUxpc3RlbmVyKGVsZW1lbnQsIGV2ZW50VHlwZSwgbGlzdGVuZXIpIHtcbiAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXIoZWxlbWVudCwgZXZlbnRUeXBlLCBsaXN0ZW5lcikge1xuICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgdHJ1ZSk7XG59XG5cbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWFuaW1hdGlvbnMvI0FuaW1hdGlvbkV2ZW50LWludGVyZmFjZVxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQW5pbWF0aW9uRXZlbnRcbiAqL1xudmFyIFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50ID0gU3ludGhldGljRXZlbnQuZXh0ZW5kKHtcbiAgYW5pbWF0aW9uTmFtZTogbnVsbCxcbiAgZWxhcHNlZFRpbWU6IG51bGwsXG4gIHBzZXVkb0VsZW1lbnQ6IG51bGxcbn0pO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvY2xpcGJvYXJkLWFwaXMvXG4gKi9cbnZhciBTeW50aGV0aWNDbGlwYm9hcmRFdmVudCA9IFN5bnRoZXRpY0V2ZW50LmV4dGVuZCh7XG4gIGNsaXBib2FyZERhdGE6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnY2xpcGJvYXJkRGF0YScgaW4gZXZlbnQgPyBldmVudC5jbGlwYm9hcmREYXRhIDogd2luZG93LmNsaXBib2FyZERhdGE7XG4gIH1cbn0pO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRm9jdXNFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cbnZhciBTeW50aGV0aWNGb2N1c0V2ZW50ID0gU3ludGhldGljVUlFdmVudC5leHRlbmQoe1xuICByZWxhdGVkVGFyZ2V0OiBudWxsXG59KTtcblxuLyoqXG4gKiBgY2hhckNvZGVgIHJlcHJlc2VudHMgdGhlIGFjdHVhbCBcImNoYXJhY3RlciBjb2RlXCIgYW5kIGlzIHNhZmUgdG8gdXNlIHdpdGhcbiAqIGBTdHJpbmcuZnJvbUNoYXJDb2RlYC4gQXMgc3VjaCwgb25seSBrZXlzIHRoYXQgY29ycmVzcG9uZCB0byBwcmludGFibGVcbiAqIGNoYXJhY3RlcnMgcHJvZHVjZSBhIHZhbGlkIGBjaGFyQ29kZWAsIHRoZSBvbmx5IGV4Y2VwdGlvbiB0byB0aGlzIGlzIEVudGVyLlxuICogVGhlIFRhYi1rZXkgaXMgY29uc2lkZXJlZCBub24tcHJpbnRhYmxlIGFuZCBkb2VzIG5vdCBoYXZlIGEgYGNoYXJDb2RlYCxcbiAqIHByZXN1bWFibHkgYmVjYXVzZSBpdCBkb2VzIG5vdCBwcm9kdWNlIGEgdGFiLWNoYXJhY3RlciBpbiBicm93c2Vycy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IE5vcm1hbGl6ZWQgYGNoYXJDb2RlYCBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkge1xuICB2YXIgY2hhckNvZGUgPSB2b2lkIDA7XG4gIHZhciBrZXlDb2RlID0gbmF0aXZlRXZlbnQua2V5Q29kZTtcblxuICBpZiAoJ2NoYXJDb2RlJyBpbiBuYXRpdmVFdmVudCkge1xuICAgIGNoYXJDb2RlID0gbmF0aXZlRXZlbnQuY2hhckNvZGU7XG5cbiAgICAvLyBGRiBkb2VzIG5vdCBzZXQgYGNoYXJDb2RlYCBmb3IgdGhlIEVudGVyLWtleSwgY2hlY2sgYWdhaW5zdCBga2V5Q29kZWAuXG4gICAgaWYgKGNoYXJDb2RlID09PSAwICYmIGtleUNvZGUgPT09IDEzKSB7XG4gICAgICBjaGFyQ29kZSA9IDEzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJRTggZG9lcyBub3QgaW1wbGVtZW50IGBjaGFyQ29kZWAsIGJ1dCBga2V5Q29kZWAgaGFzIHRoZSBjb3JyZWN0IHZhbHVlLlxuICAgIGNoYXJDb2RlID0ga2V5Q29kZTtcbiAgfVxuXG4gIC8vIElFIGFuZCBFZGdlIChvbiBXaW5kb3dzKSBhbmQgQ2hyb21lIC8gU2FmYXJpIChvbiBXaW5kb3dzIGFuZCBMaW51eClcbiAgLy8gcmVwb3J0IEVudGVyIGFzIGNoYXJDb2RlIDEwIHdoZW4gY3RybCBpcyBwcmVzc2VkLlxuICBpZiAoY2hhckNvZGUgPT09IDEwKSB7XG4gICAgY2hhckNvZGUgPSAxMztcbiAgfVxuXG4gIC8vIFNvbWUgbm9uLXByaW50YWJsZSBrZXlzIGFyZSByZXBvcnRlZCBpbiBgY2hhckNvZGVgL2BrZXlDb2RlYCwgZGlzY2FyZCB0aGVtLlxuICAvLyBNdXN0IG5vdCBkaXNjYXJkIHRoZSAobm9uLSlwcmludGFibGUgRW50ZXIta2V5LlxuICBpZiAoY2hhckNvZGUgPj0gMzIgfHwgY2hhckNvZGUgPT09IDEzKSB7XG4gICAgcmV0dXJuIGNoYXJDb2RlO1xuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbi8qKlxuICogTm9ybWFsaXphdGlvbiBvZiBkZXByZWNhdGVkIEhUTUw1IGBrZXlgIHZhbHVlc1xuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudCNLZXlfbmFtZXNcbiAqL1xudmFyIG5vcm1hbGl6ZUtleSA9IHtcbiAgRXNjOiAnRXNjYXBlJyxcbiAgU3BhY2ViYXI6ICcgJyxcbiAgTGVmdDogJ0Fycm93TGVmdCcsXG4gIFVwOiAnQXJyb3dVcCcsXG4gIFJpZ2h0OiAnQXJyb3dSaWdodCcsXG4gIERvd246ICdBcnJvd0Rvd24nLFxuICBEZWw6ICdEZWxldGUnLFxuICBXaW46ICdPUycsXG4gIE1lbnU6ICdDb250ZXh0TWVudScsXG4gIEFwcHM6ICdDb250ZXh0TWVudScsXG4gIFNjcm9sbDogJ1Njcm9sbExvY2snLFxuICBNb3pQcmludGFibGVLZXk6ICdVbmlkZW50aWZpZWQnXG59O1xuXG4vKipcbiAqIFRyYW5zbGF0aW9uIGZyb20gbGVnYWN5IGBrZXlDb2RlYCB0byBIVE1MNSBga2V5YFxuICogT25seSBzcGVjaWFsIGtleXMgc3VwcG9ydGVkLCBhbGwgb3RoZXJzIGRlcGVuZCBvbiBrZXlib2FyZCBsYXlvdXQgb3IgYnJvd3NlclxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudCNLZXlfbmFtZXNcbiAqL1xudmFyIHRyYW5zbGF0ZVRvS2V5ID0ge1xuICAnOCc6ICdCYWNrc3BhY2UnLFxuICAnOSc6ICdUYWInLFxuICAnMTInOiAnQ2xlYXInLFxuICAnMTMnOiAnRW50ZXInLFxuICAnMTYnOiAnU2hpZnQnLFxuICAnMTcnOiAnQ29udHJvbCcsXG4gICcxOCc6ICdBbHQnLFxuICAnMTknOiAnUGF1c2UnLFxuICAnMjAnOiAnQ2Fwc0xvY2snLFxuICAnMjcnOiAnRXNjYXBlJyxcbiAgJzMyJzogJyAnLFxuICAnMzMnOiAnUGFnZVVwJyxcbiAgJzM0JzogJ1BhZ2VEb3duJyxcbiAgJzM1JzogJ0VuZCcsXG4gICczNic6ICdIb21lJyxcbiAgJzM3JzogJ0Fycm93TGVmdCcsXG4gICczOCc6ICdBcnJvd1VwJyxcbiAgJzM5JzogJ0Fycm93UmlnaHQnLFxuICAnNDAnOiAnQXJyb3dEb3duJyxcbiAgJzQ1JzogJ0luc2VydCcsXG4gICc0Nic6ICdEZWxldGUnLFxuICAnMTEyJzogJ0YxJyxcbiAgJzExMyc6ICdGMicsXG4gICcxMTQnOiAnRjMnLFxuICAnMTE1JzogJ0Y0JyxcbiAgJzExNic6ICdGNScsXG4gICcxMTcnOiAnRjYnLFxuICAnMTE4JzogJ0Y3JyxcbiAgJzExOSc6ICdGOCcsXG4gICcxMjAnOiAnRjknLFxuICAnMTIxJzogJ0YxMCcsXG4gICcxMjInOiAnRjExJyxcbiAgJzEyMyc6ICdGMTInLFxuICAnMTQ0JzogJ051bUxvY2snLFxuICAnMTQ1JzogJ1Njcm9sbExvY2snLFxuICAnMjI0JzogJ01ldGEnXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge3N0cmluZ30gTm9ybWFsaXplZCBga2V5YCBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gZ2V0RXZlbnRLZXkobmF0aXZlRXZlbnQpIHtcbiAgaWYgKG5hdGl2ZUV2ZW50LmtleSkge1xuICAgIC8vIE5vcm1hbGl6ZSBpbmNvbnNpc3RlbnQgdmFsdWVzIHJlcG9ydGVkIGJ5IGJyb3dzZXJzIGR1ZSB0b1xuICAgIC8vIGltcGxlbWVudGF0aW9ucyBvZiBhIHdvcmtpbmcgZHJhZnQgc3BlY2lmaWNhdGlvbi5cblxuICAgIC8vIEZpcmVGb3ggaW1wbGVtZW50cyBga2V5YCBidXQgcmV0dXJucyBgTW96UHJpbnRhYmxlS2V5YCBmb3IgYWxsXG4gICAgLy8gcHJpbnRhYmxlIGNoYXJhY3RlcnMgKG5vcm1hbGl6ZWQgdG8gYFVuaWRlbnRpZmllZGApLCBpZ25vcmUgaXQuXG4gICAgdmFyIGtleSA9IG5vcm1hbGl6ZUtleVtuYXRpdmVFdmVudC5rZXldIHx8IG5hdGl2ZUV2ZW50LmtleTtcbiAgICBpZiAoa2V5ICE9PSAnVW5pZGVudGlmaWVkJykge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cblxuICAvLyBCcm93c2VyIGRvZXMgbm90IGltcGxlbWVudCBga2V5YCwgcG9seWZpbGwgYXMgbXVjaCBvZiBpdCBhcyB3ZSBjYW4uXG4gIGlmIChuYXRpdmVFdmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgdmFyIGNoYXJDb2RlID0gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCk7XG5cbiAgICAvLyBUaGUgZW50ZXIta2V5IGlzIHRlY2huaWNhbGx5IGJvdGggcHJpbnRhYmxlIGFuZCBub24tcHJpbnRhYmxlIGFuZCBjYW5cbiAgICAvLyB0aHVzIGJlIGNhcHR1cmVkIGJ5IGBrZXlwcmVzc2AsIG5vIG90aGVyIG5vbi1wcmludGFibGUga2V5IHNob3VsZC5cbiAgICByZXR1cm4gY2hhckNvZGUgPT09IDEzID8gJ0VudGVyJyA6IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICB9XG4gIGlmIChuYXRpdmVFdmVudC50eXBlID09PSAna2V5ZG93bicgfHwgbmF0aXZlRXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgIC8vIFdoaWxlIHVzZXIga2V5Ym9hcmQgbGF5b3V0IGRldGVybWluZXMgdGhlIGFjdHVhbCBtZWFuaW5nIG9mIGVhY2hcbiAgICAvLyBga2V5Q29kZWAgdmFsdWUsIGFsbW9zdCBhbGwgZnVuY3Rpb24ga2V5cyBoYXZlIGEgdW5pdmVyc2FsIHZhbHVlLlxuICAgIHJldHVybiB0cmFuc2xhdGVUb0tleVtuYXRpdmVFdmVudC5rZXlDb2RlXSB8fCAnVW5pZGVudGlmaWVkJztcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogQGludGVyZmFjZSBLZXlib2FyZEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xudmFyIFN5bnRoZXRpY0tleWJvYXJkRXZlbnQgPSBTeW50aGV0aWNVSUV2ZW50LmV4dGVuZCh7XG4gIGtleTogZ2V0RXZlbnRLZXksXG4gIGxvY2F0aW9uOiBudWxsLFxuICBjdHJsS2V5OiBudWxsLFxuICBzaGlmdEtleTogbnVsbCxcbiAgYWx0S2V5OiBudWxsLFxuICBtZXRhS2V5OiBudWxsLFxuICByZXBlYXQ6IG51bGwsXG4gIGxvY2FsZTogbnVsbCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlLFxuICAvLyBMZWdhY3kgSW50ZXJmYWNlXG4gIGNoYXJDb2RlOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBgY2hhckNvZGVgIGlzIHRoZSByZXN1bHQgb2YgYSBLZXlQcmVzcyBldmVudCBhbmQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2ZcbiAgICAvLyB0aGUgYWN0dWFsIHByaW50YWJsZSBjaGFyYWN0ZXIuXG5cbiAgICAvLyBLZXlQcmVzcyBpcyBkZXByZWNhdGVkLCBidXQgaXRzIHJlcGxhY2VtZW50IGlzIG5vdCB5ZXQgZmluYWwgYW5kIG5vdFxuICAgIC8vIGltcGxlbWVudGVkIGluIGFueSBtYWpvciBicm93c2VyLiBPbmx5IEtleVByZXNzIGhhcyBjaGFyQ29kZS5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgcmV0dXJuIGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAga2V5Q29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYGtleUNvZGVgIGlzIHRoZSByZXN1bHQgb2YgYSBLZXlEb3duL1VwIGV2ZW50IGFuZCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZlxuICAgIC8vIHBoeXNpY2FsIGtleWJvYXJkIGtleS5cblxuICAgIC8vIFRoZSBhY3R1YWwgbWVhbmluZyBvZiB0aGUgdmFsdWUgZGVwZW5kcyBvbiB0aGUgdXNlcnMnIGtleWJvYXJkIGxheW91dFxuICAgIC8vIHdoaWNoIGNhbm5vdCBiZSBkZXRlY3RlZC4gQXNzdW1pbmcgdGhhdCBpdCBpcyBhIFVTIGtleWJvYXJkIGxheW91dFxuICAgIC8vIHByb3ZpZGVzIGEgc3VycHJpc2luZ2x5IGFjY3VyYXRlIG1hcHBpbmcgZm9yIFVTIGFuZCBFdXJvcGVhbiB1c2Vycy5cbiAgICAvLyBEdWUgdG8gdGhpcywgaXQgaXMgbGVmdCB0byB0aGUgdXNlciB0byBpbXBsZW1lbnQgYXQgdGhpcyB0aW1lLlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5ZG93bicgfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgICAgcmV0dXJuIGV2ZW50LmtleUNvZGU7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9LFxuICB3aGljaDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYHdoaWNoYCBpcyBhbiBhbGlhcyBmb3IgZWl0aGVyIGBrZXlDb2RlYCBvciBgY2hhckNvZGVgIGRlcGVuZGluZyBvbiB0aGVcbiAgICAvLyB0eXBlIG9mIHRoZSBldmVudC5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgcmV0dXJuIGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpO1xuICAgIH1cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgIHJldHVybiBldmVudC5rZXlDb2RlO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxufSk7XG5cbi8qKlxuICogQGludGVyZmFjZSBEcmFnRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG52YXIgU3ludGhldGljRHJhZ0V2ZW50ID0gU3ludGhldGljTW91c2VFdmVudC5leHRlbmQoe1xuICBkYXRhVHJhbnNmZXI6IG51bGxcbn0pO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgVG91Y2hFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi90b3VjaC1ldmVudHMvXG4gKi9cbnZhciBTeW50aGV0aWNUb3VjaEV2ZW50ID0gU3ludGhldGljVUlFdmVudC5leHRlbmQoe1xuICB0b3VjaGVzOiBudWxsLFxuICB0YXJnZXRUb3VjaGVzOiBudWxsLFxuICBjaGFuZ2VkVG91Y2hlczogbnVsbCxcbiAgYWx0S2V5OiBudWxsLFxuICBtZXRhS2V5OiBudWxsLFxuICBjdHJsS2V5OiBudWxsLFxuICBzaGlmdEtleTogbnVsbCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlXG59KTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDkvV0QtY3NzMy10cmFuc2l0aW9ucy0yMDA5MDMyMC8jdHJhbnNpdGlvbi1ldmVudHMtXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9UcmFuc2l0aW9uRXZlbnRcbiAqL1xudmFyIFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudCA9IFN5bnRoZXRpY0V2ZW50LmV4dGVuZCh7XG4gIHByb3BlcnR5TmFtZTogbnVsbCxcbiAgZWxhcHNlZFRpbWU6IG51bGwsXG4gIHBzZXVkb0VsZW1lbnQ6IG51bGxcbn0pO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgV2hlZWxFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cbnZhciBTeW50aGV0aWNXaGVlbEV2ZW50ID0gU3ludGhldGljTW91c2VFdmVudC5leHRlbmQoe1xuICBkZWx0YVg6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnZGVsdGFYJyBpbiBldmVudCA/IGV2ZW50LmRlbHRhWCA6IC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhWGAgZm9yIFdlYmtpdCBhbmQgbm9ybWFsaXplIChyaWdodCBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGFYJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhWCA6IDA7XG4gIH0sXG4gIGRlbHRhWTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdkZWx0YVknIGluIGV2ZW50ID8gZXZlbnQuZGVsdGFZIDogLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFZYCBmb3IgV2Via2l0IGFuZCBub3JtYWxpemUgKGRvd24gaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhWScgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YVkgOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YWAgZm9yIElFPDkgYW5kIG5vcm1hbGl6ZSAoZG93biBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGEnIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGEgOiAwO1xuICB9LFxuXG4gIGRlbHRhWjogbnVsbCxcblxuICAvLyBCcm93c2VycyB3aXRob3V0IFwiZGVsdGFNb2RlXCIgaXMgcmVwb3J0aW5nIGluIHJhdyB3aGVlbCBkZWx0YSB3aGVyZSBvbmVcbiAgLy8gbm90Y2ggb24gdGhlIHNjcm9sbCBpcyBhbHdheXMgKy8tIDEyMCwgcm91Z2hseSBlcXVpdmFsZW50IHRvIHBpeGVscy5cbiAgLy8gQSBnb29kIGFwcHJveGltYXRpb24gb2YgRE9NX0RFTFRBX0xJTkUgKDEpIGlzIDUlIG9mIHZpZXdwb3J0IHNpemUgb3JcbiAgLy8gfjQwIHBpeGVscywgZm9yIERPTV9ERUxUQV9TQ1JFRU4gKDIpIGl0IGlzIDg3LjUlIG9mIHZpZXdwb3J0IHNpemUuXG4gIGRlbHRhTW9kZTogbnVsbFxufSk7XG5cbi8qKlxuICogVHVybnNcbiAqIFsnYWJvcnQnLCAuLi5dXG4gKiBpbnRvXG4gKiBldmVudFR5cGVzID0ge1xuICogICAnYWJvcnQnOiB7XG4gKiAgICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHtcbiAqICAgICAgIGJ1YmJsZWQ6ICdvbkFib3J0JyxcbiAqICAgICAgIGNhcHR1cmVkOiAnb25BYm9ydENhcHR1cmUnLFxuICogICAgIH0sXG4gKiAgICAgZGVwZW5kZW5jaWVzOiBbVE9QX0FCT1JUXSxcbiAqICAgfSxcbiAqICAgLi4uXG4gKiB9O1xuICogdG9wTGV2ZWxFdmVudHNUb0Rpc3BhdGNoQ29uZmlnID0gbmV3IE1hcChbXG4gKiAgIFtUT1BfQUJPUlQsIHsgc2FtZUNvbmZpZyB9XSxcbiAqIF0pO1xuICovXG5cbnZhciBpbnRlcmFjdGl2ZUV2ZW50VHlwZU5hbWVzID0gW1tUT1BfQkxVUiwgJ2JsdXInXSwgW1RPUF9DQU5DRUwsICdjYW5jZWwnXSwgW1RPUF9DTElDSywgJ2NsaWNrJ10sIFtUT1BfQ0xPU0UsICdjbG9zZSddLCBbVE9QX0NPTlRFWFRfTUVOVSwgJ2NvbnRleHRNZW51J10sIFtUT1BfQ09QWSwgJ2NvcHknXSwgW1RPUF9DVVQsICdjdXQnXSwgW1RPUF9BVVhfQ0xJQ0ssICdhdXhDbGljayddLCBbVE9QX0RPVUJMRV9DTElDSywgJ2RvdWJsZUNsaWNrJ10sIFtUT1BfRFJBR19FTkQsICdkcmFnRW5kJ10sIFtUT1BfRFJBR19TVEFSVCwgJ2RyYWdTdGFydCddLCBbVE9QX0RST1AsICdkcm9wJ10sIFtUT1BfRk9DVVMsICdmb2N1cyddLCBbVE9QX0lOUFVULCAnaW5wdXQnXSwgW1RPUF9JTlZBTElELCAnaW52YWxpZCddLCBbVE9QX0tFWV9ET1dOLCAna2V5RG93biddLCBbVE9QX0tFWV9QUkVTUywgJ2tleVByZXNzJ10sIFtUT1BfS0VZX1VQLCAna2V5VXAnXSwgW1RPUF9NT1VTRV9ET1dOLCAnbW91c2VEb3duJ10sIFtUT1BfTU9VU0VfVVAsICdtb3VzZVVwJ10sIFtUT1BfUEFTVEUsICdwYXN0ZSddLCBbVE9QX1BBVVNFLCAncGF1c2UnXSwgW1RPUF9QTEFZLCAncGxheSddLCBbVE9QX1BPSU5URVJfQ0FOQ0VMLCAncG9pbnRlckNhbmNlbCddLCBbVE9QX1BPSU5URVJfRE9XTiwgJ3BvaW50ZXJEb3duJ10sIFtUT1BfUE9JTlRFUl9VUCwgJ3BvaW50ZXJVcCddLCBbVE9QX1JBVEVfQ0hBTkdFLCAncmF0ZUNoYW5nZSddLCBbVE9QX1JFU0VULCAncmVzZXQnXSwgW1RPUF9TRUVLRUQsICdzZWVrZWQnXSwgW1RPUF9TVUJNSVQsICdzdWJtaXQnXSwgW1RPUF9UT1VDSF9DQU5DRUwsICd0b3VjaENhbmNlbCddLCBbVE9QX1RPVUNIX0VORCwgJ3RvdWNoRW5kJ10sIFtUT1BfVE9VQ0hfU1RBUlQsICd0b3VjaFN0YXJ0J10sIFtUT1BfVk9MVU1FX0NIQU5HRSwgJ3ZvbHVtZUNoYW5nZSddXTtcbnZhciBub25JbnRlcmFjdGl2ZUV2ZW50VHlwZU5hbWVzID0gW1tUT1BfQUJPUlQsICdhYm9ydCddLCBbVE9QX0FOSU1BVElPTl9FTkQsICdhbmltYXRpb25FbmQnXSwgW1RPUF9BTklNQVRJT05fSVRFUkFUSU9OLCAnYW5pbWF0aW9uSXRlcmF0aW9uJ10sIFtUT1BfQU5JTUFUSU9OX1NUQVJULCAnYW5pbWF0aW9uU3RhcnQnXSwgW1RPUF9DQU5fUExBWSwgJ2NhblBsYXknXSwgW1RPUF9DQU5fUExBWV9USFJPVUdILCAnY2FuUGxheVRocm91Z2gnXSwgW1RPUF9EUkFHLCAnZHJhZyddLCBbVE9QX0RSQUdfRU5URVIsICdkcmFnRW50ZXInXSwgW1RPUF9EUkFHX0VYSVQsICdkcmFnRXhpdCddLCBbVE9QX0RSQUdfTEVBVkUsICdkcmFnTGVhdmUnXSwgW1RPUF9EUkFHX09WRVIsICdkcmFnT3ZlciddLCBbVE9QX0RVUkFUSU9OX0NIQU5HRSwgJ2R1cmF0aW9uQ2hhbmdlJ10sIFtUT1BfRU1QVElFRCwgJ2VtcHRpZWQnXSwgW1RPUF9FTkNSWVBURUQsICdlbmNyeXB0ZWQnXSwgW1RPUF9FTkRFRCwgJ2VuZGVkJ10sIFtUT1BfRVJST1IsICdlcnJvciddLCBbVE9QX0dPVF9QT0lOVEVSX0NBUFRVUkUsICdnb3RQb2ludGVyQ2FwdHVyZSddLCBbVE9QX0xPQUQsICdsb2FkJ10sIFtUT1BfTE9BREVEX0RBVEEsICdsb2FkZWREYXRhJ10sIFtUT1BfTE9BREVEX01FVEFEQVRBLCAnbG9hZGVkTWV0YWRhdGEnXSwgW1RPUF9MT0FEX1NUQVJULCAnbG9hZFN0YXJ0J10sIFtUT1BfTE9TVF9QT0lOVEVSX0NBUFRVUkUsICdsb3N0UG9pbnRlckNhcHR1cmUnXSwgW1RPUF9NT1VTRV9NT1ZFLCAnbW91c2VNb3ZlJ10sIFtUT1BfTU9VU0VfT1VULCAnbW91c2VPdXQnXSwgW1RPUF9NT1VTRV9PVkVSLCAnbW91c2VPdmVyJ10sIFtUT1BfUExBWUlORywgJ3BsYXlpbmcnXSwgW1RPUF9QT0lOVEVSX01PVkUsICdwb2ludGVyTW92ZSddLCBbVE9QX1BPSU5URVJfT1VULCAncG9pbnRlck91dCddLCBbVE9QX1BPSU5URVJfT1ZFUiwgJ3BvaW50ZXJPdmVyJ10sIFtUT1BfUFJPR1JFU1MsICdwcm9ncmVzcyddLCBbVE9QX1NDUk9MTCwgJ3Njcm9sbCddLCBbVE9QX1NFRUtJTkcsICdzZWVraW5nJ10sIFtUT1BfU1RBTExFRCwgJ3N0YWxsZWQnXSwgW1RPUF9TVVNQRU5ELCAnc3VzcGVuZCddLCBbVE9QX1RJTUVfVVBEQVRFLCAndGltZVVwZGF0ZSddLCBbVE9QX1RPR0dMRSwgJ3RvZ2dsZSddLCBbVE9QX1RPVUNIX01PVkUsICd0b3VjaE1vdmUnXSwgW1RPUF9UUkFOU0lUSU9OX0VORCwgJ3RyYW5zaXRpb25FbmQnXSwgW1RPUF9XQUlUSU5HLCAnd2FpdGluZyddLCBbVE9QX1dIRUVMLCAnd2hlZWwnXV07XG5cbnZhciBldmVudFR5cGVzJDQgPSB7fTtcbnZhciB0b3BMZXZlbEV2ZW50c1RvRGlzcGF0Y2hDb25maWcgPSB7fTtcblxuZnVuY3Rpb24gYWRkRXZlbnRUeXBlTmFtZVRvQ29uZmlnKF9yZWYsIGlzSW50ZXJhY3RpdmUpIHtcbiAgdmFyIHRvcEV2ZW50ID0gX3JlZlswXSxcbiAgICAgIGV2ZW50ID0gX3JlZlsxXTtcblxuICB2YXIgY2FwaXRhbGl6ZWRFdmVudCA9IGV2ZW50WzBdLnRvVXBwZXJDYXNlKCkgKyBldmVudC5zbGljZSgxKTtcbiAgdmFyIG9uRXZlbnQgPSAnb24nICsgY2FwaXRhbGl6ZWRFdmVudDtcblxuICB2YXIgdHlwZSA9IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogb25FdmVudCxcbiAgICAgIGNhcHR1cmVkOiBvbkV2ZW50ICsgJ0NhcHR1cmUnXG4gICAgfSxcbiAgICBkZXBlbmRlbmNpZXM6IFt0b3BFdmVudF0sXG4gICAgaXNJbnRlcmFjdGl2ZTogaXNJbnRlcmFjdGl2ZVxuICB9O1xuICBldmVudFR5cGVzJDRbZXZlbnRdID0gdHlwZTtcbiAgdG9wTGV2ZWxFdmVudHNUb0Rpc3BhdGNoQ29uZmlnW3RvcEV2ZW50XSA9IHR5cGU7XG59XG5cbmludGVyYWN0aXZlRXZlbnRUeXBlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnRUdXBsZSkge1xuICBhZGRFdmVudFR5cGVOYW1lVG9Db25maWcoZXZlbnRUdXBsZSwgdHJ1ZSk7XG59KTtcbm5vbkludGVyYWN0aXZlRXZlbnRUeXBlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnRUdXBsZSkge1xuICBhZGRFdmVudFR5cGVOYW1lVG9Db25maWcoZXZlbnRUdXBsZSwgZmFsc2UpO1xufSk7XG5cbi8vIE9ubHkgdXNlZCBpbiBERVYgZm9yIGV4aGF1c3RpdmVuZXNzIHZhbGlkYXRpb24uXG52YXIga25vd25IVE1MVG9wTGV2ZWxUeXBlcyA9IFtUT1BfQUJPUlQsIFRPUF9DQU5DRUwsIFRPUF9DQU5fUExBWSwgVE9QX0NBTl9QTEFZX1RIUk9VR0gsIFRPUF9DTE9TRSwgVE9QX0RVUkFUSU9OX0NIQU5HRSwgVE9QX0VNUFRJRUQsIFRPUF9FTkNSWVBURUQsIFRPUF9FTkRFRCwgVE9QX0VSUk9SLCBUT1BfSU5QVVQsIFRPUF9JTlZBTElELCBUT1BfTE9BRCwgVE9QX0xPQURFRF9EQVRBLCBUT1BfTE9BREVEX01FVEFEQVRBLCBUT1BfTE9BRF9TVEFSVCwgVE9QX1BBVVNFLCBUT1BfUExBWSwgVE9QX1BMQVlJTkcsIFRPUF9QUk9HUkVTUywgVE9QX1JBVEVfQ0hBTkdFLCBUT1BfUkVTRVQsIFRPUF9TRUVLRUQsIFRPUF9TRUVLSU5HLCBUT1BfU1RBTExFRCwgVE9QX1NVQk1JVCwgVE9QX1NVU1BFTkQsIFRPUF9USU1FX1VQREFURSwgVE9QX1RPR0dMRSwgVE9QX1ZPTFVNRV9DSEFOR0UsIFRPUF9XQUlUSU5HXTtcblxudmFyIFNpbXBsZUV2ZW50UGx1Z2luID0ge1xuICBldmVudFR5cGVzOiBldmVudFR5cGVzJDQsXG5cbiAgaXNJbnRlcmFjdGl2ZVRvcExldmVsRXZlbnRUeXBlOiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlKSB7XG4gICAgdmFyIGNvbmZpZyA9IHRvcExldmVsRXZlbnRzVG9EaXNwYXRjaENvbmZpZ1t0b3BMZXZlbFR5cGVdO1xuICAgIHJldHVybiBjb25maWcgIT09IHVuZGVmaW5lZCAmJiBjb25maWcuaXNJbnRlcmFjdGl2ZSA9PT0gdHJ1ZTtcbiAgfSxcblxuXG4gIGV4dHJhY3RFdmVudHM6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIHZhciBkaXNwYXRjaENvbmZpZyA9IHRvcExldmVsRXZlbnRzVG9EaXNwYXRjaENvbmZpZ1t0b3BMZXZlbFR5cGVdO1xuICAgIGlmICghZGlzcGF0Y2hDb25maWcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgRXZlbnRDb25zdHJ1Y3RvciA9IHZvaWQgMDtcbiAgICBzd2l0Y2ggKHRvcExldmVsVHlwZSkge1xuICAgICAgY2FzZSBUT1BfS0VZX1BSRVNTOlxuICAgICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBrZXlwcmVzcyBldmVudCBmb3IgZnVuY3Rpb24ga2V5cyB0b28uIFRoaXMgcmVtb3Zlc1xuICAgICAgICAvLyB0aGUgdW53YW50ZWQga2V5cHJlc3MgZXZlbnRzLiBFbnRlciBpcyBob3dldmVyIGJvdGggcHJpbnRhYmxlIGFuZFxuICAgICAgICAvLyBub24tcHJpbnRhYmxlLiBPbmUgd291bGQgZXhwZWN0IFRhYiB0byBiZSBhcyB3ZWxsIChidXQgaXQgaXNuJ3QpLlxuICAgICAgICBpZiAoZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBUT1BfS0VZX0RPV046XG4gICAgICBjYXNlIFRPUF9LRVlfVVA6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNLZXlib2FyZEV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVE9QX0JMVVI6XG4gICAgICBjYXNlIFRPUF9GT0NVUzpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUT1BfQ0xJQ0s6XG4gICAgICAgIC8vIEZpcmVmb3ggY3JlYXRlcyBhIGNsaWNrIGV2ZW50IG9uIHJpZ2h0IG1vdXNlIGNsaWNrcy4gVGhpcyByZW1vdmVzIHRoZVxuICAgICAgICAvLyB1bndhbnRlZCBjbGljayBldmVudHMuXG4gICAgICAgIGlmIChuYXRpdmVFdmVudC5idXR0b24gPT09IDIpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBUT1BfQVVYX0NMSUNLOlxuICAgICAgY2FzZSBUT1BfRE9VQkxFX0NMSUNLOlxuICAgICAgY2FzZSBUT1BfTU9VU0VfRE9XTjpcbiAgICAgIGNhc2UgVE9QX01PVVNFX01PVkU6XG4gICAgICBjYXNlIFRPUF9NT1VTRV9VUDpcbiAgICAgIC8vIFRPRE86IERpc2FibGVkIGVsZW1lbnRzIHNob3VsZCBub3QgcmVzcG9uZCB0byBtb3VzZSBldmVudHNcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgVE9QX01PVVNFX09VVDpcbiAgICAgIGNhc2UgVE9QX01PVVNFX09WRVI6XG4gICAgICBjYXNlIFRPUF9DT05URVhUX01FTlU6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNNb3VzZUV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVE9QX0RSQUc6XG4gICAgICBjYXNlIFRPUF9EUkFHX0VORDpcbiAgICAgIGNhc2UgVE9QX0RSQUdfRU5URVI6XG4gICAgICBjYXNlIFRPUF9EUkFHX0VYSVQ6XG4gICAgICBjYXNlIFRPUF9EUkFHX0xFQVZFOlxuICAgICAgY2FzZSBUT1BfRFJBR19PVkVSOlxuICAgICAgY2FzZSBUT1BfRFJBR19TVEFSVDpcbiAgICAgIGNhc2UgVE9QX0RST1A6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNEcmFnRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUT1BfVE9VQ0hfQ0FOQ0VMOlxuICAgICAgY2FzZSBUT1BfVE9VQ0hfRU5EOlxuICAgICAgY2FzZSBUT1BfVE9VQ0hfTU9WRTpcbiAgICAgIGNhc2UgVE9QX1RPVUNIX1NUQVJUOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljVG91Y2hFdmVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRPUF9BTklNQVRJT05fRU5EOlxuICAgICAgY2FzZSBUT1BfQU5JTUFUSU9OX0lURVJBVElPTjpcbiAgICAgIGNhc2UgVE9QX0FOSU1BVElPTl9TVEFSVDpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVE9QX1RSQU5TSVRJT05fRU5EOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljVHJhbnNpdGlvbkV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVE9QX1NDUk9MTDpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY1VJRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUT1BfV0hFRUw6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNXaGVlbEV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVE9QX0NPUFk6XG4gICAgICBjYXNlIFRPUF9DVVQ6XG4gICAgICBjYXNlIFRPUF9QQVNURTpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVE9QX0dPVF9QT0lOVEVSX0NBUFRVUkU6XG4gICAgICBjYXNlIFRPUF9MT1NUX1BPSU5URVJfQ0FQVFVSRTpcbiAgICAgIGNhc2UgVE9QX1BPSU5URVJfQ0FOQ0VMOlxuICAgICAgY2FzZSBUT1BfUE9JTlRFUl9ET1dOOlxuICAgICAgY2FzZSBUT1BfUE9JTlRFUl9NT1ZFOlxuICAgICAgY2FzZSBUT1BfUE9JTlRFUl9PVVQ6XG4gICAgICBjYXNlIFRPUF9QT0lOVEVSX09WRVI6XG4gICAgICBjYXNlIFRPUF9QT0lOVEVSX1VQOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljUG9pbnRlckV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoa25vd25IVE1MVG9wTGV2ZWxUeXBlcy5pbmRleE9mKHRvcExldmVsVHlwZSkgPT09IC0xKSB7XG4gICAgICAgICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdTaW1wbGVFdmVudFBsdWdpbjogVW5oYW5kbGVkIGV2ZW50IHR5cGUsIGAlc2AuIFRoaXMgd2FybmluZyAnICsgJ2lzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicsIHRvcExldmVsVHlwZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhUTUwgRXZlbnRzXG4gICAgICAgIC8vIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUvaW5kZXguaHRtbCNldmVudHMtMFxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgZXZlbnQgPSBFdmVudENvbnN0cnVjdG9yLmdldFBvb2xlZChkaXNwYXRjaENvbmZpZywgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50KTtcbiAgICByZXR1cm4gZXZlbnQ7XG4gIH1cbn07XG5cbnZhciBpc0ludGVyYWN0aXZlVG9wTGV2ZWxFdmVudFR5cGUgPSBTaW1wbGVFdmVudFBsdWdpbi5pc0ludGVyYWN0aXZlVG9wTGV2ZWxFdmVudFR5cGU7XG5cblxudmFyIENBTExCQUNLX0JPT0tLRUVQSU5HX1BPT0xfU0laRSA9IDEwO1xudmFyIGNhbGxiYWNrQm9va2tlZXBpbmdQb29sID0gW107XG5cbi8qKlxuICogRmluZCB0aGUgZGVlcGVzdCBSZWFjdCBjb21wb25lbnQgY29tcGxldGVseSBjb250YWluaW5nIHRoZSByb290IG9mIHRoZVxuICogcGFzc2VkLWluIGluc3RhbmNlIChmb3IgdXNlIHdoZW4gZW50aXJlIFJlYWN0IHRyZWVzIGFyZSBuZXN0ZWQgd2l0aGluIGVhY2hcbiAqIG90aGVyKS4gSWYgUmVhY3QgdHJlZXMgYXJlIG5vdCBuZXN0ZWQsIHJldHVybnMgbnVsbC5cbiAqL1xuZnVuY3Rpb24gZmluZFJvb3RDb250YWluZXJOb2RlKGluc3QpIHtcbiAgLy8gVE9ETzogSXQgbWF5IGJlIGEgZ29vZCBpZGVhIHRvIGNhY2hlIHRoaXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSBET01cbiAgLy8gdHJhdmVyc2FsLCBidXQgY2FjaGluZyBpcyBkaWZmaWN1bHQgdG8gZG8gY29ycmVjdGx5IHdpdGhvdXQgdXNpbmcgYVxuICAvLyBtdXRhdGlvbiBvYnNlcnZlciB0byBsaXN0ZW4gZm9yIGFsbCBET00gY2hhbmdlcy5cbiAgd2hpbGUgKGluc3QucmV0dXJuKSB7XG4gICAgaW5zdCA9IGluc3QucmV0dXJuO1xuICB9XG4gIGlmIChpbnN0LnRhZyAhPT0gSG9zdFJvb3QpIHtcbiAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgd2UncmUgaW4gYSBkZXRhY2hlZCB0cmVlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBpbnN0LnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xufVxuXG4vLyBVc2VkIHRvIHN0b3JlIGFuY2VzdG9yIGhpZXJhcmNoeSBpbiB0b3AgbGV2ZWwgY2FsbGJhY2tcbmZ1bmN0aW9uIGdldFRvcExldmVsQ2FsbGJhY2tCb29rS2VlcGluZyh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50LCB0YXJnZXRJbnN0KSB7XG4gIGlmIChjYWxsYmFja0Jvb2trZWVwaW5nUG9vbC5sZW5ndGgpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBjYWxsYmFja0Jvb2trZWVwaW5nUG9vbC5wb3AoKTtcbiAgICBpbnN0YW5jZS50b3BMZXZlbFR5cGUgPSB0b3BMZXZlbFR5cGU7XG4gICAgaW5zdGFuY2UubmF0aXZlRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICBpbnN0YW5jZS50YXJnZXRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0b3BMZXZlbFR5cGU6IHRvcExldmVsVHlwZSxcbiAgICBuYXRpdmVFdmVudDogbmF0aXZlRXZlbnQsXG4gICAgdGFyZ2V0SW5zdDogdGFyZ2V0SW5zdCxcbiAgICBhbmNlc3RvcnM6IFtdXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlbGVhc2VUb3BMZXZlbENhbGxiYWNrQm9va0tlZXBpbmcoaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UudG9wTGV2ZWxUeXBlID0gbnVsbDtcbiAgaW5zdGFuY2UubmF0aXZlRXZlbnQgPSBudWxsO1xuICBpbnN0YW5jZS50YXJnZXRJbnN0ID0gbnVsbDtcbiAgaW5zdGFuY2UuYW5jZXN0b3JzLmxlbmd0aCA9IDA7XG4gIGlmIChjYWxsYmFja0Jvb2trZWVwaW5nUG9vbC5sZW5ndGggPCBDQUxMQkFDS19CT09LS0VFUElOR19QT09MX1NJWkUpIHtcbiAgICBjYWxsYmFja0Jvb2trZWVwaW5nUG9vbC5wdXNoKGluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVUb3BMZXZlbChib29rS2VlcGluZykge1xuICB2YXIgdGFyZ2V0SW5zdCA9IGJvb2tLZWVwaW5nLnRhcmdldEluc3Q7XG5cbiAgLy8gTG9vcCB0aHJvdWdoIHRoZSBoaWVyYXJjaHksIGluIGNhc2UgdGhlcmUncyBhbnkgbmVzdGVkIGNvbXBvbmVudHMuXG4gIC8vIEl0J3MgaW1wb3J0YW50IHRoYXQgd2UgYnVpbGQgdGhlIGFycmF5IG9mIGFuY2VzdG9ycyBiZWZvcmUgY2FsbGluZyBhbnlcbiAgLy8gZXZlbnQgaGFuZGxlcnMsIGJlY2F1c2UgZXZlbnQgaGFuZGxlcnMgY2FuIG1vZGlmeSB0aGUgRE9NLCBsZWFkaW5nIHRvXG4gIC8vIGluY29uc2lzdGVuY2llcyB3aXRoIFJlYWN0TW91bnQncyBub2RlIGNhY2hlLiBTZWUgIzExMDUuXG4gIHZhciBhbmNlc3RvciA9IHRhcmdldEluc3Q7XG4gIGRvIHtcbiAgICBpZiAoIWFuY2VzdG9yKSB7XG4gICAgICBib29rS2VlcGluZy5hbmNlc3RvcnMucHVzaChhbmNlc3Rvcik7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIHJvb3QgPSBmaW5kUm9vdENvbnRhaW5lck5vZGUoYW5jZXN0b3IpO1xuICAgIGlmICghcm9vdCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGJvb2tLZWVwaW5nLmFuY2VzdG9ycy5wdXNoKGFuY2VzdG9yKTtcbiAgICBhbmNlc3RvciA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHJvb3QpO1xuICB9IHdoaWxlIChhbmNlc3Rvcik7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBib29rS2VlcGluZy5hbmNlc3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICB0YXJnZXRJbnN0ID0gYm9va0tlZXBpbmcuYW5jZXN0b3JzW2ldO1xuICAgIHJ1bkV4dHJhY3RlZEV2ZW50c0luQmF0Y2goYm9va0tlZXBpbmcudG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBib29rS2VlcGluZy5uYXRpdmVFdmVudCwgZ2V0RXZlbnRUYXJnZXQoYm9va0tlZXBpbmcubmF0aXZlRXZlbnQpKTtcbiAgfVxufVxuXG4vLyBUT0RPOiBjYW4gd2Ugc3RvcCBleHBvcnRpbmcgdGhlc2U/XG52YXIgX2VuYWJsZWQgPSB0cnVlO1xuXG5mdW5jdGlvbiBzZXRFbmFibGVkKGVuYWJsZWQpIHtcbiAgX2VuYWJsZWQgPSAhIWVuYWJsZWQ7XG59XG5cbmZ1bmN0aW9uIGlzRW5hYmxlZCgpIHtcbiAgcmV0dXJuIF9lbmFibGVkO1xufVxuXG4vKipcbiAqIFRyYXBzIHRvcC1sZXZlbCBldmVudHMgYnkgdXNpbmcgZXZlbnQgYnViYmxpbmcuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHRvcExldmVsVHlwZSBOdW1iZXIgZnJvbSBgVG9wTGV2ZWxFdmVudFR5cGVzYC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBlbGVtZW50IEVsZW1lbnQgb24gd2hpY2ggdG8gYXR0YWNoIGxpc3RlbmVyLlxuICogQHJldHVybiB7P29iamVjdH0gQW4gb2JqZWN0IHdpdGggYSByZW1vdmUgZnVuY3Rpb24gd2hpY2ggd2lsbCBmb3JjZWZ1bGx5XG4gKiAgICAgICAgICAgICAgICAgIHJlbW92ZSB0aGUgbGlzdGVuZXIuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gdHJhcEJ1YmJsZWRFdmVudCh0b3BMZXZlbFR5cGUsIGVsZW1lbnQpIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGRpc3BhdGNoID0gaXNJbnRlcmFjdGl2ZVRvcExldmVsRXZlbnRUeXBlKHRvcExldmVsVHlwZSkgPyBkaXNwYXRjaEludGVyYWN0aXZlRXZlbnQgOiBkaXNwYXRjaEV2ZW50O1xuXG4gIGFkZEV2ZW50QnViYmxlTGlzdGVuZXIoZWxlbWVudCwgZ2V0UmF3RXZlbnROYW1lKHRvcExldmVsVHlwZSksXG4gIC8vIENoZWNrIGlmIGludGVyYWN0aXZlIGFuZCB3cmFwIGluIGludGVyYWN0aXZlVXBkYXRlc1xuICBkaXNwYXRjaC5iaW5kKG51bGwsIHRvcExldmVsVHlwZSkpO1xufVxuXG4vKipcbiAqIFRyYXBzIGEgdG9wLWxldmVsIGV2ZW50IGJ5IHVzaW5nIGV2ZW50IGNhcHR1cmluZy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdG9wTGV2ZWxUeXBlIE51bWJlciBmcm9tIGBUb3BMZXZlbEV2ZW50VHlwZXNgLlxuICogQHBhcmFtIHtvYmplY3R9IGVsZW1lbnQgRWxlbWVudCBvbiB3aGljaCB0byBhdHRhY2ggbGlzdGVuZXIuXG4gKiBAcmV0dXJuIHs/b2JqZWN0fSBBbiBvYmplY3Qgd2l0aCBhIHJlbW92ZSBmdW5jdGlvbiB3aGljaCB3aWxsIGZvcmNlZnVsbHlcbiAqICAgICAgICAgICAgICAgICAgcmVtb3ZlIHRoZSBsaXN0ZW5lci5cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiB0cmFwQ2FwdHVyZWRFdmVudCh0b3BMZXZlbFR5cGUsIGVsZW1lbnQpIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGRpc3BhdGNoID0gaXNJbnRlcmFjdGl2ZVRvcExldmVsRXZlbnRUeXBlKHRvcExldmVsVHlwZSkgPyBkaXNwYXRjaEludGVyYWN0aXZlRXZlbnQgOiBkaXNwYXRjaEV2ZW50O1xuXG4gIGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyKGVsZW1lbnQsIGdldFJhd0V2ZW50TmFtZSh0b3BMZXZlbFR5cGUpLFxuICAvLyBDaGVjayBpZiBpbnRlcmFjdGl2ZSBhbmQgd3JhcCBpbiBpbnRlcmFjdGl2ZVVwZGF0ZXNcbiAgZGlzcGF0Y2guYmluZChudWxsLCB0b3BMZXZlbFR5cGUpKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hJbnRlcmFjdGl2ZUV2ZW50KHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpIHtcbiAgaW50ZXJhY3RpdmVVcGRhdGVzKGRpc3BhdGNoRXZlbnQsIHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpIHtcbiAgaWYgKCFfZW5hYmxlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBuYXRpdmVFdmVudFRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KTtcbiAgdmFyIHRhcmdldEluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShuYXRpdmVFdmVudFRhcmdldCk7XG4gIGlmICh0YXJnZXRJbnN0ICE9PSBudWxsICYmIHR5cGVvZiB0YXJnZXRJbnN0LnRhZyA9PT0gJ251bWJlcicgJiYgIWlzRmliZXJNb3VudGVkKHRhcmdldEluc3QpKSB7XG4gICAgLy8gSWYgd2UgZ2V0IGFuIGV2ZW50IChleDogaW1nIG9ubG9hZCkgYmVmb3JlIGNvbW1pdHRpbmcgdGhhdFxuICAgIC8vIGNvbXBvbmVudCdzIG1vdW50LCBpZ25vcmUgaXQgZm9yIG5vdyAodGhhdCBpcywgdHJlYXQgaXQgYXMgaWYgaXQgd2FzIGFuXG4gICAgLy8gZXZlbnQgb24gYSBub24tUmVhY3QgdHJlZSkuIFdlIG1pZ2h0IGFsc28gY29uc2lkZXIgcXVldWVpbmcgZXZlbnRzIGFuZFxuICAgIC8vIGRpc3BhdGNoaW5nIHRoZW0gYWZ0ZXIgdGhlIG1vdW50LlxuICAgIHRhcmdldEluc3QgPSBudWxsO1xuICB9XG5cbiAgdmFyIGJvb2tLZWVwaW5nID0gZ2V0VG9wTGV2ZWxDYWxsYmFja0Jvb2tLZWVwaW5nKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQsIHRhcmdldEluc3QpO1xuXG4gIHRyeSB7XG4gICAgLy8gRXZlbnQgcXVldWUgYmVpbmcgcHJvY2Vzc2VkIGluIHRoZSBzYW1lIGN5Y2xlIGFsbG93c1xuICAgIC8vIGBwcmV2ZW50RGVmYXVsdGAuXG4gICAgYmF0Y2hlZFVwZGF0ZXMoaGFuZGxlVG9wTGV2ZWwsIGJvb2tLZWVwaW5nKTtcbiAgfSBmaW5hbGx5IHtcbiAgICByZWxlYXNlVG9wTGV2ZWxDYWxsYmFja0Jvb2tLZWVwaW5nKGJvb2tLZWVwaW5nKTtcbiAgfVxufVxuXG4vKipcbiAqIFN1bW1hcnkgb2YgYFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlcmAgZXZlbnQgaGFuZGxpbmc6XG4gKlxuICogIC0gVG9wLWxldmVsIGRlbGVnYXRpb24gaXMgdXNlZCB0byB0cmFwIG1vc3QgbmF0aXZlIGJyb3dzZXIgZXZlbnRzLiBUaGlzXG4gKiAgICBtYXkgb25seSBvY2N1ciBpbiB0aGUgbWFpbiB0aHJlYWQgYW5kIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZlxuICogICAgUmVhY3RET01FdmVudExpc3RlbmVyLCB3aGljaCBpcyBpbmplY3RlZCBhbmQgY2FuIHRoZXJlZm9yZSBzdXBwb3J0XG4gKiAgICBwbHVnZ2FibGUgZXZlbnQgc291cmNlcy4gVGhpcyBpcyB0aGUgb25seSB3b3JrIHRoYXQgb2NjdXJzIGluIHRoZSBtYWluXG4gKiAgICB0aHJlYWQuXG4gKlxuICogIC0gV2Ugbm9ybWFsaXplIGFuZCBkZS1kdXBsaWNhdGUgZXZlbnRzIHRvIGFjY291bnQgZm9yIGJyb3dzZXIgcXVpcmtzLiBUaGlzXG4gKiAgICBtYXkgYmUgZG9uZSBpbiB0aGUgd29ya2VyIHRocmVhZC5cbiAqXG4gKiAgLSBGb3J3YXJkIHRoZXNlIG5hdGl2ZSBldmVudHMgKHdpdGggdGhlIGFzc29jaWF0ZWQgdG9wLWxldmVsIHR5cGUgdXNlZCB0b1xuICogICAgdHJhcCBpdCkgdG8gYEV2ZW50UGx1Z2luSHViYCwgd2hpY2ggaW4gdHVybiB3aWxsIGFzayBwbHVnaW5zIGlmIHRoZXkgd2FudFxuICogICAgdG8gZXh0cmFjdCBhbnkgc3ludGhldGljIGV2ZW50cy5cbiAqXG4gKiAgLSBUaGUgYEV2ZW50UGx1Z2luSHViYCB3aWxsIHRoZW4gcHJvY2VzcyBlYWNoIGV2ZW50IGJ5IGFubm90YXRpbmcgdGhlbSB3aXRoXG4gKiAgICBcImRpc3BhdGNoZXNcIiwgYSBzZXF1ZW5jZSBvZiBsaXN0ZW5lcnMgYW5kIElEcyB0aGF0IGNhcmUgYWJvdXQgdGhhdCBldmVudC5cbiAqXG4gKiAgLSBUaGUgYEV2ZW50UGx1Z2luSHViYCB0aGVuIGRpc3BhdGNoZXMgdGhlIGV2ZW50cy5cbiAqXG4gKiBPdmVydmlldyBvZiBSZWFjdCBhbmQgdGhlIGV2ZW50IHN5c3RlbTpcbiAqXG4gKiArLS0tLS0tLS0tLS0tKyAgICAuXG4gKiB8ICAgIERPTSAgICAgfCAgICAuXG4gKiArLS0tLS0tLS0tLS0tKyAgICAuXG4gKiAgICAgICB8ICAgICAgICAgICAuXG4gKiAgICAgICB2ICAgICAgICAgICAuXG4gKiArLS0tLS0tLS0tLS0tKyAgICAuXG4gKiB8IFJlYWN0RXZlbnQgfCAgICAuXG4gKiB8ICBMaXN0ZW5lciAgfCAgICAuXG4gKiArLS0tLS0tLS0tLS0tKyAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLStcbiAqICAgICAgIHwgICAgICAgICAgIC4gICAgICAgICAgICAgICArLS0tLS0tLS0rfFNpbXBsZUV2ZW50fFxuICogICAgICAgfCAgICAgICAgICAgLiAgICAgICAgICAgICAgIHwgICAgICAgICB8UGx1Z2luICAgICB8XG4gKiArLS0tLS18LS0tLS0tKyAgICAuICAgICAgICAgICAgICAgdiAgICAgICAgICstLS0tLS0tLS0tLStcbiAqIHwgICAgIHwgICAgICB8ICAgIC4gICAgKy0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLStcbiAqIHwgICAgICstLS0tLS0tLS0tLS4tLS0+fEV2ZW50UGx1Z2luSHVifCAgICAgICAgICAgICAgICAgICAgfCAgICBFdmVudCAgIHxcbiAqIHwgICAgICAgICAgICB8ICAgIC4gICAgfCAgICAgICAgICAgICAgfCAgICAgKy0tLS0tLS0tLS0tKyAgfCBQcm9wYWdhdG9yc3xcbiAqIHwgUmVhY3RFdmVudCB8ICAgIC4gICAgfCAgICAgICAgICAgICAgfCAgICAgfFRhcEV2ZW50ICAgfCAgfC0tLS0tLS0tLS0tLXxcbiAqIHwgIEVtaXR0ZXIgICB8ICAgIC4gICAgfCAgICAgICAgICAgICAgfDwtLS0rfFBsdWdpbiAgICAgfCAgfG90aGVyIHBsdWdpbnxcbiAqIHwgICAgICAgICAgICB8ICAgIC4gICAgfCAgICAgICAgICAgICAgfCAgICAgKy0tLS0tLS0tLS0tKyAgfCAgdXRpbGl0aWVzIHxcbiAqIHwgICAgICstLS0tLS0tLS0tLS4tLS0+fCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLStcbiAqIHwgICAgIHwgICAgICB8ICAgIC4gICAgKy0tLS0tLS0tLS0tLS0tK1xuICogKy0tLS0tfC0tLS0tLSsgICAgLiAgICAgICAgICAgICAgICBeICAgICAgICArLS0tLS0tLS0tLS0rXG4gKiAgICAgICB8ICAgICAgICAgICAuICAgICAgICAgICAgICAgIHwgICAgICAgIHxFbnRlci9MZWF2ZXxcbiAqICAgICAgICsgICAgICAgICAgIC4gICAgICAgICAgICAgICAgKy0tLS0tLS0rfFBsdWdpbiAgICAgfFxuICogKy0tLS0tLS0tLS0tLS0rICAgLiAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rXG4gKiB8IGFwcGxpY2F0aW9uIHwgICAuXG4gKiB8LS0tLS0tLS0tLS0tLXwgICAuXG4gKiB8ICAgICAgICAgICAgIHwgICAuXG4gKiB8ICAgICAgICAgICAgIHwgICAuXG4gKiArLS0tLS0tLS0tLS0tLSsgICAuXG4gKiAgICAgICAgICAgICAgICAgICAuXG4gKiAgICBSZWFjdCBDb3JlICAgICAuICBHZW5lcmFsIFB1cnBvc2UgRXZlbnQgUGx1Z2luIFN5c3RlbVxuICovXG5cbnZhciBhbHJlYWR5TGlzdGVuaW5nVG8gPSB7fTtcbnZhciByZWFjdFRvcExpc3RlbmVyc0NvdW50ZXIgPSAwO1xuXG4vKipcbiAqIFRvIGVuc3VyZSBubyBjb25mbGljdHMgd2l0aCBvdGhlciBwb3RlbnRpYWwgUmVhY3QgaW5zdGFuY2VzIG9uIHRoZSBwYWdlXG4gKi9cbnZhciB0b3BMaXN0ZW5lcnNJREtleSA9ICdfcmVhY3RMaXN0ZW5lcnNJRCcgKyAoJycgKyBNYXRoLnJhbmRvbSgpKS5zbGljZSgyKTtcblxuZnVuY3Rpb24gZ2V0TGlzdGVuaW5nRm9yRG9jdW1lbnQobW91bnRBdCkge1xuICAvLyBJbiBJRTgsIGBtb3VudEF0YCBpcyBhIGhvc3Qgb2JqZWN0IGFuZCBkb2Vzbid0IGhhdmUgYGhhc093blByb3BlcnR5YFxuICAvLyBkaXJlY3RseS5cbiAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW91bnRBdCwgdG9wTGlzdGVuZXJzSURLZXkpKSB7XG4gICAgbW91bnRBdFt0b3BMaXN0ZW5lcnNJREtleV0gPSByZWFjdFRvcExpc3RlbmVyc0NvdW50ZXIrKztcbiAgICBhbHJlYWR5TGlzdGVuaW5nVG9bbW91bnRBdFt0b3BMaXN0ZW5lcnNJREtleV1dID0ge307XG4gIH1cbiAgcmV0dXJuIGFscmVhZHlMaXN0ZW5pbmdUb1ttb3VudEF0W3RvcExpc3RlbmVyc0lES2V5XV07XG59XG5cbi8qKlxuICogV2UgbGlzdGVuIGZvciBidWJibGVkIHRvdWNoIGV2ZW50cyBvbiB0aGUgZG9jdW1lbnQgb2JqZWN0LlxuICpcbiAqIEZpcmVmb3ggdjguMDEgKGFuZCBwb3NzaWJseSBvdGhlcnMpIGV4aGliaXRlZCBzdHJhbmdlIGJlaGF2aW9yIHdoZW5cbiAqIG1vdW50aW5nIGBvbm1vdXNlbW92ZWAgZXZlbnRzIGF0IHNvbWUgbm9kZSB0aGF0IHdhcyBub3QgdGhlIGRvY3VtZW50XG4gKiBlbGVtZW50LiBUaGUgc3ltcHRvbXMgd2VyZSB0aGF0IGlmIHlvdXIgbW91c2UgaXMgbm90IG1vdmluZyBvdmVyIHNvbWV0aGluZ1xuICogY29udGFpbmVkIHdpdGhpbiB0aGF0IG1vdW50IHBvaW50IChmb3IgZXhhbXBsZSBvbiB0aGUgYmFja2dyb3VuZCkgdGhlXG4gKiB0b3AtbGV2ZWwgbGlzdGVuZXJzIGZvciBgb25tb3VzZW1vdmVgIHdvbid0IGJlIGNhbGxlZC4gSG93ZXZlciwgaWYgeW91XG4gKiByZWdpc3RlciB0aGUgYG1vdXNlbW92ZWAgb24gdGhlIGRvY3VtZW50IG9iamVjdCwgdGhlbiBpdCB3aWxsIG9mIGNvdXJzZVxuICogY2F0Y2ggYWxsIGBtb3VzZW1vdmVgcy4gVGhpcyBhbG9uZyB3aXRoIGlPUyBxdWlya3MsIGp1c3RpZmllcyByZXN0cmljdGluZ1xuICogdG9wLWxldmVsIGxpc3RlbmVycyB0byB0aGUgZG9jdW1lbnQgb2JqZWN0IG9ubHksIGF0IGxlYXN0IGZvciB0aGVzZVxuICogbW92ZW1lbnQgdHlwZXMgb2YgZXZlbnRzIGFuZCBwb3NzaWJseSBhbGwgZXZlbnRzLlxuICpcbiAqIEBzZWUgaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTAvMDkvY2xpY2tfZXZlbnRfZGVsLmh0bWxcbiAqXG4gKiBBbHNvLCBga2V5dXBgL2BrZXlwcmVzc2AvYGtleWRvd25gIGRvIG5vdCBidWJibGUgdG8gdGhlIHdpbmRvdyBvbiBJRSwgYnV0XG4gKiB0aGV5IGJ1YmJsZSB0byBkb2N1bWVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBOYW1lIG9mIGxpc3RlbmVyIChlLmcuIGBvbkNsaWNrYCkuXG4gKiBAcGFyYW0ge29iamVjdH0gbW91bnRBdCBDb250YWluZXIgd2hlcmUgdG8gbW91bnQgdGhlIGxpc3RlbmVyXG4gKi9cbmZ1bmN0aW9uIGxpc3RlblRvKHJlZ2lzdHJhdGlvbk5hbWUsIG1vdW50QXQpIHtcbiAgdmFyIGlzTGlzdGVuaW5nID0gZ2V0TGlzdGVuaW5nRm9yRG9jdW1lbnQobW91bnRBdCk7XG4gIHZhciBkZXBlbmRlbmNpZXMgPSByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGVwZW5kZW5jaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlcGVuZGVuY3kgPSBkZXBlbmRlbmNpZXNbaV07XG4gICAgaWYgKCEoaXNMaXN0ZW5pbmcuaGFzT3duUHJvcGVydHkoZGVwZW5kZW5jeSkgJiYgaXNMaXN0ZW5pbmdbZGVwZW5kZW5jeV0pKSB7XG4gICAgICBzd2l0Y2ggKGRlcGVuZGVuY3kpIHtcbiAgICAgICAgY2FzZSBUT1BfU0NST0xMOlxuICAgICAgICAgIHRyYXBDYXB0dXJlZEV2ZW50KFRPUF9TQ1JPTEwsIG1vdW50QXQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRPUF9GT0NVUzpcbiAgICAgICAgY2FzZSBUT1BfQkxVUjpcbiAgICAgICAgICB0cmFwQ2FwdHVyZWRFdmVudChUT1BfRk9DVVMsIG1vdW50QXQpO1xuICAgICAgICAgIHRyYXBDYXB0dXJlZEV2ZW50KFRPUF9CTFVSLCBtb3VudEF0KTtcbiAgICAgICAgICAvLyBXZSBzZXQgdGhlIGZsYWcgZm9yIGEgc2luZ2xlIGRlcGVuZGVuY3kgbGF0ZXIgaW4gdGhpcyBmdW5jdGlvbixcbiAgICAgICAgICAvLyBidXQgdGhpcyBlbnN1cmVzIHdlIG1hcmsgYm90aCBhcyBhdHRhY2hlZCByYXRoZXIgdGhhbiBqdXN0IG9uZS5cbiAgICAgICAgICBpc0xpc3RlbmluZ1tUT1BfQkxVUl0gPSB0cnVlO1xuICAgICAgICAgIGlzTGlzdGVuaW5nW1RPUF9GT0NVU10gPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRPUF9DQU5DRUw6XG4gICAgICAgIGNhc2UgVE9QX0NMT1NFOlxuICAgICAgICAgIGlmIChpc0V2ZW50U3VwcG9ydGVkKGdldFJhd0V2ZW50TmFtZShkZXBlbmRlbmN5KSkpIHtcbiAgICAgICAgICAgIHRyYXBDYXB0dXJlZEV2ZW50KGRlcGVuZGVuY3ksIG1vdW50QXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUT1BfSU5WQUxJRDpcbiAgICAgICAgY2FzZSBUT1BfU1VCTUlUOlxuICAgICAgICBjYXNlIFRPUF9SRVNFVDpcbiAgICAgICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlbSBvbiB0aGUgdGFyZ2V0IERPTSBlbGVtZW50cy5cbiAgICAgICAgICAvLyBTb21lIG9mIHRoZW0gYnViYmxlIHNvIHdlIGRvbid0IHdhbnQgdGhlbSB0byBmaXJlIHR3aWNlLlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGxpc3RlbiBvbiB0aGUgdG9wIGxldmVsIHRvIGFsbCBub24tbWVkaWEgZXZlbnRzLlxuICAgICAgICAgIC8vIE1lZGlhIGV2ZW50cyBkb24ndCBidWJibGUgc28gYWRkaW5nIHRoZSBsaXN0ZW5lciB3b3VsZG4ndCBkbyBhbnl0aGluZy5cbiAgICAgICAgICB2YXIgaXNNZWRpYUV2ZW50ID0gbWVkaWFFdmVudFR5cGVzLmluZGV4T2YoZGVwZW5kZW5jeSkgIT09IC0xO1xuICAgICAgICAgIGlmICghaXNNZWRpYUV2ZW50KSB7XG4gICAgICAgICAgICB0cmFwQnViYmxlZEV2ZW50KGRlcGVuZGVuY3ksIG1vdW50QXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlzTGlzdGVuaW5nW2RlcGVuZGVuY3ldID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNMaXN0ZW5pbmdUb0FsbERlcGVuZGVuY2llcyhyZWdpc3RyYXRpb25OYW1lLCBtb3VudEF0KSB7XG4gIHZhciBpc0xpc3RlbmluZyA9IGdldExpc3RlbmluZ0ZvckRvY3VtZW50KG1vdW50QXQpO1xuICB2YXIgZGVwZW5kZW5jaWVzID0gcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tyZWdpc3RyYXRpb25OYW1lXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXBlbmRlbmNpZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVwZW5kZW5jeSA9IGRlcGVuZGVuY2llc1tpXTtcbiAgICBpZiAoIShpc0xpc3RlbmluZy5oYXNPd25Qcm9wZXJ0eShkZXBlbmRlbmN5KSAmJiBpc0xpc3RlbmluZ1tkZXBlbmRlbmN5XSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldEFjdGl2ZUVsZW1lbnQoZG9jKSB7XG4gIGRvYyA9IGRvYyB8fCAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IGRvY3VtZW50IDogdW5kZWZpbmVkKTtcbiAgaWYgKHR5cGVvZiBkb2MgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gZG9jLmFjdGl2ZUVsZW1lbnQgfHwgZG9jLmJvZHk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZG9jLmJvZHk7XG4gIH1cbn1cblxuLyoqXG4gKiBHaXZlbiBhbnkgbm9kZSByZXR1cm4gdGhlIGZpcnN0IGxlYWYgbm9kZSB3aXRob3V0IGNoaWxkcmVuLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHJldHVybiB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX1cbiAqL1xuZnVuY3Rpb24gZ2V0TGVhZk5vZGUobm9kZSkge1xuICB3aGlsZSAobm9kZSAmJiBub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICBub2RlID0gbm9kZS5maXJzdENoaWxkO1xuICB9XG4gIHJldHVybiBub2RlO1xufVxuXG4vKipcbiAqIEdldCB0aGUgbmV4dCBzaWJsaW5nIHdpdGhpbiBhIGNvbnRhaW5lci4gVGhpcyB3aWxsIHdhbGsgdXAgdGhlXG4gKiBET00gaWYgYSBub2RlJ3Mgc2libGluZ3MgaGF2ZSBiZWVuIGV4aGF1c3RlZC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEByZXR1cm4gez9ET01FbGVtZW50fERPTVRleHROb2RlfVxuICovXG5mdW5jdGlvbiBnZXRTaWJsaW5nTm9kZShub2RlKSB7XG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nO1xuICAgIH1cbiAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICB9XG59XG5cbi8qKlxuICogR2V0IG9iamVjdCBkZXNjcmliaW5nIHRoZSBub2RlcyB3aGljaCBjb250YWluIGNoYXJhY3RlcnMgYXQgb2Zmc2V0LlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gcm9vdFxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICogQHJldHVybiB7P29iamVjdH1cbiAqL1xuZnVuY3Rpb24gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChyb290LCBvZmZzZXQpIHtcbiAgdmFyIG5vZGUgPSBnZXRMZWFmTm9kZShyb290KTtcbiAgdmFyIG5vZGVTdGFydCA9IDA7XG4gIHZhciBub2RlRW5kID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgIG5vZGVFbmQgPSBub2RlU3RhcnQgKyBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcblxuICAgICAgaWYgKG5vZGVTdGFydCA8PSBvZmZzZXQgJiYgbm9kZUVuZCA+PSBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgIG9mZnNldDogb2Zmc2V0IC0gbm9kZVN0YXJ0XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIG5vZGVTdGFydCA9IG5vZGVFbmQ7XG4gICAgfVxuXG4gICAgbm9kZSA9IGdldExlYWZOb2RlKGdldFNpYmxpbmdOb2RlKG5vZGUpKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gb3V0ZXJOb2RlXG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRPZmZzZXRzKG91dGVyTm9kZSkge1xuICB2YXIgb3duZXJEb2N1bWVudCA9IG91dGVyTm9kZS5vd25lckRvY3VtZW50O1xuXG4gIHZhciB3aW4gPSBvd25lckRvY3VtZW50ICYmIG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbiAmJiB3aW4uZ2V0U2VsZWN0aW9uKCk7XG5cbiAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBhbmNob3JOb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGUsXG4gICAgICBhbmNob3JPZmZzZXQgPSBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LFxuICAgICAgZm9jdXNOb2RlID0gc2VsZWN0aW9uLmZvY3VzTm9kZSxcbiAgICAgIGZvY3VzT2Zmc2V0ID0gc2VsZWN0aW9uLmZvY3VzT2Zmc2V0O1xuXG4gIC8vIEluIEZpcmVmb3gsIGFuY2hvck5vZGUgYW5kIGZvY3VzTm9kZSBjYW4gYmUgXCJhbm9ueW1vdXMgZGl2c1wiLCBlLmcuIHRoZVxuICAvLyB1cC9kb3duIGJ1dHRvbnMgb24gYW4gPGlucHV0IHR5cGU9XCJudW1iZXJcIj4uIEFub255bW91cyBkaXZzIGRvIG5vdCBzZWVtIHRvXG4gIC8vIGV4cG9zZSBwcm9wZXJ0aWVzLCB0cmlnZ2VyaW5nIGEgXCJQZXJtaXNzaW9uIGRlbmllZCBlcnJvclwiIGlmIGFueSBvZiBpdHNcbiAgLy8gcHJvcGVydGllcyBhcmUgYWNjZXNzZWQuIFRoZSBvbmx5IHNlZW1pbmdseSBwb3NzaWJsZSB3YXkgdG8gYXZvaWQgZXJyb3JpbmdcbiAgLy8gaXMgdG8gYWNjZXNzIGEgcHJvcGVydHkgdGhhdCB0eXBpY2FsbHkgd29ya3MgZm9yIG5vbi1hbm9ueW1vdXMgZGl2cyBhbmRcbiAgLy8gY2F0Y2ggYW55IGVycm9yIHRoYXQgbWF5IG90aGVyd2lzZSBhcmlzZS4gU2VlXG4gIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTIwODQyN1xuXG4gIHRyeSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gICAgYW5jaG9yTm9kZS5ub2RlVHlwZTtcbiAgICBmb2N1c05vZGUubm9kZVR5cGU7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtZXhwcmVzc2lvbnMgKi9cbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGdldE1vZGVybk9mZnNldHNGcm9tUG9pbnRzKG91dGVyTm9kZSwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHtzdGFydCwgZW5kfSB3aGVyZSBgc3RhcnRgIGlzIHRoZSBjaGFyYWN0ZXIvY29kZXBvaW50IGluZGV4IG9mXG4gKiAoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0KSB3aXRoaW4gdGhlIHRleHRDb250ZW50IG9mIGBvdXRlck5vZGVgLCBhbmRcbiAqIGBlbmRgIGlzIHRoZSBpbmRleCBvZiAoZm9jdXNOb2RlLCBmb2N1c09mZnNldCkuXG4gKlxuICogUmV0dXJucyBudWxsIGlmIHlvdSBwYXNzIGluIGdhcmJhZ2UgaW5wdXQgYnV0IHdlIHNob3VsZCBwcm9iYWJseSBqdXN0IGNyYXNoLlxuICpcbiAqIEV4cG9ydGVkIG9ubHkgZm9yIHRlc3RpbmcuXG4gKi9cbmZ1bmN0aW9uIGdldE1vZGVybk9mZnNldHNGcm9tUG9pbnRzKG91dGVyTm9kZSwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KSB7XG4gIHZhciBsZW5ndGggPSAwO1xuICB2YXIgc3RhcnQgPSAtMTtcbiAgdmFyIGVuZCA9IC0xO1xuICB2YXIgaW5kZXhXaXRoaW5BbmNob3IgPSAwO1xuICB2YXIgaW5kZXhXaXRoaW5Gb2N1cyA9IDA7XG4gIHZhciBub2RlID0gb3V0ZXJOb2RlO1xuICB2YXIgcGFyZW50Tm9kZSA9IG51bGw7XG5cbiAgb3V0ZXI6IHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIG5leHQgPSBudWxsO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlID09PSBhbmNob3JOb2RlICYmIChhbmNob3JPZmZzZXQgPT09IDAgfHwgbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSkge1xuICAgICAgICBzdGFydCA9IGxlbmd0aCArIGFuY2hvck9mZnNldDtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlID09PSBmb2N1c05vZGUgJiYgKGZvY3VzT2Zmc2V0ID09PSAwIHx8IG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkpIHtcbiAgICAgICAgZW5kID0gbGVuZ3RoICsgZm9jdXNPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgICAgbGVuZ3RoICs9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKChuZXh0ID0gbm9kZS5maXJzdENoaWxkKSA9PT0gbnVsbCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vIE1vdmluZyBmcm9tIGBub2RlYCB0byBpdHMgZmlyc3QgY2hpbGQgYG5leHRgLlxuICAgICAgcGFyZW50Tm9kZSA9IG5vZGU7XG4gICAgICBub2RlID0gbmV4dDtcbiAgICB9XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUgPT09IG91dGVyTm9kZSkge1xuICAgICAgICAvLyBJZiBgb3V0ZXJOb2RlYCBoYXMgY2hpbGRyZW4sIHRoaXMgaXMgYWx3YXlzIHRoZSBzZWNvbmQgdGltZSB2aXNpdGluZ1xuICAgICAgICAvLyBpdC4gSWYgaXQgaGFzIG5vIGNoaWxkcmVuLCB0aGlzIGlzIHN0aWxsIHRoZSBmaXJzdCBsb29wLCBhbmQgdGhlIG9ubHlcbiAgICAgICAgLy8gdmFsaWQgc2VsZWN0aW9uIGlzIGFuY2hvck5vZGUgYW5kIGZvY3VzTm9kZSBib3RoIGVxdWFsIHRvIHRoaXMgbm9kZVxuICAgICAgICAvLyBhbmQgYm90aCBvZmZzZXRzIDAsIGluIHdoaWNoIGNhc2Ugd2Ugd2lsbCBoYXZlIGhhbmRsZWQgYWJvdmUuXG4gICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmVudE5vZGUgPT09IGFuY2hvck5vZGUgJiYgKytpbmRleFdpdGhpbkFuY2hvciA9PT0gYW5jaG9yT2Zmc2V0KSB7XG4gICAgICAgIHN0YXJ0ID0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmVudE5vZGUgPT09IGZvY3VzTm9kZSAmJiArK2luZGV4V2l0aGluRm9jdXMgPT09IGZvY3VzT2Zmc2V0KSB7XG4gICAgICAgIGVuZCA9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGlmICgobmV4dCA9IG5vZGUubmV4dFNpYmxpbmcpICE9PSBudWxsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbm9kZSA9IHBhcmVudE5vZGU7XG4gICAgICBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cblxuICAgIC8vIE1vdmluZyBmcm9tIGBub2RlYCB0byBpdHMgbmV4dCBzaWJsaW5nIGBuZXh0YC5cbiAgICBub2RlID0gbmV4dDtcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gLTEgfHwgZW5kID09PSAtMSkge1xuICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gKFdvdWxkIGhhcHBlbiBpZiB0aGUgYW5jaG9yL2ZvY3VzIG5vZGVzIGFyZW4ndFxuICAgIC8vIGFjdHVhbGx5IGluc2lkZSB0aGUgcGFzc2VkLWluIG5vZGUuKVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydDogc3RhcnQsXG4gICAgZW5kOiBlbmRcbiAgfTtcbn1cblxuLyoqXG4gKiBJbiBtb2Rlcm4gbm9uLUlFIGJyb3dzZXJzLCB3ZSBjYW4gc3VwcG9ydCBib3RoIGZvcndhcmQgYW5kIGJhY2t3YXJkXG4gKiBzZWxlY3Rpb25zLlxuICpcbiAqIE5vdGU6IElFMTArIHN1cHBvcnRzIHRoZSBTZWxlY3Rpb24gb2JqZWN0LCBidXQgaXQgZG9lcyBub3Qgc3VwcG9ydFxuICogdGhlIGBleHRlbmRgIG1ldGhvZCwgd2hpY2ggbWVhbnMgdGhhdCBldmVuIGluIG1vZGVybiBJRSwgaXQncyBub3QgcG9zc2libGVcbiAqIHRvIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlIGEgYmFja3dhcmQgc2VsZWN0aW9uLiBUaHVzLCBmb3IgYWxsIElFXG4gKiB2ZXJzaW9ucywgd2UgdXNlIHRoZSBvbGQgSUUgQVBJIHRvIGNyZWF0ZSBvdXIgc2VsZWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvZmZzZXRzXG4gKi9cbmZ1bmN0aW9uIHNldE9mZnNldHMobm9kZSwgb2Zmc2V0cykge1xuICB2YXIgZG9jID0gbm9kZS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50O1xuICB2YXIgd2luID0gZG9jICYmIGRvYy5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG5cbiAgLy8gRWRnZSBmYWlscyB3aXRoIFwiT2JqZWN0IGV4cGVjdGVkXCIgaW4gc29tZSBzY2VuYXJpb3MuXG4gIC8vIChGb3IgaW5zdGFuY2U6IFRpbnlNQ0UgZWRpdG9yIHVzZWQgaW4gYSBsaXN0IGNvbXBvbmVudCB0aGF0IHN1cHBvcnRzIHBhc3RpbmcgdG8gYWRkIG1vcmUsXG4gIC8vIGZhaWxzIHdoZW4gcGFzdGluZyAxMDArIGl0ZW1zKVxuICBpZiAoIXdpbi5nZXRTZWxlY3Rpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbigpO1xuICB2YXIgbGVuZ3RoID0gbm9kZS50ZXh0Q29udGVudC5sZW5ndGg7XG4gIHZhciBzdGFydCA9IE1hdGgubWluKG9mZnNldHMuc3RhcnQsIGxlbmd0aCk7XG4gIHZhciBlbmQgPSBvZmZzZXRzLmVuZCA9PT0gdW5kZWZpbmVkID8gc3RhcnQgOiBNYXRoLm1pbihvZmZzZXRzLmVuZCwgbGVuZ3RoKTtcblxuICAvLyBJRSAxMSB1c2VzIG1vZGVybiBzZWxlY3Rpb24sIGJ1dCBkb2Vzbid0IHN1cHBvcnQgdGhlIGV4dGVuZCBtZXRob2QuXG4gIC8vIEZsaXAgYmFja3dhcmQgc2VsZWN0aW9ucywgc28gd2UgY2FuIHNldCB3aXRoIGEgc2luZ2xlIHJhbmdlLlxuICBpZiAoIXNlbGVjdGlvbi5leHRlbmQgJiYgc3RhcnQgPiBlbmQpIHtcbiAgICB2YXIgdGVtcCA9IGVuZDtcbiAgICBlbmQgPSBzdGFydDtcbiAgICBzdGFydCA9IHRlbXA7XG4gIH1cblxuICB2YXIgc3RhcnRNYXJrZXIgPSBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KG5vZGUsIHN0YXJ0KTtcbiAgdmFyIGVuZE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQobm9kZSwgZW5kKTtcblxuICBpZiAoc3RhcnRNYXJrZXIgJiYgZW5kTWFya2VyKSB7XG4gICAgaWYgKHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAxICYmIHNlbGVjdGlvbi5hbmNob3JOb2RlID09PSBzdGFydE1hcmtlci5ub2RlICYmIHNlbGVjdGlvbi5hbmNob3JPZmZzZXQgPT09IHN0YXJ0TWFya2VyLm9mZnNldCAmJiBzZWxlY3Rpb24uZm9jdXNOb2RlID09PSBlbmRNYXJrZXIubm9kZSAmJiBzZWxlY3Rpb24uZm9jdXNPZmZzZXQgPT09IGVuZE1hcmtlci5vZmZzZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHJhbmdlID0gZG9jLmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2V0U3RhcnQoc3RhcnRNYXJrZXIubm9kZSwgc3RhcnRNYXJrZXIub2Zmc2V0KTtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG5cbiAgICBpZiAoc3RhcnQgPiBlbmQpIHtcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICBzZWxlY3Rpb24uZXh0ZW5kKGVuZE1hcmtlci5ub2RlLCBlbmRNYXJrZXIub2Zmc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmFuZ2Uuc2V0RW5kKGVuZE1hcmtlci5ub2RlLCBlbmRNYXJrZXIub2Zmc2V0KTtcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzVGV4dE5vZGUobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLm5vZGVUeXBlID09PSBURVhUX05PREU7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zTm9kZShvdXRlck5vZGUsIGlubmVyTm9kZSkge1xuICBpZiAoIW91dGVyTm9kZSB8fCAhaW5uZXJOb2RlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2UgaWYgKG91dGVyTm9kZSA9PT0gaW5uZXJOb2RlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoaXNUZXh0Tm9kZShvdXRlck5vZGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2UgaWYgKGlzVGV4dE5vZGUoaW5uZXJOb2RlKSkge1xuICAgIHJldHVybiBjb250YWluc05vZGUob3V0ZXJOb2RlLCBpbm5lck5vZGUucGFyZW50Tm9kZSk7XG4gIH0gZWxzZSBpZiAoJ2NvbnRhaW5zJyBpbiBvdXRlck5vZGUpIHtcbiAgICByZXR1cm4gb3V0ZXJOb2RlLmNvbnRhaW5zKGlubmVyTm9kZSk7XG4gIH0gZWxzZSBpZiAob3V0ZXJOb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7XG4gICAgcmV0dXJuICEhKG91dGVyTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihpbm5lck5vZGUpICYgMTYpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0luRG9jdW1lbnQobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgY29udGFpbnNOb2RlKG5vZGUub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIG5vZGUpO1xufVxuXG5mdW5jdGlvbiBpc1NhbWVPcmlnaW5GcmFtZShpZnJhbWUpIHtcbiAgdHJ5IHtcbiAgICAvLyBBY2Nlc3NpbmcgdGhlIGNvbnRlbnREb2N1bWVudCBvZiBhIEhUTUxJZnJhbWVFbGVtZW50IGNhbiBjYXVzZSB0aGUgYnJvd3NlclxuICAgIC8vIHRvIHRocm93LCBlLmcuIGlmIGl0IGhhcyBhIGNyb3NzLW9yaWdpbiBzcmMgYXR0cmlidXRlLlxuICAgIC8vIFNhZmFyaSB3aWxsIHNob3cgYW4gZXJyb3IgaW4gdGhlIGNvbnNvbGUgd2hlbiB0aGUgYWNjZXNzIHJlc3VsdHMgaW4gXCJCbG9ja2VkIGEgZnJhbWUgd2l0aCBvcmlnaW5cIi4gZS5nOlxuICAgIC8vIGlmcmFtZS5jb250ZW50RG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gICAgLy8gQSBzYWZldHkgd2F5IGlzIHRvIGFjY2VzcyBvbmUgb2YgdGhlIGNyb3NzIG9yaWdpbiBwcm9wZXJ0aWVzOiBXaW5kb3cgb3IgTG9jYXRpb25cbiAgICAvLyBXaGljaCBtaWdodCByZXN1bHQgaW4gXCJTZWN1cml0eUVycm9yXCIgRE9NIEV4Y2VwdGlvbiBhbmQgaXQgaXMgY29tcGF0aWJsZSB0byBTYWZhcmkuXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvYnJvd3NlcnMuaHRtbCNpbnRlZ3JhdGlvbi13aXRoLWlkbFxuXG4gICAgcmV0dXJuIHR5cGVvZiBpZnJhbWUuY29udGVudFdpbmRvdy5sb2NhdGlvbi5ocmVmID09PSAnc3RyaW5nJztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEFjdGl2ZUVsZW1lbnREZWVwKCkge1xuICB2YXIgd2luID0gd2luZG93O1xuICB2YXIgZWxlbWVudCA9IGdldEFjdGl2ZUVsZW1lbnQoKTtcbiAgd2hpbGUgKGVsZW1lbnQgaW5zdGFuY2VvZiB3aW4uSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICBpZiAoaXNTYW1lT3JpZ2luRnJhbWUoZWxlbWVudCkpIHtcbiAgICAgIHdpbiA9IGVsZW1lbnQuY29udGVudFdpbmRvdztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuICAgIGVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KHdpbi5kb2N1bWVudCk7XG4gIH1cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbi8qKlxuICogQFJlYWN0SW5wdXRTZWxlY3Rpb246IFJlYWN0IGlucHV0IHNlbGVjdGlvbiBtb2R1bGUuIEJhc2VkIG9uIFNlbGVjdGlvbi5qcyxcbiAqIGJ1dCBtb2RpZmllZCB0byBiZSBzdWl0YWJsZSBmb3IgcmVhY3QgYW5kIGhhcyBhIGNvdXBsZSBvZiBidWcgZml4ZXMgKGRvZXNuJ3RcbiAqIGFzc3VtZSBidXR0b25zIGhhdmUgcmFuZ2Ugc2VsZWN0aW9ucyBhbGxvd2VkKS5cbiAqIElucHV0IHNlbGVjdGlvbiBtb2R1bGUgZm9yIFJlYWN0LlxuICovXG5cbi8qKlxuICogQGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllczogd2UgZ2V0IHRoZSBlbGVtZW50IHR5cGVzIHRoYXQgc3VwcG9ydCBzZWxlY3Rpb25cbiAqIGZyb20gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jZG8tbm90LWFwcGx5LCBsb29raW5nIGF0IGBzZWxlY3Rpb25TdGFydGBcbiAqIGFuZCBgc2VsZWN0aW9uRW5kYCByb3dzLlxuICovXG5mdW5jdGlvbiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZWxlbSkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtICYmIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gbm9kZU5hbWUgJiYgKG5vZGVOYW1lID09PSAnaW5wdXQnICYmIChlbGVtLnR5cGUgPT09ICd0ZXh0JyB8fCBlbGVtLnR5cGUgPT09ICdzZWFyY2gnIHx8IGVsZW0udHlwZSA9PT0gJ3RlbCcgfHwgZWxlbS50eXBlID09PSAndXJsJyB8fCBlbGVtLnR5cGUgPT09ICdwYXNzd29yZCcpIHx8IG5vZGVOYW1lID09PSAndGV4dGFyZWEnIHx8IGVsZW0uY29udGVudEVkaXRhYmxlID09PSAndHJ1ZScpO1xufVxuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb25JbmZvcm1hdGlvbigpIHtcbiAgdmFyIGZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxlbWVudERlZXAoKTtcbiAgcmV0dXJuIHtcbiAgICBmb2N1c2VkRWxlbTogZm9jdXNlZEVsZW0sXG4gICAgc2VsZWN0aW9uUmFuZ2U6IGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhmb2N1c2VkRWxlbSkgPyBnZXRTZWxlY3Rpb24kMShmb2N1c2VkRWxlbSkgOiBudWxsXG4gIH07XG59XG5cbi8qKlxuICogQHJlc3RvcmVTZWxlY3Rpb246IElmIGFueSBzZWxlY3Rpb24gaW5mb3JtYXRpb24gd2FzIHBvdGVudGlhbGx5IGxvc3QsXG4gKiByZXN0b3JlIGl0LiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHBlcmZvcm1pbmcgb3BlcmF0aW9ucyB0aGF0IGNvdWxkIHJlbW92ZSBkb21cbiAqIG5vZGVzIGFuZCBwbGFjZSB0aGVtIGJhY2sgaW4sIHJlc3VsdGluZyBpbiBmb2N1cyBiZWluZyBsb3N0LlxuICovXG5mdW5jdGlvbiByZXN0b3JlU2VsZWN0aW9uKHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24pIHtcbiAgdmFyIGN1ckZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxlbWVudERlZXAoKTtcbiAgdmFyIHByaW9yRm9jdXNlZEVsZW0gPSBwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uLmZvY3VzZWRFbGVtO1xuICB2YXIgcHJpb3JTZWxlY3Rpb25SYW5nZSA9IHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24uc2VsZWN0aW9uUmFuZ2U7XG4gIGlmIChjdXJGb2N1c2VkRWxlbSAhPT0gcHJpb3JGb2N1c2VkRWxlbSAmJiBpc0luRG9jdW1lbnQocHJpb3JGb2N1c2VkRWxlbSkpIHtcbiAgICBpZiAocHJpb3JTZWxlY3Rpb25SYW5nZSAhPT0gbnVsbCAmJiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMocHJpb3JGb2N1c2VkRWxlbSkpIHtcbiAgICAgIHNldFNlbGVjdGlvbihwcmlvckZvY3VzZWRFbGVtLCBwcmlvclNlbGVjdGlvblJhbmdlKTtcbiAgICB9XG5cbiAgICAvLyBGb2N1c2luZyBhIG5vZGUgY2FuIGNoYW5nZSB0aGUgc2Nyb2xsIHBvc2l0aW9uLCB3aGljaCBpcyB1bmRlc2lyYWJsZVxuICAgIHZhciBhbmNlc3RvcnMgPSBbXTtcbiAgICB2YXIgYW5jZXN0b3IgPSBwcmlvckZvY3VzZWRFbGVtO1xuICAgIHdoaWxlIChhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudE5vZGUpIHtcbiAgICAgIGlmIChhbmNlc3Rvci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIGFuY2VzdG9ycy5wdXNoKHtcbiAgICAgICAgICBlbGVtZW50OiBhbmNlc3RvcixcbiAgICAgICAgICBsZWZ0OiBhbmNlc3Rvci5zY3JvbGxMZWZ0LFxuICAgICAgICAgIHRvcDogYW5jZXN0b3Iuc2Nyb2xsVG9wXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJpb3JGb2N1c2VkRWxlbS5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJpb3JGb2N1c2VkRWxlbS5mb2N1cygpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5jZXN0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaW5mbyA9IGFuY2VzdG9yc1tpXTtcbiAgICAgIGluZm8uZWxlbWVudC5zY3JvbGxMZWZ0ID0gaW5mby5sZWZ0O1xuICAgICAgaW5mby5lbGVtZW50LnNjcm9sbFRvcCA9IGluZm8udG9wO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBnZXRTZWxlY3Rpb246IEdldHMgdGhlIHNlbGVjdGlvbiBib3VuZHMgb2YgYSBmb2N1c2VkIHRleHRhcmVhLCBpbnB1dCBvclxuICogY29udGVudEVkaXRhYmxlIG5vZGUuXG4gKiAtQGlucHV0OiBMb29rIHVwIHNlbGVjdGlvbiBib3VuZHMgb2YgdGhpcyBpbnB1dFxuICogLUByZXR1cm4ge3N0YXJ0OiBzZWxlY3Rpb25TdGFydCwgZW5kOiBzZWxlY3Rpb25FbmR9XG4gKi9cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbiQxKGlucHV0KSB7XG4gIHZhciBzZWxlY3Rpb24gPSB2b2lkIDA7XG5cbiAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gaW5wdXQpIHtcbiAgICAvLyBNb2Rlcm4gYnJvd3NlciB3aXRoIGlucHV0IG9yIHRleHRhcmVhLlxuICAgIHNlbGVjdGlvbiA9IHtcbiAgICAgIHN0YXJ0OiBpbnB1dC5zZWxlY3Rpb25TdGFydCxcbiAgICAgIGVuZDogaW5wdXQuc2VsZWN0aW9uRW5kXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDb250ZW50IGVkaXRhYmxlIG9yIG9sZCBJRSB0ZXh0YXJlYS5cbiAgICBzZWxlY3Rpb24gPSBnZXRPZmZzZXRzKGlucHV0KTtcbiAgfVxuXG4gIHJldHVybiBzZWxlY3Rpb24gfHwgeyBzdGFydDogMCwgZW5kOiAwIH07XG59XG5cbi8qKlxuICogQHNldFNlbGVjdGlvbjogU2V0cyB0aGUgc2VsZWN0aW9uIGJvdW5kcyBvZiBhIHRleHRhcmVhIG9yIGlucHV0IGFuZCBmb2N1c2VzXG4gKiB0aGUgaW5wdXQuXG4gKiAtQGlucHV0ICAgICBTZXQgc2VsZWN0aW9uIGJvdW5kcyBvZiB0aGlzIGlucHV0IG9yIHRleHRhcmVhXG4gKiAtQG9mZnNldHMgICBPYmplY3Qgb2Ygc2FtZSBmb3JtIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSBnZXQqXG4gKi9cbmZ1bmN0aW9uIHNldFNlbGVjdGlvbihpbnB1dCwgb2Zmc2V0cykge1xuICB2YXIgc3RhcnQgPSBvZmZzZXRzLnN0YXJ0LFxuICAgICAgZW5kID0gb2Zmc2V0cy5lbmQ7XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gc3RhcnQ7XG4gIH1cblxuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgIGlucHV0LnNlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7XG4gICAgaW5wdXQuc2VsZWN0aW9uRW5kID0gTWF0aC5taW4oZW5kLCBpbnB1dC52YWx1ZS5sZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIHNldE9mZnNldHMoaW5wdXQsIG9mZnNldHMpO1xuICB9XG59XG5cbnZhciBza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQgPSBjYW5Vc2VET00gJiYgJ2RvY3VtZW50TW9kZScgaW4gZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDw9IDExO1xuXG52YXIgZXZlbnRUeXBlcyQzID0ge1xuICBzZWxlY3Q6IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogJ29uU2VsZWN0JyxcbiAgICAgIGNhcHR1cmVkOiAnb25TZWxlY3RDYXB0dXJlJ1xuICAgIH0sXG4gICAgZGVwZW5kZW5jaWVzOiBbVE9QX0JMVVIsIFRPUF9DT05URVhUX01FTlUsIFRPUF9EUkFHX0VORCwgVE9QX0ZPQ1VTLCBUT1BfS0VZX0RPV04sIFRPUF9LRVlfVVAsIFRPUF9NT1VTRV9ET1dOLCBUT1BfTU9VU0VfVVAsIFRPUF9TRUxFQ1RJT05fQ0hBTkdFXVxuICB9XG59O1xuXG52YXIgYWN0aXZlRWxlbWVudCQxID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50SW5zdCQxID0gbnVsbDtcbnZhciBsYXN0U2VsZWN0aW9uID0gbnVsbDtcbnZhciBtb3VzZURvd24gPSBmYWxzZTtcblxuLyoqXG4gKiBHZXQgYW4gb2JqZWN0IHdoaWNoIGlzIGEgdW5pcXVlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgbm90IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG5vZGVzIG9yIGJyb3dzZXJzLCBidXRcbiAqIHR3byBpZGVudGljYWwgc2VsZWN0aW9ucyBvbiB0aGUgc2FtZSBub2RlIHdpbGwgcmV0dXJuIGlkZW50aWNhbCBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24obm9kZSkge1xuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBub2RlICYmIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhub2RlKSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGFydDogbm9kZS5zZWxlY3Rpb25TdGFydCxcbiAgICAgIGVuZDogbm9kZS5zZWxlY3Rpb25FbmRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHZhciB3aW4gPSBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbigpO1xuICAgIHJldHVybiB7XG4gICAgICBhbmNob3JOb2RlOiBzZWxlY3Rpb24uYW5jaG9yTm9kZSxcbiAgICAgIGFuY2hvck9mZnNldDogc2VsZWN0aW9uLmFuY2hvck9mZnNldCxcbiAgICAgIGZvY3VzTm9kZTogc2VsZWN0aW9uLmZvY3VzTm9kZSxcbiAgICAgIGZvY3VzT2Zmc2V0OiBzZWxlY3Rpb24uZm9jdXNPZmZzZXRcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogR2V0IGRvY3VtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQgdGFyZ2V0LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFRhcmdldFxuICogQHJldHVybiB7RG9jdW1lbnR9XG4gKi9cbmZ1bmN0aW9uIGdldEV2ZW50VGFyZ2V0RG9jdW1lbnQoZXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIGV2ZW50VGFyZ2V0LndpbmRvdyA9PT0gZXZlbnRUYXJnZXQgPyBldmVudFRhcmdldC5kb2N1bWVudCA6IGV2ZW50VGFyZ2V0Lm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gZXZlbnRUYXJnZXQgOiBldmVudFRhcmdldC5vd25lckRvY3VtZW50O1xufVxuXG4vKipcbiAqIFBvbGwgc2VsZWN0aW9uIHRvIHNlZSB3aGV0aGVyIGl0J3MgY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFRhcmdldFxuICogQHJldHVybiB7P1N5bnRoZXRpY0V2ZW50fVxuICovXG5mdW5jdGlvbiBjb25zdHJ1Y3RTZWxlY3RFdmVudChuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgLy8gRW5zdXJlIHdlIGhhdmUgdGhlIHJpZ2h0IGVsZW1lbnQsIGFuZCB0aGF0IHRoZSB1c2VyIGlzIG5vdCBkcmFnZ2luZyBhXG4gIC8vIHNlbGVjdGlvbiAodGhpcyBtYXRjaGVzIG5hdGl2ZSBgc2VsZWN0YCBldmVudCBiZWhhdmlvcikuIEluIEhUTUw1LCBzZWxlY3RcbiAgLy8gZmlyZXMgb25seSBvbiBpbnB1dCBhbmQgdGV4dGFyZWEgdGh1cyBpZiB0aGVyZSdzIG5vIGZvY3VzZWQgZWxlbWVudCB3ZVxuICAvLyB3b24ndCBkaXNwYXRjaC5cbiAgdmFyIGRvYyA9IGdldEV2ZW50VGFyZ2V0RG9jdW1lbnQobmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGlmIChtb3VzZURvd24gfHwgYWN0aXZlRWxlbWVudCQxID09IG51bGwgfHwgYWN0aXZlRWxlbWVudCQxICE9PSBnZXRBY3RpdmVFbGVtZW50KGRvYykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIE9ubHkgZmlyZSB3aGVuIHNlbGVjdGlvbiBoYXMgYWN0dWFsbHkgY2hhbmdlZC5cbiAgdmFyIGN1cnJlbnRTZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oYWN0aXZlRWxlbWVudCQxKTtcbiAgaWYgKCFsYXN0U2VsZWN0aW9uIHx8ICFzaGFsbG93RXF1YWwobGFzdFNlbGVjdGlvbiwgY3VycmVudFNlbGVjdGlvbikpIHtcbiAgICBsYXN0U2VsZWN0aW9uID0gY3VycmVudFNlbGVjdGlvbjtcblxuICAgIHZhciBzeW50aGV0aWNFdmVudCA9IFN5bnRoZXRpY0V2ZW50LmdldFBvb2xlZChldmVudFR5cGVzJDMuc2VsZWN0LCBhY3RpdmVFbGVtZW50SW5zdCQxLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gICAgc3ludGhldGljRXZlbnQudHlwZSA9ICdzZWxlY3QnO1xuICAgIHN5bnRoZXRpY0V2ZW50LnRhcmdldCA9IGFjdGl2ZUVsZW1lbnQkMTtcblxuICAgIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoc3ludGhldGljRXZlbnQpO1xuXG4gICAgcmV0dXJuIHN5bnRoZXRpY0V2ZW50O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogVGhpcyBwbHVnaW4gY3JlYXRlcyBhbiBgb25TZWxlY3RgIGV2ZW50IHRoYXQgbm9ybWFsaXplcyBzZWxlY3QgZXZlbnRzXG4gKiBhY3Jvc3MgZm9ybSBlbGVtZW50cy5cbiAqXG4gKiBTdXBwb3J0ZWQgZWxlbWVudHMgYXJlOlxuICogLSBpbnB1dCAoc2VlIGBpc1RleHRJbnB1dEVsZW1lbnRgKVxuICogLSB0ZXh0YXJlYVxuICogLSBjb250ZW50RWRpdGFibGVcbiAqXG4gKiBUaGlzIGRpZmZlcnMgZnJvbSBuYXRpdmUgYnJvd3NlciBpbXBsZW1lbnRhdGlvbnMgaW4gdGhlIGZvbGxvd2luZyB3YXlzOlxuICogLSBGaXJlcyBvbiBjb250ZW50RWRpdGFibGUgZmllbGRzIGFzIHdlbGwgYXMgaW5wdXRzLlxuICogLSBGaXJlcyBmb3IgY29sbGFwc2VkIHNlbGVjdGlvbi5cbiAqIC0gRmlyZXMgYWZ0ZXIgdXNlciBpbnB1dC5cbiAqL1xudmFyIFNlbGVjdEV2ZW50UGx1Z2luID0ge1xuICBldmVudFR5cGVzOiBldmVudFR5cGVzJDMsXG5cbiAgZXh0cmFjdEV2ZW50czogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgdmFyIGRvYyA9IGdldEV2ZW50VGFyZ2V0RG9jdW1lbnQobmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIC8vIFRyYWNrIHdoZXRoZXIgYWxsIGxpc3RlbmVycyBleGlzdHMgZm9yIHRoaXMgcGx1Z2luLiBJZiBub25lIGV4aXN0LCB3ZSBkb1xuICAgIC8vIG5vdCBleHRyYWN0IGV2ZW50cy4gU2VlICMzNjM5LlxuICAgIGlmICghZG9jIHx8ICFpc0xpc3RlbmluZ1RvQWxsRGVwZW5kZW5jaWVzKCdvblNlbGVjdCcsIGRvYykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciB0YXJnZXROb2RlID0gdGFyZ2V0SW5zdCA/IGdldE5vZGVGcm9tSW5zdGFuY2UkMSh0YXJnZXRJbnN0KSA6IHdpbmRvdztcblxuICAgIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7XG4gICAgICAvLyBUcmFjayB0aGUgaW5wdXQgbm9kZSB0aGF0IGhhcyBmb2N1cy5cbiAgICAgIGNhc2UgVE9QX0ZPQ1VTOlxuICAgICAgICBpZiAoaXNUZXh0SW5wdXRFbGVtZW50KHRhcmdldE5vZGUpIHx8IHRhcmdldE5vZGUuY29udGVudEVkaXRhYmxlID09PSAndHJ1ZScpIHtcbiAgICAgICAgICBhY3RpdmVFbGVtZW50JDEgPSB0YXJnZXROb2RlO1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSB0YXJnZXRJbnN0O1xuICAgICAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUT1BfQkxVUjpcbiAgICAgICAgYWN0aXZlRWxlbWVudCQxID0gbnVsbDtcbiAgICAgICAgYWN0aXZlRWxlbWVudEluc3QkMSA9IG51bGw7XG4gICAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICBicmVhaztcbiAgICAgIC8vIERvbid0IGZpcmUgdGhlIGV2ZW50IHdoaWxlIHRoZSB1c2VyIGlzIGRyYWdnaW5nLiBUaGlzIG1hdGNoZXMgdGhlXG4gICAgICAvLyBzZW1hbnRpY3Mgb2YgdGhlIG5hdGl2ZSBzZWxlY3QgZXZlbnQuXG4gICAgICBjYXNlIFRPUF9NT1VTRV9ET1dOOlxuICAgICAgICBtb3VzZURvd24gPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVE9QX0NPTlRFWFRfTUVOVTpcbiAgICAgIGNhc2UgVE9QX01PVVNFX1VQOlxuICAgICAgY2FzZSBUT1BfRFJBR19FTkQ6XG4gICAgICAgIG1vdXNlRG93biA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gY29uc3RydWN0U2VsZWN0RXZlbnQobmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICAgIC8vIENocm9tZSBhbmQgSUUgZmlyZSBub24tc3RhbmRhcmQgZXZlbnQgd2hlbiBzZWxlY3Rpb24gaXMgY2hhbmdlZCAoYW5kXG4gICAgICAvLyBzb21ldGltZXMgd2hlbiBpdCBoYXNuJ3QpLiBJRSdzIGV2ZW50IGZpcmVzIG91dCBvZiBvcmRlciB3aXRoIHJlc3BlY3RcbiAgICAgIC8vIHRvIGtleSBhbmQgaW5wdXQgZXZlbnRzIG9uIGRlbGV0aW9uLCBzbyB3ZSBkaXNjYXJkIGl0LlxuICAgICAgLy9cbiAgICAgIC8vIEZpcmVmb3ggZG9lc24ndCBzdXBwb3J0IHNlbGVjdGlvbmNoYW5nZSwgc28gY2hlY2sgc2VsZWN0aW9uIHN0YXR1c1xuICAgICAgLy8gYWZ0ZXIgZWFjaCBrZXkgZW50cnkuIFRoZSBzZWxlY3Rpb24gY2hhbmdlcyBhZnRlciBrZXlkb3duIGFuZCBiZWZvcmVcbiAgICAgIC8vIGtleXVwLCBidXQgd2UgY2hlY2sgb24ga2V5ZG93biBhcyB3ZWxsIGluIHRoZSBjYXNlIG9mIGhvbGRpbmcgZG93biBhXG4gICAgICAvLyBrZXksIHdoZW4gbXVsdGlwbGUga2V5ZG93biBldmVudHMgYXJlIGZpcmVkIGJ1dCBvbmx5IG9uZSBrZXl1cCBpcy5cbiAgICAgIC8vIFRoaXMgaXMgYWxzbyBvdXIgYXBwcm9hY2ggZm9yIElFIGhhbmRsaW5nLCBmb3IgdGhlIHJlYXNvbiBhYm92ZS5cbiAgICAgIGNhc2UgVE9QX1NFTEVDVElPTl9DSEFOR0U6XG4gICAgICAgIGlmIChza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgY2FzZSBUT1BfS0VZX0RPV046XG4gICAgICBjYXNlIFRPUF9LRVlfVVA6XG4gICAgICAgIHJldHVybiBjb25zdHJ1Y3RTZWxlY3RFdmVudChuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG4vKipcbiAqIEluamVjdCBtb2R1bGVzIGZvciByZXNvbHZpbmcgRE9NIGhpZXJhcmNoeSBhbmQgcGx1Z2luIG9yZGVyaW5nLlxuICovXG5pbmplY3Rpb24uaW5qZWN0RXZlbnRQbHVnaW5PcmRlcihET01FdmVudFBsdWdpbk9yZGVyKTtcbnNldENvbXBvbmVudFRyZWUoZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZSQxLCBnZXRJbnN0YW5jZUZyb21Ob2RlJDEsIGdldE5vZGVGcm9tSW5zdGFuY2UkMSk7XG5cbi8qKlxuICogU29tZSBpbXBvcnRhbnQgZXZlbnQgcGx1Z2lucyBpbmNsdWRlZCBieSBkZWZhdWx0ICh3aXRob3V0IGhhdmluZyB0byByZXF1aXJlXG4gKiB0aGVtKS5cbiAqL1xuaW5qZWN0aW9uLmluamVjdEV2ZW50UGx1Z2luc0J5TmFtZSh7XG4gIFNpbXBsZUV2ZW50UGx1Z2luOiBTaW1wbGVFdmVudFBsdWdpbixcbiAgRW50ZXJMZWF2ZUV2ZW50UGx1Z2luOiBFbnRlckxlYXZlRXZlbnRQbHVnaW4sXG4gIENoYW5nZUV2ZW50UGx1Z2luOiBDaGFuZ2VFdmVudFBsdWdpbixcbiAgU2VsZWN0RXZlbnRQbHVnaW46IFNlbGVjdEV2ZW50UGx1Z2luLFxuICBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luOiBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luXG59KTtcblxudmFyIGRpZFdhcm5TZWxlY3RlZFNldE9uT3B0aW9uID0gZmFsc2U7XG52YXIgZGlkV2FybkludmFsaWRDaGlsZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBmbGF0dGVuQ2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgdmFyIGNvbnRlbnQgPSAnJztcblxuICAvLyBGbGF0dGVuIGNoaWxkcmVuLiBXZSdsbCB3YXJuIGlmIHRoZXkgYXJlIGludmFsaWRcbiAgLy8gZHVyaW5nIHZhbGlkYXRlUHJvcHMoKSB3aGljaCBydW5zIGZvciBoeWRyYXRpb24gdG9vLlxuICAvLyBOb3RlIHRoYXQgdGhpcyB3b3VsZCB0aHJvdyBvbiBub24tZWxlbWVudCBvYmplY3RzLlxuICAvLyBFbGVtZW50cyBhcmUgc3RyaW5naWZpZWQgKHdoaWNoIGlzIG5vcm1hbGx5IGlycmVsZXZhbnRcbiAgLy8gYnV0IG1hdHRlcnMgZm9yIDxmYnQ+KS5cbiAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgaWYgKGNoaWxkID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29udGVudCArPSBjaGlsZDtcbiAgICAvLyBOb3RlOiB3ZSBkb24ndCB3YXJuIGFib3V0IGludmFsaWQgY2hpbGRyZW4gaGVyZS5cbiAgICAvLyBJbnN0ZWFkLCB0aGlzIGlzIGRvbmUgc2VwYXJhdGVseSBiZWxvdyBzbyB0aGF0XG4gICAgLy8gaXQgaGFwcGVucyBkdXJpbmcgdGhlIGh5ZHJhdGlvbiBjb2RlcGF0aCB0b28uXG4gIH0pO1xuXG4gIHJldHVybiBjb250ZW50O1xufVxuXG4vKipcbiAqIEltcGxlbWVudHMgYW4gPG9wdGlvbj4gaG9zdCBjb21wb25lbnQgdGhhdCB3YXJucyB3aGVuIGBzZWxlY3RlZGAgaXMgc2V0LlxuICovXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcHMoZWxlbWVudCwgcHJvcHMpIHtcbiAge1xuICAgIC8vIFRoaXMgbWlycm9ycyB0aGUgY29kZXBhdGggYWJvdmUsIGJ1dCBydW5zIGZvciBoeWRyYXRpb24gdG9vLlxuICAgIC8vIFdhcm4gYWJvdXQgaW52YWxpZCBjaGlsZHJlbiBoZXJlIHNvIHRoYXQgY2xpZW50IGFuZCBoeWRyYXRpb24gYXJlIGNvbnNpc3RlbnQuXG4gICAgLy8gVE9ETzogdGhpcyBzZWVtcyBsaWtlIGl0IGNvdWxkIGNhdXNlIGEgREVWLW9ubHkgdGhyb3cgZm9yIGh5ZHJhdGlvblxuICAgIC8vIGlmIGNoaWxkcmVuIGNvbnRhaW5zIGEgbm9uLWVsZW1lbnQgb2JqZWN0LiBXZSBzaG91bGQgdHJ5IHRvIGF2b2lkIHRoYXQuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ29iamVjdCcgJiYgcHJvcHMuY2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgIFJlYWN0LkNoaWxkcmVuLmZvckVhY2gocHJvcHMuY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgY2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY2hpbGQudHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZENoaWxkKSB7XG4gICAgICAgICAgZGlkV2FybkludmFsaWRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgd2FybmluZyQxKGZhbHNlLCAnT25seSBzdHJpbmdzIGFuZCBudW1iZXJzIGFyZSBzdXBwb3J0ZWQgYXMgPG9wdGlvbj4gY2hpbGRyZW4uJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRPRE86IFJlbW92ZSBzdXBwb3J0IGZvciBgc2VsZWN0ZWRgIGluIDxvcHRpb24+LlxuICAgIGlmIChwcm9wcy5zZWxlY3RlZCAhPSBudWxsICYmICFkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbikge1xuICAgICAgd2FybmluZyQxKGZhbHNlLCAnVXNlIHRoZSBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIHByb3BzIG9uIDxzZWxlY3Q+IGluc3RlYWQgb2YgJyArICdzZXR0aW5nIGBzZWxlY3RlZGAgb24gPG9wdGlvbj4uJyk7XG4gICAgICBkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbiA9IHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIkMShlbGVtZW50LCBwcm9wcykge1xuICAvLyB2YWx1ZT1cIlwiIHNob3VsZCBtYWtlIGEgdmFsdWUgYXR0cmlidXRlICgjNjIxOSlcbiAgaWYgKHByb3BzLnZhbHVlICE9IG51bGwpIHtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgndmFsdWUnLCB0b1N0cmluZyhnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlKSkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBob3N0UHJvcHMgPSBfYXNzaWduKHsgY2hpbGRyZW46IHVuZGVmaW5lZCB9LCBwcm9wcyk7XG4gIHZhciBjb250ZW50ID0gZmxhdHRlbkNoaWxkcmVuKHByb3BzLmNoaWxkcmVuKTtcblxuICBpZiAoY29udGVudCkge1xuICAgIGhvc3RQcm9wcy5jaGlsZHJlbiA9IGNvbnRlbnQ7XG4gIH1cblxuICByZXR1cm4gaG9zdFByb3BzO1xufVxuXG4vLyBUT0RPOiBkaXJlY3QgaW1wb3J0cyBsaWtlIHNvbWUtcGFja2FnZS9zcmMvKiBhcmUgYmFkLiBGaXggbWUuXG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSB2b2lkIDA7XG5cbntcbiAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICB2YXIgb3duZXJOYW1lID0gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKTtcbiAgaWYgKG93bmVyTmFtZSkge1xuICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBvd25lck5hbWUgKyAnYC4nO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxudmFyIHZhbHVlUHJvcE5hbWVzID0gWyd2YWx1ZScsICdkZWZhdWx0VmFsdWUnXTtcblxuLyoqXG4gKiBWYWxpZGF0aW9uIGZ1bmN0aW9uIGZvciBgdmFsdWVgIGFuZCBgZGVmYXVsdFZhbHVlYC5cbiAqL1xuZnVuY3Rpb24gY2hlY2tTZWxlY3RQcm9wVHlwZXMocHJvcHMpIHtcbiAgUmVhY3RDb250cm9sbGVkVmFsdWVQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoJ3NlbGVjdCcsIHByb3BzKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlUHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHByb3BOYW1lID0gdmFsdWVQcm9wTmFtZXNbaV07XG4gICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHByb3BzW3Byb3BOYW1lXSk7XG4gICAgaWYgKHByb3BzLm11bHRpcGxlICYmICFpc0FycmF5KSB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICdUaGUgYCVzYCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11c3QgYmUgYW4gYXJyYXkgaWYgJyArICdgbXVsdGlwbGVgIGlzIHRydWUuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkpO1xuICAgIH0gZWxzZSBpZiAoIXByb3BzLm11bHRpcGxlICYmIGlzQXJyYXkpIHtcbiAgICAgIHdhcm5pbmckMShmYWxzZSwgJ1RoZSBgJXNgIHByb3Agc3VwcGxpZWQgdG8gPHNlbGVjdD4gbXVzdCBiZSBhIHNjYWxhciAnICsgJ3ZhbHVlIGlmIGBtdWx0aXBsZWAgaXMgZmFsc2UuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVPcHRpb25zKG5vZGUsIG11bHRpcGxlLCBwcm9wVmFsdWUsIHNldERlZmF1bHRTZWxlY3RlZCkge1xuICB2YXIgb3B0aW9ucyA9IG5vZGUub3B0aW9ucztcblxuICBpZiAobXVsdGlwbGUpIHtcbiAgICB2YXIgc2VsZWN0ZWRWYWx1ZXMgPSBwcm9wVmFsdWU7XG4gICAgdmFyIHNlbGVjdGVkVmFsdWUgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBQcmVmaXggdG8gYXZvaWQgY2hhb3Mgd2l0aCBzcGVjaWFsIGtleXMuXG4gICAgICBzZWxlY3RlZFZhbHVlWyckJyArIHNlbGVjdGVkVmFsdWVzW2ldXSA9IHRydWU7XG4gICAgfVxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBvcHRpb25zLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIHNlbGVjdGVkID0gc2VsZWN0ZWRWYWx1ZS5oYXNPd25Qcm9wZXJ0eSgnJCcgKyBvcHRpb25zW19pXS52YWx1ZSk7XG4gICAgICBpZiAob3B0aW9uc1tfaV0uc2VsZWN0ZWQgIT09IHNlbGVjdGVkKSB7XG4gICAgICAgIG9wdGlvbnNbX2ldLnNlbGVjdGVkID0gc2VsZWN0ZWQ7XG4gICAgICB9XG4gICAgICBpZiAoc2VsZWN0ZWQgJiYgc2V0RGVmYXVsdFNlbGVjdGVkKSB7XG4gICAgICAgIG9wdGlvbnNbX2ldLmRlZmF1bHRTZWxlY3RlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIERvIG5vdCBzZXQgYHNlbGVjdC52YWx1ZWAgYXMgZXhhY3QgYmVoYXZpb3IgaXNuJ3QgY29uc2lzdGVudCBhY3Jvc3MgYWxsXG4gICAgLy8gYnJvd3NlcnMgZm9yIGFsbCBjYXNlcy5cbiAgICB2YXIgX3NlbGVjdGVkVmFsdWUgPSB0b1N0cmluZyhnZXRUb1N0cmluZ1ZhbHVlKHByb3BWYWx1ZSkpO1xuICAgIHZhciBkZWZhdWx0U2VsZWN0ZWQgPSBudWxsO1xuICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG9wdGlvbnMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgaWYgKG9wdGlvbnNbX2kyXS52YWx1ZSA9PT0gX3NlbGVjdGVkVmFsdWUpIHtcbiAgICAgICAgb3B0aW9uc1tfaTJdLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHNldERlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgICAgIG9wdGlvbnNbX2kyXS5kZWZhdWx0U2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkZWZhdWx0U2VsZWN0ZWQgPT09IG51bGwgJiYgIW9wdGlvbnNbX2kyXS5kaXNhYmxlZCkge1xuICAgICAgICBkZWZhdWx0U2VsZWN0ZWQgPSBvcHRpb25zW19pMl07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWZhdWx0U2VsZWN0ZWQgIT09IG51bGwpIHtcbiAgICAgIGRlZmF1bHRTZWxlY3RlZC5zZWxlY3RlZCA9IHRydWU7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBhIDxzZWxlY3Q+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIG9wdGlvbmFsbHkgc2V0dGluZyB0aGVcbiAqIHByb3BzIGB2YWx1ZWAgYW5kIGBkZWZhdWx0VmFsdWVgLiBJZiBgbXVsdGlwbGVgIGlzIGZhbHNlLCB0aGUgcHJvcCBtdXN0IGJlIGFcbiAqIHN0cmluZ2FibGUuIElmIGBtdWx0aXBsZWAgaXMgdHJ1ZSwgdGhlIHByb3AgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdhYmxlcy5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnMgdGhhdCBjaGFuZ2UgdGhlXG4gKiBzZWxlY3RlZCBvcHRpb24gd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIHJlbmRlcmVkIG9wdGlvbnMuXG4gKlxuICogSWYgaXQgaXMgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgb3B0aW9ucyB3aWxsIG5vdFxuICogdXBkYXRlIGluIHJlc3BvbnNlIHRvIHVzZXIgYWN0aW9ucy4gSW5zdGVhZCwgdGhlIGB2YWx1ZWAgcHJvcCBtdXN0IGNoYW5nZSBpblxuICogb3JkZXIgZm9yIHRoZSByZW5kZXJlZCBvcHRpb25zIHRvIHVwZGF0ZS5cbiAqXG4gKiBJZiBgZGVmYXVsdFZhbHVlYCBpcyBwcm92aWRlZCwgYW55IG9wdGlvbnMgd2l0aCB0aGUgc3VwcGxpZWQgdmFsdWVzIHdpbGwgYmVcbiAqIHNlbGVjdGVkLlxuICovXG5cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHJldHVybiBfYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUkMShlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHtcbiAgICBjaGVja1NlbGVjdFByb3BUeXBlcyhwcm9wcyk7XG4gIH1cblxuICBub2RlLl93cmFwcGVyU3RhdGUgPSB7XG4gICAgd2FzTXVsdGlwbGU6ICEhcHJvcHMubXVsdGlwbGVcbiAgfTtcblxuICB7XG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxKSB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICdTZWxlY3QgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIHNlbGVjdCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cycpO1xuICAgICAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICBub2RlLm11bHRpcGxlID0gISFwcm9wcy5tdWx0aXBsZTtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7XG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCB2YWx1ZSwgZmFsc2UpO1xuICB9IGVsc2UgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5kZWZhdWx0VmFsdWUsIHRydWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvc3RVcGRhdGVXcmFwcGVyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHdhc011bHRpcGxlID0gbm9kZS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlO1xuICBub2RlLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGUgPSAhIXByb3BzLm11bHRpcGxlO1xuXG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgdmFsdWUsIGZhbHNlKTtcbiAgfSBlbHNlIGlmICh3YXNNdWx0aXBsZSAhPT0gISFwcm9wcy5tdWx0aXBsZSkge1xuICAgIC8vIEZvciBzaW1wbGljaXR5LCByZWFwcGx5IGBkZWZhdWx0VmFsdWVgIGlmIGBtdWx0aXBsZWAgaXMgdG9nZ2xlZC5cbiAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgcHJvcHMuZGVmYXVsdFZhbHVlLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmV2ZXJ0IHRoZSBzZWxlY3QgYmFjayB0byBpdHMgZGVmYXVsdCB1bnNlbGVjdGVkIHN0YXRlLlxuICAgICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5tdWx0aXBsZSA/IFtdIDogJycsIGZhbHNlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHZhbHVlLCBmYWxzZSk7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5WYWxEZWZhdWx0VmFsID0gZmFsc2U7XG5cbi8qKlxuICogSW1wbGVtZW50cyBhIDx0ZXh0YXJlYT4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgc2V0dGluZyBgdmFsdWVgLCBhbmRcbiAqIGBkZWZhdWx0VmFsdWVgLiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgdHJhZGl0aW9uYWwgRE9NIEFQSSBiZWNhdXNlIHZhbHVlIGlzXG4gKiB1c3VhbGx5IHNldCBhcyBQQ0RBVEEgY2hpbGRyZW4uXG4gKlxuICogSWYgYHZhbHVlYCBpcyBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zIHRoYXQgYWZmZWN0IHRoZVxuICogdmFsdWUgd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogSWYgYHZhbHVlYCBpcyBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGxcbiAqIG5vdCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuIEluc3RlYWQsIHRoZSBgdmFsdWVgIHByb3AgbXVzdCBjaGFuZ2UgaW5cbiAqIG9yZGVyIGZvciB0aGUgcmVuZGVyZWQgZWxlbWVudCB0byBiZSB1cGRhdGVkLlxuICpcbiAqIFRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhbiBlbXB0eSB2YWx1ZSwgdGhlIHByb3BcbiAqIGBkZWZhdWx0VmFsdWVgIGlmIHNwZWNpZmllZCwgb3IgdGhlIGNoaWxkcmVuIGNvbnRlbnQgKGRlcHJlY2F0ZWQpLlxuICovXG5cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyQzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgIShwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PSBudWxsKSA/IGludmFyaWFudChmYWxzZSwgJ2BkYW5nZXJvdXNseVNldElubmVySFRNTGAgZG9lcyBub3QgbWFrZSBzZW5zZSBvbiA8dGV4dGFyZWE+LicpIDogdm9pZCAwO1xuXG4gIC8vIEFsd2F5cyBzZXQgY2hpbGRyZW4gdG8gdGhlIHNhbWUgdGhpbmcuIEluIElFOSwgdGhlIHNlbGVjdGlvbiByYW5nZSB3aWxsXG4gIC8vIGdldCByZXNldCBpZiBgdGV4dENvbnRlbnRgIGlzIG11dGF0ZWQuICBXZSBjb3VsZCBhZGQgYSBjaGVjayBpbiBzZXRUZXh0Q29udGVudFxuICAvLyB0byBvbmx5IHNldCB0aGUgdmFsdWUgaWYvd2hlbiB0aGUgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBub2RlIHZhbHVlICh3aGljaCB3b3VsZFxuICAvLyBjb21wbGV0ZWx5IHNvbHZlIHRoaXMgSUU5IGJ1ZyksIGJ1dCBTZWJhc3RpYW4rU29waGllIHNlZW1lZCB0byBsaWtlIHRoaXNcbiAgLy8gc29sdXRpb24uIFRoZSB2YWx1ZSBjYW4gYmUgYSBib29sZWFuIG9yIG9iamVjdCBzbyB0aGF0J3Mgd2h5IGl0J3MgZm9yY2VkXG4gIC8vIHRvIGJlIGEgc3RyaW5nLlxuICB2YXIgaG9zdFByb3BzID0gX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRWYWx1ZTogdW5kZWZpbmVkLFxuICAgIGNoaWxkcmVuOiB0b1N0cmluZyhub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKVxuICB9KTtcblxuICByZXR1cm4gaG9zdFByb3BzO1xufVxuXG5mdW5jdGlvbiBpbml0V3JhcHBlclN0YXRlJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB7XG4gICAgUmVhY3RDb250cm9sbGVkVmFsdWVQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoJ3RleHRhcmVhJywgcHJvcHMpO1xuICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsRGVmYXVsdFZhbCkge1xuICAgICAgd2FybmluZyQxKGZhbHNlLCAnJXMgY29udGFpbnMgYSB0ZXh0YXJlYSB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1ZSBwcm9wcy4gJyArICdUZXh0YXJlYSBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgdGV4dGFyZWEgJyArICdhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vZmIubWUvcmVhY3QtY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnKTtcbiAgICAgIGRpZFdhcm5WYWxEZWZhdWx0VmFsID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgaW5pdGlhbFZhbHVlID0gcHJvcHMudmFsdWU7XG5cbiAgLy8gT25seSBib3RoZXIgZmV0Y2hpbmcgZGVmYXVsdCB2YWx1ZSBpZiB3ZSdyZSBnb2luZyB0byB1c2UgaXRcbiAgaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKSB7XG4gICAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZTtcbiAgICAvLyBUT0RPICh5dW5nc3RlcnMpOiBSZW1vdmUgc3VwcG9ydCBmb3IgY2hpbGRyZW4gY29udGVudCBpbiA8dGV4dGFyZWE+LlxuICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHdhcm5pbmckMShmYWxzZSwgJ1VzZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBpbnN0ZWFkIG9mIHNldHRpbmcgJyArICdjaGlsZHJlbiBvbiA8dGV4dGFyZWE+LicpO1xuICAgICAgfVxuICAgICAgIShkZWZhdWx0VmFsdWUgPT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICdJZiB5b3Ugc3VwcGx5IGBkZWZhdWx0VmFsdWVgIG9uIGEgPHRleHRhcmVhPiwgZG8gbm90IHBhc3MgY2hpbGRyZW4uJykgOiB2b2lkIDA7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgIShjaGlsZHJlbi5sZW5ndGggPD0gMSkgPyBpbnZhcmlhbnQoZmFsc2UsICc8dGV4dGFyZWE+IGNhbiBvbmx5IGhhdmUgYXQgbW9zdCBvbmUgY2hpbGQuJykgOiB2b2lkIDA7XG4gICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW5bMF07XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHRWYWx1ZSA9IGNoaWxkcmVuO1xuICAgIH1cbiAgICBpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZSA9ICcnO1xuICAgIH1cbiAgICBpbml0aWFsVmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gIH1cblxuICBub2RlLl93cmFwcGVyU3RhdGUgPSB7XG4gICAgaW5pdGlhbFZhbHVlOiBnZXRUb1N0cmluZ1ZhbHVlKGluaXRpYWxWYWx1ZSlcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlV3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSk7XG4gIHZhciBkZWZhdWx0VmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLmRlZmF1bHRWYWx1ZSk7XG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgLy8gQ2FzdCBgdmFsdWVgIHRvIGEgc3RyaW5nIHRvIGVuc3VyZSB0aGUgdmFsdWUgaXMgc2V0IGNvcnJlY3RseS4gV2hpbGVcbiAgICAvLyBicm93c2VycyB0eXBpY2FsbHkgZG8gdGhpcyBhcyBuZWNlc3NhcnksIGpzZG9tIGRvZXNuJ3QuXG4gICAgdmFyIG5ld1ZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgIC8vIFRvIGF2b2lkIHNpZGUgZWZmZWN0cyAoc3VjaCBhcyBsb3NpbmcgdGV4dCBzZWxlY3Rpb24pLCBvbmx5IHNldCB2YWx1ZSBpZiBjaGFuZ2VkXG4gICAgaWYgKG5ld1ZhbHVlICE9PSBub2RlLnZhbHVlKSB7XG4gICAgICBub2RlLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICAgIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgPT0gbnVsbCAmJiBub2RlLmRlZmF1bHRWYWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICB9XG4gIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcoZGVmYXVsdFZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDMoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICAvLyBUaGlzIGlzIGluIHBvc3RNb3VudCBiZWNhdXNlIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBET00gbm9kZSwgd2hpY2ggaXMgbm90XG4gIC8vIGF2YWlsYWJsZSB1bnRpbCBhZnRlciB0aGUgY29tcG9uZW50IGhhcyBtb3VudGVkLlxuICB2YXIgdGV4dENvbnRlbnQgPSBub2RlLnRleHRDb250ZW50O1xuXG4gIC8vIE9ubHkgc2V0IG5vZGUudmFsdWUgaWYgdGV4dENvbnRlbnQgaXMgZXF1YWwgdG8gdGhlIGV4cGVjdGVkXG4gIC8vIGluaXRpYWwgdmFsdWUuIEluIElFMTAvSUUxMSB0aGVyZSBpcyBhIGJ1ZyB3aGVyZSB0aGUgcGxhY2Vob2xkZXIgYXR0cmlidXRlXG4gIC8vIHdpbGwgcG9wdWxhdGUgdGV4dENvbnRlbnQgYXMgd2VsbC5cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvMTAxNTI1L1xuICBpZiAodGV4dENvbnRlbnQgPT09IG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpIHtcbiAgICBub2RlLnZhbHVlID0gdGV4dENvbnRlbnQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQzKGVsZW1lbnQsIHByb3BzKSB7XG4gIC8vIERPTSBjb21wb25lbnQgaXMgc3RpbGwgbW91bnRlZDsgdXBkYXRlXG4gIHVwZGF0ZVdyYXBwZXIkMShlbGVtZW50LCBwcm9wcyk7XG59XG5cbnZhciBIVE1MX05BTUVTUEFDRSQxID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xudmFyIE1BVEhfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnO1xudmFyIFNWR19OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xuXG52YXIgTmFtZXNwYWNlcyA9IHtcbiAgaHRtbDogSFRNTF9OQU1FU1BBQ0UkMSxcbiAgbWF0aG1sOiBNQVRIX05BTUVTUEFDRSxcbiAgc3ZnOiBTVkdfTkFNRVNQQUNFXG59O1xuXG4vLyBBc3N1bWVzIHRoZXJlIGlzIG5vIHBhcmVudCBuYW1lc3BhY2UuXG5mdW5jdGlvbiBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodHlwZSkge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdzdmcnOlxuICAgICAgcmV0dXJuIFNWR19OQU1FU1BBQ0U7XG4gICAgY2FzZSAnbWF0aCc6XG4gICAgICByZXR1cm4gTUFUSF9OQU1FU1BBQ0U7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBIVE1MX05BTUVTUEFDRSQxO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldENoaWxkTmFtZXNwYWNlKHBhcmVudE5hbWVzcGFjZSwgdHlwZSkge1xuICBpZiAocGFyZW50TmFtZXNwYWNlID09IG51bGwgfHwgcGFyZW50TmFtZXNwYWNlID09PSBIVE1MX05BTUVTUEFDRSQxKSB7XG4gICAgLy8gTm8gKG9yIGRlZmF1bHQpIHBhcmVudCBuYW1lc3BhY2U6IHBvdGVudGlhbCBlbnRyeSBwb2ludC5cbiAgICByZXR1cm4gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpO1xuICB9XG4gIGlmIChwYXJlbnROYW1lc3BhY2UgPT09IFNWR19OQU1FU1BBQ0UgJiYgdHlwZSA9PT0gJ2ZvcmVpZ25PYmplY3QnKSB7XG4gICAgLy8gV2UncmUgbGVhdmluZyBTVkcuXG4gICAgcmV0dXJuIEhUTUxfTkFNRVNQQUNFJDE7XG4gIH1cbiAgLy8gQnkgZGVmYXVsdCwgcGFzcyBuYW1lc3BhY2UgYmVsb3cuXG4gIHJldHVybiBwYXJlbnROYW1lc3BhY2U7XG59XG5cbi8qIGdsb2JhbHMgTVNBcHAgKi9cblxuLyoqXG4gKiBDcmVhdGUgYSBmdW5jdGlvbiB3aGljaCBoYXMgJ3Vuc2FmZScgcHJpdmlsZWdlcyAocmVxdWlyZWQgYnkgd2luZG93czggYXBwcylcbiAqL1xudmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSBmdW5jdGlvbiAoZnVuYykge1xuICBpZiAodHlwZW9mIE1TQXBwICE9PSAndW5kZWZpbmVkJyAmJiBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMykge1xuICAgICAgTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuYyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cbn07XG5cbi8vIFNWRyB0ZW1wIGNvbnRhaW5lciBmb3IgSUUgbGFja2luZyBpbm5lckhUTUxcbnZhciByZXVzYWJsZVNWR0NvbnRhaW5lciA9IHZvaWQgMDtcblxuLyoqXG4gKiBTZXQgdGhlIGlubmVySFRNTCBwcm9wZXJ0eSBvZiBhIG5vZGVcbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBodG1sXG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIHNldElubmVySFRNTCA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKG5vZGUsIGh0bWwpIHtcbiAgLy8gSUUgZG9lcyBub3QgaGF2ZSBpbm5lckhUTUwgZm9yIFNWRyBub2Rlcywgc28gaW5zdGVhZCB3ZSBpbmplY3QgdGhlXG4gIC8vIG5ldyBtYXJrdXAgaW4gYSB0ZW1wIG5vZGUgYW5kIHRoZW4gbW92ZSB0aGUgY2hpbGQgbm9kZXMgYWNyb3NzIGludG9cbiAgLy8gdGhlIHRhcmdldCBub2RlXG5cbiAgaWYgKG5vZGUubmFtZXNwYWNlVVJJID09PSBOYW1lc3BhY2VzLnN2ZyAmJiAhKCdpbm5lckhUTUwnIGluIG5vZGUpKSB7XG4gICAgcmV1c2FibGVTVkdDb250YWluZXIgPSByZXVzYWJsZVNWR0NvbnRhaW5lciB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICByZXVzYWJsZVNWR0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPHN2Zz4nICsgaHRtbCArICc8L3N2Zz4nO1xuICAgIHZhciBzdmdOb2RlID0gcmV1c2FibGVTVkdDb250YWluZXIuZmlyc3RDaGlsZDtcbiAgICB3aGlsZSAobm9kZS5maXJzdENoaWxkKSB7XG4gICAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUuZmlyc3RDaGlsZCk7XG4gICAgfVxuICAgIHdoaWxlIChzdmdOb2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoc3ZnTm9kZS5maXJzdENoaWxkKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbm9kZS5pbm5lckhUTUwgPSBodG1sO1xuICB9XG59KTtcblxuLyoqXG4gKiBTZXQgdGhlIHRleHRDb250ZW50IHByb3BlcnR5IG9mIGEgbm9kZS4gRm9yIHRleHQgdXBkYXRlcywgaXQncyBmYXN0ZXJcbiAqIHRvIHNldCB0aGUgYG5vZGVWYWx1ZWAgb2YgdGhlIFRleHQgbm9kZSBkaXJlY3RseSBpbnN0ZWFkIG9mIHVzaW5nXG4gKiBgLnRleHRDb250ZW50YCB3aGljaCB3aWxsIHJlbW92ZSB0aGUgZXhpc3Rpbmcgbm9kZSBhbmQgY3JlYXRlIGEgbmV3IG9uZS5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIHNldFRleHRDb250ZW50ID0gZnVuY3Rpb24gKG5vZGUsIHRleHQpIHtcbiAgaWYgKHRleHQpIHtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcblxuICAgIGlmIChmaXJzdENoaWxkICYmIGZpcnN0Q2hpbGQgPT09IG5vZGUubGFzdENoaWxkICYmIGZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSB0ZXh0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBub2RlLnRleHRDb250ZW50ID0gdGV4dDtcbn07XG5cbi8vIExpc3QgZGVyaXZlZCBmcm9tIEdlY2tvIHNvdXJjZSBjb2RlOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvZ2Vja28tZGV2L2Jsb2IvNGU2MzhlZmM3MS9sYXlvdXQvc3R5bGUvdGVzdC9wcm9wZXJ0eV9kYXRhYmFzZS5qc1xudmFyIHNob3J0aGFuZFRvTG9uZ2hhbmQgPSB7XG4gIGFuaW1hdGlvbjogWydhbmltYXRpb25EZWxheScsICdhbmltYXRpb25EaXJlY3Rpb24nLCAnYW5pbWF0aW9uRHVyYXRpb24nLCAnYW5pbWF0aW9uRmlsbE1vZGUnLCAnYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQnLCAnYW5pbWF0aW9uTmFtZScsICdhbmltYXRpb25QbGF5U3RhdGUnLCAnYW5pbWF0aW9uVGltaW5nRnVuY3Rpb24nXSxcbiAgYmFja2dyb3VuZDogWydiYWNrZ3JvdW5kQXR0YWNobWVudCcsICdiYWNrZ3JvdW5kQ2xpcCcsICdiYWNrZ3JvdW5kQ29sb3InLCAnYmFja2dyb3VuZEltYWdlJywgJ2JhY2tncm91bmRPcmlnaW4nLCAnYmFja2dyb3VuZFBvc2l0aW9uWCcsICdiYWNrZ3JvdW5kUG9zaXRpb25ZJywgJ2JhY2tncm91bmRSZXBlYXQnLCAnYmFja2dyb3VuZFNpemUnXSxcbiAgYmFja2dyb3VuZFBvc2l0aW9uOiBbJ2JhY2tncm91bmRQb3NpdGlvblgnLCAnYmFja2dyb3VuZFBvc2l0aW9uWSddLFxuICBib3JkZXI6IFsnYm9yZGVyQm90dG9tQ29sb3InLCAnYm9yZGVyQm90dG9tU3R5bGUnLCAnYm9yZGVyQm90dG9tV2lkdGgnLCAnYm9yZGVySW1hZ2VPdXRzZXQnLCAnYm9yZGVySW1hZ2VSZXBlYXQnLCAnYm9yZGVySW1hZ2VTbGljZScsICdib3JkZXJJbWFnZVNvdXJjZScsICdib3JkZXJJbWFnZVdpZHRoJywgJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyTGVmdFdpZHRoJywgJ2JvcmRlclJpZ2h0Q29sb3InLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJSaWdodFdpZHRoJywgJ2JvcmRlclRvcENvbG9yJywgJ2JvcmRlclRvcFN0eWxlJywgJ2JvcmRlclRvcFdpZHRoJ10sXG4gIGJvcmRlckJsb2NrRW5kOiBbJ2JvcmRlckJsb2NrRW5kQ29sb3InLCAnYm9yZGVyQmxvY2tFbmRTdHlsZScsICdib3JkZXJCbG9ja0VuZFdpZHRoJ10sXG4gIGJvcmRlckJsb2NrU3RhcnQ6IFsnYm9yZGVyQmxvY2tTdGFydENvbG9yJywgJ2JvcmRlckJsb2NrU3RhcnRTdHlsZScsICdib3JkZXJCbG9ja1N0YXJ0V2lkdGgnXSxcbiAgYm9yZGVyQm90dG9tOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckJvdHRvbVdpZHRoJ10sXG4gIGJvcmRlckNvbG9yOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclRvcENvbG9yJ10sXG4gIGJvcmRlckltYWdlOiBbJ2JvcmRlckltYWdlT3V0c2V0JywgJ2JvcmRlckltYWdlUmVwZWF0JywgJ2JvcmRlckltYWdlU2xpY2UnLCAnYm9yZGVySW1hZ2VTb3VyY2UnLCAnYm9yZGVySW1hZ2VXaWR0aCddLFxuICBib3JkZXJJbmxpbmVFbmQ6IFsnYm9yZGVySW5saW5lRW5kQ29sb3InLCAnYm9yZGVySW5saW5lRW5kU3R5bGUnLCAnYm9yZGVySW5saW5lRW5kV2lkdGgnXSxcbiAgYm9yZGVySW5saW5lU3RhcnQ6IFsnYm9yZGVySW5saW5lU3RhcnRDb2xvcicsICdib3JkZXJJbmxpbmVTdGFydFN0eWxlJywgJ2JvcmRlcklubGluZVN0YXJ0V2lkdGgnXSxcbiAgYm9yZGVyTGVmdDogWydib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyTGVmdFN0eWxlJywgJ2JvcmRlckxlZnRXaWR0aCddLFxuICBib3JkZXJSYWRpdXM6IFsnYm9yZGVyQm90dG9tTGVmdFJhZGl1cycsICdib3JkZXJCb3R0b21SaWdodFJhZGl1cycsICdib3JkZXJUb3BMZWZ0UmFkaXVzJywgJ2JvcmRlclRvcFJpZ2h0UmFkaXVzJ10sXG4gIGJvcmRlclJpZ2h0OiBbJ2JvcmRlclJpZ2h0Q29sb3InLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJSaWdodFdpZHRoJ10sXG4gIGJvcmRlclN0eWxlOiBbJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckxlZnRTdHlsZScsICdib3JkZXJSaWdodFN0eWxlJywgJ2JvcmRlclRvcFN0eWxlJ10sXG4gIGJvcmRlclRvcDogWydib3JkZXJUb3BDb2xvcicsICdib3JkZXJUb3BTdHlsZScsICdib3JkZXJUb3BXaWR0aCddLFxuICBib3JkZXJXaWR0aDogWydib3JkZXJCb3R0b21XaWR0aCcsICdib3JkZXJMZWZ0V2lkdGgnLCAnYm9yZGVyUmlnaHRXaWR0aCcsICdib3JkZXJUb3BXaWR0aCddLFxuICBjb2x1bW5SdWxlOiBbJ2NvbHVtblJ1bGVDb2xvcicsICdjb2x1bW5SdWxlU3R5bGUnLCAnY29sdW1uUnVsZVdpZHRoJ10sXG4gIGNvbHVtbnM6IFsnY29sdW1uQ291bnQnLCAnY29sdW1uV2lkdGgnXSxcbiAgZmxleDogWydmbGV4QmFzaXMnLCAnZmxleEdyb3cnLCAnZmxleFNocmluayddLFxuICBmbGV4RmxvdzogWydmbGV4RGlyZWN0aW9uJywgJ2ZsZXhXcmFwJ10sXG4gIGZvbnQ6IFsnZm9udEZhbWlseScsICdmb250RmVhdHVyZVNldHRpbmdzJywgJ2ZvbnRLZXJuaW5nJywgJ2ZvbnRMYW5ndWFnZU92ZXJyaWRlJywgJ2ZvbnRTaXplJywgJ2ZvbnRTaXplQWRqdXN0JywgJ2ZvbnRTdHJldGNoJywgJ2ZvbnRTdHlsZScsICdmb250VmFyaWFudCcsICdmb250VmFyaWFudEFsdGVybmF0ZXMnLCAnZm9udFZhcmlhbnRDYXBzJywgJ2ZvbnRWYXJpYW50RWFzdEFzaWFuJywgJ2ZvbnRWYXJpYW50TGlnYXR1cmVzJywgJ2ZvbnRWYXJpYW50TnVtZXJpYycsICdmb250VmFyaWFudFBvc2l0aW9uJywgJ2ZvbnRXZWlnaHQnLCAnbGluZUhlaWdodCddLFxuICBmb250VmFyaWFudDogWydmb250VmFyaWFudEFsdGVybmF0ZXMnLCAnZm9udFZhcmlhbnRDYXBzJywgJ2ZvbnRWYXJpYW50RWFzdEFzaWFuJywgJ2ZvbnRWYXJpYW50TGlnYXR1cmVzJywgJ2ZvbnRWYXJpYW50TnVtZXJpYycsICdmb250VmFyaWFudFBvc2l0aW9uJ10sXG4gIGdhcDogWydjb2x1bW5HYXAnLCAncm93R2FwJ10sXG4gIGdyaWQ6IFsnZ3JpZEF1dG9Db2x1bW5zJywgJ2dyaWRBdXRvRmxvdycsICdncmlkQXV0b1Jvd3MnLCAnZ3JpZFRlbXBsYXRlQXJlYXMnLCAnZ3JpZFRlbXBsYXRlQ29sdW1ucycsICdncmlkVGVtcGxhdGVSb3dzJ10sXG4gIGdyaWRBcmVhOiBbJ2dyaWRDb2x1bW5FbmQnLCAnZ3JpZENvbHVtblN0YXJ0JywgJ2dyaWRSb3dFbmQnLCAnZ3JpZFJvd1N0YXJ0J10sXG4gIGdyaWRDb2x1bW46IFsnZ3JpZENvbHVtbkVuZCcsICdncmlkQ29sdW1uU3RhcnQnXSxcbiAgZ3JpZENvbHVtbkdhcDogWydjb2x1bW5HYXAnXSxcbiAgZ3JpZEdhcDogWydjb2x1bW5HYXAnLCAncm93R2FwJ10sXG4gIGdyaWRSb3c6IFsnZ3JpZFJvd0VuZCcsICdncmlkUm93U3RhcnQnXSxcbiAgZ3JpZFJvd0dhcDogWydyb3dHYXAnXSxcbiAgZ3JpZFRlbXBsYXRlOiBbJ2dyaWRUZW1wbGF0ZUFyZWFzJywgJ2dyaWRUZW1wbGF0ZUNvbHVtbnMnLCAnZ3JpZFRlbXBsYXRlUm93cyddLFxuICBsaXN0U3R5bGU6IFsnbGlzdFN0eWxlSW1hZ2UnLCAnbGlzdFN0eWxlUG9zaXRpb24nLCAnbGlzdFN0eWxlVHlwZSddLFxuICBtYXJnaW46IFsnbWFyZ2luQm90dG9tJywgJ21hcmdpbkxlZnQnLCAnbWFyZ2luUmlnaHQnLCAnbWFyZ2luVG9wJ10sXG4gIG1hcmtlcjogWydtYXJrZXJFbmQnLCAnbWFya2VyTWlkJywgJ21hcmtlclN0YXJ0J10sXG4gIG1hc2s6IFsnbWFza0NsaXAnLCAnbWFza0NvbXBvc2l0ZScsICdtYXNrSW1hZ2UnLCAnbWFza01vZGUnLCAnbWFza09yaWdpbicsICdtYXNrUG9zaXRpb25YJywgJ21hc2tQb3NpdGlvblknLCAnbWFza1JlcGVhdCcsICdtYXNrU2l6ZSddLFxuICBtYXNrUG9zaXRpb246IFsnbWFza1Bvc2l0aW9uWCcsICdtYXNrUG9zaXRpb25ZJ10sXG4gIG91dGxpbmU6IFsnb3V0bGluZUNvbG9yJywgJ291dGxpbmVTdHlsZScsICdvdXRsaW5lV2lkdGgnXSxcbiAgb3ZlcmZsb3c6IFsnb3ZlcmZsb3dYJywgJ292ZXJmbG93WSddLFxuICBwYWRkaW5nOiBbJ3BhZGRpbmdCb3R0b20nLCAncGFkZGluZ0xlZnQnLCAncGFkZGluZ1JpZ2h0JywgJ3BhZGRpbmdUb3AnXSxcbiAgcGxhY2VDb250ZW50OiBbJ2FsaWduQ29udGVudCcsICdqdXN0aWZ5Q29udGVudCddLFxuICBwbGFjZUl0ZW1zOiBbJ2FsaWduSXRlbXMnLCAnanVzdGlmeUl0ZW1zJ10sXG4gIHBsYWNlU2VsZjogWydhbGlnblNlbGYnLCAnanVzdGlmeVNlbGYnXSxcbiAgdGV4dERlY29yYXRpb246IFsndGV4dERlY29yYXRpb25Db2xvcicsICd0ZXh0RGVjb3JhdGlvbkxpbmUnLCAndGV4dERlY29yYXRpb25TdHlsZSddLFxuICB0ZXh0RW1waGFzaXM6IFsndGV4dEVtcGhhc2lzQ29sb3InLCAndGV4dEVtcGhhc2lzU3R5bGUnXSxcbiAgdHJhbnNpdGlvbjogWyd0cmFuc2l0aW9uRGVsYXknLCAndHJhbnNpdGlvbkR1cmF0aW9uJywgJ3RyYW5zaXRpb25Qcm9wZXJ0eScsICd0cmFuc2l0aW9uVGltaW5nRnVuY3Rpb24nXSxcbiAgd29yZFdyYXA6IFsnb3ZlcmZsb3dXcmFwJ11cbn07XG5cbi8qKlxuICogQ1NTIHByb3BlcnRpZXMgd2hpY2ggYWNjZXB0IG51bWJlcnMgYnV0IGFyZSBub3QgaW4gdW5pdHMgb2YgXCJweFwiLlxuICovXG52YXIgaXNVbml0bGVzc051bWJlciA9IHtcbiAgYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6IHRydWUsXG4gIGJvcmRlckltYWdlT3V0c2V0OiB0cnVlLFxuICBib3JkZXJJbWFnZVNsaWNlOiB0cnVlLFxuICBib3JkZXJJbWFnZVdpZHRoOiB0cnVlLFxuICBib3hGbGV4OiB0cnVlLFxuICBib3hGbGV4R3JvdXA6IHRydWUsXG4gIGJveE9yZGluYWxHcm91cDogdHJ1ZSxcbiAgY29sdW1uQ291bnQ6IHRydWUsXG4gIGNvbHVtbnM6IHRydWUsXG4gIGZsZXg6IHRydWUsXG4gIGZsZXhHcm93OiB0cnVlLFxuICBmbGV4UG9zaXRpdmU6IHRydWUsXG4gIGZsZXhTaHJpbms6IHRydWUsXG4gIGZsZXhOZWdhdGl2ZTogdHJ1ZSxcbiAgZmxleE9yZGVyOiB0cnVlLFxuICBncmlkQXJlYTogdHJ1ZSxcbiAgZ3JpZFJvdzogdHJ1ZSxcbiAgZ3JpZFJvd0VuZDogdHJ1ZSxcbiAgZ3JpZFJvd1NwYW46IHRydWUsXG4gIGdyaWRSb3dTdGFydDogdHJ1ZSxcbiAgZ3JpZENvbHVtbjogdHJ1ZSxcbiAgZ3JpZENvbHVtbkVuZDogdHJ1ZSxcbiAgZ3JpZENvbHVtblNwYW46IHRydWUsXG4gIGdyaWRDb2x1bW5TdGFydDogdHJ1ZSxcbiAgZm9udFdlaWdodDogdHJ1ZSxcbiAgbGluZUNsYW1wOiB0cnVlLFxuICBsaW5lSGVpZ2h0OiB0cnVlLFxuICBvcGFjaXR5OiB0cnVlLFxuICBvcmRlcjogdHJ1ZSxcbiAgb3JwaGFuczogdHJ1ZSxcbiAgdGFiU2l6ZTogdHJ1ZSxcbiAgd2lkb3dzOiB0cnVlLFxuICB6SW5kZXg6IHRydWUsXG4gIHpvb206IHRydWUsXG5cbiAgLy8gU1ZHLXJlbGF0ZWQgcHJvcGVydGllc1xuICBmaWxsT3BhY2l0eTogdHJ1ZSxcbiAgZmxvb2RPcGFjaXR5OiB0cnVlLFxuICBzdG9wT3BhY2l0eTogdHJ1ZSxcbiAgc3Ryb2tlRGFzaGFycmF5OiB0cnVlLFxuICBzdHJva2VEYXNob2Zmc2V0OiB0cnVlLFxuICBzdHJva2VNaXRlcmxpbWl0OiB0cnVlLFxuICBzdHJva2VPcGFjaXR5OiB0cnVlLFxuICBzdHJva2VXaWR0aDogdHJ1ZVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4IHZlbmRvci1zcGVjaWZpYyBwcmVmaXgsIGVnOiBXZWJraXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgc3R5bGUgbmFtZSwgZWc6IHRyYW5zaXRpb25EdXJhdGlvblxuICogQHJldHVybiB7c3RyaW5nfSBzdHlsZSBuYW1lIHByZWZpeGVkIHdpdGggYHByZWZpeGAsIHByb3Blcmx5IGNhbWVsQ2FzZWQsIGVnOlxuICogV2Via2l0VHJhbnNpdGlvbkR1cmF0aW9uXG4gKi9cbmZ1bmN0aW9uIHByZWZpeEtleShwcmVmaXgsIGtleSkge1xuICByZXR1cm4gcHJlZml4ICsga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnN1YnN0cmluZygxKTtcbn1cblxuLyoqXG4gKiBTdXBwb3J0IHN0eWxlIG5hbWVzIHRoYXQgbWF5IGNvbWUgcGFzc2VkIGluIHByZWZpeGVkIGJ5IGFkZGluZyBwZXJtdXRhdGlvbnNcbiAqIG9mIHZlbmRvciBwcmVmaXhlcy5cbiAqL1xudmFyIHByZWZpeGVzID0gWydXZWJraXQnLCAnbXMnLCAnTW96JywgJ08nXTtcblxuLy8gVXNpbmcgT2JqZWN0LmtleXMgaGVyZSwgb3IgZWxzZSB0aGUgdmFuaWxsYSBmb3ItaW4gbG9vcCBtYWtlcyBJRTggZ28gaW50byBhblxuLy8gaW5maW5pdGUgbG9vcCwgYmVjYXVzZSBpdCBpdGVyYXRlcyBvdmVyIHRoZSBuZXdseSBhZGRlZCBwcm9wcyB0b28uXG5PYmplY3Qua2V5cyhpc1VuaXRsZXNzTnVtYmVyKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gIHByZWZpeGVzLmZvckVhY2goZnVuY3Rpb24gKHByZWZpeCkge1xuICAgIGlzVW5pdGxlc3NOdW1iZXJbcHJlZml4S2V5KHByZWZpeCwgcHJvcCldID0gaXNVbml0bGVzc051bWJlcltwcm9wXTtcbiAgfSk7XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgdmFsdWUgaW50byB0aGUgcHJvcGVyIGNzcyB3cml0YWJsZSB2YWx1ZS4gVGhlIHN0eWxlIG5hbWUgYG5hbWVgXG4gKiBzaG91bGQgYmUgbG9naWNhbCAobm8gaHlwaGVucyksIGFzIHNwZWNpZmllZFxuICogaW4gYENTU1Byb3BlcnR5LmlzVW5pdGxlc3NOdW1iZXJgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENTUyBwcm9wZXJ0eSBuYW1lIHN1Y2ggYXMgYHRvcE1hcmdpbmAuXG4gKiBAcGFyYW0geyp9IHZhbHVlIENTUyBwcm9wZXJ0eSB2YWx1ZSBzdWNoIGFzIGAxMHB4YC5cbiAqIEByZXR1cm4ge3N0cmluZ30gTm9ybWFsaXplZCBzdHlsZSB2YWx1ZSB3aXRoIGRpbWVuc2lvbnMgYXBwbGllZC5cbiAqL1xuZnVuY3Rpb24gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShuYW1lLCB2YWx1ZSwgaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAvLyBOb3RlIHRoYXQgd2UndmUgcmVtb3ZlZCBlc2NhcGVUZXh0Rm9yQnJvd3NlcigpIGNhbGxzIGhlcmUgc2luY2UgdGhlXG4gIC8vIHdob2xlIHN0cmluZyB3aWxsIGJlIGVzY2FwZWQgd2hlbiB0aGUgYXR0cmlidXRlIGlzIGluamVjdGVkIGludG9cbiAgLy8gdGhlIG1hcmt1cC4gSWYgeW91IHByb3ZpZGUgdW5zYWZlIHVzZXIgZGF0YSBoZXJlIHRoZXkgY2FuIGluamVjdFxuICAvLyBhcmJpdHJhcnkgQ1NTIHdoaWNoIG1heSBiZSBwcm9ibGVtYXRpYyAoSSBjb3VsZG4ndCByZXBybyB0aGlzKTpcbiAgLy8gaHR0cHM6Ly93d3cub3dhc3Aub3JnL2luZGV4LnBocC9YU1NfRmlsdGVyX0V2YXNpb25fQ2hlYXRfU2hlZXRcbiAgLy8gaHR0cDovL3d3dy50aGVzcGFubmVyLmNvLnVrLzIwMDcvMTEvMjYvdWx0aW1hdGUteHNzLWNzcy1pbmplY3Rpb24vXG4gIC8vIFRoaXMgaXMgbm90IGFuIFhTUyBob2xlIGJ1dCBpbnN0ZWFkIGEgcG90ZW50aWFsIENTUyBpbmplY3Rpb24gaXNzdWVcbiAgLy8gd2hpY2ggaGFzIGxlYWQgdG8gYSBncmVhdGVyIGRpc2N1c3Npb24gYWJvdXQgaG93IHdlJ3JlIGdvaW5nIHRvXG4gIC8vIHRydXN0IFVSTHMgbW92aW5nIGZvcndhcmQuIFNlZSAjMjExNTkwMVxuXG4gIHZhciBpc0VtcHR5ID0gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB2YWx1ZSA9PT0gJyc7XG4gIGlmIChpc0VtcHR5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKCFpc0N1c3RvbVByb3BlcnR5ICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgdmFsdWUgIT09IDAgJiYgIShpc1VuaXRsZXNzTnVtYmVyLmhhc093blByb3BlcnR5KG5hbWUpICYmIGlzVW5pdGxlc3NOdW1iZXJbbmFtZV0pKSB7XG4gICAgcmV0dXJuIHZhbHVlICsgJ3B4JzsgLy8gUHJlc3VtZXMgaW1wbGljaXQgJ3B4JyBzdWZmaXggZm9yIHVuaXRsZXNzIG51bWJlcnNcbiAgfVxuXG4gIHJldHVybiAoJycgKyB2YWx1ZSkudHJpbSgpO1xufVxuXG52YXIgdXBwZXJjYXNlUGF0dGVybiA9IC8oW0EtWl0pL2c7XG52YXIgbXNQYXR0ZXJuID0gL15tcy0vO1xuXG4vKipcbiAqIEh5cGhlbmF0ZXMgYSBjYW1lbGNhc2VkIENTUyBwcm9wZXJ0eSBuYW1lLCBmb3IgZXhhbXBsZTpcbiAqXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdiYWNrZ3JvdW5kQ29sb3InKVxuICogICA8IFwiYmFja2dyb3VuZC1jb2xvclwiXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdNb3pUcmFuc2l0aW9uJylcbiAqICAgPCBcIi1tb3otdHJhbnNpdGlvblwiXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdtc1RyYW5zaXRpb24nKVxuICogICA8IFwiLW1zLXRyYW5zaXRpb25cIlxuICpcbiAqIEFzIE1vZGVybml6ciBzdWdnZXN0cyAoaHR0cDovL21vZGVybml6ci5jb20vZG9jcy8jcHJlZml4ZWQpLCBhbiBgbXNgIHByZWZpeFxuICogaXMgY29udmVydGVkIHRvIGAtbXMtYC5cbiAqL1xuZnVuY3Rpb24gaHlwaGVuYXRlU3R5bGVOYW1lKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWUucmVwbGFjZSh1cHBlcmNhc2VQYXR0ZXJuLCAnLSQxJykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKG1zUGF0dGVybiwgJy1tcy0nKTtcbn1cblxudmFyIHdhcm5WYWxpZFN0eWxlID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgLy8gJ21zVHJhbnNmb3JtJyBpcyBjb3JyZWN0LCBidXQgdGhlIG90aGVyIHByZWZpeGVzIHNob3VsZCBiZSBjYXBpdGFsaXplZFxuICB2YXIgYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuID0gL14oPzp3ZWJraXR8bW96fG8pW0EtWl0vO1xuICB2YXIgbXNQYXR0ZXJuJDEgPSAvXi1tcy0vO1xuICB2YXIgaHlwaGVuUGF0dGVybiA9IC8tKC4pL2c7XG5cbiAgLy8gc3R5bGUgdmFsdWVzIHNob3VsZG4ndCBjb250YWluIGEgc2VtaWNvbG9uXG4gIHZhciBiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4gPSAvO1xccyokLztcblxuICB2YXIgd2FybmVkU3R5bGVOYW1lcyA9IHt9O1xuICB2YXIgd2FybmVkU3R5bGVWYWx1ZXMgPSB7fTtcbiAgdmFyIHdhcm5lZEZvck5hTlZhbHVlID0gZmFsc2U7XG4gIHZhciB3YXJuZWRGb3JJbmZpbml0eVZhbHVlID0gZmFsc2U7XG5cbiAgdmFyIGNhbWVsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShoeXBoZW5QYXR0ZXJuLCBmdW5jdGlvbiAoXywgY2hhcmFjdGVyKSB7XG4gICAgICByZXR1cm4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRTdHlsZU5hbWVzW25hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSA9IHRydWU7XG4gICAgd2FybmluZyQxKGZhbHNlLCAnVW5zdXBwb3J0ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8nLCBuYW1lLFxuICAgIC8vIEFzIEFuZGkgU21pdGggc3VnZ2VzdHNcbiAgICAvLyAoaHR0cDovL3d3dy5hbmRpc21pdGguY29tL2Jsb2cvMjAxMi8wMi9tb2Rlcm5penItcHJlZml4ZWQvKSwgYW4gYC1tc2AgcHJlZml4XG4gICAgLy8gaXMgY29udmVydGVkIHRvIGxvd2VyY2FzZSBgbXNgLlxuICAgIGNhbWVsaXplKG5hbWUucmVwbGFjZShtc1BhdHRlcm4kMSwgJ21zLScpKSk7XG4gIH07XG5cbiAgdmFyIHdhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlTmFtZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0gPSB0cnVlO1xuICAgIHdhcm5pbmckMShmYWxzZSwgJ1Vuc3VwcG9ydGVkIHZlbmRvci1wcmVmaXhlZCBzdHlsZSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzPycsIG5hbWUsIG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpKTtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlVmFsdWVzLmhhc093blByb3BlcnR5KHZhbHVlKSAmJiB3YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV0gPSB0cnVlO1xuICAgIHdhcm5pbmckMShmYWxzZSwgXCJTdHlsZSBwcm9wZXJ0eSB2YWx1ZXMgc2hvdWxkbid0IGNvbnRhaW4gYSBzZW1pY29sb24uIFwiICsgJ1RyeSBcIiVzOiAlc1wiIGluc3RlYWQuJywgbmFtZSwgdmFsdWUucmVwbGFjZShiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4sICcnKSk7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlSXNOYU4gPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAod2FybmVkRm9yTmFOVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRGb3JOYU5WYWx1ZSA9IHRydWU7XG4gICAgd2FybmluZyQxKGZhbHNlLCAnYE5hTmAgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgdGhlIGAlc2AgY3NzIHN0eWxlIHByb3BlcnR5LicsIG5hbWUpO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZUlzSW5maW5pdHkgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAod2FybmVkRm9ySW5maW5pdHlWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZEZvckluZmluaXR5VmFsdWUgPSB0cnVlO1xuICAgIHdhcm5pbmckMShmYWxzZSwgJ2BJbmZpbml0eWAgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgdGhlIGAlc2AgY3NzIHN0eWxlIHByb3BlcnR5LicsIG5hbWUpO1xuICB9O1xuXG4gIHdhcm5WYWxpZFN0eWxlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKG5hbWUuaW5kZXhPZignLScpID4gLTEpIHtcbiAgICAgIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lKG5hbWUpO1xuICAgIH0gZWxzZSBpZiAoYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuLnRlc3QobmFtZSkpIHtcbiAgICAgIHdhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZShuYW1lKTtcbiAgICB9IGVsc2UgaWYgKGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybi50ZXN0KHZhbHVlKSkge1xuICAgICAgd2FyblN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uKG5hbWUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgICAgICB3YXJuU3R5bGVWYWx1ZUlzTmFOKG5hbWUsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoIWlzRmluaXRlKHZhbHVlKSkge1xuICAgICAgICB3YXJuU3R5bGVWYWx1ZUlzSW5maW5pdHkobmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxudmFyIHdhcm5WYWxpZFN0eWxlJDEgPSB3YXJuVmFsaWRTdHlsZTtcblxuLyoqXG4gKiBPcGVyYXRpb25zIGZvciBkZWFsaW5nIHdpdGggQ1NTIHByb3BlcnRpZXMuXG4gKi9cblxuLyoqXG4gKiBUaGlzIGNyZWF0ZXMgYSBzdHJpbmcgdGhhdCBpcyBleHBlY3RlZCB0byBiZSBlcXVpdmFsZW50IHRvIHRoZSBzdHlsZVxuICogYXR0cmlidXRlIGdlbmVyYXRlZCBieSBzZXJ2ZXItc2lkZSByZW5kZXJpbmcuIEl0IGJ5LXBhc3NlcyB3YXJuaW5ncyBhbmRcbiAqIHNlY3VyaXR5IGNoZWNrcyBzbyBpdCdzIG5vdCBzYWZlIHRvIHVzZSB0aGlzIHZhbHVlIGZvciBhbnl0aGluZyBvdGhlciB0aGFuXG4gKiBjb21wYXJpc29uLiBJdCBpcyBvbmx5IHVzZWQgaW4gREVWIGZvciBTU1IgdmFsaWRhdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRGFuZ2Vyb3VzU3RyaW5nRm9yU3R5bGVzKHN0eWxlcykge1xuICB7XG4gICAgdmFyIHNlcmlhbGl6ZWQgPSAnJztcbiAgICB2YXIgZGVsaW1pdGVyID0gJyc7XG4gICAgZm9yICh2YXIgc3R5bGVOYW1lIGluIHN0eWxlcykge1xuICAgICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBzdHlsZVZhbHVlID0gc3R5bGVzW3N0eWxlTmFtZV07XG4gICAgICBpZiAoc3R5bGVWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBpc0N1c3RvbVByb3BlcnR5ID0gc3R5bGVOYW1lLmluZGV4T2YoJy0tJykgPT09IDA7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gZGVsaW1pdGVyICsgaHlwaGVuYXRlU3R5bGVOYW1lKHN0eWxlTmFtZSkgKyAnOic7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlVmFsdWUsIGlzQ3VzdG9tUHJvcGVydHkpO1xuXG4gICAgICAgIGRlbGltaXRlciA9ICc7JztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQgfHwgbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIGZvciBtdWx0aXBsZSBzdHlsZXMgb24gYSBub2RlLiAgSWYgYSB2YWx1ZSBpcyBzcGVjaWZpZWQgYXNcbiAqICcnIChlbXB0eSBzdHJpbmcpLCB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBwcm9wZXJ0eSB3aWxsIGJlIHVuc2V0LlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtvYmplY3R9IHN0eWxlc1xuICovXG5mdW5jdGlvbiBzZXRWYWx1ZUZvclN0eWxlcyhub2RlLCBzdHlsZXMpIHtcbiAgdmFyIHN0eWxlID0gbm9kZS5zdHlsZTtcbiAgZm9yICh2YXIgc3R5bGVOYW1lIGluIHN0eWxlcykge1xuICAgIGlmICghc3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgaXNDdXN0b21Qcm9wZXJ0eSA9IHN0eWxlTmFtZS5pbmRleE9mKCctLScpID09PSAwO1xuICAgIHtcbiAgICAgIGlmICghaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAgICAgICB3YXJuVmFsaWRTdHlsZSQxKHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0pO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgc3R5bGVWYWx1ZSA9IGRhbmdlcm91c1N0eWxlVmFsdWUoc3R5bGVOYW1lLCBzdHlsZXNbc3R5bGVOYW1lXSwgaXNDdXN0b21Qcm9wZXJ0eSk7XG4gICAgaWYgKHN0eWxlTmFtZSA9PT0gJ2Zsb2F0Jykge1xuICAgICAgc3R5bGVOYW1lID0gJ2Nzc0Zsb2F0JztcbiAgICB9XG4gICAgaWYgKGlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgICAgIHN0eWxlLnNldFByb3BlcnR5KHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlW3N0eWxlTmFtZV0gPSBzdHlsZVZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1ZhbHVlRW1wdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdmFsdWUgPT09ICcnO1xufVxuXG4vKipcbiAqIEdpdmVuIHtjb2xvcjogJ3JlZCcsIG92ZXJmbG93OiAnaGlkZGVuJ30gcmV0dXJucyB7XG4gKiAgIGNvbG9yOiAnY29sb3InLFxuICogICBvdmVyZmxvd1g6ICdvdmVyZmxvdycsXG4gKiAgIG92ZXJmbG93WTogJ292ZXJmbG93JyxcbiAqIH0uIFRoaXMgY2FuIGJlIHJlYWQgYXMgXCJ0aGUgb3ZlcmZsb3dZIHByb3BlcnR5IHdhcyBzZXQgYnkgdGhlIG92ZXJmbG93XG4gKiBzaG9ydGhhbmRcIi4gVGhhdCBpcywgdGhlIHZhbHVlcyBhcmUgdGhlIHByb3BlcnR5IHRoYXQgZWFjaCB3YXMgZGVyaXZlZCBmcm9tLlxuICovXG5mdW5jdGlvbiBleHBhbmRTaG9ydGhhbmRNYXAoc3R5bGVzKSB7XG4gIHZhciBleHBhbmRlZCA9IHt9O1xuICBmb3IgKHZhciBrZXkgaW4gc3R5bGVzKSB7XG4gICAgdmFyIGxvbmdoYW5kcyA9IHNob3J0aGFuZFRvTG9uZ2hhbmRba2V5XSB8fCBba2V5XTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvbmdoYW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgZXhwYW5kZWRbbG9uZ2hhbmRzW2ldXSA9IGtleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4cGFuZGVkO1xufVxuXG4vKipcbiAqIFdoZW4gbWl4aW5nIHNob3J0aGFuZCBhbmQgbG9uZ2hhbmQgcHJvcGVydHkgbmFtZXMsIHdlIHdhcm4gZHVyaW5nIHVwZGF0ZXMgaWZcbiAqIHdlIGV4cGVjdCBhbiBpbmNvcnJlY3QgcmVzdWx0IHRvIG9jY3VyLiBJbiBwYXJ0aWN1bGFyLCB3ZSB3YXJuIGZvcjpcbiAqXG4gKiBVcGRhdGluZyBhIHNob3J0aGFuZCBwcm9wZXJ0eSAobG9uZ2hhbmQgZ2V0cyBvdmVyd3JpdHRlbik6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udDogJ2JheicsIGZvbnRWYXJpYW50OiAnYmFyJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udCA9ICdiYXonXG4gKiBSZW1vdmluZyBhIHNob3J0aGFuZCBwcm9wZXJ0eSAobG9uZ2hhbmQgZ2V0cyBsb3N0IHRvbyk6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udFZhcmlhbnQ6ICdiYXInfVxuICogICBiZWNvbWVzIC5zdHlsZS5mb250ID0gJydcbiAqIFJlbW92aW5nIGEgbG9uZ2hhbmQgcHJvcGVydHkgKHNob3VsZCByZXZlcnQgdG8gc2hvcnRoYW5kOyBkb2Vzbid0KTpcbiAqICAge2ZvbnQ6ICdmb28nLCBmb250VmFyaWFudDogJ2Jhcid9IC0+IHtmb250OiAnZm9vJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udFZhcmlhbnQgPSAnJ1xuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVNob3J0aGFuZFByb3BlcnR5Q29sbGlzaW9uSW5EZXYoc3R5bGVVcGRhdGVzLCBuZXh0U3R5bGVzKSB7XG4gIGlmICghd2FybkFib3V0U2hvcnRoYW5kUHJvcGVydHlDb2xsaXNpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIW5leHRTdHlsZXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZXhwYW5kZWRVcGRhdGVzID0gZXhwYW5kU2hvcnRoYW5kTWFwKHN0eWxlVXBkYXRlcyk7XG4gIHZhciBleHBhbmRlZFN0eWxlcyA9IGV4cGFuZFNob3J0aGFuZE1hcChuZXh0U3R5bGVzKTtcbiAgdmFyIHdhcm5lZEFib3V0ID0ge307XG4gIGZvciAodmFyIGtleSBpbiBleHBhbmRlZFVwZGF0ZXMpIHtcbiAgICB2YXIgb3JpZ2luYWxLZXkgPSBleHBhbmRlZFVwZGF0ZXNba2V5XTtcbiAgICB2YXIgY29ycmVjdE9yaWdpbmFsS2V5ID0gZXhwYW5kZWRTdHlsZXNba2V5XTtcbiAgICBpZiAoY29ycmVjdE9yaWdpbmFsS2V5ICYmIG9yaWdpbmFsS2V5ICE9PSBjb3JyZWN0T3JpZ2luYWxLZXkpIHtcbiAgICAgIHZhciB3YXJuaW5nS2V5ID0gb3JpZ2luYWxLZXkgKyAnLCcgKyBjb3JyZWN0T3JpZ2luYWxLZXk7XG4gICAgICBpZiAod2FybmVkQWJvdXRbd2FybmluZ0tleV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB3YXJuZWRBYm91dFt3YXJuaW5nS2V5XSA9IHRydWU7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICclcyBhIHN0eWxlIHByb3BlcnR5IGR1cmluZyByZXJlbmRlciAoJXMpIHdoZW4gYSAnICsgJ2NvbmZsaWN0aW5nIHByb3BlcnR5IGlzIHNldCAoJXMpIGNhbiBsZWFkIHRvIHN0eWxpbmcgYnVncy4gVG8gJyArIFwiYXZvaWQgdGhpcywgZG9uJ3QgbWl4IHNob3J0aGFuZCBhbmQgbm9uLXNob3J0aGFuZCBwcm9wZXJ0aWVzIFwiICsgJ2ZvciB0aGUgc2FtZSB2YWx1ZTsgaW5zdGVhZCwgcmVwbGFjZSB0aGUgc2hvcnRoYW5kIHdpdGggJyArICdzZXBhcmF0ZSB2YWx1ZXMuJywgaXNWYWx1ZUVtcHR5KHN0eWxlVXBkYXRlc1tvcmlnaW5hbEtleV0pID8gJ1JlbW92aW5nJyA6ICdVcGRhdGluZycsIG9yaWdpbmFsS2V5LCBjb3JyZWN0T3JpZ2luYWxLZXkpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBGb3IgSFRNTCwgY2VydGFpbiB0YWdzIHNob3VsZCBvbWl0IHRoZWlyIGNsb3NlIHRhZy4gV2Uga2VlcCBhIHdoaXRlbGlzdCBmb3Jcbi8vIHRob3NlIHNwZWNpYWwtY2FzZSB0YWdzLlxuXG52YXIgb21pdHRlZENsb3NlVGFncyA9IHtcbiAgYXJlYTogdHJ1ZSxcbiAgYmFzZTogdHJ1ZSxcbiAgYnI6IHRydWUsXG4gIGNvbDogdHJ1ZSxcbiAgZW1iZWQ6IHRydWUsXG4gIGhyOiB0cnVlLFxuICBpbWc6IHRydWUsXG4gIGlucHV0OiB0cnVlLFxuICBrZXlnZW46IHRydWUsXG4gIGxpbms6IHRydWUsXG4gIG1ldGE6IHRydWUsXG4gIHBhcmFtOiB0cnVlLFxuICBzb3VyY2U6IHRydWUsXG4gIHRyYWNrOiB0cnVlLFxuICB3YnI6IHRydWVcbiAgLy8gTk9URTogbWVudWl0ZW0ncyBjbG9zZSB0YWcgc2hvdWxkIGJlIG9taXR0ZWQsIGJ1dCB0aGF0IGNhdXNlcyBwcm9ibGVtcy5cbn07XG5cbi8vIEZvciBIVE1MLCBjZXJ0YWluIHRhZ3MgY2Fubm90IGhhdmUgY2hpbGRyZW4uIFRoaXMgaGFzIHRoZSBzYW1lIHB1cnBvc2UgYXNcbi8vIGBvbWl0dGVkQ2xvc2VUYWdzYCBleGNlcHQgdGhhdCBgbWVudWl0ZW1gIHNob3VsZCBzdGlsbCBoYXZlIGl0cyBjbG9zaW5nIHRhZy5cblxudmFyIHZvaWRFbGVtZW50VGFncyA9IF9hc3NpZ24oe1xuICBtZW51aXRlbTogdHJ1ZVxufSwgb21pdHRlZENsb3NlVGFncyk7XG5cbi8vIFRPRE86IFdlIGNhbiByZW1vdmUgdGhpcyBpZiB3ZSBhZGQgaW52YXJpYW50V2l0aFN0YWNrKClcbi8vIG9yIGFkZCBzdGFjayBieSBkZWZhdWx0IHRvIGludmFyaWFudHMgd2hlcmUgcG9zc2libGUuXG52YXIgSFRNTCQxID0gJ19faHRtbCc7XG5cbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDIgPSBudWxsO1xue1xuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRWYWxpZFByb3BzKHRhZywgcHJvcHMpIHtcbiAgaWYgKCFwcm9wcykge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBOb3RlIHRoZSB1c2Ugb2YgYD09YCB3aGljaCBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkLlxuICBpZiAodm9pZEVsZW1lbnRUYWdzW3RhZ10pIHtcbiAgICAhKHByb3BzLmNoaWxkcmVuID09IG51bGwgJiYgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICclcyBpcyBhIHZvaWQgZWxlbWVudCB0YWcgYW5kIG11c3QgbmVpdGhlciBoYXZlIGBjaGlsZHJlbmAgbm9yIHVzZSBgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLiVzJywgdGFnLCBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDIuZ2V0U3RhY2tBZGRlbmR1bSgpKSA6IHZvaWQgMDtcbiAgfVxuICBpZiAocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgICEocHJvcHMuY2hpbGRyZW4gPT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW4gb25seSBzZXQgb25lIG9mIGBjaGlsZHJlbmAgb3IgYHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKSA6IHZvaWQgMDtcbiAgICAhKHR5cGVvZiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PT0gJ29iamVjdCcgJiYgSFRNTCQxIGluIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSA/IGludmFyaWFudChmYWxzZSwgJ2Bwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAgbXVzdCBiZSBpbiB0aGUgZm9ybSBge19faHRtbDogLi4ufWAuIFBsZWFzZSB2aXNpdCBodHRwczovL2ZiLm1lL3JlYWN0LWludmFyaWFudC1kYW5nZXJvdXNseS1zZXQtaW5uZXItaHRtbCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKSA6IHZvaWQgMDtcbiAgfVxuICB7XG4gICAgIShwcm9wcy5zdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgfHwgIXByb3BzLmNvbnRlbnRFZGl0YWJsZSB8fCBwcm9wcy5jaGlsZHJlbiA9PSBudWxsKSA/IHdhcm5pbmckMShmYWxzZSwgJ0EgY29tcG9uZW50IGlzIGBjb250ZW50RWRpdGFibGVgIGFuZCBjb250YWlucyBgY2hpbGRyZW5gIG1hbmFnZWQgYnkgJyArICdSZWFjdC4gSXQgaXMgbm93IHlvdXIgcmVzcG9uc2liaWxpdHkgdG8gZ3VhcmFudGVlIHRoYXQgbm9uZSBvZiAnICsgJ3Rob3NlIG5vZGVzIGFyZSB1bmV4cGVjdGVkbHkgbW9kaWZpZWQgb3IgZHVwbGljYXRlZC4gVGhpcyBpcyAnICsgJ3Byb2JhYmx5IG5vdCBpbnRlbnRpb25hbC4nKSA6IHZvaWQgMDtcbiAgfVxuICAhKHByb3BzLnN0eWxlID09IG51bGwgfHwgdHlwZW9mIHByb3BzLnN0eWxlID09PSAnb2JqZWN0JykgPyBpbnZhcmlhbnQoZmFsc2UsICdUaGUgYHN0eWxlYCBwcm9wIGV4cGVjdHMgYSBtYXBwaW5nIGZyb20gc3R5bGUgcHJvcGVydGllcyB0byB2YWx1ZXMsIG5vdCBhIHN0cmluZy4gRm9yIGV4YW1wbGUsIHN0eWxlPXt7bWFyZ2luUmlnaHQ6IHNwYWNpbmcgKyBcXCdlbVxcJ319IHdoZW4gdXNpbmcgSlNYLiVzJywgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQyLmdldFN0YWNrQWRkZW5kdW0oKSkgOiB2b2lkIDA7XG59XG5cbmZ1bmN0aW9uIGlzQ3VzdG9tQ29tcG9uZW50KHRhZ05hbWUsIHByb3BzKSB7XG4gIGlmICh0YWdOYW1lLmluZGV4T2YoJy0nKSA9PT0gLTEpIHtcbiAgICByZXR1cm4gdHlwZW9mIHByb3BzLmlzID09PSAnc3RyaW5nJztcbiAgfVxuICBzd2l0Y2ggKHRhZ05hbWUpIHtcbiAgICAvLyBUaGVzZSBhcmUgcmVzZXJ2ZWQgU1ZHIGFuZCBNYXRoTUwgZWxlbWVudHMuXG4gICAgLy8gV2UgZG9uJ3QgbWluZCB0aGlzIHdoaXRlbGlzdCB0b28gbXVjaCBiZWNhdXNlIHdlIGV4cGVjdCBpdCB0byBuZXZlciBncm93LlxuICAgIC8vIFRoZSBhbHRlcm5hdGl2ZSBpcyB0byB0cmFjayB0aGUgbmFtZXNwYWNlIGluIGEgZmV3IHBsYWNlcyB3aGljaCBpcyBjb252b2x1dGVkLlxuICAgIC8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJjb21wb25lbnRzL3NwZWMvY3VzdG9tLyNjdXN0b20tZWxlbWVudHMtY29yZS1jb25jZXB0c1xuICAgIGNhc2UgJ2Fubm90YXRpb24teG1sJzpcbiAgICBjYXNlICdjb2xvci1wcm9maWxlJzpcbiAgICBjYXNlICdmb250LWZhY2UnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS1zcmMnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS11cmknOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS1mb3JtYXQnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZS1uYW1lJzpcbiAgICBjYXNlICdtaXNzaW5nLWdseXBoJzpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLy8gV2hlbiBhZGRpbmcgYXR0cmlidXRlcyB0byB0aGUgSFRNTCBvciBTVkcgd2hpdGVsaXN0LCBiZSBzdXJlIHRvXG4vLyBhbHNvIGFkZCB0aGVtIHRvIHRoaXMgbW9kdWxlIHRvIGVuc3VyZSBjYXNpbmcgYW5kIGluY29ycmVjdCBuYW1lXG4vLyB3YXJuaW5ncy5cbnZhciBwb3NzaWJsZVN0YW5kYXJkTmFtZXMgPSB7XG4gIC8vIEhUTUxcbiAgYWNjZXB0OiAnYWNjZXB0JyxcbiAgYWNjZXB0Y2hhcnNldDogJ2FjY2VwdENoYXJzZXQnLFxuICAnYWNjZXB0LWNoYXJzZXQnOiAnYWNjZXB0Q2hhcnNldCcsXG4gIGFjY2Vzc2tleTogJ2FjY2Vzc0tleScsXG4gIGFjdGlvbjogJ2FjdGlvbicsXG4gIGFsbG93ZnVsbHNjcmVlbjogJ2FsbG93RnVsbFNjcmVlbicsXG4gIGFsdDogJ2FsdCcsXG4gIGFzOiAnYXMnLFxuICBhc3luYzogJ2FzeW5jJyxcbiAgYXV0b2NhcGl0YWxpemU6ICdhdXRvQ2FwaXRhbGl6ZScsXG4gIGF1dG9jb21wbGV0ZTogJ2F1dG9Db21wbGV0ZScsXG4gIGF1dG9jb3JyZWN0OiAnYXV0b0NvcnJlY3QnLFxuICBhdXRvZm9jdXM6ICdhdXRvRm9jdXMnLFxuICBhdXRvcGxheTogJ2F1dG9QbGF5JyxcbiAgYXV0b3NhdmU6ICdhdXRvU2F2ZScsXG4gIGNhcHR1cmU6ICdjYXB0dXJlJyxcbiAgY2VsbHBhZGRpbmc6ICdjZWxsUGFkZGluZycsXG4gIGNlbGxzcGFjaW5nOiAnY2VsbFNwYWNpbmcnLFxuICBjaGFsbGVuZ2U6ICdjaGFsbGVuZ2UnLFxuICBjaGFyc2V0OiAnY2hhclNldCcsXG4gIGNoZWNrZWQ6ICdjaGVja2VkJyxcbiAgY2hpbGRyZW46ICdjaGlsZHJlbicsXG4gIGNpdGU6ICdjaXRlJyxcbiAgY2xhc3M6ICdjbGFzc05hbWUnLFxuICBjbGFzc2lkOiAnY2xhc3NJRCcsXG4gIGNsYXNzbmFtZTogJ2NsYXNzTmFtZScsXG4gIGNvbHM6ICdjb2xzJyxcbiAgY29sc3BhbjogJ2NvbFNwYW4nLFxuICBjb250ZW50OiAnY29udGVudCcsXG4gIGNvbnRlbnRlZGl0YWJsZTogJ2NvbnRlbnRFZGl0YWJsZScsXG4gIGNvbnRleHRtZW51OiAnY29udGV4dE1lbnUnLFxuICBjb250cm9sczogJ2NvbnRyb2xzJyxcbiAgY29udHJvbHNsaXN0OiAnY29udHJvbHNMaXN0JyxcbiAgY29vcmRzOiAnY29vcmRzJyxcbiAgY3Jvc3NvcmlnaW46ICdjcm9zc09yaWdpbicsXG4gIGRhbmdlcm91c2x5c2V0aW5uZXJodG1sOiAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnLFxuICBkYXRhOiAnZGF0YScsXG4gIGRhdGV0aW1lOiAnZGF0ZVRpbWUnLFxuICBkZWZhdWx0OiAnZGVmYXVsdCcsXG4gIGRlZmF1bHRjaGVja2VkOiAnZGVmYXVsdENoZWNrZWQnLFxuICBkZWZhdWx0dmFsdWU6ICdkZWZhdWx0VmFsdWUnLFxuICBkZWZlcjogJ2RlZmVyJyxcbiAgZGlyOiAnZGlyJyxcbiAgZGlzYWJsZWQ6ICdkaXNhYmxlZCcsXG4gIGRvd25sb2FkOiAnZG93bmxvYWQnLFxuICBkcmFnZ2FibGU6ICdkcmFnZ2FibGUnLFxuICBlbmN0eXBlOiAnZW5jVHlwZScsXG4gIGZvcjogJ2h0bWxGb3InLFxuICBmb3JtOiAnZm9ybScsXG4gIGZvcm1tZXRob2Q6ICdmb3JtTWV0aG9kJyxcbiAgZm9ybWFjdGlvbjogJ2Zvcm1BY3Rpb24nLFxuICBmb3JtZW5jdHlwZTogJ2Zvcm1FbmNUeXBlJyxcbiAgZm9ybW5vdmFsaWRhdGU6ICdmb3JtTm9WYWxpZGF0ZScsXG4gIGZvcm10YXJnZXQ6ICdmb3JtVGFyZ2V0JyxcbiAgZnJhbWVib3JkZXI6ICdmcmFtZUJvcmRlcicsXG4gIGhlYWRlcnM6ICdoZWFkZXJzJyxcbiAgaGVpZ2h0OiAnaGVpZ2h0JyxcbiAgaGlkZGVuOiAnaGlkZGVuJyxcbiAgaGlnaDogJ2hpZ2gnLFxuICBocmVmOiAnaHJlZicsXG4gIGhyZWZsYW5nOiAnaHJlZkxhbmcnLFxuICBodG1sZm9yOiAnaHRtbEZvcicsXG4gIGh0dHBlcXVpdjogJ2h0dHBFcXVpdicsXG4gICdodHRwLWVxdWl2JzogJ2h0dHBFcXVpdicsXG4gIGljb246ICdpY29uJyxcbiAgaWQ6ICdpZCcsXG4gIGlubmVyaHRtbDogJ2lubmVySFRNTCcsXG4gIGlucHV0bW9kZTogJ2lucHV0TW9kZScsXG4gIGludGVncml0eTogJ2ludGVncml0eScsXG4gIGlzOiAnaXMnLFxuICBpdGVtaWQ6ICdpdGVtSUQnLFxuICBpdGVtcHJvcDogJ2l0ZW1Qcm9wJyxcbiAgaXRlbXJlZjogJ2l0ZW1SZWYnLFxuICBpdGVtc2NvcGU6ICdpdGVtU2NvcGUnLFxuICBpdGVtdHlwZTogJ2l0ZW1UeXBlJyxcbiAga2V5cGFyYW1zOiAna2V5UGFyYW1zJyxcbiAga2V5dHlwZTogJ2tleVR5cGUnLFxuICBraW5kOiAna2luZCcsXG4gIGxhYmVsOiAnbGFiZWwnLFxuICBsYW5nOiAnbGFuZycsXG4gIGxpc3Q6ICdsaXN0JyxcbiAgbG9vcDogJ2xvb3AnLFxuICBsb3c6ICdsb3cnLFxuICBtYW5pZmVzdDogJ21hbmlmZXN0JyxcbiAgbWFyZ2lud2lkdGg6ICdtYXJnaW5XaWR0aCcsXG4gIG1hcmdpbmhlaWdodDogJ21hcmdpbkhlaWdodCcsXG4gIG1heDogJ21heCcsXG4gIG1heGxlbmd0aDogJ21heExlbmd0aCcsXG4gIG1lZGlhOiAnbWVkaWEnLFxuICBtZWRpYWdyb3VwOiAnbWVkaWFHcm91cCcsXG4gIG1ldGhvZDogJ21ldGhvZCcsXG4gIG1pbjogJ21pbicsXG4gIG1pbmxlbmd0aDogJ21pbkxlbmd0aCcsXG4gIG11bHRpcGxlOiAnbXVsdGlwbGUnLFxuICBtdXRlZDogJ211dGVkJyxcbiAgbmFtZTogJ25hbWUnLFxuICBub21vZHVsZTogJ25vTW9kdWxlJyxcbiAgbm9uY2U6ICdub25jZScsXG4gIG5vdmFsaWRhdGU6ICdub1ZhbGlkYXRlJyxcbiAgb3BlbjogJ29wZW4nLFxuICBvcHRpbXVtOiAnb3B0aW11bScsXG4gIHBhdHRlcm46ICdwYXR0ZXJuJyxcbiAgcGxhY2Vob2xkZXI6ICdwbGFjZWhvbGRlcicsXG4gIHBsYXlzaW5saW5lOiAncGxheXNJbmxpbmUnLFxuICBwb3N0ZXI6ICdwb3N0ZXInLFxuICBwcmVsb2FkOiAncHJlbG9hZCcsXG4gIHByb2ZpbGU6ICdwcm9maWxlJyxcbiAgcmFkaW9ncm91cDogJ3JhZGlvR3JvdXAnLFxuICByZWFkb25seTogJ3JlYWRPbmx5JyxcbiAgcmVmZXJyZXJwb2xpY3k6ICdyZWZlcnJlclBvbGljeScsXG4gIHJlbDogJ3JlbCcsXG4gIHJlcXVpcmVkOiAncmVxdWlyZWQnLFxuICByZXZlcnNlZDogJ3JldmVyc2VkJyxcbiAgcm9sZTogJ3JvbGUnLFxuICByb3dzOiAncm93cycsXG4gIHJvd3NwYW46ICdyb3dTcGFuJyxcbiAgc2FuZGJveDogJ3NhbmRib3gnLFxuICBzY29wZTogJ3Njb3BlJyxcbiAgc2NvcGVkOiAnc2NvcGVkJyxcbiAgc2Nyb2xsaW5nOiAnc2Nyb2xsaW5nJyxcbiAgc2VhbWxlc3M6ICdzZWFtbGVzcycsXG4gIHNlbGVjdGVkOiAnc2VsZWN0ZWQnLFxuICBzaGFwZTogJ3NoYXBlJyxcbiAgc2l6ZTogJ3NpemUnLFxuICBzaXplczogJ3NpemVzJyxcbiAgc3BhbjogJ3NwYW4nLFxuICBzcGVsbGNoZWNrOiAnc3BlbGxDaGVjaycsXG4gIHNyYzogJ3NyYycsXG4gIHNyY2RvYzogJ3NyY0RvYycsXG4gIHNyY2xhbmc6ICdzcmNMYW5nJyxcbiAgc3Jjc2V0OiAnc3JjU2V0JyxcbiAgc3RhcnQ6ICdzdGFydCcsXG4gIHN0ZXA6ICdzdGVwJyxcbiAgc3R5bGU6ICdzdHlsZScsXG4gIHN1bW1hcnk6ICdzdW1tYXJ5JyxcbiAgdGFiaW5kZXg6ICd0YWJJbmRleCcsXG4gIHRhcmdldDogJ3RhcmdldCcsXG4gIHRpdGxlOiAndGl0bGUnLFxuICB0eXBlOiAndHlwZScsXG4gIHVzZW1hcDogJ3VzZU1hcCcsXG4gIHZhbHVlOiAndmFsdWUnLFxuICB3aWR0aDogJ3dpZHRoJyxcbiAgd21vZGU6ICd3bW9kZScsXG4gIHdyYXA6ICd3cmFwJyxcblxuICAvLyBTVkdcbiAgYWJvdXQ6ICdhYm91dCcsXG4gIGFjY2VudGhlaWdodDogJ2FjY2VudEhlaWdodCcsXG4gICdhY2NlbnQtaGVpZ2h0JzogJ2FjY2VudEhlaWdodCcsXG4gIGFjY3VtdWxhdGU6ICdhY2N1bXVsYXRlJyxcbiAgYWRkaXRpdmU6ICdhZGRpdGl2ZScsXG4gIGFsaWdubWVudGJhc2VsaW5lOiAnYWxpZ25tZW50QmFzZWxpbmUnLFxuICAnYWxpZ25tZW50LWJhc2VsaW5lJzogJ2FsaWdubWVudEJhc2VsaW5lJyxcbiAgYWxsb3dyZW9yZGVyOiAnYWxsb3dSZW9yZGVyJyxcbiAgYWxwaGFiZXRpYzogJ2FscGhhYmV0aWMnLFxuICBhbXBsaXR1ZGU6ICdhbXBsaXR1ZGUnLFxuICBhcmFiaWNmb3JtOiAnYXJhYmljRm9ybScsXG4gICdhcmFiaWMtZm9ybSc6ICdhcmFiaWNGb3JtJyxcbiAgYXNjZW50OiAnYXNjZW50JyxcbiAgYXR0cmlidXRlbmFtZTogJ2F0dHJpYnV0ZU5hbWUnLFxuICBhdHRyaWJ1dGV0eXBlOiAnYXR0cmlidXRlVHlwZScsXG4gIGF1dG9yZXZlcnNlOiAnYXV0b1JldmVyc2UnLFxuICBhemltdXRoOiAnYXppbXV0aCcsXG4gIGJhc2VmcmVxdWVuY3k6ICdiYXNlRnJlcXVlbmN5JyxcbiAgYmFzZWxpbmVzaGlmdDogJ2Jhc2VsaW5lU2hpZnQnLFxuICAnYmFzZWxpbmUtc2hpZnQnOiAnYmFzZWxpbmVTaGlmdCcsXG4gIGJhc2Vwcm9maWxlOiAnYmFzZVByb2ZpbGUnLFxuICBiYm94OiAnYmJveCcsXG4gIGJlZ2luOiAnYmVnaW4nLFxuICBiaWFzOiAnYmlhcycsXG4gIGJ5OiAnYnknLFxuICBjYWxjbW9kZTogJ2NhbGNNb2RlJyxcbiAgY2FwaGVpZ2h0OiAnY2FwSGVpZ2h0JyxcbiAgJ2NhcC1oZWlnaHQnOiAnY2FwSGVpZ2h0JyxcbiAgY2xpcDogJ2NsaXAnLFxuICBjbGlwcGF0aDogJ2NsaXBQYXRoJyxcbiAgJ2NsaXAtcGF0aCc6ICdjbGlwUGF0aCcsXG4gIGNsaXBwYXRodW5pdHM6ICdjbGlwUGF0aFVuaXRzJyxcbiAgY2xpcHJ1bGU6ICdjbGlwUnVsZScsXG4gICdjbGlwLXJ1bGUnOiAnY2xpcFJ1bGUnLFxuICBjb2xvcjogJ2NvbG9yJyxcbiAgY29sb3JpbnRlcnBvbGF0aW9uOiAnY29sb3JJbnRlcnBvbGF0aW9uJyxcbiAgJ2NvbG9yLWludGVycG9sYXRpb24nOiAnY29sb3JJbnRlcnBvbGF0aW9uJyxcbiAgY29sb3JpbnRlcnBvbGF0aW9uZmlsdGVyczogJ2NvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnMnLFxuICAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJzogJ2NvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnMnLFxuICBjb2xvcnByb2ZpbGU6ICdjb2xvclByb2ZpbGUnLFxuICAnY29sb3ItcHJvZmlsZSc6ICdjb2xvclByb2ZpbGUnLFxuICBjb2xvcnJlbmRlcmluZzogJ2NvbG9yUmVuZGVyaW5nJyxcbiAgJ2NvbG9yLXJlbmRlcmluZyc6ICdjb2xvclJlbmRlcmluZycsXG4gIGNvbnRlbnRzY3JpcHR0eXBlOiAnY29udGVudFNjcmlwdFR5cGUnLFxuICBjb250ZW50c3R5bGV0eXBlOiAnY29udGVudFN0eWxlVHlwZScsXG4gIGN1cnNvcjogJ2N1cnNvcicsXG4gIGN4OiAnY3gnLFxuICBjeTogJ2N5JyxcbiAgZDogJ2QnLFxuICBkYXRhdHlwZTogJ2RhdGF0eXBlJyxcbiAgZGVjZWxlcmF0ZTogJ2RlY2VsZXJhdGUnLFxuICBkZXNjZW50OiAnZGVzY2VudCcsXG4gIGRpZmZ1c2Vjb25zdGFudDogJ2RpZmZ1c2VDb25zdGFudCcsXG4gIGRpcmVjdGlvbjogJ2RpcmVjdGlvbicsXG4gIGRpc3BsYXk6ICdkaXNwbGF5JyxcbiAgZGl2aXNvcjogJ2Rpdmlzb3InLFxuICBkb21pbmFudGJhc2VsaW5lOiAnZG9taW5hbnRCYXNlbGluZScsXG4gICdkb21pbmFudC1iYXNlbGluZSc6ICdkb21pbmFudEJhc2VsaW5lJyxcbiAgZHVyOiAnZHVyJyxcbiAgZHg6ICdkeCcsXG4gIGR5OiAnZHknLFxuICBlZGdlbW9kZTogJ2VkZ2VNb2RlJyxcbiAgZWxldmF0aW9uOiAnZWxldmF0aW9uJyxcbiAgZW5hYmxlYmFja2dyb3VuZDogJ2VuYWJsZUJhY2tncm91bmQnLFxuICAnZW5hYmxlLWJhY2tncm91bmQnOiAnZW5hYmxlQmFja2dyb3VuZCcsXG4gIGVuZDogJ2VuZCcsXG4gIGV4cG9uZW50OiAnZXhwb25lbnQnLFxuICBleHRlcm5hbHJlc291cmNlc3JlcXVpcmVkOiAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gIGZpbGw6ICdmaWxsJyxcbiAgZmlsbG9wYWNpdHk6ICdmaWxsT3BhY2l0eScsXG4gICdmaWxsLW9wYWNpdHknOiAnZmlsbE9wYWNpdHknLFxuICBmaWxscnVsZTogJ2ZpbGxSdWxlJyxcbiAgJ2ZpbGwtcnVsZSc6ICdmaWxsUnVsZScsXG4gIGZpbHRlcjogJ2ZpbHRlcicsXG4gIGZpbHRlcnJlczogJ2ZpbHRlclJlcycsXG4gIGZpbHRlcnVuaXRzOiAnZmlsdGVyVW5pdHMnLFxuICBmbG9vZG9wYWNpdHk6ICdmbG9vZE9wYWNpdHknLFxuICAnZmxvb2Qtb3BhY2l0eSc6ICdmbG9vZE9wYWNpdHknLFxuICBmbG9vZGNvbG9yOiAnZmxvb2RDb2xvcicsXG4gICdmbG9vZC1jb2xvcic6ICdmbG9vZENvbG9yJyxcbiAgZm9jdXNhYmxlOiAnZm9jdXNhYmxlJyxcbiAgZm9udGZhbWlseTogJ2ZvbnRGYW1pbHknLFxuICAnZm9udC1mYW1pbHknOiAnZm9udEZhbWlseScsXG4gIGZvbnRzaXplOiAnZm9udFNpemUnLFxuICAnZm9udC1zaXplJzogJ2ZvbnRTaXplJyxcbiAgZm9udHNpemVhZGp1c3Q6ICdmb250U2l6ZUFkanVzdCcsXG4gICdmb250LXNpemUtYWRqdXN0JzogJ2ZvbnRTaXplQWRqdXN0JyxcbiAgZm9udHN0cmV0Y2g6ICdmb250U3RyZXRjaCcsXG4gICdmb250LXN0cmV0Y2gnOiAnZm9udFN0cmV0Y2gnLFxuICBmb250c3R5bGU6ICdmb250U3R5bGUnLFxuICAnZm9udC1zdHlsZSc6ICdmb250U3R5bGUnLFxuICBmb250dmFyaWFudDogJ2ZvbnRWYXJpYW50JyxcbiAgJ2ZvbnQtdmFyaWFudCc6ICdmb250VmFyaWFudCcsXG4gIGZvbnR3ZWlnaHQ6ICdmb250V2VpZ2h0JyxcbiAgJ2ZvbnQtd2VpZ2h0JzogJ2ZvbnRXZWlnaHQnLFxuICBmb3JtYXQ6ICdmb3JtYXQnLFxuICBmcm9tOiAnZnJvbScsXG4gIGZ4OiAnZngnLFxuICBmeTogJ2Z5JyxcbiAgZzE6ICdnMScsXG4gIGcyOiAnZzInLFxuICBnbHlwaG5hbWU6ICdnbHlwaE5hbWUnLFxuICAnZ2x5cGgtbmFtZSc6ICdnbHlwaE5hbWUnLFxuICBnbHlwaG9yaWVudGF0aW9uaG9yaXpvbnRhbDogJ2dseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsJyxcbiAgJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnOiAnZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWwnLFxuICBnbHlwaG9yaWVudGF0aW9udmVydGljYWw6ICdnbHlwaE9yaWVudGF0aW9uVmVydGljYWwnLFxuICAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnOiAnZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsJyxcbiAgZ2x5cGhyZWY6ICdnbHlwaFJlZicsXG4gIGdyYWRpZW50dHJhbnNmb3JtOiAnZ3JhZGllbnRUcmFuc2Zvcm0nLFxuICBncmFkaWVudHVuaXRzOiAnZ3JhZGllbnRVbml0cycsXG4gIGhhbmdpbmc6ICdoYW5naW5nJyxcbiAgaG9yaXphZHZ4OiAnaG9yaXpBZHZYJyxcbiAgJ2hvcml6LWFkdi14JzogJ2hvcml6QWR2WCcsXG4gIGhvcml6b3JpZ2lueDogJ2hvcml6T3JpZ2luWCcsXG4gICdob3Jpei1vcmlnaW4teCc6ICdob3Jpek9yaWdpblgnLFxuICBpZGVvZ3JhcGhpYzogJ2lkZW9ncmFwaGljJyxcbiAgaW1hZ2VyZW5kZXJpbmc6ICdpbWFnZVJlbmRlcmluZycsXG4gICdpbWFnZS1yZW5kZXJpbmcnOiAnaW1hZ2VSZW5kZXJpbmcnLFxuICBpbjI6ICdpbjInLFxuICBpbjogJ2luJyxcbiAgaW5saXN0OiAnaW5saXN0JyxcbiAgaW50ZXJjZXB0OiAnaW50ZXJjZXB0JyxcbiAgazE6ICdrMScsXG4gIGsyOiAnazInLFxuICBrMzogJ2szJyxcbiAgazQ6ICdrNCcsXG4gIGs6ICdrJyxcbiAga2VybmVsbWF0cml4OiAna2VybmVsTWF0cml4JyxcbiAga2VybmVsdW5pdGxlbmd0aDogJ2tlcm5lbFVuaXRMZW5ndGgnLFxuICBrZXJuaW5nOiAna2VybmluZycsXG4gIGtleXBvaW50czogJ2tleVBvaW50cycsXG4gIGtleXNwbGluZXM6ICdrZXlTcGxpbmVzJyxcbiAga2V5dGltZXM6ICdrZXlUaW1lcycsXG4gIGxlbmd0aGFkanVzdDogJ2xlbmd0aEFkanVzdCcsXG4gIGxldHRlcnNwYWNpbmc6ICdsZXR0ZXJTcGFjaW5nJyxcbiAgJ2xldHRlci1zcGFjaW5nJzogJ2xldHRlclNwYWNpbmcnLFxuICBsaWdodGluZ2NvbG9yOiAnbGlnaHRpbmdDb2xvcicsXG4gICdsaWdodGluZy1jb2xvcic6ICdsaWdodGluZ0NvbG9yJyxcbiAgbGltaXRpbmdjb25lYW5nbGU6ICdsaW1pdGluZ0NvbmVBbmdsZScsXG4gIGxvY2FsOiAnbG9jYWwnLFxuICBtYXJrZXJlbmQ6ICdtYXJrZXJFbmQnLFxuICAnbWFya2VyLWVuZCc6ICdtYXJrZXJFbmQnLFxuICBtYXJrZXJoZWlnaHQ6ICdtYXJrZXJIZWlnaHQnLFxuICBtYXJrZXJtaWQ6ICdtYXJrZXJNaWQnLFxuICAnbWFya2VyLW1pZCc6ICdtYXJrZXJNaWQnLFxuICBtYXJrZXJzdGFydDogJ21hcmtlclN0YXJ0JyxcbiAgJ21hcmtlci1zdGFydCc6ICdtYXJrZXJTdGFydCcsXG4gIG1hcmtlcnVuaXRzOiAnbWFya2VyVW5pdHMnLFxuICBtYXJrZXJ3aWR0aDogJ21hcmtlcldpZHRoJyxcbiAgbWFzazogJ21hc2snLFxuICBtYXNrY29udGVudHVuaXRzOiAnbWFza0NvbnRlbnRVbml0cycsXG4gIG1hc2t1bml0czogJ21hc2tVbml0cycsXG4gIG1hdGhlbWF0aWNhbDogJ21hdGhlbWF0aWNhbCcsXG4gIG1vZGU6ICdtb2RlJyxcbiAgbnVtb2N0YXZlczogJ251bU9jdGF2ZXMnLFxuICBvZmZzZXQ6ICdvZmZzZXQnLFxuICBvcGFjaXR5OiAnb3BhY2l0eScsXG4gIG9wZXJhdG9yOiAnb3BlcmF0b3InLFxuICBvcmRlcjogJ29yZGVyJyxcbiAgb3JpZW50OiAnb3JpZW50JyxcbiAgb3JpZW50YXRpb246ICdvcmllbnRhdGlvbicsXG4gIG9yaWdpbjogJ29yaWdpbicsXG4gIG92ZXJmbG93OiAnb3ZlcmZsb3cnLFxuICBvdmVybGluZXBvc2l0aW9uOiAnb3ZlcmxpbmVQb3NpdGlvbicsXG4gICdvdmVybGluZS1wb3NpdGlvbic6ICdvdmVybGluZVBvc2l0aW9uJyxcbiAgb3ZlcmxpbmV0aGlja25lc3M6ICdvdmVybGluZVRoaWNrbmVzcycsXG4gICdvdmVybGluZS10aGlja25lc3MnOiAnb3ZlcmxpbmVUaGlja25lc3MnLFxuICBwYWludG9yZGVyOiAncGFpbnRPcmRlcicsXG4gICdwYWludC1vcmRlcic6ICdwYWludE9yZGVyJyxcbiAgcGFub3NlMTogJ3Bhbm9zZTEnLFxuICAncGFub3NlLTEnOiAncGFub3NlMScsXG4gIHBhdGhsZW5ndGg6ICdwYXRoTGVuZ3RoJyxcbiAgcGF0dGVybmNvbnRlbnR1bml0czogJ3BhdHRlcm5Db250ZW50VW5pdHMnLFxuICBwYXR0ZXJudHJhbnNmb3JtOiAncGF0dGVyblRyYW5zZm9ybScsXG4gIHBhdHRlcm51bml0czogJ3BhdHRlcm5Vbml0cycsXG4gIHBvaW50ZXJldmVudHM6ICdwb2ludGVyRXZlbnRzJyxcbiAgJ3BvaW50ZXItZXZlbnRzJzogJ3BvaW50ZXJFdmVudHMnLFxuICBwb2ludHM6ICdwb2ludHMnLFxuICBwb2ludHNhdHg6ICdwb2ludHNBdFgnLFxuICBwb2ludHNhdHk6ICdwb2ludHNBdFknLFxuICBwb2ludHNhdHo6ICdwb2ludHNBdFonLFxuICBwcmVmaXg6ICdwcmVmaXgnLFxuICBwcmVzZXJ2ZWFscGhhOiAncHJlc2VydmVBbHBoYScsXG4gIHByZXNlcnZlYXNwZWN0cmF0aW86ICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJyxcbiAgcHJpbWl0aXZldW5pdHM6ICdwcmltaXRpdmVVbml0cycsXG4gIHByb3BlcnR5OiAncHJvcGVydHknLFxuICByOiAncicsXG4gIHJhZGl1czogJ3JhZGl1cycsXG4gIHJlZng6ICdyZWZYJyxcbiAgcmVmeTogJ3JlZlknLFxuICByZW5kZXJpbmdpbnRlbnQ6ICdyZW5kZXJpbmdJbnRlbnQnLFxuICAncmVuZGVyaW5nLWludGVudCc6ICdyZW5kZXJpbmdJbnRlbnQnLFxuICByZXBlYXRjb3VudDogJ3JlcGVhdENvdW50JyxcbiAgcmVwZWF0ZHVyOiAncmVwZWF0RHVyJyxcbiAgcmVxdWlyZWRleHRlbnNpb25zOiAncmVxdWlyZWRFeHRlbnNpb25zJyxcbiAgcmVxdWlyZWRmZWF0dXJlczogJ3JlcXVpcmVkRmVhdHVyZXMnLFxuICByZXNvdXJjZTogJ3Jlc291cmNlJyxcbiAgcmVzdGFydDogJ3Jlc3RhcnQnLFxuICByZXN1bHQ6ICdyZXN1bHQnLFxuICByZXN1bHRzOiAncmVzdWx0cycsXG4gIHJvdGF0ZTogJ3JvdGF0ZScsXG4gIHJ4OiAncngnLFxuICByeTogJ3J5JyxcbiAgc2NhbGU6ICdzY2FsZScsXG4gIHNlY3VyaXR5OiAnc2VjdXJpdHknLFxuICBzZWVkOiAnc2VlZCcsXG4gIHNoYXBlcmVuZGVyaW5nOiAnc2hhcGVSZW5kZXJpbmcnLFxuICAnc2hhcGUtcmVuZGVyaW5nJzogJ3NoYXBlUmVuZGVyaW5nJyxcbiAgc2xvcGU6ICdzbG9wZScsXG4gIHNwYWNpbmc6ICdzcGFjaW5nJyxcbiAgc3BlY3VsYXJjb25zdGFudDogJ3NwZWN1bGFyQ29uc3RhbnQnLFxuICBzcGVjdWxhcmV4cG9uZW50OiAnc3BlY3VsYXJFeHBvbmVudCcsXG4gIHNwZWVkOiAnc3BlZWQnLFxuICBzcHJlYWRtZXRob2Q6ICdzcHJlYWRNZXRob2QnLFxuICBzdGFydG9mZnNldDogJ3N0YXJ0T2Zmc2V0JyxcbiAgc3RkZGV2aWF0aW9uOiAnc3RkRGV2aWF0aW9uJyxcbiAgc3RlbWg6ICdzdGVtaCcsXG4gIHN0ZW12OiAnc3RlbXYnLFxuICBzdGl0Y2h0aWxlczogJ3N0aXRjaFRpbGVzJyxcbiAgc3RvcGNvbG9yOiAnc3RvcENvbG9yJyxcbiAgJ3N0b3AtY29sb3InOiAnc3RvcENvbG9yJyxcbiAgc3RvcG9wYWNpdHk6ICdzdG9wT3BhY2l0eScsXG4gICdzdG9wLW9wYWNpdHknOiAnc3RvcE9wYWNpdHknLFxuICBzdHJpa2V0aHJvdWdocG9zaXRpb246ICdzdHJpa2V0aHJvdWdoUG9zaXRpb24nLFxuICAnc3RyaWtldGhyb3VnaC1wb3NpdGlvbic6ICdzdHJpa2V0aHJvdWdoUG9zaXRpb24nLFxuICBzdHJpa2V0aHJvdWdodGhpY2tuZXNzOiAnc3RyaWtldGhyb3VnaFRoaWNrbmVzcycsXG4gICdzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyc6ICdzdHJpa2V0aHJvdWdoVGhpY2tuZXNzJyxcbiAgc3RyaW5nOiAnc3RyaW5nJyxcbiAgc3Ryb2tlOiAnc3Ryb2tlJyxcbiAgc3Ryb2tlZGFzaGFycmF5OiAnc3Ryb2tlRGFzaGFycmF5JyxcbiAgJ3N0cm9rZS1kYXNoYXJyYXknOiAnc3Ryb2tlRGFzaGFycmF5JyxcbiAgc3Ryb2tlZGFzaG9mZnNldDogJ3N0cm9rZURhc2hvZmZzZXQnLFxuICAnc3Ryb2tlLWRhc2hvZmZzZXQnOiAnc3Ryb2tlRGFzaG9mZnNldCcsXG4gIHN0cm9rZWxpbmVjYXA6ICdzdHJva2VMaW5lY2FwJyxcbiAgJ3N0cm9rZS1saW5lY2FwJzogJ3N0cm9rZUxpbmVjYXAnLFxuICBzdHJva2VsaW5lam9pbjogJ3N0cm9rZUxpbmVqb2luJyxcbiAgJ3N0cm9rZS1saW5lam9pbic6ICdzdHJva2VMaW5lam9pbicsXG4gIHN0cm9rZW1pdGVybGltaXQ6ICdzdHJva2VNaXRlcmxpbWl0JyxcbiAgJ3N0cm9rZS1taXRlcmxpbWl0JzogJ3N0cm9rZU1pdGVybGltaXQnLFxuICBzdHJva2V3aWR0aDogJ3N0cm9rZVdpZHRoJyxcbiAgJ3N0cm9rZS13aWR0aCc6ICdzdHJva2VXaWR0aCcsXG4gIHN0cm9rZW9wYWNpdHk6ICdzdHJva2VPcGFjaXR5JyxcbiAgJ3N0cm9rZS1vcGFjaXR5JzogJ3N0cm9rZU9wYWNpdHknLFxuICBzdXBwcmVzc2NvbnRlbnRlZGl0YWJsZXdhcm5pbmc6ICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLFxuICBzdXBwcmVzc2h5ZHJhdGlvbndhcm5pbmc6ICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnLFxuICBzdXJmYWNlc2NhbGU6ICdzdXJmYWNlU2NhbGUnLFxuICBzeXN0ZW1sYW5ndWFnZTogJ3N5c3RlbUxhbmd1YWdlJyxcbiAgdGFibGV2YWx1ZXM6ICd0YWJsZVZhbHVlcycsXG4gIHRhcmdldHg6ICd0YXJnZXRYJyxcbiAgdGFyZ2V0eTogJ3RhcmdldFknLFxuICB0ZXh0YW5jaG9yOiAndGV4dEFuY2hvcicsXG4gICd0ZXh0LWFuY2hvcic6ICd0ZXh0QW5jaG9yJyxcbiAgdGV4dGRlY29yYXRpb246ICd0ZXh0RGVjb3JhdGlvbicsXG4gICd0ZXh0LWRlY29yYXRpb24nOiAndGV4dERlY29yYXRpb24nLFxuICB0ZXh0bGVuZ3RoOiAndGV4dExlbmd0aCcsXG4gIHRleHRyZW5kZXJpbmc6ICd0ZXh0UmVuZGVyaW5nJyxcbiAgJ3RleHQtcmVuZGVyaW5nJzogJ3RleHRSZW5kZXJpbmcnLFxuICB0bzogJ3RvJyxcbiAgdHJhbnNmb3JtOiAndHJhbnNmb3JtJyxcbiAgdHlwZW9mOiAndHlwZW9mJyxcbiAgdTE6ICd1MScsXG4gIHUyOiAndTInLFxuICB1bmRlcmxpbmVwb3NpdGlvbjogJ3VuZGVybGluZVBvc2l0aW9uJyxcbiAgJ3VuZGVybGluZS1wb3NpdGlvbic6ICd1bmRlcmxpbmVQb3NpdGlvbicsXG4gIHVuZGVybGluZXRoaWNrbmVzczogJ3VuZGVybGluZVRoaWNrbmVzcycsXG4gICd1bmRlcmxpbmUtdGhpY2tuZXNzJzogJ3VuZGVybGluZVRoaWNrbmVzcycsXG4gIHVuaWNvZGU6ICd1bmljb2RlJyxcbiAgdW5pY29kZWJpZGk6ICd1bmljb2RlQmlkaScsXG4gICd1bmljb2RlLWJpZGknOiAndW5pY29kZUJpZGknLFxuICB1bmljb2RlcmFuZ2U6ICd1bmljb2RlUmFuZ2UnLFxuICAndW5pY29kZS1yYW5nZSc6ICd1bmljb2RlUmFuZ2UnLFxuICB1bml0c3BlcmVtOiAndW5pdHNQZXJFbScsXG4gICd1bml0cy1wZXItZW0nOiAndW5pdHNQZXJFbScsXG4gIHVuc2VsZWN0YWJsZTogJ3Vuc2VsZWN0YWJsZScsXG4gIHZhbHBoYWJldGljOiAndkFscGhhYmV0aWMnLFxuICAndi1hbHBoYWJldGljJzogJ3ZBbHBoYWJldGljJyxcbiAgdmFsdWVzOiAndmFsdWVzJyxcbiAgdmVjdG9yZWZmZWN0OiAndmVjdG9yRWZmZWN0JyxcbiAgJ3ZlY3Rvci1lZmZlY3QnOiAndmVjdG9yRWZmZWN0JyxcbiAgdmVyc2lvbjogJ3ZlcnNpb24nLFxuICB2ZXJ0YWR2eTogJ3ZlcnRBZHZZJyxcbiAgJ3ZlcnQtYWR2LXknOiAndmVydEFkdlknLFxuICB2ZXJ0b3JpZ2lueDogJ3ZlcnRPcmlnaW5YJyxcbiAgJ3ZlcnQtb3JpZ2luLXgnOiAndmVydE9yaWdpblgnLFxuICB2ZXJ0b3JpZ2lueTogJ3ZlcnRPcmlnaW5ZJyxcbiAgJ3ZlcnQtb3JpZ2luLXknOiAndmVydE9yaWdpblknLFxuICB2aGFuZ2luZzogJ3ZIYW5naW5nJyxcbiAgJ3YtaGFuZ2luZyc6ICd2SGFuZ2luZycsXG4gIHZpZGVvZ3JhcGhpYzogJ3ZJZGVvZ3JhcGhpYycsXG4gICd2LWlkZW9ncmFwaGljJzogJ3ZJZGVvZ3JhcGhpYycsXG4gIHZpZXdib3g6ICd2aWV3Qm94JyxcbiAgdmlld3RhcmdldDogJ3ZpZXdUYXJnZXQnLFxuICB2aXNpYmlsaXR5OiAndmlzaWJpbGl0eScsXG4gIHZtYXRoZW1hdGljYWw6ICd2TWF0aGVtYXRpY2FsJyxcbiAgJ3YtbWF0aGVtYXRpY2FsJzogJ3ZNYXRoZW1hdGljYWwnLFxuICB2b2NhYjogJ3ZvY2FiJyxcbiAgd2lkdGhzOiAnd2lkdGhzJyxcbiAgd29yZHNwYWNpbmc6ICd3b3JkU3BhY2luZycsXG4gICd3b3JkLXNwYWNpbmcnOiAnd29yZFNwYWNpbmcnLFxuICB3cml0aW5nbW9kZTogJ3dyaXRpbmdNb2RlJyxcbiAgJ3dyaXRpbmctbW9kZSc6ICd3cml0aW5nTW9kZScsXG4gIHgxOiAneDEnLFxuICB4MjogJ3gyJyxcbiAgeDogJ3gnLFxuICB4Y2hhbm5lbHNlbGVjdG9yOiAneENoYW5uZWxTZWxlY3RvcicsXG4gIHhoZWlnaHQ6ICd4SGVpZ2h0JyxcbiAgJ3gtaGVpZ2h0JzogJ3hIZWlnaHQnLFxuICB4bGlua2FjdHVhdGU6ICd4bGlua0FjdHVhdGUnLFxuICAneGxpbms6YWN0dWF0ZSc6ICd4bGlua0FjdHVhdGUnLFxuICB4bGlua2FyY3JvbGU6ICd4bGlua0FyY3JvbGUnLFxuICAneGxpbms6YXJjcm9sZSc6ICd4bGlua0FyY3JvbGUnLFxuICB4bGlua2hyZWY6ICd4bGlua0hyZWYnLFxuICAneGxpbms6aHJlZic6ICd4bGlua0hyZWYnLFxuICB4bGlua3JvbGU6ICd4bGlua1JvbGUnLFxuICAneGxpbms6cm9sZSc6ICd4bGlua1JvbGUnLFxuICB4bGlua3Nob3c6ICd4bGlua1Nob3cnLFxuICAneGxpbms6c2hvdyc6ICd4bGlua1Nob3cnLFxuICB4bGlua3RpdGxlOiAneGxpbmtUaXRsZScsXG4gICd4bGluazp0aXRsZSc6ICd4bGlua1RpdGxlJyxcbiAgeGxpbmt0eXBlOiAneGxpbmtUeXBlJyxcbiAgJ3hsaW5rOnR5cGUnOiAneGxpbmtUeXBlJyxcbiAgeG1sYmFzZTogJ3htbEJhc2UnLFxuICAneG1sOmJhc2UnOiAneG1sQmFzZScsXG4gIHhtbGxhbmc6ICd4bWxMYW5nJyxcbiAgJ3htbDpsYW5nJzogJ3htbExhbmcnLFxuICB4bWxuczogJ3htbG5zJyxcbiAgJ3htbDpzcGFjZSc6ICd4bWxTcGFjZScsXG4gIHhtbG5zeGxpbms6ICd4bWxuc1hsaW5rJyxcbiAgJ3htbG5zOnhsaW5rJzogJ3htbG5zWGxpbmsnLFxuICB4bWxzcGFjZTogJ3htbFNwYWNlJyxcbiAgeTE6ICd5MScsXG4gIHkyOiAneTInLFxuICB5OiAneScsXG4gIHljaGFubmVsc2VsZWN0b3I6ICd5Q2hhbm5lbFNlbGVjdG9yJyxcbiAgejogJ3onLFxuICB6b29tYW5kcGFuOiAnem9vbUFuZFBhbidcbn07XG5cbnZhciBhcmlhUHJvcGVydGllcyA9IHtcbiAgJ2FyaWEtY3VycmVudCc6IDAsIC8vIHN0YXRlXG4gICdhcmlhLWRldGFpbHMnOiAwLFxuICAnYXJpYS1kaXNhYmxlZCc6IDAsIC8vIHN0YXRlXG4gICdhcmlhLWhpZGRlbic6IDAsIC8vIHN0YXRlXG4gICdhcmlhLWludmFsaWQnOiAwLCAvLyBzdGF0ZVxuICAnYXJpYS1rZXlzaG9ydGN1dHMnOiAwLFxuICAnYXJpYS1sYWJlbCc6IDAsXG4gICdhcmlhLXJvbGVkZXNjcmlwdGlvbic6IDAsXG4gIC8vIFdpZGdldCBBdHRyaWJ1dGVzXG4gICdhcmlhLWF1dG9jb21wbGV0ZSc6IDAsXG4gICdhcmlhLWNoZWNrZWQnOiAwLFxuICAnYXJpYS1leHBhbmRlZCc6IDAsXG4gICdhcmlhLWhhc3BvcHVwJzogMCxcbiAgJ2FyaWEtbGV2ZWwnOiAwLFxuICAnYXJpYS1tb2RhbCc6IDAsXG4gICdhcmlhLW11bHRpbGluZSc6IDAsXG4gICdhcmlhLW11bHRpc2VsZWN0YWJsZSc6IDAsXG4gICdhcmlhLW9yaWVudGF0aW9uJzogMCxcbiAgJ2FyaWEtcGxhY2Vob2xkZXInOiAwLFxuICAnYXJpYS1wcmVzc2VkJzogMCxcbiAgJ2FyaWEtcmVhZG9ubHknOiAwLFxuICAnYXJpYS1yZXF1aXJlZCc6IDAsXG4gICdhcmlhLXNlbGVjdGVkJzogMCxcbiAgJ2FyaWEtc29ydCc6IDAsXG4gICdhcmlhLXZhbHVlbWF4JzogMCxcbiAgJ2FyaWEtdmFsdWVtaW4nOiAwLFxuICAnYXJpYS12YWx1ZW5vdyc6IDAsXG4gICdhcmlhLXZhbHVldGV4dCc6IDAsXG4gIC8vIExpdmUgUmVnaW9uIEF0dHJpYnV0ZXNcbiAgJ2FyaWEtYXRvbWljJzogMCxcbiAgJ2FyaWEtYnVzeSc6IDAsXG4gICdhcmlhLWxpdmUnOiAwLFxuICAnYXJpYS1yZWxldmFudCc6IDAsXG4gIC8vIERyYWctYW5kLURyb3AgQXR0cmlidXRlc1xuICAnYXJpYS1kcm9wZWZmZWN0JzogMCxcbiAgJ2FyaWEtZ3JhYmJlZCc6IDAsXG4gIC8vIFJlbGF0aW9uc2hpcCBBdHRyaWJ1dGVzXG4gICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnOiAwLFxuICAnYXJpYS1jb2xjb3VudCc6IDAsXG4gICdhcmlhLWNvbGluZGV4JzogMCxcbiAgJ2FyaWEtY29sc3Bhbic6IDAsXG4gICdhcmlhLWNvbnRyb2xzJzogMCxcbiAgJ2FyaWEtZGVzY3JpYmVkYnknOiAwLFxuICAnYXJpYS1lcnJvcm1lc3NhZ2UnOiAwLFxuICAnYXJpYS1mbG93dG8nOiAwLFxuICAnYXJpYS1sYWJlbGxlZGJ5JzogMCxcbiAgJ2FyaWEtb3ducyc6IDAsXG4gICdhcmlhLXBvc2luc2V0JzogMCxcbiAgJ2FyaWEtcm93Y291bnQnOiAwLFxuICAnYXJpYS1yb3dpbmRleCc6IDAsXG4gICdhcmlhLXJvd3NwYW4nOiAwLFxuICAnYXJpYS1zZXRzaXplJzogMFxufTtcblxudmFyIHdhcm5lZFByb3BlcnRpZXMgPSB7fTtcbnZhciByQVJJQSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xudmFyIHJBUklBQ2FtZWwgPSBuZXcgUmVnRXhwKCdeKGFyaWEpW0EtWl1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSQyID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eSh0YWdOYW1lLCBuYW1lKSB7XG4gIGlmIChoYXNPd25Qcm9wZXJ0eSQyLmNhbGwod2FybmVkUHJvcGVydGllcywgbmFtZSkgJiYgd2FybmVkUHJvcGVydGllc1tuYW1lXSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHJBUklBQ2FtZWwudGVzdChuYW1lKSkge1xuICAgIHZhciBhcmlhTmFtZSA9ICdhcmlhLScgKyBuYW1lLnNsaWNlKDQpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGNvcnJlY3ROYW1lID0gYXJpYVByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoYXJpYU5hbWUpID8gYXJpYU5hbWUgOiBudWxsO1xuXG4gICAgLy8gSWYgdGhpcyBpcyBhbiBhcmlhLSogYXR0cmlidXRlLCBidXQgaXMgbm90IGxpc3RlZCBpbiB0aGUga25vd24gRE9NXG4gICAgLy8gRE9NIHByb3BlcnRpZXMsIHRoZW4gaXQgaXMgYW4gaW52YWxpZCBhcmlhLSogYXR0cmlidXRlLlxuICAgIGlmIChjb3JyZWN0TmFtZSA9PSBudWxsKSB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICdJbnZhbGlkIEFSSUEgYXR0cmlidXRlIGAlc2AuIEFSSUEgYXR0cmlidXRlcyBmb2xsb3cgdGhlIHBhdHRlcm4gYXJpYS0qIGFuZCBtdXN0IGJlIGxvd2VyY2FzZS4nLCBuYW1lKTtcbiAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIGFyaWEtKiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBsb3dlcmNhc2U7IHN1Z2dlc3QgdGhlIGxvd2VyY2FzZSB2ZXJzaW9uLlxuICAgIGlmIChuYW1lICE9PSBjb3JyZWN0TmFtZSkge1xuICAgICAgd2FybmluZyQxKGZhbHNlLCAnSW52YWxpZCBBUklBIGF0dHJpYnV0ZSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBjb3JyZWN0TmFtZSk7XG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyQVJJQS50ZXN0KG5hbWUpKSB7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBzdGFuZGFyZE5hbWUgPSBhcmlhUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkgPyBsb3dlckNhc2VkTmFtZSA6IG51bGw7XG5cbiAgICAvLyBJZiB0aGlzIGlzIGFuIGFyaWEtKiBhdHRyaWJ1dGUsIGJ1dCBpcyBub3QgbGlzdGVkIGluIHRoZSBrbm93biBET01cbiAgICAvLyBET00gcHJvcGVydGllcywgdGhlbiBpdCBpcyBhbiBpbnZhbGlkIGFyaWEtKiBhdHRyaWJ1dGUuXG4gICAgaWYgKHN0YW5kYXJkTmFtZSA9PSBudWxsKSB7XG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gYXJpYS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb24uXG4gICAgaWYgKG5hbWUgIT09IHN0YW5kYXJkTmFtZSkge1xuICAgICAgd2FybmluZyQxKGZhbHNlLCAnVW5rbm93biBBUklBIGF0dHJpYnV0ZSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBzdGFuZGFyZE5hbWUpO1xuICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gd2FybkludmFsaWRBUklBUHJvcHModHlwZSwgcHJvcHMpIHtcbiAgdmFyIGludmFsaWRQcm9wcyA9IFtdO1xuXG4gIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgIHZhciBpc1ZhbGlkID0gdmFsaWRhdGVQcm9wZXJ0eSh0eXBlLCBrZXkpO1xuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgaW52YWxpZFByb3BzLnB1c2goa2V5KTtcbiAgICB9XG4gIH1cblxuICB2YXIgdW5rbm93blByb3BTdHJpbmcgPSBpbnZhbGlkUHJvcHMubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgcmV0dXJuICdgJyArIHByb3AgKyAnYCc7XG4gIH0pLmpvaW4oJywgJyk7XG5cbiAgaWYgKGludmFsaWRQcm9wcy5sZW5ndGggPT09IDEpIHtcbiAgICB3YXJuaW5nJDEoZmFsc2UsICdJbnZhbGlkIGFyaWEgcHJvcCAlcyBvbiA8JXM+IHRhZy4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vZmIubWUvaW52YWxpZC1hcmlhLXByb3AnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gIH0gZWxzZSBpZiAoaW52YWxpZFByb3BzLmxlbmd0aCA+IDEpIHtcbiAgICB3YXJuaW5nJDEoZmFsc2UsICdJbnZhbGlkIGFyaWEgcHJvcHMgJXMgb24gPCVzPiB0YWcuICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL2ZiLm1lL2ludmFsaWQtYXJpYS1wcm9wJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyh0eXBlLCBwcm9wcykge1xuICBpZiAoaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHdhcm5JbnZhbGlkQVJJQVByb3BzKHR5cGUsIHByb3BzKTtcbn1cblxudmFyIGRpZFdhcm5WYWx1ZU51bGwgPSBmYWxzZTtcblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzJDEodHlwZSwgcHJvcHMpIHtcbiAgaWYgKHR5cGUgIT09ICdpbnB1dCcgJiYgdHlwZSAhPT0gJ3RleHRhcmVhJyAmJiB0eXBlICE9PSAnc2VsZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChwcm9wcyAhPSBudWxsICYmIHByb3BzLnZhbHVlID09PSBudWxsICYmICFkaWRXYXJuVmFsdWVOdWxsKSB7XG4gICAgZGlkV2FyblZhbHVlTnVsbCA9IHRydWU7XG4gICAgaWYgKHR5cGUgPT09ICdzZWxlY3QnICYmIHByb3BzLm11bHRpcGxlKSB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICdgdmFsdWVgIHByb3Agb24gYCVzYCBzaG91bGQgbm90IGJlIG51bGwuICcgKyAnQ29uc2lkZXIgdXNpbmcgYW4gZW1wdHkgYXJyYXkgd2hlbiBgbXVsdGlwbGVgIGlzIHNldCB0byBgdHJ1ZWAgJyArICd0byBjbGVhciB0aGUgY29tcG9uZW50IG9yIGB1bmRlZmluZWRgIGZvciB1bmNvbnRyb2xsZWQgY29tcG9uZW50cy4nLCB0eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2FybmluZyQxKGZhbHNlLCAnYHZhbHVlYCBwcm9wIG9uIGAlc2Agc2hvdWxkIG5vdCBiZSBudWxsLiAnICsgJ0NvbnNpZGVyIHVzaW5nIGFuIGVtcHR5IHN0cmluZyB0byBjbGVhciB0aGUgY29tcG9uZW50IG9yIGB1bmRlZmluZWRgICcgKyAnZm9yIHVuY29udHJvbGxlZCBjb21wb25lbnRzLicsIHR5cGUpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgdmFsaWRhdGVQcm9wZXJ0eSQxID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgdmFyIHdhcm5lZFByb3BlcnRpZXMkMSA9IHt9O1xuICB2YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIEVWRU5UX05BTUVfUkVHRVggPSAvXm9uLi87XG4gIHZhciBJTlZBTElEX0VWRU5UX05BTUVfUkVHRVggPSAvXm9uW15BLVpdLztcbiAgdmFyIHJBUklBJDEgPSBuZXcgUmVnRXhwKCdeKGFyaWEpLVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcbiAgdmFyIHJBUklBQ2FtZWwkMSA9IG5ldyBSZWdFeHAoJ14oYXJpYSlbQS1aXVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcblxuICB2YWxpZGF0ZVByb3BlcnR5JDEgPSBmdW5jdGlvbiAodGFnTmFtZSwgbmFtZSwgdmFsdWUsIGNhblVzZUV2ZW50U3lzdGVtKSB7XG4gICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHdhcm5lZFByb3BlcnRpZXMkMSwgbmFtZSkgJiYgd2FybmVkUHJvcGVydGllcyQxW25hbWVdKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnb25mb2N1c2luJyB8fCBsb3dlckNhc2VkTmFtZSA9PT0gJ29uZm9jdXNvdXQnKSB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICdSZWFjdCB1c2VzIG9uRm9jdXMgYW5kIG9uQmx1ciBpbnN0ZWFkIG9mIG9uRm9jdXNJbiBhbmQgb25Gb2N1c091dC4gJyArICdBbGwgUmVhY3QgZXZlbnRzIGFyZSBub3JtYWxpemVkIHRvIGJ1YmJsZSwgc28gb25Gb2N1c0luIGFuZCBvbkZvY3VzT3V0ICcgKyAnYXJlIG5vdCBuZWVkZWQvc3VwcG9ydGVkIGJ5IFJlYWN0LicpO1xuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFdlIGNhbid0IHJlbHkgb24gdGhlIGV2ZW50IHN5c3RlbSBiZWluZyBpbmplY3RlZCBvbiB0aGUgc2VydmVyLlxuICAgIGlmIChjYW5Vc2VFdmVudFN5c3RlbSkge1xuICAgICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUgPSBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSA/IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNbbG93ZXJDYXNlZE5hbWVdIDogbnVsbDtcbiAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lICE9IG51bGwpIHtcbiAgICAgICAgd2FybmluZyQxKGZhbHNlLCAnSW52YWxpZCBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgd2FybmluZyQxKGZhbHNlLCAnVW5rbm93biBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuIEl0IHdpbGwgYmUgaWdub3JlZC4nLCBuYW1lKTtcbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgIC8vIElmIG5vIGV2ZW50IHBsdWdpbnMgaGF2ZSBiZWVuIGluamVjdGVkLCB3ZSBhcmUgaW4gYSBzZXJ2ZXIgZW52aXJvbm1lbnQuXG4gICAgICAvLyBTbyB3ZSBjYW4ndCB0ZWxsIGlmIHRoZSBldmVudCBuYW1lIGlzIGNvcnJlY3QgZm9yIHN1cmUsIGJ1dCB3ZSBjYW4gZmlsdGVyXG4gICAgICAvLyBvdXQga25vd24gYmFkIG9uZXMgbGlrZSBgb25jbGlja2AuIFdlIGNhbid0IHN1Z2dlc3QgYSBzcGVjaWZpYyByZXBsYWNlbWVudCB0aG91Z2guXG4gICAgICBpZiAoSU5WQUxJRF9FVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgd2FybmluZyQxKGZhbHNlLCAnSW52YWxpZCBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuICcgKyAnUmVhY3QgZXZlbnRzIHVzZSB0aGUgY2FtZWxDYXNlIG5hbWluZyBjb252ZW50aW9uLCBmb3IgZXhhbXBsZSBgb25DbGlja2AuJywgbmFtZSk7XG4gICAgICB9XG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gTGV0IHRoZSBBUklBIGF0dHJpYnV0ZSBob29rIHZhbGlkYXRlIEFSSUEgYXR0cmlidXRlc1xuICAgIGlmIChyQVJJQSQxLnRlc3QobmFtZSkgfHwgckFSSUFDYW1lbCQxLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2lubmVyaHRtbCcpIHtcbiAgICAgIHdhcm5pbmckMShmYWxzZSwgJ0RpcmVjdGx5IHNldHRpbmcgcHJvcGVydHkgYGlubmVySFRNTGAgaXMgbm90IHBlcm1pdHRlZC4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgbG9va3VwIGRvY3VtZW50YXRpb24gb24gYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKTtcbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdhcmlhJykge1xuICAgICAgd2FybmluZyQxKGZhbHNlLCAnVGhlIGBhcmlhYCBhdHRyaWJ1dGUgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgaW4gUmVhY3QuICcgKyAnUGFzcyBpbmRpdmlkdWFsIGBhcmlhLWAgYXR0cmlidXRlcyBpbnN0ZWFkLicpO1xuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2lzJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHdhcm5pbmckMShmYWxzZSwgJ1JlY2VpdmVkIGEgYCVzYCBmb3IgYSBzdHJpbmcgYXR0cmlidXRlIGBpc2AuIElmIHRoaXMgaXMgZXhwZWN0ZWQsIGNhc3QgJyArICd0aGUgdmFsdWUgdG8gYSBzdHJpbmcuJywgdHlwZW9mIHZhbHVlKTtcbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWx1ZSkpIHtcbiAgICAgIHdhcm5pbmckMShmYWxzZSwgJ1JlY2VpdmVkIE5hTiBmb3IgdGhlIGAlc2AgYXR0cmlidXRlLiBJZiB0aGlzIGlzIGV4cGVjdGVkLCBjYXN0ICcgKyAndGhlIHZhbHVlIHRvIGEgc3RyaW5nLicsIG5hbWUpO1xuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBwcm9wZXJ0eUluZm8gPSBnZXRQcm9wZXJ0eUluZm8obmFtZSk7XG4gICAgdmFyIGlzUmVzZXJ2ZWQgPSBwcm9wZXJ0eUluZm8gIT09IG51bGwgJiYgcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEO1xuXG4gICAgLy8gS25vd24gYXR0cmlidXRlcyBzaG91bGQgbWF0Y2ggdGhlIGNhc2luZyBzcGVjaWZpZWQgaW4gdGhlIHByb3BlcnR5IGNvbmZpZy5cbiAgICBpZiAocG9zc2libGVTdGFuZGFyZE5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSkge1xuICAgICAgdmFyIHN0YW5kYXJkTmFtZSA9IHBvc3NpYmxlU3RhbmRhcmROYW1lc1tsb3dlckNhc2VkTmFtZV07XG4gICAgICBpZiAoc3RhbmRhcmROYW1lICE9PSBuYW1lKSB7XG4gICAgICAgIHdhcm5pbmckMShmYWxzZSwgJ0ludmFsaWQgRE9NIHByb3BlcnR5IGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIHN0YW5kYXJkTmFtZSk7XG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzUmVzZXJ2ZWQgJiYgbmFtZSAhPT0gbG93ZXJDYXNlZE5hbWUpIHtcbiAgICAgIC8vIFVua25vd24gYXR0cmlidXRlcyBzaG91bGQgaGF2ZSBsb3dlcmNhc2UgY2FzaW5nIHNpbmNlIHRoYXQncyBob3cgdGhleVxuICAgICAgLy8gd2lsbCBiZSBjYXNlZCBhbnl3YXkgd2l0aCBzZXJ2ZXIgcmVuZGVyaW5nLlxuICAgICAgd2FybmluZyQxKGZhbHNlLCAnUmVhY3QgZG9lcyBub3QgcmVjb2duaXplIHRoZSBgJXNgIHByb3Agb24gYSBET00gZWxlbWVudC4gSWYgeW91ICcgKyAnaW50ZW50aW9uYWxseSB3YW50IGl0IHRvIGFwcGVhciBpbiB0aGUgRE9NIGFzIGEgY3VzdG9tICcgKyAnYXR0cmlidXRlLCBzcGVsbCBpdCBhcyBsb3dlcmNhc2UgYCVzYCBpbnN0ZWFkLiAnICsgJ0lmIHlvdSBhY2NpZGVudGFsbHkgcGFzc2VkIGl0IGZyb20gYSBwYXJlbnQgY29tcG9uZW50LCByZW1vdmUgJyArICdpdCBmcm9tIHRoZSBET00gZWxlbWVudC4nLCBuYW1lLCBsb3dlckNhc2VkTmFtZSk7XG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHdhcm5pbmckMShmYWxzZSwgJ1JlY2VpdmVkIGAlc2AgZm9yIGEgbm9uLWJvb2xlYW4gYXR0cmlidXRlIGAlc2AuXFxuXFxuJyArICdJZiB5b3Ugd2FudCB0byB3cml0ZSBpdCB0byB0aGUgRE9NLCBwYXNzIGEgc3RyaW5nIGluc3RlYWQ6ICcgKyAnJXM9XCIlc1wiIG9yICVzPXt2YWx1ZS50b1N0cmluZygpfS4nLCB2YWx1ZSwgbmFtZSwgbmFtZSwgdmFsdWUsIG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybmluZyQxKGZhbHNlLCAnUmVjZWl2ZWQgYCVzYCBmb3IgYSBub24tYm9vbGVhbiBhdHRyaWJ1dGUgYCVzYC5cXG5cXG4nICsgJ0lmIHlvdSB3YW50IHRvIHdyaXRlIGl0IHRvIHRoZSBET00sIHBhc3MgYSBzdHJpbmcgaW5zdGVhZDogJyArICclcz1cIiVzXCIgb3IgJXM9e3ZhbHVlLnRvU3RyaW5nKCl9LlxcblxcbicgKyAnSWYgeW91IHVzZWQgdG8gY29uZGl0aW9uYWxseSBvbWl0IGl0IHdpdGggJXM9e2NvbmRpdGlvbiAmJiB2YWx1ZX0sICcgKyAncGFzcyAlcz17Y29uZGl0aW9uID8gdmFsdWUgOiB1bmRlZmluZWR9IGluc3RlYWQuJywgdmFsdWUsIG5hbWUsIG5hbWUsIHZhbHVlLCBuYW1lLCBuYW1lLCBuYW1lKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBOb3cgdGhhdCB3ZSd2ZSB2YWxpZGF0ZWQgY2FzaW5nLCBkbyBub3QgdmFsaWRhdGVcbiAgICAvLyBkYXRhIHR5cGVzIGZvciByZXNlcnZlZCBwcm9wc1xuICAgIGlmIChpc1Jlc2VydmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBXYXJuIHdoZW4gYSBrbm93biBhdHRyaWJ1dGUgaXMgYSBiYWQgdHlwZVxuICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gV2FybiB3aGVuIHBhc3NpbmcgdGhlIHN0cmluZ3MgJ2ZhbHNlJyBvciAndHJ1ZScgaW50byBhIGJvb2xlYW4gcHJvcFxuICAgIGlmICgodmFsdWUgPT09ICdmYWxzZScgfHwgdmFsdWUgPT09ICd0cnVlJykgJiYgcHJvcGVydHlJbmZvICE9PSBudWxsICYmIHByb3BlcnR5SW5mby50eXBlID09PSBCT09MRUFOKSB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICdSZWNlaXZlZCB0aGUgc3RyaW5nIGAlc2AgZm9yIHRoZSBib29sZWFuIGF0dHJpYnV0ZSBgJXNgLiAnICsgJyVzICcgKyAnRGlkIHlvdSBtZWFuICVzPXslc30/JywgdmFsdWUsIG5hbWUsIHZhbHVlID09PSAnZmFsc2UnID8gJ1RoZSBicm93c2VyIHdpbGwgaW50ZXJwcmV0IGl0IGFzIGEgdHJ1dGh5IHZhbHVlLicgOiAnQWx0aG91Z2ggdGhpcyB3b3JrcywgaXQgd2lsbCBub3Qgd29yayBhcyBleHBlY3RlZCBpZiB5b3UgcGFzcyB0aGUgc3RyaW5nIFwiZmFsc2VcIi4nLCBuYW1lLCB2YWx1ZSk7XG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59XG5cbnZhciB3YXJuVW5rbm93blByb3BlcnRpZXMgPSBmdW5jdGlvbiAodHlwZSwgcHJvcHMsIGNhblVzZUV2ZW50U3lzdGVtKSB7XG4gIHZhciB1bmtub3duUHJvcHMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7XG4gICAgdmFyIGlzVmFsaWQgPSB2YWxpZGF0ZVByb3BlcnR5JDEodHlwZSwga2V5LCBwcm9wc1trZXldLCBjYW5Vc2VFdmVudFN5c3RlbSk7XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICB1bmtub3duUHJvcHMucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuXG4gIHZhciB1bmtub3duUHJvcFN0cmluZyA9IHVua25vd25Qcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICByZXR1cm4gJ2AnICsgcHJvcCArICdgJztcbiAgfSkuam9pbignLCAnKTtcbiAgaWYgKHVua25vd25Qcm9wcy5sZW5ndGggPT09IDEpIHtcbiAgICB3YXJuaW5nJDEoZmFsc2UsICdJbnZhbGlkIHZhbHVlIGZvciBwcm9wICVzIG9uIDwlcz4gdGFnLiBFaXRoZXIgcmVtb3ZlIGl0IGZyb20gdGhlIGVsZW1lbnQsICcgKyAnb3IgcGFzcyBhIHN0cmluZyBvciBudW1iZXIgdmFsdWUgdG8ga2VlcCBpdCBpbiB0aGUgRE9NLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC1hdHRyaWJ1dGUtYmVoYXZpb3InLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gIH0gZWxzZSBpZiAodW5rbm93blByb3BzLmxlbmd0aCA+IDEpIHtcbiAgICB3YXJuaW5nJDEoZmFsc2UsICdJbnZhbGlkIHZhbHVlcyBmb3IgcHJvcHMgJXMgb24gPCVzPiB0YWcuIEVpdGhlciByZW1vdmUgdGhlbSBmcm9tIHRoZSBlbGVtZW50LCAnICsgJ29yIHBhc3MgYSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlIHRvIGtlZXAgdGhlbSBpbiB0aGUgRE9NLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC1hdHRyaWJ1dGUtYmVoYXZpb3InLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyQyKHR5cGUsIHByb3BzLCBjYW5Vc2VFdmVudFN5c3RlbSkge1xuICBpZiAoaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHdhcm5Vbmtub3duUHJvcGVydGllcyh0eXBlLCBwcm9wcywgY2FuVXNlRXZlbnRTeXN0ZW0pO1xufVxuXG4vLyBUT0RPOiBkaXJlY3QgaW1wb3J0cyBsaWtlIHNvbWUtcGFja2FnZS9zcmMvKiBhcmUgYmFkLiBGaXggbWUuXG52YXIgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSBmYWxzZTtcbnZhciBkaWRXYXJuU2hhZHlET00gPSBmYWxzZTtcblxudmFyIERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MID0gJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJztcbnZhciBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgPSAnc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nJztcbnZhciBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxID0gJ3N1cHByZXNzSHlkcmF0aW9uV2FybmluZyc7XG52YXIgQVVUT0ZPQ1VTID0gJ2F1dG9Gb2N1cyc7XG52YXIgQ0hJTERSRU4gPSAnY2hpbGRyZW4nO1xudmFyIFNUWUxFJDEgPSAnc3R5bGUnO1xudmFyIEhUTUwgPSAnX19odG1sJztcblxudmFyIEhUTUxfTkFNRVNQQUNFID0gTmFtZXNwYWNlcy5odG1sO1xuXG5cbnZhciB3YXJuZWRVbmtub3duVGFncyA9IHZvaWQgMDtcbnZhciBzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcgPSB2b2lkIDA7XG5cbnZhciB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50ID0gdm9pZCAwO1xudmFyIHdhcm5Gb3JUZXh0RGlmZmVyZW5jZSA9IHZvaWQgMDtcbnZhciB3YXJuRm9yUHJvcERpZmZlcmVuY2UgPSB2b2lkIDA7XG52YXIgd2FybkZvckV4dHJhQXR0cmlidXRlcyA9IHZvaWQgMDtcbnZhciB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIgPSB2b2lkIDA7XG52YXIgY2FuRGlmZlN0eWxlRm9ySHlkcmF0aW9uV2FybmluZyA9IHZvaWQgMDtcblxudmFyIG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZSA9IHZvaWQgMDtcbnZhciBub3JtYWxpemVIVE1MID0gdm9pZCAwO1xuXG57XG4gIHdhcm5lZFVua25vd25UYWdzID0ge1xuICAgIC8vIENocm9tZSBpcyB0aGUgb25seSBtYWpvciBicm93c2VyIG5vdCBzaGlwcGluZyA8dGltZT4uIEJ1dCBhcyBvZiBKdWx5XG4gICAgLy8gMjAxNyBpdCBpbnRlbmRzIHRvIHNoaXAgaXQgZHVlIHRvIHdpZGVzcHJlYWQgdXNhZ2UuIFdlIGludGVudGlvbmFsbHlcbiAgICAvLyAqZG9uJ3QqIHdhcm4gZm9yIDx0aW1lPiBldmVuIGlmIGl0J3MgdW5yZWNvZ25pemVkIGJ5IENocm9tZSBiZWNhdXNlXG4gICAgLy8gaXQgc29vbiB3aWxsIGJlLCBhbmQgbWFueSBhcHBzIGhhdmUgYmVlbiB1c2luZyBpdCBhbnl3YXkuXG4gICAgdGltZTogdHJ1ZSxcbiAgICAvLyBUaGVyZSBhcmUgd29ya2luZyBwb2x5ZmlsbHMgZm9yIDxkaWFsb2c+LiBMZXQgcGVvcGxlIHVzZSBpdC5cbiAgICBkaWFsb2c6IHRydWUsXG4gICAgLy8gRWxlY3Ryb24gc2hpcHMgYSBjdXN0b20gPHdlYnZpZXc+IHRhZyB0byBkaXNwbGF5IGV4dGVybmFsIHdlYiBjb250ZW50IGluXG4gICAgLy8gYW4gaXNvbGF0ZWQgZnJhbWUgYW5kIHByb2Nlc3MuXG4gICAgLy8gVGhpcyB0YWcgaXMgbm90IHByZXNlbnQgaW4gbm9uIEVsZWN0cm9uIGVudmlyb25tZW50cyBzdWNoIGFzIEpTRG9tIHdoaWNoXG4gICAgLy8gaXMgb2Z0ZW4gdXNlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy5cbiAgICAvLyBAc2VlIGh0dHBzOi8vZWxlY3Ryb25qcy5vcmcvZG9jcy9hcGkvd2Vidmlldy10YWdcbiAgICB3ZWJ2aWV3OiB0cnVlXG4gIH07XG5cbiAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBwcm9wcykge1xuICAgIHZhbGlkYXRlUHJvcGVydGllcyh0eXBlLCBwcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzJDEodHlwZSwgcHJvcHMpO1xuICAgIHZhbGlkYXRlUHJvcGVydGllcyQyKHR5cGUsIHByb3BzLCAvKiBjYW5Vc2VFdmVudFN5c3RlbSAqL3RydWUpO1xuICB9O1xuXG4gIC8vIElFIDExIHBhcnNlcyAmIG5vcm1hbGl6ZXMgdGhlIHN0eWxlIGF0dHJpYnV0ZSBhcyBvcHBvc2VkIHRvIG90aGVyXG4gIC8vIGJyb3dzZXJzLiBJdCBhZGRzIHNwYWNlcyBhbmQgc29ydHMgdGhlIHByb3BlcnRpZXMgaW4gc29tZVxuICAvLyBub24tYWxwaGFiZXRpY2FsIG9yZGVyLiBIYW5kbGluZyB0aGF0IHdvdWxkIHJlcXVpcmUgc29ydGluZyBDU1NcbiAgLy8gcHJvcGVydGllcyBpbiB0aGUgY2xpZW50ICYgc2VydmVyIHZlcnNpb25zIG9yIGFwcGx5aW5nXG4gIC8vIGBleHBlY3RlZFN0eWxlYCB0byBhIHRlbXBvcmFyeSBET00gbm9kZSB0byByZWFkIGl0cyBgc3R5bGVgIGF0dHJpYnV0ZVxuICAvLyBub3JtYWxpemVkLiBTaW5jZSBpdCBvbmx5IGFmZmVjdHMgSUUsIHdlJ3JlIHNraXBwaW5nIHN0eWxlIHdhcm5pbmdzXG4gIC8vIGluIHRoYXQgYnJvd3NlciBjb21wbGV0ZWx5IGluIGZhdm9yIG9mIGRvaW5nIGFsbCB0aGF0IHdvcmsuXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExODA3XG4gIGNhbkRpZmZTdHlsZUZvckh5ZHJhdGlvbldhcm5pbmcgPSBjYW5Vc2VET00gJiYgIWRvY3VtZW50LmRvY3VtZW50TW9kZTtcblxuICAvLyBIVE1MIHBhcnNpbmcgbm9ybWFsaXplcyBDUiBhbmQgQ1JMRiB0byBMRi5cbiAgLy8gSXQgYWxzbyBjYW4gdHVybiBcXHUwMDAwIGludG8gXFx1RkZGRCBpbnNpZGUgYXR0cmlidXRlcy5cbiAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3NpbmdsZS1wYWdlLmh0bWwjcHJlcHJvY2Vzc2luZy10aGUtaW5wdXQtc3RyZWFtXG4gIC8vIElmIHdlIGhhdmUgYSBtaXNtYXRjaCwgaXQgbWlnaHQgYmUgY2F1c2VkIGJ5IHRoYXQuXG4gIC8vIFdlIHdpbGwgc3RpbGwgcGF0Y2ggdXAgaW4gdGhpcyBjYXNlIGJ1dCBub3QgZmlyZSB0aGUgd2FybmluZy5cbiAgdmFyIE5PUk1BTElaRV9ORVdMSU5FU19SRUdFWCA9IC9cXHJcXG4/L2c7XG4gIHZhciBOT1JNQUxJWkVfTlVMTF9BTkRfUkVQTEFDRU1FTlRfUkVHRVggPSAvXFx1MDAwMHxcXHVGRkZEL2c7XG5cbiAgbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlID0gZnVuY3Rpb24gKG1hcmt1cCkge1xuICAgIHZhciBtYXJrdXBTdHJpbmcgPSB0eXBlb2YgbWFya3VwID09PSAnc3RyaW5nJyA/IG1hcmt1cCA6ICcnICsgbWFya3VwO1xuICAgIHJldHVybiBtYXJrdXBTdHJpbmcucmVwbGFjZShOT1JNQUxJWkVfTkVXTElORVNfUkVHRVgsICdcXG4nKS5yZXBsYWNlKE5PUk1BTElaRV9OVUxMX0FORF9SRVBMQUNFTUVOVF9SRUdFWCwgJycpO1xuICB9O1xuXG4gIHdhcm5Gb3JUZXh0RGlmZmVyZW5jZSA9IGZ1bmN0aW9uIChzZXJ2ZXJUZXh0LCBjbGllbnRUZXh0KSB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBub3JtYWxpemVkQ2xpZW50VGV4dCA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShjbGllbnRUZXh0KTtcbiAgICB2YXIgbm9ybWFsaXplZFNlcnZlclRleHQgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoc2VydmVyVGV4dCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRTZXJ2ZXJUZXh0ID09PSBub3JtYWxpemVkQ2xpZW50VGV4dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG4gICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnVGV4dCBjb250ZW50IGRpZCBub3QgbWF0Y2guIFNlcnZlcjogXCIlc1wiIENsaWVudDogXCIlc1wiJywgbm9ybWFsaXplZFNlcnZlclRleHQsIG5vcm1hbGl6ZWRDbGllbnRUZXh0KTtcbiAgfTtcblxuICB3YXJuRm9yUHJvcERpZmZlcmVuY2UgPSBmdW5jdGlvbiAocHJvcE5hbWUsIHNlcnZlclZhbHVlLCBjbGllbnRWYWx1ZSkge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbm9ybWFsaXplZENsaWVudFZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKGNsaWVudFZhbHVlKTtcbiAgICB2YXIgbm9ybWFsaXplZFNlcnZlclZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKHNlcnZlclZhbHVlKTtcbiAgICBpZiAobm9ybWFsaXplZFNlcnZlclZhbHVlID09PSBub3JtYWxpemVkQ2xpZW50VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1Byb3AgYCVzYCBkaWQgbm90IG1hdGNoLiBTZXJ2ZXI6ICVzIENsaWVudDogJXMnLCBwcm9wTmFtZSwgSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplZFNlcnZlclZhbHVlKSwgSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplZENsaWVudFZhbHVlKSk7XG4gIH07XG5cbiAgd2FybkZvckV4dHJhQXR0cmlidXRlcyA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lcykge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG4gICAgdmFyIG5hbWVzID0gW107XG4gICAgYXR0cmlidXRlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgbmFtZXMucHVzaChuYW1lKTtcbiAgICB9KTtcbiAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdFeHRyYSBhdHRyaWJ1dGVzIGZyb20gdGhlIHNlcnZlcjogJXMnLCBuYW1lcyk7XG4gIH07XG5cbiAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHJlZ2lzdHJhdGlvbk5hbWUsIGxpc3RlbmVyKSB7XG4gICAgaWYgKGxpc3RlbmVyID09PSBmYWxzZSkge1xuICAgICAgd2FybmluZyQxKGZhbHNlLCAnRXhwZWN0ZWQgYCVzYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBgZmFsc2VgLlxcblxcbicgKyAnSWYgeW91IHVzZWQgdG8gY29uZGl0aW9uYWxseSBvbWl0IGl0IHdpdGggJXM9e2NvbmRpdGlvbiAmJiB2YWx1ZX0sICcgKyAncGFzcyAlcz17Y29uZGl0aW9uID8gdmFsdWUgOiB1bmRlZmluZWR9IGluc3RlYWQuJywgcmVnaXN0cmF0aW9uTmFtZSwgcmVnaXN0cmF0aW9uTmFtZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm5pbmckMShmYWxzZSwgJ0V4cGVjdGVkIGAlc2AgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYSB2YWx1ZSBvZiBgJXNgIHR5cGUuJywgcmVnaXN0cmF0aW9uTmFtZSwgdHlwZW9mIGxpc3RlbmVyKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gUGFyc2UgdGhlIEhUTUwgYW5kIHJlYWQgaXQgYmFjayB0byBub3JtYWxpemUgdGhlIEhUTUwgc3RyaW5nIHNvIHRoYXQgaXRcbiAgLy8gY2FuIGJlIHVzZWQgZm9yIGNvbXBhcmlzb24uXG4gIG5vcm1hbGl6ZUhUTUwgPSBmdW5jdGlvbiAocGFyZW50LCBodG1sKSB7XG4gICAgLy8gV2UgY291bGQgaGF2ZSBjcmVhdGVkIGEgc2VwYXJhdGUgZG9jdW1lbnQgaGVyZSB0byBhdm9pZFxuICAgIC8vIHJlLWluaXRpYWxpemluZyBjdXN0b20gZWxlbWVudHMgaWYgdGhleSBleGlzdC4gQnV0IHRoaXMgYnJlYWtzXG4gICAgLy8gaG93IDxub3NjcmlwdD4gaXMgYmVpbmcgaGFuZGxlZC4gU28gd2UgdXNlIHRoZSBzYW1lIGRvY3VtZW50LlxuICAgIC8vIFNlZSB0aGUgZGlzY3Vzc2lvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xMTE1Ny5cbiAgICB2YXIgdGVzdEVsZW1lbnQgPSBwYXJlbnQubmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSA/IHBhcmVudC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocGFyZW50LnRhZ05hbWUpIDogcGFyZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHBhcmVudC5uYW1lc3BhY2VVUkksIHBhcmVudC50YWdOYW1lKTtcbiAgICB0ZXN0RWxlbWVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgIHJldHVybiB0ZXN0RWxlbWVudC5pbm5lckhUTUw7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGVuc3VyZUxpc3RlbmluZ1RvKHJvb3RDb250YWluZXJFbGVtZW50LCByZWdpc3RyYXRpb25OYW1lKSB7XG4gIHZhciBpc0RvY3VtZW50T3JGcmFnbWVudCA9IHJvb3RDb250YWluZXJFbGVtZW50Lm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFIHx8IHJvb3RDb250YWluZXJFbGVtZW50Lm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFO1xuICB2YXIgZG9jID0gaXNEb2N1bWVudE9yRnJhZ21lbnQgPyByb290Q29udGFpbmVyRWxlbWVudCA6IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gIGxpc3RlblRvKHJlZ2lzdHJhdGlvbk5hbWUsIGRvYyk7XG59XG5cbmZ1bmN0aW9uIGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCkge1xuICByZXR1cm4gcm9vdENvbnRhaW5lckVsZW1lbnQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyByb290Q29udGFpbmVyRWxlbWVudCA6IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChub2RlKSB7XG4gIC8vIE1vYmlsZSBTYWZhcmkgZG9lcyBub3QgZmlyZSBwcm9wZXJseSBidWJibGUgY2xpY2sgZXZlbnRzIG9uXG4gIC8vIG5vbi1pbnRlcmFjdGl2ZSBlbGVtZW50cywgd2hpY2ggbWVhbnMgZGVsZWdhdGVkIGNsaWNrIGxpc3RlbmVycyBkbyBub3RcbiAgLy8gZmlyZS4gVGhlIHdvcmthcm91bmQgZm9yIHRoaXMgYnVnIGludm9sdmVzIGF0dGFjaGluZyBhbiBlbXB0eSBjbGlja1xuICAvLyBsaXN0ZW5lciBvbiB0aGUgdGFyZ2V0IG5vZGUuXG4gIC8vIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDEwLzA5L2NsaWNrX2V2ZW50X2RlbC5odG1sXG4gIC8vIEp1c3Qgc2V0IGl0IHVzaW5nIHRoZSBvbmNsaWNrIHByb3BlcnR5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBtYW5hZ2UgYW55XG4gIC8vIGJvb2trZWVwaW5nIGZvciBpdC4gTm90IHN1cmUgaWYgd2UgbmVlZCB0byBjbGVhciBpdCB3aGVuIHRoZSBsaXN0ZW5lciBpc1xuICAvLyByZW1vdmVkLlxuICAvLyBUT0RPOiBPbmx5IGRvIHRoaXMgZm9yIHRoZSByZWxldmFudCBTYWZhcmlzIG1heWJlP1xuICBub2RlLm9uY2xpY2sgPSBub29wO1xufVxuXG5mdW5jdGlvbiBzZXRJbml0aWFsRE9NUHJvcGVydGllcyh0YWcsIGRvbUVsZW1lbnQsIHJvb3RDb250YWluZXJFbGVtZW50LCBuZXh0UHJvcHMsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGZvciAodmFyIHByb3BLZXkgaW4gbmV4dFByb3BzKSB7XG4gICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgbmV4dFByb3AgPSBuZXh0UHJvcHNbcHJvcEtleV07XG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFJDEpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKG5leHRQcm9wKSB7XG4gICAgICAgICAgLy8gRnJlZXplIHRoZSBuZXh0IHN0eWxlIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBhc3N1bWUgaXQgd29uJ3QgYmVcbiAgICAgICAgICAvLyBtdXRhdGVkLiBXZSBoYXZlIGFscmVhZHkgd2FybmVkIGZvciB0aGlzIGluIHRoZSBwYXN0LlxuICAgICAgICAgIE9iamVjdC5mcmVlemUobmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBSZWxpZXMgb24gYHVwZGF0ZVN0eWxlc0J5SURgIG5vdCBtdXRhdGluZyBgc3R5bGVVcGRhdGVzYC5cbiAgICAgIHNldFZhbHVlRm9yU3R5bGVzKGRvbUVsZW1lbnQsIG5leHRQcm9wKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICB2YXIgbmV4dEh0bWwgPSBuZXh0UHJvcCA/IG5leHRQcm9wW0hUTUxdIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKG5leHRIdG1sICE9IG51bGwpIHtcbiAgICAgICAgc2V0SW5uZXJIVE1MKGRvbUVsZW1lbnQsIG5leHRIdG1sKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBBdm9pZCBzZXR0aW5nIGluaXRpYWwgdGV4dENvbnRlbnQgd2hlbiB0aGUgdGV4dCBpcyBlbXB0eS4gSW4gSUUxMSBzZXR0aW5nXG4gICAgICAgIC8vIHRleHRDb250ZW50IG9uIGEgPHRleHRhcmVhPiB3aWxsIGNhdXNlIHRoZSBwbGFjZWhvbGRlciB0byBub3RcbiAgICAgICAgLy8gc2hvdyB3aXRoaW4gdGhlIDx0ZXh0YXJlYT4gdW50aWwgaXQgaGFzIGJlZW4gZm9jdXNlZCBhbmQgYmx1cnJlZCBhZ2Fpbi5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy82NzMxI2lzc3VlY29tbWVudC0yNTQ4NzQ1NTNcbiAgICAgICAgdmFyIGNhblNldFRleHRDb250ZW50ID0gdGFnICE9PSAndGV4dGFyZWEnIHx8IG5leHRQcm9wICE9PSAnJztcbiAgICAgICAgaWYgKGNhblNldFRleHRDb250ZW50KSB7XG4gICAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgJycgKyBuZXh0UHJvcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMSkge1xuICAgICAgLy8gTm9vcFxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQVVUT0ZPQ1VTKSB7XG4gICAgICAvLyBXZSBwb2x5ZmlsbCBpdCBzZXBhcmF0ZWx5IG9uIHRoZSBjbGllbnQgZHVyaW5nIGNvbW1pdC5cbiAgICAgIC8vIFdlIGNvdWxkIGhhdmUgZXhjbHVkZWQgaXQgaW4gdGhlIHByb3BlcnR5IGxpc3QgaW5zdGVhZCBvZlxuICAgICAgLy8gYWRkaW5nIGEgc3BlY2lhbCBjYXNlIGhlcmUsIGJ1dCB0aGVuIGl0IHdvdWxkbid0IGJlIGVtaXR0ZWRcbiAgICAgIC8vIG9uIHNlcnZlciByZW5kZXJpbmcgKGJ1dCB3ZSAqZG8qIHdhbnQgdG8gZW1pdCBpdCBpbiBTU1IpLlxuICAgIH0gZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIGlmICh0cnVlICYmIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgICAgZW5zdXJlTGlzdGVuaW5nVG8ocm9vdENvbnRhaW5lckVsZW1lbnQsIHByb3BLZXkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgc2V0VmFsdWVGb3JQcm9wZXJ0eShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCwgaXNDdXN0b21Db21wb25lbnRUYWcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVET01Qcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHdhc0N1c3RvbUNvbXBvbmVudFRhZywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgLy8gVE9ETzogSGFuZGxlIHdhc0N1c3RvbUNvbXBvbmVudFRhZ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHVwZGF0ZVBheWxvYWQubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgcHJvcEtleSA9IHVwZGF0ZVBheWxvYWRbaV07XG4gICAgdmFyIHByb3BWYWx1ZSA9IHVwZGF0ZVBheWxvYWRbaSArIDFdO1xuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSQxKSB7XG4gICAgICBzZXRWYWx1ZUZvclN0eWxlcyhkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgIHNldElubmVySFRNTChkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIHByb3BWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgcHJvcFZhbHVlLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJFbGVtZW50LCBwYXJlbnROYW1lc3BhY2UpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gdm9pZCAwO1xuXG4gIC8vIFdlIGNyZWF0ZSB0YWdzIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhlaXIgcGFyZW50IGNvbnRhaW5lciwgZXhjZXB0IEhUTUxcbiAgLy8gdGFncyBnZXQgbm8gbmFtZXNwYWNlLlxuICB2YXIgb3duZXJEb2N1bWVudCA9IGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCk7XG4gIHZhciBkb21FbGVtZW50ID0gdm9pZCAwO1xuICB2YXIgbmFtZXNwYWNlVVJJID0gcGFyZW50TmFtZXNwYWNlO1xuICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgIG5hbWVzcGFjZVVSSSA9IGdldEludHJpbnNpY05hbWVzcGFjZSh0eXBlKTtcbiAgfVxuICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgIHtcbiAgICAgIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpO1xuICAgICAgLy8gU2hvdWxkIHRoaXMgY2hlY2sgYmUgZ2F0ZWQgYnkgcGFyZW50IG5hbWVzcGFjZT8gTm90IHN1cmUgd2Ugd2FudCB0b1xuICAgICAgLy8gYWxsb3cgPFNWRz4gb3IgPG1BVEg+LlxuICAgICAgIShpc0N1c3RvbUNvbXBvbmVudFRhZyB8fCB0eXBlID09PSB0eXBlLnRvTG93ZXJDYXNlKCkpID8gd2FybmluZyQxKGZhbHNlLCAnPCVzIC8+IGlzIHVzaW5nIGluY29ycmVjdCBjYXNpbmcuICcgKyAnVXNlIFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMsICcgKyAnb3IgbG93ZXJjYXNlIGZvciBIVE1MIGVsZW1lbnRzLicsIHR5cGUpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAnc2NyaXB0Jykge1xuICAgICAgLy8gQ3JlYXRlIHRoZSBzY3JpcHQgdmlhIC5pbm5lckhUTUwgc28gaXRzIFwicGFyc2VyLWluc2VydGVkXCIgZmxhZyBpc1xuICAgICAgLy8gc2V0IHRvIHRydWUgYW5kIGl0IGRvZXMgbm90IGV4ZWN1dGVcbiAgICAgIHZhciBkaXYgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZGl2LmlubmVySFRNTCA9ICc8c2NyaXB0PjwnICsgJy9zY3JpcHQ+JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgLy8gVGhpcyBpcyBndWFyYW50ZWVkIHRvIHlpZWxkIGEgc2NyaXB0IGVsZW1lbnQuXG4gICAgICB2YXIgZmlyc3RDaGlsZCA9IGRpdi5maXJzdENoaWxkO1xuICAgICAgZG9tRWxlbWVudCA9IGRpdi5yZW1vdmVDaGlsZChmaXJzdENoaWxkKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9wcy5pcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vICRGbG93SXNzdWUgYGNyZWF0ZUVsZW1lbnRgIHNob3VsZCBiZSB1cGRhdGVkIGZvciBXZWIgQ29tcG9uZW50c1xuICAgICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlLCB7IGlzOiBwcm9wcy5pcyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2VwYXJhdGUgZWxzZSBicmFuY2ggaW5zdGVhZCBvZiB1c2luZyBgcHJvcHMuaXMgfHwgdW5kZWZpbmVkYCBhYm92ZSBiZWNhdXNlIG9mIGEgRmlyZWZveCBidWcuXG4gICAgICAvLyBTZWUgZGlzY3Vzc2lvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC82ODk2XG4gICAgICAvLyBhbmQgZGlzY3Vzc2lvbiBpbiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjc2MjQwXG4gICAgICBkb21FbGVtZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUpO1xuICAgICAgLy8gTm9ybWFsbHkgYXR0cmlidXRlcyBhcmUgYXNzaWduZWQgaW4gYHNldEluaXRpYWxET01Qcm9wZXJ0aWVzYCwgaG93ZXZlciB0aGUgYG11bHRpcGxlYCBhbmQgYHNpemVgXG4gICAgICAvLyBhdHRyaWJ1dGVzIG9uIGBzZWxlY3RgcyBuZWVkcyB0byBiZSBhZGRlZCBiZWZvcmUgYG9wdGlvbmBzIGFyZSBpbnNlcnRlZC5cbiAgICAgIC8vIFRoaXMgcHJldmVudHM6XG4gICAgICAvLyAtIGEgYnVnIHdoZXJlIHRoZSBgc2VsZWN0YCBkb2VzIG5vdCBzY3JvbGwgdG8gdGhlIGNvcnJlY3Qgb3B0aW9uIGJlY2F1c2Ugc2luZ3VsYXJcbiAgICAgIC8vICBgc2VsZWN0YCBlbGVtZW50cyBhdXRvbWF0aWNhbGx5IHBpY2sgdGhlIGZpcnN0IGl0ZW0gIzEzMjIyXG4gICAgICAvLyAtIGEgYnVnIHdoZXJlIHRoZSBgc2VsZWN0YCBzZXQgdGhlIGZpcnN0IGl0ZW0gYXMgc2VsZWN0ZWQgZGVzcGl0ZSB0aGUgYHNpemVgIGF0dHJpYnV0ZSAjMTQyMzlcbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzMjIyXG4gICAgICAvLyBhbmQgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNDIzOVxuICAgICAgaWYgKHR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgIHZhciBub2RlID0gZG9tRWxlbWVudDtcbiAgICAgICAgaWYgKHByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgICAgbm9kZS5tdWx0aXBsZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvcHMuc2l6ZSkge1xuICAgICAgICAgIC8vIFNldHRpbmcgYSBzaXplIGdyZWF0ZXIgdGhhbiAxIGNhdXNlcyBhIHNlbGVjdCB0byBiZWhhdmUgbGlrZSBgbXVsdGlwbGU9dHJ1ZWAsIHdoZXJlXG4gICAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgdGhhdCBubyBvcHRpb24gaXMgc2VsZWN0ZWQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gYSBzZWxlY3QgaW4gXCJzaW5nbGUgc2VsZWN0aW9uIG1vZGVcIi5cbiAgICAgICAgICBub2RlLnNpemUgPSBwcm9wcy5zaXplO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRvbUVsZW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIHR5cGUpO1xuICB9XG5cbiAge1xuICAgIGlmIChuYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICBpZiAoIWlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkb21FbGVtZW50KSA9PT0gJ1tvYmplY3QgSFRNTFVua25vd25FbGVtZW50XScgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRVbmtub3duVGFncywgdHlwZSkpIHtcbiAgICAgICAgd2FybmVkVW5rbm93blRhZ3NbdHlwZV0gPSB0cnVlO1xuICAgICAgICB3YXJuaW5nJDEoZmFsc2UsICdUaGUgdGFnIDwlcz4gaXMgdW5yZWNvZ25pemVkIGluIHRoaXMgYnJvd3Nlci4gJyArICdJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgUmVhY3QgY29tcG9uZW50LCBzdGFydCBpdHMgbmFtZSB3aXRoICcgKyAnYW4gdXBwZXJjYXNlIGxldHRlci4nLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZG9tRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVGV4dE5vZGUodGV4dCwgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCkuY3JlYXRlVGV4dE5vZGUodGV4dCk7XG59XG5cbmZ1bmN0aW9uIHNldEluaXRpYWxQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgcmF3UHJvcHMsIHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgcmF3UHJvcHMpO1xuICB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0YWcsIHJhd1Byb3BzKTtcbiAgICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcgJiYgIWRpZFdhcm5TaGFkeURPTSAmJiBkb21FbGVtZW50LnNoYWR5Um9vdCkge1xuICAgICAgd2FybmluZyQxKGZhbHNlLCAnJXMgaXMgdXNpbmcgc2hhZHkgRE9NLiBVc2luZyBzaGFkeSBET00gd2l0aCBSZWFjdCBjYW4gJyArICdjYXVzZSB0aGluZ3MgdG8gYnJlYWsgc3VidGx5LicsIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkgfHwgJ0EgY29tcG9uZW50Jyk7XG4gICAgICBkaWRXYXJuU2hhZHlET00gPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE86IE1ha2Ugc3VyZSB0aGF0IHdlIGNoZWNrIGlzTW91bnRlZCBiZWZvcmUgZmlyaW5nIGFueSBvZiB0aGVzZSBldmVudHMuXG4gIHZhciBwcm9wcyA9IHZvaWQgMDtcbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICB0cmFwQnViYmxlZEV2ZW50KFRPUF9MT0FELCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd2aWRlbyc6XG4gICAgY2FzZSAnYXVkaW8nOlxuICAgICAgLy8gQ3JlYXRlIGxpc3RlbmVyIGZvciBlYWNoIG1lZGlhIGV2ZW50XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1lZGlhRXZlbnRUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0cmFwQnViYmxlZEV2ZW50KG1lZGlhRXZlbnRUeXBlc1tpXSwgZG9tRWxlbWVudCk7XG4gICAgICB9XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc291cmNlJzpcbiAgICAgIHRyYXBCdWJibGVkRXZlbnQoVE9QX0VSUk9SLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdpbWcnOlxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIHRyYXBCdWJibGVkRXZlbnQoVE9QX0VSUk9SLCBkb21FbGVtZW50KTtcbiAgICAgIHRyYXBCdWJibGVkRXZlbnQoVE9QX0xPQUQsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Zvcm0nOlxuICAgICAgdHJhcEJ1YmJsZWRFdmVudChUT1BfUkVTRVQsIGRvbUVsZW1lbnQpO1xuICAgICAgdHJhcEJ1YmJsZWRFdmVudChUT1BfU1VCTUlULCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdkZXRhaWxzJzpcbiAgICAgIHRyYXBCdWJibGVkRXZlbnQoVE9QX1RPR0dMRSwgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICB0cmFwQnViYmxlZEV2ZW50KFRPUF9JTlZBTElELCBkb21FbGVtZW50KTtcbiAgICAgIC8vIEZvciBjb250cm9sbGVkIGNvbXBvbmVudHMgd2UgYWx3YXlzIG5lZWQgdG8gZW5zdXJlIHdlJ3JlIGxpc3RlbmluZ1xuICAgICAgLy8gdG8gb25DaGFuZ2UuIEV2ZW4gaWYgdGhlcmUgaXMgbm8gbGlzdGVuZXIuXG4gICAgICBlbnN1cmVMaXN0ZW5pbmdUbyhyb290Q29udGFpbmVyRWxlbWVudCwgJ29uQ2hhbmdlJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgdmFsaWRhdGVQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMkMihkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICB0cmFwQnViYmxlZEV2ZW50KFRPUF9JTlZBTElELCBkb21FbGVtZW50KTtcbiAgICAgIC8vIEZvciBjb250cm9sbGVkIGNvbXBvbmVudHMgd2UgYWx3YXlzIG5lZWQgdG8gZW5zdXJlIHdlJ3JlIGxpc3RlbmluZ1xuICAgICAgLy8gdG8gb25DaGFuZ2UuIEV2ZW4gaWYgdGhlcmUgaXMgbm8gbGlzdGVuZXIuXG4gICAgICBlbnN1cmVMaXN0ZW5pbmdUbyhyb290Q29udGFpbmVyRWxlbWVudCwgJ29uQ2hhbmdlJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMkMyhkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICB0cmFwQnViYmxlZEV2ZW50KFRPUF9JTlZBTElELCBkb21FbGVtZW50KTtcbiAgICAgIC8vIEZvciBjb250cm9sbGVkIGNvbXBvbmVudHMgd2UgYWx3YXlzIG5lZWQgdG8gZW5zdXJlIHdlJ3JlIGxpc3RlbmluZ1xuICAgICAgLy8gdG8gb25DaGFuZ2UuIEV2ZW4gaWYgdGhlcmUgaXMgbm8gbGlzdGVuZXIuXG4gICAgICBlbnN1cmVMaXN0ZW5pbmdUbyhyb290Q29udGFpbmVyRWxlbWVudCwgJ29uQ2hhbmdlJyk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgfVxuXG4gIGFzc2VydFZhbGlkUHJvcHModGFnLCBwcm9wcyk7XG5cbiAgc2V0SW5pdGlhbERPTVByb3BlcnRpZXModGFnLCBkb21FbGVtZW50LCByb290Q29udGFpbmVyRWxlbWVudCwgcHJvcHMsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIoZG9tRWxlbWVudCwgcmF3UHJvcHMsIGZhbHNlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMyhkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgcG9zdE1vdW50V3JhcHBlciQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbi8vIENhbGN1bGF0ZSB0aGUgZGlmZiBiZXR3ZWVuIHRoZSB0d28gb2JqZWN0cy5cbmZ1bmN0aW9uIGRpZmZQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgbGFzdFJhd1Byb3BzLCBuZXh0UmF3UHJvcHMsIHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50KHRhZywgbmV4dFJhd1Byb3BzKTtcbiAgfVxuXG4gIHZhciB1cGRhdGVQYXlsb2FkID0gbnVsbDtcblxuICB2YXIgbGFzdFByb3BzID0gdm9pZCAwO1xuICB2YXIgbmV4dFByb3BzID0gdm9pZCAwO1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCBsYXN0UmF3UHJvcHMpO1xuICAgICAgbmV4dFByb3BzID0gZ2V0SG9zdFByb3BzKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzJDEoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTtcbiAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyQxKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzJDIoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTtcbiAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyQyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBsYXN0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMyhkb21FbGVtZW50LCBsYXN0UmF3UHJvcHMpO1xuICAgICAgbmV4dFByb3BzID0gZ2V0SG9zdFByb3BzJDMoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBsYXN0UHJvcHMgPSBsYXN0UmF3UHJvcHM7XG4gICAgICBuZXh0UHJvcHMgPSBuZXh0UmF3UHJvcHM7XG4gICAgICBpZiAodHlwZW9mIGxhc3RQcm9wcy5vbkNsaWNrICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBuZXh0UHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIG5leHRQcm9wcyk7XG5cbiAgdmFyIHByb3BLZXkgPSB2b2lkIDA7XG4gIHZhciBzdHlsZU5hbWUgPSB2b2lkIDA7XG4gIHZhciBzdHlsZVVwZGF0ZXMgPSBudWxsO1xuICBmb3IgKHByb3BLZXkgaW4gbGFzdFByb3BzKSB7XG4gICAgaWYgKG5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCAhbGFzdFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8IGxhc3RQcm9wc1twcm9wS2V5XSA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFJDEpIHtcbiAgICAgIHZhciBsYXN0U3R5bGUgPSBsYXN0UHJvcHNbcHJvcEtleV07XG4gICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0U3R5bGUpIHtcbiAgICAgICAgaWYgKGxhc3RTdHlsZS5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCB8fCBwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgLy8gTm9vcC4gVGhpcyBpcyBoYW5kbGVkIGJ5IHRoZSBjbGVhciB0ZXh0IG1lY2hhbmlzbS5cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxKSB7XG4gICAgICAvLyBOb29wXG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBBVVRPRk9DVVMpIHtcbiAgICAgIC8vIE5vb3AuIEl0IGRvZXNuJ3Qgd29yayBvbiB1cGRhdGVzIGFueXdheS5cbiAgICB9IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLiBJZiBhbnkgbGlzdGVuZXIgdXBkYXRlcyB3ZSBuZWVkIHRvIGVuc3VyZVxuICAgICAgLy8gdGhhdCB0aGUgXCJjdXJyZW50XCIgZmliZXIgcG9pbnRlciBnZXRzIHVwZGF0ZWQgc28gd2UgbmVlZCBhIGNvbW1pdFxuICAgICAgLy8gdG8gdXBkYXRlIHRoaXMgZWxlbWVudC5cbiAgICAgIGlmICghdXBkYXRlUGF5bG9hZCkge1xuICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBhbGwgb3RoZXIgZGVsZXRlZCBwcm9wZXJ0aWVzIHdlIGFkZCBpdCB0byB0aGUgcXVldWUuIFdlIHVzZVxuICAgICAgLy8gdGhlIHdoaXRlbGlzdCBpbiB0aGUgY29tbWl0IHBoYXNlIGluc3RlYWQuXG4gICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgbnVsbCk7XG4gICAgfVxuICB9XG4gIGZvciAocHJvcEtleSBpbiBuZXh0UHJvcHMpIHtcbiAgICB2YXIgbmV4dFByb3AgPSBuZXh0UHJvcHNbcHJvcEtleV07XG4gICAgdmFyIGxhc3RQcm9wID0gbGFzdFByb3BzICE9IG51bGwgPyBsYXN0UHJvcHNbcHJvcEtleV0gOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbmV4dFByb3AgPT09IGxhc3RQcm9wIHx8IG5leHRQcm9wID09IG51bGwgJiYgbGFzdFByb3AgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSQxKSB7XG4gICAgICB7XG4gICAgICAgIGlmIChuZXh0UHJvcCkge1xuICAgICAgICAgIC8vIEZyZWV6ZSB0aGUgbmV4dCBzdHlsZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gYXNzdW1lIGl0IHdvbid0IGJlXG4gICAgICAgICAgLy8gbXV0YXRlZC4gV2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBmb3IgdGhpcyBpbiB0aGUgcGFzdC5cbiAgICAgICAgICBPYmplY3QuZnJlZXplKG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxhc3RQcm9wKSB7XG4gICAgICAgIC8vIFVuc2V0IHN0eWxlcyBvbiBgbGFzdFByb3BgIGJ1dCBub3Qgb24gYG5leHRQcm9wYC5cbiAgICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbGFzdFByb3ApIHtcbiAgICAgICAgICBpZiAobGFzdFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSAmJiAoIW5leHRQcm9wIHx8ICFuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSkge1xuICAgICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgc3R5bGVzIHRoYXQgY2hhbmdlZCBzaW5jZSBgbGFzdFByb3BgLlxuICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBuZXh0UHJvcCkge1xuICAgICAgICAgIGlmIChuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmIGxhc3RQcm9wW3N0eWxlTmFtZV0gIT09IG5leHRQcm9wW3N0eWxlTmFtZV0pIHtcbiAgICAgICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSBuZXh0UHJvcFtzdHlsZU5hbWVdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVsaWVzIG9uIGB1cGRhdGVTdHlsZXNCeUlEYCBub3QgbXV0YXRpbmcgYHN0eWxlVXBkYXRlc2AuXG4gICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgaWYgKCF1cGRhdGVQYXlsb2FkKSB7XG4gICAgICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQucHVzaChwcm9wS2V5LCBzdHlsZVVwZGF0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHN0eWxlVXBkYXRlcyA9IG5leHRQcm9wO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTF0gOiB1bmRlZmluZWQ7XG4gICAgICB2YXIgbGFzdEh0bWwgPSBsYXN0UHJvcCA/IGxhc3RQcm9wW0hUTUxdIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKG5leHRIdG1sICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGxhc3RIdG1sICE9PSBuZXh0SHRtbCkge1xuICAgICAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCAnJyArIG5leHRIdG1sKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogSXQgbWlnaHQgYmUgdG9vIGxhdGUgdG8gY2xlYXIgdGhpcyBpZiB3ZSBoYXZlIGNoaWxkcmVuXG4gICAgICAgIC8vIGluc2VydGVkIGFscmVhZHkuXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgaWYgKGxhc3RQcm9wICE9PSBuZXh0UHJvcCAmJiAodHlwZW9mIG5leHRQcm9wID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV4dFByb3AgPT09ICdudW1iZXInKSkge1xuICAgICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgJycgKyBuZXh0UHJvcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMSkge1xuICAgICAgLy8gTm9vcFxuICAgIH0gZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIC8vIFdlIGVhZ2VybHkgbGlzdGVuIHRvIHRoaXMgZXZlbiB0aG91Z2ggd2UgaGF2ZW4ndCBjb21taXR0ZWQgeWV0LlxuICAgICAgICBpZiAodHJ1ZSAmJiB0eXBlb2YgbmV4dFByb3AgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIocHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICAgIGVuc3VyZUxpc3RlbmluZ1RvKHJvb3RDb250YWluZXJFbGVtZW50LCBwcm9wS2V5KTtcbiAgICAgIH1cbiAgICAgIGlmICghdXBkYXRlUGF5bG9hZCAmJiBsYXN0UHJvcCAhPT0gbmV4dFByb3ApIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZS4gSWYgYW55IGxpc3RlbmVyIHVwZGF0ZXMgd2UgbmVlZCB0byBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCB0aGUgXCJjdXJyZW50XCIgcHJvcHMgcG9pbnRlciBnZXRzIHVwZGF0ZWQgc28gd2UgbmVlZCBhIGNvbW1pdFxuICAgICAgICAvLyB0byB1cGRhdGUgdGhpcyBlbGVtZW50LlxuICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBhbnkgb3RoZXIgcHJvcGVydHkgd2UgYWx3YXlzIGFkZCBpdCB0byB0aGUgcXVldWUgYW5kIHRoZW4gd2VcbiAgICAgIC8vIGZpbHRlciBpdCBvdXQgdXNpbmcgdGhlIHdoaXRlbGlzdCBkdXJpbmcgdGhlIGNvbW1pdC5cbiAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgfVxuICB9XG4gIGlmIChzdHlsZVVwZGF0ZXMpIHtcbiAgICB7XG4gICAgICB2YWxpZGF0ZVNob3J0aGFuZFByb3BlcnR5Q29sbGlzaW9uSW5EZXYoc3R5bGVVcGRhdGVzLCBuZXh0UHJvcHNbU1RZTEUkMV0pO1xuICAgIH1cbiAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2goU1RZTEUkMSwgc3R5bGVVcGRhdGVzKTtcbiAgfVxuICByZXR1cm4gdXBkYXRlUGF5bG9hZDtcbn1cblxuLy8gQXBwbHkgdGhlIGRpZmYuXG5mdW5jdGlvbiB1cGRhdGVQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHRhZywgbGFzdFJhd1Byb3BzLCBuZXh0UmF3UHJvcHMpIHtcbiAgLy8gVXBkYXRlIGNoZWNrZWQgKmJlZm9yZSogbmFtZS5cbiAgLy8gSW4gdGhlIG1pZGRsZSBvZiBhbiB1cGRhdGUsIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgY2hlY2tlZC5cbiAgLy8gV2hlbiBhIGNoZWNrZWQgcmFkaW8gdHJpZXMgdG8gY2hhbmdlIG5hbWUsIGJyb3dzZXIgbWFrZXMgYW5vdGhlciByYWRpbydzIGNoZWNrZWQgZmFsc2UuXG4gIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgbmV4dFJhd1Byb3BzLnR5cGUgPT09ICdyYWRpbycgJiYgbmV4dFJhd1Byb3BzLm5hbWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZUNoZWNrZWQoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgfVxuXG4gIHZhciB3YXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIGxhc3RSYXdQcm9wcyk7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgbmV4dFJhd1Byb3BzKTtcbiAgLy8gQXBwbHkgdGhlIGRpZmYuXG4gIHVwZGF0ZURPTVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgd2FzQ3VzdG9tQ29tcG9uZW50VGFnLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7XG5cbiAgLy8gVE9ETzogRW5zdXJlIHRoYXQgYW4gdXBkYXRlIGdldHMgc2NoZWR1bGVkIGlmIGFueSBvZiB0aGUgc3BlY2lhbCBwcm9wc1xuICAvLyBjaGFuZ2VkLlxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFVwZGF0ZSB0aGUgd3JhcHBlciBhcm91bmQgaW5wdXRzICphZnRlciogdXBkYXRpbmcgcHJvcHMuIFRoaXMgaGFzIHRvXG4gICAgICAvLyBoYXBwZW4gYWZ0ZXIgYHVwZGF0ZURPTVByb3BlcnRpZXNgLiBPdGhlcndpc2UgSFRNTDUgaW5wdXQgdmFsaWRhdGlvbnNcbiAgICAgIC8vIHJhaXNlIHdhcm5pbmdzIGFuZCBwcmV2ZW50IHRoZSBuZXcgdmFsdWUgZnJvbSBiZWluZyBhc3NpZ25lZC5cbiAgICAgIHVwZGF0ZVdyYXBwZXIoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIHVwZGF0ZVdyYXBwZXIkMShkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIC8vIDxzZWxlY3Q+IHZhbHVlIHVwZGF0ZSBuZWVkcyB0byBvY2N1ciBhZnRlciA8b3B0aW9uPiBjaGlsZHJlblxuICAgICAgLy8gcmVjb25jaWxpYXRpb25cbiAgICAgIHBvc3RVcGRhdGVXcmFwcGVyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZShwcm9wTmFtZSkge1xuICB7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gcHJvcE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIXBvc3NpYmxlU3RhbmRhcmROYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gcG9zc2libGVTdGFuZGFyZE5hbWVzW2xvd2VyQ2FzZWROYW1lXSB8fCBudWxsO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgcmF3UHJvcHMsIHBhcmVudE5hbWVzcGFjZSwgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gdm9pZCAwO1xuICB2YXIgZXh0cmFBdHRyaWJ1dGVOYW1lcyA9IHZvaWQgMDtcblxuICB7XG4gICAgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nID0gcmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMV0gPT09IHRydWU7XG4gICAgaXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIHJhd1Byb3BzKTtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50KHRhZywgcmF3UHJvcHMpO1xuICAgIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZyAmJiAhZGlkV2FyblNoYWR5RE9NICYmIGRvbUVsZW1lbnQuc2hhZHlSb290KSB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICclcyBpcyB1c2luZyBzaGFkeSBET00uIFVzaW5nIHNoYWR5IERPTSB3aXRoIFJlYWN0IGNhbiAnICsgJ2NhdXNlIHRoaW5ncyB0byBicmVhayBzdWJ0bHkuJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnKTtcbiAgICAgIGRpZFdhcm5TaGFkeURPTSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETzogTWFrZSBzdXJlIHRoYXQgd2UgY2hlY2sgaXNNb3VudGVkIGJlZm9yZSBmaXJpbmcgYW55IG9mIHRoZXNlIGV2ZW50cy5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICB0cmFwQnViYmxlZEV2ZW50KFRPUF9MT0FELCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICBjYXNlICdhdWRpbyc6XG4gICAgICAvLyBDcmVhdGUgbGlzdGVuZXIgZm9yIGVhY2ggbWVkaWEgZXZlbnRcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVkaWFFdmVudFR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRyYXBCdWJibGVkRXZlbnQobWVkaWFFdmVudFR5cGVzW2ldLCBkb21FbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NvdXJjZSc6XG4gICAgICB0cmFwQnViYmxlZEV2ZW50KFRPUF9FUlJPUiwgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdpbWcnOlxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIHRyYXBCdWJibGVkRXZlbnQoVE9QX0VSUk9SLCBkb21FbGVtZW50KTtcbiAgICAgIHRyYXBCdWJibGVkRXZlbnQoVE9QX0xPQUQsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZm9ybSc6XG4gICAgICB0cmFwQnViYmxlZEV2ZW50KFRPUF9SRVNFVCwgZG9tRWxlbWVudCk7XG4gICAgICB0cmFwQnViYmxlZEV2ZW50KFRPUF9TVUJNSVQsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICB0cmFwQnViYmxlZEV2ZW50KFRPUF9UT0dHTEUsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICB0cmFwQnViYmxlZEV2ZW50KFRPUF9JTlZBTElELCBkb21FbGVtZW50KTtcbiAgICAgIC8vIEZvciBjb250cm9sbGVkIGNvbXBvbmVudHMgd2UgYWx3YXlzIG5lZWQgdG8gZW5zdXJlIHdlJ3JlIGxpc3RlbmluZ1xuICAgICAgLy8gdG8gb25DaGFuZ2UuIEV2ZW4gaWYgdGhlcmUgaXMgbm8gbGlzdGVuZXIuXG4gICAgICBlbnN1cmVMaXN0ZW5pbmdUbyhyb290Q29udGFpbmVyRWxlbWVudCwgJ29uQ2hhbmdlJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgdmFsaWRhdGVQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHRyYXBCdWJibGVkRXZlbnQoVE9QX0lOVkFMSUQsIGRvbUVsZW1lbnQpO1xuICAgICAgLy8gRm9yIGNvbnRyb2xsZWQgY29tcG9uZW50cyB3ZSBhbHdheXMgbmVlZCB0byBlbnN1cmUgd2UncmUgbGlzdGVuaW5nXG4gICAgICAvLyB0byBvbkNoYW5nZS4gRXZlbiBpZiB0aGVyZSBpcyBubyBsaXN0ZW5lci5cbiAgICAgIGVuc3VyZUxpc3RlbmluZ1RvKHJvb3RDb250YWluZXJFbGVtZW50LCAnb25DaGFuZ2UnKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMihkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICB0cmFwQnViYmxlZEV2ZW50KFRPUF9JTlZBTElELCBkb21FbGVtZW50KTtcbiAgICAgIC8vIEZvciBjb250cm9sbGVkIGNvbXBvbmVudHMgd2UgYWx3YXlzIG5lZWQgdG8gZW5zdXJlIHdlJ3JlIGxpc3RlbmluZ1xuICAgICAgLy8gdG8gb25DaGFuZ2UuIEV2ZW4gaWYgdGhlcmUgaXMgbm8gbGlzdGVuZXIuXG4gICAgICBlbnN1cmVMaXN0ZW5pbmdUbyhyb290Q29udGFpbmVyRWxlbWVudCwgJ29uQ2hhbmdlJyk7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIGFzc2VydFZhbGlkUHJvcHModGFnLCByYXdQcm9wcyk7XG5cbiAge1xuICAgIGV4dHJhQXR0cmlidXRlTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgdmFyIGF0dHJpYnV0ZXMgPSBkb21FbGVtZW50LmF0dHJpYnV0ZXM7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IGF0dHJpYnV0ZXNbX2ldLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAvLyBCdWlsdC1pbiBTU1IgYXR0cmlidXRlIGlzIHdoaXRlbGlzdGVkXG4gICAgICAgIGNhc2UgJ2RhdGEtcmVhY3Ryb290JzpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gQ29udHJvbGxlZCBhdHRyaWJ1dGVzIGFyZSBub3QgdmFsaWRhdGVkXG4gICAgICAgIC8vIFRPRE86IE9ubHkgaWdub3JlIHRoZW0gb24gY29udHJvbGxlZCB0YWdzLlxuICAgICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2NoZWNrZWQnOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzZWxlY3RlZCc6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gSW50ZW50aW9uYWxseSB1c2UgdGhlIG9yaWdpbmFsIG5hbWUuXG4gICAgICAgICAgLy8gU2VlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTA2NzYuXG4gICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5hZGQoYXR0cmlidXRlc1tfaV0ubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBudWxsO1xuICBmb3IgKHZhciBwcm9wS2V5IGluIHJhd1Byb3BzKSB7XG4gICAgaWYgKCFyYXdQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBuZXh0UHJvcCA9IHJhd1Byb3BzW3Byb3BLZXldO1xuICAgIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgLy8gRm9yIHRleHQgY29udGVudCBjaGlsZHJlbiB3ZSBjb21wYXJlIGFnYWluc3QgdGV4dENvbnRlbnQuIFRoaXNcbiAgICAgIC8vIG1pZ2h0IG1hdGNoIGFkZGl0aW9uYWwgSFRNTCB0aGF0IGlzIGhpZGRlbiB3aGVuIHdlIHJlYWQgaXQgdXNpbmdcbiAgICAgIC8vIHRleHRDb250ZW50LiBFLmcuIFwiZm9vXCIgd2lsbCBtYXRjaCBcImY8c3Bhbj5vbzwvc3Bhbj5cIiBidXQgdGhhdCBzdGlsbFxuICAgICAgLy8gc2F0aXNmaWVzIG91ciByZXF1aXJlbWVudC4gT3VyIHJlcXVpcmVtZW50IGlzIG5vdCB0byBwcm9kdWNlIHBlcmZlY3RcbiAgICAgIC8vIEhUTUwgYW5kIGF0dHJpYnV0ZXMuIElkZWFsbHkgd2Ugc2hvdWxkIHByZXNlcnZlIHN0cnVjdHVyZSBidXQgaXQnc1xuICAgICAgLy8gb2sgbm90IHRvIGlmIHRoZSB2aXNpYmxlIGNvbnRlbnQgaXMgc3RpbGwgZW5vdWdoIHRvIGluZGljYXRlIHdoYXRcbiAgICAgIC8vIGV2ZW4gbGlzdGVuZXJzIHRoZXNlIG5vZGVzIG1pZ2h0IGJlIHdpcmVkIHVwIHRvLlxuICAgICAgLy8gVE9ETzogV2FybiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gYSBzaW5nbGUgdGV4dE5vZGUgYXMgYSBjaGlsZC5cbiAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSB1c2UgZG9tRWxlbWVudC5maXJzdENoaWxkLm5vZGVWYWx1ZSB0byBjb21wYXJlP1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQudGV4dENvbnRlbnQgIT09IG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKHRydWUgJiYgIXN1cHByZXNzSHlkcmF0aW9uV2FybmluZykge1xuICAgICAgICAgICAgd2FybkZvclRleHREaWZmZXJlbmNlKGRvbUVsZW1lbnQudGV4dENvbnRlbnQsIG5leHRQcm9wKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtDSElMRFJFTiwgbmV4dFByb3BdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQudGV4dENvbnRlbnQgIT09ICcnICsgbmV4dFByb3ApIHtcbiAgICAgICAgICBpZiAodHJ1ZSAmJiAhc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nKSB7XG4gICAgICAgICAgICB3YXJuRm9yVGV4dERpZmZlcmVuY2UoZG9tRWxlbWVudC50ZXh0Q29udGVudCwgbmV4dFByb3ApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1cGRhdGVQYXlsb2FkID0gW0NISUxEUkVOLCAnJyArIG5leHRQcm9wXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIGlmICh0cnVlICYmIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgICAgZW5zdXJlTGlzdGVuaW5nVG8ocm9vdENvbnRhaW5lckVsZW1lbnQsIHByb3BLZXkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHJ1ZSAmJlxuICAgIC8vIENvbnZpbmNlIEZsb3cgd2UndmUgY2FsY3VsYXRlZCBpdCAoaXQncyBERVYtb25seSBpbiB0aGlzIG1ldGhvZC4pXG4gICAgdHlwZW9mIGlzQ3VzdG9tQ29tcG9uZW50VGFnID09PSAnYm9vbGVhbicpIHtcbiAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIHByb3BlcnRpZXMgY29ycmVzcG9uZCB0byB0aGVpciBleHBlY3RlZCB2YWx1ZXMuXG4gICAgICB2YXIgc2VydmVyVmFsdWUgPSB2b2lkIDA7XG4gICAgICB2YXIgcHJvcGVydHlJbmZvID0gZ2V0UHJvcGVydHlJbmZvKHByb3BLZXkpO1xuICAgICAgaWYgKHN1cHByZXNzSHlkcmF0aW9uV2FybmluZykge1xuICAgICAgICAvLyBEb24ndCBib3RoZXIgY29tcGFyaW5nLiBXZSdyZSBpZ25vcmluZyBhbGwgdGhlc2Ugd2FybmluZ3MuXG4gICAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxIHx8XG4gICAgICAvLyBDb250cm9sbGVkIGF0dHJpYnV0ZXMgYXJlIG5vdCB2YWxpZGF0ZWRcbiAgICAgIC8vIFRPRE86IE9ubHkgaWdub3JlIHRoZW0gb24gY29udHJvbGxlZCB0YWdzLlxuICAgICAgcHJvcEtleSA9PT0gJ3ZhbHVlJyB8fCBwcm9wS2V5ID09PSAnY2hlY2tlZCcgfHwgcHJvcEtleSA9PT0gJ3NlbGVjdGVkJykge1xuICAgICAgICAvLyBOb29wXG4gICAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICAgIHZhciBzZXJ2ZXJIVE1MID0gZG9tRWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTF0gOiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBleHBlY3RlZEhUTUwgPSBub3JtYWxpemVIVE1MKGRvbUVsZW1lbnQsIG5leHRIdG1sICE9IG51bGwgPyBuZXh0SHRtbCA6ICcnKTtcbiAgICAgICAgaWYgKGV4cGVjdGVkSFRNTCAhPT0gc2VydmVySFRNTCkge1xuICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJIVE1MLCBleHBlY3RlZEhUTUwpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IFNUWUxFJDEpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5KTtcblxuICAgICAgICBpZiAoY2FuRGlmZlN0eWxlRm9ySHlkcmF0aW9uV2FybmluZykge1xuICAgICAgICAgIHZhciBleHBlY3RlZFN0eWxlID0gY3JlYXRlRGFuZ2Vyb3VzU3RyaW5nRm9yU3R5bGVzKG5leHRQcm9wKTtcbiAgICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGRvbUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgICAgIGlmIChleHBlY3RlZFN0eWxlICE9PSBzZXJ2ZXJWYWx1ZSkge1xuICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlclZhbHVlLCBleHBlY3RlZFN0eWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGdldFZhbHVlRm9yQXR0cmlidXRlKGRvbUVsZW1lbnQsIHByb3BLZXksIG5leHRQcm9wKTtcblxuICAgICAgICBpZiAobmV4dFByb3AgIT09IHNlcnZlclZhbHVlKSB7XG4gICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlclZhbHVlLCBuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXNob3VsZElnbm9yZUF0dHJpYnV0ZShwcm9wS2V5LCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSAmJiAhc2hvdWxkUmVtb3ZlQXR0cmlidXRlKHByb3BLZXksIG5leHRQcm9wLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgICAgICB2YXIgaXNNaXNtYXRjaER1ZVRvQmFkQ2FzaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgIHNlcnZlclZhbHVlID0gZ2V0VmFsdWVGb3JQcm9wZXJ0eShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCwgcHJvcGVydHlJbmZvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgb3duTmFtZXNwYWNlID0gcGFyZW50TmFtZXNwYWNlO1xuICAgICAgICAgIGlmIChvd25OYW1lc3BhY2UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgICBvd25OYW1lc3BhY2UgPSBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodGFnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG93bk5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZShwcm9wS2V5KTtcbiAgICAgICAgICAgIGlmIChzdGFuZGFyZE5hbWUgIT09IG51bGwgJiYgc3RhbmRhcmROYW1lICE9PSBwcm9wS2V5KSB7XG4gICAgICAgICAgICAgIC8vIElmIGFuIFNWRyBwcm9wIGlzIHN1cHBsaWVkIHdpdGggYmFkIGNhc2luZywgaXQgd2lsbFxuICAgICAgICAgICAgICAvLyBiZSBzdWNjZXNzZnVsbHkgcGFyc2VkIGZyb20gSFRNTCwgYnV0IHdpbGwgcHJvZHVjZSBhIG1pc21hdGNoXG4gICAgICAgICAgICAgIC8vIChhbmQgd291bGQgYmUgaW5jb3JyZWN0bHkgcmVuZGVyZWQgb24gdGhlIGNsaWVudCkuXG4gICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHdlIGFscmVhZHkgd2FybiBhYm91dCBiYWQgY2FzaW5nIGVsc2V3aGVyZS5cbiAgICAgICAgICAgICAgLy8gU28gd2UnbGwgc2tpcCB0aGUgbWlzbGVhZGluZyBleHRyYSBtaXNtYXRjaCB3YXJuaW5nIGluIHRoaXMgY2FzZS5cbiAgICAgICAgICAgICAgaXNNaXNtYXRjaER1ZVRvQmFkQ2FzaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShzdGFuZGFyZE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlcnZlclZhbHVlID0gZ2V0VmFsdWVGb3JBdHRyaWJ1dGUoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRQcm9wICE9PSBzZXJ2ZXJWYWx1ZSAmJiAhaXNNaXNtYXRjaER1ZVRvQmFkQ2FzaW5nKSB7XG4gICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlclZhbHVlLCBuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB7XG4gICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgIGlmIChleHRyYUF0dHJpYnV0ZU5hbWVzLnNpemUgPiAwICYmICFzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcpIHtcbiAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXMoZXh0cmFBdHRyaWJ1dGVOYW1lcyk7XG4gICAgfVxuICB9XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyKGRvbUVsZW1lbnQsIHJhd1Byb3BzLCB0cnVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMyhkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAvLyBGb3IgaW5wdXQgYW5kIHRleHRhcmVhIHdlIGN1cnJlbnQgYWx3YXlzIHNldCB0aGUgdmFsdWUgcHJvcGVydHkgYXRcbiAgICAgIC8vIHBvc3QgbW91bnQgdG8gZm9yY2UgaXQgdG8gZGl2ZXJnZSBmcm9tIGF0dHJpYnV0ZXMuIEhvd2V2ZXIsIGZvclxuICAgICAgLy8gb3B0aW9uIGFuZCBzZWxlY3Qgd2UgZG9uJ3QgcXVpdGUgZG8gdGhlIHNhbWUgdGhpbmcgYW5kIHNlbGVjdFxuICAgICAgLy8gaXMgbm90IHJlc2lsaWVudCB0byB0aGUgRE9NIHN0YXRlIGNoYW5naW5nIHNvIHdlIGRvbid0IGRvIHRoYXQgaGVyZS5cbiAgICAgIC8vIFRPRE86IENvbnNpZGVyIG5vdCBkb2luZyB0aGlzIGZvciBpbnB1dCBhbmQgdGV4dGFyZWEuXG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKHR5cGVvZiByYXdQcm9wcy5vbkNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgY2FzdCBtYXkgbm90IGJlIHNvdW5kIGZvciBTVkcsIE1hdGhNTCBvciBjdXN0b20gZWxlbWVudHMuXG4gICAgICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KGRvbUVsZW1lbnQpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlUGF5bG9hZDtcbn1cblxuZnVuY3Rpb24gZGlmZkh5ZHJhdGVkVGV4dCh0ZXh0Tm9kZSwgdGV4dCkge1xuICB2YXIgaXNEaWZmZXJlbnQgPSB0ZXh0Tm9kZS5ub2RlVmFsdWUgIT09IHRleHQ7XG4gIHJldHVybiBpc0RpZmZlcmVudDtcbn1cblxuZnVuY3Rpb24gd2FybkZvclVubWF0Y2hlZFRleHQodGV4dE5vZGUsIHRleHQpIHtcbiAge1xuICAgIHdhcm5Gb3JUZXh0RGlmZmVyZW5jZSh0ZXh0Tm9kZS5ub2RlVmFsdWUsIHRleHQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50Tm9kZSwgY2hpbGQpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG4gICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnRGlkIG5vdCBleHBlY3Qgc2VydmVyIEhUTUwgdG8gY29udGFpbiBhIDwlcz4gaW4gPCVzPi4nLCBjaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Tm9kZSwgY2hpbGQpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG4gICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnRGlkIG5vdCBleHBlY3Qgc2VydmVyIEhUTUwgdG8gY29udGFpbiB0aGUgdGV4dCBub2RlIFwiJXNcIiBpbiA8JXM+LicsIGNoaWxkLm5vZGVWYWx1ZSwgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50Tm9kZSwgdGFnLCBwcm9wcykge1xuICB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcbiAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdFeHBlY3RlZCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIGEgbWF0Y2hpbmcgPCVzPiBpbiA8JXM+LicsIHRhZywgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50Tm9kZSwgdGV4dCkge1xuICB7XG4gICAgaWYgKHRleHQgPT09ICcnKSB7XG4gICAgICAvLyBXZSBleHBlY3QgdG8gaW5zZXJ0IGVtcHR5IHRleHQgbm9kZXMgc2luY2UgdGhleSdyZSBub3QgcmVwcmVzZW50ZWQgaW5cbiAgICAgIC8vIHRoZSBIVE1MLlxuICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgc3BlY2lhbCBjYXNlIGlmIHdlIGNhbiBqdXN0IGF2b2lkIGluc2VydGluZyBlbXB0eVxuICAgICAgLy8gdGV4dCBub2Rlcy5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcbiAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdFeHBlY3RlZCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIGEgbWF0Y2hpbmcgdGV4dCBub2RlIGZvciBcIiVzXCIgaW4gPCVzPi4nLCB0ZXh0LCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMShkb21FbGVtZW50LCB0YWcsIHByb3BzKSB7XG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZShkb21FbGVtZW50LCBwcm9wcyk7XG4gICAgICByZXR1cm47XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQzKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQyKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcbiAgfVxufVxuXG4vLyBUT0RPOiBkaXJlY3QgaW1wb3J0cyBsaWtlIHNvbWUtcGFja2FnZS9zcmMvKiBhcmUgYmFkLiBGaXggbWUuXG52YXIgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKCkge307XG52YXIgdXBkYXRlZEFuY2VzdG9ySW5mbyA9IGZ1bmN0aW9uICgpIHt9O1xuXG57XG4gIC8vIFRoaXMgdmFsaWRhdGlvbiBjb2RlIHdhcyB3cml0dGVuIGJhc2VkIG9uIHRoZSBIVE1MNSBwYXJzaW5nIHNwZWM6XG4gIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLXNjb3BlXG4gIC8vXG4gIC8vIE5vdGU6IHRoaXMgZG9lcyBub3QgY2F0Y2ggYWxsIGludmFsaWQgbmVzdGluZywgbm9yIGRvZXMgaXQgdHJ5IHRvIChhcyBpdCdzXG4gIC8vIG5vdCBjbGVhciB3aGF0IHByYWN0aWNhbCBiZW5lZml0IGRvaW5nIHNvIHByb3ZpZGVzKTsgaW5zdGVhZCwgd2Ugd2FybiBvbmx5XG4gIC8vIGZvciBjYXNlcyB3aGVyZSB0aGUgcGFyc2VyIHdpbGwgZ2l2ZSBhIHBhcnNlIHRyZWUgZGlmZmVyaW5nIGZyb20gd2hhdCBSZWFjdFxuICAvLyBpbnRlbmRlZC4gRm9yIGV4YW1wbGUsIDxiPjxkaXY+PC9kaXY+PC9iPiBpcyBpbnZhbGlkIGJ1dCB3ZSBkb24ndCB3YXJuXG4gIC8vIGJlY2F1c2UgaXQgc3RpbGwgcGFyc2VzIGNvcnJlY3RseTsgd2UgZG8gd2FybiBmb3Igb3RoZXIgY2FzZXMgbGlrZSBuZXN0ZWRcbiAgLy8gPHA+IHRhZ3Mgd2hlcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Vjb25kIGVsZW1lbnQgaW1wbGljaXRseSBjbG9zZXMgdGhlXG4gIC8vIGZpcnN0LCBjYXVzaW5nIGEgY29uZnVzaW5nIG1lc3MuXG5cbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjc3BlY2lhbFxuICB2YXIgc3BlY2lhbFRhZ3MgPSBbJ2FkZHJlc3MnLCAnYXBwbGV0JywgJ2FyZWEnLCAnYXJ0aWNsZScsICdhc2lkZScsICdiYXNlJywgJ2Jhc2Vmb250JywgJ2Jnc291bmQnLCAnYmxvY2txdW90ZScsICdib2R5JywgJ2JyJywgJ2J1dHRvbicsICdjYXB0aW9uJywgJ2NlbnRlcicsICdjb2wnLCAnY29sZ3JvdXAnLCAnZGQnLCAnZGV0YWlscycsICdkaXInLCAnZGl2JywgJ2RsJywgJ2R0JywgJ2VtYmVkJywgJ2ZpZWxkc2V0JywgJ2ZpZ2NhcHRpb24nLCAnZmlndXJlJywgJ2Zvb3RlcicsICdmb3JtJywgJ2ZyYW1lJywgJ2ZyYW1lc2V0JywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2JywgJ2hlYWQnLCAnaGVhZGVyJywgJ2hncm91cCcsICdocicsICdodG1sJywgJ2lmcmFtZScsICdpbWcnLCAnaW5wdXQnLCAnaXNpbmRleCcsICdsaScsICdsaW5rJywgJ2xpc3RpbmcnLCAnbWFpbicsICdtYXJxdWVlJywgJ21lbnUnLCAnbWVudWl0ZW0nLCAnbWV0YScsICduYXYnLCAnbm9lbWJlZCcsICdub2ZyYW1lcycsICdub3NjcmlwdCcsICdvYmplY3QnLCAnb2wnLCAncCcsICdwYXJhbScsICdwbGFpbnRleHQnLCAncHJlJywgJ3NjcmlwdCcsICdzZWN0aW9uJywgJ3NlbGVjdCcsICdzb3VyY2UnLCAnc3R5bGUnLCAnc3VtbWFyeScsICd0YWJsZScsICd0Ym9keScsICd0ZCcsICd0ZW1wbGF0ZScsICd0ZXh0YXJlYScsICd0Zm9vdCcsICd0aCcsICd0aGVhZCcsICd0aXRsZScsICd0cicsICd0cmFjaycsICd1bCcsICd3YnInLCAneG1wJ107XG5cbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tc2NvcGVcbiAgdmFyIGluU2NvcGVUYWdzID0gWydhcHBsZXQnLCAnY2FwdGlvbicsICdodG1sJywgJ3RhYmxlJywgJ3RkJywgJ3RoJywgJ21hcnF1ZWUnLCAnb2JqZWN0JywgJ3RlbXBsYXRlJyxcblxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNodG1sLWludGVncmF0aW9uLXBvaW50XG4gIC8vIFRPRE86IERpc3Rpbmd1aXNoIGJ5IG5hbWVzcGFjZSBoZXJlIC0tIGZvciA8dGl0bGU+LCBpbmNsdWRpbmcgaXQgaGVyZVxuICAvLyBlcnJzIG9uIHRoZSBzaWRlIG9mIGZld2VyIHdhcm5pbmdzXG4gICdmb3JlaWduT2JqZWN0JywgJ2Rlc2MnLCAndGl0bGUnXTtcblxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMtYW4tZWxlbWVudC1pbi1idXR0b24tc2NvcGVcbiAgdmFyIGJ1dHRvblNjb3BlVGFncyA9IGluU2NvcGVUYWdzLmNvbmNhdChbJ2J1dHRvbiddKTtcblxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNnZW5lcmF0ZS1pbXBsaWVkLWVuZC10YWdzXG4gIHZhciBpbXBsaWVkRW5kVGFncyA9IFsnZGQnLCAnZHQnLCAnbGknLCAnb3B0aW9uJywgJ29wdGdyb3VwJywgJ3AnLCAncnAnLCAncnQnXTtcblxuICB2YXIgZW1wdHlBbmNlc3RvckluZm8gPSB7XG4gICAgY3VycmVudDogbnVsbCxcblxuICAgIGZvcm1UYWc6IG51bGwsXG4gICAgYVRhZ0luU2NvcGU6IG51bGwsXG4gICAgYnV0dG9uVGFnSW5TY29wZTogbnVsbCxcbiAgICBub2JyVGFnSW5TY29wZTogbnVsbCxcbiAgICBwVGFnSW5CdXR0b25TY29wZTogbnVsbCxcblxuICAgIGxpc3RJdGVtVGFnQXV0b2Nsb3Npbmc6IG51bGwsXG4gICAgZGxJdGVtVGFnQXV0b2Nsb3Npbmc6IG51bGxcbiAgfTtcblxuICB1cGRhdGVkQW5jZXN0b3JJbmZvID0gZnVuY3Rpb24gKG9sZEluZm8sIHRhZykge1xuICAgIHZhciBhbmNlc3RvckluZm8gPSBfYXNzaWduKHt9LCBvbGRJbmZvIHx8IGVtcHR5QW5jZXN0b3JJbmZvKTtcbiAgICB2YXIgaW5mbyA9IHsgdGFnOiB0YWcgfTtcblxuICAgIGlmIChpblNjb3BlVGFncy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGJ1dHRvblNjb3BlVGFncy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGUgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIFNlZSBydWxlcyBmb3IgJ2xpJywgJ2RkJywgJ2R0JyBzdGFydCB0YWdzIGluXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluYm9keVxuICAgIGlmIChzcGVjaWFsVGFncy5pbmRleE9mKHRhZykgIT09IC0xICYmIHRhZyAhPT0gJ2FkZHJlc3MnICYmIHRhZyAhPT0gJ2RpdicgJiYgdGFnICE9PSAncCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nID0gbnVsbDtcbiAgICAgIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZyA9IG51bGw7XG4gICAgfVxuXG4gICAgYW5jZXN0b3JJbmZvLmN1cnJlbnQgPSBpbmZvO1xuXG4gICAgaWYgKHRhZyA9PT0gJ2Zvcm0nKSB7XG4gICAgICBhbmNlc3RvckluZm8uZm9ybVRhZyA9IGluZm87XG4gICAgfVxuICAgIGlmICh0YWcgPT09ICdhJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG4gICAgaWYgKHRhZyA9PT0gJ2J1dHRvbicpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG4gICAgaWYgKHRhZyA9PT0gJ25vYnInKSB7XG4gICAgICBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGUgPSBpbmZvO1xuICAgIH1cbiAgICBpZiAodGFnID09PSAncCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZSA9IGluZm87XG4gICAgfVxuICAgIGlmICh0YWcgPT09ICdsaScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICB9XG4gICAgaWYgKHRhZyA9PT0gJ2RkJyB8fCB0YWcgPT09ICdkdCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZyA9IGluZm87XG4gICAgfVxuXG4gICAgcmV0dXJuIGFuY2VzdG9ySW5mbztcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyXG4gICAqL1xuICB2YXIgaXNUYWdWYWxpZFdpdGhQYXJlbnQgPSBmdW5jdGlvbiAodGFnLCBwYXJlbnRUYWcpIHtcbiAgICAvLyBGaXJzdCwgbGV0J3MgY2hlY2sgaWYgd2UncmUgaW4gYW4gdW51c3VhbCBwYXJzaW5nIG1vZGUuLi5cbiAgICBzd2l0Y2ggKHBhcmVudFRhZykge1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluc2VsZWN0XG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnb3B0aW9uJyB8fCB0YWcgPT09ICdvcHRncm91cCcgfHwgdGFnID09PSAnI3RleHQnO1xuICAgICAgY2FzZSAnb3B0Z3JvdXAnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnb3B0aW9uJyB8fCB0YWcgPT09ICcjdGV4dCc7XG4gICAgICAvLyBTdHJpY3RseSBzcGVha2luZywgc2VlaW5nIGFuIDxvcHRpb24+IGRvZXNuJ3QgbWVhbiB3ZSdyZSBpbiBhIDxzZWxlY3Q+XG4gICAgICAvLyBidXRcbiAgICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICcjdGV4dCc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50ZFxuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluY2FwdGlvblxuICAgICAgLy8gTm8gc3BlY2lhbCBiZWhhdmlvciBzaW5jZSB0aGVzZSBydWxlcyBmYWxsIGJhY2sgdG8gXCJpbiBib2R5XCIgbW9kZSBmb3JcbiAgICAgIC8vIGFsbCBleGNlcHQgc3BlY2lhbCB0YWJsZSBub2RlcyB3aGljaCBjYXVzZSBiYWQgcGFyc2luZyBiZWhhdmlvciBhbnl3YXkuXG5cbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRyXG4gICAgICBjYXNlICd0cic6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICd0aCcgfHwgdGFnID09PSAndGQnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRib2R5XG4gICAgICBjYXNlICd0Ym9keSc6XG4gICAgICBjYXNlICd0aGVhZCc6XG4gICAgICBjYXNlICd0Zm9vdCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICd0cicgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluY29sZ3JvdXBcbiAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2NvbCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGFibGVcbiAgICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2NhcHRpb24nIHx8IHRhZyA9PT0gJ2NvbGdyb3VwJyB8fCB0YWcgPT09ICd0Ym9keScgfHwgdGFnID09PSAndGZvb3QnIHx8IHRhZyA9PT0gJ3RoZWFkJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5oZWFkXG4gICAgICBjYXNlICdoZWFkJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2Jhc2UnIHx8IHRhZyA9PT0gJ2Jhc2Vmb250JyB8fCB0YWcgPT09ICdiZ3NvdW5kJyB8fCB0YWcgPT09ICdsaW5rJyB8fCB0YWcgPT09ICdtZXRhJyB8fCB0YWcgPT09ICd0aXRsZScgfHwgdGFnID09PSAnbm9zY3JpcHQnIHx8IHRhZyA9PT0gJ25vZnJhbWVzJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zZW1hbnRpY3MuaHRtbCN0aGUtaHRtbC1lbGVtZW50XG4gICAgICBjYXNlICdodG1sJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2hlYWQnIHx8IHRhZyA9PT0gJ2JvZHknO1xuICAgICAgY2FzZSAnI2RvY3VtZW50JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2h0bWwnO1xuICAgIH1cblxuICAgIC8vIFByb2JhYmx5IGluIHRoZSBcImluIGJvZHlcIiBwYXJzaW5nIG1vZGUsIHNvIHdlIG91dGxhdyBvbmx5IHRhZyBjb21ib3NcbiAgICAvLyB3aGVyZSB0aGUgcGFyc2luZyBydWxlcyBjYXVzZSBpbXBsaWNpdCBvcGVucyBvciBjbG9zZXMgdG8gYmUgYWRkZWQuXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluYm9keVxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdoMSc6XG4gICAgICBjYXNlICdoMic6XG4gICAgICBjYXNlICdoMyc6XG4gICAgICBjYXNlICdoNCc6XG4gICAgICBjYXNlICdoNSc6XG4gICAgICBjYXNlICdoNic6XG4gICAgICAgIHJldHVybiBwYXJlbnRUYWcgIT09ICdoMScgJiYgcGFyZW50VGFnICE9PSAnaDInICYmIHBhcmVudFRhZyAhPT0gJ2gzJyAmJiBwYXJlbnRUYWcgIT09ICdoNCcgJiYgcGFyZW50VGFnICE9PSAnaDUnICYmIHBhcmVudFRhZyAhPT0gJ2g2JztcblxuICAgICAgY2FzZSAncnAnOlxuICAgICAgY2FzZSAncnQnOlxuICAgICAgICByZXR1cm4gaW1wbGllZEVuZFRhZ3MuaW5kZXhPZihwYXJlbnRUYWcpID09PSAtMTtcblxuICAgICAgY2FzZSAnYm9keSc6XG4gICAgICBjYXNlICdjYXB0aW9uJzpcbiAgICAgIGNhc2UgJ2NvbCc6XG4gICAgICBjYXNlICdjb2xncm91cCc6XG4gICAgICBjYXNlICdmcmFtZSc6XG4gICAgICBjYXNlICdoZWFkJzpcbiAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgY2FzZSAndGJvZHknOlxuICAgICAgY2FzZSAndGQnOlxuICAgICAgY2FzZSAndGZvb3QnOlxuICAgICAgY2FzZSAndGgnOlxuICAgICAgY2FzZSAndGhlYWQnOlxuICAgICAgY2FzZSAndHInOlxuICAgICAgICAvLyBUaGVzZSB0YWdzIGFyZSBvbmx5IHZhbGlkIHdpdGggYSBmZXcgcGFyZW50cyB0aGF0IGhhdmUgc3BlY2lhbCBjaGlsZFxuICAgICAgICAvLyBwYXJzaW5nIHJ1bGVzIC0tIGlmIHdlJ3JlIGRvd24gaGVyZSwgdGhlbiBub25lIG9mIHRob3NlIG1hdGNoZWQgYW5kXG4gICAgICAgIC8vIHNvIHdlIGFsbG93IGl0IG9ubHkgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBwYXJlbnQgaXMsIGFzIGFsbCBvdGhlclxuICAgICAgICAvLyBjYXNlcyBhcmUgaW52YWxpZC5cbiAgICAgICAgcmV0dXJuIHBhcmVudFRhZyA9PSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXJcbiAgICovXG4gIHZhciBmaW5kSW52YWxpZEFuY2VzdG9yRm9yVGFnID0gZnVuY3Rpb24gKHRhZywgYW5jZXN0b3JJbmZvKSB7XG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ2FkZHJlc3MnOlxuICAgICAgY2FzZSAnYXJ0aWNsZSc6XG4gICAgICBjYXNlICdhc2lkZSc6XG4gICAgICBjYXNlICdibG9ja3F1b3RlJzpcbiAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICBjYXNlICdkZXRhaWxzJzpcbiAgICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICBjYXNlICdkaXInOlxuICAgICAgY2FzZSAnZGl2JzpcbiAgICAgIGNhc2UgJ2RsJzpcbiAgICAgIGNhc2UgJ2ZpZWxkc2V0JzpcbiAgICAgIGNhc2UgJ2ZpZ2NhcHRpb24nOlxuICAgICAgY2FzZSAnZmlndXJlJzpcbiAgICAgIGNhc2UgJ2Zvb3Rlcic6XG4gICAgICBjYXNlICdoZWFkZXInOlxuICAgICAgY2FzZSAnaGdyb3VwJzpcbiAgICAgIGNhc2UgJ21haW4nOlxuICAgICAgY2FzZSAnbWVudSc6XG4gICAgICBjYXNlICduYXYnOlxuICAgICAgY2FzZSAnb2wnOlxuICAgICAgY2FzZSAncCc6XG4gICAgICBjYXNlICdzZWN0aW9uJzpcbiAgICAgIGNhc2UgJ3N1bW1hcnknOlxuICAgICAgY2FzZSAndWwnOlxuICAgICAgY2FzZSAncHJlJzpcbiAgICAgIGNhc2UgJ2xpc3RpbmcnOlxuICAgICAgY2FzZSAndGFibGUnOlxuICAgICAgY2FzZSAnaHInOlxuICAgICAgY2FzZSAneG1wJzpcbiAgICAgIGNhc2UgJ2gxJzpcbiAgICAgIGNhc2UgJ2gyJzpcbiAgICAgIGNhc2UgJ2gzJzpcbiAgICAgIGNhc2UgJ2g0JzpcbiAgICAgIGNhc2UgJ2g1JzpcbiAgICAgIGNhc2UgJ2g2JzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZTtcblxuICAgICAgY2FzZSAnZm9ybSc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uZm9ybVRhZyB8fCBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2xpJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nO1xuXG4gICAgICBjYXNlICdkZCc6XG4gICAgICBjYXNlICdkdCc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3Npbmc7XG5cbiAgICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZTtcblxuICAgICAgY2FzZSAnYSc6XG4gICAgICAgIC8vIFNwZWMgc2F5cyBzb21ldGhpbmcgYWJvdXQgc3RvcmluZyBhIGxpc3Qgb2YgbWFya2VycywgYnV0IGl0IHNvdW5kc1xuICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoaXMgY2hlY2suXG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGU7XG5cbiAgICAgIGNhc2UgJ25vYnInOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIHZhciBkaWRXYXJuID0ge307XG5cbiAgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKGNoaWxkVGFnLCBjaGlsZFRleHQsIGFuY2VzdG9ySW5mbykge1xuICAgIGFuY2VzdG9ySW5mbyA9IGFuY2VzdG9ySW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbztcbiAgICB2YXIgcGFyZW50SW5mbyA9IGFuY2VzdG9ySW5mby5jdXJyZW50O1xuICAgIHZhciBwYXJlbnRUYWcgPSBwYXJlbnRJbmZvICYmIHBhcmVudEluZm8udGFnO1xuXG4gICAgaWYgKGNoaWxkVGV4dCAhPSBudWxsKSB7XG4gICAgICAhKGNoaWxkVGFnID09IG51bGwpID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAndmFsaWRhdGVET01OZXN0aW5nOiB3aGVuIGNoaWxkVGV4dCBpcyBwYXNzZWQsIGNoaWxkVGFnIHNob3VsZCBiZSBudWxsJykgOiB2b2lkIDA7XG4gICAgICBjaGlsZFRhZyA9ICcjdGV4dCc7XG4gICAgfVxuXG4gICAgdmFyIGludmFsaWRQYXJlbnQgPSBpc1RhZ1ZhbGlkV2l0aFBhcmVudChjaGlsZFRhZywgcGFyZW50VGFnKSA/IG51bGwgOiBwYXJlbnRJbmZvO1xuICAgIHZhciBpbnZhbGlkQW5jZXN0b3IgPSBpbnZhbGlkUGFyZW50ID8gbnVsbCA6IGZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcoY2hpbGRUYWcsIGFuY2VzdG9ySW5mbyk7XG4gICAgdmFyIGludmFsaWRQYXJlbnRPckFuY2VzdG9yID0gaW52YWxpZFBhcmVudCB8fCBpbnZhbGlkQW5jZXN0b3I7XG4gICAgaWYgKCFpbnZhbGlkUGFyZW50T3JBbmNlc3Rvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBhbmNlc3RvclRhZyA9IGludmFsaWRQYXJlbnRPckFuY2VzdG9yLnRhZztcbiAgICB2YXIgYWRkZW5kdW0gPSBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2KCk7XG5cbiAgICB2YXIgd2FybktleSA9ICEhaW52YWxpZFBhcmVudCArICd8JyArIGNoaWxkVGFnICsgJ3wnICsgYW5jZXN0b3JUYWcgKyAnfCcgKyBhZGRlbmR1bTtcbiAgICBpZiAoZGlkV2Fyblt3YXJuS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkaWRXYXJuW3dhcm5LZXldID0gdHJ1ZTtcblxuICAgIHZhciB0YWdEaXNwbGF5TmFtZSA9IGNoaWxkVGFnO1xuICAgIHZhciB3aGl0ZXNwYWNlSW5mbyA9ICcnO1xuICAgIGlmIChjaGlsZFRhZyA9PT0gJyN0ZXh0Jykge1xuICAgICAgaWYgKC9cXFMvLnRlc3QoY2hpbGRUZXh0KSkge1xuICAgICAgICB0YWdEaXNwbGF5TmFtZSA9ICdUZXh0IG5vZGVzJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhZ0Rpc3BsYXlOYW1lID0gJ1doaXRlc3BhY2UgdGV4dCBub2Rlcyc7XG4gICAgICAgIHdoaXRlc3BhY2VJbmZvID0gXCIgTWFrZSBzdXJlIHlvdSBkb24ndCBoYXZlIGFueSBleHRyYSB3aGl0ZXNwYWNlIGJldHdlZW4gdGFncyBvbiBcIiArICdlYWNoIGxpbmUgb2YgeW91ciBzb3VyY2UgY29kZS4nO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0YWdEaXNwbGF5TmFtZSA9ICc8JyArIGNoaWxkVGFnICsgJz4nO1xuICAgIH1cblxuICAgIGlmIChpbnZhbGlkUGFyZW50KSB7XG4gICAgICB2YXIgaW5mbyA9ICcnO1xuICAgICAgaWYgKGFuY2VzdG9yVGFnID09PSAndGFibGUnICYmIGNoaWxkVGFnID09PSAndHInKSB7XG4gICAgICAgIGluZm8gKz0gJyBBZGQgYSA8dGJvZHk+IHRvIHlvdXIgY29kZSB0byBtYXRjaCB0aGUgRE9NIHRyZWUgZ2VuZXJhdGVkIGJ5ICcgKyAndGhlIGJyb3dzZXIuJztcbiAgICAgIH1cbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgY2hpbGQgb2YgPCVzPi4lcyVzJXMnLCB0YWdEaXNwbGF5TmFtZSwgYW5jZXN0b3JUYWcsIHdoaXRlc3BhY2VJbmZvLCBpbmZvLCBhZGRlbmR1bSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgZGVzY2VuZGFudCBvZiAnICsgJzwlcz4uJXMnLCB0YWdEaXNwbGF5TmFtZSwgYW5jZXN0b3JUYWcsIGFkZGVuZHVtKTtcbiAgICB9XG4gIH07XG59XG5cbi8vIFJlbmRlcmVycyB0aGF0IGRvbid0IHN1cHBvcnQgcGVyc2lzdGVuY2Vcbi8vIGNhbiByZS1leHBvcnQgZXZlcnl0aGluZyBmcm9tIHRoaXMgbW9kdWxlLlxuXG5mdW5jdGlvbiBzaGltKCkge1xuICBpbnZhcmlhbnQoZmFsc2UsICdUaGUgY3VycmVudCByZW5kZXJlciBkb2VzIG5vdCBzdXBwb3J0IHBlcnNpc3RlbmNlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG4vLyBQZXJzaXN0ZW5jZSAod2hlbiB1bnN1cHBvcnRlZClcbnZhciBzdXBwb3J0c1BlcnNpc3RlbmNlID0gZmFsc2U7XG52YXIgY2xvbmVJbnN0YW5jZSA9IHNoaW07XG52YXIgY3JlYXRlQ29udGFpbmVyQ2hpbGRTZXQgPSBzaGltO1xudmFyIGFwcGVuZENoaWxkVG9Db250YWluZXJDaGlsZFNldCA9IHNoaW07XG52YXIgZmluYWxpemVDb250YWluZXJDaGlsZHJlbiA9IHNoaW07XG52YXIgcmVwbGFjZUNvbnRhaW5lckNoaWxkcmVuID0gc2hpbTtcbnZhciBjbG9uZUhpZGRlbkluc3RhbmNlID0gc2hpbTtcbnZhciBjbG9uZVVuaGlkZGVuSW5zdGFuY2UgPSBzaGltO1xudmFyIGNyZWF0ZUhpZGRlblRleHRJbnN0YW5jZSA9IHNoaW07XG5cbnZhciBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyA9IHZvaWQgMDtcbntcbiAgU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcgPSAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJztcbn1cblxudmFyIFNVU1BFTlNFX1NUQVJUX0RBVEEgPSAnJCc7XG52YXIgU1VTUEVOU0VfRU5EX0RBVEEgPSAnLyQnO1xuXG52YXIgU1RZTEUgPSAnc3R5bGUnO1xuXG52YXIgZXZlbnRzRW5hYmxlZCA9IG51bGw7XG52YXIgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBudWxsO1xuXG5mdW5jdGlvbiBzaG91bGRBdXRvRm9jdXNIb3N0Q29tcG9uZW50KHR5cGUsIHByb3BzKSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgcmV0dXJuICEhcHJvcHMuYXV0b0ZvY3VzO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250ZXh0KHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICB2YXIgdHlwZSA9IHZvaWQgMDtcbiAgdmFyIG5hbWVzcGFjZSA9IHZvaWQgMDtcbiAgdmFyIG5vZGVUeXBlID0gcm9vdENvbnRhaW5lckluc3RhbmNlLm5vZGVUeXBlO1xuICBzd2l0Y2ggKG5vZGVUeXBlKSB7XG4gICAgY2FzZSBET0NVTUVOVF9OT0RFOlxuICAgIGNhc2UgRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpcbiAgICAgIHtcbiAgICAgICAgdHlwZSA9IG5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gJyNkb2N1bWVudCcgOiAnI2ZyYWdtZW50JztcbiAgICAgICAgdmFyIHJvb3QgPSByb290Q29udGFpbmVySW5zdGFuY2UuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICBuYW1lc3BhY2UgPSByb290ID8gcm9vdC5uYW1lc3BhY2VVUkkgOiBnZXRDaGlsZE5hbWVzcGFjZShudWxsLCAnJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHZhciBjb250YWluZXIgPSBub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gcm9vdENvbnRhaW5lckluc3RhbmNlLnBhcmVudE5vZGUgOiByb290Q29udGFpbmVySW5zdGFuY2U7XG4gICAgICAgIHZhciBvd25OYW1lc3BhY2UgPSBjb250YWluZXIubmFtZXNwYWNlVVJJIHx8IG51bGw7XG4gICAgICAgIHR5cGUgPSBjb250YWluZXIudGFnTmFtZTtcbiAgICAgICAgbmFtZXNwYWNlID0gZ2V0Q2hpbGROYW1lc3BhY2Uob3duTmFtZXNwYWNlLCB0eXBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbiAge1xuICAgIHZhciB2YWxpZGF0ZWRUYWcgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIF9hbmNlc3RvckluZm8gPSB1cGRhdGVkQW5jZXN0b3JJbmZvKG51bGwsIHZhbGlkYXRlZFRhZyk7XG4gICAgcmV0dXJuIHsgbmFtZXNwYWNlOiBuYW1lc3BhY2UsIGFuY2VzdG9ySW5mbzogX2FuY2VzdG9ySW5mbyB9O1xuICB9XG4gIHJldHVybiBuYW1lc3BhY2U7XG59XG5cbmZ1bmN0aW9uIGdldENoaWxkSG9zdENvbnRleHQocGFyZW50SG9zdENvbnRleHQsIHR5cGUsIHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICB7XG4gICAgdmFyIHBhcmVudEhvc3RDb250ZXh0RGV2ID0gcGFyZW50SG9zdENvbnRleHQ7XG4gICAgdmFyIF9uYW1lc3BhY2UgPSBnZXRDaGlsZE5hbWVzcGFjZShwYXJlbnRIb3N0Q29udGV4dERldi5uYW1lc3BhY2UsIHR5cGUpO1xuICAgIHZhciBfYW5jZXN0b3JJbmZvMiA9IHVwZGF0ZWRBbmNlc3RvckluZm8ocGFyZW50SG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICByZXR1cm4geyBuYW1lc3BhY2U6IF9uYW1lc3BhY2UsIGFuY2VzdG9ySW5mbzogX2FuY2VzdG9ySW5mbzIgfTtcbiAgfVxuICB2YXIgcGFyZW50TmFtZXNwYWNlID0gcGFyZW50SG9zdENvbnRleHQ7XG4gIHJldHVybiBnZXRDaGlsZE5hbWVzcGFjZShwYXJlbnROYW1lc3BhY2UsIHR5cGUpO1xufVxuXG5mdW5jdGlvbiBnZXRQdWJsaWNJbnN0YW5jZShpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVGb3JDb21taXQoY29udGFpbmVySW5mbykge1xuICBldmVudHNFbmFibGVkID0gaXNFbmFibGVkKCk7XG4gIHNlbGVjdGlvbkluZm9ybWF0aW9uID0gZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb24oKTtcbiAgc2V0RW5hYmxlZChmYWxzZSk7XG59XG5cbmZ1bmN0aW9uIHJlc2V0QWZ0ZXJDb21taXQoY29udGFpbmVySW5mbykge1xuICByZXN0b3JlU2VsZWN0aW9uKHNlbGVjdGlvbkluZm9ybWF0aW9uKTtcbiAgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBudWxsO1xuICBzZXRFbmFibGVkKGV2ZW50c0VuYWJsZWQpO1xuICBldmVudHNFbmFibGVkID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgdmFyIHBhcmVudE5hbWVzcGFjZSA9IHZvaWQgMDtcbiAge1xuICAgIC8vIFRPRE86IHRha2UgbmFtZXNwYWNlIGludG8gYWNjb3VudCB3aGVuIHZhbGlkYXRpbmcuXG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG4gICAgdmFsaWRhdGVET01OZXN0aW5nKHR5cGUsIG51bGwsIGhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbyk7XG4gICAgaWYgKHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJykge1xuICAgICAgdmFyIHN0cmluZyA9ICcnICsgcHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgb3duQW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8sIHR5cGUpO1xuICAgICAgdmFsaWRhdGVET01OZXN0aW5nKG51bGwsIHN0cmluZywgb3duQW5jZXN0b3JJbmZvKTtcbiAgICB9XG4gICAgcGFyZW50TmFtZXNwYWNlID0gaG9zdENvbnRleHREZXYubmFtZXNwYWNlO1xuICB9XG4gIHZhciBkb21FbGVtZW50ID0gY3JlYXRlRWxlbWVudCh0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBwYXJlbnROYW1lc3BhY2UpO1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBkb21FbGVtZW50KTtcbiAgdXBkYXRlRmliZXJQcm9wcyhkb21FbGVtZW50LCBwcm9wcyk7XG4gIHJldHVybiBkb21FbGVtZW50O1xufVxuXG5mdW5jdGlvbiBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50SW5zdGFuY2UsIGNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLmFwcGVuZENoaWxkKGNoaWxkKTtcbn1cblxuZnVuY3Rpb24gZmluYWxpemVJbml0aWFsQ2hpbGRyZW4oZG9tRWxlbWVudCwgdHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQpIHtcbiAgc2V0SW5pdGlhbFByb3BlcnRpZXMoZG9tRWxlbWVudCwgdHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG4gIHJldHVybiBzaG91bGRBdXRvRm9jdXNIb3N0Q29tcG9uZW50KHR5cGUsIHByb3BzKTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZVVwZGF0ZShkb21FbGVtZW50LCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQpIHtcbiAge1xuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuICAgIGlmICh0eXBlb2YgbmV3UHJvcHMuY2hpbGRyZW4gIT09IHR5cGVvZiBvbGRQcm9wcy5jaGlsZHJlbiAmJiAodHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV3UHJvcHMuY2hpbGRyZW4gPT09ICdudW1iZXInKSkge1xuICAgICAgdmFyIHN0cmluZyA9ICcnICsgbmV3UHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgb3duQW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8sIHR5cGUpO1xuICAgICAgdmFsaWRhdGVET01OZXN0aW5nKG51bGwsIHN0cmluZywgb3duQW5jZXN0b3JJbmZvKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpZmZQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgcHJvcHMpIHtcbiAgcmV0dXJuIHR5cGUgPT09ICd0ZXh0YXJlYScgfHwgdHlwZSA9PT0gJ29wdGlvbicgfHwgdHlwZSA9PT0gJ25vc2NyaXB0JyB8fCB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MID09PSAnb2JqZWN0JyAmJiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPT0gbnVsbCAmJiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWwgIT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRGVwcmlvcml0aXplU3VidHJlZSh0eXBlLCBwcm9wcykge1xuICByZXR1cm4gISFwcm9wcy5oaWRkZW47XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRleHRJbnN0YW5jZSh0ZXh0LCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIHtcbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICB2YWxpZGF0ZURPTU5lc3RpbmcobnVsbCwgdGV4dCwgaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvKTtcbiAgfVxuICB2YXIgdGV4dE5vZGUgPSBjcmVhdGVUZXh0Tm9kZSh0ZXh0LCByb290Q29udGFpbmVySW5zdGFuY2UpO1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCB0ZXh0Tm9kZSk7XG4gIHJldHVybiB0ZXh0Tm9kZTtcbn1cblxudmFyIGlzUHJpbWFyeVJlbmRlcmVyID0gdHJ1ZTtcbi8vIFRoaXMgaW5pdGlhbGl6YXRpb24gY29kZSBtYXkgcnVuIGV2ZW4gb24gc2VydmVyIGVudmlyb25tZW50c1xuLy8gaWYgYSBjb21wb25lbnQganVzdCBpbXBvcnRzIFJlYWN0RE9NIChlLmcuIGZvciBmaW5kRE9NTm9kZSkuXG4vLyBTb21lIGVudmlyb25tZW50cyBtaWdodCBub3QgaGF2ZSBzZXRUaW1lb3V0IG9yIGNsZWFyVGltZW91dC5cbnZhciBzY2hlZHVsZVRpbWVvdXQgPSB0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IHNldFRpbWVvdXQgOiB1bmRlZmluZWQ7XG52YXIgY2FuY2VsVGltZW91dCA9IHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBjbGVhclRpbWVvdXQgOiB1bmRlZmluZWQ7XG52YXIgbm9UaW1lb3V0ID0gLTE7XG52YXIgc2NoZWR1bGVQYXNzaXZlRWZmZWN0cyA9IHNjaGVkdWxlci51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrO1xudmFyIGNhbmNlbFBhc3NpdmVFZmZlY3RzID0gc2NoZWR1bGVyLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyAgICAgTXV0YXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIHN1cHBvcnRzTXV0YXRpb24gPSB0cnVlO1xuXG5mdW5jdGlvbiBjb21taXRNb3VudChkb21FbGVtZW50LCB0eXBlLCBuZXdQcm9wcywgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICAvLyBEZXNwaXRlIHRoZSBuYW1pbmcgdGhhdCBtaWdodCBpbXBseSBvdGhlcndpc2UsIHRoaXMgbWV0aG9kIG9ubHlcbiAgLy8gZmlyZXMgaWYgdGhlcmUgaXMgYW4gYFVwZGF0ZWAgZWZmZWN0IHNjaGVkdWxlZCBkdXJpbmcgbW91bnRpbmcuXG4gIC8vIFRoaXMgaGFwcGVucyBpZiBgZmluYWxpemVJbml0aWFsQ2hpbGRyZW5gIHJldHVybnMgYHRydWVgICh3aGljaCBpdFxuICAvLyBkb2VzIHRvIGltcGxlbWVudCB0aGUgYGF1dG9Gb2N1c2AgYXR0cmlidXRlIG9uIHRoZSBjbGllbnQpLiBCdXRcbiAgLy8gdGhlcmUgYXJlIGFsc28gb3RoZXIgY2FzZXMgd2hlbiB0aGlzIG1pZ2h0IGhhcHBlbiAoc3VjaCBhcyBwYXRjaGluZ1xuICAvLyB1cCB0ZXh0IGNvbnRlbnQgZHVyaW5nIGh5ZHJhdGlvbiBtaXNtYXRjaCkuIFNvIHdlJ2xsIGNoZWNrIHRoaXMgYWdhaW4uXG4gIGlmIChzaG91bGRBdXRvRm9jdXNIb3N0Q29tcG9uZW50KHR5cGUsIG5ld1Byb3BzKSkge1xuICAgIGRvbUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRVcGRhdGUoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzLCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIC8vIFVwZGF0ZSB0aGUgcHJvcHMgaGFuZGxlIHNvIHRoYXQgd2Uga25vdyB3aGljaCBwcm9wcyBhcmUgdGhlIG9uZXMgd2l0aFxuICAvLyB3aXRoIGN1cnJlbnQgZXZlbnQgaGFuZGxlcnMuXG4gIHVwZGF0ZUZpYmVyUHJvcHMoZG9tRWxlbWVudCwgbmV3UHJvcHMpO1xuICAvLyBBcHBseSB0aGUgZGlmZiB0byB0aGUgRE9NIG5vZGUuXG4gIHVwZGF0ZVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzKTtcbn1cblxuZnVuY3Rpb24gcmVzZXRUZXh0Q29udGVudChkb21FbGVtZW50KSB7XG4gIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsICcnKTtcbn1cblxuZnVuY3Rpb24gY29tbWl0VGV4dFVwZGF0ZSh0ZXh0SW5zdGFuY2UsIG9sZFRleHQsIG5ld1RleHQpIHtcbiAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9IG5ld1RleHQ7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZENoaWxkKHBhcmVudEluc3RhbmNlLCBjaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5hcHBlbmRDaGlsZChjaGlsZCk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZENoaWxkVG9Db250YWluZXIoY29udGFpbmVyLCBjaGlsZCkge1xuICB2YXIgcGFyZW50Tm9kZSA9IHZvaWQgMDtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgcGFyZW50Tm9kZSA9IGNvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBjb250YWluZXIpO1xuICB9IGVsc2Uge1xuICAgIHBhcmVudE5vZGUgPSBjb250YWluZXI7XG4gICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gIH1cbiAgLy8gVGhpcyBjb250YWluZXIgbWlnaHQgYmUgdXNlZCBmb3IgYSBwb3J0YWwuXG4gIC8vIElmIHNvbWV0aGluZyBpbnNpZGUgYSBwb3J0YWwgaXMgY2xpY2tlZCwgdGhhdCBjbGljayBzaG91bGQgYnViYmxlXG4gIC8vIHRocm91Z2ggdGhlIFJlYWN0IHRyZWUuIEhvd2V2ZXIsIG9uIE1vYmlsZSBTYWZhcmkgdGhlIGNsaWNrIHdvdWxkXG4gIC8vIG5ldmVyIGJ1YmJsZSB0aHJvdWdoIHRoZSAqRE9NKiB0cmVlIHVubGVzcyBhbiBhbmNlc3RvciB3aXRoIG9uY2xpY2tcbiAgLy8gZXZlbnQgZXhpc3RzLiBTbyB3ZSB3b3VsZG4ndCBzZWUgaXQgYW5kIGRpc3BhdGNoIGl0LlxuICAvLyBUaGlzIGlzIHdoeSB3ZSBlbnN1cmUgdGhhdCBub24gUmVhY3Qgcm9vdCBjb250YWluZXJzIGhhdmUgaW5saW5lIG9uY2xpY2tcbiAgLy8gZGVmaW5lZC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTkxOFxuICB2YXIgcmVhY3RSb290Q29udGFpbmVyID0gY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXI7XG4gIGlmICgocmVhY3RSb290Q29udGFpbmVyID09PSBudWxsIHx8IHJlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSAmJiBwYXJlbnROb2RlLm9uY2xpY2sgPT09IG51bGwpIHtcbiAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KHBhcmVudE5vZGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydEJlZm9yZShwYXJlbnRJbnN0YW5jZSwgY2hpbGQsIGJlZm9yZUNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlQ2hpbGQpO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRJbkNvbnRhaW5lckJlZm9yZShjb250YWluZXIsIGNoaWxkLCBiZWZvcmVDaGlsZCkge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICBjb250YWluZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGNoaWxkLCBiZWZvcmVDaGlsZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGQocGFyZW50SW5zdGFuY2UsIGNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKGNoaWxkKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGRGcm9tQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjaGlsZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KHBhcmVudEluc3RhbmNlLCBzdXNwZW5zZUluc3RhbmNlKSB7XG4gIHZhciBub2RlID0gc3VzcGVuc2VJbnN0YW5jZTtcbiAgLy8gRGVsZXRlIGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS5cbiAgLy8gVGhlcmUgbWlnaHQgYmUgbmVzdGVkIG5vZGVzIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBob3dcbiAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuXG4gIHZhciBkZXB0aCA9IDA7XG4gIGRvIHtcbiAgICB2YXIgbmV4dE5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgIGlmIChuZXh0Tm9kZSAmJiBuZXh0Tm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgZGF0YSA9IG5leHROb2RlLmRhdGE7XG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQobmV4dE5vZGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cbiAgICB9XG4gICAgbm9kZSA9IG5leHROb2RlO1xuICB9IHdoaWxlIChub2RlKTtcbiAgLy8gVE9ETzogV2Fybiwgd2UgZGlkbid0IGZpbmQgdGhlIGVuZCBjb21tZW50IGJvdW5kYXJ5LlxufVxuXG5mdW5jdGlvbiBjbGVhclN1c3BlbnNlQm91bmRhcnlGcm9tQ29udGFpbmVyKGNvbnRhaW5lciwgc3VzcGVuc2VJbnN0YW5jZSkge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICBjbGVhclN1c3BlbnNlQm91bmRhcnkoY29udGFpbmVyLnBhcmVudE5vZGUsIHN1c3BlbnNlSW5zdGFuY2UpO1xuICB9IGVsc2UgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KGNvbnRhaW5lciwgc3VzcGVuc2VJbnN0YW5jZSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gRG9jdW1lbnQgbm9kZXMgc2hvdWxkIG5ldmVyIGNvbnRhaW4gc3VzcGVuc2UgYm91bmRhcmllcy5cbiAgfVxufVxuXG5mdW5jdGlvbiBoaWRlSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgLy8gVE9ETzogRG9lcyB0aGlzIHdvcmsgZm9yIGFsbCBlbGVtZW50IHR5cGVzPyBXaGF0IGFib3V0IE1hdGhNTD8gU2hvdWxkIHdlXG4gIC8vIHBhc3MgaG9zdCBjb250ZXh0IHRvIHRoaXMgbWV0aG9kP1xuICBpbnN0YW5jZSA9IGluc3RhbmNlO1xuICBpbnN0YW5jZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xufVxuXG5mdW5jdGlvbiBoaWRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gJyc7XG59XG5cbmZ1bmN0aW9uIHVuaGlkZUluc3RhbmNlKGluc3RhbmNlLCBwcm9wcykge1xuICBpbnN0YW5jZSA9IGluc3RhbmNlO1xuICB2YXIgc3R5bGVQcm9wID0gcHJvcHNbU1RZTEVdO1xuICB2YXIgZGlzcGxheSA9IHN0eWxlUHJvcCAhPT0gdW5kZWZpbmVkICYmIHN0eWxlUHJvcCAhPT0gbnVsbCAmJiBzdHlsZVByb3AuaGFzT3duUHJvcGVydHkoJ2Rpc3BsYXknKSA/IHN0eWxlUHJvcC5kaXNwbGF5IDogbnVsbDtcbiAgaW5zdGFuY2Uuc3R5bGUuZGlzcGxheSA9IGRhbmdlcm91c1N0eWxlVmFsdWUoJ2Rpc3BsYXknLCBkaXNwbGF5KTtcbn1cblxuZnVuY3Rpb24gdW5oaWRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gdGV4dDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gICAgIEh5ZHJhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgc3VwcG9ydHNIeWRyYXRpb24gPSB0cnVlO1xuXG5mdW5jdGlvbiBjYW5IeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzKSB7XG4gIGlmIChpbnN0YW5jZS5ub2RlVHlwZSAhPT0gRUxFTUVOVF9OT0RFIHx8IHR5cGUudG9Mb3dlckNhc2UoKSAhPT0gaW5zdGFuY2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIFRoaXMgaGFzIG5vdyBiZWVuIHJlZmluZWQgdG8gYW4gZWxlbWVudCBub2RlLlxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIGNhbkh5ZHJhdGVUZXh0SW5zdGFuY2UoaW5zdGFuY2UsIHRleHQpIHtcbiAgaWYgKHRleHQgPT09ICcnIHx8IGluc3RhbmNlLm5vZGVUeXBlICE9PSBURVhUX05PREUpIHtcbiAgICAvLyBFbXB0eSBzdHJpbmdzIGFyZSBub3QgcGFyc2VkIGJ5IEhUTUwgc28gdGhlcmUgd29uJ3QgYmUgYSBjb3JyZWN0IG1hdGNoIGhlcmUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gVGhpcyBoYXMgbm93IGJlZW4gcmVmaW5lZCB0byBhIHRleHQgbm9kZS5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG5mdW5jdGlvbiBjYW5IeWRyYXRlU3VzcGVuc2VJbnN0YW5jZShpbnN0YW5jZSkge1xuICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgIC8vIEVtcHR5IHN0cmluZ3MgYXJlIG5vdCBwYXJzZWQgYnkgSFRNTCBzbyB0aGVyZSB3b24ndCBiZSBhIGNvcnJlY3QgbWF0Y2ggaGVyZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBUaGlzIGhhcyBub3cgYmVlbiByZWZpbmVkIHRvIGEgc3VzcGVuc2Ugbm9kZS5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG5mdW5jdGlvbiBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoaW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSBpbnN0YW5jZS5uZXh0U2libGluZztcbiAgLy8gU2tpcCBub24taHlkcmF0YWJsZSBub2Rlcy5cbiAgd2hpbGUgKG5vZGUgJiYgbm9kZS5ub2RlVHlwZSAhPT0gRUxFTUVOVF9OT0RFICYmIG5vZGUubm9kZVR5cGUgIT09IFRFWFRfTk9ERSAmJiAoIWVuYWJsZVN1c3BlbnNlU2VydmVyUmVuZGVyZXIgfHwgbm9kZS5ub2RlVHlwZSAhPT0gQ09NTUVOVF9OT0RFIHx8IG5vZGUuZGF0YSAhPT0gU1VTUEVOU0VfU1RBUlRfREFUQSkpIHtcbiAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgfVxuICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQocGFyZW50SW5zdGFuY2UpIHtcbiAgdmFyIG5leHQgPSBwYXJlbnRJbnN0YW5jZS5maXJzdENoaWxkO1xuICAvLyBTa2lwIG5vbi1oeWRyYXRhYmxlIG5vZGVzLlxuICB3aGlsZSAobmV4dCAmJiBuZXh0Lm5vZGVUeXBlICE9PSBFTEVNRU5UX05PREUgJiYgbmV4dC5ub2RlVHlwZSAhPT0gVEVYVF9OT0RFICYmICghZW5hYmxlU3VzcGVuc2VTZXJ2ZXJSZW5kZXJlciB8fCBuZXh0Lm5vZGVUeXBlICE9PSBDT01NRU5UX05PREUgfHwgbmV4dC5kYXRhICE9PSBTVVNQRU5TRV9TVEFSVF9EQVRBKSkge1xuICAgIG5leHQgPSBuZXh0Lm5leHRTaWJsaW5nO1xuICB9XG4gIHJldHVybiBuZXh0O1xufVxuXG5mdW5jdGlvbiBoeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIGluc3RhbmNlKTtcbiAgLy8gVE9ETzogUG9zc2libHkgZGVmZXIgdGhpcyB1bnRpbCB0aGUgY29tbWl0IHBoYXNlIHdoZXJlIGFsbCB0aGUgZXZlbnRzXG4gIC8vIGdldCBhdHRhY2hlZC5cbiAgdXBkYXRlRmliZXJQcm9wcyhpbnN0YW5jZSwgcHJvcHMpO1xuICB2YXIgcGFyZW50TmFtZXNwYWNlID0gdm9pZCAwO1xuICB7XG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG4gICAgcGFyZW50TmFtZXNwYWNlID0gaG9zdENvbnRleHREZXYubmFtZXNwYWNlO1xuICB9XG4gIHJldHVybiBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKGluc3RhbmNlLCB0eXBlLCBwcm9wcywgcGFyZW50TmFtZXNwYWNlLCByb290Q29udGFpbmVySW5zdGFuY2UpO1xufVxuXG5mdW5jdGlvbiBoeWRyYXRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCB0ZXh0SW5zdGFuY2UpO1xuICByZXR1cm4gZGlmZkh5ZHJhdGVkVGV4dCh0ZXh0SW5zdGFuY2UsIHRleHQpO1xufVxuXG5mdW5jdGlvbiBnZXROZXh0SHlkcmF0YWJsZUluc3RhbmNlQWZ0ZXJTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSBzdXNwZW5zZUluc3RhbmNlLm5leHRTaWJsaW5nO1xuICAvLyBTa2lwIHBhc3QgYWxsIG5vZGVzIHdpdGhpbiB0aGlzIHN1c3BlbnNlIGJvdW5kYXJ5LlxuICAvLyBUaGVyZSBtaWdodCBiZSBuZXN0ZWQgbm9kZXMgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGhvd1xuICAvLyBkZWVwIHdlIGFyZSBhbmQgb25seSBicmVhayBvdXQgd2hlbiB3ZSdyZSBiYWNrIG9uIHRvcC5cbiAgdmFyIGRlcHRoID0gMDtcbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgZGF0YSA9IG5vZGUuZGF0YTtcbiAgICAgIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKG5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSkge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuICAgIH1cbiAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgfVxuICAvLyBUT0RPOiBXYXJuLCB3ZSBkaWRuJ3QgZmluZCB0aGUgZW5kIGNvbW1lbnQgYm91bmRhcnkuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBkaWROb3RNYXRjaEh5ZHJhdGVkQ29udGFpbmVyVGV4dEluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgdGV4dEluc3RhbmNlLCB0ZXh0KSB7XG4gIHtcbiAgICB3YXJuRm9yVW5tYXRjaGVkVGV4dCh0ZXh0SW5zdGFuY2UsIHRleHQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpZE5vdE1hdGNoSHlkcmF0ZWRUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0SW5zdGFuY2UsIHRleHQpIHtcbiAgaWYgKHRydWUgJiYgcGFyZW50UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddICE9PSB0cnVlKSB7XG4gICAgd2FybkZvclVubWF0Y2hlZFRleHQodGV4dEluc3RhbmNlLCB0ZXh0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaWROb3RIeWRyYXRlQ29udGFpbmVySW5zdGFuY2UocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSkge1xuICB7XG4gICAgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSk7XG4gICAgfSBlbHNlIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICAvLyBUT0RPOiB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVTdXNwZW5zZUJvdW5kYXJ5XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIGluc3RhbmNlKSB7XG4gIGlmICh0cnVlICYmIHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSAhPT0gdHJ1ZSkge1xuICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSk7XG4gICAgfSBlbHNlIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICAvLyBUT0RPOiB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVTdXNwZW5zZUJvdW5kYXJ5XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50SW5zdGFuY2UsIGluc3RhbmNlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVDb250YWluZXJJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHR5cGUsIHByb3BzKSB7XG4gIHtcbiAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50Q29udGFpbmVyLCB0eXBlLCBwcm9wcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVDb250YWluZXJUZXh0SW5zdGFuY2UocGFyZW50Q29udGFpbmVyLCB0ZXh0KSB7XG4gIHtcbiAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50Q29udGFpbmVyLCB0ZXh0KTtcbiAgfVxufVxuXG5cblxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHR5cGUsIHByb3BzKSB7XG4gIGlmICh0cnVlICYmIHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSAhPT0gdHJ1ZSkge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnRJbnN0YW5jZSwgdHlwZSwgcHJvcHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdGV4dCkge1xuICBpZiAodHJ1ZSAmJiBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklOR10gIT09IHRydWUpIHtcbiAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50SW5zdGFuY2UsIHRleHQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UpIHtcbiAgaWYgKHRydWUgJiYgcGFyZW50UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddICE9PSB0cnVlKSB7XG4gICAgLy8gVE9ETzogd2FybkZvckluc2VydGVkSHlkcmF0ZWRTdXNwZW5zZShwYXJlbnRJbnN0YW5jZSk7XG4gIH1cbn1cblxuLy8gUHJlZml4IG1lYXN1cmVtZW50cyBzbyB0aGF0IGl0J3MgcG9zc2libGUgdG8gZmlsdGVyIHRoZW0uXG4vLyBMb25nZXIgcHJlZml4ZXMgYXJlIGhhcmQgdG8gcmVhZCBpbiBEZXZUb29scy5cbnZhciByZWFjdEVtb2ppID0gJ1xcdTI2OUInO1xudmFyIHdhcm5pbmdFbW9qaSA9ICdcXHUyNkQ0JztcbnZhciBzdXBwb3J0c1VzZXJUaW1pbmcgPSB0eXBlb2YgcGVyZm9ybWFuY2UgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwZXJmb3JtYW5jZS5tYXJrID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBwZXJmb3JtYW5jZS5jbGVhck1hcmtzID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBwZXJmb3JtYW5jZS5tZWFzdXJlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBwZXJmb3JtYW5jZS5jbGVhck1lYXN1cmVzID09PSAnZnVuY3Rpb24nO1xuXG4vLyBLZWVwIHRyYWNrIG9mIGN1cnJlbnQgZmliZXIgc28gdGhhdCB3ZSBrbm93IHRoZSBwYXRoIHRvIHVud2luZCBvbiBwYXVzZS5cbi8vIFRPRE86IHRoaXMgbG9va3MgdGhlIHNhbWUgYXMgbmV4dFVuaXRPZldvcmsgaW4gc2NoZWR1bGVyLiBDYW4gd2UgdW5pZnkgdGhlbT9cbnZhciBjdXJyZW50RmliZXIgPSBudWxsO1xuLy8gSWYgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiB1c2VyIGNvZGUsIHdoaWNoIGZpYmVyIGFuZCBtZXRob2QgaXMgaXQ/XG4vLyBSZXVzaW5nIGBjdXJyZW50RmliZXJgIHdvdWxkIGJlIGNvbmZ1c2luZyBmb3IgdGhpcyBiZWNhdXNlIHVzZXIgY29kZSBmaWJlclxuLy8gY2FuIGNoYW5nZSBkdXJpbmcgY29tbWl0IHBoYXNlIHRvbywgYnV0IHdlIGRvbid0IG5lZWQgdG8gdW53aW5kIGl0IChzaW5jZVxuLy8gbGlmZWN5Y2xlcyBpbiB0aGUgY29tbWl0IHBoYXNlIGRvbid0IHJlc2VtYmxlIGEgdHJlZSkuXG52YXIgY3VycmVudFBoYXNlID0gbnVsbDtcbnZhciBjdXJyZW50UGhhc2VGaWJlciA9IG51bGw7XG4vLyBEaWQgbGlmZWN5Y2xlIGhvb2sgc2NoZWR1bGUgYW4gdXBkYXRlPyBUaGlzIGlzIG9mdGVuIGEgcGVyZm9ybWFuY2UgcHJvYmxlbSxcbi8vIHNvIHdlIHdpbGwga2VlcCB0cmFjayBvZiBpdCwgYW5kIGluY2x1ZGUgaXQgaW4gdGhlIHJlcG9ydC5cbi8vIFRyYWNrIGNvbW1pdHMgY2F1c2VkIGJ5IGNhc2NhZGluZyB1cGRhdGVzLlxudmFyIGlzQ29tbWl0dGluZyA9IGZhbHNlO1xudmFyIGhhc1NjaGVkdWxlZFVwZGF0ZUluQ3VycmVudENvbW1pdCA9IGZhbHNlO1xudmFyIGhhc1NjaGVkdWxlZFVwZGF0ZUluQ3VycmVudFBoYXNlID0gZmFsc2U7XG52YXIgY29tbWl0Q291bnRJbkN1cnJlbnRXb3JrTG9vcCA9IDA7XG52YXIgZWZmZWN0Q291bnRJbkN1cnJlbnRDb21taXQgPSAwO1xudmFyIGlzV2FpdGluZ0ZvckNhbGxiYWNrID0gZmFsc2U7XG4vLyBEdXJpbmcgY29tbWl0cywgd2Ugb25seSBzaG93IGEgbWVhc3VyZW1lbnQgb25jZSBwZXIgbWV0aG9kIG5hbWVcbi8vIHRvIGF2b2lkIHN0cmV0Y2ggdGhlIGNvbW1pdCBwaGFzZSB3aXRoIG1lYXN1cmVtZW50IG92ZXJoZWFkLlxudmFyIGxhYmVsc0luQ3VycmVudENvbW1pdCA9IG5ldyBTZXQoKTtcblxudmFyIGZvcm1hdE1hcmtOYW1lID0gZnVuY3Rpb24gKG1hcmtOYW1lKSB7XG4gIHJldHVybiByZWFjdEVtb2ppICsgJyAnICsgbWFya05hbWU7XG59O1xuXG52YXIgZm9ybWF0TGFiZWwgPSBmdW5jdGlvbiAobGFiZWwsIHdhcm5pbmcpIHtcbiAgdmFyIHByZWZpeCA9IHdhcm5pbmcgPyB3YXJuaW5nRW1vamkgKyAnICcgOiByZWFjdEVtb2ppICsgJyAnO1xuICB2YXIgc3VmZml4ID0gd2FybmluZyA/ICcgV2FybmluZzogJyArIHdhcm5pbmcgOiAnJztcbiAgcmV0dXJuICcnICsgcHJlZml4ICsgbGFiZWwgKyBzdWZmaXg7XG59O1xuXG52YXIgYmVnaW5NYXJrID0gZnVuY3Rpb24gKG1hcmtOYW1lKSB7XG4gIHBlcmZvcm1hbmNlLm1hcmsoZm9ybWF0TWFya05hbWUobWFya05hbWUpKTtcbn07XG5cbnZhciBjbGVhck1hcmsgPSBmdW5jdGlvbiAobWFya05hbWUpIHtcbiAgcGVyZm9ybWFuY2UuY2xlYXJNYXJrcyhmb3JtYXRNYXJrTmFtZShtYXJrTmFtZSkpO1xufTtcblxudmFyIGVuZE1hcmsgPSBmdW5jdGlvbiAobGFiZWwsIG1hcmtOYW1lLCB3YXJuaW5nKSB7XG4gIHZhciBmb3JtYXR0ZWRNYXJrTmFtZSA9IGZvcm1hdE1hcmtOYW1lKG1hcmtOYW1lKTtcbiAgdmFyIGZvcm1hdHRlZExhYmVsID0gZm9ybWF0TGFiZWwobGFiZWwsIHdhcm5pbmcpO1xuICB0cnkge1xuICAgIHBlcmZvcm1hbmNlLm1lYXN1cmUoZm9ybWF0dGVkTGFiZWwsIGZvcm1hdHRlZE1hcmtOYW1lKTtcbiAgfSBjYXRjaCAoZXJyKSB7fVxuICAvLyBJZiBwcmV2aW91cyBtYXJrIHdhcyBtaXNzaW5nIGZvciBzb21lIHJlYXNvbiwgdGhpcyB3aWxsIHRocm93LlxuICAvLyBUaGlzIGNvdWxkIG9ubHkgaGFwcGVuIGlmIFJlYWN0IGNyYXNoZWQgaW4gYW4gdW5leHBlY3RlZCBwbGFjZSBlYXJsaWVyLlxuICAvLyBEb24ndCBwaWxlIG9uIHdpdGggbW9yZSBlcnJvcnMuXG5cbiAgLy8gQ2xlYXIgbWFya3MgaW1tZWRpYXRlbHkgdG8gYXZvaWQgZ3Jvd2luZyBidWZmZXIuXG4gIHBlcmZvcm1hbmNlLmNsZWFyTWFya3MoZm9ybWF0dGVkTWFya05hbWUpO1xuICBwZXJmb3JtYW5jZS5jbGVhck1lYXN1cmVzKGZvcm1hdHRlZExhYmVsKTtcbn07XG5cbnZhciBnZXRGaWJlck1hcmtOYW1lID0gZnVuY3Rpb24gKGxhYmVsLCBkZWJ1Z0lEKSB7XG4gIHJldHVybiBsYWJlbCArICcgKCMnICsgZGVidWdJRCArICcpJztcbn07XG5cbnZhciBnZXRGaWJlckxhYmVsID0gZnVuY3Rpb24gKGNvbXBvbmVudE5hbWUsIGlzTW91bnRlZCwgcGhhc2UpIHtcbiAgaWYgKHBoYXNlID09PSBudWxsKSB7XG4gICAgLy8gVGhlc2UgYXJlIGNvbXBvc2l0ZSBjb21wb25lbnQgdG90YWwgdGltZSBtZWFzdXJlbWVudHMuXG4gICAgcmV0dXJuIGNvbXBvbmVudE5hbWUgKyAnIFsnICsgKGlzTW91bnRlZCA/ICd1cGRhdGUnIDogJ21vdW50JykgKyAnXSc7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ29tcG9zaXRlIGNvbXBvbmVudCBtZXRob2RzLlxuICAgIHJldHVybiBjb21wb25lbnROYW1lICsgJy4nICsgcGhhc2U7XG4gIH1cbn07XG5cbnZhciBiZWdpbkZpYmVyTWFyayA9IGZ1bmN0aW9uIChmaWJlciwgcGhhc2UpIHtcbiAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdVbmtub3duJztcbiAgdmFyIGRlYnVnSUQgPSBmaWJlci5fZGVidWdJRDtcbiAgdmFyIGlzTW91bnRlZCA9IGZpYmVyLmFsdGVybmF0ZSAhPT0gbnVsbDtcbiAgdmFyIGxhYmVsID0gZ2V0RmliZXJMYWJlbChjb21wb25lbnROYW1lLCBpc01vdW50ZWQsIHBoYXNlKTtcblxuICBpZiAoaXNDb21taXR0aW5nICYmIGxhYmVsc0luQ3VycmVudENvbW1pdC5oYXMobGFiZWwpKSB7XG4gICAgLy8gRHVyaW5nIHRoZSBjb21taXQgcGhhc2UsIHdlIGRvbid0IHNob3cgZHVwbGljYXRlIGxhYmVscyBiZWNhdXNlXG4gICAgLy8gdGhlcmUgaXMgYSBmaXhlZCBvdmVyaGVhZCBmb3IgZXZlcnkgbWVhc3VyZW1lbnQsIGFuZCB3ZSBkb24ndFxuICAgIC8vIHdhbnQgdG8gc3RyZXRjaCB0aGUgY29tbWl0IHBoYXNlIGJleW9uZCBuZWNlc3NhcnkuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGxhYmVsc0luQ3VycmVudENvbW1pdC5hZGQobGFiZWwpO1xuXG4gIHZhciBtYXJrTmFtZSA9IGdldEZpYmVyTWFya05hbWUobGFiZWwsIGRlYnVnSUQpO1xuICBiZWdpbk1hcmsobWFya05hbWUpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbnZhciBjbGVhckZpYmVyTWFyayA9IGZ1bmN0aW9uIChmaWJlciwgcGhhc2UpIHtcbiAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdVbmtub3duJztcbiAgdmFyIGRlYnVnSUQgPSBmaWJlci5fZGVidWdJRDtcbiAgdmFyIGlzTW91bnRlZCA9IGZpYmVyLmFsdGVybmF0ZSAhPT0gbnVsbDtcbiAgdmFyIGxhYmVsID0gZ2V0RmliZXJMYWJlbChjb21wb25lbnROYW1lLCBpc01vdW50ZWQsIHBoYXNlKTtcbiAgdmFyIG1hcmtOYW1lID0gZ2V0RmliZXJNYXJrTmFtZShsYWJlbCwgZGVidWdJRCk7XG4gIGNsZWFyTWFyayhtYXJrTmFtZSk7XG59O1xuXG52YXIgZW5kRmliZXJNYXJrID0gZnVuY3Rpb24gKGZpYmVyLCBwaGFzZSwgd2FybmluZykge1xuICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUoZmliZXIudHlwZSkgfHwgJ1Vua25vd24nO1xuICB2YXIgZGVidWdJRCA9IGZpYmVyLl9kZWJ1Z0lEO1xuICB2YXIgaXNNb3VudGVkID0gZmliZXIuYWx0ZXJuYXRlICE9PSBudWxsO1xuICB2YXIgbGFiZWwgPSBnZXRGaWJlckxhYmVsKGNvbXBvbmVudE5hbWUsIGlzTW91bnRlZCwgcGhhc2UpO1xuICB2YXIgbWFya05hbWUgPSBnZXRGaWJlck1hcmtOYW1lKGxhYmVsLCBkZWJ1Z0lEKTtcbiAgZW5kTWFyayhsYWJlbCwgbWFya05hbWUsIHdhcm5pbmcpO1xufTtcblxudmFyIHNob3VsZElnbm9yZUZpYmVyID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gIC8vIEhvc3QgY29tcG9uZW50cyBzaG91bGQgYmUgc2tpcHBlZCBpbiB0aGUgdGltZWxpbmUuXG4gIC8vIFdlIGNvdWxkIGNoZWNrIHR5cGVvZiBmaWJlci50eXBlLCBidXQgZG9lcyB0aGlzIHdvcmsgd2l0aCBSTj9cbiAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RSb290OlxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICBjYXNlIEZyYWdtZW50OlxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgIGNhc2UgTW9kZTpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbnZhciBjbGVhclBlbmRpbmdQaGFzZU1lYXN1cmVtZW50ID0gZnVuY3Rpb24gKCkge1xuICBpZiAoY3VycmVudFBoYXNlICE9PSBudWxsICYmIGN1cnJlbnRQaGFzZUZpYmVyICE9PSBudWxsKSB7XG4gICAgY2xlYXJGaWJlck1hcmsoY3VycmVudFBoYXNlRmliZXIsIGN1cnJlbnRQaGFzZSk7XG4gIH1cbiAgY3VycmVudFBoYXNlRmliZXIgPSBudWxsO1xuICBjdXJyZW50UGhhc2UgPSBudWxsO1xuICBoYXNTY2hlZHVsZWRVcGRhdGVJbkN1cnJlbnRQaGFzZSA9IGZhbHNlO1xufTtcblxudmFyIHBhdXNlVGltZXJzID0gZnVuY3Rpb24gKCkge1xuICAvLyBTdG9wcyBhbGwgY3VycmVudGx5IGFjdGl2ZSBtZWFzdXJlbWVudHMgc28gdGhhdCB0aGV5IGNhbiBiZSByZXN1bWVkXG4gIC8vIGlmIHdlIGNvbnRpbnVlIGluIGEgbGF0ZXIgZGVmZXJyZWQgbG9vcCBmcm9tIHRoZSBzYW1lIHVuaXQgb2Ygd29yay5cbiAgdmFyIGZpYmVyID0gY3VycmVudEZpYmVyO1xuICB3aGlsZSAoZmliZXIpIHtcbiAgICBpZiAoZmliZXIuX2RlYnVnSXNDdXJyZW50bHlUaW1pbmcpIHtcbiAgICAgIGVuZEZpYmVyTWFyayhmaWJlciwgbnVsbCwgbnVsbCk7XG4gICAgfVxuICAgIGZpYmVyID0gZmliZXIucmV0dXJuO1xuICB9XG59O1xuXG52YXIgcmVzdW1lVGltZXJzUmVjdXJzaXZlbHkgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgaWYgKGZpYmVyLnJldHVybiAhPT0gbnVsbCkge1xuICAgIHJlc3VtZVRpbWVyc1JlY3Vyc2l2ZWx5KGZpYmVyLnJldHVybik7XG4gIH1cbiAgaWYgKGZpYmVyLl9kZWJ1Z0lzQ3VycmVudGx5VGltaW5nKSB7XG4gICAgYmVnaW5GaWJlck1hcmsoZmliZXIsIG51bGwpO1xuICB9XG59O1xuXG52YXIgcmVzdW1lVGltZXJzID0gZnVuY3Rpb24gKCkge1xuICAvLyBSZXN1bWVzIGFsbCBtZWFzdXJlbWVudHMgdGhhdCB3ZXJlIGFjdGl2ZSBkdXJpbmcgdGhlIGxhc3QgZGVmZXJyZWQgbG9vcC5cbiAgaWYgKGN1cnJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgIHJlc3VtZVRpbWVyc1JlY3Vyc2l2ZWx5KGN1cnJlbnRGaWJlcik7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHJlY29yZEVmZmVjdCgpIHtcbiAgaWYgKGVuYWJsZVVzZXJUaW1pbmdBUEkpIHtcbiAgICBlZmZlY3RDb3VudEluQ3VycmVudENvbW1pdCsrO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlY29yZFNjaGVkdWxlVXBkYXRlKCkge1xuICBpZiAoZW5hYmxlVXNlclRpbWluZ0FQSSkge1xuICAgIGlmIChpc0NvbW1pdHRpbmcpIHtcbiAgICAgIGhhc1NjaGVkdWxlZFVwZGF0ZUluQ3VycmVudENvbW1pdCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChjdXJyZW50UGhhc2UgIT09IG51bGwgJiYgY3VycmVudFBoYXNlICE9PSAnY29tcG9uZW50V2lsbE1vdW50JyAmJiBjdXJyZW50UGhhc2UgIT09ICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJykge1xuICAgICAgaGFzU2NoZWR1bGVkVXBkYXRlSW5DdXJyZW50UGhhc2UgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydFJlcXVlc3RDYWxsYmFja1RpbWVyKCkge1xuICBpZiAoZW5hYmxlVXNlclRpbWluZ0FQSSkge1xuICAgIGlmIChzdXBwb3J0c1VzZXJUaW1pbmcgJiYgIWlzV2FpdGluZ0ZvckNhbGxiYWNrKSB7XG4gICAgICBpc1dhaXRpbmdGb3JDYWxsYmFjayA9IHRydWU7XG4gICAgICBiZWdpbk1hcmsoJyhXYWl0aW5nIGZvciBhc3luYyBjYWxsYmFjay4uLiknKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcFJlcXVlc3RDYWxsYmFja1RpbWVyKGRpZEV4cGlyZSwgZXhwaXJhdGlvblRpbWUpIHtcbiAgaWYgKGVuYWJsZVVzZXJUaW1pbmdBUEkpIHtcbiAgICBpZiAoc3VwcG9ydHNVc2VyVGltaW5nKSB7XG4gICAgICBpc1dhaXRpbmdGb3JDYWxsYmFjayA9IGZhbHNlO1xuICAgICAgdmFyIHdhcm5pbmcgPSBkaWRFeHBpcmUgPyAnUmVhY3Qgd2FzIGJsb2NrZWQgYnkgbWFpbiB0aHJlYWQnIDogbnVsbDtcbiAgICAgIGVuZE1hcmsoJyhXYWl0aW5nIGZvciBhc3luYyBjYWxsYmFjay4uLiB3aWxsIGZvcmNlIGZsdXNoIGluICcgKyBleHBpcmF0aW9uVGltZSArICcgbXMpJywgJyhXYWl0aW5nIGZvciBhc3luYyBjYWxsYmFjay4uLiknLCB3YXJuaW5nKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RhcnRXb3JrVGltZXIoZmliZXIpIHtcbiAgaWYgKGVuYWJsZVVzZXJUaW1pbmdBUEkpIHtcbiAgICBpZiAoIXN1cHBvcnRzVXNlclRpbWluZyB8fCBzaG91bGRJZ25vcmVGaWJlcihmaWJlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gSWYgd2UgcGF1c2UsIHRoaXMgaXMgdGhlIGZpYmVyIHRvIHVud2luZCBmcm9tLlxuICAgIGN1cnJlbnRGaWJlciA9IGZpYmVyO1xuICAgIGlmICghYmVnaW5GaWJlck1hcmsoZmliZXIsIG51bGwpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZpYmVyLl9kZWJ1Z0lzQ3VycmVudGx5VGltaW5nID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYW5jZWxXb3JrVGltZXIoZmliZXIpIHtcbiAgaWYgKGVuYWJsZVVzZXJUaW1pbmdBUEkpIHtcbiAgICBpZiAoIXN1cHBvcnRzVXNlclRpbWluZyB8fCBzaG91bGRJZ25vcmVGaWJlcihmaWJlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUmVtZW1iZXIgd2Ugc2hvdWxkbid0IGNvbXBsZXRlIG1lYXN1cmVtZW50IGZvciB0aGlzIGZpYmVyLlxuICAgIC8vIE90aGVyd2lzZSBmbGFtZWNoYXJ0IHdpbGwgYmUgZGVlcCBldmVuIGZvciBzbWFsbCB1cGRhdGVzLlxuICAgIGZpYmVyLl9kZWJ1Z0lzQ3VycmVudGx5VGltaW5nID0gZmFsc2U7XG4gICAgY2xlYXJGaWJlck1hcmsoZmliZXIsIG51bGwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0b3BXb3JrVGltZXIoZmliZXIpIHtcbiAgaWYgKGVuYWJsZVVzZXJUaW1pbmdBUEkpIHtcbiAgICBpZiAoIXN1cHBvcnRzVXNlclRpbWluZyB8fCBzaG91bGRJZ25vcmVGaWJlcihmaWJlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gSWYgd2UgcGF1c2UsIGl0cyBwYXJlbnQgaXMgdGhlIGZpYmVyIHRvIHVud2luZCBmcm9tLlxuICAgIGN1cnJlbnRGaWJlciA9IGZpYmVyLnJldHVybjtcbiAgICBpZiAoIWZpYmVyLl9kZWJ1Z0lzQ3VycmVudGx5VGltaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZpYmVyLl9kZWJ1Z0lzQ3VycmVudGx5VGltaW5nID0gZmFsc2U7XG4gICAgZW5kRmliZXJNYXJrKGZpYmVyLCBudWxsLCBudWxsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdG9wRmFpbGVkV29ya1RpbWVyKGZpYmVyKSB7XG4gIGlmIChlbmFibGVVc2VyVGltaW5nQVBJKSB7XG4gICAgaWYgKCFzdXBwb3J0c1VzZXJUaW1pbmcgfHwgc2hvdWxkSWdub3JlRmliZXIoZmliZXIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIElmIHdlIHBhdXNlLCBpdHMgcGFyZW50IGlzIHRoZSBmaWJlciB0byB1bndpbmQgZnJvbS5cbiAgICBjdXJyZW50RmliZXIgPSBmaWJlci5yZXR1cm47XG4gICAgaWYgKCFmaWJlci5fZGVidWdJc0N1cnJlbnRseVRpbWluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmaWJlci5fZGVidWdJc0N1cnJlbnRseVRpbWluZyA9IGZhbHNlO1xuICAgIHZhciB3YXJuaW5nID0gZmliZXIudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCB8fCBmaWJlci50YWcgPT09IERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudCA/ICdSZW5kZXJpbmcgd2FzIHN1c3BlbmRlZCcgOiAnQW4gZXJyb3Igd2FzIHRocm93biBpbnNpZGUgdGhpcyBlcnJvciBib3VuZGFyeSc7XG4gICAgZW5kRmliZXJNYXJrKGZpYmVyLCBudWxsLCB3YXJuaW5nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydFBoYXNlVGltZXIoZmliZXIsIHBoYXNlKSB7XG4gIGlmIChlbmFibGVVc2VyVGltaW5nQVBJKSB7XG4gICAgaWYgKCFzdXBwb3J0c1VzZXJUaW1pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2xlYXJQZW5kaW5nUGhhc2VNZWFzdXJlbWVudCgpO1xuICAgIGlmICghYmVnaW5GaWJlck1hcmsoZmliZXIsIHBoYXNlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjdXJyZW50UGhhc2VGaWJlciA9IGZpYmVyO1xuICAgIGN1cnJlbnRQaGFzZSA9IHBoYXNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0b3BQaGFzZVRpbWVyKCkge1xuICBpZiAoZW5hYmxlVXNlclRpbWluZ0FQSSkge1xuICAgIGlmICghc3VwcG9ydHNVc2VyVGltaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjdXJyZW50UGhhc2UgIT09IG51bGwgJiYgY3VycmVudFBoYXNlRmliZXIgIT09IG51bGwpIHtcbiAgICAgIHZhciB3YXJuaW5nID0gaGFzU2NoZWR1bGVkVXBkYXRlSW5DdXJyZW50UGhhc2UgPyAnU2NoZWR1bGVkIGEgY2FzY2FkaW5nIHVwZGF0ZScgOiBudWxsO1xuICAgICAgZW5kRmliZXJNYXJrKGN1cnJlbnRQaGFzZUZpYmVyLCBjdXJyZW50UGhhc2UsIHdhcm5pbmcpO1xuICAgIH1cbiAgICBjdXJyZW50UGhhc2UgPSBudWxsO1xuICAgIGN1cnJlbnRQaGFzZUZpYmVyID0gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydFdvcmtMb29wVGltZXIobmV4dFVuaXRPZldvcmspIHtcbiAgaWYgKGVuYWJsZVVzZXJUaW1pbmdBUEkpIHtcbiAgICBjdXJyZW50RmliZXIgPSBuZXh0VW5pdE9mV29yaztcbiAgICBpZiAoIXN1cHBvcnRzVXNlclRpbWluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb21taXRDb3VudEluQ3VycmVudFdvcmtMb29wID0gMDtcbiAgICAvLyBUaGlzIGlzIHRvcCBsZXZlbCBjYWxsLlxuICAgIC8vIEFueSBvdGhlciBtZWFzdXJlbWVudHMgYXJlIHBlcmZvcm1lZCB3aXRoaW4uXG4gICAgYmVnaW5NYXJrKCcoUmVhY3QgVHJlZSBSZWNvbmNpbGlhdGlvbiknKTtcbiAgICAvLyBSZXN1bWUgYW55IG1lYXN1cmVtZW50cyB0aGF0IHdlcmUgaW4gcHJvZ3Jlc3MgZHVyaW5nIHRoZSBsYXN0IGxvb3AuXG4gICAgcmVzdW1lVGltZXJzKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcFdvcmtMb29wVGltZXIoaW50ZXJydXB0ZWRCeSwgZGlkQ29tcGxldGVSb290KSB7XG4gIGlmIChlbmFibGVVc2VyVGltaW5nQVBJKSB7XG4gICAgaWYgKCFzdXBwb3J0c1VzZXJUaW1pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHdhcm5pbmcgPSBudWxsO1xuICAgIGlmIChpbnRlcnJ1cHRlZEJ5ICE9PSBudWxsKSB7XG4gICAgICBpZiAoaW50ZXJydXB0ZWRCeS50YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIHdhcm5pbmcgPSAnQSB0b3AtbGV2ZWwgdXBkYXRlIGludGVycnVwdGVkIHRoZSBwcmV2aW91cyByZW5kZXInO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKGludGVycnVwdGVkQnkudHlwZSkgfHwgJ1Vua25vd24nO1xuICAgICAgICB3YXJuaW5nID0gJ0FuIHVwZGF0ZSB0byAnICsgY29tcG9uZW50TmFtZSArICcgaW50ZXJydXB0ZWQgdGhlIHByZXZpb3VzIHJlbmRlcic7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb21taXRDb3VudEluQ3VycmVudFdvcmtMb29wID4gMSkge1xuICAgICAgd2FybmluZyA9ICdUaGVyZSB3ZXJlIGNhc2NhZGluZyB1cGRhdGVzJztcbiAgICB9XG4gICAgY29tbWl0Q291bnRJbkN1cnJlbnRXb3JrTG9vcCA9IDA7XG4gICAgdmFyIGxhYmVsID0gZGlkQ29tcGxldGVSb290ID8gJyhSZWFjdCBUcmVlIFJlY29uY2lsaWF0aW9uOiBDb21wbGV0ZWQgUm9vdCknIDogJyhSZWFjdCBUcmVlIFJlY29uY2lsaWF0aW9uOiBZaWVsZGVkKSc7XG4gICAgLy8gUGF1c2UgYW55IG1lYXN1cmVtZW50cyB1bnRpbCB0aGUgbmV4dCBsb29wLlxuICAgIHBhdXNlVGltZXJzKCk7XG4gICAgZW5kTWFyayhsYWJlbCwgJyhSZWFjdCBUcmVlIFJlY29uY2lsaWF0aW9uKScsIHdhcm5pbmcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0Q29tbWl0VGltZXIoKSB7XG4gIGlmIChlbmFibGVVc2VyVGltaW5nQVBJKSB7XG4gICAgaWYgKCFzdXBwb3J0c1VzZXJUaW1pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXNDb21taXR0aW5nID0gdHJ1ZTtcbiAgICBoYXNTY2hlZHVsZWRVcGRhdGVJbkN1cnJlbnRDb21taXQgPSBmYWxzZTtcbiAgICBsYWJlbHNJbkN1cnJlbnRDb21taXQuY2xlYXIoKTtcbiAgICBiZWdpbk1hcmsoJyhDb21taXR0aW5nIENoYW5nZXMpJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcENvbW1pdFRpbWVyKCkge1xuICBpZiAoZW5hYmxlVXNlclRpbWluZ0FQSSkge1xuICAgIGlmICghc3VwcG9ydHNVc2VyVGltaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHdhcm5pbmcgPSBudWxsO1xuICAgIGlmIChoYXNTY2hlZHVsZWRVcGRhdGVJbkN1cnJlbnRDb21taXQpIHtcbiAgICAgIHdhcm5pbmcgPSAnTGlmZWN5Y2xlIGhvb2sgc2NoZWR1bGVkIGEgY2FzY2FkaW5nIHVwZGF0ZSc7XG4gICAgfSBlbHNlIGlmIChjb21taXRDb3VudEluQ3VycmVudFdvcmtMb29wID4gMCkge1xuICAgICAgd2FybmluZyA9ICdDYXVzZWQgYnkgYSBjYXNjYWRpbmcgdXBkYXRlIGluIGVhcmxpZXIgY29tbWl0JztcbiAgICB9XG4gICAgaGFzU2NoZWR1bGVkVXBkYXRlSW5DdXJyZW50Q29tbWl0ID0gZmFsc2U7XG4gICAgY29tbWl0Q291bnRJbkN1cnJlbnRXb3JrTG9vcCsrO1xuICAgIGlzQ29tbWl0dGluZyA9IGZhbHNlO1xuICAgIGxhYmVsc0luQ3VycmVudENvbW1pdC5jbGVhcigpO1xuXG4gICAgZW5kTWFyaygnKENvbW1pdHRpbmcgQ2hhbmdlcyknLCAnKENvbW1pdHRpbmcgQ2hhbmdlcyknLCB3YXJuaW5nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydENvbW1pdFNuYXBzaG90RWZmZWN0c1RpbWVyKCkge1xuICBpZiAoZW5hYmxlVXNlclRpbWluZ0FQSSkge1xuICAgIGlmICghc3VwcG9ydHNVc2VyVGltaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVmZmVjdENvdW50SW5DdXJyZW50Q29tbWl0ID0gMDtcbiAgICBiZWdpbk1hcmsoJyhDb21taXR0aW5nIFNuYXBzaG90IEVmZmVjdHMpJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcENvbW1pdFNuYXBzaG90RWZmZWN0c1RpbWVyKCkge1xuICBpZiAoZW5hYmxlVXNlclRpbWluZ0FQSSkge1xuICAgIGlmICghc3VwcG9ydHNVc2VyVGltaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBjb3VudCA9IGVmZmVjdENvdW50SW5DdXJyZW50Q29tbWl0O1xuICAgIGVmZmVjdENvdW50SW5DdXJyZW50Q29tbWl0ID0gMDtcbiAgICBlbmRNYXJrKCcoQ29tbWl0dGluZyBTbmFwc2hvdCBFZmZlY3RzOiAnICsgY291bnQgKyAnIFRvdGFsKScsICcoQ29tbWl0dGluZyBTbmFwc2hvdCBFZmZlY3RzKScsIG51bGwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0Q29tbWl0SG9zdEVmZmVjdHNUaW1lcigpIHtcbiAgaWYgKGVuYWJsZVVzZXJUaW1pbmdBUEkpIHtcbiAgICBpZiAoIXN1cHBvcnRzVXNlclRpbWluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZmZlY3RDb3VudEluQ3VycmVudENvbW1pdCA9IDA7XG4gICAgYmVnaW5NYXJrKCcoQ29tbWl0dGluZyBIb3N0IEVmZmVjdHMpJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcENvbW1pdEhvc3RFZmZlY3RzVGltZXIoKSB7XG4gIGlmIChlbmFibGVVc2VyVGltaW5nQVBJKSB7XG4gICAgaWYgKCFzdXBwb3J0c1VzZXJUaW1pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGNvdW50ID0gZWZmZWN0Q291bnRJbkN1cnJlbnRDb21taXQ7XG4gICAgZWZmZWN0Q291bnRJbkN1cnJlbnRDb21taXQgPSAwO1xuICAgIGVuZE1hcmsoJyhDb21taXR0aW5nIEhvc3QgRWZmZWN0czogJyArIGNvdW50ICsgJyBUb3RhbCknLCAnKENvbW1pdHRpbmcgSG9zdCBFZmZlY3RzKScsIG51bGwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0Q29tbWl0TGlmZUN5Y2xlc1RpbWVyKCkge1xuICBpZiAoZW5hYmxlVXNlclRpbWluZ0FQSSkge1xuICAgIGlmICghc3VwcG9ydHNVc2VyVGltaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVmZmVjdENvdW50SW5DdXJyZW50Q29tbWl0ID0gMDtcbiAgICBiZWdpbk1hcmsoJyhDYWxsaW5nIExpZmVjeWNsZSBNZXRob2RzKScpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0b3BDb21taXRMaWZlQ3ljbGVzVGltZXIoKSB7XG4gIGlmIChlbmFibGVVc2VyVGltaW5nQVBJKSB7XG4gICAgaWYgKCFzdXBwb3J0c1VzZXJUaW1pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGNvdW50ID0gZWZmZWN0Q291bnRJbkN1cnJlbnRDb21taXQ7XG4gICAgZWZmZWN0Q291bnRJbkN1cnJlbnRDb21taXQgPSAwO1xuICAgIGVuZE1hcmsoJyhDYWxsaW5nIExpZmVjeWNsZSBNZXRob2RzOiAnICsgY291bnQgKyAnIFRvdGFsKScsICcoQ2FsbGluZyBMaWZlY3ljbGUgTWV0aG9kcyknLCBudWxsKTtcbiAgfVxufVxuXG52YXIgdmFsdWVTdGFjayA9IFtdO1xuXG52YXIgZmliZXJTdGFjayA9IHZvaWQgMDtcblxue1xuICBmaWJlclN0YWNrID0gW107XG59XG5cbnZhciBpbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjcmVhdGVDdXJzb3IoZGVmYXVsdFZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgY3VycmVudDogZGVmYXVsdFZhbHVlXG4gIH07XG59XG5cbmZ1bmN0aW9uIHBvcChjdXJzb3IsIGZpYmVyKSB7XG4gIGlmIChpbmRleCA8IDApIHtcbiAgICB7XG4gICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdVbmV4cGVjdGVkIHBvcC4nKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIGlmIChmaWJlciAhPT0gZmliZXJTdGFja1tpbmRleF0pIHtcbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1VuZXhwZWN0ZWQgRmliZXIgcG9wcGVkLicpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnNvci5jdXJyZW50ID0gdmFsdWVTdGFja1tpbmRleF07XG5cbiAgdmFsdWVTdGFja1tpbmRleF0gPSBudWxsO1xuXG4gIHtcbiAgICBmaWJlclN0YWNrW2luZGV4XSA9IG51bGw7XG4gIH1cblxuICBpbmRleC0tO1xufVxuXG5mdW5jdGlvbiBwdXNoKGN1cnNvciwgdmFsdWUsIGZpYmVyKSB7XG4gIGluZGV4Kys7XG5cbiAgdmFsdWVTdGFja1tpbmRleF0gPSBjdXJzb3IuY3VycmVudDtcblxuICB7XG4gICAgZmliZXJTdGFja1tpbmRleF0gPSBmaWJlcjtcbiAgfVxuXG4gIGN1cnNvci5jdXJyZW50ID0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNoZWNrVGhhdFN0YWNrSXNFbXB0eSgpIHtcbiAge1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ0V4cGVjdGVkIGFuIGVtcHR5IHN0YWNrLiBTb21ldGhpbmcgd2FzIG5vdCByZXNldCBwcm9wZXJseS4nKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRTdGFja0FmdGVyRmF0YWxFcnJvckluRGV2KCkge1xuICB7XG4gICAgaW5kZXggPSAtMTtcbiAgICB2YWx1ZVN0YWNrLmxlbmd0aCA9IDA7XG4gICAgZmliZXJTdGFjay5sZW5ndGggPSAwO1xuICB9XG59XG5cbnZhciB3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHQgPSB2b2lkIDA7XG5cbntcbiAgd2FybmVkQWJvdXRNaXNzaW5nR2V0Q2hpbGRDb250ZXh0ID0ge307XG59XG5cbnZhciBlbXB0eUNvbnRleHRPYmplY3QgPSB7fTtcbntcbiAgT2JqZWN0LmZyZWV6ZShlbXB0eUNvbnRleHRPYmplY3QpO1xufVxuXG4vLyBBIGN1cnNvciB0byB0aGUgY3VycmVudCBtZXJnZWQgY29udGV4dCBvYmplY3Qgb24gdGhlIHN0YWNrLlxudmFyIGNvbnRleHRTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihlbXB0eUNvbnRleHRPYmplY3QpO1xuLy8gQSBjdXJzb3IgdG8gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29udGV4dCBoYXMgY2hhbmdlZC5cbnZhciBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKGZhbHNlKTtcbi8vIEtlZXAgdHJhY2sgb2YgdGhlIHByZXZpb3VzIGNvbnRleHQgb2JqZWN0IHRoYXQgd2FzIG9uIHRoZSBzdGFjay5cbi8vIFdlIHVzZSB0aGlzIHRvIGdldCBhY2Nlc3MgdG8gdGhlIHBhcmVudCBjb250ZXh0IGFmdGVyIHdlIGhhdmUgYWxyZWFkeVxuLy8gcHVzaGVkIHRoZSBuZXh0IGNvbnRleHQgcHJvdmlkZXIsIGFuZCBub3cgbmVlZCB0byBtZXJnZSB0aGVpciBjb250ZXh0cy5cbnZhciBwcmV2aW91c0NvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbmZ1bmN0aW9uIGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBkaWRQdXNoT3duQ29udGV4dElmUHJvdmlkZXIpIHtcbiAgaWYgKGRpZFB1c2hPd25Db250ZXh0SWZQcm92aWRlciAmJiBpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgLy8gSWYgdGhlIGZpYmVyIGlzIGEgY29udGV4dCBwcm92aWRlciBpdHNlbGYsIHdoZW4gd2UgcmVhZCBpdHMgY29udGV4dFxuICAgIC8vIHdlIG1heSBoYXZlIGFscmVhZHkgcHVzaGVkIGl0cyBvd24gY2hpbGQgY29udGV4dCBvbiB0aGUgc3RhY2suIEEgY29udGV4dFxuICAgIC8vIHByb3ZpZGVyIHNob3VsZCBub3QgXCJzZWVcIiBpdHMgb3duIGNoaWxkIGNvbnRleHQuIFRoZXJlZm9yZSB3ZSByZWFkIHRoZVxuICAgIC8vIHByZXZpb3VzIChwYXJlbnQpIGNvbnRleHQgaW5zdGVhZCBmb3IgYSBjb250ZXh0IHByb3ZpZGVyLlxuICAgIHJldHVybiBwcmV2aW91c0NvbnRleHQ7XG4gIH1cbiAgcmV0dXJuIGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50O1xufVxuXG5mdW5jdGlvbiBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgbWFza2VkQ29udGV4dCkge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQgPSB1bm1hc2tlZENvbnRleHQ7XG4gIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0ID0gbWFza2VkQ29udGV4dDtcbn1cblxuZnVuY3Rpb24gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KSB7XG4gIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgdmFyIGNvbnRleHRUeXBlcyA9IHR5cGUuY29udGV4dFR5cGVzO1xuICBpZiAoIWNvbnRleHRUeXBlcykge1xuICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIH1cblxuICAvLyBBdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyB1bm1hc2tlZCBjb250ZXh0IGhhcyBjaGFuZ2VkLlxuICAvLyBGYWlsaW5nIHRvIGRvIHRoaXMgd2lsbCByZXN1bHQgaW4gdW5uZWNlc3NhcnkgY2FsbHMgdG8gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5cbiAgLy8gVGhpcyBtYXkgdHJpZ2dlciBpbmZpbml0ZSBsb29wcyBpZiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGNhbGxzIHNldFN0YXRlLlxuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0ID09PSB1bm1hc2tlZENvbnRleHQpIHtcbiAgICByZXR1cm4gaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ7XG4gIH1cblxuICB2YXIgY29udGV4dCA9IHt9O1xuICBmb3IgKHZhciBrZXkgaW4gY29udGV4dFR5cGVzKSB7XG4gICAgY29udGV4dFtrZXldID0gdW5tYXNrZWRDb250ZXh0W2tleV07XG4gIH1cblxuICB7XG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKHR5cGUpIHx8ICdVbmtub3duJztcbiAgICBjaGVja1Byb3BUeXBlcyhjb250ZXh0VHlwZXMsIGNvbnRleHQsICdjb250ZXh0JywgbmFtZSwgZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldik7XG4gIH1cblxuICAvLyBDYWNoZSB1bm1hc2tlZCBjb250ZXh0IHNvIHdlIGNhbiBhdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyBuZWNlc3NhcnkuXG4gIC8vIENvbnRleHQgaXMgY3JlYXRlZCBiZWZvcmUgdGhlIGNsYXNzIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQgc28gY2hlY2sgZm9yIGluc3RhbmNlLlxuICBpZiAoaW5zdGFuY2UpIHtcbiAgICBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgY29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gY29udGV4dDtcbn1cblxuZnVuY3Rpb24gaGFzQ29udGV4dENoYW5nZWQoKSB7XG4gIHJldHVybiBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLmN1cnJlbnQ7XG59XG5cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKHR5cGUpIHtcbiAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gdHlwZS5jaGlsZENvbnRleHRUeXBlcztcbiAgcmV0dXJuIGNoaWxkQ29udGV4dFR5cGVzICE9PSBudWxsICYmIGNoaWxkQ29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHBvcENvbnRleHQoZmliZXIpIHtcbiAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwb3BUb3BMZXZlbENvbnRleHRPYmplY3QoZmliZXIpIHtcbiAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGZpYmVyLCBjb250ZXh0LCBkaWRDaGFuZ2UpIHtcbiAgIShjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudCA9PT0gZW1wdHlDb250ZXh0T2JqZWN0KSA/IGludmFyaWFudChmYWxzZSwgJ1VuZXhwZWN0ZWQgY29udGV4dCBmb3VuZCBvbiBzdGFjay4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKSA6IHZvaWQgMDtcblxuICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciwgY29udGV4dCwgZmliZXIpO1xuICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzQ2hpbGRDb250ZXh0KGZpYmVyLCB0eXBlLCBwYXJlbnRDb250ZXh0KSB7XG4gIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gdHlwZS5jaGlsZENvbnRleHRUeXBlcztcblxuICAvLyBUT0RPIChidmF1Z2huKSBSZXBsYWNlIHRoaXMgYmVoYXZpb3Igd2l0aCBhbiBpbnZhcmlhbnQoKSBpbiB0aGUgZnV0dXJlLlxuICAvLyBJdCBoYXMgb25seSBiZWVuIGFkZGVkIGluIEZpYmVyIHRvIG1hdGNoIHRoZSAodW5pbnRlbnRpb25hbCkgYmVoYXZpb3IgaW4gU3RhY2suXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKHR5cGUpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCF3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHRbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgd2FybmVkQWJvdXRNaXNzaW5nR2V0Q2hpbGRDb250ZXh0W2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnJXMuY2hpbGRDb250ZXh0VHlwZXMgaXMgc3BlY2lmaWVkIGJ1dCB0aGVyZSBpcyBubyBnZXRDaGlsZENvbnRleHQoKSBtZXRob2QgJyArICdvbiB0aGUgaW5zdGFuY2UuIFlvdSBjYW4gZWl0aGVyIGRlZmluZSBnZXRDaGlsZENvbnRleHQoKSBvbiAlcyBvciByZW1vdmUgJyArICdjaGlsZENvbnRleHRUeXBlcyBmcm9tIGl0LicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFyZW50Q29udGV4dDtcbiAgfVxuXG4gIHZhciBjaGlsZENvbnRleHQgPSB2b2lkIDA7XG4gIHtcbiAgICBzZXRDdXJyZW50UGhhc2UoJ2dldENoaWxkQ29udGV4dCcpO1xuICB9XG4gIHN0YXJ0UGhhc2VUaW1lcihmaWJlciwgJ2dldENoaWxkQ29udGV4dCcpO1xuICBjaGlsZENvbnRleHQgPSBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQoKTtcbiAgc3RvcFBoYXNlVGltZXIoKTtcbiAge1xuICAgIHNldEN1cnJlbnRQaGFzZShudWxsKTtcbiAgfVxuICBmb3IgKHZhciBjb250ZXh0S2V5IGluIGNoaWxkQ29udGV4dCkge1xuICAgICEoY29udGV4dEtleSBpbiBjaGlsZENvbnRleHRUeXBlcykgPyBpbnZhcmlhbnQoZmFsc2UsICclcy5nZXRDaGlsZENvbnRleHQoKToga2V5IFwiJXNcIiBpcyBub3QgZGVmaW5lZCBpbiBjaGlsZENvbnRleHRUeXBlcy4nLCBnZXRDb21wb25lbnROYW1lKHR5cGUpIHx8ICdVbmtub3duJywgY29udGV4dEtleSkgOiB2b2lkIDA7XG4gIH1cbiAge1xuICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKSB8fCAnVW5rbm93bic7XG4gICAgY2hlY2tQcm9wVHlwZXMoY2hpbGRDb250ZXh0VHlwZXMsIGNoaWxkQ29udGV4dCwgJ2NoaWxkIGNvbnRleHQnLCBuYW1lLFxuICAgIC8vIEluIHByYWN0aWNlLCB0aGVyZSBpcyBvbmUgY2FzZSBpbiB3aGljaCB3ZSB3b24ndCBnZXQgYSBzdGFjay4gSXQncyB3aGVuXG4gICAgLy8gc29tZWJvZHkgY2FsbHMgdW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIoKSBhbmQgd2UgcHJvY2Vzc1xuICAgIC8vIGNvbnRleHQgZnJvbSB0aGUgcGFyZW50IGNvbXBvbmVudCBpbnN0YW5jZS4gVGhlIHN0YWNrIHdpbGwgYmUgbWlzc2luZ1xuICAgIC8vIGJlY2F1c2UgaXQncyBvdXRzaWRlIG9mIHRoZSByZWNvbmNpbGlhdGlvbiwgYW5kIHNvIHRoZSBwb2ludGVyIGhhcyBub3RcbiAgICAvLyBiZWVuIHNldC4gVGhpcyBpcyByYXJlIGFuZCBkb2Vzbid0IG1hdHRlci4gV2UnbGwgYWxzbyByZW1vdmUgdGhhdCBBUEkuXG4gICAgZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldik7XG4gIH1cblxuICByZXR1cm4gX2Fzc2lnbih7fSwgcGFyZW50Q29udGV4dCwgY2hpbGRDb250ZXh0KTtcbn1cblxuZnVuY3Rpb24gcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcykge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIC8vIFdlIHB1c2ggdGhlIGNvbnRleHQgYXMgZWFybHkgYXMgcG9zc2libGUgdG8gZW5zdXJlIHN0YWNrIGludGVncml0eS5cbiAgLy8gSWYgdGhlIGluc3RhbmNlIGRvZXMgbm90IGV4aXN0IHlldCwgd2Ugd2lsbCBwdXNoIG51bGwgYXQgZmlyc3QsXG4gIC8vIGFuZCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBsYXRlciB3aGVuIGludmFsaWRhdGluZyB0aGUgY29udGV4dC5cbiAgdmFyIG1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0ID0gaW5zdGFuY2UgJiYgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgfHwgZW1wdHlDb250ZXh0T2JqZWN0O1xuXG4gIC8vIFJlbWVtYmVyIHRoZSBwYXJlbnQgY29udGV4dCBzbyB3ZSBjYW4gbWVyZ2Ugd2l0aCBpdCBsYXRlci5cbiAgLy8gSW5oZXJpdCB0aGUgcGFyZW50J3MgZGlkLXBlcmZvcm0td29yayB2YWx1ZSB0byBhdm9pZCBpbmFkdmVydGVudGx5IGJsb2NraW5nIHVwZGF0ZXMuXG4gIHByZXZpb3VzQ29udGV4dCA9IGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50O1xuICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciwgbWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLmN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgdHlwZSwgZGlkQ2hhbmdlKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgIWluc3RhbmNlID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgdG8gaGF2ZSBhbiBpbnN0YW5jZSBieSB0aGlzIHBvaW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpIDogdm9pZCAwO1xuXG4gIGlmIChkaWRDaGFuZ2UpIHtcbiAgICAvLyBNZXJnZSBwYXJlbnQgYW5kIG93biBjb250ZXh0LlxuICAgIC8vIFNraXAgdGhpcyBpZiB3ZSdyZSBub3QgdXBkYXRpbmcgZHVlIHRvIHNDVS5cbiAgICAvLyBUaGlzIGF2b2lkcyB1bm5lY2Vzc2FyaWx5IHJlY29tcHV0aW5nIG1lbW9pemVkIHZhbHVlcy5cbiAgICB2YXIgbWVyZ2VkQ29udGV4dCA9IHByb2Nlc3NDaGlsZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHR5cGUsIHByZXZpb3VzQ29udGV4dCk7XG4gICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgPSBtZXJnZWRDb250ZXh0O1xuXG4gICAgLy8gUmVwbGFjZSB0aGUgb2xkIChvciBlbXB0eSkgY29udGV4dCB3aXRoIHRoZSBuZXcgb25lLlxuICAgIC8vIEl0IGlzIGltcG9ydGFudCB0byB1bndpbmQgdGhlIGNvbnRleHQgaW4gdGhlIHJldmVyc2Ugb3JkZXIuXG4gICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIHdvcmtJblByb2dyZXNzKTtcbiAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgLy8gTm93IHB1c2ggdGhlIG5ldyBjb250ZXh0IGFuZCBtYXJrIHRoYXQgaXQgaGFzIGNoYW5nZWQuXG4gICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lcmdlZENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgd29ya0luUHJvZ3Jlc3MpO1xuICB9IGVsc2Uge1xuICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRDaGFuZ2UsIHdvcmtJblByb2dyZXNzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcikge1xuICAvLyBDdXJyZW50bHkgdGhpcyBpcyBvbmx5IHVzZWQgd2l0aCByZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjsgbm90IHN1cmUgaWYgaXRcbiAgLy8gbWFrZXMgc2Vuc2UgZWxzZXdoZXJlXG4gICEoaXNGaWJlck1vdW50ZWQoZmliZXIpICYmIGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgc3VidHJlZSBwYXJlbnQgdG8gYmUgYSBtb3VudGVkIGNsYXNzIGNvbXBvbmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKSA6IHZvaWQgMDtcblxuICB2YXIgbm9kZSA9IGZpYmVyO1xuICBkbyB7XG4gICAgc3dpdGNoIChub2RlLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlLmNvbnRleHQ7XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIENvbXBvbmVudCA9IG5vZGUudHlwZTtcbiAgICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gIH0gd2hpbGUgKG5vZGUgIT09IG51bGwpO1xuICBpbnZhcmlhbnQoZmFsc2UsICdGb3VuZCB1bmV4cGVjdGVkIGRldGFjaGVkIHN1YnRyZWUgcGFyZW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG52YXIgb25Db21taXRGaWJlclJvb3QgPSBudWxsO1xudmFyIG9uQ29tbWl0RmliZXJVbm1vdW50ID0gbnVsbDtcbnZhciBoYXNMb2dnZWRFcnJvciA9IGZhbHNlO1xuXG5mdW5jdGlvbiBjYXRjaEVycm9ycyhmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKGFyZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZm4oYXJnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICh0cnVlICYmICFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG4gICAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1JlYWN0IERldlRvb2xzIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG52YXIgaXNEZXZUb29sc1ByZXNlbnQgPSB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJztcblxuZnVuY3Rpb24gaW5qZWN0SW50ZXJuYWxzKGludGVybmFscykge1xuICBpZiAodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBObyBEZXZUb29sc1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgaG9vayA9IF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcbiAgaWYgKGhvb2suaXNEaXNhYmxlZCkge1xuICAgIC8vIFRoaXMgaXNuJ3QgYSByZWFsIHByb3BlcnR5IG9uIHRoZSBob29rLCBidXQgaXQgY2FuIGJlIHNldCB0byBvcHQgb3V0XG4gICAgLy8gb2YgRGV2VG9vbHMgaW50ZWdyYXRpb24gYW5kIGFzc29jaWF0ZWQgd2FybmluZ3MgYW5kIGxvZ3MuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zODc3XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCFob29rLnN1cHBvcnRzRmliZXIpIHtcbiAgICB7XG4gICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdUaGUgaW5zdGFsbGVkIHZlcnNpb24gb2YgUmVhY3QgRGV2VG9vbHMgaXMgdG9vIG9sZCBhbmQgd2lsbCBub3Qgd29yayAnICsgJ3dpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBSZWFjdC4gUGxlYXNlIHVwZGF0ZSBSZWFjdCBEZXZUb29scy4gJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWRldnRvb2xzJyk7XG4gICAgfVxuICAgIC8vIERldlRvb2xzIGV4aXN0cywgZXZlbiB0aG91Z2ggaXQgZG9lc24ndCBzdXBwb3J0IEZpYmVyLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHRyeSB7XG4gICAgdmFyIHJlbmRlcmVySUQgPSBob29rLmluamVjdChpbnRlcm5hbHMpO1xuICAgIC8vIFdlIGhhdmUgc3VjY2Vzc2Z1bGx5IGluamVjdGVkLCBzbyBub3cgaXQgaXMgc2FmZSB0byBzZXQgdXAgaG9va3MuXG4gICAgb25Db21taXRGaWJlclJvb3QgPSBjYXRjaEVycm9ycyhmdW5jdGlvbiAocm9vdCkge1xuICAgICAgcmV0dXJuIGhvb2sub25Db21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCk7XG4gICAgfSk7XG4gICAgb25Db21taXRGaWJlclVubW91bnQgPSBjYXRjaEVycm9ycyhmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgIHJldHVybiBob29rLm9uQ29tbWl0RmliZXJVbm1vdW50KHJlbmRlcmVySUQsIGZpYmVyKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gQ2F0Y2ggYWxsIGVycm9ycyBiZWNhdXNlIGl0IGlzIHVuc2FmZSB0byB0aHJvdyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uXG4gICAge1xuICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnUmVhY3QgRGV2VG9vbHMgZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzLicsIGVycik7XG4gICAgfVxuICB9XG4gIC8vIERldlRvb2xzIGV4aXN0c1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gb25Db21taXRSb290KHJvb3QpIHtcbiAgaWYgKHR5cGVvZiBvbkNvbW1pdEZpYmVyUm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG9uQ29tbWl0RmliZXJSb290KHJvb3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9uQ29tbWl0VW5tb3VudChmaWJlcikge1xuICBpZiAodHlwZW9mIG9uQ29tbWl0RmliZXJVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgb25Db21taXRGaWJlclVubW91bnQoZmliZXIpO1xuICB9XG59XG5cbi8vIE1heCAzMSBiaXQgaW50ZWdlci4gVGhlIG1heCBpbnRlZ2VyIHNpemUgaW4gVjggZm9yIDMyLWJpdCBzeXN0ZW1zLlxuLy8gTWF0aC5wb3coMiwgMzApIC0gMVxuLy8gMGIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFcbnZhciBtYXhTaWduZWQzMUJpdEludCA9IDEwNzM3NDE4MjM7XG5cbnZhciBOb1dvcmsgPSAwO1xudmFyIE5ldmVyID0gMTtcbnZhciBTeW5jID0gbWF4U2lnbmVkMzFCaXRJbnQ7XG5cbnZhciBVTklUX1NJWkUgPSAxMDtcbnZhciBNQUdJQ19OVU1CRVJfT0ZGU0VUID0gbWF4U2lnbmVkMzFCaXRJbnQgLSAxO1xuXG4vLyAxIHVuaXQgb2YgZXhwaXJhdGlvbiB0aW1lIHJlcHJlc2VudHMgMTBtcy5cbmZ1bmN0aW9uIG1zVG9FeHBpcmF0aW9uVGltZShtcykge1xuICAvLyBBbHdheXMgYWRkIGFuIG9mZnNldCBzbyB0aGF0IHdlIGRvbid0IGNsYXNoIHdpdGggdGhlIG1hZ2ljIG51bWJlciBmb3IgTm9Xb3JrLlxuICByZXR1cm4gTUFHSUNfTlVNQkVSX09GRlNFVCAtIChtcyAvIFVOSVRfU0laRSB8IDApO1xufVxuXG5mdW5jdGlvbiBleHBpcmF0aW9uVGltZVRvTXMoZXhwaXJhdGlvblRpbWUpIHtcbiAgcmV0dXJuIChNQUdJQ19OVU1CRVJfT0ZGU0VUIC0gZXhwaXJhdGlvblRpbWUpICogVU5JVF9TSVpFO1xufVxuXG5mdW5jdGlvbiBjZWlsaW5nKG51bSwgcHJlY2lzaW9uKSB7XG4gIHJldHVybiAoKG51bSAvIHByZWNpc2lvbiB8IDApICsgMSkgKiBwcmVjaXNpb247XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVFeHBpcmF0aW9uQnVja2V0KGN1cnJlbnRUaW1lLCBleHBpcmF0aW9uSW5NcywgYnVja2V0U2l6ZU1zKSB7XG4gIHJldHVybiBNQUdJQ19OVU1CRVJfT0ZGU0VUIC0gY2VpbGluZyhNQUdJQ19OVU1CRVJfT0ZGU0VUIC0gY3VycmVudFRpbWUgKyBleHBpcmF0aW9uSW5NcyAvIFVOSVRfU0laRSwgYnVja2V0U2l6ZU1zIC8gVU5JVF9TSVpFKTtcbn1cblxudmFyIExPV19QUklPUklUWV9FWFBJUkFUSU9OID0gNTAwMDtcbnZhciBMT1dfUFJJT1JJVFlfQkFUQ0hfU0laRSA9IDI1MDtcblxuZnVuY3Rpb24gY29tcHV0ZUFzeW5jRXhwaXJhdGlvbihjdXJyZW50VGltZSkge1xuICByZXR1cm4gY29tcHV0ZUV4cGlyYXRpb25CdWNrZXQoY3VycmVudFRpbWUsIExPV19QUklPUklUWV9FWFBJUkFUSU9OLCBMT1dfUFJJT1JJVFlfQkFUQ0hfU0laRSk7XG59XG5cbi8vIFdlIGludGVudGlvbmFsbHkgc2V0IGEgaGlnaGVyIGV4cGlyYXRpb24gdGltZSBmb3IgaW50ZXJhY3RpdmUgdXBkYXRlcyBpblxuLy8gZGV2IHRoYW4gaW4gcHJvZHVjdGlvbi5cbi8vXG4vLyBJZiB0aGUgbWFpbiB0aHJlYWQgaXMgYmVpbmcgYmxvY2tlZCBzbyBsb25nIHRoYXQgeW91IGhpdCB0aGUgZXhwaXJhdGlvbixcbi8vIGl0J3MgYSBwcm9ibGVtIHRoYXQgY291bGQgYmUgc29sdmVkIHdpdGggYmV0dGVyIHNjaGVkdWxpbmcuXG4vL1xuLy8gUGVvcGxlIHdpbGwgYmUgbW9yZSBsaWtlbHkgdG8gbm90aWNlIHRoaXMgYW5kIGZpeCBpdCB3aXRoIHRoZSBsb25nXG4vLyBleHBpcmF0aW9uIHRpbWUgaW4gZGV2ZWxvcG1lbnQuXG4vL1xuLy8gSW4gcHJvZHVjdGlvbiB3ZSBvcHQgZm9yIGJldHRlciBVWCBhdCB0aGUgcmlzayBvZiBtYXNraW5nIHNjaGVkdWxpbmdcbi8vIHByb2JsZW1zLCBieSBleHBpcmluZyBmYXN0LlxudmFyIEhJR0hfUFJJT1JJVFlfRVhQSVJBVElPTiA9IDUwMDtcbnZhciBISUdIX1BSSU9SSVRZX0JBVENIX1NJWkUgPSAxMDA7XG5cbmZ1bmN0aW9uIGNvbXB1dGVJbnRlcmFjdGl2ZUV4cGlyYXRpb24oY3VycmVudFRpbWUpIHtcbiAgcmV0dXJuIGNvbXB1dGVFeHBpcmF0aW9uQnVja2V0KGN1cnJlbnRUaW1lLCBISUdIX1BSSU9SSVRZX0VYUElSQVRJT04sIEhJR0hfUFJJT1JJVFlfQkFUQ0hfU0laRSk7XG59XG5cbnZhciBOb0NvbnRleHQgPSAwO1xudmFyIENvbmN1cnJlbnRNb2RlID0gMTtcbnZhciBTdHJpY3RNb2RlID0gMjtcbnZhciBQcm9maWxlTW9kZSA9IDQ7XG5cbnZhciBoYXNCYWRNYXBQb2x5ZmlsbCA9IHZvaWQgMDtcblxue1xuICBoYXNCYWRNYXBQb2x5ZmlsbCA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBub25FeHRlbnNpYmxlT2JqZWN0ID0gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KTtcbiAgICB2YXIgdGVzdE1hcCA9IG5ldyBNYXAoW1tub25FeHRlbnNpYmxlT2JqZWN0LCBudWxsXV0pO1xuICAgIHZhciB0ZXN0U2V0ID0gbmV3IFNldChbbm9uRXh0ZW5zaWJsZU9iamVjdF0pO1xuICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBSb2xsdXAgdG8gbm90IGNvbnNpZGVyIHRoZXNlIHVudXNlZC5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcm9sbHVwL3JvbGx1cC9pc3N1ZXMvMTc3MVxuICAgIC8vIFRPRE86IHdlIGNhbiByZW1vdmUgdGhlc2UgaWYgUm9sbHVwIGZpeGVzIHRoZSBidWcuXG4gICAgdGVzdE1hcC5zZXQoMCwgMCk7XG4gICAgdGVzdFNldC5hZGQoMCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBUT0RPOiBDb25zaWRlciB3YXJuaW5nIGFib3V0IGJhZCBwb2x5ZmlsbHNcbiAgICBoYXNCYWRNYXBQb2x5ZmlsbCA9IHRydWU7XG4gIH1cbn1cblxuLy8gQSBGaWJlciBpcyB3b3JrIG9uIGEgQ29tcG9uZW50IHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBvciB3YXMgZG9uZS4gVGhlcmUgY2FuXG4vLyBiZSBtb3JlIHRoYW4gb25lIHBlciBjb21wb25lbnQuXG5cblxudmFyIGRlYnVnQ291bnRlciA9IHZvaWQgMDtcblxue1xuICBkZWJ1Z0NvdW50ZXIgPSAxO1xufVxuXG5mdW5jdGlvbiBGaWJlck5vZGUodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSkge1xuICAvLyBJbnN0YW5jZVxuICB0aGlzLnRhZyA9IHRhZztcbiAgdGhpcy5rZXkgPSBrZXk7XG4gIHRoaXMuZWxlbWVudFR5cGUgPSBudWxsO1xuICB0aGlzLnR5cGUgPSBudWxsO1xuICB0aGlzLnN0YXRlTm9kZSA9IG51bGw7XG5cbiAgLy8gRmliZXJcbiAgdGhpcy5yZXR1cm4gPSBudWxsO1xuICB0aGlzLmNoaWxkID0gbnVsbDtcbiAgdGhpcy5zaWJsaW5nID0gbnVsbDtcbiAgdGhpcy5pbmRleCA9IDA7XG5cbiAgdGhpcy5yZWYgPSBudWxsO1xuXG4gIHRoaXMucGVuZGluZ1Byb3BzID0gcGVuZGluZ1Byb3BzO1xuICB0aGlzLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICB0aGlzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgdGhpcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgdGhpcy5jb250ZXh0RGVwZW5kZW5jaWVzID0gbnVsbDtcblxuICB0aGlzLm1vZGUgPSBtb2RlO1xuXG4gIC8vIEVmZmVjdHNcbiAgdGhpcy5lZmZlY3RUYWcgPSBOb0VmZmVjdDtcbiAgdGhpcy5uZXh0RWZmZWN0ID0gbnVsbDtcblxuICB0aGlzLmZpcnN0RWZmZWN0ID0gbnVsbDtcbiAgdGhpcy5sYXN0RWZmZWN0ID0gbnVsbDtcblxuICB0aGlzLmV4cGlyYXRpb25UaW1lID0gTm9Xb3JrO1xuICB0aGlzLmNoaWxkRXhwaXJhdGlvblRpbWUgPSBOb1dvcms7XG5cbiAgdGhpcy5hbHRlcm5hdGUgPSBudWxsO1xuXG4gIGlmIChlbmFibGVQcm9maWxlclRpbWVyKSB7XG4gICAgLy8gTm90ZTogVGhlIGZvbGxvd2luZyBpcyBkb25lIHRvIGF2b2lkIGEgdjggcGVyZm9ybWFuY2UgY2xpZmYuXG4gICAgLy9cbiAgICAvLyBJbml0aWFsaXppbmcgdGhlIGZpZWxkcyBiZWxvdyB0byBzbWlzIGFuZCBsYXRlciB1cGRhdGluZyB0aGVtIHdpdGhcbiAgICAvLyBkb3VibGUgdmFsdWVzIHdpbGwgY2F1c2UgRmliZXJzIHRvIGVuZCB1cCBoYXZpbmcgc2VwYXJhdGUgc2hhcGVzLlxuICAgIC8vIFRoaXMgYmVoYXZpb3IvYnVnIGhhcyBzb21ldGhpbmcgdG8gZG8gd2l0aCBPYmplY3QucHJldmVudEV4dGVuc2lvbigpLlxuICAgIC8vIEZvcnR1bmF0ZWx5IHRoaXMgb25seSBpbXBhY3RzIERFViBidWlsZHMuXG4gICAgLy8gVW5mb3J0dW5hdGVseSBpdCBtYWtlcyBSZWFjdCB1bnVzYWJseSBzbG93IGZvciBzb21lIGFwcGxpY2F0aW9ucy5cbiAgICAvLyBUbyB3b3JrIGFyb3VuZCB0aGlzLCBpbml0aWFsaXplIHRoZSBmaWVsZHMgYmVsb3cgd2l0aCBkb3VibGVzLlxuICAgIC8vXG4gICAgLy8gTGVhcm4gbW9yZSBhYm91dCB0aGlzIGhlcmU6XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNDM2NVxuICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTg1MzhcbiAgICB0aGlzLmFjdHVhbER1cmF0aW9uID0gTnVtYmVyLk5hTjtcbiAgICB0aGlzLmFjdHVhbFN0YXJ0VGltZSA9IE51bWJlci5OYU47XG4gICAgdGhpcy5zZWxmQmFzZUR1cmF0aW9uID0gTnVtYmVyLk5hTjtcbiAgICB0aGlzLnRyZWVCYXNlRHVyYXRpb24gPSBOdW1iZXIuTmFOO1xuXG4gICAgLy8gSXQncyBva2F5IHRvIHJlcGxhY2UgdGhlIGluaXRpYWwgZG91YmxlcyB3aXRoIHNtaXMgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXG4gICAgLy8gVGhpcyB3b24ndCB0cmlnZ2VyIHRoZSBwZXJmb3JtYW5jZSBjbGlmZiBtZW50aW9uZWQgYWJvdmUsXG4gICAgLy8gYW5kIGl0IHNpbXBsaWZpZXMgb3RoZXIgcHJvZmlsZXIgY29kZSAoaW5jbHVkaW5nIERldlRvb2xzKS5cbiAgICB0aGlzLmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICB0aGlzLmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgIHRoaXMuc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgdGhpcy50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgfVxuXG4gIHtcbiAgICB0aGlzLl9kZWJ1Z0lEID0gZGVidWdDb3VudGVyKys7XG4gICAgdGhpcy5fZGVidWdTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuX2RlYnVnT3duZXIgPSBudWxsO1xuICAgIHRoaXMuX2RlYnVnSXNDdXJyZW50bHlUaW1pbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9kZWJ1Z0hvb2tUeXBlcyA9IG51bGw7XG4gICAgaWYgKCFoYXNCYWRNYXBQb2x5ZmlsbCAmJiB0eXBlb2YgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnModGhpcyk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRoaXMgaXMgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiwgcmF0aGVyIHRoYW4gYSBQT0pPIGNvbnN0cnVjdG9yLCBzdGlsbFxuLy8gcGxlYXNlIGVuc3VyZSB3ZSBkbyB0aGUgZm9sbG93aW5nOlxuLy8gMSkgTm9ib2R5IHNob3VsZCBhZGQgYW55IGluc3RhbmNlIG1ldGhvZHMgb24gdGhpcy4gSW5zdGFuY2UgbWV0aG9kcyBjYW4gYmVcbi8vICAgIG1vcmUgZGlmZmljdWx0IHRvIHByZWRpY3Qgd2hlbiB0aGV5IGdldCBvcHRpbWl6ZWQgYW5kIHRoZXkgYXJlIGFsbW9zdFxuLy8gICAgbmV2ZXIgaW5saW5lZCBwcm9wZXJseSBpbiBzdGF0aWMgY29tcGlsZXJzLlxuLy8gMikgTm9ib2R5IHNob3VsZCByZWx5IG9uIGBpbnN0YW5jZW9mIEZpYmVyYCBmb3IgdHlwZSB0ZXN0aW5nLiBXZSBzaG91bGRcbi8vICAgIGFsd2F5cyBrbm93IHdoZW4gaXQgaXMgYSBmaWJlci5cbi8vIDMpIFdlIG1pZ2h0IHdhbnQgdG8gZXhwZXJpbWVudCB3aXRoIHVzaW5nIG51bWVyaWMga2V5cyBzaW5jZSB0aGV5IGFyZSBlYXNpZXJcbi8vICAgIHRvIG9wdGltaXplIGluIGEgbm9uLUpJVCBlbnZpcm9ubWVudC5cbi8vIDQpIFdlIGNhbiBlYXNpbHkgZ28gZnJvbSBhIGNvbnN0cnVjdG9yIHRvIGEgY3JlYXRlRmliZXIgb2JqZWN0IGxpdGVyYWwgaWYgdGhhdFxuLy8gICAgaXMgZmFzdGVyLlxuLy8gNSkgSXQgc2hvdWxkIGJlIGVhc3kgdG8gcG9ydCB0aGlzIHRvIGEgQyBzdHJ1Y3QgYW5kIGtlZXAgYSBDIGltcGxlbWVudGF0aW9uXG4vLyAgICBjb21wYXRpYmxlLlxudmFyIGNyZWF0ZUZpYmVyID0gZnVuY3Rpb24gKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpIHtcbiAgLy8gJEZsb3dGaXhNZTogdGhlIHNoYXBlcyBhcmUgZXhhY3QgaGVyZSBidXQgRmxvdyBkb2Vzbid0IGxpa2UgY29uc3RydWN0b3JzXG4gIHJldHVybiBuZXcgRmliZXJOb2RlKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xufTtcblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGlzU2ltcGxlRnVuY3Rpb25Db21wb25lbnQodHlwZSkge1xuICByZXR1cm4gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgJiYgIXNob3VsZENvbnN0cnVjdCh0eXBlKSAmJiB0eXBlLmRlZmF1bHRQcm9wcyA9PT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlTGF6eUNvbXBvbmVudFRhZyhDb21wb25lbnQpIHtcbiAgaWYgKHR5cGVvZiBDb21wb25lbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkgPyBDbGFzc0NvbXBvbmVudCA6IEZ1bmN0aW9uQ29tcG9uZW50O1xuICB9IGVsc2UgaWYgKENvbXBvbmVudCAhPT0gdW5kZWZpbmVkICYmIENvbXBvbmVudCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IENvbXBvbmVudC4kJHR5cGVvZjtcbiAgICBpZiAoJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUpIHtcbiAgICAgIHJldHVybiBGb3J3YXJkUmVmO1xuICAgIH1cbiAgICBpZiAoJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgcmV0dXJuIE1lbW9Db21wb25lbnQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBJbmRldGVybWluYXRlQ29tcG9uZW50O1xufVxuXG4vLyBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIGFuIGFsdGVybmF0ZSBmaWJlciB0byBkbyB3b3JrIG9uLlxuZnVuY3Rpb24gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudCwgcGVuZGluZ1Byb3BzLCBleHBpcmF0aW9uVGltZSkge1xuICB2YXIgd29ya0luUHJvZ3Jlc3MgPSBjdXJyZW50LmFsdGVybmF0ZTtcbiAgaWYgKHdvcmtJblByb2dyZXNzID09PSBudWxsKSB7XG4gICAgLy8gV2UgdXNlIGEgZG91YmxlIGJ1ZmZlcmluZyBwb29saW5nIHRlY2huaXF1ZSBiZWNhdXNlIHdlIGtub3cgdGhhdCB3ZSdsbFxuICAgIC8vIG9ubHkgZXZlciBuZWVkIGF0IG1vc3QgdHdvIHZlcnNpb25zIG9mIGEgdHJlZS4gV2UgcG9vbCB0aGUgXCJvdGhlclwiIHVudXNlZFxuICAgIC8vIG5vZGUgdGhhdCB3ZSdyZSBmcmVlIHRvIHJldXNlLiBUaGlzIGlzIGxhemlseSBjcmVhdGVkIHRvIGF2b2lkIGFsbG9jYXRpbmdcbiAgICAvLyBleHRyYSBvYmplY3RzIGZvciB0aGluZ3MgdGhhdCBhcmUgbmV2ZXIgdXBkYXRlZC4gSXQgYWxzbyBhbGxvdyB1cyB0b1xuICAgIC8vIHJlY2xhaW0gdGhlIGV4dHJhIG1lbW9yeSBpZiBuZWVkZWQuXG4gICAgd29ya0luUHJvZ3Jlc3MgPSBjcmVhdGVGaWJlcihjdXJyZW50LnRhZywgcGVuZGluZ1Byb3BzLCBjdXJyZW50LmtleSwgY3VycmVudC5tb2RlKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9IGN1cnJlbnQuZWxlbWVudFR5cGU7XG4gICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjdXJyZW50LnN0YXRlTm9kZTtcblxuICAgIHtcbiAgICAgIC8vIERFVi1vbmx5IGZpZWxkc1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSUQgPSBjdXJyZW50Ll9kZWJ1Z0lEO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnU291cmNlID0gY3VycmVudC5fZGVidWdTb3VyY2U7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdPd25lciA9IGN1cnJlbnQuX2RlYnVnT3duZXI7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdIb29rVHlwZXMgPSBjdXJyZW50Ll9kZWJ1Z0hvb2tUeXBlcztcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBjdXJyZW50O1xuICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gd29ya0luUHJvZ3Jlc3M7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzID0gcGVuZGluZ1Byb3BzO1xuXG4gICAgLy8gV2UgYWxyZWFkeSBoYXZlIGFuIGFsdGVybmF0ZS5cbiAgICAvLyBSZXNldCB0aGUgZWZmZWN0IHRhZy5cbiAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgPSBOb0VmZmVjdDtcblxuICAgIC8vIFRoZSBlZmZlY3QgbGlzdCBpcyBubyBsb25nZXIgdmFsaWQuXG4gICAgd29ya0luUHJvZ3Jlc3MubmV4dEVmZmVjdCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmlyc3RFZmZlY3QgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLmxhc3RFZmZlY3QgPSBudWxsO1xuXG4gICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIpIHtcbiAgICAgIC8vIFdlIGludGVudGlvbmFsbHkgcmVzZXQsIHJhdGhlciB0aGFuIGNvcHksIGFjdHVhbER1cmF0aW9uICYgYWN0dWFsU3RhcnRUaW1lLlxuICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aW1lIGZyb20gZW5kbGVzc2x5IGFjY3VtdWxhdGluZyBpbiBuZXcgY29tbWl0cy5cbiAgICAgIC8vIFRoaXMgaGFzIHRoZSBkb3duc2lkZSBvZiByZXNldHRpbmcgdmFsdWVzIGZvciBkaWZmZXJlbnQgcHJpb3JpdHkgcmVuZGVycyxcbiAgICAgIC8vIEJ1dCB3b3JrcyBmb3IgeWllbGRpbmcgKHRoZSBjb21tb24gY2FzZSkgYW5kIHNob3VsZCBzdXBwb3J0IHJlc3VtaW5nLlxuICAgICAgd29ya0luUHJvZ3Jlc3MuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgfVxuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGRFeHBpcmF0aW9uVGltZSA9IGN1cnJlbnQuY2hpbGRFeHBpcmF0aW9uVGltZTtcbiAgd29ya0luUHJvZ3Jlc3MuZXhwaXJhdGlvblRpbWUgPSBjdXJyZW50LmV4cGlyYXRpb25UaW1lO1xuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuICB3b3JrSW5Qcm9ncmVzcy5jb250ZXh0RGVwZW5kZW5jaWVzID0gY3VycmVudC5jb250ZXh0RGVwZW5kZW5jaWVzO1xuXG4gIC8vIFRoZXNlIHdpbGwgYmUgb3ZlcnJpZGRlbiBkdXJpbmcgdGhlIHBhcmVudCdzIHJlY29uY2lsaWF0aW9uXG4gIHdvcmtJblByb2dyZXNzLnNpYmxpbmcgPSBjdXJyZW50LnNpYmxpbmc7XG4gIHdvcmtJblByb2dyZXNzLmluZGV4ID0gY3VycmVudC5pbmRleDtcbiAgd29ya0luUHJvZ3Jlc3MucmVmID0gY3VycmVudC5yZWY7XG5cbiAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIpIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50LnRyZWVCYXNlRHVyYXRpb247XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhvc3RSb290RmliZXIoaXNDb25jdXJyZW50KSB7XG4gIHZhciBtb2RlID0gaXNDb25jdXJyZW50ID8gQ29uY3VycmVudE1vZGUgfCBTdHJpY3RNb2RlIDogTm9Db250ZXh0O1xuXG4gIGlmIChlbmFibGVQcm9maWxlclRpbWVyICYmIGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgLy8gQWx3YXlzIGNvbGxlY3QgcHJvZmlsZSB0aW1pbmdzIHdoZW4gRGV2VG9vbHMgYXJlIHByZXNlbnQuXG4gICAgLy8gVGhpcyBlbmFibGVzIERldlRvb2xzIHRvIHN0YXJ0IGNhcHR1cmluZyB0aW1pbmcgYXQgYW55IHBvaW504oCTXG4gICAgLy8gV2l0aG91dCBzb21lIG5vZGVzIGluIHRoZSB0cmVlIGhhdmluZyBlbXB0eSBiYXNlIHRpbWVzLlxuICAgIG1vZGUgfD0gUHJvZmlsZU1vZGU7XG4gIH1cblxuICByZXR1cm4gY3JlYXRlRmliZXIoSG9zdFJvb3QsIG51bGwsIG51bGwsIG1vZGUpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHModHlwZSwgLy8gUmVhY3QkRWxlbWVudFR5cGVcbmtleSwgcGVuZGluZ1Byb3BzLCBvd25lciwgbW9kZSwgZXhwaXJhdGlvblRpbWUpIHtcbiAgdmFyIGZpYmVyID0gdm9pZCAwO1xuXG4gIHZhciBmaWJlclRhZyA9IEluZGV0ZXJtaW5hdGVDb21wb25lbnQ7XG4gIC8vIFRoZSByZXNvbHZlZCB0eXBlIGlzIHNldCBpZiB3ZSBrbm93IHdoYXQgdGhlIGZpbmFsIHR5cGUgd2lsbCBiZS4gSS5lLiBpdCdzIG5vdCBsYXp5LlxuICB2YXIgcmVzb2x2ZWRUeXBlID0gdHlwZTtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHNob3VsZENvbnN0cnVjdCh0eXBlKSkge1xuICAgICAgZmliZXJUYWcgPSBDbGFzc0NvbXBvbmVudDtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgZmliZXJUYWcgPSBIb3N0Q29tcG9uZW50O1xuICB9IGVsc2Uge1xuICAgIGdldFRhZzogc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21GcmFnbWVudChwZW5kaW5nUHJvcHMuY2hpbGRyZW4sIG1vZGUsIGV4cGlyYXRpb25UaW1lLCBrZXkpO1xuICAgICAgY2FzZSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbU1vZGUocGVuZGluZ1Byb3BzLCBtb2RlIHwgQ29uY3VycmVudE1vZGUgfCBTdHJpY3RNb2RlLCBleHBpcmF0aW9uVGltZSwga2V5KTtcbiAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbU1vZGUocGVuZGluZ1Byb3BzLCBtb2RlIHwgU3RyaWN0TW9kZSwgZXhwaXJhdGlvblRpbWUsIGtleSk7XG4gICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21Qcm9maWxlcihwZW5kaW5nUHJvcHMsIG1vZGUsIGV4cGlyYXRpb25UaW1lLCBrZXkpO1xuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2UocGVuZGluZ1Byb3BzLCBtb2RlLCBleHBpcmF0aW9uVGltZSwga2V5KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBDb250ZXh0UHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgY29uc3VtZXJcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IENvbnRleHRDb25zdW1lcjtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IEZvcndhcmRSZWY7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IE1lbW9Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IExhenlDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRUeXBlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBpbmZvID0gJyc7XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgXCIgKyAnbmFtZWQgaW1wb3J0cy4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG93bmVyTmFtZSA9IG93bmVyID8gZ2V0Q29tcG9uZW50TmFtZShvd25lci50eXBlKSA6IG51bGw7XG4gICAgICAgICAgICBpZiAob3duZXJOYW1lKSB7XG4gICAgICAgICAgICAgIGluZm8gKz0gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgb3duZXJOYW1lICsgJ2AuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaW52YXJpYW50KGZhbHNlLCAnRWxlbWVudCB0eXBlIGlzIGludmFsaWQ6IGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSBjb21wb25lbnRzKSBidXQgZ290OiAlcy4lcycsIHR5cGUgPT0gbnVsbCA/IHR5cGUgOiB0eXBlb2YgdHlwZSwgaW5mbyk7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmaWJlciA9IGNyZWF0ZUZpYmVyKGZpYmVyVGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gdHlwZTtcbiAgZmliZXIudHlwZSA9IHJlc29sdmVkVHlwZTtcbiAgZmliZXIuZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTtcblxuICByZXR1cm4gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoZWxlbWVudCwgbW9kZSwgZXhwaXJhdGlvblRpbWUpIHtcbiAgdmFyIG93bmVyID0gbnVsbDtcbiAge1xuICAgIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gIH1cbiAgdmFyIHR5cGUgPSBlbGVtZW50LnR5cGU7XG4gIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgdmFyIHBlbmRpbmdQcm9wcyA9IGVsZW1lbnQucHJvcHM7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh0eXBlLCBrZXksIHBlbmRpbmdQcm9wcywgb3duZXIsIG1vZGUsIGV4cGlyYXRpb25UaW1lKTtcbiAge1xuICAgIGZpYmVyLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICBmaWJlci5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICB9XG4gIHJldHVybiBmaWJlcjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZWxlbWVudHMsIG1vZGUsIGV4cGlyYXRpb25UaW1lLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoRnJhZ21lbnQsIGVsZW1lbnRzLCBrZXksIG1vZGUpO1xuICBmaWJlci5leHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lO1xuICByZXR1cm4gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVByb2ZpbGVyKHBlbmRpbmdQcm9wcywgbW9kZSwgZXhwaXJhdGlvblRpbWUsIGtleSkge1xuICB7XG4gICAgaWYgKHR5cGVvZiBwZW5kaW5nUHJvcHMuaWQgIT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwZW5kaW5nUHJvcHMub25SZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1Byb2ZpbGVyIG11c3Qgc3BlY2lmeSBhbiBcImlkXCIgc3RyaW5nIGFuZCBcIm9uUmVuZGVyXCIgZnVuY3Rpb24gYXMgcHJvcHMnKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihQcm9maWxlciwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUgfCBQcm9maWxlTW9kZSk7XG4gIC8vIFRPRE86IFRoZSBQcm9maWxlciBmaWJlciBzaG91bGRuJ3QgaGF2ZSBhIHR5cGUuIEl0IGhhcyBhIHRhZy5cbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuICBmaWJlci50eXBlID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbiAgZmliZXIuZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTtcblxuICByZXR1cm4gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbU1vZGUocGVuZGluZ1Byb3BzLCBtb2RlLCBleHBpcmF0aW9uVGltZSwga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKE1vZGUsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcblxuICAvLyBUT0RPOiBUaGUgTW9kZSBmaWJlciBzaG91bGRuJ3QgaGF2ZSBhIHR5cGUuIEl0IGhhcyBhIHRhZy5cbiAgdmFyIHR5cGUgPSAobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Db250ZXh0ID8gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA6IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IHR5cGU7XG4gIGZpYmVyLnR5cGUgPSB0eXBlO1xuXG4gIGZpYmVyLmV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gIHJldHVybiBmaWJlcjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2UocGVuZGluZ1Byb3BzLCBtb2RlLCBleHBpcmF0aW9uVGltZSwga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKFN1c3BlbnNlQ29tcG9uZW50LCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG5cbiAgLy8gVE9ETzogVGhlIFN1c3BlbnNlQ29tcG9uZW50IGZpYmVyIHNob3VsZG4ndCBoYXZlIGEgdHlwZS4gSXQgaGFzIGEgdGFnLlxuICB2YXIgdHlwZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gdHlwZTtcbiAgZmliZXIudHlwZSA9IHR5cGU7XG5cbiAgZmliZXIuZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTtcbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UZXh0KGNvbnRlbnQsIG1vZGUsIGV4cGlyYXRpb25UaW1lKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RUZXh0LCBjb250ZW50LCBudWxsLCBtb2RlKTtcbiAgZmliZXIuZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTtcbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21Ib3N0SW5zdGFuY2VGb3JEZWxldGlvbigpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoSG9zdENvbXBvbmVudCwgbnVsbCwgbnVsbCwgTm9Db250ZXh0KTtcbiAgLy8gVE9ETzogVGhlc2Ugc2hvdWxkIG5vdCBuZWVkIGEgdHlwZS5cbiAgZmliZXIuZWxlbWVudFR5cGUgPSAnREVMRVRFRCc7XG4gIGZpYmVyLnR5cGUgPSAnREVMRVRFRCc7XG4gIHJldHVybiBmaWJlcjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgbW9kZSwgZXhwaXJhdGlvblRpbWUpIHtcbiAgdmFyIHBlbmRpbmdQcm9wcyA9IHBvcnRhbC5jaGlsZHJlbiAhPT0gbnVsbCA/IHBvcnRhbC5jaGlsZHJlbiA6IFtdO1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihIb3N0UG9ydGFsLCBwZW5kaW5nUHJvcHMsIHBvcnRhbC5rZXksIG1vZGUpO1xuICBmaWJlci5leHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lO1xuICBmaWJlci5zdGF0ZU5vZGUgPSB7XG4gICAgY29udGFpbmVySW5mbzogcG9ydGFsLmNvbnRhaW5lckluZm8sXG4gICAgcGVuZGluZ0NoaWxkcmVuOiBudWxsLCAvLyBVc2VkIGJ5IHBlcnNpc3RlbnQgdXBkYXRlc1xuICAgIGltcGxlbWVudGF0aW9uOiBwb3J0YWwuaW1wbGVtZW50YXRpb25cbiAgfTtcbiAgcmV0dXJuIGZpYmVyO1xufVxuXG4vLyBVc2VkIGZvciBzdGFzaGluZyBXSVAgcHJvcGVydGllcyB0byByZXBsYXkgZmFpbGVkIHdvcmsgaW4gREVWLlxuZnVuY3Rpb24gYXNzaWduRmliZXJQcm9wZXJ0aWVzSW5ERVYodGFyZ2V0LCBzb3VyY2UpIHtcbiAgaWYgKHRhcmdldCA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgRmliZXIncyBpbml0aWFsIHByb3BlcnRpZXMgd2lsbCBhbHdheXMgYmUgb3ZlcndyaXR0ZW4uXG4gICAgLy8gV2Ugb25seSB1c2UgYSBGaWJlciB0byBlbnN1cmUgdGhlIHNhbWUgaGlkZGVuIGNsYXNzIHNvIERFViBpc24ndCBzbG93LlxuICAgIHRhcmdldCA9IGNyZWF0ZUZpYmVyKEluZGV0ZXJtaW5hdGVDb21wb25lbnQsIG51bGwsIG51bGwsIE5vQ29udGV4dCk7XG4gIH1cblxuICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgd3JpdHRlbiBhcyBhIGxpc3Qgb2YgYWxsIHByb3BlcnRpZXMuXG4gIC8vIFdlIHRyaWVkIHRvIHVzZSBPYmplY3QuYXNzaWduKCkgaW5zdGVhZCBidXQgdGhpcyBpcyBjYWxsZWQgaW5cbiAgLy8gdGhlIGhvdHRlc3QgcGF0aCwgYW5kIE9iamVjdC5hc3NpZ24oKSB3YXMgdG9vIHNsb3c6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTI1MDJcbiAgLy8gVGhpcyBjb2RlIGlzIERFVi1vbmx5IHNvIHNpemUgaXMgbm90IGEgY29uY2Vybi5cblxuICB0YXJnZXQudGFnID0gc291cmNlLnRhZztcbiAgdGFyZ2V0LmtleSA9IHNvdXJjZS5rZXk7XG4gIHRhcmdldC5lbGVtZW50VHlwZSA9IHNvdXJjZS5lbGVtZW50VHlwZTtcbiAgdGFyZ2V0LnR5cGUgPSBzb3VyY2UudHlwZTtcbiAgdGFyZ2V0LnN0YXRlTm9kZSA9IHNvdXJjZS5zdGF0ZU5vZGU7XG4gIHRhcmdldC5yZXR1cm4gPSBzb3VyY2UucmV0dXJuO1xuICB0YXJnZXQuY2hpbGQgPSBzb3VyY2UuY2hpbGQ7XG4gIHRhcmdldC5zaWJsaW5nID0gc291cmNlLnNpYmxpbmc7XG4gIHRhcmdldC5pbmRleCA9IHNvdXJjZS5pbmRleDtcbiAgdGFyZ2V0LnJlZiA9IHNvdXJjZS5yZWY7XG4gIHRhcmdldC5wZW5kaW5nUHJvcHMgPSBzb3VyY2UucGVuZGluZ1Byb3BzO1xuICB0YXJnZXQubWVtb2l6ZWRQcm9wcyA9IHNvdXJjZS5tZW1vaXplZFByb3BzO1xuICB0YXJnZXQudXBkYXRlUXVldWUgPSBzb3VyY2UudXBkYXRlUXVldWU7XG4gIHRhcmdldC5tZW1vaXplZFN0YXRlID0gc291cmNlLm1lbW9pemVkU3RhdGU7XG4gIHRhcmdldC5jb250ZXh0RGVwZW5kZW5jaWVzID0gc291cmNlLmNvbnRleHREZXBlbmRlbmNpZXM7XG4gIHRhcmdldC5tb2RlID0gc291cmNlLm1vZGU7XG4gIHRhcmdldC5lZmZlY3RUYWcgPSBzb3VyY2UuZWZmZWN0VGFnO1xuICB0YXJnZXQubmV4dEVmZmVjdCA9IHNvdXJjZS5uZXh0RWZmZWN0O1xuICB0YXJnZXQuZmlyc3RFZmZlY3QgPSBzb3VyY2UuZmlyc3RFZmZlY3Q7XG4gIHRhcmdldC5sYXN0RWZmZWN0ID0gc291cmNlLmxhc3RFZmZlY3Q7XG4gIHRhcmdldC5leHBpcmF0aW9uVGltZSA9IHNvdXJjZS5leHBpcmF0aW9uVGltZTtcbiAgdGFyZ2V0LmNoaWxkRXhwaXJhdGlvblRpbWUgPSBzb3VyY2UuY2hpbGRFeHBpcmF0aW9uVGltZTtcbiAgdGFyZ2V0LmFsdGVybmF0ZSA9IHNvdXJjZS5hbHRlcm5hdGU7XG4gIGlmIChlbmFibGVQcm9maWxlclRpbWVyKSB7XG4gICAgdGFyZ2V0LmFjdHVhbER1cmF0aW9uID0gc291cmNlLmFjdHVhbER1cmF0aW9uO1xuICAgIHRhcmdldC5hY3R1YWxTdGFydFRpbWUgPSBzb3VyY2UuYWN0dWFsU3RhcnRUaW1lO1xuICAgIHRhcmdldC5zZWxmQmFzZUR1cmF0aW9uID0gc291cmNlLnNlbGZCYXNlRHVyYXRpb247XG4gICAgdGFyZ2V0LnRyZWVCYXNlRHVyYXRpb24gPSBzb3VyY2UudHJlZUJhc2VEdXJhdGlvbjtcbiAgfVxuICB0YXJnZXQuX2RlYnVnSUQgPSBzb3VyY2UuX2RlYnVnSUQ7XG4gIHRhcmdldC5fZGVidWdTb3VyY2UgPSBzb3VyY2UuX2RlYnVnU291cmNlO1xuICB0YXJnZXQuX2RlYnVnT3duZXIgPSBzb3VyY2UuX2RlYnVnT3duZXI7XG4gIHRhcmdldC5fZGVidWdJc0N1cnJlbnRseVRpbWluZyA9IHNvdXJjZS5fZGVidWdJc0N1cnJlbnRseVRpbWluZztcbiAgdGFyZ2V0Ll9kZWJ1Z0hvb2tUeXBlcyA9IHNvdXJjZS5fZGVidWdIb29rVHlwZXM7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8vIFRPRE86IFRoaXMgc2hvdWxkIGJlIGxpZnRlZCBpbnRvIHRoZSByZW5kZXJlci5cblxuXG4vLyBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIG9ubHkgdXNlZCBieSBpbnRlcmFjdGlvbiB0cmFjaW5nIGJ1aWxkcy5cbi8vIFRoZXkgZW5hYmxlIGludGVyYWN0aW9ucyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlaXIgYXN5bmMgd29yayxcbi8vIEFuZCBleHBvc2UgaW50ZXJhY3Rpb24gbWV0YWRhdGEgdG8gdGhlIFJlYWN0IERldlRvb2xzIFByb2ZpbGVyIHBsdWdpbi5cbi8vIE5vdGUgdGhhdCB0aGVzZSBhdHRyaWJ1dGVzIGFyZSBvbmx5IGRlZmluZWQgd2hlbiB0aGUgZW5hYmxlU2NoZWR1bGVyVHJhY2luZyBmbGFnIGlzIGVuYWJsZWQuXG5cblxuLy8gRXhwb3J0ZWQgRmliZXJSb290IHR5cGUgaW5jbHVkZXMgYWxsIHByb3BlcnRpZXMsXG4vLyBUbyBhdm9pZCByZXF1aXJpbmcgcG90ZW50aWFsbHkgZXJyb3ItcHJvbmUgOmFueSBjYXN0cyB0aHJvdWdob3V0IHRoZSBwcm9qZWN0LlxuLy8gUHJvZmlsaW5nIHByb3BlcnRpZXMgYXJlIG9ubHkgc2FmZSB0byBhY2Nlc3MgaW4gcHJvZmlsaW5nIGJ1aWxkcyAod2hlbiBlbmFibGVTY2hlZHVsZXJUcmFjaW5nIGlzIHRydWUpLlxuLy8gVGhlIHR5cGVzIGFyZSBkZWZpbmVkIHNlcGFyYXRlbHkgd2l0aGluIHRoaXMgZmlsZSB0byBlbnN1cmUgdGhleSBzdGF5IGluIHN5bmMuXG4vLyAoV2UgZG9uJ3QgaGF2ZSB0byB1c2UgYW4gaW5saW5lIDphbnkgY2FzdCB3aGVuIGVuYWJsZVNjaGVkdWxlclRyYWNpbmcgaXMgZGlzYWJsZWQuKVxuXG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyUm9vdChjb250YWluZXJJbmZvLCBpc0NvbmN1cnJlbnQsIGh5ZHJhdGUpIHtcbiAgLy8gQ3ljbGljIGNvbnN0cnVjdGlvbi4gVGhpcyBjaGVhdHMgdGhlIHR5cGUgc3lzdGVtIHJpZ2h0IG5vdyBiZWNhdXNlXG4gIC8vIHN0YXRlTm9kZSBpcyBhbnkuXG4gIHZhciB1bmluaXRpYWxpemVkRmliZXIgPSBjcmVhdGVIb3N0Um9vdEZpYmVyKGlzQ29uY3VycmVudCk7XG5cbiAgdmFyIHJvb3QgPSB2b2lkIDA7XG4gIGlmIChlbmFibGVTY2hlZHVsZXJUcmFjaW5nKSB7XG4gICAgcm9vdCA9IHtcbiAgICAgIGN1cnJlbnQ6IHVuaW5pdGlhbGl6ZWRGaWJlcixcbiAgICAgIGNvbnRhaW5lckluZm86IGNvbnRhaW5lckluZm8sXG4gICAgICBwZW5kaW5nQ2hpbGRyZW46IG51bGwsXG5cbiAgICAgIGVhcmxpZXN0UGVuZGluZ1RpbWU6IE5vV29yayxcbiAgICAgIGxhdGVzdFBlbmRpbmdUaW1lOiBOb1dvcmssXG4gICAgICBlYXJsaWVzdFN1c3BlbmRlZFRpbWU6IE5vV29yayxcbiAgICAgIGxhdGVzdFN1c3BlbmRlZFRpbWU6IE5vV29yayxcbiAgICAgIGxhdGVzdFBpbmdlZFRpbWU6IE5vV29yayxcblxuICAgICAgcGluZ0NhY2hlOiBudWxsLFxuXG4gICAgICBkaWRFcnJvcjogZmFsc2UsXG5cbiAgICAgIHBlbmRpbmdDb21taXRFeHBpcmF0aW9uVGltZTogTm9Xb3JrLFxuICAgICAgZmluaXNoZWRXb3JrOiBudWxsLFxuICAgICAgdGltZW91dEhhbmRsZTogbm9UaW1lb3V0LFxuICAgICAgY29udGV4dDogbnVsbCxcbiAgICAgIHBlbmRpbmdDb250ZXh0OiBudWxsLFxuICAgICAgaHlkcmF0ZTogaHlkcmF0ZSxcbiAgICAgIG5leHRFeHBpcmF0aW9uVGltZVRvV29ya09uOiBOb1dvcmssXG4gICAgICBleHBpcmF0aW9uVGltZTogTm9Xb3JrLFxuICAgICAgZmlyc3RCYXRjaDogbnVsbCxcbiAgICAgIG5leHRTY2hlZHVsZWRSb290OiBudWxsLFxuXG4gICAgICBpbnRlcmFjdGlvblRocmVhZElEOiB0cmFjaW5nLnVuc3RhYmxlX2dldFRocmVhZElEKCksXG4gICAgICBtZW1vaXplZEludGVyYWN0aW9uczogbmV3IFNldCgpLFxuICAgICAgcGVuZGluZ0ludGVyYWN0aW9uTWFwOiBuZXcgTWFwKClcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJvb3QgPSB7XG4gICAgICBjdXJyZW50OiB1bmluaXRpYWxpemVkRmliZXIsXG4gICAgICBjb250YWluZXJJbmZvOiBjb250YWluZXJJbmZvLFxuICAgICAgcGVuZGluZ0NoaWxkcmVuOiBudWxsLFxuXG4gICAgICBwaW5nQ2FjaGU6IG51bGwsXG5cbiAgICAgIGVhcmxpZXN0UGVuZGluZ1RpbWU6IE5vV29yayxcbiAgICAgIGxhdGVzdFBlbmRpbmdUaW1lOiBOb1dvcmssXG4gICAgICBlYXJsaWVzdFN1c3BlbmRlZFRpbWU6IE5vV29yayxcbiAgICAgIGxhdGVzdFN1c3BlbmRlZFRpbWU6IE5vV29yayxcbiAgICAgIGxhdGVzdFBpbmdlZFRpbWU6IE5vV29yayxcblxuICAgICAgZGlkRXJyb3I6IGZhbHNlLFxuXG4gICAgICBwZW5kaW5nQ29tbWl0RXhwaXJhdGlvblRpbWU6IE5vV29yayxcbiAgICAgIGZpbmlzaGVkV29yazogbnVsbCxcbiAgICAgIHRpbWVvdXRIYW5kbGU6IG5vVGltZW91dCxcbiAgICAgIGNvbnRleHQ6IG51bGwsXG4gICAgICBwZW5kaW5nQ29udGV4dDogbnVsbCxcbiAgICAgIGh5ZHJhdGU6IGh5ZHJhdGUsXG4gICAgICBuZXh0RXhwaXJhdGlvblRpbWVUb1dvcmtPbjogTm9Xb3JrLFxuICAgICAgZXhwaXJhdGlvblRpbWU6IE5vV29yayxcbiAgICAgIGZpcnN0QmF0Y2g6IG51bGwsXG4gICAgICBuZXh0U2NoZWR1bGVkUm9vdDogbnVsbFxuICAgIH07XG4gIH1cblxuICB1bmluaXRpYWxpemVkRmliZXIuc3RhdGVOb2RlID0gcm9vdDtcblxuICAvLyBUaGUgcmVhc29uIGZvciB0aGUgd2F5IHRoZSBGbG93IHR5cGVzIGFyZSBzdHJ1Y3R1cmVkIGluIHRoaXMgZmlsZSxcbiAgLy8gSXMgdG8gYXZvaWQgbmVlZGluZyA6YW55IGNhc3RzIGV2ZXJ5d2hlcmUgaW50ZXJhY3Rpb24gdHJhY2luZyBmaWVsZHMgYXJlIHVzZWQuXG4gIC8vIFVuZm9ydHVuYXRlbHkgdGhhdCByZXF1aXJlcyBhbiA6YW55IGNhc3QgZm9yIG5vbi1pbnRlcmFjdGlvbiB0cmFjaW5nIGNhcGFibGUgYnVpbGRzLlxuICAvLyAkRmxvd0ZpeE1lIFJlbW92ZSB0aGlzIDphbnkgY2FzdCBhbmQgcmVwbGFjZSBpdCB3aXRoIHNvbWV0aGluZyBiZXR0ZXIuXG4gIHJldHVybiByb290O1xufVxuXG4vKipcbiAqIEZvcmtlZCBmcm9tIGZianMvd2FybmluZzpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mYmpzL2Jsb2IvZTY2YmEyMGFkNWJlNDMzZWI1NDQyM2YyYjA5N2Q4MjkzMjRkOWRlNi9wYWNrYWdlcy9mYmpzL3NyYy9fX2ZvcmtzX18vd2FybmluZy5qc1xuICpcbiAqIE9ubHkgY2hhbmdlIGlzIHdlIHVzZSBjb25zb2xlLndhcm4gaW5zdGVhZCBvZiBjb25zb2xlLmVycm9yLFxuICogYW5kIGRvIG5vdGhpbmcgd2hlbiAnY29uc29sZScgaXMgbm90IHN1cHBvcnRlZC5cbiAqIFRoaXMgcmVhbGx5IHNpbXBsaWZpZXMgdGhlIGNvZGUuXG4gKiAtLS1cbiAqIFNpbWlsYXIgdG8gaW52YXJpYW50IGJ1dCBvbmx5IGxvZ3MgYSB3YXJuaW5nIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldC5cbiAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gbG9nIGlzc3VlcyBpbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMgaW4gY3JpdGljYWxcbiAqIHBhdGhzLiBSZW1vdmluZyB0aGUgbG9nZ2luZyBjb2RlIGZvciBwcm9kdWN0aW9uIGVudmlyb25tZW50cyB3aWxsIGtlZXAgdGhlXG4gKiBzYW1lIGxvZ2ljIGFuZCBmb2xsb3cgdGhlIHNhbWUgY29kZSBwYXRocy5cbiAqL1xuXG52YXIgbG93UHJpb3JpdHlXYXJuaW5nID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgdmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICB9KTtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG5cbiAgbG93UHJpb3JpdHlXYXJuaW5nID0gZnVuY3Rpb24gKGNvbmRpdGlvbiwgZm9ybWF0KSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Bsb3dQcmlvcml0eVdhcm5pbmcoY29uZGl0aW9uLCBmb3JtYXQsIC4uLmFyZ3MpYCByZXF1aXJlcyBhIHdhcm5pbmcgJyArICdtZXNzYWdlIGFyZ3VtZW50Jyk7XG4gICAgfVxuICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMiA+IDIgPyBfbGVuMiAtIDIgOiAwKSwgX2tleTIgPSAyOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTIgLSAyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZy5hcHBseSh1bmRlZmluZWQsIFtmb3JtYXRdLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuICB9O1xufVxuXG52YXIgbG93UHJpb3JpdHlXYXJuaW5nJDEgPSBsb3dQcmlvcml0eVdhcm5pbmc7XG5cbnZhciBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncyA9IHtcbiAgZGlzY2FyZFBlbmRpbmdXYXJuaW5nczogZnVuY3Rpb24gKCkge30sXG4gIGZsdXNoUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZ3M6IGZ1bmN0aW9uICgpIHt9LFxuICBmbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5nczogZnVuY3Rpb24gKCkge30sXG4gIHJlY29yZERlcHJlY2F0aW9uV2FybmluZ3M6IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHt9LFxuICByZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5nczogZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge30sXG4gIHJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nOiBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7fSxcbiAgZmx1c2hMZWdhY3lDb250ZXh0V2FybmluZzogZnVuY3Rpb24gKCkge31cbn07XG5cbntcbiAgdmFyIExJRkVDWUNMRV9TVUdHRVNUSU9OUyA9IHtcbiAgICBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50OiAnY29tcG9uZW50RGlkTW91bnQnLFxuICAgIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzOiAnc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcycsXG4gICAgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGU6ICdjb21wb25lbnREaWRVcGRhdGUnXG4gIH07XG5cbiAgdmFyIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ1Vuc2FmZUxpZmVjeWNsZVdhcm5pbmdzID0gbmV3IE1hcCgpO1xuICB2YXIgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nID0gbmV3IE1hcCgpO1xuXG4gIC8vIFRyYWNrcyBjb21wb25lbnRzIHdlIGhhdmUgYWxyZWFkeSB3YXJuZWQgYWJvdXQuXG4gIHZhciBkaWRXYXJuQWJvdXREZXByZWNhdGVkTGlmZWN5Y2xlcyA9IG5ldyBTZXQoKTtcbiAgdmFyIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMgPSBuZXcgU2V0KCk7XG4gIHZhciBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0ID0gbmV3IFNldCgpO1xuXG4gIHZhciBzZXRUb1NvcnRlZFN0cmluZyA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGFycmF5LnB1c2godmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBhcnJheS5zb3J0KCkuam9pbignLCAnKTtcbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5kaXNjYXJkUGVuZGluZ1dhcm5pbmdzID0gZnVuY3Rpb24gKCkge1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1Vuc2FmZUxpZmVjeWNsZVdhcm5pbmdzID0gbmV3IE1hcCgpO1xuICAgIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZyA9IG5ldyBNYXAoKTtcbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICBwZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAobGlmZWN5Y2xlV2FybmluZ3NNYXAsIHN0cmljdFJvb3QpIHtcbiAgICAgIHZhciBsaWZlY3ljbGVzV2FybmluZ01lc3NhZ2VzID0gW107XG5cbiAgICAgIE9iamVjdC5rZXlzKGxpZmVjeWNsZVdhcm5pbmdzTWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChsaWZlY3ljbGUpIHtcbiAgICAgICAgdmFyIGxpZmVjeWNsZVdhcm5pbmdzID0gbGlmZWN5Y2xlV2FybmluZ3NNYXBbbGlmZWN5Y2xlXTtcbiAgICAgICAgaWYgKGxpZmVjeWNsZVdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB2YXIgY29tcG9uZW50TmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgbGlmZWN5Y2xlV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudE5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdmFyIGZvcm1hdHRlZCA9IGxpZmVjeWNsZS5yZXBsYWNlKCdVTlNBRkVfJywgJycpO1xuICAgICAgICAgIHZhciBzdWdnZXN0aW9uID0gTElGRUNZQ0xFX1NVR0dFU1RJT05TW2xpZmVjeWNsZV07XG4gICAgICAgICAgdmFyIHNvcnRlZENvbXBvbmVudE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoY29tcG9uZW50TmFtZXMpO1xuXG4gICAgICAgICAgbGlmZWN5Y2xlc1dhcm5pbmdNZXNzYWdlcy5wdXNoKGZvcm1hdHRlZCArICc6IFBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzIHRvIHVzZSAnICsgKHN1Z2dlc3Rpb24gKyAnIGluc3RlYWQ6ICcgKyBzb3J0ZWRDb21wb25lbnROYW1lcykpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGxpZmVjeWNsZXNXYXJuaW5nTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgc3RyaWN0Um9vdENvbXBvbmVudFN0YWNrID0gZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHN0cmljdFJvb3QpO1xuXG4gICAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1Vuc2FmZSBsaWZlY3ljbGUgbWV0aG9kcyB3ZXJlIGZvdW5kIHdpdGhpbiBhIHN0cmljdC1tb2RlIHRyZWU6JXMnICsgJ1xcblxcbiVzJyArICdcXG5cXG5MZWFybiBtb3JlIGFib3V0IHRoaXMgd2FybmluZyBoZXJlOicgKyAnXFxuaHR0cHM6Ly9mYi5tZS9yZWFjdC1zdHJpY3QtbW9kZS13YXJuaW5ncycsIHN0cmljdFJvb3RDb21wb25lbnRTdGFjaywgbGlmZWN5Y2xlc1dhcm5pbmdNZXNzYWdlcy5qb2luKCdcXG5cXG4nKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBwZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MgPSBuZXcgTWFwKCk7XG4gIH07XG5cbiAgdmFyIGZpbmRTdHJpY3RSb290ID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgdmFyIG1heWJlU3RyaWN0Um9vdCA9IG51bGw7XG5cbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuICAgIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgICBtYXliZVN0cmljdFJvb3QgPSBub2RlO1xuICAgICAgfVxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBtYXliZVN0cmljdFJvb3Q7XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciB1bmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICB1bmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyh1bmlxdWVOYW1lcyk7XG5cbiAgICAgIGxvd1ByaW9yaXR5V2FybmluZyQxKGZhbHNlLCAnY29tcG9uZW50V2lsbE1vdW50IGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uLiAnICsgJ1VzZSBjb21wb25lbnREaWRNb3VudCBpbnN0ZWFkLiBBcyBhIHRlbXBvcmFyeSB3b3JrYXJvdW5kLCAnICsgJ3lvdSBjYW4gcmVuYW1lIHRvIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQuJyArICdcXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnICsgJ1xcblxcbkxlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6JyArICdcXG5odHRwczovL2ZiLm1lL3JlYWN0LWFzeW5jLWNvbXBvbmVudC1saWZlY3ljbGUtaG9va3MnLCBzb3J0ZWROYW1lcyk7XG5cbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBfdW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIF91bmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgX3NvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoX3VuaXF1ZU5hbWVzKTtcblxuICAgICAgbG93UHJpb3JpdHlXYXJuaW5nJDEoZmFsc2UsICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uLiAnICsgJ1VzZSBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzIGluc3RlYWQuJyArICdcXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnICsgJ1xcblxcbkxlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6JyArICdcXG5odHRwczovL2ZiLm1lL3JlYWN0LWFzeW5jLWNvbXBvbmVudC1saWZlY3ljbGUtaG9va3MnLCBfc29ydGVkTmFtZXMpO1xuXG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgaWYgKHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIF91bmlxdWVOYW1lczIgPSBuZXcgU2V0KCk7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIF91bmlxdWVOYW1lczIuYWRkKGdldENvbXBvbmVudE5hbWUoZmliZXIudHlwZSkgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXREZXByZWNhdGVkTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcblxuICAgICAgdmFyIF9zb3J0ZWROYW1lczIgPSBzZXRUb1NvcnRlZFN0cmluZyhfdW5pcXVlTmFtZXMyKTtcblxuICAgICAgbG93UHJpb3JpdHlXYXJuaW5nJDEoZmFsc2UsICdjb21wb25lbnRXaWxsVXBkYXRlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uLiAnICsgJ1VzZSBjb21wb25lbnREaWRVcGRhdGUgaW5zdGVhZC4gQXMgYSB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCwgJyArICd5b3UgY2FuIHJlbmFtZSB0byBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZS4nICsgJ1xcblxcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycgKyAnXFxuXFxuTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTonICsgJ1xcbmh0dHBzOi8vZmIubWUvcmVhY3QtYXN5bmMtY29tcG9uZW50LWxpZmVjeWNsZS1ob29rcycsIF9zb3J0ZWROYW1lczIpO1xuXG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgfVxuICB9O1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZERlcHJlY2F0aW9uV2FybmluZ3MgPSBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7XG4gICAgLy8gRGVkdXAgc3RyYXRlZ3k6IFdhcm4gb25jZSBwZXIgY29tcG9uZW50LlxuICAgIGlmIChkaWRXYXJuQWJvdXREZXByZWNhdGVkTGlmZWN5Y2xlcy5oYXMoZmliZXIudHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEb24ndCB3YXJuIGFib3V0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cy5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZS5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHtcbiAgICB2YXIgc3RyaWN0Um9vdCA9IGZpbmRTdHJpY3RSb290KGZpYmVyKTtcbiAgICBpZiAoc3RyaWN0Um9vdCA9PT0gbnVsbCkge1xuICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnRXhwZWN0ZWQgdG8gZmluZCBhIFN0cmljdE1vZGUgY29tcG9uZW50IGluIGEgc3RyaWN0IG1vZGUgdHJlZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERlZHVwIHN0cmF0ZWd5OiBXYXJuIG9uY2UgcGVyIGNvbXBvbmVudC5cbiAgICAvLyBUaGlzIGlzIGRpZmZpY3VsdCB0byB0cmFjayBhbnkgb3RoZXIgd2F5IHNpbmNlIGNvbXBvbmVudCBuYW1lc1xuICAgIC8vIGFyZSBvZnRlbiB2YWd1ZSBhbmQgYXJlIGxpa2VseSB0byBjb2xsaWRlIGJldHdlZW4gM3JkIHBhcnR5IGxpYnJhcmllcy5cbiAgICAvLyBBbiBleHBhbmQgcHJvcGVydHkgaXMgcHJvYmFibHkgb2theSB0byB1c2UgaGVyZSBzaW5jZSBpdCdzIERFVi1vbmx5LFxuICAgIC8vIGFuZCB3aWxsIG9ubHkgYmUgc2V0IGluIHRoZSBldmVudCBvZiBzZXJpb3VzIHdhcm5pbmdzLlxuICAgIGlmIChkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmhhcyhmaWJlci50eXBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB3YXJuaW5nc0ZvclJvb3QgPSB2b2lkIDA7XG4gICAgaWYgKCFwZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MuaGFzKHN0cmljdFJvb3QpKSB7XG4gICAgICB3YXJuaW5nc0ZvclJvb3QgPSB7XG4gICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQ6IFtdLFxuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczogW10sXG4gICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlOiBbXVxuICAgICAgfTtcblxuICAgICAgcGVuZGluZ1Vuc2FmZUxpZmVjeWNsZVdhcm5pbmdzLnNldChzdHJpY3RSb290LCB3YXJuaW5nc0ZvclJvb3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuaW5nc0ZvclJvb3QgPSBwZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MuZ2V0KHN0cmljdFJvb3QpO1xuICAgIH1cblxuICAgIHZhciB1bnNhZmVMaWZlY3ljbGVzID0gW107XG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50Ll9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUgfHwgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVuc2FmZUxpZmVjeWNsZXMucHVzaCgnVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCcpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlIHx8IHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdW5zYWZlTGlmZWN5Y2xlcy5wdXNoKCdVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcycpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZS5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlIHx8IHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdW5zYWZlTGlmZWN5Y2xlcy5wdXNoKCdVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZScpO1xuICAgIH1cblxuICAgIGlmICh1bnNhZmVMaWZlY3ljbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHVuc2FmZUxpZmVjeWNsZXMuZm9yRWFjaChmdW5jdGlvbiAobGlmZWN5Y2xlKSB7XG4gICAgICAgIHdhcm5pbmdzRm9yUm9vdFtsaWZlY3ljbGVdLnB1c2goZmliZXIpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nID0gZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge1xuICAgIHZhciBzdHJpY3RSb290ID0gZmluZFN0cmljdFJvb3QoZmliZXIpO1xuICAgIGlmIChzdHJpY3RSb290ID09PSBudWxsKSB7XG4gICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdFeHBlY3RlZCB0byBmaW5kIGEgU3RyaWN0TW9kZSBjb21wb25lbnQgaW4gYSBzdHJpY3QgbW9kZSB0cmVlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRGVkdXAgc3RyYXRlZ3k6IFdhcm4gb25jZSBwZXIgY29tcG9uZW50LlxuICAgIGlmIChkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0LmhhcyhmaWJlci50eXBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB3YXJuaW5nc0ZvclJvb3QgPSBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuZ2V0KHN0cmljdFJvb3QpO1xuXG4gICAgaWYgKGZpYmVyLnR5cGUuY29udGV4dFR5cGVzICE9IG51bGwgfHwgZmliZXIudHlwZS5jaGlsZENvbnRleHRUeXBlcyAhPSBudWxsIHx8IGluc3RhbmNlICE9PSBudWxsICYmIHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh3YXJuaW5nc0ZvclJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3YXJuaW5nc0ZvclJvb3QgPSBbXTtcbiAgICAgICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nLnNldChzdHJpY3RSb290LCB3YXJuaW5nc0ZvclJvb3QpO1xuICAgICAgfVxuICAgICAgd2FybmluZ3NGb3JSb290LnB1c2goZmliZXIpO1xuICAgIH1cbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaExlZ2FjeUNvbnRleHRXYXJuaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlckFycmF5LCBzdHJpY3RSb290KSB7XG4gICAgICB2YXIgdW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgICBmaWJlckFycmF5LmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIHVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dC5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcblxuICAgICAgdmFyIHNvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcodW5pcXVlTmFtZXMpO1xuICAgICAgdmFyIHN0cmljdFJvb3RDb21wb25lbnRTdGFjayA9IGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChzdHJpY3RSb290KTtcblxuICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnTGVnYWN5IGNvbnRleHQgQVBJIGhhcyBiZWVuIGRldGVjdGVkIHdpdGhpbiBhIHN0cmljdC1tb2RlIHRyZWU6ICVzJyArICdcXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnICsgJ1xcblxcbkxlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6JyArICdcXG5odHRwczovL2ZiLm1lL3JlYWN0LXN0cmljdC1tb2RlLXdhcm5pbmdzJywgc3RyaWN0Um9vdENvbXBvbmVudFN0YWNrLCBzb3J0ZWROYW1lcyk7XG4gICAgfSk7XG4gIH07XG59XG5cbi8vIFRoaXMgbGV0cyB1cyBob29rIGludG8gRmliZXIgdG8gZGVidWcgd2hhdCBpdCdzIGRvaW5nLlxuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzgwMzMuXG4vLyBUaGlzIGlzIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLCBub3QgZXZlbiBmb3IgUmVhY3QgRGV2VG9vbHMuXG4vLyBZb3UgbWF5IG9ubHkgaW5qZWN0IGEgZGVidWdUb29sIGlmIHlvdSB3b3JrIG9uIFJlYWN0IEZpYmVyIGl0c2VsZi5cbnZhciBSZWFjdEZpYmVySW5zdHJ1bWVudGF0aW9uID0ge1xuICBkZWJ1Z1Rvb2w6IG51bGxcbn07XG5cbnZhciBSZWFjdEZpYmVySW5zdHJ1bWVudGF0aW9uXzEgPSBSZWFjdEZpYmVySW5zdHJ1bWVudGF0aW9uO1xuXG4vLyBUT0RPOiBPZmZzY3JlZW4gdXBkYXRlcyBzaG91bGQgbmV2ZXIgc3VzcGVuZC4gSG93ZXZlciwgYSBwcm9taXNlIHRoYXRcbi8vIHN1c3BlbmRlZCBpbnNpZGUgYW4gb2Zmc2NyZWVuIHN1YnRyZWUgc2hvdWxkIGJlIGFibGUgdG8gcGluZyBhdCB0aGUgcHJpb3JpdHlcbi8vIG9mIHRoZSBvdXRlciByZW5kZXIuXG5cbmZ1bmN0aW9uIG1hcmtQZW5kaW5nUHJpb3JpdHlMZXZlbChyb290LCBleHBpcmF0aW9uVGltZSkge1xuICAvLyBJZiB0aGVyZSdzIGEgZ2FwIGJldHdlZW4gY29tcGxldGluZyBhIGZhaWxlZCByb290IGFuZCByZXRyeWluZyBpdCxcbiAgLy8gYWRkaXRpb25hbCB1cGRhdGVzIG1heSBiZSBzY2hlZHVsZWQuIENsZWFyIGBkaWRFcnJvcmAsIGluIGNhc2UgdGhlIHVwZGF0ZVxuICAvLyBpcyBzdWZmaWNpZW50IHRvIGZpeCB0aGUgZXJyb3IuXG4gIHJvb3QuZGlkRXJyb3IgPSBmYWxzZTtcblxuICAvLyBVcGRhdGUgdGhlIGxhdGVzdCBhbmQgZWFybGllc3QgcGVuZGluZyB0aW1lc1xuICB2YXIgZWFybGllc3RQZW5kaW5nVGltZSA9IHJvb3QuZWFybGllc3RQZW5kaW5nVGltZTtcbiAgaWYgKGVhcmxpZXN0UGVuZGluZ1RpbWUgPT09IE5vV29yaykge1xuICAgIC8vIE5vIG90aGVyIHBlbmRpbmcgdXBkYXRlcy5cbiAgICByb290LmVhcmxpZXN0UGVuZGluZ1RpbWUgPSByb290LmxhdGVzdFBlbmRpbmdUaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGVhcmxpZXN0UGVuZGluZ1RpbWUgPCBleHBpcmF0aW9uVGltZSkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZWFybGllc3QgcGVuZGluZyB1cGRhdGUuXG4gICAgICByb290LmVhcmxpZXN0UGVuZGluZ1RpbWUgPSBleHBpcmF0aW9uVGltZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGxhdGVzdFBlbmRpbmdUaW1lID0gcm9vdC5sYXRlc3RQZW5kaW5nVGltZTtcbiAgICAgIGlmIChsYXRlc3RQZW5kaW5nVGltZSA+IGV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgdGhlIGxhdGVzdCBwZW5kaW5nIHVwZGF0ZVxuICAgICAgICByb290LmxhdGVzdFBlbmRpbmdUaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZpbmROZXh0RXhwaXJhdGlvblRpbWVUb1dvcmtPbihleHBpcmF0aW9uVGltZSwgcm9vdCk7XG59XG5cbmZ1bmN0aW9uIG1hcmtDb21taXR0ZWRQcmlvcml0eUxldmVscyhyb290LCBlYXJsaWVzdFJlbWFpbmluZ1RpbWUpIHtcbiAgcm9vdC5kaWRFcnJvciA9IGZhbHNlO1xuXG4gIGlmIChlYXJsaWVzdFJlbWFpbmluZ1RpbWUgPT09IE5vV29yaykge1xuICAgIC8vIEZhc3QgcGF0aC4gVGhlcmUncyBubyByZW1haW5pbmcgd29yay4gQ2xlYXIgZXZlcnl0aGluZy5cbiAgICByb290LmVhcmxpZXN0UGVuZGluZ1RpbWUgPSBOb1dvcms7XG4gICAgcm9vdC5sYXRlc3RQZW5kaW5nVGltZSA9IE5vV29yaztcbiAgICByb290LmVhcmxpZXN0U3VzcGVuZGVkVGltZSA9IE5vV29yaztcbiAgICByb290LmxhdGVzdFN1c3BlbmRlZFRpbWUgPSBOb1dvcms7XG4gICAgcm9vdC5sYXRlc3RQaW5nZWRUaW1lID0gTm9Xb3JrO1xuICAgIGZpbmROZXh0RXhwaXJhdGlvblRpbWVUb1dvcmtPbihOb1dvcmssIHJvb3QpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChlYXJsaWVzdFJlbWFpbmluZ1RpbWUgPCByb290LmxhdGVzdFBpbmdlZFRpbWUpIHtcbiAgICByb290LmxhdGVzdFBpbmdlZFRpbWUgPSBOb1dvcms7XG4gIH1cblxuICAvLyBMZXQncyBzZWUgaWYgdGhlIHByZXZpb3VzIGxhdGVzdCBrbm93biBwZW5kaW5nIGxldmVsIHdhcyBqdXN0IGZsdXNoZWQuXG4gIHZhciBsYXRlc3RQZW5kaW5nVGltZSA9IHJvb3QubGF0ZXN0UGVuZGluZ1RpbWU7XG4gIGlmIChsYXRlc3RQZW5kaW5nVGltZSAhPT0gTm9Xb3JrKSB7XG4gICAgaWYgKGxhdGVzdFBlbmRpbmdUaW1lID4gZWFybGllc3RSZW1haW5pbmdUaW1lKSB7XG4gICAgICAvLyBXZSd2ZSBmbHVzaGVkIGFsbCB0aGUga25vd24gcGVuZGluZyBsZXZlbHMuXG4gICAgICByb290LmVhcmxpZXN0UGVuZGluZ1RpbWUgPSByb290LmxhdGVzdFBlbmRpbmdUaW1lID0gTm9Xb3JrO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZWFybGllc3RQZW5kaW5nVGltZSA9IHJvb3QuZWFybGllc3RQZW5kaW5nVGltZTtcbiAgICAgIGlmIChlYXJsaWVzdFBlbmRpbmdUaW1lID4gZWFybGllc3RSZW1haW5pbmdUaW1lKSB7XG4gICAgICAgIC8vIFdlJ3ZlIGZsdXNoZWQgdGhlIGVhcmxpZXN0IGtub3duIHBlbmRpbmcgbGV2ZWwuIFNldCB0aGlzIHRvIHRoZVxuICAgICAgICAvLyBsYXRlc3QgcGVuZGluZyB0aW1lLlxuICAgICAgICByb290LmVhcmxpZXN0UGVuZGluZ1RpbWUgPSByb290LmxhdGVzdFBlbmRpbmdUaW1lO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIE5vdyBsZXQncyBoYW5kbGUgdGhlIGVhcmxpZXN0IHJlbWFpbmluZyBsZXZlbCBpbiB0aGUgd2hvbGUgdHJlZS4gV2UgbmVlZCB0b1xuICAvLyBkZWNpZGUgd2hldGhlciB0byB0cmVhdCBpdCBhcyBhIHBlbmRpbmcgbGV2ZWwgb3IgYXMgc3VzcGVuZGVkLiBDaGVja1xuICAvLyBpdCBmYWxscyB3aXRoaW4gdGhlIHJhbmdlIG9mIGtub3duIHN1c3BlbmRlZCBsZXZlbHMuXG5cbiAgdmFyIGVhcmxpZXN0U3VzcGVuZGVkVGltZSA9IHJvb3QuZWFybGllc3RTdXNwZW5kZWRUaW1lO1xuICBpZiAoZWFybGllc3RTdXNwZW5kZWRUaW1lID09PSBOb1dvcmspIHtcbiAgICAvLyBUaGVyZSdzIG5vIHN1c3BlbmRlZCB3b3JrLiBUcmVhdCB0aGUgZWFybGllc3QgcmVtYWluaW5nIGxldmVsIGFzIGFcbiAgICAvLyBwZW5kaW5nIGxldmVsLlxuICAgIG1hcmtQZW5kaW5nUHJpb3JpdHlMZXZlbChyb290LCBlYXJsaWVzdFJlbWFpbmluZ1RpbWUpO1xuICAgIGZpbmROZXh0RXhwaXJhdGlvblRpbWVUb1dvcmtPbihOb1dvcmssIHJvb3QpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBsYXRlc3RTdXNwZW5kZWRUaW1lID0gcm9vdC5sYXRlc3RTdXNwZW5kZWRUaW1lO1xuICBpZiAoZWFybGllc3RSZW1haW5pbmdUaW1lIDwgbGF0ZXN0U3VzcGVuZGVkVGltZSkge1xuICAgIC8vIFRoZSBlYXJsaWVzdCByZW1haW5pbmcgbGV2ZWwgaXMgbGF0ZXIgdGhhbiBhbGwgdGhlIHN1c3BlbmRlZCB3b3JrLiBUaGF0XG4gICAgLy8gbWVhbnMgd2UndmUgZmx1c2hlZCBhbGwgdGhlIHN1c3BlbmRlZCB3b3JrLlxuICAgIHJvb3QuZWFybGllc3RTdXNwZW5kZWRUaW1lID0gTm9Xb3JrO1xuICAgIHJvb3QubGF0ZXN0U3VzcGVuZGVkVGltZSA9IE5vV29yaztcbiAgICByb290LmxhdGVzdFBpbmdlZFRpbWUgPSBOb1dvcms7XG5cbiAgICAvLyBUaGVyZSdzIG5vIHN1c3BlbmRlZCB3b3JrLiBUcmVhdCB0aGUgZWFybGllc3QgcmVtYWluaW5nIGxldmVsIGFzIGFcbiAgICAvLyBwZW5kaW5nIGxldmVsLlxuICAgIG1hcmtQZW5kaW5nUHJpb3JpdHlMZXZlbChyb290LCBlYXJsaWVzdFJlbWFpbmluZ1RpbWUpO1xuICAgIGZpbmROZXh0RXhwaXJhdGlvblRpbWVUb1dvcmtPbihOb1dvcmssIHJvb3QpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChlYXJsaWVzdFJlbWFpbmluZ1RpbWUgPiBlYXJsaWVzdFN1c3BlbmRlZFRpbWUpIHtcbiAgICAvLyBUaGUgZWFybGllc3QgcmVtYWluaW5nIHRpbWUgaXMgZWFybGllciB0aGFuIGFsbCB0aGUgc3VzcGVuZGVkIHdvcmsuXG4gICAgLy8gVHJlYXQgaXQgYXMgYSBwZW5kaW5nIHVwZGF0ZS5cbiAgICBtYXJrUGVuZGluZ1ByaW9yaXR5TGV2ZWwocm9vdCwgZWFybGllc3RSZW1haW5pbmdUaW1lKTtcbiAgICBmaW5kTmV4dEV4cGlyYXRpb25UaW1lVG9Xb3JrT24oTm9Xb3JrLCByb290KTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUaGUgZWFybGllc3QgcmVtYWluaW5nIHRpbWUgZmFsbHMgd2l0aGluIHRoZSByYW5nZSBvZiBrbm93biBzdXNwZW5kZWRcbiAgLy8gbGV2ZWxzLiBXZSBzaG91bGQgdHJlYXQgdGhpcyBhcyBzdXNwZW5kZWQgd29yay5cbiAgZmluZE5leHRFeHBpcmF0aW9uVGltZVRvV29ya09uKE5vV29yaywgcm9vdCk7XG59XG5cbmZ1bmN0aW9uIGhhc0xvd2VyUHJpb3JpdHlXb3JrKHJvb3QsIGVycm9yZWRFeHBpcmF0aW9uVGltZSkge1xuICB2YXIgbGF0ZXN0UGVuZGluZ1RpbWUgPSByb290LmxhdGVzdFBlbmRpbmdUaW1lO1xuICB2YXIgbGF0ZXN0U3VzcGVuZGVkVGltZSA9IHJvb3QubGF0ZXN0U3VzcGVuZGVkVGltZTtcbiAgdmFyIGxhdGVzdFBpbmdlZFRpbWUgPSByb290LmxhdGVzdFBpbmdlZFRpbWU7XG4gIHJldHVybiBsYXRlc3RQZW5kaW5nVGltZSAhPT0gTm9Xb3JrICYmIGxhdGVzdFBlbmRpbmdUaW1lIDwgZXJyb3JlZEV4cGlyYXRpb25UaW1lIHx8IGxhdGVzdFN1c3BlbmRlZFRpbWUgIT09IE5vV29yayAmJiBsYXRlc3RTdXNwZW5kZWRUaW1lIDwgZXJyb3JlZEV4cGlyYXRpb25UaW1lIHx8IGxhdGVzdFBpbmdlZFRpbWUgIT09IE5vV29yayAmJiBsYXRlc3RQaW5nZWRUaW1lIDwgZXJyb3JlZEV4cGlyYXRpb25UaW1lO1xufVxuXG5mdW5jdGlvbiBpc1ByaW9yaXR5TGV2ZWxTdXNwZW5kZWQocm9vdCwgZXhwaXJhdGlvblRpbWUpIHtcbiAgdmFyIGVhcmxpZXN0U3VzcGVuZGVkVGltZSA9IHJvb3QuZWFybGllc3RTdXNwZW5kZWRUaW1lO1xuICB2YXIgbGF0ZXN0U3VzcGVuZGVkVGltZSA9IHJvb3QubGF0ZXN0U3VzcGVuZGVkVGltZTtcbiAgcmV0dXJuIGVhcmxpZXN0U3VzcGVuZGVkVGltZSAhPT0gTm9Xb3JrICYmIGV4cGlyYXRpb25UaW1lIDw9IGVhcmxpZXN0U3VzcGVuZGVkVGltZSAmJiBleHBpcmF0aW9uVGltZSA+PSBsYXRlc3RTdXNwZW5kZWRUaW1lO1xufVxuXG5mdW5jdGlvbiBtYXJrU3VzcGVuZGVkUHJpb3JpdHlMZXZlbChyb290LCBzdXNwZW5kZWRUaW1lKSB7XG4gIHJvb3QuZGlkRXJyb3IgPSBmYWxzZTtcbiAgY2xlYXJQaW5nKHJvb3QsIHN1c3BlbmRlZFRpbWUpO1xuXG4gIC8vIEZpcnN0LCBjaGVjayB0aGUga25vd24gcGVuZGluZyBsZXZlbHMgYW5kIHVwZGF0ZSB0aGVtIGlmIG5lZWRlZC5cbiAgdmFyIGVhcmxpZXN0UGVuZGluZ1RpbWUgPSByb290LmVhcmxpZXN0UGVuZGluZ1RpbWU7XG4gIHZhciBsYXRlc3RQZW5kaW5nVGltZSA9IHJvb3QubGF0ZXN0UGVuZGluZ1RpbWU7XG4gIGlmIChlYXJsaWVzdFBlbmRpbmdUaW1lID09PSBzdXNwZW5kZWRUaW1lKSB7XG4gICAgaWYgKGxhdGVzdFBlbmRpbmdUaW1lID09PSBzdXNwZW5kZWRUaW1lKSB7XG4gICAgICAvLyBCb3RoIGtub3duIHBlbmRpbmcgbGV2ZWxzIHdlcmUgc3VzcGVuZGVkLiBDbGVhciB0aGVtLlxuICAgICAgcm9vdC5lYXJsaWVzdFBlbmRpbmdUaW1lID0gcm9vdC5sYXRlc3RQZW5kaW5nVGltZSA9IE5vV29yaztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIGVhcmxpZXN0IHBlbmRpbmcgbGV2ZWwgd2FzIHN1c3BlbmRlZC4gQ2xlYXIgYnkgc2V0dGluZyBpdCB0byB0aGVcbiAgICAgIC8vIGxhdGVzdCBwZW5kaW5nIGxldmVsLlxuICAgICAgcm9vdC5lYXJsaWVzdFBlbmRpbmdUaW1lID0gbGF0ZXN0UGVuZGluZ1RpbWU7XG4gICAgfVxuICB9IGVsc2UgaWYgKGxhdGVzdFBlbmRpbmdUaW1lID09PSBzdXNwZW5kZWRUaW1lKSB7XG4gICAgLy8gVGhlIGxhdGVzdCBwZW5kaW5nIGxldmVsIHdhcyBzdXNwZW5kZWQuIENsZWFyIGJ5IHNldHRpbmcgaXQgdG8gdGhlXG4gICAgLy8gbGF0ZXN0IHBlbmRpbmcgbGV2ZWwuXG4gICAgcm9vdC5sYXRlc3RQZW5kaW5nVGltZSA9IGVhcmxpZXN0UGVuZGluZ1RpbWU7XG4gIH1cblxuICAvLyBGaW5hbGx5LCB1cGRhdGUgdGhlIGtub3duIHN1c3BlbmRlZCBsZXZlbHMuXG4gIHZhciBlYXJsaWVzdFN1c3BlbmRlZFRpbWUgPSByb290LmVhcmxpZXN0U3VzcGVuZGVkVGltZTtcbiAgdmFyIGxhdGVzdFN1c3BlbmRlZFRpbWUgPSByb290LmxhdGVzdFN1c3BlbmRlZFRpbWU7XG4gIGlmIChlYXJsaWVzdFN1c3BlbmRlZFRpbWUgPT09IE5vV29yaykge1xuICAgIC8vIE5vIG90aGVyIHN1c3BlbmRlZCBsZXZlbHMuXG4gICAgcm9vdC5lYXJsaWVzdFN1c3BlbmRlZFRpbWUgPSByb290LmxhdGVzdFN1c3BlbmRlZFRpbWUgPSBzdXNwZW5kZWRUaW1lO1xuICB9IGVsc2Uge1xuICAgIGlmIChlYXJsaWVzdFN1c3BlbmRlZFRpbWUgPCBzdXNwZW5kZWRUaW1lKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBlYXJsaWVzdCBzdXNwZW5kZWQgbGV2ZWwuXG4gICAgICByb290LmVhcmxpZXN0U3VzcGVuZGVkVGltZSA9IHN1c3BlbmRlZFRpbWU7XG4gICAgfSBlbHNlIGlmIChsYXRlc3RTdXNwZW5kZWRUaW1lID4gc3VzcGVuZGVkVGltZSkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgbGF0ZXN0IHN1c3BlbmRlZCBsZXZlbFxuICAgICAgcm9vdC5sYXRlc3RTdXNwZW5kZWRUaW1lID0gc3VzcGVuZGVkVGltZTtcbiAgICB9XG4gIH1cblxuICBmaW5kTmV4dEV4cGlyYXRpb25UaW1lVG9Xb3JrT24oc3VzcGVuZGVkVGltZSwgcm9vdCk7XG59XG5cbmZ1bmN0aW9uIG1hcmtQaW5nZWRQcmlvcml0eUxldmVsKHJvb3QsIHBpbmdlZFRpbWUpIHtcbiAgcm9vdC5kaWRFcnJvciA9IGZhbHNlO1xuXG4gIC8vIFRPRE86IFdoZW4gd2UgYWRkIGJhY2sgcmVzdW1pbmcsIHdlIG5lZWQgdG8gZW5zdXJlIHRoZSBwcm9ncmVzc2VkIHdvcmtcbiAgLy8gaXMgdGhyb3duIG91dCBhbmQgbm90IHJldXNlZCBkdXJpbmcgdGhlIHJlc3RhcnRlZCByZW5kZXIuIE9uZSB3YXkgdG9cbiAgLy8gaW52YWxpZGF0ZSB0aGUgcHJvZ3Jlc3NlZCB3b3JrIGlzIHRvIHJlc3RhcnQgYXQgZXhwaXJhdGlvblRpbWUgKyAxLlxuICB2YXIgbGF0ZXN0UGluZ2VkVGltZSA9IHJvb3QubGF0ZXN0UGluZ2VkVGltZTtcbiAgaWYgKGxhdGVzdFBpbmdlZFRpbWUgPT09IE5vV29yayB8fCBsYXRlc3RQaW5nZWRUaW1lID4gcGluZ2VkVGltZSkge1xuICAgIHJvb3QubGF0ZXN0UGluZ2VkVGltZSA9IHBpbmdlZFRpbWU7XG4gIH1cbiAgZmluZE5leHRFeHBpcmF0aW9uVGltZVRvV29ya09uKHBpbmdlZFRpbWUsIHJvb3QpO1xufVxuXG5mdW5jdGlvbiBjbGVhclBpbmcocm9vdCwgY29tcGxldGVkVGltZSkge1xuICB2YXIgbGF0ZXN0UGluZ2VkVGltZSA9IHJvb3QubGF0ZXN0UGluZ2VkVGltZTtcbiAgaWYgKGxhdGVzdFBpbmdlZFRpbWUgPj0gY29tcGxldGVkVGltZSkge1xuICAgIHJvb3QubGF0ZXN0UGluZ2VkVGltZSA9IE5vV29yaztcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kRWFybGllc3RPdXRzdGFuZGluZ1ByaW9yaXR5TGV2ZWwocm9vdCwgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgdmFyIGVhcmxpZXN0RXhwaXJhdGlvblRpbWUgPSByZW5kZXJFeHBpcmF0aW9uVGltZTtcblxuICB2YXIgZWFybGllc3RQZW5kaW5nVGltZSA9IHJvb3QuZWFybGllc3RQZW5kaW5nVGltZTtcbiAgdmFyIGVhcmxpZXN0U3VzcGVuZGVkVGltZSA9IHJvb3QuZWFybGllc3RTdXNwZW5kZWRUaW1lO1xuICBpZiAoZWFybGllc3RQZW5kaW5nVGltZSA+IGVhcmxpZXN0RXhwaXJhdGlvblRpbWUpIHtcbiAgICBlYXJsaWVzdEV4cGlyYXRpb25UaW1lID0gZWFybGllc3RQZW5kaW5nVGltZTtcbiAgfVxuICBpZiAoZWFybGllc3RTdXNwZW5kZWRUaW1lID4gZWFybGllc3RFeHBpcmF0aW9uVGltZSkge1xuICAgIGVhcmxpZXN0RXhwaXJhdGlvblRpbWUgPSBlYXJsaWVzdFN1c3BlbmRlZFRpbWU7XG4gIH1cbiAgcmV0dXJuIGVhcmxpZXN0RXhwaXJhdGlvblRpbWU7XG59XG5cbmZ1bmN0aW9uIGRpZEV4cGlyZUF0RXhwaXJhdGlvblRpbWUocm9vdCwgY3VycmVudFRpbWUpIHtcbiAgdmFyIGV4cGlyYXRpb25UaW1lID0gcm9vdC5leHBpcmF0aW9uVGltZTtcbiAgaWYgKGV4cGlyYXRpb25UaW1lICE9PSBOb1dvcmsgJiYgY3VycmVudFRpbWUgPD0gZXhwaXJhdGlvblRpbWUpIHtcbiAgICAvLyBUaGUgcm9vdCBoYXMgZXhwaXJlZC4gRmx1c2ggYWxsIHdvcmsgdXAgdG8gdGhlIGN1cnJlbnQgdGltZS5cbiAgICByb290Lm5leHRFeHBpcmF0aW9uVGltZVRvV29ya09uID0gY3VycmVudFRpbWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZE5leHRFeHBpcmF0aW9uVGltZVRvV29ya09uKGNvbXBsZXRlZEV4cGlyYXRpb25UaW1lLCByb290KSB7XG4gIHZhciBlYXJsaWVzdFN1c3BlbmRlZFRpbWUgPSByb290LmVhcmxpZXN0U3VzcGVuZGVkVGltZTtcbiAgdmFyIGxhdGVzdFN1c3BlbmRlZFRpbWUgPSByb290LmxhdGVzdFN1c3BlbmRlZFRpbWU7XG4gIHZhciBlYXJsaWVzdFBlbmRpbmdUaW1lID0gcm9vdC5lYXJsaWVzdFBlbmRpbmdUaW1lO1xuICB2YXIgbGF0ZXN0UGluZ2VkVGltZSA9IHJvb3QubGF0ZXN0UGluZ2VkVGltZTtcblxuICAvLyBXb3JrIG9uIHRoZSBlYXJsaWVzdCBwZW5kaW5nIHRpbWUuIEZhaWxpbmcgdGhhdCwgd29yayBvbiB0aGUgbGF0ZXN0XG4gIC8vIHBpbmdlZCB0aW1lLlxuICB2YXIgbmV4dEV4cGlyYXRpb25UaW1lVG9Xb3JrT24gPSBlYXJsaWVzdFBlbmRpbmdUaW1lICE9PSBOb1dvcmsgPyBlYXJsaWVzdFBlbmRpbmdUaW1lIDogbGF0ZXN0UGluZ2VkVGltZTtcblxuICAvLyBJZiB0aGVyZSBpcyBubyBwZW5kaW5nIG9yIHBpbmdlZCB3b3JrLCBjaGVjayBpZiB0aGVyZSdzIHN1c3BlbmRlZCB3b3JrXG4gIC8vIHRoYXQncyBsb3dlciBwcmlvcml0eSB0aGFuIHdoYXQgd2UganVzdCBjb21wbGV0ZWQuXG4gIGlmIChuZXh0RXhwaXJhdGlvblRpbWVUb1dvcmtPbiA9PT0gTm9Xb3JrICYmIChjb21wbGV0ZWRFeHBpcmF0aW9uVGltZSA9PT0gTm9Xb3JrIHx8IGxhdGVzdFN1c3BlbmRlZFRpbWUgPCBjb21wbGV0ZWRFeHBpcmF0aW9uVGltZSkpIHtcbiAgICAvLyBUaGUgbG93ZXN0IHByaW9yaXR5IHN1c3BlbmRlZCB3b3JrIGlzIHRoZSB3b3JrIG1vc3QgbGlrZWx5IHRvIGJlXG4gICAgLy8gY29tbWl0dGVkIG5leHQuIExldCdzIHN0YXJ0IHJlbmRlcmluZyBpdCBhZ2Fpbiwgc28gdGhhdCBpZiBpdCB0aW1lcyBvdXQsXG4gICAgLy8gaXQncyByZWFkeSB0byBjb21taXQuXG4gICAgbmV4dEV4cGlyYXRpb25UaW1lVG9Xb3JrT24gPSBsYXRlc3RTdXNwZW5kZWRUaW1lO1xuICB9XG5cbiAgdmFyIGV4cGlyYXRpb25UaW1lID0gbmV4dEV4cGlyYXRpb25UaW1lVG9Xb3JrT247XG4gIGlmIChleHBpcmF0aW9uVGltZSAhPT0gTm9Xb3JrICYmIGVhcmxpZXN0U3VzcGVuZGVkVGltZSA+IGV4cGlyYXRpb25UaW1lKSB7XG4gICAgLy8gRXhwaXJlIHVzaW5nIHRoZSBlYXJsaWVzdCBrbm93biBleHBpcmF0aW9uIHRpbWUuXG4gICAgZXhwaXJhdGlvblRpbWUgPSBlYXJsaWVzdFN1c3BlbmRlZFRpbWU7XG4gIH1cblxuICByb290Lm5leHRFeHBpcmF0aW9uVGltZVRvV29ya09uID0gbmV4dEV4cGlyYXRpb25UaW1lVG9Xb3JrT247XG4gIHJvb3QuZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIGJhc2VQcm9wcykge1xuICBpZiAoQ29tcG9uZW50ICYmIENvbXBvbmVudC5kZWZhdWx0UHJvcHMpIHtcbiAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHMuIFRha2VuIGZyb20gUmVhY3RFbGVtZW50XG4gICAgdmFyIHByb3BzID0gX2Fzc2lnbih7fSwgYmFzZVByb3BzKTtcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gQ29tcG9uZW50LmRlZmF1bHRQcm9wcztcbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcHM7XG4gIH1cbiAgcmV0dXJuIGJhc2VQcm9wcztcbn1cblxuZnVuY3Rpb24gcmVhZExhenlDb21wb25lbnRUeXBlKGxhenlDb21wb25lbnQpIHtcbiAgdmFyIHN0YXR1cyA9IGxhenlDb21wb25lbnQuX3N0YXR1cztcbiAgdmFyIHJlc3VsdCA9IGxhenlDb21wb25lbnQuX3Jlc3VsdDtcbiAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICBjYXNlIFJlc29sdmVkOlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gcmVzdWx0O1xuICAgICAgICByZXR1cm4gQ29tcG9uZW50O1xuICAgICAgfVxuICAgIGNhc2UgUmVqZWN0ZWQ6XG4gICAgICB7XG4gICAgICAgIHZhciBlcnJvciA9IHJlc3VsdDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgY2FzZSBQZW5kaW5nOlxuICAgICAge1xuICAgICAgICB2YXIgdGhlbmFibGUgPSByZXN1bHQ7XG4gICAgICAgIHRocm93IHRoZW5hYmxlO1xuICAgICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIGxhenlDb21wb25lbnQuX3N0YXR1cyA9IFBlbmRpbmc7XG4gICAgICAgIHZhciBjdG9yID0gbGF6eUNvbXBvbmVudC5fY3RvcjtcbiAgICAgICAgdmFyIF90aGVuYWJsZSA9IGN0b3IoKTtcbiAgICAgICAgX3RoZW5hYmxlLnRoZW4oZnVuY3Rpb24gKG1vZHVsZU9iamVjdCkge1xuICAgICAgICAgIGlmIChsYXp5Q29tcG9uZW50Ll9zdGF0dXMgPT09IFBlbmRpbmcpIHtcbiAgICAgICAgICAgIHZhciBkZWZhdWx0RXhwb3J0ID0gbW9kdWxlT2JqZWN0LmRlZmF1bHQ7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChkZWZhdWx0RXhwb3J0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB3YXJuaW5nJDEoZmFsc2UsICdsYXp5OiBFeHBlY3RlZCB0aGUgcmVzdWx0IG9mIGEgZHluYW1pYyBpbXBvcnQoKSBjYWxsLiAnICsgJ0luc3RlYWQgcmVjZWl2ZWQ6ICVzXFxuXFxuWW91ciBjb2RlIHNob3VsZCBsb29rIGxpa2U6IFxcbiAgJyArIFwiY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcG9ydCgnLi9NeUNvbXBvbmVudCcpKVwiLCBtb2R1bGVPYmplY3QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXp5Q29tcG9uZW50Ll9zdGF0dXMgPSBSZXNvbHZlZDtcbiAgICAgICAgICAgIGxhenlDb21wb25lbnQuX3Jlc3VsdCA9IGRlZmF1bHRFeHBvcnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAobGF6eUNvbXBvbmVudC5fc3RhdHVzID09PSBQZW5kaW5nKSB7XG4gICAgICAgICAgICBsYXp5Q29tcG9uZW50Ll9zdGF0dXMgPSBSZWplY3RlZDtcbiAgICAgICAgICAgIGxhenlDb21wb25lbnQuX3Jlc3VsdCA9IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEhhbmRsZSBzeW5jaHJvbm91cyB0aGVuYWJsZXMuXG4gICAgICAgIHN3aXRjaCAobGF6eUNvbXBvbmVudC5fc3RhdHVzKSB7XG4gICAgICAgICAgY2FzZSBSZXNvbHZlZDpcbiAgICAgICAgICAgIHJldHVybiBsYXp5Q29tcG9uZW50Ll9yZXN1bHQ7XG4gICAgICAgICAgY2FzZSBSZWplY3RlZDpcbiAgICAgICAgICAgIHRocm93IGxhenlDb21wb25lbnQuX3Jlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBsYXp5Q29tcG9uZW50Ll9yZXN1bHQgPSBfdGhlbmFibGU7XG4gICAgICAgIHRocm93IF90aGVuYWJsZTtcbiAgICAgIH1cbiAgfVxufVxuXG52YXIgZmFrZUludGVybmFsSW5zdGFuY2UgPSB7fTtcbnZhciBpc0FycmF5JDEgPSBBcnJheS5pc0FycmF5O1xuXG4vLyBSZWFjdC5Db21wb25lbnQgdXNlcyBhIHNoYXJlZCBmcm96ZW4gb2JqZWN0IGJ5IGRlZmF1bHQuXG4vLyBXZSdsbCB1c2UgaXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgbmVlZCB0byBpbml0aWFsaXplIGxlZ2FjeSByZWZzLlxudmFyIGVtcHR5UmVmc09iamVjdCA9IG5ldyBSZWFjdC5Db21wb25lbnQoKS5yZWZzO1xuXG52YXIgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50ID0gdm9pZCAwO1xudmFyIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZSA9IHZvaWQgMDtcbnZhciBkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUgPSB2b2lkIDA7XG52YXIgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZSA9IHZvaWQgMDtcbnZhciBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGUgPSB2b2lkIDA7XG52YXIgd2Fybk9uVW5kZWZpbmVkRGVyaXZlZFN0YXRlID0gdm9pZCAwO1xudmFyIHdhcm5PbkludmFsaWRDYWxsYmFjayQxID0gdm9pZCAwO1xudmFyIGRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlID0gdm9pZCAwO1xudmFyIGRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzID0gdm9pZCAwO1xudmFyIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZSA9IHZvaWQgMDtcblxue1xuICBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcyA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlID0gbmV3IFNldCgpO1xuXG4gIHZhciBkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2sgPSBuZXcgU2V0KCk7XG5cbiAgd2Fybk9uSW52YWxpZENhbGxiYWNrJDEgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICBpZiAoY2FsbGJhY2sgPT09IG51bGwgfHwgdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBrZXkgPSBjYWxsZXJOYW1lICsgJ18nICsgY2FsbGJhY2s7XG4gICAgaWYgKCFkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2suaGFzKGtleSkpIHtcbiAgICAgIGRpZFdhcm5PbkludmFsaWRDYWxsYmFjay5hZGQoa2V5KTtcbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsZXJOYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuICB9O1xuXG4gIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZSA9IGZ1bmN0aW9uICh0eXBlLCBwYXJ0aWFsU3RhdGUpIHtcbiAgICBpZiAocGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKSB8fCAnQ29tcG9uZW50JztcbiAgICAgIGlmICghZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlLmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuICAgICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICclcy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKTogQSB2YWxpZCBzdGF0ZSBvYmplY3QgKG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQuICcgKyAnWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBUaGlzIGlzIHNvIGdyb3NzIGJ1dCBpdCdzIGF0IGxlYXN0IG5vbi1jcml0aWNhbCBhbmQgY2FuIGJlIHJlbW92ZWQgaWZcbiAgLy8gaXQgY2F1c2VzIHByb2JsZW1zLiBUaGlzIGlzIG1lYW50IHRvIGdpdmUgYSBuaWNlciBlcnJvciBtZXNzYWdlIGZvclxuICAvLyBSZWFjdERPTTE1LnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHJlYWN0RE9NMTZDb21wb25lbnQsXG4gIC8vIC4uLikpIHdoaWNoIG90aGVyd2lzZSB0aHJvd3MgYSBcIl9wcm9jZXNzQ2hpbGRDb250ZXh0IGlzIG5vdCBhIGZ1bmN0aW9uXCJcbiAgLy8gZXhjZXB0aW9uLlxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZmFrZUludGVybmFsSW5zdGFuY2UsICdfcHJvY2Vzc0NoaWxkQ29udGV4dCcsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgaW52YXJpYW50KGZhbHNlLCAnX3Byb2Nlc3NDaGlsZENvbnRleHQgaXMgbm90IGF2YWlsYWJsZSBpbiBSZWFjdCAxNisuIFRoaXMgbGlrZWx5IG1lYW5zIHlvdSBoYXZlIG11bHRpcGxlIGNvcGllcyBvZiBSZWFjdCBhbmQgYXJlIGF0dGVtcHRpbmcgdG8gbmVzdCBhIFJlYWN0IDE1IHRyZWUgaW5zaWRlIGEgUmVhY3QgMTYgdHJlZSB1c2luZyB1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lciwgd2hpY2ggaXNuXFwndCBzdXBwb3J0ZWQuIFRyeSB0byBtYWtlIHN1cmUgeW91IGhhdmUgb25seSBvbmUgY29weSBvZiBSZWFjdCAoYW5kIGlkZWFsbHksIHN3aXRjaCB0byBSZWFjdERPTS5jcmVhdGVQb3J0YWwpLicpO1xuICAgIH1cbiAgfSk7XG4gIE9iamVjdC5mcmVlemUoZmFrZUludGVybmFsSW5zdGFuY2UpO1xufVxuXG5mdW5jdGlvbiBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXh0UHJvcHMpIHtcbiAgdmFyIHByZXZTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAge1xuICAgIGlmIChkZWJ1Z1JlbmRlclBoYXNlU2lkZUVmZmVjdHMgfHwgZGVidWdSZW5kZXJQaGFzZVNpZGVFZmZlY3RzRm9yU3RyaWN0TW9kZSAmJiB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbiBleHRyYSB0aW1lIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cbiAgICAgIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHBhcnRpYWxTdGF0ZSA9IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSk7XG5cbiAge1xuICAgIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZShjdG9yLCBwYXJ0aWFsU3RhdGUpO1xuICB9XG4gIC8vIE1lcmdlIHRoZSBwYXJ0aWFsIHN0YXRlIGFuZCB0aGUgcHJldmlvdXMgc3RhdGUuXG4gIHZhciBtZW1vaXplZFN0YXRlID0gcGFydGlhbFN0YXRlID09PSBudWxsIHx8IHBhcnRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkID8gcHJldlN0YXRlIDogX2Fzc2lnbih7fSwgcHJldlN0YXRlLCBwYXJ0aWFsU3RhdGUpO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbWVtb2l6ZWRTdGF0ZTtcblxuICAvLyBPbmNlIHRoZSB1cGRhdGUgcXVldWUgaXMgZW1wdHksIHBlcnNpc3QgdGhlIGRlcml2ZWQgc3RhdGUgb250byB0aGVcbiAgLy8gYmFzZSBzdGF0ZS5cbiAgdmFyIHVwZGF0ZVF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG4gIGlmICh1cGRhdGVRdWV1ZSAhPT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzcy5leHBpcmF0aW9uVGltZSA9PT0gTm9Xb3JrKSB7XG4gICAgdXBkYXRlUXVldWUuYmFzZVN0YXRlID0gbWVtb2l6ZWRTdGF0ZTtcbiAgfVxufVxuXG52YXIgY2xhc3NDb21wb25lbnRVcGRhdGVyID0ge1xuICBpc01vdW50ZWQ6IGlzTW91bnRlZCxcbiAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAoaW5zdCwgcGF5bG9hZCwgY2FsbGJhY2spIHtcbiAgICB2YXIgZmliZXIgPSBnZXQoaW5zdCk7XG4gICAgdmFyIGN1cnJlbnRUaW1lID0gcmVxdWVzdEN1cnJlbnRUaW1lKCk7XG4gICAgdmFyIGV4cGlyYXRpb25UaW1lID0gY29tcHV0ZUV4cGlyYXRpb25Gb3JGaWJlcihjdXJyZW50VGltZSwgZmliZXIpO1xuXG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShleHBpcmF0aW9uVGltZSk7XG4gICAgdXBkYXRlLnBheWxvYWQgPSBwYXlsb2FkO1xuICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayQxKGNhbGxiYWNrLCAnc2V0U3RhdGUnKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUpO1xuICAgIHNjaGVkdWxlV29yayhmaWJlciwgZXhwaXJhdGlvblRpbWUpO1xuICB9LFxuICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAoaW5zdCwgcGF5bG9hZCwgY2FsbGJhY2spIHtcbiAgICB2YXIgZmliZXIgPSBnZXQoaW5zdCk7XG4gICAgdmFyIGN1cnJlbnRUaW1lID0gcmVxdWVzdEN1cnJlbnRUaW1lKCk7XG4gICAgdmFyIGV4cGlyYXRpb25UaW1lID0gY29tcHV0ZUV4cGlyYXRpb25Gb3JGaWJlcihjdXJyZW50VGltZSwgZmliZXIpO1xuXG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShleHBpcmF0aW9uVGltZSk7XG4gICAgdXBkYXRlLnRhZyA9IFJlcGxhY2VTdGF0ZTtcbiAgICB1cGRhdGUucGF5bG9hZCA9IHBheWxvYWQ7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2skMShjYWxsYmFjaywgJ3JlcGxhY2VTdGF0ZScpO1xuICAgICAgfVxuICAgICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgIGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSk7XG4gICAgc2NoZWR1bGVXb3JrKGZpYmVyLCBleHBpcmF0aW9uVGltZSk7XG4gIH0sXG4gIGVucXVldWVGb3JjZVVwZGF0ZTogZnVuY3Rpb24gKGluc3QsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBjdXJyZW50VGltZSA9IHJlcXVlc3RDdXJyZW50VGltZSgpO1xuICAgIHZhciBleHBpcmF0aW9uVGltZSA9IGNvbXB1dGVFeHBpcmF0aW9uRm9yRmliZXIoY3VycmVudFRpbWUsIGZpYmVyKTtcblxuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXhwaXJhdGlvblRpbWUpO1xuICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTtcblxuICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayQxKGNhbGxiYWNrLCAnZm9yY2VVcGRhdGUnKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUpO1xuICAgIHNjaGVkdWxlV29yayhmaWJlciwgZXhwaXJhdGlvblRpbWUpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3Rvciwgb2xkUHJvcHMsIG5ld1Byb3BzLCBvbGRTdGF0ZSwgbmV3U3RhdGUsIG5leHRDb250ZXh0KSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzdGFydFBoYXNlVGltZXIod29ya0luUHJvZ3Jlc3MsICdzaG91bGRDb21wb25lbnRVcGRhdGUnKTtcbiAgICB2YXIgc2hvdWxkVXBkYXRlID0gaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgIHN0b3BQaGFzZVRpbWVyKCk7XG5cbiAgICB7XG4gICAgICAhKHNob3VsZFVwZGF0ZSAhPT0gdW5kZWZpbmVkKSA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzLnNob3VsZENvbXBvbmVudFVwZGF0ZSgpOiBSZXR1cm5lZCB1bmRlZmluZWQgaW5zdGVhZCBvZiBhICcgKyAnYm9vbGVhbiB2YWx1ZS4gTWFrZSBzdXJlIHRvIHJldHVybiB0cnVlIG9yIGZhbHNlLicsIGdldENvbXBvbmVudE5hbWUoY3RvcikgfHwgJ0NvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIHJldHVybiBzaG91bGRVcGRhdGU7XG4gIH1cblxuICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgY3Rvci5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQpIHtcbiAgICByZXR1cm4gIXNoYWxsb3dFcXVhbChvbGRQcm9wcywgbmV3UHJvcHMpIHx8ICFzaGFsbG93RXF1YWwob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjaGVja0NsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAge1xuICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjdG9yKSB8fCAnQ29tcG9uZW50JztcbiAgICB2YXIgcmVuZGVyUHJlc2VudCA9IGluc3RhbmNlLnJlbmRlcjtcblxuICAgIGlmICghcmVuZGVyUHJlc2VudCkge1xuICAgICAgaWYgKGN0b3IucHJvdG90eXBlICYmIHR5cGVvZiBjdG9yLnByb3RvdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnJXMoLi4uKTogTm8gYHJlbmRlcmAgbWV0aG9kIGZvdW5kIG9uIHRoZSByZXR1cm5lZCBjb21wb25lbnQgJyArICdpbnN0YW5jZTogZGlkIHlvdSBhY2NpZGVudGFsbHkgcmV0dXJuIGFuIG9iamVjdCBmcm9tIHRoZSBjb25zdHJ1Y3Rvcj8nLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzKC4uLik6IE5vIGByZW5kZXJgIG1ldGhvZCBmb3VuZCBvbiB0aGUgcmV0dXJuZWQgY29tcG9uZW50ICcgKyAnaW5zdGFuY2U6IHlvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gZGVmaW5lIGByZW5kZXJgLicsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBub0dldEluaXRpYWxTdGF0ZU9uRVM2ID0gIWluc3RhbmNlLmdldEluaXRpYWxTdGF0ZSB8fCBpbnN0YW5jZS5nZXRJbml0aWFsU3RhdGUuaXNSZWFjdENsYXNzQXBwcm92ZWQgfHwgaW5zdGFuY2Uuc3RhdGU7XG4gICAgIW5vR2V0SW5pdGlhbFN0YXRlT25FUzYgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdnZXRJbml0aWFsU3RhdGUgd2FzIGRlZmluZWQgb24gJXMsIGEgcGxhaW4gSmF2YVNjcmlwdCBjbGFzcy4gJyArICdUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBjbGFzc2VzIGNyZWF0ZWQgdXNpbmcgUmVhY3QuY3JlYXRlQ2xhc3MuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGRlZmluZSBhIHN0YXRlIHByb3BlcnR5IGluc3RlYWQ/JywgbmFtZSkgOiB2b2lkIDA7XG4gICAgdmFyIG5vR2V0RGVmYXVsdFByb3BzT25FUzYgPSAhaW5zdGFuY2UuZ2V0RGVmYXVsdFByb3BzIHx8IGluc3RhbmNlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZDtcbiAgICAhbm9HZXREZWZhdWx0UHJvcHNPbkVTNiA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ2dldERlZmF1bHRQcm9wcyB3YXMgZGVmaW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiAnICsgJ1RoaXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGNsYXNzZXMgY3JlYXRlZCB1c2luZyBSZWFjdC5jcmVhdGVDbGFzcy4gJyArICdVc2UgYSBzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGRlZmF1bHRQcm9wcyBpbnN0ZWFkLicsIG5hbWUpIDogdm9pZCAwO1xuICAgIHZhciBub0luc3RhbmNlUHJvcFR5cGVzID0gIWluc3RhbmNlLnByb3BUeXBlcztcbiAgICAhbm9JbnN0YW5jZVByb3BUeXBlcyA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ3Byb3BUeXBlcyB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIHByb3BUeXBlcyBpbnN0ZWFkLicsIG5hbWUpIDogdm9pZCAwO1xuICAgIHZhciBub0luc3RhbmNlQ29udGV4dFR5cGUgPSAhaW5zdGFuY2UuY29udGV4dFR5cGU7XG4gICAgIW5vSW5zdGFuY2VDb250ZXh0VHlwZSA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ2NvbnRleHRUeXBlIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5cGUgaW5zdGVhZC4nLCBuYW1lKSA6IHZvaWQgMDtcbiAgICB2YXIgbm9JbnN0YW5jZUNvbnRleHRUeXBlcyA9ICFpbnN0YW5jZS5jb250ZXh0VHlwZXM7XG4gICAgIW5vSW5zdGFuY2VDb250ZXh0VHlwZXMgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdjb250ZXh0VHlwZXMgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBjb250ZXh0VHlwZXMgaW5zdGVhZC4nLCBuYW1lKSA6IHZvaWQgMDtcblxuICAgIGlmIChjdG9yLmNvbnRleHRUeXBlICYmIGN0b3IuY29udGV4dFR5cGVzICYmICFkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcy5oYXMoY3RvcikpIHtcbiAgICAgIGRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzLmFkZChjdG9yKTtcbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzIGRlY2xhcmVzIGJvdGggY29udGV4dFR5cGVzIGFuZCBjb250ZXh0VHlwZSBzdGF0aWMgcHJvcGVydGllcy4gJyArICdUaGUgbGVnYWN5IGNvbnRleHRUeXBlcyBwcm9wZXJ0eSB3aWxsIGJlIGlnbm9yZWQuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIG5vQ29tcG9uZW50U2hvdWxkVXBkYXRlID0gdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFNob3VsZFVwZGF0ZSAhPT0gJ2Z1bmN0aW9uJztcbiAgICAhbm9Db21wb25lbnRTaG91bGRVcGRhdGUgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50U2hvdWxkVXBkYXRlKCkuIERpZCB5b3UgbWVhbiBzaG91bGRDb21wb25lbnRVcGRhdGUoKT8gJyArICdUaGUgbmFtZSBpcyBwaHJhc2VkIGFzIGEgcXVlc3Rpb24gYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgJyArICdleHBlY3RlZCB0byByZXR1cm4gYSB2YWx1ZS4nLCBuYW1lKSA6IHZvaWQgMDtcbiAgICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgY3Rvci5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQgJiYgdHlwZW9mIGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgc2hvdWxkQ29tcG9uZW50VXBkYXRlKCkuICcgKyAnc2hvdWxkQ29tcG9uZW50VXBkYXRlIHNob3VsZCBub3QgYmUgdXNlZCB3aGVuIGV4dGVuZGluZyBSZWFjdC5QdXJlQ29tcG9uZW50LiAnICsgJ1BsZWFzZSBleHRlbmQgUmVhY3QuQ29tcG9uZW50IGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSBpcyB1c2VkLicsIGdldENvbXBvbmVudE5hbWUoY3RvcikgfHwgJ0EgcHVyZSBjb21wb25lbnQnKTtcbiAgICB9XG4gICAgdmFyIG5vQ29tcG9uZW50RGlkVW5tb3VudCA9IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVbm1vdW50ICE9PSAnZnVuY3Rpb24nO1xuICAgICFub0NvbXBvbmVudERpZFVubW91bnQgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50RGlkVW5tb3VudCgpLiBCdXQgdGhlcmUgaXMgbm8gc3VjaCBsaWZlY3ljbGUgbWV0aG9kLiAnICsgJ0RpZCB5b3UgbWVhbiBjb21wb25lbnRXaWxsVW5tb3VudCgpPycsIG5hbWUpIDogdm9pZCAwO1xuICAgIHZhciBub0NvbXBvbmVudERpZFJlY2VpdmVQcm9wcyA9IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRSZWNlaXZlUHJvcHMgIT09ICdmdW5jdGlvbic7XG4gICAgIW5vQ29tcG9uZW50RGlkUmVjZWl2ZVByb3BzID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudERpZFJlY2VpdmVQcm9wcygpLiBCdXQgdGhlcmUgaXMgbm8gc3VjaCBsaWZlY3ljbGUgbWV0aG9kLiAnICsgJ0lmIHlvdSBtZWFudCB0byB1cGRhdGUgdGhlIHN0YXRlIGluIHJlc3BvbnNlIHRvIGNoYW5naW5nIHByb3BzLCAnICsgJ3VzZSBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCkuIElmIHlvdSBtZWFudCB0byBmZXRjaCBkYXRhIG9yICcgKyAncnVuIHNpZGUtZWZmZWN0cyBvciBtdXRhdGlvbnMgYWZ0ZXIgUmVhY3QgaGFzIHVwZGF0ZWQgdGhlIFVJLCB1c2UgY29tcG9uZW50RGlkVXBkYXRlKCkuJywgbmFtZSkgOiB2b2lkIDA7XG4gICAgdmFyIG5vQ29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyA9IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzICE9PSAnZnVuY3Rpb24nO1xuICAgICFub0NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsIG5hbWUpIDogdm9pZCAwO1xuICAgIHZhciBub1Vuc2FmZUNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgPSB0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgIT09ICdmdW5jdGlvbic7XG4gICAgIW5vVW5zYWZlQ29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdVTlNBRkVfY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKT8nLCBuYW1lKSA6IHZvaWQgMDtcbiAgICB2YXIgaGFzTXV0YXRlZFByb3BzID0gaW5zdGFuY2UucHJvcHMgIT09IG5ld1Byb3BzO1xuICAgICEoaW5zdGFuY2UucHJvcHMgPT09IHVuZGVmaW5lZCB8fCAhaGFzTXV0YXRlZFByb3BzKSA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzKC4uLik6IFdoZW4gY2FsbGluZyBzdXBlcigpIGluIGAlc2AsIG1ha2Ugc3VyZSB0byBwYXNzICcgKyBcInVwIHRoZSBzYW1lIHByb3BzIHRoYXQgeW91ciBjb21wb25lbnQncyBjb25zdHJ1Y3RvciB3YXMgcGFzc2VkLlwiLCBuYW1lLCBuYW1lKSA6IHZvaWQgMDtcbiAgICB2YXIgbm9JbnN0YW5jZURlZmF1bHRQcm9wcyA9ICFpbnN0YW5jZS5kZWZhdWx0UHJvcHM7XG4gICAgIW5vSW5zdGFuY2VEZWZhdWx0UHJvcHMgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdTZXR0aW5nIGRlZmF1bHRQcm9wcyBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcyBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIGlnbm9yZWQuJyArICcgSW5zdGVhZCwgZGVmaW5lIGRlZmF1bHRQcm9wcyBhcyBhIHN0YXRpYyBwcm9wZXJ0eSBvbiAlcy4nLCBuYW1lLCBuYW1lKSA6IHZvaWQgMDtcblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSAhPT0gJ2Z1bmN0aW9uJyAmJiAhZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlLmhhcyhjdG9yKSkge1xuICAgICAgZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlLmFkZChjdG9yKTtcbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzOiBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIHNob3VsZCBiZSB1c2VkIHdpdGggY29tcG9uZW50RGlkVXBkYXRlKCkuICcgKyAnVGhpcyBjb21wb25lbnQgZGVmaW5lcyBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIG9ubHkuJywgZ2V0Q29tcG9uZW50TmFtZShjdG9yKSk7XG4gICAgfVxuXG4gICAgdmFyIG5vSW5zdGFuY2VHZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSB0eXBlb2YgaW5zdGFuY2UuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzICE9PSAnZnVuY3Rpb24nO1xuICAgICFub0luc3RhbmNlR2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnJXM6IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcygpIGlzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhIHN0YXRpYyBtZXRob2QuJywgbmFtZSkgOiB2b2lkIDA7XG4gICAgdmFyIG5vSW5zdGFuY2VHZXREZXJpdmVkU3RhdGVGcm9tQ2F0Y2ggPSB0eXBlb2YgaW5zdGFuY2UuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nO1xuICAgICFub0luc3RhbmNlR2V0RGVyaXZlZFN0YXRlRnJvbUNhdGNoID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnJXM6IGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcigpIGlzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhIHN0YXRpYyBtZXRob2QuJywgbmFtZSkgOiB2b2lkIDA7XG4gICAgdmFyIG5vU3RhdGljR2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPSB0eXBlb2YgY3Rvci5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSAhPT0gJ2Z1bmN0aW9uJztcbiAgICAhbm9TdGF0aWNHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzOiBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIGlzIGRlZmluZWQgYXMgYSBzdGF0aWMgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhbiBpbnN0YW5jZSBtZXRob2QuJywgbmFtZSkgOiB2b2lkIDA7XG4gICAgdmFyIF9zdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuICAgIGlmIChfc3RhdGUgJiYgKHR5cGVvZiBfc3RhdGUgIT09ICdvYmplY3QnIHx8IGlzQXJyYXkkMShfc3RhdGUpKSkge1xuICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnJXMuc3RhdGU6IG11c3QgYmUgc2V0IHRvIGFuIG9iamVjdCBvciBudWxsJywgbmFtZSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAhKHR5cGVvZiBjdG9yLmNoaWxkQ29udGV4dFR5cGVzID09PSAnb2JqZWN0JykgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICclcy5nZXRDaGlsZENvbnRleHQoKTogY2hpbGRDb250ZXh0VHlwZXMgbXVzdCBiZSBkZWZpbmVkIGluIG9yZGVyIHRvICcgKyAndXNlIGdldENoaWxkQ29udGV4dCgpLicsIG5hbWUpIDogdm9pZCAwO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnVwZGF0ZXIgPSBjbGFzc0NvbXBvbmVudFVwZGF0ZXI7XG4gIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGluc3RhbmNlO1xuICAvLyBUaGUgaW5zdGFuY2UgbmVlZHMgYWNjZXNzIHRvIHRoZSBmaWJlciBzbyB0aGF0IGl0IGNhbiBzY2hlZHVsZSB1cGRhdGVzXG4gIHNldChpbnN0YW5jZSwgd29ya0luUHJvZ3Jlc3MpO1xuICB7XG4gICAgaW5zdGFuY2UuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSA9IGZha2VJbnRlcm5hbEluc3RhbmNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHByb3BzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICB2YXIgaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPSBmYWxzZTtcbiAgdmFyIHVubWFza2VkQ29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgdmFyIGNvbnRleHQgPSBudWxsO1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuXG4gIHtcbiAgICBpZiAoJ2NvbnRleHRUeXBlJyBpbiBjdG9yKSB7XG4gICAgICB2YXIgaXNWYWxpZCA9XG4gICAgICAvLyBBbGxvdyBudWxsIGZvciBjb25kaXRpb25hbCBkZWNsYXJhdGlvblxuICAgICAgY29udGV4dFR5cGUgPT09IG51bGwgfHwgY29udGV4dFR5cGUgIT09IHVuZGVmaW5lZCAmJiBjb250ZXh0VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFICYmIGNvbnRleHRUeXBlLl9jb250ZXh0ID09PSB1bmRlZmluZWQ7IC8vIE5vdCBhIDxDb250ZXh0LkNvbnN1bWVyPlxuXG4gICAgICBpZiAoIWlzVmFsaWQgJiYgIWRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZS5oYXMoY3RvcikpIHtcbiAgICAgICAgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlLmFkZChjdG9yKTtcblxuICAgICAgICB2YXIgYWRkZW5kdW0gPSAnJztcbiAgICAgICAgaWYgKGNvbnRleHRUeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIHVuZGVmaW5lZC4gJyArICdUaGlzIGNhbiBiZSBjYXVzZWQgYnkgYSB0eXBvIG9yIGJ5IG1peGluZyB1cCBuYW1lZCBhbmQgZGVmYXVsdCBpbXBvcnRzLiAnICsgJ1RoaXMgY2FuIGFsc28gaGFwcGVuIGR1ZSB0byBhIGNpcmN1bGFyIGRlcGVuZGVuY3ksIHNvICcgKyAndHJ5IG1vdmluZyB0aGUgY3JlYXRlQ29udGV4dCgpIGNhbGwgdG8gYSBzZXBhcmF0ZSBmaWxlLic7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRleHRUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBIb3dldmVyLCBpdCBpcyBzZXQgdG8gYSAnICsgdHlwZW9mIGNvbnRleHRUeXBlICsgJy4nO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFKSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIERpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgdGhlIENvbnRleHQuUHJvdmlkZXIgaW5zdGVhZD8nO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlLl9jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyA8Q29udGV4dC5Db25zdW1lcj5cbiAgICAgICAgICBhZGRlbmR1bSA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyB0aGUgQ29udGV4dC5Db25zdW1lciBpbnN0ZWFkPyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIEhvd2V2ZXIsIGl0IGlzIHNldCB0byBhbiBvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY29udGV4dFR5cGUpLmpvaW4oJywgJykgKyAnfS4nO1xuICAgICAgICB9XG4gICAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzIGRlZmluZXMgYW4gaW52YWxpZCBjb250ZXh0VHlwZS4gJyArICdjb250ZXh0VHlwZSBzaG91bGQgcG9pbnQgdG8gdGhlIENvbnRleHQgb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZUNvbnRleHQoKS4lcycsIGdldENvbXBvbmVudE5hbWUoY3RvcikgfHwgJ0NvbXBvbmVudCcsIGFkZGVuZHVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgIGNvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICB2YXIgY29udGV4dFR5cGVzID0gY3Rvci5jb250ZXh0VHlwZXM7XG4gICAgaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPSBjb250ZXh0VHlwZXMgIT09IG51bGwgJiYgY29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQ7XG4gICAgY29udGV4dCA9IGlzTGVnYWN5Q29udGV4dENvbnN1bWVyID8gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KSA6IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgfVxuXG4gIC8vIEluc3RhbnRpYXRlIHR3aWNlIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cbiAge1xuICAgIGlmIChkZWJ1Z1JlbmRlclBoYXNlU2lkZUVmZmVjdHMgfHwgZGVidWdSZW5kZXJQaGFzZVNpZGVFZmZlY3RzRm9yU3RyaWN0TW9kZSAmJiB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgbmV3IGN0b3IocHJvcHMsIGNvbnRleHQpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIH1cbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IG5ldyBjdG9yKHByb3BzLCBjb250ZXh0KTtcbiAgdmFyIHN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlICE9PSBudWxsICYmIGluc3RhbmNlLnN0YXRlICE9PSB1bmRlZmluZWQgPyBpbnN0YW5jZS5zdGF0ZSA6IG51bGw7XG4gIGFkb3B0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nICYmIHN0YXRlID09PSBudWxsKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUoY3RvcikgfHwgJ0NvbXBvbmVudCc7XG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlLmFkZChjb21wb25lbnROYW1lKTtcbiAgICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnYCVzYCB1c2VzIGBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNgIGJ1dCBpdHMgaW5pdGlhbCBzdGF0ZSBpcyAnICsgJyVzLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZC4gSW5zdGVhZCwgZGVmaW5lIHRoZSBpbml0aWFsIHN0YXRlIGJ5ICcgKyAnYXNzaWduaW5nIGFuIG9iamVjdCB0byBgdGhpcy5zdGF0ZWAgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIGAlc2AuICcgKyAnVGhpcyBlbnN1cmVzIHRoYXQgYGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc2AgYXJndW1lbnRzIGhhdmUgYSBjb25zaXN0ZW50IHNoYXBlLicsIGNvbXBvbmVudE5hbWUsIGluc3RhbmNlLnN0YXRlID09PSBudWxsID8gJ251bGwnIDogJ3VuZGVmaW5lZCcsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIG5ldyBjb21wb25lbnQgQVBJcyBhcmUgZGVmaW5lZCwgXCJ1bnNhZmVcIiBsaWZlY3ljbGVzIHdvbid0IGJlIGNhbGxlZC5cbiAgICAvLyBXYXJuIGFib3V0IHRoZXNlIGxpZmVjeWNsZXMgaWYgdGhleSBhcmUgcHJlc2VudC5cbiAgICAvLyBEb24ndCB3YXJuIGFib3V0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgbWV0aG9kcyB0aG91Z2guXG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBmb3VuZFdpbGxNb3VudE5hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50Ll9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgICAgZm91bmRXaWxsTW91bnROYW1lID0gJ2NvbXBvbmVudFdpbGxNb3VudCc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvdW5kV2lsbE1vdW50TmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JztcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgICAgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA9ICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSAnVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxVcGRhdGVOYW1lID0gJ2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsVXBkYXRlTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSc7XG4gICAgICB9XG4gICAgICBpZiAoZm91bmRXaWxsTW91bnROYW1lICE9PSBudWxsIHx8IGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgIT09IG51bGwgfHwgZm91bmRXaWxsVXBkYXRlTmFtZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgX2NvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuICAgICAgICB2YXIgbmV3QXBpTmFtZSA9IHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/ICdnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKScgOiAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSc7XG4gICAgICAgIGlmICghZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5oYXMoX2NvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5hZGQoX2NvbXBvbmVudE5hbWUpO1xuICAgICAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1Vuc2FmZSBsZWdhY3kgbGlmZWN5Y2xlcyB3aWxsIG5vdCBiZSBjYWxsZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgbmV3IGNvbXBvbmVudCBBUElzLlxcblxcbicgKyAnJXMgdXNlcyAlcyBidXQgYWxzbyBjb250YWlucyB0aGUgZm9sbG93aW5nIGxlZ2FjeSBsaWZlY3ljbGVzOiVzJXMlc1xcblxcbicgKyAnVGhlIGFib3ZlIGxpZmVjeWNsZXMgc2hvdWxkIGJlIHJlbW92ZWQuIExlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6XFxuJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWFzeW5jLWNvbXBvbmVudC1saWZlY3ljbGUtaG9va3MnLCBfY29tcG9uZW50TmFtZSwgbmV3QXBpTmFtZSwgZm91bmRXaWxsTW91bnROYW1lICE9PSBudWxsID8gJ1xcbiAgJyArIGZvdW5kV2lsbE1vdW50TmFtZSA6ICcnLCBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lICE9PSBudWxsID8gJ1xcbiAgJyArIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgOiAnJywgZm91bmRXaWxsVXBkYXRlTmFtZSAhPT0gbnVsbCA/ICdcXG4gICcgKyBmb3VuZFdpbGxVcGRhdGVOYW1lIDogJycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ2FjaGUgdW5tYXNrZWQgY29udGV4dCBzbyB3ZSBjYW4gYXZvaWQgcmVjcmVhdGluZyBtYXNrZWQgY29udGV4dCB1bmxlc3MgbmVjZXNzYXJ5LlxuICAvLyBSZWFjdEZpYmVyQ29udGV4dCB1c3VhbGx5IHVwZGF0ZXMgdGhpcyBjYWNoZSBidXQgY2FuJ3QgZm9yIG5ld2x5LWNyZWF0ZWQgaW5zdGFuY2VzLlxuICBpZiAoaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIpIHtcbiAgICBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgY29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKSB7XG4gIHN0YXJ0UGhhc2VUaW1lcih3b3JrSW5Qcm9ncmVzcywgJ2NvbXBvbmVudFdpbGxNb3VudCcpO1xuICB2YXIgb2xkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTtcblxuICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCgpO1xuICB9XG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgfVxuXG4gIHN0b3BQaGFzZVRpbWVyKCk7XG5cbiAgaWYgKG9sZFN0YXRlICE9PSBpbnN0YW5jZS5zdGF0ZSkge1xuICAgIHtcbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzLmNvbXBvbmVudFdpbGxNb3VudCgpOiBBc3NpZ25pbmcgZGlyZWN0bHkgdG8gdGhpcy5zdGF0ZSBpcyAnICsgXCJkZXByZWNhdGVkIChleGNlcHQgaW5zaWRlIGEgY29tcG9uZW50J3MgXCIgKyAnY29uc3RydWN0b3IpLiBVc2Ugc2V0U3RhdGUgaW5zdGVhZC4nLCBnZXRDb21wb25lbnROYW1lKHdvcmtJblByb2dyZXNzLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICB9XG4gICAgY2xhc3NDb21wb25lbnRVcGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUoaW5zdGFuY2UsIGluc3RhbmNlLnN0YXRlLCBudWxsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCkge1xuICB2YXIgb2xkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTtcbiAgc3RhcnRQaGFzZVRpbWVyKHdvcmtJblByb2dyZXNzLCAnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcycpO1xuICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gIH1cbiAgc3RvcFBoYXNlVGltZXIoKTtcblxuICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IG9sZFN0YXRlKSB7XG4gICAge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKHdvcmtJblByb2dyZXNzLnR5cGUpIHx8ICdDb21wb25lbnQnO1xuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFN0YXRlQXNzaWdubWVudEZvckNvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSk7XG4gICAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKTogQXNzaWduaW5nIGRpcmVjdGx5IHRvICcgKyBcInRoaXMuc3RhdGUgaXMgZGVwcmVjYXRlZCAoZXhjZXB0IGluc2lkZSBhIGNvbXBvbmVudCdzIFwiICsgJ2NvbnN0cnVjdG9yKS4gVXNlIHNldFN0YXRlIGluc3RlYWQuJywgY29tcG9uZW50TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNsYXNzQ29tcG9uZW50VXBkYXRlci5lbnF1ZXVlUmVwbGFjZVN0YXRlKGluc3RhbmNlLCBpbnN0YW5jZS5zdGF0ZSwgbnVsbCk7XG4gIH1cbn1cblxuLy8gSW52b2tlcyB0aGUgbW91bnQgbGlmZS1jeWNsZXMgb24gYSBwcmV2aW91c2x5IG5ldmVyIHJlbmRlcmVkIGluc3RhbmNlLlxuZnVuY3Rpb24gbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAge1xuICAgIGNoZWNrQ2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMpO1xuICB9XG5cbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIGluc3RhbmNlLnJlZnMgPSBlbXB0eVJlZnNPYmplY3Q7XG5cbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBpbnN0YW5jZS5jb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIGluc3RhbmNlLmNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAge1xuICAgIGlmIChpbnN0YW5jZS5zdGF0ZSA9PT0gbmV3UHJvcHMpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjdG9yKSB8fCAnQ29tcG9uZW50JztcbiAgICAgIGlmICghZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlLmFkZChjb21wb25lbnROYW1lKTtcbiAgICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnJXM6IEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBhc3NpZ24gcHJvcHMgZGlyZWN0bHkgdG8gc3RhdGUgJyArIFwiYmVjYXVzZSB1cGRhdGVzIHRvIHByb3BzIHdvbid0IGJlIHJlZmxlY3RlZCBpbiBzdGF0ZS4gXCIgKyAnSW4gbW9zdCBjYXNlcywgaXQgaXMgYmV0dGVyIHRvIHVzZSBwcm9wcyBkaXJlY3RseS4nLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdE1vZGUpIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7XG5cbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgaWYgKHdhcm5BYm91dERlcHJlY2F0ZWRMaWZlY3ljbGVzKSB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmREZXByZWNhdGlvbldhcm5pbmdzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZVF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG4gIGlmICh1cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgdXBkYXRlUXVldWUsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXdQcm9wcyk7XG4gICAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB9XG5cbiAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG4gIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcbiAgICAvLyBJZiB3ZSBoYWQgYWRkaXRpb25hbCBzdGF0ZSB1cGRhdGVzIGR1cmluZyB0aGlzIGxpZmUtY3ljbGUsIGxldCdzXG4gICAgLy8gcHJvY2VzcyB0aGVtIG5vdy5cbiAgICB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICAgIGlmICh1cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCB1cGRhdGVRdWV1ZSwgbmV3UHJvcHMsIGluc3RhbmNlLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICBpbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBVcGRhdGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lTW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gIHZhciBvbGRQcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7XG4gIGluc3RhbmNlLnByb3BzID0gb2xkUHJvcHM7XG5cbiAgdmFyIG9sZENvbnRleHQgPSBpbnN0YW5jZS5jb250ZXh0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuICB2YXIgbmV4dENvbnRleHQgPSB2b2lkIDA7XG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgbmV4dENvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5leHRMZWdhY3lVbm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIG5leHRDb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgbmV4dExlZ2FjeVVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XG4gIHZhciBoYXNOZXdMaWZlY3ljbGVzID0gdHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbic7XG5cbiAgLy8gTm90ZTogRHVyaW5nIHRoZXNlIGxpZmUtY3ljbGVzLCBpbnN0YW5jZS5wcm9wcy9pbnN0YW5jZS5zdGF0ZSBhcmUgd2hhdFxuICAvLyBldmVyIHRoZSBwcmV2aW91c2x5IGF0dGVtcHRlZCB0byByZW5kZXIgLSBub3QgdGhlIFwiY3VycmVudFwiLiBIb3dldmVyLFxuICAvLyBkdXJpbmcgY29tcG9uZW50RGlkVXBkYXRlIHdlIHBhc3MgdGhlIFwiY3VycmVudFwiIHByb3BzLlxuXG4gIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzIHx8IG9sZENvbnRleHQgIT09IG5leHRDb250ZXh0KSB7XG4gICAgICBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKTtcblxuICB2YXIgb2xkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgbmV3U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSA9IG9sZFN0YXRlO1xuICB2YXIgdXBkYXRlUXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCB1cGRhdGVRdWV1ZSwgbmV3UHJvcHMsIGluc3RhbmNlLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB9XG4gIGlmIChvbGRQcm9wcyA9PT0gbmV3UHJvcHMgJiYgb2xkU3RhdGUgPT09IG5ld1N0YXRlICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpICYmICFjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkpIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBVcGRhdGU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAgIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG4gICAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgc3RhcnRQaGFzZVRpbWVyKHdvcmtJblByb2dyZXNzLCAnY29tcG9uZW50V2lsbE1vdW50Jyk7XG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICB9XG4gICAgICBzdG9wUGhhc2VUaW1lcigpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gVXBkYXRlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBVcGRhdGU7XG4gICAgfVxuXG4gICAgLy8gSWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybmVkIGZhbHNlLCB3ZSBzaG91bGQgc3RpbGwgdXBkYXRlIHRoZVxuICAgIC8vIG1lbW9pemVkIHN0YXRlIHRvIGluZGljYXRlIHRoYXQgdGhpcyB3b3JrIGNhbiBiZSByZXVzZWQuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5ld1Byb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UncyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHBvaW50ZXJzIGV2ZW5cbiAgLy8gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2UuXG4gIGluc3RhbmNlLnByb3BzID0gbmV3UHJvcHM7XG4gIGluc3RhbmNlLnN0YXRlID0gbmV3U3RhdGU7XG4gIGluc3RhbmNlLmNvbnRleHQgPSBuZXh0Q29udGV4dDtcblxuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufVxuXG4vLyBJbnZva2VzIHRoZSB1cGRhdGUgbGlmZS1jeWNsZXMgYW5kIHJldHVybnMgZmFsc2UgaWYgaXQgc2hvdWxkbid0IHJlcmVuZGVyLlxuZnVuY3Rpb24gdXBkYXRlQ2xhc3NJbnN0YW5jZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICBpbnN0YW5jZS5wcm9wcyA9IHdvcmtJblByb2dyZXNzLnR5cGUgPT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID8gb2xkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKHdvcmtJblByb2dyZXNzLnR5cGUsIG9sZFByb3BzKTtcblxuICB2YXIgb2xkQ29udGV4dCA9IGluc3RhbmNlLmNvbnRleHQ7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG4gIHZhciBuZXh0Q29udGV4dCA9IHZvaWQgMDtcbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBuZXh0Q29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmV4dFVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgbmV4dENvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBuZXh0VW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgdmFyIGhhc05ld0xpZmVjeWNsZXMgPSB0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJztcblxuICAvLyBOb3RlOiBEdXJpbmcgdGhlc2UgbGlmZS1jeWNsZXMsIGluc3RhbmNlLnByb3BzL2luc3RhbmNlLnN0YXRlIGFyZSB3aGF0XG4gIC8vIGV2ZXIgdGhlIHByZXZpb3VzbHkgYXR0ZW1wdGVkIHRvIHJlbmRlciAtIG5vdCB0aGUgXCJjdXJyZW50XCIuIEhvd2V2ZXIsXG4gIC8vIGR1cmluZyBjb21wb25lbnREaWRVcGRhdGUgd2UgcGFzcyB0aGUgXCJjdXJyZW50XCIgcHJvcHMuXG5cbiAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG4gIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGlmIChvbGRQcm9wcyAhPT0gbmV3UHJvcHMgfHwgb2xkQ29udGV4dCAhPT0gbmV4dENvbnRleHQpIHtcbiAgICAgIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpO1xuXG4gIHZhciBvbGRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBuZXdTdGF0ZSA9IGluc3RhbmNlLnN0YXRlID0gb2xkU3RhdGU7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIHVwZGF0ZVF1ZXVlLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIH1cblxuICBpZiAob2xkUHJvcHMgPT09IG5ld1Byb3BzICYmIG9sZFN0YXRlID09PSBuZXdTdGF0ZSAmJiAhaGFzQ29udGV4dENoYW5nZWQoKSAmJiAhY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpKSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKG9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gVXBkYXRlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAob2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBTbmFwc2hvdDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXdQcm9wcyk7XG4gICAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB9XG5cbiAgdmFyIHNob3VsZFVwZGF0ZSA9IGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSB8fCBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3Rvciwgb2xkUHJvcHMsIG5ld1Byb3BzLCBvbGRTdGF0ZSwgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcblxuICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gICAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cbiAgICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIHN0YXJ0UGhhc2VUaW1lcih3b3JrSW5Qcm9ncmVzcywgJ2NvbXBvbmVudFdpbGxVcGRhdGUnKTtcbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgIH1cbiAgICAgIHN0b3BQaGFzZVRpbWVyKCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gVXBkYXRlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gU25hcHNob3Q7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChvbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnIHw9IFVwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKG9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gU25hcHNob3Q7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybmVkIGZhbHNlLCB3ZSBzaG91bGQgc3RpbGwgdXBkYXRlIHRoZVxuICAgIC8vIG1lbW9pemVkIHByb3BzL3N0YXRlIHRvIGluZGljYXRlIHRoYXQgdGhpcyB3b3JrIGNhbiBiZSByZXVzZWQuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5ld1Byb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UncyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHBvaW50ZXJzIGV2ZW5cbiAgLy8gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2UuXG4gIGluc3RhbmNlLnByb3BzID0gbmV3UHJvcHM7XG4gIGluc3RhbmNlLnN0YXRlID0gbmV3U3RhdGU7XG4gIGluc3RhbmNlLmNvbnRleHQgPSBuZXh0Q29udGV4dDtcblxuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufVxuXG52YXIgZGlkV2FybkFib3V0TWFwcyA9IHZvaWQgMDtcbnZhciBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzID0gdm9pZCAwO1xudmFyIGRpZFdhcm5BYm91dFN0cmluZ1JlZkluU3RyaWN0TW9kZSA9IHZvaWQgMDtcbnZhciBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB2b2lkIDA7XG52YXIgb3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nID0gdm9pZCAwO1xudmFyIHdhcm5Gb3JNaXNzaW5nS2V5ID0gZnVuY3Rpb24gKGNoaWxkKSB7fTtcblxue1xuICBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dEdlbmVyYXRvcnMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0U3RyaW5nUmVmSW5TdHJpY3RNb2RlID0ge307XG5cbiAgLyoqXG4gICAqIFdhcm4gaWYgdGhlcmUncyBubyBrZXkgZXhwbGljaXRseSBzZXQgb24gZHluYW1pYyBhcnJheXMgb2YgY2hpbGRyZW4gb3JcbiAgICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gICAqIHVwZGF0ZXMuXG4gICAqL1xuICBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTtcbiAgb3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nID0ge307XG5cbiAgd2FybkZvck1pc3NpbmdLZXkgPSBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWNoaWxkLl9zdG9yZSB8fCBjaGlsZC5fc3RvcmUudmFsaWRhdGVkIHx8IGNoaWxkLmtleSAhPSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgICEodHlwZW9mIGNoaWxkLl9zdG9yZSA9PT0gJ29iamVjdCcpID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3QgQ29tcG9uZW50IGluIHdhcm5Gb3JNaXNzaW5nS2V5IHNob3VsZCBoYXZlIGEgX3N0b3JlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpIDogdm9pZCAwO1xuICAgIGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuXG4gICAgdmFyIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8gPSAnRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgJyArICdcImtleVwiIHByb3AuIFNlZSBodHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmcta2V5cyBmb3IgJyArICdtb3JlIGluZm9ybWF0aW9uLicgKyBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2KCk7XG4gICAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBvd25lckhhc0tleVVzZVdhcm5pbmdbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10gPSB0cnVlO1xuXG4gICAgd2FybmluZyQxKGZhbHNlLCAnRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgJyArICdcImtleVwiIHByb3AuIFNlZSBodHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmcta2V5cyBmb3IgJyArICdtb3JlIGluZm9ybWF0aW9uLicpO1xuICB9O1xufVxuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbmZ1bmN0aW9uIGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudCQkMSwgZWxlbWVudCkge1xuICB2YXIgbWl4ZWRSZWYgPSBlbGVtZW50LnJlZjtcbiAgaWYgKG1peGVkUmVmICE9PSBudWxsICYmIHR5cGVvZiBtaXhlZFJlZiAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWl4ZWRSZWYgIT09ICdvYmplY3QnKSB7XG4gICAge1xuICAgICAgaWYgKHJldHVybkZpYmVyLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShyZXR1cm5GaWJlci50eXBlKSB8fCAnQ29tcG9uZW50JztcbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZJblN0cmljdE1vZGVbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdBIHN0cmluZyByZWYsIFwiJXNcIiwgaGFzIGJlZW4gZm91bmQgd2l0aGluIGEgc3RyaWN0IG1vZGUgdHJlZS4gJyArICdTdHJpbmcgcmVmcyBhcmUgYSBzb3VyY2Ugb2YgcG90ZW50aWFsIGJ1Z3MgYW5kIHNob3VsZCBiZSBhdm9pZGVkLiAnICsgJ1dlIHJlY29tbWVuZCB1c2luZyBjcmVhdGVSZWYoKSBpbnN0ZWFkLicgKyAnXFxuJXMnICsgJ1xcblxcbkxlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTonICsgJ1xcbmh0dHBzOi8vZmIubWUvcmVhY3Qtc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIG1peGVkUmVmLCBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2QocmV0dXJuRmliZXIpKTtcbiAgICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZJblN0cmljdE1vZGVbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQuX293bmVyKSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBpbnN0ID0gdm9pZCAwO1xuICAgICAgaWYgKG93bmVyKSB7XG4gICAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7XG4gICAgICAgICEob3duZXJGaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSA/IGludmFyaWFudChmYWxzZSwgJ0Z1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGhhdmUgcmVmcy4gRGlkIHlvdSBtZWFuIHRvIHVzZSBSZWFjdC5mb3J3YXJkUmVmKCk/JykgOiB2b2lkIDA7XG4gICAgICAgIGluc3QgPSBvd25lckZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIH1cbiAgICAgICFpbnN0ID8gaW52YXJpYW50KGZhbHNlLCAnTWlzc2luZyBvd25lciBmb3Igc3RyaW5nIHJlZiAlcy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBtaXhlZFJlZikgOiB2b2lkIDA7XG4gICAgICB2YXIgc3RyaW5nUmVmID0gJycgKyBtaXhlZFJlZjtcbiAgICAgIC8vIENoZWNrIGlmIHByZXZpb3VzIHN0cmluZyByZWYgbWF0Y2hlcyBuZXcgc3RyaW5nIHJlZlxuICAgICAgaWYgKGN1cnJlbnQkJDEgIT09IG51bGwgJiYgY3VycmVudCQkMS5yZWYgIT09IG51bGwgJiYgdHlwZW9mIGN1cnJlbnQkJDEucmVmID09PSAnZnVuY3Rpb24nICYmIGN1cnJlbnQkJDEucmVmLl9zdHJpbmdSZWYgPT09IHN0cmluZ1JlZikge1xuICAgICAgICByZXR1cm4gY3VycmVudCQkMS5yZWY7XG4gICAgICB9XG4gICAgICB2YXIgcmVmID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciByZWZzID0gaW5zdC5yZWZzO1xuICAgICAgICBpZiAocmVmcyA9PT0gZW1wdHlSZWZzT2JqZWN0KSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBhIGxhenkgcG9vbGVkIGZyb3plbiBvYmplY3QsIHNvIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZS5cbiAgICAgICAgICByZWZzID0gaW5zdC5yZWZzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgZGVsZXRlIHJlZnNbc3RyaW5nUmVmXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWZzW3N0cmluZ1JlZl0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJlZi5fc3RyaW5nUmVmID0gc3RyaW5nUmVmO1xuICAgICAgcmV0dXJuIHJlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgISh0eXBlb2YgbWl4ZWRSZWYgPT09ICdzdHJpbmcnKSA/IGludmFyaWFudChmYWxzZSwgJ0V4cGVjdGVkIHJlZiB0byBiZSBhIGZ1bmN0aW9uLCBhIHN0cmluZywgYW4gb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZVJlZigpLCBvciBudWxsLicpIDogdm9pZCAwO1xuICAgICAgIWVsZW1lbnQuX293bmVyID8gaW52YXJpYW50KGZhbHNlLCAnRWxlbWVudCByZWYgd2FzIHNwZWNpZmllZCBhcyBhIHN0cmluZyAoJXMpIGJ1dCBubyBvd25lciB3YXMgc2V0LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4xLiBZb3UgbWF5IGJlIGFkZGluZyBhIHJlZiB0byBhIGZ1bmN0aW9uIGNvbXBvbmVudFxcbjIuIFlvdSBtYXkgYmUgYWRkaW5nIGEgcmVmIHRvIGEgY29tcG9uZW50IHRoYXQgd2FzIG5vdCBjcmVhdGVkIGluc2lkZSBhIGNvbXBvbmVudFxcJ3MgcmVuZGVyIG1ldGhvZFxcbjMuIFlvdSBoYXZlIG11bHRpcGxlIGNvcGllcyBvZiBSZWFjdCBsb2FkZWRcXG5TZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC1yZWZzLW11c3QtaGF2ZS1vd25lciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLCBtaXhlZFJlZikgOiB2b2lkIDA7XG4gICAgfVxuICB9XG4gIHJldHVybiBtaXhlZFJlZjtcbn1cblxuZnVuY3Rpb24gdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCkge1xuICBpZiAocmV0dXJuRmliZXIudHlwZSAhPT0gJ3RleHRhcmVhJykge1xuICAgIHZhciBhZGRlbmR1bSA9ICcnO1xuICAgIHtcbiAgICAgIGFkZGVuZHVtID0gJyBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5ICcgKyAnaW5zdGVhZC4nICsgZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldigpO1xuICAgIH1cbiAgICBpbnZhcmlhbnQoZmFsc2UsICdPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6ICVzKS4lcycsIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXdDaGlsZCkgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhuZXdDaGlsZCkuam9pbignLCAnKSArICd9JyA6IG5ld0NoaWxkLCBhZGRlbmR1bSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gd2Fybk9uRnVuY3Rpb25UeXBlKCkge1xuICB2YXIgY3VycmVudENvbXBvbmVudEVycm9ySW5mbyA9ICdGdW5jdGlvbnMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkLiBUaGlzIG1heSBoYXBwZW4gaWYgJyArICd5b3UgcmV0dXJuIGEgQ29tcG9uZW50IGluc3RlYWQgb2YgPENvbXBvbmVudCAvPiBmcm9tIHJlbmRlci4gJyArICdPciBtYXliZSB5b3UgbWVhbnQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHJhdGhlciB0aGFuIHJldHVybiBpdC4nICsgZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldigpO1xuXG4gIGlmIChvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgb3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dID0gdHJ1ZTtcblxuICB3YXJuaW5nJDEoZmFsc2UsICdGdW5jdGlvbnMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkLiBUaGlzIG1heSBoYXBwZW4gaWYgJyArICd5b3UgcmV0dXJuIGEgQ29tcG9uZW50IGluc3RlYWQgb2YgPENvbXBvbmVudCAvPiBmcm9tIHJlbmRlci4gJyArICdPciBtYXliZSB5b3UgbWVhbnQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHJhdGhlciB0aGFuIHJldHVybiBpdC4nKTtcbn1cblxuLy8gVGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGV4aXN0cyBiZWNhdXNlIEkgZXhwZWN0IHRvIGNsb25lIHRoZSBjb2RlIGluIGVhY2ggcGF0aFxuLy8gdG8gYmUgYWJsZSB0byBvcHRpbWl6ZSBlYWNoIHBhdGggaW5kaXZpZHVhbGx5IGJ5IGJyYW5jaGluZyBlYXJseS4gVGhpcyBuZWVkc1xuLy8gYSBjb21waWxlciBvciB3ZSBjYW4gZG8gaXQgbWFudWFsbHkuIEhlbHBlcnMgdGhhdCBkb24ndCBuZWVkIHRoaXMgYnJhbmNoaW5nXG4vLyBsaXZlIG91dHNpZGUgb2YgdGhpcyBmdW5jdGlvbi5cbmZ1bmN0aW9uIENoaWxkUmVjb25jaWxlcihzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gIGZ1bmN0aW9uIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZFRvRGVsZXRlKSB7XG4gICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBOb29wLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBEZWxldGlvbnMgYXJlIGFkZGVkIGluIHJldmVyc2VkIG9yZGVyIHNvIHdlIGFkZCBpdCB0byB0aGUgZnJvbnQuXG4gICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIHJldHVybiBmaWJlcidzIGVmZmVjdCBsaXN0IGlzIGVtcHR5IGV4Y2VwdCBmb3JcbiAgICAvLyBkZWxldGlvbnMsIHNvIHdlIGNhbiBqdXN0IGFwcGVuZCB0aGUgZGVsZXRpb24gdG8gdGhlIGxpc3QuIFRoZSByZW1haW5pbmdcbiAgICAvLyBlZmZlY3RzIGFyZW4ndCBhZGRlZCB1bnRpbCB0aGUgY29tcGxldGUgcGhhc2UuIE9uY2Ugd2UgaW1wbGVtZW50XG4gICAgLy8gcmVzdW1pbmcsIHRoaXMgbWF5IG5vdCBiZSB0cnVlLlxuICAgIHZhciBsYXN0ID0gcmV0dXJuRmliZXIubGFzdEVmZmVjdDtcbiAgICBpZiAobGFzdCAhPT0gbnVsbCkge1xuICAgICAgbGFzdC5uZXh0RWZmZWN0ID0gY2hpbGRUb0RlbGV0ZTtcbiAgICAgIHJldHVybkZpYmVyLmxhc3RFZmZlY3QgPSBjaGlsZFRvRGVsZXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm5GaWJlci5maXJzdEVmZmVjdCA9IHJldHVybkZpYmVyLmxhc3RFZmZlY3QgPSBjaGlsZFRvRGVsZXRlO1xuICAgIH1cbiAgICBjaGlsZFRvRGVsZXRlLm5leHRFZmZlY3QgPSBudWxsO1xuICAgIGNoaWxkVG9EZWxldGUuZWZmZWN0VGFnID0gRGVsZXRpb247XG4gIH1cblxuICBmdW5jdGlvbiBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpIHtcbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIE5vb3AuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBGb3IgdGhlIHNob3VsZENsb25lIGNhc2UsIHRoaXMgY291bGQgYmUgbWljcm8tb3B0aW1pemVkIGEgYml0IGJ5XG4gICAgLy8gYXNzdW1pbmcgdGhhdCBhZnRlciB0aGUgZmlyc3QgY2hpbGQgd2UndmUgYWxyZWFkeSBhZGRlZCBldmVyeXRoaW5nLlxuICAgIHZhciBjaGlsZFRvRGVsZXRlID0gY3VycmVudEZpcnN0Q2hpbGQ7XG4gICAgd2hpbGUgKGNoaWxkVG9EZWxldGUgIT09IG51bGwpIHtcbiAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZFRvRGVsZXRlKTtcbiAgICAgIGNoaWxkVG9EZWxldGUgPSBjaGlsZFRvRGVsZXRlLnNpYmxpbmc7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKSB7XG4gICAgLy8gQWRkIHRoZSByZW1haW5pbmcgY2hpbGRyZW4gdG8gYSB0ZW1wb3JhcnkgbWFwIHNvIHRoYXQgd2UgY2FuIGZpbmQgdGhlbSBieVxuICAgIC8vIGtleXMgcXVpY2tseS4gSW1wbGljaXQgKG51bGwpIGtleXMgZ2V0IGFkZGVkIHRvIHRoaXMgc2V0IHdpdGggdGhlaXIgaW5kZXhcbiAgICB2YXIgZXhpc3RpbmdDaGlsZHJlbiA9IG5ldyBNYXAoKTtcblxuICAgIHZhciBleGlzdGluZ0NoaWxkID0gY3VycmVudEZpcnN0Q2hpbGQ7XG4gICAgd2hpbGUgKGV4aXN0aW5nQ2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGlmIChleGlzdGluZ0NoaWxkLmtleSAhPT0gbnVsbCkge1xuICAgICAgICBleGlzdGluZ0NoaWxkcmVuLnNldChleGlzdGluZ0NoaWxkLmtleSwgZXhpc3RpbmdDaGlsZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGlzdGluZ0NoaWxkcmVuLnNldChleGlzdGluZ0NoaWxkLmluZGV4LCBleGlzdGluZ0NoaWxkKTtcbiAgICAgIH1cbiAgICAgIGV4aXN0aW5nQ2hpbGQgPSBleGlzdGluZ0NoaWxkLnNpYmxpbmc7XG4gICAgfVxuICAgIHJldHVybiBleGlzdGluZ0NoaWxkcmVuO1xuICB9XG5cbiAgZnVuY3Rpb24gdXNlRmliZXIoZmliZXIsIHBlbmRpbmdQcm9wcywgZXhwaXJhdGlvblRpbWUpIHtcbiAgICAvLyBXZSBjdXJyZW50bHkgc2V0IHNpYmxpbmcgdG8gbnVsbCBhbmQgaW5kZXggdG8gMCBoZXJlIGJlY2F1c2UgaXQgaXMgZWFzeVxuICAgIC8vIHRvIGZvcmdldCB0byBkbyBiZWZvcmUgcmV0dXJuaW5nIGl0LiBFLmcuIGZvciB0aGUgc2luZ2xlIGNoaWxkIGNhc2UuXG4gICAgdmFyIGNsb25lID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoZmliZXIsIHBlbmRpbmdQcm9wcywgZXhwaXJhdGlvblRpbWUpO1xuICAgIGNsb25lLmluZGV4ID0gMDtcbiAgICBjbG9uZS5zaWJsaW5nID0gbnVsbDtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBmdW5jdGlvbiBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0luZGV4KSB7XG4gICAgbmV3RmliZXIuaW5kZXggPSBuZXdJbmRleDtcbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIE5vb3AuXG4gICAgICByZXR1cm4gbGFzdFBsYWNlZEluZGV4O1xuICAgIH1cbiAgICB2YXIgY3VycmVudCQkMSA9IG5ld0ZpYmVyLmFsdGVybmF0ZTtcbiAgICBpZiAoY3VycmVudCQkMSAhPT0gbnVsbCkge1xuICAgICAgdmFyIG9sZEluZGV4ID0gY3VycmVudCQkMS5pbmRleDtcbiAgICAgIGlmIChvbGRJbmRleCA8IGxhc3RQbGFjZWRJbmRleCkge1xuICAgICAgICAvLyBUaGlzIGlzIGEgbW92ZS5cbiAgICAgICAgbmV3RmliZXIuZWZmZWN0VGFnID0gUGxhY2VtZW50O1xuICAgICAgICByZXR1cm4gbGFzdFBsYWNlZEluZGV4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBpdGVtIGNhbiBzdGF5IGluIHBsYWNlLlxuICAgICAgICByZXR1cm4gb2xkSW5kZXg7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgaXMgYW4gaW5zZXJ0aW9uLlxuICAgICAgbmV3RmliZXIuZWZmZWN0VGFnID0gUGxhY2VtZW50O1xuICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwbGFjZVNpbmdsZUNoaWxkKG5ld0ZpYmVyKSB7XG4gICAgLy8gVGhpcyBpcyBzaW1wbGVyIGZvciB0aGUgc2luZ2xlIGNoaWxkIGNhc2UuIFdlIG9ubHkgbmVlZCB0byBkbyBhXG4gICAgLy8gcGxhY2VtZW50IGZvciBpbnNlcnRpbmcgbmV3IGNoaWxkcmVuLlxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgbmV3RmliZXIuZWZmZWN0VGFnID0gUGxhY2VtZW50O1xuICAgIH1cbiAgICByZXR1cm4gbmV3RmliZXI7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudCQkMSwgdGV4dENvbnRlbnQsIGV4cGlyYXRpb25UaW1lKSB7XG4gICAgaWYgKGN1cnJlbnQkJDEgPT09IG51bGwgfHwgY3VycmVudCQkMS50YWcgIT09IEhvc3RUZXh0KSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tVGV4dCh0ZXh0Q29udGVudCwgcmV0dXJuRmliZXIubW9kZSwgZXhwaXJhdGlvblRpbWUpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQkJDEsIHRleHRDb250ZW50LCBleHBpcmF0aW9uVGltZSk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50JCQxLCBlbGVtZW50LCBleHBpcmF0aW9uVGltZSkge1xuICAgIGlmIChjdXJyZW50JCQxICE9PSBudWxsICYmIGN1cnJlbnQkJDEuZWxlbWVudFR5cGUgPT09IGVsZW1lbnQudHlwZSkge1xuICAgICAgLy8gTW92ZSBiYXNlZCBvbiBpbmRleFxuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCQkMSwgZWxlbWVudC5wcm9wcywgZXhwaXJhdGlvblRpbWUpO1xuICAgICAgZXhpc3RpbmcucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50JCQxLCBlbGVtZW50KTtcbiAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAge1xuICAgICAgICBleGlzdGluZy5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgICAgIGV4aXN0aW5nLl9kZWJ1Z093bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluc2VydFxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21FbGVtZW50KGVsZW1lbnQsIHJldHVybkZpYmVyLm1vZGUsIGV4cGlyYXRpb25UaW1lKTtcbiAgICAgIGNyZWF0ZWQucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50JCQxLCBlbGVtZW50KTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnQkJDEsIHBvcnRhbCwgZXhwaXJhdGlvblRpbWUpIHtcbiAgICBpZiAoY3VycmVudCQkMSA9PT0gbnVsbCB8fCBjdXJyZW50JCQxLnRhZyAhPT0gSG9zdFBvcnRhbCB8fCBjdXJyZW50JCQxLnN0YXRlTm9kZS5jb250YWluZXJJbmZvICE9PSBwb3J0YWwuY29udGFpbmVySW5mbyB8fCBjdXJyZW50JCQxLnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiAhPT0gcG9ydGFsLmltcGxlbWVudGF0aW9uKSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgcmV0dXJuRmliZXIubW9kZSwgZXhwaXJhdGlvblRpbWUpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQkJDEsIHBvcnRhbC5jaGlsZHJlbiB8fCBbXSwgZXhwaXJhdGlvblRpbWUpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIGN1cnJlbnQkJDEsIGZyYWdtZW50LCBleHBpcmF0aW9uVGltZSwga2V5KSB7XG4gICAgaWYgKGN1cnJlbnQkJDEgPT09IG51bGwgfHwgY3VycmVudCQkMS50YWcgIT09IEZyYWdtZW50KSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZnJhZ21lbnQsIHJldHVybkZpYmVyLm1vZGUsIGV4cGlyYXRpb25UaW1lLCBrZXkpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQkJDEsIGZyYWdtZW50LCBleHBpcmF0aW9uVGltZSk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgbmV3Q2hpbGQsIGV4cGlyYXRpb25UaW1lKSB7XG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVGV4dCBub2RlcyBkb24ndCBoYXZlIGtleXMuIElmIHRoZSBwcmV2aW91cyBub2RlIGlzIGltcGxpY2l0bHkga2V5ZWRcbiAgICAgIC8vIHdlIGNhbiBjb250aW51ZSB0byByZXBsYWNlIGl0IHdpdGhvdXQgYWJvcnRpbmcgZXZlbiBpZiBpdCBpcyBub3QgYSB0ZXh0XG4gICAgICAvLyBub2RlLlxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KCcnICsgbmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGV4cGlyYXRpb25UaW1lKTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX2NyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21FbGVtZW50KG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBleHBpcmF0aW9uVGltZSk7XG4gICAgICAgICAgICBfY3JlYXRlZC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIG51bGwsIG5ld0NoaWxkKTtcbiAgICAgICAgICAgIF9jcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX2NyZWF0ZWQyID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBleHBpcmF0aW9uVGltZSk7XG4gICAgICAgICAgICBfY3JlYXRlZDIucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgICByZXR1cm4gX2NyZWF0ZWQyO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIHZhciBfY3JlYXRlZDMgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgZXhwaXJhdGlvblRpbWUsIG51bGwpO1xuICAgICAgICBfY3JlYXRlZDMucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgIHJldHVybiBfY3JlYXRlZDM7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGV4cGlyYXRpb25UaW1lKSB7XG4gICAgLy8gVXBkYXRlIHRoZSBmaWJlciBpZiB0aGUga2V5cyBtYXRjaCwgb3RoZXJ3aXNlIHJldHVybiBudWxsLlxuXG4gICAgdmFyIGtleSA9IG9sZEZpYmVyICE9PSBudWxsID8gb2xkRmliZXIua2V5IDogbnVsbDtcblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBrZXlzLiBJZiB0aGUgcHJldmlvdXMgbm9kZSBpcyBpbXBsaWNpdGx5IGtleWVkXG4gICAgICAvLyB3ZSBjYW4gY29udGludWUgdG8gcmVwbGFjZSBpdCB3aXRob3V0IGFib3J0aW5nIGV2ZW4gaWYgaXQgaXMgbm90IGEgdGV4dFxuICAgICAgLy8gbm9kZS5cbiAgICAgIGlmIChrZXkgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIG9sZEZpYmVyLCAnJyArIG5ld0NoaWxkLCBleHBpcmF0aW9uVGltZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKG5ld0NoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgICAgICAgIGlmIChuZXdDaGlsZC50eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQucHJvcHMuY2hpbGRyZW4sIGV4cGlyYXRpb25UaW1lLCBrZXkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAobmV3Q2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBleHBpcmF0aW9uVGltZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICBpZiAoa2V5ICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgZXhwaXJhdGlvblRpbWUsIG51bGwpO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZCwgZXhwaXJhdGlvblRpbWUpIHtcbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cywgc28gd2UgbmVpdGhlciBoYXZlIHRvIGNoZWNrIHRoZSBvbGQgbm9yXG4gICAgICAvLyBuZXcgbm9kZSBmb3IgdGhlIGtleS4gSWYgYm90aCBhcmUgdGV4dCBub2RlcywgdGhleSBtYXRjaC5cbiAgICAgIHZhciBtYXRjaGVkRmliZXIgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdJZHgpIHx8IG51bGw7XG4gICAgICByZXR1cm4gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIG1hdGNoZWRGaWJlciwgJycgKyBuZXdDaGlsZCwgZXhwaXJhdGlvblRpbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfbWF0Y2hlZEZpYmVyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3Q2hpbGQua2V5ID09PSBudWxsID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5KSB8fCBudWxsO1xuICAgICAgICAgICAgaWYgKG5ld0NoaWxkLnR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyLCBuZXdDaGlsZC5wcm9wcy5jaGlsZHJlbiwgZXhwaXJhdGlvblRpbWUsIG5ld0NoaWxkLmtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlRWxlbWVudChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlciwgbmV3Q2hpbGQsIGV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3Q2hpbGQua2V5ID09PSBudWxsID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5KSB8fCBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlcjIsIG5ld0NoaWxkLCBleHBpcmF0aW9uVGltZSk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIzID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3SWR4KSB8fCBudWxsO1xuICAgICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIzLCBuZXdDaGlsZCwgZXhwaXJhdGlvblRpbWUsIG51bGwpO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhcm5zIGlmIHRoZXJlIGlzIGEgZHVwbGljYXRlIG9yIG1pc3Npbmcga2V5XG4gICAqL1xuICBmdW5jdGlvbiB3YXJuT25JbnZhbGlkS2V5KGNoaWxkLCBrbm93bktleXMpIHtcbiAgICB7XG4gICAgICBpZiAodHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JyB8fCBjaGlsZCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ga25vd25LZXlzO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChjaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB3YXJuRm9yTWlzc2luZ0tleShjaGlsZCk7XG4gICAgICAgICAgdmFyIGtleSA9IGNoaWxkLmtleTtcbiAgICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoa25vd25LZXlzID09PSBudWxsKSB7XG4gICAgICAgICAgICBrbm93bktleXMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBrbm93bktleXMuYWRkKGtleSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFrbm93bktleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIGtub3duS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICB3YXJuaW5nJDEoZmFsc2UsICdFbmNvdW50ZXJlZCB0d28gY2hpbGRyZW4gd2l0aCB0aGUgc2FtZSBrZXksIGAlc2AuICcgKyAnS2V5cyBzaG91bGQgYmUgdW5pcXVlIHNvIHRoYXQgY29tcG9uZW50cyBtYWludGFpbiB0aGVpciBpZGVudGl0eSAnICsgJ2Fjcm9zcyB1cGRhdGVzLiBOb24tdW5pcXVlIGtleXMgbWF5IGNhdXNlIGNoaWxkcmVuIHRvIGJlICcgKyAnZHVwbGljYXRlZCBhbmQvb3Igb21pdHRlZCDigJQgdGhlIGJlaGF2aW9yIGlzIHVuc3VwcG9ydGVkIGFuZCAnICsgJ2NvdWxkIGNoYW5nZSBpbiBhIGZ1dHVyZSB2ZXJzaW9uLicsIGtleSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBrbm93bktleXM7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZHJlbkFycmF5KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGRyZW4sIGV4cGlyYXRpb25UaW1lKSB7XG4gICAgLy8gVGhpcyBhbGdvcml0aG0gY2FuJ3Qgb3B0aW1pemUgYnkgc2VhcmNoaW5nIGZyb20gYm90aCBlbmRzIHNpbmNlIHdlXG4gICAgLy8gZG9uJ3QgaGF2ZSBiYWNrcG9pbnRlcnMgb24gZmliZXJzLiBJJ20gdHJ5aW5nIHRvIHNlZSBob3cgZmFyIHdlIGNhbiBnZXRcbiAgICAvLyB3aXRoIHRoYXQgbW9kZWwuIElmIGl0IGVuZHMgdXAgbm90IGJlaW5nIHdvcnRoIHRoZSB0cmFkZW9mZnMsIHdlIGNhblxuICAgIC8vIGFkZCBpdCBsYXRlci5cblxuICAgIC8vIEV2ZW4gd2l0aCBhIHR3byBlbmRlZCBvcHRpbWl6YXRpb24sIHdlJ2Qgd2FudCB0byBvcHRpbWl6ZSBmb3IgdGhlIGNhc2VcbiAgICAvLyB3aGVyZSB0aGVyZSBhcmUgZmV3IGNoYW5nZXMgYW5kIGJydXRlIGZvcmNlIHRoZSBjb21wYXJpc29uIGluc3RlYWQgb2ZcbiAgICAvLyBnb2luZyBmb3IgdGhlIE1hcC4gSXQnZCBsaWtlIHRvIGV4cGxvcmUgaGl0dGluZyB0aGF0IHBhdGggZmlyc3QgaW5cbiAgICAvLyBmb3J3YXJkLW9ubHkgbW9kZSBhbmQgb25seSBnbyBmb3IgdGhlIE1hcCBvbmNlIHdlIG5vdGljZSB0aGF0IHdlIG5lZWRcbiAgICAvLyBsb3RzIG9mIGxvb2sgYWhlYWQuIFRoaXMgZG9lc24ndCBoYW5kbGUgcmV2ZXJzYWwgYXMgd2VsbCBhcyB0d28gZW5kZWRcbiAgICAvLyBzZWFyY2ggYnV0IHRoYXQncyB1bnVzdWFsLiBCZXNpZGVzLCBmb3IgdGhlIHR3byBlbmRlZCBvcHRpbWl6YXRpb24gdG9cbiAgICAvLyB3b3JrIG9uIEl0ZXJhYmxlcywgd2UnZCBuZWVkIHRvIGNvcHkgdGhlIHdob2xlIHNldC5cblxuICAgIC8vIEluIHRoaXMgZmlyc3QgaXRlcmF0aW9uLCB3ZSdsbCBqdXN0IGxpdmUgd2l0aCBoaXR0aW5nIHRoZSBiYWQgY2FzZVxuICAgIC8vIChhZGRpbmcgZXZlcnl0aGluZyB0byBhIE1hcCkgaW4gZm9yIGV2ZXJ5IGluc2VydC9tb3ZlLlxuXG4gICAgLy8gSWYgeW91IGNoYW5nZSB0aGlzIGNvZGUsIGFsc28gdXBkYXRlIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IoKSB3aGljaFxuICAgIC8vIHVzZXMgdGhlIHNhbWUgYWxnb3JpdGhtLlxuXG4gICAge1xuICAgICAgLy8gRmlyc3QsIHZhbGlkYXRlIGtleXMuXG4gICAgICB2YXIga25vd25LZXlzID0gbnVsbDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkID0gbmV3Q2hpbGRyZW5baV07XG4gICAgICAgIGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91c05ld0ZpYmVyID0gbnVsbDtcblxuICAgIHZhciBvbGRGaWJlciA9IGN1cnJlbnRGaXJzdENoaWxkO1xuICAgIHZhciBsYXN0UGxhY2VkSW5kZXggPSAwO1xuICAgIHZhciBuZXdJZHggPSAwO1xuICAgIHZhciBuZXh0T2xkRmliZXIgPSBudWxsO1xuICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICBpZiAob2xkRmliZXIuaW5kZXggPiBuZXdJZHgpIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXI7XG4gICAgICAgIG9sZEZpYmVyID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyLnNpYmxpbmc7XG4gICAgICB9XG4gICAgICB2YXIgbmV3RmliZXIgPSB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGRyZW5bbmV3SWR4XSwgZXhwaXJhdGlvblRpbWUpO1xuICAgICAgaWYgKG5ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgYnJlYWtzIG9uIGVtcHR5IHNsb3RzIGxpa2UgbnVsbCBjaGlsZHJlbi4gVGhhdCdzXG4gICAgICAgIC8vIHVuZm9ydHVuYXRlIGJlY2F1c2UgaXQgdHJpZ2dlcnMgdGhlIHNsb3cgcGF0aCBhbGwgdGhlIHRpbWUuIFdlIG5lZWRcbiAgICAgICAgLy8gYSBiZXR0ZXIgd2F5IHRvIGNvbW11bmljYXRlIHdoZXRoZXIgdGhpcyB3YXMgYSBtaXNzIG9yIG51bGwsXG4gICAgICAgIC8vIGJvb2xlYW4sIHVuZGVmaW5lZCwgZXRjLlxuICAgICAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgIGlmIChvbGRGaWJlciAmJiBuZXdGaWJlci5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBtYXRjaGVkIHRoZSBzbG90LCBidXQgd2UgZGlkbid0IHJldXNlIHRoZSBleGlzdGluZyBmaWJlciwgc28gd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIGRlbGV0ZSB0aGUgZXhpc3RpbmcgY2hpbGQuXG4gICAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChuZXdGaWJlciwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gbmV3RmliZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPOiBEZWZlciBzaWJsaW5ncyBpZiB3ZSdyZSBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IGZvciB0aGlzIHNsb3QuXG4gICAgICAgIC8vIEkuZS4gaWYgd2UgaGFkIG51bGwgdmFsdWVzIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIGRlZmVyIHRoaXNcbiAgICAgICAgLy8gZm9yIGVhY2ggbnVsbCB2YWx1ZS4gSG93ZXZlciwgd2UgYWxzbyBkb24ndCB3YW50IHRvIGNhbGwgdXBkYXRlU2xvdFxuICAgICAgICAvLyB3aXRoIHRoZSBwcmV2aW91cyBvbmUuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5ld0ZpYmVyO1xuICAgICAgfVxuICAgICAgcHJldmlvdXNOZXdGaWJlciA9IG5ld0ZpYmVyO1xuICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgfVxuXG4gICAgaWYgKG5ld0lkeCA9PT0gbmV3Q2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIG5ldyBjaGlsZHJlbi4gV2UgY2FuIGRlbGV0ZSB0aGUgcmVzdC5cbiAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9XG5cbiAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgZXhpc3RpbmcgY2hpbGRyZW4gd2UgY2FuIGNob29zZSBhIGZhc3QgcGF0aFxuICAgICAgLy8gc2luY2UgdGhlIHJlc3Qgd2lsbCBhbGwgYmUgaW5zZXJ0aW9ucy5cbiAgICAgIGZvciAoOyBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICAgIHZhciBfbmV3RmliZXIgPSBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgbmV3Q2hpbGRyZW5bbmV3SWR4XSwgZXhwaXJhdGlvblRpbWUpO1xuICAgICAgICBpZiAoIV9uZXdGaWJlcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyO1xuICAgICAgICB9XG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9XG5cbiAgICAvLyBBZGQgYWxsIGNoaWxkcmVuIHRvIGEga2V5IG1hcCBmb3IgcXVpY2sgbG9va3Vwcy5cbiAgICB2YXIgZXhpc3RpbmdDaGlsZHJlbiA9IG1hcFJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG5cbiAgICAvLyBLZWVwIHNjYW5uaW5nIGFuZCB1c2UgdGhlIG1hcCB0byByZXN0b3JlIGRlbGV0ZWQgaXRlbXMgYXMgbW92ZXMuXG4gICAgZm9yICg7IG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgIHZhciBfbmV3RmliZXIyID0gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZHJlbltuZXdJZHhdLCBleHBpcmF0aW9uVGltZSk7XG4gICAgICBpZiAoX25ld0ZpYmVyMikge1xuICAgICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICAgIGlmIChfbmV3RmliZXIyLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlIG5ldyBmaWJlciBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MsIGJ1dCBpZiB0aGVyZSBleGlzdHMgYVxuICAgICAgICAgICAgLy8gY3VycmVudCwgdGhhdCBtZWFucyB0aGF0IHdlIHJldXNlZCB0aGUgZmliZXIuIFdlIG5lZWQgdG8gZGVsZXRlXG4gICAgICAgICAgICAvLyBpdCBmcm9tIHRoZSBjaGlsZCBsaXN0IHNvIHRoYXQgd2UgZG9uJ3QgYWRkIGl0IHRvIHRoZSBkZWxldGlvblxuICAgICAgICAgICAgLy8gbGlzdC5cbiAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZGVsZXRlKF9uZXdGaWJlcjIua2V5ID09PSBudWxsID8gbmV3SWR4IDogX25ld0ZpYmVyMi5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlcjIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXIyO1xuICAgICAgICB9XG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXIyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBBbnkgZXhpc3RpbmcgY2hpbGRyZW4gdGhhdCB3ZXJlbid0IGNvbnN1bWVkIGFib3ZlIHdlcmUgZGVsZXRlZC4gV2UgbmVlZFxuICAgICAgLy8gdG8gYWRkIHRoZW0gdG8gdGhlIGRlbGV0aW9uIGxpc3QuXG4gICAgICBleGlzdGluZ0NoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGRyZW5JdGVyYWJsZSwgZXhwaXJhdGlvblRpbWUpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uIGFzIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkoKSxcbiAgICAvLyBidXQgdXNpbmcgdGhlIGl0ZXJhdG9yIGluc3RlYWQuXG5cbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG4gICAgISh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykgPyBpbnZhcmlhbnQoZmFsc2UsICdBbiBvYmplY3QgaXMgbm90IGFuIGl0ZXJhYmxlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpIDogdm9pZCAwO1xuXG4gICAge1xuICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCByZW5kZXJpbmcgR2VuZXJhdG9ycyBiZWNhdXNlIGl0J3MgYSBtdXRhdGlvbi5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEyOTk1XG4gICAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCB0b1N0cmluZ1RhZ1xuICAgICAgbmV3Q2hpbGRyZW5JdGVyYWJsZVtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnR2VuZXJhdG9yJykge1xuICAgICAgICAhZGlkV2FybkFib3V0R2VuZXJhdG9ycyA/IHdhcm5pbmckMShmYWxzZSwgJ1VzaW5nIEdlbmVyYXRvcnMgYXMgY2hpbGRyZW4gaXMgdW5zdXBwb3J0ZWQgYW5kIHdpbGwgbGlrZWx5IHlpZWxkICcgKyAndW5leHBlY3RlZCByZXN1bHRzIGJlY2F1c2UgZW51bWVyYXRpbmcgYSBnZW5lcmF0b3IgbXV0YXRlcyBpdC4gJyArICdZb3UgbWF5IGNvbnZlcnQgaXQgdG8gYW4gYXJyYXkgd2l0aCBgQXJyYXkuZnJvbSgpYCBvciB0aGUgJyArICdgWy4uLnNwcmVhZF1gIG9wZXJhdG9yIGJlZm9yZSByZW5kZXJpbmcuIEtlZXAgaW4gbWluZCAnICsgJ3lvdSBtaWdodCBuZWVkIHRvIHBvbHlmaWxsIHRoZXNlIGZlYXR1cmVzIGZvciBvbGRlciBicm93c2Vycy4nKSA6IHZvaWQgMDtcbiAgICAgICAgZGlkV2FybkFib3V0R2VuZXJhdG9ycyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFdhcm4gYWJvdXQgdXNpbmcgTWFwcyBhcyBjaGlsZHJlblxuICAgICAgaWYgKG5ld0NoaWxkcmVuSXRlcmFibGUuZW50cmllcyA9PT0gaXRlcmF0b3JGbikge1xuICAgICAgICAhZGlkV2FybkFib3V0TWFwcyA/IHdhcm5pbmckMShmYWxzZSwgJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgdW5zdXBwb3J0ZWQgYW5kIHdpbGwgbGlrZWx5IHlpZWxkICcgKyAndW5leHBlY3RlZCByZXN1bHRzLiBDb252ZXJ0IGl0IHRvIGEgc2VxdWVuY2UvaXRlcmFibGUgb2Yga2V5ZWQgJyArICdSZWFjdEVsZW1lbnRzIGluc3RlYWQuJykgOiB2b2lkIDA7XG4gICAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBGaXJzdCwgdmFsaWRhdGUga2V5cy5cbiAgICAgIC8vIFdlJ2xsIGdldCBhIGRpZmZlcmVudCBpdGVyYXRvciBsYXRlciBmb3IgdGhlIG1haW4gcGFzcy5cbiAgICAgIHZhciBfbmV3Q2hpbGRyZW4gPSBpdGVyYXRvckZuLmNhbGwobmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG4gICAgICBpZiAoX25ld0NoaWxkcmVuKSB7XG4gICAgICAgIHZhciBrbm93bktleXMgPSBudWxsO1xuICAgICAgICB2YXIgX3N0ZXAgPSBfbmV3Q2hpbGRyZW4ubmV4dCgpO1xuICAgICAgICBmb3IgKDsgIV9zdGVwLmRvbmU7IF9zdGVwID0gX25ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgICAgIHZhciBjaGlsZCA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgIGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbmV3Q2hpbGRyZW4gPSBpdGVyYXRvckZuLmNhbGwobmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG4gICAgIShuZXdDaGlsZHJlbiAhPSBudWxsKSA/IGludmFyaWFudChmYWxzZSwgJ0FuIGl0ZXJhYmxlIG9iamVjdCBwcm92aWRlZCBubyBpdGVyYXRvci4nKSA6IHZvaWQgMDtcblxuICAgIHZhciByZXN1bHRpbmdGaXJzdENoaWxkID0gbnVsbDtcbiAgICB2YXIgcHJldmlvdXNOZXdGaWJlciA9IG51bGw7XG5cbiAgICB2YXIgb2xkRmliZXIgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB2YXIgbGFzdFBsYWNlZEluZGV4ID0gMDtcbiAgICB2YXIgbmV3SWR4ID0gMDtcbiAgICB2YXIgbmV4dE9sZEZpYmVyID0gbnVsbDtcblxuICAgIHZhciBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpO1xuICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgaWYgKG9sZEZpYmVyLmluZGV4ID4gbmV3SWR4KSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyO1xuICAgICAgICBvbGRGaWJlciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlci5zaWJsaW5nO1xuICAgICAgfVxuICAgICAgdmFyIG5ld0ZpYmVyID0gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIHN0ZXAudmFsdWUsIGV4cGlyYXRpb25UaW1lKTtcbiAgICAgIGlmIChuZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGJyZWFrcyBvbiBlbXB0eSBzbG90cyBsaWtlIG51bGwgY2hpbGRyZW4uIFRoYXQnc1xuICAgICAgICAvLyB1bmZvcnR1bmF0ZSBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBzbG93IHBhdGggYWxsIHRoZSB0aW1lLiBXZSBuZWVkXG4gICAgICAgIC8vIGEgYmV0dGVyIHdheSB0byBjb21tdW5pY2F0ZSB3aGV0aGVyIHRoaXMgd2FzIGEgbWlzcyBvciBudWxsLFxuICAgICAgICAvLyBib29sZWFuLCB1bmRlZmluZWQsIGV0Yy5cbiAgICAgICAgaWYgKCFvbGRGaWJlcikge1xuICAgICAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgaWYgKG9sZEZpYmVyICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIG1hdGNoZWQgdGhlIHNsb3QsIGJ1dCB3ZSBkaWRuJ3QgcmV1c2UgdGhlIGV4aXN0aW5nIGZpYmVyLCBzbyB3ZVxuICAgICAgICAgIC8vIG5lZWQgdG8gZGVsZXRlIHRoZSBleGlzdGluZyBjaGlsZC5cbiAgICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG4gICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uXG4gICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBuZXdGaWJlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IERlZmVyIHNpYmxpbmdzIGlmIHdlJ3JlIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXggZm9yIHRoaXMgc2xvdC5cbiAgICAgICAgLy8gSS5lLiBpZiB3ZSBoYWQgbnVsbCB2YWx1ZXMgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gZGVmZXIgdGhpc1xuICAgICAgICAvLyBmb3IgZWFjaCBudWxsIHZhbHVlLiBIb3dldmVyLCB3ZSBhbHNvIGRvbid0IHdhbnQgdG8gY2FsbCB1cGRhdGVTbG90XG4gICAgICAgIC8vIHdpdGggdGhlIHByZXZpb3VzIG9uZS5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gbmV3RmliZXI7XG4gICAgICB9XG4gICAgICBwcmV2aW91c05ld0ZpYmVyID0gbmV3RmliZXI7XG4gICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICB9XG5cbiAgICBpZiAoc3RlcC5kb25lKSB7XG4gICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIG5ldyBjaGlsZHJlbi4gV2UgY2FuIGRlbGV0ZSB0aGUgcmVzdC5cbiAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9XG5cbiAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgZXhpc3RpbmcgY2hpbGRyZW4gd2UgY2FuIGNob29zZSBhIGZhc3QgcGF0aFxuICAgICAgLy8gc2luY2UgdGhlIHJlc3Qgd2lsbCBhbGwgYmUgaW5zZXJ0aW9ucy5cbiAgICAgIGZvciAoOyAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgICB2YXIgX25ld0ZpYmVyMyA9IGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBzdGVwLnZhbHVlLCBleHBpcmF0aW9uVGltZSk7XG4gICAgICAgIGlmIChfbmV3RmliZXIzID09PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIzLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXIzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjM7XG4gICAgICAgIH1cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjM7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICB9XG5cbiAgICAvLyBBZGQgYWxsIGNoaWxkcmVuIHRvIGEga2V5IG1hcCBmb3IgcXVpY2sgbG9va3Vwcy5cbiAgICB2YXIgZXhpc3RpbmdDaGlsZHJlbiA9IG1hcFJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG5cbiAgICAvLyBLZWVwIHNjYW5uaW5nIGFuZCB1c2UgdGhlIG1hcCB0byByZXN0b3JlIGRlbGV0ZWQgaXRlbXMgYXMgbW92ZXMuXG4gICAgZm9yICg7ICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICB2YXIgX25ld0ZpYmVyNCA9IHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgc3RlcC52YWx1ZSwgZXhwaXJhdGlvblRpbWUpO1xuICAgICAgaWYgKF9uZXdGaWJlcjQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgICBpZiAoX25ld0ZpYmVyNC5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRoZSBuZXcgZmliZXIgaXMgYSB3b3JrIGluIHByb2dyZXNzLCBidXQgaWYgdGhlcmUgZXhpc3RzIGFcbiAgICAgICAgICAgIC8vIGN1cnJlbnQsIHRoYXQgbWVhbnMgdGhhdCB3ZSByZXVzZWQgdGhlIGZpYmVyLiBXZSBuZWVkIHRvIGRlbGV0ZVxuICAgICAgICAgICAgLy8gaXQgZnJvbSB0aGUgY2hpbGQgbGlzdCBzbyB0aGF0IHdlIGRvbid0IGFkZCBpdCB0byB0aGUgZGVsZXRpb25cbiAgICAgICAgICAgIC8vIGxpc3QuXG4gICAgICAgICAgICBleGlzdGluZ0NoaWxkcmVuLmRlbGV0ZShfbmV3RmliZXI0LmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IF9uZXdGaWJlcjQua2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXI0LCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyNDtcbiAgICAgICAgfVxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyNDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gQW55IGV4aXN0aW5nIGNoaWxkcmVuIHRoYXQgd2VyZW4ndCBjb25zdW1lZCBhYm92ZSB3ZXJlIGRlbGV0ZWQuIFdlIG5lZWRcbiAgICAgIC8vIHRvIGFkZCB0aGVtIHRvIHRoZSBkZWxldGlvbiBsaXN0LlxuICAgICAgZXhpc3RpbmdDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlU2luZ2xlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCB0ZXh0Q29udGVudCwgZXhwaXJhdGlvblRpbWUpIHtcbiAgICAvLyBUaGVyZSdzIG5vIG5lZWQgdG8gY2hlY2sgZm9yIGtleXMgb24gdGV4dCBub2RlcyBzaW5jZSB3ZSBkb24ndCBoYXZlIGFcbiAgICAvLyB3YXkgdG8gZGVmaW5lIHRoZW0uXG4gICAgaWYgKGN1cnJlbnRGaXJzdENoaWxkICE9PSBudWxsICYmIGN1cnJlbnRGaXJzdENoaWxkLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgIC8vIFdlIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBub2RlIHNvIGxldCdzIGp1c3QgdXBkYXRlIGl0IGFuZCBkZWxldGVcbiAgICAgIC8vIHRoZSByZXN0LlxuICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLnNpYmxpbmcpO1xuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudEZpcnN0Q2hpbGQsIHRleHRDb250ZW50LCBleHBpcmF0aW9uVGltZSk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gICAgLy8gVGhlIGV4aXN0aW5nIGZpcnN0IGNoaWxkIGlzIG5vdCBhIHRleHQgbm9kZSBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBvbmVcbiAgICAvLyBhbmQgZGVsZXRlIHRoZSBleGlzdGluZyBvbmVzLlxuICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KHRleHRDb250ZW50LCByZXR1cm5GaWJlci5tb2RlLCBleHBpcmF0aW9uVGltZSk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZUVsZW1lbnQocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBlbGVtZW50LCBleHBpcmF0aW9uVGltZSkge1xuICAgIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgICB2YXIgY2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRPRE86IElmIGtleSA9PT0gbnVsbCBhbmQgY2hpbGQua2V5ID09PSBudWxsLCB0aGVuIHRoaXMgb25seSBhcHBsaWVzIHRvXG4gICAgICAvLyB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdC5cbiAgICAgIGlmIChjaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICBpZiAoY2hpbGQudGFnID09PSBGcmFnbWVudCA/IGVsZW1lbnQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSA6IGNoaWxkLmVsZW1lbnRUeXBlID09PSBlbGVtZW50LnR5cGUpIHtcbiAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG4gICAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY2hpbGQsIGVsZW1lbnQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSA/IGVsZW1lbnQucHJvcHMuY2hpbGRyZW4gOiBlbGVtZW50LnByb3BzLCBleHBpcmF0aW9uVGltZSk7XG4gICAgICAgICAgZXhpc3RpbmcucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjaGlsZCwgZWxlbWVudCk7XG4gICAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAge1xuICAgICAgICAgICAgZXhpc3RpbmcuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgICAgICAgICAgZXhpc3RpbmcuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9XG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChlbGVtZW50LnByb3BzLmNoaWxkcmVuLCByZXR1cm5GaWJlci5tb2RlLCBleHBpcmF0aW9uVGltZSwgZWxlbWVudC5rZXkpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NyZWF0ZWQ0ID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBleHBpcmF0aW9uVGltZSk7XG4gICAgICBfY3JlYXRlZDQucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgZWxlbWVudCk7XG4gICAgICBfY3JlYXRlZDQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gX2NyZWF0ZWQ0O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZVBvcnRhbChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIHBvcnRhbCwgZXhwaXJhdGlvblRpbWUpIHtcbiAgICB2YXIga2V5ID0gcG9ydGFsLmtleTtcbiAgICB2YXIgY2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRPRE86IElmIGtleSA9PT0gbnVsbCBhbmQgY2hpbGQua2V5ID09PSBudWxsLCB0aGVuIHRoaXMgb25seSBhcHBsaWVzIHRvXG4gICAgICAvLyB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdC5cbiAgICAgIGlmIChjaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICBpZiAoY2hpbGQudGFnID09PSBIb3N0UG9ydGFsICYmIGNoaWxkLnN0YXRlTm9kZS5jb250YWluZXJJbmZvID09PSBwb3J0YWwuY29udGFpbmVySW5mbyAmJiBjaGlsZC5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24gPT09IHBvcnRhbC5pbXBsZW1lbnRhdGlvbikge1xuICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZC5zaWJsaW5nKTtcbiAgICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjaGlsZCwgcG9ydGFsLmNoaWxkcmVuIHx8IFtdLCBleHBpcmF0aW9uVGltZSk7XG4gICAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9XG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwocG9ydGFsLCByZXR1cm5GaWJlci5tb2RlLCBleHBpcmF0aW9uVGltZSk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIC8vIFRoaXMgQVBJIHdpbGwgdGFnIHRoZSBjaGlsZHJlbiB3aXRoIHRoZSBzaWRlLWVmZmVjdCBvZiB0aGUgcmVjb25jaWxpYXRpb25cbiAgLy8gaXRzZWxmLiBUaGV5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNpZGUtZWZmZWN0IGxpc3QgYXMgd2UgcGFzcyB0aHJvdWdoIHRoZVxuICAvLyBjaGlsZHJlbiBhbmQgdGhlIHBhcmVudC5cbiAgZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRGaWJlcnMocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgZXhwaXJhdGlvblRpbWUpIHtcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWN1cnNpdmUuXG4gICAgLy8gSWYgdGhlIHRvcCBsZXZlbCBpdGVtIGlzIGFuIGFycmF5LCB3ZSB0cmVhdCBpdCBhcyBhIHNldCBvZiBjaGlsZHJlbixcbiAgICAvLyBub3QgYXMgYSBmcmFnbWVudC4gTmVzdGVkIGFycmF5cyBvbiB0aGUgb3RoZXIgaGFuZCB3aWxsIGJlIHRyZWF0ZWQgYXNcbiAgICAvLyBmcmFnbWVudCBub2Rlcy4gUmVjdXJzaW9uIGhhcHBlbnMgYXQgdGhlIG5vcm1hbCBmbG93LlxuXG4gICAgLy8gSGFuZGxlIHRvcCBsZXZlbCB1bmtleWVkIGZyYWdtZW50cyBhcyBpZiB0aGV5IHdlcmUgYXJyYXlzLlxuICAgIC8vIFRoaXMgbGVhZHMgdG8gYW4gYW1iaWd1aXR5IGJldHdlZW4gPD57Wy4uLl19PC8+IGFuZCA8Pi4uLjwvPi5cbiAgICAvLyBXZSB0cmVhdCB0aGUgYW1iaWd1b3VzIGNhc2VzIGFib3ZlIHRoZSBzYW1lLlxuICAgIHZhciBpc1Vua2V5ZWRUb3BMZXZlbEZyYWdtZW50ID0gdHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCAmJiBuZXdDaGlsZC50eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFICYmIG5ld0NoaWxkLmtleSA9PT0gbnVsbDtcbiAgICBpZiAoaXNVbmtleWVkVG9wTGV2ZWxGcmFnbWVudCkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXdDaGlsZC5wcm9wcy5jaGlsZHJlbjtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgb2JqZWN0IHR5cGVzXG4gICAgdmFyIGlzT2JqZWN0ID0gdHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbDtcblxuICAgIGlmIChpc09iamVjdCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZWNvbmNpbGVTaW5nbGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGV4cGlyYXRpb25UaW1lKSk7XG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGV4cGlyYXRpb25UaW1lKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCAnJyArIG5ld0NoaWxkLCBleHBpcmF0aW9uVGltZSkpO1xuICAgIH1cblxuICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSkge1xuICAgICAgcmV0dXJuIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgZXhwaXJhdGlvblRpbWUpO1xuICAgIH1cblxuICAgIGlmIChnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgcmV0dXJuIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgZXhwaXJhdGlvblRpbWUpO1xuICAgIH1cblxuICAgIGlmIChpc09iamVjdCkge1xuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3VuZGVmaW5lZCcgJiYgIWlzVW5rZXllZFRvcExldmVsRnJhZ21lbnQpIHtcbiAgICAgIC8vIElmIHRoZSBuZXcgY2hpbGQgaXMgdW5kZWZpbmVkLCBhbmQgdGhlIHJldHVybiBmaWJlciBpcyBhIGNvbXBvc2l0ZVxuICAgICAgLy8gY29tcG9uZW50LCB0aHJvdyBhbiBlcnJvci4gSWYgRmliZXIgcmV0dXJuIHR5cGVzIGFyZSBkaXNhYmxlZCxcbiAgICAgIC8vIHdlIGFscmVhZHkgdGhyZXcgYWJvdmUuXG4gICAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucmVuZGVyLl9pc01vY2tGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgIC8vIFdlIGFsbG93IGF1dG8tbW9ja3MgdG8gcHJvY2VlZCBhcyBpZiB0aGV5J3JlIHJldHVybmluZyBudWxsLlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGZhbGwgdGhyb3VnaCB0byB0aGUgbmV4dCBjYXNlLCB3aGljaCBoYW5kbGVzIGJvdGhcbiAgICAgICAgLy8gZnVuY3Rpb25zIGFuZCBjbGFzc2VzXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZWQgbm8tZmFsbHRocm91Z2hcbiAgICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgQ29tcG9uZW50ID0gcmV0dXJuRmliZXIudHlwZTtcbiAgICAgICAgICAgIGludmFyaWFudChmYWxzZSwgJyVzKC4uLik6IE5vdGhpbmcgd2FzIHJldHVybmVkIGZyb20gcmVuZGVyLiBUaGlzIHVzdWFsbHkgbWVhbnMgYSByZXR1cm4gc3RhdGVtZW50IGlzIG1pc3NpbmcuIE9yLCB0byByZW5kZXIgbm90aGluZywgcmV0dXJuIG51bGwuJywgQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtYWluaW5nIGNhc2VzIGFyZSBhbGwgdHJlYXRlZCBhcyBlbXB0eS5cbiAgICByZXR1cm4gZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKTtcbiAgfVxuXG4gIHJldHVybiByZWNvbmNpbGVDaGlsZEZpYmVycztcbn1cblxudmFyIHJlY29uY2lsZUNoaWxkRmliZXJzID0gQ2hpbGRSZWNvbmNpbGVyKHRydWUpO1xudmFyIG1vdW50Q2hpbGRGaWJlcnMgPSBDaGlsZFJlY29uY2lsZXIoZmFsc2UpO1xuXG5mdW5jdGlvbiBjbG9uZUNoaWxkRmliZXJzKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzKSB7XG4gICEoY3VycmVudCQkMSA9PT0gbnVsbCB8fCB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9PT0gY3VycmVudCQkMS5jaGlsZCkgPyBpbnZhcmlhbnQoZmFsc2UsICdSZXN1bWluZyB3b3JrIG5vdCB5ZXQgaW1wbGVtZW50ZWQuJykgOiB2b2lkIDA7XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzLmNoaWxkID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRDaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB2YXIgbmV3Q2hpbGQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIGN1cnJlbnRDaGlsZC5wZW5kaW5nUHJvcHMsIGN1cnJlbnRDaGlsZC5leHBpcmF0aW9uVGltZSk7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV3Q2hpbGQ7XG5cbiAgbmV3Q2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHdoaWxlIChjdXJyZW50Q2hpbGQuc2libGluZyAhPT0gbnVsbCkge1xuICAgIGN1cnJlbnRDaGlsZCA9IGN1cnJlbnRDaGlsZC5zaWJsaW5nO1xuICAgIG5ld0NoaWxkID0gbmV3Q2hpbGQuc2libGluZyA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRDaGlsZCwgY3VycmVudENoaWxkLnBlbmRpbmdQcm9wcywgY3VycmVudENoaWxkLmV4cGlyYXRpb25UaW1lKTtcbiAgICBuZXdDaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgfVxuICBuZXdDaGlsZC5zaWJsaW5nID0gbnVsbDtcbn1cblxudmFyIE5PX0NPTlRFWFQgPSB7fTtcblxudmFyIGNvbnRleHRTdGFja0N1cnNvciQxID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xudmFyIGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xudmFyIHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xuXG5mdW5jdGlvbiByZXF1aXJlZENvbnRleHQoYykge1xuICAhKGMgIT09IE5PX0NPTlRFWFQpID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgaG9zdCBjb250ZXh0IHRvIGV4aXN0LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpIDogdm9pZCAwO1xuICByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250YWluZXIoKSB7XG4gIHZhciByb290SW5zdGFuY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gIHJldHVybiByb290SW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Q29udGFpbmVyKGZpYmVyLCBuZXh0Um9vdEluc3RhbmNlKSB7XG4gIC8vIFB1c2ggY3VycmVudCByb290IGluc3RhbmNlIG9udG8gdGhlIHN0YWNrO1xuICAvLyBUaGlzIGFsbG93cyB1cyB0byByZXNldCByb290IHdoZW4gcG9ydGFscyBhcmUgcG9wcGVkLlxuICBwdXNoKHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLCBuZXh0Um9vdEluc3RhbmNlLCBmaWJlcik7XG4gIC8vIFRyYWNrIHRoZSBjb250ZXh0IGFuZCB0aGUgRmliZXIgdGhhdCBwcm92aWRlZCBpdC5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIHBvcCBvbmx5IEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuICBwdXNoKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlciwgZmliZXIpO1xuXG4gIC8vIEZpbmFsbHksIHdlIG5lZWQgdG8gcHVzaCB0aGUgaG9zdCBjb250ZXh0IHRvIHRoZSBzdGFjay5cbiAgLy8gSG93ZXZlciwgd2UgY2FuJ3QganVzdCBjYWxsIGdldFJvb3RIb3N0Q29udGV4dCgpIGFuZCBwdXNoIGl0IGJlY2F1c2VcbiAgLy8gd2UnZCBoYXZlIGEgZGlmZmVyZW50IG51bWJlciBvZiBlbnRyaWVzIG9uIHRoZSBzdGFjayBkZXBlbmRpbmcgb25cbiAgLy8gd2hldGhlciBnZXRSb290SG9zdENvbnRleHQoKSB0aHJvd3Mgc29tZXdoZXJlIGluIHJlbmRlcmVyIGNvZGUgb3Igbm90LlxuICAvLyBTbyB3ZSBwdXNoIGFuIGVtcHR5IHZhbHVlIGZpcnN0LiBUaGlzIGxldHMgdXMgc2FmZWx5IHVud2luZCBvbiBlcnJvcnMuXG4gIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yJDEsIE5PX0NPTlRFWFQsIGZpYmVyKTtcbiAgdmFyIG5leHRSb290Q29udGV4dCA9IGdldFJvb3RIb3N0Q29udGV4dChuZXh0Um9vdEluc3RhbmNlKTtcbiAgLy8gTm93IHRoYXQgd2Uga25vdyB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgdGhyb3csIHJlcGxhY2UgaXQuXG4gIHBvcChjb250ZXh0U3RhY2tDdXJzb3IkMSwgZmliZXIpO1xuICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciQxLCBuZXh0Um9vdENvbnRleHQsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gcG9wSG9zdENvbnRhaW5lcihmaWJlcikge1xuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcG9wKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gIHBvcChyb290SW5zdGFuY2VTdGFja0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRIb3N0Q29udGV4dCgpIHtcbiAgdmFyIGNvbnRleHQgPSByZXF1aXJlZENvbnRleHQoY29udGV4dFN0YWNrQ3Vyc29yJDEuY3VycmVudCk7XG4gIHJldHVybiBjb250ZXh0O1xufVxuXG5mdW5jdGlvbiBwdXNoSG9zdENvbnRleHQoZmliZXIpIHtcbiAgdmFyIHJvb3RJbnN0YW5jZSA9IHJlcXVpcmVkQ29udGV4dChyb290SW5zdGFuY2VTdGFja0N1cnNvci5jdXJyZW50KTtcbiAgdmFyIGNvbnRleHQgPSByZXF1aXJlZENvbnRleHQoY29udGV4dFN0YWNrQ3Vyc29yJDEuY3VycmVudCk7XG4gIHZhciBuZXh0Q29udGV4dCA9IGdldENoaWxkSG9zdENvbnRleHQoY29udGV4dCwgZmliZXIudHlwZSwgcm9vdEluc3RhbmNlKTtcblxuICAvLyBEb24ndCBwdXNoIHRoaXMgRmliZXIncyBjb250ZXh0IHVubGVzcyBpdCdzIHVuaXF1ZS5cbiAgaWYgKGNvbnRleHQgPT09IG5leHRDb250ZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVHJhY2sgdGhlIGNvbnRleHQgYW5kIHRoZSBGaWJlciB0aGF0IHByb3ZpZGVkIGl0LlxuICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gcG9wIG9ubHkgRmliZXJzIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29udGV4dHMuXG4gIHB1c2goY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlcik7XG4gIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yJDEsIG5leHRDb250ZXh0LCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHBvcEhvc3RDb250ZXh0KGZpYmVyKSB7XG4gIC8vIERvIG5vdCBwb3AgdW5sZXNzIHRoaXMgRmliZXIgcHJvdmlkZWQgdGhlIGN1cnJlbnQgY29udGV4dC5cbiAgLy8gcHVzaEhvc3RDb250ZXh0KCkgb25seSBwdXNoZXMgRmliZXJzIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29udGV4dHMuXG4gIGlmIChjb250ZXh0RmliZXJTdGFja0N1cnNvci5jdXJyZW50ICE9PSBmaWJlcikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHBvcChjb250ZXh0U3RhY2tDdXJzb3IkMSwgZmliZXIpO1xuICBwb3AoY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyKTtcbn1cblxudmFyIE5vRWZmZWN0JDEgPSAvKiAgICAgICAgICAgICAqLzA7XG52YXIgVW5tb3VudFNuYXBzaG90ID0gLyogICAgICAqLzI7XG52YXIgVW5tb3VudE11dGF0aW9uID0gLyogICAgICAqLzQ7XG52YXIgTW91bnRNdXRhdGlvbiA9IC8qICAgICAgICAqLzg7XG52YXIgVW5tb3VudExheW91dCA9IC8qICAgICAgICAqLzE2O1xudmFyIE1vdW50TGF5b3V0ID0gLyogICAgICAgICAgKi8zMjtcbnZhciBNb3VudFBhc3NpdmUgPSAvKiAgICAgICAgICovNjQ7XG52YXIgVW5tb3VudFBhc3NpdmUgPSAvKiAgICAgICAqLzEyODtcblxudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG5cblxudmFyIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudCA9IHZvaWQgMDtcbntcbiAgZGlkV2FybkFib3V0TWlzbWF0Y2hlZEhvb2tzRm9yQ29tcG9uZW50ID0gbmV3IFNldCgpO1xufVxuXG4vLyBUaGVzZSBhcmUgc2V0IHJpZ2h0IGJlZm9yZSBjYWxsaW5nIHRoZSBjb21wb25lbnQuXG52YXIgcmVuZGVyRXhwaXJhdGlvblRpbWUgPSBOb1dvcms7XG4vLyBUaGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci4gSSd2ZSBuYW1lZCBpdCBkaWZmZXJlbnRseSB0byBkaXN0aW5ndWlzaCBpdCBmcm9tXG4vLyB0aGUgd29yay1pbi1wcm9ncmVzcyBob29rLlxudmFyIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSBudWxsO1xuXG4vLyBIb29rcyBhcmUgc3RvcmVkIGFzIGEgbGlua2VkIGxpc3Qgb24gdGhlIGZpYmVyJ3MgbWVtb2l6ZWRTdGF0ZSBmaWVsZC4gVGhlXG4vLyBjdXJyZW50IGhvb2sgbGlzdCBpcyB0aGUgbGlzdCB0aGF0IGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgZmliZXIuIFRoZVxuLy8gd29yay1pbi1wcm9ncmVzcyBob29rIGxpc3QgaXMgYSBuZXcgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlXG4vLyB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxudmFyIGN1cnJlbnRIb29rID0gbnVsbDtcbnZhciBuZXh0Q3VycmVudEhvb2sgPSBudWxsO1xudmFyIGZpcnN0V29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbnZhciB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xudmFyIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuXG52YXIgcmVtYWluaW5nRXhwaXJhdGlvblRpbWUgPSBOb1dvcms7XG52YXIgY29tcG9uZW50VXBkYXRlUXVldWUgPSBudWxsO1xudmFyIHNpZGVFZmZlY3RUYWcgPSAwO1xuXG4vLyBVcGRhdGVzIHNjaGVkdWxlZCBkdXJpbmcgcmVuZGVyIHdpbGwgdHJpZ2dlciBhbiBpbW1lZGlhdGUgcmUtcmVuZGVyIGF0IHRoZVxuLy8gZW5kIG9mIHRoZSBjdXJyZW50IHBhc3MuIFdlIGNhbid0IHN0b3JlIHRoZXNlIHVwZGF0ZXMgb24gdGhlIG5vcm1hbCBxdWV1ZSxcbi8vIGJlY2F1c2UgaWYgdGhlIHdvcmsgaXMgYWJvcnRlZCwgdGhleSBzaG91bGQgYmUgZGlzY2FyZGVkLiBCZWNhdXNlIHRoaXMgaXNcbi8vIGEgcmVsYXRpdmVseSByYXJlIGNhc2UsIHdlIGFsc28gZG9uJ3Qgd2FudCB0byBhZGQgYW4gYWRkaXRpb25hbCBmaWVsZCB0b1xuLy8gZWl0aGVyIHRoZSBob29rIG9yIHF1ZXVlIG9iamVjdCB0eXBlcy4gU28gd2Ugc3RvcmUgdGhlbSBpbiBhIGxhemlseSBjcmVhdGVcbi8vIG1hcCBvZiBxdWV1ZSAtPiByZW5kZXItcGhhc2UgdXBkYXRlcywgd2hpY2ggYXJlIGRpc2NhcmRlZCBvbmNlIHRoZSBjb21wb25lbnRcbi8vIGNvbXBsZXRlcyB3aXRob3V0IHJlLXJlbmRlcmluZy5cblxuLy8gV2hldGhlciBhbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBkdXJpbmcgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgcmVuZGVyIHBhc3MuXG52YXIgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlO1xuLy8gTGF6aWx5IGNyZWF0ZWQgbWFwIG9mIHJlbmRlci1waGFzZSB1cGRhdGVzXG52YXIgcmVuZGVyUGhhc2VVcGRhdGVzID0gbnVsbDtcbi8vIENvdW50ZXIgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wcy5cbnZhciBudW1iZXJPZlJlUmVuZGVycyA9IDA7XG52YXIgUkVfUkVOREVSX0xJTUlUID0gMjU7XG5cbi8vIEluIERFViwgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBwcmltaXRpdmUgaG9va1xudmFyIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbDtcblxuLy8gSW4gREVWLCB0aGlzIGxpc3QgZW5zdXJlcyB0aGF0IGhvb2tzIGFyZSBjYWxsZWQgaW4gdGhlIHNhbWUgb3JkZXIgYmV0d2VlbiByZW5kZXJzLlxuLy8gVGhlIGxpc3Qgc3RvcmVzIHRoZSBvcmRlciBvZiBob29rcyB1c2VkIGR1cmluZyB0aGUgaW5pdGlhbCByZW5kZXIgKG1vdW50KS5cbi8vIFN1YnNlcXVlbnQgcmVuZGVycyAodXBkYXRlcykgcmVmZXJlbmNlIHRoaXMgbGlzdC5cbnZhciBob29rVHlwZXNEZXYgPSBudWxsO1xudmFyIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7XG5cbmZ1bmN0aW9uIG1vdW50SG9va1R5cGVzRGV2KCkge1xuICB7XG4gICAgdmFyIGhvb2tOYW1lID0gY3VycmVudEhvb2tOYW1lSW5EZXY7XG5cbiAgICBpZiAoaG9va1R5cGVzRGV2ID09PSBudWxsKSB7XG4gICAgICBob29rVHlwZXNEZXYgPSBbaG9va05hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBob29rVHlwZXNEZXYucHVzaChob29rTmFtZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvb2tUeXBlc0RldigpIHtcbiAge1xuICAgIHZhciBob29rTmFtZSA9IGN1cnJlbnRIb29rTmFtZUluRGV2O1xuXG4gICAgaWYgKGhvb2tUeXBlc0RldiAhPT0gbnVsbCkge1xuICAgICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYrKztcbiAgICAgIGlmIChob29rVHlwZXNEZXZbaG9va1R5cGVzVXBkYXRlSW5kZXhEZXZdICE9PSBob29rTmFtZSkge1xuICAgICAgICB3YXJuT25Ib29rTWlzbWF0Y2hJbkRldihob29rTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5Pbkhvb2tNaXNtYXRjaEluRGV2KGN1cnJlbnRIb29rTmFtZSkge1xuICB7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudHlwZSk7XG4gICAgaWYgKCFkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICAgIHZhciB0YWJsZSA9ICcnO1xuXG4gICAgICAgIHZhciBzZWNvbmRDb2x1bW5TdGFydCA9IDMwO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2OyBpKyspIHtcbiAgICAgICAgICB2YXIgb2xkSG9va05hbWUgPSBob29rVHlwZXNEZXZbaV07XG4gICAgICAgICAgdmFyIG5ld0hvb2tOYW1lID0gaSA9PT0gaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPyBjdXJyZW50SG9va05hbWUgOiBvbGRIb29rTmFtZTtcblxuICAgICAgICAgIHZhciByb3cgPSBpICsgMSArICcuICcgKyBvbGRIb29rTmFtZTtcblxuICAgICAgICAgIC8vIEV4dHJhIHNwYWNlIHNvIHNlY29uZCBjb2x1bW4gbGluZXMgdXBcbiAgICAgICAgICAvLyBsb2wgQCBJRSBub3Qgc3VwcG9ydGluZyBTdHJpbmcjcmVwZWF0XG4gICAgICAgICAgd2hpbGUgKHJvdy5sZW5ndGggPCBzZWNvbmRDb2x1bW5TdGFydCkge1xuICAgICAgICAgICAgcm93ICs9ICcgJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByb3cgKz0gbmV3SG9va05hbWUgKyAnXFxuJztcblxuICAgICAgICAgIHRhYmxlICs9IHJvdztcbiAgICAgICAgfVxuXG4gICAgICAgIHdhcm5pbmckMShmYWxzZSwgJ1JlYWN0IGhhcyBkZXRlY3RlZCBhIGNoYW5nZSBpbiB0aGUgb3JkZXIgb2YgSG9va3MgY2FsbGVkIGJ5ICVzLiAnICsgJ1RoaXMgd2lsbCBsZWFkIHRvIGJ1Z3MgYW5kIGVycm9ycyBpZiBub3QgZml4ZWQuICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlYWQgdGhlIFJ1bGVzIG9mIEhvb2tzOiBodHRwczovL2ZiLm1lL3J1bGVzLW9mLWhvb2tzXFxuXFxuJyArICcgICBQcmV2aW91cyByZW5kZXIgICAgICAgICAgICBOZXh0IHJlbmRlclxcbicgKyAnICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuJyArICclcycgKyAnICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXFxuJywgY29tcG9uZW50TmFtZSwgdGFibGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0aHJvd0ludmFsaWRIb29rRXJyb3IoKSB7XG4gIGludmFyaWFudChmYWxzZSwgJ0ludmFsaWQgaG9vayBjYWxsLiBIb29rcyBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gY29tcG9uZW50LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4xLiBZb3UgbWlnaHQgaGF2ZSBtaXNtYXRjaGluZyB2ZXJzaW9ucyBvZiBSZWFjdCBhbmQgdGhlIHJlbmRlcmVyIChzdWNoIGFzIFJlYWN0IERPTSlcXG4yLiBZb3UgbWlnaHQgYmUgYnJlYWtpbmcgdGhlIFJ1bGVzIG9mIEhvb2tzXFxuMy4gWW91IG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0IGluIHRoZSBzYW1lIGFwcFxcblNlZSBodHRwczovL2ZiLm1lL3JlYWN0LWludmFsaWQtaG9vay1jYWxsIGZvciB0aXBzIGFib3V0IGhvdyB0byBkZWJ1ZyBhbmQgZml4IHRoaXMgcHJvYmxlbS4nKTtcbn1cblxuZnVuY3Rpb24gYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykge1xuICBpZiAocHJldkRlcHMgPT09IG51bGwpIHtcbiAgICB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICclcyByZWNlaXZlZCBhIGZpbmFsIGFyZ3VtZW50IGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IG5vdCBkdXJpbmcgJyArICd0aGUgcHJldmlvdXMgcmVuZGVyLiBFdmVuIHRob3VnaCB0aGUgZmluYWwgYXJndW1lbnQgaXMgb3B0aW9uYWwsICcgKyAnaXRzIHR5cGUgY2Fubm90IGNoYW5nZSBiZXR3ZWVuIHJlbmRlcnMuJywgY3VycmVudEhvb2tOYW1lSW5EZXYpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB7XG4gICAgLy8gRG9uJ3QgYm90aGVyIGNvbXBhcmluZyBsZW5ndGhzIGluIHByb2QgYmVjYXVzZSB0aGVzZSBhcnJheXMgc2hvdWxkIGJlXG4gICAgLy8gcGFzc2VkIGlubGluZS5cbiAgICBpZiAobmV4dERlcHMubGVuZ3RoICE9PSBwcmV2RGVwcy5sZW5ndGgpIHtcbiAgICAgIHdhcm5pbmckMShmYWxzZSwgJ1RoZSBmaW5hbCBhcmd1bWVudCBwYXNzZWQgdG8gJXMgY2hhbmdlZCBzaXplIGJldHdlZW4gcmVuZGVycy4gVGhlICcgKyAnb3JkZXIgYW5kIHNpemUgb2YgdGhpcyBhcnJheSBtdXN0IHJlbWFpbiBjb25zdGFudC5cXG5cXG4nICsgJ1ByZXZpb3VzOiAlc1xcbicgKyAnSW5jb21pbmc6ICVzJywgY3VycmVudEhvb2tOYW1lSW5EZXYsICdbJyArIG5leHREZXBzLmpvaW4oJywgJykgKyAnXScsICdbJyArIHByZXZEZXBzLmpvaW4oJywgJykgKyAnXScpO1xuICAgIH1cbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHByZXZEZXBzLmxlbmd0aCAmJiBpIDwgbmV4dERlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaXMobmV4dERlcHNbaV0sIHByZXZEZXBzW2ldKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCByZWZPckNvbnRleHQsIG5leHRSZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICByZW5kZXJFeHBpcmF0aW9uVGltZSA9IG5leHRSZW5kZXJFeHBpcmF0aW9uVGltZTtcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IHdvcmtJblByb2dyZXNzO1xuICBuZXh0Q3VycmVudEhvb2sgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFN0YXRlIDogbnVsbDtcblxuICB7XG4gICAgaG9va1R5cGVzRGV2ID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQuX2RlYnVnSG9va1R5cGVzIDogbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICB9XG5cbiAgLy8gVGhlIGZvbGxvd2luZyBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVzZXRcbiAgLy8gY3VycmVudEhvb2sgPSBudWxsO1xuICAvLyB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuXG4gIC8vIHJlbWFpbmluZ0V4cGlyYXRpb25UaW1lID0gTm9Xb3JrO1xuICAvLyBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IG51bGw7XG5cbiAgLy8gZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlO1xuICAvLyByZW5kZXJQaGFzZVVwZGF0ZXMgPSBudWxsO1xuICAvLyBudW1iZXJPZlJlUmVuZGVycyA9IDA7XG4gIC8vIHNpZGVFZmZlY3RUYWcgPSAwO1xuXG4gIC8vIFRPRE8gV2FybiBpZiBubyBob29rcyBhcmUgdXNlZCBhdCBhbGwgZHVyaW5nIG1vdW50LCB0aGVuIHNvbWUgYXJlIHVzZWQgZHVyaW5nIHVwZGF0ZS5cbiAgLy8gQ3VycmVudGx5IHdlIHdpbGwgaWRlbnRpZnkgdGhlIHVwZGF0ZSByZW5kZXIgYXMgYSBtb3VudCBiZWNhdXNlIG5leHRDdXJyZW50SG9vayA9PT0gbnVsbC5cbiAgLy8gVGhpcyBpcyB0cmlja3kgYmVjYXVzZSBpdCdzIHZhbGlkIGZvciBjZXJ0YWluIHR5cGVzIG9mIGNvbXBvbmVudHMgKGUuZy4gUmVhY3QubGF6eSlcblxuICAvLyBVc2luZyBuZXh0Q3VycmVudEhvb2sgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG1vdW50L3VwZGF0ZSBvbmx5IHdvcmtzIGlmIGF0IGxlYXN0IG9uZSBzdGF0ZWZ1bCBob29rIGlzIHVzZWQuXG4gIC8vIE5vbi1zdGF0ZWZ1bCBob29rcyAoZS5nLiBjb250ZXh0KSBkb24ndCBnZXQgYWRkZWQgdG8gbWVtb2l6ZWRTdGF0ZSxcbiAgLy8gc28gbmV4dEN1cnJlbnRIb29rIHdvdWxkIGJlIG51bGwgZHVyaW5nIHVwZGF0ZXMgYW5kIG1vdW50cy5cbiAge1xuICAgIGlmIChuZXh0Q3VycmVudEhvb2sgIT09IG51bGwpIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICB9IGVsc2UgaWYgKGhvb2tUeXBlc0RldiAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBkaXNwYXRjaGVyIGhhbmRsZXMgYW4gZWRnZSBjYXNlIHdoZXJlIGEgY29tcG9uZW50IGlzIHVwZGF0aW5nLFxuICAgICAgLy8gYnV0IG5vIHN0YXRlZnVsIGhvb2tzIGhhdmUgYmVlbiB1c2VkLlxuICAgICAgLy8gV2Ugd2FudCB0byBtYXRjaCB0aGUgcHJvZHVjdGlvbiBjb2RlIGJlaGF2aW9yICh3aGljaCB3aWxsIHVzZSBIb29rc0Rpc3BhdGNoZXJPbk1vdW50KSxcbiAgICAgIC8vIGJ1dCB3aXRoIHRoZSBleHRyYSBERVYgdmFsaWRhdGlvbiB0byBlbnN1cmUgaG9va3Mgb3JkZXJpbmcgaGFzbid0IGNoYW5nZWQuXG4gICAgICAvLyBUaGlzIGRpc3BhdGNoZXIgZG9lcyB0aGF0LlxuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPbk1vdW50V2l0aEhvb2tUeXBlc0luREVWO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcbiAgICB9XG4gIH1cblxuICB2YXIgY2hpbGRyZW4gPSBDb21wb25lbnQocHJvcHMsIHJlZk9yQ29udGV4dCk7XG5cbiAgaWYgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUpIHtcbiAgICBkbyB7XG4gICAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7XG4gICAgICBudW1iZXJPZlJlUmVuZGVycyArPSAxO1xuXG4gICAgICAvLyBTdGFydCBvdmVyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdFxuICAgICAgbmV4dEN1cnJlbnRIb29rID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSA6IG51bGw7XG4gICAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gZmlyc3RXb3JrSW5Qcm9ncmVzc0hvb2s7XG5cbiAgICAgIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IG51bGw7XG5cbiAgICAgIHtcbiAgICAgICAgLy8gQWxzbyB2YWxpZGF0ZSBob29rIG9yZGVyIGZvciBjYXNjYWRpbmcgdXBkYXRlcy5cbiAgICAgICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTtcbiAgICAgIH1cblxuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICBjaGlsZHJlbiA9IENvbXBvbmVudChwcm9wcywgcmVmT3JDb250ZXh0KTtcbiAgICB9IHdoaWxlIChkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlKTtcblxuICAgIHJlbmRlclBoYXNlVXBkYXRlcyA9IG51bGw7XG4gICAgbnVtYmVyT2ZSZVJlbmRlcnMgPSAwO1xuICB9XG5cbiAgLy8gV2UgY2FuIGFzc3VtZSB0aGUgcHJldmlvdXMgZGlzcGF0Y2hlciBpcyBhbHdheXMgdGhpcyBvbmUsIHNpbmNlIHdlIHNldCBpdFxuICAvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZW5kZXIgcGhhc2UgYW5kIHRoZXJlJ3Mgbm8gcmUtZW50cmFuY3kuXG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIHZhciByZW5kZXJlZFdvcmsgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxO1xuXG4gIHJlbmRlcmVkV29yay5tZW1vaXplZFN0YXRlID0gZmlyc3RXb3JrSW5Qcm9ncmVzc0hvb2s7XG4gIHJlbmRlcmVkV29yay5leHBpcmF0aW9uVGltZSA9IHJlbWFpbmluZ0V4cGlyYXRpb25UaW1lO1xuICByZW5kZXJlZFdvcmsudXBkYXRlUXVldWUgPSBjb21wb25lbnRVcGRhdGVRdWV1ZTtcbiAgcmVuZGVyZWRXb3JrLmVmZmVjdFRhZyB8PSBzaWRlRWZmZWN0VGFnO1xuXG4gIHtcbiAgICByZW5kZXJlZFdvcmsuX2RlYnVnSG9va1R5cGVzID0gaG9va1R5cGVzRGV2O1xuICB9XG5cbiAgLy8gVGhpcyBjaGVjayB1c2VzIGN1cnJlbnRIb29rIHNvIHRoYXQgaXQgd29ya3MgdGhlIHNhbWUgaW4gREVWIGFuZCBwcm9kIGJ1bmRsZXMuXG4gIC8vIGhvb2tUeXBlc0RldiBjb3VsZCBjYXRjaCBtb3JlIGNhc2VzIChlLmcuIGNvbnRleHQpIGJ1dCBvbmx5IGluIERFViBidW5kbGVzLlxuICB2YXIgZGlkUmVuZGVyVG9vRmV3SG9va3MgPSBjdXJyZW50SG9vayAhPT0gbnVsbCAmJiBjdXJyZW50SG9vay5uZXh0ICE9PSBudWxsO1xuXG4gIHJlbmRlckV4cGlyYXRpb25UaW1lID0gTm9Xb3JrO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcblxuICBjdXJyZW50SG9vayA9IG51bGw7XG4gIG5leHRDdXJyZW50SG9vayA9IG51bGw7XG4gIGZpcnN0V29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgbmV4dFdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG5cbiAge1xuICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbDtcbiAgICBob29rVHlwZXNEZXYgPSBudWxsO1xuICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7XG4gIH1cblxuICByZW1haW5pbmdFeHBpcmF0aW9uVGltZSA9IE5vV29yaztcbiAgY29tcG9uZW50VXBkYXRlUXVldWUgPSBudWxsO1xuICBzaWRlRWZmZWN0VGFnID0gMDtcblxuICAvLyBUaGVzZSB3ZXJlIHJlc2V0IGFib3ZlXG4gIC8vIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTtcbiAgLy8gcmVuZGVyUGhhc2VVcGRhdGVzID0gbnVsbDtcbiAgLy8gbnVtYmVyT2ZSZVJlbmRlcnMgPSAwO1xuXG4gICEhZGlkUmVuZGVyVG9vRmV3SG9va3MgPyBpbnZhcmlhbnQoZmFsc2UsICdSZW5kZXJlZCBmZXdlciBob29rcyB0aGFuIGV4cGVjdGVkLiBUaGlzIG1heSBiZSBjYXVzZWQgYnkgYW4gYWNjaWRlbnRhbCBlYXJseSByZXR1cm4gc3RhdGVtZW50LicpIDogdm9pZCAwO1xuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cblxuZnVuY3Rpb24gYmFpbG91dEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBleHBpcmF0aW9uVGltZSkge1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG4gIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyAmPSB+KFBhc3NpdmUgfCBVcGRhdGUpO1xuICBpZiAoY3VycmVudC5leHBpcmF0aW9uVGltZSA8PSBleHBpcmF0aW9uVGltZSkge1xuICAgIGN1cnJlbnQuZXhwaXJhdGlvblRpbWUgPSBOb1dvcms7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRIb29rcygpIHtcbiAgLy8gV2UgY2FuIGFzc3VtZSB0aGUgcHJldmlvdXMgZGlzcGF0Y2hlciBpcyBhbHdheXMgdGhpcyBvbmUsIHNpbmNlIHdlIHNldCBpdFxuICAvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZW5kZXIgcGhhc2UgYW5kIHRoZXJlJ3Mgbm8gcmUtZW50cmFuY3kuXG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIC8vIFRoaXMgaXMgdXNlZCB0byByZXNldCB0aGUgc3RhdGUgb2YgdGhpcyBtb2R1bGUgd2hlbiBhIGNvbXBvbmVudCB0aHJvd3MuXG4gIC8vIEl0J3MgYWxzbyBjYWxsZWQgaW5zaWRlIG1vdW50SW5kZXRlcm1pbmF0ZUNvbXBvbmVudCBpZiB3ZSBkZXRlcm1pbmUgdGhlXG4gIC8vIGNvbXBvbmVudCBpcyBhIG1vZHVsZS1zdHlsZSBjb21wb25lbnQuXG4gIHJlbmRlckV4cGlyYXRpb25UaW1lID0gTm9Xb3JrO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcblxuICBjdXJyZW50SG9vayA9IG51bGw7XG4gIG5leHRDdXJyZW50SG9vayA9IG51bGw7XG4gIGZpcnN0V29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgbmV4dFdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG5cbiAge1xuICAgIGhvb2tUeXBlc0RldiA9IG51bGw7XG4gICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTtcblxuICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbDtcbiAgfVxuXG4gIHJlbWFpbmluZ0V4cGlyYXRpb25UaW1lID0gTm9Xb3JrO1xuICBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IG51bGw7XG4gIHNpZGVFZmZlY3RUYWcgPSAwO1xuXG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTtcbiAgcmVuZGVyUGhhc2VVcGRhdGVzID0gbnVsbDtcbiAgbnVtYmVyT2ZSZVJlbmRlcnMgPSAwO1xufVxuXG5mdW5jdGlvbiBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpIHtcbiAgdmFyIGhvb2sgPSB7XG4gICAgbWVtb2l6ZWRTdGF0ZTogbnVsbCxcblxuICAgIGJhc2VTdGF0ZTogbnVsbCxcbiAgICBxdWV1ZTogbnVsbCxcbiAgICBiYXNlVXBkYXRlOiBudWxsLFxuXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBob29rIGluIHRoZSBsaXN0XG4gICAgZmlyc3RXb3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBob29rO1xuICB9IGVsc2Uge1xuICAgIC8vIEFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0XG4gICAgd29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQgPSBob29rO1xuICB9XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc0hvb2s7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpIHtcbiAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJvdGggZm9yIHVwZGF0ZXMgYW5kIGZvciByZS1yZW5kZXJzIHRyaWdnZXJlZCBieSBhXG4gIC8vIHJlbmRlciBwaGFzZSB1cGRhdGUuIEl0IGFzc3VtZXMgdGhlcmUgaXMgZWl0aGVyIGEgY3VycmVudCBob29rIHdlIGNhblxuICAvLyBjbG9uZSwgb3IgYSB3b3JrLWluLXByb2dyZXNzIGhvb2sgZnJvbSBhIHByZXZpb3VzIHJlbmRlciBwYXNzIHRoYXQgd2UgY2FuXG4gIC8vIHVzZSBhcyBhIGJhc2UuIFdoZW4gd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgYmFzZSBsaXN0LCB3ZSBtdXN0IHN3aXRjaCB0b1xuICAvLyB0aGUgZGlzcGF0Y2hlciB1c2VkIGZvciBtb3VudHMuXG4gIGlmIChuZXh0V29ya0luUHJvZ3Jlc3NIb29rICE9PSBudWxsKSB7XG4gICAgLy8gVGhlcmUncyBhbHJlYWR5IGEgd29yay1pbi1wcm9ncmVzcy4gUmV1c2UgaXQuXG4gICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbmV4dFdvcmtJblByb2dyZXNzSG9vaztcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQ7XG5cbiAgICBjdXJyZW50SG9vayA9IG5leHRDdXJyZW50SG9vaztcbiAgICBuZXh0Q3VycmVudEhvb2sgPSBjdXJyZW50SG9vayAhPT0gbnVsbCA/IGN1cnJlbnRIb29rLm5leHQgOiBudWxsO1xuICB9IGVsc2Uge1xuICAgIC8vIENsb25lIGZyb20gdGhlIGN1cnJlbnQgaG9vay5cbiAgICAhKG5leHRDdXJyZW50SG9vayAhPT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICdSZW5kZXJlZCBtb3JlIGhvb2tzIHRoYW4gZHVyaW5nIHRoZSBwcmV2aW91cyByZW5kZXIuJykgOiB2b2lkIDA7XG4gICAgY3VycmVudEhvb2sgPSBuZXh0Q3VycmVudEhvb2s7XG5cbiAgICB2YXIgbmV3SG9vayA9IHtcbiAgICAgIG1lbW9pemVkU3RhdGU6IGN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGUsXG5cbiAgICAgIGJhc2VTdGF0ZTogY3VycmVudEhvb2suYmFzZVN0YXRlLFxuICAgICAgcXVldWU6IGN1cnJlbnRIb29rLnF1ZXVlLFxuICAgICAgYmFzZVVwZGF0ZTogY3VycmVudEhvb2suYmFzZVVwZGF0ZSxcblxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3NIb29rID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBob29rIGluIHRoZSBsaXN0LlxuICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID0gZmlyc3RXb3JrSW5Qcm9ncmVzc0hvb2sgPSBuZXdIb29rO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC5cbiAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0ID0gbmV3SG9vaztcbiAgICB9XG4gICAgbmV4dEN1cnJlbnRIb29rID0gY3VycmVudEhvb2submV4dDtcbiAgfVxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NIb29rO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGdW5jdGlvbkNvbXBvbmVudFVwZGF0ZVF1ZXVlKCkge1xuICByZXR1cm4ge1xuICAgIGxhc3RFZmZlY3Q6IG51bGxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYmFzaWNTdGF0ZVJlZHVjZXIoc3RhdGUsIGFjdGlvbikge1xuICByZXR1cm4gdHlwZW9mIGFjdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IGFjdGlvbihzdGF0ZSkgOiBhY3Rpb247XG59XG5cbmZ1bmN0aW9uIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIGluaXRpYWxTdGF0ZSA9IHZvaWQgMDtcbiAgaWYgKGluaXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXQoaW5pdGlhbEFyZyk7XG4gIH0gZWxzZSB7XG4gICAgaW5pdGlhbFN0YXRlID0gaW5pdGlhbEFyZztcbiAgfVxuICBob29rLm1lbW9pemVkU3RhdGUgPSBob29rLmJhc2VTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZSA9IHtcbiAgICBsYXN0OiBudWxsLFxuICAgIGRpc3BhdGNoOiBudWxsLFxuICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IHJlZHVjZXIsXG4gICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVxuICB9O1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoQWN0aW9uLmJpbmQobnVsbCxcbiAgLy8gRmxvdyBkb2Vzbid0IGtub3cgdGhpcyBpcyBub24tbnVsbCwgYnV0IHdlIGRvLlxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBxdWV1ZSk7XG4gIHJldHVybiBbaG9vay5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcXVldWUgPSBob29rLnF1ZXVlO1xuICAhKHF1ZXVlICE9PSBudWxsKSA/IGludmFyaWFudChmYWxzZSwgJ1Nob3VsZCBoYXZlIGEgcXVldWUuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKSA6IHZvaWQgMDtcblxuICBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyID0gcmVkdWNlcjtcblxuICBpZiAobnVtYmVyT2ZSZVJlbmRlcnMgPiAwKSB7XG4gICAgLy8gVGhpcyBpcyBhIHJlLXJlbmRlci4gQXBwbHkgdGhlIG5ldyByZW5kZXIgcGhhc2UgdXBkYXRlcyB0byB0aGUgcHJldmlvdXNcbiAgICB2YXIgX2Rpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2g7XG4gICAgaWYgKHJlbmRlclBoYXNlVXBkYXRlcyAhPT0gbnVsbCkge1xuICAgICAgLy8gUmVuZGVyIHBoYXNlIHVwZGF0ZXMgYXJlIHN0b3JlZCBpbiBhIG1hcCBvZiBxdWV1ZSAtPiBsaW5rZWQgbGlzdFxuICAgICAgdmFyIGZpcnN0UmVuZGVyUGhhc2VVcGRhdGUgPSByZW5kZXJQaGFzZVVwZGF0ZXMuZ2V0KHF1ZXVlKTtcbiAgICAgIGlmIChmaXJzdFJlbmRlclBoYXNlVXBkYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVuZGVyUGhhc2VVcGRhdGVzLmRlbGV0ZShxdWV1ZSk7XG4gICAgICAgIHZhciBuZXdTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgdmFyIHVwZGF0ZSA9IGZpcnN0UmVuZGVyUGhhc2VVcGRhdGU7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAvLyBQcm9jZXNzIHRoaXMgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gV2UgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGVcbiAgICAgICAgICAvLyBwcmlvcml0eSBiZWNhdXNlIGl0IHdpbGwgYWx3YXlzIGJlIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50XG4gICAgICAgICAgLy8gcmVuZGVyJ3MuXG4gICAgICAgICAgdmFyIF9hY3Rpb24gPSB1cGRhdGUuYWN0aW9uO1xuICAgICAgICAgIG5ld1N0YXRlID0gcmVkdWNlcihuZXdTdGF0ZSwgX2FjdGlvbik7XG4gICAgICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gICAgICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gbnVsbCk7XG5cbiAgICAgICAgLy8gTWFyayB0aGF0IHRoZSBmaWJlciBwZXJmb3JtZWQgd29yaywgYnV0IG9ubHkgaWYgdGhlIG5ldyBzdGF0ZSBpc1xuICAgICAgICAvLyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBzdGF0ZS5cbiAgICAgICAgaWYgKCFpcyhuZXdTdGF0ZSwgaG9vay5tZW1vaXplZFN0YXRlKSkge1xuICAgICAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgLy8gRG9uJ3QgcGVyc2lzdCB0aGUgc3RhdGUgYWNjdW1sYXRlZCBmcm9tIHRoZSByZW5kZXIgcGhhc2UgdXBkYXRlcyB0b1xuICAgICAgICAvLyB0aGUgYmFzZSBzdGF0ZSB1bmxlc3MgdGhlIHF1ZXVlIGlzIGVtcHR5LlxuICAgICAgICAvLyBUT0RPOiBOb3Qgc3VyZSBpZiB0aGlzIGlzIHRoZSBkZXNpcmVkIHNlbWFudGljcywgYnV0IGl0J3Mgd2hhdCB3ZVxuICAgICAgICAvLyBkbyBmb3IgZ0RTRlAuIEkgY2FuJ3QgcmVtZW1iZXIgd2h5LlxuICAgICAgICBpZiAoaG9vay5iYXNlVXBkYXRlID09PSBxdWV1ZS5sYXN0KSB7XG4gICAgICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlID0gbmV3U3RhdGU7XG5cbiAgICAgICAgcmV0dXJuIFtuZXdTdGF0ZSwgX2Rpc3BhdGNoXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIF9kaXNwYXRjaF07XG4gIH1cblxuICAvLyBUaGUgbGFzdCB1cGRhdGUgaW4gdGhlIGVudGlyZSBxdWV1ZVxuICB2YXIgbGFzdCA9IHF1ZXVlLmxhc3Q7XG4gIC8vIFRoZSBsYXN0IHVwZGF0ZSB0aGF0IGlzIHBhcnQgb2YgdGhlIGJhc2Ugc3RhdGUuXG4gIHZhciBiYXNlVXBkYXRlID0gaG9vay5iYXNlVXBkYXRlO1xuICB2YXIgYmFzZVN0YXRlID0gaG9vay5iYXNlU3RhdGU7XG5cbiAgLy8gRmluZCB0aGUgZmlyc3QgdW5wcm9jZXNzZWQgdXBkYXRlLlxuICB2YXIgZmlyc3QgPSB2b2lkIDA7XG4gIGlmIChiYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgaWYgKGxhc3QgIT09IG51bGwpIHtcbiAgICAgIC8vIEZvciB0aGUgZmlyc3QgdXBkYXRlLCB0aGUgcXVldWUgaXMgYSBjaXJjdWxhciBsaW5rZWQgbGlzdCB3aGVyZVxuICAgICAgLy8gYHF1ZXVlLmxhc3QubmV4dCA9IHF1ZXVlLmZpcnN0YC4gT25jZSB0aGUgZmlyc3QgdXBkYXRlIGNvbW1pdHMsIGFuZFxuICAgICAgLy8gdGhlIGBiYXNlVXBkYXRlYCBpcyBubyBsb25nZXIgZW1wdHksIHdlIGNhbiB1bnJhdmVsIHRoZSBsaXN0LlxuICAgICAgbGFzdC5uZXh0ID0gbnVsbDtcbiAgICB9XG4gICAgZmlyc3QgPSBiYXNlVXBkYXRlLm5leHQ7XG4gIH0gZWxzZSB7XG4gICAgZmlyc3QgPSBsYXN0ICE9PSBudWxsID8gbGFzdC5uZXh0IDogbnVsbDtcbiAgfVxuICBpZiAoZmlyc3QgIT09IG51bGwpIHtcbiAgICB2YXIgX25ld1N0YXRlID0gYmFzZVN0YXRlO1xuICAgIHZhciBuZXdCYXNlU3RhdGUgPSBudWxsO1xuICAgIHZhciBuZXdCYXNlVXBkYXRlID0gbnVsbDtcbiAgICB2YXIgcHJldlVwZGF0ZSA9IGJhc2VVcGRhdGU7XG4gICAgdmFyIF91cGRhdGUgPSBmaXJzdDtcbiAgICB2YXIgZGlkU2tpcCA9IGZhbHNlO1xuICAgIGRvIHtcbiAgICAgIHZhciB1cGRhdGVFeHBpcmF0aW9uVGltZSA9IF91cGRhdGUuZXhwaXJhdGlvblRpbWU7XG4gICAgICBpZiAodXBkYXRlRXhwaXJhdGlvblRpbWUgPCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAgICAgICAvLyBQcmlvcml0eSBpcyBpbnN1ZmZpY2llbnQuIFNraXAgdGhpcyB1cGRhdGUuIElmIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgIC8vIHNraXBwZWQgdXBkYXRlLCB0aGUgcHJldmlvdXMgdXBkYXRlL3N0YXRlIGlzIHRoZSBuZXcgYmFzZVxuICAgICAgICAvLyB1cGRhdGUvc3RhdGUuXG4gICAgICAgIGlmICghZGlkU2tpcCkge1xuICAgICAgICAgIGRpZFNraXAgPSB0cnVlO1xuICAgICAgICAgIG5ld0Jhc2VVcGRhdGUgPSBwcmV2VXBkYXRlO1xuICAgICAgICAgIG5ld0Jhc2VTdGF0ZSA9IF9uZXdTdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgdGhlIHJlbWFpbmluZyBwcmlvcml0eSBpbiB0aGUgcXVldWUuXG4gICAgICAgIGlmICh1cGRhdGVFeHBpcmF0aW9uVGltZSA+IHJlbWFpbmluZ0V4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgICAgcmVtYWluaW5nRXhwaXJhdGlvblRpbWUgPSB1cGRhdGVFeHBpcmF0aW9uVGltZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUHJvY2VzcyB0aGlzIHVwZGF0ZS5cbiAgICAgICAgaWYgKF91cGRhdGUuZWFnZXJSZWR1Y2VyID09PSByZWR1Y2VyKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyB1cGRhdGUgd2FzIHByb2Nlc3NlZCBlYWdlcmx5LCBhbmQgaXRzIHJlZHVjZXIgbWF0Y2hlcyB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IHJlZHVjZXIsIHdlIGNhbiB1c2UgdGhlIGVhZ2VybHkgY29tcHV0ZWQgc3RhdGUuXG4gICAgICAgICAgX25ld1N0YXRlID0gX3VwZGF0ZS5lYWdlclN0YXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBfYWN0aW9uMiA9IF91cGRhdGUuYWN0aW9uO1xuICAgICAgICAgIF9uZXdTdGF0ZSA9IHJlZHVjZXIoX25ld1N0YXRlLCBfYWN0aW9uMik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHByZXZVcGRhdGUgPSBfdXBkYXRlO1xuICAgICAgX3VwZGF0ZSA9IF91cGRhdGUubmV4dDtcbiAgICB9IHdoaWxlIChfdXBkYXRlICE9PSBudWxsICYmIF91cGRhdGUgIT09IGZpcnN0KTtcblxuICAgIGlmICghZGlkU2tpcCkge1xuICAgICAgbmV3QmFzZVVwZGF0ZSA9IHByZXZVcGRhdGU7XG4gICAgICBuZXdCYXNlU3RhdGUgPSBfbmV3U3RhdGU7XG4gICAgfVxuXG4gICAgLy8gTWFyayB0aGF0IHRoZSBmaWJlciBwZXJmb3JtZWQgd29yaywgYnV0IG9ubHkgaWYgdGhlIG5ldyBzdGF0ZSBpc1xuICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHN0YXRlLlxuICAgIGlmICghaXMoX25ld1N0YXRlLCBob29rLm1lbW9pemVkU3RhdGUpKSB7XG4gICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IF9uZXdTdGF0ZTtcbiAgICBob29rLmJhc2VVcGRhdGUgPSBuZXdCYXNlVXBkYXRlO1xuICAgIGhvb2suYmFzZVN0YXRlID0gbmV3QmFzZVN0YXRlO1xuXG4gICAgcXVldWUubGFzdFJlbmRlcmVkU3RhdGUgPSBfbmV3U3RhdGU7XG4gIH1cblxuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaDtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICBpZiAodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxTdGF0ZSgpO1xuICB9XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGhvb2suYmFzZVN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICB2YXIgcXVldWUgPSBob29rLnF1ZXVlID0ge1xuICAgIGxhc3Q6IG51bGwsXG4gICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogYmFzaWNTdGF0ZVJlZHVjZXIsXG4gICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVxuICB9O1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoQWN0aW9uLmJpbmQobnVsbCxcbiAgLy8gRmxvdyBkb2Vzbid0IGtub3cgdGhpcyBpcyBub24tbnVsbCwgYnV0IHdlIGRvLlxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBxdWV1ZSk7XG4gIHJldHVybiBbaG9vay5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICByZXR1cm4gdXBkYXRlUmVkdWNlcihiYXNpY1N0YXRlUmVkdWNlciwgaW5pdGlhbFN0YXRlKTtcbn1cblxuZnVuY3Rpb24gcHVzaEVmZmVjdCh0YWcsIGNyZWF0ZSwgZGVzdHJveSwgZGVwcykge1xuICB2YXIgZWZmZWN0ID0ge1xuICAgIHRhZzogdGFnLFxuICAgIGNyZWF0ZTogY3JlYXRlLFxuICAgIGRlc3Ryb3k6IGRlc3Ryb3ksXG4gICAgZGVwczogZGVwcyxcbiAgICAvLyBDaXJjdWxhclxuICAgIG5leHQ6IG51bGxcbiAgfTtcbiAgaWYgKGNvbXBvbmVudFVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjcmVhdGVGdW5jdGlvbkNvbXBvbmVudFVwZGF0ZVF1ZXVlKCk7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdCA9IGVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICB9IGVsc2Uge1xuICAgIHZhciBfbGFzdEVmZmVjdCA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3Q7XG4gICAgaWYgKF9sYXN0RWZmZWN0ID09PSBudWxsKSB7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0Lm5leHQgPSBlZmZlY3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBmaXJzdEVmZmVjdCA9IF9sYXN0RWZmZWN0Lm5leHQ7XG4gICAgICBfbGFzdEVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICAgICAgZWZmZWN0Lm5leHQgPSBmaXJzdEVmZmVjdDtcbiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgPSBlZmZlY3Q7XG4gICAgfVxuICB9XG4gIHJldHVybiBlZmZlY3Q7XG59XG5cbmZ1bmN0aW9uIG1vdW50UmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciByZWYgPSB7IGN1cnJlbnQ6IGluaXRpYWxWYWx1ZSB9O1xuICB7XG4gICAgT2JqZWN0LnNlYWwocmVmKTtcbiAgfVxuICBob29rLm1lbW9pemVkU3RhdGUgPSByZWY7XG4gIHJldHVybiByZWY7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlZihpbml0aWFsVmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgcmV0dXJuIGhvb2subWVtb2l6ZWRTdGF0ZTtcbn1cblxuZnVuY3Rpb24gbW91bnRFZmZlY3RJbXBsKGZpYmVyRWZmZWN0VGFnLCBob29rRWZmZWN0VGFnLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgc2lkZUVmZmVjdFRhZyB8PSBmaWJlckVmZmVjdFRhZztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaEVmZmVjdChob29rRWZmZWN0VGFnLCBjcmVhdGUsIHVuZGVmaW5lZCwgbmV4dERlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVFZmZlY3RJbXBsKGZpYmVyRWZmZWN0VGFnLCBob29rRWZmZWN0VGFnLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBkZXN0cm95ID0gdW5kZWZpbmVkO1xuXG4gIGlmIChjdXJyZW50SG9vayAhPT0gbnVsbCkge1xuICAgIHZhciBwcmV2RWZmZWN0ID0gY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgICBkZXN0cm95ID0gcHJldkVmZmVjdC5kZXN0cm95O1xuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldkVmZmVjdC5kZXBzO1xuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIHB1c2hFZmZlY3QoTm9FZmZlY3QkMSwgY3JlYXRlLCBkZXN0cm95LCBuZXh0RGVwcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzaWRlRWZmZWN0VGFnIHw9IGZpYmVyRWZmZWN0VGFnO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoRWZmZWN0KGhvb2tFZmZlY3RUYWcsIGNyZWF0ZSwgZGVzdHJveSwgbmV4dERlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChVcGRhdGUgfCBQYXNzaXZlLCBVbm1vdW50UGFzc2l2ZSB8IE1vdW50UGFzc2l2ZSwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChVcGRhdGUgfCBQYXNzaXZlLCBVbm1vdW50UGFzc2l2ZSB8IE1vdW50UGFzc2l2ZSwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoVXBkYXRlLCBVbm1vdW50TXV0YXRpb24gfCBNb3VudExheW91dCwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChVcGRhdGUsIFVubW91bnRNdXRhdGlvbiB8IE1vdW50TGF5b3V0LCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0KGNyZWF0ZSwgcmVmKSB7XG4gIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIHJlZkNhbGxiYWNrID0gcmVmO1xuICAgIHZhciBfaW5zdCA9IGNyZWF0ZSgpO1xuICAgIHJlZkNhbGxiYWNrKF9pbnN0KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVmQ2FsbGJhY2sobnVsbCk7XG4gICAgfTtcbiAgfSBlbHNlIGlmIChyZWYgIT09IG51bGwgJiYgcmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcmVmT2JqZWN0ID0gcmVmO1xuICAgIHtcbiAgICAgICFyZWZPYmplY3QuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSA/IHdhcm5pbmckMShmYWxzZSwgJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBmaXJzdCBhcmd1bWVudCB0byBlaXRoZXIgYmUgYSAnICsgJ3JlZiBjYWxsYmFjayBvciBSZWFjdC5jcmVhdGVSZWYoKSBvYmplY3QuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsICdhbiBvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMocmVmT2JqZWN0KS5qb2luKCcsICcpICsgJ30nKSA6IHZvaWQgMDtcbiAgICB9XG4gICAgdmFyIF9pbnN0MiA9IGNyZWF0ZSgpO1xuICAgIHJlZk9iamVjdC5jdXJyZW50ID0gX2luc3QyO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZWZPYmplY3QuY3VycmVudCA9IG51bGw7XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAge1xuICAgICEodHlwZW9mIGNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykgPyB3YXJuaW5nJDEoZmFsc2UsICdFeHBlY3RlZCB1c2VJbXBlcmF0aXZlSGFuZGxlKCkgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb24gJyArICd0aGF0IGNyZWF0ZXMgYSBoYW5kbGUuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNyZWF0ZSAhPT0gbnVsbCA/IHR5cGVvZiBjcmVhdGUgOiAnbnVsbCcpIDogdm9pZCAwO1xuICB9XG5cbiAgLy8gVE9ETzogSWYgZGVwcyBhcmUgcHJvdmlkZWQsIHNob3VsZCB3ZSBza2lwIGNvbXBhcmluZyB0aGUgcmVmIGl0c2VsZj9cbiAgdmFyIGVmZmVjdERlcHMgPSBkZXBzICE9PSBudWxsICYmIGRlcHMgIT09IHVuZGVmaW5lZCA/IGRlcHMuY29uY2F0KFtyZWZdKSA6IG51bGw7XG5cbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChVcGRhdGUsIFVubW91bnRNdXRhdGlvbiB8IE1vdW50TGF5b3V0LCBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0LmJpbmQobnVsbCwgY3JlYXRlLCByZWYpLCBlZmZlY3REZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICB7XG4gICAgISh0eXBlb2YgY3JlYXRlID09PSAnZnVuY3Rpb24nKSA/IHdhcm5pbmckMShmYWxzZSwgJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSBmdW5jdGlvbiAnICsgJ3RoYXQgY3JlYXRlcyBhIGhhbmRsZS4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY3JlYXRlICE9PSBudWxsID8gdHlwZW9mIGNyZWF0ZSA6ICdudWxsJykgOiB2b2lkIDA7XG4gIH1cblxuICAvLyBUT0RPOiBJZiBkZXBzIGFyZSBwcm92aWRlZCwgc2hvdWxkIHdlIHNraXAgY29tcGFyaW5nIHRoZSByZWYgaXRzZWxmP1xuICB2YXIgZWZmZWN0RGVwcyA9IGRlcHMgIT09IG51bGwgJiYgZGVwcyAhPT0gdW5kZWZpbmVkID8gZGVwcy5jb25jYXQoW3JlZl0pIDogbnVsbDtcblxuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChVcGRhdGUsIFVubW91bnRNdXRhdGlvbiB8IE1vdW50TGF5b3V0LCBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0LmJpbmQobnVsbCwgY3JlYXRlLCByZWYpLCBlZmZlY3REZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnREZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAvLyBUaGlzIGhvb2sgaXMgbm9ybWFsbHkgYSBuby1vcC5cbiAgLy8gVGhlIHJlYWN0LWRlYnVnLWhvb2tzIHBhY2thZ2UgaW5qZWN0cyBpdHMgb3duIGltcGxlbWVudGF0aW9uXG4gIC8vIHNvIHRoYXQgZS5nLiBEZXZUb29scyBjYW4gZGlzcGxheSBjdXN0b20gaG9vayB2YWx1ZXMuXG59XG5cbnZhciB1cGRhdGVEZWJ1Z1ZhbHVlID0gbW91bnREZWJ1Z1ZhbHVlO1xuXG5mdW5jdGlvbiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtjYWxsYmFjaywgbmV4dERlcHNdO1xuICByZXR1cm4gY2FsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgcHJldlN0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgaWYgKG5leHREZXBzICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldkRlcHMgPSBwcmV2U3RhdGVbMV07XG4gICAgICBpZiAoYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykpIHtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZVswXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW2NhbGxiYWNrLCBuZXh0RGVwc107XG4gIHJldHVybiBjYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gbW91bnRNZW1vKG5leHRDcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIG5leHRWYWx1ZSA9IG5leHRDcmVhdGUoKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW25leHRWYWx1ZSwgbmV4dERlcHNdO1xuICByZXR1cm4gbmV4dFZhbHVlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNZW1vKG5leHRDcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBwcmV2U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAvLyBBc3N1bWUgdGhlc2UgYXJlIGRlZmluZWQuIElmIHRoZXkncmUgbm90LCBhcmVIb29rSW5wdXRzRXF1YWwgd2lsbCB3YXJuLlxuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldlN0YXRlWzFdO1xuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGVbMF07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHZhciBuZXh0VmFsdWUgPSBuZXh0Q3JlYXRlKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtuZXh0VmFsdWUsIG5leHREZXBzXTtcbiAgcmV0dXJuIG5leHRWYWx1ZTtcbn1cblxuLy8gaW4gYSB0ZXN0LWxpa2UgZW52aXJvbm1lbnQsIHdlIHdhbnQgdG8gd2FybiBpZiBkaXNwYXRjaEFjdGlvbigpXG4vLyBpcyBjYWxsZWQgb3V0c2lkZSBvZiBhIGJhdGNoZWRVcGRhdGVzL1Rlc3RVdGlscy5hY3QoLi4uKSBjYWxsLlxudmFyIHNob3VsZFdhcm5Gb3JVbmJhdGNoZWRTZXRTdGF0ZSA9IGZhbHNlO1xuXG57XG4gIC8vIGplc3QgaXNuJ3QgYSAnZ2xvYmFsJywgaXQncyBqdXN0IGV4cG9zZWQgdG8gdGVzdHMgdmlhIGEgd3JhcHBlZCBmdW5jdGlvblxuICAvLyBmdXJ0aGVyLCB0aGlzIGlzbid0IGEgdGVzdCBmaWxlLCBzbyBmbG93IGRvZXNuJ3QgcmVjb2duaXplIHRoZSBzeW1ib2wuIFNvLi4uXG4gIC8vICRGbG93RXhwZWN0ZWRFcnJvciAtIGJlY2F1c2UgcmVxdWlyZW1lbnRzIGRvbid0IGdpdmUgYSBkYW1uIGFib3V0IHlvdXIgdHlwZSBzaWdzLlxuICBpZiAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBqZXN0KSB7XG4gICAgc2hvdWxkV2FybkZvclVuYmF0Y2hlZFNldFN0YXRlID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEFjdGlvbihmaWJlciwgcXVldWUsIGFjdGlvbikge1xuICAhKG51bWJlck9mUmVSZW5kZXJzIDwgUkVfUkVOREVSX0xJTUlUKSA/IGludmFyaWFudChmYWxzZSwgJ1RvbyBtYW55IHJlLXJlbmRlcnMuIFJlYWN0IGxpbWl0cyB0aGUgbnVtYmVyIG9mIHJlbmRlcnMgdG8gcHJldmVudCBhbiBpbmZpbml0ZSBsb29wLicpIDogdm9pZCAwO1xuXG4gIHtcbiAgICAhKGFyZ3VtZW50cy5sZW5ndGggPD0gMykgPyB3YXJuaW5nJDEoZmFsc2UsIFwiU3RhdGUgdXBkYXRlcyBmcm9tIHRoZSB1c2VTdGF0ZSgpIGFuZCB1c2VSZWR1Y2VyKCkgSG9va3MgZG9uJ3Qgc3VwcG9ydCB0aGUgXCIgKyAnc2Vjb25kIGNhbGxiYWNrIGFyZ3VtZW50LiBUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgJyArICdyZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gdGhlIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJykgOiB2b2lkIDA7XG4gIH1cblxuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuICBpZiAoZmliZXIgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZSA9PT0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSkge1xuICAgIC8vIFRoaXMgaXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlLiBTdGFzaCBpdCBpbiBhIGxhemlseS1jcmVhdGVkIG1hcCBvZlxuICAgIC8vIHF1ZXVlIC0+IGxpbmtlZCBsaXN0IG9mIHVwZGF0ZXMuIEFmdGVyIHRoaXMgcmVuZGVyIHBhc3MsIHdlJ2xsIHJlc3RhcnRcbiAgICAvLyBhbmQgYXBwbHkgdGhlIHN0YXNoZWQgdXBkYXRlcyBvbiB0b3Agb2YgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgaG9vay5cbiAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gdHJ1ZTtcbiAgICB2YXIgdXBkYXRlID0ge1xuICAgICAgZXhwaXJhdGlvblRpbWU6IHJlbmRlckV4cGlyYXRpb25UaW1lLFxuICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICBlYWdlclJlZHVjZXI6IG51bGwsXG4gICAgICBlYWdlclN0YXRlOiBudWxsLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG4gICAgaWYgKHJlbmRlclBoYXNlVXBkYXRlcyA9PT0gbnVsbCkge1xuICAgICAgcmVuZGVyUGhhc2VVcGRhdGVzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICB2YXIgZmlyc3RSZW5kZXJQaGFzZVVwZGF0ZSA9IHJlbmRlclBoYXNlVXBkYXRlcy5nZXQocXVldWUpO1xuICAgIGlmIChmaXJzdFJlbmRlclBoYXNlVXBkYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlbmRlclBoYXNlVXBkYXRlcy5zZXQocXVldWUsIHVwZGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFwcGVuZCB0aGUgdXBkYXRlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuXG4gICAgICB2YXIgbGFzdFJlbmRlclBoYXNlVXBkYXRlID0gZmlyc3RSZW5kZXJQaGFzZVVwZGF0ZTtcbiAgICAgIHdoaWxlIChsYXN0UmVuZGVyUGhhc2VVcGRhdGUubmV4dCAhPT0gbnVsbCkge1xuICAgICAgICBsYXN0UmVuZGVyUGhhc2VVcGRhdGUgPSBsYXN0UmVuZGVyUGhhc2VVcGRhdGUubmV4dDtcbiAgICAgIH1cbiAgICAgIGxhc3RSZW5kZXJQaGFzZVVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG5cbiAgICB2YXIgY3VycmVudFRpbWUgPSByZXF1ZXN0Q3VycmVudFRpbWUoKTtcbiAgICB2YXIgX2V4cGlyYXRpb25UaW1lID0gY29tcHV0ZUV4cGlyYXRpb25Gb3JGaWJlcihjdXJyZW50VGltZSwgZmliZXIpO1xuXG4gICAgdmFyIF91cGRhdGUyID0ge1xuICAgICAgZXhwaXJhdGlvblRpbWU6IF9leHBpcmF0aW9uVGltZSxcbiAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgZWFnZXJSZWR1Y2VyOiBudWxsLFxuICAgICAgZWFnZXJTdGF0ZTogbnVsbCxcbiAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuXG4gICAgLy8gQXBwZW5kIHRoZSB1cGRhdGUgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC5cbiAgICB2YXIgX2xhc3QgPSBxdWV1ZS5sYXN0O1xuICAgIGlmIChfbGFzdCA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgICAgX3VwZGF0ZTIubmV4dCA9IF91cGRhdGUyO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZmlyc3QgPSBfbGFzdC5uZXh0O1xuICAgICAgaWYgKGZpcnN0ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIFN0aWxsIGNpcmN1bGFyLlxuICAgICAgICBfdXBkYXRlMi5uZXh0ID0gZmlyc3Q7XG4gICAgICB9XG4gICAgICBfbGFzdC5uZXh0ID0gX3VwZGF0ZTI7XG4gICAgfVxuICAgIHF1ZXVlLmxhc3QgPSBfdXBkYXRlMjtcblxuICAgIGlmIChmaWJlci5leHBpcmF0aW9uVGltZSA9PT0gTm9Xb3JrICYmIChhbHRlcm5hdGUgPT09IG51bGwgfHwgYWx0ZXJuYXRlLmV4cGlyYXRpb25UaW1lID09PSBOb1dvcmspKSB7XG4gICAgICAvLyBUaGUgcXVldWUgaXMgY3VycmVudGx5IGVtcHR5LCB3aGljaCBtZWFucyB3ZSBjYW4gZWFnZXJseSBjb21wdXRlIHRoZVxuICAgICAgLy8gbmV4dCBzdGF0ZSBiZWZvcmUgZW50ZXJpbmcgdGhlIHJlbmRlciBwaGFzZS4gSWYgdGhlIG5ldyBzdGF0ZSBpcyB0aGVcbiAgICAgIC8vIHNhbWUgYXMgdGhlIGN1cnJlbnQgc3RhdGUsIHdlIG1heSBiZSBhYmxlIHRvIGJhaWwgb3V0IGVudGlyZWx5LlxuICAgICAgdmFyIF9sYXN0UmVuZGVyZWRSZWR1Y2VyID0gcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlcjtcbiAgICAgIGlmIChfbGFzdFJlbmRlcmVkUmVkdWNlciAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSB2b2lkIDA7XG4gICAgICAgIHtcbiAgICAgICAgICBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgY3VycmVudFN0YXRlID0gcXVldWUubGFzdFJlbmRlcmVkU3RhdGU7XG4gICAgICAgICAgdmFyIF9lYWdlclN0YXRlID0gX2xhc3RSZW5kZXJlZFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pO1xuICAgICAgICAgIC8vIFN0YXNoIHRoZSBlYWdlcmx5IGNvbXB1dGVkIHN0YXRlLCBhbmQgdGhlIHJlZHVjZXIgdXNlZCB0byBjb21wdXRlXG4gICAgICAgICAgLy8gaXQsIG9uIHRoZSB1cGRhdGUgb2JqZWN0LiBJZiB0aGUgcmVkdWNlciBoYXNuJ3QgY2hhbmdlZCBieSB0aGVcbiAgICAgICAgICAvLyB0aW1lIHdlIGVudGVyIHRoZSByZW5kZXIgcGhhc2UsIHRoZW4gdGhlIGVhZ2VyIHN0YXRlIGNhbiBiZSB1c2VkXG4gICAgICAgICAgLy8gd2l0aG91dCBjYWxsaW5nIHRoZSByZWR1Y2VyIGFnYWluLlxuICAgICAgICAgIF91cGRhdGUyLmVhZ2VyUmVkdWNlciA9IF9sYXN0UmVuZGVyZWRSZWR1Y2VyO1xuICAgICAgICAgIF91cGRhdGUyLmVhZ2VyU3RhdGUgPSBfZWFnZXJTdGF0ZTtcbiAgICAgICAgICBpZiAoaXMoX2VhZ2VyU3RhdGUsIGN1cnJlbnRTdGF0ZSkpIHtcbiAgICAgICAgICAgIC8vIEZhc3QgcGF0aC4gV2UgY2FuIGJhaWwgb3V0IHdpdGhvdXQgc2NoZWR1bGluZyBSZWFjdCB0byByZS1yZW5kZXIuXG4gICAgICAgICAgICAvLyBJdCdzIHN0aWxsIHBvc3NpYmxlIHRoYXQgd2UnbGwgbmVlZCB0byByZWJhc2UgdGhpcyB1cGRhdGUgbGF0ZXIsXG4gICAgICAgICAgICAvLyBpZiB0aGUgY29tcG9uZW50IHJlLXJlbmRlcnMgZm9yIGEgZGlmZmVyZW50IHJlYXNvbiBhbmQgYnkgdGhhdFxuICAgICAgICAgICAgLy8gdGltZSB0aGUgcmVkdWNlciBoYXMgY2hhbmdlZC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gU3VwcHJlc3MgdGhlIGVycm9yLiBJdCB3aWxsIHRocm93IGFnYWluIGluIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAge1xuICAgICAgaWYgKHNob3VsZFdhcm5Gb3JVbmJhdGNoZWRTZXRTdGF0ZSA9PT0gdHJ1ZSkge1xuICAgICAgICB3YXJuSWZOb3RDdXJyZW50bHlCYXRjaGluZ0luRGV2KGZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc2NoZWR1bGVXb3JrKGZpYmVyLCBfZXhwaXJhdGlvblRpbWUpO1xuICB9XG59XG5cbnZhciBDb250ZXh0T25seURpc3BhdGNoZXIgPSB7XG4gIHJlYWRDb250ZXh0OiByZWFkQ29udGV4dCxcblxuICB1c2VDYWxsYmFjazogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VDb250ZXh0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUVmZmVjdDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VJbXBlcmF0aXZlSGFuZGxlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUxheW91dEVmZmVjdDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VNZW1vOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVJlZHVjZXI6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlUmVmOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVN0YXRlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZURlYnVnVmFsdWU6IHRocm93SW52YWxpZEhvb2tFcnJvclxufTtcblxudmFyIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IG51bGw7XG52YXIgSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFViA9IG51bGw7XG52YXIgSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSBudWxsO1xuXG57XG4gIHZhciB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgd2FybmluZyQxKGZhbHNlLCAnQ29udGV4dCBjYW4gb25seSBiZSByZWFkIHdoaWxlIFJlYWN0IGlzIHJlbmRlcmluZy4gJyArICdJbiBjbGFzc2VzLCB5b3UgY2FuIHJlYWQgaXQgaW4gdGhlIHJlbmRlciBtZXRob2Qgb3IgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiAnICsgJ0luIGZ1bmN0aW9uIGNvbXBvbmVudHMsIHlvdSBjYW4gcmVhZCBpdCBkaXJlY3RseSBpbiB0aGUgZnVuY3Rpb24gYm9keSwgYnV0IG5vdCAnICsgJ2luc2lkZSBIb29rcyBsaWtlIHVzZVJlZHVjZXIoKSBvciB1c2VNZW1vKCkuJyk7XG4gIH07XG5cbiAgdmFyIHdhcm5JbnZhbGlkSG9va0FjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICB3YXJuaW5nJDEoZmFsc2UsICdEbyBub3QgY2FsbCBIb29rcyBpbnNpZGUgdXNlRWZmZWN0KC4uLiksIHVzZU1lbW8oLi4uKSwgb3Igb3RoZXIgYnVpbHQtaW4gSG9va3MuICcgKyAnWW91IGNhbiBvbmx5IGNhbGwgSG9va3MgYXQgdGhlIHRvcCBsZXZlbCBvZiB5b3VyIFJlYWN0IGZ1bmN0aW9uLiAnICsgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgJyArICdodHRwczovL2ZiLm1lL3J1bGVzLW9mLWhvb2tzJyk7XG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKTtcbiAgICB9XG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQsIG9ic2VydmVkQml0cykge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cyk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pO1xuICAgIH1cbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZihpbml0aWFsVmFsdWUpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbik7XG4gICAgfVxuICB9O1xuXG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cyk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0LCBvYnNlcnZlZEJpdHMpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFJlZihpbml0aWFsVmFsdWUpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKTtcbiAgICB9XG4gIH07XG5cbiAgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cyk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0LCBvYnNlcnZlZEJpdHMpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbik7XG4gICAgfVxuICB9O1xufVxuXG52YXIgY29tbWl0VGltZSA9IDA7XG52YXIgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcblxuZnVuY3Rpb24gZ2V0Q29tbWl0VGltZSgpIHtcbiAgcmV0dXJuIGNvbW1pdFRpbWU7XG59XG5cbmZ1bmN0aW9uIHJlY29yZENvbW1pdFRpbWUoKSB7XG4gIGlmICghZW5hYmxlUHJvZmlsZXJUaW1lcikge1xuICAgIHJldHVybjtcbiAgfVxuICBjb21taXRUaW1lID0gc2NoZWR1bGVyLnVuc3RhYmxlX25vdygpO1xufVxuXG5mdW5jdGlvbiBzdGFydFByb2ZpbGVyVGltZXIoZmliZXIpIHtcbiAgaWYgKCFlbmFibGVQcm9maWxlclRpbWVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHJvZmlsZXJTdGFydFRpbWUgPSBzY2hlZHVsZXIudW5zdGFibGVfbm93KCk7XG5cbiAgaWYgKGZpYmVyLmFjdHVhbFN0YXJ0VGltZSA8IDApIHtcbiAgICBmaWJlci5hY3R1YWxTdGFydFRpbWUgPSBzY2hlZHVsZXIudW5zdGFibGVfbm93KCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoZmliZXIpIHtcbiAgaWYgKCFlbmFibGVQcm9maWxlclRpbWVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHByb2ZpbGVyU3RhcnRUaW1lID0gLTE7XG59XG5cbmZ1bmN0aW9uIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoZmliZXIsIG92ZXJyaWRlQmFzZVRpbWUpIHtcbiAgaWYgKCFlbmFibGVQcm9maWxlclRpbWVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHByb2ZpbGVyU3RhcnRUaW1lID49IDApIHtcbiAgICB2YXIgZWxhcHNlZFRpbWUgPSBzY2hlZHVsZXIudW5zdGFibGVfbm93KCkgLSBwcm9maWxlclN0YXJ0VGltZTtcbiAgICBmaWJlci5hY3R1YWxEdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICBpZiAob3ZlcnJpZGVCYXNlVGltZSkge1xuICAgICAgZmliZXIuc2VsZkJhc2VEdXJhdGlvbiA9IGVsYXBzZWRUaW1lO1xuICAgIH1cbiAgICBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xuICB9XG59XG5cbi8vIFRoZSBkZWVwZXN0IEZpYmVyIG9uIHRoZSBzdGFjayBpbnZvbHZlZCBpbiBhIGh5ZHJhdGlvbiBjb250ZXh0LlxuLy8gVGhpcyBtYXkgaGF2ZSBiZWVuIGFuIGluc2VydGlvbiBvciBhIGh5ZHJhdGlvbi5cbnZhciBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGw7XG52YXIgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG52YXIgaXNIeWRyYXRpbmcgPSBmYWxzZTtcblxuZnVuY3Rpb24gZW50ZXJIeWRyYXRpb25TdGF0ZShmaWJlcikge1xuICBpZiAoIXN1cHBvcnRzSHlkcmF0aW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHBhcmVudEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZChwYXJlbnRJbnN0YW5jZSk7XG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gIGlzSHlkcmF0aW5nID0gdHJ1ZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlZW50ZXJIeWRyYXRpb25TdGF0ZUZyb21EZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlcikge1xuICBpZiAoIXN1cHBvcnRzSHlkcmF0aW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoc3VzcGVuc2VJbnN0YW5jZSk7XG4gIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpO1xuICBpc0h5ZHJhdGluZyA9IHRydWU7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKSB7XG4gIHtcbiAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgZGlkTm90SHlkcmF0ZUNvbnRhaW5lckluc3RhbmNlKHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLCBpbnN0YW5jZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICBkaWROb3RIeWRyYXRlSW5zdGFuY2UocmV0dXJuRmliZXIudHlwZSwgcmV0dXJuRmliZXIubWVtb2l6ZWRQcm9wcywgcmV0dXJuRmliZXIuc3RhdGVOb2RlLCBpbnN0YW5jZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjaGlsZFRvRGVsZXRlID0gY3JlYXRlRmliZXJGcm9tSG9zdEluc3RhbmNlRm9yRGVsZXRpb24oKTtcbiAgY2hpbGRUb0RlbGV0ZS5zdGF0ZU5vZGUgPSBpbnN0YW5jZTtcbiAgY2hpbGRUb0RlbGV0ZS5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgY2hpbGRUb0RlbGV0ZS5lZmZlY3RUYWcgPSBEZWxldGlvbjtcblxuICAvLyBUaGlzIG1pZ2h0IHNlZW0gbGlrZSBpdCBiZWxvbmdzIG9uIHByb2dyZXNzZWRGaXJzdERlbGV0aW9uLiBIb3dldmVyLFxuICAvLyB0aGVzZSBjaGlsZHJlbiBhcmUgbm90IHBhcnQgb2YgdGhlIHJlY29uY2lsaWF0aW9uIGxpc3Qgb2YgY2hpbGRyZW4uXG4gIC8vIEV2ZW4gaWYgd2UgYWJvcnQgYW5kIHJlcmVjb25jaWxlIHRoZSBjaGlsZHJlbiwgdGhhdCB3aWxsIHRyeSB0byBoeWRyYXRlXG4gIC8vIGFnYWluIGFuZCB0aGUgbm9kZXMgYXJlIHN0aWxsIGluIHRoZSBob3N0IHRyZWUgc28gdGhlc2Ugd2lsbCBiZVxuICAvLyByZWNyZWF0ZWQuXG4gIGlmIChyZXR1cm5GaWJlci5sYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgcmV0dXJuRmliZXIubGFzdEVmZmVjdC5uZXh0RWZmZWN0ID0gY2hpbGRUb0RlbGV0ZTtcbiAgICByZXR1cm5GaWJlci5sYXN0RWZmZWN0ID0gY2hpbGRUb0RlbGV0ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm5GaWJlci5maXJzdEVmZmVjdCA9IHJldHVybkZpYmVyLmxhc3RFZmZlY3QgPSBjaGlsZFRvRGVsZXRlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydE5vbkh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGZpYmVyKSB7XG4gIGZpYmVyLmVmZmVjdFRhZyB8PSBQbGFjZW1lbnQ7XG4gIHtcbiAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBwYXJlbnRDb250YWluZXIgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBwcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVDb250YWluZXJJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHR5cGUsIHByb3BzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICAgICAgICB2YXIgdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVDb250YWluZXJUZXh0SW5zdGFuY2UocGFyZW50Q29udGFpbmVyLCB0ZXh0KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcGFyZW50VHlwZSA9IHJldHVybkZpYmVyLnR5cGU7XG4gICAgICAgICAgdmFyIHBhcmVudFByb3BzID0gcmV0dXJuRmliZXIubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICB2YXIgcGFyZW50SW5zdGFuY2UgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAgdmFyIF90eXBlID0gZmliZXIudHlwZTtcbiAgICAgICAgICAgICAgdmFyIF9wcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIF90eXBlLCBfcHJvcHMpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICAgICAgICAgIHZhciBfdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBfdGV4dCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVTdXNwZW5zZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpIHtcbiAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciB0eXBlID0gZmliZXIudHlwZTtcbiAgICAgICAgdmFyIHByb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBjYW5IeWRyYXRlSW5zdGFuY2UobmV4dEluc3RhbmNlLCB0eXBlLCBwcm9wcyk7XG4gICAgICAgIGlmIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IGluc3RhbmNlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICB2YXIgdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIHRleHRJbnN0YW5jZSA9IGNhbkh5ZHJhdGVUZXh0SW5zdGFuY2UobmV4dEluc3RhbmNlLCB0ZXh0KTtcbiAgICAgICAgaWYgKHRleHRJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IHRleHRJbnN0YW5jZTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKGVuYWJsZVN1c3BlbnNlU2VydmVyUmVuZGVyZXIpIHtcbiAgICAgICAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IGNhbkh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKG5leHRJbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKHN1c3BlbnNlSW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIERvd25ncmFkZSB0aGUgdGFnIHRvIGEgZGVoeWRyYXRlZCBjb21wb25lbnQgdW50aWwgd2UndmUgaHlkcmF0ZWQgaXQuXG4gICAgICAgICAgICBmaWJlci50YWcgPSBEZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQ7XG4gICAgICAgICAgICBmaWJlci5zdGF0ZU5vZGUgPSBzdXNwZW5zZUluc3RhbmNlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKGZpYmVyKSB7XG4gIGlmICghaXNIeWRyYXRpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG5leHRJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG4gIGlmICghbmV4dEluc3RhbmNlKSB7XG4gICAgLy8gTm90aGluZyB0byBoeWRyYXRlLiBNYWtlIGl0IGFuIGluc2VydGlvbi5cbiAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgZmlyc3RBdHRlbXB0ZWRJbnN0YW5jZSA9IG5leHRJbnN0YW5jZTtcbiAgaWYgKCF0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpKSB7XG4gICAgLy8gSWYgd2UgY2FuJ3QgaHlkcmF0ZSB0aGlzIGluc3RhbmNlIGxldCdzIHRyeSB0aGUgbmV4dCBvbmUuXG4gICAgLy8gV2UgdXNlIHRoaXMgYXMgYSBoZXVyaXN0aWMuIEl0J3MgYmFzZWQgb24gaW50dWl0aW9uIGFuZCBub3QgZGF0YSBzbyBpdFxuICAgIC8vIG1pZ2h0IGJlIGZsYXdlZCBvciB1bm5lY2Vzc2FyeS5cbiAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoZmlyc3RBdHRlbXB0ZWRJbnN0YW5jZSk7XG4gICAgaWYgKCFuZXh0SW5zdGFuY2UgfHwgIXRyeUh5ZHJhdGUoZmliZXIsIG5leHRJbnN0YW5jZSkpIHtcbiAgICAgIC8vIE5vdGhpbmcgdG8gaHlkcmF0ZS4gTWFrZSBpdCBhbiBpbnNlcnRpb24uXG4gICAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgICBpc0h5ZHJhdGluZyA9IGZhbHNlO1xuICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gV2UgbWF0Y2hlZCB0aGUgbmV4dCBvbmUsIHdlJ2xsIG5vdyBhc3N1bWUgdGhhdCB0aGUgZmlyc3Qgb25lIHdhc1xuICAgIC8vIHN1cGVyZmx1b3VzIGFuZCB3ZSdsbCBkZWxldGUgaXQuIFNpbmNlIHdlIGNhbid0IGVhZ2VybHkgZGVsZXRlIGl0XG4gICAgLy8gd2UnbGwgaGF2ZSB0byBzY2hlZHVsZSBhIGRlbGV0aW9uLiBUbyBkbyB0aGF0LCB0aGlzIG5vZGUgbmVlZHMgYSBkdW1teVxuICAgIC8vIGZpYmVyIGFzc29jaWF0ZWQgd2l0aCBpdC5cbiAgICBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UoaHlkcmF0aW9uUGFyZW50RmliZXIsIGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UpO1xuICB9XG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZChuZXh0SW5zdGFuY2UpO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKGZpYmVyLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7XG4gIGlmICghc3VwcG9ydHNIeWRyYXRpb24pIHtcbiAgICBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCBwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKCkgdG8gbmV2ZXIgYmUgY2FsbGVkLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICB2YXIgdXBkYXRlUGF5bG9hZCA9IGh5ZHJhdGVJbnN0YW5jZShpbnN0YW5jZSwgZmliZXIudHlwZSwgZmliZXIubWVtb2l6ZWRQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgZmliZXIpO1xuICAvLyBUT0RPOiBUeXBlIHRoaXMgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGNvbXBvbmVudC5cbiAgZmliZXIudXBkYXRlUXVldWUgPSB1cGRhdGVQYXlsb2FkO1xuICAvLyBJZiB0aGUgdXBkYXRlIHBheWxvYWQgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYSBjaGFuZ2Ugb3IgaWYgdGhlcmVcbiAgLy8gaXMgYSBuZXcgcmVmIHdlIG1hcmsgdGhpcyBhcyBhbiB1cGRhdGUuXG4gIGlmICh1cGRhdGVQYXlsb2FkICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZShmaWJlcikge1xuICBpZiAoIXN1cHBvcnRzSHlkcmF0aW9uKSB7XG4gICAgaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgcHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2UoKSB0byBuZXZlciBiZSBjYWxsZWQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICB2YXIgdGV4dEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICB2YXIgdGV4dENvbnRlbnQgPSBmaWJlci5tZW1vaXplZFByb3BzO1xuICB2YXIgc2hvdWxkVXBkYXRlID0gaHlkcmF0ZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UsIHRleHRDb250ZW50LCBmaWJlcik7XG4gIHtcbiAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICAvLyBXZSBhc3N1bWUgdGhhdCBwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZSBpcyBjYWxsZWQgaW4gYSBjb250ZXh0IHdoZXJlIHRoZVxuICAgICAgLy8gaHlkcmF0aW9uIHBhcmVudCBpcyB0aGUgcGFyZW50IGhvc3QgY29tcG9uZW50IG9mIHRoaXMgaG9zdCB0ZXh0LlxuICAgICAgdmFyIHJldHVybkZpYmVyID0gaHlkcmF0aW9uUGFyZW50RmliZXI7XG4gICAgICBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgcGFyZW50Q29udGFpbmVyID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICAgIGRpZE5vdE1hdGNoSHlkcmF0ZWRDb250YWluZXJUZXh0SW5zdGFuY2UocGFyZW50Q29udGFpbmVyLCB0ZXh0SW5zdGFuY2UsIHRleHRDb250ZW50KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgcGFyZW50VHlwZSA9IHJldHVybkZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBwYXJlbnRQcm9wcyA9IHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgZGlkTm90TWF0Y2hIeWRyYXRlZFRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBza2lwUGFzdERlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKGZpYmVyKSB7XG4gIGlmICghc3VwcG9ydHNIeWRyYXRpb24pIHtcbiAgICBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCBza2lwUGFzdERlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKCkgdG8gbmV2ZXIgYmUgY2FsbGVkLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG4gIHZhciBzdXNwZW5zZUluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICAhc3VzcGVuc2VJbnN0YW5jZSA/IGludmFyaWFudChmYWxzZSwgJ0V4cGVjdGVkIHRvIGhhdmUgYSBoeWRyYXRlZCBzdXNwZW5zZSBpbnN0YW5jZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKSA6IHZvaWQgMDtcbiAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlSW5zdGFuY2VBZnRlclN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpIHtcbiAgdmFyIHBhcmVudCA9IGZpYmVyLnJldHVybjtcbiAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCAmJiBwYXJlbnQudGFnICE9PSBIb3N0Q29tcG9uZW50ICYmIHBhcmVudC50YWcgIT09IEhvc3RSb290ICYmIHBhcmVudC50YWcgIT09IERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gIH1cbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBwYXJlbnQ7XG59XG5cbmZ1bmN0aW9uIHBvcEh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG4gIGlmICghc3VwcG9ydHNIeWRyYXRpb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGZpYmVyICE9PSBoeWRyYXRpb25QYXJlbnRGaWJlcikge1xuICAgIC8vIFdlJ3JlIGRlZXBlciB0aGFuIHRoZSBjdXJyZW50IGh5ZHJhdGlvbiBjb250ZXh0LCBpbnNpZGUgYW4gaW5zZXJ0ZWRcbiAgICAvLyB0cmVlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgLy8gSWYgd2UncmUgbm90IGN1cnJlbnRseSBoeWRyYXRpbmcgYnV0IHdlJ3JlIGluIGEgaHlkcmF0aW9uIGNvbnRleHQsIHRoZW5cbiAgICAvLyB3ZSB3ZXJlIGFuIGluc2VydGlvbiBhbmQgbm93IG5lZWQgdG8gcG9wIHVwIHJlZW50ZXIgaHlkcmF0aW9uIG9mIG91clxuICAgIC8vIHNpYmxpbmdzLlxuICAgIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpO1xuICAgIGlzSHlkcmF0aW5nID0gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG5cbiAgLy8gSWYgd2UgaGF2ZSBhbnkgcmVtYWluaW5nIGh5ZHJhdGFibGUgbm9kZXMsIHdlIG5lZWQgdG8gZGVsZXRlIHRoZW0gbm93LlxuICAvLyBXZSBvbmx5IGRvIHRoaXMgZGVlcGVyIHRoYW4gaGVhZCBhbmQgYm9keSBzaW5jZSB0aGV5IHRlbmQgdG8gaGF2ZSByYW5kb21cbiAgLy8gb3RoZXIgbm9kZXMgaW4gdGhlbS4gV2UgYWxzbyBpZ25vcmUgY29tcG9uZW50cyB3aXRoIHB1cmUgdGV4dCBjb250ZW50IGluXG4gIC8vIHNpZGUgb2YgdGhlbS5cbiAgLy8gVE9ETzogQmV0dGVyIGhldXJpc3RpYy5cbiAgaWYgKGZpYmVyLnRhZyAhPT0gSG9zdENvbXBvbmVudCB8fCB0eXBlICE9PSAnaGVhZCcgJiYgdHlwZSAhPT0gJ2JvZHknICYmICFzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBmaWJlci5tZW1vaXplZFByb3BzKSkge1xuICAgIHZhciBuZXh0SW5zdGFuY2UgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlO1xuICAgIHdoaWxlIChuZXh0SW5zdGFuY2UpIHtcbiAgICAgIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShmaWJlciwgbmV4dEluc3RhbmNlKTtcbiAgICAgIG5leHRJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhuZXh0SW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuXG4gIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpO1xuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gaHlkcmF0aW9uUGFyZW50RmliZXIgPyBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoZmliZXIuc3RhdGVOb2RlKSA6IG51bGw7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXNldEh5ZHJhdGlvblN0YXRlKCkge1xuICBpZiAoIXN1cHBvcnRzSHlkcmF0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBudWxsO1xuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbiAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbn1cblxudmFyIFJlYWN0Q3VycmVudE93bmVyJDMgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcblxudmFyIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcblxudmFyIGRpZFdhcm5BYm91dEJhZENsYXNzID0gdm9pZCAwO1xudmFyIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudCA9IHZvaWQgMDtcbnZhciBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50ID0gdm9pZCAwO1xudmFyIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmcyA9IHZvaWQgMDtcbnZhciBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gdm9pZCAwO1xuXG57XG4gIGRpZFdhcm5BYm91dEJhZENsYXNzID0ge307XG4gIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudCA9IHt9O1xuICBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmcyA9IHt9O1xuICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gIGlmIChjdXJyZW50JCQxID09PSBudWxsKSB7XG4gICAgLy8gSWYgdGhpcyBpcyBhIGZyZXNoIG5ldyBjb21wb25lbnQgdGhhdCBoYXNuJ3QgYmVlbiByZW5kZXJlZCB5ZXQsIHdlXG4gICAgLy8gd29uJ3QgdXBkYXRlIGl0cyBjaGlsZCBzZXQgYnkgYXBwbHlpbmcgbWluaW1hbCBzaWRlLWVmZmVjdHMuIEluc3RlYWQsXG4gICAgLy8gd2Ugd2lsbCBhZGQgdGhlbSBhbGwgdG8gdGhlIGNoaWxkIGJlZm9yZSBpdCBnZXRzIHJlbmRlcmVkLiBUaGF0IG1lYW5zXG4gICAgLy8gd2UgY2FuIG9wdGltaXplIHRoaXMgcmVjb25jaWxpYXRpb24gcGFzcyBieSBub3QgdHJhY2tpbmcgc2lkZS1lZmZlY3RzLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbW91bnRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgdGhlIGN1cnJlbnQgY2hpbGQgaXMgdGhlIHNhbWUgYXMgdGhlIHdvcmsgaW4gcHJvZ3Jlc3MsIGl0IG1lYW5zIHRoYXRcbiAgICAvLyB3ZSBoYXZlbid0IHlldCBzdGFydGVkIGFueSB3b3JrIG9uIHRoZXNlIGNoaWxkcmVuLiBUaGVyZWZvcmUsIHdlIHVzZVxuICAgIC8vIHRoZSBjbG9uZSBhbGdvcml0aG0gdG8gY3JlYXRlIGEgY29weSBvZiBhbGwgdGhlIGN1cnJlbnQgY2hpbGRyZW4uXG5cbiAgICAvLyBJZiB3ZSBoYWQgYW55IHByb2dyZXNzZWQgd29yayBhbHJlYWR5LCB0aGF0IGlzIGludmFsaWQgYXQgdGhpcyBwb2ludCBzb1xuICAgIC8vIGxldCdzIHRocm93IGl0IG91dC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50JCQxLmNoaWxkLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JjZVVubW91bnRDdXJyZW50QW5kUmVjb25jaWxlKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgZm9yayBvZiByZWNvbmNpbGVDaGlsZHJlbi4gSXQncyB1c2VkIGluIGNhc2VzIHdoZXJlIHdlXG4gIC8vIHdhbnQgdG8gcmVjb25jaWxlIHdpdGhvdXQgbWF0Y2hpbmcgYWdhaW5zdCB0aGUgZXhpc3Rpbmcgc2V0LiBUaGlzIGhhcyB0aGVcbiAgLy8gZWZmZWN0IG9mIGFsbCBjdXJyZW50IGNoaWxkcmVuIGJlaW5nIHVubW91bnRlZDsgZXZlbiBpZiB0aGUgdHlwZSBhbmQga2V5XG4gIC8vIGFyZSB0aGUgc2FtZSwgdGhlIG9sZCBjaGlsZCBpcyB1bm1vdW50ZWQgYW5kIGEgbmV3IGNoaWxkIGlzIGNyZWF0ZWQuXG4gIC8vXG4gIC8vIFRvIGRvIHRoaXMsIHdlJ3JlIGdvaW5nIHRvIGdvIHRocm91Z2ggdGhlIHJlY29uY2lsZSBhbGdvcml0aG0gdHdpY2UuIEluXG4gIC8vIHRoZSBmaXJzdCBwYXNzLCB3ZSBzY2hlZHVsZSBhIGRlbGV0aW9uIGZvciBhbGwgdGhlIGN1cnJlbnQgY2hpbGRyZW4gYnlcbiAgLy8gcGFzc2luZyBudWxsLlxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50JCQxLmNoaWxkLCBudWxsLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIC8vIEluIHRoZSBzZWNvbmQgcGFzcywgd2UgbW91bnQgdGhlIG5ldyBjaGlsZHJlbi4gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZVxuICAvLyBwYXNzIG51bGwgaW4gcGxhY2Ugb2Ygd2hlcmUgd2UgdXN1YWxseSBwYXNzIHRoZSBjdXJyZW50IGNoaWxkIHNldC4gVGhpcyBoYXNcbiAgLy8gdGhlIGVmZmVjdCBvZiByZW1vdW50aW5nIGFsbCBjaGlsZHJlbiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlaXIgdGhlaXJcbiAgLy8gaWRlbnRpdHkgbWF0Y2hlcy5cbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZvcndhcmRSZWYoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAvLyBUT0RPOiBjdXJyZW50IGNhbiBiZSBub24tbnVsbCBoZXJlIGV2ZW4gaWYgdGhlIGNvbXBvbmVudFxuICAvLyBoYXNuJ3QgeWV0IG1vdW50ZWQuIFRoaXMgaGFwcGVucyBhZnRlciB0aGUgZmlyc3QgcmVuZGVyIHN1c3BlbmRzLlxuICAvLyBXZSdsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBmaW5lIG9yIGNhbiBjYXVzZSBpc3N1ZXMuXG5cbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCksIGdldEN1cnJlbnRGaWJlclN0YWNrSW5EZXYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciByZW5kZXIgPSBDb21wb25lbnQucmVuZGVyO1xuICB2YXIgcmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuXG4gIC8vIFRoZSByZXN0IGlzIGEgZm9yayBvZiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudFxuICB2YXIgbmV4dENoaWxkcmVuID0gdm9pZCAwO1xuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICB7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMy5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgc2V0Q3VycmVudFBoYXNlKCdyZW5kZXInKTtcbiAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlciwgbmV4dFByb3BzLCByZWYsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICBpZiAoZGVidWdSZW5kZXJQaGFzZVNpZGVFZmZlY3RzIHx8IGRlYnVnUmVuZGVyUGhhc2VTaWRlRWZmZWN0c0ZvclN0cmljdE1vZGUgJiYgd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdE1vZGUpIHtcbiAgICAgIC8vIE9ubHkgZG91YmxlLXJlbmRlciBjb21wb25lbnRzIHdpdGggSG9va3NcbiAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyLCBuZXh0UHJvcHMsIHJlZiwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBzZXRDdXJyZW50UGhhc2UobnVsbCk7XG4gIH1cblxuICBpZiAoY3VycmVudCQkMSAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIH1cblxuICAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG4gIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTWVtb0NvbXBvbmVudChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHVwZGF0ZUV4cGlyYXRpb25UaW1lLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICBpZiAoY3VycmVudCQkMSA9PT0gbnVsbCkge1xuICAgIHZhciB0eXBlID0gQ29tcG9uZW50LnR5cGU7XG4gICAgaWYgKGlzU2ltcGxlRnVuY3Rpb25Db21wb25lbnQodHlwZSkgJiYgQ29tcG9uZW50LmNvbXBhcmUgPT09IG51bGwgJiZcbiAgICAvLyBTaW1wbGVNZW1vQ29tcG9uZW50IGNvZGVwYXRoIGRvZXNuJ3QgcmVzb2x2ZSBvdXRlciBwcm9wcyBlaXRoZXIuXG4gICAgQ29tcG9uZW50LmRlZmF1bHRQcm9wcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBJZiB0aGlzIGlzIGEgcGxhaW4gZnVuY3Rpb24gY29tcG9uZW50IHdpdGhvdXQgZGVmYXVsdCBwcm9wcyxcbiAgICAgIC8vIGFuZCB3aXRoIG9ubHkgdGhlIGRlZmF1bHQgc2hhbGxvdyBjb21wYXJpc29uLCB3ZSB1cGdyYWRlIGl0XG4gICAgICAvLyB0byBhIFNpbXBsZU1lbW9Db21wb25lbnQgdG8gYWxsb3cgZmFzdCBwYXRoIHVwZGF0ZXMuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBTaW1wbGVNZW1vQ29tcG9uZW50O1xuICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHR5cGU7XG4gICAgICB7XG4gICAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgdHlwZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgbmV4dFByb3BzLCB1cGRhdGVFeHBpcmF0aW9uVGltZSwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIH1cbiAgICB7XG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICAvLyBJbm5lciBtZW1vIGNvbXBvbmVudCBwcm9wcyBhcmVuJ3QgY3VycmVudGx5IHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50LlxuICAgICAgICAvLyBXZSBjb3VsZCBtb3ZlIGl0IHRoZXJlLCBidXQgd2UnZCBzdGlsbCBuZWVkIHRoaXMgZm9yIGxhenkgY29kZSBwYXRoLlxuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUodHlwZSksIGdldEN1cnJlbnRGaWJlclN0YWNrSW5EZXYpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgY2hpbGQgPSBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMoQ29tcG9uZW50LnR5cGUsIG51bGwsIG5leHRQcm9wcywgbnVsbCwgd29ya0luUHJvZ3Jlc3MubW9kZSwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIGNoaWxkLnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgICBjaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGNoaWxkO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuICB7XG4gICAgdmFyIF90eXBlID0gQ29tcG9uZW50LnR5cGU7XG4gICAgdmFyIF9pbm5lclByb3BUeXBlcyA9IF90eXBlLnByb3BUeXBlcztcbiAgICBpZiAoX2lubmVyUHJvcFR5cGVzKSB7XG4gICAgICAvLyBJbm5lciBtZW1vIGNvbXBvbmVudCBwcm9wcyBhcmVuJ3QgY3VycmVudGx5IHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50LlxuICAgICAgLy8gV2UgY291bGQgbW92ZSBpdCB0aGVyZSwgYnV0IHdlJ2Qgc3RpbGwgbmVlZCB0aGlzIGZvciBsYXp5IGNvZGUgcGF0aC5cbiAgICAgIGNoZWNrUHJvcFR5cGVzKF9pbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lKF90eXBlKSwgZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldik7XG4gICAgfVxuICB9XG4gIHZhciBjdXJyZW50Q2hpbGQgPSBjdXJyZW50JCQxLmNoaWxkOyAvLyBUaGlzIGlzIGFsd2F5cyBleGFjdGx5IG9uZSBjaGlsZFxuICBpZiAodXBkYXRlRXhwaXJhdGlvblRpbWUgPCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAgIC8vIFRoaXMgd2lsbCBiZSB0aGUgcHJvcHMgd2l0aCByZXNvbHZlZCBkZWZhdWx0UHJvcHMsXG4gICAgLy8gdW5saWtlIGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB3aGljaCB3aWxsIGJlIHRoZSB1bnJlc29sdmVkIG9uZXMuXG4gICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnRDaGlsZC5tZW1vaXplZFByb3BzO1xuICAgIC8vIERlZmF1bHQgdG8gc2hhbGxvdyBjb21wYXJpc29uXG4gICAgdmFyIGNvbXBhcmUgPSBDb21wb25lbnQuY29tcGFyZTtcbiAgICBjb21wYXJlID0gY29tcGFyZSAhPT0gbnVsbCA/IGNvbXBhcmUgOiBzaGFsbG93RXF1YWw7XG4gICAgaWYgKGNvbXBhcmUocHJldlByb3BzLCBuZXh0UHJvcHMpICYmIGN1cnJlbnQkJDEucmVmID09PSB3b3JrSW5Qcm9ncmVzcy5yZWYpIHtcbiAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgfVxuICB9XG4gIC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cbiAgd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnIHw9IFBlcmZvcm1lZFdvcms7XG4gIHZhciBuZXdDaGlsZCA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRDaGlsZCwgbmV4dFByb3BzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIG5ld0NoaWxkLnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgbmV3Q2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV3Q2hpbGQ7XG4gIHJldHVybiBuZXdDaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHVwZGF0ZUV4cGlyYXRpb25UaW1lLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAvLyBUT0RPOiBjdXJyZW50IGNhbiBiZSBub24tbnVsbCBoZXJlIGV2ZW4gaWYgdGhlIGNvbXBvbmVudFxuICAvLyBoYXNuJ3QgeWV0IG1vdW50ZWQuIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBpbm5lciByZW5kZXIgc3VzcGVuZHMuXG4gIC8vIFdlJ2xsIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIGlzIGZpbmUgb3IgY2FuIGNhdXNlIGlzc3Vlcy5cblxuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIG91dGVyTWVtb1R5cGUgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZTtcbiAgICAgIGlmIChvdXRlck1lbW9UeXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgLy8gV2Ugd2FybiB3aGVuIHlvdSBkZWZpbmUgcHJvcFR5cGVzIG9uIGxhenkoKVxuICAgICAgICAvLyBzbyBsZXQncyBqdXN0IHNraXAgb3ZlciBpdCB0byBmaW5kIG1lbW8oKSBvdXRlciB3cmFwcGVyLlxuICAgICAgICAvLyBJbm5lciBwcm9wcyBmb3IgbWVtbyBhcmUgdmFsaWRhdGVkIGxhdGVyLlxuICAgICAgICBvdXRlck1lbW9UeXBlID0gcmVmaW5lUmVzb2x2ZWRMYXp5Q29tcG9uZW50KG91dGVyTWVtb1R5cGUpO1xuICAgICAgfVxuICAgICAgdmFyIG91dGVyUHJvcFR5cGVzID0gb3V0ZXJNZW1vVHlwZSAmJiBvdXRlck1lbW9UeXBlLnByb3BUeXBlcztcbiAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCAoU2ltcGxlTWVtb0NvbXBvbmVudCBoYXMgbm8gZGVmYXVsdFByb3BzKVxuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUob3V0ZXJNZW1vVHlwZSksIGdldEN1cnJlbnRGaWJlclN0YWNrSW5EZXYpO1xuICAgICAgfVxuICAgICAgLy8gSW5uZXIgcHJvcFR5cGVzIHdpbGwgYmUgdmFsaWRhdGVkIGluIHRoZSBmdW5jdGlvbiBjb21wb25lbnQgcGF0aC5cbiAgICB9XG4gIH1cbiAgaWYgKGN1cnJlbnQkJDEgIT09IG51bGwpIHtcbiAgICB2YXIgcHJldlByb3BzID0gY3VycmVudCQkMS5tZW1vaXplZFByb3BzO1xuICAgIGlmIChzaGFsbG93RXF1YWwocHJldlByb3BzLCBuZXh0UHJvcHMpICYmIGN1cnJlbnQkJDEucmVmID09PSB3b3JrSW5Qcm9ncmVzcy5yZWYpIHtcbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbiAgICAgIGlmICh1cGRhdGVFeHBpcmF0aW9uVGltZSA8IHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRnJhZ21lbnQoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNb2RlKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUHJvZmlsZXIoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gIGlmIChlbmFibGVQcm9maWxlclRpbWVyKSB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnIHw9IFVwZGF0ZTtcbiAgfVxuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gbWFya1JlZihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcykge1xuICB2YXIgcmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuICBpZiAoY3VycmVudCQkMSA9PT0gbnVsbCAmJiByZWYgIT09IG51bGwgfHwgY3VycmVudCQkMSAhPT0gbnVsbCAmJiBjdXJyZW50JCQxLnJlZiAhPT0gcmVmKSB7XG4gICAgLy8gU2NoZWR1bGUgYSBSZWYgZWZmZWN0XG4gICAgd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnIHw9IFJlZjtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuICAgICAgaWYgKGlubmVyUHJvcFR5cGVzKSB7XG4gICAgICAgIGNoZWNrUHJvcFR5cGVzKGlubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQpLCBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHRydWUpO1xuICB2YXIgY29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCk7XG5cbiAgdmFyIG5leHRDaGlsZHJlbiA9IHZvaWQgMDtcbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDMuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldEN1cnJlbnRQaGFzZSgncmVuZGVyJyk7XG4gICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgY29udGV4dCwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIGlmIChkZWJ1Z1JlbmRlclBoYXNlU2lkZUVmZmVjdHMgfHwgZGVidWdSZW5kZXJQaGFzZVNpZGVFZmZlY3RzRm9yU3RyaWN0TW9kZSAmJiB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgLy8gT25seSBkb3VibGUtcmVuZGVyIGNvbXBvbmVudHMgd2l0aCBIb29rc1xuICAgICAgaWYgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgY29udGV4dCwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBzZXRDdXJyZW50UGhhc2UobnVsbCk7XG4gIH1cblxuICBpZiAoY3VycmVudCQkMSAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIH1cblxuICAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG4gIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ2xhc3NDb21wb25lbnQoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlcztcbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50KSwgZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgLy8gRHVyaW5nIG1vdW50aW5nIHdlIGRvbid0IGtub3cgdGhlIGNoaWxkIGNvbnRleHQgeWV0IGFzIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGV4aXN0LlxuICAvLyBXZSB3aWxsIGludmFsaWRhdGUgdGhlIGNoaWxkIGNvbnRleHQgaW4gZmluaXNoQ2xhc3NDb21wb25lbnQoKSByaWdodCBhZnRlciByZW5kZXJpbmcuXG4gIHZhciBoYXNDb250ZXh0ID0gdm9pZCAwO1xuICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICB9IGVsc2Uge1xuICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgfVxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuXG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgdmFyIHNob3VsZFVwZGF0ZSA9IHZvaWQgMDtcbiAgaWYgKGluc3RhbmNlID09PSBudWxsKSB7XG4gICAgaWYgKGN1cnJlbnQkJDEgIT09IG51bGwpIHtcbiAgICAgIC8vIEFuIGNsYXNzIGNvbXBvbmVudCB3aXRob3V0IGFuIGluc3RhbmNlIG9ubHkgbW91bnRzIGlmIGl0IHN1c3BlbmRlZFxuICAgICAgLy8gaW5zaWRlIGEgbm9uLSBjb25jdXJyZW50IHRyZWUsIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gV2Ugd2FudCB0b1xuICAgICAgLy8gdHJlZSBpdCBsaWtlIGEgbmV3IG1vdW50LCBldmVuIHRob3VnaCBhbiBlbXB0eSB2ZXJzaW9uIG9mIGl0IGFscmVhZHlcbiAgICAgIC8vIGNvbW1pdHRlZC4gRGlzY29ubmVjdCB0aGUgYWx0ZXJuYXRlIHBvaW50ZXJzLlxuICAgICAgY3VycmVudCQkMS5hbHRlcm5hdGUgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICAgIC8vIFNpbmNlIHRoaXMgaXMgY29uY2VwdHVhbGx5IGEgbmV3IGZpYmVyLCBzY2hlZHVsZSBhIFBsYWNlbWVudCBlZmZlY3RcbiAgICAgIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBQbGFjZW1lbnQ7XG4gICAgfVxuICAgIC8vIEluIHRoZSBpbml0aWFsIHBhc3Mgd2UgbWlnaHQgbmVlZCB0byBjb25zdHJ1Y3QgdGhlIGluc3RhbmNlLlxuICAgIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIHNob3VsZFVwZGF0ZSA9IHRydWU7XG4gIH0gZWxzZSBpZiAoY3VycmVudCQkMSA9PT0gbnVsbCkge1xuICAgIC8vIEluIGEgcmVzdW1lLCB3ZSdsbCBhbHJlYWR5IGhhdmUgYW4gaW5zdGFuY2Ugd2UgY2FuIHJldXNlLlxuICAgIHNob3VsZFVwZGF0ZSA9IHJlc3VtZU1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgfSBlbHNlIHtcbiAgICBzaG91bGRVcGRhdGUgPSB1cGRhdGVDbGFzc0luc3RhbmNlKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICB9XG4gIHZhciBuZXh0VW5pdE9mV29yayA9IGZpbmlzaENsYXNzQ29tcG9uZW50KGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHNob3VsZFVwZGF0ZSwgaGFzQ29udGV4dCwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICB7XG4gICAgdmFyIGluc3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgaWYgKGluc3QucHJvcHMgIT09IG5leHRQcm9wcykge1xuICAgICAgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMgPyB3YXJuaW5nJDEoZmFsc2UsICdJdCBsb29rcyBsaWtlICVzIGlzIHJlYXNzaWduaW5nIGl0cyBvd24gYHRoaXMucHJvcHNgIHdoaWxlIHJlbmRlcmluZy4gJyArICdUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGNhbiBsZWFkIHRvIGNvbmZ1c2luZyBidWdzLicsIGdldENvbXBvbmVudE5hbWUod29ya0luUHJvZ3Jlc3MudHlwZSkgfHwgJ2EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5leHRVbml0T2ZXb3JrO1xufVxuXG5mdW5jdGlvbiBmaW5pc2hDbGFzc0NvbXBvbmVudChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBzaG91bGRVcGRhdGUsIGhhc0NvbnRleHQsIHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gIC8vIFJlZnMgc2hvdWxkIHVwZGF0ZSBldmVuIGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5zIGZhbHNlXG4gIG1hcmtSZWYoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gIHZhciBkaWRDYXB0dXJlRXJyb3IgPSAod29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnICYgRGlkQ2FwdHVyZSkgIT09IE5vRWZmZWN0O1xuXG4gIGlmICghc2hvdWxkVXBkYXRlICYmICFkaWRDYXB0dXJlRXJyb3IpIHtcbiAgICAvLyBDb250ZXh0IHByb3ZpZGVycyBzaG91bGQgZGVmZXIgdG8gc0NVIGZvciByZW5kZXJpbmdcbiAgICBpZiAoaGFzQ29udGV4dCkge1xuICAgICAgaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAvLyBSZXJlbmRlclxuICBSZWFjdEN1cnJlbnRPd25lciQzLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IHZvaWQgMDtcbiAgaWYgKGRpZENhcHR1cmVFcnJvciAmJiB0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIElmIHdlIGNhcHR1cmVkIGFuIGVycm9yLCBidXQgZ2V0RGVyaXZlZFN0YXRlRnJvbSBjYXRjaCBpcyBub3QgZGVmaW5lZCxcbiAgICAvLyB1bm1vdW50IGFsbCB0aGUgY2hpbGRyZW4uIGNvbXBvbmVudERpZENhdGNoIHdpbGwgc2NoZWR1bGUgYW4gdXBkYXRlIHRvXG4gICAgLy8gcmUtcmVuZGVyIGEgZmFsbGJhY2suIFRoaXMgaXMgdGVtcG9yYXJ5IHVudGlsIHdlIG1pZ3JhdGUgZXZlcnlvbmUgdG9cbiAgICAvLyB0aGUgbmV3IEFQSS5cbiAgICAvLyBUT0RPOiBXYXJuIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gICAgbmV4dENoaWxkcmVuID0gbnVsbDtcblxuICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyKSB7XG4gICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIHNldEN1cnJlbnRQaGFzZSgncmVuZGVyJyk7XG4gICAgICBuZXh0Q2hpbGRyZW4gPSBpbnN0YW5jZS5yZW5kZXIoKTtcbiAgICAgIGlmIChkZWJ1Z1JlbmRlclBoYXNlU2lkZUVmZmVjdHMgfHwgZGVidWdSZW5kZXJQaGFzZVNpZGVFZmZlY3RzRm9yU3RyaWN0TW9kZSAmJiB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgICBpbnN0YW5jZS5yZW5kZXIoKTtcbiAgICAgIH1cbiAgICAgIHNldEN1cnJlbnRQaGFzZShudWxsKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG4gIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBQZXJmb3JtZWRXb3JrO1xuICBpZiAoY3VycmVudCQkMSAhPT0gbnVsbCAmJiBkaWRDYXB0dXJlRXJyb3IpIHtcbiAgICAvLyBJZiB3ZSdyZSByZWNvdmVyaW5nIGZyb20gYW4gZXJyb3IsIHJlY29uY2lsZSB3aXRob3V0IHJldXNpbmcgYW55IG9mXG4gICAgLy8gdGhlIGV4aXN0aW5nIGNoaWxkcmVuLiBDb25jZXB0dWFsbHksIHRoZSBub3JtYWwgY2hpbGRyZW4gYW5kIHRoZSBjaGlsZHJlblxuICAgIC8vIHRoYXQgYXJlIHNob3duIG9uIGVycm9yIGFyZSB0d28gZGlmZmVyZW50IHNldHMsIHNvIHdlIHNob3VsZG4ndCByZXVzZVxuICAgIC8vIG5vcm1hbCBjaGlsZHJlbiBldmVuIGlmIHRoZWlyIGlkZW50aXRpZXMgbWF0Y2guXG4gICAgZm9yY2VVbm1vdW50Q3VycmVudEFuZFJlY29uY2lsZShjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIH0gZWxzZSB7XG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICB9XG5cbiAgLy8gTWVtb2l6ZSBzdGF0ZSB1c2luZyB0aGUgdmFsdWVzIHdlIGp1c3QgdXNlZCB0byByZW5kZXIuXG4gIC8vIFRPRE86IFJlc3RydWN0dXJlIHNvIHdlIG5ldmVyIHJlYWQgdmFsdWVzIGZyb20gdGhlIGluc3RhbmNlLlxuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG5cbiAgLy8gVGhlIGNvbnRleHQgbWlnaHQgaGF2ZSBjaGFuZ2VkIHNvIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgaXQuXG4gIGlmIChoYXNDb250ZXh0KSB7XG4gICAgaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcykge1xuICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgaWYgKHJvb3QucGVuZGluZ0NvbnRleHQpIHtcbiAgICBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzLCByb290LnBlbmRpbmdDb250ZXh0LCByb290LnBlbmRpbmdDb250ZXh0ICE9PSByb290LmNvbnRleHQpO1xuICB9IGVsc2UgaWYgKHJvb3QuY29udGV4dCkge1xuICAgIC8vIFNob3VsZCBhbHdheXMgYmUgc2V0XG4gICAgcHVzaFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcywgcm9vdC5jb250ZXh0LCBmYWxzZSk7XG4gIH1cbiAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHJvb3QuY29udGFpbmVySW5mbyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvc3RSb290KGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICBwdXNoSG9zdFJvb3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG4gICEodXBkYXRlUXVldWUgIT09IG51bGwpID8gaW52YXJpYW50KGZhbHNlLCAnSWYgdGhlIHJvb3QgZG9lcyBub3QgaGF2ZSBhbiB1cGRhdGVRdWV1ZSwgd2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBiYWlsZWQgb3V0LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpIDogdm9pZCAwO1xuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgcHJldlN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHByZXZDaGlsZHJlbiA9IHByZXZTdGF0ZSAhPT0gbnVsbCA/IHByZXZTdGF0ZS5lbGVtZW50IDogbnVsbDtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCB1cGRhdGVRdWV1ZSwgbmV4dFByb3BzLCBudWxsLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAvLyBDYXV0aW9uOiBSZWFjdCBEZXZUb29scyBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByb3BlcnR5XG4gIC8vIGJlaW5nIGNhbGxlZCBcImVsZW1lbnRcIi5cbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRTdGF0ZS5lbGVtZW50O1xuICBpZiAobmV4dENoaWxkcmVuID09PSBwcmV2Q2hpbGRyZW4pIHtcbiAgICAvLyBJZiB0aGUgc3RhdGUgaXMgdGhlIHNhbWUgYXMgYmVmb3JlLCB0aGF0J3MgYSBiYWlsb3V0IGJlY2F1c2Ugd2UgaGFkXG4gICAgLy8gbm8gd29yayB0aGF0IGV4cGlyZXMgYXQgdGhpcyB0aW1lLlxuICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICB9XG4gIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICBpZiAoKGN1cnJlbnQkJDEgPT09IG51bGwgfHwgY3VycmVudCQkMS5jaGlsZCA9PT0gbnVsbCkgJiYgcm9vdC5oeWRyYXRlICYmIGVudGVySHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgY3VycmVudCBjaGlsZHJlbiB0aGlzIG1pZ2h0IGJlIHRoZSBmaXJzdCBwYXNzLlxuICAgIC8vIFdlIGFsd2F5cyB0cnkgdG8gaHlkcmF0ZS4gSWYgdGhpcyBpc24ndCBhIGh5ZHJhdGlvbiBwYXNzIHRoZXJlIHdvbid0XG4gICAgLy8gYmUgYW55IGNoaWxkcmVuIHRvIGh5ZHJhdGUgd2hpY2ggaXMgZWZmZWN0aXZlbHkgdGhlIHNhbWUgdGhpbmcgYXNcbiAgICAvLyBub3QgaHlkcmF0aW5nLlxuXG4gICAgLy8gVGhpcyBpcyBhIGJpdCBvZiBhIGhhY2suIFdlIHRyYWNrIHRoZSBob3N0IHJvb3QgYXMgYSBwbGFjZW1lbnQgdG9cbiAgICAvLyBrbm93IHRoYXQgd2UncmUgY3VycmVudGx5IGluIGEgbW91bnRpbmcgc3RhdGUuIFRoYXQgd2F5IGlzTW91bnRlZFxuICAgIC8vIHdvcmtzIGFzIGV4cGVjdGVkLiBXZSBtdXN0IHJlc2V0IHRoaXMgYmVmb3JlIGNvbW1pdHRpbmcuXG4gICAgLy8gVE9ETzogRGVsZXRlIHRoaXMgd2hlbiB3ZSBkZWxldGUgaXNNb3VudGVkIGFuZCBmaW5kRE9NTm9kZS5cbiAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gUGxhY2VtZW50O1xuXG4gICAgLy8gRW5zdXJlIHRoYXQgY2hpbGRyZW4gbW91bnQgaW50byB0aGlzIHJvb3Qgd2l0aG91dCB0cmFja2luZ1xuICAgIC8vIHNpZGUtZWZmZWN0cy4gVGhpcyBlbnN1cmVzIHRoYXQgd2UgZG9uJ3Qgc3RvcmUgUGxhY2VtZW50IGVmZmVjdHMgb25cbiAgICAvLyBub2RlcyB0aGF0IHdpbGwgYmUgaHlkcmF0ZWQuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBtb3VudENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2UgcmVzZXQgaHlkcmF0aW9uIHN0YXRlIGluIGNhc2Ugd2UgYWJvcnRlZCBhbmQgcmVzdW1lZCBhbm90aGVyXG4gICAgLy8gcm9vdC5cbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICB9XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdENvbXBvbmVudChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgcHVzaEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBpZiAoY3VycmVudCQkMSA9PT0gbnVsbCkge1xuICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQkJDEgIT09IG51bGwgPyBjdXJyZW50JCQxLm1lbW9pemVkUHJvcHMgOiBudWxsO1xuXG4gIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHZhciBpc0RpcmVjdFRleHRDaGlsZCA9IHNob3VsZFNldFRleHRDb250ZW50KHR5cGUsIG5leHRQcm9wcyk7XG5cbiAgaWYgKGlzRGlyZWN0VGV4dENoaWxkKSB7XG4gICAgLy8gV2Ugc3BlY2lhbCBjYXNlIGEgZGlyZWN0IHRleHQgY2hpbGQgb2YgYSBob3N0IG5vZGUuIFRoaXMgaXMgYSBjb21tb25cbiAgICAvLyBjYXNlLiBXZSB3b24ndCBoYW5kbGUgaXQgYXMgYSByZWlmaWVkIGNoaWxkLiBXZSB3aWxsIGluc3RlYWQgaGFuZGxlXG4gICAgLy8gdGhpcyBpbiB0aGUgaG9zdCBlbnZpcm9ubWVudCB0aGF0IGFsc28gaGF2ZSBhY2Nlc3MgdG8gdGhpcyBwcm9wLiBUaGF0XG4gICAgLy8gYXZvaWRzIGFsbG9jYXRpbmcgYW5vdGhlciBIb3N0VGV4dCBmaWJlciBhbmQgdHJhdmVyc2luZyBpdC5cbiAgICBuZXh0Q2hpbGRyZW4gPSBudWxsO1xuICB9IGVsc2UgaWYgKHByZXZQcm9wcyAhPT0gbnVsbCAmJiBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBwcmV2UHJvcHMpKSB7XG4gICAgLy8gSWYgd2UncmUgc3dpdGNoaW5nIGZyb20gYSBkaXJlY3QgdGV4dCBjaGlsZCB0byBhIG5vcm1hbCBjaGlsZCwgb3IgdG9cbiAgICAvLyBlbXB0eSwgd2UgbmVlZCB0byBzY2hlZHVsZSB0aGUgdGV4dCBjb250ZW50IHRvIGJlIHJlc2V0LlxuICAgIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBDb250ZW50UmVzZXQ7XG4gIH1cblxuICBtYXJrUmVmKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzKTtcblxuICAvLyBDaGVjayB0aGUgaG9zdCBjb25maWcgdG8gc2VlIGlmIHRoZSBjaGlsZHJlbiBhcmUgb2Zmc2NyZWVuL2hpZGRlbi5cbiAgaWYgKHJlbmRlckV4cGlyYXRpb25UaW1lICE9PSBOZXZlciAmJiB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUgJiYgc2hvdWxkRGVwcmlvcml0aXplU3VidHJlZSh0eXBlLCBuZXh0UHJvcHMpKSB7XG4gICAgLy8gU2NoZWR1bGUgdGhpcyBmaWJlciB0byByZS1yZW5kZXIgYXQgb2Zmc2NyZWVuIHByaW9yaXR5LiBUaGVuIGJhaWxvdXQuXG4gICAgd29ya0luUHJvZ3Jlc3MuZXhwaXJhdGlvblRpbWUgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZEV4cGlyYXRpb25UaW1lID0gTmV2ZXI7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdFRleHQoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgaWYgKGN1cnJlbnQkJDEgPT09IG51bGwpIHtcbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cbiAgLy8gTm90aGluZyB0byBkbyBoZXJlLiBUaGlzIGlzIHRlcm1pbmFsLiBXZSdsbCBkbyB0aGUgY29tcGxldGlvbiBzdGVwXG4gIC8vIGltbWVkaWF0ZWx5IGFmdGVyLlxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gbW91bnRMYXp5Q29tcG9uZW50KF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgZWxlbWVudFR5cGUsIHVwZGF0ZUV4cGlyYXRpb25UaW1lLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICBpZiAoX2N1cnJlbnQgIT09IG51bGwpIHtcbiAgICAvLyBBbiBsYXp5IGNvbXBvbmVudCBvbmx5IG1vdW50cyBpZiBpdCBzdXNwZW5kZWQgaW5zaWRlIGEgbm9uLVxuICAgIC8vIGNvbmN1cnJlbnQgdHJlZSwgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBXZSB3YW50IHRvIHRyZWF0IGl0IGxpa2VcbiAgICAvLyBhIG5ldyBtb3VudCwgZXZlbiB0aG91Z2ggYW4gZW1wdHkgdmVyc2lvbiBvZiBpdCBhbHJlYWR5IGNvbW1pdHRlZC5cbiAgICAvLyBEaXNjb25uZWN0IHRoZSBhbHRlcm5hdGUgcG9pbnRlcnMuXG4gICAgX2N1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsO1xuICAgIC8vIFNpbmNlIHRoaXMgaXMgY29uY2VwdHVhbGx5IGEgbmV3IGZpYmVyLCBzY2hlZHVsZSBhIFBsYWNlbWVudCBlZmZlY3RcbiAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gUGxhY2VtZW50O1xuICB9XG5cbiAgdmFyIHByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICAvLyBXZSBjYW4ndCBzdGFydCBhIFVzZXIgVGltaW5nIG1lYXN1cmVtZW50IHdpdGggY29ycmVjdCBsYWJlbCB5ZXQuXG4gIC8vIENhbmNlbCBhbmQgcmVzdW1lIHJpZ2h0IGFmdGVyIHdlIGtub3cgdGhlIHRhZy5cbiAgY2FuY2VsV29ya1RpbWVyKHdvcmtJblByb2dyZXNzKTtcbiAgdmFyIENvbXBvbmVudCA9IHJlYWRMYXp5Q29tcG9uZW50VHlwZShlbGVtZW50VHlwZSk7XG4gIC8vIFN0b3JlIHRoZSB1bndyYXBwZWQgY29tcG9uZW50IGluIHRoZSB0eXBlLlxuICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50O1xuICB2YXIgcmVzb2x2ZWRUYWcgPSB3b3JrSW5Qcm9ncmVzcy50YWcgPSByZXNvbHZlTGF6eUNvbXBvbmVudFRhZyhDb21wb25lbnQpO1xuICBzdGFydFdvcmtUaW1lcih3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciByZXNvbHZlZFByb3BzID0gcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIHByb3BzKTtcbiAgdmFyIGNoaWxkID0gdm9pZCAwO1xuICBzd2l0Y2ggKHJlc29sdmVkVGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgY2hpbGQgPSB1cGRhdGVDbGFzc0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHtcbiAgICAgICAgY2hpbGQgPSB1cGRhdGVGb3J3YXJkUmVmKG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICB2YXIgb3V0ZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuICAgICAgICAgICAgaWYgKG91dGVyUHJvcFR5cGVzKSB7XG4gICAgICAgICAgICAgIGNoZWNrUHJvcFR5cGVzKG91dGVyUHJvcFR5cGVzLCByZXNvbHZlZFByb3BzLCAvLyBSZXNvbHZlZCBmb3Igb3V0ZXIgb25seVxuICAgICAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50KSwgZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNoaWxkID0gdXBkYXRlTWVtb0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudC50eXBlLCByZXNvbHZlZFByb3BzKSwgLy8gVGhlIGlubmVyIHR5cGUgY2FuIGhhdmUgZGVmYXVsdHMgdG9vXG4gICAgICAgIHVwZGF0ZUV4cGlyYXRpb25UaW1lLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHZhciBoaW50ID0gJyc7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoQ29tcG9uZW50ICE9PSBudWxsICYmIHR5cGVvZiBDb21wb25lbnQgPT09ICdvYmplY3QnICYmIENvbXBvbmVudC4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICBoaW50ID0gJyBEaWQgeW91IHdyYXAgYSBjb21wb25lbnQgaW4gUmVhY3QubGF6eSgpIG1vcmUgdGhhbiBvbmNlPyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFRoaXMgbWVzc2FnZSBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgbWVudGlvbiBGb3J3YXJkUmVmIG9yIE1lbW9Db21wb25lbnRcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgZmFjdCB0aGF0IGl0J3MgYSBzZXBhcmF0ZSB0eXBlIG9mIHdvcmsgaXMgYW5cbiAgICAgICAgLy8gaW1wbGVtZW50YXRpb24gZGV0YWlsLlxuICAgICAgICBpbnZhcmlhbnQoZmFsc2UsICdFbGVtZW50IHR5cGUgaXMgaW52YWxpZC4gUmVjZWl2ZWQgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG86ICVzLiBMYXp5IGVsZW1lbnQgdHlwZSBtdXN0IHJlc29sdmUgdG8gYSBjbGFzcyBvciBmdW5jdGlvbi4lcycsIENvbXBvbmVudCwgaGludCk7XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkO1xufVxuXG5mdW5jdGlvbiBtb3VudEluY29tcGxldGVDbGFzc0NvbXBvbmVudChfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICBpZiAoX2N1cnJlbnQgIT09IG51bGwpIHtcbiAgICAvLyBBbiBpbmNvbXBsZXRlIGNvbXBvbmVudCBvbmx5IG1vdW50cyBpZiBpdCBzdXNwZW5kZWQgaW5zaWRlIGEgbm9uLVxuICAgIC8vIGNvbmN1cnJlbnQgdHJlZSwgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBXZSB3YW50IHRvIHRyZWF0IGl0IGxpa2VcbiAgICAvLyBhIG5ldyBtb3VudCwgZXZlbiB0aG91Z2ggYW4gZW1wdHkgdmVyc2lvbiBvZiBpdCBhbHJlYWR5IGNvbW1pdHRlZC5cbiAgICAvLyBEaXNjb25uZWN0IHRoZSBhbHRlcm5hdGUgcG9pbnRlcnMuXG4gICAgX2N1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsO1xuICAgIC8vIFNpbmNlIHRoaXMgaXMgY29uY2VwdHVhbGx5IGEgbmV3IGZpYmVyLCBzY2hlZHVsZSBhIFBsYWNlbWVudCBlZmZlY3RcbiAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gUGxhY2VtZW50O1xuICB9XG5cbiAgLy8gUHJvbW90ZSB0aGUgZmliZXIgdG8gYSBjbGFzcyBhbmQgdHJ5IHJlbmRlcmluZyBhZ2Fpbi5cbiAgd29ya0luUHJvZ3Jlc3MudGFnID0gQ2xhc3NDb21wb25lbnQ7XG5cbiAgLy8gVGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBpcyBhIGZvcmsgb2YgYHVwZGF0ZUNsYXNzQ29tcG9uZW50YFxuXG4gIC8vIFB1c2ggY29udGV4dCBwcm92aWRlcnMgZWFybHkgdG8gcHJldmVudCBjb250ZXh0IHN0YWNrIG1pc21hdGNoZXMuXG4gIC8vIER1cmluZyBtb3VudGluZyB3ZSBkb24ndCBrbm93IHRoZSBjaGlsZCBjb250ZXh0IHlldCBhcyB0aGUgaW5zdGFuY2UgZG9lc24ndCBleGlzdC5cbiAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuICB2YXIgaGFzQ29udGV4dCA9IHZvaWQgMDtcbiAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgfSBlbHNlIHtcbiAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gIH1cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcblxuICBjb25zdHJ1Y3RDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG5cbiAgcmV0dXJuIGZpbmlzaENsYXNzQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHRydWUsIGhhc0NvbnRleHQsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbn1cblxuZnVuY3Rpb24gbW91bnRJbmRldGVybWluYXRlQ29tcG9uZW50KF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICBpZiAoX2N1cnJlbnQgIT09IG51bGwpIHtcbiAgICAvLyBBbiBpbmRldGVybWluYXRlIGNvbXBvbmVudCBvbmx5IG1vdW50cyBpZiBpdCBzdXNwZW5kZWQgaW5zaWRlIGEgbm9uLVxuICAgIC8vIGNvbmN1cnJlbnQgdHJlZSwgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBXZSB3YW50IHRvIHRyZWF0IGl0IGxpa2VcbiAgICAvLyBhIG5ldyBtb3VudCwgZXZlbiB0aG91Z2ggYW4gZW1wdHkgdmVyc2lvbiBvZiBpdCBhbHJlYWR5IGNvbW1pdHRlZC5cbiAgICAvLyBEaXNjb25uZWN0IHRoZSBhbHRlcm5hdGUgcG9pbnRlcnMuXG4gICAgX2N1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsO1xuICAgIC8vIFNpbmNlIHRoaXMgaXMgY29uY2VwdHVhbGx5IGEgbmV3IGZpYmVyLCBzY2hlZHVsZSBhIFBsYWNlbWVudCBlZmZlY3RcbiAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gUGxhY2VtZW50O1xuICB9XG5cbiAgdmFyIHByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIGZhbHNlKTtcbiAgdmFyIGNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG5cbiAgdmFyIHZhbHVlID0gdm9pZCAwO1xuXG4gIHtcbiAgICBpZiAoQ29tcG9uZW50LnByb3RvdHlwZSAmJiB0eXBlb2YgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRCYWRDbGFzc1tjb21wb25lbnROYW1lXSkge1xuICAgICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsIFwiVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBoYXZlIGEgcmVuZGVyIG1ldGhvZCwgYnV0IGRvZXNuJ3QgZXh0ZW5kIFJlYWN0LkNvbXBvbmVudC4gXCIgKyAnVGhpcyBpcyBsaWtlbHkgdG8gY2F1c2UgZXJyb3JzLiBDaGFuZ2UgJXMgdG8gZXh0ZW5kIFJlYWN0LkNvbXBvbmVudCBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICBkaWRXYXJuQWJvdXRCYWRDbGFzc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZyh3b3JrSW5Qcm9ncmVzcywgbnVsbCk7XG4gICAgfVxuXG4gICAgUmVhY3RDdXJyZW50T3duZXIkMy5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgdmFsdWUgPSByZW5kZXJXaXRoSG9va3MobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIGNvbnRleHQsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgfVxuICAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG4gIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBQZXJmb3JtZWRXb3JrO1xuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZS5yZW5kZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUuJCR0eXBlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIFByb2NlZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzIGEgY2xhc3MgaW5zdGFuY2VcbiAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDtcblxuICAgIC8vIFRocm93IG91dCBhbnkgaG9va3MgdGhhdCB3ZXJlIHVzZWQuXG4gICAgcmVzZXRIb29rcygpO1xuXG4gICAgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gICAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuICAgIHZhciBoYXNDb250ZXh0ID0gZmFsc2U7XG4gICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgICAgcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gdmFsdWUuc3RhdGUgIT09IG51bGwgJiYgdmFsdWUuc3RhdGUgIT09IHVuZGVmaW5lZCA/IHZhbHVlLnN0YXRlIDogbnVsbDtcblxuICAgIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIHByb3BzKTtcbiAgICB9XG5cbiAgICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHZhbHVlKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICB9IGVsc2Uge1xuICAgIC8vIFByb2NlZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzIGEgZnVuY3Rpb24gY29tcG9uZW50XG4gICAgd29ya0luUHJvZ3Jlc3MudGFnID0gRnVuY3Rpb25Db21wb25lbnQ7XG4gICAge1xuICAgICAgaWYgKGRlYnVnUmVuZGVyUGhhc2VTaWRlRWZmZWN0cyB8fCBkZWJ1Z1JlbmRlclBoYXNlU2lkZUVmZmVjdHNGb3JTdHJpY3RNb2RlICYmIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICAgIC8vIE9ubHkgZG91YmxlLXJlbmRlciBjb21wb25lbnRzIHdpdGggSG9va3NcbiAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YWx1ZSA9IHJlbmRlcldpdGhIb29rcyhudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgY29udGV4dCwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJlY29uY2lsZUNoaWxkcmVuKG51bGwsIHdvcmtJblByb2dyZXNzLCB2YWx1ZSwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIHtcbiAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KSB7XG4gIGlmIChDb21wb25lbnQpIHtcbiAgICAhIUNvbXBvbmVudC5jaGlsZENvbnRleHRUeXBlcyA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzKC4uLik6IGNoaWxkQ29udGV4dFR5cGVzIGNhbm5vdCBiZSBkZWZpbmVkIG9uIGEgZnVuY3Rpb24gY29tcG9uZW50LicsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JykgOiB2b2lkIDA7XG4gIH1cbiAgaWYgKHdvcmtJblByb2dyZXNzLnJlZiAhPT0gbnVsbCkge1xuICAgIHZhciBpbmZvID0gJyc7XG4gICAgdmFyIG93bmVyTmFtZSA9IGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCk7XG4gICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgaW5mbyArPSAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBvd25lck5hbWUgKyAnYC4nO1xuICAgIH1cblxuICAgIHZhciB3YXJuaW5nS2V5ID0gb3duZXJOYW1lIHx8IHdvcmtJblByb2dyZXNzLl9kZWJ1Z0lEIHx8ICcnO1xuICAgIHZhciBkZWJ1Z1NvdXJjZSA9IHdvcmtJblByb2dyZXNzLl9kZWJ1Z1NvdXJjZTtcbiAgICBpZiAoZGVidWdTb3VyY2UpIHtcbiAgICAgIHdhcm5pbmdLZXkgPSBkZWJ1Z1NvdXJjZS5maWxlTmFtZSArICc6JyArIGRlYnVnU291cmNlLmxpbmVOdW1iZXI7XG4gICAgfVxuICAgIGlmICghZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzW3dhcm5pbmdLZXldKSB7XG4gICAgICBkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnNbd2FybmluZ0tleV0gPSB0cnVlO1xuICAgICAgd2FybmluZyQxKGZhbHNlLCAnRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgYmUgZ2l2ZW4gcmVmcy4gJyArICdBdHRlbXB0cyB0byBhY2Nlc3MgdGhpcyByZWYgd2lsbCBmYWlsLiAnICsgJ0RpZCB5b3UgbWVhbiB0byB1c2UgUmVhY3QuZm9yd2FyZFJlZigpPyVzJywgaW5mbyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgaWYgKCFkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50W2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICclczogRnVuY3Rpb24gY29tcG9uZW50cyBkbyBub3Qgc3VwcG9ydCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuJywgY29tcG9uZW50TmFtZSk7XG4gICAgICBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50W2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIENvbXBvbmVudC5jb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LmNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgdmFyIF9jb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgIGlmICghZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50W19jb21wb25lbnROYW1lXSkge1xuICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgY29udGV4dFR5cGUuJywgX2NvbXBvbmVudE5hbWUpO1xuICAgICAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50W19jb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgLy8gV2Ugc2hvdWxkIGF0dGVtcHQgdG8gcmVuZGVyIHRoZSBwcmltYXJ5IGNoaWxkcmVuIHVubGVzcyB0aGlzIGJvdW5kYXJ5XG4gIC8vIGFscmVhZHkgc3VzcGVuZGVkIGR1cmluZyB0aGlzIHJlbmRlciAoYGFscmVhZHlDYXB0dXJlZGAgaXMgdHJ1ZSkuXG4gIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIHZhciBuZXh0RGlkVGltZW91dCA9IHZvaWQgMDtcbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgJiBEaWRDYXB0dXJlKSA9PT0gTm9FZmZlY3QpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBhdHRlbXB0LlxuICAgIG5leHRTdGF0ZSA9IG51bGw7XG4gICAgbmV4dERpZFRpbWVvdXQgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBTb21ldGhpbmcgaW4gdGhpcyBib3VuZGFyeSdzIHN1YnRyZWUgYWxyZWFkeSBzdXNwZW5kZWQuIFN3aXRjaCB0b1xuICAgIC8vIHJlbmRlcmluZyB0aGUgZmFsbGJhY2sgY2hpbGRyZW4uXG4gICAgbmV4dFN0YXRlID0ge1xuICAgICAgdGltZWRPdXRBdDogbmV4dFN0YXRlICE9PSBudWxsID8gbmV4dFN0YXRlLnRpbWVkT3V0QXQgOiBOb1dvcmtcbiAgICB9O1xuICAgIG5leHREaWRUaW1lb3V0ID0gdHJ1ZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgJj0gfkRpZENhcHR1cmU7XG4gIH1cblxuICAvLyBUaGlzIG5leHQgcGFydCBpcyBhIGJpdCBjb25mdXNpbmcuIElmIHRoZSBjaGlsZHJlbiB0aW1lb3V0LCB3ZSBzd2l0Y2ggdG9cbiAgLy8gc2hvd2luZyB0aGUgZmFsbGJhY2sgY2hpbGRyZW4gaW4gcGxhY2Ugb2YgdGhlIFwicHJpbWFyeVwiIGNoaWxkcmVuLlxuICAvLyBIb3dldmVyLCB3ZSBkb24ndCB3YW50IHRvIGRlbGV0ZSB0aGUgcHJpbWFyeSBjaGlsZHJlbiBiZWNhdXNlIHRoZW4gdGhlaXJcbiAgLy8gc3RhdGUgd2lsbCBiZSBsb3N0IChib3RoIHRoZSBSZWFjdCBzdGF0ZSBhbmQgdGhlIGhvc3Qgc3RhdGUsIGUuZy5cbiAgLy8gdW5jb250cm9sbGVkIGZvcm0gaW5wdXRzKS4gSW5zdGVhZCB3ZSBrZWVwIHRoZW0gbW91bnRlZCBhbmQgaGlkZSB0aGVtLlxuICAvLyBCb3RoIHRoZSBmYWxsYmFjayBjaGlsZHJlbiBBTkQgdGhlIHByaW1hcnkgY2hpbGRyZW4gYXJlIHJlbmRlcmVkIGF0IHRoZVxuICAvLyBzYW1lIHRpbWUuIE9uY2UgdGhlIHByaW1hcnkgY2hpbGRyZW4gYXJlIHVuLXN1c3BlbmRlZCwgd2UgY2FuIGRlbGV0ZVxuICAvLyB0aGUgZmFsbGJhY2sgY2hpbGRyZW4g4oCUIGRvbid0IG5lZWQgdG8gcHJlc2VydmUgdGhlaXIgc3RhdGUuXG4gIC8vXG4gIC8vIFRoZSB0d28gc2V0cyBvZiBjaGlsZHJlbiBhcmUgc2libGluZ3MgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQsIGJ1dFxuICAvLyBzZW1hbnRpY2FsbHksIGZvciBwdXJwb3NlcyBvZiByZWNvbmNpbGlhdGlvbiwgdGhleSBhcmUgdHdvIHNlcGFyYXRlIHNldHMuXG4gIC8vIFNvIHdlIHN0b3JlIHRoZW0gdXNpbmcgdHdvIGZyYWdtZW50IGZpYmVycy5cbiAgLy9cbiAgLy8gSG93ZXZlciwgd2Ugd2FudCB0byBhdm9pZCBhbGxvY2F0aW5nIGV4dHJhIGZpYmVycyBmb3IgZXZlcnkgcGxhY2Vob2xkZXIuXG4gIC8vIFRoZXkncmUgb25seSBuZWNlc3Nhcnkgd2hlbiB0aGUgY2hpbGRyZW4gdGltZSBvdXQsIGJlY2F1c2UgdGhhdCdzIHRoZVxuICAvLyBvbmx5IHRpbWUgd2hlbiBib3RoIHNldHMgYXJlIG1vdW50ZWQuXG4gIC8vXG4gIC8vIFNvLCB0aGUgZXh0cmEgZnJhZ21lbnQgZmliZXJzIGFyZSBvbmx5IHVzZWQgaWYgdGhlIGNoaWxkcmVuIHRpbWUgb3V0LlxuICAvLyBPdGhlcndpc2UsIHdlIHJlbmRlciB0aGUgcHJpbWFyeSBjaGlsZHJlbiBkaXJlY3RseS4gVGhpcyByZXF1aXJlcyBzb21lXG4gIC8vIGN1c3RvbSByZWNvbmNpbGlhdGlvbiBsb2dpYyB0byBwcmVzZXJ2ZSB0aGUgc3RhdGUgb2YgdGhlIHByaW1hcnlcbiAgLy8gY2hpbGRyZW4uIEl0J3MgZXNzZW50aWFsbHkgYSB2ZXJ5IGJhc2ljIGZvcm0gb2YgcmUtcGFyZW50aW5nLlxuXG4gIC8vIGBjaGlsZGAgcG9pbnRzIHRvIHRoZSBjaGlsZCBmaWJlci4gSW4gdGhlIG5vcm1hbCBjYXNlLCB0aGlzIGlzIHRoZSBmaXJzdFxuICAvLyBmaWJlciBvZiB0aGUgcHJpbWFyeSBjaGlsZHJlbiBzZXQuIEluIHRoZSB0aW1lZC1vdXQgY2FzZSwgaXQncyBhXG4gIC8vIGEgZnJhZ21lbnQgZmliZXIgY29udGFpbmluZyB0aGUgcHJpbWFyeSBjaGlsZHJlbi5cbiAgdmFyIGNoaWxkID0gdm9pZCAwO1xuICAvLyBgbmV4dGAgcG9pbnRzIHRvIHRoZSBuZXh0IGZpYmVyIFJlYWN0IHNob3VsZCByZW5kZXIuIEluIHRoZSBub3JtYWwgY2FzZSxcbiAgLy8gaXQncyB0aGUgc2FtZSBhcyBgY2hpbGRgOiB0aGUgZmlyc3QgZmliZXIgb2YgdGhlIHByaW1hcnkgY2hpbGRyZW4gc2V0LlxuICAvLyBJbiB0aGUgdGltZWQtb3V0IGNhc2UsIGl0J3MgYSBmcmFnbWVudCBmaWJlciBjb250YWluaW5nIHRoZSAqZmFsbGJhY2sqXG4gIC8vIGNoaWxkcmVuIC0tIHdlIHNraXAgb3ZlciB0aGUgcHJpbWFyeSBjaGlsZHJlbiBlbnRpcmVseS5cbiAgdmFyIG5leHQgPSB2b2lkIDA7XG4gIGlmIChjdXJyZW50JCQxID09PSBudWxsKSB7XG4gICAgaWYgKGVuYWJsZVN1c3BlbnNlU2VydmVyUmVuZGVyZXIpIHtcbiAgICAgIC8vIElmIHdlJ3JlIGN1cnJlbnRseSBoeWRyYXRpbmcsIHRyeSB0byBoeWRyYXRlIHRoaXMgYm91bmRhcnkuXG4gICAgICAvLyBCdXQgb25seSBpZiB0aGlzIGhhcyBhIGZhbGxiYWNrLlxuICAgICAgaWYgKG5leHRQcm9wcy5mYWxsYmFjayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgLy8gVGhpcyBjb3VsZCd2ZSBjaGFuZ2VkIHRoZSB0YWcgaWYgdGhpcyB3YXMgYSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGNvbXBvbmVudC5cbiAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnRhZyA9PT0gRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZURlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyB0aGUgaW5pdGlhbCBtb3VudC4gVGhpcyBicmFuY2ggaXMgcHJldHR5IHNpbXBsZSBiZWNhdXNlIHRoZXJlJ3NcbiAgICAvLyBubyBwcmV2aW91cyBzdGF0ZSB0aGF0IG5lZWRzIHRvIGJlIHByZXNlcnZlZC5cbiAgICBpZiAobmV4dERpZFRpbWVvdXQpIHtcbiAgICAgIC8vIE1vdW50IHNlcGFyYXRlIGZyYWdtZW50cyBmb3IgcHJpbWFyeSBhbmQgZmFsbGJhY2sgY2hpbGRyZW4uXG4gICAgICB2YXIgbmV4dEZhbGxiYWNrQ2hpbGRyZW4gPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChudWxsLCBtb2RlLCBOb1dvcmssIG51bGwpO1xuXG4gICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vQ29udGV4dCkge1xuICAgICAgICAvLyBPdXRzaWRlIG9mIGNvbmN1cnJlbnQgbW9kZSwgd2UgY29tbWl0IHRoZSBlZmZlY3RzIGZyb20gdGhlXG4gICAgICAgIHZhciBwcm9ncmVzc2VkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICB2YXIgcHJvZ3Jlc3NlZFByaW1hcnlDaGlsZCA9IHByb2dyZXNzZWRTdGF0ZSAhPT0gbnVsbCA/IHdvcmtJblByb2dyZXNzLmNoaWxkLmNoaWxkIDogd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkID0gcHJvZ3Jlc3NlZFByaW1hcnlDaGlsZDtcbiAgICAgIH1cblxuICAgICAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KG5leHRGYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJFeHBpcmF0aW9uVGltZSwgbnVsbCk7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nID0gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICAgICAgY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgICAgIC8vIFNraXAgdGhlIHByaW1hcnkgY2hpbGRyZW4sIGFuZCBjb250aW51ZSB3b3JraW5nIG9uIHRoZVxuICAgICAgLy8gZmFsbGJhY2sgY2hpbGRyZW4uXG4gICAgICBuZXh0ID0gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICAgICAgY2hpbGQucmV0dXJuID0gbmV4dC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTW91bnQgdGhlIHByaW1hcnkgY2hpbGRyZW4gd2l0aG91dCBhbiBpbnRlcm1lZGlhdGUgZnJhZ21lbnQgZmliZXIuXG4gICAgICB2YXIgbmV4dFByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICAgIGNoaWxkID0gbmV4dCA9IG1vdW50Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRQcmltYXJ5Q2hpbGRyZW4sIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhbiB1cGRhdGUuIFRoaXMgYnJhbmNoIGlzIG1vcmUgY29tcGxpY2F0ZWQgYmVjYXVzZSB3ZSBuZWVkIHRvXG4gICAgLy8gZW5zdXJlIHRoZSBzdGF0ZSBvZiB0aGUgcHJpbWFyeSBjaGlsZHJlbiBpcyBwcmVzZXJ2ZWQuXG4gICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQkJDEubWVtb2l6ZWRTdGF0ZTtcbiAgICB2YXIgcHJldkRpZFRpbWVvdXQgPSBwcmV2U3RhdGUgIT09IG51bGw7XG4gICAgaWYgKHByZXZEaWRUaW1lb3V0KSB7XG4gICAgICAvLyBUaGUgY3VycmVudCB0cmVlIGFscmVhZHkgdGltZWQgb3V0LiBUaGF0IG1lYW5zIGVhY2ggY2hpbGQgc2V0IGlzXG4gICAgICB2YXIgY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50ID0gY3VycmVudCQkMS5jaGlsZDtcbiAgICAgIHZhciBjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmc7XG4gICAgICBpZiAobmV4dERpZFRpbWVvdXQpIHtcbiAgICAgICAgLy8gU3RpbGwgdGltZWQgb3V0LiBSZXVzZSB0aGUgY3VycmVudCBwcmltYXJ5IGNoaWxkcmVuIGJ5IGNsb25pbmdcbiAgICAgICAgLy8gaXRzIGZyYWdtZW50LiBXZSdyZSBnb2luZyB0byBza2lwIG92ZXIgdGhlc2UgZW50aXJlbHkuXG4gICAgICAgIHZhciBfbmV4dEZhbGxiYWNrQ2hpbGRyZW4gPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQsIGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5wZW5kaW5nUHJvcHMsIE5vV29yayk7XG5cbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb0NvbnRleHQpIHtcbiAgICAgICAgICAvLyBPdXRzaWRlIG9mIGNvbmN1cnJlbnQgbW9kZSwgd2UgY29tbWl0IHRoZSBlZmZlY3RzIGZyb20gdGhlXG4gICAgICAgICAgdmFyIF9wcm9ncmVzc2VkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBfcHJvZ3Jlc3NlZFByaW1hcnlDaGlsZCA9IF9wcm9ncmVzc2VkU3RhdGUgIT09IG51bGwgPyB3b3JrSW5Qcm9ncmVzcy5jaGlsZC5jaGlsZCA6IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgIGlmIChfcHJvZ3Jlc3NlZFByaW1hcnlDaGlsZCAhPT0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkKSB7XG4gICAgICAgICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQuY2hpbGQgPSBfcHJvZ3Jlc3NlZFByaW1hcnlDaGlsZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZWNhdXNlIHByaW1hcnlDaGlsZEZyYWdtZW50IGlzIGEgbmV3IGZpYmVyIHRoYXQgd2UncmUgaW5zZXJ0aW5nIGFzIHRoZVxuICAgICAgICAvLyBwYXJlbnQgb2YgYSBuZXcgdHJlZSwgd2UgbmVlZCB0byBzZXQgaXRzIHRyZWVCYXNlRHVyYXRpb24uXG4gICAgICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyICYmIHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIC8vIHRyZWVCYXNlRHVyYXRpb24gaXMgdGhlIHN1bSBvZiBhbGwgdGhlIGNoaWxkIHRyZWUgYmFzZSBkdXJhdGlvbnMuXG4gICAgICAgICAgdmFyIHRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICAgICAgICAgIHZhciBoaWRkZW5DaGlsZCA9IF9wcmltYXJ5Q2hpbGRGcmFnbWVudC5jaGlsZDtcbiAgICAgICAgICB3aGlsZSAoaGlkZGVuQ2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRyZWVCYXNlRHVyYXRpb24gKz0gaGlkZGVuQ2hpbGQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgICAgIGhpZGRlbkNoaWxkID0gaGlkZGVuQ2hpbGQuc2libGluZztcbiAgICAgICAgICB9XG4gICAgICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb24gPSB0cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xvbmUgdGhlIGZhbGxiYWNrIGNoaWxkIGZyYWdtZW50LCB0b28uIFRoZXNlIHdlJ2xsIGNvbnRpbnVlXG4gICAgICAgIC8vIHdvcmtpbmcgb24uXG4gICAgICAgIHZhciBfZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gX3ByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50LCBfbmV4dEZhbGxiYWNrQ2hpbGRyZW4sIGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQuZXhwaXJhdGlvblRpbWUpO1xuICAgICAgICBjaGlsZCA9IF9wcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkRXhwaXJhdGlvblRpbWUgPSBOb1dvcms7XG4gICAgICAgIC8vIFNraXAgdGhlIHByaW1hcnkgY2hpbGRyZW4sIGFuZCBjb250aW51ZSB3b3JraW5nIG9uIHRoZVxuICAgICAgICAvLyBmYWxsYmFjayBjaGlsZHJlbi5cbiAgICAgICAgbmV4dCA9IF9mYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gICAgICAgIGNoaWxkLnJldHVybiA9IG5leHQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBObyBsb25nZXIgc3VzcGVuZGVkLiBTd2l0Y2ggYmFjayB0byBzaG93aW5nIHRoZSBwcmltYXJ5IGNoaWxkcmVuLFxuICAgICAgICAvLyBhbmQgcmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGUgZnJhZ21lbnQgZmliZXIuXG4gICAgICAgIHZhciBfbmV4dFByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICAgICAgdmFyIGN1cnJlbnRQcmltYXJ5Q2hpbGQgPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuY2hpbGQ7XG4gICAgICAgIHZhciBwcmltYXJ5Q2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudFByaW1hcnlDaGlsZCwgX25leHRQcmltYXJ5Q2hpbGRyZW4sIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcblxuICAgICAgICAvLyBJZiB0aGlzIHJlbmRlciBkb2Vzbid0IHN1c3BlbmQsIHdlIG5lZWQgdG8gZGVsZXRlIHRoZSBmYWxsYmFja1xuICAgICAgICAvLyBjaGlsZHJlbi4gV2FpdCB1bnRpbCB0aGUgY29tcGxldGUgcGhhc2UsIGFmdGVyIHdlJ3ZlIGNvbmZpcm1lZCB0aGVcbiAgICAgICAgLy8gZmFsbGJhY2sgaXMgbm8gbG9uZ2VyIG5lZWRlZC5cbiAgICAgICAgLy8gVE9ETzogV291bGQgaXQgYmUgYmV0dGVyIHRvIHN0b3JlIHRoZSBmYWxsYmFjayBmcmFnbWVudCBvblxuICAgICAgICAvLyB0aGUgc3RhdGVOb2RlP1xuXG4gICAgICAgIC8vIENvbnRpbnVlIHJlbmRlcmluZyB0aGUgY2hpbGRyZW4sIGxpa2Ugd2Ugbm9ybWFsbHkgZG8uXG4gICAgICAgIGNoaWxkID0gbmV4dCA9IHByaW1hcnlDaGlsZDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIGN1cnJlbnQgdHJlZSBoYXMgbm90IGFscmVhZHkgdGltZWQgb3V0LiBUaGF0IG1lYW5zIHRoZSBwcmltYXJ5XG4gICAgICAvLyBjaGlsZHJlbiBhcmUgbm90IHdyYXBwZWQgaW4gYSBmcmFnbWVudCBmaWJlci5cbiAgICAgIHZhciBfY3VycmVudFByaW1hcnlDaGlsZCA9IGN1cnJlbnQkJDEuY2hpbGQ7XG4gICAgICBpZiAobmV4dERpZFRpbWVvdXQpIHtcbiAgICAgICAgLy8gVGltZWQgb3V0LiBXcmFwIHRoZSBjaGlsZHJlbiBpbiBhIGZyYWdtZW50IGZpYmVyIHRvIGtlZXAgdGhlbVxuICAgICAgICAvLyBzZXBhcmF0ZSBmcm9tIHRoZSBmYWxsYmFjayBjaGlsZHJlbi5cbiAgICAgICAgdmFyIF9uZXh0RmFsbGJhY2tDaGlsZHJlbjIgPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoXG4gICAgICAgIC8vIEl0IHNob3VsZG4ndCBtYXR0ZXIgd2hhdCB0aGUgcGVuZGluZyBwcm9wcyBhcmUgYmVjYXVzZSB3ZSBhcmVuJ3RcbiAgICAgICAgLy8gZ29pbmcgdG8gcmVuZGVyIHRoaXMgZnJhZ21lbnQuXG4gICAgICAgIG51bGwsIG1vZGUsIE5vV29yaywgbnVsbCk7XG4gICAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDIuY2hpbGQgPSBfY3VycmVudFByaW1hcnlDaGlsZDtcblxuICAgICAgICAvLyBFdmVuIHRob3VnaCB3ZSdyZSBjcmVhdGluZyBhIG5ldyBmaWJlciwgdGhlcmUgYXJlIG5vIG5ldyBjaGlsZHJlbixcbiAgICAgICAgLy8gYmVjYXVzZSB3ZSdyZSByZXVzaW5nIGFuIGFscmVhZHkgbW91bnRlZCB0cmVlLiBTbyB3ZSBkb24ndCBuZWVkIHRvXG4gICAgICAgIC8vIHNjaGVkdWxlIGEgcGxhY2VtZW50LlxuICAgICAgICAvLyBwcmltYXJ5Q2hpbGRGcmFnbWVudC5lZmZlY3RUYWcgfD0gUGxhY2VtZW50O1xuXG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICAgICAgLy8gT3V0c2lkZSBvZiBjb25jdXJyZW50IG1vZGUsIHdlIGNvbW1pdCB0aGUgZWZmZWN0cyBmcm9tIHRoZVxuICAgICAgICAgIHZhciBfcHJvZ3Jlc3NlZFN0YXRlMiA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIF9wcm9ncmVzc2VkUHJpbWFyeUNoaWxkMiA9IF9wcm9ncmVzc2VkU3RhdGUyICE9PSBudWxsID8gd29ya0luUHJvZ3Jlc3MuY2hpbGQuY2hpbGQgOiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyLmNoaWxkID0gX3Byb2dyZXNzZWRQcmltYXJ5Q2hpbGQyO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmVjYXVzZSBwcmltYXJ5Q2hpbGRGcmFnbWVudCBpcyBhIG5ldyBmaWJlciB0aGF0IHdlJ3JlIGluc2VydGluZyBhcyB0aGVcbiAgICAgICAgLy8gcGFyZW50IG9mIGEgbmV3IHRyZWUsIHdlIG5lZWQgdG8gc2V0IGl0cyB0cmVlQmFzZUR1cmF0aW9uLlxuICAgICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lciAmJiB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAvLyB0cmVlQmFzZUR1cmF0aW9uIGlzIHRoZSBzdW0gb2YgYWxsIHRoZSBjaGlsZCB0cmVlIGJhc2UgZHVyYXRpb25zLlxuICAgICAgICAgIHZhciBfdHJlZUJhc2VEdXJhdGlvbiA9IDA7XG4gICAgICAgICAgdmFyIF9oaWRkZW5DaGlsZCA9IF9wcmltYXJ5Q2hpbGRGcmFnbWVudDIuY2hpbGQ7XG4gICAgICAgICAgd2hpbGUgKF9oaWRkZW5DaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgX3RyZWVCYXNlRHVyYXRpb24gKz0gX2hpZGRlbkNoaWxkLnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgICAgICBfaGlkZGVuQ2hpbGQgPSBfaGlkZGVuQ2hpbGQuc2libGluZztcbiAgICAgICAgICB9XG4gICAgICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50Mi50cmVlQmFzZUR1cmF0aW9uID0gX3RyZWVCYXNlRHVyYXRpb247XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgYSBmcmFnbWVudCBmcm9tIHRoZSBmYWxsYmFjayBjaGlsZHJlbiwgdG9vLlxuICAgICAgICB2YXIgX2ZhbGxiYWNrQ2hpbGRGcmFnbWVudDIgPSBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyLnNpYmxpbmcgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChfbmV4dEZhbGxiYWNrQ2hpbGRyZW4yLCBtb2RlLCByZW5kZXJFeHBpcmF0aW9uVGltZSwgbnVsbCk7XG4gICAgICAgIF9mYWxsYmFja0NoaWxkRnJhZ21lbnQyLmVmZmVjdFRhZyB8PSBQbGFjZW1lbnQ7XG4gICAgICAgIGNoaWxkID0gX3ByaW1hcnlDaGlsZEZyYWdtZW50MjtcbiAgICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50Mi5jaGlsZEV4cGlyYXRpb25UaW1lID0gTm9Xb3JrO1xuICAgICAgICAvLyBTa2lwIHRoZSBwcmltYXJ5IGNoaWxkcmVuLCBhbmQgY29udGludWUgd29ya2luZyBvbiB0aGVcbiAgICAgICAgLy8gZmFsbGJhY2sgY2hpbGRyZW4uXG4gICAgICAgIG5leHQgPSBfZmFsbGJhY2tDaGlsZEZyYWdtZW50MjtcbiAgICAgICAgY2hpbGQucmV0dXJuID0gbmV4dC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFN0aWxsIGhhdmVuJ3QgdGltZWQgb3V0LiAgQ29udGludWUgcmVuZGVyaW5nIHRoZSBjaGlsZHJlbiwgbGlrZSB3ZVxuICAgICAgICAvLyBub3JtYWxseSBkby5cbiAgICAgICAgdmFyIF9uZXh0UHJpbWFyeUNoaWxkcmVuMiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICAgICAgbmV4dCA9IGNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIF9jdXJyZW50UHJpbWFyeUNoaWxkLCBfbmV4dFByaW1hcnlDaGlsZHJlbjIsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3VycmVudCQkMS5zdGF0ZU5vZGU7XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV4dFN0YXRlO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGNoaWxkO1xuICByZXR1cm4gbmV4dDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICBpZiAoY3VycmVudCQkMSA9PT0gbnVsbCkge1xuICAgIC8vIER1cmluZyB0aGUgZmlyc3QgcGFzcywgd2UnbGwgYmFpbCBvdXQgYW5kIG5vdCBkcmlsbCBpbnRvIHRoZSBjaGlsZHJlbi5cbiAgICAvLyBJbnN0ZWFkLCB3ZSdsbCBsZWF2ZSB0aGUgY29udGVudCBpbiBwbGFjZSBhbmQgdHJ5IHRvIGh5ZHJhdGUgaXQgbGF0ZXIuXG4gICAgd29ya0luUHJvZ3Jlc3MuZXhwaXJhdGlvblRpbWUgPSBOZXZlcjtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBXZSB1c2UgY2hpbGRFeHBpcmF0aW9uVGltZSB0byBpbmRpY2F0ZSB0aGF0IGEgY2hpbGQgbWlnaHQgZGVwZW5kIG9uIGNvbnRleHQsIHNvIGlmXG4gIC8vIGFueSBjb250ZXh0IGhhcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHRyZWF0IGlzIGFzIGlmIHRoZSBpbnB1dCBtaWdodCBoYXZlIGNoYW5nZWQuXG4gIHZhciBoYXNDb250ZXh0Q2hhbmdlZCQkMSA9IGN1cnJlbnQkJDEuY2hpbGRFeHBpcmF0aW9uVGltZSA+PSByZW5kZXJFeHBpcmF0aW9uVGltZTtcbiAgaWYgKGRpZFJlY2VpdmVVcGRhdGUgfHwgaGFzQ29udGV4dENoYW5nZWQkJDEpIHtcbiAgICAvLyBUaGlzIGJvdW5kYXJ5IGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBmaXJzdCByZW5kZXIuIFRoaXMgbWVhbnMgdGhhdCB3ZSBhcmUgbm93IHVuYWJsZSB0b1xuICAgIC8vIGh5ZHJhdGUgaXQuIFdlIG1pZ2h0IHN0aWxsIGJlIGFibGUgdG8gaHlkcmF0ZSBpdCB1c2luZyBhbiBlYXJsaWVyIGV4cGlyYXRpb24gdGltZSBidXRcbiAgICAvLyBkdXJpbmcgdGhpcyByZW5kZXIgd2UgY2FuJ3QuIEluc3RlYWQsIHdlJ3JlIGdvaW5nIHRvIGRlbGV0ZSB0aGUgd2hvbGUgc3VidHJlZSBhbmRcbiAgICAvLyBpbnN0ZWFkIGluamVjdCBhIG5ldyByZWFsIFN1c3BlbnNlIGJvdW5kYXJ5IHRvIHRha2UgaXRzIHBsYWNlLCB3aGljaCBtYXkgcmVuZGVyIGNvbnRlbnRcbiAgICAvLyBvciBmYWxsYmFjay4gVGhlIHJlYWwgU3VzcGVuc2UgYm91bmRhcnkgd2lsbCBzdXNwZW5kIGZvciBhIHdoaWxlIHNvIHdlIGhhdmUgc29tZSB0aW1lXG4gICAgLy8gdG8gZW5zdXJlIGl0IGNhbiBwcm9kdWNlIHJlYWwgY29udGVudCwgYnV0IGFsbCBzdGF0ZSBhbmQgcGVuZGluZyBldmVudHMgd2lsbCBiZSBsb3N0LlxuXG4gICAgLy8gRGV0YWNoIGZyb20gdGhlIGN1cnJlbnQgZGVoeWRyYXRlZCBib3VuZGFyeS5cbiAgICBjdXJyZW50JCQxLmFsdGVybmF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDtcblxuICAgIC8vIEluc2VydCBhIGRlbGV0aW9uIGluIHRoZSBlZmZlY3QgbGlzdC5cbiAgICB2YXIgcmV0dXJuRmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gICAgIShyZXR1cm5GaWJlciAhPT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICdTdXNwZW5zZSBib3VuZGFyaWVzIGFyZSBuZXZlciBvbiB0aGUgcm9vdC4gVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiBSZWFjdC4nKSA6IHZvaWQgMDtcbiAgICB2YXIgbGFzdCA9IHJldHVybkZpYmVyLmxhc3RFZmZlY3Q7XG4gICAgaWYgKGxhc3QgIT09IG51bGwpIHtcbiAgICAgIGxhc3QubmV4dEVmZmVjdCA9IGN1cnJlbnQkJDE7XG4gICAgICByZXR1cm5GaWJlci5sYXN0RWZmZWN0ID0gY3VycmVudCQkMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuRmliZXIuZmlyc3RFZmZlY3QgPSByZXR1cm5GaWJlci5sYXN0RWZmZWN0ID0gY3VycmVudCQkMTtcbiAgICB9XG4gICAgY3VycmVudCQkMS5uZXh0RWZmZWN0ID0gbnVsbDtcbiAgICBjdXJyZW50JCQxLmVmZmVjdFRhZyA9IERlbGV0aW9uO1xuXG4gICAgLy8gVXBncmFkZSB0aGlzIHdvcmsgaW4gcHJvZ3Jlc3MgdG8gYSByZWFsIFN1c3BlbnNlIGNvbXBvbmVudC5cbiAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBTdXNwZW5zZUNvbXBvbmVudDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIC8vIFRoaXMgaXMgbm93IGFuIGluc2VydGlvbi5cbiAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gUGxhY2VtZW50O1xuICAgIC8vIFJldHJ5IGFzIGEgcmVhbCBTdXNwZW5zZSBjb21wb25lbnQuXG4gICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIH1cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgJiBEaWRDYXB0dXJlKSA9PT0gTm9FZmZlY3QpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBhdHRlbXB0LlxuICAgIHJlZW50ZXJIeWRyYXRpb25TdGF0ZUZyb21EZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbW91bnRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB9IGVsc2Uge1xuICAgIC8vIFNvbWV0aGluZyBzdXNwZW5kZWQuIExlYXZlIHRoZSBleGlzdGluZyBjaGlsZHJlbiBpbiBwbGFjZS5cbiAgICAvLyBUT0RPOiBJbiBub24tY29uY3VycmVudCBtb2RlLCBzaG91bGQgd2UgY29tbWl0IHRoZSBub2RlcyB3ZSBoYXZlIGh5ZHJhdGVkIHNvIGZhcj9cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlUG9ydGFsQ29tcG9uZW50KGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICBpZiAoY3VycmVudCQkMSA9PT0gbnVsbCkge1xuICAgIC8vIFBvcnRhbHMgYXJlIHNwZWNpYWwgYmVjYXVzZSB3ZSBkb24ndCBhcHBlbmQgdGhlIGNoaWxkcmVuIGR1cmluZyBtb3VudFxuICAgIC8vIGJ1dCBhdCBjb21taXQuIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIHRyYWNrIGluc2VydGlvbnMgd2hpY2ggdGhlIG5vcm1hbFxuICAgIC8vIGZsb3cgZG9lc24ndCBkbyBkdXJpbmcgbW91bnQuIFRoaXMgZG9lc24ndCBoYXBwZW4gYXQgdGhlIHJvb3QgYmVjYXVzZVxuICAgIC8vIHRoZSByb290IGFsd2F5cyBzdGFydHMgd2l0aCBhIFwiY3VycmVudFwiIHdpdGggYSBudWxsIGNoaWxkLlxuICAgIC8vIFRPRE86IENvbnNpZGVyIHVuaWZ5aW5nIHRoaXMgd2l0aCBob3cgdGhlIHJvb3Qgd29ya3MuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIH0gZWxzZSB7XG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICB9XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ29udGV4dFByb3ZpZGVyKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICB2YXIgcHJvdmlkZXJUeXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgdmFyIGNvbnRleHQgPSBwcm92aWRlclR5cGUuX2NvbnRleHQ7XG5cbiAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuXG4gIHZhciBuZXdWYWx1ZSA9IG5ld1Byb3BzLnZhbHVlO1xuXG4gIHtcbiAgICB2YXIgcHJvdmlkZXJQcm9wVHlwZXMgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLnByb3BUeXBlcztcblxuICAgIGlmIChwcm92aWRlclByb3BUeXBlcykge1xuICAgICAgY2hlY2tQcm9wVHlwZXMocHJvdmlkZXJQcm9wVHlwZXMsIG5ld1Byb3BzLCAncHJvcCcsICdDb250ZXh0LlByb3ZpZGVyJywgZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldik7XG4gICAgfVxuICB9XG5cbiAgcHVzaFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBuZXdWYWx1ZSk7XG5cbiAgaWYgKG9sZFByb3BzICE9PSBudWxsKSB7XG4gICAgdmFyIG9sZFZhbHVlID0gb2xkUHJvcHMudmFsdWU7XG4gICAgdmFyIGNoYW5nZWRCaXRzID0gY2FsY3VsYXRlQ2hhbmdlZEJpdHMoY29udGV4dCwgbmV3VmFsdWUsIG9sZFZhbHVlKTtcbiAgICBpZiAoY2hhbmdlZEJpdHMgPT09IDApIHtcbiAgICAgIC8vIE5vIGNoYW5nZS4gQmFpbG91dCBlYXJseSBpZiBjaGlsZHJlbiBhcmUgdGhlIHNhbWUuXG4gICAgICBpZiAob2xkUHJvcHMuY2hpbGRyZW4gPT09IG5ld1Byb3BzLmNoaWxkcmVuICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpKSB7XG4gICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBjb250ZXh0IHZhbHVlIGNoYW5nZWQuIFNlYXJjaCBmb3IgbWF0Y2hpbmcgY29uc3VtZXJzIGFuZCBzY2hlZHVsZVxuICAgICAgLy8gdGhlbSB0byB1cGRhdGUuXG4gICAgICBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCBjaGFuZ2VkQml0cywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBuZXdDaGlsZHJlbiA9IG5ld1Byb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG52YXIgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRleHRDb25zdW1lcihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAvLyBUaGUgbG9naWMgYmVsb3cgZm9yIENvbnRleHQgZGlmZmVycyBkZXBlbmRpbmcgb24gUFJPRCBvciBERVYgbW9kZS4gSW5cbiAgLy8gREVWIG1vZGUsIHdlIGNyZWF0ZSBhIHNlcGFyYXRlIG9iamVjdCBmb3IgQ29udGV4dC5Db25zdW1lciB0aGF0IGFjdHNcbiAgLy8gbGlrZSBhIHByb3h5IHRvIENvbnRleHQuIFRoaXMgcHJveHkgb2JqZWN0IGFkZHMgdW5uZWNlc3NhcnkgY29kZSBpbiBQUk9EXG4gIC8vIHNvIHdlIHVzZSB0aGUgb2xkIGJlaGF2aW91ciAoQ29udGV4dC5Db25zdW1lciByZWZlcmVuY2VzIENvbnRleHQpIHRvXG4gIC8vIHJlZHVjZSBzaXplIGFuZCBvdmVyaGVhZC4gVGhlIHNlcGFyYXRlIG9iamVjdCByZWZlcmVuY2VzIGNvbnRleHQgdmlhXG4gIC8vIGEgcHJvcGVydHkgY2FsbGVkIFwiX2NvbnRleHRcIiwgd2hpY2ggYWxzbyBnaXZlcyB1cyB0aGUgYWJpbGl0eSB0byBjaGVja1xuICAvLyBpbiBERVYgbW9kZSBpZiB0aGlzIHByb3BlcnR5IGV4aXN0cyBvciBub3QgYW5kIHdhcm4gaWYgaXQgZG9lcyBub3QuXG4gIHtcbiAgICBpZiAoY29udGV4dC5fY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBUaGlzIG1heSBiZSBiZWNhdXNlIGl0J3MgYSBDb250ZXh0IChyYXRoZXIgdGhhbiBhIENvbnN1bWVyKS5cbiAgICAgIC8vIE9yIGl0IG1heSBiZSBiZWNhdXNlIGl0J3Mgb2xkZXIgUmVhY3Qgd2hlcmUgdGhleSdyZSB0aGUgc2FtZSB0aGluZy5cbiAgICAgIC8vIFdlIG9ubHkgd2FudCB0byB3YXJuIGlmIHdlJ3JlIHN1cmUgaXQncyBhIG5ldyBSZWFjdC5cbiAgICAgIGlmIChjb250ZXh0ICE9PSBjb250ZXh0LkNvbnN1bWVyKSB7XG4gICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyKSB7XG4gICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyID0gdHJ1ZTtcbiAgICAgICAgICB3YXJuaW5nJDEoZmFsc2UsICdSZW5kZXJpbmcgPENvbnRleHQ+IGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byByZW5kZXIgPENvbnRleHQuQ29uc3VtZXI+IGluc3RlYWQ/Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dCA9IGNvbnRleHQuX2NvbnRleHQ7XG4gICAgfVxuICB9XG4gIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHJlbmRlciA9IG5ld1Byb3BzLmNoaWxkcmVuO1xuXG4gIHtcbiAgICAhKHR5cGVvZiByZW5kZXIgPT09ICdmdW5jdGlvbicpID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnQSBjb250ZXh0IGNvbnN1bWVyIHdhcyByZW5kZXJlZCB3aXRoIG11bHRpcGxlIGNoaWxkcmVuLCBvciBhIGNoaWxkICcgKyBcInRoYXQgaXNuJ3QgYSBmdW5jdGlvbi4gQSBjb250ZXh0IGNvbnN1bWVyIGV4cGVjdHMgYSBzaW5nbGUgY2hpbGQgXCIgKyAndGhhdCBpcyBhIGZ1bmN0aW9uLiBJZiB5b3UgZGlkIHBhc3MgYSBmdW5jdGlvbiwgbWFrZSBzdXJlIHRoZXJlICcgKyAnaXMgbm8gdHJhaWxpbmcgb3IgbGVhZGluZyB3aGl0ZXNwYWNlIGFyb3VuZCBpdC4nKSA6IHZvaWQgMDtcbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gIHZhciBuZXdWYWx1ZSA9IHJlYWRDb250ZXh0KGNvbnRleHQsIG5ld1Byb3BzLnVuc3RhYmxlX29ic2VydmVkQml0cyk7XG4gIHZhciBuZXdDaGlsZHJlbiA9IHZvaWQgMDtcbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDMuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldEN1cnJlbnRQaGFzZSgncmVuZGVyJyk7XG4gICAgbmV3Q2hpbGRyZW4gPSByZW5kZXIobmV3VmFsdWUpO1xuICAgIHNldEN1cnJlbnRQaGFzZShudWxsKTtcbiAgfVxuXG4gIC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cbiAgd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnIHw9IFBlcmZvcm1lZFdvcms7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCBuZXdDaGlsZHJlbiwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCkge1xuICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgY2FuY2VsV29ya1RpbWVyKHdvcmtJblByb2dyZXNzKTtcblxuICBpZiAoY3VycmVudCQkMSAhPT0gbnVsbCkge1xuICAgIC8vIFJldXNlIHByZXZpb3VzIGNvbnRleHQgbGlzdFxuICAgIHdvcmtJblByb2dyZXNzLmNvbnRleHREZXBlbmRlbmNpZXMgPSBjdXJyZW50JCQxLmNvbnRleHREZXBlbmRlbmNpZXM7XG4gIH1cblxuICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lcikge1xuICAgIC8vIERvbid0IHVwZGF0ZSBcImJhc2VcIiByZW5kZXIgdGltZXMgZm9yIGJhaWxvdXRzLlxuICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIHRoZSBjaGlsZHJlbiBoYXZlIGFueSBwZW5kaW5nIHdvcmsuXG4gIHZhciBjaGlsZEV4cGlyYXRpb25UaW1lID0gd29ya0luUHJvZ3Jlc3MuY2hpbGRFeHBpcmF0aW9uVGltZTtcbiAgaWYgKGNoaWxkRXhwaXJhdGlvblRpbWUgPCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAgIC8vIFRoZSBjaGlsZHJlbiBkb24ndCBoYXZlIGFueSB3b3JrIGVpdGhlci4gV2UgY2FuIHNraXAgdGhlbS5cbiAgICAvLyBUT0RPOiBPbmNlIHdlIGFkZCBiYWNrIHJlc3VtaW5nLCB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlIGNoaWxkcmVuIGFyZVxuICAgIC8vIGEgd29yay1pbi1wcm9ncmVzcyBzZXQuIElmIHNvLCB3ZSBuZWVkIHRvIHRyYW5zZmVyIHRoZWlyIGVmZmVjdHMuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBmaWJlciBkb2Vzbid0IGhhdmUgd29yaywgYnV0IGl0cyBzdWJ0cmVlIGRvZXMuIENsb25lIHRoZSBjaGlsZFxuICAgIC8vIGZpYmVycyBhbmQgY29udGludWUuXG4gICAgY2xvbmVDaGlsZEZpYmVycyhjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJlZ2luV29yayhjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgdmFyIHVwZGF0ZUV4cGlyYXRpb25UaW1lID0gd29ya0luUHJvZ3Jlc3MuZXhwaXJhdGlvblRpbWU7XG5cbiAgaWYgKGN1cnJlbnQkJDEgIT09IG51bGwpIHtcbiAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50JCQxLm1lbW9pemVkUHJvcHM7XG4gICAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgaWYgKG9sZFByb3BzICE9PSBuZXdQcm9wcyB8fCBoYXNDb250ZXh0Q2hhbmdlZCgpKSB7XG4gICAgICAvLyBJZiBwcm9wcyBvciBjb250ZXh0IGNoYW5nZWQsIG1hcmsgdGhlIGZpYmVyIGFzIGhhdmluZyBwZXJmb3JtZWQgd29yay5cbiAgICAgIC8vIFRoaXMgbWF5IGJlIHVuc2V0IGlmIHRoZSBwcm9wcyBhcmUgZGV0ZXJtaW5lZCB0byBiZSBlcXVhbCBsYXRlciAobWVtbykuXG4gICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHVwZGF0ZUV4cGlyYXRpb25UaW1lIDwgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbiAgICAgIC8vIFRoaXMgZmliZXIgZG9lcyBub3QgaGF2ZSBhbnkgcGVuZGluZyB3b3JrLiBCYWlsb3V0IHdpdGhvdXQgZW50ZXJpbmdcbiAgICAgIC8vIHRoZSBiZWdpbiBwaGFzZS4gVGhlcmUncyBzdGlsbCBzb21lIGJvb2trZWVwaW5nIHdlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZVxuICAgICAgLy8gaW4gdGhpcyBvcHRpbWl6ZWQgcGF0aCwgbW9zdGx5IHB1c2hpbmcgc3R1ZmYgb250byB0aGUgc3RhY2suXG4gICAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHB1c2hIb3N0Um9vdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIHB1c2hIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIENvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgICAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICAgIHB1c2hIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMudmFsdWU7XG4gICAgICAgICAgICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lcikge1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnIHw9IFVwZGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICAgIHZhciBkaWRUaW1lb3V0ID0gc3RhdGUgIT09IG51bGw7XG4gICAgICAgICAgICBpZiAoZGlkVGltZW91dCkge1xuICAgICAgICAgICAgICAvLyBJZiB0aGlzIGJvdW5kYXJ5IGlzIGN1cnJlbnRseSB0aW1lZCBvdXQsIHdlIG5lZWQgdG8gZGVjaWRlXG4gICAgICAgICAgICAgIC8vIHdoZXRoZXIgdG8gcmV0cnkgdGhlIHByaW1hcnkgY2hpbGRyZW4sIG9yIHRvIHNraXAgb3ZlciBpdCBhbmRcbiAgICAgICAgICAgICAgLy8gZ28gc3RyYWlnaHQgdG8gdGhlIGZhbGxiYWNrLiBDaGVjayB0aGUgcHJpb3JpdHkgb2YgdGhlIHByaW1hcnlcbiAgICAgICAgICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRFeHBpcmF0aW9uVGltZSA9IHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkRXhwaXJhdGlvblRpbWU7XG4gICAgICAgICAgICAgIGlmIChwcmltYXJ5Q2hpbGRFeHBpcmF0aW9uVGltZSAhPT0gTm9Xb3JrICYmIHByaW1hcnlDaGlsZEV4cGlyYXRpb25UaW1lID49IHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHByaW1hcnkgY2hpbGRyZW4gaGF2ZSBwZW5kaW5nIHdvcmsuIFVzZSB0aGUgbm9ybWFsIHBhdGhcbiAgICAgICAgICAgICAgICAvLyB0byBhdHRlbXB0IHRvIHJlbmRlciB0aGUgcHJpbWFyeSBjaGlsZHJlbiBhZ2Fpbi5cbiAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgcHJpbWFyeSBjaGlsZHJlbiBkbyBub3QgaGF2ZSBwZW5kaW5nIHdvcmsgd2l0aCBzdWZmaWNpZW50XG4gICAgICAgICAgICAgICAgLy8gcHJpb3JpdHkuIEJhaWxvdXQuXG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgLy8gVGhlIGZhbGxiYWNrIGNoaWxkcmVuIGhhdmUgcGVuZGluZyB3b3JrLiBTa2lwIG92ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBwcmltYXJ5IGNoaWxkcmVuIGFuZCB3b3JrIG9uIHRoZSBmYWxsYmFjay5cbiAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZC5zaWJsaW5nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBEZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKGVuYWJsZVN1c3BlbnNlU2VydmVyUmVuZGVyZXIpIHtcbiAgICAgICAgICAgICAgLy8gV2Uga25vdyB0aGF0IHRoaXMgY29tcG9uZW50IHdpbGwgc3VzcGVuZCBhZ2FpbiBiZWNhdXNlIGlmIGl0IGhhc1xuICAgICAgICAgICAgICAvLyBiZWVuIHVuc3VzcGVuZGVkIGl0IGhhcyBjb21taXR0ZWQgYXMgYSByZWd1bGFyIFN1c3BlbnNlIGNvbXBvbmVudC5cbiAgICAgICAgICAgICAgLy8gSWYgaXQgbmVlZHMgdG8gYmUgcmV0cmllZCwgaXQgc2hvdWxkIGhhdmUgd29yayBzY2hlZHVsZWQgb24gaXQuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG4gIH1cblxuICAvLyBCZWZvcmUgZW50ZXJpbmcgdGhlIGJlZ2luIHBoYXNlLCBjbGVhciB0aGUgZXhwaXJhdGlvbiB0aW1lLlxuICB3b3JrSW5Qcm9ncmVzcy5leHBpcmF0aW9uVGltZSA9IE5vV29yaztcblxuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGVsZW1lbnRUeXBlID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGU7XG4gICAgICAgIHJldHVybiBtb3VudEluZGV0ZXJtaW5hdGVDb21wb25lbnQoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIGVsZW1lbnRUeXBlLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICB9XG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX2VsZW1lbnRUeXBlID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGU7XG4gICAgICAgIHJldHVybiBtb3VudExhenlDb21wb25lbnQoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIF9lbGVtZW50VHlwZSwgdXBkYXRlRXhwaXJhdGlvblRpbWUsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICAgIH1cbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX0NvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciB1bnJlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gICAgICAgIHZhciByZXNvbHZlZFByb3BzID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IF9Db21wb25lbnQgPyB1bnJlc29sdmVkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKF9Db21wb25lbnQsIHVucmVzb2x2ZWRQcm9wcyk7XG4gICAgICAgIHJldHVybiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgX0NvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgICAgfVxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfQ29tcG9uZW50MiA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gX0NvbXBvbmVudDIgPyBfdW5yZXNvbHZlZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhfQ29tcG9uZW50MiwgX3VucmVzb2x2ZWRQcm9wcyk7XG4gICAgICAgIHJldHVybiB1cGRhdGVDbGFzc0NvbXBvbmVudChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgX0NvbXBvbmVudDIsIF9yZXNvbHZlZFByb3BzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICB9XG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0Um9vdChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0Q29tcG9uZW50KGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0VGV4dChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHJldHVybiB1cGRhdGVQb3J0YWxDb21wb25lbnQoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICB7XG4gICAgICAgIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIF91bnJlc29sdmVkUHJvcHMyID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMyID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IHR5cGUgPyBfdW5yZXNvbHZlZFByb3BzMiA6IHJlc29sdmVEZWZhdWx0UHJvcHModHlwZSwgX3VucmVzb2x2ZWRQcm9wczIpO1xuICAgICAgICByZXR1cm4gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgX3Jlc29sdmVkUHJvcHMyLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICB9XG4gICAgY2FzZSBGcmFnbWVudDpcbiAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIGNhc2UgTW9kZTpcbiAgICAgIHJldHVybiB1cGRhdGVNb2RlKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHJldHVybiB1cGRhdGVQcm9maWxlcihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgcmV0dXJuIHVwZGF0ZUNvbnRleHRQcm92aWRlcihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgICAgcmV0dXJuIHVwZGF0ZUNvbnRleHRDb25zdW1lcihjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF90eXBlMiA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzMyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICAgICAgLy8gUmVzb2x2ZSBvdXRlciBwcm9wcyBmaXJzdCwgdGhlbiByZXNvbHZlIGlubmVyIHByb3BzLlxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMzID0gcmVzb2x2ZURlZmF1bHRQcm9wcyhfdHlwZTIsIF91bnJlc29sdmVkUHJvcHMzKTtcbiAgICAgICAge1xuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgICAgICAgdmFyIG91dGVyUHJvcFR5cGVzID0gX3R5cGUyLnByb3BUeXBlcztcbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgX3Jlc29sdmVkUHJvcHMzLCAvLyBSZXNvbHZlZCBmb3Igb3V0ZXIgb25seVxuICAgICAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoX3R5cGUyKSwgZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9yZXNvbHZlZFByb3BzMyA9IHJlc29sdmVEZWZhdWx0UHJvcHMoX3R5cGUyLnR5cGUsIF9yZXNvbHZlZFByb3BzMyk7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vQ29tcG9uZW50KGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCBfdHlwZTIsIF9yZXNvbHZlZFByb3BzMywgdXBkYXRlRXhwaXJhdGlvblRpbWUsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICAgIH1cbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB1cGRhdGVTaW1wbGVNZW1vQ29tcG9uZW50KGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy50eXBlLCB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsIHVwZGF0ZUV4cGlyYXRpb25UaW1lLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICB9XG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfQ29tcG9uZW50MyA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzNCA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzNCA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSBfQ29tcG9uZW50MyA/IF91bnJlc29sdmVkUHJvcHM0IDogcmVzb2x2ZURlZmF1bHRQcm9wcyhfQ29tcG9uZW50MywgX3VucmVzb2x2ZWRQcm9wczQpO1xuICAgICAgICByZXR1cm4gbW91bnRJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIF9Db21wb25lbnQzLCBfcmVzb2x2ZWRQcm9wczQsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICAgIH1cbiAgICBjYXNlIERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKGVuYWJsZVN1c3BlbnNlU2VydmVyUmVuZGVyZXIpIHtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbiAgaW52YXJpYW50KGZhbHNlLCAnVW5rbm93biB1bml0IG9mIHdvcmsgdGFnLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG52YXIgdmFsdWVDdXJzb3IgPSBjcmVhdGVDdXJzb3IobnVsbCk7XG5cbnZhciByZW5kZXJlclNpZ2lsID0gdm9pZCAwO1xue1xuICAvLyBVc2UgdGhpcyB0byBkZXRlY3QgbXVsdGlwbGUgcmVuZGVyZXJzIHVzaW5nIHRoZSBzYW1lIGNvbnRleHRcbiAgcmVuZGVyZXJTaWdpbCA9IHt9O1xufVxuXG52YXIgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSBudWxsO1xudmFyIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG52YXIgbGFzdENvbnRleHRXaXRoQWxsQml0c09ic2VydmVkID0gbnVsbDtcblxudmFyIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcblxuZnVuY3Rpb24gcmVzZXRDb250ZXh0RGVwZW5kZW5jZXMoKSB7XG4gIC8vIFRoaXMgaXMgY2FsbGVkIHJpZ2h0IGJlZm9yZSBSZWFjdCB5aWVsZHMgZXhlY3V0aW9uLCB0byBlbnN1cmUgYHJlYWRDb250ZXh0YFxuICAvLyBjYW5ub3QgYmUgY2FsbGVkIG91dHNpZGUgdGhlIHJlbmRlciBwaGFzZS5cbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSBudWxsO1xuICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBudWxsO1xuICBsYXN0Q29udGV4dFdpdGhBbGxCaXRzT2JzZXJ2ZWQgPSBudWxsO1xuICB7XG4gICAgaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFViA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKSB7XG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKSB7XG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFByb3ZpZGVyKHByb3ZpZGVyRmliZXIsIG5leHRWYWx1ZSkge1xuICB2YXIgY29udGV4dCA9IHByb3ZpZGVyRmliZXIudHlwZS5fY29udGV4dDtcblxuICBpZiAoaXNQcmltYXJ5UmVuZGVyZXIpIHtcbiAgICBwdXNoKHZhbHVlQ3Vyc29yLCBjb250ZXh0Ll9jdXJyZW50VmFsdWUsIHByb3ZpZGVyRmliZXIpO1xuXG4gICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gbmV4dFZhbHVlO1xuICAgIHtcbiAgICAgICEoY29udGV4dC5fY3VycmVudFJlbmRlcmVyID09PSB1bmRlZmluZWQgfHwgY29udGV4dC5fY3VycmVudFJlbmRlcmVyID09PSBudWxsIHx8IGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9PT0gcmVuZGVyZXJTaWdpbCkgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdEZXRlY3RlZCBtdWx0aXBsZSByZW5kZXJlcnMgY29uY3VycmVudGx5IHJlbmRlcmluZyB0aGUgJyArICdzYW1lIGNvbnRleHQgcHJvdmlkZXIuIFRoaXMgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkLicpIDogdm9pZCAwO1xuICAgICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyID0gcmVuZGVyZXJTaWdpbDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcHVzaCh2YWx1ZUN1cnNvciwgY29udGV4dC5fY3VycmVudFZhbHVlMiwgcHJvdmlkZXJGaWJlcik7XG5cbiAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUyID0gbmV4dFZhbHVlO1xuICAgIHtcbiAgICAgICEoY29udGV4dC5fY3VycmVudFJlbmRlcmVyMiA9PT0gdW5kZWZpbmVkIHx8IGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlcjIgPT09IG51bGwgfHwgY29udGV4dC5fY3VycmVudFJlbmRlcmVyMiA9PT0gcmVuZGVyZXJTaWdpbCkgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdEZXRlY3RlZCBtdWx0aXBsZSByZW5kZXJlcnMgY29uY3VycmVudGx5IHJlbmRlcmluZyB0aGUgJyArICdzYW1lIGNvbnRleHQgcHJvdmlkZXIuIFRoaXMgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkLicpIDogdm9pZCAwO1xuICAgICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyMiA9IHJlbmRlcmVyU2lnaWw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHBvcFByb3ZpZGVyKHByb3ZpZGVyRmliZXIpIHtcbiAgdmFyIGN1cnJlbnRWYWx1ZSA9IHZhbHVlQ3Vyc29yLmN1cnJlbnQ7XG5cbiAgcG9wKHZhbHVlQ3Vyc29yLCBwcm92aWRlckZpYmVyKTtcblxuICB2YXIgY29udGV4dCA9IHByb3ZpZGVyRmliZXIudHlwZS5fY29udGV4dDtcbiAgaWYgKGlzUHJpbWFyeVJlbmRlcmVyKSB7XG4gICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTIgPSBjdXJyZW50VmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlQ2hhbmdlZEJpdHMoY29udGV4dCwgbmV3VmFsdWUsIG9sZFZhbHVlKSB7XG4gIGlmIChpcyhvbGRWYWx1ZSwgbmV3VmFsdWUpKSB7XG4gICAgLy8gTm8gY2hhbmdlXG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGNoYW5nZWRCaXRzID0gdHlwZW9mIGNvbnRleHQuX2NhbGN1bGF0ZUNoYW5nZWRCaXRzID09PSAnZnVuY3Rpb24nID8gY29udGV4dC5fY2FsY3VsYXRlQ2hhbmdlZEJpdHMob2xkVmFsdWUsIG5ld1ZhbHVlKSA6IG1heFNpZ25lZDMxQml0SW50O1xuXG4gICAge1xuICAgICAgISgoY2hhbmdlZEJpdHMgJiBtYXhTaWduZWQzMUJpdEludCkgPT09IGNoYW5nZWRCaXRzKSA/IHdhcm5pbmckMShmYWxzZSwgJ2NhbGN1bGF0ZUNoYW5nZWRCaXRzOiBFeHBlY3RlZCB0aGUgcmV0dXJuIHZhbHVlIHRvIGJlIGEgJyArICczMS1iaXQgaW50ZWdlci4gSW5zdGVhZCByZWNlaXZlZDogJXMnLCBjaGFuZ2VkQml0cykgOiB2b2lkIDA7XG4gICAgfVxuICAgIHJldHVybiBjaGFuZ2VkQml0cyB8IDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVXb3JrT25QYXJlbnRQYXRoKHBhcmVudCwgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgLy8gVXBkYXRlIHRoZSBjaGlsZCBleHBpcmF0aW9uIHRpbWUgb2YgYWxsIHRoZSBhbmNlc3RvcnMsIGluY2x1ZGluZ1xuICAvLyB0aGUgYWx0ZXJuYXRlcy5cbiAgdmFyIG5vZGUgPSBwYXJlbnQ7XG4gIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgdmFyIGFsdGVybmF0ZSA9IG5vZGUuYWx0ZXJuYXRlO1xuICAgIGlmIChub2RlLmNoaWxkRXhwaXJhdGlvblRpbWUgPCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAgICAgbm9kZS5jaGlsZEV4cGlyYXRpb25UaW1lID0gcmVuZGVyRXhwaXJhdGlvblRpbWU7XG4gICAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZS5jaGlsZEV4cGlyYXRpb25UaW1lIDwgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgICAgICAgYWx0ZXJuYXRlLmNoaWxkRXhwaXJhdGlvblRpbWUgPSByZW5kZXJFeHBpcmF0aW9uVGltZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUuY2hpbGRFeHBpcmF0aW9uVGltZSA8IHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gICAgICBhbHRlcm5hdGUuY2hpbGRFeHBpcmF0aW9uVGltZSA9IHJlbmRlckV4cGlyYXRpb25UaW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZWl0aGVyIGFsdGVybmF0ZSB3YXMgdXBkYXRlZCwgd2hpY2ggbWVhbnMgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAvLyBhbmNlc3RvciBwYXRoIGFscmVhZHkgaGFzIHN1ZmZpY2llbnQgcHJpb3JpdHkuXG4gICAgICBicmVhaztcbiAgICB9XG4gICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIGNoYW5nZWRCaXRzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICB2YXIgZmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgaWYgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgLy8gU2V0IHRoZSByZXR1cm4gcG9pbnRlciBvZiB0aGUgY2hpbGQgdG8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuXG4gICAgZmliZXIucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIH1cbiAgd2hpbGUgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgdmFyIG5leHRGaWJlciA9IHZvaWQgMDtcblxuICAgIC8vIFZpc2l0IHRoaXMgZmliZXIuXG4gICAgdmFyIGxpc3QgPSBmaWJlci5jb250ZXh0RGVwZW5kZW5jaWVzO1xuICAgIGlmIChsaXN0ICE9PSBudWxsKSB7XG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5jaGlsZDtcblxuICAgICAgdmFyIGRlcGVuZGVuY3kgPSBsaXN0LmZpcnN0O1xuICAgICAgd2hpbGUgKGRlcGVuZGVuY3kgIT09IG51bGwpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNvbnRleHQgbWF0Y2hlcy5cbiAgICAgICAgaWYgKGRlcGVuZGVuY3kuY29udGV4dCA9PT0gY29udGV4dCAmJiAoZGVwZW5kZW5jeS5vYnNlcnZlZEJpdHMgJiBjaGFuZ2VkQml0cykgIT09IDApIHtcbiAgICAgICAgICAvLyBNYXRjaCEgU2NoZWR1bGUgYW4gdXBkYXRlIG9uIHRoaXMgZmliZXIuXG5cbiAgICAgICAgICBpZiAoZmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgLy8gU2NoZWR1bGUgYSBmb3JjZSB1cGRhdGUgb24gdGhlIHdvcmstaW4tcHJvZ3Jlc3MuXG4gICAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTtcbiAgICAgICAgICAgIC8vIFRPRE86IEJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhIHdvcmstaW4tcHJvZ3Jlc3MsIHRoaXMgd2lsbCBhZGQgdGhlXG4gICAgICAgICAgICAvLyB1cGRhdGUgdG8gdGhlIGN1cnJlbnQgZmliZXIsIHRvbywgd2hpY2ggbWVhbnMgaXQgd2lsbCBwZXJzaXN0IGV2ZW4gaWZcbiAgICAgICAgICAgIC8vIHRoaXMgcmVuZGVyIGlzIHRocm93biBhd2F5LiBTaW5jZSBpdCdzIGEgcmFjZSBjb25kaXRpb24sIG5vdCBzdXJlIGl0J3NcbiAgICAgICAgICAgIC8vIHdvcnRoIGZpeGluZy5cbiAgICAgICAgICAgIGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZpYmVyLmV4cGlyYXRpb25UaW1lIDwgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgICAgICAgICAgIGZpYmVyLmV4cGlyYXRpb25UaW1lID0gcmVuZGVyRXhwaXJhdGlvblRpbWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG4gICAgICAgICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUuZXhwaXJhdGlvblRpbWUgPCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAgICAgICAgICAgYWx0ZXJuYXRlLmV4cGlyYXRpb25UaW1lID0gcmVuZGVyRXhwaXJhdGlvblRpbWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2NoZWR1bGVXb3JrT25QYXJlbnRQYXRoKGZpYmVyLnJldHVybiwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuXG4gICAgICAgICAgLy8gTWFyayB0aGUgZXhwaXJhdGlvbiB0aW1lIG9uIHRoZSBsaXN0LCB0b28uXG4gICAgICAgICAgaWYgKGxpc3QuZXhwaXJhdGlvblRpbWUgPCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAgICAgICAgICAgbGlzdC5leHBpcmF0aW9uVGltZSA9IHJlbmRlckV4cGlyYXRpb25UaW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNpbmNlIHdlIGFscmVhZHkgZm91bmQgYSBtYXRjaCwgd2UgY2FuIHN0b3AgdHJhdmVyc2luZyB0aGVcbiAgICAgICAgICAvLyBkZXBlbmRlbmN5IGxpc3QuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVwZW5kZW5jeSA9IGRlcGVuZGVuY3kubmV4dDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gQ29udGV4dFByb3ZpZGVyKSB7XG4gICAgICAvLyBEb24ndCBzY2FuIGRlZXBlciBpZiB0aGlzIGlzIGEgbWF0Y2hpbmcgcHJvdmlkZXJcbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLnR5cGUgPT09IHdvcmtJblByb2dyZXNzLnR5cGUgPyBudWxsIDogZmliZXIuY2hpbGQ7XG4gICAgfSBlbHNlIGlmIChlbmFibGVTdXNwZW5zZVNlcnZlclJlbmRlcmVyICYmIGZpYmVyLnRhZyA9PT0gRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICAvLyBJZiBhIGRlaHlkcmF0ZWQgc3VzcGVuc2UgY29tcG9uZW50IGlzIGluIHRoaXMgc3VidHJlZSwgd2UgZG9uJ3Qga25vd1xuICAgICAgLy8gaWYgaXQgd2lsbCBoYXZlIGFueSBjb250ZXh0IGNvbnN1bWVycyBpbiBpdC4gVGhlIGJlc3Qgd2UgY2FuIGRvIGlzXG4gICAgICAvLyBtYXJrIGl0IGFzIGhhdmluZyB1cGRhdGVzIG9uIGl0cyBjaGlsZHJlbi5cbiAgICAgIGlmIChmaWJlci5leHBpcmF0aW9uVGltZSA8IHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgIGZpYmVyLmV4cGlyYXRpb25UaW1lID0gcmVuZGVyRXhwaXJhdGlvblRpbWU7XG4gICAgICB9XG4gICAgICB2YXIgX2FsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgICAgIGlmIChfYWx0ZXJuYXRlICE9PSBudWxsICYmIF9hbHRlcm5hdGUuZXhwaXJhdGlvblRpbWUgPCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAgICAgICBfYWx0ZXJuYXRlLmV4cGlyYXRpb25UaW1lID0gcmVuZGVyRXhwaXJhdGlvblRpbWU7XG4gICAgICB9XG4gICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgcGFzc2luZyB0aGlzIGZpYmVyIGFzIHRoZSBwYXJlbnRcbiAgICAgIC8vIGJlY2F1c2Ugd2Ugd2FudCB0byBzY2hlZHVsZSB0aGlzIGZpYmVyIGFzIGhhdmluZyB3b3JrXG4gICAgICAvLyBvbiBpdHMgY2hpbGRyZW4uIFdlJ2xsIHVzZSB0aGUgY2hpbGRFeHBpcmF0aW9uVGltZSBvblxuICAgICAgLy8gdGhpcyBmaWJlciB0byBpbmRpY2F0ZSB0aGF0IGEgY29udGV4dCBoYXMgY2hhbmdlZC5cbiAgICAgIHNjaGVkdWxlV29ya09uUGFyZW50UGF0aChmaWJlciwgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgICAgbmV4dEZpYmVyID0gZmliZXIuc2libGluZztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVHJhdmVyc2UgZG93bi5cbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLmNoaWxkO1xuICAgIH1cblxuICAgIGlmIChuZXh0RmliZXIgIT09IG51bGwpIHtcbiAgICAgIC8vIFNldCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIGNoaWxkIHRvIHRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuICAgICAgbmV4dEZpYmVyLnJldHVybiA9IGZpYmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBjaGlsZC4gVHJhdmVyc2UgdG8gbmV4dCBzaWJsaW5nLlxuICAgICAgbmV4dEZpYmVyID0gZmliZXI7XG4gICAgICB3aGlsZSAobmV4dEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChuZXh0RmliZXIgPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgICAgLy8gV2UncmUgYmFjayB0byB0aGUgcm9vdCBvZiB0aGlzIHN1YnRyZWUuIEV4aXQuXG4gICAgICAgICAgbmV4dEZpYmVyID0gbnVsbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2libGluZyA9IG5leHRGaWJlci5zaWJsaW5nO1xuICAgICAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFNldCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIHNpYmxpbmcgdG8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuXG4gICAgICAgICAgc2libGluZy5yZXR1cm4gPSBuZXh0RmliZXIucmV0dXJuO1xuICAgICAgICAgIG5leHRGaWJlciA9IHNpYmxpbmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gbW9yZSBzaWJsaW5ncy4gVHJhdmVyc2UgdXAuXG4gICAgICAgIG5leHRGaWJlciA9IG5leHRGaWJlci5yZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGZpYmVyID0gbmV4dEZpYmVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IHdvcmtJblByb2dyZXNzO1xuICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBudWxsO1xuICBsYXN0Q29udGV4dFdpdGhBbGxCaXRzT2JzZXJ2ZWQgPSBudWxsO1xuXG4gIHZhciBjdXJyZW50RGVwZW5kZW5jaWVzID0gd29ya0luUHJvZ3Jlc3MuY29udGV4dERlcGVuZGVuY2llcztcbiAgaWYgKGN1cnJlbnREZXBlbmRlbmNpZXMgIT09IG51bGwgJiYgY3VycmVudERlcGVuZGVuY2llcy5leHBpcmF0aW9uVGltZSA+PSByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAgIC8vIENvbnRleHQgbGlzdCBoYXMgYSBwZW5kaW5nIHVwZGF0ZS4gTWFyayB0aGF0IHRoaXMgZmliZXIgcGVyZm9ybWVkIHdvcmsuXG4gICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgfVxuXG4gIC8vIFJlc2V0IHRoZSB3b3JrLWluLXByb2dyZXNzIGxpc3RcbiAgd29ya0luUHJvZ3Jlc3MuY29udGV4dERlcGVuZGVuY2llcyA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cykge1xuICB7XG4gICAgLy8gVGhpcyB3YXJuaW5nIHdvdWxkIGZpcmUgaWYgeW91IHJlYWQgY29udGV4dCBpbnNpZGUgYSBIb29rIGxpa2UgdXNlTWVtby5cbiAgICAvLyBVbmxpa2UgdGhlIGNsYXNzIGNoZWNrIGJlbG93LCBpdCdzIG5vdCBlbmZvcmNlZCBpbiBwcm9kdWN0aW9uIGZvciBwZXJmLlxuICAgICEhaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFViA/IHdhcm5pbmckMShmYWxzZSwgJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpIDogdm9pZCAwO1xuICB9XG5cbiAgaWYgKGxhc3RDb250ZXh0V2l0aEFsbEJpdHNPYnNlcnZlZCA9PT0gY29udGV4dCkge1xuICAgIC8vIE5vdGhpbmcgdG8gZG8uIFdlIGFscmVhZHkgb2JzZXJ2ZSBldmVyeXRoaW5nIGluIHRoaXMgY29udGV4dC5cbiAgfSBlbHNlIGlmIChvYnNlcnZlZEJpdHMgPT09IGZhbHNlIHx8IG9ic2VydmVkQml0cyA9PT0gMCkge1xuICAgIC8vIERvIG5vdCBvYnNlcnZlIGFueSB1cGRhdGVzLlxuICB9IGVsc2Uge1xuICAgIHZhciByZXNvbHZlZE9ic2VydmVkQml0cyA9IHZvaWQgMDsgLy8gQXZvaWQgZGVvcHRpbmcgb24gb2JzZXJ2YWJsZSBhcmd1bWVudHMgb3IgaGV0ZXJvZ2VuZW91cyB0eXBlcy5cbiAgICBpZiAodHlwZW9mIG9ic2VydmVkQml0cyAhPT0gJ251bWJlcicgfHwgb2JzZXJ2ZWRCaXRzID09PSBtYXhTaWduZWQzMUJpdEludCkge1xuICAgICAgLy8gT2JzZXJ2ZSBhbGwgdXBkYXRlcy5cbiAgICAgIGxhc3RDb250ZXh0V2l0aEFsbEJpdHNPYnNlcnZlZCA9IGNvbnRleHQ7XG4gICAgICByZXNvbHZlZE9ic2VydmVkQml0cyA9IG1heFNpZ25lZDMxQml0SW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlZE9ic2VydmVkQml0cyA9IG9ic2VydmVkQml0cztcbiAgICB9XG5cbiAgICB2YXIgY29udGV4dEl0ZW0gPSB7XG4gICAgICBjb250ZXh0OiBjb250ZXh0LFxuICAgICAgb2JzZXJ2ZWRCaXRzOiByZXNvbHZlZE9ic2VydmVkQml0cyxcbiAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuXG4gICAgaWYgKGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9PT0gbnVsbCkge1xuICAgICAgIShjdXJyZW50bHlSZW5kZXJpbmdGaWJlciAhPT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiBJbiBjbGFzc2VzLCB5b3UgY2FuIHJlYWQgaXQgaW4gdGhlIHJlbmRlciBtZXRob2Qgb3IgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKSA6IHZvaWQgMDtcblxuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgZGVwZW5kZW5jeSBmb3IgdGhpcyBjb21wb25lbnQuIENyZWF0ZSBhIG5ldyBsaXN0LlxuICAgICAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gY29udGV4dEl0ZW07XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5jb250ZXh0RGVwZW5kZW5jaWVzID0ge1xuICAgICAgICBmaXJzdDogY29udGV4dEl0ZW0sXG4gICAgICAgIGV4cGlyYXRpb25UaW1lOiBOb1dvcmtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFwcGVuZCBhIG5ldyBjb250ZXh0IGl0ZW0uXG4gICAgICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBsYXN0Q29udGV4dERlcGVuZGVuY3kubmV4dCA9IGNvbnRleHRJdGVtO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaXNQcmltYXJ5UmVuZGVyZXIgPyBjb250ZXh0Ll9jdXJyZW50VmFsdWUgOiBjb250ZXh0Ll9jdXJyZW50VmFsdWUyO1xufVxuXG4vLyBVcGRhdGVRdWV1ZSBpcyBhIGxpbmtlZCBsaXN0IG9mIHByaW9yaXRpemVkIHVwZGF0ZXMuXG4vL1xuLy8gTGlrZSBmaWJlcnMsIHVwZGF0ZSBxdWV1ZXMgY29tZSBpbiBwYWlyczogYSBjdXJyZW50IHF1ZXVlLCB3aGljaCByZXByZXNlbnRzXG4vLyB0aGUgdmlzaWJsZSBzdGF0ZSBvZiB0aGUgc2NyZWVuLCBhbmQgYSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlLCB3aGljaCBjYW4gYmVcbi8vIG11dGF0ZWQgYW5kIHByb2Nlc3NlZCBhc3luY2hyb25vdXNseSBiZWZvcmUgaXQgaXMgY29tbWl0dGVkIOKAlCBhIGZvcm0gb2Zcbi8vIGRvdWJsZSBidWZmZXJpbmcuIElmIGEgd29yay1pbi1wcm9ncmVzcyByZW5kZXIgaXMgZGlzY2FyZGVkIGJlZm9yZSBmaW5pc2hpbmcsXG4vLyB3ZSBjcmVhdGUgYSBuZXcgd29yay1pbi1wcm9ncmVzcyBieSBjbG9uaW5nIHRoZSBjdXJyZW50IHF1ZXVlLlxuLy9cbi8vIEJvdGggcXVldWVzIHNoYXJlIGEgcGVyc2lzdGVudCwgc2luZ2x5LWxpbmtlZCBsaXN0IHN0cnVjdHVyZS4gVG8gc2NoZWR1bGUgYW5cbi8vIHVwZGF0ZSwgd2UgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgYm90aCBxdWV1ZXMuIEVhY2ggcXVldWUgbWFpbnRhaW5zIGFcbi8vIHBvaW50ZXIgdG8gZmlyc3QgdXBkYXRlIGluIHRoZSBwZXJzaXN0ZW50IGxpc3QgdGhhdCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQuXG4vLyBUaGUgd29yay1pbi1wcm9ncmVzcyBwb2ludGVyIGFsd2F5cyBoYXMgYSBwb3NpdGlvbiBlcXVhbCB0byBvciBncmVhdGVyIHRoYW5cbi8vIHRoZSBjdXJyZW50IHF1ZXVlLCBzaW5jZSB3ZSBhbHdheXMgd29yayBvbiB0aGF0IG9uZS4gVGhlIGN1cnJlbnQgcXVldWUnc1xuLy8gcG9pbnRlciBpcyBvbmx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBjb21taXQgcGhhc2UsIHdoZW4gd2Ugc3dhcCBpbiB0aGVcbi8vIHdvcmstaW4tcHJvZ3Jlc3MuXG4vL1xuLy8gRm9yIGV4YW1wbGU6XG4vL1xuLy8gICBDdXJyZW50IHBvaW50ZXI6ICAgICAgICAgICBBIC0gQiAtIEMgLSBEIC0gRSAtIEZcbi8vICAgV29yay1pbi1wcm9ncmVzcyBwb2ludGVyOiAgICAgICAgICAgICAgRCAtIEUgLSBGXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUgaGFzXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCBtb3JlIHVwZGF0ZXMgdGhhbiBjdXJyZW50LlxuLy9cbi8vIFRoZSByZWFzb24gd2UgYXBwZW5kIHRvIGJvdGggcXVldWVzIGlzIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIG1pZ2h0IGRyb3Bcbi8vIHVwZGF0ZXMgd2l0aG91dCBldmVyIHByb2Nlc3NpbmcgdGhlbS4gRm9yIGV4YW1wbGUsIGlmIHdlIG9ubHkgYWRkIHVwZGF0ZXMgdG9cbi8vIHRoZSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlLCBzb21lIHVwZGF0ZXMgY291bGQgYmUgbG9zdCB3aGVuZXZlciBhIHdvcmstaW5cbi8vIC1wcm9ncmVzcyByZW5kZXIgcmVzdGFydHMgYnkgY2xvbmluZyBmcm9tIGN1cnJlbnQuIFNpbWlsYXJseSwgaWYgd2Ugb25seSBhZGRcbi8vIHVwZGF0ZXMgdG8gdGhlIGN1cnJlbnQgcXVldWUsIHRoZSB1cGRhdGVzIHdpbGwgYmUgbG9zdCB3aGVuZXZlciBhbiBhbHJlYWR5XG4vLyBpbi1wcm9ncmVzcyBxdWV1ZSBjb21taXRzIGFuZCBzd2FwcyB3aXRoIHRoZSBjdXJyZW50IHF1ZXVlLiBIb3dldmVyLCBieVxuLy8gYWRkaW5nIHRvIGJvdGggcXVldWVzLCB3ZSBndWFyYW50ZWUgdGhhdCB0aGUgdXBkYXRlIHdpbGwgYmUgcGFydCBvZiB0aGUgbmV4dFxuLy8gd29yay1pbi1wcm9ncmVzcy4gKEFuZCBiZWNhdXNlIHRoZSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIGJlY29tZXMgdGhlXG4vLyBjdXJyZW50IHF1ZXVlIG9uY2UgaXQgY29tbWl0cywgdGhlcmUncyBubyBkYW5nZXIgb2YgYXBwbHlpbmcgdGhlIHNhbWVcbi8vIHVwZGF0ZSB0d2ljZS4pXG4vL1xuLy8gUHJpb3JpdGl6YXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tXG4vL1xuLy8gVXBkYXRlcyBhcmUgbm90IHNvcnRlZCBieSBwcmlvcml0eSwgYnV0IGJ5IGluc2VydGlvbjsgbmV3IHVwZGF0ZXMgYXJlIGFsd2F5c1xuLy8gYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC5cbi8vXG4vLyBUaGUgcHJpb3JpdHkgaXMgc3RpbGwgaW1wb3J0YW50LCB0aG91Z2guIFdoZW4gcHJvY2Vzc2luZyB0aGUgdXBkYXRlIHF1ZXVlXG4vLyBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSwgb25seSB0aGUgdXBkYXRlcyB3aXRoIHN1ZmZpY2llbnQgcHJpb3JpdHkgYXJlXG4vLyBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0LiBJZiB3ZSBza2lwIGFuIHVwZGF0ZSBiZWNhdXNlIGl0IGhhcyBpbnN1ZmZpY2llbnRcbi8vIHByaW9yaXR5LCBpdCByZW1haW5zIGluIHRoZSBxdWV1ZSB0byBiZSBwcm9jZXNzZWQgbGF0ZXIsIGR1cmluZyBhIGxvd2VyXG4vLyBwcmlvcml0eSByZW5kZXIuIENydWNpYWxseSwgYWxsIHVwZGF0ZXMgc3Vic2VxdWVudCB0byBhIHNraXBwZWQgdXBkYXRlIGFsc29cbi8vIHJlbWFpbiBpbiB0aGUgcXVldWUgKnJlZ2FyZGxlc3Mgb2YgdGhlaXIgcHJpb3JpdHkqLiBUaGF0IG1lYW5zIGhpZ2ggcHJpb3JpdHlcbi8vIHVwZGF0ZXMgYXJlIHNvbWV0aW1lcyBwcm9jZXNzZWQgdHdpY2UsIGF0IHR3byBzZXBhcmF0ZSBwcmlvcml0aWVzLiBXZSBhbHNvXG4vLyBrZWVwIHRyYWNrIG9mIGEgYmFzZSBzdGF0ZSwgdGhhdCByZXByZXNlbnRzIHRoZSBzdGF0ZSBiZWZvcmUgdGhlIGZpcnN0XG4vLyB1cGRhdGUgaW4gdGhlIHF1ZXVlIGlzIGFwcGxpZWQuXG4vL1xuLy8gRm9yIGV4YW1wbGU6XG4vL1xuLy8gICBHaXZlbiBhIGJhc2Ugc3RhdGUgb2YgJycsIGFuZCB0aGUgZm9sbG93aW5nIHF1ZXVlIG9mIHVwZGF0ZXNcbi8vXG4vLyAgICAgQTEgLSBCMiAtIEMxIC0gRDJcbi8vXG4vLyAgIHdoZXJlIHRoZSBudW1iZXIgaW5kaWNhdGVzIHRoZSBwcmlvcml0eSwgYW5kIHRoZSB1cGRhdGUgaXMgYXBwbGllZCB0byB0aGVcbi8vICAgcHJldmlvdXMgc3RhdGUgYnkgYXBwZW5kaW5nIGEgbGV0dGVyLCBSZWFjdCB3aWxsIHByb2Nlc3MgdGhlc2UgdXBkYXRlcyBhc1xuLy8gICB0d28gc2VwYXJhdGUgcmVuZGVycywgb25lIHBlciBkaXN0aW5jdCBwcmlvcml0eSBsZXZlbDpcbi8vXG4vLyAgIEZpcnN0IHJlbmRlciwgYXQgcHJpb3JpdHkgMTpcbi8vICAgICBCYXNlIHN0YXRlOiAnJ1xuLy8gICAgIFVwZGF0ZXM6IFtBMSwgQzFdXG4vLyAgICAgUmVzdWx0IHN0YXRlOiAnQUMnXG4vL1xuLy8gICBTZWNvbmQgcmVuZGVyLCBhdCBwcmlvcml0eSAyOlxuLy8gICAgIEJhc2Ugc3RhdGU6ICdBJyAgICAgICAgICAgIDwtICBUaGUgYmFzZSBzdGF0ZSBkb2VzIG5vdCBpbmNsdWRlIEMxLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIEIyIHdhcyBza2lwcGVkLlxuLy8gICAgIFVwZGF0ZXM6IFtCMiwgQzEsIEQyXSAgICAgIDwtICBDMSB3YXMgcmViYXNlZCBvbiB0b3Agb2YgQjJcbi8vICAgICBSZXN1bHQgc3RhdGU6ICdBQkNEJ1xuLy9cbi8vIEJlY2F1c2Ugd2UgcHJvY2VzcyB1cGRhdGVzIGluIGluc2VydGlvbiBvcmRlciwgYW5kIHJlYmFzZSBoaWdoIHByaW9yaXR5XG4vLyB1cGRhdGVzIHdoZW4gcHJlY2VkaW5nIHVwZGF0ZXMgYXJlIHNraXBwZWQsIHRoZSBmaW5hbCByZXN1bHQgaXMgZGV0ZXJtaW5pc3RpY1xuLy8gcmVnYXJkbGVzcyBvZiBwcmlvcml0eS4gSW50ZXJtZWRpYXRlIHN0YXRlIG1heSB2YXJ5IGFjY29yZGluZyB0byBzeXN0ZW1cbi8vIHJlc291cmNlcywgYnV0IHRoZSBmaW5hbCBzdGF0ZSBpcyBhbHdheXMgdGhlIHNhbWUuXG5cbnZhciBVcGRhdGVTdGF0ZSA9IDA7XG52YXIgUmVwbGFjZVN0YXRlID0gMTtcbnZhciBGb3JjZVVwZGF0ZSA9IDI7XG52YXIgQ2FwdHVyZVVwZGF0ZSA9IDM7XG5cbi8vIEdsb2JhbCBzdGF0ZSB0aGF0IGlzIHJlc2V0IGF0IHRoZSBiZWdpbm5pbmcgb2YgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYC5cbi8vIEl0IHNob3VsZCBvbmx5IGJlIHJlYWQgcmlnaHQgYWZ0ZXIgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYCwgdmlhXG4vLyBgY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZ2AuXG52YXIgaGFzRm9yY2VVcGRhdGUgPSBmYWxzZTtcblxudmFyIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGUgPSB2b2lkIDA7XG52YXIgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gdm9pZCAwO1xudmFyIHJlc2V0Q3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gdm9pZCAwO1xue1xuICBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlID0gZmFsc2U7XG4gIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG4gIHJlc2V0Q3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gZnVuY3Rpb24gKCkge1xuICAgIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVVwZGF0ZVF1ZXVlKGJhc2VTdGF0ZSkge1xuICB2YXIgcXVldWUgPSB7XG4gICAgYmFzZVN0YXRlOiBiYXNlU3RhdGUsXG4gICAgZmlyc3RVcGRhdGU6IG51bGwsXG4gICAgbGFzdFVwZGF0ZTogbnVsbCxcbiAgICBmaXJzdENhcHR1cmVkVXBkYXRlOiBudWxsLFxuICAgIGxhc3RDYXB0dXJlZFVwZGF0ZTogbnVsbCxcbiAgICBmaXJzdEVmZmVjdDogbnVsbCxcbiAgICBsYXN0RWZmZWN0OiBudWxsLFxuICAgIGZpcnN0Q2FwdHVyZWRFZmZlY3Q6IG51bGwsXG4gICAgbGFzdENhcHR1cmVkRWZmZWN0OiBudWxsXG4gIH07XG4gIHJldHVybiBxdWV1ZTtcbn1cblxuZnVuY3Rpb24gY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50UXVldWUpIHtcbiAgdmFyIHF1ZXVlID0ge1xuICAgIGJhc2VTdGF0ZTogY3VycmVudFF1ZXVlLmJhc2VTdGF0ZSxcbiAgICBmaXJzdFVwZGF0ZTogY3VycmVudFF1ZXVlLmZpcnN0VXBkYXRlLFxuICAgIGxhc3RVcGRhdGU6IGN1cnJlbnRRdWV1ZS5sYXN0VXBkYXRlLFxuXG4gICAgLy8gVE9ETzogV2l0aCByZXN1bWluZywgaWYgd2UgYmFpbCBvdXQgYW5kIHJlc3VzZSB0aGUgY2hpbGQgdHJlZSwgd2Ugc2hvdWxkXG4gICAgLy8ga2VlcCB0aGVzZSBlZmZlY3RzLlxuICAgIGZpcnN0Q2FwdHVyZWRVcGRhdGU6IG51bGwsXG4gICAgbGFzdENhcHR1cmVkVXBkYXRlOiBudWxsLFxuXG4gICAgZmlyc3RFZmZlY3Q6IG51bGwsXG4gICAgbGFzdEVmZmVjdDogbnVsbCxcblxuICAgIGZpcnN0Q2FwdHVyZWRFZmZlY3Q6IG51bGwsXG4gICAgbGFzdENhcHR1cmVkRWZmZWN0OiBudWxsXG4gIH07XG4gIHJldHVybiBxdWV1ZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVXBkYXRlKGV4cGlyYXRpb25UaW1lKSB7XG4gIHJldHVybiB7XG4gICAgZXhwaXJhdGlvblRpbWU6IGV4cGlyYXRpb25UaW1lLFxuXG4gICAgdGFnOiBVcGRhdGVTdGF0ZSxcbiAgICBwYXlsb2FkOiBudWxsLFxuICAgIGNhbGxiYWNrOiBudWxsLFxuXG4gICAgbmV4dDogbnVsbCxcbiAgICBuZXh0RWZmZWN0OiBudWxsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFwcGVuZFVwZGF0ZVRvUXVldWUocXVldWUsIHVwZGF0ZSkge1xuICAvLyBBcHBlbmQgdGhlIHVwZGF0ZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuICBpZiAocXVldWUubGFzdFVwZGF0ZSA9PT0gbnVsbCkge1xuICAgIC8vIFF1ZXVlIGlzIGVtcHR5XG4gICAgcXVldWUuZmlyc3RVcGRhdGUgPSBxdWV1ZS5sYXN0VXBkYXRlID0gdXBkYXRlO1xuICB9IGVsc2Uge1xuICAgIHF1ZXVlLmxhc3RVcGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgICBxdWV1ZS5sYXN0VXBkYXRlID0gdXBkYXRlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSkge1xuICAvLyBVcGRhdGUgcXVldWVzIGFyZSBjcmVhdGVkIGxhemlseS5cbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgdmFyIHF1ZXVlMSA9IHZvaWQgMDtcbiAgdmFyIHF1ZXVlMiA9IHZvaWQgMDtcbiAgaWYgKGFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgIC8vIFRoZXJlJ3Mgb25seSBvbmUgZmliZXIuXG4gICAgcXVldWUxID0gZmliZXIudXBkYXRlUXVldWU7XG4gICAgcXVldWUyID0gbnVsbDtcbiAgICBpZiAocXVldWUxID09PSBudWxsKSB7XG4gICAgICBxdWV1ZTEgPSBmaWJlci51cGRhdGVRdWV1ZSA9IGNyZWF0ZVVwZGF0ZVF1ZXVlKGZpYmVyLm1lbW9pemVkU3RhdGUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGVyZSBhcmUgdHdvIG93bmVycy5cbiAgICBxdWV1ZTEgPSBmaWJlci51cGRhdGVRdWV1ZTtcbiAgICBxdWV1ZTIgPSBhbHRlcm5hdGUudXBkYXRlUXVldWU7XG4gICAgaWYgKHF1ZXVlMSA9PT0gbnVsbCkge1xuICAgICAgaWYgKHF1ZXVlMiA9PT0gbnVsbCkge1xuICAgICAgICAvLyBOZWl0aGVyIGZpYmVyIGhhcyBhbiB1cGRhdGUgcXVldWUuIENyZWF0ZSBuZXcgb25lcy5cbiAgICAgICAgcXVldWUxID0gZmliZXIudXBkYXRlUXVldWUgPSBjcmVhdGVVcGRhdGVRdWV1ZShmaWJlci5tZW1vaXplZFN0YXRlKTtcbiAgICAgICAgcXVldWUyID0gYWx0ZXJuYXRlLnVwZGF0ZVF1ZXVlID0gY3JlYXRlVXBkYXRlUXVldWUoYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gT25seSBvbmUgZmliZXIgaGFzIGFuIHVwZGF0ZSBxdWV1ZS4gQ2xvbmUgdG8gY3JlYXRlIGEgbmV3IG9uZS5cbiAgICAgICAgcXVldWUxID0gZmliZXIudXBkYXRlUXVldWUgPSBjbG9uZVVwZGF0ZVF1ZXVlKHF1ZXVlMik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChxdWV1ZTIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gT25seSBvbmUgZmliZXIgaGFzIGFuIHVwZGF0ZSBxdWV1ZS4gQ2xvbmUgdG8gY3JlYXRlIGEgbmV3IG9uZS5cbiAgICAgICAgcXVldWUyID0gYWx0ZXJuYXRlLnVwZGF0ZVF1ZXVlID0gY2xvbmVVcGRhdGVRdWV1ZShxdWV1ZTEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQm90aCBvd25lcnMgaGF2ZSBhbiB1cGRhdGUgcXVldWUuXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChxdWV1ZTIgPT09IG51bGwgfHwgcXVldWUxID09PSBxdWV1ZTIpIHtcbiAgICAvLyBUaGVyZSdzIG9ubHkgYSBzaW5nbGUgcXVldWUuXG4gICAgYXBwZW5kVXBkYXRlVG9RdWV1ZShxdWV1ZTEsIHVwZGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhlcmUgYXJlIHR3byBxdWV1ZXMuIFdlIG5lZWQgdG8gYXBwZW5kIHRoZSB1cGRhdGUgdG8gYm90aCBxdWV1ZXMsXG4gICAgLy8gd2hpbGUgYWNjb3VudGluZyBmb3IgdGhlIHBlcnNpc3RlbnQgc3RydWN0dXJlIG9mIHRoZSBsaXN0IOKAlCB3ZSBkb24ndFxuICAgIC8vIHdhbnQgdGhlIHNhbWUgdXBkYXRlIHRvIGJlIGFkZGVkIG11bHRpcGxlIHRpbWVzLlxuICAgIGlmIChxdWV1ZTEubGFzdFVwZGF0ZSA9PT0gbnVsbCB8fCBxdWV1ZTIubGFzdFVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gT25lIG9mIHRoZSBxdWV1ZXMgaXMgbm90IGVtcHR5LiBXZSBtdXN0IGFkZCB0aGUgdXBkYXRlIHRvIGJvdGggcXVldWVzLlxuICAgICAgYXBwZW5kVXBkYXRlVG9RdWV1ZShxdWV1ZTEsIHVwZGF0ZSk7XG4gICAgICBhcHBlbmRVcGRhdGVUb1F1ZXVlKHF1ZXVlMiwgdXBkYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQm90aCBxdWV1ZXMgYXJlIG5vbi1lbXB0eS4gVGhlIGxhc3QgdXBkYXRlIGlzIHRoZSBzYW1lIGluIGJvdGggbGlzdHMsXG4gICAgICAvLyBiZWNhdXNlIG9mIHN0cnVjdHVyYWwgc2hhcmluZy4gU28sIG9ubHkgYXBwZW5kIHRvIG9uZSBvZiB0aGUgbGlzdHMuXG4gICAgICBhcHBlbmRVcGRhdGVUb1F1ZXVlKHF1ZXVlMSwgdXBkYXRlKTtcbiAgICAgIC8vIEJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHVwZGF0ZSB0aGUgYGxhc3RVcGRhdGVgIHBvaW50ZXIgb2YgcXVldWUyLlxuICAgICAgcXVldWUyLmxhc3RVcGRhdGUgPSB1cGRhdGU7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50ICYmIChjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPT09IHF1ZXVlMSB8fCBxdWV1ZTIgIT09IG51bGwgJiYgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID09PSBxdWV1ZTIpICYmICFkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlKSB7XG4gICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdBbiB1cGRhdGUgKHNldFN0YXRlLCByZXBsYWNlU3RhdGUsIG9yIGZvcmNlVXBkYXRlKSB3YXMgc2NoZWR1bGVkICcgKyAnZnJvbSBpbnNpZGUgYW4gdXBkYXRlIGZ1bmN0aW9uLiBVcGRhdGUgZnVuY3Rpb25zIHNob3VsZCBiZSBwdXJlLCAnICsgJ3dpdGggemVybyBzaWRlLWVmZmVjdHMuIENvbnNpZGVyIHVzaW5nIGNvbXBvbmVudERpZFVwZGF0ZSBvciBhICcgKyAnY2FsbGJhY2suJyk7XG4gICAgICBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCB1cGRhdGUpIHtcbiAgLy8gQ2FwdHVyZWQgdXBkYXRlcyBnbyBpbnRvIGEgc2VwYXJhdGUgbGlzdCwgYW5kIG9ubHkgb24gdGhlIHdvcmstaW4tXG4gIC8vIHByb2dyZXNzIHF1ZXVlLlxuICB2YXIgd29ya0luUHJvZ3Jlc3NRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICBpZiAod29ya0luUHJvZ3Jlc3NRdWV1ZSA9PT0gbnVsbCkge1xuICAgIHdvcmtJblByb2dyZXNzUXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGNyZWF0ZVVwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUpO1xuICB9IGVsc2Uge1xuICAgIC8vIFRPRE86IEkgcHV0IHRoaXMgaGVyZSByYXRoZXIgdGhhbiBjcmVhdGVXb3JrSW5Qcm9ncmVzcyBzbyB0aGF0IHdlIGRvbid0XG4gICAgLy8gY2xvbmUgdGhlIHF1ZXVlIHVubmVjZXNzYXJpbHkuIFRoZXJlJ3MgcHJvYmFibHkgYSBiZXR0ZXIgd2F5IHRvXG4gICAgLy8gc3RydWN0dXJlIHRoaXMuXG4gICAgd29ya0luUHJvZ3Jlc3NRdWV1ZSA9IGVuc3VyZVdvcmtJblByb2dyZXNzUXVldWVJc0FDbG9uZSh3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3NRdWV1ZSk7XG4gIH1cblxuICAvLyBBcHBlbmQgdGhlIHVwZGF0ZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuICBpZiAod29ya0luUHJvZ3Jlc3NRdWV1ZS5sYXN0Q2FwdHVyZWRVcGRhdGUgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCByZW5kZXIgcGhhc2UgdXBkYXRlXG4gICAgd29ya0luUHJvZ3Jlc3NRdWV1ZS5maXJzdENhcHR1cmVkVXBkYXRlID0gd29ya0luUHJvZ3Jlc3NRdWV1ZS5sYXN0Q2FwdHVyZWRVcGRhdGUgPSB1cGRhdGU7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3NRdWV1ZS5sYXN0Q2FwdHVyZWRVcGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgICB3b3JrSW5Qcm9ncmVzc1F1ZXVlLmxhc3RDYXB0dXJlZFVwZGF0ZSA9IHVwZGF0ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbnN1cmVXb3JrSW5Qcm9ncmVzc1F1ZXVlSXNBQ2xvbmUod29ya0luUHJvZ3Jlc3MsIHF1ZXVlKSB7XG4gIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIC8vIElmIHRoZSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIGlzIGVxdWFsIHRvIHRoZSBjdXJyZW50IHF1ZXVlLFxuICAgIC8vIHdlIG5lZWQgdG8gY2xvbmUgaXQgZmlyc3QuXG4gICAgaWYgKHF1ZXVlID09PSBjdXJyZW50LnVwZGF0ZVF1ZXVlKSB7XG4gICAgICBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY2xvbmVVcGRhdGVRdWV1ZShxdWV1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBxdWV1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdGVGcm9tVXBkYXRlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgdXBkYXRlLCBwcmV2U3RhdGUsIG5leHRQcm9wcywgaW5zdGFuY2UpIHtcbiAgc3dpdGNoICh1cGRhdGUudGFnKSB7XG4gICAgY2FzZSBSZXBsYWNlU3RhdGU6XG4gICAgICB7XG4gICAgICAgIHZhciBfcGF5bG9hZCA9IHVwZGF0ZS5wYXlsb2FkO1xuICAgICAgICBpZiAodHlwZW9mIF9wYXlsb2FkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gVXBkYXRlciBmdW5jdGlvblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICAgIGlmIChkZWJ1Z1JlbmRlclBoYXNlU2lkZUVmZmVjdHMgfHwgZGVidWdSZW5kZXJQaGFzZVNpZGVFZmZlY3RzRm9yU3RyaWN0TW9kZSAmJiB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgICAgICAgICBfcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBuZXh0U3RhdGUgPSBfcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG4gICAgICAgICAge1xuICAgICAgICAgICAgZXhpdERpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXh0U3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3RhdGUgb2JqZWN0XG4gICAgICAgIHJldHVybiBfcGF5bG9hZDtcbiAgICAgIH1cbiAgICBjYXNlIENhcHR1cmVVcGRhdGU6XG4gICAgICB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyA9IHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcbiAgICAgIH1cbiAgICAvLyBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaFxuICAgIGNhc2UgVXBkYXRlU3RhdGU6XG4gICAgICB7XG4gICAgICAgIHZhciBfcGF5bG9hZDIgPSB1cGRhdGUucGF5bG9hZDtcbiAgICAgICAgdmFyIHBhcnRpYWxTdGF0ZSA9IHZvaWQgMDtcbiAgICAgICAgaWYgKHR5cGVvZiBfcGF5bG9hZDIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBVcGRhdGVyIGZ1bmN0aW9uXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgICAgaWYgKGRlYnVnUmVuZGVyUGhhc2VTaWRlRWZmZWN0cyB8fCBkZWJ1Z1JlbmRlclBoYXNlU2lkZUVmZmVjdHNGb3JTdHJpY3RNb2RlICYmIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICAgICAgICAgIF9wYXlsb2FkMi5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhcnRpYWxTdGF0ZSA9IF9wYXlsb2FkMi5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG4gICAgICAgICAge1xuICAgICAgICAgICAgZXhpdERpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFBhcnRpYWwgc3RhdGUgb2JqZWN0XG4gICAgICAgICAgcGFydGlhbFN0YXRlID0gX3BheWxvYWQyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0aWFsU3RhdGUgPT09IG51bGwgfHwgcGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBOdWxsIGFuZCB1bmRlZmluZWQgYXJlIHRyZWF0ZWQgYXMgbm8tb3BzLlxuICAgICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWVyZ2UgdGhlIHBhcnRpYWwgc3RhdGUgYW5kIHRoZSBwcmV2aW91cyBzdGF0ZS5cbiAgICAgICAgcmV0dXJuIF9hc3NpZ24oe30sIHByZXZTdGF0ZSwgcGFydGlhbFN0YXRlKTtcbiAgICAgIH1cbiAgICBjYXNlIEZvcmNlVXBkYXRlOlxuICAgICAge1xuICAgICAgICBoYXNGb3JjZVVwZGF0ZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIHByZXZTdGF0ZTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgcHJvcHMsIGluc3RhbmNlLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xuXG4gIHF1ZXVlID0gZW5zdXJlV29ya0luUHJvZ3Jlc3NRdWV1ZUlzQUNsb25lKHdvcmtJblByb2dyZXNzLCBxdWV1ZSk7XG5cbiAge1xuICAgIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IHF1ZXVlO1xuICB9XG5cbiAgLy8gVGhlc2UgdmFsdWVzIG1heSBjaGFuZ2UgYXMgd2UgcHJvY2VzcyB0aGUgcXVldWUuXG4gIHZhciBuZXdCYXNlU3RhdGUgPSBxdWV1ZS5iYXNlU3RhdGU7XG4gIHZhciBuZXdGaXJzdFVwZGF0ZSA9IG51bGw7XG4gIHZhciBuZXdFeHBpcmF0aW9uVGltZSA9IE5vV29yaztcblxuICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGxpc3Qgb2YgdXBkYXRlcyB0byBjb21wdXRlIHRoZSByZXN1bHQuXG4gIHZhciB1cGRhdGUgPSBxdWV1ZS5maXJzdFVwZGF0ZTtcbiAgdmFyIHJlc3VsdFN0YXRlID0gbmV3QmFzZVN0YXRlO1xuICB3aGlsZSAodXBkYXRlICE9PSBudWxsKSB7XG4gICAgdmFyIHVwZGF0ZUV4cGlyYXRpb25UaW1lID0gdXBkYXRlLmV4cGlyYXRpb25UaW1lO1xuICAgIGlmICh1cGRhdGVFeHBpcmF0aW9uVGltZSA8IHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAvLyBUaGlzIHVwZGF0ZSBkb2VzIG5vdCBoYXZlIHN1ZmZpY2llbnQgcHJpb3JpdHkuIFNraXAgaXQuXG4gICAgICBpZiAobmV3Rmlyc3RVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3Qgc2tpcHBlZCB1cGRhdGUuIEl0IHdpbGwgYmUgdGhlIGZpcnN0IHVwZGF0ZSBpblxuICAgICAgICAvLyB0aGUgbmV3IGxpc3QuXG4gICAgICAgIG5ld0ZpcnN0VXBkYXRlID0gdXBkYXRlO1xuICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUgdGhhdCB3YXMgc2tpcHBlZCwgdGhlIGN1cnJlbnQgcmVzdWx0XG4gICAgICAgIC8vIGlzIHRoZSBuZXcgYmFzZSBzdGF0ZS5cbiAgICAgICAgbmV3QmFzZVN0YXRlID0gcmVzdWx0U3RhdGU7XG4gICAgICB9XG4gICAgICAvLyBTaW5jZSB0aGlzIHVwZGF0ZSB3aWxsIHJlbWFpbiBpbiB0aGUgbGlzdCwgdXBkYXRlIHRoZSByZW1haW5pbmdcbiAgICAgIC8vIGV4cGlyYXRpb24gdGltZS5cbiAgICAgIGlmIChuZXdFeHBpcmF0aW9uVGltZSA8IHVwZGF0ZUV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgIG5ld0V4cGlyYXRpb25UaW1lID0gdXBkYXRlRXhwaXJhdGlvblRpbWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgdXBkYXRlIGRvZXMgaGF2ZSBzdWZmaWNpZW50IHByaW9yaXR5LiBQcm9jZXNzIGl0IGFuZCBjb21wdXRlXG4gICAgICAvLyBhIG5ldyByZXN1bHQuXG4gICAgICByZXN1bHRTdGF0ZSA9IGdldFN0YXRlRnJvbVVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgcXVldWUsIHVwZGF0ZSwgcmVzdWx0U3RhdGUsIHByb3BzLCBpbnN0YW5jZSk7XG4gICAgICB2YXIgX2NhbGxiYWNrID0gdXBkYXRlLmNhbGxiYWNrO1xuICAgICAgaWYgKF9jYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gQ2FsbGJhY2s7XG4gICAgICAgIC8vIFNldCB0aGlzIHRvIG51bGwsIGluIGNhc2UgaXQgd2FzIG11dGF0ZWQgZHVyaW5nIGFuIGFib3J0ZWQgcmVuZGVyLlxuICAgICAgICB1cGRhdGUubmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICAgIGlmIChxdWV1ZS5sYXN0RWZmZWN0ID09PSBudWxsKSB7XG4gICAgICAgICAgcXVldWUuZmlyc3RFZmZlY3QgPSBxdWV1ZS5sYXN0RWZmZWN0ID0gdXBkYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHF1ZXVlLmxhc3RFZmZlY3QubmV4dEVmZmVjdCA9IHVwZGF0ZTtcbiAgICAgICAgICBxdWV1ZS5sYXN0RWZmZWN0ID0gdXBkYXRlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIENvbnRpbnVlIHRvIHRoZSBuZXh0IHVwZGF0ZS5cbiAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcbiAgfVxuXG4gIC8vIFNlcGFyYXRlbHksIGl0ZXJhdGUgdGhvdWdoIHRoZSBsaXN0IG9mIGNhcHR1cmVkIHVwZGF0ZXMuXG4gIHZhciBuZXdGaXJzdENhcHR1cmVkVXBkYXRlID0gbnVsbDtcbiAgdXBkYXRlID0gcXVldWUuZmlyc3RDYXB0dXJlZFVwZGF0ZTtcbiAgd2hpbGUgKHVwZGF0ZSAhPT0gbnVsbCkge1xuICAgIHZhciBfdXBkYXRlRXhwaXJhdGlvblRpbWUgPSB1cGRhdGUuZXhwaXJhdGlvblRpbWU7XG4gICAgaWYgKF91cGRhdGVFeHBpcmF0aW9uVGltZSA8IHJlbmRlckV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAvLyBUaGlzIHVwZGF0ZSBkb2VzIG5vdCBoYXZlIHN1ZmZpY2llbnQgcHJpb3JpdHkuIFNraXAgaXQuXG4gICAgICBpZiAobmV3Rmlyc3RDYXB0dXJlZFVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBza2lwcGVkIGNhcHR1cmVkIHVwZGF0ZS4gSXQgd2lsbCBiZSB0aGUgZmlyc3RcbiAgICAgICAgLy8gdXBkYXRlIGluIHRoZSBuZXcgbGlzdC5cbiAgICAgICAgbmV3Rmlyc3RDYXB0dXJlZFVwZGF0ZSA9IHVwZGF0ZTtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlIHRoYXQgd2FzIHNraXBwZWQsIHRoZSBjdXJyZW50IHJlc3VsdCBpc1xuICAgICAgICAvLyB0aGUgbmV3IGJhc2Ugc3RhdGUuXG4gICAgICAgIGlmIChuZXdGaXJzdFVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIG5ld0Jhc2VTdGF0ZSA9IHJlc3VsdFN0YXRlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTaW5jZSB0aGlzIHVwZGF0ZSB3aWxsIHJlbWFpbiBpbiB0aGUgbGlzdCwgdXBkYXRlIHRoZSByZW1haW5pbmdcbiAgICAgIC8vIGV4cGlyYXRpb24gdGltZS5cbiAgICAgIGlmIChuZXdFeHBpcmF0aW9uVGltZSA8IF91cGRhdGVFeHBpcmF0aW9uVGltZSkge1xuICAgICAgICBuZXdFeHBpcmF0aW9uVGltZSA9IF91cGRhdGVFeHBpcmF0aW9uVGltZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyB1cGRhdGUgZG9lcyBoYXZlIHN1ZmZpY2llbnQgcHJpb3JpdHkuIFByb2Nlc3MgaXQgYW5kIGNvbXB1dGVcbiAgICAgIC8vIGEgbmV3IHJlc3VsdC5cbiAgICAgIHJlc3VsdFN0YXRlID0gZ2V0U3RhdGVGcm9tVXBkYXRlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgdXBkYXRlLCByZXN1bHRTdGF0ZSwgcHJvcHMsIGluc3RhbmNlKTtcbiAgICAgIHZhciBfY2FsbGJhY2syID0gdXBkYXRlLmNhbGxiYWNrO1xuICAgICAgaWYgKF9jYWxsYmFjazIgIT09IG51bGwpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnIHw9IENhbGxiYWNrO1xuICAgICAgICAvLyBTZXQgdGhpcyB0byBudWxsLCBpbiBjYXNlIGl0IHdhcyBtdXRhdGVkIGR1cmluZyBhbiBhYm9ydGVkIHJlbmRlci5cbiAgICAgICAgdXBkYXRlLm5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgICBpZiAocXVldWUubGFzdENhcHR1cmVkRWZmZWN0ID09PSBudWxsKSB7XG4gICAgICAgICAgcXVldWUuZmlyc3RDYXB0dXJlZEVmZmVjdCA9IHF1ZXVlLmxhc3RDYXB0dXJlZEVmZmVjdCA9IHVwZGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBxdWV1ZS5sYXN0Q2FwdHVyZWRFZmZlY3QubmV4dEVmZmVjdCA9IHVwZGF0ZTtcbiAgICAgICAgICBxdWV1ZS5sYXN0Q2FwdHVyZWRFZmZlY3QgPSB1cGRhdGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gIH1cblxuICBpZiAobmV3Rmlyc3RVcGRhdGUgPT09IG51bGwpIHtcbiAgICBxdWV1ZS5sYXN0VXBkYXRlID0gbnVsbDtcbiAgfVxuICBpZiAobmV3Rmlyc3RDYXB0dXJlZFVwZGF0ZSA9PT0gbnVsbCkge1xuICAgIHF1ZXVlLmxhc3RDYXB0dXJlZFVwZGF0ZSA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnIHw9IENhbGxiYWNrO1xuICB9XG4gIGlmIChuZXdGaXJzdFVwZGF0ZSA9PT0gbnVsbCAmJiBuZXdGaXJzdENhcHR1cmVkVXBkYXRlID09PSBudWxsKSB7XG4gICAgLy8gV2UgcHJvY2Vzc2VkIGV2ZXJ5IHVwZGF0ZSwgd2l0aG91dCBza2lwcGluZy4gVGhhdCBtZWFucyB0aGUgbmV3IGJhc2VcbiAgICAvLyBzdGF0ZSBpcyB0aGUgc2FtZSBhcyB0aGUgcmVzdWx0IHN0YXRlLlxuICAgIG5ld0Jhc2VTdGF0ZSA9IHJlc3VsdFN0YXRlO1xuICB9XG5cbiAgcXVldWUuYmFzZVN0YXRlID0gbmV3QmFzZVN0YXRlO1xuICBxdWV1ZS5maXJzdFVwZGF0ZSA9IG5ld0ZpcnN0VXBkYXRlO1xuICBxdWV1ZS5maXJzdENhcHR1cmVkVXBkYXRlID0gbmV3Rmlyc3RDYXB0dXJlZFVwZGF0ZTtcblxuICAvLyBTZXQgdGhlIHJlbWFpbmluZyBleHBpcmF0aW9uIHRpbWUgdG8gYmUgd2hhdGV2ZXIgaXMgcmVtYWluaW5nIGluIHRoZSBxdWV1ZS5cbiAgLy8gVGhpcyBzaG91bGQgYmUgZmluZSBiZWNhdXNlIHRoZSBvbmx5IHR3byBvdGhlciB0aGluZ3MgdGhhdCBjb250cmlidXRlIHRvXG4gIC8vIGV4cGlyYXRpb24gdGltZSBhcmUgcHJvcHMgYW5kIGNvbnRleHQuIFdlJ3JlIGFscmVhZHkgaW4gdGhlIG1pZGRsZSBvZiB0aGVcbiAgLy8gYmVnaW4gcGhhc2UgYnkgdGhlIHRpbWUgd2Ugc3RhcnQgcHJvY2Vzc2luZyB0aGUgcXVldWUsIHNvIHdlJ3ZlIGFscmVhZHlcbiAgLy8gZGVhbHQgd2l0aCB0aGUgcHJvcHMuIENvbnRleHQgaW4gY29tcG9uZW50cyB0aGF0IHNwZWNpZnlcbiAgLy8gc2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIHRyaWNreTsgYnV0IHdlJ2xsIGhhdmUgdG8gYWNjb3VudCBmb3JcbiAgLy8gdGhhdCByZWdhcmRsZXNzLlxuICB3b3JrSW5Qcm9ncmVzcy5leHBpcmF0aW9uVGltZSA9IG5ld0V4cGlyYXRpb25UaW1lO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gcmVzdWx0U3RhdGU7XG5cbiAge1xuICAgIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICEodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSA/IGludmFyaWFudChmYWxzZSwgJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIGFzIGNhbGxiYWNrLiBFeHBlY3RlZCBhIGZ1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcycsIGNhbGxiYWNrKSA6IHZvaWQgMDtcbiAgY2FsbGJhY2suY2FsbChjb250ZXh0KTtcbn1cblxuZnVuY3Rpb24gcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKSB7XG4gIGhhc0ZvcmNlVXBkYXRlID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSB7XG4gIHJldHVybiBoYXNGb3JjZVVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFF1ZXVlLCBpbnN0YW5jZSwgcmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgLy8gSWYgdGhlIGZpbmlzaGVkIHJlbmRlciBpbmNsdWRlZCBjYXB0dXJlZCB1cGRhdGVzLCBhbmQgdGhlcmUgYXJlIHN0aWxsXG4gIC8vIGxvd2VyIHByaW9yaXR5IHVwZGF0ZXMgbGVmdCBvdmVyLCB3ZSBuZWVkIHRvIGtlZXAgdGhlIGNhcHR1cmVkIHVwZGF0ZXNcbiAgLy8gaW4gdGhlIHF1ZXVlIHNvIHRoYXQgdGhleSBhcmUgcmViYXNlZCBhbmQgbm90IGRyb3BwZWQgb25jZSB3ZSBwcm9jZXNzIHRoZVxuICAvLyBxdWV1ZSBhZ2FpbiBhdCB0aGUgbG93ZXIgcHJpb3JpdHkuXG4gIGlmIChmaW5pc2hlZFF1ZXVlLmZpcnN0Q2FwdHVyZWRVcGRhdGUgIT09IG51bGwpIHtcbiAgICAvLyBKb2luIHRoZSBjYXB0dXJlZCB1cGRhdGUgbGlzdCB0byB0aGUgZW5kIG9mIHRoZSBub3JtYWwgbGlzdC5cbiAgICBpZiAoZmluaXNoZWRRdWV1ZS5sYXN0VXBkYXRlICE9PSBudWxsKSB7XG4gICAgICBmaW5pc2hlZFF1ZXVlLmxhc3RVcGRhdGUubmV4dCA9IGZpbmlzaGVkUXVldWUuZmlyc3RDYXB0dXJlZFVwZGF0ZTtcbiAgICAgIGZpbmlzaGVkUXVldWUubGFzdFVwZGF0ZSA9IGZpbmlzaGVkUXVldWUubGFzdENhcHR1cmVkVXBkYXRlO1xuICAgIH1cbiAgICAvLyBDbGVhciB0aGUgbGlzdCBvZiBjYXB0dXJlZCB1cGRhdGVzLlxuICAgIGZpbmlzaGVkUXVldWUuZmlyc3RDYXB0dXJlZFVwZGF0ZSA9IGZpbmlzaGVkUXVldWUubGFzdENhcHR1cmVkVXBkYXRlID0gbnVsbDtcbiAgfVxuXG4gIC8vIENvbW1pdCB0aGUgZWZmZWN0c1xuICBjb21taXRVcGRhdGVFZmZlY3RzKGZpbmlzaGVkUXVldWUuZmlyc3RFZmZlY3QsIGluc3RhbmNlKTtcbiAgZmluaXNoZWRRdWV1ZS5maXJzdEVmZmVjdCA9IGZpbmlzaGVkUXVldWUubGFzdEVmZmVjdCA9IG51bGw7XG5cbiAgY29tbWl0VXBkYXRlRWZmZWN0cyhmaW5pc2hlZFF1ZXVlLmZpcnN0Q2FwdHVyZWRFZmZlY3QsIGluc3RhbmNlKTtcbiAgZmluaXNoZWRRdWV1ZS5maXJzdENhcHR1cmVkRWZmZWN0ID0gZmluaXNoZWRRdWV1ZS5sYXN0Q2FwdHVyZWRFZmZlY3QgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21taXRVcGRhdGVFZmZlY3RzKGVmZmVjdCwgaW5zdGFuY2UpIHtcbiAgd2hpbGUgKGVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBfY2FsbGJhY2szID0gZWZmZWN0LmNhbGxiYWNrO1xuICAgIGlmIChfY2FsbGJhY2szICE9PSBudWxsKSB7XG4gICAgICBlZmZlY3QuY2FsbGJhY2sgPSBudWxsO1xuICAgICAgY2FsbENhbGxiYWNrKF9jYWxsYmFjazMsIGluc3RhbmNlKTtcbiAgICB9XG4gICAgZWZmZWN0ID0gZWZmZWN0Lm5leHRFZmZlY3Q7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2FwdHVyZWRWYWx1ZSh2YWx1ZSwgc291cmNlKSB7XG4gIC8vIElmIHRoZSB2YWx1ZSBpcyBhbiBlcnJvciwgY2FsbCB0aGlzIGZ1bmN0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIGl0IGlzIHRocm93blxuICAvLyBzbyB0aGUgc3RhY2sgaXMgYWNjdXJhdGUuXG4gIHJldHVybiB7XG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIHNvdXJjZTogc291cmNlLFxuICAgIHN0YWNrOiBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2Qoc291cmNlKVxuICB9O1xufVxuXG5mdW5jdGlvbiBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKSB7XG4gIC8vIFRhZyB0aGUgZmliZXIgd2l0aCBhbiB1cGRhdGUgZWZmZWN0LiBUaGlzIHR1cm5zIGEgUGxhY2VtZW50IGludG9cbiAgLy8gYSBQbGFjZW1lbnRBbmRVcGRhdGUuXG4gIHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBVcGRhdGU7XG59XG5cbmZ1bmN0aW9uIG1hcmtSZWYkMSh3b3JrSW5Qcm9ncmVzcykge1xuICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gUmVmO1xufVxuXG52YXIgYXBwZW5kQWxsQ2hpbGRyZW4gPSB2b2lkIDA7XG52YXIgdXBkYXRlSG9zdENvbnRhaW5lciA9IHZvaWQgMDtcbnZhciB1cGRhdGVIb3N0Q29tcG9uZW50JDEgPSB2b2lkIDA7XG52YXIgdXBkYXRlSG9zdFRleHQkMSA9IHZvaWQgMDtcbmlmIChzdXBwb3J0c011dGF0aW9uKSB7XG4gIC8vIE11dGF0aW9uIG1vZGVcblxuICBhcHBlbmRBbGxDaGlsZHJlbiA9IGZ1bmN0aW9uIChwYXJlbnQsIHdvcmtJblByb2dyZXNzLCBuZWVkc1Zpc2liaWxpdHlUb2dnbGUsIGlzSGlkZGVuKSB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgY3JlYXRlZCBidXQgd2UgbmVlZCByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIHZhciBub2RlID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgICAgYXBwZW5kSW5pdGlhbENoaWxkKHBhcmVudCwgbm9kZS5zdGF0ZU5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgcG9ydGFsIGNoaWxkLCB0aGVuIHdlIGRvbid0IHdhbnQgdG8gdHJhdmVyc2VcbiAgICAgICAgLy8gZG93biBpdHMgY2hpbGRyZW4uIEluc3RlYWQsIHdlJ2xsIGdldCBpbnNlcnRpb25zIGZyb20gZWFjaCBjaGlsZCBpblxuICAgICAgICAvLyB0aGUgcG9ydGFsIGRpcmVjdGx5LlxuICAgICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUgPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfTtcblxuICB1cGRhdGVIb3N0Q29udGFpbmVyID0gZnVuY3Rpb24gKHdvcmtJblByb2dyZXNzKSB7XG4gICAgLy8gTm9vcFxuICB9O1xuICB1cGRhdGVIb3N0Q29tcG9uZW50JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGFuIGFsdGVybmF0ZSwgdGhhdCBtZWFucyB0aGlzIGlzIGFuIHVwZGF0ZSBhbmQgd2UgbmVlZCB0b1xuICAgIC8vIHNjaGVkdWxlIGEgc2lkZS1lZmZlY3QgdG8gZG8gdGhlIHVwZGF0ZXMuXG4gICAgdmFyIG9sZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICAgIGlmIChvbGRQcm9wcyA9PT0gbmV3UHJvcHMpIHtcbiAgICAgIC8vIEluIG11dGF0aW9uIG1vZGUsIHRoaXMgaXMgc3VmZmljaWVudCBmb3IgYSBiYWlsb3V0IGJlY2F1c2VcbiAgICAgIC8vIHdlIHdvbid0IHRvdWNoIHRoaXMgbm9kZSBldmVuIGlmIGNoaWxkcmVuIGNoYW5nZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgZ2V0IHVwZGF0ZWQgYmVjYXVzZSBvbmUgb2Ygb3VyIGNoaWxkcmVuIHVwZGF0ZWQsIHdlIGRvbid0XG4gICAgLy8gaGF2ZSBuZXdQcm9wcyBzbyB3ZSdsbCBoYXZlIHRvIHJldXNlIHRoZW0uXG4gICAgLy8gVE9ETzogU3BsaXQgdGhlIHVwZGF0ZSBBUEkgYXMgc2VwYXJhdGUgZm9yIHRoZSBwcm9wcyB2cy4gY2hpbGRyZW4uXG4gICAgLy8gRXZlbiBiZXR0ZXIgd291bGQgYmUgaWYgY2hpbGRyZW4gd2VyZW4ndCBzcGVjaWFsIGNhc2VkIGF0IGFsbCB0aG8uXG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgIHZhciBjdXJyZW50SG9zdENvbnRleHQgPSBnZXRIb3N0Q29udGV4dCgpO1xuICAgIC8vIFRPRE86IEV4cGVyaWVuY2luZyBhbiBlcnJvciB3aGVyZSBvbGRQcm9wcyBpcyBudWxsLiBTdWdnZXN0cyBhIGhvc3RcbiAgICAvLyBjb21wb25lbnQgaXMgaGl0dGluZyB0aGUgcmVzdW1lIHBhdGguIEZpZ3VyZSBvdXQgd2h5LiBQb3NzaWJseVxuICAgIC8vIHJlbGF0ZWQgdG8gYGhpZGRlbmAuXG4gICAgdmFyIHVwZGF0ZVBheWxvYWQgPSBwcmVwYXJlVXBkYXRlKGluc3RhbmNlLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0KTtcbiAgICAvLyBUT0RPOiBUeXBlIHRoaXMgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGNvbXBvbmVudC5cbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IHVwZGF0ZVBheWxvYWQ7XG4gICAgLy8gSWYgdGhlIHVwZGF0ZSBwYXlsb2FkIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEgY2hhbmdlIG9yIGlmIHRoZXJlXG4gICAgLy8gaXMgYSBuZXcgcmVmIHdlIG1hcmsgdGhpcyBhcyBhbiB1cGRhdGUuIEFsbCB0aGUgd29yayBpcyBkb25lIGluIGNvbW1pdFdvcmsuXG4gICAgaWYgKHVwZGF0ZVBheWxvYWQpIHtcbiAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfTtcbiAgdXBkYXRlSG9zdFRleHQkMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgb2xkVGV4dCwgbmV3VGV4dCkge1xuICAgIC8vIElmIHRoZSB0ZXh0IGRpZmZlcnMsIG1hcmsgaXQgYXMgYW4gdXBkYXRlLiBBbGwgdGhlIHdvcmsgaW4gZG9uZSBpbiBjb21taXRXb3JrLlxuICAgIGlmIChvbGRUZXh0ICE9PSBuZXdUZXh0KSB7XG4gICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG4gIH07XG59IGVsc2UgaWYgKHN1cHBvcnRzUGVyc2lzdGVuY2UpIHtcbiAgLy8gUGVyc2lzdGVudCBob3N0IHRyZWUgbW9kZVxuXG4gIGFwcGVuZEFsbENoaWxkcmVuID0gZnVuY3Rpb24gKHBhcmVudCwgd29ya0luUHJvZ3Jlc3MsIG5lZWRzVmlzaWJpbGl0eVRvZ2dsZSwgaXNIaWRkZW4pIHtcbiAgICAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBjcmVhdGVkIGJ1dCB3ZSBuZWVkIHJlY3Vyc2UgZG93biBpdHNcbiAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gICAgdmFyIG5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxhYmVsc1xuICAgICAgYnJhbmNoZXM6IGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBub2RlLnN0YXRlTm9kZTtcbiAgICAgICAgaWYgKG5lZWRzVmlzaWJpbGl0eVRvZ2dsZSkge1xuICAgICAgICAgIHZhciBwcm9wcyA9IG5vZGUubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICB2YXIgdHlwZSA9IG5vZGUudHlwZTtcbiAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgIC8vIFRoaXMgY2hpbGQgaXMgaW5zaWRlIGEgdGltZWQgb3V0IHRyZWUuIEhpZGUgaXQuXG4gICAgICAgICAgICBpbnN0YW5jZSA9IGNsb25lSGlkZGVuSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzLCBub2RlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhpcyBjaGlsZCB3YXMgcHJldmlvdXNseSBpbnNpZGUgYSB0aW1lZCBvdXQgdHJlZS4gSWYgaXQgd2FzIG5vdFxuICAgICAgICAgICAgLy8gdXBkYXRlZCBkdXJpbmcgdGhpcyByZW5kZXIsIGl0IG1heSBuZWVkIHRvIGJlIHVuaGlkZGVuLiBDbG9uZVxuICAgICAgICAgICAgLy8gYWdhaW4gdG8gYmUgc3VyZS5cbiAgICAgICAgICAgIGluc3RhbmNlID0gY2xvbmVVbmhpZGRlbkluc3RhbmNlKGluc3RhbmNlLCB0eXBlLCBwcm9wcywgbm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vZGUuc3RhdGVOb2RlID0gaW5zdGFuY2U7XG4gICAgICAgIH1cbiAgICAgICAgYXBwZW5kSW5pdGlhbENoaWxkKHBhcmVudCwgaW5zdGFuY2UpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgICAgdmFyIF9pbnN0YW5jZSA9IG5vZGUuc3RhdGVOb2RlO1xuICAgICAgICBpZiAobmVlZHNWaXNpYmlsaXR5VG9nZ2xlKSB7XG4gICAgICAgICAgdmFyIHRleHQgPSBub2RlLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgdmFyIHJvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG4gICAgICAgICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7XG4gICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICBfaW5zdGFuY2UgPSBjcmVhdGVIaWRkZW5UZXh0SW5zdGFuY2UodGV4dCwgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX2luc3RhbmNlID0gY3JlYXRlVGV4dEluc3RhbmNlKHRleHQsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vZGUuc3RhdGVOb2RlID0gX2luc3RhbmNlO1xuICAgICAgICB9XG4gICAgICAgIGFwcGVuZEluaXRpYWxDaGlsZChwYXJlbnQsIF9pbnN0YW5jZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSBwb3J0YWwgY2hpbGQsIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byB0cmF2ZXJzZVxuICAgICAgICAvLyBkb3duIGl0cyBjaGlsZHJlbi4gSW5zdGVhZCwgd2UnbGwgZ2V0IGluc2VydGlvbnMgZnJvbSBlYWNoIGNoaWxkIGluXG4gICAgICAgIC8vIHRoZSBwb3J0YWwgZGlyZWN0bHkuXG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgICB2YXIgY3VycmVudCA9IG5vZGUuYWx0ZXJuYXRlO1xuICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBvbGRTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgbmV3U3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIG9sZElzSGlkZGVuID0gb2xkU3RhdGUgIT09IG51bGw7XG4gICAgICAgICAgdmFyIG5ld0lzSGlkZGVuID0gbmV3U3RhdGUgIT09IG51bGw7XG4gICAgICAgICAgaWYgKG9sZElzSGlkZGVuICE9PSBuZXdJc0hpZGRlbikge1xuICAgICAgICAgICAgLy8gVGhlIHBsYWNlaG9sZGVyIGVpdGhlciBqdXN0IHRpbWVkIG91dCBvciBzd2l0Y2hlZCBiYWNrIHRvIHRoZSBub3JtYWxcbiAgICAgICAgICAgIC8vIGNoaWxkcmVuIGFmdGVyIGhhdmluZyBwcmV2aW91c2x5IHRpbWVkIG91dC4gVG9nZ2xlIHRoZSB2aXNpYmlsaXR5IG9mXG4gICAgICAgICAgICAvLyB0aGUgZGlyZWN0IGhvc3QgY2hpbGRyZW4uXG4gICAgICAgICAgICB2YXIgcHJpbWFyeUNoaWxkUGFyZW50ID0gbmV3SXNIaWRkZW4gPyBub2RlLmNoaWxkIDogbm9kZTtcbiAgICAgICAgICAgIGlmIChwcmltYXJ5Q2hpbGRQYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgYXBwZW5kQWxsQ2hpbGRyZW4ocGFyZW50LCBwcmltYXJ5Q2hpbGRQYXJlbnQsIHRydWUsIG5ld0lzSGlkZGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sYWJlbHNcbiAgICAgICAgICAgIGJyZWFrIGJyYW5jaGVzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIENvbnRpbnVlIHRyYXZlcnNpbmcgbGlrZSBub3JtYWxcbiAgICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBjb3JyZWN0IGJ1dCBGbG93IGlzIGNvbmZ1c2VkIGJ5IHRoZSBsYWJlbGVkIGJyZWFrLlxuICAgICAgbm9kZSA9IG5vZGU7XG4gICAgICBpZiAobm9kZSA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cbiAgICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgfVxuICB9O1xuXG4gIC8vIEFuIHVuZm9ydHVuYXRlIGZvcmsgb2YgYXBwZW5kQWxsQ2hpbGRyZW4gYmVjYXVzZSB3ZSBoYXZlIHR3byBkaWZmZXJlbnQgcGFyZW50IHR5cGVzLlxuICB2YXIgYXBwZW5kQWxsQ2hpbGRyZW5Ub0NvbnRhaW5lciA9IGZ1bmN0aW9uIChjb250YWluZXJDaGlsZFNldCwgd29ya0luUHJvZ3Jlc3MsIG5lZWRzVmlzaWJpbGl0eVRvZ2dsZSwgaXNIaWRkZW4pIHtcbiAgICAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBjcmVhdGVkIGJ1dCB3ZSBuZWVkIHJlY3Vyc2UgZG93biBpdHNcbiAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gICAgdmFyIG5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxhYmVsc1xuICAgICAgYnJhbmNoZXM6IGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBub2RlLnN0YXRlTm9kZTtcbiAgICAgICAgaWYgKG5lZWRzVmlzaWJpbGl0eVRvZ2dsZSkge1xuICAgICAgICAgIHZhciBwcm9wcyA9IG5vZGUubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICB2YXIgdHlwZSA9IG5vZGUudHlwZTtcbiAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgIC8vIFRoaXMgY2hpbGQgaXMgaW5zaWRlIGEgdGltZWQgb3V0IHRyZWUuIEhpZGUgaXQuXG4gICAgICAgICAgICBpbnN0YW5jZSA9IGNsb25lSGlkZGVuSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzLCBub2RlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhpcyBjaGlsZCB3YXMgcHJldmlvdXNseSBpbnNpZGUgYSB0aW1lZCBvdXQgdHJlZS4gSWYgaXQgd2FzIG5vdFxuICAgICAgICAgICAgLy8gdXBkYXRlZCBkdXJpbmcgdGhpcyByZW5kZXIsIGl0IG1heSBuZWVkIHRvIGJlIHVuaGlkZGVuLiBDbG9uZVxuICAgICAgICAgICAgLy8gYWdhaW4gdG8gYmUgc3VyZS5cbiAgICAgICAgICAgIGluc3RhbmNlID0gY2xvbmVVbmhpZGRlbkluc3RhbmNlKGluc3RhbmNlLCB0eXBlLCBwcm9wcywgbm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vZGUuc3RhdGVOb2RlID0gaW5zdGFuY2U7XG4gICAgICAgIH1cbiAgICAgICAgYXBwZW5kQ2hpbGRUb0NvbnRhaW5lckNoaWxkU2V0KGNvbnRhaW5lckNoaWxkU2V0LCBpbnN0YW5jZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICB2YXIgX2luc3RhbmNlMiA9IG5vZGUuc3RhdGVOb2RlO1xuICAgICAgICBpZiAobmVlZHNWaXNpYmlsaXR5VG9nZ2xlKSB7XG4gICAgICAgICAgdmFyIHRleHQgPSBub2RlLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgdmFyIHJvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG4gICAgICAgICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7XG4gICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICBfaW5zdGFuY2UyID0gY3JlYXRlSGlkZGVuVGV4dEluc3RhbmNlKHRleHQsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9pbnN0YW5jZTIgPSBjcmVhdGVUZXh0SW5zdGFuY2UodGV4dCwgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZS5zdGF0ZU5vZGUgPSBfaW5zdGFuY2UyO1xuICAgICAgICB9XG4gICAgICAgIGFwcGVuZENoaWxkVG9Db250YWluZXJDaGlsZFNldChjb250YWluZXJDaGlsZFNldCwgX2luc3RhbmNlMik7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSBwb3J0YWwgY2hpbGQsIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byB0cmF2ZXJzZVxuICAgICAgICAvLyBkb3duIGl0cyBjaGlsZHJlbi4gSW5zdGVhZCwgd2UnbGwgZ2V0IGluc2VydGlvbnMgZnJvbSBlYWNoIGNoaWxkIGluXG4gICAgICAgIC8vIHRoZSBwb3J0YWwgZGlyZWN0bHkuXG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgICB2YXIgY3VycmVudCA9IG5vZGUuYWx0ZXJuYXRlO1xuICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBvbGRTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgbmV3U3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIG9sZElzSGlkZGVuID0gb2xkU3RhdGUgIT09IG51bGw7XG4gICAgICAgICAgdmFyIG5ld0lzSGlkZGVuID0gbmV3U3RhdGUgIT09IG51bGw7XG4gICAgICAgICAgaWYgKG9sZElzSGlkZGVuICE9PSBuZXdJc0hpZGRlbikge1xuICAgICAgICAgICAgLy8gVGhlIHBsYWNlaG9sZGVyIGVpdGhlciBqdXN0IHRpbWVkIG91dCBvciBzd2l0Y2hlZCBiYWNrIHRvIHRoZSBub3JtYWxcbiAgICAgICAgICAgIC8vIGNoaWxkcmVuIGFmdGVyIGhhdmluZyBwcmV2aW91c2x5IHRpbWVkIG91dC4gVG9nZ2xlIHRoZSB2aXNpYmlsaXR5IG9mXG4gICAgICAgICAgICAvLyB0aGUgZGlyZWN0IGhvc3QgY2hpbGRyZW4uXG4gICAgICAgICAgICB2YXIgcHJpbWFyeUNoaWxkUGFyZW50ID0gbmV3SXNIaWRkZW4gPyBub2RlLmNoaWxkIDogbm9kZTtcbiAgICAgICAgICAgIGlmIChwcmltYXJ5Q2hpbGRQYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgYXBwZW5kQWxsQ2hpbGRyZW5Ub0NvbnRhaW5lcihjb250YWluZXJDaGlsZFNldCwgcHJpbWFyeUNoaWxkUGFyZW50LCB0cnVlLCBuZXdJc0hpZGRlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbGFiZWxzXG4gICAgICAgICAgICBicmVhayBicmFuY2hlcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBDb250aW51ZSB0cmF2ZXJzaW5nIGxpa2Ugbm9ybWFsXG4gICAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgaXMgY29ycmVjdCBidXQgRmxvdyBpcyBjb25mdXNlZCBieSB0aGUgbGFiZWxlZCBicmVhay5cbiAgICAgIG5vZGUgPSBub2RlO1xuICAgICAgaWYgKG5vZGUgPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfTtcbiAgdXBkYXRlSG9zdENvbnRhaW5lciA9IGZ1bmN0aW9uICh3b3JrSW5Qcm9ncmVzcykge1xuICAgIHZhciBwb3J0YWxPclJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgdmFyIGNoaWxkcmVuVW5jaGFuZ2VkID0gd29ya0luUHJvZ3Jlc3MuZmlyc3RFZmZlY3QgPT09IG51bGw7XG4gICAgaWYgKGNoaWxkcmVuVW5jaGFuZ2VkKSB7XG4gICAgICAvLyBObyBjaGFuZ2VzLCBqdXN0IHJldXNlIHRoZSBleGlzdGluZyBpbnN0YW5jZS5cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGNvbnRhaW5lciA9IHBvcnRhbE9yUm9vdC5jb250YWluZXJJbmZvO1xuICAgICAgdmFyIG5ld0NoaWxkU2V0ID0gY3JlYXRlQ29udGFpbmVyQ2hpbGRTZXQoY29udGFpbmVyKTtcbiAgICAgIC8vIElmIGNoaWxkcmVuIG1pZ2h0IGhhdmUgY2hhbmdlZCwgd2UgaGF2ZSB0byBhZGQgdGhlbSBhbGwgdG8gdGhlIHNldC5cbiAgICAgIGFwcGVuZEFsbENoaWxkcmVuVG9Db250YWluZXIobmV3Q2hpbGRTZXQsIHdvcmtJblByb2dyZXNzLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgcG9ydGFsT3JSb290LnBlbmRpbmdDaGlsZHJlbiA9IG5ld0NoaWxkU2V0O1xuICAgICAgLy8gU2NoZWR1bGUgYW4gdXBkYXRlIG9uIHRoZSBjb250YWluZXIgdG8gc3dhcCBvdXQgdGhlIGNvbnRhaW5lci5cbiAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgZmluYWxpemVDb250YWluZXJDaGlsZHJlbihjb250YWluZXIsIG5ld0NoaWxkU2V0KTtcbiAgICB9XG4gIH07XG4gIHVwZGF0ZUhvc3RDb21wb25lbnQkMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICAgIHZhciBjdXJyZW50SW5zdGFuY2UgPSBjdXJyZW50LnN0YXRlTm9kZTtcbiAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgLy8gSWYgdGhlcmUgYXJlIG5vIGVmZmVjdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZSwgdGhlbiBub25lIG9mIG91ciBjaGlsZHJlbiBoYWQgYW55IHVwZGF0ZXMuXG4gICAgLy8gVGhpcyBndWFyYW50ZWVzIHRoYXQgd2UgY2FuIHJldXNlIGFsbCBvZiB0aGVtLlxuICAgIHZhciBjaGlsZHJlblVuY2hhbmdlZCA9IHdvcmtJblByb2dyZXNzLmZpcnN0RWZmZWN0ID09PSBudWxsO1xuICAgIGlmIChjaGlsZHJlblVuY2hhbmdlZCAmJiBvbGRQcm9wcyA9PT0gbmV3UHJvcHMpIHtcbiAgICAgIC8vIE5vIGNoYW5nZXMsIGp1c3QgcmV1c2UgdGhlIGV4aXN0aW5nIGluc3RhbmNlLlxuICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgbWlnaHQgcmVsZWFzZSBhIHByZXZpb3VzIGNsb25lLlxuICAgICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3VycmVudEluc3RhbmNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgcmVjeWNsYWJsZUluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgIHZhciBjdXJyZW50SG9zdENvbnRleHQgPSBnZXRIb3N0Q29udGV4dCgpO1xuICAgIHZhciB1cGRhdGVQYXlsb2FkID0gbnVsbDtcbiAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzKSB7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gcHJlcGFyZVVwZGF0ZShyZWN5Y2xhYmxlSW5zdGFuY2UsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQpO1xuICAgIH1cbiAgICBpZiAoY2hpbGRyZW5VbmNoYW5nZWQgJiYgdXBkYXRlUGF5bG9hZCA9PT0gbnVsbCkge1xuICAgICAgLy8gTm8gY2hhbmdlcywganVzdCByZXVzZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UuXG4gICAgICAvLyBOb3RlIHRoYXQgdGhpcyBtaWdodCByZWxlYXNlIGEgcHJldmlvdXMgY2xvbmUuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjdXJyZW50SW5zdGFuY2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBuZXdJbnN0YW5jZSA9IGNsb25lSW5zdGFuY2UoY3VycmVudEluc3RhbmNlLCB1cGRhdGVQYXlsb2FkLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIHdvcmtJblByb2dyZXNzLCBjaGlsZHJlblVuY2hhbmdlZCwgcmVjeWNsYWJsZUluc3RhbmNlKTtcbiAgICBpZiAoZmluYWxpemVJbml0aWFsQ2hpbGRyZW4obmV3SW5zdGFuY2UsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGN1cnJlbnRIb3N0Q29udGV4dCkpIHtcbiAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBuZXdJbnN0YW5jZTtcbiAgICBpZiAoY2hpbGRyZW5VbmNoYW5nZWQpIHtcbiAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBvdGhlciBlZmZlY3RzIGluIHRoaXMgdHJlZSwgd2UgbmVlZCB0byBmbGFnIHRoaXMgbm9kZSBhcyBoYXZpbmcgb25lLlxuICAgICAgLy8gRXZlbiB0aG91Z2ggd2UncmUgbm90IGdvaW5nIHRvIHVzZSBpdCBmb3IgYW55dGhpbmcuXG4gICAgICAvLyBPdGhlcndpc2UgcGFyZW50cyB3b24ndCBrbm93IHRoYXQgdGhlcmUgYXJlIG5ldyBjaGlsZHJlbiB0byBwcm9wYWdhdGUgdXB3YXJkcy5cbiAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBjaGlsZHJlbiBtaWdodCBoYXZlIGNoYW5nZWQsIHdlIGhhdmUgdG8gYWRkIHRoZW0gYWxsIHRvIHRoZSBzZXQuXG4gICAgICBhcHBlbmRBbGxDaGlsZHJlbihuZXdJbnN0YW5jZSwgd29ya0luUHJvZ3Jlc3MsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuICB9O1xuICB1cGRhdGVIb3N0VGV4dCQxID0gZnVuY3Rpb24gKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBvbGRUZXh0LCBuZXdUZXh0KSB7XG4gICAgaWYgKG9sZFRleHQgIT09IG5ld1RleHQpIHtcbiAgICAgIC8vIElmIHRoZSB0ZXh0IGNvbnRlbnQgZGlmZmVycywgd2UnbGwgY3JlYXRlIGEgbmV3IHRleHQgaW5zdGFuY2UgZm9yIGl0LlxuICAgICAgdmFyIHJvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG4gICAgICB2YXIgY3VycmVudEhvc3RDb250ZXh0ID0gZ2V0SG9zdENvbnRleHQoKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGNyZWF0ZVRleHRJbnN0YW5jZShuZXdUZXh0LCByb290Q29udGFpbmVySW5zdGFuY2UsIGN1cnJlbnRIb3N0Q29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgLy8gV2UnbGwgaGF2ZSB0byBtYXJrIGl0IGFzIGhhdmluZyBhbiBlZmZlY3QsIGV2ZW4gdGhvdWdoIHdlIHdvbid0IHVzZSB0aGUgZWZmZWN0IGZvciBhbnl0aGluZy5cbiAgICAgIC8vIFRoaXMgbGV0cyB0aGUgcGFyZW50cyBrbm93IHRoYXQgYXQgbGVhc3Qgb25lIG9mIHRoZWlyIGNoaWxkcmVuIGhhcyBjaGFuZ2VkLlxuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9O1xufSBlbHNlIHtcbiAgLy8gTm8gaG9zdCBvcGVyYXRpb25zXG4gIHVwZGF0ZUhvc3RDb250YWluZXIgPSBmdW5jdGlvbiAod29ya0luUHJvZ3Jlc3MpIHtcbiAgICAvLyBOb29wXG4gIH07XG4gIHVwZGF0ZUhvc3RDb21wb25lbnQkMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICAgIC8vIE5vb3BcbiAgfTtcbiAgdXBkYXRlSG9zdFRleHQkMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgb2xkVGV4dCwgbmV3VGV4dCkge1xuICAgIC8vIE5vb3BcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29tcGxldGVXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgICBicmVhaztcbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgICBicmVhaztcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBwb3BUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB2YXIgZmliZXJSb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICBpZiAoZmliZXJSb290LnBlbmRpbmdDb250ZXh0KSB7XG4gICAgICAgICAgZmliZXJSb290LmNvbnRleHQgPSBmaWJlclJvb3QucGVuZGluZ0NvbnRleHQ7XG4gICAgICAgICAgZmliZXJSb290LnBlbmRpbmdDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LmNoaWxkID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gSWYgd2UgaHlkcmF0ZWQsIHBvcCBzbyB0aGF0IHdlIGNhbiBkZWxldGUgYW55IHJlbWFpbmluZyBjaGlsZHJlblxuICAgICAgICAgIC8vIHRoYXQgd2VyZW4ndCBoeWRyYXRlZC5cbiAgICAgICAgICBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgLy8gVGhpcyByZXNldHMgdGhlIGhhY2t5IHN0YXRlIHRvIGZpeCBpc01vdW50ZWQgYmVmb3JlIGNvbW1pdHRpbmcuXG4gICAgICAgICAgLy8gVE9ETzogRGVsZXRlIHRoaXMgd2hlbiB3ZSBkZWxldGUgaXNNb3VudGVkIGFuZCBmaW5kRE9NTm9kZS5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgJj0gflBsYWNlbWVudDtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciByb290Q29udGFpbmVySW5zdGFuY2UgPSBnZXRSb290SG9zdENvbnRhaW5lcigpO1xuICAgICAgICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgdXBkYXRlSG9zdENvbXBvbmVudCQxKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKTtcblxuICAgICAgICAgIGlmIChjdXJyZW50LnJlZiAhPT0gd29ya0luUHJvZ3Jlc3MucmVmKSB7XG4gICAgICAgICAgICBtYXJrUmVmJDEod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIW5ld1Byb3BzKSB7XG4gICAgICAgICAgICAhKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSAhPT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICdXZSBtdXN0IGhhdmUgbmV3IHByb3BzIGZvciBuZXcgbW91bnRzLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpIDogdm9pZCAwO1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYWJvcnQgd29yay5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBjdXJyZW50SG9zdENvbnRleHQgPSBnZXRIb3N0Q29udGV4dCgpO1xuICAgICAgICAgIC8vIFRPRE86IE1vdmUgY3JlYXRlSW5zdGFuY2UgdG8gYmVnaW5Xb3JrIGFuZCBrZWVwIGl0IG9uIGEgY29udGV4dFxuICAgICAgICAgIC8vIFwic3RhY2tcIiBhcyB0aGUgcGFyZW50LiBUaGVuIGFwcGVuZCBjaGlsZHJlbiBhcyB3ZSBnbyBpbiBiZWdpbldvcmtcbiAgICAgICAgICAvLyBvciBjb21wbGV0ZVdvcmsgZGVwZW5kaW5nIG9uIHdlIHdhbnQgdG8gYWRkIHRoZW4gdG9wLT5kb3duIG9yXG4gICAgICAgICAgLy8gYm90dG9tLT51cC4gVG9wLT5kb3duIGlzIGZhc3RlciBpbiBJRTExLlxuICAgICAgICAgIHZhciB3YXNIeWRyYXRlZCA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICBpZiAod2FzSHlkcmF0ZWQpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyBhbmQgY3JlYXRlSW5zdGFuY2Ugc3RlcCBpbnRvIHRoZSBiZWdpblBoYXNlXG4gICAgICAgICAgICAvLyB0byBjb25zb2xpZGF0ZS5cbiAgICAgICAgICAgIGlmIChwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKHdvcmtJblByb2dyZXNzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGN1cnJlbnRIb3N0Q29udGV4dCkpIHtcbiAgICAgICAgICAgICAgLy8gSWYgY2hhbmdlcyB0byB0aGUgaHlkcmF0ZWQgbm9kZSBuZWVkcyB0byBiZSBhcHBsaWVkIGF0IHRoZVxuICAgICAgICAgICAgICAvLyBjb21taXQtcGhhc2Ugd2UgbWFyayB0aGlzIGFzIHN1Y2guXG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBjcmVhdGVJbnN0YW5jZSh0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgICAgYXBwZW5kQWxsQ2hpbGRyZW4oaW5zdGFuY2UsIHdvcmtJblByb2dyZXNzLCBmYWxzZSwgZmFsc2UpO1xuXG4gICAgICAgICAgICAvLyBDZXJ0YWluIHJlbmRlcmVycyByZXF1aXJlIGNvbW1pdC10aW1lIGVmZmVjdHMgZm9yIGluaXRpYWwgbW91bnQuXG4gICAgICAgICAgICAvLyAoZWcgRE9NIHJlbmRlcmVyIHN1cHBvcnRzIGF1dG8tZm9jdXMgZm9yIGNlcnRhaW4gZWxlbWVudHMpLlxuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHN1Y2ggcmVuZGVyZXJzIGdldCBzY2hlZHVsZWQgZm9yIGxhdGVyIHdvcmsuXG4gICAgICAgICAgICBpZiAoZmluYWxpemVJbml0aWFsQ2hpbGRyZW4oaW5zdGFuY2UsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGN1cnJlbnRIb3N0Q29udGV4dCkpIHtcbiAgICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBpbnN0YW5jZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MucmVmICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHJlZiBvbiBhIGhvc3Qgbm9kZSB3ZSBuZWVkIHRvIHNjaGVkdWxlIGEgY2FsbGJhY2tcbiAgICAgICAgICAgIG1hcmtSZWYkMSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIHZhciBuZXdUZXh0ID0gbmV3UHJvcHM7XG4gICAgICAgIGlmIChjdXJyZW50ICYmIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIG9sZFRleHQgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBhbHRlcm5hdGUsIHRoYXQgbWVhbnMgdGhpcyBpcyBhbiB1cGRhdGUgYW5kIHdlIG5lZWRcbiAgICAgICAgICAvLyB0byBzY2hlZHVsZSBhIHNpZGUtZWZmZWN0IHRvIGRvIHRoZSB1cGRhdGVzLlxuICAgICAgICAgIHVwZGF0ZUhvc3RUZXh0JDEoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG9sZFRleHQsIG5ld1RleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV3VGV4dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICEod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9PSBudWxsKSA/IGludmFyaWFudChmYWxzZSwgJ1dlIG11c3QgaGF2ZSBuZXcgcHJvcHMgZm9yIG5ldyBtb3VudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJykgOiB2b2lkIDA7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBhYm9ydCB3b3JrLlxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgX3Jvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG4gICAgICAgICAgdmFyIF9jdXJyZW50SG9zdENvbnRleHQgPSBnZXRIb3N0Q29udGV4dCgpO1xuICAgICAgICAgIHZhciBfd2FzSHlkcmF0ZWQgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgaWYgKF93YXNIeWRyYXRlZCkge1xuICAgICAgICAgICAgaWYgKHByZXBhcmVUb0h5ZHJhdGVIb3N0VGV4dEluc3RhbmNlKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3JlYXRlVGV4dEluc3RhbmNlKG5ld1RleHQsIF9yb290Q29udGFpbmVySW5zdGFuY2UsIF9jdXJyZW50SG9zdENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnICYgRGlkQ2FwdHVyZSkgIT09IE5vRWZmZWN0KSB7XG4gICAgICAgICAgLy8gU29tZXRoaW5nIHN1c3BlbmRlZC4gUmUtcmVuZGVyIHdpdGggdGhlIGZhbGxiYWNrIGNoaWxkcmVuLlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmV4cGlyYXRpb25UaW1lID0gcmVuZGVyRXhwaXJhdGlvblRpbWU7XG4gICAgICAgICAgLy8gRG8gbm90IHJlc2V0IHRoZSBlZmZlY3QgbGlzdC5cbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbmV4dERpZFRpbWVvdXQgPSBuZXh0U3RhdGUgIT09IG51bGw7XG4gICAgICAgIHZhciBwcmV2RGlkVGltZW91dCA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmICFuZXh0RGlkVGltZW91dCAmJiBwcmV2RGlkVGltZW91dCkge1xuICAgICAgICAgIC8vIFdlIGp1c3Qgc3dpdGNoZWQgZnJvbSB0aGUgZmFsbGJhY2sgdG8gdGhlIG5vcm1hbCBjaGlsZHJlbi4gRGVsZXRlXG4gICAgICAgICAgLy8gdGhlIGZhbGxiYWNrLlxuICAgICAgICAgIC8vIFRPRE86IFdvdWxkIGl0IGJlIGJldHRlciB0byBzdG9yZSB0aGUgZmFsbGJhY2sgZnJhZ21lbnQgb25cbiAgICAgICAgICB2YXIgY3VycmVudEZhbGxiYWNrQ2hpbGQgPSBjdXJyZW50LmNoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgaWYgKGN1cnJlbnRGYWxsYmFja0NoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBEZWxldGlvbnMgZ28gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmV0dXJuIGZpYmVyJ3MgZWZmZWN0IGxpc3RcbiAgICAgICAgICAgIHZhciBmaXJzdCA9IHdvcmtJblByb2dyZXNzLmZpcnN0RWZmZWN0O1xuICAgICAgICAgICAgaWYgKGZpcnN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZpcnN0RWZmZWN0ID0gY3VycmVudEZhbGxiYWNrQ2hpbGQ7XG4gICAgICAgICAgICAgIGN1cnJlbnRGYWxsYmFja0NoaWxkLm5leHRFZmZlY3QgPSBmaXJzdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZpcnN0RWZmZWN0ID0gd29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCA9IGN1cnJlbnRGYWxsYmFja0NoaWxkO1xuICAgICAgICAgICAgICBjdXJyZW50RmFsbGJhY2tDaGlsZC5uZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnRGYWxsYmFja0NoaWxkLmVmZmVjdFRhZyA9IERlbGV0aW9uO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0RGlkVGltZW91dCB8fCBwcmV2RGlkVGltZW91dCkge1xuICAgICAgICAgIC8vIElmIHRoZSBjaGlsZHJlbiBhcmUgaGlkZGVuLCBvciBpZiB0aGV5IHdlcmUgcHJldmlvdXMgaGlkZGVuLCBzY2hlZHVsZVxuICAgICAgICAgIC8vIGFuIGVmZmVjdCB0byB0b2dnbGUgdGhlaXIgdmlzaWJpbGl0eS4gVGhpcyBpcyBhbHNvIHVzZWQgdG8gYXR0YWNoIGFcbiAgICAgICAgICAvLyByZXRyeSBsaXN0ZW5lciB0byB0aGUgcHJvbWlzZS5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gVXBkYXRlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgICBicmVhaztcbiAgICBjYXNlIE1vZGU6XG4gICAgICBicmVhaztcbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB1cGRhdGVIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgLy8gUG9wIHByb3ZpZGVyIGZpYmVyXG4gICAgICBwb3BQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIENvbnRleHRDb25zdW1lcjpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICAvLyBTYW1lIGFzIGNsYXNzIGNvbXBvbmVudCBjYXNlLiBJIHB1dCBpdCBkb3duIGhlcmUgc28gdGhhdCB0aGUgdGFncyBhcmVcbiAgICAgICAgLy8gc2VxdWVudGlhbCB0byBlbnN1cmUgdGhpcyBzd2l0Y2ggaXMgY29tcGlsZWQgdG8gYSBqdW1wIHRhYmxlLlxuICAgICAgICB2YXIgX0NvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihfQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNhc2UgRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoZW5hYmxlU3VzcGVuc2VTZXJ2ZXJSZW5kZXJlcikge1xuICAgICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkMiA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgICFfd2FzSHlkcmF0ZWQyID8gaW52YXJpYW50KGZhbHNlLCAnQSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGNvbXBvbmVudCB3YXMgY29tcGxldGVkIHdpdGhvdXQgYSBoeWRyYXRlZCBub2RlLiBUaGlzIGlzIHByb2JhYmx5IGEgYnVnIGluIFJlYWN0LicpIDogdm9pZCAwO1xuICAgICAgICAgICAgc2tpcFBhc3REZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfSBlbHNlIGlmICgod29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnICYgRGlkQ2FwdHVyZSkgPT09IE5vRWZmZWN0KSB7XG4gICAgICAgICAgICAvLyBUaGlzIGJvdW5kYXJ5IGRpZCBub3Qgc3VzcGVuZCBzbyBpdCdzIG5vdyBoeWRyYXRlZC5cbiAgICAgICAgICAgIC8vIFRvIGhhbmRsZSBhbnkgZnV0dXJlIHN1c3BlbnNlIGNhc2VzLCB3ZSdyZSBnb2luZyB0byBub3cgdXBncmFkZSBpdFxuICAgICAgICAgICAgLy8gdG8gYSBTdXNwZW5zZSBjb21wb25lbnQuIFdlIGRldGFjaCBpdCBmcm9tIHRoZSBleGlzdGluZyBjdXJyZW50IGZpYmVyLlxuICAgICAgICAgICAgY3VycmVudC5hbHRlcm5hdGUgPSBudWxsO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRhZyA9IFN1c3BlbnNlQ29tcG9uZW50O1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgaW52YXJpYW50KGZhbHNlLCAnVW5rbm93biB1bml0IG9mIHdvcmsgdGFnLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHNob3VsZENhcHR1cmVTdXNwZW5zZSh3b3JrSW5Qcm9ncmVzcykge1xuICAvLyBJbiBvcmRlciB0byBjYXB0dXJlLCB0aGUgU3VzcGVuc2UgY29tcG9uZW50IG11c3QgaGF2ZSBhIGZhbGxiYWNrIHByb3AuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLmZhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gSWYgaXQgd2FzIHRoZSBwcmltYXJ5IGNoaWxkcmVuIHRoYXQganVzdCBzdXNwZW5kZWQsIGNhcHR1cmUgYW5kIHJlbmRlciB0aGVcbiAgLy8gZmFsbGJhY2suIE90aGVyd2lzZSwgZG9uJ3QgY2FwdHVyZSBhbmQgYnViYmxlIHRvIHRoZSBuZXh0IGJvdW5kYXJ5LlxuICB2YXIgbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIG5leHRTdGF0ZSA9PT0gbnVsbDtcbn1cblxuLy8gVGhpcyBtb2R1bGUgaXMgZm9ya2VkIGluIGRpZmZlcmVudCBlbnZpcm9ubWVudHMuXG4vLyBCeSBkZWZhdWx0LCByZXR1cm4gYHRydWVgIHRvIGxvZyBlcnJvcnMgdG8gdGhlIGNvbnNvbGUuXG4vLyBGb3JrcyBjYW4gcmV0dXJuIGBmYWxzZWAgaWYgdGhpcyBpc24ndCBkZXNpcmFibGUuXG5mdW5jdGlvbiBzaG93RXJyb3JEaWFsb2coY2FwdHVyZWRFcnJvcikge1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gbG9nQ2FwdHVyZWRFcnJvcihjYXB0dXJlZEVycm9yKSB7XG4gIHZhciBsb2dFcnJvciA9IHNob3dFcnJvckRpYWxvZyhjYXB0dXJlZEVycm9yKTtcblxuICAvLyBBbGxvdyBpbmplY3RlZCBzaG93RXJyb3JEaWFsb2coKSB0byBwcmV2ZW50IGRlZmF1bHQgY29uc29sZS5lcnJvciBsb2dnaW5nLlxuICAvLyBUaGlzIGVuYWJsZXMgcmVuZGVyZXJzIGxpa2UgUmVhY3ROYXRpdmUgdG8gYmV0dGVyIG1hbmFnZSByZWRib3ggYmVoYXZpb3IuXG4gIGlmIChsb2dFcnJvciA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZXJyb3IgPSBjYXB0dXJlZEVycm9yLmVycm9yO1xuICB7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBjYXB0dXJlZEVycm9yLmNvbXBvbmVudE5hbWUsXG4gICAgICAgIGNvbXBvbmVudFN0YWNrID0gY2FwdHVyZWRFcnJvci5jb21wb25lbnRTdGFjayxcbiAgICAgICAgZXJyb3JCb3VuZGFyeU5hbWUgPSBjYXB0dXJlZEVycm9yLmVycm9yQm91bmRhcnlOYW1lLFxuICAgICAgICBlcnJvckJvdW5kYXJ5Rm91bmQgPSBjYXB0dXJlZEVycm9yLmVycm9yQm91bmRhcnlGb3VuZCxcbiAgICAgICAgd2lsbFJldHJ5ID0gY2FwdHVyZWRFcnJvci53aWxsUmV0cnk7XG5cbiAgICAvLyBCcm93c2VycyBzdXBwb3J0IHNpbGVuY2luZyB1bmNhdWdodCBlcnJvcnMgYnkgY2FsbGluZ1xuICAgIC8vIGBwcmV2ZW50RGVmYXVsdCgpYCBpbiB3aW5kb3cgYGVycm9yYCBoYW5kbGVyLlxuICAgIC8vIFdlIHJlY29yZCB0aGlzIGluZm9ybWF0aW9uIGFzIGFuIGV4cGFuZG8gb24gdGhlIGVycm9yLlxuXG4gICAgaWYgKGVycm9yICE9IG51bGwgJiYgZXJyb3IuX3N1cHByZXNzTG9nZ2luZykge1xuICAgICAgaWYgKGVycm9yQm91bmRhcnlGb3VuZCAmJiB3aWxsUmV0cnkpIHtcbiAgICAgICAgLy8gVGhlIGVycm9yIGlzIHJlY292ZXJhYmxlIGFuZCB3YXMgc2lsZW5jZWQuXG4gICAgICAgIC8vIElnbm9yZSBpdCBhbmQgZG9uJ3QgcHJpbnQgdGhlIHN0YWNrIGFkZGVuZHVtLlxuICAgICAgICAvLyBUaGlzIGlzIGhhbmR5IGZvciB0ZXN0aW5nIGVycm9yIGJvdW5kYXJpZXMgd2l0aG91dCBub2lzZS5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGVycm9yIGlzIGZhdGFsLiBTaW5jZSB0aGUgc2lsZW5jaW5nIG1pZ2h0IGhhdmVcbiAgICAgIC8vIGJlZW4gYWNjaWRlbnRhbCwgd2UnbGwgc3VyZmFjZSBpdCBhbnl3YXkuXG4gICAgICAvLyBIb3dldmVyLCB0aGUgYnJvd3NlciB3b3VsZCBoYXZlIHNpbGVuY2VkIHRoZSBvcmlnaW5hbCBlcnJvclxuICAgICAgLy8gc28gd2UnbGwgcHJpbnQgaXQgZmlyc3QsIGFuZCB0aGVuIHByaW50IHRoZSBzdGFjayBhZGRlbmR1bS5cbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgLy8gRm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGlzIGJsb2NrLCBzZWU6XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xMzM4NFxuICAgIH1cblxuICAgIHZhciBjb21wb25lbnROYW1lTWVzc2FnZSA9IGNvbXBvbmVudE5hbWUgPyAnVGhlIGFib3ZlIGVycm9yIG9jY3VycmVkIGluIHRoZSA8JyArIGNvbXBvbmVudE5hbWUgKyAnPiBjb21wb25lbnQ6JyA6ICdUaGUgYWJvdmUgZXJyb3Igb2NjdXJyZWQgaW4gb25lIG9mIHlvdXIgUmVhY3QgY29tcG9uZW50czonO1xuXG4gICAgdmFyIGVycm9yQm91bmRhcnlNZXNzYWdlID0gdm9pZCAwO1xuICAgIC8vIGVycm9yQm91bmRhcnlGb3VuZCBjaGVjayBpcyBzdWZmaWNpZW50OyBlcnJvckJvdW5kYXJ5TmFtZSBjaGVjayBpcyB0byBzYXRpc2Z5IEZsb3cuXG4gICAgaWYgKGVycm9yQm91bmRhcnlGb3VuZCAmJiBlcnJvckJvdW5kYXJ5TmFtZSkge1xuICAgICAgaWYgKHdpbGxSZXRyeSkge1xuICAgICAgICBlcnJvckJvdW5kYXJ5TWVzc2FnZSA9ICdSZWFjdCB3aWxsIHRyeSB0byByZWNyZWF0ZSB0aGlzIGNvbXBvbmVudCB0cmVlIGZyb20gc2NyYXRjaCAnICsgKCd1c2luZyB0aGUgZXJyb3IgYm91bmRhcnkgeW91IHByb3ZpZGVkLCAnICsgZXJyb3JCb3VuZGFyeU5hbWUgKyAnLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JCb3VuZGFyeU1lc3NhZ2UgPSAnVGhpcyBlcnJvciB3YXMgaW5pdGlhbGx5IGhhbmRsZWQgYnkgdGhlIGVycm9yIGJvdW5kYXJ5ICcgKyBlcnJvckJvdW5kYXJ5TmFtZSArICcuXFxuJyArICdSZWNyZWF0aW5nIHRoZSB0cmVlIGZyb20gc2NyYXRjaCBmYWlsZWQgc28gUmVhY3Qgd2lsbCB1bm1vdW50IHRoZSB0cmVlLic7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yQm91bmRhcnlNZXNzYWdlID0gJ0NvbnNpZGVyIGFkZGluZyBhbiBlcnJvciBib3VuZGFyeSB0byB5b3VyIHRyZWUgdG8gY3VzdG9taXplIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yLlxcbicgKyAnVmlzaXQgaHR0cHM6Ly9mYi5tZS9yZWFjdC1lcnJvci1ib3VuZGFyaWVzIHRvIGxlYXJuIG1vcmUgYWJvdXQgZXJyb3IgYm91bmRhcmllcy4nO1xuICAgIH1cbiAgICB2YXIgY29tYmluZWRNZXNzYWdlID0gJycgKyBjb21wb25lbnROYW1lTWVzc2FnZSArIGNvbXBvbmVudFN0YWNrICsgJ1xcblxcbicgKyAoJycgKyBlcnJvckJvdW5kYXJ5TWVzc2FnZSk7XG5cbiAgICAvLyBJbiBkZXZlbG9wbWVudCwgd2UgcHJvdmlkZSBvdXIgb3duIG1lc3NhZ2Ugd2l0aCBqdXN0IHRoZSBjb21wb25lbnQgc3RhY2suXG4gICAgLy8gV2UgZG9uJ3QgaW5jbHVkZSB0aGUgb3JpZ2luYWwgZXJyb3IgbWVzc2FnZSBhbmQgSlMgc3RhY2sgYmVjYXVzZSB0aGUgYnJvd3NlclxuICAgIC8vIGhhcyBhbHJlYWR5IHByaW50ZWQgaXQuIEV2ZW4gaWYgdGhlIGFwcGxpY2F0aW9uIHN3YWxsb3dzIHRoZSBlcnJvciwgaXQgaXMgc3RpbGxcbiAgICAvLyBkaXNwbGF5ZWQgYnkgdGhlIGJyb3dzZXIgdGhhbmtzIHRvIHRoZSBERVYtb25seSBmYWtlIGV2ZW50IHRyaWNrIGluIFJlYWN0RXJyb3JVdGlscy5cbiAgICBjb25zb2xlLmVycm9yKGNvbWJpbmVkTWVzc2FnZSk7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlID0gbnVsbDtcbntcbiAgZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGUgPSBuZXcgU2V0KCk7XG59XG5cbnZhciBQb3NzaWJseVdlYWtTZXQkMSA9IHR5cGVvZiBXZWFrU2V0ID09PSAnZnVuY3Rpb24nID8gV2Vha1NldCA6IFNldDtcblxuZnVuY3Rpb24gbG9nRXJyb3IoYm91bmRhcnksIGVycm9ySW5mbykge1xuICB2YXIgc291cmNlID0gZXJyb3JJbmZvLnNvdXJjZTtcbiAgdmFyIHN0YWNrID0gZXJyb3JJbmZvLnN0YWNrO1xuICBpZiAoc3RhY2sgPT09IG51bGwgJiYgc291cmNlICE9PSBudWxsKSB7XG4gICAgc3RhY2sgPSBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2Qoc291cmNlKTtcbiAgfVxuXG4gIHZhciBjYXB0dXJlZEVycm9yID0ge1xuICAgIGNvbXBvbmVudE5hbWU6IHNvdXJjZSAhPT0gbnVsbCA/IGdldENvbXBvbmVudE5hbWUoc291cmNlLnR5cGUpIDogbnVsbCxcbiAgICBjb21wb25lbnRTdGFjazogc3RhY2sgIT09IG51bGwgPyBzdGFjayA6ICcnLFxuICAgIGVycm9yOiBlcnJvckluZm8udmFsdWUsXG4gICAgZXJyb3JCb3VuZGFyeTogbnVsbCxcbiAgICBlcnJvckJvdW5kYXJ5TmFtZTogbnVsbCxcbiAgICBlcnJvckJvdW5kYXJ5Rm91bmQ6IGZhbHNlLFxuICAgIHdpbGxSZXRyeTogZmFsc2VcbiAgfTtcblxuICBpZiAoYm91bmRhcnkgIT09IG51bGwgJiYgYm91bmRhcnkudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgIGNhcHR1cmVkRXJyb3IuZXJyb3JCb3VuZGFyeSA9IGJvdW5kYXJ5LnN0YXRlTm9kZTtcbiAgICBjYXB0dXJlZEVycm9yLmVycm9yQm91bmRhcnlOYW1lID0gZ2V0Q29tcG9uZW50TmFtZShib3VuZGFyeS50eXBlKTtcbiAgICBjYXB0dXJlZEVycm9yLmVycm9yQm91bmRhcnlGb3VuZCA9IHRydWU7XG4gICAgY2FwdHVyZWRFcnJvci53aWxsUmV0cnkgPSB0cnVlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBsb2dDYXB0dXJlZEVycm9yKGNhcHR1cmVkRXJyb3IpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3csIG9yIFJlYWN0IGludGVybmFsIHN0YXRlIHdpbGwgZ2V0IG1lc3NlZCB1cC5cbiAgICAvLyBJZiBjb25zb2xlLmVycm9yIGlzIG92ZXJyaWRkZW4sIG9yIGxvZ0NhcHR1cmVkRXJyb3IoKSBzaG93cyBhIGRpYWxvZyB0aGF0IHRocm93cyxcbiAgICAvLyB3ZSB3YW50IHRvIHJlcG9ydCB0aGlzIGVycm9yIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBzdGFjayBhcyBhIGxhc3QgcmVzb3J0LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTMxODhcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG4gIH1cbn1cblxudmFyIGNhbGxDb21wb25lbnRXaWxsVW5tb3VudFdpdGhUaW1lciA9IGZ1bmN0aW9uIChjdXJyZW50JCQxLCBpbnN0YW5jZSkge1xuICBzdGFydFBoYXNlVGltZXIoY3VycmVudCQkMSwgJ2NvbXBvbmVudFdpbGxVbm1vdW50Jyk7XG4gIGluc3RhbmNlLnByb3BzID0gY3VycmVudCQkMS5tZW1vaXplZFByb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IGN1cnJlbnQkJDEubWVtb2l6ZWRTdGF0ZTtcbiAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgc3RvcFBoYXNlVGltZXIoKTtcbn07XG5cbi8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IHVubW91bnRpbmcuXG5mdW5jdGlvbiBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoY3VycmVudCQkMSwgaW5zdGFuY2UpIHtcbiAge1xuICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCBjYWxsQ29tcG9uZW50V2lsbFVubW91bnRXaXRoVGltZXIsIG51bGwsIGN1cnJlbnQkJDEsIGluc3RhbmNlKTtcbiAgICBpZiAoaGFzQ2F1Z2h0RXJyb3IoKSkge1xuICAgICAgdmFyIHVubW91bnRFcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQkJDEsIHVubW91bnRFcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNhZmVseURldGFjaFJlZihjdXJyZW50JCQxKSB7XG4gIHZhciByZWYgPSBjdXJyZW50JCQxLnJlZjtcbiAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB7XG4gICAgICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCByZWYsIG51bGwsIG51bGwpO1xuICAgICAgICBpZiAoaGFzQ2F1Z2h0RXJyb3IoKSkge1xuICAgICAgICAgIHZhciByZWZFcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50JCQxLCByZWZFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsRGVzdHJveShjdXJyZW50JCQxLCBkZXN0cm95KSB7XG4gIHtcbiAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgZGVzdHJveSwgbnVsbCk7XG4gICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgIHZhciBlcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQkJDEsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25MaWZlQ3ljbGVzKGN1cnJlbnQkJDEsIGZpbmlzaGVkV29yaykge1xuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0KFVubW91bnRTbmFwc2hvdCwgTm9FZmZlY3QkMSwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmIChmaW5pc2hlZFdvcmsuZWZmZWN0VGFnICYgU25hcHNob3QpIHtcbiAgICAgICAgICBpZiAoY3VycmVudCQkMSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQkJDEubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50JCQxLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgICBzdGFydFBoYXNlVGltZXIoZmluaXNoZWRXb3JrLCAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUnKTtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAhKGluc3RhbmNlLnByb3BzID09PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykgPyB3YXJuaW5nJDEoZmFsc2UsICdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpIDogdm9pZCAwO1xuICAgICAgICAgICAgICAgICEoaW5zdGFuY2Uuc3RhdGUgPT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSA/IHdhcm5pbmckMShmYWxzZSwgJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ2dldFNuYXBzaG90QmVmb3JlVXBkYXRlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZShmaW5pc2hlZFdvcmsudHlwZSkgfHwgJ2luc3RhbmNlJykgOiB2b2lkIDA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzbmFwc2hvdCA9IGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSA9PT0gZmluaXNoZWRXb3JrLnR5cGUgPyBwcmV2UHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKGZpbmlzaGVkV29yay50eXBlLCBwcmV2UHJvcHMpLCBwcmV2U3RhdGUpO1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgZGlkV2FyblNldCA9IGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlO1xuICAgICAgICAgICAgICBpZiAoc25hcHNob3QgPT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblNldC5oYXMoZmluaXNoZWRXb3JrLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgZGlkV2FyblNldC5hZGQoZmluaXNoZWRXb3JrLnR5cGUpO1xuICAgICAgICAgICAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCk6IEEgc25hcHNob3QgdmFsdWUgKG9yIG51bGwpICcgKyAnbXVzdCBiZSByZXR1cm5lZC4gWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUgPSBzbmFwc2hvdDtcbiAgICAgICAgICAgIHN0b3BQaGFzZVRpbWVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICBjYXNlIEhvc3RSb290OlxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgIC8vIE5vdGhpbmcgdG8gZG8gZm9yIHRoZXNlIGNvbXBvbmVudCB0eXBlc1xuICAgICAgcmV0dXJuO1xuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIGludmFyaWFudChmYWxzZSwgJ1RoaXMgdW5pdCBvZiB3b3JrIHRhZyBzaG91bGQgbm90IGhhdmUgc2lkZS1lZmZlY3RzLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEhvb2tFZmZlY3RMaXN0KHVubW91bnRUYWcsIG1vdW50VGFnLCBmaW5pc2hlZFdvcmspIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuICB2YXIgbGFzdEVmZmVjdCA9IHVwZGF0ZVF1ZXVlICE9PSBudWxsID8gdXBkYXRlUXVldWUubGFzdEVmZmVjdCA6IG51bGw7XG4gIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcbiAgICBkbyB7XG4gICAgICBpZiAoKGVmZmVjdC50YWcgJiB1bm1vdW50VGFnKSAhPT0gTm9FZmZlY3QkMSkge1xuICAgICAgICAvLyBVbm1vdW50XG4gICAgICAgIHZhciBkZXN0cm95ID0gZWZmZWN0LmRlc3Ryb3k7XG4gICAgICAgIGVmZmVjdC5kZXN0cm95ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoKGVmZmVjdC50YWcgJiBtb3VudFRhZykgIT09IE5vRWZmZWN0JDEpIHtcbiAgICAgICAgLy8gTW91bnRcbiAgICAgICAgdmFyIGNyZWF0ZSA9IGVmZmVjdC5jcmVhdGU7XG4gICAgICAgIGVmZmVjdC5kZXN0cm95ID0gY3JlYXRlKCk7XG5cbiAgICAgICAge1xuICAgICAgICAgIHZhciBfZGVzdHJveSA9IGVmZmVjdC5kZXN0cm95O1xuICAgICAgICAgIGlmIChfZGVzdHJveSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBfZGVzdHJveSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFyIGFkZGVuZHVtID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKF9kZXN0cm95ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJyBZb3UgcmV0dXJuZWQgbnVsbC4gSWYgeW91ciBlZmZlY3QgZG9lcyBub3QgcmVxdWlyZSBjbGVhbiAnICsgJ3VwLCByZXR1cm4gdW5kZWZpbmVkIChvciBub3RoaW5nKS4nO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgX2Rlc3Ryb3kudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBhZGRlbmR1bSA9ICdcXG5cXG5JdCBsb29rcyBsaWtlIHlvdSB3cm90ZSB1c2VFZmZlY3QoYXN5bmMgKCkgPT4gLi4uKSBvciByZXR1cm5lZCBhIFByb21pc2UuICcgKyAnSW5zdGVhZCwgd3JpdGUgdGhlIGFzeW5jIGZ1bmN0aW9uIGluc2lkZSB5b3VyIGVmZmVjdCAnICsgJ2FuZCBjYWxsIGl0IGltbWVkaWF0ZWx5OlxcblxcbicgKyAndXNlRWZmZWN0KCgpID0+IHtcXG4nICsgJyAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hEYXRhKCkge1xcbicgKyAnICAgIC8vIFlvdSBjYW4gYXdhaXQgaGVyZVxcbicgKyAnICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgTXlBUEkuZ2V0RGF0YShzb21lSWQpO1xcbicgKyAnICAgIC8vIC4uLlxcbicgKyAnICB9XFxuJyArICcgIGZldGNoRGF0YSgpO1xcbicgKyAnfSwgW3NvbWVJZF0pOyAvLyBPciBbXSBpZiBlZmZlY3QgZG9lc25cXCd0IG5lZWQgcHJvcHMgb3Igc3RhdGVcXG5cXG4nICsgJ0xlYXJuIG1vcmUgYWJvdXQgZGF0YSBmZXRjaGluZyB3aXRoIEhvb2tzOiBodHRwczovL2ZiLm1lL3JlYWN0LWhvb2tzLWRhdGEtZmV0Y2hpbmcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYWRkZW5kdW0gPSAnIFlvdSByZXR1cm5lZDogJyArIF9kZXN0cm95O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnQW4gZWZmZWN0IGZ1bmN0aW9uIG11c3Qgbm90IHJldHVybiBhbnl0aGluZyBiZXNpZGVzIGEgZnVuY3Rpb24sICcgKyAnd2hpY2ggaXMgdXNlZCBmb3IgY2xlYW4tdXAuJXMlcycsIGFkZGVuZHVtLCBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2QoZmluaXNoZWRXb3JrKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlZmZlY3QgPSBlZmZlY3QubmV4dDtcbiAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlSG9va0VmZmVjdHMoZmluaXNoZWRXb3JrKSB7XG4gIGNvbW1pdEhvb2tFZmZlY3RMaXN0KFVubW91bnRQYXNzaXZlLCBOb0VmZmVjdCQxLCBmaW5pc2hlZFdvcmspO1xuICBjb21taXRIb29rRWZmZWN0TGlzdChOb0VmZmVjdCQxLCBNb3VudFBhc3NpdmUsIGZpbmlzaGVkV29yayk7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExpZmVDeWNsZXMoZmluaXNoZWRSb290LCBjdXJyZW50JCQxLCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZEV4cGlyYXRpb25UaW1lKSB7XG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3QoVW5tb3VudExheW91dCwgTW91bnRMYXlvdXQsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgIGlmIChmaW5pc2hlZFdvcmsuZWZmZWN0VGFnICYgVXBkYXRlKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQkJDEgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHN0YXJ0UGhhc2VUaW1lcihmaW5pc2hlZFdvcmssICdjb21wb25lbnREaWRNb3VudCcpO1xuICAgICAgICAgICAgLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgIShpbnN0YW5jZS5wcm9wcyA9PT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpID8gd2FybmluZyQxKGZhbHNlLCAnRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkTW91bnQuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lKGZpbmlzaGVkV29yay50eXBlKSB8fCAnaW5zdGFuY2UnKSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAhKGluc3RhbmNlLnN0YXRlID09PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkgPyB3YXJuaW5nJDEoZmFsc2UsICdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdjb21wb25lbnREaWRNb3VudC4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpIDogdm9pZCAwO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICAgICAgc3RvcFBoYXNlVGltZXIoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHByZXZQcm9wcyA9IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSA9PT0gZmluaXNoZWRXb3JrLnR5cGUgPyBjdXJyZW50JCQxLm1lbW9pemVkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKGZpbmlzaGVkV29yay50eXBlLCBjdXJyZW50JCQxLm1lbW9pemVkUHJvcHMpO1xuICAgICAgICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQkJDEubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICAgIHN0YXJ0UGhhc2VUaW1lcihmaW5pc2hlZFdvcmssICdjb21wb25lbnREaWRVcGRhdGUnKTtcbiAgICAgICAgICAgIC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgICEoaW5zdGFuY2UucHJvcHMgPT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSA/IHdhcm5pbmckMShmYWxzZSwgJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpIDogdm9pZCAwO1xuICAgICAgICAgICAgICAgICEoaW5zdGFuY2Uuc3RhdGUgPT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSA/IHdhcm5pbmckMShmYWxzZSwgJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpIDogdm9pZCAwO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKTtcbiAgICAgICAgICAgIHN0b3BQaGFzZVRpbWVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgIShpbnN0YW5jZS5wcm9wcyA9PT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpID8gd2FybmluZyQxKGZhbHNlLCAnRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAncHJvY2Vzc2luZyB0aGUgdXBkYXRlIHF1ZXVlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZShmaW5pc2hlZFdvcmsudHlwZSkgfHwgJ2luc3RhbmNlJykgOiB2b2lkIDA7XG4gICAgICAgICAgICAgICEoaW5zdGFuY2Uuc3RhdGUgPT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSA/IHdhcm5pbmckMShmYWxzZSwgJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ3Byb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpIDogdm9pZCAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuICAgICAgICAgIGNvbW1pdFVwZGF0ZVF1ZXVlKGZpbmlzaGVkV29yaywgdXBkYXRlUXVldWUsIGluc3RhbmNlLCBjb21taXR0ZWRFeHBpcmF0aW9uVGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHZhciBfdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gICAgICAgIGlmIChfdXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX2luc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay5jaGlsZC50YWcpIHtcbiAgICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICAgIF9pbnN0YW5jZSA9IGdldFB1YmxpY0luc3RhbmNlKGZpbmlzaGVkV29yay5jaGlsZC5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgICAgICAgIF9pbnN0YW5jZSA9IGZpbmlzaGVkV29yay5jaGlsZC5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbW1pdFVwZGF0ZVF1ZXVlKGZpbmlzaGVkV29yaywgX3VwZGF0ZVF1ZXVlLCBfaW5zdGFuY2UsIGNvbW1pdHRlZEV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX2luc3RhbmNlMiA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICAgICAgLy8gUmVuZGVyZXJzIG1heSBzY2hlZHVsZSB3b3JrIHRvIGJlIGRvbmUgYWZ0ZXIgaG9zdCBjb21wb25lbnRzIGFyZSBtb3VudGVkXG4gICAgICAgIC8vIChlZyBET00gcmVuZGVyZXIgbWF5IHNjaGVkdWxlIGF1dG8tZm9jdXMgZm9yIGlucHV0cyBhbmQgZm9ybSBjb250cm9scykuXG4gICAgICAgIC8vIFRoZXNlIGVmZmVjdHMgc2hvdWxkIG9ubHkgYmUgY29tbWl0dGVkIHdoZW4gY29tcG9uZW50cyBhcmUgZmlyc3QgbW91bnRlZCxcbiAgICAgICAgLy8gYWthIHdoZW4gdGhlcmUgaXMgbm8gY3VycmVudC9hbHRlcm5hdGUuXG4gICAgICAgIGlmIChjdXJyZW50JCQxID09PSBudWxsICYmIGZpbmlzaGVkV29yay5lZmZlY3RUYWcgJiBVcGRhdGUpIHtcbiAgICAgICAgICB2YXIgdHlwZSA9IGZpbmlzaGVkV29yay50eXBlO1xuICAgICAgICAgIHZhciBwcm9wcyA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzO1xuICAgICAgICAgIGNvbW1pdE1vdW50KF9pbnN0YW5jZTIsIHR5cGUsIHByb3BzLCBmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIC8vIFdlIGhhdmUgbm8gbGlmZS1jeWNsZXMgYXNzb2NpYXRlZCB3aXRoIHRleHQuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICB7XG4gICAgICAgIC8vIFdlIGhhdmUgbm8gbGlmZS1jeWNsZXMgYXNzb2NpYXRlZCB3aXRoIHBvcnRhbHMuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAge1xuICAgICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lcikge1xuICAgICAgICAgIHZhciBvblJlbmRlciA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLm9uUmVuZGVyO1xuXG4gICAgICAgICAgaWYgKGVuYWJsZVNjaGVkdWxlclRyYWNpbmcpIHtcbiAgICAgICAgICAgIG9uUmVuZGVyKGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLmlkLCBjdXJyZW50JCQxID09PSBudWxsID8gJ21vdW50JyA6ICd1cGRhdGUnLCBmaW5pc2hlZFdvcmsuYWN0dWFsRHVyYXRpb24sIGZpbmlzaGVkV29yay50cmVlQmFzZUR1cmF0aW9uLCBmaW5pc2hlZFdvcmsuYWN0dWFsU3RhcnRUaW1lLCBnZXRDb21taXRUaW1lKCksIGZpbmlzaGVkUm9vdC5tZW1vaXplZEludGVyYWN0aW9ucyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9uUmVuZGVyKGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLmlkLCBjdXJyZW50JCQxID09PSBudWxsID8gJ21vdW50JyA6ICd1cGRhdGUnLCBmaW5pc2hlZFdvcmsuYWN0dWFsRHVyYXRpb24sIGZpbmlzaGVkV29yay50cmVlQmFzZUR1cmF0aW9uLCBmaW5pc2hlZFdvcmsuYWN0dWFsU3RhcnRUaW1lLCBnZXRDb21taXRUaW1lKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgaW52YXJpYW50KGZhbHNlLCAnVGhpcyB1bml0IG9mIHdvcmsgdGFnIHNob3VsZCBub3QgaGF2ZSBzaWRlLWVmZmVjdHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4oZmluaXNoZWRXb3JrLCBpc0hpZGRlbikge1xuICBpZiAoc3VwcG9ydHNNdXRhdGlvbikge1xuICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGluc2VydGVkIGJ1dCB3ZSBuZWVkIHRvIHJlY3Vyc2UgZG93biBpdHNcbiAgICB2YXIgbm9kZSA9IGZpbmlzaGVkV29yaztcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50KSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IG5vZGUuc3RhdGVOb2RlO1xuICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICBoaWRlSW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuaGlkZUluc3RhbmNlKG5vZGUuc3RhdGVOb2RlLCBub2RlLm1lbW9pemVkUHJvcHMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICB2YXIgX2luc3RhbmNlMyA9IG5vZGUuc3RhdGVOb2RlO1xuICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICBoaWRlVGV4dEluc3RhbmNlKF9pbnN0YW5jZTMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuaGlkZVRleHRJbnN0YW5jZShfaW5zdGFuY2UzLCBub2RlLm1lbW9pemVkUHJvcHMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCAmJiBub2RlLm1lbW9pemVkU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgLy8gRm91bmQgYSBuZXN0ZWQgU3VzcGVuc2UgY29tcG9uZW50IHRoYXQgdGltZWQgb3V0LiBTa2lwIG92ZXIgdGhlXG4gICAgICAgIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBub2RlLmNoaWxkLnNpYmxpbmc7XG4gICAgICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGZpbmlzaGVkV29yaykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRBdHRhY2hSZWYoZmluaXNoZWRXb3JrKSB7XG4gIHZhciByZWYgPSBmaW5pc2hlZFdvcmsucmVmO1xuICBpZiAocmVmICE9PSBudWxsKSB7XG4gICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICB2YXIgaW5zdGFuY2VUb1VzZSA9IHZvaWQgMDtcbiAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgaW5zdGFuY2VUb1VzZSA9IGdldFB1YmxpY0luc3RhbmNlKGluc3RhbmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpbnN0YW5jZVRvVXNlID0gaW5zdGFuY2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZWYoaW5zdGFuY2VUb1VzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFyZWYuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSkge1xuICAgICAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1VuZXhwZWN0ZWQgcmVmIG9iamVjdCBwcm92aWRlZCBmb3IgJXMuICcgKyAnVXNlIGVpdGhlciBhIHJlZi1zZXR0ZXIgZnVuY3Rpb24gb3IgUmVhY3QuY3JlYXRlUmVmKCkuJXMnLCBnZXRDb21wb25lbnROYW1lKGZpbmlzaGVkV29yay50eXBlKSwgZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKGZpbmlzaGVkV29yaykpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlZi5jdXJyZW50ID0gaW5zdGFuY2VUb1VzZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0RGV0YWNoUmVmKGN1cnJlbnQkJDEpIHtcbiAgdmFyIGN1cnJlbnRSZWYgPSBjdXJyZW50JCQxLnJlZjtcbiAgaWYgKGN1cnJlbnRSZWYgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIGN1cnJlbnRSZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGN1cnJlbnRSZWYobnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbi8vIFVzZXItb3JpZ2luYXRpbmcgZXJyb3JzIChsaWZlY3ljbGVzIGFuZCByZWZzKSBzaG91bGQgbm90IGludGVycnVwdFxuLy8gZGVsZXRpb24sIHNvIGRvbid0IGxldCB0aGVtIHRocm93LiBIb3N0LW9yaWdpbmF0aW5nIGVycm9ycyBzaG91bGRcbi8vIGludGVycnVwdCBkZWxldGlvbiwgc28gaXQncyBva2F5XG5mdW5jdGlvbiBjb21taXRVbm1vdW50KGN1cnJlbnQkJDEpIHtcbiAgb25Db21taXRVbm1vdW50KGN1cnJlbnQkJDEpO1xuXG4gIHN3aXRjaCAoY3VycmVudCQkMS50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgdXBkYXRlUXVldWUgPSBjdXJyZW50JCQxLnVwZGF0ZVF1ZXVlO1xuICAgICAgICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgbGFzdEVmZmVjdCA9IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3Q7XG4gICAgICAgICAgaWYgKGxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICAgICAgICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgdmFyIGRlc3Ryb3kgPSBlZmZlY3QuZGVzdHJveTtcbiAgICAgICAgICAgICAgaWYgKGRlc3Ryb3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGN1cnJlbnQkJDEsIGRlc3Ryb3kpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0O1xuICAgICAgICAgICAgfSB3aGlsZSAoZWZmZWN0ICE9PSBmaXJzdEVmZmVjdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50JCQxKTtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gY3VycmVudCQkMS5zdGF0ZU5vZGU7XG4gICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoY3VycmVudCQkMSwgaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50JCQxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAgLy8gVE9ETzogdGhpcyBpcyByZWN1cnNpdmUuXG4gICAgICAgIC8vIFdlIGFyZSBhbHNvIG5vdCB1c2luZyB0aGlzIHBhcmVudCBiZWNhdXNlXG4gICAgICAgIC8vIHRoZSBwb3J0YWwgd2lsbCBnZXQgcHVzaGVkIGltbWVkaWF0ZWx5LlxuICAgICAgICBpZiAoc3VwcG9ydHNNdXRhdGlvbikge1xuICAgICAgICAgIHVubW91bnRIb3N0Q29tcG9uZW50cyhjdXJyZW50JCQxKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdXBwb3J0c1BlcnNpc3RlbmNlKSB7XG4gICAgICAgICAgZW1wdHlQb3J0YWxDb250YWluZXIoY3VycmVudCQkMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdE5lc3RlZFVubW91bnRzKHJvb3QpIHtcbiAgLy8gV2hpbGUgd2UncmUgaW5zaWRlIGEgcmVtb3ZlZCBob3N0IG5vZGUgd2UgZG9uJ3Qgd2FudCB0byBjYWxsXG4gIC8vIHJlbW92ZUNoaWxkIG9uIHRoZSBpbm5lciBub2RlcyBiZWNhdXNlIHRoZXkncmUgcmVtb3ZlZCBieSB0aGUgdG9wXG4gIC8vIGNhbGwgYW55d2F5LiBXZSBhbHNvIHdhbnQgdG8gY2FsbCBjb21wb25lbnRXaWxsVW5tb3VudCBvbiBhbGxcbiAgLy8gY29tcG9zaXRlcyBiZWZvcmUgdGhpcyBob3N0IG5vZGUgaXMgcmVtb3ZlZCBmcm9tIHRoZSB0cmVlLiBUaGVyZWZvcmVcbiAgdmFyIG5vZGUgPSByb290O1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbW1pdFVubW91bnQobm9kZSk7XG4gICAgLy8gVmlzaXQgY2hpbGRyZW4gYmVjYXVzZSB0aGV5IG1heSBjb250YWluIG1vcmUgY29tcG9zaXRlIG9yIGhvc3Qgbm9kZXMuXG4gICAgLy8gU2tpcCBwb3J0YWxzIGJlY2F1c2UgY29tbWl0VW5tb3VudCgpIGN1cnJlbnRseSB2aXNpdHMgdGhlbSByZWN1cnNpdmVseS5cbiAgICBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCAmJiAoXG4gICAgLy8gSWYgd2UgdXNlIG11dGF0aW9uIHdlIGRyaWxsIGRvd24gaW50byBwb3J0YWxzIHVzaW5nIGNvbW1pdFVubW91bnQgYWJvdmUuXG4gICAgLy8gSWYgd2UgZG9uJ3QgdXNlIG11dGF0aW9uIHdlIGRyaWxsIGRvd24gaW50byBwb3J0YWxzIGhlcmUgaW5zdGVhZC5cbiAgICAhc3VwcG9ydHNNdXRhdGlvbiB8fCBub2RlLnRhZyAhPT0gSG9zdFBvcnRhbCkpIHtcbiAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChub2RlID09PSByb290KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gcm9vdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRldGFjaEZpYmVyKGN1cnJlbnQkJDEpIHtcbiAgLy8gQ3V0IG9mZiB0aGUgcmV0dXJuIHBvaW50ZXJzIHRvIGRpc2Nvbm5lY3QgaXQgZnJvbSB0aGUgdHJlZS4gSWRlYWxseSwgd2VcbiAgLy8gc2hvdWxkIGNsZWFyIHRoZSBjaGlsZCBwb2ludGVyIG9mIHRoZSBwYXJlbnQgYWx0ZXJuYXRlIHRvIGxldCB0aGlzXG4gIC8vIGdldCBHQzplZCBidXQgd2UgZG9uJ3Qga25vdyB3aGljaCBmb3Igc3VyZSB3aGljaCBwYXJlbnQgaXMgdGhlIGN1cnJlbnRcbiAgLy8gb25lIHNvIHdlJ2xsIHNldHRsZSBmb3IgR0M6aW5nIHRoZSBzdWJ0cmVlIG9mIHRoaXMgY2hpbGQuIFRoaXMgY2hpbGRcbiAgLy8gaXRzZWxmIHdpbGwgYmUgR0M6ZWQgd2hlbiB0aGUgcGFyZW50IHVwZGF0ZXMgdGhlIG5leHQgdGltZS5cbiAgY3VycmVudCQkMS5yZXR1cm4gPSBudWxsO1xuICBjdXJyZW50JCQxLmNoaWxkID0gbnVsbDtcbiAgY3VycmVudCQkMS5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgY3VycmVudCQkMS51cGRhdGVRdWV1ZSA9IG51bGw7XG4gIHZhciBhbHRlcm5hdGUgPSBjdXJyZW50JCQxLmFsdGVybmF0ZTtcbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGFsdGVybmF0ZS5yZXR1cm4gPSBudWxsO1xuICAgIGFsdGVybmF0ZS5jaGlsZCA9IG51bGw7XG4gICAgYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIGFsdGVybmF0ZS51cGRhdGVRdWV1ZSA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1wdHlQb3J0YWxDb250YWluZXIoY3VycmVudCQkMSkge1xuICBpZiAoIXN1cHBvcnRzUGVyc2lzdGVuY2UpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcG9ydGFsID0gY3VycmVudCQkMS5zdGF0ZU5vZGU7XG4gIHZhciBjb250YWluZXJJbmZvID0gcG9ydGFsLmNvbnRhaW5lckluZm87XG5cbiAgdmFyIGVtcHR5Q2hpbGRTZXQgPSBjcmVhdGVDb250YWluZXJDaGlsZFNldChjb250YWluZXJJbmZvKTtcbiAgcmVwbGFjZUNvbnRhaW5lckNoaWxkcmVuKGNvbnRhaW5lckluZm8sIGVtcHR5Q2hpbGRTZXQpO1xufVxuXG5mdW5jdGlvbiBjb21taXRDb250YWluZXIoZmluaXNoZWRXb3JrKSB7XG4gIGlmICghc3VwcG9ydHNQZXJzaXN0ZW5jZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICB7XG4gICAgICAgIHZhciBwb3J0YWxPclJvb3QgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICB2YXIgY29udGFpbmVySW5mbyA9IHBvcnRhbE9yUm9vdC5jb250YWluZXJJbmZvLFxuICAgICAgICAgICAgX3BlbmRpbmdDaGlsZHJlbiA9IHBvcnRhbE9yUm9vdC5wZW5kaW5nQ2hpbGRyZW47XG5cbiAgICAgICAgcmVwbGFjZUNvbnRhaW5lckNoaWxkcmVuKGNvbnRhaW5lckluZm8sIF9wZW5kaW5nQ2hpbGRyZW4pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgaW52YXJpYW50KGZhbHNlLCAnVGhpcyB1bml0IG9mIHdvcmsgdGFnIHNob3VsZCBub3QgaGF2ZSBzaWRlLWVmZmVjdHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFBhcmVudEZpYmVyKGZpYmVyKSB7XG4gIHZhciBwYXJlbnQgPSBmaWJlci5yZXR1cm47XG4gIHdoaWxlIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICBpZiAoaXNIb3N0UGFyZW50KHBhcmVudCkpIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gIH1cbiAgaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgdG8gZmluZCBhIGhvc3QgcGFyZW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG5mdW5jdGlvbiBpc0hvc3RQYXJlbnQoZmliZXIpIHtcbiAgcmV0dXJuIGZpYmVyLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBmaWJlci50YWcgPT09IEhvc3RSb290IHx8IGZpYmVyLnRhZyA9PT0gSG9zdFBvcnRhbDtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFNpYmxpbmcoZmliZXIpIHtcbiAgLy8gV2UncmUgZ29pbmcgdG8gc2VhcmNoIGZvcndhcmQgaW50byB0aGUgdHJlZSB1bnRpbCB3ZSBmaW5kIGEgc2libGluZyBob3N0XG4gIC8vIG5vZGUuIFVuZm9ydHVuYXRlbHksIGlmIG11bHRpcGxlIGluc2VydGlvbnMgYXJlIGRvbmUgaW4gYSByb3cgd2UgaGF2ZSB0b1xuICAvLyBzZWFyY2ggcGFzdCB0aGVtLiBUaGlzIGxlYWRzIHRvIGV4cG9uZW50aWFsIHNlYXJjaCBmb3IgdGhlIG5leHQgc2libGluZy5cbiAgdmFyIG5vZGUgPSBmaWJlcjtcbiAgc2libGluZ3M6IHdoaWxlICh0cnVlKSB7XG4gICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcsIGxldCdzIHRyeSB0aGUgbmV4dCBzaWJsaW5nLlxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBpc0hvc3RQYXJlbnQobm9kZS5yZXR1cm4pKSB7XG4gICAgICAgIC8vIElmIHdlIHBvcCBvdXQgb2YgdGhlIHJvb3Qgb3IgaGl0IHRoZSBwYXJlbnQgdGhlIGZpYmVyIHdlIGFyZSB0aGVcbiAgICAgICAgLy8gbGFzdCBzaWJsaW5nLlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgd2hpbGUgKG5vZGUudGFnICE9PSBIb3N0Q29tcG9uZW50ICYmIG5vZGUudGFnICE9PSBIb3N0VGV4dCAmJiBub2RlLnRhZyAhPT0gRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICAvLyBJZiBpdCBpcyBub3QgaG9zdCBub2RlIGFuZCwgd2UgbWlnaHQgaGF2ZSBhIGhvc3Qgbm9kZSBpbnNpZGUgaXQuXG4gICAgICAvLyBUcnkgdG8gc2VhcmNoIGRvd24gdW50aWwgd2UgZmluZCBvbmUuXG4gICAgICBpZiAobm9kZS5lZmZlY3RUYWcgJiBQbGFjZW1lbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoaWxkLCB0cnkgdGhlIHNpYmxpbmdzIGluc3RlYWQuXG4gICAgICAgIGNvbnRpbnVlIHNpYmxpbmdzO1xuICAgICAgfVxuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoaWxkLCB0cnkgdGhlIHNpYmxpbmdzIGluc3RlYWQuXG4gICAgICAvLyBXZSBhbHNvIHNraXAgcG9ydGFscyBiZWNhdXNlIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoaXMgaG9zdCB0cmVlLlxuICAgICAgaWYgKG5vZGUuY2hpbGQgPT09IG51bGwgfHwgbm9kZS50YWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgY29udGludWUgc2libGluZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBDaGVjayBpZiB0aGlzIGhvc3Qgbm9kZSBpcyBzdGFibGUgb3IgYWJvdXQgdG8gYmUgcGxhY2VkLlxuICAgIGlmICghKG5vZGUuZWZmZWN0VGFnICYgUGxhY2VtZW50KSkge1xuICAgICAgLy8gRm91bmQgaXQhXG4gICAgICByZXR1cm4gbm9kZS5zdGF0ZU5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBsYWNlbWVudChmaW5pc2hlZFdvcmspIHtcbiAgaWYgKCFzdXBwb3J0c011dGF0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gUmVjdXJzaXZlbHkgaW5zZXJ0IGFsbCBob3N0IG5vZGVzIGludG8gdGhlIHBhcmVudC5cbiAgdmFyIHBhcmVudEZpYmVyID0gZ2V0SG9zdFBhcmVudEZpYmVyKGZpbmlzaGVkV29yayk7XG5cbiAgLy8gTm90ZTogdGhlc2UgdHdvIHZhcmlhYmxlcyAqbXVzdCogYWx3YXlzIGJlIHVwZGF0ZWQgdG9nZXRoZXIuXG4gIHZhciBwYXJlbnQgPSB2b2lkIDA7XG4gIHZhciBpc0NvbnRhaW5lciA9IHZvaWQgMDtcblxuICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHBhcmVudCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIGlzQ29udGFpbmVyID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAgcGFyZW50ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICBpc0NvbnRhaW5lciA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwYXJlbnQgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgIGlzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBpbnZhcmlhbnQoZmFsc2UsICdJbnZhbGlkIGhvc3QgcGFyZW50IGZpYmVyLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG4gIGlmIChwYXJlbnRGaWJlci5lZmZlY3RUYWcgJiBDb250ZW50UmVzZXQpIHtcbiAgICAvLyBSZXNldCB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBwYXJlbnQgYmVmb3JlIGRvaW5nIGFueSBpbnNlcnRpb25zXG4gICAgcmVzZXRUZXh0Q29udGVudChwYXJlbnQpO1xuICAgIC8vIENsZWFyIENvbnRlbnRSZXNldCBmcm9tIHRoZSBlZmZlY3QgdGFnXG4gICAgcGFyZW50RmliZXIuZWZmZWN0VGFnICY9IH5Db250ZW50UmVzZXQ7XG4gIH1cblxuICB2YXIgYmVmb3JlID0gZ2V0SG9zdFNpYmxpbmcoZmluaXNoZWRXb3JrKTtcbiAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgaW5zZXJ0ZWQgYnV0IHdlIG5lZWQgdG8gcmVjdXJzZSBkb3duIGl0c1xuICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gIHZhciBub2RlID0gZmluaXNoZWRXb3JrO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgIGlmIChiZWZvcmUpIHtcbiAgICAgICAgaWYgKGlzQ29udGFpbmVyKSB7XG4gICAgICAgICAgaW5zZXJ0SW5Db250YWluZXJCZWZvcmUocGFyZW50LCBub2RlLnN0YXRlTm9kZSwgYmVmb3JlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbnNlcnRCZWZvcmUocGFyZW50LCBub2RlLnN0YXRlTm9kZSwgYmVmb3JlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzQ29udGFpbmVyKSB7XG4gICAgICAgICAgYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcihwYXJlbnQsIG5vZGUuc3RhdGVOb2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhcHBlbmRDaGlsZChwYXJlbnQsIG5vZGUuc3RhdGVOb2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgIC8vIElmIHRoZSBpbnNlcnRpb24gaXRzZWxmIGlzIGEgcG9ydGFsLCB0aGVuIHdlIGRvbid0IHdhbnQgdG8gdHJhdmVyc2VcbiAgICAgIC8vIGRvd24gaXRzIGNoaWxkcmVuLiBJbnN0ZWFkLCB3ZSdsbCBnZXQgaW5zZXJ0aW9ucyBmcm9tIGVhY2ggY2hpbGQgaW5cbiAgICAgIC8vIHRoZSBwb3J0YWwgZGlyZWN0bHkuXG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAobm9kZSA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5tb3VudEhvc3RDb21wb25lbnRzKGN1cnJlbnQkJDEpIHtcbiAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgZGVsZXRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gIHZhciBub2RlID0gY3VycmVudCQkMTtcblxuICAvLyBFYWNoIGl0ZXJhdGlvbiwgY3VycmVudFBhcmVudCBpcyBwb3B1bGF0ZWQgd2l0aCBub2RlJ3MgaG9zdCBwYXJlbnQgaWYgbm90XG4gIC8vIGN1cnJlbnRQYXJlbnRJc1ZhbGlkLlxuICB2YXIgY3VycmVudFBhcmVudElzVmFsaWQgPSBmYWxzZTtcblxuICAvLyBOb3RlOiB0aGVzZSB0d28gdmFyaWFibGVzICptdXN0KiBhbHdheXMgYmUgdXBkYXRlZCB0b2dldGhlci5cbiAgdmFyIGN1cnJlbnRQYXJlbnQgPSB2b2lkIDA7XG4gIHZhciBjdXJyZW50UGFyZW50SXNDb250YWluZXIgPSB2b2lkIDA7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoIWN1cnJlbnRQYXJlbnRJc1ZhbGlkKSB7XG4gICAgICB2YXIgcGFyZW50ID0gbm9kZS5yZXR1cm47XG4gICAgICBmaW5kUGFyZW50OiB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAhKHBhcmVudCAhPT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCB0byBmaW5kIGEgaG9zdCBwYXJlbnQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJykgOiB2b2lkIDA7XG4gICAgICAgIHN3aXRjaCAocGFyZW50LnRhZykge1xuICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlO1xuICAgICAgICAgICAgY3VycmVudFBhcmVudElzQ29udGFpbmVyID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhayBmaW5kUGFyZW50O1xuICAgICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgICBjdXJyZW50UGFyZW50ID0gcGFyZW50LnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgY3VycmVudFBhcmVudElzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG4gICAgICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICAgICAgY3VycmVudFBhcmVudCA9IHBhcmVudC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICAgIGN1cnJlbnRQYXJlbnRJc0NvbnRhaW5lciA9IHRydWU7XG4gICAgICAgICAgICBicmVhayBmaW5kUGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gICAgICB9XG4gICAgICBjdXJyZW50UGFyZW50SXNWYWxpZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgY29tbWl0TmVzdGVkVW5tb3VudHMobm9kZSk7XG4gICAgICAvLyBBZnRlciBhbGwgdGhlIGNoaWxkcmVuIGhhdmUgdW5tb3VudGVkLCBpdCBpcyBub3cgc2FmZSB0byByZW1vdmUgdGhlXG4gICAgICAvLyBub2RlIGZyb20gdGhlIHRyZWUuXG4gICAgICBpZiAoY3VycmVudFBhcmVudElzQ29udGFpbmVyKSB7XG4gICAgICAgIHJlbW92ZUNoaWxkRnJvbUNvbnRhaW5lcihjdXJyZW50UGFyZW50LCBub2RlLnN0YXRlTm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZW1vdmVDaGlsZChjdXJyZW50UGFyZW50LCBub2RlLnN0YXRlTm9kZSk7XG4gICAgICB9XG4gICAgICAvLyBEb24ndCB2aXNpdCBjaGlsZHJlbiBiZWNhdXNlIHdlIGFscmVhZHkgdmlzaXRlZCB0aGVtLlxuICAgIH0gZWxzZSBpZiAoZW5hYmxlU3VzcGVuc2VTZXJ2ZXJSZW5kZXJlciAmJiBub2RlLnRhZyA9PT0gRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICAvLyBEZWxldGUgdGhlIGRlaHlkcmF0ZWQgc3VzcGVuc2UgYm91bmRhcnkgYW5kIGFsbCBvZiBpdHMgY29udGVudC5cbiAgICAgIGlmIChjdXJyZW50UGFyZW50SXNDb250YWluZXIpIHtcbiAgICAgICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5RnJvbUNvbnRhaW5lcihjdXJyZW50UGFyZW50LCBub2RlLnN0YXRlTm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGVhclN1c3BlbnNlQm91bmRhcnkoY3VycmVudFBhcmVudCwgbm9kZS5zdGF0ZU5vZGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIC8vIFdoZW4gd2UgZ28gaW50byBhIHBvcnRhbCwgaXQgYmVjb21lcyB0aGUgcGFyZW50IHRvIHJlbW92ZSBmcm9tLlxuICAgICAgICAvLyBXZSB3aWxsIHJlYXNzaWduIGl0IGJhY2sgd2hlbiB3ZSBwb3AgdGhlIHBvcnRhbCBvbiB0aGUgd2F5IHVwLlxuICAgICAgICBjdXJyZW50UGFyZW50ID0gbm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgY3VycmVudFBhcmVudElzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgICAgLy8gVmlzaXQgY2hpbGRyZW4gYmVjYXVzZSBwb3J0YWxzIG1pZ2h0IGNvbnRhaW4gaG9zdCBjb21wb25lbnRzLlxuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0VW5tb3VudChub2RlKTtcbiAgICAgIC8vIFZpc2l0IGNoaWxkcmVuIGJlY2F1c2Ugd2UgbWF5IGZpbmQgbW9yZSBob3N0IGNvbXBvbmVudHMgYmVsb3cuXG4gICAgICBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5vZGUgPT09IGN1cnJlbnQkJDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSBjdXJyZW50JCQxKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAvLyBXaGVuIHdlIGdvIG91dCBvZiB0aGUgcG9ydGFsLCB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIHBhcmVudC5cbiAgICAgICAgLy8gU2luY2Ugd2UgZG9uJ3Qga2VlcCBhIHN0YWNrIG9mIHRoZW0sIHdlIHdpbGwgc2VhcmNoIGZvciBpdC5cbiAgICAgICAgY3VycmVudFBhcmVudElzVmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0RGVsZXRpb24oY3VycmVudCQkMSkge1xuICBpZiAoc3VwcG9ydHNNdXRhdGlvbikge1xuICAgIC8vIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBhbGwgaG9zdCBub2RlcyBmcm9tIHRoZSBwYXJlbnQuXG4gICAgLy8gRGV0YWNoIHJlZnMgYW5kIGNhbGwgY29tcG9uZW50V2lsbFVubW91bnQoKSBvbiB0aGUgd2hvbGUgc3VidHJlZS5cbiAgICB1bm1vdW50SG9zdENvbXBvbmVudHMoY3VycmVudCQkMSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gRGV0YWNoIHJlZnMgYW5kIGNhbGwgY29tcG9uZW50V2lsbFVubW91bnQoKSBvbiB0aGUgd2hvbGUgc3VidHJlZS5cbiAgICBjb21taXROZXN0ZWRVbm1vdW50cyhjdXJyZW50JCQxKTtcbiAgfVxuICBkZXRhY2hGaWJlcihjdXJyZW50JCQxKTtcbn1cblxuZnVuY3Rpb24gY29tbWl0V29yayhjdXJyZW50JCQxLCBmaW5pc2hlZFdvcmspIHtcbiAgaWYgKCFzdXBwb3J0c011dGF0aW9uKSB7XG4gICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gTm90ZTogV2UgY3VycmVudGx5IG5ldmVyIHVzZSBNb3VudE11dGF0aW9uLCBidXQgdXNlTGF5b3V0IHVzZXNcbiAgICAgICAgICAvLyBVbm1vdW50TXV0YXRpb24uXG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3QoVW5tb3VudE11dGF0aW9uLCBNb3VudE11dGF0aW9uLCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbW1pdENvbnRhaW5lcihmaW5pc2hlZFdvcmspO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIE5vdGU6IFdlIGN1cnJlbnRseSBuZXZlciB1c2UgTW91bnRNdXRhdGlvbiwgYnV0IHVzZUxheW91dCB1c2VzXG4gICAgICAgIC8vIFVubW91bnRNdXRhdGlvbi5cbiAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3QoVW5tb3VudE11dGF0aW9uLCBNb3VudE11dGF0aW9uLCBmaW5pc2hlZFdvcmspO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgaWYgKGluc3RhbmNlICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBDb21taXQgdGhlIHdvcmsgcHJlcGFyZWQgZWFybGllci5cbiAgICAgICAgICB2YXIgbmV3UHJvcHMgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAvLyBGb3IgaHlkcmF0aW9uIHdlIHJldXNlIHRoZSB1cGRhdGUgcGF0aCBidXQgd2UgdHJlYXQgdGhlIG9sZFByb3BzXG4gICAgICAgICAgLy8gYXMgdGhlIG5ld1Byb3BzLiBUaGUgdXBkYXRlUGF5bG9hZCB3aWxsIGNvbnRhaW4gdGhlIHJlYWwgY2hhbmdlIGluXG4gICAgICAgICAgLy8gdGhpcyBjYXNlLlxuICAgICAgICAgIHZhciBvbGRQcm9wcyA9IGN1cnJlbnQkJDEgIT09IG51bGwgPyBjdXJyZW50JCQxLm1lbW9pemVkUHJvcHMgOiBuZXdQcm9wcztcbiAgICAgICAgICB2YXIgdHlwZSA9IGZpbmlzaGVkV29yay50eXBlO1xuICAgICAgICAgIC8vIFRPRE86IFR5cGUgdGhlIHVwZGF0ZVF1ZXVlIHRvIGJlIHNwZWNpZmljIHRvIGhvc3QgY29tcG9uZW50cy5cbiAgICAgICAgICB2YXIgdXBkYXRlUGF5bG9hZCA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgICAgICAgICBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUgPSBudWxsO1xuICAgICAgICAgIGlmICh1cGRhdGVQYXlsb2FkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21taXRVcGRhdGUoaW5zdGFuY2UsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgICEoZmluaXNoZWRXb3JrLnN0YXRlTm9kZSAhPT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICdUaGlzIHNob3VsZCBoYXZlIGEgdGV4dCBub2RlIGluaXRpYWxpemVkLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpIDogdm9pZCAwO1xuICAgICAgICB2YXIgdGV4dEluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgdmFyIG5ld1RleHQgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgLy8gRm9yIGh5ZHJhdGlvbiB3ZSByZXVzZSB0aGUgdXBkYXRlIHBhdGggYnV0IHdlIHRyZWF0IHRoZSBvbGRQcm9wc1xuICAgICAgICAvLyBhcyB0aGUgbmV3UHJvcHMuIFRoZSB1cGRhdGVQYXlsb2FkIHdpbGwgY29udGFpbiB0aGUgcmVhbCBjaGFuZ2UgaW5cbiAgICAgICAgLy8gdGhpcyBjYXNlLlxuICAgICAgICB2YXIgb2xkVGV4dCA9IGN1cnJlbnQkJDEgIT09IG51bGwgPyBjdXJyZW50JCQxLm1lbW9pemVkUHJvcHMgOiBuZXdUZXh0O1xuICAgICAgICBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBuZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgIHZhciBuZXdEaWRUaW1lb3V0ID0gdm9pZCAwO1xuICAgICAgICB2YXIgcHJpbWFyeUNoaWxkUGFyZW50ID0gZmluaXNoZWRXb3JrO1xuICAgICAgICBpZiAobmV3U3RhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICBuZXdEaWRUaW1lb3V0ID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3RGlkVGltZW91dCA9IHRydWU7XG4gICAgICAgICAgcHJpbWFyeUNoaWxkUGFyZW50ID0gZmluaXNoZWRXb3JrLmNoaWxkO1xuICAgICAgICAgIGlmIChuZXdTdGF0ZS50aW1lZE91dEF0ID09PSBOb1dvcmspIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBjaGlsZHJlbiBoYWQgbm90IGFscmVhZHkgdGltZWQgb3V0LCByZWNvcmQgdGhlIHRpbWUuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGR1cmluZyBzdWJzZXF1ZW50XG4gICAgICAgICAgICAvLyBhdHRlbXB0cyB0byByZW5kZXIgdGhlIGNoaWxkcmVuLlxuICAgICAgICAgICAgbmV3U3RhdGUudGltZWRPdXRBdCA9IHJlcXVlc3RDdXJyZW50VGltZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmltYXJ5Q2hpbGRQYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICBoaWRlT3JVbmhpZGVBbGxDaGlsZHJlbihwcmltYXJ5Q2hpbGRQYXJlbnQsIG5ld0RpZFRpbWVvdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhpcyBib3VuZGFyeSBqdXN0IHRpbWVkIG91dCwgdGhlbiBpdCB3aWxsIGhhdmUgYSBzZXQgb2YgdGhlbmFibGVzLlxuICAgICAgICAvLyBGb3IgZWFjaCB0aGVuYWJsZSwgYXR0YWNoIGEgbGlzdGVuZXIgc28gdGhhdCB3aGVuIGl0IHJlc29sdmVzLCBSZWFjdFxuICAgICAgICAvLyBhdHRlbXB0cyB0byByZS1yZW5kZXIgdGhlIGJvdW5kYXJ5IGluIHRoZSBwcmltYXJ5IChwcmUtdGltZW91dCkgc3RhdGUuXG4gICAgICAgIHZhciB0aGVuYWJsZXMgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gICAgICAgIGlmICh0aGVuYWJsZXMgIT09IG51bGwpIHtcbiAgICAgICAgICBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUgPSBudWxsO1xuICAgICAgICAgIHZhciByZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICBpZiAocmV0cnlDYWNoZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0cnlDYWNoZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUgPSBuZXcgUG9zc2libHlXZWFrU2V0JDEoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhlbmFibGVzLmZvckVhY2goZnVuY3Rpb24gKHRoZW5hYmxlKSB7XG4gICAgICAgICAgICAvLyBNZW1vaXplIHVzaW5nIHRoZSBib3VuZGFyeSBmaWJlciB0byBwcmV2ZW50IHJlZHVuZGFudCBsaXN0ZW5lcnMuXG4gICAgICAgICAgICB2YXIgcmV0cnkgPSByZXRyeVRpbWVkT3V0Qm91bmRhcnkuYmluZChudWxsLCBmaW5pc2hlZFdvcmssIHRoZW5hYmxlKTtcbiAgICAgICAgICAgIGlmIChlbmFibGVTY2hlZHVsZXJUcmFjaW5nKSB7XG4gICAgICAgICAgICAgIHJldHJ5ID0gdHJhY2luZy51bnN0YWJsZV93cmFwKHJldHJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcmV0cnlDYWNoZS5oYXModGhlbmFibGUpKSB7XG4gICAgICAgICAgICAgIHJldHJ5Q2FjaGUuYWRkKHRoZW5hYmxlKTtcbiAgICAgICAgICAgICAgdGhlbmFibGUudGhlbihyZXRyeSwgcmV0cnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgaW52YXJpYW50KGZhbHNlLCAnVGhpcyB1bml0IG9mIHdvcmsgdGFnIHNob3VsZCBub3QgaGF2ZSBzaWRlLWVmZmVjdHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UmVzZXRUZXh0Q29udGVudChjdXJyZW50JCQxKSB7XG4gIGlmICghc3VwcG9ydHNNdXRhdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuICByZXNldFRleHRDb250ZW50KGN1cnJlbnQkJDEuc3RhdGVOb2RlKTtcbn1cblxudmFyIFBvc3NpYmx5V2Vha1NldCA9IHR5cGVvZiBXZWFrU2V0ID09PSAnZnVuY3Rpb24nID8gV2Vha1NldCA6IFNldDtcbnZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvb3RFcnJvclVwZGF0ZShmaWJlciwgZXJyb3JJbmZvLCBleHBpcmF0aW9uVGltZSkge1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV4cGlyYXRpb25UaW1lKTtcbiAgLy8gVW5tb3VudCB0aGUgcm9vdCBieSByZW5kZXJpbmcgbnVsbC5cbiAgdXBkYXRlLnRhZyA9IENhcHR1cmVVcGRhdGU7XG4gIC8vIENhdXRpb246IFJlYWN0IERldlRvb2xzIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJvcGVydHlcbiAgLy8gYmVpbmcgY2FsbGVkIFwiZWxlbWVudFwiLlxuICB1cGRhdGUucGF5bG9hZCA9IHsgZWxlbWVudDogbnVsbCB9O1xuICB2YXIgZXJyb3IgPSBlcnJvckluZm8udmFsdWU7XG4gIHVwZGF0ZS5jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICBvblVuY2F1Z2h0RXJyb3IoZXJyb3IpO1xuICAgIGxvZ0Vycm9yKGZpYmVyLCBlcnJvckluZm8pO1xuICB9O1xuICByZXR1cm4gdXBkYXRlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIGV4cGlyYXRpb25UaW1lKSB7XG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXhwaXJhdGlvblRpbWUpO1xuICB1cGRhdGUudGFnID0gQ2FwdHVyZVVwZGF0ZTtcbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9IGZpYmVyLnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yO1xuICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBlcnJvciA9IGVycm9ySW5mby52YWx1ZTtcbiAgICB1cGRhdGUucGF5bG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZXJyb3IpO1xuICAgIH07XG4gIH1cblxuICB2YXIgaW5zdCA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgaWYgKGluc3QgIT09IG51bGwgJiYgdHlwZW9mIGluc3QuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRvIHByZXNlcnZlIHRoZSBwcmVleGlzdGluZyByZXRyeSBiZWhhdmlvciBvZiBlcnJvciBib3VuZGFyaWVzLFxuICAgICAgICAvLyB3ZSBrZWVwIHRyYWNrIG9mIHdoaWNoIG9uZXMgYWxyZWFkeSBmYWlsZWQgZHVyaW5nIHRoaXMgYmF0Y2guXG4gICAgICAgIC8vIFRoaXMgZ2V0cyByZXNldCBiZWZvcmUgd2UgeWllbGQgYmFjayB0byB0aGUgYnJvd3Nlci5cbiAgICAgICAgLy8gVE9ETzogV2FybiBpbiBzdHJpY3QgbW9kZSBpZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgaXNcbiAgICAgICAgLy8gbm90IGRlZmluZWQuXG4gICAgICAgIG1hcmtMZWdhY3lFcnJvckJvdW5kYXJ5QXNGYWlsZWQodGhpcyk7XG4gICAgICB9XG4gICAgICB2YXIgZXJyb3IgPSBlcnJvckluZm8udmFsdWU7XG4gICAgICB2YXIgc3RhY2sgPSBlcnJvckluZm8uc3RhY2s7XG4gICAgICBsb2dFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcbiAgICAgIHRoaXMuY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IsIHtcbiAgICAgICAgY29tcG9uZW50U3RhY2s6IHN0YWNrICE9PSBudWxsID8gc3RhY2sgOiAnJ1xuICAgICAgfSk7XG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gSWYgY29tcG9uZW50RGlkQ2F0Y2ggaXMgdGhlIG9ubHkgZXJyb3IgYm91bmRhcnkgbWV0aG9kIGRlZmluZWQsXG4gICAgICAgICAgLy8gdGhlbiBpdCBuZWVkcyB0byBjYWxsIHNldFN0YXRlIHRvIHJlY292ZXIgZnJvbSBlcnJvcnMuXG4gICAgICAgICAgLy8gSWYgbm8gc3RhdGUgdXBkYXRlIGlzIHNjaGVkdWxlZCB0aGVuIHRoZSBib3VuZGFyeSB3aWxsIHN3YWxsb3cgdGhlIGVycm9yLlxuICAgICAgICAgICEoZmliZXIuZXhwaXJhdGlvblRpbWUgPT09IFN5bmMpID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnJXM6IEVycm9yIGJvdW5kYXJpZXMgc2hvdWxkIGltcGxlbWVudCBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoKS4gJyArICdJbiB0aGF0IG1ldGhvZCwgcmV0dXJuIGEgc3RhdGUgdXBkYXRlIHRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBvciBmYWxsYmFjayBVSS4nLCBnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdVbmtub3duJykgOiB2b2lkIDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHJldHVybiB1cGRhdGU7XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCByZW5kZXJFeHBpcmF0aW9uVGltZSwgdGhlbmFibGUpIHtcbiAgLy8gQXR0YWNoIGEgbGlzdGVuZXIgdG8gdGhlIHByb21pc2UgdG8gXCJwaW5nXCIgdGhlIHJvb3QgYW5kIHJldHJ5LiBCdXRcbiAgLy8gb25seSBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGN1cnJlbnQgcmVuZGVyIGV4cGlyYXRpb25cbiAgLy8gdGltZSAod2hpY2ggYWN0cyBsaWtlIGEgXCJ0aHJlYWQgSURcIiBoZXJlKS5cbiAgdmFyIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlO1xuICB2YXIgdGhyZWFkSURzID0gdm9pZCAwO1xuICBpZiAocGluZ0NhY2hlID09PSBudWxsKSB7XG4gICAgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG4gICAgdGhyZWFkSURzID0gbmV3IFNldCgpO1xuICAgIHBpbmdDYWNoZS5zZXQodGhlbmFibGUsIHRocmVhZElEcyk7XG4gIH0gZWxzZSB7XG4gICAgdGhyZWFkSURzID0gcGluZ0NhY2hlLmdldCh0aGVuYWJsZSk7XG4gICAgaWYgKHRocmVhZElEcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJlYWRJRHMgPSBuZXcgU2V0KCk7XG4gICAgICBwaW5nQ2FjaGUuc2V0KHRoZW5hYmxlLCB0aHJlYWRJRHMpO1xuICAgIH1cbiAgfVxuICBpZiAoIXRocmVhZElEcy5oYXMocmVuZGVyRXhwaXJhdGlvblRpbWUpKSB7XG4gICAgLy8gTWVtb2l6ZSB1c2luZyB0aGUgdGhyZWFkIElEIHRvIHByZXZlbnQgcmVkdW5kYW50IGxpc3RlbmVycy5cbiAgICB0aHJlYWRJRHMuYWRkKHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICB2YXIgcGluZyA9IHBpbmdTdXNwZW5kZWRSb290LmJpbmQobnVsbCwgcm9vdCwgdGhlbmFibGUsIHJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICBpZiAoZW5hYmxlU2NoZWR1bGVyVHJhY2luZykge1xuICAgICAgcGluZyA9IHRyYWNpbmcudW5zdGFibGVfd3JhcChwaW5nKTtcbiAgICB9XG4gICAgdGhlbmFibGUudGhlbihwaW5nLCBwaW5nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0aHJvd0V4Y2VwdGlvbihyb290LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHZhbHVlLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAvLyBUaGUgc291cmNlIGZpYmVyIGRpZCBub3QgY29tcGxldGUuXG4gIHNvdXJjZUZpYmVyLmVmZmVjdFRhZyB8PSBJbmNvbXBsZXRlO1xuICAvLyBJdHMgZWZmZWN0IGxpc3QgaXMgbm8gbG9uZ2VyIHZhbGlkLlxuICBzb3VyY2VGaWJlci5maXJzdEVmZmVjdCA9IHNvdXJjZUZpYmVyLmxhc3RFZmZlY3QgPSBudWxsO1xuXG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVGhpcyBpcyBhIHRoZW5hYmxlLlxuICAgIHZhciB0aGVuYWJsZSA9IHZhbHVlO1xuXG4gICAgLy8gRmluZCB0aGUgZWFybGllc3QgdGltZW91dCB0aHJlc2hvbGQgb2YgYWxsIHRoZSBwbGFjZWhvbGRlcnMgaW4gdGhlXG4gICAgLy8gYW5jZXN0b3IgcGF0aC4gV2UgY291bGQgYXZvaWQgdGhpcyB0cmF2ZXJzYWwgYnkgc3RvcmluZyB0aGUgdGhyZXNob2xkcyBvblxuICAgIC8vIHRoZSBzdGFjaywgYnV0IHdlIGNob29zZSBub3QgdG8gYmVjYXVzZSB3ZSBvbmx5IGhpdCB0aGlzIHBhdGggaWYgd2UncmVcbiAgICAvLyBJTy1ib3VuZCAoaS5lLiBpZiBzb21ldGhpbmcgc3VzcGVuZHMpLiBXaGVyZWFzIHRoZSBzdGFjayBpcyB1c2VkIGV2ZW4gaW5cbiAgICAvLyB0aGUgbm9uLUlPLSBib3VuZCBjYXNlLlxuICAgIHZhciBfd29ya0luUHJvZ3Jlc3MgPSByZXR1cm5GaWJlcjtcbiAgICB2YXIgZWFybGllc3RUaW1lb3V0TXMgPSAtMTtcbiAgICB2YXIgc3RhcnRUaW1lTXMgPSAtMTtcbiAgICBkbyB7XG4gICAgICBpZiAoX3dvcmtJblByb2dyZXNzLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGN1cnJlbnQkJDEgPSBfd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuICAgICAgICBpZiAoY3VycmVudCQkMSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSBjdXJyZW50JCQxLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gUmVhY2hlZCBhIGJvdW5kYXJ5IHRoYXQgYWxyZWFkeSB0aW1lZCBvdXQuIERvIG5vdCBzZWFyY2hcbiAgICAgICAgICAgIC8vIGFueSBmdXJ0aGVyLlxuICAgICAgICAgICAgdmFyIHRpbWVkT3V0QXQgPSBjdXJyZW50U3RhdGUudGltZWRPdXRBdDtcbiAgICAgICAgICAgIHN0YXJ0VGltZU1zID0gZXhwaXJhdGlvblRpbWVUb01zKHRpbWVkT3V0QXQpO1xuICAgICAgICAgICAgLy8gRG8gbm90IHNlYXJjaCBhbnkgZnVydGhlci5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgdGltZW91dFByb3BNcyA9IF93b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMubWF4RHVyYXRpb247XG4gICAgICAgIGlmICh0eXBlb2YgdGltZW91dFByb3BNcyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBpZiAodGltZW91dFByb3BNcyA8PSAwKSB7XG4gICAgICAgICAgICBlYXJsaWVzdFRpbWVvdXRNcyA9IDA7XG4gICAgICAgICAgfSBlbHNlIGlmIChlYXJsaWVzdFRpbWVvdXRNcyA9PT0gLTEgfHwgdGltZW91dFByb3BNcyA8IGVhcmxpZXN0VGltZW91dE1zKSB7XG4gICAgICAgICAgICBlYXJsaWVzdFRpbWVvdXRNcyA9IHRpbWVvdXRQcm9wTXM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBJZiB0aGVyZSBpcyBhIERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudCB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGJlY2F1c2VcbiAgICAgIC8vIGlmIHNvbWV0aGluZyBzdXNwZW5kcyBpbnNpZGUgaXQsIHdlIHdpbGwgc2ltcGx5IGxlYXZlIHRoYXQgYXMgZGVoeWRyYXRlZC4gSXRcbiAgICAgIC8vIHdpbGwgbmV2ZXIgdGltZW91dC5cbiAgICAgIF93b3JrSW5Qcm9ncmVzcyA9IF93b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gICAgfSB3aGlsZSAoX3dvcmtJblByb2dyZXNzICE9PSBudWxsKTtcblxuICAgIC8vIFNjaGVkdWxlIHRoZSBuZWFyZXN0IFN1c3BlbnNlIHRvIHJlLXJlbmRlciB0aGUgdGltZWQgb3V0IHZpZXcuXG4gICAgX3dvcmtJblByb2dyZXNzID0gcmV0dXJuRmliZXI7XG4gICAgZG8ge1xuICAgICAgaWYgKF93b3JrSW5Qcm9ncmVzcy50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50ICYmIHNob3VsZENhcHR1cmVTdXNwZW5zZShfd29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICAgIC8vIEZvdW5kIHRoZSBuZWFyZXN0IGJvdW5kYXJ5LlxuXG4gICAgICAgIC8vIFN0YXNoIHRoZSBwcm9taXNlIG9uIHRoZSBib3VuZGFyeSBmaWJlci4gSWYgdGhlIGJvdW5kYXJ5IHRpbWVzIG91dCwgd2UnbGxcbiAgICAgICAgdmFyIHRoZW5hYmxlcyA9IF93b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgICAgICAgaWYgKHRoZW5hYmxlcyA9PT0gbnVsbCkge1xuICAgICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IG5ldyBTZXQoKTtcbiAgICAgICAgICB1cGRhdGVRdWV1ZS5hZGQodGhlbmFibGUpO1xuICAgICAgICAgIF93b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IHVwZGF0ZVF1ZXVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoZW5hYmxlcy5hZGQodGhlbmFibGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIGJvdW5kYXJ5IGlzIG91dHNpZGUgb2YgY29uY3VycmVudCBtb2RlLCB3ZSBzaG91bGQgKm5vdCpcbiAgICAgICAgLy8gc3VzcGVuZCB0aGUgY29tbWl0LiBQcmV0ZW5kIGFzIGlmIHRoZSBzdXNwZW5kZWQgY29tcG9uZW50IHJlbmRlcmVkXG4gICAgICAgIC8vIG51bGwgYW5kIGtlZXAgcmVuZGVyaW5nLiBJbiB0aGUgY29tbWl0IHBoYXNlLCB3ZSdsbCBzY2hlZHVsZSBhXG4gICAgICAgIC8vIHN1YnNlcXVlbnQgc3luY2hyb25vdXMgdXBkYXRlIHRvIHJlLXJlbmRlciB0aGUgU3VzcGVuc2UuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE5vdGU6IEl0IGRvZXNuJ3QgbWF0dGVyIHdoZXRoZXIgdGhlIGNvbXBvbmVudCB0aGF0IHN1c3BlbmRlZCB3YXNcbiAgICAgICAgLy8gaW5zaWRlIGEgY29uY3VycmVudCBtb2RlIHRyZWUuIElmIHRoZSBTdXNwZW5zZSBpcyBvdXRzaWRlIG9mIGl0LCB3ZVxuICAgICAgICAvLyBzaG91bGQgKm5vdCogc3VzcGVuZCB0aGUgY29tbWl0LlxuICAgICAgICBpZiAoKF93b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb0VmZmVjdCkge1xuICAgICAgICAgIF93b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gRGlkQ2FwdHVyZTtcblxuICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGNvbW1pdCB0aGlzIGZpYmVyIGV2ZW4gdGhvdWdoIGl0IGRpZG4ndCBjb21wbGV0ZS5cbiAgICAgICAgICAvLyBCdXQgd2Ugc2hvdWxkbid0IGNhbGwgYW55IGxpZmVjeWNsZSBtZXRob2RzIG9yIGNhbGxiYWNrcy4gUmVtb3ZlXG4gICAgICAgICAgLy8gYWxsIGxpZmVjeWNsZSBlZmZlY3QgdGFncy5cbiAgICAgICAgICBzb3VyY2VGaWJlci5lZmZlY3RUYWcgJj0gfihMaWZlY3ljbGVFZmZlY3RNYXNrIHwgSW5jb21wbGV0ZSk7XG5cbiAgICAgICAgICBpZiAoc291cmNlRmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRTb3VyY2VGaWJlciA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50U291cmNlRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG5ldyBtb3VudC4gQ2hhbmdlIHRoZSB0YWcgc28gaXQncyBub3QgbWlzdGFrZW4gZm9yIGFcbiAgICAgICAgICAgICAgLy8gY29tcGxldGVkIGNsYXNzIGNvbXBvbmVudC4gRm9yIGV4YW1wbGUsIHdlIHNob3VsZCBub3QgY2FsbFxuICAgICAgICAgICAgICAvLyBjb21wb25lbnRXaWxsVW5tb3VudCBpZiBpdCBpcyBkZWxldGVkLlxuICAgICAgICAgICAgICBzb3VyY2VGaWJlci50YWcgPSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBXaGVuIHdlIHRyeSByZW5kZXJpbmcgYWdhaW4sIHdlIHNob3VsZCBub3QgcmV1c2UgdGhlIGN1cnJlbnQgZmliZXIsXG4gICAgICAgICAgICAgIC8vIHNpbmNlIGl0J3Mga25vd24gdG8gYmUgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBVc2UgYSBmb3JjZSB1cGR0ZSB0b1xuICAgICAgICAgICAgICAvLyBwcmV2ZW50IGEgYmFpbCBvdXQuXG4gICAgICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoU3luYyk7XG4gICAgICAgICAgICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTtcbiAgICAgICAgICAgICAgZW5xdWV1ZVVwZGF0ZShzb3VyY2VGaWJlciwgdXBkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUaGUgc291cmNlIGZpYmVyIGRpZCBub3QgY29tcGxldGUuIE1hcmsgaXQgd2l0aCBTeW5jIHByaW9yaXR5IHRvXG4gICAgICAgICAgLy8gaW5kaWNhdGUgdGhhdCBpdCBzdGlsbCBoYXMgcGVuZGluZyB3b3JrLlxuICAgICAgICAgIHNvdXJjZUZpYmVyLmV4cGlyYXRpb25UaW1lID0gU3luYztcblxuICAgICAgICAgIC8vIEV4aXQgd2l0aG91dCBzdXNwZW5kaW5nLlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbmZpcm1lZCB0aGF0IHRoZSBib3VuZGFyeSBpcyBpbiBhIGNvbmN1cnJlbnQgbW9kZSB0cmVlLiBDb250aW51ZVxuICAgICAgICAvLyB3aXRoIHRoZSBub3JtYWwgc3VzcGVuZCBwYXRoLlxuXG4gICAgICAgIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCByZW5kZXJFeHBpcmF0aW9uVGltZSwgdGhlbmFibGUpO1xuXG4gICAgICAgIHZhciBhYnNvbHV0ZVRpbWVvdXRNcyA9IHZvaWQgMDtcbiAgICAgICAgaWYgKGVhcmxpZXN0VGltZW91dE1zID09PSAtMSkge1xuICAgICAgICAgIC8vIElmIG5vIGV4cGxpY2l0IHRocmVzaG9sZCBpcyBnaXZlbiwgZGVmYXVsdCB0byBhbiBhcmJpdHJhcmlseSBsYXJnZVxuICAgICAgICAgIC8vIHZhbHVlLiBUaGUgYWN0dWFsIHNpemUgZG9lc24ndCBtYXR0ZXIgYmVjYXVzZSB0aGUgdGhyZXNob2xkIGZvciB0aGVcbiAgICAgICAgICAvLyB3aG9sZSB0cmVlIHdpbGwgYmUgY2xhbXBlZCB0byB0aGUgZXhwaXJhdGlvbiB0aW1lLlxuICAgICAgICAgIGFic29sdXRlVGltZW91dE1zID0gbWF4U2lnbmVkMzFCaXRJbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHN0YXJ0VGltZU1zID09PSAtMSkge1xuICAgICAgICAgICAgLy8gVGhpcyBzdXNwZW5kIGhhcHBlbmVkIG91dHNpZGUgb2YgYW55IGFscmVhZHkgdGltZWQtb3V0XG4gICAgICAgICAgICAvLyBwbGFjZWhvbGRlcnMuIFdlIGRvbid0IGtub3cgZXhhY3RseSB3aGVuIHRoZSB1cGRhdGUgd2FzXG4gICAgICAgICAgICAvLyBzY2hlZHVsZWQsIGJ1dCB3ZSBjYW4gaW5mZXIgYW4gYXBwcm94aW1hdGUgc3RhcnQgdGltZSBmcm9tIHRoZVxuICAgICAgICAgICAgLy8gZXhwaXJhdGlvbiB0aW1lLiBGaXJzdCwgZmluZCB0aGUgZWFybGllc3QgdW5jb21taXR0ZWQgZXhwaXJhdGlvblxuICAgICAgICAgICAgLy8gdGltZSBpbiB0aGUgdHJlZSwgaW5jbHVkaW5nIHdvcmsgdGhhdCBpcyBzdXNwZW5kZWQuIFRoZW4gc3VidHJhY3RcbiAgICAgICAgICAgIC8vIHRoZSBvZmZzZXQgdXNlZCB0byBjb21wdXRlIGFuIGFzeW5jIHVwZGF0ZSdzIGV4cGlyYXRpb24gdGltZS5cbiAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBjYXVzZSBoaWdoIHByaW9yaXR5IChpbnRlcmFjdGl2ZSkgd29yayB0byBleHBpcmVcbiAgICAgICAgICAgIC8vIGVhcmxpZXIgdGhhbiBuZWNlc3NhcnksIGJ1dCB3ZSBjYW4gYWNjb3VudCBmb3IgdGhpcyBieSBhZGp1c3RpbmdcbiAgICAgICAgICAgIC8vIGZvciB0aGUgSnVzdCBOb3RpY2VhYmxlIERpZmZlcmVuY2UuXG4gICAgICAgICAgICB2YXIgZWFybGllc3RFeHBpcmF0aW9uVGltZSA9IGZpbmRFYXJsaWVzdE91dHN0YW5kaW5nUHJpb3JpdHlMZXZlbChyb290LCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICAgICAgICB2YXIgZWFybGllc3RFeHBpcmF0aW9uVGltZU1zID0gZXhwaXJhdGlvblRpbWVUb01zKGVhcmxpZXN0RXhwaXJhdGlvblRpbWUpO1xuICAgICAgICAgICAgc3RhcnRUaW1lTXMgPSBlYXJsaWVzdEV4cGlyYXRpb25UaW1lTXMgLSBMT1dfUFJJT1JJVFlfRVhQSVJBVElPTjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYWJzb2x1dGVUaW1lb3V0TXMgPSBzdGFydFRpbWVNcyArIGVhcmxpZXN0VGltZW91dE1zO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFyayB0aGUgZWFybGllc3QgdGltZW91dCBpbiB0aGUgc3VzcGVuZGVkIGZpYmVyJ3MgYW5jZXN0b3IgcGF0aC5cbiAgICAgICAgLy8gQWZ0ZXIgY29tcGxldGluZyB0aGUgcm9vdCwgd2UnbGwgdGFrZSB0aGUgbGFyZ2VzdCBvZiBhbGwgdGhlXG4gICAgICAgIC8vIHN1c3BlbmRlZCBmaWJlcidzIHRpbWVvdXRzIGFuZCB1c2UgaXQgdG8gY29tcHV0ZSBhIHRpbWVvdXQgZm9yIHRoZVxuICAgICAgICAvLyB3aG9sZSB0cmVlLlxuICAgICAgICByZW5kZXJEaWRTdXNwZW5kKHJvb3QsIGFic29sdXRlVGltZW91dE1zLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG5cbiAgICAgICAgX3dvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBTaG91bGRDYXB0dXJlO1xuICAgICAgICBfd29ya0luUHJvZ3Jlc3MuZXhwaXJhdGlvblRpbWUgPSByZW5kZXJFeHBpcmF0aW9uVGltZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChlbmFibGVTdXNwZW5zZVNlcnZlclJlbmRlcmVyICYmIF93b3JrSW5Qcm9ncmVzcy50YWcgPT09IERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgICBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgcmVuZGVyRXhwaXJhdGlvblRpbWUsIHRoZW5hYmxlKTtcblxuICAgICAgICAvLyBTaW5jZSB3ZSBhbHJlYWR5IGhhdmUgYSBjdXJyZW50IGZpYmVyLCB3ZSBjYW4gZWFnZXJseSBhZGQgYSByZXRyeSBsaXN0ZW5lci5cbiAgICAgICAgdmFyIHJldHJ5Q2FjaGUgPSBfd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgaWYgKHJldHJ5Q2FjaGUgPT09IG51bGwpIHtcbiAgICAgICAgICByZXRyeUNhY2hlID0gX3dvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXcgUG9zc2libHlXZWFrU2V0KCk7XG4gICAgICAgICAgdmFyIF9jdXJyZW50ID0gX3dvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcbiAgICAgICAgICAhX2N1cnJlbnQgPyBpbnZhcmlhbnQoZmFsc2UsICdBIGRlaHlkcmF0ZWQgc3VzcGVuc2UgYm91bmRhcnkgbXVzdCBjb21taXQgYmVmb3JlIHRyeWluZyB0byByZW5kZXIuIFRoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gUmVhY3QuJykgOiB2b2lkIDA7XG4gICAgICAgICAgX2N1cnJlbnQubWVtb2l6ZWRTdGF0ZSA9IHJldHJ5Q2FjaGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWVtb2l6ZSB1c2luZyB0aGUgYm91bmRhcnkgZmliZXIgdG8gcHJldmVudCByZWR1bmRhbnQgbGlzdGVuZXJzLlxuICAgICAgICBpZiAoIXJldHJ5Q2FjaGUuaGFzKHRoZW5hYmxlKSkge1xuICAgICAgICAgIHJldHJ5Q2FjaGUuYWRkKHRoZW5hYmxlKTtcbiAgICAgICAgICB2YXIgcmV0cnkgPSByZXRyeVRpbWVkT3V0Qm91bmRhcnkuYmluZChudWxsLCBfd29ya0luUHJvZ3Jlc3MsIHRoZW5hYmxlKTtcbiAgICAgICAgICBpZiAoZW5hYmxlU2NoZWR1bGVyVHJhY2luZykge1xuICAgICAgICAgICAgcmV0cnkgPSB0cmFjaW5nLnVuc3RhYmxlX3dyYXAocmV0cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGVuYWJsZS50aGVuKHJldHJ5LCByZXRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgX3dvcmtJblByb2dyZXNzLmVmZmVjdFRhZyB8PSBTaG91bGRDYXB0dXJlO1xuICAgICAgICBfd29ya0luUHJvZ3Jlc3MuZXhwaXJhdGlvblRpbWUgPSByZW5kZXJFeHBpcmF0aW9uVGltZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gVGhpcyBib3VuZGFyeSBhbHJlYWR5IGNhcHR1cmVkIGR1cmluZyB0aGlzIHJlbmRlci4gQ29udGludWUgdG8gdGhlIG5leHRcbiAgICAgIC8vIGJvdW5kYXJ5LlxuICAgICAgX3dvcmtJblByb2dyZXNzID0gX3dvcmtJblByb2dyZXNzLnJldHVybjtcbiAgICB9IHdoaWxlIChfd29ya0luUHJvZ3Jlc3MgIT09IG51bGwpO1xuICAgIC8vIE5vIGJvdW5kYXJ5IHdhcyBmb3VuZC4gRmFsbHRocm91Z2ggdG8gZXJyb3IgbW9kZS5cbiAgICAvLyBUT0RPOiBVc2UgaW52YXJpYW50IHNvIHRoZSBtZXNzYWdlIGlzIHN0cmlwcGVkIGluIHByb2Q/XG4gICAgdmFsdWUgPSBuZXcgRXJyb3IoKGdldENvbXBvbmVudE5hbWUoc291cmNlRmliZXIudHlwZSkgfHwgJ0EgUmVhY3QgY29tcG9uZW50JykgKyAnIHN1c3BlbmRlZCB3aGlsZSByZW5kZXJpbmcsIGJ1dCBubyBmYWxsYmFjayBVSSB3YXMgc3BlY2lmaWVkLlxcbicgKyAnXFxuJyArICdBZGQgYSA8U3VzcGVuc2UgZmFsbGJhY2s9Li4uPiBjb21wb25lbnQgaGlnaGVyIGluIHRoZSB0cmVlIHRvICcgKyAncHJvdmlkZSBhIGxvYWRpbmcgaW5kaWNhdG9yIG9yIHBsYWNlaG9sZGVyIHRvIGRpc3BsYXkuJyArIGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChzb3VyY2VGaWJlcikpO1xuICB9XG5cbiAgLy8gV2UgZGlkbid0IGZpbmQgYSBib3VuZGFyeSB0aGF0IGNvdWxkIGhhbmRsZSB0aGlzIHR5cGUgb2YgZXhjZXB0aW9uLiBTdGFydFxuICAvLyBvdmVyIGFuZCB0cmF2ZXJzZSBwYXJlbnQgcGF0aCBhZ2FpbiwgdGhpcyB0aW1lIHRyZWF0aW5nIHRoZSBleGNlcHRpb25cbiAgLy8gYXMgYW4gZXJyb3IuXG4gIHJlbmRlckRpZEVycm9yKCk7XG4gIHZhbHVlID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZSh2YWx1ZSwgc291cmNlRmliZXIpO1xuICB2YXIgd29ya0luUHJvZ3Jlc3MgPSByZXR1cm5GaWJlcjtcbiAgZG8ge1xuICAgIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9lcnJvckluZm8gPSB2YWx1ZTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gU2hvdWxkQ2FwdHVyZTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5leHBpcmF0aW9uVGltZSA9IHJlbmRlckV4cGlyYXRpb25UaW1lO1xuICAgICAgICAgIHZhciBfdXBkYXRlID0gY3JlYXRlUm9vdEVycm9yVXBkYXRlKHdvcmtJblByb2dyZXNzLCBfZXJyb3JJbmZvLCByZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCBfdXBkYXRlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIC8vIENhcHR1cmUgYW5kIHJldHJ5XG4gICAgICAgIHZhciBlcnJvckluZm8gPSB2YWx1ZTtcbiAgICAgICAgdmFyIGN0b3IgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnICYgRGlkQ2FwdHVyZSkgPT09IE5vRWZmZWN0ICYmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicgfHwgaW5zdGFuY2UgIT09IG51bGwgJiYgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgfD0gU2hvdWxkQ2FwdHVyZTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5leHBpcmF0aW9uVGltZSA9IHJlbmRlckV4cGlyYXRpb25UaW1lO1xuICAgICAgICAgIC8vIFNjaGVkdWxlIHRoZSBlcnJvciBib3VuZGFyeSB0byByZS1yZW5kZXIgdXNpbmcgdXBkYXRlZCBzdGF0ZVxuICAgICAgICAgIHZhciBfdXBkYXRlMiA9IGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGVycm9ySW5mbywgcmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgX3VwZGF0ZTIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcbiAgfSB3aGlsZSAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpO1xufVxuXG5mdW5jdGlvbiB1bndpbmRXb3JrKHdvcmtJblByb2dyZXNzLCByZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlZmZlY3RUYWcgPSB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWc7XG4gICAgICAgIGlmIChlZmZlY3RUYWcgJiBTaG91bGRDYXB0dXJlKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnID0gZWZmZWN0VGFnICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlO1xuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIF9lZmZlY3RUYWcgPSB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWc7XG4gICAgICAgICEoKF9lZmZlY3RUYWcgJiBEaWRDYXB0dXJlKSA9PT0gTm9FZmZlY3QpID8gaW52YXJpYW50KGZhbHNlLCAnVGhlIHJvb3QgZmFpbGVkIHRvIHVubW91bnQgYWZ0ZXIgYW4gZXJyb3IuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKSA6IHZvaWQgMDtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnID0gX2VmZmVjdFRhZyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcbiAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgfVxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gVE9ETzogcG9wSHlkcmF0aW9uU3RhdGVcbiAgICAgICAgcG9wSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX2VmZmVjdFRhZzIgPSB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWc7XG4gICAgICAgIGlmIChfZWZmZWN0VGFnMiAmIFNob3VsZENhcHR1cmUpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgPSBfZWZmZWN0VGFnMiAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcbiAgICAgICAgICAvLyBDYXB0dXJlZCBhIHN1c3BlbnNlIGVmZmVjdC4gUmUtcmVuZGVyIHRoZSBib3VuZGFyeS5cbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgY2FzZSBEZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmIChlbmFibGVTdXNwZW5zZVNlcnZlclJlbmRlcmVyKSB7XG4gICAgICAgICAgLy8gVE9ETzogcG9wSHlkcmF0aW9uU3RhdGVcbiAgICAgICAgICB2YXIgX2VmZmVjdFRhZzMgPSB3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWc7XG4gICAgICAgICAgaWYgKF9lZmZlY3RUYWczICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnID0gX2VmZmVjdFRhZzMgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG4gICAgICAgICAgICAvLyBDYXB0dXJlZCBhIHN1c3BlbnNlIGVmZmVjdC4gUmUtcmVuZGVyIHRoZSBib3VuZGFyeS5cbiAgICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHBvcFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bndpbmRJbnRlcnJ1cHRlZFdvcmsoaW50ZXJydXB0ZWRXb3JrKSB7XG4gIHN3aXRjaCAoaW50ZXJydXB0ZWRXb3JrLnRhZykge1xuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IGludGVycnVwdGVkV29yay50eXBlLmNoaWxkQ29udGV4dFR5cGVzO1xuICAgICAgICBpZiAoY2hpbGRDb250ZXh0VHlwZXMgIT09IG51bGwgJiYgY2hpbGRDb250ZXh0VHlwZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBvcENvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKGludGVycnVwdGVkV29yayk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHBvcEhvc3RDb250YWluZXIoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgcG9wUHJvdmlkZXIoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBicmVhaztcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG52YXIgUmVhY3RDdXJyZW50T3duZXIkMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xuXG5cbnZhciBkaWRXYXJuQWJvdXRTdGF0ZVRyYW5zaXRpb24gPSB2b2lkIDA7XG52YXIgZGlkV2FyblNldFN0YXRlQ2hpbGRDb250ZXh0ID0gdm9pZCAwO1xudmFyIHdhcm5BYm91dFVwZGF0ZU9uVW5tb3VudGVkID0gdm9pZCAwO1xudmFyIHdhcm5BYm91dEludmFsaWRVcGRhdGVzID0gdm9pZCAwO1xuXG5pZiAoZW5hYmxlU2NoZWR1bGVyVHJhY2luZykge1xuICAvLyBQcm92aWRlIGV4cGxpY2l0IGVycm9yIG1lc3NhZ2Ugd2hlbiBwcm9kdWN0aW9uK3Byb2ZpbGluZyBidW5kbGUgb2YgZS5nLiByZWFjdC1kb21cbiAgLy8gaXMgdXNlZCB3aXRoIHByb2R1Y3Rpb24gKG5vbi1wcm9maWxpbmcpIGJ1bmRsZSBvZiBzY2hlZHVsZXIvdHJhY2luZ1xuICAhKHRyYWNpbmcuX19pbnRlcmFjdGlvbnNSZWYgIT0gbnVsbCAmJiB0cmFjaW5nLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgIT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICdJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIHJ1biB0aGUgcHJvZmlsaW5nIHZlcnNpb24gb2YgYSByZW5kZXJlciAoZm9yIGV4YW1wbGUsIGByZWFjdC1kb20vcHJvZmlsaW5nYCkgd2l0aG91dCBhbHNvIHJlcGxhY2luZyB0aGUgYHNjaGVkdWxlci90cmFjaW5nYCBtb2R1bGUgd2l0aCBgc2NoZWR1bGVyL3RyYWNpbmctcHJvZmlsaW5nYC4gWW91ciBidW5kbGVyIG1pZ2h0IGhhdmUgYSBzZXR0aW5nIGZvciBhbGlhc2luZyBib3RoIG1vZHVsZXMuIExlYXJuIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3JlYWN0LXByb2ZpbGluZycpIDogdm9pZCAwO1xufVxuXG57XG4gIGRpZFdhcm5BYm91dFN0YXRlVHJhbnNpdGlvbiA9IGZhbHNlO1xuICBkaWRXYXJuU2V0U3RhdGVDaGlsZENvbnRleHQgPSBmYWxzZTtcbiAgdmFyIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudCA9IHt9O1xuXG4gIHdhcm5BYm91dFVwZGF0ZU9uVW5tb3VudGVkID0gZnVuY3Rpb24gKGZpYmVyLCBpc0NsYXNzKSB7XG4gICAgLy8gV2Ugc2hvdyB0aGUgd2hvbGUgc3RhY2sgYnV0IGRlZHVwZSBvbiB0aGUgdG9wIGNvbXBvbmVudCdzIG5hbWUgYmVjYXVzZVxuICAgIC8vIHRoZSBwcm9ibGVtYXRpYyBjb2RlIGFsbW9zdCBhbHdheXMgbGllcyBpbnNpZGUgdGhhdCBjb21wb25lbnQuXG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdSZWFjdENvbXBvbmVudCc7XG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudFtjb21wb25lbnROYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsIFwiQ2FuJ3QgcGVyZm9ybSBhIFJlYWN0IHN0YXRlIHVwZGF0ZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LiBUaGlzIFwiICsgJ2lzIGEgbm8tb3AsIGJ1dCBpdCBpbmRpY2F0ZXMgYSBtZW1vcnkgbGVhayBpbiB5b3VyIGFwcGxpY2F0aW9uLiBUbyAnICsgJ2ZpeCwgY2FuY2VsIGFsbCBzdWJzY3JpcHRpb25zIGFuZCBhc3luY2hyb25vdXMgdGFza3MgaW4gJXMuJXMnLCBpc0NsYXNzID8gJ3RoZSBjb21wb25lbnRXaWxsVW5tb3VudCBtZXRob2QnIDogJ2EgdXNlRWZmZWN0IGNsZWFudXAgZnVuY3Rpb24nLCBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2QoZmliZXIpKTtcbiAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICB9O1xuXG4gIHdhcm5BYm91dEludmFsaWRVcGRhdGVzID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgc3dpdGNoIChwaGFzZSkge1xuICAgICAgY2FzZSAnZ2V0Q2hpbGRDb250ZXh0JzpcbiAgICAgICAgaWYgKGRpZFdhcm5TZXRTdGF0ZUNoaWxkQ29udGV4dCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdzZXRTdGF0ZSguLi4pOiBDYW5ub3QgY2FsbCBzZXRTdGF0ZSgpIGluc2lkZSBnZXRDaGlsZENvbnRleHQoKScpO1xuICAgICAgICBkaWRXYXJuU2V0U3RhdGVDaGlsZENvbnRleHQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JlbmRlcic6XG4gICAgICAgIGlmIChkaWRXYXJuQWJvdXRTdGF0ZVRyYW5zaXRpb24pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnQ2Fubm90IHVwZGF0ZSBkdXJpbmcgYW4gZXhpc3Rpbmcgc3RhdGUgdHJhbnNpdGlvbiAoc3VjaCBhcyB3aXRoaW4gJyArICdgcmVuZGVyYCkuIFJlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLicpO1xuICAgICAgICBkaWRXYXJuQWJvdXRTdGF0ZVRyYW5zaXRpb24gPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH07XG59XG5cbi8vIFVzZWQgdG8gZW5zdXJlIGNvbXB1dGVVbmlxdWVBc3luY0V4cGlyYXRpb24gaXMgbW9ub3RvbmljYWxseSBkZWNyZWFzaW5nLlxudmFyIGxhc3RVbmlxdWVBc3luY0V4cGlyYXRpb24gPSBTeW5jIC0gMTtcblxudmFyIGlzV29ya2luZyA9IGZhbHNlO1xuXG4vLyBUaGUgbmV4dCB3b3JrIGluIHByb2dyZXNzIGZpYmVyIHRoYXQgd2UncmUgY3VycmVudGx5IHdvcmtpbmcgb24uXG52YXIgbmV4dFVuaXRPZldvcmsgPSBudWxsO1xudmFyIG5leHRSb290ID0gbnVsbDtcbi8vIFRoZSB0aW1lIGF0IHdoaWNoIHdlJ3JlIGN1cnJlbnRseSByZW5kZXJpbmcgd29yay5cbnZhciBuZXh0UmVuZGVyRXhwaXJhdGlvblRpbWUgPSBOb1dvcms7XG52YXIgbmV4dExhdGVzdEFic29sdXRlVGltZW91dE1zID0gLTE7XG52YXIgbmV4dFJlbmRlckRpZEVycm9yID0gZmFsc2U7XG5cbi8vIFRoZSBuZXh0IGZpYmVyIHdpdGggYW4gZWZmZWN0IHRoYXQgd2UncmUgY3VycmVudGx5IGNvbW1pdHRpbmcuXG52YXIgbmV4dEVmZmVjdCA9IG51bGw7XG5cbnZhciBpc0NvbW1pdHRpbmckMSA9IGZhbHNlO1xudmFyIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gbnVsbDtcbnZhciBwYXNzaXZlRWZmZWN0Q2FsbGJhY2tIYW5kbGUgPSBudWxsO1xudmFyIHBhc3NpdmVFZmZlY3RDYWxsYmFjayA9IG51bGw7XG5cbnZhciBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG51bGw7XG5cbi8vIFVzZWQgZm9yIHBlcmZvcm1hbmNlIHRyYWNraW5nLlxudmFyIGludGVycnVwdGVkQnkgPSBudWxsO1xuXG52YXIgc3Rhc2hlZFdvcmtJblByb2dyZXNzUHJvcGVydGllcyA9IHZvaWQgMDtcbnZhciByZXBsYXlVbml0T2ZXb3JrID0gdm9pZCAwO1xudmFyIG1heVJlcGxheUZhaWxlZFVuaXRPZldvcmsgPSB2b2lkIDA7XG52YXIgaXNSZXBsYXlpbmdGYWlsZWRVbml0T2ZXb3JrID0gdm9pZCAwO1xudmFyIG9yaWdpbmFsUmVwbGF5RXJyb3IgPSB2b2lkIDA7XG52YXIgcmV0aHJvd09yaWdpbmFsRXJyb3IgPSB2b2lkIDA7XG5pZiAodHJ1ZSAmJiByZXBsYXlGYWlsZWRVbml0T2ZXb3JrV2l0aEludm9rZUd1YXJkZWRDYWxsYmFjaykge1xuICBzdGFzaGVkV29ya0luUHJvZ3Jlc3NQcm9wZXJ0aWVzID0gbnVsbDtcbiAgbWF5UmVwbGF5RmFpbGVkVW5pdE9mV29yayA9IHRydWU7XG4gIGlzUmVwbGF5aW5nRmFpbGVkVW5pdE9mV29yayA9IGZhbHNlO1xuICBvcmlnaW5hbFJlcGxheUVycm9yID0gbnVsbDtcbiAgcmVwbGF5VW5pdE9mV29yayA9IGZ1bmN0aW9uIChmYWlsZWRVbml0T2ZXb3JrLCB0aHJvd25WYWx1ZSwgaXNZaWVsZHkpIHtcbiAgICBpZiAodGhyb3duVmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHRocm93blZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdGhyb3duVmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gRG9uJ3QgcmVwbGF5IHByb21pc2VzLiBUcmVhdCBldmVyeXRoaW5nIGVsc2UgbGlrZSBhbiBlcnJvci5cbiAgICAgIC8vIFRPRE86IE5lZWQgdG8gZmlndXJlIG91dCBhIGRpZmZlcmVudCBzdHJhdGVneSBpZi93aGVuIHdlIGFkZFxuICAgICAgLy8gc3VwcG9ydCBmb3IgY2F0Y2hpbmcgb3RoZXIgdHlwZXMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgc3RhdGUgb2YgdGhlIHdvcmstaW4tcHJvZ3Jlc3NcbiAgICBpZiAoc3Rhc2hlZFdvcmtJblByb2dyZXNzUHJvcGVydGllcyA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiBEb24ndCB0aHJvdyBiZWNhdXNlIHRoaXMgY29kZSBpcyBERVYtb25seS5cbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ0NvdWxkIG5vdCByZXBsYXkgcmVuZGVyaW5nIGFmdGVyIGFuIGVycm9yLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXNzaWduRmliZXJQcm9wZXJ0aWVzSW5ERVYoZmFpbGVkVW5pdE9mV29yaywgc3Rhc2hlZFdvcmtJblByb2dyZXNzUHJvcGVydGllcyk7XG5cbiAgICBzd2l0Y2ggKGZhaWxlZFVuaXRPZldvcmsudGFnKSB7XG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKGZhaWxlZFVuaXRPZldvcmspO1xuICAgICAgICBwb3BUb3BMZXZlbENvbnRleHRPYmplY3QoZmFpbGVkVW5pdE9mV29yayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICBwb3BIb3N0Q29udGV4dChmYWlsZWRVbml0T2ZXb3JrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIENvbXBvbmVudCA9IGZhaWxlZFVuaXRPZldvcmsudHlwZTtcbiAgICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgICAgcG9wQ29udGV4dChmYWlsZWRVbml0T2ZXb3JrKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcihmYWlsZWRVbml0T2ZXb3JrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgICAgcG9wUHJvdmlkZXIoZmFpbGVkVW5pdE9mV29yayk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBSZXBsYXkgdGhlIGJlZ2luIHBoYXNlLlxuICAgIGlzUmVwbGF5aW5nRmFpbGVkVW5pdE9mV29yayA9IHRydWU7XG4gICAgb3JpZ2luYWxSZXBsYXlFcnJvciA9IHRocm93blZhbHVlO1xuICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCB3b3JrTG9vcCwgbnVsbCwgaXNZaWVsZHkpO1xuICAgIGlzUmVwbGF5aW5nRmFpbGVkVW5pdE9mV29yayA9IGZhbHNlO1xuICAgIG9yaWdpbmFsUmVwbGF5RXJyb3IgPSBudWxsO1xuICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICB2YXIgcmVwbGF5RXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG4gICAgICBpZiAocmVwbGF5RXJyb3IgIT0gbnVsbCAmJiB0aHJvd25WYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gUmVhZGluZyB0aGUgZXhwYW5kbyBwcm9wZXJ0eSBpcyBpbnRlbnRpb25hbGx5XG4gICAgICAgICAgLy8gaW5zaWRlIGB0cnlgIGJlY2F1c2UgaXQgbWlnaHQgYmUgYSBnZXR0ZXIgb3IgUHJveHkuXG4gICAgICAgICAgaWYgKHJlcGxheUVycm9yLl9zdXBwcmVzc0xvZ2dpbmcpIHtcbiAgICAgICAgICAgIC8vIEFsc28gc3VwcHJlc3MgbG9nZ2luZyBmb3IgdGhlIG9yaWdpbmFsIGVycm9yLlxuICAgICAgICAgICAgdGhyb3duVmFsdWUuX3N1cHByZXNzTG9nZ2luZyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChpbm5lcikge1xuICAgICAgICAgIC8vIElnbm9yZS5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGUgYmVnaW4gcGhhc2UgZGlkIG5vdCBmYWlsIHRoZSBzZWNvbmQgdGltZSwgc2V0IHRoaXMgcG9pbnRlclxuICAgICAgLy8gYmFjayB0byB0aGUgb3JpZ2luYWwgdmFsdWUuXG4gICAgICBuZXh0VW5pdE9mV29yayA9IGZhaWxlZFVuaXRPZldvcms7XG4gICAgfVxuICB9O1xuICByZXRocm93T3JpZ2luYWxFcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBvcmlnaW5hbFJlcGxheUVycm9yO1xuICB9O1xufVxuXG5mdW5jdGlvbiByZXNldFN0YWNrKCkge1xuICBpZiAobmV4dFVuaXRPZldvcmsgIT09IG51bGwpIHtcbiAgICB2YXIgaW50ZXJydXB0ZWRXb3JrID0gbmV4dFVuaXRPZldvcmsucmV0dXJuO1xuICAgIHdoaWxlIChpbnRlcnJ1cHRlZFdvcmsgIT09IG51bGwpIHtcbiAgICAgIHVud2luZEludGVycnVwdGVkV29yayhpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgaW50ZXJydXB0ZWRXb3JrID0gaW50ZXJydXB0ZWRXb3JrLnJldHVybjtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZGlzY2FyZFBlbmRpbmdXYXJuaW5ncygpO1xuICAgIGNoZWNrVGhhdFN0YWNrSXNFbXB0eSgpO1xuICB9XG5cbiAgbmV4dFJvb3QgPSBudWxsO1xuICBuZXh0UmVuZGVyRXhwaXJhdGlvblRpbWUgPSBOb1dvcms7XG4gIG5leHRMYXRlc3RBYnNvbHV0ZVRpbWVvdXRNcyA9IC0xO1xuICBuZXh0UmVuZGVyRGlkRXJyb3IgPSBmYWxzZTtcbiAgbmV4dFVuaXRPZldvcmsgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21taXRBbGxIb3N0RWZmZWN0cygpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB7XG4gICAgICBzZXRDdXJyZW50RmliZXIobmV4dEVmZmVjdCk7XG4gICAgfVxuICAgIHJlY29yZEVmZmVjdCgpO1xuXG4gICAgdmFyIGVmZmVjdFRhZyA9IG5leHRFZmZlY3QuZWZmZWN0VGFnO1xuXG4gICAgaWYgKGVmZmVjdFRhZyAmIENvbnRlbnRSZXNldCkge1xuICAgICAgY29tbWl0UmVzZXRUZXh0Q29udGVudChuZXh0RWZmZWN0KTtcbiAgICB9XG5cbiAgICBpZiAoZWZmZWN0VGFnICYgUmVmKSB7XG4gICAgICB2YXIgY3VycmVudCQkMSA9IG5leHRFZmZlY3QuYWx0ZXJuYXRlO1xuICAgICAgaWYgKGN1cnJlbnQkJDEgIT09IG51bGwpIHtcbiAgICAgICAgY29tbWl0RGV0YWNoUmVmKGN1cnJlbnQkJDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBmb2xsb3dpbmcgc3dpdGNoIHN0YXRlbWVudCBpcyBvbmx5IGNvbmNlcm5lZCBhYm91dCBwbGFjZW1lbnQsXG4gICAgLy8gdXBkYXRlcywgYW5kIGRlbGV0aW9ucy4gVG8gYXZvaWQgbmVlZGluZyB0byBhZGQgYSBjYXNlIGZvciBldmVyeVxuICAgIC8vIHBvc3NpYmxlIGJpdG1hcCB2YWx1ZSwgd2UgcmVtb3ZlIHRoZSBzZWNvbmRhcnkgZWZmZWN0cyBmcm9tIHRoZVxuICAgIC8vIGVmZmVjdCB0YWcgYW5kIHN3aXRjaCBvbiB0aGF0IHZhbHVlLlxuICAgIHZhciBwcmltYXJ5RWZmZWN0VGFnID0gZWZmZWN0VGFnICYgKFBsYWNlbWVudCB8IFVwZGF0ZSB8IERlbGV0aW9uKTtcbiAgICBzd2l0Y2ggKHByaW1hcnlFZmZlY3RUYWcpIHtcbiAgICAgIGNhc2UgUGxhY2VtZW50OlxuICAgICAgICB7XG4gICAgICAgICAgY29tbWl0UGxhY2VtZW50KG5leHRFZmZlY3QpO1xuICAgICAgICAgIC8vIENsZWFyIHRoZSBcInBsYWNlbWVudFwiIGZyb20gZWZmZWN0IHRhZyBzbyB0aGF0IHdlIGtub3cgdGhhdCB0aGlzIGlzIGluc2VydGVkLCBiZWZvcmVcbiAgICAgICAgICAvLyBhbnkgbGlmZS1jeWNsZXMgbGlrZSBjb21wb25lbnREaWRNb3VudCBnZXRzIGNhbGxlZC5cbiAgICAgICAgICAvLyBUT0RPOiBmaW5kRE9NTm9kZSBkb2Vzbid0IHJlbHkgb24gdGhpcyBhbnkgbW9yZSBidXQgaXNNb3VudGVkXG4gICAgICAgICAgLy8gZG9lcyBhbmQgaXNNb3VudGVkIGlzIGRlcHJlY2F0ZWQgYW55d2F5IHNvIHdlIHNob3VsZCBiZSBhYmxlXG4gICAgICAgICAgLy8gdG8ga2lsbCB0aGlzLlxuICAgICAgICAgIG5leHRFZmZlY3QuZWZmZWN0VGFnICY9IH5QbGFjZW1lbnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgUGxhY2VtZW50QW5kVXBkYXRlOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gUGxhY2VtZW50XG4gICAgICAgICAgY29tbWl0UGxhY2VtZW50KG5leHRFZmZlY3QpO1xuICAgICAgICAgIC8vIENsZWFyIHRoZSBcInBsYWNlbWVudFwiIGZyb20gZWZmZWN0IHRhZyBzbyB0aGF0IHdlIGtub3cgdGhhdCB0aGlzIGlzIGluc2VydGVkLCBiZWZvcmVcbiAgICAgICAgICAvLyBhbnkgbGlmZS1jeWNsZXMgbGlrZSBjb21wb25lbnREaWRNb3VudCBnZXRzIGNhbGxlZC5cbiAgICAgICAgICBuZXh0RWZmZWN0LmVmZmVjdFRhZyAmPSB+UGxhY2VtZW50O1xuXG4gICAgICAgICAgLy8gVXBkYXRlXG4gICAgICAgICAgdmFyIF9jdXJyZW50ID0gbmV4dEVmZmVjdC5hbHRlcm5hdGU7XG4gICAgICAgICAgY29tbWl0V29yayhfY3VycmVudCwgbmV4dEVmZmVjdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgVXBkYXRlOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9jdXJyZW50MiA9IG5leHRFZmZlY3QuYWx0ZXJuYXRlO1xuICAgICAgICAgIGNvbW1pdFdvcmsoX2N1cnJlbnQyLCBuZXh0RWZmZWN0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgY2FzZSBEZWxldGlvbjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1pdERlbGV0aW9uKG5leHRFZmZlY3QpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5leHRFZmZlY3QgPSBuZXh0RWZmZWN0Lm5leHRFZmZlY3Q7XG4gIH1cblxuICB7XG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkxpZmVjeWNsZXMoKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKG5leHRFZmZlY3QpO1xuICAgIH1cblxuICAgIHZhciBlZmZlY3RUYWcgPSBuZXh0RWZmZWN0LmVmZmVjdFRhZztcbiAgICBpZiAoZWZmZWN0VGFnICYgU25hcHNob3QpIHtcbiAgICAgIHJlY29yZEVmZmVjdCgpO1xuICAgICAgdmFyIGN1cnJlbnQkJDEgPSBuZXh0RWZmZWN0LmFsdGVybmF0ZTtcbiAgICAgIGNvbW1pdEJlZm9yZU11dGF0aW9uTGlmZUN5Y2xlcyhjdXJyZW50JCQxLCBuZXh0RWZmZWN0KTtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gbmV4dEVmZmVjdC5uZXh0RWZmZWN0O1xuICB9XG5cbiAge1xuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QWxsTGlmZUN5Y2xlcyhmaW5pc2hlZFJvb3QsIGNvbW1pdHRlZEV4cGlyYXRpb25UaW1lKSB7XG4gIHtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncygpO1xuICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmcoKTtcblxuICAgIGlmICh3YXJuQWJvdXREZXByZWNhdGVkTGlmZWN5Y2xlcykge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5ncygpO1xuICAgIH1cbiAgfVxuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihuZXh0RWZmZWN0KTtcbiAgICB9XG4gICAgdmFyIGVmZmVjdFRhZyA9IG5leHRFZmZlY3QuZWZmZWN0VGFnO1xuXG4gICAgaWYgKGVmZmVjdFRhZyAmIChVcGRhdGUgfCBDYWxsYmFjaykpIHtcbiAgICAgIHJlY29yZEVmZmVjdCgpO1xuICAgICAgdmFyIGN1cnJlbnQkJDEgPSBuZXh0RWZmZWN0LmFsdGVybmF0ZTtcbiAgICAgIGNvbW1pdExpZmVDeWNsZXMoZmluaXNoZWRSb290LCBjdXJyZW50JCQxLCBuZXh0RWZmZWN0LCBjb21taXR0ZWRFeHBpcmF0aW9uVGltZSk7XG4gICAgfVxuXG4gICAgaWYgKGVmZmVjdFRhZyAmIFJlZikge1xuICAgICAgcmVjb3JkRWZmZWN0KCk7XG4gICAgICBjb21taXRBdHRhY2hSZWYobmV4dEVmZmVjdCk7XG4gICAgfVxuXG4gICAgaWYgKGVmZmVjdFRhZyAmIFBhc3NpdmUpIHtcbiAgICAgIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gZmluaXNoZWRSb290O1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBuZXh0RWZmZWN0Lm5leHRFZmZlY3Q7XG4gIH1cbiAge1xuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZUVmZmVjdHMocm9vdCwgZmlyc3RFZmZlY3QpIHtcbiAgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSBudWxsO1xuICBwYXNzaXZlRWZmZWN0Q2FsbGJhY2tIYW5kbGUgPSBudWxsO1xuICBwYXNzaXZlRWZmZWN0Q2FsbGJhY2sgPSBudWxsO1xuXG4gIC8vIFNldCB0aGlzIHRvIHRydWUgdG8gcHJldmVudCByZS1lbnRyYW5jeVxuICB2YXIgcHJldmlvdXNJc1JlbmRlcmluZyA9IGlzUmVuZGVyaW5nO1xuICBpc1JlbmRlcmluZyA9IHRydWU7XG5cbiAgdmFyIGVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuICBkbyB7XG4gICAge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGVmZmVjdCk7XG4gICAgfVxuXG4gICAgaWYgKGVmZmVjdC5lZmZlY3RUYWcgJiBQYXNzaXZlKSB7XG4gICAgICB2YXIgZGlkRXJyb3IgPSBmYWxzZTtcbiAgICAgIHZhciBlcnJvciA9IHZvaWQgMDtcbiAgICAgIHtcbiAgICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGNvbW1pdFBhc3NpdmVIb29rRWZmZWN0cywgbnVsbCwgZWZmZWN0KTtcbiAgICAgICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgICAgICBkaWRFcnJvciA9IHRydWU7XG4gICAgICAgICAgZXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaWRFcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihlZmZlY3QsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWZmZWN0ID0gZWZmZWN0Lm5leHRFZmZlY3Q7XG4gIH0gd2hpbGUgKGVmZmVjdCAhPT0gbnVsbCk7XG4gIHtcbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICB9XG5cbiAgaXNSZW5kZXJpbmcgPSBwcmV2aW91c0lzUmVuZGVyaW5nO1xuXG4gIC8vIENoZWNrIGlmIHdvcmsgd2FzIHNjaGVkdWxlZCBieSBvbmUgb2YgdGhlIGVmZmVjdHNcbiAgdmFyIHJvb3RFeHBpcmF0aW9uVGltZSA9IHJvb3QuZXhwaXJhdGlvblRpbWU7XG4gIGlmIChyb290RXhwaXJhdGlvblRpbWUgIT09IE5vV29yaykge1xuICAgIHJlcXVlc3RXb3JrKHJvb3QsIHJvb3RFeHBpcmF0aW9uVGltZSk7XG4gIH1cbiAgLy8gRmx1c2ggYW55IHN5bmMgd29yayB0aGF0IHdhcyBzY2hlZHVsZWQgYnkgZWZmZWN0c1xuICBpZiAoIWlzQmF0Y2hpbmdVcGRhdGVzICYmICFpc1JlbmRlcmluZykge1xuICAgIHBlcmZvcm1TeW5jV29yaygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQWxyZWFkeUZhaWxlZExlZ2FjeUVycm9yQm91bmRhcnkoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkICE9PSBudWxsICYmIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkLmhhcyhpbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIG1hcmtMZWdhY3lFcnJvckJvdW5kYXJ5QXNGYWlsZWQoaW5zdGFuY2UpIHtcbiAgaWYgKGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID09PSBudWxsKSB7XG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBuZXcgU2V0KFtpbnN0YW5jZV0pO1xuICB9IGVsc2Uge1xuICAgIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkLmFkZChpbnN0YW5jZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmx1c2hQYXNzaXZlRWZmZWN0cygpIHtcbiAgaWYgKHBhc3NpdmVFZmZlY3RDYWxsYmFja0hhbmRsZSAhPT0gbnVsbCkge1xuICAgIGNhbmNlbFBhc3NpdmVFZmZlY3RzKHBhc3NpdmVFZmZlY3RDYWxsYmFja0hhbmRsZSk7XG4gIH1cbiAgaWYgKHBhc3NpdmVFZmZlY3RDYWxsYmFjayAhPT0gbnVsbCkge1xuICAgIC8vIFdlIGNhbGwgdGhlIHNjaGVkdWxlZCBjYWxsYmFjayBpbnN0ZWFkIG9mIGNvbW1pdFBhc3NpdmVFZmZlY3RzIGRpcmVjdGx5XG4gICAgLy8gdG8gZW5zdXJlIHRyYWNpbmcgd29ya3MgY29ycmVjdGx5LlxuICAgIHBhc3NpdmVFZmZlY3RDYWxsYmFjaygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFJvb3Qocm9vdCwgZmluaXNoZWRXb3JrKSB7XG4gIGlzV29ya2luZyA9IHRydWU7XG4gIGlzQ29tbWl0dGluZyQxID0gdHJ1ZTtcbiAgc3RhcnRDb21taXRUaW1lcigpO1xuXG4gICEocm9vdC5jdXJyZW50ICE9PSBmaW5pc2hlZFdvcmspID8gaW52YXJpYW50KGZhbHNlLCAnQ2Fubm90IGNvbW1pdCB0aGUgc2FtZSB0cmVlIGFzIGJlZm9yZS4gVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyByZWxhdGVkIHRvIHRoZSByZXR1cm4gZmllbGQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJykgOiB2b2lkIDA7XG4gIHZhciBjb21taXR0ZWRFeHBpcmF0aW9uVGltZSA9IHJvb3QucGVuZGluZ0NvbW1pdEV4cGlyYXRpb25UaW1lO1xuICAhKGNvbW1pdHRlZEV4cGlyYXRpb25UaW1lICE9PSBOb1dvcmspID8gaW52YXJpYW50KGZhbHNlLCAnQ2Fubm90IGNvbW1pdCBhbiBpbmNvbXBsZXRlIHJvb3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJykgOiB2b2lkIDA7XG4gIHJvb3QucGVuZGluZ0NvbW1pdEV4cGlyYXRpb25UaW1lID0gTm9Xb3JrO1xuXG4gIC8vIFVwZGF0ZSB0aGUgcGVuZGluZyBwcmlvcml0eSBsZXZlbHMgdG8gYWNjb3VudCBmb3IgdGhlIHdvcmsgdGhhdCB3ZSBhcmVcbiAgLy8gYWJvdXQgdG8gY29tbWl0LiBUaGlzIG5lZWRzIHRvIGhhcHBlbiBiZWZvcmUgY2FsbGluZyB0aGUgbGlmZWN5Y2xlcywgc2luY2VcbiAgLy8gdGhleSBtYXkgc2NoZWR1bGUgYWRkaXRpb25hbCB1cGRhdGVzLlxuICB2YXIgdXBkYXRlRXhwaXJhdGlvblRpbWVCZWZvcmVDb21taXQgPSBmaW5pc2hlZFdvcmsuZXhwaXJhdGlvblRpbWU7XG4gIHZhciBjaGlsZEV4cGlyYXRpb25UaW1lQmVmb3JlQ29tbWl0ID0gZmluaXNoZWRXb3JrLmNoaWxkRXhwaXJhdGlvblRpbWU7XG4gIHZhciBlYXJsaWVzdFJlbWFpbmluZ1RpbWVCZWZvcmVDb21taXQgPSBjaGlsZEV4cGlyYXRpb25UaW1lQmVmb3JlQ29tbWl0ID4gdXBkYXRlRXhwaXJhdGlvblRpbWVCZWZvcmVDb21taXQgPyBjaGlsZEV4cGlyYXRpb25UaW1lQmVmb3JlQ29tbWl0IDogdXBkYXRlRXhwaXJhdGlvblRpbWVCZWZvcmVDb21taXQ7XG4gIG1hcmtDb21taXR0ZWRQcmlvcml0eUxldmVscyhyb290LCBlYXJsaWVzdFJlbWFpbmluZ1RpbWVCZWZvcmVDb21taXQpO1xuXG4gIHZhciBwcmV2SW50ZXJhY3Rpb25zID0gbnVsbDtcbiAgaWYgKGVuYWJsZVNjaGVkdWxlclRyYWNpbmcpIHtcbiAgICAvLyBSZXN0b3JlIGFueSBwZW5kaW5nIGludGVyYWN0aW9ucyBhdCB0aGlzIHBvaW50LFxuICAgIC8vIFNvIHRoYXQgY2FzY2FkaW5nIHdvcmsgdHJpZ2dlcmVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlIHdpbGwgYmUgYWNjb3VudGVkIGZvci5cbiAgICBwcmV2SW50ZXJhY3Rpb25zID0gdHJhY2luZy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50O1xuICAgIHRyYWNpbmcuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudCA9IHJvb3QubWVtb2l6ZWRJbnRlcmFjdGlvbnM7XG4gIH1cblxuICAvLyBSZXNldCB0aGlzIHRvIG51bGwgYmVmb3JlIGNhbGxpbmcgbGlmZWN5Y2xlc1xuICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsO1xuXG4gIHZhciBmaXJzdEVmZmVjdCA9IHZvaWQgMDtcbiAgaWYgKGZpbmlzaGVkV29yay5lZmZlY3RUYWcgPiBQZXJmb3JtZWRXb3JrKSB7XG4gICAgLy8gQSBmaWJlcidzIGVmZmVjdCBsaXN0IGNvbnNpc3RzIG9ubHkgb2YgaXRzIGNoaWxkcmVuLCBub3QgaXRzZWxmLiBTbyBpZlxuICAgIC8vIHRoZSByb290IGhhcyBhbiBlZmZlY3QsIHdlIG5lZWQgdG8gYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuIFRoZVxuICAgIC8vIHJlc3VsdGluZyBsaXN0IGlzIHRoZSBzZXQgdGhhdCB3b3VsZCBiZWxvbmcgdG8gdGhlIHJvb3QncyBwYXJlbnQsIGlmXG4gICAgLy8gaXQgaGFkIG9uZTsgdGhhdCBpcywgYWxsIHRoZSBlZmZlY3RzIGluIHRoZSB0cmVlIGluY2x1ZGluZyB0aGUgcm9vdC5cbiAgICBpZiAoZmluaXNoZWRXb3JrLmxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgIGZpbmlzaGVkV29yay5sYXN0RWZmZWN0Lm5leHRFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gICAgICBmaXJzdEVmZmVjdCA9IGZpbmlzaGVkV29yay5maXJzdEVmZmVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlyc3RFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoZXJlIGlzIG5vIGVmZmVjdCBvbiB0aGUgcm9vdC5cbiAgICBmaXJzdEVmZmVjdCA9IGZpbmlzaGVkV29yay5maXJzdEVmZmVjdDtcbiAgfVxuXG4gIHByZXBhcmVGb3JDb21taXQocm9vdC5jb250YWluZXJJbmZvKTtcblxuICAvLyBJbnZva2UgaW5zdGFuY2VzIG9mIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlIGJlZm9yZSBtdXRhdGlvbi5cbiAgbmV4dEVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuICBzdGFydENvbW1pdFNuYXBzaG90RWZmZWN0c1RpbWVyKCk7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGRpZEVycm9yID0gZmFsc2U7XG4gICAgdmFyIGVycm9yID0gdm9pZCAwO1xuICAgIHtcbiAgICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCBjb21taXRCZWZvcmVNdXRhdGlvbkxpZmVjeWNsZXMsIG51bGwpO1xuICAgICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgICAgZGlkRXJyb3IgPSB0cnVlO1xuICAgICAgICBlcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRpZEVycm9yKSB7XG4gICAgICAhKG5leHRFZmZlY3QgIT09IG51bGwpID8gaW52YXJpYW50KGZhbHNlLCAnU2hvdWxkIGhhdmUgbmV4dCBlZmZlY3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJykgOiB2b2lkIDA7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihuZXh0RWZmZWN0LCBlcnJvcik7XG4gICAgICAvLyBDbGVhbi11cFxuICAgICAgaWYgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgICAgbmV4dEVmZmVjdCA9IG5leHRFZmZlY3QubmV4dEVmZmVjdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgc3RvcENvbW1pdFNuYXBzaG90RWZmZWN0c1RpbWVyKCk7XG5cbiAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIpIHtcbiAgICAvLyBNYXJrIHRoZSBjdXJyZW50IGNvbW1pdCB0aW1lIHRvIGJlIHNoYXJlZCBieSBhbGwgUHJvZmlsZXJzIGluIHRoaXMgYmF0Y2guXG4gICAgLy8gVGhpcyBlbmFibGVzIHRoZW0gdG8gYmUgZ3JvdXBlZCBsYXRlci5cbiAgICByZWNvcmRDb21taXRUaW1lKCk7XG4gIH1cblxuICAvLyBDb21taXQgYWxsIHRoZSBzaWRlLWVmZmVjdHMgd2l0aGluIGEgdHJlZS4gV2UnbGwgZG8gdGhpcyBpbiB0d28gcGFzc2VzLlxuICAvLyBUaGUgZmlyc3QgcGFzcyBwZXJmb3JtcyBhbGwgdGhlIGhvc3QgaW5zZXJ0aW9ucywgdXBkYXRlcywgZGVsZXRpb25zIGFuZFxuICAvLyByZWYgdW5tb3VudHMuXG4gIG5leHRFZmZlY3QgPSBmaXJzdEVmZmVjdDtcbiAgc3RhcnRDb21taXRIb3N0RWZmZWN0c1RpbWVyKCk7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIF9kaWRFcnJvciA9IGZhbHNlO1xuICAgIHZhciBfZXJyb3IgPSB2b2lkIDA7XG4gICAge1xuICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGNvbW1pdEFsbEhvc3RFZmZlY3RzLCBudWxsKTtcbiAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgIF9kaWRFcnJvciA9IHRydWU7XG4gICAgICAgIF9lcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKF9kaWRFcnJvcikge1xuICAgICAgIShuZXh0RWZmZWN0ICE9PSBudWxsKSA/IGludmFyaWFudChmYWxzZSwgJ1Nob3VsZCBoYXZlIG5leHQgZWZmZWN0LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpIDogdm9pZCAwO1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IobmV4dEVmZmVjdCwgX2Vycm9yKTtcbiAgICAgIC8vIENsZWFuLXVwXG4gICAgICBpZiAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgICAgICBuZXh0RWZmZWN0ID0gbmV4dEVmZmVjdC5uZXh0RWZmZWN0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBzdG9wQ29tbWl0SG9zdEVmZmVjdHNUaW1lcigpO1xuXG4gIHJlc2V0QWZ0ZXJDb21taXQocm9vdC5jb250YWluZXJJbmZvKTtcblxuICAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyB0cmVlIGlzIG5vdyB0aGUgY3VycmVudCB0cmVlLiBUaGlzIG11c3QgY29tZSBhZnRlclxuICAvLyB0aGUgZmlyc3QgcGFzcyBvZiB0aGUgY29tbWl0IHBoYXNlLCBzbyB0aGF0IHRoZSBwcmV2aW91cyB0cmVlIGlzIHN0aWxsXG4gIC8vIGN1cnJlbnQgZHVyaW5nIGNvbXBvbmVudFdpbGxVbm1vdW50LCBidXQgYmVmb3JlIHRoZSBzZWNvbmQgcGFzcywgc28gdGhhdFxuICAvLyB0aGUgZmluaXNoZWQgd29yayBpcyBjdXJyZW50IGR1cmluZyBjb21wb25lbnREaWRNb3VudC9VcGRhdGUuXG4gIHJvb3QuY3VycmVudCA9IGZpbmlzaGVkV29yaztcblxuICAvLyBJbiB0aGUgc2Vjb25kIHBhc3Mgd2UnbGwgcGVyZm9ybSBhbGwgbGlmZS1jeWNsZXMgYW5kIHJlZiBjYWxsYmFja3MuXG4gIC8vIExpZmUtY3ljbGVzIGhhcHBlbiBhcyBhIHNlcGFyYXRlIHBhc3Mgc28gdGhhdCBhbGwgcGxhY2VtZW50cywgdXBkYXRlcyxcbiAgLy8gYW5kIGRlbGV0aW9ucyBpbiB0aGUgZW50aXJlIHRyZWUgaGF2ZSBhbHJlYWR5IGJlZW4gaW52b2tlZC5cbiAgLy8gVGhpcyBwYXNzIGFsc28gdHJpZ2dlcnMgYW55IHJlbmRlcmVyLXNwZWNpZmljIGluaXRpYWwgZWZmZWN0cy5cbiAgbmV4dEVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuICBzdGFydENvbW1pdExpZmVDeWNsZXNUaW1lcigpO1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBfZGlkRXJyb3IyID0gZmFsc2U7XG4gICAgdmFyIF9lcnJvcjIgPSB2b2lkIDA7XG4gICAge1xuICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGNvbW1pdEFsbExpZmVDeWNsZXMsIG51bGwsIHJvb3QsIGNvbW1pdHRlZEV4cGlyYXRpb25UaW1lKTtcbiAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgIF9kaWRFcnJvcjIgPSB0cnVlO1xuICAgICAgICBfZXJyb3IyID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoX2RpZEVycm9yMikge1xuICAgICAgIShuZXh0RWZmZWN0ICE9PSBudWxsKSA/IGludmFyaWFudChmYWxzZSwgJ1Nob3VsZCBoYXZlIG5leHQgZWZmZWN0LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpIDogdm9pZCAwO1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IobmV4dEVmZmVjdCwgX2Vycm9yMik7XG4gICAgICBpZiAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgICAgICBuZXh0RWZmZWN0ID0gbmV4dEVmZmVjdC5uZXh0RWZmZWN0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChmaXJzdEVmZmVjdCAhPT0gbnVsbCAmJiByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyAhPT0gbnVsbCkge1xuICAgIC8vIFRoaXMgY29tbWl0IGluY2x1ZGVkIGEgcGFzc2l2ZSBlZmZlY3QuIFRoZXNlIGRvIG5vdCBuZWVkIHRvIGZpcmUgdW50aWxcbiAgICAvLyBhZnRlciB0aGUgbmV4dCBwYWludC4gU2NoZWR1bGUgYW4gY2FsbGJhY2sgdG8gZmlyZSB0aGVtIGluIGFuIGFzeW5jXG4gICAgLy8gZXZlbnQuIFRvIGVuc3VyZSBzZXJpYWwgZXhlY3V0aW9uLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBmbHVzaGVkIGVhcmx5IGlmXG4gICAgLy8gd2UgZW50ZXIgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgY29tbWl0IHBoYXNlIGJlZm9yZSB0aGVuLlxuICAgIHZhciBjYWxsYmFjayA9IGNvbW1pdFBhc3NpdmVFZmZlY3RzLmJpbmQobnVsbCwgcm9vdCwgZmlyc3RFZmZlY3QpO1xuICAgIGlmIChlbmFibGVTY2hlZHVsZXJUcmFjaW5nKSB7XG4gICAgICAvLyBUT0RPOiBBdm9pZCB0aGlzIGV4dHJhIGNhbGxiYWNrIGJ5IG11dGF0aW5nIHRoZSB0cmFjaW5nIHJlZiBkaXJlY3RseSxcbiAgICAgIC8vIGxpa2Ugd2UgZG8gYXQgdGhlIGJlZ2lubmluZyBvZiBjb21taXRSb290LiBJJ3ZlIG9wdGVkIG5vdCB0byBkbyB0aGF0XG4gICAgICAvLyBoZXJlIGJlY2F1c2UgdGhhdCBjb2RlIGlzIHN0aWxsIGluIGZsdXguXG4gICAgICBjYWxsYmFjayA9IHRyYWNpbmcudW5zdGFibGVfd3JhcChjYWxsYmFjayk7XG4gICAgfVxuICAgIHBhc3NpdmVFZmZlY3RDYWxsYmFja0hhbmRsZSA9IHNjaGVkdWxlci51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHkoc2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gc2NoZWR1bGVQYXNzaXZlRWZmZWN0cyhjYWxsYmFjayk7XG4gICAgfSk7XG4gICAgcGFzc2l2ZUVmZmVjdENhbGxiYWNrID0gY2FsbGJhY2s7XG4gIH1cblxuICBpc0NvbW1pdHRpbmckMSA9IGZhbHNlO1xuICBpc1dvcmtpbmcgPSBmYWxzZTtcbiAgc3RvcENvbW1pdExpZmVDeWNsZXNUaW1lcigpO1xuICBzdG9wQ29tbWl0VGltZXIoKTtcbiAgb25Db21taXRSb290KGZpbmlzaGVkV29yay5zdGF0ZU5vZGUpO1xuICBpZiAodHJ1ZSAmJiBSZWFjdEZpYmVySW5zdHJ1bWVudGF0aW9uXzEuZGVidWdUb29sKSB7XG4gICAgUmVhY3RGaWJlckluc3RydW1lbnRhdGlvbl8xLmRlYnVnVG9vbC5vbkNvbW1pdFdvcmsoZmluaXNoZWRXb3JrKTtcbiAgfVxuXG4gIHZhciB1cGRhdGVFeHBpcmF0aW9uVGltZUFmdGVyQ29tbWl0ID0gZmluaXNoZWRXb3JrLmV4cGlyYXRpb25UaW1lO1xuICB2YXIgY2hpbGRFeHBpcmF0aW9uVGltZUFmdGVyQ29tbWl0ID0gZmluaXNoZWRXb3JrLmNoaWxkRXhwaXJhdGlvblRpbWU7XG4gIHZhciBlYXJsaWVzdFJlbWFpbmluZ1RpbWVBZnRlckNvbW1pdCA9IGNoaWxkRXhwaXJhdGlvblRpbWVBZnRlckNvbW1pdCA+IHVwZGF0ZUV4cGlyYXRpb25UaW1lQWZ0ZXJDb21taXQgPyBjaGlsZEV4cGlyYXRpb25UaW1lQWZ0ZXJDb21taXQgOiB1cGRhdGVFeHBpcmF0aW9uVGltZUFmdGVyQ29tbWl0O1xuICBpZiAoZWFybGllc3RSZW1haW5pbmdUaW1lQWZ0ZXJDb21taXQgPT09IE5vV29yaykge1xuICAgIC8vIElmIHRoZXJlJ3Mgbm8gcmVtYWluaW5nIHdvcmssIHdlIGNhbiBjbGVhciB0aGUgc2V0IG9mIGFscmVhZHkgZmFpbGVkXG4gICAgLy8gZXJyb3IgYm91bmRhcmllcy5cbiAgICBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG51bGw7XG4gIH1cbiAgb25Db21taXQocm9vdCwgZWFybGllc3RSZW1haW5pbmdUaW1lQWZ0ZXJDb21taXQpO1xuXG4gIGlmIChlbmFibGVTY2hlZHVsZXJUcmFjaW5nKSB7XG4gICAgdHJhY2luZy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50ID0gcHJldkludGVyYWN0aW9ucztcblxuICAgIHZhciBzdWJzY3JpYmVyID0gdm9pZCAwO1xuXG4gICAgdHJ5IHtcbiAgICAgIHN1YnNjcmliZXIgPSB0cmFjaW5nLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50O1xuICAgICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwgJiYgcm9vdC5tZW1vaXplZEludGVyYWN0aW9ucy5zaXplID4gMCkge1xuICAgICAgICB2YXIgdGhyZWFkSUQgPSBjb21wdXRlVGhyZWFkSUQoY29tbWl0dGVkRXhwaXJhdGlvblRpbWUsIHJvb3QuaW50ZXJhY3Rpb25UaHJlYWRJRCk7XG4gICAgICAgIHN1YnNjcmliZXIub25Xb3JrU3RvcHBlZChyb290Lm1lbW9pemVkSW50ZXJhY3Rpb25zLCB0aHJlYWRJRCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEl0J3Mgbm90IHNhZmUgZm9yIGNvbW1pdFJvb3QoKSB0byB0aHJvdy5cbiAgICAgIC8vIFN0b3JlIHRoZSBlcnJvciBmb3Igbm93IGFuZCB3ZSdsbCByZS10aHJvdyBpbiBmaW5pc2hSZW5kZXJpbmcoKS5cbiAgICAgIGlmICghaGFzVW5oYW5kbGVkRXJyb3IpIHtcbiAgICAgICAgaGFzVW5oYW5kbGVkRXJyb3IgPSB0cnVlO1xuICAgICAgICB1bmhhbmRsZWRFcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBDbGVhciBjb21wbGV0ZWQgaW50ZXJhY3Rpb25zIGZyb20gdGhlIHBlbmRpbmcgTWFwLlxuICAgICAgLy8gVW5sZXNzIHRoZSByZW5kZXIgd2FzIHN1c3BlbmRlZCBvciBjYXNjYWRpbmcgd29yayB3YXMgc2NoZWR1bGVkLFxuICAgICAgLy8gSW4gd2hpY2ggY2FzZeKAkyBsZWF2ZSBwZW5kaW5nIGludGVyYWN0aW9ucyB1bnRpbCB0aGUgc3Vic2VxdWVudCByZW5kZXIuXG4gICAgICB2YXIgcGVuZGluZ0ludGVyYWN0aW9uTWFwID0gcm9vdC5wZW5kaW5nSW50ZXJhY3Rpb25NYXA7XG4gICAgICBwZW5kaW5nSW50ZXJhY3Rpb25NYXAuZm9yRWFjaChmdW5jdGlvbiAoc2NoZWR1bGVkSW50ZXJhY3Rpb25zLCBzY2hlZHVsZWRFeHBpcmF0aW9uVGltZSkge1xuICAgICAgICAvLyBPbmx5IGRlY3JlbWVudCB0aGUgcGVuZGluZyBpbnRlcmFjdGlvbiBjb3VudCBpZiB3ZSdyZSBkb25lLlxuICAgICAgICAvLyBJZiB0aGVyZSdzIHN0aWxsIHdvcmsgYXQgdGhlIGN1cnJlbnQgcHJpb3JpdHksXG4gICAgICAgIC8vIFRoYXQgaW5kaWNhdGVzIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIHN1c3BlbnNlIGRhdGEuXG4gICAgICAgIGlmIChzY2hlZHVsZWRFeHBpcmF0aW9uVGltZSA+IGVhcmxpZXN0UmVtYWluaW5nVGltZUFmdGVyQ29tbWl0KSB7XG4gICAgICAgICAgcGVuZGluZ0ludGVyYWN0aW9uTWFwLmRlbGV0ZShzY2hlZHVsZWRFeHBpcmF0aW9uVGltZSk7XG5cbiAgICAgICAgICBzY2hlZHVsZWRJbnRlcmFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgICAgIGludGVyYWN0aW9uLl9fY291bnQtLTtcblxuICAgICAgICAgICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwgJiYgaW50ZXJhY3Rpb24uX19jb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIub25JbnRlcmFjdGlvblNjaGVkdWxlZFdvcmtDb21wbGV0ZWQoaW50ZXJhY3Rpb24pO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8vIEl0J3Mgbm90IHNhZmUgZm9yIGNvbW1pdFJvb3QoKSB0byB0aHJvdy5cbiAgICAgICAgICAgICAgICAvLyBTdG9yZSB0aGUgZXJyb3IgZm9yIG5vdyBhbmQgd2UnbGwgcmUtdGhyb3cgaW4gZmluaXNoUmVuZGVyaW5nKCkuXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNVbmhhbmRsZWRFcnJvcikge1xuICAgICAgICAgICAgICAgICAgaGFzVW5oYW5kbGVkRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgdW5oYW5kbGVkRXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0Q2hpbGRFeHBpcmF0aW9uVGltZSh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyVGltZSkge1xuICBpZiAocmVuZGVyVGltZSAhPT0gTmV2ZXIgJiYgd29ya0luUHJvZ3Jlc3MuY2hpbGRFeHBpcmF0aW9uVGltZSA9PT0gTmV2ZXIpIHtcbiAgICAvLyBUaGUgY2hpbGRyZW4gb2YgdGhpcyBjb21wb25lbnQgYXJlIGhpZGRlbi4gRG9uJ3QgYnViYmxlIHRoZWlyXG4gICAgLy8gZXhwaXJhdGlvbiB0aW1lcy5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbmV3Q2hpbGRFeHBpcmF0aW9uVGltZSA9IE5vV29yaztcblxuICAvLyBCdWJibGUgdXAgdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZS5cbiAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIgJiYgd29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgLy8gV2UncmUgaW4gcHJvZmlsaW5nIG1vZGUuXG4gICAgLy8gTGV0J3MgdXNlIHRoaXMgc2FtZSB0cmF2ZXJzYWwgdG8gdXBkYXRlIHRoZSByZW5kZXIgZHVyYXRpb25zLlxuICAgIHZhciBhY3R1YWxEdXJhdGlvbiA9IHdvcmtJblByb2dyZXNzLmFjdHVhbER1cmF0aW9uO1xuICAgIHZhciB0cmVlQmFzZUR1cmF0aW9uID0gd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbjtcblxuICAgIC8vIFdoZW4gYSBmaWJlciBpcyBjbG9uZWQsIGl0cyBhY3R1YWxEdXJhdGlvbiBpcyByZXNldCB0byAwLlxuICAgIC8vIFRoaXMgdmFsdWUgd2lsbCBvbmx5IGJlIHVwZGF0ZWQgaWYgd29yayBpcyBkb25lIG9uIHRoZSBmaWJlciAoaS5lLiBpdCBkb2Vzbid0IGJhaWxvdXQpLlxuICAgIC8vIFdoZW4gd29yayBpcyBkb25lLCBpdCBzaG91bGQgYnViYmxlIHRvIHRoZSBwYXJlbnQncyBhY3R1YWxEdXJhdGlvbi5cbiAgICAvLyBJZiB0aGUgZmliZXIgaGFzIG5vdCBiZWVuIGNsb25lZCB0aG91Z2gsIChtZWFuaW5nIG5vIHdvcmsgd2FzIGRvbmUpLFxuICAgIC8vIFRoZW4gdGhpcyB2YWx1ZSB3aWxsIHJlZmxlY3QgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IHdvcmtpbmcgb24gYSBwcmV2aW91cyByZW5kZXIuXG4gICAgLy8gSW4gdGhhdCBjYXNlIGl0IHNob3VsZCBub3QgYnViYmxlLlxuICAgIC8vIFdlIGRldGVybWluZSB3aGV0aGVyIGl0IHdhcyBjbG9uZWQgYnkgY29tcGFyaW5nIHRoZSBjaGlsZCBwb2ludGVyLlxuICAgIHZhciBzaG91bGRCdWJibGVBY3R1YWxEdXJhdGlvbnMgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPT09IG51bGwgfHwgd29ya0luUHJvZ3Jlc3MuY2hpbGQgIT09IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZS5jaGlsZDtcblxuICAgIHZhciBjaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgdmFyIGNoaWxkVXBkYXRlRXhwaXJhdGlvblRpbWUgPSBjaGlsZC5leHBpcmF0aW9uVGltZTtcbiAgICAgIHZhciBjaGlsZENoaWxkRXhwaXJhdGlvblRpbWUgPSBjaGlsZC5jaGlsZEV4cGlyYXRpb25UaW1lO1xuICAgICAgaWYgKGNoaWxkVXBkYXRlRXhwaXJhdGlvblRpbWUgPiBuZXdDaGlsZEV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgIG5ld0NoaWxkRXhwaXJhdGlvblRpbWUgPSBjaGlsZFVwZGF0ZUV4cGlyYXRpb25UaW1lO1xuICAgICAgfVxuICAgICAgaWYgKGNoaWxkQ2hpbGRFeHBpcmF0aW9uVGltZSA+IG5ld0NoaWxkRXhwaXJhdGlvblRpbWUpIHtcbiAgICAgICAgbmV3Q2hpbGRFeHBpcmF0aW9uVGltZSA9IGNoaWxkQ2hpbGRFeHBpcmF0aW9uVGltZTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRCdWJibGVBY3R1YWxEdXJhdGlvbnMpIHtcbiAgICAgICAgYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247XG4gICAgICB9XG4gICAgICB0cmVlQmFzZUR1cmF0aW9uICs9IGNoaWxkLnRyZWVCYXNlRHVyYXRpb247XG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuICAgIHdvcmtJblByb2dyZXNzLmFjdHVhbER1cmF0aW9uID0gYWN0dWFsRHVyYXRpb247XG4gICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiA9IHRyZWVCYXNlRHVyYXRpb247XG4gIH0gZWxzZSB7XG4gICAgdmFyIF9jaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgIHdoaWxlIChfY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHZhciBfY2hpbGRVcGRhdGVFeHBpcmF0aW9uVGltZSA9IF9jaGlsZC5leHBpcmF0aW9uVGltZTtcbiAgICAgIHZhciBfY2hpbGRDaGlsZEV4cGlyYXRpb25UaW1lID0gX2NoaWxkLmNoaWxkRXhwaXJhdGlvblRpbWU7XG4gICAgICBpZiAoX2NoaWxkVXBkYXRlRXhwaXJhdGlvblRpbWUgPiBuZXdDaGlsZEV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgIG5ld0NoaWxkRXhwaXJhdGlvblRpbWUgPSBfY2hpbGRVcGRhdGVFeHBpcmF0aW9uVGltZTtcbiAgICAgIH1cbiAgICAgIGlmIChfY2hpbGRDaGlsZEV4cGlyYXRpb25UaW1lID4gbmV3Q2hpbGRFeHBpcmF0aW9uVGltZSkge1xuICAgICAgICBuZXdDaGlsZEV4cGlyYXRpb25UaW1lID0gX2NoaWxkQ2hpbGRFeHBpcmF0aW9uVGltZTtcbiAgICAgIH1cbiAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkRXhwaXJhdGlvblRpbWUgPSBuZXdDaGlsZEV4cGlyYXRpb25UaW1lO1xufVxuXG5mdW5jdGlvbiBjb21wbGV0ZVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpIHtcbiAgLy8gQXR0ZW1wdCB0byBjb21wbGV0ZSB0aGUgY3VycmVudCB1bml0IG9mIHdvcmssIHRoZW4gbW92ZSB0byB0aGVcbiAgLy8gbmV4dCBzaWJsaW5nLiBJZiB0aGVyZSBhcmUgbm8gbW9yZSBzaWJsaW5ncywgcmV0dXJuIHRvIHRoZVxuICAvLyBwYXJlbnQgZmliZXIuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgLy8gVGhlIGN1cnJlbnQsIGZsdXNoZWQsIHN0YXRlIG9mIHRoaXMgZmliZXIgaXMgdGhlIGFsdGVybmF0ZS5cbiAgICAvLyBJZGVhbGx5IG5vdGhpbmcgc2hvdWxkIHJlbHkgb24gdGhpcywgYnV0IHJlbHlpbmcgb24gaXQgaGVyZVxuICAgIC8vIG1lYW5zIHRoYXQgd2UgZG9uJ3QgbmVlZCBhbiBhZGRpdGlvbmFsIGZpZWxkIG9uIHRoZSB3b3JrIGluXG4gICAgLy8gcHJvZ3Jlc3MuXG4gICAgdmFyIGN1cnJlbnQkJDEgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7XG4gICAge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG5cbiAgICB2YXIgcmV0dXJuRmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gICAgdmFyIHNpYmxpbmdGaWJlciA9IHdvcmtJblByb2dyZXNzLnNpYmxpbmc7XG5cbiAgICBpZiAoKHdvcmtJblByb2dyZXNzLmVmZmVjdFRhZyAmIEluY29tcGxldGUpID09PSBOb0VmZmVjdCkge1xuICAgICAgaWYgKHRydWUgJiYgcmVwbGF5RmFpbGVkVW5pdE9mV29ya1dpdGhJbnZva2VHdWFyZGVkQ2FsbGJhY2spIHtcbiAgICAgICAgLy8gRG9uJ3QgcmVwbGF5IGlmIGl0IGZhaWxzIGR1cmluZyBjb21wbGV0aW9uIHBoYXNlLlxuICAgICAgICBtYXlSZXBsYXlGYWlsZWRVbml0T2ZXb3JrID0gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBUaGlzIGZpYmVyIGNvbXBsZXRlZC5cbiAgICAgIC8vIFJlbWVtYmVyIHdlJ3JlIGNvbXBsZXRpbmcgdGhpcyB1bml0IHNvIHdlIGNhbiBmaW5kIGEgYm91bmRhcnkgaWYgaXQgZmFpbHMuXG4gICAgICBuZXh0VW5pdE9mV29yayA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIpIHtcbiAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHN0YXJ0UHJvZmlsZXJUaW1lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dFVuaXRPZldvcmsgPSBjb21wbGV0ZVdvcmsoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIG5leHRSZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAvLyBVcGRhdGUgcmVuZGVyIGR1cmF0aW9uIGFzc3VtaW5nIHdlIGRpZG4ndCBlcnJvci5cbiAgICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKHdvcmtJblByb2dyZXNzLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRVbml0T2ZXb3JrID0gY29tcGxldGVXb3JrKGN1cnJlbnQkJDEsIHdvcmtJblByb2dyZXNzLCBuZXh0UmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgICAgfVxuICAgICAgaWYgKHRydWUgJiYgcmVwbGF5RmFpbGVkVW5pdE9mV29ya1dpdGhJbnZva2VHdWFyZGVkQ2FsbGJhY2spIHtcbiAgICAgICAgLy8gV2UncmUgb3V0IG9mIGNvbXBsZXRpb24gcGhhc2Ugc28gcmVwbGF5aW5nIGlzIGZpbmUgbm93LlxuICAgICAgICBtYXlSZXBsYXlGYWlsZWRVbml0T2ZXb3JrID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHN0b3BXb3JrVGltZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmVzZXRDaGlsZEV4cGlyYXRpb25UaW1lKHdvcmtJblByb2dyZXNzLCBuZXh0UmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgICAge1xuICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV4dFVuaXRPZldvcmsgIT09IG51bGwpIHtcbiAgICAgICAgLy8gQ29tcGxldGluZyB0aGlzIGZpYmVyIHNwYXduZWQgbmV3IHdvcmsuIFdvcmsgb24gdGhhdCBuZXh0LlxuICAgICAgICByZXR1cm4gbmV4dFVuaXRPZldvcms7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCAmJlxuICAgICAgLy8gRG8gbm90IGFwcGVuZCBlZmZlY3RzIHRvIHBhcmVudHMgaWYgYSBzaWJsaW5nIGZhaWxlZCB0byBjb21wbGV0ZVxuICAgICAgKHJldHVybkZpYmVyLmVmZmVjdFRhZyAmIEluY29tcGxldGUpID09PSBOb0VmZmVjdCkge1xuICAgICAgICAvLyBBcHBlbmQgYWxsIHRoZSBlZmZlY3RzIG9mIHRoZSBzdWJ0cmVlIGFuZCB0aGlzIGZpYmVyIG9udG8gdGhlIGVmZmVjdFxuICAgICAgICAvLyBsaXN0IG9mIHRoZSBwYXJlbnQuIFRoZSBjb21wbGV0aW9uIG9yZGVyIG9mIHRoZSBjaGlsZHJlbiBhZmZlY3RzIHRoZVxuICAgICAgICAvLyBzaWRlLWVmZmVjdCBvcmRlci5cbiAgICAgICAgaWYgKHJldHVybkZpYmVyLmZpcnN0RWZmZWN0ID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuRmliZXIuZmlyc3RFZmZlY3QgPSB3b3JrSW5Qcm9ncmVzcy5maXJzdEVmZmVjdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChyZXR1cm5GaWJlci5sYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm5GaWJlci5sYXN0RWZmZWN0Lm5leHRFZmZlY3QgPSB3b3JrSW5Qcm9ncmVzcy5maXJzdEVmZmVjdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuRmliZXIubGFzdEVmZmVjdCA9IHdvcmtJblByb2dyZXNzLmxhc3RFZmZlY3Q7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGlzIGZpYmVyIGhhZCBzaWRlLWVmZmVjdHMsIHdlIGFwcGVuZCBpdCBBRlRFUiB0aGUgY2hpbGRyZW4nc1xuICAgICAgICAvLyBzaWRlLWVmZmVjdHMuIFdlIGNhbiBwZXJmb3JtIGNlcnRhaW4gc2lkZS1lZmZlY3RzIGVhcmxpZXIgaWZcbiAgICAgICAgLy8gbmVlZGVkLCBieSBkb2luZyBtdWx0aXBsZSBwYXNzZXMgb3ZlciB0aGUgZWZmZWN0IGxpc3QuIFdlIGRvbid0IHdhbnRcbiAgICAgICAgLy8gdG8gc2NoZWR1bGUgb3VyIG93biBzaWRlLWVmZmVjdCBvbiBvdXIgb3duIGxpc3QgYmVjYXVzZSBpZiBlbmQgdXBcbiAgICAgICAgLy8gcmV1c2luZyBjaGlsZHJlbiB3ZSdsbCBzY2hlZHVsZSB0aGlzIGVmZmVjdCBvbnRvIGl0c2VsZiBzaW5jZSB3ZSdyZVxuICAgICAgICAvLyBhdCB0aGUgZW5kLlxuICAgICAgICB2YXIgZWZmZWN0VGFnID0gd29ya0luUHJvZ3Jlc3MuZWZmZWN0VGFnO1xuICAgICAgICAvLyBTa2lwIGJvdGggTm9Xb3JrIGFuZCBQZXJmb3JtZWRXb3JrIHRhZ3Mgd2hlbiBjcmVhdGluZyB0aGUgZWZmZWN0IGxpc3QuXG4gICAgICAgIC8vIFBlcmZvcm1lZFdvcmsgZWZmZWN0IGlzIHJlYWQgYnkgUmVhY3QgRGV2VG9vbHMgYnV0IHNob3VsZG4ndCBiZSBjb21taXR0ZWQuXG4gICAgICAgIGlmIChlZmZlY3RUYWcgPiBQZXJmb3JtZWRXb3JrKSB7XG4gICAgICAgICAgaWYgKHJldHVybkZpYmVyLmxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybkZpYmVyLmxhc3RFZmZlY3QubmV4dEVmZmVjdCA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm5GaWJlci5maXJzdEVmZmVjdCA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm5GaWJlci5sYXN0RWZmZWN0ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRydWUgJiYgUmVhY3RGaWJlckluc3RydW1lbnRhdGlvbl8xLmRlYnVnVG9vbCkge1xuICAgICAgICBSZWFjdEZpYmVySW5zdHJ1bWVudGF0aW9uXzEuZGVidWdUb29sLm9uQ29tcGxldGVXb3JrKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNpYmxpbmdGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiB0aGVyZSBpcyBtb3JlIHdvcmsgdG8gZG8gaW4gdGhpcyByZXR1cm5GaWJlciwgZG8gdGhhdCBuZXh0LlxuICAgICAgICByZXR1cm4gc2libGluZ0ZpYmVyO1xuICAgICAgfSBlbHNlIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIG1vcmUgd29yayBpbiB0aGlzIHJldHVybkZpYmVyLiBDb21wbGV0ZSB0aGUgcmV0dXJuRmliZXIuXG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gcmV0dXJuRmliZXI7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgcm9vdC5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyICYmIHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAvLyBSZWNvcmQgdGhlIHJlbmRlciBkdXJhdGlvbiBmb3IgdGhlIGZpYmVyIHRoYXQgZXJyb3JlZC5cbiAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YSh3b3JrSW5Qcm9ncmVzcywgZmFsc2UpO1xuXG4gICAgICAgIC8vIEluY2x1ZGUgdGhlIHRpbWUgc3BlbnQgd29ya2luZyBvbiBmYWlsZWQgY2hpbGRyZW4gYmVmb3JlIGNvbnRpbnVpbmcuXG4gICAgICAgIHZhciBhY3R1YWxEdXJhdGlvbiA9IHdvcmtJblByb2dyZXNzLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICB2YXIgY2hpbGQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247XG4gICAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmFjdHVhbER1cmF0aW9uID0gYWN0dWFsRHVyYXRpb247XG4gICAgICB9XG5cbiAgICAgIC8vIFRoaXMgZmliZXIgZGlkIG5vdCBjb21wbGV0ZSBiZWNhdXNlIHNvbWV0aGluZyB0aHJldy4gUG9wIHZhbHVlcyBvZmZcbiAgICAgIC8vIHRoZSBzdGFjayB3aXRob3V0IGVudGVyaW5nIHRoZSBjb21wbGV0ZSBwaGFzZS4gSWYgdGhpcyBpcyBhIGJvdW5kYXJ5LFxuICAgICAgLy8gY2FwdHVyZSB2YWx1ZXMgaWYgcG9zc2libGUuXG4gICAgICB2YXIgbmV4dCA9IHVud2luZFdvcmsod29ya0luUHJvZ3Jlc3MsIG5leHRSZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgICAvLyBCZWNhdXNlIHRoaXMgZmliZXIgZGlkIG5vdCBjb21wbGV0ZSwgZG9uJ3QgcmVzZXQgaXRzIGV4cGlyYXRpb24gdGltZS5cbiAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5lZmZlY3RUYWcgJiBEaWRDYXB0dXJlKSB7XG4gICAgICAgIC8vIFJlc3RhcnRpbmcgYW4gZXJyb3IgYm91bmRhcnlcbiAgICAgICAgc3RvcEZhaWxlZFdvcmtUaW1lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdG9wV29ya1RpbWVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIH1cblxuICAgICAge1xuICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV4dCAhPT0gbnVsbCkge1xuICAgICAgICBzdG9wV29ya1RpbWVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgaWYgKHRydWUgJiYgUmVhY3RGaWJlckluc3RydW1lbnRhdGlvbl8xLmRlYnVnVG9vbCkge1xuICAgICAgICAgIFJlYWN0RmliZXJJbnN0cnVtZW50YXRpb25fMS5kZWJ1Z1Rvb2wub25Db21wbGV0ZVdvcmsod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgY29tcGxldGluZyB0aGlzIHdvcmsgc3Bhd25lZCBuZXcgd29yaywgZG8gdGhhdCBuZXh0LiBXZSdsbCBjb21lXG4gICAgICAgIC8vIGJhY2sgaGVyZSBhZ2Fpbi5cbiAgICAgICAgLy8gU2luY2Ugd2UncmUgcmVzdGFydGluZywgcmVtb3ZlIGFueXRoaW5nIHRoYXQgaXMgbm90IGEgaG9zdCBlZmZlY3RcbiAgICAgICAgLy8gZnJvbSB0aGUgZWZmZWN0IHRhZy5cbiAgICAgICAgbmV4dC5lZmZlY3RUYWcgJj0gSG9zdEVmZmVjdE1hc2s7XG4gICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgfVxuXG4gICAgICBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgLy8gTWFyayB0aGUgcGFyZW50IGZpYmVyIGFzIGluY29tcGxldGUgYW5kIGNsZWFyIGl0cyBlZmZlY3QgbGlzdC5cbiAgICAgICAgcmV0dXJuRmliZXIuZmlyc3RFZmZlY3QgPSByZXR1cm5GaWJlci5sYXN0RWZmZWN0ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuRmliZXIuZWZmZWN0VGFnIHw9IEluY29tcGxldGU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0cnVlICYmIFJlYWN0RmliZXJJbnN0cnVtZW50YXRpb25fMS5kZWJ1Z1Rvb2wpIHtcbiAgICAgICAgUmVhY3RGaWJlckluc3RydW1lbnRhdGlvbl8xLmRlYnVnVG9vbC5vbkNvbXBsZXRlV29yayh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaWJsaW5nRmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgbW9yZSB3b3JrIHRvIGRvIGluIHRoaXMgcmV0dXJuRmliZXIsIGRvIHRoYXQgbmV4dC5cbiAgICAgICAgcmV0dXJuIHNpYmxpbmdGaWJlcjtcbiAgICAgIH0gZWxzZSBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBubyBtb3JlIHdvcmsgaW4gdGhpcyByZXR1cm5GaWJlci4gQ29tcGxldGUgdGhlIHJldHVybkZpYmVyLlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IHJldHVybkZpYmVyO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFdpdGhvdXQgdGhpcyBleHBsaWNpdCBudWxsIHJldHVybiBGbG93IGNvbXBsYWlucyBvZiBpbnZhbGlkIHJldHVybiB0eXBlXG4gIC8vIFRPRE8gUmVtb3ZlIHRoZSBhYm92ZSB3aGlsZSh0cnVlKSBsb29wXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnJlYWNoYWJsZVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpIHtcbiAgLy8gVGhlIGN1cnJlbnQsIGZsdXNoZWQsIHN0YXRlIG9mIHRoaXMgZmliZXIgaXMgdGhlIGFsdGVybmF0ZS5cbiAgLy8gSWRlYWxseSBub3RoaW5nIHNob3VsZCByZWx5IG9uIHRoaXMsIGJ1dCByZWx5aW5nIG9uIGl0IGhlcmVcbiAgLy8gbWVhbnMgdGhhdCB3ZSBkb24ndCBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW5cbiAgLy8gcHJvZ3Jlc3MuXG4gIHZhciBjdXJyZW50JCQxID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gIC8vIFNlZSBpZiBiZWdpbm5pbmcgdGhpcyB3b3JrIHNwYXducyBtb3JlIHdvcmsuXG4gIHN0YXJ0V29ya1RpbWVyKHdvcmtJblByb2dyZXNzKTtcbiAge1xuICAgIHNldEN1cnJlbnRGaWJlcih3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICBpZiAodHJ1ZSAmJiByZXBsYXlGYWlsZWRVbml0T2ZXb3JrV2l0aEludm9rZUd1YXJkZWRDYWxsYmFjaykge1xuICAgIHN0YXNoZWRXb3JrSW5Qcm9ncmVzc1Byb3BlcnRpZXMgPSBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVihzdGFzaGVkV29ya0luUHJvZ3Jlc3NQcm9wZXJ0aWVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB2YXIgbmV4dCA9IHZvaWQgMDtcbiAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIpIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICBzdGFydFByb2ZpbGVyVGltZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cblxuICAgIG5leHQgPSBiZWdpbldvcmsoY3VycmVudCQkMSwgd29ya0luUHJvZ3Jlc3MsIG5leHRSZW5kZXJFeHBpcmF0aW9uVGltZSk7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgIC8vIFJlY29yZCB0aGUgcmVuZGVyIGR1cmF0aW9uIGFzc3VtaW5nIHdlIGRpZG4ndCBiYWlsb3V0IChvciBlcnJvcikuXG4gICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKHdvcmtJblByb2dyZXNzLCB0cnVlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV4dCA9IGJlZ2luV29yayhjdXJyZW50JCQxLCB3b3JrSW5Qcm9ncmVzcywgbmV4dFJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB9XG5cbiAge1xuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgaWYgKGlzUmVwbGF5aW5nRmFpbGVkVW5pdE9mV29yaykge1xuICAgICAgLy8gQ3VycmVudGx5IHJlcGxheWluZyBhIGZhaWxlZCB1bml0IG9mIHdvcmsuIFRoaXMgc2hvdWxkIGJlIHVucmVhY2hhYmxlLFxuICAgICAgLy8gYmVjYXVzZSB0aGUgcmVuZGVyIHBoYXNlIGlzIG1lYW50IHRvIGJlIGlkZW1wb3RlbnQsIGFuZCBpdCBzaG91bGRcbiAgICAgIC8vIGhhdmUgdGhyb3duIGFnYWluLiBTaW5jZSBpdCBkaWRuJ3QsIHJldGhyb3cgdGhlIG9yaWdpbmFsIGVycm9yLCBzb1xuICAgICAgLy8gUmVhY3QncyBpbnRlcm5hbCBzdGFjayBpcyBub3QgbWlzYWxpZ25lZC5cbiAgICAgIHJldGhyb3dPcmlnaW5hbEVycm9yKCk7XG4gICAgfVxuICB9XG4gIGlmICh0cnVlICYmIFJlYWN0RmliZXJJbnN0cnVtZW50YXRpb25fMS5kZWJ1Z1Rvb2wpIHtcbiAgICBSZWFjdEZpYmVySW5zdHJ1bWVudGF0aW9uXzEuZGVidWdUb29sLm9uQmVnaW5Xb3JrKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIGlmIChuZXh0ID09PSBudWxsKSB7XG4gICAgLy8gSWYgdGhpcyBkb2Vzbid0IHNwYXduIG5ldyB3b3JrLCBjb21wbGV0ZSB0aGUgY3VycmVudCB3b3JrLlxuICAgIG5leHQgPSBjb21wbGV0ZVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAgUmVhY3RDdXJyZW50T3duZXIkMi5jdXJyZW50ID0gbnVsbDtcblxuICByZXR1cm4gbmV4dDtcbn1cblxuZnVuY3Rpb24gd29ya0xvb3AoaXNZaWVsZHkpIHtcbiAgaWYgKCFpc1lpZWxkeSkge1xuICAgIC8vIEZsdXNoIHdvcmsgd2l0aG91dCB5aWVsZGluZ1xuICAgIHdoaWxlIChuZXh0VW5pdE9mV29yayAhPT0gbnVsbCkge1xuICAgICAgbmV4dFVuaXRPZldvcmsgPSBwZXJmb3JtVW5pdE9mV29yayhuZXh0VW5pdE9mV29yayk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIEZsdXNoIGFzeW5jaHJvbm91cyB3b3JrIHVudGlsIHRoZXJlJ3MgYSBoaWdoZXIgcHJpb3JpdHkgZXZlbnRcbiAgICB3aGlsZSAobmV4dFVuaXRPZldvcmsgIT09IG51bGwgJiYgIXNob3VsZFlpZWxkVG9SZW5kZXJlcigpKSB7XG4gICAgICBuZXh0VW5pdE9mV29yayA9IHBlcmZvcm1Vbml0T2ZXb3JrKG5leHRVbml0T2ZXb3JrKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVuZGVyUm9vdChyb290LCBpc1lpZWxkeSkge1xuICAhIWlzV29ya2luZyA/IGludmFyaWFudChmYWxzZSwgJ3JlbmRlclJvb3Qgd2FzIGNhbGxlZCByZWN1cnNpdmVseS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKSA6IHZvaWQgMDtcblxuICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG5cbiAgaXNXb3JraW5nID0gdHJ1ZTtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudDtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIHZhciBleHBpcmF0aW9uVGltZSA9IHJvb3QubmV4dEV4cGlyYXRpb25UaW1lVG9Xb3JrT247XG5cbiAgLy8gQ2hlY2sgaWYgd2UncmUgc3RhcnRpbmcgZnJvbSBhIGZyZXNoIHN0YWNrLCBvciBpZiB3ZSdyZSByZXN1bWluZyBmcm9tXG4gIC8vIHByZXZpb3VzbHkgeWllbGRlZCB3b3JrLlxuICBpZiAoZXhwaXJhdGlvblRpbWUgIT09IG5leHRSZW5kZXJFeHBpcmF0aW9uVGltZSB8fCByb290ICE9PSBuZXh0Um9vdCB8fCBuZXh0VW5pdE9mV29yayA9PT0gbnVsbCkge1xuICAgIC8vIFJlc2V0IHRoZSBzdGFjayBhbmQgc3RhcnQgd29ya2luZyBmcm9tIHRoZSByb290LlxuICAgIHJlc2V0U3RhY2soKTtcbiAgICBuZXh0Um9vdCA9IHJvb3Q7XG4gICAgbmV4dFJlbmRlckV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gICAgbmV4dFVuaXRPZldvcmsgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhuZXh0Um9vdC5jdXJyZW50LCBudWxsLCBuZXh0UmVuZGVyRXhwaXJhdGlvblRpbWUpO1xuICAgIHJvb3QucGVuZGluZ0NvbW1pdEV4cGlyYXRpb25UaW1lID0gTm9Xb3JrO1xuXG4gICAgaWYgKGVuYWJsZVNjaGVkdWxlclRyYWNpbmcpIHtcbiAgICAgIC8vIERldGVybWluZSB3aGljaCBpbnRlcmFjdGlvbnMgdGhpcyBiYXRjaCBvZiB3b3JrIGN1cnJlbnRseSBpbmNsdWRlcyxcbiAgICAgIC8vIFNvIHRoYXQgd2UgY2FuIGFjY3VyYXRlbHkgYXR0cmlidXRlIHRpbWUgc3BlbnQgd29ya2luZyBvbiBpdCxcbiAgICAgIHZhciBpbnRlcmFjdGlvbnMgPSBuZXcgU2V0KCk7XG4gICAgICByb290LnBlbmRpbmdJbnRlcmFjdGlvbk1hcC5mb3JFYWNoKGZ1bmN0aW9uIChzY2hlZHVsZWRJbnRlcmFjdGlvbnMsIHNjaGVkdWxlZEV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgIGlmIChzY2hlZHVsZWRFeHBpcmF0aW9uVGltZSA+PSBleHBpcmF0aW9uVGltZSkge1xuICAgICAgICAgIHNjaGVkdWxlZEludGVyYWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpbnRlcmFjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGludGVyYWN0aW9ucy5hZGQoaW50ZXJhY3Rpb24pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gU3RvcmUgdGhlIGN1cnJlbnQgc2V0IG9mIGludGVyYWN0aW9ucyBvbiB0aGUgRmliZXJSb290IGZvciBhIGZldyByZWFzb25zOlxuICAgICAgLy8gV2UgY2FuIHJlLXVzZSBpdCBpbiBob3QgZnVuY3Rpb25zIGxpa2UgcmVuZGVyUm9vdCgpIHdpdGhvdXQgaGF2aW5nIHRvIHJlY2FsY3VsYXRlIGl0LlxuICAgICAgLy8gV2Ugd2lsbCBhbHNvIHVzZSBpdCBpbiBjb21taXRXb3JrKCkgdG8gcGFzcyB0byBhbnkgUHJvZmlsZXIgb25SZW5kZXIoKSBob29rcy5cbiAgICAgIC8vIFRoaXMgYWxzbyBwcm92aWRlcyBEZXZUb29scyB3aXRoIGEgd2F5IHRvIGFjY2VzcyBpdCB3aGVuIHRoZSBvbkNvbW1pdFJvb3QoKSBob29rIGlzIGNhbGxlZC5cbiAgICAgIHJvb3QubWVtb2l6ZWRJbnRlcmFjdGlvbnMgPSBpbnRlcmFjdGlvbnM7XG5cbiAgICAgIGlmIChpbnRlcmFjdGlvbnMuc2l6ZSA+IDApIHtcbiAgICAgICAgdmFyIHN1YnNjcmliZXIgPSB0cmFjaW5nLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50O1xuICAgICAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciB0aHJlYWRJRCA9IGNvbXB1dGVUaHJlYWRJRChleHBpcmF0aW9uVGltZSwgcm9vdC5pbnRlcmFjdGlvblRocmVhZElEKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5vbldvcmtTdGFydGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBXb3JrIHRocm93biBieSBhbiBpbnRlcmFjdGlvbiB0cmFjaW5nIHN1YnNjcmliZXIgc2hvdWxkIGJlIHJldGhyb3duLFxuICAgICAgICAgICAgLy8gQnV0IG9ubHkgb25jZSBpdCdzIHNhZmUgKHRvIGF2b2lkIGxlYXZpbmcgdGhlIHNjaGVkdWxlciBpbiBhbiBpbnZhbGlkIHN0YXRlKS5cbiAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBlcnJvciBmb3Igbm93IGFuZCB3ZSdsbCByZS10aHJvdyBpbiBmaW5pc2hSZW5kZXJpbmcoKS5cbiAgICAgICAgICAgIGlmICghaGFzVW5oYW5kbGVkRXJyb3IpIHtcbiAgICAgICAgICAgICAgaGFzVW5oYW5kbGVkRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICB1bmhhbmRsZWRFcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBwcmV2SW50ZXJhY3Rpb25zID0gbnVsbDtcbiAgaWYgKGVuYWJsZVNjaGVkdWxlclRyYWNpbmcpIHtcbiAgICAvLyBXZSdyZSBhYm91dCB0byBzdGFydCBuZXcgdHJhY2VkIHdvcmsuXG4gICAgLy8gUmVzdG9yZSBwZW5kaW5nIGludGVyYWN0aW9ucyBzbyBjYXNjYWRpbmcgd29yayB0cmlnZ2VyZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2Ugd2lsbCBiZSBhY2NvdW50ZWQgZm9yLlxuICAgIHByZXZJbnRlcmFjdGlvbnMgPSB0cmFjaW5nLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQ7XG4gICAgdHJhY2luZy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50ID0gcm9vdC5tZW1vaXplZEludGVyYWN0aW9ucztcbiAgfVxuXG4gIHZhciBkaWRGYXRhbCA9IGZhbHNlO1xuXG4gIHN0YXJ0V29ya0xvb3BUaW1lcihuZXh0VW5pdE9mV29yayk7XG5cbiAgZG8ge1xuICAgIHRyeSB7XG4gICAgICB3b3JrTG9vcChpc1lpZWxkeSk7XG4gICAgfSBjYXRjaCAodGhyb3duVmFsdWUpIHtcbiAgICAgIHJlc2V0Q29udGV4dERlcGVuZGVuY2VzKCk7XG4gICAgICByZXNldEhvb2tzKCk7XG5cbiAgICAgIC8vIFJlc2V0IGluIGNhc2UgY29tcGxldGlvbiB0aHJvd3MuXG4gICAgICAvLyBUaGlzIGlzIG9ubHkgdXNlZCBpbiBERVYgYW5kIHdoZW4gcmVwbGF5aW5nIGlzIG9uLlxuICAgICAgdmFyIG1heVJlcGxheSA9IHZvaWQgMDtcbiAgICAgIGlmICh0cnVlICYmIHJlcGxheUZhaWxlZFVuaXRPZldvcmtXaXRoSW52b2tlR3VhcmRlZENhbGxiYWNrKSB7XG4gICAgICAgIG1heVJlcGxheSA9IG1heVJlcGxheUZhaWxlZFVuaXRPZldvcms7XG4gICAgICAgIG1heVJlcGxheUZhaWxlZFVuaXRPZldvcmsgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV4dFVuaXRPZldvcmsgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIGZhdGFsIGVycm9yLlxuICAgICAgICBkaWRGYXRhbCA9IHRydWU7XG4gICAgICAgIG9uVW5jYXVnaHRFcnJvcih0aHJvd25WYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lciAmJiBuZXh0VW5pdE9mV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAvLyBSZWNvcmQgdGhlIHRpbWUgc3BlbnQgcmVuZGVyaW5nIGJlZm9yZSBhbiBlcnJvciB3YXMgdGhyb3duLlxuICAgICAgICAgIC8vIFRoaXMgYXZvaWRzIGluYWNjdXJhdGUgUHJvZmlsZXIgZHVyYXRpb25zIGluIHRoZSBjYXNlIG9mIGEgc3VzcGVuZGVkIHJlbmRlci5cbiAgICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKG5leHRVbml0T2ZXb3JrLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBSZXNldCBnbG9iYWwgZGVidWcgc3RhdGVcbiAgICAgICAgICAvLyBXZSBhc3N1bWUgdGhpcyBpcyBkZWZpbmVkIGluIERFVlxuICAgICAgICAgIHJlc2V0Q3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHJ1ZSAmJiByZXBsYXlGYWlsZWRVbml0T2ZXb3JrV2l0aEludm9rZUd1YXJkZWRDYWxsYmFjaykge1xuICAgICAgICAgIGlmIChtYXlSZXBsYXkpIHtcbiAgICAgICAgICAgIHZhciBmYWlsZWRVbml0T2ZXb3JrID0gbmV4dFVuaXRPZldvcms7XG4gICAgICAgICAgICByZXBsYXlVbml0T2ZXb3JrKGZhaWxlZFVuaXRPZldvcmssIHRocm93blZhbHVlLCBpc1lpZWxkeSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogd2UgYWxyZWFkeSBrbm93IHRoaXMgaXNuJ3QgdHJ1ZSBpbiBzb21lIGNhc2VzLlxuICAgICAgICAvLyBBdCBsZWFzdCB0aGlzIHNob3dzIGEgbmljZXIgZXJyb3IgbWVzc2FnZSB1bnRpbCB3ZSBmaWd1cmUgb3V0IHRoZSBjYXVzZS5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjQ0OSNpc3N1ZWNvbW1lbnQtMzg2NzI3NDMxXG4gICAgICAgICEobmV4dFVuaXRPZldvcmsgIT09IG51bGwpID8gaW52YXJpYW50KGZhbHNlLCAnRmFpbGVkIHRvIHJlcGxheSByZW5kZXJpbmcgYWZ0ZXIgYW4gZXJyb3IuIFRoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUgd2l0aCBhIHJlcHJvZHVjaW5nIGNhc2UgdG8gaGVscCB1cyBmaW5kIGl0LicpIDogdm9pZCAwO1xuXG4gICAgICAgIHZhciBzb3VyY2VGaWJlciA9IG5leHRVbml0T2ZXb3JrO1xuICAgICAgICB2YXIgcmV0dXJuRmliZXIgPSBzb3VyY2VGaWJlci5yZXR1cm47XG4gICAgICAgIGlmIChyZXR1cm5GaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJvb3QuIFRoZSByb290IGNvdWxkIGNhcHR1cmUgaXRzIG93biBlcnJvcnMuIEhvd2V2ZXIsXG4gICAgICAgICAgLy8gd2UgZG9uJ3Qga25vdyBpZiBpdCBlcnJvcnMgYmVmb3JlIG9yIGFmdGVyIHdlIHB1c2hlZCB0aGUgaG9zdFxuICAgICAgICAgIC8vIGNvbnRleHQuIFRoaXMgaW5mb3JtYXRpb24gaXMgbmVlZGVkIHRvIGF2b2lkIGEgc3RhY2sgbWlzbWF0Y2guXG4gICAgICAgICAgLy8gQmVjYXVzZSB3ZSdyZSBub3Qgc3VyZSwgdHJlYXQgdGhpcyBhcyBhIGZhdGFsIGVycm9yLiBXZSBjb3VsZCB0cmFja1xuICAgICAgICAgIC8vIHdoaWNoIHBoYXNlIGl0IGZhaWxzIGluLCBidXQgZG9lc24ndCBzZWVtIHdvcnRoIGl0LiBBdCBsZWFzdFxuICAgICAgICAgIC8vIGZvciBub3cuXG4gICAgICAgICAgZGlkRmF0YWwgPSB0cnVlO1xuICAgICAgICAgIG9uVW5jYXVnaHRFcnJvcih0aHJvd25WYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3dFeGNlcHRpb24ocm9vdCwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCB0aHJvd25WYWx1ZSwgbmV4dFJlbmRlckV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgICBuZXh0VW5pdE9mV29yayA9IGNvbXBsZXRlVW5pdE9mV29yayhzb3VyY2VGaWJlcik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgYnJlYWs7XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIGlmIChlbmFibGVTY2hlZHVsZXJUcmFjaW5nKSB7XG4gICAgLy8gVHJhY2VkIHdvcmsgaXMgZG9uZSBmb3Igbm93OyByZXN0b3JlIHRoZSBwcmV2aW91cyBpbnRlcmFjdGlvbnMuXG4gICAgdHJhY2luZy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50ID0gcHJldkludGVyYWN0aW9ucztcbiAgfVxuXG4gIC8vIFdlJ3JlIGRvbmUgcGVyZm9ybWluZyB3b3JrLiBUaW1lIHRvIGNsZWFuIHVwLlxuICBpc1dvcmtpbmcgPSBmYWxzZTtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50ID0gcHJldmlvdXNEaXNwYXRjaGVyO1xuICByZXNldENvbnRleHREZXBlbmRlbmNlcygpO1xuICByZXNldEhvb2tzKCk7XG5cbiAgLy8gWWllbGQgYmFjayB0byBtYWluIHRocmVhZC5cbiAgaWYgKGRpZEZhdGFsKSB7XG4gICAgdmFyIF9kaWRDb21wbGV0ZVJvb3QgPSBmYWxzZTtcbiAgICBzdG9wV29ya0xvb3BUaW1lcihpbnRlcnJ1cHRlZEJ5LCBfZGlkQ29tcGxldGVSb290KTtcbiAgICBpbnRlcnJ1cHRlZEJ5ID0gbnVsbDtcbiAgICAvLyBUaGVyZSB3YXMgYSBmYXRhbCBlcnJvci5cbiAgICB7XG4gICAgICByZXNldFN0YWNrQWZ0ZXJGYXRhbEVycm9ySW5EZXYoKTtcbiAgICB9XG4gICAgLy8gYG5leHRSb290YCBwb2ludHMgdG8gdGhlIGluLXByb2dyZXNzIHJvb3QuIEEgbm9uLW51bGwgdmFsdWUgaW5kaWNhdGVzXG4gICAgLy8gdGhhdCB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGFuIGFzeW5jIHJlbmRlci4gU2V0IGl0IHRvIG51bGwgdG8gaW5kaWNhdGVcbiAgICAvLyB0aGVyZSdzIG5vIG1vcmUgd29yayB0byBiZSBkb25lIGluIHRoZSBjdXJyZW50IGJhdGNoLlxuICAgIG5leHRSb290ID0gbnVsbDtcbiAgICBvbkZhdGFsKHJvb3QpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChuZXh0VW5pdE9mV29yayAhPT0gbnVsbCkge1xuICAgIC8vIFRoZXJlJ3Mgc3RpbGwgcmVtYWluaW5nIGFzeW5jIHdvcmsgaW4gdGhpcyB0cmVlLCBidXQgd2UgcmFuIG91dCBvZiB0aW1lXG4gICAgLy8gaW4gdGhlIGN1cnJlbnQgZnJhbWUuIFlpZWxkIGJhY2sgdG8gdGhlIHJlbmRlcmVyLiBVbmxlc3Mgd2UncmVcbiAgICAvLyBpbnRlcnJ1cHRlZCBieSBhIGhpZ2hlciBwcmlvcml0eSB1cGRhdGUsIHdlJ2xsIGNvbnRpbnVlIGxhdGVyIGZyb20gd2hlcmVcbiAgICAvLyB3ZSBsZWZ0IG9mZi5cbiAgICB2YXIgX2RpZENvbXBsZXRlUm9vdDIgPSBmYWxzZTtcbiAgICBzdG9wV29ya0xvb3BUaW1lcihpbnRlcnJ1cHRlZEJ5LCBfZGlkQ29tcGxldGVSb290Mik7XG4gICAgaW50ZXJydXB0ZWRCeSA9IG51bGw7XG4gICAgb25ZaWVsZChyb290KTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBXZSBjb21wbGV0ZWQgdGhlIHdob2xlIHRyZWUuXG4gIHZhciBkaWRDb21wbGV0ZVJvb3QgPSB0cnVlO1xuICBzdG9wV29ya0xvb3BUaW1lcihpbnRlcnJ1cHRlZEJ5LCBkaWRDb21wbGV0ZVJvb3QpO1xuICB2YXIgcm9vdFdvcmtJblByb2dyZXNzID0gcm9vdC5jdXJyZW50LmFsdGVybmF0ZTtcbiAgIShyb290V29ya0luUHJvZ3Jlc3MgIT09IG51bGwpID8gaW52YXJpYW50KGZhbHNlLCAnRmluaXNoZWQgcm9vdCBzaG91bGQgaGF2ZSBhIHdvcmstaW4tcHJvZ3Jlc3MuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJykgOiB2b2lkIDA7XG5cbiAgLy8gYG5leHRSb290YCBwb2ludHMgdG8gdGhlIGluLXByb2dyZXNzIHJvb3QuIEEgbm9uLW51bGwgdmFsdWUgaW5kaWNhdGVzXG4gIC8vIHRoYXQgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhbiBhc3luYyByZW5kZXIuIFNldCBpdCB0byBudWxsIHRvIGluZGljYXRlXG4gIC8vIHRoZXJlJ3Mgbm8gbW9yZSB3b3JrIHRvIGJlIGRvbmUgaW4gdGhlIGN1cnJlbnQgYmF0Y2guXG4gIG5leHRSb290ID0gbnVsbDtcbiAgaW50ZXJydXB0ZWRCeSA9IG51bGw7XG5cbiAgaWYgKG5leHRSZW5kZXJEaWRFcnJvcikge1xuICAgIC8vIFRoZXJlIHdhcyBhbiBlcnJvclxuICAgIGlmIChoYXNMb3dlclByaW9yaXR5V29yayhyb290LCBleHBpcmF0aW9uVGltZSkpIHtcbiAgICAgIC8vIFRoZXJlJ3MgbG93ZXIgcHJpb3JpdHkgd29yay4gSWYgc28sIGl0IG1heSBoYXZlIHRoZSBlZmZlY3Qgb2YgZml4aW5nXG4gICAgICAvLyB0aGUgZXhjZXB0aW9uIHRoYXQgd2FzIGp1c3QgdGhyb3duLiBFeGl0IHdpdGhvdXQgY29tbWl0dGluZy4gVGhpcyBpc1xuICAgICAgLy8gc2ltaWxhciB0byBhIHN1c3BlbmQsIGJ1dCB3aXRob3V0IGEgdGltZW91dCBiZWNhdXNlIHdlJ3JlIG5vdCB3YWl0aW5nXG4gICAgICAvLyBmb3IgYSBwcm9taXNlIHRvIHJlc29sdmUuIFJlYWN0IHdpbGwgcmVzdGFydCBhdCB0aGUgbG93ZXJcbiAgICAgIC8vIHByaW9yaXR5IGxldmVsLlxuICAgICAgbWFya1N1c3BlbmRlZFByaW9yaXR5TGV2ZWwocm9vdCwgZXhwaXJhdGlvblRpbWUpO1xuICAgICAgdmFyIHN1c3BlbmRlZEV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gICAgICB2YXIgcm9vdEV4cGlyYXRpb25UaW1lID0gcm9vdC5leHBpcmF0aW9uVGltZTtcbiAgICAgIG9uU3VzcGVuZChyb290LCByb290V29ya0luUHJvZ3Jlc3MsIHN1c3BlbmRlZEV4cGlyYXRpb25UaW1lLCByb290RXhwaXJhdGlvblRpbWUsIC0xIC8vIEluZGljYXRlcyBubyB0aW1lb3V0XG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgLy8gVGhlcmUncyBubyBsb3dlciBwcmlvcml0eSB3b3JrLCBidXQgd2UncmUgcmVuZGVyaW5nIGFzeW5jaHJvbm91c2x5LlxuICAgIC8vIFN5bmNocm9ub3VzbHkgYXR0ZW1wdCB0byByZW5kZXIgdGhlIHNhbWUgbGV2ZWwgb25lIG1vcmUgdGltZS4gVGhpcyBpc1xuICAgIC8vIHNpbWlsYXIgdG8gYSBzdXNwZW5kLCBidXQgd2l0aG91dCBhIHRpbWVvdXQgYmVjYXVzZSB3ZSdyZSBub3Qgd2FpdGluZ1xuICAgIC8vIGZvciBhIHByb21pc2UgdG8gcmVzb2x2ZS5cbiAgICAhcm9vdC5kaWRFcnJvciAmJiBpc1lpZWxkeSkge1xuICAgICAgcm9vdC5kaWRFcnJvciA9IHRydWU7XG4gICAgICB2YXIgX3N1c3BlbmRlZEV4cGlyYXRpb25UaW1lID0gcm9vdC5uZXh0RXhwaXJhdGlvblRpbWVUb1dvcmtPbiA9IGV4cGlyYXRpb25UaW1lO1xuICAgICAgdmFyIF9yb290RXhwaXJhdGlvblRpbWUgPSByb290LmV4cGlyYXRpb25UaW1lID0gU3luYztcbiAgICAgIG9uU3VzcGVuZChyb290LCByb290V29ya0luUHJvZ3Jlc3MsIF9zdXNwZW5kZWRFeHBpcmF0aW9uVGltZSwgX3Jvb3RFeHBpcmF0aW9uVGltZSwgLTEgLy8gSW5kaWNhdGVzIG5vIHRpbWVvdXRcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzWWllbGR5ICYmIG5leHRMYXRlc3RBYnNvbHV0ZVRpbWVvdXRNcyAhPT0gLTEpIHtcbiAgICAvLyBUaGUgdHJlZSB3YXMgc3VzcGVuZGVkLlxuICAgIHZhciBfc3VzcGVuZGVkRXhwaXJhdGlvblRpbWUyID0gZXhwaXJhdGlvblRpbWU7XG4gICAgbWFya1N1c3BlbmRlZFByaW9yaXR5TGV2ZWwocm9vdCwgX3N1c3BlbmRlZEV4cGlyYXRpb25UaW1lMik7XG5cbiAgICAvLyBGaW5kIHRoZSBlYXJsaWVzdCB1bmNvbW1pdHRlZCBleHBpcmF0aW9uIHRpbWUgaW4gdGhlIHRyZWUsIGluY2x1ZGluZ1xuICAgIC8vIHdvcmsgdGhhdCBpcyBzdXNwZW5kZWQuIFRoZSB0aW1lb3V0IHRocmVzaG9sZCBjYW5ub3QgYmUgbG9uZ2VyIHRoYW5cbiAgICAvLyB0aGUgb3ZlcmFsbCBleHBpcmF0aW9uLlxuICAgIHZhciBlYXJsaWVzdEV4cGlyYXRpb25UaW1lID0gZmluZEVhcmxpZXN0T3V0c3RhbmRpbmdQcmlvcml0eUxldmVsKHJvb3QsIGV4cGlyYXRpb25UaW1lKTtcbiAgICB2YXIgZWFybGllc3RFeHBpcmF0aW9uVGltZU1zID0gZXhwaXJhdGlvblRpbWVUb01zKGVhcmxpZXN0RXhwaXJhdGlvblRpbWUpO1xuICAgIGlmIChlYXJsaWVzdEV4cGlyYXRpb25UaW1lTXMgPCBuZXh0TGF0ZXN0QWJzb2x1dGVUaW1lb3V0TXMpIHtcbiAgICAgIG5leHRMYXRlc3RBYnNvbHV0ZVRpbWVvdXRNcyA9IGVhcmxpZXN0RXhwaXJhdGlvblRpbWVNcztcbiAgICB9XG5cbiAgICAvLyBTdWJ0cmFjdCB0aGUgY3VycmVudCB0aW1lIGZyb20gdGhlIGFic29sdXRlIHRpbWVvdXQgdG8gZ2V0IHRoZSBudW1iZXJcbiAgICAvLyBvZiBtaWxsaXNlY29uZHMgdW50aWwgdGhlIHRpbWVvdXQuIEluIG90aGVyIHdvcmRzLCBjb252ZXJ0IGFuIGFic29sdXRlXG4gICAgLy8gdGltZXN0YW1wIHRvIGEgcmVsYXRpdmUgdGltZS4gVGhpcyBpcyB0aGUgdmFsdWUgdGhhdCBpcyBwYXNzZWRcbiAgICAvLyB0byBgc2V0VGltZW91dGAuXG4gICAgdmFyIGN1cnJlbnRUaW1lTXMgPSBleHBpcmF0aW9uVGltZVRvTXMocmVxdWVzdEN1cnJlbnRUaW1lKCkpO1xuICAgIHZhciBtc1VudGlsVGltZW91dCA9IG5leHRMYXRlc3RBYnNvbHV0ZVRpbWVvdXRNcyAtIGN1cnJlbnRUaW1lTXM7XG4gICAgbXNVbnRpbFRpbWVvdXQgPSBtc1VudGlsVGltZW91dCA8IDAgPyAwIDogbXNVbnRpbFRpbWVvdXQ7XG5cbiAgICAvLyBUT0RPOiBBY2NvdW50IGZvciB0aGUgSnVzdCBOb3RpY2VhYmxlIERpZmZlcmVuY2VcblxuICAgIHZhciBfcm9vdEV4cGlyYXRpb25UaW1lMiA9IHJvb3QuZXhwaXJhdGlvblRpbWU7XG4gICAgb25TdXNwZW5kKHJvb3QsIHJvb3RXb3JrSW5Qcm9ncmVzcywgX3N1c3BlbmRlZEV4cGlyYXRpb25UaW1lMiwgX3Jvb3RFeHBpcmF0aW9uVGltZTIsIG1zVW50aWxUaW1lb3V0KTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBSZWFkeSB0byBjb21taXQuXG4gIG9uQ29tcGxldGUocm9vdCwgcm9vdFdvcmtJblByb2dyZXNzLCBleHBpcmF0aW9uVGltZSk7XG59XG5cbmZ1bmN0aW9uIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKHNvdXJjZUZpYmVyLCB2YWx1ZSkge1xuICB2YXIgZXhwaXJhdGlvblRpbWUgPSBTeW5jO1xuICB2YXIgZmliZXIgPSBzb3VyY2VGaWJlci5yZXR1cm47XG4gIHdoaWxlIChmaWJlciAhPT0gbnVsbCkge1xuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB2YXIgY3RvciA9IGZpYmVyLnR5cGU7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicgJiYgIWlzQWxyZWFkeUZhaWxlZExlZ2FjeUVycm9yQm91bmRhcnkoaW5zdGFuY2UpKSB7XG4gICAgICAgICAgdmFyIGVycm9ySW5mbyA9IGNyZWF0ZUNhcHR1cmVkVmFsdWUodmFsdWUsIHNvdXJjZUZpYmVyKTtcbiAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZShmaWJlciwgZXJyb3JJbmZvLCBleHBpcmF0aW9uVGltZSk7XG4gICAgICAgICAgZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlKTtcbiAgICAgICAgICBzY2hlZHVsZVdvcmsoZmliZXIsIGV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9lcnJvckluZm8gPSBjcmVhdGVDYXB0dXJlZFZhbHVlKHZhbHVlLCBzb3VyY2VGaWJlcik7XG4gICAgICAgICAgdmFyIF91cGRhdGUgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUoZmliZXIsIF9lcnJvckluZm8sIGV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgICBlbnF1ZXVlVXBkYXRlKGZpYmVyLCBfdXBkYXRlKTtcbiAgICAgICAgICBzY2hlZHVsZVdvcmsoZmliZXIsIGV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmliZXIgPSBmaWJlci5yZXR1cm47XG4gIH1cblxuICBpZiAoc291cmNlRmliZXIudGFnID09PSBIb3N0Um9vdCkge1xuICAgIC8vIEVycm9yIHdhcyB0aHJvd24gYXQgdGhlIHJvb3QuIFRoZXJlIGlzIG5vIHBhcmVudCwgc28gdGhlIHJvb3RcbiAgICAvLyBpdHNlbGYgc2hvdWxkIGNhcHR1cmUgaXQuXG4gICAgdmFyIHJvb3RGaWJlciA9IHNvdXJjZUZpYmVyO1xuICAgIHZhciBfZXJyb3JJbmZvMiA9IGNyZWF0ZUNhcHR1cmVkVmFsdWUodmFsdWUsIHJvb3RGaWJlcik7XG4gICAgdmFyIF91cGRhdGUyID0gY3JlYXRlUm9vdEVycm9yVXBkYXRlKHJvb3RGaWJlciwgX2Vycm9ySW5mbzIsIGV4cGlyYXRpb25UaW1lKTtcbiAgICBlbnF1ZXVlVXBkYXRlKHJvb3RGaWJlciwgX3VwZGF0ZTIpO1xuICAgIHNjaGVkdWxlV29yayhyb290RmliZXIsIGV4cGlyYXRpb25UaW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wdXRlVGhyZWFkSUQoZXhwaXJhdGlvblRpbWUsIGludGVyYWN0aW9uVGhyZWFkSUQpIHtcbiAgLy8gSW50ZXJhY3Rpb24gdGhyZWFkcyBhcmUgdW5pcXVlIHBlciByb290IGFuZCBleHBpcmF0aW9uIHRpbWUuXG4gIHJldHVybiBleHBpcmF0aW9uVGltZSAqIDEwMDAgKyBpbnRlcmFjdGlvblRocmVhZElEO1xufVxuXG4vLyBDcmVhdGVzIGEgdW5pcXVlIGFzeW5jIGV4cGlyYXRpb24gdGltZS5cbmZ1bmN0aW9uIGNvbXB1dGVVbmlxdWVBc3luY0V4cGlyYXRpb24oKSB7XG4gIHZhciBjdXJyZW50VGltZSA9IHJlcXVlc3RDdXJyZW50VGltZSgpO1xuICB2YXIgcmVzdWx0ID0gY29tcHV0ZUFzeW5jRXhwaXJhdGlvbihjdXJyZW50VGltZSk7XG4gIGlmIChyZXN1bHQgPj0gbGFzdFVuaXF1ZUFzeW5jRXhwaXJhdGlvbikge1xuICAgIC8vIFNpbmNlIHdlIGFzc3VtZSB0aGUgY3VycmVudCB0aW1lIG1vbm90b25pY2FsbHkgaW5jcmVhc2VzLCB3ZSBvbmx5IGhpdFxuICAgIC8vIHRoaXMgYnJhbmNoIHdoZW4gY29tcHV0ZVVuaXF1ZUFzeW5jRXhwaXJhdGlvbiBpcyBmaXJlZCBtdWx0aXBsZSB0aW1lc1xuICAgIC8vIHdpdGhpbiBhIDIwMG1zIHdpbmRvdyAob3Igd2hhdGV2ZXIgdGhlIGFzeW5jIGJ1Y2tldCBzaXplIGlzKS5cbiAgICByZXN1bHQgPSBsYXN0VW5pcXVlQXN5bmNFeHBpcmF0aW9uIC0gMTtcbiAgfVxuICBsYXN0VW5pcXVlQXN5bmNFeHBpcmF0aW9uID0gcmVzdWx0O1xuICByZXR1cm4gbGFzdFVuaXF1ZUFzeW5jRXhwaXJhdGlvbjtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUV4cGlyYXRpb25Gb3JGaWJlcihjdXJyZW50VGltZSwgZmliZXIpIHtcbiAgdmFyIHByaW9yaXR5TGV2ZWwgPSBzY2hlZHVsZXIudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKTtcblxuICB2YXIgZXhwaXJhdGlvblRpbWUgPSB2b2lkIDA7XG4gIGlmICgoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgLy8gT3V0c2lkZSBvZiBjb25jdXJyZW50IG1vZGUsIHVwZGF0ZXMgYXJlIGFsd2F5cyBzeW5jaHJvbm91cy5cbiAgICBleHBpcmF0aW9uVGltZSA9IFN5bmM7XG4gIH0gZWxzZSBpZiAoaXNXb3JraW5nICYmICFpc0NvbW1pdHRpbmckMSkge1xuICAgIC8vIER1cmluZyByZW5kZXIgcGhhc2UsIHVwZGF0ZXMgZXhwaXJlIGR1cmluZyBhcyB0aGUgY3VycmVudCByZW5kZXIuXG4gICAgZXhwaXJhdGlvblRpbWUgPSBuZXh0UmVuZGVyRXhwaXJhdGlvblRpbWU7XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoIChwcmlvcml0eUxldmVsKSB7XG4gICAgICBjYXNlIHNjaGVkdWxlci51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eTpcbiAgICAgICAgZXhwaXJhdGlvblRpbWUgPSBTeW5jO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugc2NoZWR1bGVyLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgICAgICBleHBpcmF0aW9uVGltZSA9IGNvbXB1dGVJbnRlcmFjdGl2ZUV4cGlyYXRpb24oY3VycmVudFRpbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugc2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5OlxuICAgICAgICAvLyBUaGlzIGlzIGEgbm9ybWFsLCBjb25jdXJyZW50IHVwZGF0ZVxuICAgICAgICBleHBpcmF0aW9uVGltZSA9IGNvbXB1dGVBc3luY0V4cGlyYXRpb24oY3VycmVudFRpbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugc2NoZWR1bGVyLnVuc3RhYmxlX0xvd1ByaW9yaXR5OlxuICAgICAgY2FzZSBzY2hlZHVsZXIudW5zdGFibGVfSWRsZVByaW9yaXR5OlxuICAgICAgICBleHBpcmF0aW9uVGltZSA9IE5ldmVyO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGludmFyaWFudChmYWxzZSwgJ1Vua25vd24gcHJpb3JpdHkgbGV2ZWwuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiByZW5kZXJpbmcgYSB0cmVlLCBkbyBub3QgdXBkYXRlIGF0IHRoZSBzYW1lXG4gICAgLy8gZXhwaXJhdGlvbiB0aW1lIHRoYXQgaXMgYWxyZWFkeSByZW5kZXJpbmcuXG4gICAgaWYgKG5leHRSb290ICE9PSBudWxsICYmIGV4cGlyYXRpb25UaW1lID09PSBuZXh0UmVuZGVyRXhwaXJhdGlvblRpbWUpIHtcbiAgICAgIGV4cGlyYXRpb25UaW1lIC09IDE7XG4gICAgfVxuICB9XG5cbiAgLy8gS2VlcCB0cmFjayBvZiB0aGUgbG93ZXN0IHBlbmRpbmcgaW50ZXJhY3RpdmUgZXhwaXJhdGlvbiB0aW1lLiBUaGlzXG4gIC8vIGFsbG93cyB1cyB0byBzeW5jaHJvbm91c2x5IGZsdXNoIGFsbCBpbnRlcmFjdGl2ZSB1cGRhdGVzXG4gIC8vIHdoZW4gbmVlZGVkLlxuICAvLyBUT0RPOiBNb3ZlIHRoaXMgdG8gcmVuZGVyZXI/XG4gIGlmIChwcmlvcml0eUxldmVsID09PSBzY2hlZHVsZXIudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHkgJiYgKGxvd2VzdFByaW9yaXR5UGVuZGluZ0ludGVyYWN0aXZlRXhwaXJhdGlvblRpbWUgPT09IE5vV29yayB8fCBleHBpcmF0aW9uVGltZSA8IGxvd2VzdFByaW9yaXR5UGVuZGluZ0ludGVyYWN0aXZlRXhwaXJhdGlvblRpbWUpKSB7XG4gICAgbG93ZXN0UHJpb3JpdHlQZW5kaW5nSW50ZXJhY3RpdmVFeHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lO1xuICB9XG5cbiAgcmV0dXJuIGV4cGlyYXRpb25UaW1lO1xufVxuXG5mdW5jdGlvbiByZW5kZXJEaWRTdXNwZW5kKHJvb3QsIGFic29sdXRlVGltZW91dE1zLCBzdXNwZW5kZWRUaW1lKSB7XG4gIC8vIFNjaGVkdWxlIHRoZSB0aW1lb3V0LlxuICBpZiAoYWJzb2x1dGVUaW1lb3V0TXMgPj0gMCAmJiBuZXh0TGF0ZXN0QWJzb2x1dGVUaW1lb3V0TXMgPCBhYnNvbHV0ZVRpbWVvdXRNcykge1xuICAgIG5leHRMYXRlc3RBYnNvbHV0ZVRpbWVvdXRNcyA9IGFic29sdXRlVGltZW91dE1zO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlckRpZEVycm9yKCkge1xuICBuZXh0UmVuZGVyRGlkRXJyb3IgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBwaW5nU3VzcGVuZGVkUm9vdChyb290LCB0aGVuYWJsZSwgcGluZ1RpbWUpIHtcbiAgLy8gQSBwcm9taXNlIHRoYXQgcHJldmlvdXNseSBzdXNwZW5kZWQgUmVhY3QgZnJvbSBjb21taXR0aW5nIGhhcyByZXNvbHZlZC5cbiAgLy8gSWYgUmVhY3QgaXMgc3RpbGwgc3VzcGVuZGVkLCB0cnkgYWdhaW4gYXQgdGhlIHByZXZpb3VzIGxldmVsIChwaW5nVGltZSkuXG5cbiAgdmFyIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlO1xuICBpZiAocGluZ0NhY2hlICE9PSBudWxsKSB7XG4gICAgLy8gVGhlIHRoZW5hYmxlIHJlc29sdmVkLCBzbyB3ZSBubyBsb25nZXIgbmVlZCB0byBtZW1vaXplLCBiZWNhdXNlIGl0IHdpbGxcbiAgICAvLyBuZXZlciBiZSB0aHJvd24gYWdhaW4uXG4gICAgcGluZ0NhY2hlLmRlbGV0ZSh0aGVuYWJsZSk7XG4gIH1cblxuICBpZiAobmV4dFJvb3QgIT09IG51bGwgJiYgbmV4dFJlbmRlckV4cGlyYXRpb25UaW1lID09PSBwaW5nVGltZSkge1xuICAgIC8vIFJlY2VpdmVkIGEgcGluZyBhdCB0aGUgc2FtZSBwcmlvcml0eSBsZXZlbCBhdCB3aGljaCB3ZSdyZSBjdXJyZW50bHlcbiAgICAvLyByZW5kZXJpbmcuIFJlc3RhcnQgZnJvbSB0aGUgcm9vdC5cbiAgICBuZXh0Um9vdCA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ29uZmlybSB0aGF0IHRoZSByb290IGlzIHN0aWxsIHN1c3BlbmRlZCBhdCB0aGlzIGxldmVsLiBPdGhlcndpc2UgZXhpdC5cbiAgICBpZiAoaXNQcmlvcml0eUxldmVsU3VzcGVuZGVkKHJvb3QsIHBpbmdUaW1lKSkge1xuICAgICAgLy8gUGluZyBhdCB0aGUgb3JpZ2luYWwgbGV2ZWxcbiAgICAgIG1hcmtQaW5nZWRQcmlvcml0eUxldmVsKHJvb3QsIHBpbmdUaW1lKTtcbiAgICAgIHZhciByb290RXhwaXJhdGlvblRpbWUgPSByb290LmV4cGlyYXRpb25UaW1lO1xuICAgICAgaWYgKHJvb3RFeHBpcmF0aW9uVGltZSAhPT0gTm9Xb3JrKSB7XG4gICAgICAgIHJlcXVlc3RXb3JrKHJvb3QsIHJvb3RFeHBpcmF0aW9uVGltZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCB0aGVuYWJsZSkge1xuICAvLyBUaGUgYm91bmRhcnkgZmliZXIgKGEgU3VzcGVuc2UgY29tcG9uZW50KSBwcmV2aW91c2x5IHRpbWVkIG91dCBhbmQgd2FzXG4gIC8vIHJlbmRlcmVkIGluIGl0cyBmYWxsYmFjayBzdGF0ZS4gT25lIG9mIHRoZSBwcm9taXNlcyB0aGF0IHN1c3BlbmRlZCBpdCBoYXNcbiAgLy8gcmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGF0IGxlYXN0IHBhcnQgb2YgdGhlIHRyZWUgd2FzIGxpa2VseSB1bmJsb2NrZWQuIFRyeVxuICB2YXIgcmV0cnlDYWNoZSA9IHZvaWQgMDtcbiAgaWYgKGVuYWJsZVN1c3BlbnNlU2VydmVyUmVuZGVyZXIpIHtcbiAgICBzd2l0Y2ggKGJvdW5kYXJ5RmliZXIudGFnKSB7XG4gICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICByZXRyeUNhY2hlID0gYm91bmRhcnlGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBEZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICAgIHJldHJ5Q2FjaGUgPSBib3VuZGFyeUZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaW52YXJpYW50KGZhbHNlLCAnUGluZ2VkIHVua25vd24gc3VzcGVuc2UgYm91bmRhcnkgdHlwZS4gVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0cnlDYWNoZSA9IGJvdW5kYXJ5RmliZXIuc3RhdGVOb2RlO1xuICB9XG4gIGlmIChyZXRyeUNhY2hlICE9PSBudWxsKSB7XG4gICAgLy8gVGhlIHRoZW5hYmxlIHJlc29sdmVkLCBzbyB3ZSBubyBsb25nZXIgbmVlZCB0byBtZW1vaXplLCBiZWNhdXNlIGl0IHdpbGxcbiAgICAvLyBuZXZlciBiZSB0aHJvd24gYWdhaW4uXG4gICAgcmV0cnlDYWNoZS5kZWxldGUodGhlbmFibGUpO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRUaW1lID0gcmVxdWVzdEN1cnJlbnRUaW1lKCk7XG4gIHZhciByZXRyeVRpbWUgPSBjb21wdXRlRXhwaXJhdGlvbkZvckZpYmVyKGN1cnJlbnRUaW1lLCBib3VuZGFyeUZpYmVyKTtcbiAgdmFyIHJvb3QgPSBzY2hlZHVsZVdvcmtUb1Jvb3QoYm91bmRhcnlGaWJlciwgcmV0cnlUaW1lKTtcbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBtYXJrUGVuZGluZ1ByaW9yaXR5TGV2ZWwocm9vdCwgcmV0cnlUaW1lKTtcbiAgICB2YXIgcm9vdEV4cGlyYXRpb25UaW1lID0gcm9vdC5leHBpcmF0aW9uVGltZTtcbiAgICBpZiAocm9vdEV4cGlyYXRpb25UaW1lICE9PSBOb1dvcmspIHtcbiAgICAgIHJlcXVlc3RXb3JrKHJvb3QsIHJvb3RFeHBpcmF0aW9uVGltZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlV29ya1RvUm9vdChmaWJlciwgZXhwaXJhdGlvblRpbWUpIHtcbiAgcmVjb3JkU2NoZWR1bGVVcGRhdGUoKTtcblxuICB7XG4gICAgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIHdhcm5BYm91dEludmFsaWRVcGRhdGVzKGluc3RhbmNlKTtcbiAgICB9XG4gIH1cblxuICAvLyBVcGRhdGUgdGhlIHNvdXJjZSBmaWJlcidzIGV4cGlyYXRpb24gdGltZVxuICBpZiAoZmliZXIuZXhwaXJhdGlvblRpbWUgPCBleHBpcmF0aW9uVGltZSkge1xuICAgIGZpYmVyLmV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gIH1cbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUuZXhwaXJhdGlvblRpbWUgPCBleHBpcmF0aW9uVGltZSkge1xuICAgIGFsdGVybmF0ZS5leHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lO1xuICB9XG4gIC8vIFdhbGsgdGhlIHBhcmVudCBwYXRoIHRvIHRoZSByb290IGFuZCB1cGRhdGUgdGhlIGNoaWxkIGV4cGlyYXRpb24gdGltZS5cbiAgdmFyIG5vZGUgPSBmaWJlci5yZXR1cm47XG4gIHZhciByb290ID0gbnVsbDtcbiAgaWYgKG5vZGUgPT09IG51bGwgJiYgZmliZXIudGFnID09PSBIb3N0Um9vdCkge1xuICAgIHJvb3QgPSBmaWJlci5zdGF0ZU5vZGU7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgIGFsdGVybmF0ZSA9IG5vZGUuYWx0ZXJuYXRlO1xuICAgICAgaWYgKG5vZGUuY2hpbGRFeHBpcmF0aW9uVGltZSA8IGV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgIG5vZGUuY2hpbGRFeHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lO1xuICAgICAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZS5jaGlsZEV4cGlyYXRpb25UaW1lIDwgZXhwaXJhdGlvblRpbWUpIHtcbiAgICAgICAgICBhbHRlcm5hdGUuY2hpbGRFeHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUuY2hpbGRFeHBpcmF0aW9uVGltZSA8IGV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgIGFsdGVybmF0ZS5jaGlsZEV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gICAgICB9XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgJiYgbm9kZS50YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIHJvb3QgPSBub2RlLnN0YXRlTm9kZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZVNjaGVkdWxlclRyYWNpbmcpIHtcbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgdmFyIGludGVyYWN0aW9ucyA9IHRyYWNpbmcuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudDtcbiAgICAgIGlmIChpbnRlcmFjdGlvbnMuc2l6ZSA+IDApIHtcbiAgICAgICAgdmFyIHBlbmRpbmdJbnRlcmFjdGlvbk1hcCA9IHJvb3QucGVuZGluZ0ludGVyYWN0aW9uTWFwO1xuICAgICAgICB2YXIgcGVuZGluZ0ludGVyYWN0aW9ucyA9IHBlbmRpbmdJbnRlcmFjdGlvbk1hcC5nZXQoZXhwaXJhdGlvblRpbWUpO1xuICAgICAgICBpZiAocGVuZGluZ0ludGVyYWN0aW9ucyAhPSBudWxsKSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGludGVyYWN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoIXBlbmRpbmdJbnRlcmFjdGlvbnMuaGFzKGludGVyYWN0aW9uKSkge1xuICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHBlbmRpbmcgYXN5bmMgd29yayBjb3VudCBmb3IgcHJldmlvdXNseSB1bnNjaGVkdWxlZCBpbnRlcmFjdGlvbi5cbiAgICAgICAgICAgICAgaW50ZXJhY3Rpb24uX19jb3VudCsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwZW5kaW5nSW50ZXJhY3Rpb25zLmFkZChpbnRlcmFjdGlvbik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVuZGluZ0ludGVyYWN0aW9uTWFwLnNldChleHBpcmF0aW9uVGltZSwgbmV3IFNldChpbnRlcmFjdGlvbnMpKTtcblxuICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcGVuZGluZyBhc3luYyB3b3JrIGNvdW50IGZvciB0aGUgY3VycmVudCBpbnRlcmFjdGlvbnMuXG4gICAgICAgICAgaW50ZXJhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGludGVyYWN0aW9uKSB7XG4gICAgICAgICAgICBpbnRlcmFjdGlvbi5fX2NvdW50Kys7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3Vic2NyaWJlciA9IHRyYWNpbmcuX19zdWJzY3JpYmVyUmVmLmN1cnJlbnQ7XG4gICAgICAgIGlmIChzdWJzY3JpYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIHRocmVhZElEID0gY29tcHV0ZVRocmVhZElEKGV4cGlyYXRpb25UaW1lLCByb290LmludGVyYWN0aW9uVGhyZWFkSUQpO1xuICAgICAgICAgIHN1YnNjcmliZXIub25Xb3JrU2NoZWR1bGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByb290O1xufVxuXG5mdW5jdGlvbiB3YXJuSWZOb3RDdXJyZW50bHlCYXRjaGluZ0luRGV2KGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaXNSZW5kZXJpbmcgPT09IGZhbHNlICYmIGlzQmF0Y2hpbmdVcGRhdGVzID09PSBmYWxzZSkge1xuICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnQW4gdXBkYXRlIHRvICVzIGluc2lkZSBhIHRlc3Qgd2FzIG5vdCB3cmFwcGVkIGluIGFjdCguLi4pLlxcblxcbicgKyAnV2hlbiB0ZXN0aW5nLCBjb2RlIHRoYXQgY2F1c2VzIFJlYWN0IHN0YXRlIHVwZGF0ZXMgc2hvdWxkIGJlIHdyYXBwZWQgaW50byBhY3QoLi4uKTpcXG5cXG4nICsgJ2FjdCgoKSA9PiB7XFxuJyArICcgIC8qIGZpcmUgZXZlbnRzIHRoYXQgdXBkYXRlIHN0YXRlICovXFxuJyArICd9KTtcXG4nICsgJy8qIGFzc2VydCBvbiB0aGUgb3V0cHV0ICovXFxuXFxuJyArIFwiVGhpcyBlbnN1cmVzIHRoYXQgeW91J3JlIHRlc3RpbmcgdGhlIGJlaGF2aW9yIHRoZSB1c2VyIHdvdWxkIHNlZSBpbiB0aGUgYnJvd3Nlci5cIiArICcgTGVhcm4gbW9yZSBhdCBodHRwczovL2ZiLm1lL3JlYWN0LXdyYXAtdGVzdHMtd2l0aC1hY3QnICsgJyVzJywgZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSwgZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKGZpYmVyKSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlV29yayhmaWJlciwgZXhwaXJhdGlvblRpbWUpIHtcbiAgdmFyIHJvb3QgPSBzY2hlZHVsZVdvcmtUb1Jvb3QoZmliZXIsIGV4cGlyYXRpb25UaW1lKTtcbiAgaWYgKHJvb3QgPT09IG51bGwpIHtcbiAgICB7XG4gICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgIHdhcm5BYm91dFVwZGF0ZU9uVW5tb3VudGVkKGZpYmVyLCB0cnVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAgICB3YXJuQWJvdXRVcGRhdGVPblVubW91bnRlZChmaWJlciwgZmFsc2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWlzV29ya2luZyAmJiBuZXh0UmVuZGVyRXhwaXJhdGlvblRpbWUgIT09IE5vV29yayAmJiBleHBpcmF0aW9uVGltZSA+IG5leHRSZW5kZXJFeHBpcmF0aW9uVGltZSkge1xuICAgIC8vIFRoaXMgaXMgYW4gaW50ZXJydXB0aW9uLiAoVXNlZCBmb3IgcGVyZm9ybWFuY2UgdHJhY2tpbmcuKVxuICAgIGludGVycnVwdGVkQnkgPSBmaWJlcjtcbiAgICByZXNldFN0YWNrKCk7XG4gIH1cbiAgbWFya1BlbmRpbmdQcmlvcml0eUxldmVsKHJvb3QsIGV4cGlyYXRpb25UaW1lKTtcbiAgaWYgKFxuICAvLyBJZiB3ZSdyZSBpbiB0aGUgcmVuZGVyIHBoYXNlLCB3ZSBkb24ndCBuZWVkIHRvIHNjaGVkdWxlIHRoaXMgcm9vdFxuICAvLyBmb3IgYW4gdXBkYXRlLCBiZWNhdXNlIHdlJ2xsIGRvIGl0IGJlZm9yZSB3ZSBleGl0Li4uXG4gICFpc1dvcmtpbmcgfHwgaXNDb21taXR0aW5nJDEgfHxcbiAgLy8gLi4udW5sZXNzIHRoaXMgaXMgYSBkaWZmZXJlbnQgcm9vdCB0aGFuIHRoZSBvbmUgd2UncmUgcmVuZGVyaW5nLlxuICBuZXh0Um9vdCAhPT0gcm9vdCkge1xuICAgIHZhciByb290RXhwaXJhdGlvblRpbWUgPSByb290LmV4cGlyYXRpb25UaW1lO1xuICAgIHJlcXVlc3RXb3JrKHJvb3QsIHJvb3RFeHBpcmF0aW9uVGltZSk7XG4gIH1cbiAgaWYgKG5lc3RlZFVwZGF0ZUNvdW50ID4gTkVTVEVEX1VQREFURV9MSU1JVCkge1xuICAgIC8vIFJlc2V0IHRoaXMgYmFjayB0byB6ZXJvIHNvIHN1YnNlcXVlbnQgdXBkYXRlcyBkb24ndCB0aHJvdy5cbiAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gICAgaW52YXJpYW50KGZhbHNlLCAnTWF4aW11bSB1cGRhdGUgZGVwdGggZXhjZWVkZWQuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgY29tcG9uZW50IHJlcGVhdGVkbHkgY2FsbHMgc2V0U3RhdGUgaW5zaWRlIGNvbXBvbmVudFdpbGxVcGRhdGUgb3IgY29tcG9uZW50RGlkVXBkYXRlLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiBuZXN0ZWQgdXBkYXRlcyB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN5bmNVcGRhdGVzKGZuLCBhLCBiLCBjLCBkKSB7XG4gIHJldHVybiBzY2hlZHVsZXIudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5KHNjaGVkdWxlci51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eSwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmbihhLCBiLCBjLCBkKTtcbiAgfSk7XG59XG5cbi8vIFRPRE86IEV2ZXJ5dGhpbmcgYmVsb3cgdGhpcyBpcyB3cml0dGVuIGFzIGlmIGl0IGhhcyBiZWVuIGxpZnRlZCB0byB0aGVcbi8vIHJlbmRlcmVycy4gSSdsbCBkbyB0aGlzIGluIGEgZm9sbG93LXVwLlxuXG4vLyBMaW5rZWQtbGlzdCBvZiByb290c1xudmFyIGZpcnN0U2NoZWR1bGVkUm9vdCA9IG51bGw7XG52YXIgbGFzdFNjaGVkdWxlZFJvb3QgPSBudWxsO1xuXG52YXIgY2FsbGJhY2tFeHBpcmF0aW9uVGltZSA9IE5vV29yaztcbnZhciBjYWxsYmFja0lEID0gdm9pZCAwO1xudmFyIGlzUmVuZGVyaW5nID0gZmFsc2U7XG52YXIgbmV4dEZsdXNoZWRSb290ID0gbnVsbDtcbnZhciBuZXh0Rmx1c2hlZEV4cGlyYXRpb25UaW1lID0gTm9Xb3JrO1xudmFyIGxvd2VzdFByaW9yaXR5UGVuZGluZ0ludGVyYWN0aXZlRXhwaXJhdGlvblRpbWUgPSBOb1dvcms7XG52YXIgaGFzVW5oYW5kbGVkRXJyb3IgPSBmYWxzZTtcbnZhciB1bmhhbmRsZWRFcnJvciA9IG51bGw7XG5cbnZhciBpc0JhdGNoaW5nVXBkYXRlcyA9IGZhbHNlO1xudmFyIGlzVW5iYXRjaGluZ1VwZGF0ZXMgPSBmYWxzZTtcblxudmFyIGNvbXBsZXRlZEJhdGNoZXMgPSBudWxsO1xuXG52YXIgb3JpZ2luYWxTdGFydFRpbWVNcyA9IHNjaGVkdWxlci51bnN0YWJsZV9ub3coKTtcbnZhciBjdXJyZW50UmVuZGVyZXJUaW1lID0gbXNUb0V4cGlyYXRpb25UaW1lKG9yaWdpbmFsU3RhcnRUaW1lTXMpO1xudmFyIGN1cnJlbnRTY2hlZHVsZXJUaW1lID0gY3VycmVudFJlbmRlcmVyVGltZTtcblxuLy8gVXNlIHRoZXNlIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcCBvZiBuZXN0ZWQgdXBkYXRlc1xudmFyIE5FU1RFRF9VUERBVEVfTElNSVQgPSA1MDtcbnZhciBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG52YXIgbGFzdENvbW1pdHRlZFJvb3REdXJpbmdUaGlzQmF0Y2ggPSBudWxsO1xuXG5mdW5jdGlvbiByZWNvbXB1dGVDdXJyZW50UmVuZGVyZXJUaW1lKCkge1xuICB2YXIgY3VycmVudFRpbWVNcyA9IHNjaGVkdWxlci51bnN0YWJsZV9ub3coKSAtIG9yaWdpbmFsU3RhcnRUaW1lTXM7XG4gIGN1cnJlbnRSZW5kZXJlclRpbWUgPSBtc1RvRXhwaXJhdGlvblRpbWUoY3VycmVudFRpbWVNcyk7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlQ2FsbGJhY2tXaXRoRXhwaXJhdGlvblRpbWUocm9vdCwgZXhwaXJhdGlvblRpbWUpIHtcbiAgaWYgKGNhbGxiYWNrRXhwaXJhdGlvblRpbWUgIT09IE5vV29yaykge1xuICAgIC8vIEEgY2FsbGJhY2sgaXMgYWxyZWFkeSBzY2hlZHVsZWQuIENoZWNrIGl0cyBleHBpcmF0aW9uIHRpbWUgKHRpbWVvdXQpLlxuICAgIGlmIChleHBpcmF0aW9uVGltZSA8IGNhbGxiYWNrRXhwaXJhdGlvblRpbWUpIHtcbiAgICAgIC8vIEV4aXN0aW5nIGNhbGxiYWNrIGhhcyBzdWZmaWNpZW50IHRpbWVvdXQuIEV4aXQuXG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjYWxsYmFja0lEICE9PSBudWxsKSB7XG4gICAgICAgIC8vIEV4aXN0aW5nIGNhbGxiYWNrIGhhcyBpbnN1ZmZpY2llbnQgdGltZW91dC4gQ2FuY2VsIGFuZCBzY2hlZHVsZSBhXG4gICAgICAgIC8vIG5ldyBvbmUuXG4gICAgICAgIHNjaGVkdWxlci51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayhjYWxsYmFja0lEKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gVGhlIHJlcXVlc3QgY2FsbGJhY2sgdGltZXIgaXMgYWxyZWFkeSBydW5uaW5nLiBEb24ndCBzdGFydCBhIG5ldyBvbmUuXG4gIH0gZWxzZSB7XG4gICAgc3RhcnRSZXF1ZXN0Q2FsbGJhY2tUaW1lcigpO1xuICB9XG5cbiAgY2FsbGJhY2tFeHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lO1xuICB2YXIgY3VycmVudE1zID0gc2NoZWR1bGVyLnVuc3RhYmxlX25vdygpIC0gb3JpZ2luYWxTdGFydFRpbWVNcztcbiAgdmFyIGV4cGlyYXRpb25UaW1lTXMgPSBleHBpcmF0aW9uVGltZVRvTXMoZXhwaXJhdGlvblRpbWUpO1xuICB2YXIgdGltZW91dCA9IGV4cGlyYXRpb25UaW1lTXMgLSBjdXJyZW50TXM7XG4gIGNhbGxiYWNrSUQgPSBzY2hlZHVsZXIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhwZXJmb3JtQXN5bmNXb3JrLCB7IHRpbWVvdXQ6IHRpbWVvdXQgfSk7XG59XG5cbi8vIEZvciBldmVyeSBjYWxsIHRvIHJlbmRlclJvb3QsIG9uZSBvZiBvbkZhdGFsLCBvbkNvbXBsZXRlLCBvblN1c3BlbmQsIGFuZFxuLy8gb25ZaWVsZCBpcyBjYWxsZWQgdXBvbiBleGl0aW5nLiBXZSB1c2UgdGhlc2UgaW4gbGlldSBvZiByZXR1cm5pbmcgYSB0dXBsZS5cbi8vIEkndmUgYWxzbyBjaG9zZW4gbm90IHRvIGlubGluZSB0aGVtIGludG8gcmVuZGVyUm9vdCBiZWNhdXNlIHRoZXNlIHdpbGxcbi8vIGV2ZW50dWFsbHkgYmUgbGlmdGVkIGludG8gdGhlIHJlbmRlcmVyLlxuZnVuY3Rpb24gb25GYXRhbChyb290KSB7XG4gIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gb25Db21wbGV0ZShyb290LCBmaW5pc2hlZFdvcmssIGV4cGlyYXRpb25UaW1lKSB7XG4gIHJvb3QucGVuZGluZ0NvbW1pdEV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gIHJvb3QuZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrO1xufVxuXG5mdW5jdGlvbiBvblN1c3BlbmQocm9vdCwgZmluaXNoZWRXb3JrLCBzdXNwZW5kZWRFeHBpcmF0aW9uVGltZSwgcm9vdEV4cGlyYXRpb25UaW1lLCBtc1VudGlsVGltZW91dCkge1xuICByb290LmV4cGlyYXRpb25UaW1lID0gcm9vdEV4cGlyYXRpb25UaW1lO1xuICBpZiAobXNVbnRpbFRpbWVvdXQgPT09IDAgJiYgIXNob3VsZFlpZWxkVG9SZW5kZXJlcigpKSB7XG4gICAgLy8gRG9uJ3Qgd2FpdCBhbiBhZGRpdGlvbmFsIHRpY2suIENvbW1pdCB0aGUgdHJlZSBpbW1lZGlhdGVseS5cbiAgICByb290LnBlbmRpbmdDb21taXRFeHBpcmF0aW9uVGltZSA9IHN1c3BlbmRlZEV4cGlyYXRpb25UaW1lO1xuICAgIHJvb3QuZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrO1xuICB9IGVsc2UgaWYgKG1zVW50aWxUaW1lb3V0ID4gMCkge1xuICAgIC8vIFdhaXQgYG1zVW50aWxUaW1lb3V0YCBtaWxsaXNlY29uZHMgYmVmb3JlIGNvbW1pdHRpbmcuXG4gICAgcm9vdC50aW1lb3V0SGFuZGxlID0gc2NoZWR1bGVUaW1lb3V0KG9uVGltZW91dC5iaW5kKG51bGwsIHJvb3QsIGZpbmlzaGVkV29yaywgc3VzcGVuZGVkRXhwaXJhdGlvblRpbWUpLCBtc1VudGlsVGltZW91dCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gb25ZaWVsZChyb290KSB7XG4gIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gb25UaW1lb3V0KHJvb3QsIGZpbmlzaGVkV29yaywgc3VzcGVuZGVkRXhwaXJhdGlvblRpbWUpIHtcbiAgLy8gVGhlIHJvb3QgdGltZWQgb3V0LiBDb21taXQgaXQuXG4gIHJvb3QucGVuZGluZ0NvbW1pdEV4cGlyYXRpb25UaW1lID0gc3VzcGVuZGVkRXhwaXJhdGlvblRpbWU7XG4gIHJvb3QuZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrO1xuICAvLyBSZWFkIHRoZSBjdXJyZW50IHRpbWUgYmVmb3JlIGVudGVyaW5nIHRoZSBjb21taXQgcGhhc2UuIFdlIGNhbiBiZVxuICAvLyBjZXJ0YWluIHRoaXMgd29uJ3QgY2F1c2UgdGVhcmluZyByZWxhdGVkIHRvIGJhdGNoaW5nIG9mIGV2ZW50IHVwZGF0ZXNcbiAgLy8gYmVjYXVzZSB3ZSdyZSBhdCB0aGUgdG9wIG9mIGEgdGltZXIgZXZlbnQuXG4gIHJlY29tcHV0ZUN1cnJlbnRSZW5kZXJlclRpbWUoKTtcbiAgY3VycmVudFNjaGVkdWxlclRpbWUgPSBjdXJyZW50UmVuZGVyZXJUaW1lO1xuICBmbHVzaFJvb3Qocm9vdCwgc3VzcGVuZGVkRXhwaXJhdGlvblRpbWUpO1xufVxuXG5mdW5jdGlvbiBvbkNvbW1pdChyb290LCBleHBpcmF0aW9uVGltZSkge1xuICByb290LmV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdEN1cnJlbnRUaW1lKCkge1xuICAvLyByZXF1ZXN0Q3VycmVudFRpbWUgaXMgY2FsbGVkIGJ5IHRoZSBzY2hlZHVsZXIgdG8gY29tcHV0ZSBhbiBleHBpcmF0aW9uXG4gIC8vIHRpbWUuXG4gIC8vXG4gIC8vIEV4cGlyYXRpb24gdGltZXMgYXJlIGNvbXB1dGVkIGJ5IGFkZGluZyB0byB0aGUgY3VycmVudCB0aW1lICh0aGUgc3RhcnRcbiAgLy8gdGltZSkuIEhvd2V2ZXIsIGlmIHR3byB1cGRhdGVzIGFyZSBzY2hlZHVsZWQgd2l0aGluIHRoZSBzYW1lIGV2ZW50LCB3ZVxuICAvLyBzaG91bGQgdHJlYXQgdGhlaXIgc3RhcnQgdGltZXMgYXMgc2ltdWx0YW5lb3VzLCBldmVuIGlmIHRoZSBhY3R1YWwgY2xvY2tcbiAgLy8gdGltZSBoYXMgYWR2YW5jZWQgYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHNlY29uZCBjYWxsLlxuXG4gIC8vIEluIG90aGVyIHdvcmRzLCBiZWNhdXNlIGV4cGlyYXRpb24gdGltZXMgZGV0ZXJtaW5lIGhvdyB1cGRhdGVzIGFyZSBiYXRjaGVkLFxuICAvLyB3ZSB3YW50IGFsbCB1cGRhdGVzIG9mIGxpa2UgcHJpb3JpdHkgdGhhdCBvY2N1ciB3aXRoaW4gdGhlIHNhbWUgZXZlbnQgdG9cbiAgLy8gcmVjZWl2ZSB0aGUgc2FtZSBleHBpcmF0aW9uIHRpbWUuIE90aGVyd2lzZSB3ZSBnZXQgdGVhcmluZy5cbiAgLy9cbiAgLy8gV2Uga2VlcCB0cmFjayBvZiB0d28gc2VwYXJhdGUgdGltZXM6IHRoZSBjdXJyZW50IFwicmVuZGVyZXJcIiB0aW1lIGFuZCB0aGVcbiAgLy8gY3VycmVudCBcInNjaGVkdWxlclwiIHRpbWUuIFRoZSByZW5kZXJlciB0aW1lIGNhbiBiZSB1cGRhdGVkIHdoZW5ldmVyOyBpdFxuICAvLyBvbmx5IGV4aXN0cyB0byBtaW5pbWl6ZSB0aGUgY2FsbHMgcGVyZm9ybWFuY2Uubm93LlxuICAvL1xuICAvLyBCdXQgdGhlIHNjaGVkdWxlciB0aW1lIGNhbiBvbmx5IGJlIHVwZGF0ZWQgaWYgdGhlcmUncyBubyBwZW5kaW5nIHdvcmssIG9yXG4gIC8vIGlmIHdlIGtub3cgZm9yIGNlcnRhaW4gdGhhdCB3ZSdyZSBub3QgaW4gdGhlIG1pZGRsZSBvZiBhbiBldmVudC5cblxuICBpZiAoaXNSZW5kZXJpbmcpIHtcbiAgICAvLyBXZSdyZSBhbHJlYWR5IHJlbmRlcmluZy4gUmV0dXJuIHRoZSBtb3N0IHJlY2VudGx5IHJlYWQgdGltZS5cbiAgICByZXR1cm4gY3VycmVudFNjaGVkdWxlclRpbWU7XG4gIH1cbiAgLy8gQ2hlY2sgaWYgdGhlcmUncyBwZW5kaW5nIHdvcmsuXG4gIGZpbmRIaWdoZXN0UHJpb3JpdHlSb290KCk7XG4gIGlmIChuZXh0Rmx1c2hlZEV4cGlyYXRpb25UaW1lID09PSBOb1dvcmsgfHwgbmV4dEZsdXNoZWRFeHBpcmF0aW9uVGltZSA9PT0gTmV2ZXIpIHtcbiAgICAvLyBJZiB0aGVyZSdzIG5vIHBlbmRpbmcgd29yaywgb3IgaWYgdGhlIHBlbmRpbmcgd29yayBpcyBvZmZzY3JlZW4sIHdlIGNhblxuICAgIC8vIHJlYWQgdGhlIGN1cnJlbnQgdGltZSB3aXRob3V0IHJpc2sgb2YgdGVhcmluZy5cbiAgICByZWNvbXB1dGVDdXJyZW50UmVuZGVyZXJUaW1lKCk7XG4gICAgY3VycmVudFNjaGVkdWxlclRpbWUgPSBjdXJyZW50UmVuZGVyZXJUaW1lO1xuICAgIHJldHVybiBjdXJyZW50U2NoZWR1bGVyVGltZTtcbiAgfVxuICAvLyBUaGVyZSdzIGFscmVhZHkgcGVuZGluZyB3b3JrLiBXZSBtaWdodCBiZSBpbiB0aGUgbWlkZGxlIG9mIGEgYnJvd3NlclxuICAvLyBldmVudC4gSWYgd2Ugd2VyZSB0byByZWFkIHRoZSBjdXJyZW50IHRpbWUsIGl0IGNvdWxkIGNhdXNlIG11bHRpcGxlIHVwZGF0ZXNcbiAgLy8gd2l0aGluIHRoZSBzYW1lIGV2ZW50IHRvIHJlY2VpdmUgZGlmZmVyZW50IGV4cGlyYXRpb24gdGltZXMsIGxlYWRpbmcgdG9cbiAgLy8gdGVhcmluZy4gUmV0dXJuIHRoZSBsYXN0IHJlYWQgdGltZS4gRHVyaW5nIHRoZSBuZXh0IGlkbGUgY2FsbGJhY2ssIHRoZVxuICAvLyB0aW1lIHdpbGwgYmUgdXBkYXRlZC5cbiAgcmV0dXJuIGN1cnJlbnRTY2hlZHVsZXJUaW1lO1xufVxuXG4vLyByZXF1ZXN0V29yayBpcyBjYWxsZWQgYnkgdGhlIHNjaGVkdWxlciB3aGVuZXZlciBhIHJvb3QgcmVjZWl2ZXMgYW4gdXBkYXRlLlxuLy8gSXQncyB1cCB0byB0aGUgcmVuZGVyZXIgdG8gY2FsbCByZW5kZXJSb290IGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS5cbmZ1bmN0aW9uIHJlcXVlc3RXb3JrKHJvb3QsIGV4cGlyYXRpb25UaW1lKSB7XG4gIGFkZFJvb3RUb1NjaGVkdWxlKHJvb3QsIGV4cGlyYXRpb25UaW1lKTtcbiAgaWYgKGlzUmVuZGVyaW5nKSB7XG4gICAgLy8gUHJldmVudCByZWVudHJhbmN5LiBSZW1haW5pbmcgd29yayB3aWxsIGJlIHNjaGVkdWxlZCBhdCB0aGUgZW5kIG9mXG4gICAgLy8gdGhlIGN1cnJlbnRseSByZW5kZXJpbmcgYmF0Y2guXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGlzQmF0Y2hpbmdVcGRhdGVzKSB7XG4gICAgLy8gRmx1c2ggd29yayBhdCB0aGUgZW5kIG9mIHRoZSBiYXRjaC5cbiAgICBpZiAoaXNVbmJhdGNoaW5nVXBkYXRlcykge1xuICAgICAgLy8gLi4udW5sZXNzIHdlJ3JlIGluc2lkZSB1bmJhdGNoZWRVcGRhdGVzLCBpbiB3aGljaCBjYXNlIHdlIHNob3VsZFxuICAgICAgLy8gZmx1c2ggaXQgbm93LlxuICAgICAgbmV4dEZsdXNoZWRSb290ID0gcm9vdDtcbiAgICAgIG5leHRGbHVzaGVkRXhwaXJhdGlvblRpbWUgPSBTeW5jO1xuICAgICAgcGVyZm9ybVdvcmtPblJvb3Qocm9vdCwgU3luYywgZmFsc2UpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUT0RPOiBHZXQgcmlkIG9mIFN5bmMgYW5kIHVzZSBjdXJyZW50IHRpbWU/XG4gIGlmIChleHBpcmF0aW9uVGltZSA9PT0gU3luYykge1xuICAgIHBlcmZvcm1TeW5jV29yaygpO1xuICB9IGVsc2Uge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tXaXRoRXhwaXJhdGlvblRpbWUocm9vdCwgZXhwaXJhdGlvblRpbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFJvb3RUb1NjaGVkdWxlKHJvb3QsIGV4cGlyYXRpb25UaW1lKSB7XG4gIC8vIEFkZCB0aGUgcm9vdCB0byB0aGUgc2NoZWR1bGUuXG4gIC8vIENoZWNrIGlmIHRoaXMgcm9vdCBpcyBhbHJlYWR5IHBhcnQgb2YgdGhlIHNjaGVkdWxlLlxuICBpZiAocm9vdC5uZXh0U2NoZWR1bGVkUm9vdCA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgcm9vdCBpcyBub3QgYWxyZWFkeSBzY2hlZHVsZWQuIEFkZCBpdC5cbiAgICByb290LmV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gICAgaWYgKGxhc3RTY2hlZHVsZWRSb290ID09PSBudWxsKSB7XG4gICAgICBmaXJzdFNjaGVkdWxlZFJvb3QgPSBsYXN0U2NoZWR1bGVkUm9vdCA9IHJvb3Q7XG4gICAgICByb290Lm5leHRTY2hlZHVsZWRSb290ID0gcm9vdDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdFNjaGVkdWxlZFJvb3QubmV4dFNjaGVkdWxlZFJvb3QgPSByb290O1xuICAgICAgbGFzdFNjaGVkdWxlZFJvb3QgPSByb290O1xuICAgICAgbGFzdFNjaGVkdWxlZFJvb3QubmV4dFNjaGVkdWxlZFJvb3QgPSBmaXJzdFNjaGVkdWxlZFJvb3Q7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgcm9vdCBpcyBhbHJlYWR5IHNjaGVkdWxlZCwgYnV0IGl0cyBwcmlvcml0eSBtYXkgaGF2ZSBpbmNyZWFzZWQuXG4gICAgdmFyIHJlbWFpbmluZ0V4cGlyYXRpb25UaW1lID0gcm9vdC5leHBpcmF0aW9uVGltZTtcbiAgICBpZiAoZXhwaXJhdGlvblRpbWUgPiByZW1haW5pbmdFeHBpcmF0aW9uVGltZSkge1xuICAgICAgLy8gVXBkYXRlIHRoZSBwcmlvcml0eS5cbiAgICAgIHJvb3QuZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEhpZ2hlc3RQcmlvcml0eVJvb3QoKSB7XG4gIHZhciBoaWdoZXN0UHJpb3JpdHlXb3JrID0gTm9Xb3JrO1xuICB2YXIgaGlnaGVzdFByaW9yaXR5Um9vdCA9IG51bGw7XG4gIGlmIChsYXN0U2NoZWR1bGVkUm9vdCAhPT0gbnVsbCkge1xuICAgIHZhciBwcmV2aW91c1NjaGVkdWxlZFJvb3QgPSBsYXN0U2NoZWR1bGVkUm9vdDtcbiAgICB2YXIgcm9vdCA9IGZpcnN0U2NoZWR1bGVkUm9vdDtcbiAgICB3aGlsZSAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgdmFyIHJlbWFpbmluZ0V4cGlyYXRpb25UaW1lID0gcm9vdC5leHBpcmF0aW9uVGltZTtcbiAgICAgIGlmIChyZW1haW5pbmdFeHBpcmF0aW9uVGltZSA9PT0gTm9Xb3JrKSB7XG4gICAgICAgIC8vIFRoaXMgcm9vdCBubyBsb25nZXIgaGFzIHdvcmsuIFJlbW92ZSBpdCBmcm9tIHRoZSBzY2hlZHVsZXIuXG5cbiAgICAgICAgLy8gVE9ETzogVGhpcyBjaGVjayBpcyByZWR1ZGFudCwgYnV0IEZsb3cgaXMgY29uZnVzZWQgYnkgdGhlIGJyYW5jaFxuICAgICAgICAvLyBiZWxvdyB3aGVyZSB3ZSBzZXQgbGFzdFNjaGVkdWxlZFJvb3QgdG8gbnVsbCwgZXZlbiB0aG91Z2ggd2UgYnJlYWtcbiAgICAgICAgLy8gZnJvbSB0aGUgbG9vcCByaWdodCBhZnRlci5cbiAgICAgICAgIShwcmV2aW91c1NjaGVkdWxlZFJvb3QgIT09IG51bGwgJiYgbGFzdFNjaGVkdWxlZFJvb3QgIT09IG51bGwpID8gaW52YXJpYW50KGZhbHNlLCAnU2hvdWxkIGhhdmUgYSBwcmV2aW91cyBhbmQgbGFzdCByb290LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpIDogdm9pZCAwO1xuICAgICAgICBpZiAocm9vdCA9PT0gcm9vdC5uZXh0U2NoZWR1bGVkUm9vdCkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIG9ubHkgcm9vdCBpbiB0aGUgbGlzdC5cbiAgICAgICAgICByb290Lm5leHRTY2hlZHVsZWRSb290ID0gbnVsbDtcbiAgICAgICAgICBmaXJzdFNjaGVkdWxlZFJvb3QgPSBsYXN0U2NoZWR1bGVkUm9vdCA9IG51bGw7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAocm9vdCA9PT0gZmlyc3RTY2hlZHVsZWRSb290KSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3Qgcm9vdCBpbiB0aGUgbGlzdC5cbiAgICAgICAgICB2YXIgbmV4dCA9IHJvb3QubmV4dFNjaGVkdWxlZFJvb3Q7XG4gICAgICAgICAgZmlyc3RTY2hlZHVsZWRSb290ID0gbmV4dDtcbiAgICAgICAgICBsYXN0U2NoZWR1bGVkUm9vdC5uZXh0U2NoZWR1bGVkUm9vdCA9IG5leHQ7XG4gICAgICAgICAgcm9vdC5uZXh0U2NoZWR1bGVkUm9vdCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAocm9vdCA9PT0gbGFzdFNjaGVkdWxlZFJvb3QpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBsYXN0IHJvb3QgaW4gdGhlIGxpc3QuXG4gICAgICAgICAgbGFzdFNjaGVkdWxlZFJvb3QgPSBwcmV2aW91c1NjaGVkdWxlZFJvb3Q7XG4gICAgICAgICAgbGFzdFNjaGVkdWxlZFJvb3QubmV4dFNjaGVkdWxlZFJvb3QgPSBmaXJzdFNjaGVkdWxlZFJvb3Q7XG4gICAgICAgICAgcm9vdC5uZXh0U2NoZWR1bGVkUm9vdCA9IG51bGw7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNTY2hlZHVsZWRSb290Lm5leHRTY2hlZHVsZWRSb290ID0gcm9vdC5uZXh0U2NoZWR1bGVkUm9vdDtcbiAgICAgICAgICByb290Lm5leHRTY2hlZHVsZWRSb290ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByb290ID0gcHJldmlvdXNTY2hlZHVsZWRSb290Lm5leHRTY2hlZHVsZWRSb290O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHJlbWFpbmluZ0V4cGlyYXRpb25UaW1lID4gaGlnaGVzdFByaW9yaXR5V29yaykge1xuICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcHJpb3JpdHksIGlmIGl0J3MgaGlnaGVyXG4gICAgICAgICAgaGlnaGVzdFByaW9yaXR5V29yayA9IHJlbWFpbmluZ0V4cGlyYXRpb25UaW1lO1xuICAgICAgICAgIGhpZ2hlc3RQcmlvcml0eVJvb3QgPSByb290O1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb290ID09PSBsYXN0U2NoZWR1bGVkUm9vdCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoaWdoZXN0UHJpb3JpdHlXb3JrID09PSBTeW5jKSB7XG4gICAgICAgICAgLy8gU3luYyBpcyBoaWdoZXN0IHByaW9yaXR5IGJ5IGRlZmluaXRpb24gc29cbiAgICAgICAgICAvLyB3ZSBjYW4gc3RvcCBzZWFyY2hpbmcuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcHJldmlvdXNTY2hlZHVsZWRSb290ID0gcm9vdDtcbiAgICAgICAgcm9vdCA9IHJvb3QubmV4dFNjaGVkdWxlZFJvb3Q7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmV4dEZsdXNoZWRSb290ID0gaGlnaGVzdFByaW9yaXR5Um9vdDtcbiAgbmV4dEZsdXNoZWRFeHBpcmF0aW9uVGltZSA9IGhpZ2hlc3RQcmlvcml0eVdvcms7XG59XG5cbi8vIFRPRE86IFRoaXMgd3JhcHBlciBleGlzdHMgYmVjYXVzZSBtYW55IG9mIHRoZSBvbGRlciB0ZXN0cyAodGhlIG9uZXMgdGhhdCB1c2Vcbi8vIGZsdXNoRGVmZXJyZWRQcmkpIHJlbHkgb24gdGhlIG51bWJlciBvZiB0aW1lcyBgc2hvdWxkWWllbGRgIGlzIGNhbGxlZC4gV2Vcbi8vIHNob3VsZCBnZXQgcmlkIG9mIGl0LlxudmFyIGRpZFlpZWxkID0gZmFsc2U7XG5mdW5jdGlvbiBzaG91bGRZaWVsZFRvUmVuZGVyZXIoKSB7XG4gIGlmIChkaWRZaWVsZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChzY2hlZHVsZXIudW5zdGFibGVfc2hvdWxkWWllbGQoKSkge1xuICAgIGRpZFlpZWxkID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBlcmZvcm1Bc3luY1dvcmsoKSB7XG4gIHRyeSB7XG4gICAgaWYgKCFzaG91bGRZaWVsZFRvUmVuZGVyZXIoKSkge1xuICAgICAgLy8gVGhlIGNhbGxiYWNrIHRpbWVkIG91dC4gVGhhdCBtZWFucyBhdCBsZWFzdCBvbmUgdXBkYXRlIGhhcyBleHBpcmVkLlxuICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSByb290IHNjaGVkdWxlLiBJZiB0aGV5IGNvbnRhaW4gZXhwaXJlZCB3b3JrLCBzZXRcbiAgICAgIC8vIHRoZSBuZXh0IHJlbmRlciBleHBpcmF0aW9uIHRpbWUgdG8gdGhlIGN1cnJlbnQgdGltZS4gVGhpcyBoYXMgdGhlIGVmZmVjdFxuICAgICAgLy8gb2YgZmx1c2hpbmcgYWxsIGV4cGlyZWQgd29yayBpbiBhIHNpbmdsZSBiYXRjaCwgaW5zdGVhZCBvZiBmbHVzaGluZyBlYWNoXG4gICAgICAvLyBsZXZlbCBvbmUgYXQgYSB0aW1lLlxuICAgICAgaWYgKGZpcnN0U2NoZWR1bGVkUm9vdCAhPT0gbnVsbCkge1xuICAgICAgICByZWNvbXB1dGVDdXJyZW50UmVuZGVyZXJUaW1lKCk7XG4gICAgICAgIHZhciByb290ID0gZmlyc3RTY2hlZHVsZWRSb290O1xuICAgICAgICBkbyB7XG4gICAgICAgICAgZGlkRXhwaXJlQXRFeHBpcmF0aW9uVGltZShyb290LCBjdXJyZW50UmVuZGVyZXJUaW1lKTtcbiAgICAgICAgICAvLyBUaGUgcm9vdCBzY2hlZHVsZSBpcyBjaXJjdWxhciwgc28gdGhpcyBpcyBuZXZlciBudWxsLlxuICAgICAgICAgIHJvb3QgPSByb290Lm5leHRTY2hlZHVsZWRSb290O1xuICAgICAgICB9IHdoaWxlIChyb290ICE9PSBmaXJzdFNjaGVkdWxlZFJvb3QpO1xuICAgICAgfVxuICAgIH1cbiAgICBwZXJmb3JtV29yayhOb1dvcmssIHRydWUpO1xuICB9IGZpbmFsbHkge1xuICAgIGRpZFlpZWxkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGVyZm9ybVN5bmNXb3JrKCkge1xuICBwZXJmb3JtV29yayhTeW5jLCBmYWxzZSk7XG59XG5cbmZ1bmN0aW9uIHBlcmZvcm1Xb3JrKG1pbkV4cGlyYXRpb25UaW1lLCBpc1lpZWxkeSkge1xuICAvLyBLZWVwIHdvcmtpbmcgb24gcm9vdHMgdW50aWwgdGhlcmUncyBubyBtb3JlIHdvcmssIG9yIHVudGlsIHRoZXJlJ3MgYSBoaWdoZXJcbiAgLy8gcHJpb3JpdHkgZXZlbnQuXG4gIGZpbmRIaWdoZXN0UHJpb3JpdHlSb290KCk7XG5cbiAgaWYgKGlzWWllbGR5KSB7XG4gICAgcmVjb21wdXRlQ3VycmVudFJlbmRlcmVyVGltZSgpO1xuICAgIGN1cnJlbnRTY2hlZHVsZXJUaW1lID0gY3VycmVudFJlbmRlcmVyVGltZTtcblxuICAgIGlmIChlbmFibGVVc2VyVGltaW5nQVBJKSB7XG4gICAgICB2YXIgZGlkRXhwaXJlID0gbmV4dEZsdXNoZWRFeHBpcmF0aW9uVGltZSA+IGN1cnJlbnRSZW5kZXJlclRpbWU7XG4gICAgICB2YXIgdGltZW91dCA9IGV4cGlyYXRpb25UaW1lVG9NcyhuZXh0Rmx1c2hlZEV4cGlyYXRpb25UaW1lKTtcbiAgICAgIHN0b3BSZXF1ZXN0Q2FsbGJhY2tUaW1lcihkaWRFeHBpcmUsIHRpbWVvdXQpO1xuICAgIH1cblxuICAgIHdoaWxlIChuZXh0Rmx1c2hlZFJvb3QgIT09IG51bGwgJiYgbmV4dEZsdXNoZWRFeHBpcmF0aW9uVGltZSAhPT0gTm9Xb3JrICYmIG1pbkV4cGlyYXRpb25UaW1lIDw9IG5leHRGbHVzaGVkRXhwaXJhdGlvblRpbWUgJiYgIShkaWRZaWVsZCAmJiBjdXJyZW50UmVuZGVyZXJUaW1lID4gbmV4dEZsdXNoZWRFeHBpcmF0aW9uVGltZSkpIHtcbiAgICAgIHBlcmZvcm1Xb3JrT25Sb290KG5leHRGbHVzaGVkUm9vdCwgbmV4dEZsdXNoZWRFeHBpcmF0aW9uVGltZSwgY3VycmVudFJlbmRlcmVyVGltZSA+IG5leHRGbHVzaGVkRXhwaXJhdGlvblRpbWUpO1xuICAgICAgZmluZEhpZ2hlc3RQcmlvcml0eVJvb3QoKTtcbiAgICAgIHJlY29tcHV0ZUN1cnJlbnRSZW5kZXJlclRpbWUoKTtcbiAgICAgIGN1cnJlbnRTY2hlZHVsZXJUaW1lID0gY3VycmVudFJlbmRlcmVyVGltZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKG5leHRGbHVzaGVkUm9vdCAhPT0gbnVsbCAmJiBuZXh0Rmx1c2hlZEV4cGlyYXRpb25UaW1lICE9PSBOb1dvcmsgJiYgbWluRXhwaXJhdGlvblRpbWUgPD0gbmV4dEZsdXNoZWRFeHBpcmF0aW9uVGltZSkge1xuICAgICAgcGVyZm9ybVdvcmtPblJvb3QobmV4dEZsdXNoZWRSb290LCBuZXh0Rmx1c2hlZEV4cGlyYXRpb25UaW1lLCBmYWxzZSk7XG4gICAgICBmaW5kSGlnaGVzdFByaW9yaXR5Um9vdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdlJ3JlIGRvbmUgZmx1c2hpbmcgd29yay4gRWl0aGVyIHdlIHJhbiBvdXQgb2YgdGltZSBpbiB0aGlzIGNhbGxiYWNrLFxuICAvLyBvciB0aGVyZSdzIG5vIG1vcmUgd29yayBsZWZ0IHdpdGggc3VmZmljaWVudCBwcmlvcml0eS5cblxuICAvLyBJZiB3ZSdyZSBpbnNpZGUgYSBjYWxsYmFjaywgc2V0IHRoaXMgdG8gZmFsc2Ugc2luY2Ugd2UganVzdCBjb21wbGV0ZWQgaXQuXG4gIGlmIChpc1lpZWxkeSkge1xuICAgIGNhbGxiYWNrRXhwaXJhdGlvblRpbWUgPSBOb1dvcms7XG4gICAgY2FsbGJhY2tJRCA9IG51bGw7XG4gIH1cbiAgLy8gSWYgdGhlcmUncyB3b3JrIGxlZnQgb3Zlciwgc2NoZWR1bGUgYSBuZXcgY2FsbGJhY2suXG4gIGlmIChuZXh0Rmx1c2hlZEV4cGlyYXRpb25UaW1lICE9PSBOb1dvcmspIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrV2l0aEV4cGlyYXRpb25UaW1lKG5leHRGbHVzaGVkUm9vdCwgbmV4dEZsdXNoZWRFeHBpcmF0aW9uVGltZSk7XG4gIH1cblxuICAvLyBDbGVhbi11cC5cbiAgZmluaXNoUmVuZGVyaW5nKCk7XG59XG5cbmZ1bmN0aW9uIGZsdXNoUm9vdChyb290LCBleHBpcmF0aW9uVGltZSkge1xuICAhIWlzUmVuZGVyaW5nID8gaW52YXJpYW50KGZhbHNlLCAnd29yay5jb21taXQoKTogQ2Fubm90IGNvbW1pdCB3aGlsZSBhbHJlYWR5IHJlbmRlcmluZy4gVGhpcyBsaWtlbHkgbWVhbnMgeW91IGF0dGVtcHRlZCB0byBjb21taXQgZnJvbSBpbnNpZGUgYSBsaWZlY3ljbGUgbWV0aG9kLicpIDogdm9pZCAwO1xuICAvLyBQZXJmb3JtIHdvcmsgb24gcm9vdCBhcyBpZiB0aGUgZ2l2ZW4gZXhwaXJhdGlvbiB0aW1lIGlzIHRoZSBjdXJyZW50IHRpbWUuXG4gIC8vIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2Ygc3luY2hyb25vdXNseSBmbHVzaGluZyBhbGwgd29yayB1cCB0byBhbmRcbiAgLy8gaW5jbHVkaW5nIHRoZSBnaXZlbiB0aW1lLlxuICBuZXh0Rmx1c2hlZFJvb3QgPSByb290O1xuICBuZXh0Rmx1c2hlZEV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gIHBlcmZvcm1Xb3JrT25Sb290KHJvb3QsIGV4cGlyYXRpb25UaW1lLCBmYWxzZSk7XG4gIC8vIEZsdXNoIGFueSBzeW5jIHdvcmsgdGhhdCB3YXMgc2NoZWR1bGVkIGJ5IGxpZmVjeWNsZXNcbiAgcGVyZm9ybVN5bmNXb3JrKCk7XG59XG5cbmZ1bmN0aW9uIGZpbmlzaFJlbmRlcmluZygpIHtcbiAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICBsYXN0Q29tbWl0dGVkUm9vdER1cmluZ1RoaXNCYXRjaCA9IG51bGw7XG5cbiAgaWYgKGNvbXBsZXRlZEJhdGNoZXMgIT09IG51bGwpIHtcbiAgICB2YXIgYmF0Y2hlcyA9IGNvbXBsZXRlZEJhdGNoZXM7XG4gICAgY29tcGxldGVkQmF0Y2hlcyA9IG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYXRjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYmF0Y2ggPSBiYXRjaGVzW2ldO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYmF0Y2guX29uQ29tcGxldGUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghaGFzVW5oYW5kbGVkRXJyb3IpIHtcbiAgICAgICAgICBoYXNVbmhhbmRsZWRFcnJvciA9IHRydWU7XG4gICAgICAgICAgdW5oYW5kbGVkRXJyb3IgPSBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChoYXNVbmhhbmRsZWRFcnJvcikge1xuICAgIHZhciBlcnJvciA9IHVuaGFuZGxlZEVycm9yO1xuICAgIHVuaGFuZGxlZEVycm9yID0gbnVsbDtcbiAgICBoYXNVbmhhbmRsZWRFcnJvciA9IGZhbHNlO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBlcmZvcm1Xb3JrT25Sb290KHJvb3QsIGV4cGlyYXRpb25UaW1lLCBpc1lpZWxkeSkge1xuICAhIWlzUmVuZGVyaW5nID8gaW52YXJpYW50KGZhbHNlLCAncGVyZm9ybVdvcmtPblJvb3Qgd2FzIGNhbGxlZCByZWN1cnNpdmVseS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKSA6IHZvaWQgMDtcblxuICBpc1JlbmRlcmluZyA9IHRydWU7XG5cbiAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhc3luYyB3b3JrIG9yIHN5bmMvZXhwaXJlZCB3b3JrLlxuICBpZiAoIWlzWWllbGR5KSB7XG4gICAgLy8gRmx1c2ggd29yayB3aXRob3V0IHlpZWxkaW5nLlxuICAgIC8vIFRPRE86IE5vbi15aWVsZHkgd29yayBkb2VzIG5vdCBuZWNlc3NhcmlseSBpbXBseSBleHBpcmVkIHdvcmsuIEEgcmVuZGVyZXJcbiAgICAvLyBtYXkgd2FudCB0byBwZXJmb3JtIHNvbWUgd29yayB3aXRob3V0IHlpZWxkaW5nLCBidXQgYWxzbyB3aXRob3V0XG4gICAgLy8gcmVxdWlyaW5nIHRoZSByb290IHRvIGNvbXBsZXRlIChieSB0cmlnZ2VyaW5nIHBsYWNlaG9sZGVycykuXG5cbiAgICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5maW5pc2hlZFdvcms7XG4gICAgaWYgKGZpbmlzaGVkV29yayAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyByb290IGlzIGFscmVhZHkgY29tcGxldGUuIFdlIGNhbiBjb21taXQgaXQuXG4gICAgICBjb21wbGV0ZVJvb3Qocm9vdCwgZmluaXNoZWRXb3JrLCBleHBpcmF0aW9uVGltZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcbiAgICAgIC8vIElmIHRoaXMgcm9vdCBwcmV2aW91c2x5IHN1c3BlbmRlZCwgY2xlYXIgaXRzIGV4aXN0aW5nIHRpbWVvdXQsIHNpbmNlXG4gICAgICAvLyB3ZSdyZSBhYm91dCB0byB0cnkgcmVuZGVyaW5nIGFnYWluLlxuICAgICAgdmFyIHRpbWVvdXRIYW5kbGUgPSByb290LnRpbWVvdXRIYW5kbGU7XG4gICAgICBpZiAodGltZW91dEhhbmRsZSAhPT0gbm9UaW1lb3V0KSB7XG4gICAgICAgIHJvb3QudGltZW91dEhhbmRsZSA9IG5vVGltZW91dDtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSBDb21wbGFpbnMgbm9UaW1lb3V0IGlzIG5vdCBhIFRpbWVvdXRJRCwgZGVzcGl0ZSB0aGUgY2hlY2sgYWJvdmVcbiAgICAgICAgY2FuY2VsVGltZW91dCh0aW1lb3V0SGFuZGxlKTtcbiAgICAgIH1cbiAgICAgIHJlbmRlclJvb3Qocm9vdCwgaXNZaWVsZHkpO1xuICAgICAgZmluaXNoZWRXb3JrID0gcm9vdC5maW5pc2hlZFdvcms7XG4gICAgICBpZiAoZmluaXNoZWRXb3JrICE9PSBudWxsKSB7XG4gICAgICAgIC8vIFdlJ3ZlIGNvbXBsZXRlZCB0aGUgcm9vdC4gQ29tbWl0IGl0LlxuICAgICAgICBjb21wbGV0ZVJvb3Qocm9vdCwgZmluaXNoZWRXb3JrLCBleHBpcmF0aW9uVGltZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIEZsdXNoIGFzeW5jIHdvcmsuXG4gICAgdmFyIF9maW5pc2hlZFdvcmsgPSByb290LmZpbmlzaGVkV29yaztcbiAgICBpZiAoX2ZpbmlzaGVkV29yayAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyByb290IGlzIGFscmVhZHkgY29tcGxldGUuIFdlIGNhbiBjb21taXQgaXQuXG4gICAgICBjb21wbGV0ZVJvb3Qocm9vdCwgX2ZpbmlzaGVkV29yaywgZXhwaXJhdGlvblRpbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByb290LmZpbmlzaGVkV29yayA9IG51bGw7XG4gICAgICAvLyBJZiB0aGlzIHJvb3QgcHJldmlvdXNseSBzdXNwZW5kZWQsIGNsZWFyIGl0cyBleGlzdGluZyB0aW1lb3V0LCBzaW5jZVxuICAgICAgLy8gd2UncmUgYWJvdXQgdG8gdHJ5IHJlbmRlcmluZyBhZ2Fpbi5cbiAgICAgIHZhciBfdGltZW91dEhhbmRsZSA9IHJvb3QudGltZW91dEhhbmRsZTtcbiAgICAgIGlmIChfdGltZW91dEhhbmRsZSAhPT0gbm9UaW1lb3V0KSB7XG4gICAgICAgIHJvb3QudGltZW91dEhhbmRsZSA9IG5vVGltZW91dDtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSBDb21wbGFpbnMgbm9UaW1lb3V0IGlzIG5vdCBhIFRpbWVvdXRJRCwgZGVzcGl0ZSB0aGUgY2hlY2sgYWJvdmVcbiAgICAgICAgY2FuY2VsVGltZW91dChfdGltZW91dEhhbmRsZSk7XG4gICAgICB9XG4gICAgICByZW5kZXJSb290KHJvb3QsIGlzWWllbGR5KTtcbiAgICAgIF9maW5pc2hlZFdvcmsgPSByb290LmZpbmlzaGVkV29yaztcbiAgICAgIGlmIChfZmluaXNoZWRXb3JrICE9PSBudWxsKSB7XG4gICAgICAgIC8vIFdlJ3ZlIGNvbXBsZXRlZCB0aGUgcm9vdC4gQ2hlY2sgdGhlIGlmIHdlIHNob3VsZCB5aWVsZCBvbmUgbW9yZSB0aW1lXG4gICAgICAgIC8vIGJlZm9yZSBjb21taXR0aW5nLlxuICAgICAgICBpZiAoIXNob3VsZFlpZWxkVG9SZW5kZXJlcigpKSB7XG4gICAgICAgICAgLy8gU3RpbGwgdGltZSBsZWZ0LiBDb21taXQgdGhlIHJvb3QuXG4gICAgICAgICAgY29tcGxldGVSb290KHJvb3QsIF9maW5pc2hlZFdvcmssIGV4cGlyYXRpb25UaW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUaGVyZSdzIG5vIHRpbWUgbGVmdC4gTWFyayB0aGlzIHJvb3QgYXMgY29tcGxldGUuIFdlJ2xsIGNvbWVcbiAgICAgICAgICAvLyBiYWNrIGFuZCBjb21taXQgaXQgbGF0ZXIuXG4gICAgICAgICAgcm9vdC5maW5pc2hlZFdvcmsgPSBfZmluaXNoZWRXb3JrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gY29tcGxldGVSb290KHJvb3QsIGZpbmlzaGVkV29yaywgZXhwaXJhdGlvblRpbWUpIHtcbiAgLy8gQ2hlY2sgaWYgdGhlcmUncyBhIGJhdGNoIHRoYXQgbWF0Y2hlcyB0aGlzIGV4cGlyYXRpb24gdGltZS5cbiAgdmFyIGZpcnN0QmF0Y2ggPSByb290LmZpcnN0QmF0Y2g7XG4gIGlmIChmaXJzdEJhdGNoICE9PSBudWxsICYmIGZpcnN0QmF0Y2guX2V4cGlyYXRpb25UaW1lID49IGV4cGlyYXRpb25UaW1lKSB7XG4gICAgaWYgKGNvbXBsZXRlZEJhdGNoZXMgPT09IG51bGwpIHtcbiAgICAgIGNvbXBsZXRlZEJhdGNoZXMgPSBbZmlyc3RCYXRjaF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBsZXRlZEJhdGNoZXMucHVzaChmaXJzdEJhdGNoKTtcbiAgICB9XG4gICAgaWYgKGZpcnN0QmF0Y2guX2RlZmVyKSB7XG4gICAgICAvLyBUaGlzIHJvb3QgaXMgYmxvY2tlZCBmcm9tIGNvbW1pdHRpbmcgYnkgYSBiYXRjaC4gVW5zY2hlZHVsZSBpdCB1bnRpbFxuICAgICAgLy8gd2UgcmVjZWl2ZSBhbm90aGVyIHVwZGF0ZS5cbiAgICAgIHJvb3QuZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrO1xuICAgICAgcm9vdC5leHBpcmF0aW9uVGltZSA9IE5vV29yaztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvLyBDb21taXQgdGhlIHJvb3QuXG4gIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcblxuICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgbmVzdGVkIHVwZGF0ZSAoYSBzeW5jIHVwZGF0ZSBzY2hlZHVsZWQgZHVyaW5nIHRoZVxuICAvLyBjb21taXQgcGhhc2UpLlxuICBpZiAocm9vdCA9PT0gbGFzdENvbW1pdHRlZFJvb3REdXJpbmdUaGlzQmF0Y2gpIHtcbiAgICAvLyBJZiB0aGUgbmV4dCByb290IGlzIHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyByb290LCB0aGlzIGlzIGEgbmVzdGVkXG4gICAgLy8gdXBkYXRlLiBUbyBwcmV2ZW50IGFuIGluZmluaXRlIGxvb3AsIGluY3JlbWVudCB0aGUgbmVzdGVkIHVwZGF0ZSBjb3VudC5cbiAgICBuZXN0ZWRVcGRhdGVDb3VudCsrO1xuICB9IGVsc2Uge1xuICAgIC8vIFJlc2V0IHdoZW5ldmVyIHdlIHN3aXRjaCByb290cy5cbiAgICBsYXN0Q29tbWl0dGVkUm9vdER1cmluZ1RoaXNCYXRjaCA9IHJvb3Q7XG4gICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICB9XG4gIHNjaGVkdWxlci51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHkoc2NoZWR1bGVyLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgY29tbWl0Um9vdChyb290LCBmaW5pc2hlZFdvcmspO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb25VbmNhdWdodEVycm9yKGVycm9yKSB7XG4gICEobmV4dEZsdXNoZWRSb290ICE9PSBudWxsKSA/IGludmFyaWFudChmYWxzZSwgJ1Nob3VsZCBiZSB3b3JraW5nIG9uIGEgcm9vdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKSA6IHZvaWQgMDtcbiAgLy8gVW5zY2hlZHVsZSB0aGlzIHJvb3Qgc28gd2UgZG9uJ3Qgd29yayBvbiBpdCBhZ2FpbiB1bnRpbCB0aGVyZSdzXG4gIC8vIGFub3RoZXIgdXBkYXRlLlxuICBuZXh0Rmx1c2hlZFJvb3QuZXhwaXJhdGlvblRpbWUgPSBOb1dvcms7XG4gIGlmICghaGFzVW5oYW5kbGVkRXJyb3IpIHtcbiAgICBoYXNVbmhhbmRsZWRFcnJvciA9IHRydWU7XG4gICAgdW5oYW5kbGVkRXJyb3IgPSBlcnJvcjtcbiAgfVxufVxuXG4vLyBUT0RPOiBCYXRjaGluZyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYXQgdGhlIHJlbmRlcmVyIGxldmVsLCBub3QgaW5zaWRlXG4vLyB0aGUgcmVjb25jaWxlci5cbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzJDEoZm4sIGEpIHtcbiAgdmFyIHByZXZpb3VzSXNCYXRjaGluZ1VwZGF0ZXMgPSBpc0JhdGNoaW5nVXBkYXRlcztcbiAgaXNCYXRjaGluZ1VwZGF0ZXMgPSB0cnVlO1xuICB0cnkge1xuICAgIHJldHVybiBmbihhKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpc0JhdGNoaW5nVXBkYXRlcyA9IHByZXZpb3VzSXNCYXRjaGluZ1VwZGF0ZXM7XG4gICAgaWYgKCFpc0JhdGNoaW5nVXBkYXRlcyAmJiAhaXNSZW5kZXJpbmcpIHtcbiAgICAgIHBlcmZvcm1TeW5jV29yaygpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUT0RPOiBCYXRjaGluZyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYXQgdGhlIHJlbmRlcmVyIGxldmVsLCBub3QgaW5zaWRlXG4vLyB0aGUgcmVjb25jaWxlci5cbmZ1bmN0aW9uIHVuYmF0Y2hlZFVwZGF0ZXMoZm4sIGEpIHtcbiAgaWYgKGlzQmF0Y2hpbmdVcGRhdGVzICYmICFpc1VuYmF0Y2hpbmdVcGRhdGVzKSB7XG4gICAgaXNVbmJhdGNoaW5nVXBkYXRlcyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmbihhKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaXNVbmJhdGNoaW5nVXBkYXRlcyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZm4oYSk7XG59XG5cbi8vIFRPRE86IEJhdGNoaW5nIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBhdCB0aGUgcmVuZGVyZXIgbGV2ZWwsIG5vdCB3aXRoaW5cbi8vIHRoZSByZWNvbmNpbGVyLlxuZnVuY3Rpb24gZmx1c2hTeW5jKGZuLCBhKSB7XG4gICEhaXNSZW5kZXJpbmcgPyBpbnZhcmlhbnQoZmFsc2UsICdmbHVzaFN5bmMgd2FzIGNhbGxlZCBmcm9tIGluc2lkZSBhIGxpZmVjeWNsZSBtZXRob2QuIEl0IGNhbm5vdCBiZSBjYWxsZWQgd2hlbiBSZWFjdCBpcyBhbHJlYWR5IHJlbmRlcmluZy4nKSA6IHZvaWQgMDtcbiAgdmFyIHByZXZpb3VzSXNCYXRjaGluZ1VwZGF0ZXMgPSBpc0JhdGNoaW5nVXBkYXRlcztcbiAgaXNCYXRjaGluZ1VwZGF0ZXMgPSB0cnVlO1xuICB0cnkge1xuICAgIHJldHVybiBzeW5jVXBkYXRlcyhmbiwgYSk7XG4gIH0gZmluYWxseSB7XG4gICAgaXNCYXRjaGluZ1VwZGF0ZXMgPSBwcmV2aW91c0lzQmF0Y2hpbmdVcGRhdGVzO1xuICAgIHBlcmZvcm1TeW5jV29yaygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludGVyYWN0aXZlVXBkYXRlcyQxKGZuLCBhLCBiKSB7XG4gIC8vIElmIHRoZXJlIGFyZSBhbnkgcGVuZGluZyBpbnRlcmFjdGl2ZSB1cGRhdGVzLCBzeW5jaHJvbm91c2x5IGZsdXNoIHRoZW0uXG4gIC8vIFRoaXMgbmVlZHMgdG8gaGFwcGVuIGJlZm9yZSB3ZSByZWFkIGFueSBoYW5kbGVycywgYmVjYXVzZSB0aGUgZWZmZWN0IG9mXG4gIC8vIHRoZSBwcmV2aW91cyBldmVudCBtYXkgaW5mbHVlbmNlIHdoaWNoIGhhbmRsZXJzIGFyZSBjYWxsZWQgZHVyaW5nXG4gIC8vIHRoaXMgZXZlbnQuXG4gIGlmICghaXNCYXRjaGluZ1VwZGF0ZXMgJiYgIWlzUmVuZGVyaW5nICYmIGxvd2VzdFByaW9yaXR5UGVuZGluZ0ludGVyYWN0aXZlRXhwaXJhdGlvblRpbWUgIT09IE5vV29yaykge1xuICAgIC8vIFN5bmNocm9ub3VzbHkgZmx1c2ggcGVuZGluZyBpbnRlcmFjdGl2ZSB1cGRhdGVzLlxuICAgIHBlcmZvcm1Xb3JrKGxvd2VzdFByaW9yaXR5UGVuZGluZ0ludGVyYWN0aXZlRXhwaXJhdGlvblRpbWUsIGZhbHNlKTtcbiAgICBsb3dlc3RQcmlvcml0eVBlbmRpbmdJbnRlcmFjdGl2ZUV4cGlyYXRpb25UaW1lID0gTm9Xb3JrO1xuICB9XG4gIHZhciBwcmV2aW91c0lzQmF0Y2hpbmdVcGRhdGVzID0gaXNCYXRjaGluZ1VwZGF0ZXM7XG4gIGlzQmF0Y2hpbmdVcGRhdGVzID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gc2NoZWR1bGVyLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eShzY2hlZHVsZXIudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmbihhLCBiKTtcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpc0JhdGNoaW5nVXBkYXRlcyA9IHByZXZpb3VzSXNCYXRjaGluZ1VwZGF0ZXM7XG4gICAgaWYgKCFpc0JhdGNoaW5nVXBkYXRlcyAmJiAhaXNSZW5kZXJpbmcpIHtcbiAgICAgIHBlcmZvcm1TeW5jV29yaygpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaEludGVyYWN0aXZlVXBkYXRlcyQxKCkge1xuICBpZiAoIWlzUmVuZGVyaW5nICYmIGxvd2VzdFByaW9yaXR5UGVuZGluZ0ludGVyYWN0aXZlRXhwaXJhdGlvblRpbWUgIT09IE5vV29yaykge1xuICAgIC8vIFN5bmNocm9ub3VzbHkgZmx1c2ggcGVuZGluZyBpbnRlcmFjdGl2ZSB1cGRhdGVzLlxuICAgIHBlcmZvcm1Xb3JrKGxvd2VzdFByaW9yaXR5UGVuZGluZ0ludGVyYWN0aXZlRXhwaXJhdGlvblRpbWUsIGZhbHNlKTtcbiAgICBsb3dlc3RQcmlvcml0eVBlbmRpbmdJbnRlcmFjdGl2ZUV4cGlyYXRpb25UaW1lID0gTm9Xb3JrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoQ29udHJvbGxlZChmbikge1xuICB2YXIgcHJldmlvdXNJc0JhdGNoaW5nVXBkYXRlcyA9IGlzQmF0Y2hpbmdVcGRhdGVzO1xuICBpc0JhdGNoaW5nVXBkYXRlcyA9IHRydWU7XG4gIHRyeSB7XG4gICAgc3luY1VwZGF0ZXMoZm4pO1xuICB9IGZpbmFsbHkge1xuICAgIGlzQmF0Y2hpbmdVcGRhdGVzID0gcHJldmlvdXNJc0JhdGNoaW5nVXBkYXRlcztcbiAgICBpZiAoIWlzQmF0Y2hpbmdVcGRhdGVzICYmICFpc1JlbmRlcmluZykge1xuICAgICAgcGVyZm9ybVN5bmNXb3JrKCk7XG4gICAgfVxuICB9XG59XG5cbi8vIDAgaXMgUFJPRCwgMSBpcyBERVYuXG4vLyBNaWdodCBhZGQgUFJPRklMRSBsYXRlci5cblxuXG52YXIgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcyA9IHZvaWQgMDtcbnZhciBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZSA9IHZvaWQgMDtcblxue1xuICBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlID0ge307XG59XG5cbmZ1bmN0aW9uIGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCkge1xuICBpZiAoIXBhcmVudENvbXBvbmVudCkge1xuICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQocGFyZW50Q29tcG9uZW50KTtcbiAgdmFyIHBhcmVudENvbnRleHQgPSBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcik7XG5cbiAgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICB2YXIgQ29tcG9uZW50ID0gZmliZXIudHlwZTtcbiAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgcmV0dXJuIHByb2Nlc3NDaGlsZENvbnRleHQoZmliZXIsIENvbXBvbmVudCwgcGFyZW50Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcmVudENvbnRleHQ7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlUm9vdFVwZGF0ZShjdXJyZW50JCQxLCBlbGVtZW50LCBleHBpcmF0aW9uVGltZSwgY2FsbGJhY2spIHtcbiAge1xuICAgIGlmIChwaGFzZSA9PT0gJ3JlbmRlcicgJiYgY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcykge1xuICAgICAgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcyA9IHRydWU7XG4gICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdSZW5kZXIgbWV0aG9kcyBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZTsgJyArICd0cmlnZ2VyaW5nIG5lc3RlZCBjb21wb25lbnQgdXBkYXRlcyBmcm9tIHJlbmRlciBpcyBub3QgYWxsb3dlZC4gJyArICdJZiBuZWNlc3NhcnksIHRyaWdnZXIgbmVzdGVkIHVwZGF0ZXMgaW4gY29tcG9uZW50RGlkVXBkYXRlLlxcblxcbicgKyAnQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgJXMuJywgZ2V0Q29tcG9uZW50TmFtZShjdXJyZW50LnR5cGUpIHx8ICdVbmtub3duJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShleHBpcmF0aW9uVGltZSk7XG4gIC8vIENhdXRpb246IFJlYWN0IERldlRvb2xzIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJvcGVydHlcbiAgLy8gYmVpbmcgY2FsbGVkIFwiZWxlbWVudFwiLlxuICB1cGRhdGUucGF5bG9hZCA9IHsgZWxlbWVudDogZWxlbWVudCB9O1xuXG4gIGNhbGxiYWNrID0gY2FsbGJhY2sgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjaztcbiAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgISh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAncmVuZGVyKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsYmFjaykgOiB2b2lkIDA7XG4gICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gIH1cblxuICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gIGVucXVldWVVcGRhdGUoY3VycmVudCQkMSwgdXBkYXRlKTtcbiAgc2NoZWR1bGVXb3JrKGN1cnJlbnQkJDEsIGV4cGlyYXRpb25UaW1lKTtcblxuICByZXR1cm4gZXhwaXJhdGlvblRpbWU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRhaW5lckF0RXhwaXJhdGlvblRpbWUoZWxlbWVudCwgY29udGFpbmVyLCBwYXJlbnRDb21wb25lbnQsIGV4cGlyYXRpb25UaW1lLCBjYWxsYmFjaykge1xuICAvLyBUT0RPOiBJZiB0aGlzIGlzIGEgbmVzdGVkIGNvbnRhaW5lciwgdGhpcyB3b24ndCBiZSB0aGUgcm9vdC5cbiAgdmFyIGN1cnJlbnQkJDEgPSBjb250YWluZXIuY3VycmVudDtcblxuICB7XG4gICAgaWYgKFJlYWN0RmliZXJJbnN0cnVtZW50YXRpb25fMS5kZWJ1Z1Rvb2wpIHtcbiAgICAgIGlmIChjdXJyZW50JCQxLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICBSZWFjdEZpYmVySW5zdHJ1bWVudGF0aW9uXzEuZGVidWdUb29sLm9uTW91bnRDb250YWluZXIoY29udGFpbmVyKTtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICBSZWFjdEZpYmVySW5zdHJ1bWVudGF0aW9uXzEuZGVidWdUb29sLm9uVW5tb3VudENvbnRhaW5lcihjb250YWluZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgUmVhY3RGaWJlckluc3RydW1lbnRhdGlvbl8xLmRlYnVnVG9vbC5vblVwZGF0ZUNvbnRhaW5lcihjb250YWluZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBjb250ZXh0ID0gZ2V0Q29udGV4dEZvclN1YnRyZWUocGFyZW50Q29tcG9uZW50KTtcbiAgaWYgKGNvbnRhaW5lci5jb250ZXh0ID09PSBudWxsKSB7XG4gICAgY29udGFpbmVyLmNvbnRleHQgPSBjb250ZXh0O1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5wZW5kaW5nQ29udGV4dCA9IGNvbnRleHQ7XG4gIH1cblxuICByZXR1cm4gc2NoZWR1bGVSb290VXBkYXRlKGN1cnJlbnQkJDEsIGVsZW1lbnQsIGV4cGlyYXRpb25UaW1lLCBjYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2UoY29tcG9uZW50KSB7XG4gIHZhciBmaWJlciA9IGdldChjb21wb25lbnQpO1xuICBpZiAoZmliZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2YgY29tcG9uZW50LnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW52YXJpYW50KGZhbHNlLCAnVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnZhcmlhbnQoZmFsc2UsICdBcmd1bWVudCBhcHBlYXJzIHRvIG5vdCBiZSBhIFJlYWN0Q29tcG9uZW50LiBLZXlzOiAlcycsIE9iamVjdC5rZXlzKGNvbXBvbmVudCkpO1xuICAgIH1cbiAgfVxuICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXIoZmliZXIpO1xuICBpZiAoaG9zdEZpYmVyID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VXaXRoV2FybmluZyhjb21wb25lbnQsIG1ldGhvZE5hbWUpIHtcbiAge1xuICAgIHZhciBmaWJlciA9IGdldChjb21wb25lbnQpO1xuICAgIGlmIChmaWJlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW52YXJpYW50KGZhbHNlLCAnVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW52YXJpYW50KGZhbHNlLCAnQXJndW1lbnQgYXBwZWFycyB0byBub3QgYmUgYSBSZWFjdENvbXBvbmVudC4gS2V5czogJXMnLCBPYmplY3Qua2V5cyhjb21wb25lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGhvc3RGaWJlciA9IGZpbmRDdXJyZW50SG9zdEZpYmVyKGZpYmVyKTtcbiAgICBpZiAoaG9zdEZpYmVyID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGhvc3RGaWJlci5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnO1xuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZVtjb21wb25lbnROYW1lXSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZVtjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzIGlzIGRlcHJlY2F0ZWQgaW4gU3RyaWN0TW9kZS4gJyArICclcyB3YXMgcGFzc2VkIGFuIGluc3RhbmNlIG9mICVzIHdoaWNoIGlzIGluc2lkZSBTdHJpY3RNb2RlLiAnICsgJ0luc3RlYWQsIGFkZCBhIHJlZiBkaXJlY3RseSB0byB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byByZWZlcmVuY2UuJyArICdcXG4lcycgKyAnXFxuXFxuTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOicgKyAnXFxuaHR0cHM6Ly9mYi5tZS9yZWFjdC1zdHJpY3QtbW9kZS1maW5kLW5vZGUnLCBtZXRob2ROYW1lLCBtZXRob2ROYW1lLCBjb21wb25lbnROYW1lLCBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2QoaG9zdEZpYmVyKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnJXMgaXMgZGVwcmVjYXRlZCBpbiBTdHJpY3RNb2RlLiAnICsgJyVzIHdhcyBwYXNzZWQgYW4gaW5zdGFuY2Ugb2YgJXMgd2hpY2ggcmVuZGVycyBTdHJpY3RNb2RlIGNoaWxkcmVuLiAnICsgJ0luc3RlYWQsIGFkZCBhIHJlZiBkaXJlY3RseSB0byB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byByZWZlcmVuY2UuJyArICdcXG4lcycgKyAnXFxuXFxuTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOicgKyAnXFxuaHR0cHM6Ly9mYi5tZS9yZWFjdC1zdHJpY3QtbW9kZS1maW5kLW5vZGUnLCBtZXRob2ROYW1lLCBtZXRob2ROYW1lLCBjb21wb25lbnROYW1lLCBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2QoaG9zdEZpYmVyKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG4gIH1cbiAgcmV0dXJuIGZpbmRIb3N0SW5zdGFuY2UoY29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lckluZm8sIGlzQ29uY3VycmVudCwgaHlkcmF0ZSkge1xuICByZXR1cm4gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIGlzQ29uY3VycmVudCwgaHlkcmF0ZSk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRhaW5lcihlbGVtZW50LCBjb250YWluZXIsIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2spIHtcbiAgdmFyIGN1cnJlbnQkJDEgPSBjb250YWluZXIuY3VycmVudDtcbiAgdmFyIGN1cnJlbnRUaW1lID0gcmVxdWVzdEN1cnJlbnRUaW1lKCk7XG4gIHZhciBleHBpcmF0aW9uVGltZSA9IGNvbXB1dGVFeHBpcmF0aW9uRm9yRmliZXIoY3VycmVudFRpbWUsIGN1cnJlbnQkJDEpO1xuICByZXR1cm4gdXBkYXRlQ29udGFpbmVyQXRFeHBpcmF0aW9uVGltZShlbGVtZW50LCBjb250YWluZXIsIHBhcmVudENvbXBvbmVudCwgZXhwaXJhdGlvblRpbWUsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gZ2V0UHVibGljUm9vdEluc3RhbmNlKGNvbnRhaW5lcikge1xuICB2YXIgY29udGFpbmVyRmliZXIgPSBjb250YWluZXIuY3VycmVudDtcbiAgaWYgKCFjb250YWluZXJGaWJlci5jaGlsZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHN3aXRjaCAoY29udGFpbmVyRmliZXIuY2hpbGQudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGdldFB1YmxpY0luc3RhbmNlKGNvbnRhaW5lckZpYmVyLmNoaWxkLnN0YXRlTm9kZSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBjb250YWluZXJGaWJlci5jaGlsZC5zdGF0ZU5vZGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZVdpdGhOb1BvcnRhbHMoZmliZXIpIHtcbiAgdmFyIGhvc3RGaWJlciA9IGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFscyhmaWJlcik7XG4gIGlmIChob3N0RmliZXIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gaG9zdEZpYmVyLnN0YXRlTm9kZTtcbn1cblxudmFyIG92ZXJyaWRlUHJvcHMgPSBudWxsO1xuXG57XG4gIHZhciBjb3B5V2l0aFNldEltcGwgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCBpZHgsIHZhbHVlKSB7XG4gICAgaWYgKGlkeCA+PSBwYXRoLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICB2YXIga2V5ID0gcGF0aFtpZHhdO1xuICAgIHZhciB1cGRhdGVkID0gQXJyYXkuaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBfYXNzaWduKHt9LCBvYmopO1xuICAgIC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcbiAgICB1cGRhdGVkW2tleV0gPSBjb3B5V2l0aFNldEltcGwob2JqW2tleV0sIHBhdGgsIGlkeCArIDEsIHZhbHVlKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhTZXQgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCB2YWx1ZSkge1xuICAgIHJldHVybiBjb3B5V2l0aFNldEltcGwob2JqLCBwYXRoLCAwLCB2YWx1ZSk7XG4gIH07XG5cbiAgLy8gU3VwcG9ydCBEZXZUb29scyBwcm9wcyBmb3IgZnVuY3Rpb24gY29tcG9uZW50cywgZm9yd2FyZFJlZiwgbWVtbywgaG9zdCBjb21wb25lbnRzLCBldGMuXG4gIG92ZXJyaWRlUHJvcHMgPSBmdW5jdGlvbiAoZmliZXIsIHBhdGgsIHZhbHVlKSB7XG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IGNvcHlXaXRoU2V0KGZpYmVyLm1lbW9pemVkUHJvcHMsIHBhdGgsIHZhbHVlKTtcbiAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgICBmaWJlci5hbHRlcm5hdGUucGVuZGluZ1Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgIH1cbiAgICBzY2hlZHVsZVdvcmsoZmliZXIsIFN5bmMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBpbmplY3RJbnRvRGV2VG9vbHMoZGV2VG9vbHNDb25maWcpIHtcbiAgdmFyIGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlID0gZGV2VG9vbHNDb25maWcuZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U7XG4gIHZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcblxuXG4gIHJldHVybiBpbmplY3RJbnRlcm5hbHMoX2Fzc2lnbih7fSwgZGV2VG9vbHNDb25maWcsIHtcbiAgICBvdmVycmlkZVByb3BzOiBvdmVycmlkZVByb3BzLFxuICAgIGN1cnJlbnREaXNwYXRjaGVyUmVmOiBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICAgIGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyOiBmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcihmaWJlcik7XG4gICAgICBpZiAoaG9zdEZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG4gICAgfSxcbiAgICBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTogZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgICBpZiAoIWZpbmRGaWJlckJ5SG9zdEluc3RhbmNlKSB7XG4gICAgICAgIC8vIE1pZ2h0IG5vdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgcmVuZGVyZXIuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlKGluc3RhbmNlKTtcbiAgICB9XG4gIH0pKTtcbn1cblxuLy8gVGhpcyBmaWxlIGludGVudGlvbmFsbHkgZG9lcyAqbm90KiBoYXZlIHRoZSBGbG93IGFubm90YXRpb24uXG4vLyBEb24ndCBhZGQgaXQuIFNlZSBgLi9pbmxpbmUtdHlwZWQuanNgIGZvciBhbiBleHBsYW5hdGlvbi5cblxuZnVuY3Rpb24gY3JlYXRlUG9ydGFsJDEoY2hpbGRyZW4sIGNvbnRhaW5lckluZm8sXG4vLyBUT0RPOiBmaWd1cmUgb3V0IHRoZSBBUEkgZm9yIGNyb3NzLXJlbmRlcmVyIGltcGxlbWVudGF0aW9uLlxuaW1wbGVtZW50YXRpb24pIHtcbiAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbnVsbDtcblxuICByZXR1cm4ge1xuICAgIC8vIFRoaXMgdGFnIGFsbG93IHVzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgYXMgYSBSZWFjdCBQb3J0YWxcbiAgICAkJHR5cGVvZjogUkVBQ1RfUE9SVEFMX1RZUEUsXG4gICAga2V5OiBrZXkgPT0gbnVsbCA/IG51bGwgOiAnJyArIGtleSxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4sXG4gICAgY29udGFpbmVySW5mbzogY29udGFpbmVySW5mbyxcbiAgICBpbXBsZW1lbnRhdGlvbjogaW1wbGVtZW50YXRpb25cbiAgfTtcbn1cblxuLy8gVE9ETzogdGhpcyBpcyBzcGVjaWFsIGJlY2F1c2UgaXQgZ2V0cyBpbXBvcnRlZCBkdXJpbmcgYnVpbGQuXG5cbnZhciBSZWFjdFZlcnNpb24gPSAnMTYuOC42JztcblxuLy8gVE9ETzogVGhpcyB0eXBlIGlzIHNoYXJlZCBiZXR3ZWVuIHRoZSByZWNvbmNpbGVyIGFuZCBSZWFjdERPTSwgYnV0IHdpbGxcbi8vIGV2ZW50dWFsbHkgYmUgbGlmdGVkIG91dCB0byB0aGUgcmVuZGVyZXIuXG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xuXG52YXIgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncyA9IHZvaWQgMDtcbnZhciB3YXJuT25JbnZhbGlkQ2FsbGJhY2sgPSB2b2lkIDA7XG52YXIgZGlkV2FybkFib3V0VW5zdGFibGVDcmVhdGVQb3J0YWwgPSBmYWxzZTtcblxue1xuICBpZiAodHlwZW9mIE1hcCAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAvLyAkRmxvd0lzc3VlIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIE1hcCBoYXMgbm8gcHJvdG90eXBlXG4gIE1hcC5wcm90b3R5cGUgPT0gbnVsbCB8fCB0eXBlb2YgTWFwLnByb3RvdHlwZS5mb3JFYWNoICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBTZXQgIT09ICdmdW5jdGlvbicgfHxcbiAgLy8gJEZsb3dJc3N1ZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBTZXQgaGFzIG5vIHByb3RvdHlwZVxuICBTZXQucHJvdG90eXBlID09IG51bGwgfHwgdHlwZW9mIFNldC5wcm90b3R5cGUuY2xlYXIgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIFNldC5wcm90b3R5cGUuZm9yRWFjaCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1JlYWN0IGRlcGVuZHMgb24gTWFwIGFuZCBTZXQgYnVpbHQtaW4gdHlwZXMuIE1ha2Ugc3VyZSB0aGF0IHlvdSBsb2FkIGEgJyArICdwb2x5ZmlsbCBpbiBvbGRlciBicm93c2Vycy4gaHR0cHM6Ly9mYi5tZS9yZWFjdC1wb2x5ZmlsbHMnKTtcbiAgfVxuXG4gIHRvcExldmVsVXBkYXRlV2FybmluZ3MgPSBmdW5jdGlvbiAoY29udGFpbmVyKSB7XG4gICAgaWYgKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyICYmIGNvbnRhaW5lci5ub2RlVHlwZSAhPT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgaG9zdEluc3RhbmNlID0gZmluZEhvc3RJbnN0YW5jZVdpdGhOb1BvcnRhbHMoY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIuX2ludGVybmFsUm9vdC5jdXJyZW50KTtcbiAgICAgIGlmIChob3N0SW5zdGFuY2UpIHtcbiAgICAgICAgIShob3N0SW5zdGFuY2UucGFyZW50Tm9kZSA9PT0gY29udGFpbmVyKSA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ3JlbmRlciguLi4pOiBJdCBsb29rcyBsaWtlIHRoZSBSZWFjdC1yZW5kZXJlZCBjb250ZW50IG9mIHRoaXMgJyArICdjb250YWluZXIgd2FzIHJlbW92ZWQgd2l0aG91dCB1c2luZyBSZWFjdC4gVGhpcyBpcyBub3QgJyArICdzdXBwb3J0ZWQgYW5kIHdpbGwgY2F1c2UgZXJyb3JzLiBJbnN0ZWFkLCBjYWxsICcgKyAnUmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZSB0byBlbXB0eSBhIGNvbnRhaW5lci4nKSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaXNSb290UmVuZGVyZWRCeVNvbWVSZWFjdCA9ICEhY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXI7XG4gICAgdmFyIHJvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICAgIHZhciBoYXNOb25Sb290UmVhY3RDaGlsZCA9ICEhKHJvb3RFbCAmJiBnZXRJbnN0YW5jZUZyb21Ob2RlJDEocm9vdEVsKSk7XG5cbiAgICAhKCFoYXNOb25Sb290UmVhY3RDaGlsZCB8fCBpc1Jvb3RSZW5kZXJlZEJ5U29tZVJlYWN0KSA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ3JlbmRlciguLi4pOiBSZXBsYWNpbmcgUmVhY3QtcmVuZGVyZWQgY2hpbGRyZW4gd2l0aCBhIG5ldyByb290ICcgKyAnY29tcG9uZW50LiBJZiB5b3UgaW50ZW5kZWQgdG8gdXBkYXRlIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUsICcgKyAneW91IHNob3VsZCBpbnN0ZWFkIGhhdmUgdGhlIGV4aXN0aW5nIGNoaWxkcmVuIHVwZGF0ZSB0aGVpciBzdGF0ZSAnICsgJ2FuZCByZW5kZXIgdGhlIG5ldyBjb21wb25lbnRzIGluc3RlYWQgb2YgY2FsbGluZyBSZWFjdERPTS5yZW5kZXIuJykgOiB2b2lkIDA7XG5cbiAgICAhKGNvbnRhaW5lci5ub2RlVHlwZSAhPT0gRUxFTUVOVF9OT0RFIHx8ICFjb250YWluZXIudGFnTmFtZSB8fCBjb250YWluZXIudGFnTmFtZS50b1VwcGVyQ2FzZSgpICE9PSAnQk9EWScpID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAncmVuZGVyKCk6IFJlbmRlcmluZyBjb21wb25lbnRzIGRpcmVjdGx5IGludG8gZG9jdW1lbnQuYm9keSBpcyAnICsgJ2Rpc2NvdXJhZ2VkLCBzaW5jZSBpdHMgY2hpbGRyZW4gYXJlIG9mdGVuIG1hbmlwdWxhdGVkIGJ5IHRoaXJkLXBhcnR5ICcgKyAnc2NyaXB0cyBhbmQgYnJvd3NlciBleHRlbnNpb25zLiBUaGlzIG1heSBsZWFkIHRvIHN1YnRsZSAnICsgJ3JlY29uY2lsaWF0aW9uIGlzc3Vlcy4gVHJ5IHJlbmRlcmluZyBpbnRvIGEgY29udGFpbmVyIGVsZW1lbnQgY3JlYXRlZCAnICsgJ2ZvciB5b3VyIGFwcC4nKSA6IHZvaWQgMDtcbiAgfTtcblxuICB3YXJuT25JbnZhbGlkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICAhKGNhbGxiYWNrID09PSBudWxsIHx8IHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICclcyguLi4pOiBFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGVyTmFtZSwgY2FsbGJhY2spIDogdm9pZCAwO1xuICB9O1xufVxuXG5zZXRSZXN0b3JlSW1wbGVtZW50YXRpb24ocmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQxKTtcblxuZnVuY3Rpb24gUmVhY3RCYXRjaChyb290KSB7XG4gIHZhciBleHBpcmF0aW9uVGltZSA9IGNvbXB1dGVVbmlxdWVBc3luY0V4cGlyYXRpb24oKTtcbiAgdGhpcy5fZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTtcbiAgdGhpcy5fcm9vdCA9IHJvb3Q7XG4gIHRoaXMuX25leHQgPSBudWxsO1xuICB0aGlzLl9jYWxsYmFja3MgPSBudWxsO1xuICB0aGlzLl9kaWRDb21wbGV0ZSA9IGZhbHNlO1xuICB0aGlzLl9oYXNDaGlsZHJlbiA9IGZhbHNlO1xuICB0aGlzLl9jaGlsZHJlbiA9IG51bGw7XG4gIHRoaXMuX2RlZmVyID0gdHJ1ZTtcbn1cblJlYWN0QmF0Y2gucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIChjaGlsZHJlbikge1xuICAhdGhpcy5fZGVmZXIgPyBpbnZhcmlhbnQoZmFsc2UsICdiYXRjaC5yZW5kZXI6IENhbm5vdCByZW5kZXIgYSBiYXRjaCB0aGF0IGFscmVhZHkgY29tbWl0dGVkLicpIDogdm9pZCAwO1xuICB0aGlzLl9oYXNDaGlsZHJlbiA9IHRydWU7XG4gIHRoaXMuX2NoaWxkcmVuID0gY2hpbGRyZW47XG4gIHZhciBpbnRlcm5hbFJvb3QgPSB0aGlzLl9yb290Ll9pbnRlcm5hbFJvb3Q7XG4gIHZhciBleHBpcmF0aW9uVGltZSA9IHRoaXMuX2V4cGlyYXRpb25UaW1lO1xuICB2YXIgd29yayA9IG5ldyBSZWFjdFdvcmsoKTtcbiAgdXBkYXRlQ29udGFpbmVyQXRFeHBpcmF0aW9uVGltZShjaGlsZHJlbiwgaW50ZXJuYWxSb290LCBudWxsLCBleHBpcmF0aW9uVGltZSwgd29yay5fb25Db21taXQpO1xuICByZXR1cm4gd29yaztcbn07XG5SZWFjdEJhdGNoLnByb3RvdHlwZS50aGVuID0gZnVuY3Rpb24gKG9uQ29tcGxldGUpIHtcbiAgaWYgKHRoaXMuX2RpZENvbXBsZXRlKSB7XG4gICAgb25Db21wbGV0ZSgpO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzO1xuICBpZiAoY2FsbGJhY2tzID09PSBudWxsKSB7XG4gICAgY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzID0gW107XG4gIH1cbiAgY2FsbGJhY2tzLnB1c2gob25Db21wbGV0ZSk7XG59O1xuUmVhY3RCYXRjaC5wcm90b3R5cGUuY29tbWl0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaW50ZXJuYWxSb290ID0gdGhpcy5fcm9vdC5faW50ZXJuYWxSb290O1xuICB2YXIgZmlyc3RCYXRjaCA9IGludGVybmFsUm9vdC5maXJzdEJhdGNoO1xuICAhKHRoaXMuX2RlZmVyICYmIGZpcnN0QmF0Y2ggIT09IG51bGwpID8gaW52YXJpYW50KGZhbHNlLCAnYmF0Y2guY29tbWl0OiBDYW5ub3QgY29tbWl0IGEgYmF0Y2ggbXVsdGlwbGUgdGltZXMuJykgOiB2b2lkIDA7XG5cbiAgaWYgKCF0aGlzLl9oYXNDaGlsZHJlbikge1xuICAgIC8vIFRoaXMgYmF0Y2ggaXMgZW1wdHkuIFJldHVybi5cbiAgICB0aGlzLl9uZXh0ID0gbnVsbDtcbiAgICB0aGlzLl9kZWZlciA9IGZhbHNlO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBleHBpcmF0aW9uVGltZSA9IHRoaXMuX2V4cGlyYXRpb25UaW1lO1xuXG4gIC8vIEVuc3VyZSB0aGlzIGlzIHRoZSBmaXJzdCBiYXRjaCBpbiB0aGUgbGlzdC5cbiAgaWYgKGZpcnN0QmF0Y2ggIT09IHRoaXMpIHtcbiAgICAvLyBUaGlzIGJhdGNoIGlzIG5vdCB0aGUgZWFybGllc3QgYmF0Y2guIFdlIG5lZWQgdG8gbW92ZSBpdCB0byB0aGUgZnJvbnQuXG4gICAgLy8gVXBkYXRlIGl0cyBleHBpcmF0aW9uIHRpbWUgdG8gYmUgdGhlIGV4cGlyYXRpb24gdGltZSBvZiB0aGUgZWFybGllc3RcbiAgICAvLyBiYXRjaCwgc28gdGhhdCB3ZSBjYW4gZmx1c2ggaXQgd2l0aG91dCBmbHVzaGluZyB0aGUgb3RoZXIgYmF0Y2hlcy5cbiAgICBpZiAodGhpcy5faGFzQ2hpbGRyZW4pIHtcbiAgICAgIGV4cGlyYXRpb25UaW1lID0gdGhpcy5fZXhwaXJhdGlvblRpbWUgPSBmaXJzdEJhdGNoLl9leHBpcmF0aW9uVGltZTtcbiAgICAgIC8vIFJlbmRlcmluZyB0aGlzIGJhdGNoIGFnYWluIGVuc3VyZXMgaXRzIGNoaWxkcmVuIHdpbGwgYmUgdGhlIGZpbmFsIHN0YXRlXG4gICAgICAvLyB3aGVuIHdlIGZsdXNoICh1cGRhdGVzIGFyZSBwcm9jZXNzZWQgaW4gaW5zZXJ0aW9uIG9yZGVyOiBsYXN0XG4gICAgICAvLyB1cGRhdGUgd2lucykuXG4gICAgICAvLyBUT0RPOiBUaGlzIGZvcmNlcyBhIHJlc3RhcnQuIFNob3VsZCB3ZSBwcmludCBhIHdhcm5pbmc/XG4gICAgICB0aGlzLnJlbmRlcih0aGlzLl9jaGlsZHJlbik7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRoZSBiYXRjaCBmcm9tIHRoZSBsaXN0LlxuICAgIHZhciBwcmV2aW91cyA9IG51bGw7XG4gICAgdmFyIGJhdGNoID0gZmlyc3RCYXRjaDtcbiAgICB3aGlsZSAoYmF0Y2ggIT09IHRoaXMpIHtcbiAgICAgIHByZXZpb3VzID0gYmF0Y2g7XG4gICAgICBiYXRjaCA9IGJhdGNoLl9uZXh0O1xuICAgIH1cbiAgICAhKHByZXZpb3VzICE9PSBudWxsKSA/IGludmFyaWFudChmYWxzZSwgJ2JhdGNoLmNvbW1pdDogQ2Fubm90IGNvbW1pdCBhIGJhdGNoIG11bHRpcGxlIHRpbWVzLicpIDogdm9pZCAwO1xuICAgIHByZXZpb3VzLl9uZXh0ID0gYmF0Y2guX25leHQ7XG5cbiAgICAvLyBBZGQgaXQgdG8gdGhlIGZyb250LlxuICAgIHRoaXMuX25leHQgPSBmaXJzdEJhdGNoO1xuICAgIGZpcnN0QmF0Y2ggPSBpbnRlcm5hbFJvb3QuZmlyc3RCYXRjaCA9IHRoaXM7XG4gIH1cblxuICAvLyBTeW5jaHJvbm91c2x5IGZsdXNoIGFsbCB0aGUgd29yayB1cCB0byB0aGlzIGJhdGNoJ3MgZXhwaXJhdGlvbiB0aW1lLlxuICB0aGlzLl9kZWZlciA9IGZhbHNlO1xuICBmbHVzaFJvb3QoaW50ZXJuYWxSb290LCBleHBpcmF0aW9uVGltZSk7XG5cbiAgLy8gUG9wIHRoZSBiYXRjaCBmcm9tIHRoZSBsaXN0LlxuICB2YXIgbmV4dCA9IHRoaXMuX25leHQ7XG4gIHRoaXMuX25leHQgPSBudWxsO1xuICBmaXJzdEJhdGNoID0gaW50ZXJuYWxSb290LmZpcnN0QmF0Y2ggPSBuZXh0O1xuXG4gIC8vIEFwcGVuZCB0aGUgbmV4dCBlYXJsaWVzdCBiYXRjaCdzIGNoaWxkcmVuIHRvIHRoZSB1cGRhdGUgcXVldWUuXG4gIGlmIChmaXJzdEJhdGNoICE9PSBudWxsICYmIGZpcnN0QmF0Y2guX2hhc0NoaWxkcmVuKSB7XG4gICAgZmlyc3RCYXRjaC5yZW5kZXIoZmlyc3RCYXRjaC5fY2hpbGRyZW4pO1xuICB9XG59O1xuUmVhY3RCYXRjaC5wcm90b3R5cGUuX29uQ29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLl9kaWRDb21wbGV0ZSkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLl9kaWRDb21wbGV0ZSA9IHRydWU7XG4gIHZhciBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3M7XG4gIGlmIChjYWxsYmFja3MgPT09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gVE9ETzogRXJyb3IgaGFuZGxpbmcuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9jYWxsYmFjayA9IGNhbGxiYWNrc1tpXTtcbiAgICBfY2FsbGJhY2soKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gUmVhY3RXb3JrKCkge1xuICB0aGlzLl9jYWxsYmFja3MgPSBudWxsO1xuICB0aGlzLl9kaWRDb21taXQgPSBmYWxzZTtcbiAgLy8gVE9ETzogQXZvaWQgbmVlZCB0byBiaW5kIGJ5IHJlcGxhY2luZyBjYWxsYmFja3MgaW4gdGhlIHVwZGF0ZSBxdWV1ZSB3aXRoXG4gIC8vIGxpc3Qgb2YgV29yayBvYmplY3RzLlxuICB0aGlzLl9vbkNvbW1pdCA9IHRoaXMuX29uQ29tbWl0LmJpbmQodGhpcyk7XG59XG5SZWFjdFdvcmsucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbiAob25Db21taXQpIHtcbiAgaWYgKHRoaXMuX2RpZENvbW1pdCkge1xuICAgIG9uQ29tbWl0KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3M7XG4gIGlmIChjYWxsYmFja3MgPT09IG51bGwpIHtcbiAgICBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgPSBbXTtcbiAgfVxuICBjYWxsYmFja3MucHVzaChvbkNvbW1pdCk7XG59O1xuUmVhY3RXb3JrLnByb3RvdHlwZS5fb25Db21taXQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLl9kaWRDb21taXQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5fZGlkQ29tbWl0ID0gdHJ1ZTtcbiAgdmFyIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcztcbiAgaWYgKGNhbGxiYWNrcyA9PT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBUT0RPOiBFcnJvciBoYW5kbGluZy5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgX2NhbGxiYWNrMiA9IGNhbGxiYWNrc1tpXTtcbiAgICAhKHR5cGVvZiBfY2FsbGJhY2syID09PSAnZnVuY3Rpb24nKSA/IGludmFyaWFudChmYWxzZSwgJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIGFzIGNhbGxiYWNrLiBFeHBlY3RlZCBhIGZ1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcycsIF9jYWxsYmFjazIpIDogdm9pZCAwO1xuICAgIF9jYWxsYmFjazIoKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gUmVhY3RSb290KGNvbnRhaW5lciwgaXNDb25jdXJyZW50LCBoeWRyYXRlKSB7XG4gIHZhciByb290ID0gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lciwgaXNDb25jdXJyZW50LCBoeWRyYXRlKTtcbiAgdGhpcy5faW50ZXJuYWxSb290ID0gcm9vdDtcbn1cblJlYWN0Um9vdC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKGNoaWxkcmVuLCBjYWxsYmFjaykge1xuICB2YXIgcm9vdCA9IHRoaXMuX2ludGVybmFsUm9vdDtcbiAgdmFyIHdvcmsgPSBuZXcgUmVhY3RXb3JrKCk7XG4gIGNhbGxiYWNrID0gY2FsbGJhY2sgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjaztcbiAge1xuICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjaywgJ3JlbmRlcicpO1xuICB9XG4gIGlmIChjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgIHdvcmsudGhlbihjYWxsYmFjayk7XG4gIH1cbiAgdXBkYXRlQ29udGFpbmVyKGNoaWxkcmVuLCByb290LCBudWxsLCB3b3JrLl9vbkNvbW1pdCk7XG4gIHJldHVybiB3b3JrO1xufTtcblJlYWN0Um9vdC5wcm90b3R5cGUudW5tb3VudCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB2YXIgcm9vdCA9IHRoaXMuX2ludGVybmFsUm9vdDtcbiAgdmFyIHdvcmsgPSBuZXcgUmVhY3RXb3JrKCk7XG4gIGNhbGxiYWNrID0gY2FsbGJhY2sgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjaztcbiAge1xuICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjaywgJ3JlbmRlcicpO1xuICB9XG4gIGlmIChjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgIHdvcmsudGhlbihjYWxsYmFjayk7XG4gIH1cbiAgdXBkYXRlQ29udGFpbmVyKG51bGwsIHJvb3QsIG51bGwsIHdvcmsuX29uQ29tbWl0KTtcbiAgcmV0dXJuIHdvcms7XG59O1xuUmVhY3RSb290LnByb3RvdHlwZS5sZWdhY3lfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIgPSBmdW5jdGlvbiAocGFyZW50Q29tcG9uZW50LCBjaGlsZHJlbiwgY2FsbGJhY2spIHtcbiAgdmFyIHJvb3QgPSB0aGlzLl9pbnRlcm5hbFJvb3Q7XG4gIHZhciB3b3JrID0gbmV3IFJlYWN0V29yaygpO1xuICBjYWxsYmFjayA9IGNhbGxiYWNrID09PSB1bmRlZmluZWQgPyBudWxsIDogY2FsbGJhY2s7XG4gIHtcbiAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdyZW5kZXInKTtcbiAgfVxuICBpZiAoY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICB3b3JrLnRoZW4oY2FsbGJhY2spO1xuICB9XG4gIHVwZGF0ZUNvbnRhaW5lcihjaGlsZHJlbiwgcm9vdCwgcGFyZW50Q29tcG9uZW50LCB3b3JrLl9vbkNvbW1pdCk7XG4gIHJldHVybiB3b3JrO1xufTtcblJlYWN0Um9vdC5wcm90b3R5cGUuY3JlYXRlQmF0Y2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBiYXRjaCA9IG5ldyBSZWFjdEJhdGNoKHRoaXMpO1xuICB2YXIgZXhwaXJhdGlvblRpbWUgPSBiYXRjaC5fZXhwaXJhdGlvblRpbWU7XG5cbiAgdmFyIGludGVybmFsUm9vdCA9IHRoaXMuX2ludGVybmFsUm9vdDtcbiAgdmFyIGZpcnN0QmF0Y2ggPSBpbnRlcm5hbFJvb3QuZmlyc3RCYXRjaDtcbiAgaWYgKGZpcnN0QmF0Y2ggPT09IG51bGwpIHtcbiAgICBpbnRlcm5hbFJvb3QuZmlyc3RCYXRjaCA9IGJhdGNoO1xuICAgIGJhdGNoLl9uZXh0ID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICAvLyBJbnNlcnQgc29ydGVkIGJ5IGV4cGlyYXRpb24gdGltZSB0aGVuIGluc2VydGlvbiBvcmRlclxuICAgIHZhciBpbnNlcnRBZnRlciA9IG51bGw7XG4gICAgdmFyIGluc2VydEJlZm9yZSA9IGZpcnN0QmF0Y2g7XG4gICAgd2hpbGUgKGluc2VydEJlZm9yZSAhPT0gbnVsbCAmJiBpbnNlcnRCZWZvcmUuX2V4cGlyYXRpb25UaW1lID49IGV4cGlyYXRpb25UaW1lKSB7XG4gICAgICBpbnNlcnRBZnRlciA9IGluc2VydEJlZm9yZTtcbiAgICAgIGluc2VydEJlZm9yZSA9IGluc2VydEJlZm9yZS5fbmV4dDtcbiAgICB9XG4gICAgYmF0Y2guX25leHQgPSBpbnNlcnRCZWZvcmU7XG4gICAgaWYgKGluc2VydEFmdGVyICE9PSBudWxsKSB7XG4gICAgICBpbnNlcnRBZnRlci5fbmV4dCA9IGJhdGNoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYXRjaDtcbn07XG5cbi8qKlxuICogVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgRE9NIG5vZGUgaXMgYSB2YWxpZCBub2RlIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHs/RE9NRWxlbWVudH0gbm9kZSBUaGUgY2FuZGlkYXRlIERPTSBub2RlLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgRE9NIGlzIGEgdmFsaWQgRE9NIG5vZGUuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZENvbnRhaW5lcihub2RlKSB7XG4gIHJldHVybiAhIShub2RlICYmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gJyByZWFjdC1tb3VudC1wb2ludC11bnN0YWJsZSAnKSk7XG59XG5cbmZ1bmN0aW9uIGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgaWYgKCFjb250YWluZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUpIHtcbiAgICByZXR1cm4gY29udGFpbmVyLmRvY3VtZW50RWxlbWVudDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkSHlkcmF0ZUR1ZVRvTGVnYWN5SGV1cmlzdGljKGNvbnRhaW5lcikge1xuICB2YXIgcm9vdEVsZW1lbnQgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgcmV0dXJuICEhKHJvb3RFbGVtZW50ICYmIHJvb3RFbGVtZW50Lm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiYgcm9vdEVsZW1lbnQuaGFzQXR0cmlidXRlKFJPT1RfQVRUUklCVVRFX05BTUUpKTtcbn1cblxuc2V0QmF0Y2hpbmdJbXBsZW1lbnRhdGlvbihiYXRjaGVkVXBkYXRlcyQxLCBpbnRlcmFjdGl2ZVVwZGF0ZXMkMSwgZmx1c2hJbnRlcmFjdGl2ZVVwZGF0ZXMkMSk7XG5cbnZhciB3YXJuZWRBYm91dEh5ZHJhdGVBUEkgPSBmYWxzZTtcblxuZnVuY3Rpb24gbGVnYWN5Q3JlYXRlUm9vdEZyb21ET01Db250YWluZXIoY29udGFpbmVyLCBmb3JjZUh5ZHJhdGUpIHtcbiAgdmFyIHNob3VsZEh5ZHJhdGUgPSBmb3JjZUh5ZHJhdGUgfHwgc2hvdWxkSHlkcmF0ZUR1ZVRvTGVnYWN5SGV1cmlzdGljKGNvbnRhaW5lcik7XG4gIC8vIEZpcnN0IGNsZWFyIGFueSBleGlzdGluZyBjb250ZW50LlxuICBpZiAoIXNob3VsZEh5ZHJhdGUpIHtcbiAgICB2YXIgd2FybmVkID0gZmFsc2U7XG4gICAgdmFyIHJvb3RTaWJsaW5nID0gdm9pZCAwO1xuICAgIHdoaWxlIChyb290U2libGluZyA9IGNvbnRhaW5lci5sYXN0Q2hpbGQpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCF3YXJuZWQgJiYgcm9vdFNpYmxpbmcubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiByb290U2libGluZy5oYXNBdHRyaWJ1dGUoUk9PVF9BVFRSSUJVVEVfTkFNRSkpIHtcbiAgICAgICAgICB3YXJuZWQgPSB0cnVlO1xuICAgICAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ3JlbmRlcigpOiBUYXJnZXQgbm9kZSBoYXMgbWFya3VwIHJlbmRlcmVkIGJ5IFJlYWN0LCBidXQgdGhlcmUgJyArICdhcmUgdW5yZWxhdGVkIG5vZGVzIGFzIHdlbGwuIFRoaXMgaXMgbW9zdCBjb21tb25seSBjYXVzZWQgYnkgJyArICd3aGl0ZS1zcGFjZSBpbnNlcnRlZCBhcm91bmQgc2VydmVyLXJlbmRlcmVkIG1hcmt1cC4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKHJvb3RTaWJsaW5nKTtcbiAgICB9XG4gIH1cbiAge1xuICAgIGlmIChzaG91bGRIeWRyYXRlICYmICFmb3JjZUh5ZHJhdGUgJiYgIXdhcm5lZEFib3V0SHlkcmF0ZUFQSSkge1xuICAgICAgd2FybmVkQWJvdXRIeWRyYXRlQVBJID0gdHJ1ZTtcbiAgICAgIGxvd1ByaW9yaXR5V2FybmluZyQxKGZhbHNlLCAncmVuZGVyKCk6IENhbGxpbmcgUmVhY3RET00ucmVuZGVyKCkgdG8gaHlkcmF0ZSBzZXJ2ZXItcmVuZGVyZWQgbWFya3VwICcgKyAnd2lsbCBzdG9wIHdvcmtpbmcgaW4gUmVhY3QgdjE3LiBSZXBsYWNlIHRoZSBSZWFjdERPTS5yZW5kZXIoKSBjYWxsICcgKyAnd2l0aCBSZWFjdERPTS5oeWRyYXRlKCkgaWYgeW91IHdhbnQgUmVhY3QgdG8gYXR0YWNoIHRvIHRoZSBzZXJ2ZXIgSFRNTC4nKTtcbiAgICB9XG4gIH1cbiAgLy8gTGVnYWN5IHJvb3RzIGFyZSBub3QgYXN5bmMgYnkgZGVmYXVsdC5cbiAgdmFyIGlzQ29uY3VycmVudCA9IGZhbHNlO1xuICByZXR1cm4gbmV3IFJlYWN0Um9vdChjb250YWluZXIsIGlzQ29uY3VycmVudCwgc2hvdWxkSHlkcmF0ZSk7XG59XG5cbmZ1bmN0aW9uIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgY2hpbGRyZW4sIGNvbnRhaW5lciwgZm9yY2VIeWRyYXRlLCBjYWxsYmFjaykge1xuICB7XG4gICAgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncyhjb250YWluZXIpO1xuICB9XG5cbiAgLy8gVE9ETzogV2l0aG91dCBgYW55YCB0eXBlLCBGbG93IHNheXMgXCJQcm9wZXJ0eSBjYW5ub3QgYmUgYWNjZXNzZWQgb24gYW55XG4gIC8vIG1lbWJlciBvZiBpbnRlcnNlY3Rpb24gdHlwZS5cIiBXaHl5eXl5eS5cbiAgdmFyIHJvb3QgPSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcjtcbiAgaWYgKCFyb290KSB7XG4gICAgLy8gSW5pdGlhbCBtb3VudFxuICAgIHJvb3QgPSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9IGxlZ2FjeUNyZWF0ZVJvb3RGcm9tRE9NQ29udGFpbmVyKGNvbnRhaW5lciwgZm9yY2VIeWRyYXRlKTtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFB1YmxpY1Jvb3RJbnN0YW5jZShyb290Ll9pbnRlcm5hbFJvb3QpO1xuICAgICAgICBvcmlnaW5hbENhbGxiYWNrLmNhbGwoaW5zdGFuY2UpO1xuICAgICAgfTtcbiAgICB9XG4gICAgLy8gSW5pdGlhbCBtb3VudCBzaG91bGQgbm90IGJlIGJhdGNoZWQuXG4gICAgdW5iYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAocGFyZW50Q29tcG9uZW50ICE9IG51bGwpIHtcbiAgICAgICAgcm9vdC5sZWdhY3lfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBjaGlsZHJlbiwgY2FsbGJhY2spO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm9vdC5yZW5kZXIoY2hpbGRyZW4sIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgX29yaWdpbmFsQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRQdWJsaWNSb290SW5zdGFuY2Uocm9vdC5faW50ZXJuYWxSb290KTtcbiAgICAgICAgX29yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH1cbiAgICAvLyBVcGRhdGVcbiAgICBpZiAocGFyZW50Q29tcG9uZW50ICE9IG51bGwpIHtcbiAgICAgIHJvb3QubGVnYWN5X3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgY2hpbGRyZW4sIGNhbGxiYWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm9vdC5yZW5kZXIoY2hpbGRyZW4sIGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGdldFB1YmxpY1Jvb3RJbnN0YW5jZShyb290Ll9pbnRlcm5hbFJvb3QpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQb3J0YWwkJDEoY2hpbGRyZW4sIGNvbnRhaW5lcikge1xuICB2YXIga2V5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBudWxsO1xuXG4gICFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikgPyBpbnZhcmlhbnQoZmFsc2UsICdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpIDogdm9pZCAwO1xuICAvLyBUT0RPOiBwYXNzIFJlYWN0RE9NIHBvcnRhbCBpbXBsZW1lbnRhdGlvbiBhcyB0aGlyZCBhcmd1bWVudFxuICByZXR1cm4gY3JlYXRlUG9ydGFsJDEoY2hpbGRyZW4sIGNvbnRhaW5lciwgbnVsbCwga2V5KTtcbn1cblxudmFyIFJlYWN0RE9NID0ge1xuICBjcmVhdGVQb3J0YWw6IGNyZWF0ZVBvcnRhbCQkMSxcblxuICBmaW5kRE9NTm9kZTogZnVuY3Rpb24gKGNvbXBvbmVudE9yRWxlbWVudCkge1xuICAgIHtcbiAgICAgIHZhciBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ7XG4gICAgICBpZiAob3duZXIgIT09IG51bGwgJiYgb3duZXIuc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciB3YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IG93bmVyLnN0YXRlTm9kZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXI7XG4gICAgICAgICF3YXJuZWRBYm91dFJlZnNJblJlbmRlciA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJyVzIGlzIGFjY2Vzc2luZyBmaW5kRE9NTm9kZSBpbnNpZGUgaXRzIHJlbmRlcigpLiAnICsgJ3JlbmRlcigpIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLiBJdCBzaG91bGQgJyArICduZXZlciBhY2Nlc3Mgc29tZXRoaW5nIHRoYXQgcmVxdWlyZXMgc3RhbGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyAnICsgJ3JlbmRlciwgc3VjaCBhcyByZWZzLiBNb3ZlIHRoaXMgbG9naWMgdG8gY29tcG9uZW50RGlkTW91bnQgYW5kICcgKyAnY29tcG9uZW50RGlkVXBkYXRlIGluc3RlYWQuJywgZ2V0Q29tcG9uZW50TmFtZShvd25lci50eXBlKSB8fCAnQSBjb21wb25lbnQnKSA6IHZvaWQgMDtcbiAgICAgICAgb3duZXIuc3RhdGVOb2RlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb21wb25lbnRPckVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChjb21wb25lbnRPckVsZW1lbnQubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgcmV0dXJuIGNvbXBvbmVudE9yRWxlbWVudDtcbiAgICB9XG4gICAge1xuICAgICAgcmV0dXJuIGZpbmRIb3N0SW5zdGFuY2VXaXRoV2FybmluZyhjb21wb25lbnRPckVsZW1lbnQsICdmaW5kRE9NTm9kZScpO1xuICAgIH1cbiAgICByZXR1cm4gZmluZEhvc3RJbnN0YW5jZShjb21wb25lbnRPckVsZW1lbnQpO1xuICB9LFxuICBoeWRyYXRlOiBmdW5jdGlvbiAoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICAgICFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikgPyBpbnZhcmlhbnQoZmFsc2UsICdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpIDogdm9pZCAwO1xuICAgIHtcbiAgICAgICEhY29udGFpbmVyLl9yZWFjdEhhc0JlZW5QYXNzZWRUb0NyZWF0ZVJvb3RERVYgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00uaHlkcmF0ZSgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET00uJXMoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIGNyZWF0ZVJvb3QoY29udGFpbmVyLCB7aHlkcmF0ZTogdHJ1ZX0pLnJlbmRlcihlbGVtZW50KT8nLCBlbmFibGVTdGFibGVDb25jdXJyZW50TW9kZUFQSXMgPyAnY3JlYXRlUm9vdCcgOiAndW5zdGFibGVfY3JlYXRlUm9vdCcpIDogdm9pZCAwO1xuICAgIH1cbiAgICAvLyBUT0RPOiB0aHJvdyBvciB3YXJuIGlmIHdlIGNvdWxkbid0IGh5ZHJhdGU/XG4gICAgcmV0dXJuIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKG51bGwsIGVsZW1lbnQsIGNvbnRhaW5lciwgdHJ1ZSwgY2FsbGJhY2spO1xuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIChlbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gICAgIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSA/IGludmFyaWFudChmYWxzZSwgJ1RhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJykgOiB2b2lkIDA7XG4gICAge1xuICAgICAgISFjb250YWluZXIuX3JlYWN0SGFzQmVlblBhc3NlZFRvQ3JlYXRlUm9vdERFViA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS5yZW5kZXIoKSBvbiBhIGNvbnRhaW5lciB0aGF0IHdhcyBwcmV2aW91c2x5ICcgKyAncGFzc2VkIHRvIFJlYWN0RE9NLiVzKCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCByb290LnJlbmRlcihlbGVtZW50KT8nLCBlbmFibGVTdGFibGVDb25jdXJyZW50TW9kZUFQSXMgPyAnY3JlYXRlUm9vdCcgOiAndW5zdGFibGVfY3JlYXRlUm9vdCcpIDogdm9pZCAwO1xuICAgIH1cbiAgICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgZWxlbWVudCwgY29udGFpbmVyLCBmYWxzZSwgY2FsbGJhY2spO1xuICB9LFxuICB1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjogZnVuY3Rpb24gKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgY2FsbGJhY2spIHtcbiAgICAhaXNWYWxpZENvbnRhaW5lcihjb250YWluZXJOb2RlKSA/IGludmFyaWFudChmYWxzZSwgJ1RhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJykgOiB2b2lkIDA7XG4gICAgIShwYXJlbnRDb21wb25lbnQgIT0gbnVsbCAmJiBoYXMocGFyZW50Q29tcG9uZW50KSkgPyBpbnZhcmlhbnQoZmFsc2UsICdwYXJlbnRDb21wb25lbnQgbXVzdCBiZSBhIHZhbGlkIFJlYWN0IENvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgIHJldHVybiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGZhbHNlLCBjYWxsYmFjayk7XG4gIH0sXG4gIHVubW91bnRDb21wb25lbnRBdE5vZGU6IGZ1bmN0aW9uIChjb250YWluZXIpIHtcbiAgICAhaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpID8gaW52YXJpYW50KGZhbHNlLCAndW5tb3VudENvbXBvbmVudEF0Tm9kZSguLi4pOiBUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpIDogdm9pZCAwO1xuXG4gICAge1xuICAgICAgISFjb250YWluZXIuX3JlYWN0SGFzQmVlblBhc3NlZFRvQ3JlYXRlUm9vdERFViA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTS4lcygpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuIERpZCB5b3UgbWVhbiB0byBjYWxsIHJvb3QudW5tb3VudCgpPycsIGVuYWJsZVN0YWJsZUNvbmN1cnJlbnRNb2RlQVBJcyA/ICdjcmVhdGVSb290JyA6ICd1bnN0YWJsZV9jcmVhdGVSb290JykgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyKSB7XG4gICAgICB7XG4gICAgICAgIHZhciByb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgICAgICAgdmFyIHJlbmRlcmVkQnlEaWZmZXJlbnRSZWFjdCA9IHJvb3RFbCAmJiAhZ2V0SW5zdGFuY2VGcm9tTm9kZSQxKHJvb3RFbCk7XG4gICAgICAgICEhcmVuZGVyZWRCeURpZmZlcmVudFJlYWN0ID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCBcInVubW91bnRDb21wb25lbnRBdE5vZGUoKTogVGhlIG5vZGUgeW91J3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCBcIiArICd3YXMgcmVuZGVyZWQgYnkgYW5vdGhlciBjb3B5IG9mIFJlYWN0LicpIDogdm9pZCAwO1xuICAgICAgfVxuXG4gICAgICAvLyBVbm1vdW50IHNob3VsZCBub3QgYmUgYmF0Y2hlZC5cbiAgICAgIHVuYmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKCkge1xuICAgICAgICBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBudWxsLCBjb250YWluZXIsIGZhbHNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPSBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgLy8gSWYgeW91IGNhbGwgdW5tb3VudENvbXBvbmVudEF0Tm9kZSB0d2ljZSBpbiBxdWljayBzdWNjZXNzaW9uLCB5b3UnbGxcbiAgICAgIC8vIGdldCBgdHJ1ZWAgdHdpY2UuIFRoYXQncyBwcm9iYWJseSBmaW5lP1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgdmFyIF9yb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgICAgICAgdmFyIGhhc05vblJvb3RSZWFjdENoaWxkID0gISEoX3Jvb3RFbCAmJiBnZXRJbnN0YW5jZUZyb21Ob2RlJDEoX3Jvb3RFbCkpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgaXRzZWxmIGlzIGEgUmVhY3Qgcm9vdCBub2RlLlxuICAgICAgICB2YXIgaXNDb250YWluZXJSZWFjdFJvb3QgPSBjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lci5wYXJlbnROb2RlKSAmJiAhIWNvbnRhaW5lci5wYXJlbnROb2RlLl9yZWFjdFJvb3RDb250YWluZXI7XG5cbiAgICAgICAgISFoYXNOb25Sb290UmVhY3RDaGlsZCA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgXCJ1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFRoZSBub2RlIHlvdSdyZSBhdHRlbXB0aW5nIHRvIHVubW91bnQgXCIgKyAnd2FzIHJlbmRlcmVkIGJ5IFJlYWN0IGFuZCBpcyBub3QgYSB0b3AtbGV2ZWwgY29udGFpbmVyLiAlcycsIGlzQ29udGFpbmVyUmVhY3RSb290ID8gJ1lvdSBtYXkgaGF2ZSBhY2NpZGVudGFsbHkgcGFzc2VkIGluIGEgUmVhY3Qgcm9vdCBub2RlIGluc3RlYWQgJyArICdvZiBpdHMgY29udGFpbmVyLicgOiAnSW5zdGVhZCwgaGF2ZSB0aGUgcGFyZW50IGNvbXBvbmVudCB1cGRhdGUgaXRzIHN0YXRlIGFuZCAnICsgJ3JlcmVuZGVyIGluIG9yZGVyIHRvIHJlbW92ZSB0aGlzIGNvbXBvbmVudC4nKSA6IHZvaWQgMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcblxuXG4gIC8vIFRlbXBvcmFyeSBhbGlhcyBzaW5jZSB3ZSBhbHJlYWR5IHNoaXBwZWQgUmVhY3QgMTYgUkMgd2l0aCBpdC5cbiAgLy8gVE9ETzogcmVtb3ZlIGluIFJlYWN0IDE3LlxuICB1bnN0YWJsZV9jcmVhdGVQb3J0YWw6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWRpZFdhcm5BYm91dFVuc3RhYmxlQ3JlYXRlUG9ydGFsKSB7XG4gICAgICBkaWRXYXJuQWJvdXRVbnN0YWJsZUNyZWF0ZVBvcnRhbCA9IHRydWU7XG4gICAgICBsb3dQcmlvcml0eVdhcm5pbmckMShmYWxzZSwgJ1RoZSBSZWFjdERPTS51bnN0YWJsZV9jcmVhdGVQb3J0YWwoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTcrLiBVcGRhdGUgeW91ciBjb2RlIHRvIHVzZSAnICsgJ1JlYWN0RE9NLmNyZWF0ZVBvcnRhbCgpIGluc3RlYWQuIEl0IGhhcyB0aGUgZXhhY3Qgc2FtZSBBUEksICcgKyAnYnV0IHdpdGhvdXQgdGhlIFwidW5zdGFibGVfXCIgcHJlZml4LicpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlUG9ydGFsJCQxLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgfSxcblxuXG4gIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzOiBiYXRjaGVkVXBkYXRlcyQxLFxuXG4gIHVuc3RhYmxlX2ludGVyYWN0aXZlVXBkYXRlczogaW50ZXJhY3RpdmVVcGRhdGVzJDEsXG5cbiAgZmx1c2hTeW5jOiBmbHVzaFN5bmMsXG5cbiAgdW5zdGFibGVfY3JlYXRlUm9vdDogY3JlYXRlUm9vdCxcbiAgdW5zdGFibGVfZmx1c2hDb250cm9sbGVkOiBmbHVzaENvbnRyb2xsZWQsXG5cbiAgX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ6IHtcbiAgICAvLyBLZWVwIGluIHN5bmMgd2l0aCBSZWFjdERPTVVuc3RhYmxlTmF0aXZlRGVwZW5kZW5jaWVzLmpzXG4gICAgLy8gYW5kIFJlYWN0VGVzdFV0aWxzLmpzLiBUaGlzIGlzIGFuIGFycmF5IGZvciBiZXR0ZXIgbWluaWZpY2F0aW9uLlxuICAgIEV2ZW50czogW2dldEluc3RhbmNlRnJvbU5vZGUkMSwgZ2V0Tm9kZUZyb21JbnN0YW5jZSQxLCBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlJDEsIGluamVjdGlvbi5pbmplY3RFdmVudFBsdWdpbnNCeU5hbWUsIGV2ZW50TmFtZURpc3BhdGNoQ29uZmlncywgYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcywgYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXMsIGVucXVldWVTdGF0ZVJlc3RvcmUsIHJlc3RvcmVTdGF0ZUlmTmVlZGVkLCBkaXNwYXRjaEV2ZW50LCBydW5FdmVudHNJbkJhdGNoXVxuICB9XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVSb290KGNvbnRhaW5lciwgb3B0aW9ucykge1xuICB2YXIgZnVuY3Rpb25OYW1lID0gZW5hYmxlU3RhYmxlQ29uY3VycmVudE1vZGVBUElzID8gJ2NyZWF0ZVJvb3QnIDogJ3Vuc3RhYmxlX2NyZWF0ZVJvb3QnO1xuICAhaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpID8gaW52YXJpYW50KGZhbHNlLCAnJXMoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nLCBmdW5jdGlvbk5hbWUpIDogdm9pZCAwO1xuICB7XG4gICAgISFjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS4lcygpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET00ucmVuZGVyKCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4nLCBlbmFibGVTdGFibGVDb25jdXJyZW50TW9kZUFQSXMgPyAnY3JlYXRlUm9vdCcgOiAndW5zdGFibGVfY3JlYXRlUm9vdCcpIDogdm9pZCAwO1xuICAgIGNvbnRhaW5lci5fcmVhY3RIYXNCZWVuUGFzc2VkVG9DcmVhdGVSb290REVWID0gdHJ1ZTtcbiAgfVxuICB2YXIgaHlkcmF0ZSA9IG9wdGlvbnMgIT0gbnVsbCAmJiBvcHRpb25zLmh5ZHJhdGUgPT09IHRydWU7XG4gIHJldHVybiBuZXcgUmVhY3RSb290KGNvbnRhaW5lciwgdHJ1ZSwgaHlkcmF0ZSk7XG59XG5cbmlmIChlbmFibGVTdGFibGVDb25jdXJyZW50TW9kZUFQSXMpIHtcbiAgUmVhY3RET00uY3JlYXRlUm9vdCA9IGNyZWF0ZVJvb3Q7XG4gIFJlYWN0RE9NLnVuc3RhYmxlX2NyZWF0ZVJvb3QgPSB1bmRlZmluZWQ7XG59XG5cbnZhciBmb3VuZERldlRvb2xzID0gaW5qZWN0SW50b0RldlRvb2xzKHtcbiAgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLFxuICBidW5kbGVUeXBlOiAxLFxuICB2ZXJzaW9uOiBSZWFjdFZlcnNpb24sXG4gIHJlbmRlcmVyUGFja2FnZU5hbWU6ICdyZWFjdC1kb20nXG59KTtcblxue1xuICBpZiAoIWZvdW5kRGV2VG9vbHMgJiYgY2FuVXNlRE9NICYmIHdpbmRvdy50b3AgPT09IHdpbmRvdy5zZWxmKSB7XG4gICAgLy8gSWYgd2UncmUgaW4gQ2hyb21lIG9yIEZpcmVmb3gsIHByb3ZpZGUgYSBkb3dubG9hZCBsaW5rIGlmIG5vdCBpbnN0YWxsZWQuXG4gICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lJykgPiAtMSAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0VkZ2UnKSA9PT0gLTEgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgPiAtMSkge1xuICAgICAgdmFyIHByb3RvY29sID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sO1xuICAgICAgLy8gRG9uJ3Qgd2FybiBpbiBleG90aWMgY2FzZXMgbGlrZSBjaHJvbWUtZXh0ZW5zaW9uOi8vLlxuICAgICAgaWYgKC9eKGh0dHBzP3xmaWxlKTokLy50ZXN0KHByb3RvY29sKSkge1xuICAgICAgICBjb25zb2xlLmluZm8oJyVjRG93bmxvYWQgdGhlIFJlYWN0IERldlRvb2xzICcgKyAnZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6ICcgKyAnaHR0cHM6Ly9mYi5tZS9yZWFjdC1kZXZ0b29scycgKyAocHJvdG9jb2wgPT09ICdmaWxlOicgPyAnXFxuWW91IG1pZ2h0IG5lZWQgdG8gdXNlIGEgbG9jYWwgSFRUUCBzZXJ2ZXIgKGluc3RlYWQgb2YgZmlsZTovLyk6ICcgKyAnaHR0cHM6Ly9mYi5tZS9yZWFjdC1kZXZ0b29scy1mYXEnIDogJycpLCAnZm9udC13ZWlnaHQ6Ym9sZCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5cblxudmFyIFJlYWN0RE9NJDIgPSBPYmplY3QuZnJlZXplKHtcblx0ZGVmYXVsdDogUmVhY3RET01cbn0pO1xuXG52YXIgUmVhY3RET00kMyA9ICggUmVhY3RET00kMiAmJiBSZWFjdERPTSApIHx8IFJlYWN0RE9NJDI7XG5cbi8vIFRPRE86IGRlY2lkZSBvbiB0aGUgdG9wLWxldmVsIGV4cG9ydCBmb3JtLlxuLy8gVGhpcyBpcyBoYWNreSBidXQgbWFrZXMgaXQgd29yayB3aXRoIGJvdGggUm9sbHVwIGFuZCBKZXN0LlxudmFyIHJlYWN0RG9tID0gUmVhY3RET00kMy5kZWZhdWx0IHx8IFJlYWN0RE9NJDM7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVhY3REb207XG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGNoZWNrRENFKCkge1xuICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG4gIGlmIChcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJyB8fFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gVGhpcyBicmFuY2ggaXMgdW5yZWFjaGFibGUgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkXG4gICAgLy8gaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBjb25kaXRpb24gaXMgdHJ1ZSBvbmx5IGluIGRldmVsb3BtZW50LlxuICAgIC8vIFRoZXJlZm9yZSBpZiB0aGUgYnJhbmNoIGlzIHN0aWxsIGhlcmUsIGRlYWQgY29kZSBlbGltaW5hdGlvbiB3YXNuJ3RcbiAgICAvLyBwcm9wZXJseSBhcHBsaWVkLlxuICAgIC8vIERvbid0IGNoYW5nZSB0aGUgbWVzc2FnZS4gUmVhY3QgRGV2VG9vbHMgcmVsaWVzIG9uIGl0LiBBbHNvIG1ha2Ugc3VyZVxuICAgIC8vIHRoaXMgbWVzc2FnZSBkb2Vzbid0IG9jY3VyIGVsc2V3aGVyZSBpbiB0aGlzIGZ1bmN0aW9uLCBvciBpdCB3aWxsIGNhdXNlXG4gICAgLy8gYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ15fXicpO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvZGUgYWJvdmUgaGFzIGJlZW4gZGVhZCBjb2RlIGVsaW1pbmF0ZWQgKERDRSdkKS5cbiAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UoY2hlY2tEQ0UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBEZXZUb29scyBzaG91bGRuJ3QgY3Jhc2ggUmVhY3QsIG5vIG1hdHRlciB3aGF0LlxuICAgIC8vIFdlIHNob3VsZCBzdGlsbCByZXBvcnQgaW4gY2FzZSB3ZSBicmVhayB0aGlzIGNvZGUuXG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIERDRSBjaGVjayBzaG91bGQgaGFwcGVuIGJlZm9yZSBSZWFjdERPTSBidW5kbGUgZXhlY3V0ZXMgc28gdGhhdFxuICAvLyBEZXZUb29scyBjYW4gcmVwb3J0IGJhZCBtaW5pZmljYXRpb24gZHVyaW5nIGluamVjdGlvbi5cbiAgY2hlY2tEQ0UoKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJpbXBvcnQgeyB1c2VTdGF0ZSwgbWVtbywgdXNlTWVtbywgdXNlRWZmZWN0LCBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBvYnNlcnZlLCB1bm9ic2VydmUsIGlzT2JzZXJ2YWJsZSwgcmF3LCBvYnNlcnZhYmxlIH0gZnJvbSAnQG54LWpzL29ic2VydmVyLXV0aWwnO1xuaW1wb3J0IHsgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgfSBmcm9tICcuL3JlYWN0LXBsYXRmb3JtJztcblxuLy8gaXQgaXMgd2luZG93IGluIHRoZSBET00gYW5kIGdsb2JhbCBpbiBOb2RlSlMgYW5kIFJlYWN0IE5hdGl2ZVxuXG5jb25zdCBpc0RPTSA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xuY29uc3QgaXNOYXRpdmUgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJztcbmNvbnN0IGdsb2JhbE9iaiA9IGlzRE9NID8gd2luZG93IDogaXNOYXRpdmUgPyBnbG9iYWwgOiB1bmRlZmluZWQ7XG5jb25zdCBoYXNIb29rcyA9IHR5cGVvZiB1c2VTdGF0ZSA9PT0gJ2Z1bmN0aW9uJztcblxubGV0IGlzSW5zaWRlRnVuY3Rpb25Db21wb25lbnQgPSBmYWxzZTtcbmNvbnN0IENPTVBPTkVOVCA9IFN5bWJvbCgnb3duZXIgY29tcG9uZW50Jyk7XG5mdW5jdGlvbiB2aWV3KENvbXApIHtcbiAgY29uc3QgaXNTdGF0ZWxlc3NDb21wID0gIShDb21wLnByb3RvdHlwZSAmJiBDb21wLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbiAgbGV0IFJlYWN0aXZlQ29tcDtcblxuICBpZiAoaXNTdGF0ZWxlc3NDb21wICYmIGhhc0hvb2tzKSB7XG4gICAgLy8gdXNlIGEgaG9vayBiYXNlZCByZWFjdGl2ZSB3cmFwcGVyIHdoZW4gd2UgY2FuXG4gICAgUmVhY3RpdmVDb21wID0gbWVtbyhwcm9wcyA9PiB7XG4gICAgICAvLyB1c2UgYSBkdW1teSBzZXRTdGF0ZSB0byB1cGRhdGUgdGhlIGNvbXBvbmVudFxuICAgICAgY29uc3QgWywgc2V0U3RhdGVdID0gdXNlU3RhdGUoKTsgLy8gY3JlYXRlIGEgbWVtb2l6ZWQgcmVhY3RpdmUgd3JhcHBlciBvZiB0aGUgb3JpZ2luYWwgY29tcG9uZW50IChyZW5kZXIpXG4gICAgICAvLyBhdCB0aGUgdmVyeSBmaXJzdCBydW4gb2YgdGhlIGNvbXBvbmVudCBmdW5jdGlvblxuXG4gICAgICBjb25zdCByZW5kZXIgPSB1c2VNZW1vKCgpID0+IG9ic2VydmUoQ29tcCwge1xuICAgICAgICBzY2hlZHVsZXI6ICgpID0+IHNldFN0YXRlKHt9KSxcbiAgICAgICAgbGF6eTogdHJ1ZVxuICAgICAgfSksIC8vIEFkZGluZyB0aGUgb3JpZ2luYWwgQ29tcCBoZXJlIGlzIG5lY2Vzc2FyeSB0byBtYWtlIFJlYWN0IEhvdCBSZWxvYWQgd29ya1xuICAgICAgLy8gaXQgZG9lcyBub3QgYWZmZWN0IGJlaGF2aW9yIG90aGVyd2lzZVxuICAgICAgW0NvbXBdKTsgLy8gY2xlYW51cCB0aGUgcmVhY3RpdmUgY29ubmVjdGlvbnMgYWZ0ZXIgdGhlIHZlcnkgbGFzdCByZW5kZXIgb2YgdGhlIGNvbXBvbmVudFxuXG4gICAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICByZXR1cm4gKCkgPT4gdW5vYnNlcnZlKHJlbmRlcik7XG4gICAgICB9LCBbXSk7IC8vIHRoZSBpc0luc2lkZUZ1bmN0aW9uQ29tcG9uZW50IGZsYWcgaXMgdXNlZCB0byB0b2dnbGUgYHN0b3JlYCBiZWhhdmlvclxuICAgICAgLy8gYmFzZWQgb24gd2hlcmUgaXQgd2FzIGNhbGxlZCBmcm9tXG5cbiAgICAgIGlzSW5zaWRlRnVuY3Rpb25Db21wb25lbnQgPSB0cnVlO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBydW4gdGhlIHJlYWN0aXZlIHJlbmRlciBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBvbmVcbiAgICAgICAgcmV0dXJuIHJlbmRlcihwcm9wcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpc0luc2lkZUZ1bmN0aW9uQ29tcG9uZW50ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgQmFzZUNvbXAgPSBpc1N0YXRlbGVzc0NvbXAgPyBDb21wb25lbnQgOiBDb21wOyAvLyBhIEhPQyB3aGljaCBvdmVyd3JpdGVzIHJlbmRlciwgc2hvdWxkQ29tcG9uZW50VXBkYXRlIGFuZCBjb21wb25lbnRXaWxsVW5tb3VudFxuICAgIC8vIGl0IGRlY2lkZXMgd2hlbiB0byBydW4gdGhlIG5ldyByZWFjdGl2ZSBtZXRob2RzIGFuZCB3aGVuIHRvIHByb3h5IHRvIHRoZSBvcmlnaW5hbCBtZXRob2RzXG5cbiAgICBjbGFzcyBSZWFjdGl2ZUNsYXNzQ29tcCBleHRlbmRzIEJhc2VDb21wIHtcbiAgICAgIGNvbnN0cnVjdG9yKHByb3BzLCBjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKHByb3BzLCBjb250ZXh0KTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuc3RhdGUgfHwge307XG4gICAgICAgIHRoaXMuc3RhdGVbQ09NUE9ORU5UXSA9IHRoaXM7IC8vIGNyZWF0ZSBhIHJlYWN0aXZlIHJlbmRlciBmb3IgdGhlIGNvbXBvbmVudFxuXG4gICAgICAgIHRoaXMucmVuZGVyID0gb2JzZXJ2ZSh0aGlzLnJlbmRlciwge1xuICAgICAgICAgIHNjaGVkdWxlcjogKCkgPT4gdGhpcy5zZXRTdGF0ZSh7fSksXG4gICAgICAgICAgbGF6eTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gaXNTdGF0ZWxlc3NDb21wID8gQ29tcCh0aGlzLnByb3BzLCB0aGlzLmNvbnRleHQpIDogc3VwZXIucmVuZGVyKCk7XG4gICAgICB9IC8vIHJlYWN0IHNob3VsZCB0cmlnZ2VyIHVwZGF0ZXMgb24gcHJvcCBjaGFuZ2VzLCB3aGlsZSBlYXN5U3RhdGUgaGFuZGxlcyBzdG9yZSBjaGFuZ2VzXG5cblxuICAgICAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICBzdGF0ZVxuICAgICAgICB9ID0gdGhpczsgLy8gcmVzcGVjdCB0aGUgY2FzZSB3aGVuIHRoZSB1c2VyIGRlZmluZXMgYSBzaG91bGRDb21wb25lbnRVcGRhdGVcblxuICAgICAgICBpZiAoc3VwZXIuc2hvdWxkQ29tcG9uZW50VXBkYXRlKSB7XG4gICAgICAgICAgcmV0dXJuIHN1cGVyLnNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSk7XG4gICAgICAgIH0gLy8gcmV0dXJuIHRydWUgaWYgaXQgaXMgYSByZWFjdGl2ZSByZW5kZXIgb3Igc3RhdGUgY2hhbmdlc1xuXG5cbiAgICAgICAgaWYgKHN0YXRlICE9PSBuZXh0U3RhdGUpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAvLyB0aGUgY29tcG9uZW50IHNob3VsZCB1cGRhdGUgaWYgYW55IG9mIGl0cyBwcm9wcyBzaGFsbG93bHkgY2hhbmdlZCB2YWx1ZVxuXG5cbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3BzKTtcbiAgICAgICAgY29uc3QgbmV4dEtleXMgPSBPYmplY3Qua2V5cyhuZXh0UHJvcHMpO1xuICAgICAgICByZXR1cm4gbmV4dEtleXMubGVuZ3RoICE9PSBrZXlzLmxlbmd0aCB8fCBuZXh0S2V5cy5zb21lKGtleSA9PiBwcm9wc1trZXldICE9PSBuZXh0UHJvcHNba2V5XSk7XG4gICAgICB9IC8vIGFkZCBhIGN1c3RvbSBkZXJpdmVTdG9yZXNGcm9tUHJvcHMgbGlmZWN5bGUgbWV0aG9kXG5cblxuICAgICAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcywgc3RhdGUpIHtcbiAgICAgICAgaWYgKHN1cGVyLmRlcml2ZVN0b3Jlc0Zyb21Qcm9wcykge1xuICAgICAgICAgIC8vIGluamVjdCBhbGwgbG9jYWwgc3RvcmVzIGFuZCBsZXQgdGhlIHVzZXIgbXV0YXRlIHRoZW0gZGlyZWN0bHlcbiAgICAgICAgICBjb25zdCBzdG9yZXMgPSBtYXBTdGF0ZVRvU3RvcmVzKHN0YXRlKTtcbiAgICAgICAgICBzdXBlci5kZXJpdmVTdG9yZXNGcm9tUHJvcHMocHJvcHMsIC4uLnN0b3Jlcyk7XG4gICAgICAgIH0gLy8gcmVzcGVjdCB1c2VyIGRlZmluZWQgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXG5cblxuICAgICAgICBpZiAoc3VwZXIuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKSB7XG4gICAgICAgICAgcmV0dXJuIHN1cGVyLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcywgc3RhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICAvLyBjYWxsIHVzZXIgZGVmaW5lZCBjb21wb25lbnRXaWxsVW5tb3VudFxuICAgICAgICBpZiAoc3VwZXIuY29tcG9uZW50V2lsbFVubW91bnQpIHtcbiAgICAgICAgICBzdXBlci5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuICAgICAgICB9IC8vIGNsZWFuIHVwIG1lbW9yeSB1c2VkIGJ5IEVhc3kgU3RhdGVcblxuXG4gICAgICAgIHVub2JzZXJ2ZSh0aGlzLnJlbmRlcik7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICBSZWFjdGl2ZUNvbXAgPSBSZWFjdGl2ZUNsYXNzQ29tcDtcbiAgfVxuXG4gIFJlYWN0aXZlQ29tcC5kaXNwbGF5TmFtZSA9IENvbXAuZGlzcGxheU5hbWUgfHwgQ29tcC5uYW1lOyAvLyBzdGF0aWMgcHJvcHMgYXJlIGluaGVyaXRlZCBieSBjbGFzcyBjb21wb25lbnRzLFxuICAvLyBidXQgaGF2ZSB0byBiZSBjb3BpZWQgZm9yIGZ1bmN0aW9uIGNvbXBvbmVudHNcblxuICBpZiAoaXNTdGF0ZWxlc3NDb21wKSB7XG4gICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKENvbXApKSB7XG4gICAgICBSZWFjdGl2ZUNvbXBba2V5XSA9IENvbXBba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gUmVhY3RpdmVDb21wO1xufVxuXG5mdW5jdGlvbiBtYXBTdGF0ZVRvU3RvcmVzKHN0YXRlKSB7XG4gIC8vIGZpbmQgc3RvcmUgcHJvcGVydGllcyBhbmQgbWFwIHRoZW0gdG8gdGhlaXIgbm9uZSBvYnNlcnZhYmxlIHJhdyB2YWx1ZVxuICAvLyB0byBkbyBub3QgdHJpZ2dlciBub25lIHN0YXRpYyB0aGlzLnNldFN0YXRlIGNhbGxzXG4gIC8vIGZyb20gdGhlIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgbGlmZWN5Y2xlIG1ldGhvZFxuICBjb25zdCBjb21wb25lbnQgPSBzdGF0ZVtDT01QT05FTlRdO1xuICByZXR1cm4gT2JqZWN0LmtleXMoY29tcG9uZW50KS5tYXAoa2V5ID0+IGNvbXBvbmVudFtrZXldKS5maWx0ZXIoaXNPYnNlcnZhYmxlKS5tYXAocmF3KTtcbn1cblxuZnVuY3Rpb24gc3RvcmUob2JqKSB7XG4gIC8vIGRvIG5vdCBjcmVhdGUgbmV3IHZlcnNpb25zIG9mIHRoZSBzdG9yZSBvbiBldmVyeSByZW5kZXJcbiAgLy8gaWYgaXQgaXMgYSBsb2NhbCBzdG9yZSBpbiBhIGZ1bmN0aW9uIGNvbXBvbmVudFxuICAvLyBjcmVhdGUgYSBtZW1vaXplZCBzdG9yZSBhdCB0aGUgZmlyc3QgY2FsbCBpbnN0ZWFkXG4gIGlmIChoYXNIb29rcyAmJiBpc0luc2lkZUZ1bmN0aW9uQ29tcG9uZW50KSB7XG4gICAgcmV0dXJuIHVzZU1lbW8oKCkgPT4gb2JzZXJ2YWJsZShvYmopLCBbXSk7XG4gIH1cblxuICByZXR1cm4gb2JzZXJ2YWJsZShvYmopO1xufVxuXG4vKiBlc2xpbnQgY2FtZWxjYXNlOiAwICovXG4vLyB1bnRpbCB0aGUgZnVuY3Rpb24gaXMgZmluaXNoZWQgcnVubmluZ1xuXG5mdW5jdGlvbiBiYXRjaChmbiwgY3R4LCBhcmdzKSB7XG4gIGxldCByZXN1bHQ7XG4gIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzKCgpID0+IHJlc3VsdCA9IGZuLmFwcGx5KGN0eCwgYXJncykpO1xuICByZXR1cm4gcmVzdWx0O1xufSAvLyB0aGlzIGNyZWF0ZXMgYW5kIHJldHVybnMgYSBiYXRjaGVkIHZlcnNpb24gb2YgdGhlIHBhc3NlZCBmdW5jdGlvblxuLy8gdGhlIGNhY2hlIGlzIG5lY2Vzc2FyeSB0byBhbHdheXMgbWFwIHRoZSBzYW1lIHRoaW5nIHRvIHRoZSBzYW1lIGZ1bmN0aW9uXG4vLyB3aGljaCBtYWtlcyBzdXJlIHRoYXQgYWRkRXZlbnRMaXN0ZW5lci9yZW1vdmVFdmVudExpc3RlbmVyIHBhaXJzIGRvbid0IGJyZWFrXG5cbmNvbnN0IGNhY2hlID0gbmV3IFdlYWtNYXAoKTtcblxuZnVuY3Rpb24gYmF0Y2hGbihmbikge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgbGV0IGJhdGNoZWQgPSBjYWNoZS5nZXQoZm4pO1xuXG4gIGlmICghYmF0Y2hlZCkge1xuICAgIGJhdGNoZWQgPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgcmV0dXJuIGJhdGNoKGZuLCB0aGlzLCBhcmdzKTtcbiAgICB9O1xuXG4gICAgY2FjaGUuc2V0KGZuLCBiYXRjaGVkKTtcbiAgfVxuXG4gIHJldHVybiBiYXRjaGVkO1xufSAvLyBiYXRjaGVkIG9iai5hZGRFdmVudExpc3RlbmVyKGNiKSBsaWtlIGNhbGxiYWNrc1xuXG5cbmZ1bmN0aW9uIGJhdGNoTWV0aG9kc0NhbGxiYWNrcyhvYmosIG1ldGhvZHMpIHtcbiAgbWV0aG9kcy5mb3JFYWNoKG1ldGhvZCA9PiBiYXRjaE1ldGhvZENhbGxiYWNrcyhvYmosIG1ldGhvZCkpO1xufVxuXG5mdW5jdGlvbiBiYXRjaE1ldGhvZENhbGxiYWNrcyhvYmosIG1ldGhvZCkge1xuICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIG1ldGhvZCk7XG5cbiAgaWYgKGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci53cml0YWJsZSAmJiB0eXBlb2YgZGVzY3JpcHRvci52YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG9ialttZXRob2RdID0gbmV3IFByb3h5KGRlc2NyaXB0b3IudmFsdWUsIHtcbiAgICAgIGFwcGx5KHRhcmdldCwgY3R4LCBhcmdzKSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHRhcmdldCwgY3R4LCBhcmdzLm1hcChiYXRjaEZuKSk7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgfVxufSAvLyBiYXRjaGVzIG9iai5vbmV2ZW50ID0gZm4gbGlrZSBjYWxsc1xuXG5cbmZ1bmN0aW9uIGJhdGNoTWV0aG9kcyhvYmosIG1ldGhvZHMpIHtcbiAgbWV0aG9kcy5mb3JFYWNoKG1ldGhvZCA9PiBiYXRjaE1ldGhvZChvYmosIG1ldGhvZCkpO1xufVxuXG5mdW5jdGlvbiBiYXRjaE1ldGhvZChvYmosIG1ldGhvZCkge1xuICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIG1ldGhvZCk7XG5cbiAgaWYgKGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci5jb25maWd1cmFibGUpIHtcbiAgICBjb25zdCBuZXdEZXNjcmlwdG9yID0gT2JqZWN0LmFzc2lnbih7fSwgZGVzY3JpcHRvciwge1xuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yLnNldC5jYWxsKHRoaXMsIGJhdGNoRm4odmFsdWUpKTtcbiAgICAgIH1cblxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG1ldGhvZCwgbmV3RGVzY3JpcHRvcik7XG4gIH1cbn0gLy8gZG8gYSBzeW5jIGJhdGNoaW5nIGZvciB0aGUgbW9zdCBjb21tb24gdGFzayBzb3VyY2VzXG4vLyB0aGlzIHNob3VsZCBiZSByZW1vdmVkIHdoZW4gUmVhY3QncyBvd24gYmF0Y2hpbmcgaXMgaW1wcm92ZWQgaW4gdGhlIGZ1dHVyZVxuLy8gYmF0Y2ggdGltZXIgZnVuY3Rpb25zXG5cblxuYmF0Y2hNZXRob2RzQ2FsbGJhY2tzKGdsb2JhbE9iaiwgWydzZXRUaW1lb3V0JywgJ3NldEludGVydmFsJywgJ3JlcXVlc3RBbmltYXRpb25GcmFtZScsICdyZXF1ZXN0SWRsZUNhbGxiYWNrJ10pO1xuXG5pZiAoZ2xvYmFsT2JqLlByb21pc2UpIHtcbiAgYmF0Y2hNZXRob2RzQ2FsbGJhY2tzKFByb21pc2UucHJvdG90eXBlLCBbJ3RoZW4nLCAnY2F0Y2gnXSk7XG59IC8vIGJhdGNoIGFkZEV2ZW50TGlzdGVuZXIgY2FsbHNcblxuXG5pZiAoZ2xvYmFsT2JqLkV2ZW50VGFyZ2V0KSB7XG4gIGJhdGNoTWV0aG9kc0NhbGxiYWNrcyhFdmVudFRhcmdldC5wcm90b3R5cGUsIFsnYWRkRXZlbnRMaXN0ZW5lcicsICdyZW1vdmVFdmVudExpc3RlbmVyJ10pO1xufSAvLyB0aGlzIGJhdGNoZXMgd2Vic29ja2V0IGV2ZW50IGhhbmRsZXJzXG5cblxuaWYgKGdsb2JhbE9iai5XZWJTb2NrZXQpIHtcbiAgYmF0Y2hNZXRob2RzKFdlYlNvY2tldC5wcm90b3R5cGUsIFsnb25vcGVuJywgJ29ubWVzc2FnZScsICdvbmVycm9yJywgJ29uY2xvc2UnXSk7XG59IC8vIEhUVFAgZXZlbnQgaGFuZGxlcnMgYXJlIHVzdWFsbHkgd3JhcHBlZCBieSBQcm9taXNlcywgd2hpY2ggaXMgY292ZXJlZCBhYm92ZVxuXG5leHBvcnQgeyBiYXRjaCwgc3RvcmUsIHZpZXcgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVzLmVzNi5qcy5tYXBcbiIsImV4cG9ydCAqIGZyb20gJ3JlYWN0LWRvbSdcbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuOC42XG4gKiByZWFjdC5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcbnZhciBjaGVja1Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMvY2hlY2tQcm9wVHlwZXMnKTtcblxuLy8gVE9ETzogdGhpcyBpcyBzcGVjaWFsIGJlY2F1c2UgaXQgZ2V0cyBpbXBvcnRlZCBkdXJpbmcgYnVpbGQuXG5cbnZhciBSZWFjdFZlcnNpb24gPSAnMTYuOC42JztcblxuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbnZhciBoYXNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3I7XG5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgOiAweGVhYzc7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKSA6IDB4ZWFjYTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKSA6IDB4ZWFjYjtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKSA6IDB4ZWFjYztcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKSA6IDB4ZWFkMjtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucHJvdmlkZXInKSA6IDB4ZWFjZDtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0JykgOiAweGVhY2U7XG5cbnZhciBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbmN1cnJlbnRfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpIDogMHhlYWQwO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpIDogMHhlYWQxO1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKSA6IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5JykgOiAweGVhZDQ7XG5cbnZhciBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcblxuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gIGlmIChtYXliZUl0ZXJhYmxlID09PSBudWxsIHx8IHR5cGVvZiBtYXliZUl0ZXJhYmxlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcbiAgaWYgKHR5cGVvZiBtYXliZUl0ZXJhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1heWJlSXRlcmF0b3I7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogVXNlIGludmFyaWFudCgpIHRvIGFzc2VydCBzdGF0ZSB3aGljaCB5b3VyIHByb2dyYW0gYXNzdW1lcyB0byBiZSB0cnVlLlxuICpcbiAqIFByb3ZpZGUgc3ByaW50Zi1zdHlsZSBmb3JtYXQgKG9ubHkgJXMgaXMgc3VwcG9ydGVkKSBhbmQgYXJndW1lbnRzXG4gKiB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYnJva2UgYW5kIHdoYXQgeW91IHdlcmVcbiAqIGV4cGVjdGluZy5cbiAqXG4gKiBUaGUgaW52YXJpYW50IG1lc3NhZ2Ugd2lsbCBiZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGludmFyaWFudFxuICogd2lsbCByZW1haW4gdG8gZW5zdXJlIGxvZ2ljIGRvZXMgbm90IGRpZmZlciBpbiBwcm9kdWN0aW9uLlxuICovXG5cbnZhciB2YWxpZGF0ZUZvcm1hdCA9IGZ1bmN0aW9uICgpIHt9O1xuXG57XG4gIHZhbGlkYXRlRm9ybWF0ID0gZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhcmlhbnQgcmVxdWlyZXMgYW4gZXJyb3IgbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gaW52YXJpYW50KGNvbmRpdGlvbiwgZm9ybWF0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHZhbGlkYXRlRm9ybWF0KGZvcm1hdCk7XG5cbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB2YXIgZXJyb3IgPSB2b2lkIDA7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcignTWluaWZpZWQgZXhjZXB0aW9uIG9jY3VycmVkOyB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgJyArICdmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXJncyA9IFthLCBiLCBjLCBkLCBlLCBmXTtcbiAgICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcihmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgIH0pKTtcbiAgICAgIGVycm9yLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgfVxuXG4gICAgZXJyb3IuZnJhbWVzVG9Qb3AgPSAxOyAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IGludmFyaWFudCdzIG93biBmcmFtZVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8vIFJlbHlpbmcgb24gdGhlIGBpbnZhcmlhbnQoKWAgaW1wbGVtZW50YXRpb24gbGV0cyB1c1xuLy8gcHJlc2VydmUgdGhlIGZvcm1hdCBhbmQgcGFyYW1zIGluIHRoZSB3d3cgYnVpbGRzLlxuXG4vKipcbiAqIEZvcmtlZCBmcm9tIGZianMvd2FybmluZzpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mYmpzL2Jsb2IvZTY2YmEyMGFkNWJlNDMzZWI1NDQyM2YyYjA5N2Q4MjkzMjRkOWRlNi9wYWNrYWdlcy9mYmpzL3NyYy9fX2ZvcmtzX18vd2FybmluZy5qc1xuICpcbiAqIE9ubHkgY2hhbmdlIGlzIHdlIHVzZSBjb25zb2xlLndhcm4gaW5zdGVhZCBvZiBjb25zb2xlLmVycm9yLFxuICogYW5kIGRvIG5vdGhpbmcgd2hlbiAnY29uc29sZScgaXMgbm90IHN1cHBvcnRlZC5cbiAqIFRoaXMgcmVhbGx5IHNpbXBsaWZpZXMgdGhlIGNvZGUuXG4gKiAtLS1cbiAqIFNpbWlsYXIgdG8gaW52YXJpYW50IGJ1dCBvbmx5IGxvZ3MgYSB3YXJuaW5nIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldC5cbiAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gbG9nIGlzc3VlcyBpbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMgaW4gY3JpdGljYWxcbiAqIHBhdGhzLiBSZW1vdmluZyB0aGUgbG9nZ2luZyBjb2RlIGZvciBwcm9kdWN0aW9uIGVudmlyb25tZW50cyB3aWxsIGtlZXAgdGhlXG4gKiBzYW1lIGxvZ2ljIGFuZCBmb2xsb3cgdGhlIHNhbWUgY29kZSBwYXRocy5cbiAqL1xuXG52YXIgbG93UHJpb3JpdHlXYXJuaW5nID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgdmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICB9KTtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG5cbiAgbG93UHJpb3JpdHlXYXJuaW5nID0gZnVuY3Rpb24gKGNvbmRpdGlvbiwgZm9ybWF0KSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Bsb3dQcmlvcml0eVdhcm5pbmcoY29uZGl0aW9uLCBmb3JtYXQsIC4uLmFyZ3MpYCByZXF1aXJlcyBhIHdhcm5pbmcgJyArICdtZXNzYWdlIGFyZ3VtZW50Jyk7XG4gICAgfVxuICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMiA+IDIgPyBfbGVuMiAtIDIgOiAwKSwgX2tleTIgPSAyOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTIgLSAyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZy5hcHBseSh1bmRlZmluZWQsIFtmb3JtYXRdLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuICB9O1xufVxuXG52YXIgbG93UHJpb3JpdHlXYXJuaW5nJDEgPSBsb3dQcmlvcml0eVdhcm5pbmc7XG5cbi8qKlxuICogU2ltaWxhciB0byBpbnZhcmlhbnQgYnV0IG9ubHkgbG9ncyBhIHdhcm5pbmcgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byBsb2cgaXNzdWVzIGluIGRldmVsb3BtZW50IGVudmlyb25tZW50cyBpbiBjcml0aWNhbFxuICogcGF0aHMuIFJlbW92aW5nIHRoZSBsb2dnaW5nIGNvZGUgZm9yIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIHdpbGwga2VlcCB0aGVcbiAqIHNhbWUgbG9naWMgYW5kIGZvbGxvdyB0aGUgc2FtZSBjb2RlIHBhdGhzLlxuICovXG5cbnZhciB3YXJuaW5nV2l0aG91dFN0YWNrID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgd2FybmluZ1dpdGhvdXRTdGFjayA9IGZ1bmN0aW9uIChjb25kaXRpb24sIGZvcm1hdCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDIgPyBfbGVuIC0gMiA6IDApLCBfa2V5ID0gMjsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMl0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2B3YXJuaW5nV2l0aG91dFN0YWNrKGNvbmRpdGlvbiwgZm9ybWF0LCAuLi5hcmdzKWAgcmVxdWlyZXMgYSB3YXJuaW5nICcgKyAnbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgICBpZiAoYXJncy5sZW5ndGggPiA4KSB7XG4gICAgICAvLyBDaGVjayBiZWZvcmUgdGhlIGNvbmRpdGlvbiB0byBjYXRjaCB2aW9sYXRpb25zIGVhcmx5LlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YXJuaW5nV2l0aG91dFN0YWNrKCkgY3VycmVudGx5IHN1cHBvcnRzIGF0IG1vc3QgOCBhcmd1bWVudHMuJyk7XG4gICAgfVxuICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuICcnICsgaXRlbTtcbiAgICAgIH0pO1xuICAgICAgYXJnc1dpdGhGb3JtYXQudW5zaGlmdCgnV2FybmluZzogJyArIGZvcm1hdCk7XG5cbiAgICAgIC8vIFdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIHNwcmVhZCAob3IgLmFwcGx5KSBkaXJlY3RseSBiZWNhdXNlIGl0XG4gICAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlLmVycm9yLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyBmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG59XG5cbnZhciB3YXJuaW5nV2l0aG91dFN0YWNrJDEgPSB3YXJuaW5nV2l0aG91dFN0YWNrO1xuXG52YXIgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50ID0ge307XG5cbmZ1bmN0aW9uIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCBjYWxsZXJOYW1lKSB7XG4gIHtcbiAgICB2YXIgX2NvbnN0cnVjdG9yID0gcHVibGljSW5zdGFuY2UuY29uc3RydWN0b3I7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBfY29uc3RydWN0b3IgJiYgKF9jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCBfY29uc3RydWN0b3IubmFtZSkgfHwgJ1JlYWN0Q2xhc3MnO1xuICAgIHZhciB3YXJuaW5nS2V5ID0gY29tcG9uZW50TmFtZSArICcuJyArIGNhbGxlck5hbWU7XG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudFt3YXJuaW5nS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsIFwiQ2FuJ3QgY2FsbCAlcyBvbiBhIGNvbXBvbmVudCB0aGF0IGlzIG5vdCB5ZXQgbW91bnRlZC4gXCIgKyAnVGhpcyBpcyBhIG5vLW9wLCBidXQgaXQgbWlnaHQgaW5kaWNhdGUgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gJyArICdJbnN0ZWFkLCBhc3NpZ24gdG8gYHRoaXMuc3RhdGVgIGRpcmVjdGx5IG9yIGRlZmluZSBhIGBzdGF0ZSA9IHt9O2AgJyArICdjbGFzcyBwcm9wZXJ0eSB3aXRoIHRoZSBkZXNpcmVkIHN0YXRlIGluIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFtZSwgY29tcG9uZW50TmFtZSk7XG4gICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50W3dhcm5pbmdLZXldID0gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGFic3RyYWN0IEFQSSBmb3IgYW4gdXBkYXRlIHF1ZXVlLlxuICovXG52YXIgUmVhY3ROb29wVXBkYXRlUXVldWUgPSB7XG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhpcyBjb21wb3NpdGUgY29tcG9uZW50IGlzIG1vdW50ZWQuXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHdlIHdhbnQgdG8gdGVzdC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb3VudGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGZpbmFsXG4gICAqL1xuICBpc01vdW50ZWQ6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAvKipcbiAgICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICAgKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipub3QqKiBpbiBhIERPTSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICAgKiBjb21wb25lbnQncyBzdGF0ZSBoYXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC5cbiAgICpcbiAgICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICAgKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnREaWRVcGRhdGVgLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBjYWxsZXJOYW1lIG5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZUZvcmNlVXBkYXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdmb3JjZVVwZGF0ZScpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgb3IgYHNldFN0YXRlYCB0byBtdXRhdGUgc3RhdGUuXG4gICAqIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAgICpcbiAgICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc29cbiAgICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb21wbGV0ZVN0YXRlIE5leHQgc3RhdGUuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gY2FsbGVyTmFtZSBuYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVSZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY29tcGxldGVTdGF0ZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3JlcGxhY2VTdGF0ZScpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gVGhpcyBvbmx5IGV4aXN0cyBiZWNhdXNlIF9wZW5kaW5nU3RhdGUgaXNcbiAgICogaW50ZXJuYWwuIFRoaXMgcHJvdmlkZXMgYSBtZXJnaW5nIHN0cmF0ZWd5IHRoYXQgaXMgbm90IGF2YWlsYWJsZSB0byBkZWVwXG4gICAqIHByb3BlcnRpZXMgd2hpY2ggaXMgY29uZnVzaW5nLiBUT0RPOiBFeHBvc2UgcGVuZGluZ1N0YXRlIG9yIGRvbid0IHVzZSBpdFxuICAgKiBkdXJpbmcgdGhlIG1lcmdlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggc3RhdGUuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gTmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgcGFydGlhbFN0YXRlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnc2V0U3RhdGUnKTtcbiAgfVxufTtcblxudmFyIGVtcHR5T2JqZWN0ID0ge307XG57XG4gIE9iamVjdC5mcmVlemUoZW1wdHlPYmplY3QpO1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgaGVscGVycyBmb3IgdGhlIHVwZGF0aW5nIHN0YXRlIG9mIGEgY29tcG9uZW50LlxuICovXG5mdW5jdGlvbiBDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHtcbiAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAvLyBJZiBhIGNvbXBvbmVudCBoYXMgc3RyaW5nIHJlZnMsIHdlIHdpbGwgYXNzaWduIGEgZGlmZmVyZW50IG9iamVjdCBsYXRlci5cbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gIC8vIFdlIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgdXBkYXRlciBidXQgdGhlIHJlYWwgb25lIGdldHMgaW5qZWN0ZWQgYnkgdGhlXG4gIC8vIHJlbmRlcmVyLlxuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG5Db21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQgPSB7fTtcblxuLyoqXG4gKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIHRvIG11dGF0ZVxuICogc3RhdGUuIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBjYWxscyB0byBgc2V0U3RhdGVgIHdpbGwgcnVuIHN5bmNocm9ub3VzbHksXG4gKiBhcyB0aGV5IG1heSBldmVudHVhbGx5IGJlIGJhdGNoZWQgdG9nZXRoZXIuICBZb3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWxcbiAqIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBjYWxsIHRvIHNldFN0YXRlIGlzIGFjdHVhbGx5XG4gKiBjb21wbGV0ZWQuXG4gKlxuICogV2hlbiBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIHNldFN0YXRlLCBpdCB3aWxsIGJlIGNhbGxlZCBhdCBzb21lIHBvaW50IGluXG4gKiB0aGUgZnV0dXJlIChub3Qgc3luY2hyb25vdXNseSkuIEl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHVwIHRvIGRhdGVcbiAqIGNvbXBvbmVudCBhcmd1bWVudHMgKHN0YXRlLCBwcm9wcywgY29udGV4dCkuIFRoZXNlIHZhbHVlcyBjYW4gYmUgZGlmZmVyZW50XG4gKiBmcm9tIHRoaXMuKiBiZWNhdXNlIHlvdXIgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBhZnRlciByZWNlaXZlUHJvcHMgYnV0IGJlZm9yZVxuICogc2hvdWxkQ29tcG9uZW50VXBkYXRlLCBhbmQgdGhpcyBuZXcgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCB3aWxsIG5vdCB5ZXQgYmVcbiAqIGFzc2lnbmVkIHRvIHRoaXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rpb259IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgb3IgZnVuY3Rpb24gdG9cbiAqICAgICAgICBwcm9kdWNlIG5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBjdXJyZW50IHN0YXRlLlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLlxuICogQGZpbmFsXG4gKiBAcHJvdGVjdGVkXG4gKi9cbkNvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAocGFydGlhbFN0YXRlLCBjYWxsYmFjaykge1xuICAhKHR5cGVvZiBwYXJ0aWFsU3RhdGUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBwYXJ0aWFsU3RhdGUgPT09ICdmdW5jdGlvbicgfHwgcGFydGlhbFN0YXRlID09IG51bGwpID8gaW52YXJpYW50KGZhbHNlLCAnc2V0U3RhdGUoLi4uKTogdGFrZXMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcyB0byB1cGRhdGUgb3IgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMuJykgOiB2b2lkIDA7XG4gIHRoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcywgcGFydGlhbFN0YXRlLCBjYWxsYmFjaywgJ3NldFN0YXRlJyk7XG59O1xuXG4vKipcbiAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICpcbiAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICpcbiAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gKlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciB1cGRhdGUgaXMgY29tcGxldGUuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuQ29tcG9uZW50LnByb3RvdHlwZS5mb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsIGNhbGxiYWNrLCAnZm9yY2VVcGRhdGUnKTtcbn07XG5cbi8qKlxuICogRGVwcmVjYXRlZCBBUElzLiBUaGVzZSBBUElzIHVzZWQgdG8gZXhpc3Qgb24gY2xhc3NpYyBSZWFjdCBjbGFzc2VzIGJ1dCBzaW5jZVxuICogd2Ugd291bGQgbGlrZSB0byBkZXByZWNhdGUgdGhlbSwgd2UncmUgbm90IGdvaW5nIHRvIG1vdmUgdGhlbSBvdmVyIHRvIHRoaXNcbiAqIG1vZGVybiBiYXNlIGNsYXNzLiBJbnN0ZWFkLCB3ZSBkZWZpbmUgYSBnZXR0ZXIgdGhhdCB3YXJucyBpZiBpdCdzIGFjY2Vzc2VkLlxuICovXG57XG4gIHZhciBkZXByZWNhdGVkQVBJcyA9IHtcbiAgICBpc01vdW50ZWQ6IFsnaXNNb3VudGVkJywgJ0luc3RlYWQsIG1ha2Ugc3VyZSB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zIGFuZCBwZW5kaW5nIHJlcXVlc3RzIGluICcgKyAnY29tcG9uZW50V2lsbFVubW91bnQgdG8gcHJldmVudCBtZW1vcnkgbGVha3MuJ10sXG4gICAgcmVwbGFjZVN0YXRlOiBbJ3JlcGxhY2VTdGF0ZScsICdSZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIHNldFN0YXRlIGluc3RlYWQgKHNlZSAnICsgJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMzIzNikuJ11cbiAgfTtcbiAgdmFyIGRlZmluZURlcHJlY2F0aW9uV2FybmluZyA9IGZ1bmN0aW9uIChtZXRob2ROYW1lLCBpbmZvKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbXBvbmVudC5wcm90b3R5cGUsIG1ldGhvZE5hbWUsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBsb3dQcmlvcml0eVdhcm5pbmckMShmYWxzZSwgJyVzKC4uLikgaXMgZGVwcmVjYXRlZCBpbiBwbGFpbiBKYXZhU2NyaXB0IFJlYWN0IGNsYXNzZXMuICVzJywgaW5mb1swXSwgaW5mb1sxXSk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGZvciAodmFyIGZuTmFtZSBpbiBkZXByZWNhdGVkQVBJcykge1xuICAgIGlmIChkZXByZWNhdGVkQVBJcy5oYXNPd25Qcm9wZXJ0eShmbk5hbWUpKSB7XG4gICAgICBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcoZm5OYW1lLCBkZXByZWNhdGVkQVBJc1tmbk5hbWVdKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gQ29tcG9uZW50RHVtbXkoKSB7fVxuQ29tcG9uZW50RHVtbXkucHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcblxuLyoqXG4gKiBDb252ZW5pZW5jZSBjb21wb25lbnQgd2l0aCBkZWZhdWx0IHNoYWxsb3cgZXF1YWxpdHkgY2hlY2sgZm9yIHNDVS5cbiAqL1xuZnVuY3Rpb24gUHVyZUNvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIC8vIElmIGEgY29tcG9uZW50IGhhcyBzdHJpbmcgcmVmcywgd2Ugd2lsbCBhc3NpZ24gYSBkaWZmZXJlbnQgb2JqZWN0IGxhdGVyLlxuICB0aGlzLnJlZnMgPSBlbXB0eU9iamVjdDtcbiAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcbn1cblxudmFyIHB1cmVDb21wb25lbnRQcm90b3R5cGUgPSBQdXJlQ29tcG9uZW50LnByb3RvdHlwZSA9IG5ldyBDb21wb25lbnREdW1teSgpO1xucHVyZUNvbXBvbmVudFByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFB1cmVDb21wb25lbnQ7XG4vLyBBdm9pZCBhbiBleHRyYSBwcm90b3R5cGUganVtcCBmb3IgdGhlc2UgbWV0aG9kcy5cbl9hc3NpZ24ocHVyZUNvbXBvbmVudFByb3RvdHlwZSwgQ29tcG9uZW50LnByb3RvdHlwZSk7XG5wdXJlQ29tcG9uZW50UHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ID0gdHJ1ZTtcblxuLy8gYW4gaW1tdXRhYmxlIG9iamVjdCB3aXRoIGEgc2luZ2xlIG11dGFibGUgdmFsdWVcbmZ1bmN0aW9uIGNyZWF0ZVJlZigpIHtcbiAgdmFyIHJlZk9iamVjdCA9IHtcbiAgICBjdXJyZW50OiBudWxsXG4gIH07XG4gIHtcbiAgICBPYmplY3Quc2VhbChyZWZPYmplY3QpO1xuICB9XG4gIHJldHVybiByZWZPYmplY3Q7XG59XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgZGlzcGF0Y2hlci5cbiAqL1xudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHR5cGUge1JlYWN0Q29tcG9uZW50fVxuICAgKi9cbiAgY3VycmVudDogbnVsbFxufTtcblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBvd25lci5cbiAqXG4gKiBUaGUgY3VycmVudCBvd25lciBpcyB0aGUgY29tcG9uZW50IHdobyBzaG91bGQgb3duIGFueSBjb21wb25lbnRzIHRoYXQgYXJlXG4gKiBjdXJyZW50bHkgYmVpbmcgY29uc3RydWN0ZWQuXG4gKi9cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAdHlwZSB7UmVhY3RDb21wb25lbnR9XG4gICAqL1xuICBjdXJyZW50OiBudWxsXG59O1xuXG52YXIgQkVGT1JFX1NMQVNIX1JFID0gL14oLiopW1xcXFxcXC9dLztcblxudmFyIGRlc2NyaWJlQ29tcG9uZW50RnJhbWUgPSBmdW5jdGlvbiAobmFtZSwgc291cmNlLCBvd25lck5hbWUpIHtcbiAgdmFyIHNvdXJjZUluZm8gPSAnJztcbiAgaWYgKHNvdXJjZSkge1xuICAgIHZhciBwYXRoID0gc291cmNlLmZpbGVOYW1lO1xuICAgIHZhciBmaWxlTmFtZSA9IHBhdGgucmVwbGFjZShCRUZPUkVfU0xBU0hfUkUsICcnKTtcbiAgICB7XG4gICAgICAvLyBJbiBERVYsIGluY2x1ZGUgY29kZSBmb3IgYSBjb21tb24gc3BlY2lhbCBjYXNlOlxuICAgICAgLy8gcHJlZmVyIFwiZm9sZGVyL2luZGV4LmpzXCIgaW5zdGVhZCBvZiBqdXN0IFwiaW5kZXguanNcIi5cbiAgICAgIGlmICgvXmluZGV4XFwuLy50ZXN0KGZpbGVOYW1lKSkge1xuICAgICAgICB2YXIgbWF0Y2ggPSBwYXRoLm1hdGNoKEJFRk9SRV9TTEFTSF9SRSk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIHZhciBwYXRoQmVmb3JlU2xhc2ggPSBtYXRjaFsxXTtcbiAgICAgICAgICBpZiAocGF0aEJlZm9yZVNsYXNoKSB7XG4gICAgICAgICAgICB2YXIgZm9sZGVyTmFtZSA9IHBhdGhCZWZvcmVTbGFzaC5yZXBsYWNlKEJFRk9SRV9TTEFTSF9SRSwgJycpO1xuICAgICAgICAgICAgZmlsZU5hbWUgPSBmb2xkZXJOYW1lICsgJy8nICsgZmlsZU5hbWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHNvdXJjZUluZm8gPSAnIChhdCAnICsgZmlsZU5hbWUgKyAnOicgKyBzb3VyY2UubGluZU51bWJlciArICcpJztcbiAgfSBlbHNlIGlmIChvd25lck5hbWUpIHtcbiAgICBzb3VyY2VJbmZvID0gJyAoY3JlYXRlZCBieSAnICsgb3duZXJOYW1lICsgJyknO1xuICB9XG4gIHJldHVybiAnXFxuICAgIGluICcgKyAobmFtZSB8fCAnVW5rbm93bicpICsgc291cmNlSW5mbztcbn07XG5cbnZhciBSZXNvbHZlZCA9IDE7XG5cblxuZnVuY3Rpb24gcmVmaW5lUmVzb2x2ZWRMYXp5Q29tcG9uZW50KGxhenlDb21wb25lbnQpIHtcbiAgcmV0dXJuIGxhenlDb21wb25lbnQuX3N0YXR1cyA9PT0gUmVzb2x2ZWQgPyBsYXp5Q29tcG9uZW50Ll9yZXN1bHQgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRXcmFwcGVkTmFtZShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIG91dGVyVHlwZS5kaXNwbGF5TmFtZSB8fCAoZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgJygnICsgZnVuY3Rpb25OYW1lICsgJyknIDogd3JhcHBlck5hbWUpO1xufVxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHtcbiAgICBpZiAodHlwZW9mIHR5cGUudGFnID09PSAnbnVtYmVyJykge1xuICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZSgpLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gIH1cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU6XG4gICAgICByZXR1cm4gJ0NvbmN1cnJlbnRNb2RlJztcbiAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcbiAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7XG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG4gIH1cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgIHJldHVybiAnQ29udGV4dC5Db25zdW1lcic7XG4gICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgIHJldHVybiAnQ29udGV4dC5Qcm92aWRlcic7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBnZXRXcmFwcGVkTmFtZSh0eXBlLCB0eXBlLnJlbmRlciwgJ0ZvcndhcmRSZWYnKTtcbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZSh0eXBlLnR5cGUpO1xuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgdGhlbmFibGUgPSB0eXBlO1xuICAgICAgICAgIHZhciByZXNvbHZlZFRoZW5hYmxlID0gcmVmaW5lUmVzb2x2ZWRMYXp5Q29tcG9uZW50KHRoZW5hYmxlKTtcbiAgICAgICAgICBpZiAocmVzb2x2ZWRUaGVuYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUocmVzb2x2ZWRUaGVuYWJsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IHt9O1xuXG52YXIgY3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQgPSBudWxsO1xuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KSB7XG4gIHtcbiAgICBjdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCA9IGVsZW1lbnQ7XG4gIH1cbn1cblxue1xuICAvLyBTdGFjayBpbXBsZW1lbnRhdGlvbiBpbmplY3RlZCBieSB0aGUgY3VycmVudCByZW5kZXJlci5cbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2sgPSBudWxsO1xuXG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhY2sgPSAnJztcblxuICAgIC8vIEFkZCBhbiBleHRyYSB0b3AgZnJhbWUgd2hpbGUgYW4gZWxlbWVudCBpcyBiZWluZyB2YWxpZGF0ZWRcbiAgICBpZiAoY3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQpIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudC50eXBlKTtcbiAgICAgIHZhciBvd25lciA9IGN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50Ll9vd25lcjtcbiAgICAgIHN0YWNrICs9IGRlc2NyaWJlQ29tcG9uZW50RnJhbWUobmFtZSwgY3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQuX3NvdXJjZSwgb3duZXIgJiYgZ2V0Q29tcG9uZW50TmFtZShvd25lci50eXBlKSk7XG4gICAgfVxuXG4gICAgLy8gRGVsZWdhdGUgdG8gdGhlIGluamVjdGVkIHJlbmRlcmVyLXNwZWNpZmljIGltcGxlbWVudGF0aW9uXG4gICAgdmFyIGltcGwgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjaztcbiAgICBpZiAoaW1wbCkge1xuICAgICAgc3RhY2sgKz0gaW1wbCgpIHx8ICcnO1xuICAgIH1cblxuICAgIHJldHVybiBzdGFjaztcbiAgfTtcbn1cblxudmFyIFJlYWN0U2hhcmVkSW50ZXJuYWxzID0ge1xuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyOiBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICBSZWFjdEN1cnJlbnRPd25lcjogUmVhY3RDdXJyZW50T3duZXIsXG4gIC8vIFVzZWQgYnkgcmVuZGVyZXJzIHRvIGF2b2lkIGJ1bmRsaW5nIG9iamVjdC1hc3NpZ24gdHdpY2UgaW4gVU1EIGJ1bmRsZXM6XG4gIGFzc2lnbjogX2Fzc2lnblxufTtcblxue1xuICBfYXNzaWduKFJlYWN0U2hhcmVkSW50ZXJuYWxzLCB7XG4gICAgLy8gVGhlc2Ugc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiBwcm9kdWN0aW9uLlxuICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWU6IFJlYWN0RGVidWdDdXJyZW50RnJhbWUsXG4gICAgLy8gU2hpbSBmb3IgUmVhY3QgRE9NIDE2LjAuMCB3aGljaCBzdGlsbCBkZXN0cnVjdHVyZWQgKGJ1dCBub3QgdXNlZCkgdGhpcy5cbiAgICAvLyBUT0RPOiByZW1vdmUgaW4gUmVhY3QgMTcuMC5cbiAgICBSZWFjdENvbXBvbmVudFRyZWVIb29rOiB7fVxuICB9KTtcbn1cblxuLyoqXG4gKiBTaW1pbGFyIHRvIGludmFyaWFudCBidXQgb25seSBsb2dzIGEgd2FybmluZyBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBtZXQuXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGxvZyBpc3N1ZXMgaW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzIGluIGNyaXRpY2FsXG4gKiBwYXRocy4gUmVtb3ZpbmcgdGhlIGxvZ2dpbmcgY29kZSBmb3IgcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMgd2lsbCBrZWVwIHRoZVxuICogc2FtZSBsb2dpYyBhbmQgZm9sbG93IHRoZSBzYW1lIGNvZGUgcGF0aHMuXG4gKi9cblxudmFyIHdhcm5pbmcgPSB3YXJuaW5nV2l0aG91dFN0YWNrJDE7XG5cbntcbiAgd2FybmluZyA9IGZ1bmN0aW9uIChjb25kaXRpb24sIGZvcm1hdCkge1xuICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC93YXJuaW5nLWFuZC1pbnZhcmlhbnQtYXJnc1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMiA/IF9sZW4gLSAyIDogMCksIF9rZXkgPSAyOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAyXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEuYXBwbHkodW5kZWZpbmVkLCBbZmFsc2UsIGZvcm1hdCArICclcyddLmNvbmNhdChhcmdzLCBbc3RhY2tdKSk7XG4gIH07XG59XG5cbnZhciB3YXJuaW5nJDEgPSB3YXJuaW5nO1xuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgUkVTRVJWRURfUFJPUFMgPSB7XG4gIGtleTogdHJ1ZSxcbiAgcmVmOiB0cnVlLFxuICBfX3NlbGY6IHRydWUsXG4gIF9fc291cmNlOiB0cnVlXG59O1xuXG52YXIgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24gPSB2b2lkIDA7XG52YXIgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24gPSB2b2lkIDA7XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkUmVmKGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAncmVmJykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ3JlZicpLmdldDtcbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbmZpZy5yZWYgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRLZXkoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdrZXknKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAna2V5JykuZ2V0O1xuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY29uZmlnLmtleSAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ0tleSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duKSB7XG4gICAgICBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9IHRydWU7XG4gICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICclczogYGtleWAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vZmIubWUvcmVhY3Qtc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgfVxuICB9O1xuICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdrZXknLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdLZXksXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ1JlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duKSB7XG4gICAgICBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biA9IHRydWU7XG4gICAgICB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICclczogYHJlZmAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vZmIubWUvcmVhY3Qtc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgfVxuICB9O1xuICB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdyZWYnLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBSZWFjdCBlbGVtZW50LiBUaGlzIG5vIGxvbmdlciBhZGhlcmVzIHRvXG4gKiB0aGUgY2xhc3MgcGF0dGVybiwgc28gZG8gbm90IHVzZSBuZXcgdG8gY2FsbCBpdC4gQWxzbywgbm8gaW5zdGFuY2VvZiBjaGVja1xuICogd2lsbCB3b3JrLiBJbnN0ZWFkIHRlc3QgJCR0eXBlb2YgZmllbGQgYWdhaW5zdCBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgdG8gY2hlY2tcbiAqIGlmIHNvbWV0aGluZyBpcyBhIFJlYWN0IEVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHsqfSB0eXBlXG4gKiBAcGFyYW0geyp9IGtleVxuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSByZWZcbiAqIEBwYXJhbSB7Kn0gc2VsZiBBICp0ZW1wb3JhcnkqIGhlbHBlciB0byBkZXRlY3QgcGxhY2VzIHdoZXJlIGB0aGlzYCBpc1xuICogZGlmZmVyZW50IGZyb20gdGhlIGBvd25lcmAgd2hlbiBSZWFjdC5jcmVhdGVFbGVtZW50IGlzIGNhbGxlZCwgc28gdGhhdCB3ZVxuICogY2FuIHdhcm4uIFdlIHdhbnQgdG8gZ2V0IHJpZCBvZiBvd25lciBhbmQgcmVwbGFjZSBzdHJpbmcgYHJlZmBzIHdpdGggYXJyb3dcbiAqIGZ1bmN0aW9ucywgYW5kIGFzIGxvbmcgYXMgYHRoaXNgIGFuZCBvd25lciBhcmUgdGhlIHNhbWUsIHRoZXJlIHdpbGwgYmUgbm9cbiAqIGNoYW5nZSBpbiBiZWhhdmlvci5cbiAqIEBwYXJhbSB7Kn0gc291cmNlIEFuIGFubm90YXRpb24gb2JqZWN0IChhZGRlZCBieSBhIHRyYW5zcGlsZXIgb3Igb3RoZXJ3aXNlKVxuICogaW5kaWNhdGluZyBmaWxlbmFtZSwgbGluZSBudW1iZXIsIGFuZC9vciBvdGhlciBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSB7Kn0gb3duZXJcbiAqIEBwYXJhbSB7Kn0gcHJvcHNcbiAqIEBpbnRlcm5hbFxuICovXG52YXIgUmVhY3RFbGVtZW50ID0gZnVuY3Rpb24gKHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcykge1xuICB2YXIgZWxlbWVudCA9IHtcbiAgICAvLyBUaGlzIHRhZyBhbGxvd3MgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IEVsZW1lbnRcbiAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuXG4gICAgLy8gQnVpbHQtaW4gcHJvcGVydGllcyB0aGF0IGJlbG9uZyBvbiB0aGUgZWxlbWVudFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXksXG4gICAgcmVmOiByZWYsXG4gICAgcHJvcHM6IHByb3BzLFxuXG4gICAgLy8gUmVjb3JkIHRoZSBjb21wb25lbnQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgZWxlbWVudC5cbiAgICBfb3duZXI6IG93bmVyXG4gIH07XG5cbiAge1xuICAgIC8vIFRoZSB2YWxpZGF0aW9uIGZsYWcgaXMgY3VycmVudGx5IG11dGF0aXZlLiBXZSBwdXQgaXQgb25cbiAgICAvLyBhbiBleHRlcm5hbCBiYWNraW5nIHN0b3JlIHNvIHRoYXQgd2UgY2FuIGZyZWV6ZSB0aGUgd2hvbGUgb2JqZWN0LlxuICAgIC8vIFRoaXMgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBXZWFrTWFwIG9uY2UgdGhleSBhcmUgaW1wbGVtZW50ZWQgaW5cbiAgICAvLyBjb21tb25seSB1c2VkIGRldmVsb3BtZW50IGVudmlyb25tZW50cy5cbiAgICBlbGVtZW50Ll9zdG9yZSA9IHt9O1xuXG4gICAgLy8gVG8gbWFrZSBjb21wYXJpbmcgUmVhY3RFbGVtZW50cyBlYXNpZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHdlIG1ha2VcbiAgICAvLyB0aGUgdmFsaWRhdGlvbiBmbGFnIG5vbi1lbnVtZXJhYmxlICh3aGVyZSBwb3NzaWJsZSwgd2hpY2ggc2hvdWxkXG4gICAgLy8gaW5jbHVkZSBldmVyeSBlbnZpcm9ubWVudCB3ZSBydW4gdGVzdHMgaW4pLCBzbyB0aGUgdGVzdCBmcmFtZXdvcmtcbiAgICAvLyBpZ25vcmVzIGl0LlxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50Ll9zdG9yZSwgJ3ZhbGlkYXRlZCcsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGZhbHNlXG4gICAgfSk7XG4gICAgLy8gc2VsZiBhbmQgc291cmNlIGFyZSBERVYgb25seSBwcm9wZXJ0aWVzLlxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NlbGYnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc2VsZlxuICAgIH0pO1xuICAgIC8vIFR3byBlbGVtZW50cyBjcmVhdGVkIGluIHR3byBkaWZmZXJlbnQgcGxhY2VzIHNob3VsZCBiZSBjb25zaWRlcmVkXG4gICAgLy8gZXF1YWwgZm9yIHRlc3RpbmcgcHVycG9zZXMgYW5kIHRoZXJlZm9yZSB3ZSBoaWRlIGl0IGZyb20gZW51bWVyYXRpb24uXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc291cmNlJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNvdXJjZVxuICAgIH0pO1xuICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQucHJvcHMpO1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IG9mIHRoZSBnaXZlbiB0eXBlLlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjcmVhdGVlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodHlwZSwgY29uZmlnLCBjaGlsZHJlbikge1xuICB2YXIgcHJvcE5hbWUgPSB2b2lkIDA7XG5cbiAgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuICB2YXIgcHJvcHMgPSB7fTtcblxuICB2YXIga2V5ID0gbnVsbDtcbiAgdmFyIHJlZiA9IG51bGw7XG4gIHZhciBzZWxmID0gbnVsbDtcbiAgdmFyIHNvdXJjZSA9IG51bGw7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIHJlZiA9IGNvbmZpZy5yZWY7XG4gICAgfVxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfVxuXG4gICAgc2VsZiA9IGNvbmZpZy5fX3NlbGYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zZWxmO1xuICAgIHNvdXJjZSA9IGNvbmZpZy5fX3NvdXJjZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbmZpZy5fX3NvdXJjZTtcbiAgICAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gYSBuZXcgcHJvcHMgb2JqZWN0XG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvXG4gIC8vIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0LlxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cbiAgICB7XG4gICAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgICBPYmplY3QuZnJlZXplKGNoaWxkQXJyYXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gIH1cblxuICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcbiAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7XG4gICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB7XG4gICAgaWYgKGtleSB8fCByZWYpIHtcbiAgICAgIHZhciBkaXNwbGF5TmFtZSA9IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nID8gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgJ1Vua25vd24nIDogdHlwZTtcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFJlYWN0RWxlbWVudCh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LCBwcm9wcyk7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBSZWFjdEVsZW1lbnRzIG9mIGEgZ2l2ZW4gdHlwZS5cbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjY3JlYXRlZmFjdG9yeVxuICovXG5cblxuZnVuY3Rpb24gY2xvbmVBbmRSZXBsYWNlS2V5KG9sZEVsZW1lbnQsIG5ld0tleSkge1xuICB2YXIgbmV3RWxlbWVudCA9IFJlYWN0RWxlbWVudChvbGRFbGVtZW50LnR5cGUsIG5ld0tleSwgb2xkRWxlbWVudC5yZWYsIG9sZEVsZW1lbnQuX3NlbGYsIG9sZEVsZW1lbnQuX3NvdXJjZSwgb2xkRWxlbWVudC5fb3duZXIsIG9sZEVsZW1lbnQucHJvcHMpO1xuXG4gIHJldHVybiBuZXdFbGVtZW50O1xufVxuXG4vKipcbiAqIENsb25lIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IHVzaW5nIGVsZW1lbnQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjbG9uZWVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gY2xvbmVFbGVtZW50KGVsZW1lbnQsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgISEoZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB1bmRlZmluZWQpID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3QuY2xvbmVFbGVtZW50KC4uLik6IFRoZSBhcmd1bWVudCBtdXN0IGJlIGEgUmVhY3QgZWxlbWVudCwgYnV0IHlvdSBwYXNzZWQgJXMuJywgZWxlbWVudCkgOiB2b2lkIDA7XG5cbiAgdmFyIHByb3BOYW1lID0gdm9pZCAwO1xuXG4gIC8vIE9yaWdpbmFsIHByb3BzIGFyZSBjb3BpZWRcbiAgdmFyIHByb3BzID0gX2Fzc2lnbih7fSwgZWxlbWVudC5wcm9wcyk7XG5cbiAgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gIHZhciByZWYgPSBlbGVtZW50LnJlZjtcbiAgLy8gU2VsZiBpcyBwcmVzZXJ2ZWQgc2luY2UgdGhlIG93bmVyIGlzIHByZXNlcnZlZC5cbiAgdmFyIHNlbGYgPSBlbGVtZW50Ll9zZWxmO1xuICAvLyBTb3VyY2UgaXMgcHJlc2VydmVkIHNpbmNlIGNsb25lRWxlbWVudCBpcyB1bmxpa2VseSB0byBiZSB0YXJnZXRlZCBieSBhXG4gIC8vIHRyYW5zcGlsZXIsIGFuZCB0aGUgb3JpZ2luYWwgc291cmNlIGlzIHByb2JhYmx5IGEgYmV0dGVyIGluZGljYXRvciBvZiB0aGVcbiAgLy8gdHJ1ZSBvd25lci5cbiAgdmFyIHNvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcblxuICAvLyBPd25lciB3aWxsIGJlIHByZXNlcnZlZCwgdW5sZXNzIHJlZiBpcyBvdmVycmlkZGVuXG4gIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuXG4gIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgIGlmIChoYXNWYWxpZFJlZihjb25maWcpKSB7XG4gICAgICAvLyBTaWxlbnRseSBzdGVhbCB0aGUgcmVmIGZyb20gdGhlIHBhcmVudC5cbiAgICAgIHJlZiA9IGNvbmZpZy5yZWY7XG4gICAgICBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ7XG4gICAgfVxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfVxuXG4gICAgLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgb3ZlcnJpZGUgZXhpc3RpbmcgcHJvcHNcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gdm9pZCAwO1xuICAgIGlmIChlbGVtZW50LnR5cGUgJiYgZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcykge1xuICAgICAgZGVmYXVsdFByb3BzID0gZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcztcbiAgICB9XG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgaWYgKGNvbmZpZ1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgfVxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfVxuXG4gIHJldHVybiBSZWFjdEVsZW1lbnQoZWxlbWVudC50eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpO1xufVxuXG4vKipcbiAqIFZlcmlmaWVzIHRoZSBvYmplY3QgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2lzdmFsaWRlbGVtZW50XG4gKiBAcGFyYW0gez9vYmplY3R9IG9iamVjdFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgb2JqZWN0YCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIEBmaW5hbFxuICovXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cblxudmFyIFNFUEFSQVRPUiA9ICcuJztcbnZhciBTVUJTRVBBUkFUT1IgPSAnOic7XG5cbi8qKlxuICogRXNjYXBlIGFuZCB3cmFwIGtleSBzbyBpdCBpcyBzYWZlIHRvIHVzZSBhcyBhIHJlYWN0aWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRvIGJlIGVzY2FwZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBlc2NhcGVkIGtleS5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlKGtleSkge1xuICB2YXIgZXNjYXBlUmVnZXggPSAvWz06XS9nO1xuICB2YXIgZXNjYXBlckxvb2t1cCA9IHtcbiAgICAnPSc6ICc9MCcsXG4gICAgJzonOiAnPTInXG4gIH07XG4gIHZhciBlc2NhcGVkU3RyaW5nID0gKCcnICsga2V5KS5yZXBsYWNlKGVzY2FwZVJlZ2V4LCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICByZXR1cm4gZXNjYXBlckxvb2t1cFttYXRjaF07XG4gIH0pO1xuXG4gIHJldHVybiAnJCcgKyBlc2NhcGVkU3RyaW5nO1xufVxuXG4vKipcbiAqIFRPRE86IFRlc3QgdGhhdCBhIHNpbmdsZSBjaGlsZCBhbmQgYW4gYXJyYXkgd2l0aCBvbmUgaXRlbSBoYXZlIHRoZSBzYW1lIGtleVxuICogcGF0dGVybi5cbiAqL1xuXG52YXIgZGlkV2FybkFib3V0TWFwcyA9IGZhbHNlO1xuXG52YXIgdXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXggPSAvXFwvKy9nO1xuZnVuY3Rpb24gZXNjYXBlVXNlclByb3ZpZGVkS2V5KHRleHQpIHtcbiAgcmV0dXJuICgnJyArIHRleHQpLnJlcGxhY2UodXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXgsICckJi8nKTtcbn1cblxudmFyIFBPT0xfU0laRSA9IDEwO1xudmFyIHRyYXZlcnNlQ29udGV4dFBvb2wgPSBbXTtcbmZ1bmN0aW9uIGdldFBvb2xlZFRyYXZlcnNlQ29udGV4dChtYXBSZXN1bHQsIGtleVByZWZpeCwgbWFwRnVuY3Rpb24sIG1hcENvbnRleHQpIHtcbiAgaWYgKHRyYXZlcnNlQ29udGV4dFBvb2wubGVuZ3RoKSB7XG4gICAgdmFyIHRyYXZlcnNlQ29udGV4dCA9IHRyYXZlcnNlQ29udGV4dFBvb2wucG9wKCk7XG4gICAgdHJhdmVyc2VDb250ZXh0LnJlc3VsdCA9IG1hcFJlc3VsdDtcbiAgICB0cmF2ZXJzZUNvbnRleHQua2V5UHJlZml4ID0ga2V5UHJlZml4O1xuICAgIHRyYXZlcnNlQ29udGV4dC5mdW5jID0gbWFwRnVuY3Rpb247XG4gICAgdHJhdmVyc2VDb250ZXh0LmNvbnRleHQgPSBtYXBDb250ZXh0O1xuICAgIHRyYXZlcnNlQ29udGV4dC5jb3VudCA9IDA7XG4gICAgcmV0dXJuIHRyYXZlcnNlQ29udGV4dDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdWx0OiBtYXBSZXN1bHQsXG4gICAgICBrZXlQcmVmaXg6IGtleVByZWZpeCxcbiAgICAgIGZ1bmM6IG1hcEZ1bmN0aW9uLFxuICAgICAgY29udGV4dDogbWFwQ29udGV4dCxcbiAgICAgIGNvdW50OiAwXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWxlYXNlVHJhdmVyc2VDb250ZXh0KHRyYXZlcnNlQ29udGV4dCkge1xuICB0cmF2ZXJzZUNvbnRleHQucmVzdWx0ID0gbnVsbDtcbiAgdHJhdmVyc2VDb250ZXh0LmtleVByZWZpeCA9IG51bGw7XG4gIHRyYXZlcnNlQ29udGV4dC5mdW5jID0gbnVsbDtcbiAgdHJhdmVyc2VDb250ZXh0LmNvbnRleHQgPSBudWxsO1xuICB0cmF2ZXJzZUNvbnRleHQuY291bnQgPSAwO1xuICBpZiAodHJhdmVyc2VDb250ZXh0UG9vbC5sZW5ndGggPCBQT09MX1NJWkUpIHtcbiAgICB0cmF2ZXJzZUNvbnRleHRQb29sLnB1c2godHJhdmVyc2VDb250ZXh0KTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHshc3RyaW5nfSBuYW1lU29GYXIgTmFtZSBvZiB0aGUga2V5IHBhdGggc28gZmFyLlxuICogQHBhcmFtIHshZnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIHRvIGludm9rZSB3aXRoIGVhY2ggY2hpbGQgZm91bmQuXG4gKiBAcGFyYW0gez8qfSB0cmF2ZXJzZUNvbnRleHQgVXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRocm91Z2hvdXQgdGhlIHRyYXZlcnNhbFxuICogcHJvY2Vzcy5cbiAqIEByZXR1cm4geyFudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhpcyBzdWJ0cmVlLlxuICovXG5mdW5jdGlvbiB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZHJlbiwgbmFtZVNvRmFyLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGNoaWxkcmVuO1xuXG4gIGlmICh0eXBlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAvLyBBbGwgb2YgdGhlIGFib3ZlIGFyZSBwZXJjZWl2ZWQgYXMgbnVsbC5cbiAgICBjaGlsZHJlbiA9IG51bGw7XG4gIH1cblxuICB2YXIgaW52b2tlQ2FsbGJhY2sgPSBmYWxzZTtcblxuICBpZiAoY2hpbGRyZW4gPT09IG51bGwpIHtcbiAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHN3aXRjaCAoY2hpbGRyZW4uJCR0eXBlb2YpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGludm9rZUNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sodHJhdmVyc2VDb250ZXh0LCBjaGlsZHJlbixcbiAgICAvLyBJZiBpdCdzIHRoZSBvbmx5IGNoaWxkLCB0cmVhdCB0aGUgbmFtZSBhcyBpZiBpdCB3YXMgd3JhcHBlZCBpbiBhbiBhcnJheVxuICAgIC8vIHNvIHRoYXQgaXQncyBjb25zaXN0ZW50IGlmIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gZ3Jvd3MuXG4gICAgbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiArIGdldENvbXBvbmVudEtleShjaGlsZHJlbiwgMCkgOiBuYW1lU29GYXIpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgdmFyIGNoaWxkID0gdm9pZCAwO1xuICB2YXIgbmV4dE5hbWUgPSB2b2lkIDA7XG4gIHZhciBzdWJ0cmVlQ291bnQgPSAwOyAvLyBDb3VudCBvZiBjaGlsZHJlbiBmb3VuZCBpbiB0aGUgY3VycmVudCBzdWJ0cmVlLlxuICB2YXIgbmV4dE5hbWVQcmVmaXggPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SIDogbmFtZVNvRmFyICsgU1VCU0VQQVJBVE9SO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkLCBpKTtcbiAgICAgIHN1YnRyZWVDb3VudCArPSB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZCwgbmV4dE5hbWUsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4oY2hpbGRyZW4pO1xuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAge1xuICAgICAgICAvLyBXYXJuIGFib3V0IHVzaW5nIE1hcHMgYXMgY2hpbGRyZW5cbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4gPT09IGNoaWxkcmVuLmVudHJpZXMpIHtcbiAgICAgICAgICAhZGlkV2FybkFib3V0TWFwcyA/IHdhcm5pbmckMShmYWxzZSwgJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgdW5zdXBwb3J0ZWQgYW5kIHdpbGwgbGlrZWx5IHlpZWxkICcgKyAndW5leHBlY3RlZCByZXN1bHRzLiBDb252ZXJ0IGl0IHRvIGEgc2VxdWVuY2UvaXRlcmFibGUgb2Yga2V5ZWQgJyArICdSZWFjdEVsZW1lbnRzIGluc3RlYWQuJykgOiB2b2lkIDA7XG4gICAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGNoaWxkcmVuKTtcbiAgICAgIHZhciBzdGVwID0gdm9pZCAwO1xuICAgICAgdmFyIGlpID0gMDtcbiAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgY2hpbGQgPSBzdGVwLnZhbHVlO1xuICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkLCBpaSsrKTtcbiAgICAgICAgc3VidHJlZUNvdW50ICs9IHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkLCBuZXh0TmFtZSwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIGFkZGVuZHVtID0gJyc7XG4gICAgICB7XG4gICAgICAgIGFkZGVuZHVtID0gJyBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5ICcgKyAnaW5zdGVhZC4nICsgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKCk7XG4gICAgICB9XG4gICAgICB2YXIgY2hpbGRyZW5TdHJpbmcgPSAnJyArIGNoaWxkcmVuO1xuICAgICAgaW52YXJpYW50KGZhbHNlLCAnT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiAlcykuJXMnLCBjaGlsZHJlblN0cmluZyA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKGNoaWxkcmVuKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRyZW5TdHJpbmcsIGFkZGVuZHVtKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3VidHJlZUNvdW50O1xufVxuXG4vKipcbiAqIFRyYXZlcnNlcyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAsIGJ1dFxuICogbWlnaHQgYWxzbyBiZSBzcGVjaWZpZWQgdGhyb3VnaCBhdHRyaWJ1dGVzOlxuICpcbiAqIC0gYHRyYXZlcnNlQWxsQ2hpbGRyZW4odGhpcy5wcm9wcy5jaGlsZHJlbiwgLi4uKWBcbiAqIC0gYHRyYXZlcnNlQWxsQ2hpbGRyZW4odGhpcy5wcm9wcy5sZWZ0UGFuZWxDaGlsZHJlbiwgLi4uKWBcbiAqXG4gKiBUaGUgYHRyYXZlcnNlQ29udGV4dGAgaXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdGhyb3VnaCB0aGVcbiAqIGVudGlyZSB0cmF2ZXJzYWwuIEl0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIGFjY3VtdWxhdGlvbnMgb3IgYW55dGhpbmcgZWxzZSB0aGF0XG4gKiB0aGUgY2FsbGJhY2sgbWlnaHQgZmluZCByZWxldmFudC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIG9iamVjdC5cbiAqIEBwYXJhbSB7IWZ1bmN0aW9ufSBjYWxsYmFjayBUbyBpbnZva2UgdXBvbiB0cmF2ZXJzaW5nIGVhY2ggY2hpbGQuXG4gKiBAcGFyYW0gez8qfSB0cmF2ZXJzZUNvbnRleHQgQ29udGV4dCBmb3IgdHJhdmVyc2FsLlxuICogQHJldHVybiB7IW51bWJlcn0gVGhlIG51bWJlciBvZiBjaGlsZHJlbiBpbiB0aGlzIHN1YnRyZWUuXG4gKi9cbmZ1bmN0aW9uIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZHJlbiwgJycsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEga2V5IHN0cmluZyB0aGF0IGlkZW50aWZpZXMgYSBjb21wb25lbnQgd2l0aGluIGEgc2V0LlxuICpcbiAqIEBwYXJhbSB7Kn0gY29tcG9uZW50IEEgY29tcG9uZW50IHRoYXQgY291bGQgY29udGFpbiBhIG1hbnVhbCBrZXkuXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggdGhhdCBpcyB1c2VkIGlmIGEgbWFudWFsIGtleSBpcyBub3QgcHJvdmlkZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldENvbXBvbmVudEtleShjb21wb25lbnQsIGluZGV4KSB7XG4gIC8vIERvIHNvbWUgdHlwZWNoZWNraW5nIGhlcmUgc2luY2Ugd2UgY2FsbCB0aGlzIGJsaW5kbHkuIFdlIHdhbnQgdG8gZW5zdXJlXG4gIC8vIHRoYXQgd2UgZG9uJ3QgYmxvY2sgcG90ZW50aWFsIGZ1dHVyZSBFUyBBUElzLlxuICBpZiAodHlwZW9mIGNvbXBvbmVudCA9PT0gJ29iamVjdCcgJiYgY29tcG9uZW50ICE9PSBudWxsICYmIGNvbXBvbmVudC5rZXkgIT0gbnVsbCkge1xuICAgIC8vIEV4cGxpY2l0IGtleVxuICAgIHJldHVybiBlc2NhcGUoY29tcG9uZW50LmtleSk7XG4gIH1cbiAgLy8gSW1wbGljaXQga2V5IGRldGVybWluZWQgYnkgdGhlIGluZGV4IGluIHRoZSBzZXRcbiAgcmV0dXJuIGluZGV4LnRvU3RyaW5nKDM2KTtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaFNpbmdsZUNoaWxkKGJvb2tLZWVwaW5nLCBjaGlsZCwgbmFtZSkge1xuICB2YXIgZnVuYyA9IGJvb2tLZWVwaW5nLmZ1bmMsXG4gICAgICBjb250ZXh0ID0gYm9va0tlZXBpbmcuY29udGV4dDtcblxuICBmdW5jLmNhbGwoY29udGV4dCwgY2hpbGQsIGJvb2tLZWVwaW5nLmNvdW50KyspO1xufVxuXG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmZvcmVhY2hcbiAqXG4gKiBUaGUgcHJvdmlkZWQgZm9yRWFjaEZ1bmMoY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZm9yRWFjaEZ1bmNcbiAqIEBwYXJhbSB7Kn0gZm9yRWFjaENvbnRleHQgQ29udGV4dCBmb3IgZm9yRWFjaENvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG4gIHZhciB0cmF2ZXJzZUNvbnRleHQgPSBnZXRQb29sZWRUcmF2ZXJzZUNvbnRleHQobnVsbCwgbnVsbCwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KTtcbiAgdHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaFNpbmdsZUNoaWxkLCB0cmF2ZXJzZUNvbnRleHQpO1xuICByZWxlYXNlVHJhdmVyc2VDb250ZXh0KHRyYXZlcnNlQ29udGV4dCk7XG59XG5cbmZ1bmN0aW9uIG1hcFNpbmdsZUNoaWxkSW50b0NvbnRleHQoYm9va0tlZXBpbmcsIGNoaWxkLCBjaGlsZEtleSkge1xuICB2YXIgcmVzdWx0ID0gYm9va0tlZXBpbmcucmVzdWx0LFxuICAgICAga2V5UHJlZml4ID0gYm9va0tlZXBpbmcua2V5UHJlZml4LFxuICAgICAgZnVuYyA9IGJvb2tLZWVwaW5nLmZ1bmMsXG4gICAgICBjb250ZXh0ID0gYm9va0tlZXBpbmcuY29udGV4dDtcblxuXG4gIHZhciBtYXBwZWRDaGlsZCA9IGZ1bmMuY2FsbChjb250ZXh0LCBjaGlsZCwgYm9va0tlZXBpbmcuY291bnQrKyk7XG4gIGlmIChBcnJheS5pc0FycmF5KG1hcHBlZENoaWxkKSkge1xuICAgIG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWwobWFwcGVkQ2hpbGQsIHJlc3VsdCwgY2hpbGRLZXksIGZ1bmN0aW9uIChjKSB7XG4gICAgICByZXR1cm4gYztcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChtYXBwZWRDaGlsZCAhPSBudWxsKSB7XG4gICAgaWYgKGlzVmFsaWRFbGVtZW50KG1hcHBlZENoaWxkKSkge1xuICAgICAgbWFwcGVkQ2hpbGQgPSBjbG9uZUFuZFJlcGxhY2VLZXkobWFwcGVkQ2hpbGQsXG4gICAgICAvLyBLZWVwIGJvdGggdGhlIChtYXBwZWQpIGFuZCBvbGQga2V5cyBpZiB0aGV5IGRpZmZlciwganVzdCBhc1xuICAgICAgLy8gdHJhdmVyc2VBbGxDaGlsZHJlbiB1c2VkIHRvIGRvIGZvciBvYmplY3RzIGFzIGNoaWxkcmVuXG4gICAgICBrZXlQcmVmaXggKyAobWFwcGVkQ2hpbGQua2V5ICYmICghY2hpbGQgfHwgY2hpbGQua2V5ICE9PSBtYXBwZWRDaGlsZC5rZXkpID8gZXNjYXBlVXNlclByb3ZpZGVkS2V5KG1hcHBlZENoaWxkLmtleSkgKyAnLycgOiAnJykgKyBjaGlsZEtleSk7XG4gICAgfVxuICAgIHJlc3VsdC5wdXNoKG1hcHBlZENoaWxkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXBJbnRvV2l0aEtleVByZWZpeEludGVybmFsKGNoaWxkcmVuLCBhcnJheSwgcHJlZml4LCBmdW5jLCBjb250ZXh0KSB7XG4gIHZhciBlc2NhcGVkUHJlZml4ID0gJyc7XG4gIGlmIChwcmVmaXggIT0gbnVsbCkge1xuICAgIGVzY2FwZWRQcmVmaXggPSBlc2NhcGVVc2VyUHJvdmlkZWRLZXkocHJlZml4KSArICcvJztcbiAgfVxuICB2YXIgdHJhdmVyc2VDb250ZXh0ID0gZ2V0UG9vbGVkVHJhdmVyc2VDb250ZXh0KGFycmF5LCBlc2NhcGVkUHJlZml4LCBmdW5jLCBjb250ZXh0KTtcbiAgdHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgbWFwU2luZ2xlQ2hpbGRJbnRvQ29udGV4dCwgdHJhdmVyc2VDb250ZXh0KTtcbiAgcmVsZWFzZVRyYXZlcnNlQ29udGV4dCh0cmF2ZXJzZUNvbnRleHQpO1xufVxuXG4vKipcbiAqIE1hcHMgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbm1hcFxuICpcbiAqIFRoZSBwcm92aWRlZCBtYXBGdW5jdGlvbihjaGlsZCwga2V5LCBpbmRleCkgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2hcbiAqIGxlYWYgY2hpbGQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZ1bmMgVGhlIG1hcCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBDb250ZXh0IGZvciBtYXBGdW5jdGlvbi5cbiAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yZGVyZWQgbWFwIG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jLCBjb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5hbChjaGlsZHJlbiwgcmVzdWx0LCBudWxsLCBmdW5jLCBjb250ZXh0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb3VudCB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXNcbiAqIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVuY291bnRcbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiBjaGlsZHJlbi5cbiAqL1xuZnVuY3Rpb24gY291bnRDaGlsZHJlbihjaGlsZHJlbikge1xuICByZXR1cm4gdHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9LCBudWxsKTtcbn1cblxuLyoqXG4gKiBGbGF0dGVuIGEgY2hpbGRyZW4gb2JqZWN0ICh0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmApIGFuZFxuICogcmV0dXJuIGFuIGFycmF5IHdpdGggYXBwcm9wcmlhdGVseSByZS1rZXllZCBjaGlsZHJlbi5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW50b2FycmF5XG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXkoY2hpbGRyZW4pIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBtYXBJbnRvV2l0aEtleVByZWZpeEludGVybmFsKGNoaWxkcmVuLCByZXN1bHQsIG51bGwsIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZDtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgaW4gYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuIGFuZCB2ZXJpZmllcyB0aGF0IHRoZXJlXG4gKiBpcyBvbmx5IG9uZSBjaGlsZCBpbiB0aGUgY29sbGVjdGlvbi5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5vbmx5XG4gKlxuICogVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgYSBzaW5nbGUgY2hpbGQgZ2V0c1xuICogcGFzc2VkIHdpdGhvdXQgYSB3cmFwcGVyLCBidXQgdGhlIHB1cnBvc2Ugb2YgdGhpcyBoZWxwZXIgZnVuY3Rpb24gaXMgdG9cbiAqIGFic3RyYWN0IGF3YXkgdGhlIHBhcnRpY3VsYXIgc3RydWN0dXJlIG9mIGNoaWxkcmVuLlxuICpcbiAqIEBwYXJhbSB7P29iamVjdH0gY2hpbGRyZW4gQ2hpbGQgY29sbGVjdGlvbiBzdHJ1Y3R1cmUuXG4gKiBAcmV0dXJuIHtSZWFjdEVsZW1lbnR9IFRoZSBmaXJzdCBhbmQgb25seSBgUmVhY3RFbGVtZW50YCBjb250YWluZWQgaW4gdGhlXG4gKiBzdHJ1Y3R1cmUuXG4gKi9cbmZ1bmN0aW9uIG9ubHlDaGlsZChjaGlsZHJlbikge1xuICAhaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3QuQ2hpbGRyZW4ub25seSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuJykgOiB2b2lkIDA7XG4gIHJldHVybiBjaGlsZHJlbjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChkZWZhdWx0VmFsdWUsIGNhbGN1bGF0ZUNoYW5nZWRCaXRzKSB7XG4gIGlmIChjYWxjdWxhdGVDaGFuZ2VkQml0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2FsY3VsYXRlQ2hhbmdlZEJpdHMgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgICEoY2FsY3VsYXRlQ2hhbmdlZEJpdHMgPT09IG51bGwgfHwgdHlwZW9mIGNhbGN1bGF0ZUNoYW5nZWRCaXRzID09PSAnZnVuY3Rpb24nKSA/IHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ2NyZWF0ZUNvbnRleHQ6IEV4cGVjdGVkIHRoZSBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcycsIGNhbGN1bGF0ZUNoYW5nZWRCaXRzKSA6IHZvaWQgMDtcbiAgICB9XG4gIH1cblxuICB2YXIgY29udGV4dCA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgIF9jYWxjdWxhdGVDaGFuZ2VkQml0czogY2FsY3VsYXRlQ2hhbmdlZEJpdHMsXG4gICAgLy8gQXMgYSB3b3JrYXJvdW5kIHRvIHN1cHBvcnQgbXVsdGlwbGUgY29uY3VycmVudCByZW5kZXJlcnMsIHdlIGNhdGVnb3JpemVcbiAgICAvLyBzb21lIHJlbmRlcmVycyBhcyBwcmltYXJ5IGFuZCBvdGhlcnMgYXMgc2Vjb25kYXJ5LiBXZSBvbmx5IGV4cGVjdFxuICAgIC8vIHRoZXJlIHRvIGJlIHR3byBjb25jdXJyZW50IHJlbmRlcmVycyBhdCBtb3N0OiBSZWFjdCBOYXRpdmUgKHByaW1hcnkpIGFuZFxuICAgIC8vIEZhYnJpYyAoc2Vjb25kYXJ5KTsgUmVhY3QgRE9NIChwcmltYXJ5KSBhbmQgUmVhY3QgQVJUIChzZWNvbmRhcnkpLlxuICAgIC8vIFNlY29uZGFyeSByZW5kZXJlcnMgc3RvcmUgdGhlaXIgY29udGV4dCB2YWx1ZXMgb24gc2VwYXJhdGUgZmllbGRzLlxuICAgIF9jdXJyZW50VmFsdWU6IGRlZmF1bHRWYWx1ZSxcbiAgICBfY3VycmVudFZhbHVlMjogZGVmYXVsdFZhbHVlLFxuICAgIC8vIFVzZWQgdG8gdHJhY2sgaG93IG1hbnkgY29uY3VycmVudCByZW5kZXJlcnMgdGhpcyBjb250ZXh0IGN1cnJlbnRseVxuICAgIC8vIHN1cHBvcnRzIHdpdGhpbiBpbiBhIHNpbmdsZSByZW5kZXJlci4gU3VjaCBhcyBwYXJhbGxlbCBzZXJ2ZXIgcmVuZGVyaW5nLlxuICAgIF90aHJlYWRDb3VudDogMCxcbiAgICAvLyBUaGVzZSBhcmUgY2lyY3VsYXJcbiAgICBQcm92aWRlcjogbnVsbCxcbiAgICBDb25zdW1lcjogbnVsbFxuICB9O1xuXG4gIGNvbnRleHQuUHJvdmlkZXIgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX1BST1ZJREVSX1RZUEUsXG4gICAgX2NvbnRleHQ6IGNvbnRleHRcbiAgfTtcblxuICB2YXIgaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMgPSBmYWxzZTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gZmFsc2U7XG5cbiAge1xuICAgIC8vIEEgc2VwYXJhdGUgb2JqZWN0LCBidXQgcHJveGllcyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjb250ZXh0IG9iamVjdCBmb3JcbiAgICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSXQgaGFzIGEgZGlmZmVyZW50ICQkdHlwZW9mLCBzbyB3ZSBjYW4gcHJvcGVybHlcbiAgICAvLyB3YXJuIGZvciB0aGUgaW5jb3JyZWN0IHVzYWdlIG9mIENvbnRleHQgYXMgYSBDb25zdW1lci5cbiAgICB2YXIgQ29uc3VtZXIgPSB7XG4gICAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgICAgX2NvbnRleHQ6IGNvbnRleHQsXG4gICAgICBfY2FsY3VsYXRlQ2hhbmdlZEJpdHM6IGNvbnRleHQuX2NhbGN1bGF0ZUNoYW5nZWRCaXRzXG4gICAgfTtcbiAgICAvLyAkRmxvd0ZpeE1lOiBGbG93IGNvbXBsYWlucyBhYm91dCBub3Qgc2V0dGluZyBhIHZhbHVlLCB3aGljaCBpcyBpbnRlbnRpb25hbCBoZXJlXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ29uc3VtZXIsIHtcbiAgICAgIFByb3ZpZGVyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIHdhcm5pbmckMShmYWxzZSwgJ1JlbmRlcmluZyA8Q29udGV4dC5Db25zdW1lci5Qcm92aWRlcj4gaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Qcm92aWRlcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuUHJvdmlkZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF9Qcm92aWRlcikge1xuICAgICAgICAgIGNvbnRleHQuUHJvdmlkZXIgPSBfUHJvdmlkZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfY3VycmVudFZhbHVlOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9jdXJyZW50VmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF9jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgPSBfY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX2N1cnJlbnRWYWx1ZTI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTI7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF9jdXJyZW50VmFsdWUyKSB7XG4gICAgICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlMiA9IF9jdXJyZW50VmFsdWUyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX3RocmVhZENvdW50OiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll90aHJlYWRDb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX3RocmVhZENvdW50KSB7XG4gICAgICAgICAgY29udGV4dC5fdGhyZWFkQ291bnQgPSBfdGhyZWFkQ291bnQ7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBDb25zdW1lcjoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdOZXN0ZWRDb250ZXh0Q29uc3VtZXJzKSB7XG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycyA9IHRydWU7XG4gICAgICAgICAgICB3YXJuaW5nJDEoZmFsc2UsICdSZW5kZXJpbmcgPENvbnRleHQuQ29uc3VtZXIuQ29uc3VtZXI+IGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byByZW5kZXIgPENvbnRleHQuQ29uc3VtZXI+IGluc3RlYWQ/Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjb250ZXh0LkNvbnN1bWVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gJEZsb3dGaXhNZTogRmxvdyBjb21wbGFpbnMgYWJvdXQgbWlzc2luZyBwcm9wZXJ0aWVzIGJlY2F1c2UgaXQgZG9lc24ndCB1bmRlcnN0YW5kIGRlZmluZVByb3BlcnR5XG4gICAgY29udGV4dC5Db25zdW1lciA9IENvbnN1bWVyO1xuICB9XG5cbiAge1xuICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IG51bGw7XG4gICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyMiA9IG51bGw7XG4gIH1cblxuICByZXR1cm4gY29udGV4dDtcbn1cblxuZnVuY3Rpb24gbGF6eShjdG9yKSB7XG4gIHZhciBsYXp5VHlwZSA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfTEFaWV9UWVBFLFxuICAgIF9jdG9yOiBjdG9yLFxuICAgIC8vIFJlYWN0IHVzZXMgdGhlc2UgZmllbGRzIHRvIHN0b3JlIHRoZSByZXN1bHQuXG4gICAgX3N0YXR1czogLTEsXG4gICAgX3Jlc3VsdDogbnVsbFxuICB9O1xuXG4gIHtcbiAgICAvLyBJbiBwcm9kdWN0aW9uLCB0aGlzIHdvdWxkIGp1c3Qgc2V0IGl0IG9uIHRoZSBvYmplY3QuXG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IHZvaWQgMDtcbiAgICB2YXIgcHJvcFR5cGVzID0gdm9pZCAwO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGxhenlUeXBlLCB7XG4gICAgICBkZWZhdWx0UHJvcHM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFByb3BzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdEZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgICB3YXJuaW5nJDEoZmFsc2UsICdSZWFjdC5sYXp5KC4uLik6IEl0IGlzIG5vdCBzdXBwb3J0ZWQgdG8gYXNzaWduIGBkZWZhdWx0UHJvcHNgIHRvICcgKyAnYSBsYXp5IGNvbXBvbmVudCBpbXBvcnQuIEVpdGhlciBzcGVjaWZ5IHRoZW0gd2hlcmUgdGhlIGNvbXBvbmVudCAnICsgJ2lzIGRlZmluZWQsIG9yIGNyZWF0ZSBhIHdyYXBwaW5nIGNvbXBvbmVudCBhcm91bmQgaXQuJyk7XG4gICAgICAgICAgZGVmYXVsdFByb3BzID0gbmV3RGVmYXVsdFByb3BzO1xuICAgICAgICAgIC8vIE1hdGNoIHByb2R1Y3Rpb24gYmVoYXZpb3IgbW9yZSBjbG9zZWx5OlxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsYXp5VHlwZSwgJ2RlZmF1bHRQcm9wcycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHByb3BUeXBlczoge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBwcm9wVHlwZXM7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKG5ld1Byb3BUeXBlcykge1xuICAgICAgICAgIHdhcm5pbmckMShmYWxzZSwgJ1JlYWN0LmxhenkoLi4uKTogSXQgaXMgbm90IHN1cHBvcnRlZCB0byBhc3NpZ24gYHByb3BUeXBlc2AgdG8gJyArICdhIGxhenkgY29tcG9uZW50IGltcG9ydC4gRWl0aGVyIHNwZWNpZnkgdGhlbSB3aGVyZSB0aGUgY29tcG9uZW50ICcgKyAnaXMgZGVmaW5lZCwgb3IgY3JlYXRlIGEgd3JhcHBpbmcgY29tcG9uZW50IGFyb3VuZCBpdC4nKTtcbiAgICAgICAgICBwcm9wVHlwZXMgPSBuZXdQcm9wVHlwZXM7XG4gICAgICAgICAgLy8gTWF0Y2ggcHJvZHVjdGlvbiBiZWhhdmlvciBtb3JlIGNsb3NlbHk6XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxhenlUeXBlLCAncHJvcFR5cGVzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbGF6eVR5cGU7XG59XG5cbmZ1bmN0aW9uIGZvcndhcmRSZWYocmVuZGVyKSB7XG4gIHtcbiAgICBpZiAocmVuZGVyICE9IG51bGwgJiYgcmVuZGVyLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpIHtcbiAgICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHJlY2VpdmVkIGEgYG1lbW9gICcgKyAnY29tcG9uZW50LiBJbnN0ZWFkIG9mIGZvcndhcmRSZWYobWVtbyguLi4pKSwgdXNlICcgKyAnbWVtbyhmb3J3YXJkUmVmKC4uLikpLicpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnZm9yd2FyZFJlZiByZXF1aXJlcyBhIHJlbmRlciBmdW5jdGlvbiBidXQgd2FzIGdpdmVuICVzLicsIHJlbmRlciA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiByZW5kZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAhKFxuICAgICAgLy8gRG8gbm90IHdhcm4gZm9yIDAgYXJndW1lbnRzIGJlY2F1c2UgaXQgY291bGQgYmUgZHVlIHRvIHVzYWdlIG9mIHRoZSAnYXJndW1lbnRzJyBvYmplY3RcbiAgICAgIHJlbmRlci5sZW5ndGggPT09IDAgfHwgcmVuZGVyLmxlbmd0aCA9PT0gMikgPyB3YXJuaW5nV2l0aG91dFN0YWNrJDEoZmFsc2UsICdmb3J3YXJkUmVmIHJlbmRlciBmdW5jdGlvbnMgYWNjZXB0IGV4YWN0bHkgdHdvIHBhcmFtZXRlcnM6IHByb3BzIGFuZCByZWYuICVzJywgcmVuZGVyLmxlbmd0aCA9PT0gMSA/ICdEaWQgeW91IGZvcmdldCB0byB1c2UgdGhlIHJlZiBwYXJhbWV0ZXI/JyA6ICdBbnkgYWRkaXRpb25hbCBwYXJhbWV0ZXIgd2lsbCBiZSB1bmRlZmluZWQuJykgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgaWYgKHJlbmRlciAhPSBudWxsKSB7XG4gICAgICAhKHJlbmRlci5kZWZhdWx0UHJvcHMgPT0gbnVsbCAmJiByZW5kZXIucHJvcFR5cGVzID09IG51bGwpID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGRvIG5vdCBzdXBwb3J0IHByb3BUeXBlcyBvciBkZWZhdWx0UHJvcHMuICcgKyAnRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyBhIFJlYWN0IGNvbXBvbmVudD8nKSA6IHZvaWQgMDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgIHJlbmRlcjogcmVuZGVyXG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgfHxcbiAgLy8gTm90ZTogaXRzIHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIGlmIGl0J3MgYSBwb2x5ZmlsbC5cbiAgdHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFKTtcbn1cblxuZnVuY3Rpb24gbWVtbyh0eXBlLCBjb21wYXJlKSB7XG4gIHtcbiAgICBpZiAoIWlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSkge1xuICAgICAgd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnbWVtbzogVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBjb21wb25lbnQuIEluc3RlYWQgJyArICdyZWNlaXZlZDogJXMnLCB0eXBlID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHR5cGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9NRU1PX1RZUEUsXG4gICAgdHlwZTogdHlwZSxcbiAgICBjb21wYXJlOiBjb21wYXJlID09PSB1bmRlZmluZWQgPyBudWxsIDogY29tcGFyZVxuICB9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGlzcGF0Y2hlcigpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQ7XG4gICEoZGlzcGF0Y2hlciAhPT0gbnVsbCkgPyBpbnZhcmlhbnQoZmFsc2UsICdJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuMS4gWW91IG1pZ2h0IGhhdmUgbWlzbWF0Y2hpbmcgdmVyc2lvbnMgb2YgUmVhY3QgYW5kIHRoZSByZW5kZXJlciAoc3VjaCBhcyBSZWFjdCBET00pXFxuMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbjMuIFlvdSBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdCBpbiB0aGUgc2FtZSBhcHBcXG5TZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC1pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uJykgOiB2b2lkIDA7XG4gIHJldHVybiBkaXNwYXRjaGVyO1xufVxuXG5mdW5jdGlvbiB1c2VDb250ZXh0KENvbnRleHQsIHVuc3RhYmxlX29ic2VydmVkQml0cykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHtcbiAgICAhKHVuc3RhYmxlX29ic2VydmVkQml0cyA9PT0gdW5kZWZpbmVkKSA/IHdhcm5pbmckMShmYWxzZSwgJ3VzZUNvbnRleHQoKSBzZWNvbmQgYXJndW1lbnQgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSAnICsgJ3VzZSBpbiBSZWFjdC4gUGFzc2luZyBpdCBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1lvdSBwYXNzZWQ6ICVzLiVzJywgdW5zdGFibGVfb2JzZXJ2ZWRCaXRzLCB0eXBlb2YgdW5zdGFibGVfb2JzZXJ2ZWRCaXRzID09PSAnbnVtYmVyJyAmJiBBcnJheS5pc0FycmF5KGFyZ3VtZW50c1syXSkgPyAnXFxuXFxuRGlkIHlvdSBjYWxsIGFycmF5Lm1hcCh1c2VDb250ZXh0KT8gJyArICdDYWxsaW5nIEhvb2tzIGluc2lkZSBhIGxvb3AgaXMgbm90IHN1cHBvcnRlZC4gJyArICdMZWFybiBtb3JlIGF0IGh0dHBzOi8vZmIubWUvcnVsZXMtb2YtaG9va3MnIDogJycpIDogdm9pZCAwO1xuXG4gICAgLy8gVE9ETzogYWRkIGEgbW9yZSBnZW5lcmljIHdhcm5pbmcgZm9yIGludmFsaWQgdmFsdWVzLlxuICAgIGlmIChDb250ZXh0Ll9jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZWFsQ29udGV4dCA9IENvbnRleHQuX2NvbnRleHQ7XG4gICAgICAvLyBEb24ndCBkZWR1cGxpY2F0ZSBiZWNhdXNlIHRoaXMgbGVnaXRpbWF0ZWx5IGNhdXNlcyBidWdzXG4gICAgICAvLyBhbmQgbm9ib2R5IHNob3VsZCBiZSB1c2luZyB0aGlzIGluIGV4aXN0aW5nIGNvZGUuXG4gICAgICBpZiAocmVhbENvbnRleHQuQ29uc3VtZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgd2FybmluZyQxKGZhbHNlLCAnQ2FsbGluZyB1c2VDb250ZXh0KENvbnRleHQuQ29uc3VtZXIpIGlzIG5vdCBzdXBwb3J0ZWQsIG1heSBjYXVzZSBidWdzLCBhbmQgd2lsbCBiZSAnICsgJ3JlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIGNhbGwgdXNlQ29udGV4dChDb250ZXh0KSBpbnN0ZWFkPycpO1xuICAgICAgfSBlbHNlIGlmIChyZWFsQ29udGV4dC5Qcm92aWRlciA9PT0gQ29udGV4dCkge1xuICAgICAgICB3YXJuaW5nJDEoZmFsc2UsICdDYWxsaW5nIHVzZUNvbnRleHQoQ29udGV4dC5Qcm92aWRlcikgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCB1c2VDb250ZXh0KENvbnRleHQpIGluc3RlYWQ/Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUNvbnRleHQoQ29udGV4dCwgdW5zdGFibGVfb2JzZXJ2ZWRCaXRzKTtcbn1cblxuZnVuY3Rpb24gdXNlU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlU3RhdGUoaW5pdGlhbFN0YXRlKTtcbn1cblxuZnVuY3Rpb24gdXNlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbn1cblxuZnVuY3Rpb24gdXNlUmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVJlZihpbml0aWFsVmFsdWUpO1xufVxuXG5mdW5jdGlvbiB1c2VFZmZlY3QoY3JlYXRlLCBpbnB1dHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VFZmZlY3QoY3JlYXRlLCBpbnB1dHMpO1xufVxuXG5mdW5jdGlvbiB1c2VMYXlvdXRFZmZlY3QoY3JlYXRlLCBpbnB1dHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VMYXlvdXRFZmZlY3QoY3JlYXRlLCBpbnB1dHMpO1xufVxuXG5mdW5jdGlvbiB1c2VDYWxsYmFjayhjYWxsYmFjaywgaW5wdXRzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlQ2FsbGJhY2soY2FsbGJhY2ssIGlucHV0cyk7XG59XG5cbmZ1bmN0aW9uIHVzZU1lbW8oY3JlYXRlLCBpbnB1dHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VNZW1vKGNyZWF0ZSwgaW5wdXRzKTtcbn1cblxuZnVuY3Rpb24gdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgaW5wdXRzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgaW5wdXRzKTtcbn1cblxuZnVuY3Rpb24gdXNlRGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAge1xuICAgIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgICByZXR1cm4gZGlzcGF0Y2hlci51c2VEZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbik7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWFjdEVsZW1lbnRWYWxpZGF0b3IgcHJvdmlkZXMgYSB3cmFwcGVyIGFyb3VuZCBhIGVsZW1lbnQgZmFjdG9yeVxuICogd2hpY2ggdmFsaWRhdGVzIHRoZSBwcm9wcyBwYXNzZWQgdG8gdGhlIGVsZW1lbnQuIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmVcbiAqIHVzZWQgb25seSBpbiBERVYgYW5kIGNvdWxkIGJlIHJlcGxhY2VkIGJ5IGEgc3RhdGljIHR5cGUgY2hlY2tlciBmb3IgbGFuZ3VhZ2VzXG4gKiB0aGF0IHN1cHBvcnQgaXQuXG4gKi9cblxudmFyIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gdm9pZCAwO1xuXG57XG4gIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpIHtcbiAgaWYgKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcbiAgICBpZiAobmFtZSkge1xuICAgICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgIH1cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKGVsZW1lbnRQcm9wcykge1xuICBpZiAoZWxlbWVudFByb3BzICE9PSBudWxsICYmIGVsZW1lbnRQcm9wcyAhPT0gdW5kZWZpbmVkICYmIGVsZW1lbnRQcm9wcy5fX3NvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIHNvdXJjZSA9IGVsZW1lbnRQcm9wcy5fX3NvdXJjZTtcbiAgICB2YXIgZmlsZU5hbWUgPSBzb3VyY2UuZmlsZU5hbWUucmVwbGFjZSgvXi4qW1xcXFxcXC9dLywgJycpO1xuICAgIHZhciBsaW5lTnVtYmVyID0gc291cmNlLmxpbmVOdW1iZXI7XG4gICAgcmV0dXJuICdcXG5cXG5DaGVjayB5b3VyIGNvZGUgYXQgJyArIGZpbGVOYW1lICsgJzonICsgbGluZU51bWJlciArICcuJztcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogV2FybiBpZiB0aGVyZSdzIG5vIGtleSBleHBsaWNpdGx5IHNldCBvbiBkeW5hbWljIGFycmF5cyBvZiBjaGlsZHJlbiBvclxuICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gKiB1cGRhdGVzLlxuICovXG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICB2YXIgaW5mbyA9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuXG4gIGlmICghaW5mbykge1xuICAgIHZhciBwYXJlbnROYW1lID0gdHlwZW9mIHBhcmVudFR5cGUgPT09ICdzdHJpbmcnID8gcGFyZW50VHlwZSA6IHBhcmVudFR5cGUuZGlzcGxheU5hbWUgfHwgcGFyZW50VHlwZS5uYW1lO1xuICAgIGlmIChwYXJlbnROYW1lKSB7XG4gICAgICBpbmZvID0gJ1xcblxcbkNoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPCcgKyBwYXJlbnROYW1lICsgJz4uJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluZm87XG59XG5cbi8qKlxuICogV2FybiBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW4gZXhwbGljaXQga2V5IGFzc2lnbmVkIHRvIGl0LlxuICogVGhpcyBlbGVtZW50IGlzIGluIGFuIGFycmF5LiBUaGUgYXJyYXkgY291bGQgZ3JvdyBhbmQgc2hyaW5rIG9yIGJlXG4gKiByZW9yZGVyZWQuIEFsbCBjaGlsZHJlbiB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcmUgcmVxdWlyZWQgdG9cbiAqIGhhdmUgYSBcImtleVwiIHByb3BlcnR5IGFzc2lnbmVkIHRvIGl0LiBFcnJvciBzdGF0dXNlcyBhcmUgY2FjaGVkIHNvIGEgd2FybmluZ1xuICogd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IHRoYXQgcmVxdWlyZXMgYSBrZXkuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgZWxlbWVudCdzIHBhcmVudCdzIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRXhwbGljaXRLZXkoZWxlbWVudCwgcGFyZW50VHlwZSkge1xuICBpZiAoIWVsZW1lbnQuX3N0b3JlIHx8IGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCB8fCBlbGVtZW50LmtleSAhPSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG5cbiAgdmFyIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8gPSBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpO1xuICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSA9IHRydWU7XG5cbiAgLy8gVXN1YWxseSB0aGUgY3VycmVudCBvd25lciBpcyB0aGUgb2ZmZW5kZXIsIGJ1dCBpZiBpdCBhY2NlcHRzIGNoaWxkcmVuIGFzIGFcbiAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAvLyBhc3NpZ25pbmcgaXQgYSBrZXkuXG4gIHZhciBjaGlsZE93bmVyID0gJyc7XG4gIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX293bmVyICE9PSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgLy8gR2l2ZSB0aGUgY29tcG9uZW50IHRoYXQgb3JpZ2luYWxseSBjcmVhdGVkIHRoaXMgY2hpbGQuXG4gICAgY2hpbGRPd25lciA9ICcgSXQgd2FzIHBhc3NlZCBhIGNoaWxkIGZyb20gJyArIGdldENvbXBvbmVudE5hbWUoZWxlbWVudC5fb3duZXIudHlwZSkgKyAnLic7XG4gIH1cblxuICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcbiAge1xuICAgIHdhcm5pbmckMShmYWxzZSwgJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCIgcHJvcC4nICsgJyVzJXMgU2VlIGh0dHBzOi8vZmIubWUvcmVhY3Qtd2FybmluZy1rZXlzIGZvciBtb3JlIGluZm9ybWF0aW9uLicsIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8sIGNoaWxkT3duZXIpO1xuICB9XG4gIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xufVxuXG4vKipcbiAqIEVuc3VyZSB0aGF0IGV2ZXJ5IGVsZW1lbnQgZWl0aGVyIGlzIHBhc3NlZCBpbiBhIHN0YXRpYyBsb2NhdGlvbiwgaW4gYW5cbiAqIGFycmF5IHdpdGggYW4gZXhwbGljaXQga2V5cyBwcm9wZXJ0eSBkZWZpbmVkLCBvciBpbiBhbiBvYmplY3QgbGl0ZXJhbFxuICogd2l0aCB2YWxpZCBrZXkgcHJvcGVydHkuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZSBTdGF0aWNhbGx5IHBhc3NlZCBjaGlsZCBvZiBhbnkgdHlwZS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBub2RlJ3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDaGlsZEtleXMobm9kZSwgcGFyZW50VHlwZSkge1xuICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KGNoaWxkLCBwYXJlbnRUeXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNWYWxpZEVsZW1lbnQobm9kZSkpIHtcbiAgICAvLyBUaGlzIGVsZW1lbnQgd2FzIHBhc3NlZCBpbiBhIHZhbGlkIGxvY2F0aW9uLlxuICAgIGlmIChub2RlLl9zdG9yZSkge1xuICAgICAgbm9kZS5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAobm9kZSkge1xuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihub2RlKTtcbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEVudHJ5IGl0ZXJhdG9ycyB1c2VkIHRvIHByb3ZpZGUgaW1wbGljaXQga2V5cyxcbiAgICAgIC8vIGJ1dCBub3cgd2UgcHJpbnQgYSBzZXBhcmF0ZSB3YXJuaW5nIGZvciB0aGVtIGxhdGVyLlxuICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IG5vZGUuZW50cmllcykge1xuICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobm9kZSk7XG4gICAgICAgIHZhciBzdGVwID0gdm9pZCAwO1xuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KHN0ZXAudmFsdWUsIHBhcmVudFR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEdpdmVuIGFuIGVsZW1lbnQsIHZhbGlkYXRlIHRoYXQgaXRzIHByb3BzIGZvbGxvdyB0aGUgcHJvcFR5cGVzIGRlZmluaXRpb24sXG4gKiBwcm92aWRlZCBieSB0aGUgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KSB7XG4gIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuICBpZiAodHlwZSA9PT0gbnVsbCB8fCB0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKTtcbiAgdmFyIHByb3BUeXBlcyA9IHZvaWQgMDtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8XG4gIC8vIE5vdGU6IE1lbW8gb25seSBjaGVja3Mgb3V0ZXIgcHJvcHMgaGVyZS5cbiAgLy8gSW5uZXIgcHJvcHMgYXJlIGNoZWNrZWQgaW4gdGhlIHJlY29uY2lsZXIuXG4gIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkpIHtcbiAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHByb3BUeXBlcykge1xuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuICAgIGNoZWNrUHJvcFR5cGVzKHByb3BUeXBlcywgZWxlbWVudC5wcm9wcywgJ3Byb3AnLCBuYW1lLCBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0pO1xuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICB9IGVsc2UgaWYgKHR5cGUuUHJvcFR5cGVzICE9PSB1bmRlZmluZWQgJiYgIXByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duKSB7XG4gICAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSB0cnVlO1xuICAgIHdhcm5pbmdXaXRob3V0U3RhY2skMShmYWxzZSwgJ0NvbXBvbmVudCAlcyBkZWNsYXJlZCBgUHJvcFR5cGVzYCBpbnN0ZWFkIG9mIGBwcm9wVHlwZXNgLiBEaWQgeW91IG1pc3NwZWxsIHRoZSBwcm9wZXJ0eSBhc3NpZ25tZW50PycsIG5hbWUgfHwgJ1Vua25vd24nKTtcbiAgfVxuICBpZiAodHlwZW9mIHR5cGUuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgIXR5cGUuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkID8gd2FybmluZ1dpdGhvdXRTdGFjayQxKGZhbHNlLCAnZ2V0RGVmYXVsdFByb3BzIGlzIG9ubHkgdXNlZCBvbiBjbGFzc2ljIFJlYWN0LmNyZWF0ZUNsYXNzICcgKyAnZGVmaW5pdGlvbnMuIFVzZSBhIHN0YXRpYyBwcm9wZXJ0eSBuYW1lZCBgZGVmYXVsdFByb3BzYCBpbnN0ZWFkLicpIDogdm9pZCAwO1xuICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYSBmcmFnbWVudCwgdmFsaWRhdGUgdGhhdCBpdCBjYW4gb25seSBiZSBwcm92aWRlZCB3aXRoIGZyYWdtZW50IHByb3BzXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZnJhZ21lbnRcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVGcmFnbWVudFByb3BzKGZyYWdtZW50KSB7XG4gIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGZyYWdtZW50KTtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZyYWdtZW50LnByb3BzKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgaWYgKGtleSAhPT0gJ2NoaWxkcmVuJyAmJiBrZXkgIT09ICdrZXknKSB7XG4gICAgICB3YXJuaW5nJDEoZmFsc2UsICdJbnZhbGlkIHByb3AgYCVzYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLiAnICsgJ1JlYWN0LkZyYWdtZW50IGNhbiBvbmx5IGhhdmUgYGtleWAgYW5kIGBjaGlsZHJlbmAgcHJvcHMuJywga2V5KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChmcmFnbWVudC5yZWYgIT09IG51bGwpIHtcbiAgICB3YXJuaW5nJDEoZmFsc2UsICdJbnZhbGlkIGF0dHJpYnV0ZSBgcmVmYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLicpO1xuICB9XG5cbiAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbih0eXBlLCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIHZhbGlkVHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKTtcblxuICAvLyBXZSB3YXJuIGluIHRoaXMgY2FzZSBidXQgZG9uJ3QgdGhyb3cuIFdlIGV4cGVjdCB0aGUgZWxlbWVudCBjcmVhdGlvbiB0b1xuICAvLyBzdWNjZWVkIGFuZCB0aGVyZSB3aWxsIGxpa2VseSBiZSBlcnJvcnMgaW4gcmVuZGVyLlxuICBpZiAoIXZhbGlkVHlwZSkge1xuICAgIHZhciBpbmZvID0gJyc7XG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGluZm8gKz0gJyBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSAnICsgXCJpdCdzIGRlZmluZWQgaW4sIG9yIHlvdSBtaWdodCBoYXZlIG1peGVkIHVwIGRlZmF1bHQgYW5kIG5hbWVkIGltcG9ydHMuXCI7XG4gICAgfVxuXG4gICAgdmFyIHNvdXJjZUluZm8gPSBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShwcm9wcyk7XG4gICAgaWYgKHNvdXJjZUluZm8pIHtcbiAgICAgIGluZm8gKz0gc291cmNlSW5mbztcbiAgICB9IGVsc2Uge1xuICAgICAgaW5mbyArPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcbiAgICB9XG5cbiAgICB2YXIgdHlwZVN0cmluZyA9IHZvaWQgMDtcbiAgICBpZiAodHlwZSA9PT0gbnVsbCkge1xuICAgICAgdHlwZVN0cmluZyA9ICdudWxsJztcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkpIHtcbiAgICAgIHR5cGVTdHJpbmcgPSAnYXJyYXknO1xuICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgdHlwZVN0cmluZyA9ICc8JyArIChnZXRDb21wb25lbnROYW1lKHR5cGUudHlwZSkgfHwgJ1Vua25vd24nKSArICcgLz4nO1xuICAgICAgaW5mbyA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgZXhwb3J0IGEgSlNYIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNvbXBvbmVudD8nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlU3RyaW5nID0gdHlwZW9mIHR5cGU7XG4gICAgfVxuXG4gICAgd2FybmluZyQxKGZhbHNlLCAnUmVhY3QuY3JlYXRlRWxlbWVudDogdHlwZSBpcyBpbnZhbGlkIC0tIGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgJyArICdidWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlICcgKyAnY29tcG9uZW50cykgYnV0IGdvdDogJXMuJXMnLCB0eXBlU3RyaW5nLCBpbmZvKTtcbiAgfVxuXG4gIHZhciBlbGVtZW50ID0gY3JlYXRlRWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIC8vIFRoZSByZXN1bHQgY2FuIGJlIG51bGxpc2ggaWYgYSBtb2NrIG9yIGEgY3VzdG9tIGZ1bmN0aW9uIGlzIHVzZWQuXG4gIC8vIFRPRE86IERyb3AgdGhpcyB3aGVuIHRoZXNlIGFyZSBubyBsb25nZXIgYWxsb3dlZCBhcyB0aGUgdHlwZSBhcmd1bWVudC5cbiAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgLy8gU2tpcCBrZXkgd2FybmluZyBpZiB0aGUgdHlwZSBpc24ndCB2YWxpZCBzaW5jZSBvdXIga2V5IHZhbGlkYXRpb24gbG9naWNcbiAgLy8gZG9lc24ndCBleHBlY3QgYSBub24tc3RyaW5nL2Z1bmN0aW9uIHR5cGUgYW5kIGNhbiB0aHJvdyBjb25mdXNpbmcgZXJyb3JzLlxuICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBiZWhhdmlvciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuXG4gIC8vIChSZW5kZXJpbmcgd2lsbCB0aHJvdyB3aXRoIGEgaGVscGZ1bCBtZXNzYWdlIGFuZCBhcyBzb29uIGFzIHRoZSB0eXBlIGlzXG4gIC8vIGZpeGVkLCB0aGUga2V5IHdhcm5pbmdzIHdpbGwgYXBwZWFyLilcbiAgaWYgKHZhbGlkVHlwZSkge1xuICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIHR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgdmFsaWRhdGVGcmFnbWVudFByb3BzKGVsZW1lbnQpO1xuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbih0eXBlKSB7XG4gIHZhciB2YWxpZGF0ZWRGYWN0b3J5ID0gY3JlYXRlRWxlbWVudFdpdGhWYWxpZGF0aW9uLmJpbmQobnVsbCwgdHlwZSk7XG4gIHZhbGlkYXRlZEZhY3RvcnkudHlwZSA9IHR5cGU7XG4gIC8vIExlZ2FjeSBob29rOiByZW1vdmUgaXRcbiAge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWxpZGF0ZWRGYWN0b3J5LCAndHlwZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxvd1ByaW9yaXR5V2FybmluZyQxKGZhbHNlLCAnRmFjdG9yeS50eXBlIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB0aGUgY2xhc3MgZGlyZWN0bHkgJyArICdiZWZvcmUgcGFzc2luZyBpdCB0byBjcmVhdGVGYWN0b3J5LicpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3R5cGUnLCB7XG4gICAgICAgICAgdmFsdWU6IHR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlZEZhY3Rvcnk7XG59XG5cbmZ1bmN0aW9uIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uKGVsZW1lbnQsIHByb3BzLCBjaGlsZHJlbikge1xuICB2YXIgbmV3RWxlbWVudCA9IGNsb25lRWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGFyZ3VtZW50c1tpXSwgbmV3RWxlbWVudC50eXBlKTtcbiAgfVxuICB2YWxpZGF0ZVByb3BUeXBlcyhuZXdFbGVtZW50KTtcbiAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG5cbi8vIEhlbHBzIGlkZW50aWZ5IHNpZGUgZWZmZWN0cyBpbiBiZWdpbi1waGFzZSBsaWZlY3ljbGUgaG9va3MgYW5kIHNldFN0YXRlIHJlZHVjZXJzOlxuXG5cbi8vIEluIHNvbWUgY2FzZXMsIFN0cmljdE1vZGUgc2hvdWxkIGFsc28gZG91YmxlLXJlbmRlciBsaWZlY3ljbGVzLlxuLy8gVGhpcyBjYW4gYmUgY29uZnVzaW5nIGZvciB0ZXN0cyB0aG91Z2gsXG4vLyBBbmQgaXQgY2FuIGJlIGJhZCBmb3IgcGVyZm9ybWFuY2UgaW4gcHJvZHVjdGlvbi5cbi8vIFRoaXMgZmVhdHVyZSBmbGFnIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGJlaGF2aW9yOlxuXG5cbi8vIFRvIHByZXNlcnZlIHRoZSBcIlBhdXNlIG9uIGNhdWdodCBleGNlcHRpb25zXCIgYmVoYXZpb3Igb2YgdGhlIGRlYnVnZ2VyLCB3ZVxuLy8gcmVwbGF5IHRoZSBiZWdpbiBwaGFzZSBvZiBhIGZhaWxlZCBjb21wb25lbnQgaW5zaWRlIGludm9rZUd1YXJkZWRDYWxsYmFjay5cblxuXG4vLyBXYXJuIGFib3V0IGRlcHJlY2F0ZWQsIGFzeW5jLXVuc2FmZSBsaWZlY3ljbGVzOyByZWxhdGVzIHRvIFJGQyAjNjpcblxuXG4vLyBHYXRoZXIgYWR2YW5jZWQgdGltaW5nIG1ldHJpY3MgZm9yIFByb2ZpbGVyIHN1YnRyZWVzLlxuXG5cbi8vIFRyYWNlIHdoaWNoIGludGVyYWN0aW9ucyB0cmlnZ2VyIGVhY2ggY29tbWl0LlxuXG5cbi8vIE9ubHkgdXNlZCBpbiB3d3cgYnVpbGRzLlxuIC8vIFRPRE86IHRydWU/IEhlcmUgaXQgbWlnaHQganVzdCBiZSBmYWxzZS5cblxuLy8gT25seSB1c2VkIGluIHd3dyBidWlsZHMuXG5cblxuLy8gT25seSB1c2VkIGluIHd3dyBidWlsZHMuXG5cblxuLy8gUmVhY3QgRmlyZTogcHJldmVudCB0aGUgdmFsdWUgYW5kIGNoZWNrZWQgYXR0cmlidXRlcyBmcm9tIHN5bmNpbmdcbi8vIHdpdGggdGhlaXIgcmVsYXRlZCBET00gcHJvcGVydGllc1xuXG5cbi8vIFRoZXNlIEFQSXMgd2lsbCBubyBsb25nZXIgYmUgXCJ1bnN0YWJsZVwiIGluIHRoZSB1cGNvbWluZyAxNi43IHJlbGVhc2UsXG4vLyBDb250cm9sIHRoaXMgYmVoYXZpb3Igd2l0aCBhIGZsYWcgdG8gc3VwcG9ydCAxNi42IG1pbm9yIHJlbGVhc2VzIGluIHRoZSBtZWFud2hpbGUuXG52YXIgZW5hYmxlU3RhYmxlQ29uY3VycmVudE1vZGVBUElzID0gZmFsc2U7XG5cbnZhciBSZWFjdCA9IHtcbiAgQ2hpbGRyZW46IHtcbiAgICBtYXA6IG1hcENoaWxkcmVuLFxuICAgIGZvckVhY2g6IGZvckVhY2hDaGlsZHJlbixcbiAgICBjb3VudDogY291bnRDaGlsZHJlbixcbiAgICB0b0FycmF5OiB0b0FycmF5LFxuICAgIG9ubHk6IG9ubHlDaGlsZFxuICB9LFxuXG4gIGNyZWF0ZVJlZjogY3JlYXRlUmVmLFxuICBDb21wb25lbnQ6IENvbXBvbmVudCxcbiAgUHVyZUNvbXBvbmVudDogUHVyZUNvbXBvbmVudCxcblxuICBjcmVhdGVDb250ZXh0OiBjcmVhdGVDb250ZXh0LFxuICBmb3J3YXJkUmVmOiBmb3J3YXJkUmVmLFxuICBsYXp5OiBsYXp5LFxuICBtZW1vOiBtZW1vLFxuXG4gIHVzZUNhbGxiYWNrOiB1c2VDYWxsYmFjayxcbiAgdXNlQ29udGV4dDogdXNlQ29udGV4dCxcbiAgdXNlRWZmZWN0OiB1c2VFZmZlY3QsXG4gIHVzZUltcGVyYXRpdmVIYW5kbGU6IHVzZUltcGVyYXRpdmVIYW5kbGUsXG4gIHVzZURlYnVnVmFsdWU6IHVzZURlYnVnVmFsdWUsXG4gIHVzZUxheW91dEVmZmVjdDogdXNlTGF5b3V0RWZmZWN0LFxuICB1c2VNZW1vOiB1c2VNZW1vLFxuICB1c2VSZWR1Y2VyOiB1c2VSZWR1Y2VyLFxuICB1c2VSZWY6IHVzZVJlZixcbiAgdXNlU3RhdGU6IHVzZVN0YXRlLFxuXG4gIEZyYWdtZW50OiBSRUFDVF9GUkFHTUVOVF9UWVBFLFxuICBTdHJpY3RNb2RlOiBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFLFxuICBTdXNwZW5zZTogUkVBQ1RfU1VTUEVOU0VfVFlQRSxcblxuICBjcmVhdGVFbGVtZW50OiBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24sXG4gIGNsb25lRWxlbWVudDogY2xvbmVFbGVtZW50V2l0aFZhbGlkYXRpb24sXG4gIGNyZWF0ZUZhY3Rvcnk6IGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbixcbiAgaXNWYWxpZEVsZW1lbnQ6IGlzVmFsaWRFbGVtZW50LFxuXG4gIHZlcnNpb246IFJlYWN0VmVyc2lvbixcblxuICB1bnN0YWJsZV9Db25jdXJyZW50TW9kZTogUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEUsXG4gIHVuc3RhYmxlX1Byb2ZpbGVyOiBSRUFDVF9QUk9GSUxFUl9UWVBFLFxuXG4gIF9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEOiBSZWFjdFNoYXJlZEludGVybmFsc1xufTtcblxuLy8gTm90ZTogc29tZSBBUElzIGFyZSBhZGRlZCB3aXRoIGZlYXR1cmUgZmxhZ3MuXG4vLyBNYWtlIHN1cmUgdGhhdCBzdGFibGUgYnVpbGRzIGZvciBvcGVuIHNvdXJjZVxuLy8gZG9uJ3QgbW9kaWZ5IHRoZSBSZWFjdCBvYmplY3QgdG8gYXZvaWQgZGVvcHRzLlxuLy8gQWxzbyBsZXQncyBub3QgZXhwb3NlIHRoZWlyIG5hbWVzIGluIHN0YWJsZSBidWlsZHMuXG5cbmlmIChlbmFibGVTdGFibGVDb25jdXJyZW50TW9kZUFQSXMpIHtcbiAgUmVhY3QuQ29uY3VycmVudE1vZGUgPSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbiAgUmVhY3QuUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuICBSZWFjdC51bnN0YWJsZV9Db25jdXJyZW50TW9kZSA9IHVuZGVmaW5lZDtcbiAgUmVhY3QudW5zdGFibGVfUHJvZmlsZXIgPSB1bmRlZmluZWQ7XG59XG5cblxuXG52YXIgUmVhY3QkMiA9IE9iamVjdC5mcmVlemUoe1xuXHRkZWZhdWx0OiBSZWFjdFxufSk7XG5cbnZhciBSZWFjdCQzID0gKCBSZWFjdCQyICYmIFJlYWN0ICkgfHwgUmVhY3QkMjtcblxuLy8gVE9ETzogZGVjaWRlIG9uIHRoZSB0b3AtbGV2ZWwgZXhwb3J0IGZvcm0uXG4vLyBUaGlzIGlzIGhhY2t5IGJ1dCBtYWtlcyBpdCB3b3JrIHdpdGggYm90aCBSb2xsdXAgYW5kIEplc3QuXG52YXIgcmVhY3QgPSBSZWFjdCQzLmRlZmF1bHQgfHwgUmVhY3QkMztcblxubW9kdWxlLmV4cG9ydHMgPSByZWFjdDtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYwLjEzLjZcbiAqIHNjaGVkdWxlci10cmFjaW5nLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbi8vIEhlbHBzIGlkZW50aWZ5IHNpZGUgZWZmZWN0cyBpbiBiZWdpbi1waGFzZSBsaWZlY3ljbGUgaG9va3MgYW5kIHNldFN0YXRlIHJlZHVjZXJzOlxuXG5cbi8vIEluIHNvbWUgY2FzZXMsIFN0cmljdE1vZGUgc2hvdWxkIGFsc28gZG91YmxlLXJlbmRlciBsaWZlY3ljbGVzLlxuLy8gVGhpcyBjYW4gYmUgY29uZnVzaW5nIGZvciB0ZXN0cyB0aG91Z2gsXG4vLyBBbmQgaXQgY2FuIGJlIGJhZCBmb3IgcGVyZm9ybWFuY2UgaW4gcHJvZHVjdGlvbi5cbi8vIFRoaXMgZmVhdHVyZSBmbGFnIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGJlaGF2aW9yOlxuXG5cbi8vIFRvIHByZXNlcnZlIHRoZSBcIlBhdXNlIG9uIGNhdWdodCBleGNlcHRpb25zXCIgYmVoYXZpb3Igb2YgdGhlIGRlYnVnZ2VyLCB3ZVxuLy8gcmVwbGF5IHRoZSBiZWdpbiBwaGFzZSBvZiBhIGZhaWxlZCBjb21wb25lbnQgaW5zaWRlIGludm9rZUd1YXJkZWRDYWxsYmFjay5cblxuXG4vLyBXYXJuIGFib3V0IGRlcHJlY2F0ZWQsIGFzeW5jLXVuc2FmZSBsaWZlY3ljbGVzOyByZWxhdGVzIHRvIFJGQyAjNjpcblxuXG4vLyBHYXRoZXIgYWR2YW5jZWQgdGltaW5nIG1ldHJpY3MgZm9yIFByb2ZpbGVyIHN1YnRyZWVzLlxuXG5cbi8vIFRyYWNlIHdoaWNoIGludGVyYWN0aW9ucyB0cmlnZ2VyIGVhY2ggY29tbWl0LlxudmFyIGVuYWJsZVNjaGVkdWxlclRyYWNpbmcgPSB0cnVlO1xuXG4vLyBPbmx5IHVzZWQgaW4gd3d3IGJ1aWxkcy5cbiAvLyBUT0RPOiB0cnVlPyBIZXJlIGl0IG1pZ2h0IGp1c3QgYmUgZmFsc2UuXG5cbi8vIE9ubHkgdXNlZCBpbiB3d3cgYnVpbGRzLlxuXG5cbi8vIE9ubHkgdXNlZCBpbiB3d3cgYnVpbGRzLlxuXG5cbi8vIFJlYWN0IEZpcmU6IHByZXZlbnQgdGhlIHZhbHVlIGFuZCBjaGVja2VkIGF0dHJpYnV0ZXMgZnJvbSBzeW5jaW5nXG4vLyB3aXRoIHRoZWlyIHJlbGF0ZWQgRE9NIHByb3BlcnRpZXNcblxuXG4vLyBUaGVzZSBBUElzIHdpbGwgbm8gbG9uZ2VyIGJlIFwidW5zdGFibGVcIiBpbiB0aGUgdXBjb21pbmcgMTYuNyByZWxlYXNlLFxuLy8gQ29udHJvbCB0aGlzIGJlaGF2aW9yIHdpdGggYSBmbGFnIHRvIHN1cHBvcnQgMTYuNiBtaW5vciByZWxlYXNlcyBpbiB0aGUgbWVhbndoaWxlLlxuXG52YXIgREVGQVVMVF9USFJFQURfSUQgPSAwO1xuXG4vLyBDb3VudGVycyB1c2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMuXG52YXIgaW50ZXJhY3Rpb25JRENvdW50ZXIgPSAwO1xudmFyIHRocmVhZElEQ291bnRlciA9IDA7XG5cbi8vIFNldCBvZiBjdXJyZW50bHkgdHJhY2VkIGludGVyYWN0aW9ucy5cbi8vIEludGVyYWN0aW9ucyBcInN0YWNrXCLigJNcbi8vIE1lYW5pbmcgdGhhdCBuZXdseSB0cmFjZWQgaW50ZXJhY3Rpb25zIGFyZSBhcHBlbmRlZCB0byB0aGUgcHJldmlvdXNseSBhY3RpdmUgc2V0LlxuLy8gV2hlbiBhbiBpbnRlcmFjdGlvbiBnb2VzIG91dCBvZiBzY29wZSwgdGhlIHByZXZpb3VzIHNldCAoaWYgYW55KSBpcyByZXN0b3JlZC5cbmV4cG9ydHMuX19pbnRlcmFjdGlvbnNSZWYgPSBudWxsO1xuXG4vLyBMaXN0ZW5lcihzKSB0byBub3RpZnkgd2hlbiBpbnRlcmFjdGlvbnMgYmVnaW4gYW5kIGVuZC5cbmV4cG9ydHMuX19zdWJzY3JpYmVyUmVmID0gbnVsbDtcblxuaWYgKGVuYWJsZVNjaGVkdWxlclRyYWNpbmcpIHtcbiAgZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZiA9IHtcbiAgICBjdXJyZW50OiBuZXcgU2V0KClcbiAgfTtcbiAgZXhwb3J0cy5fX3N1YnNjcmliZXJSZWYgPSB7XG4gICAgY3VycmVudDogbnVsbFxuICB9O1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9jbGVhcihjYWxsYmFjaykge1xuICBpZiAoIWVuYWJsZVNjaGVkdWxlclRyYWNpbmcpIHtcbiAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgfVxuXG4gIHZhciBwcmV2SW50ZXJhY3Rpb25zID0gZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50O1xuICBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSBuZXcgU2V0KCk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSBwcmV2SW50ZXJhY3Rpb25zO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2dldEN1cnJlbnQoKSB7XG4gIGlmICghZW5hYmxlU2NoZWR1bGVyVHJhY2luZykge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfZ2V0VGhyZWFkSUQoKSB7XG4gIHJldHVybiArK3RocmVhZElEQ291bnRlcjtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfdHJhY2UobmFtZSwgdGltZXN0YW1wLCBjYWxsYmFjaykge1xuICB2YXIgdGhyZWFkSUQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IERFRkFVTFRfVEhSRUFEX0lEO1xuXG4gIGlmICghZW5hYmxlU2NoZWR1bGVyVHJhY2luZykge1xuICAgIHJldHVybiBjYWxsYmFjaygpO1xuICB9XG5cbiAgdmFyIGludGVyYWN0aW9uID0ge1xuICAgIF9fY291bnQ6IDEsXG4gICAgaWQ6IGludGVyYWN0aW9uSURDb3VudGVyKyssXG4gICAgbmFtZTogbmFtZSxcbiAgICB0aW1lc3RhbXA6IHRpbWVzdGFtcFxuICB9O1xuXG4gIHZhciBwcmV2SW50ZXJhY3Rpb25zID0gZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50O1xuXG4gIC8vIFRyYWNlZCBpbnRlcmFjdGlvbnMgc2hvdWxkIHN0YWNrL2FjY3VtdWxhdGUuXG4gIC8vIFRvIGRvIHRoYXQsIGNsb25lIHRoZSBjdXJyZW50IGludGVyYWN0aW9ucy5cbiAgLy8gVGhlIHByZXZpb3VzIHNldCB3aWxsIGJlIHJlc3RvcmVkIHVwb24gY29tcGxldGlvbi5cbiAgdmFyIGludGVyYWN0aW9ucyA9IG5ldyBTZXQocHJldkludGVyYWN0aW9ucyk7XG4gIGludGVyYWN0aW9ucy5hZGQoaW50ZXJhY3Rpb24pO1xuICBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSBpbnRlcmFjdGlvbnM7XG5cbiAgdmFyIHN1YnNjcmliZXIgPSBleHBvcnRzLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50O1xuICB2YXIgcmV0dXJuVmFsdWUgPSB2b2lkIDA7XG5cbiAgdHJ5IHtcbiAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgc3Vic2NyaWJlci5vbkludGVyYWN0aW9uVHJhY2VkKGludGVyYWN0aW9uKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChzdWJzY3JpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIHN1YnNjcmliZXIub25Xb3JrU3RhcnRlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuVmFsdWUgPSBjYWxsYmFjaygpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50ID0gcHJldkludGVyYWN0aW9ucztcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChzdWJzY3JpYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm9uV29ya1N0b3BwZWQoaW50ZXJhY3Rpb25zLCB0aHJlYWRJRCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGludGVyYWN0aW9uLl9fY291bnQtLTtcblxuICAgICAgICAgIC8vIElmIG5vIGFzeW5jIHdvcmsgd2FzIHNjaGVkdWxlZCBmb3IgdGhpcyBpbnRlcmFjdGlvbixcbiAgICAgICAgICAvLyBOb3RpZnkgc3Vic2NyaWJlcnMgdGhhdCBpdCdzIGNvbXBsZXRlZC5cbiAgICAgICAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCAmJiBpbnRlcmFjdGlvbi5fX2NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm9uSW50ZXJhY3Rpb25TY2hlZHVsZWRXb3JrQ29tcGxldGVkKGludGVyYWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0dXJuVmFsdWU7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3dyYXAoY2FsbGJhY2spIHtcbiAgdmFyIHRocmVhZElEID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBERUZBVUxUX1RIUkVBRF9JRDtcblxuICBpZiAoIWVuYWJsZVNjaGVkdWxlclRyYWNpbmcpIHtcbiAgICByZXR1cm4gY2FsbGJhY2s7XG4gIH1cblxuICB2YXIgd3JhcHBlZEludGVyYWN0aW9ucyA9IGV4cG9ydHMuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudDtcblxuICB2YXIgc3Vic2NyaWJlciA9IGV4cG9ydHMuX19zdWJzY3JpYmVyUmVmLmN1cnJlbnQ7XG4gIGlmIChzdWJzY3JpYmVyICE9PSBudWxsKSB7XG4gICAgc3Vic2NyaWJlci5vbldvcmtTY2hlZHVsZWQod3JhcHBlZEludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICB9XG5cbiAgLy8gVXBkYXRlIHRoZSBwZW5kaW5nIGFzeW5jIHdvcmsgY291bnQgZm9yIHRoZSBjdXJyZW50IGludGVyYWN0aW9ucy5cbiAgLy8gVXBkYXRlIGFmdGVyIGNhbGxpbmcgc3Vic2NyaWJlcnMgaW4gY2FzZSBvZiBlcnJvci5cbiAgd3JhcHBlZEludGVyYWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpbnRlcmFjdGlvbikge1xuICAgIGludGVyYWN0aW9uLl9fY291bnQrKztcbiAgfSk7XG5cbiAgdmFyIGhhc1J1biA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIHdyYXBwZWQoKSB7XG4gICAgdmFyIHByZXZJbnRlcmFjdGlvbnMgPSBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQ7XG4gICAgZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50ID0gd3JhcHBlZEludGVyYWN0aW9ucztcblxuICAgIHN1YnNjcmliZXIgPSBleHBvcnRzLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50O1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXR1cm5WYWx1ZSA9IHZvaWQgMDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLm9uV29ya1N0YXJ0ZWQod3JhcHBlZEludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVyblZhbHVlID0gY2FsbGJhY2suYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGV4cG9ydHMuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudCA9IHByZXZJbnRlcmFjdGlvbnM7XG5cbiAgICAgICAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5vbldvcmtTdG9wcGVkKHdyYXBwZWRJbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoIWhhc1J1bikge1xuICAgICAgICAvLyBXZSBvbmx5IGV4cGVjdCBhIHdyYXBwZWQgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgb25jZSxcbiAgICAgICAgLy8gQnV0IGluIHRoZSBldmVudCB0aGF0IGl0J3MgZXhlY3V0ZWQgbW9yZSB0aGFuIG9uY2XigJNcbiAgICAgICAgLy8gT25seSBkZWNyZW1lbnQgdGhlIG91dHN0YW5kaW5nIGludGVyYWN0aW9uIGNvdW50cyBvbmNlLlxuICAgICAgICBoYXNSdW4gPSB0cnVlO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBwZW5kaW5nIGFzeW5jIGNvdW50cyBmb3IgYWxsIHdyYXBwZWQgaW50ZXJhY3Rpb25zLlxuICAgICAgICAvLyBJZiB0aGlzIHdhcyB0aGUgbGFzdCBzY2hlZHVsZWQgYXN5bmMgd29yayBmb3IgYW55IG9mIHRoZW0sXG4gICAgICAgIC8vIE1hcmsgdGhlbSBhcyBjb21wbGV0ZWQuXG4gICAgICAgIHdyYXBwZWRJbnRlcmFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgICBpbnRlcmFjdGlvbi5fX2NvdW50LS07XG5cbiAgICAgICAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCAmJiBpbnRlcmFjdGlvbi5fX2NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm9uSW50ZXJhY3Rpb25TY2hlZHVsZWRXb3JrQ29tcGxldGVkKGludGVyYWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHdyYXBwZWQuY2FuY2VsID0gZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIHN1YnNjcmliZXIgPSBleHBvcnRzLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50O1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChzdWJzY3JpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIHN1YnNjcmliZXIub25Xb3JrQ2FuY2VsZWQod3JhcHBlZEludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBVcGRhdGUgcGVuZGluZyBhc3luYyBjb3VudHMgZm9yIGFsbCB3cmFwcGVkIGludGVyYWN0aW9ucy5cbiAgICAgIC8vIElmIHRoaXMgd2FzIHRoZSBsYXN0IHNjaGVkdWxlZCBhc3luYyB3b3JrIGZvciBhbnkgb2YgdGhlbSxcbiAgICAgIC8vIE1hcmsgdGhlbSBhcyBjb21wbGV0ZWQuXG4gICAgICB3cmFwcGVkSW50ZXJhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGludGVyYWN0aW9uKSB7XG4gICAgICAgIGludGVyYWN0aW9uLl9fY291bnQtLTtcblxuICAgICAgICBpZiAoc3Vic2NyaWJlciAmJiBpbnRlcmFjdGlvbi5fX2NvdW50ID09PSAwKSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5vbkludGVyYWN0aW9uU2NoZWR1bGVkV29ya0NvbXBsZXRlZChpbnRlcmFjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gd3JhcHBlZDtcbn1cblxudmFyIHN1YnNjcmliZXJzID0gbnVsbDtcbmlmIChlbmFibGVTY2hlZHVsZXJUcmFjaW5nKSB7XG4gIHN1YnNjcmliZXJzID0gbmV3IFNldCgpO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9zdWJzY3JpYmUoc3Vic2NyaWJlcikge1xuICBpZiAoZW5hYmxlU2NoZWR1bGVyVHJhY2luZykge1xuICAgIHN1YnNjcmliZXJzLmFkZChzdWJzY3JpYmVyKTtcblxuICAgIGlmIChzdWJzY3JpYmVycy5zaXplID09PSAxKSB7XG4gICAgICBleHBvcnRzLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50ID0ge1xuICAgICAgICBvbkludGVyYWN0aW9uU2NoZWR1bGVkV29ya0NvbXBsZXRlZDogb25JbnRlcmFjdGlvblNjaGVkdWxlZFdvcmtDb21wbGV0ZWQsXG4gICAgICAgIG9uSW50ZXJhY3Rpb25UcmFjZWQ6IG9uSW50ZXJhY3Rpb25UcmFjZWQsXG4gICAgICAgIG9uV29ya0NhbmNlbGVkOiBvbldvcmtDYW5jZWxlZCxcbiAgICAgICAgb25Xb3JrU2NoZWR1bGVkOiBvbldvcmtTY2hlZHVsZWQsXG4gICAgICAgIG9uV29ya1N0YXJ0ZWQ6IG9uV29ya1N0YXJ0ZWQsXG4gICAgICAgIG9uV29ya1N0b3BwZWQ6IG9uV29ya1N0b3BwZWRcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3Vuc3Vic2NyaWJlKHN1YnNjcmliZXIpIHtcbiAgaWYgKGVuYWJsZVNjaGVkdWxlclRyYWNpbmcpIHtcbiAgICBzdWJzY3JpYmVycy5kZWxldGUoc3Vic2NyaWJlcik7XG5cbiAgICBpZiAoc3Vic2NyaWJlcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgZXhwb3J0cy5fX3N1YnNjcmliZXJSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uSW50ZXJhY3Rpb25UcmFjZWQoaW50ZXJhY3Rpb24pIHtcbiAgdmFyIGRpZENhdGNoRXJyb3IgPSBmYWxzZTtcbiAgdmFyIGNhdWdodEVycm9yID0gbnVsbDtcblxuICBzdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN1YnNjcmliZXIub25JbnRlcmFjdGlvblRyYWNlZChpbnRlcmFjdGlvbik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghZGlkQ2F0Y2hFcnJvcikge1xuICAgICAgICBkaWRDYXRjaEVycm9yID0gdHJ1ZTtcbiAgICAgICAgY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGlmIChkaWRDYXRjaEVycm9yKSB7XG4gICAgdGhyb3cgY2F1Z2h0RXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gb25JbnRlcmFjdGlvblNjaGVkdWxlZFdvcmtDb21wbGV0ZWQoaW50ZXJhY3Rpb24pIHtcbiAgdmFyIGRpZENhdGNoRXJyb3IgPSBmYWxzZTtcbiAgdmFyIGNhdWdodEVycm9yID0gbnVsbDtcblxuICBzdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN1YnNjcmliZXIub25JbnRlcmFjdGlvblNjaGVkdWxlZFdvcmtDb21wbGV0ZWQoaW50ZXJhY3Rpb24pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWRpZENhdGNoRXJyb3IpIHtcbiAgICAgICAgZGlkQ2F0Y2hFcnJvciA9IHRydWU7XG4gICAgICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBpZiAoZGlkQ2F0Y2hFcnJvcikge1xuICAgIHRocm93IGNhdWdodEVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9uV29ya1NjaGVkdWxlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKSB7XG4gIHZhciBkaWRDYXRjaEVycm9yID0gZmFsc2U7XG4gIHZhciBjYXVnaHRFcnJvciA9IG51bGw7XG5cbiAgc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgIHRyeSB7XG4gICAgICBzdWJzY3JpYmVyLm9uV29ya1NjaGVkdWxlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFkaWRDYXRjaEVycm9yKSB7XG4gICAgICAgIGRpZENhdGNoRXJyb3IgPSB0cnVlO1xuICAgICAgICBjYXVnaHRFcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGRpZENhdGNoRXJyb3IpIHtcbiAgICB0aHJvdyBjYXVnaHRFcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbldvcmtTdGFydGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpIHtcbiAgdmFyIGRpZENhdGNoRXJyb3IgPSBmYWxzZTtcbiAgdmFyIGNhdWdodEVycm9yID0gbnVsbDtcblxuICBzdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN1YnNjcmliZXIub25Xb3JrU3RhcnRlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFkaWRDYXRjaEVycm9yKSB7XG4gICAgICAgIGRpZENhdGNoRXJyb3IgPSB0cnVlO1xuICAgICAgICBjYXVnaHRFcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGRpZENhdGNoRXJyb3IpIHtcbiAgICB0aHJvdyBjYXVnaHRFcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbldvcmtTdG9wcGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpIHtcbiAgdmFyIGRpZENhdGNoRXJyb3IgPSBmYWxzZTtcbiAgdmFyIGNhdWdodEVycm9yID0gbnVsbDtcblxuICBzdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN1YnNjcmliZXIub25Xb3JrU3RvcHBlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFkaWRDYXRjaEVycm9yKSB7XG4gICAgICAgIGRpZENhdGNoRXJyb3IgPSB0cnVlO1xuICAgICAgICBjYXVnaHRFcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGRpZENhdGNoRXJyb3IpIHtcbiAgICB0aHJvdyBjYXVnaHRFcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbldvcmtDYW5jZWxlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKSB7XG4gIHZhciBkaWRDYXRjaEVycm9yID0gZmFsc2U7XG4gIHZhciBjYXVnaHRFcnJvciA9IG51bGw7XG5cbiAgc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgIHRyeSB7XG4gICAgICBzdWJzY3JpYmVyLm9uV29ya0NhbmNlbGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWRpZENhdGNoRXJyb3IpIHtcbiAgICAgICAgZGlkQ2F0Y2hFcnJvciA9IHRydWU7XG4gICAgICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBpZiAoZGlkQ2F0Y2hFcnJvcikge1xuICAgIHRocm93IGNhdWdodEVycm9yO1xuICB9XG59XG5cbmV4cG9ydHMudW5zdGFibGVfY2xlYXIgPSB1bnN0YWJsZV9jbGVhcjtcbmV4cG9ydHMudW5zdGFibGVfZ2V0Q3VycmVudCA9IHVuc3RhYmxlX2dldEN1cnJlbnQ7XG5leHBvcnRzLnVuc3RhYmxlX2dldFRocmVhZElEID0gdW5zdGFibGVfZ2V0VGhyZWFkSUQ7XG5leHBvcnRzLnVuc3RhYmxlX3RyYWNlID0gdW5zdGFibGVfdHJhY2U7XG5leHBvcnRzLnVuc3RhYmxlX3dyYXAgPSB1bnN0YWJsZV93cmFwO1xuZXhwb3J0cy51bnN0YWJsZV9zdWJzY3JpYmUgPSB1bnN0YWJsZV9zdWJzY3JpYmU7XG5leHBvcnRzLnVuc3RhYmxlX3Vuc3Vic2NyaWJlID0gdW5zdGFibGVfdW5zdWJzY3JpYmU7XG4gIH0pKCk7XG59XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjAuMTMuNlxuICogc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbnZhciBlbmFibGVTY2hlZHVsZXJEZWJ1Z2dpbmcgPSBmYWxzZTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG5cbi8vIFRPRE86IFVzZSBzeW1ib2xzP1xudmFyIEltbWVkaWF0ZVByaW9yaXR5ID0gMTtcbnZhciBVc2VyQmxvY2tpbmdQcmlvcml0eSA9IDI7XG52YXIgTm9ybWFsUHJpb3JpdHkgPSAzO1xudmFyIExvd1ByaW9yaXR5ID0gNDtcbnZhciBJZGxlUHJpb3JpdHkgPSA1O1xuXG4vLyBNYXggMzEgYml0IGludGVnZXIuIFRoZSBtYXggaW50ZWdlciBzaXplIGluIFY4IGZvciAzMi1iaXQgc3lzdGVtcy5cbi8vIE1hdGgucG93KDIsIDMwKSAtIDFcbi8vIDBiMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExXG52YXIgbWF4U2lnbmVkMzFCaXRJbnQgPSAxMDczNzQxODIzO1xuXG4vLyBUaW1lcyBvdXQgaW1tZWRpYXRlbHlcbnZhciBJTU1FRElBVEVfUFJJT1JJVFlfVElNRU9VVCA9IC0xO1xuLy8gRXZlbnR1YWxseSB0aW1lcyBvdXRcbnZhciBVU0VSX0JMT0NLSU5HX1BSSU9SSVRZID0gMjUwO1xudmFyIE5PUk1BTF9QUklPUklUWV9USU1FT1VUID0gNTAwMDtcbnZhciBMT1dfUFJJT1JJVFlfVElNRU9VVCA9IDEwMDAwO1xuLy8gTmV2ZXIgdGltZXMgb3V0XG52YXIgSURMRV9QUklPUklUWSA9IG1heFNpZ25lZDMxQml0SW50O1xuXG4vLyBDYWxsYmFja3MgYXJlIHN0b3JlZCBhcyBhIGNpcmN1bGFyLCBkb3VibHkgbGlua2VkIGxpc3QuXG52YXIgZmlyc3RDYWxsYmFja05vZGUgPSBudWxsO1xuXG52YXIgY3VycmVudERpZFRpbWVvdXQgPSBmYWxzZTtcbi8vIFBhdXNpbmcgdGhlIHNjaGVkdWxlciBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbnZhciBpc1NjaGVkdWxlclBhdXNlZCA9IGZhbHNlO1xuXG52YXIgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbnZhciBjdXJyZW50RXZlbnRTdGFydFRpbWUgPSAtMTtcbnZhciBjdXJyZW50RXhwaXJhdGlvblRpbWUgPSAtMTtcblxuLy8gVGhpcyBpcyBzZXQgd2hlbiBhIGNhbGxiYWNrIGlzIGJlaW5nIGV4ZWN1dGVkLCB0byBwcmV2ZW50IHJlLWVudHJhbmN5LlxudmFyIGlzRXhlY3V0aW5nQ2FsbGJhY2sgPSBmYWxzZTtcblxudmFyIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gZmFsc2U7XG5cbnZhciBoYXNOYXRpdmVQZXJmb3JtYW5jZU5vdyA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLm5vdyA9PT0gJ2Z1bmN0aW9uJztcblxuZnVuY3Rpb24gZW5zdXJlSG9zdENhbGxiYWNrSXNTY2hlZHVsZWQoKSB7XG4gIGlmIChpc0V4ZWN1dGluZ0NhbGxiYWNrKSB7XG4gICAgLy8gRG9uJ3Qgc2NoZWR1bGUgd29yayB5ZXQ7IHdhaXQgdW50aWwgdGhlIG5leHQgdGltZSB3ZSB5aWVsZC5cbiAgICByZXR1cm47XG4gIH1cbiAgLy8gU2NoZWR1bGUgdGhlIGhvc3QgY2FsbGJhY2sgdXNpbmcgdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gaW4gdGhlIGxpc3QuXG4gIHZhciBleHBpcmF0aW9uVGltZSA9IGZpcnN0Q2FsbGJhY2tOb2RlLmV4cGlyYXRpb25UaW1lO1xuICBpZiAoIWlzSG9zdENhbGxiYWNrU2NoZWR1bGVkKSB7XG4gICAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIC8vIENhbmNlbCB0aGUgZXhpc3RpbmcgaG9zdCBjYWxsYmFjay5cbiAgICBjYW5jZWxIb3N0Q2FsbGJhY2soKTtcbiAgfVxuICByZXF1ZXN0SG9zdENhbGxiYWNrKGZsdXNoV29yaywgZXhwaXJhdGlvblRpbWUpO1xufVxuXG5mdW5jdGlvbiBmbHVzaEZpcnN0Q2FsbGJhY2soKSB7XG4gIHZhciBmbHVzaGVkTm9kZSA9IGZpcnN0Q2FsbGJhY2tOb2RlO1xuXG4gIC8vIFJlbW92ZSB0aGUgbm9kZSBmcm9tIHRoZSBsaXN0IGJlZm9yZSBjYWxsaW5nIHRoZSBjYWxsYmFjay4gVGhhdCB3YXkgdGhlXG4gIC8vIGxpc3QgaXMgaW4gYSBjb25zaXN0ZW50IHN0YXRlIGV2ZW4gaWYgdGhlIGNhbGxiYWNrIHRocm93cy5cbiAgdmFyIG5leHQgPSBmaXJzdENhbGxiYWNrTm9kZS5uZXh0O1xuICBpZiAoZmlyc3RDYWxsYmFja05vZGUgPT09IG5leHQpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBsYXN0IGNhbGxiYWNrIGluIHRoZSBsaXN0LlxuICAgIGZpcnN0Q2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgICBuZXh0ID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGFzdENhbGxiYWNrTm9kZSA9IGZpcnN0Q2FsbGJhY2tOb2RlLnByZXZpb3VzO1xuICAgIGZpcnN0Q2FsbGJhY2tOb2RlID0gbGFzdENhbGxiYWNrTm9kZS5uZXh0ID0gbmV4dDtcbiAgICBuZXh0LnByZXZpb3VzID0gbGFzdENhbGxiYWNrTm9kZTtcbiAgfVxuXG4gIGZsdXNoZWROb2RlLm5leHQgPSBmbHVzaGVkTm9kZS5wcmV2aW91cyA9IG51bGw7XG5cbiAgLy8gTm93IGl0J3Mgc2FmZSB0byBjYWxsIHRoZSBjYWxsYmFjay5cbiAgdmFyIGNhbGxiYWNrID0gZmx1c2hlZE5vZGUuY2FsbGJhY2s7XG4gIHZhciBleHBpcmF0aW9uVGltZSA9IGZsdXNoZWROb2RlLmV4cGlyYXRpb25UaW1lO1xuICB2YXIgcHJpb3JpdHlMZXZlbCA9IGZsdXNoZWROb2RlLnByaW9yaXR5TGV2ZWw7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgdmFyIHByZXZpb3VzRXhwaXJhdGlvblRpbWUgPSBjdXJyZW50RXhwaXJhdGlvblRpbWU7XG4gIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcbiAgY3VycmVudEV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7XG4gIHZhciBjb250aW51YXRpb25DYWxsYmFjaztcbiAgdHJ5IHtcbiAgICBjb250aW51YXRpb25DYWxsYmFjayA9IGNhbGxiYWNrKCk7XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gICAgY3VycmVudEV4cGlyYXRpb25UaW1lID0gcHJldmlvdXNFeHBpcmF0aW9uVGltZTtcbiAgfVxuXG4gIC8vIEEgY2FsbGJhY2sgbWF5IHJldHVybiBhIGNvbnRpbnVhdGlvbi4gVGhlIGNvbnRpbnVhdGlvbiBzaG91bGQgYmUgc2NoZWR1bGVkXG4gIC8vIHdpdGggdGhlIHNhbWUgcHJpb3JpdHkgYW5kIGV4cGlyYXRpb24gYXMgdGhlIGp1c3QtZmluaXNoZWQgY2FsbGJhY2suXG4gIGlmICh0eXBlb2YgY29udGludWF0aW9uQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgY29udGludWF0aW9uTm9kZSA9IHtcbiAgICAgIGNhbGxiYWNrOiBjb250aW51YXRpb25DYWxsYmFjayxcbiAgICAgIHByaW9yaXR5TGV2ZWw6IHByaW9yaXR5TGV2ZWwsXG4gICAgICBleHBpcmF0aW9uVGltZTogZXhwaXJhdGlvblRpbWUsXG4gICAgICBuZXh0OiBudWxsLFxuICAgICAgcHJldmlvdXM6IG51bGxcbiAgICB9O1xuXG4gICAgLy8gSW5zZXJ0IHRoZSBuZXcgY2FsbGJhY2sgaW50byB0aGUgbGlzdCwgc29ydGVkIGJ5IGl0cyBleHBpcmF0aW9uLiBUaGlzIGlzXG4gICAgLy8gYWxtb3N0IHRoZSBzYW1lIGFzIHRoZSBjb2RlIGluIGBzY2hlZHVsZUNhbGxiYWNrYCwgZXhjZXB0IHRoZSBjYWxsYmFja1xuICAgIC8vIGlzIGluc2VydGVkIGludG8gdGhlIGxpc3QgKmJlZm9yZSogY2FsbGJhY2tzIG9mIGVxdWFsIGV4cGlyYXRpb24gaW5zdGVhZFxuICAgIC8vIG9mIGFmdGVyLlxuICAgIGlmIChmaXJzdENhbGxiYWNrTm9kZSA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgY2FsbGJhY2sgaW4gdGhlIGxpc3QuXG4gICAgICBmaXJzdENhbGxiYWNrTm9kZSA9IGNvbnRpbnVhdGlvbk5vZGUubmV4dCA9IGNvbnRpbnVhdGlvbk5vZGUucHJldmlvdXMgPSBjb250aW51YXRpb25Ob2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbmV4dEFmdGVyQ29udGludWF0aW9uID0gbnVsbDtcbiAgICAgIHZhciBub2RlID0gZmlyc3RDYWxsYmFja05vZGU7XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChub2RlLmV4cGlyYXRpb25UaW1lID49IGV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgICAgLy8gVGhpcyBjYWxsYmFjayBleHBpcmVzIGF0IG9yIGFmdGVyIHRoZSBjb250aW51YXRpb24uIFdlIHdpbGwgaW5zZXJ0XG4gICAgICAgICAgLy8gdGhlIGNvbnRpbnVhdGlvbiAqYmVmb3JlKiB0aGlzIGNhbGxiYWNrLlxuICAgICAgICAgIG5leHRBZnRlckNvbnRpbnVhdGlvbiA9IG5vZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgIH0gd2hpbGUgKG5vZGUgIT09IGZpcnN0Q2FsbGJhY2tOb2RlKTtcblxuICAgICAgaWYgKG5leHRBZnRlckNvbnRpbnVhdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICAvLyBObyBlcXVhbCBvciBsb3dlciBwcmlvcml0eSBjYWxsYmFjayB3YXMgZm91bmQsIHdoaWNoIG1lYW5zIHRoZSBuZXdcbiAgICAgICAgLy8gY2FsbGJhY2sgaXMgdGhlIGxvd2VzdCBwcmlvcml0eSBjYWxsYmFjayBpbiB0aGUgbGlzdC5cbiAgICAgICAgbmV4dEFmdGVyQ29udGludWF0aW9uID0gZmlyc3RDYWxsYmFja05vZGU7XG4gICAgICB9IGVsc2UgaWYgKG5leHRBZnRlckNvbnRpbnVhdGlvbiA9PT0gZmlyc3RDYWxsYmFja05vZGUpIHtcbiAgICAgICAgLy8gVGhlIG5ldyBjYWxsYmFjayBpcyB0aGUgaGlnaGVzdCBwcmlvcml0eSBjYWxsYmFjayBpbiB0aGUgbGlzdC5cbiAgICAgICAgZmlyc3RDYWxsYmFja05vZGUgPSBjb250aW51YXRpb25Ob2RlO1xuICAgICAgICBlbnN1cmVIb3N0Q2FsbGJhY2tJc1NjaGVkdWxlZCgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJldmlvdXMgPSBuZXh0QWZ0ZXJDb250aW51YXRpb24ucHJldmlvdXM7XG4gICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dEFmdGVyQ29udGludWF0aW9uLnByZXZpb3VzID0gY29udGludWF0aW9uTm9kZTtcbiAgICAgIGNvbnRpbnVhdGlvbk5vZGUubmV4dCA9IG5leHRBZnRlckNvbnRpbnVhdGlvbjtcbiAgICAgIGNvbnRpbnVhdGlvbk5vZGUucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmx1c2hJbW1lZGlhdGVXb3JrKCkge1xuICBpZiAoXG4gIC8vIENvbmZpcm0gd2UndmUgZXhpdGVkIHRoZSBvdXRlciBtb3N0IGV2ZW50IGhhbmRsZXJcbiAgY3VycmVudEV2ZW50U3RhcnRUaW1lID09PSAtMSAmJiBmaXJzdENhbGxiYWNrTm9kZSAhPT0gbnVsbCAmJiBmaXJzdENhbGxiYWNrTm9kZS5wcmlvcml0eUxldmVsID09PSBJbW1lZGlhdGVQcmlvcml0eSkge1xuICAgIGlzRXhlY3V0aW5nQ2FsbGJhY2sgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBkbyB7XG4gICAgICAgIGZsdXNoRmlyc3RDYWxsYmFjaygpO1xuICAgICAgfSB3aGlsZSAoXG4gICAgICAvLyBLZWVwIGZsdXNoaW5nIHVudGlsIHRoZXJlIGFyZSBubyBtb3JlIGltbWVkaWF0ZSBjYWxsYmFja3NcbiAgICAgIGZpcnN0Q2FsbGJhY2tOb2RlICE9PSBudWxsICYmIGZpcnN0Q2FsbGJhY2tOb2RlLnByaW9yaXR5TGV2ZWwgPT09IEltbWVkaWF0ZVByaW9yaXR5KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaXNFeGVjdXRpbmdDYWxsYmFjayA9IGZhbHNlO1xuICAgICAgaWYgKGZpcnN0Q2FsbGJhY2tOb2RlICE9PSBudWxsKSB7XG4gICAgICAgIC8vIFRoZXJlJ3Mgc3RpbGwgd29yayByZW1haW5pbmcuIFJlcXVlc3QgYW5vdGhlciBjYWxsYmFjay5cbiAgICAgICAgZW5zdXJlSG9zdENhbGxiYWNrSXNTY2hlZHVsZWQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoV29yayhkaWRUaW1lb3V0KSB7XG4gIC8vIEV4aXQgcmlnaHQgYXdheSBpZiB3ZSdyZSBjdXJyZW50bHkgcGF1c2VkXG5cbiAgaWYgKGVuYWJsZVNjaGVkdWxlckRlYnVnZ2luZyAmJiBpc1NjaGVkdWxlclBhdXNlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlzRXhlY3V0aW5nQ2FsbGJhY2sgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNEaWRUaW1lb3V0ID0gY3VycmVudERpZFRpbWVvdXQ7XG4gIGN1cnJlbnREaWRUaW1lb3V0ID0gZGlkVGltZW91dDtcbiAgdHJ5IHtcbiAgICBpZiAoZGlkVGltZW91dCkge1xuICAgICAgLy8gRmx1c2ggYWxsIHRoZSBleHBpcmVkIGNhbGxiYWNrcyB3aXRob3V0IHlpZWxkaW5nLlxuICAgICAgd2hpbGUgKGZpcnN0Q2FsbGJhY2tOb2RlICE9PSBudWxsICYmICEoZW5hYmxlU2NoZWR1bGVyRGVidWdnaW5nICYmIGlzU2NoZWR1bGVyUGF1c2VkKSkge1xuICAgICAgICAvLyBUT0RPIFdyYXAgaW4gZmVhdHVyZSBmbGFnXG4gICAgICAgIC8vIFJlYWQgdGhlIGN1cnJlbnQgdGltZS4gRmx1c2ggYWxsIHRoZSBjYWxsYmFja3MgdGhhdCBleHBpcmUgYXQgb3JcbiAgICAgICAgLy8gZWFybGllciB0aGFuIHRoYXQgdGltZS4gVGhlbiByZWFkIHRoZSBjdXJyZW50IHRpbWUgYWdhaW4gYW5kIHJlcGVhdC5cbiAgICAgICAgLy8gVGhpcyBvcHRpbWl6ZXMgZm9yIGFzIGZldyBwZXJmb3JtYW5jZS5ub3cgY2FsbHMgYXMgcG9zc2libGUuXG4gICAgICAgIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG4gICAgICAgIGlmIChmaXJzdENhbGxiYWNrTm9kZS5leHBpcmF0aW9uVGltZSA8PSBjdXJyZW50VGltZSkge1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGZsdXNoRmlyc3RDYWxsYmFjaygpO1xuICAgICAgICAgIH0gd2hpbGUgKGZpcnN0Q2FsbGJhY2tOb2RlICE9PSBudWxsICYmIGZpcnN0Q2FsbGJhY2tOb2RlLmV4cGlyYXRpb25UaW1lIDw9IGN1cnJlbnRUaW1lICYmICEoZW5hYmxlU2NoZWR1bGVyRGVidWdnaW5nICYmIGlzU2NoZWR1bGVyUGF1c2VkKSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEtlZXAgZmx1c2hpbmcgY2FsbGJhY2tzIHVudGlsIHdlIHJ1biBvdXQgb2YgdGltZSBpbiB0aGUgZnJhbWUuXG4gICAgICBpZiAoZmlyc3RDYWxsYmFja05vZGUgIT09IG51bGwpIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIGlmIChlbmFibGVTY2hlZHVsZXJEZWJ1Z2dpbmcgJiYgaXNTY2hlZHVsZXJQYXVzZWQpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaEZpcnN0Q2FsbGJhY2soKTtcbiAgICAgICAgfSB3aGlsZSAoZmlyc3RDYWxsYmFja05vZGUgIT09IG51bGwgJiYgIXNob3VsZFlpZWxkVG9Ib3N0KCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpc0V4ZWN1dGluZ0NhbGxiYWNrID0gZmFsc2U7XG4gICAgY3VycmVudERpZFRpbWVvdXQgPSBwcmV2aW91c0RpZFRpbWVvdXQ7XG4gICAgaWYgKGZpcnN0Q2FsbGJhY2tOb2RlICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGVyZSdzIHN0aWxsIHdvcmsgcmVtYWluaW5nLiBSZXF1ZXN0IGFub3RoZXIgY2FsbGJhY2suXG4gICAgICBlbnN1cmVIb3N0Q2FsbGJhY2tJc1NjaGVkdWxlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyBCZWZvcmUgZXhpdGluZywgZmx1c2ggYWxsIHRoZSBpbW1lZGlhdGUgd29yayB0aGF0IHdhcyBzY2hlZHVsZWQuXG4gICAgZmx1c2hJbW1lZGlhdGVXb3JrKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfcnVuV2l0aFByaW9yaXR5KHByaW9yaXR5TGV2ZWwsIGV2ZW50SGFuZGxlcikge1xuICBzd2l0Y2ggKHByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgIGNhc2UgSWRsZVByaW9yaXR5OlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgfVxuXG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgdmFyIHByZXZpb3VzRXZlbnRTdGFydFRpbWUgPSBjdXJyZW50RXZlbnRTdGFydFRpbWU7XG4gIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcbiAgY3VycmVudEV2ZW50U3RhcnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcblxuICB0cnkge1xuICAgIHJldHVybiBldmVudEhhbmRsZXIoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgICBjdXJyZW50RXZlbnRTdGFydFRpbWUgPSBwcmV2aW91c0V2ZW50U3RhcnRUaW1lO1xuXG4gICAgLy8gQmVmb3JlIGV4aXRpbmcsIGZsdXNoIGFsbCB0aGUgaW1tZWRpYXRlIHdvcmsgdGhhdCB3YXMgc2NoZWR1bGVkLlxuICAgIGZsdXNoSW1tZWRpYXRlV29yaygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX25leHQoZXZlbnRIYW5kbGVyKSB7XG4gIHZhciBwcmlvcml0eUxldmVsID0gdm9pZCAwO1xuICBzd2l0Y2ggKGN1cnJlbnRQcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgICAvLyBTaGlmdCBkb3duIHRvIG5vcm1hbCBwcmlvcml0eVxuICAgICAgcHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIEFueXRoaW5nIGxvd2VyIHRoYW4gbm9ybWFsIHByaW9yaXR5IHNob3VsZCByZW1haW4gYXQgdGhlIGN1cnJlbnQgbGV2ZWwuXG4gICAgICBwcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgdmFyIHByZXZpb3VzRXZlbnRTdGFydFRpbWUgPSBjdXJyZW50RXZlbnRTdGFydFRpbWU7XG4gIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcbiAgY3VycmVudEV2ZW50U3RhcnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcblxuICB0cnkge1xuICAgIHJldHVybiBldmVudEhhbmRsZXIoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgICBjdXJyZW50RXZlbnRTdGFydFRpbWUgPSBwcmV2aW91c0V2ZW50U3RhcnRUaW1lO1xuXG4gICAgLy8gQmVmb3JlIGV4aXRpbmcsIGZsdXNoIGFsbCB0aGUgaW1tZWRpYXRlIHdvcmsgdGhhdCB3YXMgc2NoZWR1bGVkLlxuICAgIGZsdXNoSW1tZWRpYXRlV29yaygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3dyYXBDYWxsYmFjayhjYWxsYmFjaykge1xuICB2YXIgcGFyZW50UHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIC8vIFRoaXMgaXMgYSBmb3JrIG9mIHJ1bldpdGhQcmlvcml0eSwgaW5saW5lZCBmb3IgcGVyZm9ybWFuY2UuXG4gICAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICAgIHZhciBwcmV2aW91c0V2ZW50U3RhcnRUaW1lID0gY3VycmVudEV2ZW50U3RhcnRUaW1lO1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcGFyZW50UHJpb3JpdHlMZXZlbDtcbiAgICBjdXJyZW50RXZlbnRTdGFydFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgICAgIGN1cnJlbnRFdmVudFN0YXJ0VGltZSA9IHByZXZpb3VzRXZlbnRTdGFydFRpbWU7XG4gICAgICBmbHVzaEltbWVkaWF0ZVdvcmsoKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHJlY2F0ZWRfb3B0aW9ucykge1xuICB2YXIgc3RhcnRUaW1lID0gY3VycmVudEV2ZW50U3RhcnRUaW1lICE9PSAtMSA/IGN1cnJlbnRFdmVudFN0YXJ0VGltZSA6IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG5cbiAgdmFyIGV4cGlyYXRpb25UaW1lO1xuICBpZiAodHlwZW9mIGRlcHJlY2F0ZWRfb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgZGVwcmVjYXRlZF9vcHRpb25zICE9PSBudWxsICYmIHR5cGVvZiBkZXByZWNhdGVkX29wdGlvbnMudGltZW91dCA9PT0gJ251bWJlcicpIHtcbiAgICAvLyBGSVhNRTogUmVtb3ZlIHRoaXMgYnJhbmNoIG9uY2Ugd2UgbGlmdCBleHBpcmF0aW9uIHRpbWVzIG91dCBvZiBSZWFjdC5cbiAgICBleHBpcmF0aW9uVGltZSA9IHN0YXJ0VGltZSArIGRlcHJlY2F0ZWRfb3B0aW9ucy50aW1lb3V0O1xuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAoY3VycmVudFByaW9yaXR5TGV2ZWwpIHtcbiAgICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgICAgIGV4cGlyYXRpb25UaW1lID0gc3RhcnRUaW1lICsgSU1NRURJQVRFX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICAgICAgZXhwaXJhdGlvblRpbWUgPSBzdGFydFRpbWUgKyBVU0VSX0JMT0NLSU5HX1BSSU9SSVRZO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgSWRsZVByaW9yaXR5OlxuICAgICAgICBleHBpcmF0aW9uVGltZSA9IHN0YXJ0VGltZSArIElETEVfUFJJT1JJVFk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMb3dQcmlvcml0eTpcbiAgICAgICAgZXhwaXJhdGlvblRpbWUgPSBzdGFydFRpbWUgKyBMT1dfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE5vcm1hbFByaW9yaXR5OlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZXhwaXJhdGlvblRpbWUgPSBzdGFydFRpbWUgKyBOT1JNQUxfUFJJT1JJVFlfVElNRU9VVDtcbiAgICB9XG4gIH1cblxuICB2YXIgbmV3Tm9kZSA9IHtcbiAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgcHJpb3JpdHlMZXZlbDogY3VycmVudFByaW9yaXR5TGV2ZWwsXG4gICAgZXhwaXJhdGlvblRpbWU6IGV4cGlyYXRpb25UaW1lLFxuICAgIG5leHQ6IG51bGwsXG4gICAgcHJldmlvdXM6IG51bGxcbiAgfTtcblxuICAvLyBJbnNlcnQgdGhlIG5ldyBjYWxsYmFjayBpbnRvIHRoZSBsaXN0LCBvcmRlcmVkIGZpcnN0IGJ5IGV4cGlyYXRpb24sIHRoZW5cbiAgLy8gYnkgaW5zZXJ0aW9uLiBTbyB0aGUgbmV3IGNhbGxiYWNrIGlzIGluc2VydGVkIGFueSBvdGhlciBjYWxsYmFjayB3aXRoXG4gIC8vIGVxdWFsIGV4cGlyYXRpb24uXG4gIGlmIChmaXJzdENhbGxiYWNrTm9kZSA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGNhbGxiYWNrIGluIHRoZSBsaXN0LlxuICAgIGZpcnN0Q2FsbGJhY2tOb2RlID0gbmV3Tm9kZS5uZXh0ID0gbmV3Tm9kZS5wcmV2aW91cyA9IG5ld05vZGU7XG4gICAgZW5zdXJlSG9zdENhbGxiYWNrSXNTY2hlZHVsZWQoKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmV4dCA9IG51bGw7XG4gICAgdmFyIG5vZGUgPSBmaXJzdENhbGxiYWNrTm9kZTtcbiAgICBkbyB7XG4gICAgICBpZiAobm9kZS5leHBpcmF0aW9uVGltZSA+IGV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgIC8vIFRoZSBuZXcgY2FsbGJhY2sgZXhwaXJlcyBiZWZvcmUgdGhpcyBvbmUuXG4gICAgICAgIG5leHQgPSBub2RlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgfSB3aGlsZSAobm9kZSAhPT0gZmlyc3RDYWxsYmFja05vZGUpO1xuXG4gICAgaWYgKG5leHQgPT09IG51bGwpIHtcbiAgICAgIC8vIE5vIGNhbGxiYWNrIHdpdGggYSBsYXRlciBleHBpcmF0aW9uIHdhcyBmb3VuZCwgd2hpY2ggbWVhbnMgdGhlIG5ld1xuICAgICAgLy8gY2FsbGJhY2sgaGFzIHRoZSBsYXRlc3QgZXhwaXJhdGlvbiBpbiB0aGUgbGlzdC5cbiAgICAgIG5leHQgPSBmaXJzdENhbGxiYWNrTm9kZTtcbiAgICB9IGVsc2UgaWYgKG5leHQgPT09IGZpcnN0Q2FsbGJhY2tOb2RlKSB7XG4gICAgICAvLyBUaGUgbmV3IGNhbGxiYWNrIGhhcyB0aGUgZWFybGllc3QgZXhwaXJhdGlvbiBpbiB0aGUgZW50aXJlIGxpc3QuXG4gICAgICBmaXJzdENhbGxiYWNrTm9kZSA9IG5ld05vZGU7XG4gICAgICBlbnN1cmVIb3N0Q2FsbGJhY2tJc1NjaGVkdWxlZCgpO1xuICAgIH1cblxuICAgIHZhciBwcmV2aW91cyA9IG5leHQucHJldmlvdXM7XG4gICAgcHJldmlvdXMubmV4dCA9IG5leHQucHJldmlvdXMgPSBuZXdOb2RlO1xuICAgIG5ld05vZGUubmV4dCA9IG5leHQ7XG4gICAgbmV3Tm9kZS5wcmV2aW91cyA9IHByZXZpb3VzO1xuICB9XG5cbiAgcmV0dXJuIG5ld05vZGU7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uKCkge1xuICBpc1NjaGVkdWxlclBhdXNlZCA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uKCkge1xuICBpc1NjaGVkdWxlclBhdXNlZCA9IGZhbHNlO1xuICBpZiAoZmlyc3RDYWxsYmFja05vZGUgIT09IG51bGwpIHtcbiAgICBlbnN1cmVIb3N0Q2FsbGJhY2tJc1NjaGVkdWxlZCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlKCkge1xuICByZXR1cm4gZmlyc3RDYWxsYmFja05vZGU7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2NhbmNlbENhbGxiYWNrKGNhbGxiYWNrTm9kZSkge1xuICB2YXIgbmV4dCA9IGNhbGxiYWNrTm9kZS5uZXh0O1xuICBpZiAobmV4dCA9PT0gbnVsbCkge1xuICAgIC8vIEFscmVhZHkgY2FuY2VsbGVkLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChuZXh0ID09PSBjYWxsYmFja05vZGUpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBvbmx5IHNjaGVkdWxlZCBjYWxsYmFjay4gQ2xlYXIgdGhlIGxpc3QuXG4gICAgZmlyc3RDYWxsYmFja05vZGUgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIC8vIFJlbW92ZSB0aGUgY2FsbGJhY2sgZnJvbSBpdHMgcG9zaXRpb24gaW4gdGhlIGxpc3QuXG4gICAgaWYgKGNhbGxiYWNrTm9kZSA9PT0gZmlyc3RDYWxsYmFja05vZGUpIHtcbiAgICAgIGZpcnN0Q2FsbGJhY2tOb2RlID0gbmV4dDtcbiAgICB9XG4gICAgdmFyIHByZXZpb3VzID0gY2FsbGJhY2tOb2RlLnByZXZpb3VzO1xuICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgfVxuXG4gIGNhbGxiYWNrTm9kZS5uZXh0ID0gY2FsbGJhY2tOb2RlLnByZXZpb3VzID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKSB7XG4gIHJldHVybiBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfc2hvdWxkWWllbGQoKSB7XG4gIHJldHVybiAhY3VycmVudERpZFRpbWVvdXQgJiYgKGZpcnN0Q2FsbGJhY2tOb2RlICE9PSBudWxsICYmIGZpcnN0Q2FsbGJhY2tOb2RlLmV4cGlyYXRpb25UaW1lIDwgY3VycmVudEV4cGlyYXRpb25UaW1lIHx8IHNob3VsZFlpZWxkVG9Ib3N0KCkpO1xufVxuXG4vLyBUaGUgcmVtYWluaW5nIGNvZGUgaXMgZXNzZW50aWFsbHkgYSBwb2x5ZmlsbCBmb3IgcmVxdWVzdElkbGVDYWxsYmFjay4gSXRcbi8vIHdvcmtzIGJ5IHNjaGVkdWxpbmcgYSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUsIHN0b3JpbmcgdGhlIHRpbWUgZm9yIHRoZSBzdGFydFxuLy8gb2YgdGhlIGZyYW1lLCB0aGVuIHNjaGVkdWxpbmcgYSBwb3N0TWVzc2FnZSB3aGljaCBnZXRzIHNjaGVkdWxlZCBhZnRlciBwYWludC5cbi8vIFdpdGhpbiB0aGUgcG9zdE1lc3NhZ2UgaGFuZGxlciBkbyBhcyBtdWNoIHdvcmsgYXMgcG9zc2libGUgdW50aWwgdGltZSArIGZyYW1lXG4vLyByYXRlLiBCeSBzZXBhcmF0aW5nIHRoZSBpZGxlIGNhbGwgaW50byBhIHNlcGFyYXRlIGV2ZW50IHRpY2sgd2UgZW5zdXJlIHRoYXRcbi8vIGxheW91dCwgcGFpbnQgYW5kIG90aGVyIGJyb3dzZXIgd29yayBpcyBjb3VudGVkIGFnYWluc3QgdGhlIGF2YWlsYWJsZSB0aW1lLlxuLy8gVGhlIGZyYW1lIHJhdGUgaXMgZHluYW1pY2FsbHkgYWRqdXN0ZWQuXG5cbi8vIFdlIGNhcHR1cmUgYSBsb2NhbCByZWZlcmVuY2UgdG8gYW55IGdsb2JhbCwgaW4gY2FzZSBpdCBnZXRzIHBvbHlmaWxsZWQgYWZ0ZXJcbi8vIHRoaXMgbW9kdWxlIGlzIGluaXRpYWxseSBldmFsdWF0ZWQuIFdlIHdhbnQgdG8gYmUgdXNpbmcgYVxuLy8gY29uc2lzdGVudCBpbXBsZW1lbnRhdGlvbi5cbnZhciBsb2NhbERhdGUgPSBEYXRlO1xuXG4vLyBUaGlzIGluaXRpYWxpemF0aW9uIGNvZGUgbWF5IHJ1biBldmVuIG9uIHNlcnZlciBlbnZpcm9ubWVudHMgaWYgYSBjb21wb25lbnRcbi8vIGp1c3QgaW1wb3J0cyBSZWFjdERPTSAoZS5nLiBmb3IgZmluZERPTU5vZGUpLiBTb21lIGVudmlyb25tZW50cyBtaWdodCBub3Rcbi8vIGhhdmUgc2V0VGltZW91dCBvciBjbGVhclRpbWVvdXQuIEhvd2V2ZXIsIHdlIGFsd2F5cyBleHBlY3QgdGhlbSB0byBiZSBkZWZpbmVkXG4vLyBvbiB0aGUgY2xpZW50LiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xMzA4OFxudmFyIGxvY2FsU2V0VGltZW91dCA9IHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gc2V0VGltZW91dCA6IHVuZGVmaW5lZDtcbnZhciBsb2NhbENsZWFyVGltZW91dCA9IHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBjbGVhclRpbWVvdXQgOiB1bmRlZmluZWQ7XG5cbi8vIFdlIGRvbid0IGV4cGVjdCBlaXRoZXIgb2YgdGhlc2UgdG8gbmVjZXNzYXJpbHkgYmUgZGVmaW5lZCwgYnV0IHdlIHdpbGwgZXJyb3Jcbi8vIGxhdGVyIGlmIHRoZXkgYXJlIG1pc3Npbmcgb24gdGhlIGNsaWVudC5cbnZhciBsb2NhbFJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbicgPyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgOiB1bmRlZmluZWQ7XG52YXIgbG9jYWxDYW5jZWxBbmltYXRpb25GcmFtZSA9IHR5cGVvZiBjYW5jZWxBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJyA/IGNhbmNlbEFuaW1hdGlvbkZyYW1lIDogdW5kZWZpbmVkO1xuXG4vLyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgZG9lcyBub3QgcnVuIHdoZW4gdGhlIHRhYiBpcyBpbiB0aGUgYmFja2dyb3VuZC4gSWZcbi8vIHdlJ3JlIGJhY2tncm91bmRlZCB3ZSBwcmVmZXIgZm9yIHRoYXQgd29yayB0byBoYXBwZW4gc28gdGhhdCB0aGUgcGFnZVxuLy8gY29udGludWVzIHRvIGxvYWQgaW4gdGhlIGJhY2tncm91bmQuIFNvIHdlIGFsc28gc2NoZWR1bGUgYSAnc2V0VGltZW91dCcgYXNcbi8vIGEgZmFsbGJhY2suXG4vLyBUT0RPOiBOZWVkIGEgYmV0dGVyIGhldXJpc3RpYyBmb3IgYmFja2dyb3VuZGVkIHdvcmsuXG52YXIgQU5JTUFUSU9OX0ZSQU1FX1RJTUVPVVQgPSAxMDA7XG52YXIgckFGSUQ7XG52YXIgckFGVGltZW91dElEO1xudmFyIHJlcXVlc3RBbmltYXRpb25GcmFtZVdpdGhUaW1lb3V0ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIC8vIHNjaGVkdWxlIHJBRiBhbmQgYWxzbyBhIHNldFRpbWVvdXRcbiAgckFGSUQgPSBsb2NhbFJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAodGltZXN0YW1wKSB7XG4gICAgLy8gY2FuY2VsIHRoZSBzZXRUaW1lb3V0XG4gICAgbG9jYWxDbGVhclRpbWVvdXQockFGVGltZW91dElEKTtcbiAgICBjYWxsYmFjayh0aW1lc3RhbXApO1xuICB9KTtcbiAgckFGVGltZW91dElEID0gbG9jYWxTZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBjYW5jZWwgdGhlIHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgIGxvY2FsQ2FuY2VsQW5pbWF0aW9uRnJhbWUockFGSUQpO1xuICAgIGNhbGxiYWNrKGV4cG9ydHMudW5zdGFibGVfbm93KCkpO1xuICB9LCBBTklNQVRJT05fRlJBTUVfVElNRU9VVCk7XG59O1xuXG5pZiAoaGFzTmF0aXZlUGVyZm9ybWFuY2VOb3cpIHtcbiAgdmFyIFBlcmZvcm1hbmNlID0gcGVyZm9ybWFuY2U7XG4gIGV4cG9ydHMudW5zdGFibGVfbm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBQZXJmb3JtYW5jZS5ub3coKTtcbiAgfTtcbn0gZWxzZSB7XG4gIGV4cG9ydHMudW5zdGFibGVfbm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBsb2NhbERhdGUubm93KCk7XG4gIH07XG59XG5cbnZhciByZXF1ZXN0SG9zdENhbGxiYWNrO1xudmFyIGNhbmNlbEhvc3RDYWxsYmFjaztcbnZhciBzaG91bGRZaWVsZFRvSG9zdDtcblxudmFyIGdsb2JhbFZhbHVlID0gbnVsbDtcbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICBnbG9iYWxWYWx1ZSA9IHdpbmRvdztcbn0gZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgZ2xvYmFsVmFsdWUgPSBnbG9iYWw7XG59XG5cbmlmIChnbG9iYWxWYWx1ZSAmJiBnbG9iYWxWYWx1ZS5fc2NoZWRNb2NrKSB7XG4gIC8vIER5bmFtaWMgaW5qZWN0aW9uLCBvbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICB2YXIgZ2xvYmFsSW1wbCA9IGdsb2JhbFZhbHVlLl9zY2hlZE1vY2s7XG4gIHJlcXVlc3RIb3N0Q2FsbGJhY2sgPSBnbG9iYWxJbXBsWzBdO1xuICBjYW5jZWxIb3N0Q2FsbGJhY2sgPSBnbG9iYWxJbXBsWzFdO1xuICBzaG91bGRZaWVsZFRvSG9zdCA9IGdsb2JhbEltcGxbMl07XG4gIGV4cG9ydHMudW5zdGFibGVfbm93ID0gZ2xvYmFsSW1wbFszXTtcbn0gZWxzZSBpZiAoXG4vLyBJZiBTY2hlZHVsZXIgcnVucyBpbiBhIG5vbi1ET00gZW52aXJvbm1lbnQsIGl0IGZhbGxzIGJhY2sgdG8gYSBuYWl2ZVxuLy8gaW1wbGVtZW50YXRpb24gdXNpbmcgc2V0VGltZW91dC5cbnR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8XG4vLyBDaGVjayBpZiBNZXNzYWdlQ2hhbm5lbCBpcyBzdXBwb3J0ZWQsIHRvby5cbnR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ2Z1bmN0aW9uJykge1xuICAvLyBJZiB0aGlzIGFjY2lkZW50YWxseSBnZXRzIGltcG9ydGVkIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnQsIGUuZy4gSmF2YVNjcmlwdENvcmUsXG4gIC8vIGZhbGxiYWNrIHRvIGEgbmFpdmUgaW1wbGVtZW50YXRpb24uXG4gIHZhciBfY2FsbGJhY2sgPSBudWxsO1xuICB2YXIgX2ZsdXNoQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZGlkVGltZW91dCkge1xuICAgIGlmIChfY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIF9jYWxsYmFjayhkaWRUaW1lb3V0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9jYWxsYmFjayA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXF1ZXN0SG9zdENhbGxiYWNrID0gZnVuY3Rpb24gKGNiLCBtcykge1xuICAgIGlmIChfY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIC8vIFByb3RlY3QgYWdhaW5zdCByZS1lbnRyYW5jeS5cbiAgICAgIHNldFRpbWVvdXQocmVxdWVzdEhvc3RDYWxsYmFjaywgMCwgY2IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfY2FsbGJhY2sgPSBjYjtcbiAgICAgIHNldFRpbWVvdXQoX2ZsdXNoQ2FsbGJhY2ssIDAsIGZhbHNlKTtcbiAgICB9XG4gIH07XG4gIGNhbmNlbEhvc3RDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICBfY2FsbGJhY2sgPSBudWxsO1xuICB9O1xuICBzaG91bGRZaWVsZFRvSG9zdCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG59IGVsc2Uge1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gVE9ETzogUmVtb3ZlIGZiLm1lIGxpbmtcbiAgICBpZiAodHlwZW9mIGxvY2FsUmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiVGhpcyBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuIFwiICsgJ01ha2Ugc3VyZSB0aGF0IHlvdSBsb2FkIGEgJyArICdwb2x5ZmlsbCBpbiBvbGRlciBicm93c2Vycy4gaHR0cHM6Ly9mYi5tZS9yZWFjdC1wb2x5ZmlsbHMnKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBsb2NhbENhbmNlbEFuaW1hdGlvbkZyYW1lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiVGhpcyBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBjYW5jZWxBbmltYXRpb25GcmFtZS4gXCIgKyAnTWFrZSBzdXJlIHRoYXQgeW91IGxvYWQgYSAnICsgJ3BvbHlmaWxsIGluIG9sZGVyIGJyb3dzZXJzLiBodHRwczovL2ZiLm1lL3JlYWN0LXBvbHlmaWxscycpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBudWxsO1xuICB2YXIgaXNNZXNzYWdlRXZlbnRTY2hlZHVsZWQgPSBmYWxzZTtcbiAgdmFyIHRpbWVvdXRUaW1lID0gLTE7XG5cbiAgdmFyIGlzQW5pbWF0aW9uRnJhbWVTY2hlZHVsZWQgPSBmYWxzZTtcblxuICB2YXIgaXNGbHVzaGluZ0hvc3RDYWxsYmFjayA9IGZhbHNlO1xuXG4gIHZhciBmcmFtZURlYWRsaW5lID0gMDtcbiAgLy8gV2Ugc3RhcnQgb3V0IGFzc3VtaW5nIHRoYXQgd2UgcnVuIGF0IDMwZnBzIGJ1dCB0aGVuIHRoZSBoZXVyaXN0aWMgdHJhY2tpbmdcbiAgLy8gd2lsbCBhZGp1c3QgdGhpcyB2YWx1ZSB0byBhIGZhc3RlciBmcHMgaWYgd2UgZ2V0IG1vcmUgZnJlcXVlbnQgYW5pbWF0aW9uXG4gIC8vIGZyYW1lcy5cbiAgdmFyIHByZXZpb3VzRnJhbWVUaW1lID0gMzM7XG4gIHZhciBhY3RpdmVGcmFtZVRpbWUgPSAzMztcblxuICBzaG91bGRZaWVsZFRvSG9zdCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnJhbWVEZWFkbGluZSA8PSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuICB9O1xuXG4gIC8vIFdlIHVzZSB0aGUgcG9zdE1lc3NhZ2UgdHJpY2sgdG8gZGVmZXIgaWRsZSB3b3JrIHVudGlsIGFmdGVyIHRoZSByZXBhaW50LlxuICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICB2YXIgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaXNNZXNzYWdlRXZlbnRTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAgIHZhciBwcmV2U2NoZWR1bGVkQ2FsbGJhY2sgPSBzY2hlZHVsZWRIb3N0Q2FsbGJhY2s7XG4gICAgdmFyIHByZXZUaW1lb3V0VGltZSA9IHRpbWVvdXRUaW1lO1xuICAgIHNjaGVkdWxlZEhvc3RDYWxsYmFjayA9IG51bGw7XG4gICAgdGltZW91dFRpbWUgPSAtMTtcblxuICAgIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG5cbiAgICB2YXIgZGlkVGltZW91dCA9IGZhbHNlO1xuICAgIGlmIChmcmFtZURlYWRsaW5lIC0gY3VycmVudFRpbWUgPD0gMCkge1xuICAgICAgLy8gVGhlcmUncyBubyB0aW1lIGxlZnQgaW4gdGhpcyBpZGxlIHBlcmlvZC4gQ2hlY2sgaWYgdGhlIGNhbGxiYWNrIGhhc1xuICAgICAgLy8gYSB0aW1lb3V0IGFuZCB3aGV0aGVyIGl0J3MgYmVlbiBleGNlZWRlZC5cbiAgICAgIGlmIChwcmV2VGltZW91dFRpbWUgIT09IC0xICYmIHByZXZUaW1lb3V0VGltZSA8PSBjdXJyZW50VGltZSkge1xuICAgICAgICAvLyBFeGNlZWRlZCB0aGUgdGltZW91dC4gSW52b2tlIHRoZSBjYWxsYmFjayBldmVuIHRob3VnaCB0aGVyZSdzIG5vXG4gICAgICAgIC8vIHRpbWUgbGVmdC5cbiAgICAgICAgZGlkVGltZW91dCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBObyB0aW1lb3V0LlxuICAgICAgICBpZiAoIWlzQW5pbWF0aW9uRnJhbWVTY2hlZHVsZWQpIHtcbiAgICAgICAgICAvLyBTY2hlZHVsZSBhbm90aGVyIGFuaW1hdGlvbiBjYWxsYmFjayBzbyB3ZSByZXRyeSBsYXRlci5cbiAgICAgICAgICBpc0FuaW1hdGlvbkZyYW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWVXaXRoVGltZW91dChhbmltYXRpb25UaWNrKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBFeGl0IHdpdGhvdXQgaW52b2tpbmcgdGhlIGNhbGxiYWNrLlxuICAgICAgICBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBwcmV2U2NoZWR1bGVkQ2FsbGJhY2s7XG4gICAgICAgIHRpbWVvdXRUaW1lID0gcHJldlRpbWVvdXRUaW1lO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHByZXZTY2hlZHVsZWRDYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgaXNGbHVzaGluZ0hvc3RDYWxsYmFjayA9IHRydWU7XG4gICAgICB0cnkge1xuICAgICAgICBwcmV2U2NoZWR1bGVkQ2FsbGJhY2soZGlkVGltZW91dCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpc0ZsdXNoaW5nSG9zdENhbGxiYWNrID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHZhciBhbmltYXRpb25UaWNrID0gZnVuY3Rpb24gKHJhZlRpbWUpIHtcbiAgICBpZiAoc2NoZWR1bGVkSG9zdENhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICAvLyBFYWdlcmx5IHNjaGVkdWxlIHRoZSBuZXh0IGFuaW1hdGlvbiBjYWxsYmFjayBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuICAgICAgLy8gZnJhbWUuIElmIHRoZSBzY2hlZHVsZXIgcXVldWUgaXMgbm90IGVtcHR5IGF0IHRoZSBlbmQgb2YgdGhlIGZyYW1lLCBpdFxuICAgICAgLy8gd2lsbCBjb250aW51ZSBmbHVzaGluZyBpbnNpZGUgdGhhdCBjYWxsYmFjay4gSWYgdGhlIHF1ZXVlICppcyogZW1wdHksXG4gICAgICAvLyB0aGVuIGl0IHdpbGwgZXhpdCBpbW1lZGlhdGVseS4gUG9zdGluZyB0aGUgY2FsbGJhY2sgYXQgdGhlIHN0YXJ0IG9mIHRoZVxuICAgICAgLy8gZnJhbWUgZW5zdXJlcyBpdCdzIGZpcmVkIHdpdGhpbiB0aGUgZWFybGllc3QgcG9zc2libGUgZnJhbWUuIElmIHdlXG4gICAgICAvLyB3YWl0ZWQgdW50aWwgdGhlIGVuZCBvZiB0aGUgZnJhbWUgdG8gcG9zdCB0aGUgY2FsbGJhY2ssIHdlIHJpc2sgdGhlXG4gICAgICAvLyBicm93c2VyIHNraXBwaW5nIGEgZnJhbWUgYW5kIG5vdCBmaXJpbmcgdGhlIGNhbGxiYWNrIHVudGlsIHRoZSBmcmFtZVxuICAgICAgLy8gYWZ0ZXIgdGhhdC5cbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZVdpdGhUaW1lb3V0KGFuaW1hdGlvblRpY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBwZW5kaW5nIHdvcmsuIEV4aXQuXG4gICAgICBpc0FuaW1hdGlvbkZyYW1lU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5leHRGcmFtZVRpbWUgPSByYWZUaW1lIC0gZnJhbWVEZWFkbGluZSArIGFjdGl2ZUZyYW1lVGltZTtcbiAgICBpZiAobmV4dEZyYW1lVGltZSA8IGFjdGl2ZUZyYW1lVGltZSAmJiBwcmV2aW91c0ZyYW1lVGltZSA8IGFjdGl2ZUZyYW1lVGltZSkge1xuICAgICAgaWYgKG5leHRGcmFtZVRpbWUgPCA4KSB7XG4gICAgICAgIC8vIERlZmVuc2l2ZSBjb2RpbmcuIFdlIGRvbid0IHN1cHBvcnQgaGlnaGVyIGZyYW1lIHJhdGVzIHRoYW4gMTIwaHouXG4gICAgICAgIC8vIElmIHRoZSBjYWxjdWxhdGVkIGZyYW1lIHRpbWUgZ2V0cyBsb3dlciB0aGFuIDgsIGl0IGlzIHByb2JhYmx5IGEgYnVnLlxuICAgICAgICBuZXh0RnJhbWVUaW1lID0gODtcbiAgICAgIH1cbiAgICAgIC8vIElmIG9uZSBmcmFtZSBnb2VzIGxvbmcsIHRoZW4gdGhlIG5leHQgb25lIGNhbiBiZSBzaG9ydCB0byBjYXRjaCB1cC5cbiAgICAgIC8vIElmIHR3byBmcmFtZXMgYXJlIHNob3J0IGluIGEgcm93LCB0aGVuIHRoYXQncyBhbiBpbmRpY2F0aW9uIHRoYXQgd2VcbiAgICAgIC8vIGFjdHVhbGx5IGhhdmUgYSBoaWdoZXIgZnJhbWUgcmF0ZSB0aGFuIHdoYXQgd2UncmUgY3VycmVudGx5IG9wdGltaXppbmcuXG4gICAgICAvLyBXZSBhZGp1c3Qgb3VyIGhldXJpc3RpYyBkeW5hbWljYWxseSBhY2NvcmRpbmdseS4gRm9yIGV4YW1wbGUsIGlmIHdlJ3JlXG4gICAgICAvLyBydW5uaW5nIG9uIDEyMGh6IGRpc3BsYXkgb3IgOTBoeiBWUiBkaXNwbGF5LlxuICAgICAgLy8gVGFrZSB0aGUgbWF4IG9mIHRoZSB0d28gaW4gY2FzZSBvbmUgb2YgdGhlbSB3YXMgYW4gYW5vbWFseSBkdWUgdG9cbiAgICAgIC8vIG1pc3NlZCBmcmFtZSBkZWFkbGluZXMuXG4gICAgICBhY3RpdmVGcmFtZVRpbWUgPSBuZXh0RnJhbWVUaW1lIDwgcHJldmlvdXNGcmFtZVRpbWUgPyBwcmV2aW91c0ZyYW1lVGltZSA6IG5leHRGcmFtZVRpbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZXZpb3VzRnJhbWVUaW1lID0gbmV4dEZyYW1lVGltZTtcbiAgICB9XG4gICAgZnJhbWVEZWFkbGluZSA9IHJhZlRpbWUgKyBhY3RpdmVGcmFtZVRpbWU7XG4gICAgaWYgKCFpc01lc3NhZ2VFdmVudFNjaGVkdWxlZCkge1xuICAgICAgaXNNZXNzYWdlRXZlbnRTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgcG9ydC5wb3N0TWVzc2FnZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgfTtcblxuICByZXF1ZXN0SG9zdENhbGxiYWNrID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBhYnNvbHV0ZVRpbWVvdXQpIHtcbiAgICBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB0aW1lb3V0VGltZSA9IGFic29sdXRlVGltZW91dDtcbiAgICBpZiAoaXNGbHVzaGluZ0hvc3RDYWxsYmFjayB8fCBhYnNvbHV0ZVRpbWVvdXQgPCAwKSB7XG4gICAgICAvLyBEb24ndCB3YWl0IGZvciB0aGUgbmV4dCBmcmFtZS4gQ29udGludWUgd29ya2luZyBBU0FQLCBpbiBhIG5ldyBldmVudC5cbiAgICAgIHBvcnQucG9zdE1lc3NhZ2UodW5kZWZpbmVkKTtcbiAgICB9IGVsc2UgaWYgKCFpc0FuaW1hdGlvbkZyYW1lU2NoZWR1bGVkKSB7XG4gICAgICAvLyBJZiByQUYgZGlkbid0IGFscmVhZHkgc2NoZWR1bGUgb25lLCB3ZSBuZWVkIHRvIHNjaGVkdWxlIGEgZnJhbWUuXG4gICAgICAvLyBUT0RPOiBJZiB0aGlzIHJBRiBkb2Vzbid0IG1hdGVyaWFsaXplIGJlY2F1c2UgdGhlIGJyb3dzZXIgdGhyb3R0bGVzLCB3ZVxuICAgICAgLy8gbWlnaHQgd2FudCB0byBzdGlsbCBoYXZlIHNldFRpbWVvdXQgdHJpZ2dlciBySUMgYXMgYSBiYWNrdXAgdG8gZW5zdXJlXG4gICAgICAvLyB0aGF0IHdlIGtlZXAgcGVyZm9ybWluZyB3b3JrLlxuICAgICAgaXNBbmltYXRpb25GcmFtZVNjaGVkdWxlZCA9IHRydWU7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWVXaXRoVGltZW91dChhbmltYXRpb25UaWNrKTtcbiAgICB9XG4gIH07XG5cbiAgY2FuY2VsSG9zdENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgIHNjaGVkdWxlZEhvc3RDYWxsYmFjayA9IG51bGw7XG4gICAgaXNNZXNzYWdlRXZlbnRTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICB0aW1lb3V0VGltZSA9IC0xO1xuICB9O1xufVxuXG5leHBvcnRzLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5ID0gSW1tZWRpYXRlUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5ID0gVXNlckJsb2NraW5nUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5ID0gTm9ybWFsUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX0lkbGVQcmlvcml0eSA9IElkbGVQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfTG93UHJpb3JpdHkgPSBMb3dQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5ID0gdW5zdGFibGVfcnVuV2l0aFByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9uZXh0ID0gdW5zdGFibGVfbmV4dDtcbmV4cG9ydHMudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayA9IHVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2s7XG5leHBvcnRzLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrID0gdW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s7XG5leHBvcnRzLnVuc3RhYmxlX3dyYXBDYWxsYmFjayA9IHVuc3RhYmxlX3dyYXBDYWxsYmFjaztcbmV4cG9ydHMudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSB1bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbDtcbmV4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQgPSB1bnN0YWJsZV9zaG91bGRZaWVsZDtcbmV4cG9ydHMudW5zdGFibGVfY29udGludWVFeGVjdXRpb24gPSB1bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbjtcbmV4cG9ydHMudW5zdGFibGVfcGF1c2VFeGVjdXRpb24gPSB1bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbjtcbmV4cG9ydHMudW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGUgPSB1bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZTtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXIucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLXRyYWNpbmcucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLXRyYWNpbmcuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsIi8qXG5cdE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG5cdEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcbiovXG5cbnZhciBzdHlsZXNJbkRvbSA9IHt9O1xuXG52YXJcdG1lbW9pemUgPSBmdW5jdGlvbiAoZm4pIHtcblx0dmFyIG1lbW87XG5cblx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRpZiAodHlwZW9mIG1lbW8gPT09IFwidW5kZWZpbmVkXCIpIG1lbW8gPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHRcdHJldHVybiBtZW1vO1xuXHR9O1xufTtcblxudmFyIGlzT2xkSUUgPSBtZW1vaXplKGZ1bmN0aW9uICgpIHtcblx0Ly8gVGVzdCBmb3IgSUUgPD0gOSBhcyBwcm9wb3NlZCBieSBCcm93c2VyaGFja3Ncblx0Ly8gQHNlZSBodHRwOi8vYnJvd3NlcmhhY2tzLmNvbS8jaGFjay1lNzFkODY5MmY2NTMzNDE3M2ZlZTcxNWMyMjJjYjgwNVxuXHQvLyBUZXN0cyBmb3IgZXhpc3RlbmNlIG9mIHN0YW5kYXJkIGdsb2JhbHMgaXMgdG8gYWxsb3cgc3R5bGUtbG9hZGVyXG5cdC8vIHRvIG9wZXJhdGUgY29ycmVjdGx5IGludG8gbm9uLXN0YW5kYXJkIGVudmlyb25tZW50c1xuXHQvLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJwYWNrLWNvbnRyaWIvc3R5bGUtbG9hZGVyL2lzc3Vlcy8xNzdcblx0cmV0dXJuIHdpbmRvdyAmJiBkb2N1bWVudCAmJiBkb2N1bWVudC5hbGwgJiYgIXdpbmRvdy5hdG9iO1xufSk7XG5cbnZhciBnZXRUYXJnZXQgPSBmdW5jdGlvbiAodGFyZ2V0LCBwYXJlbnQpIHtcbiAgaWYgKHBhcmVudCl7XG4gICAgcmV0dXJuIHBhcmVudC5xdWVyeVNlbGVjdG9yKHRhcmdldCk7XG4gIH1cbiAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcbn07XG5cbnZhciBnZXRFbGVtZW50ID0gKGZ1bmN0aW9uIChmbikge1xuXHR2YXIgbWVtbyA9IHt9O1xuXG5cdHJldHVybiBmdW5jdGlvbih0YXJnZXQsIHBhcmVudCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHBhc3NpbmcgZnVuY3Rpb24gaW4gb3B0aW9ucywgdGhlbiB1c2UgaXQgZm9yIHJlc29sdmUgXCJoZWFkXCIgZWxlbWVudC5cbiAgICAgICAgICAgICAgICAvLyBVc2VmdWwgZm9yIFNoYWRvdyBSb290IHN0eWxlIGkuZVxuICAgICAgICAgICAgICAgIC8vIHtcbiAgICAgICAgICAgICAgICAvLyAgIGluc2VydEludG86IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjZm9vXCIpLnNoYWRvd1Jvb3QgfVxuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0dmFyIHN0eWxlVGFyZ2V0ID0gZ2V0VGFyZ2V0LmNhbGwodGhpcywgdGFyZ2V0LCBwYXJlbnQpO1xuXHRcdFx0Ly8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcblx0XHRcdGlmICh3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQgJiYgc3R5bGVUYXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHQvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuXHRcdFx0XHRcdC8vIGR1ZSB0byBjcm9zcy1vcmlnaW4gcmVzdHJpY3Rpb25zXG5cdFx0XHRcdFx0c3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcblx0XHRcdFx0fSBjYXRjaChlKSB7XG5cdFx0XHRcdFx0c3R5bGVUYXJnZXQgPSBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcblx0XHR9XG5cdFx0cmV0dXJuIG1lbW9bdGFyZ2V0XVxuXHR9O1xufSkoKTtcblxudmFyIHNpbmdsZXRvbiA9IG51bGw7XG52YXJcdHNpbmdsZXRvbkNvdW50ZXIgPSAwO1xudmFyXHRzdHlsZXNJbnNlcnRlZEF0VG9wID0gW107XG5cbnZhclx0Zml4VXJscyA9IHJlcXVpcmUoXCIuL3VybHNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obGlzdCwgb3B0aW9ucykge1xuXHRpZiAodHlwZW9mIERFQlVHICE9PSBcInVuZGVmaW5lZFwiICYmIERFQlVHKSB7XG5cdFx0aWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHN0eWxlLWxvYWRlciBjYW5ub3QgYmUgdXNlZCBpbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50XCIpO1xuXHR9XG5cblx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0b3B0aW9ucy5hdHRycyA9IHR5cGVvZiBvcHRpb25zLmF0dHJzID09PSBcIm9iamVjdFwiID8gb3B0aW9ucy5hdHRycyA6IHt9O1xuXG5cdC8vIEZvcmNlIHNpbmdsZS10YWcgc29sdXRpb24gb24gSUU2LTksIHdoaWNoIGhhcyBhIGhhcmQgbGltaXQgb24gdGhlICMgb2YgPHN0eWxlPlxuXHQvLyB0YWdzIGl0IHdpbGwgYWxsb3cgb24gYSBwYWdlXG5cdGlmICghb3B0aW9ucy5zaW5nbGV0b24gJiYgdHlwZW9mIG9wdGlvbnMuc2luZ2xldG9uICE9PSBcImJvb2xlYW5cIikgb3B0aW9ucy5zaW5nbGV0b24gPSBpc09sZElFKCk7XG5cblx0Ly8gQnkgZGVmYXVsdCwgYWRkIDxzdHlsZT4gdGFncyB0byB0aGUgPGhlYWQ+IGVsZW1lbnRcbiAgICAgICAgaWYgKCFvcHRpb25zLmluc2VydEludG8pIG9wdGlvbnMuaW5zZXJ0SW50byA9IFwiaGVhZFwiO1xuXG5cdC8vIEJ5IGRlZmF1bHQsIGFkZCA8c3R5bGU+IHRhZ3MgdG8gdGhlIGJvdHRvbSBvZiB0aGUgdGFyZ2V0XG5cdGlmICghb3B0aW9ucy5pbnNlcnRBdCkgb3B0aW9ucy5pbnNlcnRBdCA9IFwiYm90dG9tXCI7XG5cblx0dmFyIHN0eWxlcyA9IGxpc3RUb1N0eWxlcyhsaXN0LCBvcHRpb25zKTtcblxuXHRhZGRTdHlsZXNUb0RvbShzdHlsZXMsIG9wdGlvbnMpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUgKG5ld0xpc3QpIHtcblx0XHR2YXIgbWF5UmVtb3ZlID0gW107XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGl0ZW0gPSBzdHlsZXNbaV07XG5cdFx0XHR2YXIgZG9tU3R5bGUgPSBzdHlsZXNJbkRvbVtpdGVtLmlkXTtcblxuXHRcdFx0ZG9tU3R5bGUucmVmcy0tO1xuXHRcdFx0bWF5UmVtb3ZlLnB1c2goZG9tU3R5bGUpO1xuXHRcdH1cblxuXHRcdGlmKG5ld0xpc3QpIHtcblx0XHRcdHZhciBuZXdTdHlsZXMgPSBsaXN0VG9TdHlsZXMobmV3TGlzdCwgb3B0aW9ucyk7XG5cdFx0XHRhZGRTdHlsZXNUb0RvbShuZXdTdHlsZXMsIG9wdGlvbnMpO1xuXHRcdH1cblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbWF5UmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgZG9tU3R5bGUgPSBtYXlSZW1vdmVbaV07XG5cblx0XHRcdGlmKGRvbVN0eWxlLnJlZnMgPT09IDApIHtcblx0XHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBkb21TdHlsZS5wYXJ0cy5sZW5ndGg7IGorKykgZG9tU3R5bGUucGFydHNbal0oKTtcblxuXHRcdFx0XHRkZWxldGUgc3R5bGVzSW5Eb21bZG9tU3R5bGUuaWRdO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn07XG5cbmZ1bmN0aW9uIGFkZFN0eWxlc1RvRG9tIChzdHlsZXMsIG9wdGlvbnMpIHtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgaXRlbSA9IHN0eWxlc1tpXTtcblx0XHR2YXIgZG9tU3R5bGUgPSBzdHlsZXNJbkRvbVtpdGVtLmlkXTtcblxuXHRcdGlmKGRvbVN0eWxlKSB7XG5cdFx0XHRkb21TdHlsZS5yZWZzKys7XG5cblx0XHRcdGZvcih2YXIgaiA9IDA7IGogPCBkb21TdHlsZS5wYXJ0cy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRkb21TdHlsZS5wYXJ0c1tqXShpdGVtLnBhcnRzW2pdKTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yKDsgaiA8IGl0ZW0ucGFydHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0ZG9tU3R5bGUucGFydHMucHVzaChhZGRTdHlsZShpdGVtLnBhcnRzW2pdLCBvcHRpb25zKSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciBwYXJ0cyA9IFtdO1xuXG5cdFx0XHRmb3IodmFyIGogPSAwOyBqIDwgaXRlbS5wYXJ0cy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRwYXJ0cy5wdXNoKGFkZFN0eWxlKGl0ZW0ucGFydHNbal0sIG9wdGlvbnMpKTtcblx0XHRcdH1cblxuXHRcdFx0c3R5bGVzSW5Eb21baXRlbS5pZF0gPSB7aWQ6IGl0ZW0uaWQsIHJlZnM6IDEsIHBhcnRzOiBwYXJ0c307XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGxpc3RUb1N0eWxlcyAobGlzdCwgb3B0aW9ucykge1xuXHR2YXIgc3R5bGVzID0gW107XG5cdHZhciBuZXdTdHlsZXMgPSB7fTtcblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgaXRlbSA9IGxpc3RbaV07XG5cdFx0dmFyIGlkID0gb3B0aW9ucy5iYXNlID8gaXRlbVswXSArIG9wdGlvbnMuYmFzZSA6IGl0ZW1bMF07XG5cdFx0dmFyIGNzcyA9IGl0ZW1bMV07XG5cdFx0dmFyIG1lZGlhID0gaXRlbVsyXTtcblx0XHR2YXIgc291cmNlTWFwID0gaXRlbVszXTtcblx0XHR2YXIgcGFydCA9IHtjc3M6IGNzcywgbWVkaWE6IG1lZGlhLCBzb3VyY2VNYXA6IHNvdXJjZU1hcH07XG5cblx0XHRpZighbmV3U3R5bGVzW2lkXSkgc3R5bGVzLnB1c2gobmV3U3R5bGVzW2lkXSA9IHtpZDogaWQsIHBhcnRzOiBbcGFydF19KTtcblx0XHRlbHNlIG5ld1N0eWxlc1tpZF0ucGFydHMucHVzaChwYXJ0KTtcblx0fVxuXG5cdHJldHVybiBzdHlsZXM7XG59XG5cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudCAob3B0aW9ucywgc3R5bGUpIHtcblx0dmFyIHRhcmdldCA9IGdldEVsZW1lbnQob3B0aW9ucy5pbnNlcnRJbnRvKVxuXG5cdGlmICghdGFyZ2V0KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnRJbnRvJyBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cIik7XG5cdH1cblxuXHR2YXIgbGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3AgPSBzdHlsZXNJbnNlcnRlZEF0VG9wW3N0eWxlc0luc2VydGVkQXRUb3AubGVuZ3RoIC0gMV07XG5cblx0aWYgKG9wdGlvbnMuaW5zZXJ0QXQgPT09IFwidG9wXCIpIHtcblx0XHRpZiAoIWxhc3RTdHlsZUVsZW1lbnRJbnNlcnRlZEF0VG9wKSB7XG5cdFx0XHR0YXJnZXQuaW5zZXJ0QmVmb3JlKHN0eWxlLCB0YXJnZXQuZmlyc3RDaGlsZCk7XG5cdFx0fSBlbHNlIGlmIChsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcC5uZXh0U2libGluZykge1xuXHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZShzdHlsZSwgbGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3AubmV4dFNpYmxpbmcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuXHRcdH1cblx0XHRzdHlsZXNJbnNlcnRlZEF0VG9wLnB1c2goc3R5bGUpO1xuXHR9IGVsc2UgaWYgKG9wdGlvbnMuaW5zZXJ0QXQgPT09IFwiYm90dG9tXCIpIHtcblx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLmluc2VydEF0ID09PSBcIm9iamVjdFwiICYmIG9wdGlvbnMuaW5zZXJ0QXQuYmVmb3JlKSB7XG5cdFx0dmFyIG5leHRTaWJsaW5nID0gZ2V0RWxlbWVudChvcHRpb25zLmluc2VydEF0LmJlZm9yZSwgdGFyZ2V0KTtcblx0XHR0YXJnZXQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBuZXh0U2libGluZyk7XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiW1N0eWxlIExvYWRlcl1cXG5cXG4gSW52YWxpZCB2YWx1ZSBmb3IgcGFyYW1ldGVyICdpbnNlcnRBdCcgKCdvcHRpb25zLmluc2VydEF0JykgZm91bmQuXFxuIE11c3QgYmUgJ3RvcCcsICdib3R0b20nLCBvciBPYmplY3QuXFxuIChodHRwczovL2dpdGh1Yi5jb20vd2VicGFjay1jb250cmliL3N0eWxlLWxvYWRlciNpbnNlcnRhdClcXG5cIik7XG5cdH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50IChzdHlsZSkge1xuXHRpZiAoc3R5bGUucGFyZW50Tm9kZSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXHRzdHlsZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlKTtcblxuXHR2YXIgaWR4ID0gc3R5bGVzSW5zZXJ0ZWRBdFRvcC5pbmRleE9mKHN0eWxlKTtcblx0aWYoaWR4ID49IDApIHtcblx0XHRzdHlsZXNJbnNlcnRlZEF0VG9wLnNwbGljZShpZHgsIDEpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0eWxlRWxlbWVudCAob3B0aW9ucykge1xuXHR2YXIgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG5cblx0aWYob3B0aW9ucy5hdHRycy50eXBlID09PSB1bmRlZmluZWQpIHtcblx0XHRvcHRpb25zLmF0dHJzLnR5cGUgPSBcInRleHQvY3NzXCI7XG5cdH1cblxuXHRpZihvcHRpb25zLmF0dHJzLm5vbmNlID09PSB1bmRlZmluZWQpIHtcblx0XHR2YXIgbm9uY2UgPSBnZXROb25jZSgpO1xuXHRcdGlmIChub25jZSkge1xuXHRcdFx0b3B0aW9ucy5hdHRycy5ub25jZSA9IG5vbmNlO1xuXHRcdH1cblx0fVxuXG5cdGFkZEF0dHJzKHN0eWxlLCBvcHRpb25zLmF0dHJzKTtcblx0aW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMsIHN0eWxlKTtcblxuXHRyZXR1cm4gc3R5bGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxpbmtFbGVtZW50IChvcHRpb25zKSB7XG5cdHZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XG5cblx0aWYob3B0aW9ucy5hdHRycy50eXBlID09PSB1bmRlZmluZWQpIHtcblx0XHRvcHRpb25zLmF0dHJzLnR5cGUgPSBcInRleHQvY3NzXCI7XG5cdH1cblx0b3B0aW9ucy5hdHRycy5yZWwgPSBcInN0eWxlc2hlZXRcIjtcblxuXHRhZGRBdHRycyhsaW5rLCBvcHRpb25zLmF0dHJzKTtcblx0aW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMsIGxpbmspO1xuXG5cdHJldHVybiBsaW5rO1xufVxuXG5mdW5jdGlvbiBhZGRBdHRycyAoZWwsIGF0dHJzKSB7XG5cdE9iamVjdC5rZXlzKGF0dHJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcblx0XHRlbC5zZXRBdHRyaWJ1dGUoa2V5LCBhdHRyc1trZXldKTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIGdldE5vbmNlKCkge1xuXHRpZiAodHlwZW9mIF9fd2VicGFja19ub25jZV9fID09PSAndW5kZWZpbmVkJykge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0cmV0dXJuIF9fd2VicGFja19ub25jZV9fO1xufVxuXG5mdW5jdGlvbiBhZGRTdHlsZSAob2JqLCBvcHRpb25zKSB7XG5cdHZhciBzdHlsZSwgdXBkYXRlLCByZW1vdmUsIHJlc3VsdDtcblxuXHQvLyBJZiBhIHRyYW5zZm9ybSBmdW5jdGlvbiB3YXMgZGVmaW5lZCwgcnVuIGl0IG9uIHRoZSBjc3Ncblx0aWYgKG9wdGlvbnMudHJhbnNmb3JtICYmIG9iai5jc3MpIHtcblx0ICAgIHJlc3VsdCA9IHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJ1xuXHRcdCA/IG9wdGlvbnMudHJhbnNmb3JtKG9iai5jc3MpIFxuXHRcdCA6IG9wdGlvbnMudHJhbnNmb3JtLmRlZmF1bHQob2JqLmNzcyk7XG5cblx0ICAgIGlmIChyZXN1bHQpIHtcblx0ICAgIFx0Ly8gSWYgdHJhbnNmb3JtIHJldHVybnMgYSB2YWx1ZSwgdXNlIHRoYXQgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwgY3NzLlxuXHQgICAgXHQvLyBUaGlzIGFsbG93cyBydW5uaW5nIHJ1bnRpbWUgdHJhbnNmb3JtYXRpb25zIG9uIHRoZSBjc3MuXG5cdCAgICBcdG9iai5jc3MgPSByZXN1bHQ7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgXHQvLyBJZiB0aGUgdHJhbnNmb3JtIGZ1bmN0aW9uIHJldHVybnMgYSBmYWxzeSB2YWx1ZSwgZG9uJ3QgYWRkIHRoaXMgY3NzLlxuXHQgICAgXHQvLyBUaGlzIGFsbG93cyBjb25kaXRpb25hbCBsb2FkaW5nIG9mIGNzc1xuXHQgICAgXHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdCAgICBcdFx0Ly8gbm9vcFxuXHQgICAgXHR9O1xuXHQgICAgfVxuXHR9XG5cblx0aWYgKG9wdGlvbnMuc2luZ2xldG9uKSB7XG5cdFx0dmFyIHN0eWxlSW5kZXggPSBzaW5nbGV0b25Db3VudGVyKys7XG5cblx0XHRzdHlsZSA9IHNpbmdsZXRvbiB8fCAoc2luZ2xldG9uID0gY3JlYXRlU3R5bGVFbGVtZW50KG9wdGlvbnMpKTtcblxuXHRcdHVwZGF0ZSA9IGFwcGx5VG9TaW5nbGV0b25UYWcuYmluZChudWxsLCBzdHlsZSwgc3R5bGVJbmRleCwgZmFsc2UpO1xuXHRcdHJlbW92ZSA9IGFwcGx5VG9TaW5nbGV0b25UYWcuYmluZChudWxsLCBzdHlsZSwgc3R5bGVJbmRleCwgdHJ1ZSk7XG5cblx0fSBlbHNlIGlmIChcblx0XHRvYmouc291cmNlTWFwICYmXG5cdFx0dHlwZW9mIFVSTCA9PT0gXCJmdW5jdGlvblwiICYmXG5cdFx0dHlwZW9mIFVSTC5jcmVhdGVPYmplY3RVUkwgPT09IFwiZnVuY3Rpb25cIiAmJlxuXHRcdHR5cGVvZiBVUkwucmV2b2tlT2JqZWN0VVJMID09PSBcImZ1bmN0aW9uXCIgJiZcblx0XHR0eXBlb2YgQmxvYiA9PT0gXCJmdW5jdGlvblwiICYmXG5cdFx0dHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0XHRzdHlsZSA9IGNyZWF0ZUxpbmtFbGVtZW50KG9wdGlvbnMpO1xuXHRcdHVwZGF0ZSA9IHVwZGF0ZUxpbmsuYmluZChudWxsLCBzdHlsZSwgb3B0aW9ucyk7XG5cdFx0cmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlKTtcblxuXHRcdFx0aWYoc3R5bGUuaHJlZikgVVJMLnJldm9rZU9iamVjdFVSTChzdHlsZS5ocmVmKTtcblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdHN0eWxlID0gY3JlYXRlU3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuXHRcdHVwZGF0ZSA9IGFwcGx5VG9UYWcuYmluZChudWxsLCBzdHlsZSk7XG5cdFx0cmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlKTtcblx0XHR9O1xuXHR9XG5cblx0dXBkYXRlKG9iaik7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZVN0eWxlIChuZXdPYmopIHtcblx0XHRpZiAobmV3T2JqKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdG5ld09iai5jc3MgPT09IG9iai5jc3MgJiZcblx0XHRcdFx0bmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiZcblx0XHRcdFx0bmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcFxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dXBkYXRlKG9iaiA9IG5ld09iaik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlbW92ZSgpO1xuXHRcdH1cblx0fTtcbn1cblxudmFyIHJlcGxhY2VUZXh0ID0gKGZ1bmN0aW9uICgpIHtcblx0dmFyIHRleHRTdG9yZSA9IFtdO1xuXG5cdHJldHVybiBmdW5jdGlvbiAoaW5kZXgsIHJlcGxhY2VtZW50KSB7XG5cdFx0dGV4dFN0b3JlW2luZGV4XSA9IHJlcGxhY2VtZW50O1xuXG5cdFx0cmV0dXJuIHRleHRTdG9yZS5maWx0ZXIoQm9vbGVhbikuam9pbignXFxuJyk7XG5cdH07XG59KSgpO1xuXG5mdW5jdGlvbiBhcHBseVRvU2luZ2xldG9uVGFnIChzdHlsZSwgaW5kZXgsIHJlbW92ZSwgb2JqKSB7XG5cdHZhciBjc3MgPSByZW1vdmUgPyBcIlwiIDogb2JqLmNzcztcblxuXHRpZiAoc3R5bGUuc3R5bGVTaGVldCkge1xuXHRcdHN0eWxlLnN0eWxlU2hlZXQuY3NzVGV4dCA9IHJlcGxhY2VUZXh0KGluZGV4LCBjc3MpO1xuXHR9IGVsc2Uge1xuXHRcdHZhciBjc3NOb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKTtcblx0XHR2YXIgY2hpbGROb2RlcyA9IHN0eWxlLmNoaWxkTm9kZXM7XG5cblx0XHRpZiAoY2hpbGROb2Rlc1tpbmRleF0pIHN0eWxlLnJlbW92ZUNoaWxkKGNoaWxkTm9kZXNbaW5kZXhdKTtcblxuXHRcdGlmIChjaGlsZE5vZGVzLmxlbmd0aCkge1xuXHRcdFx0c3R5bGUuaW5zZXJ0QmVmb3JlKGNzc05vZGUsIGNoaWxkTm9kZXNbaW5kZXhdKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3R5bGUuYXBwZW5kQ2hpbGQoY3NzTm9kZSk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGFwcGx5VG9UYWcgKHN0eWxlLCBvYmopIHtcblx0dmFyIGNzcyA9IG9iai5jc3M7XG5cdHZhciBtZWRpYSA9IG9iai5tZWRpYTtcblxuXHRpZihtZWRpYSkge1xuXHRcdHN0eWxlLnNldEF0dHJpYnV0ZShcIm1lZGlhXCIsIG1lZGlhKVxuXHR9XG5cblx0aWYoc3R5bGUuc3R5bGVTaGVldCkge1xuXHRcdHN0eWxlLnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcblx0fSBlbHNlIHtcblx0XHR3aGlsZShzdHlsZS5maXJzdENoaWxkKSB7XG5cdFx0XHRzdHlsZS5yZW1vdmVDaGlsZChzdHlsZS5maXJzdENoaWxkKTtcblx0XHR9XG5cblx0XHRzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcblx0fVxufVxuXG5mdW5jdGlvbiB1cGRhdGVMaW5rIChsaW5rLCBvcHRpb25zLCBvYmopIHtcblx0dmFyIGNzcyA9IG9iai5jc3M7XG5cdHZhciBzb3VyY2VNYXAgPSBvYmouc291cmNlTWFwO1xuXG5cdC8qXG5cdFx0SWYgY29udmVydFRvQWJzb2x1dGVVcmxzIGlzbid0IGRlZmluZWQsIGJ1dCBzb3VyY2VtYXBzIGFyZSBlbmFibGVkXG5cdFx0YW5kIHRoZXJlIGlzIG5vIHB1YmxpY1BhdGggZGVmaW5lZCB0aGVuIGxldHMgdHVybiBjb252ZXJ0VG9BYnNvbHV0ZVVybHNcblx0XHRvbiBieSBkZWZhdWx0LiAgT3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIGNvbnZlcnRUb0Fic29sdXRlVXJscyBvcHRpb25cblx0XHRkaXJlY3RseVxuXHQqL1xuXHR2YXIgYXV0b0ZpeFVybHMgPSBvcHRpb25zLmNvbnZlcnRUb0Fic29sdXRlVXJscyA9PT0gdW5kZWZpbmVkICYmIHNvdXJjZU1hcDtcblxuXHRpZiAob3B0aW9ucy5jb252ZXJ0VG9BYnNvbHV0ZVVybHMgfHwgYXV0b0ZpeFVybHMpIHtcblx0XHRjc3MgPSBmaXhVcmxzKGNzcyk7XG5cdH1cblxuXHRpZiAoc291cmNlTWFwKSB7XG5cdFx0Ly8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjY2MDM4NzVcblx0XHRjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiICsgYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSArIFwiICovXCI7XG5cdH1cblxuXHR2YXIgYmxvYiA9IG5ldyBCbG9iKFtjc3NdLCB7IHR5cGU6IFwidGV4dC9jc3NcIiB9KTtcblxuXHR2YXIgb2xkU3JjID0gbGluay5ocmVmO1xuXG5cdGxpbmsuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG5cblx0aWYob2xkU3JjKSBVUkwucmV2b2tlT2JqZWN0VVJMKG9sZFNyYyk7XG59XG4iLCJcbi8qKlxuICogV2hlbiBzb3VyY2UgbWFwcyBhcmUgZW5hYmxlZCwgYHN0eWxlLWxvYWRlcmAgdXNlcyBhIGxpbmsgZWxlbWVudCB3aXRoIGEgZGF0YS11cmkgdG9cbiAqIGVtYmVkIHRoZSBjc3Mgb24gdGhlIHBhZ2UuIFRoaXMgYnJlYWtzIGFsbCByZWxhdGl2ZSB1cmxzIGJlY2F1c2Ugbm93IHRoZXkgYXJlIHJlbGF0aXZlIHRvIGFcbiAqIGJ1bmRsZSBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHBhZ2UuXG4gKlxuICogT25lIHNvbHV0aW9uIGlzIHRvIG9ubHkgdXNlIGZ1bGwgdXJscywgYnV0IHRoYXQgbWF5IGJlIGltcG9zc2libGUuXG4gKlxuICogSW5zdGVhZCwgdGhpcyBmdW5jdGlvbiBcImZpeGVzXCIgdGhlIHJlbGF0aXZlIHVybHMgdG8gYmUgYWJzb2x1dGUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHBhZ2UgbG9jYXRpb24uXG4gKlxuICogQSBydWRpbWVudGFyeSB0ZXN0IHN1aXRlIGlzIGxvY2F0ZWQgYXQgYHRlc3QvZml4VXJscy5qc2AgYW5kIGNhbiBiZSBydW4gdmlhIHRoZSBgbnBtIHRlc3RgIGNvbW1hbmQuXG4gKlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzcykge1xuICAvLyBnZXQgY3VycmVudCBsb2NhdGlvblxuICB2YXIgbG9jYXRpb24gPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5sb2NhdGlvbjtcblxuICBpZiAoIWxvY2F0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiZml4VXJscyByZXF1aXJlcyB3aW5kb3cubG9jYXRpb25cIik7XG4gIH1cblxuXHQvLyBibGFuayBvciBudWxsP1xuXHRpZiAoIWNzcyB8fCB0eXBlb2YgY3NzICE9PSBcInN0cmluZ1wiKSB7XG5cdCAgcmV0dXJuIGNzcztcbiAgfVxuXG4gIHZhciBiYXNlVXJsID0gbG9jYXRpb24ucHJvdG9jb2wgKyBcIi8vXCIgKyBsb2NhdGlvbi5ob3N0O1xuICB2YXIgY3VycmVudERpciA9IGJhc2VVcmwgKyBsb2NhdGlvbi5wYXRobmFtZS5yZXBsYWNlKC9cXC9bXlxcL10qJC8sIFwiL1wiKTtcblxuXHQvLyBjb252ZXJ0IGVhY2ggdXJsKC4uLilcblx0Lypcblx0VGhpcyByZWd1bGFyIGV4cHJlc3Npb24gaXMganVzdCBhIHdheSB0byByZWN1cnNpdmVseSBtYXRjaCBicmFja2V0cyB3aXRoaW5cblx0YSBzdHJpbmcuXG5cblx0IC91cmxcXHMqXFwoICA9IE1hdGNoIG9uIHRoZSB3b3JkIFwidXJsXCIgd2l0aCBhbnkgd2hpdGVzcGFjZSBhZnRlciBpdCBhbmQgdGhlbiBhIHBhcmVuc1xuXHQgICAoICA9IFN0YXJ0IGEgY2FwdHVyaW5nIGdyb3VwXG5cdCAgICAgKD86ICA9IFN0YXJ0IGEgbm9uLWNhcHR1cmluZyBncm91cFxuXHQgICAgICAgICBbXikoXSAgPSBNYXRjaCBhbnl0aGluZyB0aGF0IGlzbid0IGEgcGFyZW50aGVzZXNcblx0ICAgICAgICAgfCAgPSBPUlxuXHQgICAgICAgICBcXCggID0gTWF0Y2ggYSBzdGFydCBwYXJlbnRoZXNlc1xuXHQgICAgICAgICAgICAgKD86ICA9IFN0YXJ0IGFub3RoZXIgbm9uLWNhcHR1cmluZyBncm91cHNcblx0ICAgICAgICAgICAgICAgICBbXikoXSsgID0gTWF0Y2ggYW55dGhpbmcgdGhhdCBpc24ndCBhIHBhcmVudGhlc2VzXG5cdCAgICAgICAgICAgICAgICAgfCAgPSBPUlxuXHQgICAgICAgICAgICAgICAgIFxcKCAgPSBNYXRjaCBhIHN0YXJ0IHBhcmVudGhlc2VzXG5cdCAgICAgICAgICAgICAgICAgICAgIFteKShdKiAgPSBNYXRjaCBhbnl0aGluZyB0aGF0IGlzbid0IGEgcGFyZW50aGVzZXNcblx0ICAgICAgICAgICAgICAgICBcXCkgID0gTWF0Y2ggYSBlbmQgcGFyZW50aGVzZXNcblx0ICAgICAgICAgICAgICkgID0gRW5kIEdyb3VwXG4gICAgICAgICAgICAgICpcXCkgPSBNYXRjaCBhbnl0aGluZyBhbmQgdGhlbiBhIGNsb3NlIHBhcmVuc1xuICAgICAgICAgICkgID0gQ2xvc2Ugbm9uLWNhcHR1cmluZyBncm91cFxuICAgICAgICAgICogID0gTWF0Y2ggYW55dGhpbmdcbiAgICAgICApICA9IENsb3NlIGNhcHR1cmluZyBncm91cFxuXHQgXFwpICA9IE1hdGNoIGEgY2xvc2UgcGFyZW5zXG5cblx0IC9naSAgPSBHZXQgYWxsIG1hdGNoZXMsIG5vdCB0aGUgZmlyc3QuICBCZSBjYXNlIGluc2Vuc2l0aXZlLlxuXHQgKi9cblx0dmFyIGZpeGVkQ3NzID0gY3NzLnJlcGxhY2UoL3VybFxccypcXCgoKD86W14pKF18XFwoKD86W14pKF0rfFxcKFteKShdKlxcKSkqXFwpKSopXFwpL2dpLCBmdW5jdGlvbihmdWxsTWF0Y2gsIG9yaWdVcmwpIHtcblx0XHQvLyBzdHJpcCBxdW90ZXMgKGlmIHRoZXkgZXhpc3QpXG5cdFx0dmFyIHVucXVvdGVkT3JpZ1VybCA9IG9yaWdVcmxcblx0XHRcdC50cmltKClcblx0XHRcdC5yZXBsYWNlKC9eXCIoLiopXCIkLywgZnVuY3Rpb24obywgJDEpeyByZXR1cm4gJDE7IH0pXG5cdFx0XHQucmVwbGFjZSgvXicoLiopJyQvLCBmdW5jdGlvbihvLCAkMSl7IHJldHVybiAkMTsgfSk7XG5cblx0XHQvLyBhbHJlYWR5IGEgZnVsbCB1cmw/IG5vIGNoYW5nZVxuXHRcdGlmICgvXigjfGRhdGE6fGh0dHA6XFwvXFwvfGh0dHBzOlxcL1xcL3xmaWxlOlxcL1xcL1xcL3xcXHMqJCkvaS50ZXN0KHVucXVvdGVkT3JpZ1VybCkpIHtcblx0XHQgIHJldHVybiBmdWxsTWF0Y2g7XG5cdFx0fVxuXG5cdFx0Ly8gY29udmVydCB0aGUgdXJsIHRvIGEgZnVsbCB1cmxcblx0XHR2YXIgbmV3VXJsO1xuXG5cdFx0aWYgKHVucXVvdGVkT3JpZ1VybC5pbmRleE9mKFwiLy9cIikgPT09IDApIHtcblx0XHQgIFx0Ly9UT0RPOiBzaG91bGQgd2UgYWRkIHByb3RvY29sP1xuXHRcdFx0bmV3VXJsID0gdW5xdW90ZWRPcmlnVXJsO1xuXHRcdH0gZWxzZSBpZiAodW5xdW90ZWRPcmlnVXJsLmluZGV4T2YoXCIvXCIpID09PSAwKSB7XG5cdFx0XHQvLyBwYXRoIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgYmFzZSB1cmxcblx0XHRcdG5ld1VybCA9IGJhc2VVcmwgKyB1bnF1b3RlZE9yaWdVcmw7IC8vIGFscmVhZHkgc3RhcnRzIHdpdGggJy8nXG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHBhdGggc2hvdWxkIGJlIHJlbGF0aXZlIHRvIGN1cnJlbnQgZGlyZWN0b3J5XG5cdFx0XHRuZXdVcmwgPSBjdXJyZW50RGlyICsgdW5xdW90ZWRPcmlnVXJsLnJlcGxhY2UoL15cXC5cXC8vLCBcIlwiKTsgLy8gU3RyaXAgbGVhZGluZyAnLi8nXG5cdFx0fVxuXG5cdFx0Ly8gc2VuZCBiYWNrIHRoZSBmaXhlZCB1cmwoLi4uKVxuXHRcdHJldHVybiBcInVybChcIiArIEpTT04uc3RyaW5naWZ5KG5ld1VybCkgKyBcIilcIjtcblx0fSk7XG5cblx0Ly8gc2VuZCBiYWNrIHRoZSBmaXhlZCBjc3Ncblx0cmV0dXJuIGZpeGVkQ3NzO1xufTtcbiIsIiFmdW5jdGlvbih0LGUpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPWUoKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLGUpOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuVG9uZT1lKCk6dC5Ub25lPWUoKX0oXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIGkobil7aWYoZVtuXSlyZXR1cm4gZVtuXS5leHBvcnRzO3ZhciBvPWVbbl09e2k6bixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W25dLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLGkpLG8ubD0hMCxvLmV4cG9ydHN9cmV0dXJuIGkubT10LGkuYz1lLGkuZD1mdW5jdGlvbih0LGUsbil7aS5vKHQsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLGdldDpufSl9LGkucj1mdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0saS5uPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiB0LmRlZmF1bHR9OmZ1bmN0aW9uKCl7cmV0dXJuIHR9O3JldHVybiBpLmQoZSxcImFcIixlKSxlfSxpLm89ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9LGkucD1cIlwiLGkoaS5zPTE1NSl9KFtmdW5jdGlvbih0LGUsaSl7KGZ1bmN0aW9uKG4pe3ZhciBvLHM7XG4vKipcbiAqICBUb25lLmpzXG4gKiAgQGF1dGhvciBZb3RhbSBNYW5uXG4gKiAgQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQgTGljZW5zZVxuICogIEBjb3B5cmlnaHQgMjAxNC0yMDE5IFlvdGFtIE1hbm5cbiAqL289W2koMTUzKV0sdm9pZCAwPT09KHM9ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGU9ZnVuY3Rpb24oKXtpZighKHRoaXMgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgRXJyb3IoXCJjb25zdHJ1Y3RvciBuZWVkcyB0byBiZSBjYWxsZWQgd2l0aCB0aGUgJ25ldycga2V5d29yZFwiKX07cmV0dXJuIGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIGUpe3ZhciBpPXRbMF0ubWF0Y2goL15bQS1aXSQvKSxuPWVbdF09PT10aGlzLmNvbnN0cnVjdG9yO2lmKGUuaXNGdW5jdGlvbihlW3RdKSYmaSYmbilyZXR1cm4gdH1yZXR1cm5cIlRvbmVcIn0sZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxlLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxpLG4pe2lmKGUuaXNPYmplY3QodCkpbj1pO2Vsc2UgaWYoZS5pc1N0cmluZyh0KSl7dmFyIG89e307b1t0XT1pLHQ9b310OmZvcih2YXIgcyBpbiB0KXtpPXRbc107dmFyIHI9dGhpcztpZigtMSE9PXMuaW5kZXhPZihcIi5cIikpe2Zvcih2YXIgYT1zLnNwbGl0KFwiLlwiKSxsPTA7bDxhLmxlbmd0aC0xO2wrKylpZigocj1yW2FbbF1dKWluc3RhbmNlb2YgZSl7YS5zcGxpY2UoMCxsKzEpO3ZhciBoPWEuam9pbihcIi5cIik7ci5zZXQoaCxpKTtjb250aW51ZSB0fXM9YVthLmxlbmd0aC0xXX12YXIgdT1yW3NdO2UuaXNVbmRlZih1KXx8KGUuU2lnbmFsJiZ1IGluc3RhbmNlb2YgZS5TaWduYWx8fGUuUGFyYW0mJnUgaW5zdGFuY2VvZiBlLlBhcmFtP3UudmFsdWUhPT1pJiYoZS5pc1VuZGVmKG4pP3UudmFsdWU9aTp1LnJhbXBUbyhpLG4pKTp1IGluc3RhbmNlb2YgQXVkaW9QYXJhbT91LnZhbHVlIT09aSYmKHUudmFsdWU9aSk6ZS5UaW1lQmFzZSYmdSBpbnN0YW5jZW9mIGUuVGltZUJhc2U/cltzXT1pOnUgaW5zdGFuY2VvZiBlP3Uuc2V0KGkpOnUhPT1pJiYocltzXT1pKSl9cmV0dXJuIHRoaXN9LGUucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtlLmlzVW5kZWYodCk/dD10aGlzLl9jb2xsZWN0RGVmYXVsdHModGhpcy5jb25zdHJ1Y3Rvcik6ZS5pc1N0cmluZyh0KSYmKHQ9W3RdKTtmb3IodmFyIGk9e30sbj0wO248dC5sZW5ndGg7bisrKXt2YXIgbz10W25dLHM9dGhpcyxyPWk7aWYoLTEhPT1vLmluZGV4T2YoXCIuXCIpKXtmb3IodmFyIGE9by5zcGxpdChcIi5cIiksbD0wO2w8YS5sZW5ndGgtMTtsKyspe3ZhciBoPWFbbF07cltoXT1yW2hdfHx7fSxyPXJbaF0scz1zW2hdfW89YVthLmxlbmd0aC0xXX12YXIgdT1zW29dO2UuaXNPYmplY3QodFtvXSk/cltvXT11LmdldCgpOmUuU2lnbmFsJiZ1IGluc3RhbmNlb2YgZS5TaWduYWw/cltvXT11LnZhbHVlOmUuUGFyYW0mJnUgaW5zdGFuY2VvZiBlLlBhcmFtP3Jbb109dS52YWx1ZTp1IGluc3RhbmNlb2YgQXVkaW9QYXJhbT9yW29dPXUudmFsdWU6dSBpbnN0YW5jZW9mIGU/cltvXT11LmdldCgpOiFlLmlzRnVuY3Rpb24odSkmJmUuaXNEZWZpbmVkKHUpJiYocltvXT11KX1yZXR1cm4gaX0sZS5wcm90b3R5cGUuX2NvbGxlY3REZWZhdWx0cz1mdW5jdGlvbih0KXt2YXIgaT1bXTtpZihlLmlzRGVmaW5lZCh0LmRlZmF1bHRzKSYmKGk9T2JqZWN0LmtleXModC5kZWZhdWx0cykpLGUuaXNEZWZpbmVkKHQuX3N1cGVyKSlmb3IodmFyIG49dGhpcy5fY29sbGVjdERlZmF1bHRzKHQuX3N1cGVyKSxvPTA7bzxuLmxlbmd0aDtvKyspLTE9PT1pLmluZGV4T2YobltvXSkmJmkucHVzaChuW29dKTtyZXR1cm4gaX0sZS5kZWZhdWx0cz1mdW5jdGlvbih0LGksbil7dmFyIG89e307aWYoMT09PXQubGVuZ3RoJiZlLmlzT2JqZWN0KHRbMF0pKW89dFswXTtlbHNlIGZvcih2YXIgcz0wO3M8aS5sZW5ndGg7cysrKW9baVtzXV09dFtzXTtyZXR1cm4gZS5pc0RlZmluZWQobi5kZWZhdWx0cyk/ZS5kZWZhdWx0QXJnKG8sbi5kZWZhdWx0cyk6ZS5pc09iamVjdChuKT9lLmRlZmF1bHRBcmcobyxuKTpvfSxlLmRlZmF1bHRBcmc9ZnVuY3Rpb24odCxpKXtpZihlLmlzT2JqZWN0KHQpJiZlLmlzT2JqZWN0KGkpKXt2YXIgbj17fTtmb3IodmFyIG8gaW4gdCluW29dPWUuZGVmYXVsdEFyZyhpW29dLHRbb10pO2Zvcih2YXIgcyBpbiBpKW5bc109ZS5kZWZhdWx0QXJnKHRbc10saVtzXSk7cmV0dXJuIG59cmV0dXJuIGUuaXNVbmRlZih0KT9pOnR9LGUucHJvdG90eXBlLmxvZz1mdW5jdGlvbigpe2lmKHRoaXMuZGVidWd8fHRoaXMudG9TdHJpbmcoKT09PWUuZ2xvYmFsLlRPTkVfREVCVUdfQ0xBU1Mpe3ZhciB0PUFycmF5LmZyb20oYXJndW1lbnRzKTt0LnVuc2hpZnQodGhpcy50b1N0cmluZygpK1wiOlwiKSxjb25zb2xlLmxvZy5hcHBseSh2b2lkIDAsdCl9fSxlLnByb3RvdHlwZS5hc3NlcnQ9ZnVuY3Rpb24odCxlKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoZSl9LGUuY29ubmVjdFNlcmllcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHNbMF0saT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBuPWFyZ3VtZW50c1tpXTt0LmNvbm5lY3QobiksdD1ufXJldHVybiBlfSxlLmlzVW5kZWY9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXR9LGUuaXNEZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiFlLmlzVW5kZWYodCl9LGUuaXNGdW5jdGlvbj1mdW5jdGlvbih0KXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0fSxlLmlzTnVtYmVyPWZ1bmN0aW9uKHQpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiB0fSxlLmlzT2JqZWN0PWZ1bmN0aW9uKHQpe3JldHVyblwiW29iamVjdCBPYmplY3RdXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkmJnQuY29uc3RydWN0b3I9PT1PYmplY3R9LGUuaXNCb29sZWFuPWZ1bmN0aW9uKHQpe3JldHVyblwiYm9vbGVhblwiPT10eXBlb2YgdH0sZS5pc0FycmF5PWZ1bmN0aW9uKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpfSxlLmlzU3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiB0fSxlLmlzTm90ZT1mdW5jdGlvbih0KXtyZXR1cm4gZS5pc1N0cmluZyh0KSYmL14oW2EtZ117MX0oPzpifCN8eHxiYik/KSgtP1swLTldKykvaS50ZXN0KHQpfSxlLm5vT3A9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLl9yZWFkT25seT1mdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHQpKWZvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKXRoaXMuX3JlYWRPbmx5KHRbZV0pO2Vsc2UgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsdCx7d3JpdGFibGU6ITEsZW51bWVyYWJsZTohMH0pfSxlLnByb3RvdHlwZS5fd3JpdGFibGU9ZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKyl0aGlzLl93cml0YWJsZSh0W2VdKTtlbHNlIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHQse3dyaXRhYmxlOiEwfSl9LGUuU3RhdGU9e1N0YXJ0ZWQ6XCJzdGFydGVkXCIsU3RvcHBlZDpcInN0b3BwZWRcIixQYXVzZWQ6XCJwYXVzZWRcIn0sZS5nbG9iYWw9ZS5pc1VuZGVmKG4pP3dpbmRvdzpuLGUuZXF1YWxQb3dlclNjYWxlPWZ1bmN0aW9uKHQpe3ZhciBlPS41Kk1hdGguUEk7cmV0dXJuIE1hdGguc2luKHQqZSl9LGUuZGJUb0dhaW49ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KDEwLHQvMjApfSxlLmdhaW5Ub0RiPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmxvZyh0KS9NYXRoLkxOMTAqMjB9LGUuaW50ZXJ2YWxUb0ZyZXF1ZW5jeVJhdGlvPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdygyLHQvMTIpfSxlLnByb3RvdHlwZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gZS5jb250ZXh0Lm5vdygpfSxlLm5vdz1mdW5jdGlvbigpe3JldHVybiBlLmNvbnRleHQubm93KCl9LGUucHJvdG90eXBlLmltbWVkaWF0ZT1mdW5jdGlvbigpe3JldHVybiBlLmNvbnRleHQuY3VycmVudFRpbWV9LGUuaW1tZWRpYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIGUuY29udGV4dC5jdXJyZW50VGltZX0sZS5leHRlbmQ9ZnVuY3Rpb24odCxpKXtmdW5jdGlvbiBuKCl7fWUuaXNVbmRlZihpKSYmKGk9ZSksbi5wcm90b3R5cGU9aS5wcm90b3R5cGUsdC5wcm90b3R5cGU9bmV3IG4sdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dCx0Ll9zdXBlcj1pfSxlLl9hdWRpb0NvbnRleHQ9bnVsbCxlLnN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIGUuY29udGV4dC5yZXN1bWUoKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJjb250ZXh0XCIse2dldDpmdW5jdGlvbigpe3JldHVybiBlLl9hdWRpb0NvbnRleHR9LHNldDpmdW5jdGlvbih0KXt0LmlzQ29udGV4dD9lLl9hdWRpb0NvbnRleHQ9dDplLl9hdWRpb0NvbnRleHQ9bmV3IGUuQ29udGV4dCh0KSxlLkNvbnRleHQuZW1pdChcImluaXRcIixlLl9hdWRpb0NvbnRleHQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImNvbnRleHRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGUuY29udGV4dH19KSxlLnNldENvbnRleHQ9ZnVuY3Rpb24odCl7ZS5jb250ZXh0PXR9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImJsb2NrVGltZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMTI4L3RoaXMuY29udGV4dC5zYW1wbGVSYXRlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcInNhbXBsZVRpbWVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDEvdGhpcy5jb250ZXh0LnNhbXBsZVJhdGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzdXBwb3J0ZWRcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9ZS5nbG9iYWwuaGFzT3duUHJvcGVydHkoXCJBdWRpb0NvbnRleHRcIil8fGUuZ2xvYmFsLmhhc093blByb3BlcnR5KFwid2Via2l0QXVkaW9Db250ZXh0XCIpLGk9ZS5nbG9iYWwuaGFzT3duUHJvcGVydHkoXCJQcm9taXNlXCIpO3JldHVybiB0JiZpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiaW5pdGlhbGl6ZWRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4oZS5jb250ZXh0KX19KSxlLmdldENvbnRleHQ9ZnVuY3Rpb24odCl7aWYoZS5pbml0aWFsaXplZCl0KGUuY29udGV4dCk7ZWxzZXt2YXIgaT1mdW5jdGlvbigpe3QoZS5jb250ZXh0KSxlLkNvbnRleHQub2ZmKFwiaW5pdFwiLGkpfTtlLkNvbnRleHQub24oXCJpbml0XCIsaSl9cmV0dXJuIGV9LGUudmVyc2lvbj10LGV9LmFwcGx5KGUsbykpfHwodC5leHBvcnRzPXMpfSkuY2FsbCh0aGlzLGkoMTU0KSl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg3KSxpKDQpLGkoMTQpLGkoOTcpLGkoMyldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlNpZ25hbD1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcInZhbHVlXCIsXCJ1bml0c1wiXSx0LlNpZ25hbCk7dC5QYXJhbS5jYWxsKHRoaXMsZSksdGhpcy5fY29uc3RhbnRTb3VyY2U9dGhpcy5jb250ZXh0LmNyZWF0ZUNvbnN0YW50U291cmNlKCksdGhpcy5fY29uc3RhbnRTb3VyY2Uuc3RhcnQoMCksdGhpcy5fcGFyYW09dGhpcy5fY29uc3RhbnRTb3VyY2Uub2Zmc2V0LHRoaXMudmFsdWU9ZS52YWx1ZSx0aGlzLm91dHB1dD10aGlzLl9jb25zdGFudFNvdXJjZSx0aGlzLmlucHV0PXRoaXMuX3BhcmFtPXRoaXMub3V0cHV0Lm9mZnNldH0sdC5leHRlbmQodC5TaWduYWwsdC5QYXJhbSksdC5TaWduYWwuZGVmYXVsdHM9e3ZhbHVlOjAsdW5pdHM6dC5UeXBlLkRlZmF1bHQsY29udmVydDohMH0sdC5TaWduYWwucHJvdG90eXBlLmNvbm5lY3Q9dC5TaWduYWxCYXNlLnByb3RvdHlwZS5jb25uZWN0LHQuU2lnbmFsLnByb3RvdHlwZS5kaXNjb25uZWN0PXQuU2lnbmFsQmFzZS5wcm90b3R5cGUuZGlzY29ubmVjdCx0LlNpZ25hbC5wcm90b3R5cGUuZ2V0VmFsdWVBdFRpbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3BhcmFtLmdldFZhbHVlQXRUaW1lP3RoaXMuX3BhcmFtLmdldFZhbHVlQXRUaW1lKGUpOnQuUGFyYW0ucHJvdG90eXBlLmdldFZhbHVlQXRUaW1lLmNhbGwodGhpcyxlKX0sdC5TaWduYWwucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5QYXJhbS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX2NvbnN0YW50U291cmNlLmRpc2Nvbm5lY3QoKSx0aGlzLl9jb25zdGFudFNvdXJjZT1udWxsLHRoaXN9LHQuU2lnbmFsfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDIwKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuQXVkaW9Ob2RlPWZ1bmN0aW9uKCl7dC5jYWxsKHRoaXMpO3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcImNvbnRleHRcIl0se2NvbnRleHQ6dC5jb250ZXh0fSk7dGhpcy5fY29udGV4dD1lLmNvbnRleHR9LHQuZXh0ZW5kKHQuQXVkaW9Ob2RlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BdWRpb05vZGUucHJvdG90eXBlLFwiY29udGV4dFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGV4dH19KSx0LkF1ZGlvTm9kZS5wcm90b3R5cGUuY3JlYXRlSW5zT3V0cz1mdW5jdGlvbih0LGUpezE9PT10P3RoaXMuaW5wdXQ9dGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKTp0PjEmJih0aGlzLmlucHV0PW5ldyBBcnJheSh0KSksMT09PWU/dGhpcy5vdXRwdXQ9dGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKTplPjEmJih0aGlzLm91dHB1dD1uZXcgQXJyYXkoZSkpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BdWRpb05vZGUucHJvdG90eXBlLFwiY2hhbm5lbENvdW50XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm91dHB1dC5jaGFubmVsQ291bnR9LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vdXRwdXQuY2hhbm5lbENvdW50PXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQXVkaW9Ob2RlLnByb3RvdHlwZSxcImNoYW5uZWxDb3VudE1vZGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3V0cHV0LmNoYW5uZWxDb3VudE1vZGV9LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vdXRwdXQuY2hhbm5lbENvdW50TW9kZT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkF1ZGlvTm9kZS5wcm90b3R5cGUsXCJjaGFubmVsSW50ZXJwcmV0YXRpb25cIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3V0cHV0LmNoYW5uZWxJbnRlcnByZXRhdGlvbn0sc2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm91dHB1dC5jaGFubmVsSW50ZXJwcmV0YXRpb249dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BdWRpb05vZGUucHJvdG90eXBlLFwibnVtYmVyT2ZJbnB1dHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5wdXQ/dC5pc0FycmF5KHRoaXMuaW5wdXQpP3RoaXMuaW5wdXQubGVuZ3RoOjE6MH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BdWRpb05vZGUucHJvdG90eXBlLFwibnVtYmVyT2ZPdXRwdXRzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm91dHB1dD90LmlzQXJyYXkodGhpcy5vdXRwdXQpP3RoaXMub3V0cHV0Lmxlbmd0aDoxOjB9fSksdC5BdWRpb05vZGUucHJvdG90eXBlLmNvbm5lY3Q9ZnVuY3Rpb24oZSxpLG4pe3JldHVybiB0LmlzQXJyYXkodGhpcy5vdXRwdXQpPyhpPXQuZGVmYXVsdEFyZyhpLDApLHRoaXMub3V0cHV0W2ldLmNvbm5lY3QoZSwwLG4pKTp0aGlzLm91dHB1dC5jb25uZWN0KGUsaSxuKSx0aGlzfSx0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzY29ubmVjdD1mdW5jdGlvbihlLGksbil7dC5pc0FycmF5KHRoaXMub3V0cHV0KT90LmlzTnVtYmVyKGUpP3RoaXMub3V0cHV0W2VdLmRpc2Nvbm5lY3QoKTooaT10LmRlZmF1bHRBcmcoaSwwKSx0aGlzLm91dHB1dFtpXS5kaXNjb25uZWN0KGUsMCxuKSk6dGhpcy5vdXRwdXQuZGlzY29ubmVjdC5hcHBseSh0aGlzLm91dHB1dCxhcmd1bWVudHMpfSx0LkF1ZGlvTm9kZS5wcm90b3R5cGUuY2hhaW49ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIGk9YXJndW1lbnRzW2VdO3QuY29ubmVjdChpKSx0PWl9cmV0dXJuIHRoaXN9LHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5mYW49ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXRoaXMuY29ubmVjdChhcmd1bWVudHNbdF0pO3JldHVybiB0aGlzfSx0Lmdsb2JhbC5BdWRpb05vZGUmJihBdWRpb05vZGUucHJvdG90eXBlLmNoYWluPXQuQXVkaW9Ob2RlLnByb3RvdHlwZS5jaGFpbixBdWRpb05vZGUucHJvdG90eXBlLmZhbj10LkF1ZGlvTm9kZS5wcm90b3R5cGUuZmFuKSx0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LmlzRGVmaW5lZCh0aGlzLmlucHV0KSYmKHRoaXMuaW5wdXQgaW5zdGFuY2VvZiBBdWRpb05vZGUmJnRoaXMuaW5wdXQuZGlzY29ubmVjdCgpLHRoaXMuaW5wdXQ9bnVsbCksdC5pc0RlZmluZWQodGhpcy5vdXRwdXQpJiYodGhpcy5vdXRwdXQgaW5zdGFuY2VvZiBBdWRpb05vZGUmJnRoaXMub3V0cHV0LmRpc2Nvbm5lY3QoKSx0aGlzLm91dHB1dD1udWxsKSx0aGlzLl9jb250ZXh0PW51bGwsdGhpc30sdC5BdWRpb05vZGV9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMTQpLGkoNCksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuR2Fpbj1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcImdhaW5cIixcInVuaXRzXCJdLHQuR2Fpbik7dC5BdWRpb05vZGUuY2FsbCh0aGlzLGUpLHRoaXMuaW5wdXQ9dGhpcy5vdXRwdXQ9dGhpcy5fZ2Fpbk5vZGU9dGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKSx0aGlzLmdhaW49bmV3IHQuUGFyYW0oe3BhcmFtOnRoaXMuX2dhaW5Ob2RlLmdhaW4sdW5pdHM6ZS51bml0cyx2YWx1ZTplLmdhaW4sY29udmVydDplLmNvbnZlcnR9KSx0aGlzLl9yZWFkT25seShcImdhaW5cIil9LHQuZXh0ZW5kKHQuR2Fpbix0LkF1ZGlvTm9kZSksdC5HYWluLmRlZmF1bHRzPXtnYWluOjEsY29udmVydDohMH0sdC5HYWluLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dC5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9nYWluTm9kZS5kaXNjb25uZWN0KCksdGhpcy5fZ2Fpbk5vZGU9bnVsbCx0aGlzLl93cml0YWJsZShcImdhaW5cIiksdGhpcy5nYWluLmRpc3Bvc2UoKSx0aGlzLmdhaW49bnVsbH0sdC5HYWlufS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDY1KSxpKDQ2KSxpKDQ1KSxpKDIwKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuVHlwZT17RGVmYXVsdDpcIm51bWJlclwiLFRpbWU6XCJ0aW1lXCIsRnJlcXVlbmN5OlwiZnJlcXVlbmN5XCIsVHJhbnNwb3J0VGltZTpcInRyYW5zcG9ydFRpbWVcIixUaWNrczpcInRpY2tzXCIsTm9ybWFsUmFuZ2U6XCJub3JtYWxSYW5nZVwiLEF1ZGlvUmFuZ2U6XCJhdWRpb1JhbmdlXCIsRGVjaWJlbHM6XCJkYlwiLEludGVydmFsOlwiaW50ZXJ2YWxcIixCUE06XCJicG1cIixQb3NpdGl2ZTpcInBvc2l0aXZlXCIsR2FpbjpcImdhaW5cIixDZW50czpcImNlbnRzXCIsRGVncmVlczpcImRlZ3JlZXNcIixNSURJOlwibWlkaVwiLEJhcnNCZWF0c1NpeHRlZW50aHM6XCJiYXJzQmVhdHNTaXh0ZWVudGhzXCIsU2FtcGxlczpcInNhbXBsZXNcIixIZXJ0ejpcImhlcnR6XCIsTm90ZTpcIm5vdGVcIixNaWxsaXNlY29uZHM6XCJtaWxsaXNlY29uZHNcIixTZWNvbmRzOlwic2Vjb25kc1wiLE5vdGF0aW9uOlwibm90YXRpb25cIn0sdC5wcm90b3R5cGUudG9TZWNvbmRzPWZ1bmN0aW9uKGUpe3JldHVybiB0LmlzTnVtYmVyKGUpP2U6dC5pc1VuZGVmKGUpP3RoaXMubm93KCk6dC5pc1N0cmluZyhlKXx8dC5pc09iamVjdChlKT9uZXcgdC5UaW1lKGUpLnRvU2Vjb25kcygpOmUgaW5zdGFuY2VvZiB0LlRpbWVCYXNlP2UudG9TZWNvbmRzKCk6dm9pZCAwfSx0LnByb3RvdHlwZS50b0ZyZXF1ZW5jeT1mdW5jdGlvbihlKXtyZXR1cm4gdC5pc051bWJlcihlKT9lOnQuaXNTdHJpbmcoZSl8fHQuaXNVbmRlZihlKXx8dC5pc09iamVjdChlKT9uZXcgdC5GcmVxdWVuY3koZSkudmFsdWVPZigpOmUgaW5zdGFuY2VvZiB0LlRpbWVCYXNlP2UudG9GcmVxdWVuY3koKTp2b2lkIDB9LHQucHJvdG90eXBlLnRvVGlja3M9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuaXNOdW1iZXIoZSl8fHQuaXNTdHJpbmcoZSl8fHQuaXNPYmplY3QoZSk/bmV3IHQuVHJhbnNwb3J0VGltZShlKS50b1RpY2tzKCk6dC5pc1VuZGVmKGUpP3QuVHJhbnNwb3J0LnRpY2tzOmUgaW5zdGFuY2VvZiB0LlRpbWVCYXNlP2UudG9UaWNrcygpOnZvaWQgMH0sdH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxNCksaSgzKSxpKDM2KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuTXVsdGlwbHk9ZnVuY3Rpb24oZSl7dC5TaWduYWwuY2FsbCh0aGlzKSx0aGlzLmNyZWF0ZUluc091dHMoMiwwKSx0aGlzLl9tdWx0PXRoaXMuaW5wdXRbMF09dGhpcy5vdXRwdXQ9bmV3IHQuR2Fpbix0aGlzLl9wYXJhbT10aGlzLmlucHV0WzFdPXRoaXMub3V0cHV0LmdhaW4sdGhpcy52YWx1ZT10LmRlZmF1bHRBcmcoZSwwKSx0aGlzLnByb3h5PSExfSx0LmV4dGVuZCh0Lk11bHRpcGx5LHQuU2lnbmFsKSx0Lk11bHRpcGx5LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU2lnbmFsLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fbXVsdC5kaXNwb3NlKCksdGhpcy5fbXVsdD1udWxsLHRoaXMuX3BhcmFtPW51bGwsdGhpc30sdC5NdWx0aXBseX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxNiksaSgyNyksaSg0MCksaSg0KSxpKDMzKSxpKDEpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlNvdXJjZT1mdW5jdGlvbihlKXtlPXQuZGVmYXVsdEFyZyhlLHQuU291cmNlLmRlZmF1bHRzKSx0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLHRoaXMuX3ZvbHVtZT10aGlzLm91dHB1dD1uZXcgdC5Wb2x1bWUoZS52b2x1bWUpLHRoaXMudm9sdW1lPXRoaXMuX3ZvbHVtZS52b2x1bWUsdGhpcy5fcmVhZE9ubHkoXCJ2b2x1bWVcIiksdGhpcy5fc3RhdGU9bmV3IHQuVGltZWxpbmVTdGF0ZSh0LlN0YXRlLlN0b3BwZWQpLHRoaXMuX3N0YXRlLm1lbW9yeT0xMDAsdGhpcy5fc3luY2VkPSExLHRoaXMuX3NjaGVkdWxlZD1bXSx0aGlzLl92b2x1bWUub3V0cHV0Lm91dHB1dC5jaGFubmVsQ291bnQ9Mix0aGlzLl92b2x1bWUub3V0cHV0Lm91dHB1dC5jaGFubmVsQ291bnRNb2RlPVwiZXhwbGljaXRcIix0aGlzLm11dGU9ZS5tdXRlfSx0LmV4dGVuZCh0LlNvdXJjZSx0LkF1ZGlvTm9kZSksdC5Tb3VyY2UuZGVmYXVsdHM9e3ZvbHVtZTowLG11dGU6ITF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlNvdXJjZS5wcm90b3R5cGUsXCJzdGF0ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3luY2VkP3QuVHJhbnNwb3J0LnN0YXRlPT09dC5TdGF0ZS5TdGFydGVkP3RoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKHQuVHJhbnNwb3J0LnNlY29uZHMpOnQuU3RhdGUuU3RvcHBlZDp0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZSh0aGlzLm5vdygpKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5Tb3VyY2UucHJvdG90eXBlLFwibXV0ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdm9sdW1lLm11dGV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl92b2x1bWUubXV0ZT10fX0pLHQuU291cmNlLnByb3RvdHlwZS5fc3RhcnQ9dC5ub09wLHQuU291cmNlLnByb3RvdHlwZS5yZXN0YXJ0PXQubm9PcCx0LlNvdXJjZS5wcm90b3R5cGUuX3N0b3A9dC5ub09wLHQuU291cmNlLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbihlLGksbil7aWYoZT10LmlzVW5kZWYoZSkmJnRoaXMuX3N5bmNlZD90LlRyYW5zcG9ydC5zZWNvbmRzOnRoaXMudG9TZWNvbmRzKGUpLHRoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKGUpPT09dC5TdGF0ZS5TdGFydGVkKXRoaXMuX3N0YXRlLmNhbmNlbChlKSx0aGlzLl9zdGF0ZS5zZXRTdGF0ZUF0VGltZSh0LlN0YXRlLlN0YXJ0ZWQsZSksdGhpcy5yZXN0YXJ0KGUsaSxuKTtlbHNlIGlmKHRoaXMuX3N0YXRlLnNldFN0YXRlQXRUaW1lKHQuU3RhdGUuU3RhcnRlZCxlKSx0aGlzLl9zeW5jZWQpe3ZhciBvPXRoaXMuX3N0YXRlLmdldChlKTtvLm9mZnNldD10LmRlZmF1bHRBcmcoaSwwKSxvLmR1cmF0aW9uPW47dmFyIHM9dC5UcmFuc3BvcnQuc2NoZWR1bGUoZnVuY3Rpb24odCl7dGhpcy5fc3RhcnQodCxpLG4pfS5iaW5kKHRoaXMpLGUpO3RoaXMuX3NjaGVkdWxlZC5wdXNoKHMpLHQuVHJhbnNwb3J0LnN0YXRlPT09dC5TdGF0ZS5TdGFydGVkJiZ0aGlzLl9zeW5jZWRTdGFydCh0aGlzLm5vdygpLHQuVHJhbnNwb3J0LnNlY29uZHMpfWVsc2UgdGhpcy5fc3RhcnQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiB0aGlzfSx0LlNvdXJjZS5wcm90b3R5cGUuc3RvcD1mdW5jdGlvbihlKXtpZihlPXQuaXNVbmRlZihlKSYmdGhpcy5fc3luY2VkP3QuVHJhbnNwb3J0LnNlY29uZHM6dGhpcy50b1NlY29uZHMoZSksdGhpcy5fc3luY2VkKXt2YXIgaT10LlRyYW5zcG9ydC5zY2hlZHVsZSh0aGlzLl9zdG9wLmJpbmQodGhpcyksZSk7dGhpcy5fc2NoZWR1bGVkLnB1c2goaSl9ZWxzZSB0aGlzLl9zdG9wLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gdGhpcy5fc3RhdGUuY2FuY2VsKGUpLHRoaXMuX3N0YXRlLnNldFN0YXRlQXRUaW1lKHQuU3RhdGUuU3RvcHBlZCxlKSx0aGlzfSx0LlNvdXJjZS5wcm90b3R5cGUuc3luYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zeW5jZWQ9ITAsdGhpcy5fc3luY2VkU3RhcnQ9ZnVuY3Rpb24oZSxpKXtpZihpPjApe3ZhciBuPXRoaXMuX3N0YXRlLmdldChpKTtpZihuJiZuLnN0YXRlPT09dC5TdGF0ZS5TdGFydGVkJiZuLnRpbWUhPT1pKXt2YXIgbyxzPWktdGhpcy50b1NlY29uZHMobi50aW1lKTtuLmR1cmF0aW9uJiYobz10aGlzLnRvU2Vjb25kcyhuLmR1cmF0aW9uKS1zKSx0aGlzLl9zdGFydChlLHRoaXMudG9TZWNvbmRzKG4ub2Zmc2V0KStzLG8pfX19LmJpbmQodGhpcyksdGhpcy5fc3luY2VkU3RvcD1mdW5jdGlvbihlKXt2YXIgaT10LlRyYW5zcG9ydC5nZXRTZWNvbmRzQXRUaW1lKE1hdGgubWF4KGUtdGhpcy5zYW1wbGVUaW1lLDApKTt0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZShpKT09PXQuU3RhdGUuU3RhcnRlZCYmdGhpcy5fc3RvcChlKX0uYmluZCh0aGlzKSx0LlRyYW5zcG9ydC5vbihcInN0YXJ0IGxvb3BTdGFydFwiLHRoaXMuX3N5bmNlZFN0YXJ0KSx0LlRyYW5zcG9ydC5vbihcInN0b3AgcGF1c2UgbG9vcEVuZFwiLHRoaXMuX3N5bmNlZFN0b3ApLHRoaXN9LHQuU291cmNlLnByb3RvdHlwZS51bnN5bmM9ZnVuY3Rpb24oKXt0aGlzLl9zeW5jZWQmJih0LlRyYW5zcG9ydC5vZmYoXCJzdG9wIHBhdXNlIGxvb3BFbmRcIix0aGlzLl9zeW5jZWRTdG9wKSx0LlRyYW5zcG9ydC5vZmYoXCJzdGFydCBsb29wU3RhcnRcIix0aGlzLl9zeW5jZWRTdGFydCkpLHRoaXMuX3N5bmNlZD0hMTtmb3IodmFyIGU9MDtlPHRoaXMuX3NjaGVkdWxlZC5sZW5ndGg7ZSsrKXt2YXIgaT10aGlzLl9zY2hlZHVsZWRbZV07dC5UcmFuc3BvcnQuY2xlYXIoaSl9cmV0dXJuIHRoaXMuX3NjaGVkdWxlZD1bXSx0aGlzLl9zdGF0ZS5jYW5jZWwoMCksdGhpc30sdC5Tb3VyY2UucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMudW5zeW5jKCksdGhpcy5fc2NoZWR1bGVkPW51bGwsdGhpcy5fd3JpdGFibGUoXCJ2b2x1bWVcIiksdGhpcy5fdm9sdW1lLmRpc3Bvc2UoKSx0aGlzLl92b2x1bWU9bnVsbCx0aGlzLnZvbHVtZT1udWxsLHRoaXMuX3N0YXRlLmRpc3Bvc2UoKSx0aGlzLl9zdGF0ZT1udWxsfSx0LlNvdXJjZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgzNiksaSg5OCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LldhdmVTaGFwZXI9ZnVuY3Rpb24oZSxpKXt0LlNpZ25hbEJhc2UuY2FsbCh0aGlzKSx0aGlzLl9zaGFwZXI9dGhpcy5pbnB1dD10aGlzLm91dHB1dD10aGlzLmNvbnRleHQuY3JlYXRlV2F2ZVNoYXBlcigpLHRoaXMuX2N1cnZlPW51bGwsQXJyYXkuaXNBcnJheShlKT90aGlzLmN1cnZlPWU6aXNGaW5pdGUoZSl8fHQuaXNVbmRlZihlKT90aGlzLl9jdXJ2ZT1uZXcgRmxvYXQzMkFycmF5KHQuZGVmYXVsdEFyZyhlLDEwMjQpKTp0LmlzRnVuY3Rpb24oZSkmJih0aGlzLl9jdXJ2ZT1uZXcgRmxvYXQzMkFycmF5KHQuZGVmYXVsdEFyZyhpLDEwMjQpKSx0aGlzLnNldE1hcChlKSl9LHQuZXh0ZW5kKHQuV2F2ZVNoYXBlcix0LlNpZ25hbEJhc2UpLHQuV2F2ZVNoYXBlci5wcm90b3R5cGUuc2V0TWFwPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodGhpcy5fY3VydmUubGVuZ3RoKSxpPTAsbj10aGlzLl9jdXJ2ZS5sZW5ndGg7aTxuO2krKyl7dmFyIG89aS8obi0xKSoyLTE7ZVtpXT10KG8saSl9cmV0dXJuIHRoaXMuY3VydmU9ZSx0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5XYXZlU2hhcGVyLnByb3RvdHlwZSxcImN1cnZlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGFwZXIuY3VydmV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9jdXJ2ZT1uZXcgRmxvYXQzMkFycmF5KHQpLHRoaXMuX3NoYXBlci5jdXJ2ZT10aGlzLl9jdXJ2ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5XYXZlU2hhcGVyLnByb3RvdHlwZSxcIm92ZXJzYW1wbGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NoYXBlci5vdmVyc2FtcGxlfSxzZXQ6ZnVuY3Rpb24odCl7aWYoIVtcIm5vbmVcIixcIjJ4XCIsXCI0eFwiXS5pbmNsdWRlcyh0KSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRvbmUuV2F2ZVNoYXBlcjogb3ZlcnNhbXBsaW5nIG11c3QgYmUgZWl0aGVyICdub25lJywgJzJ4Jywgb3IgJzR4J1wiKTt0aGlzLl9zaGFwZXIub3ZlcnNhbXBsZT10fX0pLHQuV2F2ZVNoYXBlci5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LlNpZ25hbEJhc2UucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9zaGFwZXIuZGlzY29ubmVjdCgpLHRoaXMuX3NoYXBlcj1udWxsLHRoaXMuX2N1cnZlPW51bGwsdGhpc30sdC5XYXZlU2hhcGVyfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDIzKSxpKDIpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5FZmZlY3Q9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJ3ZXRcIl0sdC5FZmZlY3QpO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5jcmVhdGVJbnNPdXRzKDEsMSksdGhpcy5fZHJ5V2V0PW5ldyB0LkNyb3NzRmFkZShlLndldCksdGhpcy53ZXQ9dGhpcy5fZHJ5V2V0LmZhZGUsdGhpcy5lZmZlY3RTZW5kPW5ldyB0LkdhaW4sdGhpcy5lZmZlY3RSZXR1cm49bmV3IHQuR2Fpbix0aGlzLmlucHV0LmNvbm5lY3QodGhpcy5fZHJ5V2V0LmEpLHRoaXMuaW5wdXQuY29ubmVjdCh0aGlzLmVmZmVjdFNlbmQpLHRoaXMuZWZmZWN0UmV0dXJuLmNvbm5lY3QodGhpcy5fZHJ5V2V0LmIpLHRoaXMuX2RyeVdldC5jb25uZWN0KHRoaXMub3V0cHV0KSx0aGlzLl9yZWFkT25seShbXCJ3ZXRcIl0pfSx0LmV4dGVuZCh0LkVmZmVjdCx0LkF1ZGlvTm9kZSksdC5FZmZlY3QuZGVmYXVsdHM9e3dldDoxfSx0LkVmZmVjdC5wcm90b3R5cGUuY29ubmVjdEVmZmVjdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lZmZlY3RTZW5kLmNoYWluKHQsdGhpcy5lZmZlY3RSZXR1cm4pLHRoaXN9LHQuRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fZHJ5V2V0LmRpc3Bvc2UoKSx0aGlzLl9kcnlXZXQ9bnVsbCx0aGlzLmVmZmVjdFNlbmQuZGlzcG9zZSgpLHRoaXMuZWZmZWN0U2VuZD1udWxsLHRoaXMuZWZmZWN0UmV0dXJuLmRpc3Bvc2UoKSx0aGlzLmVmZmVjdFJldHVybj1udWxsLHRoaXMuX3dyaXRhYmxlKFtcIndldFwiXSksdGhpcy53ZXQ9bnVsbCx0aGlzfSx0LkVmZmVjdH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxKSxpKDIpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5GaWx0ZXI9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJmcmVxdWVuY3lcIixcInR5cGVcIixcInJvbGxvZmZcIl0sdC5GaWx0ZXIpO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5jcmVhdGVJbnNPdXRzKDEsMSksdGhpcy5fZmlsdGVycz1bXSx0aGlzLmZyZXF1ZW5jeT1uZXcgdC5TaWduYWwoZS5mcmVxdWVuY3ksdC5UeXBlLkZyZXF1ZW5jeSksdGhpcy5kZXR1bmU9bmV3IHQuU2lnbmFsKDAsdC5UeXBlLkNlbnRzKSx0aGlzLmdhaW49bmV3IHQuU2lnbmFsKHt2YWx1ZTplLmdhaW4sY29udmVydDohMCx0eXBlOnQuVHlwZS5EZWNpYmVsc30pLHRoaXMuUT1uZXcgdC5TaWduYWwoZS5RKSx0aGlzLl90eXBlPWUudHlwZSx0aGlzLl9yb2xsb2ZmPWUucm9sbG9mZix0aGlzLnJvbGxvZmY9ZS5yb2xsb2ZmLHRoaXMuX3JlYWRPbmx5KFtcImRldHVuZVwiLFwiZnJlcXVlbmN5XCIsXCJnYWluXCIsXCJRXCJdKX0sdC5leHRlbmQodC5GaWx0ZXIsdC5BdWRpb05vZGUpLHQuRmlsdGVyLmRlZmF1bHRzPXt0eXBlOlwibG93cGFzc1wiLGZyZXF1ZW5jeTozNTAscm9sbG9mZjotMTIsUToxLGdhaW46MH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuRmlsdGVyLnByb3RvdHlwZSxcInR5cGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3R5cGV9LHNldDpmdW5jdGlvbih0KXtpZigtMT09PVtcImxvd3Bhc3NcIixcImhpZ2hwYXNzXCIsXCJiYW5kcGFzc1wiLFwibG93c2hlbGZcIixcImhpZ2hzaGVsZlwiLFwibm90Y2hcIixcImFsbHBhc3NcIixcInBlYWtpbmdcIl0uaW5kZXhPZih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVG9uZS5GaWx0ZXI6IGludmFsaWQgdHlwZSBcIit0KTt0aGlzLl90eXBlPXQ7Zm9yKHZhciBlPTA7ZTx0aGlzLl9maWx0ZXJzLmxlbmd0aDtlKyspdGhpcy5fZmlsdGVyc1tlXS50eXBlPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuRmlsdGVyLnByb3RvdHlwZSxcInJvbGxvZmZcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JvbGxvZmZ9LHNldDpmdW5jdGlvbihlKXtlPXBhcnNlSW50KGUsMTApO3ZhciBpPVstMTIsLTI0LC00OCwtOTZdLmluZGV4T2YoZSk7aWYoLTE9PT1pKXRocm93IG5ldyBSYW5nZUVycm9yKFwiVG9uZS5GaWx0ZXI6IHJvbGxvZmYgY2FuIG9ubHkgYmUgLTEyLCAtMjQsIC00OCBvciAtOTZcIik7aSs9MSx0aGlzLl9yb2xsb2ZmPWUsdGhpcy5pbnB1dC5kaXNjb25uZWN0KCk7Zm9yKHZhciBuPTA7bjx0aGlzLl9maWx0ZXJzLmxlbmd0aDtuKyspdGhpcy5fZmlsdGVyc1tuXS5kaXNjb25uZWN0KCksdGhpcy5fZmlsdGVyc1tuXT1udWxsO3RoaXMuX2ZpbHRlcnM9bmV3IEFycmF5KGkpO2Zvcih2YXIgbz0wO288aTtvKyspe3ZhciBzPXRoaXMuY29udGV4dC5jcmVhdGVCaXF1YWRGaWx0ZXIoKTtzLnR5cGU9dGhpcy5fdHlwZSx0aGlzLmZyZXF1ZW5jeS5jb25uZWN0KHMuZnJlcXVlbmN5KSx0aGlzLmRldHVuZS5jb25uZWN0KHMuZGV0dW5lKSx0aGlzLlEuY29ubmVjdChzLlEpLHRoaXMuZ2Fpbi5jb25uZWN0KHMuZ2FpbiksdGhpcy5fZmlsdGVyc1tvXT1zfXZhciByPVt0aGlzLmlucHV0XS5jb25jYXQodGhpcy5fZmlsdGVycykuY29uY2F0KFt0aGlzLm91dHB1dF0pO3QuY29ubmVjdFNlcmllcy5hcHBseSh0LHIpfX0pLHQuRmlsdGVyLnByb3RvdHlwZS5nZXRGcmVxdWVuY3lSZXNwb25zZT1mdW5jdGlvbihlKXtlPXQuZGVmYXVsdEFyZyhlLDEyOCk7Zm9yKHZhciBpPW5ldyBGbG9hdDMyQXJyYXkoZSkubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIDF9KSxuPW5ldyBGbG9hdDMyQXJyYXkoZSksbz0wO288ZTtvKyspe3ZhciBzPTE5OTgwKk1hdGgucG93KG8vZSwyKSsyMDtuW29dPXN9dmFyIHI9bmV3IEZsb2F0MzJBcnJheShlKSxhPW5ldyBGbG9hdDMyQXJyYXkoZSk7cmV0dXJuIHRoaXMuX2ZpbHRlcnMuZm9yRWFjaChmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udGV4dC5jcmVhdGVCaXF1YWRGaWx0ZXIoKTt0LnR5cGU9dGhpcy5fdHlwZSx0LlEudmFsdWU9dGhpcy5RLnZhbHVlLHQuZnJlcXVlbmN5LnZhbHVlPXRoaXMuZnJlcXVlbmN5LnZhbHVlLHQuZ2Fpbi52YWx1ZT10aGlzLmdhaW4udmFsdWUsdC5nZXRGcmVxdWVuY3lSZXNwb25zZShuLHIsYSksci5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7aVtlXSo9dH0pfS5iaW5kKHRoaXMpKSxpfSx0LkZpbHRlci5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3QuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7Zm9yKHZhciBlPTA7ZTx0aGlzLl9maWx0ZXJzLmxlbmd0aDtlKyspdGhpcy5fZmlsdGVyc1tlXS5kaXNjb25uZWN0KCksdGhpcy5fZmlsdGVyc1tlXT1udWxsO3JldHVybiB0aGlzLl9maWx0ZXJzPW51bGwsdGhpcy5fd3JpdGFibGUoW1wiZGV0dW5lXCIsXCJmcmVxdWVuY3lcIixcImdhaW5cIixcIlFcIl0pLHRoaXMuZnJlcXVlbmN5LmRpc3Bvc2UoKSx0aGlzLlEuZGlzcG9zZSgpLHRoaXMuZnJlcXVlbmN5PW51bGwsdGhpcy5RPW51bGwsdGhpcy5kZXR1bmUuZGlzcG9zZSgpLHRoaXMuZGV0dW5lPW51bGwsdGhpcy5nYWluLmRpc3Bvc2UoKSx0aGlzLmdhaW49bnVsbCx0aGlzfSx0LkZpbHRlcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuTWVyZ2U9ZnVuY3Rpb24oKXt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLHRoaXMuY3JlYXRlSW5zT3V0cygyLDApLHRoaXMubGVmdD10aGlzLmlucHV0WzBdPW5ldyB0LkdhaW4sdGhpcy5yaWdodD10aGlzLmlucHV0WzFdPW5ldyB0LkdhaW4sdGhpcy5fbWVyZ2VyPXRoaXMub3V0cHV0PXRoaXMuY29udGV4dC5jcmVhdGVDaGFubmVsTWVyZ2VyKDIpLHRoaXMubGVmdC5jb25uZWN0KHRoaXMuX21lcmdlciwwLDApLHRoaXMucmlnaHQuY29ubmVjdCh0aGlzLl9tZXJnZXIsMCwxKSx0aGlzLmxlZnQuY2hhbm5lbENvdW50PTEsdGhpcy5yaWdodC5jaGFubmVsQ291bnQ9MSx0aGlzLmxlZnQuY2hhbm5lbENvdW50TW9kZT1cImV4cGxpY2l0XCIsdGhpcy5yaWdodC5jaGFubmVsQ291bnRNb2RlPVwiZXhwbGljaXRcIn0sdC5leHRlbmQodC5NZXJnZSx0LkF1ZGlvTm9kZSksdC5NZXJnZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMubGVmdC5kaXNwb3NlKCksdGhpcy5sZWZ0PW51bGwsdGhpcy5yaWdodC5kaXNwb3NlKCksdGhpcy5yaWdodD1udWxsLHRoaXMuX21lcmdlci5kaXNjb25uZWN0KCksdGhpcy5fbWVyZ2VyPW51bGwsdGhpc30sdC5NZXJnZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgzNSksaSg0KSxpKDgxKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuQnVmZmVyPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1widXJsXCIsXCJvbmxvYWRcIixcIm9uZXJyb3JcIl0sdC5CdWZmZXIpO3QuY2FsbCh0aGlzKSx0aGlzLl9idWZmZXI9bnVsbCx0aGlzLl9yZXZlcnNlZD1lLnJldmVyc2UsdGhpcy5feGhyPW51bGwsdGhpcy5vbmxvYWQ9dC5ub09wLGUudXJsIGluc3RhbmNlb2YgQXVkaW9CdWZmZXJ8fGUudXJsIGluc3RhbmNlb2YgdC5CdWZmZXI/KHRoaXMuc2V0KGUudXJsKSx0aGlzLmxvYWRlZHx8KHRoaXMub25sb2FkPWUub25sb2FkKSk6dC5pc1N0cmluZyhlLnVybCkmJnRoaXMubG9hZChlLnVybCkudGhlbihlLm9ubG9hZCkuY2F0Y2goZS5vbmVycm9yKX0sdC5leHRlbmQodC5CdWZmZXIpLHQuQnVmZmVyLmRlZmF1bHRzPXt1cmw6dm9pZCAwLHJldmVyc2U6ITEsb25sb2FkOnQubm9PcCxvbmVycm9yOnQubm9PcH0sdC5CdWZmZXIucHJvdG90eXBlLnNldD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHQuQnVmZmVyP2UubG9hZGVkP3RoaXMuX2J1ZmZlcj1lLmdldCgpOmUub25sb2FkPWZ1bmN0aW9uKCl7dGhpcy5zZXQoZSksdGhpcy5vbmxvYWQodGhpcyl9LmJpbmQodGhpcyk6dGhpcy5fYnVmZmVyPWUsdGhpc30sdC5CdWZmZXIucHJvdG90eXBlLmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9idWZmZXJ9LHQuQnVmZmVyLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKGUsaSxuKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24obyxzKXt0aGlzLl94aHI9dC5CdWZmZXIubG9hZChlLGZ1bmN0aW9uKHQpe3RoaXMuX3hocj1udWxsLHRoaXMuc2V0KHQpLG8odGhpcyksdGhpcy5vbmxvYWQodGhpcyksaSYmaSh0aGlzKX0uYmluZCh0aGlzKSxmdW5jdGlvbih0KXt0aGlzLl94aHI9bnVsbCxzKHQpLG4mJm4odCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX0sdC5CdWZmZXIucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX2J1ZmZlcj1udWxsLHRoaXMuX3hociYmKHQuQnVmZmVyLl9yZW1vdmVGcm9tRG93bmxvYWRRdWV1ZSh0aGlzLl94aHIpLHRoaXMuX3hoci5hYm9ydCgpLHRoaXMuX3hocj1udWxsKSx0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5CdWZmZXIucHJvdG90eXBlLFwibG9hZGVkXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aD4wfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkJ1ZmZlci5wcm90b3R5cGUsXCJkdXJhdGlvblwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYnVmZmVyP3RoaXMuX2J1ZmZlci5kdXJhdGlvbjowfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkJ1ZmZlci5wcm90b3R5cGUsXCJsZW5ndGhcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2J1ZmZlcj90aGlzLl9idWZmZXIubGVuZ3RoOjB9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQnVmZmVyLnByb3RvdHlwZSxcIm51bWJlck9mQ2hhbm5lbHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2J1ZmZlcj90aGlzLl9idWZmZXIubnVtYmVyT2ZDaGFubmVsczowfX0pLHQuQnVmZmVyLnByb3RvdHlwZS5mcm9tQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9dFswXS5sZW5ndGg+MCxpPWU/dC5sZW5ndGg6MSxuPWU/dFswXS5sZW5ndGg6dC5sZW5ndGgsbz10aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyKGksbix0aGlzLmNvbnRleHQuc2FtcGxlUmF0ZSk7ZXx8MSE9PWl8fCh0PVt0XSk7Zm9yKHZhciBzPTA7czxpO3MrKylvLmNvcHlUb0NoYW5uZWwodFtzXSxzKTtyZXR1cm4gdGhpcy5fYnVmZmVyPW8sdGhpc30sdC5CdWZmZXIucHJvdG90eXBlLnRvTW9ubz1mdW5jdGlvbihlKXtpZih0LmlzTnVtYmVyKGUpKXRoaXMuZnJvbUFycmF5KHRoaXMudG9BcnJheShlKSk7ZWxzZXtmb3IodmFyIGk9bmV3IEZsb2F0MzJBcnJheSh0aGlzLmxlbmd0aCksbj10aGlzLm51bWJlck9mQ2hhbm5lbHMsbz0wO288bjtvKyspZm9yKHZhciBzPXRoaXMudG9BcnJheShvKSxyPTA7cjxzLmxlbmd0aDtyKyspaVtyXSs9c1tyXTtpPWkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0L259KSx0aGlzLmZyb21BcnJheShpKX1yZXR1cm4gdGhpc30sdC5CdWZmZXIucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oZSl7aWYodC5pc051bWJlcihlKSlyZXR1cm4gdGhpcy5nZXRDaGFubmVsRGF0YShlKTtpZigxPT09dGhpcy5udW1iZXJPZkNoYW5uZWxzKXJldHVybiB0aGlzLnRvQXJyYXkoMCk7Zm9yKHZhciBpPVtdLG49MDtuPHRoaXMubnVtYmVyT2ZDaGFubmVscztuKyspaVtuXT10aGlzLmdldENoYW5uZWxEYXRhKG4pO3JldHVybiBpfSx0LkJ1ZmZlci5wcm90b3R5cGUuZ2V0Q2hhbm5lbERhdGE9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2J1ZmZlci5nZXRDaGFubmVsRGF0YSh0KX0sdC5CdWZmZXIucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKGUsaSl7aT10LmRlZmF1bHRBcmcoaSx0aGlzLmR1cmF0aW9uKTtmb3IodmFyIG49TWF0aC5mbG9vcih0aGlzLmNvbnRleHQuc2FtcGxlUmF0ZSp0aGlzLnRvU2Vjb25kcyhlKSksbz1NYXRoLmZsb29yKHRoaXMuY29udGV4dC5zYW1wbGVSYXRlKnRoaXMudG9TZWNvbmRzKGkpKSxzPVtdLHI9MDtyPHRoaXMubnVtYmVyT2ZDaGFubmVscztyKyspc1tyXT10aGlzLnRvQXJyYXkocikuc2xpY2UobixvKTtyZXR1cm4obmV3IHQuQnVmZmVyKS5mcm9tQXJyYXkocyl9LHQuQnVmZmVyLnByb3RvdHlwZS5fcmV2ZXJzZT1mdW5jdGlvbigpe2lmKHRoaXMubG9hZGVkKWZvcih2YXIgdD0wO3Q8dGhpcy5udW1iZXJPZkNoYW5uZWxzO3QrKylBcnJheS5wcm90b3R5cGUucmV2ZXJzZS5jYWxsKHRoaXMuZ2V0Q2hhbm5lbERhdGEodCkpO3JldHVybiB0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5CdWZmZXIucHJvdG90eXBlLFwicmV2ZXJzZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmV2ZXJzZWR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9yZXZlcnNlZCE9PXQmJih0aGlzLl9yZXZlcnNlZD10LHRoaXMuX3JldmVyc2UoKSl9fSksdC5FbWl0dGVyLm1peGluKHQuQnVmZmVyKSx0LkJ1ZmZlci5fZG93bmxvYWRRdWV1ZT1bXSx0LkJ1ZmZlci5iYXNlVXJsPVwiXCIsdC5CdWZmZXIuZnJvbUFycmF5PWZ1bmN0aW9uKGUpe3JldHVybihuZXcgdC5CdWZmZXIpLmZyb21BcnJheShlKX0sdC5CdWZmZXIuZnJvbVVybD1mdW5jdGlvbihlKXt2YXIgaT1uZXcgdC5CdWZmZXI7cmV0dXJuIGkubG9hZChlKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGl9KX0sdC5CdWZmZXIuX3JlbW92ZUZyb21Eb3dubG9hZFF1ZXVlPWZ1bmN0aW9uKGUpe3ZhciBpPXQuQnVmZmVyLl9kb3dubG9hZFF1ZXVlLmluZGV4T2YoZSk7LTEhPT1pJiZ0LkJ1ZmZlci5fZG93bmxvYWRRdWV1ZS5zcGxpY2UoaSwxKX0sdC5CdWZmZXIubG9hZD1mdW5jdGlvbihlLGksbil7aT10LmRlZmF1bHRBcmcoaSx0Lm5vT3ApO3ZhciBvPWUubWF0Y2goL1xcWyguK1xcfD8pK1xcXSQvKTtpZihvKXtmb3IodmFyIHM9b1sxXS5zcGxpdChcInxcIikscj1zWzBdLGE9MDthPHMubGVuZ3RoO2ErKylpZih0LkJ1ZmZlci5zdXBwb3J0c1R5cGUoc1thXSkpe3I9c1thXTticmVha31lPWUucmVwbGFjZShvWzBdLHIpfWZ1bmN0aW9uIGwoZSl7aWYodC5CdWZmZXIuX3JlbW92ZUZyb21Eb3dubG9hZFF1ZXVlKHUpLHQuQnVmZmVyLmVtaXQoXCJlcnJvclwiLGUpLCFuKXRocm93IGU7bihlKX1mdW5jdGlvbiBoKCl7Zm9yKHZhciBlPTAsaT0wO2k8dC5CdWZmZXIuX2Rvd25sb2FkUXVldWUubGVuZ3RoO2krKyllKz10LkJ1ZmZlci5fZG93bmxvYWRRdWV1ZVtpXS5wcm9ncmVzczt0LkJ1ZmZlci5lbWl0KFwicHJvZ3Jlc3NcIixlL3QuQnVmZmVyLl9kb3dubG9hZFF1ZXVlLmxlbmd0aCl9dmFyIHU9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiB1Lm9wZW4oXCJHRVRcIix0LkJ1ZmZlci5iYXNlVXJsK2UsITApLHUucmVzcG9uc2VUeXBlPVwiYXJyYXlidWZmZXJcIix1LnByb2dyZXNzPTAsdC5CdWZmZXIuX2Rvd25sb2FkUXVldWUucHVzaCh1KSx1LmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsZnVuY3Rpb24oKXsyMDA9PT11LnN0YXR1cz90LmNvbnRleHQuZGVjb2RlQXVkaW9EYXRhKHUucmVzcG9uc2UpLnRoZW4oZnVuY3Rpb24oZSl7dS5wcm9ncmVzcz0xLGgoKSxpKGUpLHQuQnVmZmVyLl9yZW1vdmVGcm9tRG93bmxvYWRRdWV1ZSh1KSwwPT09dC5CdWZmZXIuX2Rvd25sb2FkUXVldWUubGVuZ3RoJiZ0LkJ1ZmZlci5lbWl0KFwibG9hZFwiKX0pLmNhdGNoKGZ1bmN0aW9uKCl7dC5CdWZmZXIuX3JlbW92ZUZyb21Eb3dubG9hZFF1ZXVlKHUpLGwoXCJUb25lLkJ1ZmZlcjogY291bGQgbm90IGRlY29kZSBhdWRpbyBkYXRhOiBcIitlKX0pOmwoXCJUb25lLkJ1ZmZlcjogY291bGQgbm90IGxvY2F0ZSBmaWxlOiBcIitlKX0pLHUuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsbCksdS5hZGRFdmVudExpc3RlbmVyKFwicHJvZ3Jlc3NcIixmdW5jdGlvbih0KXt0Lmxlbmd0aENvbXB1dGFibGUmJih1LnByb2dyZXNzPXQubG9hZGVkL3QudG90YWwqLjk1LGgoKSl9KSx1LnNlbmQoKSx1fSx0LkJ1ZmZlci5jYW5jZWxEb3dubG9hZHM9ZnVuY3Rpb24oKXtyZXR1cm4gdC5CdWZmZXIuX2Rvd25sb2FkUXVldWUuc2xpY2UoKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuQnVmZmVyLl9yZW1vdmVGcm9tRG93bmxvYWRRdWV1ZShlKSxlLmFib3J0KCl9KSx0LkJ1ZmZlcn0sdC5CdWZmZXIuc3VwcG9ydHNUeXBlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc3BsaXQoXCIuXCIpO3JldHVybiBlPWVbZS5sZW5ndGgtMV0sXCJcIiE9PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhdWRpb1wiKS5jYW5QbGF5VHlwZShcImF1ZGlvL1wiK2UpfSx0LmxvYWRlZD1mdW5jdGlvbigpe3ZhciBlLGk7ZnVuY3Rpb24gbigpe3QuQnVmZmVyLm9mZihcImxvYWRcIixlKSx0LkJ1ZmZlci5vZmYoXCJlcnJvclwiLGkpfXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuLG8pe2U9ZnVuY3Rpb24oKXtuKCl9LGk9ZnVuY3Rpb24oKXtvKCl9LHQuQnVmZmVyLm9uKFwibG9hZFwiLGUpLHQuQnVmZmVyLm9uKFwiZXJyb3JcIixpKX0pLnRoZW4obikuY2F0Y2goZnVuY3Rpb24odCl7dGhyb3cgbigpLG5ldyBFcnJvcih0KX0pfSx0LkJ1ZmZlcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxNyksaSgyNiksaSgyKSxpKDEpLGkoMjIpLGkoNCksaSgyOCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkxGTz1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcImZyZXF1ZW5jeVwiLFwibWluXCIsXCJtYXhcIl0sdC5MRk8pO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5fb3NjaWxsYXRvcj1uZXcgdC5Pc2NpbGxhdG9yKHtmcmVxdWVuY3k6ZS5mcmVxdWVuY3ksdHlwZTplLnR5cGV9KSx0aGlzLmZyZXF1ZW5jeT10aGlzLl9vc2NpbGxhdG9yLmZyZXF1ZW5jeSx0aGlzLmFtcGxpdHVkZT10aGlzLl9vc2NpbGxhdG9yLnZvbHVtZSx0aGlzLmFtcGxpdHVkZS51bml0cz10LlR5cGUuTm9ybWFsUmFuZ2UsdGhpcy5hbXBsaXR1ZGUudmFsdWU9ZS5hbXBsaXR1ZGUsdGhpcy5fc3RvcHBlZFNpZ25hbD1uZXcgdC5TaWduYWwoMCx0LlR5cGUuQXVkaW9SYW5nZSksdGhpcy5femVyb3M9bmV3IHQuWmVybyx0aGlzLl9zdG9wcGVkVmFsdWU9MCx0aGlzLl9hMmc9bmV3IHQuQXVkaW9Ub0dhaW4sdGhpcy5fc2NhbGVyPXRoaXMub3V0cHV0PW5ldyB0LlNjYWxlKGUubWluLGUubWF4KSx0aGlzLl91bml0cz10LlR5cGUuRGVmYXVsdCx0aGlzLnVuaXRzPWUudW5pdHMsdGhpcy5fb3NjaWxsYXRvci5jaGFpbih0aGlzLl9hMmcsdGhpcy5fc2NhbGVyKSx0aGlzLl96ZXJvcy5jb25uZWN0KHRoaXMuX2EyZyksdGhpcy5fc3RvcHBlZFNpZ25hbC5jb25uZWN0KHRoaXMuX2EyZyksdGhpcy5fcmVhZE9ubHkoW1wiYW1wbGl0dWRlXCIsXCJmcmVxdWVuY3lcIl0pLHRoaXMucGhhc2U9ZS5waGFzZX0sdC5leHRlbmQodC5MRk8sdC5BdWRpb05vZGUpLHQuTEZPLmRlZmF1bHRzPXt0eXBlOlwic2luZVwiLG1pbjowLG1heDoxLHBoYXNlOjAsZnJlcXVlbmN5OlwiNG5cIixhbXBsaXR1ZGU6MSx1bml0czp0LlR5cGUuRGVmYXVsdH0sdC5MRk8ucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0PXRoaXMudG9TZWNvbmRzKHQpLHRoaXMuX3N0b3BwZWRTaWduYWwuc2V0VmFsdWVBdFRpbWUoMCx0KSx0aGlzLl9vc2NpbGxhdG9yLnN0YXJ0KHQpLHRoaXN9LHQuTEZPLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKHQpe3JldHVybiB0PXRoaXMudG9TZWNvbmRzKHQpLHRoaXMuX3N0b3BwZWRTaWduYWwuc2V0VmFsdWVBdFRpbWUodGhpcy5fc3RvcHBlZFZhbHVlLHQpLHRoaXMuX29zY2lsbGF0b3Iuc3RvcCh0KSx0aGlzfSx0LkxGTy5wcm90b3R5cGUuc3luYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9vc2NpbGxhdG9yLnN5bmMoKSx0aGlzLl9vc2NpbGxhdG9yLnN5bmNGcmVxdWVuY3koKSx0aGlzfSx0LkxGTy5wcm90b3R5cGUudW5zeW5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29zY2lsbGF0b3IudW5zeW5jKCksdGhpcy5fb3NjaWxsYXRvci51bnN5bmNGcmVxdWVuY3koKSx0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5MRk8ucHJvdG90eXBlLFwibWluXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90b1VuaXRzKHRoaXMuX3NjYWxlci5taW4pfSxzZXQ6ZnVuY3Rpb24odCl7dD10aGlzLl9mcm9tVW5pdHModCksdGhpcy5fc2NhbGVyLm1pbj10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkxGTy5wcm90b3R5cGUsXCJtYXhcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RvVW5pdHModGhpcy5fc2NhbGVyLm1heCl9LHNldDpmdW5jdGlvbih0KXt0PXRoaXMuX2Zyb21Vbml0cyh0KSx0aGlzLl9zY2FsZXIubWF4PXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuTEZPLnByb3RvdHlwZSxcInR5cGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29zY2lsbGF0b3IudHlwZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX29zY2lsbGF0b3IudHlwZT10LHRoaXMuX3N0b3BwZWRWYWx1ZT10aGlzLl9vc2NpbGxhdG9yLl9nZXRJbml0aWFsVmFsdWUoKSx0aGlzLl9zdG9wcGVkU2lnbmFsLnZhbHVlPXRoaXMuX3N0b3BwZWRWYWx1ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5MRk8ucHJvdG90eXBlLFwicGhhc2VcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29zY2lsbGF0b3IucGhhc2V9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9vc2NpbGxhdG9yLnBoYXNlPXQsdGhpcy5fc3RvcHBlZFZhbHVlPXRoaXMuX29zY2lsbGF0b3IuX2dldEluaXRpYWxWYWx1ZSgpLHRoaXMuX3N0b3BwZWRTaWduYWwudmFsdWU9dGhpcy5fc3RvcHBlZFZhbHVlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkxGTy5wcm90b3R5cGUsXCJ1bml0c1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdW5pdHN9LHNldDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm1pbixpPXRoaXMubWF4O3RoaXMuX3VuaXRzPXQsdGhpcy5taW49ZSx0aGlzLm1heD1pfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkxGTy5wcm90b3R5cGUsXCJtdXRlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vc2NpbGxhdG9yLm11dGV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9vc2NpbGxhdG9yLm11dGU9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5MRk8ucHJvdG90eXBlLFwic3RhdGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29zY2lsbGF0b3Iuc3RhdGV9fSksdC5MRk8ucHJvdG90eXBlLmNvbm5lY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29uc3RydWN0b3IhPT10LlNpZ25hbCYmZS5jb25zdHJ1Y3RvciE9PXQuUGFyYW18fCh0aGlzLmNvbnZlcnQ9ZS5jb252ZXJ0LHRoaXMudW5pdHM9ZS51bml0cyksdC5TaWduYWxCYXNlLnByb3RvdHlwZS5jb25uZWN0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzfSx0LkxGTy5wcm90b3R5cGUuX2Zyb21Vbml0cz10LlBhcmFtLnByb3RvdHlwZS5fZnJvbVVuaXRzLHQuTEZPLnByb3RvdHlwZS5fdG9Vbml0cz10LlBhcmFtLnByb3RvdHlwZS5fdG9Vbml0cyx0LkxGTy5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcImFtcGxpdHVkZVwiLFwiZnJlcXVlbmN5XCJdKSx0aGlzLl9vc2NpbGxhdG9yLmRpc3Bvc2UoKSx0aGlzLl9vc2NpbGxhdG9yPW51bGwsdGhpcy5fc3RvcHBlZFNpZ25hbC5kaXNwb3NlKCksdGhpcy5fc3RvcHBlZFNpZ25hbD1udWxsLHRoaXMuX3plcm9zLmRpc3Bvc2UoKSx0aGlzLl96ZXJvcz1udWxsLHRoaXMuX3NjYWxlci5kaXNwb3NlKCksdGhpcy5fc2NhbGVyPW51bGwsdGhpcy5fYTJnLmRpc3Bvc2UoKSx0aGlzLl9hMmc9bnVsbCx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXMuYW1wbGl0dWRlPW51bGwsdGhpc30sdC5MRk99LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMjkpLGkoOTQpLGkoMSksaSgzKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuU3VidHJhY3Q9ZnVuY3Rpb24oZSl7dC5TaWduYWwuY2FsbCh0aGlzKSx0aGlzLmNyZWF0ZUluc091dHMoMiwwKSx0aGlzLl9zdW09dGhpcy5pbnB1dFswXT10aGlzLm91dHB1dD1uZXcgdC5HYWluLHRoaXMuX25lZz1uZXcgdC5OZWdhdGUsdGhpcy5fcGFyYW09dGhpcy5pbnB1dFsxXT1uZXcgdC5TaWduYWwoZSksdGhpcy5fcGFyYW0uY2hhaW4odGhpcy5fbmVnLHRoaXMuX3N1bSksdGhpcy5wcm94eT0hMX0sdC5leHRlbmQodC5TdWJ0cmFjdCx0LlNpZ25hbCksdC5TdWJ0cmFjdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LlNpZ25hbC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX25lZy5kaXNwb3NlKCksdGhpcy5fbmVnPW51bGwsdGhpcy5fc3VtLmRpc2Nvbm5lY3QoKSx0aGlzLl9zdW09bnVsbCx0aGlzfSx0LlN1YnRyYWN0fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDQpLGkoMiksaSgyNCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlBhcmFtPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wicGFyYW1cIixcInVuaXRzXCIsXCJjb252ZXJ0XCJdLHQuUGFyYW0pO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyxlKSx0aGlzLl9wYXJhbT10aGlzLmlucHV0PWUucGFyYW0sdGhpcy51bml0cz1lLnVuaXRzLHRoaXMuY29udmVydD1lLmNvbnZlcnQsdGhpcy5vdmVycmlkZGVuPSExLHRoaXMuX2V2ZW50cz1uZXcgdC5UaW1lbGluZSgxZTMpLHQuaXNEZWZpbmVkKGUudmFsdWUpJiZ0aGlzLl9wYXJhbSYmdGhpcy5zZXRWYWx1ZUF0VGltZShlLnZhbHVlLDApfSx0LmV4dGVuZCh0LlBhcmFtLHQuQXVkaW9Ob2RlKSx0LlBhcmFtLmRlZmF1bHRzPXt1bml0czp0LlR5cGUuRGVmYXVsdCxjb252ZXJ0OiEwLHBhcmFtOnZvaWQgMH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGFyYW0ucHJvdG90eXBlLFwidmFsdWVcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ub3coKTtyZXR1cm4gdGhpcy5fdG9Vbml0cyh0aGlzLmdldFZhbHVlQXRUaW1lKHQpKX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2luaXRpYWxWYWx1ZT10aGlzLl9mcm9tVW5pdHModCksdGhpcy5jYW5jZWxTY2hlZHVsZWRWYWx1ZXModGhpcy5ub3coKSksdGhpcy5zZXRWYWx1ZUF0VGltZSh0LHRoaXMubm93KCkpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlBhcmFtLnByb3RvdHlwZSxcIm1pblZhbHVlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVuaXRzPT09dC5UeXBlLlRpbWV8fHRoaXMudW5pdHM9PT10LlR5cGUuRnJlcXVlbmN5fHx0aGlzLnVuaXRzPT09dC5UeXBlLk5vcm1hbFJhbmdlfHx0aGlzLnVuaXRzPT09dC5UeXBlLlBvc2l0aXZlfHx0aGlzLnVuaXRzPT09dC5UeXBlLkJQTT8wOnRoaXMudW5pdHM9PT10LlR5cGUuQXVkaW9SYW5nZT8tMTp0aGlzLnVuaXRzPT09dC5UeXBlLkRlY2liZWxzPy0xLzA6dGhpcy5fcGFyYW0ubWluVmFsdWV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGFyYW0ucHJvdG90eXBlLFwibWF4VmFsdWVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pdHM9PT10LlR5cGUuTm9ybWFsUmFuZ2V8fHRoaXMudW5pdHM9PT10LlR5cGUuQXVkaW9SYW5nZT8xOnRoaXMuX3BhcmFtLm1heFZhbHVlfX0pLHQuUGFyYW0ucHJvdG90eXBlLl9mcm9tVW5pdHM9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuY29udmVydCYmIXQuaXNVbmRlZih0aGlzLmNvbnZlcnQpfHx0aGlzLm92ZXJyaWRkZW4pcmV0dXJuIGU7c3dpdGNoKHRoaXMudW5pdHMpe2Nhc2UgdC5UeXBlLlRpbWU6cmV0dXJuIHRoaXMudG9TZWNvbmRzKGUpO2Nhc2UgdC5UeXBlLkZyZXF1ZW5jeTpyZXR1cm4gdGhpcy50b0ZyZXF1ZW5jeShlKTtjYXNlIHQuVHlwZS5EZWNpYmVsczpyZXR1cm4gdC5kYlRvR2FpbihlKTtjYXNlIHQuVHlwZS5Ob3JtYWxSYW5nZTpyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoZSwwKSwxKTtjYXNlIHQuVHlwZS5BdWRpb1JhbmdlOnJldHVybiBNYXRoLm1pbihNYXRoLm1heChlLC0xKSwxKTtjYXNlIHQuVHlwZS5Qb3NpdGl2ZTpyZXR1cm4gTWF0aC5tYXgoZSwwKTtkZWZhdWx0OnJldHVybiBlfX0sdC5QYXJhbS5wcm90b3R5cGUuX3RvVW5pdHM9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuY29udmVydCYmIXQuaXNVbmRlZih0aGlzLmNvbnZlcnQpKXJldHVybiBlO3N3aXRjaCh0aGlzLnVuaXRzKXtjYXNlIHQuVHlwZS5EZWNpYmVsczpyZXR1cm4gdC5nYWluVG9EYihlKTtkZWZhdWx0OnJldHVybiBlfX0sdC5QYXJhbS5wcm90b3R5cGUuX21pbk91dHB1dD0xZS01LHQuUGFyYW0uQXV0b21hdGlvblR5cGU9e0xpbmVhcjpcImxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lXCIsRXhwb25lbnRpYWw6XCJleHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lXCIsVGFyZ2V0Olwic2V0VGFyZ2V0QXRUaW1lXCIsU2V0VmFsdWU6XCJzZXRWYWx1ZUF0VGltZVwiLENhbmNlbDpcImNhbmNlbFNjaGVkdWxlZFZhbHVlc1wifSx0LlBhcmFtLnByb3RvdHlwZS5zZXRWYWx1ZUF0VGltZT1mdW5jdGlvbihlLGkpe3JldHVybiBpPXRoaXMudG9TZWNvbmRzKGkpLGU9dGhpcy5fZnJvbVVuaXRzKGUpLHRoaXMuX2V2ZW50cy5hZGQoe3R5cGU6dC5QYXJhbS5BdXRvbWF0aW9uVHlwZS5TZXRWYWx1ZSx2YWx1ZTplLHRpbWU6aX0pLHRoaXMubG9nKHQuUGFyYW0uQXV0b21hdGlvblR5cGUuU2V0VmFsdWUsZSxpKSx0aGlzLl9wYXJhbS5zZXRWYWx1ZUF0VGltZShlLGkpLHRoaXN9LHQuUGFyYW0ucHJvdG90eXBlLmdldFZhbHVlQXRUaW1lPWZ1bmN0aW9uKGUpe2U9dGhpcy50b1NlY29uZHMoZSk7dmFyIGk9dGhpcy5fZXZlbnRzLmdldEFmdGVyKGUpLG49dGhpcy5fZXZlbnRzLmdldChlKSxvPXQuZGVmYXVsdEFyZyh0aGlzLl9pbml0aWFsVmFsdWUsdGhpcy5fcGFyYW0uZGVmYXVsdFZhbHVlKSxzPW87aWYobnVsbD09PW4pcz1vO2Vsc2UgaWYobi50eXBlPT09dC5QYXJhbS5BdXRvbWF0aW9uVHlwZS5UYXJnZXQpe3ZhciByLGE9dGhpcy5fZXZlbnRzLmdldEJlZm9yZShuLnRpbWUpO3I9bnVsbD09PWE/bzphLnZhbHVlLHM9dGhpcy5fZXhwb25lbnRpYWxBcHByb2FjaChuLnRpbWUscixuLnZhbHVlLG4uY29uc3RhbnQsZSl9ZWxzZSBzPW51bGw9PT1pP24udmFsdWU6aS50eXBlPT09dC5QYXJhbS5BdXRvbWF0aW9uVHlwZS5MaW5lYXI/dGhpcy5fbGluZWFySW50ZXJwb2xhdGUobi50aW1lLG4udmFsdWUsaS50aW1lLGkudmFsdWUsZSk6aS50eXBlPT09dC5QYXJhbS5BdXRvbWF0aW9uVHlwZS5FeHBvbmVudGlhbD90aGlzLl9leHBvbmVudGlhbEludGVycG9sYXRlKG4udGltZSxuLnZhbHVlLGkudGltZSxpLnZhbHVlLGUpOm4udmFsdWU7cmV0dXJuIHN9LHQuUGFyYW0ucHJvdG90eXBlLnNldFJhbXBQb2ludD1mdW5jdGlvbih0KXt0PXRoaXMudG9TZWNvbmRzKHQpO3ZhciBlPXRoaXMuZ2V0VmFsdWVBdFRpbWUodCk7cmV0dXJuIHRoaXMuY2FuY2VsQW5kSG9sZEF0VGltZSh0KSwwPT09ZSYmKGU9dGhpcy5fbWluT3V0cHV0KSx0aGlzLnNldFZhbHVlQXRUaW1lKHRoaXMuX3RvVW5pdHMoZSksdCksdGhpc30sdC5QYXJhbS5wcm90b3R5cGUubGluZWFyUmFtcFRvVmFsdWVBdFRpbWU9ZnVuY3Rpb24oZSxpKXtyZXR1cm4gZT10aGlzLl9mcm9tVW5pdHMoZSksaT10aGlzLnRvU2Vjb25kcyhpKSx0aGlzLl9ldmVudHMuYWRkKHt0eXBlOnQuUGFyYW0uQXV0b21hdGlvblR5cGUuTGluZWFyLHZhbHVlOmUsdGltZTppfSksdGhpcy5sb2codC5QYXJhbS5BdXRvbWF0aW9uVHlwZS5MaW5lYXIsZSxpKSx0aGlzLl9wYXJhbS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShlLGkpLHRoaXN9LHQuUGFyYW0ucHJvdG90eXBlLmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWU9ZnVuY3Rpb24oZSxpKXtyZXR1cm4gZT10aGlzLl9mcm9tVW5pdHMoZSksZT1NYXRoLm1heCh0aGlzLl9taW5PdXRwdXQsZSksaT10aGlzLnRvU2Vjb25kcyhpKSx0aGlzLl9ldmVudHMuYWRkKHt0eXBlOnQuUGFyYW0uQXV0b21hdGlvblR5cGUuRXhwb25lbnRpYWwsdGltZTppLHZhbHVlOmV9KSx0aGlzLmxvZyh0LlBhcmFtLkF1dG9tYXRpb25UeXBlLkV4cG9uZW50aWFsLGUsaSksdGhpcy5fcGFyYW0uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZShlLGkpLHRoaXN9LHQuUGFyYW0ucHJvdG90eXBlLmV4cG9uZW50aWFsUmFtcFRvPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gaT10aGlzLnRvU2Vjb25kcyhpKSx0aGlzLnNldFJhbXBQb2ludChpKSx0aGlzLmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUodCxpK3RoaXMudG9TZWNvbmRzKGUpKSx0aGlzfSx0LlBhcmFtLnByb3RvdHlwZS5saW5lYXJSYW1wVG89ZnVuY3Rpb24odCxlLGkpe3JldHVybiBpPXRoaXMudG9TZWNvbmRzKGkpLHRoaXMuc2V0UmFtcFBvaW50KGkpLHRoaXMubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUodCxpK3RoaXMudG9TZWNvbmRzKGUpKSx0aGlzfSx0LlBhcmFtLnByb3RvdHlwZS50YXJnZXRSYW1wVG89ZnVuY3Rpb24odCxlLGkpe3JldHVybiBpPXRoaXMudG9TZWNvbmRzKGkpLHRoaXMuc2V0UmFtcFBvaW50KGkpLHRoaXMuZXhwb25lbnRpYWxBcHByb2FjaFZhbHVlQXRUaW1lKHQsaSxlKSx0aGlzfSx0LlBhcmFtLnByb3RvdHlwZS5leHBvbmVudGlhbEFwcHJvYWNoVmFsdWVBdFRpbWU9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPU1hdGgubG9nKHRoaXMudG9TZWNvbmRzKGkpKzEpL01hdGgubG9nKDIwMCk7cmV0dXJuIGU9dGhpcy50b1NlY29uZHMoZSksdGhpcy5zZXRUYXJnZXRBdFRpbWUodCxlLG4pfSx0LlBhcmFtLnByb3RvdHlwZS5zZXRUYXJnZXRBdFRpbWU9ZnVuY3Rpb24oZSxpLG4pe2lmKGU9dGhpcy5fZnJvbVVuaXRzKGUpLG48PTApdGhyb3cgbmV3IEVycm9yKFwidGltZUNvbnN0YW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDBcIik7cmV0dXJuIGk9dGhpcy50b1NlY29uZHMoaSksdGhpcy5fZXZlbnRzLmFkZCh7dHlwZTp0LlBhcmFtLkF1dG9tYXRpb25UeXBlLlRhcmdldCx2YWx1ZTplLHRpbWU6aSxjb25zdGFudDpufSksdGhpcy5sb2codC5QYXJhbS5BdXRvbWF0aW9uVHlwZS5UYXJnZXQsZSxpLG4pLHRoaXMuX3BhcmFtLnNldFRhcmdldEF0VGltZShlLGksbiksdGhpc30sdC5QYXJhbS5wcm90b3R5cGUuc2V0VmFsdWVDdXJ2ZUF0VGltZT1mdW5jdGlvbihlLGksbixvKXtvPXQuZGVmYXVsdEFyZyhvLDEpLG49dGhpcy50b1NlY29uZHMobiksaT10aGlzLnRvU2Vjb25kcyhpKSx0aGlzLnNldFZhbHVlQXRUaW1lKGVbMF0qbyxpKTtmb3IodmFyIHM9bi8oZS5sZW5ndGgtMSkscj0xO3I8ZS5sZW5ndGg7cisrKXRoaXMubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoZVtyXSpvLGkrcipzKTtyZXR1cm4gdGhpc30sdC5QYXJhbS5wcm90b3R5cGUuY2FuY2VsU2NoZWR1bGVkVmFsdWVzPWZ1bmN0aW9uKGUpe3JldHVybiBlPXRoaXMudG9TZWNvbmRzKGUpLHRoaXMuX2V2ZW50cy5jYW5jZWwoZSksdGhpcy5fcGFyYW0uY2FuY2VsU2NoZWR1bGVkVmFsdWVzKGUpLHRoaXMubG9nKHQuUGFyYW0uQXV0b21hdGlvblR5cGUuQ2FuY2VsLGUpLHRoaXN9LHQuUGFyYW0ucHJvdG90eXBlLmNhbmNlbEFuZEhvbGRBdFRpbWU9ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5nZXRWYWx1ZUF0VGltZShlKTt0aGlzLmxvZyhcImNhbmNlbEFuZEhvbGRBdFRpbWVcIixlLFwidmFsdWU9XCIraSksdGhpcy5fcGFyYW0uY2FuY2VsU2NoZWR1bGVkVmFsdWVzKGUpO3ZhciBuPXRoaXMuX2V2ZW50cy5nZXQoZSksbz10aGlzLl9ldmVudHMuZ2V0QWZ0ZXIoZSk7cmV0dXJuIG4mJm4udGltZT09PWU/bz90aGlzLl9ldmVudHMuY2FuY2VsKG8udGltZSk6dGhpcy5fZXZlbnRzLmNhbmNlbChlK3RoaXMuc2FtcGxlVGltZSk6byYmKHRoaXMuX2V2ZW50cy5jYW5jZWwoby50aW1lKSxvLnR5cGU9PT10LlBhcmFtLkF1dG9tYXRpb25UeXBlLkxpbmVhcj90aGlzLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGksZSk6by50eXBlPT09dC5QYXJhbS5BdXRvbWF0aW9uVHlwZS5FeHBvbmVudGlhbCYmdGhpcy5leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lKGksZSkpLHRoaXMuX2V2ZW50cy5hZGQoe3R5cGU6dC5QYXJhbS5BdXRvbWF0aW9uVHlwZS5TZXRWYWx1ZSx2YWx1ZTppLHRpbWU6ZX0pLHRoaXMuX3BhcmFtLnNldFZhbHVlQXRUaW1lKGksZSksdGhpc30sdC5QYXJhbS5wcm90b3R5cGUucmFtcFRvPWZ1bmN0aW9uKGUsaSxuKXtyZXR1cm4gaT10LmRlZmF1bHRBcmcoaSwuMSksdGhpcy51bml0cz09PXQuVHlwZS5GcmVxdWVuY3l8fHRoaXMudW5pdHM9PT10LlR5cGUuQlBNfHx0aGlzLnVuaXRzPT09dC5UeXBlLkRlY2liZWxzP3RoaXMuZXhwb25lbnRpYWxSYW1wVG8oZSxpLG4pOnRoaXMubGluZWFyUmFtcFRvKGUsaSxuKSx0aGlzfSx0LlBhcmFtLnByb3RvdHlwZS5fZXhwb25lbnRpYWxBcHByb2FjaD1mdW5jdGlvbih0LGUsaSxuLG8pe3JldHVybiBpKyhlLWkpKk1hdGguZXhwKC0oby10KS9uKX0sdC5QYXJhbS5wcm90b3R5cGUuX2xpbmVhckludGVycG9sYXRlPWZ1bmN0aW9uKHQsZSxpLG4sbyl7cmV0dXJuIGUrKG8tdCkvKGktdCkqKG4tZSl9LHQuUGFyYW0ucHJvdG90eXBlLl9leHBvbmVudGlhbEludGVycG9sYXRlPWZ1bmN0aW9uKHQsZSxpLG4sbyl7cmV0dXJuIGUqTWF0aC5wb3cobi9lLChvLXQpLyhpLXQpKX0sdC5QYXJhbS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3BhcmFtPW51bGwsdGhpcy5fZXZlbnRzPW51bGwsdGhpc30sdC5QYXJhbX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg4KSxpKDE5KSxpKDEwKSxpKDIzKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuU3RlcmVvRWZmZWN0PWZ1bmN0aW9uKCl7dC5BdWRpb05vZGUuY2FsbCh0aGlzKTt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJ3ZXRcIl0sdC5FZmZlY3QpO3RoaXMuY3JlYXRlSW5zT3V0cygxLDEpLHRoaXMuX2RyeVdldD1uZXcgdC5Dcm9zc0ZhZGUoZS53ZXQpLHRoaXMud2V0PXRoaXMuX2RyeVdldC5mYWRlLHRoaXMuX3NwbGl0PW5ldyB0LlNwbGl0LHRoaXMuZWZmZWN0U2VuZEw9dGhpcy5fc3BsaXQubGVmdCx0aGlzLmVmZmVjdFNlbmRSPXRoaXMuX3NwbGl0LnJpZ2h0LHRoaXMuX21lcmdlPW5ldyB0Lk1lcmdlLHRoaXMuZWZmZWN0UmV0dXJuTD10aGlzLl9tZXJnZS5sZWZ0LHRoaXMuZWZmZWN0UmV0dXJuUj10aGlzLl9tZXJnZS5yaWdodCx0aGlzLmlucHV0LmNvbm5lY3QodGhpcy5fc3BsaXQpLHRoaXMuaW5wdXQuY29ubmVjdCh0aGlzLl9kcnlXZXQsMCwwKSx0aGlzLl9tZXJnZS5jb25uZWN0KHRoaXMuX2RyeVdldCwwLDEpLHRoaXMuX2RyeVdldC5jb25uZWN0KHRoaXMub3V0cHV0KSx0aGlzLl9yZWFkT25seShbXCJ3ZXRcIl0pfSx0LmV4dGVuZCh0LlN0ZXJlb0VmZmVjdCx0LkVmZmVjdCksdC5TdGVyZW9FZmZlY3QucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9kcnlXZXQuZGlzcG9zZSgpLHRoaXMuX2RyeVdldD1udWxsLHRoaXMuX3NwbGl0LmRpc3Bvc2UoKSx0aGlzLl9zcGxpdD1udWxsLHRoaXMuX21lcmdlLmRpc3Bvc2UoKSx0aGlzLl9tZXJnZT1udWxsLHRoaXMuZWZmZWN0U2VuZEw9bnVsbCx0aGlzLmVmZmVjdFNlbmRSPW51bGwsdGhpcy5lZmZlY3RSZXR1cm5MPW51bGwsdGhpcy5lZmZlY3RSZXR1cm5SPW51bGwsdGhpcy5fd3JpdGFibGUoW1wid2V0XCJdKSx0aGlzLndldD1udWxsLHRoaXN9LHQuU3RlcmVvRWZmZWN0fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDg2KSxpKDQpLGkoMjQpLGkoMzUpLGkoMyksaSg4NCksaSg4MyksaSg1NSldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3QuVHJhbnNwb3J0PWZ1bmN0aW9uKCl7dC5FbWl0dGVyLmNhbGwodGhpcyksdC5nZXRDb250ZXh0KGZ1bmN0aW9uKCl7dGhpcy5sb29wPSExLHRoaXMuX2xvb3BTdGFydD0wLHRoaXMuX2xvb3BFbmQ9MCx0aGlzLl9wcHE9ZS5kZWZhdWx0cy5QUFEsdGhpcy5fY2xvY2s9bmV3IHQuQ2xvY2soe2NhbGxiYWNrOnRoaXMuX3Byb2Nlc3NUaWNrLmJpbmQodGhpcyksZnJlcXVlbmN5OjB9KSx0aGlzLl9iaW5kQ2xvY2tFdmVudHMoKSx0aGlzLmJwbT10aGlzLl9jbG9jay5mcmVxdWVuY3ksdGhpcy5icG0uX3RvVW5pdHM9dGhpcy5fdG9Vbml0cy5iaW5kKHRoaXMpLHRoaXMuYnBtLl9mcm9tVW5pdHM9dGhpcy5fZnJvbVVuaXRzLmJpbmQodGhpcyksdGhpcy5icG0udW5pdHM9dC5UeXBlLkJQTSx0aGlzLmJwbS52YWx1ZT1lLmRlZmF1bHRzLmJwbSx0aGlzLl9yZWFkT25seShcImJwbVwiKSx0aGlzLl90aW1lU2lnbmF0dXJlPWUuZGVmYXVsdHMudGltZVNpZ25hdHVyZSx0aGlzLl9zY2hlZHVsZWRFdmVudHM9e30sdGhpcy5fdGltZWxpbmU9bmV3IHQuVGltZWxpbmUsdGhpcy5fcmVwZWF0ZWRFdmVudHM9bmV3IHQuSW50ZXJ2YWxUaW1lbGluZSx0aGlzLl9zeW5jZWRTaWduYWxzPVtdLHRoaXMuX3N3aW5nVGlja3M9ZS5kZWZhdWx0cy5QUFEvMix0aGlzLl9zd2luZ0Ftb3VudD0wLHRoaXMuY29udGV4dC50cmFuc3BvcnQ9dGhpc30uYmluZCh0aGlzKSl9LHQuZXh0ZW5kKHQuVHJhbnNwb3J0LHQuRW1pdHRlciksdC5UcmFuc3BvcnQuZGVmYXVsdHM9e2JwbToxMjAsc3dpbmc6MCxzd2luZ1N1YmRpdmlzaW9uOlwiOG5cIix0aW1lU2lnbmF0dXJlOjQsbG9vcFN0YXJ0OjAsbG9vcEVuZDpcIjRtXCIsUFBROjE5Mn0sdC5UcmFuc3BvcnQucHJvdG90eXBlLmlzVHJhbnNwb3J0PSEwLHQuVHJhbnNwb3J0LnByb3RvdHlwZS5fcHJvY2Vzc1RpY2s9ZnVuY3Rpb24oZSxpKXtpZih0aGlzLl9zd2luZ0Ftb3VudD4wJiZpJXRoaXMuX3BwcSE9MCYmaSUoMip0aGlzLl9zd2luZ1RpY2tzKSE9MCl7dmFyIG49aSUoMip0aGlzLl9zd2luZ1RpY2tzKS8oMip0aGlzLl9zd2luZ1RpY2tzKSxvPU1hdGguc2luKG4qTWF0aC5QSSkqdGhpcy5fc3dpbmdBbW91bnQ7ZSs9dC5UaWNrcygyKnRoaXMuX3N3aW5nVGlja3MvMykudG9TZWNvbmRzKCkqb310aGlzLmxvb3AmJmk+PXRoaXMuX2xvb3BFbmQmJih0aGlzLmVtaXQoXCJsb29wRW5kXCIsZSksdGhpcy5fY2xvY2suc2V0VGlja3NBdFRpbWUodGhpcy5fbG9vcFN0YXJ0LGUpLGk9dGhpcy5fbG9vcFN0YXJ0LHRoaXMuZW1pdChcImxvb3BTdGFydFwiLGUsdGhpcy5fY2xvY2suZ2V0U2Vjb25kc0F0VGltZShlKSksdGhpcy5lbWl0KFwibG9vcFwiLGUpKSx0aGlzLl90aW1lbGluZS5mb3JFYWNoQXRUaW1lKGksZnVuY3Rpb24odCl7dC5pbnZva2UoZSl9KX0sdC5UcmFuc3BvcnQucHJvdG90eXBlLnNjaGVkdWxlPWZ1bmN0aW9uKGUsaSl7dmFyIG49bmV3IHQuVHJhbnNwb3J0RXZlbnQodGhpcyx7dGltZTp0LlRyYW5zcG9ydFRpbWUoaSksY2FsbGJhY2s6ZX0pO3JldHVybiB0aGlzLl9hZGRFdmVudChuLHRoaXMuX3RpbWVsaW5lKX0sdC5UcmFuc3BvcnQucHJvdG90eXBlLnNjaGVkdWxlUmVwZWF0PWZ1bmN0aW9uKGUsaSxuLG8pe3ZhciBzPW5ldyB0LlRyYW5zcG9ydFJlcGVhdEV2ZW50KHRoaXMse2NhbGxiYWNrOmUsaW50ZXJ2YWw6dC5UaW1lKGkpLHRpbWU6dC5UcmFuc3BvcnRUaW1lKG4pLGR1cmF0aW9uOnQuVGltZSh0LmRlZmF1bHRBcmcobywxLzApKX0pO3JldHVybiB0aGlzLl9hZGRFdmVudChzLHRoaXMuX3JlcGVhdGVkRXZlbnRzKX0sdC5UcmFuc3BvcnQucHJvdG90eXBlLnNjaGVkdWxlT25jZT1mdW5jdGlvbihlLGkpe3ZhciBuPW5ldyB0LlRyYW5zcG9ydEV2ZW50KHRoaXMse3RpbWU6dC5UcmFuc3BvcnRUaW1lKGkpLGNhbGxiYWNrOmUsb25jZTohMH0pO3JldHVybiB0aGlzLl9hZGRFdmVudChuLHRoaXMuX3RpbWVsaW5lKX0sdC5UcmFuc3BvcnQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX3NjaGVkdWxlZEV2ZW50cy5oYXNPd25Qcm9wZXJ0eSh0KSl7dmFyIGU9dGhpcy5fc2NoZWR1bGVkRXZlbnRzW3QudG9TdHJpbmcoKV07ZS50aW1lbGluZS5yZW1vdmUoZS5ldmVudCksZS5ldmVudC5kaXNwb3NlKCksZGVsZXRlIHRoaXMuX3NjaGVkdWxlZEV2ZW50c1t0LnRvU3RyaW5nKCldfXJldHVybiB0aGlzfSx0LlRyYW5zcG9ydC5wcm90b3R5cGUuX2FkZEV2ZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3NjaGVkdWxlZEV2ZW50c1t0LmlkLnRvU3RyaW5nKCldPXtldmVudDp0LHRpbWVsaW5lOmV9LGUuYWRkKHQpLHQuaWR9LHQuVHJhbnNwb3J0LnByb3RvdHlwZS5jYW5jZWw9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dC5kZWZhdWx0QXJnKGUsMCksZT10aGlzLnRvVGlja3MoZSksdGhpcy5fdGltZWxpbmUuZm9yRWFjaEZyb20oZSxmdW5jdGlvbih0KXt0aGlzLmNsZWFyKHQuaWQpfS5iaW5kKHRoaXMpKSx0aGlzLl9yZXBlYXRlZEV2ZW50cy5mb3JFYWNoRnJvbShlLGZ1bmN0aW9uKHQpe3RoaXMuY2xlYXIodC5pZCl9LmJpbmQodGhpcykpLHRoaXN9LHQuVHJhbnNwb3J0LnByb3RvdHlwZS5fYmluZENsb2NrRXZlbnRzPWZ1bmN0aW9uKCl7dGhpcy5fY2xvY2sub24oXCJzdGFydFwiLGZ1bmN0aW9uKGUsaSl7aT10LlRpY2tzKGkpLnRvU2Vjb25kcygpLHRoaXMuZW1pdChcInN0YXJ0XCIsZSxpKX0uYmluZCh0aGlzKSksdGhpcy5fY2xvY2sub24oXCJzdG9wXCIsZnVuY3Rpb24odCl7dGhpcy5lbWl0KFwic3RvcFwiLHQpfS5iaW5kKHRoaXMpKSx0aGlzLl9jbG9jay5vbihcInBhdXNlXCIsZnVuY3Rpb24odCl7dGhpcy5lbWl0KFwicGF1c2VcIix0KX0uYmluZCh0aGlzKSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRyYW5zcG9ydC5wcm90b3R5cGUsXCJzdGF0ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2xvY2suZ2V0U3RhdGVBdFRpbWUodGhpcy5ub3coKSl9fSksdC5UcmFuc3BvcnQucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKGUsaSl7cmV0dXJuIHQuaXNEZWZpbmVkKGkpJiYoaT10aGlzLnRvVGlja3MoaSkpLHRoaXMuX2Nsb2NrLnN0YXJ0KGUsaSksdGhpc30sdC5UcmFuc3BvcnQucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2Nsb2NrLnN0b3AodCksdGhpc30sdC5UcmFuc3BvcnQucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jbG9jay5wYXVzZSh0KSx0aGlzfSx0LlRyYW5zcG9ydC5wcm90b3R5cGUudG9nZ2xlPWZ1bmN0aW9uKGUpe3JldHVybiBlPXRoaXMudG9TZWNvbmRzKGUpLHRoaXMuX2Nsb2NrLmdldFN0YXRlQXRUaW1lKGUpIT09dC5TdGF0ZS5TdGFydGVkP3RoaXMuc3RhcnQoZSk6dGhpcy5zdG9wKGUpLHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRyYW5zcG9ydC5wcm90b3R5cGUsXCJ0aW1lU2lnbmF0dXJlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90aW1lU2lnbmF0dXJlfSxzZXQ6ZnVuY3Rpb24oZSl7dC5pc0FycmF5KGUpJiYoZT1lWzBdL2VbMV0qNCksdGhpcy5fdGltZVNpZ25hdHVyZT1lfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRyYW5zcG9ydC5wcm90b3R5cGUsXCJsb29wU3RhcnRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHQuVGlja3ModGhpcy5fbG9vcFN0YXJ0KS50b1NlY29uZHMoKX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2xvb3BTdGFydD10aGlzLnRvVGlja3ModCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuVHJhbnNwb3J0LnByb3RvdHlwZSxcImxvb3BFbmRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHQuVGlja3ModGhpcy5fbG9vcEVuZCkudG9TZWNvbmRzKCl9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9sb29wRW5kPXRoaXMudG9UaWNrcyh0KX19KSx0LlRyYW5zcG9ydC5wcm90b3R5cGUuc2V0TG9vcFBvaW50cz1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmxvb3BTdGFydD10LHRoaXMubG9vcEVuZD1lLHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRyYW5zcG9ydC5wcm90b3R5cGUsXCJzd2luZ1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3dpbmdBbW91bnR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9zd2luZ0Ftb3VudD10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRyYW5zcG9ydC5wcm90b3R5cGUsXCJzd2luZ1N1YmRpdmlzaW9uXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0LlRpY2tzKHRoaXMuX3N3aW5nVGlja3MpLnRvTm90YXRpb24oKX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3N3aW5nVGlja3M9dGhpcy50b1RpY2tzKHQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRyYW5zcG9ydC5wcm90b3R5cGUsXCJwb3NpdGlvblwiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm5vdygpLGk9dGhpcy5fY2xvY2suZ2V0VGlja3NBdFRpbWUoZSk7cmV0dXJuIHQuVGlja3MoaSkudG9CYXJzQmVhdHNTaXh0ZWVudGhzKCl9LHNldDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnRvVGlja3ModCk7dGhpcy50aWNrcz1lfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRyYW5zcG9ydC5wcm90b3R5cGUsXCJzZWNvbmRzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jbG9jay5zZWNvbmRzfSxzZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ub3coKSxpPXRoaXMuYnBtLnRpbWVUb1RpY2tzKHQsZSk7dGhpcy50aWNrcz1pfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRyYW5zcG9ydC5wcm90b3R5cGUsXCJwcm9ncmVzc1wiLHtnZXQ6ZnVuY3Rpb24oKXtpZih0aGlzLmxvb3Ape3ZhciB0PXRoaXMubm93KCk7cmV0dXJuKHRoaXMuX2Nsb2NrLmdldFRpY2tzQXRUaW1lKHQpLXRoaXMuX2xvb3BTdGFydCkvKHRoaXMuX2xvb3BFbmQtdGhpcy5fbG9vcFN0YXJ0KX1yZXR1cm4gMH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5UcmFuc3BvcnQucHJvdG90eXBlLFwidGlja3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Nsb2NrLnRpY2tzfSxzZXQ6ZnVuY3Rpb24oZSl7aWYodGhpcy5fY2xvY2sudGlja3MhPT1lKXt2YXIgaT10aGlzLm5vdygpO3RoaXMuc3RhdGU9PT10LlN0YXRlLlN0YXJ0ZWQ/KHRoaXMuZW1pdChcInN0b3BcIixpKSx0aGlzLl9jbG9jay5zZXRUaWNrc0F0VGltZShlLGkpLHRoaXMuZW1pdChcInN0YXJ0XCIsaSx0aGlzLnNlY29uZHMpKTp0aGlzLl9jbG9jay5zZXRUaWNrc0F0VGltZShlLGkpfX19KSx0LlRyYW5zcG9ydC5wcm90b3R5cGUuZ2V0VGlja3NBdFRpbWU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodGhpcy5fY2xvY2suZ2V0VGlja3NBdFRpbWUodCkpfSx0LlRyYW5zcG9ydC5wcm90b3R5cGUuZ2V0U2Vjb25kc0F0VGltZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY2xvY2suZ2V0U2Vjb25kc0F0VGltZSh0KX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuVHJhbnNwb3J0LnByb3RvdHlwZSxcIlBQUVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHBxfSxzZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5icG0udmFsdWU7dGhpcy5fcHBxPXQsdGhpcy5icG0udmFsdWU9ZX19KSx0LlRyYW5zcG9ydC5wcm90b3R5cGUuX2Zyb21Vbml0cz1mdW5jdGlvbih0KXtyZXR1cm4gMS8oNjAvdC90aGlzLlBQUSl9LHQuVHJhbnNwb3J0LnByb3RvdHlwZS5fdG9Vbml0cz1mdW5jdGlvbih0KXtyZXR1cm4gdC90aGlzLlBQUSo2MH0sdC5UcmFuc3BvcnQucHJvdG90eXBlLm5leHRTdWJkaXZpc2lvbj1mdW5jdGlvbihlKXtpZihlPXRoaXMudG9UaWNrcyhlKSx0aGlzLnN0YXRlIT09dC5TdGF0ZS5TdGFydGVkKXJldHVybiAwO3ZhciBpPXRoaXMubm93KCksbj1lLXRoaXMuZ2V0VGlja3NBdFRpbWUoaSklZTtyZXR1cm4gdGhpcy5fY2xvY2submV4dFRpY2tUaW1lKG4saSl9LHQuVHJhbnNwb3J0LnByb3RvdHlwZS5zeW5jU2lnbmFsPWZ1bmN0aW9uKGUsaSl7aWYoIWkpe3ZhciBuPXRoaXMubm93KCk7aT0wIT09ZS5nZXRWYWx1ZUF0VGltZShuKT9lLmdldFZhbHVlQXRUaW1lKG4pL3RoaXMuYnBtLmdldFZhbHVlQXRUaW1lKG4pOjB9dmFyIG89bmV3IHQuR2FpbihpKTtyZXR1cm4gdGhpcy5icG0uY2hhaW4obyxlLl9wYXJhbSksdGhpcy5fc3luY2VkU2lnbmFscy5wdXNoKHtyYXRpbzpvLHNpZ25hbDplLGluaXRpYWw6ZS52YWx1ZX0pLGUudmFsdWU9MCx0aGlzfSx0LlRyYW5zcG9ydC5wcm90b3R5cGUudW5zeW5jU2lnbmFsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9zeW5jZWRTaWduYWxzLmxlbmd0aC0xO2U+PTA7ZS0tKXt2YXIgaT10aGlzLl9zeW5jZWRTaWduYWxzW2VdO2kuc2lnbmFsPT09dCYmKGkucmF0aW8uZGlzcG9zZSgpLGkuc2lnbmFsLnZhbHVlPWkuaW5pdGlhbCx0aGlzLl9zeW5jZWRTaWduYWxzLnNwbGljZShlLDEpKX1yZXR1cm4gdGhpc30sdC5UcmFuc3BvcnQucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5FbWl0dGVyLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fY2xvY2suZGlzcG9zZSgpLHRoaXMuX2Nsb2NrPW51bGwsdGhpcy5fd3JpdGFibGUoXCJicG1cIiksdGhpcy5icG09bnVsbCx0aGlzLl90aW1lbGluZS5kaXNwb3NlKCksdGhpcy5fdGltZWxpbmU9bnVsbCx0aGlzLl9yZXBlYXRlZEV2ZW50cy5kaXNwb3NlKCksdGhpcy5fcmVwZWF0ZWRFdmVudHM9bnVsbCx0aGlzfTt2YXIgZT10LlRyYW5zcG9ydDtyZXR1cm4gdC5UcmFuc3BvcnQ9bmV3IGUsdC5Db250ZXh0Lm9uKFwiaW5pdFwiLGZ1bmN0aW9uKGkpe2kudHJhbnNwb3J0JiZpLnRyYW5zcG9ydC5pc1RyYW5zcG9ydD90LlRyYW5zcG9ydD1pLnRyYW5zcG9ydDp0LlRyYW5zcG9ydD1uZXcgZX0pLHQuQ29udGV4dC5vbihcImNsb3NlXCIsZnVuY3Rpb24odCl7dC50cmFuc3BvcnQmJnQudHJhbnNwb3J0LmlzVHJhbnNwb3J0JiZ0LnRyYW5zcG9ydC5kaXNwb3NlKCl9KSx0LlRyYW5zcG9ydH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxKSxpKDYpLGkoMTYpLGkoODIpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5Pc2NpbGxhdG9yPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiZnJlcXVlbmN5XCIsXCJ0eXBlXCJdLHQuT3NjaWxsYXRvcik7dC5Tb3VyY2UuY2FsbCh0aGlzLGUpLHRoaXMuX29zY2lsbGF0b3I9bnVsbCx0aGlzLmZyZXF1ZW5jeT1uZXcgdC5TaWduYWwoZS5mcmVxdWVuY3ksdC5UeXBlLkZyZXF1ZW5jeSksdGhpcy5kZXR1bmU9bmV3IHQuU2lnbmFsKGUuZGV0dW5lLHQuVHlwZS5DZW50cyksdGhpcy5fd2F2ZT1udWxsLHRoaXMuX3BhcnRpYWxzPWUucGFydGlhbHMsdGhpcy5fcGFydGlhbENvdW50PWUucGFydGlhbENvdW50LHRoaXMuX3BoYXNlPWUucGhhc2UsdGhpcy5fdHlwZT1lLnR5cGUsZS5wYXJ0aWFsQ291bnQmJmUudHlwZSE9PXQuT3NjaWxsYXRvci5UeXBlLkN1c3RvbSYmKHRoaXMuX3R5cGU9dGhpcy5iYXNlVHlwZStlLnBhcnRpYWxDb3VudC50b1N0cmluZygpKSx0aGlzLnBoYXNlPXRoaXMuX3BoYXNlLHRoaXMuX3JlYWRPbmx5KFtcImZyZXF1ZW5jeVwiLFwiZGV0dW5lXCJdKX0sdC5leHRlbmQodC5Pc2NpbGxhdG9yLHQuU291cmNlKSx0Lk9zY2lsbGF0b3IuZGVmYXVsdHM9e3R5cGU6XCJzaW5lXCIsZnJlcXVlbmN5OjQ0MCxkZXR1bmU6MCxwaGFzZTowLHBhcnRpYWxzOltdLHBhcnRpYWxDb3VudDowfSx0Lk9zY2lsbGF0b3IuVHlwZT17U2luZTpcInNpbmVcIixUcmlhbmdsZTpcInRyaWFuZ2xlXCIsU2F3dG9vdGg6XCJzYXd0b290aFwiLFNxdWFyZTpcInNxdWFyZVwiLEN1c3RvbTpcImN1c3RvbVwifSx0Lk9zY2lsbGF0b3IucHJvdG90eXBlLl9zdGFydD1mdW5jdGlvbihlKXt0aGlzLmxvZyhcInN0YXJ0XCIsZSksdGhpcy5fb3NjaWxsYXRvcj1uZXcgdC5Pc2NpbGxhdG9yTm9kZSx0aGlzLl93YXZlP3RoaXMuX29zY2lsbGF0b3Iuc2V0UGVyaW9kaWNXYXZlKHRoaXMuX3dhdmUpOnRoaXMuX29zY2lsbGF0b3IudHlwZT10aGlzLl90eXBlLHRoaXMuX29zY2lsbGF0b3IuY29ubmVjdCh0aGlzLm91dHB1dCksdGhpcy5mcmVxdWVuY3kuY29ubmVjdCh0aGlzLl9vc2NpbGxhdG9yLmZyZXF1ZW5jeSksdGhpcy5kZXR1bmUuY29ubmVjdCh0aGlzLl9vc2NpbGxhdG9yLmRldHVuZSksZT10aGlzLnRvU2Vjb25kcyhlKSx0aGlzLl9vc2NpbGxhdG9yLnN0YXJ0KGUpfSx0Lk9zY2lsbGF0b3IucHJvdG90eXBlLl9zdG9wPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxvZyhcInN0b3BcIix0KSx0aGlzLl9vc2NpbGxhdG9yJiYodD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl9vc2NpbGxhdG9yLnN0b3AodCkpLHRoaXN9LHQuT3NjaWxsYXRvci5wcm90b3R5cGUucmVzdGFydD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fb3NjaWxsYXRvciYmdGhpcy5fb3NjaWxsYXRvci5jYW5jZWxTdG9wKCksdGhpcy5fc3RhdGUuY2FuY2VsKHRoaXMudG9TZWNvbmRzKHQpKSx0aGlzfSx0Lk9zY2lsbGF0b3IucHJvdG90eXBlLnN5bmNGcmVxdWVuY3k9ZnVuY3Rpb24oKXtyZXR1cm4gdC5UcmFuc3BvcnQuc3luY1NpZ25hbCh0aGlzLmZyZXF1ZW5jeSksdGhpc30sdC5Pc2NpbGxhdG9yLnByb3RvdHlwZS51bnN5bmNGcmVxdWVuY3k9ZnVuY3Rpb24oKXtyZXR1cm4gdC5UcmFuc3BvcnQudW5zeW5jU2lnbmFsKHRoaXMuZnJlcXVlbmN5KSx0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5Pc2NpbGxhdG9yLnByb3RvdHlwZSxcInR5cGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3R5cGV9LHNldDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9nZXRSZWFsSW1hZ2luYXJ5KHQsdGhpcy5fcGhhc2UpLGk9dGhpcy5jb250ZXh0LmNyZWF0ZVBlcmlvZGljV2F2ZShlWzBdLGVbMV0pO3RoaXMuX3dhdmU9aSxudWxsIT09dGhpcy5fb3NjaWxsYXRvciYmdGhpcy5fb3NjaWxsYXRvci5zZXRQZXJpb2RpY1dhdmUodGhpcy5fd2F2ZSksdGhpcy5fdHlwZT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk9zY2lsbGF0b3IucHJvdG90eXBlLFwiYmFzZVR5cGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3R5cGUucmVwbGFjZSh0aGlzLnBhcnRpYWxDb3VudCxcIlwiKX0sc2V0OmZ1bmN0aW9uKGUpe3RoaXMucGFydGlhbENvdW50JiZ0aGlzLl90eXBlIT09dC5Pc2NpbGxhdG9yLlR5cGUuQ3VzdG9tJiZlIT09dC5Pc2NpbGxhdG9yLlR5cGUuQ3VzdG9tP3RoaXMudHlwZT1lK3RoaXMucGFydGlhbENvdW50OnRoaXMudHlwZT1lfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk9zY2lsbGF0b3IucHJvdG90eXBlLFwicGFydGlhbENvdW50XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYXJ0aWFsQ291bnR9LHNldDpmdW5jdGlvbihlKXt2YXIgaT10aGlzLl90eXBlLG49L14oc2luZXx0cmlhbmdsZXxzcXVhcmV8c2F3dG9vdGgpKFxcZCspJC8uZXhlYyh0aGlzLl90eXBlKTtuJiYoaT1uWzFdKSx0aGlzLl90eXBlIT09dC5Pc2NpbGxhdG9yLlR5cGUuQ3VzdG9tJiYodGhpcy50eXBlPTA9PT1lP2k6aStlLnRvU3RyaW5nKCkpfX0pLHQuT3NjaWxsYXRvci5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKCl7Y29uc3QgZT10LnByb3RvdHlwZS5nZXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBlLnR5cGUhPT10Lk9zY2lsbGF0b3IuVHlwZS5DdXN0b20mJmRlbGV0ZSBlLnBhcnRpYWxzLGV9LHQuT3NjaWxsYXRvci5wcm90b3R5cGUuX2dldFJlYWxJbWFnaW5hcnk9ZnVuY3Rpb24oZSxpKXt2YXIgbj0yMDQ4LG89bmV3IEZsb2F0MzJBcnJheShuKSxzPW5ldyBGbG9hdDMyQXJyYXkobikscj0xO2lmKGU9PT10Lk9zY2lsbGF0b3IuVHlwZS5DdXN0b20pcj10aGlzLl9wYXJ0aWFscy5sZW5ndGgrMSx0aGlzLl9wYXJ0aWFsQ291bnQ9dGhpcy5fcGFydGlhbHMubGVuZ3RoLG49cjtlbHNle3ZhciBhPS9eKHNpbmV8dHJpYW5nbGV8c3F1YXJlfHNhd3Rvb3RoKShcXGQrKSQvLmV4ZWMoZSk7YT8ocj1wYXJzZUludChhWzJdKSsxLHRoaXMuX3BhcnRpYWxDb3VudD1wYXJzZUludChhWzJdKSxlPWFbMV0sbj1yPU1hdGgubWF4KHIsMikpOnRoaXMuX3BhcnRpYWxDb3VudD0wLHRoaXMuX3BhcnRpYWxzPVtdfWZvcih2YXIgbD0xO2w8bjsrK2wpe3ZhciBoLHU9Mi8obCpNYXRoLlBJKTtzd2l0Y2goZSl7Y2FzZSB0Lk9zY2lsbGF0b3IuVHlwZS5TaW5lOmg9bDw9cj8xOjAsdGhpcy5fcGFydGlhbHNbbC0xXT1oO2JyZWFrO2Nhc2UgdC5Pc2NpbGxhdG9yLlR5cGUuU3F1YXJlOmg9MSZsPzIqdTowLHRoaXMuX3BhcnRpYWxzW2wtMV09aDticmVhaztjYXNlIHQuT3NjaWxsYXRvci5UeXBlLlNhd3Rvb3RoOmg9dSooMSZsPzE6LTEpLHRoaXMuX3BhcnRpYWxzW2wtMV09aDticmVhaztjYXNlIHQuT3NjaWxsYXRvci5UeXBlLlRyaWFuZ2xlOmg9MSZsP3UqdSoyKihsLTE+PjEmMT8tMToxKTowLHRoaXMuX3BhcnRpYWxzW2wtMV09aDticmVhaztjYXNlIHQuT3NjaWxsYXRvci5UeXBlLkN1c3RvbTpoPXRoaXMuX3BhcnRpYWxzW2wtMV07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKFwiVG9uZS5Pc2NpbGxhdG9yOiBpbnZhbGlkIHR5cGU6IFwiK2UpfTAhPT1oPyhvW2xdPS1oKk1hdGguc2luKGkqbCksc1tsXT1oKk1hdGguY29zKGkqbCkpOihvW2xdPTAsc1tsXT0wKX1yZXR1cm5bbyxzXX0sdC5Pc2NpbGxhdG9yLnByb3RvdHlwZS5faW52ZXJzZUZGVD1mdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBuPTAsbz10Lmxlbmd0aCxzPTA7czxvO3MrKyluKz10W3NdKk1hdGguY29zKHMqaSkrZVtzXSpNYXRoLnNpbihzKmkpO3JldHVybiBufSx0Lk9zY2lsbGF0b3IucHJvdG90eXBlLl9nZXRJbml0aWFsVmFsdWU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ2V0UmVhbEltYWdpbmFyeSh0aGlzLl90eXBlLDApLGU9dFswXSxpPXRbMV0sbj0wLG89MipNYXRoLlBJLHM9MDtzPDg7cysrKW49TWF0aC5tYXgodGhpcy5faW52ZXJzZUZGVChlLGkscy84Km8pLG4pO3JldHVybi10aGlzLl9pbnZlcnNlRkZUKGUsaSx0aGlzLl9waGFzZSkvbn0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuT3NjaWxsYXRvci5wcm90b3R5cGUsXCJwYXJ0aWFsc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFydGlhbHN9LHNldDpmdW5jdGlvbihlKXt0aGlzLl9wYXJ0aWFscz1lLHRoaXMudHlwZT10Lk9zY2lsbGF0b3IuVHlwZS5DdXN0b219fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuT3NjaWxsYXRvci5wcm90b3R5cGUsXCJwaGFzZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGhhc2UqKDE4MC9NYXRoLlBJKX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3BoYXNlPXQqTWF0aC5QSS8xODAsdGhpcy50eXBlPXRoaXMuX3R5cGV9fSksdC5Pc2NpbGxhdG9yLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU291cmNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksbnVsbCE9PXRoaXMuX29zY2lsbGF0b3ImJih0aGlzLl9vc2NpbGxhdG9yLmRpc3Bvc2UoKSx0aGlzLl9vc2NpbGxhdG9yPW51bGwpLHRoaXMuX3dhdmU9bnVsbCx0aGlzLl93cml0YWJsZShbXCJmcmVxdWVuY3lcIixcImRldHVuZVwiXSksdGhpcy5mcmVxdWVuY3kuZGlzcG9zZSgpLHRoaXMuZnJlcXVlbmN5PW51bGwsdGhpcy5kZXR1bmUuZGlzcG9zZSgpLHRoaXMuZGV0dW5lPW51bGwsdGhpcy5fcGFydGlhbHM9bnVsbCx0aGlzfSx0Lk9zY2lsbGF0b3J9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMTQpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkRlbGF5PWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiZGVsYXlUaW1lXCIsXCJtYXhEZWxheVwiXSx0LkRlbGF5KTt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMsZSksdGhpcy5fbWF4RGVsYXk9TWF0aC5tYXgodGhpcy50b1NlY29uZHMoZS5tYXhEZWxheSksdGhpcy50b1NlY29uZHMoZS5kZWxheVRpbWUpKSx0aGlzLl9kZWxheU5vZGU9dGhpcy5pbnB1dD10aGlzLm91dHB1dD10aGlzLmNvbnRleHQuY3JlYXRlRGVsYXkodGhpcy5fbWF4RGVsYXkpLHRoaXMuZGVsYXlUaW1lPW5ldyB0LlBhcmFtKHtwYXJhbTp0aGlzLl9kZWxheU5vZGUuZGVsYXlUaW1lLHVuaXRzOnQuVHlwZS5UaW1lLHZhbHVlOmUuZGVsYXlUaW1lfSksdGhpcy5fcmVhZE9ubHkoXCJkZWxheVRpbWVcIil9LHQuZXh0ZW5kKHQuRGVsYXksdC5BdWRpb05vZGUpLHQuRGVsYXkuZGVmYXVsdHM9e21heERlbGF5OjEsZGVsYXlUaW1lOjB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkRlbGF5LnByb3RvdHlwZSxcIm1heERlbGF5XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhEZWxheX19KSx0LkRlbGF5LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fZGVsYXlOb2RlLmRpc2Nvbm5lY3QoKSx0aGlzLl9kZWxheU5vZGU9bnVsbCx0aGlzLl93cml0YWJsZShcImRlbGF5VGltZVwiKSx0aGlzLmRlbGF5VGltZT1udWxsLHRoaXN9LHQuRGVsYXl9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMyksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuU3BsaXQ9ZnVuY3Rpb24oKXt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLHRoaXMuY3JlYXRlSW5zT3V0cygwLDIpLHRoaXMuX3NwbGl0dGVyPXRoaXMuaW5wdXQ9dGhpcy5jb250ZXh0LmNyZWF0ZUNoYW5uZWxTcGxpdHRlcigyKSx0aGlzLmxlZnQ9dGhpcy5vdXRwdXRbMF09bmV3IHQuR2Fpbix0aGlzLnJpZ2h0PXRoaXMub3V0cHV0WzFdPW5ldyB0LkdhaW4sdGhpcy5fc3BsaXR0ZXIuY29ubmVjdCh0aGlzLmxlZnQsMCwwKSx0aGlzLl9zcGxpdHRlci5jb25uZWN0KHRoaXMucmlnaHQsMSwwKX0sdC5leHRlbmQodC5TcGxpdCx0LkF1ZGlvTm9kZSksdC5TcGxpdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3NwbGl0dGVyLmRpc2Nvbm5lY3QoKSx0aGlzLmxlZnQuZGlzcG9zZSgpLHRoaXMubGVmdD1udWxsLHRoaXMucmlnaHQuZGlzcG9zZSgpLHRoaXMucmlnaHQ9bnVsbCx0aGlzLl9zcGxpdHRlcj1udWxsLHRoaXN9LHQuU3BsaXR9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMzUpLGkoMjQpLGkoMzQpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXt0LkNvbnRleHQ9ZnVuY3Rpb24oKXt0LkVtaXR0ZXIuY2FsbCh0aGlzKTt2YXIgaT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJjb250ZXh0XCJdLHQuQ29udGV4dCk7aWYoIWkuY29udGV4dCYmKGkuY29udGV4dD1uZXcgdC5nbG9iYWwuQXVkaW9Db250ZXh0LCFpLmNvbnRleHQpKXRocm93IG5ldyBFcnJvcihcImNvdWxkIG5vdCBjcmVhdGUgQXVkaW9Db250ZXh0LiBQb3NzaWJseSB0b28gbWFueSBBdWRpb0NvbnRleHRzIHJ1bm5pbmcgYWxyZWFkeS5cIik7Zm9yKHRoaXMuX2NvbnRleHQ9aS5jb250ZXh0O3RoaXMuX2NvbnRleHQucmF3Q29udGV4dDspdGhpcy5fY29udGV4dD10aGlzLl9jb250ZXh0LnJhd0NvbnRleHQ7Zm9yKHZhciBuIGluIHRoaXMuX2NvbnRleHQpdGhpcy5fZGVmaW5lUHJvcGVydHkodGhpcy5fY29udGV4dCxuKTt0aGlzLl9sYXRlbmN5SGludD1pLmxhdGVuY3lIaW50LHRoaXMuX2NvbnN0YW50cz17fSx0aGlzLmxvb2tBaGVhZD1pLmxvb2tBaGVhZCx0aGlzLl9jb21wdXRlZFVwZGF0ZUludGVydmFsPTAsdGhpcy5fdGlja2VyPW5ldyBlKHRoaXMuZW1pdC5iaW5kKHRoaXMsXCJ0aWNrXCIpLGkuY2xvY2tTb3VyY2UsaS51cGRhdGVJbnRlcnZhbCksdGhpcy5fdGltZW91dHM9bmV3IHQuVGltZWxpbmUsdGhpcy5fdGltZW91dElkcz0wLHRoaXMub24oXCJ0aWNrXCIsdGhpcy5fdGltZW91dExvb3AuYmluZCh0aGlzKSksdGhpcy5fY29udGV4dC5vbnN0YXRlY2hhbmdlPWZ1bmN0aW9uKHQpe3RoaXMuZW1pdChcInN0YXRlY2hhbmdlXCIsdCl9LmJpbmQodGhpcyl9LHQuZXh0ZW5kKHQuQ29udGV4dCx0LkVtaXR0ZXIpLHQuRW1pdHRlci5taXhpbih0LkNvbnRleHQpLHQuQ29udGV4dC5kZWZhdWx0cz17Y2xvY2tTb3VyY2U6XCJ3b3JrZXJcIixsYXRlbmN5SGludDpcImludGVyYWN0aXZlXCIsbG9va0FoZWFkOi4xLHVwZGF0ZUludGVydmFsOi4wM30sdC5Db250ZXh0LnByb3RvdHlwZS5pc0NvbnRleHQ9ITAsdC5Db250ZXh0LnByb3RvdHlwZS5fZGVmaW5lUHJvcGVydHk9ZnVuY3Rpb24oZSxpKXt0LmlzVW5kZWYodGhpc1tpXSkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGkse2dldDpmdW5jdGlvbigpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIGVbaV0/ZVtpXS5iaW5kKGUpOmVbaV19LHNldDpmdW5jdGlvbih0KXtlW2ldPXR9fSl9LHQuQ29udGV4dC5wcm90b3R5cGUubm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRleHQuY3VycmVudFRpbWUrdGhpcy5sb29rQWhlYWR9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkNvbnRleHQucHJvdG90eXBlLFwiZGVzdGluYXRpb25cIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFzdGVyP3RoaXMubWFzdGVyOnRoaXMuX2NvbnRleHQuZGVzdGluYXRpb259fSksdC5Db250ZXh0LnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm5cInN1c3BlbmRlZFwiPT09dGhpcy5fY29udGV4dC5zdGF0ZSYmdGhpcy5fY29udGV4dCBpbnN0YW5jZW9mIEF1ZGlvQ29udGV4dD90aGlzLl9jb250ZXh0LnJlc3VtZSgpOlByb21pc2UucmVzb2x2ZSgpfSx0LkNvbnRleHQucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dmFyIGU9UHJvbWlzZS5yZXNvbHZlKCk7cmV0dXJuIHRoaXMhPT10Lmdsb2JhbC5UT05FX0FVRElPX0NPTlRFWFQmJihlPXRoaXMucmF3Q29udGV4dC5jbG9zZSgpKSxlLnRoZW4oZnVuY3Rpb24oKXt0LkNvbnRleHQuZW1pdChcImNsb3NlXCIsdGhpcyl9LmJpbmQodGhpcykpfSx0LkNvbnRleHQucHJvdG90eXBlLmdldENvbnN0YW50PWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2NvbnN0YW50c1t0XSlyZXR1cm4gdGhpcy5fY29uc3RhbnRzW3RdO2Zvcih2YXIgZT10aGlzLl9jb250ZXh0LmNyZWF0ZUJ1ZmZlcigxLDEyOCx0aGlzLl9jb250ZXh0LnNhbXBsZVJhdGUpLGk9ZS5nZXRDaGFubmVsRGF0YSgwKSxuPTA7bjxpLmxlbmd0aDtuKyspaVtuXT10O3ZhciBvPXRoaXMuX2NvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7cmV0dXJuIG8uY2hhbm5lbENvdW50PTEsby5jaGFubmVsQ291bnRNb2RlPVwiZXhwbGljaXRcIixvLmJ1ZmZlcj1lLG8ubG9vcD0hMCxvLnN0YXJ0KDApLHRoaXMuX2NvbnN0YW50c1t0XT1vLG99LHQuQ29udGV4dC5wcm90b3R5cGUuX3RpbWVvdXRMb29wPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMubm93KCk7dGhpcy5fdGltZW91dHMmJnRoaXMuX3RpbWVvdXRzLmxlbmd0aCYmdGhpcy5fdGltZW91dHMucGVlaygpLnRpbWU8PXQ7KXRoaXMuX3RpbWVvdXRzLnNoaWZ0KCkuY2FsbGJhY2soKX0sdC5Db250ZXh0LnByb3RvdHlwZS5zZXRUaW1lb3V0PWZ1bmN0aW9uKHQsZSl7dGhpcy5fdGltZW91dElkcysrO3ZhciBpPXRoaXMubm93KCk7cmV0dXJuIHRoaXMuX3RpbWVvdXRzLmFkZCh7Y2FsbGJhY2s6dCx0aW1lOmkrZSxpZDp0aGlzLl90aW1lb3V0SWRzfSksdGhpcy5fdGltZW91dElkc30sdC5Db250ZXh0LnByb3RvdHlwZS5jbGVhclRpbWVvdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3RpbWVvdXRzLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5pZD09PXQmJnRoaXMucmVtb3ZlKGUpfSksdGhpc30sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQ29udGV4dC5wcm90b3R5cGUsXCJ1cGRhdGVJbnRlcnZhbFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGlja2VyLnVwZGF0ZUludGVydmFsfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fdGlja2VyLnVwZGF0ZUludGVydmFsPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQ29udGV4dC5wcm90b3R5cGUsXCJyYXdDb250ZXh0XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb250ZXh0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkNvbnRleHQucHJvdG90eXBlLFwiY2xvY2tTb3VyY2VcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpY2tlci50eXBlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fdGlja2VyLnR5cGU9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5Db250ZXh0LnByb3RvdHlwZSxcImxhdGVuY3lIaW50XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYXRlbmN5SGludH0sc2V0OmZ1bmN0aW9uKGUpe3ZhciBpPWU7aWYodGhpcy5fbGF0ZW5jeUhpbnQ9ZSx0LmlzU3RyaW5nKGUpKXN3aXRjaChlKXtjYXNlXCJpbnRlcmFjdGl2ZVwiOmk9LjEsdGhpcy5fY29udGV4dC5sYXRlbmN5SGludD1lO2JyZWFrO2Nhc2VcInBsYXliYWNrXCI6aT0uOCx0aGlzLl9jb250ZXh0LmxhdGVuY3lIaW50PWU7YnJlYWs7Y2FzZVwiYmFsYW5jZWRcIjppPS4yNSx0aGlzLl9jb250ZXh0LmxhdGVuY3lIaW50PWU7YnJlYWs7Y2FzZVwiZmFzdGVzdFwiOnRoaXMuX2NvbnRleHQubGF0ZW5jeUhpbnQ9XCJpbnRlcmFjdGl2ZVwiLGk9LjAxfXRoaXMubG9va0FoZWFkPWksdGhpcy51cGRhdGVJbnRlcnZhbD1pLzN9fSksdC5Db250ZXh0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvc2UoKS50aGVuKGZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHQuRW1pdHRlci5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3RpY2tlci5kaXNwb3NlKCksdGhpcy5fdGlja2VyPW51bGwsdGhpcy5fdGltZW91dHMuZGlzcG9zZSgpLHRoaXMuX3RpbWVvdXRzPW51bGwsdGhpcy5fY29uc3RhbnRzKXRoaXMuX2NvbnN0YW50c1tlXS5kaXNjb25uZWN0KCk7dGhpcy5fY29uc3RhbnRzPW51bGx9LmJpbmQodGhpcykpfTt2YXIgZT1mdW5jdGlvbihlLGksbil7dGhpcy5fdHlwZT1pLHRoaXMuX3VwZGF0ZUludGVydmFsPW4sdGhpcy5fY2FsbGJhY2s9dC5kZWZhdWx0QXJnKGUsdC5ub09wKSx0aGlzLl9jcmVhdGVDbG9jaygpfTtpZihlLlR5cGU9e1dvcmtlcjpcIndvcmtlclwiLFRpbWVvdXQ6XCJ0aW1lb3V0XCIsT2ZmbGluZTpcIm9mZmxpbmVcIn0sZS5wcm90b3R5cGUuX2NyZWF0ZVdvcmtlcj1mdW5jdGlvbigpe3QuZ2xvYmFsLlVSTD10Lmdsb2JhbC5VUkx8fHQuZ2xvYmFsLndlYmtpdFVSTDt2YXIgZT1uZXcgQmxvYihbXCJ2YXIgdGltZW91dFRpbWUgPSBcIisoMWUzKnRoaXMuX3VwZGF0ZUludGVydmFsKS50b0ZpeGVkKDEpK1wiO3NlbGYub25tZXNzYWdlID0gZnVuY3Rpb24obXNnKXtcXHR0aW1lb3V0VGltZSA9IHBhcnNlSW50KG1zZy5kYXRhKTt9O2Z1bmN0aW9uIHRpY2soKXtcXHRzZXRUaW1lb3V0KHRpY2ssIHRpbWVvdXRUaW1lKTtcXHRzZWxmLnBvc3RNZXNzYWdlKCd0aWNrJyk7fXRpY2soKTtcIl0pLGk9VVJMLmNyZWF0ZU9iamVjdFVSTChlKSxuPW5ldyBXb3JrZXIoaSk7bi5vbm1lc3NhZ2U9dGhpcy5fY2FsbGJhY2suYmluZCh0aGlzKSx0aGlzLl93b3JrZXI9bn0sZS5wcm90b3R5cGUuX2NyZWF0ZVRpbWVvdXQ9ZnVuY3Rpb24oKXt0aGlzLl90aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLl9jcmVhdGVUaW1lb3V0KCksdGhpcy5fY2FsbGJhY2soKX0uYmluZCh0aGlzKSwxZTMqdGhpcy5fdXBkYXRlSW50ZXJ2YWwpfSxlLnByb3RvdHlwZS5fY3JlYXRlQ2xvY2s9ZnVuY3Rpb24oKXtpZih0aGlzLl90eXBlPT09ZS5UeXBlLldvcmtlcil0cnl7dGhpcy5fY3JlYXRlV29ya2VyKCl9Y2F0Y2godCl7dGhpcy5fdHlwZT1lLlR5cGUuVGltZW91dCx0aGlzLl9jcmVhdGVDbG9jaygpfWVsc2UgdGhpcy5fdHlwZT09PWUuVHlwZS5UaW1lb3V0JiZ0aGlzLl9jcmVhdGVUaW1lb3V0KCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcInVwZGF0ZUludGVydmFsXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl91cGRhdGVJbnRlcnZhbH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3VwZGF0ZUludGVydmFsPU1hdGgubWF4KHQsMTI4LzQ0MTAwKSx0aGlzLl90eXBlPT09ZS5UeXBlLldvcmtlciYmdGhpcy5fd29ya2VyLnBvc3RNZXNzYWdlKE1hdGgubWF4KDFlMyp0LDEpKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJ0eXBlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90eXBlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fZGlzcG9zZUNsb2NrKCksdGhpcy5fdHlwZT10LHRoaXMuX2NyZWF0ZUNsb2NrKCl9fSksZS5wcm90b3R5cGUuX2Rpc3Bvc2VDbG9jaz1mdW5jdGlvbigpe3RoaXMuX3RpbWVvdXQmJihjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCksdGhpcy5fdGltZW91dD1udWxsKSx0aGlzLl93b3JrZXImJih0aGlzLl93b3JrZXIudGVybWluYXRlKCksdGhpcy5fd29ya2VyLm9ubWVzc2FnZT1udWxsLHRoaXMuX3dvcmtlcj1udWxsKX0sZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuX2Rpc3Bvc2VDbG9jaygpLHRoaXMuX2NhbGxiYWNrPW51bGx9LHQuZ2V0Q29udGV4dChmdW5jdGlvbigpe3ZhciBlPUF1ZGlvTm9kZS5wcm90b3R5cGUuY29ubmVjdCxpPUF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzY29ubmVjdDtmdW5jdGlvbiBuKGksbixvKXtpZihpLmlucHV0KXJldHVybiBvPXQuZGVmYXVsdEFyZyhvLDApLHQuaXNBcnJheShpLmlucHV0KT90aGlzLmNvbm5lY3QoaS5pbnB1dFtvXSk6dGhpcy5jb25uZWN0KGkuaW5wdXQsbixvKTt0cnl7cmV0dXJuIGkgaW5zdGFuY2VvZiBBdWRpb05vZGU/KGUuY2FsbCh0aGlzLGksbixvKSxpKTooZS5jYWxsKHRoaXMsaSxuKSxpKX1jYXRjaCh0KXt0aHJvdyBuZXcgRXJyb3IoXCJlcnJvciBjb25uZWN0aW5nIHRvIG5vZGU6IFwiK2krXCJcXG5cIit0KX19QXVkaW9Ob2RlLnByb3RvdHlwZS5jb25uZWN0IT09biYmKEF1ZGlvTm9kZS5wcm90b3R5cGUuY29ubmVjdD1uLEF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzY29ubmVjdD1mdW5jdGlvbihlLG4sbyl7aWYoZSYmZS5pbnB1dCYmdC5pc0FycmF5KGUuaW5wdXQpKW89dC5kZWZhdWx0QXJnKG8sMCksdGhpcy5kaXNjb25uZWN0KGUuaW5wdXRbb10sbiwwKTtlbHNlIGlmKGUmJmUuaW5wdXQpdGhpcy5kaXNjb25uZWN0KGUuaW5wdXQsbixvKTtlbHNlIHRyeXtlIGluc3RhbmNlb2YgQXVkaW9QYXJhbT9pLmNhbGwodGhpcyxlLG4pOmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfWNhdGNoKHQpe3Rocm93IG5ldyBFcnJvcihcImVycm9yIGRpc2Nvbm5lY3Rpbmcgbm9kZTogXCIrZStcIlxcblwiK3QpfX0pfSksdC5zdXBwb3J0ZWQmJiF0LmluaXRpYWxpemVkKXtpZih0Lmdsb2JhbC5UT05FX0FVRElPX0NPTlRFWFR8fCh0Lmdsb2JhbC5UT05FX0FVRElPX0NPTlRFWFQ9bmV3IHQuQ29udGV4dCksdC5jb250ZXh0PXQuZ2xvYmFsLlRPTkVfQVVESU9fQ09OVEVYVCwhdC5nbG9iYWwuVE9ORV9TSUxFTkNFX1ZFUlNJT05fTE9HR0lORyl7dmFyIGk9XCJ2XCI7XCJkZXZcIj09PXQudmVyc2lvbiYmKGk9XCJcIik7dmFyIG49XCIgKiBUb25lLmpzIFwiK2krdC52ZXJzaW9uK1wiICogXCI7Y29uc29sZS5sb2coXCIlY1wiK24sXCJiYWNrZ3JvdW5kOiAjMDAwOyBjb2xvcjogI2ZmZlwiKX19ZWxzZSB0LnN1cHBvcnRlZHx8Y29uc29sZS53YXJuKFwiVGhpcyBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgVG9uZS5qc1wiKTtyZXR1cm4gdC5Db250ZXh0fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDQpLGkoNDApXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5JbnN0cnVtZW50PWZ1bmN0aW9uKGUpe2U9dC5kZWZhdWx0QXJnKGUsdC5JbnN0cnVtZW50LmRlZmF1bHRzKSx0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLHRoaXMuX3ZvbHVtZT10aGlzLm91dHB1dD1uZXcgdC5Wb2x1bWUoZS52b2x1bWUpLHRoaXMudm9sdW1lPXRoaXMuX3ZvbHVtZS52b2x1bWUsdGhpcy5fcmVhZE9ubHkoXCJ2b2x1bWVcIiksdGhpcy5fc2NoZWR1bGVkRXZlbnRzPVtdfSx0LmV4dGVuZCh0Lkluc3RydW1lbnQsdC5BdWRpb05vZGUpLHQuSW5zdHJ1bWVudC5kZWZhdWx0cz17dm9sdW1lOjB9LHQuSW5zdHJ1bWVudC5wcm90b3R5cGUudHJpZ2dlckF0dGFjaz10Lm5vT3AsdC5JbnN0cnVtZW50LnByb3RvdHlwZS50cmlnZ2VyUmVsZWFzZT10Lm5vT3AsdC5JbnN0cnVtZW50LnByb3RvdHlwZS5zeW5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N5bmNNZXRob2QoXCJ0cmlnZ2VyQXR0YWNrXCIsMSksdGhpcy5fc3luY01ldGhvZChcInRyaWdnZXJSZWxlYXNlXCIsMCksdGhpc30sdC5JbnN0cnVtZW50LnByb3RvdHlwZS5fc3luY01ldGhvZD1mdW5jdGlvbihlLGkpe3ZhciBuPXRoaXNbXCJfb3JpZ2luYWxfXCIrZV09dGhpc1tlXTt0aGlzW2VdPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSxvPWVbaV0scz10LlRyYW5zcG9ydC5zY2hlZHVsZShmdW5jdGlvbih0KXtlW2ldPXQsbi5hcHBseSh0aGlzLGUpfS5iaW5kKHRoaXMpLG8pO3RoaXMuX3NjaGVkdWxlZEV2ZW50cy5wdXNoKHMpfS5iaW5kKHRoaXMpfSx0Lkluc3RydW1lbnQucHJvdG90eXBlLnVuc3luYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY2hlZHVsZWRFdmVudHMuZm9yRWFjaChmdW5jdGlvbihlKXt0LlRyYW5zcG9ydC5jbGVhcihlKX0pLHRoaXMuX3NjaGVkdWxlZEV2ZW50cz1bXSx0aGlzLl9vcmlnaW5hbF90cmlnZ2VyQXR0YWNrJiYodGhpcy50cmlnZ2VyQXR0YWNrPXRoaXMuX29yaWdpbmFsX3RyaWdnZXJBdHRhY2ssdGhpcy50cmlnZ2VyUmVsZWFzZT10aGlzLl9vcmlnaW5hbF90cmlnZ2VyUmVsZWFzZSksdGhpc30sdC5JbnN0cnVtZW50LnByb3RvdHlwZS50cmlnZ2VyQXR0YWNrUmVsZWFzZT1mdW5jdGlvbih0LGUsaSxuKXtyZXR1cm4gaT10aGlzLnRvU2Vjb25kcyhpKSxlPXRoaXMudG9TZWNvbmRzKGUpLHRoaXMudHJpZ2dlckF0dGFjayh0LGksbiksdGhpcy50cmlnZ2VyUmVsZWFzZShpK2UpLHRoaXN9LHQuSW5zdHJ1bWVudC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3ZvbHVtZS5kaXNwb3NlKCksdGhpcy5fdm9sdW1lPW51bGwsdGhpcy5fd3JpdGFibGUoW1widm9sdW1lXCJdKSx0aGlzLnZvbHVtZT1udWxsLHRoaXMudW5zeW5jKCksdGhpcy5fc2NoZWR1bGVkRXZlbnRzPW51bGwsdGhpc30sdC5JbnN0cnVtZW50fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDcpLGkoMSldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkF1ZGlvVG9HYWluPWZ1bmN0aW9uKCl7dC5TaWduYWxCYXNlLmNhbGwodGhpcyksdGhpcy5fbm9ybT10aGlzLmlucHV0PXRoaXMub3V0cHV0PW5ldyB0LldhdmVTaGFwZXIoZnVuY3Rpb24odCl7cmV0dXJuKHQrMSkvMn0pfSx0LmV4dGVuZCh0LkF1ZGlvVG9HYWluLHQuU2lnbmFsQmFzZSksdC5BdWRpb1RvR2Fpbi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LlNpZ25hbEJhc2UucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9ub3JtLmRpc3Bvc2UoKSx0aGlzLl9ub3JtPW51bGwsdGhpc30sdC5BdWRpb1RvR2Fpbn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxKSxpKDEzKSxpKDkzKSxpKDMpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkNyb3NzRmFkZT1mdW5jdGlvbihlKXt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLHRoaXMuY3JlYXRlSW5zT3V0cygyLDEpLHRoaXMuYT10aGlzLmlucHV0WzBdPW5ldyB0LkdhaW4sdGhpcy5iPXRoaXMuaW5wdXRbMV09bmV3IHQuR2Fpbix0aGlzLmZhZGU9bmV3IHQuU2lnbmFsKHQuZGVmYXVsdEFyZyhlLC41KSx0LlR5cGUuTm9ybWFsUmFuZ2UpLHRoaXMuX2VxdWFsUG93ZXJBPW5ldyB0LkVxdWFsUG93ZXJHYWluLHRoaXMuX2VxdWFsUG93ZXJCPW5ldyB0LkVxdWFsUG93ZXJHYWluLHRoaXMuX29uZT10aGlzLmNvbnRleHQuZ2V0Q29uc3RhbnQoMSksdGhpcy5faW52ZXJ0PW5ldyB0LlN1YnRyYWN0LHRoaXMuYS5jb25uZWN0KHRoaXMub3V0cHV0KSx0aGlzLmIuY29ubmVjdCh0aGlzLm91dHB1dCksdGhpcy5mYWRlLmNoYWluKHRoaXMuX2VxdWFsUG93ZXJCLHRoaXMuYi5nYWluKSx0aGlzLl9vbmUuY29ubmVjdCh0aGlzLl9pbnZlcnQsMCwwKSx0aGlzLmZhZGUuY29ubmVjdCh0aGlzLl9pbnZlcnQsMCwxKSx0aGlzLl9pbnZlcnQuY2hhaW4odGhpcy5fZXF1YWxQb3dlckEsdGhpcy5hLmdhaW4pLHRoaXMuX3JlYWRPbmx5KFwiZmFkZVwiKX0sdC5leHRlbmQodC5Dcm9zc0ZhZGUsdC5BdWRpb05vZGUpLHQuQ3Jvc3NGYWRlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fd3JpdGFibGUoXCJmYWRlXCIpLHRoaXMuX2VxdWFsUG93ZXJBLmRpc3Bvc2UoKSx0aGlzLl9lcXVhbFBvd2VyQT1udWxsLHRoaXMuX2VxdWFsUG93ZXJCLmRpc3Bvc2UoKSx0aGlzLl9lcXVhbFBvd2VyQj1udWxsLHRoaXMuZmFkZS5kaXNwb3NlKCksdGhpcy5mYWRlPW51bGwsdGhpcy5faW52ZXJ0LmRpc3Bvc2UoKSx0aGlzLl9pbnZlcnQ9bnVsbCx0aGlzLl9vbmU9bnVsbCx0aGlzLmEuZGlzcG9zZSgpLHRoaXMuYT1udWxsLHRoaXMuYi5kaXNwb3NlKCksdGhpcy5iPW51bGwsdGhpc30sdC5Dcm9zc0ZhZGV9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5UaW1lbGluZT1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcIm1lbW9yeVwiXSx0LlRpbWVsaW5lKTt0LmNhbGwodGhpcyksdGhpcy5fdGltZWxpbmU9W10sdGhpcy5tZW1vcnk9ZS5tZW1vcnl9LHQuZXh0ZW5kKHQuVGltZWxpbmUpLHQuVGltZWxpbmUuZGVmYXVsdHM9e21lbW9yeToxLzB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRpbWVsaW5lLnByb3RvdHlwZSxcImxlbmd0aFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGltZWxpbmUubGVuZ3RofX0pLHQuVGltZWxpbmUucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXtpZih0LmlzVW5kZWYoZS50aW1lKSl0aHJvdyBuZXcgRXJyb3IoXCJUb25lLlRpbWVsaW5lOiBldmVudHMgbXVzdCBoYXZlIGEgdGltZSBhdHRyaWJ1dGVcIik7ZS50aW1lPWUudGltZS52YWx1ZU9mKCk7dmFyIGk9dGhpcy5fc2VhcmNoKGUudGltZSk7aWYodGhpcy5fdGltZWxpbmUuc3BsaWNlKGkrMSwwLGUpLHRoaXMubGVuZ3RoPnRoaXMubWVtb3J5KXt2YXIgbj10aGlzLmxlbmd0aC10aGlzLm1lbW9yeTt0aGlzLl90aW1lbGluZS5zcGxpY2UoMCxuKX1yZXR1cm4gdGhpc30sdC5UaW1lbGluZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3RpbWVsaW5lLmluZGV4T2YodCk7cmV0dXJuLTEhPT1lJiZ0aGlzLl90aW1lbGluZS5zcGxpY2UoZSwxKSx0aGlzfSx0LlRpbWVsaW5lLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZSxpKXtpPXQuZGVmYXVsdEFyZyhpLFwidGltZVwiKTt2YXIgbj10aGlzLl9zZWFyY2goZSxpKTtyZXR1cm4tMSE9PW4/dGhpcy5fdGltZWxpbmVbbl06bnVsbH0sdC5UaW1lbGluZS5wcm90b3R5cGUucGVlaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90aW1lbGluZVswXX0sdC5UaW1lbGluZS5wcm90b3R5cGUuc2hpZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGltZWxpbmUuc2hpZnQoKX0sdC5UaW1lbGluZS5wcm90b3R5cGUuZ2V0QWZ0ZXI9ZnVuY3Rpb24oZSxpKXtpPXQuZGVmYXVsdEFyZyhpLFwidGltZVwiKTt2YXIgbj10aGlzLl9zZWFyY2goZSxpKTtyZXR1cm4gbisxPHRoaXMuX3RpbWVsaW5lLmxlbmd0aD90aGlzLl90aW1lbGluZVtuKzFdOm51bGx9LHQuVGltZWxpbmUucHJvdG90eXBlLmdldEJlZm9yZT1mdW5jdGlvbihlLGkpe2k9dC5kZWZhdWx0QXJnKGksXCJ0aW1lXCIpO3ZhciBuPXRoaXMuX3RpbWVsaW5lLmxlbmd0aDtpZihuPjAmJnRoaXMuX3RpbWVsaW5lW24tMV1baV08ZSlyZXR1cm4gdGhpcy5fdGltZWxpbmVbbi0xXTt2YXIgbz10aGlzLl9zZWFyY2goZSxpKTtyZXR1cm4gby0xPj0wP3RoaXMuX3RpbWVsaW5lW28tMV06bnVsbH0sdC5UaW1lbGluZS5wcm90b3R5cGUuY2FuY2VsPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX3RpbWVsaW5lLmxlbmd0aD4xKXt2YXIgZT10aGlzLl9zZWFyY2godCk7aWYoZT49MClpZih0aGlzLl90aW1lbGluZVtlXS50aW1lPT09dCl7Zm9yKHZhciBpPWU7aT49MCYmdGhpcy5fdGltZWxpbmVbaV0udGltZT09PXQ7aS0tKWU9aTt0aGlzLl90aW1lbGluZT10aGlzLl90aW1lbGluZS5zbGljZSgwLGUpfWVsc2UgdGhpcy5fdGltZWxpbmU9dGhpcy5fdGltZWxpbmUuc2xpY2UoMCxlKzEpO2Vsc2UgdGhpcy5fdGltZWxpbmU9W119ZWxzZSAxPT09dGhpcy5fdGltZWxpbmUubGVuZ3RoJiZ0aGlzLl90aW1lbGluZVswXS50aW1lPj10JiYodGhpcy5fdGltZWxpbmU9W10pO3JldHVybiB0aGlzfSx0LlRpbWVsaW5lLnByb3RvdHlwZS5jYW5jZWxCZWZvcmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fc2VhcmNoKHQpO3JldHVybiBlPj0wJiYodGhpcy5fdGltZWxpbmU9dGhpcy5fdGltZWxpbmUuc2xpY2UoZSsxKSksdGhpc30sdC5UaW1lbGluZS5wcm90b3R5cGUucHJldmlvdXNFdmVudD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl90aW1lbGluZS5pbmRleE9mKHQpO3JldHVybiBlPjA/dGhpcy5fdGltZWxpbmVbZS0xXTpudWxsfSx0LlRpbWVsaW5lLnByb3RvdHlwZS5fc2VhcmNoPWZ1bmN0aW9uKGUsaSl7aWYoMD09PXRoaXMuX3RpbWVsaW5lLmxlbmd0aClyZXR1cm4tMTtpPXQuZGVmYXVsdEFyZyhpLFwidGltZVwiKTt2YXIgbj0wLG89dGhpcy5fdGltZWxpbmUubGVuZ3RoLHM9bztpZihvPjAmJnRoaXMuX3RpbWVsaW5lW28tMV1baV08PWUpcmV0dXJuIG8tMTtmb3IoO248czspe3ZhciByPU1hdGguZmxvb3Iobisocy1uKS8yKSxhPXRoaXMuX3RpbWVsaW5lW3JdLGw9dGhpcy5fdGltZWxpbmVbcisxXTtpZihhW2ldPT09ZSl7Zm9yKHZhciBoPXI7aDx0aGlzLl90aW1lbGluZS5sZW5ndGg7aCsrKXt0aGlzLl90aW1lbGluZVtoXVtpXT09PWUmJihyPWgpfXJldHVybiByfWlmKGFbaV08ZSYmbFtpXT5lKXJldHVybiByO2FbaV0+ZT9zPXI6bj1yKzF9cmV0dXJuLTF9LHQuVGltZWxpbmUucHJvdG90eXBlLl9pdGVyYXRlPWZ1bmN0aW9uKGUsaSxuKXtpPXQuZGVmYXVsdEFyZyhpLDApLG49dC5kZWZhdWx0QXJnKG4sdGhpcy5fdGltZWxpbmUubGVuZ3RoLTEpLHRoaXMuX3RpbWVsaW5lLnNsaWNlKGksbisxKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UuY2FsbCh0aGlzLHQpfS5iaW5kKHRoaXMpKX0sdC5UaW1lbGluZS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faXRlcmF0ZSh0KSx0aGlzfSx0LlRpbWVsaW5lLnByb3RvdHlwZS5mb3JFYWNoQmVmb3JlPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fc2VhcmNoKHQpO3JldHVybi0xIT09aSYmdGhpcy5faXRlcmF0ZShlLDAsaSksdGhpc30sdC5UaW1lbGluZS5wcm90b3R5cGUuZm9yRWFjaEFmdGVyPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fc2VhcmNoKHQpO3JldHVybiB0aGlzLl9pdGVyYXRlKGUsaSsxKSx0aGlzfSx0LlRpbWVsaW5lLnByb3RvdHlwZS5mb3JFYWNoQmV0d2Vlbj1mdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5fc2VhcmNoKHQpLG89dGhpcy5fc2VhcmNoKGUpO3JldHVybi0xIT09biYmLTEhPT1vPyh0aGlzLl90aW1lbGluZVtuXS50aW1lIT09dCYmKG4rPTEpLHRoaXMuX3RpbWVsaW5lW29dLnRpbWU9PT1lJiYoby09MSksdGhpcy5faXRlcmF0ZShpLG4sbykpOi0xPT09biYmdGhpcy5faXRlcmF0ZShpLDAsbyksdGhpc30sdC5UaW1lbGluZS5wcm90b3R5cGUuZm9yRWFjaEZyb209ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9dGhpcy5fc2VhcmNoKHQpO2k+PTAmJnRoaXMuX3RpbWVsaW5lW2ldLnRpbWU+PXQ7KWktLTtyZXR1cm4gdGhpcy5faXRlcmF0ZShlLGkrMSksdGhpc30sdC5UaW1lbGluZS5wcm90b3R5cGUuZm9yRWFjaEF0VGltZT1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX3NlYXJjaCh0KTtyZXR1cm4tMSE9PWkmJnRoaXMuX2l0ZXJhdGUoZnVuY3Rpb24oaSl7aS50aW1lPT09dCYmZS5jYWxsKHRoaXMsaSl9LDAsaSksdGhpc30sdC5UaW1lbGluZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fdGltZWxpbmU9bnVsbCx0aGlzfSx0LlRpbWVsaW5lfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDIxKSxpKDEpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5Nb25vcGhvbmljPWZ1bmN0aW9uKGUpe2U9dC5kZWZhdWx0QXJnKGUsdC5Nb25vcGhvbmljLmRlZmF1bHRzKSx0Lkluc3RydW1lbnQuY2FsbCh0aGlzLGUpLHRoaXMucG9ydGFtZW50bz1lLnBvcnRhbWVudG99LHQuZXh0ZW5kKHQuTW9ub3Bob25pYyx0Lkluc3RydW1lbnQpLHQuTW9ub3Bob25pYy5kZWZhdWx0cz17cG9ydGFtZW50bzowfSx0Lk1vbm9waG9uaWMucHJvdG90eXBlLnRyaWdnZXJBdHRhY2s9ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLmxvZyhcInRyaWdnZXJBdHRhY2tcIix0LGUsaSksZT10aGlzLnRvU2Vjb25kcyhlKSx0aGlzLl90cmlnZ2VyRW52ZWxvcGVBdHRhY2soZSxpKSx0aGlzLnNldE5vdGUodCxlKSx0aGlzfSx0Lk1vbm9waG9uaWMucHJvdG90eXBlLnRyaWdnZXJSZWxlYXNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxvZyhcInRyaWdnZXJSZWxlYXNlXCIsdCksdD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl90cmlnZ2VyRW52ZWxvcGVSZWxlYXNlKHQpLHRoaXN9LHQuTW9ub3Bob25pYy5wcm90b3R5cGUuX3RyaWdnZXJFbnZlbG9wZUF0dGFjaz1mdW5jdGlvbigpe30sdC5Nb25vcGhvbmljLnByb3RvdHlwZS5fdHJpZ2dlckVudmVsb3BlUmVsZWFzZT1mdW5jdGlvbigpe30sdC5Nb25vcGhvbmljLnByb3RvdHlwZS5nZXRMZXZlbEF0VGltZT1mdW5jdGlvbih0KXtyZXR1cm4gdD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLmVudmVsb3BlLmdldFZhbHVlQXRUaW1lKHQpfSx0Lk1vbm9waG9uaWMucHJvdG90eXBlLnNldE5vdGU9ZnVuY3Rpb24odCxlKXtpZihlPXRoaXMudG9TZWNvbmRzKGUpLHRoaXMucG9ydGFtZW50bz4wJiZ0aGlzLmdldExldmVsQXRUaW1lKGUpPi4wNSl7dmFyIGk9dGhpcy50b1NlY29uZHModGhpcy5wb3J0YW1lbnRvKTt0aGlzLmZyZXF1ZW5jeS5leHBvbmVudGlhbFJhbXBUbyh0LGksZSl9ZWxzZSB0aGlzLmZyZXF1ZW5jeS5zZXRWYWx1ZUF0VGltZSh0LGUpO3JldHVybiB0aGlzfSx0Lk1vbm9waG9uaWN9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMjkpLGkoNSksaSgxKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuU2NhbGU9ZnVuY3Rpb24oZSxpKXt0LlNpZ25hbEJhc2UuY2FsbCh0aGlzKSx0aGlzLl9vdXRwdXRNaW49dC5kZWZhdWx0QXJnKGUsMCksdGhpcy5fb3V0cHV0TWF4PXQuZGVmYXVsdEFyZyhpLDEpLHRoaXMuX3NjYWxlPXRoaXMuaW5wdXQ9bmV3IHQuTXVsdGlwbHkoMSksdGhpcy5fYWRkPXRoaXMub3V0cHV0PW5ldyB0LkFkZCgwKSx0aGlzLl9zY2FsZS5jb25uZWN0KHRoaXMuX2FkZCksdGhpcy5fc2V0UmFuZ2UoKX0sdC5leHRlbmQodC5TY2FsZSx0LlNpZ25hbEJhc2UpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlNjYWxlLnByb3RvdHlwZSxcIm1pblwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3V0cHV0TWlufSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fb3V0cHV0TWluPXQsdGhpcy5fc2V0UmFuZ2UoKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5TY2FsZS5wcm90b3R5cGUsXCJtYXhcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX291dHB1dE1heH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX291dHB1dE1heD10LHRoaXMuX3NldFJhbmdlKCl9fSksdC5TY2FsZS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKCl7dGhpcy5fYWRkLnZhbHVlPXRoaXMuX291dHB1dE1pbix0aGlzLl9zY2FsZS52YWx1ZT10aGlzLl9vdXRwdXRNYXgtdGhpcy5fb3V0cHV0TWlufSx0LlNjYWxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU2lnbmFsQmFzZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX2FkZC5kaXNwb3NlKCksdGhpcy5fYWRkPW51bGwsdGhpcy5fc2NhbGUuZGlzcG9zZSgpLHRoaXMuX3NjYWxlPW51bGwsdGhpc30sdC5TY2FsZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxKSxpKDMpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlZvbHVtZT1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcInZvbHVtZVwiXSx0LlZvbHVtZSk7dC5BdWRpb05vZGUuY2FsbCh0aGlzLGUpLHRoaXMub3V0cHV0PXRoaXMuaW5wdXQ9bmV3IHQuR2FpbihlLnZvbHVtZSx0LlR5cGUuRGVjaWJlbHMpLHRoaXMuX3VubXV0ZWRWb2x1bWU9ZS52b2x1bWUsdGhpcy52b2x1bWU9dGhpcy5vdXRwdXQuZ2Fpbix0aGlzLl9yZWFkT25seShcInZvbHVtZVwiKSx0aGlzLm11dGU9ZS5tdXRlfSx0LmV4dGVuZCh0LlZvbHVtZSx0LkF1ZGlvTm9kZSksdC5Wb2x1bWUuZGVmYXVsdHM9e3ZvbHVtZTowLG11dGU6ITF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlZvbHVtZS5wcm90b3R5cGUsXCJtdXRlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZvbHVtZS52YWx1ZT09PS0xLzB9LHNldDpmdW5jdGlvbih0KXshdGhpcy5tdXRlJiZ0Pyh0aGlzLl91bm11dGVkVm9sdW1lPXRoaXMudm9sdW1lLnZhbHVlLHRoaXMudm9sdW1lLnZhbHVlPS0xLzApOnRoaXMubXV0ZSYmIXQmJih0aGlzLnZvbHVtZS52YWx1ZT10aGlzLl91bm11dGVkVm9sdW1lKX19KSx0LlZvbHVtZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlucHV0LmRpc3Bvc2UoKSx0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFwidm9sdW1lXCIpLHRoaXMudm9sdW1lLmRpc3Bvc2UoKSx0aGlzLnZvbHVtZT1udWxsLHRoaXN9LHQuVm9sdW1lfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDMpLGkoMzYpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtyZXR1cm4gdC5aZXJvPWZ1bmN0aW9uKCl7dC5TaWduYWxCYXNlLmNhbGwodGhpcyksdGhpcy5fZ2Fpbj10aGlzLmlucHV0PXRoaXMub3V0cHV0PW5ldyB0LkdhaW4sdGhpcy5jb250ZXh0LmdldENvbnN0YW50KDApLmNvbm5lY3QodGhpcy5fZ2Fpbil9LHQuZXh0ZW5kKHQuWmVybyx0LlNpZ25hbEJhc2UpLHQuWmVyby5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LlNpZ25hbEJhc2UucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9nYWluLmRpc3Bvc2UoKSx0aGlzLl9nYWluPW51bGwsdGhpc30sdC5aZXJvfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDEpLGkoMyldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkFkZD1mdW5jdGlvbihlKXt0LlNpZ25hbC5jYWxsKHRoaXMpLHRoaXMuY3JlYXRlSW5zT3V0cygyLDApLHRoaXMuX3N1bT10aGlzLmlucHV0WzBdPXRoaXMuaW5wdXRbMV09dGhpcy5vdXRwdXQ9bmV3IHQuR2Fpbix0aGlzLl9wYXJhbT10aGlzLmlucHV0WzFdPW5ldyB0LlNpZ25hbChlKSx0aGlzLl9wYXJhbS5jb25uZWN0KHRoaXMuX3N1bSksdGhpcy5wcm94eT0hMX0sdC5leHRlbmQodC5BZGQsdC5TaWduYWwpLHQuQWRkLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU2lnbmFsLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fc3VtLmRpc3Bvc2UoKSx0aGlzLl9zdW09bnVsbCx0aGlzfSx0LkFkZH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg0NyksaSgzKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuQW1wbGl0dWRlRW52ZWxvcGU9ZnVuY3Rpb24oKXt0LkVudmVsb3BlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmlucHV0PXRoaXMub3V0cHV0PW5ldyB0LkdhaW4sdGhpcy5fc2lnLmNvbm5lY3QodGhpcy5vdXRwdXQuZ2Fpbil9LHQuZXh0ZW5kKHQuQW1wbGl0dWRlRW52ZWxvcGUsdC5FbnZlbG9wZSksdC5BbXBsaXR1ZGVFbnZlbG9wZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkVudmVsb3BlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpc30sdC5BbXBsaXR1ZGVFbnZlbG9wZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxMSksaSg2KSxpKDMpLGkoMiksaSg2MyldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe3JldHVybiB0LkJ1ZmZlclNvdXJjZT1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcImJ1ZmZlclwiLFwib25sb2FkXCJdLHQuQnVmZmVyU291cmNlKTt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMsZSksdGhpcy5vbmVuZGVkPWUub25lbmRlZCx0aGlzLl9zdGFydFRpbWU9LTEsdGhpcy5fc291cmNlU3RhcnRlZD0hMSx0aGlzLl9zb3VyY2VTdG9wcGVkPSExLHRoaXMuX3N0b3BUaW1lPS0xLHRoaXMuX2dhaW5Ob2RlPXRoaXMub3V0cHV0PW5ldyB0LkdhaW4oMCksdGhpcy5fc291cmNlPXRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXJTb3VyY2UoKSx0aGlzLl9zb3VyY2UuY29ubmVjdCh0aGlzLl9nYWluTm9kZSksdGhpcy5fc291cmNlLm9uZW5kZWQ9dGhpcy5fb25lbmRlZC5iaW5kKHRoaXMpLHRoaXMuX2J1ZmZlcj1uZXcgdC5CdWZmZXIoZS5idWZmZXIsZS5vbmxvYWQpLHRoaXMucGxheWJhY2tSYXRlPW5ldyB0LlBhcmFtKHtwYXJhbTp0aGlzLl9zb3VyY2UucGxheWJhY2tSYXRlLHVuaXRzOnQuVHlwZS5Qb3NpdGl2ZSx2YWx1ZTplLnBsYXliYWNrUmF0ZX0pLHRoaXMuZmFkZUluPWUuZmFkZUluLHRoaXMuZmFkZU91dD1lLmZhZGVPdXQsdGhpcy5jdXJ2ZT1lLmN1cnZlLHRoaXMuX29uZW5kZWRUaW1lb3V0PS0xLHRoaXMubG9vcD1lLmxvb3AsdGhpcy5sb29wU3RhcnQ9ZS5sb29wU3RhcnQsdGhpcy5sb29wRW5kPWUubG9vcEVuZH0sdC5leHRlbmQodC5CdWZmZXJTb3VyY2UsdC5BdWRpb05vZGUpLHQuQnVmZmVyU291cmNlLmRlZmF1bHRzPXtvbmVuZGVkOnQubm9PcCxvbmxvYWQ6dC5ub09wLGxvb3A6ITEsbG9vcFN0YXJ0OjAsbG9vcEVuZDowLGZhZGVJbjowLGZhZGVPdXQ6MCxjdXJ2ZTpcImxpbmVhclwiLHBsYXliYWNrUmF0ZToxfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5CdWZmZXJTb3VyY2UucHJvdG90eXBlLFwic3RhdGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0U3RhdGVBdFRpbWUodGhpcy5ub3coKSl9fSksdC5CdWZmZXJTb3VyY2UucHJvdG90eXBlLmdldFN0YXRlQXRUaW1lPWZ1bmN0aW9uKGUpe3JldHVybiBlPXRoaXMudG9TZWNvbmRzKGUpLC0xIT09dGhpcy5fc3RhcnRUaW1lJiZ0aGlzLl9zdGFydFRpbWU8PWUmJigtMT09PXRoaXMuX3N0b3BUaW1lfHxlPHRoaXMuX3N0b3BUaW1lKSYmIXRoaXMuX3NvdXJjZVN0b3BwZWQ/dC5TdGF0ZS5TdGFydGVkOnQuU3RhdGUuU3RvcHBlZH0sdC5CdWZmZXJTb3VyY2UucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKGUsaSxuLG8pe3RoaXMubG9nKFwic3RhcnRcIixlLGksbixvKSx0aGlzLmFzc2VydCgtMT09PXRoaXMuX3N0YXJ0VGltZSxcImNhbiBvbmx5IGJlIHN0YXJ0ZWQgb25jZVwiKSx0aGlzLmFzc2VydCh0aGlzLmJ1ZmZlci5sb2FkZWQsXCJidWZmZXIgaXMgZWl0aGVyIG5vdCBzZXQgb3Igbm90IGxvYWRlZFwiKSx0aGlzLmFzc2VydCghdGhpcy5fc291cmNlU3RvcHBlZCxcInNvdXJjZSBpcyBhbHJlYWR5IHN0b3BwZWRcIiksZT10aGlzLnRvU2Vjb25kcyhlKSxpPXRoaXMubG9vcD90LmRlZmF1bHRBcmcoaSx0aGlzLmxvb3BTdGFydCk6dC5kZWZhdWx0QXJnKGksMCksaT10aGlzLnRvU2Vjb25kcyhpKSxpPU1hdGgubWF4KGksMCksbz10LmRlZmF1bHRBcmcobywxKTt2YXIgcz10aGlzLnRvU2Vjb25kcyh0aGlzLmZhZGVJbik7aWYocz4wPyh0aGlzLl9nYWluTm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKDAsZSksXCJsaW5lYXJcIj09PXRoaXMuY3VydmU/dGhpcy5fZ2Fpbk5vZGUuZ2Fpbi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShvLGUrcyk6dGhpcy5fZ2Fpbk5vZGUuZ2Fpbi5leHBvbmVudGlhbEFwcHJvYWNoVmFsdWVBdFRpbWUobyxlLHMpKTp0aGlzLl9nYWluTm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKG8sZSksdGhpcy5fc3RhcnRUaW1lPWUsdC5pc0RlZmluZWQobikpe3ZhciByPXRoaXMudG9TZWNvbmRzKG4pO3I9TWF0aC5tYXgociwwKSx0aGlzLnN0b3AoZStyKX1pZih0aGlzLmxvb3Ape3ZhciBhPXRoaXMubG9vcEVuZHx8dGhpcy5idWZmZXIuZHVyYXRpb24sbD10aGlzLmxvb3BTdGFydDtpPj1hJiYoaT0oaS1sKSUoYS1sKStsKX1yZXR1cm4gdGhpcy5fc291cmNlLmJ1ZmZlcj10aGlzLmJ1ZmZlci5nZXQoKSx0aGlzLl9zb3VyY2UubG9vcEVuZD10aGlzLmxvb3BFbmR8fHRoaXMuYnVmZmVyLmR1cmF0aW9uLGk8dGhpcy5idWZmZXIuZHVyYXRpb24mJih0aGlzLl9zb3VyY2VTdGFydGVkPSEwLHRoaXMuX3NvdXJjZS5zdGFydChlLGkpKSx0aGlzfSx0LkJ1ZmZlclNvdXJjZS5wcm90b3R5cGUuc3RvcD1mdW5jdGlvbihlKXt0aGlzLmxvZyhcInN0b3BcIixlKSx0aGlzLmFzc2VydCh0aGlzLmJ1ZmZlci5sb2FkZWQsXCJidWZmZXIgaXMgZWl0aGVyIG5vdCBzZXQgb3Igbm90IGxvYWRlZFwiKSx0aGlzLmFzc2VydCghdGhpcy5fc291cmNlU3RvcHBlZCxcInNvdXJjZSBpcyBhbHJlYWR5IHN0b3BwZWRcIiksZT10aGlzLnRvU2Vjb25kcyhlKSwtMSE9PXRoaXMuX3N0b3BUaW1lJiZ0aGlzLmNhbmNlbFN0b3AoKTt2YXIgaT10aGlzLnRvU2Vjb25kcyh0aGlzLmZhZGVPdXQpO3JldHVybiB0aGlzLl9zdG9wVGltZT1lK2ksaT4wP1wibGluZWFyXCI9PT10aGlzLmN1cnZlP3RoaXMuX2dhaW5Ob2RlLmdhaW4ubGluZWFyUmFtcFRvKDAsaSxlKTp0aGlzLl9nYWluTm9kZS5nYWluLnRhcmdldFJhbXBUbygwLGksZSk6KHRoaXMuX2dhaW5Ob2RlLmdhaW4uY2FuY2VsQW5kSG9sZEF0VGltZShlKSx0aGlzLl9nYWluTm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKDAsZSkpLHQuY29udGV4dC5jbGVhclRpbWVvdXQodGhpcy5fb25lbmRlZFRpbWVvdXQpLHRoaXMuX29uZW5kZWRUaW1lb3V0PXQuY29udGV4dC5zZXRUaW1lb3V0KHRoaXMuX29uZW5kZWQuYmluZCh0aGlzKSx0aGlzLl9zdG9wVGltZS10aGlzLm5vdygpKSx0aGlzfSx0LkJ1ZmZlclNvdXJjZS5wcm90b3R5cGUuY2FuY2VsU3RvcD1mdW5jdGlvbigpe2lmKC0xIT09dGhpcy5fc3RhcnRUaW1lJiYhdGhpcy5fc291cmNlU3RvcHBlZCl7dmFyIHQ9dGhpcy50b1NlY29uZHModGhpcy5mYWRlSW4pO3RoaXMuX2dhaW5Ob2RlLmdhaW4uY2FuY2VsU2NoZWR1bGVkVmFsdWVzKHRoaXMuX3N0YXJ0VGltZSt0K3RoaXMuc2FtcGxlVGltZSksdGhpcy5jb250ZXh0LmNsZWFyVGltZW91dCh0aGlzLl9vbmVuZGVkVGltZW91dCksdGhpcy5fc3RvcFRpbWU9LTF9cmV0dXJuIHRoaXN9LHQuQnVmZmVyU291cmNlLnByb3RvdHlwZS5fb25lbmRlZD1mdW5jdGlvbigpe2lmKCF0aGlzLl9zb3VyY2VTdG9wcGVkKXt0aGlzLl9zb3VyY2VTdG9wcGVkPSEwO3ZhciB0PVwiZXhwb25lbnRpYWxcIj09PXRoaXMuY3VydmU/Mip0aGlzLmZhZGVPdXQ6MDt0aGlzLl9zb3VyY2VTdGFydGVkJiYtMSE9PXRoaXMuX3N0b3BUaW1lJiZ0aGlzLl9zb3VyY2Uuc3RvcCh0aGlzLl9zdG9wVGltZSt0KSx0aGlzLm9uZW5kZWQodGhpcyl9fSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5CdWZmZXJTb3VyY2UucHJvdG90eXBlLFwibG9vcFN0YXJ0XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zb3VyY2UubG9vcFN0YXJ0fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fc291cmNlLmxvb3BTdGFydD10aGlzLnRvU2Vjb25kcyh0KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5CdWZmZXJTb3VyY2UucHJvdG90eXBlLFwibG9vcEVuZFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc291cmNlLmxvb3BFbmR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9zb3VyY2UubG9vcEVuZD10aGlzLnRvU2Vjb25kcyh0KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5CdWZmZXJTb3VyY2UucHJvdG90eXBlLFwiYnVmZmVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9idWZmZXJ9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9idWZmZXIuc2V0KHQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkJ1ZmZlclNvdXJjZS5wcm90b3R5cGUsXCJsb29wXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zb3VyY2UubG9vcH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3NvdXJjZS5sb29wPXQsdGhpcy5jYW5jZWxTdG9wKCl9fSksdC5CdWZmZXJTb3VyY2UucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLm9uZW5kZWQ9bnVsbCx0aGlzLl9zb3VyY2Uub25lbmRlZD1udWxsLHRoaXMuX3NvdXJjZS5kaXNjb25uZWN0KCksdGhpcy5fc291cmNlPW51bGwsdGhpcy5fZ2Fpbk5vZGUuZGlzcG9zZSgpLHRoaXMuX2dhaW5Ob2RlPW51bGwsdGhpcy5fYnVmZmVyLmRpc3Bvc2UoKSx0aGlzLl9idWZmZXI9bnVsbCx0aGlzLl9zdGFydFRpbWU9LTEsdGhpcy5wbGF5YmFja1JhdGU9bnVsbCx0LmNvbnRleHQuY2xlYXJUaW1lb3V0KHRoaXMuX29uZW5kZWRUaW1lb3V0KSx0aGlzfSx0LkJ1ZmZlclNvdXJjZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg4KSxpKDEpLGkoNSksaSgzKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuRmVlZGJhY2tFZmZlY3Q9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJmZWVkYmFja1wiXSx0LkZlZWRiYWNrRWZmZWN0KTt0LkVmZmVjdC5jYWxsKHRoaXMsZSksdGhpcy5fZmVlZGJhY2tHYWluPW5ldyB0LkdhaW4oZS5mZWVkYmFjayx0LlR5cGUuTm9ybWFsUmFuZ2UpLHRoaXMuZmVlZGJhY2s9dGhpcy5fZmVlZGJhY2tHYWluLmdhaW4sdGhpcy5lZmZlY3RSZXR1cm4uY2hhaW4odGhpcy5fZmVlZGJhY2tHYWluLHRoaXMuZWZmZWN0U2VuZCksdGhpcy5fcmVhZE9ubHkoW1wiZmVlZGJhY2tcIl0pfSx0LmV4dGVuZCh0LkZlZWRiYWNrRWZmZWN0LHQuRWZmZWN0KSx0LkZlZWRiYWNrRWZmZWN0LmRlZmF1bHRzPXtmZWVkYmFjazouMTI1fSx0LkZlZWRiYWNrRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fd3JpdGFibGUoW1wiZmVlZGJhY2tcIl0pLHRoaXMuX2ZlZWRiYWNrR2Fpbi5kaXNwb3NlKCksdGhpcy5fZmVlZGJhY2tHYWluPW51bGwsdGhpcy5mZWVkYmFjaz1udWxsLHRoaXN9LHQuRmVlZGJhY2tFZmZlY3R9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMjQpLGkoNCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlRpbWVsaW5lU3RhdGU9ZnVuY3Rpb24oZSl7dC5UaW1lbGluZS5jYWxsKHRoaXMpLHRoaXMuX2luaXRpYWw9ZX0sdC5leHRlbmQodC5UaW1lbGluZVN0YXRlLHQuVGltZWxpbmUpLHQuVGltZWxpbmVTdGF0ZS5wcm90b3R5cGUuZ2V0VmFsdWVBdFRpbWU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXQodCk7cmV0dXJuIG51bGwhPT1lP2Uuc3RhdGU6dGhpcy5faW5pdGlhbH0sdC5UaW1lbGluZVN0YXRlLnByb3RvdHlwZS5zZXRTdGF0ZUF0VGltZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmFkZCh7c3RhdGU6dCx0aW1lOmV9KSx0aGlzfSx0LlRpbWVsaW5lU3RhdGUucHJvdG90eXBlLmdldExhc3RTdGF0ZT1mdW5jdGlvbih0LGUpe2U9dGhpcy50b1NlY29uZHMoZSk7Zm9yKHZhciBpPXRoaXMuX3NlYXJjaChlKTtpPj0wO2ktLSl7dmFyIG49dGhpcy5fdGltZWxpbmVbaV07aWYobi5zdGF0ZT09PXQpcmV0dXJuIG59fSx0LlRpbWVsaW5lU3RhdGUucHJvdG90eXBlLmdldE5leHRTdGF0ZT1mdW5jdGlvbih0LGUpe2U9dGhpcy50b1NlY29uZHMoZSk7dmFyIGk9dGhpcy5fc2VhcmNoKGUpO2lmKC0xIT09aSlmb3IodmFyIG49aTtuPHRoaXMuX3RpbWVsaW5lLmxlbmd0aDtuKyspe3ZhciBvPXRoaXMuX3RpbWVsaW5lW25dO2lmKG8uc3RhdGU9PT10KXJldHVybiBvfX0sdC5UaW1lbGluZVN0YXRlfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDY2KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7aWYodC5zdXBwb3J0ZWQpeyF0Lmdsb2JhbC5oYXNPd25Qcm9wZXJ0eShcIkF1ZGlvQ29udGV4dFwiKSYmdC5nbG9iYWwuaGFzT3duUHJvcGVydHkoXCJ3ZWJraXRBdWRpb0NvbnRleHRcIikmJih0Lmdsb2JhbC5BdWRpb0NvbnRleHQ9dC5nbG9iYWwud2Via2l0QXVkaW9Db250ZXh0KSxBdWRpb0NvbnRleHQucHJvdG90eXBlLmNsb3NlfHwoQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3JldHVybiB0LmlzRnVuY3Rpb24odGhpcy5zdXNwZW5kKSYmdGhpcy5zdXNwZW5kKCksUHJvbWlzZS5yZXNvbHZlKCl9KSxBdWRpb0NvbnRleHQucHJvdG90eXBlLnJlc3VtZXx8KEF1ZGlvQ29udGV4dC5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jcmVhdGVCdWZmZXIoMSwxLHRoaXMuc2FtcGxlUmF0ZSksZT10aGlzLmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO3JldHVybiBlLmJ1ZmZlcj10LGUuY29ubmVjdCh0aGlzLmRlc3RpbmF0aW9uKSxlLnN0YXJ0KDApLFByb21pc2UucmVzb2x2ZSgpfSksIUF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlR2FpbiYmQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVHYWluTm9kZSYmKEF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlR2Fpbj1BdWRpb0NvbnRleHQucHJvdG90eXBlLmNyZWF0ZUdhaW5Ob2RlKSwhQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVEZWxheSYmQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVEZWxheU5vZGUmJihBdWRpb0NvbnRleHQucHJvdG90eXBlLmNyZWF0ZURlbGF5PUF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlRGVsYXlOb2RlKTt2YXIgZT0hMSxpPW5ldyBPZmZsaW5lQXVkaW9Db250ZXh0KDEsMSw0NDEwMCksbj1uZXcgVWludDMyQXJyYXkoWzExNzkwMTE0MTAsNDgsMTE2MzI4MDcyNyw1NDQ1MDEwOTQsMTYsMTMxMDczLDQ0MTAwLDE3NjQwMCwxMDQ4NTgwLDE2MzUwMTcwNjAsOCwwLDAsMCwwXSkuYnVmZmVyO3RyeXt2YXIgbz1pLmRlY29kZUF1ZGlvRGF0YShuKTtvJiZ0LmlzRnVuY3Rpb24oby50aGVuKSYmKGU9ITApfWNhdGNoKHQpe2U9ITF9ZXx8KEF1ZGlvQ29udGV4dC5wcm90b3R5cGUuX25hdGl2ZV9kZWNvZGVBdWRpb0RhdGE9QXVkaW9Db250ZXh0LnByb3RvdHlwZS5kZWNvZGVBdWRpb0RhdGEsQXVkaW9Db250ZXh0LnByb3RvdHlwZS5kZWNvZGVBdWRpb0RhdGE9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsaSl7dGhpcy5fbmF0aXZlX2RlY29kZUF1ZGlvRGF0YSh0LGUsaSl9LmJpbmQodGhpcykpfSl9fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuRW1pdHRlcj1mdW5jdGlvbigpe3QuY2FsbCh0aGlzKSx0aGlzLl9ldmVudHM9e319LHQuZXh0ZW5kKHQuRW1pdHRlciksdC5FbWl0dGVyLnByb3RvdHlwZS5vbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT10LnNwbGl0KC9cXFcrLyksbj0wO248aS5sZW5ndGg7bisrKXt2YXIgbz1pW25dO3RoaXMuX2V2ZW50cy5oYXNPd25Qcm9wZXJ0eShvKXx8KHRoaXMuX2V2ZW50c1tvXT1bXSksdGhpcy5fZXZlbnRzW29dLnB1c2goZSl9cmV0dXJuIHRoaXN9LHQuRW1pdHRlci5wcm90b3R5cGUub25jZT1mdW5jdGlvbih0LGUpe3ZhciBpPWZ1bmN0aW9uKCl7ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5vZmYodCxpKX0uYmluZCh0aGlzKTtyZXR1cm4gdGhpcy5vbih0LGkpLHRoaXN9LHQuRW1pdHRlci5wcm90b3R5cGUub2ZmPWZ1bmN0aW9uKGUsaSl7Zm9yKHZhciBuPWUuc3BsaXQoL1xcVysvKSxvPTA7bzxuLmxlbmd0aDtvKyspaWYoZT1uW29dLHRoaXMuX2V2ZW50cy5oYXNPd25Qcm9wZXJ0eShlKSlpZih0LmlzVW5kZWYoaSkpdGhpcy5fZXZlbnRzW2VdPVtdO2Vsc2UgZm9yKHZhciBzPXRoaXMuX2V2ZW50c1tlXSxyPTA7cjxzLmxlbmd0aDtyKyspc1tyXT09PWkmJnMuc3BsaWNlKHIsMSk7cmV0dXJuIHRoaXN9LHQuRW1pdHRlci5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbih0KXtpZih0aGlzLl9ldmVudHMpe3ZhciBlPUFycmF5LmFwcGx5KG51bGwsYXJndW1lbnRzKS5zbGljZSgxKTtpZih0aGlzLl9ldmVudHMuaGFzT3duUHJvcGVydHkodCkpZm9yKHZhciBpPXRoaXMuX2V2ZW50c1t0XS5zbGljZSgwKSxuPTAsbz1pLmxlbmd0aDtuPG87bisrKWlbbl0uYXBwbHkodGhpcyxlKX1yZXR1cm4gdGhpc30sdC5FbWl0dGVyLm1peGluPWZ1bmN0aW9uKGUpe3ZhciBpPVtcIm9uXCIsXCJvbmNlXCIsXCJvZmZcIixcImVtaXRcIl07ZS5fZXZlbnRzPXt9O2Zvcih2YXIgbj0wO248aS5sZW5ndGg7bisrKXt2YXIgbz1pW25dLHM9dC5FbWl0dGVyLnByb3RvdHlwZVtvXTtlW29dPXN9cmV0dXJuIHQuRW1pdHRlcn0sdC5FbWl0dGVyLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9ldmVudHM9bnVsbCx0aGlzfSx0LkVtaXR0ZXJ9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlNpZ25hbEJhc2U9ZnVuY3Rpb24oKXt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpfSx0LmV4dGVuZCh0LlNpZ25hbEJhc2UsdC5BdWRpb05vZGUpLHQuU2lnbmFsQmFzZS5wcm90b3R5cGUuY29ubmVjdD1mdW5jdGlvbihlLGksbil7cmV0dXJuIHQuU2lnbmFsJiZ0LlNpZ25hbD09PWUuY29uc3RydWN0b3J8fHQuUGFyYW0mJnQuUGFyYW09PT1lLmNvbnN0cnVjdG9yPyhlLl9wYXJhbS5jYW5jZWxTY2hlZHVsZWRWYWx1ZXMoMCksZS5fcGFyYW0uc2V0VmFsdWVBdFRpbWUoMCwwKSxlLm92ZXJyaWRkZW49ITApOmUgaW5zdGFuY2VvZiBBdWRpb1BhcmFtJiYoZS5jYW5jZWxTY2hlZHVsZWRWYWx1ZXMoMCksZS5zZXRWYWx1ZUF0VGltZSgwLDApKSx0LkF1ZGlvTm9kZS5wcm90b3R5cGUuY29ubmVjdC5jYWxsKHRoaXMsZSxpLG4pLHRoaXN9LHQuU2lnbmFsQmFzZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg2KSxpKDE3KSxpKDQ5KSxpKDcxKSxpKDQ4KSxpKDcwKSxpKDY5KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7dC5PbW5pT3NjaWxsYXRvcj1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcImZyZXF1ZW5jeVwiLFwidHlwZVwiXSx0Lk9tbmlPc2NpbGxhdG9yKTt0LlNvdXJjZS5jYWxsKHRoaXMsZSksdGhpcy5mcmVxdWVuY3k9bmV3IHQuU2lnbmFsKGUuZnJlcXVlbmN5LHQuVHlwZS5GcmVxdWVuY3kpLHRoaXMuZGV0dW5lPW5ldyB0LlNpZ25hbChlLmRldHVuZSx0LlR5cGUuQ2VudHMpLHRoaXMuX3NvdXJjZVR5cGU9dm9pZCAwLHRoaXMuX29zY2lsbGF0b3I9bnVsbCx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuX3JlYWRPbmx5KFtcImZyZXF1ZW5jeVwiLFwiZGV0dW5lXCJdKSx0aGlzLnNldChlKX0sdC5leHRlbmQodC5PbW5pT3NjaWxsYXRvcix0LlNvdXJjZSksdC5PbW5pT3NjaWxsYXRvci5kZWZhdWx0cz17ZnJlcXVlbmN5OjQ0MCxkZXR1bmU6MCx0eXBlOlwic2luZVwiLHBoYXNlOjB9O3ZhciBlPVwiUHVsc2VPc2NpbGxhdG9yXCIsaT1cIlBXTU9zY2lsbGF0b3JcIixuPVwiT3NjaWxsYXRvclwiLG89XCJGTU9zY2lsbGF0b3JcIixzPVwiQU1Pc2NpbGxhdG9yXCIscj1cIkZhdE9zY2lsbGF0b3JcIjt0Lk9tbmlPc2NpbGxhdG9yLnByb3RvdHlwZS5fc3RhcnQ9ZnVuY3Rpb24odCl7dGhpcy5fb3NjaWxsYXRvci5zdGFydCh0KX0sdC5PbW5pT3NjaWxsYXRvci5wcm90b3R5cGUuX3N0b3A9ZnVuY3Rpb24odCl7dGhpcy5fb3NjaWxsYXRvci5zdG9wKHQpfSx0Lk9tbmlPc2NpbGxhdG9yLnByb3RvdHlwZS5yZXN0YXJ0PWZ1bmN0aW9uKHQpe3RoaXMuX29zY2lsbGF0b3IucmVzdGFydCh0KX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuT21uaU9zY2lsbGF0b3IucHJvdG90eXBlLFwidHlwZVwiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1cIlwiO3JldHVybiB0aGlzLl9zb3VyY2VUeXBlPT09bz90PVwiZm1cIjp0aGlzLl9zb3VyY2VUeXBlPT09cz90PVwiYW1cIjp0aGlzLl9zb3VyY2VUeXBlPT09ciYmKHQ9XCJmYXRcIiksdCt0aGlzLl9vc2NpbGxhdG9yLnR5cGV9LHNldDpmdW5jdGlvbih0KXtcImZtXCI9PT10LnN1YnN0cigwLDIpPyh0aGlzLl9jcmVhdGVOZXdPc2NpbGxhdG9yKG8pLHRoaXMuX29zY2lsbGF0b3IudHlwZT10LnN1YnN0cigyKSk6XCJhbVwiPT09dC5zdWJzdHIoMCwyKT8odGhpcy5fY3JlYXRlTmV3T3NjaWxsYXRvcihzKSx0aGlzLl9vc2NpbGxhdG9yLnR5cGU9dC5zdWJzdHIoMikpOlwiZmF0XCI9PT10LnN1YnN0cigwLDMpPyh0aGlzLl9jcmVhdGVOZXdPc2NpbGxhdG9yKHIpLHRoaXMuX29zY2lsbGF0b3IudHlwZT10LnN1YnN0cigzKSk6XCJwd21cIj09PXQ/dGhpcy5fY3JlYXRlTmV3T3NjaWxsYXRvcihpKTpcInB1bHNlXCI9PT10P3RoaXMuX2NyZWF0ZU5ld09zY2lsbGF0b3IoZSk6KHRoaXMuX2NyZWF0ZU5ld09zY2lsbGF0b3IobiksdGhpcy5fb3NjaWxsYXRvci50eXBlPXQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk9tbmlPc2NpbGxhdG9yLnByb3RvdHlwZSxcInBhcnRpYWxzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vc2NpbGxhdG9yLnBhcnRpYWxzfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fb3NjaWxsYXRvci5wYXJ0aWFscz10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk9tbmlPc2NpbGxhdG9yLnByb3RvdHlwZSxcInBhcnRpYWxDb3VudFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3NjaWxsYXRvci5wYXJ0aWFsQ291bnR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9vc2NpbGxhdG9yLnBhcnRpYWxDb3VudD10fX0pLHQuT21uaU9zY2lsbGF0b3IucHJvdG90eXBlLnNldD1mdW5jdGlvbihlLGkpe3JldHVyblwidHlwZVwiPT09ZT90aGlzLnR5cGU9aTp0LmlzT2JqZWN0KGUpJiZlLmhhc093blByb3BlcnR5KFwidHlwZVwiKSYmKHRoaXMudHlwZT1lLnR5cGUpLHQucHJvdG90eXBlLnNldC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpc30sdC5PbW5pT3NjaWxsYXRvci5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX29zY2lsbGF0b3IuZ2V0KHQpO3JldHVybiBlLnR5cGU9dGhpcy50eXBlLGV9LHQuT21uaU9zY2lsbGF0b3IucHJvdG90eXBlLl9jcmVhdGVOZXdPc2NpbGxhdG9yPWZ1bmN0aW9uKGUpe2lmKGUhPT10aGlzLl9zb3VyY2VUeXBlKXt0aGlzLl9zb3VyY2VUeXBlPWU7dmFyIGk9dFtlXSxuPXRoaXMubm93KCk7aWYobnVsbCE9PXRoaXMuX29zY2lsbGF0b3Ipe3ZhciBvPXRoaXMuX29zY2lsbGF0b3I7by5zdG9wKG4pLHRoaXMuY29udGV4dC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7by5kaXNwb3NlKCksbz1udWxsfSx0aGlzLmJsb2NrVGltZSl9dGhpcy5fb3NjaWxsYXRvcj1uZXcgaSx0aGlzLmZyZXF1ZW5jeS5jb25uZWN0KHRoaXMuX29zY2lsbGF0b3IuZnJlcXVlbmN5KSx0aGlzLmRldHVuZS5jb25uZWN0KHRoaXMuX29zY2lsbGF0b3IuZGV0dW5lKSx0aGlzLl9vc2NpbGxhdG9yLmNvbm5lY3QodGhpcy5vdXRwdXQpLHRoaXMuc3RhdGU9PT10LlN0YXRlLlN0YXJ0ZWQmJnRoaXMuX29zY2lsbGF0b3Iuc3RhcnQobil9fSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5PbW5pT3NjaWxsYXRvci5wcm90b3R5cGUsXCJwaGFzZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3NjaWxsYXRvci5waGFzZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX29zY2lsbGF0b3IucGhhc2U9dH19KTt2YXIgYT17UHVsc2VPc2NpbGxhdG9yOlwicHVsc2VcIixQV01Pc2NpbGxhdG9yOlwicHdtXCIsT3NjaWxsYXRvcjpcIm9zY2lsbGF0b3JcIixGTU9zY2lsbGF0b3I6XCJmbVwiLEFNT3NjaWxsYXRvcjpcImFtXCIsRmF0T3NjaWxsYXRvcjpcImZhdFwifTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuT21uaU9zY2lsbGF0b3IucHJvdG90eXBlLFwic291cmNlVHlwZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYVt0aGlzLl9zb3VyY2VUeXBlXX0sc2V0OmZ1bmN0aW9uKHQpe3ZhciBlPVwic2luZVwiO1wicHdtXCIhPT10aGlzLl9vc2NpbGxhdG9yLnR5cGUmJlwicHVsc2VcIiE9PXRoaXMuX29zY2lsbGF0b3IudHlwZSYmKGU9dGhpcy5fb3NjaWxsYXRvci50eXBlKSx0PT09YS5GTU9zY2lsbGF0b3I/dGhpcy50eXBlPVwiZm1cIitlOnQ9PT1hLkFNT3NjaWxsYXRvcj90aGlzLnR5cGU9XCJhbVwiK2U6dD09PWEuRmF0T3NjaWxsYXRvcj90aGlzLnR5cGU9XCJmYXRcIitlOnQ9PT1hLk9zY2lsbGF0b3I/dGhpcy50eXBlPWU6dD09PWEuUHVsc2VPc2NpbGxhdG9yP3RoaXMudHlwZT1cInB1bHNlXCI6dD09PWEuUFdNT3NjaWxsYXRvciYmKHRoaXMudHlwZT1cInB3bVwiKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5PbW5pT3NjaWxsYXRvci5wcm90b3R5cGUsXCJiYXNlVHlwZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3NjaWxsYXRvci5iYXNlVHlwZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuc291cmNlVHlwZSE9PWEuUHVsc2VPc2NpbGxhdG9yJiZ0aGlzLnNvdXJjZVR5cGUhPT1hLlBXTU9zY2lsbGF0b3ImJih0aGlzLl9vc2NpbGxhdG9yLmJhc2VUeXBlPXQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk9tbmlPc2NpbGxhdG9yLnByb3RvdHlwZSxcIndpZHRoXCIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMuX3NvdXJjZVR5cGU9PT1lKXJldHVybiB0aGlzLl9vc2NpbGxhdG9yLndpZHRofX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk9tbmlPc2NpbGxhdG9yLnByb3RvdHlwZSxcImNvdW50XCIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMuX3NvdXJjZVR5cGU9PT1yKXJldHVybiB0aGlzLl9vc2NpbGxhdG9yLmNvdW50fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fc291cmNlVHlwZT09PXImJih0aGlzLl9vc2NpbGxhdG9yLmNvdW50PXQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk9tbmlPc2NpbGxhdG9yLnByb3RvdHlwZSxcInNwcmVhZFwiLHtnZXQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9zb3VyY2VUeXBlPT09cilyZXR1cm4gdGhpcy5fb3NjaWxsYXRvci5zcHJlYWR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9zb3VyY2VUeXBlPT09ciYmKHRoaXMuX29zY2lsbGF0b3Iuc3ByZWFkPXQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk9tbmlPc2NpbGxhdG9yLnByb3RvdHlwZSxcIm1vZHVsYXRpb25UeXBlXCIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMuX3NvdXJjZVR5cGU9PT1vfHx0aGlzLl9zb3VyY2VUeXBlPT09cylyZXR1cm4gdGhpcy5fb3NjaWxsYXRvci5tb2R1bGF0aW9uVHlwZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3NvdXJjZVR5cGUhPT1vJiZ0aGlzLl9zb3VyY2VUeXBlIT09c3x8KHRoaXMuX29zY2lsbGF0b3IubW9kdWxhdGlvblR5cGU9dCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuT21uaU9zY2lsbGF0b3IucHJvdG90eXBlLFwibW9kdWxhdGlvbkluZGV4XCIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMuX3NvdXJjZVR5cGU9PT1vKXJldHVybiB0aGlzLl9vc2NpbGxhdG9yLm1vZHVsYXRpb25JbmRleH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5PbW5pT3NjaWxsYXRvci5wcm90b3R5cGUsXCJoYXJtb25pY2l0eVwiLHtnZXQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9zb3VyY2VUeXBlPT09b3x8dGhpcy5fc291cmNlVHlwZT09PXMpcmV0dXJuIHRoaXMuX29zY2lsbGF0b3IuaGFybW9uaWNpdHl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuT21uaU9zY2lsbGF0b3IucHJvdG90eXBlLFwibW9kdWxhdGlvbkZyZXF1ZW5jeVwiLHtnZXQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9zb3VyY2VUeXBlPT09aSlyZXR1cm4gdGhpcy5fb3NjaWxsYXRvci5tb2R1bGF0aW9uRnJlcXVlbmN5fX0pLHQuT21uaU9zY2lsbGF0b3IucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5Tb3VyY2UucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl93cml0YWJsZShbXCJmcmVxdWVuY3lcIixcImRldHVuZVwiXSksdGhpcy5kZXR1bmUuZGlzcG9zZSgpLHRoaXMuZGV0dW5lPW51bGwsdGhpcy5mcmVxdWVuY3kuZGlzcG9zZSgpLHRoaXMuZnJlcXVlbmN5PW51bGwsdGhpcy5fb3NjaWxsYXRvci5kaXNwb3NlKCksdGhpcy5fb3NjaWxsYXRvcj1udWxsLHRoaXMuX3NvdXJjZVR5cGU9bnVsbCx0aGlzfSx0Lk9tbmlPc2NpbGxhdG9yfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDMwKSxpKDM3KSxpKDEpLGkoMjUpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5TeW50aD1mdW5jdGlvbihlKXtlPXQuZGVmYXVsdEFyZyhlLHQuU3ludGguZGVmYXVsdHMpLHQuTW9ub3Bob25pYy5jYWxsKHRoaXMsZSksdGhpcy5vc2NpbGxhdG9yPW5ldyB0Lk9tbmlPc2NpbGxhdG9yKGUub3NjaWxsYXRvciksdGhpcy5mcmVxdWVuY3k9dGhpcy5vc2NpbGxhdG9yLmZyZXF1ZW5jeSx0aGlzLmRldHVuZT10aGlzLm9zY2lsbGF0b3IuZGV0dW5lLHRoaXMuZW52ZWxvcGU9bmV3IHQuQW1wbGl0dWRlRW52ZWxvcGUoZS5lbnZlbG9wZSksdGhpcy5vc2NpbGxhdG9yLmNoYWluKHRoaXMuZW52ZWxvcGUsdGhpcy5vdXRwdXQpLHRoaXMuX3JlYWRPbmx5KFtcIm9zY2lsbGF0b3JcIixcImZyZXF1ZW5jeVwiLFwiZGV0dW5lXCIsXCJlbnZlbG9wZVwiXSl9LHQuZXh0ZW5kKHQuU3ludGgsdC5Nb25vcGhvbmljKSx0LlN5bnRoLmRlZmF1bHRzPXtvc2NpbGxhdG9yOnt0eXBlOlwidHJpYW5nbGVcIn0sZW52ZWxvcGU6e2F0dGFjazouMDA1LGRlY2F5Oi4xLHN1c3RhaW46LjMscmVsZWFzZToxfX0sdC5TeW50aC5wcm90b3R5cGUuX3RyaWdnZXJFbnZlbG9wZUF0dGFjaz1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmVudmVsb3BlLnRyaWdnZXJBdHRhY2sodCxlKSx0aGlzLm9zY2lsbGF0b3Iuc3RhcnQodCksMD09PXRoaXMuZW52ZWxvcGUuc3VzdGFpbiYmdGhpcy5vc2NpbGxhdG9yLnN0b3AodCt0aGlzLmVudmVsb3BlLmF0dGFjayt0aGlzLmVudmVsb3BlLmRlY2F5KSx0aGlzfSx0LlN5bnRoLnByb3RvdHlwZS5fdHJpZ2dlckVudmVsb3BlUmVsZWFzZT1mdW5jdGlvbih0KXtyZXR1cm4gdD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLmVudmVsb3BlLnRyaWdnZXJSZWxlYXNlKHQpLHRoaXMub3NjaWxsYXRvci5zdG9wKHQrdGhpcy5lbnZlbG9wZS5yZWxlYXNlKSx0aGlzfSx0LlN5bnRoLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuTW9ub3Bob25pYy5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcIm9zY2lsbGF0b3JcIixcImZyZXF1ZW5jeVwiLFwiZGV0dW5lXCIsXCJlbnZlbG9wZVwiXSksdGhpcy5vc2NpbGxhdG9yLmRpc3Bvc2UoKSx0aGlzLm9zY2lsbGF0b3I9bnVsbCx0aGlzLmVudmVsb3BlLmRpc3Bvc2UoKSx0aGlzLmVudmVsb3BlPW51bGwsdGhpcy5mcmVxdWVuY3k9bnVsbCx0aGlzLmRldHVuZT1udWxsLHRoaXN9LHQuU3ludGh9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNiksaSgxMSksaSgzMSldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3QuTm9pc2U9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJ0eXBlXCJdLHQuTm9pc2UpO3QuU291cmNlLmNhbGwodGhpcyxlKSx0aGlzLl9zb3VyY2U9bnVsbCx0aGlzLl90eXBlPWUudHlwZSx0aGlzLl9wbGF5YmFja1JhdGU9ZS5wbGF5YmFja1JhdGV9LHQuZXh0ZW5kKHQuTm9pc2UsdC5Tb3VyY2UpLHQuTm9pc2UuZGVmYXVsdHM9e3R5cGU6XCJ3aGl0ZVwiLHBsYXliYWNrUmF0ZToxfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5Ob2lzZS5wcm90b3R5cGUsXCJ0eXBlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90eXBlfSxzZXQ6ZnVuY3Rpb24oaSl7aWYodGhpcy5fdHlwZSE9PWkpe2lmKCEoaSBpbiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVG9uZS5Ob2lzZTogaW52YWxpZCB0eXBlOiBcIitpKTtpZih0aGlzLl90eXBlPWksdGhpcy5zdGF0ZT09PXQuU3RhdGUuU3RhcnRlZCl7dmFyIG49dGhpcy5ub3coKTt0aGlzLl9zdG9wKG4pLHRoaXMuX3N0YXJ0KG4pfX19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuTm9pc2UucHJvdG90eXBlLFwicGxheWJhY2tSYXRlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9wbGF5YmFja1JhdGU9dCx0aGlzLl9zb3VyY2UmJih0aGlzLl9zb3VyY2UucGxheWJhY2tSYXRlLnZhbHVlPXQpfX0pLHQuTm9pc2UucHJvdG90eXBlLl9zdGFydD1mdW5jdGlvbihpKXt2YXIgbj1lW3RoaXMuX3R5cGVdO3RoaXMuX3NvdXJjZT1uZXcgdC5CdWZmZXJTb3VyY2UobikuY29ubmVjdCh0aGlzLm91dHB1dCksdGhpcy5fc291cmNlLmxvb3A9ITAsdGhpcy5fc291cmNlLnBsYXliYWNrUmF0ZS52YWx1ZT10aGlzLl9wbGF5YmFja1JhdGUsdGhpcy5fc291cmNlLnN0YXJ0KHRoaXMudG9TZWNvbmRzKGkpLE1hdGgucmFuZG9tKCkqKG4uZHVyYXRpb24tLjAwMSkpfSx0Lk5vaXNlLnByb3RvdHlwZS5fc3RvcD1mdW5jdGlvbih0KXt0aGlzLl9zb3VyY2UmJih0aGlzLl9zb3VyY2Uuc3RvcCh0aGlzLnRvU2Vjb25kcyh0KSksdGhpcy5fc291cmNlPW51bGwpfSx0Lk5vaXNlLnByb3RvdHlwZS5yZXN0YXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9zdG9wKHQpLHRoaXMuX3N0YXJ0KHQpLHRoaXN9LHQuTm9pc2UucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5Tb3VyY2UucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSxudWxsIT09dGhpcy5fc291cmNlJiYodGhpcy5fc291cmNlLmRpc2Nvbm5lY3QoKSx0aGlzLl9zb3VyY2U9bnVsbCksdGhpcy5fYnVmZmVyPW51bGwsdGhpc307dmFyIGU9e30saT17fTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJwaW5rXCIse2dldDpmdW5jdGlvbigpe2lmKCFpLnBpbmspe2Zvcih2YXIgZT1bXSxuPTA7bjwyO24rKyl7dmFyIG8scyxyLGEsbCxoLHUsYz1uZXcgRmxvYXQzMkFycmF5KDIyMDUwMCk7ZVtuXT1jLG89cz1yPWE9bD1oPXU9MDtmb3IodmFyIHA9MDtwPDIyMDUwMDtwKyspe3ZhciBmPTIqTWF0aC5yYW5kb20oKS0xO289Ljk5ODg2Km8rLjA1NTUxNzkqZixzPS45OTMzMipzKy4wNzUwNzU5KmYscj0uOTY5KnIrLjE1Mzg1MipmLGE9Ljg2NjUqYSsuMzEwNDg1NipmLGw9LjU1KmwrLjUzMjk1MjIqZixoPS0uNzYxNipoLS4wMTY4OTgqZixjW3BdPW8rcytyK2ErbCtoK3UrLjUzNjIqZixjW3BdKj0uMTEsdT0uMTE1OTI2KmZ9fWkucGluaz0obmV3IHQuQnVmZmVyKS5mcm9tQXJyYXkoZSl9cmV0dXJuIGkucGlua319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImJyb3duXCIse2dldDpmdW5jdGlvbigpe2lmKCFpLmJyb3duKXtmb3IodmFyIGU9W10sbj0wO248MjtuKyspe3ZhciBvPW5ldyBGbG9hdDMyQXJyYXkoMjIwNTAwKTtlW25dPW87Zm9yKHZhciBzPTAscj0wO3I8MjIwNTAwO3IrKyl7dmFyIGE9MipNYXRoLnJhbmRvbSgpLTE7b1tyXT0ocysuMDIqYSkvMS4wMixzPW9bcl0sb1tyXSo9My41fX1pLmJyb3duPShuZXcgdC5CdWZmZXIpLmZyb21BcnJheShlKX1yZXR1cm4gaS5icm93bn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIndoaXRlXCIse2dldDpmdW5jdGlvbigpe2lmKCFpLndoaXRlKXtmb3IodmFyIGU9W10sbj0wO248MjtuKyspe3ZhciBvPW5ldyBGbG9hdDMyQXJyYXkoMjIwNTAwKTtlW25dPW87Zm9yKHZhciBzPTA7czwyMjA1MDA7cysrKW9bc109MipNYXRoLnJhbmRvbSgpLTF9aS53aGl0ZT0obmV3IHQuQnVmZmVyKS5mcm9tQXJyYXkoZSl9cmV0dXJuIGkud2hpdGV9fSksdC5Ob2lzZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgyNyksaSgyMCksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7dC5NYXN0ZXI9ZnVuY3Rpb24oKXt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLHQuZ2V0Q29udGV4dChmdW5jdGlvbigpe3RoaXMuY3JlYXRlSW5zT3V0cygxLDApLHRoaXMuX3ZvbHVtZT10aGlzLm91dHB1dD1uZXcgdC5Wb2x1bWUsdGhpcy52b2x1bWU9dGhpcy5fdm9sdW1lLnZvbHVtZSx0aGlzLl9yZWFkT25seShcInZvbHVtZVwiKSx0aGlzLmlucHV0LmNoYWluKHRoaXMub3V0cHV0LHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiksdGhpcy5jb250ZXh0Lm1hc3Rlcj10aGlzfS5iaW5kKHRoaXMpKX0sdC5leHRlbmQodC5NYXN0ZXIsdC5BdWRpb05vZGUpLHQuTWFzdGVyLmRlZmF1bHRzPXt2b2x1bWU6MCxtdXRlOiExfSx0Lk1hc3Rlci5wcm90b3R5cGUuaXNNYXN0ZXI9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuTWFzdGVyLnByb3RvdHlwZSxcIm11dGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZvbHVtZS5tdXRlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fdm9sdW1lLm11dGU9dH19KSx0Lk1hc3Rlci5wcm90b3R5cGUuY2hhaW49ZnVuY3Rpb24oKXt0aGlzLmlucHV0LmRpc2Nvbm5lY3QoKSx0aGlzLmlucHV0LmNoYWluLmFwcGx5KHRoaXMuaW5wdXQsYXJndW1lbnRzKSxhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aC0xXS5jb25uZWN0KHRoaXMub3V0cHV0KX0sdC5NYXN0ZXIucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFwidm9sdW1lXCIpLHRoaXMuX3ZvbHVtZS5kaXNwb3NlKCksdGhpcy5fdm9sdW1lPW51bGwsdGhpcy52b2x1bWU9bnVsbH0sdC5BdWRpb05vZGUucHJvdG90eXBlLnRvTWFzdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29ubmVjdCh0aGlzLmNvbnRleHQubWFzdGVyKSx0aGlzfTt2YXIgZT10Lk1hc3RlcjtyZXR1cm4gdC5NYXN0ZXI9bmV3IGUsdC5Db250ZXh0Lm9uKFwiaW5pdFwiLGZ1bmN0aW9uKGkpe2kubWFzdGVyJiZpLm1hc3Rlci5pc01hc3Rlcj90Lk1hc3Rlcj1pLm1hc3Rlcjp0Lk1hc3Rlcj1uZXcgZX0pLHQuQ29udGV4dC5vbihcImNsb3NlXCIsZnVuY3Rpb24odCl7dC5tYXN0ZXImJnQubWFzdGVyLmlzTWFzdGVyJiZ0Lm1hc3Rlci5kaXNwb3NlKCl9KSx0Lk1hc3Rlcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg4OSksaSg0NyldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkZyZXF1ZW5jeUVudmVsb3BlPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiYXR0YWNrXCIsXCJkZWNheVwiLFwic3VzdGFpblwiLFwicmVsZWFzZVwiXSx0LkVudmVsb3BlKTtlPXQuZGVmYXVsdEFyZyhlLHQuRnJlcXVlbmN5RW52ZWxvcGUuZGVmYXVsdHMpLHQuU2NhbGVkRW52ZWxvcGUuY2FsbCh0aGlzLGUpLHRoaXMuX29jdGF2ZXM9ZS5vY3RhdmVzLHRoaXMuYmFzZUZyZXF1ZW5jeT1lLmJhc2VGcmVxdWVuY3ksdGhpcy5vY3RhdmVzPWUub2N0YXZlcyx0aGlzLmV4cG9uZW50PWUuZXhwb25lbnR9LHQuZXh0ZW5kKHQuRnJlcXVlbmN5RW52ZWxvcGUsdC5FbnZlbG9wZSksdC5GcmVxdWVuY3lFbnZlbG9wZS5kZWZhdWx0cz17YmFzZUZyZXF1ZW5jeToyMDAsb2N0YXZlczo0LGV4cG9uZW50OjF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkZyZXF1ZW5jeUVudmVsb3BlLnByb3RvdHlwZSxcImJhc2VGcmVxdWVuY3lcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NjYWxlLm1pbn0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3NjYWxlLm1pbj10aGlzLnRvRnJlcXVlbmN5KHQpLHRoaXMub2N0YXZlcz10aGlzLl9vY3RhdmVzfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkZyZXF1ZW5jeUVudmVsb3BlLnByb3RvdHlwZSxcIm9jdGF2ZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29jdGF2ZXN9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9vY3RhdmVzPXQsdGhpcy5fc2NhbGUubWF4PXRoaXMuYmFzZUZyZXF1ZW5jeSpNYXRoLnBvdygyLHQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkZyZXF1ZW5jeUVudmVsb3BlLnByb3RvdHlwZSxcImV4cG9uZW50XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9leHAudmFsdWV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9leHAudmFsdWU9dH19KSx0LkZyZXF1ZW5jeUVudmVsb3BlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU2NhbGVkRW52ZWxvcGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzfSx0LkZyZXF1ZW5jeUVudmVsb3BlfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDI2KSxpKDYxKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuU2NhbGVFeHA9ZnVuY3Rpb24oZSxpLG4pe3QuU2lnbmFsQmFzZS5jYWxsKHRoaXMpLHRoaXMuX3NjYWxlPXRoaXMub3V0cHV0PW5ldyB0LlNjYWxlKGUsaSksdGhpcy5fZXhwPXRoaXMuaW5wdXQ9bmV3IHQuUG93KHQuZGVmYXVsdEFyZyhuLDIpKSx0aGlzLl9leHAuY29ubmVjdCh0aGlzLl9zY2FsZSl9LHQuZXh0ZW5kKHQuU2NhbGVFeHAsdC5TaWduYWxCYXNlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5TY2FsZUV4cC5wcm90b3R5cGUsXCJleHBvbmVudFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXhwLnZhbHVlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fZXhwLnZhbHVlPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuU2NhbGVFeHAucHJvdG90eXBlLFwibWluXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY2FsZS5taW59LHNldDpmdW5jdGlvbih0KXt0aGlzLl9zY2FsZS5taW49dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5TY2FsZUV4cC5wcm90b3R5cGUsXCJtYXhcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NjYWxlLm1heH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3NjYWxlLm1heD10fX0pLHQuU2NhbGVFeHAucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5TaWduYWxCYXNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fc2NhbGUuZGlzcG9zZSgpLHRoaXMuX3NjYWxlPW51bGwsdGhpcy5fZXhwLmRpc3Bvc2UoKSx0aGlzLl9leHA9bnVsbCx0aGlzfSx0LlNjYWxlRXhwfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDE0KSxpKDIpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5Db21wcmVzc29yPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1widGhyZXNob2xkXCIsXCJyYXRpb1wiXSx0LkNvbXByZXNzb3IpO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5fY29tcHJlc3Nvcj10aGlzLmlucHV0PXRoaXMub3V0cHV0PXRoaXMuY29udGV4dC5jcmVhdGVEeW5hbWljc0NvbXByZXNzb3IoKSx0aGlzLnRocmVzaG9sZD1uZXcgdC5QYXJhbSh7cGFyYW06dGhpcy5fY29tcHJlc3Nvci50aHJlc2hvbGQsdW5pdHM6dC5UeXBlLkRlY2liZWxzLGNvbnZlcnQ6ITF9KSx0aGlzLmF0dGFjaz1uZXcgdC5QYXJhbSh0aGlzLl9jb21wcmVzc29yLmF0dGFjayx0LlR5cGUuVGltZSksdGhpcy5yZWxlYXNlPW5ldyB0LlBhcmFtKHRoaXMuX2NvbXByZXNzb3IucmVsZWFzZSx0LlR5cGUuVGltZSksdGhpcy5rbmVlPW5ldyB0LlBhcmFtKHtwYXJhbTp0aGlzLl9jb21wcmVzc29yLmtuZWUsdW5pdHM6dC5UeXBlLkRlY2liZWxzLGNvbnZlcnQ6ITF9KSx0aGlzLnJhdGlvPW5ldyB0LlBhcmFtKHtwYXJhbTp0aGlzLl9jb21wcmVzc29yLnJhdGlvLGNvbnZlcnQ6ITF9KSx0aGlzLl9yZWFkT25seShbXCJrbmVlXCIsXCJyZWxlYXNlXCIsXCJhdHRhY2tcIixcInJhdGlvXCIsXCJ0aHJlc2hvbGRcIl0pLHRoaXMuc2V0KGUpfSx0LmV4dGVuZCh0LkNvbXByZXNzb3IsdC5BdWRpb05vZGUpLHQuQ29tcHJlc3Nvci5kZWZhdWx0cz17cmF0aW86MTIsdGhyZXNob2xkOi0yNCxyZWxlYXNlOi4yNSxhdHRhY2s6LjAwMyxrbmVlOjMwfSx0LkNvbXByZXNzb3IucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl93cml0YWJsZShbXCJrbmVlXCIsXCJyZWxlYXNlXCIsXCJhdHRhY2tcIixcInJhdGlvXCIsXCJ0aHJlc2hvbGRcIl0pLHRoaXMuX2NvbXByZXNzb3IuZGlzY29ubmVjdCgpLHRoaXMuX2NvbXByZXNzb3I9bnVsbCx0aGlzLmF0dGFjay5kaXNwb3NlKCksdGhpcy5hdHRhY2s9bnVsbCx0aGlzLnJlbGVhc2UuZGlzcG9zZSgpLHRoaXMucmVsZWFzZT1udWxsLHRoaXMudGhyZXNob2xkLmRpc3Bvc2UoKSx0aGlzLnRocmVzaG9sZD1udWxsLHRoaXMucmF0aW8uZGlzcG9zZSgpLHRoaXMucmF0aW89bnVsbCx0aGlzLmtuZWUuZGlzcG9zZSgpLHRoaXMua25lZT1udWxsLHRoaXN9LHQuQ29tcHJlc3Nvcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgyKSxpKDk2KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuQW5hbHlzZXI9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJ0eXBlXCIsXCJzaXplXCJdLHQuQW5hbHlzZXIpO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5fYW5hbHlzZXI9dGhpcy5pbnB1dD10aGlzLm91dHB1dD10aGlzLmNvbnRleHQuY3JlYXRlQW5hbHlzZXIoKSx0aGlzLl90eXBlPWUudHlwZSx0aGlzLl9idWZmZXI9bnVsbCx0aGlzLnNpemU9ZS5zaXplLHRoaXMudHlwZT1lLnR5cGV9LHQuZXh0ZW5kKHQuQW5hbHlzZXIsdC5BdWRpb05vZGUpLHQuQW5hbHlzZXIuZGVmYXVsdHM9e3NpemU6MTAyNCx0eXBlOlwiZmZ0XCIsc21vb3RoaW5nOi44fSx0LkFuYWx5c2VyLlR5cGU9e1dhdmVmb3JtOlwid2F2ZWZvcm1cIixGRlQ6XCJmZnRcIn0sdC5BbmFseXNlci5wcm90b3R5cGUuZ2V0VmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdHlwZT09PXQuQW5hbHlzZXIuVHlwZS5GRlQ/dGhpcy5fYW5hbHlzZXIuZ2V0RmxvYXRGcmVxdWVuY3lEYXRhKHRoaXMuX2J1ZmZlcik6dGhpcy5fdHlwZT09PXQuQW5hbHlzZXIuVHlwZS5XYXZlZm9ybSYmdGhpcy5fYW5hbHlzZXIuZ2V0RmxvYXRUaW1lRG9tYWluRGF0YSh0aGlzLl9idWZmZXIpLHRoaXMuX2J1ZmZlcn0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQW5hbHlzZXIucHJvdG90eXBlLFwic2l6ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYW5hbHlzZXIuZnJlcXVlbmN5QmluQ291bnR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9hbmFseXNlci5mZnRTaXplPTIqdCx0aGlzLl9idWZmZXI9bmV3IEZsb2F0MzJBcnJheSh0KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BbmFseXNlci5wcm90b3R5cGUsXCJ0eXBlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90eXBlfSxzZXQ6ZnVuY3Rpb24oZSl7aWYoZSE9PXQuQW5hbHlzZXIuVHlwZS5XYXZlZm9ybSYmZSE9PXQuQW5hbHlzZXIuVHlwZS5GRlQpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRvbmUuQW5hbHlzZXI6IGludmFsaWQgdHlwZTogXCIrZSk7dGhpcy5fdHlwZT1lfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkFuYWx5c2VyLnByb3RvdHlwZSxcInNtb290aGluZ1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYW5hbHlzZXIuc21vb3RoaW5nVGltZUNvbnN0YW50fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fYW5hbHlzZXIuc21vb3RoaW5nVGltZUNvbnN0YW50PXR9fSksdC5BbmFseXNlci5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3QuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fYW5hbHlzZXIuZGlzY29ubmVjdCgpLHRoaXMuX2FuYWx5c2VyPW51bGwsdGhpcy5fYnVmZmVyPW51bGx9LHQuQW5hbHlzZXJ9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNjUpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtyZXR1cm4gdC5UcmFuc3BvcnRUaW1lPWZ1bmN0aW9uKGUsaSl7aWYoISh0aGlzIGluc3RhbmNlb2YgdC5UcmFuc3BvcnRUaW1lKSlyZXR1cm4gbmV3IHQuVHJhbnNwb3J0VGltZShlLGkpO3QuVGltZS5jYWxsKHRoaXMsZSxpKX0sdC5leHRlbmQodC5UcmFuc3BvcnRUaW1lLHQuVGltZSksdC5UcmFuc3BvcnRUaW1lLnByb3RvdHlwZS5fbm93PWZ1bmN0aW9uKCl7cmV0dXJuIHQuVHJhbnNwb3J0LnNlY29uZHN9LHQuVHJhbnNwb3J0VGltZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg2NCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe3QuRnJlcXVlbmN5PWZ1bmN0aW9uKGUsaSl7aWYoISh0aGlzIGluc3RhbmNlb2YgdC5GcmVxdWVuY3kpKXJldHVybiBuZXcgdC5GcmVxdWVuY3koZSxpKTt0LlRpbWVCYXNlLmNhbGwodGhpcyxlLGkpfSx0LmV4dGVuZCh0LkZyZXF1ZW5jeSx0LlRpbWVCYXNlKSx0LkZyZXF1ZW5jeS5wcm90b3R5cGUuX2V4cHJlc3Npb25zPU9iamVjdC5hc3NpZ24oe30sdC5UaW1lQmFzZS5wcm90b3R5cGUuX2V4cHJlc3Npb25zLHttaWRpOntyZWdleHA6L14oXFxkKyg/OlxcLlxcZCspP21pZGkpLyxtZXRob2Q6ZnVuY3Rpb24oZSl7cmV0dXJuXCJtaWRpXCI9PT10aGlzLl9kZWZhdWx0VW5pdHM/ZTp0LkZyZXF1ZW5jeS5tdG9mKGUpfX0sbm90ZTp7cmVnZXhwOi9eKFthLWddezF9KD86YnwjfHh8YmIpPykoLT9bMC05XSspL2ksbWV0aG9kOmZ1bmN0aW9uKGksbil7dmFyIG89ZVtpLnRvTG93ZXJDYXNlKCldKzEyKihwYXJzZUludChuKSsxKTtyZXR1cm5cIm1pZGlcIj09PXRoaXMuX2RlZmF1bHRVbml0cz9vOnQuRnJlcXVlbmN5Lm10b2Yobyl9fSx0cjp7cmVnZXhwOi9eKFxcZCsoPzpcXC5cXGQrKT8pOihcXGQrKD86XFwuXFxkKyk/KTo/KFxcZCsoPzpcXC5cXGQrKT8pPy8sbWV0aG9kOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj0xO3JldHVybiB0JiZcIjBcIiE9PXQmJihuKj10aGlzLl9iZWF0c1RvVW5pdHModGhpcy5fZ2V0VGltZVNpZ25hdHVyZSgpKnBhcnNlRmxvYXQodCkpKSxlJiZcIjBcIiE9PWUmJihuKj10aGlzLl9iZWF0c1RvVW5pdHMocGFyc2VGbG9hdChlKSkpLGkmJlwiMFwiIT09aSYmKG4qPXRoaXMuX2JlYXRzVG9Vbml0cyhwYXJzZUZsb2F0KGkpLzQpKSxufX19KSx0LkZyZXF1ZW5jeS5wcm90b3R5cGUudHJhbnNwb3NlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnZhbHVlT2YoKSp0LmludGVydmFsVG9GcmVxdWVuY3lSYXRpbyhlKSl9LHQuRnJlcXVlbmN5LnByb3RvdHlwZS5oYXJtb25pemU9ZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRyYW5zcG9zZSh0KX0uYmluZCh0aGlzKSl9LHQuRnJlcXVlbmN5LnByb3RvdHlwZS50b01pZGk9ZnVuY3Rpb24oKXtyZXR1cm4gdC5GcmVxdWVuY3kuZnRvbSh0aGlzLnZhbHVlT2YoKSl9LHQuRnJlcXVlbmN5LnByb3RvdHlwZS50b05vdGU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnRvRnJlcXVlbmN5KCksbj1NYXRoLmxvZzIoZS90LkZyZXF1ZW5jeS5BNCksbz1NYXRoLnJvdW5kKDEyKm4pKzU3LHM9TWF0aC5mbG9vcihvLzEyKTtyZXR1cm4gczwwJiYobys9LTEyKnMpLGlbbyUxMl0rcy50b1N0cmluZygpfSx0LkZyZXF1ZW5jeS5wcm90b3R5cGUudG9TZWNvbmRzPWZ1bmN0aW9uKCl7cmV0dXJuIDEvdC5UaW1lQmFzZS5wcm90b3R5cGUudG9TZWNvbmRzLmNhbGwodGhpcyl9LHQuRnJlcXVlbmN5LnByb3RvdHlwZS50b0ZyZXF1ZW5jeT1mdW5jdGlvbigpe3JldHVybiB0LlRpbWVCYXNlLnByb3RvdHlwZS50b0ZyZXF1ZW5jeS5jYWxsKHRoaXMpfSx0LkZyZXF1ZW5jeS5wcm90b3R5cGUudG9UaWNrcz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX2JlYXRzVG9Vbml0cygxKSxpPXRoaXMudmFsdWVPZigpL2U7cmV0dXJuIE1hdGguZmxvb3IoaSp0LlRyYW5zcG9ydC5QUFEpfSx0LkZyZXF1ZW5jeS5wcm90b3R5cGUuX25vQXJnPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LHQuRnJlcXVlbmN5LnByb3RvdHlwZS5fZnJlcXVlbmN5VG9Vbml0cz1mdW5jdGlvbih0KXtyZXR1cm4gdH0sdC5GcmVxdWVuY3kucHJvdG90eXBlLl90aWNrc1RvVW5pdHM9ZnVuY3Rpb24oZSl7cmV0dXJuIDEvKDYwKmUvKHQuVHJhbnNwb3J0LmJwbS52YWx1ZSp0LlRyYW5zcG9ydC5QUFEpKX0sdC5GcmVxdWVuY3kucHJvdG90eXBlLl9iZWF0c1RvVW5pdHM9ZnVuY3Rpb24oZSl7cmV0dXJuIDEvdC5UaW1lQmFzZS5wcm90b3R5cGUuX2JlYXRzVG9Vbml0cy5jYWxsKHRoaXMsZSl9LHQuRnJlcXVlbmN5LnByb3RvdHlwZS5fc2Vjb25kc1RvVW5pdHM9ZnVuY3Rpb24odCl7cmV0dXJuIDEvdH0sdC5GcmVxdWVuY3kucHJvdG90eXBlLl9kZWZhdWx0VW5pdHM9XCJoelwiO3ZhciBlPXtjYmI6LTIsY2I6LTEsYzowLFwiYyNcIjoxLGN4OjIsZGJiOjAsZGI6MSxkOjIsXCJkI1wiOjMsZHg6NCxlYmI6MixlYjozLGU6NCxcImUjXCI6NSxleDo2LGZiYjozLGZiOjQsZjo1LFwiZiNcIjo2LGZ4OjcsZ2JiOjUsZ2I6NixnOjcsXCJnI1wiOjgsZ3g6OSxhYmI6NyxhYjo4LGE6OSxcImEjXCI6MTAsYXg6MTEsYmJiOjksYmI6MTAsYjoxMSxcImIjXCI6MTIsYng6MTN9LGk9W1wiQ1wiLFwiQyNcIixcIkRcIixcIkQjXCIsXCJFXCIsXCJGXCIsXCJGI1wiLFwiR1wiLFwiRyNcIixcIkFcIixcIkEjXCIsXCJCXCJdO3JldHVybiB0LkZyZXF1ZW5jeS5BND00NDAsdC5GcmVxdWVuY3kubXRvZj1mdW5jdGlvbihlKXtyZXR1cm4gdC5GcmVxdWVuY3kuQTQqTWF0aC5wb3coMiwoZS02OSkvMTIpfSx0LkZyZXF1ZW5jeS5mdG9tPWZ1bmN0aW9uKGUpe3JldHVybiA2OStNYXRoLnJvdW5kKDEyKk1hdGgubG9nMihlL3QuRnJlcXVlbmN5LkE0KSl9LHQuRnJlcXVlbmN5fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDEpLGkoNjEpLGkoNCksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuRW52ZWxvcGU9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJhdHRhY2tcIixcImRlY2F5XCIsXCJzdXN0YWluXCIsXCJyZWxlYXNlXCJdLHQuRW52ZWxvcGUpO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5hdHRhY2s9ZS5hdHRhY2ssdGhpcy5kZWNheT1lLmRlY2F5LHRoaXMuc3VzdGFpbj1lLnN1c3RhaW4sdGhpcy5yZWxlYXNlPWUucmVsZWFzZSx0aGlzLl9hdHRhY2tDdXJ2ZT1cImxpbmVhclwiLHRoaXMuX3JlbGVhc2VDdXJ2ZT1cImV4cG9uZW50aWFsXCIsdGhpcy5fc2lnPXRoaXMub3V0cHV0PW5ldyB0LlNpZ25hbCgwKSx0aGlzLmF0dGFja0N1cnZlPWUuYXR0YWNrQ3VydmUsdGhpcy5yZWxlYXNlQ3VydmU9ZS5yZWxlYXNlQ3VydmUsdGhpcy5kZWNheUN1cnZlPWUuZGVjYXlDdXJ2ZX0sdC5leHRlbmQodC5FbnZlbG9wZSx0LkF1ZGlvTm9kZSksdC5FbnZlbG9wZS5kZWZhdWx0cz17YXR0YWNrOi4wMSxkZWNheTouMSxzdXN0YWluOi41LHJlbGVhc2U6MSxhdHRhY2tDdXJ2ZTpcImxpbmVhclwiLGRlY2F5Q3VydmU6XCJleHBvbmVudGlhbFwiLHJlbGVhc2VDdXJ2ZTpcImV4cG9uZW50aWFsXCJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkVudmVsb3BlLnByb3RvdHlwZSxcInZhbHVlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFZhbHVlQXRUaW1lKHRoaXMubm93KCkpfX0pLHQuRW52ZWxvcGUucHJvdG90eXBlLl9nZXRDdXJ2ZT1mdW5jdGlvbihlLGkpe2lmKHQuaXNTdHJpbmcoZSkpcmV0dXJuIGU7aWYodC5pc0FycmF5KGUpKXtmb3IodmFyIG4gaW4gdC5FbnZlbG9wZS5UeXBlKWlmKHQuRW52ZWxvcGUuVHlwZVtuXVtpXT09PWUpcmV0dXJuIG47cmV0dXJuIGV9fSx0LkVudmVsb3BlLnByb3RvdHlwZS5fc2V0Q3VydmU9ZnVuY3Rpb24oZSxpLG4pe2lmKHQuRW52ZWxvcGUuVHlwZS5oYXNPd25Qcm9wZXJ0eShuKSl7dmFyIG89dC5FbnZlbG9wZS5UeXBlW25dO3QuaXNPYmplY3Qobyk/dGhpc1tlXT1vW2ldOnRoaXNbZV09b31lbHNle2lmKCF0LmlzQXJyYXkobikpdGhyb3cgbmV3IEVycm9yKFwiVG9uZS5FbnZlbG9wZTogaW52YWxpZCBjdXJ2ZTogXCIrbik7dGhpc1tlXT1ufX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuRW52ZWxvcGUucHJvdG90eXBlLFwiYXR0YWNrQ3VydmVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldEN1cnZlKHRoaXMuX2F0dGFja0N1cnZlLFwiSW5cIil9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9zZXRDdXJ2ZShcIl9hdHRhY2tDdXJ2ZVwiLFwiSW5cIix0KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5FbnZlbG9wZS5wcm90b3R5cGUsXCJyZWxlYXNlQ3VydmVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldEN1cnZlKHRoaXMuX3JlbGVhc2VDdXJ2ZSxcIk91dFwiKX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3NldEN1cnZlKFwiX3JlbGVhc2VDdXJ2ZVwiLFwiT3V0XCIsdCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuRW52ZWxvcGUucHJvdG90eXBlLFwiZGVjYXlDdXJ2ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVjYXlDdXJ2ZX0sc2V0OmZ1bmN0aW9uKHQpe2lmKCFbXCJsaW5lYXJcIixcImV4cG9uZW50aWFsXCJdLmluY2x1ZGVzKHQpKXRocm93IG5ldyBFcnJvcihcIlRvbmUuRW52ZWxvcGU6IGludmFsaWQgY3VydmU6IFwiK3QpO3RoaXMuX2RlY2F5Q3VydmU9dH19KSx0LkVudmVsb3BlLnByb3RvdHlwZS50cmlnZ2VyQXR0YWNrPWZ1bmN0aW9uKGUsaSl7dGhpcy5sb2coXCJ0cmlnZ2VyQXR0YWNrXCIsZSxpKSxlPXRoaXMudG9TZWNvbmRzKGUpO3ZhciBuPXRoaXMudG9TZWNvbmRzKHRoaXMuYXR0YWNrKSxvPXRoaXMudG9TZWNvbmRzKHRoaXMuZGVjYXkpO2k9dC5kZWZhdWx0QXJnKGksMSk7dmFyIHM9dGhpcy5nZXRWYWx1ZUF0VGltZShlKTtzPjAmJihuPSgxLXMpLygxL24pKTtpZihcImxpbmVhclwiPT09dGhpcy5fYXR0YWNrQ3VydmUpdGhpcy5fc2lnLmxpbmVhclJhbXBUbyhpLG4sZSk7ZWxzZSBpZihcImV4cG9uZW50aWFsXCI9PT10aGlzLl9hdHRhY2tDdXJ2ZSl0aGlzLl9zaWcudGFyZ2V0UmFtcFRvKGksbixlKTtlbHNlIGlmKG4+MCl7dGhpcy5fc2lnLmNhbmNlbEFuZEhvbGRBdFRpbWUoZSk7Zm9yKHZhciByPXRoaXMuX2F0dGFja0N1cnZlLGE9MTthPHIubGVuZ3RoO2ErKylpZihyW2EtMV08PXMmJnM8PXJbYV0peyhyPXRoaXMuX2F0dGFja0N1cnZlLnNsaWNlKGEpKVswXT1zO2JyZWFrfXRoaXMuX3NpZy5zZXRWYWx1ZUN1cnZlQXRUaW1lKHIsZSxuLGkpfWlmKG8pe3ZhciBsPWkqdGhpcy5zdXN0YWluLGg9ZStuO3RoaXMubG9nKFwiZGVjYXlcIixoKSxcImxpbmVhclwiPT09dGhpcy5fZGVjYXlDdXJ2ZT90aGlzLl9zaWcubGluZWFyUmFtcFRvKGwsbyxoK3RoaXMuc2FtcGxlVGltZSk6XCJleHBvbmVudGlhbFwiPT09dGhpcy5fZGVjYXlDdXJ2ZSYmdGhpcy5fc2lnLmV4cG9uZW50aWFsQXBwcm9hY2hWYWx1ZUF0VGltZShsLGgsbyl9cmV0dXJuIHRoaXN9LHQuRW52ZWxvcGUucHJvdG90eXBlLnRyaWdnZXJSZWxlYXNlPWZ1bmN0aW9uKGUpe3RoaXMubG9nKFwidHJpZ2dlclJlbGVhc2VcIixlKSxlPXRoaXMudG9TZWNvbmRzKGUpO3ZhciBpPXRoaXMuZ2V0VmFsdWVBdFRpbWUoZSk7aWYoaT4wKXt2YXIgbj10aGlzLnRvU2Vjb25kcyh0aGlzLnJlbGVhc2UpO2lmKFwibGluZWFyXCI9PT10aGlzLl9yZWxlYXNlQ3VydmUpdGhpcy5fc2lnLmxpbmVhclJhbXBUbygwLG4sZSk7ZWxzZSBpZihcImV4cG9uZW50aWFsXCI9PT10aGlzLl9yZWxlYXNlQ3VydmUpdGhpcy5fc2lnLnRhcmdldFJhbXBUbygwLG4sZSk7ZWxzZXt2YXIgbz10aGlzLl9yZWxlYXNlQ3VydmU7dC5pc0FycmF5KG8pJiYodGhpcy5fc2lnLmNhbmNlbEFuZEhvbGRBdFRpbWUoZSksdGhpcy5fc2lnLnNldFZhbHVlQ3VydmVBdFRpbWUobyxlLG4saSkpfX1yZXR1cm4gdGhpc30sdC5FbnZlbG9wZS5wcm90b3R5cGUuZ2V0VmFsdWVBdFRpbWU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3NpZy5nZXRWYWx1ZUF0VGltZSh0KX0sdC5FbnZlbG9wZS5wcm90b3R5cGUudHJpZ2dlckF0dGFja1JlbGVhc2U9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBlPXRoaXMudG9TZWNvbmRzKGUpLHRoaXMudHJpZ2dlckF0dGFjayhlLGkpLHRoaXMudHJpZ2dlclJlbGVhc2UoZSt0aGlzLnRvU2Vjb25kcyh0KSksdGhpc30sdC5FbnZlbG9wZS5wcm90b3R5cGUuY2FuY2VsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9zaWcuY2FuY2VsU2NoZWR1bGVkVmFsdWVzKHQpLHRoaXN9LHQuRW52ZWxvcGUucHJvdG90eXBlLmNvbm5lY3Q9dC5TaWduYWxCYXNlLnByb3RvdHlwZS5jb25uZWN0LGZ1bmN0aW9uKCl7dmFyIGUsaSxuPVtdO2ZvcihlPTA7ZTwxMjg7ZSsrKW5bZV09TWF0aC5zaW4oZS8xMjcqKE1hdGguUEkvMikpO3ZhciBvPVtdO2ZvcihlPTA7ZTwxMjc7ZSsrKXtpPWUvMTI3O3ZhciBzPU1hdGguc2luKGkqKDIqTWF0aC5QSSkqNi40LU1hdGguUEkvMikrMTtvW2VdPXMvMTArLjgzKml9b1sxMjddPTE7dmFyIHI9W107Zm9yKGU9MDtlPDEyODtlKyspcltlXT1NYXRoLmNlaWwoZS8xMjcqNSkvNTt2YXIgYT1bXTtmb3IoZT0wO2U8MTI4O2UrKylpPWUvMTI3LGFbZV09LjUqKDEtTWF0aC5jb3MoTWF0aC5QSSppKSk7dmFyIGwsaD1bXTtmb3IoZT0wO2U8MTI4O2UrKyl7aT1lLzEyNzt2YXIgdT00Kk1hdGgucG93KGksMykrLjIsYz1NYXRoLmNvcyh1Kk1hdGguUEkqMippKTtoW2VdPU1hdGguYWJzKGMqKDEtaSkpfWZ1bmN0aW9uIHAodCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0Lmxlbmd0aCksaT0wO2k8dC5sZW5ndGg7aSsrKWVbaV09MS10W2ldO3JldHVybiBlfXQuRW52ZWxvcGUuVHlwZT17bGluZWFyOlwibGluZWFyXCIsZXhwb25lbnRpYWw6XCJleHBvbmVudGlhbFwiLGJvdW5jZTp7SW46cChoKSxPdXQ6aH0sY29zaW5lOntJbjpuLE91dDoobD1uLGwuc2xpY2UoMCkucmV2ZXJzZSgpKX0sc3RlcDp7SW46cixPdXQ6cChyKX0scmlwcGxlOntJbjpvLE91dDpwKG8pfSxzaW5lOntJbjphLE91dDpwKGEpfX19KCksdC5FbnZlbG9wZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3NpZy5kaXNwb3NlKCksdGhpcy5fc2lnPW51bGwsdGhpcy5fYXR0YWNrQ3VydmU9bnVsbCx0aGlzLl9yZWxlYXNlQ3VydmU9bnVsbCx0aGlzfSx0LkVudmVsb3BlfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDYpLGkoMTcpLGkoNSksaSgzKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuRk1Pc2NpbGxhdG9yPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiZnJlcXVlbmN5XCIsXCJ0eXBlXCIsXCJtb2R1bGF0aW9uVHlwZVwiXSx0LkZNT3NjaWxsYXRvcik7dC5Tb3VyY2UuY2FsbCh0aGlzLGUpLHRoaXMuX2NhcnJpZXI9bmV3IHQuT3NjaWxsYXRvcihlLmZyZXF1ZW5jeSxlLnR5cGUpLHRoaXMuZnJlcXVlbmN5PW5ldyB0LlNpZ25hbChlLmZyZXF1ZW5jeSx0LlR5cGUuRnJlcXVlbmN5KSx0aGlzLmRldHVuZT10aGlzLl9jYXJyaWVyLmRldHVuZSx0aGlzLmRldHVuZS52YWx1ZT1lLmRldHVuZSx0aGlzLm1vZHVsYXRpb25JbmRleD1uZXcgdC5NdWx0aXBseShlLm1vZHVsYXRpb25JbmRleCksdGhpcy5tb2R1bGF0aW9uSW5kZXgudW5pdHM9dC5UeXBlLlBvc2l0aXZlLHRoaXMuX21vZHVsYXRvcj1uZXcgdC5Pc2NpbGxhdG9yKGUuZnJlcXVlbmN5LGUubW9kdWxhdGlvblR5cGUpLHRoaXMuaGFybW9uaWNpdHk9bmV3IHQuTXVsdGlwbHkoZS5oYXJtb25pY2l0eSksdGhpcy5oYXJtb25pY2l0eS51bml0cz10LlR5cGUuUG9zaXRpdmUsdGhpcy5fbW9kdWxhdGlvbk5vZGU9bmV3IHQuR2FpbigwKSx0aGlzLmZyZXF1ZW5jeS5jb25uZWN0KHRoaXMuX2NhcnJpZXIuZnJlcXVlbmN5KSx0aGlzLmZyZXF1ZW5jeS5jaGFpbih0aGlzLmhhcm1vbmljaXR5LHRoaXMuX21vZHVsYXRvci5mcmVxdWVuY3kpLHRoaXMuZnJlcXVlbmN5LmNoYWluKHRoaXMubW9kdWxhdGlvbkluZGV4LHRoaXMuX21vZHVsYXRpb25Ob2RlKSx0aGlzLl9tb2R1bGF0b3IuY29ubmVjdCh0aGlzLl9tb2R1bGF0aW9uTm9kZS5nYWluKSx0aGlzLl9tb2R1bGF0aW9uTm9kZS5jb25uZWN0KHRoaXMuX2NhcnJpZXIuZnJlcXVlbmN5KSx0aGlzLl9jYXJyaWVyLmNvbm5lY3QodGhpcy5vdXRwdXQpLHRoaXMuZGV0dW5lLmNvbm5lY3QodGhpcy5fbW9kdWxhdG9yLmRldHVuZSksdGhpcy5waGFzZT1lLnBoYXNlLHRoaXMuX3JlYWRPbmx5KFtcIm1vZHVsYXRpb25JbmRleFwiLFwiZnJlcXVlbmN5XCIsXCJkZXR1bmVcIixcImhhcm1vbmljaXR5XCJdKX0sdC5leHRlbmQodC5GTU9zY2lsbGF0b3IsdC5Tb3VyY2UpLHQuRk1Pc2NpbGxhdG9yLmRlZmF1bHRzPXtmcmVxdWVuY3k6NDQwLGRldHVuZTowLHBoYXNlOjAsdHlwZTpcInNpbmVcIixtb2R1bGF0aW9uSW5kZXg6Mixtb2R1bGF0aW9uVHlwZTpcInNxdWFyZVwiLGhhcm1vbmljaXR5OjF9LHQuRk1Pc2NpbGxhdG9yLnByb3RvdHlwZS5fc3RhcnQ9ZnVuY3Rpb24odCl7dGhpcy5fbW9kdWxhdG9yLnN0YXJ0KHQpLHRoaXMuX2NhcnJpZXIuc3RhcnQodCl9LHQuRk1Pc2NpbGxhdG9yLnByb3RvdHlwZS5fc3RvcD1mdW5jdGlvbih0KXt0aGlzLl9tb2R1bGF0b3Iuc3RvcCh0KSx0aGlzLl9jYXJyaWVyLnN0b3AodCl9LHQuRk1Pc2NpbGxhdG9yLnByb3RvdHlwZS5yZXN0YXJ0PWZ1bmN0aW9uKHQpe3RoaXMuX21vZHVsYXRvci5yZXN0YXJ0KHQpLHRoaXMuX2NhcnJpZXIucmVzdGFydCh0KX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuRk1Pc2NpbGxhdG9yLnByb3RvdHlwZSxcInR5cGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NhcnJpZXIudHlwZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhcnJpZXIudHlwZT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkZNT3NjaWxsYXRvci5wcm90b3R5cGUsXCJiYXNlVHlwZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2Fycmllci5iYXNlVHlwZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhcnJpZXIuYmFzZVR5cGU9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5GTU9zY2lsbGF0b3IucHJvdG90eXBlLFwicGFydGlhbENvdW50XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jYXJyaWVyLnBhcnRpYWxDb3VudH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhcnJpZXIucGFydGlhbENvdW50PXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuRk1Pc2NpbGxhdG9yLnByb3RvdHlwZSxcIm1vZHVsYXRpb25UeXBlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb2R1bGF0b3IudHlwZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX21vZHVsYXRvci50eXBlPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuRk1Pc2NpbGxhdG9yLnByb3RvdHlwZSxcInBoYXNlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jYXJyaWVyLnBoYXNlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2Fycmllci5waGFzZT10LHRoaXMuX21vZHVsYXRvci5waGFzZT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkZNT3NjaWxsYXRvci5wcm90b3R5cGUsXCJwYXJ0aWFsc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2Fycmllci5wYXJ0aWFsc30sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhcnJpZXIucGFydGlhbHM9dH19KSx0LkZNT3NjaWxsYXRvci5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LlNvdXJjZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcIm1vZHVsYXRpb25JbmRleFwiLFwiZnJlcXVlbmN5XCIsXCJkZXR1bmVcIixcImhhcm1vbmljaXR5XCJdKSx0aGlzLmZyZXF1ZW5jeS5kaXNwb3NlKCksdGhpcy5mcmVxdWVuY3k9bnVsbCx0aGlzLmRldHVuZT1udWxsLHRoaXMuaGFybW9uaWNpdHkuZGlzcG9zZSgpLHRoaXMuaGFybW9uaWNpdHk9bnVsbCx0aGlzLl9jYXJyaWVyLmRpc3Bvc2UoKSx0aGlzLl9jYXJyaWVyPW51bGwsdGhpcy5fbW9kdWxhdG9yLmRpc3Bvc2UoKSx0aGlzLl9tb2R1bGF0b3I9bnVsbCx0aGlzLl9tb2R1bGF0aW9uTm9kZS5kaXNwb3NlKCksdGhpcy5fbW9kdWxhdGlvbk5vZGU9bnVsbCx0aGlzLm1vZHVsYXRpb25JbmRleC5kaXNwb3NlKCksdGhpcy5tb2R1bGF0aW9uSW5kZXg9bnVsbCx0aGlzfSx0LkZNT3NjaWxsYXRvcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg2KSxpKDE3KSxpKDEpLGkoNyksaSgzKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuUHVsc2VPc2NpbGxhdG9yPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiZnJlcXVlbmN5XCIsXCJ3aWR0aFwiXSx0Lk9zY2lsbGF0b3IpO3QuU291cmNlLmNhbGwodGhpcyxlKSx0aGlzLndpZHRoPW5ldyB0LlNpZ25hbChlLndpZHRoLHQuVHlwZS5Ob3JtYWxSYW5nZSksdGhpcy5fd2lkdGhHYXRlPW5ldyB0LkdhaW4oMCksdGhpcy5fc2F3dG9vdGg9bmV3IHQuT3NjaWxsYXRvcih7ZnJlcXVlbmN5OmUuZnJlcXVlbmN5LGRldHVuZTplLmRldHVuZSx0eXBlOlwic2F3dG9vdGhcIixwaGFzZTplLnBoYXNlfSksdGhpcy5mcmVxdWVuY3k9dGhpcy5fc2F3dG9vdGguZnJlcXVlbmN5LHRoaXMuZGV0dW5lPXRoaXMuX3Nhd3Rvb3RoLmRldHVuZSx0aGlzLl90aHJlc2g9bmV3IHQuV2F2ZVNoYXBlcihmdW5jdGlvbih0KXtyZXR1cm4gdDwwPy0xOjF9KSx0aGlzLl9zYXd0b290aC5jaGFpbih0aGlzLl90aHJlc2gsdGhpcy5vdXRwdXQpLHRoaXMud2lkdGguY2hhaW4odGhpcy5fd2lkdGhHYXRlLHRoaXMuX3RocmVzaCksdGhpcy5fcmVhZE9ubHkoW1wid2lkdGhcIixcImZyZXF1ZW5jeVwiLFwiZGV0dW5lXCJdKX0sdC5leHRlbmQodC5QdWxzZU9zY2lsbGF0b3IsdC5Tb3VyY2UpLHQuUHVsc2VPc2NpbGxhdG9yLmRlZmF1bHRzPXtmcmVxdWVuY3k6NDQwLGRldHVuZTowLHBoYXNlOjAsd2lkdGg6LjJ9LHQuUHVsc2VPc2NpbGxhdG9yLnByb3RvdHlwZS5fc3RhcnQ9ZnVuY3Rpb24odCl7dD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl9zYXd0b290aC5zdGFydCh0KSx0aGlzLl93aWR0aEdhdGUuZ2Fpbi5zZXRWYWx1ZUF0VGltZSgxLHQpfSx0LlB1bHNlT3NjaWxsYXRvci5wcm90b3R5cGUuX3N0b3A9ZnVuY3Rpb24odCl7dD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl9zYXd0b290aC5zdG9wKHQpLHRoaXMuX3dpZHRoR2F0ZS5nYWluLnNldFZhbHVlQXRUaW1lKDAsdCl9LHQuUHVsc2VPc2NpbGxhdG9yLnByb3RvdHlwZS5yZXN0YXJ0PWZ1bmN0aW9uKHQpe3RoaXMuX3Nhd3Rvb3RoLnJlc3RhcnQodCksdGhpcy5fd2lkdGhHYXRlLmdhaW4uY2FuY2VsU2NoZWR1bGVkVmFsdWVzKHQpLHRoaXMuX3dpZHRoR2F0ZS5nYWluLnNldFZhbHVlQXRUaW1lKDEsdCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlB1bHNlT3NjaWxsYXRvci5wcm90b3R5cGUsXCJwaGFzZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2F3dG9vdGgucGhhc2V9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9zYXd0b290aC5waGFzZT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlB1bHNlT3NjaWxsYXRvci5wcm90b3R5cGUsXCJ0eXBlXCIse2dldDpmdW5jdGlvbigpe3JldHVyblwicHVsc2VcIn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QdWxzZU9zY2lsbGF0b3IucHJvdG90eXBlLFwiYmFzZVR5cGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuXCJwdWxzZVwifX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlB1bHNlT3NjaWxsYXRvci5wcm90b3R5cGUsXCJwYXJ0aWFsc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm5bXX19KSx0LlB1bHNlT3NjaWxsYXRvci5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LlNvdXJjZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3Nhd3Rvb3RoLmRpc3Bvc2UoKSx0aGlzLl9zYXd0b290aD1udWxsLHRoaXMuX3dyaXRhYmxlKFtcIndpZHRoXCIsXCJmcmVxdWVuY3lcIixcImRldHVuZVwiXSksdGhpcy53aWR0aC5kaXNwb3NlKCksdGhpcy53aWR0aD1udWxsLHRoaXMuX3dpZHRoR2F0ZS5kaXNwb3NlKCksdGhpcy5fd2lkdGhHYXRlPW51bGwsdGhpcy5fdGhyZXNoLmRpc3Bvc2UoKSx0aGlzLl90aHJlc2g9bnVsbCx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXMuZGV0dW5lPW51bGwsdGhpc30sdC5QdWxzZU9zY2lsbGF0b3J9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMTYpLGkoNCksaSgzMyldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkV2ZW50PWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiY2FsbGJhY2tcIixcInZhbHVlXCJdLHQuRXZlbnQpO3QuY2FsbCh0aGlzKSx0aGlzLl9sb29wPWUubG9vcCx0aGlzLmNhbGxiYWNrPWUuY2FsbGJhY2ssdGhpcy52YWx1ZT1lLnZhbHVlLHRoaXMuX2xvb3BTdGFydD10aGlzLnRvVGlja3MoZS5sb29wU3RhcnQpLHRoaXMuX2xvb3BFbmQ9dGhpcy50b1RpY2tzKGUubG9vcEVuZCksdGhpcy5fc3RhdGU9bmV3IHQuVGltZWxpbmVTdGF0ZSh0LlN0YXRlLlN0b3BwZWQpLHRoaXMuX3BsYXliYWNrUmF0ZT0xLHRoaXMuX3N0YXJ0T2Zmc2V0PTAsdGhpcy5fcHJvYmFiaWxpdHk9ZS5wcm9iYWJpbGl0eSx0aGlzLl9odW1hbml6ZT1lLmh1bWFuaXplLHRoaXMubXV0ZT1lLm11dGUsdGhpcy5wbGF5YmFja1JhdGU9ZS5wbGF5YmFja1JhdGV9LHQuZXh0ZW5kKHQuRXZlbnQpLHQuRXZlbnQuZGVmYXVsdHM9e2NhbGxiYWNrOnQubm9PcCxsb29wOiExLGxvb3BFbmQ6XCIxbVwiLGxvb3BTdGFydDowLHBsYXliYWNrUmF0ZToxLHZhbHVlOm51bGwscHJvYmFiaWxpdHk6MSxtdXRlOiExLGh1bWFuaXplOiExfSx0LkV2ZW50LnByb3RvdHlwZS5fcmVzY2hlZHVsZUV2ZW50cz1mdW5jdGlvbihlKXtyZXR1cm4gZT10LmRlZmF1bHRBcmcoZSwtMSksdGhpcy5fc3RhdGUuZm9yRWFjaEZyb20oZSxmdW5jdGlvbihlKXt2YXIgaTtpZihlLnN0YXRlPT09dC5TdGF0ZS5TdGFydGVkKXt0LmlzRGVmaW5lZChlLmlkKSYmdC5UcmFuc3BvcnQuY2xlYXIoZS5pZCk7dmFyIG49ZS50aW1lK01hdGgucm91bmQodGhpcy5zdGFydE9mZnNldC90aGlzLl9wbGF5YmFja1JhdGUpO2lmKHRoaXMuX2xvb3Ape2k9MS8wLHQuaXNOdW1iZXIodGhpcy5fbG9vcCkmJihpPXRoaXMuX2xvb3AqdGhpcy5fZ2V0TG9vcER1cmF0aW9uKCkpO3ZhciBvPXRoaXMuX3N0YXRlLmdldEFmdGVyKG4pO251bGwhPT1vJiYoaT1NYXRoLm1pbihpLG8udGltZS1uKSksaSE9PTEvMCYmKHRoaXMuX3N0YXRlLnNldFN0YXRlQXRUaW1lKHQuU3RhdGUuU3RvcHBlZCxuK2krMSksaT10LlRpY2tzKGkpKTt2YXIgcz10LlRpY2tzKHRoaXMuX2dldExvb3BEdXJhdGlvbigpKTtlLmlkPXQuVHJhbnNwb3J0LnNjaGVkdWxlUmVwZWF0KHRoaXMuX3RpY2suYmluZCh0aGlzKSxzLHQuVGlja3MobiksaSl9ZWxzZSBlLmlkPXQuVHJhbnNwb3J0LnNjaGVkdWxlKHRoaXMuX3RpY2suYmluZCh0aGlzKSx0LlRpY2tzKG4pKX19LmJpbmQodGhpcykpLHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkV2ZW50LnByb3RvdHlwZSxcInN0YXRlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZSh0LlRyYW5zcG9ydC50aWNrcyl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuRXZlbnQucHJvdG90eXBlLFwic3RhcnRPZmZzZXRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N0YXJ0T2Zmc2V0fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fc3RhcnRPZmZzZXQ9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5FdmVudC5wcm90b3R5cGUsXCJwcm9iYWJpbGl0eVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvYmFiaWxpdHl9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9wcm9iYWJpbGl0eT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkV2ZW50LnByb3RvdHlwZSxcImh1bWFuaXplXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9odW1hbml6ZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2h1bWFuaXplPXR9fSksdC5FdmVudC5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dGhpcy50b1RpY2tzKGUpLHRoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKGUpPT09dC5TdGF0ZS5TdG9wcGVkJiYodGhpcy5fc3RhdGUuYWRkKHtzdGF0ZTp0LlN0YXRlLlN0YXJ0ZWQsdGltZTplLGlkOnZvaWQgMH0pLHRoaXMuX3Jlc2NoZWR1bGVFdmVudHMoZSkpLHRoaXN9LHQuRXZlbnQucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oZSl7aWYodGhpcy5jYW5jZWwoZSksZT10aGlzLnRvVGlja3MoZSksdGhpcy5fc3RhdGUuZ2V0VmFsdWVBdFRpbWUoZSk9PT10LlN0YXRlLlN0YXJ0ZWQpe3RoaXMuX3N0YXRlLnNldFN0YXRlQXRUaW1lKHQuU3RhdGUuU3RvcHBlZCxlKTt2YXIgaT10aGlzLl9zdGF0ZS5nZXRCZWZvcmUoZSksbj1lO251bGwhPT1pJiYobj1pLnRpbWUpLHRoaXMuX3Jlc2NoZWR1bGVFdmVudHMobil9cmV0dXJuIHRoaXN9LHQuRXZlbnQucHJvdG90eXBlLmNhbmNlbD1mdW5jdGlvbihlKXtyZXR1cm4gZT10LmRlZmF1bHRBcmcoZSwtMS8wKSxlPXRoaXMudG9UaWNrcyhlKSx0aGlzLl9zdGF0ZS5mb3JFYWNoRnJvbShlLGZ1bmN0aW9uKGUpe3QuVHJhbnNwb3J0LmNsZWFyKGUuaWQpfSksdGhpcy5fc3RhdGUuY2FuY2VsKGUpLHRoaXN9LHQuRXZlbnQucHJvdG90eXBlLl90aWNrPWZ1bmN0aW9uKGUpe3ZhciBpPXQuVHJhbnNwb3J0LmdldFRpY2tzQXRUaW1lKGUpO2lmKCF0aGlzLm11dGUmJnRoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKGkpPT09dC5TdGF0ZS5TdGFydGVkKXtpZih0aGlzLnByb2JhYmlsaXR5PDEmJk1hdGgucmFuZG9tKCk+dGhpcy5wcm9iYWJpbGl0eSlyZXR1cm47aWYodGhpcy5odW1hbml6ZSl7dmFyIG49LjAyO3QuaXNCb29sZWFuKHRoaXMuaHVtYW5pemUpfHwobj10aGlzLnRvU2Vjb25kcyh0aGlzLmh1bWFuaXplKSksZSs9KDIqTWF0aC5yYW5kb20oKS0xKSpufXRoaXMuY2FsbGJhY2soZSx0aGlzLnZhbHVlKX19LHQuRXZlbnQucHJvdG90eXBlLl9nZXRMb29wRHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZCgodGhpcy5fbG9vcEVuZC10aGlzLl9sb29wU3RhcnQpL3RoaXMuX3BsYXliYWNrUmF0ZSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkV2ZW50LnByb3RvdHlwZSxcImxvb3BcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xvb3B9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9sb29wPXQsdGhpcy5fcmVzY2hlZHVsZUV2ZW50cygpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkV2ZW50LnByb3RvdHlwZSxcInBsYXliYWNrUmF0ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGxheWJhY2tSYXRlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fcGxheWJhY2tSYXRlPXQsdGhpcy5fcmVzY2hlZHVsZUV2ZW50cygpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkV2ZW50LnByb3RvdHlwZSxcImxvb3BFbmRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHQuVGlja3ModGhpcy5fbG9vcEVuZCkudG9TZWNvbmRzKCl9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9sb29wRW5kPXRoaXMudG9UaWNrcyh0KSx0aGlzLl9sb29wJiZ0aGlzLl9yZXNjaGVkdWxlRXZlbnRzKCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuRXZlbnQucHJvdG90eXBlLFwibG9vcFN0YXJ0XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0LlRpY2tzKHRoaXMuX2xvb3BTdGFydCkudG9TZWNvbmRzKCl9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9sb29wU3RhcnQ9dGhpcy50b1RpY2tzKHQpLHRoaXMuX2xvb3AmJnRoaXMuX3Jlc2NoZWR1bGVFdmVudHMoKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5FdmVudC5wcm90b3R5cGUsXCJwcm9ncmVzc1wiLHtnZXQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9sb29wKXt2YXIgZT10LlRyYW5zcG9ydC50aWNrcyxpPXRoaXMuX3N0YXRlLmdldChlKTtpZihudWxsIT09aSYmaS5zdGF0ZT09PXQuU3RhdGUuU3RhcnRlZCl7dmFyIG49dGhpcy5fZ2V0TG9vcER1cmF0aW9uKCk7cmV0dXJuKGUtaS50aW1lKSVuL259cmV0dXJuIDB9cmV0dXJuIDB9fSksdC5FdmVudC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuY2FuY2VsKCksdGhpcy5fc3RhdGUuZGlzcG9zZSgpLHRoaXMuX3N0YXRlPW51bGwsdGhpcy5jYWxsYmFjaz1udWxsLHRoaXMudmFsdWU9bnVsbH0sdC5FdmVudH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxKSxpKDEzKSxpKDI5KSxpKDEwKSxpKDMpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0Lk1pZFNpZGVNZXJnZT1mdW5jdGlvbigpe3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5jcmVhdGVJbnNPdXRzKDIsMCksdGhpcy5taWQ9dGhpcy5pbnB1dFswXT1uZXcgdC5HYWluLHRoaXMuX2xlZnQ9bmV3IHQuQWRkLHRoaXMuX3RpbWVzVHdvTGVmdD1uZXcgdC5NdWx0aXBseShNYXRoLlNRUlQxXzIpLHRoaXMuc2lkZT10aGlzLmlucHV0WzFdPW5ldyB0LkdhaW4sdGhpcy5fcmlnaHQ9bmV3IHQuU3VidHJhY3QsdGhpcy5fdGltZXNUd29SaWdodD1uZXcgdC5NdWx0aXBseShNYXRoLlNRUlQxXzIpLHRoaXMuX21lcmdlPXRoaXMub3V0cHV0PW5ldyB0Lk1lcmdlLHRoaXMubWlkLmNvbm5lY3QodGhpcy5fbGVmdCwwLDApLHRoaXMuc2lkZS5jb25uZWN0KHRoaXMuX2xlZnQsMCwxKSx0aGlzLm1pZC5jb25uZWN0KHRoaXMuX3JpZ2h0LDAsMCksdGhpcy5zaWRlLmNvbm5lY3QodGhpcy5fcmlnaHQsMCwxKSx0aGlzLl9sZWZ0LmNvbm5lY3QodGhpcy5fdGltZXNUd29MZWZ0KSx0aGlzLl9yaWdodC5jb25uZWN0KHRoaXMuX3RpbWVzVHdvUmlnaHQpLHRoaXMuX3RpbWVzVHdvTGVmdC5jb25uZWN0KHRoaXMuX21lcmdlLDAsMCksdGhpcy5fdGltZXNUd29SaWdodC5jb25uZWN0KHRoaXMuX21lcmdlLDAsMSl9LHQuZXh0ZW5kKHQuTWlkU2lkZU1lcmdlLHQuQXVkaW9Ob2RlKSx0Lk1pZFNpZGVNZXJnZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMubWlkLmRpc3Bvc2UoKSx0aGlzLm1pZD1udWxsLHRoaXMuc2lkZS5kaXNwb3NlKCksdGhpcy5zaWRlPW51bGwsdGhpcy5fbGVmdC5kaXNwb3NlKCksdGhpcy5fbGVmdD1udWxsLHRoaXMuX3RpbWVzVHdvTGVmdC5kaXNwb3NlKCksdGhpcy5fdGltZXNUd29MZWZ0PW51bGwsdGhpcy5fcmlnaHQuZGlzcG9zZSgpLHRoaXMuX3JpZ2h0PW51bGwsdGhpcy5fdGltZXNUd29SaWdodC5kaXNwb3NlKCksdGhpcy5fdGltZXNUd29SaWdodD1udWxsLHRoaXMuX21lcmdlLmRpc3Bvc2UoKSx0aGlzLl9tZXJnZT1udWxsLHRoaXN9LHQuTWlkU2lkZU1lcmdlfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDI5KSxpKDEzKSxpKDEpLGkoMTkpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0Lk1pZFNpZGVTcGxpdD1mdW5jdGlvbigpe3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5jcmVhdGVJbnNPdXRzKDAsMiksdGhpcy5fc3BsaXQ9dGhpcy5pbnB1dD1uZXcgdC5TcGxpdCx0aGlzLl9taWRBZGQ9bmV3IHQuQWRkLHRoaXMubWlkPXRoaXMub3V0cHV0WzBdPW5ldyB0Lk11bHRpcGx5KE1hdGguU1FSVDFfMiksdGhpcy5fc2lkZVN1YnRyYWN0PW5ldyB0LlN1YnRyYWN0LHRoaXMuc2lkZT10aGlzLm91dHB1dFsxXT1uZXcgdC5NdWx0aXBseShNYXRoLlNRUlQxXzIpLHRoaXMuX3NwbGl0LmNvbm5lY3QodGhpcy5fbWlkQWRkLDAsMCksdGhpcy5fc3BsaXQuY29ubmVjdCh0aGlzLl9taWRBZGQsMSwxKSx0aGlzLl9zcGxpdC5jb25uZWN0KHRoaXMuX3NpZGVTdWJ0cmFjdCwwLDApLHRoaXMuX3NwbGl0LmNvbm5lY3QodGhpcy5fc2lkZVN1YnRyYWN0LDEsMSksdGhpcy5fbWlkQWRkLmNvbm5lY3QodGhpcy5taWQpLHRoaXMuX3NpZGVTdWJ0cmFjdC5jb25uZWN0KHRoaXMuc2lkZSl9LHQuZXh0ZW5kKHQuTWlkU2lkZVNwbGl0LHQuQXVkaW9Ob2RlKSx0Lk1pZFNpZGVTcGxpdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMubWlkLmRpc3Bvc2UoKSx0aGlzLm1pZD1udWxsLHRoaXMuc2lkZS5kaXNwb3NlKCksdGhpcy5zaWRlPW51bGwsdGhpcy5fbWlkQWRkLmRpc3Bvc2UoKSx0aGlzLl9taWRBZGQ9bnVsbCx0aGlzLl9zaWRlU3VidHJhY3QuZGlzcG9zZSgpLHRoaXMuX3NpZGVTdWJ0cmFjdD1udWxsLHRoaXMuX3NwbGl0LmRpc3Bvc2UoKSx0aGlzLl9zcGxpdD1udWxsLHRoaXN9LHQuTWlkU2lkZVNwbGl0fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDEpLGkoOSksaSgyKSxpKDU4KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuTG93cGFzc0NvbWJGaWx0ZXI9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJkZWxheVRpbWVcIixcInJlc29uYW5jZVwiLFwiZGFtcGVuaW5nXCJdLHQuTG93cGFzc0NvbWJGaWx0ZXIpO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5fY29tYkZpbHRlcj10aGlzLm91dHB1dD1uZXcgdC5GZWVkYmFja0NvbWJGaWx0ZXIoZS5kZWxheVRpbWUsZS5yZXNvbmFuY2UpLHRoaXMuZGVsYXlUaW1lPXRoaXMuX2NvbWJGaWx0ZXIuZGVsYXlUaW1lLHRoaXMuX2xvd3Bhc3M9dGhpcy5pbnB1dD1uZXcgdC5GaWx0ZXIoe2ZyZXF1ZW5jeTplLmRhbXBlbmluZyx0eXBlOlwibG93cGFzc1wiLFE6MCxyb2xsb2ZmOi0xMn0pLHRoaXMuZGFtcGVuaW5nPXRoaXMuX2xvd3Bhc3MuZnJlcXVlbmN5LHRoaXMucmVzb25hbmNlPXRoaXMuX2NvbWJGaWx0ZXIucmVzb25hbmNlLHRoaXMuX2xvd3Bhc3MuY29ubmVjdCh0aGlzLl9jb21iRmlsdGVyKSx0aGlzLl9yZWFkT25seShbXCJkYW1wZW5pbmdcIixcInJlc29uYW5jZVwiLFwiZGVsYXlUaW1lXCJdKX0sdC5leHRlbmQodC5Mb3dwYXNzQ29tYkZpbHRlcix0LkF1ZGlvTm9kZSksdC5Mb3dwYXNzQ29tYkZpbHRlci5kZWZhdWx0cz17ZGVsYXlUaW1lOi4xLHJlc29uYW5jZTouNSxkYW1wZW5pbmc6M2UzfSx0Lkxvd3Bhc3NDb21iRmlsdGVyLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fd3JpdGFibGUoW1wiZGFtcGVuaW5nXCIsXCJyZXNvbmFuY2VcIixcImRlbGF5VGltZVwiXSksdGhpcy5fY29tYkZpbHRlci5kaXNwb3NlKCksdGhpcy5fY29tYkZpbHRlcj1udWxsLHRoaXMucmVzb25hbmNlPW51bGwsdGhpcy5kZWxheVRpbWU9bnVsbCx0aGlzLl9sb3dwYXNzLmRpc3Bvc2UoKSx0aGlzLl9sb3dwYXNzPW51bGwsdGhpcy5kYW1wZW5pbmc9bnVsbCx0aGlzfSx0Lkxvd3Bhc3NDb21iRmlsdGVyfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDQ1KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuVGlja3M9ZnVuY3Rpb24oZSxpKXtpZighKHRoaXMgaW5zdGFuY2VvZiB0LlRpY2tzKSlyZXR1cm4gbmV3IHQuVGlja3MoZSxpKTt0LlRyYW5zcG9ydFRpbWUuY2FsbCh0aGlzLGUsaSl9LHQuZXh0ZW5kKHQuVGlja3MsdC5UcmFuc3BvcnRUaW1lKSx0LlRpY2tzLnByb3RvdHlwZS5fZGVmYXVsdFVuaXRzPVwiaVwiLHQuVGlja3MucHJvdG90eXBlLl9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gdC5UcmFuc3BvcnQudGlja3N9LHQuVGlja3MucHJvdG90eXBlLl9iZWF0c1RvVW5pdHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2dldFBQUSgpKnR9LHQuVGlja3MucHJvdG90eXBlLl9zZWNvbmRzVG9Vbml0cz1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5mbG9vcih0Lyg2MC90aGlzLl9nZXRCcG0oKSkqdGhpcy5fZ2V0UFBRKCkpfSx0LlRpY2tzLnByb3RvdHlwZS5fdGlja3NUb1VuaXRzPWZ1bmN0aW9uKHQpe3JldHVybiB0fSx0LlRpY2tzLnByb3RvdHlwZS50b1RpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWVPZigpfSx0LlRpY2tzLnByb3RvdHlwZS50b1NlY29uZHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZU9mKCkvdGhpcy5fZ2V0UFBRKCkqKDYwL3RoaXMuX2dldEJwbSgpKX0sdC5UaWNrc30uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg1NCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe3JldHVybiB0LlRyYW5zcG9ydEV2ZW50PWZ1bmN0aW9uKGUsaSl7aT10LmRlZmF1bHRBcmcoaSx0LlRyYW5zcG9ydEV2ZW50LmRlZmF1bHRzKSx0LmNhbGwodGhpcyksdGhpcy5UcmFuc3BvcnQ9ZSx0aGlzLmlkPXQuVHJhbnNwb3J0RXZlbnQuX2V2ZW50SWQrKyx0aGlzLnRpbWU9dC5UaWNrcyhpLnRpbWUpLHRoaXMuY2FsbGJhY2s9aS5jYWxsYmFjayx0aGlzLl9vbmNlPWkub25jZX0sdC5leHRlbmQodC5UcmFuc3BvcnRFdmVudCksdC5UcmFuc3BvcnRFdmVudC5kZWZhdWx0cz17b25jZTohMSxjYWxsYmFjazp0Lm5vT3B9LHQuVHJhbnNwb3J0RXZlbnQuX2V2ZW50SWQ9MCx0LlRyYW5zcG9ydEV2ZW50LnByb3RvdHlwZS5pbnZva2U9ZnVuY3Rpb24odCl7dGhpcy5jYWxsYmFjayYmKHRoaXMuY2FsbGJhY2sodCksdGhpcy5fb25jZSYmdGhpcy5UcmFuc3BvcnQmJnRoaXMuVHJhbnNwb3J0LmNsZWFyKHRoaXMuaWQpKX0sdC5UcmFuc3BvcnRFdmVudC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5UcmFuc3BvcnQ9bnVsbCx0aGlzLmNhbGxiYWNrPW51bGwsdGhpcy50aW1lPW51bGwsdGhpc30sdC5UcmFuc3BvcnRFdmVudH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg4NSksaSgzMyksaSgyNCksaSgxNCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlRpY2tTb3VyY2U9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJmcmVxdWVuY3lcIl0sdC5UaWNrU291cmNlKTt0aGlzLmZyZXF1ZW5jeT1uZXcgdC5UaWNrU2lnbmFsKGUuZnJlcXVlbmN5KSx0aGlzLl9yZWFkT25seShcImZyZXF1ZW5jeVwiKSx0aGlzLl9zdGF0ZT1uZXcgdC5UaW1lbGluZVN0YXRlKHQuU3RhdGUuU3RvcHBlZCksdGhpcy5fc3RhdGUuc2V0U3RhdGVBdFRpbWUodC5TdGF0ZS5TdG9wcGVkLDApLHRoaXMuX3RpY2tPZmZzZXQ9bmV3IHQuVGltZWxpbmUsdGhpcy5zZXRUaWNrc0F0VGltZSgwLDApfSx0LmV4dGVuZCh0LlRpY2tTb3VyY2UpLHQuVGlja1NvdXJjZS5kZWZhdWx0cz17ZnJlcXVlbmN5OjF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRpY2tTb3VyY2UucHJvdG90eXBlLFwic3RhdGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKHRoaXMubm93KCkpfX0pLHQuVGlja1NvdXJjZS5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oZSxpKXtyZXR1cm4gZT10aGlzLnRvU2Vjb25kcyhlKSx0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZShlKSE9PXQuU3RhdGUuU3RhcnRlZCYmKHRoaXMuX3N0YXRlLnNldFN0YXRlQXRUaW1lKHQuU3RhdGUuU3RhcnRlZCxlKSx0LmlzRGVmaW5lZChpKSYmdGhpcy5zZXRUaWNrc0F0VGltZShpLGUpKSx0aGlzfSx0LlRpY2tTb3VyY2UucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oZSl7aWYoZT10aGlzLnRvU2Vjb25kcyhlKSx0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZShlKT09PXQuU3RhdGUuU3RvcHBlZCl7dmFyIGk9dGhpcy5fc3RhdGUuZ2V0KGUpO2kudGltZT4wJiYodGhpcy5fdGlja09mZnNldC5jYW5jZWwoaS50aW1lKSx0aGlzLl9zdGF0ZS5jYW5jZWwoaS50aW1lKSl9cmV0dXJuIHRoaXMuX3N0YXRlLmNhbmNlbChlKSx0aGlzLl9zdGF0ZS5zZXRTdGF0ZUF0VGltZSh0LlN0YXRlLlN0b3BwZWQsZSksdGhpcy5zZXRUaWNrc0F0VGltZSgwLGUpLHRoaXN9LHQuVGlja1NvdXJjZS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dGhpcy50b1NlY29uZHMoZSksdGhpcy5fc3RhdGUuZ2V0VmFsdWVBdFRpbWUoZSk9PT10LlN0YXRlLlN0YXJ0ZWQmJnRoaXMuX3N0YXRlLnNldFN0YXRlQXRUaW1lKHQuU3RhdGUuUGF1c2VkLGUpLHRoaXN9LHQuVGlja1NvdXJjZS5wcm90b3R5cGUuY2FuY2VsPWZ1bmN0aW9uKHQpe3JldHVybiB0PXRoaXMudG9TZWNvbmRzKHQpLHRoaXMuX3N0YXRlLmNhbmNlbCh0KSx0aGlzLl90aWNrT2Zmc2V0LmNhbmNlbCh0KSx0aGlzfSx0LlRpY2tTb3VyY2UucHJvdG90eXBlLmdldFRpY2tzQXRUaW1lPWZ1bmN0aW9uKGUpe2U9dGhpcy50b1NlY29uZHMoZSk7dmFyIGk9dGhpcy5fc3RhdGUuZ2V0TGFzdFN0YXRlKHQuU3RhdGUuU3RvcHBlZCxlKSxuPXtzdGF0ZTp0LlN0YXRlLlBhdXNlZCx0aW1lOmV9O3RoaXMuX3N0YXRlLmFkZChuKTt2YXIgbz1pLHM9MDtyZXR1cm4gdGhpcy5fc3RhdGUuZm9yRWFjaEJldHdlZW4oaS50aW1lLGUrdGhpcy5zYW1wbGVUaW1lLGZ1bmN0aW9uKGUpe3ZhciBpPW8udGltZSxuPXRoaXMuX3RpY2tPZmZzZXQuZ2V0KGUudGltZSk7bi50aW1lPj1vLnRpbWUmJihzPW4udGlja3MsaT1uLnRpbWUpLG8uc3RhdGU9PT10LlN0YXRlLlN0YXJ0ZWQmJmUuc3RhdGUhPT10LlN0YXRlLlN0YXJ0ZWQmJihzKz10aGlzLmZyZXF1ZW5jeS5nZXRUaWNrc0F0VGltZShlLnRpbWUpLXRoaXMuZnJlcXVlbmN5LmdldFRpY2tzQXRUaW1lKGkpKSxvPWV9LmJpbmQodGhpcykpLHRoaXMuX3N0YXRlLnJlbW92ZShuKSxzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5UaWNrU291cmNlLnByb3RvdHlwZSxcInRpY2tzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFRpY2tzQXRUaW1lKHRoaXMubm93KCkpfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5zZXRUaWNrc0F0VGltZSh0LHRoaXMubm93KCkpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRpY2tTb3VyY2UucHJvdG90eXBlLFwic2Vjb25kc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRTZWNvbmRzQXRUaW1lKHRoaXMubm93KCkpfSxzZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ub3coKSxpPXRoaXMuZnJlcXVlbmN5LnRpbWVUb1RpY2tzKHQsZSk7dGhpcy5zZXRUaWNrc0F0VGltZShpLGUpfX0pLHQuVGlja1NvdXJjZS5wcm90b3R5cGUuZ2V0U2Vjb25kc0F0VGltZT1mdW5jdGlvbihlKXtlPXRoaXMudG9TZWNvbmRzKGUpO3ZhciBpPXRoaXMuX3N0YXRlLmdldExhc3RTdGF0ZSh0LlN0YXRlLlN0b3BwZWQsZSksbj17c3RhdGU6dC5TdGF0ZS5QYXVzZWQsdGltZTplfTt0aGlzLl9zdGF0ZS5hZGQobik7dmFyIG89aSxzPTA7cmV0dXJuIHRoaXMuX3N0YXRlLmZvckVhY2hCZXR3ZWVuKGkudGltZSxlK3RoaXMuc2FtcGxlVGltZSxmdW5jdGlvbihlKXt2YXIgaT1vLnRpbWUsbj10aGlzLl90aWNrT2Zmc2V0LmdldChlLnRpbWUpO24udGltZT49by50aW1lJiYocz1uLnNlY29uZHMsaT1uLnRpbWUpLG8uc3RhdGU9PT10LlN0YXRlLlN0YXJ0ZWQmJmUuc3RhdGUhPT10LlN0YXRlLlN0YXJ0ZWQmJihzKz1lLnRpbWUtaSksbz1lfS5iaW5kKHRoaXMpKSx0aGlzLl9zdGF0ZS5yZW1vdmUobiksc30sdC5UaWNrU291cmNlLnByb3RvdHlwZS5zZXRUaWNrc0F0VGltZT1mdW5jdGlvbih0LGUpe3JldHVybiBlPXRoaXMudG9TZWNvbmRzKGUpLHRoaXMuX3RpY2tPZmZzZXQuY2FuY2VsKGUpLHRoaXMuX3RpY2tPZmZzZXQuYWRkKHt0aW1lOmUsdGlja3M6dCxzZWNvbmRzOnRoaXMuZnJlcXVlbmN5LmdldER1cmF0aW9uT2ZUaWNrcyh0LGUpfSksdGhpc30sdC5UaWNrU291cmNlLnByb3RvdHlwZS5nZXRTdGF0ZUF0VGltZT1mdW5jdGlvbih0KXtyZXR1cm4gdD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZSh0KX0sdC5UaWNrU291cmNlLnByb3RvdHlwZS5nZXRUaW1lT2ZUaWNrPWZ1bmN0aW9uKGUsaSl7aT10LmRlZmF1bHRBcmcoaSx0aGlzLm5vdygpKTt2YXIgbj10aGlzLl90aWNrT2Zmc2V0LmdldChpKSxvPXRoaXMuX3N0YXRlLmdldChpKSxzPU1hdGgubWF4KG4udGltZSxvLnRpbWUpLHI9dGhpcy5mcmVxdWVuY3kuZ2V0VGlja3NBdFRpbWUocykrZS1uLnRpY2tzO3JldHVybiB0aGlzLmZyZXF1ZW5jeS5nZXRUaW1lT2ZUaWNrKHIpfSx0LlRpY2tTb3VyY2UucHJvdG90eXBlLmZvckVhY2hUaWNrQmV0d2Vlbj1mdW5jdGlvbihlLGksbil7dmFyIG89dGhpcy5fc3RhdGUuZ2V0KGUpO2lmKHRoaXMuX3N0YXRlLmZvckVhY2hCZXR3ZWVuKGUsaSxmdW5jdGlvbihpKXtvLnN0YXRlPT09dC5TdGF0ZS5TdGFydGVkJiZpLnN0YXRlIT09dC5TdGF0ZS5TdGFydGVkJiZ0aGlzLmZvckVhY2hUaWNrQmV0d2VlbihNYXRoLm1heChvLnRpbWUsZSksaS50aW1lLXRoaXMuc2FtcGxlVGltZSxuKSxvPWl9LmJpbmQodGhpcykpLGU9TWF0aC5tYXgoby50aW1lLGUpLG8uc3RhdGU9PT10LlN0YXRlLlN0YXJ0ZWQmJnRoaXMuX3N0YXRlKXt2YXIgcz10aGlzLmZyZXF1ZW5jeS5nZXRUaWNrc0F0VGltZShlKSxyPShzLXRoaXMuZnJlcXVlbmN5LmdldFRpY2tzQXRUaW1lKG8udGltZSkpJTE7MCE9PXImJihyPTEtcik7Zm9yKHZhciBhPXRoaXMuZnJlcXVlbmN5LmdldFRpbWVPZlRpY2socytyKSxsPW51bGw7YTxpJiZ0aGlzLl9zdGF0ZTspe3RyeXtuKGEsTWF0aC5yb3VuZCh0aGlzLmdldFRpY2tzQXRUaW1lKGEpKSl9Y2F0Y2godCl7bD10O2JyZWFrfXRoaXMuX3N0YXRlJiYoYSs9dGhpcy5mcmVxdWVuY3kuZ2V0RHVyYXRpb25PZlRpY2tzKDEsYSkpfX1pZihsKXRocm93IGw7cmV0dXJuIHRoaXN9LHQuVGlja1NvdXJjZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LlBhcmFtLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fc3RhdGUuZGlzcG9zZSgpLHRoaXMuX3N0YXRlPW51bGwsdGhpcy5fdGlja09mZnNldC5kaXNwb3NlKCksdGhpcy5fdGlja09mZnNldD1udWxsLHRoaXMuX3dyaXRhYmxlKFwiZnJlcXVlbmN5XCIpLHRoaXMuZnJlcXVlbmN5LmRpc3Bvc2UoKSx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXN9LHQuVGlja1NvdXJjZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg5MCksaSgxMyksaSgxKSxpKDQpLGkoMTgpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkZvbGxvd2VyPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wic21vb3RoaW5nXCJdLHQuRm9sbG93ZXIpO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5jcmVhdGVJbnNPdXRzKDEsMSksdGhpcy5fYWJzPW5ldyB0LkFicyx0aGlzLl9maWx0ZXI9dGhpcy5jb250ZXh0LmNyZWF0ZUJpcXVhZEZpbHRlcigpLHRoaXMuX2ZpbHRlci50eXBlPVwibG93cGFzc1wiLHRoaXMuX2ZpbHRlci5mcmVxdWVuY3kudmFsdWU9MCx0aGlzLl9maWx0ZXIuUS52YWx1ZT0wLHRoaXMuX3N1Yj1uZXcgdC5TdWJ0cmFjdCx0aGlzLl9kZWxheT1uZXcgdC5EZWxheSh0aGlzLmJsb2NrVGltZSksdGhpcy5fc21vb3RoaW5nPWUuc21vb3RoaW5nLHRoaXMuaW5wdXQuY29ubmVjdCh0aGlzLl9kZWxheSx0aGlzLl9zdWIpLHRoaXMuaW5wdXQuY29ubmVjdCh0aGlzLl9zdWIsMCwxKSx0aGlzLl9zdWIuY2hhaW4odGhpcy5fYWJzLHRoaXMuX2ZpbHRlcix0aGlzLm91dHB1dCksdGhpcy5zbW9vdGhpbmc9ZS5zbW9vdGhpbmd9LHQuZXh0ZW5kKHQuRm9sbG93ZXIsdC5BdWRpb05vZGUpLHQuRm9sbG93ZXIuZGVmYXVsdHM9e3Ntb290aGluZzouMDV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkZvbGxvd2VyLnByb3RvdHlwZSxcInNtb290aGluZ1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc21vb3RoaW5nfSxzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5fc21vb3RoaW5nPWUsdGhpcy5fZmlsdGVyLmZyZXF1ZW5jeS52YWx1ZT0uNSp0LlRpbWUoZSkudG9GcmVxdWVuY3koKX19KSx0LkZvbGxvd2VyLnByb3RvdHlwZS5jb25uZWN0PXQuU2lnbmFsQmFzZS5wcm90b3R5cGUuY29ubmVjdCx0LkZvbGxvd2VyLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fZmlsdGVyLmRpc2Nvbm5lY3QoKSx0aGlzLl9maWx0ZXI9bnVsbCx0aGlzLl9kZWxheS5kaXNwb3NlKCksdGhpcy5fZGVsYXk9bnVsbCx0aGlzLl9zdWIuZGlzY29ubmVjdCgpLHRoaXMuX3N1Yj1udWxsLHRoaXMuX2Ficy5kaXNwb3NlKCksdGhpcy5fYWJzPW51bGwsdGhpc30sdC5Gb2xsb3dlcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg0MiksaSgxKSxpKDE0KSxpKDE4KSxpKDMpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkZlZWRiYWNrQ29tYkZpbHRlcj1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcImRlbGF5VGltZVwiLFwicmVzb25hbmNlXCJdLHQuRmVlZGJhY2tDb21iRmlsdGVyKTt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLHRoaXMuX2RlbGF5PXRoaXMuaW5wdXQ9dGhpcy5vdXRwdXQ9bmV3IHQuRGVsYXkoZS5kZWxheVRpbWUpLHRoaXMuZGVsYXlUaW1lPXRoaXMuX2RlbGF5LmRlbGF5VGltZSx0aGlzLl9mZWVkYmFjaz1uZXcgdC5HYWluKGUucmVzb25hbmNlLHQuVHlwZS5Ob3JtYWxSYW5nZSksdGhpcy5yZXNvbmFuY2U9dGhpcy5fZmVlZGJhY2suZ2Fpbix0aGlzLl9kZWxheS5jaGFpbih0aGlzLl9mZWVkYmFjayx0aGlzLl9kZWxheSksdGhpcy5fcmVhZE9ubHkoW1wicmVzb25hbmNlXCIsXCJkZWxheVRpbWVcIl0pfSx0LmV4dGVuZCh0LkZlZWRiYWNrQ29tYkZpbHRlcix0LkF1ZGlvTm9kZSksdC5GZWVkYmFja0NvbWJGaWx0ZXIuZGVmYXVsdHM9e2RlbGF5VGltZTouMSxyZXNvbmFuY2U6LjV9LHQuRmVlZGJhY2tDb21iRmlsdGVyLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fd3JpdGFibGUoW1wicmVzb25hbmNlXCIsXCJkZWxheVRpbWVcIl0pLHRoaXMuX2RlbGF5LmRpc3Bvc2UoKSx0aGlzLl9kZWxheT1udWxsLHRoaXMuZGVsYXlUaW1lPW51bGwsdGhpcy5fZmVlZGJhY2suZGlzcG9zZSgpLHRoaXMuX2ZlZWRiYWNrPW51bGwsdGhpcy5yZXNvbmFuY2U9bnVsbCx0aGlzfSx0LkZlZWRiYWNrQ29tYkZpbHRlcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg5KSxpKDEpLGkoMyksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuTXVsdGliYW5kU3BsaXQ9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJsb3dGcmVxdWVuY3lcIixcImhpZ2hGcmVxdWVuY3lcIl0sdC5NdWx0aWJhbmRTcGxpdCk7dC5BdWRpb05vZGUuY2FsbCh0aGlzKSx0aGlzLmlucHV0PW5ldyB0LkdhaW4sdGhpcy5vdXRwdXQ9bmV3IEFycmF5KDMpLHRoaXMubG93PXRoaXMub3V0cHV0WzBdPW5ldyB0LkZpbHRlcigwLFwibG93cGFzc1wiKSx0aGlzLl9sb3dNaWRGaWx0ZXI9bmV3IHQuRmlsdGVyKDAsXCJoaWdocGFzc1wiKSx0aGlzLm1pZD10aGlzLm91dHB1dFsxXT1uZXcgdC5GaWx0ZXIoMCxcImxvd3Bhc3NcIiksdGhpcy5oaWdoPXRoaXMub3V0cHV0WzJdPW5ldyB0LkZpbHRlcigwLFwiaGlnaHBhc3NcIiksdGhpcy5sb3dGcmVxdWVuY3k9bmV3IHQuU2lnbmFsKGUubG93RnJlcXVlbmN5LHQuVHlwZS5GcmVxdWVuY3kpLHRoaXMuaGlnaEZyZXF1ZW5jeT1uZXcgdC5TaWduYWwoZS5oaWdoRnJlcXVlbmN5LHQuVHlwZS5GcmVxdWVuY3kpLHRoaXMuUT1uZXcgdC5TaWduYWwoZS5RKSx0aGlzLmlucHV0LmZhbih0aGlzLmxvdyx0aGlzLmhpZ2gpLHRoaXMuaW5wdXQuY2hhaW4odGhpcy5fbG93TWlkRmlsdGVyLHRoaXMubWlkKSx0aGlzLmxvd0ZyZXF1ZW5jeS5jb25uZWN0KHRoaXMubG93LmZyZXF1ZW5jeSksdGhpcy5sb3dGcmVxdWVuY3kuY29ubmVjdCh0aGlzLl9sb3dNaWRGaWx0ZXIuZnJlcXVlbmN5KSx0aGlzLmhpZ2hGcmVxdWVuY3kuY29ubmVjdCh0aGlzLm1pZC5mcmVxdWVuY3kpLHRoaXMuaGlnaEZyZXF1ZW5jeS5jb25uZWN0KHRoaXMuaGlnaC5mcmVxdWVuY3kpLHRoaXMuUS5jb25uZWN0KHRoaXMubG93LlEpLHRoaXMuUS5jb25uZWN0KHRoaXMuX2xvd01pZEZpbHRlci5RKSx0aGlzLlEuY29ubmVjdCh0aGlzLm1pZC5RKSx0aGlzLlEuY29ubmVjdCh0aGlzLmhpZ2guUSksdGhpcy5fcmVhZE9ubHkoW1wiaGlnaFwiLFwibWlkXCIsXCJsb3dcIixcImhpZ2hGcmVxdWVuY3lcIixcImxvd0ZyZXF1ZW5jeVwiXSl9LHQuZXh0ZW5kKHQuTXVsdGliYW5kU3BsaXQsdC5BdWRpb05vZGUpLHQuTXVsdGliYW5kU3BsaXQuZGVmYXVsdHM9e2xvd0ZyZXF1ZW5jeTo0MDAsaGlnaEZyZXF1ZW5jeToyNTAwLFE6MX0sdC5NdWx0aWJhbmRTcGxpdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcImhpZ2hcIixcIm1pZFwiLFwibG93XCIsXCJoaWdoRnJlcXVlbmN5XCIsXCJsb3dGcmVxdWVuY3lcIl0pLHRoaXMubG93LmRpc3Bvc2UoKSx0aGlzLmxvdz1udWxsLHRoaXMuX2xvd01pZEZpbHRlci5kaXNwb3NlKCksdGhpcy5fbG93TWlkRmlsdGVyPW51bGwsdGhpcy5taWQuZGlzcG9zZSgpLHRoaXMubWlkPW51bGwsdGhpcy5oaWdoLmRpc3Bvc2UoKSx0aGlzLmhpZ2g9bnVsbCx0aGlzLmxvd0ZyZXF1ZW5jeS5kaXNwb3NlKCksdGhpcy5sb3dGcmVxdWVuY3k9bnVsbCx0aGlzLmhpZ2hGcmVxdWVuY3kuZGlzcG9zZSgpLHRoaXMuaGlnaEZyZXF1ZW5jeT1udWxsLHRoaXMuUS5kaXNwb3NlKCksdGhpcy5RPW51bGwsdGhpc30sdC5NdWx0aWJhbmRTcGxpdH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgyMyksaSgxMCksaSgxOSksaSg5MiksaSgxKSxpKDIyKSxpKDI4KSxpKDIpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5QYW5uZXI9ZnVuY3Rpb24oZSl7dC5BdWRpb05vZGUuY2FsbCh0aGlzKSx0aGlzLl9wYW5uZXI9dGhpcy5pbnB1dD10aGlzLm91dHB1dD10aGlzLmNvbnRleHQuY3JlYXRlU3RlcmVvUGFubmVyKCksdGhpcy5wYW49dGhpcy5fcGFubmVyLnBhbix0aGlzLnBhbi52YWx1ZT10LmRlZmF1bHRBcmcoZSwwKSx0aGlzLl9yZWFkT25seShcInBhblwiKX0sdC5leHRlbmQodC5QYW5uZXIsdC5BdWRpb05vZGUpLHQuUGFubmVyLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fd3JpdGFibGUoXCJwYW5cIiksdGhpcy5fcGFubmVyLmRpc2Nvbm5lY3QoKSx0aGlzLl9wYW5uZXI9bnVsbCx0aGlzLnBhbj1udWxsLHRoaXN9LHQuUGFubmVyfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDcpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5Qb3c9ZnVuY3Rpb24oZSl7dC5TaWduYWxCYXNlLmNhbGwodGhpcyksdGhpcy5fZXhwPXQuZGVmYXVsdEFyZyhlLDEpLHRoaXMuX2V4cFNjYWxlcj10aGlzLmlucHV0PXRoaXMub3V0cHV0PW5ldyB0LldhdmVTaGFwZXIodGhpcy5fZXhwRnVuYyh0aGlzLl9leHApLDgxOTIpfSx0LmV4dGVuZCh0LlBvdyx0LlNpZ25hbEJhc2UpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlBvdy5wcm90b3R5cGUsXCJ2YWx1ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXhwfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fZXhwPXQsdGhpcy5fZXhwU2NhbGVyLnNldE1hcCh0aGlzLl9leHBGdW5jKHRoaXMuX2V4cCkpfX0pLHQuUG93LnByb3RvdHlwZS5fZXhwRnVuYz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucG93KE1hdGguYWJzKGUpLHQpfX0sdC5Qb3cucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5TaWduYWxCYXNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fZXhwU2NhbGVyLmRpc3Bvc2UoKSx0aGlzLl9leHBTY2FsZXI9bnVsbCx0aGlzfSx0LlBvd30uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgyMCksaSg2NildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe3JldHVybiB0Lk9mZmxpbmVDb250ZXh0PWZ1bmN0aW9uKGUsaSxuKXt2YXIgbz1uZXcgT2ZmbGluZUF1ZGlvQ29udGV4dChlLGkqbixuKTt0LkNvbnRleHQuY2FsbCh0aGlzLHtjb250ZXh0Om8sY2xvY2tTb3VyY2U6XCJvZmZsaW5lXCIsbG9va0FoZWFkOjAsdXBkYXRlSW50ZXJ2YWw6MTI4L259KSx0aGlzLl9kdXJhdGlvbj1pLHRoaXMuX2N1cnJlbnRUaW1lPTB9LHQuZXh0ZW5kKHQuT2ZmbGluZUNvbnRleHQsdC5Db250ZXh0KSx0Lk9mZmxpbmVDb250ZXh0LnByb3RvdHlwZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY3VycmVudFRpbWV9LHQuT2ZmbGluZUNvbnRleHQucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBQcm9taXNlLnJlc29sdmUoKX0sdC5PZmZsaW5lQ29udGV4dC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7Zm9yKDt0aGlzLl9kdXJhdGlvbi10aGlzLl9jdXJyZW50VGltZT49MDspdGhpcy5lbWl0KFwidGlja1wiKSx0aGlzLl9jdXJyZW50VGltZSs9dGhpcy5ibG9ja1RpbWU7cmV0dXJuIHRoaXMuX2NvbnRleHQuc3RhcnRSZW5kZXJpbmcoKX0sdC5PZmZsaW5lQ29udGV4dC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGV4dD1udWxsLFByb21pc2UucmVzb2x2ZSgpfSx0Lk9mZmxpbmVDb250ZXh0fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDYyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7aWYodC5zdXBwb3J0ZWQpe3ZhciBlPW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtlLmluY2x1ZGVzKFwic2FmYXJpXCIpJiYhZS5pbmNsdWRlcyhcImNocm9tZVwiKSYmZS5pbmNsdWRlcyhcIm1vYmlsZVwiKSYmKHQuT2ZmbGluZUNvbnRleHQucHJvdG90eXBlLmNyZWF0ZUJ1ZmZlclNvdXJjZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCksZT10LnN0YXJ0O3JldHVybiB0LnN0YXJ0PWZ1bmN0aW9uKGkpe3RoaXMuc2V0VGltZW91dChmdW5jdGlvbigpe2UuY2FsbCh0LGkpfS5iaW5kKHRoaXMpLDApfS5iaW5kKHRoaXMpLHR9KX19LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtyZXR1cm4gdC5UaW1lQmFzZT1mdW5jdGlvbihlLGkpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHQuVGltZUJhc2UpKXJldHVybiBuZXcgdC5UaW1lQmFzZShlLGkpO2lmKHRoaXMuX3ZhbD1lLHRoaXMuX3VuaXRzPWksdC5pc1VuZGVmKHRoaXMuX3VuaXRzKSYmdC5pc1N0cmluZyh0aGlzLl92YWwpJiZwYXJzZUZsb2F0KHRoaXMuX3ZhbCk9PXRoaXMuX3ZhbCYmXCIrXCIhPT10aGlzLl92YWwuY2hhckF0KDApKXRoaXMuX3ZhbD1wYXJzZUZsb2F0KHRoaXMuX3ZhbCksdGhpcy5fdW5pdHM9dGhpcy5fZGVmYXVsdFVuaXRzO2Vsc2UgaWYoZSYmZS5jb25zdHJ1Y3Rvcj09PXRoaXMuY29uc3RydWN0b3IpdGhpcy5fdmFsPWUuX3ZhbCx0aGlzLl91bml0cz1lLl91bml0cztlbHNlIGlmKGUgaW5zdGFuY2VvZiB0LlRpbWVCYXNlKXN3aXRjaCh0aGlzLl9kZWZhdWx0VW5pdHMpe2Nhc2VcInNcIjp0aGlzLl92YWw9ZS50b1NlY29uZHMoKTticmVhaztjYXNlXCJpXCI6dGhpcy5fdmFsPWUudG9UaWNrcygpO2JyZWFrO2Nhc2VcImh6XCI6dGhpcy5fdmFsPWUudG9GcmVxdWVuY3koKTticmVhaztjYXNlXCJtaWRpXCI6dGhpcy5fdmFsPWUudG9NaWRpKCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgZGVmYXVsdCB1bml0cyBcIit0aGlzLl9kZWZhdWx0VW5pdHMpfX0sdC5leHRlbmQodC5UaW1lQmFzZSksdC5UaW1lQmFzZS5wcm90b3R5cGUuX2V4cHJlc3Npb25zPXtuOntyZWdleHA6L14oXFxkKyluKFxcLj8pJC9pLG1ldGhvZDpmdW5jdGlvbih0LGUpe3Q9cGFyc2VJbnQodCk7dmFyIGk9XCIuXCI9PT1lPzEuNToxO3JldHVybiAxPT09dD90aGlzLl9iZWF0c1RvVW5pdHModGhpcy5fZ2V0VGltZVNpZ25hdHVyZSgpKSppOnRoaXMuX2JlYXRzVG9Vbml0cyg0L3QpKml9fSx0OntyZWdleHA6L14oXFxkKyl0JC9pLG1ldGhvZDpmdW5jdGlvbih0KXtyZXR1cm4gdD1wYXJzZUludCh0KSx0aGlzLl9iZWF0c1RvVW5pdHMoOC8oMypwYXJzZUludCh0KSkpfX0sbTp7cmVnZXhwOi9eKFxcZCspbSQvaSxtZXRob2Q6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2JlYXRzVG9Vbml0cyhwYXJzZUludCh0KSp0aGlzLl9nZXRUaW1lU2lnbmF0dXJlKCkpfX0saTp7cmVnZXhwOi9eKFxcZCspaSQvaSxtZXRob2Q6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3RpY2tzVG9Vbml0cyhwYXJzZUludCh0KSl9fSxoejp7cmVnZXhwOi9eKFxcZCsoPzpcXC5cXGQrKT8paHokL2ksbWV0aG9kOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9mcmVxdWVuY3lUb1VuaXRzKHBhcnNlRmxvYXQodCkpfX0sdHI6e3JlZ2V4cDovXihcXGQrKD86XFwuXFxkKyk/KTooXFxkKyg/OlxcLlxcZCspPyk6PyhcXGQrKD86XFwuXFxkKyk/KT8kLyxtZXRob2Q6ZnVuY3Rpb24odCxlLGkpe3ZhciBuPTA7cmV0dXJuIHQmJlwiMFwiIT09dCYmKG4rPXRoaXMuX2JlYXRzVG9Vbml0cyh0aGlzLl9nZXRUaW1lU2lnbmF0dXJlKCkqcGFyc2VGbG9hdCh0KSkpLGUmJlwiMFwiIT09ZSYmKG4rPXRoaXMuX2JlYXRzVG9Vbml0cyhwYXJzZUZsb2F0KGUpKSksaSYmXCIwXCIhPT1pJiYobis9dGhpcy5fYmVhdHNUb1VuaXRzKHBhcnNlRmxvYXQoaSkvNCkpLG59fSxzOntyZWdleHA6L14oXFxkKyg/OlxcLlxcZCspPylzJC8sbWV0aG9kOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9zZWNvbmRzVG9Vbml0cyhwYXJzZUZsb2F0KHQpKX19LHNhbXBsZXM6e3JlZ2V4cDovXihcXGQrKXNhbXBsZXMkLyxtZXRob2Q6ZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlSW50KHQpL3RoaXMuY29udGV4dC5zYW1wbGVSYXRlfX0sZGVmYXVsdDp7cmVnZXhwOi9eKFxcZCsoPzpcXC5cXGQrKT8pJC8sbWV0aG9kOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9leHByZXNzaW9uc1t0aGlzLl9kZWZhdWx0VW5pdHNdLm1ldGhvZC5jYWxsKHRoaXMsdCl9fX0sdC5UaW1lQmFzZS5wcm90b3R5cGUuX2RlZmF1bHRVbml0cz1cInNcIix0LlRpbWVCYXNlLnByb3RvdHlwZS5fZ2V0QnBtPWZ1bmN0aW9uKCl7cmV0dXJuIHQuVHJhbnNwb3J0P3QuVHJhbnNwb3J0LmJwbS52YWx1ZToxMjB9LHQuVGltZUJhc2UucHJvdG90eXBlLl9nZXRUaW1lU2lnbmF0dXJlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuVHJhbnNwb3J0P3QuVHJhbnNwb3J0LnRpbWVTaWduYXR1cmU6NH0sdC5UaW1lQmFzZS5wcm90b3R5cGUuX2dldFBQUT1mdW5jdGlvbigpe3JldHVybiB0LlRyYW5zcG9ydD90LlRyYW5zcG9ydC5QUFE6MTkyfSx0LlRpbWVCYXNlLnByb3RvdHlwZS5fbm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm93KCl9LHQuVGltZUJhc2UucHJvdG90eXBlLl9mcmVxdWVuY3lUb1VuaXRzPWZ1bmN0aW9uKHQpe3JldHVybiAxL3R9LHQuVGltZUJhc2UucHJvdG90eXBlLl9iZWF0c1RvVW5pdHM9ZnVuY3Rpb24odCl7cmV0dXJuIDYwL3RoaXMuX2dldEJwbSgpKnR9LHQuVGltZUJhc2UucHJvdG90eXBlLl9zZWNvbmRzVG9Vbml0cz1mdW5jdGlvbih0KXtyZXR1cm4gdH0sdC5UaW1lQmFzZS5wcm90b3R5cGUuX3RpY2tzVG9Vbml0cz1mdW5jdGlvbih0KXtyZXR1cm4gdCoodGhpcy5fYmVhdHNUb1VuaXRzKDEpL3RoaXMuX2dldFBQUSgpKX0sdC5UaW1lQmFzZS5wcm90b3R5cGUuX25vQXJnPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vdygpfSx0LlRpbWVCYXNlLnByb3RvdHlwZS52YWx1ZU9mPWZ1bmN0aW9uKCl7aWYodC5pc1VuZGVmKHRoaXMuX3ZhbCkpcmV0dXJuIHRoaXMuX25vQXJnKCk7aWYodC5pc1N0cmluZyh0aGlzLl92YWwpJiZ0LmlzVW5kZWYodGhpcy5fdW5pdHMpKXtmb3IodmFyIGUgaW4gdGhpcy5fZXhwcmVzc2lvbnMpaWYodGhpcy5fZXhwcmVzc2lvbnNbZV0ucmVnZXhwLnRlc3QodGhpcy5fdmFsLnRyaW0oKSkpe3RoaXMuX3VuaXRzPWU7YnJlYWt9fWVsc2UgaWYodC5pc09iamVjdCh0aGlzLl92YWwpKXt2YXIgaT0wO2Zvcih2YXIgbiBpbiB0aGlzLl92YWwpe3ZhciBvPXRoaXMuX3ZhbFtuXTtpKz1uZXcgdGhpcy5jb25zdHJ1Y3RvcihuKS52YWx1ZU9mKCkqb31yZXR1cm4gaX1pZih0LmlzRGVmaW5lZCh0aGlzLl91bml0cykpe3ZhciBzPXRoaXMuX2V4cHJlc3Npb25zW3RoaXMuX3VuaXRzXSxyPXRoaXMuX3ZhbC50b1N0cmluZygpLnRyaW0oKS5tYXRjaChzLnJlZ2V4cCk7cmV0dXJuIHI/cy5tZXRob2QuYXBwbHkodGhpcyxyLnNsaWNlKDEpKTpzLm1ldGhvZC5jYWxsKHRoaXMscGFyc2VGbG9hdCh0aGlzLl92YWwpKX1yZXR1cm4gdGhpcy5fdmFsfSx0LlRpbWVCYXNlLnByb3RvdHlwZS50b1NlY29uZHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZU9mKCl9LHQuVGltZUJhc2UucHJvdG90eXBlLnRvRnJlcXVlbmN5PWZ1bmN0aW9uKCl7cmV0dXJuIDEvdGhpcy50b1NlY29uZHMoKX0sdC5UaW1lQmFzZS5wcm90b3R5cGUudG9TYW1wbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9TZWNvbmRzKCkqdGhpcy5jb250ZXh0LnNhbXBsZVJhdGV9LHQuVGltZUJhc2UucHJvdG90eXBlLnRvTWlsbGlzZWNvbmRzPWZ1bmN0aW9uKCl7cmV0dXJuIDFlMyp0aGlzLnRvU2Vjb25kcygpfSx0LlRpbWVCYXNlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5fdmFsPW51bGwsdGhpcy5fdW5pdHM9bnVsbH0sdC5UaW1lQmFzZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg2NCksaSg0NildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe3JldHVybiB0LlRpbWU9ZnVuY3Rpb24oZSxpKXtpZighKHRoaXMgaW5zdGFuY2VvZiB0LlRpbWUpKXJldHVybiBuZXcgdC5UaW1lKGUsaSk7dC5UaW1lQmFzZS5jYWxsKHRoaXMsZSxpKX0sdC5leHRlbmQodC5UaW1lLHQuVGltZUJhc2UpLHQuVGltZS5wcm90b3R5cGUuX2V4cHJlc3Npb25zPU9iamVjdC5hc3NpZ24oe30sdC5UaW1lQmFzZS5wcm90b3R5cGUuX2V4cHJlc3Npb25zLHtxdWFudGl6ZTp7cmVnZXhwOi9eQCguKykvLG1ldGhvZDpmdW5jdGlvbihlKXtpZih0LlRyYW5zcG9ydCl7dmFyIGk9bmV3IHRoaXMuY29uc3RydWN0b3IoZSk7cmV0dXJuIHRoaXMuX3NlY29uZHNUb1VuaXRzKHQuVHJhbnNwb3J0Lm5leHRTdWJkaXZpc2lvbihpKSl9cmV0dXJuIDB9fSxub3c6e3JlZ2V4cDovXlxcKyguKykvLG1ldGhvZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbm93KCkrbmV3IHRoaXMuY29uc3RydWN0b3IodCl9fX0pLHQuVGltZS5wcm90b3R5cGUucXVhbnRpemU9ZnVuY3Rpb24oZSxpKXtpPXQuZGVmYXVsdEFyZyhpLDEpO3ZhciBuPW5ldyB0aGlzLmNvbnN0cnVjdG9yKGUpLG89dGhpcy52YWx1ZU9mKCk7cmV0dXJuIG8rKE1hdGgucm91bmQoby9uKSpuLW8pKml9LHQuVGltZS5wcm90b3R5cGUudG9Ob3RhdGlvbj1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLnRvU2Vjb25kcygpLGk9W1wiMW1cIl0sbj0xO248ODtuKyspe3ZhciBvPU1hdGgucG93KDIsbik7aS5wdXNoKG8rXCJuLlwiKSxpLnB1c2gobytcIm5cIiksaS5wdXNoKG8rXCJ0XCIpfWkucHVzaChcIjBcIik7dmFyIHM9aVswXSxyPXQuVGltZShpWzBdKS50b1NlY29uZHMoKTtyZXR1cm4gaS5mb3JFYWNoKGZ1bmN0aW9uKGkpe3ZhciBuPXQuVGltZShpKS50b1NlY29uZHMoKTtNYXRoLmFicyhuLWUpPE1hdGguYWJzKHItZSkmJihzPWkscj1uKX0pLHN9LHQuVGltZS5wcm90b3R5cGUudG9CYXJzQmVhdHNTaXh0ZWVudGhzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fYmVhdHNUb1VuaXRzKDEpLGU9dGhpcy52YWx1ZU9mKCkvdDtlPXBhcnNlRmxvYXQoZS50b0ZpeGVkKDQpKTt2YXIgaT1NYXRoLmZsb29yKGUvdGhpcy5fZ2V0VGltZVNpZ25hdHVyZSgpKSxuPWUlMSo0O3JldHVybiBlPU1hdGguZmxvb3IoZSkldGhpcy5fZ2V0VGltZVNpZ25hdHVyZSgpLChuPW4udG9TdHJpbmcoKSkubGVuZ3RoPjMmJihuPXBhcnNlRmxvYXQocGFyc2VGbG9hdChuKS50b0ZpeGVkKDMpKSksW2ksZSxuXS5qb2luKFwiOlwiKX0sdC5UaW1lLnByb3RvdHlwZS50b1RpY2tzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fYmVhdHNUb1VuaXRzKDEpLGU9dGhpcy52YWx1ZU9mKCkvdDtyZXR1cm4gTWF0aC5yb3VuZChlKnRoaXMuX2dldFBQUSgpKX0sdC5UaW1lLnByb3RvdHlwZS50b1NlY29uZHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZU9mKCl9LHQuVGltZS5wcm90b3R5cGUudG9NaWRpPWZ1bmN0aW9uKCl7cmV0dXJuIHQuRnJlcXVlbmN5LmZ0b20odGhpcy50b0ZyZXF1ZW5jeSgpKX0sdC5UaW1lfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7aWYodC5zdXBwb3J0ZWQpeyF0Lmdsb2JhbC5oYXNPd25Qcm9wZXJ0eShcIk9mZmxpbmVBdWRpb0NvbnRleHRcIikmJnQuZ2xvYmFsLmhhc093blByb3BlcnR5KFwid2Via2l0T2ZmbGluZUF1ZGlvQ29udGV4dFwiKSYmKHQuZ2xvYmFsLk9mZmxpbmVBdWRpb0NvbnRleHQ9dC5nbG9iYWwud2Via2l0T2ZmbGluZUF1ZGlvQ29udGV4dCk7dmFyIGU9bmV3IE9mZmxpbmVBdWRpb0NvbnRleHQoMSwxLDQ0MTAwKS5zdGFydFJlbmRlcmluZygpO2UmJnQuaXNGdW5jdGlvbihlLnRoZW4pfHwoT2ZmbGluZUF1ZGlvQ29udGV4dC5wcm90b3R5cGUuX25hdGl2ZV9zdGFydFJlbmRlcmluZz1PZmZsaW5lQXVkaW9Db250ZXh0LnByb3RvdHlwZS5zdGFydFJlbmRlcmluZyxPZmZsaW5lQXVkaW9Db250ZXh0LnByb3RvdHlwZS5zdGFydFJlbmRlcmluZz1mdW5jdGlvbigpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0KXt0aGlzLm9uY29tcGxldGU9ZnVuY3Rpb24oZSl7dChlLnJlbmRlcmVkQnVmZmVyKX0sdGhpcy5fbmF0aXZlX3N0YXJ0UmVuZGVyaW5nKCl9LmJpbmQodGhpcykpfSl9fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDExKSxpKDYpLGkoNTYpLGkoMzEpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5QbGF5ZXI9ZnVuY3Rpb24oZSl7dmFyIGk7ZSBpbnN0YW5jZW9mIHQuQnVmZmVyJiZlLmxvYWRlZD8oZT1lLmdldCgpLGk9dC5QbGF5ZXIuZGVmYXVsdHMpOmk9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1widXJsXCIsXCJvbmxvYWRcIl0sdC5QbGF5ZXIpLHQuU291cmNlLmNhbGwodGhpcyxpKSx0aGlzLmF1dG9zdGFydD1pLmF1dG9zdGFydCx0aGlzLl9idWZmZXI9bmV3IHQuQnVmZmVyKHt1cmw6aS51cmwsb25sb2FkOnRoaXMuX29ubG9hZC5iaW5kKHRoaXMsaS5vbmxvYWQpLHJldmVyc2U6aS5yZXZlcnNlfSksZSBpbnN0YW5jZW9mIEF1ZGlvQnVmZmVyJiZ0aGlzLl9idWZmZXIuc2V0KGUpLHRoaXMuX2xvb3A9aS5sb29wLHRoaXMuX2xvb3BTdGFydD1pLmxvb3BTdGFydCx0aGlzLl9sb29wRW5kPWkubG9vcEVuZCx0aGlzLl9wbGF5YmFja1JhdGU9aS5wbGF5YmFja1JhdGUsdGhpcy5fYWN0aXZlU291cmNlcz1bXSx0aGlzLmZhZGVJbj1pLmZhZGVJbix0aGlzLmZhZGVPdXQ9aS5mYWRlT3V0fSx0LmV4dGVuZCh0LlBsYXllcix0LlNvdXJjZSksdC5QbGF5ZXIuZGVmYXVsdHM9e29ubG9hZDp0Lm5vT3AscGxheWJhY2tSYXRlOjEsbG9vcDohMSxhdXRvc3RhcnQ6ITEsbG9vcFN0YXJ0OjAsbG9vcEVuZDowLHJldmVyc2U6ITEsZmFkZUluOjAsZmFkZU91dDowfSx0LlBsYXllci5wcm90b3R5cGUubG9hZD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9idWZmZXIubG9hZCh0LHRoaXMuX29ubG9hZC5iaW5kKHRoaXMsZSkpfSx0LlBsYXllci5wcm90b3R5cGUuX29ubG9hZD1mdW5jdGlvbihlKXsoZT10LmRlZmF1bHRBcmcoZSx0Lm5vT3ApKSh0aGlzKSx0aGlzLmF1dG9zdGFydCYmdGhpcy5zdGFydCgpfSx0LlBsYXllci5wcm90b3R5cGUuX29uU291cmNlRW5kPWZ1bmN0aW9uKGUpe3ZhciBpPXRoaXMuX2FjdGl2ZVNvdXJjZXMuaW5kZXhPZihlKTt0aGlzLl9hY3RpdmVTb3VyY2VzLnNwbGljZShpLDEpLDAhPT10aGlzLl9hY3RpdmVTb3VyY2VzLmxlbmd0aHx8dGhpcy5fc3luY2VkfHx0aGlzLl9zdGF0ZS5zZXRTdGF0ZUF0VGltZSh0LlN0YXRlLlN0b3BwZWQsdC5ub3coKSl9LHQuUGxheWVyLnByb3RvdHlwZS5fc3RhcnQ9ZnVuY3Rpb24oZSxpLG4pe2k9dGhpcy5fbG9vcD90LmRlZmF1bHRBcmcoaSx0aGlzLl9sb29wU3RhcnQpOnQuZGVmYXVsdEFyZyhpLDApLGk9dGhpcy50b1NlY29uZHMoaSk7dmFyIG89dC5kZWZhdWx0QXJnKG4sTWF0aC5tYXgodGhpcy5fYnVmZmVyLmR1cmF0aW9uLWksMCkpO289dGhpcy50b1NlY29uZHMobyksby89dGhpcy5fcGxheWJhY2tSYXRlLGU9dGhpcy50b1NlY29uZHMoZSk7dmFyIHM9bmV3IHQuQnVmZmVyU291cmNlKHtidWZmZXI6dGhpcy5fYnVmZmVyLGxvb3A6dGhpcy5fbG9vcCxsb29wU3RhcnQ6dGhpcy5fbG9vcFN0YXJ0LGxvb3BFbmQ6dGhpcy5fbG9vcEVuZCxvbmVuZGVkOnRoaXMuX29uU291cmNlRW5kLmJpbmQodGhpcykscGxheWJhY2tSYXRlOnRoaXMuX3BsYXliYWNrUmF0ZSxmYWRlSW46dGhpcy5mYWRlSW4sZmFkZU91dDp0aGlzLmZhZGVPdXR9KS5jb25uZWN0KHRoaXMub3V0cHV0KTtyZXR1cm4gdGhpcy5fbG9vcHx8dGhpcy5fc3luY2VkfHx0aGlzLl9zdGF0ZS5zZXRTdGF0ZUF0VGltZSh0LlN0YXRlLlN0b3BwZWQsZStvKSx0aGlzLl9hY3RpdmVTb3VyY2VzLnB1c2gocyksdGhpcy5fbG9vcCYmdC5pc1VuZGVmKG4pP3Muc3RhcnQoZSxpKTpzLnN0YXJ0KGUsaSxvLXRoaXMudG9TZWNvbmRzKHRoaXMuZmFkZU91dCkpLHRoaXN9LHQuUGxheWVyLnByb3RvdHlwZS5fc3RvcD1mdW5jdGlvbih0KXtyZXR1cm4gdD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl9hY3RpdmVTb3VyY2VzLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5zdG9wKHQpfSksdGhpc30sdC5QbGF5ZXIucHJvdG90eXBlLnJlc3RhcnQ9ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLl9zdG9wKHQpLHRoaXMuX3N0YXJ0KHQsZSxpKSx0aGlzfSx0LlBsYXllci5wcm90b3R5cGUuc2Vlaz1mdW5jdGlvbihlLGkpe3JldHVybiBpPXRoaXMudG9TZWNvbmRzKGkpLHRoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKGkpPT09dC5TdGF0ZS5TdGFydGVkJiYoZT10aGlzLnRvU2Vjb25kcyhlKSx0aGlzLl9zdG9wKGkpLHRoaXMuX3N0YXJ0KGksZSkpLHRoaXN9LHQuUGxheWVyLnByb3RvdHlwZS5zZXRMb29wUG9pbnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubG9vcFN0YXJ0PXQsdGhpcy5sb29wRW5kPWUsdGhpc30sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGxheWVyLnByb3RvdHlwZSxcImxvb3BTdGFydFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbG9vcFN0YXJ0fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbG9vcFN0YXJ0PXQsdGhpcy5fYWN0aXZlU291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UubG9vcFN0YXJ0PXR9KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QbGF5ZXIucHJvdG90eXBlLFwibG9vcEVuZFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbG9vcEVuZH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2xvb3BFbmQ9dCx0aGlzLl9hY3RpdmVTb3VyY2VzLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5sb29wRW5kPXR9KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QbGF5ZXIucHJvdG90eXBlLFwiYnVmZmVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9idWZmZXJ9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9idWZmZXIuc2V0KHQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlBsYXllci5wcm90b3R5cGUsXCJsb29wXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb29wfSxzZXQ6ZnVuY3Rpb24oZSl7aWYodGhpcy5fbG9vcCE9PWUmJih0aGlzLl9sb29wPWUsdGhpcy5fYWN0aXZlU291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QubG9vcD1lfSksZSkpe3ZhciBpPXRoaXMuX3N0YXRlLmdldE5leHRTdGF0ZSh0LlN0YXRlLlN0b3BwZWQsdGhpcy5ub3coKSk7aSYmdGhpcy5fc3RhdGUuY2FuY2VsKGkudGltZSl9fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlBsYXllci5wcm90b3R5cGUsXCJwbGF5YmFja1JhdGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BsYXliYWNrUmF0ZX0sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX3BsYXliYWNrUmF0ZT1lO3ZhciBpPXRoaXMubm93KCksbj10aGlzLl9zdGF0ZS5nZXROZXh0U3RhdGUodC5TdGF0ZS5TdG9wcGVkLGkpO24mJnRoaXMuX3N0YXRlLmNhbmNlbChuLnRpbWUpLHRoaXMuX2FjdGl2ZVNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbih0KXt0LmNhbmNlbFN0b3AoKSx0LnBsYXliYWNrUmF0ZS5zZXRWYWx1ZUF0VGltZShlLGkpfSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGxheWVyLnByb3RvdHlwZSxcInJldmVyc2VcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2J1ZmZlci5yZXZlcnNlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fYnVmZmVyLnJldmVyc2U9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QbGF5ZXIucHJvdG90eXBlLFwibG9hZGVkXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9idWZmZXIubG9hZGVkfX0pLHQuUGxheWVyLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZVNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbih0KXt0LmRpc3Bvc2UoKX0pLHRoaXMuX2FjdGl2ZVNvdXJjZXM9bnVsbCx0LlNvdXJjZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX2J1ZmZlci5kaXNwb3NlKCksdGhpcy5fYnVmZmVyPW51bGwsdGhpc30sdC5QbGF5ZXJ9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMzApLGkoNDEpLGkoMzcpLGkoMSksaSg5KSxpKDI1KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuTW9ub1N5bnRoPWZ1bmN0aW9uKGUpe2U9dC5kZWZhdWx0QXJnKGUsdC5Nb25vU3ludGguZGVmYXVsdHMpLHQuTW9ub3Bob25pYy5jYWxsKHRoaXMsZSksdGhpcy5vc2NpbGxhdG9yPW5ldyB0Lk9tbmlPc2NpbGxhdG9yKGUub3NjaWxsYXRvciksdGhpcy5mcmVxdWVuY3k9dGhpcy5vc2NpbGxhdG9yLmZyZXF1ZW5jeSx0aGlzLmRldHVuZT10aGlzLm9zY2lsbGF0b3IuZGV0dW5lLHRoaXMuZmlsdGVyPW5ldyB0LkZpbHRlcihlLmZpbHRlciksdGhpcy5maWx0ZXIuZnJlcXVlbmN5LnZhbHVlPTVlMyx0aGlzLmZpbHRlckVudmVsb3BlPW5ldyB0LkZyZXF1ZW5jeUVudmVsb3BlKGUuZmlsdGVyRW52ZWxvcGUpLHRoaXMuZW52ZWxvcGU9bmV3IHQuQW1wbGl0dWRlRW52ZWxvcGUoZS5lbnZlbG9wZSksdGhpcy5vc2NpbGxhdG9yLmNoYWluKHRoaXMuZmlsdGVyLHRoaXMuZW52ZWxvcGUsdGhpcy5vdXRwdXQpLHRoaXMuZmlsdGVyRW52ZWxvcGUuY29ubmVjdCh0aGlzLmZpbHRlci5mcmVxdWVuY3kpLHRoaXMuX3JlYWRPbmx5KFtcIm9zY2lsbGF0b3JcIixcImZyZXF1ZW5jeVwiLFwiZGV0dW5lXCIsXCJmaWx0ZXJcIixcImZpbHRlckVudmVsb3BlXCIsXCJlbnZlbG9wZVwiXSl9LHQuZXh0ZW5kKHQuTW9ub1N5bnRoLHQuTW9ub3Bob25pYyksdC5Nb25vU3ludGguZGVmYXVsdHM9e2ZyZXF1ZW5jeTpcIkM0XCIsZGV0dW5lOjAsb3NjaWxsYXRvcjp7dHlwZTpcInNxdWFyZVwifSxmaWx0ZXI6e1E6Nix0eXBlOlwibG93cGFzc1wiLHJvbGxvZmY6LTI0fSxlbnZlbG9wZTp7YXR0YWNrOi4wMDUsZGVjYXk6LjEsc3VzdGFpbjouOSxyZWxlYXNlOjF9LGZpbHRlckVudmVsb3BlOnthdHRhY2s6LjA2LGRlY2F5Oi4yLHN1c3RhaW46LjUscmVsZWFzZToyLGJhc2VGcmVxdWVuY3k6MjAwLG9jdGF2ZXM6NyxleHBvbmVudDoyfX0sdC5Nb25vU3ludGgucHJvdG90eXBlLl90cmlnZ2VyRW52ZWxvcGVBdHRhY2s9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLmVudmVsb3BlLnRyaWdnZXJBdHRhY2sodCxlKSx0aGlzLmZpbHRlckVudmVsb3BlLnRyaWdnZXJBdHRhY2sodCksdGhpcy5vc2NpbGxhdG9yLnN0YXJ0KHQpLDA9PT10aGlzLmVudmVsb3BlLnN1c3RhaW4mJnRoaXMub3NjaWxsYXRvci5zdG9wKHQrdGhpcy5lbnZlbG9wZS5hdHRhY2srdGhpcy5lbnZlbG9wZS5kZWNheSksdGhpc30sdC5Nb25vU3ludGgucHJvdG90eXBlLl90cmlnZ2VyRW52ZWxvcGVSZWxlYXNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVudmVsb3BlLnRyaWdnZXJSZWxlYXNlKHQpLHRoaXMuZmlsdGVyRW52ZWxvcGUudHJpZ2dlclJlbGVhc2UodCksdGhpcy5vc2NpbGxhdG9yLnN0b3AodCt0aGlzLmVudmVsb3BlLnJlbGVhc2UpLHRoaXN9LHQuTW9ub1N5bnRoLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuTW9ub3Bob25pYy5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcIm9zY2lsbGF0b3JcIixcImZyZXF1ZW5jeVwiLFwiZGV0dW5lXCIsXCJmaWx0ZXJcIixcImZpbHRlckVudmVsb3BlXCIsXCJlbnZlbG9wZVwiXSksdGhpcy5vc2NpbGxhdG9yLmRpc3Bvc2UoKSx0aGlzLm9zY2lsbGF0b3I9bnVsbCx0aGlzLmVudmVsb3BlLmRpc3Bvc2UoKSx0aGlzLmVudmVsb3BlPW51bGwsdGhpcy5maWx0ZXJFbnZlbG9wZS5kaXNwb3NlKCksdGhpcy5maWx0ZXJFbnZlbG9wZT1udWxsLHRoaXMuZmlsdGVyLmRpc3Bvc2UoKSx0aGlzLmZpbHRlcj1udWxsLHRoaXMuZnJlcXVlbmN5PW51bGwsdGhpcy5kZXR1bmU9bnVsbCx0aGlzfSx0Lk1vbm9TeW50aH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg2KSxpKDE3KSxpKDUpLGkoMyldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkZhdE9zY2lsbGF0b3I9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJmcmVxdWVuY3lcIixcInR5cGVcIixcInNwcmVhZFwiXSx0LkZhdE9zY2lsbGF0b3IpO3QuU291cmNlLmNhbGwodGhpcyxlKSx0aGlzLmZyZXF1ZW5jeT1uZXcgdC5TaWduYWwoZS5mcmVxdWVuY3ksdC5UeXBlLkZyZXF1ZW5jeSksdGhpcy5kZXR1bmU9bmV3IHQuU2lnbmFsKGUuZGV0dW5lLHQuVHlwZS5DZW50cyksdGhpcy5fb3NjaWxsYXRvcnM9W10sdGhpcy5fc3ByZWFkPWUuc3ByZWFkLHRoaXMuX3R5cGU9ZS50eXBlLHRoaXMuX3BoYXNlPWUucGhhc2UsdGhpcy5fcGFydGlhbHM9ZS5wYXJ0aWFscyx0aGlzLl9wYXJ0aWFsQ291bnQ9ZS5wYXJ0aWFsQ291bnQsdGhpcy5jb3VudD1lLmNvdW50LHRoaXMuX3JlYWRPbmx5KFtcImZyZXF1ZW5jeVwiLFwiZGV0dW5lXCJdKX0sdC5leHRlbmQodC5GYXRPc2NpbGxhdG9yLHQuU291cmNlKSx0LkZhdE9zY2lsbGF0b3IuZGVmYXVsdHM9e2ZyZXF1ZW5jeTo0NDAsZGV0dW5lOjAscGhhc2U6MCxzcHJlYWQ6MjAsY291bnQ6Myx0eXBlOlwic2F3dG9vdGhcIixwYXJ0aWFsczpbXSxwYXJ0aWFsQ291bnQ6MH0sdC5GYXRPc2NpbGxhdG9yLnByb3RvdHlwZS5fc3RhcnQ9ZnVuY3Rpb24odCl7dD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uuc3RhcnQodCl9KX0sdC5GYXRPc2NpbGxhdG9yLnByb3RvdHlwZS5fc3RvcD1mdW5jdGlvbih0KXt0PXRoaXMudG9TZWNvbmRzKHQpLHRoaXMuX2ZvckVhY2goZnVuY3Rpb24oZSl7ZS5zdG9wKHQpfSl9LHQuRmF0T3NjaWxsYXRvci5wcm90b3R5cGUucmVzdGFydD1mdW5jdGlvbih0KXt0PXRoaXMudG9TZWNvbmRzKHQpLHRoaXMuX2ZvckVhY2goZnVuY3Rpb24oZSl7ZS5yZXN0YXJ0KHQpfSl9LHQuRmF0T3NjaWxsYXRvci5wcm90b3R5cGUuX2ZvckVhY2g9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9vc2NpbGxhdG9ycy5sZW5ndGg7ZSsrKXQuY2FsbCh0aGlzLHRoaXMuX29zY2lsbGF0b3JzW2VdLGUpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5GYXRPc2NpbGxhdG9yLnByb3RvdHlwZSxcInR5cGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3R5cGV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl90eXBlPXQsdGhpcy5fZm9yRWFjaChmdW5jdGlvbihlKXtlLnR5cGU9dH0pfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkZhdE9zY2lsbGF0b3IucHJvdG90eXBlLFwic3ByZWFkXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zcHJlYWR9LHNldDpmdW5jdGlvbih0KXtpZih0aGlzLl9zcHJlYWQ9dCx0aGlzLl9vc2NpbGxhdG9ycy5sZW5ndGg+MSl7dmFyIGU9LXQvMixpPXQvKHRoaXMuX29zY2lsbGF0b3JzLmxlbmd0aC0xKTt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKHQsbil7dC5kZXR1bmUudmFsdWU9ZStpKm59KX19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuRmF0T3NjaWxsYXRvci5wcm90b3R5cGUsXCJjb3VudFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3NjaWxsYXRvcnMubGVuZ3RofSxzZXQ6ZnVuY3Rpb24oZSl7aWYoZT1NYXRoLm1heChlLDEpLHRoaXMuX29zY2lsbGF0b3JzLmxlbmd0aCE9PWUpe3RoaXMuX2ZvckVhY2goZnVuY3Rpb24odCl7dC5kaXNwb3NlKCl9KSx0aGlzLl9vc2NpbGxhdG9ycz1bXTtmb3IodmFyIGk9MDtpPGU7aSsrKXt2YXIgbj1uZXcgdC5Pc2NpbGxhdG9yO3RoaXMudHlwZT09PXQuT3NjaWxsYXRvci5UeXBlLkN1c3RvbT9uLnBhcnRpYWxzPXRoaXMuX3BhcnRpYWxzOm4udHlwZT10aGlzLl90eXBlLG4ucGFydGlhbENvdW50PXRoaXMuX3BhcnRpYWxDb3VudCxuLnBoYXNlPXRoaXMuX3BoYXNlK2kvZSozNjAsbi52b2x1bWUudmFsdWU9LTYtMS4xKmUsdGhpcy5mcmVxdWVuY3kuY29ubmVjdChuLmZyZXF1ZW5jeSksdGhpcy5kZXR1bmUuY29ubmVjdChuLmRldHVuZSksbi5jb25uZWN0KHRoaXMub3V0cHV0KSx0aGlzLl9vc2NpbGxhdG9yc1tpXT1ufXRoaXMuc3ByZWFkPXRoaXMuX3NwcmVhZCx0aGlzLnN0YXRlPT09dC5TdGF0ZS5TdGFydGVkJiZ0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKHQpe3Quc3RhcnQoKX0pfX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5GYXRPc2NpbGxhdG9yLnByb3RvdHlwZSxcInBoYXNlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9waGFzZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3BoYXNlPXQsdGhpcy5fZm9yRWFjaChmdW5jdGlvbihlKXtlLnBoYXNlPXR9KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5GYXRPc2NpbGxhdG9yLnByb3RvdHlwZSxcImJhc2VUeXBlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vc2NpbGxhdG9yc1swXS5iYXNlVHlwZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2ZvckVhY2goZnVuY3Rpb24oZSl7ZS5iYXNlVHlwZT10fSksdGhpcy5fdHlwZT10aGlzLl9vc2NpbGxhdG9yc1swXS50eXBlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkZhdE9zY2lsbGF0b3IucHJvdG90eXBlLFwicGFydGlhbHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29zY2lsbGF0b3JzWzBdLnBhcnRpYWxzfSxzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5fcGFydGlhbHM9ZSx0aGlzLl90eXBlPXQuT3NjaWxsYXRvci5UeXBlLkN1c3RvbSx0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKHQpe3QucGFydGlhbHM9ZX0pfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkZhdE9zY2lsbGF0b3IucHJvdG90eXBlLFwicGFydGlhbENvdW50XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vc2NpbGxhdG9yc1swXS5wYXJ0aWFsQ291bnR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9wYXJ0aWFsQ291bnQ9dCx0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucGFydGlhbENvdW50PXR9KSx0aGlzLl90eXBlPXRoaXMuX29zY2lsbGF0b3JzWzBdLnR5cGV9fSksdC5GYXRPc2NpbGxhdG9yLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU291cmNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fd3JpdGFibGUoW1wiZnJlcXVlbmN5XCIsXCJkZXR1bmVcIl0pLHRoaXMuZnJlcXVlbmN5LmRpc3Bvc2UoKSx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXMuZGV0dW5lLmRpc3Bvc2UoKSx0aGlzLmRldHVuZT1udWxsLHRoaXMuX2ZvckVhY2goZnVuY3Rpb24odCl7dC5kaXNwb3NlKCl9KSx0aGlzLl9vc2NpbGxhdG9ycz1udWxsLHRoaXMuX3BhcnRpYWxzPW51bGwsdGhpc30sdC5GYXRPc2NpbGxhdG9yfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDYpLGkoMTcpLGkoNSksaSgzKSxpKDIyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuQU1Pc2NpbGxhdG9yPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiZnJlcXVlbmN5XCIsXCJ0eXBlXCIsXCJtb2R1bGF0aW9uVHlwZVwiXSx0LkFNT3NjaWxsYXRvcik7dC5Tb3VyY2UuY2FsbCh0aGlzLGUpLHRoaXMuX2NhcnJpZXI9bmV3IHQuT3NjaWxsYXRvcihlLmZyZXF1ZW5jeSxlLnR5cGUpLHRoaXMuZnJlcXVlbmN5PXRoaXMuX2NhcnJpZXIuZnJlcXVlbmN5LHRoaXMuZGV0dW5lPXRoaXMuX2NhcnJpZXIuZGV0dW5lLHRoaXMuZGV0dW5lLnZhbHVlPWUuZGV0dW5lLHRoaXMuX21vZHVsYXRvcj1uZXcgdC5Pc2NpbGxhdG9yKGUuZnJlcXVlbmN5LGUubW9kdWxhdGlvblR5cGUpLHRoaXMuX21vZHVsYXRpb25TY2FsZT1uZXcgdC5BdWRpb1RvR2Fpbix0aGlzLmhhcm1vbmljaXR5PW5ldyB0Lk11bHRpcGx5KGUuaGFybW9uaWNpdHkpLHRoaXMuaGFybW9uaWNpdHkudW5pdHM9dC5UeXBlLlBvc2l0aXZlLHRoaXMuX21vZHVsYXRpb25Ob2RlPW5ldyB0LkdhaW4oMCksdGhpcy5mcmVxdWVuY3kuY2hhaW4odGhpcy5oYXJtb25pY2l0eSx0aGlzLl9tb2R1bGF0b3IuZnJlcXVlbmN5KSx0aGlzLmRldHVuZS5jb25uZWN0KHRoaXMuX21vZHVsYXRvci5kZXR1bmUpLHRoaXMuX21vZHVsYXRvci5jaGFpbih0aGlzLl9tb2R1bGF0aW9uU2NhbGUsdGhpcy5fbW9kdWxhdGlvbk5vZGUuZ2FpbiksdGhpcy5fY2Fycmllci5jaGFpbih0aGlzLl9tb2R1bGF0aW9uTm9kZSx0aGlzLm91dHB1dCksdGhpcy5waGFzZT1lLnBoYXNlLHRoaXMuX3JlYWRPbmx5KFtcImZyZXF1ZW5jeVwiLFwiZGV0dW5lXCIsXCJoYXJtb25pY2l0eVwiXSl9LHQuZXh0ZW5kKHQuQU1Pc2NpbGxhdG9yLHQuT3NjaWxsYXRvciksdC5BTU9zY2lsbGF0b3IuZGVmYXVsdHM9e2ZyZXF1ZW5jeTo0NDAsZGV0dW5lOjAscGhhc2U6MCx0eXBlOlwic2luZVwiLG1vZHVsYXRpb25UeXBlOlwic3F1YXJlXCIsaGFybW9uaWNpdHk6MX0sdC5BTU9zY2lsbGF0b3IucHJvdG90eXBlLl9zdGFydD1mdW5jdGlvbih0KXt0aGlzLl9tb2R1bGF0b3Iuc3RhcnQodCksdGhpcy5fY2Fycmllci5zdGFydCh0KX0sdC5BTU9zY2lsbGF0b3IucHJvdG90eXBlLl9zdG9wPWZ1bmN0aW9uKHQpe3RoaXMuX21vZHVsYXRvci5zdG9wKHQpLHRoaXMuX2NhcnJpZXIuc3RvcCh0KX0sdC5BTU9zY2lsbGF0b3IucHJvdG90eXBlLnJlc3RhcnQ9ZnVuY3Rpb24odCl7dGhpcy5fbW9kdWxhdG9yLnJlc3RhcnQodCksdGhpcy5fY2Fycmllci5yZXN0YXJ0KHQpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BTU9zY2lsbGF0b3IucHJvdG90eXBlLFwidHlwZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2Fycmllci50eXBlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2Fycmllci50eXBlPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQU1Pc2NpbGxhdG9yLnByb3RvdHlwZSxcImJhc2VUeXBlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jYXJyaWVyLmJhc2VUeXBlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2Fycmllci5iYXNlVHlwZT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkFNT3NjaWxsYXRvci5wcm90b3R5cGUsXCJwYXJ0aWFsQ291bnRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NhcnJpZXIucGFydGlhbENvdW50fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2Fycmllci5wYXJ0aWFsQ291bnQ9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BTU9zY2lsbGF0b3IucHJvdG90eXBlLFwibW9kdWxhdGlvblR5cGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vZHVsYXRvci50eXBlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbW9kdWxhdG9yLnR5cGU9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BTU9zY2lsbGF0b3IucHJvdG90eXBlLFwicGhhc2VcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NhcnJpZXIucGhhc2V9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9jYXJyaWVyLnBoYXNlPXQsdGhpcy5fbW9kdWxhdG9yLnBoYXNlPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQU1Pc2NpbGxhdG9yLnByb3RvdHlwZSxcInBhcnRpYWxzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jYXJyaWVyLnBhcnRpYWxzfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2Fycmllci5wYXJ0aWFscz10fX0pLHQuQU1Pc2NpbGxhdG9yLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU291cmNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fd3JpdGFibGUoW1wiZnJlcXVlbmN5XCIsXCJkZXR1bmVcIixcImhhcm1vbmljaXR5XCJdKSx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXMuZGV0dW5lPW51bGwsdGhpcy5oYXJtb25pY2l0eS5kaXNwb3NlKCksdGhpcy5oYXJtb25pY2l0eT1udWxsLHRoaXMuX2NhcnJpZXIuZGlzcG9zZSgpLHRoaXMuX2NhcnJpZXI9bnVsbCx0aGlzLl9tb2R1bGF0b3IuZGlzcG9zZSgpLHRoaXMuX21vZHVsYXRvcj1udWxsLHRoaXMuX21vZHVsYXRpb25Ob2RlLmRpc3Bvc2UoKSx0aGlzLl9tb2R1bGF0aW9uTm9kZT1udWxsLHRoaXMuX21vZHVsYXRpb25TY2FsZS5kaXNwb3NlKCksdGhpcy5fbW9kdWxhdGlvblNjYWxlPW51bGwsdGhpc30sdC5BTU9zY2lsbGF0b3J9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNiksaSg0OSksaSgxNyksaSg1KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuUFdNT3NjaWxsYXRvcj1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcImZyZXF1ZW5jeVwiLFwibW9kdWxhdGlvbkZyZXF1ZW5jeVwiXSx0LlBXTU9zY2lsbGF0b3IpO3QuU291cmNlLmNhbGwodGhpcyxlKSx0aGlzLl9wdWxzZT1uZXcgdC5QdWxzZU9zY2lsbGF0b3IoZS5tb2R1bGF0aW9uRnJlcXVlbmN5KSx0aGlzLl9wdWxzZS5fc2F3dG9vdGgudHlwZT1cInNpbmVcIix0aGlzLl9tb2R1bGF0b3I9bmV3IHQuT3NjaWxsYXRvcih7ZnJlcXVlbmN5OmUuZnJlcXVlbmN5LGRldHVuZTplLmRldHVuZSxwaGFzZTplLnBoYXNlfSksdGhpcy5fc2NhbGU9bmV3IHQuTXVsdGlwbHkoMiksdGhpcy5mcmVxdWVuY3k9dGhpcy5fbW9kdWxhdG9yLmZyZXF1ZW5jeSx0aGlzLmRldHVuZT10aGlzLl9tb2R1bGF0b3IuZGV0dW5lLHRoaXMubW9kdWxhdGlvbkZyZXF1ZW5jeT10aGlzLl9wdWxzZS5mcmVxdWVuY3ksdGhpcy5fbW9kdWxhdG9yLmNoYWluKHRoaXMuX3NjYWxlLHRoaXMuX3B1bHNlLndpZHRoKSx0aGlzLl9wdWxzZS5jb25uZWN0KHRoaXMub3V0cHV0KSx0aGlzLl9yZWFkT25seShbXCJtb2R1bGF0aW9uRnJlcXVlbmN5XCIsXCJmcmVxdWVuY3lcIixcImRldHVuZVwiXSl9LHQuZXh0ZW5kKHQuUFdNT3NjaWxsYXRvcix0LlNvdXJjZSksdC5QV01Pc2NpbGxhdG9yLmRlZmF1bHRzPXtmcmVxdWVuY3k6NDQwLGRldHVuZTowLHBoYXNlOjAsbW9kdWxhdGlvbkZyZXF1ZW5jeTouNH0sdC5QV01Pc2NpbGxhdG9yLnByb3RvdHlwZS5fc3RhcnQ9ZnVuY3Rpb24odCl7dD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl9tb2R1bGF0b3Iuc3RhcnQodCksdGhpcy5fcHVsc2Uuc3RhcnQodCl9LHQuUFdNT3NjaWxsYXRvci5wcm90b3R5cGUuX3N0b3A9ZnVuY3Rpb24odCl7dD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl9tb2R1bGF0b3Iuc3RvcCh0KSx0aGlzLl9wdWxzZS5zdG9wKHQpfSx0LlBXTU9zY2lsbGF0b3IucHJvdG90eXBlLnJlc3RhcnQ9ZnVuY3Rpb24odCl7dGhpcy5fbW9kdWxhdG9yLnJlc3RhcnQodCksdGhpcy5fcHVsc2UucmVzdGFydCh0KX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUFdNT3NjaWxsYXRvci5wcm90b3R5cGUsXCJ0eXBlXCIse2dldDpmdW5jdGlvbigpe3JldHVyblwicHdtXCJ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUFdNT3NjaWxsYXRvci5wcm90b3R5cGUsXCJiYXNlVHlwZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm5cInB3bVwifX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlBXTU9zY2lsbGF0b3IucHJvdG90eXBlLFwicGFydGlhbHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuW119fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUFdNT3NjaWxsYXRvci5wcm90b3R5cGUsXCJwaGFzZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW9kdWxhdG9yLnBoYXNlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbW9kdWxhdG9yLnBoYXNlPXR9fSksdC5QV01Pc2NpbGxhdG9yLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU291cmNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fcHVsc2UuZGlzcG9zZSgpLHRoaXMuX3B1bHNlPW51bGwsdGhpcy5fc2NhbGUuZGlzcG9zZSgpLHRoaXMuX3NjYWxlPW51bGwsdGhpcy5fbW9kdWxhdG9yLmRpc3Bvc2UoKSx0aGlzLl9tb2R1bGF0b3I9bnVsbCx0aGlzLl93cml0YWJsZShbXCJtb2R1bGF0aW9uRnJlcXVlbmN5XCIsXCJmcmVxdWVuY3lcIixcImRldHVuZVwiXSksdGhpcy5mcmVxdWVuY3k9bnVsbCx0aGlzLmRldHVuZT1udWxsLHRoaXMubW9kdWxhdGlvbkZyZXF1ZW5jeT1udWxsLHRoaXN9LHQuUFdNT3NjaWxsYXRvcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg1MCksaSg0KSxpKDE2KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuUGFydD1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcImNhbGxiYWNrXCIsXCJldmVudHNcIl0sdC5QYXJ0KTt0LkV2ZW50LmNhbGwodGhpcyxlKSx0aGlzLl9ldmVudHM9W107Zm9yKHZhciBpPTA7aTxlLmV2ZW50cy5sZW5ndGg7aSsrKUFycmF5LmlzQXJyYXkoZS5ldmVudHNbaV0pP3RoaXMuYWRkKGUuZXZlbnRzW2ldWzBdLGUuZXZlbnRzW2ldWzFdKTp0aGlzLmFkZChlLmV2ZW50c1tpXSl9LHQuZXh0ZW5kKHQuUGFydCx0LkV2ZW50KSx0LlBhcnQuZGVmYXVsdHM9e2NhbGxiYWNrOnQubm9PcCxsb29wOiExLGxvb3BFbmQ6XCIxbVwiLGxvb3BTdGFydDowLHBsYXliYWNrUmF0ZToxLHByb2JhYmlsaXR5OjEsaHVtYW5pemU6ITEsbXV0ZTohMSxldmVudHM6W119LHQuUGFydC5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oZSxpKXt2YXIgbj10aGlzLnRvVGlja3MoZSk7cmV0dXJuIHRoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKG4pIT09dC5TdGF0ZS5TdGFydGVkJiYoaT10aGlzLl9sb29wP3QuZGVmYXVsdEFyZyhpLHRoaXMuX2xvb3BTdGFydCk6dC5kZWZhdWx0QXJnKGksMCksaT10aGlzLnRvVGlja3MoaSksdGhpcy5fc3RhdGUuYWRkKHtzdGF0ZTp0LlN0YXRlLlN0YXJ0ZWQsdGltZTpuLG9mZnNldDppfSksdGhpcy5fZm9yRWFjaChmdW5jdGlvbih0KXt0aGlzLl9zdGFydE5vdGUodCxuLGkpfSkpLHRoaXN9LHQuUGFydC5wcm90b3R5cGUuX3N0YXJ0Tm90ZT1mdW5jdGlvbihlLGksbil7aS09bix0aGlzLl9sb29wP2Uuc3RhcnRPZmZzZXQ+PXRoaXMuX2xvb3BTdGFydCYmZS5zdGFydE9mZnNldDx0aGlzLl9sb29wRW5kPyhlLnN0YXJ0T2Zmc2V0PG4mJihpKz10aGlzLl9nZXRMb29wRHVyYXRpb24oKSksZS5zdGFydCh0LlRpY2tzKGkpKSk6ZS5zdGFydE9mZnNldDx0aGlzLl9sb29wU3RhcnQmJmUuc3RhcnRPZmZzZXQ+PW4mJihlLmxvb3A9ITEsZS5zdGFydCh0LlRpY2tzKGkpKSk6ZS5zdGFydE9mZnNldD49biYmZS5zdGFydCh0LlRpY2tzKGkpKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGFydC5wcm90b3R5cGUsXCJzdGFydE9mZnNldFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RhcnRPZmZzZXR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9zdGFydE9mZnNldD10LHRoaXMuX2ZvckVhY2goZnVuY3Rpb24odCl7dC5zdGFydE9mZnNldCs9dGhpcy5fc3RhcnRPZmZzZXR9KX19KSx0LlBhcnQucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy50b1RpY2tzKGUpO3JldHVybiB0aGlzLl9zdGF0ZS5jYW5jZWwoaSksdGhpcy5fc3RhdGUuc2V0U3RhdGVBdFRpbWUodC5TdGF0ZS5TdG9wcGVkLGkpLHRoaXMuX2ZvckVhY2goZnVuY3Rpb24odCl7dC5zdG9wKGUpfSksdGhpc30sdC5QYXJ0LnByb3RvdHlwZS5hdD1mdW5jdGlvbihlLGkpe2U9dC5UcmFuc3BvcnRUaW1lKGUpO2Zvcih2YXIgbj10LlRpY2tzKDEpLnRvU2Vjb25kcygpLG89MDtvPHRoaXMuX2V2ZW50cy5sZW5ndGg7bysrKXt2YXIgcz10aGlzLl9ldmVudHNbb107aWYoTWF0aC5hYnMoZS50b1RpY2tzKCktcy5zdGFydE9mZnNldCk8bilyZXR1cm4gdC5pc0RlZmluZWQoaSkmJihzLnZhbHVlPWkpLHN9cmV0dXJuIHQuaXNEZWZpbmVkKGkpPyh0aGlzLmFkZChlLGkpLHRoaXMuX2V2ZW50c1t0aGlzLl9ldmVudHMubGVuZ3RoLTFdKTpudWxsfSx0LlBhcnQucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlLGkpe3ZhciBuO3JldHVybiBlLmhhc093blByb3BlcnR5KFwidGltZVwiKSYmKGU9KGk9ZSkudGltZSksZT10aGlzLnRvVGlja3MoZSksaSBpbnN0YW5jZW9mIHQuRXZlbnQ/KG49aSkuY2FsbGJhY2s9dGhpcy5fdGljay5iaW5kKHRoaXMpOm49bmV3IHQuRXZlbnQoe2NhbGxiYWNrOnRoaXMuX3RpY2suYmluZCh0aGlzKSx2YWx1ZTppfSksbi5zdGFydE9mZnNldD1lLG4uc2V0KHtsb29wRW5kOnRoaXMubG9vcEVuZCxsb29wU3RhcnQ6dGhpcy5sb29wU3RhcnQsbG9vcDp0aGlzLmxvb3AsaHVtYW5pemU6dGhpcy5odW1hbml6ZSxwbGF5YmFja1JhdGU6dGhpcy5wbGF5YmFja1JhdGUscHJvYmFiaWxpdHk6dGhpcy5wcm9iYWJpbGl0eX0pLHRoaXMuX2V2ZW50cy5wdXNoKG4pLHRoaXMuX3Jlc3RhcnRFdmVudChuKSx0aGlzfSx0LlBhcnQucHJvdG90eXBlLl9yZXN0YXJ0RXZlbnQ9ZnVuY3Rpb24oZSl7dGhpcy5fc3RhdGUuZm9yRWFjaChmdW5jdGlvbihpKXtpLnN0YXRlPT09dC5TdGF0ZS5TdGFydGVkP3RoaXMuX3N0YXJ0Tm90ZShlLGkudGltZSxpLm9mZnNldCk6ZS5zdG9wKHQuVGlja3MoaS50aW1lKSl9LmJpbmQodGhpcykpfSx0LlBhcnQucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihlLGkpe2UuaGFzT3duUHJvcGVydHkoXCJ0aW1lXCIpJiYoZT0oaT1lKS50aW1lKSxlPXRoaXMudG9UaWNrcyhlKTtmb3IodmFyIG49dGhpcy5fZXZlbnRzLmxlbmd0aC0xO24+PTA7bi0tKXt2YXIgbz10aGlzLl9ldmVudHNbbl07by5zdGFydE9mZnNldD09PWUmJih0LmlzVW5kZWYoaSl8fHQuaXNEZWZpbmVkKGkpJiZvLnZhbHVlPT09aSkmJih0aGlzLl9ldmVudHMuc3BsaWNlKG4sMSksby5kaXNwb3NlKCkpfXJldHVybiB0aGlzfSx0LlBhcnQucHJvdG90eXBlLnJlbW92ZUFsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuZGlzcG9zZSgpfSksdGhpcy5fZXZlbnRzPVtdLHRoaXN9LHQuUGFydC5wcm90b3R5cGUuY2FuY2VsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2FuY2VsKHQpfSksdGhpcy5fc3RhdGUuY2FuY2VsKHRoaXMudG9UaWNrcyh0KSksdGhpc30sdC5QYXJ0LnByb3RvdHlwZS5fZm9yRWFjaD1mdW5jdGlvbihlLGkpe2lmKHRoaXMuX2V2ZW50cyl7aT10LmRlZmF1bHRBcmcoaSx0aGlzKTtmb3IodmFyIG49dGhpcy5fZXZlbnRzLmxlbmd0aC0xO24+PTA7bi0tKXt2YXIgbz10aGlzLl9ldmVudHNbbl07byBpbnN0YW5jZW9mIHQuUGFydD9vLl9mb3JFYWNoKGUsaSk6ZS5jYWxsKGksbyl9fXJldHVybiB0aGlzfSx0LlBhcnQucHJvdG90eXBlLl9zZXRBbGw9ZnVuY3Rpb24odCxlKXt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKGkpe2lbdF09ZX0pfSx0LlBhcnQucHJvdG90eXBlLl90aWNrPWZ1bmN0aW9uKHQsZSl7dGhpcy5tdXRlfHx0aGlzLmNhbGxiYWNrKHQsZSl9LHQuUGFydC5wcm90b3R5cGUuX3Rlc3RMb29wQm91bmRyaWVzPWZ1bmN0aW9uKGUpe2Uuc3RhcnRPZmZzZXQ8dGhpcy5fbG9vcFN0YXJ0fHxlLnN0YXJ0T2Zmc2V0Pj10aGlzLl9sb29wRW5kP2UuY2FuY2VsKDApOmUuc3RhdGU9PT10LlN0YXRlLlN0b3BwZWQmJnRoaXMuX3Jlc3RhcnRFdmVudChlKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGFydC5wcm90b3R5cGUsXCJwcm9iYWJpbGl0eVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvYmFiaWxpdHl9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9wcm9iYWJpbGl0eT10LHRoaXMuX3NldEFsbChcInByb2JhYmlsaXR5XCIsdCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGFydC5wcm90b3R5cGUsXCJodW1hbml6ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faHVtYW5pemV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9odW1hbml6ZT10LHRoaXMuX3NldEFsbChcImh1bWFuaXplXCIsdCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGFydC5wcm90b3R5cGUsXCJsb29wXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb29wfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbG9vcD10LHRoaXMuX2ZvckVhY2goZnVuY3Rpb24oZSl7ZS5fbG9vcFN0YXJ0PXRoaXMuX2xvb3BTdGFydCxlLl9sb29wRW5kPXRoaXMuX2xvb3BFbmQsZS5sb29wPXQsdGhpcy5fdGVzdExvb3BCb3VuZHJpZXMoZSl9KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QYXJ0LnByb3RvdHlwZSxcImxvb3BFbmRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHQuVGlja3ModGhpcy5fbG9vcEVuZCkudG9TZWNvbmRzKCl9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9sb29wRW5kPXRoaXMudG9UaWNrcyh0KSx0aGlzLl9sb29wJiZ0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKGUpe2UubG9vcEVuZD10LHRoaXMuX3Rlc3RMb29wQm91bmRyaWVzKGUpfSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGFydC5wcm90b3R5cGUsXCJsb29wU3RhcnRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHQuVGlja3ModGhpcy5fbG9vcFN0YXJ0KS50b1NlY29uZHMoKX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2xvb3BTdGFydD10aGlzLnRvVGlja3ModCksdGhpcy5fbG9vcCYmdGhpcy5fZm9yRWFjaChmdW5jdGlvbih0KXt0Lmxvb3BTdGFydD10aGlzLmxvb3BTdGFydCx0aGlzLl90ZXN0TG9vcEJvdW5kcmllcyh0KX0pfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlBhcnQucHJvdG90eXBlLFwicGxheWJhY2tSYXRlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9wbGF5YmFja1JhdGU9dCx0aGlzLl9zZXRBbGwoXCJwbGF5YmFja1JhdGVcIix0KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QYXJ0LnByb3RvdHlwZSxcImxlbmd0aFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRzLmxlbmd0aH19KSx0LlBhcnQucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5FdmVudC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMucmVtb3ZlQWxsKCksdGhpcy5jYWxsYmFjaz1udWxsLHRoaXMuX2V2ZW50cz1udWxsLHRoaXN9LHQuUGFydH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg1MCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe3JldHVybiB0Lkxvb3A9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJjYWxsYmFja1wiLFwiaW50ZXJ2YWxcIl0sdC5Mb29wKTt0LmNhbGwodGhpcyksdGhpcy5fZXZlbnQ9bmV3IHQuRXZlbnQoe2NhbGxiYWNrOnRoaXMuX3RpY2suYmluZCh0aGlzKSxsb29wOiEwLGxvb3BFbmQ6ZS5pbnRlcnZhbCxwbGF5YmFja1JhdGU6ZS5wbGF5YmFja1JhdGUscHJvYmFiaWxpdHk6ZS5wcm9iYWJpbGl0eX0pLHRoaXMuY2FsbGJhY2s9ZS5jYWxsYmFjayx0aGlzLml0ZXJhdGlvbnM9ZS5pdGVyYXRpb25zfSx0LmV4dGVuZCh0Lkxvb3ApLHQuTG9vcC5kZWZhdWx0cz17aW50ZXJ2YWw6XCI0blwiLGNhbGxiYWNrOnQubm9PcCxwbGF5YmFja1JhdGU6MSxpdGVyYXRpb25zOjEvMCxwcm9iYWJpbGl0eTohMCxtdXRlOiExfSx0Lkxvb3AucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ldmVudC5zdGFydCh0KSx0aGlzfSx0Lkxvb3AucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2V2ZW50LnN0b3AodCksdGhpc30sdC5Mb29wLnByb3RvdHlwZS5jYW5jZWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2V2ZW50LmNhbmNlbCh0KSx0aGlzfSx0Lkxvb3AucHJvdG90eXBlLl90aWNrPWZ1bmN0aW9uKHQpe3RoaXMuY2FsbGJhY2sodCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lkxvb3AucHJvdG90eXBlLFwic3RhdGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50LnN0YXRlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lkxvb3AucHJvdG90eXBlLFwicHJvZ3Jlc3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50LnByb2dyZXNzfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lkxvb3AucHJvdG90eXBlLFwiaW50ZXJ2YWxcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50Lmxvb3BFbmR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9ldmVudC5sb29wRW5kPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuTG9vcC5wcm90b3R5cGUsXCJwbGF5YmFja1JhdGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50LnBsYXliYWNrUmF0ZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2V2ZW50LnBsYXliYWNrUmF0ZT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lkxvb3AucHJvdG90eXBlLFwiaHVtYW5pemVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50Lmh1bWFuaXplfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fZXZlbnQuaHVtYW5pemU9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5Mb29wLnByb3RvdHlwZSxcInByb2JhYmlsaXR5XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudC5wcm9iYWJpbGl0eX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2V2ZW50LnByb2JhYmlsaXR5PXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuTG9vcC5wcm90b3R5cGUsXCJtdXRlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudC5tdXRlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fZXZlbnQubXV0ZT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lkxvb3AucHJvdG90eXBlLFwiaXRlcmF0aW9uc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hMD09PXRoaXMuX2V2ZW50Lmxvb3A/MS8wOnRoaXMuX2V2ZW50Lmxvb3B9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9ldmVudC5sb29wPXQ9PT0xLzB8fHR9fSksdC5Mb29wLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5fZXZlbnQuZGlzcG9zZSgpLHRoaXMuX2V2ZW50PW51bGwsdGhpcy5jYWxsYmFjaz1udWxsfSx0Lkxvb3B9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMTUpLGkoMzIpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5TdGVyZW9YRmVlZGJhY2tFZmZlY3Q9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJmZWVkYmFja1wiXSx0LkZlZWRiYWNrRWZmZWN0KTt0LlN0ZXJlb0VmZmVjdC5jYWxsKHRoaXMsZSksdGhpcy5mZWVkYmFjaz1uZXcgdC5TaWduYWwoZS5mZWVkYmFjayx0LlR5cGUuTm9ybWFsUmFuZ2UpLHRoaXMuX2ZlZWRiYWNrTFI9bmV3IHQuR2Fpbix0aGlzLl9mZWVkYmFja1JMPW5ldyB0LkdhaW4sdGhpcy5lZmZlY3RSZXR1cm5MLmNoYWluKHRoaXMuX2ZlZWRiYWNrTFIsdGhpcy5lZmZlY3RTZW5kUiksdGhpcy5lZmZlY3RSZXR1cm5SLmNoYWluKHRoaXMuX2ZlZWRiYWNrUkwsdGhpcy5lZmZlY3RTZW5kTCksdGhpcy5mZWVkYmFjay5mYW4odGhpcy5fZmVlZGJhY2tMUi5nYWluLHRoaXMuX2ZlZWRiYWNrUkwuZ2FpbiksdGhpcy5fcmVhZE9ubHkoW1wiZmVlZGJhY2tcIl0pfSx0LmV4dGVuZCh0LlN0ZXJlb1hGZWVkYmFja0VmZmVjdCx0LlN0ZXJlb0VmZmVjdCksdC5TdGVyZW9YRmVlZGJhY2tFZmZlY3QucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5TdGVyZW9FZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl93cml0YWJsZShbXCJmZWVkYmFja1wiXSksdGhpcy5mZWVkYmFjay5kaXNwb3NlKCksdGhpcy5mZWVkYmFjaz1udWxsLHRoaXMuX2ZlZWRiYWNrTFIuZGlzcG9zZSgpLHRoaXMuX2ZlZWRiYWNrTFI9bnVsbCx0aGlzLl9mZWVkYmFja1JMLmRpc3Bvc2UoKSx0aGlzLl9mZWVkYmFja1JMPW51bGwsdGhpc30sdC5TdGVyZW9YRmVlZGJhY2tFZmZlY3R9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoOCksaSg1MiksaSg1MSldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0Lk1pZFNpZGVFZmZlY3Q9ZnVuY3Rpb24oKXt0LkVmZmVjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fbWlkU2lkZVNwbGl0PW5ldyB0Lk1pZFNpZGVTcGxpdCx0aGlzLl9taWRTaWRlTWVyZ2U9bmV3IHQuTWlkU2lkZU1lcmdlLHRoaXMubWlkU2VuZD10aGlzLl9taWRTaWRlU3BsaXQubWlkLHRoaXMuc2lkZVNlbmQ9dGhpcy5fbWlkU2lkZVNwbGl0LnNpZGUsdGhpcy5taWRSZXR1cm49dGhpcy5fbWlkU2lkZU1lcmdlLm1pZCx0aGlzLnNpZGVSZXR1cm49dGhpcy5fbWlkU2lkZU1lcmdlLnNpZGUsdGhpcy5lZmZlY3RTZW5kLmNvbm5lY3QodGhpcy5fbWlkU2lkZVNwbGl0KSx0aGlzLl9taWRTaWRlTWVyZ2UuY29ubmVjdCh0aGlzLmVmZmVjdFJldHVybil9LHQuZXh0ZW5kKHQuTWlkU2lkZUVmZmVjdCx0LkVmZmVjdCksdC5NaWRTaWRlRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fbWlkU2lkZVNwbGl0LmRpc3Bvc2UoKSx0aGlzLl9taWRTaWRlU3BsaXQ9bnVsbCx0aGlzLl9taWRTaWRlTWVyZ2UuZGlzcG9zZSgpLHRoaXMuX21pZFNpZGVNZXJnZT1udWxsLHRoaXMubWlkU2VuZD1udWxsLHRoaXMuc2lkZVNlbmQ9bnVsbCx0aGlzLm1pZFJldHVybj1udWxsLHRoaXMuc2lkZVJldHVybj1udWxsLHRoaXN9LHQuTWlkU2lkZUVmZmVjdH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxMSksaSg4KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuQ29udm9sdmVyPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1widXJsXCIsXCJvbmxvYWRcIl0sdC5Db252b2x2ZXIpO3QuRWZmZWN0LmNhbGwodGhpcyxlKSx0aGlzLl9jb252b2x2ZXI9dGhpcy5jb250ZXh0LmNyZWF0ZUNvbnZvbHZlcigpLHRoaXMuX2J1ZmZlcj1uZXcgdC5CdWZmZXIoZS51cmwsZnVuY3Rpb24odCl7dGhpcy5idWZmZXI9dC5nZXQoKSxlLm9ubG9hZCgpfS5iaW5kKHRoaXMpKSx0aGlzLl9idWZmZXIubG9hZGVkJiYodGhpcy5idWZmZXI9dGhpcy5fYnVmZmVyKSx0aGlzLm5vcm1hbGl6ZT1lLm5vcm1hbGl6ZSx0aGlzLmNvbm5lY3RFZmZlY3QodGhpcy5fY29udm9sdmVyKX0sdC5leHRlbmQodC5Db252b2x2ZXIsdC5FZmZlY3QpLHQuQ29udm9sdmVyLmRlZmF1bHRzPXtvbmxvYWQ6dC5ub09wLG5vcm1hbGl6ZTohMH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQ29udm9sdmVyLnByb3RvdHlwZSxcImJ1ZmZlclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYnVmZmVyLmxlbmd0aD90aGlzLl9idWZmZXI6bnVsbH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2J1ZmZlci5zZXQodCksdGhpcy5fY29udm9sdmVyLmJ1ZmZlciYmKHRoaXMuZWZmZWN0U2VuZC5kaXNjb25uZWN0KCksdGhpcy5fY29udm9sdmVyLmRpc2Nvbm5lY3QoKSx0aGlzLl9jb252b2x2ZXI9dGhpcy5jb250ZXh0LmNyZWF0ZUNvbnZvbHZlcigpLHRoaXMuY29ubmVjdEVmZmVjdCh0aGlzLl9jb252b2x2ZXIpKSx0aGlzLl9jb252b2x2ZXIuYnVmZmVyPXRoaXMuX2J1ZmZlci5nZXQoKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5Db252b2x2ZXIucHJvdG90eXBlLFwibm9ybWFsaXplXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb252b2x2ZXIubm9ybWFsaXplfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY29udm9sdmVyLm5vcm1hbGl6ZT10fX0pLHQuQ29udm9sdmVyLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2J1ZmZlci5sb2FkKHQsZnVuY3Rpb24odCl7dGhpcy5idWZmZXI9dCxlJiZlKCl9LmJpbmQodGhpcykpfSx0LkNvbnZvbHZlci5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkVmZmVjdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX2J1ZmZlci5kaXNwb3NlKCksdGhpcy5fYnVmZmVyPW51bGwsdGhpcy5fY29udm9sdmVyLmRpc2Nvbm5lY3QoKSx0aGlzLl9jb252b2x2ZXI9bnVsbCx0aGlzfSx0LkNvbnZvbHZlcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg3KSxpKDUpLGkoMTMpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5Nb2R1bG89ZnVuY3Rpb24oZSl7dC5TaWduYWxCYXNlLmNhbGwodGhpcyksdGhpcy5jcmVhdGVJbnNPdXRzKDEsMCksdGhpcy5fc2hhcGVyPW5ldyB0LldhdmVTaGFwZXIoTWF0aC5wb3coMiwxNikpLHRoaXMuX211bHRpcGx5PW5ldyB0Lk11bHRpcGx5LHRoaXMuX3N1YnRyYWN0PXRoaXMub3V0cHV0PW5ldyB0LlN1YnRyYWN0LHRoaXMuX21vZFNpZ25hbD1uZXcgdC5TaWduYWwoZSksdGhpcy5pbnB1dC5mYW4odGhpcy5fc2hhcGVyLHRoaXMuX3N1YnRyYWN0KSx0aGlzLl9tb2RTaWduYWwuY29ubmVjdCh0aGlzLl9tdWx0aXBseSwwLDApLHRoaXMuX3NoYXBlci5jb25uZWN0KHRoaXMuX211bHRpcGx5LDAsMSksdGhpcy5fbXVsdGlwbHkuY29ubmVjdCh0aGlzLl9zdWJ0cmFjdCwwLDEpLHRoaXMuX3NldFdhdmVTaGFwZXIoZSl9LHQuZXh0ZW5kKHQuTW9kdWxvLHQuU2lnbmFsQmFzZSksdC5Nb2R1bG8ucHJvdG90eXBlLl9zZXRXYXZlU2hhcGVyPWZ1bmN0aW9uKHQpe3RoaXMuX3NoYXBlci5zZXRNYXAoZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguZmxvb3IoKGUrMWUtNCkvdCl9KX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuTW9kdWxvLnByb3RvdHlwZSxcInZhbHVlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb2RTaWduYWwudmFsdWV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9tb2RTaWduYWwudmFsdWU9dCx0aGlzLl9zZXRXYXZlU2hhcGVyKHQpfX0pLHQuTW9kdWxvLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU2lnbmFsQmFzZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3NoYXBlci5kaXNwb3NlKCksdGhpcy5fc2hhcGVyPW51bGwsdGhpcy5fbXVsdGlwbHkuZGlzcG9zZSgpLHRoaXMuX211bHRpcGx5PW51bGwsdGhpcy5fc3VidHJhY3QuZGlzcG9zZSgpLHRoaXMuX3N1YnRyYWN0PW51bGwsdGhpcy5fbW9kU2lnbmFsLmRpc3Bvc2UoKSx0aGlzLl9tb2RTaWduYWw9bnVsbCx0aGlzfSx0Lk1vZHVsb30uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxNiksaSgxMSksaSg2MiksaSg0MCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe3JldHVybiB0Lk9mZmxpbmU9ZnVuY3Rpb24oZSxpKXt2YXIgbj10LmNvbnRleHQuc2FtcGxlUmF0ZSxvPXQuY29udGV4dCxzPW5ldyB0Lk9mZmxpbmVDb250ZXh0KDIsaSxuKTt0LmNvbnRleHQ9czt2YXIgcj1lKHQuVHJhbnNwb3J0KSxhPW51bGw7cmV0dXJuIGE9ciYmdC5pc0Z1bmN0aW9uKHIudGhlbik/ci50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIHMucmVuZGVyKCl9KTpzLnJlbmRlcigpLHQuY29udGV4dD1vLGEudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQuQnVmZmVyKGUpfSl9LHQuT2ZmbGluZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxMSldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe3JldHVybiB0LkJ1ZmZlcnM9ZnVuY3Rpb24oZSl7dmFyIGk9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtpLnNoaWZ0KCk7dmFyIG49dC5kZWZhdWx0cyhpLFtcIm9ubG9hZFwiLFwiYmFzZVVybFwiXSx0LkJ1ZmZlcnMpO2Zvcih2YXIgbyBpbiB0LmNhbGwodGhpcyksdGhpcy5fYnVmZmVycz17fSx0aGlzLmJhc2VVcmw9bi5iYXNlVXJsLHRoaXMuX2xvYWRpbmdDb3VudD0wLGUpdGhpcy5fbG9hZGluZ0NvdW50KyssdGhpcy5hZGQobyxlW29dLHRoaXMuX2J1ZmZlckxvYWRlZC5iaW5kKHRoaXMsbi5vbmxvYWQpKX0sdC5leHRlbmQodC5CdWZmZXJzKSx0LkJ1ZmZlcnMuZGVmYXVsdHM9e29ubG9hZDp0Lm5vT3AsYmFzZVVybDpcIlwifSx0LkJ1ZmZlcnMucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYnVmZmVycy5oYXNPd25Qcm9wZXJ0eSh0KX0sdC5CdWZmZXJzLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7aWYodGhpcy5oYXModCkpcmV0dXJuIHRoaXMuX2J1ZmZlcnNbdF07dGhyb3cgbmV3IEVycm9yKFwiVG9uZS5CdWZmZXJzOiBubyBidWZmZXIgbmFtZWQgXCIrdCl9LHQuQnVmZmVycy5wcm90b3R5cGUuX2J1ZmZlckxvYWRlZD1mdW5jdGlvbih0KXt0aGlzLl9sb2FkaW5nQ291bnQtLSwwPT09dGhpcy5fbG9hZGluZ0NvdW50JiZ0JiZ0KHRoaXMpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5CdWZmZXJzLnByb3RvdHlwZSxcImxvYWRlZFwiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD0hMDtmb3IodmFyIGUgaW4gdGhpcy5fYnVmZmVycyl7dmFyIGk9dGhpcy5nZXQoZSk7dD10JiZpLmxvYWRlZH1yZXR1cm4gdH19KSx0LkJ1ZmZlcnMucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlLGksbil7cmV0dXJuIG49dC5kZWZhdWx0QXJnKG4sdC5ub09wKSxpIGluc3RhbmNlb2YgdC5CdWZmZXI/KHRoaXMuX2J1ZmZlcnNbZV09aSxuKHRoaXMpKTppIGluc3RhbmNlb2YgQXVkaW9CdWZmZXI/KHRoaXMuX2J1ZmZlcnNbZV09bmV3IHQuQnVmZmVyKGkpLG4odGhpcykpOnQuaXNTdHJpbmcoaSkmJih0aGlzLl9idWZmZXJzW2VdPW5ldyB0LkJ1ZmZlcih0aGlzLmJhc2VVcmwraSxuKSksdGhpc30sdC5CdWZmZXJzLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9idWZmZXJzKXRoaXMuX2J1ZmZlcnNbZV0uZGlzcG9zZSgpO3JldHVybiB0aGlzLl9idWZmZXJzPW51bGwsdGhpc30sdC5CdWZmZXJzfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuQ3RybFBhdHRlcm49ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJ2YWx1ZXNcIixcInR5cGVcIl0sdC5DdHJsUGF0dGVybik7dC5jYWxsKHRoaXMpLHRoaXMudmFsdWVzPWUudmFsdWVzLHRoaXMuaW5kZXg9MCx0aGlzLl90eXBlPW51bGwsdGhpcy5fc2h1ZmZsZWQ9bnVsbCx0aGlzLl9kaXJlY3Rpb249bnVsbCx0aGlzLnR5cGU9ZS50eXBlfSx0LmV4dGVuZCh0LkN0cmxQYXR0ZXJuKSx0LkN0cmxQYXR0ZXJuLlR5cGU9e1VwOlwidXBcIixEb3duOlwiZG93blwiLFVwRG93bjpcInVwRG93blwiLERvd25VcDpcImRvd25VcFwiLEFsdGVybmF0ZVVwOlwiYWx0ZXJuYXRlVXBcIixBbHRlcm5hdGVEb3duOlwiYWx0ZXJuYXRlRG93blwiLFJhbmRvbTpcInJhbmRvbVwiLFJhbmRvbVdhbGs6XCJyYW5kb21XYWxrXCIsUmFuZG9tT25jZTpcInJhbmRvbU9uY2VcIn0sdC5DdHJsUGF0dGVybi5kZWZhdWx0cz17dHlwZTp0LkN0cmxQYXR0ZXJuLlR5cGUuVXAsdmFsdWVzOltdfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5DdHJsUGF0dGVybi5wcm90b3R5cGUsXCJ2YWx1ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtpZigwIT09dGhpcy52YWx1ZXMubGVuZ3RoKXtpZigxPT09dGhpcy52YWx1ZXMubGVuZ3RoKXJldHVybiB0aGlzLnZhbHVlc1swXTt0aGlzLmluZGV4PU1hdGgubWluKHRoaXMuaW5kZXgsdGhpcy52YWx1ZXMubGVuZ3RoLTEpO3ZhciBlPXRoaXMudmFsdWVzW3RoaXMuaW5kZXhdO3JldHVybiB0aGlzLnR5cGU9PT10LkN0cmxQYXR0ZXJuLlR5cGUuUmFuZG9tT25jZSYmKHRoaXMudmFsdWVzLmxlbmd0aCE9PXRoaXMuX3NodWZmbGVkLmxlbmd0aCYmdGhpcy5fc2h1ZmZsZVZhbHVlcygpLGU9dGhpcy52YWx1ZXNbdGhpcy5fc2h1ZmZsZWRbdGhpcy5pbmRleF1dKSxlfX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5DdHJsUGF0dGVybi5wcm90b3R5cGUsXCJ0eXBlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90eXBlfSxzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5fdHlwZT1lLHRoaXMuX3NodWZmbGVkPW51bGwsdGhpcy5fdHlwZT09PXQuQ3RybFBhdHRlcm4uVHlwZS5VcHx8dGhpcy5fdHlwZT09PXQuQ3RybFBhdHRlcm4uVHlwZS5VcERvd258fHRoaXMuX3R5cGU9PT10LkN0cmxQYXR0ZXJuLlR5cGUuUmFuZG9tT25jZXx8dGhpcy5fdHlwZT09PXQuQ3RybFBhdHRlcm4uVHlwZS5BbHRlcm5hdGVVcD90aGlzLmluZGV4PTA6dGhpcy5fdHlwZSE9PXQuQ3RybFBhdHRlcm4uVHlwZS5Eb3duJiZ0aGlzLl90eXBlIT09dC5DdHJsUGF0dGVybi5UeXBlLkRvd25VcCYmdGhpcy5fdHlwZSE9PXQuQ3RybFBhdHRlcm4uVHlwZS5BbHRlcm5hdGVEb3dufHwodGhpcy5pbmRleD10aGlzLnZhbHVlcy5sZW5ndGgtMSksdGhpcy5fdHlwZT09PXQuQ3RybFBhdHRlcm4uVHlwZS5VcERvd258fHRoaXMuX3R5cGU9PT10LkN0cmxQYXR0ZXJuLlR5cGUuQWx0ZXJuYXRlVXA/dGhpcy5fZGlyZWN0aW9uPXQuQ3RybFBhdHRlcm4uVHlwZS5VcDp0aGlzLl90eXBlIT09dC5DdHJsUGF0dGVybi5UeXBlLkRvd25VcCYmdGhpcy5fdHlwZSE9PXQuQ3RybFBhdHRlcm4uVHlwZS5BbHRlcm5hdGVEb3dufHwodGhpcy5fZGlyZWN0aW9uPXQuQ3RybFBhdHRlcm4uVHlwZS5Eb3duKSx0aGlzLl90eXBlPT09dC5DdHJsUGF0dGVybi5UeXBlLlJhbmRvbU9uY2U/dGhpcy5fc2h1ZmZsZVZhbHVlcygpOnRoaXMuX3R5cGU9PT10LkN0cmxQYXR0ZXJuLlJhbmRvbSYmKHRoaXMuaW5kZXg9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMudmFsdWVzLmxlbmd0aCkpfX0pLHQuQ3RybFBhdHRlcm4ucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnR5cGU7cmV0dXJuIGU9PT10LkN0cmxQYXR0ZXJuLlR5cGUuVXA/KHRoaXMuaW5kZXgrKyx0aGlzLmluZGV4Pj10aGlzLnZhbHVlcy5sZW5ndGgmJih0aGlzLmluZGV4PTApKTplPT09dC5DdHJsUGF0dGVybi5UeXBlLkRvd24/KHRoaXMuaW5kZXgtLSx0aGlzLmluZGV4PDAmJih0aGlzLmluZGV4PXRoaXMudmFsdWVzLmxlbmd0aC0xKSk6ZT09PXQuQ3RybFBhdHRlcm4uVHlwZS5VcERvd258fGU9PT10LkN0cmxQYXR0ZXJuLlR5cGUuRG93blVwPyh0aGlzLl9kaXJlY3Rpb249PT10LkN0cmxQYXR0ZXJuLlR5cGUuVXA/dGhpcy5pbmRleCsrOnRoaXMuaW5kZXgtLSx0aGlzLmluZGV4PDA/KHRoaXMuaW5kZXg9MSx0aGlzLl9kaXJlY3Rpb249dC5DdHJsUGF0dGVybi5UeXBlLlVwKTp0aGlzLmluZGV4Pj10aGlzLnZhbHVlcy5sZW5ndGgmJih0aGlzLmluZGV4PXRoaXMudmFsdWVzLmxlbmd0aC0yLHRoaXMuX2RpcmVjdGlvbj10LkN0cmxQYXR0ZXJuLlR5cGUuRG93bikpOmU9PT10LkN0cmxQYXR0ZXJuLlR5cGUuUmFuZG9tP3RoaXMuaW5kZXg9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMudmFsdWVzLmxlbmd0aCk6ZT09PXQuQ3RybFBhdHRlcm4uVHlwZS5SYW5kb21XYWxrP01hdGgucmFuZG9tKCk8LjU/KHRoaXMuaW5kZXgtLSx0aGlzLmluZGV4PU1hdGgubWF4KHRoaXMuaW5kZXgsMCkpOih0aGlzLmluZGV4KyssdGhpcy5pbmRleD1NYXRoLm1pbih0aGlzLmluZGV4LHRoaXMudmFsdWVzLmxlbmd0aC0xKSk6ZT09PXQuQ3RybFBhdHRlcm4uVHlwZS5SYW5kb21PbmNlPyh0aGlzLmluZGV4KyssdGhpcy5pbmRleD49dGhpcy52YWx1ZXMubGVuZ3RoJiYodGhpcy5pbmRleD0wLHRoaXMuX3NodWZmbGVWYWx1ZXMoKSkpOmU9PT10LkN0cmxQYXR0ZXJuLlR5cGUuQWx0ZXJuYXRlVXA/KHRoaXMuX2RpcmVjdGlvbj09PXQuQ3RybFBhdHRlcm4uVHlwZS5VcD8odGhpcy5pbmRleCs9Mix0aGlzLl9kaXJlY3Rpb249dC5DdHJsUGF0dGVybi5UeXBlLkRvd24pOih0aGlzLmluZGV4LT0xLHRoaXMuX2RpcmVjdGlvbj10LkN0cmxQYXR0ZXJuLlR5cGUuVXApLHRoaXMuaW5kZXg+PXRoaXMudmFsdWVzLmxlbmd0aCYmKHRoaXMuaW5kZXg9MCx0aGlzLl9kaXJlY3Rpb249dC5DdHJsUGF0dGVybi5UeXBlLlVwKSk6ZT09PXQuQ3RybFBhdHRlcm4uVHlwZS5BbHRlcm5hdGVEb3duJiYodGhpcy5fZGlyZWN0aW9uPT09dC5DdHJsUGF0dGVybi5UeXBlLlVwPyh0aGlzLmluZGV4Kz0xLHRoaXMuX2RpcmVjdGlvbj10LkN0cmxQYXR0ZXJuLlR5cGUuRG93bik6KHRoaXMuaW5kZXgtPTIsdGhpcy5fZGlyZWN0aW9uPXQuQ3RybFBhdHRlcm4uVHlwZS5VcCksdGhpcy5pbmRleDwwJiYodGhpcy5pbmRleD10aGlzLnZhbHVlcy5sZW5ndGgtMSx0aGlzLl9kaXJlY3Rpb249dC5DdHJsUGF0dGVybi5UeXBlLkRvd24pKSx0aGlzLnZhbHVlfSx0LkN0cmxQYXR0ZXJuLnByb3RvdHlwZS5fc2h1ZmZsZVZhbHVlcz1mdW5jdGlvbigpe3ZhciB0PVtdO3RoaXMuX3NodWZmbGVkPVtdO2Zvcih2YXIgZT0wO2U8dGhpcy52YWx1ZXMubGVuZ3RoO2UrKyl0W2VdPWU7Zm9yKDt0Lmxlbmd0aD4wOyl7dmFyIGk9dC5zcGxpY2UoTWF0aC5mbG9vcih0Lmxlbmd0aCpNYXRoLnJhbmRvbSgpKSwxKTt0aGlzLl9zaHVmZmxlZC5wdXNoKGlbMF0pfX0sdC5DdHJsUGF0dGVybi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuX3NodWZmbGVkPW51bGwsdGhpcy52YWx1ZXM9bnVsbH0sdC5DdHJsUGF0dGVybn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe3Quc3VwcG9ydGVkJiYoQXVkaW9CdWZmZXIucHJvdG90eXBlLmNvcHlUb0NoYW5uZWx8fChBdWRpb0J1ZmZlci5wcm90b3R5cGUuY29weVRvQ2hhbm5lbD1mdW5jdGlvbih0LGUsaSl7dmFyIG49dGhpcy5nZXRDaGFubmVsRGF0YShlKTtpPWl8fDA7Zm9yKHZhciBvPTA7bzxuLmxlbmd0aDtvKyspbltvK2ldPXRbb119LEF1ZGlvQnVmZmVyLnByb3RvdHlwZS5jb3B5RnJvbUNoYW5uZWw9ZnVuY3Rpb24odCxlLGkpe3ZhciBuPXRoaXMuZ2V0Q2hhbm5lbERhdGEoZSk7aT1pfHwwO2Zvcih2YXIgbz0wO288dC5sZW5ndGg7bysrKXRbb109bltvK2ldfSkpfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDExKSxpKDYpLGkoMyksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuT3NjaWxsYXRvck5vZGU9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJmcmVxdWVuY3lcIixcInR5cGVcIl0sdC5Pc2NpbGxhdG9yTm9kZSk7dC5BdWRpb05vZGUuY2FsbCh0aGlzLGUpLHRoaXMub25lbmRlZD1lLm9uZW5kZWQsdGhpcy5fc3RhcnRUaW1lPS0xLHRoaXMuX3N0b3BUaW1lPS0xLHRoaXMuX2dhaW5Ob2RlPXRoaXMub3V0cHV0PW5ldyB0LkdhaW4oMCksdGhpcy5fb3NjaWxsYXRvcj10aGlzLmNvbnRleHQuY3JlYXRlT3NjaWxsYXRvcigpLHRoaXMuX29zY2lsbGF0b3IuY29ubmVjdCh0aGlzLl9nYWluTm9kZSksdGhpcy50eXBlPWUudHlwZSx0aGlzLmZyZXF1ZW5jeT1uZXcgdC5QYXJhbSh7cGFyYW06dGhpcy5fb3NjaWxsYXRvci5mcmVxdWVuY3ksdW5pdHM6dC5UeXBlLkZyZXF1ZW5jeSx2YWx1ZTplLmZyZXF1ZW5jeX0pLHRoaXMuZGV0dW5lPW5ldyB0LlBhcmFtKHtwYXJhbTp0aGlzLl9vc2NpbGxhdG9yLmRldHVuZSx1bml0czp0LlR5cGUuQ2VudHMsdmFsdWU6ZS5kZXR1bmV9KSx0aGlzLl9nYWluPTF9LHQuZXh0ZW5kKHQuT3NjaWxsYXRvck5vZGUsdC5BdWRpb05vZGUpLHQuT3NjaWxsYXRvck5vZGUuZGVmYXVsdHM9e2ZyZXF1ZW5jeTo0NDAsZGV0dW5lOjAsdHlwZTpcInNpbmVcIixvbmVuZGVkOnQubm9PcH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuT3NjaWxsYXRvck5vZGUucHJvdG90eXBlLFwic3RhdGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0U3RhdGVBdFRpbWUodGhpcy5ub3coKSl9fSksdC5Pc2NpbGxhdG9yTm9kZS5wcm90b3R5cGUuZ2V0U3RhdGVBdFRpbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dGhpcy50b1NlY29uZHMoZSksLTEhPT10aGlzLl9zdGFydFRpbWUmJmU+PXRoaXMuX3N0YXJ0VGltZSYmKC0xPT09dGhpcy5fc3RvcFRpbWV8fGU8PXRoaXMuX3N0b3BUaW1lKT90LlN0YXRlLlN0YXJ0ZWQ6dC5TdGF0ZS5TdG9wcGVkfSx0Lk9zY2lsbGF0b3JOb2RlLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbih0KXtpZih0aGlzLmxvZyhcInN0YXJ0XCIsdCksLTEhPT10aGlzLl9zdGFydFRpbWUpdGhyb3cgbmV3IEVycm9yKFwiY2Fubm90IGNhbGwgT3NjaWxsYXRvck5vZGUuc3RhcnQgbW9yZSB0aGFuIG9uY2VcIik7cmV0dXJuIHRoaXMuX3N0YXJ0VGltZT10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl9vc2NpbGxhdG9yLnN0YXJ0KHRoaXMuX3N0YXJ0VGltZSksdGhpcy5fZ2Fpbk5vZGUuZ2Fpbi5zZXRWYWx1ZUF0VGltZSgxLHRoaXMuX3N0YXJ0VGltZSksdGhpc30sdC5Pc2NpbGxhdG9yTm9kZS5wcm90b3R5cGUuc2V0UGVyaW9kaWNXYXZlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9vc2NpbGxhdG9yLnNldFBlcmlvZGljV2F2ZSh0KSx0aGlzfSx0Lk9zY2lsbGF0b3JOb2RlLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxvZyhcInN0b3BcIix0KSx0aGlzLmFzc2VydCgtMSE9PXRoaXMuX3N0YXJ0VGltZSxcIidzdGFydCcgbXVzdCBiZSBjYWxsZWQgYmVmb3JlICdzdG9wJ1wiKSx0aGlzLmNhbmNlbFN0b3AoKSx0aGlzLl9zdG9wVGltZT10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl9zdG9wVGltZT50aGlzLl9zdGFydFRpbWU/KHRoaXMuX2dhaW5Ob2RlLmdhaW4uc2V0VmFsdWVBdFRpbWUoMCx0aGlzLl9zdG9wVGltZSksdGhpcy5jb250ZXh0LmNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KSx0aGlzLl90aW1lb3V0PXRoaXMuY29udGV4dC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5fb3NjaWxsYXRvci5zdG9wKHRoaXMubm93KCkpLHRoaXMub25lbmRlZCgpfS5iaW5kKHRoaXMpLHRoaXMuX3N0b3BUaW1lLXRoaXMuY29udGV4dC5jdXJyZW50VGltZSkpOnRoaXMuX2dhaW5Ob2RlLmdhaW4uY2FuY2VsU2NoZWR1bGVkVmFsdWVzKHRoaXMuX3N0YXJ0VGltZSksdGhpc30sdC5Pc2NpbGxhdG9yTm9kZS5wcm90b3R5cGUuY2FuY2VsU3RvcD1mdW5jdGlvbigpe3JldHVybi0xIT09dGhpcy5fc3RhcnRUaW1lJiYodGhpcy5fZ2Fpbk5vZGUuZ2Fpbi5jYW5jZWxTY2hlZHVsZWRWYWx1ZXModGhpcy5fc3RhcnRUaW1lK3RoaXMuc2FtcGxlVGltZSksdGhpcy5jb250ZXh0LmNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KSx0aGlzLl9zdG9wVGltZT0tMSksdGhpc30sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuT3NjaWxsYXRvck5vZGUucHJvdG90eXBlLFwidHlwZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3NjaWxsYXRvci50eXBlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fb3NjaWxsYXRvci50eXBlPXR9fSksdC5Pc2NpbGxhdG9yTm9kZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRleHQuY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpLHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5vbmVuZGVkPW51bGwsdGhpcy5fb3NjaWxsYXRvci5kaXNjb25uZWN0KCksdGhpcy5fb3NjaWxsYXRvcj1udWxsLHRoaXMuX2dhaW5Ob2RlLmRpc3Bvc2UoKSx0aGlzLl9nYWluTm9kZT1udWxsLHRoaXMuZnJlcXVlbmN5LmRpc3Bvc2UoKSx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXMuZGV0dW5lLmRpc3Bvc2UoKSx0aGlzLmRldHVuZT1udWxsLHRoaXN9LHQuT3NjaWxsYXRvck5vZGV9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNTUpLGkoNTQpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtyZXR1cm4gdC5UcmFuc3BvcnRSZXBlYXRFdmVudD1mdW5jdGlvbihlLGkpe3QuVHJhbnNwb3J0RXZlbnQuY2FsbCh0aGlzLGUsaSksaT10LmRlZmF1bHRBcmcoaSx0LlRyYW5zcG9ydFJlcGVhdEV2ZW50LmRlZmF1bHRzKSx0aGlzLmR1cmF0aW9uPXQuVGlja3MoaS5kdXJhdGlvbiksdGhpcy5faW50ZXJ2YWw9dC5UaWNrcyhpLmludGVydmFsKSx0aGlzLl9jdXJyZW50SWQ9LTEsdGhpcy5fbmV4dElkPS0xLHRoaXMuX25leHRUaWNrPXRoaXMudGltZSx0aGlzLl9ib3VuZFJlc3RhcnQ9dGhpcy5fcmVzdGFydC5iaW5kKHRoaXMpLHRoaXMuVHJhbnNwb3J0Lm9uKFwic3RhcnQgbG9vcFN0YXJ0XCIsdGhpcy5fYm91bmRSZXN0YXJ0KSx0aGlzLl9yZXN0YXJ0KCl9LHQuZXh0ZW5kKHQuVHJhbnNwb3J0UmVwZWF0RXZlbnQsdC5UcmFuc3BvcnRFdmVudCksdC5UcmFuc3BvcnRSZXBlYXRFdmVudC5kZWZhdWx0cz17ZHVyYXRpb246MS8wLGludGVydmFsOjF9LHQuVHJhbnNwb3J0UmVwZWF0RXZlbnQucHJvdG90eXBlLmludm9rZT1mdW5jdGlvbihlKXt0aGlzLl9jcmVhdGVFdmVudHMoZSksdC5UcmFuc3BvcnRFdmVudC5wcm90b3R5cGUuaW52b2tlLmNhbGwodGhpcyxlKX0sdC5UcmFuc3BvcnRSZXBlYXRFdmVudC5wcm90b3R5cGUuX2NyZWF0ZUV2ZW50cz1mdW5jdGlvbihlKXt2YXIgaT10aGlzLlRyYW5zcG9ydC5nZXRUaWNrc0F0VGltZShlKTtpPj10aGlzLnRpbWUmJmk+PXRoaXMuX25leHRUaWNrJiZ0aGlzLl9uZXh0VGljayt0aGlzLl9pbnRlcnZhbDx0aGlzLnRpbWUrdGhpcy5kdXJhdGlvbiYmKHRoaXMuX25leHRUaWNrKz10aGlzLl9pbnRlcnZhbCx0aGlzLl9jdXJyZW50SWQ9dGhpcy5fbmV4dElkLHRoaXMuX25leHRJZD10aGlzLlRyYW5zcG9ydC5zY2hlZHVsZU9uY2UodGhpcy5pbnZva2UuYmluZCh0aGlzKSx0LlRpY2tzKHRoaXMuX25leHRUaWNrKSkpfSx0LlRyYW5zcG9ydFJlcGVhdEV2ZW50LnByb3RvdHlwZS5fcmVzdGFydD1mdW5jdGlvbihlKXt0aGlzLlRyYW5zcG9ydC5jbGVhcih0aGlzLl9jdXJyZW50SWQpLHRoaXMuVHJhbnNwb3J0LmNsZWFyKHRoaXMuX25leHRJZCksdGhpcy5fbmV4dFRpY2s9dGhpcy50aW1lO3ZhciBpPXRoaXMuVHJhbnNwb3J0LmdldFRpY2tzQXRUaW1lKGUpO2k+dGhpcy50aW1lJiYodGhpcy5fbmV4dFRpY2s9dGhpcy50aW1lK01hdGguY2VpbCgoaS10aGlzLnRpbWUpL3RoaXMuX2ludGVydmFsKSp0aGlzLl9pbnRlcnZhbCksdGhpcy5fY3VycmVudElkPXRoaXMuVHJhbnNwb3J0LnNjaGVkdWxlT25jZSh0aGlzLmludm9rZS5iaW5kKHRoaXMpLHQuVGlja3ModGhpcy5fbmV4dFRpY2spKSx0aGlzLl9uZXh0VGljays9dGhpcy5faW50ZXJ2YWwsdGhpcy5fbmV4dElkPXRoaXMuVHJhbnNwb3J0LnNjaGVkdWxlT25jZSh0aGlzLmludm9rZS5iaW5kKHRoaXMpLHQuVGlja3ModGhpcy5fbmV4dFRpY2spKX0sdC5UcmFuc3BvcnRSZXBlYXRFdmVudC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlRyYW5zcG9ydC5jbGVhcih0aGlzLl9jdXJyZW50SWQpLHRoaXMuVHJhbnNwb3J0LmNsZWFyKHRoaXMuX25leHRJZCksdGhpcy5UcmFuc3BvcnQub2ZmKFwic3RhcnQgbG9vcFN0YXJ0XCIsdGhpcy5fYm91bmRSZXN0YXJ0KSx0aGlzLl9ib3VuZENyZWF0ZUV2ZW50cz1udWxsLHQuVHJhbnNwb3J0RXZlbnQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLmR1cmF0aW9uPW51bGwsdGhpcy5faW50ZXJ2YWw9bnVsbCx0aGlzfSx0LlRyYW5zcG9ydFJlcGVhdEV2ZW50fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDQpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjt0LkludGVydmFsVGltZWxpbmU9ZnVuY3Rpb24oKXt0LmNhbGwodGhpcyksdGhpcy5fcm9vdD1udWxsLHRoaXMuX2xlbmd0aD0wfSx0LmV4dGVuZCh0LkludGVydmFsVGltZWxpbmUpLHQuSW50ZXJ2YWxUaW1lbGluZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGkpe2lmKHQuaXNVbmRlZihpLnRpbWUpfHx0LmlzVW5kZWYoaS5kdXJhdGlvbikpdGhyb3cgbmV3IEVycm9yKFwiVG9uZS5JbnRlcnZhbFRpbWVsaW5lOiBldmVudHMgbXVzdCBoYXZlIHRpbWUgYW5kIGR1cmF0aW9uIHBhcmFtZXRlcnNcIik7aS50aW1lPWkudGltZS52YWx1ZU9mKCk7dmFyIG49bmV3IGUoaS50aW1lLGkudGltZStpLmR1cmF0aW9uLGkpO2ZvcihudWxsPT09dGhpcy5fcm9vdD90aGlzLl9yb290PW46dGhpcy5fcm9vdC5pbnNlcnQobiksdGhpcy5fbGVuZ3RoKys7bnVsbCE9PW47KW4udXBkYXRlSGVpZ2h0KCksbi51cGRhdGVNYXgoKSx0aGlzLl9yZWJhbGFuY2Uobiksbj1uLnBhcmVudDtyZXR1cm4gdGhpc30sdC5JbnRlcnZhbFRpbWVsaW5lLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7aWYobnVsbCE9PXRoaXMuX3Jvb3Qpe3ZhciBlPVtdO3RoaXMuX3Jvb3Quc2VhcmNoKHQudGltZSxlKTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG49ZVtpXTtpZihuLmV2ZW50PT09dCl7dGhpcy5fcmVtb3ZlTm9kZShuKSx0aGlzLl9sZW5ndGgtLTticmVha319fXJldHVybiB0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5JbnRlcnZhbFRpbWVsaW5lLnByb3RvdHlwZSxcImxlbmd0aFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGVuZ3RofX0pLHQuSW50ZXJ2YWxUaW1lbGluZS5wcm90b3R5cGUuY2FuY2VsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZvckVhY2hGcm9tKHQsZnVuY3Rpb24odCl7dGhpcy5yZW1vdmUodCl9LmJpbmQodGhpcykpLHRoaXN9LHQuSW50ZXJ2YWxUaW1lbGluZS5wcm90b3R5cGUuX3NldFJvb3Q9ZnVuY3Rpb24odCl7dGhpcy5fcm9vdD10LG51bGwhPT10aGlzLl9yb290JiYodGhpcy5fcm9vdC5wYXJlbnQ9bnVsbCl9LHQuSW50ZXJ2YWxUaW1lbGluZS5wcm90b3R5cGUuX3JlcGxhY2VOb2RlSW5QYXJlbnQ9ZnVuY3Rpb24odCxlKXtudWxsIT09dC5wYXJlbnQ/KHQuaXNMZWZ0Q2hpbGQoKT90LnBhcmVudC5sZWZ0PWU6dC5wYXJlbnQucmlnaHQ9ZSx0aGlzLl9yZWJhbGFuY2UodC5wYXJlbnQpKTp0aGlzLl9zZXRSb290KGUpfSx0LkludGVydmFsVGltZWxpbmUucHJvdG90eXBlLl9yZW1vdmVOb2RlPWZ1bmN0aW9uKHQpe2lmKG51bGw9PT10LmxlZnQmJm51bGw9PT10LnJpZ2h0KXRoaXMuX3JlcGxhY2VOb2RlSW5QYXJlbnQodCxudWxsKTtlbHNlIGlmKG51bGw9PT10LnJpZ2h0KXRoaXMuX3JlcGxhY2VOb2RlSW5QYXJlbnQodCx0LmxlZnQpO2Vsc2UgaWYobnVsbD09PXQubGVmdCl0aGlzLl9yZXBsYWNlTm9kZUluUGFyZW50KHQsdC5yaWdodCk7ZWxzZXt2YXIgZSxpO2lmKHQuZ2V0QmFsYW5jZSgpPjApaWYobnVsbD09PXQubGVmdC5yaWdodCkoZT10LmxlZnQpLnJpZ2h0PXQucmlnaHQsaT1lO2Vsc2V7Zm9yKGU9dC5sZWZ0LnJpZ2h0O251bGwhPT1lLnJpZ2h0OyllPWUucmlnaHQ7ZS5wYXJlbnQucmlnaHQ9ZS5sZWZ0LGk9ZS5wYXJlbnQsZS5sZWZ0PXQubGVmdCxlLnJpZ2h0PXQucmlnaHR9ZWxzZSBpZihudWxsPT09dC5yaWdodC5sZWZ0KShlPXQucmlnaHQpLmxlZnQ9dC5sZWZ0LGk9ZTtlbHNle2ZvcihlPXQucmlnaHQubGVmdDtudWxsIT09ZS5sZWZ0OyllPWUubGVmdDtlLnBhcmVudD1lLnBhcmVudCxlLnBhcmVudC5sZWZ0PWUucmlnaHQsaT1lLnBhcmVudCxlLmxlZnQ9dC5sZWZ0LGUucmlnaHQ9dC5yaWdodH1udWxsIT09dC5wYXJlbnQ/dC5pc0xlZnRDaGlsZCgpP3QucGFyZW50LmxlZnQ9ZTp0LnBhcmVudC5yaWdodD1lOnRoaXMuX3NldFJvb3QoZSksdGhpcy5fcmViYWxhbmNlKGkpfXQuZGlzcG9zZSgpfSx0LkludGVydmFsVGltZWxpbmUucHJvdG90eXBlLl9yb3RhdGVMZWZ0PWZ1bmN0aW9uKHQpe3ZhciBlPXQucGFyZW50LGk9dC5pc0xlZnRDaGlsZCgpLG49dC5yaWdodDt0LnJpZ2h0PW4ubGVmdCxuLmxlZnQ9dCxudWxsIT09ZT9pP2UubGVmdD1uOmUucmlnaHQ9bjp0aGlzLl9zZXRSb290KG4pfSx0LkludGVydmFsVGltZWxpbmUucHJvdG90eXBlLl9yb3RhdGVSaWdodD1mdW5jdGlvbih0KXt2YXIgZT10LnBhcmVudCxpPXQuaXNMZWZ0Q2hpbGQoKSxuPXQubGVmdDt0LmxlZnQ9bi5yaWdodCxuLnJpZ2h0PXQsbnVsbCE9PWU/aT9lLmxlZnQ9bjplLnJpZ2h0PW46dGhpcy5fc2V0Um9vdChuKX0sdC5JbnRlcnZhbFRpbWVsaW5lLnByb3RvdHlwZS5fcmViYWxhbmNlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QmFsYW5jZSgpO2U+MT90LmxlZnQuZ2V0QmFsYW5jZSgpPDA/dGhpcy5fcm90YXRlTGVmdCh0LmxlZnQpOnRoaXMuX3JvdGF0ZVJpZ2h0KHQpOmU8LTEmJih0LnJpZ2h0LmdldEJhbGFuY2UoKT4wP3RoaXMuX3JvdGF0ZVJpZ2h0KHQucmlnaHQpOnRoaXMuX3JvdGF0ZUxlZnQodCkpfSx0LkludGVydmFsVGltZWxpbmUucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtpZihudWxsIT09dGhpcy5fcm9vdCl7dmFyIGU9W107aWYodGhpcy5fcm9vdC5zZWFyY2godCxlKSxlLmxlbmd0aD4wKXtmb3IodmFyIGk9ZVswXSxuPTE7bjxlLmxlbmd0aDtuKyspZVtuXS5sb3c+aS5sb3cmJihpPWVbbl0pO3JldHVybiBpLmV2ZW50fX1yZXR1cm4gbnVsbH0sdC5JbnRlcnZhbFRpbWVsaW5lLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQpe2lmKG51bGwhPT10aGlzLl9yb290KXt2YXIgZT1bXTt0aGlzLl9yb290LnRyYXZlcnNlKGZ1bmN0aW9uKHQpe2UucHVzaCh0KX0pO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbj1lW2ldLmV2ZW50O24mJnQobil9fXJldHVybiB0aGlzfSx0LkludGVydmFsVGltZWxpbmUucHJvdG90eXBlLmZvckVhY2hBdFRpbWU9ZnVuY3Rpb24odCxlKXtpZihudWxsIT09dGhpcy5fcm9vdCl7dmFyIGk9W107dGhpcy5fcm9vdC5zZWFyY2godCxpKTtmb3IodmFyIG49aS5sZW5ndGgtMTtuPj0wO24tLSl7dmFyIG89aVtuXS5ldmVudDtvJiZlKG8pfX1yZXR1cm4gdGhpc30sdC5JbnRlcnZhbFRpbWVsaW5lLnByb3RvdHlwZS5mb3JFYWNoRnJvbT1mdW5jdGlvbih0LGUpe2lmKG51bGwhPT10aGlzLl9yb290KXt2YXIgaT1bXTt0aGlzLl9yb290LnNlYXJjaEFmdGVyKHQsaSk7Zm9yKHZhciBuPWkubGVuZ3RoLTE7bj49MDtuLS0pe2UoaVtuXS5ldmVudCl9fXJldHVybiB0aGlzfSx0LkludGVydmFsVGltZWxpbmUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt2YXIgdD1bXTtudWxsIT09dGhpcy5fcm9vdCYmdGhpcy5fcm9vdC50cmF2ZXJzZShmdW5jdGlvbihlKXt0LnB1c2goZSl9KTtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdLmRpc3Bvc2UoKTtyZXR1cm4gdD1udWxsLHRoaXMuX3Jvb3Q9bnVsbCx0aGlzfTt2YXIgZT1mdW5jdGlvbih0LGUsaSl7dGhpcy5ldmVudD1pLHRoaXMubG93PXQsdGhpcy5oaWdoPWUsdGhpcy5tYXg9dGhpcy5oaWdoLHRoaXMuX2xlZnQ9bnVsbCx0aGlzLl9yaWdodD1udWxsLHRoaXMucGFyZW50PW51bGwsdGhpcy5oZWlnaHQ9MH07cmV0dXJuIGUucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0KXt0Lmxvdzw9dGhpcy5sb3c/bnVsbD09PXRoaXMubGVmdD90aGlzLmxlZnQ9dDp0aGlzLmxlZnQuaW5zZXJ0KHQpOm51bGw9PT10aGlzLnJpZ2h0P3RoaXMucmlnaHQ9dDp0aGlzLnJpZ2h0Lmluc2VydCh0KX0sZS5wcm90b3R5cGUuc2VhcmNoPWZ1bmN0aW9uKHQsZSl7dD50aGlzLm1heHx8KG51bGwhPT10aGlzLmxlZnQmJnRoaXMubGVmdC5zZWFyY2godCxlKSx0aGlzLmxvdzw9dCYmdGhpcy5oaWdoPnQmJmUucHVzaCh0aGlzKSx0aGlzLmxvdz50fHxudWxsIT09dGhpcy5yaWdodCYmdGhpcy5yaWdodC5zZWFyY2godCxlKSl9LGUucHJvdG90eXBlLnNlYXJjaEFmdGVyPWZ1bmN0aW9uKHQsZSl7dGhpcy5sb3c+PXQmJihlLnB1c2godGhpcyksbnVsbCE9PXRoaXMubGVmdCYmdGhpcy5sZWZ0LnNlYXJjaEFmdGVyKHQsZSkpLG51bGwhPT10aGlzLnJpZ2h0JiZ0aGlzLnJpZ2h0LnNlYXJjaEFmdGVyKHQsZSl9LGUucHJvdG90eXBlLnRyYXZlcnNlPWZ1bmN0aW9uKHQpe3QodGhpcyksbnVsbCE9PXRoaXMubGVmdCYmdGhpcy5sZWZ0LnRyYXZlcnNlKHQpLG51bGwhPT10aGlzLnJpZ2h0JiZ0aGlzLnJpZ2h0LnRyYXZlcnNlKHQpfSxlLnByb3RvdHlwZS51cGRhdGVIZWlnaHQ9ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5sZWZ0JiZudWxsIT09dGhpcy5yaWdodD90aGlzLmhlaWdodD1NYXRoLm1heCh0aGlzLmxlZnQuaGVpZ2h0LHRoaXMucmlnaHQuaGVpZ2h0KSsxOm51bGwhPT10aGlzLnJpZ2h0P3RoaXMuaGVpZ2h0PXRoaXMucmlnaHQuaGVpZ2h0KzE6bnVsbCE9PXRoaXMubGVmdD90aGlzLmhlaWdodD10aGlzLmxlZnQuaGVpZ2h0KzE6dGhpcy5oZWlnaHQ9MH0sZS5wcm90b3R5cGUudXBkYXRlTWF4PWZ1bmN0aW9uKCl7dGhpcy5tYXg9dGhpcy5oaWdoLG51bGwhPT10aGlzLmxlZnQmJih0aGlzLm1heD1NYXRoLm1heCh0aGlzLm1heCx0aGlzLmxlZnQubWF4KSksbnVsbCE9PXRoaXMucmlnaHQmJih0aGlzLm1heD1NYXRoLm1heCh0aGlzLm1heCx0aGlzLnJpZ2h0Lm1heCkpfSxlLnByb3RvdHlwZS5nZXRCYWxhbmNlPWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gbnVsbCE9PXRoaXMubGVmdCYmbnVsbCE9PXRoaXMucmlnaHQ/dD10aGlzLmxlZnQuaGVpZ2h0LXRoaXMucmlnaHQuaGVpZ2h0Om51bGwhPT10aGlzLmxlZnQ/dD10aGlzLmxlZnQuaGVpZ2h0KzE6bnVsbCE9PXRoaXMucmlnaHQmJih0PS0odGhpcy5yaWdodC5oZWlnaHQrMSkpLHR9LGUucHJvdG90eXBlLmlzTGVmdENoaWxkPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT10aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQubGVmdD09PXRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImxlZnRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xlZnR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9sZWZ0PXQsbnVsbCE9PXQmJih0LnBhcmVudD10aGlzKSx0aGlzLnVwZGF0ZUhlaWdodCgpLHRoaXMudXBkYXRlTWF4KCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwicmlnaHRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JpZ2h0fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fcmlnaHQ9dCxudWxsIT09dCYmKHQucGFyZW50PXRoaXMpLHRoaXMudXBkYXRlSGVpZ2h0KCksdGhpcy51cGRhdGVNYXgoKX19KSxlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5wYXJlbnQ9bnVsbCx0aGlzLl9sZWZ0PW51bGwsdGhpcy5fcmlnaHQ9bnVsbCx0aGlzLmV2ZW50PW51bGx9LHQuSW50ZXJ2YWxUaW1lbGluZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxpKXtpPXRoaXMudG9TZWNvbmRzKGkpLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBuPXRoaXMuX2V2ZW50cy5nZXQoaSksbz10aGlzLl9ldmVudHMucHJldmlvdXNFdmVudChuKSxzPXRoaXMuX2dldFRpY2tzVW50aWxFdmVudChvLGkpO3JldHVybiBuLnRpY2tzPU1hdGgubWF4KHMsMCksdGhpc319cmV0dXJuIHQuVGlja1NpZ25hbD1mdW5jdGlvbihlKXtlPXQuZGVmYXVsdEFyZyhlLDEpLHQuU2lnbmFsLmNhbGwodGhpcyx7dW5pdHM6dC5UeXBlLlRpY2tzLHZhbHVlOmV9KSx0aGlzLl9ldmVudHMubWVtb3J5PTEvMCx0aGlzLmNhbmNlbFNjaGVkdWxlZFZhbHVlcygwKSx0aGlzLl9ldmVudHMuYWRkKHt0eXBlOnQuUGFyYW0uQXV0b21hdGlvblR5cGUuU2V0VmFsdWUsdGltZTowLHZhbHVlOmV9KX0sdC5leHRlbmQodC5UaWNrU2lnbmFsLHQuU2lnbmFsKSx0LlRpY2tTaWduYWwucHJvdG90eXBlLnNldFZhbHVlQXRUaW1lPWUodC5TaWduYWwucHJvdG90eXBlLnNldFZhbHVlQXRUaW1lKSx0LlRpY2tTaWduYWwucHJvdG90eXBlLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lPWUodC5TaWduYWwucHJvdG90eXBlLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKSx0LlRpY2tTaWduYWwucHJvdG90eXBlLnNldFRhcmdldEF0VGltZT1mdW5jdGlvbih0LGUsaSl7ZT10aGlzLnRvU2Vjb25kcyhlKSx0aGlzLnNldFJhbXBQb2ludChlKSx0PXRoaXMuX2Zyb21Vbml0cyh0KTtmb3IodmFyIG49dGhpcy5fZXZlbnRzLmdldChlKSxvPU1hdGgucm91bmQoTWF0aC5tYXgoMS9pLDEpKSxzPTA7czw9bztzKyspe3ZhciByPWkqcytlLGE9dGhpcy5fZXhwb25lbnRpYWxBcHByb2FjaChuLnRpbWUsbi52YWx1ZSx0LGkscik7dGhpcy5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSh0aGlzLl90b1VuaXRzKGEpLHIpfXJldHVybiB0aGlzfSx0LlRpY2tTaWduYWwucHJvdG90eXBlLmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWU9ZnVuY3Rpb24odCxlKXtlPXRoaXMudG9TZWNvbmRzKGUpLHQ9dGhpcy5fZnJvbVVuaXRzKHQpO3ZhciBpPXRoaXMuX2V2ZW50cy5nZXQoZSk7bnVsbD09PWkmJihpPXt2YWx1ZTp0aGlzLl9pbml0aWFsVmFsdWUsdGltZTowfSk7Zm9yKHZhciBuPU1hdGgucm91bmQoTWF0aC5tYXgoMTAqKGUtaS50aW1lKSwxKSksbz0oZS1pLnRpbWUpL24scz0wO3M8PW47cysrKXt2YXIgcj1vKnMraS50aW1lLGE9dGhpcy5fZXhwb25lbnRpYWxJbnRlcnBvbGF0ZShpLnRpbWUsaS52YWx1ZSxlLHQscik7dGhpcy5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSh0aGlzLl90b1VuaXRzKGEpLHIpfXJldHVybiB0aGlzfSx0LlRpY2tTaWduYWwucHJvdG90eXBlLl9nZXRUaWNrc1VudGlsRXZlbnQ9ZnVuY3Rpb24oZSxpKXtpZihudWxsPT09ZSllPXt0aWNrczowLHRpbWU6MH07ZWxzZSBpZih0LmlzVW5kZWYoZS50aWNrcykpe3ZhciBuPXRoaXMuX2V2ZW50cy5wcmV2aW91c0V2ZW50KGUpO2UudGlja3M9dGhpcy5fZ2V0VGlja3NVbnRpbEV2ZW50KG4sZS50aW1lKX12YXIgbz10aGlzLmdldFZhbHVlQXRUaW1lKGUudGltZSkscz10aGlzLmdldFZhbHVlQXRUaW1lKGkpO3JldHVybiB0aGlzLl9ldmVudHMuZ2V0KGkpLnRpbWU9PT1pJiZ0aGlzLl9ldmVudHMuZ2V0KGkpLnR5cGU9PT10LlBhcmFtLkF1dG9tYXRpb25UeXBlLlNldFZhbHVlJiYocz10aGlzLmdldFZhbHVlQXRUaW1lKGktdGhpcy5zYW1wbGVUaW1lKSksLjUqKGktZS50aW1lKSoobytzKStlLnRpY2tzfSx0LlRpY2tTaWduYWwucHJvdG90eXBlLmdldFRpY2tzQXRUaW1lPWZ1bmN0aW9uKHQpe3Q9dGhpcy50b1NlY29uZHModCk7dmFyIGU9dGhpcy5fZXZlbnRzLmdldCh0KTtyZXR1cm4gTWF0aC5tYXgodGhpcy5fZ2V0VGlja3NVbnRpbEV2ZW50KGUsdCksMCl9LHQuVGlja1NpZ25hbC5wcm90b3R5cGUuZ2V0RHVyYXRpb25PZlRpY2tzPWZ1bmN0aW9uKHQsZSl7ZT10aGlzLnRvU2Vjb25kcyhlKTt2YXIgaT10aGlzLmdldFRpY2tzQXRUaW1lKGUpO3JldHVybiB0aGlzLmdldFRpbWVPZlRpY2soaSt0KS1lfSx0LlRpY2tTaWduYWwucHJvdG90eXBlLmdldFRpbWVPZlRpY2s9ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5fZXZlbnRzLmdldChlLFwidGlja3NcIiksbj10aGlzLl9ldmVudHMuZ2V0QWZ0ZXIoZSxcInRpY2tzXCIpO2lmKGkmJmkudGlja3M9PT1lKXJldHVybiBpLnRpbWU7aWYoaSYmbiYmbi50eXBlPT09dC5QYXJhbS5BdXRvbWF0aW9uVHlwZS5MaW5lYXImJmkudmFsdWUhPT1uLnZhbHVlKXt2YXIgbz10aGlzLmdldFZhbHVlQXRUaW1lKGkudGltZSkscz0odGhpcy5nZXRWYWx1ZUF0VGltZShuLnRpbWUpLW8pLyhuLnRpbWUtaS50aW1lKSxyPU1hdGguc3FydChNYXRoLnBvdyhvLDIpLTIqcyooaS50aWNrcy1lKSksYT0oLW8rcikvcztyZXR1cm4oYT4wP2E6KC1vLXIpL3MpK2kudGltZX1yZXR1cm4gaT8wPT09aS52YWx1ZT8xLzA6aS50aW1lKyhlLWkudGlja3MpL2kudmFsdWU6ZS90aGlzLl9pbml0aWFsVmFsdWV9LHQuVGlja1NpZ25hbC5wcm90b3R5cGUudGlja3NUb1RpbWU9ZnVuY3Rpb24oZSxpKXtyZXR1cm4gaT10aGlzLnRvU2Vjb25kcyhpKSxuZXcgdC5UaW1lKHRoaXMuZ2V0RHVyYXRpb25PZlRpY2tzKGUsaSkpfSx0LlRpY2tTaWduYWwucHJvdG90eXBlLnRpbWVUb1RpY2tzPWZ1bmN0aW9uKGUsaSl7aT10aGlzLnRvU2Vjb25kcyhpKSxlPXRoaXMudG9TZWNvbmRzKGUpO3ZhciBuPXRoaXMuZ2V0VGlja3NBdFRpbWUoaSksbz10aGlzLmdldFRpY2tzQXRUaW1lKGkrZSk7cmV0dXJuIG5ldyB0LlRpY2tzKG8tbil9LHQuVGlja1NpZ25hbH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg1NiksaSgzMyksaSgzNSksaSgyMCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkNsb2NrPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiY2FsbGJhY2tcIixcImZyZXF1ZW5jeVwiXSx0LkNsb2NrKTt0LkVtaXR0ZXIuY2FsbCh0aGlzKSx0aGlzLmNhbGxiYWNrPWUuY2FsbGJhY2ssdGhpcy5fbmV4dFRpY2s9MCx0aGlzLl90aWNrU291cmNlPW5ldyB0LlRpY2tTb3VyY2UoZS5mcmVxdWVuY3kpLHRoaXMuX2xhc3RVcGRhdGU9MCx0aGlzLmZyZXF1ZW5jeT10aGlzLl90aWNrU291cmNlLmZyZXF1ZW5jeSx0aGlzLl9yZWFkT25seShcImZyZXF1ZW5jeVwiKSx0aGlzLl9zdGF0ZT1uZXcgdC5UaW1lbGluZVN0YXRlKHQuU3RhdGUuU3RvcHBlZCksdGhpcy5fc3RhdGUuc2V0U3RhdGVBdFRpbWUodC5TdGF0ZS5TdG9wcGVkLDApLHRoaXMuX2JvdW5kTG9vcD10aGlzLl9sb29wLmJpbmQodGhpcyksdGhpcy5jb250ZXh0Lm9uKFwidGlja1wiLHRoaXMuX2JvdW5kTG9vcCl9LHQuZXh0ZW5kKHQuQ2xvY2ssdC5FbWl0dGVyKSx0LkNsb2NrLmRlZmF1bHRzPXtjYWxsYmFjazp0Lm5vT3AsZnJlcXVlbmN5OjF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkNsb2NrLnByb3RvdHlwZSxcInN0YXRlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZSh0aGlzLm5vdygpKX19KSx0LkNsb2NrLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbihlLGkpe3JldHVybiB0aGlzLmNvbnRleHQucmVzdW1lKCksZT10aGlzLnRvU2Vjb25kcyhlKSx0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZShlKSE9PXQuU3RhdGUuU3RhcnRlZCYmKHRoaXMuX3N0YXRlLnNldFN0YXRlQXRUaW1lKHQuU3RhdGUuU3RhcnRlZCxlKSx0aGlzLl90aWNrU291cmNlLnN0YXJ0KGUsaSksZTx0aGlzLl9sYXN0VXBkYXRlJiZ0aGlzLmVtaXQoXCJzdGFydFwiLGUsaSkpLHRoaXN9LHQuQ2xvY2sucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dGhpcy50b1NlY29uZHMoZSksdGhpcy5fc3RhdGUuY2FuY2VsKGUpLHRoaXMuX3N0YXRlLnNldFN0YXRlQXRUaW1lKHQuU3RhdGUuU3RvcHBlZCxlKSx0aGlzLl90aWNrU291cmNlLnN0b3AoZSksZTx0aGlzLl9sYXN0VXBkYXRlJiZ0aGlzLmVtaXQoXCJzdG9wXCIsZSksdGhpc30sdC5DbG9jay5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dGhpcy50b1NlY29uZHMoZSksdGhpcy5fc3RhdGUuZ2V0VmFsdWVBdFRpbWUoZSk9PT10LlN0YXRlLlN0YXJ0ZWQmJih0aGlzLl9zdGF0ZS5zZXRTdGF0ZUF0VGltZSh0LlN0YXRlLlBhdXNlZCxlKSx0aGlzLl90aWNrU291cmNlLnBhdXNlKGUpLGU8dGhpcy5fbGFzdFVwZGF0ZSYmdGhpcy5lbWl0KFwicGF1c2VcIixlKSksdGhpc30sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQ2xvY2sucHJvdG90eXBlLFwidGlja3NcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLmdldFRpY2tzQXRUaW1lKHRoaXMubm93KCkpKX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3RpY2tTb3VyY2UudGlja3M9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5DbG9jay5wcm90b3R5cGUsXCJzZWNvbmRzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90aWNrU291cmNlLnNlY29uZHN9LHNldDpmdW5jdGlvbih0KXt0aGlzLl90aWNrU291cmNlLnNlY29uZHM9dH19KSx0LkNsb2NrLnByb3RvdHlwZS5nZXRTZWNvbmRzQXRUaW1lPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl90aWNrU291cmNlLmdldFNlY29uZHNBdFRpbWUodCl9LHQuQ2xvY2sucHJvdG90eXBlLnNldFRpY2tzQXRUaW1lPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3RpY2tTb3VyY2Uuc2V0VGlja3NBdFRpbWUodCxlKSx0aGlzfSx0LkNsb2NrLnByb3RvdHlwZS5nZXRUaWNrc0F0VGltZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fdGlja1NvdXJjZS5nZXRUaWNrc0F0VGltZSh0KX0sdC5DbG9jay5wcm90b3R5cGUubmV4dFRpY2tUaW1lPWZ1bmN0aW9uKHQsZSl7ZT10aGlzLnRvU2Vjb25kcyhlKTt2YXIgaT10aGlzLmdldFRpY2tzQXRUaW1lKGUpO3JldHVybiB0aGlzLl90aWNrU291cmNlLmdldFRpbWVPZlRpY2soaSt0LGUpfSx0LkNsb2NrLnByb3RvdHlwZS5fbG9vcD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX2xhc3RVcGRhdGUsaT10aGlzLm5vdygpO3RoaXMuX2xhc3RVcGRhdGU9aSxlIT09aSYmKHRoaXMuX3N0YXRlLmZvckVhY2hCZXR3ZWVuKGUsaSxmdW5jdGlvbihlKXtzd2l0Y2goZS5zdGF0ZSl7Y2FzZSB0LlN0YXRlLlN0YXJ0ZWQ6dmFyIGk9dGhpcy5fdGlja1NvdXJjZS5nZXRUaWNrc0F0VGltZShlLnRpbWUpO3RoaXMuZW1pdChcInN0YXJ0XCIsZS50aW1lLGkpO2JyZWFrO2Nhc2UgdC5TdGF0ZS5TdG9wcGVkOjAhPT1lLnRpbWUmJnRoaXMuZW1pdChcInN0b3BcIixlLnRpbWUpO2JyZWFrO2Nhc2UgdC5TdGF0ZS5QYXVzZWQ6dGhpcy5lbWl0KFwicGF1c2VcIixlLnRpbWUpfX0uYmluZCh0aGlzKSksdGhpcy5fdGlja1NvdXJjZS5mb3JFYWNoVGlja0JldHdlZW4oZSxpLGZ1bmN0aW9uKHQsZSl7dGhpcy5jYWxsYmFjayh0LGUpfS5iaW5kKHRoaXMpKSl9LHQuQ2xvY2sucHJvdG90eXBlLmdldFN0YXRlQXRUaW1lPWZ1bmN0aW9uKHQpe3JldHVybiB0PXRoaXMudG9TZWNvbmRzKHQpLHRoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKHQpfSx0LkNsb2NrLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dC5FbWl0dGVyLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5jb250ZXh0Lm9mZihcInRpY2tcIix0aGlzLl9ib3VuZExvb3ApLHRoaXMuX3dyaXRhYmxlKFwiZnJlcXVlbmN5XCIpLHRoaXMuX3RpY2tTb3VyY2UuZGlzcG9zZSgpLHRoaXMuX3RpY2tTb3VyY2U9bnVsbCx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXMuX2JvdW5kTG9vcD1udWxsLHRoaXMuX25leHRUaWNrPTEvMCx0aGlzLmNhbGxiYWNrPW51bGwsdGhpcy5fc3RhdGUuZGlzcG9zZSgpLHRoaXMuX3N0YXRlPW51bGx9LHQuQ2xvY2t9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMSksaSg1KSxpKDcpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5HcmVhdGVyVGhhblplcm89ZnVuY3Rpb24oKXt0LlNpZ25hbEJhc2UuY2FsbCh0aGlzKSx0aGlzLl90aHJlc2g9dGhpcy5vdXRwdXQ9bmV3IHQuV2F2ZVNoYXBlcihmdW5jdGlvbih0KXtyZXR1cm4gdDw9MD8wOjF9LDEyNyksdGhpcy5fc2NhbGU9dGhpcy5pbnB1dD1uZXcgdC5NdWx0aXBseSgxZTQpLHRoaXMuX3NjYWxlLmNvbm5lY3QodGhpcy5fdGhyZXNoKX0sdC5leHRlbmQodC5HcmVhdGVyVGhhblplcm8sdC5TaWduYWxCYXNlKSx0LkdyZWF0ZXJUaGFuWmVyby5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LlNpZ25hbEJhc2UucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9zY2FsZS5kaXNwb3NlKCksdGhpcy5fc2NhbGU9bnVsbCx0aGlzLl90aHJlc2guZGlzcG9zZSgpLHRoaXMuX3RocmVzaD1udWxsLHRoaXN9LHQuR3JlYXRlclRoYW5aZXJvfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDg3KSxpKDEzKSxpKDEpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5HcmVhdGVyVGhhbj1mdW5jdGlvbihlKXt0LlNpZ25hbC5jYWxsKHRoaXMpLHRoaXMuY3JlYXRlSW5zT3V0cygyLDApLHRoaXMuX3BhcmFtPXRoaXMuaW5wdXRbMF09bmV3IHQuU3VidHJhY3QoZSksdGhpcy5pbnB1dFsxXT10aGlzLl9wYXJhbS5pbnB1dFsxXSx0aGlzLl9ndHo9dGhpcy5vdXRwdXQ9bmV3IHQuR3JlYXRlclRoYW5aZXJvLHRoaXMuX3BhcmFtLmNvbm5lY3QodGhpcy5fZ3R6KSx0aGlzLnByb3h5PSExfSx0LmV4dGVuZCh0LkdyZWF0ZXJUaGFuLHQuU2lnbmFsKSx0LkdyZWF0ZXJUaGFuLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU2lnbmFsLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fZ3R6LmRpc3Bvc2UoKSx0aGlzLl9ndHo9bnVsbCx0aGlzfSx0LkdyZWF0ZXJUaGFufS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDQ3KSxpKDI2KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuU2NhbGVkRW52ZWxvcGU9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJhdHRhY2tcIixcImRlY2F5XCIsXCJzdXN0YWluXCIsXCJyZWxlYXNlXCJdLHQuRW52ZWxvcGUpO3QuRW52ZWxvcGUuY2FsbCh0aGlzLGUpLGU9dC5kZWZhdWx0QXJnKGUsdC5TY2FsZWRFbnZlbG9wZS5kZWZhdWx0cyksdGhpcy5fZXhwPXRoaXMub3V0cHV0PW5ldyB0LlBvdyhlLmV4cG9uZW50KSx0aGlzLl9zY2FsZT10aGlzLm91dHB1dD1uZXcgdC5TY2FsZShlLm1pbixlLm1heCksdGhpcy5fc2lnLmNoYWluKHRoaXMuX2V4cCx0aGlzLl9zY2FsZSl9LHQuZXh0ZW5kKHQuU2NhbGVkRW52ZWxvcGUsdC5FbnZlbG9wZSksdC5TY2FsZWRFbnZlbG9wZS5kZWZhdWx0cz17bWluOjAsbWF4OjEsZXhwb25lbnQ6MX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuU2NhbGVkRW52ZWxvcGUucHJvdG90eXBlLFwibWluXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY2FsZS5taW59LHNldDpmdW5jdGlvbih0KXt0aGlzLl9zY2FsZS5taW49dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5TY2FsZWRFbnZlbG9wZS5wcm90b3R5cGUsXCJtYXhcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NjYWxlLm1heH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3NjYWxlLm1heD10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlNjYWxlZEVudmVsb3BlLnByb3RvdHlwZSxcImV4cG9uZW50XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9leHAudmFsdWV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9leHAudmFsdWU9dH19KSx0LlNjYWxlZEVudmVsb3BlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuRW52ZWxvcGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9zY2FsZS5kaXNwb3NlKCksdGhpcy5fc2NhbGU9bnVsbCx0aGlzLl9leHAuZGlzcG9zZSgpLHRoaXMuX2V4cD1udWxsLHRoaXN9LHQuU2NhbGVkRW52ZWxvcGV9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNyksaSgzNildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkFicz1mdW5jdGlvbigpe3QuU2lnbmFsQmFzZS5jYWxsKHRoaXMpLHRoaXMuX2Ficz10aGlzLmlucHV0PXRoaXMub3V0cHV0PW5ldyB0LldhdmVTaGFwZXIoZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguYWJzKHQpPC4wMDE/MDpNYXRoLmFicyh0KX0sMTAyNCl9LHQuZXh0ZW5kKHQuQWJzLHQuU2lnbmFsQmFzZSksdC5BYnMucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5TaWduYWxCYXNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fYWJzLmRpc3Bvc2UoKSx0aGlzLl9hYnM9bnVsbCx0aGlzfSx0LkFic30uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgzKSxpKDIpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtyZXR1cm4gdC5Tb2xvPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wic29sb1wiXSx0LlNvbG8pO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5pbnB1dD10aGlzLm91dHB1dD1uZXcgdC5HYWluLHRoaXMuX3NvbG9CaW5kPXRoaXMuX3NvbG9lZC5iaW5kKHRoaXMpLHRoaXMuY29udGV4dC5vbihcInNvbG9cIix0aGlzLl9zb2xvQmluZCksdGhpcy5zb2xvPWUuc29sb30sdC5leHRlbmQodC5Tb2xvLHQuQXVkaW9Ob2RlKSx0LlNvbG8uZGVmYXVsdHM9e3NvbG86ITF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlNvbG8ucHJvdG90eXBlLFwic29sb1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNTb2xvZWQoKX0sc2V0OmZ1bmN0aW9uKHQpe3Q/dGhpcy5fYWRkU29sbygpOnRoaXMuX3JlbW92ZVNvbG8oKSx0aGlzLmNvbnRleHQuZW1pdChcInNvbG9cIix0aGlzKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5Tb2xvLnByb3RvdHlwZSxcIm11dGVkXCIse2dldDpmdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5pbnB1dC5nYWluLnZhbHVlfX0pLHQuU29sby5wcm90b3R5cGUuX2FkZFNvbG89ZnVuY3Rpb24oKXt0LmlzQXJyYXkodGhpcy5jb250ZXh0Ll9jdXJyZW50U29sbyl8fCh0aGlzLmNvbnRleHQuX2N1cnJlbnRTb2xvPVtdKSx0aGlzLl9pc1NvbG9lZCgpfHx0aGlzLmNvbnRleHQuX2N1cnJlbnRTb2xvLnB1c2godGhpcyl9LHQuU29sby5wcm90b3R5cGUuX3JlbW92ZVNvbG89ZnVuY3Rpb24oKXtpZih0aGlzLl9pc1NvbG9lZCgpKXt2YXIgdD10aGlzLmNvbnRleHQuX2N1cnJlbnRTb2xvLmluZGV4T2YodGhpcyk7dGhpcy5jb250ZXh0Ll9jdXJyZW50U29sby5zcGxpY2UodCwxKX19LHQuU29sby5wcm90b3R5cGUuX2lzU29sb2VkPWZ1bmN0aW9uKCl7cmV0dXJuISF0LmlzQXJyYXkodGhpcy5jb250ZXh0Ll9jdXJyZW50U29sbykmJigwIT09dGhpcy5jb250ZXh0Ll9jdXJyZW50U29sby5sZW5ndGgmJi0xIT09dGhpcy5jb250ZXh0Ll9jdXJyZW50U29sby5pbmRleE9mKHRoaXMpKX0sdC5Tb2xvLnByb3RvdHlwZS5fbm9Tb2xvcz1mdW5jdGlvbigpe3JldHVybiF0LmlzQXJyYXkodGhpcy5jb250ZXh0Ll9jdXJyZW50U29sbyl8fDA9PT10aGlzLmNvbnRleHQuX2N1cnJlbnRTb2xvLmxlbmd0aH0sdC5Tb2xvLnByb3RvdHlwZS5fc29sb2VkPWZ1bmN0aW9uKCl7dGhpcy5faXNTb2xvZWQoKT90aGlzLmlucHV0LmdhaW4udmFsdWU9MTp0aGlzLl9ub1NvbG9zKCk/dGhpcy5pbnB1dC5nYWluLnZhbHVlPTE6dGhpcy5pbnB1dC5nYWluLnZhbHVlPTB9LHQuU29sby5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRleHQub2ZmKFwic29sb1wiLHRoaXMuX3NvbG9CaW5kKSx0aGlzLl9yZW1vdmVTb2xvKCksdGhpcy5fc29sb0JpbmQ9bnVsbCx0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXN9LHQuU29sb30uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg3KSxpKDEwKSxpKDI4KSxpKDE5KSxpKDMpLGkoMSksaSgyMCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe2lmKHQuc3VwcG9ydGVkJiYhdC5nbG9iYWwuQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVTdGVyZW9QYW5uZXIpe3ZhciBlPWZ1bmN0aW9uKGUpe3RoaXMuY29udGV4dD1lLHRoaXMucGFuPW5ldyB0LlNpZ25hbCgwLHQuVHlwZS5BdWRpb1JhbmdlKTt2YXIgaT1uZXcgdC5XYXZlU2hhcGVyKGZ1bmN0aW9uKGUpe3JldHVybiB0LmVxdWFsUG93ZXJTY2FsZSgoZSsxKS8yKX0sNDA5Niksbj1uZXcgdC5XYXZlU2hhcGVyKGZ1bmN0aW9uKGUpe3JldHVybiB0LmVxdWFsUG93ZXJTY2FsZSgxLShlKzEpLzIpfSw0MDk2KSxvPW5ldyB0LkdhaW4scz1uZXcgdC5HYWluLHI9dGhpcy5pbnB1dD1uZXcgdC5TcGxpdDtyLl9zcGxpdHRlci5jaGFubmVsQ291bnRNb2RlPVwiZXhwbGljaXRcIiwobmV3IHQuWmVybykuZmFuKGksbik7dmFyIGE9dGhpcy5vdXRwdXQ9bmV3IHQuTWVyZ2U7ci5sZWZ0LmNoYWluKG8sYS5sZWZ0KSxyLnJpZ2h0LmNoYWluKHMsYS5yaWdodCksdGhpcy5wYW4uY2hhaW4obixvLmdhaW4pLHRoaXMucGFuLmNoYWluKGkscy5nYWluKX07ZS5wcm90b3R5cGUuZGlzY29ubmVjdD1mdW5jdGlvbigpe3RoaXMub3V0cHV0LmRpc2Nvbm5lY3QuYXBwbHkodGhpcy5vdXRwdXQsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuY29ubmVjdD1mdW5jdGlvbigpe3RoaXMub3V0cHV0LmNvbm5lY3QuYXBwbHkodGhpcy5vdXRwdXQsYXJndW1lbnRzKX0sQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVTdGVyZW9QYW5uZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGUodGhpcyl9LHQuQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlU3RlcmVvUGFubmVyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBlKHRoaXMpfX19LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNyldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkVxdWFsUG93ZXJHYWluPWZ1bmN0aW9uKCl7dC5TaWduYWxCYXNlLmNhbGwodGhpcyksdGhpcy5fZXFQb3dlcj10aGlzLmlucHV0PXRoaXMub3V0cHV0PW5ldyB0LldhdmVTaGFwZXIoZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguYWJzKGUpPC4wMDE/MDp0LmVxdWFsUG93ZXJTY2FsZShlKX0uYmluZCh0aGlzKSw0MDk2KX0sdC5leHRlbmQodC5FcXVhbFBvd2VyR2Fpbix0LlNpZ25hbEJhc2UpLHQuRXF1YWxQb3dlckdhaW4ucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5TaWduYWxCYXNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fZXFQb3dlci5kaXNwb3NlKCksdGhpcy5fZXFQb3dlcj1udWxsLHRoaXN9LHQuRXF1YWxQb3dlckdhaW59LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNSksaSgxKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuTmVnYXRlPWZ1bmN0aW9uKCl7dC5TaWduYWxCYXNlLmNhbGwodGhpcyksdGhpcy5fbXVsdGlwbHk9dGhpcy5pbnB1dD10aGlzLm91dHB1dD1uZXcgdC5NdWx0aXBseSgtMSl9LHQuZXh0ZW5kKHQuTmVnYXRlLHQuU2lnbmFsQmFzZSksdC5OZWdhdGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5TaWduYWxCYXNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fbXVsdGlwbHkuZGlzcG9zZSgpLHRoaXMuX211bHRpcGx5PW51bGwsdGhpc30sdC5OZWdhdGV9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNjApLGkoMjcpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlBhblZvbD1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcInBhblwiLFwidm9sdW1lXCJdLHQuUGFuVm9sKTt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLHRoaXMuX3Bhbm5lcj10aGlzLmlucHV0PW5ldyB0LlBhbm5lcihlLnBhbiksdGhpcy5wYW49dGhpcy5fcGFubmVyLnBhbix0aGlzLl92b2x1bWU9dGhpcy5vdXRwdXQ9bmV3IHQuVm9sdW1lKGUudm9sdW1lKSx0aGlzLnZvbHVtZT10aGlzLl92b2x1bWUudm9sdW1lLHRoaXMuX3Bhbm5lci5jb25uZWN0KHRoaXMuX3ZvbHVtZSksdGhpcy5tdXRlPWUubXV0ZSx0aGlzLl9yZWFkT25seShbXCJwYW5cIixcInZvbHVtZVwiXSl9LHQuZXh0ZW5kKHQuUGFuVm9sLHQuQXVkaW9Ob2RlKSx0LlBhblZvbC5kZWZhdWx0cz17cGFuOjAsdm9sdW1lOjAsbXV0ZTohMX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGFuVm9sLnByb3RvdHlwZSxcIm11dGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZvbHVtZS5tdXRlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fdm9sdW1lLm11dGU9dH19KSx0LlBhblZvbC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcInBhblwiLFwidm9sdW1lXCJdKSx0aGlzLl9wYW5uZXIuZGlzcG9zZSgpLHRoaXMuX3Bhbm5lcj1udWxsLHRoaXMucGFuPW51bGwsdGhpcy5fdm9sdW1lLmRpc3Bvc2UoKSx0aGlzLl92b2x1bWU9bnVsbCx0aGlzLnZvbHVtZT1udWxsLHRoaXN9LHQuUGFuVm9sfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDM0KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7dC5zdXBwb3J0ZWQmJihBbmFseXNlck5vZGUucHJvdG90eXBlLmdldEZsb2F0VGltZURvbWFpbkRhdGF8fChBbmFseXNlck5vZGUucHJvdG90eXBlLmdldEZsb2F0VGltZURvbWFpbkRhdGE9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkodC5sZW5ndGgpO3RoaXMuZ2V0Qnl0ZVRpbWVEb21haW5EYXRhKGUpO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXRbaV09KGVbaV0tMTI4KS8xMjh9KSl9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMzQpLGkoNjMpLGkoMjApLGkoMyldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe2lmKHQuc3VwcG9ydGVkJiYhdC5nbG9iYWwuQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVDb25zdGFudFNvdXJjZSl7dmFyIGU9ZnVuY3Rpb24odCl7dGhpcy5jb250ZXh0PXQ7Zm9yKHZhciBlPXQuY3JlYXRlQnVmZmVyKDEsMTI4LHQuc2FtcGxlUmF0ZSksaT1lLmdldENoYW5uZWxEYXRhKDApLG49MDtuPGkubGVuZ3RoO24rKylpW25dPTE7dGhpcy5fYnVmZmVyU291cmNlPXQuY3JlYXRlQnVmZmVyU291cmNlKCksdGhpcy5fYnVmZmVyU291cmNlLmNoYW5uZWxDb3VudD0xLHRoaXMuX2J1ZmZlclNvdXJjZS5jaGFubmVsQ291bnRNb2RlPVwiZXhwbGljaXRcIix0aGlzLl9idWZmZXJTb3VyY2UuYnVmZmVyPWUsdGhpcy5fYnVmZmVyU291cmNlLmxvb3A9ITA7dmFyIG89dGhpcy5fb3V0cHV0PXQuY3JlYXRlR2FpbigpO3RoaXMub2Zmc2V0PW8uZ2Fpbix0aGlzLl9idWZmZXJTb3VyY2UuY29ubmVjdChvKX07ZS5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2J1ZmZlclNvdXJjZS5zdGFydCh0KSx0aGlzfSxlLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9idWZmZXJTb3VyY2Uuc3RvcCh0KSx0aGlzfSxlLnByb3RvdHlwZS5jb25uZWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX291dHB1dC5jb25uZWN0LmFwcGx5KHRoaXMuX291dHB1dCxhcmd1bWVudHMpLHRoaXN9LGUucHJvdG90eXBlLmRpc2Nvbm5lY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3V0cHV0LmRpc2Nvbm5lY3QuYXBwbHkodGhpcy5fb3V0cHV0LGFyZ3VtZW50cyksdGhpc30sQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVDb25zdGFudFNvdXJjZT1mdW5jdGlvbigpe3JldHVybiBuZXcgZSh0aGlzKX0sdC5Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVDb25zdGFudFNvdXJjZT1mdW5jdGlvbigpe3JldHVybiBuZXcgZSh0aGlzKX19fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDM0KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7aWYodC5zdXBwb3J0ZWQmJiF0Lmdsb2JhbC5BdWRpb0NvbnRleHQucHJvdG90eXBlLl9uYXRpdmVfY3JlYXRlV2F2ZVNoYXBlcil7dmFyIGU9bmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO2lmKGUuaW5jbHVkZXMoXCJzYWZhcmlcIikmJiFlLmluY2x1ZGVzKFwiY2hyb21lXCIpKXt2YXIgaT1mdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdGhpcy5faW50ZXJuYWxOb2RlPXRoaXMuaW5wdXQ9dGhpcy5vdXRwdXQ9dC5fbmF0aXZlX2NyZWF0ZVdhdmVTaGFwZXIoKSx0aGlzLl9jdXJ2ZT1udWxsLHRoaXMuX2ludGVybmFsTm9kZSl0aGlzLl9kZWZpbmVQcm9wZXJ0eSh0aGlzLl9pbnRlcm5hbE5vZGUsZSl9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShpLnByb3RvdHlwZSxcImN1cnZlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jdXJ2ZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2N1cnZlPXQ7dmFyIGU9bmV3IEZsb2F0MzJBcnJheSh0Lmxlbmd0aCsxKTtlLnNldCh0LDEpLGVbMF09dFswXSx0aGlzLl9pbnRlcm5hbE5vZGUuY3VydmU9ZX19KSxpLnByb3RvdHlwZS5fZGVmaW5lUHJvcGVydHk9ZnVuY3Rpb24oZSxpKXt0LmlzVW5kZWYodGhpc1tpXSkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGkse2dldDpmdW5jdGlvbigpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIGVbaV0/ZVtpXS5iaW5kKGUpOmVbaV19LHNldDpmdW5jdGlvbih0KXtlW2ldPXR9fSl9LHQuZ2xvYmFsLkF1ZGlvQ29udGV4dC5wcm90b3R5cGUuX25hdGl2ZV9jcmVhdGVXYXZlU2hhcGVyPXQuZ2xvYmFsLkF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlV2F2ZVNoYXBlcix0Lmdsb2JhbC5BdWRpb0NvbnRleHQucHJvdG90eXBlLmNyZWF0ZVdhdmVTaGFwZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGkodGhpcyl9fX19LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNDYpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtyZXR1cm4gdC5NaWRpPWZ1bmN0aW9uKGUsaSl7aWYoISh0aGlzIGluc3RhbmNlb2YgdC5NaWRpKSlyZXR1cm4gbmV3IHQuTWlkaShlLGkpO3QuRnJlcXVlbmN5LmNhbGwodGhpcyxlLGkpfSx0LmV4dGVuZCh0Lk1pZGksdC5GcmVxdWVuY3kpLHQuTWlkaS5wcm90b3R5cGUuX2RlZmF1bHRVbml0cz1cIm1pZGlcIix0Lk1pZGkucHJvdG90eXBlLl9mcmVxdWVuY3lUb1VuaXRzPWZ1bmN0aW9uKGUpe3JldHVybiB0LkZyZXF1ZW5jeS5mdG9tKHQuRnJlcXVlbmN5LnByb3RvdHlwZS5fZnJlcXVlbmN5VG9Vbml0cy5jYWxsKHRoaXMsZSkpfSx0Lk1pZGkucHJvdG90eXBlLl90aWNrc1RvVW5pdHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuRnJlcXVlbmN5LmZ0b20odC5GcmVxdWVuY3kucHJvdG90eXBlLl90aWNrc1RvVW5pdHMuY2FsbCh0aGlzLGUpKX0sdC5NaWRpLnByb3RvdHlwZS5fYmVhdHNUb1VuaXRzPWZ1bmN0aW9uKGUpe3JldHVybiB0LkZyZXF1ZW5jeS5mdG9tKHQuRnJlcXVlbmN5LnByb3RvdHlwZS5fYmVhdHNUb1VuaXRzLmNhbGwodGhpcyxlKSl9LHQuTWlkaS5wcm90b3R5cGUuX3NlY29uZHNUb1VuaXRzPWZ1bmN0aW9uKGUpe3JldHVybiB0LkZyZXF1ZW5jeS5mdG9tKHQuRnJlcXVlbmN5LnByb3RvdHlwZS5fc2Vjb25kc1RvVW5pdHMuY2FsbCh0aGlzLGUpKX0sdC5NaWRpLnByb3RvdHlwZS50b01pZGk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZU9mKCl9LHQuTWlkaS5wcm90b3R5cGUudG9GcmVxdWVuY3k9ZnVuY3Rpb24oKXtyZXR1cm4gdC5GcmVxdWVuY3kubXRvZih0aGlzLnRvTWlkaSgpKX0sdC5NaWRpLnByb3RvdHlwZS50cmFuc3Bvc2U9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMudG9NaWRpKCkrdCl9LHQuTWlkaX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgyNyksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuVXNlck1lZGlhPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1widm9sdW1lXCJdLHQuVXNlck1lZGlhKTt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLHRoaXMuX21lZGlhU3RyZWFtPW51bGwsdGhpcy5fc3RyZWFtPW51bGwsdGhpcy5fZGV2aWNlPW51bGwsdGhpcy5fdm9sdW1lPXRoaXMub3V0cHV0PW5ldyB0LlZvbHVtZShlLnZvbHVtZSksdGhpcy52b2x1bWU9dGhpcy5fdm9sdW1lLnZvbHVtZSx0aGlzLl9yZWFkT25seShcInZvbHVtZVwiKSx0aGlzLm11dGU9ZS5tdXRlfSx0LmV4dGVuZCh0LlVzZXJNZWRpYSx0LkF1ZGlvTm9kZSksdC5Vc2VyTWVkaWEuZGVmYXVsdHM9e3ZvbHVtZTowLG11dGU6ITF9LHQuVXNlck1lZGlhLnByb3RvdHlwZS5vcGVuPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnN0YXRlPT09dC5TdGF0ZS5TdGFydGVkJiZ0aGlzLmNsb3NlKCksdC5Vc2VyTWVkaWEuZW51bWVyYXRlRGV2aWNlcygpLnRoZW4oZnVuY3Rpb24oaSl7dmFyIG47aWYodC5pc051bWJlcihlKSluPWlbZV07ZWxzZSBpZighKG49aS5maW5kKGZ1bmN0aW9uKHQpe3JldHVybiB0LmxhYmVsPT09ZXx8dC5kZXZpY2VJZD09PWV9KSkmJmkubGVuZ3RoPjApbj1pWzBdO2Vsc2UgaWYoIW4mJnQuaXNEZWZpbmVkKGUpKXRocm93IG5ldyBFcnJvcihcIlRvbmUuVXNlck1lZGlhOiBubyBtYXRjaGluZyBkZXZpY2U6IFwiK2UpO3RoaXMuX2RldmljZT1uO3ZhciBvPXthdWRpbzp7ZWNob0NhbmNlbGxhdGlvbjohMSxzYW1wbGVSYXRlOnRoaXMuY29udGV4dC5zYW1wbGVSYXRlLG5vaXNlU3VwcHJlc3Npb246ITEsbW96Tm9pc2VTdXBwcmVzc2lvbjohMX19O3JldHVybiBuJiYoby5hdWRpby5kZXZpY2VJZD1uLmRldmljZUlkKSxuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShvKS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9zdHJlYW18fCh0aGlzLl9zdHJlYW09dCx0aGlzLl9tZWRpYVN0cmVhbT10aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFTdHJlYW1Tb3VyY2UodCksdGhpcy5fbWVkaWFTdHJlYW0uY29ubmVjdCh0aGlzLm91dHB1dCkpLHRoaXN9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX0sdC5Vc2VyTWVkaWEucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N0cmVhbSYmKHRoaXMuX3N0cmVhbS5nZXRBdWRpb1RyYWNrcygpLmZvckVhY2goZnVuY3Rpb24odCl7dC5zdG9wKCl9KSx0aGlzLl9zdHJlYW09bnVsbCx0aGlzLl9tZWRpYVN0cmVhbS5kaXNjb25uZWN0KCksdGhpcy5fbWVkaWFTdHJlYW09bnVsbCksdGhpcy5fZGV2aWNlPW51bGwsdGhpc30sdC5Vc2VyTWVkaWEuZW51bWVyYXRlRGV2aWNlcz1mdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiB0LmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm5cImF1ZGlvaW5wdXRcIj09PXQua2luZH0pfSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlVzZXJNZWRpYS5wcm90b3R5cGUsXCJzdGF0ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RyZWFtJiZ0aGlzLl9zdHJlYW0uYWN0aXZlP3QuU3RhdGUuU3RhcnRlZDp0LlN0YXRlLlN0b3BwZWR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuVXNlck1lZGlhLnByb3RvdHlwZSxcImRldmljZUlkXCIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMuX2RldmljZSlyZXR1cm4gdGhpcy5fZGV2aWNlLmRldmljZUlkfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlVzZXJNZWRpYS5wcm90b3R5cGUsXCJncm91cElkXCIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMuX2RldmljZSlyZXR1cm4gdGhpcy5fZGV2aWNlLmdyb3VwSWR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuVXNlck1lZGlhLnByb3RvdHlwZSxcImxhYmVsXCIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMuX2RldmljZSlyZXR1cm4gdGhpcy5fZGV2aWNlLmxhYmVsfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlVzZXJNZWRpYS5wcm90b3R5cGUsXCJtdXRlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl92b2x1bWUubXV0ZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3ZvbHVtZS5tdXRlPXR9fSksdC5Vc2VyTWVkaWEucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLmNsb3NlKCksdGhpcy5fd3JpdGFibGUoXCJ2b2x1bWVcIiksdGhpcy5fdm9sdW1lLmRpc3Bvc2UoKSx0aGlzLl92b2x1bWU9bnVsbCx0aGlzLnZvbHVtZT1udWxsLHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlVzZXJNZWRpYSxcInN1cHBvcnRlZFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5pc0RlZmluZWQobmF2aWdhdG9yLm1lZGlhRGV2aWNlcykmJnQuaXNGdW5jdGlvbihuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSl9fSksdC5Vc2VyTWVkaWF9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNjcpLGkoMjcpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlBsYXllcnM9ZnVuY3Rpb24oZSl7dmFyIGk9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtpLnNoaWZ0KCk7dmFyIG49dC5kZWZhdWx0cyhpLFtcIm9ubG9hZFwiXSx0LlBsYXllcnMpO2Zvcih2YXIgbyBpbiB0LkF1ZGlvTm9kZS5jYWxsKHRoaXMsbiksdGhpcy5fdm9sdW1lPXRoaXMub3V0cHV0PW5ldyB0LlZvbHVtZShuLnZvbHVtZSksdGhpcy52b2x1bWU9dGhpcy5fdm9sdW1lLnZvbHVtZSx0aGlzLl9yZWFkT25seShcInZvbHVtZVwiKSx0aGlzLl92b2x1bWUub3V0cHV0Lm91dHB1dC5jaGFubmVsQ291bnQ9Mix0aGlzLl92b2x1bWUub3V0cHV0Lm91dHB1dC5jaGFubmVsQ291bnRNb2RlPVwiZXhwbGljaXRcIix0aGlzLm11dGU9bi5tdXRlLHRoaXMuX3BsYXllcnM9e30sdGhpcy5fbG9hZGluZ0NvdW50PTAsdGhpcy5fZmFkZUluPW4uZmFkZUluLHRoaXMuX2ZhZGVPdXQ9bi5mYWRlT3V0LGUpdGhpcy5fbG9hZGluZ0NvdW50KyssdGhpcy5hZGQobyxlW29dLHRoaXMuX2J1ZmZlckxvYWRlZC5iaW5kKHRoaXMsbi5vbmxvYWQpKX0sdC5leHRlbmQodC5QbGF5ZXJzLHQuQXVkaW9Ob2RlKSx0LlBsYXllcnMuZGVmYXVsdHM9e3ZvbHVtZTowLG11dGU6ITEsb25sb2FkOnQubm9PcCxmYWRlSW46MCxmYWRlT3V0OjB9LHQuUGxheWVycy5wcm90b3R5cGUuX2J1ZmZlckxvYWRlZD1mdW5jdGlvbih0KXt0aGlzLl9sb2FkaW5nQ291bnQtLSwwPT09dGhpcy5fbG9hZGluZ0NvdW50JiZ0JiZ0KHRoaXMpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QbGF5ZXJzLnByb3RvdHlwZSxcIm11dGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZvbHVtZS5tdXRlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fdm9sdW1lLm11dGU9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QbGF5ZXJzLnByb3RvdHlwZSxcImZhZGVJblwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZmFkZUlufSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fZmFkZUluPXQsdGhpcy5fZm9yRWFjaChmdW5jdGlvbihlKXtlLmZhZGVJbj10fSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGxheWVycy5wcm90b3R5cGUsXCJmYWRlT3V0XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9mYWRlT3V0fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fZmFkZU91dD10LHRoaXMuX2ZvckVhY2goZnVuY3Rpb24oZSl7ZS5mYWRlT3V0PXR9KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QbGF5ZXJzLnByb3RvdHlwZSxcInN0YXRlXCIse2dldDpmdW5jdGlvbigpe3ZhciBlPSExO3JldHVybiB0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKGkpe2U9ZXx8aS5zdGF0ZT09PXQuU3RhdGUuU3RhcnRlZH0pLGU/dC5TdGF0ZS5TdGFydGVkOnQuU3RhdGUuU3RvcHBlZH19KSx0LlBsYXllcnMucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGxheWVycy5oYXNPd25Qcm9wZXJ0eSh0KX0sdC5QbGF5ZXJzLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7aWYodGhpcy5oYXModCkpcmV0dXJuIHRoaXMuX3BsYXllcnNbdF07dGhyb3cgbmV3IEVycm9yKFwiVG9uZS5QbGF5ZXJzOiBubyBwbGF5ZXIgbmFtZWQgXCIrdCl9LHQuUGxheWVycy5wcm90b3R5cGUuX2ZvckVhY2g9ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHRoaXMuX3BsYXllcnMpdCh0aGlzLl9wbGF5ZXJzW2VdLGUpO3JldHVybiB0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QbGF5ZXJzLnByb3RvdHlwZSxcImxvYWRlZFwiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD0hMDtyZXR1cm4gdGhpcy5fZm9yRWFjaChmdW5jdGlvbihlKXt0PXQmJmUubG9hZGVkfSksdH19KSx0LlBsYXllcnMucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlLGksbil7cmV0dXJuIHRoaXMuX3BsYXllcnNbZV09bmV3IHQuUGxheWVyKGksbikuY29ubmVjdCh0aGlzLm91dHB1dCksdGhpcy5fcGxheWVyc1tlXS5mYWRlSW49dGhpcy5fZmFkZUluLHRoaXMuX3BsYXllcnNbZV0uZmFkZU91dD10aGlzLl9mYWRlT3V0LHRoaXN9LHQuUGxheWVycy5wcm90b3R5cGUuc3RvcEFsbD1mdW5jdGlvbih0KXt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uuc3RvcCh0KX0pfSx0LlBsYXllcnMucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl92b2x1bWUuZGlzcG9zZSgpLHRoaXMuX3ZvbHVtZT1udWxsLHRoaXMuX3dyaXRhYmxlKFwidm9sdW1lXCIpLHRoaXMudm9sdW1lPW51bGwsdGhpcy5vdXRwdXQ9bnVsbCx0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuZGlzcG9zZSgpfSksdGhpcy5fcGxheWVycz1udWxsLHRoaXN9LHQuUGxheWVyc30uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg2KSxpKDExKSxpKDMxKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuR3JhaW5QbGF5ZXI9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJ1cmxcIixcIm9ubG9hZFwiXSx0LkdyYWluUGxheWVyKTt0LlNvdXJjZS5jYWxsKHRoaXMsZSksdGhpcy5idWZmZXI9bmV3IHQuQnVmZmVyKGUudXJsLGUub25sb2FkKSx0aGlzLl9jbG9jaz1uZXcgdC5DbG9jayh0aGlzLl90aWNrLmJpbmQodGhpcyksZS5ncmFpblNpemUpLHRoaXMuX2xvb3BTdGFydD0wLHRoaXMuX2xvb3BFbmQ9MCx0aGlzLl9hY3RpdmVTb3VyY2VzPVtdLHRoaXMuX3BsYXliYWNrUmF0ZT1lLnBsYXliYWNrUmF0ZSx0aGlzLl9ncmFpblNpemU9ZS5ncmFpblNpemUsdGhpcy5fb3ZlcmxhcD1lLm92ZXJsYXAsdGhpcy5kZXR1bmU9ZS5kZXR1bmUsdGhpcy5vdmVybGFwPWUub3ZlcmxhcCx0aGlzLmxvb3A9ZS5sb29wLHRoaXMucGxheWJhY2tSYXRlPWUucGxheWJhY2tSYXRlLHRoaXMuZ3JhaW5TaXplPWUuZ3JhaW5TaXplLHRoaXMubG9vcFN0YXJ0PWUubG9vcFN0YXJ0LHRoaXMubG9vcEVuZD1lLmxvb3BFbmQsdGhpcy5yZXZlcnNlPWUucmV2ZXJzZSx0aGlzLl9jbG9jay5vbihcInN0b3BcIix0aGlzLl9vbnN0b3AuYmluZCh0aGlzKSl9LHQuZXh0ZW5kKHQuR3JhaW5QbGF5ZXIsdC5Tb3VyY2UpLHQuR3JhaW5QbGF5ZXIuZGVmYXVsdHM9e29ubG9hZDp0Lm5vT3Asb3ZlcmxhcDouMSxncmFpblNpemU6LjIscGxheWJhY2tSYXRlOjEsZGV0dW5lOjAsbG9vcDohMSxsb29wU3RhcnQ6MCxsb29wRW5kOjAscmV2ZXJzZTohMX0sdC5HcmFpblBsYXllci5wcm90b3R5cGUuX3N0YXJ0PWZ1bmN0aW9uKGUsaSxuKXtpPXQuZGVmYXVsdEFyZyhpLDApLGk9dGhpcy50b1NlY29uZHMoaSksZT10aGlzLnRvU2Vjb25kcyhlKSx0aGlzLl9vZmZzZXQ9aSx0aGlzLl9jbG9jay5zdGFydChlKSxuJiZ0aGlzLnN0b3AoZSt0aGlzLnRvU2Vjb25kcyhuKSl9LHQuR3JhaW5QbGF5ZXIucHJvdG90eXBlLl9zdG9wPWZ1bmN0aW9uKHQpe3RoaXMuX2Nsb2NrLnN0b3AodCl9LHQuR3JhaW5QbGF5ZXIucHJvdG90eXBlLl9vbnN0b3A9ZnVuY3Rpb24odCl7dGhpcy5fYWN0aXZlU291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZmFkZU91dD0wLGUuc3RvcCh0KX0pfSx0LkdyYWluUGxheWVyLnByb3RvdHlwZS5fdGljaz1mdW5jdGlvbihlKXtpZighdGhpcy5sb29wJiZ0aGlzLl9vZmZzZXQ+dGhpcy5idWZmZXIuZHVyYXRpb24pdGhpcy5zdG9wKGUpO2Vsc2V7dmFyIGk9dGhpcy5fb2Zmc2V0PHRoaXMuX292ZXJsYXA/MDp0aGlzLl9vdmVybGFwLG49bmV3IHQuQnVmZmVyU291cmNlKHtidWZmZXI6dGhpcy5idWZmZXIsZmFkZUluOmksZmFkZU91dDp0aGlzLl9vdmVybGFwLGxvb3A6dGhpcy5sb29wLGxvb3BTdGFydDp0aGlzLl9sb29wU3RhcnQsbG9vcEVuZDp0aGlzLl9sb29wRW5kLHBsYXliYWNrUmF0ZTp0LmludGVydmFsVG9GcmVxdWVuY3lSYXRpbyh0aGlzLmRldHVuZS8xMDApfSkuY29ubmVjdCh0aGlzLm91dHB1dCk7bi5zdGFydChlLHRoaXMuX29mZnNldCksdGhpcy5fb2Zmc2V0Kz10aGlzLmdyYWluU2l6ZSxuLnN0b3AoZSt0aGlzLmdyYWluU2l6ZS90aGlzLnBsYXliYWNrUmF0ZSksdGhpcy5fYWN0aXZlU291cmNlcy5wdXNoKG4pLG4ub25lbmRlZD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2FjdGl2ZVNvdXJjZXMuaW5kZXhPZihuKTstMSE9PXQmJnRoaXMuX2FjdGl2ZVNvdXJjZXMuc3BsaWNlKHQsMSl9LmJpbmQodGhpcyl9fSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5HcmFpblBsYXllci5wcm90b3R5cGUsXCJwbGF5YmFja1JhdGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BsYXliYWNrUmF0ZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3BsYXliYWNrUmF0ZT10LHRoaXMuZ3JhaW5TaXplPXRoaXMuX2dyYWluU2l6ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5HcmFpblBsYXllci5wcm90b3R5cGUsXCJsb29wU3RhcnRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xvb3BTdGFydH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2xvb3BTdGFydD10aGlzLnRvU2Vjb25kcyh0KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5HcmFpblBsYXllci5wcm90b3R5cGUsXCJsb29wRW5kXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb29wRW5kfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbG9vcEVuZD10aGlzLnRvU2Vjb25kcyh0KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5HcmFpblBsYXllci5wcm90b3R5cGUsXCJyZXZlcnNlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1ZmZlci5yZXZlcnNlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5idWZmZXIucmV2ZXJzZT10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkdyYWluUGxheWVyLnByb3RvdHlwZSxcImdyYWluU2l6ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ3JhaW5TaXplfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fZ3JhaW5TaXplPXRoaXMudG9TZWNvbmRzKHQpLHRoaXMuX2Nsb2NrLmZyZXF1ZW5jeS52YWx1ZT10aGlzLl9wbGF5YmFja1JhdGUvdGhpcy5fZ3JhaW5TaXplfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkdyYWluUGxheWVyLnByb3RvdHlwZSxcIm92ZXJsYXBcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX292ZXJsYXB9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9vdmVybGFwPXRoaXMudG9TZWNvbmRzKHQpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkdyYWluUGxheWVyLnByb3RvdHlwZSxcImxvYWRlZFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idWZmZXIubG9hZGVkfX0pLHQuR3JhaW5QbGF5ZXIucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5Tb3VyY2UucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLmJ1ZmZlci5kaXNwb3NlKCksdGhpcy5idWZmZXI9bnVsbCx0aGlzLl9jbG9jay5kaXNwb3NlKCksdGhpcy5fY2xvY2s9bnVsbCx0aGlzLl9hY3RpdmVTb3VyY2VzLmZvckVhY2goZnVuY3Rpb24odCl7dC5kaXNwb3NlKCl9KSx0aGlzLl9hY3RpdmVTb3VyY2VzPW51bGwsdGhpc30sdC5HcmFpblBsYXllcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxNiksaSgxKSxpKDQ1KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuVHJhbnNwb3J0VGltZWxpbmVTaWduYWw9ZnVuY3Rpb24oKXt0LlNpZ25hbC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5vdXRwdXQ9dGhpcy5fb3V0cHV0U2lnPW5ldyB0LlNpZ25hbCh0aGlzLl9pbml0aWFsVmFsdWUpLHRoaXMuX2xhc3RWYWw9dGhpcy52YWx1ZSx0aGlzLl9zeW5jZWQ9dC5UcmFuc3BvcnQuc2NoZWR1bGVSZXBlYXQodGhpcy5fb25UaWNrLmJpbmQodGhpcyksXCIxaVwiKSx0aGlzLl9iaW5kQW5jaG9yVmFsdWU9dGhpcy5fYW5jaG9yVmFsdWUuYmluZCh0aGlzKSx0LlRyYW5zcG9ydC5vbihcInN0YXJ0IHN0b3AgcGF1c2VcIix0aGlzLl9iaW5kQW5jaG9yVmFsdWUpLHRoaXMuX2V2ZW50cy5tZW1vcnk9MS8wfSx0LmV4dGVuZCh0LlRyYW5zcG9ydFRpbWVsaW5lU2lnbmFsLHQuU2lnbmFsKSx0LlRyYW5zcG9ydFRpbWVsaW5lU2lnbmFsLnByb3RvdHlwZS5fb25UaWNrPWZ1bmN0aW9uKGUpe3ZhciBpPXRoaXMuZ2V0VmFsdWVBdFRpbWUodC5UcmFuc3BvcnQuc2Vjb25kcyk7dGhpcy5fbGFzdFZhbCE9PWkmJih0aGlzLl9sYXN0VmFsPWksdGhpcy5fb3V0cHV0U2lnLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGksZSkpfSx0LlRyYW5zcG9ydFRpbWVsaW5lU2lnbmFsLnByb3RvdHlwZS5fYW5jaG9yVmFsdWU9ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5nZXRWYWx1ZUF0VGltZSh0LlRyYW5zcG9ydC5zZWNvbmRzKTtyZXR1cm4gdGhpcy5fbGFzdFZhbD1pLHRoaXMuX291dHB1dFNpZy5jYW5jZWxTY2hlZHVsZWRWYWx1ZXMoZSksdGhpcy5fb3V0cHV0U2lnLnNldFZhbHVlQXRUaW1lKGksZSksdGhpc30sdC5UcmFuc3BvcnRUaW1lbGluZVNpZ25hbC5wcm90b3R5cGUuZ2V0VmFsdWVBdFRpbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dC5UcmFuc3BvcnRUaW1lKGUpLHQuU2lnbmFsLnByb3RvdHlwZS5nZXRWYWx1ZUF0VGltZS5jYWxsKHRoaXMsZSl9LHQuVHJhbnNwb3J0VGltZWxpbmVTaWduYWwucHJvdG90eXBlLnNldFZhbHVlQXRUaW1lPWZ1bmN0aW9uKGUsaSl7cmV0dXJuIGk9dC5UcmFuc3BvcnRUaW1lKGkpLHQuU2lnbmFsLnByb3RvdHlwZS5zZXRWYWx1ZUF0VGltZS5jYWxsKHRoaXMsZSxpKSx0aGlzfSx0LlRyYW5zcG9ydFRpbWVsaW5lU2lnbmFsLnByb3RvdHlwZS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZT1mdW5jdGlvbihlLGkpe3JldHVybiBpPXQuVHJhbnNwb3J0VGltZShpKSx0LlNpZ25hbC5wcm90b3R5cGUubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUuY2FsbCh0aGlzLGUsaSksdGhpc30sdC5UcmFuc3BvcnRUaW1lbGluZVNpZ25hbC5wcm90b3R5cGUuZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZT1mdW5jdGlvbihlLGkpe3JldHVybiBpPXQuVHJhbnNwb3J0VGltZShpKSx0LlNpZ25hbC5wcm90b3R5cGUuZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZS5jYWxsKHRoaXMsZSxpKSx0aGlzfSx0LlRyYW5zcG9ydFRpbWVsaW5lU2lnbmFsLnByb3RvdHlwZS5zZXRUYXJnZXRBdFRpbWU9ZnVuY3Rpb24oZSxpLG4pe3JldHVybiBpPXQuVHJhbnNwb3J0VGltZShpKSx0LlNpZ25hbC5wcm90b3R5cGUuc2V0VGFyZ2V0QXRUaW1lLmNhbGwodGhpcyxlLGksbiksdGhpc30sdC5UcmFuc3BvcnRUaW1lbGluZVNpZ25hbC5wcm90b3R5cGUuY2FuY2VsU2NoZWR1bGVkVmFsdWVzPWZ1bmN0aW9uKGUpe3JldHVybiBlPXQuVHJhbnNwb3J0VGltZShlKSx0LlNpZ25hbC5wcm90b3R5cGUuY2FuY2VsU2NoZWR1bGVkVmFsdWVzLmNhbGwodGhpcyxlKSx0aGlzfSx0LlRyYW5zcG9ydFRpbWVsaW5lU2lnbmFsLnByb3RvdHlwZS5zZXRWYWx1ZUN1cnZlQXRUaW1lPWZ1bmN0aW9uKGUsaSxuLG8pe3JldHVybiBpPXQuVHJhbnNwb3J0VGltZShpKSxuPXQuVHJhbnNwb3J0VGltZShuKSx0LlNpZ25hbC5wcm90b3R5cGUuc2V0VmFsdWVDdXJ2ZUF0VGltZS5jYWxsKHRoaXMsZSxpLG4sbyksdGhpc30sdC5UcmFuc3BvcnRUaW1lbGluZVNpZ25hbC5wcm90b3R5cGUuY2FuY2VsQW5kSG9sZEF0VGltZT1mdW5jdGlvbihlKXtyZXR1cm4gdC5TaWduYWwucHJvdG90eXBlLmNhbmNlbEFuZEhvbGRBdFRpbWUuY2FsbCh0aGlzLHQuVHJhbnNwb3J0VGltZShlKSl9LHQuVHJhbnNwb3J0VGltZWxpbmVTaWduYWwucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0LlRyYW5zcG9ydC5jbGVhcih0aGlzLl9zeW5jZWQpLHQuVHJhbnNwb3J0Lm9mZihcInN0YXJ0IHN0b3AgcGF1c2VcIix0aGlzLl9zeW5jZWRDYWxsYmFjayksdGhpcy5fZXZlbnRzLmNhbmNlbCgwKSx0LlNpZ25hbC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX291dHB1dFNpZy5kaXNwb3NlKCksdGhpcy5fb3V0cHV0U2lnPW51bGx9LHQuVHJhbnNwb3J0VGltZWxpbmVTaWduYWx9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMjkpLGkoNSldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0Lk5vcm1hbGl6ZT1mdW5jdGlvbihlLGkpe3QuU2lnbmFsQmFzZS5jYWxsKHRoaXMpLHRoaXMuX2lucHV0TWluPXQuZGVmYXVsdEFyZyhlLDApLHRoaXMuX2lucHV0TWF4PXQuZGVmYXVsdEFyZyhpLDEpLHRoaXMuX3N1Yj10aGlzLmlucHV0PW5ldyB0LkFkZCgwKSx0aGlzLl9kaXY9dGhpcy5vdXRwdXQ9bmV3IHQuTXVsdGlwbHkoMSksdGhpcy5fc3ViLmNvbm5lY3QodGhpcy5fZGl2KSx0aGlzLl9zZXRSYW5nZSgpfSx0LmV4dGVuZCh0Lk5vcm1hbGl6ZSx0LlNpZ25hbEJhc2UpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk5vcm1hbGl6ZS5wcm90b3R5cGUsXCJtaW5cIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lucHV0TWlufSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5faW5wdXRNaW49dCx0aGlzLl9zZXRSYW5nZSgpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk5vcm1hbGl6ZS5wcm90b3R5cGUsXCJtYXhcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lucHV0TWF4fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5faW5wdXRNYXg9dCx0aGlzLl9zZXRSYW5nZSgpfX0pLHQuTm9ybWFsaXplLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24oKXt0aGlzLl9zdWIudmFsdWU9LXRoaXMuX2lucHV0TWluLHRoaXMuX2Rpdi52YWx1ZT0xLyh0aGlzLl9pbnB1dE1heC10aGlzLl9pbnB1dE1pbil9LHQuTm9ybWFsaXplLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU2lnbmFsQmFzZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3N1Yi5kaXNwb3NlKCksdGhpcy5fc3ViPW51bGwsdGhpcy5fZGl2LmRpc3Bvc2UoKSx0aGlzLl9kaXY9bnVsbCx0aGlzfSx0Lk5vcm1hbGl6ZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg3KSxpKDEpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5HYWluVG9BdWRpbz1mdW5jdGlvbigpe3QuU2lnbmFsQmFzZS5jYWxsKHRoaXMpLHRoaXMuX25vcm09dGhpcy5pbnB1dD10aGlzLm91dHB1dD1uZXcgdC5XYXZlU2hhcGVyKGZ1bmN0aW9uKHQpe3JldHVybiAyKk1hdGguYWJzKHQpLTF9KX0sdC5leHRlbmQodC5HYWluVG9BdWRpbyx0LlNpZ25hbEJhc2UpLHQuR2FpblRvQXVkaW8ucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5TaWduYWxCYXNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fbm9ybS5kaXNwb3NlKCksdGhpcy5fbm9ybT1udWxsLHRoaXN9LHQuR2FpblRvQXVkaW99LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXt0LnN1cHBvcnRlZCYmKE9zY2lsbGF0b3JOb2RlLnByb3RvdHlwZS5zZXRQZXJpb2RpY1dhdmV8fChPc2NpbGxhdG9yTm9kZS5wcm90b3R5cGUuc2V0UGVyaW9kaWNXYXZlPU9zY2lsbGF0b3JOb2RlLnByb3RvdHlwZS5zZXRXYXZlVGFibGUpLEF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlUGVyaW9kaWNXYXZlfHwoQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVQZXJpb2RpY1dhdmU9QXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVXYXZlVGFibGUpKX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgyMSksaSg3OSksaSgzMSldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe3JldHVybiB0LlNhbXBsZXI9ZnVuY3Rpb24oZSl7dmFyIGk9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtpLnNoaWZ0KCk7dmFyIG49dC5kZWZhdWx0cyhpLFtcIm9ubG9hZFwiLFwiYmFzZVVybFwiXSx0LlNhbXBsZXIpO3QuSW5zdHJ1bWVudC5jYWxsKHRoaXMsbik7dmFyIG89e307Zm9yKHZhciBzIGluIGUpaWYodC5pc05vdGUocykpe29bdC5GcmVxdWVuY3kocykudG9NaWRpKCldPWVbc119ZWxzZXtpZihpc05hTihwYXJzZUZsb2F0KHMpKSl0aHJvdyBuZXcgRXJyb3IoXCJUb25lLlNhbXBsZXI6IHVybCBrZXlzIG11c3QgYmUgdGhlIG5vdGUncyBwaXRjaFwiKTtvW3NdPWVbc119dGhpcy5fYnVmZmVycz1uZXcgdC5CdWZmZXJzKG8sbi5vbmxvYWQsbi5iYXNlVXJsKSx0aGlzLl9hY3RpdmVTb3VyY2VzPXt9LHRoaXMuYXR0YWNrPW4uYXR0YWNrLHRoaXMucmVsZWFzZT1uLnJlbGVhc2UsdGhpcy5jdXJ2ZT1uLmN1cnZlfSx0LmV4dGVuZCh0LlNhbXBsZXIsdC5JbnN0cnVtZW50KSx0LlNhbXBsZXIuZGVmYXVsdHM9e2F0dGFjazowLHJlbGVhc2U6LjEsb25sb2FkOnQubm9PcCxiYXNlVXJsOlwiXCIsY3VydmU6XCJleHBvbmVudGlhbFwifSx0LlNhbXBsZXIucHJvdG90eXBlLl9maW5kQ2xvc2VzdD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPDk2Oyl7aWYodGhpcy5fYnVmZmVycy5oYXModCtlKSlyZXR1cm4tZTtpZih0aGlzLl9idWZmZXJzLmhhcyh0LWUpKXJldHVybiBlO2UrK31yZXR1cm4gbnVsbH0sdC5TYW1wbGVyLnByb3RvdHlwZS50cmlnZ2VyQXR0YWNrPWZ1bmN0aW9uKGUsaSxuKXt0aGlzLmxvZyhcInRyaWdnZXJBdHRhY2tcIixlLGksbiksQXJyYXkuaXNBcnJheShlKXx8KGU9W2VdKTtmb3IodmFyIG89MDtvPGUubGVuZ3RoO28rKyl7dmFyIHM9dC5GcmVxdWVuY3koZVtvXSkudG9NaWRpKCkscj10aGlzLl9maW5kQ2xvc2VzdChzKTtpZihudWxsIT09cil7dmFyIGE9cy1yLGw9dGhpcy5fYnVmZmVycy5nZXQoYSksaD10LmludGVydmFsVG9GcmVxdWVuY3lSYXRpbyhyKSx1PW5ldyB0LkJ1ZmZlclNvdXJjZSh7YnVmZmVyOmwscGxheWJhY2tSYXRlOmgsZmFkZUluOnRoaXMuYXR0YWNrLGZhZGVPdXQ6dGhpcy5yZWxlYXNlLGN1cnZlOnRoaXMuY3VydmV9KS5jb25uZWN0KHRoaXMub3V0cHV0KTt1LnN0YXJ0KGksMCxsLmR1cmF0aW9uL2gsbiksdC5pc0FycmF5KHRoaXMuX2FjdGl2ZVNvdXJjZXNbc10pfHwodGhpcy5fYWN0aXZlU291cmNlc1tzXT1bXSksdGhpcy5fYWN0aXZlU291cmNlc1tzXS5wdXNoKHUpLHUub25lbmRlZD1mdW5jdGlvbigpe2lmKHRoaXMuX2FjdGl2ZVNvdXJjZXMmJnRoaXMuX2FjdGl2ZVNvdXJjZXNbc10pe3ZhciB0PXRoaXMuX2FjdGl2ZVNvdXJjZXNbc10uaW5kZXhPZih1KTstMSE9PXQmJnRoaXMuX2FjdGl2ZVNvdXJjZXNbc10uc3BsaWNlKHQsMSl9fS5iaW5kKHRoaXMpfX1yZXR1cm4gdGhpc30sdC5TYW1wbGVyLnByb3RvdHlwZS50cmlnZ2VyUmVsZWFzZT1mdW5jdGlvbihlLGkpe3RoaXMubG9nKFwidHJpZ2dlclJlbGVhc2VcIixlLGkpLEFycmF5LmlzQXJyYXkoZSl8fChlPVtlXSk7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBvPXQuRnJlcXVlbmN5KGVbbl0pLnRvTWlkaSgpO2lmKHRoaXMuX2FjdGl2ZVNvdXJjZXNbb10mJnRoaXMuX2FjdGl2ZVNvdXJjZXNbb10ubGVuZ3RoKXt2YXIgcz10aGlzLl9hY3RpdmVTb3VyY2VzW29dLnNoaWZ0KCk7aT10aGlzLnRvU2Vjb25kcyhpKSxzLnN0b3AoaSl9fXJldHVybiB0aGlzfSx0LlNhbXBsZXIucHJvdG90eXBlLnJlbGVhc2VBbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHQ9dGhpcy50b1NlY29uZHModCksdGhpcy5fYWN0aXZlU291cmNlcylmb3IodmFyIGk9dGhpcy5fYWN0aXZlU291cmNlc1tlXTtpLmxlbmd0aDspe2kuc2hpZnQoKS5zdG9wKHQpfXJldHVybiB0aGlzfSx0LlNhbXBsZXIucHJvdG90eXBlLnN5bmM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3luY01ldGhvZChcInRyaWdnZXJBdHRhY2tcIiwxKSx0aGlzLl9zeW5jTWV0aG9kKFwidHJpZ2dlclJlbGVhc2VcIiwxKSx0aGlzfSx0LlNhbXBsZXIucHJvdG90eXBlLnRyaWdnZXJBdHRhY2tSZWxlYXNlPWZ1bmN0aW9uKGUsaSxuLG8pe2lmKG49dGhpcy50b1NlY29uZHMobiksdGhpcy50cmlnZ2VyQXR0YWNrKGUsbixvKSx0LmlzQXJyYXkoaSkmJnQuaXNBcnJheShlKSlmb3IodmFyIHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIHI9aVtNYXRoLm1pbihzLGkubGVuZ3RoLTEpXTt0aGlzLnRyaWdnZXJSZWxlYXNlKGVbc10sbit0aGlzLnRvU2Vjb25kcyhyKSl9ZWxzZSB0aGlzLnRyaWdnZXJSZWxlYXNlKGUsbit0aGlzLnRvU2Vjb25kcyhpKSk7cmV0dXJuIHRoaXN9LHQuU2FtcGxlci5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUsaSxuKXtpZih0LmlzTm90ZShlKSl7dmFyIG89dC5GcmVxdWVuY3koZSkudG9NaWRpKCk7dGhpcy5fYnVmZmVycy5hZGQobyxpLG4pfWVsc2V7aWYoaXNOYU4ocGFyc2VGbG9hdChlKSkpdGhyb3cgbmV3IEVycm9yKFwiVG9uZS5TYW1wbGVyOiBub3RlIG11c3QgYmUgdGhlIG5vdGUncyBwaXRjaC4gSW5zdGVhZCBnb3QgXCIrZSk7dGhpcy5fYnVmZmVycy5hZGQoZSxpLG4pfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuU2FtcGxlci5wcm90b3R5cGUsXCJsb2FkZWRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2J1ZmZlcnMubG9hZGVkfX0pLHQuU2FtcGxlci5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe2Zvcih2YXIgZSBpbiB0Lkluc3RydW1lbnQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9idWZmZXJzLmRpc3Bvc2UoKSx0aGlzLl9idWZmZXJzPW51bGwsdGhpcy5fYWN0aXZlU291cmNlcyl0aGlzLl9hY3RpdmVTb3VyY2VzW2VdLmZvckVhY2goZnVuY3Rpb24odCl7dC5kaXNwb3NlKCl9KTtyZXR1cm4gdGhpcy5fYWN0aXZlU291cmNlcz1udWxsLHRoaXN9LHQuU2FtcGxlcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgzOCksaSg2KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuUG9seVN5bnRoPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wicG9seXBob255XCIsXCJ2b2ljZVwiXSx0LlBvbHlTeW50aCk7dC5JbnN0cnVtZW50LmNhbGwodGhpcyxlKSwoZT10LmRlZmF1bHRBcmcoZSx0Lkluc3RydW1lbnQuZGVmYXVsdHMpKS5wb2x5cGhvbnk9TWF0aC5taW4odC5Qb2x5U3ludGguTUFYX1BPTFlQSE9OWSxlLnBvbHlwaG9ueSksdGhpcy52b2ljZXM9bmV3IEFycmF5KGUucG9seXBob255KSx0aGlzLmFzc2VydChlLnBvbHlwaG9ueT4wLFwicG9seXBob255IG11c3QgYmUgZ3JlYXRlciB0aGFuIDBcIiksdGhpcy5kZXR1bmU9bmV3IHQuU2lnbmFsKGUuZGV0dW5lLHQuVHlwZS5DZW50cyksdGhpcy5fcmVhZE9ubHkoXCJkZXR1bmVcIik7Zm9yKHZhciBpPTA7aTxlLnBvbHlwaG9ueTtpKyspe3ZhciBuPW5ldyBlLnZvaWNlKGFyZ3VtZW50c1syXSxhcmd1bWVudHNbM10pO2lmKCEobiBpbnN0YW5jZW9mIHQuTW9ub3Bob25pYykpdGhyb3cgbmV3IEVycm9yKFwiU3ludGggY29uc3RydWN0b3IgbXVzdCBiZSBpbnN0YW5jZSBvZiBUb25lLk1vbm9waG9uaWNcIik7dGhpcy52b2ljZXNbaV09bixuLmluZGV4PWksbi5jb25uZWN0KHRoaXMub3V0cHV0KSxuLmhhc093blByb3BlcnR5KFwiZGV0dW5lXCIpJiZ0aGlzLmRldHVuZS5jb25uZWN0KG4uZGV0dW5lKX19LHQuZXh0ZW5kKHQuUG9seVN5bnRoLHQuSW5zdHJ1bWVudCksdC5Qb2x5U3ludGguZGVmYXVsdHM9e3BvbHlwaG9ueTo0LHZvbHVtZTowLGRldHVuZTowLHZvaWNlOnQuU3ludGh9LHQuUG9seVN5bnRoLnByb3RvdHlwZS5fZ2V0Q2xvc2VzdFZvaWNlPWZ1bmN0aW9uKGUsaSl7dmFyIG49dGhpcy52b2ljZXMuZmluZChmdW5jdGlvbihuKXtpZihNYXRoLmFicyhuLmZyZXF1ZW5jeS5nZXRWYWx1ZUF0VGltZShlKS10LkZyZXF1ZW5jeShpKSk8MWUtNCYmbi5nZXRMZXZlbEF0VGltZShlKT4xZS01KXJldHVybiBufSk7cmV0dXJuIG58fHRoaXMudm9pY2VzLnNsaWNlKCkuc29ydChmdW5jdGlvbih0LGkpe3ZhciBuPXQuZ2V0TGV2ZWxBdFRpbWUoZSt0aGlzLmJsb2NrVGltZSksbz1pLmdldExldmVsQXRUaW1lKGUrdGhpcy5ibG9ja1RpbWUpO3JldHVybiBuPDFlLTUmJihuPTApLG88MWUtNSYmKG89MCksbi1vfS5iaW5kKHRoaXMpKVswXX0sdC5Qb2x5U3ludGgucHJvdG90eXBlLnRyaWdnZXJBdHRhY2s9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBBcnJheS5pc0FycmF5KHQpfHwodD1bdF0pLGU9dGhpcy50b1NlY29uZHMoZSksdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2dldENsb3Nlc3RWb2ljZShlLHQpO24udHJpZ2dlckF0dGFjayh0LGUsaSksdGhpcy5sb2coXCJ0cmlnZ2VyQXR0YWNrXCIsbi5pbmRleCx0KX0uYmluZCh0aGlzKSksdGhpc30sdC5Qb2x5U3ludGgucHJvdG90eXBlLnRyaWdnZXJSZWxlYXNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl8fCh0PVt0XSksZT10aGlzLnRvU2Vjb25kcyhlKSx0LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fZ2V0Q2xvc2VzdFZvaWNlKGUsdCk7dGhpcy5sb2coXCJ0cmlnZ2VyUmVsZWFzZVwiLGkuaW5kZXgsdCksaS50cmlnZ2VyUmVsZWFzZShlKX0uYmluZCh0aGlzKSksdGhpc30sdC5Qb2x5U3ludGgucHJvdG90eXBlLnRyaWdnZXJBdHRhY2tSZWxlYXNlPWZ1bmN0aW9uKGUsaSxuLG8pe2lmKG49dGhpcy50b1NlY29uZHMobiksdGhpcy50cmlnZ2VyQXR0YWNrKGUsbixvKSx0LmlzQXJyYXkoaSkmJnQuaXNBcnJheShlKSlmb3IodmFyIHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIHI9aVtNYXRoLm1pbihzLGkubGVuZ3RoLTEpXTt0aGlzLnRyaWdnZXJSZWxlYXNlKGVbc10sbit0aGlzLnRvU2Vjb25kcyhyKSl9ZWxzZSB0aGlzLnRyaWdnZXJSZWxlYXNlKGUsbit0aGlzLnRvU2Vjb25kcyhpKSk7cmV0dXJuIHRoaXN9LHQuUG9seVN5bnRoLnByb3RvdHlwZS5zeW5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N5bmNNZXRob2QoXCJ0cmlnZ2VyQXR0YWNrXCIsMSksdGhpcy5fc3luY01ldGhvZChcInRyaWdnZXJSZWxlYXNlXCIsMSksdGhpc30sdC5Qb2x5U3ludGgucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBuPTA7bjx0aGlzLnZvaWNlcy5sZW5ndGg7bisrKXRoaXMudm9pY2VzW25dLnNldCh0LGUsaSk7cmV0dXJuIHRoaXN9LHQuUG9seVN5bnRoLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudm9pY2VzWzBdLmdldCh0KX0sdC5Qb2x5U3ludGgucHJvdG90eXBlLnJlbGVhc2VBbGw9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dGhpcy50b1NlY29uZHModCksdGhpcy52b2ljZXMuZm9yRWFjaChmdW5jdGlvbihlKXtlLnRyaWdnZXJSZWxlYXNlKHQpfSksdGhpc30sdC5Qb2x5U3ludGgucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5JbnN0cnVtZW50LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy52b2ljZXMuZm9yRWFjaChmdW5jdGlvbih0KXt0LmRpc3Bvc2UoKX0pLHRoaXMuX3dyaXRhYmxlKFwiZGV0dW5lXCIpLHRoaXMuZGV0dW5lLmRpc3Bvc2UoKSx0aGlzLmRldHVuZT1udWxsLHRoaXMudm9pY2VzPW51bGwsdGhpc30sdC5Qb2x5U3ludGguTUFYX1BPTFlQSE9OWT0yMCx0LlBvbHlTeW50aH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgyMSksaSgzOSksaSg1MyldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlBsdWNrU3ludGg9ZnVuY3Rpb24oZSl7ZT10LmRlZmF1bHRBcmcoZSx0LlBsdWNrU3ludGguZGVmYXVsdHMpLHQuSW5zdHJ1bWVudC5jYWxsKHRoaXMsZSksdGhpcy5fbm9pc2U9bmV3IHQuTm9pc2UoXCJwaW5rXCIpLHRoaXMuYXR0YWNrTm9pc2U9ZS5hdHRhY2tOb2lzZSx0aGlzLl9sZmNmPW5ldyB0Lkxvd3Bhc3NDb21iRmlsdGVyKHtyZXNvbmFuY2U6ZS5yZXNvbmFuY2UsZGFtcGVuaW5nOmUuZGFtcGVuaW5nfSksdGhpcy5yZXNvbmFuY2U9dGhpcy5fbGZjZi5yZXNvbmFuY2UsdGhpcy5kYW1wZW5pbmc9dGhpcy5fbGZjZi5kYW1wZW5pbmcsdGhpcy5fbm9pc2UuY29ubmVjdCh0aGlzLl9sZmNmKSx0aGlzLl9sZmNmLmNvbm5lY3QodGhpcy5vdXRwdXQpLHRoaXMuX3JlYWRPbmx5KFtcInJlc29uYW5jZVwiLFwiZGFtcGVuaW5nXCJdKX0sdC5leHRlbmQodC5QbHVja1N5bnRoLHQuSW5zdHJ1bWVudCksdC5QbHVja1N5bnRoLmRlZmF1bHRzPXthdHRhY2tOb2lzZToxLGRhbXBlbmluZzo0ZTMscmVzb25hbmNlOi43fSx0LlBsdWNrU3ludGgucHJvdG90eXBlLnRyaWdnZXJBdHRhY2s9ZnVuY3Rpb24odCxlKXt0PXRoaXMudG9GcmVxdWVuY3kodCksZT10aGlzLnRvU2Vjb25kcyhlKTt2YXIgaT0xL3Q7cmV0dXJuIHRoaXMuX2xmY2YuZGVsYXlUaW1lLnNldFZhbHVlQXRUaW1lKGksZSksdGhpcy5fbm9pc2Uuc3RhcnQoZSksdGhpcy5fbm9pc2Uuc3RvcChlK2kqdGhpcy5hdHRhY2tOb2lzZSksdGhpc30sdC5QbHVja1N5bnRoLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuSW5zdHJ1bWVudC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX25vaXNlLmRpc3Bvc2UoKSx0aGlzLl9sZmNmLmRpc3Bvc2UoKSx0aGlzLl9ub2lzZT1udWxsLHRoaXMuX2xmY2Y9bnVsbCx0aGlzLl93cml0YWJsZShbXCJyZXNvbmFuY2VcIixcImRhbXBlbmluZ1wiXSksdGhpcy5kYW1wZW5pbmc9bnVsbCx0aGlzLnJlc29uYW5jZT1udWxsLHRoaXN9LHQuUGx1Y2tTeW50aH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgzMCksaSg0MSksaSgzOSksaSgxKSxpKDkpLGkoMjEpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5Ob2lzZVN5bnRoPWZ1bmN0aW9uKGUpe2U9dC5kZWZhdWx0QXJnKGUsdC5Ob2lzZVN5bnRoLmRlZmF1bHRzKSx0Lkluc3RydW1lbnQuY2FsbCh0aGlzLGUpLHRoaXMubm9pc2U9bmV3IHQuTm9pc2UoZS5ub2lzZSksdGhpcy5lbnZlbG9wZT1uZXcgdC5BbXBsaXR1ZGVFbnZlbG9wZShlLmVudmVsb3BlKSx0aGlzLm5vaXNlLmNoYWluKHRoaXMuZW52ZWxvcGUsdGhpcy5vdXRwdXQpLHRoaXMuX3JlYWRPbmx5KFtcIm5vaXNlXCIsXCJlbnZlbG9wZVwiXSl9LHQuZXh0ZW5kKHQuTm9pc2VTeW50aCx0Lkluc3RydW1lbnQpLHQuTm9pc2VTeW50aC5kZWZhdWx0cz17bm9pc2U6e3R5cGU6XCJ3aGl0ZVwifSxlbnZlbG9wZTp7YXR0YWNrOi4wMDUsZGVjYXk6LjEsc3VzdGFpbjowfX0sdC5Ob2lzZVN5bnRoLnByb3RvdHlwZS50cmlnZ2VyQXR0YWNrPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9dGhpcy50b1NlY29uZHModCksdGhpcy5lbnZlbG9wZS50cmlnZ2VyQXR0YWNrKHQsZSksdGhpcy5ub2lzZS5zdGFydCh0KSwwPT09dGhpcy5lbnZlbG9wZS5zdXN0YWluJiZ0aGlzLm5vaXNlLnN0b3AodCt0aGlzLmVudmVsb3BlLmF0dGFjayt0aGlzLmVudmVsb3BlLmRlY2F5KSx0aGlzfSx0Lk5vaXNlU3ludGgucHJvdG90eXBlLnRyaWdnZXJSZWxlYXNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVudmVsb3BlLnRyaWdnZXJSZWxlYXNlKHQpLHRoaXMubm9pc2Uuc3RvcCh0K3RoaXMuZW52ZWxvcGUucmVsZWFzZSksdGhpc30sdC5Ob2lzZVN5bnRoLnByb3RvdHlwZS5zeW5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N5bmNNZXRob2QoXCJ0cmlnZ2VyQXR0YWNrXCIsMCksdGhpcy5fc3luY01ldGhvZChcInRyaWdnZXJSZWxlYXNlXCIsMCksdGhpc30sdC5Ob2lzZVN5bnRoLnByb3RvdHlwZS50cmlnZ2VyQXR0YWNrUmVsZWFzZT1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIGU9dGhpcy50b1NlY29uZHMoZSksdD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLnRyaWdnZXJBdHRhY2soZSxpKSx0aGlzLnRyaWdnZXJSZWxlYXNlKGUrdCksdGhpc30sdC5Ob2lzZVN5bnRoLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuSW5zdHJ1bWVudC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcIm5vaXNlXCIsXCJlbnZlbG9wZVwiXSksdGhpcy5ub2lzZS5kaXNwb3NlKCksdGhpcy5ub2lzZT1udWxsLHRoaXMuZW52ZWxvcGUuZGlzcG9zZSgpLHRoaXMuZW52ZWxvcGU9bnVsbCx0aGlzfSx0Lk5vaXNlU3ludGh9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMjEpLGkoNDgpLGkoOSksaSg0MSksaSgzMCksaSgzKSxpKDI2KSxpKDUpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXt2YXIgZT1bMSwxLjQ4MywxLjkzMiwyLjU0NiwyLjYzLDMuODk3XTtyZXR1cm4gdC5NZXRhbFN5bnRoPWZ1bmN0aW9uKGkpe2k9dC5kZWZhdWx0QXJnKGksdC5NZXRhbFN5bnRoLmRlZmF1bHRzKSx0Lkluc3RydW1lbnQuY2FsbCh0aGlzLGkpLHRoaXMuZnJlcXVlbmN5PW5ldyB0LlNpZ25hbChpLmZyZXF1ZW5jeSx0LlR5cGUuRnJlcXVlbmN5KSx0aGlzLl9vc2NpbGxhdG9ycz1bXSx0aGlzLl9mcmVxTXVsdGlwbGllcnM9W10sdGhpcy5fYW1wbGl0dWU9bmV3IHQuR2FpbigwKS5jb25uZWN0KHRoaXMub3V0cHV0KSx0aGlzLl9oaWdocGFzcz1uZXcgdC5GaWx0ZXIoe3R5cGU6XCJoaWdocGFzc1wiLFE6LTMuMDEwMjk5OTU2NjM5ODEyNX0pLmNvbm5lY3QodGhpcy5fYW1wbGl0dWUpLHRoaXMuX29jdGF2ZXM9aS5vY3RhdmVzLHRoaXMuX2ZpbHRlckZyZXFTY2FsZXI9bmV3IHQuU2NhbGUoaS5yZXNvbmFuY2UsN2UzKSx0aGlzLmVudmVsb3BlPW5ldyB0LkVudmVsb3BlKHthdHRhY2s6aS5lbnZlbG9wZS5hdHRhY2ssYXR0YWNrQ3VydmU6XCJsaW5lYXJcIixkZWNheTppLmVudmVsb3BlLmRlY2F5LHN1c3RhaW46MCxyZWxlYXNlOmkuZW52ZWxvcGUucmVsZWFzZX0pLmNoYWluKHRoaXMuX2ZpbHRlckZyZXFTY2FsZXIsdGhpcy5faGlnaHBhc3MuZnJlcXVlbmN5KSx0aGlzLmVudmVsb3BlLmNvbm5lY3QodGhpcy5fYW1wbGl0dWUuZ2Fpbik7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBvPW5ldyB0LkZNT3NjaWxsYXRvcih7dHlwZTpcInNxdWFyZVwiLG1vZHVsYXRpb25UeXBlOlwic3F1YXJlXCIsaGFybW9uaWNpdHk6aS5oYXJtb25pY2l0eSxtb2R1bGF0aW9uSW5kZXg6aS5tb2R1bGF0aW9uSW5kZXh9KTtvLmNvbm5lY3QodGhpcy5faGlnaHBhc3MpLHRoaXMuX29zY2lsbGF0b3JzW25dPW87dmFyIHM9bmV3IHQuTXVsdGlwbHkoZVtuXSk7dGhpcy5fZnJlcU11bHRpcGxpZXJzW25dPXMsdGhpcy5mcmVxdWVuY3kuY2hhaW4ocyxvLmZyZXF1ZW5jeSl9dGhpcy5vY3RhdmVzPWkub2N0YXZlc30sdC5leHRlbmQodC5NZXRhbFN5bnRoLHQuSW5zdHJ1bWVudCksdC5NZXRhbFN5bnRoLmRlZmF1bHRzPXtmcmVxdWVuY3k6MjAwLGVudmVsb3BlOnthdHRhY2s6LjAwMSxkZWNheToxLjQscmVsZWFzZTouMn0saGFybW9uaWNpdHk6NS4xLG1vZHVsYXRpb25JbmRleDozMixyZXNvbmFuY2U6NGUzLG9jdGF2ZXM6MS41fSx0Lk1ldGFsU3ludGgucHJvdG90eXBlLnRyaWdnZXJBdHRhY2s9ZnVuY3Rpb24oZSxpKXtyZXR1cm4gZT10aGlzLnRvU2Vjb25kcyhlKSxpPXQuZGVmYXVsdEFyZyhpLDEpLHRoaXMuZW52ZWxvcGUudHJpZ2dlckF0dGFjayhlLGkpLHRoaXMuX29zY2lsbGF0b3JzLmZvckVhY2goZnVuY3Rpb24odCl7dC5zdGFydChlKX0pLDA9PT10aGlzLmVudmVsb3BlLnN1c3RhaW4mJnRoaXMuX29zY2lsbGF0b3JzLmZvckVhY2goZnVuY3Rpb24odCl7dC5zdG9wKGUrdGhpcy5lbnZlbG9wZS5hdHRhY2srdGhpcy5lbnZlbG9wZS5kZWNheSl9LmJpbmQodGhpcykpLHRoaXN9LHQuTWV0YWxTeW50aC5wcm90b3R5cGUudHJpZ2dlclJlbGVhc2U9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dGhpcy50b1NlY29uZHModCksdGhpcy5lbnZlbG9wZS50cmlnZ2VyUmVsZWFzZSh0KSx0aGlzLl9vc2NpbGxhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uuc3RvcCh0K3RoaXMuZW52ZWxvcGUucmVsZWFzZSl9LmJpbmQodGhpcykpLHRoaXN9LHQuTWV0YWxTeW50aC5wcm90b3R5cGUuc3luYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zeW5jTWV0aG9kKFwidHJpZ2dlckF0dGFja1wiLDApLHRoaXMuX3N5bmNNZXRob2QoXCJ0cmlnZ2VyUmVsZWFzZVwiLDApLHRoaXN9LHQuTWV0YWxTeW50aC5wcm90b3R5cGUudHJpZ2dlckF0dGFja1JlbGVhc2U9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBlPXRoaXMudG9TZWNvbmRzKGUpLHQ9dGhpcy50b1NlY29uZHModCksdGhpcy50cmlnZ2VyQXR0YWNrKGUsaSksdGhpcy50cmlnZ2VyUmVsZWFzZShlK3QpLHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk1ldGFsU3ludGgucHJvdG90eXBlLFwibW9kdWxhdGlvbkluZGV4XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vc2NpbGxhdG9yc1swXS5tb2R1bGF0aW9uSW5kZXgudmFsdWV9LHNldDpmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX29zY2lsbGF0b3JzLmxlbmd0aDtlKyspdGhpcy5fb3NjaWxsYXRvcnNbZV0ubW9kdWxhdGlvbkluZGV4LnZhbHVlPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuTWV0YWxTeW50aC5wcm90b3R5cGUsXCJoYXJtb25pY2l0eVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3NjaWxsYXRvcnNbMF0uaGFybW9uaWNpdHkudmFsdWV9LHNldDpmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX29zY2lsbGF0b3JzLmxlbmd0aDtlKyspdGhpcy5fb3NjaWxsYXRvcnNbZV0uaGFybW9uaWNpdHkudmFsdWU9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5NZXRhbFN5bnRoLnByb3RvdHlwZSxcInJlc29uYW5jZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZmlsdGVyRnJlcVNjYWxlci5taW59LHNldDpmdW5jdGlvbih0KXt0aGlzLl9maWx0ZXJGcmVxU2NhbGVyLm1pbj10LHRoaXMub2N0YXZlcz10aGlzLl9vY3RhdmVzfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lk1ldGFsU3ludGgucHJvdG90eXBlLFwib2N0YXZlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb2N0YXZlc30sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX29jdGF2ZXM9dCx0aGlzLl9maWx0ZXJGcmVxU2NhbGVyLm1heD10aGlzLl9maWx0ZXJGcmVxU2NhbGVyLm1pbipNYXRoLnBvdygyLHQpfX0pLHQuTWV0YWxTeW50aC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3QuSW5zdHJ1bWVudC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO2Zvcih2YXIgZT0wO2U8dGhpcy5fb3NjaWxsYXRvcnMubGVuZ3RoO2UrKyl0aGlzLl9vc2NpbGxhdG9yc1tlXS5kaXNwb3NlKCksdGhpcy5fZnJlcU11bHRpcGxpZXJzW2VdLmRpc3Bvc2UoKTt0aGlzLl9vc2NpbGxhdG9ycz1udWxsLHRoaXMuX2ZyZXFNdWx0aXBsaWVycz1udWxsLHRoaXMuZnJlcXVlbmN5LmRpc3Bvc2UoKSx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXMuX2ZpbHRlckZyZXFTY2FsZXIuZGlzcG9zZSgpLHRoaXMuX2ZpbHRlckZyZXFTY2FsZXI9bnVsbCx0aGlzLl9hbXBsaXR1ZS5kaXNwb3NlKCksdGhpcy5fYW1wbGl0dWU9bnVsbCx0aGlzLmVudmVsb3BlLmRpc3Bvc2UoKSx0aGlzLmVudmVsb3BlPW51bGwsdGhpcy5faGlnaHBhc3MuZGlzcG9zZSgpLHRoaXMuX2hpZ2hwYXNzPW51bGx9LHQuTWV0YWxTeW50aH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgzNyksaSgyMSksaSgzMCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0Lk1lbWJyYW5lU3ludGg9ZnVuY3Rpb24oZSl7ZT10LmRlZmF1bHRBcmcoZSx0Lk1lbWJyYW5lU3ludGguZGVmYXVsdHMpLHQuSW5zdHJ1bWVudC5jYWxsKHRoaXMsZSksdGhpcy5vc2NpbGxhdG9yPW5ldyB0Lk9tbmlPc2NpbGxhdG9yKGUub3NjaWxsYXRvciksdGhpcy5lbnZlbG9wZT1uZXcgdC5BbXBsaXR1ZGVFbnZlbG9wZShlLmVudmVsb3BlKSx0aGlzLm9jdGF2ZXM9ZS5vY3RhdmVzLHRoaXMucGl0Y2hEZWNheT1lLnBpdGNoRGVjYXksdGhpcy5vc2NpbGxhdG9yLmNoYWluKHRoaXMuZW52ZWxvcGUsdGhpcy5vdXRwdXQpLHRoaXMuX3JlYWRPbmx5KFtcIm9zY2lsbGF0b3JcIixcImVudmVsb3BlXCJdKX0sdC5leHRlbmQodC5NZW1icmFuZVN5bnRoLHQuSW5zdHJ1bWVudCksdC5NZW1icmFuZVN5bnRoLmRlZmF1bHRzPXtwaXRjaERlY2F5Oi4wNSxvY3RhdmVzOjEwLG9zY2lsbGF0b3I6e3R5cGU6XCJzaW5lXCJ9LGVudmVsb3BlOnthdHRhY2s6LjAwMSxkZWNheTouNCxzdXN0YWluOi4wMSxyZWxlYXNlOjEuNCxhdHRhY2tDdXJ2ZTpcImV4cG9uZW50aWFsXCJ9fSx0Lk1lbWJyYW5lU3ludGgucHJvdG90eXBlLnRyaWdnZXJBdHRhY2s9ZnVuY3Rpb24odCxlLGkpe2U9dGhpcy50b1NlY29uZHMoZSk7dmFyIG49KHQ9dGhpcy50b0ZyZXF1ZW5jeSh0KSkqdGhpcy5vY3RhdmVzO3JldHVybiB0aGlzLm9zY2lsbGF0b3IuZnJlcXVlbmN5LnNldFZhbHVlQXRUaW1lKG4sZSksdGhpcy5vc2NpbGxhdG9yLmZyZXF1ZW5jeS5leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lKHQsZSt0aGlzLnRvU2Vjb25kcyh0aGlzLnBpdGNoRGVjYXkpKSx0aGlzLmVudmVsb3BlLnRyaWdnZXJBdHRhY2soZSxpKSx0aGlzLm9zY2lsbGF0b3Iuc3RhcnQoZSksMD09PXRoaXMuZW52ZWxvcGUuc3VzdGFpbiYmdGhpcy5vc2NpbGxhdG9yLnN0b3AoZSt0aGlzLmVudmVsb3BlLmF0dGFjayt0aGlzLmVudmVsb3BlLmRlY2F5KSx0aGlzfSx0Lk1lbWJyYW5lU3ludGgucHJvdG90eXBlLnRyaWdnZXJSZWxlYXNlPWZ1bmN0aW9uKHQpe3JldHVybiB0PXRoaXMudG9TZWNvbmRzKHQpLHRoaXMuZW52ZWxvcGUudHJpZ2dlclJlbGVhc2UodCksdGhpcy5vc2NpbGxhdG9yLnN0b3AodCt0aGlzLmVudmVsb3BlLnJlbGVhc2UpLHRoaXN9LHQuTWVtYnJhbmVTeW50aC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0Lkluc3RydW1lbnQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl93cml0YWJsZShbXCJvc2NpbGxhdG9yXCIsXCJlbnZlbG9wZVwiXSksdGhpcy5vc2NpbGxhdG9yLmRpc3Bvc2UoKSx0aGlzLm9zY2lsbGF0b3I9bnVsbCx0aGlzLmVudmVsb3BlLmRpc3Bvc2UoKSx0aGlzLmVudmVsb3BlPW51bGwsdGhpc30sdC5NZW1icmFuZVN5bnRofS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDM4KSxpKDEpLGkoNSksaSgyNSldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkZNU3ludGg9ZnVuY3Rpb24oZSl7ZT10LmRlZmF1bHRBcmcoZSx0LkZNU3ludGguZGVmYXVsdHMpLHQuTW9ub3Bob25pYy5jYWxsKHRoaXMsZSksdGhpcy5fY2Fycmllcj1uZXcgdC5TeW50aChlLmNhcnJpZXIpLHRoaXMuX2NhcnJpZXIudm9sdW1lLnZhbHVlPS0xMCx0aGlzLm9zY2lsbGF0b3I9dGhpcy5fY2Fycmllci5vc2NpbGxhdG9yLHRoaXMuZW52ZWxvcGU9dGhpcy5fY2Fycmllci5lbnZlbG9wZS5zZXQoZS5lbnZlbG9wZSksdGhpcy5fbW9kdWxhdG9yPW5ldyB0LlN5bnRoKGUubW9kdWxhdG9yKSx0aGlzLl9tb2R1bGF0b3Iudm9sdW1lLnZhbHVlPS0xMCx0aGlzLm1vZHVsYXRpb249dGhpcy5fbW9kdWxhdG9yLm9zY2lsbGF0b3Iuc2V0KGUubW9kdWxhdGlvbiksdGhpcy5tb2R1bGF0aW9uRW52ZWxvcGU9dGhpcy5fbW9kdWxhdG9yLmVudmVsb3BlLnNldChlLm1vZHVsYXRpb25FbnZlbG9wZSksdGhpcy5mcmVxdWVuY3k9bmV3IHQuU2lnbmFsKDQ0MCx0LlR5cGUuRnJlcXVlbmN5KSx0aGlzLmRldHVuZT1uZXcgdC5TaWduYWwoZS5kZXR1bmUsdC5UeXBlLkNlbnRzKSx0aGlzLmhhcm1vbmljaXR5PW5ldyB0Lk11bHRpcGx5KGUuaGFybW9uaWNpdHkpLHRoaXMuaGFybW9uaWNpdHkudW5pdHM9dC5UeXBlLlBvc2l0aXZlLHRoaXMubW9kdWxhdGlvbkluZGV4PW5ldyB0Lk11bHRpcGx5KGUubW9kdWxhdGlvbkluZGV4KSx0aGlzLm1vZHVsYXRpb25JbmRleC51bml0cz10LlR5cGUuUG9zaXRpdmUsdGhpcy5fbW9kdWxhdGlvbk5vZGU9bmV3IHQuR2FpbigwKSx0aGlzLmZyZXF1ZW5jeS5jb25uZWN0KHRoaXMuX2NhcnJpZXIuZnJlcXVlbmN5KSx0aGlzLmZyZXF1ZW5jeS5jaGFpbih0aGlzLmhhcm1vbmljaXR5LHRoaXMuX21vZHVsYXRvci5mcmVxdWVuY3kpLHRoaXMuZnJlcXVlbmN5LmNoYWluKHRoaXMubW9kdWxhdGlvbkluZGV4LHRoaXMuX21vZHVsYXRpb25Ob2RlKSx0aGlzLmRldHVuZS5mYW4odGhpcy5fY2Fycmllci5kZXR1bmUsdGhpcy5fbW9kdWxhdG9yLmRldHVuZSksdGhpcy5fbW9kdWxhdG9yLmNvbm5lY3QodGhpcy5fbW9kdWxhdGlvbk5vZGUuZ2FpbiksdGhpcy5fbW9kdWxhdGlvbk5vZGUuY29ubmVjdCh0aGlzLl9jYXJyaWVyLmZyZXF1ZW5jeSksdGhpcy5fY2Fycmllci5jb25uZWN0KHRoaXMub3V0cHV0KSx0aGlzLl9yZWFkT25seShbXCJmcmVxdWVuY3lcIixcImhhcm1vbmljaXR5XCIsXCJtb2R1bGF0aW9uSW5kZXhcIixcIm9zY2lsbGF0b3JcIixcImVudmVsb3BlXCIsXCJtb2R1bGF0aW9uXCIsXCJtb2R1bGF0aW9uRW52ZWxvcGVcIixcImRldHVuZVwiXSl9LHQuZXh0ZW5kKHQuRk1TeW50aCx0Lk1vbm9waG9uaWMpLHQuRk1TeW50aC5kZWZhdWx0cz17aGFybW9uaWNpdHk6Myxtb2R1bGF0aW9uSW5kZXg6MTAsZGV0dW5lOjAsb3NjaWxsYXRvcjp7dHlwZTpcInNpbmVcIn0sZW52ZWxvcGU6e2F0dGFjazouMDEsZGVjYXk6LjAxLHN1c3RhaW46MSxyZWxlYXNlOi41fSxtb2R1bGF0aW9uOnt0eXBlOlwic3F1YXJlXCJ9LG1vZHVsYXRpb25FbnZlbG9wZTp7YXR0YWNrOi41LGRlY2F5OjAsc3VzdGFpbjoxLHJlbGVhc2U6LjV9fSx0LkZNU3ludGgucHJvdG90eXBlLl90cmlnZ2VyRW52ZWxvcGVBdHRhY2s9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD10aGlzLnRvU2Vjb25kcyh0KSx0aGlzLl9jYXJyaWVyLl90cmlnZ2VyRW52ZWxvcGVBdHRhY2sodCxlKSx0aGlzLl9tb2R1bGF0b3IuX3RyaWdnZXJFbnZlbG9wZUF0dGFjayh0KSx0aGlzfSx0LkZNU3ludGgucHJvdG90eXBlLl90cmlnZ2VyRW52ZWxvcGVSZWxlYXNlPWZ1bmN0aW9uKHQpe3JldHVybiB0PXRoaXMudG9TZWNvbmRzKHQpLHRoaXMuX2NhcnJpZXIuX3RyaWdnZXJFbnZlbG9wZVJlbGVhc2UodCksdGhpcy5fbW9kdWxhdG9yLl90cmlnZ2VyRW52ZWxvcGVSZWxlYXNlKHQpLHRoaXN9LHQuRk1TeW50aC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0Lk1vbm9waG9uaWMucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl93cml0YWJsZShbXCJmcmVxdWVuY3lcIixcImhhcm1vbmljaXR5XCIsXCJtb2R1bGF0aW9uSW5kZXhcIixcIm9zY2lsbGF0b3JcIixcImVudmVsb3BlXCIsXCJtb2R1bGF0aW9uXCIsXCJtb2R1bGF0aW9uRW52ZWxvcGVcIixcImRldHVuZVwiXSksdGhpcy5fY2Fycmllci5kaXNwb3NlKCksdGhpcy5fY2Fycmllcj1udWxsLHRoaXMuX21vZHVsYXRvci5kaXNwb3NlKCksdGhpcy5fbW9kdWxhdG9yPW51bGwsdGhpcy5mcmVxdWVuY3kuZGlzcG9zZSgpLHRoaXMuZnJlcXVlbmN5PW51bGwsdGhpcy5kZXR1bmUuZGlzcG9zZSgpLHRoaXMuZGV0dW5lPW51bGwsdGhpcy5tb2R1bGF0aW9uSW5kZXguZGlzcG9zZSgpLHRoaXMubW9kdWxhdGlvbkluZGV4PW51bGwsdGhpcy5oYXJtb25pY2l0eS5kaXNwb3NlKCksdGhpcy5oYXJtb25pY2l0eT1udWxsLHRoaXMuX21vZHVsYXRpb25Ob2RlLmRpc3Bvc2UoKSx0aGlzLl9tb2R1bGF0aW9uTm9kZT1udWxsLHRoaXMub3NjaWxsYXRvcj1udWxsLHRoaXMuZW52ZWxvcGU9bnVsbCx0aGlzLm1vZHVsYXRpb25FbnZlbG9wZT1udWxsLHRoaXMubW9kdWxhdGlvbj1udWxsLHRoaXN9LHQuRk1TeW50aH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg2OCksaSgxMiksaSgxKSxpKDUpLGkoMjUpLGkoMTQpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5EdW9TeW50aD1mdW5jdGlvbihlKXtlPXQuZGVmYXVsdEFyZyhlLHQuRHVvU3ludGguZGVmYXVsdHMpLHQuTW9ub3Bob25pYy5jYWxsKHRoaXMsZSksdGhpcy52b2ljZTA9bmV3IHQuTW9ub1N5bnRoKGUudm9pY2UwKSx0aGlzLnZvaWNlMC52b2x1bWUudmFsdWU9LTEwLHRoaXMudm9pY2UxPW5ldyB0Lk1vbm9TeW50aChlLnZvaWNlMSksdGhpcy52b2ljZTEudm9sdW1lLnZhbHVlPS0xMCx0aGlzLl92aWJyYXRvPW5ldyB0LkxGTyhlLnZpYnJhdG9SYXRlLC01MCw1MCksdGhpcy5fdmlicmF0by5zdGFydCgpLHRoaXMudmlicmF0b1JhdGU9dGhpcy5fdmlicmF0by5mcmVxdWVuY3ksdGhpcy5fdmlicmF0b0dhaW49bmV3IHQuR2FpbihlLnZpYnJhdG9BbW91bnQsdC5UeXBlLlBvc2l0aXZlKSx0aGlzLnZpYnJhdG9BbW91bnQ9dGhpcy5fdmlicmF0b0dhaW4uZ2Fpbix0aGlzLmZyZXF1ZW5jeT1uZXcgdC5TaWduYWwoNDQwLHQuVHlwZS5GcmVxdWVuY3kpLHRoaXMuaGFybW9uaWNpdHk9bmV3IHQuTXVsdGlwbHkoZS5oYXJtb25pY2l0eSksdGhpcy5oYXJtb25pY2l0eS51bml0cz10LlR5cGUuUG9zaXRpdmUsdGhpcy5mcmVxdWVuY3kuY29ubmVjdCh0aGlzLnZvaWNlMC5mcmVxdWVuY3kpLHRoaXMuZnJlcXVlbmN5LmNoYWluKHRoaXMuaGFybW9uaWNpdHksdGhpcy52b2ljZTEuZnJlcXVlbmN5KSx0aGlzLl92aWJyYXRvLmNvbm5lY3QodGhpcy5fdmlicmF0b0dhaW4pLHRoaXMuX3ZpYnJhdG9HYWluLmZhbih0aGlzLnZvaWNlMC5kZXR1bmUsdGhpcy52b2ljZTEuZGV0dW5lKSx0aGlzLnZvaWNlMC5jb25uZWN0KHRoaXMub3V0cHV0KSx0aGlzLnZvaWNlMS5jb25uZWN0KHRoaXMub3V0cHV0KSx0aGlzLl9yZWFkT25seShbXCJ2b2ljZTBcIixcInZvaWNlMVwiLFwiZnJlcXVlbmN5XCIsXCJ2aWJyYXRvQW1vdW50XCIsXCJ2aWJyYXRvUmF0ZVwiXSl9LHQuZXh0ZW5kKHQuRHVvU3ludGgsdC5Nb25vcGhvbmljKSx0LkR1b1N5bnRoLmRlZmF1bHRzPXt2aWJyYXRvQW1vdW50Oi41LHZpYnJhdG9SYXRlOjUsaGFybW9uaWNpdHk6MS41LHZvaWNlMDp7dm9sdW1lOi0xMCxwb3J0YW1lbnRvOjAsb3NjaWxsYXRvcjp7dHlwZTpcInNpbmVcIn0sZmlsdGVyRW52ZWxvcGU6e2F0dGFjazouMDEsZGVjYXk6MCxzdXN0YWluOjEscmVsZWFzZTouNX0sZW52ZWxvcGU6e2F0dGFjazouMDEsZGVjYXk6MCxzdXN0YWluOjEscmVsZWFzZTouNX19LHZvaWNlMTp7dm9sdW1lOi0xMCxwb3J0YW1lbnRvOjAsb3NjaWxsYXRvcjp7dHlwZTpcInNpbmVcIn0sZmlsdGVyRW52ZWxvcGU6e2F0dGFjazouMDEsZGVjYXk6MCxzdXN0YWluOjEscmVsZWFzZTouNX0sZW52ZWxvcGU6e2F0dGFjazouMDEsZGVjYXk6MCxzdXN0YWluOjEscmVsZWFzZTouNX19fSx0LkR1b1N5bnRoLnByb3RvdHlwZS5fdHJpZ2dlckVudmVsb3BlQXR0YWNrPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9dGhpcy50b1NlY29uZHModCksdGhpcy52b2ljZTAuX3RyaWdnZXJFbnZlbG9wZUF0dGFjayh0LGUpLHRoaXMudm9pY2UxLl90cmlnZ2VyRW52ZWxvcGVBdHRhY2sodCxlKSx0aGlzfSx0LkR1b1N5bnRoLnByb3RvdHlwZS5fdHJpZ2dlckVudmVsb3BlUmVsZWFzZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy52b2ljZTAuX3RyaWdnZXJFbnZlbG9wZVJlbGVhc2UodCksdGhpcy52b2ljZTEuX3RyaWdnZXJFbnZlbG9wZVJlbGVhc2UodCksdGhpc30sdC5EdW9TeW50aC5wcm90b3R5cGUuZ2V0TGV2ZWxBdFRpbWU9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMudm9pY2UwLmdldExldmVsQXRUaW1lKHQpK3RoaXMudm9pY2UxLmdldExldmVsQXRUaW1lKHQpKS8yfSx0LkR1b1N5bnRoLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuTW9ub3Bob25pYy5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcInZvaWNlMFwiLFwidm9pY2UxXCIsXCJmcmVxdWVuY3lcIixcInZpYnJhdG9BbW91bnRcIixcInZpYnJhdG9SYXRlXCJdKSx0aGlzLnZvaWNlMC5kaXNwb3NlKCksdGhpcy52b2ljZTA9bnVsbCx0aGlzLnZvaWNlMS5kaXNwb3NlKCksdGhpcy52b2ljZTE9bnVsbCx0aGlzLmZyZXF1ZW5jeS5kaXNwb3NlKCksdGhpcy5mcmVxdWVuY3k9bnVsbCx0aGlzLl92aWJyYXRvR2Fpbi5kaXNwb3NlKCksdGhpcy5fdmlicmF0b0dhaW49bnVsbCx0aGlzLl92aWJyYXRvPW51bGwsdGhpcy5oYXJtb25pY2l0eS5kaXNwb3NlKCksdGhpcy5oYXJtb25pY2l0eT1udWxsLHRoaXMudmlicmF0b0Ftb3VudC5kaXNwb3NlKCksdGhpcy52aWJyYXRvQW1vdW50PW51bGwsdGhpcy52aWJyYXRvUmF0ZT1udWxsLHRoaXN9LHQuRHVvU3ludGh9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMzgpLGkoMSksaSg1KSxpKDI1KSxpKDIyKSxpKDMpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5BTVN5bnRoPWZ1bmN0aW9uKGUpe2U9dC5kZWZhdWx0QXJnKGUsdC5BTVN5bnRoLmRlZmF1bHRzKSx0Lk1vbm9waG9uaWMuY2FsbCh0aGlzLGUpLHRoaXMuX2NhcnJpZXI9bmV3IHQuU3ludGgsdGhpcy5fY2Fycmllci52b2x1bWUudmFsdWU9LTEwLHRoaXMub3NjaWxsYXRvcj10aGlzLl9jYXJyaWVyLm9zY2lsbGF0b3Iuc2V0KGUub3NjaWxsYXRvciksdGhpcy5lbnZlbG9wZT10aGlzLl9jYXJyaWVyLmVudmVsb3BlLnNldChlLmVudmVsb3BlKSx0aGlzLl9tb2R1bGF0b3I9bmV3IHQuU3ludGgsdGhpcy5fbW9kdWxhdG9yLnZvbHVtZS52YWx1ZT0tMTAsdGhpcy5tb2R1bGF0aW9uPXRoaXMuX21vZHVsYXRvci5vc2NpbGxhdG9yLnNldChlLm1vZHVsYXRpb24pLHRoaXMubW9kdWxhdGlvbkVudmVsb3BlPXRoaXMuX21vZHVsYXRvci5lbnZlbG9wZS5zZXQoZS5tb2R1bGF0aW9uRW52ZWxvcGUpLHRoaXMuZnJlcXVlbmN5PW5ldyB0LlNpZ25hbCg0NDAsdC5UeXBlLkZyZXF1ZW5jeSksdGhpcy5kZXR1bmU9bmV3IHQuU2lnbmFsKGUuZGV0dW5lLHQuVHlwZS5DZW50cyksdGhpcy5oYXJtb25pY2l0eT1uZXcgdC5NdWx0aXBseShlLmhhcm1vbmljaXR5KSx0aGlzLmhhcm1vbmljaXR5LnVuaXRzPXQuVHlwZS5Qb3NpdGl2ZSx0aGlzLl9tb2R1bGF0aW9uU2NhbGU9bmV3IHQuQXVkaW9Ub0dhaW4sdGhpcy5fbW9kdWxhdGlvbk5vZGU9bmV3IHQuR2Fpbix0aGlzLmZyZXF1ZW5jeS5jb25uZWN0KHRoaXMuX2NhcnJpZXIuZnJlcXVlbmN5KSx0aGlzLmZyZXF1ZW5jeS5jaGFpbih0aGlzLmhhcm1vbmljaXR5LHRoaXMuX21vZHVsYXRvci5mcmVxdWVuY3kpLHRoaXMuZGV0dW5lLmZhbih0aGlzLl9jYXJyaWVyLmRldHVuZSx0aGlzLl9tb2R1bGF0b3IuZGV0dW5lKSx0aGlzLl9tb2R1bGF0b3IuY2hhaW4odGhpcy5fbW9kdWxhdGlvblNjYWxlLHRoaXMuX21vZHVsYXRpb25Ob2RlLmdhaW4pLHRoaXMuX2NhcnJpZXIuY2hhaW4odGhpcy5fbW9kdWxhdGlvbk5vZGUsdGhpcy5vdXRwdXQpLHRoaXMuX3JlYWRPbmx5KFtcImZyZXF1ZW5jeVwiLFwiaGFybW9uaWNpdHlcIixcIm9zY2lsbGF0b3JcIixcImVudmVsb3BlXCIsXCJtb2R1bGF0aW9uXCIsXCJtb2R1bGF0aW9uRW52ZWxvcGVcIixcImRldHVuZVwiXSl9LHQuZXh0ZW5kKHQuQU1TeW50aCx0Lk1vbm9waG9uaWMpLHQuQU1TeW50aC5kZWZhdWx0cz17aGFybW9uaWNpdHk6MyxkZXR1bmU6MCxvc2NpbGxhdG9yOnt0eXBlOlwic2luZVwifSxlbnZlbG9wZTp7YXR0YWNrOi4wMSxkZWNheTouMDEsc3VzdGFpbjoxLHJlbGVhc2U6LjV9LG1vZHVsYXRpb246e3R5cGU6XCJzcXVhcmVcIn0sbW9kdWxhdGlvbkVudmVsb3BlOnthdHRhY2s6LjUsZGVjYXk6MCxzdXN0YWluOjEscmVsZWFzZTouNX19LHQuQU1TeW50aC5wcm90b3R5cGUuX3RyaWdnZXJFbnZlbG9wZUF0dGFjaz1mdW5jdGlvbih0LGUpe3JldHVybiB0PXRoaXMudG9TZWNvbmRzKHQpLHRoaXMuX2NhcnJpZXIuX3RyaWdnZXJFbnZlbG9wZUF0dGFjayh0LGUpLHRoaXMuX21vZHVsYXRvci5fdHJpZ2dlckVudmVsb3BlQXR0YWNrKHQpLHRoaXN9LHQuQU1TeW50aC5wcm90b3R5cGUuX3RyaWdnZXJFbnZlbG9wZVJlbGVhc2U9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NhcnJpZXIuX3RyaWdnZXJFbnZlbG9wZVJlbGVhc2UodCksdGhpcy5fbW9kdWxhdG9yLl90cmlnZ2VyRW52ZWxvcGVSZWxlYXNlKHQpLHRoaXN9LHQuQU1TeW50aC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0Lk1vbm9waG9uaWMucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl93cml0YWJsZShbXCJmcmVxdWVuY3lcIixcImhhcm1vbmljaXR5XCIsXCJvc2NpbGxhdG9yXCIsXCJlbnZlbG9wZVwiLFwibW9kdWxhdGlvblwiLFwibW9kdWxhdGlvbkVudmVsb3BlXCIsXCJkZXR1bmVcIl0pLHRoaXMuX2NhcnJpZXIuZGlzcG9zZSgpLHRoaXMuX2NhcnJpZXI9bnVsbCx0aGlzLl9tb2R1bGF0b3IuZGlzcG9zZSgpLHRoaXMuX21vZHVsYXRvcj1udWxsLHRoaXMuZnJlcXVlbmN5LmRpc3Bvc2UoKSx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXMuZGV0dW5lLmRpc3Bvc2UoKSx0aGlzLmRldHVuZT1udWxsLHRoaXMuaGFybW9uaWNpdHkuZGlzcG9zZSgpLHRoaXMuaGFybW9uaWNpdHk9bnVsbCx0aGlzLl9tb2R1bGF0aW9uU2NhbGUuZGlzcG9zZSgpLHRoaXMuX21vZHVsYXRpb25TY2FsZT1udWxsLHRoaXMuX21vZHVsYXRpb25Ob2RlLmRpc3Bvc2UoKSx0aGlzLl9tb2R1bGF0aW9uTm9kZT1udWxsLHRoaXMub3NjaWxsYXRvcj1udWxsLHRoaXMuZW52ZWxvcGU9bnVsbCx0aGlzLm1vZHVsYXRpb25FbnZlbG9wZT1udWxsLHRoaXMubW9kdWxhdGlvbj1udWxsLHRoaXN9LHQuQU1TeW50aH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg3MiksaSgxNildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlNlcXVlbmNlPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiY2FsbGJhY2tcIixcImV2ZW50c1wiLFwic3ViZGl2aXNpb25cIl0sdC5TZXF1ZW5jZSksaT1lLmV2ZW50cztpZihkZWxldGUgZS5ldmVudHMsdC5QYXJ0LmNhbGwodGhpcyxlKSx0aGlzLl9zdWJkaXZpc2lvbj10aGlzLnRvVGlja3MoZS5zdWJkaXZpc2lvbiksdC5pc1VuZGVmKGUubG9vcEVuZCkmJnQuaXNEZWZpbmVkKGkpJiYodGhpcy5fbG9vcEVuZD1pLmxlbmd0aCp0aGlzLl9zdWJkaXZpc2lvbiksdGhpcy5fbG9vcD0hMCx0LmlzRGVmaW5lZChpKSlmb3IodmFyIG49MDtuPGkubGVuZ3RoO24rKyl0aGlzLmFkZChuLGlbbl0pfSx0LmV4dGVuZCh0LlNlcXVlbmNlLHQuUGFydCksdC5TZXF1ZW5jZS5kZWZhdWx0cz17c3ViZGl2aXNpb246XCI0blwifSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5TZXF1ZW5jZS5wcm90b3R5cGUsXCJzdWJkaXZpc2lvblwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5UaWNrcyh0aGlzLl9zdWJkaXZpc2lvbikudG9TZWNvbmRzKCl9fSksdC5TZXF1ZW5jZS5wcm90b3R5cGUuYXQ9ZnVuY3Rpb24oZSxpKXtyZXR1cm4gdC5pc0FycmF5KGkpJiZ0aGlzLnJlbW92ZShlKSx0LlBhcnQucHJvdG90eXBlLmF0LmNhbGwodGhpcyx0aGlzLl9pbmRleFRpbWUoZSksaSl9LHQuU2VxdWVuY2UucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlLGkpe2lmKG51bGw9PT1pKXJldHVybiB0aGlzO2lmKHQuaXNBcnJheShpKSl7dmFyIG49TWF0aC5yb3VuZCh0aGlzLl9zdWJkaXZpc2lvbi9pLmxlbmd0aCk7aT1uZXcgdC5TZXF1ZW5jZSh0aGlzLl90aWNrLmJpbmQodGhpcyksaSx0LlRpY2tzKG4pKX1yZXR1cm4gdC5QYXJ0LnByb3RvdHlwZS5hZGQuY2FsbCh0aGlzLHRoaXMuX2luZGV4VGltZShlKSxpKSx0aGlzfSx0LlNlcXVlbmNlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oZSxpKXtyZXR1cm4gdC5QYXJ0LnByb3RvdHlwZS5yZW1vdmUuY2FsbCh0aGlzLHRoaXMuX2luZGV4VGltZShlKSxpKSx0aGlzfSx0LlNlcXVlbmNlLnByb3RvdHlwZS5faW5kZXhUaW1lPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgdC5UcmFuc3BvcnRUaW1lP2U6dC5UaWNrcyhlKnRoaXMuX3N1YmRpdmlzaW9uK3RoaXMuc3RhcnRPZmZzZXQpLnRvU2Vjb25kcygpfSx0LlNlcXVlbmNlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuUGFydC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXN9LHQuU2VxdWVuY2V9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNzMpLGkoODApXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtyZXR1cm4gdC5QYXR0ZXJuPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiY2FsbGJhY2tcIixcInZhbHVlc1wiLFwicGF0dGVyblwiXSx0LlBhdHRlcm4pO3QuTG9vcC5jYWxsKHRoaXMsZSksdGhpcy5fcGF0dGVybj1uZXcgdC5DdHJsUGF0dGVybih7dmFsdWVzOmUudmFsdWVzLHR5cGU6ZS5wYXR0ZXJuLGluZGV4OmUuaW5kZXh9KX0sdC5leHRlbmQodC5QYXR0ZXJuLHQuTG9vcCksdC5QYXR0ZXJuLmRlZmF1bHRzPXtwYXR0ZXJuOnQuQ3RybFBhdHRlcm4uVHlwZS5VcCxjYWxsYmFjazp0Lm5vT3AsdmFsdWVzOltdfSx0LlBhdHRlcm4ucHJvdG90eXBlLl90aWNrPWZ1bmN0aW9uKHQpe3RoaXMuY2FsbGJhY2sodCx0aGlzLl9wYXR0ZXJuLnZhbHVlKSx0aGlzLl9wYXR0ZXJuLm5leHQoKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGF0dGVybi5wcm90b3R5cGUsXCJpbmRleFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGF0dGVybi5pbmRleH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3BhdHRlcm4uaW5kZXg9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QYXR0ZXJuLnByb3RvdHlwZSxcInZhbHVlc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGF0dGVybi52YWx1ZXN9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9wYXR0ZXJuLnZhbHVlcz10fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlBhdHRlcm4ucHJvdG90eXBlLFwidmFsdWVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhdHRlcm4udmFsdWV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGF0dGVybi5wcm90b3R5cGUsXCJwYXR0ZXJuXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYXR0ZXJuLnR5cGV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9wYXR0ZXJuLnR5cGU9dH19KSx0LlBhdHRlcm4ucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0Lkxvb3AucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9wYXR0ZXJuLmRpc3Bvc2UoKSx0aGlzLl9wYXR0ZXJuPW51bGx9LHQuUGF0dGVybn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg4KSxpKDE4KSxpKDEyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuVmlicmF0bz1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcImZyZXF1ZW5jeVwiLFwiZGVwdGhcIl0sdC5WaWJyYXRvKTt0LkVmZmVjdC5jYWxsKHRoaXMsZSksdGhpcy5fZGVsYXlOb2RlPW5ldyB0LkRlbGF5KDAsZS5tYXhEZWxheSksdGhpcy5fbGZvPW5ldyB0LkxGTyh7dHlwZTplLnR5cGUsbWluOjAsbWF4OmUubWF4RGVsYXksZnJlcXVlbmN5OmUuZnJlcXVlbmN5LHBoYXNlOi05MH0pLnN0YXJ0KCkuY29ubmVjdCh0aGlzLl9kZWxheU5vZGUuZGVsYXlUaW1lKSx0aGlzLmZyZXF1ZW5jeT10aGlzLl9sZm8uZnJlcXVlbmN5LHRoaXMuZGVwdGg9dGhpcy5fbGZvLmFtcGxpdHVkZSx0aGlzLmRlcHRoLnZhbHVlPWUuZGVwdGgsdGhpcy5fcmVhZE9ubHkoW1wiZnJlcXVlbmN5XCIsXCJkZXB0aFwiXSksdGhpcy5lZmZlY3RTZW5kLmNoYWluKHRoaXMuX2RlbGF5Tm9kZSx0aGlzLmVmZmVjdFJldHVybil9LHQuZXh0ZW5kKHQuVmlicmF0byx0LkVmZmVjdCksdC5WaWJyYXRvLmRlZmF1bHRzPXttYXhEZWxheTouMDA1LGZyZXF1ZW5jeTo1LGRlcHRoOi4xLHR5cGU6XCJzaW5lXCJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlZpYnJhdG8ucHJvdG90eXBlLFwidHlwZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGZvLnR5cGV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9sZm8udHlwZT10fX0pLHQuVmlicmF0by5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3QuRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fZGVsYXlOb2RlLmRpc3Bvc2UoKSx0aGlzLl9kZWxheU5vZGU9bnVsbCx0aGlzLl9sZm8uZGlzcG9zZSgpLHRoaXMuX2xmbz1udWxsLHRoaXMuX3dyaXRhYmxlKFtcImZyZXF1ZW5jeVwiLFwiZGVwdGhcIl0pLHRoaXMuZnJlcXVlbmN5PW51bGwsdGhpcy5kZXB0aD1udWxsfSx0LlZpYnJhdG99LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMTIpLGkoMTUpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5UcmVtb2xvPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiZnJlcXVlbmN5XCIsXCJkZXB0aFwiXSx0LlRyZW1vbG8pO3QuU3RlcmVvRWZmZWN0LmNhbGwodGhpcyxlKSx0aGlzLl9sZm9MPW5ldyB0LkxGTyh7cGhhc2U6ZS5zcHJlYWQsbWluOjEsbWF4OjB9KSx0aGlzLl9sZm9SPW5ldyB0LkxGTyh7cGhhc2U6ZS5zcHJlYWQsbWluOjEsbWF4OjB9KSx0aGlzLl9hbXBsaXR1ZGVMPW5ldyB0LkdhaW4sdGhpcy5fYW1wbGl0dWRlUj1uZXcgdC5HYWluLHRoaXMuZnJlcXVlbmN5PW5ldyB0LlNpZ25hbChlLmZyZXF1ZW5jeSx0LlR5cGUuRnJlcXVlbmN5KSx0aGlzLmRlcHRoPW5ldyB0LlNpZ25hbChlLmRlcHRoLHQuVHlwZS5Ob3JtYWxSYW5nZSksdGhpcy5fcmVhZE9ubHkoW1wiZnJlcXVlbmN5XCIsXCJkZXB0aFwiXSksdGhpcy5lZmZlY3RTZW5kTC5jaGFpbih0aGlzLl9hbXBsaXR1ZGVMLHRoaXMuZWZmZWN0UmV0dXJuTCksdGhpcy5lZmZlY3RTZW5kUi5jaGFpbih0aGlzLl9hbXBsaXR1ZGVSLHRoaXMuZWZmZWN0UmV0dXJuUiksdGhpcy5fbGZvTC5jb25uZWN0KHRoaXMuX2FtcGxpdHVkZUwuZ2FpbiksdGhpcy5fbGZvUi5jb25uZWN0KHRoaXMuX2FtcGxpdHVkZVIuZ2FpbiksdGhpcy5mcmVxdWVuY3kuZmFuKHRoaXMuX2xmb0wuZnJlcXVlbmN5LHRoaXMuX2xmb1IuZnJlcXVlbmN5KSx0aGlzLmRlcHRoLmZhbih0aGlzLl9sZm9SLmFtcGxpdHVkZSx0aGlzLl9sZm9MLmFtcGxpdHVkZSksdGhpcy50eXBlPWUudHlwZSx0aGlzLnNwcmVhZD1lLnNwcmVhZH0sdC5leHRlbmQodC5UcmVtb2xvLHQuU3RlcmVvRWZmZWN0KSx0LlRyZW1vbG8uZGVmYXVsdHM9e2ZyZXF1ZW5jeToxMCx0eXBlOlwic2luZVwiLGRlcHRoOi41LHNwcmVhZDoxODB9LHQuVHJlbW9sby5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2xmb0wuc3RhcnQodCksdGhpcy5fbGZvUi5zdGFydCh0KSx0aGlzfSx0LlRyZW1vbG8ucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2xmb0wuc3RvcCh0KSx0aGlzLl9sZm9SLnN0b3AodCksdGhpc30sdC5UcmVtb2xvLnByb3RvdHlwZS5zeW5jPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9sZm9MLnN5bmMoZSksdGhpcy5fbGZvUi5zeW5jKGUpLHQuVHJhbnNwb3J0LnN5bmNTaWduYWwodGhpcy5mcmVxdWVuY3kpLHRoaXN9LHQuVHJlbW9sby5wcm90b3R5cGUudW5zeW5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xmb0wudW5zeW5jKCksdGhpcy5fbGZvUi51bnN5bmMoKSx0LlRyYW5zcG9ydC51bnN5bmNTaWduYWwodGhpcy5mcmVxdWVuY3kpLHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlRyZW1vbG8ucHJvdG90eXBlLFwidHlwZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGZvTC50eXBlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbGZvTC50eXBlPXQsdGhpcy5fbGZvUi50eXBlPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuVHJlbW9sby5wcm90b3R5cGUsXCJzcHJlYWRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xmb1IucGhhc2UtdGhpcy5fbGZvTC5waGFzZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2xmb0wucGhhc2U9OTAtdC8yLHRoaXMuX2xmb1IucGhhc2U9dC8yKzkwfX0pLHQuVHJlbW9sby5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LlN0ZXJlb0VmZmVjdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcImZyZXF1ZW5jeVwiLFwiZGVwdGhcIl0pLHRoaXMuX2xmb0wuZGlzcG9zZSgpLHRoaXMuX2xmb0w9bnVsbCx0aGlzLl9sZm9SLmRpc3Bvc2UoKSx0aGlzLl9sZm9SPW51bGwsdGhpcy5fYW1wbGl0dWRlTC5kaXNwb3NlKCksdGhpcy5fYW1wbGl0dWRlTD1udWxsLHRoaXMuX2FtcGxpdHVkZVIuZGlzcG9zZSgpLHRoaXMuX2FtcGxpdHVkZVI9bnVsbCx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXMuZGVwdGg9bnVsbCx0aGlzfSx0LlRyZW1vbG99LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNzUpLGkoMSksaSg1KSxpKDEzKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuU3RlcmVvV2lkZW5lcj1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcIndpZHRoXCJdLHQuU3RlcmVvV2lkZW5lcik7dC5NaWRTaWRlRWZmZWN0LmNhbGwodGhpcyxlKSx0aGlzLndpZHRoPW5ldyB0LlNpZ25hbChlLndpZHRoLHQuVHlwZS5Ob3JtYWxSYW5nZSksdGhpcy5fcmVhZE9ubHkoW1wid2lkdGhcIl0pLHRoaXMuX3R3b1RpbWVzV2lkdGhNaWQ9bmV3IHQuTXVsdGlwbHkoMiksdGhpcy5fdHdvVGltZXNXaWR0aFNpZGU9bmV3IHQuTXVsdGlwbHkoMiksdGhpcy5fbWlkTXVsdD1uZXcgdC5NdWx0aXBseSx0aGlzLl90d29UaW1lc1dpZHRoTWlkLmNvbm5lY3QodGhpcy5fbWlkTXVsdCwwLDEpLHRoaXMubWlkU2VuZC5jaGFpbih0aGlzLl9taWRNdWx0LHRoaXMubWlkUmV0dXJuKSx0aGlzLl9vbmVNaW51c1dpZHRoPW5ldyB0LlN1YnRyYWN0LHRoaXMuX29uZU1pbnVzV2lkdGguY29ubmVjdCh0aGlzLl90d29UaW1lc1dpZHRoTWlkKSx0aGlzLmNvbnRleHQuZ2V0Q29uc3RhbnQoMSkuY29ubmVjdCh0aGlzLl9vbmVNaW51c1dpZHRoLDAsMCksdGhpcy53aWR0aC5jb25uZWN0KHRoaXMuX29uZU1pbnVzV2lkdGgsMCwxKSx0aGlzLl9zaWRlTXVsdD1uZXcgdC5NdWx0aXBseSx0aGlzLndpZHRoLmNvbm5lY3QodGhpcy5fdHdvVGltZXNXaWR0aFNpZGUpLHRoaXMuX3R3b1RpbWVzV2lkdGhTaWRlLmNvbm5lY3QodGhpcy5fc2lkZU11bHQsMCwxKSx0aGlzLnNpZGVTZW5kLmNoYWluKHRoaXMuX3NpZGVNdWx0LHRoaXMuc2lkZVJldHVybil9LHQuZXh0ZW5kKHQuU3RlcmVvV2lkZW5lcix0Lk1pZFNpZGVFZmZlY3QpLHQuU3RlcmVvV2lkZW5lci5kZWZhdWx0cz17d2lkdGg6LjV9LHQuU3RlcmVvV2lkZW5lci5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0Lk1pZFNpZGVFZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl93cml0YWJsZShbXCJ3aWR0aFwiXSksdGhpcy53aWR0aC5kaXNwb3NlKCksdGhpcy53aWR0aD1udWxsLHRoaXMuX21pZE11bHQuZGlzcG9zZSgpLHRoaXMuX21pZE11bHQ9bnVsbCx0aGlzLl9zaWRlTXVsdC5kaXNwb3NlKCksdGhpcy5fc2lkZU11bHQ9bnVsbCx0aGlzLl90d29UaW1lc1dpZHRoTWlkLmRpc3Bvc2UoKSx0aGlzLl90d29UaW1lc1dpZHRoTWlkPW51bGwsdGhpcy5fdHdvVGltZXNXaWR0aFNpZGUuZGlzcG9zZSgpLHRoaXMuX3R3b1RpbWVzV2lkdGhTaWRlPW51bGwsdGhpcy5fb25lTWludXNXaWR0aC5kaXNwb3NlKCksdGhpcy5fb25lTWludXNXaWR0aD1udWxsLHRoaXN9LHQuU3RlcmVvV2lkZW5lcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxNSksaSgzMiksaSgzKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuU3RlcmVvRmVlZGJhY2tFZmZlY3Q9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJmZWVkYmFja1wiXSx0LkZlZWRiYWNrRWZmZWN0KTt0LlN0ZXJlb0VmZmVjdC5jYWxsKHRoaXMsZSksdGhpcy5mZWVkYmFjaz1uZXcgdC5TaWduYWwoZS5mZWVkYmFjayx0LlR5cGUuTm9ybWFsUmFuZ2UpLHRoaXMuX2ZlZWRiYWNrTD1uZXcgdC5HYWluLHRoaXMuX2ZlZWRiYWNrUj1uZXcgdC5HYWluLHRoaXMuZWZmZWN0UmV0dXJuTC5jaGFpbih0aGlzLl9mZWVkYmFja0wsdGhpcy5lZmZlY3RTZW5kTCksdGhpcy5lZmZlY3RSZXR1cm5SLmNoYWluKHRoaXMuX2ZlZWRiYWNrUix0aGlzLmVmZmVjdFNlbmRSKSx0aGlzLmZlZWRiYWNrLmZhbih0aGlzLl9mZWVkYmFja0wuZ2Fpbix0aGlzLl9mZWVkYmFja1IuZ2FpbiksdGhpcy5fcmVhZE9ubHkoW1wiZmVlZGJhY2tcIl0pfSx0LmV4dGVuZCh0LlN0ZXJlb0ZlZWRiYWNrRWZmZWN0LHQuU3RlcmVvRWZmZWN0KSx0LlN0ZXJlb0ZlZWRiYWNrRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU3RlcmVvRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fd3JpdGFibGUoW1wiZmVlZGJhY2tcIl0pLHRoaXMuZmVlZGJhY2suZGlzcG9zZSgpLHRoaXMuZmVlZGJhY2s9bnVsbCx0aGlzLl9mZWVkYmFja0wuZGlzcG9zZSgpLHRoaXMuX2ZlZWRiYWNrTD1udWxsLHRoaXMuX2ZlZWRiYWNrUi5kaXNwb3NlKCksdGhpcy5fZmVlZGJhY2tSPW51bGwsdGhpc30sdC5TdGVyZW9GZWVkYmFja0VmZmVjdH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg3OCksaSg5KSxpKDEwKSxpKDM5KSxpKDMpLGkoNzYpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5SZXZlcmI9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJkZWNheVwiXSx0LlJldmVyYik7dC5FZmZlY3QuY2FsbCh0aGlzLGUpLHRoaXMuX2NvbnZvbHZlcj10aGlzLmNvbnRleHQuY3JlYXRlQ29udm9sdmVyKCksdGhpcy5kZWNheT1lLmRlY2F5LHRoaXMucHJlRGVsYXk9ZS5wcmVEZWxheSx0aGlzLmNvbm5lY3RFZmZlY3QodGhpcy5fY29udm9sdmVyKX0sdC5leHRlbmQodC5SZXZlcmIsdC5FZmZlY3QpLHQuUmV2ZXJiLmRlZmF1bHRzPXtkZWNheToxLjUscHJlRGVsYXk6LjAxfSx0LlJldmVyYi5wcm90b3R5cGUuZ2VuZXJhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdC5PZmZsaW5lKGZ1bmN0aW9uKCl7dmFyIGU9bmV3IHQuTm9pc2UsaT1uZXcgdC5Ob2lzZSxuPW5ldyB0Lk1lcmdlO2UuY29ubmVjdChuLmxlZnQpLGkuY29ubmVjdChuLnJpZ2h0KTt2YXIgbz0obmV3IHQuR2FpbikudG9NYXN0ZXIoKTtuLmNvbm5lY3QobyksZS5zdGFydCgwKSxpLnN0YXJ0KDApLG8uZ2Fpbi5zZXRWYWx1ZUF0VGltZSgwLDApLG8uZ2Fpbi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSgxLHRoaXMucHJlRGVsYXkpLG8uZ2Fpbi5leHBvbmVudGlhbEFwcHJvYWNoVmFsdWVBdFRpbWUoMCx0aGlzLnByZURlbGF5LHRoaXMuZGVjYXktdGhpcy5wcmVEZWxheSl9LmJpbmQodGhpcyksdGhpcy5kZWNheSkudGhlbihmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY29udm9sdmVyLmJ1ZmZlcj10LmdldCgpLHRoaXN9LmJpbmQodGhpcykpfSx0LlJldmVyYi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkVmZmVjdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX2NvbnZvbHZlci5kaXNjb25uZWN0KCksdGhpcy5fY29udm9sdmVyPW51bGwsdGhpc30sdC5SZXZlcmJ9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMTIpLGkoMjMpLGkoMSksaSgzMiksaSgxOCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlBpdGNoU2hpZnQ9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJwaXRjaFwiXSx0LlBpdGNoU2hpZnQpO3QuRmVlZGJhY2tFZmZlY3QuY2FsbCh0aGlzLGUpLHRoaXMuX2ZyZXF1ZW5jeT1uZXcgdC5TaWduYWwoMCksdGhpcy5fZGVsYXlBPW5ldyB0LkRlbGF5KDAsMSksdGhpcy5fbGZvQT1uZXcgdC5MRk8oe21pbjowLG1heDouMSx0eXBlOlwic2F3dG9vdGhcIn0pLmNvbm5lY3QodGhpcy5fZGVsYXlBLmRlbGF5VGltZSksdGhpcy5fZGVsYXlCPW5ldyB0LkRlbGF5KDAsMSksdGhpcy5fbGZvQj1uZXcgdC5MRk8oe21pbjowLG1heDouMSx0eXBlOlwic2F3dG9vdGhcIixwaGFzZToxODB9KS5jb25uZWN0KHRoaXMuX2RlbGF5Qi5kZWxheVRpbWUpLHRoaXMuX2Nyb3NzRmFkZT1uZXcgdC5Dcm9zc0ZhZGUsdGhpcy5fY3Jvc3NGYWRlTEZPPW5ldyB0LkxGTyh7bWluOjAsbWF4OjEsdHlwZTpcInRyaWFuZ2xlXCIscGhhc2U6OTB9KS5jb25uZWN0KHRoaXMuX2Nyb3NzRmFkZS5mYWRlKSx0aGlzLl9mZWVkYmFja0RlbGF5PW5ldyB0LkRlbGF5KGUuZGVsYXlUaW1lKSx0aGlzLmRlbGF5VGltZT10aGlzLl9mZWVkYmFja0RlbGF5LmRlbGF5VGltZSx0aGlzLl9yZWFkT25seShcImRlbGF5VGltZVwiKSx0aGlzLl9waXRjaD1lLnBpdGNoLHRoaXMuX3dpbmRvd1NpemU9ZS53aW5kb3dTaXplLHRoaXMuX2RlbGF5QS5jb25uZWN0KHRoaXMuX2Nyb3NzRmFkZS5hKSx0aGlzLl9kZWxheUIuY29ubmVjdCh0aGlzLl9jcm9zc0ZhZGUuYiksdGhpcy5fZnJlcXVlbmN5LmZhbih0aGlzLl9sZm9BLmZyZXF1ZW5jeSx0aGlzLl9sZm9CLmZyZXF1ZW5jeSx0aGlzLl9jcm9zc0ZhZGVMRk8uZnJlcXVlbmN5KSx0aGlzLmVmZmVjdFNlbmQuZmFuKHRoaXMuX2RlbGF5QSx0aGlzLl9kZWxheUIpLHRoaXMuX2Nyb3NzRmFkZS5jaGFpbih0aGlzLl9mZWVkYmFja0RlbGF5LHRoaXMuZWZmZWN0UmV0dXJuKTt2YXIgaT10aGlzLm5vdygpO3RoaXMuX2xmb0Euc3RhcnQoaSksdGhpcy5fbGZvQi5zdGFydChpKSx0aGlzLl9jcm9zc0ZhZGVMRk8uc3RhcnQoaSksdGhpcy53aW5kb3dTaXplPXRoaXMuX3dpbmRvd1NpemV9LHQuZXh0ZW5kKHQuUGl0Y2hTaGlmdCx0LkZlZWRiYWNrRWZmZWN0KSx0LlBpdGNoU2hpZnQuZGVmYXVsdHM9e3BpdGNoOjAsd2luZG93U2l6ZTouMSxkZWxheVRpbWU6MCxmZWVkYmFjazowfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QaXRjaFNoaWZ0LnByb3RvdHlwZSxcInBpdGNoXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9waXRjaH0sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX3BpdGNoPWU7dmFyIGk9MDtlPDA/KHRoaXMuX2xmb0EubWluPTAsdGhpcy5fbGZvQS5tYXg9dGhpcy5fd2luZG93U2l6ZSx0aGlzLl9sZm9CLm1pbj0wLHRoaXMuX2xmb0IubWF4PXRoaXMuX3dpbmRvd1NpemUsaT10LmludGVydmFsVG9GcmVxdWVuY3lSYXRpbyhlLTEpKzEpOih0aGlzLl9sZm9BLm1pbj10aGlzLl93aW5kb3dTaXplLHRoaXMuX2xmb0EubWF4PTAsdGhpcy5fbGZvQi5taW49dGhpcy5fd2luZG93U2l6ZSx0aGlzLl9sZm9CLm1heD0wLGk9dC5pbnRlcnZhbFRvRnJlcXVlbmN5UmF0aW8oZSktMSksdGhpcy5fZnJlcXVlbmN5LnZhbHVlPWkqKDEuMi90aGlzLl93aW5kb3dTaXplKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QaXRjaFNoaWZ0LnByb3RvdHlwZSxcIndpbmRvd1NpemVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dpbmRvd1NpemV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl93aW5kb3dTaXplPXRoaXMudG9TZWNvbmRzKHQpLHRoaXMucGl0Y2g9dGhpcy5fcGl0Y2h9fSksdC5QaXRjaFNoaWZ0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuRmVlZGJhY2tFZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9mcmVxdWVuY3kuZGlzcG9zZSgpLHRoaXMuX2ZyZXF1ZW5jeT1udWxsLHRoaXMuX2RlbGF5QS5kaXNjb25uZWN0KCksdGhpcy5fZGVsYXlBPW51bGwsdGhpcy5fZGVsYXlCLmRpc2Nvbm5lY3QoKSx0aGlzLl9kZWxheUI9bnVsbCx0aGlzLl9sZm9BLmRpc3Bvc2UoKSx0aGlzLl9sZm9BPW51bGwsdGhpcy5fbGZvQi5kaXNwb3NlKCksdGhpcy5fbGZvQj1udWxsLHRoaXMuX2Nyb3NzRmFkZS5kaXNwb3NlKCksdGhpcy5fY3Jvc3NGYWRlPW51bGwsdGhpcy5fY3Jvc3NGYWRlTEZPLmRpc3Bvc2UoKSx0aGlzLl9jcm9zc0ZhZGVMRk89bnVsbCx0aGlzLl93cml0YWJsZShcImRlbGF5VGltZVwiKSx0aGlzLl9mZWVkYmFja0RlbGF5LmRpc3Bvc2UoKSx0aGlzLl9mZWVkYmFja0RlbGF5PW51bGwsdGhpcy5kZWxheVRpbWU9bnVsbCx0aGlzfSx0LlBpdGNoU2hpZnR9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNzQpLGkoMSksaSgxOCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LlBpbmdQb25nRGVsYXk9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJkZWxheVRpbWVcIixcImZlZWRiYWNrXCJdLHQuUGluZ1BvbmdEZWxheSk7dC5TdGVyZW9YRmVlZGJhY2tFZmZlY3QuY2FsbCh0aGlzLGUpLHRoaXMuX2xlZnREZWxheT1uZXcgdC5EZWxheSgwLGUubWF4RGVsYXlUaW1lKSx0aGlzLl9yaWdodERlbGF5PW5ldyB0LkRlbGF5KDAsZS5tYXhEZWxheVRpbWUpLHRoaXMuX3JpZ2h0UHJlRGVsYXk9bmV3IHQuRGVsYXkoMCxlLm1heERlbGF5VGltZSksdGhpcy5kZWxheVRpbWU9bmV3IHQuU2lnbmFsKGUuZGVsYXlUaW1lLHQuVHlwZS5UaW1lKSx0aGlzLmVmZmVjdFNlbmRMLmNoYWluKHRoaXMuX2xlZnREZWxheSx0aGlzLmVmZmVjdFJldHVybkwpLHRoaXMuZWZmZWN0U2VuZFIuY2hhaW4odGhpcy5fcmlnaHRQcmVEZWxheSx0aGlzLl9yaWdodERlbGF5LHRoaXMuZWZmZWN0UmV0dXJuUiksdGhpcy5kZWxheVRpbWUuZmFuKHRoaXMuX2xlZnREZWxheS5kZWxheVRpbWUsdGhpcy5fcmlnaHREZWxheS5kZWxheVRpbWUsdGhpcy5fcmlnaHRQcmVEZWxheS5kZWxheVRpbWUpLHRoaXMuX2ZlZWRiYWNrTFIuZGlzY29ubmVjdCgpLHRoaXMuX2ZlZWRiYWNrTFIuY29ubmVjdCh0aGlzLl9yaWdodERlbGF5KSx0aGlzLl9yZWFkT25seShbXCJkZWxheVRpbWVcIl0pfSx0LmV4dGVuZCh0LlBpbmdQb25nRGVsYXksdC5TdGVyZW9YRmVlZGJhY2tFZmZlY3QpLHQuUGluZ1BvbmdEZWxheS5kZWZhdWx0cz17ZGVsYXlUaW1lOi4yNSxtYXhEZWxheVRpbWU6MX0sdC5QaW5nUG9uZ0RlbGF5LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuU3RlcmVvWEZlZWRiYWNrRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fbGVmdERlbGF5LmRpc3Bvc2UoKSx0aGlzLl9sZWZ0RGVsYXk9bnVsbCx0aGlzLl9yaWdodERlbGF5LmRpc3Bvc2UoKSx0aGlzLl9yaWdodERlbGF5PW51bGwsdGhpcy5fcmlnaHRQcmVEZWxheS5kaXNwb3NlKCksdGhpcy5fcmlnaHRQcmVEZWxheT1udWxsLHRoaXMuX3dyaXRhYmxlKFtcImRlbGF5VGltZVwiXSksdGhpcy5kZWxheVRpbWUuZGlzcG9zZSgpLHRoaXMuZGVsYXlUaW1lPW51bGwsdGhpc30sdC5QaW5nUG9uZ0RlbGF5fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDEyKSxpKDkpLGkoMTUpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5QaGFzZXI9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJmcmVxdWVuY3lcIixcIm9jdGF2ZXNcIixcImJhc2VGcmVxdWVuY3lcIl0sdC5QaGFzZXIpO3QuU3RlcmVvRWZmZWN0LmNhbGwodGhpcyxlKSx0aGlzLl9sZm9MPW5ldyB0LkxGTyhlLmZyZXF1ZW5jeSwwLDEpLHRoaXMuX2xmb1I9bmV3IHQuTEZPKGUuZnJlcXVlbmN5LDAsMSksdGhpcy5fbGZvUi5waGFzZT0xODAsdGhpcy5fYmFzZUZyZXF1ZW5jeT1lLmJhc2VGcmVxdWVuY3ksdGhpcy5fb2N0YXZlcz1lLm9jdGF2ZXMsdGhpcy5RPW5ldyB0LlNpZ25hbChlLlEsdC5UeXBlLlBvc2l0aXZlKSx0aGlzLl9maWx0ZXJzTD10aGlzLl9tYWtlRmlsdGVycyhlLnN0YWdlcyx0aGlzLl9sZm9MLHRoaXMuUSksdGhpcy5fZmlsdGVyc1I9dGhpcy5fbWFrZUZpbHRlcnMoZS5zdGFnZXMsdGhpcy5fbGZvUix0aGlzLlEpLHRoaXMuZnJlcXVlbmN5PXRoaXMuX2xmb0wuZnJlcXVlbmN5LHRoaXMuZnJlcXVlbmN5LnZhbHVlPWUuZnJlcXVlbmN5LHRoaXMuZWZmZWN0U2VuZEwuY29ubmVjdCh0aGlzLl9maWx0ZXJzTFswXSksdGhpcy5lZmZlY3RTZW5kUi5jb25uZWN0KHRoaXMuX2ZpbHRlcnNSWzBdKSx0aGlzLl9maWx0ZXJzTFtlLnN0YWdlcy0xXS5jb25uZWN0KHRoaXMuZWZmZWN0UmV0dXJuTCksdGhpcy5fZmlsdGVyc1JbZS5zdGFnZXMtMV0uY29ubmVjdCh0aGlzLmVmZmVjdFJldHVyblIpLHRoaXMuX2xmb0wuZnJlcXVlbmN5LmNvbm5lY3QodGhpcy5fbGZvUi5mcmVxdWVuY3kpLHRoaXMuYmFzZUZyZXF1ZW5jeT1lLmJhc2VGcmVxdWVuY3ksdGhpcy5vY3RhdmVzPWUub2N0YXZlcyx0aGlzLl9sZm9MLnN0YXJ0KCksdGhpcy5fbGZvUi5zdGFydCgpLHRoaXMuX3JlYWRPbmx5KFtcImZyZXF1ZW5jeVwiLFwiUVwiXSl9LHQuZXh0ZW5kKHQuUGhhc2VyLHQuU3RlcmVvRWZmZWN0KSx0LlBoYXNlci5kZWZhdWx0cz17ZnJlcXVlbmN5Oi41LG9jdGF2ZXM6MyxzdGFnZXM6MTAsUToxMCxiYXNlRnJlcXVlbmN5OjM1MH0sdC5QaGFzZXIucHJvdG90eXBlLl9tYWtlRmlsdGVycz1mdW5jdGlvbihlLGksbil7Zm9yKHZhciBvPW5ldyBBcnJheShlKSxzPTA7czxlO3MrKyl7dmFyIHI9dGhpcy5jb250ZXh0LmNyZWF0ZUJpcXVhZEZpbHRlcigpO3IudHlwZT1cImFsbHBhc3NcIixuLmNvbm5lY3Qoci5RKSxpLmNvbm5lY3Qoci5mcmVxdWVuY3kpLG9bc109cn1yZXR1cm4gdC5jb25uZWN0U2VyaWVzLmFwcGx5KHQsbyksb30sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGhhc2VyLnByb3RvdHlwZSxcIm9jdGF2ZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29jdGF2ZXN9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9vY3RhdmVzPXQ7dmFyIGU9dGhpcy5fYmFzZUZyZXF1ZW5jeSpNYXRoLnBvdygyLHQpO3RoaXMuX2xmb0wubWF4PWUsdGhpcy5fbGZvUi5tYXg9ZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QaGFzZXIucHJvdG90eXBlLFwiYmFzZUZyZXF1ZW5jeVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFzZUZyZXF1ZW5jeX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2Jhc2VGcmVxdWVuY3k9dCx0aGlzLl9sZm9MLm1pbj10LHRoaXMuX2xmb1IubWluPXQsdGhpcy5vY3RhdmVzPXRoaXMuX29jdGF2ZXN9fSksdC5QaGFzZXIucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0LlN0ZXJlb0VmZmVjdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcImZyZXF1ZW5jeVwiLFwiUVwiXSksdGhpcy5RLmRpc3Bvc2UoKSx0aGlzLlE9bnVsbCx0aGlzLl9sZm9MLmRpc3Bvc2UoKSx0aGlzLl9sZm9MPW51bGwsdGhpcy5fbGZvUi5kaXNwb3NlKCksdGhpcy5fbGZvUj1udWxsO2Zvcih2YXIgZT0wO2U8dGhpcy5fZmlsdGVyc0wubGVuZ3RoO2UrKyl0aGlzLl9maWx0ZXJzTFtlXS5kaXNjb25uZWN0KCksdGhpcy5fZmlsdGVyc0xbZV09bnVsbDt0aGlzLl9maWx0ZXJzTD1udWxsO2Zvcih2YXIgaT0wO2k8dGhpcy5fZmlsdGVyc1IubGVuZ3RoO2krKyl0aGlzLl9maWx0ZXJzUltpXS5kaXNjb25uZWN0KCksdGhpcy5fZmlsdGVyc1JbaV09bnVsbDtyZXR1cm4gdGhpcy5fZmlsdGVyc1I9bnVsbCx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXN9LHQuUGhhc2VyfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDU4KSxpKDE1KSxpKDI2KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGU9Wy4wNjc0OCwuMDY0MDQsLjA4MjEyLC4wOTAwNF0saT1bLjc3MywuODAyLC43NTMsLjczM10sbj1bMzQ3LDExMywzN107cmV0dXJuIHQuSkNSZXZlcmI9ZnVuY3Rpb24oKXt2YXIgbz10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJyb29tU2l6ZVwiXSx0LkpDUmV2ZXJiKTt0LlN0ZXJlb0VmZmVjdC5jYWxsKHRoaXMsbyksdGhpcy5yb29tU2l6ZT1uZXcgdC5TaWduYWwoby5yb29tU2l6ZSx0LlR5cGUuTm9ybWFsUmFuZ2UpLHRoaXMuX3NjYWxlUm9vbVNpemU9bmV3IHQuU2NhbGUoLS43MzMsLjE5NyksdGhpcy5fYWxscGFzc0ZpbHRlcnM9W10sdGhpcy5fZmVlZGJhY2tDb21iRmlsdGVycz1bXTtmb3IodmFyIHM9MDtzPG4ubGVuZ3RoO3MrKyl7dmFyIHI9dGhpcy5jb250ZXh0LmNyZWF0ZUJpcXVhZEZpbHRlcigpO3IudHlwZT1cImFsbHBhc3NcIixyLmZyZXF1ZW5jeS52YWx1ZT1uW3NdLHRoaXMuX2FsbHBhc3NGaWx0ZXJzLnB1c2gocil9Zm9yKHZhciBhPTA7YTxlLmxlbmd0aDthKyspe3ZhciBsPW5ldyB0LkZlZWRiYWNrQ29tYkZpbHRlcihlW2FdLC4xKTt0aGlzLl9zY2FsZVJvb21TaXplLmNvbm5lY3QobC5yZXNvbmFuY2UpLGwucmVzb25hbmNlLnZhbHVlPWlbYV0sdGhpcy5fYWxscGFzc0ZpbHRlcnNbdGhpcy5fYWxscGFzc0ZpbHRlcnMubGVuZ3RoLTFdLmNvbm5lY3QobCksYTxlLmxlbmd0aC8yP2wuY29ubmVjdCh0aGlzLmVmZmVjdFJldHVybkwpOmwuY29ubmVjdCh0aGlzLmVmZmVjdFJldHVyblIpLHRoaXMuX2ZlZWRiYWNrQ29tYkZpbHRlcnMucHVzaChsKX10aGlzLnJvb21TaXplLmNvbm5lY3QodGhpcy5fc2NhbGVSb29tU2l6ZSksdC5jb25uZWN0U2VyaWVzLmFwcGx5KHQsdGhpcy5fYWxscGFzc0ZpbHRlcnMpLHRoaXMuZWZmZWN0U2VuZEwuY29ubmVjdCh0aGlzLl9hbGxwYXNzRmlsdGVyc1swXSksdGhpcy5lZmZlY3RTZW5kUi5jb25uZWN0KHRoaXMuX2FsbHBhc3NGaWx0ZXJzWzBdKSx0aGlzLl9yZWFkT25seShbXCJyb29tU2l6ZVwiXSl9LHQuZXh0ZW5kKHQuSkNSZXZlcmIsdC5TdGVyZW9FZmZlY3QpLHQuSkNSZXZlcmIuZGVmYXVsdHM9e3Jvb21TaXplOi41fSx0LkpDUmV2ZXJiLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dC5TdGVyZW9FZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtmb3IodmFyIGU9MDtlPHRoaXMuX2FsbHBhc3NGaWx0ZXJzLmxlbmd0aDtlKyspdGhpcy5fYWxscGFzc0ZpbHRlcnNbZV0uZGlzY29ubmVjdCgpLHRoaXMuX2FsbHBhc3NGaWx0ZXJzW2VdPW51bGw7dGhpcy5fYWxscGFzc0ZpbHRlcnM9bnVsbDtmb3IodmFyIGk9MDtpPHRoaXMuX2ZlZWRiYWNrQ29tYkZpbHRlcnMubGVuZ3RoO2krKyl0aGlzLl9mZWVkYmFja0NvbWJGaWx0ZXJzW2ldLmRpc3Bvc2UoKSx0aGlzLl9mZWVkYmFja0NvbWJGaWx0ZXJzW2ldPW51bGw7cmV0dXJuIHRoaXMuX2ZlZWRiYWNrQ29tYkZpbHRlcnM9bnVsbCx0aGlzLl93cml0YWJsZShbXCJyb29tU2l6ZVwiXSksdGhpcy5yb29tU2l6ZS5kaXNwb3NlKCksdGhpcy5yb29tU2l6ZT1udWxsLHRoaXMuX3NjYWxlUm9vbVNpemUuZGlzcG9zZSgpLHRoaXMuX3NjYWxlUm9vbVNpemU9bnVsbCx0aGlzfSx0LkpDUmV2ZXJifS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDUzKSxpKDE1KSxpKDEpLGkoMTkpLGkoMTApLGkoNDIpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjt2YXIgZT1bMTU1Ny80NDEwMCwxNjE3LzQ0MTAwLDE0OTEvNDQxMDAsMTQyMi80NDEwMCwxMjc3LzQ0MTAwLDEzNTYvNDQxMDAsMTE4OC80NDEwMCwxMTE2LzQ0MTAwXSxpPVsyMjUsNTU2LDQ0MSwzNDFdO3JldHVybiB0LkZyZWV2ZXJiPWZ1bmN0aW9uKCl7dmFyIG49dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wicm9vbVNpemVcIixcImRhbXBlbmluZ1wiXSx0LkZyZWV2ZXJiKTt0LlN0ZXJlb0VmZmVjdC5jYWxsKHRoaXMsbiksdGhpcy5yb29tU2l6ZT1uZXcgdC5TaWduYWwobi5yb29tU2l6ZSx0LlR5cGUuTm9ybWFsUmFuZ2UpLHRoaXMuZGFtcGVuaW5nPW5ldyB0LlNpZ25hbChuLmRhbXBlbmluZyx0LlR5cGUuRnJlcXVlbmN5KSx0aGlzLl9jb21iRmlsdGVycz1bXSx0aGlzLl9hbGxwYXNzRmlsdGVyc0w9W10sdGhpcy5fYWxscGFzc0ZpbHRlcnNSPVtdO2Zvcih2YXIgbz0wO288aS5sZW5ndGg7bysrKXt2YXIgcz10aGlzLmNvbnRleHQuY3JlYXRlQmlxdWFkRmlsdGVyKCk7cy50eXBlPVwiYWxscGFzc1wiLHMuZnJlcXVlbmN5LnZhbHVlPWlbb10sdGhpcy5fYWxscGFzc0ZpbHRlcnNMLnB1c2gocyl9Zm9yKHZhciByPTA7cjxpLmxlbmd0aDtyKyspe3ZhciBhPXRoaXMuY29udGV4dC5jcmVhdGVCaXF1YWRGaWx0ZXIoKTthLnR5cGU9XCJhbGxwYXNzXCIsYS5mcmVxdWVuY3kudmFsdWU9aVtyXSx0aGlzLl9hbGxwYXNzRmlsdGVyc1IucHVzaChhKX1mb3IodmFyIGw9MDtsPGUubGVuZ3RoO2wrKyl7dmFyIGg9bmV3IHQuTG93cGFzc0NvbWJGaWx0ZXIoZVtsXSk7bDxlLmxlbmd0aC8yP3RoaXMuZWZmZWN0U2VuZEwuY2hhaW4oaCx0aGlzLl9hbGxwYXNzRmlsdGVyc0xbMF0pOnRoaXMuZWZmZWN0U2VuZFIuY2hhaW4oaCx0aGlzLl9hbGxwYXNzRmlsdGVyc1JbMF0pLHRoaXMucm9vbVNpemUuY29ubmVjdChoLnJlc29uYW5jZSksdGhpcy5kYW1wZW5pbmcuY29ubmVjdChoLmRhbXBlbmluZyksdGhpcy5fY29tYkZpbHRlcnMucHVzaChoKX10LmNvbm5lY3RTZXJpZXMuYXBwbHkodCx0aGlzLl9hbGxwYXNzRmlsdGVyc0wpLHQuY29ubmVjdFNlcmllcy5hcHBseSh0LHRoaXMuX2FsbHBhc3NGaWx0ZXJzUiksdGhpcy5fYWxscGFzc0ZpbHRlcnNMW3RoaXMuX2FsbHBhc3NGaWx0ZXJzTC5sZW5ndGgtMV0uY29ubmVjdCh0aGlzLmVmZmVjdFJldHVybkwpLHRoaXMuX2FsbHBhc3NGaWx0ZXJzUlt0aGlzLl9hbGxwYXNzRmlsdGVyc1IubGVuZ3RoLTFdLmNvbm5lY3QodGhpcy5lZmZlY3RSZXR1cm5SKSx0aGlzLl9yZWFkT25seShbXCJyb29tU2l6ZVwiLFwiZGFtcGVuaW5nXCJdKX0sdC5leHRlbmQodC5GcmVldmVyYix0LlN0ZXJlb0VmZmVjdCksdC5GcmVldmVyYi5kZWZhdWx0cz17cm9vbVNpemU6LjcsZGFtcGVuaW5nOjNlM30sdC5GcmVldmVyYi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3QuU3RlcmVvRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7Zm9yKHZhciBlPTA7ZTx0aGlzLl9hbGxwYXNzRmlsdGVyc0wubGVuZ3RoO2UrKyl0aGlzLl9hbGxwYXNzRmlsdGVyc0xbZV0uZGlzY29ubmVjdCgpLHRoaXMuX2FsbHBhc3NGaWx0ZXJzTFtlXT1udWxsO3RoaXMuX2FsbHBhc3NGaWx0ZXJzTD1udWxsO2Zvcih2YXIgaT0wO2k8dGhpcy5fYWxscGFzc0ZpbHRlcnNSLmxlbmd0aDtpKyspdGhpcy5fYWxscGFzc0ZpbHRlcnNSW2ldLmRpc2Nvbm5lY3QoKSx0aGlzLl9hbGxwYXNzRmlsdGVyc1JbaV09bnVsbDt0aGlzLl9hbGxwYXNzRmlsdGVyc1I9bnVsbDtmb3IodmFyIG49MDtuPHRoaXMuX2NvbWJGaWx0ZXJzLmxlbmd0aDtuKyspdGhpcy5fY29tYkZpbHRlcnNbbl0uZGlzcG9zZSgpLHRoaXMuX2NvbWJGaWx0ZXJzW25dPW51bGw7cmV0dXJuIHRoaXMuX2NvbWJGaWx0ZXJzPW51bGwsdGhpcy5fd3JpdGFibGUoW1wicm9vbVNpemVcIixcImRhbXBlbmluZ1wiXSksdGhpcy5yb29tU2l6ZS5kaXNwb3NlKCksdGhpcy5yb29tU2l6ZT1udWxsLHRoaXMuZGFtcGVuaW5nLmRpc3Bvc2UoKSx0aGlzLmRhbXBlbmluZz1udWxsLHRoaXN9LHQuRnJlZXZlcmJ9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMzIpLGkoMSksaSgxOCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkZlZWRiYWNrRGVsYXk9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJkZWxheVRpbWVcIixcImZlZWRiYWNrXCJdLHQuRmVlZGJhY2tEZWxheSk7dC5GZWVkYmFja0VmZmVjdC5jYWxsKHRoaXMsZSksdGhpcy5fZGVsYXlOb2RlPW5ldyB0LkRlbGF5KGUuZGVsYXlUaW1lLGUubWF4RGVsYXkpLHRoaXMuZGVsYXlUaW1lPXRoaXMuX2RlbGF5Tm9kZS5kZWxheVRpbWUsdGhpcy5jb25uZWN0RWZmZWN0KHRoaXMuX2RlbGF5Tm9kZSksdGhpcy5fcmVhZE9ubHkoW1wiZGVsYXlUaW1lXCJdKX0sdC5leHRlbmQodC5GZWVkYmFja0RlbGF5LHQuRmVlZGJhY2tFZmZlY3QpLHQuRmVlZGJhY2tEZWxheS5kZWZhdWx0cz17ZGVsYXlUaW1lOi4yNSxtYXhEZWxheToxfSx0LkZlZWRiYWNrRGVsYXkucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5GZWVkYmFja0VmZmVjdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX2RlbGF5Tm9kZS5kaXNwb3NlKCksdGhpcy5fZGVsYXlOb2RlPW51bGwsdGhpcy5fd3JpdGFibGUoW1wiZGVsYXlUaW1lXCJdKSx0aGlzLmRlbGF5VGltZT1udWxsLHRoaXN9LHQuRmVlZGJhY2tEZWxheX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg4KSxpKDcpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5EaXN0b3J0aW9uPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiZGlzdG9ydGlvblwiXSx0LkRpc3RvcnRpb24pO3QuRWZmZWN0LmNhbGwodGhpcyxlKSx0aGlzLl9zaGFwZXI9bmV3IHQuV2F2ZVNoYXBlcig0MDk2KSx0aGlzLl9kaXN0b3J0aW9uPWUuZGlzdG9ydGlvbix0aGlzLmNvbm5lY3RFZmZlY3QodGhpcy5fc2hhcGVyKSx0aGlzLmRpc3RvcnRpb249ZS5kaXN0b3J0aW9uLHRoaXMub3ZlcnNhbXBsZT1lLm92ZXJzYW1wbGV9LHQuZXh0ZW5kKHQuRGlzdG9ydGlvbix0LkVmZmVjdCksdC5EaXN0b3J0aW9uLmRlZmF1bHRzPXtkaXN0b3J0aW9uOi40LG92ZXJzYW1wbGU6XCJub25lXCJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkRpc3RvcnRpb24ucHJvdG90eXBlLFwiZGlzdG9ydGlvblwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzdG9ydGlvbn0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2Rpc3RvcnRpb249dDt2YXIgZT0xMDAqdCxpPU1hdGguUEkvMTgwO3RoaXMuX3NoYXBlci5zZXRNYXAoZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguYWJzKHQpPC4wMDE/MDooMytlKSp0KjIwKmkvKE1hdGguUEkrZSpNYXRoLmFicyh0KSl9KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5EaXN0b3J0aW9uLnByb3RvdHlwZSxcIm92ZXJzYW1wbGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NoYXBlci5vdmVyc2FtcGxlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fc2hhcGVyLm92ZXJzYW1wbGU9dH19KSx0LkRpc3RvcnRpb24ucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5FZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9zaGFwZXIuZGlzcG9zZSgpLHRoaXMuX3NoYXBlcj1udWxsLHRoaXN9LHQuRGlzdG9ydGlvbn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxMiksaSgxNSksaSgxOCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkNob3J1cz1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcImZyZXF1ZW5jeVwiLFwiZGVsYXlUaW1lXCIsXCJkZXB0aFwiXSx0LkNob3J1cyk7dC5TdGVyZW9FZmZlY3QuY2FsbCh0aGlzLGUpLHRoaXMuX2RlcHRoPWUuZGVwdGgsdGhpcy5fZGVsYXlUaW1lPWUuZGVsYXlUaW1lLzFlMyx0aGlzLl9sZm9MPW5ldyB0LkxGTyh7ZnJlcXVlbmN5OmUuZnJlcXVlbmN5LG1pbjowLG1heDoxfSksdGhpcy5fbGZvUj1uZXcgdC5MRk8oe2ZyZXF1ZW5jeTplLmZyZXF1ZW5jeSxtaW46MCxtYXg6MSxwaGFzZToxODB9KSx0aGlzLl9kZWxheU5vZGVMPW5ldyB0LkRlbGF5LHRoaXMuX2RlbGF5Tm9kZVI9bmV3IHQuRGVsYXksdGhpcy5mcmVxdWVuY3k9dGhpcy5fbGZvTC5mcmVxdWVuY3ksdGhpcy5lZmZlY3RTZW5kTC5jaGFpbih0aGlzLl9kZWxheU5vZGVMLHRoaXMuZWZmZWN0UmV0dXJuTCksdGhpcy5lZmZlY3RTZW5kUi5jaGFpbih0aGlzLl9kZWxheU5vZGVSLHRoaXMuZWZmZWN0UmV0dXJuUiksdGhpcy5lZmZlY3RTZW5kTC5jb25uZWN0KHRoaXMuZWZmZWN0UmV0dXJuTCksdGhpcy5lZmZlY3RTZW5kUi5jb25uZWN0KHRoaXMuZWZmZWN0UmV0dXJuUiksdGhpcy5fbGZvTC5jb25uZWN0KHRoaXMuX2RlbGF5Tm9kZUwuZGVsYXlUaW1lKSx0aGlzLl9sZm9SLmNvbm5lY3QodGhpcy5fZGVsYXlOb2RlUi5kZWxheVRpbWUpLHRoaXMuX2xmb0wuc3RhcnQoKSx0aGlzLl9sZm9SLnN0YXJ0KCksdGhpcy5fbGZvTC5mcmVxdWVuY3kuY29ubmVjdCh0aGlzLl9sZm9SLmZyZXF1ZW5jeSksdGhpcy5kZXB0aD10aGlzLl9kZXB0aCx0aGlzLmZyZXF1ZW5jeS52YWx1ZT1lLmZyZXF1ZW5jeSx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuX3JlYWRPbmx5KFtcImZyZXF1ZW5jeVwiXSksdGhpcy5zcHJlYWQ9ZS5zcHJlYWR9LHQuZXh0ZW5kKHQuQ2hvcnVzLHQuU3RlcmVvRWZmZWN0KSx0LkNob3J1cy5kZWZhdWx0cz17ZnJlcXVlbmN5OjEuNSxkZWxheVRpbWU6My41LGRlcHRoOi43LHR5cGU6XCJzaW5lXCIsc3ByZWFkOjE4MH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQ2hvcnVzLnByb3RvdHlwZSxcImRlcHRoXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZXB0aH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2RlcHRoPXQ7dmFyIGU9dGhpcy5fZGVsYXlUaW1lKnQ7dGhpcy5fbGZvTC5taW49TWF0aC5tYXgodGhpcy5fZGVsYXlUaW1lLWUsMCksdGhpcy5fbGZvTC5tYXg9dGhpcy5fZGVsYXlUaW1lK2UsdGhpcy5fbGZvUi5taW49TWF0aC5tYXgodGhpcy5fZGVsYXlUaW1lLWUsMCksdGhpcy5fbGZvUi5tYXg9dGhpcy5fZGVsYXlUaW1lK2V9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQ2hvcnVzLnByb3RvdHlwZSxcImRlbGF5VGltZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMWUzKnRoaXMuX2RlbGF5VGltZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2RlbGF5VGltZT10LzFlMyx0aGlzLmRlcHRoPXRoaXMuX2RlcHRofX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkNob3J1cy5wcm90b3R5cGUsXCJ0eXBlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sZm9MLnR5cGV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9sZm9MLnR5cGU9dCx0aGlzLl9sZm9SLnR5cGU9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5DaG9ydXMucHJvdG90eXBlLFwic3ByZWFkXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sZm9SLnBoYXNlLXRoaXMuX2xmb0wucGhhc2V9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9sZm9MLnBoYXNlPTkwLXQvMix0aGlzLl9sZm9SLnBoYXNlPXQvMis5MH19KSx0LkNob3J1cy5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LlN0ZXJlb0VmZmVjdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX2xmb0wuZGlzcG9zZSgpLHRoaXMuX2xmb0w9bnVsbCx0aGlzLl9sZm9SLmRpc3Bvc2UoKSx0aGlzLl9sZm9SPW51bGwsdGhpcy5fZGVsYXlOb2RlTC5kaXNwb3NlKCksdGhpcy5fZGVsYXlOb2RlTD1udWxsLHRoaXMuX2RlbGF5Tm9kZVIuZGlzcG9zZSgpLHRoaXMuX2RlbGF5Tm9kZVI9bnVsbCx0aGlzLl93cml0YWJsZShcImZyZXF1ZW5jeVwiKSx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXN9LHQuQ2hvcnVzfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDgpLGkoNyldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkNoZWJ5c2hldj1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcIm9yZGVyXCJdLHQuQ2hlYnlzaGV2KTt0LkVmZmVjdC5jYWxsKHRoaXMsZSksdGhpcy5fc2hhcGVyPW5ldyB0LldhdmVTaGFwZXIoNDA5NiksdGhpcy5fb3JkZXI9ZS5vcmRlcix0aGlzLmNvbm5lY3RFZmZlY3QodGhpcy5fc2hhcGVyKSx0aGlzLm9yZGVyPWUub3JkZXIsdGhpcy5vdmVyc2FtcGxlPWUub3ZlcnNhbXBsZX0sdC5leHRlbmQodC5DaGVieXNoZXYsdC5FZmZlY3QpLHQuQ2hlYnlzaGV2LmRlZmF1bHRzPXtvcmRlcjoxLG92ZXJzYW1wbGU6XCJub25lXCJ9LHQuQ2hlYnlzaGV2LnByb3RvdHlwZS5fZ2V0Q29lZmZpY2llbnQ9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBpLmhhc093blByb3BlcnR5KGUpP2lbZV06KGlbZV09MD09PWU/MDoxPT09ZT90OjIqdCp0aGlzLl9nZXRDb2VmZmljaWVudCh0LGUtMSxpKS10aGlzLl9nZXRDb2VmZmljaWVudCh0LGUtMixpKSxpW2VdKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQ2hlYnlzaGV2LnByb3RvdHlwZSxcIm9yZGVyXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vcmRlcn0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX29yZGVyPXQ7Zm9yKHZhciBlPW5ldyBBcnJheSg0MDk2KSxpPWUubGVuZ3RoLG49MDtuPGk7KytuKXt2YXIgbz0yKm4vaS0xO2Vbbl09MD09PW8/MDp0aGlzLl9nZXRDb2VmZmljaWVudChvLHQse30pfXRoaXMuX3NoYXBlci5jdXJ2ZT1lfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkNoZWJ5c2hldi5wcm90b3R5cGUsXCJvdmVyc2FtcGxlXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGFwZXIub3ZlcnNhbXBsZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3NoYXBlci5vdmVyc2FtcGxlPXR9fSksdC5DaGVieXNoZXYucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5FZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9zaGFwZXIuZGlzcG9zZSgpLHRoaXMuX3NoYXBlcj1udWxsLHRoaXN9LHQuQ2hlYnlzaGV2fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDgpLGkoMTMpLGkoNzcpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5CaXRDcnVzaGVyPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiYml0c1wiXSx0LkJpdENydXNoZXIpO3QuRWZmZWN0LmNhbGwodGhpcyxlKTt2YXIgaT0xL01hdGgucG93KDIsZS5iaXRzLTEpO3RoaXMuX3N1YnRyYWN0PW5ldyB0LlN1YnRyYWN0LHRoaXMuX21vZHVsbz1uZXcgdC5Nb2R1bG8oaSksdGhpcy5fYml0cz1lLmJpdHMsdGhpcy5lZmZlY3RTZW5kLmZhbih0aGlzLl9zdWJ0cmFjdCx0aGlzLl9tb2R1bG8pLHRoaXMuX21vZHVsby5jb25uZWN0KHRoaXMuX3N1YnRyYWN0LDAsMSksdGhpcy5fc3VidHJhY3QuY29ubmVjdCh0aGlzLmVmZmVjdFJldHVybil9LHQuZXh0ZW5kKHQuQml0Q3J1c2hlcix0LkVmZmVjdCksdC5CaXRDcnVzaGVyLmRlZmF1bHRzPXtiaXRzOjR9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkJpdENydXNoZXIucHJvdG90eXBlLFwiYml0c1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYml0c30sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2JpdHM9dDt2YXIgZT0xL01hdGgucG93KDIsdC0xKTt0aGlzLl9tb2R1bG8udmFsdWU9ZX19KSx0LkJpdENydXNoZXIucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5FZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9zdWJ0cmFjdC5kaXNwb3NlKCksdGhpcy5fc3VidHJhY3Q9bnVsbCx0aGlzLl9tb2R1bG8uZGlzcG9zZSgpLHRoaXMuX21vZHVsbz1udWxsLHRoaXN9LHQuQml0Q3J1c2hlcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg1NyksaSg0MiksaSg4KSxpKDkpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5BdXRvV2FoPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wiYmFzZUZyZXF1ZW5jeVwiLFwib2N0YXZlc1wiLFwic2Vuc2l0aXZpdHlcIl0sdC5BdXRvV2FoKTt0LkVmZmVjdC5jYWxsKHRoaXMsZSksdGhpcy5mb2xsb3dlcj1uZXcgdC5Gb2xsb3dlcihlLmZvbGxvd2VyKSx0aGlzLl9zd2VlcFJhbmdlPW5ldyB0LlNjYWxlRXhwKDAsMSwuNSksdGhpcy5fYmFzZUZyZXF1ZW5jeT1lLmJhc2VGcmVxdWVuY3ksdGhpcy5fb2N0YXZlcz1lLm9jdGF2ZXMsdGhpcy5faW5wdXRCb29zdD1uZXcgdC5HYWluLHRoaXMuX2JhbmRwYXNzPW5ldyB0LkZpbHRlcih7cm9sbG9mZjotNDgsZnJlcXVlbmN5OjAsUTplLlF9KSx0aGlzLl9wZWFraW5nPW5ldyB0LkZpbHRlcigwLFwicGVha2luZ1wiKSx0aGlzLl9wZWFraW5nLmdhaW4udmFsdWU9ZS5nYWluLHRoaXMuZ2Fpbj10aGlzLl9wZWFraW5nLmdhaW4sdGhpcy5RPXRoaXMuX2JhbmRwYXNzLlEsdGhpcy5lZmZlY3RTZW5kLmNoYWluKHRoaXMuX2lucHV0Qm9vc3QsdGhpcy5mb2xsb3dlcix0aGlzLl9zd2VlcFJhbmdlKSx0aGlzLl9zd2VlcFJhbmdlLmNvbm5lY3QodGhpcy5fYmFuZHBhc3MuZnJlcXVlbmN5KSx0aGlzLl9zd2VlcFJhbmdlLmNvbm5lY3QodGhpcy5fcGVha2luZy5mcmVxdWVuY3kpLHRoaXMuZWZmZWN0U2VuZC5jaGFpbih0aGlzLl9iYW5kcGFzcyx0aGlzLl9wZWFraW5nLHRoaXMuZWZmZWN0UmV0dXJuKSx0aGlzLl9zZXRTd2VlcFJhbmdlKCksdGhpcy5zZW5zaXRpdml0eT1lLnNlbnNpdGl2aXR5LHRoaXMuX3JlYWRPbmx5KFtcImdhaW5cIixcIlFcIl0pfSx0LmV4dGVuZCh0LkF1dG9XYWgsdC5FZmZlY3QpLHQuQXV0b1dhaC5kZWZhdWx0cz17YmFzZUZyZXF1ZW5jeToxMDAsb2N0YXZlczo2LHNlbnNpdGl2aXR5OjAsUToyLGdhaW46Mixmb2xsb3dlcjp7YXR0YWNrOi4zLHJlbGVhc2U6LjV9fSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BdXRvV2FoLnByb3RvdHlwZSxcIm9jdGF2ZXNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29jdGF2ZXN9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9vY3RhdmVzPXQsdGhpcy5fc2V0U3dlZXBSYW5nZSgpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkF1dG9XYWgucHJvdG90eXBlLFwiYmFzZUZyZXF1ZW5jeVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFzZUZyZXF1ZW5jeX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2Jhc2VGcmVxdWVuY3k9dCx0aGlzLl9zZXRTd2VlcFJhbmdlKCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQXV0b1dhaC5wcm90b3R5cGUsXCJzZW5zaXRpdml0eVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5nYWluVG9EYigxL3RoaXMuX2lucHV0Qm9vc3QuZ2Fpbi52YWx1ZSl9LHNldDpmdW5jdGlvbihlKXt0aGlzLl9pbnB1dEJvb3N0LmdhaW4udmFsdWU9MS90LmRiVG9HYWluKGUpfX0pLHQuQXV0b1dhaC5wcm90b3R5cGUuX3NldFN3ZWVwUmFuZ2U9ZnVuY3Rpb24oKXt0aGlzLl9zd2VlcFJhbmdlLm1pbj10aGlzLl9iYXNlRnJlcXVlbmN5LHRoaXMuX3N3ZWVwUmFuZ2UubWF4PU1hdGgubWluKHRoaXMuX2Jhc2VGcmVxdWVuY3kqTWF0aC5wb3coMix0aGlzLl9vY3RhdmVzKSx0aGlzLmNvbnRleHQuc2FtcGxlUmF0ZS8yKX0sdC5BdXRvV2FoLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5mb2xsb3dlci5kaXNwb3NlKCksdGhpcy5mb2xsb3dlcj1udWxsLHRoaXMuX3N3ZWVwUmFuZ2UuZGlzcG9zZSgpLHRoaXMuX3N3ZWVwUmFuZ2U9bnVsbCx0aGlzLl9iYW5kcGFzcy5kaXNwb3NlKCksdGhpcy5fYmFuZHBhc3M9bnVsbCx0aGlzLl9wZWFraW5nLmRpc3Bvc2UoKSx0aGlzLl9wZWFraW5nPW51bGwsdGhpcy5faW5wdXRCb29zdC5kaXNwb3NlKCksdGhpcy5faW5wdXRCb29zdD1udWxsLHRoaXMuX3dyaXRhYmxlKFtcImdhaW5cIixcIlFcIl0pLHRoaXMuZ2Fpbj1udWxsLHRoaXMuUT1udWxsLHRoaXN9LHQuQXV0b1dhaH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg4KSxpKDEyKSxpKDYwKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuQXV0b1Bhbm5lcj1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcImZyZXF1ZW5jeVwiXSx0LkF1dG9QYW5uZXIpO3QuRWZmZWN0LmNhbGwodGhpcyxlKSx0aGlzLl9sZm89bmV3IHQuTEZPKHtmcmVxdWVuY3k6ZS5mcmVxdWVuY3ksYW1wbGl0dWRlOmUuZGVwdGgsbWluOi0xLG1heDoxfSksdGhpcy5kZXB0aD10aGlzLl9sZm8uYW1wbGl0dWRlLHRoaXMuX3Bhbm5lcj1uZXcgdC5QYW5uZXIsdGhpcy5mcmVxdWVuY3k9dGhpcy5fbGZvLmZyZXF1ZW5jeSx0aGlzLmNvbm5lY3RFZmZlY3QodGhpcy5fcGFubmVyKSx0aGlzLl9sZm8uY29ubmVjdCh0aGlzLl9wYW5uZXIucGFuKSx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuX3JlYWRPbmx5KFtcImRlcHRoXCIsXCJmcmVxdWVuY3lcIl0pfSx0LmV4dGVuZCh0LkF1dG9QYW5uZXIsdC5FZmZlY3QpLHQuQXV0b1Bhbm5lci5kZWZhdWx0cz17ZnJlcXVlbmN5OjEsdHlwZTpcInNpbmVcIixkZXB0aDoxfSx0LkF1dG9QYW5uZXIucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9sZm8uc3RhcnQodCksdGhpc30sdC5BdXRvUGFubmVyLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9sZm8uc3RvcCh0KSx0aGlzfSx0LkF1dG9QYW5uZXIucHJvdG90eXBlLnN5bmM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2xmby5zeW5jKHQpLHRoaXN9LHQuQXV0b1Bhbm5lci5wcm90b3R5cGUudW5zeW5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xmby51bnN5bmMoKSx0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BdXRvUGFubmVyLnByb3RvdHlwZSxcInR5cGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xmby50eXBlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbGZvLnR5cGU9dH19KSx0LkF1dG9QYW5uZXIucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5FZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9sZm8uZGlzcG9zZSgpLHRoaXMuX2xmbz1udWxsLHRoaXMuX3Bhbm5lci5kaXNwb3NlKCksdGhpcy5fcGFubmVyPW51bGwsdGhpcy5fd3JpdGFibGUoW1wiZGVwdGhcIixcImZyZXF1ZW5jeVwiXSksdGhpcy5mcmVxdWVuY3k9bnVsbCx0aGlzLmRlcHRoPW51bGwsdGhpc30sdC5BdXRvUGFubmVyfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDgpLGkoMTIpLGkoOSldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkF1dG9GaWx0ZXI9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJmcmVxdWVuY3lcIixcImJhc2VGcmVxdWVuY3lcIixcIm9jdGF2ZXNcIl0sdC5BdXRvRmlsdGVyKTt0LkVmZmVjdC5jYWxsKHRoaXMsZSksdGhpcy5fbGZvPW5ldyB0LkxGTyh7ZnJlcXVlbmN5OmUuZnJlcXVlbmN5LGFtcGxpdHVkZTplLmRlcHRofSksdGhpcy5kZXB0aD10aGlzLl9sZm8uYW1wbGl0dWRlLHRoaXMuZnJlcXVlbmN5PXRoaXMuX2xmby5mcmVxdWVuY3ksdGhpcy5maWx0ZXI9bmV3IHQuRmlsdGVyKGUuZmlsdGVyKSx0aGlzLl9vY3RhdmVzPTAsdGhpcy5jb25uZWN0RWZmZWN0KHRoaXMuZmlsdGVyKSx0aGlzLl9sZm8uY29ubmVjdCh0aGlzLmZpbHRlci5mcmVxdWVuY3kpLHRoaXMudHlwZT1lLnR5cGUsdGhpcy5fcmVhZE9ubHkoW1wiZnJlcXVlbmN5XCIsXCJkZXB0aFwiXSksdGhpcy5vY3RhdmVzPWUub2N0YXZlcyx0aGlzLmJhc2VGcmVxdWVuY3k9ZS5iYXNlRnJlcXVlbmN5fSx0LmV4dGVuZCh0LkF1dG9GaWx0ZXIsdC5FZmZlY3QpLHQuQXV0b0ZpbHRlci5kZWZhdWx0cz17ZnJlcXVlbmN5OjEsdHlwZTpcInNpbmVcIixkZXB0aDoxLGJhc2VGcmVxdWVuY3k6MjAwLG9jdGF2ZXM6Mi42LGZpbHRlcjp7dHlwZTpcImxvd3Bhc3NcIixyb2xsb2ZmOi0xMixROjF9fSx0LkF1dG9GaWx0ZXIucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9sZm8uc3RhcnQodCksdGhpc30sdC5BdXRvRmlsdGVyLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9sZm8uc3RvcCh0KSx0aGlzfSx0LkF1dG9GaWx0ZXIucHJvdG90eXBlLnN5bmM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2xmby5zeW5jKHQpLHRoaXN9LHQuQXV0b0ZpbHRlci5wcm90b3R5cGUudW5zeW5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xmby51bnN5bmMoKSx0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BdXRvRmlsdGVyLnByb3RvdHlwZSxcInR5cGVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xmby50eXBlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbGZvLnR5cGU9dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5BdXRvRmlsdGVyLnByb3RvdHlwZSxcImJhc2VGcmVxdWVuY3lcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xmby5taW59LHNldDpmdW5jdGlvbih0KXt0aGlzLl9sZm8ubWluPXRoaXMudG9GcmVxdWVuY3kodCksdGhpcy5vY3RhdmVzPXRoaXMuX29jdGF2ZXN9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQXV0b0ZpbHRlci5wcm90b3R5cGUsXCJvY3RhdmVzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vY3RhdmVzfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fb2N0YXZlcz10LHRoaXMuX2xmby5tYXg9dGhpcy5iYXNlRnJlcXVlbmN5Kk1hdGgucG93KDIsdCl9fSksdC5BdXRvRmlsdGVyLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fbGZvLmRpc3Bvc2UoKSx0aGlzLl9sZm89bnVsbCx0aGlzLmZpbHRlci5kaXNwb3NlKCksdGhpcy5maWx0ZXI9bnVsbCx0aGlzLl93cml0YWJsZShbXCJmcmVxdWVuY3lcIixcImRlcHRoXCJdKSx0aGlzLmZyZXF1ZW5jeT1udWxsLHRoaXMuZGVwdGg9bnVsbCx0aGlzfSx0LkF1dG9GaWx0ZXJ9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMjMpLGkoMTApLGkoMTkpLGkoMSksaSgyMiksaSgyOCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3QuTGlzdGVuZXI9ZnVuY3Rpb24oKXt0LmNhbGwodGhpcyksdGhpcy5fb3JpZW50YXRpb249WzAsMCwwLDAsMCwwXSx0aGlzLl9wb3NpdGlvbj1bMCwwLDBdLHQuZ2V0Q29udGV4dChmdW5jdGlvbigpe3RoaXMuc2V0KGUuZGVmYXVsdHMpLHRoaXMuY29udGV4dC5saXN0ZW5lcj10aGlzfS5iaW5kKHRoaXMpKX0sdC5leHRlbmQodC5MaXN0ZW5lciksdC5MaXN0ZW5lci5kZWZhdWx0cz17cG9zaXRpb25YOjAscG9zaXRpb25ZOjAscG9zaXRpb25aOjAsZm9yd2FyZFg6MCxmb3J3YXJkWTowLGZvcndhcmRaOjEsdXBYOjAsdXBZOjEsdXBaOjB9LHQuTGlzdGVuZXIucHJvdG90eXBlLmlzTGlzdGVuZXI9ITAsdC5MaXN0ZW5lci5wcm90b3R5cGUuX3JhbXBUaW1lQ29uc3RhbnQ9LjAxLHQuTGlzdGVuZXIucHJvdG90eXBlLnNldFBvc2l0aW9uPWZ1bmN0aW9uKHQsZSxpKXtpZih0aGlzLmNvbnRleHQucmF3Q29udGV4dC5saXN0ZW5lci5wb3NpdGlvblgpe3ZhciBuPXRoaXMubm93KCk7dGhpcy5jb250ZXh0LnJhd0NvbnRleHQubGlzdGVuZXIucG9zaXRpb25YLnNldFRhcmdldEF0VGltZSh0LG4sdGhpcy5fcmFtcFRpbWVDb25zdGFudCksdGhpcy5jb250ZXh0LnJhd0NvbnRleHQubGlzdGVuZXIucG9zaXRpb25ZLnNldFRhcmdldEF0VGltZShlLG4sdGhpcy5fcmFtcFRpbWVDb25zdGFudCksdGhpcy5jb250ZXh0LnJhd0NvbnRleHQubGlzdGVuZXIucG9zaXRpb25aLnNldFRhcmdldEF0VGltZShpLG4sdGhpcy5fcmFtcFRpbWVDb25zdGFudCl9ZWxzZSB0aGlzLmNvbnRleHQucmF3Q29udGV4dC5saXN0ZW5lci5zZXRQb3NpdGlvbih0LGUsaSk7cmV0dXJuIHRoaXMuX3Bvc2l0aW9uPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksdGhpc30sdC5MaXN0ZW5lci5wcm90b3R5cGUuc2V0T3JpZW50YXRpb249ZnVuY3Rpb24odCxlLGksbixvLHMpe2lmKHRoaXMuY29udGV4dC5yYXdDb250ZXh0Lmxpc3RlbmVyLmZvcndhcmRYKXt2YXIgcj10aGlzLm5vdygpO3RoaXMuY29udGV4dC5yYXdDb250ZXh0Lmxpc3RlbmVyLmZvcndhcmRYLnNldFRhcmdldEF0VGltZSh0LHIsdGhpcy5fcmFtcFRpbWVDb25zdGFudCksdGhpcy5jb250ZXh0LnJhd0NvbnRleHQubGlzdGVuZXIuZm9yd2FyZFkuc2V0VGFyZ2V0QXRUaW1lKGUscix0aGlzLl9yYW1wVGltZUNvbnN0YW50KSx0aGlzLmNvbnRleHQucmF3Q29udGV4dC5saXN0ZW5lci5mb3J3YXJkWi5zZXRUYXJnZXRBdFRpbWUoaSxyLHRoaXMuX3JhbXBUaW1lQ29uc3RhbnQpLHRoaXMuY29udGV4dC5yYXdDb250ZXh0Lmxpc3RlbmVyLnVwWC5zZXRUYXJnZXRBdFRpbWUobixyLHRoaXMuX3JhbXBUaW1lQ29uc3RhbnQpLHRoaXMuY29udGV4dC5yYXdDb250ZXh0Lmxpc3RlbmVyLnVwWS5zZXRUYXJnZXRBdFRpbWUobyxyLHRoaXMuX3JhbXBUaW1lQ29uc3RhbnQpLHRoaXMuY29udGV4dC5yYXdDb250ZXh0Lmxpc3RlbmVyLnVwWi5zZXRUYXJnZXRBdFRpbWUocyxyLHRoaXMuX3JhbXBUaW1lQ29uc3RhbnQpfWVsc2UgdGhpcy5jb250ZXh0LnJhd0NvbnRleHQubGlzdGVuZXIuc2V0T3JpZW50YXRpb24odCxlLGksbixvLHMpO3JldHVybiB0aGlzLl9vcmllbnRhdGlvbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lkxpc3RlbmVyLnByb3RvdHlwZSxcInBvc2l0aW9uWFwiLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fcG9zaXRpb25bMF09dCx0aGlzLnNldFBvc2l0aW9uLmFwcGx5KHRoaXMsdGhpcy5fcG9zaXRpb24pfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9zaXRpb25bMF19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuTGlzdGVuZXIucHJvdG90eXBlLFwicG9zaXRpb25ZXCIse3NldDpmdW5jdGlvbih0KXt0aGlzLl9wb3NpdGlvblsxXT10LHRoaXMuc2V0UG9zaXRpb24uYXBwbHkodGhpcyx0aGlzLl9wb3NpdGlvbil9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3NpdGlvblsxXX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5MaXN0ZW5lci5wcm90b3R5cGUsXCJwb3NpdGlvblpcIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3Bvc2l0aW9uWzJdPXQsdGhpcy5zZXRQb3NpdGlvbi5hcHBseSh0aGlzLHRoaXMuX3Bvc2l0aW9uKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Bvc2l0aW9uWzJdfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lkxpc3RlbmVyLnByb3RvdHlwZSxcImZvcndhcmRYXCIse3NldDpmdW5jdGlvbih0KXt0aGlzLl9vcmllbnRhdGlvblswXT10LHRoaXMuc2V0T3JpZW50YXRpb24uYXBwbHkodGhpcyx0aGlzLl9vcmllbnRhdGlvbil9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vcmllbnRhdGlvblswXX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5MaXN0ZW5lci5wcm90b3R5cGUsXCJmb3J3YXJkWVwiLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fb3JpZW50YXRpb25bMV09dCx0aGlzLnNldE9yaWVudGF0aW9uLmFwcGx5KHRoaXMsdGhpcy5fb3JpZW50YXRpb24pfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JpZW50YXRpb25bMV19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuTGlzdGVuZXIucHJvdG90eXBlLFwiZm9yd2FyZFpcIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX29yaWVudGF0aW9uWzJdPXQsdGhpcy5zZXRPcmllbnRhdGlvbi5hcHBseSh0aGlzLHRoaXMuX29yaWVudGF0aW9uKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGF0aW9uWzJdfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0Lkxpc3RlbmVyLnByb3RvdHlwZSxcInVwWFwiLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fb3JpZW50YXRpb25bM109dCx0aGlzLnNldE9yaWVudGF0aW9uLmFwcGx5KHRoaXMsdGhpcy5fb3JpZW50YXRpb24pfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JpZW50YXRpb25bM119fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuTGlzdGVuZXIucHJvdG90eXBlLFwidXBZXCIse3NldDpmdW5jdGlvbih0KXt0aGlzLl9vcmllbnRhdGlvbls0XT10LHRoaXMuc2V0T3JpZW50YXRpb24uYXBwbHkodGhpcyx0aGlzLl9vcmllbnRhdGlvbil9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vcmllbnRhdGlvbls0XX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5MaXN0ZW5lci5wcm90b3R5cGUsXCJ1cFpcIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX29yaWVudGF0aW9uWzVdPXQsdGhpcy5zZXRPcmllbnRhdGlvbi5hcHBseSh0aGlzLHRoaXMuX29yaWVudGF0aW9uKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGF0aW9uWzVdfX0pLHQuTGlzdGVuZXIucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JpZW50YXRpb249bnVsbCx0aGlzLl9wb3NpdGlvbj1udWxsLHRoaXN9O3ZhciBlPXQuTGlzdGVuZXI7cmV0dXJuIHQuTGlzdGVuZXI9bmV3IGUsdC5Db250ZXh0Lm9uKFwiaW5pdFwiLGZ1bmN0aW9uKGkpe2kubGlzdGVuZXImJmkubGlzdGVuZXIuaXNMaXN0ZW5lcj90Lkxpc3RlbmVyPWkubGlzdGVuZXI6dC5MaXN0ZW5lcj1uZXcgZX0pLHQuTGlzdGVuZXJ9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMjQpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5EcmF3PWZ1bmN0aW9uKCl7dC5jYWxsKHRoaXMpLHRoaXMuX2V2ZW50cz1uZXcgdC5UaW1lbGluZSx0aGlzLmV4cGlyYXRpb249LjI1LHRoaXMuYW50aWNpcGF0aW9uPS4wMDgsdGhpcy5fYm91bmREcmF3TG9vcD10aGlzLl9kcmF3TG9vcC5iaW5kKHRoaXMpfSx0LmV4dGVuZCh0LkRyYXcpLHQuRHJhdy5wcm90b3R5cGUuc2NoZWR1bGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZXZlbnRzLmFkZCh7Y2FsbGJhY2s6dCx0aW1lOnRoaXMudG9TZWNvbmRzKGUpfSksMT09PXRoaXMuX2V2ZW50cy5sZW5ndGgmJnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9ib3VuZERyYXdMb29wKSx0aGlzfSx0LkRyYXcucHJvdG90eXBlLmNhbmNlbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZXZlbnRzLmNhbmNlbCh0aGlzLnRvU2Vjb25kcyh0KSksdGhpc30sdC5EcmF3LnByb3RvdHlwZS5fZHJhd0xvb3A9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dC5jb250ZXh0LmN1cnJlbnRUaW1lO3RoaXMuX2V2ZW50cy5sZW5ndGgmJnRoaXMuX2V2ZW50cy5wZWVrKCkudGltZS10aGlzLmFudGljaXBhdGlvbjw9ZTspe3ZhciBpPXRoaXMuX2V2ZW50cy5zaGlmdCgpO2UtaS50aW1lPD10aGlzLmV4cGlyYXRpb24mJmkuY2FsbGJhY2soKX10aGlzLl9ldmVudHMubGVuZ3RoPjAmJnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9ib3VuZERyYXdMb29wKX0sdC5EcmF3PW5ldyB0LkRyYXcsdC5EcmF3fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDMpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjt2YXIgZT17fTtyZXR1cm4gdC5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihpLG4pe2UuaGFzT3duUHJvcGVydHkoaSl8fChlW2ldPXRoaXMuY29udGV4dC5jcmVhdGVHYWluKCkpLG49dC5kZWZhdWx0QXJnKG4sMCk7dmFyIG89bmV3IHQuR2FpbihuLHQuVHlwZS5EZWNpYmVscyk7cmV0dXJuIHRoaXMuY29ubmVjdChvKSxvLmNvbm5lY3QoZVtpXSksb30sdC5wcm90b3R5cGUucmVjZWl2ZT1mdW5jdGlvbih0LGkpe3JldHVybiBlLmhhc093blByb3BlcnR5KHQpfHwoZVt0XT10aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpKSxlW3RdLmNvbm5lY3QodGhpcywwLGkpLHRoaXN9LHQuQ29udGV4dC5vbihcImluaXRcIixmdW5jdGlvbih0KXt0LmJ1c2VzP2U9dC5idXNlczooZT17fSx0LmJ1c2VzPWUpfSksdH0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg0KV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuQ3RybFJhbmRvbT1mdW5jdGlvbigpe3ZhciBlPXQuZGVmYXVsdHMoYXJndW1lbnRzLFtcIm1pblwiLFwibWF4XCJdLHQuQ3RybFJhbmRvbSk7dC5jYWxsKHRoaXMpLHRoaXMubWluPWUubWluLHRoaXMubWF4PWUubWF4LHRoaXMuaW50ZWdlcj1lLmludGVnZXJ9LHQuZXh0ZW5kKHQuQ3RybFJhbmRvbSksdC5DdHJsUmFuZG9tLmRlZmF1bHRzPXttaW46MCxtYXg6MSxpbnRlZ2VyOiExfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5DdHJsUmFuZG9tLnByb3RvdHlwZSxcInZhbHVlXCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMudG9TZWNvbmRzKHRoaXMubWluKSxlPXRoaXMudG9TZWNvbmRzKHRoaXMubWF4KSxpPU1hdGgucmFuZG9tKCksbj1pKnQrKDEtaSkqZTtyZXR1cm4gdGhpcy5pbnRlZ2VyJiYobj1NYXRoLmZsb29yKG4pKSxufX0pLHQuQ3RybFJhbmRvbX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCldLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkN0cmxNYXJrb3Y9ZnVuY3Rpb24oZSxpKXt0LmNhbGwodGhpcyksdGhpcy52YWx1ZXM9dC5kZWZhdWx0QXJnKGUse30pLHRoaXMudmFsdWU9dC5kZWZhdWx0QXJnKGksT2JqZWN0LmtleXModGhpcy52YWx1ZXMpWzBdKX0sdC5leHRlbmQodC5DdHJsTWFya292KSx0LkN0cmxNYXJrb3YucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtpZih0aGlzLnZhbHVlcy5oYXNPd25Qcm9wZXJ0eSh0aGlzLnZhbHVlKSl7dmFyIGU9dGhpcy52YWx1ZXNbdGhpcy52YWx1ZV07aWYodC5pc0FycmF5KGUpKWZvcih2YXIgaT10aGlzLl9nZXRQcm9iRGlzdHJpYnV0aW9uKGUpLG49TWF0aC5yYW5kb20oKSxvPTAscz0wO3M8aS5sZW5ndGg7cysrKXt2YXIgcj1pW3NdO2lmKG4+byYmbjxvK3Ipe3ZhciBhPWVbc107dC5pc09iamVjdChhKT90aGlzLnZhbHVlPWEudmFsdWU6dGhpcy52YWx1ZT1hfW8rPXJ9ZWxzZSB0aGlzLnZhbHVlPWV9cmV0dXJuIHRoaXMudmFsdWV9LHQuQ3RybE1hcmtvdi5wcm90b3R5cGUuX2dldFByb2JEaXN0cmlidXRpb249ZnVuY3Rpb24oZSl7Zm9yKHZhciBpPVtdLG49MCxvPSExLHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIHI9ZVtzXTt0LmlzT2JqZWN0KHIpPyhvPSEwLGlbc109ci5wcm9iYWJpbGl0eSk6aVtzXT0xL2UubGVuZ3RoLG4rPWlbc119aWYobylmb3IodmFyIGE9MDthPGkubGVuZ3RoO2ErKylpW2FdPWlbYV0vbjtyZXR1cm4gaX0sdC5DdHJsTWFya292LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy52YWx1ZXM9bnVsbH0sdC5DdHJsTWFya292fS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDQpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5DdHJsSW50ZXJwb2xhdGU9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJ2YWx1ZXNcIixcImluZGV4XCJdLHQuQ3RybEludGVycG9sYXRlKTt0LmNhbGwodGhpcyksdGhpcy52YWx1ZXM9ZS52YWx1ZXMsdGhpcy5pbmRleD1lLmluZGV4fSx0LmV4dGVuZCh0LkN0cmxJbnRlcnBvbGF0ZSksdC5DdHJsSW50ZXJwb2xhdGUuZGVmYXVsdHM9e2luZGV4OjAsdmFsdWVzOltdfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5DdHJsSW50ZXJwb2xhdGUucHJvdG90eXBlLFwidmFsdWVcIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5pbmRleDt0PU1hdGgubWluKHQsdGhpcy52YWx1ZXMubGVuZ3RoLTEpO3ZhciBlPU1hdGguZmxvb3IodCksaT10aGlzLnZhbHVlc1tlXSxuPXRoaXMudmFsdWVzW01hdGguY2VpbCh0KV07cmV0dXJuIHRoaXMuX2ludGVycG9sYXRlKHQtZSxpLG4pfX0pLHQuQ3RybEludGVycG9sYXRlLnByb3RvdHlwZS5faW50ZXJwb2xhdGU9ZnVuY3Rpb24oZSxpLG4pe2lmKHQuaXNBcnJheShpKSl7Zm9yKHZhciBvPVtdLHM9MDtzPGkubGVuZ3RoO3MrKylvW3NdPXRoaXMuX2ludGVycG9sYXRlKGUsaVtzXSxuW3NdKTtyZXR1cm4gb31pZih0LmlzT2JqZWN0KGkpKXt2YXIgcj17fTtmb3IodmFyIGEgaW4gaSlyW2FdPXRoaXMuX2ludGVycG9sYXRlKGUsaVthXSxuW2FdKTtyZXR1cm4gcn1yZXR1cm4oMS1lKSooaT10aGlzLl90b051bWJlcihpKSkrZSoobj10aGlzLl90b051bWJlcihuKSl9LHQuQ3RybEludGVycG9sYXRlLnByb3RvdHlwZS5fdG9OdW1iZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuaXNOdW1iZXIoZSk/ZTp0aGlzLnRvU2Vjb25kcyhlKX0sdC5DdHJsSW50ZXJwb2xhdGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLnZhbHVlcz1udWxsfSx0LkN0cmxJbnRlcnBvbGF0ZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg0NCksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuV2F2ZWZvcm09ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJzaXplXCJdLHQuV2F2ZWZvcm0pO2UudHlwZT10LkFuYWx5c2VyLlR5cGUuV2F2ZWZvcm0sdC5BdWRpb05vZGUuY2FsbCh0aGlzKSx0aGlzLl9hbmFseXNlcj10aGlzLmlucHV0PXRoaXMub3V0cHV0PW5ldyB0LkFuYWx5c2VyKGUpfSx0LmV4dGVuZCh0LldhdmVmb3JtLHQuQXVkaW9Ob2RlKSx0LldhdmVmb3JtLmRlZmF1bHRzPXtzaXplOjEwMjR9LHQuV2F2ZWZvcm0ucHJvdG90eXBlLmdldFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FuYWx5c2VyLmdldFZhbHVlKCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LldhdmVmb3JtLnByb3RvdHlwZSxcInNpemVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FuYWx5c2VyLnNpemV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9hbmFseXNlci5zaXplPXR9fSksdC5XYXZlZm9ybS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3QuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fYW5hbHlzZXIuZGlzcG9zZSgpLHRoaXMuX2FuYWx5c2VyPW51bGx9LHQuV2F2ZWZvcm19LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoMjMpLGkoMTApLGkoMTkpLGkoMSksaSgyMiksaSgyOCksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuUGFubmVyM0Q9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJwb3NpdGlvblhcIixcInBvc2l0aW9uWVwiLFwicG9zaXRpb25aXCJdLHQuUGFubmVyM0QpO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5fcGFubmVyPXRoaXMuaW5wdXQ9dGhpcy5vdXRwdXQ9dGhpcy5jb250ZXh0LmNyZWF0ZVBhbm5lcigpLHRoaXMuX3Bhbm5lci5wYW5uaW5nTW9kZWw9ZS5wYW5uaW5nTW9kZWwsdGhpcy5fcGFubmVyLm1heERpc3RhbmNlPWUubWF4RGlzdGFuY2UsdGhpcy5fcGFubmVyLmRpc3RhbmNlTW9kZWw9ZS5kaXN0YW5jZU1vZGVsLHRoaXMuX3Bhbm5lci5jb25lT3V0ZXJHYWluPWUuY29uZU91dGVyR2Fpbix0aGlzLl9wYW5uZXIuY29uZU91dGVyQW5nbGU9ZS5jb25lT3V0ZXJBbmdsZSx0aGlzLl9wYW5uZXIuY29uZUlubmVyQW5nbGU9ZS5jb25lSW5uZXJBbmdsZSx0aGlzLl9wYW5uZXIucmVmRGlzdGFuY2U9ZS5yZWZEaXN0YW5jZSx0aGlzLl9wYW5uZXIucm9sbG9mZkZhY3Rvcj1lLnJvbGxvZmZGYWN0b3IsdGhpcy5fb3JpZW50YXRpb249W2Uub3JpZW50YXRpb25YLGUub3JpZW50YXRpb25ZLGUub3JpZW50YXRpb25aXSx0aGlzLl9wb3NpdGlvbj1bZS5wb3NpdGlvblgsZS5wb3NpdGlvblksZS5wb3NpdGlvblpdLHRoaXMub3JpZW50YXRpb25YPWUub3JpZW50YXRpb25YLHRoaXMub3JpZW50YXRpb25ZPWUub3JpZW50YXRpb25ZLHRoaXMub3JpZW50YXRpb25aPWUub3JpZW50YXRpb25aLHRoaXMucG9zaXRpb25YPWUucG9zaXRpb25YLHRoaXMucG9zaXRpb25ZPWUucG9zaXRpb25ZLHRoaXMucG9zaXRpb25aPWUucG9zaXRpb25afSx0LmV4dGVuZCh0LlBhbm5lcjNELHQuQXVkaW9Ob2RlKSx0LlBhbm5lcjNELmRlZmF1bHRzPXtwb3NpdGlvblg6MCxwb3NpdGlvblk6MCxwb3NpdGlvblo6MCxvcmllbnRhdGlvblg6MCxvcmllbnRhdGlvblk6MCxvcmllbnRhdGlvblo6MCxwYW5uaW5nTW9kZWw6XCJlcXVhbHBvd2VyXCIsbWF4RGlzdGFuY2U6MWU0LGRpc3RhbmNlTW9kZWw6XCJpbnZlcnNlXCIsY29uZU91dGVyR2FpbjowLGNvbmVPdXRlckFuZ2xlOjM2MCxjb25lSW5uZXJBbmdsZTozNjAscmVmRGlzdGFuY2U6MSxyb2xsb2ZmRmFjdG9yOjF9LHQuUGFubmVyM0QucHJvdG90eXBlLl9yYW1wVGltZUNvbnN0YW50PS4wMSx0LlBhbm5lcjNELnByb3RvdHlwZS5zZXRQb3NpdGlvbj1mdW5jdGlvbih0LGUsaSl7aWYodGhpcy5fcGFubmVyLnBvc2l0aW9uWCl7dmFyIG49dGhpcy5ub3coKTt0aGlzLl9wYW5uZXIucG9zaXRpb25YLnNldFRhcmdldEF0VGltZSh0LG4sdGhpcy5fcmFtcFRpbWVDb25zdGFudCksdGhpcy5fcGFubmVyLnBvc2l0aW9uWS5zZXRUYXJnZXRBdFRpbWUoZSxuLHRoaXMuX3JhbXBUaW1lQ29uc3RhbnQpLHRoaXMuX3Bhbm5lci5wb3NpdGlvblouc2V0VGFyZ2V0QXRUaW1lKGksbix0aGlzLl9yYW1wVGltZUNvbnN0YW50KX1lbHNlIHRoaXMuX3Bhbm5lci5zZXRQb3NpdGlvbih0LGUsaSk7cmV0dXJuIHRoaXMuX3Bvc2l0aW9uPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksdGhpc30sdC5QYW5uZXIzRC5wcm90b3R5cGUuc2V0T3JpZW50YXRpb249ZnVuY3Rpb24odCxlLGkpe2lmKHRoaXMuX3Bhbm5lci5vcmllbnRhdGlvblgpe3ZhciBuPXRoaXMubm93KCk7dGhpcy5fcGFubmVyLm9yaWVudGF0aW9uWC5zZXRUYXJnZXRBdFRpbWUodCxuLHRoaXMuX3JhbXBUaW1lQ29uc3RhbnQpLHRoaXMuX3Bhbm5lci5vcmllbnRhdGlvblkuc2V0VGFyZ2V0QXRUaW1lKGUsbix0aGlzLl9yYW1wVGltZUNvbnN0YW50KSx0aGlzLl9wYW5uZXIub3JpZW50YXRpb25aLnNldFRhcmdldEF0VGltZShpLG4sdGhpcy5fcmFtcFRpbWVDb25zdGFudCl9ZWxzZSB0aGlzLl9wYW5uZXIuc2V0T3JpZW50YXRpb24odCxlLGkpO3JldHVybiB0aGlzLl9vcmllbnRhdGlvbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlBhbm5lcjNELnByb3RvdHlwZSxcInBvc2l0aW9uWFwiLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fcG9zaXRpb25bMF09dCx0aGlzLnNldFBvc2l0aW9uLmFwcGx5KHRoaXMsdGhpcy5fcG9zaXRpb24pfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9zaXRpb25bMF19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGFubmVyM0QucHJvdG90eXBlLFwicG9zaXRpb25ZXCIse3NldDpmdW5jdGlvbih0KXt0aGlzLl9wb3NpdGlvblsxXT10LHRoaXMuc2V0UG9zaXRpb24uYXBwbHkodGhpcyx0aGlzLl9wb3NpdGlvbil9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3NpdGlvblsxXX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QYW5uZXIzRC5wcm90b3R5cGUsXCJwb3NpdGlvblpcIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3Bvc2l0aW9uWzJdPXQsdGhpcy5zZXRQb3NpdGlvbi5hcHBseSh0aGlzLHRoaXMuX3Bvc2l0aW9uKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Bvc2l0aW9uWzJdfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LlBhbm5lcjNELnByb3RvdHlwZSxcIm9yaWVudGF0aW9uWFwiLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fb3JpZW50YXRpb25bMF09dCx0aGlzLnNldE9yaWVudGF0aW9uLmFwcGx5KHRoaXMsdGhpcy5fb3JpZW50YXRpb24pfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JpZW50YXRpb25bMF19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGFubmVyM0QucHJvdG90eXBlLFwib3JpZW50YXRpb25ZXCIse3NldDpmdW5jdGlvbih0KXt0aGlzLl9vcmllbnRhdGlvblsxXT10LHRoaXMuc2V0T3JpZW50YXRpb24uYXBwbHkodGhpcyx0aGlzLl9vcmllbnRhdGlvbil9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vcmllbnRhdGlvblsxXX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5QYW5uZXIzRC5wcm90b3R5cGUsXCJvcmllbnRhdGlvblpcIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX29yaWVudGF0aW9uWzJdPXQsdGhpcy5zZXRPcmllbnRhdGlvbi5hcHBseSh0aGlzLHRoaXMuX29yaWVudGF0aW9uKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGF0aW9uWzJdfX0pLHQuUGFubmVyM0QuX2FsaWFzUHJvcGVydHk9ZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQuUGFubmVyM0QucHJvdG90eXBlLGUse3NldDpmdW5jdGlvbih0KXt0aGlzLl9wYW5uZXJbZV09dH0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Bhbm5lcltlXX19KX0sdC5QYW5uZXIzRC5fYWxpYXNQcm9wZXJ0eShcInBhbm5pbmdNb2RlbFwiKSx0LlBhbm5lcjNELl9hbGlhc1Byb3BlcnR5KFwicmVmRGlzdGFuY2VcIiksdC5QYW5uZXIzRC5fYWxpYXNQcm9wZXJ0eShcInJvbGxvZmZGYWN0b3JcIiksdC5QYW5uZXIzRC5fYWxpYXNQcm9wZXJ0eShcImRpc3RhbmNlTW9kZWxcIiksdC5QYW5uZXIzRC5fYWxpYXNQcm9wZXJ0eShcImNvbmVJbm5lckFuZ2xlXCIpLHQuUGFubmVyM0QuX2FsaWFzUHJvcGVydHkoXCJjb25lT3V0ZXJBbmdsZVwiKSx0LlBhbm5lcjNELl9hbGlhc1Byb3BlcnR5KFwiY29uZU91dGVyR2FpblwiKSx0LlBhbm5lcjNELl9hbGlhc1Byb3BlcnR5KFwibWF4RGlzdGFuY2VcIiksdC5QYW5uZXIzRC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3Bhbm5lci5kaXNjb25uZWN0KCksdGhpcy5fcGFubmVyPW51bGwsdGhpcy5fb3JpZW50YXRpb249bnVsbCx0aGlzLl9wb3NpdGlvbj1udWxsLHRoaXN9LHQuUGFubmVyM0R9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNTkpLGkoNDMpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0Lk11bHRpYmFuZENvbXByZXNzb3I9ZnVuY3Rpb24oZSl7dC5BdWRpb05vZGUuY2FsbCh0aGlzKSxlPXQuZGVmYXVsdEFyZyhhcmd1bWVudHMsdC5NdWx0aWJhbmRDb21wcmVzc29yLmRlZmF1bHRzKSx0aGlzLl9zcGxpdHRlcj10aGlzLmlucHV0PW5ldyB0Lk11bHRpYmFuZFNwbGl0KHtsb3dGcmVxdWVuY3k6ZS5sb3dGcmVxdWVuY3ksaGlnaEZyZXF1ZW5jeTplLmhpZ2hGcmVxdWVuY3l9KSx0aGlzLmxvd0ZyZXF1ZW5jeT10aGlzLl9zcGxpdHRlci5sb3dGcmVxdWVuY3ksdGhpcy5oaWdoRnJlcXVlbmN5PXRoaXMuX3NwbGl0dGVyLmhpZ2hGcmVxdWVuY3ksdGhpcy5vdXRwdXQ9bmV3IHQuR2Fpbix0aGlzLmxvdz1uZXcgdC5Db21wcmVzc29yKGUubG93KSx0aGlzLm1pZD1uZXcgdC5Db21wcmVzc29yKGUubWlkKSx0aGlzLmhpZ2g9bmV3IHQuQ29tcHJlc3NvcihlLmhpZ2gpLHRoaXMuX3NwbGl0dGVyLmxvdy5jaGFpbih0aGlzLmxvdyx0aGlzLm91dHB1dCksdGhpcy5fc3BsaXR0ZXIubWlkLmNoYWluKHRoaXMubWlkLHRoaXMub3V0cHV0KSx0aGlzLl9zcGxpdHRlci5oaWdoLmNoYWluKHRoaXMuaGlnaCx0aGlzLm91dHB1dCksdGhpcy5fcmVhZE9ubHkoW1wiaGlnaFwiLFwibWlkXCIsXCJsb3dcIixcImhpZ2hGcmVxdWVuY3lcIixcImxvd0ZyZXF1ZW5jeVwiXSl9LHQuZXh0ZW5kKHQuTXVsdGliYW5kQ29tcHJlc3Nvcix0LkF1ZGlvTm9kZSksdC5NdWx0aWJhbmRDb21wcmVzc29yLmRlZmF1bHRzPXtsb3c6dC5Db21wcmVzc29yLmRlZmF1bHRzLG1pZDp0LkNvbXByZXNzb3IuZGVmYXVsdHMsaGlnaDp0LkNvbXByZXNzb3IuZGVmYXVsdHMsbG93RnJlcXVlbmN5OjI1MCxoaWdoRnJlcXVlbmN5OjJlM30sdC5NdWx0aWJhbmRDb21wcmVzc29yLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fc3BsaXR0ZXIuZGlzcG9zZSgpLHRoaXMuX3dyaXRhYmxlKFtcImhpZ2hcIixcIm1pZFwiLFwibG93XCIsXCJoaWdoRnJlcXVlbmN5XCIsXCJsb3dGcmVxdWVuY3lcIl0pLHRoaXMubG93LmRpc3Bvc2UoKSx0aGlzLm1pZC5kaXNwb3NlKCksdGhpcy5oaWdoLmRpc3Bvc2UoKSx0aGlzLl9zcGxpdHRlcj1udWxsLHRoaXMubG93PW51bGwsdGhpcy5taWQ9bnVsbCx0aGlzLmhpZ2g9bnVsbCx0aGlzLmxvd0ZyZXF1ZW5jeT1udWxsLHRoaXMuaGlnaEZyZXF1ZW5jeT1udWxsLHRoaXN9LHQuTXVsdGliYW5kQ29tcHJlc3Nvcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSgxMCksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuTW9ubz1mdW5jdGlvbigpe3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5jcmVhdGVJbnNPdXRzKDEsMCksdGhpcy5fbWVyZ2U9dGhpcy5vdXRwdXQ9bmV3IHQuTWVyZ2UsdGhpcy5pbnB1dC5jb25uZWN0KHRoaXMuX21lcmdlLDAsMCksdGhpcy5pbnB1dC5jb25uZWN0KHRoaXMuX21lcmdlLDAsMSl9LHQuZXh0ZW5kKHQuTW9ubyx0LkF1ZGlvTm9kZSksdC5Nb25vLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fbWVyZ2UuZGlzcG9zZSgpLHRoaXMuX21lcmdlPW51bGwsdGhpc30sdC5Nb25vfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDUyKSxpKDUxKSxpKDQzKSxpKDIpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5NaWRTaWRlQ29tcHJlc3Nvcj1mdW5jdGlvbihlKXt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLGU9dC5kZWZhdWx0QXJnKGUsdC5NaWRTaWRlQ29tcHJlc3Nvci5kZWZhdWx0cyksdGhpcy5fbWlkU2lkZVNwbGl0PXRoaXMuaW5wdXQ9bmV3IHQuTWlkU2lkZVNwbGl0LHRoaXMuX21pZFNpZGVNZXJnZT10aGlzLm91dHB1dD1uZXcgdC5NaWRTaWRlTWVyZ2UsdGhpcy5taWQ9bmV3IHQuQ29tcHJlc3NvcihlLm1pZCksdGhpcy5zaWRlPW5ldyB0LkNvbXByZXNzb3IoZS5zaWRlKSx0aGlzLl9taWRTaWRlU3BsaXQubWlkLmNoYWluKHRoaXMubWlkLHRoaXMuX21pZFNpZGVNZXJnZS5taWQpLHRoaXMuX21pZFNpZGVTcGxpdC5zaWRlLmNoYWluKHRoaXMuc2lkZSx0aGlzLl9taWRTaWRlTWVyZ2Uuc2lkZSksdGhpcy5fcmVhZE9ubHkoW1wibWlkXCIsXCJzaWRlXCJdKX0sdC5leHRlbmQodC5NaWRTaWRlQ29tcHJlc3Nvcix0LkF1ZGlvTm9kZSksdC5NaWRTaWRlQ29tcHJlc3Nvci5kZWZhdWx0cz17bWlkOntyYXRpbzozLHRocmVzaG9sZDotMjQscmVsZWFzZTouMDMsYXR0YWNrOi4wMixrbmVlOjE2fSxzaWRlOntyYXRpbzo2LHRocmVzaG9sZDotMzAscmVsZWFzZTouMjUsYXR0YWNrOi4wMyxrbmVlOjEwfX0sdC5NaWRTaWRlQ29tcHJlc3Nvci5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcIm1pZFwiLFwic2lkZVwiXSksdGhpcy5taWQuZGlzcG9zZSgpLHRoaXMubWlkPW51bGwsdGhpcy5zaWRlLmRpc3Bvc2UoKSx0aGlzLnNpZGU9bnVsbCx0aGlzLl9taWRTaWRlU3BsaXQuZGlzcG9zZSgpLHRoaXMuX21pZFNpZGVTcGxpdD1udWxsLHRoaXMuX21pZFNpZGVNZXJnZS5kaXNwb3NlKCksdGhpcy5fbWlkU2lkZU1lcmdlPW51bGwsdGhpc30sdC5NaWRTaWRlQ29tcHJlc3Nvcn0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg0NCksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuTWV0ZXI9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJzbW9vdGhpbmdcIl0sdC5NZXRlcik7dC5BdWRpb05vZGUuY2FsbCh0aGlzKSx0aGlzLnNtb290aGluZz1lLnNtb290aGluZyx0aGlzLl9ybXM9MCx0aGlzLmlucHV0PXRoaXMub3V0cHV0PXRoaXMuX2FuYWx5c2VyPW5ldyB0LkFuYWx5c2VyKFwid2F2ZWZvcm1cIiwyNTYpfSx0LmV4dGVuZCh0Lk1ldGVyLHQuQXVkaW9Ob2RlKSx0Lk1ldGVyLmRlZmF1bHRzPXtzbW9vdGhpbmc6Ljh9LHQuTWV0ZXIucHJvdG90eXBlLmdldExldmVsPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuX2FuYWx5c2VyLmdldFZhbHVlKCksaT0wLG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXTtpKz1vKm99dmFyIHM9TWF0aC5zcXJ0KGkvZS5sZW5ndGgpO3JldHVybiB0aGlzLl9ybXM9TWF0aC5tYXgocyx0aGlzLl9ybXMqdGhpcy5zbW9vdGhpbmcpLHQuZ2FpblRvRGIodGhpcy5fcm1zKX0sdC5NZXRlci5wcm90b3R5cGUuZ2V0VmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYW5hbHlzZXIuZ2V0VmFsdWUoKVswXX0sdC5NZXRlci5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX2FuYWx5c2VyLmRpc3Bvc2UoKSx0aGlzLl9hbmFseXNlcj1udWxsLHRoaXN9LHQuTWV0ZXJ9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNDMpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3JldHVybiB0LkxpbWl0ZXI9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJ0aHJlc2hvbGRcIl0sdC5MaW1pdGVyKTt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLHRoaXMuX2NvbXByZXNzb3I9dGhpcy5pbnB1dD10aGlzLm91dHB1dD1uZXcgdC5Db21wcmVzc29yKHthdHRhY2s6LjAwMSxkZWNheTouMDAxLHRocmVzaG9sZDplLnRocmVzaG9sZH0pLHRoaXMudGhyZXNob2xkPXRoaXMuX2NvbXByZXNzb3IudGhyZXNob2xkLHRoaXMuX3JlYWRPbmx5KFwidGhyZXNob2xkXCIpfSx0LmV4dGVuZCh0LkxpbWl0ZXIsdC5BdWRpb05vZGUpLHQuTGltaXRlci5kZWZhdWx0cz17dGhyZXNob2xkOi0xMn0sdC5MaW1pdGVyLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksdGhpcy5fY29tcHJlc3Nvci5kaXNwb3NlKCksdGhpcy5fY29tcHJlc3Nvcj1udWxsLHRoaXMuX3dyaXRhYmxlKFwidGhyZXNob2xkXCIpLHRoaXMudGhyZXNob2xkPW51bGwsdGhpc30sdC5MaW1pdGVyfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlLGkpe3ZhciBuLG87bj1baSgwKSxpKDU3KSxpKDg4KSxpKDIpXSx2b2lkIDA9PT0obz1mdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gdC5HYXRlPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1widGhyZXNob2xkXCIsXCJzbW9vdGhpbmdcIl0sdC5HYXRlKTt0LkF1ZGlvTm9kZS5jYWxsKHRoaXMpLHRoaXMuY3JlYXRlSW5zT3V0cygxLDEpLHRoaXMuX2ZvbGxvd2VyPW5ldyB0LkZvbGxvd2VyKGUuc21vb3RoaW5nKSx0aGlzLl9ndD1uZXcgdC5HcmVhdGVyVGhhbih0LmRiVG9HYWluKGUudGhyZXNob2xkKSksdGhpcy5pbnB1dC5jb25uZWN0KHRoaXMub3V0cHV0KSx0aGlzLmlucHV0LmNoYWluKHRoaXMuX2ZvbGxvd2VyLHRoaXMuX2d0LHRoaXMub3V0cHV0LmdhaW4pfSx0LmV4dGVuZCh0LkdhdGUsdC5BdWRpb05vZGUpLHQuR2F0ZS5kZWZhdWx0cz17c21vb3RoaW5nOi4xLHRocmVzaG9sZDotNDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkdhdGUucHJvdG90eXBlLFwidGhyZXNob2xkXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0LmdhaW5Ub0RiKHRoaXMuX2d0LnZhbHVlKX0sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX2d0LnZhbHVlPXQuZGJUb0dhaW4oZSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuR2F0ZS5wcm90b3R5cGUsXCJzbW9vdGhpbmdcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZvbGxvd2VyLnNtb290aGluZ30sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2ZvbGxvd2VyLnNtb290aGluZz10fX0pLHQuR2F0ZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX2ZvbGxvd2VyLmRpc3Bvc2UoKSx0aGlzLl9ndC5kaXNwb3NlKCksdGhpcy5fZm9sbG93ZXI9bnVsbCx0aGlzLl9ndD1udWxsLHRoaXN9LHQuR2F0ZX0uYXBwbHkoZSxuKSl8fCh0LmV4cG9ydHM9byl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbixvO249W2koMCksaSg0NCksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuRkZUPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wic2l6ZVwiXSx0LkZGVCk7ZS50eXBlPXQuQW5hbHlzZXIuVHlwZS5GRlQsdC5BdWRpb05vZGUuY2FsbCh0aGlzKSx0aGlzLl9hbmFseXNlcj10aGlzLmlucHV0PXRoaXMub3V0cHV0PW5ldyB0LkFuYWx5c2VyKGUpfSx0LmV4dGVuZCh0LkZGVCx0LkF1ZGlvTm9kZSksdC5GRlQuZGVmYXVsdHM9e3NpemU6MTAyNH0sdC5GRlQucHJvdG90eXBlLmdldFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FuYWx5c2VyLmdldFZhbHVlKCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkZGVC5wcm90b3R5cGUsXCJzaXplXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbmFseXNlci5zaXplfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fYW5hbHlzZXIuc2l6ZT10fX0pLHQuRkZULnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dC5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKSx0aGlzLl9hbmFseXNlci5kaXNwb3NlKCksdGhpcy5fYW5hbHlzZXI9bnVsbH0sdC5GRlR9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoNTkpLGkoMyksaSgyKV0sdm9pZCAwPT09KG89ZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIHQuRVEzPWZ1bmN0aW9uKCl7dmFyIGU9dC5kZWZhdWx0cyhhcmd1bWVudHMsW1wibG93XCIsXCJtaWRcIixcImhpZ2hcIl0sdC5FUTMpO3QuQXVkaW9Ob2RlLmNhbGwodGhpcyksdGhpcy5vdXRwdXQ9bmV3IHQuR2Fpbix0aGlzLl9tdWx0aWJhbmRTcGxpdD10aGlzLmlucHV0PW5ldyB0Lk11bHRpYmFuZFNwbGl0KHtsb3dGcmVxdWVuY3k6ZS5sb3dGcmVxdWVuY3ksaGlnaEZyZXF1ZW5jeTplLmhpZ2hGcmVxdWVuY3l9KSx0aGlzLl9sb3dHYWluPW5ldyB0LkdhaW4oZS5sb3csdC5UeXBlLkRlY2liZWxzKSx0aGlzLl9taWRHYWluPW5ldyB0LkdhaW4oZS5taWQsdC5UeXBlLkRlY2liZWxzKSx0aGlzLl9oaWdoR2Fpbj1uZXcgdC5HYWluKGUuaGlnaCx0LlR5cGUuRGVjaWJlbHMpLHRoaXMubG93PXRoaXMuX2xvd0dhaW4uZ2Fpbix0aGlzLm1pZD10aGlzLl9taWRHYWluLmdhaW4sdGhpcy5oaWdoPXRoaXMuX2hpZ2hHYWluLmdhaW4sdGhpcy5RPXRoaXMuX211bHRpYmFuZFNwbGl0LlEsdGhpcy5sb3dGcmVxdWVuY3k9dGhpcy5fbXVsdGliYW5kU3BsaXQubG93RnJlcXVlbmN5LHRoaXMuaGlnaEZyZXF1ZW5jeT10aGlzLl9tdWx0aWJhbmRTcGxpdC5oaWdoRnJlcXVlbmN5LHRoaXMuX211bHRpYmFuZFNwbGl0Lmxvdy5jaGFpbih0aGlzLl9sb3dHYWluLHRoaXMub3V0cHV0KSx0aGlzLl9tdWx0aWJhbmRTcGxpdC5taWQuY2hhaW4odGhpcy5fbWlkR2Fpbix0aGlzLm91dHB1dCksdGhpcy5fbXVsdGliYW5kU3BsaXQuaGlnaC5jaGFpbih0aGlzLl9oaWdoR2Fpbix0aGlzLm91dHB1dCksdGhpcy5fcmVhZE9ubHkoW1wibG93XCIsXCJtaWRcIixcImhpZ2hcIixcImxvd0ZyZXF1ZW5jeVwiLFwiaGlnaEZyZXF1ZW5jeVwiXSl9LHQuZXh0ZW5kKHQuRVEzLHQuQXVkaW9Ob2RlKSx0LkVRMy5kZWZhdWx0cz17bG93OjAsbWlkOjAsaGlnaDowLGxvd0ZyZXF1ZW5jeTo0MDAsaGlnaEZyZXF1ZW5jeToyNTAwfSx0LkVRMy5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcImxvd1wiLFwibWlkXCIsXCJoaWdoXCIsXCJsb3dGcmVxdWVuY3lcIixcImhpZ2hGcmVxdWVuY3lcIl0pLHRoaXMuX211bHRpYmFuZFNwbGl0LmRpc3Bvc2UoKSx0aGlzLl9tdWx0aWJhbmRTcGxpdD1udWxsLHRoaXMubG93RnJlcXVlbmN5PW51bGwsdGhpcy5oaWdoRnJlcXVlbmN5PW51bGwsdGhpcy5fbG93R2Fpbi5kaXNwb3NlKCksdGhpcy5fbG93R2Fpbj1udWxsLHRoaXMuX21pZEdhaW4uZGlzcG9zZSgpLHRoaXMuX21pZEdhaW49bnVsbCx0aGlzLl9oaWdoR2Fpbi5kaXNwb3NlKCksdGhpcy5faGlnaEdhaW49bnVsbCx0aGlzLmxvdz1udWxsLHRoaXMubWlkPW51bGwsdGhpcy5oaWdoPW51bGwsdGhpcy5RPW51bGwsdGhpc30sdC5FUTN9LmFwcGx5KGUsbikpfHwodC5leHBvcnRzPW8pfSxmdW5jdGlvbih0LGUsaSl7dmFyIG4sbztuPVtpKDApLGkoOTUpLGkoOTEpLGkoMildLHZvaWQgMD09PShvPWZ1bmN0aW9uKHQpe3JldHVybiB0LkNoYW5uZWw9ZnVuY3Rpb24oKXt2YXIgZT10LmRlZmF1bHRzKGFyZ3VtZW50cyxbXCJ2b2x1bWVcIixcInBhblwiXSx0LlBhblZvbCk7dC5BdWRpb05vZGUuY2FsbCh0aGlzLGUpLHRoaXMuX3NvbG89dGhpcy5pbnB1dD1uZXcgdC5Tb2xvKGUuc29sbyksdGhpcy5fcGFuVm9sPXRoaXMub3V0cHV0PW5ldyB0LlBhblZvbCh7cGFuOmUucGFuLHZvbHVtZTplLnZvbHVtZSxtdXRlOmUubXV0ZX0pLHRoaXMucGFuPXRoaXMuX3BhblZvbC5wYW4sdGhpcy52b2x1bWU9dGhpcy5fcGFuVm9sLnZvbHVtZSx0aGlzLl9zb2xvLmNvbm5lY3QodGhpcy5fcGFuVm9sKSx0aGlzLl9yZWFkT25seShbXCJwYW5cIixcInZvbHVtZVwiXSl9LHQuZXh0ZW5kKHQuQ2hhbm5lbCx0LkF1ZGlvTm9kZSksdC5DaGFubmVsLmRlZmF1bHRzPXtwYW46MCx2b2x1bWU6MCxtdXRlOiExLHNvbG86ITF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkNoYW5uZWwucHJvdG90eXBlLFwic29sb1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc29sby5zb2xvfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fc29sby5zb2xvPXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuQ2hhbm5lbC5wcm90b3R5cGUsXCJtdXRlZFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc29sby5tdXRlZHx8dGhpcy5tdXRlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LkNoYW5uZWwucHJvdG90eXBlLFwibXV0ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFuVm9sLm11dGV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9wYW5Wb2wubXV0ZT10fX0pLHQuQ2hhbm5lbC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3JldHVybiB0LkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX3dyaXRhYmxlKFtcInBhblwiLFwidm9sdW1lXCJdKSx0aGlzLl9wYW5Wb2wuZGlzcG9zZSgpLHRoaXMuX3BhblZvbD1udWxsLHRoaXMucGFuPW51bGwsdGhpcy52b2x1bWU9bnVsbCx0aGlzLl9zb2xvLmRpc3Bvc2UoKSx0aGlzLl9zb2xvPW51bGwsdGhpc30sdC5DaGFubmVsfS5hcHBseShlLG4pKXx8KHQuZXhwb3J0cz1vKX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9XCIxMy40LjlcIn0sZnVuY3Rpb24odCxlKXt2YXIgaTtpPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7dHJ5e2k9aXx8RnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpfHwoMCxldmFsKShcInRoaXNcIil9Y2F0Y2godCl7XCJvYmplY3RcIj09dHlwZW9mIHdpbmRvdyYmKGk9d2luZG93KX10LmV4cG9ydHM9aX0sZnVuY3Rpb24odCxlLGkpe2koMzApLGkoNDQpLGkoMTUyKSxpKDQzKSxpKDIzKSxpKDQ3KSxpKDE1MSksaSg1OCksaSgxNTApLGkoOSksaSg1NyksaSg0MSksaSgxNDkpLGkoMTIpLGkoMTQ4KSxpKDUzKSxpKDEwKSxpKDE0NyksaSgxNDYpLGkoNTEpLGkoNTIpLGkoMTQ1KSxpKDE0NCksaSg1OSksaSg2MCksaSgxNDMpLGkoOTUpLGkoODkpLGkoOTEpLGkoMTkpLGkoMjcpLGkoMTQyKSxpKDE0MSksaSgxNDApLGkoODApLGkoMTM5KSxpKDIpLGkoMTEpLGkoNzkpLGkoMTM4KSxpKDg2KSxpKDIwKSxpKDE4KSxpKDEzNyksaSgzNSksaSgzKSxpKDg0KSxpKDEzNiksaSg0MCksaSg3OCksaSg2MiksaSgxNCksaSgyNCksaSgzMyksaSgxNiksaSg1NSksaSg4MyksaSgxMzUpLGkoMTM0KSxpKDEzMyksaSgxMzIpLGkoMTMxKSxpKDEzMCksaSg3NiksaSgxMjkpLGkoOCksaSgxMjgpLGkoMzIpLGkoMTI3KSxpKDEyNiksaSg3NSksaSgxMjUpLGkoMTI0KSxpKDEyMyksaSgxMjIpLGkoMTUpLGkoMTIxKSxpKDEyMCksaSg3NCksaSgxMTkpLGkoMTE4KSxpKDUwKSxpKDczKSxpKDcyKSxpKDExNyksaSgxMTYpLGkoMTE1KSxpKDExNCksaSgxMTMpLGkoMjEpLGkoMTEyKSxpKDExMSksaSgyNSksaSg2OCksaSgxMTApLGkoMTA5KSxpKDEwOCksaSgxMDcpLGkoMzgpLGkoOTYpLGkoODEpLGkoMzQpLGkoNjMpLGkoOTcpLGkoNjYpLGkoMTA2KSxpKDkyKSxpKDk4KSxpKDkwKSxpKDI5KSxpKDIyKSxpKDkzKSxpKDEwNSksaSg4OCksaSg4NyksaSg3NyksaSg1KSxpKDk0KSxpKDEwNCksaSg2MSksaSgyNiksaSg0MiksaSgxKSxpKDM2KSxpKDEzKSxpKDg1KSxpKDEwMyksaSg3KSxpKDI4KSxpKDcwKSxpKDMxKSxpKDY5KSxpKDQ4KSxpKDEwMiksaSgzOSksaSgzNyksaSgxNyksaSg4MiksaSg2NyksaSgxMDEpLGkoNDkpLGkoNzEpLGkoNiksaSg1NiksaSgxMDApLGkoNDYpLGkoOTkpLGkoNTQpLGkoNjUpLGkoNjQpLGkoNDUpLGkoNCksdC5leHBvcnRzPWkoMCl9XSl9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRvbmUuanMubWFwIiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIiwiaW1wb3J0IHRvbmUgZnJvbSBcInRvbmVcIjtcclxuaW1wb3J0IHsgYXNzZXJ0TmV2ZXIsIG5vdGVzIH0gZnJvbSBcIi4vaW5kZXhcIjtcclxuaW1wb3J0IHsgaW5zdHJ1bWVudERhdGEgfSBmcm9tIFwiLi9kYXRhXCI7XHJcblxyXG5mdW5jdGlvbiBzZXRTYW1wbGVyUmVsZWFzZShzYW1wbGVyOiB0b25lLlNhbXBsZXIsIGluc3RydW1lbnQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgaW5zdHJ1bWVudER1cmF0aW9uID0gaW5zdHJ1bWVudERhdGFbaW5zdHJ1bWVudF1bXCJkdXJhdGlvblwiXTtcclxuXHJcbiAgICBzd2l0Y2ggKGluc3RydW1lbnREdXJhdGlvbikge1xyXG4gICAgICAgIGNhc2UgXCJpbnN0YW50XCI6XHJcbiAgICAgICAgICAgIHNhbXBsZXIucmVsZWFzZSA9IDAuMDU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJtaW5pXCI6XHJcbiAgICAgICAgICAgIHNhbXBsZXIucmVsZWFzZSA9IDAuMTI1O1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwic2hvcnRcIjpcclxuICAgICAgICAgICAgc2FtcGxlci5yZWxlYXNlID0gMC4yNTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcIm1pZFwiOlxyXG4gICAgICAgICAgICBzYW1wbGVyLnJlbGVhc2UgPSAwLjQ7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJsb25nXCI6XHJcbiAgICAgICAgICAgIHNhbXBsZXIucmVsZWFzZSA9IDE7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJleHRlbmRlZFwiOlxyXG4gICAgICAgICAgICBzYW1wbGVyLnJlbGVhc2UgPSAxLjU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJtZWdhXCI6XHJcbiAgICAgICAgICAgIHNhbXBsZXIucmVsZWFzZSA9IDU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJjb25zdGFudFwiOlxyXG4gICAgICAgICAgICBzYW1wbGVyLnJlbGVhc2UgPSAzMDtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcImluZmluaXRlXCI6XHJcbiAgICAgICAgICAgIHNhbXBsZXIucmVsZWFzZSA9IDAuMTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYXNzZXJ0TmV2ZXIoaW5zdHJ1bWVudER1cmF0aW9uKTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0U2FtcGxlckN1cnZlKHNhbXBsZXI6IHRvbmUuU2FtcGxlcikge1xyXG4gICAgKHNhbXBsZXIgYXMgYW55KS5jdXJ2ZSA9IFwibGluZWFyXCI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTYW1wbGVyKFxyXG4gICAgaW5zdHJ1bWVudDogc3RyaW5nLFxyXG4gICAgZXh0ZW5zaW9uOiBzdHJpbmcgPSBcIm9nZ1wiLFxyXG4gICAgYmFzZVVybDogc3RyaW5nID0gXCIvYm9zY2EtY2VvaWwtanMvYXVkaW8vXCJcclxuKTogdG9uZS5TYW1wbGVyIHtcclxuICAgIGxldCBzYW1wbGVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XHJcbiAgICBmb3IgKGNvbnN0IG5vdGUgb2Ygbm90ZXMpIHtcclxuICAgICAgICBzYW1wbGVzW25vdGVdID0gYCR7aW5zdHJ1bWVudH0vJHtub3RlLnRvTG93ZXJDYXNlKCl9LiR7ZXh0ZW5zaW9ufWA7XHJcbiAgICB9XHJcbiAgICBsZXQgc2FtcGxlciA9IG5ldyB0b25lLlNhbXBsZXIoc2FtcGxlcywgdW5kZWZpbmVkLCBiYXNlVXJsKTtcclxuICAgIHNldFNhbXBsZXJDdXJ2ZShzYW1wbGVyKTtcclxuICAgIHNldFNhbXBsZXJSZWxlYXNlKHNhbXBsZXIsIGluc3RydW1lbnQpO1xyXG4gICAgcmV0dXJuIHNhbXBsZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VTYW1wbGVyKFxyXG4gICAgc2FtcGxlcjogdG9uZS5TYW1wbGVyLFxyXG4gICAgaW5zdHJ1bWVudDogc3RyaW5nLFxyXG4gICAgZXh0ZW5zaW9uOiBzdHJpbmcgPSBcIm9nZ1wiLFxyXG4pOiB0b25lLlNhbXBsZXIge1xyXG4gICAgZm9yIChjb25zdCBub3RlIG9mIG5vdGVzKSB7XHJcbiAgICAgICAgc2FtcGxlci5hZGQobm90ZSwgYCR7aW5zdHJ1bWVudH0vJHtub3RlLnRvTG93ZXJDYXNlKCl9LiR7ZXh0ZW5zaW9ufWApO1xyXG4gICAgfVxyXG4gICAgc2V0U2FtcGxlckN1cnZlKHNhbXBsZXIpO1xyXG4gICAgc2V0U2FtcGxlclJlbGVhc2Uoc2FtcGxlciwgaW5zdHJ1bWVudCk7XHJcbiAgICByZXR1cm4gc2FtcGxlcjtcclxufVxyXG4iLCJpbXBvcnQgeyBJbnN0cnVtZW50RGF0YSB9IGZyb20gXCIuL2luZGV4XCI7XHJcblxyXG5leHBvcnQgY29uc3QgaW5zdHJ1bWVudERhdGE6IEluc3RydW1lbnREYXRhID0gcmVxdWlyZShcIi4uL2luc3RydW1lbnRzLnlhbWxcIik7XHJcbiIsImV4cG9ydCBmdW5jdGlvbiBhc3NlcnROZXZlcih4OiBuZXZlcik6IG5ldmVyIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihgVW5leGhhdXN0aXZlIGNvbmRpdGlvbiBsZWFkaW5nIHRvIHZhbHVlOiAke3h9YCk7XHJcbn1cclxuXHJcbi8vIER1cmF0aW9uczpcclxuLy8gLSBDb25zdGFudCBtZWFucyB0aGF0IHRoZSBzb3VuZCBwbGF5cyBmb3IgdGhlIHNhbWUgYW1vdW50IG9mIHRpbWVcclxuLy8gICByZWdhcmRsZXNzIG9mIHRoZSBsZW5ndGggb2YgdGhlIG5vdGUgaW4gQm9zY2EgQ2VvaWwuXHJcbi8vIC0gSW5maW5pdGUgbWVhbnMgdGhhdCB0aGUgc291bmQgcGxheXMgZm9yIGhvd2V2ZXIgYXJiaXRyYXJpbHkgbG9uZ1xyXG4vLyAgIHRoZSBCb3NjYSBDZW9pbCBub3RlIGlzLlxyXG4vLyAtIFRoZSBvdGhlcnMgYXJlIGZpbml0ZSB0aW1lcywgbWVhbmluZyB0aGF0IHRoZSBzb3VuZCB3aWxsIHBsYXkgdXAgdG9cclxuLy8gICBhIG1heCB0aW1lLCBidXQgYWZ0ZXIgdGhhdCBwb2ludCwgaXQgd2lsbCBnbyBzaWxlbnQgcmVnYXJkbGVzcyBvZiBob3dcclxuLy8gICBsb25nIHRoZSBub3RlIGlzIGluIEJvc2NhIENlb2lsLlxyXG5leHBvcnQgaW50ZXJmYWNlIEluc3RydW1lbnQge1xyXG4gICAgaW5kZXg6IG51bWJlcjtcclxuICAgIGR1cmF0aW9uOiBcImluc3RhbnRcIiB8IFwibWluaVwiIHwgXCJzaG9ydFwiIHwgXCJtaWRcIiB8IFwibG9uZ1wiIHwgXCJleHRlbmRlZFwiIHwgXCJtZWdhXCIgfCBcImNvbnN0YW50XCIgfCBcImluZmluaXRlXCI7XHJcbiAgICByZWxlYXNlOiBudW1iZXI7XHJcbiAgICBjYXRlZ29yeTogQXJyYXk8c3RyaW5nPjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSW5zdHJ1bWVudERhdGEgPSB7IFtrZXk6IHN0cmluZ106IEluc3RydW1lbnQgfTtcclxuXHJcbmV4cG9ydCBjb25zdCBub3RlcyA9IFtcIkMxXCIsIFwiQzJcIiwgXCJDM1wiLCBcIkM0XCIsIFwiQzVcIiwgXCJDNlwiLCBcIkM3XCIsIFwiQzhcIiwgXCJDOVwiXTtcclxuIiwicmVxdWlyZShcIkBtYXRlcmlhbC9yZWFjdC1idXR0b24vZGlzdC9idXR0b24uY3NzXCIpO1xyXG5yZXF1aXJlKFwiQG1hdGVyaWFsL3JlYWN0LXNlbGVjdC9kaXN0L3NlbGVjdC5jc3NcIik7XHJcbnJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtdGV4dC1maWVsZC9kaXN0L3RleHQtZmllbGQuY3NzXCIpO1xyXG5yZXF1aXJlKFwiQG1hdGVyaWFsL3JlYWN0LW1lbnUtc3VyZmFjZS9kaXN0L21lbnUtc3VyZmFjZS5jc3NcIik7XHJcbnJlcXVpcmUoXCJAbWF0ZXJpYWwvcmVhY3QtZGlhbG9nL2Rpc3QvZGlhbG9nLmNzc1wiKTtcclxuXHJcbmltcG9ydCB7IHN0b3JlLCB2aWV3IH0gZnJvbSBcInJlYWN0LWVhc3ktc3RhdGVcIjtcclxuaW1wb3J0IHRvbmUgZnJvbSBcInRvbmVcIjtcclxuXHJcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IFJlYWN0RG9tIGZyb20gXCJyZWFjdC1kb21cIjtcclxuaW1wb3J0IEJ1dHRvbiBmcm9tIFwiQG1hdGVyaWFsL3JlYWN0LWJ1dHRvblwiO1xyXG5pbXBvcnQgU2VsZWN0LCB7IE9wdGlvbiB9IGZyb20gXCJAbWF0ZXJpYWwvcmVhY3Qtc2VsZWN0XCI7XHJcbmltcG9ydCBUZXh0RmllbGQsIHsgSW5wdXQgfSBmcm9tIFwiQG1hdGVyaWFsL3JlYWN0LXRleHQtZmllbGRcIjtcclxuaW1wb3J0IE1lbnVTdXJmYWNlLCB7IENvcm5lciB9IGZyb20gXCJAbWF0ZXJpYWwvcmVhY3QtbWVudS1zdXJmYWNlXCI7XHJcbmltcG9ydCBEaWFsb2csIHsgRGlhbG9nVGl0bGUsIERpYWxvZ0NvbnRlbnQsIERpYWxvZ0Zvb3RlciwgRGlhbG9nQnV0dG9uIH0gZnJvbSBcIkBtYXRlcmlhbC9yZWFjdC1kaWFsb2dcIjtcclxuXHJcbmltcG9ydCB7IGNoYW5nZVNhbXBsZXIsIGdldFNhbXBsZXIgfSBmcm9tIFwiLi9hdWRpb1wiO1xyXG5pbXBvcnQgeyBpbnN0cnVtZW50RGF0YSB9IGZyb20gXCIuL2RhdGFcIjtcclxuaW1wb3J0IHsgYXNzZXJ0TmV2ZXIgfSBmcm9tIFwiLi9pbmRleFwiO1xyXG5cclxubGV0IHBsYXlpbmcgPSBmYWxzZTtcclxuY29uc3QgbGV0dGVycyA9IFtcIkNcIiwgXCJDI1wiLCBcIkRcIiwgXCJEI1wiLCBcIkVcIiwgXCJGXCIsIFwiRiNcIiwgXCJHXCIsIFwiRyNcIiwgXCJBXCIsIFwiQSNcIiwgXCJCXCJdO1xyXG5jb25zdCBjaG9yZHMgPSBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV07XHJcblxyXG5mdW5jdGlvbiBmcm9tTWF5YmVzPFQ+KG1heWJlczogQXJyYXk8VCB8IG51bGwgfCB1bmRlZmluZWQ+LCBmYWxsYmFjazogVCkge1xyXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBtYXliZXMpIHtcclxuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbGxiYWNrO1xyXG59XHJcblxyXG5jbGFzcyBTb25nIHtcclxuICAgIG1ldGE6IFNvbmdNZXRhID0gbmV3IFNvbmdNZXRhKCk7XHJcbiAgICBlZmZlY3RzOiBFZmZlY3RzID0gbmV3IEVmZmVjdHMoKTtcclxuICAgIHBhdHRlcm5zOiBBcnJheTxQYXR0ZXJuPiA9IFtuZXcgUGF0dGVybigpXTtcclxuICAgIGNoYW5uZWxzOiBBcnJheTxDaGFubmVsPiA9IFtuZXcgQ2hhbm5lbCgpXTtcclxuICAgIHBsYXlpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICB0b2dnbGVBdWRpbygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5wbGF5aW5nKSB7XHJcbiAgICAgICAgICAgIHRvbmUuVHJhbnNwb3J0LnN0b3AoKTtcclxuICAgICAgICAgICAgdG9uZS5UcmFuc3BvcnQucG9zaXRpb24gPSBcIjBcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXN1bWVBdWRpb0NvbnRleHQoKTtcclxuICAgICAgICAgICAgdG9uZS5UcmFuc3BvcnQubG9vcEVuZCA9IFwiMW1cIjtcclxuICAgICAgICAgICAgdG9uZS5UcmFuc3BvcnQubG9vcCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRvbmUuVHJhbnNwb3J0LnRvZ2dsZSgwKTtcclxuICAgICAgICB0aGlzLnBsYXlpbmcgPSAhdGhpcy5wbGF5aW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEVmZmVjdChlZmZlY3Q6IGtleW9mIEVmZmVjdHMsIGNoYW5uZWw6IG51bWJlciwgcGF0dGVybjogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gZnJvbU1heWJlcyhcclxuICAgICAgICAgICAgW1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXR0ZXJuc1twYXR0ZXJuXS5lZmZlY3RzW2VmZmVjdF0sXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxzW2NoYW5uZWxdLmVmZmVjdHNbZWZmZWN0XSxcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgdGhpcy5lZmZlY3RzW2VmZmVjdF1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEVmZmVjdEJ5KGVmZmVjdDoga2V5b2YgRWZmZWN0cywgbGV2ZWw6IFwic29uZ1wiIHwgXCJjaGFubmVsXCIgfCBcInBhdHRlcm5cIiwgaW5kZXg6IG51bWJlciA9IDApIHtcclxuICAgICAgICBzd2l0Y2ggKGxldmVsKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJzb25nXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lZmZlY3RzW2VmZmVjdF07XHJcbiAgICAgICAgICAgIGNhc2UgXCJjaGFubmVsXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFubmVsc1tpbmRleF0uZWZmZWN0c1tlZmZlY3RdO1xyXG4gICAgICAgICAgICBjYXNlIFwicGF0dGVyblwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGF0dGVybnNbaW5kZXhdLmVmZmVjdHNbZWZmZWN0XTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RWZmZWN0QnkoZWZmZWN0OiBrZXlvZiBFZmZlY3RzLCB2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBsZXZlbDogXCJzb25nXCIgfCBcImNoYW5uZWxcIiB8IFwicGF0dGVyblwiLCBpbmRleDogbnVtYmVyID0gMCkge1xyXG4gICAgICAgIHN3aXRjaCAobGV2ZWwpIHtcclxuICAgICAgICAgICAgY2FzZSBcInNvbmdcIjpcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uZy1sZXZlbCBlZmZlY3RzIGNhbm5vdCBiZSB1bmRlZmluZWRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdHNbZWZmZWN0XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCB0aGlzLmNoYW5uZWxzLmxlbmd0aDsgY2hhbm5lbCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHRoaXMuY2hhbm5lbHNbY2hhbm5lbF0ucGF0dGVybnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGF0dGVybnNbcGF0dGVybl0ucGlwZWxpbmUuc2V0RWZmZWN0KGVmZmVjdCwgdGhpcy5nZXRFZmZlY3QoZWZmZWN0LCBjaGFubmVsLCBwYXR0ZXJuKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImNoYW5uZWxcIjpcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbHNbaW5kZXhdLmVmZmVjdHNbZWZmZWN0XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHRoaXMuY2hhbm5lbHNbaW5kZXhdLnBhdHRlcm5zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXR0ZXJuc1twYXR0ZXJuXS5waXBlbGluZS5zZXRFZmZlY3QoZWZmZWN0LCB0aGlzLmdldEVmZmVjdChlZmZlY3QsIGluZGV4LCBwYXR0ZXJuKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJwYXR0ZXJuXCI6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhdHRlcm5zW2luZGV4XS5lZmZlY3RzW2VmZmVjdF0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgdGhpcy5jaGFubmVscy5sZW5ndGg7IGNoYW5uZWwrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiB0aGlzLmNoYW5uZWxzW2NoYW5uZWxdLnBhdHRlcm5zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuID09PSBpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXR0ZXJuc1twYXR0ZXJuXS5waXBlbGluZS5zZXRFZmZlY3QoZWZmZWN0LCB0aGlzLmdldEVmZmVjdChlZmZlY3QsIGNoYW5uZWwsIGluZGV4KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5zdHJ1bWVudCh2YWx1ZTogc3RyaW5nLCBwYXR0ZXJuOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnBhdHRlcm5zW3BhdHRlcm5dLmluc3RydW1lbnQgPSB2YWx1ZTtcclxuICAgICAgICBjaGFuZ2VTYW1wbGVyKHRoaXMucGF0dGVybnNbcGF0dGVybl0ucGlwZWxpbmUuc2FtcGxlciwgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEJwbSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5tZXRhLmJwbSA9IHZhbHVlO1xyXG4gICAgICAgIHRvbmUuVHJhbnNwb3J0LmJwbS52YWx1ZSA9IHNvbmcubWV0YS5icG07XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U3dpbmcodmFsdWU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubWV0YS5zd2luZyA9IHZhbHVlO1xyXG4gICAgICAgIHRvbmUuVHJhbnNwb3J0LnN3aW5nID0gc29uZy5tZXRhLnN3aW5nO1xyXG4gICAgICAgIHRvbmUuVHJhbnNwb3J0LnN3aW5nU3ViZGl2aXNpb24gPSBcIjE2blwiO1xyXG4gICAgfVxyXG5cclxuICAgIHNjaGVkdWxlTm90ZShjaGFubmVsOiBudW1iZXIsIHBhdHRlcm46IG51bWJlciwgY2hvcmQ6IG51bWJlciwgbGV0dGVyOiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyLCBub3RlQ2VsbDogTm90ZUNlbGwpIHtcclxuICAgICAgICB0aGlzLnVuc2NoZWR1bGVOb3RlKGNoYW5uZWwsIHBhdHRlcm4sIGNob3JkLCBsZXR0ZXIsIGluZGV4KTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhgU29uZy5zY2hlZHVsZU5vdGUoY2hvcmQ9JHtjaG9yZH0sIGxldHRlcj0ke2xldHRlcn0sIGluZGV4PSR7aW5kZXh9LCBsZW5ndGg9JHtsZW5ndGh9KWApO1xyXG4gICAgICAgIHRoaXMucGF0dGVybnNbcGF0dGVybl0ubm90ZXNbY2hvcmRdW2xldHRlcl1baW5kZXhdLmxlbmd0aCA9IGxlbmd0aDtcclxuXHJcbiAgICAgICAgdGhpcy5wYXR0ZXJuc1twYXR0ZXJuXS5ub3Rlc1tjaG9yZF1bbGV0dGVyXVtpbmRleF0uc2NoZWR1bGVkRXZlbnQgPSB0b25lLlRyYW5zcG9ydC5zY2hlZHVsZShcclxuICAgICAgICAgICAgdGltZSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhdHRlcm5zW3BhdHRlcm5dLnBpcGVsaW5lLnNhbXBsZXIudHJpZ2dlckF0dGFja1JlbGVhc2UoXHJcbiAgICAgICAgICAgICAgICAgICAgYCR7bGV0dGVyfSR7Y2hvcmR9YCwgdG9uZS5UaW1lKFwiMTZuXCIpICogbGVuZ3RoLCB0aW1lXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgdG9uZS5EcmF3LnNjaGVkdWxlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBub3RlQ2VsbC5zZXRTdGF0ZSh7IHBsYXlpbmc6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGVDZWxsLnNldFN0YXRlKHsgcGxheWluZzogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgMTAwICogbGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIH0sIHRpbWUpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBgMDowOiR7aW5kZXh9YFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgdW5zY2hlZHVsZU5vdGUoY2hhbm5lbDogbnVtYmVyLCBwYXR0ZXJuOiBudW1iZXIsIGNob3JkOiBudW1iZXIsIGxldHRlcjogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFNvbmcudW5zY2hlZHVsZU5vdGUoY2hvcmQ9JHtjaG9yZH0sIGxldHRlcj0ke2xldHRlcn0sIGluZGV4PSR7aW5kZXh9LCBsZW5ndGg9JHtsZW5ndGh9KWApO1xyXG4gICAgICAgIHRoaXMucGF0dGVybnNbcGF0dGVybl0ubm90ZXNbY2hvcmRdW2xldHRlcl1baW5kZXhdLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgY29uc3Qgc2NoZWR1bGVlID0gdGhpcy5wYXR0ZXJuc1twYXR0ZXJuXS5ub3Rlc1tjaG9yZF1bbGV0dGVyXVtpbmRleF0uc2NoZWR1bGVkRXZlbnQ7XHJcbiAgICAgICAgaWYgKHNjaGVkdWxlZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0b25lLlRyYW5zcG9ydC5jbGVhcihzY2hlZHVsZWUpO1xyXG4gICAgICAgICAgICB0aGlzLnBhdHRlcm5zW3BhdHRlcm5dLm5vdGVzW2Nob3JkXVtsZXR0ZXJdW2luZGV4XS5zY2hlZHVsZWRFdmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBTb25nTWV0YSB7XHJcbiAgICBicG06IG51bWJlciA9IDEyMDtcclxuICAgIHN3aW5nOiBudW1iZXIgPSAwO1xyXG59XHJcblxyXG5jbGFzcyBFZmZlY3RzIHtcclxuICAgIHZvbHVtZTogbnVtYmVyID0gMTAwO1xyXG4gICAgcmVzb25hbmNlOiBudW1iZXIgPSAwO1xyXG4gICAgZGFtcGVuaW5nOiBudW1iZXIgPSAwO1xyXG4gICAgZGVsYXk6IG51bWJlciA9IDA7XHJcbiAgICBjaG9ydXM6IG51bWJlciA9IDA7XHJcbiAgICByZXZlcmI6IG51bWJlciA9IDA7XHJcbiAgICBkaXN0b3J0aW9uOiBudW1iZXIgPSAwO1xyXG4gICAgbG93Qm9vc3Q6IG51bWJlciA9IDA7XHJcbiAgICBjb21wcmVzc29yOiBudW1iZXIgPSAwO1xyXG4gICAgaGlnaFBhc3M6IG51bWJlciA9IDA7XHJcbn1cclxuXHJcbmNsYXNzIFBpcGVsaW5lIHtcclxuICAgIHNhbXBsZXI6IHRvbmUuU2FtcGxlcjtcclxuICAgIHZvbHVtZSA9IG5ldyB0b25lLlZvbHVtZSgwKTtcclxuICAgIGxvd1Bhc3MgPSBuZXcgdG9uZS5Mb3dwYXNzQ29tYkZpbHRlcigwLCAwKTtcclxuICAgIGRlbGF5RWZmZWN0ID0gbmV3IHRvbmUuRmVlZGJhY2tEZWxheSgwLCAwKTtcclxuICAgIGNob3J1c0VmZmVjdCA9IG5ldyB0b25lLkNob3J1cygpO1xyXG4gICAgcmV2ZXJiRWZmZWN0ID0gbmV3IHRvbmUuRnJlZXZlcmIoMCwgMzAwMCk7XHJcbiAgICBkaXN0b3J0aW9uRWZmZWN0ID0gbmV3IHRvbmUuQml0Q3J1c2hlcig0KTtcclxuICAgIGxvd0Jvb3N0RWZmZWN0ID0gbmV3IHRvbmUuRmlsdGVyKDAsIFwibG93c2hlbGZcIik7XHJcbiAgICBjb21wcmVzc29yRWZmZWN0ID0gbmV3IHRvbmUuQ29tcHJlc3NvcigwKTtcclxuICAgIGhpZ2hQYXNzRWZmZWN0ID0gbmV3IHRvbmUuRmlsdGVyKDAsIFwiaGlnaHBhc3NcIik7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaW5zdHJ1bWVudDogc3RyaW5nID0gXCJtaWRpLnBpYW5vMVwiKSB7XHJcbiAgICAgICAgdGhpcy5zYW1wbGVyID0gZ2V0U2FtcGxlcihpbnN0cnVtZW50KTtcclxuICAgICAgICB0aGlzLmNob3J1c0VmZmVjdC53ZXQudmFsdWUgPSAwO1xyXG4gICAgICAgIHRoaXMucmV2ZXJiRWZmZWN0LndldC52YWx1ZSA9IDA7XHJcbiAgICAgICAgdGhpcy5kaXN0b3J0aW9uRWZmZWN0LndldC52YWx1ZSA9IDA7XHJcblxyXG4gICAgICAgIHRoaXMuc2FtcGxlci5jaGFpbihcclxuICAgICAgICAgICAgdGhpcy52b2x1bWUsXHJcbiAgICAgICAgICAgIHRoaXMubG93UGFzcyxcclxuICAgICAgICAgICAgdGhpcy5kZWxheUVmZmVjdCxcclxuICAgICAgICAgICAgdGhpcy5jaG9ydXNFZmZlY3QsXHJcbiAgICAgICAgICAgIHRoaXMucmV2ZXJiRWZmZWN0LFxyXG4gICAgICAgICAgICB0aGlzLmRpc3RvcnRpb25FZmZlY3QsXHJcbiAgICAgICAgICAgIHRoaXMubG93Qm9vc3RFZmZlY3QsXHJcbiAgICAgICAgICAgIHRoaXMuY29tcHJlc3NvckVmZmVjdCxcclxuICAgICAgICAgICAgdGhpcy5oaWdoUGFzc0VmZmVjdCxcclxuICAgICAgICAgICAgdG9uZS5NYXN0ZXIsXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRFZmZlY3QoZWZmZWN0OiBrZXlvZiBFZmZlY3RzLCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgc3dpdGNoIChlZmZlY3QpIHtcclxuICAgICAgICAgICAgY2FzZSBcInZvbHVtZVwiOlxyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52b2x1bWUubXV0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudm9sdW1lLnZvbHVtZS52YWx1ZSA9ICh2YWx1ZSAtIDEwMCkgLyA1O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudm9sdW1lLm11dGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwicmVzb25hbmNlXCI6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvd1Bhc3MucmVzb25hbmNlLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImRhbXBlbmluZ1wiOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5sb3dQYXNzLmRhbXBlbmluZy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJkZWxheVwiOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5kZWxheUVmZmVjdC5kZWxheVRpbWUudmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB0b25lLlRpbWUoXCI4blwiKSAqIDIgKiB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGVsYXlFZmZlY3QuZmVlZGJhY2sudmFsdWUgPSAwLjE1ICogMiAqIHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJjaG9ydXNcIjpcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hvcnVzRWZmZWN0LndldC52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJyZXZlcmJcIjpcclxuICAgICAgICAgICAgICAgIHRoaXMucmV2ZXJiRWZmZWN0LnJvb21TaXplLnZhbHVlID0gdmFsdWUgKiAwLjk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJldmVyYkVmZmVjdC53ZXQudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiZGlzdG9ydGlvblwiOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5kaXN0b3J0aW9uRWZmZWN0LndldC52YWx1ZSA9IHZhbHVlID09PSAwID8gMCA6IDE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3RvcnRpb25FZmZlY3QuYml0cyA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJsb3dCb29zdFwiOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5sb3dCb29zdEVmZmVjdC5mcmVxdWVuY3kudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMubG93Qm9vc3RFZmZlY3QuZ2Fpbi52YWx1ZSA9IHZhbHVlID09PSAwID8gMCA6IDIwO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJjb21wcmVzc29yXCI6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXByZXNzb3JFZmZlY3QudGhyZXNob2xkLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImhpZ2hQYXNzXCI6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hQYXNzRWZmZWN0LmZyZXF1ZW5jeS52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBhc3NlcnROZXZlcihlZmZlY3QpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgUGF0dGVybiB7XHJcbiAgICBlZmZlY3RzOiBQYXJ0aWFsPEVmZmVjdHM+ID0ge307XHJcbiAgICBub3RlczogeyBba2V5OiBudW1iZXJdOiB7IFtrZXk6IHN0cmluZ106IEFycmF5PE5vdGU+IH0gfSA9IHt9O1xyXG4gICAgcGlwZWxpbmU6IFBpcGVsaW5lO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBpbnN0cnVtZW50OiBzdHJpbmcgPSBcIm1pZGkucGlhbm8xXCIpIHtcclxuICAgICAgICB0aGlzLnBpcGVsaW5lID0gbmV3IFBpcGVsaW5lKHRoaXMuaW5zdHJ1bWVudCk7XHJcbiAgICAgICAgZm9yIChjb25zdCBjaG9yZCBvZiBjaG9yZHMpIHtcclxuICAgICAgICAgICAgdGhpcy5ub3Rlc1tjaG9yZF0gPSB7fTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBsZXR0ZXIgb2YgbGV0dGVycykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3Rlc1tjaG9yZF1bbGV0dGVyXSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDE2IH0sICgpID0+ICh7IGxlbmd0aDogMCwgc2NoZWR1bGVkRXZlbnQ6IG51bGwgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBDaGFubmVsIHtcclxuICAgIGVmZmVjdHM6IFBhcnRpYWw8RWZmZWN0cz4gPSB7fTtcclxuICAgIHBhdHRlcm5zOiBBcnJheTxudW1iZXIgfCBudWxsPjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwYXR0ZXJuczogQXJyYXk8bnVtYmVyIHwgbnVsbD4gPSBbMF0pIHtcclxuICAgICAgICB0aGlzLnBhdHRlcm5zID0gcGF0dGVybnM7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IHNvbmc6IFNvbmcgPSBzdG9yZShuZXcgU29uZygpKTtcclxuXHJcbkB2aWV3XHJcbmNsYXNzIEVmZmVjdENob2ljZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDx7XHJcbiAgICBlZmZlY3Q6IGtleW9mIEVmZmVjdHMsXHJcbiAgICBtb2RlOiBcInNvbmdcIiB8IFwiY2hhbm5lbFwiIHwgXCJwYXR0ZXJuXCIsXHJcbiAgICBtb2RlSW5kZXg6IG51bWJlcixcclxuICAgIG1pbjogbnVtYmVyLFxyXG4gICAgbWF4OiBudW1iZXIsXHJcbiAgICBzdGVwOiBudW1iZXIsXHJcbn0+IHtcclxuICAgIGdldExhYmVsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLnByb3BzLmVmZmVjdCkge1xyXG4gICAgICAgICAgICBjYXNlIFwiY2hvcnVzXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJDaG9ydXNcIjtcclxuICAgICAgICAgICAgY2FzZSBcImNvbXByZXNzb3JcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIkNvbXByZXNzb3JcIjtcclxuICAgICAgICAgICAgY2FzZSBcImRhbXBlbmluZ1wiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiRGFtcGVuaW5nXCI7XHJcbiAgICAgICAgICAgIGNhc2UgXCJkZWxheVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiRGVsYXlcIjtcclxuICAgICAgICAgICAgY2FzZSBcImRpc3RvcnRpb25cIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIkRpc3RvcnRpb25cIjtcclxuICAgICAgICAgICAgY2FzZSBcImhpZ2hQYXNzXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJIaWdoIHBhc3NcIjtcclxuICAgICAgICAgICAgY2FzZSBcImxvd0Jvb3N0XCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJMb3cgYm9vc3RcIjtcclxuICAgICAgICAgICAgY2FzZSBcInJlc29uYW5jZVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiUmVzb25hbmNlXCI7XHJcbiAgICAgICAgICAgIGNhc2UgXCJyZXZlcmJcIjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIlJldmVyYlwiO1xyXG4gICAgICAgICAgICBjYXNlIFwidm9sdW1lXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJWb2x1bWVcIjtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBhc3NlcnROZXZlcih0aGlzLnByb3BzLmVmZmVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XHJcbiAgICAgICAgcmV0dXJuIDxUZXh0RmllbGQgbGFiZWw9e3RoaXMuZ2V0TGFiZWwoKX0+XHJcbiAgICAgICAgICAgIDxJbnB1dFxyXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ9e3RoaXMucHJvcHMubW9kZSA9PT0gXCJzb25nXCJ9XHJcbiAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgIG1pbj17dGhpcy5wcm9wcy5taW59XHJcbiAgICAgICAgICAgICAgICBtYXg9e3RoaXMucHJvcHMubWF4fVxyXG4gICAgICAgICAgICAgICAgc3RlcD17dGhpcy5wcm9wcy5zdGVwfVxyXG4gICAgICAgICAgICAgICAgdmFsdWU9e3NvbmcuZ2V0RWZmZWN0QnkodGhpcy5wcm9wcy5lZmZlY3QsIHRoaXMucHJvcHMubW9kZSwgdGhpcy5wcm9wcy5tb2RlSW5kZXgpfVxyXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLm1vZGUgIT09IFwic29uZ1wiICYmIGUuY3VycmVudFRhcmdldC52YWx1ZSA9PT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb25nLnNldEVmZmVjdEJ5KHRoaXMucHJvcHMuZWZmZWN0LCB1bmRlZmluZWQsIHRoaXMucHJvcHMubW9kZSwgdGhpcy5wcm9wcy5tb2RlSW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gcGFyc2VGbG9hdChlLmN1cnJlbnRUYXJnZXQudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obmV3VmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvbmcuc2V0RWZmZWN0QnkodGhpcy5wcm9wcy5lZmZlY3QsIG5ld1ZhbHVlLCB0aGlzLnByb3BzLm1vZGUsIHRoaXMucHJvcHMubW9kZUluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuY3VycmVudFRhcmdldC52YWx1ZSA9PT0gdW5kZWZpbmVkICYmIHRoaXMucHJvcHMubW9kZSAhPT0gXCJzb25nXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc29uZy5zZXRFZmZlY3RCeSh0aGlzLnByb3BzLmVmZmVjdCwgdW5kZWZpbmVkLCB0aGlzLnByb3BzLm1vZGUsIHRoaXMucHJvcHMubW9kZUluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgIDwvVGV4dEZpZWxkPjtcclxuICAgIH1cclxufVxyXG5cclxuQHZpZXdcclxuY2xhc3MgRWZmZWN0UGFuZWwgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8e1xyXG4gICAgbW9kZTogXCJzb25nXCIgfCBcImNoYW5uZWxcIiB8IFwicGF0dGVyblwiLFxyXG4gICAgbW9kZUluZGV4OiBudW1iZXIsXHJcbn0+IHtcclxuICAgIHN0YXRlID0ge1xyXG4gICAgICAgIG9wZW46IGZhbHNlLFxyXG4gICAgICAgIGFuY2hvckVsZW1lbnQ6IHVuZGVmaW5lZCxcclxuICAgIH07XHJcblxyXG4gICAgZ2V0QnV0dG9uVGV4dCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5wcm9wcy5tb2RlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJzb25nXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJTb25nXCI7XHJcbiAgICAgICAgICAgIGNhc2UgXCJjaGFubmVsXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJDaGFubmVsXCI7XHJcbiAgICAgICAgICAgIGNhc2UgXCJwYXR0ZXJuXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJQYXR0ZXJuXCJcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBhc3NlcnROZXZlcih0aGlzLnByb3BzLm1vZGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRBbmNob3JFbGVtZW50ID0gKGVsZW1lbnQ6IEhUTUxEaXZFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuYW5jaG9yRWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBhbmNob3JFbGVtZW50OiBlbGVtZW50IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJtZGMtbWVudS1zdXJmYWNlLS1hbmNob3IgZWZmZWN0LXBhbmVsXCJcclxuICAgICAgICAgICAgICAgIHJlZj17dGhpcy5zZXRBbmNob3JFbGVtZW50fVxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8QnV0dG9uIHJhaXNlZCBvbkNsaWNrPXsoKSA9PiB0aGlzLnNldFN0YXRlKHsgb3BlbjogdHJ1ZSB9KX0+e3RoaXMuZ2V0QnV0dG9uVGV4dCgpfTwvQnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgIDxNZW51U3VyZmFjZVxyXG4gICAgICAgICAgICAgICAgICAgIG9wZW49e3RoaXMuc3RhdGUub3Blbn1cclxuICAgICAgICAgICAgICAgICAgICBhbmNob3JDb3JuZXI9e0Nvcm5lci5CT1RUT01fTEVGVH1cclxuICAgICAgICAgICAgICAgICAgICBvbkNsb3NlPXsoKSA9PiB0aGlzLnNldFN0YXRlKHsgb3BlbjogZmFsc2UgfSl9XHJcbiAgICAgICAgICAgICAgICAgICAgYW5jaG9yRWxlbWVudD17dGhpcy5zdGF0ZS5hbmNob3JFbGVtZW50fVxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZWZmZWN0LXBhbmVsLXBvcHVwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxFZmZlY3RDaG9pY2UgZWZmZWN0PVwidm9sdW1lXCIgbWluPXswfSBtYXg9ezIwMH0gc3RlcD17NX0gbW9kZT17dGhpcy5wcm9wcy5tb2RlfSBtb2RlSW5kZXg9e3RoaXMucHJvcHMubW9kZUluZGV4fSAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8RWZmZWN0Q2hvaWNlIGVmZmVjdD1cInJlc29uYW5jZVwiIG1pbj17MH0gbWF4PXsxfSBzdGVwPXswLjA1fSBtb2RlPXt0aGlzLnByb3BzLm1vZGV9IG1vZGVJbmRleD17dGhpcy5wcm9wcy5tb2RlSW5kZXh9IC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxFZmZlY3RDaG9pY2UgZWZmZWN0PVwiZGFtcGVuaW5nXCIgbWluPXswfSBtYXg9ezMwMDB9IHN0ZXA9ezEwMH0gbW9kZT17dGhpcy5wcm9wcy5tb2RlfSBtb2RlSW5kZXg9e3RoaXMucHJvcHMubW9kZUluZGV4fSAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8RWZmZWN0Q2hvaWNlIGVmZmVjdD1cImRlbGF5XCIgbWluPXswfSBtYXg9ezF9IHN0ZXA9ezAuMDV9IG1vZGU9e3RoaXMucHJvcHMubW9kZX0gbW9kZUluZGV4PXt0aGlzLnByb3BzLm1vZGVJbmRleH0gLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPEVmZmVjdENob2ljZSBlZmZlY3Q9XCJjaG9ydXNcIiBtaW49ezB9IG1heD17MX0gc3RlcD17MC4wNX0gbW9kZT17dGhpcy5wcm9wcy5tb2RlfSBtb2RlSW5kZXg9e3RoaXMucHJvcHMubW9kZUluZGV4fSAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8RWZmZWN0Q2hvaWNlIGVmZmVjdD1cInJldmVyYlwiIG1pbj17MH0gbWF4PXsxfSBzdGVwPXswLjA1fSBtb2RlPXt0aGlzLnByb3BzLm1vZGV9IG1vZGVJbmRleD17dGhpcy5wcm9wcy5tb2RlSW5kZXh9IC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxFZmZlY3RDaG9pY2UgZWZmZWN0PVwiZGlzdG9ydGlvblwiIG1pbj17MH0gbWF4PXsxfSBzdGVwPXswLjA1fSBtb2RlPXt0aGlzLnByb3BzLm1vZGV9IG1vZGVJbmRleD17dGhpcy5wcm9wcy5tb2RlSW5kZXh9IC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxFZmZlY3RDaG9pY2UgZWZmZWN0PVwibG93Qm9vc3RcIiBtaW49ezB9IG1heD17MX0gc3RlcD17MC4wNX0gbW9kZT17dGhpcy5wcm9wcy5tb2RlfSBtb2RlSW5kZXg9e3RoaXMucHJvcHMubW9kZUluZGV4fSAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8RWZmZWN0Q2hvaWNlIGVmZmVjdD1cImNvbXByZXNzb3JcIiBtaW49ezB9IG1heD17MX0gc3RlcD17MC4wNX0gbW9kZT17dGhpcy5wcm9wcy5tb2RlfSBtb2RlSW5kZXg9e3RoaXMucHJvcHMubW9kZUluZGV4fSAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8RWZmZWN0Q2hvaWNlIGVmZmVjdD1cImhpZ2hQYXNzXCIgbWluPXswfSBtYXg9ezF9IHN0ZXA9ezAuMDV9IG1vZGU9e3RoaXMucHJvcHMubW9kZX0gbW9kZUluZGV4PXt0aGlzLnByb3BzLm1vZGVJbmRleH0gLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvTWVudVN1cmZhY2U+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuXHJcbkB2aWV3XHJcbmNsYXNzIFBsYXlCdXR0b24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgb25DbGljaygpIHtcclxuICAgICAgICBzb25nLnRvZ2dsZUF1ZGlvKCk7XHJcbiAgICB9XHJcbiAgICByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcclxuICAgICAgICByZXR1cm4gPEJ1dHRvbiBpZD1cInBsYXlCdXR0b25cIiBvbkNsaWNrPXsoKSA9PiB0aGlzLm9uQ2xpY2soKX0gcmFpc2VkPlxyXG4gICAgICAgICAgICB7c29uZy5wbGF5aW5nID8gXCJTdG9wXCIgOiBcIlBsYXlcIn1cclxuICAgICAgICA8L0J1dHRvbj47XHJcbiAgICB9XHJcbn1cclxuXHJcbkB2aWV3XHJcbmNsYXNzIEhlbHAgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgc3RhdGUgPSB7XHJcbiAgICAgICAgZGlzcGxheWVkOiBmYWxzZSxcclxuICAgIH07XHJcbiAgICByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcclxuICAgICAgICByZXR1cm4gPGE+XHJcbiAgICAgICAgICAgIDxCdXR0b24gaWQ9XCJoZWxwQnV0dG9uXCIgb25DbGljaz17KCkgPT4gdGhpcy5zZXRTdGF0ZSh7ZGlzcGxheWVkOiB0cnVlfSl9IHJhaXNlZD5IZWxwPC9CdXR0b24+XHJcbiAgICAgICAgICAgIDxEaWFsb2cgb3Blbj17dGhpcy5zdGF0ZS5kaXNwbGF5ZWR9IG9uQ2xvc2U9eygpID0+IHRoaXMuc2V0U3RhdGUoe2Rpc3BsYXllZDogZmFsc2V9KX0+XHJcbiAgICAgICAgICAgICAgICA8RGlhbG9nVGl0bGU+SGVscDwvRGlhbG9nVGl0bGU+XHJcbiAgICAgICAgICAgICAgICA8RGlhbG9nQ29udGVudD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+Q2xpY2sgaW4gYSBib3ggdG8gYWRkIG9yIHJlbW92ZSBhIG5vdGUuPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5TaGlmdCBjbGljayB0byBleHRlbmQgYSBub3RlLCBhbmQgY3RybC1zaGlmdCBjbGljayB0byBzaG9ydGVuIGl0LjwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+UHJlc3MgdGhlIHNwYWNlIGJhciB0byBwbGF5IG9yIHN0b3AgdGhlIHNvbmcuPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5BZnRlciBjbGlja2luZyBpbiBhbiBlbnRyeSBmaWVsZCwgdXNlIHRoZSBhcnJvdyBrZXlzIHRvIHF1aWNrbHkgY2hhbmdlIHRoZSB2YWx1ZS48L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9EaWFsb2dDb250ZW50PlxyXG4gICAgICAgICAgICAgICAgPERpYWxvZ0Zvb3Rlcj5cclxuICAgICAgICAgICAgICAgICAgICA8RGlhbG9nQnV0dG9uIGFjdGlvbj1cImNsb3NlXCIgaXNEZWZhdWx0PkNsb3NlPC9EaWFsb2dCdXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L0RpYWxvZ0Zvb3Rlcj5cclxuICAgICAgICAgICAgPC9EaWFsb2c+XHJcbiAgICAgICAgPC9hPjtcclxuICAgIH1cclxufVxyXG5cclxuQHZpZXdcclxuY2xhc3MgTWV0YVdvcmtzcGFjZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDx7IGFjdGl2ZUNoYW5uZWw6IG51bWJlciwgYWN0aXZlUGF0dGVybjogbnVtYmVyIH0+IHtcclxuICAgIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xyXG4gICAgICAgIGNvbnN0IGluc3RydW1lbnRzID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBbaW5zdHJ1bWVudCwgeyBjYXRlZ29yeSB9XSBvZiBPYmplY3QuZW50cmllcyhpbnN0cnVtZW50RGF0YSkpIHtcclxuICAgICAgICAgICAgaW5zdHJ1bWVudHMucHVzaChcclxuICAgICAgICAgICAgICAgIDxPcHRpb24ga2V5PXtpbnN0cnVtZW50fSB2YWx1ZT17aW5zdHJ1bWVudH0+e2NhdGVnb3J5LmpvaW4oXCIgPiBcIil9PC9PcHRpb24+XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gPGRpdiBpZD1cIm1ldGFXb3Jrc3BhY2VcIj5cclxuICAgICAgICAgICAgPFBsYXlCdXR0b24gLz5cclxuICAgICAgICAgICAgPFNlbGVjdFxyXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJQYXR0ZXJuIGluc3RydW1lbnRcIlxyXG4gICAgICAgICAgICAgICAgdmFsdWU9e3NvbmcucGF0dGVybnNbdGhpcy5wcm9wcy5hY3RpdmVQYXR0ZXJuXS5pbnN0cnVtZW50fVxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNvbmcuc2V0SW5zdHJ1bWVudChlLmN1cnJlbnRUYXJnZXQudmFsdWUsIHRoaXMucHJvcHMuYWN0aXZlQ2hhbm5lbCk7XHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7aW5zdHJ1bWVudHN9XHJcbiAgICAgICAgICAgIDwvU2VsZWN0PlxyXG4gICAgICAgICAgICA8VGV4dEZpZWxkIGxhYmVsPVwiQlBNXCI+XHJcbiAgICAgICAgICAgICAgICA8SW5wdXRcclxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIG1pbj17MTB9XHJcbiAgICAgICAgICAgICAgICAgICAgbWF4PXsyMjB9XHJcbiAgICAgICAgICAgICAgICAgICAgc3RlcD17NX1cclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c29uZy5tZXRhLmJwbX1cclxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcnNlSW50KGUuY3VycmVudFRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTih2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb25nLnNldEJwbSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvVGV4dEZpZWxkPlxyXG4gICAgICAgICAgICA8VGV4dEZpZWxkIGxhYmVsPVwiU3dpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxJbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgbWluPXswfVxyXG4gICAgICAgICAgICAgICAgICAgIG1heD17MX1cclxuICAgICAgICAgICAgICAgICAgICBzdGVwPXswLjA1fVxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzb25nLm1ldGEuc3dpbmd9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJzZUZsb2F0KGUuY3VycmVudFRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTih2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb25nLnNldFN3aW5nKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9UZXh0RmllbGQ+XHJcbiAgICAgICAgICAgIDxFZmZlY3RQYW5lbCBtb2RlPVwic29uZ1wiIG1vZGVJbmRleD17MH0gLz5cclxuICAgICAgICAgICAgPEVmZmVjdFBhbmVsIG1vZGU9XCJjaGFubmVsXCIgbW9kZUluZGV4PXswfSAvPlxyXG4gICAgICAgICAgICA8RWZmZWN0UGFuZWwgbW9kZT1cInBhdHRlcm5cIiBtb2RlSW5kZXg9ezB9IC8+XHJcbiAgICAgICAgICAgIDxIZWxwIC8+XHJcbiAgICAgICAgPC9kaXY+O1xyXG4gICAgfVxyXG59XHJcblxyXG5Admlld1xyXG5jbGFzcyBOb3RlQ2VsbCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDx7IGNoYW5uZWw6IG51bWJlciwgcGF0dGVybjogbnVtYmVyLCBjaG9yZDogbnVtYmVyLCBsZXR0ZXI6IHN0cmluZywgaW5kZXg6IG51bWJlciB9PiB7XHJcbiAgICBzdGF0ZSA9IHtcclxuICAgICAgICBjaG9yZDogdGhpcy5wcm9wcy5jaG9yZCxcclxuICAgICAgICBsZXR0ZXI6IHRoaXMucHJvcHMubGV0dGVyLFxyXG4gICAgICAgIGluZGV4OiB0aGlzLnByb3BzLmluZGV4LFxyXG4gICAgICAgIGxlbmd0aDogMCxcclxuICAgICAgICBwbGF5aW5nOiBmYWxzZSxcclxuICAgIH07XHJcblxyXG4gICAgb25DbGljayhjaG9yZDogbnVtYmVyLCBsZXR0ZXI6IHN0cmluZywgaW5kZXg6IG51bWJlciwgd2l0aFNoaWZ0OiBib29sZWFuLCB3aXRoQ3RybDogYm9vbGVhbikge1xyXG4gICAgICAgIGxldCBsZW5ndGggPSB0aGlzLnN0YXRlLmxlbmd0aDtcclxuXHJcbiAgICAgICAgaWYgKHdpdGhTaGlmdCAmJiB3aXRoQ3RybCkge1xyXG4gICAgICAgICAgICBsZW5ndGggPSBNYXRoLm1heChsZW5ndGggLSAxLCAwKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHdpdGhTaGlmdCkge1xyXG4gICAgICAgICAgICBsZW5ndGggPSBNYXRoLm1heChNYXRoLm1pbihsZW5ndGggKyAxLCAxNiksIDIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZW5ndGggPSAwO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxlbmd0aCA9IDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobGVuZ3RoID4gMCAmJiBsZW5ndGggIT09IHRoaXMuc3RhdGUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHNvbmcuc2NoZWR1bGVOb3RlKHRoaXMucHJvcHMuY2hhbm5lbCwgdGhpcy5wcm9wcy5wYXR0ZXJuLCBjaG9yZCwgbGV0dGVyLCBpbmRleCwgbGVuZ3RoLCB0aGlzKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBzb25nLnVuc2NoZWR1bGVOb3RlKHRoaXMucHJvcHMuY2hhbm5lbCwgdGhpcy5wcm9wcy5wYXR0ZXJuLCBjaG9yZCwgbGV0dGVyLCBpbmRleCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldFN0YXRlKHsgbGVuZ3RoOiBsZW5ndGggfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XHJcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IFtgbm90ZS0ke3RoaXMuc3RhdGUubGV0dGVyfWBdO1xyXG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKFwiYWN0aXZlXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaChcIm5vdGVMb25nXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5wbGF5aW5nKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaChcInBsYXlpbmdMb25nXCIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKFwicGxheWluZ1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIDx0ZFxyXG4gICAgICAgICAgICBpZD17YCR7dGhpcy5zdGF0ZS5sZXR0ZXJ9LSR7dGhpcy5zdGF0ZS5jaG9yZH0tJHt0aGlzLnN0YXRlLmluZGV4fWB9XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5qb2luKFwiIFwiKX1cclxuICAgICAgICAgICAgb25DbGljaz17ZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkNsaWNrKHRoaXMuc3RhdGUuY2hvcmQsIHRoaXMuc3RhdGUubGV0dGVyLCB0aGlzLnN0YXRlLmluZGV4LCBldmVudC5zaGlmdEtleSwgZXZlbnQuY3RybEtleSk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICB7dGhpcy5zdGF0ZS5sZW5ndGggPT09IDAgPyBcIlwiIDogdGhpcy5zdGF0ZS5sZW5ndGh9XHJcbiAgICAgICAgPC90ZD47XHJcbiAgICB9XHJcbn1cclxuXHJcbkB2aWV3XHJcbmNsYXNzIFBhdHRlcm5Xb3Jrc3BhY2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8eyBjaGFubmVsOiBudW1iZXIsIHBhdHRlcm46IG51bWJlciB9PiB7XHJcbiAgICByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcclxuICAgICAgICBsZXQgcm93cyA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgY2hvcmQgb2YgY2hvcmRzLnNsaWNlKCkucmV2ZXJzZSgpKSB7XHJcbiAgICAgICAgICAgIGxldCBmaXJzdCA9IHRydWU7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGV0dGVyIG9mIGxldHRlcnMuc2xpY2UoKS5yZXZlcnNlKCkpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKDx0aCBrZXk9e2BjaG9yZEhlYWRlci0ke2Nob3JkfWB9IHJvd1NwYW49e2xldHRlcnMubGVuZ3RofT57Y2hvcmR9PC90aD4pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goPHRoIGtleT17YGxldHRlckhlYWRlci0ke2Nob3JkfS0ke2xldHRlcn1gfT57bGV0dGVyfTwvdGg+KTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgQXJyYXkoMTYpLmtleXMoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxOb3RlQ2VsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtgY2VsbC0ke2Nob3JkfS0ke2xldHRlcn0tJHtpfWB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsPXt0aGlzLnByb3BzLmNoYW5uZWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuPXt0aGlzLnByb3BzLnBhdHRlcm59XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9yZD17Y2hvcmR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXR0ZXI9e2xldHRlcn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4PXtpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByb3dzLnB1c2goPHRyIGtleT17YHJvdy0ke2Nob3JkfS0ke2xldHRlcn1gfT57aXRlbXN9PC90cj4pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gPGRpdiBpZD1cInBhdHRlcm5Xb3Jrc3BhY2VcIiBjbGFzc05hbWU9XCJuby1zZWxlY3RcIj5cclxuICAgICAgICAgICAgPHRhYmxlIGlkPVwicGF0dGVyblwiPjx0Ym9keT57cm93c308L3Rib2R5PjwvdGFibGU+XHJcbiAgICAgICAgPC9kaXY+O1xyXG4gICAgfVxyXG59XHJcblxyXG5Admlld1xyXG5jbGFzcyBBcHAgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgc3RhdGUgPSB7XHJcbiAgICAgICAgYWN0aXZlQ2hhbm5lbDogMCxcclxuICAgICAgICBhY3RpdmVQYXR0ZXJuOiAwLFxyXG4gICAgfTtcclxuICAgIHNhbXBsZXJzOiB7IFtrZXk6IG51bWJlcl06IHRvbmUuU2FtcGxlciB9ID0ge307XHJcbiAgICByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcclxuICAgICAgICByZXR1cm4gPGRpdiBpZD1cImFwcFwiPlxyXG4gICAgICAgICAgICA8TWV0YVdvcmtzcGFjZSBhY3RpdmVDaGFubmVsPXt0aGlzLnN0YXRlLmFjdGl2ZUNoYW5uZWx9IGFjdGl2ZVBhdHRlcm49e3RoaXMuc3RhdGUuYWN0aXZlUGF0dGVybn0gLz5cclxuICAgICAgICAgICAgPFBhdHRlcm5Xb3Jrc3BhY2UgY2hhbm5lbD17dGhpcy5zdGF0ZS5hY3RpdmVDaGFubmVsfSBwYXR0ZXJuPXt0aGlzLnN0YXRlLmFjdGl2ZVBhdHRlcm59IC8+XHJcbiAgICAgICAgPC9kaXY+O1xyXG4gICAgfVxyXG59XHJcblxyXG5pbnRlcmZhY2UgTm90ZSB7XHJcbiAgICBsZW5ndGg6IG51bWJlcjtcclxuICAgIHNjaGVkdWxlZEV2ZW50OiBudW1iZXIgfCBudWxsO1xyXG59XHJcblxyXG5sZXQgcGF0dGVybnM6IHsgW2tleTogbnVtYmVyXTogeyBba2V5OiBzdHJpbmddOiBBcnJheTxOb3RlPiB9IH0gPSB7fTtcclxuZm9yIChjb25zdCBjaG9yZCBvZiBjaG9yZHMpIHtcclxuICAgIHBhdHRlcm5zW2Nob3JkXSA9IHt9O1xyXG4gICAgZm9yIChjb25zdCBsZXR0ZXIgb2YgbGV0dGVycykge1xyXG4gICAgICAgIHBhdHRlcm5zW2Nob3JkXVtsZXR0ZXJdID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTYgfSwgKCkgPT4geyByZXR1cm4geyBsZW5ndGg6IDAsIHNjaGVkdWxlZEV2ZW50OiBudWxsIH07IH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB0b2dnbGVBdWRpbygpIHtcclxuICAgIGlmIChwbGF5aW5nKSB7XHJcbiAgICAgICAgdG9uZS5UcmFuc3BvcnQuc3RvcCgpO1xyXG4gICAgICAgIHRvbmUuVHJhbnNwb3J0LnBvc2l0aW9uID0gXCIwXCI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3VtZUF1ZGlvQ29udGV4dCgpO1xyXG4gICAgICAgIHRvbmUuVHJhbnNwb3J0Lmxvb3BFbmQgPSBcIjFtXCI7XHJcbiAgICAgICAgdG9uZS5UcmFuc3BvcnQubG9vcCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB0b25lLlRyYW5zcG9ydC50b2dnbGUoMCk7XHJcbiAgICBwbGF5aW5nID0gIXBsYXlpbmc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlc3VtZUF1ZGlvQ29udGV4dCgpIHtcclxuICAgIGxldCBhYyA9ICh0b25lIGFzIGFueSkuY29udGV4dDtcclxuICAgIGlmIChhYy5zdGF0ZSAhPT0gXCJydW5uaW5nXCIpIHtcclxuICAgICAgICBhYy5yZXN1bWUoKTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gb25Mb2FkKCkge1xyXG4gICAgUmVhY3REb20ucmVuZGVyKDxBcHAgLz4sIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjcm9vdFwiKSk7XHJcblxyXG4gICAgZG9jdW1lbnQub25rZXlwcmVzcyA9IGV2ZW50ID0+IHtcclxuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMzIpIHtcclxuICAgICAgICAgICAgc29uZy50b2dnbGVBdWRpbygpO1xyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGNlbnRyYWxSb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIkYtNS0wXCIpO1xyXG4gICAgaWYgKGNlbnRyYWxSb3cgIT09IG51bGwpIHtcclxuICAgICAgICBjZW50cmFsUm93LnNjcm9sbEludG9WaWV3KHsgXCJiZWhhdmlvclwiOiBcInNtb290aFwiLCBcImJsb2NrXCI6IFwiY2VudGVyXCIgfSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbndpbmRvdy5vbmxvYWQgPSBvbkxvYWQ7XHJcbiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file