From eb05ef0a313cd292f387d8441b4deabbfc4d8594 Mon Sep 17 00:00:00 2001 From: Valentina Pogudina Date: Fri, 30 Aug 2024 18:50:52 -0400 Subject: [PATCH 1/2] adding typescript support --- CHANGELOG.md | 6 ++ package-lock.json | 4 +- package.json | 2 +- release/connect-streams-dr-min.js | 2 +- release/connect-streams-dr.js | 2 +- release/connect-streams-min.js | 2 +- release/connect-streams.js | 102 +++++++++-------------- src/api.js | 77 +++++++---------- src/core.js | 23 +++-- src/index.d.ts | 97 ++++++++++++--------- test/unit/agent.spec.js | 40 +++++++++ test/unit/contact.spec.js | 63 ++++++++++++++ test/unit/core.spec.js | 134 +++++++----------------------- 13 files changed, 284 insertions(+), 270 deletions(-) create mode 100644 test/unit/contact.spec.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 33e8c6d4..cd2ba1c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,10 @@ # CHANGELOG.md +## [2.14.6] - 2024-08-02 +Added: +- typescript support for onSoftphoneSessionInit +- updated typescript definition for AttributeDictionary, SegmentAttributeDictionary, ReferenceDictionary +- typescript SYSTEM and ERROR types for AgentStateType +- Agent and Contact events subscriptions now return subscription ## [2.14.5] - 2024-08-02 Added: diff --git a/package-lock.json b/package-lock.json index aa2c2ca8..276f794b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "amazon-connect-streams", - "version": "2.14.5", + "version": "2.14.6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "amazon-connect-streams", - "version": "2.14.5", + "version": "2.14.6", "license": "Apache-2.0", "devDependencies": { "chai": "^4.3.7", diff --git a/package.json b/package.json index 80bdb610..44c1a5ac 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "amazon-connect-streams", - "version": "2.14.5", + "version": "2.14.6", "description": "Amazon Connect Streams Library", "engines": { "node": ">=12.0.0" diff --git a/release/connect-streams-dr-min.js b/release/connect-streams-dr-min.js index 604a7cd3..9f3a6092 100644 --- a/release/connect-streams-dr-min.js +++ b/release/connect-streams-dr-min.js @@ -1 +1 @@ -(()=>{var l;(l={772:()=>{!function(){var l=this||globalThis,Z=l.connect||{};l.connect=Z,l.globalConnect={},l.lily=Z,globalConnect.Container=null;var b=window.atob("KCgpPT57dmFyIGU9ezgyMTooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10LHQuYWdlbnRBcHA9e307dmFyIG49e0NDUDoiY2NwIixHVUlERVM6ImN1c3RvbXZpZXdzIn07dC5hZ2VudEFwcC5pbml0Q0NQPXQuY29yZS5pbml0Q0NQLHQuYWdlbnRBcHAuaXNJbml0aWFsaXplZD1mdW5jdGlvbihlKXt9LHQuYWdlbnRBcHAuaW5pdEFwcENvbW11bmljYXRpb249ZnVuY3Rpb24oZSxuKXt2YXIgcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKSxvPW5ldyB0LklGcmFtZUNvbmR1aXQobix3aW5kb3csciksaT1bdC5BZ2VudEV2ZW50cy5VUERBVEUsdC5Db250YWN0RXZlbnRzLlZJRVcsdC5FdmVudFR5cGUuQUNLTk9XTEVER0UsdC5FdmVudFR5cGUuVEVSTUlOQVRFRCx0LlRhc2tFdmVudHMuQ1JFQVRFRF07ci5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oZSl7aS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKGUsKGZ1bmN0aW9uKHQpe28uc2VuZFVwc3RyZWFtKGUsdCl9KSl9KSl9KSl9O3ZhciByPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXhPZigiY2NwLXYyIik7cmV0dXJuIGUuc2xpY2UoMCx0LTEpfSxvPWZ1bmN0aW9uKGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZTt0cnl7cmV0dXJuIGUuZ2V0Q29udGFjdElkKCl9Y2F0Y2h7cmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiW0N1c3RvbVZpZXdzXTogSW52YWxpZCBDb250YWN0IFByb3ZpZGVkOiAiLGUpfX07dC5hZ2VudEFwcC5pbml0QXBwPWZ1bmN0aW9uKGUsaSxzLGEpe2E9YXx8e307dmFyIGMsdT1zLmVuZHNXaXRoKCIvIil8fC9bPyZdP1tePT8mXSs9W149PyZdKy9nLnRlc3Qocyk/czpzKyIvIixsPWEub25Mb2FkP2Eub25Mb2FkOm51bGwscD17ZW5kcG9pbnQ6dSxzdHlsZTphLnN0eWxlLG9uTG9hZDpsfTtpZihlPT09bi5DQ1BfRFIpYz1uLkNDUDtlbHNlIGlmKGU9PT1uLkdVSURFUyYmYS5jdXN0b21WaWV3c1BhcmFtcyl7Y29uc3R7aWZyYW1lU3VmZml4OmV9PWEuY3VzdG9tVmlld3NQYXJhbXM7aWYoYz1lP2Ake24uR1VJREVTfSR7ZX1gOmAke24uR1VJREVTfWAsdm9pZCAwIT09dC5hZ2VudEFwcC5BcHBSZWdpc3RyeS5nZXQoYykpdGhyb3cgbmV3IEVycm9yKCJbQ3VzdG9tVmlld3NdOiBDdXN0b20gdmlld3MgYXBwbGljYXRpb24gd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLiBQbGVhc2UgcHJvdmlkZSBhIGRpZmZlcmVudCBpZnJhbWVTdWZmaXggZm9yIHRoZSBjdXN0b20gdmlld3MgYXBwbGljYXRpb24uIil9ZWxzZSBjPWU7dmFyIGQ9InN0cmluZyI9PXR5cGVvZiBpP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGkpOmk7dC5hZ2VudEFwcC5BcHBSZWdpc3RyeS5yZWdpc3RlcihjLHAsZCksdC5hZ2VudEFwcC5BcHBSZWdpc3RyeS5zdGFydChjLChmdW5jdGlvbihpKXt2YXIgcz1pLmVuZHBvaW50LHU9aS5jb250YWluZXJET007cmV0dXJue2luaXQ6ZnVuY3Rpb24oKXtzd2l0Y2goZSl7Y2FzZSBuLkNDUDpyZXR1cm4gYS5jY3BQYXJhbXM9YS5jY3BQYXJhbXM/YS5jY3BQYXJhbXM6e30sYS5zdHlsZSYmKGEuY2NwUGFyYW1zLnN0eWxlPWEuc3R5bGUpLGZ1bmN0aW9uKGUsbixvKXt2YXIgaT17Y2NwVXJsOmUsY2NwTG9hZFRpbWVvdXQ6MWU0LGxvZ2luUG9wdXA6ITAsbG9naW5Vcmw6cihlKSsiL2xvZ2luIixzb2Z0cGhvbmU6e2FsbG93RnJhbWVkU29mdHBob25lOiEwLGRpc2FibGVSaW5ndG9uZTohMSxhbGxvd0ZyYW1lZFZpZGVvQ2FsbDohMH19LHM9dC5tZXJnZShpLG8uY2NwUGFyYW1zKTt0LmNvcmUuaW5pdENDUChuLHMpfShzLHUsYSk7Y2FzZSBuLkdVSURFUzpyZXR1cm4gdm9pZCAwIT09YS5jdXN0b21WaWV3c1BhcmFtcz8odC5hZ2VudEFwcC5pbml0QXBwQ29tbXVuaWNhdGlvbihjLHMsdSksZnVuY3Rpb24oZSxyLGkpe2NvbnN0e2NvbnRhY3Q6cyxkaXNhYmxlQXV0b0Rlc3Ryb3k6YSxpZnJhbWVTdWZmaXg6Yyx0ZXJtaW5hdGVDdXN0b21WaWV3T3B0aW9uczp1PXt9fT1pLmN1c3RvbVZpZXdzUGFyYW1zO2xldCBsLHAse2NvbnRhY3RGbG93SWQ6ZH09aS5jdXN0b21WaWV3c1BhcmFtczt2b2lkIDAhPT1zJiYobD1vKHMpLGwmJiEwIT09YSYmInN0cmluZyIhPXR5cGVvZiBzJiZzLm9uRGVzdHJveSgobj0+e3QuY29yZS50ZXJtaW5hdGVDdXN0b21WaWV3KGUsYyx7dGltZW91dDp1LnRpbWVvdXR8fDVlMyxoaWRlSWZyYW1lOnZvaWQgMD09PXUuaGlkZUlmcmFtZXx8dS5oaWRlSWZyYW1lLHJlc29sdmVJZnJhbWU6dm9pZCAwPT09dS5yZXNvbHZlSWZyYW1lfHx1LnJlc29sdmVJZnJhbWV9KX0pKSxkfHxjb25zb2xlLndhcm4oIltDdXN0b21WaWV3c106IE5lZWQgdG8gcHJvdmlkZSBhIGNvbnRhY3RGbG93SWQgd2hlbiBkZWZpbmluZyBjb250YWN0IHBhcmFtZXRlciBmb3IgaW5pdGFsaXppbmcgY3VzdG9tdmlld3MgYXBwbGljYXRpb24iKSkscD1jP2Ake24uR1VJREVTfSR7Y31gOmAke24uR1VJREVTfWA7Y29uc3QgaD1gaWZyYW1lW2lkPScke3B9J11gLGY9cj8ucXVlcnlTZWxlY3RvcihoKXx8ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocCl8fHdpbmRvdy50b3AuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocCk7aWYoIWYpdGhyb3cgbmV3IEVycm9yKCJbQ3VzdG9tVmlld3NdOiBObyBpZnJhbWUgZm91bmQgZm9yIHRoZSBhcHA6ICIscCk7e2NvbnN0IHQ9QVdTLnV0aWwudXVpZC52NCgpO2w/Zi5zcmM9YCR7ZX0/Y29udGFjdEZsb3dJZD0ke2R9JmN1cnJlbnRDb250YWN0SWQ9JHtsfSZhZ2VudEFwcFRhYklkPSR7dH0tdGFiYDpkJiYoZi5zcmM9YCR7ZX0/Y29udGFjdEZsb3dJZD0ke2R9JmFnZW50QXBwVGFiSWQ9JHt0fS10YWJgKX19KHMsdSxhKSk6dC5hZ2VudEFwcC5pbml0QXBwQ29tbXVuaWNhdGlvbihjLHMsdSk7ZGVmYXVsdDpyZXR1cm4gdC5hZ2VudEFwcC5pbml0QXBwQ29tbXVuaWNhdGlvbihjLHMsdSl9fSxkZXN0cm95OmZ1bmN0aW9uKCl7c3dpdGNoKGUpe2Nhc2Ugbi5DQ1A6cmV0dXJuIGk9cihzKSsiL2xvZ291dCIsdC5mZXRjaChpLHtjcmVkZW50aWFsczoiaW5jbHVkZSJ9KS50aGVuKChmdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLlRFUk1JTkFURSksITB9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3JldHVybiB0LmdldExvZygpLmVycm9yKCJBbiBlcnJvciBvY2N1cmVkIG9uIGxvZ291dC4iK2UpLndpdGhFeGNlcHRpb24oZSksd2luZG93LmxvY2F0aW9uLmhyZWY9aSwhMX0pKTtjYXNlIG4uR1VJREVTOnJldHVybiB2b2lkIDAhPT1hLmN1c3RvbVZpZXdzUGFyYW1zPyhvPWMsdm9pZCB0LmFnZW50QXBwLkFwcFJlZ2lzdHJ5LmRlbGV0ZShvKSk6bnVsbDtkZWZhdWx0OnJldHVybiBudWxsfXZhciBvLGl9fX0pKX0sdC5hZ2VudEFwcC5zdG9wQXBwPWZ1bmN0aW9uKGUpe3JldHVybiB0LmFnZW50QXBwLkFwcFJlZ2lzdHJ5LnN0b3AoZSl9fSgpfSw1MDA6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dDt2YXIgbixyPSJjY3AiO2UuY29ubmVjdC5hZ2VudEFwcC5BcHBSZWdpc3RyeT0obj17fSx7cmVnaXN0ZXI6ZnVuY3Rpb24oZSx0LHIpe25bZV09e2NvbnRhaW5lckRPTTpyLGVuZHBvaW50OnQuZW5kcG9pbnQsc3R5bGU6dC5zdHlsZSxpbnN0YW5jZTp2b2lkIDAsb25Mb2FkOnQub25Mb2FkfX0sc3RhcnQ6ZnVuY3Rpb24oZSx0KXtpZihuW2VdKXt2YXIgbz1uW2VdLmNvbnRhaW5lckRPTSxpPW5bZV0uZW5kcG9pbnQscz1uW2VdLnN0eWxlLGE9bltlXS5vbkxvYWQ7aWYoZSE9PXIpe3ZhciBjPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3JldHVybiBvLnNyYz10LG8uc3R5bGU9bnx8IndpZHRoOiAxMDAlOyBoZWlnaHQ6MTAwJTsiLG8uaWQ9ZSxvWyJhcmlhLWxhYmVsIl09ZSxvLm9ubG9hZD1yLG8uYWxsb3c9ImNsaXBib2FyZC1yZWFkOyBjbGlwYm9hcmQtd3JpdGUiLG8uc2V0QXR0cmlidXRlKCJzYW5kYm94IiwiYWxsb3ctZm9ybXMgYWxsb3ctcG9wdXBzIGFsbG93LXBvcHVwcy10by1lc2NhcGUtc2FuZGJveCBhbGxvdy1zYW1lLW9yaWdpbiBhbGxvdy1zY3JpcHRzIiksb30oZSxpLHMsYSk7by5hcHBlbmRDaGlsZChjKX1yZXR1cm4gbltlXS5pbnN0YW5jZT10KG5bZV0pLG5bZV0uaW5zdGFuY2UuaW5pdCgpfX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBuW2VdfSxkZWxldGU6ZnVuY3Rpb24oZSl7ZGVsZXRlIG5bZV19LHN0b3A6ZnVuY3Rpb24oZSl7aWYobltlXSl7dmFyIHQscj1uW2VdLG89ci5jb250YWluZXJET00ucXVlcnlTZWxlY3RvcigiaWZyYW1lIik7aWYoZS5pbmNsdWRlcygiY3VzdG9tdmlld3MiKSl7Y29uc3QgdD1gaWZyYW1lW2lkPScke2V9J11gO289ci5jb250YWluZXJET00ucXVlcnlTZWxlY3Rvcih0KX1yZXR1cm4gci5jb250YWluZXJET00ucmVtb3ZlQ2hpbGQobyksci5pbnN0YW5jZSYmKHQ9ci5pbnN0YW5jZS5kZXN0cm95KCksZGVsZXRlIHIuaW5zdGFuY2UpLHR9fX0pfSgpfSw5NjU6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dCx0LkFnZW50U3RhdGVUeXBlPXQubWFrZUVudW0oWyJpbml0Iiwicm91dGFibGUiLCJub3Rfcm91dGFibGUiLCJvZmZsaW5lIl0pLHQuQWdlbnRTdGF0dXNUeXBlPXQuQWdlbnRTdGF0ZVR5cGUsdC5BZ2VudEF2YWlsU3RhdGVzPXQubWFrZUVudW0oWyJJbml0IiwiQnVzeSIsIkFmdGVyQ2FsbFdvcmsiLCJDYWxsaW5nQ3VzdG9tZXIiLCJEaWFsaW5nIiwiSm9pbmluZyIsIlBlbmRpbmdBdmFpbGFibGUiLCJQZW5kaW5nQnVzeSJdKSx0LkFnZW50RXJyb3JTdGF0ZXM9dC5tYWtlRW51bShbIkVycm9yIiwiQWdlbnRIdW5nVXAiLCJCYWRBZGRyZXNzQWdlbnQiLCJCYWRBZGRyZXNzQ3VzdG9tZXIiLCJEZWZhdWx0IiwiRmFpbGVkQ29ubmVjdEFnZW50IiwiRmFpbGVkQ29ubmVjdEN1c3RvbWVyIiwiSW52YWxpZExvY2FsZSIsIkxpbmVFbmdhZ2VkQWdlbnQiLCJMaW5lRW5nYWdlZEN1c3RvbWVyIiwiTWlzc2VkQ2FsbEFnZW50IiwiTWlzc2VkQ2FsbEN1c3RvbWVyIiwiTXVsdGlwbGVDY3BXaW5kb3dzIiwiUmVhbHRpbWVDb21tdW5pY2F0aW9uRXJyb3IiXSksdC5FbmRwb2ludFR5cGU9dC5tYWtlRW51bShbInBob25lX251bWJlciIsImFnZW50IiwicXVldWUiXSksdC5BZGRyZXNzVHlwZT10LkVuZHBvaW50VHlwZSx0LkNvbm5lY3Rpb25UeXBlPXQubWFrZUVudW0oWyJhZ2VudCIsImluYm91bmQiLCJvdXRib3VuZCIsIm1vbml0b3JpbmciXSksdC5Db25uZWN0aW9uU3RhdGVUeXBlPXQubWFrZUVudW0oWyJpbml0IiwiY29ubmVjdGluZyIsImNvbm5lY3RlZCIsImhvbGQiLCJkaXNjb25uZWN0ZWQiLCJzaWxlbnRfbW9uaXRvciIsImJhcmdlIl0pLHQuQ29ubmVjdGlvblN0YXR1c1R5cGU9dC5Db25uZWN0aW9uU3RhdGVUeXBlLHQuQ09OTkVDVElPTl9BQ1RJVkVfU1RBVEVTPXQuc2V0KFt0LkNvbm5lY3Rpb25TdGF0ZVR5cGUuQ09OTkVDVElORyx0LkNvbm5lY3Rpb25TdGF0ZVR5cGUuQ09OTkVDVEVELHQuQ29ubmVjdGlvblN0YXRlVHlwZS5IT0xELHQuQ29ubmVjdGlvblN0YXRlVHlwZS5TSUxFTlRfTU9OSVRPUix0LkNvbm5lY3Rpb25TdGF0ZVR5cGUuQkFSR0VdKSx0LkNPTk5FQ1RJT05fQ09OTkVDVEVEX1NUQVRFUz10LnNldChbdC5Db25uZWN0aW9uU3RhdGVUeXBlLkNPTk5FQ1RFRCx0LkNvbm5lY3Rpb25TdGF0ZVR5cGUuU0lMRU5UX01PTklUT1IsdC5Db25uZWN0aW9uU3RhdGVUeXBlLkJBUkdFXSksdC5Db250YWN0U3RhdGVUeXBlPXQubWFrZUVudW0oWyJpbml0IiwiaW5jb21pbmciLCJwZW5kaW5nIiwiY29ubmVjdGluZyIsImNvbm5lY3RlZCIsIm1pc3NlZCIsImVycm9yIiwiZW5kZWQiLCJyZWplY3RlZCIsInBhdXNlZCJdKSx0LkNvbnRhY3RTdGF0dXNUeXBlPXQuQ29udGFjdFN0YXRlVHlwZSx0LkNPTlRBQ1RfQUNUSVZFX1NUQVRFUz10Lm1ha2VFbnVtKFsicGF1c2VkIiwiaW5jb21pbmciLCJwZW5kaW5nIiwiY29ubmVjdGluZyIsImNvbm5lY3RlZCJdKSx0LkNvbnRhY3RUeXBlPXQubWFrZUVudW0oWyJ2b2ljZSIsInF1ZXVlX2NhbGxiYWNrIiwiY2hhdCIsInRhc2siXSksdC5Db250YWN0SW5pdGlhdGlvbk1ldGhvZD10Lm1ha2VFbnVtKFsiaW5ib3VuZCIsIm91dGJvdW5kIiwidHJhbnNmZXIiLCJxdWV1ZV90cmFuc2ZlciIsImNhbGxiYWNrIiwiYXBpIiwiZGlzY29ubmVjdCIsIndlYnJ0Y19hcGkiXSksdC5Nb25pdG9yaW5nTW9kZT10Lm1ha2VFbnVtKFsiU0lMRU5UX01PTklUT1IiLCJCQVJHRSJdKSx0Lk1vbml0b3JpbmdFcnJvclR5cGVzPXQubWFrZUVudW0oWyJpbnZhbGlkX3RhcmdldF9zdGF0ZSJdKSx0LkNoYW5uZWxUeXBlPXQubWFrZUVudW0oWyJWT0lDRSIsIkNIQVQiLCJUQVNLIl0pLHQuTWVkaWFUeXBlPXQubWFrZUVudW0oWyJzb2Z0cGhvbmUiLCJjaGF0IiwidGFzayJdKSx0LlNvZnRwaG9uZUNhbGxUeXBlPXQubWFrZUVudW0oWyJhdWRpb192aWRlbyIsInZpZGVvX29ubHkiLCJhdWRpb19vbmx5Iiwibm9uZSJdKSx0LlNvZnRwaG9uZUVycm9yVHlwZXM9dC5tYWtlRW51bShbInVuc3VwcG9ydGVkX2Jyb3dzZXIiLCJtaWNyb3Bob25lX25vdF9zaGFyZWQiLCJzaWduYWxsaW5nX2hhbmRzaGFrZV9mYWlsdXJlIiwic2lnbmFsbGluZ19jb25uZWN0aW9uX2ZhaWx1cmUiLCJpY2VfY29sbGVjdGlvbl90aW1lb3V0IiwidXNlcl9idXN5X2Vycm9yIiwid2VicnRjX2Vycm9yIiwicmVhbHRpbWVfY29tbXVuaWNhdGlvbl9lcnJvciIsInZkaV9zdHJhdGVneV9ub3Rfc3VwcG9ydGVkIiwidmRpX3JlZGlyX25vdF9zdXBwb3J0ZWQiLCJvdGhlciJdKSx0LkNsaWNrVHlwZT10Lm1ha2VFbnVtKFsiQWNjZXB0IiwiUmVqZWN0IiwiSGFuZ3VwIl0pLHQuVm9pY2VJZEVycm9yVHlwZXM9dC5tYWtlRW51bShbIm5vX3NwZWFrZXJfaWRfZm91bmQiLCJzcGVha2VyX2lkX25vdF9lbnJvbGxlZCIsImdldF9zcGVha2VyX2lkX2ZhaWxlZCIsImdldF9zcGVha2VyX3N0YXR1c19mYWlsZWQiLCJvcHRfb3V0X3NwZWFrZXJfZmFpbGVkIiwib3B0X291dF9zcGVha2VyX2luX2xjbXNfZmFpbGVkIiwiZGVsZXRlX3NwZWFrZXJfZmFpbGVkIiwic3RhcnRfc2Vzc2lvbl9mYWlsZWQiLCJldmFsdWF0ZV9zcGVha2VyX2ZhaWxlZCIsInNlc3Npb25fbm90X2V4aXN0cyIsImRlc2NyaWJlX3Nlc3Npb25fZmFpbGVkIiwiZW5yb2xsX3NwZWFrZXJfZmFpbGVkIiwidXBkYXRlX3NwZWFrZXJfaWRfZmFpbGVkIiwidXBkYXRlX3NwZWFrZXJfaWRfaW5fbGNtc19mYWlsZWQiLCJub3Rfc3VwcG9ydGVkX29uX2NvbmZlcmVuY2VfY2FsbHMiLCJlbnJvbGxfc3BlYWtlcl90aW1lb3V0IiwiZXZhbHVhdGVfc3BlYWtlcl90aW1lb3V0IiwiZ2V0X2RvbWFpbl9pZF9mYWlsZWQiLCJub19kb21haW5faWRfZm91bmQiXSksdC5DVElFeGNlcHRpb25zPXQubWFrZUVudW0oWyJBY2Nlc3NEZW5pZWRFeGNlcHRpb24iLCJJbnZhbGlkU3RhdGVFeGNlcHRpb24iLCJCYWRFbmRwb2ludEV4Y2VwdGlvbiIsIkludmFsaWRBZ2VudEFSTkV4Y2VwdGlvbiIsIkludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uIiwiSW52YWxpZENvbnRhY3RUeXBlRXhjZXB0aW9uIiwiUGFnaW5hdGlvbkV4Y2VwdGlvbiIsIlJlZnJlc2hUb2tlbkV4cGlyZWRFeGNlcHRpb24iLCJTZW5kRGF0YUZhaWxlZEV4Y2VwdGlvbiIsIlVuYXV0aG9yaXplZEV4Y2VwdGlvbiIsIlF1b3RhRXhjZWVkZWRFeGNlcHRpb24iXSksdC5Wb2ljZUlkU3RyZWFtaW5nU3RhdHVzPXQubWFrZUVudW0oWyJPTkdPSU5HIiwiRU5ERUQiLCJQRU5ESU5HX0NPTkZJR1VSQVRJT04iXSksdC5Wb2ljZUlkQXV0aGVudGljYXRpb25EZWNpc2lvbj10Lm1ha2VFbnVtKFsiQUNDRVBUIiwiUkVKRUNUIiwiTk9UX0VOT1VHSF9TUEVFQ0giLCJTUEVBS0VSX05PVF9FTlJPTExFRCIsIlNQRUFLRVJfT1BURURfT1VUIiwiU1BFQUtFUl9JRF9OT1RfUFJPVklERUQiLCJTUEVBS0VSX0VYUElSRUQiXSksdC5Wb2ljZUlkRnJhdWREZXRlY3Rpb25EZWNpc2lvbj10Lm1ha2VFbnVtKFsiTk9UX0VOT1VHSF9TUEVFQ0giLCJISUdIX1JJU0siLCJMT1dfUklTSyJdKSx0LkNvbnRhY3RGbG93QXV0aGVudGljYXRpb25EZWNpc2lvbj10Lm1ha2VFbnVtKFsiQXV0aGVudGljYXRlZCIsIk5vdEF1dGhlbnRpY2F0ZWQiLCJJbmNvbmNsdXNpdmUiLCJOb3RFbnJvbGxlZCIsIk9wdGVkT3V0IiwiTm90RW5hYmxlZCIsIkVycm9yIl0pLHQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uPXQubWFrZUVudW0oWyJIaWdoUmlzayIsIkxvd1Jpc2siLCJJbmNvbmNsdXNpdmUiLCJOb3RFbmFibGVkIiwiRXJyb3IiXSksdC5WaWRlb0NhcGFiaWxpdHk9dC5tYWtlRW51bShbIlNFTkQiXSksdC5Wb2ljZUlkRW5yb2xsbWVudFJlcXVlc3RTdGF0dXM9dC5tYWtlRW51bShbIk5PVF9FTk9VR0hfU1BFRUNIIiwiSU5fUFJPR1JFU1MiLCJDT01QTEVURUQiLCJGQUlMRUQiXSksdC5Wb2ljZUlkU3BlYWtlclN0YXR1cz10Lm1ha2VFbnVtKFsiT1BURURfT1VUIiwiRU5ST0xMRUQiLCJQRU5ESU5HIl0pLHQuVm9pY2VJZENvbnN0YW50cz17RVZBTFVBVEVfU0VTU0lPTl9ERUxBWToxZTQsRVZBTFVBVElPTl9NQVhfUE9MTF9USU1FUzoyNCxFVkFMVUFUSU9OX1BPTExJTkdfSU5URVJWQUw6NWUzLEVOUk9MTE1FTlRfTUFYX1BPTExfVElNRVM6MTIwLEVOUk9MTE1FTlRfUE9MTElOR19JTlRFUlZBTDo1ZTMsU1RBUlRfU0VTU0lPTl9ERUxBWTo4ZTN9LHQuQWdlbnRQZXJtaXNzaW9ucz17T1VUQk9VTkRfQ0FMTDoib3V0Ym91bmRDYWxsIixWT0lDRV9JRDoidm9pY2VJZCJ9O3ZhciBuPWZ1bmN0aW9uKCl7aWYoIXQuYWdlbnQuaW5pdGlhbGl6ZWQpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiVGhlIGFnZW50IGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWQhIil9O24ucHJvdG90eXBlLl9nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEFnZW50RGF0YSgpfSxuLnByb3RvdHlwZS5fY3JlYXRlQ29udGFjdEFQST1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQuQ29udGFjdChlLmNvbnRhY3RJZCl9LG4ucHJvdG90eXBlLm9uUmVmcmVzaD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5SRUZSRVNILGUpfSxuLnByb3RvdHlwZS5vblJvdXRhYmxlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLlJPVVRBQkxFLGUpfSxuLnByb3RvdHlwZS5vbk5vdFJvdXRhYmxlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLk5PVF9ST1VUQUJMRSxlKX0sbi5wcm90b3R5cGUub25PZmZsaW5lPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLk9GRkxJTkUsZSl9LG4ucHJvdG90eXBlLm9uRXJyb3I9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuRVJST1IsZSl9LG4ucHJvdG90eXBlLm9uU29mdHBob25lRXJyb3I9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuU09GVFBIT05FX0VSUk9SLGUpfSxuLnByb3RvdHlwZS5vbldlYlNvY2tldENvbm5lY3Rpb25Mb3N0PWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLldFQlNPQ0tFVF9DT05ORUNUSU9OX0xPU1QsZSl9LG4ucHJvdG90eXBlLm9uV2ViU29ja2V0Q29ubmVjdGlvbkdhaW5lZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5XRUJTT0NLRVRfQ09OTkVDVElPTl9HQUlORUQsZSl9LG4ucHJvdG90eXBlLm9uQWZ0ZXJDYWxsV29yaz1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5BQ1csZSl9LG4ucHJvdG90eXBlLm9uU3RhdGVDaGFuZ2U9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuU1RBVEVfQ0hBTkdFLGUpfSxuLnByb3RvdHlwZS5vbk11dGVUb2dnbGU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkFnZW50RXZlbnRzLk1VVEVfVE9HR0xFLGUpfSxuLnByb3RvdHlwZS5vbkxvY2FsTWVkaWFTdHJlYW1DcmVhdGVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5BZ2VudEV2ZW50cy5MT0NBTF9NRURJQV9TVFJFQU1fQ1JFQVRFRCxlKX0sbi5wcm90b3R5cGUub25TcGVha2VyRGV2aWNlQ2hhbmdlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuQ29uZmlndXJhdGlvbkV2ZW50cy5TUEVBS0VSX0RFVklDRV9DSEFOR0VELGUpfSxuLnByb3RvdHlwZS5vbk1pY3JvcGhvbmVEZXZpY2VDaGFuZ2VkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5Db25maWd1cmF0aW9uRXZlbnRzLk1JQ1JPUEhPTkVfREVWSUNFX0NIQU5HRUQsZSl9LG4ucHJvdG90eXBlLm9uUmluZ2VyRGV2aWNlQ2hhbmdlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuQ29uZmlndXJhdGlvbkV2ZW50cy5SSU5HRVJfREVWSUNFX0NIQU5HRUQsZSl9LG4ucHJvdG90eXBlLm9uQ2FtZXJhRGV2aWNlQ2hhbmdlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuQ29uZmlndXJhdGlvbkV2ZW50cy5DQU1FUkFfREVWSUNFX0NIQU5HRUQsZSl9LG4ucHJvdG90eXBlLm9uQmFja2dyb3VuZEJsdXJDaGFuZ2VkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5Db25maWd1cmF0aW9uRXZlbnRzLkJBQ0tHUk9VTkRfQkxVUl9DSEFOR0VELGUpfSxuLnByb3RvdHlwZS5tdXRlPWZ1bmN0aW9uKCl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5FdmVudFR5cGUuTVVURSxkYXRhOnttdXRlOiEwfX0pfSxuLnByb3RvdHlwZS51bm11dGU9ZnVuY3Rpb24oKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkV2ZW50VHlwZS5NVVRFLGRhdGE6e211dGU6ITF9fSl9LG4ucHJvdG90eXBlLnNldFNwZWFrZXJEZXZpY2U9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25maWd1cmF0aW9uRXZlbnRzLlNFVF9TUEVBS0VSX0RFVklDRSxkYXRhOntkZXZpY2VJZDplfX0pfSxuLnByb3RvdHlwZS5zZXRNaWNyb3Bob25lRGV2aWNlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29uZmlndXJhdGlvbkV2ZW50cy5TRVRfTUlDUk9QSE9ORV9ERVZJQ0UsZGF0YTp7ZGV2aWNlSWQ6ZX19KX0sbi5wcm90b3R5cGUuc2V0UmluZ2VyRGV2aWNlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29uZmlndXJhdGlvbkV2ZW50cy5TRVRfUklOR0VSX0RFVklDRSxkYXRhOntkZXZpY2VJZDplfX0pfSxuLnByb3RvdHlwZS5zZXRDYW1lcmFEZXZpY2U9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25maWd1cmF0aW9uRXZlbnRzLkNBTUVSQV9ERVZJQ0VfQ0hBTkdFRCxkYXRhOntkZXZpY2VJZDplfX0pfSxuLnByb3RvdHlwZS5zZXRCYWNrZ3JvdW5kQmx1cj1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuQkFDS0dST1VORF9CTFVSX0NIQU5HRUQsZGF0YTp7aXNCYWNrZ3JvdW5kQmx1ckVuYWJsZWQ6ZX19KX0sbi5wcm90b3R5cGUuZ2V0U3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnNuYXBzaG90LnN0YXRlfSxuLnByb3RvdHlwZS5nZXROZXh0U3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnNuYXBzaG90Lm5leHRTdGF0ZX0sbi5wcm90b3R5cGUuZ2V0QXZhaWxhYmlsaXR5U3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnNuYXBzaG90LmFnZW50QXZhaWxhYmlsaXR5U3RhdGV9LG4ucHJvdG90eXBlLmdldFN0YXR1cz1uLnByb3RvdHlwZS5nZXRTdGF0ZSxuLnByb3RvdHlwZS5nZXRTdGF0ZUR1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHQubm93KCktdGhpcy5fZ2V0RGF0YSgpLnNuYXBzaG90LnN0YXRlLnN0YXJ0VGltZXN0YW1wLmdldFRpbWUoKSt0LmNvcmUuZ2V0U2tldygpfSxuLnByb3RvdHlwZS5nZXRTdGF0dXNEdXJhdGlvbj1uLnByb3RvdHlwZS5nZXRTdGF0ZUR1cmF0aW9uLG4ucHJvdG90eXBlLmdldFBlcm1pc3Npb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLnBlcm1pc3Npb25zfSxuLnByb3RvdHlwZS5nZXRDb250YWN0cz1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLl9nZXREYXRhKCkuc25hcHNob3QuY29udGFjdHMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gdC5fY3JlYXRlQ29udGFjdEFQSShlKX0pKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiFlfHx0LmdldFR5cGUoKT09PWV9KSl9LG4ucHJvdG90eXBlLmdldENvbmZpZ3VyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmNvbmZpZ3VyYXRpb259LG4ucHJvdG90eXBlLmdldEFnZW50U3RhdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmFnZW50U3RhdGVzfSxuLnByb3RvdHlwZS5nZXRSb3V0aW5nUHJvZmlsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5yb3V0aW5nUHJvZmlsZX0sbi5wcm90b3R5cGUuZ2V0Q2hhbm5lbENvbmN1cnJlbmN5PWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMuZ2V0Um91dGluZ1Byb2ZpbGUoKS5jaGFubmVsQ29uY3VycmVuY3lNYXA7cmV0dXJuIG58fChuPU9iamVjdC5rZXlzKHQuQ2hhbm5lbFR5cGUpLnJlZHVjZSgoZnVuY3Rpb24oZSxuKXtyZXR1cm4iVEFTSyIhPT1uJiYoZVt0LkNoYW5uZWxUeXBlW25dXT0xKSxlfSkse30pKSxlP25bZV18fDA6bn0sbi5wcm90b3R5cGUuZ2V0TmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5uYW1lfSxuLnByb3RvdHlwZS5nZXRBZ2VudEFSTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5hZ2VudEFSTn0sbi5wcm90b3R5cGUuZ2V0RXh0ZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmV4dGVuc2lvbn0sbi5wcm90b3R5cGUuZ2V0RGlhbGFibGVDb3VudHJpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZGlhbGFibGVDb3VudHJpZXN9LG4ucHJvdG90eXBlLmlzU29mdHBob25lRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5zb2Z0cGhvbmVFbmFibGVkfSxuLnByb3RvdHlwZS5zZXRDb25maWd1cmF0aW9uPWZ1bmN0aW9uKGUsbil7dmFyIHI9dC5jb3JlLmdldENsaWVudCgpO2UmJmUuYWdlbnRQcmVmZXJlbmNlcyYmZS5hZ2VudFByZWZlcmVuY2VzLkxBTkdVQUdFJiYhZS5hZ2VudFByZWZlcmVuY2VzLmxvY2FsZSYmKGUuYWdlbnRQcmVmZXJlbmNlcy5sb2NhbGU9ZS5hZ2VudFByZWZlcmVuY2VzLkxBTkdVQUdFKSxlJiZlLmFnZW50UHJlZmVyZW5jZXMmJiF0LmlzVmFsaWRMb2NhbGUoZS5hZ2VudFByZWZlcmVuY2VzLmxvY2FsZSk/biYmbi5mYWlsdXJlJiZuLmZhaWx1cmUodC5BZ2VudEVycm9yU3RhdGVzLklOVkFMSURfTE9DQUxFKTpyLmNhbGwodC5DbGllbnRNZXRob2RzLlVQREFURV9BR0VOVF9DT05GSUdVUkFUSU9OLHtjb25maWd1cmF0aW9uOnQuYXNzZXJ0Tm90TnVsbChlLCJjb25maWd1cmF0aW9uIil9LHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5SRUxPQURfQUdFTlRfQ09ORklHVVJBVElPTiksbi5zdWNjZXNzJiZuLnN1Y2Nlc3MoZSl9LGZhaWx1cmU6biYmbi5mYWlsdXJlfSl9LG4ucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKGUsbixyKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuUFVUX0FHRU5UX1NUQVRFLHtzdGF0ZTp0LmFzc2VydE5vdE51bGwoZSwic3RhdGUiKSxlbnF1ZXVlTmV4dFN0YXRlOnImJiEhci5lbnF1ZXVlTmV4dFN0YXRlfSxuKX0sbi5wcm90b3R5cGUub25FbnF1ZXVlZE5leHRTdGF0ZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5FTlFVRVVFRF9ORVhUX1NUQVRFLGUpfSxuLnByb3RvdHlwZS5zZXRTdGF0dXM9bi5wcm90b3R5cGUuc2V0U3RhdGUsbi5wcm90b3R5cGUuY29ubmVjdD1mdW5jdGlvbihlLG4pe3ZhciByPXQuY29yZS5nZXRDbGllbnQoKSxvPW5ldyB0LkVuZHBvaW50KGUpO2RlbGV0ZSBvLmVuZHBvaW50SWQ7dmFyIGk9e2VuZHBvaW50OnQuYXNzZXJ0Tm90TnVsbChvLCJlbmRwb2ludCIpLHF1ZXVlQVJOOm4mJihuLnF1ZXVlQVJOfHxuLnF1ZXVlSWQpfHx0aGlzLmdldFJvdXRpbmdQcm9maWxlKCkuZGVmYXVsdE91dGJvdW5kUXVldWUucXVldWVBUk59O24mJm4ucmVsYXRlZENvbnRhY3RJZCYmbnVsbCE9PW4ucmVsYXRlZENvbnRhY3RJZCYmKGkucmVsYXRlZENvbnRhY3RJZD1uLnJlbGF0ZWRDb250YWN0SWQsbi5wcmV2aW91c0NvbnRhY3RJZCYmZGVsZXRlIGkucHJldmlvdXNDb250YWN0SWQpLHIuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX09VVEJPVU5EX0NPTlRBQ1QsaSxuJiZ7c3VjY2VzczpuLnN1Y2Nlc3MsZmFpbHVyZTpuLmZhaWx1cmV9KX0sbi5wcm90b3R5cGUuZ2V0QWxsUXVldWVBUk5zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLnJvdXRpbmdQcm9maWxlLnF1ZXVlcy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnF1ZXVlQVJOfSkpfSxuLnByb3RvdHlwZS5nZXRFbmRwb2ludHM9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXRoaXMsaT10LmNvcmUuZ2V0Q2xpZW50KCk7dC5hc3NlcnROb3ROdWxsKG4sImNhbGxiYWNrcyIpLHQuYXNzZXJ0Tm90TnVsbChuLnN1Y2Nlc3MsImNhbGxiYWNrcy5zdWNjZXNzIik7dmFyIHM9cnx8e307cy5lbmRwb2ludHM9cy5lbmRwb2ludHN8fFtdLHMubWF4UmVzdWx0cz1zLm1heFJlc3VsdHN8fHQuREVGQVVMVF9CQVRDSF9TSVpFLHQuaXNBcnJheShlKXx8KGU9W2VdKSxpLmNhbGwodC5DbGllbnRNZXRob2RzLkdFVF9FTkRQT0lOVFMse3F1ZXVlQVJOczplLG5leHRUb2tlbjpzLm5leHRUb2tlbnx8bnVsbCxtYXhSZXN1bHRzOnMubWF4UmVzdWx0c30se3N1Y2Nlc3M6ZnVuY3Rpb24ocil7aWYoci5uZXh0VG9rZW4pby5nZXRFbmRwb2ludHMoZSxuLHtuZXh0VG9rZW46ci5uZXh0VG9rZW4sbWF4UmVzdWx0czpzLm1heFJlc3VsdHMsZW5kcG9pbnRzOnMuZW5kcG9pbnRzLmNvbmNhdChyLmVuZHBvaW50cyl9KTtlbHNle3MuZW5kcG9pbnRzPXMuZW5kcG9pbnRzLmNvbmNhdChyLmVuZHBvaW50cyk7dmFyIGk9cy5lbmRwb2ludHMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQuRW5kcG9pbnQoZSl9KSk7bi5zdWNjZXNzKHtlbmRwb2ludHM6aSxhZGRyZXNzZXM6aX0pfX0sZmFpbHVyZTpuLmZhaWx1cmV9KX0sbi5wcm90b3R5cGUuZ2V0QWRkcmVzc2VzPW4ucHJvdG90eXBlLmdldEVuZHBvaW50cyxuLnByb3RvdHlwZS5fZ2V0UmVzb3VyY2VJZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0QWxsUXVldWVBUk5zKCk7Zm9yKGxldCB0IG9mIGUpe2NvbnN0IGU9dC5tYXRjaCgvXC9hZ2VudFwvKFteL10rKS8pO2lmKGUpcmV0dXJuIGVbMV19cmV0dXJuIG5ldyBFcnJvcigiQWdlbnQucHJvdG90eXBlLl9nZXRSZXNvdXJjZUlkOiBxdWV1ZUFybnMgZGlkIG5vdCBjb250YWluIGFnZW50UmVzb3VyY2VJZDogIixlKX0sbi5wcm90b3R5cGUudG9TbmFwc2hvdD1mdW5jdGlvbigpe3JldHVybiBuZXcgdC5BZ2VudFNuYXBzaG90KHRoaXMuX2dldERhdGEoKSl9O3ZhciByPWZ1bmN0aW9uKGUpe3QuQWdlbnQuY2FsbCh0aGlzKSx0aGlzLmFnZW50RGF0YT1lfTsoci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXIsci5wcm90b3R5cGUuX2dldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZ2VudERhdGF9LHIucHJvdG90eXBlLl9jcmVhdGVDb250YWN0QVBJPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdC5Db250YWN0U25hcHNob3QoZSl9O3ZhciBvPWZ1bmN0aW9uKGUpe3RoaXMuY29udGFjdElkPWV9O28ucHJvdG90eXBlLl9nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuZ2V0Q29udGFjdElkKCkpfSxvLnByb3RvdHlwZS5fY3JlYXRlQ29ubmVjdGlvbkFQST1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5nZXRUeXBlKCk9PT10LkNvbnRhY3RUeXBlLkNIQVQ/bmV3IHQuQ2hhdENvbm5lY3Rpb24odGhpcy5jb250YWN0SWQsZS5jb25uZWN0aW9uSWQpOnRoaXMuZ2V0VHlwZSgpPT09dC5Db250YWN0VHlwZS5UQVNLP25ldyB0LlRhc2tDb25uZWN0aW9uKHRoaXMuY29udGFjdElkLGUuY29ubmVjdGlvbklkKTpuZXcgdC5Wb2ljZUNvbm5lY3Rpb24odGhpcy5jb250YWN0SWQsZS5jb25uZWN0aW9uSWQpfSxvLnByb3RvdHlwZS5nZXRFdmVudE5hbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRDb250YWN0RXZlbnROYW1lKGUsdGhpcy5nZXRDb250YWN0SWQoKSl9LG8ucHJvdG90eXBlLm9uUmVmcmVzaD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLlJFRlJFU0gpLGUpfSxvLnByb3RvdHlwZS5vbkluY29taW5nPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuSU5DT01JTkcpLGUpfSxvLnByb3RvdHlwZS5vbkNvbm5lY3Rpbmc9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5DT05ORUNUSU5HKSxlKX0sby5wcm90b3R5cGUub25QZW5kaW5nPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuUEVORElORyksZSl9LG8ucHJvdG90eXBlLm9uQWNjZXB0ZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5BQ0NFUFRFRCksZSl9LG8ucHJvdG90eXBlLm9uTWlzc2VkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuTUlTU0VEKSxlKX0sby5wcm90b3R5cGUub25FbmRlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkVOREVEKSxlKX0sby5wcm90b3R5cGUub25EZXN0cm95PWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuREVTVFJPWUVEKSxlKX0sby5wcm90b3R5cGUub25BQ1c9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5BQ1cpLGUpfSxvLnByb3RvdHlwZS5vbkNvbm5lY3RlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkNPTk5FQ1RFRCksZSl9LG8ucHJvdG90eXBlLm9uRXJyb3I9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5FUlJPUiksZSl9LG8ucHJvdG90eXBlLmdldENvbnRhY3RJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhY3RJZH0sby5wcm90b3R5cGUuZ2V0T3JpZ2luYWxDb250YWN0SWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmluaXRpYWxDb250YWN0SWR9LG8ucHJvdG90eXBlLmdldEluaXRpYWxDb250YWN0SWQ9by5wcm90b3R5cGUuZ2V0T3JpZ2luYWxDb250YWN0SWQsby5wcm90b3R5cGUuZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkudHlwZX0sby5wcm90b3R5cGUuZ2V0Q29udGFjdER1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jb250YWN0RHVyYXRpb259LG8ucHJvdG90eXBlLmdldFN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zdGF0ZX0sby5wcm90b3R5cGUuZ2V0U3RhdHVzPW8ucHJvdG90eXBlLmdldFN0YXRlLG8ucHJvdG90eXBlLmdldFN0YXRlRHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdC5ub3coKS10aGlzLl9nZXREYXRhKCkuc3RhdGUudGltZXN0YW1wLmdldFRpbWUoKSt0LmNvcmUuZ2V0U2tldygpfSxvLnByb3RvdHlwZS5nZXRTdGF0dXNEdXJhdGlvbj1vLnByb3RvdHlwZS5nZXRTdGF0ZUR1cmF0aW9uLG8ucHJvdG90eXBlLmdldFF1ZXVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5xdWV1ZX0sby5wcm90b3R5cGUuZ2V0UXVldWVUaW1lc3RhbXA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnF1ZXVlVGltZXN0YW1wfSxvLnByb3RvdHlwZS5nZXRDb25uZWN0aW9ucz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jb25uZWN0aW9ucy5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiBlLmdldFR5cGUoKT09PXQuQ29udGFjdFR5cGUuQ0hBVD9uZXcgdC5DaGF0Q29ubmVjdGlvbihlLmNvbnRhY3RJZCxuLmNvbm5lY3Rpb25JZCk6ZS5nZXRUeXBlKCk9PT10LkNvbnRhY3RUeXBlLlRBU0s/bmV3IHQuVGFza0Nvbm5lY3Rpb24oZS5jb250YWN0SWQsbi5jb25uZWN0aW9uSWQpOm5ldyB0LlZvaWNlQ29ubmVjdGlvbihlLmNvbnRhY3RJZCxuLmNvbm5lY3Rpb25JZCl9KSl9LG8ucHJvdG90eXBlLmdldEluaXRpYWxDb25uZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHQuZmluZCh0aGlzLmdldENvbm5lY3Rpb25zKCksKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlzSW5pdGlhbENvbm5lY3Rpb24oKX0pKXx8bnVsbH0sby5wcm90b3R5cGUuZ2V0QWN0aXZlSW5pdGlhbENvbm5lY3Rpb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldEluaXRpYWxDb25uZWN0aW9uKCk7cmV0dXJuIG51bGwhPWUmJmUuaXNBY3RpdmUoKT9lOm51bGx9LG8ucHJvdG90eXBlLmdldFRoaXJkUGFydHlDb25uZWN0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbm5lY3Rpb25zKCkuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4hZS5pc0luaXRpYWxDb25uZWN0aW9uKCkmJmUuZ2V0VHlwZSgpIT09dC5Db25uZWN0aW9uVHlwZS5BR0VOVH0pKX0sby5wcm90b3R5cGUuZ2V0U2luZ2xlQWN0aXZlVGhpcmRQYXJ0eUNvbm5lY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRUaGlyZFBhcnR5Q29ubmVjdGlvbnMoKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlzQWN0aXZlKCl9KSlbMF18fG51bGx9LG8ucHJvdG90eXBlLmdldEFnZW50Q29ubmVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0LmZpbmQodGhpcy5nZXRDb25uZWN0aW9ucygpLChmdW5jdGlvbihlKXt2YXIgbj1lLmdldFR5cGUoKTtyZXR1cm4gbj09PXQuQ29ubmVjdGlvblR5cGUuQUdFTlR8fG49PT10LkNvbm5lY3Rpb25UeXBlLk1PTklUT1JJTkd9KSl9LG8ucHJvdG90eXBlLmdldEFjdGl2ZUNvbm5lY3Rpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvbnMoKS5maWx0ZXIoKGU9PmUuaXNBY3RpdmUoKSkpfSxvLnByb3RvdHlwZS5oYXNUd29BY3RpdmVQYXJ0aWNpcGFudHM9ZnVuY3Rpb24oKXtyZXR1cm4gMj09PXRoaXMuZ2V0QWN0aXZlQ29ubmVjdGlvbnMoKS5sZW5ndGh9LG8ucHJvdG90eXBlLmdldE5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLm5hbWV9LG8ucHJvdG90eXBlLmdldENvbnRhY3RNZXRhZGF0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuY29udGFjdE1ldGFkYXRhfSxvLnByb3RvdHlwZS5nZXREZXNjcmlwdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuZGVzY3JpcHRpb259LG8ucHJvdG90eXBlLmdldFJlZmVyZW5jZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnJlZmVyZW5jZXN9LG8ucHJvdG90eXBlLmdldEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmF0dHJpYnV0ZXN9LG8ucHJvdG90eXBlLmdldENvbnRhY3RGZWF0dXJlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuY29udGFjdEZlYXR1cmVzfSxvLnByb3RvdHlwZS5nZXRDaGFubmVsQ29udGV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuY2hhbm5lbENvbnRleHR9LG8ucHJvdG90eXBlLmdldFNlZ21lbnRBdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zZWdtZW50QXR0cmlidXRlc30sby5wcm90b3R5cGUuZ2V0Q29udGFjdFN1YnR5cGU9ZnVuY3Rpb24oKXtjb25zdCBlPXRoaXMuZ2V0U2VnbWVudEF0dHJpYnV0ZXMoKTtyZXR1cm4gZSYmZVsiY29ubmVjdDpTdWJ0eXBlIl0/ZVsiY29ubmVjdDpTdWJ0eXBlIl0uVmFsdWVTdHJpbmc6bnVsbH0sby5wcm90b3R5cGUuaXNTb2Z0cGhvbmVDYWxsPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXQuZmluZCh0aGlzLmdldENvbm5lY3Rpb25zKCksKGZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lLmdldFNvZnRwaG9uZU1lZGlhSW5mbygpfSkpfSxvLnByb3RvdHlwZS5oYXNWaWRlb1JUQ0NhcGFiaWxpdGllcz1mdW5jdGlvbigpe3JldHVybiBudWxsIT10LmZpbmQodGhpcy5nZXRDb25uZWN0aW9ucygpLChmdW5jdGlvbihlKXtyZXR1cm4gZS5jYW5TZW5kVmlkZW8mJmUuY2FuU2VuZFZpZGVvKCl9KSl9LG8ucHJvdG90eXBlLmNhbkFnZW50U2VuZFZpZGVvPWZ1bmN0aW9uKCl7Y29uc3QgZT10aGlzLmdldEFnZW50Q29ubmVjdGlvbigpO3JldHVybiBlLmNhblNlbmRWaWRlbyYmZS5jYW5TZW5kVmlkZW8oKX0sby5wcm90b3R5cGUuY2FuQWdlbnRSZWNlaXZlVmlkZW89ZnVuY3Rpb24oKXtjb25zdCBlPXRoaXMuZ2V0SW5pdGlhbENvbm5lY3Rpb24oKTtpZihlLmNhblNlbmRWaWRlbyYmZS5jYW5TZW5kVmlkZW8oKSlyZXR1cm4hMDtjb25zdCB0PXRoaXMuZ2V0VGhpcmRQYXJ0eUNvbm5lY3Rpb25zKCk7cmV0dXJuIHQmJnQubGVuZ3RoPjAmJnRoaXMuY2FuQWdlbnRTZW5kVmlkZW8oKX0sby5wcm90b3R5cGUuX2lzSW5ib3VuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuaW5pdGlhdGlvbk1ldGhvZCE9PXQuQ29udGFjdEluaXRpYXRpb25NZXRob2QuT1VUQk9VTkR9LG8ucHJvdG90eXBlLmlzSW5ib3VuZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0SW5pdGlhbENvbm5lY3Rpb24oKTtyZXR1cm4gZS5nZXRNZWRpYVR5cGUoKT09PXQuTWVkaWFUeXBlLlRBU0s/dGhpcy5faXNJbmJvdW5kKCk6ISFlJiZlLmdldFR5cGUoKT09PXQuQ29ubmVjdGlvblR5cGUuSU5CT1VORH0sby5wcm90b3R5cGUuaXNDb25uZWN0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRTdGF0dXMoKS50eXBlPT09dC5Db250YWN0U3RhdGVUeXBlLkNPTk5FQ1RFRH0sby5wcm90b3R5cGUuYWNjZXB0PWZ1bmN0aW9uKGUpe3ZhciBuPXQuY29yZS5nZXRDbGllbnQoKSxyPXRoaXMsbz10aGlzLmdldENvbnRhY3RJZCgpO3QucHVibGlzaENsaWNrU3RyZWFtRGF0YSh7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY2xpY2tUeXBlOnQuQ2xpY2tUeXBlLkFDQ0VQVCxjbGlja1RpbWU6KG5ldyBEYXRlKS50b0lTT1N0cmluZygpfSksbi5jYWxsKHQuQ2xpZW50TWV0aG9kcy5BQ0NFUFRfQ09OVEFDVCx7Y29udGFjdElkOm99LHtzdWNjZXNzOmZ1bmN0aW9uKG4pe3ZhciBpPXQuY29yZS5nZXRVcHN0cmVhbSgpO2kuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db250YWN0RXZlbnRzLkFDQ0VQVEVELGRhdGE6bmV3IHQuQ29udGFjdChvKX0pLGkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5jb3JlLmdldENvbnRhY3RFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkFDQ0VQVEVELHIuZ2V0Q29udGFjdElkKCkpLGRhdGE6bmV3IHQuQ29udGFjdChvKX0pO3ZhciBzPW5ldyB0LkNvbnRhY3Qobyk7dC5pc0ZpcmVmb3hCcm93c2VyKCkmJnMuaXNTb2Z0cGhvbmVDYWxsKCkmJnQuY29yZS50cmlnZ2VyUmVhZHlUb1N0YXJ0U2Vzc2lvbkV2ZW50KCksZSYmZS5zdWNjZXNzJiZlLnN1Y2Nlc3Mobil9LGZhaWx1cmU6ZnVuY3Rpb24obixyKXt0LmdldExvZygpLmVycm9yKCJBY2NlcHQgQ29udGFjdCBmYWlsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhFeGNlcHRpb24obikud2l0aE9iamVjdCh7ZGF0YTpyfSksdC5wdWJsaXNoTWV0cmljKHtuYW1lOiJDb250YWN0QWNjZXB0RmFpbHVyZSIsZGF0YTp7Y291bnQ6MX19KSxlJiZlLmZhaWx1cmUmJmUuZmFpbHVyZSh0LkNvbnRhY3RTdGF0ZVR5cGUuRVJST1IpfX0pfSxvLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dC5nZXRMb2coKS53YXJuKCJjb250YWN0LmRlc3Ryb3koKSBoYXMgYmVlbiBkZXByZWNhdGVkLiIpfSxvLnByb3RvdHlwZS5yZWplY3Q9ZnVuY3Rpb24oZSl7dmFyIG49dC5jb3JlLmdldENsaWVudCgpO3QucHVibGlzaENsaWNrU3RyZWFtRGF0YSh7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY2xpY2tUeXBlOnQuQ2xpY2tUeXBlLlJFSkVDVCxjbGlja1RpbWU6KG5ldyBEYXRlKS50b0lTT1N0cmluZygpfSksbi5jYWxsKHQuQ2xpZW50TWV0aG9kcy5SRUpFQ1RfQ09OVEFDVCx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCl9LGUpfSxvLnByb3RvdHlwZS5jb21wbGV0ZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ09NUExFVEVfQ09OVEFDVCx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCl9LGUpfSxvLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ0xFQVJfQ09OVEFDVCx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCl9LGUpfSxvLnByb3RvdHlwZS5ub3RpZnlJc3N1ZT1mdW5jdGlvbihlLG4scil7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLk5PVElGWV9DT05UQUNUX0lTU1VFLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxpc3N1ZUNvZGU6ZSxkZXNjcmlwdGlvbjpufSxyKX0sby5wcm90b3R5cGUuYWRkQ29ubmVjdGlvbj1mdW5jdGlvbihlLG4pe3ZhciByPXQuY29yZS5nZXRDbGllbnQoKSxvPW5ldyB0LkVuZHBvaW50KGUpO2RlbGV0ZSBvLmVuZHBvaW50SWQsci5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DUkVBVEVfQURESVRJT05BTF9DT05ORUNUSU9OLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxlbmRwb2ludDpvfSxuKX0sby5wcm90b3R5cGUudG9nZ2xlQWN0aXZlQ29ubmVjdGlvbnM9ZnVuY3Rpb24oZSl7dmFyIG49dC5jb3JlLmdldENsaWVudCgpLHI9bnVsbCxvPXQuZmluZCh0aGlzLmdldENvbm5lY3Rpb25zKCksKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbm5lY3Rpb25TdGF0ZVR5cGUuSE9MRH0pKTtpZihudWxsIT1vKXI9by5nZXRDb25uZWN0aW9uSWQoKTtlbHNle3ZhciBpPXRoaXMuZ2V0Q29ubmVjdGlvbnMoKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlzQWN0aXZlKCl9KSk7aS5sZW5ndGg+MCYmKHI9aVswXS5nZXRDb25uZWN0aW9uSWQoKSl9bi5jYWxsKHQuQ2xpZW50TWV0aG9kcy5UT0dHTEVfQUNUSVZFX0NPTk5FQ1RJT05TLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjb25uZWN0aW9uSWQ6cn0sZSl9LG8ucHJvdG90eXBlLnNlbmRTb2Z0cGhvbmVNZXRyaWNzPWZ1bmN0aW9uKG4scil7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLlNFTkRfU09GVFBIT05FX0NBTExfTUVUUklDUyx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY2NwVmVyc2lvbjplLmNjcFZlcnNpb24sc29mdHBob25lU3RyZWFtU3RhdGlzdGljczpufSxyKSx0LnB1Ymxpc2hTb2Z0cGhvbmVTdGF0cyh7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY2NwVmVyc2lvbjplLmNjcFZlcnNpb24sc3RhdHM6bn0pfSxvLnByb3RvdHlwZS5zZW5kU29mdHBob25lUmVwb3J0PWZ1bmN0aW9uKG4scil7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLlNFTkRfU09GVFBIT05FX0NBTExfUkVQT1JULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjY3BWZXJzaW9uOmUuY2NwVmVyc2lvbixyZXBvcnQ6bn0scil9LG8ucHJvdG90eXBlLmNvbmZlcmVuY2VDb25uZWN0aW9ucz1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ09ORkVSRU5DRV9DT05ORUNUSU9OUyx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCl9LGUpfSxvLnByb3RvdHlwZS50b1NuYXBzaG90PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0LkNvbnRhY3RTbmFwc2hvdCh0aGlzLl9nZXREYXRhKCkpfSxvLnByb3RvdHlwZS5pc011bHRpUGFydHlDb25mZXJlbmNlRW5hYmxlZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0Q29udGFjdEZlYXR1cmVzKCk7cmV0dXJuISghZXx8IWUubXVsdGlQYXJ0eUNvbmZlcmVuY2VFbmFibGVkKX0sby5wcm90b3R5cGUudXBkYXRlTW9uaXRvclBhcnRpY2lwYW50U3RhdGU9ZnVuY3Rpb24oZSxuKXtlJiZPYmplY3QudmFsdWVzKHQuTW9uaXRvcmluZ01vZGUpLmluY2x1ZGVzKGUudG9VcHBlckNhc2UoKSk/dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLlVQREFURV9NT05JVE9SX1BBUlRJQ0lQQU5UX1NUQVRFLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSx0YXJnZXRNb25pdG9yTW9kZTplLnRvVXBwZXJDYXNlKCl9LG4pOih0LmdldExvZygpLmVycm9yKGBJbnZhbGlkIHRhcmdldCBzdGF0ZSB3YXMgcHJvdmlkZWQ6ICR7ZX1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4mJm4uZmFpbHVyZSYmbi5mYWlsdXJlKHQuTW9uaXRvcmluZ0Vycm9yVHlwZXMuSU5WQUxJRF9UQVJHRVRfU1RBVEUpKX0sby5wcm90b3R5cGUuaXNVbmRlclN1cGVydmlzaW9uPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRDb25uZWN0aW9ucygpLmZpbHRlcigoZT0+ZS5nZXRUeXBlKCkhPT10LkNvbm5lY3Rpb25UeXBlLkFHRU5UKSk7cmV0dXJuIHZvaWQgMCE9PShlJiZlLmZpbmQoKGU9PmUuaXNCYXJnZSgpJiZlLmlzQWN0aXZlKCkpKSl9LG8ucHJvdG90eXBlLnNpbGVudE1vbml0b3I9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudXBkYXRlTW9uaXRvclBhcnRpY2lwYW50U3RhdGUodC5Nb25pdG9yaW5nTW9kZS5TSUxFTlRfTU9OSVRPUixlKX0sby5wcm90b3R5cGUuYmFyZ2VJbj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy51cGRhdGVNb25pdG9yUGFydGljaXBhbnRTdGF0ZSh0Lk1vbml0b3JpbmdNb2RlLkJBUkdFLGUpfSxvLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuUEFVU0VfQ09OVEFDVCx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCl9LGUpfSxvLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLlJFU1VNRV9DT05UQUNULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKX0sZSl9O3ZhciBpPWZ1bmN0aW9uKGUpe3QuQ29udGFjdC5jYWxsKHRoaXMsZS5jb250YWN0SWQpLHRoaXMuY29udGFjdERhdGE9ZX07KGkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1pLGkucHJvdG90eXBlLl9nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFjdERhdGF9LGkucHJvdG90eXBlLl9jcmVhdGVDb25uZWN0aW9uQVBJPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdC5Db25uZWN0aW9uU25hcHNob3QoZSl9O3ZhciBzPWZ1bmN0aW9uKGUsdCl7dGhpcy5jb250YWN0SWQ9ZSx0aGlzLmNvbm5lY3Rpb25JZD10LHRoaXMuX2luaXRNZWRpYUNvbnRyb2xsZXIoKX07cy5wcm90b3R5cGUuX2dldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29ubmVjdGlvbkRhdGEodGhpcy5nZXRDb250YWN0SWQoKSx0aGlzLmdldENvbm5lY3Rpb25JZCgpKX0scy5wcm90b3R5cGUuZ2V0Q29udGFjdElkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFjdElkfSxzLnByb3RvdHlwZS5nZXRDb25uZWN0aW9uSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25uZWN0aW9uSWR9LHMucHJvdG90eXBlLmdldEVuZHBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0LkVuZHBvaW50KHRoaXMuX2dldERhdGEoKS5lbmRwb2ludCl9LHMucHJvdG90eXBlLmdldEFkZHJlc3M9cy5wcm90b3R5cGUuZ2V0RW5kcG9pbnQscy5wcm90b3R5cGUuZ2V0U3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnN0YXRlfSxzLnByb3RvdHlwZS5nZXRTdGF0dXM9cy5wcm90b3R5cGUuZ2V0U3RhdGUscy5wcm90b3R5cGUuZ2V0U3RhdGVEdXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0Lm5vdygpLXRoaXMuX2dldERhdGEoKS5zdGF0ZS50aW1lc3RhbXAuZ2V0VGltZSgpK3QuY29yZS5nZXRTa2V3KCl9LHMucHJvdG90eXBlLmdldFN0YXR1c0R1cmF0aW9uPXMucHJvdG90eXBlLmdldFN0YXRlRHVyYXRpb24scy5wcm90b3R5cGUuZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkudHlwZX0scy5wcm90b3R5cGUuaXNJbml0aWFsQ29ubmVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuaW5pdGlhbH0scy5wcm90b3R5cGUuaXNBY3RpdmU9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb250YWlucyh0LkNPTk5FQ1RJT05fQUNUSVZFX1NUQVRFUyx0aGlzLmdldFN0YXR1cygpLnR5cGUpfSxzLnByb3RvdHlwZS5pc0Nvbm5lY3RlZD1mdW5jdGlvbigpe3JldHVybiB0LmNvbnRhaW5zKHQuQ09OTkVDVElPTl9DT05ORUNURURfU1RBVEVTLHRoaXMuZ2V0U3RhdHVzKCkudHlwZSl9LHMucHJvdG90eXBlLmlzQ29ubmVjdGluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbm5lY3Rpb25TdGF0ZVR5cGUuQ09OTkVDVElOR30scy5wcm90b3R5cGUuaXNPbkhvbGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRTdGF0dXMoKS50eXBlPT09dC5Db25uZWN0aW9uU3RhdGVUeXBlLkhPTER9LHMucHJvdG90eXBlLmdldFNvZnRwaG9uZU1lZGlhSW5mbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuc29mdHBob25lTWVkaWFJbmZvfSxzLnByb3RvdHlwZS5nZXRNb25pdG9ySW5mbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkubW9uaXRvcmluZ0luZm99LHMucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oZSl7dC5wdWJsaXNoQ2xpY2tTdHJlYW1EYXRhKHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjbGlja1R5cGU6dC5DbGlja1R5cGUuSEFOR1VQLGNsaWNrVGltZToobmV3IERhdGUpLnRvSVNPU3RyaW5nKCl9KSx0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuREVTVFJPWV9DT05ORUNUSU9OLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjb25uZWN0aW9uSWQ6dGhpcy5nZXRDb25uZWN0aW9uSWQoKX0sZSl9LHMucHJvdG90eXBlLnNlbmREaWdpdHM9ZnVuY3Rpb24oZSxuKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuU0VORF9ESUdJVFMse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNvbm5lY3Rpb25JZDp0aGlzLmdldENvbm5lY3Rpb25JZCgpLGRpZ2l0czplfSxuKX0scy5wcm90b3R5cGUuaG9sZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuSE9MRF9DT05ORUNUSU9OLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjb25uZWN0aW9uSWQ6dGhpcy5nZXRDb25uZWN0aW9uSWQoKX0sZSl9LHMucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuUkVTVU1FX0NPTk5FQ1RJT04se2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNvbm5lY3Rpb25JZDp0aGlzLmdldENvbm5lY3Rpb25JZCgpfSxlKX0scy5wcm90b3R5cGUudG9TbmFwc2hvdD1mdW5jdGlvbigpe3JldHVybiBuZXcgdC5Db25uZWN0aW9uU25hcHNob3QodGhpcy5fZ2V0RGF0YSgpKX0scy5wcm90b3R5cGUuX2luaXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oKXt0aGlzLmdldE1lZGlhSW5mbygpJiZ0LmNvcmUubWVkaWFGYWN0b3J5LmdldCh0aGlzKS5jYXRjaCgoZnVuY3Rpb24oKXt9KSl9LHMucHJvdG90eXBlLl9pc0FnZW50Q29ubmVjdGlvblR5cGU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFR5cGUoKTtyZXR1cm4gZT09PXQuQ29ubmVjdGlvblR5cGUuQUdFTlR8fGU9PT10LkNvbm5lY3Rpb25UeXBlLk1PTklUT1JJTkd9LHMucHJvdG90eXBlLl9pc0FnZW50Q29ubmVjdGlvblR5cGU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFR5cGUoKTtyZXR1cm4gZT09PXQuQ29ubmVjdGlvblR5cGUuQUdFTlR8fGU9PT10LkNvbm5lY3Rpb25UeXBlLk1PTklUT1JJTkd9O3ZhciBhPWZ1bmN0aW9uKGUpe3RoaXMuY29udGFjdElkPWV9O2EucHJvdG90eXBlLmdldFNwZWFrZXJJZD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5jaGVja0NvbmZlcmVuY2VDYWxsKCk7dmFyIG49dC5jb3JlLmdldENsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixvKXtjb25zdCBpPXtjb250YWN0SWQ6ZS5jb250YWN0SWQsaW5zdGFuY2VJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRJbnN0YW5jZUlkKCksYXdzQWNjb3VudElkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEFXU0FjY291bnRJZCgpfTt0LmdldExvZygpLmluZm8oImdldFNwZWFrZXJJZCBjYWxsZWQiKS53aXRoT2JqZWN0KGkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLkdFVF9DT05UQUNULGkse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7aWYoZS5jb250YWN0RGF0YS5jdXN0b21lcklkKXt2YXIgbj17c3BlYWtlcklkOmUuY29udGFjdERhdGEuY3VzdG9tZXJJZH07dC5nZXRMb2coKS5pbmZvKCJnZXRTcGVha2VySWQgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIobil9ZWxzZXt2YXIgaT10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLk5PX1NQRUFLRVJfSURfRk9VTkQsIk5vIHNwZWFrZXJJZCBhc3NvdGlhdGVkIHdpdGggdGhpcyBjYWxsIik7byhpKX19LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigiR2V0IFNwZWFrZXJJZCBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5HRVRfU1BFQUtFUl9JRF9GQUlMRUQsIkdldCBTcGVha2VySWQgZmFpbGVkIixlKTtvKG4pfX0pfSkpfSxhLnByb3RvdHlwZS5nZXRTcGVha2VyU3RhdHVzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLmNoZWNrQ29uZmVyZW5jZUNhbGwoKTt2YXIgbj10LmNvcmUuZ2V0Q2xpZW50KCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe2UuZ2V0U3BlYWtlcklkKCkudGhlbigoZnVuY3Rpb24oaSl7ZS5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGUpe2NvbnN0IHM9e1NwZWFrZXJJZDp0LmFzc2VydE5vdE51bGwoaS5zcGVha2VySWQsInNwZWFrZXJJZCIpLERvbWFpbklkOmV9O3QuZ2V0TG9nKCkuaW5mbygiZ2V0U3BlYWtlclN0YXR1cyBjYWxsZWQiKS53aXRoT2JqZWN0KHMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLkRFU0NSSUJFX1NQRUFLRVIscyx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oImdldFNwZWFrZXJTdGF0dXMgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoZSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dmFyIG49SlNPTi5wYXJzZShlKTtzd2l0Y2gobi5zdGF0dXMpe2Nhc2UgNDAwOmNhc2UgNDA0OnZhciBpPW47aS50eXBlPWkudHlwZT9pLnR5cGU6dC5Wb2ljZUlkRXJyb3JUeXBlcy5TUEVBS0VSX0lEX05PVF9FTlJPTExFRCx0LmdldExvZygpLmluZm8oIlNwZWFrZXIgaXMgbm90IGVucm9sbGVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihpKTticmVhaztkZWZhdWx0OnQuZ2V0TG9nKCkuZXJyb3IoImdldFNwZWFrZXJTdGF0dXMgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBzPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuR0VUX1NQRUFLRVJfU1RBVFVTX0ZBSUxFRCwiR2V0IFNwZWFrZXJTdGF0dXMgZmFpbGVkIixlKTtvKHMpfX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKX0sYS5wcm90b3R5cGUuX29wdE91dFNwZWFrZXJJbkxjbXM9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzLG89dC5jb3JlLmdldENsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oaSxzKXtjb25zdCBhPXtDb250YWN0SWQ6ci5jb250YWN0SWQsSW5zdGFuY2VJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRJbnN0YW5jZUlkKCksQVdTQWNjb3VudElkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEFXU0FjY291bnRJZCgpLEN1c3RvbWVySWQ6dC5hc3NlcnROb3ROdWxsKGUsInNwZWFrZXJJZCIpLFZvaWNlSWRSZXN1bHQ6e1NwZWFrZXJPcHRlZE91dDohMCxnZW5lcmF0ZWRTcGVha2VySWQ6bn19O3QuZ2V0TG9nKCkuaW5mbygiX29wdE91dFNwZWFrZXJJbkxjbXMgY2FsbGVkIikud2l0aE9iamVjdChhKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG8uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5VUERBVEVfVk9JQ0VfSURfREFUQSxhLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygib3B0T3V0U3BlYWtlckluTGNtcyBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaShlKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJvcHRPdXRTcGVha2VySW5MY21zIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLk9QVF9PVVRfU1BFQUtFUl9JTl9MQ01TX0ZBSUxFRCwib3B0T3V0U3BlYWtlckluTGNtcyBmYWlsZWQiLGUpO3Mobil9fSl9KSl9LGEucHJvdG90eXBlLm9wdE91dFNwZWFrZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuY2hlY2tDb25mZXJlbmNlQ2FsbCgpO3ZhciBuPXQuY29yZS5nZXRDbGllbnQoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7ZS5nZXRTcGVha2VySWQoKS50aGVuKChmdW5jdGlvbihpKXtlLmdldERvbWFpbklkKCkudGhlbigoZnVuY3Rpb24ocyl7dmFyIGE9aS5zcGVha2VySWQ7Y29uc3QgYz17U3BlYWtlcklkOnQuYXNzZXJ0Tm90TnVsbChhLCJzcGVha2VySWQiKSxEb21haW5JZDpzfTt0LmdldExvZygpLmluZm8oIm9wdE91dFNwZWFrZXIgY2FsbGVkIikud2l0aE9iamVjdChjKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5PUFRfT1VUX1NQRUFLRVIsYyx7c3VjY2VzczpmdW5jdGlvbihuKXtlLl9vcHRPdXRTcGVha2VySW5MY21zKGEsbi5nZW5lcmF0ZWRTcGVha2VySWQpLmNhdGNoKChmdW5jdGlvbigpe30pKSx0LmdldExvZygpLmluZm8oIm9wdE91dFNwZWFrZXIgc3VjY2VlZGVkIikud2l0aE9iamVjdChuKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIobil9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigib3B0T3V0U3BlYWtlciBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5PUFRfT1VUX1NQRUFLRVJfRkFJTEVELCJvcHRPdXRTcGVha2VyIGZhaWxlZC4iLGUpO28obil9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28oZSl9KSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28oZSl9KSl9KSl9LGEucHJvdG90eXBlLmRlbGV0ZVNwZWFrZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuY2hlY2tDb25mZXJlbmNlQ2FsbCgpO3ZhciBuPXQuY29yZS5nZXRDbGllbnQoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7ZS5nZXRTcGVha2VySWQoKS50aGVuKChmdW5jdGlvbihpKXtlLmdldERvbWFpbklkKCkudGhlbigoZnVuY3Rpb24oZSl7Y29uc3Qgcz17U3BlYWtlcklkOnQuYXNzZXJ0Tm90TnVsbChpLnNwZWFrZXJJZCwic3BlYWtlcklkIiksRG9tYWluSWQ6ZX07dC5nZXRMb2coKS5pbmZvKCJkZWxldGVTcGVha2VyIGNhbGxlZCIpLndpdGhPYmplY3Qocykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuREVMRVRFX1NQRUFLRVIscyx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oImRlbGV0ZVNwZWFrZXIgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoZSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigiZGVsZXRlU3BlYWtlciBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5ERUxFVEVfU1BFQUtFUl9GQUlMRUQsImRlbGV0ZVNwZWFrZXIgZmFpbGVkLiIsZSk7byhuKX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKX0sYS5wcm90b3R5cGUuc3RhcnRTZXNzaW9uPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLmNoZWNrQ29uZmVyZW5jZUNhbGwoKTt2YXIgbj10LmNvcmUuZ2V0Q2xpZW50KCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe2UuZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihpKXtjb25zdCBzPXtjb250YWN0SWQ6ZS5jb250YWN0SWQsaW5zdGFuY2VJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRJbnN0YW5jZUlkKCksY3VzdG9tZXJBY2NvdW50SWQ6dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0QVdTQWNjb3VudElkKCksY2xpZW50VG9rZW46QVdTLnV0aWwudXVpZC52NCgpLGRvbWFpbklkOml9O3QuZ2V0TG9nKCkuaW5mbygic3RhcnRTZXNzaW9uIGNhbGxlZCIpLndpdGhPYmplY3Qocykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuU1RBUlRfVk9JQ0VfSURfU0VTU0lPTixzLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe2lmKGUuc2Vzc2lvbklkKXIoZSk7ZWxzZXt0LmdldExvZygpLmVycm9yKCJzdGFydFZvaWNlSWRTZXNzaW9uIGZhaWxlZCwgbm8gc2Vzc2lvbiBpZCByZXR1cm5lZCIpLndpdGhPYmplY3Qoe2RhdGE6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5TVEFSVF9TRVNTSU9OX0ZBSUxFRCwiTm8gc2Vzc2lvbiBpZCByZXR1cm5lZCBmcm9tIHN0YXJ0IHNlc3Npb24gYXBpIik7byhuKX19LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigic3RhcnRWb2ljZUlkU2Vzc2lvbiBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5TVEFSVF9TRVNTSU9OX0ZBSUxFRCwic3RhcnRWb2ljZUlkU2Vzc2lvbiBmYWlsZWQiLGUpO28obil9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28oZSl9KSl9KSl9LGEucHJvdG90eXBlLmV2YWx1YXRlU3BlYWtlcj1mdW5jdGlvbihlKXt2YXIgbj10aGlzO24uY2hlY2tDb25mZXJlbmNlQ2FsbCgpO3ZhciByPXQuY29yZS5nZXRDbGllbnQoKSxvPXQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKSxpPTA7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihzLGEpe2Z1bmN0aW9uIGMoKXtuLmdldERvbWFpbklkKCkudGhlbigoZnVuY3Rpb24oZSl7Y29uc3QgdT17U2Vzc2lvbk5hbWVPcklkOm8uaW5pdGlhbENvbnRhY3RJZHx8dGhpcy5jb250YWN0SWQsRG9tYWluSWQ6ZX07dC5nZXRMb2coKS5pbmZvKCJldmFsdWF0ZVNwZWFrZXIgY2FsbGVkIikud2l0aE9iamVjdCh1KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIuY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5FVkFMVUFURV9TRVNTSU9OLHUse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7aWYoKytpPHQuVm9pY2VJZENvbnN0YW50cy5FVkFMVUFUSU9OX01BWF9QT0xMX1RJTUVTKWlmKGUuU3RyZWFtaW5nU3RhdHVzPT09dC5Wb2ljZUlkU3RyZWFtaW5nU3RhdHVzLlBFTkRJTkdfQ09ORklHVVJBVElPTilzZXRUaW1lb3V0KGMsdC5Wb2ljZUlkQ29uc3RhbnRzLkVWQUxVQVRJT05fUE9MTElOR19JTlRFUlZBTCk7ZWxzZXtpZihlLkF1dGhlbnRpY2F0aW9uUmVzdWx0fHwoZS5BdXRoZW50aWNhdGlvblJlc3VsdD17fSxlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLk5PVF9FTkFCTEVEKSxlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0fHwoZS5GcmF1ZERldGVjdGlvblJlc3VsdD17fSxlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uLk5PVF9FTkFCTEVEKSwhbi5pc0F1dGhFbmFibGVkKGUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb24pJiYhbi5pc0ZyYXVkRW5hYmxlZChlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uKSlyZXR1cm4gdC5nZXRMb2coKS5pbmZvKCJldmFsdWF0ZVNwZWFrZXIgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHZvaWQgcyhlKTtpZihlLlN0cmVhbWluZ1N0YXR1cz09PXQuVm9pY2VJZFN0cmVhbWluZ1N0YXR1cy5FTkRFRCYmKG4uaXNBdXRoUmVzdWx0Tm90RW5vdWdoU3BlZWNoKGUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb24pJiYoZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93QXV0aGVudGljYXRpb25EZWNpc2lvbi5JTkNPTkNMVVNJVkUpLG4uaXNGcmF1ZFJlc3VsdE5vdEVub3VnaFNwZWVjaChlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uKSYmKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uSU5DT05DTFVTSVZFKSksbi5pc0F1dGhSZXN1bHRJbmNvbmNsdXNpdmUoZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbikmJm4uaXNGcmF1ZFJlc3VsdEluY29uY2x1c2l2ZShlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uKSlyZXR1cm4gdC5nZXRMb2coKS5pbmZvKCJldmFsdWF0ZVNwZWFrZXIgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHZvaWQgcyhlKTtpZighbi5pc0F1dGhSZXN1bHROb3RFbm91Z2hTcGVlY2goZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbikmJm4uaXNBdXRoRW5hYmxlZChlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uKSlzd2l0Y2goZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbil7Y2FzZSB0LlZvaWNlSWRBdXRoZW50aWNhdGlvbkRlY2lzaW9uLkFDQ0VQVDplLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLkFVVEhFTlRJQ0FURUQ7YnJlYWs7Y2FzZSB0LlZvaWNlSWRBdXRoZW50aWNhdGlvbkRlY2lzaW9uLlJFSkVDVDplLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLk5PVF9BVVRIRU5USUNBVEVEO2JyZWFrO2Nhc2UgdC5Wb2ljZUlkQXV0aGVudGljYXRpb25EZWNpc2lvbi5TUEVBS0VSX09QVEVEX09VVDplLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLk9QVEVEX09VVDticmVhaztjYXNlIHQuVm9pY2VJZEF1dGhlbnRpY2F0aW9uRGVjaXNpb24uU1BFQUtFUl9OT1RfRU5ST0xMRUQ6ZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93QXV0aGVudGljYXRpb25EZWNpc2lvbi5OT1RfRU5ST0xMRUQ7YnJlYWs7ZGVmYXVsdDplLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLkVSUk9SfWlmKCFuLmlzRnJhdWRSZXN1bHROb3RFbm91Z2hTcGVlY2goZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbikmJm4uaXNGcmF1ZEVuYWJsZWQoZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbikpc3dpdGNoKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb24pe2Nhc2UgdC5Wb2ljZUlkRnJhdWREZXRlY3Rpb25EZWNpc2lvbi5ISUdIX1JJU0s6ZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93RnJhdWREZXRlY3Rpb25EZWNpc2lvbi5ISUdIX1JJU0s7YnJlYWs7Y2FzZSB0LlZvaWNlSWRGcmF1ZERldGVjdGlvbkRlY2lzaW9uLkxPV19SSVNLOmUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uTE9XX1JJU0s7YnJlYWs7ZGVmYXVsdDplLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uLkVSUk9SfWlmKCFuLmlzQXV0aFJlc3VsdE5vdEVub3VnaFNwZWVjaChlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uKSYmIW4uaXNGcmF1ZFJlc3VsdE5vdEVub3VnaFNwZWVjaChlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uKSlyZXR1cm4gdC5nZXRMb2coKS5pbmZvKCJldmFsdWF0ZVNwZWFrZXIgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHZvaWQgcyhlKTtzZXRUaW1lb3V0KGMsdC5Wb2ljZUlkQ29uc3RhbnRzLkVWQUxVQVRJT05fUE9MTElOR19JTlRFUlZBTCl9ZWxzZXt0LmdldExvZygpLmVycm9yKCJldmFsdWF0ZVNwZWFrZXIgdGltZW91dCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIHI9dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5FVkFMVUFURV9TUEVBS0VSX1RJTUVPVVQsImV2YWx1YXRlU3BlYWtlciB0aW1lb3V0Iik7YShyKX19LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dmFyIG47c3dpdGNoKEpTT04ucGFyc2UoZSkuc3RhdHVzKXtjYXNlIDQwMDpjYXNlIDQwNDpuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuU0VTU0lPTl9OT1RfRVhJU1RTLCJldmFsdWF0ZVNwZWFrZXIgZmFpbGVkLCBzZXNzaW9uIG5vdCBleGlzdHMiLGUpLHQuZ2V0TG9nKCkuZXJyb3IoImV2YWx1YXRlU3BlYWtlciBmYWlsZWQsIHNlc3Npb24gbm90IGV4aXN0cyIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTticmVhaztkZWZhdWx0Om49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5FVkFMVUFURV9TUEVBS0VSX0ZBSUxFRCwiZXZhbHVhdGVTcGVha2VyIGZhaWxlZCIsZSksdC5nZXRMb2coKS5lcnJvcigiZXZhbHVhdGVTcGVha2VyIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1hKG4pfX0pfSkpLmNhdGNoKChmdW5jdGlvbihlKXthKGUpfSkpfWU/bi5zdGFydFNlc3Npb24oKS50aGVuKChmdW5jdGlvbihlKXtuLnN5bmNTcGVha2VySWQoKS50aGVuKChmdW5jdGlvbihlKXtzZXRUaW1lb3V0KGMsdC5Wb2ljZUlkQ29uc3RhbnRzLkVWQUxVQVRFX1NFU1NJT05fREVMQVkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJzeW5jU3BlYWtlcklkIGZhaWxlZCB3aGVuIHNlc3Npb24gc3RhcnROZXc9dHJ1ZSIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxhKGUpfSkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJzdGFydFNlc3Npb24gZmFpbGVkIHdoZW4gc2Vzc2lvbiBzdGFydE5ldz10cnVlIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGEoZSl9KSk6bi5zeW5jU3BlYWtlcklkKCkudGhlbigoZnVuY3Rpb24oKXtjKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoInN5bmNTcGVha2VySWQgZmFpbGVkIHdoZW4gc2Vzc2lvbiBzdGFydE5ldz1mYWxzZSIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxhKGUpfSkpfSkpfSxhLnByb3RvdHlwZS5kZXNjcmliZVNlc3Npb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49dC5jb3JlLmdldENsaWVudCgpLHI9dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5jb250YWN0SWQpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obyxpKXtlLmdldERvbWFpbklkKCkudGhlbigoZnVuY3Rpb24oZSl7Y29uc3Qgcz17U2Vzc2lvbk5hbWVPcklkOnIuaW5pdGlhbENvbnRhY3RJZHx8dGhpcy5jb250YWN0SWQsRG9tYWluSWQ6ZX07dC5nZXRMb2coKS5pbmZvKCJkZXNjcmliZVNlc3Npb24gY2FsbGVkIikud2l0aE9iamVjdChzKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5ERVNDUklCRV9TRVNTSU9OLHMse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7byhlKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJkZXNjcmliZVNlc3Npb24gZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuREVTQ1JJQkVfU0VTU0lPTl9GQUlMRUQsImRlc2NyaWJlU2Vzc2lvbiBmYWlsZWQiLGUpO2kobil9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe2koZSl9KSl9KSl9LGEucHJvdG90eXBlLmNoZWNrRW5yb2xsbWVudFN0YXR1cz1mdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oImNoZWNrRW5yb2xsbWVudFN0YXR1cyBjYWxsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXRoaXMscj0wLG89ITE7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihpLHMpeyFmdW5jdGlvbiBhKCl7aWYoKytyPHQuVm9pY2VJZENvbnN0YW50cy5FTlJPTExNRU5UX01BWF9QT0xMX1RJTUVTKW4uZGVzY3JpYmVTZXNzaW9uKCkudGhlbigoZnVuY3Rpb24ocil7c3dpdGNoKHIuU2Vzc2lvbi5FbnJvbGxtZW50UmVxdWVzdERldGFpbHMuU3RhdHVzKXtjYXNlIHQuVm9pY2VJZEVucm9sbG1lbnRSZXF1ZXN0U3RhdHVzLkNPTVBMRVRFRDppKHIpO2JyZWFrO2Nhc2UgdC5Wb2ljZUlkRW5yb2xsbWVudFJlcXVlc3RTdGF0dXMuSU5fUFJPR1JFU1M6b3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGV8fChlKHIpLG89ITApLHNldFRpbWVvdXQoYSx0LlZvaWNlSWRDb25zdGFudHMuRU5ST0xMTUVOVF9QT0xMSU5HX0lOVEVSVkFMKTticmVhaztjYXNlIHQuVm9pY2VJZEVucm9sbG1lbnRSZXF1ZXN0U3RhdHVzLk5PVF9FTk9VR0hfU1BFRUNIOnIuU2Vzc2lvbi5TdHJlYW1pbmdTdGF0dXMhPT10LlZvaWNlSWRTdHJlYW1pbmdTdGF0dXMuRU5ERUQ/c2V0VGltZW91dChhLHQuVm9pY2VJZENvbnN0YW50cy5FTlJPTExNRU5UX1BPTExJTkdfSU5URVJWQUwpOnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bi5zdGFydFNlc3Npb24oKS50aGVuKChmdW5jdGlvbihlKXthKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUsdCl7cyhlKX0pKX0pLHQuVm9pY2VJZENvbnN0YW50cy5TVEFSVF9TRVNTSU9OX0RFTEFZKTticmVhaztkZWZhdWx0OnZhciBjPXIuU2Vzc2lvbi5FbnJvbGxtZW50UmVxdWVzdERldGFpbHMuTWVzc2FnZT9yLlNlc3Npb24uRW5yb2xsbWVudFJlcXVlc3REZXRhaWxzLk1lc3NhZ2U6ImVucm9sbFNwZWFrZXIgZmFpbGVkLiBVbmtub3duIGVucm9sbG1lbnQgc3RhdHVzIGhhcyBiZWVuIHJlY2VpdmVkIjt0LmdldExvZygpLmVycm9yKGMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIHU9dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5FTlJPTExfU1BFQUtFUl9GQUlMRUQsYyxyLlNlc3Npb24uRW5yb2xsbWVudFJlcXVlc3REZXRhaWxzLlN0YXR1cyk7cyh1KX19KSk7ZWxzZXt0LmdldExvZygpLmVycm9yKCJlbnJvbGxTcGVha2VyIHRpbWVvdXQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBjPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuRU5ST0xMX1NQRUFLRVJfVElNRU9VVCwiZW5yb2xsU3BlYWtlciB0aW1lb3V0Iik7cyhjKX19KCl9KSl9LGEucHJvdG90eXBlLmVucm9sbFNwZWFrZXI9ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJlbnJvbGxTcGVha2VyIGNhbGxlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dGhpcztyZXR1cm4gbi5jaGVja0NvbmZlcmVuY2VDYWxsKCksbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7bi5zeW5jU3BlYWtlcklkKCkudGhlbigoZnVuY3Rpb24oKXtuLmdldFNwZWFrZXJTdGF0dXMoKS50aGVuKChmdW5jdGlvbihpKXtpLlNwZWFrZXImJmkuU3BlYWtlci5TdGF0dXM9PXQuVm9pY2VJZFNwZWFrZXJTdGF0dXMuT1BURURfT1VUP24uZGVsZXRlU3BlYWtlcigpLnRoZW4oKGZ1bmN0aW9uKCl7bi5lbnJvbGxTcGVha2VySGVscGVyKHIsbyxlKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKTpuLmVucm9sbFNwZWFrZXJIZWxwZXIocixvLGUpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpfSxhLnByb3RvdHlwZS5lbnJvbGxTcGVha2VySGVscGVyPWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10aGlzLGk9dC5jb3JlLmdldENsaWVudCgpLHM9dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5jb250YWN0SWQpO28uZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihhKXtjb25zdCBjPXtTZXNzaW9uTmFtZU9ySWQ6cy5pbml0aWFsQ29udGFjdElkfHx0aGlzLmNvbnRhY3RJZCxEb21haW5JZDphfTt0LmdldExvZygpLmluZm8oImVucm9sbFNwZWFrZXJIZWxwZXIgY2FsbGVkIikud2l0aE9iamVjdChjKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkuY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5FTlJPTExfQllfU0VTU0lPTixjLHtzdWNjZXNzOmZ1bmN0aW9uKGkpe2kuU3RhdHVzPT09dC5Wb2ljZUlkRW5yb2xsbWVudFJlcXVlc3RTdGF0dXMuQ09NUExFVEVEPyh0LmdldExvZygpLmluZm8oImVucm9sbFNwZWFrZXIgc3VjY2VlZGVkIikud2l0aE9iamVjdChpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGUoaSkpOm8uY2hlY2tFbnJvbGxtZW50U3RhdHVzKHIpLnRoZW4oKGZ1bmN0aW9uKG4pe3QuZ2V0TG9nKCkuaW5mbygiZW5yb2xsU3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KG4pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksZShuKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7bihlKX0pKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJlbnJvbGxTcGVha2VyIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgcj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkVOUk9MTF9TUEVBS0VSX0ZBSUxFRCwiZW5yb2xsU3BlYWtlciBmYWlsZWQiLGUpO24ocil9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe24oZSl9KSl9LGEucHJvdG90eXBlLl91cGRhdGVTcGVha2VySWRJbkxjbXM9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzLG89dC5jb3JlLmdldENsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oaSxzKXtjb25zdCBhPXtDb250YWN0SWQ6ci5jb250YWN0SWQsSW5zdGFuY2VJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRJbnN0YW5jZUlkKCksQVdTQWNjb3VudElkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEFXU0FjY291bnRJZCgpLEN1c3RvbWVySWQ6dC5hc3NlcnROb3ROdWxsKGUsInNwZWFrZXJJZCIpLFZvaWNlSWRSZXN1bHQ6e2dlbmVyYXRlZFNwZWFrZXJJZDpufX07dC5nZXRMb2coKS5pbmZvKCJfdXBkYXRlU3BlYWtlcklkSW5MY21zIGNhbGxlZCIpLndpdGhPYmplY3QoYSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxvLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuVVBEQVRFX1ZPSUNFX0lEX0RBVEEsYSx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oInVwZGF0ZVNwZWFrZXJJZEluTGNtcyBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaShlKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJ1cGRhdGVTcGVha2VySWRJbkxjbXMgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuVVBEQVRFX1NQRUFLRVJfSURfSU5fTENNU19GQUlMRUQsInVwZGF0ZVNwZWFrZXJJZEluTGNtcyBmYWlsZWQiLGUpO3Mobil9fSl9KSl9LGEucHJvdG90eXBlLnVwZGF0ZVNwZWFrZXJJZEluVm9pY2VJZD1mdW5jdGlvbihlKXt2YXIgbj10aGlzO24uY2hlY2tDb25mZXJlbmNlQ2FsbCgpO3ZhciByPXQuY29yZS5nZXRDbGllbnQoKSxvPXQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGkscyl7bi5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGEpe2NvbnN0IGM9e1Nlc3Npb25OYW1lT3JJZDpvLmluaXRpYWxDb250YWN0SWR8fHRoaXMuY29udGFjdElkLFNwZWFrZXJJZDp0LmFzc2VydE5vdE51bGwoZSwic3BlYWtlcklkIiksRG9tYWluSWQ6YX07dC5nZXRMb2coKS5pbmZvKCJ1cGRhdGVTcGVha2VySWRJblZvaWNlSWQgY2FsbGVkIikud2l0aE9iamVjdChjKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIuY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5VUERBVEVfU0VTU0lPTixjLHtzdWNjZXNzOmZ1bmN0aW9uKHIpe3QuZ2V0TG9nKCkuaW5mbygidXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkIHN1Y2NlZWRlZCIpLndpdGhPYmplY3Qocikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbz1yJiZyLlNlc3Npb24mJnIuU2Vzc2lvbi5HZW5lcmF0ZWRTcGVha2VySWQ7bi5fdXBkYXRlU3BlYWtlcklkSW5MY21zKGUsbykudGhlbigoZnVuY3Rpb24oKXtpKHIpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtzKGUpfSkpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3ZhciBuO3N3aXRjaChKU09OLnBhcnNlKGUpLnN0YXR1cyl7Y2FzZSA0MDA6Y2FzZSA0MDQ6bj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLlNFU1NJT05fTk9UX0VYSVNUUywidXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkIGZhaWxlZCwgc2Vzc2lvbiBub3QgZXhpc3RzIixlKSx0LmdldExvZygpLmVycm9yKCJ1cGRhdGVTcGVha2VySWRJblZvaWNlSWQgZmFpbGVkLCBzZXNzaW9uIG5vdCBleGlzdHMiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7YnJlYWs7ZGVmYXVsdDpuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuVVBEQVRFX1NQRUFLRVJfSURfRkFJTEVELCJ1cGRhdGVTcGVha2VySWRJblZvaWNlSWQgZmFpbGVkIixlKSx0LmdldExvZygpLmVycm9yKCJ1cGRhdGVTcGVha2VySWRJblZvaWNlSWQgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfXMobil9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3MoZSl9KSl9KSl9LGEucHJvdG90eXBlLnN5bmNTcGVha2VySWQ9ZnVuY3Rpb24oKXt0LmdldExvZygpLmluZm8oInN5bmNTcGVha2VySWQgY2FsbGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgZT10aGlzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxuKXtlLmdldFNwZWFrZXJJZCgpLnRoZW4oKGZ1bmN0aW9uKHIpe2UudXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkKHIuc3BlYWtlcklkKS50aGVuKChmdW5jdGlvbihlKXt0KGUpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtuKGUpfSkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtuKGUpfSkpfSkpfSxhLnByb3RvdHlwZS5nZXREb21haW5JZD1mdW5jdGlvbigpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxuKXtpZigobmV3IHQuQWdlbnQpLmdldFBlcm1pc3Npb25zKCkuaW5jbHVkZXModC5BZ2VudFBlcm1pc3Npb25zLlZPSUNFX0lEKSlpZih0LmNvcmUudm9pY2VJZERvbWFpbklkKWUodC5jb3JlLnZvaWNlSWREb21haW5JZCk7ZWxzZXt2YXIgcj10LmNvcmUuZ2V0Q2xpZW50KCk7Y29uc3Qgbz17SW5zdGFuY2VJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRJbnN0YW5jZUlkKCksSW50ZWdyYXRpb25UeXBlOiJWT0lDRV9JRCJ9O3QuZ2V0TG9nKCkuaW5mbygiZ2V0RG9tYWluSWQgY2FsbGVkIikud2l0aE9iamVjdChvKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIuY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5MSVNUX0lOVEVHUkFUSU9OX0FTU09DSUFUSU9OUyxvLHtzdWNjZXNzOmZ1bmN0aW9uKHIpe3RyeXt2YXIgbztpZihyLkludGVncmF0aW9uQXNzb2NpYXRpb25TdW1tYXJ5TGlzdC5sZW5ndGg+PTEmJihvPXIuSW50ZWdyYXRpb25Bc3NvY2lhdGlvblN1bW1hcnlMaXN0WzBdLkludGVncmF0aW9uQXJuLnJlcGxhY2UoL14uKmRvbWFpblwvL2ksIiIpKSwhbyl7dC5nZXRMb2coKS5pbmZvKCJnZXREb21haW5JZDogbm8gZG9tYWluSWQgZm91bmQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBpPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuTk9fRE9NQUlOX0lEX0ZPVU5EKTtyZXR1cm4gdm9pZCBuKGkpfXQuZ2V0TG9nKCkuaW5mbygiZ2V0RG9tYWluSWQgc3VjY2VlZGVkIikud2l0aE9iamVjdChyKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuVm9pY2VJZEV2ZW50cy5VUERBVEVfRE9NQUlOX0lELGRhdGE6e2RvbWFpbklkOm99fSksZShvKX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJnZXREb21haW5JZCBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaT10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkdFVF9ET01BSU5fSURfRkFJTEVELCJnZXREb21haW5JZCBmYWlsZWQiLGUpLG4oaSl9fSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoImdldERvbWFpbklkIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgcj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkdFVF9ET01BSU5fSURfRkFJTEVELCJnZXREb21haW5JZCBmYWlsZWQiLGUpO24ocil9fSl9ZWxzZSBuKG5ldyBFcnJvcigiQWdlbnQgZG9lc24ndCBoYXZlIHRoZSBwZXJtaXNzaW9uIGZvciBWb2ljZSBJRCIpKX0pKX0sYS5wcm90b3R5cGUuY2hlY2tDb25mZXJlbmNlQ2FsbD1mdW5jdGlvbigpe2lmKHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKS5jb25uZWN0aW9ucy5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiB0LmNvbnRhaW5zKHQuQ09OTkVDVElPTl9BQ1RJVkVfU1RBVEVTLGUuc3RhdGUudHlwZSl9KSkubGVuZ3RoPjIpdGhyb3cgbmV3IHQuTm90SW1wbGVtZW50ZWRFcnJvcigiVm9pY2VJZCBpcyBub3Qgc3VwcG9ydGVkIGZvciBjb25mZXJlbmNlIGNhbGxzIil9LGEucHJvdG90eXBlLmlzQXV0aEVuYWJsZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT10LkNvbnRhY3RGbG93QXV0aGVudGljYXRpb25EZWNpc2lvbi5OT1RfRU5BQkxFRH0sYS5wcm90b3R5cGUuaXNBdXRoUmVzdWx0Tm90RW5vdWdoU3BlZWNoPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dC5Wb2ljZUlkQXV0aGVudGljYXRpb25EZWNpc2lvbi5OT1RfRU5PVUdIX1NQRUVDSH0sYS5wcm90b3R5cGUuaXNBdXRoUmVzdWx0SW5jb25jbHVzaXZlPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uSU5DT05DTFVTSVZFfSxhLnByb3RvdHlwZS5pc0ZyYXVkRW5hYmxlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSE9PXQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uLk5PVF9FTkFCTEVEfSxhLnByb3RvdHlwZS5pc0ZyYXVkUmVzdWx0Tm90RW5vdWdoU3BlZWNoPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dC5Wb2ljZUlkRnJhdWREZXRlY3Rpb25EZWNpc2lvbi5OT1RfRU5PVUdIX1NQRUVDSH0sYS5wcm90b3R5cGUuaXNGcmF1ZFJlc3VsdEluY29uY2x1c2l2ZT1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uLklOQ09OQ0xVU0lWRX07dmFyIGM9ZnVuY3Rpb24oZSx0KXt0aGlzLl9zcGVha2VyQXV0aGVudGljYXRvcj1uZXcgYShlKSxzLmNhbGwodGhpcyxlLHQpfTsoYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWMsYy5wcm90b3R5cGUuZ2V0U29mdHBob25lTWVkaWFJbmZvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zb2Z0cGhvbmVNZWRpYUluZm99LGMucHJvdG90eXBlLmdldE1lZGlhSW5mbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuc29mdHBob25lTWVkaWFJbmZvfSxjLnByb3RvdHlwZS5nZXRNZWRpYVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdC5NZWRpYVR5cGUuU09GVFBIT05FfSxjLnByb3RvdHlwZS5nZXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLm1lZGlhRmFjdG9yeS5nZXQodGhpcyl9LGMucHJvdG90eXBlLmdldFZvaWNlSWRTcGVha2VySWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3BlYWtlckF1dGhlbnRpY2F0b3IuZ2V0U3BlYWtlcklkKCl9LGMucHJvdG90eXBlLmdldFZvaWNlSWRTcGVha2VyU3RhdHVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yLmdldFNwZWFrZXJTdGF0dXMoKX0sYy5wcm90b3R5cGUub3B0T3V0Vm9pY2VJZFNwZWFrZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3BlYWtlckF1dGhlbnRpY2F0b3Iub3B0T3V0U3BlYWtlcigpfSxjLnByb3RvdHlwZS5kZWxldGVWb2ljZUlkU3BlYWtlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zcGVha2VyQXV0aGVudGljYXRvci5kZWxldGVTcGVha2VyKCl9LGMucHJvdG90eXBlLmV2YWx1YXRlU3BlYWtlcldpdGhWb2ljZUlkPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9zcGVha2VyQXV0aGVudGljYXRvci5ldmFsdWF0ZVNwZWFrZXIoZSl9LGMucHJvdG90eXBlLmVucm9sbFNwZWFrZXJJblZvaWNlSWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yLmVucm9sbFNwZWFrZXIoZSl9LGMucHJvdG90eXBlLnVwZGF0ZVZvaWNlSWRTcGVha2VySWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yLnVwZGF0ZVNwZWFrZXJJZEluVm9pY2VJZChlKX0sYy5wcm90b3R5cGUuZ2V0UXVpY2tDb25uZWN0TmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkucXVpY2tDb25uZWN0TmFtZX0sYy5wcm90b3R5cGUuaXNTaWxlbnRNb25pdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TW9uaXRvclN0YXR1cygpPT09dC5Nb25pdG9yaW5nTW9kZS5TSUxFTlRfTU9OSVRPUn0sYy5wcm90b3R5cGUuaXNCYXJnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE1vbml0b3JTdGF0dXMoKT09PXQuTW9uaXRvcmluZ01vZGUuQkFSR0V9LGMucHJvdG90eXBlLmlzQmFyZ2VFbmFibGVkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRNb25pdG9yQ2FwYWJpbGl0aWVzKCk7cmV0dXJuIGUmJmUuaW5jbHVkZXModC5Nb25pdG9yaW5nTW9kZS5CQVJHRSl9LGMucHJvdG90eXBlLmlzU2lsZW50TW9uaXRvckVuYWJsZWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldE1vbml0b3JDYXBhYmlsaXRpZXMoKTtyZXR1cm4gZSYmZS5pbmNsdWRlcyh0Lk1vbml0b3JpbmdNb2RlLlNJTEVOVF9NT05JVE9SKX0sYy5wcm90b3R5cGUuZ2V0TW9uaXRvckNhcGFiaWxpdGllcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkubW9uaXRvckNhcGFiaWxpdGllc30sYy5wcm90b3R5cGUuZ2V0TW9uaXRvclN0YXR1cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkubW9uaXRvclN0YXR1c30sYy5wcm90b3R5cGUuaXNNdXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5tdXRlfSxjLnByb3RvdHlwZS5pc0ZvcmNlZE11dGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmZvcmNlZE11dGV9LGMucHJvdG90eXBlLm11dGVQYXJ0aWNpcGFudD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuTVVURV9QQVJUSUNJUEFOVCx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY29ubmVjdGlvbklkOnRoaXMuZ2V0Q29ubmVjdGlvbklkKCl9LGUpfSxjLnByb3RvdHlwZS51bm11dGVQYXJ0aWNpcGFudD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuVU5NVVRFX1BBUlRJQ0lQQU5ULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjb25uZWN0aW9uSWQ6dGhpcy5nZXRDb25uZWN0aW9uSWQoKX0sZSl9LGMucHJvdG90eXBlLmNhblNlbmRWaWRlbz1mdW5jdGlvbigpe2NvbnN0IGU9dGhpcy5nZXRDYXBhYmlsaXRpZXMoKTtyZXR1cm4gZSYmZS5WaWRlbz09PXQuVmlkZW9DYXBhYmlsaXR5LlNFTkR9LGMucHJvdG90eXBlLmdldENhcGFiaWxpdGllcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuY2FwYWJpbGl0aWVzfSxjLnByb3RvdHlwZS5nZXRWaWRlb0Nvbm5lY3Rpb25JbmZvPWZ1bmN0aW9uKCl7Y29uc3QgZT10LmNvcmUuZ2V0Q2xpZW50KCksbj17dHJhbnNwb3J0VHlwZTp0LlRSQU5TUE9SVF9UWVBFUy5XRUJfUlRDLGNvbnRhY3RJZDp0aGlzLmNvbnRhY3RJZH07cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe2UuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX1RSQU5TUE9SVCxuLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiZ2V0VmlkZW9Db25uZWN0aW9uSW5mbyBzdWNjZWVkZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoZS53ZWJSVENUcmFuc3BvcnQpfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiZ2V0VmlkZW9Db25uZWN0aW9uSW5mbyBmYWlsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjplLGRhdGE6bn0pLG8oRXJyb3IoImdldFZpZGVvQ29ubmVjdGlvbkluZm8gZmFpbGVkIikpfX0pfSkpfTt2YXIgdT1mdW5jdGlvbihlLHQpe3MuY2FsbCh0aGlzLGUsdCl9Oyh1LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHMucHJvdG90eXBlKSkuY29uc3RydWN0b3I9dSx1LnByb3RvdHlwZS5nZXRNZWRpYUluZm89ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9nZXREYXRhKCkuY2hhdE1lZGlhSW5mbztpZihlKXt2YXIgbj10LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb250YWN0RGF0YSh0aGlzLmNvbnRhY3RJZCkscj17Y29udGFjdElkOnRoaXMuY29udGFjdElkLGluaXRpYWxDb250YWN0SWQ6bi5pbml0aWFsQ29udGFjdElkfHx0aGlzLmNvbnRhY3RJZCxwYXJ0aWNpcGFudElkOnRoaXMuY29ubmVjdGlvbklkLGdldENvbm5lY3Rpb25Ub2tlbjp0LmhpdGNoKHRoaXMsdGhpcy5nZXRDb25uZWN0aW9uVG9rZW4pfTtpZihlLmNvbm5lY3Rpb25EYXRhKXRyeXtyLnBhcnRpY2lwYW50VG9rZW49SlNPTi5wYXJzZShlLmNvbm5lY3Rpb25EYXRhKS5Db25uZWN0aW9uQXV0aGVudGljYXRpb25Ub2tlbn1jYXRjaChuKXt0LmdldExvZygpLmVycm9yKHQuTG9nQ29tcG9uZW50LkNIQVQsIkNvbm5lY3Rpb24gZGF0YSBpcyBpbnZhbGlkIikud2l0aE9iamVjdChlKS53aXRoRXhjZXB0aW9uKG4pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5wYXJ0aWNpcGFudFRva2VuPW51bGx9cmV0dXJuIHIucGFydGljaXBhbnRUb2tlbj1yLnBhcnRpY2lwYW50VG9rZW58fG51bGwsci5vcmlnaW5hbEluZm89dGhpcy5fZ2V0RGF0YSgpLmNoYXRNZWRpYUluZm8scn1yZXR1cm4gbnVsbH0sdS5wcm90b3R5cGUuZ2V0Q29ubmVjdGlvblRva2VuPWZ1bmN0aW9uKCl7dmFyIGU9dC5jb3JlLmdldENsaWVudCgpLG49KHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKSx7dHJhbnNwb3J0VHlwZTp0LlRSQU5TUE9SVF9UWVBFUy5DSEFUX1RPS0VOLHBhcnRpY2lwYW50SWQ6dGhpcy5jb25uZWN0aW9uSWQsY29udGFjdElkOnRoaXMuY29udGFjdElkfSk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe2UuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX1RSQU5TUE9SVCxuLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiZ2V0Q29ubmVjdGlvblRva2VuIHN1Y2NlZWRlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihlKX0sZmFpbHVyZTpmdW5jdGlvbihlLG4pe3QuZ2V0TG9nKCkuZXJyb3IoImdldENvbm5lY3Rpb25Ub2tlbiBmYWlsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjplLGRhdGE6bn0pLG8oRXJyb3IoImdldENvbm5lY3Rpb25Ub2tlbiBmYWlsZWQiKSl9fSl9KSl9LHUucHJvdG90eXBlLmdldE1lZGlhVHlwZT1mdW5jdGlvbigpe3JldHVybiB0Lk1lZGlhVHlwZS5DSEFUfSx1LnByb3RvdHlwZS5nZXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLm1lZGlhRmFjdG9yeS5nZXQodGhpcyl9LHUucHJvdG90eXBlLl9pbml0TWVkaWFDb250cm9sbGVyPWZ1bmN0aW9uKCl7dGhpcy5faXNBZ2VudENvbm5lY3Rpb25UeXBlKCkmJnQuY29yZS5tZWRpYUZhY3RvcnkuZ2V0KHRoaXMpLmNhdGNoKChmdW5jdGlvbigpe30pKX0sdS5wcm90b3R5cGUuaXNCYXJnZUVuYWJsZWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldE1vbml0b3JDYXBhYmlsaXRpZXMoKTtyZXR1cm4gZSYmZS5pbmNsdWRlcyh0Lk1vbml0b3JpbmdNb2RlLkJBUkdFKX0sdS5wcm90b3R5cGUuaXNTaWxlbnRNb25pdG9yRW5hYmxlZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0TW9uaXRvckNhcGFiaWxpdGllcygpO3JldHVybiBlJiZlLmluY2x1ZGVzKHQuTW9uaXRvcmluZ01vZGUuU0lMRU5UX01PTklUT1IpfSx1LnByb3RvdHlwZS5nZXRNb25pdG9yQ2FwYWJpbGl0aWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5tb25pdG9yQ2FwYWJpbGl0aWVzfSx1LnByb3RvdHlwZS5pc0JhcmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TW9uaXRvclN0YXR1cygpPT09dC5Nb25pdG9yaW5nTW9kZS5CQVJHRX0sdS5wcm90b3R5cGUuaXNTaWxlbnRNb25pdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TW9uaXRvclN0YXR1cygpPT09dC5Nb25pdG9yaW5nTW9kZS5TSUxFTlRfTU9OSVRPUn0sdS5wcm90b3R5cGUuZ2V0TW9uaXRvclN0YXR1cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkubW9uaXRvclN0YXR1c307dmFyIGw9ZnVuY3Rpb24oZSx0KXtzLmNhbGwodGhpcyxlLHQpfTsobC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWwsbC5wcm90b3R5cGUuZ2V0TWVkaWFUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuTWVkaWFUeXBlLlRBU0t9LGwucHJvdG90eXBlLmdldE1lZGlhSW5mbz1mdW5jdGlvbigpe3ZhciBlPXQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKTtyZXR1cm57Y29udGFjdElkOnRoaXMuY29udGFjdElkLGluaXRpYWxDb250YWN0SWQ6ZS5pbml0aWFsQ29udGFjdElkfHx0aGlzLmNvbnRhY3RJZH19LGwucHJvdG90eXBlLmdldE1lZGlhQ29udHJvbGxlcj1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUubWVkaWFGYWN0b3J5LmdldCh0aGlzKX07dmFyIHA9ZnVuY3Rpb24oZSl7dC5Db25uZWN0aW9uLmNhbGwodGhpcyxlLmNvbnRhY3RJZCxlLmNvbm5lY3Rpb25JZCksdGhpcy5jb25uZWN0aW9uRGF0YT1lfTsocC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXAscC5wcm90b3R5cGUuX2dldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25uZWN0aW9uRGF0YX0scC5wcm90b3R5cGUuX2luaXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oKXt9O3ZhciBkPWZ1bmN0aW9uKGUpe3ZhciB0PWV8fHt9O3RoaXMuZW5kcG9pbnRBUk49dC5lbmRwb2ludElkfHx0LmVuZHBvaW50QVJOfHxudWxsLHRoaXMuZW5kcG9pbnRJZD10aGlzLmVuZHBvaW50QVJOLHRoaXMudHlwZT10LnR5cGV8fG51bGwsdGhpcy5uYW1lPXQubmFtZXx8bnVsbCx0aGlzLnBob25lTnVtYmVyPXQucGhvbmVOdW1iZXJ8fG51bGwsdGhpcy5hZ2VudExvZ2luPXQuYWdlbnRMb2dpbnx8bnVsbCx0aGlzLnF1ZXVlPXQucXVldWV8fG51bGx9O2QucHJvdG90eXBlLnN0cmlwUGhvbmVOdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5waG9uZU51bWJlcj90aGlzLnBob25lTnVtYmVyLnJlcGxhY2UoL3NpcDooW15AXSopQC4qLywiJDEiKToiIn0sZC5ieVBob25lTnVtYmVyPWZ1bmN0aW9uKGUsbil7cmV0dXJuIG5ldyBkKHt0eXBlOnQuRW5kcG9pbnRUeXBlLlBIT05FX05VTUJFUixwaG9uZU51bWJlcjplLG5hbWU6bnx8bnVsbH0pfTt2YXIgaD1mdW5jdGlvbihlLHQsbil7dGhpcy5lcnJvclR5cGU9ZSx0aGlzLmVycm9yTWVzc2FnZT10LHRoaXMuZW5kUG9pbnRVcmw9bn07aC5wcm90b3R5cGUuZ2V0RXJyb3JUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JUeXBlfSxoLnByb3RvdHlwZS5nZXRFcnJvck1lc3NhZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvck1lc3NhZ2V9LGgucHJvdG90eXBlLmdldEVuZFBvaW50VXJsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5kUG9pbnRVcmx9LHQuYWdlbnQ9ZnVuY3Rpb24oZSl7dmFyIG49dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuSU5JVCxlKTtyZXR1cm4gdC5hZ2VudC5pbml0aWFsaXplZCYmZShuZXcgdC5BZ2VudCksbn0sdC5hZ2VudC5pbml0aWFsaXplZD0hMSx0LmNvbnRhY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbnRhY3RFdmVudHMuSU5JVCxlKX0sdC5vbldlYnNvY2tldEluaXRGYWlsdXJlPWZ1bmN0aW9uKGUpe3ZhciBuPXQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LldlYlNvY2tldEV2ZW50cy5JTklUX0ZBSUxVUkUsZSk7cmV0dXJuIHQud2ViU29ja2V0SW5pdEZhaWxlZCYmZSgpLG59LHQuaWZNYXN0ZXI9ZnVuY3Rpb24oZSxuLHIsbyl7aWYodC5hc3NlcnROb3ROdWxsKGUsIkEgdG9waWMgbXVzdCBiZSBwcm92aWRlZC4iKSx0LmFzc2VydE5vdE51bGwobiwiQSB0cnVlIGNhbGxiYWNrIG11c3QgYmUgcHJvdmlkZWQuIiksIXQuY29yZS5tYXN0ZXJDbGllbnQpcmV0dXJuIHQuZ2V0TG9nKCkud2FybigiV2UgY2FuJ3QgYmUgdGhlIG1hc3RlciBmb3IgdG9waWMgJyVzJyBiZWNhdXNlIHRoZXJlIGlzIG5vIG1hc3RlciBjbGllbnQhIixlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHZvaWQociYmcigpKTt0LmNvcmUuZ2V0TWFzdGVyQ2xpZW50KCkuY2FsbCh0Lk1hc3Rlck1ldGhvZHMuQ0hFQ0tfTUFTVEVSLHt0b3BpYzplLHNob3VsZE5vdEJlY29tZU1hc3RlcklmTm9uZTpvfSx7c3VjY2VzczpmdW5jdGlvbihlKXtlLmlzTWFzdGVyP24oKTpyJiZyKCl9fSl9LHQuYmVjb21lTWFzdGVyPWZ1bmN0aW9uKGUsbixyKXt0LmFzc2VydE5vdE51bGwoZSwiQSB0b3BpYyBtdXN0IGJlIHByb3ZpZGVkLiIpLHQuY29yZS5tYXN0ZXJDbGllbnQ/dC5jb3JlLmdldE1hc3RlckNsaWVudCgpLmNhbGwodC5NYXN0ZXJNZXRob2RzLkJFQ09NRV9NQVNURVIse3RvcGljOmV9LHtzdWNjZXNzOmZ1bmN0aW9uKCl7biYmbigpfX0pOih0LmdldExvZygpLndhcm4oIldlIGNhbid0IGJlIHRoZSBtYXN0ZXIgZm9yIHRvcGljICclcycgYmVjYXVzZSB0aGVyZSBpcyBubyBtYXN0ZXIgY2xpZW50ISIsZSksciYmcigpKX0sdC5BZ2VudD1uLHQuQWdlbnRTbmFwc2hvdD1yLHQuQ29udGFjdD1vLHQuQ29udGFjdFNuYXBzaG90PWksdC5Db25uZWN0aW9uPWMsdC5CYXNlQ29ubmVjdGlvbj1zLHQuVm9pY2VDb25uZWN0aW9uPWMsdC5DaGF0Q29ubmVjdGlvbj11LHQuVGFza0Nvbm5lY3Rpb249bCx0LkNvbm5lY3Rpb25TbmFwc2hvdD1wLHQuRW5kcG9pbnQ9ZCx0LkFkZHJlc3M9ZCx0LlNvZnRwaG9uZUVycm9yPWgsdC5Wb2ljZUlkPWEsdC5RdWlja1Jlc3BvbnNlcz1jbGFzc3tzdGF0aWMgaXNFbmFibGVkPWZ1bmN0aW9uKCl7Y29uc3QgZT10LmlzQ1JNKCk/dC5jb3JlLmdldENsaWVudCgpOnQuY29yZS5nZXRBcGlQcm94eUNsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obixyKXtlLmNhbGwodC5BcGlQcm94eUNsaWVudE1ldGhvZHMuUVJfSU5URUdSQVRJT05fRVhJU1RTLG51bGwse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJRdWljayBSZXNwb25zZXMgaXNFbmFibGVkIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIlF1aWNrIFJlc3BvbnNlcyBpc0VuYWJsZWQgZmFpbGVkIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoZSl9fSl9KSl9O3N0YXRpYyBzZWFyY2hRdWlja1Jlc3BvbnNlcz1mdW5jdGlvbihlKXtjb25zdCBuPXQuaXNDUk0oKT90LmNvcmUuZ2V0Q2xpZW50KCk6dC5jb3JlLmdldEFwaVByb3h5Q2xpZW50KCkscj1lPy5jb250YWN0SWQ/bmV3IG8oZS5jb250YWN0SWQpLmdldEF0dHJpYnV0ZXMoKTp2b2lkIDA7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGkpe24uY2FsbCh0LkFwaVByb3h5Q2xpZW50TWV0aG9kcy5RUl9TRUFSQ0hfUVVJQ0tfUkVTUE9OU0VTLHsuLi5lLGF0dHJpYnV0ZXM6cn0se3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJzZWFyY2hRdWlja1Jlc3BvbnNlcyBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbyhlKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJzZWFyY2hRdWlja1Jlc3BvbnNlcyBmYWlsZWQiKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaShlKX19KX0pKX19fSgpfSw4Mjc6KGUsdCxuKT0+e3ZhciByOyFmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBvKHMsYSl7aWYoIW5bc10pe2lmKCF0W3NdKXtpZihpKXJldHVybiBpKHMsITApO3ZhciBjPW5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK3MrIiciKTt0aHJvdyBjLmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLGN9dmFyIHU9bltzXT17ZXhwb3J0czp7fX07dFtzXVswXS5jYWxsKHUuZXhwb3J0cywoZnVuY3Rpb24oZSl7cmV0dXJuIG8odFtzXVsxXVtlXXx8ZSl9KSx1LHUuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltzXS5leHBvcnRzfWZvcih2YXIgaT12b2lkIDAscz0wO3M8ci5sZW5ndGg7cysrKW8ocltzXSk7cmV0dXJuIG99KHsxOltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXt2ZXJzaW9uOiIyLjAiLG1ldGFkYXRhOnthcGlWZXJzaW9uOiIyMDE0LTA2LTMwIixlbmRwb2ludFByZWZpeDoiY29nbml0by1pZGVudGl0eSIsanNvblZlcnNpb246IjEuMSIscHJvdG9jb2w6Impzb24iLHNlcnZpY2VGdWxsTmFtZToiQW1hem9uIENvZ25pdG8gSWRlbnRpdHkiLHNlcnZpY2VJZDoiQ29nbml0byBJZGVudGl0eSIsc2lnbmF0dXJlVmVyc2lvbjoidjQiLHRhcmdldFByZWZpeDoiQVdTQ29nbml0b0lkZW50aXR5U2VydmljZSIsdWlkOiJjb2duaXRvLWlkZW50aXR5LTIwMTQtMDYtMzAifSxvcGVyYXRpb25zOntDcmVhdGVJZGVudGl0eVBvb2w6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlQb29sTmFtZSIsIkFsbG93VW5hdXRoZW50aWNhdGVkSWRlbnRpdGllcyJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbE5hbWU6e30sQWxsb3dVbmF1dGhlbnRpY2F0ZWRJZGVudGl0aWVzOnt0eXBlOiJib29sZWFuIn0sQWxsb3dDbGFzc2ljRmxvdzp7dHlwZToiYm9vbGVhbiJ9LFN1cHBvcnRlZExvZ2luUHJvdmlkZXJzOntzaGFwZToiUzUifSxEZXZlbG9wZXJQcm92aWRlck5hbWU6e30sT3BlbklkQ29ubmVjdFByb3ZpZGVyQVJOczp7c2hhcGU6IlM5In0sQ29nbml0b0lkZW50aXR5UHJvdmlkZXJzOntzaGFwZToiU2IifSxTYW1sUHJvdmlkZXJBUk5zOntzaGFwZToiU2cifSxJZGVudGl0eVBvb2xUYWdzOntzaGFwZToiU2gifX19LG91dHB1dDp7c2hhcGU6IlNrIn19LERlbGV0ZUlkZW50aXRpZXM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlJZHNUb0RlbGV0ZSJdLG1lbWJlcnM6e0lkZW50aXR5SWRzVG9EZWxldGU6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7VW5wcm9jZXNzZWRJZGVudGl0eUlkczp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sRXJyb3JDb2RlOnt9fX19fX19LERlbGV0ZUlkZW50aXR5UG9vbDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9fX19LERlc2NyaWJlSWRlbnRpdHk6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlJZCJdLG1lbWJlcnM6e0lkZW50aXR5SWQ6e319fSxvdXRwdXQ6e3NoYXBlOiJTdiJ9fSxEZXNjcmliZUlkZW50aXR5UG9vbDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9fX0sb3V0cHV0OntzaGFwZToiU2sifX0sR2V0Q3JlZGVudGlhbHNGb3JJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eUlkIl0sbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxMb2dpbnM6e3NoYXBlOiJTMTAifSxDdXN0b21Sb2xlQXJuOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sQ3JlZGVudGlhbHM6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7QWNjZXNzS2V5SWQ6e30sU2VjcmV0S2V5Ont9LFNlc3Npb25Ub2tlbjp7fSxFeHBpcmF0aW9uOnt0eXBlOiJ0aW1lc3RhbXAifX19fX0sYXV0aHR5cGU6Im5vbmUifSxHZXRJZDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCJdLG1lbWJlcnM6e0FjY291bnRJZDp7fSxJZGVudGl0eVBvb2xJZDp7fSxMb2dpbnM6e3NoYXBlOiJTMTAifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9fX0sYXV0aHR5cGU6Im5vbmUifSxHZXRJZGVudGl0eVBvb2xSb2xlczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LFJvbGVzOntzaGFwZToiUzFjIn0sUm9sZU1hcHBpbmdzOntzaGFwZToiUzFlIn19fX0sR2V0T3BlbklkVG9rZW46e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlJZCJdLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sTG9naW5zOntzaGFwZToiUzEwIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxUb2tlbjp7fX19LGF1dGh0eXBlOiJub25lIn0sR2V0T3BlbklkVG9rZW5Gb3JEZXZlbG9wZXJJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIkxvZ2lucyJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXR5SWQ6e30sTG9naW5zOntzaGFwZToiUzEwIn0sUHJpbmNpcGFsVGFnczp7c2hhcGU6IlMxcyJ9LFRva2VuRHVyYXRpb246e3R5cGU6ImxvbmcifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9LFRva2VuOnt9fX19LEdldFByaW5jaXBhbFRhZ0F0dHJpYnV0ZU1hcDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIklkZW50aXR5UHJvdmlkZXJOYW1lIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQcm92aWRlck5hbWU6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQcm92aWRlck5hbWU6e30sVXNlRGVmYXVsdHM6e3R5cGU6ImJvb2xlYW4ifSxQcmluY2lwYWxUYWdzOntzaGFwZToiUzFzIn19fX0sTGlzdElkZW50aXRpZXM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlQb29sSWQiLCJNYXhSZXN1bHRzIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sTWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9LE5leHRUb2tlbjp7fSxIaWRlRGlzYWJsZWQ6e3R5cGU6ImJvb2xlYW4ifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxJZGVudGl0aWVzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3NoYXBlOiJTdiJ9fSxOZXh0VG9rZW46e319fX0sTGlzdElkZW50aXR5UG9vbHM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiTWF4UmVzdWx0cyJdLG1lbWJlcnM6e01heFJlc3VsdHM6e3R5cGU6ImludGVnZXIifSxOZXh0VG9rZW46e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlQb29sczp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXR5UG9vbE5hbWU6e319fX0sTmV4dFRva2VuOnt9fX19LExpc3RUYWdzRm9yUmVzb3VyY2U6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUmVzb3VyY2VBcm4iXSxtZW1iZXJzOntSZXNvdXJjZUFybjp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntUYWdzOntzaGFwZToiU2gifX19fSxMb29rdXBEZXZlbG9wZXJJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXR5SWQ6e30sRGV2ZWxvcGVyVXNlcklkZW50aWZpZXI6e30sTWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9LE5leHRUb2tlbjp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9LERldmVsb3BlclVzZXJJZGVudGlmaWVyTGlzdDp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxOZXh0VG9rZW46e319fX0sTWVyZ2VEZXZlbG9wZXJJZGVudGl0aWVzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIlNvdXJjZVVzZXJJZGVudGlmaWVyIiwiRGVzdGluYXRpb25Vc2VySWRlbnRpZmllciIsIkRldmVsb3BlclByb3ZpZGVyTmFtZSIsIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7U291cmNlVXNlcklkZW50aWZpZXI6e30sRGVzdGluYXRpb25Vc2VySWRlbnRpZmllcjp7fSxEZXZlbG9wZXJQcm92aWRlck5hbWU6e30sSWRlbnRpdHlQb29sSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlJZDp7fX19fSxTZXRJZGVudGl0eVBvb2xSb2xlczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIlJvbGVzIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sUm9sZXM6e3NoYXBlOiJTMWMifSxSb2xlTWFwcGluZ3M6e3NoYXBlOiJTMWUifX19fSxTZXRQcmluY2lwYWxUYWdBdHRyaWJ1dGVNYXA6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlQb29sSWQiLCJJZGVudGl0eVByb3ZpZGVyTmFtZSJdLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXR5UHJvdmlkZXJOYW1lOnt9LFVzZURlZmF1bHRzOnt0eXBlOiJib29sZWFuIn0sUHJpbmNpcGFsVGFnczp7c2hhcGU6IlMxcyJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXR5UHJvdmlkZXJOYW1lOnt9LFVzZURlZmF1bHRzOnt0eXBlOiJib29sZWFuIn0sUHJpbmNpcGFsVGFnczp7c2hhcGU6IlMxcyJ9fX19LFRhZ1Jlc291cmNlOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIlJlc291cmNlQXJuIiwiVGFncyJdLG1lbWJlcnM6e1Jlc291cmNlQXJuOnt9LFRhZ3M6e3NoYXBlOiJTaCJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxVbmxpbmtEZXZlbG9wZXJJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eUlkIiwiSWRlbnRpdHlQb29sSWQiLCJEZXZlbG9wZXJQcm92aWRlck5hbWUiLCJEZXZlbG9wZXJVc2VySWRlbnRpZmllciJdLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sSWRlbnRpdHlQb29sSWQ6e30sRGV2ZWxvcGVyUHJvdmlkZXJOYW1lOnt9LERldmVsb3BlclVzZXJJZGVudGlmaWVyOnt9fX19LFVubGlua0lkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5SWQiLCJMb2dpbnMiLCJMb2dpbnNUb1JlbW92ZSJdLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sTG9naW5zOntzaGFwZToiUzEwIn0sTG9naW5zVG9SZW1vdmU6e3NoYXBlOiJTdyJ9fX0sYXV0aHR5cGU6Im5vbmUifSxVbnRhZ1Jlc291cmNlOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIlJlc291cmNlQXJuIiwiVGFnS2V5cyJdLG1lbWJlcnM6e1Jlc291cmNlQXJuOnt9LFRhZ0tleXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFVwZGF0ZUlkZW50aXR5UG9vbDp7aW5wdXQ6e3NoYXBlOiJTayJ9LG91dHB1dDp7c2hhcGU6IlNrIn19fSxzaGFwZXM6e1M1Ont0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7fX0sUzk6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX0sU2I6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntQcm92aWRlck5hbWU6e30sQ2xpZW50SWQ6e30sU2VydmVyU2lkZVRva2VuQ2hlY2s6e3R5cGU6ImJvb2xlYW4ifX19fSxTZzp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxTaDp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e319LFNrOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlQb29sSWQiLCJJZGVudGl0eVBvb2xOYW1lIiwiQWxsb3dVbmF1dGhlbnRpY2F0ZWRJZGVudGl0aWVzIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQb29sTmFtZTp7fSxBbGxvd1VuYXV0aGVudGljYXRlZElkZW50aXRpZXM6e3R5cGU6ImJvb2xlYW4ifSxBbGxvd0NsYXNzaWNGbG93Ont0eXBlOiJib29sZWFuIn0sU3VwcG9ydGVkTG9naW5Qcm92aWRlcnM6e3NoYXBlOiJTNSJ9LERldmVsb3BlclByb3ZpZGVyTmFtZTp7fSxPcGVuSWRDb25uZWN0UHJvdmlkZXJBUk5zOntzaGFwZToiUzkifSxDb2duaXRvSWRlbnRpdHlQcm92aWRlcnM6e3NoYXBlOiJTYiJ9LFNhbWxQcm92aWRlckFSTnM6e3NoYXBlOiJTZyJ9LElkZW50aXR5UG9vbFRhZ3M6e3NoYXBlOiJTaCJ9fX0sU3Y6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxMb2dpbnM6e3NoYXBlOiJTdyJ9LENyZWF0aW9uRGF0ZTp7dHlwZToidGltZXN0YW1wIn0sTGFzdE1vZGlmaWVkRGF0ZTp7dHlwZToidGltZXN0YW1wIn19fSxTdzp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxTMTA6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt9fSxTMWM6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt9fSxTMWU6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiVHlwZSJdLG1lbWJlcnM6e1R5cGU6e30sQW1iaWd1b3VzUm9sZVJlc29sdXRpb246e30sUnVsZXNDb25maWd1cmF0aW9uOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUnVsZXMiXSxtZW1iZXJzOntSdWxlczp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiQ2xhaW0iLCJNYXRjaFR5cGUiLCJWYWx1ZSIsIlJvbGVBUk4iXSxtZW1iZXJzOntDbGFpbTp7fSxNYXRjaFR5cGU6e30sVmFsdWU6e30sUm9sZUFSTjp7fX19fX19fX19LFMxczp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e319fX19LHt9XSwyOltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXtwYWdpbmF0aW9uOntMaXN0SWRlbnRpdHlQb29sczp7aW5wdXRfdG9rZW46Ik5leHRUb2tlbiIsbGltaXRfa2V5OiJNYXhSZXN1bHRzIixvdXRwdXRfdG9rZW46Ik5leHRUb2tlbiIscmVzdWx0X2tleToiSWRlbnRpdHlQb29scyJ9fX19LHt9XSwzOltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXt2ZXJzaW9uOiIyLjAiLG1ldGFkYXRhOnthcGlWZXJzaW9uOiIyMDE3LTAyLTE1IixlbmRwb2ludFByZWZpeDoiY29ubmVjdCIsanNvblZlcnNpb246IjEuMCIscHJvdG9jb2w6Impzb24iLHNlcnZpY2VBYmJyZXZpYXRpb246IkNvbm5lY3QiLHNlcnZpY2VGdWxsTmFtZToiQW1hem9uQ29ubmVjdENUSVNlcnZpY2UiLHNpZ25hdHVyZVZlcnNpb246IiIsdGFyZ2V0UHJlZml4OiJBbWF6b25Db25uZWN0Q1RJU2VydmljZSIsdWlkOiJjb25uZWN0LTIwMTctMDItMTUifSxvcGVyYXRpb25zOntBY2NlcHRDb250YWN0OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sQ2xlYXJDb250YWN0OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvbnRhY3RJZCJdLG1lbWJlcnM6e2NvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sQ29tcGxldGVDb250YWN0OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvbnRhY3RJZCJdLG1lbWJlcnM6e2NvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sQ29uZmVyZW5jZUNvbm5lY3Rpb25zOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sQ3JlYXRlQWRkaXRpb25hbENvbm5lY3Rpb246e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJlbmRwb2ludCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb250YWN0SWQ6e30sZW5kcG9pbnQ6e3NoYXBlOiJTZSJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDcmVhdGVPdXRib3VuZENvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJlbmRwb2ludCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxlbmRwb2ludDp7c2hhcGU6IlNlIn0scXVldWVBUk46e30scmVsYXRlZENvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sQ3JlYXRlVGFza0NvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiZW5kcG9pbnQiLCJuYW1lIl0sbWVtYmVyczp7ZW5kcG9pbnQ6e3NoYXBlOiJTZSJ9LHByZXZpb3VzQ29udGFjdElkOnt9LG5hbWU6e30sZGVzY3JpcHRpb246e30scmVmZXJlbmNlczp7c2hhcGU6IlNyIn0saWRlbXBvdGVuY3lUb2tlbjp7fSxzY2hlZHVsZWRUaW1lOnt0eXBlOiJsb25nIn0scmVsYXRlZENvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntjb250YWN0SWQ6e319fX0sQ3JlYXRlVHJhbnNwb3J0OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInRyYW5zcG9ydFR5cGUiLCJhdXRoZW50aWNhdGlvbiJdLG1lbWJlcnM6e3RyYW5zcG9ydFR5cGU6e30scGFydGljaXBhbnRJZDp7fSxjb250YWN0SWQ6e30sc29mdHBob25lQ2xpZW50SWQ6e30sYXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e3dlYlNvY2tldFRyYW5zcG9ydDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInVybCIsInRyYW5zcG9ydExpZmVUaW1lSW5TZWNvbmRzIl0sbWVtYmVyczp7dXJsOnt9LHRyYW5zcG9ydExpZmVUaW1lSW5TZWNvbmRzOnt0eXBlOiJsb25nIn0sZXhwaXJ5Ont9fX0sY2hhdFRva2VuVHJhbnNwb3J0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsicGFydGljaXBhbnRUb2tlbiIsImV4cGlyeSJdLG1lbWJlcnM6e3BhcnRpY2lwYW50VG9rZW46e30sZXhwaXJ5Ont9fX0sc29mdHBob25lVHJhbnNwb3J0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsic29mdHBob25lTWVkaWFDb25uZWN0aW9ucyJdLG1lbWJlcnM6e3NvZnRwaG9uZU1lZGlhQ29ubmVjdGlvbnM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInVzZXJuYW1lIiwiY3JlZGVudGlhbCIsInVybHMiXSxtZW1iZXJzOnt1c2VybmFtZTp7fSxjcmVkZW50aWFsOnt9LHVybHM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX19fX19fSxhZ2VudERpc2NvdmVyeVRyYW5zcG9ydDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInByZXNpZ25lZFVybCJdLG1lbWJlcnM6e3ByZXNpZ25lZFVybDp7fX19LHdlYlJUQ1RyYW5zcG9ydDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIm1lZXRpbmciLCJhdHRlbmRlZSJdLG1lbWJlcnM6e21lZXRpbmc6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7bWVldGluZ0lkOnt9LG1lZGlhUmVnaW9uOnt9LG1lZGlhUGxhY2VtZW50Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2F1ZGlvSG9zdFVybDp7fSxhdWRpb0ZhbGxiYWNrVXJsOnt9LHNpZ25hbGluZ1VybDp7fSx0dXJuQ29udHJvbFVybDp7fSxldmVudEluZ2VzdGlvblVybDp7fX19LG1lZXRpbmdGZWF0dXJlczp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnthdWRpbzp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntlY2hvUmVkdWN0aW9uOnt9fX19fX19LGF0dGVuZGVlOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2F0dGVuZGVlSWQ6e30sam9pblRva2VuOnt0eXBlOiJzdHJpbmciLHNlbnNpdGl2ZTohMH19fX19fX19LERlc3Ryb3lDb25uZWN0aW9uOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LEdldEFnZW50Q29uZmlndXJhdGlvbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvbmZpZ3VyYXRpb24iXSxtZW1iZXJzOntjb25maWd1cmF0aW9uOntzaGFwZToiUzFxIn19fX0sR2V0QWdlbnRQZXJtaXNzaW9uczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxuZXh0VG9rZW46e30sbWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsicGVybWlzc2lvbnMiXSxtZW1iZXJzOntwZXJtaXNzaW9uczp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxuZXh0VG9rZW46e319fX0sR2V0QWdlbnRTbmFwc2hvdDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxuZXh0VG9rZW46e30sdGltZW91dDp7dHlwZToibG9uZyJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsic25hcHNob3QiLCJuZXh0VG9rZW4iXSxtZW1iZXJzOntzbmFwc2hvdDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInN0YXRlIiwiY29udGFjdHMiLCJzbmFwc2hvdFRpbWVzdGFtcCJdLG1lbWJlcnM6e3N0YXRlOntzaGFwZToiUzI5In0sbmV4dFN0YXRlOntzaGFwZToiUzI5In0sYWdlbnRBdmFpbGFiaWxpdHlTdGF0ZTp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntzdGF0ZTp7fSx0aW1lU3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9fX0sY29udGFjdHM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvbnRhY3RJZCIsInR5cGUiLCJzdGF0ZSIsImNvbm5lY3Rpb25zIiwiYXR0cmlidXRlcyJdLG1lbWJlcnM6e2NvbnRhY3RJZDp7fSxpbml0aWFsQ29udGFjdElkOnt9LHR5cGU6e30sc3RhdGU6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJ0eXBlIiwidGltZXN0YW1wIl0sbWVtYmVyczp7dHlwZTp7fSx0aW1lc3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9fX0scXVldWU6e3NoYXBlOiJTayJ9LHF1ZXVlVGltZXN0YW1wOnt0eXBlOiJ0aW1lc3RhbXAifSxjb25uZWN0aW9uczp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29ubmVjdGlvbklkIiwic3RhdGUiLCJ0eXBlIiwiaW5pdGlhbCJdLG1lbWJlcnM6e2Nvbm5lY3Rpb25JZDp7fSxlbmRwb2ludDp7c2hhcGU6IlNlIn0sc3RhdGU6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJ0eXBlIiwidGltZXN0YW1wIl0sbWVtYmVyczp7dHlwZTp7fSx0aW1lc3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9fX0sdHlwZTp7fSxpbml0aWFsOnt0eXBlOiJib29sZWFuIn0sc29mdHBob25lTWVkaWFJbmZvOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2NhbGxUeXBlOnt9LGF1dG9BY2NlcHQ6e3R5cGU6ImJvb2xlYW4ifSxtZWRpYUxlZ0NvbnRleHRUb2tlbjp7fSxjYWxsQ29udGV4dFRva2VuOnt9LGNhbGxDb25maWdKc29uOnt9fX0sY2hhdE1lZGlhSW5mbzp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntjaGF0QXV0b0FjY2VwdDp7dHlwZToiYm9vbGVhbiJ9LGNvbm5lY3Rpb25EYXRhOnt9LGN1c3RvbWVyTmFtZTp7fX19LG1vbml0b3JpbmdJbmZvOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2FnZW50Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2FnZW50TmFtZTp7fX19LGpvaW5UaW1lU3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9fX0sbXV0ZTp7dHlwZToiYm9vbGVhbiJ9LGZvcmNlZE11dGU6e3R5cGU6ImJvb2xlYW4ifSxxdWlja0Nvbm5lY3ROYW1lOnt9LG1vbml0b3JDYXBhYmlsaXRpZXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX0sbW9uaXRvclN0YXR1czp7fSxjYXBhYmlsaXRpZXM6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7VmlkZW86e319fX19fSxhdHRyaWJ1dGVzOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIm5hbWUiXSxtZW1iZXJzOntuYW1lOnt9LHZhbHVlOnt9fX19LGNvbnRhY3REdXJhdGlvbjp7fSxuYW1lOnt9LGRlc2NyaXB0aW9uOnt9LHJlZmVyZW5jZXM6e3NoYXBlOiJTciJ9LGluaXRpYXRpb25NZXRob2Q6e30sY29udGFjdEZlYXR1cmVzOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2F0dGFjaG1lbnRzRW5hYmxlZDp7dHlwZToiYm9vbGVhbiJ9LG1lc3NhZ2luZ01hcmtkb3duRW5hYmxlZDp7dHlwZToiYm9vbGVhbiJ9LG11bHRpUGFydHlDb25mZXJlbmNlRW5hYmxlZDp7dHlwZToiYm9vbGVhbiJ9LHNjcmVlblJlY29yZGluZ0VuYWJsZWQ6e3R5cGU6ImJvb2xlYW4ifSxzY3JlZW5SZWNvcmRpbmdTdGF0ZTp7fSxzY3JlZW5SZWNvcmRpbmdDb25maWc6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7c2NyZWVuUmVjb3JkaW5nRW5hYmxlZDp7dHlwZToiYm9vbGVhbiJ9LHNjcmVlblJlY29yZGluZ1N0YXRlOnt9fX19fSxjaGFubmVsQ29udGV4dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntzY2hlZHVsZWRUaW1lOnt0eXBlOiJsb25nIn0sdGFza1RlbXBsYXRlSWQ6e30sdGFza1RlbXBsYXRlVmVyc2lvbjp7dHlwZToiaW50ZWdlciJ9fX0sc2VnbWVudEF0dHJpYnV0ZXM6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e1ZhbHVlU3RyaW5nOnt9fX19fX19LHNuYXBzaG90VGltZXN0YW1wOnt0eXBlOiJ0aW1lc3RhbXAifX19LG5leHRUb2tlbjp7fX19fSxHZXRBZ2VudFN0YXRlczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxuZXh0VG9rZW46e30sbWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsic3RhdGVzIl0sbWVtYmVyczp7c3RhdGVzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3NoYXBlOiJTMjkifX0sbmV4dFRva2VuOnt9fX19LEdldERpYWxhYmxlQ291bnRyeUNvZGVzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LG5leHRUb2tlbjp7fSxtYXhSZXN1bHRzOnt0eXBlOiJpbnRlZ2VyIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb3VudHJ5Q29kZXMiXSxtZW1iZXJzOntjb3VudHJ5Q29kZXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX0sbmV4dFRva2VuOnt9fX19LEdldEVuZHBvaW50czp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsInF1ZXVlQVJOcyJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxxdWV1ZUFSTnM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX0sbmV4dFRva2VuOnt9LG1heFJlc3VsdHM6e3R5cGU6ImludGVnZXIifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntlbmRwb2ludHM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7c2hhcGU6IlNlIn19LG5leHRUb2tlbjp7fX19fSxHZXROZXdBdXRoVG9rZW46e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJyZWZyZXNoVG9rZW4iXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0scmVmcmVzaFRva2VuOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e25ld0F1dGhUb2tlbjp7fSxleHBpcmF0aW9uRGF0ZVRpbWU6e3R5cGU6InRpbWVzdGFtcCJ9fX19LEdldFJvdXRpbmdQcm9maWxlUXVldWVzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwicm91dGluZ1Byb2ZpbGVBUk4iXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0scm91dGluZ1Byb2ZpbGVBUk46e30sbmV4dFRva2VuOnt9LG1heFJlc3VsdHM6e3R5cGU6ImludGVnZXIifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInF1ZXVlcyJdLG1lbWJlcnM6e3F1ZXVlczp7dHlwZToibGlzdCIsbWVtYmVyOntzaGFwZToiU2sifX0sbmV4dFRva2VuOnt9fX19LEhvbGRDb25uZWN0aW9uOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LE11dGVQYXJ0aWNpcGFudDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCIsImNvbm5lY3Rpb25JZCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb250YWN0SWQ6e30sY29ubmVjdGlvbklkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxOb3RpZnlDb250YWN0SXNzdWU6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGlzc3VlQ29kZTp7fSxkZXNjcmlwdGlvbjp7fSxjbGllbnRMb2dzOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxQYXVzZUNvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29udGFjdElkIl0sbWVtYmVyczp7Y29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxQdXRBZ2VudFN0YXRlOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwic3RhdGUiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sc3RhdGU6e3NoYXBlOiJTMjkifSxlbnF1ZXVlTmV4dFN0YXRlOnt0eXBlOiJib29sZWFuIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFJlamVjdENvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29udGFjdElkIl0sbWVtYmVyczp7Y29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxSZXN1bWVDb25uZWN0aW9uOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFJlc3VtZUNvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29udGFjdElkIl0sbWVtYmVyczp7Y29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxTZW5kQ2xpZW50TG9nczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImxvZ0V2ZW50cyJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxsb2dFdmVudHM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt0aW1lc3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9LGNvbXBvbmVudDp7fSxtZXNzYWdlOnt9fX19fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxTZW5kRGlnaXRzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIiwiZGlnaXRzIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e30sZGlnaXRzOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxTZW5kU29mdHBob25lQ2FsbE1ldHJpY3M6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJzb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjY3BWZXJzaW9uOnt9LHNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3M6e3NoYXBlOiJTNGYifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sU2VuZFNvZnRwaG9uZUNhbGxSZXBvcnQ6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJyZXBvcnQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNjcFZlcnNpb246e30scmVwb3J0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2NhbGxTdGFydFRpbWU6e3R5cGU6InRpbWVzdGFtcCJ9LGNhbGxFbmRUaW1lOnt0eXBlOiJ0aW1lc3RhbXAifSxzb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzOntzaGFwZToiUzRmIn0sZ3VtVGltZU1pbGxpczp7dHlwZToibG9uZyJ9LGluaXRpYWxpemF0aW9uVGltZU1pbGxpczp7dHlwZToibG9uZyJ9LGljZUNvbGxlY3Rpb25UaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0sc2lnbmFsbGluZ0Nvbm5lY3RUaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0saGFuZHNoYWtlVGltZU1pbGxpczp7dHlwZToibG9uZyJ9LHByZVRhbGtUaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0sdGFsa1RpbWVNaWxsaXM6e3R5cGU6ImxvbmcifSxjbGVhbnVwVGltZU1pbGxpczp7dHlwZToibG9uZyJ9LGljZUNvbGxlY3Rpb25GYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sc2lnbmFsbGluZ0Nvbm5lY3Rpb25GYWlsdXJlOnt0eXBlOiJib29sZWFuIn0saGFuZHNoYWtlRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LGd1bU90aGVyRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LGd1bVRpbWVvdXRGYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sY3JlYXRlT2ZmZXJGYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sc2V0TG9jYWxEZXNjcmlwdGlvbkZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSx1c2VyQnVzeUZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSxpbnZhbGlkUmVtb3RlU0RQRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LG5vUmVtb3RlSWNlQ2FuZGlkYXRlRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LHNldFJlbW90ZURlc2NyaXB0aW9uRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9fX19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFRvZ2dsZUFjdGl2ZUNvbm5lY3Rpb25zOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFVubXV0ZVBhcnRpY2lwYW50OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFVwZGF0ZUFnZW50Q29uZmlndXJhdGlvbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbmZpZ3VyYXRpb24iXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29uZmlndXJhdGlvbjp7c2hhcGU6IlMxcSJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxVcGRhdGVNb25pdG9yUGFydGljaXBhbnRTdGF0ZTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb250YWN0SWQiLCJ0YXJnZXRNb25pdG9yTW9kZSJdLG1lbWJlcnM6e2NvbnRhY3RJZDp7fSx0YXJnZXRNb25pdG9yTW9kZTp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX19LHNoYXBlczp7UzI6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YWdlbnRBUk46e30sYXV0aFRva2VuOnt9fX0sU2U6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJ0eXBlIl0sbWVtYmVyczp7ZW5kcG9pbnRBUk46e30sdHlwZTp7fSxuYW1lOnt9LHBob25lTnVtYmVyOnt9LGFnZW50TG9naW46e30scXVldWU6e3NoYXBlOiJTayJ9fX0sU2s6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7cXVldWVBUk46e30sbmFtZTp7fX19LFNyOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInZhbHVlIiwidHlwZSJdLG1lbWJlcnM6e3ZhbHVlOnt9LHR5cGU6e319fX0sUzFxOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsibmFtZSIsInNvZnRwaG9uZUVuYWJsZWQiLCJzb2Z0cGhvbmVBdXRvQWNjZXB0IiwiZXh0ZW5zaW9uIiwicm91dGluZ1Byb2ZpbGUiXSxtZW1iZXJzOntuYW1lOnt9LHVzZXJuYW1lOnt9LHNvZnRwaG9uZUVuYWJsZWQ6e3R5cGU6ImJvb2xlYW4ifSxzb2Z0cGhvbmVBdXRvQWNjZXB0Ont0eXBlOiJib29sZWFuIn0sZXh0ZW5zaW9uOnt9LHJvdXRpbmdQcm9maWxlOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e25hbWU6e30scm91dGluZ1Byb2ZpbGVBUk46e30sZGVmYXVsdE91dGJvdW5kUXVldWU6e3NoYXBlOiJTayJ9LGNoYW5uZWxDb25jdXJyZW5jeU1hcDp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e3R5cGU6ImxvbmcifX19fSxhZ2VudFByZWZlcmVuY2VzOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7fX0sYWdlbnRBUk46e319fSxTMjk6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJ0eXBlIiwibmFtZSJdLG1lbWJlcnM6e2FnZW50U3RhdGVBUk46e30sdHlwZTp7fSxuYW1lOnt9LHN0YXJ0VGltZXN0YW1wOnt0eXBlOiJ0aW1lc3RhbXAifX19LFM0Zjp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e3RpbWVzdGFtcDp7dHlwZToidGltZXN0YW1wIn0sc29mdHBob25lU3RyZWFtVHlwZTp7fSxwYWNrZXRDb3VudDp7dHlwZToibG9uZyJ9LHBhY2tldHNMb3N0Ont0eXBlOiJsb25nIn0sYXVkaW9MZXZlbDp7dHlwZToiZG91YmxlIn0saml0dGVyQnVmZmVyTWlsbGlzOnt0eXBlOiJsb25nIn0scm91bmRUcmlwVGltZU1pbGxpczp7dHlwZToibG9uZyJ9fX19fX19LHt9XSw0OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXthY206e25hbWU6IkFDTSIsY29yczohMH0sYXBpZ2F0ZXdheTp7bmFtZToiQVBJR2F0ZXdheSIsY29yczohMH0sYXBwbGljYXRpb25hdXRvc2NhbGluZzp7cHJlZml4OiJhcHBsaWNhdGlvbi1hdXRvc2NhbGluZyIsbmFtZToiQXBwbGljYXRpb25BdXRvU2NhbGluZyIsY29yczohMH0sYXBwc3RyZWFtOntuYW1lOiJBcHBTdHJlYW0ifSxhdXRvc2NhbGluZzp7bmFtZToiQXV0b1NjYWxpbmciLGNvcnM6ITB9LGJhdGNoOntuYW1lOiJCYXRjaCJ9LGJ1ZGdldHM6e25hbWU6IkJ1ZGdldHMifSxjbG91ZGRpcmVjdG9yeTp7bmFtZToiQ2xvdWREaXJlY3RvcnkiLHZlcnNpb25zOlsiMjAxNi0wNS0xMCoiXX0sY2xvdWRmb3JtYXRpb246e25hbWU6IkNsb3VkRm9ybWF0aW9uIixjb3JzOiEwfSxjbG91ZGZyb250OntuYW1lOiJDbG91ZEZyb250Iix2ZXJzaW9uczpbIjIwMTMtMDUtMTIqIiwiMjAxMy0xMS0xMSoiLCIyMDE0LTA1LTMxKiIsIjIwMTQtMTAtMjEqIiwiMjAxNC0xMS0wNioiLCIyMDE1LTA0LTE3KiIsIjIwMTUtMDctMjcqIiwiMjAxNS0wOS0xNyoiLCIyMDE2LTAxLTEzKiIsIjIwMTYtMDEtMjgqIiwiMjAxNi0wOC0wMSoiLCIyMDE2LTA4LTIwKiIsIjIwMTYtMDktMDcqIiwiMjAxNi0wOS0yOSoiLCIyMDE2LTExLTI1KiIsIjIwMTctMDMtMjUqIiwiMjAxNy0xMC0zMCoiLCIyMDE4LTA2LTE4KiIsIjIwMTgtMTEtMDUqIiwiMjAxOS0wMy0yNioiXSxjb3JzOiEwfSxjbG91ZGhzbTp7bmFtZToiQ2xvdWRIU00iLGNvcnM6ITB9LGNsb3Vkc2VhcmNoOntuYW1lOiJDbG91ZFNlYXJjaCJ9LGNsb3Vkc2VhcmNoZG9tYWluOntuYW1lOiJDbG91ZFNlYXJjaERvbWFpbiJ9LGNsb3VkdHJhaWw6e25hbWU6IkNsb3VkVHJhaWwiLGNvcnM6ITB9LGNsb3Vkd2F0Y2g6e3ByZWZpeDoibW9uaXRvcmluZyIsbmFtZToiQ2xvdWRXYXRjaCIsY29yczohMH0sY2xvdWR3YXRjaGV2ZW50czp7cHJlZml4OiJldmVudHMiLG5hbWU6IkNsb3VkV2F0Y2hFdmVudHMiLHZlcnNpb25zOlsiMjAxNC0wMi0wMyoiXSxjb3JzOiEwfSxjbG91ZHdhdGNobG9nczp7cHJlZml4OiJsb2dzIixuYW1lOiJDbG91ZFdhdGNoTG9ncyIsY29yczohMH0sY29kZWJ1aWxkOntuYW1lOiJDb2RlQnVpbGQiLGNvcnM6ITB9LGNvZGVjb21taXQ6e25hbWU6IkNvZGVDb21taXQiLGNvcnM6ITB9LGNvZGVkZXBsb3k6e25hbWU6IkNvZGVEZXBsb3kiLGNvcnM6ITB9LGNvZGVwaXBlbGluZTp7bmFtZToiQ29kZVBpcGVsaW5lIixjb3JzOiEwfSxjb2duaXRvaWRlbnRpdHk6e3ByZWZpeDoiY29nbml0by1pZGVudGl0eSIsbmFtZToiQ29nbml0b0lkZW50aXR5Iixjb3JzOiEwfSxjb2duaXRvaWRlbnRpdHlzZXJ2aWNlcHJvdmlkZXI6e3ByZWZpeDoiY29nbml0by1pZHAiLG5hbWU6IkNvZ25pdG9JZGVudGl0eVNlcnZpY2VQcm92aWRlciIsY29yczohMH0sY29nbml0b3N5bmM6e3ByZWZpeDoiY29nbml0by1zeW5jIixuYW1lOiJDb2duaXRvU3luYyIsY29yczohMH0sY29uZmlnc2VydmljZTp7cHJlZml4OiJjb25maWciLG5hbWU6IkNvbmZpZ1NlcnZpY2UiLGNvcnM6ITB9LGN1cjp7bmFtZToiQ1VSIixjb3JzOiEwfSxkYXRhcGlwZWxpbmU6e25hbWU6IkRhdGFQaXBlbGluZSJ9LGRldmljZWZhcm06e25hbWU6IkRldmljZUZhcm0iLGNvcnM6ITB9LGRpcmVjdGNvbm5lY3Q6e25hbWU6IkRpcmVjdENvbm5lY3QiLGNvcnM6ITB9LGRpcmVjdG9yeXNlcnZpY2U6e3ByZWZpeDoiZHMiLG5hbWU6IkRpcmVjdG9yeVNlcnZpY2UifSxkaXNjb3Zlcnk6e25hbWU6IkRpc2NvdmVyeSJ9LGRtczp7bmFtZToiRE1TIn0sZHluYW1vZGI6e25hbWU6IkR5bmFtb0RCIixjb3JzOiEwfSxkeW5hbW9kYnN0cmVhbXM6e3ByZWZpeDoic3RyZWFtcy5keW5hbW9kYiIsbmFtZToiRHluYW1vREJTdHJlYW1zIixjb3JzOiEwfSxlYzI6e25hbWU6IkVDMiIsdmVyc2lvbnM6WyIyMDEzLTA2LTE1KiIsIjIwMTMtMTAtMTUqIiwiMjAxNC0wMi0wMSoiLCIyMDE0LTA1LTAxKiIsIjIwMTQtMDYtMTUqIiwiMjAxNC0wOS0wMSoiLCIyMDE0LTEwLTAxKiIsIjIwMTUtMDMtMDEqIiwiMjAxNS0wNC0xNSoiLCIyMDE1LTEwLTAxKiIsIjIwMTYtMDQtMDEqIiwiMjAxNi0wOS0xNSoiXSxjb3JzOiEwfSxlY3I6e25hbWU6IkVDUiIsY29yczohMH0sZWNzOntuYW1lOiJFQ1MiLGNvcnM6ITB9LGVmczp7cHJlZml4OiJlbGFzdGljZmlsZXN5c3RlbSIsbmFtZToiRUZTIixjb3JzOiEwfSxlbGFzdGljYWNoZTp7bmFtZToiRWxhc3RpQ2FjaGUiLHZlcnNpb25zOlsiMjAxMi0xMS0xNSoiLCIyMDE0LTAzLTI0KiIsIjIwMTQtMDctMTUqIiwiMjAxNC0wOS0zMCoiXSxjb3JzOiEwfSxlbGFzdGljYmVhbnN0YWxrOntuYW1lOiJFbGFzdGljQmVhbnN0YWxrIixjb3JzOiEwfSxlbGI6e3ByZWZpeDoiZWxhc3RpY2xvYWRiYWxhbmNpbmciLG5hbWU6IkVMQiIsY29yczohMH0sZWxidjI6e3ByZWZpeDoiZWxhc3RpY2xvYWRiYWxhbmNpbmd2MiIsbmFtZToiRUxCdjIiLGNvcnM6ITB9LGVtcjp7cHJlZml4OiJlbGFzdGljbWFwcmVkdWNlIixuYW1lOiJFTVIiLGNvcnM6ITB9LGVzOntuYW1lOiJFUyJ9LGVsYXN0aWN0cmFuc2NvZGVyOntuYW1lOiJFbGFzdGljVHJhbnNjb2RlciIsY29yczohMH0sZmlyZWhvc2U6e25hbWU6IkZpcmVob3NlIixjb3JzOiEwfSxnYW1lbGlmdDp7bmFtZToiR2FtZUxpZnQiLGNvcnM6ITB9LGdsYWNpZXI6e25hbWU6IkdsYWNpZXIifSxoZWFsdGg6e25hbWU6IkhlYWx0aCJ9LGlhbTp7bmFtZToiSUFNIixjb3JzOiEwfSxpbXBvcnRleHBvcnQ6e25hbWU6IkltcG9ydEV4cG9ydCJ9LGluc3BlY3Rvcjp7bmFtZToiSW5zcGVjdG9yIix2ZXJzaW9uczpbIjIwMTUtMDgtMTgqIl0sY29yczohMH0saW90OntuYW1lOiJJb3QiLGNvcnM6ITB9LGlvdGRhdGE6e3ByZWZpeDoiaW90LWRhdGEiLG5hbWU6IklvdERhdGEiLGNvcnM6ITB9LGtpbmVzaXM6e25hbWU6IktpbmVzaXMiLGNvcnM6ITB9LGtpbmVzaXNhbmFseXRpY3M6e25hbWU6IktpbmVzaXNBbmFseXRpY3MifSxrbXM6e25hbWU6IktNUyIsY29yczohMH0sbGFtYmRhOntuYW1lOiJMYW1iZGEiLGNvcnM6ITB9LGxleHJ1bnRpbWU6e3ByZWZpeDoicnVudGltZS5sZXgiLG5hbWU6IkxleFJ1bnRpbWUiLGNvcnM6ITB9LGxpZ2h0c2FpbDp7bmFtZToiTGlnaHRzYWlsIn0sbWFjaGluZWxlYXJuaW5nOntuYW1lOiJNYWNoaW5lTGVhcm5pbmciLGNvcnM6ITB9LG1hcmtldHBsYWNlY29tbWVyY2VhbmFseXRpY3M6e25hbWU6Ik1hcmtldHBsYWNlQ29tbWVyY2VBbmFseXRpY3MiLGNvcnM6ITB9LG1hcmtldHBsYWNlbWV0ZXJpbmc6e3ByZWZpeDoibWV0ZXJpbmdtYXJrZXRwbGFjZSIsbmFtZToiTWFya2V0cGxhY2VNZXRlcmluZyJ9LG10dXJrOntwcmVmaXg6Im10dXJrLXJlcXVlc3RlciIsbmFtZToiTVR1cmsiLGNvcnM6ITB9LG1vYmlsZWFuYWx5dGljczp7bmFtZToiTW9iaWxlQW5hbHl0aWNzIixjb3JzOiEwfSxvcHN3b3Jrczp7bmFtZToiT3BzV29ya3MiLGNvcnM6ITB9LG9wc3dvcmtzY206e25hbWU6Ik9wc1dvcmtzQ00ifSxvcmdhbml6YXRpb25zOntuYW1lOiJPcmdhbml6YXRpb25zIn0scGlucG9pbnQ6e25hbWU6IlBpbnBvaW50In0scG9sbHk6e25hbWU6IlBvbGx5Iixjb3JzOiEwfSxyZHM6e25hbWU6IlJEUyIsdmVyc2lvbnM6WyIyMDE0LTA5LTAxKiJdLGNvcnM6ITB9LHJlZHNoaWZ0OntuYW1lOiJSZWRzaGlmdCIsY29yczohMH0scmVrb2duaXRpb246e25hbWU6IlJla29nbml0aW9uIixjb3JzOiEwfSxyZXNvdXJjZWdyb3Vwc3RhZ2dpbmdhcGk6e25hbWU6IlJlc291cmNlR3JvdXBzVGFnZ2luZ0FQSSJ9LHJvdXRlNTM6e25hbWU6IlJvdXRlNTMiLGNvcnM6ITB9LHJvdXRlNTNkb21haW5zOntuYW1lOiJSb3V0ZTUzRG9tYWlucyIsY29yczohMH0sczM6e25hbWU6IlMzIixkdWFsc3RhY2tBdmFpbGFibGU6ITAsY29yczohMH0sczNjb250cm9sOntuYW1lOiJTM0NvbnRyb2wiLGR1YWxzdGFja0F2YWlsYWJsZTohMCx4bWxOb0RlZmF1bHRMaXN0czohMH0sc2VydmljZWNhdGFsb2c6e25hbWU6IlNlcnZpY2VDYXRhbG9nIixjb3JzOiEwfSxzZXM6e3ByZWZpeDoiZW1haWwiLG5hbWU6IlNFUyIsY29yczohMH0sc2hpZWxkOntuYW1lOiJTaGllbGQifSxzaW1wbGVkYjp7cHJlZml4OiJzZGIiLG5hbWU6IlNpbXBsZURCIn0sc21zOntuYW1lOiJTTVMifSxzbm93YmFsbDp7bmFtZToiU25vd2JhbGwifSxzbnM6e25hbWU6IlNOUyIsY29yczohMH0sc3FzOntuYW1lOiJTUVMiLGNvcnM6ITB9LHNzbTp7bmFtZToiU1NNIixjb3JzOiEwfSxzdG9yYWdlZ2F0ZXdheTp7bmFtZToiU3RvcmFnZUdhdGV3YXkiLGNvcnM6ITB9LHN0ZXBmdW5jdGlvbnM6e3ByZWZpeDoic3RhdGVzIixuYW1lOiJTdGVwRnVuY3Rpb25zIn0sc3RzOntuYW1lOiJTVFMiLGNvcnM6ITB9LHN1cHBvcnQ6e25hbWU6IlN1cHBvcnQifSxzd2Y6e25hbWU6IlNXRiJ9LHhyYXk6e25hbWU6IlhSYXkiLGNvcnM6ITB9LHdhZjp7bmFtZToiV0FGIixjb3JzOiEwfSx3YWZyZWdpb25hbDp7cHJlZml4OiJ3YWYtcmVnaW9uYWwiLG5hbWU6IldBRlJlZ2lvbmFsIn0sd29ya2RvY3M6e25hbWU6IldvcmtEb2NzIixjb3JzOiEwfSx3b3Jrc3BhY2VzOntuYW1lOiJXb3JrU3BhY2VzIn0sY29kZXN0YXI6e25hbWU6IkNvZGVTdGFyIn0sbGV4bW9kZWxidWlsZGluZ3NlcnZpY2U6e3ByZWZpeDoibGV4LW1vZGVscyIsbmFtZToiTGV4TW9kZWxCdWlsZGluZ1NlcnZpY2UiLGNvcnM6ITB9LG1hcmtldHBsYWNlZW50aXRsZW1lbnRzZXJ2aWNlOntwcmVmaXg6ImVudGl0bGVtZW50Lm1hcmtldHBsYWNlIixuYW1lOiJNYXJrZXRwbGFjZUVudGl0bGVtZW50U2VydmljZSJ9LGF0aGVuYTp7bmFtZToiQXRoZW5hIixjb3JzOiEwfSxncmVlbmdyYXNzOntuYW1lOiJHcmVlbmdyYXNzIn0sZGF4OntuYW1lOiJEQVgifSxtaWdyYXRpb25odWI6e3ByZWZpeDoiQVdTTWlncmF0aW9uSHViIixuYW1lOiJNaWdyYXRpb25IdWIifSxjbG91ZGhzbXYyOntuYW1lOiJDbG91ZEhTTVYyIixjb3JzOiEwfSxnbHVlOntuYW1lOiJHbHVlIn0sbW9iaWxlOntuYW1lOiJNb2JpbGUifSxwcmljaW5nOntuYW1lOiJQcmljaW5nIixjb3JzOiEwfSxjb3N0ZXhwbG9yZXI6e3ByZWZpeDoiY2UiLG5hbWU6IkNvc3RFeHBsb3JlciIsY29yczohMH0sbWVkaWFjb252ZXJ0OntuYW1lOiJNZWRpYUNvbnZlcnQifSxtZWRpYWxpdmU6e25hbWU6Ik1lZGlhTGl2ZSJ9LG1lZGlhcGFja2FnZTp7bmFtZToiTWVkaWFQYWNrYWdlIn0sbWVkaWFzdG9yZTp7bmFtZToiTWVkaWFTdG9yZSJ9LG1lZGlhc3RvcmVkYXRhOntwcmVmaXg6Im1lZGlhc3RvcmUtZGF0YSIsbmFtZToiTWVkaWFTdG9yZURhdGEiLGNvcnM6ITB9LGFwcHN5bmM6e25hbWU6IkFwcFN5bmMifSxndWFyZGR1dHk6e25hbWU6Ikd1YXJkRHV0eSJ9LG1xOntuYW1lOiJNUSJ9LGNvbXByZWhlbmQ6e25hbWU6IkNvbXByZWhlbmQiLGNvcnM6ITB9LGlvdGpvYnNkYXRhcGxhbmU6e3ByZWZpeDoiaW90LWpvYnMtZGF0YSIsbmFtZToiSW9USm9ic0RhdGFQbGFuZSJ9LGtpbmVzaXN2aWRlb2FyY2hpdmVkbWVkaWE6e3ByZWZpeDoia2luZXNpcy12aWRlby1hcmNoaXZlZC1tZWRpYSIsbmFtZToiS2luZXNpc1ZpZGVvQXJjaGl2ZWRNZWRpYSIsY29yczohMH0sa2luZXNpc3ZpZGVvbWVkaWE6e3ByZWZpeDoia2luZXNpcy12aWRlby1tZWRpYSIsbmFtZToiS2luZXNpc1ZpZGVvTWVkaWEiLGNvcnM6ITB9LGtpbmVzaXN2aWRlbzp7bmFtZToiS2luZXNpc1ZpZGVvIixjb3JzOiEwfSxzYWdlbWFrZXJydW50aW1lOntwcmVmaXg6InJ1bnRpbWUuc2FnZW1ha2VyIixuYW1lOiJTYWdlTWFrZXJSdW50aW1lIn0sc2FnZW1ha2VyOntuYW1lOiJTYWdlTWFrZXIifSx0cmFuc2xhdGU6e25hbWU6IlRyYW5zbGF0ZSIsY29yczohMH0scmVzb3VyY2Vncm91cHM6e3ByZWZpeDoicmVzb3VyY2UtZ3JvdXBzIixuYW1lOiJSZXNvdXJjZUdyb3VwcyIsY29yczohMH0sYWxleGFmb3JidXNpbmVzczp7bmFtZToiQWxleGFGb3JCdXNpbmVzcyJ9LGNsb3VkOTp7bmFtZToiQ2xvdWQ5In0sc2VydmVybGVzc2FwcGxpY2F0aW9ucmVwb3NpdG9yeTp7cHJlZml4OiJzZXJ2ZXJsZXNzcmVwbyIsbmFtZToiU2VydmVybGVzc0FwcGxpY2F0aW9uUmVwb3NpdG9yeSJ9LHNlcnZpY2VkaXNjb3Zlcnk6e25hbWU6IlNlcnZpY2VEaXNjb3ZlcnkifSx3b3JrbWFpbDp7bmFtZToiV29ya01haWwifSxhdXRvc2NhbGluZ3BsYW5zOntwcmVmaXg6ImF1dG9zY2FsaW5nLXBsYW5zIixuYW1lOiJBdXRvU2NhbGluZ1BsYW5zIn0sdHJhbnNjcmliZXNlcnZpY2U6e3ByZWZpeDoidHJhbnNjcmliZSIsbmFtZToiVHJhbnNjcmliZVNlcnZpY2UifSxjb25uZWN0OntuYW1lOiJDb25uZWN0Iixjb3JzOiEwfSxhY21wY2E6e3ByZWZpeDoiYWNtLXBjYSIsbmFtZToiQUNNUENBIn0sZm1zOntuYW1lOiJGTVMifSxzZWNyZXRzbWFuYWdlcjp7bmFtZToiU2VjcmV0c01hbmFnZXIiLGNvcnM6ITB9LGlvdGFuYWx5dGljczp7bmFtZToiSW9UQW5hbHl0aWNzIixjb3JzOiEwfSxpb3QxY2xpY2tkZXZpY2Vzc2VydmljZTp7cHJlZml4OiJpb3QxY2xpY2stZGV2aWNlcyIsbmFtZToiSW9UMUNsaWNrRGV2aWNlc1NlcnZpY2UifSxpb3QxY2xpY2twcm9qZWN0czp7cHJlZml4OiJpb3QxY2xpY2stcHJvamVjdHMiLG5hbWU6IklvVDFDbGlja1Byb2plY3RzIn0scGk6e25hbWU6IlBJIn0sbmVwdHVuZTp7bmFtZToiTmVwdHVuZSJ9LG1lZGlhdGFpbG9yOntuYW1lOiJNZWRpYVRhaWxvciJ9LGVrczp7bmFtZToiRUtTIn0sbWFjaWU6e25hbWU6Ik1hY2llIn0sZGxtOntuYW1lOiJETE0ifSxzaWduZXI6e25hbWU6IlNpZ25lciJ9LGNoaW1lOntuYW1lOiJDaGltZSJ9LHBpbnBvaW50ZW1haWw6e3ByZWZpeDoicGlucG9pbnQtZW1haWwiLG5hbWU6IlBpbnBvaW50RW1haWwifSxyYW06e25hbWU6IlJBTSJ9LHJvdXRlNTNyZXNvbHZlcjp7bmFtZToiUm91dGU1M1Jlc29sdmVyIn0scGlucG9pbnRzbXN2b2ljZTp7cHJlZml4OiJzbXMtdm9pY2UiLG5hbWU6IlBpbnBvaW50U01TVm9pY2UifSxxdWlja3NpZ2h0OntuYW1lOiJRdWlja1NpZ2h0In0scmRzZGF0YXNlcnZpY2U6e3ByZWZpeDoicmRzLWRhdGEiLG5hbWU6IlJEU0RhdGFTZXJ2aWNlIn0sYW1wbGlmeTp7bmFtZToiQW1wbGlmeSJ9LGRhdGFzeW5jOntuYW1lOiJEYXRhU3luYyJ9LHJvYm9tYWtlcjp7bmFtZToiUm9ib01ha2VyIn0sdHJhbnNmZXI6e25hbWU6IlRyYW5zZmVyIn0sZ2xvYmFsYWNjZWxlcmF0b3I6e25hbWU6Ikdsb2JhbEFjY2VsZXJhdG9yIn0sY29tcHJlaGVuZG1lZGljYWw6e25hbWU6IkNvbXByZWhlbmRNZWRpY2FsIixjb3JzOiEwfSxraW5lc2lzYW5hbHl0aWNzdjI6e25hbWU6IktpbmVzaXNBbmFseXRpY3NWMiJ9LG1lZGlhY29ubmVjdDp7bmFtZToiTWVkaWFDb25uZWN0In0sZnN4OntuYW1lOiJGU3gifSxzZWN1cml0eWh1Yjp7bmFtZToiU2VjdXJpdHlIdWIifSxhcHBtZXNoOntuYW1lOiJBcHBNZXNoIix2ZXJzaW9uczpbIjIwMTgtMTAtMDEqIl19LGxpY2Vuc2VtYW5hZ2VyOntwcmVmaXg6ImxpY2Vuc2UtbWFuYWdlciIsbmFtZToiTGljZW5zZU1hbmFnZXIifSxrYWZrYTp7bmFtZToiS2Fma2EifSxhcGlnYXRld2F5bWFuYWdlbWVudGFwaTp7bmFtZToiQXBpR2F0ZXdheU1hbmFnZW1lbnRBcGkifSxhcGlnYXRld2F5djI6e25hbWU6IkFwaUdhdGV3YXlWMiJ9LGRvY2RiOntuYW1lOiJEb2NEQiJ9LGJhY2t1cDp7bmFtZToiQmFja3VwIn0sd29ya2xpbms6e25hbWU6IldvcmtMaW5rIn0sdGV4dHJhY3Q6e25hbWU6IlRleHRyYWN0In0sbWFuYWdlZGJsb2NrY2hhaW46e25hbWU6Ik1hbmFnZWRCbG9ja2NoYWluIn0sbWVkaWFwYWNrYWdldm9kOntwcmVmaXg6Im1lZGlhcGFja2FnZS12b2QiLG5hbWU6Ik1lZGlhUGFja2FnZVZvZCJ9LGdyb3VuZHN0YXRpb246e25hbWU6Ikdyb3VuZFN0YXRpb24ifSxpb3R0aGluZ3NncmFwaDp7bmFtZToiSW9UVGhpbmdzR3JhcGgifSxpb3RldmVudHM6e25hbWU6IklvVEV2ZW50cyJ9LGlvdGV2ZW50c2RhdGE6e3ByZWZpeDoiaW90ZXZlbnRzLWRhdGEiLG5hbWU6IklvVEV2ZW50c0RhdGEifSxwZXJzb25hbGl6ZTp7bmFtZToiUGVyc29uYWxpemUiLGNvcnM6ITB9LHBlcnNvbmFsaXplZXZlbnRzOntwcmVmaXg6InBlcnNvbmFsaXplLWV2ZW50cyIsbmFtZToiUGVyc29uYWxpemVFdmVudHMiLGNvcnM6ITB9LHBlcnNvbmFsaXplcnVudGltZTp7cHJlZml4OiJwZXJzb25hbGl6ZS1ydW50aW1lIixuYW1lOiJQZXJzb25hbGl6ZVJ1bnRpbWUiLGNvcnM6ITB9LGFwcGxpY2F0aW9uaW5zaWdodHM6e3ByZWZpeDoiYXBwbGljYXRpb24taW5zaWdodHMiLG5hbWU6IkFwcGxpY2F0aW9uSW5zaWdodHMifSxzZXJ2aWNlcXVvdGFzOntwcmVmaXg6InNlcnZpY2UtcXVvdGFzIixuYW1lOiJTZXJ2aWNlUXVvdGFzIn0sZWMyaW5zdGFuY2Vjb25uZWN0OntwcmVmaXg6ImVjMi1pbnN0YW5jZS1jb25uZWN0IixuYW1lOiJFQzJJbnN0YW5jZUNvbm5lY3QifSxldmVudGJyaWRnZTp7bmFtZToiRXZlbnRCcmlkZ2UifSxsYWtlZm9ybWF0aW9uOntuYW1lOiJMYWtlRm9ybWF0aW9uIn0sZm9yZWNhc3RzZXJ2aWNlOntwcmVmaXg6ImZvcmVjYXN0IixuYW1lOiJGb3JlY2FzdFNlcnZpY2UiLGNvcnM6ITB9LGZvcmVjYXN0cXVlcnlzZXJ2aWNlOntwcmVmaXg6ImZvcmVjYXN0cXVlcnkiLG5hbWU6IkZvcmVjYXN0UXVlcnlTZXJ2aWNlIixjb3JzOiEwfSxxbGRiOntuYW1lOiJRTERCIn0scWxkYnNlc3Npb246e3ByZWZpeDoicWxkYi1zZXNzaW9uIixuYW1lOiJRTERCU2Vzc2lvbiJ9LHdvcmttYWlsbWVzc2FnZWZsb3c6e25hbWU6IldvcmtNYWlsTWVzc2FnZUZsb3cifSxjb2Rlc3Rhcm5vdGlmaWNhdGlvbnM6e3ByZWZpeDoiY29kZXN0YXItbm90aWZpY2F0aW9ucyIsbmFtZToiQ29kZVN0YXJOb3RpZmljYXRpb25zIn0sc2F2aW5nc3BsYW5zOntuYW1lOiJTYXZpbmdzUGxhbnMifSxzc286e25hbWU6IlNTTyJ9LHNzb29pZGM6e3ByZWZpeDoic3NvLW9pZGMiLG5hbWU6IlNTT09JREMifSxtYXJrZXRwbGFjZWNhdGFsb2c6e3ByZWZpeDoibWFya2V0cGxhY2UtY2F0YWxvZyIsbmFtZToiTWFya2V0cGxhY2VDYXRhbG9nIixjb3JzOiEwfSxkYXRhZXhjaGFuZ2U6e25hbWU6IkRhdGFFeGNoYW5nZSJ9LHNlc3YyOntuYW1lOiJTRVNWMiJ9LG1pZ3JhdGlvbmh1YmNvbmZpZzp7cHJlZml4OiJtaWdyYXRpb25odWItY29uZmlnIixuYW1lOiJNaWdyYXRpb25IdWJDb25maWcifSxjb25uZWN0cGFydGljaXBhbnQ6e25hbWU6IkNvbm5lY3RQYXJ0aWNpcGFudCJ9LGFwcGNvbmZpZzp7bmFtZToiQXBwQ29uZmlnIn0saW90c2VjdXJldHVubmVsaW5nOntuYW1lOiJJb1RTZWN1cmVUdW5uZWxpbmcifSx3YWZ2Mjp7bmFtZToiV0FGVjIifSxlbGFzdGljaW5mZXJlbmNlOntwcmVmaXg6ImVsYXN0aWMtaW5mZXJlbmNlIixuYW1lOiJFbGFzdGljSW5mZXJlbmNlIn0saW1hZ2VidWlsZGVyOntuYW1lOiJJbWFnZWJ1aWxkZXIifSxzY2hlbWFzOntuYW1lOiJTY2hlbWFzIn0sYWNjZXNzYW5hbHl6ZXI6e25hbWU6IkFjY2Vzc0FuYWx5emVyIn0sY29kZWd1cnVyZXZpZXdlcjp7cHJlZml4OiJjb2RlZ3VydS1yZXZpZXdlciIsbmFtZToiQ29kZUd1cnVSZXZpZXdlciJ9LGNvZGVndXJ1cHJvZmlsZXI6e25hbWU6IkNvZGVHdXJ1UHJvZmlsZXIifSxjb21wdXRlb3B0aW1pemVyOntwcmVmaXg6ImNvbXB1dGUtb3B0aW1pemVyIixuYW1lOiJDb21wdXRlT3B0aW1pemVyIn0sZnJhdWRkZXRlY3Rvcjp7bmFtZToiRnJhdWREZXRlY3RvciJ9LGtlbmRyYTp7bmFtZToiS2VuZHJhIn0sbmV0d29ya21hbmFnZXI6e25hbWU6Ik5ldHdvcmtNYW5hZ2VyIn0sb3V0cG9zdHM6e25hbWU6Ik91dHBvc3RzIn0sYXVnbWVudGVkYWlydW50aW1lOntwcmVmaXg6InNhZ2VtYWtlci1hMmktcnVudGltZSIsbmFtZToiQXVnbWVudGVkQUlSdW50aW1lIn0sZWJzOntuYW1lOiJFQlMifSxraW5lc2lzdmlkZW9zaWduYWxpbmdjaGFubmVsczp7cHJlZml4OiJraW5lc2lzLXZpZGVvLXNpZ25hbGluZyIsbmFtZToiS2luZXNpc1ZpZGVvU2lnbmFsaW5nQ2hhbm5lbHMiLGNvcnM6ITB9LGRldGVjdGl2ZTp7bmFtZToiRGV0ZWN0aXZlIn0sY29kZXN0YXJjb25uZWN0aW9uczp7cHJlZml4OiJjb2Rlc3Rhci1jb25uZWN0aW9ucyIsbmFtZToiQ29kZVN0YXJjb25uZWN0aW9ucyJ9LHN5bnRoZXRpY3M6e25hbWU6IlN5bnRoZXRpY3MifSxpb3RzaXRld2lzZTp7bmFtZToiSW9UU2l0ZVdpc2UifSxtYWNpZTI6e25hbWU6Ik1hY2llMiJ9LGNvZGVhcnRpZmFjdDp7bmFtZToiQ29kZUFydGlmYWN0In0saG9uZXljb2RlOntuYW1lOiJIb25leWNvZGUifSxpdnM6e25hbWU6IklWUyJ9LGJyYWtldDp7bmFtZToiQnJha2V0In0saWRlbnRpdHlzdG9yZTp7bmFtZToiSWRlbnRpdHlTdG9yZSJ9LGFwcGZsb3c6e25hbWU6IkFwcGZsb3cifSxyZWRzaGlmdGRhdGE6e3ByZWZpeDoicmVkc2hpZnQtZGF0YSIsbmFtZToiUmVkc2hpZnREYXRhIn0sc3NvYWRtaW46e3ByZWZpeDoic3NvLWFkbWluIixuYW1lOiJTU09BZG1pbiJ9LHRpbWVzdHJlYW1xdWVyeTp7cHJlZml4OiJ0aW1lc3RyZWFtLXF1ZXJ5IixuYW1lOiJUaW1lc3RyZWFtUXVlcnkifSx0aW1lc3RyZWFtd3JpdGU6e3ByZWZpeDoidGltZXN0cmVhbS13cml0ZSIsbmFtZToiVGltZXN0cmVhbVdyaXRlIn0sczNvdXRwb3N0czp7bmFtZToiUzNPdXRwb3N0cyJ9LGRhdGFicmV3OntuYW1lOiJEYXRhQnJldyJ9LHNlcnZpY2VjYXRhbG9nYXBwcmVnaXN0cnk6e3ByZWZpeDoic2VydmljZWNhdGFsb2ctYXBwcmVnaXN0cnkiLG5hbWU6IlNlcnZpY2VDYXRhbG9nQXBwUmVnaXN0cnkifSxuZXR3b3JrZmlyZXdhbGw6e3ByZWZpeDoibmV0d29yay1maXJld2FsbCIsbmFtZToiTmV0d29ya0ZpcmV3YWxsIn0sbXdhYTp7bmFtZToiTVdBQSJ9LGFtcGxpZnliYWNrZW5kOntuYW1lOiJBbXBsaWZ5QmFja2VuZCJ9LGFwcGludGVncmF0aW9uczp7bmFtZToiQXBwSW50ZWdyYXRpb25zIn0sY29ubmVjdGNvbnRhY3RsZW5zOntwcmVmaXg6ImNvbm5lY3QtY29udGFjdC1sZW5zIixuYW1lOiJDb25uZWN0Q29udGFjdExlbnMifSxkZXZvcHNndXJ1OntwcmVmaXg6ImRldm9wcy1ndXJ1IixuYW1lOiJEZXZPcHNHdXJ1In0sZWNycHVibGljOntwcmVmaXg6ImVjci1wdWJsaWMiLG5hbWU6IkVDUlBVQkxJQyJ9LGxvb2tvdXR2aXNpb246e25hbWU6Ikxvb2tvdXRWaXNpb24ifSxzYWdlbWFrZXJmZWF0dXJlc3RvcmVydW50aW1lOntwcmVmaXg6InNhZ2VtYWtlci1mZWF0dXJlc3RvcmUtcnVudGltZSIsbmFtZToiU2FnZU1ha2VyRmVhdHVyZVN0b3JlUnVudGltZSJ9LGN1c3RvbWVycHJvZmlsZXM6e3ByZWZpeDoiY3VzdG9tZXItcHJvZmlsZXMiLG5hbWU6IkN1c3RvbWVyUHJvZmlsZXMifSxhdWRpdG1hbmFnZXI6e25hbWU6IkF1ZGl0TWFuYWdlciJ9LGVtcmNvbnRhaW5lcnM6e3ByZWZpeDoiZW1yLWNvbnRhaW5lcnMiLG5hbWU6IkVNUmNvbnRhaW5lcnMifSxoZWFsdGhsYWtlOntuYW1lOiJIZWFsdGhMYWtlIn0sc2FnZW1ha2VyZWRnZTp7cHJlZml4OiJzYWdlbWFrZXItZWRnZSIsbmFtZToiU2FnZW1ha2VyRWRnZSJ9LGFtcDp7bmFtZToiQW1wIixjb3JzOiEwfSxncmVlbmdyYXNzdjI6e25hbWU6IkdyZWVuZ3Jhc3NWMiJ9LGlvdGRldmljZWFkdmlzb3I6e25hbWU6IklvdERldmljZUFkdmlzb3IifSxpb3RmbGVldGh1Yjp7bmFtZToiSW9URmxlZXRIdWIifSxpb3R3aXJlbGVzczp7bmFtZToiSW9UV2lyZWxlc3MifSxsb2NhdGlvbjp7bmFtZToiTG9jYXRpb24iLGNvcnM6ITB9LHdlbGxhcmNoaXRlY3RlZDp7bmFtZToiV2VsbEFyY2hpdGVjdGVkIn0sbGV4bW9kZWxzdjI6e3ByZWZpeDoibW9kZWxzLmxleC52MiIsbmFtZToiTGV4TW9kZWxzVjIifSxsZXhydW50aW1ldjI6e3ByZWZpeDoicnVudGltZS5sZXgudjIiLG5hbWU6IkxleFJ1bnRpbWVWMiIsY29yczohMH0sZmlzOntuYW1lOiJGaXMifSxsb29rb3V0bWV0cmljczp7bmFtZToiTG9va291dE1ldHJpY3MifSxtZ246e25hbWU6Ik1nbiJ9LGxvb2tvdXRlcXVpcG1lbnQ6e25hbWU6Ikxvb2tvdXRFcXVpcG1lbnQifSxuaW1ibGU6e25hbWU6Ik5pbWJsZSJ9LGZpbnNwYWNlOntuYW1lOiJGaW5zcGFjZSJ9LGZpbnNwYWNlZGF0YTp7cHJlZml4OiJmaW5zcGFjZS1kYXRhIixuYW1lOiJGaW5zcGFjZWRhdGEifSxzc21jb250YWN0czp7cHJlZml4OiJzc20tY29udGFjdHMiLG5hbWU6IlNTTUNvbnRhY3RzIn0sc3NtaW5jaWRlbnRzOntwcmVmaXg6InNzbS1pbmNpZGVudHMiLG5hbWU6IlNTTUluY2lkZW50cyJ9LGFwcGxpY2F0aW9uY29zdHByb2ZpbGVyOntuYW1lOiJBcHBsaWNhdGlvbkNvc3RQcm9maWxlciJ9LGFwcHJ1bm5lcjp7bmFtZToiQXBwUnVubmVyIn0scHJvdG9uOntuYW1lOiJQcm90b24ifSxyb3V0ZTUzcmVjb3ZlcnljbHVzdGVyOntwcmVmaXg6InJvdXRlNTMtcmVjb3ZlcnktY2x1c3RlciIsbmFtZToiUm91dGU1M1JlY292ZXJ5Q2x1c3RlciJ9LHJvdXRlNTNyZWNvdmVyeWNvbnRyb2xjb25maWc6e3ByZWZpeDoicm91dGU1My1yZWNvdmVyeS1jb250cm9sLWNvbmZpZyIsbmFtZToiUm91dGU1M1JlY292ZXJ5Q29udHJvbENvbmZpZyJ9LHJvdXRlNTNyZWNvdmVyeXJlYWRpbmVzczp7cHJlZml4OiJyb3V0ZTUzLXJlY292ZXJ5LXJlYWRpbmVzcyIsbmFtZToiUm91dGU1M1JlY292ZXJ5UmVhZGluZXNzIn0sY2hpbWVzZGtpZGVudGl0eTp7cHJlZml4OiJjaGltZS1zZGstaWRlbnRpdHkiLG5hbWU6IkNoaW1lU0RLSWRlbnRpdHkifSxjaGltZXNka21lc3NhZ2luZzp7cHJlZml4OiJjaGltZS1zZGstbWVzc2FnaW5nIixuYW1lOiJDaGltZVNES01lc3NhZ2luZyJ9LHNub3dkZXZpY2VtYW5hZ2VtZW50OntwcmVmaXg6InNub3ctZGV2aWNlLW1hbmFnZW1lbnQiLG5hbWU6IlNub3dEZXZpY2VNYW5hZ2VtZW50In0sbWVtb3J5ZGI6e25hbWU6Ik1lbW9yeURCIn0sb3BlbnNlYXJjaDp7bmFtZToiT3BlblNlYXJjaCJ9LGthZmthY29ubmVjdDp7bmFtZToiS2Fma2FDb25uZWN0In0sdm9pY2VpZDp7cHJlZml4OiJ2b2ljZS1pZCIsbmFtZToiVm9pY2VJRCJ9LHdpc2RvbTp7bmFtZToiV2lzZG9tIn0sYWNjb3VudDp7bmFtZToiQWNjb3VudCJ9LGNsb3VkY29udHJvbDp7bmFtZToiQ2xvdWRDb250cm9sIn0sZ3JhZmFuYTp7bmFtZToiR3JhZmFuYSJ9LHBhbm9yYW1hOntuYW1lOiJQYW5vcmFtYSJ9LGNoaW1lc2RrbWVldGluZ3M6e3ByZWZpeDoiY2hpbWUtc2RrLW1lZXRpbmdzIixuYW1lOiJDaGltZVNES01lZXRpbmdzIn0scmVzaWxpZW5jZWh1Yjp7bmFtZToiUmVzaWxpZW5jZWh1YiJ9LG1pZ3JhdGlvbmh1YnN0cmF0ZWd5OntuYW1lOiJNaWdyYXRpb25IdWJTdHJhdGVneSJ9LGFwcGNvbmZpZ2RhdGE6e25hbWU6IkFwcENvbmZpZ0RhdGEifSxkcnM6e25hbWU6IkRycyJ9LG1pZ3JhdGlvbmh1YnJlZmFjdG9yc3BhY2VzOntwcmVmaXg6Im1pZ3JhdGlvbi1odWItcmVmYWN0b3Itc3BhY2VzIixuYW1lOiJNaWdyYXRpb25IdWJSZWZhY3RvclNwYWNlcyJ9LGV2aWRlbnRseTp7bmFtZToiRXZpZGVudGx5In0saW5zcGVjdG9yMjp7bmFtZToiSW5zcGVjdG9yMiJ9LHJiaW46e25hbWU6IlJiaW4ifSxydW06e25hbWU6IlJVTSJ9LGJhY2t1cGdhdGV3YXk6e3ByZWZpeDoiYmFja3VwLWdhdGV3YXkiLG5hbWU6IkJhY2t1cEdhdGV3YXkifSxpb3R0d2lubWFrZXI6e25hbWU6IklvVFR3aW5NYWtlciJ9LHdvcmtzcGFjZXN3ZWI6e3ByZWZpeDoid29ya3NwYWNlcy13ZWIiLG5hbWU6IldvcmtTcGFjZXNXZWIifSxhbXBsaWZ5dWlidWlsZGVyOntuYW1lOiJBbXBsaWZ5VUlCdWlsZGVyIn0sa2V5c3BhY2VzOntuYW1lOiJLZXlzcGFjZXMifSxiaWxsaW5nY29uZHVjdG9yOntuYW1lOiJCaWxsaW5nY29uZHVjdG9yIn0sZ2FtZXNwYXJrczp7bmFtZToiR2FtZVNwYXJrcyJ9LHBpbnBvaW50c21zdm9pY2V2Mjp7cHJlZml4OiJwaW5wb2ludC1zbXMtdm9pY2UtdjIiLG5hbWU6IlBpbnBvaW50U01TVm9pY2VWMiJ9LGl2c2NoYXQ6e25hbWU6Ikl2c2NoYXQifSxjaGltZXNka21lZGlhcGlwZWxpbmVzOntwcmVmaXg6ImNoaW1lLXNkay1tZWRpYS1waXBlbGluZXMiLG5hbWU6IkNoaW1lU0RLTWVkaWFQaXBlbGluZXMifSxlbXJzZXJ2ZXJsZXNzOntwcmVmaXg6ImVtci1zZXJ2ZXJsZXNzIixuYW1lOiJFTVJTZXJ2ZXJsZXNzIn0sbTI6e25hbWU6Ik0yIn0sY29ubmVjdGNhbXBhaWduczp7bmFtZToiQ29ubmVjdENhbXBhaWducyJ9LHJlZHNoaWZ0c2VydmVybGVzczp7cHJlZml4OiJyZWRzaGlmdC1zZXJ2ZXJsZXNzIixuYW1lOiJSZWRzaGlmdFNlcnZlcmxlc3MifSxyb2xlc2FueXdoZXJlOntuYW1lOiJSb2xlc0FueXdoZXJlIn0sbGljZW5zZW1hbmFnZXJ1c2Vyc3Vic2NyaXB0aW9uczp7cHJlZml4OiJsaWNlbnNlLW1hbmFnZXItdXNlci1zdWJzY3JpcHRpb25zIixuYW1lOiJMaWNlbnNlTWFuYWdlclVzZXJTdWJzY3JpcHRpb25zIn0sYmFja3Vwc3RvcmFnZTp7bmFtZToiQmFja3VwU3RvcmFnZSJ9LHByaXZhdGVuZXR3b3Jrczp7bmFtZToiUHJpdmF0ZU5ldHdvcmtzIn0sc3VwcG9ydGFwcDp7cHJlZml4OiJzdXBwb3J0LWFwcCIsbmFtZToiU3VwcG9ydEFwcCJ9LGNvbnRyb2x0b3dlcjp7bmFtZToiQ29udHJvbFRvd2VyIn0saW90ZmxlZXR3aXNlOntuYW1lOiJJb1RGbGVldFdpc2UifSxtaWdyYXRpb25odWJvcmNoZXN0cmF0b3I6e25hbWU6Ik1pZ3JhdGlvbkh1Yk9yY2hlc3RyYXRvciJ9LGNvbm5lY3RjYXNlczp7bmFtZToiQ29ubmVjdENhc2VzIn0scmVzb3VyY2VleHBsb3JlcjI6e3ByZWZpeDoicmVzb3VyY2UtZXhwbG9yZXItMiIsbmFtZToiUmVzb3VyY2VFeHBsb3JlcjIifSxzY2hlZHVsZXI6e25hbWU6IlNjaGVkdWxlciJ9LGNoaW1lc2Rrdm9pY2U6e3ByZWZpeDoiY2hpbWUtc2RrLXZvaWNlIixuYW1lOiJDaGltZVNES1ZvaWNlIn0saW90cm9ib3J1bm5lcjp7cHJlZml4OiJpb3Qtcm9ib3J1bm5lciIsbmFtZToiSW9UUm9ib1J1bm5lciJ9LHNzbXNhcDp7cHJlZml4OiJzc20tc2FwIixuYW1lOiJTc21TYXAifSxvYW06e25hbWU6Ik9BTSJ9LGFyY3pvbmFsc2hpZnQ6e3ByZWZpeDoiYXJjLXpvbmFsLXNoaWZ0IixuYW1lOiJBUkNab25hbFNoaWZ0In0sb21pY3M6e25hbWU6Ik9taWNzIn0sb3BlbnNlYXJjaHNlcnZlcmxlc3M6e25hbWU6Ik9wZW5TZWFyY2hTZXJ2ZXJsZXNzIn0sc2VjdXJpdHlsYWtlOntuYW1lOiJTZWN1cml0eUxha2UifSxzaW1zcGFjZXdlYXZlcjp7bmFtZToiU2ltU3BhY2VXZWF2ZXIifSxkb2NkYmVsYXN0aWM6e3ByZWZpeDoiZG9jZGItZWxhc3RpYyIsbmFtZToiRG9jREJFbGFzdGljIn0sc2FnZW1ha2VyZ2Vvc3BhdGlhbDp7cHJlZml4OiJzYWdlbWFrZXItZ2Vvc3BhdGlhbCIsbmFtZToiU2FnZU1ha2VyR2Vvc3BhdGlhbCJ9LGNvZGVjYXRhbHlzdDp7bmFtZToiQ29kZUNhdGFseXN0In0scGlwZXM6e25hbWU6IlBpcGVzIn0sc2FnZW1ha2VybWV0cmljczp7cHJlZml4OiJzYWdlbWFrZXItbWV0cmljcyIsbmFtZToiU2FnZU1ha2VyTWV0cmljcyJ9LGtpbmVzaXN2aWRlb3dlYnJ0Y3N0b3JhZ2U6e3ByZWZpeDoia2luZXNpcy12aWRlby13ZWJydGMtc3RvcmFnZSIsbmFtZToiS2luZXNpc1ZpZGVvV2ViUlRDU3RvcmFnZSJ9LGxpY2Vuc2VtYW5hZ2VybGludXhzdWJzY3JpcHRpb25zOntwcmVmaXg6ImxpY2Vuc2UtbWFuYWdlci1saW51eC1zdWJzY3JpcHRpb25zIixuYW1lOiJMaWNlbnNlTWFuYWdlckxpbnV4U3Vic2NyaXB0aW9ucyJ9LGtlbmRyYXJhbmtpbmc6e3ByZWZpeDoia2VuZHJhLXJhbmtpbmciLG5hbWU6IktlbmRyYVJhbmtpbmcifSxjbGVhbnJvb21zOntuYW1lOiJDbGVhblJvb21zIn0sY2xvdWR0cmFpbGRhdGE6e3ByZWZpeDoiY2xvdWR0cmFpbC1kYXRhIixuYW1lOiJDbG91ZFRyYWlsRGF0YSJ9LHRuYjp7bmFtZToiVG5iIn0saW50ZXJuZXRtb25pdG9yOntuYW1lOiJJbnRlcm5ldE1vbml0b3IifSxpdnNyZWFsdGltZTp7cHJlZml4OiJpdnMtcmVhbHRpbWUiLG5hbWU6IklWU1JlYWxUaW1lIn0sdnBjbGF0dGljZTp7cHJlZml4OiJ2cGMtbGF0dGljZSIsbmFtZToiVlBDTGF0dGljZSJ9LG9zaXM6e25hbWU6Ik9TSVMifSxtZWRpYXBhY2thZ2V2Mjp7bmFtZToiTWVkaWFQYWNrYWdlVjIifSxwYXltZW50Y3J5cHRvZ3JhcGh5OntwcmVmaXg6InBheW1lbnQtY3J5cHRvZ3JhcGh5IixuYW1lOiJQYXltZW50Q3J5cHRvZ3JhcGh5In0scGF5bWVudGNyeXB0b2dyYXBoeWRhdGE6e3ByZWZpeDoicGF5bWVudC1jcnlwdG9ncmFwaHktZGF0YSIsbmFtZToiUGF5bWVudENyeXB0b2dyYXBoeURhdGEifSxjb2RlZ3VydXNlY3VyaXR5OntwcmVmaXg6ImNvZGVndXJ1LXNlY3VyaXR5IixuYW1lOiJDb2RlR3VydVNlY3VyaXR5In0sdmVyaWZpZWRwZXJtaXNzaW9uczp7bmFtZToiVmVyaWZpZWRQZXJtaXNzaW9ucyJ9LGFwcGZhYnJpYzp7bmFtZToiQXBwRmFicmljIn0sbWVkaWNhbGltYWdpbmc6e3ByZWZpeDoibWVkaWNhbC1pbWFnaW5nIixuYW1lOiJNZWRpY2FsSW1hZ2luZyJ9LGVudGl0eXJlc29sdXRpb246e25hbWU6IkVudGl0eVJlc29sdXRpb24ifSxtYW5hZ2VkYmxvY2tjaGFpbnF1ZXJ5OntwcmVmaXg6Im1hbmFnZWRibG9ja2NoYWluLXF1ZXJ5IixuYW1lOiJNYW5hZ2VkQmxvY2tjaGFpblF1ZXJ5In0sbmVwdHVuZWRhdGE6e25hbWU6Ik5lcHR1bmVkYXRhIn0scGNhY29ubmVjdG9yYWQ6e3ByZWZpeDoicGNhLWNvbm5lY3Rvci1hZCIsbmFtZToiUGNhQ29ubmVjdG9yQWQifX19LHt9XSw1OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXt2ZXJzaW9uOiIyLjAiLG1ldGFkYXRhOnthcGlWZXJzaW9uOiIyMDExLTA2LTE1IixlbmRwb2ludFByZWZpeDoic3RzIixnbG9iYWxFbmRwb2ludDoic3RzLmFtYXpvbmF3cy5jb20iLHByb3RvY29sOiJxdWVyeSIsc2VydmljZUFiYnJldmlhdGlvbjoiQVdTIFNUUyIsc2VydmljZUZ1bGxOYW1lOiJBV1MgU2VjdXJpdHkgVG9rZW4gU2VydmljZSIsc2VydmljZUlkOiJTVFMiLHNpZ25hdHVyZVZlcnNpb246InY0Iix1aWQ6InN0cy0yMDExLTA2LTE1Iix4bWxOYW1lc3BhY2U6Imh0dHBzOi8vc3RzLmFtYXpvbmF3cy5jb20vZG9jLzIwMTEtMDYtMTUvIn0sb3BlcmF0aW9uczp7QXNzdW1lUm9sZTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJSb2xlQXJuIiwiUm9sZVNlc3Npb25OYW1lIl0sbWVtYmVyczp7Um9sZUFybjp7fSxSb2xlU2Vzc2lvbk5hbWU6e30sUG9saWN5QXJuczp7c2hhcGU6IlM0In0sUG9saWN5Ont9LER1cmF0aW9uU2Vjb25kczp7dHlwZToiaW50ZWdlciJ9LFRhZ3M6e3NoYXBlOiJTOCJ9LFRyYW5zaXRpdmVUYWdLZXlzOnt0eXBlOiJsaXN0IixtZW1iZXI6e319LEV4dGVybmFsSWQ6e30sU2VyaWFsTnVtYmVyOnt9LFRva2VuQ29kZTp7fSxTb3VyY2VJZGVudGl0eTp7fSxQcm92aWRlZENvbnRleHRzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7UHJvdmlkZXJBcm46e30sQ29udGV4dEFzc2VydGlvbjp7fX19fX19LG91dHB1dDp7cmVzdWx0V3JhcHBlcjoiQXNzdW1lUm9sZVJlc3VsdCIsdHlwZToic3RydWN0dXJlIixtZW1iZXJzOntDcmVkZW50aWFsczp7c2hhcGU6IlNsIn0sQXNzdW1lZFJvbGVVc2VyOntzaGFwZToiU3EifSxQYWNrZWRQb2xpY3lTaXplOnt0eXBlOiJpbnRlZ2VyIn0sU291cmNlSWRlbnRpdHk6e319fX0sQXNzdW1lUm9sZVdpdGhTQU1MOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIlJvbGVBcm4iLCJQcmluY2lwYWxBcm4iLCJTQU1MQXNzZXJ0aW9uIl0sbWVtYmVyczp7Um9sZUFybjp7fSxQcmluY2lwYWxBcm46e30sU0FNTEFzc2VydGlvbjp7dHlwZToic3RyaW5nIixzZW5zaXRpdmU6ITB9LFBvbGljeUFybnM6e3NoYXBlOiJTNCJ9LFBvbGljeTp7fSxEdXJhdGlvblNlY29uZHM6e3R5cGU6ImludGVnZXIifX19LG91dHB1dDp7cmVzdWx0V3JhcHBlcjoiQXNzdW1lUm9sZVdpdGhTQU1MUmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0NyZWRlbnRpYWxzOntzaGFwZToiU2wifSxBc3N1bWVkUm9sZVVzZXI6e3NoYXBlOiJTcSJ9LFBhY2tlZFBvbGljeVNpemU6e3R5cGU6ImludGVnZXIifSxTdWJqZWN0Ont9LFN1YmplY3RUeXBlOnt9LElzc3Vlcjp7fSxBdWRpZW5jZTp7fSxOYW1lUXVhbGlmaWVyOnt9LFNvdXJjZUlkZW50aXR5Ont9fX19LEFzc3VtZVJvbGVXaXRoV2ViSWRlbnRpdHk6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUm9sZUFybiIsIlJvbGVTZXNzaW9uTmFtZSIsIldlYklkZW50aXR5VG9rZW4iXSxtZW1iZXJzOntSb2xlQXJuOnt9LFJvbGVTZXNzaW9uTmFtZTp7fSxXZWJJZGVudGl0eVRva2VuOnt0eXBlOiJzdHJpbmciLHNlbnNpdGl2ZTohMH0sUHJvdmlkZXJJZDp7fSxQb2xpY3lBcm5zOntzaGFwZToiUzQifSxQb2xpY3k6e30sRHVyYXRpb25TZWNvbmRzOnt0eXBlOiJpbnRlZ2VyIn19fSxvdXRwdXQ6e3Jlc3VsdFdyYXBwZXI6IkFzc3VtZVJvbGVXaXRoV2ViSWRlbnRpdHlSZXN1bHQiLHR5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7Q3JlZGVudGlhbHM6e3NoYXBlOiJTbCJ9LFN1YmplY3RGcm9tV2ViSWRlbnRpdHlUb2tlbjp7fSxBc3N1bWVkUm9sZVVzZXI6e3NoYXBlOiJTcSJ9LFBhY2tlZFBvbGljeVNpemU6e3R5cGU6ImludGVnZXIifSxQcm92aWRlcjp7fSxBdWRpZW5jZTp7fSxTb3VyY2VJZGVudGl0eTp7fX19fSxEZWNvZGVBdXRob3JpemF0aW9uTWVzc2FnZTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJFbmNvZGVkTWVzc2FnZSJdLG1lbWJlcnM6e0VuY29kZWRNZXNzYWdlOnt9fX0sb3V0cHV0OntyZXN1bHRXcmFwcGVyOiJEZWNvZGVBdXRob3JpemF0aW9uTWVzc2FnZVJlc3VsdCIsdHlwZToic3RydWN0dXJlIixtZW1iZXJzOntEZWNvZGVkTWVzc2FnZTp7fX19fSxHZXRBY2Nlc3NLZXlJbmZvOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIkFjY2Vzc0tleUlkIl0sbWVtYmVyczp7QWNjZXNzS2V5SWQ6e319fSxvdXRwdXQ6e3Jlc3VsdFdyYXBwZXI6IkdldEFjY2Vzc0tleUluZm9SZXN1bHQiLHR5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7QWNjb3VudDp7fX19fSxHZXRDYWxsZXJJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX0sb3V0cHV0OntyZXN1bHRXcmFwcGVyOiJHZXRDYWxsZXJJZGVudGl0eVJlc3VsdCIsdHlwZToic3RydWN0dXJlIixtZW1iZXJzOntVc2VySWQ6e30sQWNjb3VudDp7fSxBcm46e319fX0sR2V0RmVkZXJhdGlvblRva2VuOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIk5hbWUiXSxtZW1iZXJzOntOYW1lOnt9LFBvbGljeTp7fSxQb2xpY3lBcm5zOntzaGFwZToiUzQifSxEdXJhdGlvblNlY29uZHM6e3R5cGU6ImludGVnZXIifSxUYWdzOntzaGFwZToiUzgifX19LG91dHB1dDp7cmVzdWx0V3JhcHBlcjoiR2V0RmVkZXJhdGlvblRva2VuUmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0NyZWRlbnRpYWxzOntzaGFwZToiU2wifSxGZWRlcmF0ZWRVc2VyOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiRmVkZXJhdGVkVXNlcklkIiwiQXJuIl0sbWVtYmVyczp7RmVkZXJhdGVkVXNlcklkOnt9LEFybjp7fX19LFBhY2tlZFBvbGljeVNpemU6e3R5cGU6ImludGVnZXIifX19fSxHZXRTZXNzaW9uVG9rZW46e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0R1cmF0aW9uU2Vjb25kczp7dHlwZToiaW50ZWdlciJ9LFNlcmlhbE51bWJlcjp7fSxUb2tlbkNvZGU6e319fSxvdXRwdXQ6e3Jlc3VsdFdyYXBwZXI6IkdldFNlc3Npb25Ub2tlblJlc3VsdCIsdHlwZToic3RydWN0dXJlIixtZW1iZXJzOntDcmVkZW50aWFsczp7c2hhcGU6IlNsIn19fX19LHNoYXBlczp7UzQ6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnthcm46e319fX0sUzg6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIktleSIsIlZhbHVlIl0sbWVtYmVyczp7S2V5Ont9LFZhbHVlOnt9fX19LFNsOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiQWNjZXNzS2V5SWQiLCJTZWNyZXRBY2Nlc3NLZXkiLCJTZXNzaW9uVG9rZW4iLCJFeHBpcmF0aW9uIl0sbWVtYmVyczp7QWNjZXNzS2V5SWQ6e30sU2VjcmV0QWNjZXNzS2V5Ont0eXBlOiJzdHJpbmciLHNlbnNpdGl2ZTohMH0sU2Vzc2lvblRva2VuOnt9LEV4cGlyYXRpb246e3R5cGU6InRpbWVzdGFtcCJ9fX0sU3E6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJBc3N1bWVkUm9sZUlkIiwiQXJuIl0sbWVtYmVyczp7QXNzdW1lZFJvbGVJZDp7fSxBcm46e319fX19fSx7fV0sNjpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17cGFnaW5hdGlvbjp7fX19LHt9XSw3OltmdW5jdGlvbihlLHQsbil7ZSgiLi4vbGliL25vZGVfbG9hZGVyIik7dmFyIHI9ZSgiLi4vbGliL2NvcmUiKSxvPXIuU2VydmljZSxpPXIuYXBpTG9hZGVyO2kuc2VydmljZXMuY29nbml0b2lkZW50aXR5PXt9LHIuQ29nbml0b0lkZW50aXR5PW8uZGVmaW5lU2VydmljZSgiY29nbml0b2lkZW50aXR5IixbIjIwMTQtMDYtMzAiXSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGkuc2VydmljZXMuY29nbml0b2lkZW50aXR5LCIyMDE0LTA2LTMwIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9ZSgiLi4vYXBpcy9jb2duaXRvLWlkZW50aXR5LTIwMTQtMDYtMzAubWluLmpzb24iKTtyZXR1cm4gdC5wYWdpbmF0b3JzPWUoIi4uL2FwaXMvY29nbml0by1pZGVudGl0eS0yMDE0LTA2LTMwLnBhZ2luYXRvcnMuanNvbiIpLnBhZ2luYXRpb24sdH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LmV4cG9ydHM9ci5Db2duaXRvSWRlbnRpdHl9LHsiLi4vYXBpcy9jb2duaXRvLWlkZW50aXR5LTIwMTQtMDYtMzAubWluLmpzb24iOjEsIi4uL2FwaXMvY29nbml0by1pZGVudGl0eS0yMDE0LTA2LTMwLnBhZ2luYXRvcnMuanNvbiI6MiwiLi4vbGliL2NvcmUiOjE5LCIuLi9saWIvbm9kZV9sb2FkZXIiOjE2fV0sODpbZnVuY3Rpb24oZSx0LG4pe2UoIi4uL2xpYi9ub2RlX2xvYWRlciIpO3ZhciByPWUoIi4uL2xpYi9jb3JlIiksbz1yLlNlcnZpY2UsaT1yLmFwaUxvYWRlcjtpLnNlcnZpY2VzLnN0cz17fSxyLlNUUz1vLmRlZmluZVNlcnZpY2UoInN0cyIsWyIyMDExLTA2LTE1Il0pLGUoIi4uL2xpYi9zZXJ2aWNlcy9zdHMiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaS5zZXJ2aWNlcy5zdHMsIjIwMTEtMDYtMTUiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1lKCIuLi9hcGlzL3N0cy0yMDExLTA2LTE1Lm1pbi5qc29uIik7cmV0dXJuIHQucGFnaW5hdG9ycz1lKCIuLi9hcGlzL3N0cy0yMDExLTA2LTE1LnBhZ2luYXRvcnMuanNvbiIpLnBhZ2luYXRpb24sdH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LmV4cG9ydHM9ci5TVFN9LHsiLi4vYXBpcy9zdHMtMjAxMS0wNi0xNS5taW4uanNvbiI6NSwiLi4vYXBpcy9zdHMtMjAxMS0wNi0xNS5wYWdpbmF0b3JzLmpzb24iOjYsIi4uL2xpYi9jb3JlIjoxOSwiLi4vbGliL25vZGVfbG9hZGVyIjoxNiwiLi4vbGliL3NlcnZpY2VzL3N0cyI6NjN9XSw5OltmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihlLHQpe2lmKCFyLnNlcnZpY2VzLmhhc093blByb3BlcnR5KGUpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZFNlcnZpY2U6IEZhaWxlZCB0byBsb2FkIGFwaSBmb3IgIitlKTtyZXR1cm4gci5zZXJ2aWNlc1tlXVt0XX1yLnNlcnZpY2VzPXt9LHQuZXhwb3J0cz1yfSx7fV0sMTA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2Jyb3dzZXJIbWFjIiksbz1lKCIuL2Jyb3dzZXJNZDUiKSxpPWUoIi4vYnJvd3NlclNoYTEiKSxzPWUoIi4vYnJvd3NlclNoYTI1NiIpO3QuZXhwb3J0cz17Y3JlYXRlSGFzaDpmdW5jdGlvbihlKXtpZigibWQ1Ij09PShlPWUudG9Mb3dlckNhc2UoKSkpcmV0dXJuIG5ldyBvO2lmKCJzaGEyNTYiPT09ZSlyZXR1cm4gbmV3IHM7aWYoInNoYTEiPT09ZSlyZXR1cm4gbmV3IGk7dGhyb3cgbmV3IEVycm9yKCJIYXNoIGFsZ29yaXRobSAiK2UrIiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIFNESyIpfSxjcmVhdGVIbWFjOmZ1bmN0aW9uKGUsdCl7aWYoIm1kNSI9PT0oZT1lLnRvTG93ZXJDYXNlKCkpKXJldHVybiBuZXcgcihvLHQpO2lmKCJzaGEyNTYiPT09ZSlyZXR1cm4gbmV3IHIocyx0KTtpZigic2hhMSI9PT1lKXJldHVybiBuZXcgcihpLHQpO3Rocm93IG5ldyBFcnJvcigiSE1BQyBhbGdvcml0aG0gIitlKyIgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgYnJvd3NlciBTREsiKX0sY3JlYXRlU2lnbjpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiY3JlYXRlU2lnbiBpcyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIGJyb3dzZXIiKX19fSx7Ii4vYnJvd3NlckhtYWMiOjEyLCIuL2Jyb3dzZXJNZDUiOjEzLCIuL2Jyb3dzZXJTaGExIjoxNCwiLi9icm93c2VyU2hhMjU2IjoxNX1dLDExOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiYnVmZmVyLyIpLkJ1ZmZlcjsidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ2b2lkIDA9PT1BcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXc9ZnVuY3Rpb24oZSl7cmV0dXJuIG8uaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkpPi0xfSk7dmFyIG89WyJbb2JqZWN0IEludDhBcnJheV0iLCJbb2JqZWN0IFVpbnQ4QXJyYXldIiwiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLCJbb2JqZWN0IEludDE2QXJyYXldIiwiW29iamVjdCBVaW50MTZBcnJheV0iLCJbb2JqZWN0IEludDMyQXJyYXldIiwiW29iamVjdCBVaW50MzJBcnJheV0iLCJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLCJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLCJbb2JqZWN0IERhdGFWaWV3XSJdO3QuZXhwb3J0cz17aXNFbXB0eURhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlPzA9PT1lLmxlbmd0aDowPT09ZS5ieXRlTGVuZ3RofSxjb252ZXJ0VG9CdWZmZXI6ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlJiYoZT1uZXcgcihlLCJ1dGY4IikpLEFycmF5QnVmZmVyLmlzVmlldyhlKT9uZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoL1VpbnQ4QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOm5ldyBVaW50OEFycmF5KGUpfX19LHsiYnVmZmVyLyI6ODZ9XSwxMjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vYnJvd3Nlckhhc2hVdGlscyIpO2Z1bmN0aW9uIG8oZSx0KXt0aGlzLmhhc2g9bmV3IGUsdGhpcy5vdXRlcj1uZXcgZTt2YXIgbj1mdW5jdGlvbihlLHQpe3ZhciBuPXIuY29udmVydFRvQnVmZmVyKHQpO2lmKG4uYnl0ZUxlbmd0aD5lLkJMT0NLX1NJWkUpe3ZhciBvPW5ldyBlO28udXBkYXRlKG4pLG49by5kaWdlc3QoKX12YXIgaT1uZXcgVWludDhBcnJheShlLkJMT0NLX1NJWkUpO3JldHVybiBpLnNldChuKSxpfShlLHQpLG89bmV3IFVpbnQ4QXJyYXkoZS5CTE9DS19TSVpFKTtvLnNldChuKTtmb3IodmFyIGk9MDtpPGUuQkxPQ0tfU0laRTtpKyspbltpXV49NTQsb1tpXV49OTI7Zm9yKHRoaXMuaGFzaC51cGRhdGUobiksdGhpcy5vdXRlci51cGRhdGUobyksaT0wO2k8bi5ieXRlTGVuZ3RoO2krKyluW2ldPTB9dC5leHBvcnRzPW8sby5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe2lmKHIuaXNFbXB0eURhdGEoZSl8fHRoaXMuZXJyb3IpcmV0dXJuIHRoaXM7dHJ5e3RoaXMuaGFzaC51cGRhdGUoci5jb252ZXJ0VG9CdWZmZXIoZSkpfWNhdGNoKGUpe3RoaXMuZXJyb3I9ZX1yZXR1cm4gdGhpc30sby5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm91dGVyLmZpbmlzaGVkfHx0aGlzLm91dGVyLnVwZGF0ZSh0aGlzLmhhc2guZGlnZXN0KCkpLHRoaXMub3V0ZXIuZGlnZXN0KGUpfX0seyIuL2Jyb3dzZXJIYXNoVXRpbHMiOjExfV0sMTM6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2Jyb3dzZXJIYXNoVXRpbHMiKSxvPWUoImJ1ZmZlci8iKS5CdWZmZXIsaT02NDtmdW5jdGlvbiBzKCl7dGhpcy5zdGF0ZT1bMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4XSx0aGlzLmJ1ZmZlcj1uZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKGkpKSx0aGlzLmJ1ZmZlckxlbmd0aD0wLHRoaXMuYnl0ZXNIYXNoZWQ9MCx0aGlzLmZpbmlzaGVkPSExfWZ1bmN0aW9uIGEoZSx0LG4scixvLGkpe3JldHVybigodD0odCtlJjQyOTQ5NjcyOTUpKyhyK2kmNDI5NDk2NzI5NSkmNDI5NDk2NzI5NSk8PG98dD4+PjMyLW8pK24mNDI5NDk2NzI5NX1mdW5jdGlvbiBjKGUsdCxuLHIsbyxpLHMpe3JldHVybiBhKHQmbnx+dCZyLGUsdCxvLGkscyl9ZnVuY3Rpb24gdShlLHQsbixyLG8saSxzKXtyZXR1cm4gYSh0JnJ8biZ+cixlLHQsbyxpLHMpfWZ1bmN0aW9uIGwoZSx0LG4scixvLGkscyl7cmV0dXJuIGEodF5uXnIsZSx0LG8saSxzKX1mdW5jdGlvbiBwKGUsdCxuLHIsbyxpLHMpe3JldHVybiBhKG5eKHR8fnIpLGUsdCxvLGkscyl9dC5leHBvcnRzPXMscy5CTE9DS19TSVpFPWkscy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe2lmKHIuaXNFbXB0eURhdGEoZSkpcmV0dXJuIHRoaXM7aWYodGhpcy5maW5pc2hlZCl0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHRlZCB0byB1cGRhdGUgYW4gYWxyZWFkeSBmaW5pc2hlZCBoYXNoLiIpO3ZhciB0PXIuY29udmVydFRvQnVmZmVyKGUpLG49MCxvPXQuYnl0ZUxlbmd0aDtmb3IodGhpcy5ieXRlc0hhc2hlZCs9bztvPjA7KXRoaXMuYnVmZmVyLnNldFVpbnQ4KHRoaXMuYnVmZmVyTGVuZ3RoKyssdFtuKytdKSxvLS0sdGhpcy5idWZmZXJMZW5ndGg9PT1pJiYodGhpcy5oYXNoQnVmZmVyKCksdGhpcy5idWZmZXJMZW5ndGg9MCk7cmV0dXJuIHRoaXN9LHMucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbihlKXtpZighdGhpcy5maW5pc2hlZCl7dmFyIHQ9dGhpcyxuPXQuYnVmZmVyLHI9dC5idWZmZXJMZW5ndGgscz04KnQuYnl0ZXNIYXNoZWQ7aWYobi5zZXRVaW50OCh0aGlzLmJ1ZmZlckxlbmd0aCsrLDEyOCksciVpPj01Nil7Zm9yKHZhciBhPXRoaXMuYnVmZmVyTGVuZ3RoO2E8aTthKyspbi5zZXRVaW50OChhLDApO3RoaXMuaGFzaEJ1ZmZlcigpLHRoaXMuYnVmZmVyTGVuZ3RoPTB9Zm9yKGE9dGhpcy5idWZmZXJMZW5ndGg7YTw1NjthKyspbi5zZXRVaW50OChhLDApO24uc2V0VWludDMyKDU2LHM+Pj4wLCEwKSxuLnNldFVpbnQzMig2MCxNYXRoLmZsb29yKHMvNDI5NDk2NzI5NiksITApLHRoaXMuaGFzaEJ1ZmZlcigpLHRoaXMuZmluaXNoZWQ9ITB9dmFyIGM9bmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxNikpO2ZvcihhPTA7YTw0O2ErKyljLnNldFVpbnQzMig0KmEsdGhpcy5zdGF0ZVthXSwhMCk7dmFyIHU9bmV3IG8oYy5idWZmZXIsYy5ieXRlT2Zmc2V0LGMuYnl0ZUxlbmd0aCk7cmV0dXJuIGU/dS50b1N0cmluZyhlKTp1fSxzLnByb3RvdHlwZS5oYXNoQnVmZmVyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5idWZmZXIsdD10aGlzLnN0YXRlLG49dFswXSxyPXRbMV0sbz10WzJdLGk9dFszXTtuPWMobixyLG8saSxlLmdldFVpbnQzMigwLCEwKSw3LDM2MTQwOTAzNjApLGk9YyhpLG4scixvLGUuZ2V0VWludDMyKDQsITApLDEyLDM5MDU0MDI3MTApLG89YyhvLGksbixyLGUuZ2V0VWludDMyKDgsITApLDE3LDYwNjEwNTgxOSkscj1jKHIsbyxpLG4sZS5nZXRVaW50MzIoMTIsITApLDIyLDMyNTA0NDE5NjYpLG49YyhuLHIsbyxpLGUuZ2V0VWludDMyKDE2LCEwKSw3LDQxMTg1NDgzOTkpLGk9YyhpLG4scixvLGUuZ2V0VWludDMyKDIwLCEwKSwxMiwxMjAwMDgwNDI2KSxvPWMobyxpLG4scixlLmdldFVpbnQzMigyNCwhMCksMTcsMjgyMTczNTk1NSkscj1jKHIsbyxpLG4sZS5nZXRVaW50MzIoMjgsITApLDIyLDQyNDkyNjEzMTMpLG49YyhuLHIsbyxpLGUuZ2V0VWludDMyKDMyLCEwKSw3LDE3NzAwMzU0MTYpLGk9YyhpLG4scixvLGUuZ2V0VWludDMyKDM2LCEwKSwxMiwyMzM2NTUyODc5KSxvPWMobyxpLG4scixlLmdldFVpbnQzMig0MCwhMCksMTcsNDI5NDkyNTIzMykscj1jKHIsbyxpLG4sZS5nZXRVaW50MzIoNDQsITApLDIyLDIzMDQ1NjMxMzQpLG49YyhuLHIsbyxpLGUuZ2V0VWludDMyKDQ4LCEwKSw3LDE4MDQ2MDM2ODIpLGk9YyhpLG4scixvLGUuZ2V0VWludDMyKDUyLCEwKSwxMiw0MjU0NjI2MTk1KSxvPWMobyxpLG4scixlLmdldFVpbnQzMig1NiwhMCksMTcsMjc5Mjk2NTAwNiksbj11KG4scj1jKHIsbyxpLG4sZS5nZXRVaW50MzIoNjAsITApLDIyLDEyMzY1MzUzMjkpLG8saSxlLmdldFVpbnQzMig0LCEwKSw1LDQxMjkxNzA3ODYpLGk9dShpLG4scixvLGUuZ2V0VWludDMyKDI0LCEwKSw5LDMyMjU0NjU2NjQpLG89dShvLGksbixyLGUuZ2V0VWludDMyKDQ0LCEwKSwxNCw2NDM3MTc3MTMpLHI9dShyLG8saSxuLGUuZ2V0VWludDMyKDAsITApLDIwLDM5MjEwNjk5OTQpLG49dShuLHIsbyxpLGUuZ2V0VWludDMyKDIwLCEwKSw1LDM1OTM0MDg2MDUpLGk9dShpLG4scixvLGUuZ2V0VWludDMyKDQwLCEwKSw5LDM4MDE2MDgzKSxvPXUobyxpLG4scixlLmdldFVpbnQzMig2MCwhMCksMTQsMzYzNDQ4ODk2MSkscj11KHIsbyxpLG4sZS5nZXRVaW50MzIoMTYsITApLDIwLDM4ODk0Mjk0NDgpLG49dShuLHIsbyxpLGUuZ2V0VWludDMyKDM2LCEwKSw1LDU2ODQ0NjQzOCksaT11KGksbixyLG8sZS5nZXRVaW50MzIoNTYsITApLDksMzI3NTE2MzYwNiksbz11KG8saSxuLHIsZS5nZXRVaW50MzIoMTIsITApLDE0LDQxMDc2MDMzMzUpLHI9dShyLG8saSxuLGUuZ2V0VWludDMyKDMyLCEwKSwyMCwxMTYzNTMxNTAxKSxuPXUobixyLG8saSxlLmdldFVpbnQzMig1MiwhMCksNSwyODUwMjg1ODI5KSxpPXUoaSxuLHIsbyxlLmdldFVpbnQzMig4LCEwKSw5LDQyNDM1NjM1MTIpLG89dShvLGksbixyLGUuZ2V0VWludDMyKDI4LCEwKSwxNCwxNzM1MzI4NDczKSxuPWwobixyPXUocixvLGksbixlLmdldFVpbnQzMig0OCwhMCksMjAsMjM2ODM1OTU2MiksbyxpLGUuZ2V0VWludDMyKDIwLCEwKSw0LDQyOTQ1ODg3MzgpLGk9bChpLG4scixvLGUuZ2V0VWludDMyKDMyLCEwKSwxMSwyMjcyMzkyODMzKSxvPWwobyxpLG4scixlLmdldFVpbnQzMig0NCwhMCksMTYsMTgzOTAzMDU2Mikscj1sKHIsbyxpLG4sZS5nZXRVaW50MzIoNTYsITApLDIzLDQyNTk2NTc3NDApLG49bChuLHIsbyxpLGUuZ2V0VWludDMyKDQsITApLDQsMjc2Mzk3NTIzNiksaT1sKGksbixyLG8sZS5nZXRVaW50MzIoMTYsITApLDExLDEyNzI4OTMzNTMpLG89bChvLGksbixyLGUuZ2V0VWludDMyKDI4LCEwKSwxNiw0MTM5NDY5NjY0KSxyPWwocixvLGksbixlLmdldFVpbnQzMig0MCwhMCksMjMsMzIwMDIzNjY1Niksbj1sKG4scixvLGksZS5nZXRVaW50MzIoNTIsITApLDQsNjgxMjc5MTc0KSxpPWwoaSxuLHIsbyxlLmdldFVpbnQzMigwLCEwKSwxMSwzOTM2NDMwMDc0KSxvPWwobyxpLG4scixlLmdldFVpbnQzMigxMiwhMCksMTYsMzU3MjQ0NTMxNykscj1sKHIsbyxpLG4sZS5nZXRVaW50MzIoMjQsITApLDIzLDc2MDI5MTg5KSxuPWwobixyLG8saSxlLmdldFVpbnQzMigzNiwhMCksNCwzNjU0NjAyODA5KSxpPWwoaSxuLHIsbyxlLmdldFVpbnQzMig0OCwhMCksMTEsMzg3MzE1MTQ2MSksbz1sKG8saSxuLHIsZS5nZXRVaW50MzIoNjAsITApLDE2LDUzMDc0MjUyMCksbj1wKG4scj1sKHIsbyxpLG4sZS5nZXRVaW50MzIoOCwhMCksMjMsMzI5OTYyODY0NSksbyxpLGUuZ2V0VWludDMyKDAsITApLDYsNDA5NjMzNjQ1MiksaT1wKGksbixyLG8sZS5nZXRVaW50MzIoMjgsITApLDEwLDExMjY4OTE0MTUpLG89cChvLGksbixyLGUuZ2V0VWludDMyKDU2LCEwKSwxNSwyODc4NjEyMzkxKSxyPXAocixvLGksbixlLmdldFVpbnQzMigyMCwhMCksMjEsNDIzNzUzMzI0MSksbj1wKG4scixvLGksZS5nZXRVaW50MzIoNDgsITApLDYsMTcwMDQ4NTU3MSksaT1wKGksbixyLG8sZS5nZXRVaW50MzIoMTIsITApLDEwLDIzOTk5ODA2OTApLG89cChvLGksbixyLGUuZ2V0VWludDMyKDQwLCEwKSwxNSw0MjkzOTE1NzczKSxyPXAocixvLGksbixlLmdldFVpbnQzMig0LCEwKSwyMSwyMjQwMDQ0NDk3KSxuPXAobixyLG8saSxlLmdldFVpbnQzMigzMiwhMCksNiwxODczMzEzMzU5KSxpPXAoaSxuLHIsbyxlLmdldFVpbnQzMig2MCwhMCksMTAsNDI2NDM1NTU1Miksbz1wKG8saSxuLHIsZS5nZXRVaW50MzIoMjQsITApLDE1LDI3MzQ3Njg5MTYpLHI9cChyLG8saSxuLGUuZ2V0VWludDMyKDUyLCEwKSwyMSwxMzA5MTUxNjQ5KSxuPXAobixyLG8saSxlLmdldFVpbnQzMigxNiwhMCksNiw0MTQ5NDQ0MjI2KSxpPXAoaSxuLHIsbyxlLmdldFVpbnQzMig0NCwhMCksMTAsMzE3NDc1NjkxNyksbz1wKG8saSxuLHIsZS5nZXRVaW50MzIoOCwhMCksMTUsNzE4Nzg3MjU5KSxyPXAocixvLGksbixlLmdldFVpbnQzMigzNiwhMCksMjEsMzk1MTQ4MTc0NSksdFswXT1uK3RbMF0mNDI5NDk2NzI5NSx0WzFdPXIrdFsxXSY0Mjk0OTY3Mjk1LHRbMl09byt0WzJdJjQyOTQ5NjcyOTUsdFszXT1pK3RbM10mNDI5NDk2NzI5NX19LHsiLi9icm93c2VySGFzaFV0aWxzIjoxMSwiYnVmZmVyLyI6ODZ9XSwxNDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoImJ1ZmZlci8iKS5CdWZmZXIsbz1lKCIuL2Jyb3dzZXJIYXNoVXRpbHMiKTtmdW5jdGlvbiBpKCl7dGhpcy5oMD0xNzMyNTg0MTkzLHRoaXMuaDE9NDAyMzIzMzQxNyx0aGlzLmgyPTI1NjIzODMxMDIsdGhpcy5oMz0yNzE3MzM4NzgsdGhpcy5oND0zMjg1Mzc3NTIwLHRoaXMuYmxvY2s9bmV3IFVpbnQzMkFycmF5KDgwKSx0aGlzLm9mZnNldD0wLHRoaXMuc2hpZnQ9MjQsdGhpcy50b3RhbExlbmd0aD0wfW5ldyBVaW50MzJBcnJheShbMTUxODUwMDI0OSwxODU5Nzc1MzkzLC0xODk0MDA3NTg4LC04OTk0OTc1MTRdKSxNYXRoLnBvdygyLDUzKSx0LmV4cG9ydHM9aSxpLkJMT0NLX1NJWkU9NjQsaS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe2lmKHRoaXMuZmluaXNoZWQpdGhyb3cgbmV3IEVycm9yKCJBdHRlbXB0ZWQgdG8gdXBkYXRlIGFuIGFscmVhZHkgZmluaXNoZWQgaGFzaC4iKTtpZihvLmlzRW1wdHlEYXRhKGUpKXJldHVybiB0aGlzO3ZhciB0PShlPW8uY29udmVydFRvQnVmZmVyKGUpKS5sZW5ndGg7dGhpcy50b3RhbExlbmd0aCs9OCp0O2Zvcih2YXIgbj0wO248dDtuKyspdGhpcy53cml0ZShlW25dKTtyZXR1cm4gdGhpc30saS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24oZSl7dGhpcy5ibG9ja1t0aGlzLm9mZnNldF18PSgyNTUmZSk8PHRoaXMuc2hpZnQsdGhpcy5zaGlmdD90aGlzLnNoaWZ0LT04Oih0aGlzLm9mZnNldCsrLHRoaXMuc2hpZnQ9MjQpLDE2PT09dGhpcy5vZmZzZXQmJnRoaXMucHJvY2Vzc0Jsb2NrKCl9LGkucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbihlKXt0aGlzLndyaXRlKDEyOCksKHRoaXMub2Zmc2V0PjE0fHwxND09PXRoaXMub2Zmc2V0JiZ0aGlzLnNoaWZ0PDI0KSYmdGhpcy5wcm9jZXNzQmxvY2soKSx0aGlzLm9mZnNldD0xNCx0aGlzLnNoaWZ0PTI0LHRoaXMud3JpdGUoMCksdGhpcy53cml0ZSgwKSx0aGlzLndyaXRlKHRoaXMudG90YWxMZW5ndGg+MHhmZmZmZmZmZmZmP3RoaXMudG90YWxMZW5ndGgvMTA5OTUxMTYyNzc3NjowKSx0aGlzLndyaXRlKHRoaXMudG90YWxMZW5ndGg+NDI5NDk2NzI5NT90aGlzLnRvdGFsTGVuZ3RoLzQyOTQ5NjcyOTY6MCk7Zm9yKHZhciB0PTI0O3Q+PTA7dC09OCl0aGlzLndyaXRlKHRoaXMudG90YWxMZW5ndGg+PnQpO3ZhciBuPW5ldyByKDIwKSxvPW5ldyBEYXRhVmlldyhuLmJ1ZmZlcik7cmV0dXJuIG8uc2V0VWludDMyKDAsdGhpcy5oMCwhMSksby5zZXRVaW50MzIoNCx0aGlzLmgxLCExKSxvLnNldFVpbnQzMig4LHRoaXMuaDIsITEpLG8uc2V0VWludDMyKDEyLHRoaXMuaDMsITEpLG8uc2V0VWludDMyKDE2LHRoaXMuaDQsITEpLGU/bi50b1N0cmluZyhlKTpufSxpLnByb3RvdHlwZS5wcm9jZXNzQmxvY2s9ZnVuY3Rpb24oKXtmb3IodmFyIGU9MTY7ZTw4MDtlKyspe3ZhciB0PXRoaXMuYmxvY2tbZS0zXV50aGlzLmJsb2NrW2UtOF1edGhpcy5ibG9ja1tlLTE0XV50aGlzLmJsb2NrW2UtMTZdO3RoaXMuYmxvY2tbZV09dDw8MXx0Pj4+MzF9dmFyIG4scixvPXRoaXMuaDAsaT10aGlzLmgxLHM9dGhpcy5oMixhPXRoaXMuaDMsYz10aGlzLmg0O2ZvcihlPTA7ZTw4MDtlKyspe2U8MjA/KG49YV5pJihzXmEpLHI9MTUxODUwMDI0OSk6ZTw0MD8obj1pXnNeYSxyPTE4NTk3NzUzOTMpOmU8NjA/KG49aSZzfGEmKGl8cykscj0yNDAwOTU5NzA4KToobj1pXnNeYSxyPTMzOTU0Njk3ODIpO3ZhciB1PShvPDw1fG8+Pj4yNykrbitjK3IrKDB8dGhpcy5ibG9ja1tlXSk7Yz1hLGE9cyxzPWk8PDMwfGk+Pj4yLGk9byxvPXV9Zm9yKHRoaXMuaDA9dGhpcy5oMCtvfDAsdGhpcy5oMT10aGlzLmgxK2l8MCx0aGlzLmgyPXRoaXMuaDIrc3wwLHRoaXMuaDM9dGhpcy5oMythfDAsdGhpcy5oND10aGlzLmg0K2N8MCx0aGlzLm9mZnNldD0wLGU9MDtlPDE2O2UrKyl0aGlzLmJsb2NrW2VdPTB9fSx7Ii4vYnJvd3Nlckhhc2hVdGlscyI6MTEsImJ1ZmZlci8iOjg2fV0sMTU6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCJidWZmZXIvIikuQnVmZmVyLG89ZSgiLi9icm93c2VySGFzaFV0aWxzIiksaT02NCxzPW5ldyBVaW50MzJBcnJheShbMTExNjM1MjQwOCwxODk5NDQ3NDQxLDMwNDkzMjM0NzEsMzkyMTAwOTU3Myw5NjE5ODcxNjMsMTUwODk3MDk5MywyNDUzNjM1NzQ4LDI4NzA3NjMyMjEsMzYyNDM4MTA4MCwzMTA1OTg0MDEsNjA3MjI1Mjc4LDE0MjY4ODE5ODcsMTkyNTA3ODM4OCwyMTYyMDc4MjA2LDI2MTQ4ODgxMDMsMzI0ODIyMjU4MCwzODM1MzkwNDAxLDQwMjIyMjQ3NzQsMjY0MzQ3MDc4LDYwNDgwNzYyOCw3NzAyNTU5ODMsMTI0OTE1MDEyMiwxNTU1MDgxNjkyLDE5OTYwNjQ5ODYsMjU1NDIyMDg4MiwyODIxODM0MzQ5LDI5NTI5OTY4MDgsMzIxMDMxMzY3MSwzMzM2NTcxODkxLDM1ODQ1Mjg3MTEsMTEzOTI2OTkzLDMzODI0MTg5NSw2NjYzMDcyMDUsNzczNTI5OTEyLDEyOTQ3NTczNzIsMTM5NjE4MjI5MSwxNjk1MTgzNzAwLDE5ODY2NjEwNTEsMjE3NzAyNjM1MCwyNDU2OTU2MDM3LDI3MzA0ODU5MjEsMjgyMDMwMjQxMSwzMjU5NzMwODAwLDMzNDU3NjQ3NzEsMzUxNjA2NTgxNywzNjAwMzUyODA0LDQwOTQ1NzE5MDksMjc1NDIzMzQ0LDQzMDIyNzczNCw1MDY5NDg2MTYsNjU5MDYwNTU2LDg4Mzk5Nzg3Nyw5NTgxMzk1NzEsMTMyMjgyMjIxOCwxNTM3MDAyMDYzLDE3NDc4NzM3NzksMTk1NTU2MjIyMiwyMDI0MTA0ODE1LDIyMjc3MzA0NTIsMjM2MTg1MjQyNCwyNDI4NDM2NDc0LDI3NTY3MzQxODcsMzIwNDAzMTQ3OSwzMzI5MzI1Mjk4XSksYT1NYXRoLnBvdygyLDUzKS0xO2Z1bmN0aW9uIGMoKXt0aGlzLnN0YXRlPVsxNzc5MDMzNzAzLDMxNDQxMzQyNzcsMTAxMzkwNDI0MiwyNzczNDgwNzYyLDEzNTk4OTMxMTksMjYwMDgyMjkyNCw1Mjg3MzQ2MzUsMTU0MTQ1OTIyNV0sdGhpcy50ZW1wPW5ldyBJbnQzMkFycmF5KDY0KSx0aGlzLmJ1ZmZlcj1uZXcgVWludDhBcnJheSg2NCksdGhpcy5idWZmZXJMZW5ndGg9MCx0aGlzLmJ5dGVzSGFzaGVkPTAsdGhpcy5maW5pc2hlZD0hMX10LmV4cG9ydHM9YyxjLkJMT0NLX1NJWkU9aSxjLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7aWYodGhpcy5maW5pc2hlZCl0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHRlZCB0byB1cGRhdGUgYW4gYWxyZWFkeSBmaW5pc2hlZCBoYXNoLiIpO2lmKG8uaXNFbXB0eURhdGEoZSkpcmV0dXJuIHRoaXM7dmFyIHQ9MCxuPShlPW8uY29udmVydFRvQnVmZmVyKGUpKS5ieXRlTGVuZ3RoO2lmKHRoaXMuYnl0ZXNIYXNoZWQrPW4sOCp0aGlzLmJ5dGVzSGFzaGVkPmEpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaGFzaCBtb3JlIHRoYW4gMl41MyAtIDEgYml0cyIpO2Zvcig7bj4wOyl0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlckxlbmd0aCsrXT1lW3QrK10sbi0tLHRoaXMuYnVmZmVyTGVuZ3RoPT09aSYmKHRoaXMuaGFzaEJ1ZmZlcigpLHRoaXMuYnVmZmVyTGVuZ3RoPTApO3JldHVybiB0aGlzfSxjLnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuZmluaXNoZWQpe3ZhciB0PTgqdGhpcy5ieXRlc0hhc2hlZCxuPW5ldyBEYXRhVmlldyh0aGlzLmJ1ZmZlci5idWZmZXIsdGhpcy5idWZmZXIuYnl0ZU9mZnNldCx0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKSxvPXRoaXMuYnVmZmVyTGVuZ3RoO2lmKG4uc2V0VWludDgodGhpcy5idWZmZXJMZW5ndGgrKywxMjgpLG8laT49NTYpe2Zvcih2YXIgcz10aGlzLmJ1ZmZlckxlbmd0aDtzPGk7cysrKW4uc2V0VWludDgocywwKTt0aGlzLmhhc2hCdWZmZXIoKSx0aGlzLmJ1ZmZlckxlbmd0aD0wfWZvcihzPXRoaXMuYnVmZmVyTGVuZ3RoO3M8NTY7cysrKW4uc2V0VWludDgocywwKTtuLnNldFVpbnQzMig1NixNYXRoLmZsb29yKHQvNDI5NDk2NzI5NiksITApLG4uc2V0VWludDMyKDYwLHQpLHRoaXMuaGFzaEJ1ZmZlcigpLHRoaXMuZmluaXNoZWQ9ITB9dmFyIGE9bmV3IHIoMzIpO2ZvcihzPTA7czw4O3MrKylhWzQqc109dGhpcy5zdGF0ZVtzXT4+PjI0JjI1NSxhWzQqcysxXT10aGlzLnN0YXRlW3NdPj4+MTYmMjU1LGFbNCpzKzJdPXRoaXMuc3RhdGVbc10+Pj44JjI1NSxhWzQqcyszXT10aGlzLnN0YXRlW3NdPj4+MCYyNTU7cmV0dXJuIGU/YS50b1N0cmluZyhlKTphfSxjLnByb3RvdHlwZS5oYXNoQnVmZmVyPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuYnVmZmVyLHQ9dGhpcy5zdGF0ZSxuPXRbMF0scj10WzFdLG89dFsyXSxhPXRbM10sYz10WzRdLHU9dFs1XSxsPXRbNl0scD10WzddLGQ9MDtkPGk7ZCsrKXtpZihkPDE2KXRoaXMudGVtcFtkXT0oMjU1JmVbNCpkXSk8PDI0fCgyNTUmZVs0KmQrMV0pPDwxNnwoMjU1JmVbNCpkKzJdKTw8OHwyNTUmZVs0KmQrM107ZWxzZXt2YXIgaD10aGlzLnRlbXBbZC0yXSxmPShoPj4+MTd8aDw8MTUpXihoPj4+MTl8aDw8MTMpXmg+Pj4xMCxnPSgoaD10aGlzLnRlbXBbZC0xNV0pPj4+N3xoPDwyNSleKGg+Pj4xOHxoPDwxNCleaD4+PjM7dGhpcy50ZW1wW2RdPShmK3RoaXMudGVtcFtkLTddfDApKyhnK3RoaXMudGVtcFtkLTE2XXwwKX12YXIgbT0oKChjPj4+NnxjPDwyNileKGM+Pj4xMXxjPDwyMSleKGM+Pj4yNXxjPDw3KSkrKGMmdV5+YyZsKXwwKSsocCsoc1tkXSt0aGlzLnRlbXBbZF18MCl8MCl8MCx2PSgobj4+PjJ8bjw8MzApXihuPj4+MTN8bjw8MTkpXihuPj4+MjJ8bjw8MTApKSsobiZyXm4mb15yJm8pfDA7cD1sLGw9dSx1PWMsYz1hK218MCxhPW8sbz1yLHI9bixuPW0rdnwwfXRbMF0rPW4sdFsxXSs9cix0WzJdKz1vLHRbM10rPWEsdFs0XSs9Yyx0WzVdKz11LHRbNl0rPWwsdFs3XSs9cH19LHsiLi9icm93c2VySGFzaFV0aWxzIjoxMSwiYnVmZmVyLyI6ODZ9XSwxNjpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbihuKXsoZnVuY3Rpb24oKXt2YXIgbj1lKCIuL3V0aWwiKTtuLmNyeXB0by5saWI9ZSgiLi9icm93c2VyQ3J5cHRvTGliIiksbi5CdWZmZXI9ZSgiYnVmZmVyLyIpLkJ1ZmZlcixuLnVybD1lKCJ1cmwvIiksbi5xdWVyeXN0cmluZz1lKCJxdWVyeXN0cmluZy8iKSxuLnJlYWxDbG9jaz1lKCIuL3JlYWxjbG9jay9icm93c2VyQ2xvY2siKSxuLmVudmlyb25tZW50PSJqcyIsbi5jcmVhdGVFdmVudFN0cmVhbT1lKCIuL2V2ZW50LXN0cmVhbS9idWZmZXJlZC1jcmVhdGUtZXZlbnQtc3RyZWFtIikuY3JlYXRlRXZlbnRTdHJlYW0sbi5pc0Jyb3dzZXI9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sbi5pc05vZGU9ZnVuY3Rpb24oKXtyZXR1cm4hMX07dmFyIHI9ZSgiLi9jb3JlIik7aWYodC5leHBvcnRzPXIsZSgiLi9jcmVkZW50aWFscyIpLGUoIi4vY3JlZGVudGlhbHMvY3JlZGVudGlhbF9wcm92aWRlcl9jaGFpbiIpLGUoIi4vY3JlZGVudGlhbHMvdGVtcG9yYXJ5X2NyZWRlbnRpYWxzIiksZSgiLi9jcmVkZW50aWFscy9jaGFpbmFibGVfdGVtcG9yYXJ5X2NyZWRlbnRpYWxzIiksZSgiLi9jcmVkZW50aWFscy93ZWJfaWRlbnRpdHlfY3JlZGVudGlhbHMiKSxlKCIuL2NyZWRlbnRpYWxzL2NvZ25pdG9faWRlbnRpdHlfY3JlZGVudGlhbHMiKSxlKCIuL2NyZWRlbnRpYWxzL3NhbWxfY3JlZGVudGlhbHMiKSxyLlhNTC5QYXJzZXI9ZSgiLi94bWwvYnJvd3Nlcl9wYXJzZXIiKSxlKCIuL2h0dHAveGhyIiksdm9pZCAwPT09byl2YXIgbz17YnJvd3NlcjohMH19KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIikpfSx7Ii4vYnJvd3NlckNyeXB0b0xpYiI6MTAsIi4vY29yZSI6MTksIi4vY3JlZGVudGlhbHMiOjIwLCIuL2NyZWRlbnRpYWxzL2NoYWluYWJsZV90ZW1wb3JhcnlfY3JlZGVudGlhbHMiOjIxLCIuL2NyZWRlbnRpYWxzL2NvZ25pdG9faWRlbnRpdHlfY3JlZGVudGlhbHMiOjIyLCIuL2NyZWRlbnRpYWxzL2NyZWRlbnRpYWxfcHJvdmlkZXJfY2hhaW4iOjIzLCIuL2NyZWRlbnRpYWxzL3NhbWxfY3JlZGVudGlhbHMiOjI0LCIuL2NyZWRlbnRpYWxzL3RlbXBvcmFyeV9jcmVkZW50aWFscyI6MjUsIi4vY3JlZGVudGlhbHMvd2ViX2lkZW50aXR5X2NyZWRlbnRpYWxzIjoyNiwiLi9ldmVudC1zdHJlYW0vYnVmZmVyZWQtY3JlYXRlLWV2ZW50LXN0cmVhbSI6MjgsIi4vaHR0cC94aHIiOjM2LCIuL3JlYWxjbG9jay9icm93c2VyQ2xvY2siOjU0LCIuL3V0aWwiOjc0LCIuL3htbC9icm93c2VyX3BhcnNlciI6NzUsX3Byb2Nlc3M6OTEsImJ1ZmZlci8iOjg2LCJxdWVyeXN0cmluZy8iOjk4LCJ1cmwvIjoxMDB9XSwxNzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByLG89ZSgiLi9jb3JlIik7ZSgiLi9jcmVkZW50aWFscyIpLGUoIi4vY3JlZGVudGlhbHMvY3JlZGVudGlhbF9wcm92aWRlcl9jaGFpbiIpLG8uQ29uZmlnPW8udXRpbC5pbmhlcml0KHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSksZT10aGlzLmV4dHJhY3RDcmVkZW50aWFscyhlKSxvLnV0aWwuZWFjaC5jYWxsKHRoaXMsdGhpcy5rZXlzLChmdW5jdGlvbih0LG4pe3RoaXMuc2V0KHQsZVt0XSxuKX0pKX0sZ2V0Q3JlZGVudGlhbHM6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzO2Z1bmN0aW9uIHIodCl7ZSh0LHQ/bnVsbDpuLmNyZWRlbnRpYWxzKX1mdW5jdGlvbiBpKGUsdCl7cmV0dXJuIG5ldyBvLnV0aWwuZXJyb3IodHx8bmV3IEVycm9yLHtjb2RlOiJDcmVkZW50aWFsc0Vycm9yIixtZXNzYWdlOmUsbmFtZToiQ3JlZGVudGlhbHNFcnJvciJ9KX1uLmNyZWRlbnRpYWxzPyJmdW5jdGlvbiI9PXR5cGVvZiBuLmNyZWRlbnRpYWxzLmdldD9uLmNyZWRlbnRpYWxzLmdldCgoZnVuY3Rpb24oZSl7ZSYmKGU9aSgiQ291bGQgbm90IGxvYWQgY3JlZGVudGlhbHMgZnJvbSAiK24uY3JlZGVudGlhbHMuY29uc3RydWN0b3IubmFtZSxlKSkscihlKX0pKToodD1udWxsLG4uY3JlZGVudGlhbHMuYWNjZXNzS2V5SWQmJm4uY3JlZGVudGlhbHMuc2VjcmV0QWNjZXNzS2V5fHwodD1pKCJNaXNzaW5nIGNyZWRlbnRpYWxzIikpLHIodCkpOm4uY3JlZGVudGlhbFByb3ZpZGVyP24uY3JlZGVudGlhbFByb3ZpZGVyLnJlc29sdmUoKGZ1bmN0aW9uKGUsdCl7ZSYmKGU9aSgiQ291bGQgbm90IGxvYWQgY3JlZGVudGlhbHMgZnJvbSBhbnkgcHJvdmlkZXJzIixlKSksbi5jcmVkZW50aWFscz10LHIoZSl9KSk6cihpKCJObyBjcmVkZW50aWFscyB0byBsb2FkIikpfSxnZXRUb2tlbjpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXM7ZnVuY3Rpb24gcih0KXtlKHQsdD9udWxsOm4udG9rZW4pfWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm4gbmV3IG8udXRpbC5lcnJvcih0fHxuZXcgRXJyb3Ise2NvZGU6IlRva2VuRXJyb3IiLG1lc3NhZ2U6ZSxuYW1lOiJUb2tlbkVycm9yIn0pfW4udG9rZW4/ImZ1bmN0aW9uIj09dHlwZW9mIG4udG9rZW4uZ2V0P24udG9rZW4uZ2V0KChmdW5jdGlvbihlKXtlJiYoZT1pKCJDb3VsZCBub3QgbG9hZCB0b2tlbiBmcm9tICIrbi50b2tlbi5jb25zdHJ1Y3Rvci5uYW1lLGUpKSxyKGUpfSkpOih0PW51bGwsbi50b2tlbi50b2tlbnx8KHQ9aSgiTWlzc2luZyB0b2tlbiIpKSxyKHQpKTpuLnRva2VuUHJvdmlkZXI/bi50b2tlblByb3ZpZGVyLnJlc29sdmUoKGZ1bmN0aW9uKGUsdCl7ZSYmKGU9aSgiQ291bGQgbm90IGxvYWQgdG9rZW4gZnJvbSBhbnkgcHJvdmlkZXJzIixlKSksbi50b2tlbj10LHIoZSl9KSk6cihpKCJObyB0b2tlbiB0byBsb2FkIikpfSx1cGRhdGU6ZnVuY3Rpb24oZSx0KXt0PXR8fCExLGU9dGhpcy5leHRyYWN0Q3JlZGVudGlhbHMoZSksby51dGlsLmVhY2guY2FsbCh0aGlzLGUsKGZ1bmN0aW9uKGUsbil7KHR8fE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmtleXMsZSl8fG8uU2VydmljZS5oYXNTZXJ2aWNlKGUpKSYmdGhpcy5zZXQoZSxuKX0pKX0sbG9hZEZyb21QYXRoOmZ1bmN0aW9uKGUpe3RoaXMuY2xlYXIoKTt2YXIgdD1KU09OLnBhcnNlKG8udXRpbC5yZWFkRmlsZVN5bmMoZSkpLG49bmV3IG8uRmlsZVN5c3RlbUNyZWRlbnRpYWxzKGUpLHI9bmV3IG8uQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW47cmV0dXJuIHIucHJvdmlkZXJzLnVuc2hpZnQobiksci5yZXNvbHZlKChmdW5jdGlvbihlLG4pe2lmKGUpdGhyb3cgZTt0LmNyZWRlbnRpYWxzPW59KSksdGhpcy5jb25zdHJ1Y3Rvcih0KSx0aGlzfSxjbGVhcjpmdW5jdGlvbigpe28udXRpbC5lYWNoLmNhbGwodGhpcyx0aGlzLmtleXMsKGZ1bmN0aW9uKGUpe2RlbGV0ZSB0aGlzW2VdfSkpLHRoaXMuc2V0KCJjcmVkZW50aWFscyIsdm9pZCAwKSx0aGlzLnNldCgiY3JlZGVudGlhbFByb3ZpZGVyIix2b2lkIDApfSxzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZvaWQgMD09PXQ/KHZvaWQgMD09PW4mJihuPXRoaXMua2V5c1tlXSksdGhpc1tlXT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmNhbGwodGhpcyk6bik6Imh0dHBPcHRpb25zIj09PWUmJnRoaXNbZV0/dGhpc1tlXT1vLnV0aWwubWVyZ2UodGhpc1tlXSx0KTp0aGlzW2VdPXR9LGtleXM6e2NyZWRlbnRpYWxzOm51bGwsY3JlZGVudGlhbFByb3ZpZGVyOm51bGwscmVnaW9uOm51bGwsbG9nZ2VyOm51bGwsYXBpVmVyc2lvbnM6e30sYXBpVmVyc2lvbjpudWxsLGVuZHBvaW50OnZvaWQgMCxodHRwT3B0aW9uczp7dGltZW91dDoxMmU0fSxtYXhSZXRyaWVzOnZvaWQgMCxtYXhSZWRpcmVjdHM6MTAscGFyYW1WYWxpZGF0aW9uOiEwLHNzbEVuYWJsZWQ6ITAsczNGb3JjZVBhdGhTdHlsZTohMSxzM0J1Y2tldEVuZHBvaW50OiExLHMzRGlzYWJsZUJvZHlTaWduaW5nOiEwLHMzVXNFYXN0MVJlZ2lvbmFsRW5kcG9pbnQ6ImxlZ2FjeSIsczNVc2VBcm5SZWdpb246dm9pZCAwLGNvbXB1dGVDaGVja3N1bXM6ITAsY29udmVydFJlc3BvbnNlVHlwZXM6ITAsY29ycmVjdENsb2NrU2tldzohMSxjdXN0b21Vc2VyQWdlbnQ6bnVsbCxkeW5hbW9EYkNyYzMyOiEwLHN5c3RlbUNsb2NrT2Zmc2V0OjAsc2lnbmF0dXJlVmVyc2lvbjpudWxsLHNpZ25hdHVyZUNhY2hlOiEwLHJldHJ5RGVsYXlPcHRpb25zOnt9LHVzZUFjY2VsZXJhdGVFbmRwb2ludDohMSxjbGllbnRTaWRlTW9uaXRvcmluZzohMSxlbmRwb2ludERpc2NvdmVyeUVuYWJsZWQ6dm9pZCAwLGVuZHBvaW50Q2FjaGVTaXplOjFlMyxob3N0UHJlZml4RW5hYmxlZDohMCxzdHNSZWdpb25hbEVuZHBvaW50czoibGVnYWN5Iix1c2VGaXBzRW5kcG9pbnQ6ITEsdXNlRHVhbHN0YWNrRW5kcG9pbnQ6ITEsdG9rZW46bnVsbH0sZXh0cmFjdENyZWRlbnRpYWxzOmZ1bmN0aW9uKGUpe3JldHVybiBlLmFjY2Vzc0tleUlkJiZlLnNlY3JldEFjY2Vzc0tleSYmKChlPW8udXRpbC5jb3B5KGUpKS5jcmVkZW50aWFscz1uZXcgby5DcmVkZW50aWFscyhlKSksZX0sc2V0UHJvbWlzZXNEZXBlbmRlbmN5OmZ1bmN0aW9uKGUpe3I9ZSxudWxsPT09ZSYmImZ1bmN0aW9uIj09dHlwZW9mIFByb21pc2UmJihyPVByb21pc2UpO3ZhciB0PVtvLlJlcXVlc3Qsby5DcmVkZW50aWFscyxvLkNyZWRlbnRpYWxQcm92aWRlckNoYWluXTtvLlMzJiYodC5wdXNoKG8uUzMpLG8uUzMuTWFuYWdlZFVwbG9hZCYmdC5wdXNoKG8uUzMuTWFuYWdlZFVwbG9hZCkpLG8udXRpbC5hZGRQcm9taXNlcyh0LHIpfSxnZXRQcm9taXNlc0RlcGVuZGVuY3k6ZnVuY3Rpb24oKXtyZXR1cm4gcn19KSxvLmNvbmZpZz1uZXcgby5Db25maWd9LHsiLi9jb3JlIjoxOSwiLi9jcmVkZW50aWFscyI6MjAsIi4vY3JlZGVudGlhbHMvY3JlZGVudGlhbF9wcm92aWRlcl9jaGFpbiI6MjN9XSwxODpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbihuKXsoZnVuY3Rpb24oKXt2YXIgcj1lKCIuL2NvcmUiKTtmdW5jdGlvbiBvKGUsdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtpZihbImxlZ2FjeSIsInJlZ2lvbmFsIl0uaW5kZXhPZihlLnRvTG93ZXJDYXNlKCkpPj0wKXJldHVybiBlLnRvTG93ZXJDYXNlKCk7dGhyb3cgci51dGlsLmVycm9yKG5ldyBFcnJvcix0KX19dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIGk7aWYoKGU9ZXx8e30pW3QuY2xpZW50Q29uZmlnXSYmKGk9byhlW3QuY2xpZW50Q29uZmlnXSx7Y29kZToiSW52YWxpZENvbmZpZ3VyYXRpb24iLG1lc3NhZ2U6J2ludmFsaWQgIicrdC5jbGllbnRDb25maWcrJyIgY29uZmlndXJhdGlvbi4gRXhwZWN0ICJsZWdhY3kiICBvciAicmVnaW9uYWwiLiBHb3QgIicrZVt0LmNsaWVudENvbmZpZ10rJyIuJ30pKSlyZXR1cm4gaTtpZighci51dGlsLmlzTm9kZSgpKXJldHVybiBpO2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLmVudix0LmVudikmJihpPW8obi5lbnZbdC5lbnZdLHtjb2RlOiJJbnZhbGlkRW52aXJvbm1lbnRhbFZhcmlhYmxlIixtZXNzYWdlOiJpbnZhbGlkICIrdC5lbnYrJyBlbnZpcm9ubWVudGFsIHZhcmlhYmxlLiBFeHBlY3QgImxlZ2FjeSIgIG9yICJyZWdpb25hbCIuIEdvdCAiJytuLmVudlt0LmVudl0rJyIuJ30pKSlyZXR1cm4gaTt2YXIgcz17fTt0cnl7cz1yLnV0aWwuZ2V0UHJvZmlsZXNGcm9tU2hhcmVkQ29uZmlnKHIudXRpbC5pbmlMb2FkZXIpW24uZW52LkFXU19QUk9GSUxFfHxyLnV0aWwuZGVmYXVsdFByb2ZpbGVdfWNhdGNoKGUpe31yZXR1cm4gcyYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsdC5zaGFyZWRDb25maWcpJiYoaT1vKHNbdC5zaGFyZWRDb25maWddLHtjb2RlOiJJbnZhbGlkQ29uZmlndXJhdGlvbiIsbWVzc2FnZToiaW52YWxpZCAiK3Quc2hhcmVkQ29uZmlnKycgcHJvZmlsZSBjb25maWcuIEV4cGVjdCAibGVnYWN5IiAgb3IgInJlZ2lvbmFsIi4gR290ICInK3NbdC5zaGFyZWRDb25maWddKyciLid9KSksaX19KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIikpfSx7Ii4vY29yZSI6MTksX3Byb2Nlc3M6OTF9XSwxOTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt1dGlsOmUoIi4vdXRpbCIpfTsoe30pLnRvU3RyaW5nKCksdC5leHBvcnRzPXIsci51dGlsLnVwZGF0ZShyLHtWRVJTSU9OOiIyLjE0NTUuMCIsU2lnbmVyczp7fSxQcm90b2NvbDp7SnNvbjplKCIuL3Byb3RvY29sL2pzb24iKSxRdWVyeTplKCIuL3Byb3RvY29sL3F1ZXJ5IiksUmVzdDplKCIuL3Byb3RvY29sL3Jlc3QiKSxSZXN0SnNvbjplKCIuL3Byb3RvY29sL3Jlc3RfanNvbiIpLFJlc3RYbWw6ZSgiLi9wcm90b2NvbC9yZXN0X3htbCIpfSxYTUw6e0J1aWxkZXI6ZSgiLi94bWwvYnVpbGRlciIpLFBhcnNlcjpudWxsfSxKU09OOntCdWlsZGVyOmUoIi4vanNvbi9idWlsZGVyIiksUGFyc2VyOmUoIi4vanNvbi9wYXJzZXIiKX0sTW9kZWw6e0FwaTplKCIuL21vZGVsL2FwaSIpLE9wZXJhdGlvbjplKCIuL21vZGVsL29wZXJhdGlvbiIpLFNoYXBlOmUoIi4vbW9kZWwvc2hhcGUiKSxQYWdpbmF0b3I6ZSgiLi9tb2RlbC9wYWdpbmF0b3IiKSxSZXNvdXJjZVdhaXRlcjplKCIuL21vZGVsL3Jlc291cmNlX3dhaXRlciIpfSxhcGlMb2FkZXI6ZSgiLi9hcGlfbG9hZGVyIiksRW5kcG9pbnRDYWNoZTplKCIuLi92ZW5kb3IvZW5kcG9pbnQtY2FjaGUiKS5FbmRwb2ludENhY2hlfSksZSgiLi9zZXF1ZW50aWFsX2V4ZWN1dG9yIiksZSgiLi9zZXJ2aWNlIiksZSgiLi9jb25maWciKSxlKCIuL2h0dHAiKSxlKCIuL2V2ZW50X2xpc3RlbmVycyIpLGUoIi4vcmVxdWVzdCIpLGUoIi4vcmVzcG9uc2UiKSxlKCIuL3Jlc291cmNlX3dhaXRlciIpLGUoIi4vc2lnbmVycy9yZXF1ZXN0X3NpZ25lciIpLGUoIi4vcGFyYW1fdmFsaWRhdG9yIiksZSgiLi9tYWludGVuYW5jZV9tb2RlX21lc3NhZ2UiKSxyLmV2ZW50cz1uZXcgci5TZXF1ZW50aWFsRXhlY3V0b3Isci51dGlsLm1lbW9pemVkUHJvcGVydHkociwiZW5kcG9pbnRDYWNoZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyByLkVuZHBvaW50Q2FjaGUoci5jb25maWcuZW5kcG9pbnRDYWNoZVNpemUpfSksITApfSx7Ii4uL3ZlbmRvci9lbmRwb2ludC1jYWNoZSI6MTExLCIuL2FwaV9sb2FkZXIiOjksIi4vY29uZmlnIjoxNywiLi9ldmVudF9saXN0ZW5lcnMiOjM0LCIuL2h0dHAiOjM1LCIuL2pzb24vYnVpbGRlciI6MzcsIi4vanNvbi9wYXJzZXIiOjM4LCIuL21haW50ZW5hbmNlX21vZGVfbWVzc2FnZSI6MzksIi4vbW9kZWwvYXBpIjo0MCwiLi9tb2RlbC9vcGVyYXRpb24iOjQyLCIuL21vZGVsL3BhZ2luYXRvciI6NDMsIi4vbW9kZWwvcmVzb3VyY2Vfd2FpdGVyIjo0NCwiLi9tb2RlbC9zaGFwZSI6NDUsIi4vcGFyYW1fdmFsaWRhdG9yIjo0NiwiLi9wcm90b2NvbC9qc29uIjo0OCwiLi9wcm90b2NvbC9xdWVyeSI6NDksIi4vcHJvdG9jb2wvcmVzdCI6NTAsIi4vcHJvdG9jb2wvcmVzdF9qc29uIjo1MSwiLi9wcm90b2NvbC9yZXN0X3htbCI6NTIsIi4vcmVxdWVzdCI6NTgsIi4vcmVzb3VyY2Vfd2FpdGVyIjo1OSwiLi9yZXNwb25zZSI6NjAsIi4vc2VxdWVudGlhbF9leGVjdXRvciI6NjEsIi4vc2VydmljZSI6NjIsIi4vc2lnbmVycy9yZXF1ZXN0X3NpZ25lciI6NjYsIi4vdXRpbCI6NzQsIi4veG1sL2J1aWxkZXIiOjc2fV0sMjA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvcmUiKTtyLkNyZWRlbnRpYWxzPXIudXRpbC5pbmhlcml0KHtjb25zdHJ1Y3RvcjpmdW5jdGlvbigpe2lmKHIudXRpbC5oaWRlUHJvcGVydGllcyh0aGlzLFsic2VjcmV0QWNjZXNzS2V5Il0pLHRoaXMuZXhwaXJlZD0hMSx0aGlzLmV4cGlyZVRpbWU9bnVsbCx0aGlzLnJlZnJlc2hDYWxsYmFja3M9W10sMT09PWFyZ3VtZW50cy5sZW5ndGgmJiJvYmplY3QiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgZT1hcmd1bWVudHNbMF0uY3JlZGVudGlhbHN8fGFyZ3VtZW50c1swXTt0aGlzLmFjY2Vzc0tleUlkPWUuYWNjZXNzS2V5SWQsdGhpcy5zZWNyZXRBY2Nlc3NLZXk9ZS5zZWNyZXRBY2Nlc3NLZXksdGhpcy5zZXNzaW9uVG9rZW49ZS5zZXNzaW9uVG9rZW59ZWxzZSB0aGlzLmFjY2Vzc0tleUlkPWFyZ3VtZW50c1swXSx0aGlzLnNlY3JldEFjY2Vzc0tleT1hcmd1bWVudHNbMV0sdGhpcy5zZXNzaW9uVG9rZW49YXJndW1lbnRzWzJdfSxleHBpcnlXaW5kb3c6MTUsbmVlZHNSZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIGU9ci51dGlsLmRhdGUuZ2V0RGF0ZSgpLmdldFRpbWUoKSx0PW5ldyBEYXRlKGUrMWUzKnRoaXMuZXhwaXJ5V2luZG93KTtyZXR1cm4hISh0aGlzLmV4cGlyZVRpbWUmJnQ+dGhpcy5leHBpcmVUaW1lKXx8dGhpcy5leHBpcmVkfHwhdGhpcy5hY2Nlc3NLZXlJZHx8IXRoaXMuc2VjcmV0QWNjZXNzS2V5fSxnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLm5lZWRzUmVmcmVzaCgpP3RoaXMucmVmcmVzaCgoZnVuY3Rpb24obil7bnx8KHQuZXhwaXJlZD0hMSksZSYmZShuKX0pKTplJiZlKCl9LHJlZnJlc2g6ZnVuY3Rpb24oZSl7dGhpcy5leHBpcmVkPSExLGUoKX0sY29hbGVzY2VSZWZyZXNoOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpczsxPT09bi5yZWZyZXNoQ2FsbGJhY2tzLnB1c2goZSkmJm4ubG9hZCgoZnVuY3Rpb24oZSl7ci51dGlsLmFycmF5RWFjaChuLnJlZnJlc2hDYWxsYmFja3MsKGZ1bmN0aW9uKG4pe3Q/bihlKTpyLnV0aWwuZGVmZXIoKGZ1bmN0aW9uKCl7bihlKX0pKX0pKSxuLnJlZnJlc2hDYWxsYmFja3MubGVuZ3RoPTB9KSl9LGxvYWQ6ZnVuY3Rpb24oZSl7ZSgpfX0pLHIuQ3JlZGVudGlhbHMuYWRkUHJvbWlzZXNUb0NsYXNzPWZ1bmN0aW9uKGUpe3RoaXMucHJvdG90eXBlLmdldFByb21pc2U9ci51dGlsLnByb21pc2lmeU1ldGhvZCgiZ2V0IixlKSx0aGlzLnByb3RvdHlwZS5yZWZyZXNoUHJvbWlzZT1yLnV0aWwucHJvbWlzaWZ5TWV0aG9kKCJyZWZyZXNoIixlKX0sci5DcmVkZW50aWFscy5kZWxldGVQcm9taXNlc0Zyb21DbGFzcz1mdW5jdGlvbigpe2RlbGV0ZSB0aGlzLnByb3RvdHlwZS5nZXRQcm9taXNlLGRlbGV0ZSB0aGlzLnByb3RvdHlwZS5yZWZyZXNoUHJvbWlzZX0sci51dGlsLmFkZFByb21pc2VzKHIuQ3JlZGVudGlhbHMpfSx7Ii4vY29yZSI6MTl9XSwyMTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uLy4uL2NsaWVudHMvc3RzIik7ci5DaGFpbmFibGVUZW1wb3JhcnlDcmVkZW50aWFscz1yLnV0aWwuaW5oZXJpdChyLkNyZWRlbnRpYWxzLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXtyLkNyZWRlbnRpYWxzLmNhbGwodGhpcyksZT1lfHx7fSx0aGlzLmVycm9yQ29kZT0iQ2hhaW5hYmxlVGVtcG9yYXJ5Q3JlZGVudGlhbHNQcm92aWRlckZhaWx1cmUiLHRoaXMuZXhwaXJlZD0hMCx0aGlzLnRva2VuQ29kZUZuPW51bGw7dmFyIHQ9ci51dGlsLmNvcHkoZS5wYXJhbXMpfHx7fTtpZih0LlJvbGVBcm4mJih0LlJvbGVTZXNzaW9uTmFtZT10LlJvbGVTZXNzaW9uTmFtZXx8InRlbXBvcmFyeS1jcmVkZW50aWFscyIpLHQuU2VyaWFsTnVtYmVyKXtpZighZS50b2tlbkNvZGVGbnx8ImZ1bmN0aW9uIiE9dHlwZW9mIGUudG9rZW5Db2RlRm4pdGhyb3cgbmV3IHIudXRpbC5lcnJvcihuZXcgRXJyb3IoInRva2VuQ29kZUZuIG11c3QgYmUgYSBmdW5jdGlvbiB3aGVuIHBhcmFtcy5TZXJpYWxOdW1iZXIgaXMgZ2l2ZW4iKSx7Y29kZTp0aGlzLmVycm9yQ29kZX0pO3RoaXMudG9rZW5Db2RlRm49ZS50b2tlbkNvZGVGbn12YXIgbj1yLnV0aWwubWVyZ2Uoe3BhcmFtczp0LGNyZWRlbnRpYWxzOmUubWFzdGVyQ3JlZGVudGlhbHN8fHIuY29uZmlnLmNyZWRlbnRpYWxzfSxlLnN0c0NvbmZpZ3x8e30pO3RoaXMuc2VydmljZT1uZXcgbyhuKX0scmVmcmVzaDpmdW5jdGlvbihlKXt0aGlzLmNvYWxlc2NlUmVmcmVzaChlfHxyLnV0aWwuZm4uY2FsbGJhY2spfSxsb2FkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10LnNlcnZpY2UuY29uZmlnLnBhcmFtcy5Sb2xlQXJuPyJhc3N1bWVSb2xlIjoiZ2V0U2Vzc2lvblRva2VuIjt0aGlzLmdldFRva2VuQ29kZSgoZnVuY3Rpb24ocixvKXt2YXIgaT17fTtyP2Uocik6KG8mJihpLlRva2VuQ29kZT1vKSx0LnNlcnZpY2Vbbl0oaSwoZnVuY3Rpb24obixyKXtufHx0LnNlcnZpY2UuY3JlZGVudGlhbHNGcm9tKHIsdCksZShuKX0pKSl9KSl9LGdldFRva2VuQ29kZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMudG9rZW5Db2RlRm4/dGhpcy50b2tlbkNvZGVGbih0aGlzLnNlcnZpY2UuY29uZmlnLnBhcmFtcy5TZXJpYWxOdW1iZXIsKGZ1bmN0aW9uKG4sbyl7aWYobil7dmFyIGk9bjtyZXR1cm4gbiBpbnN0YW5jZW9mIEVycm9yJiYoaT1uLm1lc3NhZ2UpLHZvaWQgZShyLnV0aWwuZXJyb3IobmV3IEVycm9yKCJFcnJvciBmZXRjaGluZyBNRkEgdG9rZW46ICIraSkse2NvZGU6dC5lcnJvckNvZGV9KSl9ZShudWxsLG8pfSkpOmUobnVsbCl9fSl9LHsiLi4vLi4vY2xpZW50cy9zdHMiOjgsIi4uL2NvcmUiOjE5fV0sMjI6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCIuLi8uLi9jbGllbnRzL2NvZ25pdG9pZGVudGl0eSIpLGk9ZSgiLi4vLi4vY2xpZW50cy9zdHMiKTtyLkNvZ25pdG9JZGVudGl0eUNyZWRlbnRpYWxzPXIudXRpbC5pbmhlcml0KHIuQ3JlZGVudGlhbHMse2xvY2FsU3RvcmFnZUtleTp7aWQ6ImF3cy5jb2duaXRvLmlkZW50aXR5LWlkLiIscHJvdmlkZXJzOiJhd3MuY29nbml0by5pZGVudGl0eS1wcm92aWRlcnMuIn0sY29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0KXtyLkNyZWRlbnRpYWxzLmNhbGwodGhpcyksdGhpcy5leHBpcmVkPSEwLHRoaXMucGFyYW1zPWUsdGhpcy5kYXRhPW51bGwsdGhpcy5faWRlbnRpdHlJZD1udWxsLHRoaXMuX2NsaWVudENvbmZpZz1yLnV0aWwuY29weSh0fHx7fSksdGhpcy5sb2FkQ2FjaGVkSWQoKTt2YXIgbj10aGlzO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZGVudGl0eUlkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG4ubG9hZENhY2hlZElkKCksbi5faWRlbnRpdHlJZHx8bi5wYXJhbXMuSWRlbnRpdHlJZH0sc2V0OmZ1bmN0aW9uKGUpe24uX2lkZW50aXR5SWQ9ZX19KX0scmVmcmVzaDpmdW5jdGlvbihlKXt0aGlzLmNvYWxlc2NlUmVmcmVzaChlfHxyLnV0aWwuZm4uY2FsbGJhY2spfSxsb2FkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5jcmVhdGVDbGllbnRzKCksdC5kYXRhPW51bGwsdC5faWRlbnRpdHlJZD1udWxsLHQuZ2V0SWQoKGZ1bmN0aW9uKG4pe24/KHQuY2xlYXJJZE9uTm90QXV0aG9yaXplZChuKSxlKG4pKTp0LnBhcmFtcy5Sb2xlQXJuP3QuZ2V0Q3JlZGVudGlhbHNGcm9tU1RTKGUpOnQuZ2V0Q3JlZGVudGlhbHNGb3JJZGVudGl0eShlKX0pKX0sY2xlYXJDYWNoZWRJZDpmdW5jdGlvbigpe3RoaXMuX2lkZW50aXR5SWQ9bnVsbCxkZWxldGUgdGhpcy5wYXJhbXMuSWRlbnRpdHlJZDt2YXIgZT10aGlzLnBhcmFtcy5JZGVudGl0eVBvb2xJZCx0PXRoaXMucGFyYW1zLkxvZ2luSWR8fCIiO2RlbGV0ZSB0aGlzLnN0b3JhZ2VbdGhpcy5sb2NhbFN0b3JhZ2VLZXkuaWQrZSt0XSxkZWxldGUgdGhpcy5zdG9yYWdlW3RoaXMubG9jYWxTdG9yYWdlS2V5LnByb3ZpZGVycytlK3RdfSxjbGVhcklkT25Ob3RBdXRob3JpemVkOmZ1bmN0aW9uKGUpeyJOb3RBdXRob3JpemVkRXhjZXB0aW9uIj09ZS5jb2RlJiZ0aGlzLmNsZWFyQ2FjaGVkSWQoKX0sZ2V0SWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZigic3RyaW5nIj09dHlwZW9mIHQucGFyYW1zLklkZW50aXR5SWQpcmV0dXJuIGUobnVsbCx0LnBhcmFtcy5JZGVudGl0eUlkKTt0LmNvZ25pdG8uZ2V0SWQoKGZ1bmN0aW9uKG4scil7IW4mJnIuSWRlbnRpdHlJZD8odC5wYXJhbXMuSWRlbnRpdHlJZD1yLklkZW50aXR5SWQsZShudWxsLHIuSWRlbnRpdHlJZCkpOmUobil9KSl9LGxvYWRDcmVkZW50aWFsczpmdW5jdGlvbihlLHQpe2UmJnQmJih0LmV4cGlyZWQ9ITEsdC5hY2Nlc3NLZXlJZD1lLkNyZWRlbnRpYWxzLkFjY2Vzc0tleUlkLHQuc2VjcmV0QWNjZXNzS2V5PWUuQ3JlZGVudGlhbHMuU2VjcmV0S2V5LHQuc2Vzc2lvblRva2VuPWUuQ3JlZGVudGlhbHMuU2Vzc2lvblRva2VuLHQuZXhwaXJlVGltZT1lLkNyZWRlbnRpYWxzLkV4cGlyYXRpb24pfSxnZXRDcmVkZW50aWFsc0ZvcklkZW50aXR5OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5jb2duaXRvLmdldENyZWRlbnRpYWxzRm9ySWRlbnRpdHkoKGZ1bmN0aW9uKG4scil7bj90LmNsZWFySWRPbk5vdEF1dGhvcml6ZWQobik6KHQuY2FjaGVJZChyKSx0LmRhdGE9cix0LmxvYWRDcmVkZW50aWFscyh0LmRhdGEsdCkpLGUobil9KSl9LGdldENyZWRlbnRpYWxzRnJvbVNUUzpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuY29nbml0by5nZXRPcGVuSWRUb2tlbigoZnVuY3Rpb24obixyKXtuPyh0LmNsZWFySWRPbk5vdEF1dGhvcml6ZWQobiksZShuKSk6KHQuY2FjaGVJZChyKSx0LnBhcmFtcy5XZWJJZGVudGl0eVRva2VuPXIuVG9rZW4sdC53ZWJJZGVudGl0eUNyZWRlbnRpYWxzLnJlZnJlc2goKGZ1bmN0aW9uKG4pe258fCh0LmRhdGE9dC53ZWJJZGVudGl0eUNyZWRlbnRpYWxzLmRhdGEsdC5zdHMuY3JlZGVudGlhbHNGcm9tKHQuZGF0YSx0KSksZShuKX0pKSl9KSl9LGxvYWRDYWNoZWRJZDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoci51dGlsLmlzQnJvd3NlcigpJiYhZS5wYXJhbXMuSWRlbnRpdHlJZCl7dmFyIHQ9ZS5nZXRTdG9yYWdlKCJpZCIpO2lmKHQmJmUucGFyYW1zLkxvZ2lucyl7dmFyIG49T2JqZWN0LmtleXMoZS5wYXJhbXMuTG9naW5zKTswIT09KGUuZ2V0U3RvcmFnZSgicHJvdmlkZXJzIil8fCIiKS5zcGxpdCgiLCIpLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuLTEhPT1uLmluZGV4T2YoZSl9KSkubGVuZ3RoJiYoZS5wYXJhbXMuSWRlbnRpdHlJZD10KX1lbHNlIHQmJihlLnBhcmFtcy5JZGVudGl0eUlkPXQpfX0sY3JlYXRlQ2xpZW50czpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2NsaWVudENvbmZpZztpZih0aGlzLndlYklkZW50aXR5Q3JlZGVudGlhbHM9dGhpcy53ZWJJZGVudGl0eUNyZWRlbnRpYWxzfHxuZXcgci5XZWJJZGVudGl0eUNyZWRlbnRpYWxzKHRoaXMucGFyYW1zLGUpLCF0aGlzLmNvZ25pdG8pe3ZhciB0PXIudXRpbC5tZXJnZSh7fSxlKTt0LnBhcmFtcz10aGlzLnBhcmFtcyx0aGlzLmNvZ25pdG89bmV3IG8odCl9dGhpcy5zdHM9dGhpcy5zdHN8fG5ldyBpKGUpfSxjYWNoZUlkOmZ1bmN0aW9uKGUpe3RoaXMuX2lkZW50aXR5SWQ9ZS5JZGVudGl0eUlkLHRoaXMucGFyYW1zLklkZW50aXR5SWQ9dGhpcy5faWRlbnRpdHlJZCxyLnV0aWwuaXNCcm93c2VyKCkmJih0aGlzLnNldFN0b3JhZ2UoImlkIixlLklkZW50aXR5SWQpLHRoaXMucGFyYW1zLkxvZ2lucyYmdGhpcy5zZXRTdG9yYWdlKCJwcm92aWRlcnMiLE9iamVjdC5rZXlzKHRoaXMucGFyYW1zLkxvZ2lucykuam9pbigiLCIpKSl9LGdldFN0b3JhZ2U6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc3RvcmFnZVt0aGlzLmxvY2FsU3RvcmFnZUtleVtlXSt0aGlzLnBhcmFtcy5JZGVudGl0eVBvb2xJZCsodGhpcy5wYXJhbXMuTG9naW5JZHx8IiIpXX0sc2V0U3RvcmFnZTpmdW5jdGlvbihlLHQpe3RyeXt0aGlzLnN0b3JhZ2VbdGhpcy5sb2NhbFN0b3JhZ2VLZXlbZV0rdGhpcy5wYXJhbXMuSWRlbnRpdHlQb29sSWQrKHRoaXMucGFyYW1zLkxvZ2luSWR8fCIiKV09dH1jYXRjaChlKXt9fSxzdG9yYWdlOmZ1bmN0aW9uKCl7dHJ5e3ZhciBlPXIudXRpbC5pc0Jyb3dzZXIoKSYmbnVsbCE9PXdpbmRvdy5sb2NhbFN0b3JhZ2UmJiJvYmplY3QiPT10eXBlb2Ygd2luZG93LmxvY2FsU3RvcmFnZT93aW5kb3cubG9jYWxTdG9yYWdlOnt9O3JldHVybiBlWyJhd3MudGVzdC1zdG9yYWdlIl09ImZvb2JhciIsZGVsZXRlIGVbImF3cy50ZXN0LXN0b3JhZ2UiXSxlfWNhdGNoKGUpe3JldHVybnt9fX0oKX0pfSx7Ii4uLy4uL2NsaWVudHMvY29nbml0b2lkZW50aXR5Ijo3LCIuLi8uLi9jbGllbnRzL3N0cyI6OCwiLi4vY29yZSI6MTl9XSwyMzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKTtyLkNyZWRlbnRpYWxQcm92aWRlckNoYWluPXIudXRpbC5pbmhlcml0KHIuQ3JlZGVudGlhbHMse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3RoaXMucHJvdmlkZXJzPWV8fHIuQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW4uZGVmYXVsdFByb3ZpZGVycy5zbGljZSgwKSx0aGlzLnJlc29sdmVDYWxsYmFja3M9W119LHJlc29sdmU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZigwPT09dC5wcm92aWRlcnMubGVuZ3RoKXJldHVybiBlKG5ldyBFcnJvcigiTm8gcHJvdmlkZXJzIikpLHQ7aWYoMT09PXQucmVzb2x2ZUNhbGxiYWNrcy5wdXNoKGUpKXt2YXIgbj0wLG89dC5wcm92aWRlcnMuc2xpY2UoMCk7IWZ1bmN0aW9uIGUoaSxzKXtpZighaSYmc3x8bj09PW8ubGVuZ3RoKXJldHVybiByLnV0aWwuYXJyYXlFYWNoKHQucmVzb2x2ZUNhbGxiYWNrcywoZnVuY3Rpb24oZSl7ZShpLHMpfSkpLHZvaWQodC5yZXNvbHZlQ2FsbGJhY2tzLmxlbmd0aD0wKTt2YXIgYT1vW24rK107KHM9ImZ1bmN0aW9uIj09dHlwZW9mIGE/YS5jYWxsKCk6YSkuZ2V0P3MuZ2V0KChmdW5jdGlvbih0KXtlKHQsdD9udWxsOnMpfSkpOmUobnVsbCxzKX0oKX1yZXR1cm4gdH19KSxyLkNyZWRlbnRpYWxQcm92aWRlckNoYWluLmRlZmF1bHRQcm92aWRlcnM9W10sci5DcmVkZW50aWFsUHJvdmlkZXJDaGFpbi5hZGRQcm9taXNlc1RvQ2xhc3M9ZnVuY3Rpb24oZSl7dGhpcy5wcm90b3R5cGUucmVzb2x2ZVByb21pc2U9ci51dGlsLnByb21pc2lmeU1ldGhvZCgicmVzb2x2ZSIsZSl9LHIuQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW4uZGVsZXRlUHJvbWlzZXNGcm9tQ2xhc3M9ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5wcm90b3R5cGUucmVzb2x2ZVByb21pc2V9LHIudXRpbC5hZGRQcm9taXNlcyhyLkNyZWRlbnRpYWxQcm92aWRlckNoYWluKX0seyIuLi9jb3JlIjoxOX1dLDI0OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiLi4vLi4vY2xpZW50cy9zdHMiKTtyLlNBTUxDcmVkZW50aWFscz1yLnV0aWwuaW5oZXJpdChyLkNyZWRlbnRpYWxzLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXtyLkNyZWRlbnRpYWxzLmNhbGwodGhpcyksdGhpcy5leHBpcmVkPSEwLHRoaXMucGFyYW1zPWV9LHJlZnJlc2g6ZnVuY3Rpb24oZSl7dGhpcy5jb2FsZXNjZVJlZnJlc2goZXx8ci51dGlsLmZuLmNhbGxiYWNrKX0sbG9hZDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuY3JlYXRlQ2xpZW50cygpLHQuc2VydmljZS5hc3N1bWVSb2xlV2l0aFNBTUwoKGZ1bmN0aW9uKG4scil7bnx8dC5zZXJ2aWNlLmNyZWRlbnRpYWxzRnJvbShyLHQpLGUobil9KSl9LGNyZWF0ZUNsaWVudHM6ZnVuY3Rpb24oKXt0aGlzLnNlcnZpY2U9dGhpcy5zZXJ2aWNlfHxuZXcgbyh7cGFyYW1zOnRoaXMucGFyYW1zfSl9fSl9LHsiLi4vLi4vY2xpZW50cy9zdHMiOjgsIi4uL2NvcmUiOjE5fV0sMjU6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCIuLi8uLi9jbGllbnRzL3N0cyIpO3IuVGVtcG9yYXJ5Q3JlZGVudGlhbHM9ci51dGlsLmluaGVyaXQoci5DcmVkZW50aWFscyx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0KXtyLkNyZWRlbnRpYWxzLmNhbGwodGhpcyksdGhpcy5sb2FkTWFzdGVyQ3JlZGVudGlhbHModCksdGhpcy5leHBpcmVkPSEwLHRoaXMucGFyYW1zPWV8fHt9LHRoaXMucGFyYW1zLlJvbGVBcm4mJih0aGlzLnBhcmFtcy5Sb2xlU2Vzc2lvbk5hbWU9dGhpcy5wYXJhbXMuUm9sZVNlc3Npb25OYW1lfHwidGVtcG9yYXJ5LWNyZWRlbnRpYWxzIil9LHJlZnJlc2g6ZnVuY3Rpb24oZSl7dGhpcy5jb2FsZXNjZVJlZnJlc2goZXx8ci51dGlsLmZuLmNhbGxiYWNrKX0sbG9hZDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuY3JlYXRlQ2xpZW50cygpLHQubWFzdGVyQ3JlZGVudGlhbHMuZ2V0KChmdW5jdGlvbigpe3Quc2VydmljZS5jb25maWcuY3JlZGVudGlhbHM9dC5tYXN0ZXJDcmVkZW50aWFscywodC5wYXJhbXMuUm9sZUFybj90LnNlcnZpY2UuYXNzdW1lUm9sZTp0LnNlcnZpY2UuZ2V0U2Vzc2lvblRva2VuKS5jYWxsKHQuc2VydmljZSwoZnVuY3Rpb24obixyKXtufHx0LnNlcnZpY2UuY3JlZGVudGlhbHNGcm9tKHIsdCksZShuKX0pKX0pKX0sbG9hZE1hc3RlckNyZWRlbnRpYWxzOmZ1bmN0aW9uKGUpe2Zvcih0aGlzLm1hc3RlckNyZWRlbnRpYWxzPWV8fHIuY29uZmlnLmNyZWRlbnRpYWxzO3RoaXMubWFzdGVyQ3JlZGVudGlhbHMubWFzdGVyQ3JlZGVudGlhbHM7KXRoaXMubWFzdGVyQ3JlZGVudGlhbHM9dGhpcy5tYXN0ZXJDcmVkZW50aWFscy5tYXN0ZXJDcmVkZW50aWFsczsiZnVuY3Rpb24iIT10eXBlb2YgdGhpcy5tYXN0ZXJDcmVkZW50aWFscy5nZXQmJih0aGlzLm1hc3RlckNyZWRlbnRpYWxzPW5ldyByLkNyZWRlbnRpYWxzKHRoaXMubWFzdGVyQ3JlZGVudGlhbHMpKX0sY3JlYXRlQ2xpZW50czpmdW5jdGlvbigpe3RoaXMuc2VydmljZT10aGlzLnNlcnZpY2V8fG5ldyBvKHtwYXJhbXM6dGhpcy5wYXJhbXN9KX19KX0seyIuLi8uLi9jbGllbnRzL3N0cyI6OCwiLi4vY29yZSI6MTl9XSwyNjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uLy4uL2NsaWVudHMvc3RzIik7ci5XZWJJZGVudGl0eUNyZWRlbnRpYWxzPXIudXRpbC5pbmhlcml0KHIuQ3JlZGVudGlhbHMse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCl7ci5DcmVkZW50aWFscy5jYWxsKHRoaXMpLHRoaXMuZXhwaXJlZD0hMCx0aGlzLnBhcmFtcz1lLHRoaXMucGFyYW1zLlJvbGVTZXNzaW9uTmFtZT10aGlzLnBhcmFtcy5Sb2xlU2Vzc2lvbk5hbWV8fCJ3ZWItaWRlbnRpdHkiLHRoaXMuZGF0YT1udWxsLHRoaXMuX2NsaWVudENvbmZpZz1yLnV0aWwuY29weSh0fHx7fSl9LHJlZnJlc2g6ZnVuY3Rpb24oZSl7dGhpcy5jb2FsZXNjZVJlZnJlc2goZXx8ci51dGlsLmZuLmNhbGxiYWNrKX0sbG9hZDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuY3JlYXRlQ2xpZW50cygpLHQuc2VydmljZS5hc3N1bWVSb2xlV2l0aFdlYklkZW50aXR5KChmdW5jdGlvbihuLHIpe3QuZGF0YT1udWxsLG58fCh0LmRhdGE9cix0LnNlcnZpY2UuY3JlZGVudGlhbHNGcm9tKHIsdCkpLGUobil9KSl9LGNyZWF0ZUNsaWVudHM6ZnVuY3Rpb24oKXtpZighdGhpcy5zZXJ2aWNlKXt2YXIgZT1yLnV0aWwubWVyZ2Uoe30sdGhpcy5fY2xpZW50Q29uZmlnKTtlLnBhcmFtcz10aGlzLnBhcmFtcyx0aGlzLnNlcnZpY2U9bmV3IG8oZSl9fX0pfSx7Ii4uLy4uL2NsaWVudHMvc3RzIjo4LCIuLi9jb3JlIjoxOX1dLDI3OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKG4peyhmdW5jdGlvbigpe3ZhciByPWUoIi4vY29yZSIpLG89ZSgiLi91dGlsIiksaT1bIkFXU19FTkFCTEVfRU5EUE9JTlRfRElTQ09WRVJZIiwiQVdTX0VORFBPSU5UX0RJU0NPVkVSWV9FTkFCTEVEIl07ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLnNlcnZpY2Usbj10LmFwaXx8e30scj0obi5vcGVyYXRpb25zLHt9KTtyZXR1cm4gdC5jb25maWcucmVnaW9uJiYoci5yZWdpb249dC5jb25maWcucmVnaW9uKSxuLnNlcnZpY2VJZCYmKHIuc2VydmljZUlkPW4uc2VydmljZUlkKSx0LmNvbmZpZy5jcmVkZW50aWFscy5hY2Nlc3NLZXlJZCYmKHIuYWNjZXNzS2V5SWQ9dC5jb25maWcuY3JlZGVudGlhbHMuYWNjZXNzS2V5SWQpLHJ9ZnVuY3Rpb24gYShlLHQsbil7biYmbnVsbCE9dCYmInN0cnVjdHVyZSI9PT1uLnR5cGUmJm4ucmVxdWlyZWQmJm4ucmVxdWlyZWQubGVuZ3RoPjAmJm8uYXJyYXlFYWNoKG4ucmVxdWlyZWQsKGZ1bmN0aW9uKHIpe3ZhciBvPW4ubWVtYmVyc1tyXTtpZighMD09PW8uZW5kcG9pbnREaXNjb3ZlcnlJZCl7dmFyIGk9by5pc0xvY2F0aW9uTmFtZT9vLm5hbWU6cjtlW2ldPVN0cmluZyh0W3JdKX1lbHNlIGEoZSx0W3JdLG8pfSkpfWZ1bmN0aW9uIGMoZSx0KXt2YXIgbj17fTtyZXR1cm4gYShuLGUucGFyYW1zLHQpLG59ZnVuY3Rpb24gdShlKXt2YXIgdD1lLnNlcnZpY2Usbj10LmFwaSxpPW4ub3BlcmF0aW9ucz9uLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dOnZvaWQgMCxhPWMoZSxpP2kuaW5wdXQ6dm9pZCAwKSx1PXMoZSk7T2JqZWN0LmtleXMoYSkubGVuZ3RoPjAmJih1PW8udXBkYXRlKHUsYSksaSYmKHUub3BlcmF0aW9uPWkubmFtZSkpO3ZhciBsPXIuZW5kcG9pbnRDYWNoZS5nZXQodSk7aWYoIWx8fDEhPT1sLmxlbmd0aHx8IiIhPT1sWzBdLkFkZHJlc3MpaWYobCYmbC5sZW5ndGg+MCllLmh0dHBSZXF1ZXN0LnVwZGF0ZUVuZHBvaW50KGxbMF0uQWRkcmVzcyk7ZWxzZXt2YXIgcD10Lm1ha2VSZXF1ZXN0KG4uZW5kcG9pbnRPcGVyYXRpb24se09wZXJhdGlvbjppLm5hbWUsSWRlbnRpZmllcnM6YX0pO2QocCkscC5yZW1vdmVMaXN0ZW5lcigidmFsaWRhdGUiLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZS5WQUxJREFURV9QQVJBTUVURVJTKSxwLnJlbW92ZUxpc3RlbmVyKCJyZXRyeSIsci5FdmVudExpc3RlbmVycy5Db3JlLlJFVFJZX0NIRUNLKSxyLmVuZHBvaW50Q2FjaGUucHV0KHUsW3tBZGRyZXNzOiIiLENhY2hlUGVyaW9kSW5NaW51dGVzOjF9XSkscC5zZW5kKChmdW5jdGlvbihlLHQpe3QmJnQuRW5kcG9pbnRzP3IuZW5kcG9pbnRDYWNoZS5wdXQodSx0LkVuZHBvaW50cyk6ZSYmci5lbmRwb2ludENhY2hlLnB1dCh1LFt7QWRkcmVzczoiIixDYWNoZVBlcmlvZEluTWludXRlczoxfV0pfSkpfX12YXIgbD17fTtmdW5jdGlvbiBwKGUsdCl7dmFyIG49ZS5zZXJ2aWNlLGk9bi5hcGksYT1pLm9wZXJhdGlvbnM/aS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXTp2b2lkIDAsdT1hP2EuaW5wdXQ6dm9pZCAwLHA9YyhlLHUpLGg9cyhlKTtPYmplY3Qua2V5cyhwKS5sZW5ndGg+MCYmKGg9by51cGRhdGUoaCxwKSxhJiYoaC5vcGVyYXRpb249YS5uYW1lKSk7dmFyIGY9ci5FbmRwb2ludENhY2hlLmdldEtleVN0cmluZyhoKSxnPXIuZW5kcG9pbnRDYWNoZS5nZXQoZik7aWYoZyYmMT09PWcubGVuZ3RoJiYiIj09PWdbMF0uQWRkcmVzcylyZXR1cm4gbFtmXXx8KGxbZl09W10pLHZvaWQgbFtmXS5wdXNoKHtyZXF1ZXN0OmUsY2FsbGJhY2s6dH0pO2lmKGcmJmcubGVuZ3RoPjApZS5odHRwUmVxdWVzdC51cGRhdGVFbmRwb2ludChnWzBdLkFkZHJlc3MpLHQoKTtlbHNle3ZhciBtPW4ubWFrZVJlcXVlc3QoaS5lbmRwb2ludE9wZXJhdGlvbix7T3BlcmF0aW9uOmEubmFtZSxJZGVudGlmaWVyczpwfSk7bS5yZW1vdmVMaXN0ZW5lcigidmFsaWRhdGUiLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZS5WQUxJREFURV9QQVJBTUVURVJTKSxkKG0pLHIuZW5kcG9pbnRDYWNoZS5wdXQoZixbe0FkZHJlc3M6IiIsQ2FjaGVQZXJpb2RJbk1pbnV0ZXM6NjB9XSksbS5zZW5kKChmdW5jdGlvbihuLGkpe2lmKG4pe2lmKGUucmVzcG9uc2UuZXJyb3I9by5lcnJvcihuLHtyZXRyeWFibGU6ITF9KSxyLmVuZHBvaW50Q2FjaGUucmVtb3ZlKGgpLGxbZl0pe3ZhciBzPWxbZl07by5hcnJheUVhY2gocywoZnVuY3Rpb24oZSl7ZS5yZXF1ZXN0LnJlc3BvbnNlLmVycm9yPW8uZXJyb3Iobix7cmV0cnlhYmxlOiExfSksZS5jYWxsYmFjaygpfSkpLGRlbGV0ZSBsW2ZdfX1lbHNlIGkmJihyLmVuZHBvaW50Q2FjaGUucHV0KGYsaS5FbmRwb2ludHMpLGUuaHR0cFJlcXVlc3QudXBkYXRlRW5kcG9pbnQoaS5FbmRwb2ludHNbMF0uQWRkcmVzcyksbFtmXSkmJihzPWxbZl0sby5hcnJheUVhY2gocywoZnVuY3Rpb24oZSl7ZS5yZXF1ZXN0Lmh0dHBSZXF1ZXN0LnVwZGF0ZUVuZHBvaW50KGkuRW5kcG9pbnRzWzBdLkFkZHJlc3MpLGUuY2FsbGJhY2soKX0pKSxkZWxldGUgbFtmXSk7dCgpfSkpfX1mdW5jdGlvbiBkKGUpe3ZhciB0PWUuc2VydmljZS5hcGkuYXBpVmVyc2lvbjt0JiYhZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJ4LWFtei1hcGktdmVyc2lvbiJdJiYoZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJ4LWFtei1hcGktdmVyc2lvbiJdPXQpfWZ1bmN0aW9uIGgoZSl7dmFyIHQ9ZS5lcnJvcixuPWUuaHR0cFJlc3BvbnNlO2lmKHQmJigiSW52YWxpZEVuZHBvaW50RXhjZXB0aW9uIj09PXQuY29kZXx8NDIxPT09bi5zdGF0dXNDb2RlKSl7dmFyIGk9ZS5yZXF1ZXN0LGE9aS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zfHx7fSx1PWMoaSxhW2kub3BlcmF0aW9uXT9hW2kub3BlcmF0aW9uXS5pbnB1dDp2b2lkIDApLGw9cyhpKTtPYmplY3Qua2V5cyh1KS5sZW5ndGg+MCYmKGw9by51cGRhdGUobCx1KSxhW2kub3BlcmF0aW9uXSYmKGwub3BlcmF0aW9uPWFbaS5vcGVyYXRpb25dLm5hbWUpKSxyLmVuZHBvaW50Q2FjaGUucmVtb3ZlKGwpfX1mdW5jdGlvbiBmKGUpe3JldHVyblsiZmFsc2UiLCIwIl0uaW5kZXhPZihlKT49MH10LmV4cG9ydHM9e2Rpc2NvdmVyRW5kcG9pbnQ6ZnVuY3Rpb24oZSx0KXt2YXIgcz1lLnNlcnZpY2V8fHt9O2lmKGZ1bmN0aW9uKGUpe2lmKGUuX29yaWdpbmFsQ29uZmlnJiZlLl9vcmlnaW5hbENvbmZpZy5lbmRwb2ludCYmITA9PT1lLl9vcmlnaW5hbENvbmZpZy5lbmRwb2ludERpc2NvdmVyeUVuYWJsZWQpdGhyb3cgby5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IkNvbmZpZ3VyYXRpb25FeGNlcHRpb24iLG1lc3NhZ2U6IkN1c3RvbSBlbmRwb2ludCBpcyBzdXBwbGllZDsgZW5kcG9pbnREaXNjb3ZlcnlFbmFibGVkIG11c3Qgbm90IGJlIHRydWUuIn0pO3ZhciB0PXIuY29uZmlnW2Uuc2VydmljZUlkZW50aWZpZXJdfHx7fTtyZXR1cm4gQm9vbGVhbihyLmNvbmZpZy5lbmRwb2ludHx8dC5lbmRwb2ludHx8ZS5fb3JpZ2luYWxDb25maWcmJmUuX29yaWdpbmFsQ29uZmlnLmVuZHBvaW50KX0ocyl8fGUuaXNQcmVzaWduZWQoKSlyZXR1cm4gdCgpO3ZhciBhPShzLmFwaS5vcGVyYXRpb25zfHx7fSlbZS5vcGVyYXRpb25dLGM9YT9hLmVuZHBvaW50RGlzY292ZXJ5UmVxdWlyZWQ6Ik5VTEwiLGw9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlfHx7fTtpZih2b2lkIDAhPT10LmNvbmZpZy5lbmRwb2ludERpc2NvdmVyeUVuYWJsZWQpcmV0dXJuIHQuY29uZmlnLmVuZHBvaW50RGlzY292ZXJ5RW5hYmxlZDtpZighby5pc0Jyb3dzZXIoKSl7Zm9yKHZhciBzPTA7czxpLmxlbmd0aDtzKyspe3ZhciBhPWlbc107aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4uZW52LGEpKXtpZigiIj09PW4uZW52W2FdfHx2b2lkIDA9PT1uLmVudlthXSl0aHJvdyBvLmVycm9yKG5ldyBFcnJvcix7Y29kZToiQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiIsbWVzc2FnZToiZW52aXJvbm1lbnRhbCB2YXJpYWJsZSAiK2ErIiBjYW5ub3QgYmUgc2V0IHRvIG5vdGhpbmcifSk7cmV0dXJuIWYobi5lbnZbYV0pfX12YXIgYz17fTt0cnl7Yz1yLnV0aWwuaW5pTG9hZGVyP3IudXRpbC5pbmlMb2FkZXIubG9hZEZyb20oe2lzQ29uZmlnOiEwLGZpbGVuYW1lOm4uZW52W3IudXRpbC5zaGFyZWRDb25maWdGaWxlRW52XX0pOnt9fWNhdGNoKGUpe312YXIgdT1jW24uZW52LkFXU19QUk9GSUxFfHxyLnV0aWwuZGVmYXVsdFByb2ZpbGVdfHx7fTtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodSwiZW5kcG9pbnRfZGlzY292ZXJ5X2VuYWJsZWQiKSl7aWYodm9pZCAwPT09dS5lbmRwb2ludF9kaXNjb3ZlcnlfZW5hYmxlZCl0aHJvdyBvLmVycm9yKG5ldyBFcnJvcix7Y29kZToiQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiIsbWVzc2FnZToiY29uZmlnIGZpbGUgZW50cnkgJ2VuZHBvaW50X2Rpc2NvdmVyeV9lbmFibGVkJyBjYW5ub3QgYmUgc2V0IHRvIG5vdGhpbmcifSk7cmV0dXJuIWYodS5lbmRwb2ludF9kaXNjb3ZlcnlfZW5hYmxlZCl9fX0oZSksZD1zLmFwaS5oYXNSZXF1aXJlZEVuZHBvaW50RGlzY292ZXJ5O3N3aXRjaCgobHx8ZCkmJmUuaHR0cFJlcXVlc3QuYXBwZW5kVG9Vc2VyQWdlbnQoImVuZHBvaW50LWRpc2NvdmVyeSIpLGMpe2Nhc2UiT1BUSU9OQUwiOihsfHxkKSYmKHUoZSksZS5hZGROYW1lZExpc3RlbmVyKCJJTlZBTElEQVRFX0NBQ0hFRF9FTkRQT0lOVFMiLCJleHRyYWN0RXJyb3IiLGgpKSx0KCk7YnJlYWs7Y2FzZSJSRVFVSVJFRCI6aWYoITE9PT1sKXtlLnJlc3BvbnNlLmVycm9yPW8uZXJyb3IobmV3IEVycm9yLHtjb2RlOiJDb25maWd1cmF0aW9uRXhjZXB0aW9uIixtZXNzYWdlOiJFbmRwb2ludCBEaXNjb3ZlcnkgaXMgZGlzYWJsZWQgYnV0ICIrcy5hcGkuY2xhc3NOYW1lKyIuIitlLm9wZXJhdGlvbisiKCkgcmVxdWlyZXMgaXQuIFBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb25zLiJ9KSx0KCk7YnJlYWt9ZS5hZGROYW1lZExpc3RlbmVyKCJJTlZBTElEQVRFX0NBQ0hFRF9FTkRQT0lOVFMiLCJleHRyYWN0RXJyb3IiLGgpLHAoZSx0KTticmVhaztkZWZhdWx0OnQoKX19LHJlcXVpcmVkRGlzY292ZXJFbmRwb2ludDpwLG9wdGlvbmFsRGlzY292ZXJFbmRwb2ludDp1LG1hcnNoYWxsQ3VzdG9tSWRlbnRpZmllcnM6YyxnZXRDYWNoZUtleTpzLGludmFsaWRhdGVDYWNoZWRFbmRwb2ludDpofX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHsiLi9jb3JlIjoxOSwiLi91dGlsIjo3NCxfcHJvY2Vzczo5MX1dLDI4OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vZXZlbnQtc3RyZWFtL2V2ZW50LW1lc3NhZ2UtY2h1bmtlciIpLmV2ZW50TWVzc2FnZUNodW5rZXIsbz1lKCIuL3BhcnNlLWV2ZW50IikucGFyc2VFdmVudDt0LmV4cG9ydHM9e2NyZWF0ZUV2ZW50U3RyZWFtOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIGk9cihlKSxzPVtdLGE9MDthPGkubGVuZ3RoO2ErKylzLnB1c2gobyh0LGlbYV0sbikpO3JldHVybiBzfX19LHsiLi4vZXZlbnQtc3RyZWFtL2V2ZW50LW1lc3NhZ2UtY2h1bmtlciI6MjksIi4vcGFyc2UtZXZlbnQiOjMxfV0sMjk6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e2V2ZW50TWVzc2FnZUNodW5rZXI6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoOyl7dmFyIHI9ZS5yZWFkSW50MzJCRShuKSxvPWUuc2xpY2UobixyK24pO24rPXIsdC5wdXNoKG8pfXJldHVybiB0fX19LHt9XSwzMDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKS51dGlsLG89ci5idWZmZXIudG9CdWZmZXI7ZnVuY3Rpb24gaShlKXtpZig4IT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbnQ2NCBidWZmZXJzIG11c3QgYmUgZXhhY3RseSA4IGJ5dGVzIik7ci5CdWZmZXIuaXNCdWZmZXIoZSl8fChlPW8oZSkpLHRoaXMuYnl0ZXM9ZX1mdW5jdGlvbiBzKGUpe2Zvcih2YXIgdD0wO3Q8ODt0KyspZVt0XV49MjU1O2Zvcih0PTc7dD4tMSYmKGVbdF0rKywwPT09ZVt0XSk7dC0tKTt9aS5mcm9tTnVtYmVyPWZ1bmN0aW9uKGUpe2lmKGU+MHg4MDAwMDAwMDAwMDAwMDAwfHxlPC0weDgwMDAwMDAwMDAwMDAwMDApdGhyb3cgbmV3IEVycm9yKGUrIiBpcyB0b28gbGFyZ2UgKG9yLCBpZiBuZWdhdGl2ZSwgdG9vIHNtYWxsKSB0byByZXByZXNlbnQgYXMgYW4gSW50NjQiKTtmb3IodmFyIHQ9bmV3IFVpbnQ4QXJyYXkoOCksbj03LHI9TWF0aC5hYnMoTWF0aC5yb3VuZChlKSk7bj4tMSYmcj4wO24tLSxyLz0yNTYpdFtuXT1yO3JldHVybiBlPDAmJnModCksbmV3IGkodCl9LGkucHJvdG90eXBlLnZhbHVlT2Y9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmJ5dGVzLnNsaWNlKDApLHQ9MTI4JmVbMF07cmV0dXJuIHQmJnMoZSkscGFyc2VJbnQoZS50b1N0cmluZygiaGV4IiksMTYpKih0Py0xOjEpfSxpLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBTdHJpbmcodGhpcy52YWx1ZU9mKCkpfSx0LmV4cG9ydHM9e0ludDY0Oml9fSx7Ii4uL2NvcmUiOjE5fV0sMzE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL3BhcnNlLW1lc3NhZ2UiKS5wYXJzZU1lc3NhZ2U7dC5leHBvcnRzPXtwYXJzZUV2ZW50OmZ1bmN0aW9uKGUsdCxuKXt2YXIgbz1yKHQpLGk9by5oZWFkZXJzWyI6bWVzc2FnZS10eXBlIl07aWYoaSl7aWYoImVycm9yIj09PWkudmFsdWUpdGhyb3cgZnVuY3Rpb24oZSl7dmFyIHQ9ZS5oZWFkZXJzWyI6ZXJyb3ItY29kZSJdLG49ZS5oZWFkZXJzWyI6ZXJyb3ItbWVzc2FnZSJdLHI9bmV3IEVycm9yKG4udmFsdWV8fG4pO3JldHVybiByLmNvZGU9ci5uYW1lPXQudmFsdWV8fHQscn0obyk7aWYoImV2ZW50IiE9PWkudmFsdWUpcmV0dXJufXZhciBzPW8uaGVhZGVyc1siOmV2ZW50LXR5cGUiXSxhPW4ubWVtYmVyc1tzLnZhbHVlXTtpZihhKXt2YXIgYz17fSx1PWEuZXZlbnRQYXlsb2FkTWVtYmVyTmFtZTtpZih1KXt2YXIgbD1hLm1lbWJlcnNbdV07ImJpbmFyeSI9PT1sLnR5cGU/Y1t1XT1vLmJvZHk6Y1t1XT1lLnBhcnNlKG8uYm9keS50b1N0cmluZygpLGwpfWZvcih2YXIgcD1hLmV2ZW50SGVhZGVyTWVtYmVyTmFtZXMsZD0wO2Q8cC5sZW5ndGg7ZCsrKXt2YXIgaD1wW2RdO28uaGVhZGVyc1toXSYmKGNbaF09YS5tZW1iZXJzW2hdLnRvVHlwZShvLmhlYWRlcnNbaF0udmFsdWUpKX12YXIgZj17fTtyZXR1cm4gZltzLnZhbHVlXT1jLGZ9fX19LHsiLi9wYXJzZS1tZXNzYWdlIjozMn1dLDMyOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9pbnQ2NCIpLkludDY0LG89ZSgiLi9zcGxpdC1tZXNzYWdlIikuc3BsaXRNZXNzYWdlLGk9ImJvb2xlYW4iLHM9ImJ5dGUiLGE9InNob3J0IixjPSJpbnRlZ2VyIix1PSJsb25nIixsPSJiaW5hcnkiLHA9InN0cmluZyIsZD0idGltZXN0YW1wIixoPSJ1dWlkIjtmdW5jdGlvbiBmKGUpe2Zvcih2YXIgdD17fSxuPTA7bjxlLmxlbmd0aDspe3ZhciBvPWUucmVhZFVJbnQ4KG4rKyksZj1lLnNsaWNlKG4sbitvKS50b1N0cmluZygpO3N3aXRjaChuKz1vLGUucmVhZFVJbnQ4KG4rKykpe2Nhc2UgMDp0W2ZdPXt0eXBlOmksdmFsdWU6ITB9O2JyZWFrO2Nhc2UgMTp0W2ZdPXt0eXBlOmksdmFsdWU6ITF9O2JyZWFrO2Nhc2UgMjp0W2ZdPXt0eXBlOnMsdmFsdWU6ZS5yZWFkSW50OChuKyspfTticmVhaztjYXNlIDM6dFtmXT17dHlwZTphLHZhbHVlOmUucmVhZEludDE2QkUobil9LG4rPTI7YnJlYWs7Y2FzZSA0OnRbZl09e3R5cGU6Yyx2YWx1ZTplLnJlYWRJbnQzMkJFKG4pfSxuKz00O2JyZWFrO2Nhc2UgNTp0W2ZdPXt0eXBlOnUsdmFsdWU6bmV3IHIoZS5zbGljZShuLG4rOCkpfSxuKz04O2JyZWFrO2Nhc2UgNjp2YXIgZz1lLnJlYWRVSW50MTZCRShuKTtuKz0yLHRbZl09e3R5cGU6bCx2YWx1ZTplLnNsaWNlKG4sbitnKX0sbis9ZzticmVhaztjYXNlIDc6dmFyIG09ZS5yZWFkVUludDE2QkUobik7bis9Mix0W2ZdPXt0eXBlOnAsdmFsdWU6ZS5zbGljZShuLG4rbSkudG9TdHJpbmcoKX0sbis9bTticmVhaztjYXNlIDg6dFtmXT17dHlwZTpkLHZhbHVlOm5ldyBEYXRlKG5ldyByKGUuc2xpY2UobixuKzgpKS52YWx1ZU9mKCkpfSxuKz04O2JyZWFrO2Nhc2UgOTp2YXIgdj1lLnNsaWNlKG4sbisxNikudG9TdHJpbmcoImhleCIpO24rPTE2LHRbZl09e3R5cGU6aCx2YWx1ZTp2LnN1YnN0cigwLDgpKyItIit2LnN1YnN0cig4LDQpKyItIit2LnN1YnN0cigxMiw0KSsiLSIrdi5zdWJzdHIoMTYsNCkrIi0iK3Yuc3Vic3RyKDIwKX07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVucmVjb2duaXplZCBoZWFkZXIgdHlwZSB0YWciKX19cmV0dXJuIHR9dC5leHBvcnRzPXtwYXJzZU1lc3NhZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9byhlKTtyZXR1cm57aGVhZGVyczpmKHQuaGVhZGVycyksYm9keTp0LmJvZHl9fX19LHsiLi9pbnQ2NCI6MzAsIi4vc3BsaXQtbWVzc2FnZSI6MzN9XSwzMzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKS51dGlsLG89ci5idWZmZXIudG9CdWZmZXI7dC5leHBvcnRzPXtzcGxpdE1lc3NhZ2U6ZnVuY3Rpb24oZSl7aWYoci5CdWZmZXIuaXNCdWZmZXIoZSl8fChlPW8oZSkpLGUubGVuZ3RoPDE2KXRocm93IG5ldyBFcnJvcigiUHJvdmlkZWQgbWVzc2FnZSB0b28gc2hvcnQgdG8gYWNjb21tb2RhdGUgZXZlbnQgc3RyZWFtIG1lc3NhZ2Ugb3ZlcmhlYWQiKTtpZihlLmxlbmd0aCE9PWUucmVhZFVJbnQzMkJFKDApKXRocm93IG5ldyBFcnJvcigiUmVwb3J0ZWQgbWVzc2FnZSBsZW5ndGggZG9lcyBub3QgbWF0Y2ggcmVjZWl2ZWQgbWVzc2FnZSBsZW5ndGgiKTt2YXIgdD1lLnJlYWRVSW50MzJCRSg4KTtpZih0IT09ci5jcnlwdG8uY3JjMzIoZS5zbGljZSgwLDgpKSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBwcmVsdWRlIGNoZWNrc3VtIHNwZWNpZmllZCBpbiB0aGUgbWVzc2FnZSAoIit0KyIpIGRvZXMgbm90IG1hdGNoIHRoZSBjYWxjdWxhdGVkIENSQzMyIGNoZWNrc3VtLiIpO3ZhciBuPWUucmVhZFVJbnQzMkJFKGUubGVuZ3RoLTQpO2lmKG4hPT1yLmNyeXB0by5jcmMzMihlLnNsaWNlKDAsZS5sZW5ndGgtNCkpKXRocm93IG5ldyBFcnJvcigiVGhlIG1lc3NhZ2UgY2hlY2tzdW0gZGlkIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgdmFsdWUgb2YgIituKTt2YXIgaT0xMitlLnJlYWRVSW50MzJCRSg0KTtyZXR1cm57aGVhZGVyczplLnNsaWNlKDEyLGkpLGJvZHk6ZS5zbGljZShpLGUubGVuZ3RoLTQpfX19fSx7Ii4uL2NvcmUiOjE5fV0sMzQ6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24odCl7KGZ1bmN0aW9uKCl7dmFyIG49ZSgiLi9jb3JlIikscj1lKCIuL3NlcXVlbnRpYWxfZXhlY3V0b3IiKSxvPWUoIi4vZGlzY292ZXJfZW5kcG9pbnQiKS5kaXNjb3ZlckVuZHBvaW50O2Z1bmN0aW9uIGkoZSl7aWYoIWUuc2VydmljZS5hcGkub3BlcmF0aW9ucylyZXR1cm4iIjt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dO3JldHVybiB0P3QuYXV0aHR5cGU6IiJ9ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLnNlcnZpY2U7cmV0dXJuIHQuY29uZmlnLnNpZ25hdHVyZVZlcnNpb24/dC5jb25maWcuc2lnbmF0dXJlVmVyc2lvbjp0LmFwaS5zaWduYXR1cmVWZXJzaW9uP3QuYXBpLnNpZ25hdHVyZVZlcnNpb246aShlKX1uLkV2ZW50TGlzdGVuZXJzPXtDb3JlOnt9fSxuLkV2ZW50TGlzdGVuZXJzPXtDb3JlOihuZXcgcikuYWRkTmFtZWRMaXN0ZW5lcnMoKGZ1bmN0aW9uKGUscil7cigiVkFMSURBVEVfQ1JFREVOVElBTFMiLCJ2YWxpZGF0ZSIsKGZ1bmN0aW9uKGUsdCl7aWYoIWUuc2VydmljZS5hcGkuc2lnbmF0dXJlVmVyc2lvbiYmIWUuc2VydmljZS5jb25maWcuc2lnbmF0dXJlVmVyc2lvbilyZXR1cm4gdCgpOyJiZWFyZXIiIT09cyhlKT9lLnNlcnZpY2UuY29uZmlnLmdldENyZWRlbnRpYWxzKChmdW5jdGlvbihyKXtyJiYoZS5yZXNwb25zZS5lcnJvcj1uLnV0aWwuZXJyb3Iocix7Y29kZToiQ3JlZGVudGlhbHNFcnJvciIsbWVzc2FnZToiTWlzc2luZyBjcmVkZW50aWFscyBpbiBjb25maWcsIGlmIHVzaW5nIEFXU19DT05GSUdfRklMRSwgc2V0IEFXU19TREtfTE9BRF9DT05GSUc9MSJ9KSksdCgpfSkpOmUuc2VydmljZS5jb25maWcuZ2V0VG9rZW4oKGZ1bmN0aW9uKHIpe3ImJihlLnJlc3BvbnNlLmVycm9yPW4udXRpbC5lcnJvcihyLHtjb2RlOiJUb2tlbkVycm9yIn0pKSx0KCl9KSl9KSksZSgiVkFMSURBVEVfUkVHSU9OIiwidmFsaWRhdGUiLChmdW5jdGlvbihlKXtpZighZS5zZXJ2aWNlLmlzR2xvYmFsRW5kcG9pbnQpe3ZhciB0PW5ldyBSZWdFeHAoL14oW2EtekEtWjAtOV18W2EtekEtWjAtOV1bYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSkkLyk7ZS5zZXJ2aWNlLmNvbmZpZy5yZWdpb24/dC50ZXN0KGUuc2VydmljZS5jb25maWcucmVnaW9uKXx8KGUucmVzcG9uc2UuZXJyb3I9bi51dGlsLmVycm9yKG5ldyBFcnJvcix7Y29kZToiQ29uZmlnRXJyb3IiLG1lc3NhZ2U6IkludmFsaWQgcmVnaW9uIGluIGNvbmZpZyJ9KSk6ZS5yZXNwb25zZS5lcnJvcj1uLnV0aWwuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJDb25maWdFcnJvciIsbWVzc2FnZToiTWlzc2luZyByZWdpb24gaW4gY29uZmlnIn0pfX0pKSxlKCJCVUlMRF9JREVNUE9URU5DWV9UT0tFTlMiLCJ2YWxpZGF0ZSIsKGZ1bmN0aW9uKGUpe2lmKGUuc2VydmljZS5hcGkub3BlcmF0aW9ucyl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXTtpZih0KXt2YXIgcj10LmlkZW1wb3RlbnRNZW1iZXJzO2lmKHIubGVuZ3RoKXtmb3IodmFyIG89bi51dGlsLmNvcHkoZS5wYXJhbXMpLGk9MCxzPXIubGVuZ3RoO2k8cztpKyspb1tyW2ldXXx8KG9bcltpXV09bi51dGlsLnV1aWQudjQoKSk7ZS5wYXJhbXM9b319fX0pKSxlKCJWQUxJREFURV9QQVJBTUVURVJTIiwidmFsaWRhdGUiLChmdW5jdGlvbihlKXtpZihlLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnMpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0uaW5wdXQscj1lLnNlcnZpY2UuY29uZmlnLnBhcmFtVmFsaWRhdGlvbjtuZXcgbi5QYXJhbVZhbGlkYXRvcihyKS52YWxpZGF0ZSh0LGUucGFyYW1zKX19KSksZSgiQ09NUFVURV9DSEVDS1NVTSIsImFmdGVyQnVpbGQiLChmdW5jdGlvbihlKXtpZihlLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnMpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl07aWYodCl7dmFyIHI9ZS5odHRwUmVxdWVzdC5ib2R5LG89ciYmKG4udXRpbC5CdWZmZXIuaXNCdWZmZXIocil8fCJzdHJpbmciPT10eXBlb2YgciksaT1lLmh0dHBSZXF1ZXN0LmhlYWRlcnM7aWYodC5odHRwQ2hlY2tzdW1SZXF1aXJlZCYmZS5zZXJ2aWNlLmNvbmZpZy5jb21wdXRlQ2hlY2tzdW1zJiZvJiYhaVsiQ29udGVudC1NRDUiXSl7dmFyIHM9bi51dGlsLmNyeXB0by5tZDUociwiYmFzZTY0Iik7aVsiQ29udGVudC1NRDUiXT1zfX19fSkpLHIoIkNPTVBVVEVfU0hBMjU2IiwiYWZ0ZXJCdWlsZCIsKGZ1bmN0aW9uKGUsdCl7aWYoZS5oYWx0SGFuZGxlcnNPbkVycm9yKCksZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zKXt2YXIgcj1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLG89cj9yLmF1dGh0eXBlOiIiO2lmKCFlLnNlcnZpY2UuYXBpLnNpZ25hdHVyZVZlcnNpb24mJiFvJiYhZS5zZXJ2aWNlLmNvbmZpZy5zaWduYXR1cmVWZXJzaW9uKXJldHVybiB0KCk7aWYoZS5zZXJ2aWNlLmdldFNpZ25lckNsYXNzKGUpPT09bi5TaWduZXJzLlY0KXt2YXIgaT1lLmh0dHBSZXF1ZXN0LmJvZHl8fCIiO2lmKG8uaW5kZXhPZigidW5zaWduZWQtYm9keSIpPj0wKXJldHVybiBlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIlgtQW16LUNvbnRlbnQtU2hhMjU2Il09IlVOU0lHTkVELVBBWUxPQUQiLHQoKTtuLnV0aWwuY29tcHV0ZVNoYTI1NihpLChmdW5jdGlvbihuLHIpe24/dChuKTooZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJYLUFtei1Db250ZW50LVNoYTI1NiJdPXIsdCgpKX0pKX1lbHNlIHQoKX19KSksZSgiU0VUX0NPTlRFTlRfTEVOR1RIIiwiYWZ0ZXJCdWlsZCIsKGZ1bmN0aW9uKGUpe3ZhciB0PWkoZSkscj1uLnV0aWwuZ2V0UmVxdWVzdFBheWxvYWRTaGFwZShlKTtpZih2b2lkIDA9PT1lLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIkNvbnRlbnQtTGVuZ3RoIl0pdHJ5e3ZhciBvPW4udXRpbC5zdHJpbmcuYnl0ZUxlbmd0aChlLmh0dHBSZXF1ZXN0LmJvZHkpO2UuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1MZW5ndGgiXT1vfWNhdGNoKG4pe2lmKHImJnIuaXNTdHJlYW1pbmcpe2lmKHIucmVxdWlyZXNMZW5ndGgpdGhyb3cgbjtpZih0LmluZGV4T2YoInVuc2lnbmVkLWJvZHkiKT49MClyZXR1cm4gdm9pZChlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIlRyYW5zZmVyLUVuY29kaW5nIl09ImNodW5rZWQiKTt0aHJvdyBufXRocm93IG59fSkpLGUoIlNFVF9IVFRQX0hPU1QiLCJhZnRlckJ1aWxkIiwoZnVuY3Rpb24oZSl7ZS5odHRwUmVxdWVzdC5oZWFkZXJzLkhvc3Q9ZS5odHRwUmVxdWVzdC5lbmRwb2ludC5ob3N0fSkpLGUoIlNFVF9UUkFDRV9JRCIsImFmdGVyQnVpbGQiLChmdW5jdGlvbihlKXt2YXIgcj0iWC1BbXpuLVRyYWNlLUlkIjtpZihuLnV0aWwuaXNOb2RlKCkmJiFPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLmh0dHBSZXF1ZXN0LmhlYWRlcnMscikpe3ZhciBvPXQuZW52LkFXU19MQU1CREFfRlVOQ1RJT05fTkFNRSxpPXQuZW52Ll9YX0FNWk5fVFJBQ0VfSUQ7InN0cmluZyI9PXR5cGVvZiBvJiZvLmxlbmd0aD4wJiYic3RyaW5nIj09dHlwZW9mIGkmJmkubGVuZ3RoPjAmJihlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbcl09aSl9fSkpLGUoIlJFU1RBUlQiLCJyZXN0YXJ0IiwoZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlc3BvbnNlLmVycm9yO2UmJmUucmV0cnlhYmxlJiYodGhpcy5odHRwUmVxdWVzdD1uZXcgbi5IdHRwUmVxdWVzdCh0aGlzLnNlcnZpY2UuZW5kcG9pbnQsdGhpcy5zZXJ2aWNlLnJlZ2lvbiksdGhpcy5yZXNwb25zZS5yZXRyeUNvdW50PHRoaXMuc2VydmljZS5jb25maWcubWF4UmV0cmllcz90aGlzLnJlc3BvbnNlLnJldHJ5Q291bnQrKzp0aGlzLnJlc3BvbnNlLmVycm9yPW51bGwpfSkpLHIoIkRJU0NPVkVSX0VORFBPSU5UIiwic2lnbiIsbywhMCkscigiU0lHTiIsInNpZ24iLChmdW5jdGlvbihlLHQpe3ZhciBuPWUuc2VydmljZSxyPXMoZSk7aWYoIXJ8fDA9PT1yLmxlbmd0aClyZXR1cm4gdCgpOyJiZWFyZXIiPT09cj9uLmNvbmZpZy5nZXRUb2tlbigoZnVuY3Rpb24ocixvKXtpZihyKXJldHVybiBlLnJlc3BvbnNlLmVycm9yPXIsdCgpO3RyeXtuZXcobi5nZXRTaWduZXJDbGFzcyhlKSkoZS5odHRwUmVxdWVzdCkuYWRkQXV0aG9yaXphdGlvbihvKX1jYXRjaCh0KXtlLnJlc3BvbnNlLmVycm9yPXR9dCgpfSkpOm4uY29uZmlnLmdldENyZWRlbnRpYWxzKChmdW5jdGlvbihyLG8pe2lmKHIpcmV0dXJuIGUucmVzcG9uc2UuZXJyb3I9cix0KCk7dHJ5e3ZhciBpPW4uZ2V0U2tld0NvcnJlY3RlZERhdGUoKSxzPW4uZ2V0U2lnbmVyQ2xhc3MoZSksYT0oZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zfHx7fSlbZS5vcGVyYXRpb25dLGM9bmV3IHMoZS5odHRwUmVxdWVzdCxuLmdldFNpZ25pbmdOYW1lKGUpLHtzaWduYXR1cmVDYWNoZTpuLmNvbmZpZy5zaWduYXR1cmVDYWNoZSxvcGVyYXRpb246YSxzaWduYXR1cmVWZXJzaW9uOm4uYXBpLnNpZ25hdHVyZVZlcnNpb259KTtjLnNldFNlcnZpY2VDbGllbnRJZChuLl9jbGllbnRJZCksZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVycy5BdXRob3JpemF0aW9uLGRlbGV0ZSBlLmh0dHBSZXF1ZXN0LmhlYWRlcnMuRGF0ZSxkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJYLUFtei1EYXRlIl0sYy5hZGRBdXRob3JpemF0aW9uKG8saSksZS5zaWduZWRBdD1pfWNhdGNoKHQpe2UucmVzcG9uc2UuZXJyb3I9dH10KCl9KSl9KSksZSgiVkFMSURBVEVfUkVTUE9OU0UiLCJ2YWxpZGF0ZVJlc3BvbnNlIiwoZnVuY3Rpb24oZSl7dGhpcy5zZXJ2aWNlLnN1Y2Nlc3NmdWxSZXNwb25zZShlLHRoaXMpPyhlLmRhdGE9e30sZS5lcnJvcj1udWxsKTooZS5kYXRhPW51bGwsZS5lcnJvcj1uLnV0aWwuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJVbmtub3duRXJyb3IiLG1lc3NhZ2U6IkFuIHVua25vd24gZXJyb3Igb2NjdXJyZWQuIn0pKX0pKSxlKCJFUlJPUiIsImVycm9yIiwoZnVuY3Rpb24oZSx0KXtpZih0LnJlcXVlc3Quc2VydmljZS5hcGkuYXdzUXVlcnlDb21wYXRpYmxlKXt2YXIgbj10Lmh0dHBSZXNwb25zZS5oZWFkZXJzLHI9bj9uWyJ4LWFtem4tcXVlcnktZXJyb3IiXTp2b2lkIDA7ciYmci5pbmNsdWRlcygiOyIpJiYodC5lcnJvci5jb2RlPXIuc3BsaXQoIjsiKVswXSl9fSksITApLHIoIlNFTkQiLCJzZW5kIiwoZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiByKHIpe2UuaHR0cFJlc3BvbnNlLnN0cmVhbT1yO3ZhciBvPWUucmVxdWVzdC5odHRwUmVxdWVzdC5zdHJlYW0saT1lLnJlcXVlc3Quc2VydmljZSxzPWkuYXBpLGE9ZS5yZXF1ZXN0Lm9wZXJhdGlvbixjPXMub3BlcmF0aW9uc1thXXx8e307ci5vbigiaGVhZGVycyIsKGZ1bmN0aW9uKG8scyxhKXtpZihlLnJlcXVlc3QuZW1pdCgiaHR0cEhlYWRlcnMiLFtvLHMsZSxhXSksIWUuaHR0cFJlc3BvbnNlLnN0cmVhbWluZylpZigyPT09bi5IdHRwQ2xpZW50LnN0cmVhbXNBcGlWZXJzaW9uKXtpZihjLmhhc0V2ZW50T3V0cHV0JiZpLnN1Y2Nlc3NmdWxSZXNwb25zZShlKSlyZXR1cm4gZS5yZXF1ZXN0LmVtaXQoImh0dHBEb25lIiksdm9pZCB0KCk7ci5vbigicmVhZGFibGUiLChmdW5jdGlvbigpe3ZhciB0PXIucmVhZCgpO251bGwhPT10JiZlLnJlcXVlc3QuZW1pdCgiaHR0cERhdGEiLFt0LGVdKX0pKX1lbHNlIHIub24oImRhdGEiLChmdW5jdGlvbih0KXtlLnJlcXVlc3QuZW1pdCgiaHR0cERhdGEiLFt0LGVdKX0pKX0pKSxyLm9uKCJlbmQiLChmdW5jdGlvbigpe2lmKCFvfHwhby5kaWRDYWxsYmFjayl7aWYoMj09PW4uSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbiYmYy5oYXNFdmVudE91dHB1dCYmaS5zdWNjZXNzZnVsUmVzcG9uc2UoZSkpcmV0dXJuO2UucmVxdWVzdC5lbWl0KCJodHRwRG9uZSIpLHQoKX19KSl9ZnVuY3Rpb24gbyhyKXtpZigiUmVxdWVzdEFib3J0ZWRFcnJvciIhPT1yLmNvZGUpe3ZhciBvPSJUaW1lb3V0RXJyb3IiPT09ci5jb2RlP3IuY29kZToiTmV0d29ya2luZ0Vycm9yIjtyPW4udXRpbC5lcnJvcihyLHtjb2RlOm8scmVnaW9uOmUucmVxdWVzdC5odHRwUmVxdWVzdC5yZWdpb24saG9zdG5hbWU6ZS5yZXF1ZXN0Lmh0dHBSZXF1ZXN0LmVuZHBvaW50Lmhvc3RuYW1lLHJldHJ5YWJsZTohMH0pfWUuZXJyb3I9cixlLnJlcXVlc3QuZW1pdCgiaHR0cEVycm9yIixbZS5lcnJvcixlXSwoZnVuY3Rpb24oKXt0KCl9KSl9ZnVuY3Rpb24gaSgpe3ZhciB0LGk9bi5IdHRwQ2xpZW50LmdldEluc3RhbmNlKCkscz1lLnJlcXVlc3Quc2VydmljZS5jb25maWcuaHR0cE9wdGlvbnN8fHt9O3RyeXt2YXIgYT1pLmhhbmRsZVJlcXVlc3QoZS5yZXF1ZXN0Lmh0dHBSZXF1ZXN0LHMscixvKTsodD1hKS5vbigic2VuZFByb2dyZXNzIiwoZnVuY3Rpb24odCl7ZS5yZXF1ZXN0LmVtaXQoImh0dHBVcGxvYWRQcm9ncmVzcyIsW3QsZV0pfSkpLHQub24oInJlY2VpdmVQcm9ncmVzcyIsKGZ1bmN0aW9uKHQpe2UucmVxdWVzdC5lbWl0KCJodHRwRG93bmxvYWRQcm9ncmVzcyIsW3QsZV0pfSkpfWNhdGNoKGUpe28oZSl9fWUuaHR0cFJlc3BvbnNlLl9hYm9ydENhbGxiYWNrPXQsZS5lcnJvcj1udWxsLGUuZGF0YT1udWxsLChlLnJlcXVlc3Quc2VydmljZS5nZXRTa2V3Q29ycmVjdGVkRGF0ZSgpLXRoaXMuc2lnbmVkQXQpLzFlMz49NjAwP3RoaXMuZW1pdCgic2lnbiIsW3RoaXNdLChmdW5jdGlvbihlKXtlP3QoZSk6aSgpfSkpOmkoKX0pKSxlKCJIVFRQX0hFQURFUlMiLCJodHRwSGVhZGVycyIsKGZ1bmN0aW9uKGUsdCxyLG8pe3IuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGU9ZSxyLmh0dHBSZXNwb25zZS5zdGF0dXNNZXNzYWdlPW8sci5odHRwUmVzcG9uc2UuaGVhZGVycz10LHIuaHR0cFJlc3BvbnNlLmJvZHk9bi51dGlsLmJ1ZmZlci50b0J1ZmZlcigiIiksci5odHRwUmVzcG9uc2UuYnVmZmVycz1bXSxyLmh0dHBSZXNwb25zZS5udW1CeXRlcz0wO3ZhciBpPXQuZGF0ZXx8dC5EYXRlLHM9ci5yZXF1ZXN0LnNlcnZpY2U7aWYoaSl7dmFyIGE9RGF0ZS5wYXJzZShpKTtzLmNvbmZpZy5jb3JyZWN0Q2xvY2tTa2V3JiZzLmlzQ2xvY2tTa2V3ZWQoYSkmJnMuYXBwbHlDbG9ja09mZnNldChhKX19KSksZSgiSFRUUF9EQVRBIiwiaHR0cERhdGEiLChmdW5jdGlvbihlLHQpe2lmKGUpe2lmKG4udXRpbC5pc05vZGUoKSl7dC5odHRwUmVzcG9uc2UubnVtQnl0ZXMrPWUubGVuZ3RoO3ZhciByPXQuaHR0cFJlc3BvbnNlLmhlYWRlcnNbImNvbnRlbnQtbGVuZ3RoIl0sbz17bG9hZGVkOnQuaHR0cFJlc3BvbnNlLm51bUJ5dGVzLHRvdGFsOnJ9O3QucmVxdWVzdC5lbWl0KCJodHRwRG93bmxvYWRQcm9ncmVzcyIsW28sdF0pfXQuaHR0cFJlc3BvbnNlLmJ1ZmZlcnMucHVzaChuLnV0aWwuYnVmZmVyLnRvQnVmZmVyKGUpKX19KSksZSgiSFRUUF9ET05FIiwiaHR0cERvbmUiLChmdW5jdGlvbihlKXtpZihlLmh0dHBSZXNwb25zZS5idWZmZXJzJiZlLmh0dHBSZXNwb25zZS5idWZmZXJzLmxlbmd0aD4wKXt2YXIgdD1uLnV0aWwuYnVmZmVyLmNvbmNhdChlLmh0dHBSZXNwb25zZS5idWZmZXJzKTtlLmh0dHBSZXNwb25zZS5ib2R5PXR9ZGVsZXRlIGUuaHR0cFJlc3BvbnNlLm51bUJ5dGVzLGRlbGV0ZSBlLmh0dHBSZXNwb25zZS5idWZmZXJzfSkpLGUoIkZJTkFMSVpFX0VSUk9SIiwicmV0cnkiLChmdW5jdGlvbihlKXtlLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlJiYoZS5lcnJvci5zdGF0dXNDb2RlPWUuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUsdm9pZCAwPT09ZS5lcnJvci5yZXRyeWFibGUmJihlLmVycm9yLnJldHJ5YWJsZT10aGlzLnNlcnZpY2UucmV0cnlhYmxlRXJyb3IoZS5lcnJvcix0aGlzKSkpfSkpLGUoIklOVkFMSURBVEVfQ1JFREVOVElBTFMiLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe2lmKGUuZXJyb3Ipc3dpdGNoKGUuZXJyb3IuY29kZSl7Y2FzZSJSZXF1ZXN0RXhwaXJlZCI6Y2FzZSJFeHBpcmVkVG9rZW5FeGNlcHRpb24iOmNhc2UiRXhwaXJlZFRva2VuIjplLmVycm9yLnJldHJ5YWJsZT0hMCxlLnJlcXVlc3Quc2VydmljZS5jb25maWcuY3JlZGVudGlhbHMuZXhwaXJlZD0hMH19KSksZSgiRVhQSVJFRF9TSUdOQVRVUkUiLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZXJyb3I7dCYmInN0cmluZyI9PXR5cGVvZiB0LmNvZGUmJiJzdHJpbmciPT10eXBlb2YgdC5tZXNzYWdlJiZ0LmNvZGUubWF0Y2goL1NpZ25hdHVyZS8pJiZ0Lm1lc3NhZ2UubWF0Y2goL2V4cGlyZWQvKSYmKGUuZXJyb3IucmV0cnlhYmxlPSEwKX0pKSxlKCJDTE9DS19TS0VXRUQiLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe2UuZXJyb3ImJnRoaXMuc2VydmljZS5jbG9ja1NrZXdFcnJvcihlLmVycm9yKSYmdGhpcy5zZXJ2aWNlLmNvbmZpZy5jb3JyZWN0Q2xvY2tTa2V3JiYoZS5lcnJvci5yZXRyeWFibGU9ITApfSkpLGUoIlJFRElSRUNUIiwicmV0cnkiLChmdW5jdGlvbihlKXtlLmVycm9yJiZlLmVycm9yLnN0YXR1c0NvZGU+PTMwMCYmZS5lcnJvci5zdGF0dXNDb2RlPDQwMCYmZS5odHRwUmVzcG9uc2UuaGVhZGVycy5sb2NhdGlvbiYmKHRoaXMuaHR0cFJlcXVlc3QuZW5kcG9pbnQ9bmV3IG4uRW5kcG9pbnQoZS5odHRwUmVzcG9uc2UuaGVhZGVycy5sb2NhdGlvbiksdGhpcy5odHRwUmVxdWVzdC5oZWFkZXJzLkhvc3Q9dGhpcy5odHRwUmVxdWVzdC5lbmRwb2ludC5ob3N0LGUuZXJyb3IucmVkaXJlY3Q9ITAsZS5lcnJvci5yZXRyeWFibGU9ITApfSkpLGUoIlJFVFJZX0NIRUNLIiwicmV0cnkiLChmdW5jdGlvbihlKXtlLmVycm9yJiYoZS5lcnJvci5yZWRpcmVjdCYmZS5yZWRpcmVjdENvdW50PGUubWF4UmVkaXJlY3RzP2UuZXJyb3IucmV0cnlEZWxheT0wOmUucmV0cnlDb3VudDxlLm1heFJldHJpZXMmJihlLmVycm9yLnJldHJ5RGVsYXk9dGhpcy5zZXJ2aWNlLnJldHJ5RGVsYXlzKGUucmV0cnlDb3VudCxlLmVycm9yKXx8MCkpfSkpLHIoIlJFU0VUX1JFVFJZX1NUQVRFIiwiYWZ0ZXJSZXRyeSIsKGZ1bmN0aW9uKGUsdCl7dmFyIG4scj0hMTtlLmVycm9yJiYobj1lLmVycm9yLnJldHJ5RGVsYXl8fDAsZS5lcnJvci5yZXRyeWFibGUmJmUucmV0cnlDb3VudDxlLm1heFJldHJpZXM/KGUucmV0cnlDb3VudCsrLHI9ITApOmUuZXJyb3IucmVkaXJlY3QmJmUucmVkaXJlY3RDb3VudDxlLm1heFJlZGlyZWN0cyYmKGUucmVkaXJlY3RDb3VudCsrLHI9ITApKSxyJiZuPj0wPyhlLmVycm9yPW51bGwsc2V0VGltZW91dCh0LG4pKTp0KCl9KSl9KSksQ29yZVBvc3Q6KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24oZSl7ZSgiRVhUUkFDVF9SRVFVRVNUX0lEIiwiZXh0cmFjdERhdGEiLG4udXRpbC5leHRyYWN0UmVxdWVzdElkKSxlKCJFWFRSQUNUX1JFUVVFU1RfSUQiLCJleHRyYWN0RXJyb3IiLG4udXRpbC5leHRyYWN0UmVxdWVzdElkKSxlKCJFTk9URk9VTkRfRVJST1IiLCJodHRwRXJyb3IiLChmdW5jdGlvbihlKXtpZigiTmV0d29ya2luZ0Vycm9yIj09PWUuY29kZSYmZnVuY3Rpb24oZSl7cmV0dXJuIkVOT1RGT1VORCI9PT1lLmVycm5vfHwibnVtYmVyIj09dHlwZW9mIGUuZXJybm8mJiJmdW5jdGlvbiI9PXR5cGVvZiBuLnV0aWwuZ2V0U3lzdGVtRXJyb3JOYW1lJiZbIkVBSV9OT05BTUUiLCJFQUlfTk9EQVRBIl0uaW5kZXhPZihuLnV0aWwuZ2V0U3lzdGVtRXJyb3JOYW1lKGUuZXJybm8pPj0wKX0oZSkpe3ZhciB0PSJJbmFjY2Vzc2libGUgaG9zdDogYCIrZS5ob3N0bmFtZSsiJyBhdCBwb3J0IGAiK2UucG9ydCsiJy4gVGhpcyBzZXJ2aWNlIG1heSBub3QgYmUgYXZhaWxhYmxlIGluIHRoZSBgIitlLnJlZ2lvbisiJyByZWdpb24uIjt0aGlzLnJlc3BvbnNlLmVycm9yPW4udXRpbC5lcnJvcihuZXcgRXJyb3IodCkse2NvZGU6IlVua25vd25FbmRwb2ludCIscmVnaW9uOmUucmVnaW9uLGhvc3RuYW1lOmUuaG9zdG5hbWUscmV0cnlhYmxlOiEwLG9yaWdpbmFsRXJyb3I6ZX0pfX0pKX0pKSxMb2dnZXI6KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24odCl7dCgiTE9HX1JFUVVFU1QiLCJjb21wbGV0ZSIsKGZ1bmN0aW9uKHQpe3ZhciByPXQucmVxdWVzdCxvPXIuc2VydmljZS5jb25maWcubG9nZ2VyO2lmKG8pe3ZhciBpPWZ1bmN0aW9uKCl7dmFyIGk9KHQucmVxdWVzdC5zZXJ2aWNlLmdldFNrZXdDb3JyZWN0ZWREYXRlKCkuZ2V0VGltZSgpLXIuc3RhcnRUaW1lLmdldFRpbWUoKSkvMWUzLGE9ISFvLmlzVFRZLGM9dC5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSx1PXIucGFyYW1zO3Iuc2VydmljZS5hcGkub3BlcmF0aW9ucyYmci5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW3Iub3BlcmF0aW9uXSYmci5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW3Iub3BlcmF0aW9uXS5pbnB1dCYmKHU9cyhyLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbci5vcGVyYXRpb25dLmlucHV0LHIucGFyYW1zKSk7dmFyIGw9ZSgidXRpbCIpLmluc3BlY3QodSwhMCxudWxsKSxwPSIiO3JldHVybiBhJiYocCs9IhtbMzNtIikscCs9IltBV1MgIityLnNlcnZpY2Uuc2VydmljZUlkZW50aWZpZXIrIiAiK2MscCs9IiAiK2kudG9TdHJpbmcoKSsicyAiK3QucmV0cnlDb3VudCsiIHJldHJpZXNdIixhJiYocCs9IhtbMDsxbSIpLHArPSIgIituLnV0aWwuc3RyaW5nLmxvd2VyRmlyc3Qoci5vcGVyYXRpb24pLHArPSIoIitsKyIpIixhJiYocCs9IhtbMG0iKSxwfSgpOyJmdW5jdGlvbiI9PXR5cGVvZiBvLmxvZz9vLmxvZyhpKToiZnVuY3Rpb24iPT10eXBlb2Ygby53cml0ZSYmby53cml0ZShpKyJcbiIpfWZ1bmN0aW9uIHMoZSx0KXtpZighdClyZXR1cm4gdDtpZihlLmlzU2Vuc2l0aXZlKXJldHVybiIqKipTZW5zaXRpdmVJbmZvcm1hdGlvbioqKiI7c3dpdGNoKGUudHlwZSl7Y2FzZSJzdHJ1Y3R1cmUiOnZhciByPXt9O3JldHVybiBuLnV0aWwuZWFjaCh0LChmdW5jdGlvbih0LG4pe09iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLm1lbWJlcnMsdCk/clt0XT1zKGUubWVtYmVyc1t0XSxuKTpyW3RdPW59KSkscjtjYXNlImxpc3QiOnZhciBvPVtdO3JldHVybiBuLnV0aWwuYXJyYXlFYWNoKHQsKGZ1bmN0aW9uKHQsbil7by5wdXNoKHMoZS5tZW1iZXIsdCkpfSkpLG87Y2FzZSJtYXAiOnZhciBpPXt9O3JldHVybiBuLnV0aWwuZWFjaCh0LChmdW5jdGlvbih0LG4pe2lbdF09cyhlLnZhbHVlLG4pfSkpLGk7ZGVmYXVsdDpyZXR1cm4gdH19fSkpfSkpLEpzb246KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24odCl7dmFyIG49ZSgiLi9wcm90b2NvbC9qc29uIik7dCgiQlVJTEQiLCJidWlsZCIsbi5idWlsZFJlcXVlc3QpLHQoIkVYVFJBQ1RfREFUQSIsImV4dHJhY3REYXRhIixuLmV4dHJhY3REYXRhKSx0KCJFWFRSQUNUX0VSUk9SIiwiZXh0cmFjdEVycm9yIixuLmV4dHJhY3RFcnJvcil9KSksUmVzdDoobmV3IHIpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbih0KXt2YXIgbj1lKCIuL3Byb3RvY29sL3Jlc3QiKTt0KCJCVUlMRCIsImJ1aWxkIixuLmJ1aWxkUmVxdWVzdCksdCgiRVhUUkFDVF9EQVRBIiwiZXh0cmFjdERhdGEiLG4uZXh0cmFjdERhdGEpLHQoIkVYVFJBQ1RfRVJST1IiLCJleHRyYWN0RXJyb3IiLG4uZXh0cmFjdEVycm9yKX0pKSxSZXN0SnNvbjoobmV3IHIpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbih0KXt2YXIgbj1lKCIuL3Byb3RvY29sL3Jlc3RfanNvbiIpO3QoIkJVSUxEIiwiYnVpbGQiLG4uYnVpbGRSZXF1ZXN0KSx0KCJFWFRSQUNUX0RBVEEiLCJleHRyYWN0RGF0YSIsbi5leHRyYWN0RGF0YSksdCgiRVhUUkFDVF9FUlJPUiIsImV4dHJhY3RFcnJvciIsbi5leHRyYWN0RXJyb3IpLHQoIlVOU0VUX0NPTlRFTlRfTEVOR1RIIiwiYWZ0ZXJCdWlsZCIsbi51bnNldENvbnRlbnRMZW5ndGgpfSkpLFJlc3RYbWw6KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24odCl7dmFyIG49ZSgiLi9wcm90b2NvbC9yZXN0X3htbCIpO3QoIkJVSUxEIiwiYnVpbGQiLG4uYnVpbGRSZXF1ZXN0KSx0KCJFWFRSQUNUX0RBVEEiLCJleHRyYWN0RGF0YSIsbi5leHRyYWN0RGF0YSksdCgiRVhUUkFDVF9FUlJPUiIsImV4dHJhY3RFcnJvciIsbi5leHRyYWN0RXJyb3IpfSkpLFF1ZXJ5OihuZXcgcikuYWRkTmFtZWRMaXN0ZW5lcnMoKGZ1bmN0aW9uKHQpe3ZhciBuPWUoIi4vcHJvdG9jb2wvcXVlcnkiKTt0KCJCVUlMRCIsImJ1aWxkIixuLmJ1aWxkUmVxdWVzdCksdCgiRVhUUkFDVF9EQVRBIiwiZXh0cmFjdERhdGEiLG4uZXh0cmFjdERhdGEpLHQoIkVYVFJBQ1RfRVJST1IiLCJleHRyYWN0RXJyb3IiLG4uZXh0cmFjdEVycm9yKX0pKX19KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIikpfSx7Ii4vY29yZSI6MTksIi4vZGlzY292ZXJfZW5kcG9pbnQiOjI3LCIuL3Byb3RvY29sL2pzb24iOjQ4LCIuL3Byb3RvY29sL3F1ZXJ5Ijo0OSwiLi9wcm90b2NvbC9yZXN0Ijo1MCwiLi9wcm90b2NvbC9yZXN0X2pzb24iOjUxLCIuL3Byb3RvY29sL3Jlc3RfeG1sIjo1MiwiLi9zZXF1ZW50aWFsX2V4ZWN1dG9yIjo2MSxfcHJvY2Vzczo5MSx1dGlsOjg1fV0sMzU6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0O3IuRW5kcG9pbnQ9byh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0KXtpZihyLnV0aWwuaGlkZVByb3BlcnRpZXModGhpcyxbInNsYXNoZXMiLCJhdXRoIiwiaGFzaCIsInNlYXJjaCIsInF1ZXJ5Il0pLG51bGw9PWUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGVuZHBvaW50OiAiK2UpO2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gci51dGlsLmNvcHkoZSk7ZS5tYXRjaCgvXmh0dHAvKXx8KGU9KCh0JiZ2b2lkIDAhPT10LnNzbEVuYWJsZWQ/dC5zc2xFbmFibGVkOnIuY29uZmlnLnNzbEVuYWJsZWQpPyJodHRwcyI6Imh0dHAiKSsiOi8vIitlKSxyLnV0aWwudXBkYXRlKHRoaXMsci51dGlsLnVybFBhcnNlKGUpKSx0aGlzLnBvcnQ/dGhpcy5wb3J0PXBhcnNlSW50KHRoaXMucG9ydCwxMCk6dGhpcy5wb3J0PSJodHRwczoiPT09dGhpcy5wcm90b2NvbD80NDM6ODB9fSksci5IdHRwUmVxdWVzdD1vKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLHQpe2U9bmV3IHIuRW5kcG9pbnQoZSksdGhpcy5tZXRob2Q9IlBPU1QiLHRoaXMucGF0aD1lLnBhdGh8fCIvIix0aGlzLmhlYWRlcnM9e30sdGhpcy5ib2R5PSIiLHRoaXMuZW5kcG9pbnQ9ZSx0aGlzLnJlZ2lvbj10LHRoaXMuX3VzZXJBZ2VudD0iIix0aGlzLnNldFVzZXJBZ2VudCgpfSxzZXRVc2VyQWdlbnQ6ZnVuY3Rpb24oKXt0aGlzLl91c2VyQWdlbnQ9dGhpcy5oZWFkZXJzW3RoaXMuZ2V0VXNlckFnZW50SGVhZGVyTmFtZSgpXT1yLnV0aWwudXNlckFnZW50KCl9LGdldFVzZXJBZ2VudEhlYWRlck5hbWU6ZnVuY3Rpb24oKXtyZXR1cm4oci51dGlsLmlzQnJvd3NlcigpPyJYLUFtei0iOiIiKSsiVXNlci1BZ2VudCJ9LGFwcGVuZFRvVXNlckFnZW50OmZ1bmN0aW9uKGUpeyJzdHJpbmciPT10eXBlb2YgZSYmZSYmKHRoaXMuX3VzZXJBZ2VudCs9IiAiK2UpLHRoaXMuaGVhZGVyc1t0aGlzLmdldFVzZXJBZ2VudEhlYWRlck5hbWUoKV09dGhpcy5fdXNlckFnZW50fSxnZXRVc2VyQWdlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXNlckFnZW50fSxwYXRobmFtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhdGguc3BsaXQoIj8iLDEpWzBdfSxzZWFyY2g6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnBhdGguc3BsaXQoIj8iLDIpWzFdO3JldHVybiBlPyhlPXIudXRpbC5xdWVyeVN0cmluZ1BhcnNlKGUpLHIudXRpbC5xdWVyeVBhcmFtc1RvU3RyaW5nKGUpKToiIn0sdXBkYXRlRW5kcG9pbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IHIuRW5kcG9pbnQoZSk7dGhpcy5lbmRwb2ludD10LHRoaXMucGF0aD10LnBhdGh8fCIvIix0aGlzLmhlYWRlcnMuSG9zdCYmKHRoaXMuaGVhZGVycy5Ib3N0PXQuaG9zdCl9fSksci5IdHRwUmVzcG9uc2U9byh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1c0NvZGU9dm9pZCAwLHRoaXMuaGVhZGVycz17fSx0aGlzLmJvZHk9dm9pZCAwLHRoaXMuc3RyZWFtaW5nPSExLHRoaXMuc3RyZWFtPW51bGx9LGNyZWF0ZVVuYnVmZmVyZWRTdHJlYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdHJlYW1pbmc9ITAsdGhpcy5zdHJlYW19fSksci5IdHRwQ2xpZW50PW8oe30pLHIuSHR0cENsaWVudC5nZXRJbnN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT10aGlzLnNpbmdsZXRvbiYmKHRoaXMuc2luZ2xldG9uPW5ldyB0aGlzKSx0aGlzLnNpbmdsZXRvbn19LHsiLi9jb3JlIjoxOX1dLDM2OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiZXZlbnRzIikuRXZlbnRFbWl0dGVyO2UoIi4uL2h0dHAiKSxyLlhIUkNsaWVudD1yLnV0aWwuaW5oZXJpdCh7aGFuZGxlUmVxdWVzdDpmdW5jdGlvbihlLHQsbixpKXt2YXIgcz10aGlzLGE9ZS5lbmRwb2ludCxjPW5ldyBvLHU9YS5wcm90b2NvbCsiLy8iK2EuaG9zdG5hbWU7ODAhPT1hLnBvcnQmJjQ0MyE9PWEucG9ydCYmKHUrPSI6IithLnBvcnQpLHUrPWUucGF0aDt2YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3QscD0hMTtlLnN0cmVhbT1sLGwuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsKGZ1bmN0aW9uKCl7dHJ5e2lmKDA9PT1sLnN0YXR1cylyZXR1cm59Y2F0Y2goZSl7cmV0dXJufXRoaXMucmVhZHlTdGF0ZT49dGhpcy5IRUFERVJTX1JFQ0VJVkVEJiYhcCYmKGMuc3RhdHVzQ29kZT1sLnN0YXR1cyxjLmhlYWRlcnM9cy5wYXJzZUhlYWRlcnMobC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSksYy5lbWl0KCJoZWFkZXJzIixjLnN0YXR1c0NvZGUsYy5oZWFkZXJzLGwuc3RhdHVzVGV4dCkscD0hMCksdGhpcy5yZWFkeVN0YXRlPT09dGhpcy5ET05FJiZzLmZpbmlzaFJlcXVlc3QobCxjKX0pLCExKSxsLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsKGZ1bmN0aW9uKGUpe2MuZW1pdCgic2VuZFByb2dyZXNzIixlKX0pKSxsLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIiwoZnVuY3Rpb24oZSl7Yy5lbWl0KCJyZWNlaXZlUHJvZ3Jlc3MiLGUpfSksITEpLGwuYWRkRXZlbnRMaXN0ZW5lcigidGltZW91dCIsKGZ1bmN0aW9uKCl7aShyLnV0aWwuZXJyb3IobmV3IEVycm9yKCJUaW1lb3V0Iikse2NvZGU6IlRpbWVvdXRFcnJvciJ9KSl9KSwhMSksbC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsKGZ1bmN0aW9uKCl7aShyLnV0aWwuZXJyb3IobmV3IEVycm9yKCJOZXR3b3JrIEZhaWx1cmUiKSx7Y29kZToiTmV0d29ya2luZ0Vycm9yIn0pKX0pLCExKSxsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IiwoZnVuY3Rpb24oKXtpKHIudXRpbC5lcnJvcihuZXcgRXJyb3IoIlJlcXVlc3QgYWJvcnRlZCIpLHtjb2RlOiJSZXF1ZXN0QWJvcnRlZEVycm9yIn0pKX0pLCExKSxuKGMpLGwub3BlbihlLm1ldGhvZCx1LCExIT09dC54aHJBc3luYyksci51dGlsLmVhY2goZS5oZWFkZXJzLChmdW5jdGlvbihlLHQpeyJDb250ZW50LUxlbmd0aCIhPT1lJiYiVXNlci1BZ2VudCIhPT1lJiYiSG9zdCIhPT1lJiZsLnNldFJlcXVlc3RIZWFkZXIoZSx0KX0pKSx0LnRpbWVvdXQmJiExIT09dC54aHJBc3luYyYmKGwudGltZW91dD10LnRpbWVvdXQpLHQueGhyV2l0aENyZWRlbnRpYWxzJiYobC53aXRoQ3JlZGVudGlhbHM9ITApO3RyeXtsLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIifWNhdGNoKGUpe310cnl7ZS5ib2R5P2wuc2VuZChlLmJvZHkpOmwuc2VuZCgpfWNhdGNoKHQpe2lmKCFlLmJvZHl8fCJvYmplY3QiIT10eXBlb2YgZS5ib2R5LmJ1ZmZlcil0aHJvdyB0O2wuc2VuZChlLmJvZHkuYnVmZmVyKX1yZXR1cm4gY30scGFyc2VIZWFkZXJzOmZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiByLnV0aWwuYXJyYXlFYWNoKGUuc3BsaXQoL1xyP1xuLyksKGZ1bmN0aW9uKGUpe3ZhciBuPWUuc3BsaXQoIjoiLDEpWzBdLHI9ZS5zdWJzdHJpbmcobi5sZW5ndGgrMik7bi5sZW5ndGg+MCYmKHRbbi50b0xvd2VyQ2FzZSgpXT1yKX0pKSx0fSxmaW5pc2hSZXF1ZXN0OmZ1bmN0aW9uKGUsdCl7dmFyIG47aWYoImFycmF5YnVmZmVyIj09PWUucmVzcG9uc2VUeXBlJiZlLnJlc3BvbnNlKXt2YXIgbz1lLnJlc3BvbnNlO249bmV3IHIudXRpbC5CdWZmZXIoby5ieXRlTGVuZ3RoKTtmb3IodmFyIGk9bmV3IFVpbnQ4QXJyYXkobykscz0wO3M8bi5sZW5ndGg7KytzKW5bc109aVtzXX10cnl7bnx8InN0cmluZyIhPXR5cGVvZiBlLnJlc3BvbnNlVGV4dHx8KG49bmV3IHIudXRpbC5CdWZmZXIoZS5yZXNwb25zZVRleHQpKX1jYXRjaChlKXt9biYmdC5lbWl0KCJkYXRhIixuKSx0LmVtaXQoImVuZCIpfX0pLHIuSHR0cENsaWVudC5wcm90b3R5cGU9ci5YSFJDbGllbnQucHJvdG90eXBlLHIuSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbj0xfSx7Ii4uL2NvcmUiOjE5LCIuLi9odHRwIjozNSxldmVudHM6ODd9XSwzNzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKTtmdW5jdGlvbiBvKCl7fWZ1bmN0aW9uIGkoZSx0KXtpZih0JiZudWxsIT1lKXN3aXRjaCh0LnR5cGUpe2Nhc2Uic3RydWN0dXJlIjpyZXR1cm4gZnVuY3Rpb24oZSx0KXtpZih0LmlzRG9jdW1lbnQpcmV0dXJuIGU7dmFyIG49e307cmV0dXJuIHIuZWFjaChlLChmdW5jdGlvbihlLHIpe3ZhciBvPXQubWVtYmVyc1tlXTtpZihvKXtpZigiYm9keSIhPT1vLmxvY2F0aW9uKXJldHVybjt2YXIgcz1vLmlzTG9jYXRpb25OYW1lP28ubmFtZTplLGE9aShyLG8pO3ZvaWQgMCE9PWEmJihuW3NdPWEpfX0pKSxufShlLHQpO2Nhc2UibWFwIjpyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtyZXR1cm4gci5lYWNoKGUsKGZ1bmN0aW9uKGUscil7dmFyIG89aShyLHQudmFsdWUpO3ZvaWQgMCE9PW8mJihuW2VdPW8pfSkpLG59KGUsdCk7Y2FzZSJsaXN0IjpyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbj1bXTtyZXR1cm4gci5hcnJheUVhY2goZSwoZnVuY3Rpb24oZSl7dmFyIHI9aShlLHQubWVtYmVyKTt2b2lkIDAhPT1yJiZuLnB1c2gocil9KSksbn0oZSx0KTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbihlLHQpe3JldHVybiB0LnRvV2lyZUZvcm1hdChlKX0oZSx0KX19by5wcm90b3R5cGUuYnVpbGQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoaShlLHQpKX0sdC5leHBvcnRzPW99LHsiLi4vdXRpbCI6NzR9XSwzODpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKTtmdW5jdGlvbiBvKCl7fWZ1bmN0aW9uIGkoZSx0KXtpZih0JiZ2b2lkIDAhPT1lKXN3aXRjaCh0LnR5cGUpe2Nhc2Uic3RydWN0dXJlIjpyZXR1cm4gZnVuY3Rpb24oZSx0KXtpZihudWxsIT1lKXtpZih0LmlzRG9jdW1lbnQpcmV0dXJuIGU7dmFyIG49e30sbz10Lm1lbWJlcnM7cmV0dXJuIHIuZWFjaChvLChmdW5jdGlvbih0LHIpe3ZhciBvPXIuaXNMb2NhdGlvbk5hbWU/ci5uYW1lOnQ7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbykpe3ZhciBzPWkoZVtvXSxyKTt2b2lkIDAhPT1zJiYoblt0XT1zKX19KSksbn19KGUsdCk7Y2FzZSJtYXAiOnJldHVybiBmdW5jdGlvbihlLHQpe2lmKG51bGwhPWUpe3ZhciBuPXt9O3JldHVybiByLmVhY2goZSwoZnVuY3Rpb24oZSxyKXt2YXIgbz1pKHIsdC52YWx1ZSk7bltlXT12b2lkIDA9PT1vP251bGw6b30pKSxufX0oZSx0KTtjYXNlImxpc3QiOnJldHVybiBmdW5jdGlvbihlLHQpe2lmKG51bGwhPWUpe3ZhciBuPVtdO3JldHVybiByLmFycmF5RWFjaChlLChmdW5jdGlvbihlKXt2YXIgcj1pKGUsdC5tZW1iZXIpO3ZvaWQgMD09PXI/bi5wdXNoKG51bGwpOm4ucHVzaChyKX0pKSxufX0oZSx0KTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbihlLHQpe3JldHVybiB0LnRvVHlwZShlKX0oZSx0KX19by5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaShKU09OLnBhcnNlKGUpLHQpfSx0LmV4cG9ydHM9b30seyIuLi91dGlsIjo3NH1dLDM5OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKGUpeyhmdW5jdGlvbigpe3ZhciBuPVsiV2UgYXJlIGZvcm1hbGl6aW5nIG91ciBwbGFucyB0byBlbnRlciBBV1MgU0RLIGZvciBKYXZhU2NyaXB0ICh2MikgaW50byBtYWludGVuYW5jZSBtb2RlIGluIDIwMjMuXG4iLCJQbGVhc2UgbWlncmF0ZSB5b3VyIGNvZGUgdG8gdXNlIEFXUyBTREsgZm9yIEphdmFTY3JpcHQgKHYzKS4iLCJGb3IgbW9yZSBpbmZvcm1hdGlvbiwgY2hlY2sgdGhlIG1pZ3JhdGlvbiBndWlkZSBhdCBodHRwczovL2EuY28vN1B6TUNjeSJdLmpvaW4oIlxuIik7dC5leHBvcnRzPXtzdXBwcmVzczohMX0sc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0LmV4cG9ydHMuc3VwcHJlc3N8fHZvaWQgMCE9PWUmJigib2JqZWN0Ij09dHlwZW9mIGUuZW52JiZ2b2lkIDAhPT1lLmVudi5BV1NfRVhFQ1VUSU9OX0VOViYmMD09PWUuZW52LkFXU19FWEVDVVRJT05fRU5WLmluZGV4T2YoIkFXU19MYW1iZGFfIil8fCJvYmplY3QiPT10eXBlb2YgZS5lbnYmJnZvaWQgMCE9PWUuZW52LkFXU19TREtfSlNfU1VQUFJFU1NfTUFJTlRFTkFOQ0VfTU9ERV9NRVNTQUdFfHwiZnVuY3Rpb24iPT10eXBlb2YgZS5lbWl0V2FybmluZyYmZS5lbWl0V2FybmluZyhuLHt0eXBlOiJOT1RFIn0pKX0pLDApfSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpKX0se19wcm9jZXNzOjkxfV0sNDA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvbGxlY3Rpb24iKSxvPWUoIi4vb3BlcmF0aW9uIiksaT1lKCIuL3NoYXBlIikscz1lKCIuL3BhZ2luYXRvciIpLGE9ZSgiLi9yZXNvdXJjZV93YWl0ZXIiKSxjPWUoIi4uLy4uL2FwaXMvbWV0YWRhdGEuanNvbiIpLHU9ZSgiLi4vdXRpbCIpLGw9dS5wcm9wZXJ0eSxwPXUubWVtb2l6ZWRQcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2U9ZXx8e30sKHQ9dHx8e30pLmFwaT10aGlzLGUubWV0YWRhdGE9ZS5tZXRhZGF0YXx8e307dmFyIGQ9dC5zZXJ2aWNlSWRlbnRpZmllcjtkZWxldGUgdC5zZXJ2aWNlSWRlbnRpZmllcixsKHRoaXMsImlzQXBpIiwhMCwhMSksbCh0aGlzLCJhcGlWZXJzaW9uIixlLm1ldGFkYXRhLmFwaVZlcnNpb24pLGwodGhpcywiZW5kcG9pbnRQcmVmaXgiLGUubWV0YWRhdGEuZW5kcG9pbnRQcmVmaXgpLGwodGhpcywic2lnbmluZ05hbWUiLGUubWV0YWRhdGEuc2lnbmluZ05hbWUpLGwodGhpcywiZ2xvYmFsRW5kcG9pbnQiLGUubWV0YWRhdGEuZ2xvYmFsRW5kcG9pbnQpLGwodGhpcywic2lnbmF0dXJlVmVyc2lvbiIsZS5tZXRhZGF0YS5zaWduYXR1cmVWZXJzaW9uKSxsKHRoaXMsImpzb25WZXJzaW9uIixlLm1ldGFkYXRhLmpzb25WZXJzaW9uKSxsKHRoaXMsInRhcmdldFByZWZpeCIsZS5tZXRhZGF0YS50YXJnZXRQcmVmaXgpLGwodGhpcywicHJvdG9jb2wiLGUubWV0YWRhdGEucHJvdG9jb2wpLGwodGhpcywidGltZXN0YW1wRm9ybWF0IixlLm1ldGFkYXRhLnRpbWVzdGFtcEZvcm1hdCksbCh0aGlzLCJ4bWxOYW1lc3BhY2VVcmkiLGUubWV0YWRhdGEueG1sTmFtZXNwYWNlKSxsKHRoaXMsImFiYnJldmlhdGlvbiIsZS5tZXRhZGF0YS5zZXJ2aWNlQWJicmV2aWF0aW9uKSxsKHRoaXMsImZ1bGxOYW1lIixlLm1ldGFkYXRhLnNlcnZpY2VGdWxsTmFtZSksbCh0aGlzLCJzZXJ2aWNlSWQiLGUubWV0YWRhdGEuc2VydmljZUlkKSxkJiZjW2RdJiZsKHRoaXMsInhtbE5vRGVmYXVsdExpc3RzIixjW2RdLnhtbE5vRGVmYXVsdExpc3RzLCExKSxwKHRoaXMsImNsYXNzTmFtZSIsKGZ1bmN0aW9uKCl7dmFyIHQ9ZS5tZXRhZGF0YS5zZXJ2aWNlQWJicmV2aWF0aW9ufHxlLm1ldGFkYXRhLnNlcnZpY2VGdWxsTmFtZTtyZXR1cm4gdD8oIkVsYXN0aWNMb2FkQmFsYW5jaW5nIj09PSh0PXQucmVwbGFjZSgvXkFtYXpvbnxBV1Nccyp8XCguKnxccyt8XFcrL2csIiIpKSYmKHQ9IkVMQiIpLHQpOm51bGx9KSksbCh0aGlzLCJvcGVyYXRpb25zIixuZXcgcihlLm9wZXJhdGlvbnMsdCwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gbmV3IG8oZSxuLHQpfSksdS5zdHJpbmcubG93ZXJGaXJzdCwoZnVuY3Rpb24oZSx0KXshMD09PXQuZW5kcG9pbnRvcGVyYXRpb24mJmwobiwiZW5kcG9pbnRPcGVyYXRpb24iLHUuc3RyaW5nLmxvd2VyRmlyc3QoZSkpLHQuZW5kcG9pbnRkaXNjb3ZlcnkmJiFuLmhhc1JlcXVpcmVkRW5kcG9pbnREaXNjb3ZlcnkmJmwobiwiaGFzUmVxdWlyZWRFbmRwb2ludERpc2NvdmVyeSIsITA9PT10LmVuZHBvaW50ZGlzY292ZXJ5LnJlcXVpcmVkKX0pKSksbCh0aGlzLCJzaGFwZXMiLG5ldyByKGUuc2hhcGVzLHQsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGkuY3JlYXRlKG4sdCl9KSkpLGwodGhpcywicGFnaW5hdG9ycyIsbmV3IHIoZS5wYWdpbmF0b3JzLHQsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIG5ldyBzKGUsbix0KX0pKSksbCh0aGlzLCJ3YWl0ZXJzIixuZXcgcihlLndhaXRlcnMsdCwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gbmV3IGEoZSxuLHQpfSksdS5zdHJpbmcubG93ZXJGaXJzdCkpLHQuZG9jdW1lbnRhdGlvbiYmKGwodGhpcywiZG9jdW1lbnRhdGlvbiIsZS5kb2N1bWVudGF0aW9uKSxsKHRoaXMsImRvY3VtZW50YXRpb25VcmwiLGUuZG9jdW1lbnRhdGlvblVybCkpLGwodGhpcywiYXdzUXVlcnlDb21wYXRpYmxlIixlLm1ldGFkYXRhLmF3c1F1ZXJ5Q29tcGF0aWJsZSl9fSx7Ii4uLy4uL2FwaXMvbWV0YWRhdGEuanNvbiI6NCwiLi4vdXRpbCI6NzQsIi4vY29sbGVjdGlvbiI6NDEsIi4vb3BlcmF0aW9uIjo0MiwiLi9wYWdpbmF0b3IiOjQzLCIuL3Jlc291cmNlX3dhaXRlciI6NDQsIi4vc2hhcGUiOjQ1fV0sNDE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIikubWVtb2l6ZWRQcm9wZXJ0eTtmdW5jdGlvbiBvKGUsdCxuLG8pe3IodGhpcyxvKGUpLChmdW5jdGlvbigpe3JldHVybiBuKGUsdCl9KSl9dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLHIsaSl7Zm9yKHZhciBzIGluIHI9cnx8U3RyaW5nLGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscykmJihvLmNhbGwodGhpcyxzLGVbc10sbixyKSxpJiZpKHMsZVtzXSkpfX0seyIuLi91dGlsIjo3NH1dLDQyOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9zaGFwZSIpLG89ZSgiLi4vdXRpbCIpLGk9by5wcm9wZXJ0eSxzPW8ubWVtb2l6ZWRQcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPXRoaXM7bj1ufHx7fSxpKHRoaXMsIm5hbWUiLHQubmFtZXx8ZSksaSh0aGlzLCJhcGkiLG4uYXBpLCExKSx0Lmh0dHA9dC5odHRwfHx7fSxpKHRoaXMsImVuZHBvaW50Iix0LmVuZHBvaW50KSxpKHRoaXMsImh0dHBNZXRob2QiLHQuaHR0cC5tZXRob2R8fCJQT1NUIiksaSh0aGlzLCJodHRwUGF0aCIsdC5odHRwLnJlcXVlc3RVcml8fCIvIiksaSh0aGlzLCJhdXRodHlwZSIsdC5hdXRodHlwZXx8IiIpLGkodGhpcywiZW5kcG9pbnREaXNjb3ZlcnlSZXF1aXJlZCIsdC5lbmRwb2ludGRpc2NvdmVyeT90LmVuZHBvaW50ZGlzY292ZXJ5LnJlcXVpcmVkPyJSRVFVSVJFRCI6Ik9QVElPTkFMIjoiTlVMTCIpO3ZhciBhPXQuaHR0cENoZWNrc3VtUmVxdWlyZWR8fHQuaHR0cENoZWNrc3VtJiZ0Lmh0dHBDaGVja3N1bS5yZXF1ZXN0Q2hlY2tzdW1SZXF1aXJlZDtpKHRoaXMsImh0dHBDaGVja3N1bVJlcXVpcmVkIixhLCExKSxzKHRoaXMsImlucHV0IiwoZnVuY3Rpb24oKXtyZXR1cm4gdC5pbnB1dD9yLmNyZWF0ZSh0LmlucHV0LG4pOm5ldyByLmNyZWF0ZSh7dHlwZToic3RydWN0dXJlIn0sbil9KSkscyh0aGlzLCJvdXRwdXQiLChmdW5jdGlvbigpe3JldHVybiB0Lm91dHB1dD9yLmNyZWF0ZSh0Lm91dHB1dCxuKTpuZXcgci5jcmVhdGUoe3R5cGU6InN0cnVjdHVyZSJ9LG4pfSkpLHModGhpcywiZXJyb3JzIiwoZnVuY3Rpb24oKXt2YXIgZT1bXTtpZighdC5lcnJvcnMpcmV0dXJuIG51bGw7Zm9yKHZhciBvPTA7bzx0LmVycm9ycy5sZW5ndGg7bysrKWUucHVzaChyLmNyZWF0ZSh0LmVycm9yc1tvXSxuKSk7cmV0dXJuIGV9KSkscyh0aGlzLCJwYWdpbmF0b3IiLChmdW5jdGlvbigpe3JldHVybiBuLmFwaS5wYWdpbmF0b3JzW2VdfSkpLG4uZG9jdW1lbnRhdGlvbiYmKGkodGhpcywiZG9jdW1lbnRhdGlvbiIsdC5kb2N1bWVudGF0aW9uKSxpKHRoaXMsImRvY3VtZW50YXRpb25VcmwiLHQuZG9jdW1lbnRhdGlvblVybCkpLHModGhpcywiaWRlbXBvdGVudE1lbWJlcnMiLChmdW5jdGlvbigpe3ZhciBlPVtdLHQ9by5pbnB1dCxuPXQubWVtYmVycztpZighdC5tZW1iZXJzKXJldHVybiBlO2Zvcih2YXIgciBpbiBuKW4uaGFzT3duUHJvcGVydHkocikmJiEwPT09bltyXS5pc0lkZW1wb3RlbnQmJmUucHVzaChyKTtyZXR1cm4gZX0pKSxzKHRoaXMsImhhc0V2ZW50T3V0cHV0IiwoZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tZW1iZXJzLG49ZS5wYXlsb2FkO2lmKCFlLm1lbWJlcnMpcmV0dXJuITE7aWYobilyZXR1cm4gdFtuXS5pc0V2ZW50U3RyZWFtO2Zvcih2YXIgciBpbiB0KWlmKCF0Lmhhc093blByb3BlcnR5KHIpJiYhMD09PXRbcl0uaXNFdmVudFN0cmVhbSlyZXR1cm4hMDtyZXR1cm4hMX0oby5vdXRwdXQpfSkpfX0seyIuLi91dGlsIjo3NCwiLi9zaGFwZSI6NDV9XSw0MzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKS5wcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyKHRoaXMsImlucHV0VG9rZW4iLHQuaW5wdXRfdG9rZW4pLHIodGhpcywibGltaXRLZXkiLHQubGltaXRfa2V5KSxyKHRoaXMsIm1vcmVSZXN1bHRzIix0Lm1vcmVfcmVzdWx0cykscih0aGlzLCJvdXRwdXRUb2tlbiIsdC5vdXRwdXRfdG9rZW4pLHIodGhpcywicmVzdWx0S2V5Iix0LnJlc3VsdF9rZXkpfX0seyIuLi91dGlsIjo3NH1dLDQ0OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLG89ci5wcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe249bnx8e30sbyh0aGlzLCJuYW1lIixlKSxvKHRoaXMsImFwaSIsbi5hcGksITEpLHQub3BlcmF0aW9uJiZvKHRoaXMsIm9wZXJhdGlvbiIsci5zdHJpbmcubG93ZXJGaXJzdCh0Lm9wZXJhdGlvbikpO3ZhciBpPXRoaXM7WyJ0eXBlIiwiZGVzY3JpcHRpb24iLCJkZWxheSIsIm1heEF0dGVtcHRzIiwiYWNjZXB0b3JzIl0uZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49dFtlXTtuJiZvKGksZSxuKX0pKX19LHsiLi4vdXRpbCI6NzR9XSw0NTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29sbGVjdGlvbiIpLG89ZSgiLi4vdXRpbCIpO2Z1bmN0aW9uIGkoZSx0LG4pe251bGwhPW4mJm8ucHJvcGVydHkuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIHMoZSx0KXtlLmNvbnN0cnVjdG9yLnByb3RvdHlwZVt0XXx8by5tZW1vaXplZFByb3BlcnR5LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBhKGUsdCxuKXt0PXR8fHt9LGkodGhpcywic2hhcGUiLGUuc2hhcGUpLGkodGhpcywiYXBpIix0LmFwaSwhMSksaSh0aGlzLCJ0eXBlIixlLnR5cGUpLGkodGhpcywiZW51bSIsZS5lbnVtKSxpKHRoaXMsIm1pbiIsZS5taW4pLGkodGhpcywibWF4IixlLm1heCksaSh0aGlzLCJwYXR0ZXJuIixlLnBhdHRlcm4pLGkodGhpcywibG9jYXRpb24iLGUubG9jYXRpb258fHRoaXMubG9jYXRpb258fCJib2R5IiksaSh0aGlzLCJuYW1lIix0aGlzLm5hbWV8fGUueG1sTmFtZXx8ZS5xdWVyeU5hbWV8fGUubG9jYXRpb25OYW1lfHxuKSxpKHRoaXMsImlzU3RyZWFtaW5nIixlLnN0cmVhbWluZ3x8dGhpcy5pc1N0cmVhbWluZ3x8ITEpLGkodGhpcywicmVxdWlyZXNMZW5ndGgiLGUucmVxdWlyZXNMZW5ndGgsITEpLGkodGhpcywiaXNDb21wb3NpdGUiLGUuaXNDb21wb3NpdGV8fCExKSxpKHRoaXMsImlzU2hhcGUiLCEwLCExKSxpKHRoaXMsImlzUXVlcnlOYW1lIixCb29sZWFuKGUucXVlcnlOYW1lKSwhMSksaSh0aGlzLCJpc0xvY2F0aW9uTmFtZSIsQm9vbGVhbihlLmxvY2F0aW9uTmFtZSksITEpLGkodGhpcywiaXNJZGVtcG90ZW50IiwhMD09PWUuaWRlbXBvdGVuY3lUb2tlbiksaSh0aGlzLCJpc0pzb25WYWx1ZSIsITA9PT1lLmpzb252YWx1ZSksaSh0aGlzLCJpc1NlbnNpdGl2ZSIsITA9PT1lLnNlbnNpdGl2ZXx8ZS5wcm90b3R5cGUmJiEwPT09ZS5wcm90b3R5cGUuc2Vuc2l0aXZlKSxpKHRoaXMsImlzRXZlbnRTdHJlYW0iLEJvb2xlYW4oZS5ldmVudHN0cmVhbSksITEpLGkodGhpcywiaXNFdmVudCIsQm9vbGVhbihlLmV2ZW50KSwhMSksaSh0aGlzLCJpc0V2ZW50UGF5bG9hZCIsQm9vbGVhbihlLmV2ZW50cGF5bG9hZCksITEpLGkodGhpcywiaXNFdmVudEhlYWRlciIsQm9vbGVhbihlLmV2ZW50aGVhZGVyKSwhMSksaSh0aGlzLCJpc1RpbWVzdGFtcEZvcm1hdFNldCIsQm9vbGVhbihlLnRpbWVzdGFtcEZvcm1hdCl8fGUucHJvdG90eXBlJiYhMD09PWUucHJvdG90eXBlLmlzVGltZXN0YW1wRm9ybWF0U2V0LCExKSxpKHRoaXMsImVuZHBvaW50RGlzY292ZXJ5SWQiLEJvb2xlYW4oZS5lbmRwb2ludGRpc2NvdmVyeWlkKSwhMSksaSh0aGlzLCJob3N0TGFiZWwiLEJvb2xlYW4oZS5ob3N0TGFiZWwpLCExKSx0LmRvY3VtZW50YXRpb24mJihpKHRoaXMsImRvY3VtZW50YXRpb24iLGUuZG9jdW1lbnRhdGlvbiksaSh0aGlzLCJkb2N1bWVudGF0aW9uVXJsIixlLmRvY3VtZW50YXRpb25VcmwpKSxlLnhtbEF0dHJpYnV0ZSYmaSh0aGlzLCJpc1htbEF0dHJpYnV0ZSIsZS54bWxBdHRyaWJ1dGV8fCExKSxpKHRoaXMsImRlZmF1bHRWYWx1ZSIsbnVsbCksdGhpcy50b1dpcmVGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6ZX0sdGhpcy50b1R5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9fWZ1bmN0aW9uIGMoZSl7YS5hcHBseSh0aGlzLGFyZ3VtZW50cyksaSh0aGlzLCJpc0NvbXBvc2l0ZSIsITApLGUuZmxhdHRlbmVkJiZpKHRoaXMsImZsYXR0ZW5lZCIsZS5mbGF0dGVuZWR8fCExKX1mdW5jdGlvbiB1KGUsdCl7dmFyIG49dGhpcyxvPW51bGwsdT0hdGhpcy5pc1NoYXBlO2MuYXBwbHkodGhpcyxhcmd1bWVudHMpLHUmJihpKHRoaXMsImRlZmF1bHRWYWx1ZSIsKGZ1bmN0aW9uKCl7cmV0dXJue319KSksaSh0aGlzLCJtZW1iZXJzIix7fSksaSh0aGlzLCJtZW1iZXJOYW1lcyIsW10pLGkodGhpcywicmVxdWlyZWQiLFtdKSxpKHRoaXMsImlzUmVxdWlyZWQiLChmdW5jdGlvbigpe3JldHVybiExfSkpLGkodGhpcywiaXNEb2N1bWVudCIsQm9vbGVhbihlLmRvY3VtZW50KSkpLGUubWVtYmVycyYmKGkodGhpcywibWVtYmVycyIsbmV3IHIoZS5tZW1iZXJzLHQsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGEuY3JlYXRlKG4sdCxlKX0pKSkscyh0aGlzLCJtZW1iZXJOYW1lcyIsKGZ1bmN0aW9uKCl7cmV0dXJuIGUueG1sT3JkZXJ8fE9iamVjdC5rZXlzKGUubWVtYmVycyl9KSksZS5ldmVudCYmKHModGhpcywiZXZlbnRQYXlsb2FkTWVtYmVyTmFtZSIsKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPW4ubWVtYmVycyx0PW4ubWVtYmVyTmFtZXMscj0wLG89dC5sZW5ndGg7cjxvO3IrKylpZihlW3Rbcl1dLmlzRXZlbnRQYXlsb2FkKXJldHVybiB0W3JdfSkpLHModGhpcywiZXZlbnRIZWFkZXJNZW1iZXJOYW1lcyIsKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPW4ubWVtYmVycyx0PW4ubWVtYmVyTmFtZXMscj1bXSxvPTAsaT10Lmxlbmd0aDtvPGk7bysrKWVbdFtvXV0uaXNFdmVudEhlYWRlciYmci5wdXNoKHRbb10pO3JldHVybiByfSkpKSksZS5yZXF1aXJlZCYmKGkodGhpcywicmVxdWlyZWQiLGUucmVxdWlyZWQpLGkodGhpcywiaXNSZXF1aXJlZCIsKGZ1bmN0aW9uKHQpe2lmKCFvKXtvPXt9O2Zvcih2YXIgbj0wO248ZS5yZXF1aXJlZC5sZW5ndGg7bisrKW9bZS5yZXF1aXJlZFtuXV09ITB9cmV0dXJuIG9bdF19KSwhMSwhMCkpLGkodGhpcywicmVzdWx0V3JhcHBlciIsZS5yZXN1bHRXcmFwcGVyfHxudWxsKSxlLnBheWxvYWQmJmkodGhpcywicGF5bG9hZCIsZS5wYXlsb2FkKSwic3RyaW5nIj09dHlwZW9mIGUueG1sTmFtZXNwYWNlP2kodGhpcywieG1sTmFtZXNwYWNlVXJpIixlLnhtbE5hbWVzcGFjZSk6Im9iamVjdCI9PXR5cGVvZiBlLnhtbE5hbWVzcGFjZSYmKGkodGhpcywieG1sTmFtZXNwYWNlUHJlZml4IixlLnhtbE5hbWVzcGFjZS5wcmVmaXgpLGkodGhpcywieG1sTmFtZXNwYWNlVXJpIixlLnhtbE5hbWVzcGFjZS51cmkpKX1mdW5jdGlvbiBsKGUsdCl7dmFyIG49dGhpcyxyPSF0aGlzLmlzU2hhcGU7aWYoYy5hcHBseSh0aGlzLGFyZ3VtZW50cyksciYmaSh0aGlzLCJkZWZhdWx0VmFsdWUiLChmdW5jdGlvbigpe3JldHVybltdfSkpLGUubWVtYmVyJiZzKHRoaXMsIm1lbWJlciIsKGZ1bmN0aW9uKCl7cmV0dXJuIGEuY3JlYXRlKGUubWVtYmVyLHQpfSkpLHRoaXMuZmxhdHRlbmVkKXt2YXIgbz10aGlzLm5hbWU7cyh0aGlzLCJuYW1lIiwoZnVuY3Rpb24oKXtyZXR1cm4gbi5tZW1iZXIubmFtZXx8b30pKX19ZnVuY3Rpb24gcChlLHQpe3ZhciBuPSF0aGlzLmlzU2hhcGU7Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyksbiYmKGkodGhpcywiZGVmYXVsdFZhbHVlIiwoZnVuY3Rpb24oKXtyZXR1cm57fX0pKSxpKHRoaXMsImtleSIsYS5jcmVhdGUoe3R5cGU6InN0cmluZyJ9LHQpKSxpKHRoaXMsInZhbHVlIixhLmNyZWF0ZSh7dHlwZToic3RyaW5nIn0sdCkpKSxlLmtleSYmcyh0aGlzLCJrZXkiLChmdW5jdGlvbigpe3JldHVybiBhLmNyZWF0ZShlLmtleSx0KX0pKSxlLnZhbHVlJiZzKHRoaXMsInZhbHVlIiwoZnVuY3Rpb24oKXtyZXR1cm4gYS5jcmVhdGUoZS52YWx1ZSx0KX0pKX1mdW5jdGlvbiBkKCl7YS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9WyJyZXN0LXhtbCIsInF1ZXJ5IiwiZWMyIl07dGhpcy50b1R5cGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dGhpcy5hcGkmJmUuaW5kZXhPZih0aGlzLmFwaS5wcm90b2NvbCk+LTE/dHx8IiI6dCx0aGlzLmlzSnNvblZhbHVlP0pTT04ucGFyc2UodCk6dCYmImZ1bmN0aW9uIj09dHlwZW9mIHQudG9TdHJpbmc/dC50b1N0cmluZygpOnR9LHRoaXMudG9XaXJlRm9ybWF0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmlzSnNvblZhbHVlP0pTT04uc3RyaW5naWZ5KGUpOmV9fWZ1bmN0aW9uIGgoKXthLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnRvVHlwZT1mdW5jdGlvbihlKXt2YXIgdD1vLmJhc2U2NC5kZWNvZGUoZSk7aWYodGhpcy5pc1NlbnNpdGl2ZSYmby5pc05vZGUoKSYmImZ1bmN0aW9uIj09dHlwZW9mIG8uQnVmZmVyLmFsbG9jKXt2YXIgbj1vLkJ1ZmZlci5hbGxvYyh0Lmxlbmd0aCx0KTt0LmZpbGwoMCksdD1ufXJldHVybiB0fSx0aGlzLnRvV2lyZUZvcm1hdD1vLmJhc2U2NC5lbmNvZGV9ZnVuY3Rpb24gZigpe2guYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGcoKXthLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnRvVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlP2U6bnVsbD09ZT9udWxsOiJ0cnVlIj09PWV9fWEubm9ybWFsaXplZFR5cGVzPXtjaGFyYWN0ZXI6InN0cmluZyIsZG91YmxlOiJmbG9hdCIsbG9uZzoiaW50ZWdlciIsc2hvcnQ6ImludGVnZXIiLGJpZ2ludGVnZXI6ImludGVnZXIiLGJpZ2RlY2ltYWw6ImZsb2F0IixibG9iOiJiaW5hcnkifSxhLnR5cGVzPXtzdHJ1Y3R1cmU6dSxsaXN0OmwsbWFwOnAsYm9vbGVhbjpnLHRpbWVzdGFtcDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKGEuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudGltZXN0YW1wRm9ybWF0KWkodGhpcywidGltZXN0YW1wRm9ybWF0IixlLnRpbWVzdGFtcEZvcm1hdCk7ZWxzZSBpZih0LmlzVGltZXN0YW1wRm9ybWF0U2V0JiZ0aGlzLnRpbWVzdGFtcEZvcm1hdClpKHRoaXMsInRpbWVzdGFtcEZvcm1hdCIsdGhpcy50aW1lc3RhbXBGb3JtYXQpO2Vsc2UgaWYoImhlYWRlciI9PT10aGlzLmxvY2F0aW9uKWkodGhpcywidGltZXN0YW1wRm9ybWF0IiwicmZjODIyIik7ZWxzZSBpZigicXVlcnlzdHJpbmciPT09dGhpcy5sb2NhdGlvbilpKHRoaXMsInRpbWVzdGFtcEZvcm1hdCIsImlzbzg2MDEiKTtlbHNlIGlmKHRoaXMuYXBpKXN3aXRjaCh0aGlzLmFwaS5wcm90b2NvbCl7Y2FzZSJqc29uIjpjYXNlInJlc3QtanNvbiI6aSh0aGlzLCJ0aW1lc3RhbXBGb3JtYXQiLCJ1bml4VGltZXN0YW1wIik7YnJlYWs7Y2FzZSJyZXN0LXhtbCI6Y2FzZSJxdWVyeSI6Y2FzZSJlYzIiOmkodGhpcywidGltZXN0YW1wRm9ybWF0IiwiaXNvODYwMSIpfXRoaXMudG9UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIGUudG9VVENTdHJpbmc/ZToic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZT9vLmRhdGUucGFyc2VUaW1lc3RhbXAoZSk6bnVsbH0sdGhpcy50b1dpcmVGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG8uZGF0ZS5mb3JtYXQoZSx0LnRpbWVzdGFtcEZvcm1hdCl9fSxmbG9hdDpmdW5jdGlvbigpe2EuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMudG9UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP251bGw6cGFyc2VGbG9hdChlKX0sdGhpcy50b1dpcmVGb3JtYXQ9dGhpcy50b1R5cGV9LGludGVnZXI6ZnVuY3Rpb24oKXthLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnRvVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9udWxsOnBhcnNlSW50KGUsMTApfSx0aGlzLnRvV2lyZUZvcm1hdD10aGlzLnRvVHlwZX0sc3RyaW5nOmQsYmFzZTY0OmYsYmluYXJ5Omh9LGEucmVzb2x2ZT1mdW5jdGlvbihlLHQpe2lmKGUuc2hhcGUpe3ZhciBuPXQuYXBpLnNoYXBlc1tlLnNoYXBlXTtpZighbil0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIHNoYXBlIHJlZmVyZW5jZTogIitlLnNoYXBlKTtyZXR1cm4gbn1yZXR1cm4gbnVsbH0sYS5jcmVhdGU9ZnVuY3Rpb24oZSx0LG4pe2lmKGUuaXNTaGFwZSlyZXR1cm4gZTt2YXIgcj1hLnJlc29sdmUoZSx0KTtpZihyKXt2YXIgbz1PYmplY3Qua2V5cyhlKTt0LmRvY3VtZW50YXRpb258fChvPW8uZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4hZS5tYXRjaCgvZG9jdW1lbnRhdGlvbi8pfSkpKTt2YXIgaT1mdW5jdGlvbigpe3IuY29uc3RydWN0b3IuY2FsbCh0aGlzLGUsdCxuKX07cmV0dXJuIGkucHJvdG90eXBlPXIsbmV3IGl9ZS50eXBlfHwoZS5tZW1iZXJzP2UudHlwZT0ic3RydWN0dXJlIjplLm1lbWJlcj9lLnR5cGU9Imxpc3QiOmUua2V5P2UudHlwZT0ibWFwIjplLnR5cGU9InN0cmluZyIpO3ZhciBzPWUudHlwZTtpZihhLm5vcm1hbGl6ZWRUeXBlc1tlLnR5cGVdJiYoZS50eXBlPWEubm9ybWFsaXplZFR5cGVzW2UudHlwZV0pLGEudHlwZXNbZS50eXBlXSlyZXR1cm4gbmV3IGEudHlwZXNbZS50eXBlXShlLHQsbik7dGhyb3cgbmV3IEVycm9yKCJVbnJlY29nbml6ZWQgc2hhcGUgdHlwZTogIitzKX0sYS5zaGFwZXM9e1N0cnVjdHVyZVNoYXBlOnUsTGlzdFNoYXBlOmwsTWFwU2hhcGU6cCxTdHJpbmdTaGFwZTpkLEJvb2xlYW5TaGFwZTpnLEJhc2U2NFNoYXBlOmZ9LHQuZXhwb3J0cz1hfSx7Ii4uL3V0aWwiOjc0LCIuL2NvbGxlY3Rpb24iOjQxfV0sNDY6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvcmUiKTtyLlBhcmFtVmFsaWRhdG9yPXIudXRpbC5pbmhlcml0KHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXshMCE9PWUmJnZvaWQgMCE9PWV8fChlPXttaW46ITB9KSx0aGlzLnZhbGlkYXRpb249ZX0sdmFsaWRhdGU6ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuZXJyb3JzPVtdLHRoaXMudmFsaWRhdGVNZW1iZXIoZSx0fHx7fSxufHwicGFyYW1zIiksdGhpcy5lcnJvcnMubGVuZ3RoPjEpe3ZhciBvPXRoaXMuZXJyb3JzLmpvaW4oIlxuKiAiKTt0aHJvdyBvPSJUaGVyZSB3ZXJlICIrdGhpcy5lcnJvcnMubGVuZ3RoKyIgdmFsaWRhdGlvbiBlcnJvcnM6XG4qICIrbyxyLnV0aWwuZXJyb3IobmV3IEVycm9yKG8pLHtjb2RlOiJNdWx0aXBsZVZhbGlkYXRpb25FcnJvcnMiLGVycm9yczp0aGlzLmVycm9yc30pfWlmKDE9PT10aGlzLmVycm9ycy5sZW5ndGgpdGhyb3cgdGhpcy5lcnJvcnNbMF07cmV0dXJuITB9LGZhaWw6ZnVuY3Rpb24oZSx0KXt0aGlzLmVycm9ycy5wdXNoKHIudXRpbC5lcnJvcihuZXcgRXJyb3IodCkse2NvZGU6ZX0pKX0sdmFsaWRhdGVTdHJ1Y3R1cmU6ZnVuY3Rpb24oZSx0LG4pe2lmKGUuaXNEb2N1bWVudClyZXR1cm4hMDt2YXIgcjt0aGlzLnZhbGlkYXRlVHlwZSh0LG4sWyJvYmplY3QiXSwic3RydWN0dXJlIik7Zm9yKHZhciBvPTA7ZS5yZXF1aXJlZCYmbzxlLnJlcXVpcmVkLmxlbmd0aDtvKyspe3ZhciBpPXRbcj1lLnJlcXVpcmVkW29dXTtudWxsPT1pJiZ0aGlzLmZhaWwoIk1pc3NpbmdSZXF1aXJlZFBhcmFtZXRlciIsIk1pc3NpbmcgcmVxdWlyZWQga2V5ICciK3IrIicgaW4gIituKX1mb3IociBpbiB0KWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LHIpKXt2YXIgcz10W3JdLGE9ZS5tZW1iZXJzW3JdO2lmKHZvaWQgMCE9PWEpe3ZhciBjPVtuLHJdLmpvaW4oIi4iKTt0aGlzLnZhbGlkYXRlTWVtYmVyKGEscyxjKX1lbHNlIG51bGwhPXMmJnRoaXMuZmFpbCgiVW5leHBlY3RlZFBhcmFtZXRlciIsIlVuZXhwZWN0ZWQga2V5ICciK3IrIicgZm91bmQgaW4gIituKX1yZXR1cm4hMH0sdmFsaWRhdGVNZW1iZXI6ZnVuY3Rpb24oZSx0LG4pe3N3aXRjaChlLnR5cGUpe2Nhc2Uic3RydWN0dXJlIjpyZXR1cm4gdGhpcy52YWxpZGF0ZVN0cnVjdHVyZShlLHQsbik7Y2FzZSJsaXN0IjpyZXR1cm4gdGhpcy52YWxpZGF0ZUxpc3QoZSx0LG4pO2Nhc2UibWFwIjpyZXR1cm4gdGhpcy52YWxpZGF0ZU1hcChlLHQsbik7ZGVmYXVsdDpyZXR1cm4gdGhpcy52YWxpZGF0ZVNjYWxhcihlLHQsbil9fSx2YWxpZGF0ZUxpc3Q6ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMudmFsaWRhdGVUeXBlKHQsbixbQXJyYXldKSl7dGhpcy52YWxpZGF0ZVJhbmdlKGUsdC5sZW5ndGgsbiwibGlzdCBtZW1iZXIgY291bnQiKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl0aGlzLnZhbGlkYXRlTWVtYmVyKGUubWVtYmVyLHRbcl0sbisiWyIrcisiXSIpfX0sdmFsaWRhdGVNYXA6ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMudmFsaWRhdGVUeXBlKHQsbixbIm9iamVjdCJdLCJtYXAiKSl7dmFyIHI9MDtmb3IodmFyIG8gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxvKSYmKHRoaXMudmFsaWRhdGVNZW1iZXIoZS5rZXksbyxuKyJba2V5PSciK28rIiddIiksdGhpcy52YWxpZGF0ZU1lbWJlcihlLnZhbHVlLHRbb10sbisiWyciK28rIiddIikscisrKTt0aGlzLnZhbGlkYXRlUmFuZ2UoZSxyLG4sIm1hcCBtZW1iZXIgY291bnQiKX19LHZhbGlkYXRlU2NhbGFyOmZ1bmN0aW9uKGUsdCxuKXtzd2l0Y2goZS50eXBlKXtjYXNlIG51bGw6Y2FzZSB2b2lkIDA6Y2FzZSJzdHJpbmciOnJldHVybiB0aGlzLnZhbGlkYXRlU3RyaW5nKGUsdCxuKTtjYXNlImJhc2U2NCI6Y2FzZSJiaW5hcnkiOnJldHVybiB0aGlzLnZhbGlkYXRlUGF5bG9hZCh0LG4pO2Nhc2UiaW50ZWdlciI6Y2FzZSJmbG9hdCI6cmV0dXJuIHRoaXMudmFsaWRhdGVOdW1iZXIoZSx0LG4pO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIHRoaXMudmFsaWRhdGVUeXBlKHQsbixbImJvb2xlYW4iXSk7Y2FzZSJ0aW1lc3RhbXAiOnJldHVybiB0aGlzLnZhbGlkYXRlVHlwZSh0LG4sW0RhdGUsL15cZHs0fS1cZHsyfS1cZHsyfVRcZHsyfTpcZHsyfTpcZHsyfShcLlxkKyk/WiQvLCJudW1iZXIiXSwiRGF0ZSBvYmplY3QsIElTTy04NjAxIHN0cmluZywgb3IgYSBVTklYIHRpbWVzdGFtcCIpO2RlZmF1bHQ6cmV0dXJuIHRoaXMuZmFpbCgiVW5rb3duVHlwZSIsIlVuaGFuZGxlZCB0eXBlICIrZS50eXBlKyIgZm9yICIrbil9fSx2YWxpZGF0ZVN0cmluZzpmdW5jdGlvbihlLHQsbil7dmFyIHI9WyJzdHJpbmciXTtlLmlzSnNvblZhbHVlJiYocj1yLmNvbmNhdChbIm51bWJlciIsIm9iamVjdCIsImJvb2xlYW4iXSkpLG51bGwhPT10JiZ0aGlzLnZhbGlkYXRlVHlwZSh0LG4scikmJih0aGlzLnZhbGlkYXRlRW51bShlLHQsbiksdGhpcy52YWxpZGF0ZVJhbmdlKGUsdC5sZW5ndGgsbiwic3RyaW5nIGxlbmd0aCIpLHRoaXMudmFsaWRhdGVQYXR0ZXJuKGUsdCxuKSx0aGlzLnZhbGlkYXRlVXJpKGUsdCxuKSl9LHZhbGlkYXRlVXJpOmZ1bmN0aW9uKGUsdCxuKXsidXJpIj09PWUubG9jYXRpb24mJjA9PT10Lmxlbmd0aCYmdGhpcy5mYWlsKCJVcmlQYXJhbWV0ZXJFcnJvciIsJ0V4cGVjdGVkIHVyaSBwYXJhbWV0ZXIgdG8gaGF2ZSBsZW5ndGggPj0gMSwgYnV0IGZvdW5kICInK3QrJyIgZm9yICcrbil9LHZhbGlkYXRlUGF0dGVybjpmdW5jdGlvbihlLHQsbil7dGhpcy52YWxpZGF0aW9uLnBhdHRlcm4mJnZvaWQgMCE9PWUucGF0dGVybiYmKG5ldyBSZWdFeHAoZS5wYXR0ZXJuKS50ZXN0KHQpfHx0aGlzLmZhaWwoIlBhdHRlcm5NYXRjaEVycm9yIiwnUHJvdmlkZWQgdmFsdWUgIicrdCsnIiBkb2VzIG5vdCBtYXRjaCByZWdleCBwYXR0ZXJuIC8nK2UucGF0dGVybisiLyBmb3IgIituKSl9LHZhbGlkYXRlUmFuZ2U6ZnVuY3Rpb24oZSx0LG4scil7dGhpcy52YWxpZGF0aW9uLm1pbiYmdm9pZCAwIT09ZS5taW4mJnQ8ZS5taW4mJnRoaXMuZmFpbCgiTWluUmFuZ2VFcnJvciIsIkV4cGVjdGVkICIrcisiID49ICIrZS5taW4rIiwgYnV0IGZvdW5kICIrdCsiIGZvciAiK24pLHRoaXMudmFsaWRhdGlvbi5tYXgmJnZvaWQgMCE9PWUubWF4JiZ0PmUubWF4JiZ0aGlzLmZhaWwoIk1heFJhbmdlRXJyb3IiLCJFeHBlY3RlZCAiK3IrIiA8PSAiK2UubWF4KyIsIGJ1dCBmb3VuZCAiK3QrIiBmb3IgIituKX0sdmFsaWRhdGVFbnVtOmZ1bmN0aW9uKGUsdCxuKXt0aGlzLnZhbGlkYXRpb24uZW51bSYmdm9pZCAwIT09ZS5lbnVtJiYtMT09PWUuZW51bS5pbmRleE9mKHQpJiZ0aGlzLmZhaWwoIkVudW1FcnJvciIsIkZvdW5kIHN0cmluZyB2YWx1ZSBvZiAiK3QrIiwgYnV0IGV4cGVjdGVkICIrZS5lbnVtLmpvaW4oInwiKSsiIGZvciAiK24pfSx2YWxpZGF0ZVR5cGU6ZnVuY3Rpb24oZSx0LG4sbyl7aWYobnVsbD09ZSlyZXR1cm4hMTtmb3IodmFyIGk9ITEscz0wO3M8bi5sZW5ndGg7cysrKXtpZigic3RyaW5nIj09dHlwZW9mIG5bc10pe2lmKHR5cGVvZiBlPT09bltzXSlyZXR1cm4hMH1lbHNlIGlmKG5bc11pbnN0YW5jZW9mIFJlZ0V4cCl7aWYoKGV8fCIiKS50b1N0cmluZygpLm1hdGNoKG5bc10pKXJldHVybiEwfWVsc2V7aWYoZSBpbnN0YW5jZW9mIG5bc10pcmV0dXJuITA7aWYoci51dGlsLmlzVHlwZShlLG5bc10pKXJldHVybiEwO298fGl8fChuPW4uc2xpY2UoKSksbltzXT1yLnV0aWwudHlwZU5hbWUobltzXSl9aT0hMH12YXIgYT1vO2F8fChhPW4uam9pbigiLCAiKS5yZXBsYWNlKC8sKFteLF0rKSQvLCIsIG9yJDEiKSk7dmFyIGM9YS5tYXRjaCgvXlthZWlvdV0vaSk/Im4iOiIiO3JldHVybiB0aGlzLmZhaWwoIkludmFsaWRQYXJhbWV0ZXJUeXBlIiwiRXhwZWN0ZWQgIit0KyIgdG8gYmUgYSIrYysiICIrYSksITF9LHZhbGlkYXRlTnVtYmVyOmZ1bmN0aW9uKGUsdCxuKXtpZihudWxsIT10KXtpZigic3RyaW5nIj09dHlwZW9mIHQpe3ZhciByPXBhcnNlRmxvYXQodCk7ci50b1N0cmluZygpPT09dCYmKHQ9cil9dGhpcy52YWxpZGF0ZVR5cGUodCxuLFsibnVtYmVyIl0pJiZ0aGlzLnZhbGlkYXRlUmFuZ2UoZSx0LG4sIm51bWVyaWMgdmFsdWUiKX19LHZhbGlkYXRlUGF5bG9hZDpmdW5jdGlvbihlLHQpe2lmKG51bGwhPWUmJiJzdHJpbmciIT10eXBlb2YgZSYmKCFlfHwibnVtYmVyIiE9dHlwZW9mIGUuYnl0ZUxlbmd0aCkpe2lmKHIudXRpbC5pc05vZGUoKSl7dmFyIG49ci51dGlsLnN0cmVhbS5TdHJlYW07aWYoci51dGlsLkJ1ZmZlci5pc0J1ZmZlcihlKXx8ZSBpbnN0YW5jZW9mIG4pcmV0dXJufWVsc2UgaWYodm9pZCAwIT09dHlwZW9mIEJsb2ImJmUgaW5zdGFuY2VvZiBCbG9iKXJldHVybjt2YXIgbz1bIkJ1ZmZlciIsIlN0cmVhbSIsIkZpbGUiLCJCbG9iIiwiQXJyYXlCdWZmZXIiLCJEYXRhVmlldyJdO2lmKGUpZm9yKHZhciBpPTA7aTxvLmxlbmd0aDtpKyspe2lmKHIudXRpbC5pc1R5cGUoZSxvW2ldKSlyZXR1cm47aWYoci51dGlsLnR5cGVOYW1lKGUuY29uc3RydWN0b3IpPT09b1tpXSlyZXR1cm59dGhpcy5mYWlsKCJJbnZhbGlkUGFyYW1ldGVyVHlwZSIsIkV4cGVjdGVkICIrdCsiIHRvIGJlIGEgc3RyaW5nLCBCdWZmZXIsIFN0cmVhbSwgQmxvYiwgb3IgdHlwZWQgYXJyYXkgb2JqZWN0Iil9fX0pfSx7Ii4vY29yZSI6MTl9XSw0NzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKSxvPWUoIi4uL2NvcmUiKTt0LmV4cG9ydHM9e3BvcHVsYXRlSG9zdFByZWZpeDpmdW5jdGlvbihlKXtpZighZS5zZXJ2aWNlLmNvbmZpZy5ob3N0UHJlZml4RW5hYmxlZClyZXR1cm4gZTt2YXIgdCxuLGkscyxhLGM9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXTtpZihmdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2UuYXBpLG49dC5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXSxvPXQuZW5kcG9pbnRPcGVyYXRpb24mJnQuZW5kcG9pbnRPcGVyYXRpb249PT1yLnN0cmluZy5sb3dlckZpcnN0KG4ubmFtZSk7cmV0dXJuIk5VTEwiIT09bi5lbmRwb2ludERpc2NvdmVyeVJlcXVpcmVkfHwhMD09PW99KGUpKXJldHVybiBlO2lmKGMuZW5kcG9pbnQmJmMuZW5kcG9pbnQuaG9zdFByZWZpeCl7dmFyIHU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiByLmVhY2gobi5tZW1iZXJzLChmdW5jdGlvbihuLG8pe2lmKCEwPT09by5ob3N0TGFiZWwpe2lmKCJzdHJpbmciIT10eXBlb2YgdFtuXXx8IiI9PT10W25dKXRocm93IHIuZXJyb3IobmV3IEVycm9yLHttZXNzYWdlOiJQYXJhbWV0ZXIgIituKyIgc2hvdWxkIGJlIGEgbm9uLWVtcHR5IHN0cmluZy4iLGNvZGU6IkludmFsaWRQYXJhbWV0ZXIifSk7dmFyIGk9bmV3IFJlZ0V4cCgiXFx7IituKyJcXH0iLCJnIik7ZT1lLnJlcGxhY2UoaSx0W25dKX19KSksZX0oYy5lbmRwb2ludC5ob3N0UHJlZml4LGUucGFyYW1zLGMuaW5wdXQpO3M9ZS5odHRwUmVxdWVzdC5lbmRwb2ludCxhPXUscy5ob3N0JiYocy5ob3N0PWErcy5ob3N0KSxzLmhvc3RuYW1lJiYocy5ob3N0bmFtZT1hK3MuaG9zdG5hbWUpLHQ9ZS5odHRwUmVxdWVzdC5lbmRwb2ludC5ob3N0bmFtZSxuPXQuc3BsaXQoIi4iKSxpPS9eW2EtekEtWjAtOV17MX0kfF5bYS16QS1aMC05XVthLXpBLVowLTlcLV0qW2EtekEtWjAtOV0kLyxyLmFycmF5RWFjaChuLChmdW5jdGlvbihlKXtpZighZS5sZW5ndGh8fGUubGVuZ3RoPDF8fGUubGVuZ3RoPjYzKXRocm93IHIuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJWYWxpZGF0aW9uRXJyb3IiLG1lc3NhZ2U6Ikhvc3RuYW1lIGxhYmVsIGxlbmd0aCBzaG91bGQgYmUgYmV0d2VlbiAxIHRvIDYzIGNoYXJhY3RlcnMsIGluY2x1c2l2ZS4ifSk7aWYoIWkudGVzdChlKSl0aHJvdyBvLnV0aWwuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJWYWxpZGF0aW9uRXJyb3IiLG1lc3NhZ2U6ZSsiIGlzIG5vdCBob3N0bmFtZSBjb21wYXRpYmxlLiJ9KX0pKX1yZXR1cm4gZX19fSx7Ii4uL2NvcmUiOjE5LCIuLi91dGlsIjo3NH1dLDQ4OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLG89ZSgiLi4vanNvbi9idWlsZGVyIiksaT1lKCIuLi9qc29uL3BhcnNlciIpLHM9ZSgiLi9oZWxwZXJzIikucG9wdWxhdGVIb3N0UHJlZml4O3QuZXhwb3J0cz17YnVpbGRSZXF1ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuaHR0cFJlcXVlc3Qsbj1lLnNlcnZpY2UuYXBpLHI9bi50YXJnZXRQcmVmaXgrIi4iK24ub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0ubmFtZSxpPW4uanNvblZlcnNpb258fCIxLjAiLGE9bi5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXS5pbnB1dCxjPW5ldyBvOzE9PT1pJiYoaT0iMS4wIiksbi5hd3NRdWVyeUNvbXBhdGlibGUmJih0LnBhcmFtc3x8KHQucGFyYW1zPXt9KSxPYmplY3QuYXNzaWduKHQucGFyYW1zLGUucGFyYW1zKSksdC5ib2R5PWMuYnVpbGQoZS5wYXJhbXN8fHt9LGEpLHQuaGVhZGVyc1siQ29udGVudC1UeXBlIl09ImFwcGxpY2F0aW9uL3gtYW16LWpzb24tIitpLHQuaGVhZGVyc1siWC1BbXotVGFyZ2V0Il09cixzKGUpfSxleHRyYWN0RXJyb3I6ZnVuY3Rpb24oZSl7dmFyIHQ9e30sbj1lLmh0dHBSZXNwb25zZTtpZih0LmNvZGU9bi5oZWFkZXJzWyJ4LWFtem4tZXJyb3J0eXBlIl18fCJVbmtub3duRXJyb3IiLCJzdHJpbmciPT10eXBlb2YgdC5jb2RlJiYodC5jb2RlPXQuY29kZS5zcGxpdCgiOiIpWzBdKSxuLmJvZHkubGVuZ3RoPjApdHJ5e3ZhciBvPUpTT04ucGFyc2Uobi5ib2R5LnRvU3RyaW5nKCkpLGk9by5fX3R5cGV8fG8uY29kZXx8by5Db2RlO2Zvcih2YXIgcyBpbiBpJiYodC5jb2RlPWkuc3BsaXQoIiMiKS5wb3AoKSksIlJlcXVlc3RFbnRpdHlUb29MYXJnZSI9PT10LmNvZGU/dC5tZXNzYWdlPSJSZXF1ZXN0IGJvZHkgbXVzdCBiZSBsZXNzIHRoYW4gMSBNQiI6dC5tZXNzYWdlPW8ubWVzc2FnZXx8by5NZXNzYWdlfHxudWxsLG98fHt9KSJjb2RlIiE9PXMmJiJtZXNzYWdlIiE9PXMmJih0WyJbIitzKyJdIl09IlNlZSBlcnJvci4iK3MrIiBmb3IgZGV0YWlscy4iLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHMse3ZhbHVlOm9bc10sZW51bWVyYWJsZTohMSx3cml0YWJsZTohMH0pKX1jYXRjaChvKXt0LnN0YXR1c0NvZGU9bi5zdGF0dXNDb2RlLHQubWVzc2FnZT1uLnN0YXR1c01lc3NhZ2V9ZWxzZSB0LnN0YXR1c0NvZGU9bi5zdGF0dXNDb2RlLHQubWVzc2FnZT1uLnN0YXR1c0NvZGUudG9TdHJpbmcoKTtlLmVycm9yPXIuZXJyb3IobmV3IEVycm9yLHQpfSxleHRyYWN0RGF0YTpmdW5jdGlvbihlKXt2YXIgdD1lLmh0dHBSZXNwb25zZS5ib2R5LnRvU3RyaW5nKCl8fCJ7fSI7aWYoITE9PT1lLnJlcXVlc3Quc2VydmljZS5jb25maWcuY29udmVydFJlc3BvbnNlVHlwZXMpZS5kYXRhPUpTT04ucGFyc2UodCk7ZWxzZXt2YXIgbj1lLnJlcXVlc3Quc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLnJlcXVlc3Qub3BlcmF0aW9uXS5vdXRwdXR8fHt9LHI9bmV3IGk7ZS5kYXRhPXIucGFyc2UodCxuKX19fX0seyIuLi9qc29uL2J1aWxkZXIiOjM3LCIuLi9qc29uL3BhcnNlciI6MzgsIi4uL3V0aWwiOjc0LCIuL2hlbHBlcnMiOjQ3fV0sNDk6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCIuLi91dGlsIiksaT1lKCIuLi9xdWVyeS9xdWVyeV9wYXJhbV9zZXJpYWxpemVyIikscz1lKCIuLi9tb2RlbC9zaGFwZSIpLGE9ZSgiLi9oZWxwZXJzIikucG9wdWxhdGVIb3N0UHJlZml4O3QuZXhwb3J0cz17YnVpbGRSZXF1ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0sbj1lLmh0dHBSZXF1ZXN0O24uaGVhZGVyc1siQ29udGVudC1UeXBlIl09ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD11dGYtOCIsbi5wYXJhbXM9e1ZlcnNpb246ZS5zZXJ2aWNlLmFwaS5hcGlWZXJzaW9uLEFjdGlvbjp0Lm5hbWV9LChuZXcgaSkuc2VyaWFsaXplKGUucGFyYW1zLHQuaW5wdXQsKGZ1bmN0aW9uKGUsdCl7bi5wYXJhbXNbZV09dH0pKSxuLmJvZHk9by5xdWVyeVBhcmFtc1RvU3RyaW5nKG4ucGFyYW1zKSxhKGUpfSxleHRyYWN0RXJyb3I6ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLmh0dHBSZXNwb25zZS5ib2R5LnRvU3RyaW5nKCk7aWYobi5tYXRjaCgiPFVua25vd25PcGVyYXRpb25FeGNlcHRpb24iKSl0PXtDb2RlOiJVbmtub3duT3BlcmF0aW9uIixNZXNzYWdlOiJVbmtub3duIG9wZXJhdGlvbiAiK2UucmVxdWVzdC5vcGVyYXRpb259O2Vsc2UgdHJ5e3Q9KG5ldyByLlhNTC5QYXJzZXIpLnBhcnNlKG4pfWNhdGNoKG4pe3Q9e0NvZGU6ZS5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSxNZXNzYWdlOmUuaHR0cFJlc3BvbnNlLnN0YXR1c01lc3NhZ2V9fXQucmVxdWVzdElkJiYhZS5yZXF1ZXN0SWQmJihlLnJlcXVlc3RJZD10LnJlcXVlc3RJZCksdC5FcnJvcnMmJih0PXQuRXJyb3JzKSx0LkVycm9yJiYodD10LkVycm9yKSx0LkNvZGU/ZS5lcnJvcj1vLmVycm9yKG5ldyBFcnJvcix7Y29kZTp0LkNvZGUsbWVzc2FnZTp0Lk1lc3NhZ2V9KTplLmVycm9yPW8uZXJyb3IobmV3IEVycm9yLHtjb2RlOmUuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUsbWVzc2FnZTpudWxsfSl9LGV4dHJhY3REYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxdWVzdCxuPXQuc2VydmljZS5hcGkub3BlcmF0aW9uc1t0Lm9wZXJhdGlvbl0ub3V0cHV0fHx7fSxpPW47aWYoaS5yZXN1bHRXcmFwcGVyKXt2YXIgYT1zLmNyZWF0ZSh7dHlwZToic3RydWN0dXJlIn0pO2EubWVtYmVyc1tpLnJlc3VsdFdyYXBwZXJdPW4sYS5tZW1iZXJOYW1lcz1baS5yZXN1bHRXcmFwcGVyXSxvLnByb3BlcnR5KG4sIm5hbWUiLG4ucmVzdWx0V3JhcHBlciksbj1hfXZhciBjPW5ldyByLlhNTC5QYXJzZXI7aWYobiYmbi5tZW1iZXJzJiYhbi5tZW1iZXJzLl9YQU1aUmVxdWVzdElkKXt2YXIgdT1zLmNyZWF0ZSh7dHlwZToic3RyaW5nIn0se2FwaTp7cHJvdG9jb2w6InF1ZXJ5In19LCJyZXF1ZXN0SWQiKTtuLm1lbWJlcnMuX1hBTVpSZXF1ZXN0SWQ9dX12YXIgbD1jLnBhcnNlKGUuaHR0cFJlc3BvbnNlLmJvZHkudG9TdHJpbmcoKSxuKTtlLnJlcXVlc3RJZD1sLl9YQU1aUmVxdWVzdElkfHxsLnJlcXVlc3RJZCxsLl9YQU1aUmVxdWVzdElkJiZkZWxldGUgbC5fWEFNWlJlcXVlc3RJZCxpLnJlc3VsdFdyYXBwZXImJmxbaS5yZXN1bHRXcmFwcGVyXSYmKG8udXBkYXRlKGwsbFtpLnJlc3VsdFdyYXBwZXJdKSxkZWxldGUgbFtpLnJlc3VsdFdyYXBwZXJdKSxlLmRhdGE9bH19fSx7Ii4uL2NvcmUiOjE5LCIuLi9tb2RlbC9zaGFwZSI6NDUsIi4uL3F1ZXJ5L3F1ZXJ5X3BhcmFtX3NlcmlhbGl6ZXIiOjUzLCIuLi91dGlsIjo3NCwiLi9oZWxwZXJzIjo0N31dLDUwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLG89ZSgiLi9oZWxwZXJzIikucG9wdWxhdGVIb3N0UHJlZml4O2Z1bmN0aW9uIGkoZSx0LG4sbyl7dmFyIGk9W2UsdF0uam9pbigiLyIpO2k9aS5yZXBsYWNlKC9cLysvZywiLyIpO3ZhciBzPXt9LGE9ITE7aWYoci5lYWNoKG4ubWVtYmVycywoZnVuY3Rpb24oZSx0KXt2YXIgbj1vW2VdO2lmKG51bGwhPW4paWYoInVyaSI9PT10LmxvY2F0aW9uKXt2YXIgYz1uZXcgUmVnRXhwKCJcXHsiK3QubmFtZSsiKFxcKyk/XFx9Iik7aT1pLnJlcGxhY2UoYywoZnVuY3Rpb24oZSx0KXtyZXR1cm4odD9yLnVyaUVzY2FwZVBhdGg6ci51cmlFc2NhcGUpKFN0cmluZyhuKSl9KSl9ZWxzZSJxdWVyeXN0cmluZyI9PT10LmxvY2F0aW9uJiYoYT0hMCwibGlzdCI9PT10LnR5cGU/c1t0Lm5hbWVdPW4ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gci51cmlFc2NhcGUodC5tZW1iZXIudG9XaXJlRm9ybWF0KGUpLnRvU3RyaW5nKCkpfSkpOiJtYXAiPT09dC50eXBlP3IuZWFjaChuLChmdW5jdGlvbihlLHQpe0FycmF5LmlzQXJyYXkodCk/c1tlXT10Lm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIHIudXJpRXNjYXBlKFN0cmluZyhlKSl9KSk6c1tlXT1yLnVyaUVzY2FwZShTdHJpbmcodCkpfSkpOnNbdC5uYW1lXT1yLnVyaUVzY2FwZSh0LnRvV2lyZUZvcm1hdChuKS50b1N0cmluZygpKSl9KSksYSl7aSs9aS5pbmRleE9mKCI/Iik+PTA/IiYiOiI/Ijt2YXIgYz1bXTtyLmFycmF5RWFjaChPYmplY3Qua2V5cyhzKS5zb3J0KCksKGZ1bmN0aW9uKGUpe0FycmF5LmlzQXJyYXkoc1tlXSl8fChzW2VdPVtzW2VdXSk7Zm9yKHZhciB0PTA7dDxzW2VdLmxlbmd0aDt0KyspYy5wdXNoKHIudXJpRXNjYXBlKFN0cmluZyhlKSkrIj0iK3NbZV1bdF0pfSkpLGkrPWMuam9pbigiJiIpfXJldHVybiBpfXQuZXhwb3J0cz17YnVpbGRSZXF1ZXN0OmZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXtlLmh0dHBSZXF1ZXN0Lm1ldGhvZD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLmh0dHBNZXRob2R9KGUpLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0sbj10LmlucHV0LHI9aShlLmh0dHBSZXF1ZXN0LmVuZHBvaW50LnBhdGgsdC5odHRwUGF0aCxuLGUucGFyYW1zKTtlLmh0dHBSZXF1ZXN0LnBhdGg9cn0oZSksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXTtyLmVhY2godC5pbnB1dC5tZW1iZXJzLChmdW5jdGlvbih0LG4pe3ZhciBvPWUucGFyYW1zW3RdO251bGwhPW8mJigiaGVhZGVycyI9PT1uLmxvY2F0aW9uJiYibWFwIj09PW4udHlwZT9yLmVhY2gobywoZnVuY3Rpb24odCxyKXtlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbbi5uYW1lK3RdPXJ9KSk6ImhlYWRlciI9PT1uLmxvY2F0aW9uJiYobz1uLnRvV2lyZUZvcm1hdChvKS50b1N0cmluZygpLG4uaXNKc29uVmFsdWUmJihvPXIuYmFzZTY0LmVuY29kZShvKSksZS5odHRwUmVxdWVzdC5oZWFkZXJzW24ubmFtZV09bykpfSkpfShlKSxvKGUpfSxleHRyYWN0RXJyb3I6ZnVuY3Rpb24oKXt9LGV4dHJhY3REYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxdWVzdCxuPXt9LG89ZS5odHRwUmVzcG9uc2UsaT10LnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbdC5vcGVyYXRpb25dLm91dHB1dCxzPXt9O3IuZWFjaChvLmhlYWRlcnMsKGZ1bmN0aW9uKGUsdCl7c1tlLnRvTG93ZXJDYXNlKCldPXR9KSksci5lYWNoKGkubWVtYmVycywoZnVuY3Rpb24oZSx0KXt2YXIgaT0odC5uYW1lfHxlKS50b0xvd2VyQ2FzZSgpO2lmKCJoZWFkZXJzIj09PXQubG9jYXRpb24mJiJtYXAiPT09dC50eXBlKXtuW2VdPXt9O3ZhciBhPXQuaXNMb2NhdGlvbk5hbWU/dC5uYW1lOiIiLGM9bmV3IFJlZ0V4cCgiXiIrYSsiKC4rKSIsImkiKTtyLmVhY2goby5oZWFkZXJzLChmdW5jdGlvbih0LHIpe3ZhciBvPXQubWF0Y2goYyk7bnVsbCE9PW8mJihuW2VdW29bMV1dPXIpfSkpfWVsc2UgaWYoImhlYWRlciI9PT10LmxvY2F0aW9uKXtpZih2b2lkIDAhPT1zW2ldKXt2YXIgdT10LmlzSnNvblZhbHVlP3IuYmFzZTY0LmRlY29kZShzW2ldKTpzW2ldO25bZV09dC50b1R5cGUodSl9fWVsc2Uic3RhdHVzQ29kZSI9PT10LmxvY2F0aW9uJiYobltlXT1wYXJzZUludChvLnN0YXR1c0NvZGUsMTApKX0pKSxlLmRhdGE9bn0sZ2VuZXJhdGVVUkk6aX19LHsiLi4vdXRpbCI6NzQsIi4vaGVscGVycyI6NDd9XSw1MTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKSxvPWUoIi4vcmVzdCIpLGk9ZSgiLi9qc29uIikscz1lKCIuLi9qc29uL2J1aWxkZXIiKSxhPWUoIi4uL2pzb24vcGFyc2VyIiksYz1bIkdFVCIsIkhFQUQiLCJERUxFVEUiXTtmdW5jdGlvbiB1KGUsdCl7aWYoIWUuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1UeXBlIl0pe3ZhciBuPXQ/ImJpbmFyeS9vY3RldC1zdHJlYW0iOiJhcHBsaWNhdGlvbi9qc29uIjtlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdPW59fXQuZXhwb3J0cz17YnVpbGRSZXF1ZXN0OmZ1bmN0aW9uKGUpe28uYnVpbGRSZXF1ZXN0KGUpLGMuaW5kZXhPZihlLmh0dHBSZXF1ZXN0Lm1ldGhvZCk8MCYmZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IHMsbj1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLmlucHV0O2lmKG4ucGF5bG9hZCl7dmFyIHIsbz1uLm1lbWJlcnNbbi5wYXlsb2FkXTtyPWUucGFyYW1zW24ucGF5bG9hZF0sInN0cnVjdHVyZSI9PT1vLnR5cGU/KGUuaHR0cFJlcXVlc3QuYm9keT10LmJ1aWxkKHJ8fHt9LG8pLHUoZSkpOnZvaWQgMCE9PXImJihlLmh0dHBSZXF1ZXN0LmJvZHk9ciwoImJpbmFyeSI9PT1vLnR5cGV8fG8uaXNTdHJlYW1pbmcpJiZ1KGUsITApKX1lbHNlIGUuaHR0cFJlcXVlc3QuYm9keT10LmJ1aWxkKGUucGFyYW1zLG4pLHUoZSl9KGUpfSxleHRyYWN0RXJyb3I6ZnVuY3Rpb24oZSl7aS5leHRyYWN0RXJyb3IoZSl9LGV4dHJhY3REYXRhOmZ1bmN0aW9uKGUpe28uZXh0cmFjdERhdGEoZSk7dmFyIHQ9ZS5yZXF1ZXN0LG49dC5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW3Qub3BlcmF0aW9uXSxzPXQuc2VydmljZS5hcGkub3BlcmF0aW9uc1t0Lm9wZXJhdGlvbl0ub3V0cHV0fHx7fTtpZihuLmhhc0V2ZW50T3V0cHV0LHMucGF5bG9hZCl7dmFyIGM9cy5tZW1iZXJzW3MucGF5bG9hZF0sdT1lLmh0dHBSZXNwb25zZS5ib2R5O2lmKGMuaXNFdmVudFN0cmVhbSlsPW5ldyBhLGUuZGF0YVtwYXlsb2FkXT1yLmNyZWF0ZUV2ZW50U3RyZWFtKDI9PT1BV1MuSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbj9lLmh0dHBSZXNwb25zZS5zdHJlYW06dSxsLGMpO2Vsc2UgaWYoInN0cnVjdHVyZSI9PT1jLnR5cGV8fCJsaXN0Ij09PWMudHlwZSl7dmFyIGw9bmV3IGE7ZS5kYXRhW3MucGF5bG9hZF09bC5wYXJzZSh1LGMpfWVsc2UiYmluYXJ5Ij09PWMudHlwZXx8Yy5pc1N0cmVhbWluZz9lLmRhdGFbcy5wYXlsb2FkXT11OmUuZGF0YVtzLnBheWxvYWRdPWMudG9UeXBlKHUpfWVsc2V7dmFyIHA9ZS5kYXRhO2kuZXh0cmFjdERhdGEoZSksZS5kYXRhPXIubWVyZ2UocCxlLmRhdGEpfX0sdW5zZXRDb250ZW50TGVuZ3RoOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PXIuZ2V0UmVxdWVzdFBheWxvYWRTaGFwZShlKSYmYy5pbmRleE9mKGUuaHR0cFJlcXVlc3QubWV0aG9kKT49MCYmZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1MZW5ndGgiXX19fSx7Ii4uL2pzb24vYnVpbGRlciI6MzcsIi4uL2pzb24vcGFyc2VyIjozOCwiLi4vdXRpbCI6NzQsIi4vanNvbiI6NDgsIi4vcmVzdCI6NTB9XSw1MjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uL3V0aWwiKSxpPWUoIi4vcmVzdCIpO3QuZXhwb3J0cz17YnVpbGRSZXF1ZXN0OmZ1bmN0aW9uKGUpe2kuYnVpbGRSZXF1ZXN0KGUpLFsiR0VUIiwiSEVBRCJdLmluZGV4T2YoZS5odHRwUmVxdWVzdC5tZXRob2QpPDAmJmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0uaW5wdXQsbj1uZXcgci5YTUwuQnVpbGRlcixpPWUucGFyYW1zLHM9dC5wYXlsb2FkO2lmKHMpe3ZhciBhPXQubWVtYmVyc1tzXTtpZih2b2lkIDA9PT0oaT1pW3NdKSlyZXR1cm47aWYoInN0cnVjdHVyZSI9PT1hLnR5cGUpe3ZhciBjPWEubmFtZTtlLmh0dHBSZXF1ZXN0LmJvZHk9bi50b1hNTChpLGEsYywhMCl9ZWxzZSBlLmh0dHBSZXF1ZXN0LmJvZHk9aX1lbHNlIGUuaHR0cFJlcXVlc3QuYm9keT1uLnRvWE1MKGksdCx0Lm5hbWV8fHQuc2hhcGV8fG8uc3RyaW5nLnVwcGVyRmlyc3QoZS5vcGVyYXRpb24pKyJSZXF1ZXN0Iil9KGUpfSxleHRyYWN0RXJyb3I6ZnVuY3Rpb24oZSl7dmFyIHQ7aS5leHRyYWN0RXJyb3IoZSk7dHJ5e3Q9KG5ldyByLlhNTC5QYXJzZXIpLnBhcnNlKGUuaHR0cFJlc3BvbnNlLmJvZHkudG9TdHJpbmcoKSl9Y2F0Y2gobil7dD17Q29kZTplLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlLE1lc3NhZ2U6ZS5odHRwUmVzcG9uc2Uuc3RhdHVzTWVzc2FnZX19dC5FcnJvcnMmJih0PXQuRXJyb3JzKSx0LkVycm9yJiYodD10LkVycm9yKSx0LkNvZGU/ZS5lcnJvcj1vLmVycm9yKG5ldyBFcnJvcix7Y29kZTp0LkNvZGUsbWVzc2FnZTp0Lk1lc3NhZ2V9KTplLmVycm9yPW8uZXJyb3IobmV3IEVycm9yLHtjb2RlOmUuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUsbWVzc2FnZTpudWxsfSl9LGV4dHJhY3REYXRhOmZ1bmN0aW9uKGUpe3ZhciB0O2kuZXh0cmFjdERhdGEoZSk7dmFyIG49ZS5yZXF1ZXN0LHM9ZS5odHRwUmVzcG9uc2UuYm9keSxhPW4uc2VydmljZS5hcGkub3BlcmF0aW9uc1tuLm9wZXJhdGlvbl0sYz1hLm91dHB1dCx1PShhLmhhc0V2ZW50T3V0cHV0LGMucGF5bG9hZCk7aWYodSl7dmFyIGw9Yy5tZW1iZXJzW3VdO2wuaXNFdmVudFN0cmVhbT8odD1uZXcgci5YTUwuUGFyc2VyLGUuZGF0YVt1XT1vLmNyZWF0ZUV2ZW50U3RyZWFtKDI9PT1yLkh0dHBDbGllbnQuc3RyZWFtc0FwaVZlcnNpb24/ZS5odHRwUmVzcG9uc2Uuc3RyZWFtOmUuaHR0cFJlc3BvbnNlLmJvZHksdCxsKSk6InN0cnVjdHVyZSI9PT1sLnR5cGU/KHQ9bmV3IHIuWE1MLlBhcnNlcixlLmRhdGFbdV09dC5wYXJzZShzLnRvU3RyaW5nKCksbCkpOiJiaW5hcnkiPT09bC50eXBlfHxsLmlzU3RyZWFtaW5nP2UuZGF0YVt1XT1zOmUuZGF0YVt1XT1sLnRvVHlwZShzKX1lbHNlIGlmKHMubGVuZ3RoPjApe3ZhciBwPSh0PW5ldyByLlhNTC5QYXJzZXIpLnBhcnNlKHMudG9TdHJpbmcoKSxjKTtvLnVwZGF0ZShlLmRhdGEscCl9fX19LHsiLi4vY29yZSI6MTksIi4uL3V0aWwiOjc0LCIuL3Jlc3QiOjUwfV0sNTM6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIik7ZnVuY3Rpb24gbygpe31mdW5jdGlvbiBpKGUpe3JldHVybiBlLmlzUXVlcnlOYW1lfHwiZWMyIiE9PWUuYXBpLnByb3RvY29sP2UubmFtZTplLm5hbWVbMF0udG9VcHBlckNhc2UoKStlLm5hbWUuc3Vic3RyKDEpfWZ1bmN0aW9uIHMoZSx0LG4sbyl7ci5lYWNoKG4ubWVtYmVycywoZnVuY3Rpb24obixyKXt2YXIgcz10W25dO2lmKG51bGwhPXMpe3ZhciBjPWkocik7YShjPWU/ZSsiLiIrYzpjLHMscixvKX19KSl9ZnVuY3Rpb24gYShlLHQsbixvKXtudWxsIT10JiYoInN0cnVjdHVyZSI9PT1uLnR5cGU/cyhlLHQsbixvKToibGlzdCI9PT1uLnR5cGU/ZnVuY3Rpb24oZSx0LG4sbyl7dmFyIHM9bi5tZW1iZXJ8fHt9OzAhPT10Lmxlbmd0aD9yLmFycmF5RWFjaCh0LChmdW5jdGlvbih0LHIpe3ZhciBjPSIuIisocisxKTtpZigiZWMyIj09PW4uYXBpLnByb3RvY29sKWMrPSIiO2Vsc2UgaWYobi5mbGF0dGVuZWQpe2lmKHMubmFtZSl7dmFyIHU9ZS5zcGxpdCgiLiIpO3UucG9wKCksdS5wdXNoKGkocykpLGU9dS5qb2luKCIuIil9fWVsc2UgYz0iLiIrKHMubmFtZT9zLm5hbWU6Im1lbWJlciIpK2M7YShlK2MsdCxzLG8pfSkpOm8uY2FsbCh0aGlzLGUsbnVsbCl9KGUsdCxuLG8pOiJtYXAiPT09bi50eXBlP2Z1bmN0aW9uKGUsdCxuLG8pe3ZhciBpPTE7ci5lYWNoKHQsKGZ1bmN0aW9uKHQscil7dmFyIHM9KG4uZmxhdHRlbmVkPyIuIjoiLmVudHJ5LiIpK2krKysiLiIsYz1zKyhuLmtleS5uYW1lfHwia2V5IiksdT1zKyhuLnZhbHVlLm5hbWV8fCJ2YWx1ZSIpO2EoZStjLHQsbi5rZXksbyksYShlK3UscixuLnZhbHVlLG8pfSkpfShlLHQsbixvKTpvKGUsbi50b1dpcmVGb3JtYXQodCkudG9TdHJpbmcoKSkpfW8ucHJvdG90eXBlLnNlcmlhbGl6ZT1mdW5jdGlvbihlLHQsbil7cygiIixlLHQsbil9LHQuZXhwb3J0cz1vfSx7Ii4uL3V0aWwiOjc0fV0sNTQ6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e25vdzpmdW5jdGlvbigpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgcGVyZm9ybWFuY2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2Uubm93KCk6RGF0ZS5ub3coKX19fSx7fV0sNTU6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e2lzRmlwc1JlZ2lvbjpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJihlLnN0YXJ0c1dpdGgoImZpcHMtIil8fGUuZW5kc1dpdGgoIi1maXBzIikpfSxpc0dsb2JhbFJlZ2lvbjpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJlsiYXdzLWdsb2JhbCIsImF3cy11cy1nb3YtZ2xvYmFsIl0uaW5jbHVkZXMoZSl9LGdldFJlYWxSZWdpb246ZnVuY3Rpb24oZSl7cmV0dXJuWyJmaXBzLWF3cy1nbG9iYWwiLCJhd3MtZmlwcyIsImF3cy1nbG9iYWwiXS5pbmNsdWRlcyhlKT8idXMtZWFzdC0xIjpbImZpcHMtYXdzLXVzLWdvdi1nbG9iYWwiLCJhd3MtdXMtZ292LWdsb2JhbCJdLmluY2x1ZGVzKGUpPyJ1cy1nb3Ytd2VzdC0xIjplLnJlcGxhY2UoL2ZpcHMtKGRrci18cHJvZC0pP3wtZmlwcy8sIiIpfX19LHt9XSw1NjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vdXRpbCIpLG89ZSgiLi9yZWdpb25fY29uZmlnX2RhdGEuanNvbiIpO2Z1bmN0aW9uIGkoZSx0KXtyLmVhY2godCwoZnVuY3Rpb24odCxuKXsiZ2xvYmFsRW5kcG9pbnQiIT09dCYmKHZvaWQgMCE9PWUuY29uZmlnW3RdJiZudWxsIT09ZS5jb25maWdbdF18fChlLmNvbmZpZ1t0XT1uKSl9KSl9dC5leHBvcnRzPXtjb25maWd1cmVFbmRwb2ludDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWcucmVnaW9uLG49ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuIG51bGw7dmFyIHQ9ZS5zcGxpdCgiLSIpO3JldHVybiB0Lmxlbmd0aDwzP251bGw6dC5zbGljZSgwLHQubGVuZ3RoLTIpLmpvaW4oIi0iKSsiLSoifSh0KSxyPWUuYXBpLmVuZHBvaW50UHJlZml4O3JldHVybltbdCxyXSxbbixyXSxbdCwiKiJdLFtuLCIqIl0sWyIqIixyXSxbdCwiaW50ZXJuYWwtKiJdLFsiKiIsIioiXV0ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZVswXSYmZVsxXT9lLmpvaW4oIi8iKTpudWxsfSkpfShlKSxuPWUuY29uZmlnLnVzZUZpcHNFbmRwb2ludCxyPWUuY29uZmlnLnVzZUR1YWxzdGFja0VuZHBvaW50LHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIGE9dFtzXTtpZihhKXt2YXIgYz1uP3I/by5kdWFsc3RhY2tGaXBzUnVsZXM6by5maXBzUnVsZXM6cj9vLmR1YWxzdGFja1J1bGVzOm8ucnVsZXM7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSkpe3ZhciB1PWNbYV07InN0cmluZyI9PXR5cGVvZiB1JiYodT1vLnBhdHRlcm5zW3VdKSxlLmlzR2xvYmFsRW5kcG9pbnQ9ISF1Lmdsb2JhbEVuZHBvaW50LHUuc2lnbmluZ1JlZ2lvbiYmKGUuc2lnbmluZ1JlZ2lvbj11LnNpZ25pbmdSZWdpb24pLHUuc2lnbmF0dXJlVmVyc2lvbnx8KHUuc2lnbmF0dXJlVmVyc2lvbj0idjQiKTt2YXIgbD0iYmVhcmVyIj09PShlLmFwaSYmZS5hcGkuc2lnbmF0dXJlVmVyc2lvbik7cmV0dXJuIHZvaWQgaShlLE9iamVjdC5hc3NpZ24oe30sdSx7c2lnbmF0dXJlVmVyc2lvbjpsPyJiZWFyZXIiOnUuc2lnbmF0dXJlVmVyc2lvbn0pKX19fX0sZ2V0RW5kcG9pbnRTdWZmaXg6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXsiXih1c3xldXxhcHxzYXxjYXxtZSlcXC1cXHcrXFwtXFxkKyQiOiJhbWF6b25hd3MuY29tIiwiXmNuXFwtXFx3K1xcLVxcZCskIjoiYW1hem9uYXdzLmNvbS5jbiIsIl51c1xcLWdvdlxcLVxcdytcXC1cXGQrJCI6ImFtYXpvbmF3cy5jb20iLCJedXNcXC1pc29cXC1cXHcrXFwtXFxkKyQiOiJjMnMuaWMuZ292IiwiXnVzXFwtaXNvYlxcLVxcdytcXC1cXGQrJCI6InNjMnMuc2dvdi5nb3YifSxuPU9iamVjdC5rZXlzKHQpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89UmVnRXhwKG5bcl0pLGk9dFtuW3JdXTtpZihvLnRlc3QoZSkpcmV0dXJuIGl9cmV0dXJuImFtYXpvbmF3cy5jb20ifX19LHsiLi9yZWdpb25fY29uZmlnX2RhdGEuanNvbiI6NTcsIi4vdXRpbCI6NzR9XSw1NzpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17cnVsZXM6eyIqLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFtYXpvbmF3cy5jb20ifSwiY24tKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hbWF6b25hd3MuY29tLmNuIn0sInVzLWlzby0qLyoiOiJ1c0lzbyIsInVzLWlzb2ItKi8qIjoidXNJc29iIiwiKi9idWRnZXRzIjoiZ2xvYmFsU1NMIiwiKi9jbG91ZGZyb250IjoiZ2xvYmFsU1NMIiwiKi9zdHMiOiJnbG9iYWxTU0wiLCIqL2ltcG9ydGV4cG9ydCI6e2VuZHBvaW50OiJ7c2VydmljZX0uYW1hem9uYXdzLmNvbSIsc2lnbmF0dXJlVmVyc2lvbjoidjIiLGdsb2JhbEVuZHBvaW50OiEwfSwiKi9yb3V0ZTUzIjoiZ2xvYmFsU1NMIiwiY24tKi9yb3V0ZTUzIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5hbWF6b25hd3MuY29tLmNuIixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJjbi1ub3J0aHdlc3QtMSJ9LCJ1cy1nb3YtKi9yb3V0ZTUzIjoiZ2xvYmFsR292Q2xvdWQiLCJ1cy1pc28tKi9yb3V0ZTUzIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5jMnMuaWMuZ292IixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJ1cy1pc28tZWFzdC0xIn0sInVzLWlzb2ItKi9yb3V0ZTUzIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5zYzJzLnNnb3YuZ292IixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJ1cy1pc29iLWVhc3QtMSJ9LCIqL3dhZiI6Imdsb2JhbFNTTCIsIiovaWFtIjoiZ2xvYmFsU1NMIiwiY24tKi9pYW0iOntlbmRwb2ludDoie3NlcnZpY2V9LmNuLW5vcnRoLTEuYW1hem9uYXdzLmNvbS5jbiIsZ2xvYmFsRW5kcG9pbnQ6ITAsc2lnbmluZ1JlZ2lvbjoiY24tbm9ydGgtMSJ9LCJ1cy1pc28tKi9pYW0iOntlbmRwb2ludDoie3NlcnZpY2V9LnVzLWlzby1lYXN0LTEuYzJzLmljLmdvdiIsZ2xvYmFsRW5kcG9pbnQ6ITAsc2lnbmluZ1JlZ2lvbjoidXMtaXNvLWVhc3QtMSJ9LCJ1cy1nb3YtKi9pYW0iOiJnbG9iYWxHb3ZDbG91ZCIsIiovY2UiOntlbmRwb2ludDoie3NlcnZpY2V9LnVzLWVhc3QtMS5hbWF6b25hd3MuY29tIixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJ1cy1lYXN0LTEifSwiY24tKi9jZSI6e2VuZHBvaW50OiJ7c2VydmljZX0uY24tbm9ydGh3ZXN0LTEuYW1hem9uYXdzLmNvbS5jbiIsZ2xvYmFsRW5kcG9pbnQ6ITAsc2lnbmluZ1JlZ2lvbjoiY24tbm9ydGh3ZXN0LTEifSwidXMtZ292LSovc3RzIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sInVzLWdvdi13ZXN0LTEvczMiOiJzM3NpZ25hdHVyZSIsInVzLXdlc3QtMS9zMyI6InMzc2lnbmF0dXJlIiwidXMtd2VzdC0yL3MzIjoiczNzaWduYXR1cmUiLCJldS13ZXN0LTEvczMiOiJzM3NpZ25hdHVyZSIsImFwLXNvdXRoZWFzdC0xL3MzIjoiczNzaWduYXR1cmUiLCJhcC1zb3V0aGVhc3QtMi9zMyI6InMzc2lnbmF0dXJlIiwiYXAtbm9ydGhlYXN0LTEvczMiOiJzM3NpZ25hdHVyZSIsInNhLWVhc3QtMS9zMyI6InMzc2lnbmF0dXJlIiwidXMtZWFzdC0xL3MzIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5hbWF6b25hd3MuY29tIixzaWduYXR1cmVWZXJzaW9uOiJzMyJ9LCJ1cy1lYXN0LTEvc2RiIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5hbWF6b25hd3MuY29tIixzaWduYXR1cmVWZXJzaW9uOiJ2MiJ9LCIqL3NkYiI6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSIsc2lnbmF0dXJlVmVyc2lvbjoidjIifSwiKi9yZXNvdXJjZS1leHBsb3Jlci0yIjoiZHVhbHN0YWNrQnlEZWZhdWx0IiwiKi9rZW5kcmEtcmFua2luZyI6ImR1YWxzdGFja0J5RGVmYXVsdCIsIiovaW50ZXJuZXRtb25pdG9yIjoiZHVhbHN0YWNrQnlEZWZhdWx0IiwiKi9jb2RlY2F0YWx5c3QiOiJnbG9iYWxEdWFsc3RhY2tCeURlZmF1bHQifSxmaXBzUnVsZXM6eyIqLyoiOiJmaXBzU3RhbmRhcmQiLCJ1cy1nb3YtKi8qIjoiZmlwc1N0YW5kYXJkIiwidXMtaXNvLSovKiI6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy57cmVnaW9ufS5jMnMuaWMuZ292In0sInVzLWlzby0qL2RtcyI6InVzSXNvIiwidXMtaXNvYi0qLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMue3JlZ2lvbn0uc2Mycy5zZ292LmdvdiJ9LCJ1cy1pc29iLSovZG1zIjoidXNJc29iIiwiY24tKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLntyZWdpb259LmFtYXpvbmF3cy5jb20uY24ifSwiKi9hcGkuZWNyIjoiZmlwcy5hcGkuZWNyIiwiKi9hcGkuc2FnZW1ha2VyIjoiZmlwcy5hcGkuc2FnZW1ha2VyIiwiKi9iYXRjaCI6ImZpcHNEb3RQcmVmaXgiLCIqL2VrcyI6ImZpcHNEb3RQcmVmaXgiLCIqL21vZGVscy5sZXgiOiJmaXBzLm1vZGVscy5sZXgiLCIqL3J1bnRpbWUubGV4IjoiZmlwcy5ydW50aW1lLmxleCIsIiovcnVudGltZS5zYWdlbWFrZXIiOntlbmRwb2ludDoicnVudGltZS1maXBzLnNhZ2VtYWtlci57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sIiovaWFtIjoiZmlwc1dpdGhvdXRSZWdpb24iLCIqL3JvdXRlNTMiOiJmaXBzV2l0aG91dFJlZ2lvbiIsIiovdHJhbnNjcmliZSI6ImZpcHNEb3RQcmVmaXgiLCIqL3dhZiI6ImZpcHNXaXRob3V0UmVnaW9uIiwidXMtZ292LSovdHJhbnNjcmliZSI6ImZpcHNEb3RQcmVmaXgiLCJ1cy1nb3YtKi9hcGkuZWNyIjoiZmlwcy5hcGkuZWNyIiwidXMtZ292LSovYXBpLnNhZ2VtYWtlciI6ImZpcHMuYXBpLnNhZ2VtYWtlciIsInVzLWdvdi0qL21vZGVscy5sZXgiOiJmaXBzLm1vZGVscy5sZXgiLCJ1cy1nb3YtKi9ydW50aW1lLmxleCI6ImZpcHMucnVudGltZS5sZXgiLCJ1cy1nb3YtKi9hY20tcGNhIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2JhdGNoIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2Nsb3VkZm9ybWF0aW9uIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2NvbmZpZyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9la3MiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovZWxhc3RpY21hcHJlZHVjZSI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9pZGVudGl0eXN0b3JlIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2R5bmFtb2RiIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2VsYXN0aWNsb2FkYmFsYW5jaW5nIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2d1YXJkZHV0eSI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9tb25pdG9yaW5nIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL3Jlc291cmNlLWdyb3VwcyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9ydW50aW1lLnNhZ2VtYWtlciI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9zZXJ2aWNlY2F0YWxvZy1hcHByZWdpc3RyeSI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9zZXJ2aWNlcXVvdGFzIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL3NzbSI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9zdHMiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovc3VwcG9ydCI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3Ytd2VzdC0xL3N0YXRlcyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1pc28tZWFzdC0xL2VsYXN0aWNmaWxlc3lzdGVtIjp7ZW5kcG9pbnQ6ImVsYXN0aWNmaWxlc3lzdGVtLWZpcHMue3JlZ2lvbn0uYzJzLmljLmdvdiJ9LCJ1cy1nb3Ytd2VzdC0xL29yZ2FuaXphdGlvbnMiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LXdlc3QtMS9yb3V0ZTUzIjp7ZW5kcG9pbnQ6InJvdXRlNTMudXMtZ292LmFtYXpvbmF3cy5jb20ifSwiKi9yZXNvdXJjZS1leHBsb3Jlci0yIjoiZmlwc0R1YWxzdGFja0J5RGVmYXVsdCIsIiova2VuZHJhLXJhbmtpbmciOiJkdWFsc3RhY2tCeURlZmF1bHQiLCIqL2ludGVybmV0bW9uaXRvciI6ImR1YWxzdGFja0J5RGVmYXVsdCIsIiovY29kZWNhdGFseXN0IjoiZmlwc0dsb2JhbER1YWxzdGFja0J5RGVmYXVsdCJ9LGR1YWxzdGFja1J1bGVzOnsiKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hcGkuYXdzIn0sImNuLSovKiI6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYXBpLmFtYXpvbndlYnNlcnZpY2VzLmNvbS5jbiJ9LCIqL3MzIjoiZHVhbHN0YWNrTGVnYWN5IiwiY24tKi9zMyI6ImR1YWxzdGFja0xlZ2FjeUNuIiwiKi9zMy1jb250cm9sIjoiZHVhbHN0YWNrTGVnYWN5IiwiY24tKi9zMy1jb250cm9sIjoiZHVhbHN0YWNrTGVnYWN5Q24iLCJhcC1zb3V0aC0xL2VjMiI6ImR1YWxzdGFja0xlZ2FjeUVjMiIsImV1LXdlc3QtMS9lYzIiOiJkdWFsc3RhY2tMZWdhY3lFYzIiLCJzYS1lYXN0LTEvZWMyIjoiZHVhbHN0YWNrTGVnYWN5RWMyIiwidXMtZWFzdC0xL2VjMiI6ImR1YWxzdGFja0xlZ2FjeUVjMiIsInVzLWVhc3QtMi9lYzIiOiJkdWFsc3RhY2tMZWdhY3lFYzIiLCJ1cy13ZXN0LTIvZWMyIjoiZHVhbHN0YWNrTGVnYWN5RWMyIn0sZHVhbHN0YWNrRmlwc1J1bGVzOnsiKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLntyZWdpb259LmFwaS5hd3MifSwiY24tKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLntyZWdpb259LmFwaS5hbWF6b253ZWJzZXJ2aWNlcy5jb20uY24ifSwiKi9zMyI6ImR1YWxzdGFja0ZpcHNMZWdhY3kiLCJjbi0qL3MzIjoiZHVhbHN0YWNrRmlwc0xlZ2FjeUNuIiwiKi9zMy1jb250cm9sIjoiZHVhbHN0YWNrRmlwc0xlZ2FjeSIsImNuLSovczMtY29udHJvbCI6ImR1YWxzdGFja0ZpcHNMZWdhY3lDbiJ9LHBhdHRlcm5zOntnbG9iYWxTU0w6e2VuZHBvaW50OiJodHRwczovL3tzZXJ2aWNlfS5hbWF6b25hd3MuY29tIixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJ1cy1lYXN0LTEifSxnbG9iYWxHb3ZDbG91ZDp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS51cy1nb3YuYW1hem9uYXdzLmNvbSIsZ2xvYmFsRW5kcG9pbnQ6ITAsc2lnbmluZ1JlZ2lvbjoidXMtZ292LXdlc3QtMSJ9LHMzc2lnbmF0dXJlOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFtYXpvbmF3cy5jb20iLHNpZ25hdHVyZVZlcnNpb246InMzIn0sdXNJc286e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYzJzLmljLmdvdiJ9LHVzSXNvYjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5zYzJzLnNnb3YuZ292In0sZmlwc1N0YW5kYXJkOntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LGZpcHNEb3RQcmVmaXg6e2VuZHBvaW50OiJmaXBzLntzZXJ2aWNlfS57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sZmlwc1dpdGhvdXRSZWdpb246e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy5hbWF6b25hd3MuY29tIn0sImZpcHMuYXBpLmVjciI6e2VuZHBvaW50OiJlY3ItZmlwcy57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sImZpcHMuYXBpLnNhZ2VtYWtlciI6e2VuZHBvaW50OiJhcGktZmlwcy5zYWdlbWFrZXIue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LCJmaXBzLm1vZGVscy5sZXgiOntlbmRwb2ludDoibW9kZWxzLWZpcHMubGV4LntyZWdpb259LmFtYXpvbmF3cy5jb20ifSwiZmlwcy5ydW50aW1lLmxleCI6e2VuZHBvaW50OiJydW50aW1lLWZpcHMubGV4LntyZWdpb259LmFtYXpvbmF3cy5jb20ifSxmaXBzV2l0aFNlcnZpY2VPbmx5OntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFtYXpvbmF3cy5jb20ifSxkdWFsc3RhY2tMZWdhY3k6e2VuZHBvaW50OiJ7c2VydmljZX0uZHVhbHN0YWNrLntyZWdpb259LmFtYXpvbmF3cy5jb20ifSxkdWFsc3RhY2tMZWdhY3lDbjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5kdWFsc3RhY2sue3JlZ2lvbn0uYW1hem9uYXdzLmNvbS5jbiJ9LGR1YWxzdGFja0ZpcHNMZWdhY3k6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy5kdWFsc3RhY2sue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LGR1YWxzdGFja0ZpcHNMZWdhY3lDbjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLmR1YWxzdGFjay57cmVnaW9ufS5hbWF6b25hd3MuY29tLmNuIn0sZHVhbHN0YWNrTGVnYWN5RWMyOntlbmRwb2ludDoiYXBpLmVjMi57cmVnaW9ufS5hd3MifSxkdWFsc3RhY2tCeURlZmF1bHQ6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYXBpLmF3cyJ9LGZpcHNEdWFsc3RhY2tCeURlZmF1bHQ6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy57cmVnaW9ufS5hcGkuYXdzIn0sZ2xvYmFsRHVhbHN0YWNrQnlEZWZhdWx0OntlbmRwb2ludDoie3NlcnZpY2V9Lmdsb2JhbC5hcGkuYXdzIn0sZmlwc0dsb2JhbER1YWxzdGFja0J5RGVmYXVsdDp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLmdsb2JhbC5hcGkuYXdzIn19fX0se31dLDU4OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKHQpeyhmdW5jdGlvbigpe3ZhciBuPWUoIi4vY29yZSIpLHI9ZSgiLi9zdGF0ZV9tYWNoaW5lIiksbz1uLnV0aWwuaW5oZXJpdCxpPW4udXRpbC5kb21haW4scz1lKCJqbWVzcGF0aCIpLGE9e3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9LGM9bmV3IHI7Yy5zZXR1cFN0YXRlcz1mdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztuLl9oYWx0SGFuZGxlcnNPbkVycm9yPSExLG4uZW1pdChuLl9hc20uY3VycmVudFN0YXRlLChmdW5jdGlvbihlKXtpZihlKWlmKHI9bixPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxyLl9hc20uY3VycmVudFN0YXRlKSl7aWYoIShpJiZuLmRvbWFpbiBpbnN0YW5jZW9mIGkuRG9tYWluKSl0aHJvdyBlO2UuZG9tYWluRW1pdHRlcj1uLGUuZG9tYWluPW4uZG9tYWluLGUuZG9tYWluVGhyb3duPSExLG4uZG9tYWluLmVtaXQoImVycm9yIixlKX1lbHNlIG4ucmVzcG9uc2UuZXJyb3I9ZSx0KGUpO2Vsc2UgdChuLnJlc3BvbnNlLmVycm9yKTt2YXIgcn0pKX07dGhpcy5hZGRTdGF0ZSgidmFsaWRhdGUiLCJidWlsZCIsImVycm9yIixlKSx0aGlzLmFkZFN0YXRlKCJidWlsZCIsImFmdGVyQnVpbGQiLCJyZXN0YXJ0IixlKSx0aGlzLmFkZFN0YXRlKCJhZnRlckJ1aWxkIiwic2lnbiIsInJlc3RhcnQiLGUpLHRoaXMuYWRkU3RhdGUoInNpZ24iLCJzZW5kIiwicmV0cnkiLGUpLHRoaXMuYWRkU3RhdGUoInJldHJ5IiwiYWZ0ZXJSZXRyeSIsImFmdGVyUmV0cnkiLGUpLHRoaXMuYWRkU3RhdGUoImFmdGVyUmV0cnkiLCJzaWduIiwiZXJyb3IiLGUpLHRoaXMuYWRkU3RhdGUoInNlbmQiLCJ2YWxpZGF0ZVJlc3BvbnNlIiwicmV0cnkiLGUpLHRoaXMuYWRkU3RhdGUoInZhbGlkYXRlUmVzcG9uc2UiLCJleHRyYWN0RGF0YSIsImV4dHJhY3RFcnJvciIsZSksdGhpcy5hZGRTdGF0ZSgiZXh0cmFjdEVycm9yIiwiZXh0cmFjdERhdGEiLCJyZXRyeSIsZSksdGhpcy5hZGRTdGF0ZSgiZXh0cmFjdERhdGEiLCJzdWNjZXNzIiwicmV0cnkiLGUpLHRoaXMuYWRkU3RhdGUoInJlc3RhcnQiLCJidWlsZCIsImVycm9yIixlKSx0aGlzLmFkZFN0YXRlKCJzdWNjZXNzIiwiY29tcGxldGUiLCJjb21wbGV0ZSIsZSksdGhpcy5hZGRTdGF0ZSgiZXJyb3IiLCJjb21wbGV0ZSIsImNvbXBsZXRlIixlKSx0aGlzLmFkZFN0YXRlKCJjb21wbGV0ZSIsbnVsbCxudWxsLGUpfSxjLnNldHVwU3RhdGVzKCksbi5SZXF1ZXN0PW8oe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCxvKXt2YXIgcz1lLmVuZHBvaW50LGE9ZS5jb25maWcucmVnaW9uLHU9ZS5jb25maWcuY3VzdG9tVXNlckFnZW50O2Uuc2lnbmluZ1JlZ2lvbj9hPWUuc2lnbmluZ1JlZ2lvbjplLmlzR2xvYmFsRW5kcG9pbnQmJihhPSJ1cy1lYXN0LTEiKSx0aGlzLmRvbWFpbj1pJiZpLmFjdGl2ZSx0aGlzLnNlcnZpY2U9ZSx0aGlzLm9wZXJhdGlvbj10LHRoaXMucGFyYW1zPW98fHt9LHRoaXMuaHR0cFJlcXVlc3Q9bmV3IG4uSHR0cFJlcXVlc3QocyxhKSx0aGlzLmh0dHBSZXF1ZXN0LmFwcGVuZFRvVXNlckFnZW50KHUpLHRoaXMuc3RhcnRUaW1lPWUuZ2V0U2tld0NvcnJlY3RlZERhdGUoKSx0aGlzLnJlc3BvbnNlPW5ldyBuLlJlc3BvbnNlKHRoaXMpLHRoaXMuX2FzbT1uZXcgcihjLnN0YXRlcywidmFsaWRhdGUiKSx0aGlzLl9oYWx0SGFuZGxlcnNPbkVycm9yPSExLG4uU2VxdWVudGlhbEV4ZWN1dG9yLmNhbGwodGhpcyksdGhpcy5lbWl0PXRoaXMuZW1pdEV2ZW50fSxzZW5kOmZ1bmN0aW9uKGUpe3JldHVybiBlJiYodGhpcy5odHRwUmVxdWVzdC5hcHBlbmRUb1VzZXJBZ2VudCgiY2FsbGJhY2siKSx0aGlzLm9uKCJjb21wbGV0ZSIsKGZ1bmN0aW9uKHQpe2UuY2FsbCh0LHQuZXJyb3IsdC5kYXRhKX0pKSksdGhpcy5ydW5UbygpLHRoaXMucmVzcG9uc2V9LGJ1aWxkOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJ1blRvKCJzZW5kIixlKX0scnVuVG86ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fYXNtLnJ1blRvKGUsdCx0aGlzKSx0aGlzfSxhYm9ydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygidmFsaWRhdGVSZXNwb25zZSIpLHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJleHRyYWN0RXJyb3IiKSx0aGlzLm9uKCJ2YWxpZGF0ZVJlc3BvbnNlIiwoZnVuY3Rpb24oZSl7ZS5lcnJvcj1uLnV0aWwuZXJyb3IobmV3IEVycm9yKCJSZXF1ZXN0IGFib3J0ZWQgYnkgdXNlciIpLHtjb2RlOiJSZXF1ZXN0QWJvcnRlZEVycm9yIixyZXRyeWFibGU6ITF9KX0pKSx0aGlzLmh0dHBSZXF1ZXN0LnN0cmVhbSYmIXRoaXMuaHR0cFJlcXVlc3Quc3RyZWFtLmRpZENhbGxiYWNrJiYodGhpcy5odHRwUmVxdWVzdC5zdHJlYW0uYWJvcnQoKSx0aGlzLmh0dHBSZXF1ZXN0Ll9hYm9ydENhbGxiYWNrP3RoaXMuaHR0cFJlcXVlc3QuX2Fib3J0Q2FsbGJhY2soKTp0aGlzLnJlbW92ZUFsbExpc3RlbmVycygic2VuZCIpKSx0aGlzfSxlYWNoUGFnZTpmdW5jdGlvbihlKXtlPW4udXRpbC5mbi5tYWtlQXN5bmMoZSwzKSx0aGlzLm9uKCJjb21wbGV0ZSIsKGZ1bmN0aW9uIHQocil7ZS5jYWxsKHIsci5lcnJvcixyLmRhdGEsKGZ1bmN0aW9uKG8peyExIT09byYmKHIuaGFzTmV4dFBhZ2UoKT9yLm5leHRQYWdlKCkub24oImNvbXBsZXRlIix0KS5zZW5kKCk6ZS5jYWxsKHIsbnVsbCxudWxsLG4udXRpbC5mbi5ub29wKSl9KSl9KSkuc2VuZCgpfSxlYWNoSXRlbTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMuZWFjaFBhZ2UoKGZ1bmN0aW9uKHIsbyl7aWYocilyZXR1cm4gZShyLG51bGwpO2lmKG51bGw9PT1vKXJldHVybiBlKG51bGwsbnVsbCk7dmFyIGk9dC5zZXJ2aWNlLnBhZ2luYXRpb25Db25maWcodC5vcGVyYXRpb24pLnJlc3VsdEtleTtBcnJheS5pc0FycmF5KGkpJiYoaT1pWzBdKTt2YXIgYT1zLnNlYXJjaChvLGkpLGM9ITA7cmV0dXJuIG4udXRpbC5hcnJheUVhY2goYSwoZnVuY3Rpb24odCl7aWYoITE9PT0oYz1lKG51bGwsdCkpKXJldHVybiBuLnV0aWwuYWJvcnR9KSksY30pKX0saXNQYWdlYWJsZTpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5zZXJ2aWNlLnBhZ2luYXRpb25Db25maWcodGhpcy5vcGVyYXRpb24pfSxjcmVhdGVSZWFkU3RyZWFtOmZ1bmN0aW9uKCl7dmFyIGU9bi51dGlsLnN0cmVhbSxyPXRoaXMsbz1udWxsO3JldHVybiAyPT09bi5IdHRwQ2xpZW50LnN0cmVhbXNBcGlWZXJzaW9uPyhvPW5ldyBlLlBhc3NUaHJvdWdoLHQubmV4dFRpY2soKGZ1bmN0aW9uKCl7ci5zZW5kKCl9KSkpOigobz1uZXcgZS5TdHJlYW0pLnJlYWRhYmxlPSEwLG8uc2VudD0hMSxvLm9uKCJuZXdMaXN0ZW5lciIsKGZ1bmN0aW9uKGUpe28uc2VudHx8ImRhdGEiIT09ZXx8KG8uc2VudD0hMCx0Lm5leHRUaWNrKChmdW5jdGlvbigpe3Iuc2VuZCgpfSkpKX0pKSksdGhpcy5vbigiZXJyb3IiLChmdW5jdGlvbihlKXtvLmVtaXQoImVycm9yIixlKX0pKSx0aGlzLm9uKCJodHRwSGVhZGVycyIsKGZ1bmN0aW9uKHQsaSxzKXtpZih0PDMwMCl7ci5yZW1vdmVMaXN0ZW5lcigiaHR0cERhdGEiLG4uRXZlbnRMaXN0ZW5lcnMuQ29yZS5IVFRQX0RBVEEpLHIucmVtb3ZlTGlzdGVuZXIoImh0dHBFcnJvciIsbi5FdmVudExpc3RlbmVycy5Db3JlLkhUVFBfRVJST1IpLHIub24oImh0dHBFcnJvciIsKGZ1bmN0aW9uKGUpe3MuZXJyb3I9ZSxzLmVycm9yLnJldHJ5YWJsZT0hMX0pKTt2YXIgYSxjPSExO2lmKCJIRUFEIiE9PXIuaHR0cFJlcXVlc3QubWV0aG9kJiYoYT1wYXJzZUludChpWyJjb250ZW50LWxlbmd0aCJdLDEwKSksdm9pZCAwIT09YSYmIWlzTmFOKGEpJiZhPj0wKXtjPSEwO3ZhciB1PTB9dmFyIGw9ZnVuY3Rpb24oKXtjJiZ1IT09YT9vLmVtaXQoImVycm9yIixuLnV0aWwuZXJyb3IobmV3IEVycm9yKCJTdHJlYW0gY29udGVudCBsZW5ndGggbWlzbWF0Y2guIFJlY2VpdmVkICIrdSsiIG9mICIrYSsiIGJ5dGVzLiIpLHtjb2RlOiJTdHJlYW1Db250ZW50TGVuZ3RoTWlzbWF0Y2gifSkpOjI9PT1uLkh0dHBDbGllbnQuc3RyZWFtc0FwaVZlcnNpb24/by5lbmQoKTpvLmVtaXQoImVuZCIpfSxwPXMuaHR0cFJlc3BvbnNlLmNyZWF0ZVVuYnVmZmVyZWRTdHJlYW0oKTtpZigyPT09bi5IdHRwQ2xpZW50LnN0cmVhbXNBcGlWZXJzaW9uKWlmKGMpe3ZhciBkPW5ldyBlLlBhc3NUaHJvdWdoO2QuX3dyaXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aCYmKHUrPXQubGVuZ3RoKSxlLlBhc3NUaHJvdWdoLnByb3RvdHlwZS5fd3JpdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxkLm9uKCJlbmQiLGwpLG8ub24oImVycm9yIiwoZnVuY3Rpb24oZSl7Yz0hMSxwLnVucGlwZShkKSxkLmVtaXQoImVuZCIpLGQuZW5kKCl9KSkscC5waXBlKGQpLnBpcGUobyx7ZW5kOiExfSl9ZWxzZSBwLnBpcGUobyk7ZWxzZSBjJiZwLm9uKCJkYXRhIiwoZnVuY3Rpb24oZSl7ZSYmZS5sZW5ndGgmJih1Kz1lLmxlbmd0aCl9KSkscC5vbigiZGF0YSIsKGZ1bmN0aW9uKGUpe28uZW1pdCgiZGF0YSIsZSl9KSkscC5vbigiZW5kIixsKTtwLm9uKCJlcnJvciIsKGZ1bmN0aW9uKGUpe2M9ITEsby5lbWl0KCJlcnJvciIsZSl9KSl9fSkpLG99LGVtaXRFdmVudDpmdW5jdGlvbihlLHQscil7ImZ1bmN0aW9uIj09dHlwZW9mIHQmJihyPXQsdD1udWxsKSxyfHwocj1mdW5jdGlvbigpe30pLHR8fCh0PXRoaXMuZXZlbnRQYXJhbWV0ZXJzKGUsdGhpcy5yZXNwb25zZSkpLG4uU2VxdWVudGlhbEV4ZWN1dG9yLnByb3RvdHlwZS5lbWl0LmNhbGwodGhpcyxlLHQsKGZ1bmN0aW9uKGUpe2UmJih0aGlzLnJlc3BvbnNlLmVycm9yPWUpLHIuY2FsbCh0aGlzLGUpfSkpfSxldmVudFBhcmFtZXRlcnM6ZnVuY3Rpb24oZSl7c3dpdGNoKGUpe2Nhc2UicmVzdGFydCI6Y2FzZSJ2YWxpZGF0ZSI6Y2FzZSJzaWduIjpjYXNlImJ1aWxkIjpjYXNlImFmdGVyVmFsaWRhdGUiOmNhc2UiYWZ0ZXJCdWlsZCI6cmV0dXJuW3RoaXNdO2Nhc2UiZXJyb3IiOnJldHVyblt0aGlzLnJlc3BvbnNlLmVycm9yLHRoaXMucmVzcG9uc2VdO2RlZmF1bHQ6cmV0dXJuW3RoaXMucmVzcG9uc2VdfX0scHJlc2lnbjpmdW5jdGlvbihlLHQpe3JldHVybiB0fHwiZnVuY3Rpb24iIT10eXBlb2YgZXx8KHQ9ZSxlPW51bGwpLChuZXcgbi5TaWduZXJzLlByZXNpZ24pLnNpZ24odGhpcy50b0dldCgpLGUsdCl9LGlzUHJlc2lnbmVkOmZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmh0dHBSZXF1ZXN0LmhlYWRlcnMsInByZXNpZ25lZC1leHBpcmVzIil9LHRvVW5hdXRoZW50aWNhdGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VuQXV0aGVudGljYXRlZD0hMCx0aGlzLnJlbW92ZUxpc3RlbmVyKCJ2YWxpZGF0ZSIsbi5FdmVudExpc3RlbmVycy5Db3JlLlZBTElEQVRFX0NSRURFTlRJQUxTKSx0aGlzLnJlbW92ZUxpc3RlbmVyKCJzaWduIixuLkV2ZW50TGlzdGVuZXJzLkNvcmUuU0lHTiksdGhpc30sdG9HZXQ6ZnVuY3Rpb24oKXtyZXR1cm4icXVlcnkiIT09dGhpcy5zZXJ2aWNlLmFwaS5wcm90b2NvbCYmImVjMiIhPT10aGlzLnNlcnZpY2UuYXBpLnByb3RvY29sfHwodGhpcy5yZW1vdmVMaXN0ZW5lcigiYnVpbGQiLHRoaXMuYnVpbGRBc0dldCksdGhpcy5hZGRMaXN0ZW5lcigiYnVpbGQiLHRoaXMuYnVpbGRBc0dldCkpLHRoaXN9LGJ1aWxkQXNHZXQ6ZnVuY3Rpb24oZSl7ZS5odHRwUmVxdWVzdC5tZXRob2Q9IkdFVCIsZS5odHRwUmVxdWVzdC5wYXRoPWUuc2VydmljZS5lbmRwb2ludC5wYXRoKyI/IitlLmh0dHBSZXF1ZXN0LmJvZHksZS5odHRwUmVxdWVzdC5ib2R5PSIiLGRlbGV0ZSBlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIkNvbnRlbnQtTGVuZ3RoIl0sZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1UeXBlIl19LGhhbHRIYW5kbGVyc09uRXJyb3I6ZnVuY3Rpb24oKXt0aGlzLl9oYWx0SGFuZGxlcnNPbkVycm9yPSEwfX0pLG4uUmVxdWVzdC5hZGRQcm9taXNlc1RvQ2xhc3M9ZnVuY3Rpb24oZSl7dGhpcy5wcm90b3R5cGUucHJvbWlzZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHRoaXMuaHR0cFJlcXVlc3QuYXBwZW5kVG9Vc2VyQWdlbnQoInByb21pc2UiKSxuZXcgZSgoZnVuY3Rpb24oZSxuKXt0Lm9uKCJjb21wbGV0ZSIsKGZ1bmN0aW9uKHQpe3QuZXJyb3I/bih0LmVycm9yKTplKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LmRhdGF8fHt9LCIkcmVzcG9uc2UiLHt2YWx1ZTp0fSkpfSkpLHQucnVuVG8oKX0pKX19LG4uUmVxdWVzdC5kZWxldGVQcm9taXNlc0Zyb21DbGFzcz1mdW5jdGlvbigpe2RlbGV0ZSB0aGlzLnByb3RvdHlwZS5wcm9taXNlfSxuLnV0aWwuYWRkUHJvbWlzZXMobi5SZXF1ZXN0KSxuLnV0aWwubWl4aW4obi5SZXF1ZXN0LG4uU2VxdWVudGlhbEV4ZWN1dG9yKX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHsiLi9jb3JlIjoxOSwiLi9zdGF0ZV9tYWNoaW5lIjo3MyxfcHJvY2Vzczo5MSxqbWVzcGF0aDo5MH1dLDU5OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdCxpPWUoImptZXNwYXRoIik7ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLnJlcXVlc3QuX3dhaXRlcixuPXQuY29uZmlnLmFjY2VwdG9ycyxyPSExLG89InJldHJ5IjtuLmZvckVhY2goKGZ1bmN0aW9uKG4pe2lmKCFyKXt2YXIgaT10Lm1hdGNoZXJzW24ubWF0Y2hlcl07aSYmaShlLG4uZXhwZWN0ZWQsbi5hcmd1bWVudCkmJihyPSEwLG89bi5zdGF0ZSl9fSkpLCFyJiZlLmVycm9yJiYobz0iZmFpbHVyZSIpLCJzdWNjZXNzIj09PW8/dC5zZXRTdWNjZXNzKGUpOnQuc2V0RXJyb3IoZSwicmV0cnkiPT09byl9ci5SZXNvdXJjZVdhaXRlcj1vKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLHQpe3RoaXMuc2VydmljZT1lLHRoaXMuc3RhdGU9dCx0aGlzLmxvYWRXYWl0ZXJDb25maWcodGhpcy5zdGF0ZSl9LHNlcnZpY2U6bnVsbCxzdGF0ZTpudWxsLGNvbmZpZzpudWxsLG1hdGNoZXJzOntwYXRoOmZ1bmN0aW9uKGUsdCxuKXt0cnl7dmFyIHI9aS5zZWFyY2goZS5kYXRhLG4pfWNhdGNoKGUpe3JldHVybiExfXJldHVybiBpLnN0cmljdERlZXBFcXVhbChyLHQpfSxwYXRoQWxsOmZ1bmN0aW9uKGUsdCxuKXt0cnl7dmFyIHI9aS5zZWFyY2goZS5kYXRhLG4pfWNhdGNoKGUpe3JldHVybiExfUFycmF5LmlzQXJyYXkocil8fChyPVtyXSk7dmFyIG89ci5sZW5ndGg7aWYoIW8pcmV0dXJuITE7Zm9yKHZhciBzPTA7czxvO3MrKylpZighaS5zdHJpY3REZWVwRXF1YWwocltzXSx0KSlyZXR1cm4hMTtyZXR1cm4hMH0scGF0aEFueTpmdW5jdGlvbihlLHQsbil7dHJ5e3ZhciByPWkuc2VhcmNoKGUuZGF0YSxuKX1jYXRjaChlKXtyZXR1cm4hMX1BcnJheS5pc0FycmF5KHIpfHwocj1bcl0pO2Zvcih2YXIgbz1yLmxlbmd0aCxzPTA7czxvO3MrKylpZihpLnN0cmljdERlZXBFcXVhbChyW3NdLHQpKXJldHVybiEwO3JldHVybiExfSxzdGF0dXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlO3JldHVybiJudW1iZXIiPT10eXBlb2YgbiYmbj09PXR9LGVycm9yOmZ1bmN0aW9uKGUsdCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiZlLmVycm9yP3Q9PT1lLmVycm9yLmNvZGU6dD09PSEhZS5lcnJvcn19LGxpc3RlbmVyczoobmV3IHIuU2VxdWVudGlhbEV4ZWN1dG9yKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24oZSl7ZSgiUkVUUllfQ0hFQ0siLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxdWVzdC5fd2FpdGVyO2UuZXJyb3ImJiJSZXNvdXJjZU5vdFJlYWR5Ij09PWUuZXJyb3IuY29kZSYmKGUuZXJyb3IucmV0cnlEZWxheT0xZTMqKHQuY29uZmlnLmRlbGF5fHwwKSl9KSksZSgiQ0hFQ0tfT1VUUFVUIiwiZXh0cmFjdERhdGEiLHMpLGUoIkNIRUNLX0VSUk9SIiwiZXh0cmFjdEVycm9yIixzKX0pKSx3YWl0OmZ1bmN0aW9uKGUsdCl7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJih0PWUsZT12b2lkIDApLGUmJmUuJHdhaXRlciYmKCJudW1iZXIiPT10eXBlb2YoZT1yLnV0aWwuY29weShlKSkuJHdhaXRlci5kZWxheSYmKHRoaXMuY29uZmlnLmRlbGF5PWUuJHdhaXRlci5kZWxheSksIm51bWJlciI9PXR5cGVvZiBlLiR3YWl0ZXIubWF4QXR0ZW1wdHMmJih0aGlzLmNvbmZpZy5tYXhBdHRlbXB0cz1lLiR3YWl0ZXIubWF4QXR0ZW1wdHMpLGRlbGV0ZSBlLiR3YWl0ZXIpO3ZhciBuPXRoaXMuc2VydmljZS5tYWtlUmVxdWVzdCh0aGlzLmNvbmZpZy5vcGVyYXRpb24sZSk7cmV0dXJuIG4uX3dhaXRlcj10aGlzLG4ucmVzcG9uc2UubWF4UmV0cmllcz10aGlzLmNvbmZpZy5tYXhBdHRlbXB0cyxuLmFkZExpc3RlbmVycyh0aGlzLmxpc3RlbmVycyksdCYmbi5zZW5kKHQpLG59LHNldFN1Y2Nlc3M6ZnVuY3Rpb24oZSl7ZS5lcnJvcj1udWxsLGUuZGF0YT1lLmRhdGF8fHt9LGUucmVxdWVzdC5yZW1vdmVBbGxMaXN0ZW5lcnMoImV4dHJhY3REYXRhIil9LHNldEVycm9yOmZ1bmN0aW9uKGUsdCl7ZS5kYXRhPW51bGwsZS5lcnJvcj1yLnV0aWwuZXJyb3IoZS5lcnJvcnx8bmV3IEVycm9yLHtjb2RlOiJSZXNvdXJjZU5vdFJlYWR5IixtZXNzYWdlOiJSZXNvdXJjZSBpcyBub3QgaW4gdGhlIHN0YXRlICIrdGhpcy5zdGF0ZSxyZXRyeWFibGU6dH0pfSxsb2FkV2FpdGVyQ29uZmlnOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLnNlcnZpY2UuYXBpLndhaXRlcnNbZV0pdGhyb3cgbmV3IHIudXRpbC5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IlN0YXRlTm90Rm91bmRFcnJvciIsbWVzc2FnZToiU3RhdGUgIitlKyIgbm90IGZvdW5kLiJ9KTt0aGlzLmNvbmZpZz1yLnV0aWwuY29weSh0aGlzLnNlcnZpY2UuYXBpLndhaXRlcnNbZV0pfX0pfSx7Ii4vY29yZSI6MTksam1lc3BhdGg6OTB9XSw2MDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQsaT1lKCJqbWVzcGF0aCIpO3IuUmVzcG9uc2U9byh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSl7dGhpcy5yZXF1ZXN0PWUsdGhpcy5kYXRhPW51bGwsdGhpcy5lcnJvcj1udWxsLHRoaXMucmV0cnlDb3VudD0wLHRoaXMucmVkaXJlY3RDb3VudD0wLHRoaXMuaHR0cFJlc3BvbnNlPW5ldyByLkh0dHBSZXNwb25zZSxlJiYodGhpcy5tYXhSZXRyaWVzPWUuc2VydmljZS5udW1SZXRyaWVzKCksdGhpcy5tYXhSZWRpcmVjdHM9ZS5zZXJ2aWNlLmNvbmZpZy5tYXhSZWRpcmVjdHMpfSxuZXh0UGFnZTpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXMucmVxdWVzdC5zZXJ2aWNlLG89dGhpcy5yZXF1ZXN0Lm9wZXJhdGlvbjt0cnl7dD1uLnBhZ2luYXRpb25Db25maWcobywhMCl9Y2F0Y2goZSl7dGhpcy5lcnJvcj1lfWlmKCF0aGlzLmhhc05leHRQYWdlKCkpe2lmKGUpZSh0aGlzLmVycm9yLG51bGwpO2Vsc2UgaWYodGhpcy5lcnJvcil0aHJvdyB0aGlzLmVycm9yO3JldHVybiBudWxsfXZhciBpPXIudXRpbC5jb3B5KHRoaXMucmVxdWVzdC5wYXJhbXMpO2lmKHRoaXMubmV4dFBhZ2VUb2tlbnMpe3ZhciBzPXQuaW5wdXRUb2tlbjsic3RyaW5nIj09dHlwZW9mIHMmJihzPVtzXSk7Zm9yKHZhciBhPTA7YTxzLmxlbmd0aDthKyspaVtzW2FdXT10aGlzLm5leHRQYWdlVG9rZW5zW2FdO3JldHVybiBuLm1ha2VSZXF1ZXN0KHRoaXMucmVxdWVzdC5vcGVyYXRpb24saSxlKX1yZXR1cm4gZT9lKG51bGwsbnVsbCk6bnVsbH0saGFzTmV4dFBhZ2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYWNoZU5leHRQYWdlVG9rZW5zKCksISF0aGlzLm5leHRQYWdlVG9rZW5zfHx2b2lkIDA9PT10aGlzLm5leHRQYWdlVG9rZW5zJiZ2b2lkIDB9LGNhY2hlTmV4dFBhZ2VUb2tlbnM6ZnVuY3Rpb24oKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcywibmV4dFBhZ2VUb2tlbnMiKSlyZXR1cm4gdGhpcy5uZXh0UGFnZVRva2Vuczt0aGlzLm5leHRQYWdlVG9rZW5zPXZvaWQgMDt2YXIgZT10aGlzLnJlcXVlc3Quc2VydmljZS5wYWdpbmF0aW9uQ29uZmlnKHRoaXMucmVxdWVzdC5vcGVyYXRpb24pO2lmKCFlKXJldHVybiB0aGlzLm5leHRQYWdlVG9rZW5zO2lmKHRoaXMubmV4dFBhZ2VUb2tlbnM9bnVsbCxlLm1vcmVSZXN1bHRzJiYhaS5zZWFyY2godGhpcy5kYXRhLGUubW9yZVJlc3VsdHMpKXJldHVybiB0aGlzLm5leHRQYWdlVG9rZW5zO3ZhciB0PWUub3V0cHV0VG9rZW47cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLHIudXRpbC5hcnJheUVhY2guY2FsbCh0aGlzLHQsKGZ1bmN0aW9uKGUpe3ZhciB0PWkuc2VhcmNoKHRoaXMuZGF0YSxlKTt0JiYodGhpcy5uZXh0UGFnZVRva2Vucz10aGlzLm5leHRQYWdlVG9rZW5zfHxbXSx0aGlzLm5leHRQYWdlVG9rZW5zLnB1c2godCkpfSkpLHRoaXMubmV4dFBhZ2VUb2tlbnN9fSl9LHsiLi9jb3JlIjoxOSxqbWVzcGF0aDo5MH1dLDYxOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9jb3JlIik7ci5TZXF1ZW50aWFsRXhlY3V0b3I9ci51dGlsLmluaGVyaXQoe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5fZXZlbnRzPXt9fSxsaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2V2ZW50c1tlXT90aGlzLl9ldmVudHNbZV0uc2xpY2UoMCk6W119LG9uOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5fZXZlbnRzW2VdP24/dGhpcy5fZXZlbnRzW2VdLnVuc2hpZnQodCk6dGhpcy5fZXZlbnRzW2VdLnB1c2godCk6dGhpcy5fZXZlbnRzW2VdPVt0XSx0aGlzfSxvbkFzeW5jOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdC5faXNBc3luYz0hMCx0aGlzLm9uKGUsdCxuKX0scmVtb3ZlTGlzdGVuZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9ldmVudHNbZV07aWYobil7Zm9yKHZhciByPW4ubGVuZ3RoLG89LTEsaT0wO2k8cjsrK2kpbltpXT09PXQmJihvPWkpO28+LTEmJm4uc3BsaWNlKG8sMSl9cmV0dXJuIHRoaXN9LHJlbW92ZUFsbExpc3RlbmVyczpmdW5jdGlvbihlKXtyZXR1cm4gZT9kZWxldGUgdGhpcy5fZXZlbnRzW2VdOnRoaXMuX2V2ZW50cz17fSx0aGlzfSxlbWl0OmZ1bmN0aW9uKGUsdCxuKXtufHwobj1mdW5jdGlvbigpe30pO3ZhciByPXRoaXMubGlzdGVuZXJzKGUpLG89ci5sZW5ndGg7cmV0dXJuIHRoaXMuY2FsbExpc3RlbmVycyhyLHQsbiksbz4wfSxjYWxsTGlzdGVuZXJzOmZ1bmN0aW9uKGUsdCxuLG8pe3ZhciBpPXRoaXMscz1vfHxudWxsO2Z1bmN0aW9uIGEobyl7aWYobyYmKHM9ci51dGlsLmVycm9yKHN8fG5ldyBFcnJvcixvKSxpLl9oYWx0SGFuZGxlcnNPbkVycm9yKSlyZXR1cm4gbi5jYWxsKGkscyk7aS5jYWxsTGlzdGVuZXJzKGUsdCxuLHMpfWZvcig7ZS5sZW5ndGg+MDspe3ZhciBjPWUuc2hpZnQoKTtpZihjLl9pc0FzeW5jKXJldHVybiB2b2lkIGMuYXBwbHkoaSx0LmNvbmNhdChbYV0pKTt0cnl7Yy5hcHBseShpLHQpfWNhdGNoKGUpe3M9ci51dGlsLmVycm9yKHN8fG5ldyBFcnJvcixlKX1pZihzJiZpLl9oYWx0SGFuZGxlcnNPbkVycm9yKXJldHVybiB2b2lkIG4uY2FsbChpLHMpfW4uY2FsbChpLHMpfSxhZGRMaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gZS5fZXZlbnRzJiYoZT1lLl9ldmVudHMpLHIudXRpbC5lYWNoKGUsKGZ1bmN0aW9uKGUsbil7ImZ1bmN0aW9uIj09dHlwZW9mIG4mJihuPVtuXSksci51dGlsLmFycmF5RWFjaChuLChmdW5jdGlvbihuKXt0Lm9uKGUsbil9KSl9KSksdH0sYWRkTmFtZWRMaXN0ZW5lcjpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpc1tlXT1uLHRoaXMuYWRkTGlzdGVuZXIodCxuLHIpLHRoaXN9LGFkZE5hbWVkQXN5bmNMaXN0ZW5lcjpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbi5faXNBc3luYz0hMCx0aGlzLmFkZE5hbWVkTGlzdGVuZXIoZSx0LG4scil9LGFkZE5hbWVkTGlzdGVuZXJzOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIGUoKGZ1bmN0aW9uKCl7dC5hZGROYW1lZExpc3RlbmVyLmFwcGx5KHQsYXJndW1lbnRzKX0pLChmdW5jdGlvbigpe3QuYWRkTmFtZWRBc3luY0xpc3RlbmVyLmFwcGx5KHQsYXJndW1lbnRzKX0pKSx0aGlzfX0pLHIuU2VxdWVudGlhbEV4ZWN1dG9yLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1yLlNlcXVlbnRpYWxFeGVjdXRvci5wcm90b3R5cGUub24sdC5leHBvcnRzPXIuU2VxdWVudGlhbEV4ZWN1dG9yfSx7Ii4vY29yZSI6MTl9XSw2MjpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbihuKXsoZnVuY3Rpb24oKXt2YXIgcj1lKCIuL2NvcmUiKSxvPWUoIi4vbW9kZWwvYXBpIiksaT1lKCIuL3JlZ2lvbl9jb25maWciKSxzPXIudXRpbC5pbmhlcml0LGE9MCxjPWUoIi4vcmVnaW9uL3V0aWxzIik7ci5TZXJ2aWNlPXMoe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLmxvYWRTZXJ2aWNlQ2xhc3MpdGhyb3cgci51dGlsLmVycm9yKG5ldyBFcnJvciwiU2VydmljZSBtdXN0IGJlIGNvbnN0cnVjdGVkIHdpdGggYG5ldycgb3BlcmF0b3IiKTtpZihlKXtpZihlLnJlZ2lvbil7dmFyIHQ9ZS5yZWdpb247Yy5pc0ZpcHNSZWdpb24odCkmJihlLnJlZ2lvbj1jLmdldFJlYWxSZWdpb24odCksZS51c2VGaXBzRW5kcG9pbnQ9ITApLGMuaXNHbG9iYWxSZWdpb24odCkmJihlLnJlZ2lvbj1jLmdldFJlYWxSZWdpb24odCkpfSJib29sZWFuIj09dHlwZW9mIGUudXNlRHVhbHN0YWNrJiYiYm9vbGVhbiIhPXR5cGVvZiBlLnVzZUR1YWxzdGFja0VuZHBvaW50JiYoZS51c2VEdWFsc3RhY2tFbmRwb2ludD1lLnVzZUR1YWxzdGFjayl9dmFyIG49dGhpcy5sb2FkU2VydmljZUNsYXNzKGV8fHt9KTtpZihuKXt2YXIgbz1yLnV0aWwuY29weShlKSxpPW5ldyBuKGUpO3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwiX29yaWdpbmFsQ29uZmlnIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG99LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksaS5fY2xpZW50SWQ9KythLGl9dGhpcy5pbml0aWFsaXplKGUpfSxpbml0aWFsaXplOmZ1bmN0aW9uKGUpe3ZhciB0PXIuY29uZmlnW3RoaXMuc2VydmljZUlkZW50aWZpZXJdO2lmKHRoaXMuY29uZmlnPW5ldyByLkNvbmZpZyhyLmNvbmZpZyksdCYmdGhpcy5jb25maWcudXBkYXRlKHQsITApLGUmJnRoaXMuY29uZmlnLnVwZGF0ZShlLCEwKSx0aGlzLnZhbGlkYXRlU2VydmljZSgpLHRoaXMuY29uZmlnLmVuZHBvaW50fHxpLmNvbmZpZ3VyZUVuZHBvaW50KHRoaXMpLHRoaXMuY29uZmlnLmVuZHBvaW50PXRoaXMuZW5kcG9pbnRGcm9tVGVtcGxhdGUodGhpcy5jb25maWcuZW5kcG9pbnQpLHRoaXMuc2V0RW5kcG9pbnQodGhpcy5jb25maWcuZW5kcG9pbnQpLHIuU2VxdWVudGlhbEV4ZWN1dG9yLmNhbGwodGhpcyksci5TZXJ2aWNlLmFkZERlZmF1bHRNb25pdG9yaW5nTGlzdGVuZXJzKHRoaXMpLCh0aGlzLmNvbmZpZy5jbGllbnRTaWRlTW9uaXRvcmluZ3x8ci5TZXJ2aWNlLl9jbGllbnRTaWRlTW9uaXRvcmluZykmJnRoaXMucHVibGlzaGVyKXt2YXIgbz10aGlzLnB1Ymxpc2hlcjt0aGlzLmFkZE5hbWVkTGlzdGVuZXIoIlBVQkxJU0hfQVBJX0NBTEwiLCJhcGlDYWxsIiwoZnVuY3Rpb24oZSl7bi5uZXh0VGljaygoZnVuY3Rpb24oKXtvLmV2ZW50SGFuZGxlcihlKX0pKX0pKSx0aGlzLmFkZE5hbWVkTGlzdGVuZXIoIlBVQkxJU0hfQVBJX0FUVEVNUFQiLCJhcGlDYWxsQXR0ZW1wdCIsKGZ1bmN0aW9uKGUpe24ubmV4dFRpY2soKGZ1bmN0aW9uKCl7by5ldmVudEhhbmRsZXIoZSl9KSl9KSl9fSx2YWxpZGF0ZVNlcnZpY2U6ZnVuY3Rpb24oKXt9LGxvYWRTZXJ2aWNlQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQ9ZTtpZihyLnV0aWwuaXNFbXB0eSh0aGlzLmFwaSkpe2lmKHQuYXBpQ29uZmlnKXJldHVybiByLlNlcnZpY2UuZGVmaW5lU2VydmljZUFwaSh0aGlzLmNvbnN0cnVjdG9yLHQuYXBpQ29uZmlnKTtpZih0aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VzKXsodD1uZXcgci5Db25maWcoci5jb25maWcpKS51cGRhdGUoZSwhMCk7dmFyIG49dC5hcGlWZXJzaW9uc1t0aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VJZGVudGlmaWVyXTtyZXR1cm4gbj1ufHx0LmFwaVZlcnNpb24sdGhpcy5nZXRMYXRlc3RTZXJ2aWNlQ2xhc3Mobil9cmV0dXJuIG51bGx9cmV0dXJuIG51bGx9LGdldExhdGVzdFNlcnZpY2VDbGFzczpmdW5jdGlvbihlKXtyZXR1cm4gZT10aGlzLmdldExhdGVzdFNlcnZpY2VWZXJzaW9uKGUpLG51bGw9PT10aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VzW2VdJiZyLlNlcnZpY2UuZGVmaW5lU2VydmljZUFwaSh0aGlzLmNvbnN0cnVjdG9yLGUpLHRoaXMuY29uc3RydWN0b3Iuc2VydmljZXNbZV19LGdldExhdGVzdFNlcnZpY2VWZXJzaW9uOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VzfHwwPT09dGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJObyBzZXJ2aWNlcyBkZWZpbmVkIG9uICIrdGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlSWRlbnRpZmllcik7aWYoZT9yLnV0aWwuaXNUeXBlKGUsRGF0ZSkmJihlPXIudXRpbC5kYXRlLmlzbzg2MDEoZSkuc3BsaXQoIlQiKVswXSk6ZT0ibGF0ZXN0IixPYmplY3QuaGFzT3duUHJvcGVydHkodGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlcyxlKSlyZXR1cm4gZTtmb3IodmFyIHQ9T2JqZWN0LmtleXModGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlcykuc29ydCgpLG49bnVsbCxvPXQubGVuZ3RoLTE7bz49MDtvLS0paWYoIioiIT09dFtvXVt0W29dLmxlbmd0aC0xXSYmKG49dFtvXSksdFtvXS5zdWJzdHIoMCwxMCk8PWUpcmV0dXJuIG47dGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgZmluZCAiK3RoaXMuY29uc3RydWN0b3Iuc2VydmljZUlkZW50aWZpZXIrIiBBUEkgdG8gc2F0aXNmeSB2ZXJzaW9uIGNvbnN0cmFpbnQgYCIrZSsiJyIpfSxhcGk6e30sZGVmYXVsdFJldHJ5Q291bnQ6MyxjdXN0b21pemVSZXF1ZXN0czpmdW5jdGlvbihlKXtpZihlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY2FsbGJhY2sgdHlwZSAnIit0eXBlb2YgZSsiJyBwcm92aWRlZCBpbiBjdXN0b21pemVSZXF1ZXN0cyIpO3RoaXMuY3VzdG9tUmVxdWVzdEhhbmRsZXI9ZX1lbHNlIHRoaXMuY3VzdG9tUmVxdWVzdEhhbmRsZXI9bnVsbH0sbWFrZVJlcXVlc3Q6ZnVuY3Rpb24oZSx0LG4pe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0JiYobj10LHQ9bnVsbCksdD10fHx7fSx0aGlzLmNvbmZpZy5wYXJhbXMpe3ZhciBvPXRoaXMuYXBpLm9wZXJhdGlvbnNbZV07byYmKHQ9ci51dGlsLmNvcHkodCksci51dGlsLmVhY2godGhpcy5jb25maWcucGFyYW1zLChmdW5jdGlvbihlLG4pe28uaW5wdXQubWVtYmVyc1tlXSYmKHZvaWQgMCE9PXRbZV0mJm51bGwhPT10W2VdfHwodFtlXT1uKSl9KSkpfXZhciBpPW5ldyByLlJlcXVlc3QodGhpcyxlLHQpO3JldHVybiB0aGlzLmFkZEFsbFJlcXVlc3RMaXN0ZW5lcnMoaSksdGhpcy5hdHRhY2hNb25pdG9yaW5nRW1pdHRlcihpKSxuJiZpLnNlbmQobiksaX0sbWFrZVVuYXV0aGVudGljYXRlZFJlcXVlc3Q6ZnVuY3Rpb24oZSx0LG4peyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYobj10LHQ9e30pO3ZhciByPXRoaXMubWFrZVJlcXVlc3QoZSx0KS50b1VuYXV0aGVudGljYXRlZCgpO3JldHVybiBuP3Iuc2VuZChuKTpyfSx3YWl0Rm9yOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbmV3IHIuUmVzb3VyY2VXYWl0ZXIodGhpcyxlKS53YWl0KHQsbil9LGFkZEFsbFJlcXVlc3RMaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtyLmV2ZW50cyxyLkV2ZW50TGlzdGVuZXJzLkNvcmUsdGhpcy5zZXJ2aWNlSW50ZXJmYWNlKCksci5FdmVudExpc3RlbmVycy5Db3JlUG9zdF0sbj0wO248dC5sZW5ndGg7bisrKXRbbl0mJmUuYWRkTGlzdGVuZXJzKHRbbl0pO3RoaXMuY29uZmlnLnBhcmFtVmFsaWRhdGlvbnx8ZS5yZW1vdmVMaXN0ZW5lcigidmFsaWRhdGUiLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZS5WQUxJREFURV9QQVJBTUVURVJTKSx0aGlzLmNvbmZpZy5sb2dnZXImJmUuYWRkTGlzdGVuZXJzKHIuRXZlbnRMaXN0ZW5lcnMuTG9nZ2VyKSx0aGlzLnNldHVwUmVxdWVzdExpc3RlbmVycyhlKSwiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY3VzdG9tUmVxdWVzdEhhbmRsZXImJnRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmN1c3RvbVJlcXVlc3RIYW5kbGVyKGUpLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLCJjdXN0b21SZXF1ZXN0SGFuZGxlciIpJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5jdXN0b21SZXF1ZXN0SGFuZGxlciYmdGhpcy5jdXN0b21SZXF1ZXN0SGFuZGxlcihlKX0sYXBpQ2FsbEV2ZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0sbj17VHlwZToiQXBpQ2FsbCIsQXBpOnQ/dC5uYW1lOmUub3BlcmF0aW9uLFZlcnNpb246MSxTZXJ2aWNlOmUuc2VydmljZS5hcGkuc2VydmljZUlkfHxlLnNlcnZpY2UuYXBpLmVuZHBvaW50UHJlZml4LFJlZ2lvbjplLmh0dHBSZXF1ZXN0LnJlZ2lvbixNYXhSZXRyaWVzRXhjZWVkZWQ6MCxVc2VyQWdlbnQ6ZS5odHRwUmVxdWVzdC5nZXRVc2VyQWdlbnQoKX0scj1lLnJlc3BvbnNlO2lmKHIuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUmJihuLkZpbmFsSHR0cFN0YXR1c0NvZGU9ci5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSksci5lcnJvcil7dmFyIG89ci5lcnJvcjtyLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlPjI5OT8oby5jb2RlJiYobi5GaW5hbEF3c0V4Y2VwdGlvbj1vLmNvZGUpLG8ubWVzc2FnZSYmKG4uRmluYWxBd3NFeGNlcHRpb25NZXNzYWdlPW8ubWVzc2FnZSkpOigoby5jb2RlfHxvLm5hbWUpJiYobi5GaW5hbFNka0V4Y2VwdGlvbj1vLmNvZGV8fG8ubmFtZSksby5tZXNzYWdlJiYobi5GaW5hbFNka0V4Y2VwdGlvbk1lc3NhZ2U9by5tZXNzYWdlKSl9cmV0dXJuIG59LGFwaUF0dGVtcHRFdmVudDpmdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLG49e1R5cGU6IkFwaUNhbGxBdHRlbXB0IixBcGk6dD90Lm5hbWU6ZS5vcGVyYXRpb24sVmVyc2lvbjoxLFNlcnZpY2U6ZS5zZXJ2aWNlLmFwaS5zZXJ2aWNlSWR8fGUuc2VydmljZS5hcGkuZW5kcG9pbnRQcmVmaXgsRnFkbjplLmh0dHBSZXF1ZXN0LmVuZHBvaW50Lmhvc3RuYW1lLFVzZXJBZ2VudDplLmh0dHBSZXF1ZXN0LmdldFVzZXJBZ2VudCgpfSxyPWUucmVzcG9uc2U7cmV0dXJuIHIuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUmJihuLkh0dHBTdGF0dXNDb2RlPXIuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUpLCFlLl91bkF1dGhlbnRpY2F0ZWQmJmUuc2VydmljZS5jb25maWcuY3JlZGVudGlhbHMmJmUuc2VydmljZS5jb25maWcuY3JlZGVudGlhbHMuYWNjZXNzS2V5SWQmJihuLkFjY2Vzc0tleT1lLnNlcnZpY2UuY29uZmlnLmNyZWRlbnRpYWxzLmFjY2Vzc0tleUlkKSxyLmh0dHBSZXNwb25zZS5oZWFkZXJzPyhlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIngtYW16LXNlY3VyaXR5LXRva2VuIl0mJihuLlNlc3Npb25Ub2tlbj1lLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIngtYW16LXNlY3VyaXR5LXRva2VuIl0pLHIuaHR0cFJlc3BvbnNlLmhlYWRlcnNbIngtYW16bi1yZXF1ZXN0aWQiXSYmKG4uWEFtem5SZXF1ZXN0SWQ9ci5odHRwUmVzcG9uc2UuaGVhZGVyc1sieC1hbXpuLXJlcXVlc3RpZCJdKSxyLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtei1yZXF1ZXN0LWlkIl0mJihuLlhBbXpSZXF1ZXN0SWQ9ci5odHRwUmVzcG9uc2UuaGVhZGVyc1sieC1hbXotcmVxdWVzdC1pZCJdKSxyLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtei1pZC0yIl0mJihuLlhBbXpJZDI9ci5odHRwUmVzcG9uc2UuaGVhZGVyc1sieC1hbXotaWQtMiJdKSxuKTpufSxhdHRlbXB0RmFpbEV2ZW50OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuYXBpQXR0ZW1wdEV2ZW50KGUpLG49ZS5yZXNwb25zZSxyPW4uZXJyb3I7cmV0dXJuIG4uaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGU+Mjk5PyhyLmNvZGUmJih0LkF3c0V4Y2VwdGlvbj1yLmNvZGUpLHIubWVzc2FnZSYmKHQuQXdzRXhjZXB0aW9uTWVzc2FnZT1yLm1lc3NhZ2UpKTooKHIuY29kZXx8ci5uYW1lKSYmKHQuU2RrRXhjZXB0aW9uPXIuY29kZXx8ci5uYW1lKSxyLm1lc3NhZ2UmJih0LlNka0V4Y2VwdGlvbk1lc3NhZ2U9ci5tZXNzYWdlKSksdH0sYXR0YWNoTW9uaXRvcmluZ0VtaXR0ZXI6ZnVuY3Rpb24oZSl7dmFyIHQsbixvLGkscyxhLGM9MCx1PXRoaXM7ZS5vbigidmFsaWRhdGUiLChmdW5jdGlvbigpe2k9ci51dGlsLnJlYWxDbG9jay5ub3coKSxhPURhdGUubm93KCl9KSwhMCksZS5vbigic2lnbiIsKGZ1bmN0aW9uKCl7bj1yLnV0aWwucmVhbENsb2NrLm5vdygpLHQ9RGF0ZS5ub3coKSxzPWUuaHR0cFJlcXVlc3QucmVnaW9uLGMrK30pLCEwKSxlLm9uKCJ2YWxpZGF0ZVJlc3BvbnNlIiwoZnVuY3Rpb24oKXtvPU1hdGgucm91bmQoci51dGlsLnJlYWxDbG9jay5ub3coKS1uKX0pKSxlLmFkZE5hbWVkTGlzdGVuZXIoIkFQSV9DQUxMX0FUVEVNUFQiLCJzdWNjZXNzIiwoZnVuY3Rpb24oKXt2YXIgbj11LmFwaUF0dGVtcHRFdmVudChlKTtuLlRpbWVzdGFtcD10LG4uQXR0ZW1wdExhdGVuY3k9bz49MD9vOjAsbi5SZWdpb249cyx1LmVtaXQoImFwaUNhbGxBdHRlbXB0Iixbbl0pfSkpLGUuYWRkTmFtZWRMaXN0ZW5lcigiQVBJX0NBTExfQVRURU1QVF9SRVRSWSIsInJldHJ5IiwoZnVuY3Rpb24oKXt2YXIgaT11LmF0dGVtcHRGYWlsRXZlbnQoZSk7aS5UaW1lc3RhbXA9dCxvPW98fE1hdGgucm91bmQoci51dGlsLnJlYWxDbG9jay5ub3coKS1uKSxpLkF0dGVtcHRMYXRlbmN5PW8+PTA/bzowLGkuUmVnaW9uPXMsdS5lbWl0KCJhcGlDYWxsQXR0ZW1wdCIsW2ldKX0pKSxlLmFkZE5hbWVkTGlzdGVuZXIoIkFQSV9DQUxMIiwiY29tcGxldGUiLChmdW5jdGlvbigpe3ZhciB0PXUuYXBpQ2FsbEV2ZW50KGUpO2lmKHQuQXR0ZW1wdENvdW50PWMsISh0LkF0dGVtcHRDb3VudDw9MCkpe3QuVGltZXN0YW1wPWE7dmFyIG49TWF0aC5yb3VuZChyLnV0aWwucmVhbENsb2NrLm5vdygpLWkpO3QuTGF0ZW5jeT1uPj0wP246MDt2YXIgbz1lLnJlc3BvbnNlO28uZXJyb3ImJm8uZXJyb3IucmV0cnlhYmxlJiYibnVtYmVyIj09dHlwZW9mIG8ucmV0cnlDb3VudCYmIm51bWJlciI9PXR5cGVvZiBvLm1heFJldHJpZXMmJm8ucmV0cnlDb3VudD49by5tYXhSZXRyaWVzJiYodC5NYXhSZXRyaWVzRXhjZWVkZWQ9MSksdS5lbWl0KCJhcGlDYWxsIixbdF0pfX0pKX0sc2V0dXBSZXF1ZXN0TGlzdGVuZXJzOmZ1bmN0aW9uKGUpe30sZ2V0U2lnbmluZ05hbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcGkuc2lnbmluZ05hbWV8fHRoaXMuYXBpLmVuZHBvaW50UHJlZml4fSxnZXRTaWduZXJDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuPW51bGwsbz0iIjtyZXR1cm4gZSYmKG89KG49KGUuc2VydmljZS5hcGkub3BlcmF0aW9uc3x8e30pW2Uub3BlcmF0aW9uXXx8bnVsbCk/bi5hdXRodHlwZToiIiksdD10aGlzLmNvbmZpZy5zaWduYXR1cmVWZXJzaW9uP3RoaXMuY29uZmlnLnNpZ25hdHVyZVZlcnNpb246InY0Ij09PW98fCJ2NC11bnNpZ25lZC1ib2R5Ij09PW8/InY0IjoiYmVhcmVyIj09PW8/ImJlYXJlciI6dGhpcy5hcGkuc2lnbmF0dXJlVmVyc2lvbixyLlNpZ25lcnMuUmVxdWVzdFNpZ25lci5nZXRWZXJzaW9uKHQpfSxzZXJ2aWNlSW50ZXJmYWNlOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuYXBpLnByb3RvY29sKXtjYXNlImVjMiI6Y2FzZSJxdWVyeSI6cmV0dXJuIHIuRXZlbnRMaXN0ZW5lcnMuUXVlcnk7Y2FzZSJqc29uIjpyZXR1cm4gci5FdmVudExpc3RlbmVycy5Kc29uO2Nhc2UicmVzdC1qc29uIjpyZXR1cm4gci5FdmVudExpc3RlbmVycy5SZXN0SnNvbjtjYXNlInJlc3QteG1sIjpyZXR1cm4gci5FdmVudExpc3RlbmVycy5SZXN0WG1sfWlmKHRoaXMuYXBpLnByb3RvY29sKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzZXJ2aWNlIGBwcm90b2NvbCcgIit0aGlzLmFwaS5wcm90b2NvbCsiIGluIEFQSSBjb25maWciKX0sc3VjY2Vzc2Z1bFJlc3BvbnNlOmZ1bmN0aW9uKGUpe3JldHVybiBlLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlPDMwMH0sbnVtUmV0cmllczpmdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT10aGlzLmNvbmZpZy5tYXhSZXRyaWVzP3RoaXMuY29uZmlnLm1heFJldHJpZXM6dGhpcy5kZWZhdWx0UmV0cnlDb3VudH0scmV0cnlEZWxheXM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gci51dGlsLmNhbGN1bGF0ZVJldHJ5RGVsYXkoZSx0aGlzLmNvbmZpZy5yZXRyeURlbGF5T3B0aW9ucyx0KX0scmV0cnlhYmxlRXJyb3I6ZnVuY3Rpb24oZSl7cmV0dXJuISF0aGlzLnRpbWVvdXRFcnJvcihlKXx8ISF0aGlzLm5ldHdvcmtpbmdFcnJvcihlKXx8ISF0aGlzLmV4cGlyZWRDcmVkZW50aWFsc0Vycm9yKGUpfHwhIXRoaXMudGhyb3R0bGVkRXJyb3IoZSl8fGUuc3RhdHVzQ29kZT49NTAwfSxuZXR3b3JraW5nRXJyb3I6ZnVuY3Rpb24oZSl7cmV0dXJuIk5ldHdvcmtpbmdFcnJvciI9PT1lLmNvZGV9LHRpbWVvdXRFcnJvcjpmdW5jdGlvbihlKXtyZXR1cm4iVGltZW91dEVycm9yIj09PWUuY29kZX0sZXhwaXJlZENyZWRlbnRpYWxzRXJyb3I6ZnVuY3Rpb24oZSl7cmV0dXJuIkV4cGlyZWRUb2tlbkV4Y2VwdGlvbiI9PT1lLmNvZGV9LGNsb2NrU2tld0Vycm9yOmZ1bmN0aW9uKGUpe3N3aXRjaChlLmNvZGUpe2Nhc2UiUmVxdWVzdFRpbWVUb29Ta2V3ZWQiOmNhc2UiUmVxdWVzdEV4cGlyZWQiOmNhc2UiSW52YWxpZFNpZ25hdHVyZUV4Y2VwdGlvbiI6Y2FzZSJTaWduYXR1cmVEb2VzTm90TWF0Y2giOmNhc2UiQXV0aEZhaWx1cmUiOmNhc2UiUmVxdWVzdEluVGhlRnV0dXJlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sZ2V0U2tld0NvcnJlY3RlZERhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IERhdGUoRGF0ZS5ub3coKSt0aGlzLmNvbmZpZy5zeXN0ZW1DbG9ja09mZnNldCl9LGFwcGx5Q2xvY2tPZmZzZXQ6ZnVuY3Rpb24oZSl7ZSYmKHRoaXMuY29uZmlnLnN5c3RlbUNsb2NrT2Zmc2V0PWUtRGF0ZS5ub3coKSl9LGlzQ2xvY2tTa2V3ZWQ6ZnVuY3Rpb24oZSl7aWYoZSlyZXR1cm4gTWF0aC5hYnModGhpcy5nZXRTa2V3Q29ycmVjdGVkRGF0ZSgpLmdldFRpbWUoKS1lKT49M2U1fSx0aHJvdHRsZWRFcnJvcjpmdW5jdGlvbihlKXtpZig0Mjk9PT1lLnN0YXR1c0NvZGUpcmV0dXJuITA7c3dpdGNoKGUuY29kZSl7Y2FzZSJQcm92aXNpb25lZFRocm91Z2hwdXRFeGNlZWRlZEV4Y2VwdGlvbiI6Y2FzZSJUaHJvdHRsaW5nIjpjYXNlIlRocm90dGxpbmdFeGNlcHRpb24iOmNhc2UiUmVxdWVzdExpbWl0RXhjZWVkZWQiOmNhc2UiUmVxdWVzdFRocm90dGxlZCI6Y2FzZSJSZXF1ZXN0VGhyb3R0bGVkRXhjZXB0aW9uIjpjYXNlIlRvb01hbnlSZXF1ZXN0c0V4Y2VwdGlvbiI6Y2FzZSJUcmFuc2FjdGlvbkluUHJvZ3Jlc3NFeGNlcHRpb24iOmNhc2UiRUMyVGhyb3R0bGVkRXhjZXB0aW9uIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sZW5kcG9pbnRGcm9tVGVtcGxhdGU6ZnVuY3Rpb24oZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBlO3ZhciB0PWU7cmV0dXJuIHQ9KHQ9KHQ9dC5yZXBsYWNlKC9ce3NlcnZpY2VcfS9nLHRoaXMuYXBpLmVuZHBvaW50UHJlZml4KSkucmVwbGFjZSgvXHtyZWdpb25cfS9nLHRoaXMuY29uZmlnLnJlZ2lvbikpLnJlcGxhY2UoL1x7c2NoZW1lXH0vZyx0aGlzLmNvbmZpZy5zc2xFbmFibGVkPyJodHRwcyI6Imh0dHAiKX0sc2V0RW5kcG9pbnQ6ZnVuY3Rpb24oZSl7dGhpcy5lbmRwb2ludD1uZXcgci5FbmRwb2ludChlLHRoaXMuY29uZmlnKX0scGFnaW5hdGlvbkNvbmZpZzpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuYXBpLm9wZXJhdGlvbnNbZV0ucGFnaW5hdG9yO2lmKCFuKXtpZih0KXt2YXIgbz1uZXcgRXJyb3I7dGhyb3cgci51dGlsLmVycm9yKG8sIk5vIHBhZ2luYXRpb24gY29uZmlndXJhdGlvbiBmb3IgIitlKX1yZXR1cm4gbnVsbH1yZXR1cm4gbn19KSxyLnV0aWwudXBkYXRlKHIuU2VydmljZSx7ZGVmaW5lTWV0aG9kczpmdW5jdGlvbihlKXtyLnV0aWwuZWFjaChlLnByb3RvdHlwZS5hcGkub3BlcmF0aW9ucywoZnVuY3Rpb24odCl7ZS5wcm90b3R5cGVbdF18fCgibm9uZSI9PT1lLnByb3RvdHlwZS5hcGkub3BlcmF0aW9uc1t0XS5hdXRodHlwZT9lLnByb3RvdHlwZVt0XT1mdW5jdGlvbihlLG4pe3JldHVybiB0aGlzLm1ha2VVbmF1dGhlbnRpY2F0ZWRSZXF1ZXN0KHQsZSxuKX06ZS5wcm90b3R5cGVbdF09ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdGhpcy5tYWtlUmVxdWVzdCh0LGUsbil9KX0pKX0sZGVmaW5lU2VydmljZTpmdW5jdGlvbihlLHQsbil7ci5TZXJ2aWNlLl9zZXJ2aWNlTWFwW2VdPSEwLEFycmF5LmlzQXJyYXkodCl8fChuPXQsdD1bXSk7dmFyIG89cyhyLlNlcnZpY2Usbnx8e30pO2lmKCJzdHJpbmciPT10eXBlb2YgZSl7ci5TZXJ2aWNlLmFkZFZlcnNpb25zKG8sdCk7dmFyIGk9by5zZXJ2aWNlSWRlbnRpZmllcnx8ZTtvLnNlcnZpY2VJZGVudGlmaWVyPWl9ZWxzZSBvLnByb3RvdHlwZS5hcGk9ZSxyLlNlcnZpY2UuZGVmaW5lTWV0aG9kcyhvKTtpZihyLlNlcXVlbnRpYWxFeGVjdXRvci5jYWxsKHRoaXMucHJvdG90eXBlKSwhdGhpcy5wcm90b3R5cGUucHVibGlzaGVyJiZyLnV0aWwuY2xpZW50U2lkZU1vbml0b3Jpbmcpe3ZhciBhPXIudXRpbC5jbGllbnRTaWRlTW9uaXRvcmluZy5QdWJsaXNoZXIsYz0oMCxyLnV0aWwuY2xpZW50U2lkZU1vbml0b3JpbmcuY29uZmlnUHJvdmlkZXIpKCk7dGhpcy5wcm90b3R5cGUucHVibGlzaGVyPW5ldyBhKGMpLGMuZW5hYmxlZCYmKHIuU2VydmljZS5fY2xpZW50U2lkZU1vbml0b3Jpbmc9ITApfXJldHVybiByLlNlcXVlbnRpYWxFeGVjdXRvci5jYWxsKG8ucHJvdG90eXBlKSxyLlNlcnZpY2UuYWRkRGVmYXVsdE1vbml0b3JpbmdMaXN0ZW5lcnMoby5wcm90b3R5cGUpLG99LGFkZFZlcnNpb25zOmZ1bmN0aW9uKGUsdCl7QXJyYXkuaXNBcnJheSh0KXx8KHQ9W3RdKSxlLnNlcnZpY2VzPWUuc2VydmljZXN8fHt9O2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXZvaWQgMD09PWUuc2VydmljZXNbdFtuXV0mJihlLnNlcnZpY2VzW3Rbbl1dPW51bGwpO2UuYXBpVmVyc2lvbnM9T2JqZWN0LmtleXMoZS5zZXJ2aWNlcykuc29ydCgpfSxkZWZpbmVTZXJ2aWNlQXBpOmZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1zKGUse3NlcnZpY2VJZGVudGlmaWVyOmUuc2VydmljZUlkZW50aWZpZXJ9KTtmdW5jdGlvbiBhKHQpe3QuaXNBcGk/aS5wcm90b3R5cGUuYXBpPXQ6aS5wcm90b3R5cGUuYXBpPW5ldyBvKHQse3NlcnZpY2VJZGVudGlmaWVyOmUuc2VydmljZUlkZW50aWZpZXJ9KX1pZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKG4pYShuKTtlbHNlIHRyeXthKHIuYXBpTG9hZGVyKGUuc2VydmljZUlkZW50aWZpZXIsdCkpfWNhdGNoKG4pe3Rocm93IHIudXRpbC5lcnJvcihuLHttZXNzYWdlOiJDb3VsZCBub3QgZmluZCBBUEkgY29uZmlndXJhdGlvbiAiK2Uuc2VydmljZUlkZW50aWZpZXIrIi0iK3R9KX1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZS5zZXJ2aWNlcyx0KXx8KGUuYXBpVmVyc2lvbnM9ZS5hcGlWZXJzaW9ucy5jb25jYXQodCkuc29ydCgpKSxlLnNlcnZpY2VzW3RdPWl9ZWxzZSBhKHQpO3JldHVybiByLlNlcnZpY2UuZGVmaW5lTWV0aG9kcyhpKSxpfSxoYXNTZXJ2aWNlOmZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoci5TZXJ2aWNlLl9zZXJ2aWNlTWFwLGUpfSxhZGREZWZhdWx0TW9uaXRvcmluZ0xpc3RlbmVyczpmdW5jdGlvbihlKXtlLmFkZE5hbWVkTGlzdGVuZXIoIk1PTklUT1JfRVZFTlRTX0JVQkJMRSIsImFwaUNhbGxBdHRlbXB0IiwoZnVuY3Rpb24odCl7dmFyIG49T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO24uX2V2ZW50cyYmbi5lbWl0KCJhcGlDYWxsQXR0ZW1wdCIsW3RdKX0pKSxlLmFkZE5hbWVkTGlzdGVuZXIoIkNBTExfRVZFTlRTX0JVQkJMRSIsImFwaUNhbGwiLChmdW5jdGlvbih0KXt2YXIgbj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7bi5fZXZlbnRzJiZuLmVtaXQoImFwaUNhbGwiLFt0XSl9KSl9LF9zZXJ2aWNlTWFwOnt9fSksci51dGlsLm1peGluKHIuU2VydmljZSxyLlNlcXVlbnRpYWxFeGVjdXRvciksdC5leHBvcnRzPXIuU2VydmljZX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHsiLi9jb3JlIjoxOSwiLi9tb2RlbC9hcGkiOjQwLCIuL3JlZ2lvbi91dGlscyI6NTUsIi4vcmVnaW9uX2NvbmZpZyI6NTYsX3Byb2Nlc3M6OTF9XSw2MzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uL2NvbmZpZ19yZWdpb25hbF9lbmRwb2ludCIpO3IudXRpbC51cGRhdGUoci5TVFMucHJvdG90eXBlLHtjcmVkZW50aWFsc0Zyb206ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT8odHx8KHQ9bmV3IHIuVGVtcG9yYXJ5Q3JlZGVudGlhbHMpLHQuZXhwaXJlZD0hMSx0LmFjY2Vzc0tleUlkPWUuQ3JlZGVudGlhbHMuQWNjZXNzS2V5SWQsdC5zZWNyZXRBY2Nlc3NLZXk9ZS5DcmVkZW50aWFscy5TZWNyZXRBY2Nlc3NLZXksdC5zZXNzaW9uVG9rZW49ZS5DcmVkZW50aWFscy5TZXNzaW9uVG9rZW4sdC5leHBpcmVUaW1lPWUuQ3JlZGVudGlhbHMuRXhwaXJhdGlvbix0KTpudWxsfSxhc3N1bWVSb2xlV2l0aFdlYklkZW50aXR5OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubWFrZVVuYXV0aGVudGljYXRlZFJlcXVlc3QoImFzc3VtZVJvbGVXaXRoV2ViSWRlbnRpdHkiLGUsdCl9LGFzc3VtZVJvbGVXaXRoU0FNTDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1ha2VVbmF1dGhlbnRpY2F0ZWRSZXF1ZXN0KCJhc3N1bWVSb2xlV2l0aFNBTUwiLGUsdCl9LHNldHVwUmVxdWVzdExpc3RlbmVyczpmdW5jdGlvbihlKXtlLmFkZExpc3RlbmVyKCJ2YWxpZGF0ZSIsdGhpcy5vcHRJblJlZ2lvbmFsRW5kcG9pbnQsITApfSxvcHRJblJlZ2lvbmFsRW5kcG9pbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLG49dC5jb25maWc7aWYobi5zdHNSZWdpb25hbEVuZHBvaW50cz1vKHQuX29yaWdpbmFsQ29uZmlnLHtlbnY6IkFXU19TVFNfUkVHSU9OQUxfRU5EUE9JTlRTIixzaGFyZWRDb25maWc6InN0c19yZWdpb25hbF9lbmRwb2ludHMiLGNsaWVudENvbmZpZzoic3RzUmVnaW9uYWxFbmRwb2ludHMifSksInJlZ2lvbmFsIj09PW4uc3RzUmVnaW9uYWxFbmRwb2ludHMmJnQuaXNHbG9iYWxFbmRwb2ludCl7aWYoIW4ucmVnaW9uKXRocm93IHIudXRpbC5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IkNvbmZpZ0Vycm9yIixtZXNzYWdlOiJNaXNzaW5nIHJlZ2lvbiBpbiBjb25maWcifSk7dmFyIGk9bi5lbmRwb2ludC5pbmRleE9mKCIuYW1hem9uYXdzLmNvbSIpLHM9bi5lbmRwb2ludC5zdWJzdHJpbmcoMCxpKSsiLiIrbi5yZWdpb24rbi5lbmRwb2ludC5zdWJzdHJpbmcoaSk7ZS5odHRwUmVxdWVzdC51cGRhdGVFbmRwb2ludChzKSxlLmh0dHBSZXF1ZXN0LnJlZ2lvbj1uLnJlZ2lvbn19fSl9LHsiLi4vY29uZmlnX3JlZ2lvbmFsX2VuZHBvaW50IjoxOCwiLi4vY29yZSI6MTl9XSw2NDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKTtyLlNpZ25lcnMuQmVhcmVyPXIudXRpbC5pbmhlcml0KHIuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXtyLlNpZ25lcnMuUmVxdWVzdFNpZ25lci5jYWxsKHRoaXMsZSl9LGFkZEF1dGhvcml6YXRpb246ZnVuY3Rpb24oZSl7dGhpcy5yZXF1ZXN0LmhlYWRlcnMuQXV0aG9yaXphdGlvbj0iQmVhcmVyICIrZS50b2tlbn19KX0seyIuLi9jb3JlIjoxOX1dLDY1OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQsaT0icHJlc2lnbmVkLWV4cGlyZXMiO2Z1bmN0aW9uIHMoZSl7dmFyIHQ9ZS5odHRwUmVxdWVzdC5oZWFkZXJzW2ldLG49ZS5zZXJ2aWNlLmdldFNpZ25lckNsYXNzKGUpO2lmKGRlbGV0ZSBlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIlVzZXItQWdlbnQiXSxkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJYLUFtei1Vc2VyLUFnZW50Il0sbj09PXIuU2lnbmVycy5WNCl7aWYodD42MDQ4MDApdGhyb3cgci51dGlsLmVycm9yKG5ldyBFcnJvcix7Y29kZToiSW52YWxpZEV4cGlyeVRpbWUiLG1lc3NhZ2U6IlByZXNpZ25pbmcgZG9lcyBub3Qgc3VwcG9ydCBleHBpcnkgdGltZSBncmVhdGVyIHRoYW4gYSB3ZWVrIHdpdGggU2lnVjQgc2lnbmluZy4iLHJldHJ5YWJsZTohMX0pO2UuaHR0cFJlcXVlc3QuaGVhZGVyc1tpXT10fWVsc2V7aWYobiE9PXIuU2lnbmVycy5TMyl0aHJvdyByLnV0aWwuZXJyb3IobmV3IEVycm9yLHttZXNzYWdlOiJQcmVzaWduaW5nIG9ubHkgc3VwcG9ydHMgUzMgb3IgU2lnVjQgc2lnbmluZy4iLGNvZGU6IlVuc3VwcG9ydGVkU2lnbmVyIixyZXRyeWFibGU6ITF9KTt2YXIgbz1lLnNlcnZpY2U/ZS5zZXJ2aWNlLmdldFNrZXdDb3JyZWN0ZWREYXRlKCk6ci51dGlsLmRhdGUuZ2V0RGF0ZSgpO2UuaHR0cFJlcXVlc3QuaGVhZGVyc1tpXT1wYXJzZUludChyLnV0aWwuZGF0ZS51bml4VGltZXN0YW1wKG8pK3QsMTApLnRvU3RyaW5nKCl9fWZ1bmN0aW9uIGEoZSl7dmFyIHQ9ZS5odHRwUmVxdWVzdC5lbmRwb2ludCxuPXIudXRpbC51cmxQYXJzZShlLmh0dHBSZXF1ZXN0LnBhdGgpLG89e307bi5zZWFyY2gmJihvPXIudXRpbC5xdWVyeVN0cmluZ1BhcnNlKG4uc2VhcmNoLnN1YnN0cigxKSkpO3ZhciBzPWUuaHR0cFJlcXVlc3QuaGVhZGVycy5BdXRob3JpemF0aW9uLnNwbGl0KCIgIik7aWYoIkFXUyI9PT1zWzBdKXM9c1sxXS5zcGxpdCgiOiIpLG8uU2lnbmF0dXJlPXMucG9wKCksby5BV1NBY2Nlc3NLZXlJZD1zLmpvaW4oIjoiKSxyLnV0aWwuZWFjaChlLmh0dHBSZXF1ZXN0LmhlYWRlcnMsKGZ1bmN0aW9uKGUsdCl7ZT09PWkmJihlPSJFeHBpcmVzIiksMD09PWUuaW5kZXhPZigieC1hbXotbWV0YS0iKSYmKGRlbGV0ZSBvW2VdLGU9ZS50b0xvd2VyQ2FzZSgpKSxvW2VdPXR9KSksZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVyc1tpXSxkZWxldGUgby5BdXRob3JpemF0aW9uLGRlbGV0ZSBvLkhvc3Q7ZWxzZSBpZigiQVdTNC1ITUFDLVNIQTI1NiI9PT1zWzBdKXtzLnNoaWZ0KCk7dmFyIGE9cy5qb2luKCIgIikubWF0Y2goL1NpZ25hdHVyZT0oLio/KSg/Oix8XHN8XHI/XG58JCkvKVsxXTtvWyJYLUFtei1TaWduYXR1cmUiXT1hLGRlbGV0ZSBvLkV4cGlyZXN9dC5wYXRobmFtZT1uLnBhdGhuYW1lLHQuc2VhcmNoPXIudXRpbC5xdWVyeVBhcmFtc1RvU3RyaW5nKG8pfXIuU2lnbmVycy5QcmVzaWduPW8oe3NpZ246ZnVuY3Rpb24oZSx0LG4pe2lmKGUuaHR0cFJlcXVlc3QuaGVhZGVyc1tpXT10fHwzNjAwLGUub24oImJ1aWxkIixzKSxlLm9uKCJzaWduIixhKSxlLnJlbW92ZUxpc3RlbmVyKCJhZnRlckJ1aWxkIixyLkV2ZW50TGlzdGVuZXJzLkNvcmUuU0VUX0NPTlRFTlRfTEVOR1RIKSxlLnJlbW92ZUxpc3RlbmVyKCJhZnRlckJ1aWxkIixyLkV2ZW50TGlzdGVuZXJzLkNvcmUuQ09NUFVURV9TSEEyNTYpLGUuZW1pdCgiYmVmb3JlUHJlc2lnbiIsW2VdKSwhbil7aWYoZS5idWlsZCgpLGUucmVzcG9uc2UuZXJyb3IpdGhyb3cgZS5yZXNwb25zZS5lcnJvcjtyZXR1cm4gci51dGlsLnVybEZvcm1hdChlLmh0dHBSZXF1ZXN0LmVuZHBvaW50KX1lLmJ1aWxkKChmdW5jdGlvbigpe3RoaXMucmVzcG9uc2UuZXJyb3I/bih0aGlzLnJlc3BvbnNlLmVycm9yKTpuKG51bGwsci51dGlsLnVybEZvcm1hdChlLmh0dHBSZXF1ZXN0LmVuZHBvaW50KSl9KSl9fSksdC5leHBvcnRzPXIuU2lnbmVycy5QcmVzaWdufSx7Ii4uL2NvcmUiOjE5fV0sNjY6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdDtyLlNpZ25lcnMuUmVxdWVzdFNpZ25lcj1vKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXt0aGlzLnJlcXVlc3Q9ZX0sc2V0U2VydmljZUNsaWVudElkOmZ1bmN0aW9uKGUpe3RoaXMuc2VydmljZUNsaWVudElkPWV9LGdldFNlcnZpY2VDbGllbnRJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNlcnZpY2VDbGllbnRJZH19KSxyLlNpZ25lcnMuUmVxdWVzdFNpZ25lci5nZXRWZXJzaW9uPWZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlInYyIjpyZXR1cm4gci5TaWduZXJzLlYyO2Nhc2UidjMiOnJldHVybiByLlNpZ25lcnMuVjM7Y2FzZSJzM3Y0IjpjYXNlInY0IjpyZXR1cm4gci5TaWduZXJzLlY0O2Nhc2UiczMiOnJldHVybiByLlNpZ25lcnMuUzM7Y2FzZSJ2M2h0dHBzIjpyZXR1cm4gci5TaWduZXJzLlYzSHR0cHM7Y2FzZSJiZWFyZXIiOnJldHVybiByLlNpZ25lcnMuQmVhcmVyfXRocm93IG5ldyBFcnJvcigiVW5rbm93biBzaWduaW5nIHZlcnNpb24gIitlKX0sZSgiLi92MiIpLGUoIi4vdjMiKSxlKCIuL3YzaHR0cHMiKSxlKCIuL3Y0IiksZSgiLi9zMyIpLGUoIi4vcHJlc2lnbiIpLGUoIi4vYmVhcmVyIil9LHsiLi4vY29yZSI6MTksIi4vYmVhcmVyIjo2NCwiLi9wcmVzaWduIjo2NSwiLi9zMyI6NjcsIi4vdjIiOjY4LCIuL3YzIjo2OSwiLi92M2h0dHBzIjo3MCwiLi92NCI6NzF9XSw2NzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0O3IuU2lnbmVycy5TMz1vKHIuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLHtzdWJSZXNvdXJjZXM6e2FjbDoxLGFjY2VsZXJhdGU6MSxhbmFseXRpY3M6MSxjb3JzOjEsbGlmZWN5Y2xlOjEsZGVsZXRlOjEsaW52ZW50b3J5OjEsbG9jYXRpb246MSxsb2dnaW5nOjEsbWV0cmljczoxLG5vdGlmaWNhdGlvbjoxLHBhcnROdW1iZXI6MSxwb2xpY3k6MSxyZXF1ZXN0UGF5bWVudDoxLHJlcGxpY2F0aW9uOjEscmVzdG9yZToxLHRhZ2dpbmc6MSx0b3JyZW50OjEsdXBsb2FkSWQ6MSx1cGxvYWRzOjEsdmVyc2lvbklkOjEsdmVyc2lvbmluZzoxLHZlcnNpb25zOjEsd2Vic2l0ZToxfSxyZXNwb25zZUhlYWRlcnM6eyJyZXNwb25zZS1jb250ZW50LXR5cGUiOjEsInJlc3BvbnNlLWNvbnRlbnQtbGFuZ3VhZ2UiOjEsInJlc3BvbnNlLWV4cGlyZXMiOjEsInJlc3BvbnNlLWNhY2hlLWNvbnRyb2wiOjEsInJlc3BvbnNlLWNvbnRlbnQtZGlzcG9zaXRpb24iOjEsInJlc3BvbnNlLWNvbnRlbnQtZW5jb2RpbmciOjF9LGFkZEF1dGhvcml6YXRpb246ZnVuY3Rpb24oZSx0KXt0aGlzLnJlcXVlc3QuaGVhZGVyc1sicHJlc2lnbmVkLWV4cGlyZXMiXXx8KHRoaXMucmVxdWVzdC5oZWFkZXJzWyJYLUFtei1EYXRlIl09ci51dGlsLmRhdGUucmZjODIyKHQpKSxlLnNlc3Npb25Ub2tlbiYmKHRoaXMucmVxdWVzdC5oZWFkZXJzWyJ4LWFtei1zZWN1cml0eS10b2tlbiJdPWUuc2Vzc2lvblRva2VuKTt2YXIgbj10aGlzLnNpZ24oZS5zZWNyZXRBY2Nlc3NLZXksdGhpcy5zdHJpbmdUb1NpZ24oKSksbz0iQVdTICIrZS5hY2Nlc3NLZXlJZCsiOiIrbjt0aGlzLnJlcXVlc3QuaGVhZGVycy5BdXRob3JpemF0aW9uPW99LHN0cmluZ1RvU2lnbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVxdWVzdCx0PVtdO3QucHVzaChlLm1ldGhvZCksdC5wdXNoKGUuaGVhZGVyc1siQ29udGVudC1NRDUiXXx8IiIpLHQucHVzaChlLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdfHwiIiksdC5wdXNoKGUuaGVhZGVyc1sicHJlc2lnbmVkLWV4cGlyZXMiXXx8IiIpO3ZhciBuPXRoaXMuY2Fub25pY2FsaXplZEFtekhlYWRlcnMoKTtyZXR1cm4gbiYmdC5wdXNoKG4pLHQucHVzaCh0aGlzLmNhbm9uaWNhbGl6ZWRSZXNvdXJjZSgpKSx0LmpvaW4oIlxuIil9LGNhbm9uaWNhbGl6ZWRBbXpIZWFkZXJzOmZ1bmN0aW9uKCl7dmFyIGU9W107ci51dGlsLmVhY2godGhpcy5yZXF1ZXN0LmhlYWRlcnMsKGZ1bmN0aW9uKHQpe3QubWF0Y2goL154LWFtei0vaSkmJmUucHVzaCh0KX0pKSxlLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUudG9Mb3dlckNhc2UoKTx0LnRvTG93ZXJDYXNlKCk/LTE6MX0pKTt2YXIgdD1bXTtyZXR1cm4gci51dGlsLmFycmF5RWFjaC5jYWxsKHRoaXMsZSwoZnVuY3Rpb24oZSl7dC5wdXNoKGUudG9Mb3dlckNhc2UoKSsiOiIrU3RyaW5nKHRoaXMucmVxdWVzdC5oZWFkZXJzW2VdKSl9KSksdC5qb2luKCJcbiIpfSxjYW5vbmljYWxpemVkUmVzb3VyY2U6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlcXVlc3QsdD1lLnBhdGguc3BsaXQoIj8iKSxuPXRbMF0sbz10WzFdLGk9IiI7aWYoZS52aXJ0dWFsSG9zdGVkQnVja2V0JiYoaSs9Ii8iK2UudmlydHVhbEhvc3RlZEJ1Y2tldCksaSs9bixvKXt2YXIgcz1bXTtyLnV0aWwuYXJyYXlFYWNoLmNhbGwodGhpcyxvLnNwbGl0KCImIiksKGZ1bmN0aW9uKGUpe3ZhciB0PWUuc3BsaXQoIj0iKVswXSxuPWUuc3BsaXQoIj0iKVsxXTtpZih0aGlzLnN1YlJlc291cmNlc1t0XXx8dGhpcy5yZXNwb25zZUhlYWRlcnNbdF0pe3ZhciByPXtuYW1lOnR9O3ZvaWQgMCE9PW4mJih0aGlzLnN1YlJlc291cmNlc1t0XT9yLnZhbHVlPW46ci52YWx1ZT1kZWNvZGVVUklDb21wb25lbnQobikpLHMucHVzaChyKX19KSkscy5zb3J0KChmdW5jdGlvbihlLHQpe3JldHVybiBlLm5hbWU8dC5uYW1lPy0xOjF9KSkscy5sZW5ndGgmJihvPVtdLHIudXRpbC5hcnJheUVhY2gocywoZnVuY3Rpb24oZSl7dm9pZCAwPT09ZS52YWx1ZT9vLnB1c2goZS5uYW1lKTpvLnB1c2goZS5uYW1lKyI9IitlLnZhbHVlKX0pKSxpKz0iPyIrby5qb2luKCImIikpfXJldHVybiBpfSxzaWduOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIudXRpbC5jcnlwdG8uaG1hYyhlLHQsImJhc2U2NCIsInNoYTEiKX19KSx0LmV4cG9ydHM9ci5TaWduZXJzLlMzfSx7Ii4uL2NvcmUiOjE5fV0sNjg6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdDtyLlNpZ25lcnMuVjI9byhyLlNpZ25lcnMuUmVxdWVzdFNpZ25lcix7YWRkQXV0aG9yaXphdGlvbjpmdW5jdGlvbihlLHQpe3R8fCh0PXIudXRpbC5kYXRlLmdldERhdGUoKSk7dmFyIG49dGhpcy5yZXF1ZXN0O24ucGFyYW1zLlRpbWVzdGFtcD1yLnV0aWwuZGF0ZS5pc284NjAxKHQpLG4ucGFyYW1zLlNpZ25hdHVyZVZlcnNpb249IjIiLG4ucGFyYW1zLlNpZ25hdHVyZU1ldGhvZD0iSG1hY1NIQTI1NiIsbi5wYXJhbXMuQVdTQWNjZXNzS2V5SWQ9ZS5hY2Nlc3NLZXlJZCxlLnNlc3Npb25Ub2tlbiYmKG4ucGFyYW1zLlNlY3VyaXR5VG9rZW49ZS5zZXNzaW9uVG9rZW4pLGRlbGV0ZSBuLnBhcmFtcy5TaWduYXR1cmUsbi5wYXJhbXMuU2lnbmF0dXJlPXRoaXMuc2lnbmF0dXJlKGUpLG4uYm9keT1yLnV0aWwucXVlcnlQYXJhbXNUb1N0cmluZyhuLnBhcmFtcyksbi5oZWFkZXJzWyJDb250ZW50LUxlbmd0aCJdPW4uYm9keS5sZW5ndGh9LHNpZ25hdHVyZTpmdW5jdGlvbihlKXtyZXR1cm4gci51dGlsLmNyeXB0by5obWFjKGUuc2VjcmV0QWNjZXNzS2V5LHRoaXMuc3RyaW5nVG9TaWduKCksImJhc2U2NCIpfSxzdHJpbmdUb1NpZ246ZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4gZS5wdXNoKHRoaXMucmVxdWVzdC5tZXRob2QpLGUucHVzaCh0aGlzLnJlcXVlc3QuZW5kcG9pbnQuaG9zdC50b0xvd2VyQ2FzZSgpKSxlLnB1c2godGhpcy5yZXF1ZXN0LnBhdGhuYW1lKCkpLGUucHVzaChyLnV0aWwucXVlcnlQYXJhbXNUb1N0cmluZyh0aGlzLnJlcXVlc3QucGFyYW1zKSksZS5qb2luKCJcbiIpfX0pLHQuZXhwb3J0cz1yLlNpZ25lcnMuVjJ9LHsiLi4vY29yZSI6MTl9XSw2OTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0O3IuU2lnbmVycy5WMz1vKHIuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLHthZGRBdXRob3JpemF0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49ci51dGlsLmRhdGUucmZjODIyKHQpO3RoaXMucmVxdWVzdC5oZWFkZXJzWyJYLUFtei1EYXRlIl09bixlLnNlc3Npb25Ub2tlbiYmKHRoaXMucmVxdWVzdC5oZWFkZXJzWyJ4LWFtei1zZWN1cml0eS10b2tlbiJdPWUuc2Vzc2lvblRva2VuKSx0aGlzLnJlcXVlc3QuaGVhZGVyc1siWC1BbXpuLUF1dGhvcml6YXRpb24iXT10aGlzLmF1dGhvcml6YXRpb24oZSxuKX0sYXV0aG9yaXphdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4iQVdTMyBBV1NBY2Nlc3NLZXlJZD0iK2UuYWNjZXNzS2V5SWQrIixBbGdvcml0aG09SG1hY1NIQTI1NixTaWduZWRIZWFkZXJzPSIrdGhpcy5zaWduZWRIZWFkZXJzKCkrIixTaWduYXR1cmU9Iit0aGlzLnNpZ25hdHVyZShlKX0sc2lnbmVkSGVhZGVyczpmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiByLnV0aWwuYXJyYXlFYWNoKHRoaXMuaGVhZGVyc1RvU2lnbigpLChmdW5jdGlvbih0KXtlLnB1c2godC50b0xvd2VyQ2FzZSgpKX0pKSxlLnNvcnQoKS5qb2luKCI7Iil9LGNhbm9uaWNhbEhlYWRlcnM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlcXVlc3QuaGVhZGVycyx0PVtdO3JldHVybiByLnV0aWwuYXJyYXlFYWNoKHRoaXMuaGVhZGVyc1RvU2lnbigpLChmdW5jdGlvbihuKXt0LnB1c2gobi50b0xvd2VyQ2FzZSgpLnRyaW0oKSsiOiIrU3RyaW5nKGVbbl0pLnRyaW0oKSl9KSksdC5zb3J0KCkuam9pbigiXG4iKSsiXG4ifSxoZWFkZXJzVG9TaWduOmZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIHIudXRpbC5lYWNoKHRoaXMucmVxdWVzdC5oZWFkZXJzLChmdW5jdGlvbih0KXsoIkhvc3QiPT09dHx8IkNvbnRlbnQtRW5jb2RpbmciPT09dHx8dC5tYXRjaCgvXlgtQW16L2kpKSYmZS5wdXNoKHQpfSkpLGV9LHNpZ25hdHVyZTpmdW5jdGlvbihlKXtyZXR1cm4gci51dGlsLmNyeXB0by5obWFjKGUuc2VjcmV0QWNjZXNzS2V5LHRoaXMuc3RyaW5nVG9TaWduKCksImJhc2U2NCIpfSxzdHJpbmdUb1NpZ246ZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4gZS5wdXNoKHRoaXMucmVxdWVzdC5tZXRob2QpLGUucHVzaCgiLyIpLGUucHVzaCgiIiksZS5wdXNoKHRoaXMuY2Fub25pY2FsSGVhZGVycygpKSxlLnB1c2godGhpcy5yZXF1ZXN0LmJvZHkpLHIudXRpbC5jcnlwdG8uc2hhMjU2KGUuam9pbigiXG4iKSl9fSksdC5leHBvcnRzPXIuU2lnbmVycy5WM30seyIuLi9jb3JlIjoxOX1dLDcwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQ7ZSgiLi92MyIpLHIuU2lnbmVycy5WM0h0dHBzPW8oci5TaWduZXJzLlYzLHthdXRob3JpemF0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiJBV1MzLUhUVFBTIEFXU0FjY2Vzc0tleUlkPSIrZS5hY2Nlc3NLZXlJZCsiLEFsZ29yaXRobT1IbWFjU0hBMjU2LFNpZ25hdHVyZT0iK3RoaXMuc2lnbmF0dXJlKGUpfSxzdHJpbmdUb1NpZ246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXF1ZXN0LmhlYWRlcnNbIlgtQW16LURhdGUiXX19KSx0LmV4cG9ydHM9ci5TaWduZXJzLlYzSHR0cHN9LHsiLi4vY29yZSI6MTksIi4vdjMiOjY5fV0sNzE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCIuL3Y0X2NyZWRlbnRpYWxzIiksaT1yLnV0aWwuaW5oZXJpdCxzPSJwcmVzaWduZWQtZXhwaXJlcyI7ci5TaWduZXJzLlY0PWkoci5TaWduZXJzLlJlcXVlc3RTaWduZXIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCxuKXtyLlNpZ25lcnMuUmVxdWVzdFNpZ25lci5jYWxsKHRoaXMsZSksdGhpcy5zZXJ2aWNlTmFtZT10LG49bnx8e30sdGhpcy5zaWduYXR1cmVDYWNoZT0iYm9vbGVhbiIhPXR5cGVvZiBuLnNpZ25hdHVyZUNhY2hlfHxuLnNpZ25hdHVyZUNhY2hlLHRoaXMub3BlcmF0aW9uPW4ub3BlcmF0aW9uLHRoaXMuc2lnbmF0dXJlVmVyc2lvbj1uLnNpZ25hdHVyZVZlcnNpb259LGFsZ29yaXRobToiQVdTNC1ITUFDLVNIQTI1NiIsYWRkQXV0aG9yaXphdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBuPXIudXRpbC5kYXRlLmlzbzg2MDEodCkucmVwbGFjZSgvWzpcLV18XC5cZHszfS9nLCIiKTt0aGlzLmlzUHJlc2lnbmVkKCk/dGhpcy51cGRhdGVGb3JQcmVzaWduZWQoZSxuKTp0aGlzLmFkZEhlYWRlcnMoZSxuKSx0aGlzLnJlcXVlc3QuaGVhZGVycy5BdXRob3JpemF0aW9uPXRoaXMuYXV0aG9yaXphdGlvbihlLG4pfSxhZGRIZWFkZXJzOmZ1bmN0aW9uKGUsdCl7dGhpcy5yZXF1ZXN0LmhlYWRlcnNbIlgtQW16LURhdGUiXT10LGUuc2Vzc2lvblRva2VuJiYodGhpcy5yZXF1ZXN0LmhlYWRlcnNbIngtYW16LXNlY3VyaXR5LXRva2VuIl09ZS5zZXNzaW9uVG9rZW4pfSx1cGRhdGVGb3JQcmVzaWduZWQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNyZWRlbnRpYWxTdHJpbmcodCksbz17IlgtQW16LURhdGUiOnQsIlgtQW16LUFsZ29yaXRobSI6dGhpcy5hbGdvcml0aG0sIlgtQW16LUNyZWRlbnRpYWwiOmUuYWNjZXNzS2V5SWQrIi8iK24sIlgtQW16LUV4cGlyZXMiOnRoaXMucmVxdWVzdC5oZWFkZXJzW3NdLCJYLUFtei1TaWduZWRIZWFkZXJzIjp0aGlzLnNpZ25lZEhlYWRlcnMoKX07ZS5zZXNzaW9uVG9rZW4mJihvWyJYLUFtei1TZWN1cml0eS1Ub2tlbiJdPWUuc2Vzc2lvblRva2VuKSx0aGlzLnJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1UeXBlIl0mJihvWyJDb250ZW50LVR5cGUiXT10aGlzLnJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1UeXBlIl0pLHRoaXMucmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LU1ENSJdJiYob1siQ29udGVudC1NRDUiXT10aGlzLnJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1NRDUiXSksdGhpcy5yZXF1ZXN0LmhlYWRlcnNbIkNhY2hlLUNvbnRyb2wiXSYmKG9bIkNhY2hlLUNvbnRyb2wiXT10aGlzLnJlcXVlc3QuaGVhZGVyc1siQ2FjaGUtQ29udHJvbCJdKSxyLnV0aWwuZWFjaC5jYWxsKHRoaXMsdGhpcy5yZXF1ZXN0LmhlYWRlcnMsKGZ1bmN0aW9uKGUsdCl7aWYoZSE9PXMmJnRoaXMuaXNTaWduYWJsZUhlYWRlcihlKSl7dmFyIG49ZS50b0xvd2VyQ2FzZSgpOzA9PT1uLmluZGV4T2YoIngtYW16LW1ldGEtIik/b1tuXT10OjA9PT1uLmluZGV4T2YoIngtYW16LSIpJiYob1tlXT10KX19KSk7dmFyIGk9dGhpcy5yZXF1ZXN0LnBhdGguaW5kZXhPZigiPyIpPj0wPyImIjoiPyI7dGhpcy5yZXF1ZXN0LnBhdGgrPWkrci51dGlsLnF1ZXJ5UGFyYW1zVG9TdHJpbmcobyl9LGF1dGhvcml6YXRpb246ZnVuY3Rpb24oZSx0KXt2YXIgbj1bXSxyPXRoaXMuY3JlZGVudGlhbFN0cmluZyh0KTtyZXR1cm4gbi5wdXNoKHRoaXMuYWxnb3JpdGhtKyIgQ3JlZGVudGlhbD0iK2UuYWNjZXNzS2V5SWQrIi8iK3IpLG4ucHVzaCgiU2lnbmVkSGVhZGVycz0iK3RoaXMuc2lnbmVkSGVhZGVycygpKSxuLnB1c2goIlNpZ25hdHVyZT0iK3RoaXMuc2lnbmF0dXJlKGUsdCkpLG4uam9pbigiLCAiKX0sc2lnbmF0dXJlOmZ1bmN0aW9uKGUsdCl7dmFyIG49by5nZXRTaWduaW5nS2V5KGUsdC5zdWJzdHIoMCw4KSx0aGlzLnJlcXVlc3QucmVnaW9uLHRoaXMuc2VydmljZU5hbWUsdGhpcy5zaWduYXR1cmVDYWNoZSk7cmV0dXJuIHIudXRpbC5jcnlwdG8uaG1hYyhuLHRoaXMuc3RyaW5nVG9TaWduKHQpLCJoZXgiKX0sc3RyaW5nVG9TaWduOmZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybiB0LnB1c2goIkFXUzQtSE1BQy1TSEEyNTYiKSx0LnB1c2goZSksdC5wdXNoKHRoaXMuY3JlZGVudGlhbFN0cmluZyhlKSksdC5wdXNoKHRoaXMuaGV4RW5jb2RlZEhhc2godGhpcy5jYW5vbmljYWxTdHJpbmcoKSkpLHQuam9pbigiXG4iKX0sY2Fub25pY2FsU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIGU9W10sdD10aGlzLnJlcXVlc3QucGF0aG5hbWUoKTtyZXR1cm4iczMiIT09dGhpcy5zZXJ2aWNlTmFtZSYmInMzdjQiIT09dGhpcy5zaWduYXR1cmVWZXJzaW9uJiYodD1yLnV0aWwudXJpRXNjYXBlUGF0aCh0KSksZS5wdXNoKHRoaXMucmVxdWVzdC5tZXRob2QpLGUucHVzaCh0KSxlLnB1c2godGhpcy5yZXF1ZXN0LnNlYXJjaCgpKSxlLnB1c2godGhpcy5jYW5vbmljYWxIZWFkZXJzKCkrIlxuIiksZS5wdXNoKHRoaXMuc2lnbmVkSGVhZGVycygpKSxlLnB1c2godGhpcy5oZXhFbmNvZGVkQm9keUhhc2goKSksZS5qb2luKCJcbiIpfSxjYW5vbmljYWxIZWFkZXJzOmZ1bmN0aW9uKCl7dmFyIGU9W107ci51dGlsLmVhY2guY2FsbCh0aGlzLHRoaXMucmVxdWVzdC5oZWFkZXJzLChmdW5jdGlvbih0LG4pe2UucHVzaChbdCxuXSl9KSksZS5zb3J0KChmdW5jdGlvbihlLHQpe3JldHVybiBlWzBdLnRvTG93ZXJDYXNlKCk8dFswXS50b0xvd2VyQ2FzZSgpPy0xOjF9KSk7dmFyIHQ9W107cmV0dXJuIHIudXRpbC5hcnJheUVhY2guY2FsbCh0aGlzLGUsKGZ1bmN0aW9uKGUpe3ZhciBuPWVbMF0udG9Mb3dlckNhc2UoKTtpZih0aGlzLmlzU2lnbmFibGVIZWFkZXIobikpe3ZhciBvPWVbMV07aWYobnVsbD09b3x8ImZ1bmN0aW9uIiE9dHlwZW9mIG8udG9TdHJpbmcpdGhyb3cgci51dGlsLmVycm9yKG5ldyBFcnJvcigiSGVhZGVyICIrbisiIGNvbnRhaW5zIGludmFsaWQgdmFsdWUiKSx7Y29kZToiSW52YWxpZEhlYWRlciJ9KTt0LnB1c2gobisiOiIrdGhpcy5jYW5vbmljYWxIZWFkZXJWYWx1ZXMoby50b1N0cmluZygpKSl9fSkpLHQuam9pbigiXG4iKX0sY2Fub25pY2FsSGVhZGVyVmFsdWVzOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1xzKy9nLCIgIikucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfSxzaWduZWRIZWFkZXJzOmZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIHIudXRpbC5lYWNoLmNhbGwodGhpcyx0aGlzLnJlcXVlc3QuaGVhZGVycywoZnVuY3Rpb24odCl7dD10LnRvTG93ZXJDYXNlKCksdGhpcy5pc1NpZ25hYmxlSGVhZGVyKHQpJiZlLnB1c2godCl9KSksZS5zb3J0KCkuam9pbigiOyIpfSxjcmVkZW50aWFsU3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiBvLmNyZWF0ZVNjb3BlKGUuc3Vic3RyKDAsOCksdGhpcy5yZXF1ZXN0LnJlZ2lvbix0aGlzLnNlcnZpY2VOYW1lKX0saGV4RW5jb2RlZEhhc2g6ZnVuY3Rpb24oZSl7cmV0dXJuIHIudXRpbC5jcnlwdG8uc2hhMjU2KGUsImhleCIpfSxoZXhFbmNvZGVkQm9keUhhc2g6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlcXVlc3Q7cmV0dXJuIHRoaXMuaXNQcmVzaWduZWQoKSYmWyJzMyIsInMzLW9iamVjdC1sYW1iZGEiXS5pbmRleE9mKHRoaXMuc2VydmljZU5hbWUpPi0xJiYhZS5ib2R5PyJVTlNJR05FRC1QQVlMT0FEIjplLmhlYWRlcnNbIlgtQW16LUNvbnRlbnQtU2hhMjU2Il0/ZS5oZWFkZXJzWyJYLUFtei1Db250ZW50LVNoYTI1NiJdOnRoaXMuaGV4RW5jb2RlZEhhc2godGhpcy5yZXF1ZXN0LmJvZHl8fCIiKX0sdW5zaWduYWJsZUhlYWRlcnM6WyJhdXRob3JpemF0aW9uIiwiY29udGVudC10eXBlIiwiY29udGVudC1sZW5ndGgiLCJ1c2VyLWFnZW50IixzLCJleHBlY3QiLCJ4LWFtem4tdHJhY2UtaWQiXSxpc1NpZ25hYmxlSGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiAwPT09ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIngtYW16LSIpfHx0aGlzLnVuc2lnbmFibGVIZWFkZXJzLmluZGV4T2YoZSk8MH0saXNQcmVzaWduZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMucmVxdWVzdC5oZWFkZXJzW3NdfX0pLHQuZXhwb3J0cz1yLlNpZ25lcnMuVjR9LHsiLi4vY29yZSI6MTksIi4vdjRfY3JlZGVudGlhbHMiOjcyfV0sNzI6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz17fSxpPVtdLHM9ImF3czRfcmVxdWVzdCI7dC5leHBvcnRzPXtjcmVhdGVTY29wZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuW2Uuc3Vic3RyKDAsOCksdCxuLHNdLmpvaW4oIi8iKX0sZ2V0U2lnbmluZ0tleTpmdW5jdGlvbihlLHQsbixhLGMpe3ZhciB1PVtyLnV0aWwuY3J5cHRvLmhtYWMoZS5zZWNyZXRBY2Nlc3NLZXksZS5hY2Nlc3NLZXlJZCwiYmFzZTY0IiksdCxuLGFdLmpvaW4oIl8iKTtpZigoYz0hMSE9PWMpJiZ1IGluIG8pcmV0dXJuIG9bdV07dmFyIGw9ci51dGlsLmNyeXB0by5obWFjKCJBV1M0IitlLnNlY3JldEFjY2Vzc0tleSx0LCJidWZmZXIiKSxwPXIudXRpbC5jcnlwdG8uaG1hYyhsLG4sImJ1ZmZlciIpLGQ9ci51dGlsLmNyeXB0by5obWFjKHAsYSwiYnVmZmVyIiksaD1yLnV0aWwuY3J5cHRvLmhtYWMoZCxzLCJidWZmZXIiKTtyZXR1cm4gYyYmKG9bdV09aCxpLnB1c2godSksaS5sZW5ndGg+NTAmJmRlbGV0ZSBvW2kuc2hpZnQoKV0pLGh9LGVtcHR5Q2FjaGU6ZnVuY3Rpb24oKXtvPXt9LGk9W119fX0seyIuLi9jb3JlIjoxOX1dLDczOltmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihlLHQpe3RoaXMuY3VycmVudFN0YXRlPXR8fG51bGwsdGhpcy5zdGF0ZXM9ZXx8e319ci5wcm90b3R5cGUucnVuVG89ZnVuY3Rpb24oZSx0LG4scil7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPW4sbj10LHQ9ZSxlPW51bGwpO3ZhciBvPXRoaXMsaT1vLnN0YXRlc1tvLmN1cnJlbnRTdGF0ZV07aS5mbi5jYWxsKG58fG8sciwoZnVuY3Rpb24ocil7aWYocil7aWYoIWkuZmFpbClyZXR1cm4gdD90LmNhbGwobixyKTpudWxsO28uY3VycmVudFN0YXRlPWkuZmFpbH1lbHNle2lmKCFpLmFjY2VwdClyZXR1cm4gdD90LmNhbGwobik6bnVsbDtvLmN1cnJlbnRTdGF0ZT1pLmFjY2VwdH1pZihvLmN1cnJlbnRTdGF0ZT09PWUpcmV0dXJuIHQ/dC5jYWxsKG4scik6bnVsbDtvLnJ1blRvKGUsdCxuLHIpfSkpfSxyLnByb3RvdHlwZS5hZGRTdGF0ZT1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD8ocj10LHQ9bnVsbCxuPW51bGwpOiJmdW5jdGlvbiI9PXR5cGVvZiBuJiYocj1uLG49bnVsbCksdGhpcy5jdXJyZW50U3RhdGV8fCh0aGlzLmN1cnJlbnRTdGF0ZT1lKSx0aGlzLnN0YXRlc1tlXT17YWNjZXB0OnQsZmFpbDpuLGZuOnJ9LHRoaXN9LHQuZXhwb3J0cz1yfSx7fV0sNzQ6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24obixyKXsoZnVuY3Rpb24oKXt2YXIgbyxpPXtlbnZpcm9ubWVudDoibm9kZWpzIixlbmdpbmU6ZnVuY3Rpb24oKXtpZihpLmlzQnJvd3NlcigpJiYidW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvcilyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudDt2YXIgZT1uLnBsYXRmb3JtKyIvIituLnZlcnNpb247cmV0dXJuIG4uZW52LkFXU19FWEVDVVRJT05fRU5WJiYoZSs9IiBleGVjLWVudi8iK24uZW52LkFXU19FWEVDVVRJT05fRU5WKSxlfSx1c2VyQWdlbnQ6ZnVuY3Rpb24oKXt2YXIgdD1pLmVudmlyb25tZW50LG49ImF3cy1zZGstIit0KyIvIitlKCIuL2NvcmUiKS5WRVJTSU9OO3JldHVybiJub2RlanMiPT09dCYmKG4rPSIgIitpLmVuZ2luZSgpKSxufSx1cmlFc2NhcGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZW5jb2RlVVJJQ29tcG9uZW50KGUpO3JldHVybiB0PSh0PXQucmVwbGFjZSgvW15BLVphLXowLTlfLn5cLSVdKy9nLGVzY2FwZSkpLnJlcGxhY2UoL1sqXS9nLChmdW5jdGlvbihlKXtyZXR1cm4iJSIrZS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSkpfSx1cmlFc2NhcGVQYXRoOmZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybiBpLmFycmF5RWFjaChlLnNwbGl0KCIvIiksKGZ1bmN0aW9uKGUpe3QucHVzaChpLnVyaUVzY2FwZShlKSl9KSksdC5qb2luKCIvIil9LHVybFBhcnNlOmZ1bmN0aW9uKGUpe3JldHVybiBpLnVybC5wYXJzZShlKX0sdXJsRm9ybWF0OmZ1bmN0aW9uKGUpe3JldHVybiBpLnVybC5mb3JtYXQoZSl9LHF1ZXJ5U3RyaW5nUGFyc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGkucXVlcnlzdHJpbmcucGFyc2UoZSl9LHF1ZXJ5UGFyYW1zVG9TdHJpbmc6ZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1pLnVyaUVzY2FwZSxyPU9iamVjdC5rZXlzKGUpLnNvcnQoKTtyZXR1cm4gaS5hcnJheUVhY2gociwoZnVuY3Rpb24ocil7dmFyIG89ZVtyXSxzPW4ociksYT1zKyI9IjtpZihBcnJheS5pc0FycmF5KG8pKXt2YXIgYz1bXTtpLmFycmF5RWFjaChvLChmdW5jdGlvbihlKXtjLnB1c2gobihlKSl9KSksYT1zKyI9IitjLnNvcnQoKS5qb2luKCImIitzKyI9Iil9ZWxzZSBudWxsIT1vJiYoYT1zKyI9IituKG8pKTt0LnB1c2goYSl9KSksdC5qb2luKCImIil9LHJlYWRGaWxlU3luYzpmdW5jdGlvbih0KXtyZXR1cm4gaS5pc0Jyb3dzZXIoKT9udWxsOmUoImZzIikucmVhZEZpbGVTeW5jKHQsInV0Zi04Iil9LGJhc2U2NDp7ZW5jb2RlOmZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiPT10eXBlb2YgZSl0aHJvdyBpLmVycm9yKG5ldyBFcnJvcigiQ2Fubm90IGJhc2U2NCBlbmNvZGUgbnVtYmVyICIrZSkpO3JldHVybiBudWxsPT1lP2U6aS5idWZmZXIudG9CdWZmZXIoZSkudG9TdHJpbmcoImJhc2U2NCIpfSxkZWNvZGU6ZnVuY3Rpb24oZSl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IGkuZXJyb3IobmV3IEVycm9yKCJDYW5ub3QgYmFzZTY0IGRlY29kZSBudW1iZXIgIitlKSk7cmV0dXJuIG51bGw9PWU/ZTppLmJ1ZmZlci50b0J1ZmZlcihlLCJiYXNlNjQiKX19LGJ1ZmZlcjp7dG9CdWZmZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgaS5CdWZmZXIuZnJvbSYmaS5CdWZmZXIuZnJvbSE9PVVpbnQ4QXJyYXkuZnJvbT9pLkJ1ZmZlci5mcm9tKGUsdCk6bmV3IGkuQnVmZmVyKGUsdCl9LGFsbG9jOmZ1bmN0aW9uKGUsdCxuKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJzaXplIHBhc3NlZCB0byBhbGxvYyBtdXN0IGJlIGEgbnVtYmVyLiIpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBpLkJ1ZmZlci5hbGxvYylyZXR1cm4gaS5CdWZmZXIuYWxsb2MoZSx0LG4pO3ZhciByPW5ldyBpLkJ1ZmZlcihlKTtyZXR1cm4gdm9pZCAwIT09dCYmImZ1bmN0aW9uIj09dHlwZW9mIHIuZmlsbCYmci5maWxsKHQsdm9pZCAwLHZvaWQgMCxuKSxyfSx0b1N0cmVhbTpmdW5jdGlvbihlKXtpLkJ1ZmZlci5pc0J1ZmZlcihlKXx8KGU9aS5idWZmZXIudG9CdWZmZXIoZSkpO3ZhciB0PW5ldyBpLnN0cmVhbS5SZWFkYWJsZSxuPTA7cmV0dXJuIHQuX3JlYWQ9ZnVuY3Rpb24ocil7aWYobj49ZS5sZW5ndGgpcmV0dXJuIHQucHVzaChudWxsKTt2YXIgbz1uK3I7bz5lLmxlbmd0aCYmKG89ZS5sZW5ndGgpLHQucHVzaChlLnNsaWNlKG4sbykpLG49b30sdH0sY29uY2F0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scj0wLG89MDtmb3Iobj0wO248ZS5sZW5ndGg7bisrKXIrPWVbbl0ubGVuZ3RoO2Zvcih0PWkuYnVmZmVyLmFsbG9jKHIpLG49MDtuPGUubGVuZ3RoO24rKyllW25dLmNvcHkodCxvKSxvKz1lW25dLmxlbmd0aDtyZXR1cm4gdH19LHN0cmluZzp7Ynl0ZUxlbmd0aDpmdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiAwO2lmKCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9aS5idWZmZXIudG9CdWZmZXIodCkpLCJudW1iZXIiPT10eXBlb2YgdC5ieXRlTGVuZ3RoKXJldHVybiB0LmJ5dGVMZW5ndGg7aWYoIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aClyZXR1cm4gdC5sZW5ndGg7aWYoIm51bWJlciI9PXR5cGVvZiB0LnNpemUpcmV0dXJuIHQuc2l6ZTtpZigic3RyaW5nIj09dHlwZW9mIHQucGF0aClyZXR1cm4gZSgiZnMiKS5sc3RhdFN5bmModC5wYXRoKS5zaXplO3Rocm93IGkuZXJyb3IobmV3IEVycm9yKCJDYW5ub3QgZGV0ZXJtaW5lIGxlbmd0aCBvZiAiK3QpLHtvYmplY3Q6dH0pfSx1cHBlckZpcnN0OmZ1bmN0aW9uKGUpe3JldHVybiBlWzBdLnRvVXBwZXJDYXNlKCkrZS5zdWJzdHIoMSl9LGxvd2VyRmlyc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF0udG9Mb3dlckNhc2UoKStlLnN1YnN0cigxKX19LGluaTp7cGFyc2U6ZnVuY3Rpb24oZSl7dmFyIHQsbj17fTtyZXR1cm4gaS5hcnJheUVhY2goZS5zcGxpdCgvXHI/XG4vKSwoZnVuY3Rpb24oZSl7aWYoIlsiPT09KGU9ZS5zcGxpdCgvKF58XHMpWzsjXS8pWzBdLnRyaW0oKSlbMF0mJiJdIj09PWVbZS5sZW5ndGgtMV0pe2lmKCJfX3Byb3RvX18iPT09KHQ9ZS5zdWJzdHJpbmcoMSxlLmxlbmd0aC0xKSl8fCJfX3Byb3RvX18iPT09dC5zcGxpdCgvXHMvKVsxXSl0aHJvdyBpLmVycm9yKG5ldyBFcnJvcigiQ2Fubm90IGxvYWQgcHJvZmlsZSBuYW1lICciK3QrIicgZnJvbSBzaGFyZWQgaW5pIGZpbGUuIikpfWVsc2UgaWYodCl7dmFyIHI9ZS5pbmRleE9mKCI9Iiksbz1lLmxlbmd0aC0xO2lmKC0xIT09ciYmMCE9PXImJnIhPT1vKXt2YXIgcz1lLnN1YnN0cmluZygwLHIpLnRyaW0oKSxhPWUuc3Vic3RyaW5nKHIrMSkudHJpbSgpO25bdF09blt0XXx8e30sblt0XVtzXT1hfX19KSksbn19LGZuOntub29wOmZ1bmN0aW9uKCl7fSxjYWxsYmFjazpmdW5jdGlvbihlKXtpZihlKXRocm93IGV9LG1ha2VBc3luYzpmdW5jdGlvbihlLHQpe3JldHVybiB0JiZ0PD1lLmxlbmd0aD9lOmZ1bmN0aW9uKCl7dmFyIHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApO3QucG9wKCkoZS5hcHBseShudWxsLHQpKX19fSxkYXRlOntnZXREYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIG98fChvPWUoIi4vY29yZSIpKSxvLmNvbmZpZy5zeXN0ZW1DbG9ja09mZnNldD9uZXcgRGF0ZSgobmV3IERhdGUpLmdldFRpbWUoKStvLmNvbmZpZy5zeXN0ZW1DbG9ja09mZnNldCk6bmV3IERhdGV9LGlzbzg2MDE6ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPWkuZGF0ZS5nZXREYXRlKCkpLGUudG9JU09TdHJpbmcoKS5yZXBsYWNlKC9cLlxkezN9WiQvLCJaIil9LHJmYzgyMjpmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9aS5kYXRlLmdldERhdGUoKSksZS50b1VUQ1N0cmluZygpfSx1bml4VGltZXN0YW1wOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1pLmRhdGUuZ2V0RGF0ZSgpKSxlLmdldFRpbWUoKS8xZTN9LGZyb206ZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlP25ldyBEYXRlKDFlMyplKTpuZXcgRGF0ZShlKX0sZm9ybWF0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fCh0PSJpc284NjAxIiksaS5kYXRlW3RdKGkuZGF0ZS5mcm9tKGUpKX0scGFyc2VUaW1lc3RhbXA6ZnVuY3Rpb24oZSl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiBuZXcgRGF0ZSgxZTMqZSk7aWYoZS5tYXRjaCgvXlxkKyQvKSlyZXR1cm4gbmV3IERhdGUoMWUzKmUpO2lmKGUubWF0Y2goL15cZHs0fS8pKXJldHVybiBuZXcgRGF0ZShlKTtpZihlLm1hdGNoKC9eXHd7M30sLykpcmV0dXJuIG5ldyBEYXRlKGUpO3Rocm93IGkuZXJyb3IobmV3IEVycm9yKCJ1bmhhbmRsZWQgdGltZXN0YW1wIGZvcm1hdDogIitlKSx7Y29kZToiVGltZXN0YW1wUGFyc2VyRXJyb3IifSl9fSxjcnlwdG86e2NyYzMyVGFibGU6WzAsMTk5Njk1OTg5NCwzOTkzOTE5Nzg4LDI1Njc1MjQ3OTQsMTI0NjM0MTM3LDE4ODYwNTc2MTUsMzkxNTYyMTY4NSwyNjU3MzkyMDM1LDI0OTI2ODI3NCwyMDQ0NTA4MzI0LDM3NzIxMTUyMzAsMjU0NzE3Nzg2NCwxNjI5NDE5OTUsMjEyNTU2MTAyMSwzODg3NjA3MDQ3LDI0Mjg0NDQwNDksNDk4NTM2NTQ4LDE3ODk5Mjc2NjYsNDA4OTAxNjY0OCwyMjI3MDYxMjE0LDQ1MDU0ODg2MSwxODQzMjU4NjAzLDQxMDc1ODA3NTMsMjIxMTY3NzYzOSwzMjU4ODM5OTAsMTY4NDc3NzE1Miw0MjUxMTIyMDQyLDIzMjE5MjY2MzYsMzM1NjMzNDg3LDE2NjEzNjU0NjUsNDE5NTMwMjc1NSwyMzY2MTE1MzE3LDk5NzA3MzA5NiwxMjgxOTUzODg2LDM1Nzk4NTUzMzIsMjcyNDY4ODI0MiwxMDA2ODg4MTQ1LDEyNTg2MDc2ODcsMzUyNDEwMTYyOSwyNzY4OTQyNDQzLDkwMTA5NzcyMiwxMTE5MDAwNjg0LDM2ODY1MTcyMDYsMjg5ODA2NTcyOCw4NTMwNDQ0NTEsMTE3MjI2NjEwMSwzNzA1MDE1NzU5LDI4ODI2MTY2NjUsNjUxNzY3OTgwLDEzNzM1MDM1NDYsMzM2OTU1NDMwNCwzMjE4MTA0NTk4LDU2NTUwNzI1MywxNDU0NjIxNzMxLDM0ODUxMTE3MDUsMzA5OTQzNjMwMyw2NzEyNjY5NzQsMTU5NDE5ODAyNCwzMzIyNzMwOTMwLDI5NzAzNDc4MTIsNzk1ODM1NTI3LDE0ODMyMzAyMjUsMzI0NDM2NzI3NSwzMDYwMTQ5NTY1LDE5OTQxNDYxOTIsMzExNTg1MzQsMjU2MzkwNzc3Miw0MDIzNzE3OTMwLDE5MDc0NTk0NjUsMTEyNjM3MjE1LDI2ODAxNTMyNTMsMzkwNDQyNzA1OSwyMDEzNzc2MjkwLDI1MTcyMjAzNiwyNTE3MjE1Mzc0LDM3NzU4MzAwNDAsMjEzNzY1Njc2MywxNDEzNzY4MTMsMjQzOTI3NzcxOSwzODY1MjcxMjk3LDE4MDIxOTU0NDQsNDc2ODY0ODY2LDIyMzgwMDEzNjgsNDA2NjUwODg3OCwxODEyMzcwOTI1LDQ1MzA5MjczMSwyMTgxNjI1MDI1LDQxMTE0NTEyMjMsMTcwNjA4ODkwMiwzMTQwNDI3MDQsMjM0NDUzMjIwMiw0MjQwMDE3NTMyLDE2NTg2NTgyNzEsMzY2NjE5OTc3LDIzNjI2NzAzMjMsNDIyNDk5NDQwNSwxMzAzNTM1OTYwLDk4NDk2MTQ4NiwyNzQ3MDA3MDkyLDM1NjkwMzc1MzgsMTI1NjE3MDgxNywxMDM3NjA0MzExLDI3NjUyMTA3MzMsMzU1NDA3OTk5NSwxMTMxMDE0NTA2LDg3OTY3OTk5NiwyOTA5MjQzNDYyLDM2NjM3NzE4NTYsMTE0MTEyNDQ2Nyw4NTU4NDIyNzcsMjg1MjgwMTYzMSwzNzA4NjQ4NjQ5LDEzNDI1MzM5NDgsNjU0NDU5MzA2LDMxODgzOTYwNDgsMzM3MzAxNTE3NCwxNDY2NDc5OTA5LDU0NDE3OTYzNSwzMTEwNTIzOTEzLDM0NjI1MjIwMTUsMTU5MTY3MTA1NCw3MDIxMzg3NzYsMjk2NjQ2MDQ1MCwzMzUyNzk5NDEyLDE1MDQ5MTg4MDcsNzgzNTUxODczLDMwODI2NDA0NDMsMzIzMzQ0Mjk4OSwzOTg4MjkyMzg0LDI1OTYyNTQ2NDYsNjIzMTcwNjgsMTk1NzgxMDg0MiwzOTM5ODQ1OTQ1LDI2NDc4MTYxMTEsODE0NzA5OTcsMTk0MzgwMzUyMywzODE0OTE4OTMwLDI0ODk1OTY4MDQsMjI1Mjc0NDMwLDIwNTM3OTAzNzYsMzgyNjE3NTc1NSwyNDY2OTA2MDEzLDE2NzgxNjc0MywyMDk3NjUxMzc3LDQwMjc1NTI1ODAsMjI2NTQ5MDM4Niw1MDM0NDQwNzIsMTc2MjA1MDgxNCw0MTUwNDE3MjQ1LDIxNTQxMjkzNTUsNDI2NTIyMjI1LDE4NTI1MDc4NzksNDI3NTMxMzUyNiwyMzEyMzE3OTIwLDI4Mjc1MzYyNiwxNzQyNTU1ODUyLDQxODk3MDgxNDMsMjM5NDg3Nzk0NSwzOTc5MTc3NjMsMTYyMjE4MzYzNywzNjA0MzkwODg4LDI3MTQ4NjY1NTgsOTUzNzI5NzMyLDEzNDAwNzY2MjYsMzUxODcxOTk4NSwyNzk3MzYwOTk5LDEwNjg4MjgzODEsMTIxOTYzODg1OSwzNjI0NzQxODUwLDI5MzY2NzUxNDgsOTA2MTg1NDYyLDEwOTA4MTI1MTIsMzc0NzY3MjAwMywyODI1Mzc5NjY5LDgyOTMyOTEzNSwxMTgxMzM1MTYxLDM0MTIxNzc4MDQsMzE2MDgzNDg0Miw2MjgwODU0MDgsMTM4MjYwNTM2NiwzNDIzMzY5MTA5LDMxMzgwNzg0NjcsNTcwNTYyMjMzLDE0MjY0MDA4MTUsMzMxNzMxNjU0MiwyOTk4NzMzNjA4LDczMzIzOTk1NCwxNTU1MjYxOTU2LDMyNjg5MzU1OTEsMzA1MDM2MDYyNSw3NTI0NTk0MDMsMTU0MTMyMDIyMSwyNjA3MDcxOTIwLDM5NjU5NzMwMzAsMTk2OTkyMjk3Miw0MDczNTQ5OCwyNjE3ODM3MjI1LDM5NDM1NzcxNTEsMTkxMzA4Nzg3Nyw4MzkwODM3MSwyNTEyMzQxNjM0LDM4MDM3NDA2OTIsMjA3NTIwODYyMiwyMTMyNjExMTIsMjQ2MzI3MjYwMywzODU1OTkwMjg1LDIwOTQ4NTQwNzEsMTk4OTU4ODgxLDIyNjIwMjkwMTIsNDA1NzI2MDYxMCwxNzU5MzU5OTkyLDUzNDQxNDE5MCwyMTc2NzE4NTQxLDQxMzkzMjkxMTUsMTg3MzgzNjAwMSw0MTQ2NjQ1NjcsMjI4MjI0ODkzNCw0Mjc5MjAwMzY4LDE3MTE2ODQ1NTQsMjg1MjgxMTE2LDI0MDU4MDE3MjcsNDE2NzIxNjc0NSwxNjM0NDY3Nzk1LDM3NjIyOTcwMSwyNjg1MDY3ODk2LDM2MDgwMDc0MDYsMTMwODkxODYxMiw5NTY1NDM5MzgsMjgwODU1NTEwNSwzNDk1OTU4MjYzLDEyMzE2MzYzMDEsMTA0NzQyNzAzNSwyOTMyOTU5ODE4LDM2NTQ3MDM4MzYsMTA4ODM1OTI3MCw5MzY5MThlMywyODQ3NzE0ODk5LDM3MzY4Mzc4MjksMTIwMjkwMDg2Myw4MTcyMzM4OTcsMzE4MzM0MjEwOCwzNDAxMjM3MTMwLDE0MDQyNzc1NTIsNjE1ODE4MTUwLDMxMzQyMDc0OTMsMzQ1MzQyMTIwMywxNDIzODU3NDQ5LDYwMTQ1MDQzMSwzMDA5ODM3NjE0LDMyOTQ3MTA0NTYsMTU2NzEwMzc0Niw3MTE5Mjg3MjQsMzAyMDY2ODQ3MSwzMjcyMzgwMDY1LDE1MTAzMzQyMzUsNzU1MTY3MTE3XSxjcmMzMjpmdW5jdGlvbihlKXt2YXIgdD1pLmNyeXB0by5jcmMzMlRhYmxlLG49LTE7InN0cmluZyI9PXR5cGVvZiBlJiYoZT1pLmJ1ZmZlci50b0J1ZmZlcihlKSk7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspbj1uPj4+OF50WzI1NSYobl5lLnJlYWRVSW50OChyKSldO3JldHVybigtMV5uKT4+PjB9LGhtYWM6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG58fChuPSJiaW5hcnkiKSwiYnVmZmVyIj09PW4mJihuPXZvaWQgMCkscnx8KHI9InNoYTI1NiIpLCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9aS5idWZmZXIudG9CdWZmZXIodCkpLGkuY3J5cHRvLmxpYi5jcmVhdGVIbWFjKHIsZSkudXBkYXRlKHQpLmRpZ2VzdChuKX0sbWQ1OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gaS5jcnlwdG8uaGFzaCgibWQ1IixlLHQsbil9LHNoYTI1NjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGkuY3J5cHRvLmhhc2goInNoYTI1NiIsZSx0LG4pfSxoYXNoOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPWkuY3J5cHRvLmNyZWF0ZUhhc2goZSk7bnx8KG49ImJpbmFyeSIpLCJidWZmZXIiPT09biYmKG49dm9pZCAwKSwic3RyaW5nIj09dHlwZW9mIHQmJih0PWkuYnVmZmVyLnRvQnVmZmVyKHQpKTt2YXIgcz1pLmFycmF5U2xpY2VGbih0KSxhPWkuQnVmZmVyLmlzQnVmZmVyKHQpO2lmKGkuaXNCcm93c2VyKCkmJiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQmJnQuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJihhPSEwKSxyJiYib2JqZWN0Ij09dHlwZW9mIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0Lm9uJiYhYSl0Lm9uKCJkYXRhIiwoZnVuY3Rpb24oZSl7by51cGRhdGUoZSl9KSksdC5vbigiZXJyb3IiLChmdW5jdGlvbihlKXtyKGUpfSkpLHQub24oImVuZCIsKGZ1bmN0aW9uKCl7cihudWxsLG8uZGlnZXN0KG4pKX0pKTtlbHNle2lmKCFyfHwhc3x8YXx8InVuZGVmaW5lZCI9PXR5cGVvZiBGaWxlUmVhZGVyKXtpLmlzQnJvd3NlcigpJiYib2JqZWN0Ij09dHlwZW9mIHQmJiFhJiYodD1uZXcgaS5CdWZmZXIobmV3IFVpbnQ4QXJyYXkodCkpKTt2YXIgYz1vLnVwZGF0ZSh0KS5kaWdlc3Qobik7cmV0dXJuIHImJnIobnVsbCxjKSxjfXZhciB1PTAsbD1uZXcgRmlsZVJlYWRlcjtsLm9uZXJyb3I9ZnVuY3Rpb24oKXtyKG5ldyBFcnJvcigiRmFpbGVkIHRvIHJlYWQgZGF0YS4iKSl9LGwub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGU9bmV3IGkuQnVmZmVyKG5ldyBVaW50OEFycmF5KGwucmVzdWx0KSk7by51cGRhdGUoZSksdSs9ZS5sZW5ndGgsbC5fY29udGludWVSZWFkaW5nKCl9LGwuX2NvbnRpbnVlUmVhZGluZz1mdW5jdGlvbigpe2lmKHU+PXQuc2l6ZSlyKG51bGwsby5kaWdlc3QobikpO2Vsc2V7dmFyIGU9dSs1MjQyODg7ZT50LnNpemUmJihlPXQuc2l6ZSksbC5yZWFkQXNBcnJheUJ1ZmZlcihzLmNhbGwodCx1LGUpKX19LGwuX2NvbnRpbnVlUmVhZGluZygpfX0sdG9IZXg6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyl0LnB1c2goKCIwIitlLmNoYXJDb2RlQXQobikudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTIsMikpO3JldHVybiB0LmpvaW4oIiIpfSxjcmVhdGVIYXNoOmZ1bmN0aW9uKGUpe3JldHVybiBpLmNyeXB0by5saWIuY3JlYXRlSGFzaChlKX19LGFib3J0Ont9LGVhY2g6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gZSlpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSYmdC5jYWxsKHRoaXMsbixlW25dKT09PWkuYWJvcnQpYnJlYWt9LGFycmF5RWFjaDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiZ0LmNhbGwodGhpcyxlW25dLHBhcnNlSW50KG4sMTApKT09PWkuYWJvcnQpYnJlYWt9LHVwZGF0ZTpmdW5jdGlvbihlLHQpe3JldHVybiBpLmVhY2godCwoZnVuY3Rpb24odCxuKXtlW3RdPW59KSksZX0sbWVyZ2U6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaS51cGRhdGUoaS5jb3B5KGUpLHQpfSxjb3B5OmZ1bmN0aW9uKGUpe2lmKG51bGw9PWUpcmV0dXJuIGU7dmFyIHQ9e307Zm9yKHZhciBuIGluIGUpdFtuXT1lW25dO3JldHVybiB0fSxpc0VtcHR5OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpKXJldHVybiExO3JldHVybiEwfSxhcnJheVNsaWNlRm46ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zbGljZXx8ZS53ZWJraXRTbGljZXx8ZS5tb3pTbGljZTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90Om51bGx9LGlzVHlwZTpmdW5jdGlvbihlLHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodD1pLnR5cGVOYW1lKHQpKSxPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk9PT0iW29iamVjdCAiK3QrIl0ifSx0eXBlTmFtZTpmdW5jdGlvbihlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwibmFtZSIpKXJldHVybiBlLm5hbWU7dmFyIHQ9ZS50b1N0cmluZygpLG49dC5tYXRjaCgvXlxzKmZ1bmN0aW9uICguKylcKC8pO3JldHVybiBuP25bMV06dH0sZXJyb3I6ZnVuY3Rpb24oZSx0KXt2YXIgbj1udWxsO2Zvcih2YXIgciBpbiJzdHJpbmciPT10eXBlb2YgZS5tZXNzYWdlJiYiIiE9PWUubWVzc2FnZSYmKCJzdHJpbmciPT10eXBlb2YgdHx8dCYmdC5tZXNzYWdlKSYmKChuPWkuY29weShlKSkubWVzc2FnZT1lLm1lc3NhZ2UpLGUubWVzc2FnZT1lLm1lc3NhZ2V8fG51bGwsInN0cmluZyI9PXR5cGVvZiB0P2UubWVzc2FnZT10OiJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXQmJihpLnVwZGF0ZShlLHQpLHQubWVzc2FnZSYmKGUubWVzc2FnZT10Lm1lc3NhZ2UpLCh0LmNvZGV8fHQubmFtZSkmJihlLmNvZGU9dC5jb2RlfHx0Lm5hbWUpLHQuc3RhY2smJihlLnN0YWNrPXQuc3RhY2spKSwiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnR5JiYoT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIm5hbWUiLHt3cml0YWJsZTohMCxlbnVtZXJhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIm1lc3NhZ2UiLHtlbnVtZXJhYmxlOiEwfSkpLGUubmFtZT1TdHJpbmcodCYmdC5uYW1lfHxlLm5hbWV8fGUuY29kZXx8IkVycm9yIiksZS50aW1lPW5ldyBEYXRlLG4mJihlLm9yaWdpbmFsRXJyb3I9biksdHx8e30paWYoIlsiPT09clswXSYmIl0iPT09cltyLmxlbmd0aC0xXSl7aWYoImNvZGUiPT09KHI9ci5zbGljZSgxLC0xKSl8fCJtZXNzYWdlIj09PXIpY29udGludWU7ZVsiWyIrcisiXSJdPSJTZWUgZXJyb3IuIityKyIgZm9yIGRldGFpbHMuIixPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLHt2YWx1ZTplW3JdfHx0JiZ0W3JdfHxuJiZuW3JdLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITB9KX1yZXR1cm4gZX0saW5oZXJpdDpmdW5jdGlvbihlLHQpe3ZhciBuPW51bGw7aWYodm9pZCAwPT09dCl0PWUsZT1PYmplY3Qsbj17fTtlbHNle3ZhciByPWZ1bmN0aW9uKCl7fTtyLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuPW5ldyByfXJldHVybiB0LmNvbnN0cnVjdG9yPT09T2JqZWN0JiYodC5jb25zdHJ1Y3Rvcj1mdW5jdGlvbigpe2lmKGUhPT1PYmplY3QpcmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSksdC5jb25zdHJ1Y3Rvci5wcm90b3R5cGU9bixpLnVwZGF0ZSh0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSx0KSx0LmNvbnN0cnVjdG9yLl9fc3VwZXJfXz1lLHQuY29uc3RydWN0b3J9LG1peGluOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50c1swXSx0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKylmb3IodmFyIG4gaW4gYXJndW1lbnRzW3RdLnByb3RvdHlwZSl7dmFyIHI9YXJndW1lbnRzW3RdLnByb3RvdHlwZVtuXTsiY29uc3RydWN0b3IiIT09biYmKGUucHJvdG90eXBlW25dPXIpfXJldHVybiBlfSxoaWRlUHJvcGVydGllczpmdW5jdGlvbihlLHQpeyJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkmJmkuYXJyYXlFYWNoKHQsKGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9KSl9LHByb3BlcnR5OmZ1bmN0aW9uKGUsdCxuLHIsbyl7dmFyIGk9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOnZvaWQgMD09PXJ8fHJ9OyJmdW5jdGlvbiIhPXR5cGVvZiBufHxvPyhpLnZhbHVlPW4saS53cml0YWJsZT0hMCk6aS5nZXQ9bixPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LGkpfSxtZW1vaXplZFByb3BlcnR5OmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPW51bGw7aS5wcm9wZXJ0eShlLHQsKGZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT1vJiYobz1uKCkpLG99KSxyKX0saG9pc3RQYXlsb2FkTWVtYmVyOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxdWVzdCxuPXQub3BlcmF0aW9uLHI9dC5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW25dLG89ci5vdXRwdXQ7aWYoby5wYXlsb2FkJiYhci5oYXNFdmVudE91dHB1dCl7dmFyIHM9by5tZW1iZXJzW28ucGF5bG9hZF0sYT1lLmRhdGFbby5wYXlsb2FkXTsic3RydWN0dXJlIj09PXMudHlwZSYmaS5lYWNoKGEsKGZ1bmN0aW9uKHQsbil7aS5wcm9wZXJ0eShlLmRhdGEsdCxuLCExKX0pKX19LGNvbXB1dGVTaGEyNTY6ZnVuY3Rpb24odCxuKXtpZihpLmlzTm9kZSgpKXt2YXIgcj1pLnN0cmVhbS5TdHJlYW0sbz1lKCJmcyIpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiByJiZ0IGluc3RhbmNlb2Ygcil7aWYoInN0cmluZyIhPXR5cGVvZiB0LnBhdGgpcmV0dXJuIG4obmV3IEVycm9yKCJOb24tZmlsZSBzdHJlYW0gb2JqZWN0cyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIFNpZ1Y0IikpO3ZhciBzPXt9OyJudW1iZXIiPT10eXBlb2YgdC5zdGFydCYmKHMuc3RhcnQ9dC5zdGFydCksIm51bWJlciI9PXR5cGVvZiB0LmVuZCYmKHMuZW5kPXQuZW5kKSx0PW8uY3JlYXRlUmVhZFN0cmVhbSh0LnBhdGgscyl9fWkuY3J5cHRvLnNoYTI1Nih0LCJoZXgiLChmdW5jdGlvbihlLHQpe2U/bihlKTpuKG51bGwsdCl9KSl9LGlzQ2xvY2tTa2V3ZWQ6ZnVuY3Rpb24oZSl7aWYoZSlyZXR1cm4gaS5wcm9wZXJ0eShvLmNvbmZpZywiaXNDbG9ja1NrZXdlZCIsTWF0aC5hYnMoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSk+PTNlNSwhMSksby5jb25maWcuaXNDbG9ja1NrZXdlZH0sYXBwbHlDbG9ja09mZnNldDpmdW5jdGlvbihlKXtlJiYoby5jb25maWcuc3lzdGVtQ2xvY2tPZmZzZXQ9ZS0obmV3IERhdGUpLmdldFRpbWUoKSl9LGV4dHJhY3RSZXF1ZXN0SWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5odHRwUmVzcG9uc2UuaGVhZGVyc1sieC1hbXotcmVxdWVzdC1pZCJdfHxlLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtem4tcmVxdWVzdGlkIl07IXQmJmUuZGF0YSYmZS5kYXRhLlJlc3BvbnNlTWV0YWRhdGEmJih0PWUuZGF0YS5SZXNwb25zZU1ldGFkYXRhLlJlcXVlc3RJZCksdCYmKGUucmVxdWVzdElkPXQpLGUuZXJyb3ImJihlLmVycm9yLnJlcXVlc3RJZD10KX0sYWRkUHJvbWlzZXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj0hMTt2b2lkIDA9PT10JiZvJiZvLmNvbmZpZyYmKHQ9by5jb25maWcuZ2V0UHJvbWlzZXNEZXBlbmRlbmN5KCkpLHZvaWQgMD09PXQmJiJ1bmRlZmluZWQiIT10eXBlb2YgUHJvbWlzZSYmKHQ9UHJvbWlzZSksImZ1bmN0aW9uIiE9dHlwZW9mIHQmJihuPSEwKSxBcnJheS5pc0FycmF5KGUpfHwoZT1bZV0pO2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgaT1lW3JdO24/aS5kZWxldGVQcm9taXNlc0Zyb21DbGFzcyYmaS5kZWxldGVQcm9taXNlc0Zyb21DbGFzcygpOmkuYWRkUHJvbWlzZXNUb0NsYXNzJiZpLmFkZFByb21pc2VzVG9DbGFzcyh0KX19LHByb21pc2lmeU1ldGhvZDpmdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMscj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3JldHVybiBuZXcgdCgoZnVuY3Rpb24odCxvKXtyLnB1c2goKGZ1bmN0aW9uKGUsbil7ZT9vKGUpOnQobil9KSksbltlXS5hcHBseShuLHIpfSkpfX0saXNEdWFsc3RhY2tBdmFpbGFibGU6ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuITE7dmFyIG49ZSgiLi4vYXBpcy9tZXRhZGF0YS5qc29uIik7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0JiYodD10LnNlcnZpY2VJZGVudGlmaWVyKSwhKCJzdHJpbmciIT10eXBlb2YgdHx8IW4uaGFzT3duUHJvcGVydHkodCl8fCFuW3RdLmR1YWxzdGFja0F2YWlsYWJsZSl9LGNhbGN1bGF0ZVJldHJ5RGVsYXk6ZnVuY3Rpb24oZSx0LG4pe3R8fCh0PXt9KTt2YXIgcj10LmN1c3RvbUJhY2tvZmZ8fG51bGw7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHIpcmV0dXJuIHIoZSxuKTt2YXIgbz0ibnVtYmVyIj09dHlwZW9mIHQuYmFzZT90LmJhc2U6MTAwO3JldHVybiBNYXRoLnJhbmRvbSgpKihNYXRoLnBvdygyLGUpKm8pfSxoYW5kbGVSZXF1ZXN0V2l0aFJldHJpZXM6ZnVuY3Rpb24oZSx0LG4pe3R8fCh0PXt9KTt2YXIgcj1vLkh0dHBDbGllbnQuZ2V0SW5zdGFuY2UoKSxzPXQuaHR0cE9wdGlvbnN8fHt9LGE9MCxjPWZ1bmN0aW9uKGUpe3ZhciByPXQubWF4UmV0cmllc3x8MDtpZihlJiYiVGltZW91dEVycm9yIj09PWUuY29kZSYmKGUucmV0cnlhYmxlPSEwKSxlJiZlLnJldHJ5YWJsZSYmYTxyKXt2YXIgbz1pLmNhbGN1bGF0ZVJldHJ5RGVsYXkoYSx0LnJldHJ5RGVsYXlPcHRpb25zLGUpO2lmKG8+PTApcmV0dXJuIGErKyx2b2lkIHNldFRpbWVvdXQodSxvKyhlLnJldHJ5QWZ0ZXJ8fDApKX1uKGUpfSx1PWZ1bmN0aW9uKCl7dmFyIHQ9IiI7ci5oYW5kbGVSZXF1ZXN0KGUscywoZnVuY3Rpb24oZSl7ZS5vbigiZGF0YSIsKGZ1bmN0aW9uKGUpe3QrPWUudG9TdHJpbmcoKX0pKSxlLm9uKCJlbmQiLChmdW5jdGlvbigpe3ZhciByPWUuc3RhdHVzQ29kZTtpZihyPDMwMCluKG51bGwsdCk7ZWxzZXt2YXIgbz0xZTMqcGFyc2VJbnQoZS5oZWFkZXJzWyJyZXRyeS1hZnRlciJdLDEwKXx8MCxzPWkuZXJyb3IobmV3IEVycm9yLHtzdGF0dXNDb2RlOnIscmV0cnlhYmxlOnI+PTUwMHx8NDI5PT09cn0pO28mJnMucmV0cnlhYmxlJiYocy5yZXRyeUFmdGVyPW8pLGMocyl9fSkpfSksYyl9O28udXRpbC5kZWZlcih1KX0sdXVpZDp7djQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSgidXVpZCIpLnY0KCl9fSxjb252ZXJ0UGF5bG9hZFRvU3RyaW5nOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxdWVzdCxuPXQub3BlcmF0aW9uLHI9dC5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW25dLm91dHB1dHx8e307ci5wYXlsb2FkJiZlLmRhdGFbci5wYXlsb2FkXSYmKGUuZGF0YVtyLnBheWxvYWRdPWUuZGF0YVtyLnBheWxvYWRdLnRvU3RyaW5nKCkpfSxkZWZlcjpmdW5jdGlvbihlKXsib2JqZWN0Ij09dHlwZW9mIG4mJiJmdW5jdGlvbiI9PXR5cGVvZiBuLm5leHRUaWNrP24ubmV4dFRpY2soZSk6ImZ1bmN0aW9uIj09dHlwZW9mIHI/cihlKTpzZXRUaW1lb3V0KGUsMCl9LGdldFJlcXVlc3RQYXlsb2FkU2hhcGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zO2lmKHQpe3ZhciBuPSh0fHx7fSlbZS5vcGVyYXRpb25dO2lmKG4mJm4uaW5wdXQmJm4uaW5wdXQucGF5bG9hZClyZXR1cm4gbi5pbnB1dC5tZW1iZXJzW24uaW5wdXQucGF5bG9hZF19fSxnZXRQcm9maWxlc0Zyb21TaGFyZWRDb25maWc6ZnVuY3Rpb24oZSx0KXt2YXIgcj17fSxvPXt9O24uZW52W2kuY29uZmlnT3B0SW5FbnZdJiYobz1lLmxvYWRGcm9tKHtpc0NvbmZpZzohMCxmaWxlbmFtZTpuLmVudltpLnNoYXJlZENvbmZpZ0ZpbGVFbnZdfSkpO3ZhciBzPXt9O3RyeXtzPWUubG9hZEZyb20oe2ZpbGVuYW1lOnR8fG4uZW52W2kuY29uZmlnT3B0SW5FbnZdJiZuLmVudltpLnNoYXJlZENyZWRlbnRpYWxzRmlsZUVudl19KX1jYXRjaChlKXtpZighbi5lbnZbaS5jb25maWdPcHRJbkVudl0pdGhyb3cgZX1mb3IodmFyIGE9MCxjPU9iamVjdC5rZXlzKG8pO2E8Yy5sZW5ndGg7YSsrKXJbY1thXV09dShyW2NbYV1dfHx7fSxvW2NbYV1dKTtmb3IoYT0wLGM9T2JqZWN0LmtleXMocyk7YTxjLmxlbmd0aDthKyspcltjW2FdXT11KHJbY1thXV18fHt9LHNbY1thXV0pO3JldHVybiByO2Z1bmN0aW9uIHUoZSx0KXtmb3IodmFyIG49MCxyPU9iamVjdC5rZXlzKHQpO248ci5sZW5ndGg7bisrKWVbcltuXV09dFtyW25dXTtyZXR1cm4gZX19LEFSTjp7dmFsaWRhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJjA9PT1lLmluZGV4T2YoImFybjoiKSYmZS5zcGxpdCgiOiIpLmxlbmd0aD49Nn0scGFyc2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zcGxpdCgiOiIpO3JldHVybntwYXJ0aXRpb246dFsxXSxzZXJ2aWNlOnRbMl0scmVnaW9uOnRbM10sYWNjb3VudElkOnRbNF0scmVzb3VyY2U6dC5zbGljZSg1KS5qb2luKCI6Iil9fSxidWlsZDpmdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lLnNlcnZpY2V8fHZvaWQgMD09PWUucmVnaW9ufHx2b2lkIDA9PT1lLmFjY291bnRJZHx8dm9pZCAwPT09ZS5yZXNvdXJjZSl0aHJvdyBpLmVycm9yKG5ldyBFcnJvcigiSW5wdXQgQVJOIG9iamVjdCBpcyBpbnZhbGlkIikpO3JldHVybiJhcm46IisoZS5wYXJ0aXRpb258fCJhd3MiKSsiOiIrZS5zZXJ2aWNlKyI6IitlLnJlZ2lvbisiOiIrZS5hY2NvdW50SWQrIjoiK2UucmVzb3VyY2V9fSxkZWZhdWx0UHJvZmlsZToiZGVmYXVsdCIsY29uZmlnT3B0SW5FbnY6IkFXU19TREtfTE9BRF9DT05GSUciLHNoYXJlZENyZWRlbnRpYWxzRmlsZUVudjoiQVdTX1NIQVJFRF9DUkVERU5USUFMU19GSUxFIixzaGFyZWRDb25maWdGaWxlRW52OiJBV1NfQ09ORklHX0ZJTEUiLGltZHNEaXNhYmxlZEVudjoiQVdTX0VDMl9NRVRBREFUQV9ESVNBQkxFRCJ9O3QuZXhwb3J0cz1pfSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpLGUoInRpbWVycyIpLnNldEltbWVkaWF0ZSl9LHsiLi4vYXBpcy9tZXRhZGF0YS5qc29uIjo0LCIuL2NvcmUiOjE5LF9wcm9jZXNzOjkxLGZzOjgyLHRpbWVyczo5OSx1dWlkOjEwMn1dLDc1OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLG89ZSgiLi4vbW9kZWwvc2hhcGUiKTtmdW5jdGlvbiBpKCl7fWZ1bmN0aW9uIHMoZSx0KXtmb3IodmFyIG49ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KSxyPTAsbz1uLmxlbmd0aDtyPG87cisrKWlmKG5bcl0ucGFyZW50Tm9kZT09PWUpcmV0dXJuIG5bcl19ZnVuY3Rpb24gYShlLHQpe3N3aXRjaCh0fHwodD17fSksdC50eXBlKXtjYXNlInN0cnVjdHVyZSI6cmV0dXJuIGMoZSx0KTtjYXNlIm1hcCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXt9LHI9dC5rZXkubmFtZXx8ImtleSIsbz10LnZhbHVlLm5hbWV8fCJ2YWx1ZSIsaT10LmZsYXR0ZW5lZD90Lm5hbWU6ImVudHJ5IixjPWUuZmlyc3RFbGVtZW50Q2hpbGQ7Yzspe2lmKGMubm9kZU5hbWU9PT1pKXt2YXIgdT1zKGMscikudGV4dENvbnRlbnQsbD1zKGMsbyk7blt1XT1hKGwsdC52YWx1ZSl9Yz1jLm5leHRFbGVtZW50U2libGluZ31yZXR1cm4gbn0oZSx0KTtjYXNlImxpc3QiOnJldHVybiBmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXSxyPXQuZmxhdHRlbmVkP3QubmFtZTp0Lm1lbWJlci5uYW1lfHwibWVtYmVyIixvPWUuZmlyc3RFbGVtZW50Q2hpbGQ7bzspby5ub2RlTmFtZT09PXImJm4ucHVzaChhKG8sdC5tZW1iZXIpKSxvPW8ubmV4dEVsZW1lbnRTaWJsaW5nO3JldHVybiBufShlLHQpO2Nhc2Ugdm9pZCAwOmNhc2UgbnVsbDpyZXR1cm4gZnVuY3Rpb24oZSl7aWYobnVsbD09ZSlyZXR1cm4iIjtpZighZS5maXJzdEVsZW1lbnRDaGlsZClyZXR1cm4gbnVsbD09PWUucGFyZW50Tm9kZS5wYXJlbnROb2RlP3t9OjA9PT1lLmNoaWxkTm9kZXMubGVuZ3RoPyIiOmUudGV4dENvbnRlbnQ7Zm9yKHZhciB0PXt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319LG49ZS5maXJzdEVsZW1lbnRDaGlsZDtuOyl7dmFyIHI9bi5ub2RlTmFtZTtPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodC5tZW1iZXJzLHIpP3QubWVtYmVyc1tyXS50eXBlPSJsaXN0Ijp0Lm1lbWJlcnNbcl09e25hbWU6cn0sbj1uLm5leHRFbGVtZW50U2libGluZ31yZXR1cm4gYyhlLHQpfShlKTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbihlLHQpe2lmKGUuZ2V0QXR0cmlidXRlKXt2YXIgbj1lLmdldEF0dHJpYnV0ZSgiZW5jb2RpbmciKTsiYmFzZTY0Ij09PW4mJih0PW5ldyBvLmNyZWF0ZSh7dHlwZTpufSkpfXZhciByPWUudGV4dENvbnRlbnQ7cmV0dXJuIiI9PT1yJiYocj1udWxsKSwiZnVuY3Rpb24iPT10eXBlb2YgdC50b1R5cGU/dC50b1R5cGUocik6cn0oZSx0KX19ZnVuY3Rpb24gYyhlLHQpe3ZhciBuPXt9O3JldHVybiBudWxsPT09ZXx8ci5lYWNoKHQubWVtYmVycywoZnVuY3Rpb24ocixvKXtpZihvLmlzWG1sQXR0cmlidXRlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZS5hdHRyaWJ1dGVzLG8ubmFtZSkpe3ZhciBpPWUuYXR0cmlidXRlc1tvLm5hbWVdLnZhbHVlO25bcl09YSh7dGV4dENvbnRlbnQ6aX0sbyl9fWVsc2V7dmFyIGM9by5mbGF0dGVuZWQ/ZTpzKGUsby5uYW1lKTtjP25bcl09YShjLG8pOm8uZmxhdHRlbmVkfHwibGlzdCIhPT1vLnR5cGV8fHQuYXBpLnhtbE5vRGVmYXVsdExpc3RzfHwobltyXT1vLmRlZmF1bHRWYWx1ZSl9fSkpLG59aS5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oZSx0KXtpZigiIj09PWUucmVwbGFjZSgvXlxzKy8sIiIpKXJldHVybnt9O3ZhciBuLG87dHJ5e2lmKHdpbmRvdy5ET01QYXJzZXIpe3RyeXtuPShuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoZSwidGV4dC94bWwiKX1jYXRjaChlKXt0aHJvdyByLmVycm9yKG5ldyBFcnJvcigiUGFyc2UgZXJyb3IgaW4gZG9jdW1lbnQiKSx7b3JpZ2luYWxFcnJvcjplLGNvZGU6IlhNTFBhcnNlckVycm9yIixyZXRyeWFibGU6ITB9KX1pZihudWxsPT09bi5kb2N1bWVudEVsZW1lbnQpdGhyb3cgci5lcnJvcihuZXcgRXJyb3IoIkNhbm5vdCBwYXJzZSBlbXB0eSBkb2N1bWVudC4iKSx7Y29kZToiWE1MUGFyc2VyRXJyb3IiLHJldHJ5YWJsZTohMH0pO3ZhciBpPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIilbMF07aWYoaSYmKGkucGFyZW50Tm9kZT09PW58fCJib2R5Ij09PWkucGFyZW50Tm9kZS5ub2RlTmFtZXx8aS5wYXJlbnROb2RlLnBhcmVudE5vZGU9PT1ufHwiYm9keSI9PT1pLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZSkpe3ZhciBjPWkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpWzBdfHxpO3Rocm93IHIuZXJyb3IobmV3IEVycm9yKGMudGV4dENvbnRlbnR8fCJQYXJzZXIgZXJyb3IgaW4gZG9jdW1lbnQiKSx7Y29kZToiWE1MUGFyc2VyRXJyb3IiLHJldHJ5YWJsZTohMH0pfX1lbHNle2lmKCF3aW5kb3cuQWN0aXZlWE9iamVjdCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBsb2FkIFhNTCBwYXJzZXIiKTtpZigobj1uZXcgd2luZG93LkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSkuYXN5bmM9ITEsIW4ubG9hZFhNTChlKSl0aHJvdyByLmVycm9yKG5ldyBFcnJvcigiUGFyc2UgZXJyb3IgaW4gZG9jdW1lbnQiKSx7Y29kZToiWE1MUGFyc2VyRXJyb3IiLHJldHJ5YWJsZTohMH0pfX1jYXRjaChlKXtvPWV9aWYobiYmbi5kb2N1bWVudEVsZW1lbnQmJiFvKXt2YXIgdT1hKG4uZG9jdW1lbnRFbGVtZW50LHQpLGw9cyhuLmRvY3VtZW50RWxlbWVudCwiUmVzcG9uc2VNZXRhZGF0YSIpO3JldHVybiBsJiYodS5SZXNwb25zZU1ldGFkYXRhPWEobCx7fSkpLHV9aWYobyl0aHJvdyByLmVycm9yKG98fG5ldyBFcnJvcix7Y29kZToiWE1MUGFyc2VyRXJyb3IiLHJldHJ5YWJsZTohMH0pO3JldHVybnt9fSx0LmV4cG9ydHM9aX0seyIuLi9tb2RlbC9zaGFwZSI6NDUsIi4uL3V0aWwiOjc0fV0sNzY6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIiksbz1lKCIuL3htbC1ub2RlIikuWG1sTm9kZSxpPWUoIi4veG1sLXRleHQiKS5YbWxUZXh0O2Z1bmN0aW9uIHMoKXt9ZnVuY3Rpb24gYShlLHQsbil7c3dpdGNoKG4udHlwZSl7Y2FzZSJzdHJ1Y3R1cmUiOnJldHVybiBmdW5jdGlvbihlLHQsbil7ci5hcnJheUVhY2gobi5tZW1iZXJOYW1lcywoZnVuY3Rpb24ocil7dmFyIGk9bi5tZW1iZXJzW3JdO2lmKCJib2R5Ij09PWkubG9jYXRpb24pe3ZhciBzPXRbcl0sdT1pLm5hbWU7aWYobnVsbCE9cylpZihpLmlzWG1sQXR0cmlidXRlKWUuYWRkQXR0cmlidXRlKHUscyk7ZWxzZSBpZihpLmZsYXR0ZW5lZClhKGUscyxpKTtlbHNle3ZhciBsPW5ldyBvKHUpO2UuYWRkQ2hpbGROb2RlKGwpLGMobCxpKSxhKGwscyxpKX19fSkpfShlLHQsbik7Y2FzZSJtYXAiOnJldHVybiBmdW5jdGlvbihlLHQsbil7dmFyIGk9bi5rZXkubmFtZXx8ImtleSIscz1uLnZhbHVlLm5hbWV8fCJ2YWx1ZSI7ci5lYWNoKHQsKGZ1bmN0aW9uKHQscil7dmFyIGM9bmV3IG8obi5mbGF0dGVuZWQ/bi5uYW1lOiJlbnRyeSIpO2UuYWRkQ2hpbGROb2RlKGMpO3ZhciB1PW5ldyBvKGkpLGw9bmV3IG8ocyk7Yy5hZGRDaGlsZE5vZGUodSksYy5hZGRDaGlsZE5vZGUobCksYSh1LHQsbi5rZXkpLGEobCxyLG4udmFsdWUpfSkpfShlLHQsbik7Y2FzZSJsaXN0IjpyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe24uZmxhdHRlbmVkP3IuYXJyYXlFYWNoKHQsKGZ1bmN0aW9uKHQpe3ZhciByPW4ubWVtYmVyLm5hbWV8fG4ubmFtZSxpPW5ldyBvKHIpO2UuYWRkQ2hpbGROb2RlKGkpLGEoaSx0LG4ubWVtYmVyKX0pKTpyLmFycmF5RWFjaCh0LChmdW5jdGlvbih0KXt2YXIgcj1uLm1lbWJlci5uYW1lfHwibWVtYmVyIixpPW5ldyBvKHIpO2UuYWRkQ2hpbGROb2RlKGkpLGEoaSx0LG4ubWVtYmVyKX0pKX0oZSx0LG4pO2RlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXtlLmFkZENoaWxkTm9kZShuZXcgaShuLnRvV2lyZUZvcm1hdCh0KSkpfShlLHQsbil9fWZ1bmN0aW9uIGMoZSx0LG4pe3ZhciByLG89InhtbG5zIjt0LnhtbE5hbWVzcGFjZVVyaT8ocj10LnhtbE5hbWVzcGFjZVVyaSx0LnhtbE5hbWVzcGFjZVByZWZpeCYmKG8rPSI6Iit0LnhtbE5hbWVzcGFjZVByZWZpeCkpOm4mJnQuYXBpLnhtbE5hbWVzcGFjZVVyaSYmKHI9dC5hcGkueG1sTmFtZXNwYWNlVXJpKSxyJiZlLmFkZEF0dHJpYnV0ZShvLHIpfXMucHJvdG90eXBlLnRvWE1MPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPW5ldyBvKG4pO3JldHVybiBjKGksdCwhMCksYShpLGUsdCksaS5jaGlsZHJlbi5sZW5ndGg+MHx8cj9pLnRvU3RyaW5nKCk6IiJ9LHQuZXhwb3J0cz1zfSx7Ii4uL3V0aWwiOjc0LCIuL3htbC1ub2RlIjo3OSwiLi94bWwtdGV4dCI6ODB9XSw3NzpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17ZXNjYXBlQXR0cmlidXRlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC8nL2csIiZhcG9zOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoLyIvZywiJnF1b3Q7Iil9fX0se31dLDc4OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXtlc2NhcGVFbGVtZW50OmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKS5yZXBsYWNlKC9cci9nLCImI3gwRDsiKS5yZXBsYWNlKC9cbi9nLCImI3gwQTsiKS5yZXBsYWNlKC9cdTAwODUvZywiJiN4ODU7IikucmVwbGFjZSgvXHUyMDI4LywiJiN4MjAyODsiKX19fSx7fV0sNzk6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2VzY2FwZS1hdHRyaWJ1dGUiKS5lc2NhcGVBdHRyaWJ1dGU7ZnVuY3Rpb24gbyhlLHQpe3ZvaWQgMD09PXQmJih0PVtdKSx0aGlzLm5hbWU9ZSx0aGlzLmNoaWxkcmVuPXQsdGhpcy5hdHRyaWJ1dGVzPXt9fW8ucHJvdG90eXBlLmFkZEF0dHJpYnV0ZT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbZV09dCx0aGlzfSxvLnByb3RvdHlwZS5hZGRDaGlsZE5vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2hpbGRyZW4ucHVzaChlKSx0aGlzfSxvLnByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXNbZV0sdGhpc30sby5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtmb3IodmFyIGU9Qm9vbGVhbih0aGlzLmNoaWxkcmVuLmxlbmd0aCksdD0iPCIrdGhpcy5uYW1lLG49dGhpcy5hdHRyaWJ1dGVzLG89MCxpPU9iamVjdC5rZXlzKG4pO288aS5sZW5ndGg7bysrKXt2YXIgcz1pW29dLGE9bltzXTtudWxsIT1hJiYodCs9IiAiK3MrJz0iJytyKCIiK2EpKyciJyl9cmV0dXJuIHQrKGU/Ij4iK3RoaXMuY2hpbGRyZW4ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS50b1N0cmluZygpfSkpLmpvaW4oIiIpKyI8LyIrdGhpcy5uYW1lKyI+IjoiLz4iKX0sdC5leHBvcnRzPXtYbWxOb2RlOm99fSx7Ii4vZXNjYXBlLWF0dHJpYnV0ZSI6Nzd9XSw4MDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vZXNjYXBlLWVsZW1lbnQiKS5lc2NhcGVFbGVtZW50O2Z1bmN0aW9uIG8oZSl7dGhpcy52YWx1ZT1lfW8ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHIoIiIrdGhpcy52YWx1ZSl9LHQuZXhwb3J0cz17WG1sVGV4dDpvfX0seyIuL2VzY2FwZS1lbGVtZW50Ijo3OH1dLDgxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24uYnl0ZUxlbmd0aD1mdW5jdGlvbihlKXt2YXIgdD1jKGUpLG49dFswXSxyPXRbMV07cmV0dXJuIDMqKG4rcikvNC1yfSxuLnRvQnl0ZUFycmF5PWZ1bmN0aW9uKGUpe3ZhciB0LG4scj1jKGUpLHM9clswXSxhPXJbMV0sdT1uZXcgaShmdW5jdGlvbihlLHQsbil7cmV0dXJuIDMqKHQrbikvNC1ufSgwLHMsYSkpLGw9MCxwPWE+MD9zLTQ6cztmb3Iobj0wO248cDtuKz00KXQ9b1tlLmNoYXJDb2RlQXQobildPDwxOHxvW2UuY2hhckNvZGVBdChuKzEpXTw8MTJ8b1tlLmNoYXJDb2RlQXQobisyKV08PDZ8b1tlLmNoYXJDb2RlQXQobiszKV0sdVtsKytdPXQ+PjE2JjI1NSx1W2wrK109dD4+OCYyNTUsdVtsKytdPTI1NSZ0O3JldHVybiAyPT09YSYmKHQ9b1tlLmNoYXJDb2RlQXQobildPDwyfG9bZS5jaGFyQ29kZUF0KG4rMSldPj40LHVbbCsrXT0yNTUmdCksMT09PWEmJih0PW9bZS5jaGFyQ29kZUF0KG4pXTw8MTB8b1tlLmNoYXJDb2RlQXQobisxKV08PDR8b1tlLmNoYXJDb2RlQXQobisyKV0+PjIsdVtsKytdPXQ+PjgmMjU1LHVbbCsrXT0yNTUmdCksdX0sbi5mcm9tQnl0ZUFycmF5PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPWUubGVuZ3RoLG89biUzLGk9W10scz0xNjM4MyxhPTAsYz1uLW87YTxjO2ErPXMpaS5wdXNoKHUoZSxhLGErcz5jP2M6YStzKSk7cmV0dXJuIDE9PT1vPyh0PWVbbi0xXSxpLnB1c2goclt0Pj4yXStyW3Q8PDQmNjNdKyI9PSIpKToyPT09byYmKHQ9KGVbbi0yXTw8OCkrZVtuLTFdLGkucHVzaChyW3Q+PjEwXStyW3Q+PjQmNjNdK3JbdDw8MiY2M10rIj0iKSksaS5qb2luKCIiKX07Zm9yKHZhciByPVtdLG89W10saT0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSxzPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixhPTA7YTw2NDsrK2EpclthXT1zW2FdLG9bcy5jaGFyQ29kZUF0KGEpXT1hO2Z1bmN0aW9uIGMoZSl7dmFyIHQ9ZS5sZW5ndGg7aWYodCU0PjApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Iik7dmFyIG49ZS5pbmRleE9mKCI9Iik7cmV0dXJuLTE9PT1uJiYobj10KSxbbixuPT09dD8wOjQtbiU0XX1mdW5jdGlvbiB1KGUsdCxuKXtmb3IodmFyIG8saSxzPVtdLGE9dDthPG47YSs9MylvPShlW2FdPDwxNiYxNjcxMTY4MCkrKGVbYSsxXTw8OCY2NTI4MCkrKDI1NSZlW2ErMl0pLHMucHVzaChyWyhpPW8pPj4xOCY2M10rcltpPj4xMiY2M10rcltpPj42JjYzXStyWzYzJmldKTtyZXR1cm4gcy5qb2luKCIiKX1vWyItIi5jaGFyQ29kZUF0KDApXT02MixvWyJfIi5jaGFyQ29kZUF0KDApXT02M30se31dLDgyOltmdW5jdGlvbihlLHQsbil7fSx7fV0sODM6W2Z1bmN0aW9uKGUsdCxuKXsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmNyZWF0ZT90LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtlLnN1cGVyXz10LGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pfTp0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtlLnN1cGVyXz10O3ZhciBuPWZ1bmN0aW9uKCl7fTtuLnByb3RvdHlwZT10LnByb3RvdHlwZSxlLnByb3RvdHlwZT1uZXcgbixlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lfX0se31dLDg0OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBlJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvcHkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmZpbGwmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnJlYWRVSW50OH19LHt9XSw4NTpbZnVuY3Rpb24oZSx0LHIpeyhmdW5jdGlvbih0LG4peyhmdW5jdGlvbigpe3ZhciBvPS8lW3NkaiVdL2c7ci5mb3JtYXQ9ZnVuY3Rpb24oZSl7aWYoIXYoZSkpe2Zvcih2YXIgdD1bXSxuPTA7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0LnB1c2goYShhcmd1bWVudHNbbl0pKTtyZXR1cm4gdC5qb2luKCIgIil9bj0xO2Zvcih2YXIgcj1hcmd1bWVudHMsaT1yLmxlbmd0aCxzPVN0cmluZyhlKS5yZXBsYWNlKG8sKGZ1bmN0aW9uKGUpe2lmKCIlJSI9PT1lKXJldHVybiIlIjtpZihuPj1pKXJldHVybiBlO3N3aXRjaChlKXtjYXNlIiVzIjpyZXR1cm4gU3RyaW5nKHJbbisrXSk7Y2FzZSIlZCI6cmV0dXJuIE51bWJlcihyW24rK10pO2Nhc2UiJWoiOnRyeXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkocltuKytdKX1jYXRjaChlKXtyZXR1cm4iW0NpcmN1bGFyXSJ9ZGVmYXVsdDpyZXR1cm4gZX19KSksYz1yW25dO248aTtjPXJbKytuXSlnKGMpfHwhUyhjKT9zKz0iICIrYzpzKz0iICIrYShjKTtyZXR1cm4gc30sci5kZXByZWNhdGU9ZnVuY3Rpb24oZSxvKXtpZih5KG4ucHJvY2VzcykpcmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHIuZGVwcmVjYXRlKGUsbykuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtpZighMD09PXQubm9EZXByZWNhdGlvbilyZXR1cm4gZTt2YXIgaT0hMTtyZXR1cm4gZnVuY3Rpb24oKXtpZighaSl7aWYodC50aHJvd0RlcHJlY2F0aW9uKXRocm93IG5ldyBFcnJvcihvKTt0LnRyYWNlRGVwcmVjYXRpb24/Y29uc29sZS50cmFjZShvKTpjb25zb2xlLmVycm9yKG8pLGk9ITB9cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX07dmFyIGkscz17fTtmdW5jdGlvbiBhKGUsdCl7dmFyIG49e3NlZW46W10sc3R5bGl6ZTp1fTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD49MyYmKG4uZGVwdGg9YXJndW1lbnRzWzJdKSxhcmd1bWVudHMubGVuZ3RoPj00JiYobi5jb2xvcnM9YXJndW1lbnRzWzNdKSxmKHQpP24uc2hvd0hpZGRlbj10OnQmJnIuX2V4dGVuZChuLHQpLHkobi5zaG93SGlkZGVuKSYmKG4uc2hvd0hpZGRlbj0hMSkseShuLmRlcHRoKSYmKG4uZGVwdGg9MikseShuLmNvbG9ycykmJihuLmNvbG9ycz0hMSkseShuLmN1c3RvbUluc3BlY3QpJiYobi5jdXN0b21JbnNwZWN0PSEwKSxuLmNvbG9ycyYmKG4uc3R5bGl6ZT1jKSxsKG4sZSxuLmRlcHRoKX1mdW5jdGlvbiBjKGUsdCl7dmFyIG49YS5zdHlsZXNbdF07cmV0dXJuIG4/IhtbIithLmNvbG9yc1tuXVswXSsibSIrZSsiG1siK2EuY29sb3JzW25dWzFdKyJtIjplfWZ1bmN0aW9uIHUoZSx0KXtyZXR1cm4gZX1mdW5jdGlvbiBsKGUsdCxuKXtpZihlLmN1c3RvbUluc3BlY3QmJnQmJlQodC5pbnNwZWN0KSYmdC5pbnNwZWN0IT09ci5pbnNwZWN0JiYoIXQuY29uc3RydWN0b3J8fHQuY29uc3RydWN0b3IucHJvdG90eXBlIT09dCkpe3ZhciBvPXQuaW5zcGVjdChuLGUpO3JldHVybiB2KG8pfHwobz1sKGUsbyxuKSksb312YXIgaT1mdW5jdGlvbihlLHQpe2lmKHkodCkpcmV0dXJuIGUuc3R5bGl6ZSgidW5kZWZpbmVkIiwidW5kZWZpbmVkIik7aWYodih0KSl7dmFyIG49IiciK0pTT04uc3RyaW5naWZ5KHQpLnJlcGxhY2UoL14ifCIkL2csIiIpLnJlcGxhY2UoLycvZywiXFwnIikucmVwbGFjZSgvXFwiL2csJyInKSsiJyI7cmV0dXJuIGUuc3R5bGl6ZShuLCJzdHJpbmciKX1yZXR1cm4gbSh0KT9lLnN0eWxpemUoIiIrdCwibnVtYmVyIik6Zih0KT9lLnN0eWxpemUoIiIrdCwiYm9vbGVhbiIpOmcodCk/ZS5zdHlsaXplKCJudWxsIiwibnVsbCIpOnZvaWQgMH0oZSx0KTtpZihpKXJldHVybiBpO3ZhciBzPU9iamVjdC5rZXlzKHQpLGE9ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXt0W2VdPSEwfSkpLHR9KHMpO2lmKGUuc2hvd0hpZGRlbiYmKHM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkpLEModCkmJihzLmluZGV4T2YoIm1lc3NhZ2UiKT49MHx8cy5pbmRleE9mKCJkZXNjcmlwdGlvbiIpPj0wKSlyZXR1cm4gcCh0KTtpZigwPT09cy5sZW5ndGgpe2lmKFQodCkpe3ZhciBjPXQubmFtZT8iOiAiK3QubmFtZToiIjtyZXR1cm4gZS5zdHlsaXplKCJbRnVuY3Rpb24iK2MrIl0iLCJzcGVjaWFsIil9aWYoRSh0KSlyZXR1cm4gZS5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSwicmVnZXhwIik7aWYoYih0KSlyZXR1cm4gZS5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCksImRhdGUiKTtpZihDKHQpKXJldHVybiBwKHQpfXZhciB1LFM9IiIsST0hMSxBPVsieyIsIn0iXTtyZXR1cm4gaCh0KSYmKEk9ITAsQT1bIlsiLCJdIl0pLFQodCkmJihTPSIgW0Z1bmN0aW9uIisodC5uYW1lPyI6ICIrdC5uYW1lOiIiKSsiXSIpLEUodCkmJihTPSIgIitSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLGIodCkmJihTPSIgIitEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHQpKSxDKHQpJiYoUz0iICIrcCh0KSksMCE9PXMubGVuZ3RofHxJJiYwIT10Lmxlbmd0aD9uPDA/RSh0KT9lLnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLCJyZWdleHAiKTplLnN0eWxpemUoIltPYmplY3RdIiwic3BlY2lhbCIpOihlLnNlZW4ucHVzaCh0KSx1PUk/ZnVuY3Rpb24oZSx0LG4scixvKXtmb3IodmFyIGk9W10scz0wLGE9dC5sZW5ndGg7czxhOysrcyl3KHQsU3RyaW5nKHMpKT9pLnB1c2goZChlLHQsbixyLFN0cmluZyhzKSwhMCkpOmkucHVzaCgiIik7cmV0dXJuIG8uZm9yRWFjaCgoZnVuY3Rpb24obyl7by5tYXRjaCgvXlxkKyQvKXx8aS5wdXNoKGQoZSx0LG4scixvLCEwKSl9KSksaX0oZSx0LG4sYSxzKTpzLm1hcCgoZnVuY3Rpb24ocil7cmV0dXJuIGQoZSx0LG4sYSxyLEkpfSkpLGUuc2Vlbi5wb3AoKSxmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuaW5kZXhPZigiXG4iKSxlK3QucmVwbGFjZSgvXHUwMDFiXFtcZFxkP20vZywiIikubGVuZ3RoKzF9KSwwKTtyZXR1cm4gcj42MD9uWzBdKygiIj09PXQ/IiI6dCsiXG4gIikrIiAiK2Uuam9pbigiLFxuICAiKSsiICIrblsxXTpuWzBdK3QrIiAiK2Uuam9pbigiLCAiKSsiICIrblsxXX0odSxTLEEpKTpBWzBdK1MrQVsxXX1mdW5jdGlvbiBwKGUpe3JldHVybiJbIitFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSsiXSJ9ZnVuY3Rpb24gZChlLHQsbixyLG8saSl7dmFyIHMsYSxjO2lmKChjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxvKXx8e3ZhbHVlOnRbb119KS5nZXQ/YT1jLnNldD9lLnN0eWxpemUoIltHZXR0ZXIvU2V0dGVyXSIsInNwZWNpYWwiKTplLnN0eWxpemUoIltHZXR0ZXJdIiwic3BlY2lhbCIpOmMuc2V0JiYoYT1lLnN0eWxpemUoIltTZXR0ZXJdIiwic3BlY2lhbCIpKSx3KHIsbyl8fChzPSJbIitvKyJdIiksYXx8KGUuc2Vlbi5pbmRleE9mKGMudmFsdWUpPDA/KGE9ZyhuKT9sKGUsYy52YWx1ZSxudWxsKTpsKGUsYy52YWx1ZSxuLTEpKS5pbmRleE9mKCJcbiIpPi0xJiYoYT1pP2Euc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbihlKXtyZXR1cm4iICAiK2V9KSkuam9pbigiXG4iKS5zdWJzdHIoMik6IlxuIithLnNwbGl0KCJcbiIpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIiAgICIrZX0pKS5qb2luKCJcbiIpKTphPWUuc3R5bGl6ZSgiW0NpcmN1bGFyXSIsInNwZWNpYWwiKSkseShzKSl7aWYoaSYmby5tYXRjaCgvXlxkKyQvKSlyZXR1cm4gYTsocz1KU09OLnN0cmluZ2lmeSgiIitvKSkubWF0Y2goL14iKFthLXpBLVpfXVthLXpBLVpfMC05XSopIiQvKT8ocz1zLnN1YnN0cigxLHMubGVuZ3RoLTIpLHM9ZS5zdHlsaXplKHMsIm5hbWUiKSk6KHM9cy5yZXBsYWNlKC8nL2csIlxcJyIpLnJlcGxhY2UoL1xcIi9nLCciJykucmVwbGFjZSgvKF4ifCIkKS9nLCInIikscz1lLnN0eWxpemUocywic3RyaW5nIikpfXJldHVybiBzKyI6ICIrYX1mdW5jdGlvbiBoKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpfWZ1bmN0aW9uIGYoZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZX1mdW5jdGlvbiBnKGUpe3JldHVybiBudWxsPT09ZX1mdW5jdGlvbiBtKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZX1mdW5jdGlvbiB2KGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX1mdW5jdGlvbiB5KGUpe3JldHVybiB2b2lkIDA9PT1lfWZ1bmN0aW9uIEUoZSl7cmV0dXJuIFMoZSkmJiJbb2JqZWN0IFJlZ0V4cF0iPT09SShlKX1mdW5jdGlvbiBTKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWV9ZnVuY3Rpb24gYihlKXtyZXR1cm4gUyhlKSYmIltvYmplY3QgRGF0ZV0iPT09SShlKX1mdW5jdGlvbiBDKGUpe3JldHVybiBTKGUpJiYoIltvYmplY3QgRXJyb3JdIj09PUkoZSl8fGUgaW5zdGFuY2VvZiBFcnJvcil9ZnVuY3Rpb24gVChlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX1mdW5jdGlvbiBJKGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gQShlKXtyZXR1cm4gZTwxMD8iMCIrZS50b1N0cmluZygxMCk6ZS50b1N0cmluZygxMCl9ci5kZWJ1Z2xvZz1mdW5jdGlvbihlKXtpZih5KGkpJiYoaT10LmVudi5OT0RFX0RFQlVHfHwiIiksZT1lLnRvVXBwZXJDYXNlKCksIXNbZV0paWYobmV3IFJlZ0V4cCgiXFxiIitlKyJcXGIiLCJpIikudGVzdChpKSl7dmFyIG49dC5waWQ7c1tlXT1mdW5jdGlvbigpe3ZhciB0PXIuZm9ybWF0LmFwcGx5KHIsYXJndW1lbnRzKTtjb25zb2xlLmVycm9yKCIlcyAlZDogJXMiLGUsbix0KX19ZWxzZSBzW2VdPWZ1bmN0aW9uKCl7fTtyZXR1cm4gc1tlXX0sci5pbnNwZWN0PWEsYS5jb2xvcnM9e2JvbGQ6WzEsMjJdLGl0YWxpYzpbMywyM10sdW5kZXJsaW5lOls0LDI0XSxpbnZlcnNlOls3LDI3XSx3aGl0ZTpbMzcsMzldLGdyZXk6WzkwLDM5XSxibGFjazpbMzAsMzldLGJsdWU6WzM0LDM5XSxjeWFuOlszNiwzOV0sZ3JlZW46WzMyLDM5XSxtYWdlbnRhOlszNSwzOV0scmVkOlszMSwzOV0seWVsbG93OlszMywzOV19LGEuc3R5bGVzPXtzcGVjaWFsOiJjeWFuIixudW1iZXI6InllbGxvdyIsYm9vbGVhbjoieWVsbG93Iix1bmRlZmluZWQ6ImdyZXkiLG51bGw6ImJvbGQiLHN0cmluZzoiZ3JlZW4iLGRhdGU6Im1hZ2VudGEiLHJlZ2V4cDoicmVkIn0sci5pc0FycmF5PWgsci5pc0Jvb2xlYW49ZixyLmlzTnVsbD1nLHIuaXNOdWxsT3JVbmRlZmluZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWV9LHIuaXNOdW1iZXI9bSxyLmlzU3RyaW5nPXYsci5pc1N5bWJvbD1mdW5jdGlvbihlKXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIGV9LHIuaXNVbmRlZmluZWQ9eSxyLmlzUmVnRXhwPUUsci5pc09iamVjdD1TLHIuaXNEYXRlPWIsci5pc0Vycm9yPUMsci5pc0Z1bmN0aW9uPVQsci5pc1ByaW1pdGl2ZT1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWV8fCJib29sZWFuIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZXx8InN0cmluZyI9PXR5cGVvZiBlfHwic3ltYm9sIj09dHlwZW9mIGV8fHZvaWQgMD09PWV9LHIuaXNCdWZmZXI9ZSgiLi9zdXBwb3J0L2lzQnVmZmVyIik7dmFyIF89WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXTtmdW5jdGlvbiB3KGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfXIubG9nPWZ1bmN0aW9uKCl7dmFyIGUsdDtjb25zb2xlLmxvZygiJXMgLSAlcyIsKGU9bmV3IERhdGUsdD1bQShlLmdldEhvdXJzKCkpLEEoZS5nZXRNaW51dGVzKCkpLEEoZS5nZXRTZWNvbmRzKCkpXS5qb2luKCI6IiksW2UuZ2V0RGF0ZSgpLF9bZS5nZXRNb250aCgpXSx0XS5qb2luKCIgIikpLHIuZm9ybWF0LmFwcGx5KHIsYXJndW1lbnRzKSl9LHIuaW5oZXJpdHM9ZSgiaW5oZXJpdHMiKSxyLl9leHRlbmQ9ZnVuY3Rpb24oZSx0KXtpZighdHx8IVModCkpcmV0dXJuIGU7Zm9yKHZhciBuPU9iamVjdC5rZXlzKHQpLHI9bi5sZW5ndGg7ci0tOyllW25bcl1dPXRbbltyXV07cmV0dXJuIGV9fSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpLHZvaWQgMCE9PW4uZz9uLmc6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9KX0seyIuL3N1cHBvcnQvaXNCdWZmZXIiOjg0LF9wcm9jZXNzOjkxLGluaGVyaXRzOjgzfV0sODY6W2Z1bmN0aW9uKGUsdCxyKXsoZnVuY3Rpb24odCxuKXsoZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIG49ZSgiYmFzZTY0LWpzIiksbz1lKCJpZWVlNzU0IiksaT1lKCJpc2FycmF5Iik7ZnVuY3Rpb24gcygpe3JldHVybiBjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIGEoZSx0KXtpZihzKCk8dCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gYy5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPW5ldyBVaW50OEFycmF5KHQpKS5fX3Byb3RvX189Yy5wcm90b3R5cGU6KG51bGw9PT1lJiYoZT1uZXcgYyh0KSksZS5sZW5ndGg9dCksZX1mdW5jdGlvbiBjKGUsdCxuKXtpZighKGMuVFlQRURfQVJSQVlfU1VQUE9SVHx8dGhpcyBpbnN0YW5jZW9mIGMpKXJldHVybiBuZXcgYyhlLHQsbik7aWYoIm51bWJlciI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBwKHRoaXMsZSl9cmV0dXJuIHUodGhpcyxlLHQsbil9ZnVuY3Rpb24gdShlLHQsbixyKXtpZigibnVtYmVyIj09dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9mdW5jdGlvbihlLHQsbixyKXtpZih0LmJ5dGVMZW5ndGgsbjwwfHx0LmJ5dGVMZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKHQuYnl0ZUxlbmd0aDxuKyhyfHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO3JldHVybiB0PXZvaWQgMD09PW4mJnZvaWQgMD09PXI/bmV3IFVpbnQ4QXJyYXkodCk6dm9pZCAwPT09cj9uZXcgVWludDhBcnJheSh0LG4pOm5ldyBVaW50OEFycmF5KHQsbixyKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KGU9dCkuX19wcm90b19fPWMucHJvdG90eXBlOmU9ZChlLHQpLGV9KGUsdCxuLHIpOiJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbihlLHQsbil7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYiIiE9PW58fChuPSJ1dGY4IiksIWMuaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgcj0wfGYodCxuKSxvPShlPWEoZSxyKSkud3JpdGUodCxuKTtyZXR1cm4gbyE9PXImJihlPWUuc2xpY2UoMCxvKSksZX0oZSx0LG4pOmZ1bmN0aW9uKGUsdCl7aWYoYy5pc0J1ZmZlcih0KSl7dmFyIG49MHxoKHQubGVuZ3RoKTtyZXR1cm4gMD09PShlPWEoZSxuKSkubGVuZ3RofHx0LmNvcHkoZSwwLDAsbiksZX1pZih0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIHQpcmV0dXJuIm51bWJlciIhPXR5cGVvZiB0Lmxlbmd0aHx8KHI9dC5sZW5ndGgpIT1yP2EoZSwwKTpkKGUsdCk7aWYoIkJ1ZmZlciI9PT10LnR5cGUmJmkodC5kYXRhKSlyZXR1cm4gZChlLHQuZGF0YSl9dmFyIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LiIpfShlLHQpfWZ1bmN0aW9uIGwoZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJyk7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKX1mdW5jdGlvbiBwKGUsdCl7aWYobCh0KSxlPWEoZSx0PDA/MDowfGgodCkpLCFjLlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKHZhciBuPTA7bjx0OysrbillW25dPTA7cmV0dXJuIGV9ZnVuY3Rpb24gZChlLHQpe3ZhciBuPXQubGVuZ3RoPDA/MDowfGgodC5sZW5ndGgpO2U9YShlLG4pO2Zvcih2YXIgcj0wO3I8bjtyKz0xKWVbcl09MjU1JnRbcl07cmV0dXJuIGV9ZnVuY3Rpb24gaChlKXtpZihlPj1zKCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK3MoKS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfGV9ZnVuY3Rpb24gZihlLHQpe2lmKGMuaXNCdWZmZXIoZSkpcmV0dXJuIGUubGVuZ3RoO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXcoZSl8fGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuIGUuYnl0ZUxlbmd0aDsic3RyaW5nIiE9dHlwZW9mIGUmJihlPSIiK2UpO3ZhciBuPWUubGVuZ3RoO2lmKDA9PT1uKXJldHVybiAwO2Zvcih2YXIgcj0hMTs7KXN3aXRjaCh0KXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBuO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSB2b2lkIDA6cmV0dXJuIEIoZSkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipuO2Nhc2UiaGV4IjpyZXR1cm4gbj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBqKGUpLmxlbmd0aDtkZWZhdWx0OmlmKHIpcmV0dXJuIEIoZSkubGVuZ3RoO3Q9KCIiK3QpLnRvTG93ZXJDYXNlKCkscj0hMH19ZnVuY3Rpb24gZyhlLHQsbil7dmFyIHI9ITE7aWYoKHZvaWQgMD09PXR8fHQ8MCkmJih0PTApLHQ+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PW58fG4+dGhpcy5sZW5ndGgpJiYobj10aGlzLmxlbmd0aCksbjw9MClyZXR1cm4iIjtpZigobj4+Pj0wKTw9KHQ+Pj49MCkpcmV0dXJuIiI7Zm9yKGV8fChlPSJ1dGY4Iik7Oylzd2l0Y2goZSl7Y2FzZSJoZXgiOnJldHVybiBMKHRoaXMsdCxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBfKHRoaXMsdCxuKTtjYXNlImFzY2lpIjpyZXR1cm4gUih0aGlzLHQsbik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gayh0aGlzLHQsbik7Y2FzZSJiYXNlNjQiOnJldHVybiBBKHRoaXMsdCxuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIE4odGhpcyx0LG4pO2RlZmF1bHQ6aWYocil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK2UpO2U9KGUrIiIpLnRvTG93ZXJDYXNlKCkscj0hMH19ZnVuY3Rpb24gbShlLHQsbil7dmFyIHI9ZVt0XTtlW3RdPWVbbl0sZVtuXT1yfWZ1bmN0aW9uIHYoZSx0LG4scixvKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiBuPyhyPW4sbj0wKTpuPjIxNDc0ODM2NDc/bj0yMTQ3NDgzNjQ3Om48LTIxNDc0ODM2NDgmJihuPS0yMTQ3NDgzNjQ4KSxuPStuLGlzTmFOKG4pJiYobj1vPzA6ZS5sZW5ndGgtMSksbjwwJiYobj1lLmxlbmd0aCtuKSxuPj1lLmxlbmd0aCl7aWYobylyZXR1cm4tMTtuPWUubGVuZ3RoLTF9ZWxzZSBpZihuPDApe2lmKCFvKXJldHVybi0xO249MH1pZigic3RyaW5nIj09dHlwZW9mIHQmJih0PWMuZnJvbSh0LHIpKSxjLmlzQnVmZmVyKHQpKXJldHVybiAwPT09dC5sZW5ndGg/LTE6eShlLHQsbixyLG8pO2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdCY9MjU1LGMuVFlQRURfQVJSQVlfU1VQUE9SVCYmImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/bz9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZSx0LG4pOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoZSx0LG4pOnkoZSxbdF0sbixyLG8pO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIHkoZSx0LG4scixvKXt2YXIgaSxzPTEsYT1lLmxlbmd0aCxjPXQubGVuZ3RoO2lmKHZvaWQgMCE9PXImJigidWNzMiI9PT0ocj1TdHJpbmcocikudG9Mb3dlckNhc2UoKSl8fCJ1Y3MtMiI9PT1yfHwidXRmMTZsZSI9PT1yfHwidXRmLTE2bGUiPT09cikpe2lmKGUubGVuZ3RoPDJ8fHQubGVuZ3RoPDIpcmV0dXJuLTE7cz0yLGEvPTIsYy89MixuLz0yfWZ1bmN0aW9uIHUoZSx0KXtyZXR1cm4gMT09PXM/ZVt0XTplLnJlYWRVSW50MTZCRSh0KnMpfWlmKG8pe3ZhciBsPS0xO2ZvcihpPW47aTxhO2krKylpZih1KGUsaSk9PT11KHQsLTE9PT1sPzA6aS1sKSl7aWYoLTE9PT1sJiYobD1pKSxpLWwrMT09PWMpcmV0dXJuIGwqc31lbHNlLTEhPT1sJiYoaS09aS1sKSxsPS0xfWVsc2UgZm9yKG4rYz5hJiYobj1hLWMpLGk9bjtpPj0wO2ktLSl7Zm9yKHZhciBwPSEwLGQ9MDtkPGM7ZCsrKWlmKHUoZSxpK2QpIT09dSh0LGQpKXtwPSExO2JyZWFrfWlmKHApcmV0dXJuIGl9cmV0dXJuLTF9ZnVuY3Rpb24gRShlLHQsbixyKXtuPU51bWJlcihuKXx8MDt2YXIgbz1lLmxlbmd0aC1uO3I/KHI9TnVtYmVyKHIpKT5vJiYocj1vKTpyPW87dmFyIGk9dC5sZW5ndGg7aWYoaSUyIT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO3I+aS8yJiYocj1pLzIpO2Zvcih2YXIgcz0wO3M8cjsrK3Mpe3ZhciBhPXBhcnNlSW50KHQuc3Vic3RyKDIqcywyKSwxNik7aWYoaXNOYU4oYSkpcmV0dXJuIHM7ZVtuK3NdPWF9cmV0dXJuIHN9ZnVuY3Rpb24gUyhlLHQsbixyKXtyZXR1cm4gVihCKHQsZS5sZW5ndGgtbiksZSxuLHIpfWZ1bmN0aW9uIGIoZSx0LG4scil7cmV0dXJuIFYoZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoOysrbil0LnB1c2goMjU1JmUuY2hhckNvZGVBdChuKSk7cmV0dXJuIHR9KHQpLGUsbixyKX1mdW5jdGlvbiBDKGUsdCxuLHIpe3JldHVybiBiKGUsdCxuLHIpfWZ1bmN0aW9uIFQoZSx0LG4scil7cmV0dXJuIFYoaih0KSxlLG4scil9ZnVuY3Rpb24gSShlLHQsbixyKXtyZXR1cm4gVihmdW5jdGlvbihlLHQpe2Zvcih2YXIgbixyLG8saT1bXSxzPTA7czxlLmxlbmd0aCYmISgodC09Mik8MCk7KytzKXI9KG49ZS5jaGFyQ29kZUF0KHMpKT4+OCxvPW4lMjU2LGkucHVzaChvKSxpLnB1c2gocik7cmV0dXJuIGl9KHQsZS5sZW5ndGgtbiksZSxuLHIpfWZ1bmN0aW9uIEEoZSx0LHIpe3JldHVybiAwPT09dCYmcj09PWUubGVuZ3RoP24uZnJvbUJ5dGVBcnJheShlKTpuLmZyb21CeXRlQXJyYXkoZS5zbGljZSh0LHIpKX1mdW5jdGlvbiBfKGUsdCxuKXtuPU1hdGgubWluKGUubGVuZ3RoLG4pO2Zvcih2YXIgcj1bXSxvPXQ7bzxuOyl7dmFyIGkscyxhLGMsdT1lW29dLGw9bnVsbCxwPXU+MjM5PzQ6dT4yMjM/Mzp1PjE5MT8yOjE7aWYobytwPD1uKXN3aXRjaChwKXtjYXNlIDE6dTwxMjgmJihsPXUpO2JyZWFrO2Nhc2UgMjoxMjg9PSgxOTImKGk9ZVtvKzFdKSkmJihjPSgzMSZ1KTw8Nnw2MyZpKT4xMjcmJihsPWMpO2JyZWFrO2Nhc2UgMzppPWVbbysxXSxzPWVbbysyXSwxMjg9PSgxOTImaSkmJjEyOD09KDE5MiZzKSYmKGM9KDE1JnUpPDwxMnwoNjMmaSk8PDZ8NjMmcyk+MjA0NyYmKGM8NTUyOTZ8fGM+NTczNDMpJiYobD1jKTticmVhaztjYXNlIDQ6aT1lW28rMV0scz1lW28rMl0sYT1lW28rM10sMTI4PT0oMTkyJmkpJiYxMjg9PSgxOTImcykmJjEyOD09KDE5MiZhKSYmKGM9KDE1JnUpPDwxOHwoNjMmaSk8PDEyfCg2MyZzKTw8Nnw2MyZhKT42NTUzNSYmYzwxMTE0MTEyJiYobD1jKX1udWxsPT09bD8obD02NTUzMyxwPTEpOmw+NjU1MzUmJihsLT02NTUzNixyLnB1c2gobD4+PjEwJjEwMjN8NTUyOTYpLGw9NTYzMjB8MTAyMyZsKSxyLnB1c2gobCksbys9cH1yZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7aWYodDw9dylyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZSk7Zm9yKHZhciBuPSIiLHI9MDtyPHQ7KW4rPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGUuc2xpY2UocixyKz13KSk7cmV0dXJuIG59KHIpfXIuQnVmZmVyPWMsci5TbG93QnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVybitlIT1lJiYoZT0wKSxjLmFsbG9jKCtlKX0sci5JTlNQRUNUX01BWF9CWVRFUz01MCxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwIT09dC5UWVBFRF9BUlJBWV9TVVBQT1JUP3QuVFlQRURfQVJSQVlfU1VQUE9SVDpmdW5jdGlvbigpe3RyeXt2YXIgZT1uZXcgVWludDhBcnJheSgxKTtyZXR1cm4gZS5fX3Byb3RvX189e19fcHJvdG9fXzpVaW50OEFycmF5LnByb3RvdHlwZSxmb286ZnVuY3Rpb24oKXtyZXR1cm4gNDJ9fSw0Mj09PWUuZm9vKCkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnN1YmFycmF5JiYwPT09ZS5zdWJhcnJheSgxLDEpLmJ5dGVMZW5ndGh9Y2F0Y2goZSl7cmV0dXJuITF9fSgpLHIua01heExlbmd0aD1zKCksYy5wb29sU2l6ZT04MTkyLGMuX2F1Z21lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX19wcm90b19fPWMucHJvdG90eXBlLGV9LGMuZnJvbT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHUobnVsbCxlLHQsbil9LGMuVFlQRURfQVJSQVlfU1VQUE9SVCYmKGMucHJvdG90eXBlLl9fcHJvdG9fXz1VaW50OEFycmF5LnByb3RvdHlwZSxjLl9fcHJvdG9fXz1VaW50OEFycmF5LCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuc3BlY2llcyYmY1tTeW1ib2wuc3BlY2llc109PT1jJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxTeW1ib2wuc3BlY2llcyx7dmFsdWU6bnVsbCxjb25maWd1cmFibGU6ITB9KSksYy5hbGxvYz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBsKHQpLHQ8PTA/YShlLHQpOnZvaWQgMCE9PW4/InN0cmluZyI9PXR5cGVvZiByP2EoZSx0KS5maWxsKG4scik6YShlLHQpLmZpbGwobik6YShlLHQpfShudWxsLGUsdCxuKX0sYy5hbGxvY1Vuc2FmZT1mdW5jdGlvbihlKXtyZXR1cm4gcChudWxsLGUpfSxjLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihlKXtyZXR1cm4gcChudWxsLGUpfSxjLmlzQnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVybiEobnVsbD09ZXx8IWUuX2lzQnVmZmVyKX0sYy5jb21wYXJlPWZ1bmN0aW9uKGUsdCl7aWYoIWMuaXNCdWZmZXIoZSl8fCFjLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMiKTtpZihlPT09dClyZXR1cm4gMDtmb3IodmFyIG49ZS5sZW5ndGgscj10Lmxlbmd0aCxvPTAsaT1NYXRoLm1pbihuLHIpO288aTsrK28paWYoZVtvXSE9PXRbb10pe249ZVtvXSxyPXRbb107YnJlYWt9cmV0dXJuIG48cj8tMTpyPG4/MTowfSxjLmlzRW5jb2Rpbmc9ZnVuY3Rpb24oZSl7c3dpdGNoKFN0cmluZyhlKS50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LGMuY29uY2F0PWZ1bmN0aW9uKGUsdCl7aWYoIWkoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gYy5hbGxvYygwKTt2YXIgbjtpZih2b2lkIDA9PT10KWZvcih0PTAsbj0wO248ZS5sZW5ndGg7KytuKXQrPWVbbl0ubGVuZ3RoO3ZhciByPWMuYWxsb2NVbnNhZmUodCksbz0wO2ZvcihuPTA7bjxlLmxlbmd0aDsrK24pe3ZhciBzPWVbbl07aWYoIWMuaXNCdWZmZXIocykpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO3MuY29weShyLG8pLG8rPXMubGVuZ3RofXJldHVybiByfSxjLmJ5dGVMZW5ndGg9ZixjLnByb3RvdHlwZS5faXNCdWZmZXI9ITAsYy5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSUyIT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cyIpO2Zvcih2YXIgdD0wO3Q8ZTt0Kz0yKW0odGhpcyx0LHQrMSk7cmV0dXJuIHRoaXN9LGMucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9NCltKHRoaXMsdCx0KzMpLG0odGhpcyx0KzEsdCsyKTtyZXR1cm4gdGhpc30sYy5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSU4IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpO2Zvcih2YXIgdD0wO3Q8ZTt0Kz04KW0odGhpcyx0LHQrNyksbSh0aGlzLHQrMSx0KzYpLG0odGhpcyx0KzIsdCs1KSxtKHRoaXMsdCszLHQrNCk7cmV0dXJuIHRoaXN9LGMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PWU/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/Xyh0aGlzLDAsZSk6Zy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGMucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtpZighYy5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7cmV0dXJuIHRoaXM9PT1lfHwwPT09Yy5jb21wYXJlKHRoaXMsZSl9LGMucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgZT0iIix0PXIuSU5TUEVDVF9NQVhfQllURVM7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJihlPXRoaXMudG9TdHJpbmcoImhleCIsMCx0KS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+dCYmKGUrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK2UrIj4ifSxjLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKGUsdCxuLHIsbyl7aWYoIWMuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PW4mJihuPWU/ZS5sZW5ndGg6MCksdm9pZCAwPT09ciYmKHI9MCksdm9pZCAwPT09byYmKG89dGhpcy5sZW5ndGgpLHQ8MHx8bj5lLmxlbmd0aHx8cjwwfHxvPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPj1vJiZ0Pj1uKXJldHVybiAwO2lmKHI+PW8pcmV0dXJuLTE7aWYodD49bilyZXR1cm4gMTtpZih0aGlzPT09ZSlyZXR1cm4gMDtmb3IodmFyIGk9KG8+Pj49MCktKHI+Pj49MCkscz0obj4+Pj0wKS0odD4+Pj0wKSxhPU1hdGgubWluKGkscyksdT10aGlzLnNsaWNlKHIsbyksbD1lLnNsaWNlKHQsbikscD0wO3A8YTsrK3ApaWYodVtwXSE9PWxbcF0pe2k9dVtwXSxzPWxbcF07YnJlYWt9cmV0dXJuIGk8cz8tMTpzPGk/MTowfSxjLnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbihlLHQsbil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YoZSx0LG4pfSxjLnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdih0aGlzLGUsdCxuLCEwKX0sYy5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2KHRoaXMsZSx0LG4sITEpfSxjLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQsbixyKXtpZih2b2lkIDA9PT10KXI9InV0ZjgiLG49dGhpcy5sZW5ndGgsdD0wO2Vsc2UgaWYodm9pZCAwPT09biYmInN0cmluZyI9PXR5cGVvZiB0KXI9dCxuPXRoaXMubGVuZ3RoLHQ9MDtlbHNle2lmKCFpc0Zpbml0ZSh0KSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7dHw9MCxpc0Zpbml0ZShuKT8obnw9MCx2b2lkIDA9PT1yJiYocj0idXRmOCIpKToocj1uLG49dm9pZCAwKX12YXIgbz10aGlzLmxlbmd0aC10O2lmKCh2b2lkIDA9PT1ufHxuPm8pJiYobj1vKSxlLmxlbmd0aD4wJiYobjwwfHx0PDApfHx0PnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO3J8fChyPSJ1dGY4Iik7Zm9yKHZhciBpPSExOzspc3dpdGNoKHIpe2Nhc2UiaGV4IjpyZXR1cm4gRSh0aGlzLGUsdCxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBTKHRoaXMsZSx0LG4pO2Nhc2UiYXNjaWkiOnJldHVybiBiKHRoaXMsZSx0LG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIEModGhpcyxlLHQsbik7Y2FzZSJiYXNlNjQiOnJldHVybiBUKHRoaXMsZSx0LG4pO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gSSh0aGlzLGUsdCxuKTtkZWZhdWx0OmlmKGkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKTtyPSgiIityKS50b0xvd2VyQ2FzZSgpLGk9ITB9fSxjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O3ZhciB3PTQwOTY7ZnVuY3Rpb24gUihlLHQsbil7dmFyIHI9IiI7bj1NYXRoLm1pbihlLmxlbmd0aCxuKTtmb3IodmFyIG89dDtvPG47KytvKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JmVbb10pO3JldHVybiByfWZ1bmN0aW9uIGsoZSx0LG4pe3ZhciByPSIiO249TWF0aC5taW4oZS5sZW5ndGgsbik7Zm9yKHZhciBvPXQ7bzxuOysrbylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbb10pO3JldHVybiByfWZ1bmN0aW9uIEwoZSx0LG4pe3ZhciByLG89ZS5sZW5ndGg7KCF0fHx0PDApJiYodD0wKSwoIW58fG48MHx8bj5vKSYmKG49byk7Zm9yKHZhciBpPSIiLHM9dDtzPG47KytzKWkrPShyPWVbc10pPDE2PyIwIityLnRvU3RyaW5nKDE2KTpyLnRvU3RyaW5nKDE2KTtyZXR1cm4gaX1mdW5jdGlvbiBOKGUsdCxuKXtmb3IodmFyIHI9ZS5zbGljZSh0LG4pLG89IiIsaT0wO2k8ci5sZW5ndGg7aSs9MilvKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHJbaV0rMjU2KnJbaSsxXSk7cmV0dXJuIG99ZnVuY3Rpb24gTyhlLHQsbil7aWYoZSUxIT0wfHxlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKGUrdD5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gRChlLHQsbixyLG8saSl7aWYoIWMuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKHQ+b3x8dDxpKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihuK3I+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIFAoZSx0LG4scil7dDwwJiYodD02NTUzNSt0KzEpO2Zvcih2YXIgbz0wLGk9TWF0aC5taW4oZS5sZW5ndGgtbiwyKTtvPGk7KytvKWVbbitvXT0odCYyNTU8PDgqKHI/bzoxLW8pKT4+PjgqKHI/bzoxLW8pfWZ1bmN0aW9uIHgoZSx0LG4scil7dDwwJiYodD00Mjk0OTY3Mjk1K3QrMSk7Zm9yKHZhciBvPTAsaT1NYXRoLm1pbihlLmxlbmd0aC1uLDQpO288aTsrK28pZVtuK29dPXQ+Pj44KihyP286My1vKSYyNTV9ZnVuY3Rpb24gTShlLHQsbixyLG8saSl7aWYobityPmUubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIFUoZSx0LG4scixpKXtyZXR1cm4gaXx8TShlLDAsbiw0KSxvLndyaXRlKGUsdCxuLHIsMjMsNCksbis0fWZ1bmN0aW9uIEYoZSx0LG4scixpKXtyZXR1cm4gaXx8TShlLDAsbiw4KSxvLndyaXRlKGUsdCxuLHIsNTIsOCksbis4fWMucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj10aGlzLmxlbmd0aDtpZigoZT1+fmUpPDA/KGUrPXIpPDAmJihlPTApOmU+ciYmKGU9ciksKHQ9dm9pZCAwPT09dD9yOn5+dCk8MD8odCs9cik8MCYmKHQ9MCk6dD5yJiYodD1yKSx0PGUmJih0PWUpLGMuVFlQRURfQVJSQVlfU1VQUE9SVCkobj10aGlzLnN1YmFycmF5KGUsdCkpLl9fcHJvdG9fXz1jLnByb3RvdHlwZTtlbHNle3ZhciBvPXQtZTtuPW5ldyBjKG8sdm9pZCAwKTtmb3IodmFyIGk9MDtpPG87KytpKW5baV09dGhpc1tpK2VdfXJldHVybiBufSxjLnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKGUsdCxuKXtlfD0wLHR8PTAsbnx8TyhlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW2VdLG89MSxpPTA7KytpPHQmJihvKj0yNTYpOylyKz10aGlzW2UraV0qbztyZXR1cm4gcn0sYy5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fE8oZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1tlKy0tdF0sbz0xO3Q+MCYmKG8qPTI1Nik7KXIrPXRoaXNbZSstLXRdKm87cmV0dXJuIHJ9LGMucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsMSx0aGlzLmxlbmd0aCksdGhpc1tlXX0sYy5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OH0sYy5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdPDw4fHRoaXNbZSsxXX0sYy5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSw0LHRoaXMubGVuZ3RoKSwodGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNikrMTY3NzcyMTYqdGhpc1tlKzNdfSxjLnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbZV0rKHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXSl9LGMucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fE8oZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1tlXSxvPTEsaT0wOysraTx0JiYobyo9MjU2KTspcis9dGhpc1tlK2ldKm87cmV0dXJuIHI+PShvKj0xMjgpJiYoci09TWF0aC5wb3coMiw4KnQpKSxyfSxjLnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24oZSx0LG4pe2V8PTAsdHw9MCxufHxPKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXQsbz0xLGk9dGhpc1tlKy0tcl07cj4wJiYobyo9MjU2KTspaSs9dGhpc1tlKy0tcl0qbztyZXR1cm4gaT49KG8qPTEyOCkmJihpLT1NYXRoLnBvdygyLDgqdCkpLGl9LGMucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1tlXT8tMSooMjU1LXRoaXNbZV0rMSk6dGhpc1tlXX0sYy5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24oZSx0KXt0fHxPKGUsMix0aGlzLmxlbmd0aCk7dmFyIG49dGhpc1tlXXx0aGlzW2UrMV08PDg7cmV0dXJuIDMyNzY4Jm4/NDI5NDkwMTc2MHxuOm59LGMucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7dHx8TyhlLDIsdGhpcy5sZW5ndGgpO3ZhciBuPXRoaXNbZSsxXXx0aGlzW2VdPDw4O3JldHVybiAzMjc2OCZuPzQyOTQ5MDE3NjB8bjpufSxjLnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNnx0aGlzW2UrM108PDI0fSxjLnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXTw8MjR8dGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdfSxjLnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsNCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsZSwhMCwyMyw0KX0sYy5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDQsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLGUsITEsMjMsNCl9LGMucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsOCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsZSwhMCw1Miw4KX0sYy5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSw4LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyxlLCExLDUyLDgpfSxjLnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbihlLHQsbixyKXtlPStlLHR8PTAsbnw9MCxyfHxEKHRoaXMsZSx0LG4sTWF0aC5wb3coMiw4Km4pLTEsMCk7dmFyIG89MSxpPTA7Zm9yKHRoaXNbdF09MjU1JmU7KytpPG4mJihvKj0yNTYpOyl0aGlzW3QraV09ZS9vJjI1NTtyZXR1cm4gdCtufSxjLnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbihlLHQsbixyKXtlPStlLHR8PTAsbnw9MCxyfHxEKHRoaXMsZSx0LG4sTWF0aC5wb3coMiw4Km4pLTEsMCk7dmFyIG89bi0xLGk9MTtmb3IodGhpc1t0K29dPTI1NSZlOy0tbz49MCYmKGkqPTI1Nik7KXRoaXNbdCtvXT1lL2kmMjU1O3JldHVybiB0K259LGMucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8RCh0aGlzLGUsdCwxLDI1NSwwKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLHRoaXNbdF09MjU1JmUsdCsxfSxjLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsMiw2NTUzNSwwKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44KTpQKHRoaXMsZSx0LCEwKSx0KzJ9LGMucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8RCh0aGlzLGUsdCwyLDY1NTM1LDApLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOlAodGhpcyxlLHQsITEpLHQrMn0sYy5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdCszXT1lPj4+MjQsdGhpc1t0KzJdPWU+Pj4xNix0aGlzW3QrMV09ZT4+PjgsdGhpc1t0XT0yNTUmZSk6eCh0aGlzLGUsdCwhMCksdCs0fSxjLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsNCw0Mjk0OTY3Mjk1LDApLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+MjQsdGhpc1t0KzFdPWU+Pj4xNix0aGlzW3QrMl09ZT4+PjgsdGhpc1t0KzNdPTI1NSZlKTp4KHRoaXMsZSx0LCExKSx0KzR9LGMucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24oZSx0LG4scil7aWYoZT0rZSx0fD0wLCFyKXt2YXIgbz1NYXRoLnBvdygyLDgqbi0xKTtEKHRoaXMsZSx0LG4sby0xLC1vKX12YXIgaT0wLHM9MSxhPTA7Zm9yKHRoaXNbdF09MjU1JmU7KytpPG4mJihzKj0yNTYpOyllPDAmJjA9PT1hJiYwIT09dGhpc1t0K2ktMV0mJihhPTEpLHRoaXNbdCtpXT0oZS9zPj4wKS1hJjI1NTtyZXR1cm4gdCtufSxjLnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9K2UsdHw9MCwhcil7dmFyIG89TWF0aC5wb3coMiw4Km4tMSk7RCh0aGlzLGUsdCxuLG8tMSwtbyl9dmFyIGk9bi0xLHM9MSxhPTA7Zm9yKHRoaXNbdCtpXT0yNTUmZTstLWk+PTAmJihzKj0yNTYpOyllPDAmJjA9PT1hJiYwIT09dGhpc1t0K2krMV0mJihhPTEpLHRoaXNbdCtpXT0oZS9zPj4wKS1hJjI1NTtyZXR1cm4gdCtufSxjLnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8RCh0aGlzLGUsdCwxLDEyNywtMTI4KSxjLlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLGU8MCYmKGU9MjU1K2UrMSksdGhpc1t0XT0yNTUmZSx0KzF9LGMucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44KTpQKHRoaXMsZSx0LCEwKSx0KzJ9LGMucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjgsdGhpc1t0KzFdPTI1NSZlKTpQKHRoaXMsZSx0LCExKSx0KzJ9LGMucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksYy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCszXT1lPj4+MjQpOngodGhpcyxlLHQsITApLHQrNH0sYy5wcm90b3R5cGUud3JpdGVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT0yNTUmZSk6eCh0aGlzLGUsdCwhMSksdCs0fSxjLnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBVKHRoaXMsZSx0LCEwLG4pfSxjLnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBVKHRoaXMsZSx0LCExLG4pfSxjLnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gRih0aGlzLGUsdCwhMCxuKX0sYy5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIEYodGhpcyxlLHQsITEsbil9LGMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oZSx0LG4scil7aWYobnx8KG49MCkscnx8MD09PXJ8fChyPXRoaXMubGVuZ3RoKSx0Pj1lLmxlbmd0aCYmKHQ9ZS5sZW5ndGgpLHR8fCh0PTApLHI+MCYmcjxuJiYocj1uKSxyPT09bilyZXR1cm4gMDtpZigwPT09ZS5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDB8fG4+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO3I+dGhpcy5sZW5ndGgmJihyPXRoaXMubGVuZ3RoKSxlLmxlbmd0aC10PHItbiYmKHI9ZS5sZW5ndGgtdCtuKTt2YXIgbyxpPXItbjtpZih0aGlzPT09ZSYmbjx0JiZ0PHIpZm9yKG89aS0xO28+PTA7LS1vKWVbbyt0XT10aGlzW28rbl07ZWxzZSBpZihpPDFlM3x8IWMuVFlQRURfQVJSQVlfU1VQUE9SVClmb3Iobz0wO288aTsrK28pZVtvK3RdPXRoaXNbbytuXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGUsdGhpcy5zdWJhcnJheShuLG4raSksdCk7cmV0dXJuIGl9LGMucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24oZSx0LG4scil7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQ/KHI9dCx0PTAsbj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiBuJiYocj1uLG49dGhpcy5sZW5ndGgpLDE9PT1lLmxlbmd0aCl7dmFyIG89ZS5jaGFyQ29kZUF0KDApO288MjU2JiYoZT1vKX1pZih2b2lkIDAhPT1yJiYic3RyaW5nIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgciYmIWMuaXNFbmNvZGluZyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3IpfWVsc2UibnVtYmVyIj09dHlwZW9mIGUmJihlJj0yNTUpO2lmKHQ8MHx8dGhpcy5sZW5ndGg8dHx8dGhpcy5sZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYobjw9dClyZXR1cm4gdGhpczt2YXIgaTtpZih0Pj4+PTAsbj12b2lkIDA9PT1uP3RoaXMubGVuZ3RoOm4+Pj4wLGV8fChlPTApLCJudW1iZXIiPT10eXBlb2YgZSlmb3IoaT10O2k8bjsrK2kpdGhpc1tpXT1lO2Vsc2V7dmFyIHM9Yy5pc0J1ZmZlcihlKT9lOkIobmV3IGMoZSxyKS50b1N0cmluZygpKSxhPXMubGVuZ3RoO2ZvcihpPTA7aTxuLXQ7KytpKXRoaXNbaSt0XT1zW2klYV19cmV0dXJuIHRoaXN9O3ZhciBxPS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIEIoZSx0KXt2YXIgbjt0PXR8fDEvMDtmb3IodmFyIHI9ZS5sZW5ndGgsbz1udWxsLGk9W10scz0wO3M8cjsrK3Mpe2lmKChuPWUuY2hhckNvZGVBdChzKSk+NTUyOTUmJm48NTczNDQpe2lmKCFvKXtpZihuPjU2MzE5KXsodC09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYocysxPT09cil7KHQtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfW89bjtjb250aW51ZX1pZihuPDU2MzIwKXsodC09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSksbz1uO2NvbnRpbnVlfW49NjU1MzYrKG8tNTUyOTY8PDEwfG4tNTYzMjApfWVsc2UgbyYmKHQtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2lmKG89bnVsbCxuPDEyOCl7aWYoKHQtPTEpPDApYnJlYWs7aS5wdXNoKG4pfWVsc2UgaWYobjwyMDQ4KXtpZigodC09Mik8MClicmVhaztpLnB1c2gobj4+NnwxOTIsNjMmbnwxMjgpfWVsc2UgaWYobjw2NTUzNil7aWYoKHQtPTMpPDApYnJlYWs7aS5wdXNoKG4+PjEyfDIyNCxuPj42JjYzfDEyOCw2MyZufDEyOCl9ZWxzZXtpZighKG48MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigodC09NCk8MClicmVhaztpLnB1c2gobj4+MTh8MjQwLG4+PjEyJjYzfDEyOCxuPj42JjYzfDEyOCw2MyZufDEyOCl9fXJldHVybiBpfWZ1bmN0aW9uIGooZSl7cmV0dXJuIG4udG9CeXRlQXJyYXkoZnVuY3Rpb24oZSl7aWYoKGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbT9lLnRyaW0oKTplLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0oZSkucmVwbGFjZShxLCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDtlLmxlbmd0aCU0IT0wOyllKz0iPSI7cmV0dXJuIGV9KGUpKX1mdW5jdGlvbiBWKGUsdCxuLHIpe2Zvcih2YXIgbz0wO288ciYmIShvK24+PXQubGVuZ3RofHxvPj1lLmxlbmd0aCk7KytvKXRbbytuXT1lW29dO3JldHVybiBvfX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsdm9pZCAwIT09bi5nP24uZzoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30sZSgiYnVmZmVyIikuQnVmZmVyKX0seyJiYXNlNjQtanMiOjgxLGJ1ZmZlcjo4NixpZWVlNzU0Ojg4LGlzYXJyYXk6ODl9XSw4NzpbZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIoKXt0aGlzLl9ldmVudHM9dGhpcy5fZXZlbnRzfHx7fSx0aGlzLl9tYXhMaXN0ZW5lcnM9dGhpcy5fbWF4TGlzdGVuZXJzfHx2b2lkIDB9ZnVuY3Rpb24gbyhlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX1mdW5jdGlvbiBpKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWV9ZnVuY3Rpb24gcyhlKXtyZXR1cm4gdm9pZCAwPT09ZX10LmV4cG9ydHM9cixyLkV2ZW50RW1pdHRlcj1yLHIucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLHIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwLHIuZGVmYXVsdE1heExpc3RlbmVycz0xMCxyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlfHxlPDB8fGlzTmFOKGUpKXRocm93IFR5cGVFcnJvcigibiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz1lLHRoaXN9LHIucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGEsYyx1O2lmKHRoaXMuX2V2ZW50c3x8KHRoaXMuX2V2ZW50cz17fSksImVycm9yIj09PWUmJighdGhpcy5fZXZlbnRzLmVycm9yfHxpKHRoaXMuX2V2ZW50cy5lcnJvcikmJiF0aGlzLl9ldmVudHMuZXJyb3IubGVuZ3RoKSl7aWYoKHQ9YXJndW1lbnRzWzFdKWluc3RhbmNlb2YgRXJyb3IpdGhyb3cgdDt2YXIgbD1uZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCAiZXJyb3IiIGV2ZW50LiAoJyt0KyIpIik7dGhyb3cgbC5jb250ZXh0PXQsbH1pZihzKG49dGhpcy5fZXZlbnRzW2VdKSlyZXR1cm4hMTtpZihvKG4pKXN3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6bi5jYWxsKHRoaXMpO2JyZWFrO2Nhc2UgMjpuLmNhbGwodGhpcyxhcmd1bWVudHNbMV0pO2JyZWFrO2Nhc2UgMzpuLmNhbGwodGhpcyxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKTticmVhaztkZWZhdWx0OmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLG4uYXBwbHkodGhpcyxhKX1lbHNlIGlmKGkobikpZm9yKGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLHI9KHU9bi5zbGljZSgpKS5sZW5ndGgsYz0wO2M8cjtjKyspdVtjXS5hcHBseSh0aGlzLGEpO3JldHVybiEwfSxyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3ZhciBuO2lmKCFvKHQpKXRocm93IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIik7cmV0dXJuIHRoaXMuX2V2ZW50c3x8KHRoaXMuX2V2ZW50cz17fSksdGhpcy5fZXZlbnRzLm5ld0xpc3RlbmVyJiZ0aGlzLmVtaXQoIm5ld0xpc3RlbmVyIixlLG8odC5saXN0ZW5lcik/dC5saXN0ZW5lcjp0KSx0aGlzLl9ldmVudHNbZV0/aSh0aGlzLl9ldmVudHNbZV0pP3RoaXMuX2V2ZW50c1tlXS5wdXNoKHQpOnRoaXMuX2V2ZW50c1tlXT1bdGhpcy5fZXZlbnRzW2VdLHRdOnRoaXMuX2V2ZW50c1tlXT10LGkodGhpcy5fZXZlbnRzW2VdKSYmIXRoaXMuX2V2ZW50c1tlXS53YXJuZWQmJihuPXModGhpcy5fbWF4TGlzdGVuZXJzKT9yLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dGhpcy5fbWF4TGlzdGVuZXJzKSYmbj4wJiZ0aGlzLl9ldmVudHNbZV0ubGVuZ3RoPm4mJih0aGlzLl9ldmVudHNbZV0ud2FybmVkPSEwLGNvbnNvbGUuZXJyb3IoIihub2RlKSB3YXJuaW5nOiBwb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICVkIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQuIix0aGlzLl9ldmVudHNbZV0ubGVuZ3RoKSwiZnVuY3Rpb24iPT10eXBlb2YgY29uc29sZS50cmFjZSYmY29uc29sZS50cmFjZSgpKSx0aGlzfSxyLnByb3RvdHlwZS5vbj1yLnByb3RvdHlwZS5hZGRMaXN0ZW5lcixyLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKGUsdCl7aWYoIW8odCkpdGhyb3cgVHlwZUVycm9yKCJsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24iKTt2YXIgbj0hMTtmdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVMaXN0ZW5lcihlLHIpLG58fChuPSEwLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpKX1yZXR1cm4gci5saXN0ZW5lcj10LHRoaXMub24oZSxyKSx0aGlzfSxyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3ZhciBuLHIscyxhO2lmKCFvKHQpKXRocm93IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIik7aWYoIXRoaXMuX2V2ZW50c3x8IXRoaXMuX2V2ZW50c1tlXSlyZXR1cm4gdGhpcztpZihzPShuPXRoaXMuX2V2ZW50c1tlXSkubGVuZ3RoLHI9LTEsbj09PXR8fG8obi5saXN0ZW5lcikmJm4ubGlzdGVuZXI9PT10KWRlbGV0ZSB0aGlzLl9ldmVudHNbZV0sdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIixlLHQpO2Vsc2UgaWYoaShuKSl7Zm9yKGE9czthLS0gPjA7KWlmKG5bYV09PT10fHxuW2FdLmxpc3RlbmVyJiZuW2FdLmxpc3RlbmVyPT09dCl7cj1hO2JyZWFrfWlmKHI8MClyZXR1cm4gdGhpczsxPT09bi5sZW5ndGg/KG4ubGVuZ3RoPTAsZGVsZXRlIHRoaXMuX2V2ZW50c1tlXSk6bi5zcGxpY2UociwxKSx0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLGUsdCl9cmV0dXJuIHRoaXN9LHIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbihlKXt2YXIgdCxuO2lmKCF0aGlzLl9ldmVudHMpcmV0dXJuIHRoaXM7aWYoIXRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5fZXZlbnRzPXt9OnRoaXMuX2V2ZW50c1tlXSYmZGVsZXRlIHRoaXMuX2V2ZW50c1tlXSx0aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodCBpbiB0aGlzLl9ldmVudHMpInJlbW92ZUxpc3RlbmVyIiE9PXQmJnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKHQpO3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygicmVtb3ZlTGlzdGVuZXIiKSx0aGlzLl9ldmVudHM9e30sdGhpc31pZihvKG49dGhpcy5fZXZlbnRzW2VdKSl0aGlzLnJlbW92ZUxpc3RlbmVyKGUsbik7ZWxzZSBpZihuKWZvcig7bi5sZW5ndGg7KXRoaXMucmVtb3ZlTGlzdGVuZXIoZSxuW24ubGVuZ3RoLTFdKTtyZXR1cm4gZGVsZXRlIHRoaXMuX2V2ZW50c1tlXSx0aGlzfSxyLnByb3RvdHlwZS5saXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2V2ZW50cyYmdGhpcy5fZXZlbnRzW2VdP28odGhpcy5fZXZlbnRzW2VdKT9bdGhpcy5fZXZlbnRzW2VdXTp0aGlzLl9ldmVudHNbZV0uc2xpY2UoKTpbXX0sci5wcm90b3R5cGUubGlzdGVuZXJDb3VudD1mdW5jdGlvbihlKXtpZih0aGlzLl9ldmVudHMpe3ZhciB0PXRoaXMuX2V2ZW50c1tlXTtpZihvKHQpKXJldHVybiAxO2lmKHQpcmV0dXJuIHQubGVuZ3RofXJldHVybiAwfSxyLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5saXN0ZW5lckNvdW50KHQpfX0se31dLDg4OltmdW5jdGlvbihlLHQsbil7bi5yZWFkPWZ1bmN0aW9uKGUsdCxuLHIsbyl7dmFyIGkscyxhPTgqby1yLTEsYz0oMTw8YSktMSx1PWM+PjEsbD0tNyxwPW4/by0xOjAsZD1uPy0xOjEsaD1lW3QrcF07Zm9yKHArPWQsaT1oJigxPDwtbCktMSxoPj49LWwsbCs9YTtsPjA7aT0yNTYqaStlW3QrcF0scCs9ZCxsLT04KTtmb3Iocz1pJigxPDwtbCktMSxpPj49LWwsbCs9cjtsPjA7cz0yNTYqcytlW3QrcF0scCs9ZCxsLT04KTtpZigwPT09aSlpPTEtdTtlbHNle2lmKGk9PT1jKXJldHVybiBzP05hTjoxLzAqKGg/LTE6MSk7cys9TWF0aC5wb3coMixyKSxpLT11fXJldHVybihoPy0xOjEpKnMqTWF0aC5wb3coMixpLXIpfSxuLndyaXRlPWZ1bmN0aW9uKGUsdCxuLHIsbyxpKXt2YXIgcyxhLGMsdT04Kmktby0xLGw9KDE8PHUpLTEscD1sPj4xLGQ9MjM9PT1vP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxoPXI/MDppLTEsZj1yPzE6LTEsZz10PDB8fDA9PT10JiYxL3Q8MD8xOjA7Zm9yKHQ9TWF0aC5hYnModCksaXNOYU4odCl8fHQ9PT0xLzA/KGE9aXNOYU4odCk/MTowLHM9bCk6KHM9TWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMiksdCooYz1NYXRoLnBvdygyLC1zKSk8MSYmKHMtLSxjKj0yKSwodCs9cytwPj0xP2QvYzpkKk1hdGgucG93KDIsMS1wKSkqYz49MiYmKHMrKyxjLz0yKSxzK3A+PWw/KGE9MCxzPWwpOnMrcD49MT8oYT0odCpjLTEpKk1hdGgucG93KDIsbykscys9cCk6KGE9dCpNYXRoLnBvdygyLHAtMSkqTWF0aC5wb3coMixvKSxzPTApKTtvPj04O2VbbitoXT0yNTUmYSxoKz1mLGEvPTI1NixvLT04KTtmb3Iocz1zPDxvfGEsdSs9bzt1PjA7ZVtuK2hdPTI1NSZzLGgrPWYscy89MjU2LHUtPTgpO2VbbitoLWZdfD0xMjgqZ319LHt9XSw4OTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1yLmNhbGwoZSl9fSx7fV0sOTA6W2Z1bmN0aW9uKGUsdCxuKXshZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG51bGwhPT1lJiYiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIG4oZSl7cmV0dXJuIG51bGwhPT1lJiYiW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiByKGUsbyl7aWYoZT09PW8pcmV0dXJuITA7aWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pKXJldHVybiExO2lmKCEwPT09dChlKSl7aWYoZS5sZW5ndGghPT1vLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKylpZighMT09PXIoZVtpXSxvW2ldKSlyZXR1cm4hMTtyZXR1cm4hMH1pZighMD09PW4oZSkpe3ZhciBzPXt9O2Zvcih2YXIgYSBpbiBlKWlmKGhhc093blByb3BlcnR5LmNhbGwoZSxhKSl7aWYoITE9PT1yKGVbYV0sb1thXSkpcmV0dXJuITE7c1thXT0hMH1mb3IodmFyIGMgaW4gbylpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKG8sYykmJiEwIT09c1tjXSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBvKGUpe2lmKCIiPT09ZXx8ITE9PT1lfHxudWxsPT09ZSlyZXR1cm4hMDtpZih0KGUpJiYwPT09ZS5sZW5ndGgpcmV0dXJuITA7aWYobihlKSl7Zm9yKHZhciByIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShyKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX12YXIgaTtpPSJmdW5jdGlvbiI9PXR5cGVvZiBTdHJpbmcucHJvdG90eXBlLnRyaW1MZWZ0P2Z1bmN0aW9uKGUpe3JldHVybiBlLnRyaW1MZWZ0KCl9OmZ1bmN0aW9uKGUpe3JldHVybiBlLm1hdGNoKC9eXHMqKC4qKS8pWzFdfTt2YXIgcz0wLGE9MSxjPTIsdT0zLGw9NCxwPTYsZD04LGg9OSxmPXswOiJudW1iZXIiLDE6ImFueSIsMjoic3RyaW5nIiwzOiJhcnJheSIsNDoib2JqZWN0Iiw1OiJib29sZWFuIiw2OiJleHByZXNzaW9uIiw3OiJudWxsIiw4OiJBcnJheTxudW1iZXI+Iiw5OiJBcnJheTxzdHJpbmc+In0sZz0iRU9GIixtPSJVbnF1b3RlZElkZW50aWZpZXIiLHY9IlF1b3RlZElkZW50aWZpZXIiLHk9IlJicmFja2V0IixFPSJScGFyZW4iLFM9IkNvbW1hIixiPSJDb2xvbiIsQz0iUmJyYWNlIixUPSJOdW1iZXIiLEk9IkN1cnJlbnQiLEE9IkV4cHJlZiIsXz0iUGlwZSIsdz0iT3IiLFI9IkFuZCIsaz0iRVEiLEw9IkdUIixOPSJMVCIsTz0iR1RFIixEPSJMVEUiLFA9Ik5FIix4PSJGbGF0dGVuIixNPSJTdGFyIixVPSJGaWx0ZXIiLEY9IkRvdCIscT0iTm90IixCPSJMYnJhY2UiLGo9IkxicmFja2V0IixWPSJMcGFyZW4iLFc9IkxpdGVyYWwiLEc9eyIuIjpGLCIqIjpNLCIsIjpTLCI6IjpiLCJ7IjpCLCJ9IjpDLCJdIjp5LCIoIjpWLCIpIjpFLCJAIjpJfSxIPXsiPCI6ITAsIj4iOiEwLCI9IjohMCwiISI6ITB9LHo9eyIgIjohMCwiXHQiOiEwLCJcbiI6ITB9O2Z1bmN0aW9uIEsoZSl7cmV0dXJuIGU+PSIwIiYmZTw9IjkifHwiLSI9PT1lfWZ1bmN0aW9uIFgoKXt9WC5wcm90b3R5cGU9e3Rva2VuaXplOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixvLGk9W107Zm9yKHRoaXMuX2N1cnJlbnQ9MDt0aGlzLl9jdXJyZW50PGUubGVuZ3RoOylpZigobz1lW3RoaXMuX2N1cnJlbnRdKT49ImEiJiZvPD0ieiJ8fG8+PSJBIiYmbzw9IloifHwiXyI9PT1vKXQ9dGhpcy5fY3VycmVudCxuPXRoaXMuX2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXIoZSksaS5wdXNoKHt0eXBlOm0sdmFsdWU6bixzdGFydDp0fSk7ZWxzZSBpZih2b2lkIDAhPT1HW2VbdGhpcy5fY3VycmVudF1dKWkucHVzaCh7dHlwZTpHW2VbdGhpcy5fY3VycmVudF1dLHZhbHVlOmVbdGhpcy5fY3VycmVudF0sc3RhcnQ6dGhpcy5fY3VycmVudH0pLHRoaXMuX2N1cnJlbnQrKztlbHNlIGlmKEsoZVt0aGlzLl9jdXJyZW50XSkpcj10aGlzLl9jb25zdW1lTnVtYmVyKGUpLGkucHVzaChyKTtlbHNlIGlmKCJbIj09PWVbdGhpcy5fY3VycmVudF0pcj10aGlzLl9jb25zdW1lTEJyYWNrZXQoZSksaS5wdXNoKHIpO2Vsc2UgaWYoJyInPT09ZVt0aGlzLl9jdXJyZW50XSl0PXRoaXMuX2N1cnJlbnQsbj10aGlzLl9jb25zdW1lUXVvdGVkSWRlbnRpZmllcihlKSxpLnB1c2goe3R5cGU6dix2YWx1ZTpuLHN0YXJ0OnR9KTtlbHNlIGlmKCInIj09PWVbdGhpcy5fY3VycmVudF0pdD10aGlzLl9jdXJyZW50LG49dGhpcy5fY29uc3VtZVJhd1N0cmluZ0xpdGVyYWwoZSksaS5wdXNoKHt0eXBlOlcsdmFsdWU6bixzdGFydDp0fSk7ZWxzZSBpZigiYCI9PT1lW3RoaXMuX2N1cnJlbnRdKXt0PXRoaXMuX2N1cnJlbnQ7dmFyIHM9dGhpcy5fY29uc3VtZUxpdGVyYWwoZSk7aS5wdXNoKHt0eXBlOlcsdmFsdWU6cyxzdGFydDp0fSl9ZWxzZSBpZih2b2lkIDAhPT1IW2VbdGhpcy5fY3VycmVudF1dKWkucHVzaCh0aGlzLl9jb25zdW1lT3BlcmF0b3IoZSkpO2Vsc2UgaWYodm9pZCAwIT09eltlW3RoaXMuX2N1cnJlbnRdXSl0aGlzLl9jdXJyZW50Kys7ZWxzZSBpZigiJiI9PT1lW3RoaXMuX2N1cnJlbnRdKXQ9dGhpcy5fY3VycmVudCx0aGlzLl9jdXJyZW50KyssIiYiPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLGkucHVzaCh7dHlwZTpSLHZhbHVlOiImJiIsc3RhcnQ6dH0pKTppLnB1c2goe3R5cGU6QSx2YWx1ZToiJiIsc3RhcnQ6dH0pO2Vsc2V7aWYoInwiIT09ZVt0aGlzLl9jdXJyZW50XSl7dmFyIGE9bmV3IEVycm9yKCJVbmtub3duIGNoYXJhY3RlcjoiK2VbdGhpcy5fY3VycmVudF0pO3Rocm93IGEubmFtZT0iTGV4ZXJFcnJvciIsYX10PXRoaXMuX2N1cnJlbnQsdGhpcy5fY3VycmVudCsrLCJ8Ij09PWVbdGhpcy5fY3VycmVudF0/KHRoaXMuX2N1cnJlbnQrKyxpLnB1c2goe3R5cGU6dyx2YWx1ZToifHwiLHN0YXJ0OnR9KSk6aS5wdXNoKHt0eXBlOl8sdmFsdWU6InwiLHN0YXJ0OnR9KX1yZXR1cm4gaX0sX2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXI6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLl9jdXJyZW50O2Zvcih0aGlzLl9jdXJyZW50Kys7dGhpcy5fY3VycmVudDxlLmxlbmd0aCYmKCh0PWVbdGhpcy5fY3VycmVudF0pPj0iYSImJnQ8PSJ6Inx8dD49IkEiJiZ0PD0iWiJ8fHQ+PSIwIiYmdDw9IjkifHwiXyI9PT10KTspdGhpcy5fY3VycmVudCsrO3JldHVybiBlLnNsaWNlKG4sdGhpcy5fY3VycmVudCl9LF9jb25zdW1lUXVvdGVkSWRlbnRpZmllcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9jdXJyZW50O3RoaXMuX2N1cnJlbnQrKztmb3IodmFyIG49ZS5sZW5ndGg7JyInIT09ZVt0aGlzLl9jdXJyZW50XSYmdGhpcy5fY3VycmVudDxuOyl7dmFyIHI9dGhpcy5fY3VycmVudDsiXFwiIT09ZVtyXXx8IlxcIiE9PWVbcisxXSYmJyInIT09ZVtyKzFdP3IrKzpyKz0yLHRoaXMuX2N1cnJlbnQ9cn1yZXR1cm4gdGhpcy5fY3VycmVudCsrLEpTT04ucGFyc2UoZS5zbGljZSh0LHRoaXMuX2N1cnJlbnQpKX0sX2NvbnN1bWVSYXdTdHJpbmdMaXRlcmFsOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnQ7dGhpcy5fY3VycmVudCsrO2Zvcih2YXIgbj1lLmxlbmd0aDsiJyIhPT1lW3RoaXMuX2N1cnJlbnRdJiZ0aGlzLl9jdXJyZW50PG47KXt2YXIgcj10aGlzLl9jdXJyZW50OyJcXCIhPT1lW3JdfHwiXFwiIT09ZVtyKzFdJiYiJyIhPT1lW3IrMV0/cisrOnIrPTIsdGhpcy5fY3VycmVudD1yfXJldHVybiB0aGlzLl9jdXJyZW50KyssZS5zbGljZSh0KzEsdGhpcy5fY3VycmVudC0xKS5yZXBsYWNlKCJcXCciLCInIil9LF9jb25zdW1lTnVtYmVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnQ7dGhpcy5fY3VycmVudCsrO2Zvcih2YXIgbj1lLmxlbmd0aDtLKGVbdGhpcy5fY3VycmVudF0pJiZ0aGlzLl9jdXJyZW50PG47KXRoaXMuX2N1cnJlbnQrKzt2YXIgcj1wYXJzZUludChlLnNsaWNlKHQsdGhpcy5fY3VycmVudCkpO3JldHVybnt0eXBlOlQsdmFsdWU6cixzdGFydDp0fX0sX2NvbnN1bWVMQnJhY2tldDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9jdXJyZW50O3JldHVybiB0aGlzLl9jdXJyZW50KyssIj8iPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLHt0eXBlOlUsdmFsdWU6Ils/IixzdGFydDp0fSk6Il0iPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLHt0eXBlOngsdmFsdWU6IltdIixzdGFydDp0fSk6e3R5cGU6aix2YWx1ZToiWyIsc3RhcnQ6dH19LF9jb25zdW1lT3BlcmF0b3I6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fY3VycmVudCxuPWVbdF07cmV0dXJuIHRoaXMuX2N1cnJlbnQrKywiISI9PT1uPyI9Ij09PWVbdGhpcy5fY3VycmVudF0/KHRoaXMuX2N1cnJlbnQrKyx7dHlwZTpQLHZhbHVlOiIhPSIsc3RhcnQ6dH0pOnt0eXBlOnEsdmFsdWU6IiEiLHN0YXJ0OnR9OiI8Ij09PW4/Ij0iPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLHt0eXBlOkQsdmFsdWU6Ijw9IixzdGFydDp0fSk6e3R5cGU6Tix2YWx1ZToiPCIsc3RhcnQ6dH06Ij4iPT09bj8iPSI9PT1lW3RoaXMuX2N1cnJlbnRdPyh0aGlzLl9jdXJyZW50Kysse3R5cGU6Tyx2YWx1ZToiPj0iLHN0YXJ0OnR9KTp7dHlwZTpMLHZhbHVlOiI+IixzdGFydDp0fToiPSI9PT1uJiYiPSI9PT1lW3RoaXMuX2N1cnJlbnRdPyh0aGlzLl9jdXJyZW50Kysse3R5cGU6ayx2YWx1ZToiPT0iLHN0YXJ0OnR9KTp2b2lkIDB9LF9jb25zdW1lTGl0ZXJhbDpmdW5jdGlvbihlKXt0aGlzLl9jdXJyZW50Kys7Zm9yKHZhciB0LG49dGhpcy5fY3VycmVudCxyPWUubGVuZ3RoOyJgIiE9PWVbdGhpcy5fY3VycmVudF0mJnRoaXMuX2N1cnJlbnQ8cjspe3ZhciBvPXRoaXMuX2N1cnJlbnQ7IlxcIiE9PWVbb118fCJcXCIhPT1lW28rMV0mJiJgIiE9PWVbbysxXT9vKys6bys9Mix0aGlzLl9jdXJyZW50PW99dmFyIHM9aShlLnNsaWNlKG4sdGhpcy5fY3VycmVudCkpO3JldHVybiBzPXMucmVwbGFjZSgiXFxgIiwiYCIpLHQ9dGhpcy5fbG9va3NMaWtlSlNPTihzKT9KU09OLnBhcnNlKHMpOkpTT04ucGFyc2UoJyInK3MrJyInKSx0aGlzLl9jdXJyZW50KyssdH0sX2xvb2tzTGlrZUpTT046ZnVuY3Rpb24oZSl7aWYoIiI9PT1lKXJldHVybiExO2lmKCdbeyInLmluZGV4T2YoZVswXSk+PTApcmV0dXJuITA7aWYoWyJ0cnVlIiwiZmFsc2UiLCJudWxsIl0uaW5kZXhPZihlKT49MClyZXR1cm4hMDtpZighKCItMDEyMzQ1Njc4OSIuaW5kZXhPZihlWzBdKT49MCkpcmV0dXJuITE7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpLCEwfWNhdGNoKGUpe3JldHVybiExfX19O3ZhciBZPXt9O2Z1bmN0aW9uICQoKXt9ZnVuY3Rpb24gSihlKXt0aGlzLnJ1bnRpbWU9ZX1mdW5jdGlvbiBRKGUpe3RoaXMuX2ludGVycHJldGVyPWUsdGhpcy5mdW5jdGlvblRhYmxlPXthYnM6e19mdW5jOnRoaXMuX2Z1bmN0aW9uQWJzLF9zaWduYXR1cmU6W3t0eXBlczpbc119XX0sYXZnOntfZnVuYzp0aGlzLl9mdW5jdGlvbkF2Zyxfc2lnbmF0dXJlOlt7dHlwZXM6W2RdfV19LGNlaWw6e19mdW5jOnRoaXMuX2Z1bmN0aW9uQ2VpbCxfc2lnbmF0dXJlOlt7dHlwZXM6W3NdfV19LGNvbnRhaW5zOntfZnVuYzp0aGlzLl9mdW5jdGlvbkNvbnRhaW5zLF9zaWduYXR1cmU6W3t0eXBlczpbYyx1XX0se3R5cGVzOlthXX1dfSxlbmRzX3dpdGg6e19mdW5jOnRoaXMuX2Z1bmN0aW9uRW5kc1dpdGgsX3NpZ25hdHVyZTpbe3R5cGVzOltjXX0se3R5cGVzOltjXX1dfSxmbG9vcjp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25GbG9vcixfc2lnbmF0dXJlOlt7dHlwZXM6W3NdfV19LGxlbmd0aDp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25MZW5ndGgsX3NpZ25hdHVyZTpbe3R5cGVzOltjLHUsbF19XX0sbWFwOntfZnVuYzp0aGlzLl9mdW5jdGlvbk1hcCxfc2lnbmF0dXJlOlt7dHlwZXM6W3BdfSx7dHlwZXM6W3VdfV19LG1heDp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25NYXgsX3NpZ25hdHVyZTpbe3R5cGVzOltkLGhdfV19LG1lcmdlOntfZnVuYzp0aGlzLl9mdW5jdGlvbk1lcmdlLF9zaWduYXR1cmU6W3t0eXBlczpbbF0sdmFyaWFkaWM6ITB9XX0sbWF4X2J5OntfZnVuYzp0aGlzLl9mdW5jdGlvbk1heEJ5LF9zaWduYXR1cmU6W3t0eXBlczpbdV19LHt0eXBlczpbcF19XX0sc3VtOntfZnVuYzp0aGlzLl9mdW5jdGlvblN1bSxfc2lnbmF0dXJlOlt7dHlwZXM6W2RdfV19LHN0YXJ0c193aXRoOntfZnVuYzp0aGlzLl9mdW5jdGlvblN0YXJ0c1dpdGgsX3NpZ25hdHVyZTpbe3R5cGVzOltjXX0se3R5cGVzOltjXX1dfSxtaW46e19mdW5jOnRoaXMuX2Z1bmN0aW9uTWluLF9zaWduYXR1cmU6W3t0eXBlczpbZCxoXX1dfSxtaW5fYnk6e19mdW5jOnRoaXMuX2Z1bmN0aW9uTWluQnksX3NpZ25hdHVyZTpbe3R5cGVzOlt1XX0se3R5cGVzOltwXX1dfSx0eXBlOntfZnVuYzp0aGlzLl9mdW5jdGlvblR5cGUsX3NpZ25hdHVyZTpbe3R5cGVzOlthXX1dfSxrZXlzOntfZnVuYzp0aGlzLl9mdW5jdGlvbktleXMsX3NpZ25hdHVyZTpbe3R5cGVzOltsXX1dfSx2YWx1ZXM6e19mdW5jOnRoaXMuX2Z1bmN0aW9uVmFsdWVzLF9zaWduYXR1cmU6W3t0eXBlczpbbF19XX0sc29ydDp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25Tb3J0LF9zaWduYXR1cmU6W3t0eXBlczpbaCxkXX1dfSxzb3J0X2J5OntfZnVuYzp0aGlzLl9mdW5jdGlvblNvcnRCeSxfc2lnbmF0dXJlOlt7dHlwZXM6W3VdfSx7dHlwZXM6W3BdfV19LGpvaW46e19mdW5jOnRoaXMuX2Z1bmN0aW9uSm9pbixfc2lnbmF0dXJlOlt7dHlwZXM6W2NdfSx7dHlwZXM6W2hdfV19LHJldmVyc2U6e19mdW5jOnRoaXMuX2Z1bmN0aW9uUmV2ZXJzZSxfc2lnbmF0dXJlOlt7dHlwZXM6W2MsdV19XX0sdG9fYXJyYXk6e19mdW5jOnRoaXMuX2Z1bmN0aW9uVG9BcnJheSxfc2lnbmF0dXJlOlt7dHlwZXM6W2FdfV19LHRvX3N0cmluZzp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25Ub1N0cmluZyxfc2lnbmF0dXJlOlt7dHlwZXM6W2FdfV19LHRvX251bWJlcjp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25Ub051bWJlcixfc2lnbmF0dXJlOlt7dHlwZXM6W2FdfV19LG5vdF9udWxsOntfZnVuYzp0aGlzLl9mdW5jdGlvbk5vdE51bGwsX3NpZ25hdHVyZTpbe3R5cGVzOlthXSx2YXJpYWRpYzohMH1dfX19WVtnXT0wLFlbbV09MCxZW3ZdPTAsWVt5XT0wLFlbRV09MCxZW1NdPTAsWVtDXT0wLFlbVF09MCxZW0ldPTAsWVtBXT0wLFlbX109MSxZW3ddPTIsWVtSXT0zLFlba109NSxZW0xdPTUsWVtOXT01LFlbT109NSxZW0RdPTUsWVtQXT01LFlbeF09OSxZW01dPTIwLFlbVV09MjEsWVtGXT00MCxZW3FdPTQ1LFlbQl09NTAsWVtqXT01NSxZW1ZdPTYwLCQucHJvdG90eXBlPXtwYXJzZTpmdW5jdGlvbihlKXt0aGlzLl9sb2FkVG9rZW5zKGUpLHRoaXMuaW5kZXg9MDt2YXIgdD10aGlzLmV4cHJlc3Npb24oMCk7aWYodGhpcy5fbG9va2FoZWFkKDApIT09Zyl7dmFyIG49dGhpcy5fbG9va2FoZWFkVG9rZW4oMCkscj1uZXcgRXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gdHlwZTogIituLnR5cGUrIiwgdmFsdWU6ICIrbi52YWx1ZSk7dGhyb3cgci5uYW1lPSJQYXJzZXJFcnJvciIscn1yZXR1cm4gdH0sX2xvYWRUb2tlbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9KG5ldyBYKS50b2tlbml6ZShlKTt0LnB1c2goe3R5cGU6Zyx2YWx1ZToiIixzdGFydDplLmxlbmd0aH0pLHRoaXMudG9rZW5zPXR9LGV4cHJlc3Npb246ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbG9va2FoZWFkVG9rZW4oMCk7dGhpcy5fYWR2YW5jZSgpO2Zvcih2YXIgbj10aGlzLm51ZCh0KSxyPXRoaXMuX2xvb2thaGVhZCgwKTtlPFlbcl07KXRoaXMuX2FkdmFuY2UoKSxuPXRoaXMubGVkKHIsbikscj10aGlzLl9sb29rYWhlYWQoMCk7cmV0dXJuIG59LF9sb29rYWhlYWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudG9rZW5zW3RoaXMuaW5kZXgrZV0udHlwZX0sX2xvb2thaGVhZFRva2VuOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRva2Vuc1t0aGlzLmluZGV4K2VdfSxfYWR2YW5jZTpmdW5jdGlvbigpe3RoaXMuaW5kZXgrK30sbnVkOmZ1bmN0aW9uKGUpe3ZhciB0LG47c3dpdGNoKGUudHlwZSl7Y2FzZSBXOnJldHVybnt0eXBlOiJMaXRlcmFsIix2YWx1ZTplLnZhbHVlfTtjYXNlIG06cmV0dXJue3R5cGU6IkZpZWxkIixuYW1lOmUudmFsdWV9O2Nhc2Ugdjp2YXIgcj17dHlwZToiRmllbGQiLG5hbWU6ZS52YWx1ZX07aWYodGhpcy5fbG9va2FoZWFkKDApPT09Vil0aHJvdyBuZXcgRXJyb3IoIlF1b3RlZCBpZGVudGlmaWVyIG5vdCBhbGxvd2VkIGZvciBmdW5jdGlvbiBuYW1lcy4iKTtyZXR1cm4gcjtjYXNlIHE6cmV0dXJue3R5cGU6Ik5vdEV4cHJlc3Npb24iLGNoaWxkcmVuOlt0PXRoaXMuZXhwcmVzc2lvbihZLk5vdCldfTtjYXNlIE06cmV0dXJuIHQ9bnVsbCx7dHlwZToiVmFsdWVQcm9qZWN0aW9uIixjaGlsZHJlbjpbe3R5cGU6IklkZW50aXR5In0sdD10aGlzLl9sb29rYWhlYWQoMCk9PT15P3t0eXBlOiJJZGVudGl0eSJ9OnRoaXMuX3BhcnNlUHJvamVjdGlvblJIUyhZLlN0YXIpXX07Y2FzZSBVOnJldHVybiB0aGlzLmxlZChlLnR5cGUse3R5cGU6IklkZW50aXR5In0pO2Nhc2UgQjpyZXR1cm4gdGhpcy5fcGFyc2VNdWx0aXNlbGVjdEhhc2goKTtjYXNlIHg6cmV0dXJue3R5cGU6IlByb2plY3Rpb24iLGNoaWxkcmVuOlt7dHlwZTp4LGNoaWxkcmVuOlt7dHlwZToiSWRlbnRpdHkifV19LHQ9dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKFkuRmxhdHRlbildfTtjYXNlIGo6cmV0dXJuIHRoaXMuX2xvb2thaGVhZCgwKT09PVR8fHRoaXMuX2xvb2thaGVhZCgwKT09PWI/KHQ9dGhpcy5fcGFyc2VJbmRleEV4cHJlc3Npb24oKSx0aGlzLl9wcm9qZWN0SWZTbGljZSh7dHlwZToiSWRlbnRpdHkifSx0KSk6dGhpcy5fbG9va2FoZWFkKDApPT09TSYmdGhpcy5fbG9va2FoZWFkKDEpPT09eT8odGhpcy5fYWR2YW5jZSgpLHRoaXMuX2FkdmFuY2UoKSx7dHlwZToiUHJvamVjdGlvbiIsY2hpbGRyZW46W3t0eXBlOiJJZGVudGl0eSJ9LHQ9dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKFkuU3RhcildfSk6dGhpcy5fcGFyc2VNdWx0aXNlbGVjdExpc3QoKTtjYXNlIEk6cmV0dXJue3R5cGU6SX07Y2FzZSBBOnJldHVybnt0eXBlOiJFeHByZXNzaW9uUmVmZXJlbmNlIixjaGlsZHJlbjpbbj10aGlzLmV4cHJlc3Npb24oWS5FeHByZWYpXX07Y2FzZSBWOmZvcih2YXIgbz1bXTt0aGlzLl9sb29rYWhlYWQoMCkhPT1FOyl0aGlzLl9sb29rYWhlYWQoMCk9PT1JPyhuPXt0eXBlOkl9LHRoaXMuX2FkdmFuY2UoKSk6bj10aGlzLmV4cHJlc3Npb24oMCksby5wdXNoKG4pO3JldHVybiB0aGlzLl9tYXRjaChFKSxvWzBdO2RlZmF1bHQ6dGhpcy5fZXJyb3JUb2tlbihlKX19LGxlZDpmdW5jdGlvbihlLHQpe3ZhciBuO3N3aXRjaChlKXtjYXNlIEY6dmFyIHI9WS5Eb3Q7cmV0dXJuIHRoaXMuX2xvb2thaGVhZCgwKSE9PU0/e3R5cGU6IlN1YmV4cHJlc3Npb24iLGNoaWxkcmVuOlt0LG49dGhpcy5fcGFyc2VEb3RSSFMocildfToodGhpcy5fYWR2YW5jZSgpLHt0eXBlOiJWYWx1ZVByb2plY3Rpb24iLGNoaWxkcmVuOlt0LG49dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKHIpXX0pO2Nhc2UgXzpyZXR1cm4gbj10aGlzLmV4cHJlc3Npb24oWS5QaXBlKSx7dHlwZTpfLGNoaWxkcmVuOlt0LG5dfTtjYXNlIHc6cmV0dXJue3R5cGU6Ik9yRXhwcmVzc2lvbiIsY2hpbGRyZW46W3Qsbj10aGlzLmV4cHJlc3Npb24oWS5PcildfTtjYXNlIFI6cmV0dXJue3R5cGU6IkFuZEV4cHJlc3Npb24iLGNoaWxkcmVuOlt0LG49dGhpcy5leHByZXNzaW9uKFkuQW5kKV19O2Nhc2UgVjpmb3IodmFyIG8saT10Lm5hbWUscz1bXTt0aGlzLl9sb29rYWhlYWQoMCkhPT1FOyl0aGlzLl9sb29rYWhlYWQoMCk9PT1JPyhvPXt0eXBlOkl9LHRoaXMuX2FkdmFuY2UoKSk6bz10aGlzLmV4cHJlc3Npb24oMCksdGhpcy5fbG9va2FoZWFkKDApPT09UyYmdGhpcy5fbWF0Y2goUykscy5wdXNoKG8pO3JldHVybiB0aGlzLl9tYXRjaChFKSx7dHlwZToiRnVuY3Rpb24iLG5hbWU6aSxjaGlsZHJlbjpzfTtjYXNlIFU6dmFyIGE9dGhpcy5leHByZXNzaW9uKDApO3JldHVybiB0aGlzLl9tYXRjaCh5KSx7dHlwZToiRmlsdGVyUHJvamVjdGlvbiIsY2hpbGRyZW46W3Qsbj10aGlzLl9sb29rYWhlYWQoMCk9PT14P3t0eXBlOiJJZGVudGl0eSJ9OnRoaXMuX3BhcnNlUHJvamVjdGlvblJIUyhZLkZpbHRlciksYV19O2Nhc2UgeDpyZXR1cm57dHlwZToiUHJvamVjdGlvbiIsY2hpbGRyZW46W3t0eXBlOngsY2hpbGRyZW46W3RdfSx0aGlzLl9wYXJzZVByb2plY3Rpb25SSFMoWS5GbGF0dGVuKV19O2Nhc2UgazpjYXNlIFA6Y2FzZSBMOmNhc2UgTzpjYXNlIE46Y2FzZSBEOnJldHVybiB0aGlzLl9wYXJzZUNvbXBhcmF0b3IodCxlKTtjYXNlIGo6dmFyIGM9dGhpcy5fbG9va2FoZWFkVG9rZW4oMCk7cmV0dXJuIGMudHlwZT09PVR8fGMudHlwZT09PWI/KG49dGhpcy5fcGFyc2VJbmRleEV4cHJlc3Npb24oKSx0aGlzLl9wcm9qZWN0SWZTbGljZSh0LG4pKToodGhpcy5fbWF0Y2goTSksdGhpcy5fbWF0Y2goeSkse3R5cGU6IlByb2plY3Rpb24iLGNoaWxkcmVuOlt0LG49dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKFkuU3RhcildfSk7ZGVmYXVsdDp0aGlzLl9lcnJvclRva2VuKHRoaXMuX2xvb2thaGVhZFRva2VuKDApKX19LF9tYXRjaDpmdW5jdGlvbihlKXtpZih0aGlzLl9sb29rYWhlYWQoMCkhPT1lKXt2YXIgdD10aGlzLl9sb29rYWhlYWRUb2tlbigwKSxuPW5ldyBFcnJvcigiRXhwZWN0ZWQgIitlKyIsIGdvdDogIit0LnR5cGUpO3Rocm93IG4ubmFtZT0iUGFyc2VyRXJyb3IiLG59dGhpcy5fYWR2YW5jZSgpfSxfZXJyb3JUb2tlbjpmdW5jdGlvbihlKXt2YXIgdD1uZXcgRXJyb3IoIkludmFsaWQgdG9rZW4gKCIrZS50eXBlKycpOiAiJytlLnZhbHVlKyciJyk7dGhyb3cgdC5uYW1lPSJQYXJzZXJFcnJvciIsdH0sX3BhcnNlSW5kZXhFeHByZXNzaW9uOmZ1bmN0aW9uKCl7aWYodGhpcy5fbG9va2FoZWFkKDApPT09Ynx8dGhpcy5fbG9va2FoZWFkKDEpPT09YilyZXR1cm4gdGhpcy5fcGFyc2VTbGljZUV4cHJlc3Npb24oKTt2YXIgZT17dHlwZToiSW5kZXgiLHZhbHVlOnRoaXMuX2xvb2thaGVhZFRva2VuKDApLnZhbHVlfTtyZXR1cm4gdGhpcy5fYWR2YW5jZSgpLHRoaXMuX21hdGNoKHkpLGV9LF9wcm9qZWN0SWZTbGljZTpmdW5jdGlvbihlLHQpe3ZhciBuPXt0eXBlOiJJbmRleEV4cHJlc3Npb24iLGNoaWxkcmVuOltlLHRdfTtyZXR1cm4iU2xpY2UiPT09dC50eXBlP3t0eXBlOiJQcm9qZWN0aW9uIixjaGlsZHJlbjpbbix0aGlzLl9wYXJzZVByb2plY3Rpb25SSFMoWS5TdGFyKV19Om59LF9wYXJzZVNsaWNlRXhwcmVzc2lvbjpmdW5jdGlvbigpe2Zvcih2YXIgZT1bbnVsbCxudWxsLG51bGxdLHQ9MCxuPXRoaXMuX2xvb2thaGVhZCgwKTtuIT09eSYmdDwzOyl7aWYobj09PWIpdCsrLHRoaXMuX2FkdmFuY2UoKTtlbHNle2lmKG4hPT1UKXt2YXIgcj10aGlzLl9sb29rYWhlYWQoMCksbz1uZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5leHBlY3RlZCB0b2tlbjogIityLnZhbHVlKyIoIityLnR5cGUrIikiKTt0aHJvdyBvLm5hbWU9IlBhcnNlcmVycm9yIixvfWVbdF09dGhpcy5fbG9va2FoZWFkVG9rZW4oMCkudmFsdWUsdGhpcy5fYWR2YW5jZSgpfW49dGhpcy5fbG9va2FoZWFkKDApfXJldHVybiB0aGlzLl9tYXRjaCh5KSx7dHlwZToiU2xpY2UiLGNoaWxkcmVuOmV9fSxfcGFyc2VDb21wYXJhdG9yOmZ1bmN0aW9uKGUsdCl7cmV0dXJue3R5cGU6IkNvbXBhcmF0b3IiLG5hbWU6dCxjaGlsZHJlbjpbZSx0aGlzLmV4cHJlc3Npb24oWVt0XSldfX0sX3BhcnNlRG90UkhTOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2xvb2thaGVhZCgwKTtyZXR1cm5bbSx2LE1dLmluZGV4T2YodCk+PTA/dGhpcy5leHByZXNzaW9uKGUpOnQ9PT1qPyh0aGlzLl9tYXRjaChqKSx0aGlzLl9wYXJzZU11bHRpc2VsZWN0TGlzdCgpKTp0PT09Qj8odGhpcy5fbWF0Y2goQiksdGhpcy5fcGFyc2VNdWx0aXNlbGVjdEhhc2goKSk6dm9pZCAwfSxfcGFyc2VQcm9qZWN0aW9uUkhTOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKFlbdGhpcy5fbG9va2FoZWFkKDApXTwxMCl0PXt0eXBlOiJJZGVudGl0eSJ9O2Vsc2UgaWYodGhpcy5fbG9va2FoZWFkKDApPT09ail0PXRoaXMuZXhwcmVzc2lvbihlKTtlbHNlIGlmKHRoaXMuX2xvb2thaGVhZCgwKT09PVUpdD10aGlzLmV4cHJlc3Npb24oZSk7ZWxzZXtpZih0aGlzLl9sb29rYWhlYWQoMCkhPT1GKXt2YXIgbj10aGlzLl9sb29rYWhlYWRUb2tlbigwKSxyPW5ldyBFcnJvcigiU3l0YW54IGVycm9yLCB1bmV4cGVjdGVkIHRva2VuOiAiK24udmFsdWUrIigiK24udHlwZSsiKSIpO3Rocm93IHIubmFtZT0iUGFyc2VyRXJyb3IiLHJ9dGhpcy5fbWF0Y2goRiksdD10aGlzLl9wYXJzZURvdFJIUyhlKX1yZXR1cm4gdH0sX3BhcnNlTXVsdGlzZWxlY3RMaXN0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdO3RoaXMuX2xvb2thaGVhZCgwKSE9PXk7KXt2YXIgdD10aGlzLmV4cHJlc3Npb24oMCk7aWYoZS5wdXNoKHQpLHRoaXMuX2xvb2thaGVhZCgwKT09PVMmJih0aGlzLl9tYXRjaChTKSx0aGlzLl9sb29rYWhlYWQoMCk9PT15KSl0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gUmJyYWNrZXQiKX1yZXR1cm4gdGhpcy5fbWF0Y2goeSkse3R5cGU6Ik11bHRpU2VsZWN0TGlzdCIsY2hpbGRyZW46ZX19LF9wYXJzZU11bHRpc2VsZWN0SGFzaDpmdW5jdGlvbigpe2Zvcih2YXIgZSx0LG4scj1bXSxvPVttLHZdOzspe2lmKGU9dGhpcy5fbG9va2FoZWFkVG9rZW4oMCksby5pbmRleE9mKGUudHlwZSk8MCl0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGluZyBhbiBpZGVudGlmaWVyIHRva2VuLCBnb3Q6ICIrZS50eXBlKTtpZih0PWUudmFsdWUsdGhpcy5fYWR2YW5jZSgpLHRoaXMuX21hdGNoKGIpLG49e3R5cGU6IktleVZhbHVlUGFpciIsbmFtZTp0LHZhbHVlOnRoaXMuZXhwcmVzc2lvbigwKX0sci5wdXNoKG4pLHRoaXMuX2xvb2thaGVhZCgwKT09PVMpdGhpcy5fbWF0Y2goUyk7ZWxzZSBpZih0aGlzLl9sb29rYWhlYWQoMCk9PT1DKXt0aGlzLl9tYXRjaChDKTticmVha319cmV0dXJue3R5cGU6Ik11bHRpU2VsZWN0SGFzaCIsY2hpbGRyZW46cn19fSxKLnByb3RvdHlwZT17c2VhcmNoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMudmlzaXQoZSx0KX0sdmlzaXQ6ZnVuY3Rpb24oZSxpKXt2YXIgcyxhLGMsdSxsLHAsZCxoLGY7c3dpdGNoKGUudHlwZSl7Y2FzZSJGaWVsZCI6cmV0dXJuIG51bGwhPT1pJiZuKGkpP3ZvaWQgMD09PShwPWlbZS5uYW1lXSk/bnVsbDpwOm51bGw7Y2FzZSJTdWJleHByZXNzaW9uIjpmb3IoYz10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSksZj0xO2Y8ZS5jaGlsZHJlbi5sZW5ndGg7ZisrKWlmKG51bGw9PT0oYz10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0sYykpKXJldHVybiBudWxsO3JldHVybiBjO2Nhc2UiSW5kZXhFeHByZXNzaW9uIjpyZXR1cm4gZD10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSksdGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLGQpO2Nhc2UiSW5kZXgiOmlmKCF0KGkpKXJldHVybiBudWxsO3ZhciBnPWUudmFsdWU7cmV0dXJuIGc8MCYmKGc9aS5sZW5ndGgrZyksdm9pZCAwPT09KGM9aVtnXSkmJihjPW51bGwpLGM7Y2FzZSJTbGljZSI6aWYoIXQoaSkpcmV0dXJuIG51bGw7dmFyIG09ZS5jaGlsZHJlbi5zbGljZSgwKSx2PXRoaXMuY29tcHV0ZVNsaWNlUGFyYW1zKGkubGVuZ3RoLG0pLHk9dlswXSxFPXZbMV0sUz12WzJdO2lmKGM9W10sUz4wKWZvcihmPXk7ZjxFO2YrPVMpYy5wdXNoKGlbZl0pO2Vsc2UgZm9yKGY9eTtmPkU7Zis9UyljLnB1c2goaVtmXSk7cmV0dXJuIGM7Y2FzZSJQcm9qZWN0aW9uIjp2YXIgYj10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSk7aWYoIXQoYikpcmV0dXJuIG51bGw7Zm9yKGg9W10sZj0wO2Y8Yi5sZW5ndGg7ZisrKW51bGwhPT0oYT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0sYltmXSkpJiZoLnB1c2goYSk7cmV0dXJuIGg7Y2FzZSJWYWx1ZVByb2plY3Rpb24iOmlmKCFuKGI9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpKSlyZXR1cm4gbnVsbDtoPVtdO3ZhciBDPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPVtdLHI9MDtyPHQubGVuZ3RoO3IrKyluLnB1c2goZVt0W3JdXSk7cmV0dXJuIG59KGIpO2ZvcihmPTA7ZjxDLmxlbmd0aDtmKyspbnVsbCE9PShhPXRoaXMudmlzaXQoZS5jaGlsZHJlblsxXSxDW2ZdKSkmJmgucHVzaChhKTtyZXR1cm4gaDtjYXNlIkZpbHRlclByb2plY3Rpb24iOmlmKCF0KGI9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpKSlyZXR1cm4gbnVsbDt2YXIgVD1bXSx3PVtdO2ZvcihmPTA7ZjxiLmxlbmd0aDtmKyspbyhzPXRoaXMudmlzaXQoZS5jaGlsZHJlblsyXSxiW2ZdKSl8fFQucHVzaChiW2ZdKTtmb3IodmFyIFI9MDtSPFQubGVuZ3RoO1IrKyludWxsIT09KGE9dGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLFRbUl0pKSYmdy5wdXNoKGEpO3JldHVybiB3O2Nhc2UiQ29tcGFyYXRvciI6c3dpdGNoKHU9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpLGw9dGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLGkpLGUubmFtZSl7Y2FzZSBrOmM9cih1LGwpO2JyZWFrO2Nhc2UgUDpjPSFyKHUsbCk7YnJlYWs7Y2FzZSBMOmM9dT5sO2JyZWFrO2Nhc2UgTzpjPXU+PWw7YnJlYWs7Y2FzZSBOOmM9dTxsO2JyZWFrO2Nhc2UgRDpjPXU8PWw7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gY29tcGFyYXRvcjogIitlLm5hbWUpfXJldHVybiBjO2Nhc2UgeDp2YXIgTT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSk7aWYoIXQoTSkpcmV0dXJuIG51bGw7dmFyIFU9W107Zm9yKGY9MDtmPE0ubGVuZ3RoO2YrKyl0KGE9TVtmXSk/VS5wdXNoLmFwcGx5KFUsYSk6VS5wdXNoKGEpO3JldHVybiBVO2Nhc2UiSWRlbnRpdHkiOnJldHVybiBpO2Nhc2UiTXVsdGlTZWxlY3RMaXN0IjppZihudWxsPT09aSlyZXR1cm4gbnVsbDtmb3IoaD1bXSxmPTA7ZjxlLmNoaWxkcmVuLmxlbmd0aDtmKyspaC5wdXNoKHRoaXMudmlzaXQoZS5jaGlsZHJlbltmXSxpKSk7cmV0dXJuIGg7Y2FzZSJNdWx0aVNlbGVjdEhhc2giOmlmKG51bGw9PT1pKXJldHVybiBudWxsO3ZhciBGO2ZvcihoPXt9LGY9MDtmPGUuY2hpbGRyZW4ubGVuZ3RoO2YrKyloWyhGPWUuY2hpbGRyZW5bZl0pLm5hbWVdPXRoaXMudmlzaXQoRi52YWx1ZSxpKTtyZXR1cm4gaDtjYXNlIk9yRXhwcmVzc2lvbiI6cmV0dXJuIG8ocz10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSkpJiYocz10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0saSkpLHM7Y2FzZSJBbmRFeHByZXNzaW9uIjpyZXR1cm4hMD09PW8odT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSkpP3U6dGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLGkpO2Nhc2UiTm90RXhwcmVzc2lvbiI6cmV0dXJuIG8odT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSkpO2Nhc2UiTGl0ZXJhbCI6cmV0dXJuIGUudmFsdWU7Y2FzZSBfOnJldHVybiBkPXRoaXMudmlzaXQoZS5jaGlsZHJlblswXSxpKSx0aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0sZCk7Y2FzZSBJOnJldHVybiBpO2Nhc2UiRnVuY3Rpb24iOnZhciBxPVtdO2ZvcihmPTA7ZjxlLmNoaWxkcmVuLmxlbmd0aDtmKyspcS5wdXNoKHRoaXMudmlzaXQoZS5jaGlsZHJlbltmXSxpKSk7cmV0dXJuIHRoaXMucnVudGltZS5jYWxsRnVuY3Rpb24oZS5uYW1lLHEpO2Nhc2UiRXhwcmVzc2lvblJlZmVyZW5jZSI6dmFyIEI9ZS5jaGlsZHJlblswXTtyZXR1cm4gQi5qbWVzcGF0aFR5cGU9QSxCO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIG5vZGUgdHlwZTogIitlLnR5cGUpfX0sY29tcHV0ZVNsaWNlUGFyYW1zOmZ1bmN0aW9uKGUsdCl7dmFyIG49dFswXSxyPXRbMV0sbz10WzJdLGk9W251bGwsbnVsbCxudWxsXTtpZihudWxsPT09bylvPTE7ZWxzZSBpZigwPT09byl7dmFyIHM9bmV3IEVycm9yKCJJbnZhbGlkIHNsaWNlLCBzdGVwIGNhbm5vdCBiZSAwIik7dGhyb3cgcy5uYW1lPSJSdW50aW1lRXJyb3IiLHN9dmFyIGE9bzwwO3JldHVybiBuPW51bGw9PT1uP2E/ZS0xOjA6dGhpcy5jYXBTbGljZVJhbmdlKGUsbixvKSxyPW51bGw9PT1yP2E/LTE6ZTp0aGlzLmNhcFNsaWNlUmFuZ2UoZSxyLG8pLGlbMF09bixpWzFdPXIsaVsyXT1vLGl9LGNhcFNsaWNlUmFuZ2U6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0PDA/KHQrPWUpPDAmJih0PW48MD8tMTowKTp0Pj1lJiYodD1uPDA/ZS0xOmUpLHR9fSxRLnByb3RvdHlwZT17Y2FsbEZ1bmN0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5mdW5jdGlvblRhYmxlW2VdO2lmKHZvaWQgMD09PW4pdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGZ1bmN0aW9uOiAiK2UrIigpIik7cmV0dXJuIHRoaXMuX3ZhbGlkYXRlQXJncyhlLHQsbi5fc2lnbmF0dXJlKSxuLl9mdW5jLmNhbGwodGhpcyx0KX0sX3ZhbGlkYXRlQXJnczpmdW5jdGlvbihlLHQsbil7dmFyIHIsbyxpLHM7aWYobltuLmxlbmd0aC0xXS52YXJpYWRpYyl7aWYodC5sZW5ndGg8bi5sZW5ndGgpdGhyb3cgcj0xPT09bi5sZW5ndGg/IiBhcmd1bWVudCI6IiBhcmd1bWVudHMiLG5ldyBFcnJvcigiQXJndW1lbnRFcnJvcjogIitlKyIoKSB0YWtlcyBhdCBsZWFzdCIrbi5sZW5ndGgrcisiIGJ1dCByZWNlaXZlZCAiK3QubGVuZ3RoKX1lbHNlIGlmKHQubGVuZ3RoIT09bi5sZW5ndGgpdGhyb3cgcj0xPT09bi5sZW5ndGg/IiBhcmd1bWVudCI6IiBhcmd1bWVudHMiLG5ldyBFcnJvcigiQXJndW1lbnRFcnJvcjogIitlKyIoKSB0YWtlcyAiK24ubGVuZ3RoK3IrIiBidXQgcmVjZWl2ZWQgIit0Lmxlbmd0aCk7Zm9yKHZhciBhPTA7YTxuLmxlbmd0aDthKyspe3M9ITEsbz1uW2FdLnR5cGVzLGk9dGhpcy5fZ2V0VHlwZU5hbWUodFthXSk7Zm9yKHZhciBjPTA7YzxvLmxlbmd0aDtjKyspaWYodGhpcy5fdHlwZU1hdGNoZXMoaSxvW2NdLHRbYV0pKXtzPSEwO2JyZWFrfWlmKCFzKXt2YXIgdT1vLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGZbZV19KSkuam9pbigiLCIpO3Rocm93IG5ldyBFcnJvcigiVHlwZUVycm9yOiAiK2UrIigpIGV4cGVjdGVkIGFyZ3VtZW50ICIrKGErMSkrIiB0byBiZSB0eXBlICIrdSsiIGJ1dCByZWNlaXZlZCB0eXBlICIrZltpXSsiIGluc3RlYWQuIil9fX0sX3R5cGVNYXRjaGVzOmZ1bmN0aW9uKGUsdCxuKXtpZih0PT09YSlyZXR1cm4hMDtpZih0IT09aCYmdCE9PWQmJnQhPT11KXJldHVybiBlPT09dDtpZih0PT09dSlyZXR1cm4gZT09PXU7aWYoZT09PXUpe3ZhciByO3Q9PT1kP3I9czp0PT09aCYmKHI9Yyk7Zm9yKHZhciBvPTA7bzxuLmxlbmd0aDtvKyspaWYoIXRoaXMuX3R5cGVNYXRjaGVzKHRoaXMuX2dldFR5cGVOYW1lKG5bb10pLHIsbltvXSkpcmV0dXJuITE7cmV0dXJuITB9fSxfZ2V0VHlwZU5hbWU6ZnVuY3Rpb24oZSl7c3dpdGNoKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSl7Y2FzZSJbb2JqZWN0IFN0cmluZ10iOnJldHVybiBjO2Nhc2UiW29iamVjdCBOdW1iZXJdIjpyZXR1cm4gcztjYXNlIltvYmplY3QgQXJyYXldIjpyZXR1cm4gdTtjYXNlIltvYmplY3QgQm9vbGVhbl0iOnJldHVybiA1O2Nhc2UiW29iamVjdCBOdWxsXSI6cmV0dXJuIDc7Y2FzZSJbb2JqZWN0IE9iamVjdF0iOnJldHVybiBlLmptZXNwYXRoVHlwZT09PUE/cDpsfX0sX2Z1bmN0aW9uU3RhcnRzV2l0aDpmdW5jdGlvbihlKXtyZXR1cm4gMD09PWVbMF0ubGFzdEluZGV4T2YoZVsxXSl9LF9mdW5jdGlvbkVuZHNXaXRoOmZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0sbj1lWzFdO3JldHVybi0xIT09dC5pbmRleE9mKG4sdC5sZW5ndGgtbi5sZW5ndGgpfSxfZnVuY3Rpb25SZXZlcnNlOmZ1bmN0aW9uKGUpe2lmKHRoaXMuX2dldFR5cGVOYW1lKGVbMF0pPT09Yyl7Zm9yKHZhciB0PWVbMF0sbj0iIixyPXQubGVuZ3RoLTE7cj49MDtyLS0pbis9dFtyXTtyZXR1cm4gbn12YXIgbz1lWzBdLnNsaWNlKDApO3JldHVybiBvLnJldmVyc2UoKSxvfSxfZnVuY3Rpb25BYnM6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguYWJzKGVbMF0pfSxfZnVuY3Rpb25DZWlsOmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmNlaWwoZVswXSl9LF9mdW5jdGlvbkF2ZzpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPWVbMF0scj0wO3I8bi5sZW5ndGg7cisrKXQrPW5bcl07cmV0dXJuIHQvbi5sZW5ndGh9LF9mdW5jdGlvbkNvbnRhaW5zOmZ1bmN0aW9uKGUpe3JldHVybiBlWzBdLmluZGV4T2YoZVsxXSk+PTB9LF9mdW5jdGlvbkZsb29yOmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmZsb29yKGVbMF0pfSxfZnVuY3Rpb25MZW5ndGg6ZnVuY3Rpb24oZSl7cmV0dXJuIG4oZVswXSk/T2JqZWN0LmtleXMoZVswXSkubGVuZ3RoOmVbMF0ubGVuZ3RofSxfZnVuY3Rpb25NYXA6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49dGhpcy5faW50ZXJwcmV0ZXIscj1lWzBdLG89ZVsxXSxpPTA7aTxvLmxlbmd0aDtpKyspdC5wdXNoKG4udmlzaXQocixvW2ldKSk7cmV0dXJuIHR9LF9mdW5jdGlvbk1lcmdlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD17fSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07Zm9yKHZhciBvIGluIHIpdFtvXT1yW29dfXJldHVybiB0fSxfZnVuY3Rpb25NYXg6ZnVuY3Rpb24oZSl7aWYoZVswXS5sZW5ndGg+MCl7aWYodGhpcy5fZ2V0VHlwZU5hbWUoZVswXVswXSk9PT1zKXJldHVybiBNYXRoLm1heC5hcHBseShNYXRoLGVbMF0pO2Zvcih2YXIgdD1lWzBdLG49dFswXSxyPTE7cjx0Lmxlbmd0aDtyKyspbi5sb2NhbGVDb21wYXJlKHRbcl0pPDAmJihuPXRbcl0pO3JldHVybiBufXJldHVybiBudWxsfSxfZnVuY3Rpb25NaW46ZnVuY3Rpb24oZSl7aWYoZVswXS5sZW5ndGg+MCl7aWYodGhpcy5fZ2V0VHlwZU5hbWUoZVswXVswXSk9PT1zKXJldHVybiBNYXRoLm1pbi5hcHBseShNYXRoLGVbMF0pO2Zvcih2YXIgdD1lWzBdLG49dFswXSxyPTE7cjx0Lmxlbmd0aDtyKyspdFtyXS5sb2NhbGVDb21wYXJlKG4pPDAmJihuPXRbcl0pO3JldHVybiBufXJldHVybiBudWxsfSxfZnVuY3Rpb25TdW06ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1lWzBdLHI9MDtyPG4ubGVuZ3RoO3IrKyl0Kz1uW3JdO3JldHVybiB0fSxfZnVuY3Rpb25UeXBlOmZ1bmN0aW9uKGUpe3N3aXRjaCh0aGlzLl9nZXRUeXBlTmFtZShlWzBdKSl7Y2FzZSBzOnJldHVybiJudW1iZXIiO2Nhc2UgYzpyZXR1cm4ic3RyaW5nIjtjYXNlIHU6cmV0dXJuImFycmF5IjtjYXNlIGw6cmV0dXJuIm9iamVjdCI7Y2FzZSA1OnJldHVybiJib29sZWFuIjtjYXNlIHA6cmV0dXJuImV4cHJlZiI7Y2FzZSA3OnJldHVybiJudWxsIn19LF9mdW5jdGlvbktleXM6ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5rZXlzKGVbMF0pfSxfZnVuY3Rpb25WYWx1ZXM6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWVbMF0sbj1PYmplY3Qua2V5cyh0KSxyPVtdLG89MDtvPG4ubGVuZ3RoO28rKylyLnB1c2godFtuW29dXSk7cmV0dXJuIHJ9LF9mdW5jdGlvbkpvaW46ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXTtyZXR1cm4gZVsxXS5qb2luKHQpfSxfZnVuY3Rpb25Ub0FycmF5OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9nZXRUeXBlTmFtZShlWzBdKT09PXU/ZVswXTpbZVswXV19LF9mdW5jdGlvblRvU3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9nZXRUeXBlTmFtZShlWzBdKT09PWM/ZVswXTpKU09OLnN0cmluZ2lmeShlWzBdKX0sX2Z1bmN0aW9uVG9OdW1iZXI6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLl9nZXRUeXBlTmFtZShlWzBdKTtyZXR1cm4gbj09PXM/ZVswXTpuIT09Y3x8KHQ9K2VbMF0saXNOYU4odCkpP251bGw6dH0sX2Z1bmN0aW9uTm90TnVsbDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKylpZig3IT09dGhpcy5fZ2V0VHlwZU5hbWUoZVt0XSkpcmV0dXJuIGVbdF07cmV0dXJuIG51bGx9LF9mdW5jdGlvblNvcnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXS5zbGljZSgwKTtyZXR1cm4gdC5zb3J0KCksdH0sX2Z1bmN0aW9uU29ydEJ5OmZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0uc2xpY2UoMCk7aWYoMD09PXQubGVuZ3RoKXJldHVybiB0O3ZhciBuPXRoaXMuX2ludGVycHJldGVyLHI9ZVsxXSxvPXRoaXMuX2dldFR5cGVOYW1lKG4udmlzaXQocix0WzBdKSk7aWYoW3MsY10uaW5kZXhPZihvKTwwKXRocm93IG5ldyBFcnJvcigiVHlwZUVycm9yIik7Zm9yKHZhciBpPXRoaXMsYT1bXSx1PTA7dTx0Lmxlbmd0aDt1KyspYS5wdXNoKFt1LHRbdV1dKTthLnNvcnQoKGZ1bmN0aW9uKGUsdCl7dmFyIHM9bi52aXNpdChyLGVbMV0pLGE9bi52aXNpdChyLHRbMV0pO2lmKGkuX2dldFR5cGVOYW1lKHMpIT09byl0aHJvdyBuZXcgRXJyb3IoIlR5cGVFcnJvcjogZXhwZWN0ZWQgIitvKyIsIHJlY2VpdmVkICIraS5fZ2V0VHlwZU5hbWUocykpO2lmKGkuX2dldFR5cGVOYW1lKGEpIT09byl0aHJvdyBuZXcgRXJyb3IoIlR5cGVFcnJvcjogZXhwZWN0ZWQgIitvKyIsIHJlY2VpdmVkICIraS5fZ2V0VHlwZU5hbWUoYSkpO3JldHVybiBzPmE/MTpzPGE/LTE6ZVswXS10WzBdfSkpO2Zvcih2YXIgbD0wO2w8YS5sZW5ndGg7bCsrKXRbbF09YVtsXVsxXTtyZXR1cm4gdH0sX2Z1bmN0aW9uTWF4Qnk6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG4scj1lWzFdLG89ZVswXSxpPXRoaXMuY3JlYXRlS2V5RnVuY3Rpb24ocixbcyxjXSksYT0tMS8wLHU9MDt1PG8ubGVuZ3RoO3UrKykobj1pKG9bdV0pKT5hJiYoYT1uLHQ9b1t1XSk7cmV0dXJuIHR9LF9mdW5jdGlvbk1pbkJ5OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHI9ZVsxXSxvPWVbMF0saT10aGlzLmNyZWF0ZUtleUZ1bmN0aW9uKHIsW3MsY10pLGE9MS8wLHU9MDt1PG8ubGVuZ3RoO3UrKykobj1pKG9bdV0pKTxhJiYoYT1uLHQ9b1t1XSk7cmV0dXJuIHR9LGNyZWF0ZUtleUZ1bmN0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcyxyPXRoaXMuX2ludGVycHJldGVyO3JldHVybiBmdW5jdGlvbihvKXt2YXIgaT1yLnZpc2l0KGUsbyk7aWYodC5pbmRleE9mKG4uX2dldFR5cGVOYW1lKGkpKTwwKXt2YXIgcz0iVHlwZUVycm9yOiBleHBlY3RlZCBvbmUgb2YgIit0KyIsIHJlY2VpdmVkICIrbi5fZ2V0VHlwZU5hbWUoaSk7dGhyb3cgbmV3IEVycm9yKHMpfXJldHVybiBpfX19LGUudG9rZW5pemU9ZnVuY3Rpb24oZSl7cmV0dXJuKG5ldyBYKS50b2tlbml6ZShlKX0sZS5jb21waWxlPWZ1bmN0aW9uKGUpe3JldHVybihuZXcgJCkucGFyc2UoZSl9LGUuc2VhcmNoPWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3ICQscj1uZXcgUSxvPW5ldyBKKHIpO3IuX2ludGVycHJldGVyPW87dmFyIGk9bi5wYXJzZSh0KTtyZXR1cm4gby5zZWFyY2goaSxlKX0sZS5zdHJpY3REZWVwRXF1YWw9cn0odm9pZCAwPT09bj90aGlzLmptZXNwYXRoPXt9Om4pfSx7fV0sOTE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcixvLGk9dC5leHBvcnRzPXt9O2Z1bmN0aW9uIHMoKXt0aHJvdyBuZXcgRXJyb3IoInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiBhKCl7dGhyb3cgbmV3IEVycm9yKCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiBjKGUpe2lmKHI9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KGUsMCk7aWYoKHI9PT1zfHwhcikmJnNldFRpbWVvdXQpcmV0dXJuIHI9c2V0VGltZW91dCxzZXRUaW1lb3V0KGUsMCk7dHJ5e3JldHVybiByKGUsMCl9Y2F0Y2godCl7dHJ5e3JldHVybiByLmNhbGwobnVsbCxlLDApfWNhdGNoKHQpe3JldHVybiByLmNhbGwodGhpcyxlLDApfX19IWZ1bmN0aW9uKCl7dHJ5e3I9ImZ1bmN0aW9uIj09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDpzfWNhdGNoKGUpe3I9c310cnl7bz0iZnVuY3Rpb24iPT10eXBlb2YgY2xlYXJUaW1lb3V0P2NsZWFyVGltZW91dDphfWNhdGNoKGUpe289YX19KCk7dmFyIHUsbD1bXSxwPSExLGQ9LTE7ZnVuY3Rpb24gaCgpe3AmJnUmJihwPSExLHUubGVuZ3RoP2w9dS5jb25jYXQobCk6ZD0tMSxsLmxlbmd0aCYmZigpKX1mdW5jdGlvbiBmKCl7aWYoIXApe3ZhciBlPWMoaCk7cD0hMDtmb3IodmFyIHQ9bC5sZW5ndGg7dDspe2Zvcih1PWwsbD1bXTsrK2Q8dDspdSYmdVtkXS5ydW4oKTtkPS0xLHQ9bC5sZW5ndGh9dT1udWxsLHA9ITEsZnVuY3Rpb24oZSl7aWYobz09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KGUpO2lmKChvPT09YXx8IW8pJiZjbGVhclRpbWVvdXQpcmV0dXJuIG89Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dChlKTt0cnl7cmV0dXJuIG8oZSl9Y2F0Y2godCl7dHJ5e3JldHVybiBvLmNhbGwobnVsbCxlKX1jYXRjaCh0KXtyZXR1cm4gby5jYWxsKHRoaXMsZSl9fX0oZSl9fWZ1bmN0aW9uIGcoZSx0KXt0aGlzLmZ1bj1lLHRoaXMuYXJyYXk9dH1mdW5jdGlvbiBtKCl7fWkubmV4dFRpY2s9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdFtuLTFdPWFyZ3VtZW50c1tuXTtsLnB1c2gobmV3IGcoZSx0KSksMSE9PWwubGVuZ3RofHxwfHxjKGYpfSxnLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfSxpLnRpdGxlPSJicm93c2VyIixpLmJyb3dzZXI9ITAsaS5lbnY9e30saS5hcmd2PVtdLGkudmVyc2lvbj0iIixpLnZlcnNpb25zPXt9LGkub249bSxpLmFkZExpc3RlbmVyPW0saS5vbmNlPW0saS5vZmY9bSxpLnJlbW92ZUxpc3RlbmVyPW0saS5yZW1vdmVBbGxMaXN0ZW5lcnM9bSxpLmVtaXQ9bSxpLnByZXBlbmRMaXN0ZW5lcj1tLGkucHJlcGVuZE9uY2VMaXN0ZW5lcj1tLGkubGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3JldHVybltdfSxpLmJpbmRpbmc9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCIpfSxpLmN3ZD1mdW5jdGlvbigpe3JldHVybiIvIn0saS5jaGRpcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSxpLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSx7fV0sOTI6W2Z1bmN0aW9uKGUsdCxvKXsoZnVuY3Rpb24oZSl7KGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKGkpeyJvYmplY3QiPT10eXBlb2YgbyYmbyYmby5ub2RlVHlwZSwib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQubm9kZVR5cGU7dmFyIHM9Im9iamVjdCI9PXR5cGVvZiBlJiZlO3MuZ2xvYmFsIT09cyYmcy53aW5kb3chPT1zJiZzLnNlbGY7dmFyIGEsYz0yMTQ3NDgzNjQ3LHU9MzYsbD0xLHA9MjYsZD0zOCxoPTcwMCxmPTcyLGc9MTI4LG09Ii0iLHY9L154bi0tLyx5PS9bXlx4MjAtXHg3RV0vLEU9L1tceDJFXHUzMDAyXHVGRjBFXHVGRjYxXS9nLFM9e292ZXJmbG93OiJPdmVyZmxvdzogaW5wdXQgbmVlZHMgd2lkZXIgaW50ZWdlcnMgdG8gcHJvY2VzcyIsIm5vdC1iYXNpYyI6IklsbGVnYWwgaW5wdXQgPj0gMHg4MCAobm90IGEgYmFzaWMgY29kZSBwb2ludCkiLCJpbnZhbGlkLWlucHV0IjoiSW52YWxpZCBpbnB1dCJ9LGI9dS1sLEM9TWF0aC5mbG9vcixUPVN0cmluZy5mcm9tQ2hhckNvZGU7ZnVuY3Rpb24gSShlKXt0aHJvdyBuZXcgUmFuZ2VFcnJvcihTW2VdKX1mdW5jdGlvbiBBKGUsdCl7Zm9yKHZhciBuPWUubGVuZ3RoLHI9W107bi0tOylyW25dPXQoZVtuXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gXyhlLHQpe3ZhciBuPWUuc3BsaXQoIkAiKSxyPSIiO3JldHVybiBuLmxlbmd0aD4xJiYocj1uWzBdKyJAIixlPW5bMV0pLHIrQSgoZT1lLnJlcGxhY2UoRSwiLiIpKS5zcGxpdCgiLiIpLHQpLmpvaW4oIi4iKX1mdW5jdGlvbiB3KGUpe2Zvcih2YXIgdCxuLHI9W10sbz0wLGk9ZS5sZW5ndGg7bzxpOykodD1lLmNoYXJDb2RlQXQobysrKSk+PTU1Mjk2JiZ0PD01NjMxOSYmbzxpPzU2MzIwPT0oNjQ1MTImKG49ZS5jaGFyQ29kZUF0KG8rKykpKT9yLnB1c2goKCgxMDIzJnQpPDwxMCkrKDEwMjMmbikrNjU1MzYpOihyLnB1c2godCksby0tKTpyLnB1c2godCk7cmV0dXJuIHJ9ZnVuY3Rpb24gUihlKXtyZXR1cm4gQShlLChmdW5jdGlvbihlKXt2YXIgdD0iIjtyZXR1cm4gZT42NTUzNSYmKHQrPVQoKGUtPTY1NTM2KT4+PjEwJjEwMjN8NTUyOTYpLGU9NTYzMjB8MTAyMyZlKSx0Kz1UKGUpfSkpLmpvaW4oIiIpfWZ1bmN0aW9uIGsoZSx0KXtyZXR1cm4gZSsyMis3NSooZTwyNiktKCgwIT10KTw8NSl9ZnVuY3Rpb24gTChlLHQsbil7dmFyIHI9MDtmb3IoZT1uP0MoZS9oKTplPj4xLGUrPUMoZS90KTtlPmIqcD4+MTtyKz11KWU9QyhlL2IpO3JldHVybiBDKHIrKGIrMSkqZS8oZStkKSl9ZnVuY3Rpb24gTihlKXt2YXIgdCxuLHIsbyxpLHMsYSxkLGgsdix5LEU9W10sUz1lLmxlbmd0aCxiPTAsVD1nLEE9Zjtmb3IoKG49ZS5sYXN0SW5kZXhPZihtKSk8MCYmKG49MCkscj0wO3I8bjsrK3IpZS5jaGFyQ29kZUF0KHIpPj0xMjgmJkkoIm5vdC1iYXNpYyIpLEUucHVzaChlLmNoYXJDb2RlQXQocikpO2ZvcihvPW4+MD9uKzE6MDtvPFM7KXtmb3IoaT1iLHM9MSxhPXU7bz49UyYmSSgiaW52YWxpZC1pbnB1dCIpLCgoZD0oeT1lLmNoYXJDb2RlQXQobysrKSktNDg8MTA/eS0yMjp5LTY1PDI2P3ktNjU6eS05NzwyNj95LTk3OnUpPj11fHxkPkMoKGMtYikvcykpJiZJKCJvdmVyZmxvdyIpLGIrPWQqcywhKGQ8KGg9YTw9QT9sOmE+PUErcD9wOmEtQSkpO2ErPXUpcz5DKGMvKHY9dS1oKSkmJkkoIm92ZXJmbG93Iikscyo9djtBPUwoYi1pLHQ9RS5sZW5ndGgrMSwwPT1pKSxDKGIvdCk+Yy1UJiZJKCJvdmVyZmxvdyIpLFQrPUMoYi90KSxiJT10LEUuc3BsaWNlKGIrKywwLFQpfXJldHVybiBSKEUpfWZ1bmN0aW9uIE8oZSl7dmFyIHQsbixyLG8saSxzLGEsZCxoLHYseSxFLFMsYixBLF89W107Zm9yKEU9KGU9dyhlKSkubGVuZ3RoLHQ9ZyxuPTAsaT1mLHM9MDtzPEU7KytzKSh5PWVbc10pPDEyOCYmXy5wdXNoKFQoeSkpO2ZvcihyPW89Xy5sZW5ndGgsbyYmXy5wdXNoKG0pO3I8RTspe2ZvcihhPWMscz0wO3M8RTsrK3MpKHk9ZVtzXSk+PXQmJnk8YSYmKGE9eSk7Zm9yKGEtdD5DKChjLW4pLyhTPXIrMSkpJiZJKCJvdmVyZmxvdyIpLG4rPShhLXQpKlMsdD1hLHM9MDtzPEU7KytzKWlmKCh5PWVbc10pPHQmJisrbj5jJiZJKCJvdmVyZmxvdyIpLHk9PXQpe2ZvcihkPW4saD11OyEoZDwodj1oPD1pP2w6aD49aStwP3A6aC1pKSk7aCs9dSlBPWQtdixiPXUtdixfLnB1c2goVChrKHYrQSViLDApKSksZD1DKEEvYik7Xy5wdXNoKFQoayhkLDApKSksaT1MKG4sUyxyPT1vKSxuPTAsKytyfSsrbiwrK3R9cmV0dXJuIF8uam9pbigiIil9YT17dmVyc2lvbjoiMS40LjEiLHVjczI6e2RlY29kZTp3LGVuY29kZTpSfSxkZWNvZGU6TixlbmNvZGU6Tyx0b0FTQ0lJOmZ1bmN0aW9uKGUpe3JldHVybiBfKGUsKGZ1bmN0aW9uKGUpe3JldHVybiB5LnRlc3QoZSk/InhuLS0iK08oZSk6ZX0pKX0sdG9Vbmljb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBfKGUsKGZ1bmN0aW9uKGUpe3JldHVybiB2LnRlc3QoZSk/TihlLnNsaWNlKDQpLnRvTG93ZXJDYXNlKCkpOmV9KSl9fSx2b2lkIDA9PT0ocj1mdW5jdGlvbigpe3JldHVybiBhfS5jYWxsKG8sbixvLHQpKXx8KHQuZXhwb3J0cz1yKX0oKX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsdm9pZCAwIT09bi5nP24uZzoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7fV0sOTM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX10LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4saSl7dD10fHwiJiIsbj1ufHwiPSI7dmFyIHM9e307aWYoInN0cmluZyIhPXR5cGVvZiBlfHwwPT09ZS5sZW5ndGgpcmV0dXJuIHM7dmFyIGE9L1wrL2c7ZT1lLnNwbGl0KHQpO3ZhciBjPTFlMztpJiYibnVtYmVyIj09dHlwZW9mIGkubWF4S2V5cyYmKGM9aS5tYXhLZXlzKTt2YXIgdT1lLmxlbmd0aDtjPjAmJnU+YyYmKHU9Yyk7Zm9yKHZhciBsPTA7bDx1OysrbCl7dmFyIHAsZCxoLGYsZz1lW2xdLnJlcGxhY2UoYSwiJTIwIiksbT1nLmluZGV4T2Yobik7bT49MD8ocD1nLnN1YnN0cigwLG0pLGQ9Zy5zdWJzdHIobSsxKSk6KHA9ZyxkPSIiKSxoPWRlY29kZVVSSUNvbXBvbmVudChwKSxmPWRlY29kZVVSSUNvbXBvbmVudChkKSxyKHMsaCk/byhzW2hdKT9zW2hdLnB1c2goZik6c1toXT1bc1toXSxmXTpzW2hdPWZ9cmV0dXJuIHN9O3ZhciBvPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9fSx7fV0sOTQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZnVuY3Rpb24oZSl7c3dpdGNoKHR5cGVvZiBlKXtjYXNlInN0cmluZyI6cmV0dXJuIGU7Y2FzZSJib29sZWFuIjpyZXR1cm4gZT8idHJ1ZSI6ImZhbHNlIjtjYXNlIm51bWJlciI6cmV0dXJuIGlzRmluaXRlKGUpP2U6IiI7ZGVmYXVsdDpyZXR1cm4iIn19O3QuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixhKXtyZXR1cm4gdD10fHwiJiIsbj1ufHwiPSIsbnVsbD09PWUmJihlPXZvaWQgMCksIm9iamVjdCI9PXR5cGVvZiBlP2kocyhlKSwoZnVuY3Rpb24ocyl7dmFyIGE9ZW5jb2RlVVJJQ29tcG9uZW50KHIocykpK247cmV0dXJuIG8oZVtzXSk/aShlW3NdLChmdW5jdGlvbihlKXtyZXR1cm4gYStlbmNvZGVVUklDb21wb25lbnQocihlKSl9KSkuam9pbih0KTphK2VuY29kZVVSSUNvbXBvbmVudChyKGVbc10pKX0pKS5qb2luKHQpOmE/ZW5jb2RlVVJJQ29tcG9uZW50KHIoYSkpK24rZW5jb2RlVVJJQ29tcG9uZW50KHIoZSkpOiIifTt2YXIgbz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfTtmdW5jdGlvbiBpKGUsdCl7aWYoZS5tYXApcmV0dXJuIGUubWFwKHQpO2Zvcih2YXIgbj1bXSxyPTA7cjxlLmxlbmd0aDtyKyspbi5wdXNoKHQoZVtyXSxyKSk7cmV0dXJuIG59dmFyIHM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKGUpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiZ0LnB1c2gobik7cmV0dXJuIHR9fSx7fV0sOTU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5kZWNvZGU9bi5wYXJzZT1lKCIuL2RlY29kZSIpLG4uZW5jb2RlPW4uc3RyaW5naWZ5PWUoIi4vZW5jb2RlIil9LHsiLi9kZWNvZGUiOjkzLCIuL2VuY29kZSI6OTR9XSw5NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfXQuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixvKXt0PXR8fCImIixuPW58fCI9Ijt2YXIgaT17fTtpZigic3RyaW5nIiE9dHlwZW9mIGV8fDA9PT1lLmxlbmd0aClyZXR1cm4gaTt2YXIgcz0vXCsvZztlPWUuc3BsaXQodCk7dmFyIGE9MWUzO28mJiJudW1iZXIiPT10eXBlb2Ygby5tYXhLZXlzJiYoYT1vLm1heEtleXMpO3ZhciBjPWUubGVuZ3RoO2E+MCYmYz5hJiYoYz1hKTtmb3IodmFyIHU9MDt1PGM7Kyt1KXt2YXIgbCxwLGQsaCxmPWVbdV0ucmVwbGFjZShzLCIlMjAiKSxnPWYuaW5kZXhPZihuKTtnPj0wPyhsPWYuc3Vic3RyKDAsZykscD1mLnN1YnN0cihnKzEpKToobD1mLHA9IiIpLGQ9ZGVjb2RlVVJJQ29tcG9uZW50KGwpLGg9ZGVjb2RlVVJJQ29tcG9uZW50KHApLHIoaSxkKT9BcnJheS5pc0FycmF5KGlbZF0pP2lbZF0ucHVzaChoKTppW2RdPVtpW2RdLGhdOmlbZF09aH1yZXR1cm4gaX19LHt9XSw5NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1mdW5jdGlvbihlKXtzd2l0Y2godHlwZW9mIGUpe2Nhc2Uic3RyaW5nIjpyZXR1cm4gZTtjYXNlImJvb2xlYW4iOnJldHVybiBlPyJ0cnVlIjoiZmFsc2UiO2Nhc2UibnVtYmVyIjpyZXR1cm4gaXNGaW5pdGUoZSk/ZToiIjtkZWZhdWx0OnJldHVybiIifX07dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLG8pe3JldHVybiB0PXR8fCImIixuPW58fCI9IixudWxsPT09ZSYmKGU9dm9pZCAwKSwib2JqZWN0Ij09dHlwZW9mIGU/T2JqZWN0LmtleXMoZSkubWFwKChmdW5jdGlvbihvKXt2YXIgaT1lbmNvZGVVUklDb21wb25lbnQocihvKSkrbjtyZXR1cm4gQXJyYXkuaXNBcnJheShlW29dKT9lW29dLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGkrZW5jb2RlVVJJQ29tcG9uZW50KHIoZSkpfSkpLmpvaW4odCk6aStlbmNvZGVVUklDb21wb25lbnQocihlW29dKSl9KSkuam9pbih0KTpvP2VuY29kZVVSSUNvbXBvbmVudChyKG8pKStuK2VuY29kZVVSSUNvbXBvbmVudChyKGUpKToiIn19LHt9XSw5ODpbZnVuY3Rpb24oZSx0LG4pe2FyZ3VtZW50c1s0XVs5NV1bMF0uYXBwbHkobixhcmd1bWVudHMpfSx7Ii4vZGVjb2RlIjo5NiwiLi9lbmNvZGUiOjk3LGR1cDo5NX1dLDk5OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKHQscil7KGZ1bmN0aW9uKCl7dmFyIG89ZSgicHJvY2Vzcy9icm93c2VyLmpzIikubmV4dFRpY2ssaT1GdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkscz1BcnJheS5wcm90b3R5cGUuc2xpY2UsYT17fSxjPTA7ZnVuY3Rpb24gdShlLHQpe3RoaXMuX2lkPWUsdGhpcy5fY2xlYXJGbj10fW4uc2V0VGltZW91dD1mdW5jdGlvbigpe3JldHVybiBuZXcgdShpLmNhbGwoc2V0VGltZW91dCx3aW5kb3csYXJndW1lbnRzKSxjbGVhclRpbWVvdXQpfSxuLnNldEludGVydmFsPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1KGkuY2FsbChzZXRJbnRlcnZhbCx3aW5kb3csYXJndW1lbnRzKSxjbGVhckludGVydmFsKX0sbi5jbGVhclRpbWVvdXQ9bi5jbGVhckludGVydmFsPWZ1bmN0aW9uKGUpe2UuY2xvc2UoKX0sdS5wcm90b3R5cGUudW5yZWY9dS5wcm90b3R5cGUucmVmPWZ1bmN0aW9uKCl7fSx1LnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3RoaXMuX2NsZWFyRm4uY2FsbCh3aW5kb3csdGhpcy5faWQpfSxuLmVucm9sbD1mdW5jdGlvbihlLHQpe2NsZWFyVGltZW91dChlLl9pZGxlVGltZW91dElkKSxlLl9pZGxlVGltZW91dD10fSxuLnVuZW5yb2xsPWZ1bmN0aW9uKGUpe2NsZWFyVGltZW91dChlLl9pZGxlVGltZW91dElkKSxlLl9pZGxlVGltZW91dD0tMX0sbi5fdW5yZWZBY3RpdmU9bi5hY3RpdmU9ZnVuY3Rpb24oZSl7Y2xlYXJUaW1lb3V0KGUuX2lkbGVUaW1lb3V0SWQpO3ZhciB0PWUuX2lkbGVUaW1lb3V0O3Q+PTAmJihlLl9pZGxlVGltZW91dElkPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZS5fb25UaW1lb3V0JiZlLl9vblRpbWVvdXQoKX0pLHQpKX0sbi5zZXRJbW1lZGlhdGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmdW5jdGlvbihlKXt2YXIgdD1jKysscj0hKGFyZ3VtZW50cy5sZW5ndGg8MikmJnMuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIGFbdF09ITAsbygoZnVuY3Rpb24oKXthW3RdJiYocj9lLmFwcGx5KG51bGwscik6ZS5jYWxsKG51bGwpLG4uY2xlYXJJbW1lZGlhdGUodCkpfSkpLHR9LG4uY2xlYXJJbW1lZGlhdGU9ImZ1bmN0aW9uIj09dHlwZW9mIHI/cjpmdW5jdGlvbihlKXtkZWxldGUgYVtlXX19KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoInRpbWVycyIpLnNldEltbWVkaWF0ZSxlKCJ0aW1lcnMiKS5jbGVhckltbWVkaWF0ZSl9LHsicHJvY2Vzcy9icm93c2VyLmpzIjo5MSx0aW1lcnM6OTl9XSwxMDA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCJwdW55Y29kZSIpO2Z1bmN0aW9uIG8oKXt0aGlzLnByb3RvY29sPW51bGwsdGhpcy5zbGFzaGVzPW51bGwsdGhpcy5hdXRoPW51bGwsdGhpcy5ob3N0PW51bGwsdGhpcy5wb3J0PW51bGwsdGhpcy5ob3N0bmFtZT1udWxsLHRoaXMuaGFzaD1udWxsLHRoaXMuc2VhcmNoPW51bGwsdGhpcy5xdWVyeT1udWxsLHRoaXMucGF0aG5hbWU9bnVsbCx0aGlzLnBhdGg9bnVsbCx0aGlzLmhyZWY9bnVsbH1uLnBhcnNlPXYsbi5yZXNvbHZlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHYoZSwhMSwhMCkucmVzb2x2ZSh0KX0sbi5yZXNvbHZlT2JqZWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU/dihlLCExLCEwKS5yZXNvbHZlT2JqZWN0KHQpOnR9LG4uZm9ybWF0PWZ1bmN0aW9uKGUpe3JldHVybiB5KGUpJiYoZT12KGUpKSxlIGluc3RhbmNlb2Ygbz9lLmZvcm1hdCgpOm8ucHJvdG90eXBlLmZvcm1hdC5jYWxsKGUpfSxuLlVybD1vO3ZhciBpPS9eKFthLXowLTkuKy1dKzopL2kscz0vOlswLTldKiQvLGE9WyJ7IiwifSIsInwiLCJcXCIsIl4iLCJgIl0uY29uY2F0KFsiPCIsIj4iLCciJywiYCIsIiAiLCJcciIsIlxuIiwiXHQiXSksYz1bIiciXS5jb25jYXQoYSksdT1bIiUiLCIvIiwiPyIsIjsiLCIjIl0uY29uY2F0KGMpLGw9WyIvIiwiPyIsIiMiXSxwPS9eW2EtejAtOUEtWl8tXXswLDYzfSQvLGQ9L14oW2EtejAtOUEtWl8tXXswLDYzfSkoLiopJC8saD17amF2YXNjcmlwdDohMCwiamF2YXNjcmlwdDoiOiEwfSxmPXtqYXZhc2NyaXB0OiEwLCJqYXZhc2NyaXB0OiI6ITB9LGc9e2h0dHA6ITAsaHR0cHM6ITAsZnRwOiEwLGdvcGhlcjohMCxmaWxlOiEwLCJodHRwOiI6ITAsImh0dHBzOiI6ITAsImZ0cDoiOiEwLCJnb3BoZXI6IjohMCwiZmlsZToiOiEwfSxtPWUoInF1ZXJ5c3RyaW5nIik7ZnVuY3Rpb24gdihlLHQsbil7aWYoZSYmRShlKSYmZSBpbnN0YW5jZW9mIG8pcmV0dXJuIGU7dmFyIHI9bmV3IG87cmV0dXJuIHIucGFyc2UoZSx0LG4pLHJ9ZnVuY3Rpb24geShlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV9ZnVuY3Rpb24gRShlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lfWZ1bmN0aW9uIFMoZSl7cmV0dXJuIG51bGw9PT1lfW8ucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGUsdCxuKXtpZigheShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJQYXJhbWV0ZXIgJ3VybCcgbXVzdCBiZSBhIHN0cmluZywgbm90ICIrdHlwZW9mIGUpO3ZhciBvPWU7bz1vLnRyaW0oKTt2YXIgcz1pLmV4ZWMobyk7aWYocyl7dmFyIGE9KHM9c1swXSkudG9Mb3dlckNhc2UoKTt0aGlzLnByb3RvY29sPWEsbz1vLnN1YnN0cihzLmxlbmd0aCl9aWYobnx8c3x8by5tYXRjaCgvXlwvXC9bXkBcL10rQFteQFwvXSsvKSl7dmFyIHY9Ii8vIj09PW8uc3Vic3RyKDAsMik7IXZ8fHMmJmZbc118fChvPW8uc3Vic3RyKDIpLHRoaXMuc2xhc2hlcz0hMCl9aWYoIWZbc10mJih2fHxzJiYhZ1tzXSkpe2Zvcih2YXIgRSxTLGI9LTEsQz0wO0M8bC5sZW5ndGg7QysrKS0xIT09KFQ9by5pbmRleE9mKGxbQ10pKSYmKC0xPT09Ynx8VDxiKSYmKGI9VCk7Zm9yKC0xIT09KFM9LTE9PT1iP28ubGFzdEluZGV4T2YoIkAiKTpvLmxhc3RJbmRleE9mKCJAIixiKSkmJihFPW8uc2xpY2UoMCxTKSxvPW8uc2xpY2UoUysxKSx0aGlzLmF1dGg9ZGVjb2RlVVJJQ29tcG9uZW50KEUpKSxiPS0xLEM9MDtDPHUubGVuZ3RoO0MrKyl7dmFyIFQ7LTEhPT0oVD1vLmluZGV4T2YodVtDXSkpJiYoLTE9PT1ifHxUPGIpJiYoYj1UKX0tMT09PWImJihiPW8ubGVuZ3RoKSx0aGlzLmhvc3Q9by5zbGljZSgwLGIpLG89by5zbGljZShiKSx0aGlzLnBhcnNlSG9zdCgpLHRoaXMuaG9zdG5hbWU9dGhpcy5ob3N0bmFtZXx8IiI7dmFyIEk9IlsiPT09dGhpcy5ob3N0bmFtZVswXSYmIl0iPT09dGhpcy5ob3N0bmFtZVt0aGlzLmhvc3RuYW1lLmxlbmd0aC0xXTtpZighSSlmb3IodmFyIEE9dGhpcy5ob3N0bmFtZS5zcGxpdCgvXC4vKSxfPShDPTAsQS5sZW5ndGgpO0M8XztDKyspe3ZhciB3PUFbQ107aWYodyYmIXcubWF0Y2gocCkpe2Zvcih2YXIgUj0iIixrPTAsTD13Lmxlbmd0aDtrPEw7aysrKXcuY2hhckNvZGVBdChrKT4xMjc/Uis9IngiOlIrPXdba107aWYoIVIubWF0Y2gocCkpe3ZhciBOPUEuc2xpY2UoMCxDKSxPPUEuc2xpY2UoQysxKSxEPXcubWF0Y2goZCk7RCYmKE4ucHVzaChEWzFdKSxPLnVuc2hpZnQoRFsyXSkpLE8ubGVuZ3RoJiYobz0iLyIrTy5qb2luKCIuIikrbyksdGhpcy5ob3N0bmFtZT1OLmpvaW4oIi4iKTticmVha319fWlmKHRoaXMuaG9zdG5hbWUubGVuZ3RoPjI1NT90aGlzLmhvc3RuYW1lPSIiOnRoaXMuaG9zdG5hbWU9dGhpcy5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpLCFJKXt2YXIgUD10aGlzLmhvc3RuYW1lLnNwbGl0KCIuIikseD1bXTtmb3IoQz0wO0M8UC5sZW5ndGg7KytDKXt2YXIgTT1QW0NdO3gucHVzaChNLm1hdGNoKC9bXkEtWmEtejAtOV8tXS8pPyJ4bi0tIityLmVuY29kZShNKTpNKX10aGlzLmhvc3RuYW1lPXguam9pbigiLiIpfXZhciBVPXRoaXMucG9ydD8iOiIrdGhpcy5wb3J0OiIiLEY9dGhpcy5ob3N0bmFtZXx8IiI7dGhpcy5ob3N0PUYrVSx0aGlzLmhyZWYrPXRoaXMuaG9zdCxJJiYodGhpcy5ob3N0bmFtZT10aGlzLmhvc3RuYW1lLnN1YnN0cigxLHRoaXMuaG9zdG5hbWUubGVuZ3RoLTIpLCIvIiE9PW9bMF0mJihvPSIvIitvKSl9aWYoIWhbYV0pZm9yKEM9MCxfPWMubGVuZ3RoO0M8XztDKyspe3ZhciBxPWNbQ10sQj1lbmNvZGVVUklDb21wb25lbnQocSk7Qj09PXEmJihCPWVzY2FwZShxKSksbz1vLnNwbGl0KHEpLmpvaW4oQil9dmFyIGo9by5pbmRleE9mKCIjIik7LTEhPT1qJiYodGhpcy5oYXNoPW8uc3Vic3RyKGopLG89by5zbGljZSgwLGopKTt2YXIgVj1vLmluZGV4T2YoIj8iKTtyZXR1cm4tMSE9PVY/KHRoaXMuc2VhcmNoPW8uc3Vic3RyKFYpLHRoaXMucXVlcnk9by5zdWJzdHIoVisxKSx0JiYodGhpcy5xdWVyeT1tLnBhcnNlKHRoaXMucXVlcnkpKSxvPW8uc2xpY2UoMCxWKSk6dCYmKHRoaXMuc2VhcmNoPSIiLHRoaXMucXVlcnk9e30pLG8mJih0aGlzLnBhdGhuYW1lPW8pLGdbYV0mJnRoaXMuaG9zdG5hbWUmJiF0aGlzLnBhdGhuYW1lJiYodGhpcy5wYXRobmFtZT0iLyIpLCh0aGlzLnBhdGhuYW1lfHx0aGlzLnNlYXJjaCkmJihVPXRoaXMucGF0aG5hbWV8fCIiLE09dGhpcy5zZWFyY2h8fCIiLHRoaXMucGF0aD1VK00pLHRoaXMuaHJlZj10aGlzLmZvcm1hdCgpLHRoaXN9LG8ucHJvdG90eXBlLmZvcm1hdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuYXV0aHx8IiI7ZSYmKGU9KGU9ZW5jb2RlVVJJQ29tcG9uZW50KGUpKS5yZXBsYWNlKC8lM0EvaSwiOiIpLGUrPSJAIik7dmFyIHQ9dGhpcy5wcm90b2NvbHx8IiIsbj10aGlzLnBhdGhuYW1lfHwiIixyPXRoaXMuaGFzaHx8IiIsbz0hMSxpPSIiO3RoaXMuaG9zdD9vPWUrdGhpcy5ob3N0OnRoaXMuaG9zdG5hbWUmJihvPWUrKC0xPT09dGhpcy5ob3N0bmFtZS5pbmRleE9mKCI6Iik/dGhpcy5ob3N0bmFtZToiWyIrdGhpcy5ob3N0bmFtZSsiXSIpLHRoaXMucG9ydCYmKG8rPSI6Iit0aGlzLnBvcnQpKSx0aGlzLnF1ZXJ5JiZFKHRoaXMucXVlcnkpJiZPYmplY3Qua2V5cyh0aGlzLnF1ZXJ5KS5sZW5ndGgmJihpPW0uc3RyaW5naWZ5KHRoaXMucXVlcnkpKTt2YXIgcz10aGlzLnNlYXJjaHx8aSYmIj8iK2l8fCIiO3JldHVybiB0JiYiOiIhPT10LnN1YnN0cigtMSkmJih0Kz0iOiIpLHRoaXMuc2xhc2hlc3x8KCF0fHxnW3RdKSYmITEhPT1vPyhvPSIvLyIrKG98fCIiKSxuJiYiLyIhPT1uLmNoYXJBdCgwKSYmKG49Ii8iK24pKTpvfHwobz0iIiksciYmIiMiIT09ci5jaGFyQXQoMCkmJihyPSIjIityKSxzJiYiPyIhPT1zLmNoYXJBdCgwKSYmKHM9Ij8iK3MpLHQrbysobj1uLnJlcGxhY2UoL1s/I10vZywoZnVuY3Rpb24oZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKX0pKSkrKHM9cy5yZXBsYWNlKCIjIiwiJTIzIikpK3J9LG8ucHJvdG90eXBlLnJlc29sdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVzb2x2ZU9iamVjdCh2KGUsITEsITApKS5mb3JtYXQoKX0sby5wcm90b3R5cGUucmVzb2x2ZU9iamVjdD1mdW5jdGlvbihlKXtpZih5KGUpKXt2YXIgdD1uZXcgbzt0LnBhcnNlKGUsITEsITApLGU9dH12YXIgbj1uZXcgbztpZihPYmplY3Qua2V5cyh0aGlzKS5mb3JFYWNoKChmdW5jdGlvbihlKXtuW2VdPXRoaXNbZV19KSx0aGlzKSxuLmhhc2g9ZS5oYXNoLCIiPT09ZS5ocmVmKXJldHVybiBuLmhyZWY9bi5mb3JtYXQoKSxuO2lmKGUuc2xhc2hlcyYmIWUucHJvdG9jb2wpcmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpeyJwcm90b2NvbCIhPT10JiYoblt0XT1lW3RdKX0pKSxnW24ucHJvdG9jb2xdJiZuLmhvc3RuYW1lJiYhbi5wYXRobmFtZSYmKG4ucGF0aD1uLnBhdGhuYW1lPSIvIiksbi5ocmVmPW4uZm9ybWF0KCksbjtpZihlLnByb3RvY29sJiZlLnByb3RvY29sIT09bi5wcm90b2NvbCl7aWYoIWdbZS5wcm90b2NvbF0pcmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpe25bdF09ZVt0XX0pKSxuLmhyZWY9bi5mb3JtYXQoKSxuO2lmKG4ucHJvdG9jb2w9ZS5wcm90b2NvbCxlLmhvc3R8fGZbZS5wcm90b2NvbF0pbi5wYXRobmFtZT1lLnBhdGhuYW1lO2Vsc2V7Zm9yKHZhciByPShlLnBhdGhuYW1lfHwiIikuc3BsaXQoIi8iKTtyLmxlbmd0aCYmIShlLmhvc3Q9ci5zaGlmdCgpKTspO2UuaG9zdHx8KGUuaG9zdD0iIiksZS5ob3N0bmFtZXx8KGUuaG9zdG5hbWU9IiIpLCIiIT09clswXSYmci51bnNoaWZ0KCIiKSxyLmxlbmd0aDwyJiZyLnVuc2hpZnQoIiIpLG4ucGF0aG5hbWU9ci5qb2luKCIvIil9aWYobi5zZWFyY2g9ZS5zZWFyY2gsbi5xdWVyeT1lLnF1ZXJ5LG4uaG9zdD1lLmhvc3R8fCIiLG4uYXV0aD1lLmF1dGgsbi5ob3N0bmFtZT1lLmhvc3RuYW1lfHxlLmhvc3Qsbi5wb3J0PWUucG9ydCxuLnBhdGhuYW1lfHxuLnNlYXJjaCl7dmFyIGk9bi5wYXRobmFtZXx8IiIscz1uLnNlYXJjaHx8IiI7bi5wYXRoPWkrc31yZXR1cm4gbi5zbGFzaGVzPW4uc2xhc2hlc3x8ZS5zbGFzaGVzLG4uaHJlZj1uLmZvcm1hdCgpLG59dmFyIGE9bi5wYXRobmFtZSYmIi8iPT09bi5wYXRobmFtZS5jaGFyQXQoMCksYz1lLmhvc3R8fGUucGF0aG5hbWUmJiIvIj09PWUucGF0aG5hbWUuY2hhckF0KDApLHU9Y3x8YXx8bi5ob3N0JiZlLnBhdGhuYW1lLGw9dSxwPW4ucGF0aG5hbWUmJm4ucGF0aG5hbWUuc3BsaXQoIi8iKXx8W10sZD0ocj1lLnBhdGhuYW1lJiZlLnBhdGhuYW1lLnNwbGl0KCIvIil8fFtdLG4ucHJvdG9jb2wmJiFnW24ucHJvdG9jb2xdKTtpZihkJiYobi5ob3N0bmFtZT0iIixuLnBvcnQ9bnVsbCxuLmhvc3QmJigiIj09PXBbMF0/cFswXT1uLmhvc3Q6cC51bnNoaWZ0KG4uaG9zdCkpLG4uaG9zdD0iIixlLnByb3RvY29sJiYoZS5ob3N0bmFtZT1udWxsLGUucG9ydD1udWxsLGUuaG9zdCYmKCIiPT09clswXT9yWzBdPWUuaG9zdDpyLnVuc2hpZnQoZS5ob3N0KSksZS5ob3N0PW51bGwpLHU9dSYmKCIiPT09clswXXx8IiI9PT1wWzBdKSksYyluLmhvc3Q9ZS5ob3N0fHwiIj09PWUuaG9zdD9lLmhvc3Q6bi5ob3N0LG4uaG9zdG5hbWU9ZS5ob3N0bmFtZXx8IiI9PT1lLmhvc3RuYW1lP2UuaG9zdG5hbWU6bi5ob3N0bmFtZSxuLnNlYXJjaD1lLnNlYXJjaCxuLnF1ZXJ5PWUucXVlcnkscD1yO2Vsc2UgaWYoci5sZW5ndGgpcHx8KHA9W10pLHAucG9wKCkscD1wLmNvbmNhdChyKSxuLnNlYXJjaD1lLnNlYXJjaCxuLnF1ZXJ5PWUucXVlcnk7ZWxzZSBpZihudWxsIT1lLnNlYXJjaClyZXR1cm4gZCYmKG4uaG9zdG5hbWU9bi5ob3N0PXAuc2hpZnQoKSwoYj0hIShuLmhvc3QmJm4uaG9zdC5pbmRleE9mKCJAIik+MCkmJm4uaG9zdC5zcGxpdCgiQCIpKSYmKG4uYXV0aD1iLnNoaWZ0KCksbi5ob3N0PW4uaG9zdG5hbWU9Yi5zaGlmdCgpKSksbi5zZWFyY2g9ZS5zZWFyY2gsbi5xdWVyeT1lLnF1ZXJ5LFMobi5wYXRobmFtZSkmJlMobi5zZWFyY2gpfHwobi5wYXRoPShuLnBhdGhuYW1lP24ucGF0aG5hbWU6IiIpKyhuLnNlYXJjaD9uLnNlYXJjaDoiIikpLG4uaHJlZj1uLmZvcm1hdCgpLG47aWYoIXAubGVuZ3RoKXJldHVybiBuLnBhdGhuYW1lPW51bGwsbi5zZWFyY2g/bi5wYXRoPSIvIituLnNlYXJjaDpuLnBhdGg9bnVsbCxuLmhyZWY9bi5mb3JtYXQoKSxuO2Zvcih2YXIgaD1wLnNsaWNlKC0xKVswXSxtPShuLmhvc3R8fGUuaG9zdCkmJigiLiI9PT1ofHwiLi4iPT09aCl8fCIiPT09aCx2PTAsRT1wLmxlbmd0aDtFPj0wO0UtLSkiLiI9PShoPXBbRV0pP3Auc3BsaWNlKEUsMSk6Ii4uIj09PWg/KHAuc3BsaWNlKEUsMSksdisrKTp2JiYocC5zcGxpY2UoRSwxKSx2LS0pO2lmKCF1JiYhbClmb3IoO3YtLTt2KXAudW5zaGlmdCgiLi4iKTshdXx8IiI9PT1wWzBdfHxwWzBdJiYiLyI9PT1wWzBdLmNoYXJBdCgwKXx8cC51bnNoaWZ0KCIiKSxtJiYiLyIhPT1wLmpvaW4oIi8iKS5zdWJzdHIoLTEpJiZwLnB1c2goIiIpO3ZhciBiLEM9IiI9PT1wWzBdfHxwWzBdJiYiLyI9PT1wWzBdLmNoYXJBdCgwKTtyZXR1cm4gZCYmKG4uaG9zdG5hbWU9bi5ob3N0PUM/IiI6cC5sZW5ndGg/cC5zaGlmdCgpOiIiLChiPSEhKG4uaG9zdCYmbi5ob3N0LmluZGV4T2YoIkAiKT4wKSYmbi5ob3N0LnNwbGl0KCJAIikpJiYobi5hdXRoPWIuc2hpZnQoKSxuLmhvc3Q9bi5ob3N0bmFtZT1iLnNoaWZ0KCkpKSwodT11fHxuLmhvc3QmJnAubGVuZ3RoKSYmIUMmJnAudW5zaGlmdCgiIikscC5sZW5ndGg/bi5wYXRobmFtZT1wLmpvaW4oIi8iKToobi5wYXRobmFtZT1udWxsLG4ucGF0aD1udWxsKSxTKG4ucGF0aG5hbWUpJiZTKG4uc2VhcmNoKXx8KG4ucGF0aD0obi5wYXRobmFtZT9uLnBhdGhuYW1lOiIiKSsobi5zZWFyY2g/bi5zZWFyY2g6IiIpKSxuLmF1dGg9ZS5hdXRofHxuLmF1dGgsbi5zbGFzaGVzPW4uc2xhc2hlc3x8ZS5zbGFzaGVzLG4uaHJlZj1uLmZvcm1hdCgpLG59LG8ucHJvdG90eXBlLnBhcnNlSG9zdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuaG9zdCx0PXMuZXhlYyhlKTt0JiYoIjoiIT09KHQ9dFswXSkmJih0aGlzLnBvcnQ9dC5zdWJzdHIoMSkpLGU9ZS5zdWJzdHIoMCxlLmxlbmd0aC10Lmxlbmd0aCkpLGUmJih0aGlzLmhvc3RuYW1lPWUpfX0se3B1bnljb2RlOjkyLHF1ZXJ5c3RyaW5nOjk1fV0sMTAxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9dm9pZCAwO2Zvcih2YXIgcj1bXSxvPTA7bzwyNTY7KytvKXJbb109KG8rMjU2KS50b1N0cmluZygxNikuc3Vic3RyKDEpO3ZhciBpPWZ1bmN0aW9uKGUsdCl7dmFyIG49dHx8MCxvPXI7cmV0dXJuW29bZVtuKytdXSxvW2VbbisrXV0sb1tlW24rK11dLG9bZVtuKytdXSwiLSIsb1tlW24rK11dLG9bZVtuKytdXSwiLSIsb1tlW24rK11dLG9bZVtuKytdXSwiLSIsb1tlW24rK11dLG9bZVtuKytdXSwiLSIsb1tlW24rK11dLG9bZVtuKytdXSxvW2VbbisrXV0sb1tlW24rK11dLG9bZVtuKytdXSxvW2VbbisrXV1dLmpvaW4oIiIpfTtuLmRlZmF1bHQ9aX0se31dLDEwMjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sInYxIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5kZWZhdWx0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJ2MyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG8uZGVmYXVsdH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobiwidjQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBpLmRlZmF1bHR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sInY1Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcy5kZWZhdWx0fX0pO3ZhciByPWEoZSgiLi92MS5qcyIpKSxvPWEoZSgiLi92My5qcyIpKSxpPWEoZSgiLi92NC5qcyIpKSxzPWEoZSgiLi92NS5qcyIpKTtmdW5jdGlvbiBhKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX19LHsiLi92MS5qcyI6MTA2LCIuL3YzLmpzIjoxMDcsIi4vdjQuanMiOjEwOSwiLi92NS5qcyI6MTEwfV0sMTAzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXt2YXIgbj0oNjU1MzUmZSkrKDY1NTM1JnQpO3JldHVybihlPj4xNikrKHQ+PjE2KSsobj4+MTYpPDwxNnw2NTUzNSZufWZ1bmN0aW9uIG8oZSx0LG4sbyxpLHMpe3JldHVybiByKChhPXIocih0LGUpLHIobyxzKSkpPDwoYz1pKXxhPj4+MzItYyxuKTt2YXIgYSxjfWZ1bmN0aW9uIGkoZSx0LG4scixpLHMsYSl7cmV0dXJuIG8odCZufH50JnIsZSx0LGkscyxhKX1mdW5jdGlvbiBzKGUsdCxuLHIsaSxzLGEpe3JldHVybiBvKHQmcnxuJn5yLGUsdCxpLHMsYSl9ZnVuY3Rpb24gYShlLHQsbixyLGkscyxhKXtyZXR1cm4gbyh0Xm5ecixlLHQsaSxzLGEpfWZ1bmN0aW9uIGMoZSx0LG4scixpLHMsYSl7cmV0dXJuIG8obl4odHx+ciksZSx0LGkscyxhKX1PYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PXZvaWQgMDt2YXIgdT1mdW5jdGlvbihlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpe3ZhciB0PXVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlKSk7ZT1uZXcgQXJyYXkodC5sZW5ndGgpO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWVbbl09dC5jaGFyQ29kZUF0KG4pfXJldHVybiBmdW5jdGlvbihlKXt2YXIgdCxuLHIsbz1bXSxpPTMyKmUubGVuZ3RoLHM9IjAxMjM0NTY3ODlhYmNkZWYiO2Zvcih0PTA7dDxpO3QrPTgpbj1lW3Q+PjVdPj4+dCUzMiYyNTUscj1wYXJzZUludChzLmNoYXJBdChuPj4+NCYxNSkrcy5jaGFyQXQoMTUmbiksMTYpLG8ucHVzaChyKTtyZXR1cm4gb30oZnVuY3Rpb24oZSx0KXt2YXIgbixvLHUsbCxwO2VbdD4+NV18PTEyODw8dCUzMixlWzE0Kyh0KzY0Pj4+OTw8NCldPXQ7dmFyIGQ9MTczMjU4NDE5MyxoPS0yNzE3MzM4NzksZj0tMTczMjU4NDE5NCxnPTI3MTczMzg3ODtmb3Iobj0wO248ZS5sZW5ndGg7bis9MTYpbz1kLHU9aCxsPWYscD1nLGQ9aShkLGgsZixnLGVbbl0sNywtNjgwODc2OTM2KSxnPWkoZyxkLGgsZixlW24rMV0sMTIsLTM4OTU2NDU4NiksZj1pKGYsZyxkLGgsZVtuKzJdLDE3LDYwNjEwNTgxOSksaD1pKGgsZixnLGQsZVtuKzNdLDIyLC0xMDQ0NTI1MzMwKSxkPWkoZCxoLGYsZyxlW24rNF0sNywtMTc2NDE4ODk3KSxnPWkoZyxkLGgsZixlW24rNV0sMTIsMTIwMDA4MDQyNiksZj1pKGYsZyxkLGgsZVtuKzZdLDE3LC0xNDczMjMxMzQxKSxoPWkoaCxmLGcsZCxlW24rN10sMjIsLTQ1NzA1OTgzKSxkPWkoZCxoLGYsZyxlW24rOF0sNywxNzcwMDM1NDE2KSxnPWkoZyxkLGgsZixlW24rOV0sMTIsLTE5NTg0MTQ0MTcpLGY9aShmLGcsZCxoLGVbbisxMF0sMTcsLTQyMDYzKSxoPWkoaCxmLGcsZCxlW24rMTFdLDIyLC0xOTkwNDA0MTYyKSxkPWkoZCxoLGYsZyxlW24rMTJdLDcsMTgwNDYwMzY4MiksZz1pKGcsZCxoLGYsZVtuKzEzXSwxMiwtNDAzNDExMDEpLGY9aShmLGcsZCxoLGVbbisxNF0sMTcsLTE1MDIwMDIyOTApLGQ9cyhkLGg9aShoLGYsZyxkLGVbbisxNV0sMjIsMTIzNjUzNTMyOSksZixnLGVbbisxXSw1LC0xNjU3OTY1MTApLGc9cyhnLGQsaCxmLGVbbis2XSw5LC0xMDY5NTAxNjMyKSxmPXMoZixnLGQsaCxlW24rMTFdLDE0LDY0MzcxNzcxMyksaD1zKGgsZixnLGQsZVtuXSwyMCwtMzczODk3MzAyKSxkPXMoZCxoLGYsZyxlW24rNV0sNSwtNzAxNTU4NjkxKSxnPXMoZyxkLGgsZixlW24rMTBdLDksMzgwMTYwODMpLGY9cyhmLGcsZCxoLGVbbisxNV0sMTQsLTY2MDQ3ODMzNSksaD1zKGgsZixnLGQsZVtuKzRdLDIwLC00MDU1Mzc4NDgpLGQ9cyhkLGgsZixnLGVbbis5XSw1LDU2ODQ0NjQzOCksZz1zKGcsZCxoLGYsZVtuKzE0XSw5LC0xMDE5ODAzNjkwKSxmPXMoZixnLGQsaCxlW24rM10sMTQsLTE4NzM2Mzk2MSksaD1zKGgsZixnLGQsZVtuKzhdLDIwLDExNjM1MzE1MDEpLGQ9cyhkLGgsZixnLGVbbisxM10sNSwtMTQ0NDY4MTQ2NyksZz1zKGcsZCxoLGYsZVtuKzJdLDksLTUxNDAzNzg0KSxmPXMoZixnLGQsaCxlW24rN10sMTQsMTczNTMyODQ3MyksZD1hKGQsaD1zKGgsZixnLGQsZVtuKzEyXSwyMCwtMTkyNjYwNzczNCksZixnLGVbbis1XSw0LC0zNzg1NTgpLGc9YShnLGQsaCxmLGVbbis4XSwxMSwtMjAyMjU3NDQ2MyksZj1hKGYsZyxkLGgsZVtuKzExXSwxNiwxODM5MDMwNTYyKSxoPWEoaCxmLGcsZCxlW24rMTRdLDIzLC0zNTMwOTU1NiksZD1hKGQsaCxmLGcsZVtuKzFdLDQsLTE1MzA5OTIwNjApLGc9YShnLGQsaCxmLGVbbis0XSwxMSwxMjcyODkzMzUzKSxmPWEoZixnLGQsaCxlW24rN10sMTYsLTE1NTQ5NzYzMiksaD1hKGgsZixnLGQsZVtuKzEwXSwyMywtMTA5NDczMDY0MCksZD1hKGQsaCxmLGcsZVtuKzEzXSw0LDY4MTI3OTE3NCksZz1hKGcsZCxoLGYsZVtuXSwxMSwtMzU4NTM3MjIyKSxmPWEoZixnLGQsaCxlW24rM10sMTYsLTcyMjUyMTk3OSksaD1hKGgsZixnLGQsZVtuKzZdLDIzLDc2MDI5MTg5KSxkPWEoZCxoLGYsZyxlW24rOV0sNCwtNjQwMzY0NDg3KSxnPWEoZyxkLGgsZixlW24rMTJdLDExLC00MjE4MTU4MzUpLGY9YShmLGcsZCxoLGVbbisxNV0sMTYsNTMwNzQyNTIwKSxkPWMoZCxoPWEoaCxmLGcsZCxlW24rMl0sMjMsLTk5NTMzODY1MSksZixnLGVbbl0sNiwtMTk4NjMwODQ0KSxnPWMoZyxkLGgsZixlW24rN10sMTAsMTEyNjg5MTQxNSksZj1jKGYsZyxkLGgsZVtuKzE0XSwxNSwtMTQxNjM1NDkwNSksaD1jKGgsZixnLGQsZVtuKzVdLDIxLC01NzQzNDA1NSksZD1jKGQsaCxmLGcsZVtuKzEyXSw2LDE3MDA0ODU1NzEpLGc9YyhnLGQsaCxmLGVbbiszXSwxMCwtMTg5NDk4NjYwNiksZj1jKGYsZyxkLGgsZVtuKzEwXSwxNSwtMTA1MTUyMyksaD1jKGgsZixnLGQsZVtuKzFdLDIxLC0yMDU0OTIyNzk5KSxkPWMoZCxoLGYsZyxlW24rOF0sNiwxODczMzEzMzU5KSxnPWMoZyxkLGgsZixlW24rMTVdLDEwLC0zMDYxMTc0NCksZj1jKGYsZyxkLGgsZVtuKzZdLDE1LC0xNTYwMTk4MzgwKSxoPWMoaCxmLGcsZCxlW24rMTNdLDIxLDEzMDkxNTE2NDkpLGQ9YyhkLGgsZixnLGVbbis0XSw2LC0xNDU1MjMwNzApLGc9YyhnLGQsaCxmLGVbbisxMV0sMTAsLTExMjAyMTAzNzkpLGY9YyhmLGcsZCxoLGVbbisyXSwxNSw3MTg3ODcyNTkpLGg9YyhoLGYsZyxkLGVbbis5XSwyMSwtMzQzNDg1NTUxKSxkPXIoZCxvKSxoPXIoaCx1KSxmPXIoZixsKSxnPXIoZyxwKTtyZXR1cm5bZCxoLGYsZ119KGZ1bmN0aW9uKGUpe3ZhciB0LG49W107Zm9yKG5bKGUubGVuZ3RoPj4yKS0xXT12b2lkIDAsdD0wO3Q8bi5sZW5ndGg7dCs9MSluW3RdPTA7dmFyIHI9OCplLmxlbmd0aDtmb3IodD0wO3Q8cjt0Kz04KW5bdD4+NV18PSgyNTUmZVt0LzhdKTw8dCUzMjtyZXR1cm4gbn0oZSksOCplLmxlbmd0aCkpfTtuLmRlZmF1bHQ9dX0se31dLDEwNDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PWZ1bmN0aW9uKCl7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCIpO3JldHVybiByKG8pfTt2YXIgcj0idW5kZWZpbmVkIiE9dHlwZW9mIGNyeXB0byYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byl8fCJ1bmRlZmluZWQiIT10eXBlb2YgbXNDcnlwdG8mJiJmdW5jdGlvbiI9PXR5cGVvZiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMmJm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKSxvPW5ldyBVaW50OEFycmF5KDE2KX0se31dLDEwNTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3N3aXRjaChlKXtjYXNlIDA6cmV0dXJuIHQmbl5+dCZyO2Nhc2UgMTpjYXNlIDM6cmV0dXJuIHRebl5yO2Nhc2UgMjpyZXR1cm4gdCZuXnQmcl5uJnJ9fWZ1bmN0aW9uIG8oZSx0KXtyZXR1cm4gZTw8dHxlPj4+MzItdH1PYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PXZvaWQgMDt2YXIgaT1mdW5jdGlvbihlKXt2YXIgdD1bMTUxODUwMDI0OSwxODU5Nzc1MzkzLDI0MDA5NTk3MDgsMzM5NTQ2OTc4Ml0sbj1bMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4LDMyODUzNzc1MjBdO2lmKCJzdHJpbmciPT10eXBlb2YgZSl7dmFyIGk9dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUpKTtlPW5ldyBBcnJheShpLmxlbmd0aCk7Zm9yKHZhciBzPTA7czxpLmxlbmd0aDtzKyspZVtzXT1pLmNoYXJDb2RlQXQocyl9ZS5wdXNoKDEyOCk7dmFyIGE9ZS5sZW5ndGgvNCsyLGM9TWF0aC5jZWlsKGEvMTYpLHU9bmV3IEFycmF5KGMpO2ZvcihzPTA7czxjO3MrKyl7dVtzXT1uZXcgQXJyYXkoMTYpO2Zvcih2YXIgbD0wO2w8MTY7bCsrKXVbc11bbF09ZVs2NCpzKzQqbF08PDI0fGVbNjQqcys0KmwrMV08PDE2fGVbNjQqcys0KmwrMl08PDh8ZVs2NCpzKzQqbCszXX1mb3IodVtjLTFdWzE0XT04KihlLmxlbmd0aC0xKS9NYXRoLnBvdygyLDMyKSx1W2MtMV1bMTRdPU1hdGguZmxvb3IodVtjLTFdWzE0XSksdVtjLTFdWzE1XT04KihlLmxlbmd0aC0xKSY0Mjk0OTY3Mjk1LHM9MDtzPGM7cysrKXtmb3IodmFyIHA9bmV3IEFycmF5KDgwKSxkPTA7ZDwxNjtkKyspcFtkXT11W3NdW2RdO2ZvcihkPTE2O2Q8ODA7ZCsrKXBbZF09byhwW2QtM11ecFtkLThdXnBbZC0xNF1ecFtkLTE2XSwxKTt2YXIgaD1uWzBdLGY9blsxXSxnPW5bMl0sbT1uWzNdLHY9bls0XTtmb3IoZD0wO2Q8ODA7ZCsrKXt2YXIgeT1NYXRoLmZsb29yKGQvMjApLEU9byhoLDUpK3IoeSxmLGcsbSkrdit0W3ldK3BbZF0+Pj4wO3Y9bSxtPWcsZz1vKGYsMzApPj4+MCxmPWgsaD1FfW5bMF09blswXStoPj4+MCxuWzFdPW5bMV0rZj4+PjAsblsyXT1uWzJdK2c+Pj4wLG5bM109blszXSttPj4+MCxuWzRdPW5bNF0rdj4+PjB9cmV0dXJuW25bMF0+PjI0JjI1NSxuWzBdPj4xNiYyNTUsblswXT4+OCYyNTUsMjU1Jm5bMF0sblsxXT4+MjQmMjU1LG5bMV0+PjE2JjI1NSxuWzFdPj44JjI1NSwyNTUmblsxXSxuWzJdPj4yNCYyNTUsblsyXT4+MTYmMjU1LG5bMl0+PjgmMjU1LDI1NSZuWzJdLG5bM10+PjI0JjI1NSxuWzNdPj4xNiYyNTUsblszXT4+OCYyNTUsMjU1Jm5bM10sbls0XT4+MjQmMjU1LG5bNF0+PjE2JjI1NSxuWzRdPj44JjI1NSwyNTUmbls0XV19O24uZGVmYXVsdD1pfSx7fV0sMTA2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9dm9pZCAwO3ZhciByLG8saT1hKGUoIi4vcm5nLmpzIikpLHM9YShlKCIuL2J5dGVzVG9VdWlkLmpzIikpO2Z1bmN0aW9uIGEoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fXZhciBjPTAsdT0wLGw9ZnVuY3Rpb24oZSx0LG4pe3ZhciBhPXQmJm58fDAsbD10fHxbXSxwPShlPWV8fHt9KS5ub2RlfHxyLGQ9dm9pZCAwIT09ZS5jbG9ja3NlcT9lLmNsb2Nrc2VxOm87aWYobnVsbD09cHx8bnVsbD09ZCl7dmFyIGg9ZS5yYW5kb218fChlLnJuZ3x8aS5kZWZhdWx0KSgpO251bGw9PXAmJihwPXI9WzF8aFswXSxoWzFdLGhbMl0saFszXSxoWzRdLGhbNV1dKSxudWxsPT1kJiYoZD1vPTE2MzgzJihoWzZdPDw4fGhbN10pKX12YXIgZj12b2lkIDAhPT1lLm1zZWNzP2UubXNlY3M6KG5ldyBEYXRlKS5nZXRUaW1lKCksZz12b2lkIDAhPT1lLm5zZWNzP2UubnNlY3M6dSsxLG09Zi1jKyhnLXUpLzFlNDtpZihtPDAmJnZvaWQgMD09PWUuY2xvY2tzZXEmJihkPWQrMSYxNjM4MyksKG08MHx8Zj5jKSYmdm9pZCAwPT09ZS5uc2VjcyYmKGc9MCksZz49MWU0KXRocm93IG5ldyBFcnJvcigidXVpZC52MSgpOiBDYW4ndCBjcmVhdGUgbW9yZSB0aGFuIDEwTSB1dWlkcy9zZWMiKTtjPWYsdT1nLG89ZDt2YXIgdj0oMWU0KigyNjg0MzU0NTUmKGYrPTEyMjE5MjkyOGU1KSkrZyklNDI5NDk2NzI5NjtsW2ErK109dj4+PjI0JjI1NSxsW2ErK109dj4+PjE2JjI1NSxsW2ErK109dj4+PjgmMjU1LGxbYSsrXT0yNTUmdjt2YXIgeT1mLzQyOTQ5NjcyOTYqMWU0JjI2ODQzNTQ1NTtsW2ErK109eT4+PjgmMjU1LGxbYSsrXT0yNTUmeSxsW2ErK109eT4+PjI0JjE1fDE2LGxbYSsrXT15Pj4+MTYmMjU1LGxbYSsrXT1kPj4+OHwxMjgsbFthKytdPTI1NSZkO2Zvcih2YXIgRT0wO0U8NjsrK0UpbFthK0VdPXBbRV07cmV0dXJuIHR8fCgwLHMuZGVmYXVsdCkobCl9O24uZGVmYXVsdD1sfSx7Ii4vYnl0ZXNUb1V1aWQuanMiOjEwMSwiLi9ybmcuanMiOjEwNH1dLDEwNzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PXZvaWQgMDt2YXIgcj1pKGUoIi4vdjM1LmpzIikpLG89aShlKCIuL21kNS5qcyIpKTtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX12YXIgcz0oMCxyLmRlZmF1bHQpKCJ2MyIsNDgsby5kZWZhdWx0KTtuLmRlZmF1bHQ9c30seyIuL21kNS5qcyI6MTAzLCIuL3YzNS5qcyI6MTA4fV0sMTA4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWZ1bmN0aW9uKGUscixpLHMpe3ZhciBhPWkmJnN8fDA7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT1mdW5jdGlvbihlKXtlPXVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlKSk7Zm9yKHZhciB0PW5ldyBBcnJheShlLmxlbmd0aCksbj0wO248ZS5sZW5ndGg7bisrKXRbbl09ZS5jaGFyQ29kZUF0KG4pO3JldHVybiB0fShlKSksInN0cmluZyI9PXR5cGVvZiByJiYocj1mdW5jdGlvbihlKXt2YXIgdD1bXTtyZXR1cm4gZS5yZXBsYWNlKC9bYS1mQS1GMC05XXsyfS9nLChmdW5jdGlvbihlKXt0LnB1c2gocGFyc2VJbnQoZSwxNikpfSkpLHR9KHIpKSwhQXJyYXkuaXNBcnJheShlKSl0aHJvdyBUeXBlRXJyb3IoInZhbHVlIG11c3QgYmUgYW4gYXJyYXkgb2YgYnl0ZXMiKTtpZighQXJyYXkuaXNBcnJheShyKXx8MTYhPT1yLmxlbmd0aCl0aHJvdyBUeXBlRXJyb3IoIm5hbWVzcGFjZSBtdXN0IGJlIHV1aWQgc3RyaW5nIG9yIGFuIEFycmF5IG9mIDE2IGJ5dGUgdmFsdWVzIik7dmFyIGM9bihyLmNvbmNhdChlKSk7aWYoY1s2XT0xNSZjWzZdfHQsY1s4XT02MyZjWzhdfDEyOCxpKWZvcih2YXIgdT0wO3U8MTY7Kyt1KWlbYSt1XT1jW3VdO3JldHVybiBpfHwoMCxvLmRlZmF1bHQpKGMpfTt0cnl7ci5uYW1lPWV9Y2F0Y2goZSl7fXJldHVybiByLkROUz1pLHIuVVJMPXMscn0sbi5VUkw9bi5ETlM9dm9pZCAwO3ZhciByLG89KHI9ZSgiLi9ieXRlc1RvVXVpZC5qcyIpKSYmci5fX2VzTW9kdWxlP3I6e2RlZmF1bHQ6cn07Y29uc3QgaT0iNmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4IjtuLkROUz1pO2NvbnN0IHM9IjZiYTdiODExLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCI7bi5VUkw9c30seyIuL2J5dGVzVG9VdWlkLmpzIjoxMDF9XSwxMDk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG4uZGVmYXVsdD12b2lkIDA7dmFyIHI9aShlKCIuL3JuZy5qcyIpKSxvPWkoZSgiLi9ieXRlc1RvVXVpZC5qcyIpKTtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX12YXIgcz1mdW5jdGlvbihlLHQsbil7dmFyIGk9dCYmbnx8MDsic3RyaW5nIj09dHlwZW9mIGUmJih0PSJiaW5hcnkiPT09ZT9uZXcgQXJyYXkoMTYpOm51bGwsZT1udWxsKTt2YXIgcz0oZT1lfHx7fSkucmFuZG9tfHwoZS5ybmd8fHIuZGVmYXVsdCkoKTtpZihzWzZdPTE1JnNbNl18NjQsc1s4XT02MyZzWzhdfDEyOCx0KWZvcih2YXIgYT0wO2E8MTY7KythKXRbaSthXT1zW2FdO3JldHVybiB0fHwoMCxvLmRlZmF1bHQpKHMpfTtuLmRlZmF1bHQ9c30seyIuL2J5dGVzVG9VdWlkLmpzIjoxMDEsIi4vcm5nLmpzIjoxMDR9XSwxMTA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG4uZGVmYXVsdD12b2lkIDA7dmFyIHI9aShlKCIuL3YzNS5qcyIpKSxvPWkoZSgiLi9zaGExLmpzIikpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fXZhciBzPSgwLHIuZGVmYXVsdCkoInY1Iiw4MCxvLmRlZmF1bHQpO24uZGVmYXVsdD1zfSx7Ii4vc2hhMS5qcyI6MTA1LCIuL3YzNS5qcyI6MTA4fV0sMTExOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1lKCIuL3V0aWxzL0xSVSIpLG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPTFlMyksdGhpcy5tYXhTaXplPWUsdGhpcy5jYWNoZT1uZXcgci5MUlVDYWNoZShlKX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJzaXplIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FjaGUubGVuZ3RofSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnB1dD1mdW5jdGlvbih0LG4pe3ZhciByPSJzdHJpbmciIT10eXBlb2YgdD9lLmdldEtleVN0cmluZyh0KTp0LG89dGhpcy5wb3B1bGF0ZVZhbHVlKG4pO3RoaXMuY2FjaGUucHV0KHIsbyl9LGUucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgbj0ic3RyaW5nIiE9dHlwZW9mIHQ/ZS5nZXRLZXlTdHJpbmcodCk6dCxyPURhdGUubm93KCksbz10aGlzLmNhY2hlLmdldChuKTtpZihvKXtmb3IodmFyIGk9by5sZW5ndGgtMTtpPj0wO2ktLSlvW2ldLkV4cGlyZTxyJiZvLnNwbGljZShpLDEpO2lmKDA9PT1vLmxlbmd0aClyZXR1cm4gdm9pZCB0aGlzLmNhY2hlLnJlbW92ZShuKX1yZXR1cm4gb30sZS5nZXRLZXlTdHJpbmc9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49T2JqZWN0LmtleXMoZSkuc29ydCgpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89bltyXTt2b2lkIDAhPT1lW29dJiZ0LnB1c2goZVtvXSl9cmV0dXJuIHQuam9pbigiICIpfSxlLnByb3RvdHlwZS5wb3B1bGF0ZVZhbHVlPWZ1bmN0aW9uKGUpe3ZhciB0PURhdGUubm93KCk7cmV0dXJuIGUubWFwKChmdW5jdGlvbihlKXtyZXR1cm57QWRkcmVzczplLkFkZHJlc3N8fCIiLEV4cGlyZTp0KzYwKihlLkNhY2hlUGVyaW9kSW5NaW51dGVzfHwxKSoxZTN9fSkpfSxlLnByb3RvdHlwZS5lbXB0eT1mdW5jdGlvbigpe3RoaXMuY2FjaGUuZW1wdHkoKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBuPSJzdHJpbmciIT10eXBlb2YgdD9lLmdldEtleVN0cmluZyh0KTp0O3RoaXMuY2FjaGUucmVtb3ZlKG4pfSxlfSgpO24uRW5kcG9pbnRDYWNoZT1vfSx7Ii4vdXRpbHMvTFJVIjoxMTJ9XSwxMTI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKGUsdCl7dGhpcy5rZXk9ZSx0aGlzLnZhbHVlPXR9LG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMubm9kZU1hcD17fSx0aGlzLnNpemU9MCwibnVtYmVyIiE9dHlwZW9mIGV8fGU8MSl0aHJvdyBuZXcgRXJyb3IoIkNhY2hlIHNpemUgY2FuIG9ubHkgYmUgcG9zaXRpdmUgbnVtYmVyIik7dGhpcy5zaXplTGltaXQ9ZX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJsZW5ndGgiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaXplfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnByZXBlbmRUb0xpc3Q9ZnVuY3Rpb24oZSl7dGhpcy5oZWFkZXJOb2RlPyh0aGlzLmhlYWRlck5vZGUucHJldj1lLGUubmV4dD10aGlzLmhlYWRlck5vZGUpOnRoaXMudGFpbE5vZGU9ZSx0aGlzLmhlYWRlck5vZGU9ZSx0aGlzLnNpemUrK30sZS5wcm90b3R5cGUucmVtb3ZlRnJvbVRhaWw9ZnVuY3Rpb24oKXtpZih0aGlzLnRhaWxOb2RlKXt2YXIgZT10aGlzLnRhaWxOb2RlLHQ9ZS5wcmV2O3JldHVybiB0JiYodC5uZXh0PXZvaWQgMCksZS5wcmV2PXZvaWQgMCx0aGlzLnRhaWxOb2RlPXQsdGhpcy5zaXplLS0sZX19LGUucHJvdG90eXBlLmRldGFjaEZyb21MaXN0PWZ1bmN0aW9uKGUpe3RoaXMuaGVhZGVyTm9kZT09PWUmJih0aGlzLmhlYWRlck5vZGU9ZS5uZXh0KSx0aGlzLnRhaWxOb2RlPT09ZSYmKHRoaXMudGFpbE5vZGU9ZS5wcmV2KSxlLnByZXYmJihlLnByZXYubmV4dD1lLm5leHQpLGUubmV4dCYmKGUubmV4dC5wcmV2PWUucHJldiksZS5uZXh0PXZvaWQgMCxlLnByZXY9dm9pZCAwLHRoaXMuc2l6ZS0tfSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZSl7aWYodGhpcy5ub2RlTWFwW2VdKXt2YXIgdD10aGlzLm5vZGVNYXBbZV07cmV0dXJuIHRoaXMuZGV0YWNoRnJvbUxpc3QodCksdGhpcy5wcmVwZW5kVG9MaXN0KHQpLHQudmFsdWV9fSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oZSl7aWYodGhpcy5ub2RlTWFwW2VdKXt2YXIgdD10aGlzLm5vZGVNYXBbZV07dGhpcy5kZXRhY2hGcm9tTGlzdCh0KSxkZWxldGUgdGhpcy5ub2RlTWFwW2VdfX0sZS5wcm90b3R5cGUucHV0PWZ1bmN0aW9uKGUsdCl7aWYodGhpcy5ub2RlTWFwW2VdKXRoaXMucmVtb3ZlKGUpO2Vsc2UgaWYodGhpcy5zaXplPT09dGhpcy5zaXplTGltaXQpe3ZhciBuPXRoaXMucmVtb3ZlRnJvbVRhaWwoKS5rZXk7ZGVsZXRlIHRoaXMubm9kZU1hcFtuXX12YXIgbz1uZXcgcihlLHQpO3RoaXMubm9kZU1hcFtlXT1vLHRoaXMucHJlcGVuZFRvTGlzdChvKX0sZS5wcm90b3R5cGUuZW1wdHk9ZnVuY3Rpb24oKXtmb3IodmFyIGU9T2JqZWN0LmtleXModGhpcy5ub2RlTWFwKSx0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBuPWVbdF0scj10aGlzLm5vZGVNYXBbbl07dGhpcy5kZXRhY2hGcm9tTGlzdChyKSxkZWxldGUgdGhpcy5ub2RlTWFwW25dfX0sZX0oKTtuLkxSVUNhY2hlPW99LHt9XSwxMTM6W2Z1bmN0aW9uKGUsdCxuKXtlKCIuL2Jyb3dzZXJfbG9hZGVyIik7dmFyIHI9ZSgiLi9jb3JlIik7InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cuQVdTPXIpLHZvaWQgMCE9PXQmJih0LmV4cG9ydHM9ciksInVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiYoc2VsZi5BV1M9ciksT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsIkNvbm5lY3QiKXx8KHIuYXBpTG9hZGVyLnNlcnZpY2VzLmNvbm5lY3Q9e30sci5Db25uZWN0PXIuU2VydmljZS5kZWZpbmVTZXJ2aWNlKCJjb25uZWN0IixbIjIwMTctMDItMTUiXSkpLHIuYXBpTG9hZGVyLnNlcnZpY2VzLmNvbm5lY3RbIjIwMTctMDItMTUiXT1lKCIuLi9hcGlzL2Nvbm5lY3QtMjAxNy0wMi0xNS5taW4iKX0seyIuLi9hcGlzL2Nvbm5lY3QtMjAxNy0wMi0xNS5taW4iOjMsIi4vYnJvd3Nlcl9sb2FkZXIiOjE2LCIuL2NvcmUiOjE5fV19LHt9LFsxMTNdKX0sNzU0OigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQsdC5DbGllbnRNZXRob2RzPXQubWFrZUVudW0oWyJnZXRBZ2VudFNuYXBzaG90IiwicHV0QWdlbnRTdGF0ZSIsImdldEFnZW50U3RhdGVzIiwiZ2V0RGlhbGFibGVDb3VudHJ5Q29kZXMiLCJnZXRSb3V0aW5nUHJvZmlsZVF1ZXVlcyIsImdldEFnZW50UGVybWlzc2lvbnMiLCJnZXRBZ2VudENvbmZpZ3VyYXRpb24iLCJ1cGRhdGVBZ2VudENvbmZpZ3VyYXRpb24iLCJhY2NlcHRDb250YWN0IiwiY3JlYXRlT3V0Ym91bmRDb250YWN0IiwiY3JlYXRlVGFza0NvbnRhY3QiLCJjbGVhckNvbnRhY3QiLCJjb21wbGV0ZUNvbnRhY3QiLCJkZXN0cm95Q29udGFjdCIsInJlamVjdENvbnRhY3QiLCJub3RpZnlDb250YWN0SXNzdWUiLCJ1cGRhdGVDb250YWN0QXR0cmlidXRlcyIsImNyZWF0ZUFkZGl0aW9uYWxDb25uZWN0aW9uIiwiZGVzdHJveUNvbm5lY3Rpb24iLCJob2xkQ29ubmVjdGlvbiIsInJlc3VtZUNvbm5lY3Rpb24iLCJ0b2dnbGVBY3RpdmVDb25uZWN0aW9ucyIsImNvbmZlcmVuY2VDb25uZWN0aW9ucyIsInNlbmRDbGllbnRMb2dzIiwic2VuZERpZ2l0cyIsInNlbmRTb2Z0cGhvbmVDYWxsUmVwb3J0Iiwic2VuZFNvZnRwaG9uZUNhbGxNZXRyaWNzIiwiZ2V0RW5kcG9pbnRzIiwiZ2V0TmV3QXV0aFRva2VuIiwiY3JlYXRlVHJhbnNwb3J0IiwibXV0ZVBhcnRpY2lwYW50IiwidW5tdXRlUGFydGljaXBhbnQiLCJ1cGRhdGVNb25pdG9yUGFydGljaXBhbnRTdGF0ZSIsInBhdXNlQ29udGFjdCIsInJlc3VtZUNvbnRhY3QiXSksdC5BZ2VudEFwcENsaWVudE1ldGhvZHM9e0dFVF9DT05UQUNUOiJBZ2VudEFwcFNlcnZpY2UuTGNtcy5nZXRDb250YWN0IixERUxFVEVfU1BFQUtFUjoiQWdlbnRBcHBTZXJ2aWNlLlZvaWNlSWQuZGVsZXRlU3BlYWtlciIsRU5ST0xMX0JZX1NFU1NJT046IkFnZW50QXBwU2VydmljZS5Wb2ljZUlkLmVucm9sbEJ5U2Vzc2lvbiIsRVZBTFVBVEVfU0VTU0lPTjoiQWdlbnRBcHBTZXJ2aWNlLlZvaWNlSWQuZXZhbHVhdGVTZXNzaW9uIixERVNDUklCRV9TUEVBS0VSOiJBZ2VudEFwcFNlcnZpY2UuVm9pY2VJZC5kZXNjcmliZVNwZWFrZXIiLE9QVF9PVVRfU1BFQUtFUjoiQWdlbnRBcHBTZXJ2aWNlLlZvaWNlSWQub3B0T3V0U3BlYWtlciIsVVBEQVRFX1ZPSUNFX0lEX0RBVEE6IkFnZW50QXBwU2VydmljZS5MY21zLnVwZGF0ZVZvaWNlSWREYXRhIixERVNDUklCRV9TRVNTSU9OOiJBZ2VudEFwcFNlcnZpY2UuVm9pY2VJZC5kZXNjcmliZVNlc3Npb24iLFVQREFURV9TRVNTSU9OOiJBZ2VudEFwcFNlcnZpY2UuVm9pY2VJZC51cGRhdGVTZXNzaW9uIixTVEFSVF9WT0lDRV9JRF9TRVNTSU9OOiJBZ2VudEFwcFNlcnZpY2UuTmFzYS5zdGFydFZvaWNlSWRTZXNzaW9uIixMSVNUX0lOVEVHUkFUSU9OX0FTU09DSUFUSU9OUzoiQWdlbnRBcHBTZXJ2aWNlLkFjcy5saXN0SW50ZWdyYXRpb25Bc3NvY2lhdGlvbnMifSx0Lk1hc3Rlck1ldGhvZHM9dC5tYWtlRW51bShbImJlY29tZU1hc3RlciIsImNoZWNrTWFzdGVyIl0pLHQuVGFza1RlbXBsYXRlc0NsaWVudE1ldGhvZHM9dC5tYWtlRW51bShbImxpc3RUYXNrVGVtcGxhdGVzIiwiZ2V0VGFza1RlbXBsYXRlIiwiY3JlYXRlVGVtcGxhdGVkVGFzayIsInVwZGF0ZUNvbnRhY3QiXSksdC5BcGlQcm94eUNsaWVudE1ldGhvZHM9dC5tYWtlRW51bShbInFySW50ZWdyYXRpb25FeGlzdHMiLCJxclNlYXJjaFF1aWNrUmVzcG9uc2VzIl0pLHQuUmV0cnlhYmxlQ2xpZW50TWV0aG9kc0xpc3Q9W3QuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfU05BUFNIT1QsdC5DbGllbnRNZXRob2RzLkdFVF9BR0VOVF9DT05GSUdVUkFUSU9OLHQuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfUEVSTUlTU0lPTlMsdC5DbGllbnRNZXRob2RzLkdFVF9BR0VOVF9TVEFURVMsdC5DbGllbnRNZXRob2RzLkdFVF9ESUFMQUJMRV9DT1VOVFJZX0NPREVTLHQuQ2xpZW50TWV0aG9kcy5HRVRfUk9VVElOR19QUk9GSUxFX1FVRVVFU10sdC5SZXRyeWFibGVFcnJvcnM9dC5tYWtlRW51bShbInVuYXV0aG9yaXplZCIsImFjY2Vzc0RlbmllZCJdKSx0LlJldHJ5U3RhdHVzPXQubWFrZUVudW0oWyJyZXRyeWluZyIsImV4aGF1c3RlZCIsIm5vbmUiXSk7dmFyIG49ZnVuY3Rpb24oKXt9O24uRU1QVFlfQ0FMTEJBQ0tTPXtzdWNjZXNzOmZ1bmN0aW9uKCl7fSxmYWlsdXJlOmZ1bmN0aW9uKCl7fX0sbi5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihlLHIsbyl7dC5hc3NlcnROb3ROdWxsKGUsIm1ldGhvZCIpO3ZhciBpPXJ8fHt9LHM9b3x8bi5FTVBUWV9DQUxMQkFDS1M7dGhpcy5fY2FsbEltcGwoZSxpLHMpfSxuLnByb3RvdHlwZS5fY2FsbEltcGw9ZnVuY3Rpb24oZSxuLHIpe3Rocm93IG5ldyB0Lk5vdEltcGxlbWVudGVkRXJyb3J9O3ZhciByPWZ1bmN0aW9uKCl7bi5jYWxsKHRoaXMpfTsoci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXIsci5wcm90b3R5cGUuX2NhbGxJbXBsPWZ1bmN0aW9uKGUsbixyKXtpZihyJiZyLmZhaWx1cmUpe3ZhciBvPXQuc3ByaW50ZigiTm8gc3VjaCBtZXRob2QgZXhpc3RzIG9uIE5VTEwgY2xpZW50OiAlcyIsZSk7ci5mYWlsdXJlKG5ldyB0LlZhbHVlRXJyb3Iobykse21lc3NhZ2U6b30pfX07dmFyIG89ZnVuY3Rpb24oZSxyLG8pe24uY2FsbCh0aGlzKSx0aGlzLmNvbmR1aXQ9ZSx0aGlzLnJlcXVlc3RFdmVudD1yLHRoaXMucmVzcG9uc2VFdmVudD1vLHRoaXMuX3JlcXVlc3RJZENhbGxiYWNrc01hcD17fSx0aGlzLmNvbmR1aXQub25VcHN0cmVhbShvLHQuaGl0Y2godGhpcyx0aGlzLl9oYW5kbGVSZXNwb25zZSkpfTsoby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPW8sby5wcm90b3R5cGUuX2NhbGxJbXBsPWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10LkV2ZW50RmFjdG9yeS5jcmVhdGVSZXF1ZXN0KHRoaXMucmVxdWVzdEV2ZW50LGUsbik7dGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwW28ucmVxdWVzdElkXT1yO2NvbnN0IGk9W3QuQ2xpZW50TWV0aG9kcy5TRU5EX0NMSUVOVF9MT0dTLHQuQ2xpZW50TWV0aG9kcy5TRU5EX1NPRlRQSE9ORV9DQUxMX01FVFJJQ1MsdC5DbGllbnRNZXRob2RzLlNFTkRfU09GVFBIT05FX0NBTExfUkVQT1JUXTt0cnl7by5ldmVudCE9PXQuRXZlbnRUeXBlLkFQSV9SRVFVRVNUfHxpLmluY2x1ZGVzKG8ubWV0aG9kKXx8dC5nZXRMb2coKS50cmFjZShgU2VuZGluZyBBUElfUkVRVUVTVCBldmVudCBmb3IgJHtvLm1ldGhvZH0gdG8gdXBzdHJlYW1gKS53aXRoT2JqZWN0KHttZXRob2Q6by5tZXRob2QscGFyYW1zOm8ucGFyYW1zLHN0YWNrOihuZXcgRXJyb3IpLnN0YWNrfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJTdGFjayB0cmFjZSBMb2cgRmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfXRoaXMuY29uZHVpdC5zZW5kVXBzdHJlYW0oby5ldmVudCxvKX0sby5wcm90b3R5cGUuX2dldENhbGxiYWNrc0ZvclJlcXVlc3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwW2VdfHxudWxsO3JldHVybiBudWxsIT10JiZkZWxldGUgdGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwW2VdLHR9LG8ucHJvdG90eXBlLl9oYW5kbGVSZXNwb25zZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXRDYWxsYmFja3NGb3JSZXF1ZXN0KGUucmVxdWVzdElkKTtudWxsIT10JiYoZS5lcnImJnQuZmFpbHVyZT90LmZhaWx1cmUoZS5lcnIsZS5kYXRhKTp0LnN1Y2Nlc3MmJnQuc3VjY2VzcyhlLmRhdGEpKX07dmFyIGk9ZnVuY3Rpb24oZSl7by5jYWxsKHRoaXMsZSx0LkV2ZW50VHlwZS5BUElfUkVRVUVTVCx0LkV2ZW50VHlwZS5BUElfUkVTUE9OU0UpfTsoaS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWk7dmFyIHM9ZnVuY3Rpb24oKXtuLmNhbGwodGhpcyksdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLkFQSV9QUk9YWV9SRVNQT05TRSx0LmhpdGNoKHRoaXMsdGhpcy5faGFuZGxlUmVzcG9uc2UpKSx0aGlzLl9yZXF1ZXN0SWRDYWxsYmFja3NNYXA9e319OyhzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cyxzLnByb3RvdHlwZS5fY2FsbEltcGw9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXQuRXZlbnRGYWN0b3J5LmNyZWF0ZVJlcXVlc3QodC5FdmVudFR5cGUuQVBJX1BST1hZX1JFUVVFU1QsZSxuKTt0aGlzLl9yZXF1ZXN0SWRDYWxsYmFja3NNYXBbby5yZXF1ZXN0SWRdPXIsdC5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcih0LkV2ZW50VHlwZS5BUElfUFJPWFlfUkVRVUVTVCxvKX0scy5wcm90b3R5cGUuX2dldENhbGxiYWNrc0ZvclJlcXVlc3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwW2VdfHxudWxsO3JldHVybiBudWxsIT10JiZkZWxldGUgdGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwW2VdLHR9LHMucHJvdG90eXBlLl9oYW5kbGVSZXNwb25zZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXRDYWxsYmFja3NGb3JSZXF1ZXN0KGUucmVxdWVzdElkKTtudWxsIT10JiYoZS5lcnImJnQuZmFpbHVyZT90LmZhaWx1cmUoZS5lcnIsZS5kYXRhKTp0LnN1Y2Nlc3MmJnQuc3VjY2VzcyhlLmRhdGEpKX07dmFyIGE9ZnVuY3Rpb24oZSl7by5jYWxsKHRoaXMsZSx0LkV2ZW50VHlwZS5NQVNURVJfUkVRVUVTVCx0LkV2ZW50VHlwZS5NQVNURVJfUkVTUE9OU0UpfTsoYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWE7dmFyIGM9ZnVuY3Rpb24oZSxyLG8pe3QuYXNzZXJ0Tm90TnVsbChlLCJhdXRoQ29va2llTmFtZSIpLHQuYXNzZXJ0Tm90TnVsbChyLCJhdXRoVG9rZW4iKSx0LmFzc2VydE5vdE51bGwobywiZW5kcG9pbnQiKSxuLmNhbGwodGhpcyksdGhpcy5lbmRwb2ludFVybD10LmdldFVybFdpdGhQcm90b2NvbChvKSx0aGlzLmF1dGhUb2tlbj1yLHRoaXMuYXV0aENvb2tpZU5hbWU9ZX07KGMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1jLGMucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLG4scil7dmFyIG89dGhpcyxpPXt9O2lbby5hdXRoQ29va2llTmFtZV09by5hdXRoVG9rZW47dmFyIHM9e21ldGhvZDoicG9zdCIsYm9keTpKU09OLnN0cmluZ2lmeShufHx7fSksaGVhZGVyczp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uIiwiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiIsIlgtQW16LXRhcmdldCI6ZSwiWC1BbXotQmVhcmVyIjpKU09OLnN0cmluZ2lmeShpKX19O3QuZmV0Y2goby5lbmRwb2ludFVybCxzKS50aGVuKChmdW5jdGlvbihlKXtyLnN1Y2Nlc3MoZSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe2NvbnN0IHQ9ZS5ib2R5LmdldFJlYWRlcigpO2xldCBuPSIiO2NvbnN0IG89bmV3IFRleHREZWNvZGVyO3QucmVhZCgpLnRoZW4oKGZ1bmN0aW9uIGkoe2RvbmU6cyx2YWx1ZTphfSl7aWYocyl7dmFyIGM9SlNPTi5wYXJzZShuKTtyZXR1cm4gYy5zdGF0dXM9ZS5zdGF0dXMsdm9pZCByLmZhaWx1cmUoYyl9cmV0dXJuIG4rPW8uZGVjb2RlKGEpLHQucmVhZCgpLnRoZW4oaSl9KSl9KSl9O3ZhciB1PWZ1bmN0aW9uKGUscixvKXt0LmFzc2VydE5vdE51bGwoZSwiYXV0aFRva2VuIiksdC5hc3NlcnROb3ROdWxsKHIsInJlZ2lvbiIpLG4uY2FsbCh0aGlzKSxBV1MuY29uZmlnLmNyZWRlbnRpYWxzPW5ldyBBV1MuQ3JlZGVudGlhbHMoe30pLEFXUy5jb25maWcucmVnaW9uPXIsdGhpcy5hdXRoVG9rZW49ZTt2YXIgaT10LmdldEJhc2VVcmwoKSxzPW98fChpLmluY2x1ZGVzKCIuYXdzYXBwcy5jb20iKT9pKyIvY29ubmVjdC9hcGkiOmkrIi9hcGkiKSxhPW5ldyBBV1MuRW5kcG9pbnQocyk7dGhpcy5jbGllbnQ9bmV3IEFXUy5Db25uZWN0KHtlbmRwb2ludDphfSksdGhpcy51bmF1dGhvcml6ZWRGYWlsQ291bnRlcj0wLHRoaXMuYWNjZXNzRGVuaWVkRmFpbENvdW50ZXI9MH07KHUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj11LHUucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLG4scil7dmFyIG89dGhpcyxpPXQuZ2V0TG9nKCk7aWYodC5jb250YWlucyh0aGlzLmNsaWVudCxlKSluPXRoaXMuX3RyYW5zbGF0ZVBhcmFtcyhlLG4pLCJwYXVzZUNvbnRhY3QiIT09ZSYmInJlc3VtZUNvbnRhY3QiIT09ZXx8ZGVsZXRlIG4uYXV0aGVudGljYXRpb24sbiYmbi5yZWxhdGVkQ29udGFjdElkJiZudWxsIT09bi5yZWxhdGVkQ29udGFjdElkJiZuLnByZXZpb3VzQ29udGFjdElkJiZkZWxldGUgbi5wcmV2aW91c0NvbnRhY3RJZCxpLnRyYWNlKCJBV1NDbGllbnQ6IC0tXHgzZSBDYWxsaW5nIG9wZXJhdGlvbiAnJXMnIixlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHRoaXMuY2xpZW50W2VdKG4pLm9uKCJidWlsZCIsKGZ1bmN0aW9uKGUpe2UuaHR0cFJlcXVlc3QuaGVhZGVyc1siWC1BbXotQmVhcmVyIl09by5hdXRoVG9rZW59KSkuc2VuZCgoZnVuY3Rpb24obixzKXt0cnl7aWYobiluLmNvZGU9PT10LkNUSUV4Y2VwdGlvbnMuVU5BVVRIT1JJWkVEX0VYQ0VQVElPTnx8NDAxPT09bi5zdGF0dXNDb2RlP28uX3JldHJ5TWV0aG9kKGUscixuLHMsdC5SZXRyeWFibGVFcnJvcnMuVU5BVVRIT1JJWkVEKTpuLmNvZGU9PT10LkNUSUV4Y2VwdGlvbnMuQUNDRVNTX0RFTklFRF9FWENFUFRJT058fDQwMz09PW4uc3RhdHVzQ29kZT9vLl9yZXRyeU1ldGhvZChlLHIsbixzLHQuUmV0cnlhYmxlRXJyb3JzLkFDQ0VTU19ERU5JRUQpOihvLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyPTAsby5hY2Nlc3NEZW5pZWRGYWlsQ291bnRlcj0wLHIuZmFpbHVyZShvLl9mb3JtYXRDYWxsRXJyb3Ioby5fYWRkU3RhdHVzQ29kZVRvRXJyb3IobikpLHMpKSxpLnRyYWNlKCJBV1NDbGllbnQ6IDwtLSBPcGVyYXRpb24gJyVzJyBmYWlsZWQ6ICVzIixlLEpTT04uc3RyaW5naWZ5KG4pKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO2Vsc2V7bGV0IHQ9e307aS50cmFjZSgiQVdTQ2xpZW50OiA8LS0gT3BlcmF0aW9uICclcycgc3VjY2VlZGVkLiIsZSkud2l0aE9iamVjdChzKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG8udW5hdXRob3JpemVkRmFpbENvdW50ZXI9MCxvLmFjY2Vzc0RlbmllZEZhaWxDb3VudGVyPTAsdGhpcy5odHRwUmVzcG9uc2UmJnRoaXMuaHR0cFJlc3BvbnNlLmhhc093blByb3BlcnR5KCJib2R5IikmJih0LmNvbnRlbnRMZW5ndGg9dGhpcy5odHRwUmVzcG9uc2UuYm9keS5sZW5ndGgpLHIuc3VjY2VzcyhzLHQpfX1jYXRjaChuKXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gaGFuZGxlIEFXUyBBUEkgcmVxdWVzdCBmb3IgbWV0aG9kICVzIixlKS53aXRoRXhjZXB0aW9uKG4pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSkpO2Vsc2V7dmFyIHM9dC5zcHJpbnRmKCJObyBzdWNoIG1ldGhvZCBleGlzdHMgb24gQVdTIGNsaWVudDogJXMiLGUpO3IuZmFpbHVyZShuZXcgdC5WYWx1ZUVycm9yKHMpLHttZXNzYWdlOnN9KX19LHUucHJvdG90eXBlLl9pc1JldHJ5YWJsZU1ldGhvZD1mdW5jdGlvbihlKXtyZXR1cm4gdC5SZXRyeWFibGVDbGllbnRNZXRob2RzTGlzdC5pbmNsdWRlcyhlKX0sdS5wcm90b3R5cGUuX3JldHJ5TWV0aG9kPWZ1bmN0aW9uKGUsbixyLG8saSl7dmFyIHM9dGhpcyxhPXQuZ2V0TG9nKCk7Y29uc3QgYz1lPT5zLl9mb3JtYXRDYWxsRXJyb3Iocy5fYWRkU3RhdHVzQ29kZVRvRXJyb3IoZSkpO2xldCB1PXttYXhDb3VudDp0LmNvcmUuTUFYX1VOQVVUSE9SSVpFRF9SRVRSWV9DT1VOVCxmYWlsQ291bnRlcjpzLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyLGluY3JlYXNlQ291bnRlcjooKT0+cy51bmF1dGhvcml6ZWRGYWlsQ291bnRlcis9MSxyZXNldENvdW50ZXI6KCk9PnMudW5hdXRob3JpemVkRmFpbENvdW50ZXI9MCxlcnJvck1lc3NhZ2U6InVuYXV0aG9yaXplZCIsZXhoYXVzdGVkUmV0cmllczpzLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyPj10LmNvcmUuTUFYX1VOQVVUSE9SSVpFRF9SRVRSWV9DT1VOVCxyZXRyeUNhbGxiYWNrOihlLHQpPT5uLmZhaWx1cmUoYyhlKSx0KSxkZWZhdWx0Q2FsbGJhY2s6KGUsdCk9Pm4uYXV0aEZhaWx1cmUoYyhlKSx0KX07c3dpdGNoKGkpe2Nhc2UgdC5SZXRyeWFibGVFcnJvcnMuVU5BVVRIT1JJWkVEOmJyZWFrO2Nhc2UgdC5SZXRyeWFibGVFcnJvcnMuQUNDRVNTX0RFTklFRDp1PXsuLi51LG1heENvdW50OnQuY29yZS5NQVhfQUNDRVNTX0RFTklFRF9SRVRSWV9DT1VOVCxmYWlsQ291bnRlcjpzLmFjY2Vzc0RlbmllZEZhaWxDb3VudGVyLGluY3JlYXNlQ291bnRlcjooKT0+cy5hY2Nlc3NEZW5pZWRGYWlsQ291bnRlcis9MSxyZXNldENvdW50ZXI6KCk9PnMuYWNjZXNzRGVuaWVkRmFpbENvdW50ZXI9MCxlcnJvck1lc3NhZ2U6ImFjY2VzcyBkZW5pZWQiLGV4aGF1c3RlZFJldHJpZXM6cy5hY2Nlc3NEZW5pZWRGYWlsQ291bnRlcj49dC5jb3JlLk1BWF9BQ0NFU1NfREVOSUVEX1JFVFJZX0NPVU5ULGRlZmF1bHRDYWxsYmFjazooZSx0KT0+bi5hY2Nlc3NEZW5pZWQoYyhlKSx0KX19bGV0IGw9ey4uLnIscmV0cnlTdGF0dXM6dC5SZXRyeVN0YXR1cy5OT05FfTtpZihzLl9pc1JldHJ5YWJsZU1ldGhvZChlKSl7aWYoIXUuZXhoYXVzdGVkUmV0cmllcylyZXR1cm4gYS50cmFjZShgQVdTQ2xpZW50OiA8LS0gT3BlcmF0aW9uICR7ZX0gZmFpbGVkIHdpdGggJHt1LmVycm9yTWVzc2FnZX0gZXJyb3IuIFJldHJ5aW5nIGNhbGwgZm9yIGEgJHt1LmZhaWxDb3VudGVyKzF9IHRpbWVgKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHUuaW5jcmVhc2VDb3VudGVyKCksbD17Li4ubCxyZXRyeVN0YXR1czp0LlJldHJ5U3RhdHVzLlJFVFJZSU5HfSx2b2lkIHUucmV0cnlDYWxsYmFjayhsLG8pO2EudHJhY2UoYEFXU0NsaWVudDogPC0tIE9wZXJhdGlvbiAke2V9IGV4aGF1c3RlZCBtYXggJHt1Lm1heENvdW50fSBudW1iZXIgb2YgcmV0cmllcyBmb3IgJHt1LmVycm9yTWVzc2FnZX0gZXJyb3JgKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHUucmVzZXRDb3VudGVyKCksbD17Li4ubCxyZXRyeVN0YXR1czp0LlJldHJ5U3RhdHVzLkVYSEFVU1RFRH19ZWxzZSBhLnRyYWNlKGBBV1NDbGllbnQ6IDwtLSBPcGVyYXRpb24gJHtlfSBmYWlsZWQ6ICR7SlNPTi5zdHJpbmdpZnkocil9YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt1LmRlZmF1bHRDYWxsYmFjayhsLG8pfSx1LnByb3RvdHlwZS5fZm9ybWF0Q2FsbEVycm9yPWZ1bmN0aW9uKGUpe2NvbnN0IG49e3R5cGU6ZS5jb2RlLG1lc3NhZ2U6ZS5tZXNzYWdlLHN0YWNrOltdLHJldHJ5U3RhdHVzOmUucmV0cnlTdGF0dXN8fHQuUmV0cnlTdGF0dXMuTk9ORSwuLi5lLnN0YXR1c0NvZGUmJntzdGF0dXNDb2RlOmUuc3RhdHVzQ29kZX19O2lmKGUuc3RhY2spdHJ5e0FycmF5LmlzQXJyYXkoZS5zdGFjayk/bi5zdGFjaz1lLnN0YWNrOiJvYmplY3QiPT10eXBlb2YgZS5zdGFjaz9uLnN0YWNrPVtKU09OLnN0cmluZ2lmeShlLnN0YWNrKV06InN0cmluZyI9PXR5cGVvZiBlLnN0YWNrJiYobi5zdGFjaz1lLnN0YWNrLnNwbGl0KCJcbiIpKX1maW5hbGx5e31yZXR1cm4gbn0sdS5wcm90b3R5cGUuX2FkZFN0YXR1c0NvZGVUb0Vycm9yPWZ1bmN0aW9uKGUpe2lmKGUuc3RhdHVzQ29kZSlyZXR1cm4gZTtjb25zdCBuPXsuLi5lfTtpZihlLmNvZGUpc3dpdGNoKG4uY29kZSl7Y2FzZSB0LkNUSUV4Y2VwdGlvbnMuVU5BVVRIT1JJWkVEX0VYQ0VQVElPTjpuLnN0YXR1c0NvZGU9NDAxO2JyZWFrO2Nhc2UgdC5DVElFeGNlcHRpb25zLkFDQ0VTU19ERU5JRURfRVhDRVBUSU9OOm4uc3RhdHVzQ29kZT00MDN9ZWxzZSBuLnN0YXR1c0NvZGU9NDAwO3JldHVybiBufSx1LnByb3RvdHlwZS5fcmVxdWlyZXNBdXRoZW50aWNhdGlvblBhcmFtPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dC5DbGllbnRNZXRob2RzLkNPTVBMRVRFX0NPTlRBQ1QmJmUhPT10LkNsaWVudE1ldGhvZHMuQ0xFQVJfQ09OVEFDVCYmZSE9PXQuQ2xpZW50TWV0aG9kcy5SRUpFQ1RfQ09OVEFDVCYmZSE9PXQuQ2xpZW50TWV0aG9kcy5DUkVBVEVfVEFTS19DT05UQUNUJiZlIT09dC5DbGllbnRNZXRob2RzLlVQREFURV9NT05JVE9SX1BBUlRJQ0lQQU5UX1NUQVRFfSx1LnByb3RvdHlwZS5fdHJhbnNsYXRlUGFyYW1zPWZ1bmN0aW9uKGUsbil7c3dpdGNoKGUpe2Nhc2UgdC5DbGllbnRNZXRob2RzLlVQREFURV9BR0VOVF9DT05GSUdVUkFUSU9OOm4uY29uZmlndXJhdGlvbj10aGlzLl90cmFuc2xhdGVBZ2VudENvbmZpZ3VyYXRpb24obi5jb25maWd1cmF0aW9uKTticmVhaztjYXNlIHQuQ2xpZW50TWV0aG9kcy5TRU5EX1NPRlRQSE9ORV9DQUxMX01FVFJJQ1M6bi5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzPXRoaXMuX3RyYW5zbGF0ZVNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3Mobi5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzKTticmVhaztjYXNlIHQuQ2xpZW50TWV0aG9kcy5TRU5EX1NPRlRQSE9ORV9DQUxMX1JFUE9SVDpuLnJlcG9ydD10aGlzLl90cmFuc2xhdGVTb2Z0cGhvbmVDYWxsUmVwb3J0KG4ucmVwb3J0KX1yZXR1cm4gdGhpcy5fcmVxdWlyZXNBdXRoZW50aWNhdGlvblBhcmFtKGUpJiYobi5hdXRoZW50aWNhdGlvbj17YXV0aFRva2VuOnRoaXMuYXV0aFRva2VufSksbn0sdS5wcm90b3R5cGUuX3RyYW5zbGF0ZUFnZW50Q29uZmlndXJhdGlvbj1mdW5jdGlvbihlKXtyZXR1cm57bmFtZTplLm5hbWUsc29mdHBob25lRW5hYmxlZDplLnNvZnRwaG9uZUVuYWJsZWQsc29mdHBob25lQXV0b0FjY2VwdDplLnNvZnRwaG9uZUF1dG9BY2NlcHQsZXh0ZW5zaW9uOmUuZXh0ZW5zaW9uLHJvdXRpbmdQcm9maWxlOnRoaXMuX3RyYW5zbGF0ZVJvdXRpbmdQcm9maWxlKGUucm91dGluZ1Byb2ZpbGUpLGFnZW50UHJlZmVyZW5jZXM6ZS5hZ2VudFByZWZlcmVuY2VzfX0sdS5wcm90b3R5cGUuX3RyYW5zbGF0ZVJvdXRpbmdQcm9maWxlPWZ1bmN0aW9uKGUpe3JldHVybntuYW1lOmUubmFtZSxyb3V0aW5nUHJvZmlsZUFSTjplLnJvdXRpbmdQcm9maWxlQVJOLGRlZmF1bHRPdXRib3VuZFF1ZXVlOnRoaXMuX3RyYW5zbGF0ZVF1ZXVlKGUuZGVmYXVsdE91dGJvdW5kUXVldWUpfX0sdS5wcm90b3R5cGUuX3RyYW5zbGF0ZVF1ZXVlPWZ1bmN0aW9uKGUpe3JldHVybntxdWV1ZUFSTjplLnF1ZXVlQVJOLG5hbWU6ZS5uYW1lfX0sdS5wcm90b3R5cGUuX3RyYW5zbGF0ZVNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3M9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7InBhY2tldHNDb3VudCJpbiBlJiYoZS5wYWNrZXRDb3VudD1lLnBhY2tldHNDb3VudCxkZWxldGUgZS5wYWNrZXRzQ291bnQpfSkpLGV9LHUucHJvdG90eXBlLl90cmFuc2xhdGVTb2Z0cGhvbmVDYWxsUmVwb3J0PWZ1bmN0aW9uKGUpe3JldHVybiJoYW5kc2hha2luZ1RpbWVNaWxsaXMiaW4gZSYmKGUuaGFuZHNoYWtlVGltZU1pbGxpcz1lLmhhbmRzaGFraW5nVGltZU1pbGxpcyxkZWxldGUgZS5oYW5kc2hha2luZ1RpbWVNaWxsaXMpLCJwcmVUYWxraW5nVGltZU1pbGxpcyJpbiBlJiYoZS5wcmVUYWxrVGltZU1pbGxpcz1lLnByZVRhbGtpbmdUaW1lTWlsbGlzLGRlbGV0ZSBlLnByZVRhbGtpbmdUaW1lTWlsbGlzKSwiaGFuZHNoYWtpbmdGYWlsdXJlImluIGUmJihlLmhhbmRzaGFrZUZhaWx1cmU9ZS5oYW5kc2hha2luZ0ZhaWx1cmUsZGVsZXRlIGUuaGFuZHNoYWtpbmdGYWlsdXJlKSwidGFsa2luZ1RpbWVNaWxsaXMiaW4gZSYmKGUudGFsa1RpbWVNaWxsaXM9ZS50YWxraW5nVGltZU1pbGxpcyxkZWxldGUgZS50YWxraW5nVGltZU1pbGxpcyksZS5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzPXRoaXMuX3RyYW5zbGF0ZVNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3MoZS5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzKSxlfTt2YXIgbD1mdW5jdGlvbihlKXtpZih0LmFzc2VydE5vdE51bGwoZSwiZW5kcG9pbnQiKSxuLmNhbGwodGhpcyksZS5pbmNsdWRlcygiL3Rhc2stdGVtcGxhdGVzIikpdGhpcy5lbmRwb2ludFVybD10LmdldFVybFdpdGhQcm90b2NvbChlKTtlbHNle3ZhciByPW5ldyBBV1MuRW5kcG9pbnQoZSksbz1lLmluY2x1ZGVzKCIuYXdzYXBwcy5jb20iKT8iL2Nvbm5lY3QiOiIiO3RoaXMuZW5kcG9pbnRVcmw9dC5nZXRVcmxXaXRoUHJvdG9jb2woYCR7ci5ob3N0fSR7b30vdGFzay10ZW1wbGF0ZXMvYXBpL2NjcGApfX07KGwucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1sLGwucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLG4scil7biYmbi5yZWxhdGVkQ29udGFjdElkJiZudWxsIT09bi5yZWxhdGVkQ29udGFjdElkJiZuLnByZXZpb3VzQ29udGFjdElkJiZkZWxldGUgbi5wcmV2aW91c0NvbnRhY3RJZCx0LmFzc2VydE5vdE51bGwoZSwibWV0aG9kIiksdC5hc3NlcnROb3ROdWxsKG4sInBhcmFtcyIpO3ZhciBvPXtjcmVkZW50aWFsczoiaW5jbHVkZSIsbWV0aG9kOiJHRVQiLGhlYWRlcnM6e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiIsIkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24iLCJ4LWNzcmYtdG9rZW4iOiJjc3JmIn19LGk9bi5pbnN0YW5jZUlkLHM9dGhpcy5lbmRwb2ludFVybCxhPXQuVGFza1RlbXBsYXRlc0NsaWVudE1ldGhvZHM7c3dpdGNoKGUpe2Nhc2UgYS5MSVNUX1RBU0tfVEVNUExBVEVTOmlmKHMrPWAvcHJveHkvaW5zdGFuY2UvJHtpfS90YXNrL3RlbXBsYXRlYCxuLnF1ZXJ5UGFyYW1zKXtjb25zdCBlPW5ldyBVUkxTZWFyY2hQYXJhbXMobi5xdWVyeVBhcmFtcykudG9TdHJpbmcoKTtlJiYocys9YD8ke2V9YCl9YnJlYWs7Y2FzZSBhLkdFVF9UQVNLX1RFTVBMQVRFOnQuYXNzZXJ0Tm90TnVsbChuLnRlbXBsYXRlUGFyYW1zLCJwYXJhbXMudGVtcGxhdGVQYXJhbXMiKTtjb25zdCByPXQuYXNzZXJ0Tm90TnVsbChuLnRlbXBsYXRlUGFyYW1zLmlkLCJwYXJhbXMudGVtcGxhdGVQYXJhbXMuaWQiKSxjPW4udGVtcGxhdGVQYXJhbXMudmVyc2lvbjtzKz1gL3Byb3h5L2luc3RhbmNlLyR7aX0vdGFzay90ZW1wbGF0ZS8ke3J9YCxjJiYocys9YD9zbmFwc2hvdFZlcnNpb249JHtjfWApO2JyZWFrO2Nhc2UgYS5DUkVBVEVfVEVNUExBVEVEX1RBU0s6cys9YC8ke2V9YCxvLmJvZHk9SlNPTi5zdHJpbmdpZnkobiksby5tZXRob2Q9IlBVVCI7YnJlYWs7Y2FzZSBhLlVQREFURV9DT05UQUNUOnMrPWAvJHtlfWAsby5ib2R5PUpTT04uc3RyaW5naWZ5KG4pLG8ubWV0aG9kPSJQT1NUIn10LmZldGNoKHMsbykudGhlbigoZnVuY3Rpb24oZSl7ci5zdWNjZXNzKGUpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtjb25zdCB0PWUuYm9keS5nZXRSZWFkZXIoKTtsZXQgbj0iIjtjb25zdCBvPW5ldyBUZXh0RGVjb2Rlcjt0LnJlYWQoKS50aGVuKChmdW5jdGlvbiBpKHtkb25lOnMsdmFsdWU6YX0pe2lmKHMpe3ZhciBjPUpTT04ucGFyc2Uobik7cmV0dXJuIGMuc3RhdHVzPWUuc3RhdHVzLHZvaWQgci5mYWlsdXJlKGMpfXJldHVybiBuKz1vLmRlY29kZShhKSx0LnJlYWQoKS50aGVuKGkpfSkpfSkpfSx0LkNsaWVudEJhc2U9bix0Lk51bGxDbGllbnQ9cix0LlVwc3RyZWFtQ29uZHVpdENsaWVudD1pLHQuQXBpUHJveHlDbGllbnQ9cyx0LlVwc3RyZWFtQ29uZHVpdE1hc3RlckNsaWVudD1hLHQuQVdTQ2xpZW50PXUsdC5BZ2VudEFwcENsaWVudD1jLHQuVGFza1RlbXBsYXRlc0NsaWVudD1sfSgpfSw4OTU6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dCx0LmNvcmU9e30sdC5jb3JlLmluaXRpYWxpemVkPSExLHQudmVyc2lvbj0iMi4xNC41Iix0Lm91dGVyQ29udGV4dFN0cmVhbXNWZXJzaW9uPW51bGwsdC5ERUZBVUxUX0JBVENIX1NJWkU9NTAwO3ZhciBuPSJBbWF6b24gQ29ubmVjdCBDQ1AiLHI9Imh0dHBzOi8ve2FsaWFzfS5hd3NhcHBzLmNvbS9hdXRoLz9jbGllbnRfaWQ9e2NsaWVudF9pZH0mcmVkaXJlY3RfdXJpPXtyZWRpcmVjdH0iLG89IjA2OTE5ZjRmZDhlZDMyNGUiLGk9Ii9hdXRoL2F1dGhvcml6ZSIscz0iL2Nvbm5lY3QvYXV0aC9hdXRob3JpemUiLGE9IklmcmFtZVJlZnJlc2hBdHRlbXB0cyIsYz0iSWZyYW1lUmVmcmVzaEF0dGVtcHRzRHIiLHU9IklmcmFtZUluaXRpYWxpemF0aW9uU3VjY2VzcyIsbD0iSWZyYW1lSW5pdGlhbGl6YXRpb25TdWNjZXNzRHIiO2NvbnN0IHA9ImN1c3RvbXZpZXdzIixkPXsiMC0xMDAiOlswLDEwMF0sIjEwMS01MDAiOlsxMDEsNTAwXSwiNTAxLTEwMDAiOls1MDEsMWUzXSwiMTAwMC0zMDAwIjpbMTAwMSwzZTNdLCIzMDAxLTUwMDAiOlszMDAxLDVlM10sIjUwMDEtMTAwMDAiOls1MDAxLDFlNF0sIjEwMDAxLTIwMDAwIjpbMTAwMDEsMmU0XSwiMjAwMDArIjpbMjAwMDEsTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJdfTt0Lm51bWJlck9mQ29ubmVjdGVkQ0NQcz0wLHQubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzSW5UaGlzVGFiPTAsdC5jb3JlLk1BWF9BVVRIT1JJWkVfUkVUUllfQ09VTlRfRk9SX1NFU1NJT049Myx0LmNvcmUuTUFYX0NUSV9BVVRIX1JFVFJZX0NPVU5UPTEwLHQuY29yZS5jdGlBdXRoUmV0cnlDb3VudD0wLHQuY29yZS5hdXRob3JpemVUaW1lb3V0SWQ9bnVsbCx0LmNvcmUuY3RpVGltZW91dElkPW51bGwsdC5jb3JlLk1BWF9VTkFVVEhPUklaRURfUkVUUllfQ09VTlQ9MjAsdC5jb3JlLk1BWF9BQ0NFU1NfREVOSUVEX1JFVFJZX0NPVU5UPTEwLHQuU2Vzc2lvblN0b3JhZ2VLZXlzPXQubWFrZUVudW0oWyJ0YWJfaWQiLCJhdXRob3JpemVfcmV0cnlfY291bnQiXSk7Y2xhc3MgaHtjb25zdHJ1Y3Rvcih0KXt0aGlzLmtleT1gJHt0fVBhcmFtc1N0b3JhZ2U6OiR7ZS5sb2NhdGlvbi5vcmlnaW59YH1nZXQoKXt0cnl7Y29uc3QgdD1lLmxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMua2V5KTtyZXR1cm4gdCYmSlNPTi5wYXJzZSh0KX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKGAke3RoaXMua2V5fTo6IEZhaWxlZCB0byBnZXQgc29mdHBob25lIHBhcmFtcyBmcm9tIGxvY2FsIHN0b3JhZ2UhYCkud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfXJldHVybiBudWxsfXNldChuKXt0cnl7biYmZS5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmtleSxKU09OLnN0cmluZ2lmeShuKSl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcihgJHt0aGlzLmtleX06OiBGYWlsZWQgdG8gc2V0IHNvZnRwaG9uZSBwYXJhbXMgdG8gbG9jYWwgc3RvcmFnZSFgKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fWNsZWFuKCl7ZS5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmtleSl9fWNvbnN0IGY9bmV3IGNsYXNzIGV4dGVuZHMgaHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCJTb2Z0cGhvbmUiKX19LGc9bmV3IGNsYXNzIGV4dGVuZHMgaHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCJSaW5ndG9uZSIpfX07ZnVuY3Rpb24gbShlKXt2YXIgdD1lLm1hdGNoKC9eKD86aHR0cHM/OlwvXC8pPyg/OlteQFxuXStAKT8oPzp3d3dcLik/KFteOlwvXG4/XSspL2dpKTtyZXR1cm4gdC5sZW5ndGg/dFswXToiIn10LmNvcmUuY2hlY2tOb3RJbml0aWFsaXplZD1mdW5jdGlvbigpe3QuY29yZS5pbml0aWFsaXplZCYmdC5nZXRMb2coKS53YXJuKCJDb25uZWN0IGNvcmUgYWxyZWFkeSBpbml0aWFsaXplZCwgb25seSBuZWVkcyB0byBiZSBpbml0aWFsaXplZCBvbmNlLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9O3ZhciB2PWZ1bmN0aW9uKGUsbil7dmFyIHI9ZS5nZXRBZ2VudFN0YXRlcygpLmZpbmQoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PT10LkFnZW50U3RhdGVUeXBlLk9GRkxJTkV9KSk7ZS5zZXRTdGF0ZShyLG4pfSx5PWZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBTaWduYWwgc2hhcmVkd29ya2VyIHRvIHNldCBjb250YWN0cyBzdXBwcmVzc29yIHRvICVzIGZvciBpbnN0YW5jZSAlcy4iLGUsdC5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLlNVUFBSRVNTLHtzdXBwcmVzczplLHNob3VsZFNlbmRGYWlsb3ZlckRvd25zdHJlYW06ITF9KX0sRT1mdW5jdGlvbihlLG4pe3QuZ2V0TG9nKCkuaW5mbygiW0RJU0FTVEVSIFJFQ09WRVJZXSBTaWduYWwgc2hhcmVkd29ya2VyIHRvIHNldCBmb3JjZU9mZmxpbmUgdG8gJXMgZm9yIGluc3RhbmNlICVzLiIsZSx0LmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRk9SQ0VfT0ZGTElORSx7b2ZmbGluZTplLG5leHRBY3RpdmVBcm46bn0pfSxTPWZ1bmN0aW9uKGUsbil7dmFyIHI9dC5nZXRMb2coKTtjb25zdCBvPXQuYWdlbnQuaW5pdGlhbGl6ZWQ/dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0SW5zdGFuY2VJZCgpOnQuY29yZS5yZWdpb247ci5pbmZvKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEF0dGVtcHRpbmcgdG8gZm9yY2UgaW5zdGFuY2UgJHtvfSBvZmZsaW5lIHVzaW5nICR7ZT8ic29mdCI6ImhhcmQifSBmYWlsb3ZlcmApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5hZ2VudCgoZnVuY3Rpb24obyl7dmFyIGk9MCxzPW8uZ2V0Q29udGFjdHMoKSxhPSExO2lmKHMubGVuZ3RoKWZvcihsZXQgYyBvZiBzKXtpZihhKWJyZWFrOyFlfHxjLmdldFR5cGUoKSE9PXQuQ29udGFjdFR5cGUuUVVFVUVfQ0FMTEJBQ0smJmMuZ2V0VHlwZSgpIT10LkNvbnRhY3RUeXBlLlZPSUNFP2MuZ2V0QWdlbnRDb25uZWN0aW9uKCkuZGVzdHJveSh7c3VjY2VzczpmdW5jdGlvbigpeysraT09PXMubGVuZ3RoJiYoRSghMSxuKSx2KG8pLHIuaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBJbnN0YW5jZSAlcyBpcyBub3cgb2ZmbGluZSIsdC5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7ci53YXJuKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEFuIGVycm9yIG9jY3VyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBmb3JjZSB0aGlzIGluc3RhbmNlIHRvIG9mZmxpbmUgaW4gcmVnaW9uICVzIix0LmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIud2FybihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLEUoITAsbiksYT0hMH19KTooci5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIFdpbGwgd2FpdCB0byBjb21wbGV0ZSBmYWlsb3ZlciBvZiBpbnN0YW5jZSAlcyB1bnRpbCB2b2ljZSBjb250YWN0IHdpdGggSUQgJXMgaXMgZGVzdHJveWVkIix0LmNvcmUucmVnaW9uLGMuZ2V0Q29udGFjdElkKCkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZERvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZBSUxPVkVSX1BFTkRJTkcse25leHRBY3RpdmVBcm46bn0pLGMub25EZXN0cm95KChmdW5jdGlvbihlKXtyLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gVm9pY2UgY29udGFjdCB3aXRoIElEICVzIGRlc3Ryb3llZCwgY29udGludWluZyB3aXRoIGZhaWxvdmVyIGluIGluc3RhbmNlICVzIixlLmdldENvbnRhY3RJZCgpLHQuY29yZS5yZWdpb24pLFMoITAsbil9KSkpfWVsc2UgRSghMSxuKSx2KG8pLHIuaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBJbnN0YW5jZSAlcyBpcyBub3cgb2ZmbGluZSIsdC5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKX07dC5jb3JlLnRlcm1pbmF0ZUN1c3RvbVZpZXc9ZnVuY3Rpb24oZSxuPSIiLHtyZXNvbHZlSWZyYW1lOnI9ITAsdGltZW91dDpvPTVlMyxoaWRlSWZyYW1lOmk9ITB9PXt9KXtsZXQgcztjb25zdCBhPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdD8ucXVlcnlTZWxlY3RvcihuKXx8ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSl8fHdpbmRvdy50b3AuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSl9O3M9bj9gJHtwfSR7bn1gOmAke3B9YDtjb25zdCBjPXQuYWdlbnRBcHAuQXBwUmVnaXN0cnkuZ2V0KHMpPy5jb250YWluZXJET00sdT1gaWZyYW1lW2lkPScke3N9J11gLGw9YShzLGMsdSk7aWYobCl0cnl7Y29uc3Qgbj17dG9waWM6ImxpZmVjeWNsZS50ZXJtaW5hdGVkIn07bC5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKG4sZSksciYmKGkmJihsLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxjb25zb2xlLmluZm8oIltDdXN0b21WaWV3c10gY3VzdG9tdmlld3MgaWZyYW1lIGhpZGRlbiBmb3IgcmVzb2x1dGlvbiBkdXJpbmcgdGVybWluYXRpb24iKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuYWdlbnRBcHAuc3RvcEFwcChzKSxhKHMsYyx1KT9jb25zb2xlLndhcm4oIltDdXN0b21WaWV3c10gY3VzdG9tdmlld3MgYXBwbGljYXRpb24gZGlkIG5vdCBzdG9wIHN1Y2Nlc3NmdWxseSBpbiB0ZXJtaW5hdGVDdXN0b21WaWV3IG9wZXJhdGlvbiIpOmNvbnNvbGUuaW5mbygiW0N1c3RvbVZpZXdzXSBjdXN0b212aWV3cyBhcHBsaWNhdGlvbiBzdWNjZXNzZnVsbHkgc3RvcHBlZCIpfSksbykpfWNhdGNoKGUpe3Rocm93IG5ldyBFcnJvcigiW0N1c3RvbVZpZXdzXSBFcnJvciBpbiB0ZXJtaW5hdGVDdXN0b21WaWV3OiAiLGUpfWVsc2UgY29uc29sZS53YXJuKCJbQ3VzdG9tVmlld3NdIHRlcm1pbmF0ZUN1c3RvbVZpZXcgb3BlcmF0aW9uIGZhaWxlZCBkdWUgdG8gaWZyYW1lIG5vdCBmb3VuZCIpfSx0LmNvcmUuaW5pdERpc2FzdGVyUmVjb3Zlcnk9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXQuZ2V0TG9nKCk7dC5jb3JlLnJlZ2lvbj1lLnJlZ2lvbix0LmNvcmUuc3VwcHJlc3NDb250YWN0cz1ufHx5LHQuY29yZS5mb3JjZU9mZmxpbmU9cnx8Uyx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vbkRvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLlNFVF9PRkZMSU5FLChmdW5jdGlvbihlKXt0LmlmTWFzdGVyKHQuTWFzdGVyVG9waWNzLkZBSUxPVkVSLChmdW5jdGlvbigpe3QuY29yZS5mb3JjZU9mZmxpbmUoZSYmZS5zb2Z0RmFpbG92ZXIpfSkpfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZPUkNFX09GRkxJTkUsKGZ1bmN0aW9uKGUpe3QuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuRkFJTE9WRVIsKGZ1bmN0aW9uKCl7dC5jb3JlLmZvcmNlT2ZmbGluZShlJiZlLnNvZnRGYWlsb3ZlcixlJiZlLm5leHRBY3RpdmVBcm4pfSkpfSkpLHQuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuRkFJTE9WRVIsKGZ1bmN0aW9uKCl7by5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEluaXRpYWxpemluZyByZWdpb24gJXMgYXMgcGFydCBvZiBhIERpc2FzdGVyIFJlY292ZXJ5IGZsZWV0Iix0LmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSksKGZ1bmN0aW9uKCl7by5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldICVzIGFscmVhZHkgcGFydCBvZiBhIERpc2FzdGVyIFJlY292ZXJ5IGZsZWV0Iix0LmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLGUucG9sbEZvckZhaWxvdmVyJiZ0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuSU5JVF9EUl9QT0xMSU5HP3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuSU5JVF9EUl9QT0xMSU5HLHtpbnN0YW5jZUFybjplLmluc3RhbmNlQXJuLG90aGVyQXJuOmUub3RoZXJBcm4sYXV0aFRva2VuOmUuYXV0aFRva2VufSk6ZS5pc1ByaW1hcnk/KHQuY29yZS5zdXBwcmVzc0NvbnRhY3RzKCExKSxvLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gJXMgaW5zdGFuY2UgaXMgc2V0IHRvIHByaW1hcnkiLHQuY29yZS5yZWdpb24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpOih0LmNvcmUuc3VwcHJlc3NDb250YWN0cyghMCksdC5jb3JlLmZvcmNlT2ZmbGluZSgpLG8uaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSAlcyBpbnN0YW5jZSBpcyBzZXQgdG8gc3RhbmQtYnkiLHQuY29yZS5yZWdpb24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfSx0LmNvcmUuaW5pdD1mdW5jdGlvbihlKXt0LmNvcmUuZXZlbnRCdXM9bmV3IHQuRXZlbnRCdXMsdC5jb3JlLmFnZW50RGF0YVByb3ZpZGVyPW5ldyBBKHQuY29yZS5nZXRFdmVudEJ1cygpKSx0LmNvcmUuaW5pdENsaWVudChlKSx0LmNvcmUuaW5pdEFnZW50QXBwQ2xpZW50KGUpLHQuY29yZS5pbml0VGFza1RlbXBsYXRlc0NsaWVudChlKSx0LmNvcmUuaW5pdGlhbGl6ZWQ9ITB9LHQuY29yZS5pbml0Q2xpZW50PWZ1bmN0aW9uKGUpe3QuYXNzZXJ0Tm90TnVsbChlLCJwYXJhbXMiKTt2YXIgbj10LmFzc2VydE5vdE51bGwoZS5hdXRoVG9rZW4sInBhcmFtcy5hdXRoVG9rZW4iKSxyPXQuYXNzZXJ0Tm90TnVsbChlLnJlZ2lvbiwicGFyYW1zLnJlZ2lvbiIpLG89ZS5lbmRwb2ludHx8bnVsbDt0LmNvcmUuY2xpZW50PW5ldyB0LkFXU0NsaWVudChuLHIsbyl9LHQuY29yZS5pbml0QWdlbnRBcHBDbGllbnQ9ZnVuY3Rpb24oZSl7dC5hc3NlcnROb3ROdWxsKGUsInBhcmFtcyIpO3ZhciBuPXQuYXNzZXJ0Tm90TnVsbChlLmF1dGhUb2tlbiwicGFyYW1zLmF1dGhUb2tlbiIpLHI9dC5hc3NlcnROb3ROdWxsKGUuYXV0aENvb2tpZU5hbWUsInBhcmFtcy5hdXRoQ29va2llTmFtZSIpLG89dC5hc3NlcnROb3ROdWxsKGUuYWdlbnRBcHBFbmRwb2ludCwicGFyYW1zLmFnZW50QXBwRW5kcG9pbnQiKTt0LmNvcmUuYWdlbnRBcHBDbGllbnQ9bmV3IHQuQWdlbnRBcHBDbGllbnQocixuLG8pfSx0LmNvcmUuaW5pdFRhc2tUZW1wbGF0ZXNDbGllbnQ9ZnVuY3Rpb24oZSl7dC5hc3NlcnROb3ROdWxsKGUsInBhcmFtcyIpO3ZhciBuPWUudGFza1RlbXBsYXRlc0VuZHBvaW50fHxlLmVuZHBvaW50O3QuYXNzZXJ0Tm90TnVsbChuLCJ0YXNrVGVtcGxhdGVzRW5kcG9pbnQiKSx0LmNvcmUudGFza1RlbXBsYXRlc0NsaWVudD1uZXcgdC5UYXNrVGVtcGxhdGVzQ2xpZW50KG4pfSx0LmNvcmUudGVybWluYXRlPWZ1bmN0aW9uKCl7dC5jb3JlLmNsaWVudD1uZXcgdC5OdWxsQ2xpZW50LHQuY29yZS5hcGlQcm94eUNsaWVudD1uZXcgdC5OdWxsQ2xpZW50LHQuY29yZS5hZ2VudEFwcENsaWVudD1uZXcgdC5OdWxsQ2xpZW50LHQuY29yZS50YXNrVGVtcGxhdGVzQ2xpZW50PW5ldyB0Lk51bGxDbGllbnQsdC5jb3JlLm1hc3RlckNsaWVudD1uZXcgdC5OdWxsQ2xpZW50O3ZhciBlPXQuY29yZS5nZXRFdmVudEJ1cygpO2UmJmUudW5zdWJzY3JpYmVBbGwoKSx0LmNvcmUuYnVzPW5ldyB0LkV2ZW50QnVzLHQuY29yZS5hZ2VudERhdGFQcm92aWRlcj1udWxsLHQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyPW51bGwsdC5jb3JlLnVwc3RyZWFtPW51bGwsdC5jb3JlLmtlZXBhbGl2ZU1hbmFnZXI9bnVsbCx0LnN0b3JhZ2VBY2Nlc3MucmVzZXRTdG9yYWdlQWNjZXNzU3RhdGUoKSx0LmFnZW50LmluaXRpYWxpemVkPSExLHQuY29yZS5pbml0aWFsaXplZD0hMX0sdC5jb3JlLnNvZnRwaG9uZVVzZXJNZWRpYVN0cmVhbT1udWxsLHQuY29yZS5zZXRTb2Z0cGhvbmVVc2VyTWVkaWFTdHJlYW09ZnVuY3Rpb24oZSl7dC5jb3JlLnNvZnRwaG9uZVVzZXJNZWRpYVN0cmVhbT1lfSx0LmNvcmUuaW5pdFJpbmd0b25lRW5naW5lcz1mdW5jdGlvbihuLHIpe3QuZ2V0TG9nKCkuaW5mbygiW1Jpbmd0b25lIEVuZ2luZV0gaW5pdFJpbmd0b25lRW5naW5lIHN0YXJ0ZWQiKS53aXRoT2JqZWN0KHtwYXJhbXM6bn0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5hc3NlcnROb3ROdWxsKG4sInBhcmFtcyIpO2NvbnN0IG89cnx8Qzt2YXIgaT1mdW5jdGlvbihlKXt0LmFzc2VydE5vdE51bGwoZSwicmluZ3RvbmVTZXR0aW5ncyIpLHQuYXNzZXJ0Tm90TnVsbChlLnZvaWNlLCJyaW5ndG9uZVNldHRpbmdzLnZvaWNlIiksdC5hc3NlcnRUcnVlKGUudm9pY2UucmluZ3RvbmVVcmx8fGUudm9pY2UuZGlzYWJsZWQsInJpbmd0b25lU2V0dGluZ3Mudm9pY2UucmluZ3RvbmVVcmwgbXVzdCBiZSBwcm92aWRlZCBvciByaW5ndG9uZVNldHRpbmdzLnZvaWNlLmRpc2FibGVkIG11c3QgYmUgdHJ1ZSIpLHQuYXNzZXJ0Tm90TnVsbChlLnF1ZXVlX2NhbGxiYWNrLCJyaW5ndG9uZVNldHRpbmdzLnF1ZXVlX2NhbGxiYWNrIiksdC5hc3NlcnRUcnVlKGUucXVldWVfY2FsbGJhY2sucmluZ3RvbmVVcmx8fGUucXVldWVfY2FsbGJhY2suZGlzYWJsZWQsInJpbmd0b25lU2V0dGluZ3Mudm9pY2UucmluZ3RvbmVVcmwgbXVzdCBiZSBwcm92aWRlZCBvciByaW5ndG9uZVNldHRpbmdzLnF1ZXVlX2NhbGxiYWNrLmRpc2FibGVkIG11c3QgYmUgdHJ1ZSIpLHQuY29yZS5yaW5ndG9uZUVuZ2luZXM9e30sdC5hZ2VudCgoZnVuY3Rpb24obil7bi5vblJlZnJlc2goKGZ1bmN0aW9uKCl7dC5pZk1hc3Rlcih0Lk1hc3RlclRvcGljcy5SSU5HVE9ORSwoZnVuY3Rpb24oKXtsZXQgbj0hMTtlLnZvaWNlLmRpc2FibGVkfHx0LmNvcmUucmluZ3RvbmVFbmdpbmVzLnZvaWNlfHwodC5jb3JlLnJpbmd0b25lRW5naW5lcy52b2ljZT1uZXcgdC5Wb2ljZVJpbmd0b25lRW5naW5lKGUudm9pY2UpLG49ITAsdC5nZXRMb2coKS5pbmZvKCJWb2ljZVJpbmd0b25lRW5naW5lIGluaXRpYWxpemVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpLGUuY2hhdC5kaXNhYmxlZHx8dC5jb3JlLnJpbmd0b25lRW5naW5lcy5jaGF0fHwodC5jb3JlLnJpbmd0b25lRW5naW5lcy5jaGF0PW5ldyB0LkNoYXRSaW5ndG9uZUVuZ2luZShlLmNoYXQpLG49ITAsdC5nZXRMb2coKS5pbmZvKCJDaGF0UmluZ3RvbmVFbmdpbmUgaW5pdGlhbGl6ZWQuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSksZS50YXNrLmRpc2FibGVkfHx0LmNvcmUucmluZ3RvbmVFbmdpbmVzLnRhc2t8fCh0LmNvcmUucmluZ3RvbmVFbmdpbmVzLnRhc2s9bmV3IHQuVGFza1Jpbmd0b25lRW5naW5lKGUudGFzayksbj0hMCx0LmdldExvZygpLmluZm8oIlRhc2tSaW5ndG9uZUVuZ2luZSBpbml0aWFsaXplZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKSxlLnF1ZXVlX2NhbGxiYWNrLmRpc2FibGVkfHx0LmNvcmUucmluZ3RvbmVFbmdpbmVzLnF1ZXVlX2NhbGxiYWNrfHwodC5jb3JlLnJpbmd0b25lRW5naW5lcy5xdWV1ZV9jYWxsYmFjaz1uZXcgdC5RdWV1ZUNhbGxiYWNrUmluZ3RvbmVFbmdpbmUoZS5xdWV1ZV9jYWxsYmFjayksbj0hMCx0LmdldExvZygpLmluZm8oIlF1ZXVlQ2FsbGJhY2tSaW5ndG9uZUVuZ2luZSBpbml0aWFsaXplZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKSxuJiZ0LmNvcmUuX3JpbmdlckRldmljZUlkJiZvKHtkZXZpY2VJZDp0LmNvcmUuX3JpbmdlckRldmljZUlkfSl9KSl9KSl9KSksYigpfSxzPWZ1bmN0aW9uKGUsbil7ZS5yaW5ndG9uZT1lLnJpbmd0b25lfHx7fSxlLnJpbmd0b25lLnZvaWNlPWUucmluZ3RvbmUudm9pY2V8fHt9LGUucmluZ3RvbmUucXVldWVfY2FsbGJhY2s9ZS5yaW5ndG9uZS5xdWV1ZV9jYWxsYmFja3x8e30sZS5yaW5ndG9uZS5jaGF0PWUucmluZ3RvbmUuY2hhdHx8e2Rpc2FibGVkOiEwfSxlLnJpbmd0b25lLnRhc2s9ZS5yaW5ndG9uZS50YXNrfHx7ZGlzYWJsZWQ6ITB9LG4uc29mdHBob25lJiYobi5zb2Z0cGhvbmUuZGlzYWJsZVJpbmd0b25lJiYoZS5yaW5ndG9uZS52b2ljZS5kaXNhYmxlZD0hMCxlLnJpbmd0b25lLnF1ZXVlX2NhbGxiYWNrLmRpc2FibGVkPSEwKSxuLnNvZnRwaG9uZS5yaW5ndG9uZVVybCYmKGUucmluZ3RvbmUudm9pY2UucmluZ3RvbmVVcmw9bi5zb2Z0cGhvbmUucmluZ3RvbmVVcmwsZS5yaW5ndG9uZS5xdWV1ZV9jYWxsYmFjay5yaW5ndG9uZVVybD1uLnNvZnRwaG9uZS5yaW5ndG9uZVVybCkpLG4uY2hhdCYmKG4uY2hhdC5kaXNhYmxlUmluZ3RvbmUmJihlLnJpbmd0b25lLmNoYXQuZGlzYWJsZWQ9ITApLG4uY2hhdC5yaW5ndG9uZVVybCYmKGUucmluZ3RvbmUuY2hhdC5yaW5ndG9uZVVybD1uLmNoYXQucmluZ3RvbmVVcmwpKSxuLnRhc2smJihuLnRhc2suZGlzYWJsZVJpbmd0b25lJiYoZS5yaW5ndG9uZS50YXNrLmRpc2FibGVkPSEwKSxuLnRhc2sucmluZ3RvbmVVcmwmJihlLnJpbmd0b25lLnRhc2sucmluZ3RvbmVVcmw9bi50YXNrLnJpbmd0b25lVXJsKSksbi5yaW5ndG9uZSYmKGUucmluZ3RvbmUudm9pY2U9dC5tZXJnZShlLnJpbmd0b25lLnZvaWNlLG4ucmluZ3RvbmUudm9pY2V8fHt9KSxlLnJpbmd0b25lLnF1ZXVlX2NhbGxiYWNrPXQubWVyZ2UoZS5yaW5ndG9uZS5xdWV1ZV9jYWxsYmFjayxuLnJpbmd0b25lLnZvaWNlfHx7fSksZS5yaW5ndG9uZS5jaGF0PXQubWVyZ2UoZS5yaW5ndG9uZS5jaGF0LG4ucmluZ3RvbmUuY2hhdHx8e30pLGUucmluZ3RvbmUudGFzaz10Lm1lcmdlKGUucmluZ3RvbmUudGFzayxuLnJpbmd0b25lLnRhc2t8fHt9KSl9O2lmKHMobixuKSx0LmlzRnJhbWVkKCkpe2xldCByO3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5DT05GSUdVUkUsKGZ1bmN0aW9uKG8pe2UuY2xlYXJUaW1lb3V0KHIpLHQuZ2V0TG9nKCkuaW5mbygiW1Jpbmd0b25lIEVuZ2luZV0gQ29uZmlndXJlIGV2ZW50IGhhbmRsZXIgZXhlY3V0ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHRoaXMudW5zdWJzY3JpYmUoKSxzKG4sbyksZy5zZXQobi5yaW5ndG9uZSksaShuLnJpbmd0b25lKX0pKTtjb25zdCBvPWcuZ2V0KCk7byYmdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSwoZnVuY3Rpb24obil7biYmbi5pZCYmKHQuZ2V0TG9nKCkuaW5mbygiW1Jpbmd0b25lRW5naW5lXSBFbWJlZGRlZCBDQ1AgaXMgcmVmcmVzaGVkIHN1Y2Nlc3NmdWxseSBhbmQgd2FpdGluZyBmb3IgY29uZmlndXJlIE1lc3NhZ2UgaGFuZGxlciB0byBleGVjdXRlIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0aGlzLnVuc3Vic2NyaWJlKCkscj1lLnNldFRpbWVvdXQoKCgpPT57dC5nZXRMb2coKS5pbmZvKCJbUmluZ3RvbmVFbmdpbmVdIEVtYmVkZGVkIENDUCBpcyByZWZyZXNoZWQgd2l0aG91dCBjb25maWd1cmUgbWVzc2FnZSAmIEluaXRpYWxpemluZyBzZXR1cFJpbmd0b25lRW5naW5lcyAoUmluZ3RvbmUgRW5naW5lKSBmcm9tIGxvY2FsU3RvcmFnZSByaW5ndG9uZSBwYXJhbXMuICIpLndpdGhPYmplY3Qoe3Jpbmd0b25lOm99KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkobyl9KSwxMDApKX0pKX1lbHNlIGkobi5yaW5ndG9uZSl9O3ZhciBiPWZ1bmN0aW9uKCl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQ29uZmlndXJhdGlvbkV2ZW50cy5TRVRfUklOR0VSX0RFVklDRSxDKX0sQz1mdW5jdGlvbihlPXt9KXtjb25zdCBuPWUuZGV2aWNlSWR8fCIiO2lmKHQuZ2V0TG9nKCkuaW5mbyhgW0F1ZGlvIERldmljZSBTZXR0aW5nc10gQXR0ZW1wdGluZyB0byBzZXQgcmluZ2VyIGRldmljZSAke259YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSwwPT09dC5rZXlzKHQuY29yZS5yaW5ndG9uZUVuZ2luZXMpLmxlbmd0aClyZXR1cm4gdC5nZXRMb2coKS5pbmZvKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBzZXRSaW5nZXJEZXZpY2UgY2FsbGVkIGJlZm9yZSByaW5ndG9uZSBlbmdpbmUgaXMgaW5pdGlhbGl6ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHZvaWQobiYmKHQuY29yZS5fcmluZ2VyRGV2aWNlSWQ9bix0LmdldExvZygpLndhcm4oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIHN0b3JlZCBkZXZpY2UgSWQgZm9yIGxhdGVyIHVzZSwgb25jZSByaW5ndG9uZSBlbmdpbmUgaXMgdXAuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6IlNldFJpbmdlckRldmljZUJlZm9yZUluaXRSaW5ndG9uZUVuZ2luZSIsZGF0YTp7Y291bnQ6MX19KSkpO2lmKG4pe2ZvcihsZXQgZSBpbiB0LmNvcmUucmluZ3RvbmVFbmdpbmVzKXQuY29yZS5yaW5ndG9uZUVuZ2luZXNbZV0uc2V0T3V0cHV0RGV2aWNlKG4pLnRoZW4oKGZ1bmN0aW9uKG4pe3QuZ2V0TG9nKCkuaW5mbyhgW0F1ZGlvIERldmljZSBTZXR0aW5nc10gcmluZ3RvbmVUeXBlICR7ZX0gc3VjY2Vzc2Z1bGx5IHNldCB0byBkZXZpY2VpZCAke259YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcihlKX0pKTt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuUklOR0VSX0RFVklDRV9DSEFOR0VELGRhdGE6e2RldmljZUlkOm59fSl9ZWxzZSB0LmdldExvZygpLndhcm4oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIFNldHRpbmcgcmluZ2VyIGRldmljZSBjYW5jZWxsZWQgZHVlIHRvIG1pc3NpbmcgZGV2aWNlSWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfTt0LmNvcmUuaW5pdFNvZnRwaG9uZU1hbmFnZXI9ZnVuY3Rpb24obil7dmFyIHI9bnx8e307dC5nZXRMb2coKS5pbmZvKCJbU29mdHBob25lIE1hbmFnZXJdIGluaXRTb2Z0cGhvbmVNYW5hZ2VyIHN0YXJ0ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBvPWZ1bmN0aW9uKGUpe3ZhciBuPXQubWVyZ2Uoci5zb2Z0cGhvbmV8fHt9LGUpO3QuZ2V0TG9nKCkuaW5mbygiW1NvZnRwaG9uZSBNYW5hZ2VyXSBjb21wZXRlRm9yTWFzdGVyT25BZ2VudFVwZGF0ZSBleGVjdXRlZCIpLndpdGhPYmplY3Qoe3NvZnRwaG9uZVBhcmFtczpufSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmFnZW50KChmdW5jdGlvbihlKXtlLmdldENoYW5uZWxDb25jdXJyZW5jeSh0LkNoYW5uZWxUeXBlLlZPSUNFKSYmZS5vblJlZnJlc2goKGZ1bmN0aW9uKCl7dmFyIHI9dGhpczt0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gYWdlbnQgcmVmcmVzaCBoYW5kbGVyIGV4ZWN1dGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmlmTWFzdGVyKHQuTWFzdGVyVG9waWNzLlNPRlRQSE9ORSwoZnVuY3Rpb24oKXt0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gY29uZmlybWVkIGFzIHNvZnRwaG9uZSBtYXN0ZXIgdG9waWMiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLCF0LmNvcmUuc29mdHBob25lTWFuYWdlciYmZS5pc1NvZnRwaG9uZUVuYWJsZWQoKSYmKHQuYmVjb21lTWFzdGVyKHQuTWFzdGVyVG9waWNzLlNFTkRfTE9HUyksdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXI9bmV3IHQuU29mdHBob25lTWFuYWdlcihuKSxyLnVuc3Vic2NyaWJlKCkpfSkpfSkpfSkpfTtpZih0LmlzRnJhbWVkKCkmJnQuaXNDQ1AoKSl7bGV0IG47dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLkNPTkZJR1VSRSwoZnVuY3Rpb24ocil7ZS5jbGVhclRpbWVvdXQobiksdC5nZXRMb2coKS5pbmZvKCJbU29mdHBob25lIE1hbmFnZXJdIENvbmZpZ3VyZSBldmVudCBoYW5kbGVyIGV4ZWN1dGVkIikud2l0aE9iamVjdCh7ZGF0YTpyfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxmLnNldChyLnNvZnRwaG9uZSksci5zb2Z0cGhvbmUmJnIuc29mdHBob25lLmFsbG93RnJhbWVkU29mdHBob25lJiYodGhpcy51bnN1YnNjcmliZSgpLG8oci5zb2Z0cGhvbmUpKSxpKHIuc29mdHBob25lKX0pKTtsZXQgcj1mLmdldCgpO3ImJnQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuQUNLTk9XTEVER0UsKGZ1bmN0aW9uKHMpe3MmJnMuaWQmJih0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gRW1iZWRkZWQgQ0NQIGlzIHJlZnJlc2hlZCBzdWNjZXNzZnVsbHkgYW5kIHdhaXRpbmcgZm9yIGNvbmZpZ3VyZSBNZXNzYWdlIGhhbmRsZXIgdG8gZXhlY3V0ZSIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy51bnN1YnNjcmliZSgpLG49ZS5zZXRUaW1lb3V0KCgoKT0+e3QuZ2V0TG9nKCkuaW5mbygiW1NvZnRwaG9uZSBNYW5hZ2VyXSBFbWJlZGRlZCBDQ1AgaXMgcmVmcmVzaGVkIHdpdGhvdXQgY29uZmlndXJlIG1lc3NhZ2UgaGFuZGxlciBleGVjdXRpb24iKS53aXRoT2JqZWN0KHtzb2Z0cGhvbmVQYXJhbXNGcm9tTG9jYWxTdG9yYWdlOnJ9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQucHVibGlzaE1ldHJpYyh7bmFtZToiRW1iZWRkZWRDQ1BSZWZyZXNoZWRXaXRob3V0SW5pdENDUCIsZGF0YTp7Y291bnQ6MX19KSxpKHIpLHIuYWxsb3dGcmFtZWRTb2Z0cGhvbmUmJih0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gRW1iZWRkZWQgQ0NQIGlzIHJlZnJlc2hlZCAmIEluaXRpYWxpemluZyBjb21wZXRlRm9yTWFzdGVyT25BZ2VudFVwZGF0ZSAoU29mdHBob25lIG1hbmFnZXIpIGZyb20gbG9jYWxTdG9yYWdlIHNvZnRwaG9uZSBwYXJhbXMiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG8ocikpfSksMTAwKSl9KSl9ZWxzZSBvKHIpLGkocik7ZnVuY3Rpb24gaShlKXt2YXIgbj10Lm1lcmdlKHIuc29mdHBob25lfHx7fSxlKTt0LmNvcmUuc29mdHBob25lUGFyYW1zPW4sdC5pc0ZpcmVmb3hCcm93c2VyKCkmJih0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLk1BU1RFUl9SRVNQT05TRSwoZnVuY3Rpb24oZSl7ZS5kYXRhJiZlLmRhdGEudG9waWM9PT10Lk1hc3RlclRvcGljcy5TT0ZUUEhPTkUmJmUuZGF0YS50YWtlT3ZlciYmZS5kYXRhLm1hc3RlcklkIT09dC5jb3JlLnBvcnRTdHJlYW1JZCYmdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXImJih0LmNvcmUuc29mdHBob25lTWFuYWdlci5vbkluaXRDb250YWN0U3ViLnVuc3Vic2NyaWJlKCksZGVsZXRlIHQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyKX0pKSx0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5Db25uZWN0aW9uRXZlbnRzLlJFQURZX1RPX1NUQVJUX1NFU1NJT04sKGZ1bmN0aW9uKCl7dC5pZk1hc3Rlcih0Lk1hc3RlclRvcGljcy5TT0ZUUEhPTkUsKGZ1bmN0aW9uKCl7dC5jb3JlLnNvZnRwaG9uZU1hbmFnZXImJnQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyLnN0YXJ0U2Vzc2lvbigpfSksKGZ1bmN0aW9uKCl7dC5iZWNvbWVNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuU09GVFBIT05FLChmdW5jdGlvbigpe3QuYWdlbnQoKGZ1bmN0aW9uKGUpeyF0LmNvcmUuc29mdHBob25lTWFuYWdlciYmZS5pc1NvZnRwaG9uZUVuYWJsZWQoKSYmKHQuYmVjb21lTWFzdGVyKHQuTWFzdGVyVG9waWNzLlNFTkRfTE9HUyksdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXI9bmV3IHQuU29mdHBob25lTWFuYWdlcihuKSx0LmNvcmUuc29mdHBob25lTWFuYWdlci5zdGFydFNlc3Npb24oKSl9KSl9KSl9KSl9KSksdC5jb250YWN0KChmdW5jdGlvbihlKXt0LmFnZW50KChmdW5jdGlvbihuKXtlLm9uUmVmcmVzaCgoZnVuY3Rpb24oZSl7aWYodC5oYXNPdGhlckNvbm5lY3RlZENDUHMoKSYmInZpc2libGUiPT09ZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlJiYoZS5nZXRTdGF0dXMoKS50eXBlPT09dC5Db250YWN0U3RhdHVzVHlwZS5DT05ORUNUSU5HfHxlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0dXNUeXBlLklOQ09NSU5HKSl7dmFyIHI9ZS5pc1NvZnRwaG9uZUNhbGwoKSYmIWUuaXNJbmJvdW5kKCksbz1lLmlzU29mdHBob25lQ2FsbCgpJiZuLmdldENvbmZpZ3VyYXRpb24oKS5zb2Z0cGhvbmVBdXRvQWNjZXB0LGk9ZS5nZXRUeXBlKCk9PT10LkNvbnRhY3RUeXBlLlFVRVVFX0NBTExCQUNLOyhyfHxvfHxpKSYmdC5jb3JlLnRyaWdnZXJSZWFkeVRvU3RhcnRTZXNzaW9uRXZlbnQoKX19KSl9KSl9KSkpfXQuYWdlbnQoKGZ1bmN0aW9uKGUpe2UuaXNTb2Z0cGhvbmVFbmFibGVkKCkmJmUuZ2V0Q2hhbm5lbENvbmN1cnJlbmN5KHQuQ2hhbm5lbFR5cGUuVk9JQ0UpJiZ0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkV2ZW50VHlwZS5NVVRFfSl9KSl9LHQuY29yZS50cmlnZ2VyUmVhZHlUb1N0YXJ0U2Vzc2lvbkV2ZW50PWZ1bmN0aW9uKCl7dmFyIGU9dC5jb3JlLnNvZnRwaG9uZVBhcmFtcyYmdC5jb3JlLnNvZnRwaG9uZVBhcmFtcy5hbGxvd0ZyYW1lZFNvZnRwaG9uZTt0LmlzQ0NQKCk/ZT90LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuQ29ubmVjdGlvbkV2ZW50cy5SRUFEWV9UT19TVEFSVF9TRVNTSU9OKTp0LmlzRnJhbWVkKCk/dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZERvd25zdHJlYW0odC5Db25uZWN0aW9uRXZlbnRzLlJFQURZX1RPX1NUQVJUX1NFU1NJT04pOnQuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5Db25uZWN0aW9uRXZlbnRzLlJFQURZX1RPX1NUQVJUX1NFU1NJT04pOmU/dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuQ29ubmVjdGlvbkV2ZW50cy5SRUFEWV9UT19TVEFSVF9TRVNTSU9OKTp0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuQ29ubmVjdGlvbkV2ZW50cy5SRUFEWV9UT19TVEFSVF9TRVNTSU9OKX0sdC5jb3JlLmluaXRQYWdlT3B0aW9ucz1mdW5jdGlvbihlKXtpZih0LmFzc2VydE5vdE51bGwoZSwicGFyYW1zIiksdC5pc0ZyYW1lZCgpKXt2YXIgbj10LmNvcmUuZ2V0RXZlbnRCdXMoKTtuLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5DT05GSUdVUkUsKGZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29uZmlndXJhdGlvbkV2ZW50cy5DT05GSUdVUkUsZGF0YTplfSl9KSksbi5zdWJzY3JpYmUodC5FdmVudFR5cGUuTUVESUFfREVWSUNFX1JFUVVFU1QsKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5NRURJQV9ERVZJQ0VfUkVTUE9OU0UsZSl9bmF2aWdhdG9yJiZuYXZpZ2F0b3IubWVkaWFEZXZpY2VzP25hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpLnRoZW4oKGZ1bmN0aW9uKHQpe2RldmljZXM9dHx8W10sZGV2aWNlcz1kZXZpY2VzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9KU09OKCl9KSksZShkZXZpY2VzKX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7ZSh7ZXJyb3I6dC5tZXNzYWdlfSl9KSk6ZSh7ZXJyb3I6Ik5vIG5hdmlnYXRvciBvciBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzIG9iamVjdCBmb3VuZCJ9KX0pKX19LHQuY29yZS5pbml0QXBpUHJveHlTZXJ2aWNlPWZ1bmN0aW9uKCl7dC5jb3JlLmFwaVByb3h5Q2xpZW50PW5ldyB0LkFwaVByb3h5Q2xpZW50LHQuaXNGcmFtZWQoKSYmKHQuY29yZS5oYW5kbGVBcGlQcm94eVJlcXVlc3Q9ZnVuY3Rpb24oZSl7ZT8ubWV0aG9kJiZ0LmNvcmUuZ2V0QXBpUHJveHlDbGllbnQoKS5jYWxsKGUubWV0aG9kLGUucGFyYW1zLHtzdWNjZXNzOmZ1bmN0aW9uKG4pe2NvbnN0IHI9e2RhdGE6bixyZXF1ZXN0SWQ6ZS5yZXF1ZXN0SWR9O3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFQSV9SRVNQT05TRSxyKX0sZmFpbHVyZTpmdW5jdGlvbihuKXtjb25zdCByPXtlcnI6bixyZXF1ZXN0SWQ6ZS5yZXF1ZXN0SWR9O3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFQSV9SRVNQT05TRSxyKX19KX0pfSx0LmNvcmUuZ2V0RnJhbWVNZWRpYURldmljZXM9ZnVuY3Rpb24oZSl7dmFyIG49bnVsbCxyPWV8fDFlMyxvPW5ldyBQcm9taXNlKChmdW5jdGlvbihlLHQpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dChuZXcgRXJyb3IoIlRpbWVvdXQgZXhjZWVkZWQiKSl9KSxyKX0pKSxpPW5ldyBQcm9taXNlKChmdW5jdGlvbihlLHIpe2lmKHQuaXNDQ1AoKSluYXZpZ2F0b3ImJm5hdmlnYXRvci5tZWRpYURldmljZXM/bmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKCkudGhlbigoZnVuY3Rpb24odCl7ZGV2aWNlcz10fHxbXSxkZXZpY2VzPWRldmljZXMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS50b0pTT04oKX0pKSxlKGRldmljZXMpfSkpOnIobmV3IEVycm9yKCJObyBuYXZpZ2F0b3Igb3IgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcyBvYmplY3QgZm91bmQiKSk7ZWxzZXt2YXIgbz10LmNvcmUuZ2V0RXZlbnRCdXMoKTtuPW8uc3Vic2NyaWJlKHQuRXZlbnRUeXBlLk1FRElBX0RFVklDRV9SRVNQT05TRSwoZnVuY3Rpb24odCl7dC5lcnJvcj9yKG5ldyBFcnJvcih0LmVycm9yKSk6ZSh0KX0pKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuTUVESUFfREVWSUNFX1JFUVVFU1QpfX0pKTtyZXR1cm4gUHJvbWlzZS5yYWNlKFtpLG9dKS5maW5hbGx5KChmdW5jdGlvbigpe24mJm4udW5zdWJzY3JpYmUoKX0pKX0sdC5jb3JlLmF1dGhvcml6ZT1mdW5jdGlvbihlKXt2YXIgbj1lO3JldHVybiBufHwobj10LmNvcmUuaXNMZWdhY3lEb21haW4oKT9zOmkpLHQuZmV0Y2gobix7Y3JlZGVudGlhbHM6ImluY2x1ZGUifSwyZTMsNSl9LHQuY29yZS52ZXJpZnlEb21haW5BY2Nlc3M9ZnVuY3Rpb24oZSxuKXtpZih0LmdldExvZygpLndhcm4oIlRoaXMgQVBJIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIHJlbGVhc2UiKSwhdC5pc0ZyYW1lZCgpKXJldHVybiBQcm9taXNlLnJlc29sdmUoKTt2YXIgcj17aGVhZGVyczp7IlgtQW16LUJlYXJlciI6ZX19LG89bnVsbDtyZXR1cm4gbz1ufHwodC5jb3JlLmlzTGVnYWN5RG9tYWluKCk/Ii9jb25uZWN0L3doaXRlbGlzdGVkLW9yaWdpbnMiOiIvd2hpdGVsaXN0ZWQtb3JpZ2lucyIpLHQuZmV0Y2gobyxyLDJlMyw1KS50aGVuKChmdW5jdGlvbihlKXt2YXIgdD1tKHdpbmRvdy5kb2N1bWVudC5yZWZlcnJlcik7cmV0dXJuIGUud2hpdGVsaXN0ZWRPcmlnaW5zLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiB0PT09bShlKX0pKT9Qcm9taXNlLnJlc29sdmUoKTpQcm9taXNlLnJlamVjdCgpfSkpfSx0LmNvcmUuaXNMZWdhY3lEb21haW49ZnVuY3Rpb24oZSl7cmV0dXJuKGU9ZXx8d2luZG93LmxvY2F0aW9uLmhyZWYpLmluY2x1ZGVzKCIuYXdzYXBwcy5jb20iKX0sdC5jb3JlLmluaXRTaGFyZWRXb3JrZXI9ZnVuY3Rpb24obil7aWYodC5jb3JlLmNoZWNrTm90SW5pdGlhbGl6ZWQoKSwhdC5jb3JlLmluaXRpYWxpemVkKXt0LmFzc2VydE5vdE51bGwobiwicGFyYW1zIik7dmFyIHI9dC5hc3NlcnROb3ROdWxsKG4uc2hhcmVkV29ya2VyVXJsLCJwYXJhbXMuc2hhcmVkV29ya2VyVXJsIiksbz10LmFzc2VydE5vdE51bGwobi5hdXRoVG9rZW4sInBhcmFtcy5hdXRoVG9rZW4iKSxhPXQuYXNzZXJ0Tm90TnVsbChuLnJlZnJlc2hUb2tlbiwicGFyYW1zLnJlZnJlc2hUb2tlbiIpLGM9dC5hc3NlcnROb3ROdWxsKG4uYXV0aFRva2VuRXhwaXJhdGlvbiwicGFyYW1zLmF1dGhUb2tlbkV4cGlyYXRpb24iKSx1PXQuYXNzZXJ0Tm90TnVsbChuLnJlZ2lvbiwicGFyYW1zLnJlZ2lvbiIpLGw9bi5lbmRwb2ludHx8bnVsbCxwPW4uYXV0aG9yaXplRW5kcG9pbnQ7cHx8KHA9dC5jb3JlLmlzTGVnYWN5RG9tYWluKCk/czppKTt2YXIgZD1uLmFnZW50QXBwRW5kcG9pbnR8fG51bGwsaD1uLnRhc2tUZW1wbGF0ZXNFbmRwb2ludHx8bnVsbCxmPW4uYXV0aENvb2tpZU5hbWV8fG51bGw7dHJ5e3QuY29yZS5ldmVudEJ1cz1uZXcgdC5FdmVudEJ1cyh7bG9nRXZlbnRzOiEwfSksdC5jb3JlLmFnZW50RGF0YVByb3ZpZGVyPW5ldyBBKHQuY29yZS5nZXRFdmVudEJ1cygpKSx0LmNvcmUubWVkaWFGYWN0b3J5PW5ldyB0Lk1lZGlhRmFjdG9yeShuKTt2YXIgZz1uZXcgU2hhcmVkV29ya2VyKHIsIkNvbm5lY3RTaGFyZWRXb3JrZXIiKSxtPW5ldyB0LkNvbmR1aXQoIkNvbm5lY3RTaGFyZWRXb3JrZXJDb25kdWl0IixuZXcgdC5Qb3J0U3RyZWFtKGcucG9ydCksbmV3IHQuV2luZG93SU9TdHJlYW0od2luZG93LHBhcmVudCkpO3QuY29yZS51cHN0cmVhbT1tLHQuY29yZS53ZWJTb2NrZXRQcm92aWRlcj1uZXcgSSxlLm9udW5sb2FkPWZ1bmN0aW9uKCl7bS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQ0xPU0UpLGcucG9ydC5jbG9zZSgpfSx0LmdldExvZygpLnNjaGVkdWxlVXBzdHJlYW1Mb2dQdXNoKG0pLHQuZ2V0TG9nKCkuc2NoZWR1bGVEb3duc3RyZWFtQ2xpZW50U2lkZUxvZ3NQdXNoKCksbS5vbkFsbFVwc3RyZWFtKHQuY29yZS5nZXRFdmVudEJ1cygpLmJyaWRnZSgpKSxtLm9uQWxsVXBzdHJlYW0obS5wYXNzRG93bnN0cmVhbSgpKSx0LmlzRnJhbWVkKCkmJihtLm9uQWxsRG93bnN0cmVhbSh0LmNvcmUuZ2V0RXZlbnRCdXMoKS5icmlkZ2UoKSksbS5vbkFsbERvd25zdHJlYW0oKGZ1bmN0aW9uKGUsbil7bj09PXQuRXZlbnRUeXBlLkFQSV9SRVFVRVNUJiZ0LmNvbnRhaW5zVmFsdWUodC5BcGlQcm94eUNsaWVudE1ldGhvZHMsZT8ubWV0aG9kKT90LmNvcmUuaGFuZGxlQXBpUHJveHlSZXF1ZXN0KGUpOm0ucGFzc1Vwc3RyZWFtKCkoZSxuKX0pKSksbS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQ09ORklHVVJFLHthdXRoVG9rZW46byxhdXRoVG9rZW5FeHBpcmF0aW9uOmMsZW5kcG9pbnQ6bCxyZWZyZXNoVG9rZW46YSxyZWdpb246dSxhdXRob3JpemVFbmRwb2ludDpwLGFnZW50QXBwRW5kcG9pbnQ6ZCx0YXNrVGVtcGxhdGVzRW5kcG9pbnQ6aCxhdXRoQ29va2llTmFtZTpmLGxvbmdQb2xsaW5nT3B0aW9uczpuLmxvbmdQb2xsaW5nT3B0aW9uc3x8dm9pZCAwfSksbS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkFDS05PV0xFREdFLChmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oIkFja25vd2xlZGdlZCBieSB0aGUgQ29ubmVjdFNoYXJlZFdvcmtlciEiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5pbml0aWFsaXplZD0hMCx0LmNvcmUuX3NldFRhYklkKCksdC5jb3JlLnBvcnRTdHJlYW1JZD1lLmlkLHRoaXMudW5zdWJzY3JpYmUoKX0pKSxtLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuTE9HLChmdW5jdGlvbihlKXtlLmxvZ2dlcklkIT09dC5nZXRMb2coKS5nZXRMb2dnZXJJZCgpJiZ0LmdldExvZygpLmFkZExvZ0VudHJ5KHQuTG9nRW50cnkuZnJvbU9iamVjdChlKSl9KSksbS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLlNFUlZFUl9CT1VORF9JTlRFUk5BTF9MT0csKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuc2VuZEludGVybmFsTG9nRW50cnlUb1NlcnZlcih0LkxvZ0VudHJ5LmZyb21PYmplY3QoZSkpfSkpLG0ub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLlNFUlZFUl9CT1VORF9JTlRFUk5BTF9MT0csKGZ1bmN0aW9uKGUpe3QuaXNGcmFtZWQoKSYmQXJyYXkuaXNBcnJheShlKSYmZS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmdldExvZygpLnNlbmRJbnRlcm5hbExvZ0VudHJ5VG9TZXJ2ZXIodC5Mb2dFbnRyeS5mcm9tT2JqZWN0KGUpKX0pKX0pKSxtLm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5MT0csKGZ1bmN0aW9uKGUpe3QuaXNGcmFtZWQoKSYmZS5sb2dnZXJJZCE9PXQuZ2V0TG9nKCkuZ2V0TG9nZ2VySWQoKSYmdC5nZXRMb2coKS5hZGRMb2dFbnRyeSh0LkxvZ0VudHJ5LmZyb21PYmplY3QoZSkpfSkpLHQuY29yZS5vbkF1dGhGYWlsKHQuaGl0Y2godC5jb3JlLHQuY29yZS5faGFuZGxlQXV0aEZhaWwsbi5sb2dpbkVuZHBvaW50fHxudWxsLHApKSx0LmNvcmUub25BdXRob3JpemVTdWNjZXNzKHQuaGl0Y2godC5jb3JlLHQuY29yZS5faGFuZGxlQXV0aG9yaXplU3VjY2VzcykpLHQuZ2V0TG9nKCkuaW5mbygiVXNlciBBZ2VudDogIituYXZpZ2F0b3IudXNlckFnZW50KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuZ2V0TG9nKCkuaW5mbygiaXNDQ1B2MjogIishMCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmdldExvZygpLmluZm8oImlzRnJhbWVkOiAiK3QuaXNGcmFtZWQoKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUudXBzdHJlYW0ub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLk9VVEVSX0NPTlRFWFRfSU5GTywoZnVuY3Rpb24oZSl7dmFyIG49ZS5zdHJlYW1zVmVyc2lvbnx8bnVsbDt0LmdldExvZygpLmluZm8oIlN0cmVhbXNKUyBWZXJzaW9uOiAiK24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5vdXRlckNvbnRleHRTdHJlYW1zVmVyc2lvbj1ufSkpLG0ub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5VUERBVEVfQ09OTkVDVEVEX0NDUFMsKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiTnVtYmVyIG9mIGNvbm5lY3RlZCBDQ1BzIHVwZGF0ZWQ6ICIrZS5sZW5ndGgpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5udW1iZXJPZkNvbm5lY3RlZENDUHM9ZS5sZW5ndGgsZVt0LmNvcmUudGFiSWRdJiYhaXNOYU4oZVt0LmNvcmUudGFiSWRdLmxlbmd0aCkmJnQubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzSW5UaGlzVGFiIT09ZVt0LmNvcmUudGFiSWRdLmxlbmd0aCYmKHQubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzSW5UaGlzVGFiPWVbdC5jb3JlLnRhYklkXS5sZW5ndGgsdC5udW1iZXJPZkNvbm5lY3RlZENDUHNJblRoaXNUYWI+MSYmdC5nZXRMb2coKS53YXJuKCJUaGVyZSBhcmUgIit0Lm51bWJlck9mQ29ubmVjdGVkQ0NQc0luVGhpc1RhYisiIGNvbm5lY3RlZCBDQ1BzIGluIHRoaXMgdGFiLiBQbGVhc2UgYWRqdXN0IHlvdXIgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgY29tcGxpY2F0aW9ucy4gSWYgeW91IGFyZSBlbWJlZGRpbmcgQ0NQLCBwbGVhc2UgZG8gc28gZXhjbHVzaXZlbHkgd2l0aCBpbml0Q0NQLiBJbml0Q0NQIHdpbGwgbm90IGxldCB5b3UgZW1iZWQgbW9yZSB0aGFuIG9uZSBDQ1AuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6IkNvbm5lY3RlZENDUFNpbmdsZVRhYkNvdW50IixkYXRhOntjb3VudDp0Lm51bWJlck9mQ29ubmVjdGVkQ0NQc0luVGhpc1RhYn19KSksZS50YWJJZCYmZS5zdHJlYW1zVGFic0Fjcm9zc0Jyb3dzZXImJnQuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuTUVUUklDUywoKCk9PnQuYWdlbnQoKCgpPT50LnB1Ymxpc2hNZXRyaWMoe25hbWU6IkNDUFRhYnNBY3Jvc3NCcm93c2VyQ291bnQiLGRhdGE6e3RhYklkOmUudGFiSWQsY291bnQ6ZS5zdHJlYW1zVGFic0Fjcm9zc0Jyb3dzZXJ9fSkpKSkpfSkpLHQuY29yZS5jbGllbnQ9bmV3IHQuVXBzdHJlYW1Db25kdWl0Q2xpZW50KG0pLHQuY29yZS5tYXN0ZXJDbGllbnQ9bmV3IHQuVXBzdHJlYW1Db25kdWl0TWFzdGVyQ2xpZW50KG0pLHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5URVJNSU5BVEUsbS5wYXNzVXBzdHJlYW0oKSksdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLlRFUk1JTkFURUQsKGZ1bmN0aW9uKCl7d2luZG93LmxvY2F0aW9uLnJlbG9hZCghMCl9KSksZy5wb3J0LnN0YXJ0KCksbS5vblVwc3RyZWFtKHQuVm9pY2VJZEV2ZW50cy5VUERBVEVfRE9NQUlOX0lELChmdW5jdGlvbihlKXtlJiZlLmRvbWFpbklkJiYodC5jb3JlLnZvaWNlSWREb21haW5JZD1lLmRvbWFpbklkKX0pKSx0LmFnZW50KChmdW5jdGlvbigpeyhuZXcgdC5Wb2ljZUlkKS5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygidm9pY2VJZCBkb21haW5JZCBzdWNjZXNzZnVsbHkgZmV0Y2hlZCBhdCBhZ2VudCBpbml0aWFsaXphdGlvbjogIitlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLmNhdGNoKChmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oInZvaWNlSWQgZG9tYWluSWQgbm90IGZldGNoZWQgYXQgYWdlbnQgaW5pdGlhbGl6YXRpb24iKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSl9KSksdC5jb3JlLmdldE5vdGlmaWNhdGlvbk1hbmFnZXIoKS5yZXF1ZXN0UGVybWlzc2lvbigpLG0ub25Eb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5JTklUX0RJU0FTVEVSX1JFQ09WRVJZLChmdW5jdGlvbihlKXt0LmNvcmUuaW5pdERpc2FzdGVyUmVjb3ZlcnkoZSl9KSl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIEFQSSBzaGFyZWQgd29ya2VyLCB3ZSdyZSBkZWFkISIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19fSx0LmNvcmUuX3NldFRhYklkPWZ1bmN0aW9uKCl7dHJ5e3QuY29yZS50YWJJZD13aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0LlNlc3Npb25TdG9yYWdlS2V5cy5UQUJfSUQpLHQuY29yZS50YWJJZHx8KHQuY29yZS50YWJJZD10LnJhbmRvbUlkKCksd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odC5TZXNzaW9uU3RvcmFnZUtleXMuVEFCX0lELHQuY29yZS50YWJJZCkpLHQuY29yZS51cHN0cmVhbS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuVEFCX0lELHt0YWJJZDp0LmNvcmUudGFiSWR9KX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJbVGFiIElkXSBUaGVyZSB3YXMgYW4gaXNzdWUgc2V0dGluZyB0aGUgdGFiIElkIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0sdC5jb3JlLmluaXRDQ1A9ZnVuY3Rpb24obixpKXtpZih0LmNvcmUuY2hlY2tOb3RJbml0aWFsaXplZCgpLCF0LmNvcmUuaW5pdGlhbGl6ZWQpe3QuZ2V0TG9nKCkuaW5mbygiSWZyYW1lIGluaXRpYWxpemF0aW9uIHN0YXJ0ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBzPURhdGUubm93KCk7dHJ5e2lmKHQuY29yZS5fZ2V0Q0NQSWZyYW1lKCkpcmV0dXJuIHZvaWQgdC5nZXRMb2coKS5lcnJvcigiQXR0ZW1wdGVkIHRvIGNhbGwgaW5pdENDUCB3aGVuIGFuIGlmcmFtZSBnZW5lcmF0ZWQgYnkgaW5pdENDUCBhbHJlYWR5IGV4aXN0cyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiRXJyb3Igd2hpbGUgY2hlY2tpbmcgaWYgaW5pdENDUCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX12YXIgcD17fTsic3RyaW5nIj09dHlwZW9mIGk/cC5jY3BVcmw9aTpwPWksdC5hc3NlcnROb3ROdWxsKG4sImNvbnRhaW5lckRpdiIpLHQuYXNzZXJ0Tm90TnVsbChwLmNjcFVybCwicGFyYW1zLmNjcFVybCIpLHAuc29mdHBob25lPy5kaXNhYmxlU3RvcmluZ1BhcmFtc0luTG9jYWxTdG9yYWdlfHwoZi5jbGVhbigpLGcuY2xlYW4oKSksdC5zdG9yYWdlQWNjZXNzLmluaXQocC5jY3BVcmwsbixwLnN0b3JhZ2VBY2Nlc3N8fHt9KTt2YXIgZD10LmNvcmUuX2NyZWF0ZUNDUElmcmFtZShuLHApLGg9bmV3IHQuSUZyYW1lQ29uZHVpdChwLmNjcFVybCx3aW5kb3csZCk7dC5jb3JlLnVwc3RyZWFtPWgsdC5jb3JlLmV2ZW50QnVzPW5ldyB0LkV2ZW50QnVzKHtsb2dFdmVudHM6ITF9KSx0LnN0b3JhZ2VBY2Nlc3MuY2FuUmVxdWVzdCgpP3Quc3RvcmFnZUFjY2Vzcy5zZXR1cFJlcXVlc3RIYW5kbGVycyh7b25HcmFudDptfSk6bSgpfWZ1bmN0aW9uIG0oKXt0LmNvcmUuYWdlbnREYXRhUHJvdmlkZXI9bmV3IEEodC5jb3JlLmdldEV2ZW50QnVzKCkpLHQuY29yZS5tZWRpYUZhY3Rvcnk9bmV3IHQuTWVkaWFGYWN0b3J5KHApLHQuY29yZS5fc2VuZElmcmFtZVN0eWxlRGF0YVVwc3RyZWFtQWZ0ZXJSZWFzb25hYmxlV2FpdFRpbWUoZCxoKSx0LmNvcmUud2ViU29ja2V0UHJvdmlkZXI9bmV3IEksaC5vbkFsbFVwc3RyZWFtKHQuY29yZS5nZXRFdmVudEJ1cygpLmJyaWRnZSgpKSx0LmNvcmUua2VlcGFsaXZlTWFuYWdlcj1uZXcgVChoLHQuY29yZS5nZXRFdmVudEJ1cygpLHAuY2NwU3luVGltZW91dHx8MWUzLHAuY2NwQWNrVGltZW91dHx8M2UzKSx0LmNvcmUuaWZyYW1lUmVmcmVzaFRpbWVvdXQ9bnVsbCx0LmNvcmUuY2NwTG9hZFRpbWVvdXRJbnN0YW5jZT1lLnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5jb3JlLmNjcExvYWRUaW1lb3V0SW5zdGFuY2U9bnVsbCx0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLkFDS19USU1FT1VUKSx0LmdldExvZygpLmluZm8oIkNDUCBMb2FkVGltZW91dCB0cmlnZ2VyZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkscC5jY3BMb2FkVGltZW91dHx8NWUzKSx0LmdldExvZygpLnNjaGVkdWxlVXBzdHJlYW1PdXRlckNvbnRleHRDQ1BMb2dzUHVzaChoKSx0LmdldExvZygpLnNjaGVkdWxlVXBzdHJlYW1PdXRlckNvbnRleHRDQ1BzZXJ2ZXJCb3VuZExvZ3NQdXNoKGgpLGgub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSwoZnVuY3Rpb24obil7aWYodC5nZXRMb2coKS5pbmZvKCJBY2tub3dsZWRnZWQgYnkgdGhlIENDUCEiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5jbGllbnQ9bmV3IHQuVXBzdHJlYW1Db25kdWl0Q2xpZW50KGgpLHQuY29yZS5tYXN0ZXJDbGllbnQ9bmV3IHQuVXBzdHJlYW1Db25kdWl0TWFzdGVyQ2xpZW50KGgpLHQuY29yZS5wb3J0U3RyZWFtSWQ9bi5pZCwocC5zb2Z0cGhvbmV8fHAuY2hhdHx8cC50YXNrfHxwLnBhZ2VPcHRpb25zfHxwLnNob3VsZEFkZE5hbWVzcGFjZVRvTG9nc3x8cC5kaXNhc3RlclJlY292ZXJ5T24pJiZoLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5DT05GSUdVUkUse3NvZnRwaG9uZTpwLnNvZnRwaG9uZSxjaGF0OnAuY2hhdCx0YXNrOnAudGFzayxwYWdlT3B0aW9uczpwLnBhZ2VPcHRpb25zLHNob3VsZEFkZE5hbWVzcGFjZVRvTG9nczpwLnNob3VsZEFkZE5hbWVzcGFjZVRvTG9ncyxkaXNhc3RlclJlY292ZXJ5T246cC5kaXNhc3RlclJlY292ZXJ5T259KSxwLmRpc2FzdGVyUmVjb3ZlcnlPbiYmKHQuY29yZS5yZWdpb249cC5yZWdpb24sdC5jb3JlLnN1cHByZXNzQ29udGFjdHM9eSx0LmNvcmUuZm9yY2VPZmZsaW5lPWZ1bmN0aW9uKGUpe2guc2VuZFVwc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5TRVRfT0ZGTElORSxlKX0saC5zZW5kVXBzdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLklOSVRfRElTQVNURVJfUkVDT1ZFUlkscCkpLHQuY29yZS5jY3BMb2FkVGltZW91dEluc3RhbmNlJiYoZS5jbGVhclRpbWVvdXQodC5jb3JlLmNjcExvYWRUaW1lb3V0SW5zdGFuY2UpLHQuY29yZS5jY3BMb2FkVGltZW91dEluc3RhbmNlPW51bGwpLGguc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLk9VVEVSX0NPTlRFWFRfSU5GTyx7c3RyZWFtc1ZlcnNpb246dC52ZXJzaW9ufSksdC5jb3JlLmtlZXBhbGl2ZU1hbmFnZXIuc3RhcnQoKSx0aGlzLnVuc3Vic2NyaWJlKCksdC5jb3JlLmluaXRpYWxpemVkPSEwLHQuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5FdmVudFR5cGUuSU5JVCkscyl7dmFyIHI9RGF0ZS5ub3coKS1zLG89dC5jb3JlLmlmcmFtZVJlZnJlc2hBdHRlbXB0fHwwO3QuZ2V0TG9nKCkuaW5mbygiSWZyYW1lIGluaXRpYWxpemF0aW9uIHN1Y2NlZWRlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5nZXRMb2coKS5pbmZvKGBJZnJhbWUgaW5pdGlhbGl6YXRpb24gdGltZSAke3J9YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmdldExvZygpLmluZm8oYElmcmFtZSByZWZyZXNoIGF0dGVtcHRzICR7b31gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHNldFRpbWVvdXQoKCgpPT57dC5wdWJsaXNoTWV0cmljKHtuYW1lOmEsZGF0YTp7Y291bnQ6b319KSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6dSxkYXRhOntjb3VudDoxfX0pLHQucHVibGlzaE1ldHJpYyh7bmFtZToiSWZyYW1lSW5pdGlhbGl6YXRpb25UaW1lIixkYXRhOntjb3VudDpyfX0pLHAuZGlzYXN0ZXJSZWNvdmVyeU9uJiYodC5wdWJsaXNoTWV0cmljKHtuYW1lOmMsZGF0YTp7Y291bnQ6b319KSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6bCxkYXRhOntjb3VudDoxfX0pLHQucHVibGlzaE1ldHJpYyh7bmFtZToiSWZyYW1lSW5pdGlhbGl6YXRpb25UaW1lRHIiLGRhdGE6e2NvdW50OnJ9fSkpLHM9bnVsbH0pLDFlMyl9fSkpLGgub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5MT0csKGZ1bmN0aW9uKGUpe2UubG9nZ2VySWQhPT10LmdldExvZygpLmdldExvZ2dlcklkKCkmJnQuZ2V0TG9nKCkuYWRkTG9nRW50cnkodC5Mb2dFbnRyeS5mcm9tT2JqZWN0KGUpKX0pKSx0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuQUNLX1RJTUVPVVQsKGZ1bmN0aW9uKCl7aWYoITEhPT1wLmxvZ2luUG9wdXApdHJ5e3ZhciBpPWZ1bmN0aW9uKG4pe3ZhciBpPSJodHRwczovL2xpbHkudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20vdGF3L2F1dGgvY29kZSI7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChpKSxuLmxvZ2luVXJsP24ubG9naW5Vcmw6bi5hbGlhcz8obG9nLndhcm4oIlRoZSBgYWxpYXNgIHBhcmFtIGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgZXhwZWN0ZWQgdG8gZnVuY3Rpb24gcHJvcGVybHkuIFBsZWFzZSB1c2UgYGNjcFVybGAgb3IgYGxvZ2luVXJsYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbWF6b24tY29ubmVjdC9hbWF6b24tY29ubmVjdC1zdHJlYW1zL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNjb25uZWN0Y29yZWluaXRjY3AgZm9yIHZhbGlkIHBhcmFtZXRlcnMuIiksci5yZXBsYWNlKCJ7YWxpYXN9IixuLmFsaWFzKS5yZXBsYWNlKCJ7Y2xpZW50X2lkfSIsbykucmVwbGFjZSgie3JlZGlyZWN0fSIsZS5lbmNvZGVVUklDb21wb25lbnQoaSkpKTpuLmNjcFVybH0ocCk7dC5nZXRMb2coKS53YXJuKCJBQ0tfVElNRU9VVCBvY2N1cnJlZCwgYXR0ZW1wdGluZyB0byBwb3AgdGhlIGxvZ2luIHBhZ2UgaWYgbm90IGFscmVhZHkgb3Blbi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5fb3BlblBvcHVwV2l0aExvY2soaSxwLmxvZ2luT3B0aW9ucyl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiQUNLX1RJTUVPVVQgb2NjdXJyZWQgYnV0IHdlIGFyZSB1bmFibGUgdG8gb3BlbiB0aGUgbG9naW4gcG9wdXAuIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWlmKG51bGw9PXQuY29yZS5pZnJhbWVSZWZyZXNoVGltZW91dCl0cnl7aC5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkFDS05PV0xFREdFLChmdW5jdGlvbigpe3RoaXMudW5zdWJzY3JpYmUoKSxlLmNsZWFyVGltZW91dCh0LmNvcmUuaWZyYW1lUmVmcmVzaFRpbWVvdXQpLHQuY29yZS5pZnJhbWVSZWZyZXNoVGltZW91dD1udWxsLChwLmxvZ2luUG9wdXBBdXRvQ2xvc2V8fHAubG9naW5PcHRpb25zJiZwLmxvZ2luT3B0aW9ucy5hdXRvQ2xvc2UpJiZ0LmNvcmUubG9naW5XaW5kb3cmJih0LmNvcmUubG9naW5XaW5kb3cuY2xvc2UoKSx0LmNvcmUubG9naW5XaW5kb3c9bnVsbCl9KSksdC5jb3JlLl9yZWZyZXNoSWZyYW1lT25UaW1lb3V0KHAsbil9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiRXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVmcmVzaGluZyBpZnJhbWUiKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSkpLHAub25WaWV3Q29udGFjdCYmdC5jb3JlLm9uVmlld0NvbnRhY3QocC5vblZpZXdDb250YWN0KSxoLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuVVBEQVRFX0NPTk5FQ1RFRF9DQ1BTLChmdW5jdGlvbihlKXt0Lm51bWJlck9mQ29ubmVjdGVkQ0NQcz1lLmxlbmd0aH0pKSxoLm9uVXBzdHJlYW0odC5Wb2ljZUlkRXZlbnRzLlVQREFURV9ET01BSU5fSUQsKGZ1bmN0aW9uKGUpe2UmJmUuZG9tYWluSWQmJih0LmNvcmUudm9pY2VJZERvbWFpbklkPWUuZG9tYWluSWQpfSkpLHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5JRlJBTUVfUkVUUklFU19FWEhBVVNURUQsKGZ1bmN0aW9uKCl7aWYocyl7dmFyIGU9dC5jb3JlLmlmcmFtZVJlZnJlc2hBdHRlbXB0LTE7dC5nZXRMb2coKS5pbmZvKCJJZnJhbWUgaW5pdGlhbGl6YXRpb24gZmFpbGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmdldExvZygpLmluZm8oIlRpbWUgYWZ0ZXIgaWZyYW1lIGluaXRpYWxpemF0aW9uIHN0YXJ0ZWQgIisoRGF0ZS5ub3coKS1zKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmdldExvZygpLmluZm8oYElmcmFtZSByZWZyZXNoIGF0dGVtcHRzICR7ZX1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQucHVibGlzaE1ldHJpYyh7bmFtZTphLGRhdGE6e2NvdW50OmV9fSksdC5wdWJsaXNoTWV0cmljKHtuYW1lOnUsZGF0YTp7Y291bnQ6MH19KSxwLmRpc2FzdGVyUmVjb3ZlcnlPbiYmKHQucHVibGlzaE1ldHJpYyh7bmFtZTpjLGRhdGE6e2NvdW50OmV9fSksdC5wdWJsaXNoTWV0cmljKHtuYW1lOmwsZGF0YTp7Y291bnQ6MH19KSkscz1udWxsfX0pKSx0LmNvcmUuc29mdHBob25lUGFyYW1zPXAuc29mdHBob25lfX0sdC5jb3JlLl9vcGVuUG9wdXBXaXRoTG9jaz1mdW5jdGlvbihlLG4pe2NvbnN0IHI9ImNvbm5lY3QtbG9naW4tcG9wdXAtbG9jayIrZTt0cnl7bmF2aWdhdG9yLmxvY2tzLnJlcXVlc3Qocix7bW9kZToiZXhjbHVzaXZlIixpZkF2YWlsYWJsZTohMH0sKGFzeW5jIHI9PntpZighcilyZXR1cm4gdm9pZCB0LmdldExvZygpLmluZm8oIlBvcHVwIGFscmVhZHkgb3BlbmVkIGJ5IGFub3RoZXIgdGFiLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dC5nZXRMb2coKS5pbmZvKCJPcGVuaW5nIHBvcHVwIHdpbmRvdyB3aXRoIHdlYmxvY2suIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUubG9naW5XaW5kb3c9dC5jb3JlLmdldFBvcHVwTWFuYWdlcigpLm9wZW4oZSx0Lk1hc3RlclRvcGljcy5MT0dJTl9QT1BVUCxuKSx0LmNvcmUuX3Nob3VsZEhvbGRQb3B1cExvY2s9ITA7Y29uc3Qgbz1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXt0LmNvcmUubG9naW5XaW5kb3cmJiF0LmNvcmUubG9naW5XaW5kb3c/LmNsb3NlZHx8KGNsZWFySW50ZXJ2YWwobyksdC5jb3JlLl9zaG91bGRIb2xkUG9wdXBMb2NrPSExLHQuZ2V0TG9nKCkuaW5mbygiQ2xlYXJlZCBjaGVjayBwb3B1cCBpbnRlcnZhbC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKX0pLDFlMyk7Zm9yKDt0LmNvcmUuX3Nob3VsZEhvbGRQb3B1cExvY2s7KWF3YWl0IG5ldyBQcm9taXNlKChlPT5zZXRUaW1lb3V0KGUsMWUzKSkpO3QuZ2V0TG9nKCkuaW5mbygiUmVsZWFzaW5nIHdlYmxvY2sgZm9yIG9wZW5pbmcgbG9naW4gcG9wdXAuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKX1jYXRjaChyKXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gdXNlIHdlYmxvY2sgdG8gb3BlbiBwb3B1cC4gWW91ciBicm93c2VyIG1heSBiZSBvdXQgb2YgZGF0ZS4iKS53aXRoRXhjZXB0aW9uKHIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmxvZ2luV2luZG93fHwodC5jb3JlLmxvZ2luV2luZG93PXQuY29yZS5nZXRQb3B1cE1hbmFnZXIoKS5vcGVuKGUsdC5NYXN0ZXJUb3BpY3MuTE9HSU5fUE9QVVAsbikpfX0sdC5jb3JlLm9uSWZyYW1lUmV0cmllc0V4aGF1c3RlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuSUZSQU1FX1JFVFJJRVNfRVhIQVVTVEVELGUpfSx0LmNvcmUuX3JlZnJlc2hJZnJhbWVPblRpbWVvdXQ9ZnVuY3Rpb24obixyKXt0LmFzc2VydE5vdE51bGwobiwiaW5pdENDUFBhcmFtcyIpLHQuYXNzZXJ0Tm90TnVsbChyLCJjb250YWluZXJEaXYiKTt2YXIgbz1uLmNjcExvYWRUaW1lb3V0P24uY2NwTG9hZFRpbWVvdXQ6bi5kaXNhc3RlclJlY292ZXJ5T24/MWU0OjVlMztlLmNsZWFyVGltZW91dCh0LmNvcmUuaWZyYW1lUmVmcmVzaFRpbWVvdXQpLHQuY29yZS5pZnJhbWVSZWZyZXNoVGltZW91dD1lLnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aWYodC5jb3JlLmlmcmFtZVJlZnJlc2hBdHRlbXB0PSh0LmNvcmUuaWZyYW1lUmVmcmVzaEF0dGVtcHR8fDApKzEsdC5jb3JlLmlmcmFtZVJlZnJlc2hBdHRlbXB0PD0xMCl7dHJ5e3ZhciBvPXQuY29yZS5fZ2V0Q0NQSWZyYW1lKCk7byYmby5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pO3ZhciBpPXQuY29yZS5fY3JlYXRlQ0NQSWZyYW1lKHIsbik7dC5jb3JlLnVwc3RyZWFtLnVwc3RyZWFtLm91dHB1dD1pLmNvbnRlbnRXaW5kb3csdC5jb3JlLl9zZW5kSWZyYW1lU3R5bGVEYXRhVXBzdHJlYW1BZnRlclJlYXNvbmFibGVXYWl0VGltZShpLHQuY29yZS51cHN0cmVhbSl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiRXJyb3Igd2hpbGUgY2hlY2tpbmcgZm9yLCBhbmQgcmVjcmVhdGluZywgdGhlIENDUCBJRnJhbWUiKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9dC5jb3JlLl9yZWZyZXNoSWZyYW1lT25UaW1lb3V0KG4scil9ZWxzZSB0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLklGUkFNRV9SRVRSSUVTX0VYSEFVU1RFRCksZS5jbGVhclRpbWVvdXQodC5jb3JlLmlmcmFtZVJlZnJlc2hUaW1lb3V0KX0pLG8pfSx0LmNvcmUuX2dldENDUElmcmFtZT1mdW5jdGlvbigpe2Zvcih2YXIgZSBvZiB3aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpKWlmKGUubmFtZT09PW4pcmV0dXJuIGU7cmV0dXJuIG51bGx9LHQuY29yZS5fY3JlYXRlQ0NQSWZyYW1lPWZ1bmN0aW9uKGUscil7dC5hc3NlcnROb3ROdWxsKHIsImluaXRDQ1BQYXJhbXMiKSx0LmFzc2VydE5vdE51bGwoZSwiY29udGFpbmVyRGl2Iik7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7cmV0dXJuIG8uc3JjPXIuY2NwVXJsLG8uYWxsb3c9Im1pY3JvcGhvbmU7IGNhbWVyYTsgYXV0b3BsYXk7IGNsaXBib2FyZC13cml0ZTsgaWRlbnRpdHktY3JlZGVudGlhbHMtZ2V0IixvLnN0eWxlPXIuc3R5bGV8fCJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlIixvLnRpdGxlPXIuaWZyYW1lVGl0bGV8fG4sby5uYW1lPW4sdC5zdG9yYWdlQWNjZXNzLmNhblJlcXVlc3QoKSYmKG8uc3JjPXQuc3RvcmFnZUFjY2Vzcy5nZXRSZXF1ZXN0U3RvcmFnZUFjY2Vzc1VybCgpLG8uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsdC5zdG9yYWdlQWNjZXNzLnJlcXVlc3QpKSxlLmFwcGVuZENoaWxkKG8pLG99LHQuY29yZS5fc2VuZElmcmFtZVN0eWxlRGF0YVVwc3RyZWFtQWZ0ZXJSZWFzb25hYmxlV2FpdFRpbWU9ZnVuY3Rpb24oZSxuKXt0LmFzc2VydE5vdE51bGwoZSwiaWZyYW1lIiksdC5hc3NlcnROb3ROdWxsKG4sImNvbmR1aXQiKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3ZhciByPXtkaXNwbGF5OndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUsbnVsbCkuZGlzcGxheSxvZmZzZXRXaWR0aDplLm9mZnNldFdpZHRoLG9mZnNldEhlaWdodDplLm9mZnNldEhlaWdodCxjbGllbnRSZWN0c0xlbmd0aDplLmdldENsaWVudFJlY3RzKCkubGVuZ3RofTtuLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5JRlJBTUVfU1RZTEUscil9KSwxZTQpfTt2YXIgVD1mdW5jdGlvbihlLHQsbixyKXt0aGlzLmNvbmR1aXQ9ZSx0aGlzLmV2ZW50QnVzPXQsdGhpcy5zeW5UaW1lb3V0PW4sdGhpcy5hY2tUaW1lb3V0PXIsdGhpcy5hY2tUaW1lcj1udWxsLHRoaXMuc3luVGltZXI9bnVsbCx0aGlzLmFja1N1Yj1udWxsfTtULnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbigpe3ZhciBuPXRoaXM7dGhpcy5jb25kdWl0LnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5TWU5DSFJPTklaRSksdGhpcy5hY2tTdWI9dGhpcy5jb25kdWl0Lm9uVXBzdHJlYW0odC5FdmVudFR5cGUuQUNLTk9XTEVER0UsKGZ1bmN0aW9uKCl7dGhpcy51bnN1YnNjcmliZSgpLGUuY2xlYXJUaW1lb3V0KG4uYWNrVGltZXIpLG4uX2RlZmVyU3RhcnQoKX0pKSx0aGlzLmFja1RpbWVyPWUuc2V0VGltZW91dCgoZnVuY3Rpb24oKXtuLmFja1N1Yi51bnN1YnNjcmliZSgpLG4uZXZlbnRCdXMudHJpZ2dlcih0LkV2ZW50VHlwZS5BQ0tfVElNRU9VVCksbi5fZGVmZXJTdGFydCgpfSksdGhpcy5hY2tUaW1lb3V0KX0sVC5wcm90b3R5cGUuX2RlZmVyU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLnN5blRpbWVyPWUuc2V0VGltZW91dCh0LmhpdGNoKHRoaXMsdGhpcy5zdGFydCksdGhpcy5zeW5UaW1lb3V0KX0sVC5wcm90b3R5cGUuZGVmZXJTdGFydD1mdW5jdGlvbigpe251bGw9PXRoaXMuc3luVGltZXImJih0aGlzLnN5blRpbWVyPWUuc2V0VGltZW91dCh0LmhpdGNoKHRoaXMsdGhpcy5zdGFydCksdGhpcy5zeW5UaW1lb3V0KSl9O3ZhciBJPWZ1bmN0aW9uKCl7dmFyIGU9e2luaXRGYWlsdXJlOm5ldyBTZXQsc3Vic2NyaXB0aW9uVXBkYXRlOm5ldyBTZXQsc3Vic2NyaXB0aW9uRmFpbHVyZTpuZXcgU2V0LHRvcGljOm5ldyBNYXAsYWxsTWVzc2FnZTpuZXcgU2V0LGNvbm5lY3Rpb25HYWluOm5ldyBTZXQsY29ubmVjdGlvbkxvc3Q6bmV3IFNldCxjb25uZWN0aW9uT3BlbjpuZXcgU2V0LGNvbm5lY3Rpb25DbG9zZTpuZXcgU2V0fSxuPWZ1bmN0aW9uKGUsdCl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXtlKHQpfSkpfTt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLklOSVRfRkFJTFVSRSwoZnVuY3Rpb24oKXtuKGUuaW5pdEZhaWx1cmUpfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQ09OTkVDVElPTl9PUEVOLChmdW5jdGlvbih0KXtuKGUuY29ubmVjdGlvbk9wZW4sdCl9KSksdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5DT05ORUNUSU9OX0NMT1NFLChmdW5jdGlvbih0KXtuKGUuY29ubmVjdGlvbkNsb3NlLHQpfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQ09OTkVDVElPTl9HQUlOLChmdW5jdGlvbigpe24oZS5jb25uZWN0aW9uR2Fpbil9KSksdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5DT05ORUNUSU9OX0xPU1QsKGZ1bmN0aW9uKHQpe24oZS5jb25uZWN0aW9uTG9zdCx0KX0pKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLlNVQlNDUklQVElPTl9VUERBVEUsKGZ1bmN0aW9uKHQpe24oZS5zdWJzY3JpcHRpb25VcGRhdGUsdCl9KSksdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5TVUJTQ1JJUFRJT05fRkFJTFVSRSwoZnVuY3Rpb24odCl7bihlLnN1YnNjcmlwdGlvbkZhaWx1cmUsdCl9KSksdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5BTExfTUVTU0FHRSwoZnVuY3Rpb24odCl7bihlLmFsbE1lc3NhZ2UsdCksZS50b3BpYy5oYXModC50b3BpYykmJm4oZS50b3BpYy5nZXQodC50b3BpYyksdCl9KSksdGhpcy5zZW5kTWVzc2FnZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuU0VORCxlKX0sdGhpcy5vbkluaXRGYWlsdXJlPWZ1bmN0aW9uKG4pe3JldHVybiB0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5pbml0RmFpbHVyZS5hZGQobiksZnVuY3Rpb24oKXtyZXR1cm4gZS5pbml0RmFpbHVyZS5kZWxldGUobil9fSx0aGlzLm9uQ29ubmVjdGlvbk9wZW49ZnVuY3Rpb24obil7cmV0dXJuIHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksIm1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24iKSxlLmNvbm5lY3Rpb25PcGVuLmFkZChuKSxmdW5jdGlvbigpe3JldHVybiBlLmNvbm5lY3Rpb25PcGVuLmRlbGV0ZShuKX19LHRoaXMub25Db25uZWN0aW9uQ2xvc2U9ZnVuY3Rpb24obil7cmV0dXJuIHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksIm1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24iKSxlLmNvbm5lY3Rpb25DbG9zZS5hZGQobiksZnVuY3Rpb24oKXtyZXR1cm4gZS5jb25uZWN0aW9uQ2xvc2UuZGVsZXRlKG4pfX0sdGhpcy5vbkNvbm5lY3Rpb25HYWluPWZ1bmN0aW9uKG4pe3JldHVybiB0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5jb25uZWN0aW9uR2Fpbi5hZGQobiksZnVuY3Rpb24oKXtyZXR1cm4gZS5jb25uZWN0aW9uR2Fpbi5kZWxldGUobil9fSx0aGlzLm9uQ29ubmVjdGlvbkxvc3Q9ZnVuY3Rpb24obil7cmV0dXJuIHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksIm1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24iKSxlLmNvbm5lY3Rpb25Mb3N0LmFkZChuKSxmdW5jdGlvbigpe3JldHVybiBlLmNvbm5lY3Rpb25Mb3N0LmRlbGV0ZShuKX19LHRoaXMub25TdWJzY3JpcHRpb25VcGRhdGU9ZnVuY3Rpb24obil7cmV0dXJuIHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksIm1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24iKSxlLnN1YnNjcmlwdGlvblVwZGF0ZS5hZGQobiksZnVuY3Rpb24oKXtyZXR1cm4gZS5zdWJzY3JpcHRpb25VcGRhdGUuZGVsZXRlKG4pfX0sdGhpcy5vblN1YnNjcmlwdGlvbkZhaWx1cmU9ZnVuY3Rpb24obil7cmV0dXJuIHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksIm1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24iKSxlLnN1YnNjcmlwdGlvbkZhaWx1cmUuYWRkKG4pLGZ1bmN0aW9uKCl7cmV0dXJuIGUuc3Vic2NyaXB0aW9uRmFpbHVyZS5kZWxldGUobil9fSx0aGlzLnN1YnNjcmliZVRvcGljcz1mdW5jdGlvbihlKXt0LmFzc2VydE5vdE51bGwoZSwidG9waWNzIiksdC5hc3NlcnRUcnVlKHQuaXNBcnJheShlKSwidG9waWNzIG11c3QgYmUgYSBhcnJheSIpLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5TVUJTQ1JJQkUsZSl9LHRoaXMub25NZXNzYWdlPWZ1bmN0aW9uKG4scil7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChuLCJ0b3BpY05hbWUiKSx0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKHIpLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS50b3BpYy5oYXMobik/ZS50b3BpYy5nZXQobikuYWRkKHIpOmUudG9waWMuc2V0KG4sbmV3IFNldChbcl0pKSxmdW5jdGlvbigpe3JldHVybiBlLnRvcGljLmdldChuKS5kZWxldGUocil9fSx0aGlzLm9uQWxsTWVzc2FnZT1mdW5jdGlvbihuKXtyZXR1cm4gdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUuYWxsTWVzc2FnZS5hZGQobiksZnVuY3Rpb24oKXtyZXR1cm4gZS5hbGxNZXNzYWdlLmRlbGV0ZShuKX19fSxBPWZ1bmN0aW9uKGUpe3RoaXMuYnVzPWUsdGhpcy5idXMuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuVVBEQVRFLHQuaGl0Y2godGhpcyx0aGlzLnVwZGF0ZUFnZW50RGF0YSkpfTtBLnByb3RvdHlwZS51cGRhdGVBZ2VudERhdGE9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5hZ2VudERhdGE7dGhpcy5hZ2VudERhdGE9ZTt0cnl7Y29uc3Qgcj1EYXRlLnBhcnNlKGUuc25hcHNob3Quc25hcHNob3RUaW1lc3RhbXApO2lmKCFufHxyIT09RGF0ZS5wYXJzZShuLnNuYXBzaG90LnNuYXBzaG90VGltZXN0YW1wKSl7Y29uc3Qgbj0obmV3IERhdGUpLmdldFRpbWUoKS1yO18oIlNuYXBzaG90UmVjZWl2ZWRCeUNsaWVudCIsbix7Q29udGVudExlbmd0aEluQnl0ZXM6dC5jb3JlLl9jYWxjdWxhdGVTbmFwc2hvdFNpemluZ0J1Y2tldChlLnNuYXBzaG90KSxJc0NDUExheWVyOnQuaXNDQ1AoKX0pfX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJbTWV0cmljc10gRmFpbGVkIHRvIHNlbmQgbWV0cmljcy4iKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9bnVsbD09biYmKHQuYWdlbnQuaW5pdGlhbGl6ZWQ9ITAsdGhpcy5idXMudHJpZ2dlcih0LkFnZW50RXZlbnRzLklOSVQsbmV3IHQuQWdlbnQpKSx0aGlzLmJ1cy50cmlnZ2VyKHQuQWdlbnRFdmVudHMuUkVGUkVTSCxuZXcgdC5BZ2VudCksdGhpcy5fZmlyZUFnZW50VXBkYXRlRXZlbnRzKG4pfSxBLnByb3RvdHlwZS5nZXRBZ2VudERhdGE9ZnVuY3Rpb24oKXtpZihudWxsPT10aGlzLmFnZW50RGF0YSl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJObyBhZ2VudCBkYXRhIGlzIGF2YWlsYWJsZSB5ZXQhIik7cmV0dXJuIHRoaXMuYWdlbnREYXRhfSxBLnByb3RvdHlwZS5nZXRDb250YWN0RGF0YT1mdW5jdGlvbihlKXt2YXIgbj10aGlzLmdldEFnZW50RGF0YSgpLHI9dC5maW5kKG4uc25hcHNob3QuY29udGFjdHMsKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNvbnRhY3RJZD09PWV9KSk7aWYobnVsbD09cil0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJDb250YWN0ICVzIG5vIGxvbmdlciBleGlzdHMuIixlKTtyZXR1cm4gcn0sQS5wcm90b3R5cGUuZ2V0Q29ubmVjdGlvbkRhdGE9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzLmdldENvbnRhY3REYXRhKGUpLG89dC5maW5kKHIuY29ubmVjdGlvbnMsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNvbm5lY3Rpb25JZD09PW59KSk7aWYobnVsbD09byl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJDb25uZWN0aW9uICVzIGZvciBjb250YWN0ICVzIG5vIGxvbmdlciBleGlzdHMuIixuLGUpO3JldHVybiBvfSxBLnByb3RvdHlwZS5nZXRJbnN0YW5jZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0QWdlbnREYXRhKCkuY29uZmlndXJhdGlvbi5yb3V0aW5nUHJvZmlsZS5yb3V0aW5nUHJvZmlsZUlkLm1hdGNoKC9pbnN0YW5jZVwvKFswLTlhLWZBLUZ8LV0rKVwvLylbMV19LEEucHJvdG90eXBlLmdldEFXU0FjY291bnRJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEFnZW50RGF0YSgpLmNvbmZpZ3VyYXRpb24ucm91dGluZ1Byb2ZpbGUucm91dGluZ1Byb2ZpbGVJZC5tYXRjaCgvOihbMC05XSspOmluc3RhbmNlLylbMV19LEEucHJvdG90eXBlLl9kaWZmQ29udGFjdHM9ZnVuY3Rpb24oZSl7dmFyIG49e2FkZGVkOnt9LHJlbW92ZWQ6e30sY29tbW9uOnt9LG9sZE1hcDp0LmluZGV4KG51bGw9PWU/W106ZS5zbmFwc2hvdC5jb250YWN0cywoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29udGFjdElkfSkpLG5ld01hcDp0LmluZGV4KHRoaXMuYWdlbnREYXRhLnNuYXBzaG90LmNvbnRhY3RzLChmdW5jdGlvbihlKXtyZXR1cm4gZS5jb250YWN0SWR9KSksZW5kVGltZTowfTtyZXR1cm4gdC5rZXlzKG4ub2xkTWFwKS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmNvbnRhaW5zKG4ubmV3TWFwLGUpP24uY29tbW9uW2VdPW4ubmV3TWFwW2VdOm4ucmVtb3ZlZFtlXT1uLm9sZE1hcFtlXX0pKSx0LmtleXMobi5uZXdNYXApLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuY29udGFpbnMobi5vbGRNYXAsZSl8fChuLmFkZGVkW2VdPW4ubmV3TWFwW2VdKX0pKSxuLmVuZFRpbWU9cGVyZm9ybWFuY2Uubm93KCksbn0sQS5wcm90b3R5cGUuX2ZpcmVBZ2VudFVwZGF0ZUV2ZW50cz1mdW5jdGlvbihlKXt2YXIgbj10aGlzLHI9bnVsbCxvPW51bGw9PWU/dC5BZ2VudEF2YWlsU3RhdGVzLklOSVQ6ZS5zbmFwc2hvdC5zdGF0ZS5uYW1lLGk9dGhpcy5hZ2VudERhdGEuc25hcHNob3Quc3RhdGUubmFtZSxzPW51bGw9PWU/dC5BZ2VudFN0YXRlVHlwZS5JTklUOmUuc25hcHNob3Quc3RhdGUudHlwZSxhPXRoaXMuYWdlbnREYXRhLnNuYXBzaG90LnN0YXRlLnR5cGU7cyE9PWEmJnQuY29yZS5nZXRBZ2VudFJvdXRpbmdFdmVudEdyYXBoKCkuZ2V0QXNzb2NpYXRpb25zKHRoaXMscyxhKS5mb3JFYWNoKChmdW5jdGlvbihlKXtuLmJ1cy50cmlnZ2VyKGUsbmV3IHQuQWdlbnQpfSkpLG8hPT1pJiYodGhpcy5idXMudHJpZ2dlcih0LkFnZW50RXZlbnRzLlNUQVRFX0NIQU5HRSx7YWdlbnQ6bmV3IHQuQWdlbnQsb2xkU3RhdGU6byxuZXdTdGF0ZTppfSksdC5jb3JlLmdldEFnZW50U3RhdGVFdmVudEdyYXBoKCkuZ2V0QXNzb2NpYXRpb25zKHRoaXMsbyxpKS5mb3JFYWNoKChmdW5jdGlvbihlKXtuLmJ1cy50cmlnZ2VyKGUsbmV3IHQuQWdlbnQpfSkpKTt2YXIgYz1lJiZlLnNuYXBzaG90Lm5leHRTdGF0ZT9lLnNuYXBzaG90Lm5leHRTdGF0ZS5uYW1lOm51bGwsdT10aGlzLmFnZW50RGF0YS5zbmFwc2hvdC5uZXh0U3RhdGU/dGhpcy5hZ2VudERhdGEuc25hcHNob3QubmV4dFN0YXRlLm5hbWU6bnVsbDtjIT09dSYmdSYmbi5idXMudHJpZ2dlcih0LkFnZW50RXZlbnRzLkVOUVVFVUVEX05FWFRfU1RBVEUsbmV3IHQuQWdlbnQpO2NvbnN0IGw9cGVyZm9ybWFuY2Uubm93KCk7cj1udWxsIT09ZT90aGlzLl9kaWZmQ29udGFjdHMoZSk6e2FkZGVkOnQuaW5kZXgodGhpcy5hZ2VudERhdGEuc25hcHNob3QuY29udGFjdHMsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNvbnRhY3RJZH0pKSxyZW1vdmVkOnt9LGNvbW1vbjp7fSxvbGRNYXA6e30sbmV3TWFwOnQuaW5kZXgodGhpcy5hZ2VudERhdGEuc25hcHNob3QuY29udGFjdHMsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNvbnRhY3RJZH0pKSxlbmRUaW1lOnBlcmZvcm1hbmNlLm5vdygpfTtjb25zdCBwPXBlcmZvcm1hbmNlLm5vdygpO3QudmFsdWVzKHIuYWRkZWQpLmZvckVhY2goKGZ1bmN0aW9uKGUpe24uYnVzLnRyaWdnZXIodC5Db250YWN0RXZlbnRzLklOSVQsbmV3IHQuQ29udGFjdChlLmNvbnRhY3RJZCkpLG4uX2ZpcmVDb250YWN0VXBkYXRlRXZlbnRzKGUuY29udGFjdElkLHQuQ29udGFjdFN0YXRlVHlwZS5JTklULGUuc3RhdGUudHlwZSl9KSksdC52YWx1ZXMoci5yZW1vdmVkKS5mb3JFYWNoKChmdW5jdGlvbihlKXtuLmJ1cy50cmlnZ2VyKHQuQ29udGFjdEV2ZW50cy5ERVNUUk9ZRUQsbmV3IHQuQ29udGFjdFNuYXBzaG90KGUpKSxuLmJ1cy50cmlnZ2VyKHQuY29yZS5nZXRDb250YWN0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5ERVNUUk9ZRUQsZS5jb250YWN0SWQpLG5ldyB0LkNvbnRhY3RTbmFwc2hvdChlKSksbi5fdW5zdWJBbGxDb250YWN0RXZlbnRzRm9yQ29udGFjdChlLmNvbnRhY3RJZCl9KSksdC5rZXlzKHIuY29tbW9uKS5mb3JFYWNoKChmdW5jdGlvbihlKXtuLl9maXJlQ29udGFjdFVwZGF0ZUV2ZW50cyhlLHIub2xkTWFwW2VdLnN0YXRlLnR5cGUsci5uZXdNYXBbZV0uc3RhdGUudHlwZSl9KSk7Y29uc3QgZD1wZXJmb3JtYW5jZS5ub3coKSxoPXtDb250ZW50TGVuZ3RoSW5CeXRlczp0LmNvcmUuX2NhbGN1bGF0ZVNuYXBzaG90U2l6aW5nQnVja2V0KHRoaXMuYWdlbnREYXRhLnNuYXBzaG90KSxJc0NDUExheWVyOnQuaXNDQ1AoKX07dHJ5e18oIlNuYXBzaG90Q29tcGFyaXNvblN0ZXBUaW1lIixyLmVuZFRpbWUtbCxoKSxfKCJTbmFwc2hvdEV2ZW50VHJpZ2dlclN0ZXBUaW1lIixkLXAsaCksXygiU25hcHNob3RUb3RhbFByb2Nlc3NpbmdUaW1lIixkLWwsaCl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiW01ldHJpY3NdIEZhaWxlZCB0byBzZW5kIG1ldHJpY3MuIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX07bGV0IF89KGUsbixyKT0+e3QucHVibGlzaE1ldHJpYyh7bmFtZTplLGRhdGE6e2xhdGVuY3k6bixvcHRpb25hbERpbWVuc2lvbnM6cn19KX07dC5jb3JlLl9jYWxjdWxhdGVTbmFwc2hvdFNpemluZ0J1Y2tldD1mdW5jdGlvbihlKXtpZihlJiZlLmhhc093blByb3BlcnR5KCJjb250ZW50TGVuZ3RoIikpe2NvbnN0IHQ9cGFyc2VJbnQoZS5jb250ZW50TGVuZ3RoKTtmb3IoY29uc3QgZSBvZiBPYmplY3Qua2V5cyhkKSl7Y29uc3RbbixyXT1kW2VdO2lmKHQ+PW4mJnQ8PXIpcmV0dXJuIGV9fXJldHVybiJ1bmRlZmluZWQifSxBLnByb3RvdHlwZS5fZmlyZUNvbnRhY3RVcGRhdGVFdmVudHM9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXRoaXM7biE9PXImJnQuY29yZS5nZXRDb250YWN0RXZlbnRHcmFwaCgpLmdldEFzc29jaWF0aW9ucyh0aGlzLG4scikuZm9yRWFjaCgoZnVuY3Rpb24obil7by5idXMudHJpZ2dlcihuLG5ldyB0LkNvbnRhY3QoZSkpLG8uYnVzLnRyaWdnZXIodC5jb3JlLmdldENvbnRhY3RFdmVudE5hbWUobixlKSxuZXcgdC5Db250YWN0KGUpKX0pKSxvLmJ1cy50cmlnZ2VyKHQuQ29udGFjdEV2ZW50cy5SRUZSRVNILG5ldyB0LkNvbnRhY3QoZSkpLG8uYnVzLnRyaWdnZXIodC5jb3JlLmdldENvbnRhY3RFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLlJFRlJFU0gsZSksbmV3IHQuQ29udGFjdChlKSl9LEEucHJvdG90eXBlLl91bnN1YkFsbENvbnRhY3RFdmVudHNGb3JDb250YWN0PWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7dC52YWx1ZXModC5Db250YWN0RXZlbnRzKS5mb3JFYWNoKChmdW5jdGlvbihyKXtuLmJ1cy5nZXRTdWJzY3JpcHRpb25zKHQuY29yZS5nZXRDb250YWN0RXZlbnROYW1lKHIsZSkpLm1hcCgoZnVuY3Rpb24oZSl7ZS51bnN1YnNjcmliZSgpfSkpfSkpfSx0LmNvcmUub25WaWV3Q29udGFjdD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuQ29udGFjdEV2ZW50cy5WSUVXLGUpfSx0LmNvcmUudmlld0NvbnRhY3Q9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db250YWN0RXZlbnRzLlZJRVcsZGF0YTp7Y29udGFjdElkOmV9fSl9LHQuY29yZS5vbkFjdGl2YXRlQ2hhbm5lbFdpdGhWaWV3VHlwZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuQ2hhbm5lbFZpZXdFdmVudHMuQUNUSVZBVEVfQ0hBTk5FTF9XSVRIX1ZJRVdfVFlQRSxlKX0sdC5jb3JlLmFjdGl2YXRlQ2hhbm5lbFdpdGhWaWV3VHlwZT1mdW5jdGlvbihlLG4scixvKXtjb25zdCBpPXt2aWV3VHlwZTplLG1lZGlhVHlwZTpufTtyJiYoaS5zb3VyY2U9ciksbyYmKGkuY2FzZUlkPW8pLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ2hhbm5lbFZpZXdFdmVudHMuQUNUSVZBVEVfQ0hBTk5FTF9XSVRIX1ZJRVdfVFlQRSxkYXRhOml9KX0sdC5jb3JlLnRyaWdnZXJUYXNrQ3JlYXRlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS51cHN0cmVhbUJ1cy50cmlnZ2VyKHQuVGFza0V2ZW50cy5DUkVBVEVELGUpfSx0LmNvcmUub25BY2Nlc3NEZW5pZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5BQ0NFU1NfREVOSUVELGUpfSx0LmNvcmUub25BdXRoRmFpbD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkFVVEhfRkFJTCxlKX0sdC5jb3JlLm9uQXV0aG9yaXplU3VjY2Vzcz1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkFVVEhPUklaRV9TVUNDRVNTLGUpfSx0LmNvcmUuX2hhbmRsZUF1dGhvcml6ZVN1Y2Nlc3M9ZnVuY3Rpb24oKXt3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0LlNlc3Npb25TdG9yYWdlS2V5cy5BVVRIT1JJWkVfUkVUUllfQ09VTlQsMCl9LHQuY29yZS5faGFuZGxlQXV0aEZhaWw9ZnVuY3Rpb24oZSxuLHIpe3ImJnIuYXV0aG9yaXplP3QuY29yZS5faGFuZGxlQXV0aG9yaXplRmFpbChlKTp0LmNvcmUuX2hhbmRsZUNUSUF1dGhGYWlsKG4pfSx0LmNvcmUuX2hhbmRsZUF1dGhvcml6ZUZhaWw9ZnVuY3Rpb24oZSl7bGV0IG49dC5jb3JlLl9nZXRBdXRoUmV0cnlDb3VudCgpO2lmKCF0LmNvcmUuYXV0aG9yaXplVGltZW91dElkKWlmKG48dC5jb3JlLk1BWF9BVVRIT1JJWkVfUkVUUllfQ09VTlRfRk9SX1NFU1NJT04pe3QuY29yZS5faW5jcmVtZW50QXV0aFJldHJ5Q291bnQoKTtsZXQgcj1BV1MudXRpbC5jYWxjdWxhdGVSZXRyeURlbGF5KG4rMXx8MCx7YmFzZToyZTN9KTt0LmNvcmUuYXV0aG9yaXplVGltZW91dElkPXNldFRpbWVvdXQoKCgpPT57dC5jb3JlLl9yZWRpcmVjdFRvTG9naW4oZSl9KSxyKX1lbHNlIHQuZ2V0TG9nKCkud2FybigiV2UgaGF2ZSBleGhhdXN0ZWQgb3VyIGF1dGhvcml6YXRpb24gcmV0cmllcyBkdWUgdG8gNDAxcyBmcm9tIHRoZSBhdXRob3JpemUgYXBpLiBObyBtb3JlIHJldHJpZXMgd2lsbCBiZSBhdHRlbXB0ZWQgaW4gdGhpcyBzZXNzaW9uIHVudGlsIHRoZSBhdXRob3JpemUgYXBpIHJldHVybnMgMjAwLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcih0LkV2ZW50VHlwZS5BVVRIT1JJWkVfUkVUUklFU19FWEhBVVNURUQpfSx0LmNvcmUuX3JlZGlyZWN0VG9Mb2dpbj1mdW5jdGlvbihlKXsic3RyaW5nIj09dHlwZW9mIGU/bG9jYXRpb24uYXNzaWduKGUpOmxvY2F0aW9uLnJlbG9hZCgpfSx0LmNvcmUuX2hhbmRsZUNUSUF1dGhGYWlsPWZ1bmN0aW9uKGUpe2lmKCF0LmNvcmUuY3RpVGltZW91dElkKWlmKHQuY29yZS5jdGlBdXRoUmV0cnlDb3VudDx0LmNvcmUuTUFYX0NUSV9BVVRIX1JFVFJZX0NPVU5UKXt0LmNvcmUuY3RpQXV0aFJldHJ5Q291bnQrKztsZXQgbj1BV1MudXRpbC5jYWxjdWxhdGVSZXRyeURlbGF5KHQuY29yZS5jdGlBdXRoUmV0cnlDb3VudHx8MCx7YmFzZTo1MDB9KTt0LmNvcmUuY3RpVGltZW91dElkPXNldFRpbWVvdXQoKCgpPT57dC5jb3JlLmF1dGhvcml6ZShlKS50aGVuKHQuY29yZS5fdHJpZ2dlckF1dGhvcml6ZVN1Y2Nlc3MuYmluZCh0LmNvcmUpKS5jYXRjaCh0LmNvcmUuX3RyaWdnZXJBdXRoRmFpbC5iaW5kKHQuY29yZSx7YXV0aG9yaXplOiEwfSkpLHQuY29yZS5jdGlUaW1lb3V0SWQ9bnVsbH0pLG4pfWVsc2UgdC5nZXRMb2coKS53YXJuKCJXZSBoYXZlIGV4aGF1c3RlZCBvdXIgYXV0aG9yaXphdGlvbiByZXRyaWVzIGR1ZSB0byA0MDFzIGZyb20gdGhlIENUSSBzZXJ2aWNlLiBObyBtb3JlIHJldHJpZXMgd2lsbCBiZSBhdHRlbXB0ZWQgdW50aWwgdGhlIHBhZ2UgaXMgcmVmcmVzaGVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcih0LkV2ZW50VHlwZS5DVElfQVVUSE9SSVpFX1JFVFJJRVNfRVhIQVVTVEVEKX0sdC5jb3JlLl90cmlnZ2VyQXV0aG9yaXplU3VjY2Vzcz1mdW5jdGlvbigpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnVwc3RyZWFtQnVzLnRyaWdnZXIodC5FdmVudFR5cGUuQVVUSE9SSVpFX1NVQ0NFU1MpfSx0LmNvcmUuX3RyaWdnZXJBdXRoRmFpbD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS51cHN0cmVhbUJ1cy50cmlnZ2VyKHQuRXZlbnRUeXBlLkFVVEhfRkFJTCxlKX0sdC5jb3JlLl9nZXRBdXRoUmV0cnlDb3VudD1mdW5jdGlvbigpe2xldCBlPXdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHQuU2Vzc2lvblN0b3JhZ2VLZXlzLkFVVEhPUklaRV9SRVRSWV9DT1VOVCk7aWYobnVsbCE9PWUpe2lmKGlzTmFOKHBhcnNlSW50KGUpKSl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJUaGUgc2Vzc2lvbiBzdG9yYWdlIHZhbHVlIGZvciBhdXRoIHJldHJ5IGNvdW50IHdhcyBOYU4iKTtyZXR1cm4gcGFyc2VJbnQoZSl9cmV0dXJuIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHQuU2Vzc2lvblN0b3JhZ2VLZXlzLkFVVEhPUklaRV9SRVRSWV9DT1VOVCwwKSwwfSx0LmNvcmUuX2luY3JlbWVudEF1dGhSZXRyeUNvdW50PWZ1bmN0aW9uKCl7d2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odC5TZXNzaW9uU3RvcmFnZUtleXMuQVVUSE9SSVpFX1JFVFJZX0NPVU5ULCh0LmNvcmUuX2dldEF1dGhSZXRyeUNvdW50KCkrMSkudG9TdHJpbmcoKSl9LHQuY29yZS5vbkF1dGhvcml6ZVJldHJpZXNFeGhhdXN0ZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLkFVVEhPUklaRV9SRVRSSUVTX0VYSEFVU1RFRCxlKX0sdC5jb3JlLm9uQ1RJQXV0aG9yaXplUmV0cmllc0V4aGF1c3RlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuQ1RJX0FVVEhPUklaRV9SRVRSSUVTX0VYSEFVU1RFRCxlKX0sdC5jb3JlLm9uU29mdHBob25lU2Vzc2lvbkluaXQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkNvbm5lY3Rpb25FdmVudHMuU0VTU0lPTl9JTklULGUpfSx0LmNvcmUub25Db25maWd1cmU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkNvbmZpZ3VyYXRpb25FdmVudHMuQ09ORklHVVJFLGUpfSx0LmNvcmUub25Jbml0aWFsaXplZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuSU5JVCxlKX0sdC5jb3JlLmdldENvbnRhY3RFdmVudE5hbWU9ZnVuY3Rpb24oZSxuKXtpZih0LmFzc2VydE5vdE51bGwoZSwiZXZlbnROYW1lIiksdC5hc3NlcnROb3ROdWxsKG4sImNvbnRhY3RJZCIpLCF0LmNvbnRhaW5zKHQudmFsdWVzKHQuQ29udGFjdEV2ZW50cyksZSkpdGhyb3cgbmV3IHQuVmFsdWVFcnJvcigiJXMgaXMgbm90IGEgdmFsaWQgY29udGFjdCBldmVudC4iLGUpO3JldHVybiB0LnNwcmludGYoIiVzOjolcyIsZSxuKX0sdC5jb3JlLmdldEV2ZW50QnVzPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5ldmVudEJ1c30sdC5jb3JlLmdldFdlYlNvY2tldE1hbmFnZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLndlYlNvY2tldFByb3ZpZGVyfSx0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmFnZW50RGF0YVByb3ZpZGVyfSx0LmNvcmUuZ2V0TG9jYWxUaW1lc3RhbXA9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0QWdlbnREYXRhKCkuc25hcHNob3QubG9jYWxUaW1lc3RhbXB9LHQuY29yZS5nZXRTa2V3PWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEFnZW50RGF0YSgpLnNuYXBzaG90LnNrZXd9LHQuY29yZS5nZXRBZ2VudFJvdXRpbmdFdmVudEdyYXBoPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5hZ2VudFJvdXRpbmdFdmVudEdyYXBofSx0LmNvcmUuYWdlbnRSb3V0aW5nRXZlbnRHcmFwaD0obmV3IHQuRXZlbnRHcmFwaCkuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LkFnZW50U3RhdGVUeXBlLlJPVVRBQkxFLHQuQWdlbnRFdmVudHMuUk9VVEFCTEUpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5BZ2VudFN0YXRlVHlwZS5OT1RfUk9VVEFCTEUsdC5BZ2VudEV2ZW50cy5OT1RfUk9VVEFCTEUpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5BZ2VudFN0YXRlVHlwZS5PRkZMSU5FLHQuQWdlbnRFdmVudHMuT0ZGTElORSksdC5jb3JlLmdldEFnZW50U3RhdGVFdmVudEdyYXBoPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5hZ2VudFN0YXRlRXZlbnRHcmFwaH0sdC5jb3JlLmFnZW50U3RhdGVFdmVudEdyYXBoPShuZXcgdC5FdmVudEdyYXBoKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQudmFsdWVzKHQuQWdlbnRFcnJvclN0YXRlcyksdC5BZ2VudEV2ZW50cy5FUlJPUikuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LkFnZW50QXZhaWxTdGF0ZXMuQUZURVJfQ0FMTF9XT1JLLHQuQWdlbnRFdmVudHMuQUNXKSx0LmNvcmUuZ2V0Q29udGFjdEV2ZW50R3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmNvbnRhY3RFdmVudEdyYXBofSx0LmNvcmUuY29udGFjdEV2ZW50R3JhcGg9KG5ldyB0LkV2ZW50R3JhcGgpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5Db250YWN0U3RhdGVUeXBlLklOQ09NSU5HLHQuQ29udGFjdEV2ZW50cy5JTkNPTUlORykuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LkNvbnRhY3RTdGF0ZVR5cGUuUEVORElORyx0LkNvbnRhY3RFdmVudHMuUEVORElORykuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LkNvbnRhY3RTdGF0ZVR5cGUuQ09OTkVDVElORyx0LkNvbnRhY3RFdmVudHMuQ09OTkVDVElORykuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LkNvbnRhY3RTdGF0ZVR5cGUuQ09OTkVDVEVELHQuQ29udGFjdEV2ZW50cy5DT05ORUNURUQpLmFzc29jKHQuQ29udGFjdFN0YXRlVHlwZS5DT05ORUNUSU5HLHQuQ29udGFjdFN0YXRlVHlwZS5FUlJPUix0LkNvbnRhY3RFdmVudHMuTUlTU0VEKS5hc3NvYyh0LkNvbnRhY3RTdGF0ZVR5cGUuSU5DT01JTkcsdC5Db250YWN0U3RhdGVUeXBlLkVSUk9SLHQuQ29udGFjdEV2ZW50cy5NSVNTRUQpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5Db250YWN0U3RhdGVUeXBlLkVOREVELHQuQ29udGFjdEV2ZW50cy5BQ1cpLmFzc29jKHQudmFsdWVzKHQuQ09OVEFDVF9BQ1RJVkVfU1RBVEVTKSx0LnZhbHVlcyh0LnJlbGF0aXZlQ29tcGxlbWVudCh0LkNPTlRBQ1RfQUNUSVZFX1NUQVRFUyx0LkNvbnRhY3RTdGF0ZVR5cGUpKSx0LkNvbnRhY3RFdmVudHMuRU5ERUQpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5Db250YWN0U3RhdGVUeXBlLkVSUk9SLHQuQ29udGFjdEV2ZW50cy5FUlJPUikuYXNzb2ModC5Db250YWN0U3RhdGVUeXBlLkNPTk5FQ1RJTkcsdC5Db250YWN0U3RhdGVUeXBlLk1JU1NFRCx0LkNvbnRhY3RFdmVudHMuTUlTU0VEKS5hc3NvYyh0LkNvbnRhY3RTdGF0ZVR5cGUuSU5DT01JTkcsdC5Db250YWN0U3RhdGVUeXBlLk1JU1NFRCx0LkNvbnRhY3RFdmVudHMuTUlTU0VEKS5hc3NvYyh0LkNvbnRhY3RTdGF0ZVR5cGUuQ09OTkVDVElORyx0LkNvbnRhY3RTdGF0ZVR5cGUuUkVKRUNURUQsdC5Db250YWN0RXZlbnRzLk1JU1NFRCkuYXNzb2ModC5Db250YWN0U3RhdGVUeXBlLklOQ09NSU5HLHQuQ29udGFjdFN0YXRlVHlwZS5SRUpFQ1RFRCx0LkNvbnRhY3RFdmVudHMuTUlTU0VEKSx0LmNvcmUuZ2V0Q2xpZW50PWZ1bmN0aW9uKCl7aWYoIXQuY29yZS5jbGllbnQpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiVGhlIGNvbm5lY3QgY29yZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQhIik7cmV0dXJuIHQuY29yZS5jbGllbnR9LHQuY29yZS5jbGllbnQ9bnVsbCx0LmNvcmUuZ2V0QXBpUHJveHlDbGllbnQ9ZnVuY3Rpb24oKXtpZighdC5jb3JlLmFwaVByb3h5Q2xpZW50KXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIlRoZSBjb25uZWN0IGFwaVByb3h5IENsaWVudCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQhIik7cmV0dXJuIHQuY29yZS5hcGlQcm94eUNsaWVudH0sdC5jb3JlLmFwaVByb3h5Q2xpZW50PW51bGwsdC5jb3JlLmdldEFnZW50QXBwQ2xpZW50PWZ1bmN0aW9uKCl7aWYoIXQuY29yZS5hZ2VudEFwcENsaWVudCl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJUaGUgY29ubmVjdCBBZ2VudEFwcCBDbGllbnQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkISIpO3JldHVybiB0LmNvcmUuYWdlbnRBcHBDbGllbnR9LHQuY29yZS5hZ2VudEFwcENsaWVudD1udWxsLHQuY29yZS5nZXRUYXNrVGVtcGxhdGVzQ2xpZW50PWZ1bmN0aW9uKCl7aWYoIXQuY29yZS50YXNrVGVtcGxhdGVzQ2xpZW50KXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIlRoZSBjb25uZWN0IFRhc2tUZW1wbGF0ZXMgQ2xpZW50IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCEiKTtyZXR1cm4gdC5jb3JlLnRhc2tUZW1wbGF0ZXNDbGllbnR9LHQuY29yZS50YXNrVGVtcGxhdGVzQ2xpZW50PW51bGwsdC5jb3JlLmdldE1hc3RlckNsaWVudD1mdW5jdGlvbigpe2lmKCF0LmNvcmUubWFzdGVyQ2xpZW50KXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIlRoZSBjb25uZWN0IG1hc3RlciBjbGllbnQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkISIpO3JldHVybiB0LmNvcmUubWFzdGVyQ2xpZW50fSx0LmNvcmUubWFzdGVyQ2xpZW50PW51bGwsdC5jb3JlLmdldFNvZnRwaG9uZU1hbmFnZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXJ9LHQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyPW51bGwsdC5jb3JlLmdldE5vdGlmaWNhdGlvbk1hbmFnZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLm5vdGlmaWNhdGlvbk1hbmFnZXJ8fCh0LmNvcmUubm90aWZpY2F0aW9uTWFuYWdlcj1uZXcgdC5Ob3RpZmljYXRpb25NYW5hZ2VyKSx0LmNvcmUubm90aWZpY2F0aW9uTWFuYWdlcn0sdC5jb3JlLm5vdGlmaWNhdGlvbk1hbmFnZXI9bnVsbCx0LmNvcmUuZ2V0UG9wdXBNYW5hZ2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5wb3B1cE1hbmFnZXJ9LHQuY29yZS5wb3B1cE1hbmFnZXI9bmV3IHQuUG9wdXBNYW5hZ2VyLHQuY29yZS5nZXRVcHN0cmVhbT1mdW5jdGlvbigpe2lmKCF0LmNvcmUudXBzdHJlYW0pdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiVGhlcmUgaXMgbm8gdXBzdHJlYW0gY29uZHVpdCEiKTtyZXR1cm4gdC5jb3JlLnVwc3RyZWFtfSx0LmNvcmUudXBzdHJlYW09bnVsbCx0LmNvcmUuQWdlbnREYXRhUHJvdmlkZXI9QX0oKX0sNTkyOigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQ7dmFyIG49Ijw8YWxsPj4iLHI9dC5tYWtlRW51bShbImFja25vd2xlZGdlIiwiYWNrX3RpbWVvdXQiLCJpbml0IiwiYXBpX3JlcXVlc3QiLCJhcGlfcmVzcG9uc2UiLCJhdXRoX2ZhaWwiLCJhY2Nlc3NfZGVuaWVkIiwiY2xvc2UiLCJjb25maWd1cmUiLCJsb2ciLCJtYXN0ZXJfcmVxdWVzdCIsIm1hc3Rlcl9yZXNwb25zZSIsInN5bmNocm9uaXplIiwidGVybWluYXRlIiwidGVybWluYXRlZCIsInNlbmRfbG9ncyIsInJlbG9hZF9hZ2VudF9jb25maWd1cmF0aW9uIiwiYnJvYWRjYXN0IiwiYXBpX21ldHJpYyIsImNsaWVudF9tZXRyaWMiLCJzb2Z0cGhvbmVfc3RhdHMiLCJzb2Z0cGhvbmVfcmVwb3J0IiwiY2xpZW50X3NpZGVfbG9ncyIsInNlcnZlcl9ib3VuZF9pbnRlcm5hbF9sb2ciLCJtdXRlIiwiaWZyYW1lX3N0eWxlIiwiaWZyYW1lX3JldHJpZXNfZXhoYXVzdGVkIiwidXBkYXRlX2Nvbm5lY3RlZF9jY3BzIiwib3V0ZXJfY29udGV4dF9pbmZvIiwibWVkaWFfZGV2aWNlX3JlcXVlc3QiLCJtZWRpYV9kZXZpY2VfcmVzcG9uc2UiLCJ0YWJfaWQiLCJhdXRob3JpemVfc3VjY2VzcyIsImF1dGhvcml6ZV9yZXRyaWVzX2V4aGF1c3RlZCIsImN0aV9hdXRob3JpemVfcmV0cmllc19leGhhdXN0ZWQiLCJjbGlja19zdHJlYW1fZGF0YSIsInNldF9xdWlja19nZXRfYWdlbnRfc25hcHNob3RfZmxhZyIsImFwaV9wcm94eV9yZXF1ZXN0IiwiYXBpX3Byb3h5X3Jlc3BvbnNlIl0pLG89dC5tYWtlTmFtZXNwYWNlZEVudW0oImNvbm5lY3QiLFsibG9naW5Qb3B1cCIsInNlbmRMb2dzIiwic29mdHBob25lIiwicmluZ3RvbmUiLCJtZXRyaWNzIiwiZmFpbG92ZXIiXSksaT10Lm1ha2VOYW1lc3BhY2VkRW51bSgiYWdlbnQiLFsiaW5pdCIsInVwZGF0ZSIsInJlZnJlc2giLCJyb3V0YWJsZSIsIm5vdF9yb3V0YWJsZSIsInBlbmRpbmciLCJjb250YWN0X3BlbmRpbmciLCJvZmZsaW5lIiwiZXJyb3IiLCJzb2Z0cGhvbmVfZXJyb3IiLCJ3ZWJzb2NrZXRfY29ubmVjdGlvbl9sb3N0Iiwid2Vic29ja2V0X2Nvbm5lY3Rpb25fZ2FpbmVkIiwic3RhdGVfY2hhbmdlIiwiYWN3IiwibXV0ZV90b2dnbGUiLCJsb2NhbF9tZWRpYV9zdHJlYW1fY3JlYXRlZCIsImVucXVldWVkX25leHRfc3RhdGUiXSkscz10Lm1ha2VOYW1lc3BhY2VkRW51bSgid2ViU29ja2V0IixbImluaXRfZmFpbHVyZSIsImNvbm5lY3Rpb25fb3BlbiIsImNvbm5lY3Rpb25fY2xvc2UiLCJjb25uZWN0aW9uX2Vycm9yIiwiY29ubmVjdGlvbl9nYWluIiwiY29ubmVjdGlvbl9sb3N0Iiwic3Vic2NyaXB0aW9uX3VwZGF0ZSIsInN1YnNjcmlwdGlvbl9mYWlsdXJlIiwiYWxsX21lc3NhZ2UiLCJzZW5kIiwic3Vic2NyaWJlIl0pLGE9dC5tYWtlTmFtZXNwYWNlZEVudW0oImNvbnRhY3QiLFsiaW5pdCIsInJlZnJlc2giLCJkZXN0cm95ZWQiLCJpbmNvbWluZyIsInBlbmRpbmciLCJjb25uZWN0aW5nIiwiY29ubmVjdGVkIiwibWlzc2VkIiwiYWN3IiwidmlldyIsImVuZGVkIiwiZXJyb3IiLCJhY2NlcHRlZCJdKSxjPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJ0YXNrTGlzdCIsWyJhY3RpdmF0ZV9jaGFubmVsX3dpdGhfdmlld190eXBlIl0pLHU9dC5tYWtlTmFtZXNwYWNlZEVudW0oInRhc2siLFsiY3JlYXRlZCJdKSxsPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJjb25uZWN0aW9uIixbInNlc3Npb25faW5pdCIsInJlYWR5X3RvX3N0YXJ0X3Nlc3Npb24iXSkscD10Lm1ha2VOYW1lc3BhY2VkRW51bSgiY29uZmlndXJhdGlvbiIsWyJjb25maWd1cmUiLCJzZXRfc3BlYWtlcl9kZXZpY2UiLCJzZXRfbWljcm9waG9uZV9kZXZpY2UiLCJzZXRfcmluZ2VyX2RldmljZSIsInNwZWFrZXJfZGV2aWNlX2NoYW5nZWQiLCJtaWNyb3Bob25lX2RldmljZV9jaGFuZ2VkIiwicmluZ2VyX2RldmljZV9jaGFuZ2VkIiwiY2FtZXJhX2RldmljZV9jaGFuZ2VkIiwiYmFja2dyb3VuZF9ibHVyX2NoYW5nZWQiXSksZD10Lm1ha2VOYW1lc3BhY2VkRW51bSgiZGlzYXN0ZXJSZWNvdmVyeSIsWyJzdXBwcmVzcyIsImZvcmNlX29mZmxpbmUiLCJzZXRfb2ZmbGluZSIsImluaXRfZGlzYXN0ZXJfcmVjb3ZlcnkiLCJmYWlsb3ZlciIsImZhaWxvdmVyX3BlbmRpbmciLCJpbml0X2RyX3BvbGxpbmciXSksaD10Lm1ha2VOYW1lc3BhY2VkRW51bSgidm9pY2VJZCIsWyJ1cGRhdGVfZG9tYWluX2lkIl0pLGY9ZnVuY3Rpb24oKXt9O2YuY3JlYXRlUmVxdWVzdD1mdW5jdGlvbihlLG4scil7cmV0dXJue2V2ZW50OmUscmVxdWVzdElkOnQucmFuZG9tSWQoKSxtZXRob2Q6bixwYXJhbXM6cn19LGYuY3JlYXRlUmVzcG9uc2U9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJue2V2ZW50OmUscmVxdWVzdElkOnQucmVxdWVzdElkLGRhdGE6bixlcnI6cnx8bnVsbH19O3ZhciBnPWZ1bmN0aW9uKGUsbixyKXt0aGlzLnN1Yk1hcD1lLHRoaXMuaWQ9dC5yYW5kb21JZCgpLHRoaXMuZXZlbnROYW1lPW4sdGhpcy5mPXJ9O2cucHJvdG90eXBlLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKCl7dGhpcy5zdWJNYXAudW5zdWJzY3JpYmUodGhpcy5ldmVudE5hbWUsdGhpcy5pZCl9O3ZhciBtPWZ1bmN0aW9uKCl7dGhpcy5zdWJJZE1hcD17fSx0aGlzLnN1YkV2ZW50TmFtZU1hcD17fX07bS5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IGcodGhpcyxlLHQpO3RoaXMuc3ViSWRNYXBbbi5pZF09bjt2YXIgcj10aGlzLnN1YkV2ZW50TmFtZU1hcFtlXXx8W107cmV0dXJuIHIucHVzaChuKSx0aGlzLnN1YkV2ZW50TmFtZU1hcFtlXT1yLG59LG0ucHJvdG90eXBlLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKGUsbil7dC5jb250YWlucyh0aGlzLnN1YkV2ZW50TmFtZU1hcCxlKSYmKHRoaXMuc3ViRXZlbnROYW1lTWFwW2VdPXRoaXMuc3ViRXZlbnROYW1lTWFwW2VdLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaWQhPT1ufSkpLHRoaXMuc3ViRXZlbnROYW1lTWFwW2VdLmxlbmd0aDwxJiZkZWxldGUgdGhpcy5zdWJFdmVudE5hbWVNYXBbZV0pLHQuY29udGFpbnModGhpcy5zdWJJZE1hcCxuKSYmZGVsZXRlIHRoaXMuc3ViSWRNYXBbbl19LG0ucHJvdG90eXBlLmdldEFsbFN1YnNjcmlwdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdC52YWx1ZXModGhpcy5zdWJFdmVudE5hbWVNYXApLnJlZHVjZSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jb25jYXQodCl9KSxbXSl9LG0ucHJvdG90eXBlLmdldFN1YnNjcmlwdGlvbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc3ViRXZlbnROYW1lTWFwW2VdfHxbXX07dmFyIHY9ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8e307dGhpcy5zdWJNYXA9bmV3IG0sdGhpcy5sb2dFdmVudHM9dC5sb2dFdmVudHN8fCExfTt2LnByb3RvdHlwZS5zdWJzY3JpYmU9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKGUsImV2ZW50TmFtZSIpLHQuYXNzZXJ0Tm90TnVsbChuLCJmIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwiZiBtdXN0IGJlIGEgZnVuY3Rpb24iKSx0aGlzLnN1Yk1hcC5zdWJzY3JpYmUoZSxuKX0sdi5wcm90b3R5cGUuc3Vic2NyaWJlQWxsPWZ1bmN0aW9uKGUpe3JldHVybiB0LmFzc2VydE5vdE51bGwoZSwiZiIpLHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24oZSksImYgbXVzdCBiZSBhIGZ1bmN0aW9uIiksdGhpcy5zdWJNYXAuc3Vic2NyaWJlKG4sZSl9LHYucHJvdG90eXBlLmdldFN1YnNjcmlwdGlvbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc3ViTWFwLmdldFN1YnNjcmlwdGlvbnMoZSl9LHYucHJvdG90eXBlLnRyaWdnZXI9ZnVuY3Rpb24oZSxyKXt0LmFzc2VydE5vdE51bGwoZSwiZXZlbnROYW1lIik7dmFyIG89dGhpcyxpPXRoaXMuc3ViTWFwLmdldFN1YnNjcmlwdGlvbnMobikscz10aGlzLnN1Yk1hcC5nZXRTdWJzY3JpcHRpb25zKGUpO3RoaXMubG9nRXZlbnRzJiZlIT09dC5FdmVudFR5cGUuTE9HJiZlIT09dC5FdmVudFR5cGUuTUFTVEVSX1JFU1BPTlNFJiZlIT09dC5FdmVudFR5cGUuQVBJX01FVFJJQyYmZSE9PXQuRXZlbnRUeXBlLlNFUlZFUl9CT1VORF9JTlRFUk5BTF9MT0cmJnQuZ2V0TG9nKCkudHJhY2UoIlB1Ymxpc2hpbmcgZXZlbnQ6ICVzIixlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGUuc3RhcnRzV2l0aCh0LkNvbnRhY3RFdmVudHMuQUNDRVBURUQpJiZyJiZyLmNvbnRhY3RJZCYmIShyIGluc3RhbmNlb2YgdC5Db250YWN0KSYmKHI9bmV3IHQuQ29udGFjdChyLmNvbnRhY3RJZCkpLGkuY29uY2F0KHMpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3RyeXtuLmYocnx8bnVsbCxlLG8pfWNhdGNoKG4pe3QuZ2V0TG9nKCkuZXJyb3IoIiclcycgZXZlbnQgaGFuZGxlciBmYWlsZWQuIixlKS53aXRoRXhjZXB0aW9uKG4pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSkpfSx2LnByb3RvdHlwZS5icmlkZ2U9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiBmdW5jdGlvbih0LG4pe2UudHJpZ2dlcihuLHQpfX0sdi5wcm90b3R5cGUudW5zdWJzY3JpYmVBbGw9ZnVuY3Rpb24oKXt0aGlzLnN1Yk1hcC5nZXRBbGxTdWJzY3JpcHRpb25zKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS51bnN1YnNjcmliZSgpfSkpfSx0LkV2ZW50QnVzPXYsdC5FdmVudEZhY3Rvcnk9Zix0LkV2ZW50VHlwZT1yLHQuQWdlbnRFdmVudHM9aSx0LkNvbmZpZ3VyYXRpb25FdmVudHM9cCx0LkNvbm5lY3Rpb25FdmVudHM9bCx0LkNvbm5uZWN0aW9uRXZlbnRzPWwsdC5Db250YWN0RXZlbnRzPWEsdC5DaGFubmVsVmlld0V2ZW50cz1jLHQuVGFza0V2ZW50cz11LHQuVm9pY2VJZEV2ZW50cz1oLHQuV2ViU29ja2V0RXZlbnRzPXMsdC5NYXN0ZXJUb3BpY3M9byx0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHM9ZH0oKX0sMjg2OigpPT57IWZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Z1bmN0aW9uIG4ocil7aWYodFtyXSlyZXR1cm4gdFtyXS5leHBvcnRzO3ZhciBvPXRbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiBlW3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9bi5tPWUsbi5jPXQsbi5kPWZ1bmN0aW9uKGUsdCxyKXtuLm8oZSx0KXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxuLnI9ZnVuY3Rpb24oZSl7InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKGUsdCl7aWYoMSZ0JiYoZT1uKGUpKSw4JnQpcmV0dXJuIGU7aWYoNCZ0JiYib2JqZWN0Ij09dHlwZW9mIGUmJmUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6ZX0pLDImdCYmInN0cmluZyIhPXR5cGVvZiBlKWZvcih2YXIgbyBpbiBlKW4uZChyLG8sZnVuY3Rpb24odCl7cmV0dXJuIGVbdF19LmJpbmQobnVsbCxvKSk7cmV0dXJuIHJ9LG4ubj1mdW5jdGlvbihlKXt2YXIgdD1lJiZlLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gZS5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiBlfTtyZXR1cm4gbi5kKHQsImEiLHQpLHR9LG4ubz1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX0sbi5wPSIiLG4obi5zPTIpfShbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDEpLG89IkRFQlVHIixpPSJBTVpfV0VCX1NPQ0tFVF9NQU5BR0VSOiIscz0iTmV0d29yayBvZmZsaW5lIixhPSJOZXR3b3JrIG9ubGluZSwgY29ubmVjdGluZyB0byBXZWJTb2NrZXQgc2VydmVyIixjPSJOZXR3b3JrIG9mZmxpbmUsIGlnbm9yaW5nIHRoaXMgZ2V0V2ViU29ja2V0Q29ubkNvbmZpZyByZXF1ZXN0Iix1PSJIZWFydGJlYXQgcmVzcG9uc2Ugbm90IHJlY2VpdmVkIixsPSJGYWlsZWQgdG8gc2VuZCBoZWFydGJlYXQgc2luY2UgV2ViU29ja2V0IGlzIG5vdCBvcGVuIixwPSJXZWJTb2NrZXQgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCEiLGQ9IldlYlNvY2tldCBjb25uZWN0aW9uIGlzIGNsb3NlZCIsaD0iV2ViU29ja2V0TWFuYWdlciBFcnJvciwgZXJyb3JfZXZlbnQ6ICIsZj0iU2NoZWR1bGluZyBXZWJTb2NrZXQgcmVpbml0aWFsaXphdGlvbiwgYWZ0ZXIgZGVsYXkgIixnPSJXZWJTb2NrZXQgVVJMIGNhbm5vdCBiZSB1c2VkIHRvIGVzdGFibGlzaCBjb25uZWN0aW9uIixtPSJXZWJTb2NrZXQgSW5pdGlhbGl6YXRpb24gZmFpbGVkIC0gVGVybWluYXRpbmcgYW5kIGNsZWFuaW5nIHN1YnNjcmlwdGlvbnMiLHY9IkZldGNoaW5nIG5ldyBXZWJTb2NrZXQgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIix5PSJTdWNjZXNzZnVsbHkgZmV0Y2hlZCB3ZWJTb2NrZXQgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIixFPSJGYWlsZWQgdG8gZmV0Y2ggd2ViU29ja2V0IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbiIsUz0iUmV0cnlpbmcgZmV0Y2hpbmcgbmV3IFdlYlNvY2tldCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24iLGI9IkluaXRpYWxpemluZyBXZWJzb2NrZXQgTWFuYWdlciIsQz0iV2ViU29ja2V0TWFuYWdlciBNZXNzYWdlIEVycm9yIixUPSJNZXNzYWdlIHJlY2VpdmVkIGZvciB0b3BpYyAiLEk9IkludmFsaWQgaW5jb21pbmcgbWVzc2FnZSIsQT0iYXdzL3N1YnNjcmliZSIsXz0iYXdzL2hlYXJ0YmVhdCIsdz0iZGlzY29ubmVjdGVkIjtmdW5jdGlvbiBSKGUpe3JldHVybihSPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSkoZSl9dmFyIGs9e2Fzc2VydFRydWU6ZnVuY3Rpb24oZSx0KXtpZighZSl0aHJvdyBuZXcgRXJyb3IodCl9LGFzc2VydE5vdE51bGw6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gay5hc3NlcnRUcnVlKG51bGwhPT1lJiZ2b2lkIDAhPT1SKGUpLE9iamVjdChyLnNwcmludGYpKCIlcyBtdXN0IGJlIHByb3ZpZGVkIix0fHwiQSB2YWx1ZSIpKSxlfSxpc05vbkVtcHR5U3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmZS5sZW5ndGg+MH0sYXNzZXJ0SXNMaXN0OmZ1bmN0aW9uKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IEVycm9yKHQrIiBpcyBub3QgYW4gYXJyYXkiKX0saXNGdW5jdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4hIShlJiZlLmNvbnN0cnVjdG9yJiZlLmNhbGwmJmUuYXBwbHkpfSxpc09iamVjdDpmdW5jdGlvbihlKXtyZXR1cm4hKCJvYmplY3QiIT09UihlKXx8bnVsbD09PWUpfSxpc1N0cmluZzpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV9LGlzTnVtYmVyOmZ1bmN0aW9uKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZX19LEw9bmV3IFJlZ0V4cCgiXih3c3M6Ly8pXFx3KiIpO2sudmFsaWRXU1VybD1mdW5jdGlvbihlKXtyZXR1cm4gTC50ZXN0KGUpfSxrLmdldFN1YnNjcmlwdGlvblJlc3BvbnNlPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm57dG9waWM6ZSxjb250ZW50OntzdGF0dXM6dD8ic3VjY2VzcyI6ImZhaWx1cmUiLHRvcGljczpufX19LGsuYXNzZXJ0SXNPYmplY3Q9ZnVuY3Rpb24oZSx0KXtpZighay5pc09iamVjdChlKSl0aHJvdyBuZXcgRXJyb3IodCsiIGlzIG5vdCBhbiBvYmplY3QhIil9LGsuYWRkSml0dGVyPWZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToxO3Q9TWF0aC5taW4odCwxKTt2YXIgbj1NYXRoLnJhbmRvbSgpPi41PzE6LTE7cmV0dXJuIE1hdGguZmxvb3IoZStuKmUqTWF0aC5yYW5kb20oKSp0KX0say5pc05ldHdvcmtPbmxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLm9uTGluZX0say5pc05ldHdvcmtGYWlsdXJlPWZ1bmN0aW9uKGUpe3JldHVybiEoIWUuX2RlYnVnfHwhZS5fZGVidWcudHlwZSkmJiJOZXR3b3JraW5nRXJyb3IiPT09ZS5fZGVidWcudHlwZX07dmFyIE49aztmdW5jdGlvbiBPKGUpe3JldHVybihPPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSl9KShlKX1mdW5jdGlvbiBEKGUsdCl7cmV0dXJuKEQ9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbihlLHQpe3JldHVybiBlLl9fcHJvdG9fXz10LGV9KShlLHQpfWZ1bmN0aW9uIFAoZSl7cmV0dXJuKFA9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9KShlKX1mdW5jdGlvbiB4KGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gTShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fWZ1bmN0aW9uIFUoZSx0LG4pe3JldHVybiB0JiZNKGUucHJvdG90eXBlLHQpLG4mJk0oZSxuKSxlfXZhciBGPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3godGhpcyxlKX1yZXR1cm4gVShlLFt7a2V5OiJkZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24oZSl7fX0se2tleToiaW5mbyIsdmFsdWU6ZnVuY3Rpb24oZSl7fX0se2tleToid2FybiIsdmFsdWU6ZnVuY3Rpb24oZSl7fX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKGUpe319LHtrZXk6ImFkdmFuY2VkTG9nIix2YWx1ZTpmdW5jdGlvbihlKXt9fV0pLGV9KCkscT1pLEI9e0RFQlVHOjEwLElORk86MjAsV0FSTjozMCxFUlJPUjo0MCxBRFZBTkNFRF9MT0c6NTB9LGo9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7eCh0aGlzLGUpLHRoaXMudXBkYXRlTG9nZ2VyQ29uZmlnKCksdGhpcy5jb25zb2xlTG9nZ2VyV3JhcHBlcj1HKCl9cmV0dXJuIFUoZSxbe2tleToid3JpdGVUb0NsaWVudExvZ2dlciIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtpZih0aGlzLmhhc0NsaWVudExvZ2dlcigpKXN3aXRjaChlKXtjYXNlIEIuREVCVUc6cmV0dXJuIHRoaXMuX2NsaWVudExvZ2dlci5kZWJ1Zyh0KXx8dDtjYXNlIEIuSU5GTzpyZXR1cm4gdGhpcy5fY2xpZW50TG9nZ2VyLmluZm8odCl8fHQ7Y2FzZSBCLldBUk46cmV0dXJuIHRoaXMuX2NsaWVudExvZ2dlci53YXJuKHQpfHx0O2Nhc2UgQi5FUlJPUjpyZXR1cm4gdGhpcy5fY2xpZW50TG9nZ2VyLmVycm9yKHQpfHx0O2Nhc2UgQi5BRFZBTkNFRF9MT0c6cmV0dXJuIHRoaXMuX2FkdmFuY2VkTG9nV3JpdGVyP3RoaXMuX2NsaWVudExvZ2dlclt0aGlzLl9hZHZhbmNlZExvZ1dyaXRlcl0odCl8fHQ6IiJ9fX0se2tleToiaXNMZXZlbEVuYWJsZWQiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlPj10aGlzLl9sZXZlbH19LHtrZXk6Imhhc0NsaWVudExvZ2dlciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PXRoaXMuX2NsaWVudExvZ2dlcn19LHtrZXk6ImdldExvZ2dlciIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wcmVmaXh8fHE7cmV0dXJuIHRoaXMuX2xvZ3NEZXN0aW5hdGlvbj09PW8/dGhpcy5jb25zb2xlTG9nZ2VyV3JhcHBlcjpuZXcgVyh0KX19LHtrZXk6InVwZGF0ZUxvZ2dlckNvbmZpZyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8e307dGhpcy5fbGV2ZWw9dC5sZXZlbHx8Qi5JTkZPLHRoaXMuX2FkdmFuY2VkTG9nV3JpdGVyPSJ3YXJuIix0LmFkdmFuY2VkTG9nV3JpdGVyJiYodGhpcy5fYWR2YW5jZWRMb2dXcml0ZXI9dC5hZHZhbmNlZExvZ1dyaXRlciksdC5jdXN0b21pemVkTG9nZ2VyJiYib2JqZWN0Ij09PVAodC5jdXN0b21pemVkTG9nZ2VyKSYmKHRoaXMudXNlQ2xpZW50TG9nZ2VyPSEwKSx0aGlzLl9jbGllbnRMb2dnZXI9dC5sb2dnZXJ8fHRoaXMuc2VsZWN0TG9nZ2VyKHQpLHRoaXMuX2xvZ3NEZXN0aW5hdGlvbj0iTlVMTCIsdC5kZWJ1ZyYmKHRoaXMuX2xvZ3NEZXN0aW5hdGlvbj1vKSx0LmxvZ2dlciYmKHRoaXMuX2xvZ3NEZXN0aW5hdGlvbj0iQ0xJRU5UX0xPR0dFUiIpfX0se2tleToic2VsZWN0TG9nZ2VyIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5jdXN0b21pemVkTG9nZ2VyJiYib2JqZWN0Ij09PVAoZS5jdXN0b21pemVkTG9nZ2VyKT9lLmN1c3RvbWl6ZWRMb2dnZXI6ZS51c2VEZWZhdWx0TG9nZ2VyPyh0aGlzLmNvbnNvbGVMb2dnZXJXcmFwcGVyPUcoKSx0aGlzLmNvbnNvbGVMb2dnZXJXcmFwcGVyKTpudWxsfX1dKSxlfSgpLFY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7eCh0aGlzLGUpfXJldHVybiBVKGUsW3trZXk6ImRlYnVnIix2YWx1ZTpmdW5jdGlvbigpe319LHtrZXk6ImluZm8iLHZhbHVlOmZ1bmN0aW9uKCl7fX0se2tleToid2FybiIsdmFsdWU6ZnVuY3Rpb24oKXt9fSx7a2V5OiJlcnJvciIsdmFsdWU6ZnVuY3Rpb24oKXt9fSx7a2V5OiJhZHZhbmNlZExvZyIsdmFsdWU6ZnVuY3Rpb24oKXt9fV0pLGV9KCksVz1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3ZhciBuO3JldHVybiB4KHRoaXMsdCksKG49ZnVuY3Rpb24oZSx0KXtyZXR1cm4hdHx8Im9iamVjdCIhPT1QKHQpJiYiZnVuY3Rpb24iIT10eXBlb2YgdD9mdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIGV9KGUpOnR9KHRoaXMsTyh0KS5jYWxsKHRoaXMpKSkucHJlZml4PWV8fHEsbn1yZXR1cm4gZnVuY3Rpb24oZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmRChlLHQpfSh0LFYpLFUodCxbe2tleToiZGVidWciLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuX2xvZyhCLkRFQlVHLHQpfX0se2tleToiaW5mbyIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5fbG9nKEIuSU5GTyx0KX19LHtrZXk6Indhcm4iLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuX2xvZyhCLldBUk4sdCl9fSx7a2V5OiJlcnJvciIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5fbG9nKEIuRVJST1IsdCl9fSx7a2V5OiJhZHZhbmNlZExvZyIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5fbG9nKEIuQURWQU5DRURfTE9HLHQpfX0se2tleToiX3Nob3VsZExvZyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEguaGFzQ2xpZW50TG9nZ2VyKCkmJkguaXNMZXZlbEVuYWJsZWQoZSl9fSx7a2V5OiJfd3JpdGVUb0NsaWVudExvZ2dlciIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSC53cml0ZVRvQ2xpZW50TG9nZ2VyKGUsdCl9fSx7a2V5OiJfbG9nIix2YWx1ZTpmdW5jdGlvbihlLHQpe2lmKHRoaXMuX3Nob3VsZExvZyhlKSl7dmFyIG49SC51c2VDbGllbnRMb2dnZXI/dDp0aGlzLl9jb252ZXJ0VG9TaW5nbGVTdGF0ZW1lbnQodCxlKTtyZXR1cm4gdGhpcy5fd3JpdGVUb0NsaWVudExvZ2dlcihlLG4pfX19LHtrZXk6Il9jb252ZXJ0VG9TaW5nbGVTdGF0ZW1lbnQiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IERhdGUoRGF0ZS5ub3coKSkudG9JU09TdHJpbmcoKSxyPXRoaXMuX2dldExvZ0xldmVsQnlWYWx1ZSh0KSxvPSJbIi5jb25jYXQobiwiXVsiKS5jb25jYXQociwiXSIpO3RoaXMucHJlZml4JiYobys9dGhpcy5wcmVmaXgrIiAiKSx0aGlzLm9wdGlvbnMmJih0aGlzLm9wdGlvbnMucHJlZml4P28rPSIgIit0aGlzLm9wdGlvbnMucHJlZml4KyI6IjpvKz0iIix0aGlzLm9wdGlvbnMubG9nTWV0YURhdGE/bys9IiBNZXRhIGRhdGE6ICIrSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zLmxvZ01ldGFEYXRhKTpvKz0iIik7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBzPWVbaV07bys9dGhpcy5fY29udmVydFRvU3RyaW5nKHMpKyIgIn1yZXR1cm4gb319LHtrZXk6Il9nZXRMb2dMZXZlbEJ5VmFsdWUiLHZhbHVlOmZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlIDEwOnJldHVybiJERUJVRyI7Y2FzZSAyMDpyZXR1cm4iSU5GTyI7Y2FzZSAzMDpyZXR1cm4iV0FSTiI7Y2FzZSA0MDpyZXR1cm4iRVJST1IiO2Nhc2UgNTA6cmV0dXJuIkFEVkFOQ0VEX0xPRyJ9fX0se2tleToiX2NvbnZlcnRUb1N0cmluZyIsdmFsdWU6ZnVuY3Rpb24oZSl7dHJ5e2lmKCFlKXJldHVybiIiO2lmKE4uaXNTdHJpbmcoZSkpcmV0dXJuIGU7aWYoTi5pc09iamVjdChlKSYmTi5pc0Z1bmN0aW9uKGUudG9TdHJpbmcpKXt2YXIgdD1lLnRvU3RyaW5nKCk7aWYoIltvYmplY3QgT2JqZWN0XSIhPT10KXJldHVybiB0fXJldHVybiBKU09OLnN0cmluZ2lmeShlKX1jYXRjaCh0KXtyZXR1cm4gY29uc29sZS5lcnJvcigiRXJyb3Igd2hpbGUgY29udmVydGluZyBhcmd1bWVudCB0byBzdHJpbmciLGUsdCksIiJ9fX1dKSx0fSgpLEc9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgVjtyZXR1cm4gZS5kZWJ1Zz1mdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiBjb25zb2xlLmRlYnVnLmFwcGx5KHdpbmRvdy5jb25zb2xlLFtdLmNvbmNhdCh0KSl9LGUuaW5mbz1mdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiBjb25zb2xlLmluZm8uYXBwbHkod2luZG93LmNvbnNvbGUsW10uY29uY2F0KHQpKX0sZS53YXJuPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIGNvbnNvbGUud2Fybi5hcHBseSh3aW5kb3cuY29uc29sZSxbXS5jb25jYXQodCkpfSxlLmVycm9yPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIGNvbnNvbGUuZXJyb3IuYXBwbHkod2luZG93LmNvbnNvbGUsW10uY29uY2F0KHQpKX0sZX0sSD1uZXcgajtmdW5jdGlvbiB6KGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19dmFyIEs9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToyZTM7IWZ1bmN0aW9uKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsZSksdGhpcy5udW1BdHRlbXB0cz0wLHRoaXMuZXhlY3V0b3I9dCx0aGlzLmhhc0FjdGl2ZVJlY29ubmVjdGlvbj0hMSx0aGlzLmRlZmF1bHRSZXRyeT1ufXZhciB0LG47cmV0dXJuIHQ9ZSwobj1be2tleToicmV0cnkiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmhhc0FjdGl2ZVJlY29ubmVjdGlvbnx8KHRoaXMuaGFzQWN0aXZlUmVjb25uZWN0aW9uPSEwLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZS5fZXhlY3V0ZSgpfSksdGhpcy5fZ2V0RGVsYXkoKSkpfX0se2tleToiX2V4ZWN1dGUiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5oYXNBY3RpdmVSZWNvbm5lY3Rpb249ITEsdGhpcy5leGVjdXRvcigpLHRoaXMubnVtQXR0ZW1wdHMrK319LHtrZXk6ImNvbm5lY3RlZCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLm51bUF0dGVtcHRzPTB9fSx7a2V5OiJfZ2V0RGVsYXkiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9TWF0aC5wb3coMix0aGlzLm51bUF0dGVtcHRzKSp0aGlzLmRlZmF1bHRSZXRyeTtyZXR1cm4gZTw9M2U0P2U6M2U0fX0se2tleToiZ2V0SXNDb25uZWN0ZWQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubnVtQXR0ZW1wdHN9fV0pJiZ6KHQucHJvdG90eXBlLG4pLGV9KCk7bi5kKHQsImEiLChmdW5jdGlvbigpe3JldHVybiBZfSkpO3ZhciBYPWZ1bmN0aW9uKCl7dmFyIGU9SC5nZXRMb2dnZXIoe3ByZWZpeDppfSksdD1OLmlzTmV0d29ya09ubGluZSgpLG49e3ByaW1hcnk6bnVsbCxzZWNvbmRhcnk6bnVsbH0scj17cmVjb25uZWN0V2ViU29ja2V0OiEwLHdlYnNvY2tldEluaXRGYWlsZWQ6ITEsZXhwb25lbnRpYWxCYWNrT2ZmVGltZToxZTMsZXhwb25lbnRpYWxUaW1lb3V0SGFuZGxlOm51bGwsbGlmZVRpbWVUaW1lb3V0SGFuZGxlOm51bGwsd2ViU29ja2V0SW5pdENoZWNrZXJUaW1lb3V0SWQ6bnVsbCxjb25uU3RhdGU6bnVsbH0sbz17Y29ubmVjdFdlYlNvY2tldFJldHJ5Q291bnQ6MCxjb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZTpudWxsLG5vT3BlbkNvbm5lY3Rpb25zVGltZXN0YW1wOm51bGx9LFI9e3BlbmRpbmdSZXNwb25zZTohMSxpbnRlcnZhbEhhbmRsZTpudWxsfSxrPXtpbml0RmFpbHVyZTpuZXcgU2V0LGdldFdlYlNvY2tldFRyYW5zcG9ydDpudWxsLHN1YnNjcmlwdGlvblVwZGF0ZTpuZXcgU2V0LHN1YnNjcmlwdGlvbkZhaWx1cmU6bmV3IFNldCx0b3BpYzpuZXcgTWFwLGFsbE1lc3NhZ2U6bmV3IFNldCxjb25uZWN0aW9uR2FpbjpuZXcgU2V0LGNvbm5lY3Rpb25Mb3N0Om5ldyBTZXQsY29ubmVjdGlvbk9wZW46bmV3IFNldCxjb25uZWN0aW9uQ2xvc2U6bmV3IFNldH0sTD17Y29ubkNvbmZpZzpudWxsLHByb21pc2VIYW5kbGU6bnVsbCxwcm9taXNlQ29tcGxldGVkOiEwfSxPPXtzdWJzY3JpYmVkOm5ldyBTZXQscGVuZGluZzpuZXcgU2V0LHN1YnNjcmlwdGlvbkhpc3Rvcnk6bmV3IFNldH0sRD17cmVzcG9uc2VDaGVja0ludGVydmFsSWQ6bnVsbCxyZXF1ZXN0Q29tcGxldGVkOiEwLHJlU3Vic2NyaWJlSW50ZXJ2YWxJZDpudWxsLGNvbnNlY3V0aXZlRmFpbGVkU3Vic2NyaWJlQXR0ZW1wdHM6MCxjb25zZWN1dGl2ZU5vUmVzcG9uc2VSZXF1ZXN0OjB9LFA9bmV3IEsoKGZ1bmN0aW9uKCl7c2UoKX0pKSx4PW5ldyBTZXQoW0EsImF3cy91bnN1YnNjcmliZSIsX10pLE09c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7aWYodCE9PU4uaXNOZXR3b3JrT25saW5lKCkpe2lmKCEodD1OLmlzTmV0d29ya09ubGluZSgpKSlyZXR1cm4gZS5hZHZhbmNlZExvZyhzKSx2b2lkIHVlKGUuaW5mbyhzKSk7dmFyIG49VygpO3QmJighbnx8QihuLFdlYlNvY2tldC5DTE9TSU5HKXx8QihuLFdlYlNvY2tldC5DTE9TRUQpKSYmKGUuYWR2YW5jZWRMb2coYSksdWUoZS5pbmZvKGEpKSxzZSgpKX19KSwyNTApLFU9ZnVuY3Rpb24odCxuKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3RyeXt0KG4pfWNhdGNoKHQpe3VlKGUuZXJyb3IoIkVycm9yIGV4ZWN1dGluZyBjYWxsYmFjayIsdCkpfX0pKX0sRj1mdW5jdGlvbihlKXtpZihudWxsPT09ZSlyZXR1cm4iTlVMTCI7c3dpdGNoKGUucmVhZHlTdGF0ZSl7Y2FzZSBXZWJTb2NrZXQuQ09OTkVDVElORzpyZXR1cm4iQ09OTkVDVElORyI7Y2FzZSBXZWJTb2NrZXQuT1BFTjpyZXR1cm4iT1BFTiI7Y2FzZSBXZWJTb2NrZXQuQ0xPU0lORzpyZXR1cm4iQ0xPU0lORyI7Y2FzZSBXZWJTb2NrZXQuQ0xPU0VEOnJldHVybiJDTE9TRUQiO2RlZmF1bHQ6cmV0dXJuIlVOREVGSU5FRCJ9fSxxPWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiIiO3VlKGUuZGVidWcoIlsiK3QrIl0gUHJpbWFyeSBXZWJTb2NrZXQ6ICIrRihuLnByaW1hcnkpKyIgfCBTZWNvbmRhcnkgV2ViU29ja2V0OiAiK0Yobi5zZWNvbmRhcnkpKSl9LEI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmZS5yZWFkeVN0YXRlPT09dH0saj1mdW5jdGlvbihlKXtyZXR1cm4gQihlLFdlYlNvY2tldC5PUEVOKX0sVj1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWV8fHZvaWQgMD09PWUucmVhZHlTdGF0ZXx8QihlLFdlYlNvY2tldC5DTE9TRUQpfSxXPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT1uLnNlY29uZGFyeT9uLnNlY29uZGFyeTpuLnByaW1hcnl9LEc9ZnVuY3Rpb24oKXtyZXR1cm4gaihXKCkpfSx6PWZ1bmN0aW9uKCl7aWYoUi5wZW5kaW5nUmVzcG9uc2UpcmV0dXJuIGUuYWR2YW5jZWRMb2codSksdWUoZS53YXJuKHUpKSxjbGVhckludGVydmFsKFIuaW50ZXJ2YWxIYW5kbGUpLFIucGVuZGluZ1Jlc3BvbnNlPSExLHZvaWQgc2UoKTtHKCk/KHVlKGUuZGVidWcoIlNlbmRpbmcgaGVhcnRiZWF0IikpLFcoKS5zZW5kKG9lKF8pKSxSLnBlbmRpbmdSZXNwb25zZT0hMCk6KGUuYWR2YW5jZWRMb2cobCksdWUoZS53YXJuKGwpKSxxKCJzZW5kSGVhcnRCZWF0Iiksc2UoKSl9LFg9ZnVuY3Rpb24oKXtlLmFkdmFuY2VkTG9nKCJSZXNldCBXZWJzb2NrZXQgc3RhdGUiKSxyLmV4cG9uZW50aWFsQmFja09mZlRpbWU9MWUzLFIucGVuZGluZ1Jlc3BvbnNlPSExLHIucmVjb25uZWN0V2ViU29ja2V0PSEwLGNsZWFyVGltZW91dChyLmxpZmVUaW1lVGltZW91dEhhbmRsZSksY2xlYXJJbnRlcnZhbChSLmludGVydmFsSGFuZGxlKSxjbGVhclRpbWVvdXQoci5leHBvbmVudGlhbFRpbWVvdXRIYW5kbGUpLGNsZWFyVGltZW91dChyLndlYlNvY2tldEluaXRDaGVja2VyVGltZW91dElkKX0sWT1mdW5jdGlvbigpe0QuY29uc2VjdXRpdmVGYWlsZWRTdWJzY3JpYmVBdHRlbXB0cz0wLEQuY29uc2VjdXRpdmVOb1Jlc3BvbnNlUmVxdWVzdD0wLGNsZWFySW50ZXJ2YWwoRC5yZXNwb25zZUNoZWNrSW50ZXJ2YWxJZCksY2xlYXJJbnRlcnZhbChELnJlU3Vic2NyaWJlSW50ZXJ2YWxJZCl9LCQ9ZnVuY3Rpb24oKXtvLmNvbm5lY3RXZWJTb2NrZXRSZXRyeUNvdW50PTAsby5jb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZT1udWxsLG8ubm9PcGVuQ29ubmVjdGlvbnNUaW1lc3RhbXA9bnVsbH0sSj1mdW5jdGlvbigpe1AuY29ubmVjdGVkKCk7dHJ5e2UuYWR2YW5jZWRMb2cocCksdWUoZS5pbmZvKHApKSxxKCJ3ZWJTb2NrZXRPbk9wZW4iKSxudWxsIT09ci5jb25uU3RhdGUmJnIuY29ublN0YXRlIT09d3x8VShrLmNvbm5lY3Rpb25HYWluKSxyLmNvbm5TdGF0ZT0iY29ubmVjdGVkIjt2YXIgdD1EYXRlLm5vdygpO1Uoay5jb25uZWN0aW9uT3Blbix7Y29ubmVjdFdlYlNvY2tldFJldHJ5Q291bnQ6by5jb25uZWN0V2ViU29ja2V0UmV0cnlDb3VudCxjb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZTpvLmNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lLG5vT3BlbkNvbm5lY3Rpb25zVGltZXN0YW1wOm8ubm9PcGVuQ29ubmVjdGlvbnNUaW1lc3RhbXAsY29ubmVjdGlvbkVzdGFibGlzaGVkVGltZTp0LHRpbWVUb0Nvbm5lY3Q6dC1vLmNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lLHRpbWVXaXRob3V0Q29ubmVjdGlvbjpvLm5vT3BlbkNvbm5lY3Rpb25zVGltZXN0YW1wP3Qtby5ub09wZW5Db25uZWN0aW9uc1RpbWVzdGFtcDpudWxsfSksJCgpLFgoKSxXKCkub3BlblRpbWVzdGFtcD1EYXRlLm5vdygpLDA9PT1PLnN1YnNjcmliZWQuc2l6ZSYmaihuLnNlY29uZGFyeSkmJnRlKG4ucHJpbWFyeSwiW1ByaW1hcnkgV2ViU29ja2V0XSBDbG9zaW5nIFdlYlNvY2tldCIpLChPLnN1YnNjcmliZWQuc2l6ZT4wfHxPLnBlbmRpbmcuc2l6ZT4wKSYmKGoobi5zZWNvbmRhcnkpJiZ1ZShlLmluZm8oIlN1YnNjcmliaW5nIHNlY29uZGFyeSB3ZWJzb2NrZXQgdG8gdG9waWNzIG9mIHByaW1hcnkgd2Vic29ja2V0IikpLE8uc3Vic2NyaWJlZC5mb3JFYWNoKChmdW5jdGlvbihlKXtPLnN1YnNjcmlwdGlvbkhpc3RvcnkuYWRkKGUpLE8ucGVuZGluZy5hZGQoZSl9KSksTy5zdWJzY3JpYmVkLmNsZWFyKCksZWUoKSkseigpLFIuaW50ZXJ2YWxIYW5kbGU9c2V0SW50ZXJ2YWwoeiwxZTQpO3ZhciBpPTFlMypMLmNvbm5Db25maWcud2ViU29ja2V0VHJhbnNwb3J0LnRyYW5zcG9ydExpZmVUaW1lSW5TZWNvbmRzO3VlKGUuZGVidWcoIlNjaGVkdWxpbmcgV2ViU29ja2V0IG1hbmFnZXIgcmVjb25uZWN0aW9uLCBhZnRlciBkZWxheSAiK2krIiBtcyIpKSxyLmxpZmVUaW1lVGltZW91dEhhbmRsZT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3VlKGUuZGVidWcoIlN0YXJ0aW5nIHNjaGVkdWxlZCBXZWJTb2NrZXQgbWFuYWdlciByZWNvbm5lY3Rpb24iKSksc2UoKX0pLGkpfWNhdGNoKHQpe3VlKGUuZXJyb3IoIkVycm9yIGFmdGVyIGVzdGFibGlzaGluZyBXZWJTb2NrZXQgY29ubmVjdGlvbiIsdCkpfX0sUT1mdW5jdGlvbih0KXtxKCJ3ZWJTb2NrZXRPbkVycm9yIiksZS5hZHZhbmNlZExvZyhoLEpTT04uc3RyaW5naWZ5KHQpKSx1ZShlLmVycm9yKGgsSlNPTi5zdHJpbmdpZnkodCkpKSxQLmdldElzQ29ubmVjdGVkKCk/c2UoKTpQLnJldHJ5KCl9LFo9ZnVuY3Rpb24odCl7dmFyIHI9SlNPTi5wYXJzZSh0LmRhdGEpO3N3aXRjaChyLnRvcGljKXtjYXNlIEE6aWYodWUoZS5kZWJ1ZygiU3Vic2NyaXB0aW9uIE1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB3ZWJTb2NrZXQgc2VydmVyIix0LmRhdGEpKSxELnJlcXVlc3RDb21wbGV0ZWQ9ITAsRC5jb25zZWN1dGl2ZU5vUmVzcG9uc2VSZXF1ZXN0PTAsInN1Y2Nlc3MiPT09ci5jb250ZW50LnN0YXR1cylELmNvbnNlY3V0aXZlRmFpbGVkU3Vic2NyaWJlQXR0ZW1wdHM9MCxyLmNvbnRlbnQudG9waWNzLmZvckVhY2goKGZ1bmN0aW9uKGUpe08uc3Vic2NyaXB0aW9uSGlzdG9yeS5kZWxldGUoZSksTy5wZW5kaW5nLmRlbGV0ZShlKSxPLnN1YnNjcmliZWQuYWRkKGUpfSkpLDA9PT1PLnN1YnNjcmlwdGlvbkhpc3Rvcnkuc2l6ZT9qKG4uc2Vjb25kYXJ5KSYmKHVlKGUuaW5mbygiU3VjY2Vzc2Z1bGx5IHN1YnNjcmliZWQgc2Vjb25kYXJ5IHdlYnNvY2tldCB0byBhbGwgdG9waWNzIG9mIHByaW1hcnkgd2Vic29ja2V0IikpLHRlKG4ucHJpbWFyeSwiW1ByaW1hcnkgV2ViU29ja2V0XSBDbG9zaW5nIFdlYlNvY2tldCIpKTplZSgpLFUoay5zdWJzY3JpcHRpb25VcGRhdGUscik7ZWxzZXtpZihjbGVhckludGVydmFsKEQucmVTdWJzY3JpYmVJbnRlcnZhbElkKSwrK0QuY29uc2VjdXRpdmVGYWlsZWRTdWJzY3JpYmVBdHRlbXB0cyw1PT09RC5jb25zZWN1dGl2ZUZhaWxlZFN1YnNjcmliZUF0dGVtcHRzKXJldHVybiBVKGsuc3Vic2NyaXB0aW9uRmFpbHVyZSxyKSx2b2lkKEQuY29uc2VjdXRpdmVGYWlsZWRTdWJzY3JpYmVBdHRlbXB0cz0wKTtELnJlU3Vic2NyaWJlSW50ZXJ2YWxJZD1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtlZSgpfSksNTAwKX1icmVhaztjYXNlIF86dWUoZS5kZWJ1ZygiSGVhcnRiZWF0IHJlc3BvbnNlIHJlY2VpdmVkIikpLFIucGVuZGluZ1Jlc3BvbnNlPSExO2JyZWFrO2RlZmF1bHQ6aWYoci50b3BpYyl7aWYoZS5hZHZhbmNlZExvZyhULHIudG9waWMpLHVlKGUuZGVidWcoVCtyLnRvcGljKSksaihuLnByaW1hcnkpJiZqKG4uc2Vjb25kYXJ5KSYmMD09PU8uc3Vic2NyaXB0aW9uSGlzdG9yeS5zaXplJiZ0aGlzPT09bi5wcmltYXJ5KXJldHVybiB2b2lkIHVlKGUud2FybigiSWdub3JpbmcgTWVzc2FnZSBmb3IgVG9waWMgIityLnRvcGljKyIsIHRvIGF2b2lkIGR1cGxpY2F0ZXMiKSk7aWYoMD09PWsuYWxsTWVzc2FnZS5zaXplJiYwPT09ay50b3BpYy5zaXplKXJldHVybiB2b2lkIHVlKGUud2FybigiTm8gcmVnaXN0ZXJlZCBjYWxsYmFjayBsaXN0ZW5lciBmb3IgVG9waWMiLHIudG9waWMpKTtlLmFkdmFuY2VkTG9nKCJXZWJzb2NrZXRNYW5hZ2VyIGludm9rZSBjYWxsYmFja3MgZm9yIHRvcGljIHN1Y2Nlc3MgIixyLnRvcGljKSxVKGsuYWxsTWVzc2FnZSxyKSxrLnRvcGljLmhhcyhyLnRvcGljKSYmVShrLnRvcGljLmdldChyLnRvcGljKSxyKX1lbHNlIHIubWVzc2FnZT8oZS5hZHZhbmNlZExvZyhDLHIpLHVlKGUud2FybihDLHIpKSk6KGUuYWR2YW5jZWRMb2coSSxyKSx1ZShlLndhcm4oSSxyKSkpfX0sZWU9ZnVuY3Rpb24gdCgpe2lmKEQuY29uc2VjdXRpdmVOb1Jlc3BvbnNlUmVxdWVzdD4zKXJldHVybiB1ZShlLndhcm4oIklnbm9yaW5nIHN1YnNjcmliZVBlbmRpbmdUb3BpY3Mgc2luY2Ugd2UgaGF2ZSBleGhhdXN0ZWQgbWF4IHN1YnNjcmlwdGlvbiByZXRyaWVzIHdpdGggbm8gcmVzcG9uc2UiKSksdm9pZCBVKGsuc3Vic2NyaXB0aW9uRmFpbHVyZSxOLmdldFN1YnNjcmlwdGlvblJlc3BvbnNlKEEsITEsQXJyYXkuZnJvbShPLnBlbmRpbmcpKSk7RygpPzAhPT1BcnJheS5mcm9tKE8ucGVuZGluZykubGVuZ3RoJiYoY2xlYXJJbnRlcnZhbChELnJlc3BvbnNlQ2hlY2tJbnRlcnZhbElkKSxXKCkuc2VuZChvZShBLHt0b3BpY3M6QXJyYXkuZnJvbShPLnBlbmRpbmcpfSkpLEQucmVxdWVzdENvbXBsZXRlZD0hMSxELnJlc3BvbnNlQ2hlY2tJbnRlcnZhbElkPXNldEludGVydmFsKChmdW5jdGlvbigpe0QucmVxdWVzdENvbXBsZXRlZHx8KCsrRC5jb25zZWN1dGl2ZU5vUmVzcG9uc2VSZXF1ZXN0LHQoKSl9KSwxZTMpKTp1ZShlLndhcm4oIklnbm9yaW5nIHN1YnNjcmliZVBlbmRpbmdUb3BpY3MgY2FsbCBzaW5jZSBEZWZhdWx0IFdlYlNvY2tldCBpcyBub3Qgb3BlbiIpKX0sdGU9ZnVuY3Rpb24odCxuKXtCKHQsV2ViU29ja2V0LkNPTk5FQ1RJTkcpfHxCKHQsV2ViU29ja2V0Lk9QRU4pP3QuY2xvc2UoMWUzLG4pOnVlKGUud2FybigiSWdub3JpbmcgV2ViU29ja2V0IENsb3NlIHJlcXVlc3QsIFdlYlNvY2tldCBTdGF0ZTogIitGKHQpKSl9LG5lPWZ1bmN0aW9uKGUpe3RlKG4ucHJpbWFyeSwiW1ByaW1hcnldIFdlYlNvY2tldCAiK2UpLHRlKG4uc2Vjb25kYXJ5LCJbU2Vjb25kYXJ5XSBXZWJTb2NrZXQgIitlKX0scmU9ZnVuY3Rpb24odCl7WCgpLFkoKSxlLmFkdmFuY2VkTG9nKG0sdCksdWUoZS5lcnJvcihtKSksci53ZWJzb2NrZXRJbml0RmFpbGVkPSEwLG5lKCJUZXJtaW5hdGluZyBXZWJTb2NrZXQgTWFuYWdlciIpLGNsZWFySW50ZXJ2YWwoTSksVShrLmluaXRGYWlsdXJlLHtjb25uZWN0V2ViU29ja2V0UmV0cnlDb3VudDpvLmNvbm5lY3RXZWJTb2NrZXRSZXRyeUNvdW50LGNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lOm8uY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWUscmVhc29uOnR9KSwkKCl9LG9lPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHt0b3BpYzplLGNvbnRlbnQ6dH0pfSxpZT1mdW5jdGlvbih0KXtyZXR1cm4hIShOLmlzT2JqZWN0KHQpJiZOLmlzT2JqZWN0KHQud2ViU29ja2V0VHJhbnNwb3J0KSYmTi5pc05vbkVtcHR5U3RyaW5nKHQud2ViU29ja2V0VHJhbnNwb3J0LnVybCkmJk4udmFsaWRXU1VybCh0LndlYlNvY2tldFRyYW5zcG9ydC51cmwpJiYxZTMqdC53ZWJTb2NrZXRUcmFuc3BvcnQudHJhbnNwb3J0TGlmZVRpbWVJblNlY29uZHM+PTNlNSl8fCh1ZShlLmVycm9yKCJJbnZhbGlkIFdlYlNvY2tldCBDb25uZWN0aW9uIENvbmZpZ3VyYXRpb24iLHQpKSwhMSl9LHNlPWZ1bmN0aW9uKCl7aWYoIU4uaXNOZXR3b3JrT25saW5lKCkpcmV0dXJuIGUuYWR2YW5jZWRMb2coYyksdm9pZCB1ZShlLmluZm8oYykpO2lmKHIud2Vic29ja2V0SW5pdEZhaWxlZCl1ZShlLmRlYnVnKCJXZWJTb2NrZXQgSW5pdCBoYWQgZmFpbGVkLCBpZ25vcmluZyB0aGlzIGdldFdlYlNvY2tldENvbm5Db25maWcgcmVxdWVzdCIpKTtlbHNle2lmKEwucHJvbWlzZUNvbXBsZXRlZClyZXR1cm4gWCgpLGUuYWR2YW5jZWRMb2codiksdWUoZS5pbmZvKHYpKSxvLmNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lPW8uY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWV8fERhdGUubm93KCksTC5wcm9taXNlQ29tcGxldGVkPSExLEwucHJvbWlzZUhhbmRsZT1rLmdldFdlYlNvY2tldFRyYW5zcG9ydCgpLEwucHJvbWlzZUhhbmRsZS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gTC5wcm9taXNlQ29tcGxldGVkPSEwLGUuYWR2YW5jZWRMb2coeSksdWUoZS5kZWJ1Zyh5LHQpKSxpZSh0KT8oTC5jb25uQ29uZmlnPXQsTC5jb25uQ29uZmlnLnVybENvbm5WYWxpZFRpbWU9RGF0ZS5ub3coKSs4NWUzLGFlKCkpOihyZSgiSW52YWxpZCBXZWJTb2NrZXQgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uOiAiK3QpLHt3ZWJTb2NrZXRDb25uZWN0aW9uRmFpbGVkOiEwfSl9KSwoZnVuY3Rpb24odCl7cmV0dXJuIEwucHJvbWlzZUNvbXBsZXRlZD0hMCxlLmFkdmFuY2VkTG9nKEUpLHVlKGUuZXJyb3IoRSx0KSksTi5pc05ldHdvcmtGYWlsdXJlKHQpPyhlLmFkdmFuY2VkTG9nKFMrSlNPTi5zdHJpbmdpZnkodCkpLHVlKGUuaW5mbyhTK0pTT04uc3RyaW5naWZ5KHQpKSksUC5yZXRyeSgpKTpyZSgiRmFpbGVkIHRvIGZldGNoIHdlYlNvY2tldCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb246ICIrSlNPTi5zdHJpbmdpZnkodCkpLHt3ZWJTb2NrZXRDb25uZWN0aW9uRmFpbGVkOiEwfX0pKTt1ZShlLmRlYnVnKCJUaGVyZSBpcyBhbiBvbmdvaW5nIGdldFdlYlNvY2tldENvbm5Db25maWcgcmVxdWVzdCwgdGhpcyByZXF1ZXN0IHdpbGwgYmUgaWdub3JlZCIpKX19LGFlPWZ1bmN0aW9uKCl7aWYoci53ZWJzb2NrZXRJbml0RmFpbGVkKXJldHVybiB1ZShlLmluZm8oIndlYi1zb2NrZXQgaW5pdGlhbGl6aW5nIGhhZCBmYWlsZWQsIGFib3J0aW5nIHJlLWluaXQiKSkse3dlYlNvY2tldENvbm5lY3Rpb25GYWlsZWQ6ITB9O2lmKCFOLmlzTmV0d29ya09ubGluZSgpKXJldHVybiB1ZShlLndhcm4oIlN5c3RlbSBpcyBvZmZsaW5lIGFib3J0aW5nIHdlYi1zb2NrZXQgaW5pdCIpKSx7d2ViU29ja2V0Q29ubmVjdGlvbkZhaWxlZDohMH07ZS5hZHZhbmNlZExvZyhiKSx1ZShlLmluZm8oYikpLHEoImluaXRXZWJTb2NrZXQiKTt0cnl7aWYoaWUoTC5jb25uQ29uZmlnKSl7dmFyIHQ9bnVsbDtyZXR1cm4gaihuLnByaW1hcnkpPyh1ZShlLmRlYnVnKCJQcmltYXJ5IFNvY2tldCBjb25uZWN0aW9uIGlzIGFscmVhZHkgb3BlbiIpKSxCKG4uc2Vjb25kYXJ5LFdlYlNvY2tldC5DT05ORUNUSU5HKXx8KHVlKGUuZGVidWcoIkVzdGFibGlzaGluZyBhIHNlY29uZGFyeSB3ZWItc29ja2V0IGNvbm5lY3Rpb24iKSksUC5udW1BdHRlbXB0cz0wLG4uc2Vjb25kYXJ5PWNlKCkpLHQ9bi5zZWNvbmRhcnkpOihCKG4ucHJpbWFyeSxXZWJTb2NrZXQuQ09OTkVDVElORyl8fCh1ZShlLmRlYnVnKCJFc3RhYmxpc2hpbmcgYSBwcmltYXJ5IHdlYi1zb2NrZXQgY29ubmVjdGlvbiIpKSxuLnByaW1hcnk9Y2UoKSksdD1uLnByaW1hcnkpLHIud2ViU29ja2V0SW5pdENoZWNrZXJUaW1lb3V0SWQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtqKHQpfHxmdW5jdGlvbigpe28uY29ubmVjdFdlYlNvY2tldFJldHJ5Q291bnQrKzt2YXIgdD1OLmFkZEppdHRlcihyLmV4cG9uZW50aWFsQmFja09mZlRpbWUsLjMpO0RhdGUubm93KCkrdDw9TC5jb25uQ29uZmlnLnVybENvbm5WYWxpZFRpbWU/KGUuYWR2YW5jZWRMb2coZiksdWUoZS5kZWJ1ZyhmK3QrIiBtcyIpKSxyLmV4cG9uZW50aWFsVGltZW91dEhhbmRsZT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3JldHVybiBhZSgpfSksdCksci5leHBvbmVudGlhbEJhY2tPZmZUaW1lKj0yKTooZS5hZHZhbmNlZExvZyhnKSx1ZShlLndhcm4oZykpLHNlKCkpfSgpfSksMWUzKSx7d2ViU29ja2V0Q29ubmVjdGlvbkZhaWxlZDohMX19fWNhdGNoKHQpe3JldHVybiB1ZShlLmVycm9yKCJFcnJvciBJbml0aWFsaXppbmcgd2ViLXNvY2tldC1tYW5hZ2VyIix0KSkscmUoIkZhaWxlZCB0byBpbml0aWFsaXplIG5ldyBXZWJTb2NrZXQ6ICIrdC5tZXNzYWdlKSx7d2ViU29ja2V0Q29ubmVjdGlvbkZhaWxlZDohMH19fSxjZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBXZWJTb2NrZXQoTC5jb25uQ29uZmlnLndlYlNvY2tldFRyYW5zcG9ydC51cmwpO3JldHVybiB0LmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLEopLHQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsWiksdC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsUSksdC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsKGZ1bmN0aW9uKGkpe3JldHVybiBmdW5jdGlvbih0LGkpe2UuYWR2YW5jZWRMb2coZCxKU09OLnN0cmluZ2lmeSh0KSksdWUoZS5pbmZvKGQsSlNPTi5zdHJpbmdpZnkodCkpKSxxKCJ3ZWJTb2NrZXRPbkNsb3NlIGJlZm9yZS1jbGVhbnVwIiksVShrLmNvbm5lY3Rpb25DbG9zZSx7b3BlblRpbWVzdGFtcDppLm9wZW5UaW1lc3RhbXAsY2xvc2VUaW1lc3RhbXA6RGF0ZS5ub3coKSxjb25uZWN0aW9uRHVyYXRpb246RGF0ZS5ub3coKS1pLm9wZW5UaW1lc3RhbXAsY29kZTp0LmNvZGUscmVhc29uOnQucmVhc29ufSksVihuLnByaW1hcnkpJiYobi5wcmltYXJ5PW51bGwpLFYobi5zZWNvbmRhcnkpJiYobi5zZWNvbmRhcnk9bnVsbCksci5yZWNvbm5lY3RXZWJTb2NrZXQmJihqKG4ucHJpbWFyeSl8fGoobi5zZWNvbmRhcnkpP1Yobi5wcmltYXJ5KSYmaihuLnNlY29uZGFyeSkmJih1ZShlLmluZm8oIltQcmltYXJ5XSBXZWJTb2NrZXQgQ2xlYW5seSBDbG9zZWQiKSksbi5wcmltYXJ5PW4uc2Vjb25kYXJ5LG4uc2Vjb25kYXJ5PW51bGwpOih1ZShlLndhcm4oIk5laXRoZXIgcHJpbWFyeSB3ZWJzb2NrZXQgYW5kIG5vciBzZWNvbmRhcnkgd2Vic29ja2V0IGhhdmUgb3BlbiBjb25uZWN0aW9ucywgYXR0ZW1wdGluZyB0byByZS1lc3RhYmxpc2ggY29ubmVjdGlvbiIpKSxyLmNvbm5TdGF0ZT09PXc/dWUoZS5pbmZvKCJJZ25vcmluZyBjb25uZWN0aW9uTG9zdCBjYWxsYmFjayBpbnZvY2F0aW9uIikpOihVKGsuY29ubmVjdGlvbkxvc3Qse29wZW5UaW1lc3RhbXA6aS5vcGVuVGltZXN0YW1wLGNsb3NlVGltZXN0YW1wOkRhdGUubm93KCksY29ubmVjdGlvbkR1cmF0aW9uOkRhdGUubm93KCktaS5vcGVuVGltZXN0YW1wLGNvZGU6dC5jb2RlLHJlYXNvbjp0LnJlYXNvbn0pLG8ubm9PcGVuQ29ubmVjdGlvbnNUaW1lc3RhbXA9RGF0ZS5ub3coKSksci5jb25uU3RhdGU9dyxzZSgpKSxxKCJ3ZWJTb2NrZXRPbkNsb3NlIGFmdGVyLWNsZWFudXAiKSl9KGksdCl9KSksdH0sdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyJiZlLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksZX07dGhpcy5pbml0PWZ1bmN0aW9uKHQpe2lmKE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24odCksInRyYW5zcG9ydEhhbmRsZSBtdXN0IGJlIGEgZnVuY3Rpb24iKSxudWxsPT09ay5nZXRXZWJTb2NrZXRUcmFuc3BvcnQpcmV0dXJuIGsuZ2V0V2ViU29ja2V0VHJhbnNwb3J0PXQsc2UoKTt1ZShlLndhcm4oIldlYiBTb2NrZXQgTWFuYWdlciB3YXMgYWxyZWFkeSBpbml0aWFsaXplZCIpKX0sdGhpcy5vbkluaXRGYWlsdXJlPWZ1bmN0aW9uKHQpe3JldHVybiBlLmFkdmFuY2VkTG9nKCJJbml0aWFsaXppbmcgV2Vic29ja2V0IE1hbmFnZXIgRmFpbGVkISIpLE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24odCksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLGsuaW5pdEZhaWx1cmUuYWRkKHQpLHIud2Vic29ja2V0SW5pdEZhaWxlZCYmdCgpLGZ1bmN0aW9uKCl7cmV0dXJuIGsuaW5pdEZhaWx1cmUuZGVsZXRlKHQpfX0sdGhpcy5vbkNvbm5lY3Rpb25PcGVuPWZ1bmN0aW9uKHQpe3JldHVybiBlLmFkdmFuY2VkTG9nKCJXZWJzb2NrZXQgY29ubmVjdGlvbiBvcGVuIiksTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbih0KSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksay5jb25uZWN0aW9uT3Blbi5hZGQodCksZnVuY3Rpb24oKXtyZXR1cm4gay5jb25uZWN0aW9uT3Blbi5kZWxldGUodCl9fSx0aGlzLm9uQ29ubmVjdGlvbkNsb3NlPWZ1bmN0aW9uKHQpe3JldHVybiBlLmFkdmFuY2VkTG9nKCJXZWJzb2NrZXQgY29ubmVjdGlvbiBjbG9zZSIpLE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24odCksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLGsuY29ubmVjdGlvbkNsb3NlLmFkZCh0KSxmdW5jdGlvbigpe3JldHVybiBrLmNvbm5lY3Rpb25DbG9zZS5kZWxldGUodCl9fSx0aGlzLm9uQ29ubmVjdGlvbkdhaW49ZnVuY3Rpb24odCl7cmV0dXJuIGUuYWR2YW5jZWRMb2coIldlYnNvY2tldCBjb25uZWN0aW9uIGdhaW4iKSxOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKHQpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxrLmNvbm5lY3Rpb25HYWluLmFkZCh0KSxHKCkmJnQoKSxmdW5jdGlvbigpe3JldHVybiBrLmNvbm5lY3Rpb25HYWluLmRlbGV0ZSh0KX19LHRoaXMub25Db25uZWN0aW9uTG9zdD1mdW5jdGlvbih0KXtyZXR1cm4gZS5hZHZhbmNlZExvZygiV2Vic29ja2V0IGNvbm5lY3Rpb24gbG9zdCIpLE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24odCksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLGsuY29ubmVjdGlvbkxvc3QuYWRkKHQpLHIuY29ublN0YXRlPT09dyYmdCgpLGZ1bmN0aW9uKCl7cmV0dXJuIGsuY29ubmVjdGlvbkxvc3QuZGVsZXRlKHQpfX0sdGhpcy5vblN1YnNjcmlwdGlvblVwZGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbihlKSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksay5zdWJzY3JpcHRpb25VcGRhdGUuYWRkKGUpLGZ1bmN0aW9uKCl7cmV0dXJuIGsuc3Vic2NyaXB0aW9uVXBkYXRlLmRlbGV0ZShlKX19LHRoaXMub25TdWJzY3JpcHRpb25GYWlsdXJlPWZ1bmN0aW9uKHQpe3JldHVybiBlLmFkdmFuY2VkTG9nKCJXZWJzb2NrZXQgc3Vic2NyaXB0aW9uIGZhaWx1cmUiKSxOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKHQpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxrLnN1YnNjcmlwdGlvbkZhaWx1cmUuYWRkKHQpLGZ1bmN0aW9uKCl7cmV0dXJuIGsuc3Vic2NyaXB0aW9uRmFpbHVyZS5kZWxldGUodCl9fSx0aGlzLm9uTWVzc2FnZT1mdW5jdGlvbihlLHQpe3JldHVybiBOLmFzc2VydE5vdE51bGwoZSwidG9waWNOYW1lIiksTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbih0KSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksay50b3BpYy5oYXMoZSk/ay50b3BpYy5nZXQoZSkuYWRkKHQpOmsudG9waWMuc2V0KGUsbmV3IFNldChbdF0pKSxmdW5jdGlvbigpe3JldHVybiBrLnRvcGljLmdldChlKS5kZWxldGUodCl9fSx0aGlzLm9uQWxsTWVzc2FnZT1mdW5jdGlvbihlKXtyZXR1cm4gTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbihlKSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksay5hbGxNZXNzYWdlLmFkZChlKSxmdW5jdGlvbigpe3JldHVybiBrLmFsbE1lc3NhZ2UuZGVsZXRlKGUpfX0sdGhpcy5zdWJzY3JpYmVUb3BpY3M9ZnVuY3Rpb24oZSl7Ti5hc3NlcnROb3ROdWxsKGUsInRvcGljcyIpLE4uYXNzZXJ0SXNMaXN0KGUpLGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7Ty5zdWJzY3JpYmVkLmhhcyhlKXx8Ty5wZW5kaW5nLmFkZChlKX0pKSxELmNvbnNlY3V0aXZlTm9SZXNwb25zZVJlcXVlc3Q9MCxlZSgpfSx0aGlzLnNlbmRNZXNzYWdlPWZ1bmN0aW9uKHQpe2lmKE4uYXNzZXJ0SXNPYmplY3QodCwicGF5bG9hZCIpLHZvaWQgMD09PXQudG9waWN8fHguaGFzKHQudG9waWMpKXVlKGUud2FybigiQ2Fubm90IHNlbmQgbWVzc2FnZSwgSW52YWxpZCB0b3BpYyIsdCkpO2Vsc2V7dHJ5e3Q9SlNPTi5zdHJpbmdpZnkodCl9Y2F0Y2gobil7cmV0dXJuIHZvaWQgdWUoZS53YXJuKCJFcnJvciBzdHJpbmdpZnkgbWVzc2FnZSIsdCkpfUcoKT9XKCkuc2VuZCh0KTp1ZShlLndhcm4oIkNhbm5vdCBzZW5kIG1lc3NhZ2UsIHdlYiBzb2NrZXQgY29ubmVjdGlvbiBpcyBub3Qgb3BlbiIpKX19LHRoaXMuY2xvc2VXZWJTb2NrZXQ9ZnVuY3Rpb24oKXtYKCksWSgpLHIucmVjb25uZWN0V2ViU29ja2V0PSExLGNsZWFySW50ZXJ2YWwoTSksbmUoIlVzZXIgcmVxdWVzdCB0byBjbG9zZSBXZWJTb2NrZXQiKX0sdGhpcy50ZXJtaW5hdGVXZWJTb2NrZXRNYW5hZ2VyPXJlfSxZPXtjcmVhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFh9LHNldEdsb2JhbENvbmZpZzpmdW5jdGlvbihlKXt2YXIgdD1lJiZlLmxvZ2dlckNvbmZpZztILnVwZGF0ZUxvZ2dlckNvbmZpZyh0KX0sTG9nTGV2ZWw6QixMb2dnZXI6Rn19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjshZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIG89e25vdF9zdHJpbmc6L1tec10vLG5vdF9ib29sOi9bXnRdLyxub3RfdHlwZTovW15UXS8sbm90X3ByaW1pdGl2ZTovW152XS8sbnVtYmVyOi9bZGllZmddLyxudW1lcmljX2FyZzovW2JjZGllZmd1eFhdLyxqc29uOi9bal0vLG5vdF9qc29uOi9bXmpdLyx0ZXh0Oi9eW15ceDI1XSsvLG1vZHVsbzovXlx4MjV7Mn0vLHBsYWNlaG9sZGVyOi9eXHgyNSg/OihbMS05XVxkKilcJHxcKChbXildKylcKSk/KFwrKT8oMHwnW14kXSk/KC0pPyhcZCspPyg/OlwuKFxkKykpPyhbYi1naWpvc3RUdXZ4WF0pLyxrZXk6L14oW2Etel9dW2Etel9cZF0qKS9pLGtleV9hY2Nlc3M6L15cLihbYS16X11bYS16X1xkXSopL2ksaW5kZXhfYWNjZXNzOi9eXFsoXGQrKVxdLyxzaWduOi9eWystXS99O2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7dmFyIG4scixzLGEsYyx1LGwscCxkLGg9MSxmPWUubGVuZ3RoLGc9IiI7Zm9yKHI9MDtyPGY7cisrKWlmKCJzdHJpbmciPT10eXBlb2YgZVtyXSlnKz1lW3JdO2Vsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiBlW3JdKXtpZigoYT1lW3JdKS5rZXlzKWZvcihuPXRbaF0scz0wO3M8YS5rZXlzLmxlbmd0aDtzKyspe2lmKG51bGw9PW4pdGhyb3cgbmV3IEVycm9yKGkoJ1tzcHJpbnRmXSBDYW5ub3QgYWNjZXNzIHByb3BlcnR5ICIlcyIgb2YgdW5kZWZpbmVkIHZhbHVlICIlcyInLGEua2V5c1tzXSxhLmtleXNbcy0xXSkpO249blthLmtleXNbc11dfWVsc2Ugbj1hLnBhcmFtX25vP3RbYS5wYXJhbV9ub106dFtoKytdO2lmKG8ubm90X3R5cGUudGVzdChhLnR5cGUpJiZvLm5vdF9wcmltaXRpdmUudGVzdChhLnR5cGUpJiZuIGluc3RhbmNlb2YgRnVuY3Rpb24mJihuPW4oKSksby5udW1lcmljX2FyZy50ZXN0KGEudHlwZSkmJiJudW1iZXIiIT10eXBlb2YgbiYmaXNOYU4obikpdGhyb3cgbmV3IFR5cGVFcnJvcihpKCJbc3ByaW50Zl0gZXhwZWN0aW5nIG51bWJlciBidXQgZm91bmQgJVQiLG4pKTtzd2l0Y2goby5udW1iZXIudGVzdChhLnR5cGUpJiYocD1uPj0wKSxhLnR5cGUpe2Nhc2UiYiI6bj1wYXJzZUludChuLDEwKS50b1N0cmluZygyKTticmVhaztjYXNlImMiOm49U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChuLDEwKSk7YnJlYWs7Y2FzZSJkIjpjYXNlImkiOm49cGFyc2VJbnQobiwxMCk7YnJlYWs7Y2FzZSJqIjpuPUpTT04uc3RyaW5naWZ5KG4sbnVsbCxhLndpZHRoP3BhcnNlSW50KGEud2lkdGgpOjApO2JyZWFrO2Nhc2UiZSI6bj1hLnByZWNpc2lvbj9wYXJzZUZsb2F0KG4pLnRvRXhwb25lbnRpYWwoYS5wcmVjaXNpb24pOnBhcnNlRmxvYXQobikudG9FeHBvbmVudGlhbCgpO2JyZWFrO2Nhc2UiZiI6bj1hLnByZWNpc2lvbj9wYXJzZUZsb2F0KG4pLnRvRml4ZWQoYS5wcmVjaXNpb24pOnBhcnNlRmxvYXQobik7YnJlYWs7Y2FzZSJnIjpuPWEucHJlY2lzaW9uP1N0cmluZyhOdW1iZXIobi50b1ByZWNpc2lvbihhLnByZWNpc2lvbikpKTpwYXJzZUZsb2F0KG4pO2JyZWFrO2Nhc2UibyI6bj0ocGFyc2VJbnQobiwxMCk+Pj4wKS50b1N0cmluZyg4KTticmVhaztjYXNlInMiOm49U3RyaW5nKG4pLG49YS5wcmVjaXNpb24/bi5zdWJzdHJpbmcoMCxhLnByZWNpc2lvbik6bjticmVhaztjYXNlInQiOm49U3RyaW5nKCEhbiksbj1hLnByZWNpc2lvbj9uLnN1YnN0cmluZygwLGEucHJlY2lzaW9uKTpuO2JyZWFrO2Nhc2UiVCI6bj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobikuc2xpY2UoOCwtMSkudG9Mb3dlckNhc2UoKSxuPWEucHJlY2lzaW9uP24uc3Vic3RyaW5nKDAsYS5wcmVjaXNpb24pOm47YnJlYWs7Y2FzZSJ1IjpuPXBhcnNlSW50KG4sMTApPj4+MDticmVhaztjYXNlInYiOm49bi52YWx1ZU9mKCksbj1hLnByZWNpc2lvbj9uLnN1YnN0cmluZygwLGEucHJlY2lzaW9uKTpuO2JyZWFrO2Nhc2UieCI6bj0ocGFyc2VJbnQobiwxMCk+Pj4wKS50b1N0cmluZygxNik7YnJlYWs7Y2FzZSJYIjpuPShwYXJzZUludChuLDEwKT4+PjApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfW8uanNvbi50ZXN0KGEudHlwZSk/Zys9bjooIW8ubnVtYmVyLnRlc3QoYS50eXBlKXx8cCYmIWEuc2lnbj9kPSIiOihkPXA/IisiOiItIixuPW4udG9TdHJpbmcoKS5yZXBsYWNlKG8uc2lnbiwiIikpLHU9YS5wYWRfY2hhcj8iMCI9PT1hLnBhZF9jaGFyPyIwIjphLnBhZF9jaGFyLmNoYXJBdCgxKToiICIsbD1hLndpZHRoLShkK24pLmxlbmd0aCxjPWEud2lkdGgmJmw+MD91LnJlcGVhdChsKToiIixnKz1hLmFsaWduP2QrbitjOiIwIj09PXU/ZCtjK246YytkK24pfXJldHVybiBnfShmdW5jdGlvbihlKXtpZihhW2VdKXJldHVybiBhW2VdO2Zvcih2YXIgdCxuPWUscj1bXSxpPTA7bjspe2lmKG51bGwhPT0odD1vLnRleHQuZXhlYyhuKSkpci5wdXNoKHRbMF0pO2Vsc2UgaWYobnVsbCE9PSh0PW8ubW9kdWxvLmV4ZWMobikpKXIucHVzaCgiJSIpO2Vsc2V7aWYobnVsbD09PSh0PW8ucGxhY2Vob2xkZXIuZXhlYyhuKSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJbc3ByaW50Zl0gdW5leHBlY3RlZCBwbGFjZWhvbGRlciIpO2lmKHRbMl0pe2l8PTE7dmFyIHM9W10sYz10WzJdLHU9W107aWYobnVsbD09PSh1PW8ua2V5LmV4ZWMoYykpKXRocm93IG5ldyBTeW50YXhFcnJvcigiW3NwcmludGZdIGZhaWxlZCB0byBwYXJzZSBuYW1lZCBhcmd1bWVudCBrZXkiKTtmb3Iocy5wdXNoKHVbMV0pOyIiIT09KGM9Yy5zdWJzdHJpbmcodVswXS5sZW5ndGgpKTspaWYobnVsbCE9PSh1PW8ua2V5X2FjY2Vzcy5leGVjKGMpKSlzLnB1c2godVsxXSk7ZWxzZXtpZihudWxsPT09KHU9by5pbmRleF9hY2Nlc3MuZXhlYyhjKSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJbc3ByaW50Zl0gZmFpbGVkIHRvIHBhcnNlIG5hbWVkIGFyZ3VtZW50IGtleSIpO3MucHVzaCh1WzFdKX10WzJdPXN9ZWxzZSBpfD0yO2lmKDM9PT1pKXRocm93IG5ldyBFcnJvcigiW3NwcmludGZdIG1peGluZyBwb3NpdGlvbmFsIGFuZCBuYW1lZCBwbGFjZWhvbGRlcnMgaXMgbm90ICh5ZXQpIHN1cHBvcnRlZCIpO3IucHVzaCh7cGxhY2Vob2xkZXI6dFswXSxwYXJhbV9ubzp0WzFdLGtleXM6dFsyXSxzaWduOnRbM10scGFkX2NoYXI6dFs0XSxhbGlnbjp0WzVdLHdpZHRoOnRbNl0scHJlY2lzaW9uOnRbN10sdHlwZTp0WzhdfSl9bj1uLnN1YnN0cmluZyh0WzBdLmxlbmd0aCl9cmV0dXJuIGFbZV09cn0oZSksYXJndW1lbnRzKX1mdW5jdGlvbiBzKGUsdCl7cmV0dXJuIGkuYXBwbHkobnVsbCxbZV0uY29uY2F0KHR8fFtdKSl9dmFyIGE9T2JqZWN0LmNyZWF0ZShudWxsKTt0LnNwcmludGY9aSx0LnZzcHJpbnRmPXMsInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cuc3ByaW50Zj1pLHdpbmRvdy52c3ByaW50Zj1zLHZvaWQgMD09PShyPWZ1bmN0aW9uKCl7cmV0dXJue3NwcmludGY6aSx2c3ByaW50ZjpzfX0uY2FsbCh0LG4sdCxlKSl8fChlLmV4cG9ydHM9cikpfSgpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KSxmdW5jdGlvbihlKXtuLmQodCwiV2ViU29ja2V0TWFuYWdlciIsKGZ1bmN0aW9uKCl7cmV0dXJuIG99KSk7dmFyIHI9bigwKTtlLmNvbm5lY3Q9ZS5jb25uZWN0fHx7fSxjb25uZWN0LldlYlNvY2tldE1hbmFnZXI9ci5hO3ZhciBvPXIuYX0uY2FsbCh0aGlzLG4oMykpfSxmdW5jdGlvbihlLHQpe3ZhciBuO249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKTt0cnl7bj1ufHxuZXcgRnVuY3Rpb24oInJldHVybiB0aGlzIikoKX1jYXRjaChlKXsib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmKG49d2luZG93KX1lLmV4cG9ydHM9bn1dKX0sMTUxOigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQ7dmFyIG49e1RFU1Q6IlRFU1QiLFRSQUNFOiJUUkFDRSIsREVCVUc6IkRFQlVHIixJTkZPOiJJTkZPIixMT0c6IkxPRyIsV0FSTjoiV0FSTiIsRVJST1I6IkVSUk9SIixDUklUSUNBTDoiQ1JJVElDQUwifSxyPXtDQ1A6ImNjcCIsU09GVFBIT05FOiJzb2Z0cGhvbmUiLENIQVQ6ImNoYXQiLFRBU0s6InRhc2sifSxvPXtURVNUOjAsVFJBQ0U6MTAsREVCVUc6MjAsSU5GTzozMCxMT0c6NDAsV0FSTjo1MCxFUlJPUjoxMDAsQ1JJVElDQUw6MjAwfSxpPSJDQ1AiLHM9IlNoYXJlZFdvcmtlciIsYT0iQ1JNIixjPXtUUkFDRTpmdW5jdGlvbihlKXtjb25zb2xlLmluZm8oZSl9LERFQlVHOmZ1bmN0aW9uKGUpe2NvbnNvbGUuaW5mbyhlKX0sSU5GTzpmdW5jdGlvbihlKXtjb25zb2xlLmluZm8oZSl9LExPRzpmdW5jdGlvbihlKXtjb25zb2xlLmxvZyhlKX0sVEVTVDpmdW5jdGlvbihlKXtjb25zb2xlLmxvZyhlKX0sV0FSTjpmdW5jdGlvbihlKXtjb25zb2xlLndhcm4oZSl9LEVSUk9SOmZ1bmN0aW9uKGUpe2NvbnNvbGUuZXJyb3IoZSl9LENSSVRJQ0FMOmZ1bmN0aW9uKGUpe2NvbnNvbGUuZXJyb3IoZSl9fSx1PWZ1bmN0aW9uKGUpe3ZhciB0LG4sbz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLDApLGk9by5zaGlmdCgpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4tMSE9PU9iamVjdC52YWx1ZXMocikuaW5kZXhPZihlKX0oaSk/KG49aSx0PW8uc2hpZnQoKSk6KHQ9aSxuPXIuQ0NQKSx7Zm9ybWF0OnQsY29tcG9uZW50Om4sYXJnczpvfX0sbD1mdW5jdGlvbihlLG4scixvLGMsdSl7dGhpcy5jb21wb25lbnQ9ZSx0aGlzLmxldmVsPW4sdGhpcy50ZXh0PXIsdGhpcy50aW1lPW5ldyBEYXRlLHRoaXMudGFiSWQ9bnVsbD09PWM/bnVsbDpjfHx0LmNvcmUudGFiSWQsdGhpcy5leGNlcHRpb249bnVsbCx0aGlzLm9iamVjdHM9W10sdGhpcy5saW5lPTAsdGhpcy5hZ2VudFJlc291cmNlSWQ9bnVsbDt0cnl7dC5hZ2VudC5pbml0aWFsaXplZCYmKHRoaXMuYWdlbnRSZXNvdXJjZUlkPShuZXcgdC5BZ2VudCkuX2dldFJlc291cmNlSWQoKSl9Y2F0Y2goZSl7Y29uc29sZS5sb2coIklzc3VlIGZpbmRpbmcgYWdlbnRSZXNvdXJjZUlkOiAiLGUpfXRoaXMubG9nZ2VySWQ9byx1P3RoaXMuY29udGV4dExheWVyPXU6dC5pc1NoYXJlZFdvcmtlcigpP3RoaXMuY29udGV4dExheWVyPXM6dC5pc0NSTSgpP3RoaXMuY29udGV4dExheWVyPWE6dC5pc0NDUCgpJiYodGhpcy5jb250ZXh0TGF5ZXI9aSl9O2wuZnJvbU9iamVjdD1mdW5jdGlvbihlKXt2YXIgdD1lLnRhYklkfHxudWxsLG49ZS5jb250ZXh0TGF5ZXJ8fG51bGwsbz1uZXcgbChyLkNDUCxlLmxldmVsLGUudGV4dCxlLmxvZ2dlcklkLHQsbik7cmV0dXJuIltvYmplY3QgRGF0ZV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUudGltZSk/by50aW1lPW5ldyBEYXRlKGUudGltZS5nZXRUaW1lKCkpOiJudW1iZXIiPT10eXBlb2YgZS50aW1lP28udGltZT1uZXcgRGF0ZShlLnRpbWUpOiJzdHJpbmciPT10eXBlb2YgZS50aW1lP28udGltZT1EYXRlLnBhcnNlKGUudGltZSk6by50aW1lPW5ldyBEYXRlLG8uZXhjZXB0aW9uPWUuZXhjZXB0aW9uLG8ub2JqZWN0cz1lLm9iamVjdHMsb307dmFyIHA9ZnVuY3Rpb24oZSl7dmFyIHQ9L0F1dGhUb2tlbi4qXD0vZztlJiYib2JqZWN0Ij09dHlwZW9mIGUmJk9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKG4peyJvYmplY3QiPT10eXBlb2YgZVtuXT9wKGVbbl0pOiJzdHJpbmciPT10eXBlb2YgZVtuXSYmKCJ1cmwiPT09bnx8InRleHQiPT09bj9lW25dPWVbbl0ucmVwbGFjZSh0LCJbcmVkYWN0ZWRdIik6WyJxdWlja0Nvbm5lY3ROYW1lIl0uaW5jbHVkZXMobik/ZVtuXT0iW3JlZGFjdGVkXSI6WyJjdXN0b21lcklkIiwiQ3VzdG9tZXJJZCIsIlNwZWFrZXJJZCIsIkN1c3RvbWVyU3BlYWtlcklkIl0uaW5jbHVkZXMobikmJihlW25dPWBbb2JmdXNjYXRlZCB2YWx1ZV0gJHttZDUoZVtuXSl9YCkpfSkpfSxkPWZ1bmN0aW9uKGUpe2lmKHRoaXMudHlwZT1lIGluc3RhbmNlb2YgRXJyb3I/ZS5uYW1lOmUuY29kZXx8T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLHRoaXMubWVzc2FnZT1lLm1lc3NhZ2UsdGhpcy5zdGFjaz1bXSxlLnN0YWNrKXRyeXtBcnJheS5pc0FycmF5KGUuc3RhY2spP3RoaXMuc3RhY2s9ZS5zdGFjazoib2JqZWN0Ij09dHlwZW9mIGUuc3RhY2s/dGhpcy5zdGFjaz1bSlNPTi5zdHJpbmdpZnkoZS5zdGFjayldOiJzdHJpbmciPT10eXBlb2YgZS5zdGFjayYmKHRoaXMuc3RhY2s9ZS5zdGFjay5zcGxpdCgiXG4iKSl9Y2F0Y2h7fX07bC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdC5zcHJpbnRmKCJbJXNdIFslc10gWyVzXTogJXMiLHRoaXMuZ2V0VGltZSgpJiZ0aGlzLmdldFRpbWUoKS50b0lTT1N0cmluZz90aGlzLmdldFRpbWUoKS50b0lTT1N0cmluZygpOiI/Pz8iLHRoaXMuZ2V0TGV2ZWwoKSx0aGlzLmdldEFnZW50UmVzb3VyY2VJZCgpLHRoaXMuZ2V0VGV4dCgpKX0sbC5wcm90b3R5cGUuZ2V0VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWV9LGwucHJvdG90eXBlLmdldEFnZW50UmVzb3VyY2VJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFnZW50UmVzb3VyY2VJZH0sbC5wcm90b3R5cGUuZ2V0VGFiSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50YWJJZH0sbC5wcm90b3R5cGUuZ2V0Q29udGV4dExheWVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGV4dExheWVyfSxsLnByb3RvdHlwZS5nZXRMZXZlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxldmVsfSxsLnByb3RvdHlwZS5nZXRUZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dH0sbC5wcm90b3R5cGUuZ2V0Q29tcG9uZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcG9uZW50fSxsLnByb3RvdHlwZS53aXRoRXhjZXB0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmV4Y2VwdGlvbj1uZXcgZChlKSx0aGlzfSxsLnByb3RvdHlwZS53aXRoT2JqZWN0PWZ1bmN0aW9uKGUpe3ZhciBuPXQuZGVlcGNvcHkoZSk7cmV0dXJuIHAobiksdGhpcy5vYmplY3RzLnB1c2gobiksdGhpc30sbC5wcm90b3R5cGUud2l0aENyb3NzT3JpZ2luRXZlbnRPYmplY3Q9ZnVuY3Rpb24oZSl7dmFyIG49dC5kZWVwY29weUNyb3NzT3JpZ2luRXZlbnQoZSk7cmV0dXJuIHAobiksdGhpcy5vYmplY3RzLnB1c2gobiksdGhpc30sbC5wcm90b3R5cGUuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5nZXRMb2coKS5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MucHVzaCh0aGlzKSx0aGlzfTt2YXIgaD1mdW5jdGlvbigpe3RoaXMuX2xvZ3M9W10sdGhpcy5fcm9sbGVkTG9ncz1bXSx0aGlzLl9sb2dzVG9QdXNoPVtdLHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzPVtdLHRoaXMuX2VjaG9MZXZlbD1vLklORk8sdGhpcy5fbG9nTGV2ZWw9by5JTkZPLHRoaXMuX2xpbmVDb3VudD0wLHRoaXMuX2xvZ1JvbGxJbnRlcnZhbD0wLHRoaXMuX2xvZ1JvbGxUaW1lcj1udWxsLHRoaXMuX2xvZ2dlcklkPShuZXcgRGF0ZSkuZ2V0VGltZSgpKyItIitNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSx0aGlzLnNldExvZ1JvbGxJbnRlcnZhbCgxOGU1KSx0aGlzLl9zdGFydExvZ0luZGV4VG9QdXNoPTB9O2gucHJvdG90eXBlLnNldExvZ1JvbGxJbnRlcnZhbD1mdW5jdGlvbih0KXt2YXIgbj10aGlzO3RoaXMuX2xvZ1JvbGxUaW1lciYmdD09PXRoaXMuX2xvZ1JvbGxJbnRlcnZhbD90aGlzLndhcm4oIkxvZ2dlciBpcyBhbHJlYWR5IHNldCB0byB0aGUgZ2l2ZW4gaW50ZXJ2YWw6ICVkIix0aGlzLl9sb2dSb2xsSW50ZXJ2YWwpOih0aGlzLl9sb2dSb2xsVGltZXImJmUuY2xlYXJJbnRlcnZhbCh0aGlzLl9sb2dSb2xsVGltZXIpLHRoaXMuX2xvZ1JvbGxJbnRlcnZhbD10LHRoaXMuX2xvZ1JvbGxUaW1lcj1lLnNldEludGVydmFsKChmdW5jdGlvbigpe24uX3JvbGxlZExvZ3M9bi5fbG9ncyxuLl9sb2dzPVtdLG4uX3N0YXJ0TG9nSW5kZXhUb1B1c2g9MCxuLmluZm8oIkxvZyByb2xsIGludGVydmFsIG9jY3VycmVkLiIpfSksdGhpcy5fbG9nUm9sbEludGVydmFsKSl9LGgucHJvdG90eXBlLnNldExvZ0xldmVsPWZ1bmN0aW9uKGUpe2lmKCEoZSBpbiBvKSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gbG9nZ2luZyBsZXZlbDogIitlKTt0aGlzLl9sb2dMZXZlbD1vW2VdfSxoLnByb3RvdHlwZS5zZXRFY2hvTGV2ZWw9ZnVuY3Rpb24oZSl7aWYoIShlIGluIG8pKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBsb2dnaW5nIGxldmVsOiAiK2UpO3RoaXMuX2VjaG9MZXZlbD1vW2VdfSxoLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9bmV3IGwoZSx0LG4sdGhpcy5nZXRMb2dnZXJJZCgpKTtyZXR1cm4gcChyKSx0aGlzLmFkZExvZ0VudHJ5KHIpLHJ9LGgucHJvdG90eXBlLmFkZExvZ0VudHJ5PWZ1bmN0aW9uKGUpe3AoZSksdGhpcy5fbG9ncy5wdXNoKGUpLHIuU09GVFBIT05FPT09ZS5jb21wb25lbnQmJnRoaXMuX2xvZ3NUb1B1c2gucHVzaChlKSxlLmxldmVsIGluIG8mJm9bZS5sZXZlbF0+PXRoaXMuX2xvZ0xldmVsJiYob1tlLmxldmVsXT49dGhpcy5fZWNob0xldmVsJiZjW2UuZ2V0TGV2ZWwoKV0oZS50b1N0cmluZygpKSxlLmxpbmU9dGhpcy5fbGluZUNvdW50KyspfSxoLnByb3RvdHlwZS5zZW5kSW50ZXJuYWxMb2dFbnRyeVRvU2VydmVyPWZ1bmN0aW9uKGUpe3RoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLnB1c2goZSksZS5sZXZlbCBpbiBvJiZvW2UubGV2ZWxdPj10aGlzLl9sb2dMZXZlbCYmKG9bZS5sZXZlbF0+PXRoaXMuX2VjaG9MZXZlbCYmY1tlLmdldExldmVsKCldKGUudG9TdHJpbmcoKSksZS5saW5lPXRoaXMuX2xpbmVDb3VudCsrKX0saC5wcm90b3R5cGUuY2xlYXJPYmplY3RzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9sb2dzLmxlbmd0aDtlKyspdGhpcy5fbG9nc1tlXS5vYmplY3RzJiZkZWxldGUgdGhpcy5fbG9nc1tlXS5vYmplY3RzfSxoLnByb3RvdHlwZS5jbGVhckV4Y2VwdGlvbnM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHRoaXMuX2xvZ3MubGVuZ3RoO2UrKyl0aGlzLl9sb2dzW2VdLmV4Y2VwdGlvbiYmZGVsZXRlIHRoaXMuX2xvZ3NbZV0uZXhjZXB0aW9ufSxoLnByb3RvdHlwZS50cmFjZT1mdW5jdGlvbigpe3ZhciBlPXUoYXJndW1lbnRzKTtyZXR1cm4gdGhpcy53cml0ZShlLmNvbXBvbmVudCxuLlRSQUNFLHQudnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLmRlYnVnPWZ1bmN0aW9uKCl7dmFyIGU9dShhcmd1bWVudHMpO3JldHVybiB0aGlzLndyaXRlKGUuY29tcG9uZW50LG4uREVCVUcsdC52c3ByaW50ZihlLmZvcm1hdCxlLmFyZ3MpKX0saC5wcm90b3R5cGUuaW5mbz1mdW5jdGlvbigpe3ZhciBlPXUoYXJndW1lbnRzKTtyZXR1cm4gdGhpcy53cml0ZShlLmNvbXBvbmVudCxuLklORk8sdC52c3ByaW50ZihlLmZvcm1hdCxlLmFyZ3MpKX0saC5wcm90b3R5cGUubG9nPWZ1bmN0aW9uKCl7dmFyIGU9dShhcmd1bWVudHMpO3JldHVybiB0aGlzLndyaXRlKGUuY29tcG9uZW50LG4uTE9HLHQudnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLnRlc3Q9ZnVuY3Rpb24oKXt2YXIgZT11KGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMud3JpdGUoZS5jb21wb25lbnQsbi5URVNULHQudnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLndhcm49ZnVuY3Rpb24oKXt2YXIgZT11KGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMud3JpdGUoZS5jb21wb25lbnQsbi5XQVJOLHQudnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLmVycm9yPWZ1bmN0aW9uKCl7dmFyIGU9dShhcmd1bWVudHMpO3JldHVybiB0aGlzLndyaXRlKGUuY29tcG9uZW50LG4uRVJST1IsdC52c3ByaW50ZihlLmZvcm1hdCxlLmFyZ3MpKX0saC5wcm90b3R5cGUuY3JpdGljYWw9ZnVuY3Rpb24oKXt2YXIgZT11KGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMud3JpdGUoZS5jb21wb25lbnQsbi5FUlJPUix0LnZzcHJpbnRmKGUuZm9ybWF0LGUuYXJncykpfSxoLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PTA7dDx0aGlzLl9sb2dzLmxlbmd0aDt0KyspZS5wdXNoKHRoaXMuX2xvZ3NbdF0udG9TdHJpbmcoKSk7cmV0dXJuIGUuam9pbigiXG4iKX0saC5wcm90b3R5cGUuZG93bmxvYWQ9ZnVuY3Rpb24odCl7dmFyIG49ImFnZW50LWxvZyIscj0hMTsib2JqZWN0Ij09dHlwZW9mIHQ/KG49dC5sb2dOYW1lfHxuLHI9dC5maWx0ZXJCeUxvZ0xldmVsfHxyKToic3RyaW5nIj09dHlwZW9mIHQmJihuPXR8fG4pO3ZhciBpPXRoaXMscz10aGlzLl9yb2xsZWRMb2dzLmNvbmNhdCh0aGlzLl9sb2dzKTtyJiYocz1zLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIG9bZS5sZXZlbF0+PWkuX2xvZ0xldmVsfSkpKTt2YXIgYT1uZXcgZS5CbG9iKFtKU09OLnN0cmluZ2lmeShzLHZvaWQgMCw0KV0sWyJ0ZXh0L3BsYWluIl0pLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO249bnx8ImFnZW50LWxvZyIsYy5ocmVmPWUuVVJMLmNyZWF0ZU9iamVjdFVSTChhKSxjLmRvd25sb2FkPW4rIi50eHQiLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYyksYy5jbGljaygpLGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYyl9LGgucHJvdG90eXBlLnNjaGVkdWxlVXBzdHJlYW1Mb2dQdXNoPWZ1bmN0aW9uKG4pe3QudXBzdHJlYW1Mb2dQdXNoU2NoZWR1bGVkfHwodC51cHN0cmVhbUxvZ1B1c2hTY2hlZHVsZWQ9ITAsZS5zZXRJbnRlcnZhbCh0LmhpdGNoKHRoaXMsdGhpcy5yZXBvcnRNYXN0ZXJMb2dzVXBTdHJlYW0sbiksNWUzKSl9LGgucHJvdG90eXBlLnJlcG9ydE1hc3RlckxvZ3NVcFN0cmVhbT1mdW5jdGlvbihlKXt2YXIgbj10aGlzLl9sb2dzVG9QdXNoLnNsaWNlKCk7dGhpcy5fbG9nc1RvUHVzaD1bXSx0LmlmTWFzdGVyKHQuTWFzdGVyVG9waWNzLlNFTkRfTE9HUywoZnVuY3Rpb24oKXtuLmxlbmd0aD4wJiZlLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5TRU5EX0xPR1Msbil9KSl9LGgucHJvdG90eXBlLnNjaGVkdWxlVXBzdHJlYW1PdXRlckNvbnRleHRDQ1BzZXJ2ZXJCb3VuZExvZ3NQdXNoPWZ1bmN0aW9uKG4pe2Uuc2V0SW50ZXJ2YWwodC5oaXRjaCh0aGlzLHRoaXMucHVzaE91dGVyQ29udGV4dENDUHNlcnZlckJvdW5kTG9nc1Vwc3RyZWFtLG4pLDFlMyl9LGgucHJvdG90eXBlLnNjaGVkdWxlVXBzdHJlYW1PdXRlckNvbnRleHRDQ1BMb2dzUHVzaD1mdW5jdGlvbihuKXtlLnNldEludGVydmFsKHQuaGl0Y2godGhpcyx0aGlzLnB1c2hPdXRlckNvbnRleHRDQ1BMb2dzVXBzdHJlYW0sbiksMWUzKX0saC5wcm90b3R5cGUucHVzaE91dGVyQ29udGV4dENDUHNlcnZlckJvdW5kTG9nc1Vwc3RyZWFtPWZ1bmN0aW9uKGUpe2lmKHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLmxlbmd0aD4wKXtmb3IodmFyIG49MDtuPHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLmxlbmd0aDtuKyspdGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3Nbbl0udGV4dD10aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9nc1tuXS50ZXh0O2Uuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLlNFUlZFUl9CT1VORF9JTlRFUk5BTF9MT0csdGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MpLHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzPVtdfX0saC5wcm90b3R5cGUucHVzaE91dGVyQ29udGV4dENDUExvZ3NVcHN0cmVhbT1mdW5jdGlvbihlKXtmb3IodmFyIG49dGhpcy5fc3RhcnRMb2dJbmRleFRvUHVzaDtuPHRoaXMuX2xvZ3MubGVuZ3RoO24rKyl0aGlzLl9sb2dzW25dLmxvZ2dlcklkPT09dGhpcy5fbG9nZ2VySWQmJmUuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkxPRyx0aGlzLl9sb2dzW25dKTt0aGlzLl9zdGFydExvZ0luZGV4VG9QdXNoPXRoaXMuX2xvZ3MubGVuZ3RofSxoLnByb3RvdHlwZS5nZXRMb2dnZXJJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb2dnZXJJZH0saC5wcm90b3R5cGUuc2NoZWR1bGVEb3duc3RyZWFtQ2xpZW50U2lkZUxvZ3NQdXNoPWZ1bmN0aW9uKCl7ZS5zZXRJbnRlcnZhbCh0LmhpdGNoKHRoaXMsdGhpcy5wdXNoQ2xpZW50U2lkZUxvZ3NEb3duc3RyZWFtKSw1ZTMpfSxoLnByb3RvdHlwZS5wdXNoQ2xpZW50U2lkZUxvZ3NEb3duc3RyZWFtPWZ1bmN0aW9uKCl7dmFyIGU9W107dGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MubGVuZ3RoPDUwfHwodGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MubGVuZ3RoPjUwMD9lPXRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLnNwbGljZSgwLDUwMCk6KGU9dGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MsdGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3M9W10pLHQucHVibGlzaENsaWVudFNpZGVMb2dzKGUpKX07dmFyIGY9ZnVuY3Rpb24obil7aC5jYWxsKHRoaXMpLHRoaXMuY29uZHVpdD1uLGUuc2V0SW50ZXJ2YWwodC5oaXRjaCh0aGlzLHRoaXMuX3B1c2hMb2dzRG93bnN0cmVhbSksZi5MT0dfUFVTSF9JTlRFUlZBTCksZS5jbGVhckludGVydmFsKHRoaXMuX2xvZ1JvbGxUaW1lciksdGhpcy5fbG9nUm9sbFRpbWVyPW51bGx9O2YuTE9HX1BVU0hfSU5URVJWQUw9MWUzLGYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoaC5wcm90b3R5cGUpLGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPWYsZi5wcm90b3R5cGUucHVzaExvZ3NEb3duc3RyZWFtPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuTE9HLGUpfSkpfSxmLnByb3RvdHlwZS5fcHVzaExvZ3NEb3duc3RyZWFtPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9sb2dzLmZvckVhY2goKGZ1bmN0aW9uKG4pe2UuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5MT0csbil9KSksdGhpcy5fbG9ncz1bXTtmb3IodmFyIG49MDtuPHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLmxlbmd0aDtuKyspdGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLlNFUlZFUl9CT1VORF9JTlRFUk5BTF9MT0csdGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3Nbbl0pO3RoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzPVtdfTt2YXIgZz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfWNhdGNoKGUpe2MuRVJST1IoZSl9fX07dC5yb290TG9nZ2VyPW5ldyBoLGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiBlKSJmdW5jdGlvbiI9PXR5cGVvZiBlW3RdJiYoZVt0XT1nKGVbdF0pKX0odC5yb290TG9nZ2VyKSwodD10fHx7fSkuZ2V0TG9nPWZ1bmN0aW9uKCl7cmV0dXJuIHQucm9vdExvZ2dlcn0sdC5Mb2dFbnRyeT1sLHQuTG9nZ2VyPWgsdC5Mb2dMZXZlbD1uLHQuTG9nQ29tcG9uZW50PXIsdC5Eb3duc3RyZWFtQ29uZHVpdExvZ2dlcj1mfSgpfSwxNjM6ZnVuY3Rpb24oKXshZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLHQpe3ZhciBuPSg2NTUzNSZlKSsoNjU1MzUmdCk7cmV0dXJuKGU+PjE2KSsodD4+MTYpKyhuPj4xNik8PDE2fDY1NTM1Jm59ZnVuY3Rpb24gbihlLG4scixvLGkscyl7cmV0dXJuIHQoKGE9dCh0KG4sZSksdChvLHMpKSk8PChjPWkpfGE+Pj4zMi1jLHIpO3ZhciBhLGN9ZnVuY3Rpb24gcihlLHQscixvLGkscyxhKXtyZXR1cm4gbih0JnJ8fnQmbyxlLHQsaSxzLGEpfWZ1bmN0aW9uIG8oZSx0LHIsbyxpLHMsYSl7cmV0dXJuIG4odCZvfHImfm8sZSx0LGkscyxhKX1mdW5jdGlvbiBpKGUsdCxyLG8saSxzLGEpe3JldHVybiBuKHRecl5vLGUsdCxpLHMsYSl9ZnVuY3Rpb24gcyhlLHQscixvLGkscyxhKXtyZXR1cm4gbihyXih0fH5vKSxlLHQsaSxzLGEpfWZ1bmN0aW9uIGEoZSxuKXt2YXIgYSxjLHUsbCxwO2Vbbj4+NV18PTEyODw8biUzMixlWzE0KyhuKzY0Pj4+OTw8NCldPW47dmFyIGQ9MTczMjU4NDE5MyxoPS0yNzE3MzM4NzksZj0tMTczMjU4NDE5NCxnPTI3MTczMzg3ODtmb3IoYT0wO2E8ZS5sZW5ndGg7YSs9MTYpYz1kLHU9aCxsPWYscD1nLGQ9cihkLGgsZixnLGVbYV0sNywtNjgwODc2OTM2KSxnPXIoZyxkLGgsZixlW2ErMV0sMTIsLTM4OTU2NDU4NiksZj1yKGYsZyxkLGgsZVthKzJdLDE3LDYwNjEwNTgxOSksaD1yKGgsZixnLGQsZVthKzNdLDIyLC0xMDQ0NTI1MzMwKSxkPXIoZCxoLGYsZyxlW2ErNF0sNywtMTc2NDE4ODk3KSxnPXIoZyxkLGgsZixlW2ErNV0sMTIsMTIwMDA4MDQyNiksZj1yKGYsZyxkLGgsZVthKzZdLDE3LC0xNDczMjMxMzQxKSxoPXIoaCxmLGcsZCxlW2ErN10sMjIsLTQ1NzA1OTgzKSxkPXIoZCxoLGYsZyxlW2ErOF0sNywxNzcwMDM1NDE2KSxnPXIoZyxkLGgsZixlW2ErOV0sMTIsLTE5NTg0MTQ0MTcpLGY9cihmLGcsZCxoLGVbYSsxMF0sMTcsLTQyMDYzKSxoPXIoaCxmLGcsZCxlW2ErMTFdLDIyLC0xOTkwNDA0MTYyKSxkPXIoZCxoLGYsZyxlW2ErMTJdLDcsMTgwNDYwMzY4MiksZz1yKGcsZCxoLGYsZVthKzEzXSwxMiwtNDAzNDExMDEpLGY9cihmLGcsZCxoLGVbYSsxNF0sMTcsLTE1MDIwMDIyOTApLGQ9byhkLGg9cihoLGYsZyxkLGVbYSsxNV0sMjIsMTIzNjUzNTMyOSksZixnLGVbYSsxXSw1LC0xNjU3OTY1MTApLGc9byhnLGQsaCxmLGVbYSs2XSw5LC0xMDY5NTAxNjMyKSxmPW8oZixnLGQsaCxlW2ErMTFdLDE0LDY0MzcxNzcxMyksaD1vKGgsZixnLGQsZVthXSwyMCwtMzczODk3MzAyKSxkPW8oZCxoLGYsZyxlW2ErNV0sNSwtNzAxNTU4NjkxKSxnPW8oZyxkLGgsZixlW2ErMTBdLDksMzgwMTYwODMpLGY9byhmLGcsZCxoLGVbYSsxNV0sMTQsLTY2MDQ3ODMzNSksaD1vKGgsZixnLGQsZVthKzRdLDIwLC00MDU1Mzc4NDgpLGQ9byhkLGgsZixnLGVbYSs5XSw1LDU2ODQ0NjQzOCksZz1vKGcsZCxoLGYsZVthKzE0XSw5LC0xMDE5ODAzNjkwKSxmPW8oZixnLGQsaCxlW2ErM10sMTQsLTE4NzM2Mzk2MSksaD1vKGgsZixnLGQsZVthKzhdLDIwLDExNjM1MzE1MDEpLGQ9byhkLGgsZixnLGVbYSsxM10sNSwtMTQ0NDY4MTQ2NyksZz1vKGcsZCxoLGYsZVthKzJdLDksLTUxNDAzNzg0KSxmPW8oZixnLGQsaCxlW2ErN10sMTQsMTczNTMyODQ3MyksZD1pKGQsaD1vKGgsZixnLGQsZVthKzEyXSwyMCwtMTkyNjYwNzczNCksZixnLGVbYSs1XSw0LC0zNzg1NTgpLGc9aShnLGQsaCxmLGVbYSs4XSwxMSwtMjAyMjU3NDQ2MyksZj1pKGYsZyxkLGgsZVthKzExXSwxNiwxODM5MDMwNTYyKSxoPWkoaCxmLGcsZCxlW2ErMTRdLDIzLC0zNTMwOTU1NiksZD1pKGQsaCxmLGcsZVthKzFdLDQsLTE1MzA5OTIwNjApLGc9aShnLGQsaCxmLGVbYSs0XSwxMSwxMjcyODkzMzUzKSxmPWkoZixnLGQsaCxlW2ErN10sMTYsLTE1NTQ5NzYzMiksaD1pKGgsZixnLGQsZVthKzEwXSwyMywtMTA5NDczMDY0MCksZD1pKGQsaCxmLGcsZVthKzEzXSw0LDY4MTI3OTE3NCksZz1pKGcsZCxoLGYsZVthXSwxMSwtMzU4NTM3MjIyKSxmPWkoZixnLGQsaCxlW2ErM10sMTYsLTcyMjUyMTk3OSksaD1pKGgsZixnLGQsZVthKzZdLDIzLDc2MDI5MTg5KSxkPWkoZCxoLGYsZyxlW2ErOV0sNCwtNjQwMzY0NDg3KSxnPWkoZyxkLGgsZixlW2ErMTJdLDExLC00MjE4MTU4MzUpLGY9aShmLGcsZCxoLGVbYSsxNV0sMTYsNTMwNzQyNTIwKSxkPXMoZCxoPWkoaCxmLGcsZCxlW2ErMl0sMjMsLTk5NTMzODY1MSksZixnLGVbYV0sNiwtMTk4NjMwODQ0KSxnPXMoZyxkLGgsZixlW2ErN10sMTAsMTEyNjg5MTQxNSksZj1zKGYsZyxkLGgsZVthKzE0XSwxNSwtMTQxNjM1NDkwNSksaD1zKGgsZixnLGQsZVthKzVdLDIxLC01NzQzNDA1NSksZD1zKGQsaCxmLGcsZVthKzEyXSw2LDE3MDA0ODU1NzEpLGc9cyhnLGQsaCxmLGVbYSszXSwxMCwtMTg5NDk4NjYwNiksZj1zKGYsZyxkLGgsZVthKzEwXSwxNSwtMTA1MTUyMyksaD1zKGgsZixnLGQsZVthKzFdLDIxLC0yMDU0OTIyNzk5KSxkPXMoZCxoLGYsZyxlW2ErOF0sNiwxODczMzEzMzU5KSxnPXMoZyxkLGgsZixlW2ErMTVdLDEwLC0zMDYxMTc0NCksZj1zKGYsZyxkLGgsZVthKzZdLDE1LC0xNTYwMTk4MzgwKSxoPXMoaCxmLGcsZCxlW2ErMTNdLDIxLDEzMDkxNTE2NDkpLGQ9cyhkLGgsZixnLGVbYSs0XSw2LC0xNDU1MjMwNzApLGc9cyhnLGQsaCxmLGVbYSsxMV0sMTAsLTExMjAyMTAzNzkpLGY9cyhmLGcsZCxoLGVbYSsyXSwxNSw3MTg3ODcyNTkpLGg9cyhoLGYsZyxkLGVbYSs5XSwyMSwtMzQzNDg1NTUxKSxkPXQoZCxjKSxoPXQoaCx1KSxmPXQoZixsKSxnPXQoZyxwKTtyZXR1cm5bZCxoLGYsZ119ZnVuY3Rpb24gYyhlKXt2YXIgdCxuPSIiLHI9MzIqZS5sZW5ndGg7Zm9yKHQ9MDt0PHI7dCs9OCluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbdD4+NV0+Pj50JTMyJjI1NSk7cmV0dXJuIG59ZnVuY3Rpb24gdShlKXt2YXIgdCxuPVtdO2ZvcihuWyhlLmxlbmd0aD4+MiktMV09dm9pZCAwLHQ9MDt0PG4ubGVuZ3RoO3QrPTEpblt0XT0wO3ZhciByPTgqZS5sZW5ndGg7Zm9yKHQ9MDt0PHI7dCs9OCluW3Q+PjVdfD0oMjU1JmUuY2hhckNvZGVBdCh0LzgpKTw8dCUzMjtyZXR1cm4gbn1mdW5jdGlvbiBsKGUpe3ZhciB0LG4scj0iMDEyMzQ1Njc4OWFiY2RlZiIsbz0iIjtmb3Iobj0wO248ZS5sZW5ndGg7bis9MSl0PWUuY2hhckNvZGVBdChuKSxvKz1yLmNoYXJBdCh0Pj4+NCYxNSkrci5jaGFyQXQoMTUmdCk7cmV0dXJuIG99ZnVuY3Rpb24gcChlKXtyZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUpKX1mdW5jdGlvbiBkKGUpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gYyhhKHUoZSksOCplLmxlbmd0aCkpfShwKGUpKX1mdW5jdGlvbiBoKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7dmFyIG4scixvPXUoZSksaT1bXSxzPVtdO2ZvcihpWzE1XT1zWzE1XT12b2lkIDAsby5sZW5ndGg+MTYmJihvPWEobyw4KmUubGVuZ3RoKSksbj0wO248MTY7bis9MSlpW25dPTkwOTUyMjQ4Nl5vW25dLHNbbl09MTU0OTU1NjgyOF5vW25dO3JldHVybiByPWEoaS5jb25jYXQodSh0KSksNTEyKzgqdC5sZW5ndGgpLGMoYShzLmNvbmNhdChyKSw2NDApKX0ocChlKSxwKHQpKX0odGhpc3x8Z2xvYmFsVGhpcykubWQ1PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdD9uP2godCxlKTpsKGgodCxlKSk6bj9kKGUpOmwoZChlKSl9fSgpfSw0Mzk6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCx0LkNoYXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oZSxuKXt2YXIgcj10LmdldExvZygpLG89dC5Mb2dDb21wb25lbnQuQ0hBVCxpPWZ1bmN0aW9uKG4scil7dC5wdWJsaXNoTWV0cmljKHtuYW1lOm4sY29udGFjdElkOmUuY29udGFjdElkLGRhdGE6cnx8ZX0pfSxzPWZ1bmN0aW9uKGUpe2Uub25Db25uZWN0aW9uQnJva2VuKChmdW5jdGlvbihlKXtyLmVycm9yKG8sIkNoYXQgU2Vzc2lvbiBjb25uZWN0aW9uIGJyb2tlbiIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKCJDaGF0IFNlc3Npb24gY29ubmVjdGlvbiBicm9rZW4iLGUpfSkpLGUub25Db25uZWN0aW9uRXN0YWJsaXNoZWQoKGZ1bmN0aW9uKGUpe3IuaW5mbyhvLCJDaGF0IFNlc3Npb24gY29ubmVjdGlvbiBlc3RhYmxpc2hlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKCJDaGF0IFNlc3Npb24gY29ubmVjdGlvbiBlc3RhYmxpc2hlZCIsZSl9KSl9O3JldHVybntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXtpKCJDaGF0IG1lZGlhIGNvbnRyb2xsZXIgaW5pdCIsZS5jb250YWN0SWQpLHIuaW5mbyhvLCJDaGF0IG1lZGlhIGNvbnRyb2xsZXIgaW5pdCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LkNoYXRTZXNzaW9uLnNldEdsb2JhbENvbmZpZyh7bG9nZ2VyQ29uZmlnOntsb2dnZXI6cn0scmVnaW9uOm4ucmVnaW9ufSk7dmFyIGE9dC5DaGF0U2Vzc2lvbi5jcmVhdGUoe2NoYXREZXRhaWxzOmUsdHlwZToiQUdFTlQiLHdlYnNvY2tldE1hbmFnZXI6dC5jb3JlLmdldFdlYlNvY2tldE1hbmFnZXIoKX0pO3JldHVybiBzKGEpLGEuY29ubmVjdCgpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiByLmluZm8obywiQ2hhdCBTZXNzaW9uIFN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZCBmb3IgY29udGFjdElkICVzIixlLmNvbnRhY3RJZCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKCJDaGF0IFNlc3Npb24gU3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkIixlLmNvbnRhY3RJZCksYX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7dGhyb3cgci5lcnJvcihvLCJDaGF0IFNlc3Npb24gZXN0YWJsaXNoZW1lbnQgZmFpbGVkIGZvciBjb250YWN0ICVzIixlLmNvbnRhY3RJZCkud2l0aEV4Y2VwdGlvbih0KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkoIkNoYXQgU2Vzc2lvbiBlc3RhYmxpc2hlbWVudCBmYWlsZWQiLGUuY29udGFjdElkLHQpLHR9KSl9KCl9fX19KCl9LDI3OTooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LHQuTWVkaWFGYWN0b3J5PWZ1bmN0aW9uKGUpe3ZhciBuPXt9LHI9bmV3IFNldCxvPXQuZ2V0TG9nKCksaT10LkxvZ0NvbXBvbmVudC5DSEFULHM9dC5tZXJnZSh7fSxlKXx8e307cy5yZWdpb249cy5yZWdpb258fCJ1cy13ZXN0LTIiO3ZhciBhPWZ1bmN0aW9uKGUpe25bZV0mJiFyLmhhcyhlKSYmKG8uaW5mbyhpLCJEZXN0cm95aW5nIG1lZGlhQ29udHJvbGxlciBmb3IgJXMiLGUpLHIuYWRkKGUpLG5bZV0udGhlbigoZnVuY3Rpb24odCl7ImZ1bmN0aW9uIj09dHlwZW9mIHQuY2xlYW5VcCYmdC5jbGVhblVwKCksZGVsZXRlIG5bZV0sci5kZWxldGUoZSl9KSkuY2F0Y2goKGZ1bmN0aW9uKCl7ZGVsZXRlIG5bZV0sci5kZWxldGUoZSl9KSkpfTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5pc0FjdGl2ZSgpfShlKT9mdW5jdGlvbihlKXt2YXIgcj1lLmdldENvbm5lY3Rpb25JZCgpO2lmKCFlLmdldE1lZGlhSW5mbygpKXJldHVybiBvLmVycm9yKGksIk1lZGlhIGluZm8gZG9lcyBub3QgZXhpc3QgZm9yIGEgbWVkaWEgdHlwZSAlcyIsZS5nZXRNZWRpYVR5cGUoKSkud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLFByb21pc2UucmVqZWN0KCJNZWRpYSBpbmZvIGRvZXMgbm90IGV4aXN0IGZvciB0aGlzIGNvbm5lY3Rpb24iKTtpZihuW3JdKXJldHVybiBuW3JdO3N3aXRjaChvLmluZm8oaSwibWVkaWEgY29udHJvbGxlciBvZiB0eXBlICVzIGluaXQiLGUuZ2V0TWVkaWFUeXBlKCkpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxlLmdldE1lZGlhVHlwZSgpKXtjYXNlIHQuTWVkaWFUeXBlLkNIQVQ6cmV0dXJuIG5bcl09bmV3IHQuQ2hhdE1lZGlhQ29udHJvbGxlcihlLmdldE1lZGlhSW5mbygpLHMpLmdldCgpO2Nhc2UgdC5NZWRpYVR5cGUuU09GVFBIT05FOnJldHVybiBuW3JdPW5ldyB0LlNvZnRwaG9uZU1lZGlhQ29udHJvbGxlcihlLmdldE1lZGlhSW5mbygpKS5nZXQoKTtjYXNlIHQuTWVkaWFUeXBlLlRBU0s6cmV0dXJuIG5bcl09bmV3IHQuVGFza01lZGlhQ29udHJvbGxlcihlLmdldE1lZGlhSW5mbygpKS5nZXQoKTtkZWZhdWx0OnJldHVybiBvLmVycm9yKGksIlVucmVjb2duaXplZCBtZWRpYSB0eXBlICVzICIsZS5nZXRNZWRpYVR5cGUoKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxQcm9taXNlLnJlamVjdCgpfX0oZSk6KGEoZS5nZXRDb25uZWN0aW9uSWQoKSksUHJvbWlzZS5yZWplY3QoIk1lZGlhIENvbnRyb2xsZXIgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSBmb3IgdGhpcyBjb25uZWN0aW9uIikpfSxkZXN0cm95OmF9fX0oKX0sNDE4OigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsdC5Tb2Z0cGhvbmVNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oZSl7cmV0dXJue2dldDpmdW5jdGlvbigpe3JldHVybiBQcm9taXNlLnJlc29sdmUoZSl9fX19KCl9LDE4NzooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LHQuVGFza01lZGlhQ29udHJvbGxlcj1mdW5jdGlvbihlKXt2YXIgbj10LmdldExvZygpLHI9dC5Mb2dDb21wb25lbnQuVEFTSyxvPWZ1bmN0aW9uKG4scil7dC5wdWJsaXNoTWV0cmljKHtuYW1lOm4sY29udGFjdElkOmUuY29udGFjdElkLGRhdGE6cnx8ZX0pfSxpPWZ1bmN0aW9uKGUpe2Uub25Db25uZWN0aW9uQnJva2VuKChmdW5jdGlvbihlKXtuLmVycm9yKHIsIlRhc2sgU2Vzc2lvbiBjb25uZWN0aW9uIGJyb2tlbiIpLndpdGhFeGNlcHRpb24oZSksbygiVGFzayBTZXNzaW9uIGNvbm5lY3Rpb24gYnJva2VuIixlKX0pKSxlLm9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKChmdW5jdGlvbihlKXtuLmluZm8ociwiVGFzayBTZXNzaW9uIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQiKS53aXRoT2JqZWN0KGUpLG8oIlRhc2sgU2Vzc2lvbiBjb25uZWN0aW9uIGVzdGFibGlzaGVkIixlKX0pKX07cmV0dXJue2dldDpmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe28oIlRhc2sgbWVkaWEgY29udHJvbGxlciBpbml0IixlLmNvbnRhY3RJZCksbi5pbmZvKHIsIlRhc2sgbWVkaWEgY29udHJvbGxlciBpbml0Iikud2l0aE9iamVjdChlKTt2YXIgcz10LlRhc2tTZXNzaW9uLmNyZWF0ZSh7Y29udGFjdElkOmUuY29udGFjdElkLGluaXRpYWxDb250YWN0SWQ6ZS5pbml0aWFsQ29udGFjdElkLHdlYnNvY2tldE1hbmFnZXI6dC5jb3JlLmdldFdlYlNvY2tldE1hbmFnZXIoKX0pO3JldHVybiBpKHMpLHMuY29ubmVjdCgpLnRoZW4oKGZ1bmN0aW9uKCl7cmV0dXJuIG4uaW5mbyhyLCJUYXNrIFNlc3Npb24gU3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkIGZvciBjb250YWN0SWQgJXMiLGUuY29udGFjdElkKSxvKCJUYXNrIFNlc3Npb24gU3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkIixlLmNvbnRhY3RJZCksc30pKS5jYXRjaCgoZnVuY3Rpb24odCl7dGhyb3cgbi5lcnJvcihyLCJUYXNrIFNlc3Npb24gZXN0YWJsaXNoZW1lbnQgZmFpbGVkIGZvciBjb250YWN0ICVzIixlLmNvbnRhY3RJZCkud2l0aEV4Y2VwdGlvbih0KSxvKCJDaGF0IFNlc3Npb24gZXN0YWJsaXNoZW1lbnQgZmFpbGVkIixlLmNvbnRhY3RJZCx0KSx0fSkpfSgpfX19fSgpfSwxNjE6KCk9PnshZnVuY3Rpb24oKXtjb25zdCBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10O2NvbnN0IG49Ii9yZXF1ZXN0LXN0b3JhZ2UtYWNjZXNzIixyPXtjYW5SZXF1ZXN0OiExLG1vZGU6ImRlZmF1bHQiLGN1c3RvbTp7aGlkZUNDUDohMH19O2xldCBvLGk9e30scz0iIixhPW51bGwsYz0hMTtjb25zdCB1PXtJTklUOiJzdG9yYWdlQWNjZXNzOjppbml0IixHUkFOVEVEOiJzdG9yYWdlQWNjZXNzOjpncmFudGVkIixERU5JRUQ6InN0b3JhZ2VBY2Nlc3M6OmRlbmllZCIsUkVRVUVTVDoic3RvcmFnZUFjY2Vzczo6cmVxdWVzdCJ9LGw9KCk9Pih7c2hvdzooKT0+e2Euc3R5bGUuZGlzcGxheT0iYmxvY2sifSxoaWRlOigpPT57YS5zdHlsZS5kaXNwbGF5PSJub25lIn19KSxwPSgpPT5pJiYiY3VzdG9tIj09PWkubW9kZSxkPWU9PmUubWF0Y2goLy5jb25uZWN0LmF3cy5hMnouY29tfC5teS5jb25uZWN0LmF3c3wuZ292Y2xvdWQuY29ubmVjdC5hd3N8LmF3c2FwcHMuY29tLyksaD1lPT57Y29uc3R7b3JpZ2luOnQscGF0aG5hbWU6cn09bmV3IFVSTChlKTtpZih0Lm1hdGNoKC8uYXdzYXBwcy5jb20vKSl7bGV0IGU9ImNvbm5lY3QiO3JldHVybiByLnN0YXJ0c1dpdGgoIi9jb25uZWN0LWdhbW1hIikmJihlPSJjb25uZWN0LWdhbW1hIiksYCR7dH0vJHtlfSR7bn1gfXJldHVybmAke3R9JHtufWB9LGY9ZT0+ZS5tYXRjaCgvXmh0dHBzPzpcL1wvbG9jYWxob3N0LyksZz0oKT0+e2lmKCFzKXRocm93IG5ldyBFcnJvcigiW1N0b3JhZ2VBY2Nlc3NdIFtnZXRsYW5kQXRQYXRoXSBJbnZva2UgY29ubmVjdC5zdG9yYWdlQWNjZXNzLmluaXQgZmlyc3QiKTtpZihkKHMpfHxmKHMpKXtjb25zdHtwYXRobmFtZTplfT1uZXcgVVJMKHMpO3JldHVybiBlfXJldHVybiIvY29ubmVjdC9jY3AtdjIifSxtPSh7b25Jbml0OmUsb25EZW55Om4sb25HcmFudDpyfSk9PntmdW5jdGlvbiBvKHtkYXRhOmksc291cmNlOnN9KXtpZih0LmNvcmUuX2dldENDUElmcmFtZSgpLmNvbnRlbnRXaW5kb3chPT1zKXJldHVybiExO3N3aXRjaCh0LmNvcmUuaW5pdGlhbGl6ZWQmJndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixvKSxpLmV2ZW50KXtjYXNlIHUuSU5JVDp0LmdldExvZygpLmluZm8oIltTdG9yYWdlQWNjZXNzXVtJTklUXSBtZXNzYWdlIHJlY2lldmVkIikud2l0aE9iamVjdChpKSxlJiZlKGkpO2JyZWFrO2Nhc2UgdS5HUkFOVEVEOnQuZ2V0TG9nKCkuaW5mbygiW1N0b3JhZ2VBY2Nlc3NdW0dSQU5URURdIG1lc3NhZ2UgcmVjaWV2ZWQiKS53aXRoT2JqZWN0KGkpLHImJnIoaSk7YnJlYWs7Y2FzZSB1LkRFTklFRDp0LmdldExvZygpLmluZm8oIltTdG9yYWdlQWNjZXNzXVtERU5JRURdIG1lc3NhZ2UgcmVjaWV2ZWQiKS53aXRoT2JqZWN0KGkpLG4mJm4oaSk7YnJlYWs7ZGVmYXVsdDp0LmNvcmUuaW5pdGlhbGl6ZWQmJndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixvKX19cmV0dXJuIGkuY2FuUmVxdWVzdCYmd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG8pLHt1bnN1YnNjcmliZTooKT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixvKX19fTt0LnN0b3JhZ2VBY2Nlc3M9T2JqZWN0LmZyZWV6ZSh7Y2FuUmVxdWVzdDooKT0+aS5jYW5SZXF1ZXN0LG9wdE91dEZyb21SZXF1ZXN0QWNjZXNzOigpPT57ci5jYW5SZXF1ZXN0PSExfSxvcHRJbkZvclJlcXVlc3RBY2Nlc3M6KCk9PntyLmNhblJlcXVlc3Q9ITB9LGluaXQ6KGUsbixvPXt9KT0+e3QuYXNzZXJ0Tm90TnVsbChlLCJjY3BVcmwiKSx0LmFzc2VydE5vdE51bGwobiwiY29udGFpbmVyIiksYT1uLHM9ZSwoKGU9e30pPT57ZS5jdXN0b209ZS5jdXN0b218fHt9LGk9ey4uLnIsLi4uZSxjdXN0b206ey4uLnIuY3VzdG9tLC4uLmUuY3VzdG9tfX0saS5jYW5SZXF1ZXN0PSEoImZhbHNlIj09PWkuY2FuUmVxdWVzdHx8ITE9PT1pLmNhblJlcXVlc3QpfSkobyksdC5nZXRMb2coKS5pbmZvKGBbU3RvcmFnZUFjY2Vzc11baW5pdF0gUmVxdWVzdCBTdG9yYWdlIEFjY2Nlc3MgaW5pdCBjYWxsZWQgd2l0aCBjY3BVcmwgLSAke2V9IC0gJHtpLmNhblJlcXVlc3Q/IlByb2NlZWRpbmcgd2l0aCByZXF1ZXN0aW5nIHN0b3JhZ2UgYWNjZXNzIjoidXNlciBoYXMgb3B0ZWQgb3V0LCBza2lwcGluZyByZXF1ZXN0IHN0b3JhZ2UgYWNjZXNzIn1gKS53aXRoT2JqZWN0KGkpfSxzZXR1cFJlcXVlc3RIYW5kbGVyczooe29uR3JhbnQ6ZX0pPT57byYmby51bnN1YnNjcmliZSgpLG89bSh7b25Jbml0OmU9Pntjb25zb2xlLmxvZygiJWNbU3RvcmFnZUFjY2Vzc11bSU5JVF0iLCJiYWNrZ3JvdW5kOnllbGxvdzsgY29sb3I6YmxhY2s7IGZvbnQtc2l6ZTpsYXJnZSIpLHQuZ2V0TG9nKCkuaW5mbygiW1N0b3JhZ2VBY2Nlc3NdW29uSW5pdF0gY2FsbGJhY2sgZXhlY3V0ZWQiKS53aXRoT2JqZWN0KGU/LmRhdGEpLCFlPy5kYXRhLmhhc0FjY2VzcyYmcCgpJiZsKCkuc2hvdygpfSxvbkRlbnk6KCk9Pntjb25zb2xlLmxvZygiJWNbU3RvcmFnZUFjY2Vzc11bREVOSUVEXSIsImJhY2tncm91bmQ6cmVkOyBjb2xvcjpibGFjazsgZm9udC1zaXplOmxhcmdlIiksdC5nZXRMb2coKS5pbmZvKCJbU3RvcmFnZUFjY2Vzc11bb25EZW55XSBjYWxsYmFjayBleGVjdXRlZCIpLHAoKSYmbCgpLnNob3coKX0sb25HcmFudDooKT0+e2NvbnNvbGUubG9nKCIlY1tTdG9yYWdlQWNjZXNzXVtHUkFOVEVEXSIsImJhY2tncm91bmQ6bGltZTsgY29sb3I6YmxhY2s7IGZvbnQtc2l6ZTpsYXJnZSIpLHQuZ2V0TG9nKCkuaW5mbygiW1N0b3JhZ2VBY2Nlc3NdW29uR3JhbnRdIGNhbGxiYWNrIGV4ZWN1dGVkIikscCgpJiZpPy5jdXN0b20/LmhpZGVDQ1AmJmwoKS5oaWRlKCksY3x8KGUoKSxjPSEwKX19KX0sZ2V0UmVxdWVzdFN0b3JhZ2VBY2Nlc3NVcmw6KCk9PntpZighcyl0aHJvdyBuZXcgRXJyb3IoIltTdG9yYWdlQWNjZXNzXSBbZ2V0UmVxdWVzdFN0b3JhZ2VBY2Nlc3NVcmxdIEludm9rZSBjb25uZWN0LnN0b3JhZ2VBY2Nlc3MuaW5pdCBmaXJzdCIpO2lmKGQocykpcmV0dXJuIGgocyk7aWYoZihzKSlyZXR1cm4gdC5nZXRMb2coKS5pbmZvKCJbU3RvcmFnZUFjY2Vzc10gW0NDUF0gTG9jYWwgdGVzdGluZyIpLGAke3N9JHtufWA7aWYoaS5pbnN0YW5jZVVybCYmZChpLmluc3RhbmNlVXJsKSlyZXR1cm4gdC5nZXRMb2coKS5pbmZvKGBbU3RvcmFnZUFjY2Vzc10gW2dldFJlcXVlc3RTdG9yYWdlQWNjZXNzVXJsXSBDdXN0b21lciBoYXMgcHJvdmlkZWQgc3RvcmFnZVBhcmFtcy5pbnN0YW5jZVVybCAke2kuaW5zdGFuY2VVcmx9YCksaChpLmluc3RhbmNlVXJsKTtpZihpLmluc3RhbmNlVXJsJiZmKGkuaW5zdGFuY2VVcmwpKXJldHVybiB0LmdldExvZygpLmluZm8oIltTdG9yYWdlQWNjZXNzXSBbZ2V0UmVxdWVzdFN0b3JhZ2VBY2Nlc3NVcmxdIExvY2FsIHRlc3RpbmciKSxgJHtpLmluc3RhbmNlVXJsfSR7bn1gO3Rocm93IHQuZ2V0TG9nKCkuZXJyb3IoIltTdG9yYWdlQWNjZXNzXSBbZ2V0UmVxdWVzdFN0b3JhZ2VBY2Nlc3NVcmxdIEludmFsaWQgQ29ubmVjdCBpbnN0YW5jZS9DQ1AgVVJMIHByb3ZpZGVkLCBwbGVhc2UgcGFzcyB0aGUgY29ycmVjdCBjY3BVcmwgb3Igc3RvcmFnZUFjY2Vzcy5pbnN0YW5jZVVybCBwYXJhbWV0ZXJzIiksbmV3IEVycm9yKCJbU3RvcmFnZUFjY2Vzc10gW2dldFJlcXVlc3RTdG9yYWdlQWNjZXNzVXJsXSBJbnZhbGlkIENvbm5lY3QgaW5zdGFuY2UvQ0NQIFVSTCBwcm92aWRlZCwgcGxlYXNlIHBhc3MgdGhlIHZhbGlkIENvbm5lY3QgQ0NQIFVSTCBvciBpbiBjYXNlIENDUCBVUkwgaXMgY29uZmlndXJlZCB0byBiZSB0aGUgU1NPIFVSTCB0aGVuIHVzZSBzdG9yYWdlQWNjZXNzLmluc3RhbmNlVXJsIGFuZCBwYXNzIHRoZSBDb25uZWN0IENDUCBVUkwiKX0sc3RvcmFnZUFjY2Vzc0V2ZW50czp1LHJlc2V0U3RvcmFnZUFjY2Vzc1N0YXRlOigpPT57aT17fSxzPSIiLGE9bnVsbCxjPSExfSxnZXRPbkdyYW50Q2FsbGJhY2tJbnZva2VkOigpPT5jLGdldFN0b3JhZ2VBY2Nlc3NQYXJhbXM6KCk9Pmksb25SZXF1ZXN0Om0scmVxdWVzdDooKT0+e3QuY29yZS5fZ2V0Q0NQSWZyYW1lKCkuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7ZXZlbnQ6dS5SRVFVRVNULGRhdGE6ey4uLmksbGFuZGF0OmcoKX19LCIqIil9fSl9KCl9LDc0MzooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10O3ZhciBuPWZ1bmN0aW9uKG4pe3ZhciByPXRoaXM7aWYodGhpcy5fcHJldkNvbnRhY3RJZD1udWxsLHQuYXNzZXJ0Tm90TnVsbChuLCJyaW5ndG9uZUNvbmZpZyIpLCFuLnJpbmd0b25lVXJsKXRocm93IG5ldyBFcnJvcigicmluZ3RvbmVVcmwgaXMgcmVxdWlyZWQhIik7ZS5BdWRpbyYmdm9pZCAwIT09ZS5Qcm9taXNlP3RoaXMuX3BsYXlhYmxlQXVkaW9Qcm9taXNlPW5ldyBQcm9taXNlKChmdW5jdGlvbihlLG8pe3IuX2F1ZGlvPW5ldyBBdWRpbyhuLnJpbmd0b25lVXJsKSxyLl9hdWRpby5sb29wPSEwLHIuX2F1ZGlvLmFkZEV2ZW50TGlzdGVuZXIoImNhbnBsYXkiLChmdW5jdGlvbigpe3QuZ2V0TG9nKCkuaW5mbygiUmluZ3RvbmUgaXMgcmVhZHkgdG8gcGxheTogIiwrbi5yaW5ndG9uZVVybCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyLl9hdWRpb1BsYXlhYmxlPSEwLGUoci5fYXVkaW8pfSkpfSkpOih0aGlzLl9hdWRpbz1udWxsLHQuZ2V0TG9nKCkuZXJyb3IoIlVuYWJsZSB0byBwcm92aWRlIGEgcmluZ3RvbmUuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSksci5fZHJpdmVSaW5ndG9uZSgpfTtuLnByb3RvdHlwZS5fZHJpdmVSaW5ndG9uZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkLiIpfSxuLnByb3RvdHlwZS5fc3RhcnRSaW5ndG9uZT1mdW5jdGlvbihlKXt2YXIgbj10aGlzO3RoaXMuX2F1ZGlvJiYodGhpcy5fYXVkaW8ucGxheSgpLnRoZW4oKGZ1bmN0aW9uKCl7bi5fcHVibGlzaFRlbGVtZXRyeUV2ZW50KCJSaW5ndG9uZSBTdGFydCIsZSksdC5nZXRMb2coKS5pbmZvKCJSaW5ndG9uZSBTdGFydCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKHIpe24uX3B1Ymxpc2hUZWxlbWV0cnlFdmVudCgiUmluZ3RvbmUgUGxheWJhY2sgRmFpbHVyZSIsZSksdC5nZXRMb2coKS5lcnJvcigiUmluZ3RvbmUgUGxheWJhY2sgRmFpbHVyZSIpLndpdGhFeGNlcHRpb24ocikud2l0aE9iamVjdCh7Y3VycmVudFNyYzpuLl9hdWRpby5jdXJyZW50U3JjLHNpbmtJZDpuLl9hdWRpby5zaW5rSWQsdm9sdW1lOm4uX2F1ZGlvLnZvbHVtZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSksdC5nZXRMb2coKS5pbmZvKGBBdHRlbXB0aW5nIHRvIHN0YXJ0IHJpbmd0b25lIHRvIGRldmljZSAke3RoaXMuX2F1ZGlvLnNpbmtJZHx8IicnIn1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKX0sbi5wcm90b3R5cGUuX3N0b3BSaW5ndG9uZT1mdW5jdGlvbihlKXt0aGlzLl9hdWRpbyYmKHRoaXMuX2F1ZGlvLnBhdXNlKCksdGhpcy5fYXVkaW8uY3VycmVudFRpbWU9MCx0aGlzLl9wdWJsaXNoVGVsZW1ldHJ5RXZlbnQoIlJpbmd0b25lIFN0b3AiLGUpLHQuZ2V0TG9nKCkuaW5mbygiUmluZ3RvbmUgU3RvcCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfSxuLnByb3RvdHlwZS5zdG9wUmluZ3RvbmU9ZnVuY3Rpb24oKXt0aGlzLl9zdG9wUmluZ3RvbmUoKX0sbi5wcm90b3R5cGUuX3Jpbmd0b25lU2V0dXA9ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt0LmlmTWFzdGVyKHQuTWFzdGVyVG9waWNzLlJJTkdUT05FLChmdW5jdGlvbigpe24uX3N0YXJ0UmluZ3RvbmUoZSksbi5fcHJldkNvbnRhY3RJZD1lLmdldENvbnRhY3RJZCgpLGUub25Db25uZWN0ZWQobGlseS5oaXRjaChuLG4uX3N0b3BSaW5ndG9uZSkpLGUub25BY2NlcHRlZChsaWx5LmhpdGNoKG4sbi5fc3RvcFJpbmd0b25lKSksZS5vbkVuZGVkKGxpbHkuaGl0Y2gobixuLl9zdG9wUmluZ3RvbmUpKSxlLm9uUmVmcmVzaCgoZnVuY3Rpb24oZSl7ZS5nZXRTdGF0dXMoKS50eXBlIT09dC5Db250YWN0U3RhdHVzVHlwZS5DT05ORUNUSU5HJiZlLmdldFN0YXR1cygpLnR5cGUhPT10LkNvbnRhY3RTdGF0dXNUeXBlLklOQ09NSU5HJiZuLl9zdG9wUmluZ3RvbmUoKX0pKX0pKX0sbi5wcm90b3R5cGUuX3B1Ymxpc2hUZWxlbWV0cnlFdmVudD1mdW5jdGlvbihlLG4pe24mJm4uZ2V0Q29udGFjdElkKCkmJnQucHVibGlzaE1ldHJpYyh7bmFtZTplLGNvbnRhY3RJZDpuLmdldENvbnRhY3RJZCgpfSl9LG4ucHJvdG90eXBlLnNldE91dHB1dERldmljZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGxheWFibGVBdWRpb1Byb21pc2U/UHJvbWlzZS5yYWNlKFt0aGlzLl9wbGF5YWJsZUF1ZGlvUHJvbWlzZSxuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxuKXtlLnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bigiVGltZWQgb3V0IHdhaXRpbmcgZm9yIHBsYXlhYmxlIGF1ZGlvIil9KSwzZTMpfSkpXSkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuc2V0U2lua0lkP2Uuc2V0U2lua0lkKHQpLnRoZW4oKGZ1bmN0aW9uKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGBSaW5ndG9uZUVuZ2luZUJhc2Uuc2V0T3V0cHV0RGV2aWNlIGZhaWxlZDogYXVkaW8uc2V0U2lua0lkKCkgZmFpbGVkIHdpdGggZXJyb3IgJHtlfWApfSkpOlByb21pc2UucmVqZWN0KGBSaW5ndG9uZUVuZ2luZUJhc2Uuc2V0T3V0cHV0RGV2aWNlIGZhaWxlZDogJHtlPyJhdWRpbyI6ImF1ZGlvLnNldFNpbmtJZCJ9IG5vdCBmb3VuZC5gKX0pKTplLlByb21pc2U/UHJvbWlzZS5yZWplY3QoIk5vdCBlbGlnaWJsZSByaW5ndG9uZSBvd25lciIpOnZvaWQgMH07dmFyIHI9ZnVuY3Rpb24oZSl7bi5jYWxsKHRoaXMsZSl9OyhyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cixyLnByb3RvdHlwZS5fZHJpdmVSaW5ndG9uZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1mdW5jdGlvbihuKXtuLmdldFR5cGUoKT09PWxpbHkuQ29udGFjdFR5cGUuVk9JQ0UmJm4uaXNTb2Z0cGhvbmVDYWxsKCkmJm4uaXNJbmJvdW5kKCkmJihlLl9yaW5ndG9uZVNldHVwKG4pLGUuX3B1Ymxpc2hUZWxlbWV0cnlFdmVudCgiUmluZ3RvbmUgQ29ubmVjdGluZyIsbiksdC5nZXRMb2coKS5pbmZvKCJSaW5ndG9uZSBDb25uZWN0aW5nIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9O3QuY29udGFjdCgoZnVuY3Rpb24oZSl7ZS5vbkNvbm5lY3Rpbmcobil9KSksKG5ldyB0LkFnZW50KS5nZXRDb250YWN0cygpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuZ2V0U3RhdHVzKCkudHlwZT09PXQuQ29udGFjdFN0YXR1c1R5cGUuQ09OTkVDVElORyYmbihlKX0pKX07dmFyIG89ZnVuY3Rpb24oZSl7bi5jYWxsKHRoaXMsZSl9OyhvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9byxvLnByb3RvdHlwZS5fZHJpdmVSaW5ndG9uZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1mdW5jdGlvbihuKXtuLmdldFR5cGUoKT09PWxpbHkuQ29udGFjdFR5cGUuQ0hBVCYmbi5pc0luYm91bmQoKSYmMD09PW4uZ2V0Q29ubmVjdGlvbnMoKS5maWx0ZXIoKGU9PmUuZ2V0VHlwZSgpPT09dC5Db25uZWN0aW9uVHlwZS5BR0VOVCYmZS5pc1NpbGVudE1vbml0b3IoKSkpLmxlbmd0aCYmKGUuX3Jpbmd0b25lU2V0dXAobiksZS5fcHVibGlzaFRlbGVtZXRyeUV2ZW50KCJDaGF0IFJpbmd0b25lIENvbm5lY3RpbmciLG4pLHQuZ2V0TG9nKCkuaW5mbygiQ2hhdCBSaW5ndG9uZSBDb25uZWN0aW5nIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9O3QuY29udGFjdCgoZnVuY3Rpb24oZSl7ZS5vbkNvbm5lY3Rpbmcobil9KSl9O3ZhciBpPWZ1bmN0aW9uKGUpe24uY2FsbCh0aGlzLGUpfTsoaS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWksaS5wcm90b3R5cGUuX2RyaXZlUmluZ3RvbmU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49ZnVuY3Rpb24obil7bi5nZXRUeXBlKCk9PT1saWx5LkNvbnRhY3RUeXBlLlRBU0smJm4uaXNJbmJvdW5kKCkmJihlLl9yaW5ndG9uZVNldHVwKG4pLGUuX3B1Ymxpc2hUZWxlbWV0cnlFdmVudCgiVGFzayBSaW5ndG9uZSBDb25uZWN0aW5nIixuKSx0LmdldExvZygpLmluZm8oIlRhc2sgUmluZ3RvbmUgQ29ubmVjdGluZyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfTt0LmNvbnRhY3QoKGZ1bmN0aW9uKGUpe2Uub25Db25uZWN0aW5nKG4pfSkpfTt2YXIgcz1mdW5jdGlvbihlKXtuLmNhbGwodGhpcyxlKX07KHMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1zLHMucHJvdG90eXBlLl9kcml2ZVJpbmd0b25lPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0LmNvbnRhY3QoKGZ1bmN0aW9uKG4pe24ub25JbmNvbWluZygoZnVuY3Rpb24oKXtuLmdldFR5cGUoKT09PWxpbHkuQ29udGFjdFR5cGUuUVVFVUVfQ0FMTEJBQ0smJihlLl9yaW5ndG9uZVNldHVwKG4pLGUuX3B1Ymxpc2hUZWxlbWV0cnlFdmVudCgiQ2FsbGJhY2sgUmluZ3RvbmUgQ29ubmVjdGluZyIsbiksdC5nZXRMb2coKS5pbmZvKCJDYWxsYmFjayBSaW5ndG9uZSBDb25uZWN0aW5nIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9KSl9KSl9LHQuVm9pY2VSaW5ndG9uZUVuZ2luZT1yLHQuQ2hhdFJpbmd0b25lRW5naW5lPW8sdC5UYXNrUmluZ3RvbmVFbmdpbmU9aSx0LlF1ZXVlQ2FsbGJhY2tSaW5ndG9uZUVuZ2luZT1zfSgpfSw2NDI6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dCxlLmNjcFZlcnNpb249IlYyIjtjb25zdCBuPSJDSVRSSVgiLHI9IkFXU19XT1JLU1BBQ0UiO3ZhciBvPXt9O29bdC5Tb2Z0cGhvbmVDYWxsVHlwZS5BVURJT19PTkxZXT0iQXVkaW8iLG9bdC5Tb2Z0cGhvbmVDYWxsVHlwZS5WSURFT19PTkxZXT0iVmlkZW8iLG9bdC5Tb2Z0cGhvbmVDYWxsVHlwZS5BVURJT19WSURFT109IkF1ZGlvVmlkZW8iLG9bdC5Tb2Z0cGhvbmVDYWxsVHlwZS5OT05FXT0iTm9uZSI7dmFyIGk9ImF1ZGlvX2lucHV0IixzPSJhdWRpb19vdXRwdXQiOyh7fSlbdC5Db250YWN0VHlwZS5WT0lDRV09IlZvaWNlIjt2YXIgYT1bXSxjPVtdLHU9W10sbD17fSxwPXt9LGQ9MCxoPTAsZj0wLGc9MCxtPTAsdj1udWxsLHk9bnVsbCxFPW51bGwsUz1udWxsLGI9dC5Tb2Z0cGhvbmVFcnJvclR5cGVzLEM9e30sVD10LnJhbmRvbUlkKCksST1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG4scil7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLkNSRUFURV9UUkFOU1BPUlQsZSx7c3VjY2VzczpmdW5jdGlvbihlKXtuKGUuc29mdHBob25lVHJhbnNwb3J0LnNvZnRwaG9uZU1lZGlhQ29ubmVjdGlvbnMpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe2UubWVzc2FnZSYmZS5tZXNzYWdlLmluY2x1ZGVzKCJTb2Z0cGhvbmVDb25uZWN0aW9uTGltaXRCcmVhY2hlZEV4Y2VwdGlvbiIpJiZGKCJtdWx0aXBsZV9zb2Z0cGhvbmVfYWN0aXZlX3Nlc3Npb25zIiwiTnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9ucyBhcmUgbW9yZSB0aGVuIGFsbG93ZWQgbGltaXQuIiwiIikscihFcnJvcigicmVxdWVzdEljZUFjY2VzcyBmYWlsZWQiKSl9LGF1dGhGYWlsdXJlOmZ1bmN0aW9uKCl7cihFcnJvcigiQXV0aGVudGljYXRpb24gZmFpbGVkIHdoaWxlIHJlcXVlc3RJY2VBY2Nlc3MiKSl9LGFjY2Vzc0RlbmllZDpmdW5jdGlvbigpe3IoRXJyb3IoIkFjY2VzcyBEZW5pZWQgd2hpbGUgcmVxdWVzdEljZUFjY2VzcyIpKX19KX0pKX0sQT1mdW5jdGlvbihlPXt9KXt2YXIgbz10aGlzO2xldCBpO2lmKChTPW5ldyBlZSh0LmdldExvZygpKSkuaW5mbygiW1NvZnRwaG9uZSBNYW5hZ2VyXSBzb2Z0cGhvbmUgbWFuYWdlciBpbml0aWFsaXphdGlvbiBoYXMgYmVndW4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLFMuaW5mbyhgW1NvZnRwaG9uZU1hbmFnZXJdIENsaWVudCBQcm92aWRlZCBTdHJhdGVneTogJHtlLlZESVBsYXRmb3JtfWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksZS5WRElQbGF0Zm9ybSl7dj1lLlZESVBsYXRmb3JtO3RyeXtpZihlLlZESVBsYXRmb3JtPT09bilpPW5ldyB0LkNpdHJpeFZESVN0cmF0ZWd5LFMuaW5mbyhgW1NvZnRwaG9uZU1hbmFnZXJdIFN0cmF0ZWd5IGNvbnN0cnVjdG9yIHJldHJpZXZlZDogJHtpfWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7ZWxzZXtpZihlLlZESVBsYXRmb3JtIT09cil0aHJvdyBuZXcgRXJyb3IoIlZESSBTdHJhdGVneSBub3Qgc3VwcG9ydGVkIik7aT1uZXcgdC5EQ1ZXZWJSVENTdHJhdGVneSxTLmluZm8oYFtTb2Z0cGhvbmVNYW5hZ2VyXSBTdHJhdGVneSBjb25zdHJ1Y3RvciByZXRyaWV2ZWQ6ICR7aX1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX1jYXRjaChlKXt0aHJvdyJWREkgU3RyYXRlZ3kgbm90IHN1cHBvcnRlZCI9PT1lLm1lc3NhZ2U/KEYoYi5WRElfU1RSQVRFR1lfTk9UX1NVUFBPUlRFRCxlLm1lc3NhZ2UsIiIpLGUpOiJDaXRyaXggV2ViUlRDIHJlZGlyZWN0aW9uIGZlYXR1cmUgaXMgTk9UIHN1cHBvcnRlZCEiPT09ZS5tZXNzYWdlfHwiRENWIFdlYlJUQyByZWRpcmVjdGlvbiBmZWF0dXJlIGlzIE5PVCBzdXBwb3J0ZWQhIj09PWUubWVzc2FnZT8oRihiLlZESV9SRURJUl9OT1RfU1VQUE9SVEVELGUubWVzc2FnZSwiIiksZSk6KEYoYi5PVEhFUixlLm1lc3NhZ2UsIiIpLGUpfX12YXIgczt0LlJ0Y1BlZXJDb25uZWN0aW9uRmFjdG9yeSYmKHM9aT9uZXcgdC5SdGNQZWVyQ29ubmVjdGlvbkZhY3RvcnkoUyx0LmNvcmUuZ2V0V2ViU29ja2V0TWFuYWdlcigpLFQsdC5oaXRjaChvLEkse3RyYW5zcG9ydFR5cGU6InNvZnRwaG9uZSIsc29mdHBob25lQ2xpZW50SWQ6VH0pLHQuaGl0Y2gobyxGKSxpKTpuZXcgdC5SdGNQZWVyQ29ubmVjdGlvbkZhY3RvcnkoUyx0LmNvcmUuZ2V0V2ViU29ja2V0TWFuYWdlcigpLFQsdC5oaXRjaChvLEkse3RyYW5zcG9ydFR5cGU6InNvZnRwaG9uZSIsc29mdHBob25lQ2xpZW50SWQ6VH0pLHQuaGl0Y2gobyxGKSkpLEEuaXNCcm93c2VyU29mdFBob25lU3VwcG9ydGVkKCl8fEYoYi5VTlNVUFBPUlRFRF9CUk9XU0VSLCJDb25uZWN0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBicm93c2VyLiBTb21lIGZ1bmN0aW9uYWxpdHkgbWF5IG5vdCB3b3JrLiAiLCIiKSxVKHtzdWNjZXNzOmZ1bmN0aW9uKGUpe0IoIkNvbm5lY3Rpdml0eUNoZWNrUmVzdWx0IixudWxsLHtjb25uZWN0aXZpdHlDaGVja1R5cGU6Ik1pY3JvcGhvbmVQZXJtaXNzaW9uIixzdGF0dXM6ImdyYW50ZWQifSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7RihlLCJZb3VyIG1pY3JvcGhvbmUgaXMgbm90IGVuYWJsZWQgaW4geW91ciBicm93c2VyLiAiLCIiKSxCKCJDb25uZWN0aXZpdHlDaGVja1Jlc3VsdCIsbnVsbCx7Y29ubmVjdGl2aXR5Q2hlY2tUeXBlOiJNaWNyb3Bob25lUGVybWlzc2lvbiIsc3RhdHVzOiJkZW5pZWQifSl9fSk7Y29uc3QgYT13KCksYz1SKCksdT1rKCFlLmRpc2FibGVFY2hvQ2FuY2VsbGF0aW9uKTtMKCksdGhpcy5yaW5ndG9uZUVuZ2luZT1udWxsO3ZhciBsPXt9LHA9e30sZD0hMSxoPW51bGwsZj1udWxsLGc9ZnVuY3Rpb24oKXtkPSExLGg9bnVsbCxmPW51bGx9O3RoaXMuZ2V0U2Vzc2lvbj1mdW5jdGlvbihlKXtyZXR1cm4gbFtlXX0sdGhpcy5yZXBsYWNlTG9jYWxNZWRpYVRyYWNrPWZ1bmN0aW9uKGUsdCl7dmFyIG49Q1tlXS5zdHJlYW07aWYobil7dmFyIHI9bi5nZXRBdWRpb1RyYWNrcygpWzBdO3QuZW5hYmxlZD1yLmVuYWJsZWQsci5lbmFibGVkPSExLG4ucmVtb3ZlVHJhY2sociksbi5hZGRUcmFjayh0KX19O3ZhciBtPWZ1bmN0aW9uKGUpe2lmKGwuaGFzT3duUHJvcGVydHkoZSkpe3ZhciB0PWxbZV07bmV3IFByb21pc2UoKGZ1bmN0aW9uKG4scil7ZGVsZXRlIGxbZV0sZGVsZXRlIHBbZV0sdC5oYW5ndXAoKX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7bGlseS5nZXRMb2coKS53YXJuKCJDbGVhbiB1cCB0aGUgc2Vzc2lvbiBsb2NhbGx5ICIrZSx0Lm1lc3NhZ2UpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSl9fTt0aGlzLnN0YXJ0U2Vzc2lvbj1mdW5jdGlvbihuLHIpe3ZhciBvPWQ/aDpuLGE9ZD9mOnI7aWYobyYmYSl7ZygpLHBbYV09ITAsUy5pbmZvKCJTb2Z0cGhvbmUgY2FsbCBkZXRlY3RlZDoiLCJjb250YWN0SWQgIitvLmdldENvbnRhY3RJZCgpLCJhZ2VudCBjb25uZWN0aW9uSWQgIithKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGZ1bmN0aW9uKGUpe2lmKE9iamVjdC5rZXlzKGUpLmxlbmd0aD4wKXtmb3IodmFyIHQgaW4gZSllLmhhc093blByb3BlcnR5KHQpJiYoaigiTXVsdGlTZXNzaW9uSGFuZ1VwIixlW3RdLmNhbGxJZCx0KSxtKHQpKTt0aHJvdyBuZXcgRXJyb3IoImR1cGxpY2F0ZSBzZXNzaW9uIGRldGVjdGVkLCByZWZ1c2luZyB0byBzZXR1cCBuZXcgY29ubmVjdGlvbiIpfX0obCksby5nZXRTdGF0dXMoKS50eXBlPT09dC5Db250YWN0U3RhdHVzVHlwZS5DT05ORUNUSU5HJiZCKCJTb2Z0cGhvbmUgQ29ubmVjdGluZyIsby5nZXRDb250YWN0SWQoKSksSCgpO3ZhciBjLHUsdj1vLmdldEFnZW50Q29ubmVjdGlvbigpLmdldFNvZnRwaG9uZU1lZGlhSW5mbygpLHk9TSh2LmNhbGxDb25maWdKc29uKTt5LnVzZVdlYlNvY2tldFByb3ZpZGVyJiYoYz10LmNvcmUuZ2V0V2ViU29ja2V0TWFuYWdlcigpKSwodT1pP25ldyB0LlJUQ1Nlc3Npb24oeS5zaWduYWxpbmdFbmRwb2ludCx5LmljZVNlcnZlcnMsdi5jYWxsQ29udGV4dFRva2VuLFMsby5nZXRDb250YWN0SWQoKSxhLGMsaSk6bmV3IHQuUlRDU2Vzc2lvbih5LnNpZ25hbGluZ0VuZHBvaW50LHkuaWNlU2VydmVycyx2LmNhbGxDb250ZXh0VG9rZW4sUyxvLmdldENvbnRhY3RJZCgpLGEsYykpLmVjaG9DYW5jZWxsYXRpb249IWUuZGlzYWJsZUVjaG9DYW5jZWxsYXRpb24sbFthXT11LHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29ubmVjdGlvbkV2ZW50cy5TRVNTSU9OX0lOSVQsZGF0YTp7Y29ubmVjdGlvbklkOmF9fSksdS5vblNlc3Npb25GYWlsZWQ9ZnVuY3Rpb24oZSx0KXtkZWxldGUgbFthXSxkZWxldGUgcFthXSx4KGUsdCkscShvLmdldENvbnRhY3RJZCgpLHQpLEoobyxlLnNlc3Npb25SZXBvcnQpfSx1Lm9uU2Vzc2lvbkNvbm5lY3RlZD1mdW5jdGlvbihlKXtCKCJTb2Z0cGhvbmUgU2Vzc2lvbiBDb25uZWN0ZWQiLG8uZ2V0Q29udGFjdElkKCkpLHQuYmVjb21lTWFzdGVyKHQuTWFzdGVyVG9waWNzLlNFTkRfTE9HUyksVyhlKSxHKG8pLF8obyl9LHUub25TZXNzaW9uQ29tcGxldGVkPWZ1bmN0aW9uKGUpe0IoIlNvZnRwaG9uZSBTZXNzaW9uIENvbXBsZXRlZCIsby5nZXRDb250YWN0SWQoKSksZGVsZXRlIGxbYV0sZGVsZXRlIHBbYV0sSihvLGUuc2Vzc2lvblJlcG9ydCksTihhKX0sdS5vbkxvY2FsU3RyZWFtQWRkZWQ9ZnVuY3Rpb24oZSxuKXtDW2FdPXtzdHJlYW06bn0sdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5BZ2VudEV2ZW50cy5MT0NBTF9NRURJQV9TVFJFQU1fQ1JFQVRFRCxkYXRhOntjb25uZWN0aW9uSWQ6YX19KX0sdS5yZW1vdGVBdWRpb0VsZW1lbnQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlbW90ZS1hdWRpbyIpfHx3aW5kb3cucGFyZW50LnBhcmVudC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVtb3RlLWF1ZGlvIikscz91LmNvbm5lY3Qocy5nZXQoeS5pY2VTZXJ2ZXJzKSk6dS5jb25uZWN0KCl9fTt2YXIgeT1mdW5jdGlvbihlLG4pe2xbbl0mJmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0dXNUeXBlLkVOREVEfHxlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0dXNUeXBlLkVSUk9SfHxlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0dXNUeXBlLk1JU1NFRH0oZSkmJihtKG4pLGcoKSksIWUuaXNTb2Z0cGhvbmVDYWxsKCl8fHBbbl18fGUuZ2V0U3RhdHVzKCkudHlwZSE9PXQuQ29udGFjdFN0YXR1c1R5cGUuQ09OTkVDVElORyYmZS5nZXRTdGF0dXMoKS50eXBlIT09dC5Db250YWN0U3RhdHVzVHlwZS5JTkNPTUlOR3x8KHQuaXNGaXJlZm94QnJvd3NlcigpJiZ0Lmhhc090aGVyQ29ubmVjdGVkQ0NQcygpP2Z1bmN0aW9uKGUsdCl7ZD0hMCxoPWUsZj10fShlLG4pOm8uc3RhcnRTZXNzaW9uKGUsbikpfSxFPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0QWdlbnRDb25uZWN0aW9uKCkuY29ubmVjdGlvbklkO1MuaW5mbygiQ29udGFjdCBkZXRlY3RlZDoiLCJjb250YWN0SWQgIitlLmdldENvbnRhY3RJZCgpLCJhZ2VudCBjb25uZWN0aW9uSWQgIit0KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHBbdF18fChlLm9uUmVmcmVzaCgoZnVuY3Rpb24oKXt5KGUsdCl9KSksZS5vbkRlc3Ryb3koKGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKGUpe2xbZV0mJm0oZSl9KHQpfSkpKX07by5vbkluaXRDb250YWN0U3ViPXQuY29udGFjdChFKSwobmV3IHQuQWdlbnQpLmdldENvbnRhY3RzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRBZ2VudENvbm5lY3Rpb24oKS5jb25uZWN0aW9uSWQ7Uy5pbmZvKCJDb250YWN0IGV4aXN0IGluIHRoZSBzbmFwc2hvdC4gUmVpbml0aWF0ZSB0aGUgQ29udGFjdCBhbmQgUlRDIHNlc3Npb24gY3JlYXRpb24gZm9yIGNvbnRhY3RJZCIrZS5nZXRDb250YWN0SWQoKSwiYWdlbnQgY29ubmVjdGlvbklkICIrdCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxFKGUpLHkoZSx0KX0pKSx0aGlzLnRlcm1pbmF0ZT0oKT0+e28ub25Jbml0Q29udGFjdFN1YiYmby5vbkluaXRDb250YWN0U3ViLnVuc3Vic2NyaWJlJiZvLm9uSW5pdENvbnRhY3RTdWIudW5zdWJzY3JpYmUoKSxhJiZhLnVuc3Vic2NyaWJlJiZhLnVuc3Vic2NyaWJlKCksYyYmYy51bnN1YnNjcmliZSYmYy51bnN1YnNjcmliZSgpLHUmJnUudW5zdWJzY3JpYmUmJnUudW5zdWJzY3JpYmUoKSxzLmNsZWFySWRsZVJ0Y1BlZXJDb25uZWN0aW9uVGltZXJJZCYmcy5jbGVhcklkbGVSdGNQZWVyQ29ubmVjdGlvblRpbWVySWQoKSxzPW51bGx9fSxfPWZ1bmN0aW9uKGUpe3ZhciBuPXQuY29yZS5nZXRVcHN0cmVhbSgpLHI9ZS5nZXRBZ2VudENvbm5lY3Rpb24oKTtpZihyKXt2YXIgbz1yLmdldFNvZnRwaG9uZU1lZGlhSW5mbygpO28/ITA9PT1vLmF1dG9BY2NlcHQ/KFMuaW5mbygiQXV0by1hY2NlcHQgaXMgZW5hYmxlZCwgc2VuZGluZyBvdXQgQWNjZXB0ZWQgZXZlbnQgdG8gc3RvcCByaW5ndG9uZS4uIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29udGFjdEV2ZW50cy5BQ0NFUFRFRCxkYXRhOm5ldyB0LkNvbnRhY3QoZS5jb250YWN0SWQpfSksbi5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LmNvcmUuZ2V0Q29udGFjdEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuQUNDRVBURUQsZS5jb250YWN0SWQpLGRhdGE6bmV3IHQuQ29udGFjdChlLmNvbnRhY3RJZCl9KSk6Uy5pbmZvKCJBdXRvLWFjY2VwdCBpcyBkaXNhYmxlZCwgcmluZ3RvbmUgd2lsbCBiZSBzdG9wcGVkIGJ5IHVzZXIgYWN0aW9uLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk6Uy5pbmZvKCJOb3QgYWJsZSB0byByZXRyaWV2ZSB0aGUgYXV0by1hY2NlcHQgc2V0dGluZyBmcm9tIG51bGwgU29mdHBob25lTWVkaWFJbmZvLCBpZ25vcmluZyBldmVudCBwdWJsaXNoLi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWVsc2UgUy5pbmZvKCJOb3QgYWJsZSB0byByZXRyaWV2ZSB0aGUgYXV0by1hY2NlcHQgc2V0dGluZyBmcm9tIG51bGwgQWdlbnRDb25uZWN0aW9uLCBpZ25vcmluZyBldmVudCBwdWJsaXNoLi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSx3PWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5NVVRFLE8pfSxSPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbmZpZ3VyYXRpb25FdmVudHMuU0VUX1NQRUFLRVJfREVWSUNFLEQpfSxrPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5Db25maWd1cmF0aW9uRXZlbnRzLlNFVF9NSUNST1BIT05FX0RFVklDRSwodD0+UCh7Li4udCxlbmFibGVFY2hvQ2FuY2VsbGF0aW9uOmV9KSkpfSxMPWZ1bmN0aW9uKCl7dHJ5e3QuaXNDaHJvbWVCcm93c2VyKCkmJnQuZ2V0Q2hyb21lQnJvd3NlclZlcnNpb24oKT40MyYmbmF2aWdhdG9yLnBlcm1pc3Npb25zLnF1ZXJ5KHtuYW1lOiJtaWNyb3Bob25lIn0pLnRoZW4oKGZ1bmN0aW9uKGUpe2Uub25jaGFuZ2U9ZnVuY3Rpb24oKXtTLmluZm8oIk1pY3JvcGhvbmUgUGVybWlzc2lvbjogIitlLnN0YXRlKSxCKCJDb25uZWN0aXZpdHlDaGVja1Jlc3VsdCIsbnVsbCx7Y29ubmVjdGl2aXR5Q2hlY2tUeXBlOiJNaWNyb3Bob25lUGVybWlzc2lvbiIsc3RhdHVzOmUuc3RhdGV9KSwiZGVuaWVkIj09PWUuc3RhdGUmJkYoYi5NSUNST1BIT05FX05PVF9TSEFSRUQsIllvdXIgbWljcm9waG9uZSBpcyBub3QgZW5hYmxlZCBpbiB5b3VyIGJyb3dzZXIuICIsIiIpfX0pKX1jYXRjaChlKXtTLmVycm9yKCJGYWlsZWQgaW4gZGV0ZWN0aW5nIG1pY3JvcGhvbmUgcGVybWlzc2lvbiBzdGF0dXM6ICIrZSl9fSxOPWZ1bmN0aW9uKGUpe2RlbGV0ZSBDW2VdLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQWdlbnRFdmVudHMuTVVURV9UT0dHTEUsZGF0YTp7bXV0ZWQ6ITF9fSl9LE89ZnVuY3Rpb24oZSl7dmFyIG47aWYoMCE9PXQua2V5cyhDKS5sZW5ndGgpe2Zvcih2YXIgciBpbiBlJiZ2b2lkIDAhPT1lLm11dGUmJihuPWUubXV0ZSksQylpZihDLmhhc093blByb3BlcnR5KHIpKXt2YXIgbz1DW3JdLnN0cmVhbTtpZihvKXt2YXIgaT1vLmdldEF1ZGlvVHJhY2tzKClbMF07dm9pZCAwIT09bj8oaS5lbmFibGVkPSFuLENbcl0ubXV0ZWQ9bixuP1MuaW5mbygiQWdlbnQgaGFzIG11dGVkIHRoZSBjb250YWN0LCBjb25uZWN0aW9uSWQgLSAgIityKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpOlMuaW5mbygiQWdlbnQgaGFzIHVubXV0ZWQgdGhlIGNvbnRhY3QsIGNvbm5lY3Rpb25JZCAtICIrcikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSk6bj1DW3JdLm11dGVkfHwhMX19dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5BZ2VudEV2ZW50cy5NVVRFX1RPR0dMRSxkYXRhOnttdXRlZDpufX0pfX0sRD1mdW5jdGlvbihlPXt9KXtjb25zdCBuPWUuZGV2aWNlSWR8fCIiO2lmKHQuZ2V0TG9nKCkuaW5mbyhgW0F1ZGlvIERldmljZSBTZXR0aW5nc10gQXR0ZW1wdGluZyB0byBzZXQgc3BlYWtlciBkZXZpY2UgJHtufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbil7dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlbW90ZS1hdWRpbyIpfHx3aW5kb3cucGFyZW50LnBhcmVudC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVtb3RlLWF1ZGlvIik7ciYmImZ1bmN0aW9uIj09dHlwZW9mIHIuc2V0U2lua0lkP3Iuc2V0U2lua0lkKG4pLnRoZW4oKCgpPT57dC5nZXRMb2coKS5pbmZvKGBbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBTcGVha2VyIGRldmljZSAke259IHN1Y2Nlc3NmdWxseSBzZXQgdG8gc3BlYWtlciBhdWRpbyBlbGVtZW50YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuU1BFQUtFUl9ERVZJQ0VfQ0hBTkdFRCxkYXRhOntkZXZpY2VJZDpufX0pfSkpLmNhdGNoKChlPT57dC5nZXRMb2coKS5lcnJvcigiW0F1ZGlvIERldmljZSBTZXR0aW5nc10gRmFpbGVkIHRvIHNldCBzcGVha2VyIGRldmljZSAiK24pLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKTp0LmdldExvZygpLndhcm4oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIFNldHRpbmcgc3BlYWtlciBkZXZpY2UgY2FuY2VsbGVkIGR1ZSB0byBtaXNzaW5nIHJlbW90ZUF1ZGlvRWxlbWVudCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9ZWxzZSB0LmdldExvZygpLndhcm4oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIFNldHRpbmcgc3BlYWtlciBkZXZpY2UgY2FuY2VsbGVkIGR1ZSB0byBtaXNzaW5nIGRldmljZUlkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0sUD1mdW5jdGlvbihlPXt9KXtjb25zdCBuPWUuZGV2aWNlSWR8fCIiO2lmKHQuZ2V0TG9nKCkuaW5mbyhgW0F1ZGlvIERldmljZSBTZXR0aW5nc10gQXR0ZW1wdGluZyB0byBzZXQgbWljcm9waG9uZSBkZXZpY2UgJHtufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksMCE9PXQua2V5cyhDKS5sZW5ndGgpaWYobil7dmFyIHI9dC5jb3JlLmdldFNvZnRwaG9uZU1hbmFnZXIoKSxvPXthdWRpbzp7ZGV2aWNlSWQ6e2V4YWN0Om59fX07ZS5lbmFibGVFY2hvQ2FuY2VsbGF0aW9ufHwoby5hdWRpby5lY2hvQ2FuY2VsbGF0aW9uPSExKSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6ImVjaG9DYW5jZWxsYXRpb25DaGVjayIsZGF0YTp7Y291bnQ6MSxkaXNhYmxlRWNob0NhbmNlbGxhdGlvbjohZS5lbmFibGVFY2hvQ2FuY2VsbGF0aW9ufX0pLG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKG8pLnRoZW4oKGU9Pnt0cnl7dmFyIG89ZS5nZXRBdWRpb1RyYWNrcygpWzBdO2Zvcih2YXIgaSBpbiBDKUMuaGFzT3duUHJvcGVydHkoaSkmJihDW2ldLnN0cmVhbSxyLmdldFNlc3Npb24oaSkuX3BjLmdldFNlbmRlcnMoKVswXS5yZXBsYWNlVHJhY2sobykudGhlbigoZnVuY3Rpb24oKXtyLnJlcGxhY2VMb2NhbE1lZGlhVHJhY2soaSxvKSx0LmdldExvZygpLmluZm8oYFtBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIE1pY3JvcGhvbmUgZGV2aWNlICR7bn0gc3VjY2Vzc2Z1bGx5IHNldCB0byBsb2NhbCBtZWRpYSBzdHJlYW0gaW4gUlRDUnRwU2VuZGVyYCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKSl9Y2F0Y2goZSl7cmV0dXJuIHZvaWQgdC5nZXRMb2coKS5lcnJvcigiW0F1ZGlvIERldmljZSBTZXR0aW5nc10gRmFpbGVkIHRvIHNldCBtaWNyb3Bob25lIGRldmljZSAiK24pLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX10LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuTUlDUk9QSE9ORV9ERVZJQ0VfQ0hBTkdFRCxkYXRhOntkZXZpY2VJZDpufX0pfSkpLmNhdGNoKChlPT57dC5nZXRMb2coKS5lcnJvcigiW0F1ZGlvIERldmljZSBTZXR0aW5nc10gRmFpbGVkIHRvIHNldCBtaWNyb3Bob25lIGRldmljZSAiK24pLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKX1lbHNlIHQuZ2V0TG9nKCkud2FybigiW0F1ZGlvIERldmljZSBTZXR0aW5nc10gU2V0dGluZyBtaWNyb3Bob25lIGRldmljZSBjYW5jZWxsZWQgZHVlIHRvIG1pc3NpbmcgZGV2aWNlSWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO2Vsc2UgdC5nZXRMb2coKS53YXJuKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBTZXR0aW5nIG1pY3JvcGhvbmUgZGV2aWNlIGNhbmNlbGxlZCBkdWUgdG8gbWlzc2luZyBsb2NhbE1lZGlhU3RyZWFtIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0seD1mdW5jdGlvbihlLG4pe2lmKG49PT10LlJUQ0Vycm9ycy5JQ0VfQ09MTEVDVElPTl9USU1FT1VUKXtmb3IodmFyIHI9IlxuIixvPTA7bzxlLl9pY2VTZXJ2ZXJzLmxlbmd0aDtvKyspZm9yKHZhciBpPTA7aTxlLl9pY2VTZXJ2ZXJzW29dLnVybHMubGVuZ3RoO2krKylyPXIrZS5faWNlU2VydmVyc1tvXS51cmxzW2ldKyJcbiI7RihiLklDRV9DT0xMRUNUSU9OX1RJTUVPVVQsIkljZSBjb2xsZWN0aW9uIHRpbWVkb3V0LiAiLHIpfWVsc2Ugbj09PXQuUlRDRXJyb3JzLlVTRVJfQlVTWT9GKGIuVVNFUl9CVVNZX0VSUk9SLCJTb2Z0cGhvbmUgY2FsbCBVc2VyQnVzeSBlcnJvci4gIiwiIik6bj09PXQuUlRDRXJyb3JzLlNJR05BTExJTkdfSEFORFNIQUtFX0ZBSUxVUkU/RihiLlNJR05BTExJTkdfSEFORFNIQUtFX0ZBSUxVUkUsIkhhbmRzaGFraW5nIHdpdGggU2lnbmFsbGluZyBTZXJ2ZXIgIitlLl9zaWduYWxpbmdVcmkrIiBmYWlsZWQuICIsZS5fc2lnbmFsaW5nVXJpKTpuPT09dC5SVENFcnJvcnMuR1VNX1RJTUVPVVRfRkFJTFVSRXx8bj09PXQuUlRDRXJyb3JzLkdVTV9PVEhFUl9GQUlMVVJFP0YoYi5NSUNST1BIT05FX05PVF9TSEFSRUQsIllvdXIgbWljcm9waG9uZSBpcyBub3QgZW5hYmxlZCBpbiB5b3VyIGJyb3dzZXIuICIsIiIpOm49PT10LlJUQ0Vycm9ycy5TSUdOQUxMSU5HX0NPTk5FQ1RJT05fRkFJTFVSRT9GKGIuU0lHTkFMTElOR19DT05ORUNUSU9OX0ZBSUxVUkUsIlVSTCAiK2UuX3NpZ25hbGluZ1VyaSsiIGNhbm5vdCBiZSByZWFjaGVkLiAiLGUuX3NpZ25hbGluZ1VyaSk6bj09PXQuUlRDRXJyb3JzLkNBTExfTk9UX0ZPVU5EP1MuZXJyb3IoIlNvZnRwaG9uZSBjYWxsIGZhaWxlZCBkdWUgdG8gQ2FsbE5vdEZvdW5kRXhjZXB0aW9uLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk6RihiLldFQlJUQ19FUlJPUiwid2VicnRjIHN5c3RlbSBlcnJvci4gIiwiIil9LE09ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKC8mcXVvdDsvZywnIicpO3JldHVybiBKU09OLnBhcnNlKHQpfSxVPWZ1bmN0aW9uKGUpe3ZhciB0PWV8fHt9O3Quc3VjY2Vzcz10LnN1Y2Nlc3N8fGZ1bmN0aW9uKCl7fSx0LmZhaWx1cmU9dC5mYWlsdXJlfHxmdW5jdGlvbigpe307dmFyIG49e2F1ZGlvOiEwfSxyPW51bGw7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb21pc2Upe2lmKCJvYmplY3QiPT10eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcyYmImZ1bmN0aW9uIj09dHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKXI9bmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEobik7ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2YgbmF2aWdhdG9yLndlYmtpdEdldFVzZXJNZWRpYSlyZXR1cm4gdm9pZCB0LmZhaWx1cmUoYi5VTlNVUFBPUlRFRF9CUk9XU0VSKTtyPW5ldyBQcm9taXNlKChmdW5jdGlvbihlLHQpe25hdmlnYXRvci53ZWJraXRHZXRVc2VyTWVkaWEobixlLHQpfSkpfXJldHVybiByLnRoZW4oKGZ1bmN0aW9uKGUpe3ZhciBuPWUuZ2V0QXVkaW9UcmFja3MoKTtuJiZuLmxlbmd0aD4wP3Quc3VjY2VzcyhlKTp0LmZhaWx1cmUoYi5NSUNST1BIT05FX05PVF9TSEFSRUQpfSksKGZ1bmN0aW9uKGUpe3QuZmFpbHVyZShiLk1JQ1JPUEhPTkVfTk9UX1NIQVJFRCl9KSkscn10LmZhaWx1cmUoYi5VTlNVUFBPUlRFRF9CUk9XU0VSKX0sRj1mdW5jdGlvbihlLG4scil7Uy5lcnJvcigiU29mdHBob25lIGVycm9yIG9jY3VycmVkIDogIixlLG58fCIiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQWdlbnRFdmVudHMuU09GVFBIT05FX0VSUk9SLGRhdGE6bmV3IHQuU29mdHBob25lRXJyb3IoZSxuLHIpfSl9LHE9ZnVuY3Rpb24oZSx0KXtCKCJTb2Z0cGhvbmUgU2Vzc2lvbiBGYWlsZWQiLGUse2ZhaWxlZFJlYXNvbjp0fSl9LEI9ZnVuY3Rpb24oZSxuLHIpe3QucHVibGlzaE1ldHJpYyh7bmFtZTplLGNvbnRhY3RJZDpuLGRhdGE6cn0pfSxqPWZ1bmN0aW9uKGUsdCxuKXtCKGUsdCxbe25hbWU6IkFnZW50Q29ubmVjdGlvbklkIix2YWx1ZTpufV0pLFMuaW5mbygiUHVibGlzaCBtdWx0aXBsZSBzZXNzaW9uIGVycm9yIG1ldHJpY3MiLGUsImNvbnRhY3RJZCAiK3QsImFnZW50IGNvbm5lY3Rpb25JZCAiK24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9O0EuaXNCcm93c2VyU29mdFBob25lU3VwcG9ydGVkPWZ1bmN0aW9uKCl7cmV0dXJuISEodC5pc09wZXJhQnJvd3NlcigpJiZ0LmdldE9wZXJhQnJvd3NlclZlcnNpb24oKT4xNyl8fCEhKHQuaXNDaHJvbWVCcm93c2VyKCkmJnQuZ2V0Q2hyb21lQnJvd3NlclZlcnNpb24oKT4yMil8fCEhKHQuaXNGaXJlZm94QnJvd3NlcigpJiZ0LmdldEZpcmVmb3hCcm93c2VyVmVyc2lvbigpPjIxKX07dmFyIFY9ZnVuY3Rpb24oZSl7dmFyIHQ9YS5zbGljZSgpO2E9W10sdC5sZW5ndGg+MCYmZS5zZW5kU29mdHBob25lTWV0cmljcyh0LHtzdWNjZXNzOmZ1bmN0aW9uKCl7Uy5pbmZvKCJzZW5kU29mdHBob25lTWV0cmljcyBzdWNjZXNzIitKU09OLnN0cmluZ2lmeSh0KSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0sZmFpbHVyZTpmdW5jdGlvbihlKXtTLmVycm9yKCJzZW5kU29mdHBob25lTWV0cmljcyBmYWlsZWQuIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0pfSxXPWZ1bmN0aW9uKGUpe3k9d2luZG93LnNldEludGVydmFsKChmdW5jdGlvbigpe2UuZ2V0VXNlckF1ZGlvU3RhdHMoKS50aGVuKChmdW5jdGlvbihlKXt2YXIgdD1sLG49eihsPWUsdCxpKTthLnB1c2gobiksSyhuKX0pLChmdW5jdGlvbihlKXtTLmRlYnVnKCJGYWlsZWQgdG8gZ2V0IHVzZXIgYXVkaW8gc3RhdHMuIixlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLGUuZ2V0UmVtb3RlQXVkaW9TdGF0cygpLnRoZW4oKGZ1bmN0aW9uKGUpe3ZhciB0PXAsbj16KHA9ZSx0LHMpO2EucHVzaChuKSxLKG4pfSksKGZ1bmN0aW9uKGUpe1MuZGVidWcoIkZhaWxlZCB0byBnZXQgcmVtb3RlIGF1ZGlvIHN0YXRzLiIsZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKX0pLDFlMyl9LEc9ZnVuY3Rpb24oZSl7RT13aW5kb3cuc2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7VihlKX0pLDNlNCl9LEg9ZnVuY3Rpb24oKXtsPW51bGwscD1udWxsLGE9W10sYz1bXSx1PVtdLHk9bnVsbCxFPW51bGwsZD0wLGg9MCxmPTAsZz0wLG09MH0sej1mdW5jdGlvbihlLHQsbil7aWYodCYmZSl7dmFyIHI9ZS5wYWNrZXRzTG9zdD50LnBhY2tldHNMb3N0P2UucGFja2V0c0xvc3QtdC5wYWNrZXRzTG9zdDowLG89ZS5wYWNrZXRzQ291bnQ+dC5wYWNrZXRzQ291bnQ/ZS5wYWNrZXRzQ291bnQtdC5wYWNrZXRzQ291bnQ6MDtyZXR1cm4gWChvLG4pLFkoZS5hdWRpb0xldmVsLG4pLG5ldyBRKGUudGltZXN0YW1wLHIsbyxuLGUuYXVkaW9MZXZlbCxlLmpiTWlsbGlzZWNvbmRzLGUucnR0TWlsbGlzZWNvbmRzKX1yZXR1cm4gbmV3IFEoZS50aW1lc3RhbXAsZS5wYWNrZXRzTG9zdCxlLnBhY2tldHNDb3VudCxuLGUuYXVkaW9MZXZlbCxlLmpiTWlsbGlzZWNvbmRzLGUucnR0TWlsbGlzZWNvbmRzKX0sSz1mdW5jdGlvbihlKXtpZihlLnNvZnRwaG9uZVN0cmVhbVR5cGU9PT1pKXtmb3IoO2MubGVuZ3RoPj0xMDgwMDspYy5zaGlmdCgpO2MucHVzaChlKX1lbHNlIGlmKGUuc29mdHBob25lU3RyZWFtVHlwZT09PXMpe2Zvcig7dS5sZW5ndGg+PTEwODAwOyl1LnNoaWZ0KCk7dS5wdXNoKGUpfX0sWD1mdW5jdGlvbihlLHQpe3Q9PT1pPyhtKyssZTw9MD9kKys6ZD0wKTp0PT09cyYmKGU8PTA/ZisrOmY9MCl9LFk9ZnVuY3Rpb24oZSx0KXt0PT09aT9udWxsIT09ZSYmZTw9MT9oKys6aD0wOnQ9PT1zJiYobnVsbCE9PWUmJmU8PTE/ZysrOmc9MCl9LCQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPT1lJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbChlKSxudWxsfSxKPWZ1bmN0aW9uKG4scil7eT0kKHkpLEU9JChFKSxmdW5jdGlvbihuLHIsbyxhKXtyLnN0cmVhbVN0YXRzPVtaKG8saSksWihhLHMpXTt2YXIgbD17Y2FsbFN0YXJ0VGltZTpyLnNlc3Npb25TdGFydFRpbWUsY2FsbEVuZFRpbWU6ci5zZXNzaW9uRW5kVGltZSxndW1UaW1lTWlsbGlzOnIuZ3VtVGltZU1pbGxpcyxpbml0aWFsaXphdGlvblRpbWVNaWxsaXM6ci5pbml0aWFsaXphdGlvblRpbWVNaWxsaXMsaWNlQ29sbGVjdGlvblRpbWVNaWxsaXM6ci5pY2VDb2xsZWN0aW9uVGltZU1pbGxpcyxzaWduYWxsaW5nQ29ubmVjdFRpbWVNaWxsaXM6ci5zaWduYWxsaW5nQ29ubmVjdFRpbWVNaWxsaXMsaGFuZHNoYWtpbmdUaW1lTWlsbGlzOnIuaGFuZHNoYWtpbmdUaW1lTWlsbGlzLHByZVRhbGtpbmdUaW1lTWlsbGlzOnIucHJlVGFsa2luZ1RpbWVNaWxsaXMsdGFsa2luZ1RpbWVNaWxsaXM6ci50YWxraW5nVGltZU1pbGxpcyxjbGVhbnVwVGltZU1pbGxpczpyLmNsZWFudXBUaW1lTWlsbGlzLGljZUNvbGxlY3Rpb25GYWlsdXJlOnIuaWNlQ29sbGVjdGlvbkZhaWx1cmUsc2lnbmFsbGluZ0Nvbm5lY3Rpb25GYWlsdXJlOnIuc2lnbmFsbGluZ0Nvbm5lY3Rpb25GYWlsdXJlLGhhbmRzaGFraW5nRmFpbHVyZTpyLmhhbmRzaGFraW5nRmFpbHVyZSxndW1PdGhlckZhaWx1cmU6ci5ndW1PdGhlckZhaWx1cmUsZ3VtVGltZW91dEZhaWx1cmU6ci5ndW1UaW1lb3V0RmFpbHVyZSxjcmVhdGVPZmZlckZhaWx1cmU6ci5jcmVhdGVPZmZlckZhaWx1cmUsc2V0TG9jYWxEZXNjcmlwdGlvbkZhaWx1cmU6ci5zZXRMb2NhbERlc2NyaXB0aW9uRmFpbHVyZSx1c2VyQnVzeUZhaWx1cmU6ci51c2VyQnVzeUZhaWx1cmUsaW52YWxpZFJlbW90ZVNEUEZhaWx1cmU6ci5pbnZhbGlkUmVtb3RlU0RQRmFpbHVyZSxub1JlbW90ZUljZUNhbmRpZGF0ZUZhaWx1cmU6ci5ub1JlbW90ZUljZUNhbmRpZGF0ZUZhaWx1cmUsc2V0UmVtb3RlRGVzY3JpcHRpb25GYWlsdXJlOnIuc2V0UmVtb3RlRGVzY3JpcHRpb25GYWlsdXJlLHNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3M6ci5zdHJlYW1TdGF0c307bi5zZW5kU29mdHBob25lUmVwb3J0KGwse3N1Y2Nlc3M6ZnVuY3Rpb24oKXtTLmluZm8oInNlbmRTb2Z0cGhvbmVSZXBvcnQgc3VjY2VzcyIrSlNPTi5zdHJpbmdpZnkobCkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7Uy5lcnJvcigic2VuZFNvZnRwaG9uZVJlcG9ydCBmYWlsZWQuIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0pO3ZhciBwPXtBVURJT19JTlBVVDp7cGFja2V0c0NvdW50OmMubWFwKChlPT5lLnBhY2tldHNDb3VudCkpLHBhY2tldHNMb3N0OmMubWFwKChlPT5lLnBhY2tldHNMb3N0KSksYXVkaW9MZXZlbDpjLm1hcCgoZT0+ZS5hdWRpb0xldmVsKSksaml0dGVyQnVmZmVyTWlsbGlzOmMubWFwKChlPT5lLmppdHRlckJ1ZmZlck1pbGxpcykpfSxBVURJT19PVVRQVVQ6e3BhY2tldHNDb3VudDp1Lm1hcCgoZT0+ZS5wYWNrZXRzQ291bnQpKSxwYWNrZXRzTG9zdDp1Lm1hcCgoZT0+ZS5wYWNrZXRzTG9zdCkpLGF1ZGlvTGV2ZWw6dS5tYXAoKGU9PmUuYXVkaW9MZXZlbCkpLGppdHRlckJ1ZmZlck1pbGxpczp1Lm1hcCgoZT0+ZS5qaXR0ZXJCdWZmZXJNaWxsaXMpKSxyb3VuZFRyaXBUaW1lTWlsbGlzOnUubWFwKChlPT5lLnJvdW5kVHJpcFRpbWVNaWxsaXMpKX19LHk9ey4uLmwsc29mdHBob25lU3RyZWFtUGVyU2Vjb25kU3RhdGlzdGljczpwLGljZUNvbm5lY3Rpb25zTG9zdDpyLmljZUNvbm5lY3Rpb25zTG9zdCxpY2VDb25uZWN0aW9uc0ZhaWxlZDpyLmljZUNvbm5lY3Rpb25zRmFpbGVkfHxudWxsLHBlZXJDb25uZWN0aW9uRmFpbGVkOnIucGVlckNvbm5lY3Rpb25GYWlsZWR8fG51bGwscnRjSnNWZXJzaW9uOnIucnRjSnNWZXJzaW9ufHxudWxsLGNvbnNlY3V0aXZlTm9BdWRpb0lucHV0UGFja2V0czpkLGNvbnNlY3V0aXZlTG93SW5wdXRBdWRpb0xldmVsOmgsY29uc2VjdXRpdmVOb0F1ZGlvT3V0cHV0UGFja2V0czpmLGNvbnNlY3V0aXZlTG93T3V0cHV0QXVkaW9MZXZlbDpnLGF1ZGlvSW5wdXRDb25uZWN0ZWREdXJhdGlvblNlY29uZHM6bSxjY3BNZWRpYVJlYWR5TGF0ZW5jeU1pbGxpczowLGNvbnRhY3RTdWJ0eXBlOm4uZ2V0Q29udGFjdFN1YnR5cGUoKSxlYXJseUd1bUVuYWJsZWQ6ITEsZWFybHlHdW1Xb3JrZWQ6ITEsdmRpUGxhdGZvcm06dnx8bnVsbCxzdHJlYW1Kc1ZlcnNpb246dC52ZXJzaW9ufTt0LnB1Ymxpc2hTb2Z0cGhvbmVSZXBvcnQoe2NvbnRhY3RJZDpuLmdldENvbnRhY3RJZCgpLGNjcFZlcnNpb246ZS5jY3BWZXJzaW9uLHJlcG9ydDp5fSksUy5pbmZvKCJzZW50IFRlbGVtZXRyeUNhbGxSZXBvcnQgIitKU09OLnN0cmluZ2lmeSh5KSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0obixyLFoobCxpKSxaKHAscykpLFYobil9LFE9ZnVuY3Rpb24oZSx0LG4scixvLGkscyl7dGhpcy5zb2Z0cGhvbmVTdHJlYW1UeXBlPXIsdGhpcy50aW1lc3RhbXA9ZSx0aGlzLnBhY2tldHNMb3N0PXQsdGhpcy5wYWNrZXRzQ291bnQ9bix0aGlzLmF1ZGlvTGV2ZWw9byx0aGlzLmppdHRlckJ1ZmZlck1pbGxpcz1pLHRoaXMucm91bmRUcmlwVGltZU1pbGxpcz1zfSxaPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBRKChlPWV8fHt9KS50aW1lc3RhbXAsZS5wYWNrZXRzTG9zdCxlLnBhY2tldHNDb3VudCx0LGUuYXVkaW9MZXZlbCl9LGVlPWZ1bmN0aW9uKGUpe3RoaXMuX29yaWdpbmFsTG9nZ2VyPWU7dmFyIG49dGhpczt0aGlzLl90ZWU9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHNbMF0pLG89IiI7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oKXtvKz0iICVzIn0pKSxyLmFwcGx5KG4uX29yaWdpbmFsTG9nZ2VyLFt0LkxvZ0NvbXBvbmVudC5TT0ZUUEhPTkUsb10uY29uY2F0KGUpKX19fTtlZS5wcm90b3R5cGUuZGVidWc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGVlKDEsdGhpcy5fb3JpZ2luYWxMb2dnZXIuZGVidWcpKGFyZ3VtZW50cyl9LGVlLnByb3RvdHlwZS5pbmZvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RlZSgyLHRoaXMuX29yaWdpbmFsTG9nZ2VyLmluZm8pKGFyZ3VtZW50cyl9LGVlLnByb3RvdHlwZS5sb2c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGVlKDMsdGhpcy5fb3JpZ2luYWxMb2dnZXIubG9nKShhcmd1bWVudHMpfSxlZS5wcm90b3R5cGUud2Fybj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90ZWUoNCx0aGlzLl9vcmlnaW5hbExvZ2dlci53YXJuKShhcmd1bWVudHMpfSxlZS5wcm90b3R5cGUuZXJyb3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGVlKDUsdGhpcy5fb3JpZ2luYWxMb2dnZXIuZXJyb3IpKGFyZ3VtZW50cyl9LHQuU29mdHBob25lTWFuYWdlcj1BfSgpfSw5NDQ6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jYWNoZS5oYXNPd25Qcm9wZXJ0eShhcmd1bWVudHNbMF0pfHwodC5jYWNoZVthcmd1bWVudHNbMF1dPXQucGFyc2UoYXJndW1lbnRzWzBdKSksdC5mb3JtYXQuY2FsbChudWxsLHQuY2FjaGVbYXJndW1lbnRzWzBdXSxhcmd1bWVudHMpfTtmdW5jdGlvbiBuKGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwtMSkudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiByKGUsdCl7Zm9yKHZhciBuPVtdO3Q+MDtuWy0tdF09ZSk7cmV0dXJuIG4uam9pbigiIil9dC5mb3JtYXQ9ZnVuY3Rpb24oZSxvKXt2YXIgaSxzLGEsYyx1LGwscCxkPTEsaD1lLmxlbmd0aCxmPSIiLGc9W107Zm9yKHM9MDtzPGg7cysrKWlmKCJzdHJpbmciPT09KGY9bihlW3NdKSkpZy5wdXNoKGVbc10pO2Vsc2UgaWYoImFycmF5Ij09PWYpe2lmKChjPWVbc10pWzJdKWZvcihpPW9bZF0sYT0wO2E8Y1syXS5sZW5ndGg7YSsrKXtpZighaS5oYXNPd25Qcm9wZXJ0eShjWzJdW2FdKSl0aHJvdyB0KCdbc3ByaW50Zl0gcHJvcGVydHkgIiVzIiBkb2VzIG5vdCBleGlzdCcsY1syXVthXSk7aT1pW2NbMl1bYV1dfWVsc2UgaT1jWzFdP29bY1sxXV06b1tkKytdO2lmKC9bXnNdLy50ZXN0KGNbOF0pJiYibnVtYmVyIiE9bihpKSl0aHJvdyB0KCJbc3ByaW50Zl0gZXhwZWN0aW5nIG51bWJlciBidXQgZm91bmQgJXMiLG4oaSkpO3N3aXRjaChjWzhdKXtjYXNlImIiOmk9aS50b1N0cmluZygyKTticmVhaztjYXNlImMiOmk9U3RyaW5nLmZyb21DaGFyQ29kZShpKTticmVhaztjYXNlImQiOmk9cGFyc2VJbnQoaSwxMCk7YnJlYWs7Y2FzZSJlIjppPWNbN10/aS50b0V4cG9uZW50aWFsKGNbN10pOmkudG9FeHBvbmVudGlhbCgpO2JyZWFrO2Nhc2UiZiI6aT1jWzddP3BhcnNlRmxvYXQoaSkudG9GaXhlZChjWzddKTpwYXJzZUZsb2F0KGkpO2JyZWFrO2Nhc2UibyI6aT1pLnRvU3RyaW5nKDgpO2JyZWFrO2Nhc2UicyI6aT0oaT1TdHJpbmcoaSkpJiZjWzddP2kuc3Vic3RyaW5nKDAsY1s3XSk6aTticmVhaztjYXNlInUiOmk+Pj49MDticmVhaztjYXNlIngiOmk9aS50b1N0cmluZygxNik7YnJlYWs7Y2FzZSJYIjppPWkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9aT0vW2RlZl0vLnRlc3QoY1s4XSkmJmNbM10mJmk+PTA/IisiK2k6aSxsPWNbNF0/IjAiPT1jWzRdPyIwIjpjWzRdLmNoYXJBdCgxKToiICIscD1jWzZdLVN0cmluZyhpKS5sZW5ndGgsdT1jWzZdP3IobCxwKToiIixnLnB1c2goY1s1XT9pK3U6dStpKX1yZXR1cm4gZy5qb2luKCIiKX0sdC5jYWNoZT17fSx0LnBhcnNlPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLG49W10scj1bXSxvPTA7dDspe2lmKG51bGwhPT0obj0vXlteXHgyNV0rLy5leGVjKHQpKSlyLnB1c2goblswXSk7ZWxzZSBpZihudWxsIT09KG49L15ceDI1ezJ9Ly5leGVjKHQpKSlyLnB1c2goIiUiKTtlbHNle2lmKG51bGw9PT0obj0vXlx4MjUoPzooWzEtOV1cZCopXCR8XCgoW15cKV0rKVwpKT8oXCspPygwfCdbXiRdKT8oLSk/KFxkKyk/KD86XC4oXGQrKSk/KFtiLWZvc3V4WF0pLy5leGVjKHQpKSl0aHJvdyJbc3ByaW50Zl0gaHVoPyI7aWYoblsyXSl7b3w9MTt2YXIgaT1bXSxzPW5bMl0sYT1bXTtpZihudWxsPT09KGE9L14oW2Etel9dW2Etel9cZF0qKS9pLmV4ZWMocykpKXRocm93IltzcHJpbnRmXSBodWg/Ijtmb3IoaS5wdXNoKGFbMV0pOyIiIT09KHM9cy5zdWJzdHJpbmcoYVswXS5sZW5ndGgpKTspaWYobnVsbCE9PShhPS9eXC4oW2Etel9dW2Etel9cZF0qKS9pLmV4ZWMocykpKWkucHVzaChhWzFdKTtlbHNle2lmKG51bGw9PT0oYT0vXlxbKFxkKylcXS8uZXhlYyhzKSkpdGhyb3ciW3NwcmludGZdIGh1aD8iO2kucHVzaChhWzFdKX1uWzJdPWl9ZWxzZSBvfD0yO2lmKDM9PT1vKXRocm93IltzcHJpbnRmXSBtaXhpbmcgcG9zaXRpb25hbCBhbmQgbmFtZWQgcGxhY2Vob2xkZXJzIGlzIG5vdCAoeWV0KSBzdXBwb3J0ZWQiO3IucHVzaChuKX10PXQuc3Vic3RyaW5nKG5bMF0ubGVuZ3RoKX1yZXR1cm4gcn0sZS5zcHJpbnRmPXQsZS52c3ByaW50Zj1mdW5jdGlvbihlLG4scil7cmV0dXJuKHI9bi5zbGljZSgwKSkuc3BsaWNlKDAsMCxlKSx0LmFwcGx5KG51bGwscil9fSgpfSw4MjooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10O3ZhciBuPWZ1bmN0aW9uKCl7fTtuLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKGUpe3Rocm93IG5ldyB0Lk5vdEltcGxlbWVudGVkRXJyb3J9LG4ucHJvdG90eXBlLm9uTWVzc2FnZT1mdW5jdGlvbihlKXt0aHJvdyBuZXcgdC5Ob3RJbXBsZW1lbnRlZEVycm9yfTt2YXIgcj1mdW5jdGlvbigpe24uY2FsbCh0aGlzKX07KHIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1yLHIucHJvdG90eXBlLm9uTWVzc2FnZT1mdW5jdGlvbihlKXt9LHIucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24oZSl7fTt2YXIgbz1mdW5jdGlvbihlLHQpe24uY2FsbCh0aGlzKSx0aGlzLndpbmRvdz1lLHRoaXMuZG9tYWluPXR8fCIqIn07KG8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1vLG8ucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24oZSl7dGhpcy53aW5kb3cucG9zdE1lc3NhZ2UoZSx0aGlzLmRvbWFpbil9LG8ucHJvdG90eXBlLm9uTWVzc2FnZT1mdW5jdGlvbihlKXt0aGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixlKX07dmFyIGk9ZnVuY3Rpb24oZSx0LHIpe24uY2FsbCh0aGlzKSx0aGlzLmlucHV0PWUsdGhpcy5vdXRwdXQ9dCx0aGlzLmRvbWFpbj1yfHwiKiJ9OyhpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9aSxpLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKGUpe3RoaXMub3V0cHV0LnBvc3RNZXNzYWdlKGUsdGhpcy5kb21haW4pfSxpLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dGhpcy5pbnB1dC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwodD0+e3Quc291cmNlPT09dGhpcy5vdXRwdXQmJmUodCl9KSl9O3ZhciBzPWZ1bmN0aW9uKGUpe24uY2FsbCh0aGlzKSx0aGlzLnBvcnQ9ZSx0aGlzLmlkPXQucmFuZG9tSWQoKX07KHMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1zLHMucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24oZSl7dGhpcy5wb3J0LnBvc3RNZXNzYWdlKGUpfSxzLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dGhpcy5wb3J0LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGUpfSxzLnByb3RvdHlwZS5nZXRJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfTt2YXIgYT1mdW5jdGlvbihlKXtuLmNhbGwodGhpcyksdGhpcy5zdHJlYW1NYXA9ZT90LmluZGV4KGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldElkKCl9KSk6e30sdGhpcy5tZXNzYWdlTGlzdGVuZXJzPVtdfTsoYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWEsYS5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt0aGlzLmdldFN0cmVhbXMoKS5mb3JFYWNoKChmdW5jdGlvbih0KXt0cnl7dC5zZW5kKGUpfWNhdGNoKGUpe319KSl9LGEucHJvdG90eXBlLm9uTWVzc2FnZT1mdW5jdGlvbihlKXt0aGlzLm1lc3NhZ2VMaXN0ZW5lcnMucHVzaChlKSx0aGlzLmdldFN0cmVhbXMoKS5mb3JFYWNoKChmdW5jdGlvbih0KXt0Lm9uTWVzc2FnZShlKX0pKX0sYS5wcm90b3R5cGUuYWRkU3RyZWFtPWZ1bmN0aW9uKGUpe3RoaXMuc3RyZWFtTWFwW2UuZ2V0SWQoKV09ZSx0aGlzLm1lc3NhZ2VMaXN0ZW5lcnMuZm9yRWFjaCgoZnVuY3Rpb24odCl7ZS5vbk1lc3NhZ2UodCl9KSl9LGEucHJvdG90eXBlLnJlbW92ZVN0cmVhbT1mdW5jdGlvbihlKXtkZWxldGUgdGhpcy5zdHJlYW1NYXBbZS5nZXRJZCgpXX0sYS5wcm90b3R5cGUuZ2V0U3RyZWFtcz1mdW5jdGlvbihlKXtyZXR1cm4gdC52YWx1ZXModGhpcy5zdHJlYW1NYXApfSxhLnByb3RvdHlwZS5nZXRTdHJlYW1Gb3JQb3J0PWZ1bmN0aW9uKGUpe3JldHVybiB0LmZpbmQodGhpcy5nZXRTdHJlYW1zKCksKGZ1bmN0aW9uKHQpe3JldHVybiB0LnBvcnQ9PT1lfSkpfTt2YXIgYz1mdW5jdGlvbihlLG4sbyl7dGhpcy5uYW1lPWUsdGhpcy51cHN0cmVhbT1ufHxuZXcgcix0aGlzLmRvd25zdHJlYW09b3x8bmV3IHIsdGhpcy5kb3duc3RyZWFtQnVzPW5ldyB0LkV2ZW50QnVzLHRoaXMudXBzdHJlYW1CdXM9bmV3IHQuRXZlbnRCdXMsdGhpcy51cHN0cmVhbS5vbk1lc3NhZ2UodC5oaXRjaCh0aGlzLHRoaXMuX2Rpc3BhdGNoRXZlbnQsdGhpcy51cHN0cmVhbUJ1cykpLHRoaXMuZG93bnN0cmVhbS5vbk1lc3NhZ2UodC5oaXRjaCh0aGlzLHRoaXMuX2Rpc3BhdGNoRXZlbnQsdGhpcy5kb3duc3RyZWFtQnVzKSl9O2MucHJvdG90eXBlLm9uVXBzdHJlYW09ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKGUsImV2ZW50TmFtZSIpLHQuYXNzZXJ0Tm90TnVsbChuLCJmIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwiZiBtdXN0IGJlIGEgZnVuY3Rpb24iKSx0aGlzLnVwc3RyZWFtQnVzLnN1YnNjcmliZShlLG4pfSxjLnByb3RvdHlwZS5vbkFsbFVwc3RyZWFtPWZ1bmN0aW9uKGUpe3JldHVybiB0LmFzc2VydE5vdE51bGwoZSwiZiIpLHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24oZSksImYgbXVzdCBiZSBhIGZ1bmN0aW9uIiksdGhpcy51cHN0cmVhbUJ1cy5zdWJzY3JpYmVBbGwoZSl9LGMucHJvdG90eXBlLm9uRG93bnN0cmVhbT1mdW5jdGlvbihlLG4pe3JldHVybiB0LmFzc2VydE5vdE51bGwoZSwiZXZlbnROYW1lIiksdC5hc3NlcnROb3ROdWxsKG4sImYiKSx0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJmIG11c3QgYmUgYSBmdW5jdGlvbiIpLHRoaXMuZG93bnN0cmVhbUJ1cy5zdWJzY3JpYmUoZSxuKX0sYy5wcm90b3R5cGUub25BbGxEb3duc3RyZWFtPWZ1bmN0aW9uKGUpe3JldHVybiB0LmFzc2VydE5vdE51bGwoZSwiZiIpLHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24oZSksImYgbXVzdCBiZSBhIGZ1bmN0aW9uIiksdGhpcy5kb3duc3RyZWFtQnVzLnN1YnNjcmliZUFsbChlKX0sYy5wcm90b3R5cGUuc2VuZFVwc3RyZWFtPWZ1bmN0aW9uKGUsbil7dC5hc3NlcnROb3ROdWxsKGUsImV2ZW50TmFtZSIpLHRoaXMudXBzdHJlYW0uc2VuZCh7ZXZlbnQ6ZSxkYXRhOm59KX0sYy5wcm90b3R5cGUuc2VuZERvd25zdHJlYW09ZnVuY3Rpb24oZSxuKXt0LmFzc2VydE5vdE51bGwoZSwiZXZlbnROYW1lIiksdGhpcy5kb3duc3RyZWFtLnNlbmQoe2V2ZW50OmUsZGF0YTpufSl9LGMucHJvdG90eXBlLl9kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGUsdCl7dmFyIG49dC5kYXRhO24uZXZlbnQmJmUudHJpZ2dlcihuLmV2ZW50LG4uZGF0YSl9LGMucHJvdG90eXBlLnBhc3NVcHN0cmVhbT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKHQsbil7ZS51cHN0cmVhbS5zZW5kKHtldmVudDpuLGRhdGE6dH0pfX0sYy5wcm90b3R5cGUucGFzc0Rvd25zdHJlYW09ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiBmdW5jdGlvbih0LG4pe2UuZG93bnN0cmVhbS5zZW5kKHtldmVudDpuLGRhdGE6dH0pfX0sYy5wcm90b3R5cGUuc2h1dGRvd249ZnVuY3Rpb24oKXt0aGlzLnVwc3RyZWFtQnVzLnVuc3Vic2NyaWJlQWxsKCksdGhpcy5kb3duc3RyZWFtQnVzLnVuc3Vic2NyaWJlQWxsKCl9O3ZhciB1PWZ1bmN0aW9uKGUsdCxuLHIpe2MuY2FsbCh0aGlzLGUsbmV3IGkodCxuLmNvbnRlbnRXaW5kb3cscnx8IioiKSxudWxsKX07KHUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYy5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj11LHQuU3RyZWFtPW4sdC5OdWxsU3RyZWFtPXIsdC5XaW5kb3dTdHJlYW09byx0LldpbmRvd0lPU3RyZWFtPWksdC5Qb3J0U3RyZWFtPXMsdC5TdHJlYW1NdWx0aXBsZXhlcj1hLHQuQ29uZHVpdD1jLHQuSUZyYW1lQ29uZHVpdD11fSgpfSw4MzM6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dDt2YXIgbj1mdW5jdGlvbihlLG4pe3QuYXNzZXJ0Tm90TnVsbChlLCJmcm9tU3RhdGUiKSx0LmFzc2VydE5vdE51bGwobiwidG9TdGF0ZSIpLHRoaXMuZnJvbVN0YXRlPWUsdGhpcy50b1N0YXRlPW59O24ucHJvdG90eXBlLmdldEFzc29jaWF0aW9ucz1mdW5jdGlvbihlKXt0aHJvdyB0Lk5vdEltcGxlbWVudGVkRXJyb3IoKX0sbi5wcm90b3R5cGUuZ2V0RnJvbVN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZnJvbVN0YXRlfSxuLnByb3RvdHlwZS5nZXRUb1N0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9TdGF0ZX07dmFyIHI9ZnVuY3Rpb24oZSxyLG8pe3QuYXNzZXJ0Tm90TnVsbChlLCJmcm9tU3RhdGUiKSx0LmFzc2VydE5vdE51bGwociwidG9TdGF0ZSIpLHQuYXNzZXJ0Tm90TnVsbChvLCJhc3NvY2lhdGlvbnMiKSxuLmNhbGwodGhpcyxlLHIpLHRoaXMuYXNzb2NpYXRpb25zPW99OyhyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cixyLnByb3RvdHlwZS5nZXRBc3NvY2lhdGlvbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYXNzb2NpYXRpb25zfTt2YXIgbz1mdW5jdGlvbihlLHIsbyl7dC5hc3NlcnROb3ROdWxsKGUsImZyb21TdGF0ZSIpLHQuYXNzZXJ0Tm90TnVsbChyLCJ0b1N0YXRlIiksdC5hc3NlcnROb3ROdWxsKG8sImNsb3N1cmUiKSx0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG8pLCJjbG9zdXJlIG11c3QgYmUgYSBmdW5jdGlvbiIpLG4uY2FsbCh0aGlzLGUsciksdGhpcy5jbG9zdXJlPW99OyhvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9byxvLnByb3RvdHlwZS5nZXRBc3NvY2lhdGlvbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2xvc3VyZShlLHRoaXMuZ2V0RnJvbVN0YXRlKCksdGhpcy5nZXRUb1N0YXRlKCkpfTt2YXIgaT1mdW5jdGlvbigpe3RoaXMuZnJvbU1hcD17fX07aS5BTlk9Ijw8YW55Pj4iLGkucHJvdG90eXBlLmFzc29jPWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10aGlzO2lmKCFlKXRocm93IG5ldyBFcnJvcigiZnJvbVN0YXRlT2JqIGlzIG5vdCBkZWZpbmVkLiIpO2lmKCF0KXRocm93IG5ldyBFcnJvcigidG9TdGF0ZU9iaiBpcyBub3QgZGVmaW5lZC4iKTtpZighbil0aHJvdyBuZXcgRXJyb3IoImFzc29jT2JqIGlzIG5vdCBkZWZpbmVkLiIpO3JldHVybiBlIGluc3RhbmNlb2YgQXJyYXk/ZS5mb3JFYWNoKChmdW5jdGlvbihlKXtpLmFzc29jKGUsdCxuKX0pKTp0IGluc3RhbmNlb2YgQXJyYXk/dC5mb3JFYWNoKChmdW5jdGlvbih0KXtpLmFzc29jKGUsdCxuKX0pKToiZnVuY3Rpb24iPT10eXBlb2Ygbj90aGlzLl9hZGRBc3NvY2lhdGlvbihuZXcgbyhlLHQsbikpOm4gaW5zdGFuY2VvZiBBcnJheT90aGlzLl9hZGRBc3NvY2lhdGlvbihuZXcgcihlLHQsbikpOnRoaXMuX2FkZEFzc29jaWF0aW9uKG5ldyByKGUsdCxbbl0pKSx0aGlzfSxpLnByb3RvdHlwZS5nZXRBc3NvY2lhdGlvbnM9ZnVuY3Rpb24oZSxuLHIpe3QuYXNzZXJ0Tm90TnVsbChuLCJmcm9tU3RhdGUiKSx0LmFzc2VydE5vdE51bGwociwidG9TdGF0ZSIpO3ZhciBvPVtdLHM9dGhpcy5mcm9tTWFwW2kuQU5ZXXx8e30sYT10aGlzLmZyb21NYXBbbl18fHt9O3JldHVybiBvPShvPW8uY29uY2F0KHRoaXMuX2dldEFzc29jaWF0aW9uc0Zyb21NYXAocyxlLG4scikpKS5jb25jYXQodGhpcy5fZ2V0QXNzb2NpYXRpb25zRnJvbU1hcChhLGUsbixyKSl9LGkucHJvdG90eXBlLl9hZGRBc3NvY2lhdGlvbj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmZyb21NYXBbZS5nZXRGcm9tU3RhdGUoKV07dHx8KHQ9dGhpcy5mcm9tTWFwW2UuZ2V0RnJvbVN0YXRlKCldPXt9KTt2YXIgbj10W2UuZ2V0VG9TdGF0ZSgpXTtufHwobj10W2UuZ2V0VG9TdGF0ZSgpXT1bXSksbi5wdXNoKGUpfSxpLnByb3RvdHlwZS5fZ2V0QXNzb2NpYXRpb25zRnJvbU1hcD1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4oZVtpLkFOWV18fFtdKS5jb25jYXQoZVtyXXx8W10pLnJlZHVjZSgoZnVuY3Rpb24oZSxuKXtyZXR1cm4gZS5jb25jYXQobi5nZXRBc3NvY2lhdGlvbnModCkpfSksW10pfSx0LkV2ZW50R3JhcGg9aX0oKX0sODkxOigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQ7dmFyIG49bmF2aWdhdG9yLnVzZXJBZ2VudCxyPVsiYnViYmxlcyIsImNhbmNlbEJ1YmJsZSIsImNhbmNlbGFibGUiLCJjb21wb3NlZCIsImRhdGEiLCJkZWZhdWx0UHJldmVudGVkIiwiZXZlbnRQaGFzZSIsImlzVHJ1c3RlZCIsImxhc3RFdmVudElkIiwib3JpZ2luIiwicmV0dXJuVmFsdWUiLCJ0aW1lU3RhbXAiLCJ0eXBlIl07dC5zcHJpbnRmPWUuc3ByaW50Zix0LnZzcHJpbnRmPWUudnNwcmludGYsZGVsZXRlIGUuc3ByaW50ZixkZWxldGUgZS52c3ByaW50Zix0LkhUVFBfU1RBVFVTX0NPREVTPXtTVUNDRVNTOjIwMCxVTkFVVEhPUklaRUQ6NDAxLEFDQ0VTU19ERU5JRUQ6NDAzLFRPT19NQU5ZX1JFUVVFU1RTOjQyOSxJTlRFUk5BTF9TRVJWRVJfRVJST1I6NTAwfSx0LlRSQU5TUE9SVF9UWVBFUz17Q0hBVF9UT0tFTjoiY2hhdF90b2tlbiIsV0VCX1NPQ0tFVDoid2ViX3NvY2tldCIsQUdFTlRfRElTQ09WRVJZOiJhZ2VudF9kaXNjb3ZlcnkiLFdFQl9SVEM6IndlYl9ydGMifSx0LmhpdGNoPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSxuPWUuc2hpZnQoKSxyPWUuc2hpZnQoKTtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKG4sInNjb3BlIiksdC5hc3NlcnROb3ROdWxsKHIsIm1ldGhvZCIpLHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24ociksIm1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24iKSxmdW5jdGlvbigpe3ZhciB0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7cmV0dXJuIHIuYXBwbHkobixlLmNvbmNhdCh0KSl9fSx0LmlzRnVuY3Rpb249ZnVuY3Rpb24oZSl7cmV0dXJuISEoZSYmZS5jb25zdHJ1Y3RvciYmZS5jYWxsJiZlLmFwcGx5KX0sdC5pc0FycmF5PWZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9LHQua2V5cz1mdW5jdGlvbihlKXt2YXIgbj1bXTtmb3IodmFyIHIgaW4gdC5hc3NlcnROb3ROdWxsKGUsIm1hcCIpLGUpbi5wdXNoKHIpO3JldHVybiBufSx0LnZhbHVlcz1mdW5jdGlvbihlKXt2YXIgbj1bXTtmb3IodmFyIHIgaW4gdC5hc3NlcnROb3ROdWxsKGUsIm1hcCIpLGUpbi5wdXNoKGVbcl0pO3JldHVybiBufSx0LmVudHJpZXM9ZnVuY3Rpb24oZSl7dmFyIHQ9W107Zm9yKHZhciBuIGluIGUpdC5wdXNoKHtrZXk6bix2YWx1ZTplW25dfSk7cmV0dXJuIHR9LHQubWVyZ2U9ZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCksbj17fTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmVudHJpZXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bltlLmtleV09ZS52YWx1ZX0pKX0pKSxufSx0Lm5vdz1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSx0LmZpbmQ9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZih0KGVbbl0pKXJldHVybiBlW25dO3JldHVybiBudWxsfSx0LmNvbnRhaW5zPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheT9udWxsIT10LmZpbmQoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1ufSkpOm4gaW4gZX0sdC5jb250YWluc1ZhbHVlPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheT9udWxsIT10LmZpbmQoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1ufSkpOm51bGwhPXQuZmluZCh0LnZhbHVlcyhlKSwoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1ufSkpfSx0LnJhbmRvbUlkPWZ1bmN0aW9uKCl7cmV0dXJuIHQuc3ByaW50ZigiJXMtJXMiLHQubm93KCksTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMikpfSx0Lm1ha2VFbnVtPWZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPWUucmVwbGFjZSgvXC4/KFthLXpdKylfPy9nLChmdW5jdGlvbihlLHQpe3JldHVybiB0LnRvVXBwZXJDYXNlKCkrIl8ifSkpLnJlcGxhY2UoL18kLywiIik7dFtuXT1lfSkpLHR9LHQubWFrZU5hbWVzcGFjZWRFbnVtPWZ1bmN0aW9uKGUsbil7dmFyIHI9dC5tYWtlRW51bShuKTtyZXR1cm4gdC5rZXlzKHIpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3Jbbl09dC5zcHJpbnRmKCIlczo6JXMiLGUscltuXSl9KSkscn0sdC5tYWtlR2VuZXJpY05hbWVzcGFjZWRFbnVtPWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10Lm1ha2VFbnVtKG4pO3JldHVybiB0LmtleXMobykuZm9yRWFjaCgoZnVuY3Rpb24obil7b1tuXT10LnNwcmludGYoIiVzIityKyIlcyIsZSxvW25dKX0pKSxvfSx0LmlzQ2hyb21lQnJvd3Nlcj1mdW5jdGlvbigpe3JldHVybi0xIT09bi5pbmRleE9mKCJDaHJvbWUiKX0sdC5pc0ZpcmVmb3hCcm93c2VyPWZ1bmN0aW9uKCl7cmV0dXJuLTEhPT1uLmluZGV4T2YoIkZpcmVmb3giKX0sdC5pc09wZXJhQnJvd3Nlcj1mdW5jdGlvbigpe3JldHVybi0xIT09bi5pbmRleE9mKCJPcGVyYSIpfSx0LmlzRWRnZUJyb3dzZXI9ZnVuY3Rpb24oKXtyZXR1cm4tMSE9PW4uaW5kZXhPZigiRWRnIil9LHQuZ2V0Q2hyb21lQnJvd3NlclZlcnNpb249ZnVuY3Rpb24oKXt2YXIgZT1uLnN1YnN0cmluZyhuLmluZGV4T2YoIkNocm9tZSIpKzcpO3JldHVybiBlP3BhcnNlRmxvYXQoZSk6LTF9LHQuZ2V0RmlyZWZveEJyb3dzZXJWZXJzaW9uPWZ1bmN0aW9uKCl7dmFyIGU9bi5zdWJzdHJpbmcobi5pbmRleE9mKCJGaXJlZm94IikrOCk7cmV0dXJuIGU/cGFyc2VGbG9hdChlKTotMX0sdC5pc1ZhbGlkTG9jYWxlPWZ1bmN0aW9uKGUpe3JldHVyblt7aWQ6ImVuX1VTIixsYWJlbDoiRW5nbGlzaCJ9LHtpZDoiZGVfREUiLGxhYmVsOiJEZXV0c2NoIn0se2lkOiJlc19FUyIsbGFiZWw6IkVzcGHDsW9sIn0se2lkOiJmcl9GUiIsbGFiZWw6IkZyYW7Dp2FpcyJ9LHtpZDoiamFfSlAiLGxhYmVsOiLml6XmnKzoqp4ifSx7aWQ6Iml0X0lUIixsYWJlbDoiSXRhbGlhbm8ifSx7aWQ6ImtvX0tSIixsYWJlbDoi7ZWc6rWt7Ja0In0se2lkOiJwdF9CUiIsbGFiZWw6IlBvcnR1Z3XDqnMifSx7aWQ6InpoX0NOIixsYWJlbDoi5Lit5paHKOeugOS9kykifSx7aWQ6InpoX1RXIixsYWJlbDoi5Lit5paHKOe5gemrlCkifV0ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS5pZH0pKS5pbmNsdWRlcyhlKX0sdC5nZXRPcGVyYUJyb3dzZXJWZXJzaW9uPWZ1bmN0aW9uKCl7dmFyIGU9bi5pbmRleE9mKCJPcGVyYSIpLHQ9LTEhPT1uLmluZGV4T2YoIlZlcnNpb24iKT9uLnN1YnN0cmluZyhlKzgpOm4uc3Vic3RyaW5nKGUrNik7cmV0dXJuIHQ/cGFyc2VGbG9hdCh0KTotMX0sdC5pbmRleD1mdW5jdGlvbihlLHQpe3ZhciBuPXt9O3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe25bdChlKV09ZX0pKSxufSx0LnNldD1mdW5jdGlvbihlKXt2YXIgdD17fTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXt0W2VdPTF9KSksdH0sdC5yZWxhdGl2ZUNvbXBsZW1lbnQ9ZnVuY3Rpb24oZSxuKXt2YXIgcj17fTtyZXR1cm4gdC5rZXlzKG4pLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QgaW4gZXx8KHJbdF09blt0XSl9KSkscn0sdC5hc3NlcnRUcnVlPWZ1bmN0aW9uKGUsbil7aWYoIWUpdGhyb3cgbmV3IHQuVmFsdWVFcnJvcihuKX0sdC5hc3NlcnROb3ROdWxsPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuYXNzZXJ0VHJ1ZShudWxsIT1lJiZ2b2lkIDAhPT10eXBlb2YgZSx0LnNwcmludGYoIiVzIG11c3QgYmUgcHJvdmlkZWQiLG58fCJBIHZhbHVlIikpLGV9LHQuZGVlcGNvcHk9ZnVuY3Rpb24oZSl7cmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZSkpfSx0LmRlZXBjb3B5Q3Jvc3NPcmlnaW5FdmVudD1mdW5jdGlvbihlKXtjb25zdCBuPXt9O3JldHVybiByLmZvckVhY2goKHI9Pnt0cnl7bltyXT1lW3JdfWNhdGNoKGUpe3QuZ2V0TG9nKCkuaW5mbygiZGVlcGNvcHlDcm9zc09yaWdpbkV2ZW50IGZhaWxlZCBvbiBrZXk6ICIscikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19KSksdC5kZWVwY29weShuKX0sdC5nZXRCYXNlVXJsPWZ1bmN0aW9uKCl7dmFyIG49ZS5sb2NhdGlvbjtyZXR1cm4gdC5zcHJpbnRmKCIlcy8vJXM6JXMiLG4ucHJvdG9jb2wsbi5ob3N0bmFtZSxuLnBvcnQpfSx0LmdldFVybFdpdGhQcm90b2NvbD1mdW5jdGlvbihuKXt2YXIgcj1lLmxvY2F0aW9uLnByb3RvY29sO3JldHVybiBuLnN1YnN0cigwLHIubGVuZ3RoKSE9PXI/dC5zcHJpbnRmKCIlcy8vJXMiLHIsbik6bn0sdC5pc0ZyYW1lZD1mdW5jdGlvbigpe3RyeXtyZXR1cm4gd2luZG93LnNlbGYhPT13aW5kb3cudG9wfWNhdGNoKGUpe3JldHVybiEwfX0sdC5oYXNPdGhlckNvbm5lY3RlZENDUHM9ZnVuY3Rpb24oKXtyZXR1cm4gdC5udW1iZXJPZkNvbm5lY3RlZENDUHM+MX0sdC5mZXRjaD1mdW5jdGlvbihlLG4scixvKXtyZXR1cm4gbz1vfHw1LHI9cnx8MWUzLG49bnx8e30sbmV3IFByb21pc2UoKGZ1bmN0aW9uKGkscyl7IWZ1bmN0aW9uIG8oYSl7ZmV0Y2goZSxuKS50aGVuKChmdW5jdGlvbihlKXtlLnN0YXR1cz09PXQuSFRUUF9TVEFUVVNfQ09ERVMuU1VDQ0VTUz9lLmpzb24oKS50aGVuKChlPT5pKGUpKSkuY2F0Y2goKCgpPT5pKHt9KSkpOjEhPT1hJiYoZS5zdGF0dXM+PXQuSFRUUF9TVEFUVVNfQ09ERVMuSU5URVJOQUxfU0VSVkVSX0VSUk9SfHxlLnN0YXR1cz09PXQuSFRUUF9TVEFUVVNfQ09ERVMuVE9PX01BTllfUkVRVUVTVFMpP3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bygtLWEpfSkscik6cyhlKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cyhlKX0pKX0obyl9KSl9LHQuZmV0Y2hXaXRoVGltZW91dD1hc3luYyBmdW5jdGlvbihlLG4scixvLGkpe2lmKHI9cnx8e30sIW4pcmV0dXJuIHQuZmV0Y2goZSxyLG8saSk7Y29uc3Qgcz1uZXcgQWJvcnRDb250cm9sbGVyLGE9c2V0VGltZW91dCgoKCk9PnMuYWJvcnQoKSksbiksYz1hd2FpdCB0LmZldGNoKGUsey4uLnIsc2lnbmFsOnMuc2lnbmFsfSxvLGkpO3JldHVybiBjbGVhclRpbWVvdXQoYSksY30sdC5iYWNrb2ZmPWZ1bmN0aW9uKG4scixvLGkpe3QuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksImZ1bmMgbXVzdCBiZSBhIEZ1bmN0aW9uIik7dmFyIHM9dGhpcztuKHtzdWNjZXNzOmZ1bmN0aW9uKGUpe2kmJmkuc3VjY2VzcyYmaS5zdWNjZXNzKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKHQsYSl7aWYobz4wKXt2YXIgYz0yKnIqTWF0aC5yYW5kb20oKTtlLnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cy5iYWNrb2ZmKG4sMipjLC0tbyxpKX0pLGMpfWVsc2UgaSYmaS5mYWlsdXJlJiZpLmZhaWx1cmUodCxhKX19KX0sdC5wdWJsaXNoTWV0cmljPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuRXZlbnRUeXBlLkNMSUVOVF9NRVRSSUMsZGF0YTplfSl9LHQucHVibGlzaFNvZnRwaG9uZVN0YXRzPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuRXZlbnRUeXBlLlNPRlRQSE9ORV9TVEFUUyxkYXRhOmV9KX0sdC5wdWJsaXNoU29mdHBob25lUmVwb3J0PWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuRXZlbnRUeXBlLlNPRlRQSE9ORV9SRVBPUlQsZGF0YTplfSl9LHQucHVibGlzaENsaWNrU3RyZWFtRGF0YT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkV2ZW50VHlwZS5DTElDS19TVFJFQU1fREFUQSxkYXRhOmV9KX0sdC5wdWJsaXNoQ2xpZW50U2lkZUxvZ3M9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcih0LkV2ZW50VHlwZS5DTElFTlRfU0lERV9MT0dTLGUpfSx0LmFkZE5hbWVzcGFjZVRvTG9ncz1mdW5jdGlvbihlKXtbImxvZyIsImVycm9yIiwid2FybiIsImluZm8iLCJkZWJ1ZyJdLmZvckVhY2goKHQ9Pntjb25zdCBuPXdpbmRvdy5jb25zb2xlW3RdO3dpbmRvdy5jb25zb2xlW3RdPWZ1bmN0aW9uKCl7Y29uc3QgdD1BcnJheS5mcm9tKGFyZ3VtZW50cyk7dC51bnNoaWZ0KGBbJHtlfV1gKSxuLmFwcGx5KHdpbmRvdy5jb25zb2xlLHQpfX0pKX0sdC5Qb3B1cE1hbmFnZXI9ZnVuY3Rpb24oKXt9LHQuUG9wdXBNYW5hZ2VyLnByb3RvdHlwZS5vcGVuPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1udWxsO2lmKG4pe3ZhciBvPW4uaGVpZ2h0fHw1NzgsaT1uLndpZHRofHw0MzMscz1uLnRvcHx8MCxhPW4ubGVmdHx8MDsocj13aW5kb3cub3BlbigiIix0LCJ3aWR0aD0iK2krIiwgaGVpZ2h0PSIrbysiLCB0b3A9IitzKyIsIGxlZnQ9IithKSkubG9jYXRpb24hPT1lJiYocj13aW5kb3cub3BlbihlLHQsIndpZHRoPSIraSsiLCBoZWlnaHQ9IitvKyIsIHRvcD0iK3MrIiwgbGVmdD0iK2EpKX1lbHNlKHI9d2luZG93Lm9wZW4oIiIsdCkpLmxvY2F0aW9uIT09ZSYmKHI9d2luZG93Lm9wZW4oZSx0KSk7cmV0dXJuIHJ9LHQuUG9wdXBNYW5hZ2VyLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbih0KXt2YXIgbj10aGlzLl9nZXRMb2NhbFN0b3JhZ2VLZXkodCk7ZS5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuKX0sdC5Qb3B1cE1hbmFnZXIucHJvdG90eXBlLl9nZXRMYXN0T3BlbmVkVGltZXN0YW1wPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2dldExvY2FsU3RvcmFnZUtleSh0KSxyPWUubG9jYWxTdG9yYWdlLmdldEl0ZW0obik7cmV0dXJuIHI/cGFyc2VJbnQociwxMCk6MH0sdC5Qb3B1cE1hbmFnZXIucHJvdG90eXBlLl9zZXRMYXN0T3BlbmVkVGltZXN0YW1wPWZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcy5fZ2V0TG9jYWxTdG9yYWdlS2V5KHQpO2UubG9jYWxTdG9yYWdlLnNldEl0ZW0ociwiIituKX0sdC5Qb3B1cE1hbmFnZXIucHJvdG90eXBlLl9nZXRMb2NhbFN0b3JhZ2VLZXk9ZnVuY3Rpb24oZSl7cmV0dXJuImNvbm5lY3RQb3B1cE1hbmFnZXI6OiIrZX07dmFyIG89dC5tYWtlRW51bShbImdyYW50ZWQiLCJkZW5pZWQiLCJkZWZhdWx0Il0pO3QuTm90aWZpY2F0aW9uTWFuYWdlcj1mdW5jdGlvbigpe3RoaXMucXVldWU9W10sdGhpcy5wZXJtaXNzaW9uPW8uREVGQVVMVH0sdC5Ob3RpZmljYXRpb25NYW5hZ2VyLnByb3RvdHlwZS5yZXF1ZXN0UGVybWlzc2lvbj1mdW5jdGlvbigpe3ZhciBuPXRoaXM7Ik5vdGlmaWNhdGlvbiJpbiBlP2UuTm90aWZpY2F0aW9uLnBlcm1pc3Npb249PT1vLkRFTklFRD8odC5nZXRMb2coKS53YXJuKCJUaGUgdXNlciBoYXMgcmVxdWVzdGVkIHRvIG5vdCByZWNlaXZlIG5vdGlmaWNhdGlvbnMuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0aGlzLnBlcm1pc3Npb249by5ERU5JRUQpOnRoaXMucGVybWlzc2lvbiE9PW8uR1JBTlRFRCYmZS5Ob3RpZmljYXRpb24ucmVxdWVzdFBlcm1pc3Npb24oKS50aGVuKChmdW5jdGlvbihlKXtuLnBlcm1pc3Npb249ZSxlPT09by5HUkFOVEVEP24uX3Nob3dRdWV1ZWQoKTpuLnF1ZXVlPVtdfSkpOih0LmdldExvZygpLndhcm4oIlRoaXMgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgbm90aWZpY2F0aW9ucy4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHRoaXMucGVybWlzc2lvbj1vLkRFTklFRCl9LHQuTm90aWZpY2F0aW9uTWFuYWdlci5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbihlLG4pe2lmKHRoaXMucGVybWlzc2lvbj09PW8uR1JBTlRFRClyZXR1cm4gdGhpcy5fc2hvd0ltcGwoe3RpdGxlOmUsb3B0aW9uczpufSk7aWYodGhpcy5wZXJtaXNzaW9uPT09by5ERU5JRUQpdC5nZXRMb2coKS53YXJuKCJVbmFibGUgdG8gc2hvdyBub3RpZmljYXRpb24uIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoT2JqZWN0KHt0aXRsZTplLG9wdGlvbnM6bn0pO2Vsc2V7dmFyIHI9e3RpdGxlOmUsb3B0aW9uczpufTt0LmdldExvZygpLndhcm4oIkRlZmVycmluZyBub3RpZmljYXRpb24gdW50aWwgdXNlciBkZWNpZGVzIHRvIGFsbG93IG9yIGRlbnkuIikud2l0aE9iamVjdChyKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHRoaXMucXVldWUucHVzaChyKX19LHQuTm90aWZpY2F0aW9uTWFuYWdlci5wcm90b3R5cGUuX3Nob3dRdWV1ZWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5xdWV1ZS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9zaG93SW1wbCh0KX0pKTtyZXR1cm4gdGhpcy5xdWV1ZT1bXSx0fSx0Lk5vdGlmaWNhdGlvbk1hbmFnZXIucHJvdG90eXBlLl9zaG93SW1wbD1mdW5jdGlvbih0KXt2YXIgbj1uZXcgZS5Ob3RpZmljYXRpb24odC50aXRsZSx0Lm9wdGlvbnMpO3JldHVybiB0Lm9wdGlvbnMuY2xpY2tlZCYmKG4ub25jbGljaz1mdW5jdGlvbigpe3Qub3B0aW9ucy5jbGlja2VkLmNhbGwobil9KSxufSx0LlZhbHVlRXJyb3I9ZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCksbj1lLnNoaWZ0KCkscj1uZXcgRXJyb3IodC52c3ByaW50ZihuLGUpKTtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKHIsdC5WYWx1ZUVycm9yLnByb3RvdHlwZSkscn0sT2JqZWN0LnNldFByb3RvdHlwZU9mKHQuVmFsdWVFcnJvci5wcm90b3R5cGUsRXJyb3IucHJvdG90eXBlKSxPYmplY3Quc2V0UHJvdG90eXBlT2YodC5WYWx1ZUVycm9yLEVycm9yKSx0LlZhbHVlRXJyb3IucHJvdG90eXBlLm5hbWU9IlZhbHVlRXJyb3IiLHQuTm90SW1wbGVtZW50ZWRFcnJvcj1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSxuPWUuc2hpZnQoKSxyPW5ldyBFcnJvcih0LnZzcHJpbnRmKG4sZSkpO3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Yocix0Lk5vdEltcGxlbWVudGVkRXJyb3IucHJvdG90eXBlKSxyfSxPYmplY3Quc2V0UHJvdG90eXBlT2YodC5Ob3RJbXBsZW1lbnRlZEVycm9yLnByb3RvdHlwZSxFcnJvci5wcm90b3R5cGUpLE9iamVjdC5zZXRQcm90b3R5cGVPZih0Lk5vdEltcGxlbWVudGVkRXJyb3IsRXJyb3IpLHQuTm90SW1wbGVtZW50ZWRFcnJvci5wcm90b3R5cGUubmFtZT0iTm90SW1wbGVtZW50ZWRFcnJvciIsdC5TdGF0ZUVycm9yPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLG49ZS5zaGlmdCgpLHI9bmV3IEVycm9yKHQudnNwcmludGYobixlKSk7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihyLHQuU3RhdGVFcnJvci5wcm90b3R5cGUpLHJ9LE9iamVjdC5zZXRQcm90b3R5cGVPZih0LlN0YXRlRXJyb3IucHJvdG90eXBlLEVycm9yLnByb3RvdHlwZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKHQuU3RhdGVFcnJvcixFcnJvciksdC5TdGF0ZUVycm9yLnByb3RvdHlwZS5uYW1lPSJTdGF0ZUVycm9yIix0LlZvaWNlSWRFcnJvcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9e307cmV0dXJuIHIudHlwZT1lLHIubWVzc2FnZT10LHIuc3RhY2s9RXJyb3IodCkuc3RhY2ssci5lcnI9bixyfSx0LmlzQ0NQPWZ1bmN0aW9uKCl7cmV0dXJuISF0LmNvcmUudXBzdHJlYW0mJiJDb25uZWN0U2hhcmVkV29ya2VyQ29uZHVpdCI9PT10LmNvcmUuZ2V0VXBzdHJlYW0oKS5uYW1lfSx0LmlzU2hhcmVkV29ya2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHQud29ya2VyJiYhIXQud29ya2VyLmNsaWVudEVuZ2luZX0sdC5pc0NSTT1mdW5jdGlvbigpe3JldHVybiEhdC5jb3JlLnVwc3RyZWFtJiZ0LmNvcmUuZ2V0VXBzdHJlYW0oKWluc3RhbmNlb2YgdC5JRnJhbWVDb25kdWl0fX0oKX0sNzM2OigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQsdC53b3JrZXI9e307dmFyIG49IkxBRFMuR2V0QWdlbnRGYWlsb3ZlckNvbmZpZ3VyYXRpb24iO2NvbnN0IHI9e2NyZWF0ZVRhc2tDb250YWN0OiJjcmVhdGVUYXNrQ29udGFjdCIsY3JlYXRlT3V0Ym91bmRDb250YWN0OiJjcmVhdGVPdXRib3VuZENvbnRhY3QiLGNyZWF0ZVRlbXBsYXRlZFRhc2s6ImNyZWF0ZVRlbXBsYXRlZFRhc2sifTt2YXIgbz1mdW5jdGlvbigpe3RoaXMudG9waWNNYXN0ZXJNYXA9e319O28ucHJvdG90eXBlLmdldE1hc3Rlcj1mdW5jdGlvbihlKXtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKGUsInRvcGljIiksdGhpcy50b3BpY01hc3Rlck1hcFtlXXx8bnVsbH0sby5wcm90b3R5cGUuc2V0TWFzdGVyPWZ1bmN0aW9uKGUsbil7dC5hc3NlcnROb3ROdWxsKGUsInRvcGljIiksdC5hc3NlcnROb3ROdWxsKG4sImlkIiksdGhpcy50b3BpY01hc3Rlck1hcFtlXT1ufSxvLnByb3RvdHlwZS5yZW1vdmVNYXN0ZXI9ZnVuY3Rpb24oZSl7dC5hc3NlcnROb3ROdWxsKGUsImlkIik7dmFyIG49dGhpczt0LmVudHJpZXModGhpcy50b3BpY01hc3Rlck1hcCkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC52YWx1ZT09PWV9KSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZGVsZXRlIG4udG9waWNNYXN0ZXJNYXBbZS5rZXldfSkpfTt2YXIgaT1mdW5jdGlvbihlKXt0LkNsaWVudEJhc2UuY2FsbCh0aGlzKSx0aGlzLmNvbmR1aXQ9ZX07KGkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5DbGllbnRCYXNlLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWksaS5wcm90b3R5cGUuX2NhbGxJbXBsPWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10aGlzLGk9KG5ldyBEYXRlKS5nZXRUaW1lKCk7dC5jb250YWluc1ZhbHVlKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLGUpP3QuY29yZS5nZXRBZ2VudEFwcENsaWVudCgpLl9jYWxsSW1wbChlLG4se3N1Y2Nlc3M6ZnVuY3Rpb24odCl7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGksbiksci5zdWNjZXNzKHQpfSxmYWlsdXJlOmZ1bmN0aW9uKHQpe28uX3JlY29yZEFQSUxhdGVuY3koZSxpLG4sdCksci5mYWlsdXJlKHQpfX0pOnQuY29udGFpbnNWYWx1ZSh0LlRhc2tUZW1wbGF0ZXNDbGllbnRNZXRob2RzLGUpP3QuY29yZS5nZXRUYXNrVGVtcGxhdGVzQ2xpZW50KCkuX2NhbGxJbXBsKGUsbix7c3VjY2VzczpmdW5jdGlvbih0KXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSxuKSxyLnN1Y2Nlc3ModCl9LGZhaWx1cmU6ZnVuY3Rpb24odCl7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGksbix0KSxyLmZhaWx1cmUodCl9fSk6dC5jb3JlLmdldENsaWVudCgpLl9jYWxsSW1wbChlLG4se3N1Y2Nlc3M6ZnVuY3Rpb24odCxzKXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSxuKSxyLnN1Y2Nlc3ModCxzKX0sZmFpbHVyZTpmdW5jdGlvbih0LHMpe28uX3JlY29yZEFQSUxhdGVuY3koZSxpLG4sdCksci5mYWlsdXJlKHQscyl9LGF1dGhGYWlsdXJlOmZ1bmN0aW9uKHQscyl7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGksbix0KSxyLmF1dGhGYWlsdXJlKCl9LGFjY2Vzc0RlbmllZDpmdW5jdGlvbih0LHMpe28uX3JlY29yZEFQSUxhdGVuY3koZSxpLG4sdCksci5hY2Nlc3NEZW5pZWQmJnIuYWNjZXNzRGVuaWVkKCl9fSl9LGkucHJvdG90eXBlLl9yZWNvcmRBUElMYXRlbmN5PWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPShuZXcgRGF0ZSkuZ2V0VGltZSgpLXQ7dGhpcy5fc2VuZEFQSU1ldHJpY3MoZSxvLG4scil9LGkucHJvdG90eXBlLl9zZW5kQVBJTWV0cmljcz1mdW5jdGlvbihlLG4sbyxpKXtsZXQgcz17bmFtZTplLHRpbWU6bixlcnJvcjppLGVycm9yNXh4OjB9O2NvbnN0IGE9W3tuYW1lOiJDYXRlZ29yeSIsdmFsdWU6IkFQSSJ9XSxjPWkmJmkuc3RhdHVzQ29kZXx8MjAwLHU9aSYmaS5yZXRyeVN0YXR1c3x8dC5SZXRyeVN0YXR1cy5OT05FLGw9W3tuYW1lOiJIdHRwU3RhdHVzQ29kZSIsdmFsdWU6Y30se25hbWU6Ikh0dHBHZW5lcmljU3RhdHVzQ29kZSIsdmFsdWU6YCR7Yy50b1N0cmluZygpLmNoYXJBdCgwKX1YWGB9LHtuYW1lOiJSZXRyeVN0YXR1cyIsdmFsdWU6dX1dO2lmKCI1Ij09PWMudG9TdHJpbmcoKS5jaGFyQXQoMCkmJihzLmVycm9yNXh4PTEpLCI1Ij09PWMudG9TdHJpbmcoKS5jaGFyQXQoMCk/cy5mYXVsdD0xOiIyIj09PWMudG9TdHJpbmcoKS5jaGFyQXQoMCkmJihzLmZhdWx0PTApLHJbZV0mJm8mJm8ucmVsYXRlZENvbnRhY3RJZCl7bGV0IG49e25hbWU6YCR7ZX1XaXRoUmVsYXRlZENvbnRhY3RJZGAsdGltZTpzLnRpbWUsZXJyb3I6cy5lcnJvcixlcnJvcjV4eDpzLmVycm9yNXh4fTt0aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuQVBJX01FVFJJQyx7Li4ubixkaW1lbnNpb25zOmEsb3B0aW9uYWxEaW1lbnNpb25zOmx9KX10aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuQVBJX01FVFJJQyx7Li4ucyxkaW1lbnNpb25zOmEsb3B0aW9uYWxEaW1lbnNpb25zOmx9KX07dmFyIHM9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3RoaXMubXVsdGlwbGV4ZXI9bmV3IHQuU3RyZWFtTXVsdGlwbGV4ZXIsdGhpcy5jb25kdWl0PW5ldyB0LkNvbmR1aXQoIkFtYXpvbkNvbm5lY3RTaGFyZWRXb3JrZXIiLG51bGwsdGhpcy5tdWx0aXBsZXhlciksdGhpcy5jbGllbnQ9bmV3IGkodGhpcy5jb25kdWl0KSx0aGlzLnRpbWVvdXQ9bnVsbCx0aGlzLmFnZW50PW51bGwsdGhpcy5uZXh0VG9rZW49bnVsbCx0aGlzLmluaXREYXRhPXt9LHRoaXMucG9ydENvbmR1aXRNYXA9e30sdGhpcy5zdHJlYW1NYXBCeVRhYklkPXt9LHRoaXMubWFzdGVyQ29vcmQ9bmV3IG8sdGhpcy5sb2dzQnVmZmVyPVtdLHRoaXMuc3VwcHJlc3M9ITEsdGhpcy5mb3JjZU9mZmxpbmU9ITEsdGhpcy5sb25nUG9sbGluZ09wdGlvbnM9e2FsbG93TG9uZ1BvbGxpbmdTaGFkb3dNb2RlOiExLGFsbG93TG9uZ1BvbGxpbmdXZWJzb2NrZXRPbmx5TW9kZTohMX0sdGhpcy5kclBvbGxpbmdVcmw9bnVsbCx0aGlzLnRoaXNBcm49bnVsbCx0aGlzLm90aGVyQXJuPW51bGwsdGhpcy5wZW5kaW5nRmFpbG92ZXI9bnVsbDt2YXIgcj1udWxsO3Qucm9vdExvZ2dlcj1uZXcgdC5Eb3duc3RyZWFtQ29uZHVpdExvZ2dlcih0aGlzLmNvbmR1aXQpLHRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuU0VORF9MT0dTLChmdW5jdGlvbihlKXt0LmdldExvZygpLnB1c2hMb2dzRG93bnN0cmVhbShlKSxuLmxvZ3NCdWZmZXI9bi5sb2dzQnVmZmVyLmNvbmNhdChlKSxuLmxvZ3NCdWZmZXIubGVuZ3RoPjQwMCYmbi5oYW5kbGVTZW5kTG9nc1JlcXVlc3Qobi5sb2dzQnVmZmVyKX0pKSx0aGlzLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5TVVBQUkVTUywoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5kZWJ1ZygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBTZXR0aW5nIFN1cHByZXNzIHRvICVzIixlLnN1cHByZXNzKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uc3VwcHJlc3M9ZS5zdXBwcmVzc3x8ITEsbi5zdXBwcmVzc3x8KG4uZm9yY2VPZmZsaW5lPSExKSwodm9pZCAwPT09ZS5zaG91bGRTZW5kRmFpbG92ZXJEb3duc3RyZWFtfHxlLnNob3VsZFNlbmRGYWlsb3ZlckRvd25zdHJlYW0pJiZuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZBSUxPVkVSLHtpc1ByaW1hcnk6IW4uc3VwcHJlc3N9KX0pKSx0aGlzLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5GT1JDRV9PRkZMSU5FLChmdW5jdGlvbihlKXt0LmdldExvZygpLmRlYnVnKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIFNldHRpbmcgRk9SQ0VfT0ZGTElORSB0byAlcyIsZS5vZmZsaW5lKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uZm9yY2VPZmZsaW5lfHwobi5wZW5kaW5nRmFpbG92ZXI9ITEsbi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5GQUlMT1ZFUix7aXNQcmltYXJ5OiExLG5leHRBY3RpdmVBcm46ZS5uZXh0QWN0aXZlQXJufSkpLG4uZm9yY2VPZmZsaW5lPWUub2ZmbGluZXx8ITF9KSksdC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLklOSVRfRFJfUE9MTElORyYmdGhpcy5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuSU5JVF9EUl9QT0xMSU5HLChmdW5jdGlvbihlKXt2YXIgcj10LmdldExvZygpO24uZHJQb2xsaW5nVXJsPyhyLmRlYnVnKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEFkZGluZyBuZXcgQ0NQIHRvIGFjdGl2ZSByZWdpb24gcG9sbGluZyBmb3IgaW5zdGFuY2UgJHtlLmluc3RhbmNlQXJufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5wb2xsRm9yQWN0aXZlUmVnaW9uKCEwLCExKSk6KHIuaW5mbyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBJbml0aWFsaXppbmcgYWN0aXZlIHJlZ2lvbiBwb2xsaW5nIGZvciBpbnN0YW5jZSAke2UuaW5zdGFuY2VBcm59YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLnRoaXNBcm49ZS5pbnN0YW5jZUFybixuLm90aGVyQXJuPWUub3RoZXJBcm4sbi5nZXRQcmVzaWduZWREaXNjb3ZlcnlVcmwoKS50aGVuKChlPT57bi5kclBvbGxpbmdVcmw9ZSxuLnBvbGxGb3JBY3RpdmVSZWdpb24oITAsITApfSksKHQ9PntyLmVycm9yKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEZhaWxlZCB0byBnZXQgcHJlc2lnbmVkIFVSTCBmb3IgaW5zdGFuY2UgJHtlLmluc3RhbmNlQXJufTsgc3VwcHJlc3NpbmcgY29udGFjdHNgKS53aXRoRXhjZXB0aW9uKHQpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5zdXBwcmVzcz0hMH0pKSl9KSksdGhpcy5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5DT05GSUdVUkUsKGZ1bmN0aW9uKG8pe2NvbnNvbGUubG9nKCJAQEAgY29uZmlndXJlIGV2ZW50IGhhbmRsZXIiLG8pO3RyeXtvLmF1dGhUb2tlbiYmby5hdXRoVG9rZW4hPT1uLmluaXREYXRhLmF1dGhUb2tlbiYmKG4uaW5pdERhdGE9byx0LmNvcmUuaW5pdChvKSxvLmxvbmdQb2xsaW5nT3B0aW9ucyYmKCJib29sZWFuIj09dHlwZW9mIG8ubG9uZ1BvbGxpbmdPcHRpb25zLmFsbG93TG9uZ1BvbGxpbmdTaGFkb3dNb2RlJiYobi5sb25nUG9sbGluZ09wdGlvbnMuYWxsb3dMb25nUG9sbGluZ1NoYWRvd01vZGU9by5sb25nUG9sbGluZ09wdGlvbnMuYWxsb3dMb25nUG9sbGluZ1NoYWRvd01vZGUpLCJib29sZWFuIj09dHlwZW9mIG8ubG9uZ1BvbGxpbmdPcHRpb25zLmFsbG93TG9uZ1BvbGxpbmdXZWJzb2NrZXRPbmx5TW9kZSYmKG4ubG9uZ1BvbGxpbmdPcHRpb25zLmFsbG93TG9uZ1BvbGxpbmdXZWJzb2NrZXRPbmx5TW9kZT1vLmxvbmdQb2xsaW5nT3B0aW9ucy5hbGxvd0xvbmdQb2xsaW5nV2Vic29ja2V0T25seU1vZGUpKSxyP3QuZ2V0TG9nKCkuaW5mbygiTm90IEluaXRpYWxpemluZyBhIG5ldyBXZWJzb2NrZXRNYW5hZ2VyIGluc3RhbmNlLCBzaW5jZSBvbmUgYWxyZWFkeSBleGlzdHMiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpOih0LmdldExvZygpLmluZm8oIkNyZWF0aW5nIGEgbmV3IFdlYnNvY2tldCBjb25uZWN0aW9uIGZvciBDQ1AiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuV2ViU29ja2V0TWFuYWdlci5zZXRHbG9iYWxDb25maWcoe2xvZ2dlckNvbmZpZzp7bG9nZ2VyOnQuZ2V0TG9nKCksYWR2YW5jZWRMb2dXcml0ZXI6ImluZm8iLGxldmVsOjEwfX0pLChyPXQuV2ViU29ja2V0TWFuYWdlci5jcmVhdGUoKSkub25Jbml0RmFpbHVyZSgoZnVuY3Rpb24oKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuSU5JVF9GQUlMVVJFKX0pKSxyLm9uQ29ubmVjdGlvbk9wZW4oKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5DT05ORUNUSU9OX09QRU4sZSl9KSksci5vbkNvbm5lY3Rpb25DbG9zZSgoZnVuY3Rpb24oZSl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkNPTk5FQ1RJT05fQ0xPU0UsZSl9KSksci5vbkNvbm5lY3Rpb25HYWluKChmdW5jdGlvbigpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkFnZW50RXZlbnRzLldFQlNPQ0tFVF9DT05ORUNUSU9OX0dBSU5FRCksbi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkNPTk5FQ1RJT05fR0FJTil9KSksci5vbkNvbm5lY3Rpb25Mb3N0KChmdW5jdGlvbihlKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5BZ2VudEV2ZW50cy5XRUJTT0NLRVRfQ09OTkVDVElPTl9MT1NULGUpLG4uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5DT05ORUNUSU9OX0xPU1QsZSl9KSksci5vblN1YnNjcmlwdGlvblVwZGF0ZSgoZnVuY3Rpb24oZSl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLlNVQlNDUklQVElPTl9VUERBVEUsZSl9KSksci5vblN1YnNjcmlwdGlvbkZhaWx1cmUoKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5TVUJTQ1JJUFRJT05fRkFJTFVSRSxlKX0pKSxyLm9uQWxsTWVzc2FnZSgoZnVuY3Rpb24oZSl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkFMTF9NRVNTQUdFLGUpfSkpLG4uY29uZHVpdC5vbkRvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuU0VORCwoZnVuY3Rpb24oZSl7ci5zZW5kTWVzc2FnZShlKX0pKSxuLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLlNVQlNDUklCRSwoZnVuY3Rpb24oZSl7ci5zdWJzY3JpYmVUb3BpY3MoZSl9KSksci5pbml0KHQuaGl0Y2gobixuLmdldFdlYlNvY2tldFVybCkpLnRoZW4oKGZ1bmN0aW9uKHIpe3RyeXtpZihyJiYhci53ZWJTb2NrZXRDb25uZWN0aW9uRmFpbGVkKXQuZ2V0TG9nKCkuaW5mbygiS2lja2luZyBvZmYgYWdlbnQgcG9sbGluZyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5wb2xsRm9yQWdlbnQoKSx0LmdldExvZygpLmluZm8oIktpY2tpbmcgb2ZmIGNvbmZpZyBwb2xsaW5nIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLnBvbGxGb3JBZ2VudENvbmZpZ3VyYXRpb24oe3JlcGVhdEZvcmV2ZXI6ITB9KSx0LmdldExvZygpLmluZm8oIktpY2tpbmcgb2ZmIGF1dGggdG9rZW4gcG9sbGluZyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksZS5zZXRJbnRlcnZhbCh0LmhpdGNoKG4sbi5jaGVja0F1dGhUb2tlbiksM2U1KTtlbHNlIGlmKCF0LndlYlNvY2tldEluaXRGYWlsZWQpe2NvbnN0IGU9dC5XZWJTb2NrZXRFdmVudHMuSU5JVF9GQUlMVVJFO3Rocm93IG4uY29uZHVpdC5zZW5kRG93bnN0cmVhbShlKSx0LndlYlNvY2tldEluaXRGYWlsZWQ9ITAsbmV3IEVycm9yKGUpfX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJXZWJTb2NrZXQgZmFpbGVkIHRvIGluaXRpYWxpemUiKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSkpKSl9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcigiQEBAIGVycm9yIixlKX19KSksdGhpcy5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5URVJNSU5BVEUsKGZ1bmN0aW9uKCl7bi5oYW5kbGVTZW5kTG9nc1JlcXVlc3Qobi5sb2dzQnVmZmVyKSx0LmNvcmUudGVybWluYXRlKCksbi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLlRFUk1JTkFURUQpfSkpLHRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuU1lOQ0hST05JWkUsKGZ1bmN0aW9uKCl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFDS05PV0xFREdFKX0pKSx0aGlzLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCwoZnVuY3Rpb24oZSl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKGUuZXZlbnQsZS5kYXRhKX0pKSxlLm9uY29ubmVjdD1mdW5jdGlvbihlKXt2YXIgcj1lLnBvcnRzWzBdLG89bmV3IHQuUG9ydFN0cmVhbShyKTtuLm11bHRpcGxleGVyLmFkZFN0cmVhbShvKSxyLnN0YXJ0KCk7dmFyIGk9bmV3IHQuQ29uZHVpdChvLmdldElkKCksbnVsbCxvKTtpLnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFDS05PV0xFREdFLHtpZDpvLmdldElkKCl9KSxuLnBvcnRDb25kdWl0TWFwW28uZ2V0SWQoKV09aSxuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuVVBEQVRFX0NPTk5FQ1RFRF9DQ1BTLHtsZW5ndGg6T2JqZWN0LmtleXMobi5wb3J0Q29uZHVpdE1hcCkubGVuZ3RofSksbnVsbCE9PW4uYWdlbnQmJm4udXBkYXRlQWdlbnQoKSxpLm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BUElfUkVRVUVTVCx0LmhpdGNoKG4sbi5oYW5kbGVBUElSZXF1ZXN0LGkpKSxpLm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5NQVNURVJfUkVRVUVTVCx0LmhpdGNoKG4sbi5oYW5kbGVNYXN0ZXJSZXF1ZXN0LGksby5nZXRJZCgpKSksaS5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuUkVMT0FEX0FHRU5UX0NPTkZJR1VSQVRJT04sdC5oaXRjaChuLG4ucG9sbEZvckFnZW50Q29uZmlndXJhdGlvbikpLGkub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLlRBQl9JRCx0LmhpdGNoKG4sbi5oYW5kbGVUYWJJZEV2ZW50LG8pKSxpLm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5DTE9TRSx0LmhpdGNoKG4sbi5oYW5kbGVDbG9zZUV2ZW50LG8pKX19O3MucHJvdG90eXBlLnBvbGxGb3JBY3RpdmVSZWdpb249ZnVuY3Rpb24ocixvKXt2YXIgaT10aGlzLHM9dC5nZXRMb2coKTtpZighaS5kclBvbGxpbmdVcmwpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiW0Rpc2FzdGVyIFJlY292ZXJ5XSBUcmllZCB0byBwb2xsIGZvciBhY3RpdmUgcmVnaW9uIHdpdGhvdXQgZmlyc3QgaW5pdGlhbGl6aW5nIERSIHBvbGxpbmcgaW4gdGhlIHdvcmtlci4iKTtzLmRlYnVnKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIFBvbGxpbmcgZm9yIGZhaWxvdmVyIHdpdGggcHJlc2lnbmVkIFVSTCBmb3IgaW5zdGFuY2UgJHtpLnRoaXNBcm59YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTtyZXR1cm4gdC5mZXRjaFdpdGhUaW1lb3V0KGkuZHJQb2xsaW5nVXJsLDFlNCkuY2F0Y2goKGU9PntpZihlLnN0YXR1cyl7aWYoaS5jbGllbnQuX3JlY29yZEFQSUxhdGVuY3kobixhLHtzdGF0dXNDb2RlOmUuc3RhdHVzfSksW3QuSFRUUF9TVEFUVVNfQ09ERVMuQUNDRVNTX0RFTklFRCx0LkhUVFBfU1RBVFVTX0NPREVTLlVOQVVUSE9SSVpFRF0uaW5jbHVkZXMoZS5zdGF0dXMpKXJldHVybiBzLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gQWN0aXZlIHJlZ2lvbiBwb2xsaW5nIGZhaWxlZDsgdHJ5aW5nIHRvIGdldCBhIG5ldyBVUkwgZm9yIHBvbGxpbmcuIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkuZ2V0UHJlc2lnbmVkRGlzY292ZXJ5VXJsKCkudGhlbigoZT0+e2kuZHJQb2xsaW5nVXJsPWV9KSkudGhlbigoKCk9PihhPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHQuZmV0Y2hXaXRoVGltZW91dChpLmRyUG9sbGluZ1VybCwxZTQpKSkpO3ZhciByPWBbRGlzYXN0ZXIgUmVjb3ZlcnldIEZhaWxlZCB0byBwb2xsIGZvciBmYWlsb3ZlciBmb3IgaW5zdGFuY2UgJHtpLnRoaXNBcm59LCByZWNlaXZlZCB1bmV4cGVjdGVkIHJlc3BvbnNlIGNvZGUgJHtlLnN0YXR1c31gO3Rocm93IHMuZXJyb3Iocikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG5ldyBFcnJvcihyKX10aHJvdyByPWBbRGlzYXN0ZXIgUmVjb3ZlcnldIEZhaWxlZCB0byBwb2xsIGZvciBmYWlsb3ZlciBmb3IgaW5zdGFuY2UgJHtpLnRoaXNBcm59LCByZXF1ZXN0IHRpbWVkIG91dCBvciBhYm9ydGVkYCxpLmNsaWVudC5fcmVjb3JkQVBJTGF0ZW5jeShuLGEse3N0YXR1c0NvZGU6LTF9KSxzLmVycm9yKHIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuZXcgRXJyb3Iocil9KSkudGhlbigoZT0+e2lmKGkuY2xpZW50Ll9yZWNvcmRBUElMYXRlbmN5KG4sYSksImJvb2xlYW4iPT10eXBlb2YgZS5UZXJtaW5hdGVBY3RpdmVDb250YWN0cyl7dmFyIGM9IWUuVGVybWluYXRlQWN0aXZlQ29udGFjdHM7aWYoZS5JbnN0YW5jZUFybilpZihzLmRlYnVnKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIFN1Y2Nlc3NmdWxseSBwb2xsZWQgZm9yIGFjdGl2ZSByZWdpb24uIFByaW1hcnkgaW5zdGFuY2UgQVJOIGlzICR7ZS5JbnN0YW5jZUFybn0gYW5kIHNvZnQgZmFpbG92ZXIgaXMgYCsoYz8iZW5hYmxlZCI6ImRpc2FibGVkIikpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaS50aGlzQXJuPT09ZS5JbnN0YW5jZUFybiYmIWkuc3VwcHJlc3MmJnIpcy5kZWJ1ZyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBJbnN0YW5jZSAke2kudGhpc0Fybn0gaXMgYmVpbmcgc2V0IHRvIHByaW1hcnlgKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRkFJTE9WRVIse25leHRBY3RpdmVBcm46ZS5JbnN0YW5jZUFybn0pO2Vsc2UgaWYoaS5vdGhlckFybj09PWUuSW5zdGFuY2VBcm4pe2lmKCFjfHxvfHwhcnx8aS5zdXBwcmVzcyYmIWkucGVuZGluZ0ZhaWxvdmVyfHxpLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZBSUxPVkVSLHtuZXh0QWN0aXZlQXJuOmkudGhpc0Fybn0pLCFpLnN1cHByZXNzKXtpLnN1cHByZXNzPSEwO2NvbnN0IG49YyYmIW87bj8oaS5wZW5kaW5nRmFpbG92ZXI9ITAscy5kZWJ1ZyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBJbnN0YW5jZSAke2kudGhpc0Fybn0gd2lsbCBiZSBzZXQgdG8gc3RhbmQtYnkgdXNpbmcgc29mdCBmYWlsb3ZlcmApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpOnMuZGVidWcoYFtEaXNhc3RlciBSZWNvdmVyeV0gSW5zdGFuY2UgJHtpLnRoaXNBcm59IGlzIGJlaW5nIHNldCB0byBzdGFuZC1ieSBpbW1lZGlhdGVseWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaS5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5GT1JDRV9PRkZMSU5FLHtzb2Z0RmFpbG92ZXI6bixuZXh0QWN0aXZlQXJuOmUuSW5zdGFuY2VBcm59KX19ZWxzZVtpLnRoaXNBcm4saS5vdGhlckFybl0uaW5jbHVkZXMoZS5JbnN0YW5jZUFybil8fHMuZXJyb3IoYFtEaXNhc3RlciBSZWNvdmVyeV0gVGhlIGN1cnJlbnQgcHJpbWFyeSBpbnN0YW5jZSBpbiB0aGlzIGFnZW50J3MgZmFpbG92ZXIgZ3JvdXAgJHtlLkluc3RhbmNlQXJufSBkb2Vzbid0IG1hdGNoIHRoaXMgaW5zdGFuY2UgJHtpLnRoaXNBcm59IG9yIHRoZSBvdGhlciBpbnN0YW5jZSAke2kub3RoZXJBcm59YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTtlbHNlIHMuZXJyb3IoIltEaXNhc3RlciBSZWNvdmVyeV0gRFIgcG9sbGluZyByZXNwb25zZSBkaWQgbm90IGNvbnRhaW4gYSB0cnV0aHkgYWN0aXZlIGluc3RhbmNlIEFSTi4iKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9ZWxzZSBzLmVycm9yKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIERSIHBvbGxpbmcgcmVzcG9uc2UgZGlkIG5vdCBjb250YWluIGEgdmFsaWQgdmFsdWUgZm9yIFRlcm1pbmF0ZUFjdGl2ZUNvbnRhY3RzLiIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKS5jYXRjaCgoZT0+e2Uuc3RhdHVzJiZpLmNsaWVudC5fcmVjb3JkQVBJTGF0ZW5jeShuLGEsey4uLmUsc3RhdHVzQ29kZTplLnN0YXR1c30pLHMuZXJyb3IoYFtEaXNhc3RlciBSZWNvdmVyeV0gQWN0aXZlIHJlZ2lvbiBwb2xsaW5nIGZhaWxlZCBmb3IgaW5zdGFuY2UgJHtpLnRoaXNBcm59LmApLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKS5maW5hbGx5KCgoKT0+eyFvJiZyfHxlLnNldFRpbWVvdXQodC5oaXRjaChpLGkucG9sbEZvckFjdGl2ZVJlZ2lvbiksNmU0KX0pKX0scy5wcm90b3R5cGUuZ2V0UHJlc2lnbmVkRGlzY292ZXJ5VXJsPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gbmV3IFByb21pc2UoKChuLHIpPT57dC5nZXRMb2coKS5pbmZvKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEdldHRpbmcgcHJlc2lnbmVkIFVSTCBmb3IgaW5zdGFuY2UgJHtlLnRoaXNBcm59YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DUkVBVEVfVFJBTlNQT1JULHt0cmFuc3BvcnRUeXBlOnQuVFJBTlNQT1JUX1RZUEVTLkFHRU5UX0RJU0NPVkVSWX0se3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7ZSYmZS5hZ2VudERpc2NvdmVyeVRyYW5zcG9ydCYmZS5hZ2VudERpc2NvdmVyeVRyYW5zcG9ydC5wcmVzaWduZWRVcmw/KHQuZ2V0TG9nKCkuaW5mbygiZ2V0UHJlc2lnbmVkRGlzY292ZXJ5VXJsIHN1Y2NlZWRlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbihlLmFnZW50RGlzY292ZXJ5VHJhbnNwb3J0LnByZXNpZ25lZFVybCkpOih0LmdldExvZygpLmluZm8oImdldFByZXNpZ25lZERpc2NvdmVyeVVybCByZWNlaXZlZCBlbXB0eS9pbnZhbGlkIGRhdGEiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihFcnJvcigiZ2V0UHJlc2lnbmVkRGlzY292ZXJ5VXJsIHJlY2VpdmVkIGVtcHR5L2ludmFsaWQgZGF0YSIpKSl9LGZhaWx1cmU6ZnVuY3Rpb24obixvKXt0LmdldExvZygpLmVycm9yKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEZhaWxlZCB0byBnZXQgcHJlc2lnbmVkIFVSTCBmb3IgaW5zdGFuY2UgJHtlLnRoaXNBcm59YCkud2l0aEV4Y2VwdGlvbihuKS53aXRoT2JqZWN0KG8pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihuZXcgRXJyb3IoIkZhaWxlZCB0byBnZXQgcHJlc2lnbmVkIFVSTCIpKX0sYXV0aEZhaWx1cmU6ZnVuY3Rpb24oKXt0LmhpdGNoKGUsZS5oYW5kbGVBdXRoRmFpbCkoKSxyKG5ldyBFcnJvcigiRW5jb3VudGVyZWQgYXV0aCBmYWlsdXJlIHdoZW4gZ2V0dGluZyBwcmVzaWduZWQgVVJMIikpfSxhY2Nlc3NEZW5pZWQ6ZnVuY3Rpb24oKXt0LmhpdGNoKGUsZS5oYW5kbGVBY2Nlc3NEZW5pZWQpKCkscihuZXcgRXJyb3IoIkVuY291bnRlcmVkIGFjY2VzcyBkZW5pZWQgd2hlbiBnZXR0aW5nIHByZXNpZ25lZCBVUkwiKSl9fSl9KSl9LHMucHJvdG90eXBlLnBvbGxGb3JBZ2VudD1mdW5jdGlvbigpe3ZhciBuPXRoaXMscj10LmhpdGNoKG4sbi5oYW5kbGVQb2xsaW5nQXV0aEZhaWwpO3RoaXMuY2xpZW50LmNhbGwodC5DbGllbnRNZXRob2RzLkdFVF9BR0VOVF9TTkFQU0hPVCx7bmV4dFRva2VuOm4ubmV4dFRva2VuLHRpbWVvdXQ6M2U0fSx7c3VjY2VzczpmdW5jdGlvbihyLG8pe3RyeXtuLmFnZW50PW4uYWdlbnR8fHt9LG4uYWdlbnQuc25hcHNob3Q9ci5zbmFwc2hvdCxuLmFnZW50LnNuYXBzaG90LmxvY2FsVGltZXN0YW1wPXQubm93KCksbi5hZ2VudC5zbmFwc2hvdC5za2V3PW4uYWdlbnQuc25hcHNob3Quc25hcHNob3RUaW1lc3RhbXAtbi5hZ2VudC5zbmFwc2hvdC5sb2NhbFRpbWVzdGFtcCxuLm5leHRUb2tlbj1yLm5leHRUb2tlbixvJiZvLmhhc093blByb3BlcnR5KCJjb250ZW50TGVuZ3RoIikmJihuLmFnZW50LnNuYXBzaG90LmNvbnRlbnRMZW5ndGg9by5jb250ZW50TGVuZ3RoKSx0LmdldExvZygpLnRyYWNlKCJHRVRfQUdFTlRfU05BUFNIT1Qgc3VjY2VlZGVkLiIpLndpdGhPYmplY3Qocikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLnVwZGF0ZUFnZW50KCl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiTG9uZyBwb2xsIGZhaWxlZCB0byB1cGRhdGUgYWdlbnQuIikud2l0aE9iamVjdChyKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9ZmluYWxseXtlLnNldFRpbWVvdXQodC5oaXRjaChuLG4ucG9sbEZvckFnZW50KSwxMDApfX0sZmFpbHVyZTpmdW5jdGlvbihyLG8pe3RyeXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gZ2V0IGFnZW50IGRhdGEuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoT2JqZWN0KHtlcnI6cixkYXRhOm99KX1maW5hbGx5e2Uuc2V0VGltZW91dCh0LmhpdGNoKG4sbi5wb2xsRm9yQWdlbnQpLDVlMyl9fSxhdXRoRmFpbHVyZTpmdW5jdGlvbigpe3IoKX0sYWNjZXNzRGVuaWVkOnQuaGl0Y2gobixuLmhhbmRsZUFjY2Vzc0RlbmllZCl9KX0scy5wcm90b3R5cGUucG9sbEZvckFnZW50Q29uZmlndXJhdGlvbj1mdW5jdGlvbihuKXt2YXIgcj10aGlzLG89bnx8e30saT10LmhpdGNoKHIsci5oYW5kbGVQb2xsaW5nQXV0aEZhaWwpO3RoaXMuY2xpZW50LmNhbGwodC5DbGllbnRNZXRob2RzLkdFVF9BR0VOVF9DT05GSUdVUkFUSU9OLHt9LHtzdWNjZXNzOmZ1bmN0aW9uKG4pe3ZhciBpPW4uY29uZmlndXJhdGlvbjtyLnBvbGxGb3JBZ2VudFBlcm1pc3Npb25zKGkpLHIucG9sbEZvckFnZW50U3RhdGVzKGkpLHIucG9sbEZvckRpYWxhYmxlQ291bnRyeUNvZGVzKGkpLHIucG9sbEZvclJvdXRpbmdQcm9maWxlUXVldWVzKGkpLG8ucmVwZWF0Rm9yZXZlciYmZS5zZXRUaW1lb3V0KHQuaGl0Y2gocixyLnBvbGxGb3JBZ2VudENvbmZpZ3VyYXRpb24sbyksM2U0KX0sZmFpbHVyZTpmdW5jdGlvbihuLGkpe3RyeXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggYWdlbnQgY29uZmlndXJhdGlvbiBkYXRhLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOm4sZGF0YTppfSl9ZmluYWxseXtvLnJlcGVhdEZvcmV2ZXImJmUuc2V0VGltZW91dCh0LmhpdGNoKHIsci5wb2xsRm9yQWdlbnRDb25maWd1cmF0aW9uKSwzZTQsbyl9fSxhdXRoRmFpbHVyZTpmdW5jdGlvbigpe2koKX0sYWNjZXNzRGVuaWVkOnQuaGl0Y2gocixyLmhhbmRsZUFjY2Vzc0RlbmllZCl9KX0scy5wcm90b3R5cGUucG9sbEZvckFnZW50U3RhdGVzPWZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpcyxvPW58fHt9O28ubWF4UmVzdWx0cz1vLm1heFJlc3VsdHN8fHQuREVGQVVMVF9CQVRDSF9TSVpFLHRoaXMuY2xpZW50LmNhbGwodC5DbGllbnRNZXRob2RzLkdFVF9BR0VOVF9TVEFURVMse25leHRUb2tlbjpvLm5leHRUb2tlbnx8bnVsbCxtYXhSZXN1bHRzOm8ubWF4UmVzdWx0c30se3N1Y2Nlc3M6ZnVuY3Rpb24odCl7dC5uZXh0VG9rZW4/ci5wb2xsRm9yQWdlbnRTdGF0ZXMoZSx7c3RhdGVzOihvLnN0YXRlc3x8W10pLmNvbmNhdCh0LnN0YXRlcyksbmV4dFRva2VuOnQubmV4dFRva2VuLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSk6KGUuYWdlbnRTdGF0ZXM9KG8uc3RhdGVzfHxbXSkuY29uY2F0KHQuc3RhdGVzKSxyLnVwZGF0ZUFnZW50Q29uZmlndXJhdGlvbihlKSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggYWdlbnQgc3RhdGVzIGxpc3QuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoT2JqZWN0KHtlcnI6ZSxkYXRhOm59KX0sYXV0aEZhaWx1cmU6dC5oaXRjaChyLHIuaGFuZGxlUG9sbGluZ0F1dGhGYWlsKSxhY2Nlc3NEZW5pZWQ6dC5oaXRjaChyLHIuaGFuZGxlQWNjZXNzRGVuaWVkKX0pfSxzLnByb3RvdHlwZS5wb2xsRm9yQWdlbnRQZXJtaXNzaW9ucz1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXMsbz1ufHx7fTtvLm1heFJlc3VsdHM9by5tYXhSZXN1bHRzfHx0LkRFRkFVTFRfQkFUQ0hfU0laRSx0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfUEVSTUlTU0lPTlMse25leHRUb2tlbjpvLm5leHRUb2tlbnx8bnVsbCxtYXhSZXN1bHRzOm8ubWF4UmVzdWx0c30se3N1Y2Nlc3M6ZnVuY3Rpb24odCl7dC5uZXh0VG9rZW4/ci5wb2xsRm9yQWdlbnRQZXJtaXNzaW9ucyhlLHtwZXJtaXNzaW9uczooby5wZXJtaXNzaW9uc3x8W10pLmNvbmNhdCh0LnBlcm1pc3Npb25zKSxuZXh0VG9rZW46dC5uZXh0VG9rZW4sbWF4UmVzdWx0czpvLm1heFJlc3VsdHN9KTooZS5wZXJtaXNzaW9ucz0oby5wZXJtaXNzaW9uc3x8W10pLmNvbmNhdCh0LnBlcm1pc3Npb25zKSxyLnVwZGF0ZUFnZW50Q29uZmlndXJhdGlvbihlKSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggYWdlbnQgcGVybWlzc2lvbnMgbGlzdC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjplLGRhdGE6bn0pfSxhdXRoRmFpbHVyZTp0LmhpdGNoKHIsci5oYW5kbGVQb2xsaW5nQXV0aEZhaWwpLGFjY2Vzc0RlbmllZDp0LmhpdGNoKHIsci5oYW5kbGVBY2Nlc3NEZW5pZWQpfSl9LHMucHJvdG90eXBlLnBvbGxGb3JEaWFsYWJsZUNvdW50cnlDb2Rlcz1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXMsbz1ufHx7fTtvLm1heFJlc3VsdHM9by5tYXhSZXN1bHRzfHx0LkRFRkFVTFRfQkFUQ0hfU0laRSx0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5HRVRfRElBTEFCTEVfQ09VTlRSWV9DT0RFUyx7bmV4dFRva2VuOm8ubmV4dFRva2VufHxudWxsLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSx7c3VjY2VzczpmdW5jdGlvbih0KXt0Lm5leHRUb2tlbj9yLnBvbGxGb3JEaWFsYWJsZUNvdW50cnlDb2RlcyhlLHtjb3VudHJ5Q29kZXM6KG8uY291bnRyeUNvZGVzfHxbXSkuY29uY2F0KHQuY291bnRyeUNvZGVzKSxuZXh0VG9rZW46dC5uZXh0VG9rZW4sbWF4UmVzdWx0czpvLm1heFJlc3VsdHN9KTooZS5kaWFsYWJsZUNvdW50cmllcz0oby5jb3VudHJ5Q29kZXN8fFtdKS5jb25jYXQodC5jb3VudHJ5Q29kZXMpLHIudXBkYXRlQWdlbnRDb25maWd1cmF0aW9uKGUpKX0sZmFpbHVyZTpmdW5jdGlvbihlLG4pe3QuZ2V0TG9nKCkuZXJyb3IoIkZhaWxlZCB0byBmZXRjaCBkaWFsYWJsZSBjb3VudHJ5IGNvZGVzIGxpc3QuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoT2JqZWN0KHtlcnI6ZSxkYXRhOm59KX0sYXV0aEZhaWx1cmU6dC5oaXRjaChyLHIuaGFuZGxlUG9sbGluZ0F1dGhGYWlsKSxhY2Nlc3NEZW5pZWQ6dC5oaXRjaChyLHIuaGFuZGxlQWNjZXNzRGVuaWVkKX0pfSxzLnByb3RvdHlwZS5wb2xsRm9yUm91dGluZ1Byb2ZpbGVRdWV1ZXM9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzLG89bnx8e307by5tYXhSZXN1bHRzPW8ubWF4UmVzdWx0c3x8dC5ERUZBVUxUX0JBVENIX1NJWkUsdGhpcy5jbGllbnQuY2FsbCh0LkNsaWVudE1ldGhvZHMuR0VUX1JPVVRJTkdfUFJPRklMRV9RVUVVRVMse3JvdXRpbmdQcm9maWxlQVJOOmUucm91dGluZ1Byb2ZpbGUucm91dGluZ1Byb2ZpbGVBUk4sbmV4dFRva2VuOm8ubmV4dFRva2VufHxudWxsLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSx7c3VjY2VzczpmdW5jdGlvbih0KXt0Lm5leHRUb2tlbj9yLnBvbGxGb3JSb3V0aW5nUHJvZmlsZVF1ZXVlcyhlLHtjb3VudHJ5Q29kZXM6KG8ucXVldWVzfHxbXSkuY29uY2F0KHQucXVldWVzKSxuZXh0VG9rZW46dC5uZXh0VG9rZW4sbWF4UmVzdWx0czpvLm1heFJlc3VsdHN9KTooZS5yb3V0aW5nUHJvZmlsZS5xdWV1ZXM9KG8ucXVldWVzfHxbXSkuY29uY2F0KHQucXVldWVzKSxyLnVwZGF0ZUFnZW50Q29uZmlndXJhdGlvbihlKSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggcm91dGluZyBwcm9maWxlIHF1ZXVlcyBsaXN0LiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOmUsZGF0YTpufSl9LGF1dGhGYWlsdXJlOnQuaGl0Y2gocixyLmhhbmRsZVBvbGxpbmdBdXRoRmFpbCksYWNjZXNzRGVuaWVkOnQuaGl0Y2gocixyLmhhbmRsZUFjY2Vzc0RlbmllZCl9KX0scy5wcm90b3R5cGUuaGFuZGxlQVBJUmVxdWVzdD1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXM7dGhpcy5jbGllbnQuY2FsbChuLm1ldGhvZCxuLnBhcmFtcyx7c3VjY2VzczpmdW5jdGlvbihyKXt2YXIgbz10LkV2ZW50RmFjdG9yeS5jcmVhdGVSZXNwb25zZSh0LkV2ZW50VHlwZS5BUElfUkVTUE9OU0UsbixyKTtlLnNlbmREb3duc3RyZWFtKG8uZXZlbnQsbyl9LGZhaWx1cmU6ZnVuY3Rpb24obyxpKXt2YXIgcz10LkV2ZW50RmFjdG9yeS5jcmVhdGVSZXNwb25zZSh0LkV2ZW50VHlwZS5BUElfUkVTUE9OU0UsbixpLEpTT04uc3RyaW5naWZ5KG8pKTtlLnNlbmREb3duc3RyZWFtKHMuZXZlbnQscyksdC5nZXRMb2coKS5lcnJvcigiJyVzJyBBUEkgcmVxdWVzdCBmYWlsZWQiLG4ubWV0aG9kKS53aXRoT2JqZWN0KHtyZXF1ZXN0OnIuZmlsdGVyQXV0aFRva2VuKG4pLHJlc3BvbnNlOnN9KS53aXRoRXhjZXB0aW9uKG8pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LGF1dGhGYWlsdXJlOnQuaGl0Y2gocixyLmhhbmRsZUF1dGhGYWlsLHthdXRob3JpemU6ITB9KX0pfSxzLnByb3RvdHlwZS5oYW5kbGVNYXN0ZXJSZXF1ZXN0PWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10aGlzLmNvbmR1aXQsaT1udWxsO3N3aXRjaChyLm1ldGhvZCl7Y2FzZSB0Lk1hc3Rlck1ldGhvZHMuQkVDT01FX01BU1RFUjp2YXIgcz10aGlzLm1hc3RlckNvb3JkLmdldE1hc3RlcihyLnBhcmFtcy50b3BpYyksYT1Cb29sZWFuKHMpJiZzIT09bjt0aGlzLm1hc3RlckNvb3JkLnNldE1hc3RlcihyLnBhcmFtcy50b3BpYyxuKSxpPXQuRXZlbnRGYWN0b3J5LmNyZWF0ZVJlc3BvbnNlKHQuRXZlbnRUeXBlLk1BU1RFUl9SRVNQT05TRSxyLHttYXN0ZXJJZDpuLHRha2VPdmVyOmEsdG9waWM6ci5wYXJhbXMudG9waWN9KSxhJiZvLnNlbmREb3duc3RyZWFtKGkuZXZlbnQsaSk7YnJlYWs7Y2FzZSB0Lk1hc3Rlck1ldGhvZHMuQ0hFQ0tfTUFTVEVSOihzPXRoaXMubWFzdGVyQ29vcmQuZ2V0TWFzdGVyKHIucGFyYW1zLnRvcGljKSl8fHIucGFyYW1zLnNob3VsZE5vdEJlY29tZU1hc3RlcklmTm9uZXx8KHRoaXMubWFzdGVyQ29vcmQuc2V0TWFzdGVyKHIucGFyYW1zLnRvcGljLG4pLHM9biksaT10LkV2ZW50RmFjdG9yeS5jcmVhdGVSZXNwb25zZSh0LkV2ZW50VHlwZS5NQVNURVJfUkVTUE9OU0Uscix7bWFzdGVySWQ6cyxpc01hc3RlcjpuPT09cyx0b3BpYzpyLnBhcmFtcy50b3BpY30pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIG1hc3RlciBtZXRob2Q6ICIrci5tZXRob2QpfWUuc2VuZERvd25zdHJlYW0oaS5ldmVudCxpKX0scy5wcm90b3R5cGUuaGFuZGxlVGFiSWRFdmVudD1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXM7dHJ5e2xldCBvPW4udGFiSWQsaT1yLnN0cmVhbU1hcEJ5VGFiSWRbb10scz1lLmdldElkKCksYT1PYmplY3Qua2V5cyhyLnN0cmVhbU1hcEJ5VGFiSWQpLmZpbHRlcigoZT0+ci5zdHJlYW1NYXBCeVRhYklkW2VdLmxlbmd0aD4wKSkubGVuZ3RoO2lmKGkmJmkubGVuZ3RoPjApe2lmKCFpLmluY2x1ZGVzKHMpKXtyLnN0cmVhbU1hcEJ5VGFiSWRbb10ucHVzaChzKTtsZXQgZT17bGVuZ3RoOk9iamVjdC5rZXlzKHIucG9ydENvbmR1aXRNYXApLmxlbmd0aCx0YWJJZDpvLHN0cmVhbXNUYWJzQWNyb3NzQnJvd3NlcjphfTtlW29dPXtsZW5ndGg6aS5sZW5ndGh9LHIuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5VUERBVEVfQ09OTkVDVEVEX0NDUFMsZSl9fWVsc2V7ci5zdHJlYW1NYXBCeVRhYklkW29dPVtlLmdldElkKCldO2xldCBuPXtsZW5ndGg6T2JqZWN0LmtleXMoci5wb3J0Q29uZHVpdE1hcCkubGVuZ3RoLHRhYklkOm8sc3RyZWFtc1RhYnNBY3Jvc3NCcm93c2VyOmErMX07bltvXT17bGVuZ3RoOnIuc3RyZWFtTWFwQnlUYWJJZFtvXS5sZW5ndGh9LHIuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5VUERBVEVfQ09OTkVDVEVEX0NDUFMsbil9fWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIltUYWIgSWRzXSBJc3N1ZSB1cGRhdGluZyBjb25uZWN0ZWQgQ0NQcyB3aXRoaW4gdGhlIHNhbWUgdGFiIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0scy5wcm90b3R5cGUuaGFuZGxlQ2xvc2VFdmVudD1mdW5jdGlvbihlKXt2YXIgbj10aGlzO24ubXVsdGlwbGV4ZXIucmVtb3ZlU3RyZWFtKGUpLGRlbGV0ZSBuLnBvcnRDb25kdWl0TWFwW2UuZ2V0SWQoKV0sbi5tYXN0ZXJDb29yZC5yZW1vdmVNYXN0ZXIoZS5nZXRJZCgpKTtsZXQgcj17bGVuZ3RoOk9iamVjdC5rZXlzKG4ucG9ydENvbmR1aXRNYXApLmxlbmd0aH0sbz1PYmplY3Qua2V5cyhuLnN0cmVhbU1hcEJ5VGFiSWQpO3RyeXtsZXQgdD1vLmZpbmQoKHQ9Pm4uc3RyZWFtTWFwQnlUYWJJZFt0XS5pbmNsdWRlcyhlLmdldElkKCkpKSk7aWYodCl7bGV0IG89bi5zdHJlYW1NYXBCeVRhYklkW3RdLmZpbmRJbmRleCgodD0+ZS5nZXRJZCgpPT09dCkpO24uc3RyZWFtTWFwQnlUYWJJZFt0XS5zcGxpY2UobywxKTtsZXQgaT1uLnN0cmVhbU1hcEJ5VGFiSWRbdF0/bi5zdHJlYW1NYXBCeVRhYklkW3RdLmxlbmd0aDowO3JbdF09e2xlbmd0aDppfSxyLnRhYklkPXR9bGV0IGk9by5maWx0ZXIoKGU9Pm4uc3RyZWFtTWFwQnlUYWJJZFtlXS5sZW5ndGg+MCkpLmxlbmd0aDtyLnN0cmVhbXNUYWJzQWNyb3NzQnJvd3Nlcj1pfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIltUYWIgSWRzXSBJc3N1ZSB1cGRhdGluZyB0YWJJZC1zcGVjaWZpYyBzdHJlYW0gZGF0YSIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1uLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuVVBEQVRFX0NPTk5FQ1RFRF9DQ1BTLHIpfSxzLnByb3RvdHlwZS51cGRhdGVBZ2VudENvbmZpZ3VyYXRpb249ZnVuY3Rpb24oZSl7ZS5wZXJtaXNzaW9ucyYmZS5kaWFsYWJsZUNvdW50cmllcyYmZS5hZ2VudFN0YXRlcyYmZS5yb3V0aW5nUHJvZmlsZS5xdWV1ZXM/KHRoaXMuYWdlbnQ9dGhpcy5hZ2VudHx8e30sdGhpcy5hZ2VudC5jb25maWd1cmF0aW9uPWUsdGhpcy51cGRhdGVBZ2VudCgpKTp0LmdldExvZygpLnRyYWNlKCJXYWl0aW5nIHRvIHVwZGF0ZSBhZ2VudCBjb25maWd1cmF0aW9uIHVudGlsIGFsbCBjb25maWcgZGF0YSBoYXMgYmVlbiBmZXRjaGVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LHMucHJvdG90eXBlLnVwZGF0ZUFnZW50PWZ1bmN0aW9uKCl7dGhpcy5hZ2VudD90aGlzLmFnZW50LnNuYXBzaG90P3RoaXMuYWdlbnQuY29uZmlndXJhdGlvbj8odGhpcy5hZ2VudC5zbmFwc2hvdC5zdGF0dXM9dGhpcy5hZ2VudC5zdGF0ZSx0aGlzLmFnZW50LnNuYXBzaG90LmNvbnRhY3RzJiZ0aGlzLmFnZW50LnNuYXBzaG90LmNvbnRhY3RzLmxlbmd0aD4xJiZ0aGlzLmFnZW50LnNuYXBzaG90LmNvbnRhY3RzLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuc3RhdGUudGltZXN0YW1wLmdldFRpbWUoKS10LnN0YXRlLnRpbWVzdGFtcC5nZXRUaW1lKCl9KSksdGhpcy5hZ2VudC5zbmFwc2hvdC5jb250YWN0cy5mb3JFYWNoKChmdW5jdGlvbihlKXtlLnN0YXR1cz1lLnN0YXRlLGUuY29ubmVjdGlvbnMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5hZGRyZXNzPWUuZW5kcG9pbnR9KSl9KSksdGhpcy5hZ2VudC5jb25maWd1cmF0aW9uLnJvdXRpbmdQcm9maWxlLmRlZmF1bHRPdXRib3VuZFF1ZXVlLnF1ZXVlSWQ9dGhpcy5hZ2VudC5jb25maWd1cmF0aW9uLnJvdXRpbmdQcm9maWxlLmRlZmF1bHRPdXRib3VuZFF1ZXVlLnF1ZXVlQVJOLHRoaXMuYWdlbnQuY29uZmlndXJhdGlvbi5yb3V0aW5nUHJvZmlsZS5xdWV1ZXMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5xdWV1ZUlkPWUucXVldWVBUk59KSksdGhpcy5hZ2VudC5zbmFwc2hvdC5jb250YWN0cy5mb3JFYWNoKChmdW5jdGlvbihlKXt2b2lkIDAhPT1lLnF1ZXVlJiYoZS5xdWV1ZS5xdWV1ZUlkPWUucXVldWUucXVldWVBUk4pfSkpLHRoaXMuYWdlbnQuY29uZmlndXJhdGlvbi5yb3V0aW5nUHJvZmlsZS5yb3V0aW5nUHJvZmlsZUlkPXRoaXMuYWdlbnQuY29uZmlndXJhdGlvbi5yb3V0aW5nUHJvZmlsZS5yb3V0aW5nUHJvZmlsZUFSTix0aGlzLnN1cHByZXNzJiYodGhpcy5hZ2VudC5zbmFwc2hvdC5jb250YWN0cz10aGlzLmFnZW50LnNuYXBzaG90LmNvbnRhY3RzLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3RhdGUudHlwZT09dC5Db250YWN0U3RhdGVUeXBlLkNPTk5FQ1RFRHx8ZS5zdGF0ZS50eXBlPT10LkNvbnRhY3RTdGF0ZVR5cGUuRU5ERUR9KSksdGhpcy5mb3JjZU9mZmxpbmUmJnRoaXMuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRk9SQ0VfT0ZGTElORSkpLHRoaXMuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkFnZW50RXZlbnRzLlVQREFURSx0aGlzLmFnZW50KSk6dC5nZXRMb2coKS50cmFjZSgiV2FpdGluZyB0byB1cGRhdGUgYWdlbnQgdW50aWwgdGhlIGFnZW50IGNvbmZpZ3VyYXRpb24gaXMgYXZhaWxhYmxlLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk6dC5nZXRMb2coKS50cmFjZSgiV2FpdGluZyB0byB1cGRhdGUgYWdlbnQgdW50aWwgdGhlIGFnZW50IHNuYXBzaG90IGlzIGF2YWlsYWJsZS4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpOnQuZ2V0TG9nKCkudHJhY2UoIldhaXRpbmcgdG8gdXBkYXRlIGFnZW50IHVudGlsIHRoZSBhZ2VudCBoYXMgYmVlbiBmdWxseSBjb25zdHJ1Y3RlZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxzLnByb3RvdHlwZS5nZXRXZWJTb2NrZXRVcmw9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49dC5jb3JlLmdldENsaWVudCgpLHI9dC5oaXRjaChlLGUuaGFuZGxlQXV0aEZhaWwpLG89dC5oaXRjaChlLGUuaGFuZGxlQWNjZXNzRGVuaWVkKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGUsaSl7bi5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DUkVBVEVfVFJBTlNQT1JULHt0cmFuc3BvcnRUeXBlOnQuVFJBTlNQT1JUX1RZUEVTLldFQl9TT0NLRVR9LHtzdWNjZXNzOmZ1bmN0aW9uKG4pe3QuZ2V0TG9nKCkuaW5mbygiZ2V0V2ViU29ja2V0VXJsIHN1Y2NlZWRlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksZShuKX0sZmFpbHVyZTpmdW5jdGlvbihlLG4pe3QuZ2V0TG9nKCkuZXJyb3IoImdldFdlYlNvY2tldFVybCBmYWlsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjplLGRhdGE6bn0pLGkoe3JlYXNvbjoiZ2V0V2ViU29ja2V0VXJsIGZhaWxlZCIsX2RlYnVnOmV9KX0sYXV0aEZhaWx1cmU6ZnVuY3Rpb24oKXt0LmdldExvZygpLmVycm9yKCJnZXRXZWJTb2NrZXRVcmwgQXV0aCBGYWlsdXJlIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKEVycm9yKCJBdXRoZW50aWNhdGlvbiBmYWlsZWQgd2hpbGUgZ2V0dGluZyBnZXRXZWJTb2NrZXRVcmwiKSkscigpfSxhY2Nlc3NEZW5pZWQ6ZnVuY3Rpb24oKXt0LmdldExvZygpLmVycm9yKCJnZXRXZWJTb2NrZXRVcmwgQWNjZXNzIERlbmllZCBGYWlsdXJlIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKEVycm9yKCJBY2Nlc3MgRGVuaWVkIEZhaWx1cmUgd2hpbGUgZ2V0dGluZyBnZXRXZWJTb2NrZXRVcmwiKSksbygpfX0pfSkpfSxzLnByb3RvdHlwZS5oYW5kbGVTZW5kTG9nc1JlcXVlc3Q9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49W10scj1lLmxvZ3NCdWZmZXIuc2xpY2UoKTtlLmxvZ3NCdWZmZXI9W10sci5mb3JFYWNoKChmdW5jdGlvbihlKXtuLnB1c2goe3RpbWVzdGFtcDplLnRpbWUsY29tcG9uZW50OmUuY29tcG9uZW50LG1lc3NhZ2U6ZS50ZXh0fSl9KSksdGhpcy5jbGllbnQuY2FsbCh0LkNsaWVudE1ldGhvZHMuU0VORF9DTElFTlRfTE9HUyx7bG9nRXZlbnRzOm59LHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiU2VuZExvZ3MgcmVxdWVzdCBzdWNjZWVkZWQuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0sZmFpbHVyZTpmdW5jdGlvbihlLG4pe3QuZ2V0TG9nKCkuZXJyb3IoIlNlbmRMb2dzIHJlcXVlc3QgZmFpbGVkLiIpLndpdGhPYmplY3Qobikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxhdXRoRmFpbHVyZTp0LmhpdGNoKGUsZS5oYW5kbGVBdXRoRmFpbCl9KX0scy5wcm90b3R5cGUuaGFuZGxlQXV0aEZhaWw9ZnVuY3Rpb24oZSl7ZT90aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuQVVUSF9GQUlMLGUpOnRoaXMuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BVVRIX0ZBSUwpfSxzLnByb3RvdHlwZS5oYW5kbGVQb2xsaW5nQXV0aEZhaWw9ZnVuY3Rpb24oKXt0aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuQ1RJX0FVVEhPUklaRV9SRVRSSUVTX0VYSEFVU1RFRCl9LHMucHJvdG90eXBlLmhhbmRsZUFjY2Vzc0RlbmllZD1mdW5jdGlvbigpe3RoaXMuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BQ0NFU1NfREVOSUVEKX0scy5wcm90b3R5cGUuY2hlY2tBdXRoVG9rZW49ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49bmV3IERhdGUoZS5pbml0RGF0YS5hdXRoVG9rZW5FeHBpcmF0aW9uKSxyPShuZXcgRGF0ZSkuZ2V0VGltZSgpO24uZ2V0VGltZSgpPHIrMThlNSYmKHQuZ2V0TG9nKCkuaW5mbygiQXV0aCB0b2tlbiBleHBpcmVzIGF0ICIrbisiIFN0YXJ0IHJlZnJlc2hpbmcgdG9rZW4gd2l0aCByZXRyeS4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuYmFja29mZih0LmhpdGNoKGUsZS5hdXRob3JpemUpLDFlNCw0KSl9LHMucHJvdG90eXBlLmF1dGhvcml6ZT1mdW5jdGlvbihlKXt2YXIgbj10aGlzO3QuY29yZS5hdXRob3JpemUodGhpcy5pbml0RGF0YS5hdXRob3JpemVFbmRwb2ludCkudGhlbigoZnVuY3Rpb24ocil7dmFyIG89bmV3IERhdGUoci5leHBpcmF0aW9uKTt0LmdldExvZygpLmluZm8oIkF1dGhvcml6YXRpb24gc3VjY2VlZGVkIGFuZCB0aGUgdG9rZW4gZXhwaXJlcyBhdCAlcyIsbykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLmluaXREYXRhLmF1dGhUb2tlbj1yLmFjY2Vzc1Rva2VuLG4uaW5pdERhdGEuYXV0aFRva2VuRXhwaXJhdGlvbj1vLHQuY29yZS5pbml0Q2xpZW50KG4uaW5pdERhdGEpLHQuY29yZS5pbml0QWdlbnRBcHBDbGllbnQobi5pbml0RGF0YSksZS5zdWNjZXNzKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKHIpe3QuZ2V0TG9nKCkuZXJyb3IoIkF1dGhvcml6YXRpb24gZmFpbGVkIHdpdGggY29kZSAlcyIsci5zdGF0dXMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksNDAxPT09ci5zdGF0dXM/bi5oYW5kbGVBdXRoRmFpbCgpOmUuZmFpbHVyZSgpfSkpfSxzLnByb3RvdHlwZS5maWx0ZXJBdXRoVG9rZW49ZnVuY3Rpb24oZSl7dmFyIHQ9e307Zm9yKHZhciBuIGluIGUpaWYoInBhcmFtcyI9PT1uKXt2YXIgcj17fTtmb3IodmFyIG8gaW4gZS5wYXJhbXMpImF1dGhlbnRpY2F0aW9uIiE9PW8mJihyW29dPWUucGFyYW1zW29dKTt0LnBhcmFtcz1yfWVsc2UgdFtuXT1lW25dO3JldHVybiB0fSx0Lndvcmtlci5tYWluPWZ1bmN0aW9uKCl7dC53b3JrZXIuY2xpZW50RW5naW5lPW5ldyBzfX0oKX19LHQ9e307ZnVuY3Rpb24gbihyKXt2YXIgbz10W3JdO2lmKHZvaWQgMCE9PW8pcmV0dXJuIG8uZXhwb3J0czt2YXIgaT10W3JdPXtleHBvcnRzOnt9fTtyZXR1cm4gZVtyXS5jYWxsKGkuZXhwb3J0cyxpLGkuZXhwb3J0cyxuKSxpLmV4cG9ydHN9bi5nPWZ1bmN0aW9uKCl7aWYoIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzKXJldHVybiBnbG9iYWxUaGlzO3RyeXtyZXR1cm4gdGhpc3x8bmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9Y2F0Y2goZSl7aWYoIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cpcmV0dXJuIHdpbmRvd319KCksbig4MjcpLG4oMTYzKSxuKDk0NCksbigxNTEpLG4oODkxKSxuKDU5Miksbig4Miksbig3NTQpLG4oODMzKSxuKDE2MSksbig5NjUpLG4oMjg2KSxuKDg5NSksbig3NDMpLG4oNjQyKSxuKDczNiksbig0MzkpLG4oMjc5KSxuKDQxOCksbigxODcpLG4oODIxKSxuKDUwMCl9KSgpOw=="),d=function(l){this.id=l.region,l.region=this._normalizeRegionString(l.region),this.height=l.height,this.style=l.iframe_style,this.ccp=this._createFramedCcp(l)};d.prototype._createFramedCcp=function(l){var Z=Z||"microphone; autoplay; clipboard-write",b=this.style||"margin: 0; border: 0; padding: 0px; width: 0px; height: 0px",d=document.createElement("iframe");return d.srcdoc=this.getContent(l),d.allow=Z,d.id=this.id,d.style=b,d.scrolling="no",d},d.prototype.getContent=function(l){return["","","","","