diff --git a/Documentation.md b/Documentation.md index 708dc11..169e2bc 100644 --- a/Documentation.md +++ b/Documentation.md @@ -1020,6 +1020,7 @@ Subscribe a method to be invoked when the contact is connecting. This event happ ```js contact.onAccepted(function(contact) { /* ... */ }); ``` + Subscribe a method to be invoked whenever the contact is accepted. Please note that this event doesn't get triggered for agents using a deskphone. ### `contact.onMissed()` @@ -2276,31 +2277,86 @@ To get latest streams file and allowlist required urls follow [these instruction connectUrl + "/wisdom-v2/", { style: "width:400px; height:600px;" } ); - connect.agentApp.initApp( - "customviews", - "customviews-container", - connectUrl + "/stargate/app", - { style: "width:400px; height:600px;" } - ); + /** + * CustomViews applications are traditionally attached to a contact for auto handling the lifecycle of a customviews on the attached contacts destroy event. + * Customviews has a few additional options that can be passed into the initApp config under the customViewsParams property to enable this behavior. + * NOTE: Destroyed customviews applications will be removed from the AppRegistry to clear their namespace when using customViewsParams. + * WARNING: Failing to handle the lifecycle of a customview by setting disableAutoDestroy to true and not calling terminateCustomView() on the application will cause the + * customviews to count against your chat concurrency until it is terminated by the chat reaching its configured duration (defaults to 24 hours) or the Show View block timeout. + * + * *OPTIONAL* + * contact(contact | string): Attaches the contact to the customviews application, can be a contact object or contactId. + * If you use a contactId then disableAutoDestroy is true by default and you must use + * connect.core.terminateCustomView() to end the lifecycle of the customviews before closing the iframe. + * + * iframeSuffix (string): Attaches a suffix to the customviews application iframe id. This id will be formed as customviews{iframeSuffix}. + * Useful for instantiating multiple customviews applications in a single page and associating customviews applications with contactIds. * - * CustomViews will not load any view without a contact flow Id. - * You can get the contact flow ID from the contact attribute, DefaultFlowForAgentUI (see [here](https://docs.aws.amazon.com/connect/latest/adminguide/how-to-invoke-a-flow-sg.html) for more details on this particular attribute). - * If you want to use information on the current connected contact (voice, chat, or task) to provide context to the step-by-step guide flow, you should add the parameter, currentContactId, at the url. - * For more information, visit the AWS website: https://aws.amazon.com/connect/agent-workspace/ - * - **/ + * contactFlowId (string): The contactFlowId for the customviews that the application will display. + * + * disableAutoDestroy (boolean): Disables the default handling of the views lifecycle behavior to not + * terminate when the connected contact is closed. + * WARNING: NOT PROPERLY TERMINATING THE CUSTOMVIEW WITH CONNECT.CORE.TERMINATECUSTOMVIEW() BEFORE DESTROYING YOUR IFRAME CONTEXT WILL CAUSE THE CUSTOMVIEW TO COUNT AGAINST YOUR CHAT CONCURRENCY UNTIL IT IS TERMINATED BY THE DEFAULT CHAT OR CUSTOMVIEW FLOW TIMEOUT. + * + * terminateCustomViewOptions (TerminateCustomViewOptions): Options around controlling the iframe's resolution behavior when disableAutoDestroy is true. + * - resolveIframe (boolean): Whether to deconstruct the application iframe and clear its id in the AppRegistry, freeing the namespace of the applications id. Default true. + * - timeout (number): Timeout in ms. The amount of time to wait for the DOM to resolve and clear the iframe if resolveIframe is true. Default 5000. + * - hideIframe (boolean): Hides the iframe while it wait to be cleared from the DOM. Default true. + * + **/ connect.contact((contact)=>{ contact.onConnected((contact)=>{ - const currentContactId = contact.contactId; - const contactAttributes = contact.getAttributes(); - if(contactAttributes["DefaultFlowForAgentUI"]) { - const contactflowId = contactAttributes["DefaultFlowForAgentUI"].value; - const customViewsIframe = document.querySelector('#customviews-container > iframe'); - - customViewsIframe.setAttribute('src', `${connectUrl}/stargate/app?contactFlowId=${contactflowId}¤tContactId=${currentContactId}`); - } + connect.agentApp.initApp( + "customviews", + "customviews-container", + connectUrl + "/stargate/app", + { + style: "width:400px; height:600px;", + customViewsParams: { + contact: contact, + contactFlowId: "55e028e0-62e5-44e7-aa81-eac163ed3fe1", + iframeSuffix: `${contact.getContactId()}-55e028e0-62e5-44e7-aa81-eac163ed3fe1`; + disableAutoDestroy: false, + { + hideIframe: true, + timeout: 5000, + resolveIframe: true, + } + }, + } + ); }); + + contact.onACW((contact)=>{ + connect.agentApp.initApp( + "customviews", + "customviews-container", + connectUrl + "/stargate/app", + { + style: "width:400px; height:600px;", + customViewsParams: { + contact: contact, + contactFlowId: "70f643e7-7565-431b-9eb7-f5d666fc7a34", + iframeSuffix:`${contact.getContactId()}-70f643e7-7565-431b-9eb7-f5d666fc7a34`; + disableAutoDestroy: true + }, + } + ); + }); + + // Because the onACW initApp for customviews has disableAutoDestroy set to true, we must manually terminate the customview + contact.onDestroy((contact) => { + connect.core.terminateCustomView( + connectUrl, + `${contact.getContactId()}-70f643e7-7565-431b-9eb7-f5d666fc7a34`, + { + resolveIframe: true, + timeout: 5000, + hideIframe: true + } + ); + }) }) } @@ -2315,6 +2371,7 @@ Integrates with Amazon Connect by loading the pre-built app located at `appUrl` - `appUrl`: The string URL of the app. This is the page you would normally navigate to in order to use the app in a standalone page, it is different for each instance. - `config`: This object is optional and allows you to specify some settings surrounding the CCP. - `ccpParams`: Optional params that mirror the configuration options for `initCCP`. Only valid when `name` is set to `ccp`. `allowFramedSoftphone` defaults to `true`. + - `customViewsParams`: Optional params that are applicable when the `name` is set to `customviews`. Only valid when `name` is set to `customviews`. - `style`: An optional string to supply inline styling for the iframe. ## Voice ID APIs diff --git a/package-lock.json b/package-lock.json index e9f6831..8232f37 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "amazon-connect-streams", - "version": "2.13.3", + "version": "2.14.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "amazon-connect-streams", - "version": "2.13.3", + "version": "2.14.0", "license": "Apache-2.0", "devDependencies": { "chai": "^4.3.7", diff --git a/package.json b/package.json index 39085f1..2c69e85 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "amazon-connect-streams", - "version": "2.13.3", + "version": "2.14.0", "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 82ffb4d..6534dda 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+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10LHQuYWdlbnRBcHA9e307dmFyIG49ImNjcCI7dC5hZ2VudEFwcC5pbml0Q0NQPXQuY29yZS5pbml0Q0NQLHQuYWdlbnRBcHAuaXNJbml0aWFsaXplZD1mdW5jdGlvbihlKXt9LHQuYWdlbnRBcHAuaW5pdEFwcENvbW11bmljYXRpb249ZnVuY3Rpb24oZSxuKXt2YXIgcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKSxvPW5ldyB0LklGcmFtZUNvbmR1aXQobix3aW5kb3csciksaT1bdC5BZ2VudEV2ZW50cy5VUERBVEUsdC5Db250YWN0RXZlbnRzLlZJRVcsdC5FdmVudFR5cGUuQUNLTk9XTEVER0UsdC5FdmVudFR5cGUuVEVSTUlOQVRFRCx0LlRhc2tFdmVudHMuQ1JFQVRFRF07ci5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oZSl7aS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKGUsKGZ1bmN0aW9uKHQpe28uc2VuZFVwc3RyZWFtKGUsdCl9KSl9KSl9KSl9O3ZhciByPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXhPZigiY2NwLXYyIik7cmV0dXJuIGUuc2xpY2UoMCx0LTEpfTt0LmFnZW50QXBwLmluaXRBcHA9ZnVuY3Rpb24oZSxvLGkscyl7cz1zfHx7fTt2YXIgYT1pLmVuZHNXaXRoKCIvIik/aTppKyIvIixjPXMub25Mb2FkP3Mub25Mb2FkOm51bGwsdT17ZW5kcG9pbnQ6YSxzdHlsZTpzLnN0eWxlLG9uTG9hZDpjfTt0LmFnZW50QXBwLkFwcFJlZ2lzdHJ5LnJlZ2lzdGVyKGUsdSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvKSksdC5hZ2VudEFwcC5BcHBSZWdpc3RyeS5zdGFydChlLChmdW5jdGlvbihvKXt2YXIgaT1vLmVuZHBvaW50LGE9by5jb250YWluZXJET007cmV0dXJue2luaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZT09PW4/KHMuY2NwUGFyYW1zPXMuY2NwUGFyYW1zP3MuY2NwUGFyYW1zOnt9LHMuc3R5bGUmJihzLmNjcFBhcmFtcy5zdHlsZT1zLnN0eWxlKSxmdW5jdGlvbihlLG4sbyl7dmFyIGk9e2NjcFVybDplLGNjcExvYWRUaW1lb3V0OjFlNCxsb2dpblBvcHVwOiEwLGxvZ2luVXJsOnIoZSkrIi9sb2dpbiIsc29mdHBob25lOnthbGxvd0ZyYW1lZFNvZnRwaG9uZTohMCxkaXNhYmxlUmluZ3RvbmU6ITEsYWxsb3dGcmFtZWRWaWRlb0NhbGw6ITB9fSxzPXQubWVyZ2UoaSxvLmNjcFBhcmFtcyk7dC5jb3JlLmluaXRDQ1AobixzKX0oaSxhLHMpKTp0LmFnZW50QXBwLmluaXRBcHBDb21tdW5pY2F0aW9uKGUsaSl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtyZXR1cm4gZT09PW4/KG89cihpKSsiL2xvZ291dCIsdC5mZXRjaChvLHtjcmVkZW50aWFsczoiaW5jbHVkZSJ9KS50aGVuKChmdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLlRFUk1JTkFURSksITB9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3JldHVybiB0LmdldExvZygpLmVycm9yKCJBbiBlcnJvciBvY2N1cmVkIG9uIGxvZ291dC4iK2UpLndpdGhFeGNlcHRpb24oZSksd2luZG93LmxvY2F0aW9uLmhyZWY9bywhMX0pKSk6bnVsbDt2YXIgb319fSkpfSx0LmFnZW50QXBwLnN0b3BBcHA9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuYWdlbnRBcHAuQXBwUmVnaXN0cnkuc3RvcChlKX19KCl9LDUwMDooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10O3ZhciBuLHI9ImNjcCI7ZS5jb25uZWN0LmFnZW50QXBwLkFwcFJlZ2lzdHJ5PShuPXt9LHtyZWdpc3RlcjpmdW5jdGlvbihlLHQscil7bltlXT17Y29udGFpbmVyRE9NOnIsZW5kcG9pbnQ6dC5lbmRwb2ludCxzdHlsZTp0LnN0eWxlLGluc3RhbmNlOnZvaWQgMCxvbkxvYWQ6dC5vbkxvYWR9fSxzdGFydDpmdW5jdGlvbihlLHQpe2lmKG5bZV0pe3ZhciBvPW5bZV0uY29udGFpbmVyRE9NLGk9bltlXS5lbmRwb2ludCxzPW5bZV0uc3R5bGUsYT1uW2VdLm9uTG9hZDtpZihlIT09cil7dmFyIGM9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7cmV0dXJuIG8uc3JjPXQsby5zdHlsZT1ufHwid2lkdGg6IDEwMCU7IGhlaWdodDoxMDAlOyIsby5pZD1lLG9bImFyaWEtbGFiZWwiXT1lLG8ub25sb2FkPXIsby5hbGxvdz0iY2xpcGJvYXJkLXJlYWQ7IGNsaXBib2FyZC13cml0ZSIsby5zZXRBdHRyaWJ1dGUoInNhbmRib3giLCJhbGxvdy1mb3JtcyBhbGxvdy1wb3B1cHMgYWxsb3ctcG9wdXBzLXRvLWVzY2FwZS1zYW5kYm94IGFsbG93LXNhbWUtb3JpZ2luIGFsbG93LXNjcmlwdHMiKSxvfShlLGkscyxhKTtvLmFwcGVuZENoaWxkKGMpfXJldHVybiBuW2VdLmluc3RhbmNlPXQobltlXSksbltlXS5pbnN0YW5jZS5pbml0KCl9fSxzdG9wOmZ1bmN0aW9uKGUpe2lmKG5bZV0pe3ZhciB0LHI9bltlXSxvPXIuY29udGFpbmVyRE9NLnF1ZXJ5U2VsZWN0b3IoImlmcmFtZSIpO3JldHVybiByLmNvbnRhaW5lckRPTS5yZW1vdmVDaGlsZChvKSxyLmluc3RhbmNlJiYodD1yLmluc3RhbmNlLmRlc3Ryb3koKSxkZWxldGUgci5pbnN0YW5jZSksdH19fSl9KCl9LDk2NTooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10LHQuQWdlbnRTdGF0ZVR5cGU9dC5tYWtlRW51bShbImluaXQiLCJyb3V0YWJsZSIsIm5vdF9yb3V0YWJsZSIsIm9mZmxpbmUiXSksdC5BZ2VudFN0YXR1c1R5cGU9dC5BZ2VudFN0YXRlVHlwZSx0LkFnZW50QXZhaWxTdGF0ZXM9dC5tYWtlRW51bShbIkluaXQiLCJCdXN5IiwiQWZ0ZXJDYWxsV29yayIsIkNhbGxpbmdDdXN0b21lciIsIkRpYWxpbmciLCJKb2luaW5nIiwiUGVuZGluZ0F2YWlsYWJsZSIsIlBlbmRpbmdCdXN5Il0pLHQuQWdlbnRFcnJvclN0YXRlcz10Lm1ha2VFbnVtKFsiRXJyb3IiLCJBZ2VudEh1bmdVcCIsIkJhZEFkZHJlc3NBZ2VudCIsIkJhZEFkZHJlc3NDdXN0b21lciIsIkRlZmF1bHQiLCJGYWlsZWRDb25uZWN0QWdlbnQiLCJGYWlsZWRDb25uZWN0Q3VzdG9tZXIiLCJJbnZhbGlkTG9jYWxlIiwiTGluZUVuZ2FnZWRBZ2VudCIsIkxpbmVFbmdhZ2VkQ3VzdG9tZXIiLCJNaXNzZWRDYWxsQWdlbnQiLCJNaXNzZWRDYWxsQ3VzdG9tZXIiLCJNdWx0aXBsZUNjcFdpbmRvd3MiLCJSZWFsdGltZUNvbW11bmljYXRpb25FcnJvciJdKSx0LkVuZHBvaW50VHlwZT10Lm1ha2VFbnVtKFsicGhvbmVfbnVtYmVyIiwiYWdlbnQiLCJxdWV1ZSJdKSx0LkFkZHJlc3NUeXBlPXQuRW5kcG9pbnRUeXBlLHQuQ29ubmVjdGlvblR5cGU9dC5tYWtlRW51bShbImFnZW50IiwiaW5ib3VuZCIsIm91dGJvdW5kIiwibW9uaXRvcmluZyJdKSx0LkNvbm5lY3Rpb25TdGF0ZVR5cGU9dC5tYWtlRW51bShbImluaXQiLCJjb25uZWN0aW5nIiwiY29ubmVjdGVkIiwiaG9sZCIsImRpc2Nvbm5lY3RlZCIsInNpbGVudF9tb25pdG9yIiwiYmFyZ2UiXSksdC5Db25uZWN0aW9uU3RhdHVzVHlwZT10LkNvbm5lY3Rpb25TdGF0ZVR5cGUsdC5DT05ORUNUSU9OX0FDVElWRV9TVEFURVM9dC5zZXQoW3QuQ29ubmVjdGlvblN0YXRlVHlwZS5DT05ORUNUSU5HLHQuQ29ubmVjdGlvblN0YXRlVHlwZS5DT05ORUNURUQsdC5Db25uZWN0aW9uU3RhdGVUeXBlLkhPTEQsdC5Db25uZWN0aW9uU3RhdGVUeXBlLlNJTEVOVF9NT05JVE9SLHQuQ29ubmVjdGlvblN0YXRlVHlwZS5CQVJHRV0pLHQuQ09OTkVDVElPTl9DT05ORUNURURfU1RBVEVTPXQuc2V0KFt0LkNvbm5lY3Rpb25TdGF0ZVR5cGUuQ09OTkVDVEVELHQuQ29ubmVjdGlvblN0YXRlVHlwZS5TSUxFTlRfTU9OSVRPUix0LkNvbm5lY3Rpb25TdGF0ZVR5cGUuQkFSR0VdKSx0LkNvbnRhY3RTdGF0ZVR5cGU9dC5tYWtlRW51bShbImluaXQiLCJpbmNvbWluZyIsInBlbmRpbmciLCJjb25uZWN0aW5nIiwiY29ubmVjdGVkIiwibWlzc2VkIiwiZXJyb3IiLCJlbmRlZCIsInJlamVjdGVkIiwicGF1c2VkIl0pLHQuQ29udGFjdFN0YXR1c1R5cGU9dC5Db250YWN0U3RhdGVUeXBlLHQuQ09OVEFDVF9BQ1RJVkVfU1RBVEVTPXQubWFrZUVudW0oWyJwYXVzZWQiLCJpbmNvbWluZyIsInBlbmRpbmciLCJjb25uZWN0aW5nIiwiY29ubmVjdGVkIl0pLHQuQ29udGFjdFR5cGU9dC5tYWtlRW51bShbInZvaWNlIiwicXVldWVfY2FsbGJhY2siLCJjaGF0IiwidGFzayJdKSx0LkNvbnRhY3RJbml0aWF0aW9uTWV0aG9kPXQubWFrZUVudW0oWyJpbmJvdW5kIiwib3V0Ym91bmQiLCJ0cmFuc2ZlciIsInF1ZXVlX3RyYW5zZmVyIiwiY2FsbGJhY2siLCJhcGkiLCJkaXNjb25uZWN0Iiwid2VicnRjX2FwaSJdKSx0Lk1vbml0b3JpbmdNb2RlPXQubWFrZUVudW0oWyJTSUxFTlRfTU9OSVRPUiIsIkJBUkdFIl0pLHQuTW9uaXRvcmluZ0Vycm9yVHlwZXM9dC5tYWtlRW51bShbImludmFsaWRfdGFyZ2V0X3N0YXRlIl0pLHQuQ2hhbm5lbFR5cGU9dC5tYWtlRW51bShbIlZPSUNFIiwiQ0hBVCIsIlRBU0siXSksdC5NZWRpYVR5cGU9dC5tYWtlRW51bShbInNvZnRwaG9uZSIsImNoYXQiLCJ0YXNrIl0pLHQuU29mdHBob25lQ2FsbFR5cGU9dC5tYWtlRW51bShbImF1ZGlvX3ZpZGVvIiwidmlkZW9fb25seSIsImF1ZGlvX29ubHkiLCJub25lIl0pLHQuU29mdHBob25lRXJyb3JUeXBlcz10Lm1ha2VFbnVtKFsidW5zdXBwb3J0ZWRfYnJvd3NlciIsIm1pY3JvcGhvbmVfbm90X3NoYXJlZCIsInNpZ25hbGxpbmdfaGFuZHNoYWtlX2ZhaWx1cmUiLCJzaWduYWxsaW5nX2Nvbm5lY3Rpb25fZmFpbHVyZSIsImljZV9jb2xsZWN0aW9uX3RpbWVvdXQiLCJ1c2VyX2J1c3lfZXJyb3IiLCJ3ZWJydGNfZXJyb3IiLCJyZWFsdGltZV9jb21tdW5pY2F0aW9uX2Vycm9yIiwidmRpX3N0cmF0ZWd5X25vdF9zdXBwb3J0ZWQiLCJ2ZGlfcmVkaXJfbm90X3N1cHBvcnRlZCIsIm90aGVyIl0pLHQuQ2xpY2tUeXBlPXQubWFrZUVudW0oWyJBY2NlcHQiLCJSZWplY3QiLCJIYW5ndXAiXSksdC5Wb2ljZUlkRXJyb3JUeXBlcz10Lm1ha2VFbnVtKFsibm9fc3BlYWtlcl9pZF9mb3VuZCIsInNwZWFrZXJfaWRfbm90X2Vucm9sbGVkIiwiZ2V0X3NwZWFrZXJfaWRfZmFpbGVkIiwiZ2V0X3NwZWFrZXJfc3RhdHVzX2ZhaWxlZCIsIm9wdF9vdXRfc3BlYWtlcl9mYWlsZWQiLCJvcHRfb3V0X3NwZWFrZXJfaW5fbGNtc19mYWlsZWQiLCJkZWxldGVfc3BlYWtlcl9mYWlsZWQiLCJzdGFydF9zZXNzaW9uX2ZhaWxlZCIsImV2YWx1YXRlX3NwZWFrZXJfZmFpbGVkIiwic2Vzc2lvbl9ub3RfZXhpc3RzIiwiZGVzY3JpYmVfc2Vzc2lvbl9mYWlsZWQiLCJlbnJvbGxfc3BlYWtlcl9mYWlsZWQiLCJ1cGRhdGVfc3BlYWtlcl9pZF9mYWlsZWQiLCJ1cGRhdGVfc3BlYWtlcl9pZF9pbl9sY21zX2ZhaWxlZCIsIm5vdF9zdXBwb3J0ZWRfb25fY29uZmVyZW5jZV9jYWxscyIsImVucm9sbF9zcGVha2VyX3RpbWVvdXQiLCJldmFsdWF0ZV9zcGVha2VyX3RpbWVvdXQiLCJnZXRfZG9tYWluX2lkX2ZhaWxlZCIsIm5vX2RvbWFpbl9pZF9mb3VuZCJdKSx0LkNUSUV4Y2VwdGlvbnM9dC5tYWtlRW51bShbIkFjY2Vzc0RlbmllZEV4Y2VwdGlvbiIsIkludmFsaWRTdGF0ZUV4Y2VwdGlvbiIsIkJhZEVuZHBvaW50RXhjZXB0aW9uIiwiSW52YWxpZEFnZW50QVJORXhjZXB0aW9uIiwiSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24iLCJJbnZhbGlkQ29udGFjdFR5cGVFeGNlcHRpb24iLCJQYWdpbmF0aW9uRXhjZXB0aW9uIiwiUmVmcmVzaFRva2VuRXhwaXJlZEV4Y2VwdGlvbiIsIlNlbmREYXRhRmFpbGVkRXhjZXB0aW9uIiwiVW5hdXRob3JpemVkRXhjZXB0aW9uIiwiUXVvdGFFeGNlZWRlZEV4Y2VwdGlvbiJdKSx0LlZvaWNlSWRTdHJlYW1pbmdTdGF0dXM9dC5tYWtlRW51bShbIk9OR09JTkciLCJFTkRFRCIsIlBFTkRJTkdfQ09ORklHVVJBVElPTiJdKSx0LlZvaWNlSWRBdXRoZW50aWNhdGlvbkRlY2lzaW9uPXQubWFrZUVudW0oWyJBQ0NFUFQiLCJSRUpFQ1QiLCJOT1RfRU5PVUdIX1NQRUVDSCIsIlNQRUFLRVJfTk9UX0VOUk9MTEVEIiwiU1BFQUtFUl9PUFRFRF9PVVQiLCJTUEVBS0VSX0lEX05PVF9QUk9WSURFRCIsIlNQRUFLRVJfRVhQSVJFRCJdKSx0LlZvaWNlSWRGcmF1ZERldGVjdGlvbkRlY2lzaW9uPXQubWFrZUVudW0oWyJOT1RfRU5PVUdIX1NQRUVDSCIsIkhJR0hfUklTSyIsIkxPV19SSVNLIl0pLHQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uPXQubWFrZUVudW0oWyJBdXRoZW50aWNhdGVkIiwiTm90QXV0aGVudGljYXRlZCIsIkluY29uY2x1c2l2ZSIsIk5vdEVucm9sbGVkIiwiT3B0ZWRPdXQiLCJOb3RFbmFibGVkIiwiRXJyb3IiXSksdC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb249dC5tYWtlRW51bShbIkhpZ2hSaXNrIiwiTG93UmlzayIsIkluY29uY2x1c2l2ZSIsIk5vdEVuYWJsZWQiLCJFcnJvciJdKSx0LlZpZGVvQ2FwYWJpbGl0eT10Lm1ha2VFbnVtKFsiU0VORCJdKSx0LlZvaWNlSWRFbnJvbGxtZW50UmVxdWVzdFN0YXR1cz10Lm1ha2VFbnVtKFsiTk9UX0VOT1VHSF9TUEVFQ0giLCJJTl9QUk9HUkVTUyIsIkNPTVBMRVRFRCIsIkZBSUxFRCJdKSx0LlZvaWNlSWRTcGVha2VyU3RhdHVzPXQubWFrZUVudW0oWyJPUFRFRF9PVVQiLCJFTlJPTExFRCIsIlBFTkRJTkciXSksdC5Wb2ljZUlkQ29uc3RhbnRzPXtFVkFMVUFURV9TRVNTSU9OX0RFTEFZOjFlNCxFVkFMVUFUSU9OX01BWF9QT0xMX1RJTUVTOjI0LEVWQUxVQVRJT05fUE9MTElOR19JTlRFUlZBTDo1ZTMsRU5ST0xMTUVOVF9NQVhfUE9MTF9USU1FUzoxMjAsRU5ST0xMTUVOVF9QT0xMSU5HX0lOVEVSVkFMOjVlMyxTVEFSVF9TRVNTSU9OX0RFTEFZOjhlM30sdC5BZ2VudFBlcm1pc3Npb25zPXtPVVRCT1VORF9DQUxMOiJvdXRib3VuZENhbGwiLFZPSUNFX0lEOiJ2b2ljZUlkIn07dmFyIG49ZnVuY3Rpb24oKXtpZighdC5hZ2VudC5pbml0aWFsaXplZCl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJUaGUgYWdlbnQgaXMgbm90IHlldCBpbml0aWFsaXplZCEiKX07bi5wcm90b3R5cGUuX2dldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0QWdlbnREYXRhKCl9LG4ucHJvdG90eXBlLl9jcmVhdGVDb250YWN0QVBJPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdC5Db250YWN0KGUuY29udGFjdElkKX0sbi5wcm90b3R5cGUub25SZWZyZXNoPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLlJFRlJFU0gsZSl9LG4ucHJvdG90eXBlLm9uUm91dGFibGU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuUk9VVEFCTEUsZSl9LG4ucHJvdG90eXBlLm9uTm90Um91dGFibGU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuTk9UX1JPVVRBQkxFLGUpfSxuLnByb3RvdHlwZS5vbk9mZmxpbmU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuT0ZGTElORSxlKX0sbi5wcm90b3R5cGUub25FcnJvcj1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5FUlJPUixlKX0sbi5wcm90b3R5cGUub25Tb2Z0cGhvbmVFcnJvcj1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5TT0ZUUEhPTkVfRVJST1IsZSl9LG4ucHJvdG90eXBlLm9uV2ViU29ja2V0Q29ubmVjdGlvbkxvc3Q9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuV0VCU09DS0VUX0NPTk5FQ1RJT05fTE9TVCxlKX0sbi5wcm90b3R5cGUub25XZWJTb2NrZXRDb25uZWN0aW9uR2FpbmVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLldFQlNPQ0tFVF9DT05ORUNUSU9OX0dBSU5FRCxlKX0sbi5wcm90b3R5cGUub25BZnRlckNhbGxXb3JrPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLkFDVyxlKX0sbi5wcm90b3R5cGUub25TdGF0ZUNoYW5nZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5TVEFURV9DSEFOR0UsZSl9LG4ucHJvdG90eXBlLm9uTXV0ZVRvZ2dsZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuQWdlbnRFdmVudHMuTVVURV9UT0dHTEUsZSl9LG4ucHJvdG90eXBlLm9uTG9jYWxNZWRpYVN0cmVhbUNyZWF0ZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkFnZW50RXZlbnRzLkxPQ0FMX01FRElBX1NUUkVBTV9DUkVBVEVELGUpfSxuLnByb3RvdHlwZS5vblNwZWFrZXJEZXZpY2VDaGFuZ2VkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5Db25maWd1cmF0aW9uRXZlbnRzLlNQRUFLRVJfREVWSUNFX0NIQU5HRUQsZSl9LG4ucHJvdG90eXBlLm9uTWljcm9waG9uZURldmljZUNoYW5nZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkNvbmZpZ3VyYXRpb25FdmVudHMuTUlDUk9QSE9ORV9ERVZJQ0VfQ0hBTkdFRCxlKX0sbi5wcm90b3R5cGUub25SaW5nZXJEZXZpY2VDaGFuZ2VkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5Db25maWd1cmF0aW9uRXZlbnRzLlJJTkdFUl9ERVZJQ0VfQ0hBTkdFRCxlKX0sbi5wcm90b3R5cGUub25DYW1lcmFEZXZpY2VDaGFuZ2VkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5Db25maWd1cmF0aW9uRXZlbnRzLkNBTUVSQV9ERVZJQ0VfQ0hBTkdFRCxlKX0sbi5wcm90b3R5cGUub25CYWNrZ3JvdW5kQmx1ckNoYW5nZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkNvbmZpZ3VyYXRpb25FdmVudHMuQkFDS0dST1VORF9CTFVSX0NIQU5HRUQsZSl9LG4ucHJvdG90eXBlLm11dGU9ZnVuY3Rpb24oKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkV2ZW50VHlwZS5NVVRFLGRhdGE6e211dGU6ITB9fSl9LG4ucHJvdG90eXBlLnVubXV0ZT1mdW5jdGlvbigpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuRXZlbnRUeXBlLk1VVEUsZGF0YTp7bXV0ZTohMX19KX0sbi5wcm90b3R5cGUuc2V0U3BlYWtlckRldmljZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuU0VUX1NQRUFLRVJfREVWSUNFLGRhdGE6e2RldmljZUlkOmV9fSl9LG4ucHJvdG90eXBlLnNldE1pY3JvcGhvbmVEZXZpY2U9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25maWd1cmF0aW9uRXZlbnRzLlNFVF9NSUNST1BIT05FX0RFVklDRSxkYXRhOntkZXZpY2VJZDplfX0pfSxuLnByb3RvdHlwZS5zZXRSaW5nZXJEZXZpY2U9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25maWd1cmF0aW9uRXZlbnRzLlNFVF9SSU5HRVJfREVWSUNFLGRhdGE6e2RldmljZUlkOmV9fSl9LG4ucHJvdG90eXBlLnNldENhbWVyYURldmljZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuQ0FNRVJBX0RFVklDRV9DSEFOR0VELGRhdGE6e2RldmljZUlkOmV9fSl9LG4ucHJvdG90eXBlLnNldEJhY2tncm91bmRCbHVyPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29uZmlndXJhdGlvbkV2ZW50cy5CQUNLR1JPVU5EX0JMVVJfQ0hBTkdFRCxkYXRhOntpc0JhY2tncm91bmRCbHVyRW5hYmxlZDplfX0pfSxuLnByb3RvdHlwZS5nZXRTdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuc25hcHNob3Quc3RhdGV9LG4ucHJvdG90eXBlLmdldE5leHRTdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuc25hcHNob3QubmV4dFN0YXRlfSxuLnByb3RvdHlwZS5nZXRBdmFpbGFiaWxpdHlTdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuc25hcHNob3QuYWdlbnRBdmFpbGFiaWxpdHlTdGF0ZX0sbi5wcm90b3R5cGUuZ2V0U3RhdHVzPW4ucHJvdG90eXBlLmdldFN0YXRlLG4ucHJvdG90eXBlLmdldFN0YXRlRHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdC5ub3coKS10aGlzLl9nZXREYXRhKCkuc25hcHNob3Quc3RhdGUuc3RhcnRUaW1lc3RhbXAuZ2V0VGltZSgpK3QuY29yZS5nZXRTa2V3KCl9LG4ucHJvdG90eXBlLmdldFN0YXR1c0R1cmF0aW9uPW4ucHJvdG90eXBlLmdldFN0YXRlRHVyYXRpb24sbi5wcm90b3R5cGUuZ2V0UGVybWlzc2lvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkucGVybWlzc2lvbnN9LG4ucHJvdG90eXBlLmdldENvbnRhY3RzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zbmFwc2hvdC5jb250YWN0cy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiB0Ll9jcmVhdGVDb250YWN0QVBJKGUpfSkpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIWV8fHQuZ2V0VHlwZSgpPT09ZX0pKX0sbi5wcm90b3R5cGUuZ2V0Q29uZmlndXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuY29uZmlndXJhdGlvbn0sbi5wcm90b3R5cGUuZ2V0QWdlbnRTdGF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuYWdlbnRTdGF0ZXN9LG4ucHJvdG90eXBlLmdldFJvdXRpbmdQcm9maWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLnJvdXRpbmdQcm9maWxlfSxuLnByb3RvdHlwZS5nZXRDaGFubmVsQ29uY3VycmVuY3k9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5nZXRSb3V0aW5nUHJvZmlsZSgpLmNoYW5uZWxDb25jdXJyZW5jeU1hcDtyZXR1cm4gbnx8KG49T2JqZWN0LmtleXModC5DaGFubmVsVHlwZSkucmVkdWNlKChmdW5jdGlvbihlLG4pe3JldHVybiJUQVNLIiE9PW4mJihlW3QuQ2hhbm5lbFR5cGVbbl1dPTEpLGV9KSx7fSkpLGU/bltlXXx8MDpufSxuLnByb3RvdHlwZS5nZXROYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLm5hbWV9LG4ucHJvdG90eXBlLmdldEFnZW50QVJOPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmFnZW50QVJOfSxuLnByb3RvdHlwZS5nZXRFeHRlbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZXh0ZW5zaW9ufSxuLnByb3RvdHlwZS5nZXREaWFsYWJsZUNvdW50cmllcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5kaWFsYWJsZUNvdW50cmllc30sbi5wcm90b3R5cGUuaXNTb2Z0cGhvbmVFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLnNvZnRwaG9uZUVuYWJsZWR9LG4ucHJvdG90eXBlLnNldENvbmZpZ3VyYXRpb249ZnVuY3Rpb24oZSxuKXt2YXIgcj10LmNvcmUuZ2V0Q2xpZW50KCk7ZSYmZS5hZ2VudFByZWZlcmVuY2VzJiZlLmFnZW50UHJlZmVyZW5jZXMuTEFOR1VBR0UmJiFlLmFnZW50UHJlZmVyZW5jZXMubG9jYWxlJiYoZS5hZ2VudFByZWZlcmVuY2VzLmxvY2FsZT1lLmFnZW50UHJlZmVyZW5jZXMuTEFOR1VBR0UpLGUmJmUuYWdlbnRQcmVmZXJlbmNlcyYmIXQuaXNWYWxpZExvY2FsZShlLmFnZW50UHJlZmVyZW5jZXMubG9jYWxlKT9uJiZuLmZhaWx1cmUmJm4uZmFpbHVyZSh0LkFnZW50RXJyb3JTdGF0ZXMuSU5WQUxJRF9MT0NBTEUpOnIuY2FsbCh0LkNsaWVudE1ldGhvZHMuVVBEQVRFX0FHRU5UX0NPTkZJR1VSQVRJT04se2NvbmZpZ3VyYXRpb246dC5hc3NlcnROb3ROdWxsKGUsImNvbmZpZ3VyYXRpb24iKX0se3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLlJFTE9BRF9BR0VOVF9DT05GSUdVUkFUSU9OKSxuLnN1Y2Nlc3MmJm4uc3VjY2VzcyhlKX0sZmFpbHVyZTpuJiZuLmZhaWx1cmV9KX0sbi5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24oZSxuLHIpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5QVVRfQUdFTlRfU1RBVEUse3N0YXRlOnQuYXNzZXJ0Tm90TnVsbChlLCJzdGF0ZSIpLGVucXVldWVOZXh0U3RhdGU6ciYmISFyLmVucXVldWVOZXh0U3RhdGV9LG4pfSxuLnByb3RvdHlwZS5vbkVucXVldWVkTmV4dFN0YXRlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLkVOUVVFVUVEX05FWFRfU1RBVEUsZSl9LG4ucHJvdG90eXBlLnNldFN0YXR1cz1uLnByb3RvdHlwZS5zZXRTdGF0ZSxuLnByb3RvdHlwZS5jb25uZWN0PWZ1bmN0aW9uKGUsbil7dmFyIHI9dC5jb3JlLmdldENsaWVudCgpLG89bmV3IHQuRW5kcG9pbnQoZSk7ZGVsZXRlIG8uZW5kcG9pbnRJZDt2YXIgaT17ZW5kcG9pbnQ6dC5hc3NlcnROb3ROdWxsKG8sImVuZHBvaW50IikscXVldWVBUk46biYmKG4ucXVldWVBUk58fG4ucXVldWVJZCl8fHRoaXMuZ2V0Um91dGluZ1Byb2ZpbGUoKS5kZWZhdWx0T3V0Ym91bmRRdWV1ZS5xdWV1ZUFSTn07biYmbi5yZWxhdGVkQ29udGFjdElkJiZudWxsIT09bi5yZWxhdGVkQ29udGFjdElkJiYoaS5yZWxhdGVkQ29udGFjdElkPW4ucmVsYXRlZENvbnRhY3RJZCxuLnByZXZpb3VzQ29udGFjdElkJiZkZWxldGUgaS5wcmV2aW91c0NvbnRhY3RJZCksci5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DUkVBVEVfT1VUQk9VTkRfQ09OVEFDVCxpLG4mJntzdWNjZXNzOm4uc3VjY2VzcyxmYWlsdXJlOm4uZmFpbHVyZX0pfSxuLnByb3RvdHlwZS5nZXRBbGxRdWV1ZUFSTnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkucm91dGluZ1Byb2ZpbGUucXVldWVzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUucXVldWVBUk59KSl9LG4ucHJvdG90eXBlLmdldEVuZHBvaW50cz1mdW5jdGlvbihlLG4scil7dmFyIG89dGhpcyxpPXQuY29yZS5nZXRDbGllbnQoKTt0LmFzc2VydE5vdE51bGwobiwiY2FsbGJhY2tzIiksdC5hc3NlcnROb3ROdWxsKG4uc3VjY2VzcywiY2FsbGJhY2tzLnN1Y2Nlc3MiKTt2YXIgcz1yfHx7fTtzLmVuZHBvaW50cz1zLmVuZHBvaW50c3x8W10scy5tYXhSZXN1bHRzPXMubWF4UmVzdWx0c3x8dC5ERUZBVUxUX0JBVENIX1NJWkUsdC5pc0FycmF5KGUpfHwoZT1bZV0pLGkuY2FsbCh0LkNsaWVudE1ldGhvZHMuR0VUX0VORFBPSU5UUyx7cXVldWVBUk5zOmUsbmV4dFRva2VuOnMubmV4dFRva2VufHxudWxsLG1heFJlc3VsdHM6cy5tYXhSZXN1bHRzfSx7c3VjY2VzczpmdW5jdGlvbihyKXtpZihyLm5leHRUb2tlbilvLmdldEVuZHBvaW50cyhlLG4se25leHRUb2tlbjpyLm5leHRUb2tlbixtYXhSZXN1bHRzOnMubWF4UmVzdWx0cyxlbmRwb2ludHM6cy5lbmRwb2ludHMuY29uY2F0KHIuZW5kcG9pbnRzKX0pO2Vsc2V7cy5lbmRwb2ludHM9cy5lbmRwb2ludHMuY29uY2F0KHIuZW5kcG9pbnRzKTt2YXIgaT1zLmVuZHBvaW50cy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdC5FbmRwb2ludChlKX0pKTtuLnN1Y2Nlc3Moe2VuZHBvaW50czppLGFkZHJlc3NlczppfSl9fSxmYWlsdXJlOm4uZmFpbHVyZX0pfSxuLnByb3RvdHlwZS5nZXRBZGRyZXNzZXM9bi5wcm90b3R5cGUuZ2V0RW5kcG9pbnRzLG4ucHJvdG90eXBlLl9nZXRSZXNvdXJjZUlkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRBbGxRdWV1ZUFSTnMoKTtmb3IobGV0IHQgb2YgZSl7Y29uc3QgZT10Lm1hdGNoKC9cL2FnZW50XC8oW14vXSspLyk7aWYoZSlyZXR1cm4gZVsxXX1yZXR1cm4gbmV3IEVycm9yKCJBZ2VudC5wcm90b3R5cGUuX2dldFJlc291cmNlSWQ6IHF1ZXVlQXJucyBkaWQgbm90IGNvbnRhaW4gYWdlbnRSZXNvdXJjZUlkOiAiLGUpfSxuLnByb3RvdHlwZS50b1NuYXBzaG90PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0LkFnZW50U25hcHNob3QodGhpcy5fZ2V0RGF0YSgpKX07dmFyIHI9ZnVuY3Rpb24oZSl7dC5BZ2VudC5jYWxsKHRoaXMpLHRoaXMuYWdlbnREYXRhPWV9OyhyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cixyLnByb3RvdHlwZS5fZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFnZW50RGF0YX0sci5wcm90b3R5cGUuX2NyZWF0ZUNvbnRhY3RBUEk9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB0LkNvbnRhY3RTbmFwc2hvdChlKX07dmFyIG89ZnVuY3Rpb24oZSl7dGhpcy5jb250YWN0SWQ9ZX07by5wcm90b3R5cGUuX2dldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5nZXRDb250YWN0SWQoKSl9LG8ucHJvdG90eXBlLl9jcmVhdGVDb25uZWN0aW9uQVBJPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdldFR5cGUoKT09PXQuQ29udGFjdFR5cGUuQ0hBVD9uZXcgdC5DaGF0Q29ubmVjdGlvbih0aGlzLmNvbnRhY3RJZCxlLmNvbm5lY3Rpb25JZCk6dGhpcy5nZXRUeXBlKCk9PT10LkNvbnRhY3RUeXBlLlRBU0s/bmV3IHQuVGFza0Nvbm5lY3Rpb24odGhpcy5jb250YWN0SWQsZS5jb25uZWN0aW9uSWQpOm5ldyB0LlZvaWNlQ29ubmVjdGlvbih0aGlzLmNvbnRhY3RJZCxlLmNvbm5lY3Rpb25JZCl9LG8ucHJvdG90eXBlLmdldEV2ZW50TmFtZT1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldENvbnRhY3RFdmVudE5hbWUoZSx0aGlzLmdldENvbnRhY3RJZCgpKX0sby5wcm90b3R5cGUub25SZWZyZXNoPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuUkVGUkVTSCksZSl9LG8ucHJvdG90eXBlLm9uSW5jb21pbmc9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5JTkNPTUlORyksZSl9LG8ucHJvdG90eXBlLm9uQ29ubmVjdGluZz1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkNPTk5FQ1RJTkcpLGUpfSxvLnByb3RvdHlwZS5vblBlbmRpbmc9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5QRU5ESU5HKSxlKX0sby5wcm90b3R5cGUub25BY2NlcHRlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkFDQ0VQVEVEKSxlKX0sby5wcm90b3R5cGUub25NaXNzZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5NSVNTRUQpLGUpfSxvLnByb3RvdHlwZS5vbkVuZGVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuRU5ERUQpLGUpfSxvLnByb3RvdHlwZS5vbkRlc3Ryb3k9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5ERVNUUk9ZRUQpLGUpfSxvLnByb3RvdHlwZS5vbkFDVz1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkFDVyksZSl9LG8ucHJvdG90eXBlLm9uQ29ubmVjdGVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuQ09OTkVDVEVEKSxlKX0sby5wcm90b3R5cGUub25FcnJvcj1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkVSUk9SKSxlKX0sby5wcm90b3R5cGUuZ2V0Q29udGFjdElkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFjdElkfSxvLnByb3RvdHlwZS5nZXRPcmlnaW5hbENvbnRhY3RJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuaW5pdGlhbENvbnRhY3RJZH0sby5wcm90b3R5cGUuZ2V0SW5pdGlhbENvbnRhY3RJZD1vLnByb3RvdHlwZS5nZXRPcmlnaW5hbENvbnRhY3RJZCxvLnByb3RvdHlwZS5nZXRUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS50eXBlfSxvLnByb3RvdHlwZS5nZXRDb250YWN0RHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmNvbnRhY3REdXJhdGlvbn0sby5wcm90b3R5cGUuZ2V0U3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnN0YXRlfSxvLnByb3RvdHlwZS5nZXRTdGF0dXM9by5wcm90b3R5cGUuZ2V0U3RhdGUsby5wcm90b3R5cGUuZ2V0U3RhdGVEdXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0Lm5vdygpLXRoaXMuX2dldERhdGEoKS5zdGF0ZS50aW1lc3RhbXAuZ2V0VGltZSgpK3QuY29yZS5nZXRTa2V3KCl9LG8ucHJvdG90eXBlLmdldFN0YXR1c0R1cmF0aW9uPW8ucHJvdG90eXBlLmdldFN0YXRlRHVyYXRpb24sby5wcm90b3R5cGUuZ2V0UXVldWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnF1ZXVlfSxvLnByb3RvdHlwZS5nZXRRdWV1ZVRpbWVzdGFtcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkucXVldWVUaW1lc3RhbXB9LG8ucHJvdG90eXBlLmdldENvbm5lY3Rpb25zPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmNvbm5lY3Rpb25zLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIGUuZ2V0VHlwZSgpPT09dC5Db250YWN0VHlwZS5DSEFUP25ldyB0LkNoYXRDb25uZWN0aW9uKGUuY29udGFjdElkLG4uY29ubmVjdGlvbklkKTplLmdldFR5cGUoKT09PXQuQ29udGFjdFR5cGUuVEFTSz9uZXcgdC5UYXNrQ29ubmVjdGlvbihlLmNvbnRhY3RJZCxuLmNvbm5lY3Rpb25JZCk6bmV3IHQuVm9pY2VDb25uZWN0aW9uKGUuY29udGFjdElkLG4uY29ubmVjdGlvbklkKX0pKX0sby5wcm90b3R5cGUuZ2V0SW5pdGlhbENvbm5lY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdC5maW5kKHRoaXMuZ2V0Q29ubmVjdGlvbnMoKSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXNJbml0aWFsQ29ubmVjdGlvbigpfSkpfHxudWxsfSxvLnByb3RvdHlwZS5nZXRBY3RpdmVJbml0aWFsQ29ubmVjdGlvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0SW5pdGlhbENvbm5lY3Rpb24oKTtyZXR1cm4gbnVsbCE9ZSYmZS5pc0FjdGl2ZSgpP2U6bnVsbH0sby5wcm90b3R5cGUuZ2V0VGhpcmRQYXJ0eUNvbm5lY3Rpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvbnMoKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiFlLmlzSW5pdGlhbENvbm5lY3Rpb24oKSYmZS5nZXRUeXBlKCkhPT10LkNvbm5lY3Rpb25UeXBlLkFHRU5UfSkpfSxvLnByb3RvdHlwZS5nZXRTaW5nbGVBY3RpdmVUaGlyZFBhcnR5Q29ubmVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFRoaXJkUGFydHlDb25uZWN0aW9ucygpLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXNBY3RpdmUoKX0pKVswXXx8bnVsbH0sby5wcm90b3R5cGUuZ2V0QWdlbnRDb25uZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHQuZmluZCh0aGlzLmdldENvbm5lY3Rpb25zKCksKGZ1bmN0aW9uKGUpe3ZhciBuPWUuZ2V0VHlwZSgpO3JldHVybiBuPT09dC5Db25uZWN0aW9uVHlwZS5BR0VOVHx8bj09PXQuQ29ubmVjdGlvblR5cGUuTU9OSVRPUklOR30pKX0sby5wcm90b3R5cGUuZ2V0QWN0aXZlQ29ubmVjdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25uZWN0aW9ucygpLmZpbHRlcigoZT0+ZS5pc0FjdGl2ZSgpKSl9LG8ucHJvdG90eXBlLmhhc1R3b0FjdGl2ZVBhcnRpY2lwYW50cz1mdW5jdGlvbigpe3JldHVybiAyPT09dGhpcy5nZXRBY3RpdmVDb25uZWN0aW9ucygpLmxlbmd0aH0sby5wcm90b3R5cGUuZ2V0TmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkubmFtZX0sby5wcm90b3R5cGUuZ2V0Q29udGFjdE1ldGFkYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jb250YWN0TWV0YWRhdGF9LG8ucHJvdG90eXBlLmdldERlc2NyaXB0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5kZXNjcmlwdGlvbn0sby5wcm90b3R5cGUuZ2V0UmVmZXJlbmNlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkucmVmZXJlbmNlc30sby5wcm90b3R5cGUuZ2V0QXR0cmlidXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuYXR0cmlidXRlc30sby5wcm90b3R5cGUuZ2V0Q29udGFjdEZlYXR1cmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jb250YWN0RmVhdHVyZXN9LG8ucHJvdG90eXBlLmdldENoYW5uZWxDb250ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jaGFubmVsQ29udGV4dH0sby5wcm90b3R5cGUuZ2V0U2VnbWVudEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnNlZ21lbnRBdHRyaWJ1dGVzfSxvLnByb3RvdHlwZS5nZXRDb250YWN0U3VidHlwZT1mdW5jdGlvbigpe2NvbnN0IGU9dGhpcy5nZXRTZWdtZW50QXR0cmlidXRlcygpO3JldHVybiBlJiZlWyJjb25uZWN0OlN1YnR5cGUiXT9lWyJjb25uZWN0OlN1YnR5cGUiXS5WYWx1ZVN0cmluZzpudWxsfSxvLnByb3RvdHlwZS5pc1NvZnRwaG9uZUNhbGw9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9dC5maW5kKHRoaXMuZ2V0Q29ubmVjdGlvbnMoKSwoZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUuZ2V0U29mdHBob25lTWVkaWFJbmZvKCl9KSl9LG8ucHJvdG90eXBlLmhhc1ZpZGVvUlRDQ2FwYWJpbGl0aWVzPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXQuZmluZCh0aGlzLmdldENvbm5lY3Rpb25zKCksKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNhblNlbmRWaWRlbyYmZS5jYW5TZW5kVmlkZW8oKX0pKX0sby5wcm90b3R5cGUuY2FuQWdlbnRTZW5kVmlkZW89ZnVuY3Rpb24oKXtjb25zdCBlPXRoaXMuZ2V0QWdlbnRDb25uZWN0aW9uKCk7cmV0dXJuIGUuY2FuU2VuZFZpZGVvJiZlLmNhblNlbmRWaWRlbygpfSxvLnByb3RvdHlwZS5jYW5BZ2VudFJlY2VpdmVWaWRlbz1mdW5jdGlvbigpe2NvbnN0IGU9dGhpcy5nZXRJbml0aWFsQ29ubmVjdGlvbigpO2lmKGUuY2FuU2VuZFZpZGVvJiZlLmNhblNlbmRWaWRlbygpKXJldHVybiEwO2NvbnN0IHQ9dGhpcy5nZXRUaGlyZFBhcnR5Q29ubmVjdGlvbnMoKTtyZXR1cm4gdCYmdC5sZW5ndGg+MCYmdGhpcy5jYW5BZ2VudFNlbmRWaWRlbygpfSxvLnByb3RvdHlwZS5faXNJbmJvdW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5pbml0aWF0aW9uTWV0aG9kIT09dC5Db250YWN0SW5pdGlhdGlvbk1ldGhvZC5PVVRCT1VORH0sby5wcm90b3R5cGUuaXNJbmJvdW5kPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRJbml0aWFsQ29ubmVjdGlvbigpO3JldHVybiBlLmdldE1lZGlhVHlwZSgpPT09dC5NZWRpYVR5cGUuVEFTSz90aGlzLl9pc0luYm91bmQoKTohIWUmJmUuZ2V0VHlwZSgpPT09dC5Db25uZWN0aW9uVHlwZS5JTkJPVU5EfSxvLnByb3RvdHlwZS5pc0Nvbm5lY3RlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0ZVR5cGUuQ09OTkVDVEVEfSxvLnByb3RvdHlwZS5hY2NlcHQ9ZnVuY3Rpb24oZSl7dmFyIG49dC5jb3JlLmdldENsaWVudCgpLHI9dGhpcyxvPXRoaXMuZ2V0Q29udGFjdElkKCk7dC5wdWJsaXNoQ2xpY2tTdHJlYW1EYXRhKHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjbGlja1R5cGU6dC5DbGlja1R5cGUuQUNDRVBULGNsaWNrVGltZToobmV3IERhdGUpLnRvSVNPU3RyaW5nKCl9KSxuLmNhbGwodC5DbGllbnRNZXRob2RzLkFDQ0VQVF9DT05UQUNULHtjb250YWN0SWQ6b30se3N1Y2Nlc3M6ZnVuY3Rpb24obil7dmFyIGk9dC5jb3JlLmdldFVwc3RyZWFtKCk7aS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbnRhY3RFdmVudHMuQUNDRVBURUQsZGF0YTpuZXcgdC5Db250YWN0KG8pfSksaS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LmNvcmUuZ2V0Q29udGFjdEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuQUNDRVBURUQsci5nZXRDb250YWN0SWQoKSksZGF0YTpuZXcgdC5Db250YWN0KG8pfSk7dmFyIHM9bmV3IHQuQ29udGFjdChvKTt0LmlzRmlyZWZveEJyb3dzZXIoKSYmcy5pc1NvZnRwaG9uZUNhbGwoKSYmdC5jb3JlLnRyaWdnZXJSZWFkeVRvU3RhcnRTZXNzaW9uRXZlbnQoKSxlJiZlLnN1Y2Nlc3MmJmUuc3VjY2VzcyhuKX0sZmFpbHVyZTpmdW5jdGlvbihuLHIpe3QuZ2V0TG9nKCkuZXJyb3IoIkFjY2VwdCBDb250YWN0IGZhaWxlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aEV4Y2VwdGlvbihuKS53aXRoT2JqZWN0KHtkYXRhOnJ9KSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6IkNvbnRhY3RBY2NlcHRGYWlsdXJlIixkYXRhOntjb3VudDoxfX0pLGUmJmUuZmFpbHVyZSYmZS5mYWlsdXJlKHQuQ29udGFjdFN0YXRlVHlwZS5FUlJPUil9fSl9LG8ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0LmdldExvZygpLndhcm4oImNvbnRhY3QuZGVzdHJveSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9LG8ucHJvdG90eXBlLnJlamVjdD1mdW5jdGlvbihlKXt2YXIgbj10LmNvcmUuZ2V0Q2xpZW50KCk7dC5wdWJsaXNoQ2xpY2tTdHJlYW1EYXRhKHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjbGlja1R5cGU6dC5DbGlja1R5cGUuUkVKRUNULGNsaWNrVGltZToobmV3IERhdGUpLnRvSVNPU3RyaW5nKCl9KSxuLmNhbGwodC5DbGllbnRNZXRob2RzLlJFSkVDVF9DT05UQUNULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKX0sZSl9LG8ucHJvdG90eXBlLmNvbXBsZXRlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DT01QTEVURV9DT05UQUNULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKX0sZSl9LG8ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DTEVBUl9DT05UQUNULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKX0sZSl9LG8ucHJvdG90eXBlLm5vdGlmeUlzc3VlPWZ1bmN0aW9uKGUsbixyKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuTk9USUZZX0NPTlRBQ1RfSVNTVUUse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGlzc3VlQ29kZTplLGRlc2NyaXB0aW9uOm59LHIpfSxvLnByb3RvdHlwZS5hZGRDb25uZWN0aW9uPWZ1bmN0aW9uKGUsbil7dmFyIHI9dC5jb3JlLmdldENsaWVudCgpLG89bmV3IHQuRW5kcG9pbnQoZSk7ZGVsZXRlIG8uZW5kcG9pbnRJZCxyLmNhbGwodC5DbGllbnRNZXRob2RzLkNSRUFURV9BRERJVElPTkFMX0NPTk5FQ1RJT04se2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGVuZHBvaW50Om99LG4pfSxvLnByb3RvdHlwZS50b2dnbGVBY3RpdmVDb25uZWN0aW9ucz1mdW5jdGlvbihlKXt2YXIgbj10LmNvcmUuZ2V0Q2xpZW50KCkscj1udWxsLG89dC5maW5kKHRoaXMuZ2V0Q29ubmVjdGlvbnMoKSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0U3RhdHVzKCkudHlwZT09PXQuQ29ubmVjdGlvblN0YXRlVHlwZS5IT0xEfSkpO2lmKG51bGwhPW8pcj1vLmdldENvbm5lY3Rpb25JZCgpO2Vsc2V7dmFyIGk9dGhpcy5nZXRDb25uZWN0aW9ucygpLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXNBY3RpdmUoKX0pKTtpLmxlbmd0aD4wJiYocj1pWzBdLmdldENvbm5lY3Rpb25JZCgpKX1uLmNhbGwodC5DbGllbnRNZXRob2RzLlRPR0dMRV9BQ1RJVkVfQ09OTkVDVElPTlMse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNvbm5lY3Rpb25JZDpyfSxlKX0sby5wcm90b3R5cGUuc2VuZFNvZnRwaG9uZU1ldHJpY3M9ZnVuY3Rpb24obixyKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuU0VORF9TT0ZUUEhPTkVfQ0FMTF9NRVRSSUNTLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjY3BWZXJzaW9uOmUuY2NwVmVyc2lvbixzb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzOm59LHIpLHQucHVibGlzaFNvZnRwaG9uZVN0YXRzKHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjY3BWZXJzaW9uOmUuY2NwVmVyc2lvbixzdGF0czpufSl9LG8ucHJvdG90eXBlLnNlbmRTb2Z0cGhvbmVSZXBvcnQ9ZnVuY3Rpb24obixyKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuU0VORF9TT0ZUUEhPTkVfQ0FMTF9SRVBPUlQse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNjcFZlcnNpb246ZS5jY3BWZXJzaW9uLHJlcG9ydDpufSxyKX0sby5wcm90b3R5cGUuY29uZmVyZW5jZUNvbm5lY3Rpb25zPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DT05GRVJFTkNFX0NPTk5FQ1RJT05TLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKX0sZSl9LG8ucHJvdG90eXBlLnRvU25hcHNob3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQuQ29udGFjdFNuYXBzaG90KHRoaXMuX2dldERhdGEoKSl9LG8ucHJvdG90eXBlLmlzTXVsdGlQYXJ0eUNvbmZlcmVuY2VFbmFibGVkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRDb250YWN0RmVhdHVyZXMoKTtyZXR1cm4hKCFlfHwhZS5tdWx0aVBhcnR5Q29uZmVyZW5jZUVuYWJsZWQpfSxvLnByb3RvdHlwZS51cGRhdGVNb25pdG9yUGFydGljaXBhbnRTdGF0ZT1mdW5jdGlvbihlLG4pe2UmJk9iamVjdC52YWx1ZXModC5Nb25pdG9yaW5nTW9kZSkuaW5jbHVkZXMoZS50b1VwcGVyQ2FzZSgpKT90LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuVVBEQVRFX01PTklUT1JfUEFSVElDSVBBTlRfU1RBVEUse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLHRhcmdldE1vbml0b3JNb2RlOmUudG9VcHBlckNhc2UoKX0sbik6KHQuZ2V0TG9nKCkuZXJyb3IoYEludmFsaWQgdGFyZ2V0IHN0YXRlIHdhcyBwcm92aWRlZDogJHtlfWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbiYmbi5mYWlsdXJlJiZuLmZhaWx1cmUodC5Nb25pdG9yaW5nRXJyb3JUeXBlcy5JTlZBTElEX1RBUkdFVF9TVEFURSkpfSxvLnByb3RvdHlwZS5pc1VuZGVyU3VwZXJ2aXNpb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldENvbm5lY3Rpb25zKCkuZmlsdGVyKChlPT5lLmdldFR5cGUoKSE9PXQuQ29ubmVjdGlvblR5cGUuQUdFTlQpKTtyZXR1cm4gdm9pZCAwIT09KGUmJmUuZmluZCgoZT0+ZS5pc0JhcmdlKCkmJmUuaXNBY3RpdmUoKSkpKX0sby5wcm90b3R5cGUuc2lsZW50TW9uaXRvcj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy51cGRhdGVNb25pdG9yUGFydGljaXBhbnRTdGF0ZSh0Lk1vbml0b3JpbmdNb2RlLlNJTEVOVF9NT05JVE9SLGUpfSxvLnByb3RvdHlwZS5iYXJnZUluPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnVwZGF0ZU1vbml0b3JQYXJ0aWNpcGFudFN0YXRlKHQuTW9uaXRvcmluZ01vZGUuQkFSR0UsZSl9LG8ucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5QQVVTRV9DT05UQUNULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKX0sZSl9LG8ucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuUkVTVU1FX0NPTlRBQ1Qse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpfSxlKX07dmFyIGk9ZnVuY3Rpb24oZSl7dC5Db250YWN0LmNhbGwodGhpcyxlLmNvbnRhY3RJZCksdGhpcy5jb250YWN0RGF0YT1lfTsoaS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWksaS5wcm90b3R5cGUuX2dldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250YWN0RGF0YX0saS5wcm90b3R5cGUuX2NyZWF0ZUNvbm5lY3Rpb25BUEk9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB0LkNvbm5lY3Rpb25TbmFwc2hvdChlKX07dmFyIHM9ZnVuY3Rpb24oZSx0KXt0aGlzLmNvbnRhY3RJZD1lLHRoaXMuY29ubmVjdGlvbklkPXQsdGhpcy5faW5pdE1lZGlhQ29udHJvbGxlcigpfTtzLnByb3RvdHlwZS5fZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb25uZWN0aW9uRGF0YSh0aGlzLmdldENvbnRhY3RJZCgpLHRoaXMuZ2V0Q29ubmVjdGlvbklkKCkpfSxzLnByb3RvdHlwZS5nZXRDb250YWN0SWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250YWN0SWR9LHMucHJvdG90eXBlLmdldENvbm5lY3Rpb25JZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25JZH0scy5wcm90b3R5cGUuZ2V0RW5kcG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQuRW5kcG9pbnQodGhpcy5fZ2V0RGF0YSgpLmVuZHBvaW50KX0scy5wcm90b3R5cGUuZ2V0QWRkcmVzcz1zLnByb3RvdHlwZS5nZXRFbmRwb2ludCxzLnByb3RvdHlwZS5nZXRTdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuc3RhdGV9LHMucHJvdG90eXBlLmdldFN0YXR1cz1zLnByb3RvdHlwZS5nZXRTdGF0ZSxzLnByb3RvdHlwZS5nZXRTdGF0ZUR1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHQubm93KCktdGhpcy5fZ2V0RGF0YSgpLnN0YXRlLnRpbWVzdGFtcC5nZXRUaW1lKCkrdC5jb3JlLmdldFNrZXcoKX0scy5wcm90b3R5cGUuZ2V0U3RhdHVzRHVyYXRpb249cy5wcm90b3R5cGUuZ2V0U3RhdGVEdXJhdGlvbixzLnByb3RvdHlwZS5nZXRUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS50eXBlfSxzLnByb3RvdHlwZS5pc0luaXRpYWxDb25uZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5pbml0aWFsfSxzLnByb3RvdHlwZS5pc0FjdGl2ZT1mdW5jdGlvbigpe3JldHVybiB0LmNvbnRhaW5zKHQuQ09OTkVDVElPTl9BQ1RJVkVfU1RBVEVTLHRoaXMuZ2V0U3RhdHVzKCkudHlwZSl9LHMucHJvdG90eXBlLmlzQ29ubmVjdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29udGFpbnModC5DT05ORUNUSU9OX0NPTk5FQ1RFRF9TVEFURVMsdGhpcy5nZXRTdGF0dXMoKS50eXBlKX0scy5wcm90b3R5cGUuaXNDb25uZWN0aW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0U3RhdHVzKCkudHlwZT09PXQuQ29ubmVjdGlvblN0YXRlVHlwZS5DT05ORUNUSU5HfSxzLnByb3RvdHlwZS5pc09uSG9sZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbm5lY3Rpb25TdGF0ZVR5cGUuSE9MRH0scy5wcm90b3R5cGUuZ2V0U29mdHBob25lTWVkaWFJbmZvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zb2Z0cGhvbmVNZWRpYUluZm99LHMucHJvdG90eXBlLmdldE1vbml0b3JJbmZvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5tb25pdG9yaW5nSW5mb30scy5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbihlKXt0LnB1Ymxpc2hDbGlja1N0cmVhbURhdGEoe2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNsaWNrVHlwZTp0LkNsaWNrVHlwZS5IQU5HVVAsY2xpY2tUaW1lOihuZXcgRGF0ZSkudG9JU09TdHJpbmcoKX0pLHQuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5ERVNUUk9ZX0NPTk5FQ1RJT04se2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNvbm5lY3Rpb25JZDp0aGlzLmdldENvbm5lY3Rpb25JZCgpfSxlKX0scy5wcm90b3R5cGUuc2VuZERpZ2l0cz1mdW5jdGlvbihlLG4pe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5TRU5EX0RJR0lUUyx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY29ubmVjdGlvbklkOnRoaXMuZ2V0Q29ubmVjdGlvbklkKCksZGlnaXRzOmV9LG4pfSxzLnByb3RvdHlwZS5ob2xkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5IT0xEX0NPTk5FQ1RJT04se2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNvbm5lY3Rpb25JZDp0aGlzLmdldENvbm5lY3Rpb25JZCgpfSxlKX0scy5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5SRVNVTUVfQ09OTkVDVElPTix7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY29ubmVjdGlvbklkOnRoaXMuZ2V0Q29ubmVjdGlvbklkKCl9LGUpfSxzLnByb3RvdHlwZS50b1NuYXBzaG90PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0LkNvbm5lY3Rpb25TbmFwc2hvdCh0aGlzLl9nZXREYXRhKCkpfSxzLnByb3RvdHlwZS5faW5pdE1lZGlhQ29udHJvbGxlcj1mdW5jdGlvbigpe3RoaXMuZ2V0TWVkaWFJbmZvKCkmJnQuY29yZS5tZWRpYUZhY3RvcnkuZ2V0KHRoaXMpLmNhdGNoKChmdW5jdGlvbigpe30pKX0scy5wcm90b3R5cGUuX2lzQWdlbnRDb25uZWN0aW9uVHlwZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0VHlwZSgpO3JldHVybiBlPT09dC5Db25uZWN0aW9uVHlwZS5BR0VOVHx8ZT09PXQuQ29ubmVjdGlvblR5cGUuTU9OSVRPUklOR30scy5wcm90b3R5cGUuX2lzQWdlbnRDb25uZWN0aW9uVHlwZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0VHlwZSgpO3JldHVybiBlPT09dC5Db25uZWN0aW9uVHlwZS5BR0VOVHx8ZT09PXQuQ29ubmVjdGlvblR5cGUuTU9OSVRPUklOR307dmFyIGE9ZnVuY3Rpb24oZSl7dGhpcy5jb250YWN0SWQ9ZX07YS5wcm90b3R5cGUuZ2V0U3BlYWtlcklkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLmNoZWNrQ29uZmVyZW5jZUNhbGwoKTt2YXIgbj10LmNvcmUuZ2V0Q2xpZW50KCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe2NvbnN0IGk9e2NvbnRhY3RJZDplLmNvbnRhY3RJZCxpbnN0YW5jZUlkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEluc3RhbmNlSWQoKSxhd3NBY2NvdW50SWQ6dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0QVdTQWNjb3VudElkKCl9O3QuZ2V0TG9nKCkuaW5mbygiZ2V0U3BlYWtlcklkIGNhbGxlZCIpLndpdGhPYmplY3QoaSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuR0VUX0NPTlRBQ1QsaSx7c3VjY2VzczpmdW5jdGlvbihlKXtpZihlLmNvbnRhY3REYXRhLmN1c3RvbWVySWQpe3ZhciBuPXtzcGVha2VySWQ6ZS5jb250YWN0RGF0YS5jdXN0b21lcklkfTt0LmdldExvZygpLmluZm8oImdldFNwZWFrZXJJZCBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihuKX1lbHNle3ZhciBpPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuTk9fU1BFQUtFUl9JRF9GT1VORCwiTm8gc3BlYWtlcklkIGFzc290aWF0ZWQgd2l0aCB0aGlzIGNhbGwiKTtvKGkpfX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJHZXQgU3BlYWtlcklkIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkdFVF9TUEVBS0VSX0lEX0ZBSUxFRCwiR2V0IFNwZWFrZXJJZCBmYWlsZWQiLGUpO28obil9fSl9KSl9LGEucHJvdG90eXBlLmdldFNwZWFrZXJTdGF0dXM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuY2hlY2tDb25mZXJlbmNlQ2FsbCgpO3ZhciBuPXQuY29yZS5nZXRDbGllbnQoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7ZS5nZXRTcGVha2VySWQoKS50aGVuKChmdW5jdGlvbihpKXtlLmdldERvbWFpbklkKCkudGhlbigoZnVuY3Rpb24oZSl7Y29uc3Qgcz17U3BlYWtlcklkOnQuYXNzZXJ0Tm90TnVsbChpLnNwZWFrZXJJZCwic3BlYWtlcklkIiksRG9tYWluSWQ6ZX07dC5nZXRMb2coKS5pbmZvKCJnZXRTcGVha2VyU3RhdHVzIGNhbGxlZCIpLndpdGhPYmplY3Qocykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuREVTQ1JJQkVfU1BFQUtFUixzLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiZ2V0U3BlYWtlclN0YXR1cyBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihlKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt2YXIgbj1KU09OLnBhcnNlKGUpO3N3aXRjaChuLnN0YXR1cyl7Y2FzZSA0MDA6Y2FzZSA0MDQ6dmFyIGk9bjtpLnR5cGU9aS50eXBlP2kudHlwZTp0LlZvaWNlSWRFcnJvclR5cGVzLlNQRUFLRVJfSURfTk9UX0VOUk9MTEVELHQuZ2V0TG9nKCkuaW5mbygiU3BlYWtlciBpcyBub3QgZW5yb2xsZWQuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyKGkpO2JyZWFrO2RlZmF1bHQ6dC5nZXRMb2coKS5lcnJvcigiZ2V0U3BlYWtlclN0YXR1cyBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIHM9dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5HRVRfU1BFQUtFUl9TVEFUVVNfRkFJTEVELCJHZXQgU3BlYWtlclN0YXR1cyBmYWlsZWQiLGUpO28ocyl9fX0pfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpfSxhLnByb3RvdHlwZS5fb3B0T3V0U3BlYWtlckluTGNtcz1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXMsbz10LmNvcmUuZ2V0Q2xpZW50KCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihpLHMpe2NvbnN0IGE9e0NvbnRhY3RJZDpyLmNvbnRhY3RJZCxJbnN0YW5jZUlkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEluc3RhbmNlSWQoKSxBV1NBY2NvdW50SWQ6dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0QVdTQWNjb3VudElkKCksQ3VzdG9tZXJJZDp0LmFzc2VydE5vdE51bGwoZSwic3BlYWtlcklkIiksVm9pY2VJZFJlc3VsdDp7U3BlYWtlck9wdGVkT3V0OiEwLGdlbmVyYXRlZFNwZWFrZXJJZDpufX07dC5nZXRMb2coKS5pbmZvKCJfb3B0T3V0U3BlYWtlckluTGNtcyBjYWxsZWQiKS53aXRoT2JqZWN0KGEpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksby5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLlVQREFURV9WT0lDRV9JRF9EQVRBLGEse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJvcHRPdXRTcGVha2VySW5MY21zIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIm9wdE91dFNwZWFrZXJJbkxjbXMgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuT1BUX09VVF9TUEVBS0VSX0lOX0xDTVNfRkFJTEVELCJvcHRPdXRTcGVha2VySW5MY21zIGZhaWxlZCIsZSk7cyhuKX19KX0pKX0sYS5wcm90b3R5cGUub3B0T3V0U3BlYWtlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5jaGVja0NvbmZlcmVuY2VDYWxsKCk7dmFyIG49dC5jb3JlLmdldENsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixvKXtlLmdldFNwZWFrZXJJZCgpLnRoZW4oKGZ1bmN0aW9uKGkpe2UuZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihzKXt2YXIgYT1pLnNwZWFrZXJJZDtjb25zdCBjPXtTcGVha2VySWQ6dC5hc3NlcnROb3ROdWxsKGEsInNwZWFrZXJJZCIpLERvbWFpbklkOnN9O3QuZ2V0TG9nKCkuaW5mbygib3B0T3V0U3BlYWtlciBjYWxsZWQiKS53aXRoT2JqZWN0KGMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLk9QVF9PVVRfU1BFQUtFUixjLHtzdWNjZXNzOmZ1bmN0aW9uKG4pe2UuX29wdE91dFNwZWFrZXJJbkxjbXMoYSxuLmdlbmVyYXRlZFNwZWFrZXJJZCkuY2F0Y2goKGZ1bmN0aW9uKCl7fSkpLHQuZ2V0TG9nKCkuaW5mbygib3B0T3V0U3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KG4pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihuKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJvcHRPdXRTcGVha2VyIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLk9QVF9PVVRfU1BFQUtFUl9GQUlMRUQsIm9wdE91dFNwZWFrZXIgZmFpbGVkLiIsZSk7byhuKX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKX0sYS5wcm90b3R5cGUuZGVsZXRlU3BlYWtlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5jaGVja0NvbmZlcmVuY2VDYWxsKCk7dmFyIG49dC5jb3JlLmdldENsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixvKXtlLmdldFNwZWFrZXJJZCgpLnRoZW4oKGZ1bmN0aW9uKGkpe2UuZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihlKXtjb25zdCBzPXtTcGVha2VySWQ6dC5hc3NlcnROb3ROdWxsKGkuc3BlYWtlcklkLCJzcGVha2VySWQiKSxEb21haW5JZDplfTt0LmdldExvZygpLmluZm8oImRlbGV0ZVNwZWFrZXIgY2FsbGVkIikud2l0aE9iamVjdChzKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5ERUxFVEVfU1BFQUtFUixzLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiZGVsZXRlU3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihlKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJkZWxldGVTcGVha2VyIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkRFTEVURV9TUEVBS0VSX0ZBSUxFRCwiZGVsZXRlU3BlYWtlciBmYWlsZWQuIixlKTtvKG4pfX0pfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpfSxhLnByb3RvdHlwZS5zdGFydFNlc3Npb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuY2hlY2tDb25mZXJlbmNlQ2FsbCgpO3ZhciBuPXQuY29yZS5nZXRDbGllbnQoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7ZS5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGkpe2NvbnN0IHM9e2NvbnRhY3RJZDplLmNvbnRhY3RJZCxpbnN0YW5jZUlkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEluc3RhbmNlSWQoKSxjdXN0b21lckFjY291bnRJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRBV1NBY2NvdW50SWQoKSxjbGllbnRUb2tlbjpBV1MudXRpbC51dWlkLnY0KCksZG9tYWluSWQ6aX07dC5nZXRMb2coKS5pbmZvKCJzdGFydFNlc3Npb24gY2FsbGVkIikud2l0aE9iamVjdChzKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5TVEFSVF9WT0lDRV9JRF9TRVNTSU9OLHMse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7aWYoZS5zZXNzaW9uSWQpcihlKTtlbHNle3QuZ2V0TG9nKCkuZXJyb3IoInN0YXJ0Vm9pY2VJZFNlc3Npb24gZmFpbGVkLCBubyBzZXNzaW9uIGlkIHJldHVybmVkIikud2l0aE9iamVjdCh7ZGF0YTplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLlNUQVJUX1NFU1NJT05fRkFJTEVELCJObyBzZXNzaW9uIGlkIHJldHVybmVkIGZyb20gc3RhcnQgc2Vzc2lvbiBhcGkiKTtvKG4pfX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJzdGFydFZvaWNlSWRTZXNzaW9uIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLlNUQVJUX1NFU1NJT05fRkFJTEVELCJzdGFydFZvaWNlSWRTZXNzaW9uIGZhaWxlZCIsZSk7byhuKX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKX0sYS5wcm90b3R5cGUuZXZhbHVhdGVTcGVha2VyPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7bi5jaGVja0NvbmZlcmVuY2VDYWxsKCk7dmFyIHI9dC5jb3JlLmdldENsaWVudCgpLG89dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5jb250YWN0SWQpLGk9MDtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHMsYSl7ZnVuY3Rpb24gYygpe24uZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihlKXtjb25zdCB1PXtTZXNzaW9uTmFtZU9ySWQ6by5pbml0aWFsQ29udGFjdElkfHx0aGlzLmNvbnRhY3RJZCxEb21haW5JZDplfTt0LmdldExvZygpLmluZm8oImV2YWx1YXRlU3BlYWtlciBjYWxsZWQiKS53aXRoT2JqZWN0KHUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLkVWQUxVQVRFX1NFU1NJT04sdSx7c3VjY2VzczpmdW5jdGlvbihlKXtpZigrK2k8dC5Wb2ljZUlkQ29uc3RhbnRzLkVWQUxVQVRJT05fTUFYX1BPTExfVElNRVMpaWYoZS5TdHJlYW1pbmdTdGF0dXM9PT10LlZvaWNlSWRTdHJlYW1pbmdTdGF0dXMuUEVORElOR19DT05GSUdVUkFUSU9OKXNldFRpbWVvdXQoYyx0LlZvaWNlSWRDb25zdGFudHMuRVZBTFVBVElPTl9QT0xMSU5HX0lOVEVSVkFMKTtlbHNle2lmKGUuQXV0aGVudGljYXRpb25SZXN1bHR8fChlLkF1dGhlbnRpY2F0aW9uUmVzdWx0PXt9LGUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uTk9UX0VOQUJMRUQpLGUuRnJhdWREZXRlY3Rpb25SZXN1bHR8fChlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0PXt9LGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uTk9UX0VOQUJMRUQpLCFuLmlzQXV0aEVuYWJsZWQoZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbikmJiFuLmlzRnJhdWRFbmFibGVkKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb24pKXJldHVybiB0LmdldExvZygpLmluZm8oImV2YWx1YXRlU3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdm9pZCBzKGUpO2lmKGUuU3RyZWFtaW5nU3RhdHVzPT09dC5Wb2ljZUlkU3RyZWFtaW5nU3RhdHVzLkVOREVEJiYobi5pc0F1dGhSZXN1bHROb3RFbm91Z2hTcGVlY2goZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbikmJihlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLklOQ09OQ0xVU0lWRSksbi5pc0ZyYXVkUmVzdWx0Tm90RW5vdWdoU3BlZWNoKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb24pJiYoZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93RnJhdWREZXRlY3Rpb25EZWNpc2lvbi5JTkNPTkNMVVNJVkUpKSxuLmlzQXV0aFJlc3VsdEluY29uY2x1c2l2ZShlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uKSYmbi5pc0ZyYXVkUmVzdWx0SW5jb25jbHVzaXZlKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb24pKXJldHVybiB0LmdldExvZygpLmluZm8oImV2YWx1YXRlU3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdm9pZCBzKGUpO2lmKCFuLmlzQXV0aFJlc3VsdE5vdEVub3VnaFNwZWVjaChlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uKSYmbi5pc0F1dGhFbmFibGVkKGUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb24pKXN3aXRjaChlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uKXtjYXNlIHQuVm9pY2VJZEF1dGhlbnRpY2F0aW9uRGVjaXNpb24uQUNDRVBUOmUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uQVVUSEVOVElDQVRFRDticmVhaztjYXNlIHQuVm9pY2VJZEF1dGhlbnRpY2F0aW9uRGVjaXNpb24uUkVKRUNUOmUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uTk9UX0FVVEhFTlRJQ0FURUQ7YnJlYWs7Y2FzZSB0LlZvaWNlSWRBdXRoZW50aWNhdGlvbkRlY2lzaW9uLlNQRUFLRVJfT1BURURfT1VUOmUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uT1BURURfT1VUO2JyZWFrO2Nhc2UgdC5Wb2ljZUlkQXV0aGVudGljYXRpb25EZWNpc2lvbi5TUEVBS0VSX05PVF9FTlJPTExFRDplLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLk5PVF9FTlJPTExFRDticmVhaztkZWZhdWx0OmUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uRVJST1J9aWYoIW4uaXNGcmF1ZFJlc3VsdE5vdEVub3VnaFNwZWVjaChlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uKSYmbi5pc0ZyYXVkRW5hYmxlZChlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uKSlzd2l0Y2goZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbil7Y2FzZSB0LlZvaWNlSWRGcmF1ZERldGVjdGlvbkRlY2lzaW9uLkhJR0hfUklTSzplLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uLkhJR0hfUklTSzticmVhaztjYXNlIHQuVm9pY2VJZEZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uTE9XX1JJU0s6ZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93RnJhdWREZXRlY3Rpb25EZWNpc2lvbi5MT1dfUklTSzticmVhaztkZWZhdWx0OmUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uRVJST1J9aWYoIW4uaXNBdXRoUmVzdWx0Tm90RW5vdWdoU3BlZWNoKGUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb24pJiYhbi5pc0ZyYXVkUmVzdWx0Tm90RW5vdWdoU3BlZWNoKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb24pKXJldHVybiB0LmdldExvZygpLmluZm8oImV2YWx1YXRlU3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdm9pZCBzKGUpO3NldFRpbWVvdXQoYyx0LlZvaWNlSWRDb25zdGFudHMuRVZBTFVBVElPTl9QT0xMSU5HX0lOVEVSVkFMKX1lbHNle3QuZ2V0TG9nKCkuZXJyb3IoImV2YWx1YXRlU3BlYWtlciB0aW1lb3V0Iikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgcj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkVWQUxVQVRFX1NQRUFLRVJfVElNRU9VVCwiZXZhbHVhdGVTcGVha2VyIHRpbWVvdXQiKTthKHIpfX0sZmFpbHVyZTpmdW5jdGlvbihlKXt2YXIgbjtzd2l0Y2goSlNPTi5wYXJzZShlKS5zdGF0dXMpe2Nhc2UgNDAwOmNhc2UgNDA0Om49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5TRVNTSU9OX05PVF9FWElTVFMsImV2YWx1YXRlU3BlYWtlciBmYWlsZWQsIHNlc3Npb24gbm90IGV4aXN0cyIsZSksdC5nZXRMb2coKS5lcnJvcigiZXZhbHVhdGVTcGVha2VyIGZhaWxlZCwgc2Vzc2lvbiBub3QgZXhpc3RzIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO2JyZWFrO2RlZmF1bHQ6bj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkVWQUxVQVRFX1NQRUFLRVJfRkFJTEVELCJldmFsdWF0ZVNwZWFrZXIgZmFpbGVkIixlKSx0LmdldExvZygpLmVycm9yKCJldmFsdWF0ZVNwZWFrZXIgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWEobil9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe2EoZSl9KSl9ZT9uLnN0YXJ0U2Vzc2lvbigpLnRoZW4oKGZ1bmN0aW9uKGUpe24uc3luY1NwZWFrZXJJZCgpLnRoZW4oKGZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoYyx0LlZvaWNlSWRDb25zdGFudHMuRVZBTFVBVEVfU0VTU0lPTl9ERUxBWSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoInN5bmNTcGVha2VySWQgZmFpbGVkIHdoZW4gc2Vzc2lvbiBzdGFydE5ldz10cnVlIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGEoZSl9KSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoInN0YXJ0U2Vzc2lvbiBmYWlsZWQgd2hlbiBzZXNzaW9uIHN0YXJ0TmV3PXRydWUiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksYShlKX0pKTpuLnN5bmNTcGVha2VySWQoKS50aGVuKChmdW5jdGlvbigpe2MoKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigic3luY1NwZWFrZXJJZCBmYWlsZWQgd2hlbiBzZXNzaW9uIHN0YXJ0TmV3PWZhbHNlIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGEoZSl9KSl9KSl9LGEucHJvdG90eXBlLmRlc2NyaWJlU2Vzc2lvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMsbj10LmNvcmUuZ2V0Q2xpZW50KCkscj10LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb250YWN0RGF0YSh0aGlzLmNvbnRhY3RJZCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGkpe2UuZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihlKXtjb25zdCBzPXtTZXNzaW9uTmFtZU9ySWQ6ci5pbml0aWFsQ29udGFjdElkfHx0aGlzLmNvbnRhY3RJZCxEb21haW5JZDplfTt0LmdldExvZygpLmluZm8oImRlc2NyaWJlU2Vzc2lvbiBjYWxsZWQiKS53aXRoT2JqZWN0KHMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLkRFU0NSSUJFX1NFU1NJT04scyx7c3VjY2VzczpmdW5jdGlvbihlKXtvKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoImRlc2NyaWJlU2Vzc2lvbiBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5ERVNDUklCRV9TRVNTSU9OX0ZBSUxFRCwiZGVzY3JpYmVTZXNzaW9uIGZhaWxlZCIsZSk7aShuKX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7aShlKX0pKX0pKX0sYS5wcm90b3R5cGUuY2hlY2tFbnJvbGxtZW50U3RhdHVzPWZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiY2hlY2tFbnJvbGxtZW50U3RhdHVzIGNhbGxlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dGhpcyxyPTAsbz0hMTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGkscyl7IWZ1bmN0aW9uIGEoKXtpZigrK3I8dC5Wb2ljZUlkQ29uc3RhbnRzLkVOUk9MTE1FTlRfTUFYX1BPTExfVElNRVMpbi5kZXNjcmliZVNlc3Npb24oKS50aGVuKChmdW5jdGlvbihyKXtzd2l0Y2goci5TZXNzaW9uLkVucm9sbG1lbnRSZXF1ZXN0RGV0YWlscy5TdGF0dXMpe2Nhc2UgdC5Wb2ljZUlkRW5yb2xsbWVudFJlcXVlc3RTdGF0dXMuQ09NUExFVEVEOmkocik7YnJlYWs7Y2FzZSB0LlZvaWNlSWRFbnJvbGxtZW50UmVxdWVzdFN0YXR1cy5JTl9QUk9HUkVTUzpvfHwiZnVuY3Rpb24iIT10eXBlb2YgZXx8KGUociksbz0hMCksc2V0VGltZW91dChhLHQuVm9pY2VJZENvbnN0YW50cy5FTlJPTExNRU5UX1BPTExJTkdfSU5URVJWQUwpO2JyZWFrO2Nhc2UgdC5Wb2ljZUlkRW5yb2xsbWVudFJlcXVlc3RTdGF0dXMuTk9UX0VOT1VHSF9TUEVFQ0g6ci5TZXNzaW9uLlN0cmVhbWluZ1N0YXR1cyE9PXQuVm9pY2VJZFN0cmVhbWluZ1N0YXR1cy5FTkRFRD9zZXRUaW1lb3V0KGEsdC5Wb2ljZUlkQ29uc3RhbnRzLkVOUk9MTE1FTlRfUE9MTElOR19JTlRFUlZBTCk6c2V0VGltZW91dCgoZnVuY3Rpb24oKXtuLnN0YXJ0U2Vzc2lvbigpLnRoZW4oKGZ1bmN0aW9uKGUpe2EoKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSx0KXtzKGUpfSkpfSksdC5Wb2ljZUlkQ29uc3RhbnRzLlNUQVJUX1NFU1NJT05fREVMQVkpO2JyZWFrO2RlZmF1bHQ6dmFyIGM9ci5TZXNzaW9uLkVucm9sbG1lbnRSZXF1ZXN0RGV0YWlscy5NZXNzYWdlP3IuU2Vzc2lvbi5FbnJvbGxtZW50UmVxdWVzdERldGFpbHMuTWVzc2FnZToiZW5yb2xsU3BlYWtlciBmYWlsZWQuIFVua25vd24gZW5yb2xsbWVudCBzdGF0dXMgaGFzIGJlZW4gcmVjZWl2ZWQiO3QuZ2V0TG9nKCkuZXJyb3IoYykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgdT10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkVOUk9MTF9TUEVBS0VSX0ZBSUxFRCxjLHIuU2Vzc2lvbi5FbnJvbGxtZW50UmVxdWVzdERldGFpbHMuU3RhdHVzKTtzKHUpfX0pKTtlbHNle3QuZ2V0TG9nKCkuZXJyb3IoImVucm9sbFNwZWFrZXIgdGltZW91dCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIGM9dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5FTlJPTExfU1BFQUtFUl9USU1FT1VULCJlbnJvbGxTcGVha2VyIHRpbWVvdXQiKTtzKGMpfX0oKX0pKX0sYS5wcm90b3R5cGUuZW5yb2xsU3BlYWtlcj1mdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oImVucm9sbFNwZWFrZXIgY2FsbGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10aGlzO3JldHVybiBuLmNoZWNrQ29uZmVyZW5jZUNhbGwoKSxuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixvKXtuLnN5bmNTcGVha2VySWQoKS50aGVuKChmdW5jdGlvbigpe24uZ2V0U3BlYWtlclN0YXR1cygpLnRoZW4oKGZ1bmN0aW9uKGkpe2kuU3BlYWtlciYmaS5TcGVha2VyLlN0YXR1cz09dC5Wb2ljZUlkU3BlYWtlclN0YXR1cy5PUFRFRF9PVVQ/bi5kZWxldGVTcGVha2VyKCkudGhlbigoZnVuY3Rpb24oKXtuLmVucm9sbFNwZWFrZXJIZWxwZXIocixvLGUpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpOm4uZW5yb2xsU3BlYWtlckhlbHBlcihyLG8sZSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28oZSl9KSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28oZSl9KSl9KSl9LGEucHJvdG90eXBlLmVucm9sbFNwZWFrZXJIZWxwZXI9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXRoaXMsaT10LmNvcmUuZ2V0Q2xpZW50KCkscz10LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb250YWN0RGF0YSh0aGlzLmNvbnRhY3RJZCk7by5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGEpe2NvbnN0IGM9e1Nlc3Npb25OYW1lT3JJZDpzLmluaXRpYWxDb250YWN0SWR8fHRoaXMuY29udGFjdElkLERvbWFpbklkOmF9O3QuZ2V0TG9nKCkuaW5mbygiZW5yb2xsU3BlYWtlckhlbHBlciBjYWxsZWQiKS53aXRoT2JqZWN0KGMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaS5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLkVOUk9MTF9CWV9TRVNTSU9OLGMse3N1Y2Nlc3M6ZnVuY3Rpb24oaSl7aS5TdGF0dXM9PT10LlZvaWNlSWRFbnJvbGxtZW50UmVxdWVzdFN0YXR1cy5DT01QTEVURUQ/KHQuZ2V0TG9nKCkuaW5mbygiZW5yb2xsU3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksZShpKSk6by5jaGVja0Vucm9sbG1lbnRTdGF0dXMocikudGhlbigoZnVuY3Rpb24obil7dC5nZXRMb2coKS5pbmZvKCJlbnJvbGxTcGVha2VyIHN1Y2NlZWRlZCIpLndpdGhPYmplY3Qobikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxlKG4pfSkpLmNhdGNoKChmdW5jdGlvbihlKXtuKGUpfSkpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoImVucm9sbFNwZWFrZXIgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciByPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuRU5ST0xMX1NQRUFLRVJfRkFJTEVELCJlbnJvbGxTcGVha2VyIGZhaWxlZCIsZSk7bihyKX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7bihlKX0pKX0sYS5wcm90b3R5cGUuX3VwZGF0ZVNwZWFrZXJJZEluTGNtcz1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXMsbz10LmNvcmUuZ2V0Q2xpZW50KCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihpLHMpe2NvbnN0IGE9e0NvbnRhY3RJZDpyLmNvbnRhY3RJZCxJbnN0YW5jZUlkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEluc3RhbmNlSWQoKSxBV1NBY2NvdW50SWQ6dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0QVdTQWNjb3VudElkKCksQ3VzdG9tZXJJZDp0LmFzc2VydE5vdE51bGwoZSwic3BlYWtlcklkIiksVm9pY2VJZFJlc3VsdDp7Z2VuZXJhdGVkU3BlYWtlcklkOm59fTt0LmdldExvZygpLmluZm8oIl91cGRhdGVTcGVha2VySWRJbkxjbXMgY2FsbGVkIikud2l0aE9iamVjdChhKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG8uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5VUERBVEVfVk9JQ0VfSURfREFUQSxhLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygidXBkYXRlU3BlYWtlcklkSW5MY21zIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoInVwZGF0ZVNwZWFrZXJJZEluTGNtcyBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5VUERBVEVfU1BFQUtFUl9JRF9JTl9MQ01TX0ZBSUxFRCwidXBkYXRlU3BlYWtlcklkSW5MY21zIGZhaWxlZCIsZSk7cyhuKX19KX0pKX0sYS5wcm90b3R5cGUudXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7bi5jaGVja0NvbmZlcmVuY2VDYWxsKCk7dmFyIHI9dC5jb3JlLmdldENsaWVudCgpLG89dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5jb250YWN0SWQpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oaSxzKXtuLmdldERvbWFpbklkKCkudGhlbigoZnVuY3Rpb24oYSl7Y29uc3QgYz17U2Vzc2lvbk5hbWVPcklkOm8uaW5pdGlhbENvbnRhY3RJZHx8dGhpcy5jb250YWN0SWQsU3BlYWtlcklkOnQuYXNzZXJ0Tm90TnVsbChlLCJzcGVha2VySWQiKSxEb21haW5JZDphfTt0LmdldExvZygpLmluZm8oInVwZGF0ZVNwZWFrZXJJZEluVm9pY2VJZCBjYWxsZWQiKS53aXRoT2JqZWN0KGMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLlVQREFURV9TRVNTSU9OLGMse3N1Y2Nlc3M6ZnVuY3Rpb24ocil7dC5nZXRMb2coKS5pbmZvKCJ1cGRhdGVTcGVha2VySWRJblZvaWNlSWQgc3VjY2VlZGVkIikud2l0aE9iamVjdChyKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBvPXImJnIuU2Vzc2lvbiYmci5TZXNzaW9uLkdlbmVyYXRlZFNwZWFrZXJJZDtuLl91cGRhdGVTcGVha2VySWRJbkxjbXMoZSxvKS50aGVuKChmdW5jdGlvbigpe2kocil9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3MoZSl9KSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dmFyIG47c3dpdGNoKEpTT04ucGFyc2UoZSkuc3RhdHVzKXtjYXNlIDQwMDpjYXNlIDQwNDpuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuU0VTU0lPTl9OT1RfRVhJU1RTLCJ1cGRhdGVTcGVha2VySWRJblZvaWNlSWQgZmFpbGVkLCBzZXNzaW9uIG5vdCBleGlzdHMiLGUpLHQuZ2V0TG9nKCkuZXJyb3IoInVwZGF0ZVNwZWFrZXJJZEluVm9pY2VJZCBmYWlsZWQsIHNlc3Npb24gbm90IGV4aXN0cyIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTticmVhaztkZWZhdWx0Om49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5VUERBVEVfU1BFQUtFUl9JRF9GQUlMRUQsInVwZGF0ZVNwZWFrZXJJZEluVm9pY2VJZCBmYWlsZWQiLGUpLHQuZ2V0TG9nKCkuZXJyb3IoInVwZGF0ZVNwZWFrZXJJZEluVm9pY2VJZCBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9cyhuKX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cyhlKX0pKX0pKX0sYS5wcm90b3R5cGUuc3luY1NwZWFrZXJJZD1mdW5jdGlvbigpe3QuZ2V0TG9nKCkuaW5mbygic3luY1NwZWFrZXJJZCBjYWxsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBlPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbih0LG4pe2UuZ2V0U3BlYWtlcklkKCkudGhlbigoZnVuY3Rpb24ocil7ZS51cGRhdGVTcGVha2VySWRJblZvaWNlSWQoci5zcGVha2VySWQpLnRoZW4oKGZ1bmN0aW9uKGUpe3QoZSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe24oZSl9KSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe24oZSl9KSl9KSl9LGEucHJvdG90eXBlLmdldERvbWFpbklkPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihlLG4pe2lmKChuZXcgdC5BZ2VudCkuZ2V0UGVybWlzc2lvbnMoKS5pbmNsdWRlcyh0LkFnZW50UGVybWlzc2lvbnMuVk9JQ0VfSUQpKWlmKHQuY29yZS52b2ljZUlkRG9tYWluSWQpZSh0LmNvcmUudm9pY2VJZERvbWFpbklkKTtlbHNle3ZhciByPXQuY29yZS5nZXRDbGllbnQoKTtjb25zdCBvPXtJbnN0YW5jZUlkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEluc3RhbmNlSWQoKSxJbnRlZ3JhdGlvblR5cGU6IlZPSUNFX0lEIn07dC5nZXRMb2coKS5pbmZvKCJnZXREb21haW5JZCBjYWxsZWQiKS53aXRoT2JqZWN0KG8pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLkxJU1RfSU5URUdSQVRJT05fQVNTT0NJQVRJT05TLG8se3N1Y2Nlc3M6ZnVuY3Rpb24ocil7dHJ5e3ZhciBvO2lmKHIuSW50ZWdyYXRpb25Bc3NvY2lhdGlvblN1bW1hcnlMaXN0Lmxlbmd0aD49MSYmKG89ci5JbnRlZ3JhdGlvbkFzc29jaWF0aW9uU3VtbWFyeUxpc3RbMF0uSW50ZWdyYXRpb25Bcm4ucmVwbGFjZSgvXi4qZG9tYWluXC8vaSwiIikpLCFvKXt0LmdldExvZygpLmluZm8oImdldERvbWFpbklkOiBubyBkb21haW5JZCBmb3VuZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIGk9dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5OT19ET01BSU5fSURfRk9VTkQpO3JldHVybiB2b2lkIG4oaSl9dC5nZXRMb2coKS5pbmZvKCJnZXREb21haW5JZCBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KHIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Wb2ljZUlkRXZlbnRzLlVQREFURV9ET01BSU5fSUQsZGF0YTp7ZG9tYWluSWQ6b319KSxlKG8pfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoImdldERvbWFpbklkIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuR0VUX0RPTUFJTl9JRF9GQUlMRUQsImdldERvbWFpbklkIGZhaWxlZCIsZSksbihpKX19LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigiZ2V0RG9tYWluSWQgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciByPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuR0VUX0RPTUFJTl9JRF9GQUlMRUQsImdldERvbWFpbklkIGZhaWxlZCIsZSk7bihyKX19KX1lbHNlIG4obmV3IEVycm9yKCJBZ2VudCBkb2Vzbid0IGhhdmUgdGhlIHBlcm1pc3Npb24gZm9yIFZvaWNlIElEIikpfSkpfSxhLnByb3RvdHlwZS5jaGVja0NvbmZlcmVuY2VDYWxsPWZ1bmN0aW9uKCl7aWYodC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5jb250YWN0SWQpLmNvbm5lY3Rpb25zLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29udGFpbnModC5DT05ORUNUSU9OX0FDVElWRV9TVEFURVMsZS5zdGF0ZS50eXBlKX0pKS5sZW5ndGg+Mil0aHJvdyBuZXcgdC5Ob3RJbXBsZW1lbnRlZEVycm9yKCJWb2ljZUlkIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGNvbmZlcmVuY2UgY2FsbHMiKX0sYS5wcm90b3R5cGUuaXNBdXRoRW5hYmxlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSE9PXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLk5PVF9FTkFCTEVEfSxhLnByb3RvdHlwZS5pc0F1dGhSZXN1bHROb3RFbm91Z2hTcGVlY2g9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10LlZvaWNlSWRBdXRoZW50aWNhdGlvbkRlY2lzaW9uLk5PVF9FTk9VR0hfU1BFRUNIfSxhLnByb3RvdHlwZS5pc0F1dGhSZXN1bHRJbmNvbmNsdXNpdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10LkNvbnRhY3RGbG93QXV0aGVudGljYXRpb25EZWNpc2lvbi5JTkNPTkNMVVNJVkV9LGEucHJvdG90eXBlLmlzRnJhdWRFbmFibGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uTk9UX0VOQUJMRUR9LGEucHJvdG90eXBlLmlzRnJhdWRSZXN1bHROb3RFbm91Z2hTcGVlY2g9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10LlZvaWNlSWRGcmF1ZERldGVjdGlvbkRlY2lzaW9uLk5PVF9FTk9VR0hfU1BFRUNIfSxhLnByb3RvdHlwZS5pc0ZyYXVkUmVzdWx0SW5jb25jbHVzaXZlPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uSU5DT05DTFVTSVZFfTt2YXIgYz1mdW5jdGlvbihlLHQpe3RoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yPW5ldyBhKGUpLHMuY2FsbCh0aGlzLGUsdCl9OyhjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHMucHJvdG90eXBlKSkuY29uc3RydWN0b3I9YyxjLnByb3RvdHlwZS5nZXRTb2Z0cGhvbmVNZWRpYUluZm89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnNvZnRwaG9uZU1lZGlhSW5mb30sYy5wcm90b3R5cGUuZ2V0TWVkaWFJbmZvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zb2Z0cGhvbmVNZWRpYUluZm99LGMucHJvdG90eXBlLmdldE1lZGlhVHlwZT1mdW5jdGlvbigpe3JldHVybiB0Lk1lZGlhVHlwZS5TT0ZUUEhPTkV9LGMucHJvdG90eXBlLmdldE1lZGlhQ29udHJvbGxlcj1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUubWVkaWFGYWN0b3J5LmdldCh0aGlzKX0sYy5wcm90b3R5cGUuZ2V0Vm9pY2VJZFNwZWFrZXJJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zcGVha2VyQXV0aGVudGljYXRvci5nZXRTcGVha2VySWQoKX0sYy5wcm90b3R5cGUuZ2V0Vm9pY2VJZFNwZWFrZXJTdGF0dXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3BlYWtlckF1dGhlbnRpY2F0b3IuZ2V0U3BlYWtlclN0YXR1cygpfSxjLnByb3RvdHlwZS5vcHRPdXRWb2ljZUlkU3BlYWtlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zcGVha2VyQXV0aGVudGljYXRvci5vcHRPdXRTcGVha2VyKCl9LGMucHJvdG90eXBlLmRlbGV0ZVZvaWNlSWRTcGVha2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yLmRlbGV0ZVNwZWFrZXIoKX0sYy5wcm90b3R5cGUuZXZhbHVhdGVTcGVha2VyV2l0aFZvaWNlSWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yLmV2YWx1YXRlU3BlYWtlcihlKX0sYy5wcm90b3R5cGUuZW5yb2xsU3BlYWtlckluVm9pY2VJZD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fc3BlYWtlckF1dGhlbnRpY2F0b3IuZW5yb2xsU3BlYWtlcihlKX0sYy5wcm90b3R5cGUudXBkYXRlVm9pY2VJZFNwZWFrZXJJZD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fc3BlYWtlckF1dGhlbnRpY2F0b3IudXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkKGUpfSxjLnByb3RvdHlwZS5nZXRRdWlja0Nvbm5lY3ROYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5xdWlja0Nvbm5lY3ROYW1lfSxjLnByb3RvdHlwZS5pc1NpbGVudE1vbml0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRNb25pdG9yU3RhdHVzKCk9PT10Lk1vbml0b3JpbmdNb2RlLlNJTEVOVF9NT05JVE9SfSxjLnByb3RvdHlwZS5pc0JhcmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TW9uaXRvclN0YXR1cygpPT09dC5Nb25pdG9yaW5nTW9kZS5CQVJHRX0sYy5wcm90b3R5cGUuaXNCYXJnZUVuYWJsZWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldE1vbml0b3JDYXBhYmlsaXRpZXMoKTtyZXR1cm4gZSYmZS5pbmNsdWRlcyh0Lk1vbml0b3JpbmdNb2RlLkJBUkdFKX0sYy5wcm90b3R5cGUuaXNTaWxlbnRNb25pdG9yRW5hYmxlZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0TW9uaXRvckNhcGFiaWxpdGllcygpO3JldHVybiBlJiZlLmluY2x1ZGVzKHQuTW9uaXRvcmluZ01vZGUuU0lMRU5UX01PTklUT1IpfSxjLnByb3RvdHlwZS5nZXRNb25pdG9yQ2FwYWJpbGl0aWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5tb25pdG9yQ2FwYWJpbGl0aWVzfSxjLnByb3RvdHlwZS5nZXRNb25pdG9yU3RhdHVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5tb25pdG9yU3RhdHVzfSxjLnByb3RvdHlwZS5pc011dGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLm11dGV9LGMucHJvdG90eXBlLmlzRm9yY2VkTXV0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuZm9yY2VkTXV0ZX0sYy5wcm90b3R5cGUubXV0ZVBhcnRpY2lwYW50PWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5NVVRFX1BBUlRJQ0lQQU5ULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjb25uZWN0aW9uSWQ6dGhpcy5nZXRDb25uZWN0aW9uSWQoKX0sZSl9LGMucHJvdG90eXBlLnVubXV0ZVBhcnRpY2lwYW50PWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5VTk1VVEVfUEFSVElDSVBBTlQse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNvbm5lY3Rpb25JZDp0aGlzLmdldENvbm5lY3Rpb25JZCgpfSxlKX0sYy5wcm90b3R5cGUuY2FuU2VuZFZpZGVvPWZ1bmN0aW9uKCl7Y29uc3QgZT10aGlzLmdldENhcGFiaWxpdGllcygpO3JldHVybiBlJiZlLlZpZGVvPT09dC5WaWRlb0NhcGFiaWxpdHkuU0VORH0sYy5wcm90b3R5cGUuZ2V0Q2FwYWJpbGl0aWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jYXBhYmlsaXRpZXN9LGMucHJvdG90eXBlLmdldFZpZGVvQ29ubmVjdGlvbkluZm89ZnVuY3Rpb24oKXtjb25zdCBlPXQuY29yZS5nZXRDbGllbnQoKSxuPXt0cmFuc3BvcnRUeXBlOnQuVFJBTlNQT1JUX1RZUEVTLldFQl9SVEMsY29udGFjdElkOnRoaXMuY29udGFjdElkfTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7ZS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DUkVBVEVfVFJBTlNQT1JULG4se3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJnZXRWaWRlb0Nvbm5lY3Rpb25JbmZvIHN1Y2NlZWRlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihlLndlYlJUQ1RyYW5zcG9ydCl9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJnZXRWaWRlb0Nvbm5lY3Rpb25JbmZvIGZhaWxlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOmUsZGF0YTpufSksbyhFcnJvcigiZ2V0VmlkZW9Db25uZWN0aW9uSW5mbyBmYWlsZWQiKSl9fSl9KSl9O3ZhciB1PWZ1bmN0aW9uKGUsdCl7cy5jYWxsKHRoaXMsZSx0KX07KHUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUocy5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj11LHUucHJvdG90eXBlLmdldE1lZGlhSW5mbz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX2dldERhdGEoKS5jaGF0TWVkaWFJbmZvO2lmKGUpe3ZhciBuPXQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKSxyPXtjb250YWN0SWQ6dGhpcy5jb250YWN0SWQsaW5pdGlhbENvbnRhY3RJZDpuLmluaXRpYWxDb250YWN0SWR8fHRoaXMuY29udGFjdElkLHBhcnRpY2lwYW50SWQ6dGhpcy5jb25uZWN0aW9uSWQsZ2V0Q29ubmVjdGlvblRva2VuOnQuaGl0Y2godGhpcyx0aGlzLmdldENvbm5lY3Rpb25Ub2tlbil9O2lmKGUuY29ubmVjdGlvbkRhdGEpdHJ5e3IucGFydGljaXBhbnRUb2tlbj1KU09OLnBhcnNlKGUuY29ubmVjdGlvbkRhdGEpLkNvbm5lY3Rpb25BdXRoZW50aWNhdGlvblRva2VufWNhdGNoKG4pe3QuZ2V0TG9nKCkuZXJyb3IodC5Mb2dDb21wb25lbnQuQ0hBVCwiQ29ubmVjdGlvbiBkYXRhIGlzIGludmFsaWQiKS53aXRoT2JqZWN0KGUpLndpdGhFeGNlcHRpb24obikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyLnBhcnRpY2lwYW50VG9rZW49bnVsbH1yZXR1cm4gci5wYXJ0aWNpcGFudFRva2VuPXIucGFydGljaXBhbnRUb2tlbnx8bnVsbCxyLm9yaWdpbmFsSW5mbz10aGlzLl9nZXREYXRhKCkuY2hhdE1lZGlhSW5mbyxyfXJldHVybiBudWxsfSx1LnByb3RvdHlwZS5nZXRDb25uZWN0aW9uVG9rZW49ZnVuY3Rpb24oKXt2YXIgZT10LmNvcmUuZ2V0Q2xpZW50KCksbj0odC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5jb250YWN0SWQpLHt0cmFuc3BvcnRUeXBlOnQuVFJBTlNQT1JUX1RZUEVTLkNIQVRfVE9LRU4scGFydGljaXBhbnRJZDp0aGlzLmNvbm5lY3Rpb25JZCxjb250YWN0SWQ6dGhpcy5jb250YWN0SWR9KTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7ZS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DUkVBVEVfVFJBTlNQT1JULG4se3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJnZXRDb25uZWN0aW9uVG9rZW4gc3VjY2VlZGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiZ2V0Q29ubmVjdGlvblRva2VuIGZhaWxlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOmUsZGF0YTpufSksbyhFcnJvcigiZ2V0Q29ubmVjdGlvblRva2VuIGZhaWxlZCIpKX19KX0pKX0sdS5wcm90b3R5cGUuZ2V0TWVkaWFUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuTWVkaWFUeXBlLkNIQVR9LHUucHJvdG90eXBlLmdldE1lZGlhQ29udHJvbGxlcj1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUubWVkaWFGYWN0b3J5LmdldCh0aGlzKX0sdS5wcm90b3R5cGUuX2luaXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oKXt0aGlzLl9pc0FnZW50Q29ubmVjdGlvblR5cGUoKSYmdC5jb3JlLm1lZGlhRmFjdG9yeS5nZXQodGhpcykuY2F0Y2goKGZ1bmN0aW9uKCl7fSkpfSx1LnByb3RvdHlwZS5pc0JhcmdlRW5hYmxlZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0TW9uaXRvckNhcGFiaWxpdGllcygpO3JldHVybiBlJiZlLmluY2x1ZGVzKHQuTW9uaXRvcmluZ01vZGUuQkFSR0UpfSx1LnByb3RvdHlwZS5pc1NpbGVudE1vbml0b3JFbmFibGVkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRNb25pdG9yQ2FwYWJpbGl0aWVzKCk7cmV0dXJuIGUmJmUuaW5jbHVkZXModC5Nb25pdG9yaW5nTW9kZS5TSUxFTlRfTU9OSVRPUil9LHUucHJvdG90eXBlLmdldE1vbml0b3JDYXBhYmlsaXRpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLm1vbml0b3JDYXBhYmlsaXRpZXN9LHUucHJvdG90eXBlLmlzQmFyZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRNb25pdG9yU3RhdHVzKCk9PT10Lk1vbml0b3JpbmdNb2RlLkJBUkdFfSx1LnByb3RvdHlwZS5pc1NpbGVudE1vbml0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRNb25pdG9yU3RhdHVzKCk9PT10Lk1vbml0b3JpbmdNb2RlLlNJTEVOVF9NT05JVE9SfSx1LnByb3RvdHlwZS5nZXRNb25pdG9yU3RhdHVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5tb25pdG9yU3RhdHVzfTt2YXIgbD1mdW5jdGlvbihlLHQpe3MuY2FsbCh0aGlzLGUsdCl9OyhsLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHMucHJvdG90eXBlKSkuY29uc3RydWN0b3I9bCxsLnByb3RvdHlwZS5nZXRNZWRpYVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdC5NZWRpYVR5cGUuVEFTS30sbC5wcm90b3R5cGUuZ2V0TWVkaWFJbmZvPWZ1bmN0aW9uKCl7dmFyIGU9dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5jb250YWN0SWQpO3JldHVybntjb250YWN0SWQ6dGhpcy5jb250YWN0SWQsaW5pdGlhbENvbnRhY3RJZDplLmluaXRpYWxDb250YWN0SWR8fHRoaXMuY29udGFjdElkfX0sbC5wcm90b3R5cGUuZ2V0TWVkaWFDb250cm9sbGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5tZWRpYUZhY3RvcnkuZ2V0KHRoaXMpfTt2YXIgcD1mdW5jdGlvbihlKXt0LkNvbm5lY3Rpb24uY2FsbCh0aGlzLGUuY29udGFjdElkLGUuY29ubmVjdGlvbklkKSx0aGlzLmNvbm5lY3Rpb25EYXRhPWV9OyhwLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHMucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cCxwLnByb3RvdHlwZS5fZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25EYXRhfSxwLnByb3RvdHlwZS5faW5pdE1lZGlhQ29udHJvbGxlcj1mdW5jdGlvbigpe307dmFyIGQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8e307dGhpcy5lbmRwb2ludEFSTj10LmVuZHBvaW50SWR8fHQuZW5kcG9pbnRBUk58fG51bGwsdGhpcy5lbmRwb2ludElkPXRoaXMuZW5kcG9pbnRBUk4sdGhpcy50eXBlPXQudHlwZXx8bnVsbCx0aGlzLm5hbWU9dC5uYW1lfHxudWxsLHRoaXMucGhvbmVOdW1iZXI9dC5waG9uZU51bWJlcnx8bnVsbCx0aGlzLmFnZW50TG9naW49dC5hZ2VudExvZ2lufHxudWxsLHRoaXMucXVldWU9dC5xdWV1ZXx8bnVsbH07ZC5wcm90b3R5cGUuc3RyaXBQaG9uZU51bWJlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBob25lTnVtYmVyP3RoaXMucGhvbmVOdW1iZXIucmVwbGFjZSgvc2lwOihbXkBdKilALiovLCIkMSIpOiIifSxkLmJ5UGhvbmVOdW1iZXI9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gbmV3IGQoe3R5cGU6dC5FbmRwb2ludFR5cGUuUEhPTkVfTlVNQkVSLHBob25lTnVtYmVyOmUsbmFtZTpufHxudWxsfSl9O3ZhciBoPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLmVycm9yVHlwZT1lLHRoaXMuZXJyb3JNZXNzYWdlPXQsdGhpcy5lbmRQb2ludFVybD1ufTtoLnByb3RvdHlwZS5nZXRFcnJvclR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvclR5cGV9LGgucHJvdG90eXBlLmdldEVycm9yTWVzc2FnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yTWVzc2FnZX0saC5wcm90b3R5cGUuZ2V0RW5kUG9pbnRVcmw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmRQb2ludFVybH0sdC5hZ2VudD1mdW5jdGlvbihlKXt2YXIgbj10LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5JTklULGUpO3JldHVybiB0LmFnZW50LmluaXRpYWxpemVkJiZlKG5ldyB0LkFnZW50KSxufSx0LmFnZW50LmluaXRpYWxpemVkPSExLHQuY29udGFjdD1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQ29udGFjdEV2ZW50cy5JTklULGUpfSx0Lm9uV2Vic29ja2V0SW5pdEZhaWx1cmU9ZnVuY3Rpb24oZSl7dmFyIG49dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuV2ViU29ja2V0RXZlbnRzLklOSVRfRkFJTFVSRSxlKTtyZXR1cm4gdC53ZWJTb2NrZXRJbml0RmFpbGVkJiZlKCksbn0sdC5pZk1hc3Rlcj1mdW5jdGlvbihlLG4scixvKXtpZih0LmFzc2VydE5vdE51bGwoZSwiQSB0b3BpYyBtdXN0IGJlIHByb3ZpZGVkLiIpLHQuYXNzZXJ0Tm90TnVsbChuLCJBIHRydWUgY2FsbGJhY2sgbXVzdCBiZSBwcm92aWRlZC4iKSwhdC5jb3JlLm1hc3RlckNsaWVudClyZXR1cm4gdC5nZXRMb2coKS53YXJuKCJXZSBjYW4ndCBiZSB0aGUgbWFzdGVyIGZvciB0b3BpYyAnJXMnIGJlY2F1c2UgdGhlcmUgaXMgbm8gbWFzdGVyIGNsaWVudCEiLGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdm9pZChyJiZyKCkpO3QuY29yZS5nZXRNYXN0ZXJDbGllbnQoKS5jYWxsKHQuTWFzdGVyTWV0aG9kcy5DSEVDS19NQVNURVIse3RvcGljOmUsc2hvdWxkTm90QmVjb21lTWFzdGVySWZOb25lOm99LHtzdWNjZXNzOmZ1bmN0aW9uKGUpe2UuaXNNYXN0ZXI/bigpOnImJnIoKX19KX0sdC5iZWNvbWVNYXN0ZXI9ZnVuY3Rpb24oZSxuLHIpe3QuYXNzZXJ0Tm90TnVsbChlLCJBIHRvcGljIG11c3QgYmUgcHJvdmlkZWQuIiksdC5jb3JlLm1hc3RlckNsaWVudD90LmNvcmUuZ2V0TWFzdGVyQ2xpZW50KCkuY2FsbCh0Lk1hc3Rlck1ldGhvZHMuQkVDT01FX01BU1RFUix7dG9waWM6ZX0se3N1Y2Nlc3M6ZnVuY3Rpb24oKXtuJiZuKCl9fSk6KHQuZ2V0TG9nKCkud2FybigiV2UgY2FuJ3QgYmUgdGhlIG1hc3RlciBmb3IgdG9waWMgJyVzJyBiZWNhdXNlIHRoZXJlIGlzIG5vIG1hc3RlciBjbGllbnQhIixlKSxyJiZyKCkpfSx0LkFnZW50PW4sdC5BZ2VudFNuYXBzaG90PXIsdC5Db250YWN0PW8sdC5Db250YWN0U25hcHNob3Q9aSx0LkNvbm5lY3Rpb249Yyx0LkJhc2VDb25uZWN0aW9uPXMsdC5Wb2ljZUNvbm5lY3Rpb249Yyx0LkNoYXRDb25uZWN0aW9uPXUsdC5UYXNrQ29ubmVjdGlvbj1sLHQuQ29ubmVjdGlvblNuYXBzaG90PXAsdC5FbmRwb2ludD1kLHQuQWRkcmVzcz1kLHQuU29mdHBob25lRXJyb3I9aCx0LlZvaWNlSWQ9YSx0LlF1aWNrUmVzcG9uc2VzPWNsYXNze3N0YXRpYyBpc0VuYWJsZWQ9ZnVuY3Rpb24oKXtjb25zdCBlPXQuaXNDUk0oKT90LmNvcmUuZ2V0Q2xpZW50KCk6dC5jb3JlLmdldEFwaVByb3h5Q2xpZW50KCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihuLHIpe2UuY2FsbCh0LkFwaVByb3h5Q2xpZW50TWV0aG9kcy5RUl9JTlRFR1JBVElPTl9FWElTVFMsbnVsbCx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oIlF1aWNrIFJlc3BvbnNlcyBpc0VuYWJsZWQgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4oZSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigiUXVpY2sgUmVzcG9uc2VzIGlzRW5hYmxlZCBmYWlsZWQiKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihlKX19KX0pKX07c3RhdGljIHNlYXJjaFF1aWNrUmVzcG9uc2VzPWZ1bmN0aW9uKGUpe2NvbnN0IG49dC5pc0NSTSgpP3QuY29yZS5nZXRDbGllbnQoKTp0LmNvcmUuZ2V0QXBpUHJveHlDbGllbnQoKSxyPWU/LmNvbnRhY3RJZD9uZXcgbyhlLmNvbnRhY3RJZCkuZ2V0QXR0cmlidXRlcygpOnZvaWQgMDtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG8saSl7bi5jYWxsKHQuQXBpUHJveHlDbGllbnRNZXRob2RzLlFSX1NFQVJDSF9RVUlDS19SRVNQT05TRVMsey4uLmUsYXR0cmlidXRlczpyfSx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oInNlYXJjaFF1aWNrUmVzcG9uc2VzIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxvKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoInNlYXJjaFF1aWNrUmVzcG9uc2VzIGZhaWxlZCIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKGUpfX0pfSkpfX19KCl9LDgyNzooZSx0LG4pPT57dmFyIHI7IWZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIG8ocyxhKXtpZighbltzXSl7aWYoIXRbc10pe2lmKGkpcmV0dXJuIGkocywhMCk7dmFyIGM9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrcysiJyIpO3Rocm93IGMuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsY312YXIgdT1uW3NdPXtleHBvcnRzOnt9fTt0W3NdWzBdLmNhbGwodS5leHBvcnRzLChmdW5jdGlvbihlKXtyZXR1cm4gbyh0W3NdWzFdW2VdfHxlKX0pLHUsdS5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW3NdLmV4cG9ydHN9Zm9yKHZhciBpPXZvaWQgMCxzPTA7czxyLmxlbmd0aDtzKyspbyhyW3NdKTtyZXR1cm4gb30oezE6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e3ZlcnNpb246IjIuMCIsbWV0YWRhdGE6e2FwaVZlcnNpb246IjIwMTQtMDYtMzAiLGVuZHBvaW50UHJlZml4OiJjb2duaXRvLWlkZW50aXR5Iixqc29uVmVyc2lvbjoiMS4xIixwcm90b2NvbDoianNvbiIsc2VydmljZUZ1bGxOYW1lOiJBbWF6b24gQ29nbml0byBJZGVudGl0eSIsc2VydmljZUlkOiJDb2duaXRvIElkZW50aXR5IixzaWduYXR1cmVWZXJzaW9uOiJ2NCIsdGFyZ2V0UHJlZml4OiJBV1NDb2duaXRvSWRlbnRpdHlTZXJ2aWNlIix1aWQ6ImNvZ25pdG8taWRlbnRpdHktMjAxNC0wNi0zMCJ9LG9wZXJhdGlvbnM6e0NyZWF0ZUlkZW50aXR5UG9vbDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xOYW1lIiwiQWxsb3dVbmF1dGhlbnRpY2F0ZWRJZGVudGl0aWVzIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sTmFtZTp7fSxBbGxvd1VuYXV0aGVudGljYXRlZElkZW50aXRpZXM6e3R5cGU6ImJvb2xlYW4ifSxBbGxvd0NsYXNzaWNGbG93Ont0eXBlOiJib29sZWFuIn0sU3VwcG9ydGVkTG9naW5Qcm92aWRlcnM6e3NoYXBlOiJTNSJ9LERldmVsb3BlclByb3ZpZGVyTmFtZTp7fSxPcGVuSWRDb25uZWN0UHJvdmlkZXJBUk5zOntzaGFwZToiUzkifSxDb2duaXRvSWRlbnRpdHlQcm92aWRlcnM6e3NoYXBlOiJTYiJ9LFNhbWxQcm92aWRlckFSTnM6e3NoYXBlOiJTZyJ9LElkZW50aXR5UG9vbFRhZ3M6e3NoYXBlOiJTaCJ9fX0sb3V0cHV0OntzaGFwZToiU2sifX0sRGVsZXRlSWRlbnRpdGllczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eUlkc1RvRGVsZXRlIl0sbWVtYmVyczp7SWRlbnRpdHlJZHNUb0RlbGV0ZTp7dHlwZToibGlzdCIsbWVtYmVyOnt9fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntVbnByb2Nlc3NlZElkZW50aXR5SWRzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxFcnJvckNvZGU6e319fX19fX0sRGVsZXRlSWRlbnRpdHlQb29sOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e319fX0sRGVzY3JpYmVJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eUlkIl0sbWVtYmVyczp7SWRlbnRpdHlJZDp7fX19LG91dHB1dDp7c2hhcGU6IlN2In19LERlc2NyaWJlSWRlbnRpdHlQb29sOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e319fSxvdXRwdXQ6e3NoYXBlOiJTayJ9fSxHZXRDcmVkZW50aWFsc0ZvcklkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5SWQiXSxtZW1iZXJzOntJZGVudGl0eUlkOnt9LExvZ2luczp7c2hhcGU6IlMxMCJ9LEN1c3RvbVJvbGVBcm46e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxDcmVkZW50aWFsczp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntBY2Nlc3NLZXlJZDp7fSxTZWNyZXRLZXk6e30sU2Vzc2lvblRva2VuOnt9LEV4cGlyYXRpb246e3R5cGU6InRpbWVzdGFtcCJ9fX19fSxhdXRodHlwZToibm9uZSJ9LEdldElkOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7QWNjb3VudElkOnt9LElkZW50aXR5UG9vbElkOnt9LExvZ2luczp7c2hhcGU6IlMxMCJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5SWQ6e319fSxhdXRodHlwZToibm9uZSJ9LEdldElkZW50aXR5UG9vbFJvbGVzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sUm9sZXM6e3NoYXBlOiJTMWMifSxSb2xlTWFwcGluZ3M6e3NoYXBlOiJTMWUifX19fSxHZXRPcGVuSWRUb2tlbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eUlkIl0sbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxMb2dpbnM6e3NoYXBlOiJTMTAifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9LFRva2VuOnt9fX0sYXV0aHR5cGU6Im5vbmUifSxHZXRPcGVuSWRUb2tlbkZvckRldmVsb3BlcklkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIiwiTG9naW5zIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlJZDp7fSxMb2dpbnM6e3NoYXBlOiJTMTAifSxQcmluY2lwYWxUYWdzOntzaGFwZToiUzFzIn0sVG9rZW5EdXJhdGlvbjp7dHlwZToibG9uZyJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sVG9rZW46e319fX0sR2V0UHJpbmNpcGFsVGFnQXR0cmlidXRlTWFwOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIiwiSWRlbnRpdHlQcm92aWRlck5hbWUiXSxtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxJZGVudGl0eVByb3ZpZGVyTmFtZTp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxJZGVudGl0eVByb3ZpZGVyTmFtZTp7fSxVc2VEZWZhdWx0czp7dHlwZToiYm9vbGVhbiJ9LFByaW5jaXBhbFRhZ3M6e3NoYXBlOiJTMXMifX19fSxMaXN0SWRlbnRpdGllczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIk1heFJlc3VsdHMiXSxtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxNYXhSZXN1bHRzOnt0eXBlOiJpbnRlZ2VyIn0sTmV4dFRva2VuOnt9LEhpZGVEaXNhYmxlZDp7dHlwZToiYm9vbGVhbiJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXRpZXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7c2hhcGU6IlN2In19LE5leHRUb2tlbjp7fX19fSxMaXN0SWRlbnRpdHlQb29sczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJNYXhSZXN1bHRzIl0sbWVtYmVyczp7TWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9LE5leHRUb2tlbjp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eVBvb2xzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQb29sTmFtZTp7fX19fSxOZXh0VG9rZW46e319fX0sTGlzdFRhZ3NGb3JSZXNvdXJjZTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJSZXNvdXJjZUFybiJdLG1lbWJlcnM6e1Jlc291cmNlQXJuOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e1RhZ3M6e3NoYXBlOiJTaCJ9fX19LExvb2t1cERldmVsb3BlcklkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlJZDp7fSxEZXZlbG9wZXJVc2VySWRlbnRpZmllcjp7fSxNYXhSZXN1bHRzOnt0eXBlOiJpbnRlZ2VyIn0sTmV4dFRva2VuOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sRGV2ZWxvcGVyVXNlcklkZW50aWZpZXJMaXN0Ont0eXBlOiJsaXN0IixtZW1iZXI6e319LE5leHRUb2tlbjp7fX19fSxNZXJnZURldmVsb3BlcklkZW50aXRpZXM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiU291cmNlVXNlcklkZW50aWZpZXIiLCJEZXN0aW5hdGlvblVzZXJJZGVudGlmaWVyIiwiRGV2ZWxvcGVyUHJvdmlkZXJOYW1lIiwiSWRlbnRpdHlQb29sSWQiXSxtZW1iZXJzOntTb3VyY2VVc2VySWRlbnRpZmllcjp7fSxEZXN0aW5hdGlvblVzZXJJZGVudGlmaWVyOnt9LERldmVsb3BlclByb3ZpZGVyTmFtZTp7fSxJZGVudGl0eVBvb2xJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9fX19LFNldElkZW50aXR5UG9vbFJvbGVzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIiwiUm9sZXMiXSxtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxSb2xlczp7c2hhcGU6IlMxYyJ9LFJvbGVNYXBwaW5nczp7c2hhcGU6IlMxZSJ9fX19LFNldFByaW5jaXBhbFRhZ0F0dHJpYnV0ZU1hcDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIklkZW50aXR5UHJvdmlkZXJOYW1lIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQcm92aWRlck5hbWU6e30sVXNlRGVmYXVsdHM6e3R5cGU6ImJvb2xlYW4ifSxQcmluY2lwYWxUYWdzOntzaGFwZToiUzFzIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQcm92aWRlck5hbWU6e30sVXNlRGVmYXVsdHM6e3R5cGU6ImJvb2xlYW4ifSxQcmluY2lwYWxUYWdzOntzaGFwZToiUzFzIn19fX0sVGFnUmVzb3VyY2U6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUmVzb3VyY2VBcm4iLCJUYWdzIl0sbWVtYmVyczp7UmVzb3VyY2VBcm46e30sVGFnczp7c2hhcGU6IlNoIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFVubGlua0RldmVsb3BlcklkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5SWQiLCJJZGVudGl0eVBvb2xJZCIsIkRldmVsb3BlclByb3ZpZGVyTmFtZSIsIkRldmVsb3BlclVzZXJJZGVudGlmaWVyIl0sbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxJZGVudGl0eVBvb2xJZDp7fSxEZXZlbG9wZXJQcm92aWRlck5hbWU6e30sRGV2ZWxvcGVyVXNlcklkZW50aWZpZXI6e319fX0sVW5saW5rSWRlbnRpdHk6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlJZCIsIkxvZ2lucyIsIkxvZ2luc1RvUmVtb3ZlIl0sbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxMb2dpbnM6e3NoYXBlOiJTMTAifSxMb2dpbnNUb1JlbW92ZTp7c2hhcGU6IlN3In19fSxhdXRodHlwZToibm9uZSJ9LFVudGFnUmVzb3VyY2U6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUmVzb3VyY2VBcm4iLCJUYWdLZXlzIl0sbWVtYmVyczp7UmVzb3VyY2VBcm46e30sVGFnS2V5czp7dHlwZToibGlzdCIsbWVtYmVyOnt9fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sVXBkYXRlSWRlbnRpdHlQb29sOntpbnB1dDp7c2hhcGU6IlNrIn0sb3V0cHV0OntzaGFwZToiU2sifX19LHNoYXBlczp7UzU6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt9fSxTOTp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxTYjp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e1Byb3ZpZGVyTmFtZTp7fSxDbGllbnRJZDp7fSxTZXJ2ZXJTaWRlVG9rZW5DaGVjazp7dHlwZToiYm9vbGVhbiJ9fX19LFNnOnt0eXBlOiJsaXN0IixtZW1iZXI6e319LFNoOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7fX0sU2s6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIklkZW50aXR5UG9vbE5hbWUiLCJBbGxvd1VuYXV0aGVudGljYXRlZElkZW50aXRpZXMiXSxtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxJZGVudGl0eVBvb2xOYW1lOnt9LEFsbG93VW5hdXRoZW50aWNhdGVkSWRlbnRpdGllczp7dHlwZToiYm9vbGVhbiJ9LEFsbG93Q2xhc3NpY0Zsb3c6e3R5cGU6ImJvb2xlYW4ifSxTdXBwb3J0ZWRMb2dpblByb3ZpZGVyczp7c2hhcGU6IlM1In0sRGV2ZWxvcGVyUHJvdmlkZXJOYW1lOnt9LE9wZW5JZENvbm5lY3RQcm92aWRlckFSTnM6e3NoYXBlOiJTOSJ9LENvZ25pdG9JZGVudGl0eVByb3ZpZGVyczp7c2hhcGU6IlNiIn0sU2FtbFByb3ZpZGVyQVJOczp7c2hhcGU6IlNnIn0sSWRlbnRpdHlQb29sVGFnczp7c2hhcGU6IlNoIn19fSxTdjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9LExvZ2luczp7c2hhcGU6IlN3In0sQ3JlYXRpb25EYXRlOnt0eXBlOiJ0aW1lc3RhbXAifSxMYXN0TW9kaWZpZWREYXRlOnt0eXBlOiJ0aW1lc3RhbXAifX19LFN3Ont0eXBlOiJsaXN0IixtZW1iZXI6e319LFMxMDp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e319LFMxYzp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e319LFMxZTp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJUeXBlIl0sbWVtYmVyczp7VHlwZTp7fSxBbWJpZ3VvdXNSb2xlUmVzb2x1dGlvbjp7fSxSdWxlc0NvbmZpZ3VyYXRpb246e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJSdWxlcyJdLG1lbWJlcnM6e1J1bGVzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJDbGFpbSIsIk1hdGNoVHlwZSIsIlZhbHVlIiwiUm9sZUFSTiJdLG1lbWJlcnM6e0NsYWltOnt9LE1hdGNoVHlwZTp7fSxWYWx1ZTp7fSxSb2xlQVJOOnt9fX19fX19fX0sUzFzOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7fX19fX0se31dLDI6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e3BhZ2luYXRpb246e0xpc3RJZGVudGl0eVBvb2xzOntpbnB1dF90b2tlbjoiTmV4dFRva2VuIixsaW1pdF9rZXk6Ik1heFJlc3VsdHMiLG91dHB1dF90b2tlbjoiTmV4dFRva2VuIixyZXN1bHRfa2V5OiJJZGVudGl0eVBvb2xzIn19fX0se31dLDM6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e3ZlcnNpb246IjIuMCIsbWV0YWRhdGE6e2FwaVZlcnNpb246IjIwMTctMDItMTUiLGVuZHBvaW50UHJlZml4OiJjb25uZWN0Iixqc29uVmVyc2lvbjoiMS4wIixwcm90b2NvbDoianNvbiIsc2VydmljZUFiYnJldmlhdGlvbjoiQ29ubmVjdCIsc2VydmljZUZ1bGxOYW1lOiJBbWF6b25Db25uZWN0Q1RJU2VydmljZSIsc2lnbmF0dXJlVmVyc2lvbjoiIix0YXJnZXRQcmVmaXg6IkFtYXpvbkNvbm5lY3RDVElTZXJ2aWNlIix1aWQ6ImNvbm5lY3QtMjAxNy0wMi0xNSJ9LG9wZXJhdGlvbnM6e0FjY2VwdENvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDbGVhckNvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29udGFjdElkIl0sbWVtYmVyczp7Y29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDb21wbGV0ZUNvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29udGFjdElkIl0sbWVtYmVyczp7Y29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDb25mZXJlbmNlQ29ubmVjdGlvbnM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDcmVhdGVBZGRpdGlvbmFsQ29ubmVjdGlvbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCIsImVuZHBvaW50Il0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxlbmRwb2ludDp7c2hhcGU6IlNlIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LENyZWF0ZU91dGJvdW5kQ29udGFjdDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImVuZHBvaW50Il0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGVuZHBvaW50OntzaGFwZToiU2UifSxxdWV1ZUFSTjp7fSxyZWxhdGVkQ29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDcmVhdGVUYXNrQ29udGFjdDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJlbmRwb2ludCIsIm5hbWUiXSxtZW1iZXJzOntlbmRwb2ludDp7c2hhcGU6IlNlIn0scHJldmlvdXNDb250YWN0SWQ6e30sbmFtZTp7fSxkZXNjcmlwdGlvbjp7fSxyZWZlcmVuY2VzOntzaGFwZToiU3IifSxpZGVtcG90ZW5jeVRva2VuOnt9LHNjaGVkdWxlZFRpbWU6e3R5cGU6ImxvbmcifSxyZWxhdGVkQ29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2NvbnRhY3RJZDp7fX19fSxDcmVhdGVUcmFuc3BvcnQ6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsidHJhbnNwb3J0VHlwZSIsImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7dHJhbnNwb3J0VHlwZTp7fSxwYXJ0aWNpcGFudElkOnt9LGNvbnRhY3RJZDp7fSxzb2Z0cGhvbmVDbGllbnRJZDp7fSxhdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7d2ViU29ja2V0VHJhbnNwb3J0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsidXJsIiwidHJhbnNwb3J0TGlmZVRpbWVJblNlY29uZHMiXSxtZW1iZXJzOnt1cmw6e30sdHJhbnNwb3J0TGlmZVRpbWVJblNlY29uZHM6e3R5cGU6ImxvbmcifSxleHBpcnk6e319fSxjaGF0VG9rZW5UcmFuc3BvcnQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJwYXJ0aWNpcGFudFRva2VuIiwiZXhwaXJ5Il0sbWVtYmVyczp7cGFydGljaXBhbnRUb2tlbjp7fSxleHBpcnk6e319fSxzb2Z0cGhvbmVUcmFuc3BvcnQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJzb2Z0cGhvbmVNZWRpYUNvbm5lY3Rpb25zIl0sbWVtYmVyczp7c29mdHBob25lTWVkaWFDb25uZWN0aW9uczp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsidXNlcm5hbWUiLCJjcmVkZW50aWFsIiwidXJscyJdLG1lbWJlcnM6e3VzZXJuYW1lOnt9LGNyZWRlbnRpYWw6e30sdXJsczp7dHlwZToibGlzdCIsbWVtYmVyOnt9fX19fX19LGFnZW50RGlzY292ZXJ5VHJhbnNwb3J0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsicHJlc2lnbmVkVXJsIl0sbWVtYmVyczp7cHJlc2lnbmVkVXJsOnt9fX0sd2ViUlRDVHJhbnNwb3J0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsibWVldGluZyIsImF0dGVuZGVlIl0sbWVtYmVyczp7bWVldGluZzp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnttZWV0aW5nSWQ6e30sbWVkaWFSZWdpb246e30sbWVkaWFQbGFjZW1lbnQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YXVkaW9Ib3N0VXJsOnt9LGF1ZGlvRmFsbGJhY2tVcmw6e30sc2lnbmFsaW5nVXJsOnt9LHR1cm5Db250cm9sVXJsOnt9LGV2ZW50SW5nZXN0aW9uVXJsOnt9fX0sbWVldGluZ0ZlYXR1cmVzOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2F1ZGlvOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2VjaG9SZWR1Y3Rpb246e319fX19fX0sYXR0ZW5kZWU6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YXR0ZW5kZWVJZDp7fSxqb2luVG9rZW46e3R5cGU6InN0cmluZyIsc2Vuc2l0aXZlOiEwfX19fX19fX0sRGVzdHJveUNvbm5lY3Rpb246e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJjb25uZWN0aW9uSWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNvbm5lY3Rpb25JZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sR2V0QWdlbnRDb25maWd1cmF0aW9uOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29uZmlndXJhdGlvbiJdLG1lbWJlcnM6e2NvbmZpZ3VyYXRpb246e3NoYXBlOiJTMXEifX19fSxHZXRBZ2VudFBlcm1pc3Npb25zOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LG5leHRUb2tlbjp7fSxtYXhSZXN1bHRzOnt0eXBlOiJpbnRlZ2VyIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJwZXJtaXNzaW9ucyJdLG1lbWJlcnM6e3Blcm1pc3Npb25zOnt0eXBlOiJsaXN0IixtZW1iZXI6e319LG5leHRUb2tlbjp7fX19fSxHZXRBZ2VudFNuYXBzaG90OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LG5leHRUb2tlbjp7fSx0aW1lb3V0Ont0eXBlOiJsb25nIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJzbmFwc2hvdCIsIm5leHRUb2tlbiJdLG1lbWJlcnM6e3NuYXBzaG90Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsic3RhdGUiLCJjb250YWN0cyIsInNuYXBzaG90VGltZXN0YW1wIl0sbWVtYmVyczp7c3RhdGU6e3NoYXBlOiJTMjkifSxuZXh0U3RhdGU6e3NoYXBlOiJTMjkifSxhZ2VudEF2YWlsYWJpbGl0eVN0YXRlOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e3N0YXRlOnt9LHRpbWVTdGFtcDp7dHlwZToidGltZXN0YW1wIn19fSxjb250YWN0czp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29udGFjdElkIiwidHlwZSIsInN0YXRlIiwiY29ubmVjdGlvbnMiLCJhdHRyaWJ1dGVzIl0sbWVtYmVyczp7Y29udGFjdElkOnt9LGluaXRpYWxDb250YWN0SWQ6e30sdHlwZTp7fSxzdGF0ZTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInR5cGUiLCJ0aW1lc3RhbXAiXSxtZW1iZXJzOnt0eXBlOnt9LHRpbWVzdGFtcDp7dHlwZToidGltZXN0YW1wIn19fSxxdWV1ZTp7c2hhcGU6IlNrIn0scXVldWVUaW1lc3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9LGNvbm5lY3Rpb25zOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb25uZWN0aW9uSWQiLCJzdGF0ZSIsInR5cGUiLCJpbml0aWFsIl0sbWVtYmVyczp7Y29ubmVjdGlvbklkOnt9LGVuZHBvaW50OntzaGFwZToiU2UifSxzdGF0ZTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInR5cGUiLCJ0aW1lc3RhbXAiXSxtZW1iZXJzOnt0eXBlOnt9LHRpbWVzdGFtcDp7dHlwZToidGltZXN0YW1wIn19fSx0eXBlOnt9LGluaXRpYWw6e3R5cGU6ImJvb2xlYW4ifSxzb2Z0cGhvbmVNZWRpYUluZm86e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7Y2FsbFR5cGU6e30sYXV0b0FjY2VwdDp7dHlwZToiYm9vbGVhbiJ9LG1lZGlhTGVnQ29udGV4dFRva2VuOnt9LGNhbGxDb250ZXh0VG9rZW46e30sY2FsbENvbmZpZ0pzb246e319fSxjaGF0TWVkaWFJbmZvOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2NoYXRBdXRvQWNjZXB0Ont0eXBlOiJib29sZWFuIn0sY29ubmVjdGlvbkRhdGE6e30sY3VzdG9tZXJOYW1lOnt9fX0sbW9uaXRvcmluZ0luZm86e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YWdlbnQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YWdlbnROYW1lOnt9fX0sam9pblRpbWVTdGFtcDp7dHlwZToidGltZXN0YW1wIn19fSxtdXRlOnt0eXBlOiJib29sZWFuIn0sZm9yY2VkTXV0ZTp7dHlwZToiYm9vbGVhbiJ9LHF1aWNrQ29ubmVjdE5hbWU6e30sbW9uaXRvckNhcGFiaWxpdGllczp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxtb25pdG9yU3RhdHVzOnt9LGNhcGFiaWxpdGllczp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntWaWRlbzp7fX19fX19LGF0dHJpYnV0ZXM6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsibmFtZSJdLG1lbWJlcnM6e25hbWU6e30sdmFsdWU6e319fX0sY29udGFjdER1cmF0aW9uOnt9LG5hbWU6e30sZGVzY3JpcHRpb246e30scmVmZXJlbmNlczp7c2hhcGU6IlNyIn0saW5pdGlhdGlvbk1ldGhvZDp7fSxjb250YWN0RmVhdHVyZXM6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YXR0YWNobWVudHNFbmFibGVkOnt0eXBlOiJib29sZWFuIn0sbWVzc2FnaW5nTWFya2Rvd25FbmFibGVkOnt0eXBlOiJib29sZWFuIn0sbXVsdGlQYXJ0eUNvbmZlcmVuY2VFbmFibGVkOnt0eXBlOiJib29sZWFuIn0sc2NyZWVuUmVjb3JkaW5nRW5hYmxlZDp7dHlwZToiYm9vbGVhbiJ9LHNjcmVlblJlY29yZGluZ1N0YXRlOnt9LHNjcmVlblJlY29yZGluZ0NvbmZpZzp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntzY3JlZW5SZWNvcmRpbmdFbmFibGVkOnt0eXBlOiJib29sZWFuIn0sc2NyZWVuUmVjb3JkaW5nU3RhdGU6e319fX19LGNoYW5uZWxDb250ZXh0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e3NjaGVkdWxlZFRpbWU6e3R5cGU6ImxvbmcifSx0YXNrVGVtcGxhdGVJZDp7fSx0YXNrVGVtcGxhdGVWZXJzaW9uOnt0eXBlOiJpbnRlZ2VyIn19fSxzZWdtZW50QXR0cmlidXRlczp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7VmFsdWVTdHJpbmc6e319fX19fX0sc25hcHNob3RUaW1lc3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9fX0sbmV4dFRva2VuOnt9fX19LEdldEFnZW50U3RhdGVzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LG5leHRUb2tlbjp7fSxtYXhSZXN1bHRzOnt0eXBlOiJpbnRlZ2VyIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJzdGF0ZXMiXSxtZW1iZXJzOntzdGF0ZXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7c2hhcGU6IlMyOSJ9fSxuZXh0VG9rZW46e319fX0sR2V0RGlhbGFibGVDb3VudHJ5Q29kZXM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sbmV4dFRva2VuOnt9LG1heFJlc3VsdHM6e3R5cGU6ImludGVnZXIifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvdW50cnlDb2RlcyJdLG1lbWJlcnM6e2NvdW50cnlDb2Rlczp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxuZXh0VG9rZW46e319fX0sR2V0RW5kcG9pbnRzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwicXVldWVBUk5zIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LHF1ZXVlQVJOczp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxuZXh0VG9rZW46e30sbWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2VuZHBvaW50czp7dHlwZToibGlzdCIsbWVtYmVyOntzaGFwZToiU2UifX0sbmV4dFRva2VuOnt9fX19LEdldE5ld0F1dGhUb2tlbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsInJlZnJlc2hUb2tlbiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxyZWZyZXNoVG9rZW46e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7bmV3QXV0aFRva2VuOnt9LGV4cGlyYXRpb25EYXRlVGltZTp7dHlwZToidGltZXN0YW1wIn19fX0sR2V0Um91dGluZ1Byb2ZpbGVRdWV1ZXM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJyb3V0aW5nUHJvZmlsZUFSTiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxyb3V0aW5nUHJvZmlsZUFSTjp7fSxuZXh0VG9rZW46e30sbWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsicXVldWVzIl0sbWVtYmVyczp7cXVldWVzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3NoYXBlOiJTayJ9fSxuZXh0VG9rZW46e319fX0sSG9sZENvbm5lY3Rpb246e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJjb25uZWN0aW9uSWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNvbm5lY3Rpb25JZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sTXV0ZVBhcnRpY2lwYW50OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LE5vdGlmeUNvbnRhY3RJc3N1ZTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb250YWN0SWQ6e30saXNzdWVDb2RlOnt9LGRlc2NyaXB0aW9uOnt9LGNsaWVudExvZ3M6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFBhdXNlQ29udGFjdDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb250YWN0SWQiXSxtZW1iZXJzOntjb250YWN0SWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFB1dEFnZW50U3RhdGU6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJzdGF0ZSJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxzdGF0ZTp7c2hhcGU6IlMyOSJ9LGVucXVldWVOZXh0U3RhdGU6e3R5cGU6ImJvb2xlYW4ifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sUmVqZWN0Q29udGFjdDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb250YWN0SWQiXSxtZW1iZXJzOntjb250YWN0SWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFJlc3VtZUNvbm5lY3Rpb246e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJjb25uZWN0aW9uSWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNvbm5lY3Rpb25JZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sUmVzdW1lQ29udGFjdDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb250YWN0SWQiXSxtZW1iZXJzOntjb250YWN0SWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFNlbmRDbGllbnRMb2dzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwibG9nRXZlbnRzIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGxvZ0V2ZW50czp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e3RpbWVzdGFtcDp7dHlwZToidGltZXN0YW1wIn0sY29tcG9uZW50Ont9LG1lc3NhZ2U6e319fX19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFNlbmREaWdpdHM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJjb25uZWN0aW9uSWQiLCJkaWdpdHMiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNvbm5lY3Rpb25JZDp7fSxkaWdpdHM6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFNlbmRTb2Z0cGhvbmVDYWxsTWV0cmljczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCIsInNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3MiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNjcFZlcnNpb246e30sc29mdHBob25lU3RyZWFtU3RhdGlzdGljczp7c2hhcGU6IlM0ZiJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxTZW5kU29mdHBob25lQ2FsbFJlcG9ydDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCIsInJlcG9ydCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb250YWN0SWQ6e30sY2NwVmVyc2lvbjp7fSxyZXBvcnQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7Y2FsbFN0YXJ0VGltZTp7dHlwZToidGltZXN0YW1wIn0sY2FsbEVuZFRpbWU6e3R5cGU6InRpbWVzdGFtcCJ9LHNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3M6e3NoYXBlOiJTNGYifSxndW1UaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0saW5pdGlhbGl6YXRpb25UaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0saWNlQ29sbGVjdGlvblRpbWVNaWxsaXM6e3R5cGU6ImxvbmcifSxzaWduYWxsaW5nQ29ubmVjdFRpbWVNaWxsaXM6e3R5cGU6ImxvbmcifSxoYW5kc2hha2VUaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0scHJlVGFsa1RpbWVNaWxsaXM6e3R5cGU6ImxvbmcifSx0YWxrVGltZU1pbGxpczp7dHlwZToibG9uZyJ9LGNsZWFudXBUaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0saWNlQ29sbGVjdGlvbkZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSxzaWduYWxsaW5nQ29ubmVjdGlvbkZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSxoYW5kc2hha2VGYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sZ3VtT3RoZXJGYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sZ3VtVGltZW91dEZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSxjcmVhdGVPZmZlckZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSxzZXRMb2NhbERlc2NyaXB0aW9uRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LHVzZXJCdXN5RmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LGludmFsaWRSZW1vdGVTRFBGYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sbm9SZW1vdGVJY2VDYW5kaWRhdGVGYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sc2V0UmVtb3RlRGVzY3JpcHRpb25GYWlsdXJlOnt0eXBlOiJib29sZWFuIn19fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sVG9nZ2xlQWN0aXZlQ29ubmVjdGlvbnM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJjb25uZWN0aW9uSWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNvbm5lY3Rpb25JZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sVW5tdXRlUGFydGljaXBhbnQ6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJjb25uZWN0aW9uSWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNvbm5lY3Rpb25JZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sVXBkYXRlQWdlbnRDb25maWd1cmF0aW9uOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29uZmlndXJhdGlvbiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb25maWd1cmF0aW9uOntzaGFwZToiUzFxIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFVwZGF0ZU1vbml0b3JQYXJ0aWNpcGFudFN0YXRlOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvbnRhY3RJZCIsInRhcmdldE1vbml0b3JNb2RlIl0sbWVtYmVyczp7Y29udGFjdElkOnt9LHRhcmdldE1vbml0b3JNb2RlOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fX0sc2hhcGVzOntTMjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnthZ2VudEFSTjp7fSxhdXRoVG9rZW46e319fSxTZTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInR5cGUiXSxtZW1iZXJzOntlbmRwb2ludEFSTjp7fSx0eXBlOnt9LG5hbWU6e30scGhvbmVOdW1iZXI6e30sYWdlbnRMb2dpbjp7fSxxdWV1ZTp7c2hhcGU6IlNrIn19fSxTazp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntxdWV1ZUFSTjp7fSxuYW1lOnt9fX0sU3I6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsidmFsdWUiLCJ0eXBlIl0sbWVtYmVyczp7dmFsdWU6e30sdHlwZTp7fX19fSxTMXE6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJuYW1lIiwic29mdHBob25lRW5hYmxlZCIsInNvZnRwaG9uZUF1dG9BY2NlcHQiLCJleHRlbnNpb24iLCJyb3V0aW5nUHJvZmlsZSJdLG1lbWJlcnM6e25hbWU6e30sdXNlcm5hbWU6e30sc29mdHBob25lRW5hYmxlZDp7dHlwZToiYm9vbGVhbiJ9LHNvZnRwaG9uZUF1dG9BY2NlcHQ6e3R5cGU6ImJvb2xlYW4ifSxleHRlbnNpb246e30scm91dGluZ1Byb2ZpbGU6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7bmFtZTp7fSxyb3V0aW5nUHJvZmlsZUFSTjp7fSxkZWZhdWx0T3V0Ym91bmRRdWV1ZTp7c2hhcGU6IlNrIn0sY2hhbm5lbENvbmN1cnJlbmN5TWFwOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7dHlwZToibG9uZyJ9fX19LGFnZW50UHJlZmVyZW5jZXM6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt9fSxhZ2VudEFSTjp7fX19LFMyOTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInR5cGUiLCJuYW1lIl0sbWVtYmVyczp7YWdlbnRTdGF0ZUFSTjp7fSx0eXBlOnt9LG5hbWU6e30sc3RhcnRUaW1lc3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9fX0sUzRmOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7dGltZXN0YW1wOnt0eXBlOiJ0aW1lc3RhbXAifSxzb2Z0cGhvbmVTdHJlYW1UeXBlOnt9LHBhY2tldENvdW50Ont0eXBlOiJsb25nIn0scGFja2V0c0xvc3Q6e3R5cGU6ImxvbmcifSxhdWRpb0xldmVsOnt0eXBlOiJkb3VibGUifSxqaXR0ZXJCdWZmZXJNaWxsaXM6e3R5cGU6ImxvbmcifSxyb3VuZFRyaXBUaW1lTWlsbGlzOnt0eXBlOiJsb25nIn19fX19fX0se31dLDQ6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e2FjbTp7bmFtZToiQUNNIixjb3JzOiEwfSxhcGlnYXRld2F5OntuYW1lOiJBUElHYXRld2F5Iixjb3JzOiEwfSxhcHBsaWNhdGlvbmF1dG9zY2FsaW5nOntwcmVmaXg6ImFwcGxpY2F0aW9uLWF1dG9zY2FsaW5nIixuYW1lOiJBcHBsaWNhdGlvbkF1dG9TY2FsaW5nIixjb3JzOiEwfSxhcHBzdHJlYW06e25hbWU6IkFwcFN0cmVhbSJ9LGF1dG9zY2FsaW5nOntuYW1lOiJBdXRvU2NhbGluZyIsY29yczohMH0sYmF0Y2g6e25hbWU6IkJhdGNoIn0sYnVkZ2V0czp7bmFtZToiQnVkZ2V0cyJ9LGNsb3VkZGlyZWN0b3J5OntuYW1lOiJDbG91ZERpcmVjdG9yeSIsdmVyc2lvbnM6WyIyMDE2LTA1LTEwKiJdfSxjbG91ZGZvcm1hdGlvbjp7bmFtZToiQ2xvdWRGb3JtYXRpb24iLGNvcnM6ITB9LGNsb3VkZnJvbnQ6e25hbWU6IkNsb3VkRnJvbnQiLHZlcnNpb25zOlsiMjAxMy0wNS0xMioiLCIyMDEzLTExLTExKiIsIjIwMTQtMDUtMzEqIiwiMjAxNC0xMC0yMSoiLCIyMDE0LTExLTA2KiIsIjIwMTUtMDQtMTcqIiwiMjAxNS0wNy0yNyoiLCIyMDE1LTA5LTE3KiIsIjIwMTYtMDEtMTMqIiwiMjAxNi0wMS0yOCoiLCIyMDE2LTA4LTAxKiIsIjIwMTYtMDgtMjAqIiwiMjAxNi0wOS0wNyoiLCIyMDE2LTA5LTI5KiIsIjIwMTYtMTEtMjUqIiwiMjAxNy0wMy0yNSoiLCIyMDE3LTEwLTMwKiIsIjIwMTgtMDYtMTgqIiwiMjAxOC0xMS0wNSoiLCIyMDE5LTAzLTI2KiJdLGNvcnM6ITB9LGNsb3VkaHNtOntuYW1lOiJDbG91ZEhTTSIsY29yczohMH0sY2xvdWRzZWFyY2g6e25hbWU6IkNsb3VkU2VhcmNoIn0sY2xvdWRzZWFyY2hkb21haW46e25hbWU6IkNsb3VkU2VhcmNoRG9tYWluIn0sY2xvdWR0cmFpbDp7bmFtZToiQ2xvdWRUcmFpbCIsY29yczohMH0sY2xvdWR3YXRjaDp7cHJlZml4OiJtb25pdG9yaW5nIixuYW1lOiJDbG91ZFdhdGNoIixjb3JzOiEwfSxjbG91ZHdhdGNoZXZlbnRzOntwcmVmaXg6ImV2ZW50cyIsbmFtZToiQ2xvdWRXYXRjaEV2ZW50cyIsdmVyc2lvbnM6WyIyMDE0LTAyLTAzKiJdLGNvcnM6ITB9LGNsb3Vkd2F0Y2hsb2dzOntwcmVmaXg6ImxvZ3MiLG5hbWU6IkNsb3VkV2F0Y2hMb2dzIixjb3JzOiEwfSxjb2RlYnVpbGQ6e25hbWU6IkNvZGVCdWlsZCIsY29yczohMH0sY29kZWNvbW1pdDp7bmFtZToiQ29kZUNvbW1pdCIsY29yczohMH0sY29kZWRlcGxveTp7bmFtZToiQ29kZURlcGxveSIsY29yczohMH0sY29kZXBpcGVsaW5lOntuYW1lOiJDb2RlUGlwZWxpbmUiLGNvcnM6ITB9LGNvZ25pdG9pZGVudGl0eTp7cHJlZml4OiJjb2duaXRvLWlkZW50aXR5IixuYW1lOiJDb2duaXRvSWRlbnRpdHkiLGNvcnM6ITB9LGNvZ25pdG9pZGVudGl0eXNlcnZpY2Vwcm92aWRlcjp7cHJlZml4OiJjb2duaXRvLWlkcCIsbmFtZToiQ29nbml0b0lkZW50aXR5U2VydmljZVByb3ZpZGVyIixjb3JzOiEwfSxjb2duaXRvc3luYzp7cHJlZml4OiJjb2duaXRvLXN5bmMiLG5hbWU6IkNvZ25pdG9TeW5jIixjb3JzOiEwfSxjb25maWdzZXJ2aWNlOntwcmVmaXg6ImNvbmZpZyIsbmFtZToiQ29uZmlnU2VydmljZSIsY29yczohMH0sY3VyOntuYW1lOiJDVVIiLGNvcnM6ITB9LGRhdGFwaXBlbGluZTp7bmFtZToiRGF0YVBpcGVsaW5lIn0sZGV2aWNlZmFybTp7bmFtZToiRGV2aWNlRmFybSIsY29yczohMH0sZGlyZWN0Y29ubmVjdDp7bmFtZToiRGlyZWN0Q29ubmVjdCIsY29yczohMH0sZGlyZWN0b3J5c2VydmljZTp7cHJlZml4OiJkcyIsbmFtZToiRGlyZWN0b3J5U2VydmljZSJ9LGRpc2NvdmVyeTp7bmFtZToiRGlzY292ZXJ5In0sZG1zOntuYW1lOiJETVMifSxkeW5hbW9kYjp7bmFtZToiRHluYW1vREIiLGNvcnM6ITB9LGR5bmFtb2Ric3RyZWFtczp7cHJlZml4OiJzdHJlYW1zLmR5bmFtb2RiIixuYW1lOiJEeW5hbW9EQlN0cmVhbXMiLGNvcnM6ITB9LGVjMjp7bmFtZToiRUMyIix2ZXJzaW9uczpbIjIwMTMtMDYtMTUqIiwiMjAxMy0xMC0xNSoiLCIyMDE0LTAyLTAxKiIsIjIwMTQtMDUtMDEqIiwiMjAxNC0wNi0xNSoiLCIyMDE0LTA5LTAxKiIsIjIwMTQtMTAtMDEqIiwiMjAxNS0wMy0wMSoiLCIyMDE1LTA0LTE1KiIsIjIwMTUtMTAtMDEqIiwiMjAxNi0wNC0wMSoiLCIyMDE2LTA5LTE1KiJdLGNvcnM6ITB9LGVjcjp7bmFtZToiRUNSIixjb3JzOiEwfSxlY3M6e25hbWU6IkVDUyIsY29yczohMH0sZWZzOntwcmVmaXg6ImVsYXN0aWNmaWxlc3lzdGVtIixuYW1lOiJFRlMiLGNvcnM6ITB9LGVsYXN0aWNhY2hlOntuYW1lOiJFbGFzdGlDYWNoZSIsdmVyc2lvbnM6WyIyMDEyLTExLTE1KiIsIjIwMTQtMDMtMjQqIiwiMjAxNC0wNy0xNSoiLCIyMDE0LTA5LTMwKiJdLGNvcnM6ITB9LGVsYXN0aWNiZWFuc3RhbGs6e25hbWU6IkVsYXN0aWNCZWFuc3RhbGsiLGNvcnM6ITB9LGVsYjp7cHJlZml4OiJlbGFzdGljbG9hZGJhbGFuY2luZyIsbmFtZToiRUxCIixjb3JzOiEwfSxlbGJ2Mjp7cHJlZml4OiJlbGFzdGljbG9hZGJhbGFuY2luZ3YyIixuYW1lOiJFTEJ2MiIsY29yczohMH0sZW1yOntwcmVmaXg6ImVsYXN0aWNtYXByZWR1Y2UiLG5hbWU6IkVNUiIsY29yczohMH0sZXM6e25hbWU6IkVTIn0sZWxhc3RpY3RyYW5zY29kZXI6e25hbWU6IkVsYXN0aWNUcmFuc2NvZGVyIixjb3JzOiEwfSxmaXJlaG9zZTp7bmFtZToiRmlyZWhvc2UiLGNvcnM6ITB9LGdhbWVsaWZ0OntuYW1lOiJHYW1lTGlmdCIsY29yczohMH0sZ2xhY2llcjp7bmFtZToiR2xhY2llciJ9LGhlYWx0aDp7bmFtZToiSGVhbHRoIn0saWFtOntuYW1lOiJJQU0iLGNvcnM6ITB9LGltcG9ydGV4cG9ydDp7bmFtZToiSW1wb3J0RXhwb3J0In0saW5zcGVjdG9yOntuYW1lOiJJbnNwZWN0b3IiLHZlcnNpb25zOlsiMjAxNS0wOC0xOCoiXSxjb3JzOiEwfSxpb3Q6e25hbWU6IklvdCIsY29yczohMH0saW90ZGF0YTp7cHJlZml4OiJpb3QtZGF0YSIsbmFtZToiSW90RGF0YSIsY29yczohMH0sa2luZXNpczp7bmFtZToiS2luZXNpcyIsY29yczohMH0sa2luZXNpc2FuYWx5dGljczp7bmFtZToiS2luZXNpc0FuYWx5dGljcyJ9LGttczp7bmFtZToiS01TIixjb3JzOiEwfSxsYW1iZGE6e25hbWU6IkxhbWJkYSIsY29yczohMH0sbGV4cnVudGltZTp7cHJlZml4OiJydW50aW1lLmxleCIsbmFtZToiTGV4UnVudGltZSIsY29yczohMH0sbGlnaHRzYWlsOntuYW1lOiJMaWdodHNhaWwifSxtYWNoaW5lbGVhcm5pbmc6e25hbWU6Ik1hY2hpbmVMZWFybmluZyIsY29yczohMH0sbWFya2V0cGxhY2Vjb21tZXJjZWFuYWx5dGljczp7bmFtZToiTWFya2V0cGxhY2VDb21tZXJjZUFuYWx5dGljcyIsY29yczohMH0sbWFya2V0cGxhY2VtZXRlcmluZzp7cHJlZml4OiJtZXRlcmluZ21hcmtldHBsYWNlIixuYW1lOiJNYXJrZXRwbGFjZU1ldGVyaW5nIn0sbXR1cms6e3ByZWZpeDoibXR1cmstcmVxdWVzdGVyIixuYW1lOiJNVHVyayIsY29yczohMH0sbW9iaWxlYW5hbHl0aWNzOntuYW1lOiJNb2JpbGVBbmFseXRpY3MiLGNvcnM6ITB9LG9wc3dvcmtzOntuYW1lOiJPcHNXb3JrcyIsY29yczohMH0sb3Bzd29ya3NjbTp7bmFtZToiT3BzV29ya3NDTSJ9LG9yZ2FuaXphdGlvbnM6e25hbWU6Ik9yZ2FuaXphdGlvbnMifSxwaW5wb2ludDp7bmFtZToiUGlucG9pbnQifSxwb2xseTp7bmFtZToiUG9sbHkiLGNvcnM6ITB9LHJkczp7bmFtZToiUkRTIix2ZXJzaW9uczpbIjIwMTQtMDktMDEqIl0sY29yczohMH0scmVkc2hpZnQ6e25hbWU6IlJlZHNoaWZ0Iixjb3JzOiEwfSxyZWtvZ25pdGlvbjp7bmFtZToiUmVrb2duaXRpb24iLGNvcnM6ITB9LHJlc291cmNlZ3JvdXBzdGFnZ2luZ2FwaTp7bmFtZToiUmVzb3VyY2VHcm91cHNUYWdnaW5nQVBJIn0scm91dGU1Mzp7bmFtZToiUm91dGU1MyIsY29yczohMH0scm91dGU1M2RvbWFpbnM6e25hbWU6IlJvdXRlNTNEb21haW5zIixjb3JzOiEwfSxzMzp7bmFtZToiUzMiLGR1YWxzdGFja0F2YWlsYWJsZTohMCxjb3JzOiEwfSxzM2NvbnRyb2w6e25hbWU6IlMzQ29udHJvbCIsZHVhbHN0YWNrQXZhaWxhYmxlOiEwLHhtbE5vRGVmYXVsdExpc3RzOiEwfSxzZXJ2aWNlY2F0YWxvZzp7bmFtZToiU2VydmljZUNhdGFsb2ciLGNvcnM6ITB9LHNlczp7cHJlZml4OiJlbWFpbCIsbmFtZToiU0VTIixjb3JzOiEwfSxzaGllbGQ6e25hbWU6IlNoaWVsZCJ9LHNpbXBsZWRiOntwcmVmaXg6InNkYiIsbmFtZToiU2ltcGxlREIifSxzbXM6e25hbWU6IlNNUyJ9LHNub3diYWxsOntuYW1lOiJTbm93YmFsbCJ9LHNuczp7bmFtZToiU05TIixjb3JzOiEwfSxzcXM6e25hbWU6IlNRUyIsY29yczohMH0sc3NtOntuYW1lOiJTU00iLGNvcnM6ITB9LHN0b3JhZ2VnYXRld2F5OntuYW1lOiJTdG9yYWdlR2F0ZXdheSIsY29yczohMH0sc3RlcGZ1bmN0aW9uczp7cHJlZml4OiJzdGF0ZXMiLG5hbWU6IlN0ZXBGdW5jdGlvbnMifSxzdHM6e25hbWU6IlNUUyIsY29yczohMH0sc3VwcG9ydDp7bmFtZToiU3VwcG9ydCJ9LHN3Zjp7bmFtZToiU1dGIn0seHJheTp7bmFtZToiWFJheSIsY29yczohMH0sd2FmOntuYW1lOiJXQUYiLGNvcnM6ITB9LHdhZnJlZ2lvbmFsOntwcmVmaXg6IndhZi1yZWdpb25hbCIsbmFtZToiV0FGUmVnaW9uYWwifSx3b3JrZG9jczp7bmFtZToiV29ya0RvY3MiLGNvcnM6ITB9LHdvcmtzcGFjZXM6e25hbWU6IldvcmtTcGFjZXMifSxjb2Rlc3Rhcjp7bmFtZToiQ29kZVN0YXIifSxsZXhtb2RlbGJ1aWxkaW5nc2VydmljZTp7cHJlZml4OiJsZXgtbW9kZWxzIixuYW1lOiJMZXhNb2RlbEJ1aWxkaW5nU2VydmljZSIsY29yczohMH0sbWFya2V0cGxhY2VlbnRpdGxlbWVudHNlcnZpY2U6e3ByZWZpeDoiZW50aXRsZW1lbnQubWFya2V0cGxhY2UiLG5hbWU6Ik1hcmtldHBsYWNlRW50aXRsZW1lbnRTZXJ2aWNlIn0sYXRoZW5hOntuYW1lOiJBdGhlbmEiLGNvcnM6ITB9LGdyZWVuZ3Jhc3M6e25hbWU6IkdyZWVuZ3Jhc3MifSxkYXg6e25hbWU6IkRBWCJ9LG1pZ3JhdGlvbmh1Yjp7cHJlZml4OiJBV1NNaWdyYXRpb25IdWIiLG5hbWU6Ik1pZ3JhdGlvbkh1YiJ9LGNsb3VkaHNtdjI6e25hbWU6IkNsb3VkSFNNVjIiLGNvcnM6ITB9LGdsdWU6e25hbWU6IkdsdWUifSxtb2JpbGU6e25hbWU6Ik1vYmlsZSJ9LHByaWNpbmc6e25hbWU6IlByaWNpbmciLGNvcnM6ITB9LGNvc3RleHBsb3Jlcjp7cHJlZml4OiJjZSIsbmFtZToiQ29zdEV4cGxvcmVyIixjb3JzOiEwfSxtZWRpYWNvbnZlcnQ6e25hbWU6Ik1lZGlhQ29udmVydCJ9LG1lZGlhbGl2ZTp7bmFtZToiTWVkaWFMaXZlIn0sbWVkaWFwYWNrYWdlOntuYW1lOiJNZWRpYVBhY2thZ2UifSxtZWRpYXN0b3JlOntuYW1lOiJNZWRpYVN0b3JlIn0sbWVkaWFzdG9yZWRhdGE6e3ByZWZpeDoibWVkaWFzdG9yZS1kYXRhIixuYW1lOiJNZWRpYVN0b3JlRGF0YSIsY29yczohMH0sYXBwc3luYzp7bmFtZToiQXBwU3luYyJ9LGd1YXJkZHV0eTp7bmFtZToiR3VhcmREdXR5In0sbXE6e25hbWU6Ik1RIn0sY29tcHJlaGVuZDp7bmFtZToiQ29tcHJlaGVuZCIsY29yczohMH0saW90am9ic2RhdGFwbGFuZTp7cHJlZml4OiJpb3Qtam9icy1kYXRhIixuYW1lOiJJb1RKb2JzRGF0YVBsYW5lIn0sa2luZXNpc3ZpZGVvYXJjaGl2ZWRtZWRpYTp7cHJlZml4OiJraW5lc2lzLXZpZGVvLWFyY2hpdmVkLW1lZGlhIixuYW1lOiJLaW5lc2lzVmlkZW9BcmNoaXZlZE1lZGlhIixjb3JzOiEwfSxraW5lc2lzdmlkZW9tZWRpYTp7cHJlZml4OiJraW5lc2lzLXZpZGVvLW1lZGlhIixuYW1lOiJLaW5lc2lzVmlkZW9NZWRpYSIsY29yczohMH0sa2luZXNpc3ZpZGVvOntuYW1lOiJLaW5lc2lzVmlkZW8iLGNvcnM6ITB9LHNhZ2VtYWtlcnJ1bnRpbWU6e3ByZWZpeDoicnVudGltZS5zYWdlbWFrZXIiLG5hbWU6IlNhZ2VNYWtlclJ1bnRpbWUifSxzYWdlbWFrZXI6e25hbWU6IlNhZ2VNYWtlciJ9LHRyYW5zbGF0ZTp7bmFtZToiVHJhbnNsYXRlIixjb3JzOiEwfSxyZXNvdXJjZWdyb3Vwczp7cHJlZml4OiJyZXNvdXJjZS1ncm91cHMiLG5hbWU6IlJlc291cmNlR3JvdXBzIixjb3JzOiEwfSxhbGV4YWZvcmJ1c2luZXNzOntuYW1lOiJBbGV4YUZvckJ1c2luZXNzIn0sY2xvdWQ5OntuYW1lOiJDbG91ZDkifSxzZXJ2ZXJsZXNzYXBwbGljYXRpb25yZXBvc2l0b3J5OntwcmVmaXg6InNlcnZlcmxlc3NyZXBvIixuYW1lOiJTZXJ2ZXJsZXNzQXBwbGljYXRpb25SZXBvc2l0b3J5In0sc2VydmljZWRpc2NvdmVyeTp7bmFtZToiU2VydmljZURpc2NvdmVyeSJ9LHdvcmttYWlsOntuYW1lOiJXb3JrTWFpbCJ9LGF1dG9zY2FsaW5ncGxhbnM6e3ByZWZpeDoiYXV0b3NjYWxpbmctcGxhbnMiLG5hbWU6IkF1dG9TY2FsaW5nUGxhbnMifSx0cmFuc2NyaWJlc2VydmljZTp7cHJlZml4OiJ0cmFuc2NyaWJlIixuYW1lOiJUcmFuc2NyaWJlU2VydmljZSJ9LGNvbm5lY3Q6e25hbWU6IkNvbm5lY3QiLGNvcnM6ITB9LGFjbXBjYTp7cHJlZml4OiJhY20tcGNhIixuYW1lOiJBQ01QQ0EifSxmbXM6e25hbWU6IkZNUyJ9LHNlY3JldHNtYW5hZ2VyOntuYW1lOiJTZWNyZXRzTWFuYWdlciIsY29yczohMH0saW90YW5hbHl0aWNzOntuYW1lOiJJb1RBbmFseXRpY3MiLGNvcnM6ITB9LGlvdDFjbGlja2RldmljZXNzZXJ2aWNlOntwcmVmaXg6ImlvdDFjbGljay1kZXZpY2VzIixuYW1lOiJJb1QxQ2xpY2tEZXZpY2VzU2VydmljZSJ9LGlvdDFjbGlja3Byb2plY3RzOntwcmVmaXg6ImlvdDFjbGljay1wcm9qZWN0cyIsbmFtZToiSW9UMUNsaWNrUHJvamVjdHMifSxwaTp7bmFtZToiUEkifSxuZXB0dW5lOntuYW1lOiJOZXB0dW5lIn0sbWVkaWF0YWlsb3I6e25hbWU6Ik1lZGlhVGFpbG9yIn0sZWtzOntuYW1lOiJFS1MifSxtYWNpZTp7bmFtZToiTWFjaWUifSxkbG06e25hbWU6IkRMTSJ9LHNpZ25lcjp7bmFtZToiU2lnbmVyIn0sY2hpbWU6e25hbWU6IkNoaW1lIn0scGlucG9pbnRlbWFpbDp7cHJlZml4OiJwaW5wb2ludC1lbWFpbCIsbmFtZToiUGlucG9pbnRFbWFpbCJ9LHJhbTp7bmFtZToiUkFNIn0scm91dGU1M3Jlc29sdmVyOntuYW1lOiJSb3V0ZTUzUmVzb2x2ZXIifSxwaW5wb2ludHNtc3ZvaWNlOntwcmVmaXg6InNtcy12b2ljZSIsbmFtZToiUGlucG9pbnRTTVNWb2ljZSJ9LHF1aWNrc2lnaHQ6e25hbWU6IlF1aWNrU2lnaHQifSxyZHNkYXRhc2VydmljZTp7cHJlZml4OiJyZHMtZGF0YSIsbmFtZToiUkRTRGF0YVNlcnZpY2UifSxhbXBsaWZ5OntuYW1lOiJBbXBsaWZ5In0sZGF0YXN5bmM6e25hbWU6IkRhdGFTeW5jIn0scm9ib21ha2VyOntuYW1lOiJSb2JvTWFrZXIifSx0cmFuc2Zlcjp7bmFtZToiVHJhbnNmZXIifSxnbG9iYWxhY2NlbGVyYXRvcjp7bmFtZToiR2xvYmFsQWNjZWxlcmF0b3IifSxjb21wcmVoZW5kbWVkaWNhbDp7bmFtZToiQ29tcHJlaGVuZE1lZGljYWwiLGNvcnM6ITB9LGtpbmVzaXNhbmFseXRpY3N2Mjp7bmFtZToiS2luZXNpc0FuYWx5dGljc1YyIn0sbWVkaWFjb25uZWN0OntuYW1lOiJNZWRpYUNvbm5lY3QifSxmc3g6e25hbWU6IkZTeCJ9LHNlY3VyaXR5aHViOntuYW1lOiJTZWN1cml0eUh1YiJ9LGFwcG1lc2g6e25hbWU6IkFwcE1lc2giLHZlcnNpb25zOlsiMjAxOC0xMC0wMSoiXX0sbGljZW5zZW1hbmFnZXI6e3ByZWZpeDoibGljZW5zZS1tYW5hZ2VyIixuYW1lOiJMaWNlbnNlTWFuYWdlciJ9LGthZmthOntuYW1lOiJLYWZrYSJ9LGFwaWdhdGV3YXltYW5hZ2VtZW50YXBpOntuYW1lOiJBcGlHYXRld2F5TWFuYWdlbWVudEFwaSJ9LGFwaWdhdGV3YXl2Mjp7bmFtZToiQXBpR2F0ZXdheVYyIn0sZG9jZGI6e25hbWU6IkRvY0RCIn0sYmFja3VwOntuYW1lOiJCYWNrdXAifSx3b3JrbGluazp7bmFtZToiV29ya0xpbmsifSx0ZXh0cmFjdDp7bmFtZToiVGV4dHJhY3QifSxtYW5hZ2VkYmxvY2tjaGFpbjp7bmFtZToiTWFuYWdlZEJsb2NrY2hhaW4ifSxtZWRpYXBhY2thZ2V2b2Q6e3ByZWZpeDoibWVkaWFwYWNrYWdlLXZvZCIsbmFtZToiTWVkaWFQYWNrYWdlVm9kIn0sZ3JvdW5kc3RhdGlvbjp7bmFtZToiR3JvdW5kU3RhdGlvbiJ9LGlvdHRoaW5nc2dyYXBoOntuYW1lOiJJb1RUaGluZ3NHcmFwaCJ9LGlvdGV2ZW50czp7bmFtZToiSW9URXZlbnRzIn0saW90ZXZlbnRzZGF0YTp7cHJlZml4OiJpb3RldmVudHMtZGF0YSIsbmFtZToiSW9URXZlbnRzRGF0YSJ9LHBlcnNvbmFsaXplOntuYW1lOiJQZXJzb25hbGl6ZSIsY29yczohMH0scGVyc29uYWxpemVldmVudHM6e3ByZWZpeDoicGVyc29uYWxpemUtZXZlbnRzIixuYW1lOiJQZXJzb25hbGl6ZUV2ZW50cyIsY29yczohMH0scGVyc29uYWxpemVydW50aW1lOntwcmVmaXg6InBlcnNvbmFsaXplLXJ1bnRpbWUiLG5hbWU6IlBlcnNvbmFsaXplUnVudGltZSIsY29yczohMH0sYXBwbGljYXRpb25pbnNpZ2h0czp7cHJlZml4OiJhcHBsaWNhdGlvbi1pbnNpZ2h0cyIsbmFtZToiQXBwbGljYXRpb25JbnNpZ2h0cyJ9LHNlcnZpY2VxdW90YXM6e3ByZWZpeDoic2VydmljZS1xdW90YXMiLG5hbWU6IlNlcnZpY2VRdW90YXMifSxlYzJpbnN0YW5jZWNvbm5lY3Q6e3ByZWZpeDoiZWMyLWluc3RhbmNlLWNvbm5lY3QiLG5hbWU6IkVDMkluc3RhbmNlQ29ubmVjdCJ9LGV2ZW50YnJpZGdlOntuYW1lOiJFdmVudEJyaWRnZSJ9LGxha2Vmb3JtYXRpb246e25hbWU6Ikxha2VGb3JtYXRpb24ifSxmb3JlY2FzdHNlcnZpY2U6e3ByZWZpeDoiZm9yZWNhc3QiLG5hbWU6IkZvcmVjYXN0U2VydmljZSIsY29yczohMH0sZm9yZWNhc3RxdWVyeXNlcnZpY2U6e3ByZWZpeDoiZm9yZWNhc3RxdWVyeSIsbmFtZToiRm9yZWNhc3RRdWVyeVNlcnZpY2UiLGNvcnM6ITB9LHFsZGI6e25hbWU6IlFMREIifSxxbGRic2Vzc2lvbjp7cHJlZml4OiJxbGRiLXNlc3Npb24iLG5hbWU6IlFMREJTZXNzaW9uIn0sd29ya21haWxtZXNzYWdlZmxvdzp7bmFtZToiV29ya01haWxNZXNzYWdlRmxvdyJ9LGNvZGVzdGFybm90aWZpY2F0aW9uczp7cHJlZml4OiJjb2Rlc3Rhci1ub3RpZmljYXRpb25zIixuYW1lOiJDb2RlU3Rhck5vdGlmaWNhdGlvbnMifSxzYXZpbmdzcGxhbnM6e25hbWU6IlNhdmluZ3NQbGFucyJ9LHNzbzp7bmFtZToiU1NPIn0sc3Nvb2lkYzp7cHJlZml4OiJzc28tb2lkYyIsbmFtZToiU1NPT0lEQyJ9LG1hcmtldHBsYWNlY2F0YWxvZzp7cHJlZml4OiJtYXJrZXRwbGFjZS1jYXRhbG9nIixuYW1lOiJNYXJrZXRwbGFjZUNhdGFsb2ciLGNvcnM6ITB9LGRhdGFleGNoYW5nZTp7bmFtZToiRGF0YUV4Y2hhbmdlIn0sc2VzdjI6e25hbWU6IlNFU1YyIn0sbWlncmF0aW9uaHViY29uZmlnOntwcmVmaXg6Im1pZ3JhdGlvbmh1Yi1jb25maWciLG5hbWU6Ik1pZ3JhdGlvbkh1YkNvbmZpZyJ9LGNvbm5lY3RwYXJ0aWNpcGFudDp7bmFtZToiQ29ubmVjdFBhcnRpY2lwYW50In0sYXBwY29uZmlnOntuYW1lOiJBcHBDb25maWcifSxpb3RzZWN1cmV0dW5uZWxpbmc6e25hbWU6IklvVFNlY3VyZVR1bm5lbGluZyJ9LHdhZnYyOntuYW1lOiJXQUZWMiJ9LGVsYXN0aWNpbmZlcmVuY2U6e3ByZWZpeDoiZWxhc3RpYy1pbmZlcmVuY2UiLG5hbWU6IkVsYXN0aWNJbmZlcmVuY2UifSxpbWFnZWJ1aWxkZXI6e25hbWU6IkltYWdlYnVpbGRlciJ9LHNjaGVtYXM6e25hbWU6IlNjaGVtYXMifSxhY2Nlc3NhbmFseXplcjp7bmFtZToiQWNjZXNzQW5hbHl6ZXIifSxjb2RlZ3VydXJldmlld2VyOntwcmVmaXg6ImNvZGVndXJ1LXJldmlld2VyIixuYW1lOiJDb2RlR3VydVJldmlld2VyIn0sY29kZWd1cnVwcm9maWxlcjp7bmFtZToiQ29kZUd1cnVQcm9maWxlciJ9LGNvbXB1dGVvcHRpbWl6ZXI6e3ByZWZpeDoiY29tcHV0ZS1vcHRpbWl6ZXIiLG5hbWU6IkNvbXB1dGVPcHRpbWl6ZXIifSxmcmF1ZGRldGVjdG9yOntuYW1lOiJGcmF1ZERldGVjdG9yIn0sa2VuZHJhOntuYW1lOiJLZW5kcmEifSxuZXR3b3JrbWFuYWdlcjp7bmFtZToiTmV0d29ya01hbmFnZXIifSxvdXRwb3N0czp7bmFtZToiT3V0cG9zdHMifSxhdWdtZW50ZWRhaXJ1bnRpbWU6e3ByZWZpeDoic2FnZW1ha2VyLWEyaS1ydW50aW1lIixuYW1lOiJBdWdtZW50ZWRBSVJ1bnRpbWUifSxlYnM6e25hbWU6IkVCUyJ9LGtpbmVzaXN2aWRlb3NpZ25hbGluZ2NoYW5uZWxzOntwcmVmaXg6ImtpbmVzaXMtdmlkZW8tc2lnbmFsaW5nIixuYW1lOiJLaW5lc2lzVmlkZW9TaWduYWxpbmdDaGFubmVscyIsY29yczohMH0sZGV0ZWN0aXZlOntuYW1lOiJEZXRlY3RpdmUifSxjb2Rlc3RhcmNvbm5lY3Rpb25zOntwcmVmaXg6ImNvZGVzdGFyLWNvbm5lY3Rpb25zIixuYW1lOiJDb2RlU3RhcmNvbm5lY3Rpb25zIn0sc3ludGhldGljczp7bmFtZToiU3ludGhldGljcyJ9LGlvdHNpdGV3aXNlOntuYW1lOiJJb1RTaXRlV2lzZSJ9LG1hY2llMjp7bmFtZToiTWFjaWUyIn0sY29kZWFydGlmYWN0OntuYW1lOiJDb2RlQXJ0aWZhY3QifSxob25leWNvZGU6e25hbWU6IkhvbmV5Y29kZSJ9LGl2czp7bmFtZToiSVZTIn0sYnJha2V0OntuYW1lOiJCcmFrZXQifSxpZGVudGl0eXN0b3JlOntuYW1lOiJJZGVudGl0eVN0b3JlIn0sYXBwZmxvdzp7bmFtZToiQXBwZmxvdyJ9LHJlZHNoaWZ0ZGF0YTp7cHJlZml4OiJyZWRzaGlmdC1kYXRhIixuYW1lOiJSZWRzaGlmdERhdGEifSxzc29hZG1pbjp7cHJlZml4OiJzc28tYWRtaW4iLG5hbWU6IlNTT0FkbWluIn0sdGltZXN0cmVhbXF1ZXJ5OntwcmVmaXg6InRpbWVzdHJlYW0tcXVlcnkiLG5hbWU6IlRpbWVzdHJlYW1RdWVyeSJ9LHRpbWVzdHJlYW13cml0ZTp7cHJlZml4OiJ0aW1lc3RyZWFtLXdyaXRlIixuYW1lOiJUaW1lc3RyZWFtV3JpdGUifSxzM291dHBvc3RzOntuYW1lOiJTM091dHBvc3RzIn0sZGF0YWJyZXc6e25hbWU6IkRhdGFCcmV3In0sc2VydmljZWNhdGFsb2dhcHByZWdpc3RyeTp7cHJlZml4OiJzZXJ2aWNlY2F0YWxvZy1hcHByZWdpc3RyeSIsbmFtZToiU2VydmljZUNhdGFsb2dBcHBSZWdpc3RyeSJ9LG5ldHdvcmtmaXJld2FsbDp7cHJlZml4OiJuZXR3b3JrLWZpcmV3YWxsIixuYW1lOiJOZXR3b3JrRmlyZXdhbGwifSxtd2FhOntuYW1lOiJNV0FBIn0sYW1wbGlmeWJhY2tlbmQ6e25hbWU6IkFtcGxpZnlCYWNrZW5kIn0sYXBwaW50ZWdyYXRpb25zOntuYW1lOiJBcHBJbnRlZ3JhdGlvbnMifSxjb25uZWN0Y29udGFjdGxlbnM6e3ByZWZpeDoiY29ubmVjdC1jb250YWN0LWxlbnMiLG5hbWU6IkNvbm5lY3RDb250YWN0TGVucyJ9LGRldm9wc2d1cnU6e3ByZWZpeDoiZGV2b3BzLWd1cnUiLG5hbWU6IkRldk9wc0d1cnUifSxlY3JwdWJsaWM6e3ByZWZpeDoiZWNyLXB1YmxpYyIsbmFtZToiRUNSUFVCTElDIn0sbG9va291dHZpc2lvbjp7bmFtZToiTG9va291dFZpc2lvbiJ9LHNhZ2VtYWtlcmZlYXR1cmVzdG9yZXJ1bnRpbWU6e3ByZWZpeDoic2FnZW1ha2VyLWZlYXR1cmVzdG9yZS1ydW50aW1lIixuYW1lOiJTYWdlTWFrZXJGZWF0dXJlU3RvcmVSdW50aW1lIn0sY3VzdG9tZXJwcm9maWxlczp7cHJlZml4OiJjdXN0b21lci1wcm9maWxlcyIsbmFtZToiQ3VzdG9tZXJQcm9maWxlcyJ9LGF1ZGl0bWFuYWdlcjp7bmFtZToiQXVkaXRNYW5hZ2VyIn0sZW1yY29udGFpbmVyczp7cHJlZml4OiJlbXItY29udGFpbmVycyIsbmFtZToiRU1SY29udGFpbmVycyJ9LGhlYWx0aGxha2U6e25hbWU6IkhlYWx0aExha2UifSxzYWdlbWFrZXJlZGdlOntwcmVmaXg6InNhZ2VtYWtlci1lZGdlIixuYW1lOiJTYWdlbWFrZXJFZGdlIn0sYW1wOntuYW1lOiJBbXAiLGNvcnM6ITB9LGdyZWVuZ3Jhc3N2Mjp7bmFtZToiR3JlZW5ncmFzc1YyIn0saW90ZGV2aWNlYWR2aXNvcjp7bmFtZToiSW90RGV2aWNlQWR2aXNvciJ9LGlvdGZsZWV0aHViOntuYW1lOiJJb1RGbGVldEh1YiJ9LGlvdHdpcmVsZXNzOntuYW1lOiJJb1RXaXJlbGVzcyJ9LGxvY2F0aW9uOntuYW1lOiJMb2NhdGlvbiIsY29yczohMH0sd2VsbGFyY2hpdGVjdGVkOntuYW1lOiJXZWxsQXJjaGl0ZWN0ZWQifSxsZXhtb2RlbHN2Mjp7cHJlZml4OiJtb2RlbHMubGV4LnYyIixuYW1lOiJMZXhNb2RlbHNWMiJ9LGxleHJ1bnRpbWV2Mjp7cHJlZml4OiJydW50aW1lLmxleC52MiIsbmFtZToiTGV4UnVudGltZVYyIixjb3JzOiEwfSxmaXM6e25hbWU6IkZpcyJ9LGxvb2tvdXRtZXRyaWNzOntuYW1lOiJMb29rb3V0TWV0cmljcyJ9LG1nbjp7bmFtZToiTWduIn0sbG9va291dGVxdWlwbWVudDp7bmFtZToiTG9va291dEVxdWlwbWVudCJ9LG5pbWJsZTp7bmFtZToiTmltYmxlIn0sZmluc3BhY2U6e25hbWU6IkZpbnNwYWNlIn0sZmluc3BhY2VkYXRhOntwcmVmaXg6ImZpbnNwYWNlLWRhdGEiLG5hbWU6IkZpbnNwYWNlZGF0YSJ9LHNzbWNvbnRhY3RzOntwcmVmaXg6InNzbS1jb250YWN0cyIsbmFtZToiU1NNQ29udGFjdHMifSxzc21pbmNpZGVudHM6e3ByZWZpeDoic3NtLWluY2lkZW50cyIsbmFtZToiU1NNSW5jaWRlbnRzIn0sYXBwbGljYXRpb25jb3N0cHJvZmlsZXI6e25hbWU6IkFwcGxpY2F0aW9uQ29zdFByb2ZpbGVyIn0sYXBwcnVubmVyOntuYW1lOiJBcHBSdW5uZXIifSxwcm90b246e25hbWU6IlByb3RvbiJ9LHJvdXRlNTNyZWNvdmVyeWNsdXN0ZXI6e3ByZWZpeDoicm91dGU1My1yZWNvdmVyeS1jbHVzdGVyIixuYW1lOiJSb3V0ZTUzUmVjb3ZlcnlDbHVzdGVyIn0scm91dGU1M3JlY292ZXJ5Y29udHJvbGNvbmZpZzp7cHJlZml4OiJyb3V0ZTUzLXJlY292ZXJ5LWNvbnRyb2wtY29uZmlnIixuYW1lOiJSb3V0ZTUzUmVjb3ZlcnlDb250cm9sQ29uZmlnIn0scm91dGU1M3JlY292ZXJ5cmVhZGluZXNzOntwcmVmaXg6InJvdXRlNTMtcmVjb3ZlcnktcmVhZGluZXNzIixuYW1lOiJSb3V0ZTUzUmVjb3ZlcnlSZWFkaW5lc3MifSxjaGltZXNka2lkZW50aXR5OntwcmVmaXg6ImNoaW1lLXNkay1pZGVudGl0eSIsbmFtZToiQ2hpbWVTREtJZGVudGl0eSJ9LGNoaW1lc2RrbWVzc2FnaW5nOntwcmVmaXg6ImNoaW1lLXNkay1tZXNzYWdpbmciLG5hbWU6IkNoaW1lU0RLTWVzc2FnaW5nIn0sc25vd2RldmljZW1hbmFnZW1lbnQ6e3ByZWZpeDoic25vdy1kZXZpY2UtbWFuYWdlbWVudCIsbmFtZToiU25vd0RldmljZU1hbmFnZW1lbnQifSxtZW1vcnlkYjp7bmFtZToiTWVtb3J5REIifSxvcGVuc2VhcmNoOntuYW1lOiJPcGVuU2VhcmNoIn0sa2Fma2Fjb25uZWN0OntuYW1lOiJLYWZrYUNvbm5lY3QifSx2b2ljZWlkOntwcmVmaXg6InZvaWNlLWlkIixuYW1lOiJWb2ljZUlEIn0sd2lzZG9tOntuYW1lOiJXaXNkb20ifSxhY2NvdW50OntuYW1lOiJBY2NvdW50In0sY2xvdWRjb250cm9sOntuYW1lOiJDbG91ZENvbnRyb2wifSxncmFmYW5hOntuYW1lOiJHcmFmYW5hIn0scGFub3JhbWE6e25hbWU6IlBhbm9yYW1hIn0sY2hpbWVzZGttZWV0aW5nczp7cHJlZml4OiJjaGltZS1zZGstbWVldGluZ3MiLG5hbWU6IkNoaW1lU0RLTWVldGluZ3MifSxyZXNpbGllbmNlaHViOntuYW1lOiJSZXNpbGllbmNlaHViIn0sbWlncmF0aW9uaHVic3RyYXRlZ3k6e25hbWU6Ik1pZ3JhdGlvbkh1YlN0cmF0ZWd5In0sYXBwY29uZmlnZGF0YTp7bmFtZToiQXBwQ29uZmlnRGF0YSJ9LGRyczp7bmFtZToiRHJzIn0sbWlncmF0aW9uaHVicmVmYWN0b3JzcGFjZXM6e3ByZWZpeDoibWlncmF0aW9uLWh1Yi1yZWZhY3Rvci1zcGFjZXMiLG5hbWU6Ik1pZ3JhdGlvbkh1YlJlZmFjdG9yU3BhY2VzIn0sZXZpZGVudGx5OntuYW1lOiJFdmlkZW50bHkifSxpbnNwZWN0b3IyOntuYW1lOiJJbnNwZWN0b3IyIn0scmJpbjp7bmFtZToiUmJpbiJ9LHJ1bTp7bmFtZToiUlVNIn0sYmFja3VwZ2F0ZXdheTp7cHJlZml4OiJiYWNrdXAtZ2F0ZXdheSIsbmFtZToiQmFja3VwR2F0ZXdheSJ9LGlvdHR3aW5tYWtlcjp7bmFtZToiSW9UVHdpbk1ha2VyIn0sd29ya3NwYWNlc3dlYjp7cHJlZml4OiJ3b3Jrc3BhY2VzLXdlYiIsbmFtZToiV29ya1NwYWNlc1dlYiJ9LGFtcGxpZnl1aWJ1aWxkZXI6e25hbWU6IkFtcGxpZnlVSUJ1aWxkZXIifSxrZXlzcGFjZXM6e25hbWU6IktleXNwYWNlcyJ9LGJpbGxpbmdjb25kdWN0b3I6e25hbWU6IkJpbGxpbmdjb25kdWN0b3IifSxnYW1lc3BhcmtzOntuYW1lOiJHYW1lU3BhcmtzIn0scGlucG9pbnRzbXN2b2ljZXYyOntwcmVmaXg6InBpbnBvaW50LXNtcy12b2ljZS12MiIsbmFtZToiUGlucG9pbnRTTVNWb2ljZVYyIn0saXZzY2hhdDp7bmFtZToiSXZzY2hhdCJ9LGNoaW1lc2RrbWVkaWFwaXBlbGluZXM6e3ByZWZpeDoiY2hpbWUtc2RrLW1lZGlhLXBpcGVsaW5lcyIsbmFtZToiQ2hpbWVTREtNZWRpYVBpcGVsaW5lcyJ9LGVtcnNlcnZlcmxlc3M6e3ByZWZpeDoiZW1yLXNlcnZlcmxlc3MiLG5hbWU6IkVNUlNlcnZlcmxlc3MifSxtMjp7bmFtZToiTTIifSxjb25uZWN0Y2FtcGFpZ25zOntuYW1lOiJDb25uZWN0Q2FtcGFpZ25zIn0scmVkc2hpZnRzZXJ2ZXJsZXNzOntwcmVmaXg6InJlZHNoaWZ0LXNlcnZlcmxlc3MiLG5hbWU6IlJlZHNoaWZ0U2VydmVybGVzcyJ9LHJvbGVzYW55d2hlcmU6e25hbWU6IlJvbGVzQW55d2hlcmUifSxsaWNlbnNlbWFuYWdlcnVzZXJzdWJzY3JpcHRpb25zOntwcmVmaXg6ImxpY2Vuc2UtbWFuYWdlci11c2VyLXN1YnNjcmlwdGlvbnMiLG5hbWU6IkxpY2Vuc2VNYW5hZ2VyVXNlclN1YnNjcmlwdGlvbnMifSxiYWNrdXBzdG9yYWdlOntuYW1lOiJCYWNrdXBTdG9yYWdlIn0scHJpdmF0ZW5ldHdvcmtzOntuYW1lOiJQcml2YXRlTmV0d29ya3MifSxzdXBwb3J0YXBwOntwcmVmaXg6InN1cHBvcnQtYXBwIixuYW1lOiJTdXBwb3J0QXBwIn0sY29udHJvbHRvd2VyOntuYW1lOiJDb250cm9sVG93ZXIifSxpb3RmbGVldHdpc2U6e25hbWU6IklvVEZsZWV0V2lzZSJ9LG1pZ3JhdGlvbmh1Ym9yY2hlc3RyYXRvcjp7bmFtZToiTWlncmF0aW9uSHViT3JjaGVzdHJhdG9yIn0sY29ubmVjdGNhc2VzOntuYW1lOiJDb25uZWN0Q2FzZXMifSxyZXNvdXJjZWV4cGxvcmVyMjp7cHJlZml4OiJyZXNvdXJjZS1leHBsb3Jlci0yIixuYW1lOiJSZXNvdXJjZUV4cGxvcmVyMiJ9LHNjaGVkdWxlcjp7bmFtZToiU2NoZWR1bGVyIn0sY2hpbWVzZGt2b2ljZTp7cHJlZml4OiJjaGltZS1zZGstdm9pY2UiLG5hbWU6IkNoaW1lU0RLVm9pY2UifSxpb3Ryb2JvcnVubmVyOntwcmVmaXg6ImlvdC1yb2JvcnVubmVyIixuYW1lOiJJb1RSb2JvUnVubmVyIn0sc3Ntc2FwOntwcmVmaXg6InNzbS1zYXAiLG5hbWU6IlNzbVNhcCJ9LG9hbTp7bmFtZToiT0FNIn0sYXJjem9uYWxzaGlmdDp7cHJlZml4OiJhcmMtem9uYWwtc2hpZnQiLG5hbWU6IkFSQ1pvbmFsU2hpZnQifSxvbWljczp7bmFtZToiT21pY3MifSxvcGVuc2VhcmNoc2VydmVybGVzczp7bmFtZToiT3BlblNlYXJjaFNlcnZlcmxlc3MifSxzZWN1cml0eWxha2U6e25hbWU6IlNlY3VyaXR5TGFrZSJ9LHNpbXNwYWNld2VhdmVyOntuYW1lOiJTaW1TcGFjZVdlYXZlciJ9LGRvY2RiZWxhc3RpYzp7cHJlZml4OiJkb2NkYi1lbGFzdGljIixuYW1lOiJEb2NEQkVsYXN0aWMifSxzYWdlbWFrZXJnZW9zcGF0aWFsOntwcmVmaXg6InNhZ2VtYWtlci1nZW9zcGF0aWFsIixuYW1lOiJTYWdlTWFrZXJHZW9zcGF0aWFsIn0sY29kZWNhdGFseXN0OntuYW1lOiJDb2RlQ2F0YWx5c3QifSxwaXBlczp7bmFtZToiUGlwZXMifSxzYWdlbWFrZXJtZXRyaWNzOntwcmVmaXg6InNhZ2VtYWtlci1tZXRyaWNzIixuYW1lOiJTYWdlTWFrZXJNZXRyaWNzIn0sa2luZXNpc3ZpZGVvd2VicnRjc3RvcmFnZTp7cHJlZml4OiJraW5lc2lzLXZpZGVvLXdlYnJ0Yy1zdG9yYWdlIixuYW1lOiJLaW5lc2lzVmlkZW9XZWJSVENTdG9yYWdlIn0sbGljZW5zZW1hbmFnZXJsaW51eHN1YnNjcmlwdGlvbnM6e3ByZWZpeDoibGljZW5zZS1tYW5hZ2VyLWxpbnV4LXN1YnNjcmlwdGlvbnMiLG5hbWU6IkxpY2Vuc2VNYW5hZ2VyTGludXhTdWJzY3JpcHRpb25zIn0sa2VuZHJhcmFua2luZzp7cHJlZml4OiJrZW5kcmEtcmFua2luZyIsbmFtZToiS2VuZHJhUmFua2luZyJ9LGNsZWFucm9vbXM6e25hbWU6IkNsZWFuUm9vbXMifSxjbG91ZHRyYWlsZGF0YTp7cHJlZml4OiJjbG91ZHRyYWlsLWRhdGEiLG5hbWU6IkNsb3VkVHJhaWxEYXRhIn0sdG5iOntuYW1lOiJUbmIifSxpbnRlcm5ldG1vbml0b3I6e25hbWU6IkludGVybmV0TW9uaXRvciJ9LGl2c3JlYWx0aW1lOntwcmVmaXg6Iml2cy1yZWFsdGltZSIsbmFtZToiSVZTUmVhbFRpbWUifSx2cGNsYXR0aWNlOntwcmVmaXg6InZwYy1sYXR0aWNlIixuYW1lOiJWUENMYXR0aWNlIn0sb3Npczp7bmFtZToiT1NJUyJ9LG1lZGlhcGFja2FnZXYyOntuYW1lOiJNZWRpYVBhY2thZ2VWMiJ9LHBheW1lbnRjcnlwdG9ncmFwaHk6e3ByZWZpeDoicGF5bWVudC1jcnlwdG9ncmFwaHkiLG5hbWU6IlBheW1lbnRDcnlwdG9ncmFwaHkifSxwYXltZW50Y3J5cHRvZ3JhcGh5ZGF0YTp7cHJlZml4OiJwYXltZW50LWNyeXB0b2dyYXBoeS1kYXRhIixuYW1lOiJQYXltZW50Q3J5cHRvZ3JhcGh5RGF0YSJ9LGNvZGVndXJ1c2VjdXJpdHk6e3ByZWZpeDoiY29kZWd1cnUtc2VjdXJpdHkiLG5hbWU6IkNvZGVHdXJ1U2VjdXJpdHkifSx2ZXJpZmllZHBlcm1pc3Npb25zOntuYW1lOiJWZXJpZmllZFBlcm1pc3Npb25zIn0sYXBwZmFicmljOntuYW1lOiJBcHBGYWJyaWMifSxtZWRpY2FsaW1hZ2luZzp7cHJlZml4OiJtZWRpY2FsLWltYWdpbmciLG5hbWU6Ik1lZGljYWxJbWFnaW5nIn0sZW50aXR5cmVzb2x1dGlvbjp7bmFtZToiRW50aXR5UmVzb2x1dGlvbiJ9LG1hbmFnZWRibG9ja2NoYWlucXVlcnk6e3ByZWZpeDoibWFuYWdlZGJsb2NrY2hhaW4tcXVlcnkiLG5hbWU6Ik1hbmFnZWRCbG9ja2NoYWluUXVlcnkifSxuZXB0dW5lZGF0YTp7bmFtZToiTmVwdHVuZWRhdGEifSxwY2Fjb25uZWN0b3JhZDp7cHJlZml4OiJwY2EtY29ubmVjdG9yLWFkIixuYW1lOiJQY2FDb25uZWN0b3JBZCJ9fX0se31dLDU6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e3ZlcnNpb246IjIuMCIsbWV0YWRhdGE6e2FwaVZlcnNpb246IjIwMTEtMDYtMTUiLGVuZHBvaW50UHJlZml4OiJzdHMiLGdsb2JhbEVuZHBvaW50OiJzdHMuYW1hem9uYXdzLmNvbSIscHJvdG9jb2w6InF1ZXJ5IixzZXJ2aWNlQWJicmV2aWF0aW9uOiJBV1MgU1RTIixzZXJ2aWNlRnVsbE5hbWU6IkFXUyBTZWN1cml0eSBUb2tlbiBTZXJ2aWNlIixzZXJ2aWNlSWQ6IlNUUyIsc2lnbmF0dXJlVmVyc2lvbjoidjQiLHVpZDoic3RzLTIwMTEtMDYtMTUiLHhtbE5hbWVzcGFjZToiaHR0cHM6Ly9zdHMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMS0wNi0xNS8ifSxvcGVyYXRpb25zOntBc3N1bWVSb2xlOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIlJvbGVBcm4iLCJSb2xlU2Vzc2lvbk5hbWUiXSxtZW1iZXJzOntSb2xlQXJuOnt9LFJvbGVTZXNzaW9uTmFtZTp7fSxQb2xpY3lBcm5zOntzaGFwZToiUzQifSxQb2xpY3k6e30sRHVyYXRpb25TZWNvbmRzOnt0eXBlOiJpbnRlZ2VyIn0sVGFnczp7c2hhcGU6IlM4In0sVHJhbnNpdGl2ZVRhZ0tleXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX0sRXh0ZXJuYWxJZDp7fSxTZXJpYWxOdW1iZXI6e30sVG9rZW5Db2RlOnt9LFNvdXJjZUlkZW50aXR5Ont9LFByb3ZpZGVkQ29udGV4dHM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntQcm92aWRlckFybjp7fSxDb250ZXh0QXNzZXJ0aW9uOnt9fX19fX0sb3V0cHV0OntyZXN1bHRXcmFwcGVyOiJBc3N1bWVSb2xlUmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0NyZWRlbnRpYWxzOntzaGFwZToiU2wifSxBc3N1bWVkUm9sZVVzZXI6e3NoYXBlOiJTcSJ9LFBhY2tlZFBvbGljeVNpemU6e3R5cGU6ImludGVnZXIifSxTb3VyY2VJZGVudGl0eTp7fX19fSxBc3N1bWVSb2xlV2l0aFNBTUw6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUm9sZUFybiIsIlByaW5jaXBhbEFybiIsIlNBTUxBc3NlcnRpb24iXSxtZW1iZXJzOntSb2xlQXJuOnt9LFByaW5jaXBhbEFybjp7fSxTQU1MQXNzZXJ0aW9uOnt0eXBlOiJzdHJpbmciLHNlbnNpdGl2ZTohMH0sUG9saWN5QXJuczp7c2hhcGU6IlM0In0sUG9saWN5Ont9LER1cmF0aW9uU2Vjb25kczp7dHlwZToiaW50ZWdlciJ9fX0sb3V0cHV0OntyZXN1bHRXcmFwcGVyOiJBc3N1bWVSb2xlV2l0aFNBTUxSZXN1bHQiLHR5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7Q3JlZGVudGlhbHM6e3NoYXBlOiJTbCJ9LEFzc3VtZWRSb2xlVXNlcjp7c2hhcGU6IlNxIn0sUGFja2VkUG9saWN5U2l6ZTp7dHlwZToiaW50ZWdlciJ9LFN1YmplY3Q6e30sU3ViamVjdFR5cGU6e30sSXNzdWVyOnt9LEF1ZGllbmNlOnt9LE5hbWVRdWFsaWZpZXI6e30sU291cmNlSWRlbnRpdHk6e319fX0sQXNzdW1lUm9sZVdpdGhXZWJJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJSb2xlQXJuIiwiUm9sZVNlc3Npb25OYW1lIiwiV2ViSWRlbnRpdHlUb2tlbiJdLG1lbWJlcnM6e1JvbGVBcm46e30sUm9sZVNlc3Npb25OYW1lOnt9LFdlYklkZW50aXR5VG9rZW46e3R5cGU6InN0cmluZyIsc2Vuc2l0aXZlOiEwfSxQcm92aWRlcklkOnt9LFBvbGljeUFybnM6e3NoYXBlOiJTNCJ9LFBvbGljeTp7fSxEdXJhdGlvblNlY29uZHM6e3R5cGU6ImludGVnZXIifX19LG91dHB1dDp7cmVzdWx0V3JhcHBlcjoiQXNzdW1lUm9sZVdpdGhXZWJJZGVudGl0eVJlc3VsdCIsdHlwZToic3RydWN0dXJlIixtZW1iZXJzOntDcmVkZW50aWFsczp7c2hhcGU6IlNsIn0sU3ViamVjdEZyb21XZWJJZGVudGl0eVRva2VuOnt9LEFzc3VtZWRSb2xlVXNlcjp7c2hhcGU6IlNxIn0sUGFja2VkUG9saWN5U2l6ZTp7dHlwZToiaW50ZWdlciJ9LFByb3ZpZGVyOnt9LEF1ZGllbmNlOnt9LFNvdXJjZUlkZW50aXR5Ont9fX19LERlY29kZUF1dGhvcml6YXRpb25NZXNzYWdlOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIkVuY29kZWRNZXNzYWdlIl0sbWVtYmVyczp7RW5jb2RlZE1lc3NhZ2U6e319fSxvdXRwdXQ6e3Jlc3VsdFdyYXBwZXI6IkRlY29kZUF1dGhvcml6YXRpb25NZXNzYWdlUmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0RlY29kZWRNZXNzYWdlOnt9fX19LEdldEFjY2Vzc0tleUluZm86e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiQWNjZXNzS2V5SWQiXSxtZW1iZXJzOntBY2Nlc3NLZXlJZDp7fX19LG91dHB1dDp7cmVzdWx0V3JhcHBlcjoiR2V0QWNjZXNzS2V5SW5mb1Jlc3VsdCIsdHlwZToic3RydWN0dXJlIixtZW1iZXJzOntBY2NvdW50Ont9fX19LEdldENhbGxlcklkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fSxvdXRwdXQ6e3Jlc3VsdFdyYXBwZXI6IkdldENhbGxlcklkZW50aXR5UmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e1VzZXJJZDp7fSxBY2NvdW50Ont9LEFybjp7fX19fSxHZXRGZWRlcmF0aW9uVG9rZW46e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiTmFtZSJdLG1lbWJlcnM6e05hbWU6e30sUG9saWN5Ont9LFBvbGljeUFybnM6e3NoYXBlOiJTNCJ9LER1cmF0aW9uU2Vjb25kczp7dHlwZToiaW50ZWdlciJ9LFRhZ3M6e3NoYXBlOiJTOCJ9fX0sb3V0cHV0OntyZXN1bHRXcmFwcGVyOiJHZXRGZWRlcmF0aW9uVG9rZW5SZXN1bHQiLHR5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7Q3JlZGVudGlhbHM6e3NoYXBlOiJTbCJ9LEZlZGVyYXRlZFVzZXI6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJGZWRlcmF0ZWRVc2VySWQiLCJBcm4iXSxtZW1iZXJzOntGZWRlcmF0ZWRVc2VySWQ6e30sQXJuOnt9fX0sUGFja2VkUG9saWN5U2l6ZTp7dHlwZToiaW50ZWdlciJ9fX19LEdldFNlc3Npb25Ub2tlbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7RHVyYXRpb25TZWNvbmRzOnt0eXBlOiJpbnRlZ2VyIn0sU2VyaWFsTnVtYmVyOnt9LFRva2VuQ29kZTp7fX19LG91dHB1dDp7cmVzdWx0V3JhcHBlcjoiR2V0U2Vzc2lvblRva2VuUmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0NyZWRlbnRpYWxzOntzaGFwZToiU2wifX19fX0sc2hhcGVzOntTNDp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2Fybjp7fX19fSxTODp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiS2V5IiwiVmFsdWUiXSxtZW1iZXJzOntLZXk6e30sVmFsdWU6e319fX0sU2w6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJBY2Nlc3NLZXlJZCIsIlNlY3JldEFjY2Vzc0tleSIsIlNlc3Npb25Ub2tlbiIsIkV4cGlyYXRpb24iXSxtZW1iZXJzOntBY2Nlc3NLZXlJZDp7fSxTZWNyZXRBY2Nlc3NLZXk6e3R5cGU6InN0cmluZyIsc2Vuc2l0aXZlOiEwfSxTZXNzaW9uVG9rZW46e30sRXhwaXJhdGlvbjp7dHlwZToidGltZXN0YW1wIn19fSxTcTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIkFzc3VtZWRSb2xlSWQiLCJBcm4iXSxtZW1iZXJzOntBc3N1bWVkUm9sZUlkOnt9LEFybjp7fX19fX19LHt9XSw2OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXtwYWdpbmF0aW9uOnt9fX0se31dLDc6W2Z1bmN0aW9uKGUsdCxuKXtlKCIuLi9saWIvbm9kZV9sb2FkZXIiKTt2YXIgcj1lKCIuLi9saWIvY29yZSIpLG89ci5TZXJ2aWNlLGk9ci5hcGlMb2FkZXI7aS5zZXJ2aWNlcy5jb2duaXRvaWRlbnRpdHk9e30sci5Db2duaXRvSWRlbnRpdHk9by5kZWZpbmVTZXJ2aWNlKCJjb2duaXRvaWRlbnRpdHkiLFsiMjAxNC0wNi0zMCJdKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaS5zZXJ2aWNlcy5jb2duaXRvaWRlbnRpdHksIjIwMTQtMDYtMzAiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1lKCIuLi9hcGlzL2NvZ25pdG8taWRlbnRpdHktMjAxNC0wNi0zMC5taW4uanNvbiIpO3JldHVybiB0LnBhZ2luYXRvcnM9ZSgiLi4vYXBpcy9jb2duaXRvLWlkZW50aXR5LTIwMTQtMDYtMzAucGFnaW5hdG9ycy5qc29uIikucGFnaW5hdGlvbix0fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQuZXhwb3J0cz1yLkNvZ25pdG9JZGVudGl0eX0seyIuLi9hcGlzL2NvZ25pdG8taWRlbnRpdHktMjAxNC0wNi0zMC5taW4uanNvbiI6MSwiLi4vYXBpcy9jb2duaXRvLWlkZW50aXR5LTIwMTQtMDYtMzAucGFnaW5hdG9ycy5qc29uIjoyLCIuLi9saWIvY29yZSI6MTksIi4uL2xpYi9ub2RlX2xvYWRlciI6MTZ9XSw4OltmdW5jdGlvbihlLHQsbil7ZSgiLi4vbGliL25vZGVfbG9hZGVyIik7dmFyIHI9ZSgiLi4vbGliL2NvcmUiKSxvPXIuU2VydmljZSxpPXIuYXBpTG9hZGVyO2kuc2VydmljZXMuc3RzPXt9LHIuU1RTPW8uZGVmaW5lU2VydmljZSgic3RzIixbIjIwMTEtMDYtMTUiXSksZSgiLi4vbGliL3NlcnZpY2VzL3N0cyIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLnNlcnZpY2VzLnN0cywiMjAxMS0wNi0xNSIse2dldDpmdW5jdGlvbigpe3ZhciB0PWUoIi4uL2FwaXMvc3RzLTIwMTEtMDYtMTUubWluLmpzb24iKTtyZXR1cm4gdC5wYWdpbmF0b3JzPWUoIi4uL2FwaXMvc3RzLTIwMTEtMDYtMTUucGFnaW5hdG9ycy5qc29uIikucGFnaW5hdGlvbix0fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQuZXhwb3J0cz1yLlNUU30seyIuLi9hcGlzL3N0cy0yMDExLTA2LTE1Lm1pbi5qc29uIjo1LCIuLi9hcGlzL3N0cy0yMDExLTA2LTE1LnBhZ2luYXRvcnMuanNvbiI6NiwiLi4vbGliL2NvcmUiOjE5LCIuLi9saWIvbm9kZV9sb2FkZXIiOjE2LCIuLi9saWIvc2VydmljZXMvc3RzIjo2M31dLDk6W2Z1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKGUsdCl7aWYoIXIuc2VydmljZXMuaGFzT3duUHJvcGVydHkoZSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkU2VydmljZTogRmFpbGVkIHRvIGxvYWQgYXBpIGZvciAiK2UpO3JldHVybiByLnNlcnZpY2VzW2VdW3RdfXIuc2VydmljZXM9e30sdC5leHBvcnRzPXJ9LHt9XSwxMDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vYnJvd3NlckhtYWMiKSxvPWUoIi4vYnJvd3Nlck1kNSIpLGk9ZSgiLi9icm93c2VyU2hhMSIpLHM9ZSgiLi9icm93c2VyU2hhMjU2Iik7dC5leHBvcnRzPXtjcmVhdGVIYXNoOmZ1bmN0aW9uKGUpe2lmKCJtZDUiPT09KGU9ZS50b0xvd2VyQ2FzZSgpKSlyZXR1cm4gbmV3IG87aWYoInNoYTI1NiI9PT1lKXJldHVybiBuZXcgcztpZigic2hhMSI9PT1lKXJldHVybiBuZXcgaTt0aHJvdyBuZXcgRXJyb3IoIkhhc2ggYWxnb3JpdGhtICIrZSsiIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIgU0RLIil9LGNyZWF0ZUhtYWM6ZnVuY3Rpb24oZSx0KXtpZigibWQ1Ij09PShlPWUudG9Mb3dlckNhc2UoKSkpcmV0dXJuIG5ldyByKG8sdCk7aWYoInNoYTI1NiI9PT1lKXJldHVybiBuZXcgcihzLHQpO2lmKCJzaGExIj09PWUpcmV0dXJuIG5ldyByKGksdCk7dGhyb3cgbmV3IEVycm9yKCJITUFDIGFsZ29yaXRobSAiK2UrIiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIFNESyIpfSxjcmVhdGVTaWduOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJjcmVhdGVTaWduIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgYnJvd3NlciIpfX19LHsiLi9icm93c2VySG1hYyI6MTIsIi4vYnJvd3Nlck1kNSI6MTMsIi4vYnJvd3NlclNoYTEiOjE0LCIuL2Jyb3dzZXJTaGEyNTYiOjE1fV0sMTE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCJidWZmZXIvIikuQnVmZmVyOyJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnZvaWQgMD09PUFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldz1mdW5jdGlvbihlKXtyZXR1cm4gby5pbmRleE9mKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSk+LTF9KTt2YXIgbz1bIltvYmplY3QgSW50OEFycmF5XSIsIltvYmplY3QgVWludDhBcnJheV0iLCJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsIltvYmplY3QgSW50MTZBcnJheV0iLCJbb2JqZWN0IFVpbnQxNkFycmF5XSIsIltvYmplY3QgSW50MzJBcnJheV0iLCJbb2JqZWN0IFVpbnQzMkFycmF5XSIsIltvYmplY3QgRmxvYXQzMkFycmF5XSIsIltvYmplY3QgRmxvYXQ2NEFycmF5XSIsIltvYmplY3QgRGF0YVZpZXddIl07dC5leHBvcnRzPXtpc0VtcHR5RGF0YTpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/MD09PWUubGVuZ3RoOjA9PT1lLmJ5dGVMZW5ndGh9LGNvbnZlcnRUb0J1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJihlPW5ldyByKGUsInV0ZjgiKSksQXJyYXlCdWZmZXIuaXNWaWV3KGUpP25ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgvVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk6bmV3IFVpbnQ4QXJyYXkoZSl9fX0seyJidWZmZXIvIjo4Nn1dLDEyOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9icm93c2VySGFzaFV0aWxzIik7ZnVuY3Rpb24gbyhlLHQpe3RoaXMuaGFzaD1uZXcgZSx0aGlzLm91dGVyPW5ldyBlO3ZhciBuPWZ1bmN0aW9uKGUsdCl7dmFyIG49ci5jb252ZXJ0VG9CdWZmZXIodCk7aWYobi5ieXRlTGVuZ3RoPmUuQkxPQ0tfU0laRSl7dmFyIG89bmV3IGU7by51cGRhdGUobiksbj1vLmRpZ2VzdCgpfXZhciBpPW5ldyBVaW50OEFycmF5KGUuQkxPQ0tfU0laRSk7cmV0dXJuIGkuc2V0KG4pLGl9KGUsdCksbz1uZXcgVWludDhBcnJheShlLkJMT0NLX1NJWkUpO28uc2V0KG4pO2Zvcih2YXIgaT0wO2k8ZS5CTE9DS19TSVpFO2krKyluW2ldXj01NCxvW2ldXj05Mjtmb3IodGhpcy5oYXNoLnVwZGF0ZShuKSx0aGlzLm91dGVyLnVwZGF0ZShvKSxpPTA7aTxuLmJ5dGVMZW5ndGg7aSsrKW5baV09MH10LmV4cG9ydHM9byxvLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7aWYoci5pc0VtcHR5RGF0YShlKXx8dGhpcy5lcnJvcilyZXR1cm4gdGhpczt0cnl7dGhpcy5oYXNoLnVwZGF0ZShyLmNvbnZlcnRUb0J1ZmZlcihlKSl9Y2F0Y2goZSl7dGhpcy5lcnJvcj1lfXJldHVybiB0aGlzfSxvLnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3V0ZXIuZmluaXNoZWR8fHRoaXMub3V0ZXIudXBkYXRlKHRoaXMuaGFzaC5kaWdlc3QoKSksdGhpcy5vdXRlci5kaWdlc3QoZSl9fSx7Ii4vYnJvd3Nlckhhc2hVdGlscyI6MTF9XSwxMzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vYnJvd3Nlckhhc2hVdGlscyIpLG89ZSgiYnVmZmVyLyIpLkJ1ZmZlcixpPTY0O2Z1bmN0aW9uIHMoKXt0aGlzLnN0YXRlPVsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzhdLHRoaXMuYnVmZmVyPW5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoaSkpLHRoaXMuYnVmZmVyTGVuZ3RoPTAsdGhpcy5ieXRlc0hhc2hlZD0wLHRoaXMuZmluaXNoZWQ9ITF9ZnVuY3Rpb24gYShlLHQsbixyLG8saSl7cmV0dXJuKCh0PSh0K2UmNDI5NDk2NzI5NSkrKHIraSY0Mjk0OTY3Mjk1KSY0Mjk0OTY3Mjk1KTw8b3x0Pj4+MzItbykrbiY0Mjk0OTY3Mjk1fWZ1bmN0aW9uIGMoZSx0LG4scixvLGkscyl7cmV0dXJuIGEodCZufH50JnIsZSx0LG8saSxzKX1mdW5jdGlvbiB1KGUsdCxuLHIsbyxpLHMpe3JldHVybiBhKHQmcnxuJn5yLGUsdCxvLGkscyl9ZnVuY3Rpb24gbChlLHQsbixyLG8saSxzKXtyZXR1cm4gYSh0Xm5ecixlLHQsbyxpLHMpfWZ1bmN0aW9uIHAoZSx0LG4scixvLGkscyl7cmV0dXJuIGEobl4odHx+ciksZSx0LG8saSxzKX10LmV4cG9ydHM9cyxzLkJMT0NLX1NJWkU9aSxzLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7aWYoci5pc0VtcHR5RGF0YShlKSlyZXR1cm4gdGhpcztpZih0aGlzLmZpbmlzaGVkKXRocm93IG5ldyBFcnJvcigiQXR0ZW1wdGVkIHRvIHVwZGF0ZSBhbiBhbHJlYWR5IGZpbmlzaGVkIGhhc2guIik7dmFyIHQ9ci5jb252ZXJ0VG9CdWZmZXIoZSksbj0wLG89dC5ieXRlTGVuZ3RoO2Zvcih0aGlzLmJ5dGVzSGFzaGVkKz1vO28+MDspdGhpcy5idWZmZXIuc2V0VWludDgodGhpcy5idWZmZXJMZW5ndGgrKyx0W24rK10pLG8tLSx0aGlzLmJ1ZmZlckxlbmd0aD09PWkmJih0aGlzLmhhc2hCdWZmZXIoKSx0aGlzLmJ1ZmZlckxlbmd0aD0wKTtyZXR1cm4gdGhpc30scy5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKGUpe2lmKCF0aGlzLmZpbmlzaGVkKXt2YXIgdD10aGlzLG49dC5idWZmZXIscj10LmJ1ZmZlckxlbmd0aCxzPTgqdC5ieXRlc0hhc2hlZDtpZihuLnNldFVpbnQ4KHRoaXMuYnVmZmVyTGVuZ3RoKyssMTI4KSxyJWk+PTU2KXtmb3IodmFyIGE9dGhpcy5idWZmZXJMZW5ndGg7YTxpO2ErKyluLnNldFVpbnQ4KGEsMCk7dGhpcy5oYXNoQnVmZmVyKCksdGhpcy5idWZmZXJMZW5ndGg9MH1mb3IoYT10aGlzLmJ1ZmZlckxlbmd0aDthPDU2O2ErKyluLnNldFVpbnQ4KGEsMCk7bi5zZXRVaW50MzIoNTYscz4+PjAsITApLG4uc2V0VWludDMyKDYwLE1hdGguZmxvb3Iocy80Mjk0OTY3Mjk2KSwhMCksdGhpcy5oYXNoQnVmZmVyKCksdGhpcy5maW5pc2hlZD0hMH12YXIgYz1uZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDE2KSk7Zm9yKGE9MDthPDQ7YSsrKWMuc2V0VWludDMyKDQqYSx0aGlzLnN0YXRlW2FdLCEwKTt2YXIgdT1uZXcgbyhjLmJ1ZmZlcixjLmJ5dGVPZmZzZXQsYy5ieXRlTGVuZ3RoKTtyZXR1cm4gZT91LnRvU3RyaW5nKGUpOnV9LHMucHJvdG90eXBlLmhhc2hCdWZmZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmJ1ZmZlcix0PXRoaXMuc3RhdGUsbj10WzBdLHI9dFsxXSxvPXRbMl0saT10WzNdO249YyhuLHIsbyxpLGUuZ2V0VWludDMyKDAsITApLDcsMzYxNDA5MDM2MCksaT1jKGksbixyLG8sZS5nZXRVaW50MzIoNCwhMCksMTIsMzkwNTQwMjcxMCksbz1jKG8saSxuLHIsZS5nZXRVaW50MzIoOCwhMCksMTcsNjA2MTA1ODE5KSxyPWMocixvLGksbixlLmdldFVpbnQzMigxMiwhMCksMjIsMzI1MDQ0MTk2Niksbj1jKG4scixvLGksZS5nZXRVaW50MzIoMTYsITApLDcsNDExODU0ODM5OSksaT1jKGksbixyLG8sZS5nZXRVaW50MzIoMjAsITApLDEyLDEyMDAwODA0MjYpLG89YyhvLGksbixyLGUuZ2V0VWludDMyKDI0LCEwKSwxNywyODIxNzM1OTU1KSxyPWMocixvLGksbixlLmdldFVpbnQzMigyOCwhMCksMjIsNDI0OTI2MTMxMyksbj1jKG4scixvLGksZS5nZXRVaW50MzIoMzIsITApLDcsMTc3MDAzNTQxNiksaT1jKGksbixyLG8sZS5nZXRVaW50MzIoMzYsITApLDEyLDIzMzY1NTI4NzkpLG89YyhvLGksbixyLGUuZ2V0VWludDMyKDQwLCEwKSwxNyw0Mjk0OTI1MjMzKSxyPWMocixvLGksbixlLmdldFVpbnQzMig0NCwhMCksMjIsMjMwNDU2MzEzNCksbj1jKG4scixvLGksZS5nZXRVaW50MzIoNDgsITApLDcsMTgwNDYwMzY4MiksaT1jKGksbixyLG8sZS5nZXRVaW50MzIoNTIsITApLDEyLDQyNTQ2MjYxOTUpLG89YyhvLGksbixyLGUuZ2V0VWludDMyKDU2LCEwKSwxNywyNzkyOTY1MDA2KSxuPXUobixyPWMocixvLGksbixlLmdldFVpbnQzMig2MCwhMCksMjIsMTIzNjUzNTMyOSksbyxpLGUuZ2V0VWludDMyKDQsITApLDUsNDEyOTE3MDc4NiksaT11KGksbixyLG8sZS5nZXRVaW50MzIoMjQsITApLDksMzIyNTQ2NTY2NCksbz11KG8saSxuLHIsZS5nZXRVaW50MzIoNDQsITApLDE0LDY0MzcxNzcxMykscj11KHIsbyxpLG4sZS5nZXRVaW50MzIoMCwhMCksMjAsMzkyMTA2OTk5NCksbj11KG4scixvLGksZS5nZXRVaW50MzIoMjAsITApLDUsMzU5MzQwODYwNSksaT11KGksbixyLG8sZS5nZXRVaW50MzIoNDAsITApLDksMzgwMTYwODMpLG89dShvLGksbixyLGUuZ2V0VWludDMyKDYwLCEwKSwxNCwzNjM0NDg4OTYxKSxyPXUocixvLGksbixlLmdldFVpbnQzMigxNiwhMCksMjAsMzg4OTQyOTQ0OCksbj11KG4scixvLGksZS5nZXRVaW50MzIoMzYsITApLDUsNTY4NDQ2NDM4KSxpPXUoaSxuLHIsbyxlLmdldFVpbnQzMig1NiwhMCksOSwzMjc1MTYzNjA2KSxvPXUobyxpLG4scixlLmdldFVpbnQzMigxMiwhMCksMTQsNDEwNzYwMzMzNSkscj11KHIsbyxpLG4sZS5nZXRVaW50MzIoMzIsITApLDIwLDExNjM1MzE1MDEpLG49dShuLHIsbyxpLGUuZ2V0VWludDMyKDUyLCEwKSw1LDI4NTAyODU4MjkpLGk9dShpLG4scixvLGUuZ2V0VWludDMyKDgsITApLDksNDI0MzU2MzUxMiksbz11KG8saSxuLHIsZS5nZXRVaW50MzIoMjgsITApLDE0LDE3MzUzMjg0NzMpLG49bChuLHI9dShyLG8saSxuLGUuZ2V0VWludDMyKDQ4LCEwKSwyMCwyMzY4MzU5NTYyKSxvLGksZS5nZXRVaW50MzIoMjAsITApLDQsNDI5NDU4ODczOCksaT1sKGksbixyLG8sZS5nZXRVaW50MzIoMzIsITApLDExLDIyNzIzOTI4MzMpLG89bChvLGksbixyLGUuZ2V0VWludDMyKDQ0LCEwKSwxNiwxODM5MDMwNTYyKSxyPWwocixvLGksbixlLmdldFVpbnQzMig1NiwhMCksMjMsNDI1OTY1Nzc0MCksbj1sKG4scixvLGksZS5nZXRVaW50MzIoNCwhMCksNCwyNzYzOTc1MjM2KSxpPWwoaSxuLHIsbyxlLmdldFVpbnQzMigxNiwhMCksMTEsMTI3Mjg5MzM1Myksbz1sKG8saSxuLHIsZS5nZXRVaW50MzIoMjgsITApLDE2LDQxMzk0Njk2NjQpLHI9bChyLG8saSxuLGUuZ2V0VWludDMyKDQwLCEwKSwyMywzMjAwMjM2NjU2KSxuPWwobixyLG8saSxlLmdldFVpbnQzMig1MiwhMCksNCw2ODEyNzkxNzQpLGk9bChpLG4scixvLGUuZ2V0VWludDMyKDAsITApLDExLDM5MzY0MzAwNzQpLG89bChvLGksbixyLGUuZ2V0VWludDMyKDEyLCEwKSwxNiwzNTcyNDQ1MzE3KSxyPWwocixvLGksbixlLmdldFVpbnQzMigyNCwhMCksMjMsNzYwMjkxODkpLG49bChuLHIsbyxpLGUuZ2V0VWludDMyKDM2LCEwKSw0LDM2NTQ2MDI4MDkpLGk9bChpLG4scixvLGUuZ2V0VWludDMyKDQ4LCEwKSwxMSwzODczMTUxNDYxKSxvPWwobyxpLG4scixlLmdldFVpbnQzMig2MCwhMCksMTYsNTMwNzQyNTIwKSxuPXAobixyPWwocixvLGksbixlLmdldFVpbnQzMig4LCEwKSwyMywzMjk5NjI4NjQ1KSxvLGksZS5nZXRVaW50MzIoMCwhMCksNiw0MDk2MzM2NDUyKSxpPXAoaSxuLHIsbyxlLmdldFVpbnQzMigyOCwhMCksMTAsMTEyNjg5MTQxNSksbz1wKG8saSxuLHIsZS5nZXRVaW50MzIoNTYsITApLDE1LDI4Nzg2MTIzOTEpLHI9cChyLG8saSxuLGUuZ2V0VWludDMyKDIwLCEwKSwyMSw0MjM3NTMzMjQxKSxuPXAobixyLG8saSxlLmdldFVpbnQzMig0OCwhMCksNiwxNzAwNDg1NTcxKSxpPXAoaSxuLHIsbyxlLmdldFVpbnQzMigxMiwhMCksMTAsMjM5OTk4MDY5MCksbz1wKG8saSxuLHIsZS5nZXRVaW50MzIoNDAsITApLDE1LDQyOTM5MTU3NzMpLHI9cChyLG8saSxuLGUuZ2V0VWludDMyKDQsITApLDIxLDIyNDAwNDQ0OTcpLG49cChuLHIsbyxpLGUuZ2V0VWludDMyKDMyLCEwKSw2LDE4NzMzMTMzNTkpLGk9cChpLG4scixvLGUuZ2V0VWludDMyKDYwLCEwKSwxMCw0MjY0MzU1NTUyKSxvPXAobyxpLG4scixlLmdldFVpbnQzMigyNCwhMCksMTUsMjczNDc2ODkxNikscj1wKHIsbyxpLG4sZS5nZXRVaW50MzIoNTIsITApLDIxLDEzMDkxNTE2NDkpLG49cChuLHIsbyxpLGUuZ2V0VWludDMyKDE2LCEwKSw2LDQxNDk0NDQyMjYpLGk9cChpLG4scixvLGUuZ2V0VWludDMyKDQ0LCEwKSwxMCwzMTc0NzU2OTE3KSxvPXAobyxpLG4scixlLmdldFVpbnQzMig4LCEwKSwxNSw3MTg3ODcyNTkpLHI9cChyLG8saSxuLGUuZ2V0VWludDMyKDM2LCEwKSwyMSwzOTUxNDgxNzQ1KSx0WzBdPW4rdFswXSY0Mjk0OTY3Mjk1LHRbMV09cit0WzFdJjQyOTQ5NjcyOTUsdFsyXT1vK3RbMl0mNDI5NDk2NzI5NSx0WzNdPWkrdFszXSY0Mjk0OTY3Mjk1fX0seyIuL2Jyb3dzZXJIYXNoVXRpbHMiOjExLCJidWZmZXIvIjo4Nn1dLDE0OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiYnVmZmVyLyIpLkJ1ZmZlcixvPWUoIi4vYnJvd3Nlckhhc2hVdGlscyIpO2Z1bmN0aW9uIGkoKXt0aGlzLmgwPTE3MzI1ODQxOTMsdGhpcy5oMT00MDIzMjMzNDE3LHRoaXMuaDI9MjU2MjM4MzEwMix0aGlzLmgzPTI3MTczMzg3OCx0aGlzLmg0PTMyODUzNzc1MjAsdGhpcy5ibG9jaz1uZXcgVWludDMyQXJyYXkoODApLHRoaXMub2Zmc2V0PTAsdGhpcy5zaGlmdD0yNCx0aGlzLnRvdGFsTGVuZ3RoPTB9bmV3IFVpbnQzMkFycmF5KFsxNTE4NTAwMjQ5LDE4NTk3NzUzOTMsLTE4OTQwMDc1ODgsLTg5OTQ5NzUxNF0pLE1hdGgucG93KDIsNTMpLHQuZXhwb3J0cz1pLGkuQkxPQ0tfU0laRT02NCxpLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7aWYodGhpcy5maW5pc2hlZCl0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHRlZCB0byB1cGRhdGUgYW4gYWxyZWFkeSBmaW5pc2hlZCBoYXNoLiIpO2lmKG8uaXNFbXB0eURhdGEoZSkpcmV0dXJuIHRoaXM7dmFyIHQ9KGU9by5jb252ZXJ0VG9CdWZmZXIoZSkpLmxlbmd0aDt0aGlzLnRvdGFsTGVuZ3RoKz04KnQ7Zm9yKHZhciBuPTA7bjx0O24rKyl0aGlzLndyaXRlKGVbbl0pO3JldHVybiB0aGlzfSxpLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlKXt0aGlzLmJsb2NrW3RoaXMub2Zmc2V0XXw9KDI1NSZlKTw8dGhpcy5zaGlmdCx0aGlzLnNoaWZ0P3RoaXMuc2hpZnQtPTg6KHRoaXMub2Zmc2V0KyssdGhpcy5zaGlmdD0yNCksMTY9PT10aGlzLm9mZnNldCYmdGhpcy5wcm9jZXNzQmxvY2soKX0saS5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKGUpe3RoaXMud3JpdGUoMTI4KSwodGhpcy5vZmZzZXQ+MTR8fDE0PT09dGhpcy5vZmZzZXQmJnRoaXMuc2hpZnQ8MjQpJiZ0aGlzLnByb2Nlc3NCbG9jaygpLHRoaXMub2Zmc2V0PTE0LHRoaXMuc2hpZnQ9MjQsdGhpcy53cml0ZSgwKSx0aGlzLndyaXRlKDApLHRoaXMud3JpdGUodGhpcy50b3RhbExlbmd0aD4weGZmZmZmZmZmZmY/dGhpcy50b3RhbExlbmd0aC8xMDk5NTExNjI3Nzc2OjApLHRoaXMud3JpdGUodGhpcy50b3RhbExlbmd0aD40Mjk0OTY3Mjk1P3RoaXMudG90YWxMZW5ndGgvNDI5NDk2NzI5NjowKTtmb3IodmFyIHQ9MjQ7dD49MDt0LT04KXRoaXMud3JpdGUodGhpcy50b3RhbExlbmd0aD4+dCk7dmFyIG49bmV3IHIoMjApLG89bmV3IERhdGFWaWV3KG4uYnVmZmVyKTtyZXR1cm4gby5zZXRVaW50MzIoMCx0aGlzLmgwLCExKSxvLnNldFVpbnQzMig0LHRoaXMuaDEsITEpLG8uc2V0VWludDMyKDgsdGhpcy5oMiwhMSksby5zZXRVaW50MzIoMTIsdGhpcy5oMywhMSksby5zZXRVaW50MzIoMTYsdGhpcy5oNCwhMSksZT9uLnRvU3RyaW5nKGUpOm59LGkucHJvdG90eXBlLnByb2Nlc3NCbG9jaz1mdW5jdGlvbigpe2Zvcih2YXIgZT0xNjtlPDgwO2UrKyl7dmFyIHQ9dGhpcy5ibG9ja1tlLTNdXnRoaXMuYmxvY2tbZS04XV50aGlzLmJsb2NrW2UtMTRdXnRoaXMuYmxvY2tbZS0xNl07dGhpcy5ibG9ja1tlXT10PDwxfHQ+Pj4zMX12YXIgbixyLG89dGhpcy5oMCxpPXRoaXMuaDEscz10aGlzLmgyLGE9dGhpcy5oMyxjPXRoaXMuaDQ7Zm9yKGU9MDtlPDgwO2UrKyl7ZTwyMD8obj1hXmkmKHNeYSkscj0xNTE4NTAwMjQ5KTplPDQwPyhuPWlec15hLHI9MTg1OTc3NTM5Myk6ZTw2MD8obj1pJnN8YSYoaXxzKSxyPTI0MDA5NTk3MDgpOihuPWlec15hLHI9MzM5NTQ2OTc4Mik7dmFyIHU9KG88PDV8bz4+PjI3KStuK2MrcisoMHx0aGlzLmJsb2NrW2VdKTtjPWEsYT1zLHM9aTw8MzB8aT4+PjIsaT1vLG89dX1mb3IodGhpcy5oMD10aGlzLmgwK298MCx0aGlzLmgxPXRoaXMuaDEraXwwLHRoaXMuaDI9dGhpcy5oMitzfDAsdGhpcy5oMz10aGlzLmgzK2F8MCx0aGlzLmg0PXRoaXMuaDQrY3wwLHRoaXMub2Zmc2V0PTAsZT0wO2U8MTY7ZSsrKXRoaXMuYmxvY2tbZV09MH19LHsiLi9icm93c2VySGFzaFV0aWxzIjoxMSwiYnVmZmVyLyI6ODZ9XSwxNTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoImJ1ZmZlci8iKS5CdWZmZXIsbz1lKCIuL2Jyb3dzZXJIYXNoVXRpbHMiKSxpPTY0LHM9bmV3IFVpbnQzMkFycmF5KFsxMTE2MzUyNDA4LDE4OTk0NDc0NDEsMzA0OTMyMzQ3MSwzOTIxMDA5NTczLDk2MTk4NzE2MywxNTA4OTcwOTkzLDI0NTM2MzU3NDgsMjg3MDc2MzIyMSwzNjI0MzgxMDgwLDMxMDU5ODQwMSw2MDcyMjUyNzgsMTQyNjg4MTk4NywxOTI1MDc4Mzg4LDIxNjIwNzgyMDYsMjYxNDg4ODEwMywzMjQ4MjIyNTgwLDM4MzUzOTA0MDEsNDAyMjIyNDc3NCwyNjQzNDcwNzgsNjA0ODA3NjI4LDc3MDI1NTk4MywxMjQ5MTUwMTIyLDE1NTUwODE2OTIsMTk5NjA2NDk4NiwyNTU0MjIwODgyLDI4MjE4MzQzNDksMjk1Mjk5NjgwOCwzMjEwMzEzNjcxLDMzMzY1NzE4OTEsMzU4NDUyODcxMSwxMTM5MjY5OTMsMzM4MjQxODk1LDY2NjMwNzIwNSw3NzM1Mjk5MTIsMTI5NDc1NzM3MiwxMzk2MTgyMjkxLDE2OTUxODM3MDAsMTk4NjY2MTA1MSwyMTc3MDI2MzUwLDI0NTY5NTYwMzcsMjczMDQ4NTkyMSwyODIwMzAyNDExLDMyNTk3MzA4MDAsMzM0NTc2NDc3MSwzNTE2MDY1ODE3LDM2MDAzNTI4MDQsNDA5NDU3MTkwOSwyNzU0MjMzNDQsNDMwMjI3NzM0LDUwNjk0ODYxNiw2NTkwNjA1NTYsODgzOTk3ODc3LDk1ODEzOTU3MSwxMzIyODIyMjE4LDE1MzcwMDIwNjMsMTc0Nzg3Mzc3OSwxOTU1NTYyMjIyLDIwMjQxMDQ4MTUsMjIyNzczMDQ1MiwyMzYxODUyNDI0LDI0Mjg0MzY0NzQsMjc1NjczNDE4NywzMjA0MDMxNDc5LDMzMjkzMjUyOThdKSxhPU1hdGgucG93KDIsNTMpLTE7ZnVuY3Rpb24gYygpe3RoaXMuc3RhdGU9WzE3NzkwMzM3MDMsMzE0NDEzNDI3NywxMDEzOTA0MjQyLDI3NzM0ODA3NjIsMTM1OTg5MzExOSwyNjAwODIyOTI0LDUyODczNDYzNSwxNTQxNDU5MjI1XSx0aGlzLnRlbXA9bmV3IEludDMyQXJyYXkoNjQpLHRoaXMuYnVmZmVyPW5ldyBVaW50OEFycmF5KDY0KSx0aGlzLmJ1ZmZlckxlbmd0aD0wLHRoaXMuYnl0ZXNIYXNoZWQ9MCx0aGlzLmZpbmlzaGVkPSExfXQuZXhwb3J0cz1jLGMuQkxPQ0tfU0laRT1pLGMucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlKXtpZih0aGlzLmZpbmlzaGVkKXRocm93IG5ldyBFcnJvcigiQXR0ZW1wdGVkIHRvIHVwZGF0ZSBhbiBhbHJlYWR5IGZpbmlzaGVkIGhhc2guIik7aWYoby5pc0VtcHR5RGF0YShlKSlyZXR1cm4gdGhpczt2YXIgdD0wLG49KGU9by5jb252ZXJ0VG9CdWZmZXIoZSkpLmJ5dGVMZW5ndGg7aWYodGhpcy5ieXRlc0hhc2hlZCs9biw4KnRoaXMuYnl0ZXNIYXNoZWQ+YSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBoYXNoIG1vcmUgdGhhbiAyXjUzIC0gMSBiaXRzIik7Zm9yKDtuPjA7KXRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyTGVuZ3RoKytdPWVbdCsrXSxuLS0sdGhpcy5idWZmZXJMZW5ndGg9PT1pJiYodGhpcy5oYXNoQnVmZmVyKCksdGhpcy5idWZmZXJMZW5ndGg9MCk7cmV0dXJuIHRoaXN9LGMucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbihlKXtpZighdGhpcy5maW5pc2hlZCl7dmFyIHQ9OCp0aGlzLmJ5dGVzSGFzaGVkLG49bmV3IERhdGFWaWV3KHRoaXMuYnVmZmVyLmJ1ZmZlcix0aGlzLmJ1ZmZlci5ieXRlT2Zmc2V0LHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpLG89dGhpcy5idWZmZXJMZW5ndGg7aWYobi5zZXRVaW50OCh0aGlzLmJ1ZmZlckxlbmd0aCsrLDEyOCksbyVpPj01Nil7Zm9yKHZhciBzPXRoaXMuYnVmZmVyTGVuZ3RoO3M8aTtzKyspbi5zZXRVaW50OChzLDApO3RoaXMuaGFzaEJ1ZmZlcigpLHRoaXMuYnVmZmVyTGVuZ3RoPTB9Zm9yKHM9dGhpcy5idWZmZXJMZW5ndGg7czw1NjtzKyspbi5zZXRVaW50OChzLDApO24uc2V0VWludDMyKDU2LE1hdGguZmxvb3IodC80Mjk0OTY3Mjk2KSwhMCksbi5zZXRVaW50MzIoNjAsdCksdGhpcy5oYXNoQnVmZmVyKCksdGhpcy5maW5pc2hlZD0hMH12YXIgYT1uZXcgcigzMik7Zm9yKHM9MDtzPDg7cysrKWFbNCpzXT10aGlzLnN0YXRlW3NdPj4+MjQmMjU1LGFbNCpzKzFdPXRoaXMuc3RhdGVbc10+Pj4xNiYyNTUsYVs0KnMrMl09dGhpcy5zdGF0ZVtzXT4+PjgmMjU1LGFbNCpzKzNdPXRoaXMuc3RhdGVbc10+Pj4wJjI1NTtyZXR1cm4gZT9hLnRvU3RyaW5nKGUpOmF9LGMucHJvdG90eXBlLmhhc2hCdWZmZXI9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5idWZmZXIsdD10aGlzLnN0YXRlLG49dFswXSxyPXRbMV0sbz10WzJdLGE9dFszXSxjPXRbNF0sdT10WzVdLGw9dFs2XSxwPXRbN10sZD0wO2Q8aTtkKyspe2lmKGQ8MTYpdGhpcy50ZW1wW2RdPSgyNTUmZVs0KmRdKTw8MjR8KDI1NSZlWzQqZCsxXSk8PDE2fCgyNTUmZVs0KmQrMl0pPDw4fDI1NSZlWzQqZCszXTtlbHNle3ZhciBoPXRoaXMudGVtcFtkLTJdLGY9KGg+Pj4xN3xoPDwxNSleKGg+Pj4xOXxoPDwxMyleaD4+PjEwLGc9KChoPXRoaXMudGVtcFtkLTE1XSk+Pj43fGg8PDI1KV4oaD4+PjE4fGg8PDE0KV5oPj4+Mzt0aGlzLnRlbXBbZF09KGYrdGhpcy50ZW1wW2QtN118MCkrKGcrdGhpcy50ZW1wW2QtMTZdfDApfXZhciBtPSgoKGM+Pj42fGM8PDI2KV4oYz4+PjExfGM8PDIxKV4oYz4+PjI1fGM8PDcpKSsoYyZ1Xn5jJmwpfDApKyhwKyhzW2RdK3RoaXMudGVtcFtkXXwwKXwwKXwwLHY9KChuPj4+MnxuPDwzMCleKG4+Pj4xM3xuPDwxOSleKG4+Pj4yMnxuPDwxMCkpKyhuJnJebiZvXnImbyl8MDtwPWwsbD11LHU9YyxjPWErbXwwLGE9byxvPXIscj1uLG49bSt2fDB9dFswXSs9bix0WzFdKz1yLHRbMl0rPW8sdFszXSs9YSx0WzRdKz1jLHRbNV0rPXUsdFs2XSs9bCx0WzddKz1wfX0seyIuL2Jyb3dzZXJIYXNoVXRpbHMiOjExLCJidWZmZXIvIjo4Nn1dLDE2OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKG4peyhmdW5jdGlvbigpe3ZhciBuPWUoIi4vdXRpbCIpO24uY3J5cHRvLmxpYj1lKCIuL2Jyb3dzZXJDcnlwdG9MaWIiKSxuLkJ1ZmZlcj1lKCJidWZmZXIvIikuQnVmZmVyLG4udXJsPWUoInVybC8iKSxuLnF1ZXJ5c3RyaW5nPWUoInF1ZXJ5c3RyaW5nLyIpLG4ucmVhbENsb2NrPWUoIi4vcmVhbGNsb2NrL2Jyb3dzZXJDbG9jayIpLG4uZW52aXJvbm1lbnQ9ImpzIixuLmNyZWF0ZUV2ZW50U3RyZWFtPWUoIi4vZXZlbnQtc3RyZWFtL2J1ZmZlcmVkLWNyZWF0ZS1ldmVudC1zdHJlYW0iKS5jcmVhdGVFdmVudFN0cmVhbSxuLmlzQnJvd3Nlcj1mdW5jdGlvbigpe3JldHVybiEwfSxuLmlzTm9kZT1mdW5jdGlvbigpe3JldHVybiExfTt2YXIgcj1lKCIuL2NvcmUiKTtpZih0LmV4cG9ydHM9cixlKCIuL2NyZWRlbnRpYWxzIiksZSgiLi9jcmVkZW50aWFscy9jcmVkZW50aWFsX3Byb3ZpZGVyX2NoYWluIiksZSgiLi9jcmVkZW50aWFscy90ZW1wb3JhcnlfY3JlZGVudGlhbHMiKSxlKCIuL2NyZWRlbnRpYWxzL2NoYWluYWJsZV90ZW1wb3JhcnlfY3JlZGVudGlhbHMiKSxlKCIuL2NyZWRlbnRpYWxzL3dlYl9pZGVudGl0eV9jcmVkZW50aWFscyIpLGUoIi4vY3JlZGVudGlhbHMvY29nbml0b19pZGVudGl0eV9jcmVkZW50aWFscyIpLGUoIi4vY3JlZGVudGlhbHMvc2FtbF9jcmVkZW50aWFscyIpLHIuWE1MLlBhcnNlcj1lKCIuL3htbC9icm93c2VyX3BhcnNlciIpLGUoIi4vaHR0cC94aHIiKSx2b2lkIDA9PT1vKXZhciBvPXticm93c2VyOiEwfX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHsiLi9icm93c2VyQ3J5cHRvTGliIjoxMCwiLi9jb3JlIjoxOSwiLi9jcmVkZW50aWFscyI6MjAsIi4vY3JlZGVudGlhbHMvY2hhaW5hYmxlX3RlbXBvcmFyeV9jcmVkZW50aWFscyI6MjEsIi4vY3JlZGVudGlhbHMvY29nbml0b19pZGVudGl0eV9jcmVkZW50aWFscyI6MjIsIi4vY3JlZGVudGlhbHMvY3JlZGVudGlhbF9wcm92aWRlcl9jaGFpbiI6MjMsIi4vY3JlZGVudGlhbHMvc2FtbF9jcmVkZW50aWFscyI6MjQsIi4vY3JlZGVudGlhbHMvdGVtcG9yYXJ5X2NyZWRlbnRpYWxzIjoyNSwiLi9jcmVkZW50aWFscy93ZWJfaWRlbnRpdHlfY3JlZGVudGlhbHMiOjI2LCIuL2V2ZW50LXN0cmVhbS9idWZmZXJlZC1jcmVhdGUtZXZlbnQtc3RyZWFtIjoyOCwiLi9odHRwL3hociI6MzYsIi4vcmVhbGNsb2NrL2Jyb3dzZXJDbG9jayI6NTQsIi4vdXRpbCI6NzQsIi4veG1sL2Jyb3dzZXJfcGFyc2VyIjo3NSxfcHJvY2Vzczo5MSwiYnVmZmVyLyI6ODYsInF1ZXJ5c3RyaW5nLyI6OTgsInVybC8iOjEwMH1dLDE3OltmdW5jdGlvbihlLHQsbil7dmFyIHIsbz1lKCIuL2NvcmUiKTtlKCIuL2NyZWRlbnRpYWxzIiksZSgiLi9jcmVkZW50aWFscy9jcmVkZW50aWFsX3Byb3ZpZGVyX2NoYWluIiksby5Db25maWc9by51dGlsLmluaGVyaXQoe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KSxlPXRoaXMuZXh0cmFjdENyZWRlbnRpYWxzKGUpLG8udXRpbC5lYWNoLmNhbGwodGhpcyx0aGlzLmtleXMsKGZ1bmN0aW9uKHQsbil7dGhpcy5zZXQodCxlW3RdLG4pfSkpfSxnZXRDcmVkZW50aWFsczpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXM7ZnVuY3Rpb24gcih0KXtlKHQsdD9udWxsOm4uY3JlZGVudGlhbHMpfWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm4gbmV3IG8udXRpbC5lcnJvcih0fHxuZXcgRXJyb3Ise2NvZGU6IkNyZWRlbnRpYWxzRXJyb3IiLG1lc3NhZ2U6ZSxuYW1lOiJDcmVkZW50aWFsc0Vycm9yIn0pfW4uY3JlZGVudGlhbHM/ImZ1bmN0aW9uIj09dHlwZW9mIG4uY3JlZGVudGlhbHMuZ2V0P24uY3JlZGVudGlhbHMuZ2V0KChmdW5jdGlvbihlKXtlJiYoZT1pKCJDb3VsZCBub3QgbG9hZCBjcmVkZW50aWFscyBmcm9tICIrbi5jcmVkZW50aWFscy5jb25zdHJ1Y3Rvci5uYW1lLGUpKSxyKGUpfSkpOih0PW51bGwsbi5jcmVkZW50aWFscy5hY2Nlc3NLZXlJZCYmbi5jcmVkZW50aWFscy5zZWNyZXRBY2Nlc3NLZXl8fCh0PWkoIk1pc3NpbmcgY3JlZGVudGlhbHMiKSkscih0KSk6bi5jcmVkZW50aWFsUHJvdmlkZXI/bi5jcmVkZW50aWFsUHJvdmlkZXIucmVzb2x2ZSgoZnVuY3Rpb24oZSx0KXtlJiYoZT1pKCJDb3VsZCBub3QgbG9hZCBjcmVkZW50aWFscyBmcm9tIGFueSBwcm92aWRlcnMiLGUpKSxuLmNyZWRlbnRpYWxzPXQscihlKX0pKTpyKGkoIk5vIGNyZWRlbnRpYWxzIHRvIGxvYWQiKSl9LGdldFRva2VuOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcztmdW5jdGlvbiByKHQpe2UodCx0P251bGw6bi50b2tlbil9ZnVuY3Rpb24gaShlLHQpe3JldHVybiBuZXcgby51dGlsLmVycm9yKHR8fG5ldyBFcnJvcix7Y29kZToiVG9rZW5FcnJvciIsbWVzc2FnZTplLG5hbWU6IlRva2VuRXJyb3IifSl9bi50b2tlbj8iZnVuY3Rpb24iPT10eXBlb2Ygbi50b2tlbi5nZXQ/bi50b2tlbi5nZXQoKGZ1bmN0aW9uKGUpe2UmJihlPWkoIkNvdWxkIG5vdCBsb2FkIHRva2VuIGZyb20gIituLnRva2VuLmNvbnN0cnVjdG9yLm5hbWUsZSkpLHIoZSl9KSk6KHQ9bnVsbCxuLnRva2VuLnRva2VufHwodD1pKCJNaXNzaW5nIHRva2VuIikpLHIodCkpOm4udG9rZW5Qcm92aWRlcj9uLnRva2VuUHJvdmlkZXIucmVzb2x2ZSgoZnVuY3Rpb24oZSx0KXtlJiYoZT1pKCJDb3VsZCBub3QgbG9hZCB0b2tlbiBmcm9tIGFueSBwcm92aWRlcnMiLGUpKSxuLnRva2VuPXQscihlKX0pKTpyKGkoIk5vIHRva2VuIHRvIGxvYWQiKSl9LHVwZGF0ZTpmdW5jdGlvbihlLHQpe3Q9dHx8ITEsZT10aGlzLmV4dHJhY3RDcmVkZW50aWFscyhlKSxvLnV0aWwuZWFjaC5jYWxsKHRoaXMsZSwoZnVuY3Rpb24oZSxuKXsodHx8T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMua2V5cyxlKXx8by5TZXJ2aWNlLmhhc1NlcnZpY2UoZSkpJiZ0aGlzLnNldChlLG4pfSkpfSxsb2FkRnJvbVBhdGg6ZnVuY3Rpb24oZSl7dGhpcy5jbGVhcigpO3ZhciB0PUpTT04ucGFyc2Uoby51dGlsLnJlYWRGaWxlU3luYyhlKSksbj1uZXcgby5GaWxlU3lzdGVtQ3JlZGVudGlhbHMoZSkscj1uZXcgby5DcmVkZW50aWFsUHJvdmlkZXJDaGFpbjtyZXR1cm4gci5wcm92aWRlcnMudW5zaGlmdChuKSxyLnJlc29sdmUoKGZ1bmN0aW9uKGUsbil7aWYoZSl0aHJvdyBlO3QuY3JlZGVudGlhbHM9bn0pKSx0aGlzLmNvbnN0cnVjdG9yKHQpLHRoaXN9LGNsZWFyOmZ1bmN0aW9uKCl7by51dGlsLmVhY2guY2FsbCh0aGlzLHRoaXMua2V5cywoZnVuY3Rpb24oZSl7ZGVsZXRlIHRoaXNbZV19KSksdGhpcy5zZXQoImNyZWRlbnRpYWxzIix2b2lkIDApLHRoaXMuc2V0KCJjcmVkZW50aWFsUHJvdmlkZXIiLHZvaWQgMCl9LHNldDpmdW5jdGlvbihlLHQsbil7dm9pZCAwPT09dD8odm9pZCAwPT09biYmKG49dGhpcy5rZXlzW2VdKSx0aGlzW2VdPSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uY2FsbCh0aGlzKTpuKToiaHR0cE9wdGlvbnMiPT09ZSYmdGhpc1tlXT90aGlzW2VdPW8udXRpbC5tZXJnZSh0aGlzW2VdLHQpOnRoaXNbZV09dH0sa2V5czp7Y3JlZGVudGlhbHM6bnVsbCxjcmVkZW50aWFsUHJvdmlkZXI6bnVsbCxyZWdpb246bnVsbCxsb2dnZXI6bnVsbCxhcGlWZXJzaW9uczp7fSxhcGlWZXJzaW9uOm51bGwsZW5kcG9pbnQ6dm9pZCAwLGh0dHBPcHRpb25zOnt0aW1lb3V0OjEyZTR9LG1heFJldHJpZXM6dm9pZCAwLG1heFJlZGlyZWN0czoxMCxwYXJhbVZhbGlkYXRpb246ITAsc3NsRW5hYmxlZDohMCxzM0ZvcmNlUGF0aFN0eWxlOiExLHMzQnVja2V0RW5kcG9pbnQ6ITEsczNEaXNhYmxlQm9keVNpZ25pbmc6ITAsczNVc0Vhc3QxUmVnaW9uYWxFbmRwb2ludDoibGVnYWN5IixzM1VzZUFyblJlZ2lvbjp2b2lkIDAsY29tcHV0ZUNoZWNrc3VtczohMCxjb252ZXJ0UmVzcG9uc2VUeXBlczohMCxjb3JyZWN0Q2xvY2tTa2V3OiExLGN1c3RvbVVzZXJBZ2VudDpudWxsLGR5bmFtb0RiQ3JjMzI6ITAsc3lzdGVtQ2xvY2tPZmZzZXQ6MCxzaWduYXR1cmVWZXJzaW9uOm51bGwsc2lnbmF0dXJlQ2FjaGU6ITAscmV0cnlEZWxheU9wdGlvbnM6e30sdXNlQWNjZWxlcmF0ZUVuZHBvaW50OiExLGNsaWVudFNpZGVNb25pdG9yaW5nOiExLGVuZHBvaW50RGlzY292ZXJ5RW5hYmxlZDp2b2lkIDAsZW5kcG9pbnRDYWNoZVNpemU6MWUzLGhvc3RQcmVmaXhFbmFibGVkOiEwLHN0c1JlZ2lvbmFsRW5kcG9pbnRzOiJsZWdhY3kiLHVzZUZpcHNFbmRwb2ludDohMSx1c2VEdWFsc3RhY2tFbmRwb2ludDohMSx0b2tlbjpudWxsfSxleHRyYWN0Q3JlZGVudGlhbHM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuYWNjZXNzS2V5SWQmJmUuc2VjcmV0QWNjZXNzS2V5JiYoKGU9by51dGlsLmNvcHkoZSkpLmNyZWRlbnRpYWxzPW5ldyBvLkNyZWRlbnRpYWxzKGUpKSxlfSxzZXRQcm9taXNlc0RlcGVuZGVuY3k6ZnVuY3Rpb24oZSl7cj1lLG51bGw9PT1lJiYiZnVuY3Rpb24iPT10eXBlb2YgUHJvbWlzZSYmKHI9UHJvbWlzZSk7dmFyIHQ9W28uUmVxdWVzdCxvLkNyZWRlbnRpYWxzLG8uQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW5dO28uUzMmJih0LnB1c2goby5TMyksby5TMy5NYW5hZ2VkVXBsb2FkJiZ0LnB1c2goby5TMy5NYW5hZ2VkVXBsb2FkKSksby51dGlsLmFkZFByb21pc2VzKHQscil9LGdldFByb21pc2VzRGVwZW5kZW5jeTpmdW5jdGlvbigpe3JldHVybiByfX0pLG8uY29uZmlnPW5ldyBvLkNvbmZpZ30seyIuL2NvcmUiOjE5LCIuL2NyZWRlbnRpYWxzIjoyMCwiLi9jcmVkZW50aWFscy9jcmVkZW50aWFsX3Byb3ZpZGVyX2NoYWluIjoyM31dLDE4OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKG4peyhmdW5jdGlvbigpe3ZhciByPWUoIi4vY29yZSIpO2Z1bmN0aW9uIG8oZSx0KXtpZigic3RyaW5nIj09dHlwZW9mIGUpe2lmKFsibGVnYWN5IiwicmVnaW9uYWwiXS5pbmRleE9mKGUudG9Mb3dlckNhc2UoKSk+PTApcmV0dXJuIGUudG9Mb3dlckNhc2UoKTt0aHJvdyByLnV0aWwuZXJyb3IobmV3IEVycm9yLHQpfX10LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgaTtpZigoZT1lfHx7fSlbdC5jbGllbnRDb25maWddJiYoaT1vKGVbdC5jbGllbnRDb25maWddLHtjb2RlOiJJbnZhbGlkQ29uZmlndXJhdGlvbiIsbWVzc2FnZTonaW52YWxpZCAiJyt0LmNsaWVudENvbmZpZysnIiBjb25maWd1cmF0aW9uLiBFeHBlY3QgImxlZ2FjeSIgIG9yICJyZWdpb25hbCIuIEdvdCAiJytlW3QuY2xpZW50Q29uZmlnXSsnIi4nfSkpKXJldHVybiBpO2lmKCFyLnV0aWwuaXNOb2RlKCkpcmV0dXJuIGk7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4uZW52LHQuZW52KSYmKGk9byhuLmVudlt0LmVudl0se2NvZGU6IkludmFsaWRFbnZpcm9ubWVudGFsVmFyaWFibGUiLG1lc3NhZ2U6ImludmFsaWQgIit0LmVudisnIGVudmlyb25tZW50YWwgdmFyaWFibGUuIEV4cGVjdCAibGVnYWN5IiAgb3IgInJlZ2lvbmFsIi4gR290ICInK24uZW52W3QuZW52XSsnIi4nfSkpKXJldHVybiBpO3ZhciBzPXt9O3RyeXtzPXIudXRpbC5nZXRQcm9maWxlc0Zyb21TaGFyZWRDb25maWcoci51dGlsLmluaUxvYWRlcilbbi5lbnYuQVdTX1BST0ZJTEV8fHIudXRpbC5kZWZhdWx0UHJvZmlsZV19Y2F0Y2goZSl7fXJldHVybiBzJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocyx0LnNoYXJlZENvbmZpZykmJihpPW8oc1t0LnNoYXJlZENvbmZpZ10se2NvZGU6IkludmFsaWRDb25maWd1cmF0aW9uIixtZXNzYWdlOiJpbnZhbGlkICIrdC5zaGFyZWRDb25maWcrJyBwcm9maWxlIGNvbmZpZy4gRXhwZWN0ICJsZWdhY3kiICBvciAicmVnaW9uYWwiLiBHb3QgIicrc1t0LnNoYXJlZENvbmZpZ10rJyIuJ30pKSxpfX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHsiLi9jb3JlIjoxOSxfcHJvY2Vzczo5MX1dLDE5OltmdW5jdGlvbihlLHQsbil7dmFyIHI9e3V0aWw6ZSgiLi91dGlsIil9Oyh7fSkudG9TdHJpbmcoKSx0LmV4cG9ydHM9cixyLnV0aWwudXBkYXRlKHIse1ZFUlNJT046IjIuMTQ1NS4wIixTaWduZXJzOnt9LFByb3RvY29sOntKc29uOmUoIi4vcHJvdG9jb2wvanNvbiIpLFF1ZXJ5OmUoIi4vcHJvdG9jb2wvcXVlcnkiKSxSZXN0OmUoIi4vcHJvdG9jb2wvcmVzdCIpLFJlc3RKc29uOmUoIi4vcHJvdG9jb2wvcmVzdF9qc29uIiksUmVzdFhtbDplKCIuL3Byb3RvY29sL3Jlc3RfeG1sIil9LFhNTDp7QnVpbGRlcjplKCIuL3htbC9idWlsZGVyIiksUGFyc2VyOm51bGx9LEpTT046e0J1aWxkZXI6ZSgiLi9qc29uL2J1aWxkZXIiKSxQYXJzZXI6ZSgiLi9qc29uL3BhcnNlciIpfSxNb2RlbDp7QXBpOmUoIi4vbW9kZWwvYXBpIiksT3BlcmF0aW9uOmUoIi4vbW9kZWwvb3BlcmF0aW9uIiksU2hhcGU6ZSgiLi9tb2RlbC9zaGFwZSIpLFBhZ2luYXRvcjplKCIuL21vZGVsL3BhZ2luYXRvciIpLFJlc291cmNlV2FpdGVyOmUoIi4vbW9kZWwvcmVzb3VyY2Vfd2FpdGVyIil9LGFwaUxvYWRlcjplKCIuL2FwaV9sb2FkZXIiKSxFbmRwb2ludENhY2hlOmUoIi4uL3ZlbmRvci9lbmRwb2ludC1jYWNoZSIpLkVuZHBvaW50Q2FjaGV9KSxlKCIuL3NlcXVlbnRpYWxfZXhlY3V0b3IiKSxlKCIuL3NlcnZpY2UiKSxlKCIuL2NvbmZpZyIpLGUoIi4vaHR0cCIpLGUoIi4vZXZlbnRfbGlzdGVuZXJzIiksZSgiLi9yZXF1ZXN0IiksZSgiLi9yZXNwb25zZSIpLGUoIi4vcmVzb3VyY2Vfd2FpdGVyIiksZSgiLi9zaWduZXJzL3JlcXVlc3Rfc2lnbmVyIiksZSgiLi9wYXJhbV92YWxpZGF0b3IiKSxlKCIuL21haW50ZW5hbmNlX21vZGVfbWVzc2FnZSIpLHIuZXZlbnRzPW5ldyByLlNlcXVlbnRpYWxFeGVjdXRvcixyLnV0aWwubWVtb2l6ZWRQcm9wZXJ0eShyLCJlbmRwb2ludENhY2hlIiwoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIuRW5kcG9pbnRDYWNoZShyLmNvbmZpZy5lbmRwb2ludENhY2hlU2l6ZSl9KSwhMCl9LHsiLi4vdmVuZG9yL2VuZHBvaW50LWNhY2hlIjoxMTEsIi4vYXBpX2xvYWRlciI6OSwiLi9jb25maWciOjE3LCIuL2V2ZW50X2xpc3RlbmVycyI6MzQsIi4vaHR0cCI6MzUsIi4vanNvbi9idWlsZGVyIjozNywiLi9qc29uL3BhcnNlciI6MzgsIi4vbWFpbnRlbmFuY2VfbW9kZV9tZXNzYWdlIjozOSwiLi9tb2RlbC9hcGkiOjQwLCIuL21vZGVsL29wZXJhdGlvbiI6NDIsIi4vbW9kZWwvcGFnaW5hdG9yIjo0MywiLi9tb2RlbC9yZXNvdXJjZV93YWl0ZXIiOjQ0LCIuL21vZGVsL3NoYXBlIjo0NSwiLi9wYXJhbV92YWxpZGF0b3IiOjQ2LCIuL3Byb3RvY29sL2pzb24iOjQ4LCIuL3Byb3RvY29sL3F1ZXJ5Ijo0OSwiLi9wcm90b2NvbC9yZXN0Ijo1MCwiLi9wcm90b2NvbC9yZXN0X2pzb24iOjUxLCIuL3Byb3RvY29sL3Jlc3RfeG1sIjo1MiwiLi9yZXF1ZXN0Ijo1OCwiLi9yZXNvdXJjZV93YWl0ZXIiOjU5LCIuL3Jlc3BvbnNlIjo2MCwiLi9zZXF1ZW50aWFsX2V4ZWN1dG9yIjo2MSwiLi9zZXJ2aWNlIjo2MiwiLi9zaWduZXJzL3JlcXVlc3Rfc2lnbmVyIjo2NiwiLi91dGlsIjo3NCwiLi94bWwvYnVpbGRlciI6NzZ9XSwyMDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29yZSIpO3IuQ3JlZGVudGlhbHM9ci51dGlsLmluaGVyaXQoe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7aWYoci51dGlsLmhpZGVQcm9wZXJ0aWVzKHRoaXMsWyJzZWNyZXRBY2Nlc3NLZXkiXSksdGhpcy5leHBpcmVkPSExLHRoaXMuZXhwaXJlVGltZT1udWxsLHRoaXMucmVmcmVzaENhbGxiYWNrcz1bXSwxPT09YXJndW1lbnRzLmxlbmd0aCYmIm9iamVjdCI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlPWFyZ3VtZW50c1swXS5jcmVkZW50aWFsc3x8YXJndW1lbnRzWzBdO3RoaXMuYWNjZXNzS2V5SWQ9ZS5hY2Nlc3NLZXlJZCx0aGlzLnNlY3JldEFjY2Vzc0tleT1lLnNlY3JldEFjY2Vzc0tleSx0aGlzLnNlc3Npb25Ub2tlbj1lLnNlc3Npb25Ub2tlbn1lbHNlIHRoaXMuYWNjZXNzS2V5SWQ9YXJndW1lbnRzWzBdLHRoaXMuc2VjcmV0QWNjZXNzS2V5PWFyZ3VtZW50c1sxXSx0aGlzLnNlc3Npb25Ub2tlbj1hcmd1bWVudHNbMl19LGV4cGlyeVdpbmRvdzoxNSxuZWVkc1JlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgZT1yLnV0aWwuZGF0ZS5nZXREYXRlKCkuZ2V0VGltZSgpLHQ9bmV3IERhdGUoZSsxZTMqdGhpcy5leHBpcnlXaW5kb3cpO3JldHVybiEhKHRoaXMuZXhwaXJlVGltZSYmdD50aGlzLmV4cGlyZVRpbWUpfHx0aGlzLmV4cGlyZWR8fCF0aGlzLmFjY2Vzc0tleUlkfHwhdGhpcy5zZWNyZXRBY2Nlc3NLZXl9LGdldDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMubmVlZHNSZWZyZXNoKCk/dGhpcy5yZWZyZXNoKChmdW5jdGlvbihuKXtufHwodC5leHBpcmVkPSExKSxlJiZlKG4pfSkpOmUmJmUoKX0scmVmcmVzaDpmdW5jdGlvbihlKXt0aGlzLmV4cGlyZWQ9ITEsZSgpfSxjb2FsZXNjZVJlZnJlc2g6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzOzE9PT1uLnJlZnJlc2hDYWxsYmFja3MucHVzaChlKSYmbi5sb2FkKChmdW5jdGlvbihlKXtyLnV0aWwuYXJyYXlFYWNoKG4ucmVmcmVzaENhbGxiYWNrcywoZnVuY3Rpb24obil7dD9uKGUpOnIudXRpbC5kZWZlcigoZnVuY3Rpb24oKXtuKGUpfSkpfSkpLG4ucmVmcmVzaENhbGxiYWNrcy5sZW5ndGg9MH0pKX0sbG9hZDpmdW5jdGlvbihlKXtlKCl9fSksci5DcmVkZW50aWFscy5hZGRQcm9taXNlc1RvQ2xhc3M9ZnVuY3Rpb24oZSl7dGhpcy5wcm90b3R5cGUuZ2V0UHJvbWlzZT1yLnV0aWwucHJvbWlzaWZ5TWV0aG9kKCJnZXQiLGUpLHRoaXMucHJvdG90eXBlLnJlZnJlc2hQcm9taXNlPXIudXRpbC5wcm9taXNpZnlNZXRob2QoInJlZnJlc2giLGUpfSxyLkNyZWRlbnRpYWxzLmRlbGV0ZVByb21pc2VzRnJvbUNsYXNzPWZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMucHJvdG90eXBlLmdldFByb21pc2UsZGVsZXRlIHRoaXMucHJvdG90eXBlLnJlZnJlc2hQcm9taXNlfSxyLnV0aWwuYWRkUHJvbWlzZXMoci5DcmVkZW50aWFscyl9LHsiLi9jb3JlIjoxOX1dLDIxOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiLi4vLi4vY2xpZW50cy9zdHMiKTtyLkNoYWluYWJsZVRlbXBvcmFyeUNyZWRlbnRpYWxzPXIudXRpbC5pbmhlcml0KHIuQ3JlZGVudGlhbHMse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3IuQ3JlZGVudGlhbHMuY2FsbCh0aGlzKSxlPWV8fHt9LHRoaXMuZXJyb3JDb2RlPSJDaGFpbmFibGVUZW1wb3JhcnlDcmVkZW50aWFsc1Byb3ZpZGVyRmFpbHVyZSIsdGhpcy5leHBpcmVkPSEwLHRoaXMudG9rZW5Db2RlRm49bnVsbDt2YXIgdD1yLnV0aWwuY29weShlLnBhcmFtcyl8fHt9O2lmKHQuUm9sZUFybiYmKHQuUm9sZVNlc3Npb25OYW1lPXQuUm9sZVNlc3Npb25OYW1lfHwidGVtcG9yYXJ5LWNyZWRlbnRpYWxzIiksdC5TZXJpYWxOdW1iZXIpe2lmKCFlLnRva2VuQ29kZUZufHwiZnVuY3Rpb24iIT10eXBlb2YgZS50b2tlbkNvZGVGbil0aHJvdyBuZXcgci51dGlsLmVycm9yKG5ldyBFcnJvcigidG9rZW5Db2RlRm4gbXVzdCBiZSBhIGZ1bmN0aW9uIHdoZW4gcGFyYW1zLlNlcmlhbE51bWJlciBpcyBnaXZlbiIpLHtjb2RlOnRoaXMuZXJyb3JDb2RlfSk7dGhpcy50b2tlbkNvZGVGbj1lLnRva2VuQ29kZUZufXZhciBuPXIudXRpbC5tZXJnZSh7cGFyYW1zOnQsY3JlZGVudGlhbHM6ZS5tYXN0ZXJDcmVkZW50aWFsc3x8ci5jb25maWcuY3JlZGVudGlhbHN9LGUuc3RzQ29uZmlnfHx7fSk7dGhpcy5zZXJ2aWNlPW5ldyBvKG4pfSxyZWZyZXNoOmZ1bmN0aW9uKGUpe3RoaXMuY29hbGVzY2VSZWZyZXNoKGV8fHIudXRpbC5mbi5jYWxsYmFjayl9LGxvYWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXQuc2VydmljZS5jb25maWcucGFyYW1zLlJvbGVBcm4/ImFzc3VtZVJvbGUiOiJnZXRTZXNzaW9uVG9rZW4iO3RoaXMuZ2V0VG9rZW5Db2RlKChmdW5jdGlvbihyLG8pe3ZhciBpPXt9O3I/ZShyKToobyYmKGkuVG9rZW5Db2RlPW8pLHQuc2VydmljZVtuXShpLChmdW5jdGlvbihuLHIpe258fHQuc2VydmljZS5jcmVkZW50aWFsc0Zyb20ocix0KSxlKG4pfSkpKX0pKX0sZ2V0VG9rZW5Db2RlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy50b2tlbkNvZGVGbj90aGlzLnRva2VuQ29kZUZuKHRoaXMuc2VydmljZS5jb25maWcucGFyYW1zLlNlcmlhbE51bWJlciwoZnVuY3Rpb24obixvKXtpZihuKXt2YXIgaT1uO3JldHVybiBuIGluc3RhbmNlb2YgRXJyb3ImJihpPW4ubWVzc2FnZSksdm9pZCBlKHIudXRpbC5lcnJvcihuZXcgRXJyb3IoIkVycm9yIGZldGNoaW5nIE1GQSB0b2tlbjogIitpKSx7Y29kZTp0LmVycm9yQ29kZX0pKX1lKG51bGwsbyl9KSk6ZShudWxsKX19KX0seyIuLi8uLi9jbGllbnRzL3N0cyI6OCwiLi4vY29yZSI6MTl9XSwyMjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uLy4uL2NsaWVudHMvY29nbml0b2lkZW50aXR5IiksaT1lKCIuLi8uLi9jbGllbnRzL3N0cyIpO3IuQ29nbml0b0lkZW50aXR5Q3JlZGVudGlhbHM9ci51dGlsLmluaGVyaXQoci5DcmVkZW50aWFscyx7bG9jYWxTdG9yYWdlS2V5OntpZDoiYXdzLmNvZ25pdG8uaWRlbnRpdHktaWQuIixwcm92aWRlcnM6ImF3cy5jb2duaXRvLmlkZW50aXR5LXByb3ZpZGVycy4ifSxjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLHQpe3IuQ3JlZGVudGlhbHMuY2FsbCh0aGlzKSx0aGlzLmV4cGlyZWQ9ITAsdGhpcy5wYXJhbXM9ZSx0aGlzLmRhdGE9bnVsbCx0aGlzLl9pZGVudGl0eUlkPW51bGwsdGhpcy5fY2xpZW50Q29uZmlnPXIudXRpbC5jb3B5KHR8fHt9KSx0aGlzLmxvYWRDYWNoZWRJZCgpO3ZhciBuPXRoaXM7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkZW50aXR5SWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5sb2FkQ2FjaGVkSWQoKSxuLl9pZGVudGl0eUlkfHxuLnBhcmFtcy5JZGVudGl0eUlkfSxzZXQ6ZnVuY3Rpb24oZSl7bi5faWRlbnRpdHlJZD1lfX0pfSxyZWZyZXNoOmZ1bmN0aW9uKGUpe3RoaXMuY29hbGVzY2VSZWZyZXNoKGV8fHIudXRpbC5mbi5jYWxsYmFjayl9LGxvYWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0LmNyZWF0ZUNsaWVudHMoKSx0LmRhdGE9bnVsbCx0Ll9pZGVudGl0eUlkPW51bGwsdC5nZXRJZCgoZnVuY3Rpb24obil7bj8odC5jbGVhcklkT25Ob3RBdXRob3JpemVkKG4pLGUobikpOnQucGFyYW1zLlJvbGVBcm4/dC5nZXRDcmVkZW50aWFsc0Zyb21TVFMoZSk6dC5nZXRDcmVkZW50aWFsc0ZvcklkZW50aXR5KGUpfSkpfSxjbGVhckNhY2hlZElkOmZ1bmN0aW9uKCl7dGhpcy5faWRlbnRpdHlJZD1udWxsLGRlbGV0ZSB0aGlzLnBhcmFtcy5JZGVudGl0eUlkO3ZhciBlPXRoaXMucGFyYW1zLklkZW50aXR5UG9vbElkLHQ9dGhpcy5wYXJhbXMuTG9naW5JZHx8IiI7ZGVsZXRlIHRoaXMuc3RvcmFnZVt0aGlzLmxvY2FsU3RvcmFnZUtleS5pZCtlK3RdLGRlbGV0ZSB0aGlzLnN0b3JhZ2VbdGhpcy5sb2NhbFN0b3JhZ2VLZXkucHJvdmlkZXJzK2UrdF19LGNsZWFySWRPbk5vdEF1dGhvcml6ZWQ6ZnVuY3Rpb24oZSl7Ik5vdEF1dGhvcml6ZWRFeGNlcHRpb24iPT1lLmNvZGUmJnRoaXMuY2xlYXJDYWNoZWRJZCgpfSxnZXRJZDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKCJzdHJpbmciPT10eXBlb2YgdC5wYXJhbXMuSWRlbnRpdHlJZClyZXR1cm4gZShudWxsLHQucGFyYW1zLklkZW50aXR5SWQpO3QuY29nbml0by5nZXRJZCgoZnVuY3Rpb24obixyKXshbiYmci5JZGVudGl0eUlkPyh0LnBhcmFtcy5JZGVudGl0eUlkPXIuSWRlbnRpdHlJZCxlKG51bGwsci5JZGVudGl0eUlkKSk6ZShuKX0pKX0sbG9hZENyZWRlbnRpYWxzOmZ1bmN0aW9uKGUsdCl7ZSYmdCYmKHQuZXhwaXJlZD0hMSx0LmFjY2Vzc0tleUlkPWUuQ3JlZGVudGlhbHMuQWNjZXNzS2V5SWQsdC5zZWNyZXRBY2Nlc3NLZXk9ZS5DcmVkZW50aWFscy5TZWNyZXRLZXksdC5zZXNzaW9uVG9rZW49ZS5DcmVkZW50aWFscy5TZXNzaW9uVG9rZW4sdC5leHBpcmVUaW1lPWUuQ3JlZGVudGlhbHMuRXhwaXJhdGlvbil9LGdldENyZWRlbnRpYWxzRm9ySWRlbnRpdHk6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0LmNvZ25pdG8uZ2V0Q3JlZGVudGlhbHNGb3JJZGVudGl0eSgoZnVuY3Rpb24obixyKXtuP3QuY2xlYXJJZE9uTm90QXV0aG9yaXplZChuKToodC5jYWNoZUlkKHIpLHQuZGF0YT1yLHQubG9hZENyZWRlbnRpYWxzKHQuZGF0YSx0KSksZShuKX0pKX0sZ2V0Q3JlZGVudGlhbHNGcm9tU1RTOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5jb2duaXRvLmdldE9wZW5JZFRva2VuKChmdW5jdGlvbihuLHIpe24/KHQuY2xlYXJJZE9uTm90QXV0aG9yaXplZChuKSxlKG4pKToodC5jYWNoZUlkKHIpLHQucGFyYW1zLldlYklkZW50aXR5VG9rZW49ci5Ub2tlbix0LndlYklkZW50aXR5Q3JlZGVudGlhbHMucmVmcmVzaCgoZnVuY3Rpb24obil7bnx8KHQuZGF0YT10LndlYklkZW50aXR5Q3JlZGVudGlhbHMuZGF0YSx0LnN0cy5jcmVkZW50aWFsc0Zyb20odC5kYXRhLHQpKSxlKG4pfSkpKX0pKX0sbG9hZENhY2hlZElkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZihyLnV0aWwuaXNCcm93c2VyKCkmJiFlLnBhcmFtcy5JZGVudGl0eUlkKXt2YXIgdD1lLmdldFN0b3JhZ2UoImlkIik7aWYodCYmZS5wYXJhbXMuTG9naW5zKXt2YXIgbj1PYmplY3Qua2V5cyhlLnBhcmFtcy5Mb2dpbnMpOzAhPT0oZS5nZXRTdG9yYWdlKCJwcm92aWRlcnMiKXx8IiIpLnNwbGl0KCIsIikuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4tMSE9PW4uaW5kZXhPZihlKX0pKS5sZW5ndGgmJihlLnBhcmFtcy5JZGVudGl0eUlkPXQpfWVsc2UgdCYmKGUucGFyYW1zLklkZW50aXR5SWQ9dCl9fSxjcmVhdGVDbGllbnRzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fY2xpZW50Q29uZmlnO2lmKHRoaXMud2ViSWRlbnRpdHlDcmVkZW50aWFscz10aGlzLndlYklkZW50aXR5Q3JlZGVudGlhbHN8fG5ldyByLldlYklkZW50aXR5Q3JlZGVudGlhbHModGhpcy5wYXJhbXMsZSksIXRoaXMuY29nbml0byl7dmFyIHQ9ci51dGlsLm1lcmdlKHt9LGUpO3QucGFyYW1zPXRoaXMucGFyYW1zLHRoaXMuY29nbml0bz1uZXcgbyh0KX10aGlzLnN0cz10aGlzLnN0c3x8bmV3IGkoZSl9LGNhY2hlSWQ6ZnVuY3Rpb24oZSl7dGhpcy5faWRlbnRpdHlJZD1lLklkZW50aXR5SWQsdGhpcy5wYXJhbXMuSWRlbnRpdHlJZD10aGlzLl9pZGVudGl0eUlkLHIudXRpbC5pc0Jyb3dzZXIoKSYmKHRoaXMuc2V0U3RvcmFnZSgiaWQiLGUuSWRlbnRpdHlJZCksdGhpcy5wYXJhbXMuTG9naW5zJiZ0aGlzLnNldFN0b3JhZ2UoInByb3ZpZGVycyIsT2JqZWN0LmtleXModGhpcy5wYXJhbXMuTG9naW5zKS5qb2luKCIsIikpKX0sZ2V0U3RvcmFnZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zdG9yYWdlW3RoaXMubG9jYWxTdG9yYWdlS2V5W2VdK3RoaXMucGFyYW1zLklkZW50aXR5UG9vbElkKyh0aGlzLnBhcmFtcy5Mb2dpbklkfHwiIildfSxzZXRTdG9yYWdlOmZ1bmN0aW9uKGUsdCl7dHJ5e3RoaXMuc3RvcmFnZVt0aGlzLmxvY2FsU3RvcmFnZUtleVtlXSt0aGlzLnBhcmFtcy5JZGVudGl0eVBvb2xJZCsodGhpcy5wYXJhbXMuTG9naW5JZHx8IiIpXT10fWNhdGNoKGUpe319LHN0b3JhZ2U6ZnVuY3Rpb24oKXt0cnl7dmFyIGU9ci51dGlsLmlzQnJvd3NlcigpJiZudWxsIT09d2luZG93LmxvY2FsU3RvcmFnZSYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cubG9jYWxTdG9yYWdlP3dpbmRvdy5sb2NhbFN0b3JhZ2U6e307cmV0dXJuIGVbImF3cy50ZXN0LXN0b3JhZ2UiXT0iZm9vYmFyIixkZWxldGUgZVsiYXdzLnRlc3Qtc3RvcmFnZSJdLGV9Y2F0Y2goZSl7cmV0dXJue319fSgpfSl9LHsiLi4vLi4vY2xpZW50cy9jb2duaXRvaWRlbnRpdHkiOjcsIi4uLy4uL2NsaWVudHMvc3RzIjo4LCIuLi9jb3JlIjoxOX1dLDIzOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpO3IuQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW49ci51dGlsLmluaGVyaXQoci5DcmVkZW50aWFscyx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSl7dGhpcy5wcm92aWRlcnM9ZXx8ci5DcmVkZW50aWFsUHJvdmlkZXJDaGFpbi5kZWZhdWx0UHJvdmlkZXJzLnNsaWNlKDApLHRoaXMucmVzb2x2ZUNhbGxiYWNrcz1bXX0scmVzb2x2ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKDA9PT10LnByb3ZpZGVycy5sZW5ndGgpcmV0dXJuIGUobmV3IEVycm9yKCJObyBwcm92aWRlcnMiKSksdDtpZigxPT09dC5yZXNvbHZlQ2FsbGJhY2tzLnB1c2goZSkpe3ZhciBuPTAsbz10LnByb3ZpZGVycy5zbGljZSgwKTshZnVuY3Rpb24gZShpLHMpe2lmKCFpJiZzfHxuPT09by5sZW5ndGgpcmV0dXJuIHIudXRpbC5hcnJheUVhY2godC5yZXNvbHZlQ2FsbGJhY2tzLChmdW5jdGlvbihlKXtlKGkscyl9KSksdm9pZCh0LnJlc29sdmVDYWxsYmFja3MubGVuZ3RoPTApO3ZhciBhPW9bbisrXTsocz0iZnVuY3Rpb24iPT10eXBlb2YgYT9hLmNhbGwoKTphKS5nZXQ/cy5nZXQoKGZ1bmN0aW9uKHQpe2UodCx0P251bGw6cyl9KSk6ZShudWxsLHMpfSgpfXJldHVybiB0fX0pLHIuQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW4uZGVmYXVsdFByb3ZpZGVycz1bXSxyLkNyZWRlbnRpYWxQcm92aWRlckNoYWluLmFkZFByb21pc2VzVG9DbGFzcz1mdW5jdGlvbihlKXt0aGlzLnByb3RvdHlwZS5yZXNvbHZlUHJvbWlzZT1yLnV0aWwucHJvbWlzaWZ5TWV0aG9kKCJyZXNvbHZlIixlKX0sci5DcmVkZW50aWFsUHJvdmlkZXJDaGFpbi5kZWxldGVQcm9taXNlc0Zyb21DbGFzcz1mdW5jdGlvbigpe2RlbGV0ZSB0aGlzLnByb3RvdHlwZS5yZXNvbHZlUHJvbWlzZX0sci51dGlsLmFkZFByb21pc2VzKHIuQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW4pfSx7Ii4uL2NvcmUiOjE5fV0sMjQ6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCIuLi8uLi9jbGllbnRzL3N0cyIpO3IuU0FNTENyZWRlbnRpYWxzPXIudXRpbC5pbmhlcml0KHIuQ3JlZGVudGlhbHMse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3IuQ3JlZGVudGlhbHMuY2FsbCh0aGlzKSx0aGlzLmV4cGlyZWQ9ITAsdGhpcy5wYXJhbXM9ZX0scmVmcmVzaDpmdW5jdGlvbihlKXt0aGlzLmNvYWxlc2NlUmVmcmVzaChlfHxyLnV0aWwuZm4uY2FsbGJhY2spfSxsb2FkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5jcmVhdGVDbGllbnRzKCksdC5zZXJ2aWNlLmFzc3VtZVJvbGVXaXRoU0FNTCgoZnVuY3Rpb24obixyKXtufHx0LnNlcnZpY2UuY3JlZGVudGlhbHNGcm9tKHIsdCksZShuKX0pKX0sY3JlYXRlQ2xpZW50czpmdW5jdGlvbigpe3RoaXMuc2VydmljZT10aGlzLnNlcnZpY2V8fG5ldyBvKHtwYXJhbXM6dGhpcy5wYXJhbXN9KX19KX0seyIuLi8uLi9jbGllbnRzL3N0cyI6OCwiLi4vY29yZSI6MTl9XSwyNTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uLy4uL2NsaWVudHMvc3RzIik7ci5UZW1wb3JhcnlDcmVkZW50aWFscz1yLnV0aWwuaW5oZXJpdChyLkNyZWRlbnRpYWxzLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLHQpe3IuQ3JlZGVudGlhbHMuY2FsbCh0aGlzKSx0aGlzLmxvYWRNYXN0ZXJDcmVkZW50aWFscyh0KSx0aGlzLmV4cGlyZWQ9ITAsdGhpcy5wYXJhbXM9ZXx8e30sdGhpcy5wYXJhbXMuUm9sZUFybiYmKHRoaXMucGFyYW1zLlJvbGVTZXNzaW9uTmFtZT10aGlzLnBhcmFtcy5Sb2xlU2Vzc2lvbk5hbWV8fCJ0ZW1wb3JhcnktY3JlZGVudGlhbHMiKX0scmVmcmVzaDpmdW5jdGlvbihlKXt0aGlzLmNvYWxlc2NlUmVmcmVzaChlfHxyLnV0aWwuZm4uY2FsbGJhY2spfSxsb2FkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5jcmVhdGVDbGllbnRzKCksdC5tYXN0ZXJDcmVkZW50aWFscy5nZXQoKGZ1bmN0aW9uKCl7dC5zZXJ2aWNlLmNvbmZpZy5jcmVkZW50aWFscz10Lm1hc3RlckNyZWRlbnRpYWxzLCh0LnBhcmFtcy5Sb2xlQXJuP3Quc2VydmljZS5hc3N1bWVSb2xlOnQuc2VydmljZS5nZXRTZXNzaW9uVG9rZW4pLmNhbGwodC5zZXJ2aWNlLChmdW5jdGlvbihuLHIpe258fHQuc2VydmljZS5jcmVkZW50aWFsc0Zyb20ocix0KSxlKG4pfSkpfSkpfSxsb2FkTWFzdGVyQ3JlZGVudGlhbHM6ZnVuY3Rpb24oZSl7Zm9yKHRoaXMubWFzdGVyQ3JlZGVudGlhbHM9ZXx8ci5jb25maWcuY3JlZGVudGlhbHM7dGhpcy5tYXN0ZXJDcmVkZW50aWFscy5tYXN0ZXJDcmVkZW50aWFsczspdGhpcy5tYXN0ZXJDcmVkZW50aWFscz10aGlzLm1hc3RlckNyZWRlbnRpYWxzLm1hc3RlckNyZWRlbnRpYWxzOyJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzLm1hc3RlckNyZWRlbnRpYWxzLmdldCYmKHRoaXMubWFzdGVyQ3JlZGVudGlhbHM9bmV3IHIuQ3JlZGVudGlhbHModGhpcy5tYXN0ZXJDcmVkZW50aWFscykpfSxjcmVhdGVDbGllbnRzOmZ1bmN0aW9uKCl7dGhpcy5zZXJ2aWNlPXRoaXMuc2VydmljZXx8bmV3IG8oe3BhcmFtczp0aGlzLnBhcmFtc30pfX0pfSx7Ii4uLy4uL2NsaWVudHMvc3RzIjo4LCIuLi9jb3JlIjoxOX1dLDI2OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiLi4vLi4vY2xpZW50cy9zdHMiKTtyLldlYklkZW50aXR5Q3JlZGVudGlhbHM9ci51dGlsLmluaGVyaXQoci5DcmVkZW50aWFscyx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0KXtyLkNyZWRlbnRpYWxzLmNhbGwodGhpcyksdGhpcy5leHBpcmVkPSEwLHRoaXMucGFyYW1zPWUsdGhpcy5wYXJhbXMuUm9sZVNlc3Npb25OYW1lPXRoaXMucGFyYW1zLlJvbGVTZXNzaW9uTmFtZXx8IndlYi1pZGVudGl0eSIsdGhpcy5kYXRhPW51bGwsdGhpcy5fY2xpZW50Q29uZmlnPXIudXRpbC5jb3B5KHR8fHt9KX0scmVmcmVzaDpmdW5jdGlvbihlKXt0aGlzLmNvYWxlc2NlUmVmcmVzaChlfHxyLnV0aWwuZm4uY2FsbGJhY2spfSxsb2FkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5jcmVhdGVDbGllbnRzKCksdC5zZXJ2aWNlLmFzc3VtZVJvbGVXaXRoV2ViSWRlbnRpdHkoKGZ1bmN0aW9uKG4scil7dC5kYXRhPW51bGwsbnx8KHQuZGF0YT1yLHQuc2VydmljZS5jcmVkZW50aWFsc0Zyb20ocix0KSksZShuKX0pKX0sY3JlYXRlQ2xpZW50czpmdW5jdGlvbigpe2lmKCF0aGlzLnNlcnZpY2Upe3ZhciBlPXIudXRpbC5tZXJnZSh7fSx0aGlzLl9jbGllbnRDb25maWcpO2UucGFyYW1zPXRoaXMucGFyYW1zLHRoaXMuc2VydmljZT1uZXcgbyhlKX19fSl9LHsiLi4vLi4vY2xpZW50cy9zdHMiOjgsIi4uL2NvcmUiOjE5fV0sMjc6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24obil7KGZ1bmN0aW9uKCl7dmFyIHI9ZSgiLi9jb3JlIiksbz1lKCIuL3V0aWwiKSxpPVsiQVdTX0VOQUJMRV9FTkRQT0lOVF9ESVNDT1ZFUlkiLCJBV1NfRU5EUE9JTlRfRElTQ09WRVJZX0VOQUJMRUQiXTtmdW5jdGlvbiBzKGUpe3ZhciB0PWUuc2VydmljZSxuPXQuYXBpfHx7fSxyPShuLm9wZXJhdGlvbnMse30pO3JldHVybiB0LmNvbmZpZy5yZWdpb24mJihyLnJlZ2lvbj10LmNvbmZpZy5yZWdpb24pLG4uc2VydmljZUlkJiYoci5zZXJ2aWNlSWQ9bi5zZXJ2aWNlSWQpLHQuY29uZmlnLmNyZWRlbnRpYWxzLmFjY2Vzc0tleUlkJiYoci5hY2Nlc3NLZXlJZD10LmNvbmZpZy5jcmVkZW50aWFscy5hY2Nlc3NLZXlJZCkscn1mdW5jdGlvbiBhKGUsdCxuKXtuJiZudWxsIT10JiYic3RydWN0dXJlIj09PW4udHlwZSYmbi5yZXF1aXJlZCYmbi5yZXF1aXJlZC5sZW5ndGg+MCYmby5hcnJheUVhY2gobi5yZXF1aXJlZCwoZnVuY3Rpb24ocil7dmFyIG89bi5tZW1iZXJzW3JdO2lmKCEwPT09by5lbmRwb2ludERpc2NvdmVyeUlkKXt2YXIgaT1vLmlzTG9jYXRpb25OYW1lP28ubmFtZTpyO2VbaV09U3RyaW5nKHRbcl0pfWVsc2UgYShlLHRbcl0sbyl9KSl9ZnVuY3Rpb24gYyhlLHQpe3ZhciBuPXt9O3JldHVybiBhKG4sZS5wYXJhbXMsdCksbn1mdW5jdGlvbiB1KGUpe3ZhciB0PWUuc2VydmljZSxuPXQuYXBpLGk9bi5vcGVyYXRpb25zP24ub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl06dm9pZCAwLGE9YyhlLGk/aS5pbnB1dDp2b2lkIDApLHU9cyhlKTtPYmplY3Qua2V5cyhhKS5sZW5ndGg+MCYmKHU9by51cGRhdGUodSxhKSxpJiYodS5vcGVyYXRpb249aS5uYW1lKSk7dmFyIGw9ci5lbmRwb2ludENhY2hlLmdldCh1KTtpZighbHx8MSE9PWwubGVuZ3RofHwiIiE9PWxbMF0uQWRkcmVzcylpZihsJiZsLmxlbmd0aD4wKWUuaHR0cFJlcXVlc3QudXBkYXRlRW5kcG9pbnQobFswXS5BZGRyZXNzKTtlbHNle3ZhciBwPXQubWFrZVJlcXVlc3Qobi5lbmRwb2ludE9wZXJhdGlvbix7T3BlcmF0aW9uOmkubmFtZSxJZGVudGlmaWVyczphfSk7ZChwKSxwLnJlbW92ZUxpc3RlbmVyKCJ2YWxpZGF0ZSIsci5FdmVudExpc3RlbmVycy5Db3JlLlZBTElEQVRFX1BBUkFNRVRFUlMpLHAucmVtb3ZlTGlzdGVuZXIoInJldHJ5IixyLkV2ZW50TGlzdGVuZXJzLkNvcmUuUkVUUllfQ0hFQ0spLHIuZW5kcG9pbnRDYWNoZS5wdXQodSxbe0FkZHJlc3M6IiIsQ2FjaGVQZXJpb2RJbk1pbnV0ZXM6MX1dKSxwLnNlbmQoKGZ1bmN0aW9uKGUsdCl7dCYmdC5FbmRwb2ludHM/ci5lbmRwb2ludENhY2hlLnB1dCh1LHQuRW5kcG9pbnRzKTplJiZyLmVuZHBvaW50Q2FjaGUucHV0KHUsW3tBZGRyZXNzOiIiLENhY2hlUGVyaW9kSW5NaW51dGVzOjF9XSl9KSl9fXZhciBsPXt9O2Z1bmN0aW9uIHAoZSx0KXt2YXIgbj1lLnNlcnZpY2UsaT1uLmFwaSxhPWkub3BlcmF0aW9ucz9pLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dOnZvaWQgMCx1PWE/YS5pbnB1dDp2b2lkIDAscD1jKGUsdSksaD1zKGUpO09iamVjdC5rZXlzKHApLmxlbmd0aD4wJiYoaD1vLnVwZGF0ZShoLHApLGEmJihoLm9wZXJhdGlvbj1hLm5hbWUpKTt2YXIgZj1yLkVuZHBvaW50Q2FjaGUuZ2V0S2V5U3RyaW5nKGgpLGc9ci5lbmRwb2ludENhY2hlLmdldChmKTtpZihnJiYxPT09Zy5sZW5ndGgmJiIiPT09Z1swXS5BZGRyZXNzKXJldHVybiBsW2ZdfHwobFtmXT1bXSksdm9pZCBsW2ZdLnB1c2goe3JlcXVlc3Q6ZSxjYWxsYmFjazp0fSk7aWYoZyYmZy5sZW5ndGg+MCllLmh0dHBSZXF1ZXN0LnVwZGF0ZUVuZHBvaW50KGdbMF0uQWRkcmVzcyksdCgpO2Vsc2V7dmFyIG09bi5tYWtlUmVxdWVzdChpLmVuZHBvaW50T3BlcmF0aW9uLHtPcGVyYXRpb246YS5uYW1lLElkZW50aWZpZXJzOnB9KTttLnJlbW92ZUxpc3RlbmVyKCJ2YWxpZGF0ZSIsci5FdmVudExpc3RlbmVycy5Db3JlLlZBTElEQVRFX1BBUkFNRVRFUlMpLGQobSksci5lbmRwb2ludENhY2hlLnB1dChmLFt7QWRkcmVzczoiIixDYWNoZVBlcmlvZEluTWludXRlczo2MH1dKSxtLnNlbmQoKGZ1bmN0aW9uKG4saSl7aWYobil7aWYoZS5yZXNwb25zZS5lcnJvcj1vLmVycm9yKG4se3JldHJ5YWJsZTohMX0pLHIuZW5kcG9pbnRDYWNoZS5yZW1vdmUoaCksbFtmXSl7dmFyIHM9bFtmXTtvLmFycmF5RWFjaChzLChmdW5jdGlvbihlKXtlLnJlcXVlc3QucmVzcG9uc2UuZXJyb3I9by5lcnJvcihuLHtyZXRyeWFibGU6ITF9KSxlLmNhbGxiYWNrKCl9KSksZGVsZXRlIGxbZl19fWVsc2UgaSYmKHIuZW5kcG9pbnRDYWNoZS5wdXQoZixpLkVuZHBvaW50cyksZS5odHRwUmVxdWVzdC51cGRhdGVFbmRwb2ludChpLkVuZHBvaW50c1swXS5BZGRyZXNzKSxsW2ZdKSYmKHM9bFtmXSxvLmFycmF5RWFjaChzLChmdW5jdGlvbihlKXtlLnJlcXVlc3QuaHR0cFJlcXVlc3QudXBkYXRlRW5kcG9pbnQoaS5FbmRwb2ludHNbMF0uQWRkcmVzcyksZS5jYWxsYmFjaygpfSkpLGRlbGV0ZSBsW2ZdKTt0KCl9KSl9fWZ1bmN0aW9uIGQoZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5hcGlWZXJzaW9uO3QmJiFlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIngtYW16LWFwaS12ZXJzaW9uIl0mJihlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIngtYW16LWFwaS12ZXJzaW9uIl09dCl9ZnVuY3Rpb24gaChlKXt2YXIgdD1lLmVycm9yLG49ZS5odHRwUmVzcG9uc2U7aWYodCYmKCJJbnZhbGlkRW5kcG9pbnRFeGNlcHRpb24iPT09dC5jb2RlfHw0MjE9PT1uLnN0YXR1c0NvZGUpKXt2YXIgaT1lLnJlcXVlc3QsYT1pLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnN8fHt9LHU9YyhpLGFbaS5vcGVyYXRpb25dP2FbaS5vcGVyYXRpb25dLmlucHV0OnZvaWQgMCksbD1zKGkpO09iamVjdC5rZXlzKHUpLmxlbmd0aD4wJiYobD1vLnVwZGF0ZShsLHUpLGFbaS5vcGVyYXRpb25dJiYobC5vcGVyYXRpb249YVtpLm9wZXJhdGlvbl0ubmFtZSkpLHIuZW5kcG9pbnRDYWNoZS5yZW1vdmUobCl9fWZ1bmN0aW9uIGYoZSl7cmV0dXJuWyJmYWxzZSIsIjAiXS5pbmRleE9mKGUpPj0wfXQuZXhwb3J0cz17ZGlzY292ZXJFbmRwb2ludDpmdW5jdGlvbihlLHQpe3ZhciBzPWUuc2VydmljZXx8e307aWYoZnVuY3Rpb24oZSl7aWYoZS5fb3JpZ2luYWxDb25maWcmJmUuX29yaWdpbmFsQ29uZmlnLmVuZHBvaW50JiYhMD09PWUuX29yaWdpbmFsQ29uZmlnLmVuZHBvaW50RGlzY292ZXJ5RW5hYmxlZCl0aHJvdyBvLmVycm9yKG5ldyBFcnJvcix7Y29kZToiQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiIsbWVzc2FnZToiQ3VzdG9tIGVuZHBvaW50IGlzIHN1cHBsaWVkOyBlbmRwb2ludERpc2NvdmVyeUVuYWJsZWQgbXVzdCBub3QgYmUgdHJ1ZS4ifSk7dmFyIHQ9ci5jb25maWdbZS5zZXJ2aWNlSWRlbnRpZmllcl18fHt9O3JldHVybiBCb29sZWFuKHIuY29uZmlnLmVuZHBvaW50fHx0LmVuZHBvaW50fHxlLl9vcmlnaW5hbENvbmZpZyYmZS5fb3JpZ2luYWxDb25maWcuZW5kcG9pbnQpfShzKXx8ZS5pc1ByZXNpZ25lZCgpKXJldHVybiB0KCk7dmFyIGE9KHMuYXBpLm9wZXJhdGlvbnN8fHt9KVtlLm9wZXJhdGlvbl0sYz1hP2EuZW5kcG9pbnREaXNjb3ZlcnlSZXF1aXJlZDoiTlVMTCIsbD1mdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2V8fHt9O2lmKHZvaWQgMCE9PXQuY29uZmlnLmVuZHBvaW50RGlzY292ZXJ5RW5hYmxlZClyZXR1cm4gdC5jb25maWcuZW5kcG9pbnREaXNjb3ZlcnlFbmFibGVkO2lmKCFvLmlzQnJvd3NlcigpKXtmb3IodmFyIHM9MDtzPGkubGVuZ3RoO3MrKyl7dmFyIGE9aVtzXTtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobi5lbnYsYSkpe2lmKCIiPT09bi5lbnZbYV18fHZvaWQgMD09PW4uZW52W2FdKXRocm93IG8uZXJyb3IobmV3IEVycm9yLHtjb2RlOiJDb25maWd1cmF0aW9uRXhjZXB0aW9uIixtZXNzYWdlOiJlbnZpcm9ubWVudGFsIHZhcmlhYmxlICIrYSsiIGNhbm5vdCBiZSBzZXQgdG8gbm90aGluZyJ9KTtyZXR1cm4hZihuLmVudlthXSl9fXZhciBjPXt9O3RyeXtjPXIudXRpbC5pbmlMb2FkZXI/ci51dGlsLmluaUxvYWRlci5sb2FkRnJvbSh7aXNDb25maWc6ITAsZmlsZW5hbWU6bi5lbnZbci51dGlsLnNoYXJlZENvbmZpZ0ZpbGVFbnZdfSk6e319Y2F0Y2goZSl7fXZhciB1PWNbbi5lbnYuQVdTX1BST0ZJTEV8fHIudXRpbC5kZWZhdWx0UHJvZmlsZV18fHt9O2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh1LCJlbmRwb2ludF9kaXNjb3ZlcnlfZW5hYmxlZCIpKXtpZih2b2lkIDA9PT11LmVuZHBvaW50X2Rpc2NvdmVyeV9lbmFibGVkKXRocm93IG8uZXJyb3IobmV3IEVycm9yLHtjb2RlOiJDb25maWd1cmF0aW9uRXhjZXB0aW9uIixtZXNzYWdlOiJjb25maWcgZmlsZSBlbnRyeSAnZW5kcG9pbnRfZGlzY292ZXJ5X2VuYWJsZWQnIGNhbm5vdCBiZSBzZXQgdG8gbm90aGluZyJ9KTtyZXR1cm4hZih1LmVuZHBvaW50X2Rpc2NvdmVyeV9lbmFibGVkKX19fShlKSxkPXMuYXBpLmhhc1JlcXVpcmVkRW5kcG9pbnREaXNjb3Zlcnk7c3dpdGNoKChsfHxkKSYmZS5odHRwUmVxdWVzdC5hcHBlbmRUb1VzZXJBZ2VudCgiZW5kcG9pbnQtZGlzY292ZXJ5IiksYyl7Y2FzZSJPUFRJT05BTCI6KGx8fGQpJiYodShlKSxlLmFkZE5hbWVkTGlzdGVuZXIoIklOVkFMSURBVEVfQ0FDSEVEX0VORFBPSU5UUyIsImV4dHJhY3RFcnJvciIsaCkpLHQoKTticmVhaztjYXNlIlJFUVVJUkVEIjppZighMT09PWwpe2UucmVzcG9uc2UuZXJyb3I9by5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IkNvbmZpZ3VyYXRpb25FeGNlcHRpb24iLG1lc3NhZ2U6IkVuZHBvaW50IERpc2NvdmVyeSBpcyBkaXNhYmxlZCBidXQgIitzLmFwaS5jbGFzc05hbWUrIi4iK2Uub3BlcmF0aW9uKyIoKSByZXF1aXJlcyBpdC4gUGxlYXNlIGNoZWNrIHlvdXIgY29uZmlndXJhdGlvbnMuIn0pLHQoKTticmVha31lLmFkZE5hbWVkTGlzdGVuZXIoIklOVkFMSURBVEVfQ0FDSEVEX0VORFBPSU5UUyIsImV4dHJhY3RFcnJvciIsaCkscChlLHQpO2JyZWFrO2RlZmF1bHQ6dCgpfX0scmVxdWlyZWREaXNjb3ZlckVuZHBvaW50OnAsb3B0aW9uYWxEaXNjb3ZlckVuZHBvaW50OnUsbWFyc2hhbGxDdXN0b21JZGVudGlmaWVyczpjLGdldENhY2hlS2V5OnMsaW52YWxpZGF0ZUNhY2hlZEVuZHBvaW50Omh9fSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpKX0seyIuL2NvcmUiOjE5LCIuL3V0aWwiOjc0LF9wcm9jZXNzOjkxfV0sMjg6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9ldmVudC1zdHJlYW0vZXZlbnQtbWVzc2FnZS1jaHVua2VyIikuZXZlbnRNZXNzYWdlQ2h1bmtlcixvPWUoIi4vcGFyc2UtZXZlbnQiKS5wYXJzZUV2ZW50O3QuZXhwb3J0cz17Y3JlYXRlRXZlbnRTdHJlYW06ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgaT1yKGUpLHM9W10sYT0wO2E8aS5sZW5ndGg7YSsrKXMucHVzaChvKHQsaVthXSxuKSk7cmV0dXJuIHN9fX0seyIuLi9ldmVudC1zdHJlYW0vZXZlbnQtbWVzc2FnZS1jaHVua2VyIjoyOSwiLi9wYXJzZS1ldmVudCI6MzF9XSwyOTpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17ZXZlbnRNZXNzYWdlQ2h1bmtlcjpmdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7KXt2YXIgcj1lLnJlYWRJbnQzMkJFKG4pLG89ZS5zbGljZShuLHIrbik7bis9cix0LnB1c2gobyl9cmV0dXJuIHR9fX0se31dLDMwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLnV0aWwsbz1yLmJ1ZmZlci50b0J1ZmZlcjtmdW5jdGlvbiBpKGUpe2lmKDghPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkludDY0IGJ1ZmZlcnMgbXVzdCBiZSBleGFjdGx5IDggYnl0ZXMiKTtyLkJ1ZmZlci5pc0J1ZmZlcihlKXx8KGU9byhlKSksdGhpcy5ieXRlcz1lfWZ1bmN0aW9uIHMoZSl7Zm9yKHZhciB0PTA7dDw4O3QrKyllW3RdXj0yNTU7Zm9yKHQ9Nzt0Pi0xJiYoZVt0XSsrLDA9PT1lW3RdKTt0LS0pO31pLmZyb21OdW1iZXI9ZnVuY3Rpb24oZSl7aWYoZT4weDgwMDAwMDAwMDAwMDAwMDB8fGU8LTB4ODAwMDAwMDAwMDAwMDAwMCl0aHJvdyBuZXcgRXJyb3IoZSsiIGlzIHRvbyBsYXJnZSAob3IsIGlmIG5lZ2F0aXZlLCB0b28gc21hbGwpIHRvIHJlcHJlc2VudCBhcyBhbiBJbnQ2NCIpO2Zvcih2YXIgdD1uZXcgVWludDhBcnJheSg4KSxuPTcscj1NYXRoLmFicyhNYXRoLnJvdW5kKGUpKTtuPi0xJiZyPjA7bi0tLHIvPTI1Nil0W25dPXI7cmV0dXJuIGU8MCYmcyh0KSxuZXcgaSh0KX0saS5wcm90b3R5cGUudmFsdWVPZj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuYnl0ZXMuc2xpY2UoMCksdD0xMjgmZVswXTtyZXR1cm4gdCYmcyhlKSxwYXJzZUludChlLnRvU3RyaW5nKCJoZXgiKSwxNikqKHQ/LTE6MSl9LGkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIFN0cmluZyh0aGlzLnZhbHVlT2YoKSl9LHQuZXhwb3J0cz17SW50NjQ6aX19LHsiLi4vY29yZSI6MTl9XSwzMTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vcGFyc2UtbWVzc2FnZSIpLnBhcnNlTWVzc2FnZTt0LmV4cG9ydHM9e3BhcnNlRXZlbnQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPXIodCksaT1vLmhlYWRlcnNbIjptZXNzYWdlLXR5cGUiXTtpZihpKXtpZigiZXJyb3IiPT09aS52YWx1ZSl0aHJvdyBmdW5jdGlvbihlKXt2YXIgdD1lLmhlYWRlcnNbIjplcnJvci1jb2RlIl0sbj1lLmhlYWRlcnNbIjplcnJvci1tZXNzYWdlIl0scj1uZXcgRXJyb3Iobi52YWx1ZXx8bik7cmV0dXJuIHIuY29kZT1yLm5hbWU9dC52YWx1ZXx8dCxyfShvKTtpZigiZXZlbnQiIT09aS52YWx1ZSlyZXR1cm59dmFyIHM9by5oZWFkZXJzWyI6ZXZlbnQtdHlwZSJdLGE9bi5tZW1iZXJzW3MudmFsdWVdO2lmKGEpe3ZhciBjPXt9LHU9YS5ldmVudFBheWxvYWRNZW1iZXJOYW1lO2lmKHUpe3ZhciBsPWEubWVtYmVyc1t1XTsiYmluYXJ5Ij09PWwudHlwZT9jW3VdPW8uYm9keTpjW3VdPWUucGFyc2Uoby5ib2R5LnRvU3RyaW5nKCksbCl9Zm9yKHZhciBwPWEuZXZlbnRIZWFkZXJNZW1iZXJOYW1lcyxkPTA7ZDxwLmxlbmd0aDtkKyspe3ZhciBoPXBbZF07by5oZWFkZXJzW2hdJiYoY1toXT1hLm1lbWJlcnNbaF0udG9UeXBlKG8uaGVhZGVyc1toXS52YWx1ZSkpfXZhciBmPXt9O3JldHVybiBmW3MudmFsdWVdPWMsZn19fX0seyIuL3BhcnNlLW1lc3NhZ2UiOjMyfV0sMzI6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2ludDY0IikuSW50NjQsbz1lKCIuL3NwbGl0LW1lc3NhZ2UiKS5zcGxpdE1lc3NhZ2UsaT0iYm9vbGVhbiIscz0iYnl0ZSIsYT0ic2hvcnQiLGM9ImludGVnZXIiLHU9ImxvbmciLGw9ImJpbmFyeSIscD0ic3RyaW5nIixkPSJ0aW1lc3RhbXAiLGg9InV1aWQiO2Z1bmN0aW9uIGYoZSl7Zm9yKHZhciB0PXt9LG49MDtuPGUubGVuZ3RoOyl7dmFyIG89ZS5yZWFkVUludDgobisrKSxmPWUuc2xpY2UobixuK28pLnRvU3RyaW5nKCk7c3dpdGNoKG4rPW8sZS5yZWFkVUludDgobisrKSl7Y2FzZSAwOnRbZl09e3R5cGU6aSx2YWx1ZTohMH07YnJlYWs7Y2FzZSAxOnRbZl09e3R5cGU6aSx2YWx1ZTohMX07YnJlYWs7Y2FzZSAyOnRbZl09e3R5cGU6cyx2YWx1ZTplLnJlYWRJbnQ4KG4rKyl9O2JyZWFrO2Nhc2UgMzp0W2ZdPXt0eXBlOmEsdmFsdWU6ZS5yZWFkSW50MTZCRShuKX0sbis9MjticmVhaztjYXNlIDQ6dFtmXT17dHlwZTpjLHZhbHVlOmUucmVhZEludDMyQkUobil9LG4rPTQ7YnJlYWs7Y2FzZSA1OnRbZl09e3R5cGU6dSx2YWx1ZTpuZXcgcihlLnNsaWNlKG4sbis4KSl9LG4rPTg7YnJlYWs7Y2FzZSA2OnZhciBnPWUucmVhZFVJbnQxNkJFKG4pO24rPTIsdFtmXT17dHlwZTpsLHZhbHVlOmUuc2xpY2UobixuK2cpfSxuKz1nO2JyZWFrO2Nhc2UgNzp2YXIgbT1lLnJlYWRVSW50MTZCRShuKTtuKz0yLHRbZl09e3R5cGU6cCx2YWx1ZTplLnNsaWNlKG4sbittKS50b1N0cmluZygpfSxuKz1tO2JyZWFrO2Nhc2UgODp0W2ZdPXt0eXBlOmQsdmFsdWU6bmV3IERhdGUobmV3IHIoZS5zbGljZShuLG4rOCkpLnZhbHVlT2YoKSl9LG4rPTg7YnJlYWs7Y2FzZSA5OnZhciB2PWUuc2xpY2UobixuKzE2KS50b1N0cmluZygiaGV4Iik7bis9MTYsdFtmXT17dHlwZTpoLHZhbHVlOnYuc3Vic3RyKDAsOCkrIi0iK3Yuc3Vic3RyKDgsNCkrIi0iK3Yuc3Vic3RyKDEyLDQpKyItIit2LnN1YnN0cigxNiw0KSsiLSIrdi5zdWJzdHIoMjApfTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIGhlYWRlciB0eXBlIHRhZyIpfX1yZXR1cm4gdH10LmV4cG9ydHM9e3BhcnNlTWVzc2FnZTpmdW5jdGlvbihlKXt2YXIgdD1vKGUpO3JldHVybntoZWFkZXJzOmYodC5oZWFkZXJzKSxib2R5OnQuYm9keX19fX0seyIuL2ludDY0IjozMCwiLi9zcGxpdC1tZXNzYWdlIjozM31dLDMzOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLnV0aWwsbz1yLmJ1ZmZlci50b0J1ZmZlcjt0LmV4cG9ydHM9e3NwbGl0TWVzc2FnZTpmdW5jdGlvbihlKXtpZihyLkJ1ZmZlci5pc0J1ZmZlcihlKXx8KGU9byhlKSksZS5sZW5ndGg8MTYpdGhyb3cgbmV3IEVycm9yKCJQcm92aWRlZCBtZXNzYWdlIHRvbyBzaG9ydCB0byBhY2NvbW1vZGF0ZSBldmVudCBzdHJlYW0gbWVzc2FnZSBvdmVyaGVhZCIpO2lmKGUubGVuZ3RoIT09ZS5yZWFkVUludDMyQkUoMCkpdGhyb3cgbmV3IEVycm9yKCJSZXBvcnRlZCBtZXNzYWdlIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCByZWNlaXZlZCBtZXNzYWdlIGxlbmd0aCIpO3ZhciB0PWUucmVhZFVJbnQzMkJFKDgpO2lmKHQhPT1yLmNyeXB0by5jcmMzMihlLnNsaWNlKDAsOCkpKXRocm93IG5ldyBFcnJvcigiVGhlIHByZWx1ZGUgY2hlY2tzdW0gc3BlY2lmaWVkIGluIHRoZSBtZXNzYWdlICgiK3QrIikgZG9lcyBub3QgbWF0Y2ggdGhlIGNhbGN1bGF0ZWQgQ1JDMzIgY2hlY2tzdW0uIik7dmFyIG49ZS5yZWFkVUludDMyQkUoZS5sZW5ndGgtNCk7aWYobiE9PXIuY3J5cHRvLmNyYzMyKGUuc2xpY2UoMCxlLmxlbmd0aC00KSkpdGhyb3cgbmV3IEVycm9yKCJUaGUgbWVzc2FnZSBjaGVja3N1bSBkaWQgbm90IG1hdGNoIHRoZSBleHBlY3RlZCB2YWx1ZSBvZiAiK24pO3ZhciBpPTEyK2UucmVhZFVJbnQzMkJFKDQpO3JldHVybntoZWFkZXJzOmUuc2xpY2UoMTIsaSksYm9keTplLnNsaWNlKGksZS5sZW5ndGgtNCl9fX19LHsiLi4vY29yZSI6MTl9XSwzNDpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbih0KXsoZnVuY3Rpb24oKXt2YXIgbj1lKCIuL2NvcmUiKSxyPWUoIi4vc2VxdWVudGlhbF9leGVjdXRvciIpLG89ZSgiLi9kaXNjb3Zlcl9lbmRwb2ludCIpLmRpc2NvdmVyRW5kcG9pbnQ7ZnVuY3Rpb24gaShlKXtpZighZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zKXJldHVybiIiO3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl07cmV0dXJuIHQ/dC5hdXRodHlwZToiIn1mdW5jdGlvbiBzKGUpe3ZhciB0PWUuc2VydmljZTtyZXR1cm4gdC5jb25maWcuc2lnbmF0dXJlVmVyc2lvbj90LmNvbmZpZy5zaWduYXR1cmVWZXJzaW9uOnQuYXBpLnNpZ25hdHVyZVZlcnNpb24/dC5hcGkuc2lnbmF0dXJlVmVyc2lvbjppKGUpfW4uRXZlbnRMaXN0ZW5lcnM9e0NvcmU6e319LG4uRXZlbnRMaXN0ZW5lcnM9e0NvcmU6KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24oZSxyKXtyKCJWQUxJREFURV9DUkVERU5USUFMUyIsInZhbGlkYXRlIiwoZnVuY3Rpb24oZSx0KXtpZighZS5zZXJ2aWNlLmFwaS5zaWduYXR1cmVWZXJzaW9uJiYhZS5zZXJ2aWNlLmNvbmZpZy5zaWduYXR1cmVWZXJzaW9uKXJldHVybiB0KCk7ImJlYXJlciIhPT1zKGUpP2Uuc2VydmljZS5jb25maWcuZ2V0Q3JlZGVudGlhbHMoKGZ1bmN0aW9uKHIpe3ImJihlLnJlc3BvbnNlLmVycm9yPW4udXRpbC5lcnJvcihyLHtjb2RlOiJDcmVkZW50aWFsc0Vycm9yIixtZXNzYWdlOiJNaXNzaW5nIGNyZWRlbnRpYWxzIGluIGNvbmZpZywgaWYgdXNpbmcgQVdTX0NPTkZJR19GSUxFLCBzZXQgQVdTX1NES19MT0FEX0NPTkZJRz0xIn0pKSx0KCl9KSk6ZS5zZXJ2aWNlLmNvbmZpZy5nZXRUb2tlbigoZnVuY3Rpb24ocil7ciYmKGUucmVzcG9uc2UuZXJyb3I9bi51dGlsLmVycm9yKHIse2NvZGU6IlRva2VuRXJyb3IifSkpLHQoKX0pKX0pKSxlKCJWQUxJREFURV9SRUdJT04iLCJ2YWxpZGF0ZSIsKGZ1bmN0aW9uKGUpe2lmKCFlLnNlcnZpY2UuaXNHbG9iYWxFbmRwb2ludCl7dmFyIHQ9bmV3IFJlZ0V4cCgvXihbYS16QS1aMC05XXxbYS16QS1aMC05XVthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKSQvKTtlLnNlcnZpY2UuY29uZmlnLnJlZ2lvbj90LnRlc3QoZS5zZXJ2aWNlLmNvbmZpZy5yZWdpb24pfHwoZS5yZXNwb25zZS5lcnJvcj1uLnV0aWwuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJDb25maWdFcnJvciIsbWVzc2FnZToiSW52YWxpZCByZWdpb24gaW4gY29uZmlnIn0pKTplLnJlc3BvbnNlLmVycm9yPW4udXRpbC5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IkNvbmZpZ0Vycm9yIixtZXNzYWdlOiJNaXNzaW5nIHJlZ2lvbiBpbiBjb25maWcifSl9fSkpLGUoIkJVSUxEX0lERU1QT1RFTkNZX1RPS0VOUyIsInZhbGlkYXRlIiwoZnVuY3Rpb24oZSl7aWYoZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zKXt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dO2lmKHQpe3ZhciByPXQuaWRlbXBvdGVudE1lbWJlcnM7aWYoci5sZW5ndGgpe2Zvcih2YXIgbz1uLnV0aWwuY29weShlLnBhcmFtcyksaT0wLHM9ci5sZW5ndGg7aTxzO2krKylvW3JbaV1dfHwob1tyW2ldXT1uLnV0aWwudXVpZC52NCgpKTtlLnBhcmFtcz1vfX19fSkpLGUoIlZBTElEQVRFX1BBUkFNRVRFUlMiLCJ2YWxpZGF0ZSIsKGZ1bmN0aW9uKGUpe2lmKGUuc2VydmljZS5hcGkub3BlcmF0aW9ucyl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXS5pbnB1dCxyPWUuc2VydmljZS5jb25maWcucGFyYW1WYWxpZGF0aW9uO25ldyBuLlBhcmFtVmFsaWRhdG9yKHIpLnZhbGlkYXRlKHQsZS5wYXJhbXMpfX0pKSxlKCJDT01QVVRFX0NIRUNLU1VNIiwiYWZ0ZXJCdWlsZCIsKGZ1bmN0aW9uKGUpe2lmKGUuc2VydmljZS5hcGkub3BlcmF0aW9ucyl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXTtpZih0KXt2YXIgcj1lLmh0dHBSZXF1ZXN0LmJvZHksbz1yJiYobi51dGlsLkJ1ZmZlci5pc0J1ZmZlcihyKXx8InN0cmluZyI9PXR5cGVvZiByKSxpPWUuaHR0cFJlcXVlc3QuaGVhZGVycztpZih0Lmh0dHBDaGVja3N1bVJlcXVpcmVkJiZlLnNlcnZpY2UuY29uZmlnLmNvbXB1dGVDaGVja3N1bXMmJm8mJiFpWyJDb250ZW50LU1ENSJdKXt2YXIgcz1uLnV0aWwuY3J5cHRvLm1kNShyLCJiYXNlNjQiKTtpWyJDb250ZW50LU1ENSJdPXN9fX19KSkscigiQ09NUFVURV9TSEEyNTYiLCJhZnRlckJ1aWxkIiwoZnVuY3Rpb24oZSx0KXtpZihlLmhhbHRIYW5kbGVyc09uRXJyb3IoKSxlLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnMpe3ZhciByPWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0sbz1yP3IuYXV0aHR5cGU6IiI7aWYoIWUuc2VydmljZS5hcGkuc2lnbmF0dXJlVmVyc2lvbiYmIW8mJiFlLnNlcnZpY2UuY29uZmlnLnNpZ25hdHVyZVZlcnNpb24pcmV0dXJuIHQoKTtpZihlLnNlcnZpY2UuZ2V0U2lnbmVyQ2xhc3MoZSk9PT1uLlNpZ25lcnMuVjQpe3ZhciBpPWUuaHR0cFJlcXVlc3QuYm9keXx8IiI7aWYoby5pbmRleE9mKCJ1bnNpZ25lZC1ib2R5Iik+PTApcmV0dXJuIGUuaHR0cFJlcXVlc3QuaGVhZGVyc1siWC1BbXotQ29udGVudC1TaGEyNTYiXT0iVU5TSUdORUQtUEFZTE9BRCIsdCgpO24udXRpbC5jb21wdXRlU2hhMjU2KGksKGZ1bmN0aW9uKG4scil7bj90KG4pOihlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIlgtQW16LUNvbnRlbnQtU2hhMjU2Il09cix0KCkpfSkpfWVsc2UgdCgpfX0pKSxlKCJTRVRfQ09OVEVOVF9MRU5HVEgiLCJhZnRlckJ1aWxkIiwoZnVuY3Rpb24oZSl7dmFyIHQ9aShlKSxyPW4udXRpbC5nZXRSZXF1ZXN0UGF5bG9hZFNoYXBlKGUpO2lmKHZvaWQgMD09PWUuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1MZW5ndGgiXSl0cnl7dmFyIG89bi51dGlsLnN0cmluZy5ieXRlTGVuZ3RoKGUuaHR0cFJlcXVlc3QuYm9keSk7ZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LUxlbmd0aCJdPW99Y2F0Y2gobil7aWYociYmci5pc1N0cmVhbWluZyl7aWYoci5yZXF1aXJlc0xlbmd0aCl0aHJvdyBuO2lmKHQuaW5kZXhPZigidW5zaWduZWQtYm9keSIpPj0wKXJldHVybiB2b2lkKGUuaHR0cFJlcXVlc3QuaGVhZGVyc1siVHJhbnNmZXItRW5jb2RpbmciXT0iY2h1bmtlZCIpO3Rocm93IG59dGhyb3cgbn19KSksZSgiU0VUX0hUVFBfSE9TVCIsImFmdGVyQnVpbGQiLChmdW5jdGlvbihlKXtlLmh0dHBSZXF1ZXN0LmhlYWRlcnMuSG9zdD1lLmh0dHBSZXF1ZXN0LmVuZHBvaW50Lmhvc3R9KSksZSgiU0VUX1RSQUNFX0lEIiwiYWZ0ZXJCdWlsZCIsKGZ1bmN0aW9uKGUpe3ZhciByPSJYLUFtem4tVHJhY2UtSWQiO2lmKG4udXRpbC5pc05vZGUoKSYmIU9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUuaHR0cFJlcXVlc3QuaGVhZGVycyxyKSl7dmFyIG89dC5lbnYuQVdTX0xBTUJEQV9GVU5DVElPTl9OQU1FLGk9dC5lbnYuX1hfQU1aTl9UUkFDRV9JRDsic3RyaW5nIj09dHlwZW9mIG8mJm8ubGVuZ3RoPjAmJiJzdHJpbmciPT10eXBlb2YgaSYmaS5sZW5ndGg+MCYmKGUuaHR0cFJlcXVlc3QuaGVhZGVyc1tyXT1pKX19KSksZSgiUkVTVEFSVCIsInJlc3RhcnQiLChmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVzcG9uc2UuZXJyb3I7ZSYmZS5yZXRyeWFibGUmJih0aGlzLmh0dHBSZXF1ZXN0PW5ldyBuLkh0dHBSZXF1ZXN0KHRoaXMuc2VydmljZS5lbmRwb2ludCx0aGlzLnNlcnZpY2UucmVnaW9uKSx0aGlzLnJlc3BvbnNlLnJldHJ5Q291bnQ8dGhpcy5zZXJ2aWNlLmNvbmZpZy5tYXhSZXRyaWVzP3RoaXMucmVzcG9uc2UucmV0cnlDb3VudCsrOnRoaXMucmVzcG9uc2UuZXJyb3I9bnVsbCl9KSkscigiRElTQ09WRVJfRU5EUE9JTlQiLCJzaWduIixvLCEwKSxyKCJTSUdOIiwic2lnbiIsKGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5zZXJ2aWNlLHI9cyhlKTtpZighcnx8MD09PXIubGVuZ3RoKXJldHVybiB0KCk7ImJlYXJlciI9PT1yP24uY29uZmlnLmdldFRva2VuKChmdW5jdGlvbihyLG8pe2lmKHIpcmV0dXJuIGUucmVzcG9uc2UuZXJyb3I9cix0KCk7dHJ5e25ldyhuLmdldFNpZ25lckNsYXNzKGUpKShlLmh0dHBSZXF1ZXN0KS5hZGRBdXRob3JpemF0aW9uKG8pfWNhdGNoKHQpe2UucmVzcG9uc2UuZXJyb3I9dH10KCl9KSk6bi5jb25maWcuZ2V0Q3JlZGVudGlhbHMoKGZ1bmN0aW9uKHIsbyl7aWYocilyZXR1cm4gZS5yZXNwb25zZS5lcnJvcj1yLHQoKTt0cnl7dmFyIGk9bi5nZXRTa2V3Q29ycmVjdGVkRGF0ZSgpLHM9bi5nZXRTaWduZXJDbGFzcyhlKSxhPShlLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnN8fHt9KVtlLm9wZXJhdGlvbl0sYz1uZXcgcyhlLmh0dHBSZXF1ZXN0LG4uZ2V0U2lnbmluZ05hbWUoZSkse3NpZ25hdHVyZUNhY2hlOm4uY29uZmlnLnNpZ25hdHVyZUNhY2hlLG9wZXJhdGlvbjphLHNpZ25hdHVyZVZlcnNpb246bi5hcGkuc2lnbmF0dXJlVmVyc2lvbn0pO2Muc2V0U2VydmljZUNsaWVudElkKG4uX2NsaWVudElkKSxkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzLkF1dGhvcml6YXRpb24sZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVycy5EYXRlLGRlbGV0ZSBlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIlgtQW16LURhdGUiXSxjLmFkZEF1dGhvcml6YXRpb24obyxpKSxlLnNpZ25lZEF0PWl9Y2F0Y2godCl7ZS5yZXNwb25zZS5lcnJvcj10fXQoKX0pKX0pKSxlKCJWQUxJREFURV9SRVNQT05TRSIsInZhbGlkYXRlUmVzcG9uc2UiLChmdW5jdGlvbihlKXt0aGlzLnNlcnZpY2Uuc3VjY2Vzc2Z1bFJlc3BvbnNlKGUsdGhpcyk/KGUuZGF0YT17fSxlLmVycm9yPW51bGwpOihlLmRhdGE9bnVsbCxlLmVycm9yPW4udXRpbC5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IlVua25vd25FcnJvciIsbWVzc2FnZToiQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZC4ifSkpfSkpLGUoIkVSUk9SIiwiZXJyb3IiLChmdW5jdGlvbihlLHQpe2lmKHQucmVxdWVzdC5zZXJ2aWNlLmFwaS5hd3NRdWVyeUNvbXBhdGlibGUpe3ZhciBuPXQuaHR0cFJlc3BvbnNlLmhlYWRlcnMscj1uP25bIngtYW16bi1xdWVyeS1lcnJvciJdOnZvaWQgMDtyJiZyLmluY2x1ZGVzKCI7IikmJih0LmVycm9yLmNvZGU9ci5zcGxpdCgiOyIpWzBdKX19KSwhMCkscigiU0VORCIsInNlbmQiLChmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIHIocil7ZS5odHRwUmVzcG9uc2Uuc3RyZWFtPXI7dmFyIG89ZS5yZXF1ZXN0Lmh0dHBSZXF1ZXN0LnN0cmVhbSxpPWUucmVxdWVzdC5zZXJ2aWNlLHM9aS5hcGksYT1lLnJlcXVlc3Qub3BlcmF0aW9uLGM9cy5vcGVyYXRpb25zW2FdfHx7fTtyLm9uKCJoZWFkZXJzIiwoZnVuY3Rpb24obyxzLGEpe2lmKGUucmVxdWVzdC5lbWl0KCJodHRwSGVhZGVycyIsW28scyxlLGFdKSwhZS5odHRwUmVzcG9uc2Uuc3RyZWFtaW5nKWlmKDI9PT1uLkh0dHBDbGllbnQuc3RyZWFtc0FwaVZlcnNpb24pe2lmKGMuaGFzRXZlbnRPdXRwdXQmJmkuc3VjY2Vzc2Z1bFJlc3BvbnNlKGUpKXJldHVybiBlLnJlcXVlc3QuZW1pdCgiaHR0cERvbmUiKSx2b2lkIHQoKTtyLm9uKCJyZWFkYWJsZSIsKGZ1bmN0aW9uKCl7dmFyIHQ9ci5yZWFkKCk7bnVsbCE9PXQmJmUucmVxdWVzdC5lbWl0KCJodHRwRGF0YSIsW3QsZV0pfSkpfWVsc2Ugci5vbigiZGF0YSIsKGZ1bmN0aW9uKHQpe2UucmVxdWVzdC5lbWl0KCJodHRwRGF0YSIsW3QsZV0pfSkpfSkpLHIub24oImVuZCIsKGZ1bmN0aW9uKCl7aWYoIW98fCFvLmRpZENhbGxiYWNrKXtpZigyPT09bi5IdHRwQ2xpZW50LnN0cmVhbXNBcGlWZXJzaW9uJiZjLmhhc0V2ZW50T3V0cHV0JiZpLnN1Y2Nlc3NmdWxSZXNwb25zZShlKSlyZXR1cm47ZS5yZXF1ZXN0LmVtaXQoImh0dHBEb25lIiksdCgpfX0pKX1mdW5jdGlvbiBvKHIpe2lmKCJSZXF1ZXN0QWJvcnRlZEVycm9yIiE9PXIuY29kZSl7dmFyIG89IlRpbWVvdXRFcnJvciI9PT1yLmNvZGU/ci5jb2RlOiJOZXR3b3JraW5nRXJyb3IiO3I9bi51dGlsLmVycm9yKHIse2NvZGU6byxyZWdpb246ZS5yZXF1ZXN0Lmh0dHBSZXF1ZXN0LnJlZ2lvbixob3N0bmFtZTplLnJlcXVlc3QuaHR0cFJlcXVlc3QuZW5kcG9pbnQuaG9zdG5hbWUscmV0cnlhYmxlOiEwfSl9ZS5lcnJvcj1yLGUucmVxdWVzdC5lbWl0KCJodHRwRXJyb3IiLFtlLmVycm9yLGVdLChmdW5jdGlvbigpe3QoKX0pKX1mdW5jdGlvbiBpKCl7dmFyIHQsaT1uLkh0dHBDbGllbnQuZ2V0SW5zdGFuY2UoKSxzPWUucmVxdWVzdC5zZXJ2aWNlLmNvbmZpZy5odHRwT3B0aW9uc3x8e307dHJ5e3ZhciBhPWkuaGFuZGxlUmVxdWVzdChlLnJlcXVlc3QuaHR0cFJlcXVlc3QscyxyLG8pOyh0PWEpLm9uKCJzZW5kUHJvZ3Jlc3MiLChmdW5jdGlvbih0KXtlLnJlcXVlc3QuZW1pdCgiaHR0cFVwbG9hZFByb2dyZXNzIixbdCxlXSl9KSksdC5vbigicmVjZWl2ZVByb2dyZXNzIiwoZnVuY3Rpb24odCl7ZS5yZXF1ZXN0LmVtaXQoImh0dHBEb3dubG9hZFByb2dyZXNzIixbdCxlXSl9KSl9Y2F0Y2goZSl7byhlKX19ZS5odHRwUmVzcG9uc2UuX2Fib3J0Q2FsbGJhY2s9dCxlLmVycm9yPW51bGwsZS5kYXRhPW51bGwsKGUucmVxdWVzdC5zZXJ2aWNlLmdldFNrZXdDb3JyZWN0ZWREYXRlKCktdGhpcy5zaWduZWRBdCkvMWUzPj02MDA/dGhpcy5lbWl0KCJzaWduIixbdGhpc10sKGZ1bmN0aW9uKGUpe2U/dChlKTppKCl9KSk6aSgpfSkpLGUoIkhUVFBfSEVBREVSUyIsImh0dHBIZWFkZXJzIiwoZnVuY3Rpb24oZSx0LHIsbyl7ci5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZT1lLHIuaHR0cFJlc3BvbnNlLnN0YXR1c01lc3NhZ2U9byxyLmh0dHBSZXNwb25zZS5oZWFkZXJzPXQsci5odHRwUmVzcG9uc2UuYm9keT1uLnV0aWwuYnVmZmVyLnRvQnVmZmVyKCIiKSxyLmh0dHBSZXNwb25zZS5idWZmZXJzPVtdLHIuaHR0cFJlc3BvbnNlLm51bUJ5dGVzPTA7dmFyIGk9dC5kYXRlfHx0LkRhdGUscz1yLnJlcXVlc3Quc2VydmljZTtpZihpKXt2YXIgYT1EYXRlLnBhcnNlKGkpO3MuY29uZmlnLmNvcnJlY3RDbG9ja1NrZXcmJnMuaXNDbG9ja1NrZXdlZChhKSYmcy5hcHBseUNsb2NrT2Zmc2V0KGEpfX0pKSxlKCJIVFRQX0RBVEEiLCJodHRwRGF0YSIsKGZ1bmN0aW9uKGUsdCl7aWYoZSl7aWYobi51dGlsLmlzTm9kZSgpKXt0Lmh0dHBSZXNwb25zZS5udW1CeXRlcys9ZS5sZW5ndGg7dmFyIHI9dC5odHRwUmVzcG9uc2UuaGVhZGVyc1siY29udGVudC1sZW5ndGgiXSxvPXtsb2FkZWQ6dC5odHRwUmVzcG9uc2UubnVtQnl0ZXMsdG90YWw6cn07dC5yZXF1ZXN0LmVtaXQoImh0dHBEb3dubG9hZFByb2dyZXNzIixbbyx0XSl9dC5odHRwUmVzcG9uc2UuYnVmZmVycy5wdXNoKG4udXRpbC5idWZmZXIudG9CdWZmZXIoZSkpfX0pKSxlKCJIVFRQX0RPTkUiLCJodHRwRG9uZSIsKGZ1bmN0aW9uKGUpe2lmKGUuaHR0cFJlc3BvbnNlLmJ1ZmZlcnMmJmUuaHR0cFJlc3BvbnNlLmJ1ZmZlcnMubGVuZ3RoPjApe3ZhciB0PW4udXRpbC5idWZmZXIuY29uY2F0KGUuaHR0cFJlc3BvbnNlLmJ1ZmZlcnMpO2UuaHR0cFJlc3BvbnNlLmJvZHk9dH1kZWxldGUgZS5odHRwUmVzcG9uc2UubnVtQnl0ZXMsZGVsZXRlIGUuaHR0cFJlc3BvbnNlLmJ1ZmZlcnN9KSksZSgiRklOQUxJWkVfRVJST1IiLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe2UuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUmJihlLmVycm9yLnN0YXR1c0NvZGU9ZS5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSx2b2lkIDA9PT1lLmVycm9yLnJldHJ5YWJsZSYmKGUuZXJyb3IucmV0cnlhYmxlPXRoaXMuc2VydmljZS5yZXRyeWFibGVFcnJvcihlLmVycm9yLHRoaXMpKSl9KSksZSgiSU5WQUxJREFURV9DUkVERU5USUFMUyIsInJldHJ5IiwoZnVuY3Rpb24oZSl7aWYoZS5lcnJvcilzd2l0Y2goZS5lcnJvci5jb2RlKXtjYXNlIlJlcXVlc3RFeHBpcmVkIjpjYXNlIkV4cGlyZWRUb2tlbkV4Y2VwdGlvbiI6Y2FzZSJFeHBpcmVkVG9rZW4iOmUuZXJyb3IucmV0cnlhYmxlPSEwLGUucmVxdWVzdC5zZXJ2aWNlLmNvbmZpZy5jcmVkZW50aWFscy5leHBpcmVkPSEwfX0pKSxlKCJFWFBJUkVEX1NJR05BVFVSRSIsInJldHJ5IiwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5lcnJvcjt0JiYic3RyaW5nIj09dHlwZW9mIHQuY29kZSYmInN0cmluZyI9PXR5cGVvZiB0Lm1lc3NhZ2UmJnQuY29kZS5tYXRjaCgvU2lnbmF0dXJlLykmJnQubWVzc2FnZS5tYXRjaCgvZXhwaXJlZC8pJiYoZS5lcnJvci5yZXRyeWFibGU9ITApfSkpLGUoIkNMT0NLX1NLRVdFRCIsInJldHJ5IiwoZnVuY3Rpb24oZSl7ZS5lcnJvciYmdGhpcy5zZXJ2aWNlLmNsb2NrU2tld0Vycm9yKGUuZXJyb3IpJiZ0aGlzLnNlcnZpY2UuY29uZmlnLmNvcnJlY3RDbG9ja1NrZXcmJihlLmVycm9yLnJldHJ5YWJsZT0hMCl9KSksZSgiUkVESVJFQ1QiLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe2UuZXJyb3ImJmUuZXJyb3Iuc3RhdHVzQ29kZT49MzAwJiZlLmVycm9yLnN0YXR1c0NvZGU8NDAwJiZlLmh0dHBSZXNwb25zZS5oZWFkZXJzLmxvY2F0aW9uJiYodGhpcy5odHRwUmVxdWVzdC5lbmRwb2ludD1uZXcgbi5FbmRwb2ludChlLmh0dHBSZXNwb25zZS5oZWFkZXJzLmxvY2F0aW9uKSx0aGlzLmh0dHBSZXF1ZXN0LmhlYWRlcnMuSG9zdD10aGlzLmh0dHBSZXF1ZXN0LmVuZHBvaW50Lmhvc3QsZS5lcnJvci5yZWRpcmVjdD0hMCxlLmVycm9yLnJldHJ5YWJsZT0hMCl9KSksZSgiUkVUUllfQ0hFQ0siLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe2UuZXJyb3ImJihlLmVycm9yLnJlZGlyZWN0JiZlLnJlZGlyZWN0Q291bnQ8ZS5tYXhSZWRpcmVjdHM/ZS5lcnJvci5yZXRyeURlbGF5PTA6ZS5yZXRyeUNvdW50PGUubWF4UmV0cmllcyYmKGUuZXJyb3IucmV0cnlEZWxheT10aGlzLnNlcnZpY2UucmV0cnlEZWxheXMoZS5yZXRyeUNvdW50LGUuZXJyb3IpfHwwKSl9KSkscigiUkVTRVRfUkVUUllfU1RBVEUiLCJhZnRlclJldHJ5IiwoZnVuY3Rpb24oZSx0KXt2YXIgbixyPSExO2UuZXJyb3ImJihuPWUuZXJyb3IucmV0cnlEZWxheXx8MCxlLmVycm9yLnJldHJ5YWJsZSYmZS5yZXRyeUNvdW50PGUubWF4UmV0cmllcz8oZS5yZXRyeUNvdW50Kysscj0hMCk6ZS5lcnJvci5yZWRpcmVjdCYmZS5yZWRpcmVjdENvdW50PGUubWF4UmVkaXJlY3RzJiYoZS5yZWRpcmVjdENvdW50Kysscj0hMCkpLHImJm4+PTA/KGUuZXJyb3I9bnVsbCxzZXRUaW1lb3V0KHQsbikpOnQoKX0pKX0pKSxDb3JlUG9zdDoobmV3IHIpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbihlKXtlKCJFWFRSQUNUX1JFUVVFU1RfSUQiLCJleHRyYWN0RGF0YSIsbi51dGlsLmV4dHJhY3RSZXF1ZXN0SWQpLGUoIkVYVFJBQ1RfUkVRVUVTVF9JRCIsImV4dHJhY3RFcnJvciIsbi51dGlsLmV4dHJhY3RSZXF1ZXN0SWQpLGUoIkVOT1RGT1VORF9FUlJPUiIsImh0dHBFcnJvciIsKGZ1bmN0aW9uKGUpe2lmKCJOZXR3b3JraW5nRXJyb3IiPT09ZS5jb2RlJiZmdW5jdGlvbihlKXtyZXR1cm4iRU5PVEZPVU5EIj09PWUuZXJybm98fCJudW1iZXIiPT10eXBlb2YgZS5lcnJubyYmImZ1bmN0aW9uIj09dHlwZW9mIG4udXRpbC5nZXRTeXN0ZW1FcnJvck5hbWUmJlsiRUFJX05PTkFNRSIsIkVBSV9OT0RBVEEiXS5pbmRleE9mKG4udXRpbC5nZXRTeXN0ZW1FcnJvck5hbWUoZS5lcnJubyk+PTApfShlKSl7dmFyIHQ9IkluYWNjZXNzaWJsZSBob3N0OiBgIitlLmhvc3RuYW1lKyInIGF0IHBvcnQgYCIrZS5wb3J0KyInLiBUaGlzIHNlcnZpY2UgbWF5IG5vdCBiZSBhdmFpbGFibGUgaW4gdGhlIGAiK2UucmVnaW9uKyInIHJlZ2lvbi4iO3RoaXMucmVzcG9uc2UuZXJyb3I9bi51dGlsLmVycm9yKG5ldyBFcnJvcih0KSx7Y29kZToiVW5rbm93bkVuZHBvaW50IixyZWdpb246ZS5yZWdpb24saG9zdG5hbWU6ZS5ob3N0bmFtZSxyZXRyeWFibGU6ITAsb3JpZ2luYWxFcnJvcjplfSl9fSkpfSkpLExvZ2dlcjoobmV3IHIpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbih0KXt0KCJMT0dfUkVRVUVTVCIsImNvbXBsZXRlIiwoZnVuY3Rpb24odCl7dmFyIHI9dC5yZXF1ZXN0LG89ci5zZXJ2aWNlLmNvbmZpZy5sb2dnZXI7aWYobyl7dmFyIGk9ZnVuY3Rpb24oKXt2YXIgaT0odC5yZXF1ZXN0LnNlcnZpY2UuZ2V0U2tld0NvcnJlY3RlZERhdGUoKS5nZXRUaW1lKCktci5zdGFydFRpbWUuZ2V0VGltZSgpKS8xZTMsYT0hIW8uaXNUVFksYz10Lmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlLHU9ci5wYXJhbXM7ci5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zJiZyLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbci5vcGVyYXRpb25dJiZyLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbci5vcGVyYXRpb25dLmlucHV0JiYodT1zKHIuc2VydmljZS5hcGkub3BlcmF0aW9uc1tyLm9wZXJhdGlvbl0uaW5wdXQsci5wYXJhbXMpKTt2YXIgbD1lKCJ1dGlsIikuaW5zcGVjdCh1LCEwLG51bGwpLHA9IiI7cmV0dXJuIGEmJihwKz0iG1szM20iKSxwKz0iW0FXUyAiK3Iuc2VydmljZS5zZXJ2aWNlSWRlbnRpZmllcisiICIrYyxwKz0iICIraS50b1N0cmluZygpKyJzICIrdC5yZXRyeUNvdW50KyIgcmV0cmllc10iLGEmJihwKz0iG1swOzFtIikscCs9IiAiK24udXRpbC5zdHJpbmcubG93ZXJGaXJzdChyLm9wZXJhdGlvbikscCs9IigiK2wrIikiLGEmJihwKz0iG1swbSIpLHB9KCk7ImZ1bmN0aW9uIj09dHlwZW9mIG8ubG9nP28ubG9nKGkpOiJmdW5jdGlvbiI9PXR5cGVvZiBvLndyaXRlJiZvLndyaXRlKGkrIlxuIil9ZnVuY3Rpb24gcyhlLHQpe2lmKCF0KXJldHVybiB0O2lmKGUuaXNTZW5zaXRpdmUpcmV0dXJuIioqKlNlbnNpdGl2ZUluZm9ybWF0aW9uKioqIjtzd2l0Y2goZS50eXBlKXtjYXNlInN0cnVjdHVyZSI6dmFyIHI9e307cmV0dXJuIG4udXRpbC5lYWNoKHQsKGZ1bmN0aW9uKHQsbil7T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUubWVtYmVycyx0KT9yW3RdPXMoZS5tZW1iZXJzW3RdLG4pOnJbdF09bn0pKSxyO2Nhc2UibGlzdCI6dmFyIG89W107cmV0dXJuIG4udXRpbC5hcnJheUVhY2godCwoZnVuY3Rpb24odCxuKXtvLnB1c2gocyhlLm1lbWJlcix0KSl9KSksbztjYXNlIm1hcCI6dmFyIGk9e307cmV0dXJuIG4udXRpbC5lYWNoKHQsKGZ1bmN0aW9uKHQsbil7aVt0XT1zKGUudmFsdWUsbil9KSksaTtkZWZhdWx0OnJldHVybiB0fX19KSl9KSksSnNvbjoobmV3IHIpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbih0KXt2YXIgbj1lKCIuL3Byb3RvY29sL2pzb24iKTt0KCJCVUlMRCIsImJ1aWxkIixuLmJ1aWxkUmVxdWVzdCksdCgiRVhUUkFDVF9EQVRBIiwiZXh0cmFjdERhdGEiLG4uZXh0cmFjdERhdGEpLHQoIkVYVFJBQ1RfRVJST1IiLCJleHRyYWN0RXJyb3IiLG4uZXh0cmFjdEVycm9yKX0pKSxSZXN0OihuZXcgcikuYWRkTmFtZWRMaXN0ZW5lcnMoKGZ1bmN0aW9uKHQpe3ZhciBuPWUoIi4vcHJvdG9jb2wvcmVzdCIpO3QoIkJVSUxEIiwiYnVpbGQiLG4uYnVpbGRSZXF1ZXN0KSx0KCJFWFRSQUNUX0RBVEEiLCJleHRyYWN0RGF0YSIsbi5leHRyYWN0RGF0YSksdCgiRVhUUkFDVF9FUlJPUiIsImV4dHJhY3RFcnJvciIsbi5leHRyYWN0RXJyb3IpfSkpLFJlc3RKc29uOihuZXcgcikuYWRkTmFtZWRMaXN0ZW5lcnMoKGZ1bmN0aW9uKHQpe3ZhciBuPWUoIi4vcHJvdG9jb2wvcmVzdF9qc29uIik7dCgiQlVJTEQiLCJidWlsZCIsbi5idWlsZFJlcXVlc3QpLHQoIkVYVFJBQ1RfREFUQSIsImV4dHJhY3REYXRhIixuLmV4dHJhY3REYXRhKSx0KCJFWFRSQUNUX0VSUk9SIiwiZXh0cmFjdEVycm9yIixuLmV4dHJhY3RFcnJvciksdCgiVU5TRVRfQ09OVEVOVF9MRU5HVEgiLCJhZnRlckJ1aWxkIixuLnVuc2V0Q29udGVudExlbmd0aCl9KSksUmVzdFhtbDoobmV3IHIpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbih0KXt2YXIgbj1lKCIuL3Byb3RvY29sL3Jlc3RfeG1sIik7dCgiQlVJTEQiLCJidWlsZCIsbi5idWlsZFJlcXVlc3QpLHQoIkVYVFJBQ1RfREFUQSIsImV4dHJhY3REYXRhIixuLmV4dHJhY3REYXRhKSx0KCJFWFRSQUNUX0VSUk9SIiwiZXh0cmFjdEVycm9yIixuLmV4dHJhY3RFcnJvcil9KSksUXVlcnk6KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24odCl7dmFyIG49ZSgiLi9wcm90b2NvbC9xdWVyeSIpO3QoIkJVSUxEIiwiYnVpbGQiLG4uYnVpbGRSZXF1ZXN0KSx0KCJFWFRSQUNUX0RBVEEiLCJleHRyYWN0RGF0YSIsbi5leHRyYWN0RGF0YSksdCgiRVhUUkFDVF9FUlJPUiIsImV4dHJhY3RFcnJvciIsbi5leHRyYWN0RXJyb3IpfSkpfX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHsiLi9jb3JlIjoxOSwiLi9kaXNjb3Zlcl9lbmRwb2ludCI6MjcsIi4vcHJvdG9jb2wvanNvbiI6NDgsIi4vcHJvdG9jb2wvcXVlcnkiOjQ5LCIuL3Byb3RvY29sL3Jlc3QiOjUwLCIuL3Byb3RvY29sL3Jlc3RfanNvbiI6NTEsIi4vcHJvdG9jb2wvcmVzdF94bWwiOjUyLCIuL3NlcXVlbnRpYWxfZXhlY3V0b3IiOjYxLF9wcm9jZXNzOjkxLHV0aWw6ODV9XSwzNTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQ7ci5FbmRwb2ludD1vKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLHQpe2lmKHIudXRpbC5oaWRlUHJvcGVydGllcyh0aGlzLFsic2xhc2hlcyIsImF1dGgiLCJoYXNoIiwic2VhcmNoIiwicXVlcnkiXSksbnVsbD09ZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZW5kcG9pbnQ6ICIrZSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiByLnV0aWwuY29weShlKTtlLm1hdGNoKC9eaHR0cC8pfHwoZT0oKHQmJnZvaWQgMCE9PXQuc3NsRW5hYmxlZD90LnNzbEVuYWJsZWQ6ci5jb25maWcuc3NsRW5hYmxlZCk/Imh0dHBzIjoiaHR0cCIpKyI6Ly8iK2UpLHIudXRpbC51cGRhdGUodGhpcyxyLnV0aWwudXJsUGFyc2UoZSkpLHRoaXMucG9ydD90aGlzLnBvcnQ9cGFyc2VJbnQodGhpcy5wb3J0LDEwKTp0aGlzLnBvcnQ9Imh0dHBzOiI9PT10aGlzLnByb3RvY29sPzQ0Mzo4MH19KSxyLkh0dHBSZXF1ZXN0PW8oe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCl7ZT1uZXcgci5FbmRwb2ludChlKSx0aGlzLm1ldGhvZD0iUE9TVCIsdGhpcy5wYXRoPWUucGF0aHx8Ii8iLHRoaXMuaGVhZGVycz17fSx0aGlzLmJvZHk9IiIsdGhpcy5lbmRwb2ludD1lLHRoaXMucmVnaW9uPXQsdGhpcy5fdXNlckFnZW50PSIiLHRoaXMuc2V0VXNlckFnZW50KCl9LHNldFVzZXJBZ2VudDpmdW5jdGlvbigpe3RoaXMuX3VzZXJBZ2VudD10aGlzLmhlYWRlcnNbdGhpcy5nZXRVc2VyQWdlbnRIZWFkZXJOYW1lKCldPXIudXRpbC51c2VyQWdlbnQoKX0sZ2V0VXNlckFnZW50SGVhZGVyTmFtZTpmdW5jdGlvbigpe3JldHVybihyLnV0aWwuaXNCcm93c2VyKCk/IlgtQW16LSI6IiIpKyJVc2VyLUFnZW50In0sYXBwZW5kVG9Vc2VyQWdlbnQ6ZnVuY3Rpb24oZSl7InN0cmluZyI9PXR5cGVvZiBlJiZlJiYodGhpcy5fdXNlckFnZW50Kz0iICIrZSksdGhpcy5oZWFkZXJzW3RoaXMuZ2V0VXNlckFnZW50SGVhZGVyTmFtZSgpXT10aGlzLl91c2VyQWdlbnR9LGdldFVzZXJBZ2VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl91c2VyQWdlbnR9LHBhdGhuYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGF0aC5zcGxpdCgiPyIsMSlbMF19LHNlYXJjaDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucGF0aC5zcGxpdCgiPyIsMilbMV07cmV0dXJuIGU/KGU9ci51dGlsLnF1ZXJ5U3RyaW5nUGFyc2UoZSksci51dGlsLnF1ZXJ5UGFyYW1zVG9TdHJpbmcoZSkpOiIifSx1cGRhdGVFbmRwb2ludDpmdW5jdGlvbihlKXt2YXIgdD1uZXcgci5FbmRwb2ludChlKTt0aGlzLmVuZHBvaW50PXQsdGhpcy5wYXRoPXQucGF0aHx8Ii8iLHRoaXMuaGVhZGVycy5Ib3N0JiYodGhpcy5oZWFkZXJzLkhvc3Q9dC5ob3N0KX19KSxyLkh0dHBSZXNwb25zZT1vKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzQ29kZT12b2lkIDAsdGhpcy5oZWFkZXJzPXt9LHRoaXMuYm9keT12b2lkIDAsdGhpcy5zdHJlYW1pbmc9ITEsdGhpcy5zdHJlYW09bnVsbH0sY3JlYXRlVW5idWZmZXJlZFN0cmVhbTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0cmVhbWluZz0hMCx0aGlzLnN0cmVhbX19KSxyLkh0dHBDbGllbnQ9byh7fSksci5IdHRwQ2xpZW50LmdldEluc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PXRoaXMuc2luZ2xldG9uJiYodGhpcy5zaW5nbGV0b249bmV3IHRoaXMpLHRoaXMuc2luZ2xldG9ufX0seyIuL2NvcmUiOjE5fV0sMzY6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCJldmVudHMiKS5FdmVudEVtaXR0ZXI7ZSgiLi4vaHR0cCIpLHIuWEhSQ2xpZW50PXIudXRpbC5pbmhlcml0KHtoYW5kbGVSZXF1ZXN0OmZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBzPXRoaXMsYT1lLmVuZHBvaW50LGM9bmV3IG8sdT1hLnByb3RvY29sKyIvLyIrYS5ob3N0bmFtZTs4MCE9PWEucG9ydCYmNDQzIT09YS5wb3J0JiYodSs9IjoiK2EucG9ydCksdSs9ZS5wYXRoO3ZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdCxwPSExO2Uuc3RyZWFtPWwsbC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIiwoZnVuY3Rpb24oKXt0cnl7aWYoMD09PWwuc3RhdHVzKXJldHVybn1jYXRjaChlKXtyZXR1cm59dGhpcy5yZWFkeVN0YXRlPj10aGlzLkhFQURFUlNfUkVDRUlWRUQmJiFwJiYoYy5zdGF0dXNDb2RlPWwuc3RhdHVzLGMuaGVhZGVycz1zLnBhcnNlSGVhZGVycyhsLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSxjLmVtaXQoImhlYWRlcnMiLGMuc3RhdHVzQ29kZSxjLmhlYWRlcnMsbC5zdGF0dXNUZXh0KSxwPSEwKSx0aGlzLnJlYWR5U3RhdGU9PT10aGlzLkRPTkUmJnMuZmluaXNoUmVxdWVzdChsLGMpfSksITEpLGwudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIiwoZnVuY3Rpb24oZSl7Yy5lbWl0KCJzZW5kUHJvZ3Jlc3MiLGUpfSkpLGwuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLChmdW5jdGlvbihlKXtjLmVtaXQoInJlY2VpdmVQcm9ncmVzcyIsZSl9KSwhMSksbC5hZGRFdmVudExpc3RlbmVyKCJ0aW1lb3V0IiwoZnVuY3Rpb24oKXtpKHIudXRpbC5lcnJvcihuZXcgRXJyb3IoIlRpbWVvdXQiKSx7Y29kZToiVGltZW91dEVycm9yIn0pKX0pLCExKSxsLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwoZnVuY3Rpb24oKXtpKHIudXRpbC5lcnJvcihuZXcgRXJyb3IoIk5ldHdvcmsgRmFpbHVyZSIpLHtjb2RlOiJOZXR3b3JraW5nRXJyb3IifSkpfSksITEpLGwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLChmdW5jdGlvbigpe2koci51dGlsLmVycm9yKG5ldyBFcnJvcigiUmVxdWVzdCBhYm9ydGVkIikse2NvZGU6IlJlcXVlc3RBYm9ydGVkRXJyb3IifSkpfSksITEpLG4oYyksbC5vcGVuKGUubWV0aG9kLHUsITEhPT10LnhockFzeW5jKSxyLnV0aWwuZWFjaChlLmhlYWRlcnMsKGZ1bmN0aW9uKGUsdCl7IkNvbnRlbnQtTGVuZ3RoIiE9PWUmJiJVc2VyLUFnZW50IiE9PWUmJiJIb3N0IiE9PWUmJmwuc2V0UmVxdWVzdEhlYWRlcihlLHQpfSkpLHQudGltZW91dCYmITEhPT10LnhockFzeW5jJiYobC50aW1lb3V0PXQudGltZW91dCksdC54aHJXaXRoQ3JlZGVudGlhbHMmJihsLndpdGhDcmVkZW50aWFscz0hMCk7dHJ5e2wucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciJ9Y2F0Y2goZSl7fXRyeXtlLmJvZHk/bC5zZW5kKGUuYm9keSk6bC5zZW5kKCl9Y2F0Y2godCl7aWYoIWUuYm9keXx8Im9iamVjdCIhPXR5cGVvZiBlLmJvZHkuYnVmZmVyKXRocm93IHQ7bC5zZW5kKGUuYm9keS5idWZmZXIpfXJldHVybiBjfSxwYXJzZUhlYWRlcnM6ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIHIudXRpbC5hcnJheUVhY2goZS5zcGxpdCgvXHI/XG4vKSwoZnVuY3Rpb24oZSl7dmFyIG49ZS5zcGxpdCgiOiIsMSlbMF0scj1lLnN1YnN0cmluZyhuLmxlbmd0aCsyKTtuLmxlbmd0aD4wJiYodFtuLnRvTG93ZXJDYXNlKCldPXIpfSkpLHR9LGZpbmlzaFJlcXVlc3Q6ZnVuY3Rpb24oZSx0KXt2YXIgbjtpZigiYXJyYXlidWZmZXIiPT09ZS5yZXNwb25zZVR5cGUmJmUucmVzcG9uc2Upe3ZhciBvPWUucmVzcG9uc2U7bj1uZXcgci51dGlsLkJ1ZmZlcihvLmJ5dGVMZW5ndGgpO2Zvcih2YXIgaT1uZXcgVWludDhBcnJheShvKSxzPTA7czxuLmxlbmd0aDsrK3MpbltzXT1pW3NdfXRyeXtufHwic3RyaW5nIiE9dHlwZW9mIGUucmVzcG9uc2VUZXh0fHwobj1uZXcgci51dGlsLkJ1ZmZlcihlLnJlc3BvbnNlVGV4dCkpfWNhdGNoKGUpe31uJiZ0LmVtaXQoImRhdGEiLG4pLHQuZW1pdCgiZW5kIil9fSksci5IdHRwQ2xpZW50LnByb3RvdHlwZT1yLlhIUkNsaWVudC5wcm90b3R5cGUsci5IdHRwQ2xpZW50LnN0cmVhbXNBcGlWZXJzaW9uPTF9LHsiLi4vY29yZSI6MTksIi4uL2h0dHAiOjM1LGV2ZW50czo4N31dLDM3OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpO2Z1bmN0aW9uIG8oKXt9ZnVuY3Rpb24gaShlLHQpe2lmKHQmJm51bGwhPWUpc3dpdGNoKHQudHlwZSl7Y2FzZSJzdHJ1Y3R1cmUiOnJldHVybiBmdW5jdGlvbihlLHQpe2lmKHQuaXNEb2N1bWVudClyZXR1cm4gZTt2YXIgbj17fTtyZXR1cm4gci5lYWNoKGUsKGZ1bmN0aW9uKGUscil7dmFyIG89dC5tZW1iZXJzW2VdO2lmKG8pe2lmKCJib2R5IiE9PW8ubG9jYXRpb24pcmV0dXJuO3ZhciBzPW8uaXNMb2NhdGlvbk5hbWU/by5uYW1lOmUsYT1pKHIsbyk7dm9pZCAwIT09YSYmKG5bc109YSl9fSkpLG59KGUsdCk7Y2FzZSJtYXAiOnJldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuPXt9O3JldHVybiByLmVhY2goZSwoZnVuY3Rpb24oZSxyKXt2YXIgbz1pKHIsdC52YWx1ZSk7dm9pZCAwIT09byYmKG5bZV09byl9KSksbn0oZSx0KTtjYXNlImxpc3QiOnJldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuPVtdO3JldHVybiByLmFycmF5RWFjaChlLChmdW5jdGlvbihlKXt2YXIgcj1pKGUsdC5tZW1iZXIpO3ZvaWQgMCE9PXImJm4ucHVzaChyKX0pKSxufShlLHQpO2RlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQudG9XaXJlRm9ybWF0KGUpfShlLHQpfX1vLnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbihlLHQpe3JldHVybiBKU09OLnN0cmluZ2lmeShpKGUsdCkpfSx0LmV4cG9ydHM9b30seyIuLi91dGlsIjo3NH1dLDM4OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpO2Z1bmN0aW9uIG8oKXt9ZnVuY3Rpb24gaShlLHQpe2lmKHQmJnZvaWQgMCE9PWUpc3dpdGNoKHQudHlwZSl7Y2FzZSJzdHJ1Y3R1cmUiOnJldHVybiBmdW5jdGlvbihlLHQpe2lmKG51bGwhPWUpe2lmKHQuaXNEb2N1bWVudClyZXR1cm4gZTt2YXIgbj17fSxvPXQubWVtYmVycztyZXR1cm4gci5lYWNoKG8sKGZ1bmN0aW9uKHQscil7dmFyIG89ci5pc0xvY2F0aW9uTmFtZT9yLm5hbWU6dDtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxvKSl7dmFyIHM9aShlW29dLHIpO3ZvaWQgMCE9PXMmJihuW3RdPXMpfX0pKSxufX0oZSx0KTtjYXNlIm1hcCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYobnVsbCE9ZSl7dmFyIG49e307cmV0dXJuIHIuZWFjaChlLChmdW5jdGlvbihlLHIpe3ZhciBvPWkocix0LnZhbHVlKTtuW2VdPXZvaWQgMD09PW8/bnVsbDpvfSkpLG59fShlLHQpO2Nhc2UibGlzdCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYobnVsbCE9ZSl7dmFyIG49W107cmV0dXJuIHIuYXJyYXlFYWNoKGUsKGZ1bmN0aW9uKGUpe3ZhciByPWkoZSx0Lm1lbWJlcik7dm9pZCAwPT09cj9uLnB1c2gobnVsbCk6bi5wdXNoKHIpfSkpLG59fShlLHQpO2RlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQudG9UeXBlKGUpfShlLHQpfX1vLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihlLHQpe3JldHVybiBpKEpTT04ucGFyc2UoZSksdCl9LHQuZXhwb3J0cz1vfSx7Ii4uL3V0aWwiOjc0fV0sMzk6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24oZSl7KGZ1bmN0aW9uKCl7dmFyIG49WyJXZSBhcmUgZm9ybWFsaXppbmcgb3VyIHBsYW5zIHRvIGVudGVyIEFXUyBTREsgZm9yIEphdmFTY3JpcHQgKHYyKSBpbnRvIG1haW50ZW5hbmNlIG1vZGUgaW4gMjAyMy5cbiIsIlBsZWFzZSBtaWdyYXRlIHlvdXIgY29kZSB0byB1c2UgQVdTIFNESyBmb3IgSmF2YVNjcmlwdCAodjMpLiIsIkZvciBtb3JlIGluZm9ybWF0aW9uLCBjaGVjayB0aGUgbWlncmF0aW9uIGd1aWRlIGF0IGh0dHBzOi8vYS5jby83UHpNQ2N5Il0uam9pbigiXG4iKTt0LmV4cG9ydHM9e3N1cHByZXNzOiExfSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuZXhwb3J0cy5zdXBwcmVzc3x8dm9pZCAwIT09ZSYmKCJvYmplY3QiPT10eXBlb2YgZS5lbnYmJnZvaWQgMCE9PWUuZW52LkFXU19FWEVDVVRJT05fRU5WJiYwPT09ZS5lbnYuQVdTX0VYRUNVVElPTl9FTlYuaW5kZXhPZigiQVdTX0xhbWJkYV8iKXx8Im9iamVjdCI9PXR5cGVvZiBlLmVudiYmdm9pZCAwIT09ZS5lbnYuQVdTX1NES19KU19TVVBQUkVTU19NQUlOVEVOQU5DRV9NT0RFX01FU1NBR0V8fCJmdW5jdGlvbiI9PXR5cGVvZiBlLmVtaXRXYXJuaW5nJiZlLmVtaXRXYXJuaW5nKG4se3R5cGU6Ik5PVEUifSkpfSksMCl9KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIikpfSx7X3Byb2Nlc3M6OTF9XSw0MDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29sbGVjdGlvbiIpLG89ZSgiLi9vcGVyYXRpb24iKSxpPWUoIi4vc2hhcGUiKSxzPWUoIi4vcGFnaW5hdG9yIiksYT1lKCIuL3Jlc291cmNlX3dhaXRlciIpLGM9ZSgiLi4vLi4vYXBpcy9tZXRhZGF0YS5qc29uIiksdT1lKCIuLi91dGlsIiksbD11LnByb3BlcnR5LHA9dS5tZW1vaXplZFByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7ZT1lfHx7fSwodD10fHx7fSkuYXBpPXRoaXMsZS5tZXRhZGF0YT1lLm1ldGFkYXRhfHx7fTt2YXIgZD10LnNlcnZpY2VJZGVudGlmaWVyO2RlbGV0ZSB0LnNlcnZpY2VJZGVudGlmaWVyLGwodGhpcywiaXNBcGkiLCEwLCExKSxsKHRoaXMsImFwaVZlcnNpb24iLGUubWV0YWRhdGEuYXBpVmVyc2lvbiksbCh0aGlzLCJlbmRwb2ludFByZWZpeCIsZS5tZXRhZGF0YS5lbmRwb2ludFByZWZpeCksbCh0aGlzLCJzaWduaW5nTmFtZSIsZS5tZXRhZGF0YS5zaWduaW5nTmFtZSksbCh0aGlzLCJnbG9iYWxFbmRwb2ludCIsZS5tZXRhZGF0YS5nbG9iYWxFbmRwb2ludCksbCh0aGlzLCJzaWduYXR1cmVWZXJzaW9uIixlLm1ldGFkYXRhLnNpZ25hdHVyZVZlcnNpb24pLGwodGhpcywianNvblZlcnNpb24iLGUubWV0YWRhdGEuanNvblZlcnNpb24pLGwodGhpcywidGFyZ2V0UHJlZml4IixlLm1ldGFkYXRhLnRhcmdldFByZWZpeCksbCh0aGlzLCJwcm90b2NvbCIsZS5tZXRhZGF0YS5wcm90b2NvbCksbCh0aGlzLCJ0aW1lc3RhbXBGb3JtYXQiLGUubWV0YWRhdGEudGltZXN0YW1wRm9ybWF0KSxsKHRoaXMsInhtbE5hbWVzcGFjZVVyaSIsZS5tZXRhZGF0YS54bWxOYW1lc3BhY2UpLGwodGhpcywiYWJicmV2aWF0aW9uIixlLm1ldGFkYXRhLnNlcnZpY2VBYmJyZXZpYXRpb24pLGwodGhpcywiZnVsbE5hbWUiLGUubWV0YWRhdGEuc2VydmljZUZ1bGxOYW1lKSxsKHRoaXMsInNlcnZpY2VJZCIsZS5tZXRhZGF0YS5zZXJ2aWNlSWQpLGQmJmNbZF0mJmwodGhpcywieG1sTm9EZWZhdWx0TGlzdHMiLGNbZF0ueG1sTm9EZWZhdWx0TGlzdHMsITEpLHAodGhpcywiY2xhc3NOYW1lIiwoZnVuY3Rpb24oKXt2YXIgdD1lLm1ldGFkYXRhLnNlcnZpY2VBYmJyZXZpYXRpb258fGUubWV0YWRhdGEuc2VydmljZUZ1bGxOYW1lO3JldHVybiB0PygiRWxhc3RpY0xvYWRCYWxhbmNpbmciPT09KHQ9dC5yZXBsYWNlKC9eQW1hem9ufEFXU1xzKnxcKC4qfFxzK3xcVysvZywiIikpJiYodD0iRUxCIiksdCk6bnVsbH0pKSxsKHRoaXMsIm9wZXJhdGlvbnMiLG5ldyByKGUub3BlcmF0aW9ucyx0LChmdW5jdGlvbihlLG4pe3JldHVybiBuZXcgbyhlLG4sdCl9KSx1LnN0cmluZy5sb3dlckZpcnN0LChmdW5jdGlvbihlLHQpeyEwPT09dC5lbmRwb2ludG9wZXJhdGlvbiYmbChuLCJlbmRwb2ludE9wZXJhdGlvbiIsdS5zdHJpbmcubG93ZXJGaXJzdChlKSksdC5lbmRwb2ludGRpc2NvdmVyeSYmIW4uaGFzUmVxdWlyZWRFbmRwb2ludERpc2NvdmVyeSYmbChuLCJoYXNSZXF1aXJlZEVuZHBvaW50RGlzY292ZXJ5IiwhMD09PXQuZW5kcG9pbnRkaXNjb3ZlcnkucmVxdWlyZWQpfSkpKSxsKHRoaXMsInNoYXBlcyIsbmV3IHIoZS5zaGFwZXMsdCwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gaS5jcmVhdGUobix0KX0pKSksbCh0aGlzLCJwYWdpbmF0b3JzIixuZXcgcihlLnBhZ2luYXRvcnMsdCwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gbmV3IHMoZSxuLHQpfSkpKSxsKHRoaXMsIndhaXRlcnMiLG5ldyByKGUud2FpdGVycyx0LChmdW5jdGlvbihlLG4pe3JldHVybiBuZXcgYShlLG4sdCl9KSx1LnN0cmluZy5sb3dlckZpcnN0KSksdC5kb2N1bWVudGF0aW9uJiYobCh0aGlzLCJkb2N1bWVudGF0aW9uIixlLmRvY3VtZW50YXRpb24pLGwodGhpcywiZG9jdW1lbnRhdGlvblVybCIsZS5kb2N1bWVudGF0aW9uVXJsKSksbCh0aGlzLCJhd3NRdWVyeUNvbXBhdGlibGUiLGUubWV0YWRhdGEuYXdzUXVlcnlDb21wYXRpYmxlKX19LHsiLi4vLi4vYXBpcy9tZXRhZGF0YS5qc29uIjo0LCIuLi91dGlsIjo3NCwiLi9jb2xsZWN0aW9uIjo0MSwiLi9vcGVyYXRpb24iOjQyLCIuL3BhZ2luYXRvciI6NDMsIi4vcmVzb3VyY2Vfd2FpdGVyIjo0NCwiLi9zaGFwZSI6NDV9XSw0MTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKS5tZW1vaXplZFByb3BlcnR5O2Z1bmN0aW9uIG8oZSx0LG4sbyl7cih0aGlzLG8oZSksKGZ1bmN0aW9uKCl7cmV0dXJuIG4oZSx0KX0pKX10LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4scixpKXtmb3IodmFyIHMgaW4gcj1yfHxTdHJpbmcsZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxzKSYmKG8uY2FsbCh0aGlzLHMsZVtzXSxuLHIpLGkmJmkocyxlW3NdKSl9fSx7Ii4uL3V0aWwiOjc0fV0sNDI6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL3NoYXBlIiksbz1lKCIuLi91dGlsIiksaT1vLnByb3BlcnR5LHM9by5tZW1vaXplZFByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7dmFyIG89dGhpcztuPW58fHt9LGkodGhpcywibmFtZSIsdC5uYW1lfHxlKSxpKHRoaXMsImFwaSIsbi5hcGksITEpLHQuaHR0cD10Lmh0dHB8fHt9LGkodGhpcywiZW5kcG9pbnQiLHQuZW5kcG9pbnQpLGkodGhpcywiaHR0cE1ldGhvZCIsdC5odHRwLm1ldGhvZHx8IlBPU1QiKSxpKHRoaXMsImh0dHBQYXRoIix0Lmh0dHAucmVxdWVzdFVyaXx8Ii8iKSxpKHRoaXMsImF1dGh0eXBlIix0LmF1dGh0eXBlfHwiIiksaSh0aGlzLCJlbmRwb2ludERpc2NvdmVyeVJlcXVpcmVkIix0LmVuZHBvaW50ZGlzY292ZXJ5P3QuZW5kcG9pbnRkaXNjb3ZlcnkucmVxdWlyZWQ/IlJFUVVJUkVEIjoiT1BUSU9OQUwiOiJOVUxMIik7dmFyIGE9dC5odHRwQ2hlY2tzdW1SZXF1aXJlZHx8dC5odHRwQ2hlY2tzdW0mJnQuaHR0cENoZWNrc3VtLnJlcXVlc3RDaGVja3N1bVJlcXVpcmVkO2kodGhpcywiaHR0cENoZWNrc3VtUmVxdWlyZWQiLGEsITEpLHModGhpcywiaW5wdXQiLChmdW5jdGlvbigpe3JldHVybiB0LmlucHV0P3IuY3JlYXRlKHQuaW5wdXQsbik6bmV3IHIuY3JlYXRlKHt0eXBlOiJzdHJ1Y3R1cmUifSxuKX0pKSxzKHRoaXMsIm91dHB1dCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHQub3V0cHV0P3IuY3JlYXRlKHQub3V0cHV0LG4pOm5ldyByLmNyZWF0ZSh7dHlwZToic3RydWN0dXJlIn0sbil9KSkscyh0aGlzLCJlcnJvcnMiLChmdW5jdGlvbigpe3ZhciBlPVtdO2lmKCF0LmVycm9ycylyZXR1cm4gbnVsbDtmb3IodmFyIG89MDtvPHQuZXJyb3JzLmxlbmd0aDtvKyspZS5wdXNoKHIuY3JlYXRlKHQuZXJyb3JzW29dLG4pKTtyZXR1cm4gZX0pKSxzKHRoaXMsInBhZ2luYXRvciIsKGZ1bmN0aW9uKCl7cmV0dXJuIG4uYXBpLnBhZ2luYXRvcnNbZV19KSksbi5kb2N1bWVudGF0aW9uJiYoaSh0aGlzLCJkb2N1bWVudGF0aW9uIix0LmRvY3VtZW50YXRpb24pLGkodGhpcywiZG9jdW1lbnRhdGlvblVybCIsdC5kb2N1bWVudGF0aW9uVXJsKSkscyh0aGlzLCJpZGVtcG90ZW50TWVtYmVycyIsKGZ1bmN0aW9uKCl7dmFyIGU9W10sdD1vLmlucHV0LG49dC5tZW1iZXJzO2lmKCF0Lm1lbWJlcnMpcmV0dXJuIGU7Zm9yKHZhciByIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShyKSYmITA9PT1uW3JdLmlzSWRlbXBvdGVudCYmZS5wdXNoKHIpO3JldHVybiBlfSkpLHModGhpcywiaGFzRXZlbnRPdXRwdXQiLChmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLm1lbWJlcnMsbj1lLnBheWxvYWQ7aWYoIWUubWVtYmVycylyZXR1cm4hMTtpZihuKXJldHVybiB0W25dLmlzRXZlbnRTdHJlYW07Zm9yKHZhciByIGluIHQpaWYoIXQuaGFzT3duUHJvcGVydHkocikmJiEwPT09dFtyXS5pc0V2ZW50U3RyZWFtKXJldHVybiEwO3JldHVybiExfShvLm91dHB1dCl9KSl9fSx7Ii4uL3V0aWwiOjc0LCIuL3NoYXBlIjo0NX1dLDQzOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLnByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3IodGhpcywiaW5wdXRUb2tlbiIsdC5pbnB1dF90b2tlbikscih0aGlzLCJsaW1pdEtleSIsdC5saW1pdF9rZXkpLHIodGhpcywibW9yZVJlc3VsdHMiLHQubW9yZV9yZXN1bHRzKSxyKHRoaXMsIm91dHB1dFRva2VuIix0Lm91dHB1dF90b2tlbikscih0aGlzLCJyZXN1bHRLZXkiLHQucmVzdWx0X2tleSl9fSx7Ii4uL3V0aWwiOjc0fV0sNDQ6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIiksbz1yLnByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7bj1ufHx7fSxvKHRoaXMsIm5hbWUiLGUpLG8odGhpcywiYXBpIixuLmFwaSwhMSksdC5vcGVyYXRpb24mJm8odGhpcywib3BlcmF0aW9uIixyLnN0cmluZy5sb3dlckZpcnN0KHQub3BlcmF0aW9uKSk7dmFyIGk9dGhpcztbInR5cGUiLCJkZXNjcmlwdGlvbiIsImRlbGF5IiwibWF4QXR0ZW1wdHMiLCJhY2NlcHRvcnMiXS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj10W2VdO24mJm8oaSxlLG4pfSkpfX0seyIuLi91dGlsIjo3NH1dLDQ1OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9jb2xsZWN0aW9uIiksbz1lKCIuLi91dGlsIik7ZnVuY3Rpb24gaShlLHQsbil7bnVsbCE9biYmby5wcm9wZXJ0eS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gcyhlLHQpe2UuY29uc3RydWN0b3IucHJvdG90eXBlW3RdfHxvLm1lbW9pemVkUHJvcGVydHkuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGEoZSx0LG4pe3Q9dHx8e30saSh0aGlzLCJzaGFwZSIsZS5zaGFwZSksaSh0aGlzLCJhcGkiLHQuYXBpLCExKSxpKHRoaXMsInR5cGUiLGUudHlwZSksaSh0aGlzLCJlbnVtIixlLmVudW0pLGkodGhpcywibWluIixlLm1pbiksaSh0aGlzLCJtYXgiLGUubWF4KSxpKHRoaXMsInBhdHRlcm4iLGUucGF0dGVybiksaSh0aGlzLCJsb2NhdGlvbiIsZS5sb2NhdGlvbnx8dGhpcy5sb2NhdGlvbnx8ImJvZHkiKSxpKHRoaXMsIm5hbWUiLHRoaXMubmFtZXx8ZS54bWxOYW1lfHxlLnF1ZXJ5TmFtZXx8ZS5sb2NhdGlvbk5hbWV8fG4pLGkodGhpcywiaXNTdHJlYW1pbmciLGUuc3RyZWFtaW5nfHx0aGlzLmlzU3RyZWFtaW5nfHwhMSksaSh0aGlzLCJyZXF1aXJlc0xlbmd0aCIsZS5yZXF1aXJlc0xlbmd0aCwhMSksaSh0aGlzLCJpc0NvbXBvc2l0ZSIsZS5pc0NvbXBvc2l0ZXx8ITEpLGkodGhpcywiaXNTaGFwZSIsITAsITEpLGkodGhpcywiaXNRdWVyeU5hbWUiLEJvb2xlYW4oZS5xdWVyeU5hbWUpLCExKSxpKHRoaXMsImlzTG9jYXRpb25OYW1lIixCb29sZWFuKGUubG9jYXRpb25OYW1lKSwhMSksaSh0aGlzLCJpc0lkZW1wb3RlbnQiLCEwPT09ZS5pZGVtcG90ZW5jeVRva2VuKSxpKHRoaXMsImlzSnNvblZhbHVlIiwhMD09PWUuanNvbnZhbHVlKSxpKHRoaXMsImlzU2Vuc2l0aXZlIiwhMD09PWUuc2Vuc2l0aXZlfHxlLnByb3RvdHlwZSYmITA9PT1lLnByb3RvdHlwZS5zZW5zaXRpdmUpLGkodGhpcywiaXNFdmVudFN0cmVhbSIsQm9vbGVhbihlLmV2ZW50c3RyZWFtKSwhMSksaSh0aGlzLCJpc0V2ZW50IixCb29sZWFuKGUuZXZlbnQpLCExKSxpKHRoaXMsImlzRXZlbnRQYXlsb2FkIixCb29sZWFuKGUuZXZlbnRwYXlsb2FkKSwhMSksaSh0aGlzLCJpc0V2ZW50SGVhZGVyIixCb29sZWFuKGUuZXZlbnRoZWFkZXIpLCExKSxpKHRoaXMsImlzVGltZXN0YW1wRm9ybWF0U2V0IixCb29sZWFuKGUudGltZXN0YW1wRm9ybWF0KXx8ZS5wcm90b3R5cGUmJiEwPT09ZS5wcm90b3R5cGUuaXNUaW1lc3RhbXBGb3JtYXRTZXQsITEpLGkodGhpcywiZW5kcG9pbnREaXNjb3ZlcnlJZCIsQm9vbGVhbihlLmVuZHBvaW50ZGlzY292ZXJ5aWQpLCExKSxpKHRoaXMsImhvc3RMYWJlbCIsQm9vbGVhbihlLmhvc3RMYWJlbCksITEpLHQuZG9jdW1lbnRhdGlvbiYmKGkodGhpcywiZG9jdW1lbnRhdGlvbiIsZS5kb2N1bWVudGF0aW9uKSxpKHRoaXMsImRvY3VtZW50YXRpb25VcmwiLGUuZG9jdW1lbnRhdGlvblVybCkpLGUueG1sQXR0cmlidXRlJiZpKHRoaXMsImlzWG1sQXR0cmlidXRlIixlLnhtbEF0dHJpYnV0ZXx8ITEpLGkodGhpcywiZGVmYXVsdFZhbHVlIixudWxsKSx0aGlzLnRvV2lyZUZvcm1hdD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjplfSx0aGlzLnRvVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gZX19ZnVuY3Rpb24gYyhlKXthLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxpKHRoaXMsImlzQ29tcG9zaXRlIiwhMCksZS5mbGF0dGVuZWQmJmkodGhpcywiZmxhdHRlbmVkIixlLmZsYXR0ZW5lZHx8ITEpfWZ1bmN0aW9uIHUoZSx0KXt2YXIgbj10aGlzLG89bnVsbCx1PSF0aGlzLmlzU2hhcGU7Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdSYmKGkodGhpcywiZGVmYXVsdFZhbHVlIiwoZnVuY3Rpb24oKXtyZXR1cm57fX0pKSxpKHRoaXMsIm1lbWJlcnMiLHt9KSxpKHRoaXMsIm1lbWJlck5hbWVzIixbXSksaSh0aGlzLCJyZXF1aXJlZCIsW10pLGkodGhpcywiaXNSZXF1aXJlZCIsKGZ1bmN0aW9uKCl7cmV0dXJuITF9KSksaSh0aGlzLCJpc0RvY3VtZW50IixCb29sZWFuKGUuZG9jdW1lbnQpKSksZS5tZW1iZXJzJiYoaSh0aGlzLCJtZW1iZXJzIixuZXcgcihlLm1lbWJlcnMsdCwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gYS5jcmVhdGUobix0LGUpfSkpKSxzKHRoaXMsIm1lbWJlck5hbWVzIiwoZnVuY3Rpb24oKXtyZXR1cm4gZS54bWxPcmRlcnx8T2JqZWN0LmtleXMoZS5tZW1iZXJzKX0pKSxlLmV2ZW50JiYocyh0aGlzLCJldmVudFBheWxvYWRNZW1iZXJOYW1lIiwoZnVuY3Rpb24oKXtmb3IodmFyIGU9bi5tZW1iZXJzLHQ9bi5tZW1iZXJOYW1lcyxyPTAsbz10Lmxlbmd0aDtyPG87cisrKWlmKGVbdFtyXV0uaXNFdmVudFBheWxvYWQpcmV0dXJuIHRbcl19KSkscyh0aGlzLCJldmVudEhlYWRlck1lbWJlck5hbWVzIiwoZnVuY3Rpb24oKXtmb3IodmFyIGU9bi5tZW1iZXJzLHQ9bi5tZW1iZXJOYW1lcyxyPVtdLG89MCxpPXQubGVuZ3RoO288aTtvKyspZVt0W29dXS5pc0V2ZW50SGVhZGVyJiZyLnB1c2godFtvXSk7cmV0dXJuIHJ9KSkpKSxlLnJlcXVpcmVkJiYoaSh0aGlzLCJyZXF1aXJlZCIsZS5yZXF1aXJlZCksaSh0aGlzLCJpc1JlcXVpcmVkIiwoZnVuY3Rpb24odCl7aWYoIW8pe289e307Zm9yKHZhciBuPTA7bjxlLnJlcXVpcmVkLmxlbmd0aDtuKyspb1tlLnJlcXVpcmVkW25dXT0hMH1yZXR1cm4gb1t0XX0pLCExLCEwKSksaSh0aGlzLCJyZXN1bHRXcmFwcGVyIixlLnJlc3VsdFdyYXBwZXJ8fG51bGwpLGUucGF5bG9hZCYmaSh0aGlzLCJwYXlsb2FkIixlLnBheWxvYWQpLCJzdHJpbmciPT10eXBlb2YgZS54bWxOYW1lc3BhY2U/aSh0aGlzLCJ4bWxOYW1lc3BhY2VVcmkiLGUueG1sTmFtZXNwYWNlKToib2JqZWN0Ij09dHlwZW9mIGUueG1sTmFtZXNwYWNlJiYoaSh0aGlzLCJ4bWxOYW1lc3BhY2VQcmVmaXgiLGUueG1sTmFtZXNwYWNlLnByZWZpeCksaSh0aGlzLCJ4bWxOYW1lc3BhY2VVcmkiLGUueG1sTmFtZXNwYWNlLnVyaSkpfWZ1bmN0aW9uIGwoZSx0KXt2YXIgbj10aGlzLHI9IXRoaXMuaXNTaGFwZTtpZihjLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyJiZpKHRoaXMsImRlZmF1bHRWYWx1ZSIsKGZ1bmN0aW9uKCl7cmV0dXJuW119KSksZS5tZW1iZXImJnModGhpcywibWVtYmVyIiwoZnVuY3Rpb24oKXtyZXR1cm4gYS5jcmVhdGUoZS5tZW1iZXIsdCl9KSksdGhpcy5mbGF0dGVuZWQpe3ZhciBvPXRoaXMubmFtZTtzKHRoaXMsIm5hbWUiLChmdW5jdGlvbigpe3JldHVybiBuLm1lbWJlci5uYW1lfHxvfSkpfX1mdW5jdGlvbiBwKGUsdCl7dmFyIG49IXRoaXMuaXNTaGFwZTtjLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxuJiYoaSh0aGlzLCJkZWZhdWx0VmFsdWUiLChmdW5jdGlvbigpe3JldHVybnt9fSkpLGkodGhpcywia2V5IixhLmNyZWF0ZSh7dHlwZToic3RyaW5nIn0sdCkpLGkodGhpcywidmFsdWUiLGEuY3JlYXRlKHt0eXBlOiJzdHJpbmcifSx0KSkpLGUua2V5JiZzKHRoaXMsImtleSIsKGZ1bmN0aW9uKCl7cmV0dXJuIGEuY3JlYXRlKGUua2V5LHQpfSkpLGUudmFsdWUmJnModGhpcywidmFsdWUiLChmdW5jdGlvbigpe3JldHVybiBhLmNyZWF0ZShlLnZhbHVlLHQpfSkpfWZ1bmN0aW9uIGQoKXthLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZT1bInJlc3QteG1sIiwicXVlcnkiLCJlYzIiXTt0aGlzLnRvVHlwZT1mdW5jdGlvbih0KXtyZXR1cm4gdD10aGlzLmFwaSYmZS5pbmRleE9mKHRoaXMuYXBpLnByb3RvY29sKT4tMT90fHwiIjp0LHRoaXMuaXNKc29uVmFsdWU/SlNPTi5wYXJzZSh0KTp0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC50b1N0cmluZz90LnRvU3RyaW5nKCk6dH0sdGhpcy50b1dpcmVGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuaXNKc29uVmFsdWU/SlNPTi5zdHJpbmdpZnkoZSk6ZX19ZnVuY3Rpb24gaCgpe2EuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMudG9UeXBlPWZ1bmN0aW9uKGUpe3ZhciB0PW8uYmFzZTY0LmRlY29kZShlKTtpZih0aGlzLmlzU2Vuc2l0aXZlJiZvLmlzTm9kZSgpJiYiZnVuY3Rpb24iPT10eXBlb2Ygby5CdWZmZXIuYWxsb2Mpe3ZhciBuPW8uQnVmZmVyLmFsbG9jKHQubGVuZ3RoLHQpO3QuZmlsbCgwKSx0PW59cmV0dXJuIHR9LHRoaXMudG9XaXJlRm9ybWF0PW8uYmFzZTY0LmVuY29kZX1mdW5jdGlvbiBmKCl7aC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gZygpe2EuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMudG9UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGU/ZTpudWxsPT1lP251bGw6InRydWUiPT09ZX19YS5ub3JtYWxpemVkVHlwZXM9e2NoYXJhY3Rlcjoic3RyaW5nIixkb3VibGU6ImZsb2F0Iixsb25nOiJpbnRlZ2VyIixzaG9ydDoiaW50ZWdlciIsYmlnaW50ZWdlcjoiaW50ZWdlciIsYmlnZGVjaW1hbDoiZmxvYXQiLGJsb2I6ImJpbmFyeSJ9LGEudHlwZXM9e3N0cnVjdHVyZTp1LGxpc3Q6bCxtYXA6cCxib29sZWFuOmcsdGltZXN0YW1wOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYoYS5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS50aW1lc3RhbXBGb3JtYXQpaSh0aGlzLCJ0aW1lc3RhbXBGb3JtYXQiLGUudGltZXN0YW1wRm9ybWF0KTtlbHNlIGlmKHQuaXNUaW1lc3RhbXBGb3JtYXRTZXQmJnRoaXMudGltZXN0YW1wRm9ybWF0KWkodGhpcywidGltZXN0YW1wRm9ybWF0Iix0aGlzLnRpbWVzdGFtcEZvcm1hdCk7ZWxzZSBpZigiaGVhZGVyIj09PXRoaXMubG9jYXRpb24paSh0aGlzLCJ0aW1lc3RhbXBGb3JtYXQiLCJyZmM4MjIiKTtlbHNlIGlmKCJxdWVyeXN0cmluZyI9PT10aGlzLmxvY2F0aW9uKWkodGhpcywidGltZXN0YW1wRm9ybWF0IiwiaXNvODYwMSIpO2Vsc2UgaWYodGhpcy5hcGkpc3dpdGNoKHRoaXMuYXBpLnByb3RvY29sKXtjYXNlImpzb24iOmNhc2UicmVzdC1qc29uIjppKHRoaXMsInRpbWVzdGFtcEZvcm1hdCIsInVuaXhUaW1lc3RhbXAiKTticmVhaztjYXNlInJlc3QteG1sIjpjYXNlInF1ZXJ5IjpjYXNlImVjMiI6aSh0aGlzLCJ0aW1lc3RhbXBGb3JtYXQiLCJpc284NjAxIil9dGhpcy50b1R5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgZS50b1VUQ1N0cmluZz9lOiJzdHJpbmciPT10eXBlb2YgZXx8Im51bWJlciI9PXR5cGVvZiBlP28uZGF0ZS5wYXJzZVRpbWVzdGFtcChlKTpudWxsfSx0aGlzLnRvV2lyZUZvcm1hdD1mdW5jdGlvbihlKXtyZXR1cm4gby5kYXRlLmZvcm1hdChlLHQudGltZXN0YW1wRm9ybWF0KX19LGZsb2F0OmZ1bmN0aW9uKCl7YS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy50b1R5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/bnVsbDpwYXJzZUZsb2F0KGUpfSx0aGlzLnRvV2lyZUZvcm1hdD10aGlzLnRvVHlwZX0saW50ZWdlcjpmdW5jdGlvbigpe2EuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMudG9UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP251bGw6cGFyc2VJbnQoZSwxMCl9LHRoaXMudG9XaXJlRm9ybWF0PXRoaXMudG9UeXBlfSxzdHJpbmc6ZCxiYXNlNjQ6ZixiaW5hcnk6aH0sYS5yZXNvbHZlPWZ1bmN0aW9uKGUsdCl7aWYoZS5zaGFwZSl7dmFyIG49dC5hcGkuc2hhcGVzW2Uuc2hhcGVdO2lmKCFuKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGZpbmQgc2hhcGUgcmVmZXJlbmNlOiAiK2Uuc2hhcGUpO3JldHVybiBufXJldHVybiBudWxsfSxhLmNyZWF0ZT1mdW5jdGlvbihlLHQsbil7aWYoZS5pc1NoYXBlKXJldHVybiBlO3ZhciByPWEucmVzb2x2ZShlLHQpO2lmKHIpe3ZhciBvPU9iamVjdC5rZXlzKGUpO3QuZG9jdW1lbnRhdGlvbnx8KG89by5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiFlLm1hdGNoKC9kb2N1bWVudGF0aW9uLyl9KSkpO3ZhciBpPWZ1bmN0aW9uKCl7ci5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsZSx0LG4pfTtyZXR1cm4gaS5wcm90b3R5cGU9cixuZXcgaX1lLnR5cGV8fChlLm1lbWJlcnM/ZS50eXBlPSJzdHJ1Y3R1cmUiOmUubWVtYmVyP2UudHlwZT0ibGlzdCI6ZS5rZXk/ZS50eXBlPSJtYXAiOmUudHlwZT0ic3RyaW5nIik7dmFyIHM9ZS50eXBlO2lmKGEubm9ybWFsaXplZFR5cGVzW2UudHlwZV0mJihlLnR5cGU9YS5ub3JtYWxpemVkVHlwZXNbZS50eXBlXSksYS50eXBlc1tlLnR5cGVdKXJldHVybiBuZXcgYS50eXBlc1tlLnR5cGVdKGUsdCxuKTt0aHJvdyBuZXcgRXJyb3IoIlVucmVjb2duaXplZCBzaGFwZSB0eXBlOiAiK3MpfSxhLnNoYXBlcz17U3RydWN0dXJlU2hhcGU6dSxMaXN0U2hhcGU6bCxNYXBTaGFwZTpwLFN0cmluZ1NoYXBlOmQsQm9vbGVhblNoYXBlOmcsQmFzZTY0U2hhcGU6Zn0sdC5leHBvcnRzPWF9LHsiLi4vdXRpbCI6NzQsIi4vY29sbGVjdGlvbiI6NDF9XSw0NjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29yZSIpO3IuUGFyYW1WYWxpZGF0b3I9ci51dGlsLmluaGVyaXQoe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpeyEwIT09ZSYmdm9pZCAwIT09ZXx8KGU9e21pbjohMH0pLHRoaXMudmFsaWRhdGlvbj1lfSx2YWxpZGF0ZTpmdW5jdGlvbihlLHQsbil7aWYodGhpcy5lcnJvcnM9W10sdGhpcy52YWxpZGF0ZU1lbWJlcihlLHR8fHt9LG58fCJwYXJhbXMiKSx0aGlzLmVycm9ycy5sZW5ndGg+MSl7dmFyIG89dGhpcy5lcnJvcnMuam9pbigiXG4qICIpO3Rocm93IG89IlRoZXJlIHdlcmUgIit0aGlzLmVycm9ycy5sZW5ndGgrIiB2YWxpZGF0aW9uIGVycm9yczpcbiogIitvLHIudXRpbC5lcnJvcihuZXcgRXJyb3Iobykse2NvZGU6Ik11bHRpcGxlVmFsaWRhdGlvbkVycm9ycyIsZXJyb3JzOnRoaXMuZXJyb3JzfSl9aWYoMT09PXRoaXMuZXJyb3JzLmxlbmd0aCl0aHJvdyB0aGlzLmVycm9yc1swXTtyZXR1cm4hMH0sZmFpbDpmdW5jdGlvbihlLHQpe3RoaXMuZXJyb3JzLnB1c2goci51dGlsLmVycm9yKG5ldyBFcnJvcih0KSx7Y29kZTplfSkpfSx2YWxpZGF0ZVN0cnVjdHVyZTpmdW5jdGlvbihlLHQsbil7aWYoZS5pc0RvY3VtZW50KXJldHVybiEwO3ZhciByO3RoaXMudmFsaWRhdGVUeXBlKHQsbixbIm9iamVjdCJdLCJzdHJ1Y3R1cmUiKTtmb3IodmFyIG89MDtlLnJlcXVpcmVkJiZvPGUucmVxdWlyZWQubGVuZ3RoO28rKyl7dmFyIGk9dFtyPWUucmVxdWlyZWRbb11dO251bGw9PWkmJnRoaXMuZmFpbCgiTWlzc2luZ1JlcXVpcmVkUGFyYW1ldGVyIiwiTWlzc2luZyByZXF1aXJlZCBrZXkgJyIrcisiJyBpbiAiK24pfWZvcihyIGluIHQpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscikpe3ZhciBzPXRbcl0sYT1lLm1lbWJlcnNbcl07aWYodm9pZCAwIT09YSl7dmFyIGM9W24scl0uam9pbigiLiIpO3RoaXMudmFsaWRhdGVNZW1iZXIoYSxzLGMpfWVsc2UgbnVsbCE9cyYmdGhpcy5mYWlsKCJVbmV4cGVjdGVkUGFyYW1ldGVyIiwiVW5leHBlY3RlZCBrZXkgJyIrcisiJyBmb3VuZCBpbiAiK24pfXJldHVybiEwfSx2YWxpZGF0ZU1lbWJlcjpmdW5jdGlvbihlLHQsbil7c3dpdGNoKGUudHlwZSl7Y2FzZSJzdHJ1Y3R1cmUiOnJldHVybiB0aGlzLnZhbGlkYXRlU3RydWN0dXJlKGUsdCxuKTtjYXNlImxpc3QiOnJldHVybiB0aGlzLnZhbGlkYXRlTGlzdChlLHQsbik7Y2FzZSJtYXAiOnJldHVybiB0aGlzLnZhbGlkYXRlTWFwKGUsdCxuKTtkZWZhdWx0OnJldHVybiB0aGlzLnZhbGlkYXRlU2NhbGFyKGUsdCxuKX19LHZhbGlkYXRlTGlzdDpmdW5jdGlvbihlLHQsbil7aWYodGhpcy52YWxpZGF0ZVR5cGUodCxuLFtBcnJheV0pKXt0aGlzLnZhbGlkYXRlUmFuZ2UoZSx0Lmxlbmd0aCxuLCJsaXN0IG1lbWJlciBjb3VudCIpO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXRoaXMudmFsaWRhdGVNZW1iZXIoZS5tZW1iZXIsdFtyXSxuKyJbIityKyJdIil9fSx2YWxpZGF0ZU1hcDpmdW5jdGlvbihlLHQsbil7aWYodGhpcy52YWxpZGF0ZVR5cGUodCxuLFsib2JqZWN0Il0sIm1hcCIpKXt2YXIgcj0wO2Zvcih2YXIgbyBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG8pJiYodGhpcy52YWxpZGF0ZU1lbWJlcihlLmtleSxvLG4rIltrZXk9JyIrbysiJ10iKSx0aGlzLnZhbGlkYXRlTWVtYmVyKGUudmFsdWUsdFtvXSxuKyJbJyIrbysiJ10iKSxyKyspO3RoaXMudmFsaWRhdGVSYW5nZShlLHIsbiwibWFwIG1lbWJlciBjb3VudCIpfX0sdmFsaWRhdGVTY2FsYXI6ZnVuY3Rpb24oZSx0LG4pe3N3aXRjaChlLnR5cGUpe2Nhc2UgbnVsbDpjYXNlIHZvaWQgMDpjYXNlInN0cmluZyI6cmV0dXJuIHRoaXMudmFsaWRhdGVTdHJpbmcoZSx0LG4pO2Nhc2UiYmFzZTY0IjpjYXNlImJpbmFyeSI6cmV0dXJuIHRoaXMudmFsaWRhdGVQYXlsb2FkKHQsbik7Y2FzZSJpbnRlZ2VyIjpjYXNlImZsb2F0IjpyZXR1cm4gdGhpcy52YWxpZGF0ZU51bWJlcihlLHQsbik7Y2FzZSJib29sZWFuIjpyZXR1cm4gdGhpcy52YWxpZGF0ZVR5cGUodCxuLFsiYm9vbGVhbiJdKTtjYXNlInRpbWVzdGFtcCI6cmV0dXJuIHRoaXMudmFsaWRhdGVUeXBlKHQsbixbRGF0ZSwvXlxkezR9LVxkezJ9LVxkezJ9VFxkezJ9OlxkezJ9OlxkezJ9KFwuXGQrKT9aJC8sIm51bWJlciJdLCJEYXRlIG9iamVjdCwgSVNPLTg2MDEgc3RyaW5nLCBvciBhIFVOSVggdGltZXN0YW1wIik7ZGVmYXVsdDpyZXR1cm4gdGhpcy5mYWlsKCJVbmtvd25UeXBlIiwiVW5oYW5kbGVkIHR5cGUgIitlLnR5cGUrIiBmb3IgIituKX19LHZhbGlkYXRlU3RyaW5nOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1bInN0cmluZyJdO2UuaXNKc29uVmFsdWUmJihyPXIuY29uY2F0KFsibnVtYmVyIiwib2JqZWN0IiwiYm9vbGVhbiJdKSksbnVsbCE9PXQmJnRoaXMudmFsaWRhdGVUeXBlKHQsbixyKSYmKHRoaXMudmFsaWRhdGVFbnVtKGUsdCxuKSx0aGlzLnZhbGlkYXRlUmFuZ2UoZSx0Lmxlbmd0aCxuLCJzdHJpbmcgbGVuZ3RoIiksdGhpcy52YWxpZGF0ZVBhdHRlcm4oZSx0LG4pLHRoaXMudmFsaWRhdGVVcmkoZSx0LG4pKX0sdmFsaWRhdGVVcmk6ZnVuY3Rpb24oZSx0LG4peyJ1cmkiPT09ZS5sb2NhdGlvbiYmMD09PXQubGVuZ3RoJiZ0aGlzLmZhaWwoIlVyaVBhcmFtZXRlckVycm9yIiwnRXhwZWN0ZWQgdXJpIHBhcmFtZXRlciB0byBoYXZlIGxlbmd0aCA+PSAxLCBidXQgZm91bmQgIicrdCsnIiBmb3IgJytuKX0sdmFsaWRhdGVQYXR0ZXJuOmZ1bmN0aW9uKGUsdCxuKXt0aGlzLnZhbGlkYXRpb24ucGF0dGVybiYmdm9pZCAwIT09ZS5wYXR0ZXJuJiYobmV3IFJlZ0V4cChlLnBhdHRlcm4pLnRlc3QodCl8fHRoaXMuZmFpbCgiUGF0dGVybk1hdGNoRXJyb3IiLCdQcm92aWRlZCB2YWx1ZSAiJyt0KyciIGRvZXMgbm90IG1hdGNoIHJlZ2V4IHBhdHRlcm4gLycrZS5wYXR0ZXJuKyIvIGZvciAiK24pKX0sdmFsaWRhdGVSYW5nZTpmdW5jdGlvbihlLHQsbixyKXt0aGlzLnZhbGlkYXRpb24ubWluJiZ2b2lkIDAhPT1lLm1pbiYmdDxlLm1pbiYmdGhpcy5mYWlsKCJNaW5SYW5nZUVycm9yIiwiRXhwZWN0ZWQgIityKyIgPj0gIitlLm1pbisiLCBidXQgZm91bmQgIit0KyIgZm9yICIrbiksdGhpcy52YWxpZGF0aW9uLm1heCYmdm9pZCAwIT09ZS5tYXgmJnQ+ZS5tYXgmJnRoaXMuZmFpbCgiTWF4UmFuZ2VFcnJvciIsIkV4cGVjdGVkICIrcisiIDw9ICIrZS5tYXgrIiwgYnV0IGZvdW5kICIrdCsiIGZvciAiK24pfSx2YWxpZGF0ZUVudW06ZnVuY3Rpb24oZSx0LG4pe3RoaXMudmFsaWRhdGlvbi5lbnVtJiZ2b2lkIDAhPT1lLmVudW0mJi0xPT09ZS5lbnVtLmluZGV4T2YodCkmJnRoaXMuZmFpbCgiRW51bUVycm9yIiwiRm91bmQgc3RyaW5nIHZhbHVlIG9mICIrdCsiLCBidXQgZXhwZWN0ZWQgIitlLmVudW0uam9pbigifCIpKyIgZm9yICIrbil9LHZhbGlkYXRlVHlwZTpmdW5jdGlvbihlLHQsbixvKXtpZihudWxsPT1lKXJldHVybiExO2Zvcih2YXIgaT0hMSxzPTA7czxuLmxlbmd0aDtzKyspe2lmKCJzdHJpbmciPT10eXBlb2YgbltzXSl7aWYodHlwZW9mIGU9PT1uW3NdKXJldHVybiEwfWVsc2UgaWYobltzXWluc3RhbmNlb2YgUmVnRXhwKXtpZigoZXx8IiIpLnRvU3RyaW5nKCkubWF0Y2gobltzXSkpcmV0dXJuITB9ZWxzZXtpZihlIGluc3RhbmNlb2YgbltzXSlyZXR1cm4hMDtpZihyLnV0aWwuaXNUeXBlKGUsbltzXSkpcmV0dXJuITA7b3x8aXx8KG49bi5zbGljZSgpKSxuW3NdPXIudXRpbC50eXBlTmFtZShuW3NdKX1pPSEwfXZhciBhPW87YXx8KGE9bi5qb2luKCIsICIpLnJlcGxhY2UoLywoW14sXSspJC8sIiwgb3IkMSIpKTt2YXIgYz1hLm1hdGNoKC9eW2FlaW91XS9pKT8ibiI6IiI7cmV0dXJuIHRoaXMuZmFpbCgiSW52YWxpZFBhcmFtZXRlclR5cGUiLCJFeHBlY3RlZCAiK3QrIiB0byBiZSBhIitjKyIgIithKSwhMX0sdmFsaWRhdGVOdW1iZXI6ZnVuY3Rpb24oZSx0LG4pe2lmKG51bGwhPXQpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIHI9cGFyc2VGbG9hdCh0KTtyLnRvU3RyaW5nKCk9PT10JiYodD1yKX10aGlzLnZhbGlkYXRlVHlwZSh0LG4sWyJudW1iZXIiXSkmJnRoaXMudmFsaWRhdGVSYW5nZShlLHQsbiwibnVtZXJpYyB2YWx1ZSIpfX0sdmFsaWRhdGVQYXlsb2FkOmZ1bmN0aW9uKGUsdCl7aWYobnVsbCE9ZSYmInN0cmluZyIhPXR5cGVvZiBlJiYoIWV8fCJudW1iZXIiIT10eXBlb2YgZS5ieXRlTGVuZ3RoKSl7aWYoci51dGlsLmlzTm9kZSgpKXt2YXIgbj1yLnV0aWwuc3RyZWFtLlN0cmVhbTtpZihyLnV0aWwuQnVmZmVyLmlzQnVmZmVyKGUpfHxlIGluc3RhbmNlb2YgbilyZXR1cm59ZWxzZSBpZih2b2lkIDAhPT10eXBlb2YgQmxvYiYmZSBpbnN0YW5jZW9mIEJsb2IpcmV0dXJuO3ZhciBvPVsiQnVmZmVyIiwiU3RyZWFtIiwiRmlsZSIsIkJsb2IiLCJBcnJheUJ1ZmZlciIsIkRhdGFWaWV3Il07aWYoZSlmb3IodmFyIGk9MDtpPG8ubGVuZ3RoO2krKyl7aWYoci51dGlsLmlzVHlwZShlLG9baV0pKXJldHVybjtpZihyLnV0aWwudHlwZU5hbWUoZS5jb25zdHJ1Y3Rvcik9PT1vW2ldKXJldHVybn10aGlzLmZhaWwoIkludmFsaWRQYXJhbWV0ZXJUeXBlIiwiRXhwZWN0ZWQgIit0KyIgdG8gYmUgYSBzdHJpbmcsIEJ1ZmZlciwgU3RyZWFtLCBCbG9iLCBvciB0eXBlZCBhcnJheSBvYmplY3QiKX19fSl9LHsiLi9jb3JlIjoxOX1dLDQ3OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLG89ZSgiLi4vY29yZSIpO3QuZXhwb3J0cz17cG9wdWxhdGVIb3N0UHJlZml4OmZ1bmN0aW9uKGUpe2lmKCFlLnNlcnZpY2UuY29uZmlnLmhvc3RQcmVmaXhFbmFibGVkKXJldHVybiBlO3ZhciB0LG4saSxzLGEsYz1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dO2lmKGZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGksbj10Lm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLG89dC5lbmRwb2ludE9wZXJhdGlvbiYmdC5lbmRwb2ludE9wZXJhdGlvbj09PXIuc3RyaW5nLmxvd2VyRmlyc3Qobi5uYW1lKTtyZXR1cm4iTlVMTCIhPT1uLmVuZHBvaW50RGlzY292ZXJ5UmVxdWlyZWR8fCEwPT09b30oZSkpcmV0dXJuIGU7aWYoYy5lbmRwb2ludCYmYy5lbmRwb2ludC5ob3N0UHJlZml4KXt2YXIgdT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHIuZWFjaChuLm1lbWJlcnMsKGZ1bmN0aW9uKG4sbyl7aWYoITA9PT1vLmhvc3RMYWJlbCl7aWYoInN0cmluZyIhPXR5cGVvZiB0W25dfHwiIj09PXRbbl0pdGhyb3cgci5lcnJvcihuZXcgRXJyb3Ise21lc3NhZ2U6IlBhcmFtZXRlciAiK24rIiBzaG91bGQgYmUgYSBub24tZW1wdHkgc3RyaW5nLiIsY29kZToiSW52YWxpZFBhcmFtZXRlciJ9KTt2YXIgaT1uZXcgUmVnRXhwKCJcXHsiK24rIlxcfSIsImciKTtlPWUucmVwbGFjZShpLHRbbl0pfX0pKSxlfShjLmVuZHBvaW50Lmhvc3RQcmVmaXgsZS5wYXJhbXMsYy5pbnB1dCk7cz1lLmh0dHBSZXF1ZXN0LmVuZHBvaW50LGE9dSxzLmhvc3QmJihzLmhvc3Q9YStzLmhvc3QpLHMuaG9zdG5hbWUmJihzLmhvc3RuYW1lPWErcy5ob3N0bmFtZSksdD1lLmh0dHBSZXF1ZXN0LmVuZHBvaW50Lmhvc3RuYW1lLG49dC5zcGxpdCgiLiIpLGk9L15bYS16QS1aMC05XXsxfSR8XlthLXpBLVowLTldW2EtekEtWjAtOVwtXSpbYS16QS1aMC05XSQvLHIuYXJyYXlFYWNoKG4sKGZ1bmN0aW9uKGUpe2lmKCFlLmxlbmd0aHx8ZS5sZW5ndGg8MXx8ZS5sZW5ndGg+NjMpdGhyb3cgci5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IlZhbGlkYXRpb25FcnJvciIsbWVzc2FnZToiSG9zdG5hbWUgbGFiZWwgbGVuZ3RoIHNob3VsZCBiZSBiZXR3ZWVuIDEgdG8gNjMgY2hhcmFjdGVycywgaW5jbHVzaXZlLiJ9KTtpZighaS50ZXN0KGUpKXRocm93IG8udXRpbC5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IlZhbGlkYXRpb25FcnJvciIsbWVzc2FnZTplKyIgaXMgbm90IGhvc3RuYW1lIGNvbXBhdGlibGUuIn0pfSkpfXJldHVybiBlfX19LHsiLi4vY29yZSI6MTksIi4uL3V0aWwiOjc0fV0sNDg6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIiksbz1lKCIuLi9qc29uL2J1aWxkZXIiKSxpPWUoIi4uL2pzb24vcGFyc2VyIikscz1lKCIuL2hlbHBlcnMiKS5wb3B1bGF0ZUhvc3RQcmVmaXg7dC5leHBvcnRzPXtidWlsZFJlcXVlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5odHRwUmVxdWVzdCxuPWUuc2VydmljZS5hcGkscj1uLnRhcmdldFByZWZpeCsiLiIrbi5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXS5uYW1lLGk9bi5qc29uVmVyc2lvbnx8IjEuMCIsYT1uLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLmlucHV0LGM9bmV3IG87MT09PWkmJihpPSIxLjAiKSxuLmF3c1F1ZXJ5Q29tcGF0aWJsZSYmKHQucGFyYW1zfHwodC5wYXJhbXM9e30pLE9iamVjdC5hc3NpZ24odC5wYXJhbXMsZS5wYXJhbXMpKSx0LmJvZHk9Yy5idWlsZChlLnBhcmFtc3x8e30sYSksdC5oZWFkZXJzWyJDb250ZW50LVR5cGUiXT0iYXBwbGljYXRpb24veC1hbXotanNvbi0iK2ksdC5oZWFkZXJzWyJYLUFtei1UYXJnZXQiXT1yLHMoZSl9LGV4dHJhY3RFcnJvcjpmdW5jdGlvbihlKXt2YXIgdD17fSxuPWUuaHR0cFJlc3BvbnNlO2lmKHQuY29kZT1uLmhlYWRlcnNbIngtYW16bi1lcnJvcnR5cGUiXXx8IlVua25vd25FcnJvciIsInN0cmluZyI9PXR5cGVvZiB0LmNvZGUmJih0LmNvZGU9dC5jb2RlLnNwbGl0KCI6IilbMF0pLG4uYm9keS5sZW5ndGg+MCl0cnl7dmFyIG89SlNPTi5wYXJzZShuLmJvZHkudG9TdHJpbmcoKSksaT1vLl9fdHlwZXx8by5jb2RlfHxvLkNvZGU7Zm9yKHZhciBzIGluIGkmJih0LmNvZGU9aS5zcGxpdCgiIyIpLnBvcCgpKSwiUmVxdWVzdEVudGl0eVRvb0xhcmdlIj09PXQuY29kZT90Lm1lc3NhZ2U9IlJlcXVlc3QgYm9keSBtdXN0IGJlIGxlc3MgdGhhbiAxIE1CIjp0Lm1lc3NhZ2U9by5tZXNzYWdlfHxvLk1lc3NhZ2V8fG51bGwsb3x8e30pImNvZGUiIT09cyYmIm1lc3NhZ2UiIT09cyYmKHRbIlsiK3MrIl0iXT0iU2VlIGVycm9yLiIrcysiIGZvciBkZXRhaWxzLiIsT2JqZWN0LmRlZmluZVByb3BlcnR5KHQscyx7dmFsdWU6b1tzXSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwfSkpfWNhdGNoKG8pe3Quc3RhdHVzQ29kZT1uLnN0YXR1c0NvZGUsdC5tZXNzYWdlPW4uc3RhdHVzTWVzc2FnZX1lbHNlIHQuc3RhdHVzQ29kZT1uLnN0YXR1c0NvZGUsdC5tZXNzYWdlPW4uc3RhdHVzQ29kZS50b1N0cmluZygpO2UuZXJyb3I9ci5lcnJvcihuZXcgRXJyb3IsdCl9LGV4dHJhY3REYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWUuaHR0cFJlc3BvbnNlLmJvZHkudG9TdHJpbmcoKXx8Int9IjtpZighMT09PWUucmVxdWVzdC5zZXJ2aWNlLmNvbmZpZy5jb252ZXJ0UmVzcG9uc2VUeXBlcyllLmRhdGE9SlNPTi5wYXJzZSh0KTtlbHNle3ZhciBuPWUucmVxdWVzdC5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2UucmVxdWVzdC5vcGVyYXRpb25dLm91dHB1dHx8e30scj1uZXcgaTtlLmRhdGE9ci5wYXJzZSh0LG4pfX19fSx7Ii4uL2pzb24vYnVpbGRlciI6MzcsIi4uL2pzb24vcGFyc2VyIjozOCwiLi4vdXRpbCI6NzQsIi4vaGVscGVycyI6NDd9XSw0OTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uL3V0aWwiKSxpPWUoIi4uL3F1ZXJ5L3F1ZXJ5X3BhcmFtX3NlcmlhbGl6ZXIiKSxzPWUoIi4uL21vZGVsL3NoYXBlIiksYT1lKCIuL2hlbHBlcnMiKS5wb3B1bGF0ZUhvc3RQcmVmaXg7dC5leHBvcnRzPXtidWlsZFJlcXVlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXSxuPWUuaHR0cFJlcXVlc3Q7bi5oZWFkZXJzWyJDb250ZW50LVR5cGUiXT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PXV0Zi04IixuLnBhcmFtcz17VmVyc2lvbjplLnNlcnZpY2UuYXBpLmFwaVZlcnNpb24sQWN0aW9uOnQubmFtZX0sKG5ldyBpKS5zZXJpYWxpemUoZS5wYXJhbXMsdC5pbnB1dCwoZnVuY3Rpb24oZSx0KXtuLnBhcmFtc1tlXT10fSkpLG4uYm9keT1vLnF1ZXJ5UGFyYW1zVG9TdHJpbmcobi5wYXJhbXMpLGEoZSl9LGV4dHJhY3RFcnJvcjpmdW5jdGlvbihlKXt2YXIgdCxuPWUuaHR0cFJlc3BvbnNlLmJvZHkudG9TdHJpbmcoKTtpZihuLm1hdGNoKCI8VW5rbm93bk9wZXJhdGlvbkV4Y2VwdGlvbiIpKXQ9e0NvZGU6IlVua25vd25PcGVyYXRpb24iLE1lc3NhZ2U6IlVua25vd24gb3BlcmF0aW9uICIrZS5yZXF1ZXN0Lm9wZXJhdGlvbn07ZWxzZSB0cnl7dD0obmV3IHIuWE1MLlBhcnNlcikucGFyc2Uobil9Y2F0Y2gobil7dD17Q29kZTplLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlLE1lc3NhZ2U6ZS5odHRwUmVzcG9uc2Uuc3RhdHVzTWVzc2FnZX19dC5yZXF1ZXN0SWQmJiFlLnJlcXVlc3RJZCYmKGUucmVxdWVzdElkPXQucmVxdWVzdElkKSx0LkVycm9ycyYmKHQ9dC5FcnJvcnMpLHQuRXJyb3ImJih0PXQuRXJyb3IpLHQuQ29kZT9lLmVycm9yPW8uZXJyb3IobmV3IEVycm9yLHtjb2RlOnQuQ29kZSxtZXNzYWdlOnQuTWVzc2FnZX0pOmUuZXJyb3I9by5lcnJvcihuZXcgRXJyb3Ise2NvZGU6ZS5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSxtZXNzYWdlOm51bGx9KX0sZXh0cmFjdERhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXF1ZXN0LG49dC5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW3Qub3BlcmF0aW9uXS5vdXRwdXR8fHt9LGk9bjtpZihpLnJlc3VsdFdyYXBwZXIpe3ZhciBhPXMuY3JlYXRlKHt0eXBlOiJzdHJ1Y3R1cmUifSk7YS5tZW1iZXJzW2kucmVzdWx0V3JhcHBlcl09bixhLm1lbWJlck5hbWVzPVtpLnJlc3VsdFdyYXBwZXJdLG8ucHJvcGVydHkobiwibmFtZSIsbi5yZXN1bHRXcmFwcGVyKSxuPWF9dmFyIGM9bmV3IHIuWE1MLlBhcnNlcjtpZihuJiZuLm1lbWJlcnMmJiFuLm1lbWJlcnMuX1hBTVpSZXF1ZXN0SWQpe3ZhciB1PXMuY3JlYXRlKHt0eXBlOiJzdHJpbmcifSx7YXBpOntwcm90b2NvbDoicXVlcnkifX0sInJlcXVlc3RJZCIpO24ubWVtYmVycy5fWEFNWlJlcXVlc3RJZD11fXZhciBsPWMucGFyc2UoZS5odHRwUmVzcG9uc2UuYm9keS50b1N0cmluZygpLG4pO2UucmVxdWVzdElkPWwuX1hBTVpSZXF1ZXN0SWR8fGwucmVxdWVzdElkLGwuX1hBTVpSZXF1ZXN0SWQmJmRlbGV0ZSBsLl9YQU1aUmVxdWVzdElkLGkucmVzdWx0V3JhcHBlciYmbFtpLnJlc3VsdFdyYXBwZXJdJiYoby51cGRhdGUobCxsW2kucmVzdWx0V3JhcHBlcl0pLGRlbGV0ZSBsW2kucmVzdWx0V3JhcHBlcl0pLGUuZGF0YT1sfX19LHsiLi4vY29yZSI6MTksIi4uL21vZGVsL3NoYXBlIjo0NSwiLi4vcXVlcnkvcXVlcnlfcGFyYW1fc2VyaWFsaXplciI6NTMsIi4uL3V0aWwiOjc0LCIuL2hlbHBlcnMiOjQ3fV0sNTA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIiksbz1lKCIuL2hlbHBlcnMiKS5wb3B1bGF0ZUhvc3RQcmVmaXg7ZnVuY3Rpb24gaShlLHQsbixvKXt2YXIgaT1bZSx0XS5qb2luKCIvIik7aT1pLnJlcGxhY2UoL1wvKy9nLCIvIik7dmFyIHM9e30sYT0hMTtpZihyLmVhY2gobi5tZW1iZXJzLChmdW5jdGlvbihlLHQpe3ZhciBuPW9bZV07aWYobnVsbCE9bilpZigidXJpIj09PXQubG9jYXRpb24pe3ZhciBjPW5ldyBSZWdFeHAoIlxceyIrdC5uYW1lKyIoXFwrKT9cXH0iKTtpPWkucmVwbGFjZShjLChmdW5jdGlvbihlLHQpe3JldHVybih0P3IudXJpRXNjYXBlUGF0aDpyLnVyaUVzY2FwZSkoU3RyaW5nKG4pKX0pKX1lbHNlInF1ZXJ5c3RyaW5nIj09PXQubG9jYXRpb24mJihhPSEwLCJsaXN0Ij09PXQudHlwZT9zW3QubmFtZV09bi5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiByLnVyaUVzY2FwZSh0Lm1lbWJlci50b1dpcmVGb3JtYXQoZSkudG9TdHJpbmcoKSl9KSk6Im1hcCI9PT10LnR5cGU/ci5lYWNoKG4sKGZ1bmN0aW9uKGUsdCl7QXJyYXkuaXNBcnJheSh0KT9zW2VdPXQubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gci51cmlFc2NhcGUoU3RyaW5nKGUpKX0pKTpzW2VdPXIudXJpRXNjYXBlKFN0cmluZyh0KSl9KSk6c1t0Lm5hbWVdPXIudXJpRXNjYXBlKHQudG9XaXJlRm9ybWF0KG4pLnRvU3RyaW5nKCkpKX0pKSxhKXtpKz1pLmluZGV4T2YoIj8iKT49MD8iJiI6Ij8iO3ZhciBjPVtdO3IuYXJyYXlFYWNoKE9iamVjdC5rZXlzKHMpLnNvcnQoKSwoZnVuY3Rpb24oZSl7QXJyYXkuaXNBcnJheShzW2VdKXx8KHNbZV09W3NbZV1dKTtmb3IodmFyIHQ9MDt0PHNbZV0ubGVuZ3RoO3QrKyljLnB1c2goci51cmlFc2NhcGUoU3RyaW5nKGUpKSsiPSIrc1tlXVt0XSl9KSksaSs9Yy5qb2luKCImIil9cmV0dXJuIGl9dC5leHBvcnRzPXtidWlsZFJlcXVlc3Q6ZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpe2UuaHR0cFJlcXVlc3QubWV0aG9kPWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0uaHR0cE1ldGhvZH0oZSksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXSxuPXQuaW5wdXQscj1pKGUuaHR0cFJlcXVlc3QuZW5kcG9pbnQucGF0aCx0Lmh0dHBQYXRoLG4sZS5wYXJhbXMpO2UuaHR0cFJlcXVlc3QucGF0aD1yfShlKSxmdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dO3IuZWFjaCh0LmlucHV0Lm1lbWJlcnMsKGZ1bmN0aW9uKHQsbil7dmFyIG89ZS5wYXJhbXNbdF07bnVsbCE9byYmKCJoZWFkZXJzIj09PW4ubG9jYXRpb24mJiJtYXAiPT09bi50eXBlP3IuZWFjaChvLChmdW5jdGlvbih0LHIpe2UuaHR0cFJlcXVlc3QuaGVhZGVyc1tuLm5hbWUrdF09cn0pKToiaGVhZGVyIj09PW4ubG9jYXRpb24mJihvPW4udG9XaXJlRm9ybWF0KG8pLnRvU3RyaW5nKCksbi5pc0pzb25WYWx1ZSYmKG89ci5iYXNlNjQuZW5jb2RlKG8pKSxlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbbi5uYW1lXT1vKSl9KSl9KGUpLG8oZSl9LGV4dHJhY3RFcnJvcjpmdW5jdGlvbigpe30sZXh0cmFjdERhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXF1ZXN0LG49e30sbz1lLmh0dHBSZXNwb25zZSxpPXQuc2VydmljZS5hcGkub3BlcmF0aW9uc1t0Lm9wZXJhdGlvbl0ub3V0cHV0LHM9e307ci5lYWNoKG8uaGVhZGVycywoZnVuY3Rpb24oZSx0KXtzW2UudG9Mb3dlckNhc2UoKV09dH0pKSxyLmVhY2goaS5tZW1iZXJzLChmdW5jdGlvbihlLHQpe3ZhciBpPSh0Lm5hbWV8fGUpLnRvTG93ZXJDYXNlKCk7aWYoImhlYWRlcnMiPT09dC5sb2NhdGlvbiYmIm1hcCI9PT10LnR5cGUpe25bZV09e307dmFyIGE9dC5pc0xvY2F0aW9uTmFtZT90Lm5hbWU6IiIsYz1uZXcgUmVnRXhwKCJeIithKyIoLispIiwiaSIpO3IuZWFjaChvLmhlYWRlcnMsKGZ1bmN0aW9uKHQscil7dmFyIG89dC5tYXRjaChjKTtudWxsIT09byYmKG5bZV1bb1sxXV09cil9KSl9ZWxzZSBpZigiaGVhZGVyIj09PXQubG9jYXRpb24pe2lmKHZvaWQgMCE9PXNbaV0pe3ZhciB1PXQuaXNKc29uVmFsdWU/ci5iYXNlNjQuZGVjb2RlKHNbaV0pOnNbaV07bltlXT10LnRvVHlwZSh1KX19ZWxzZSJzdGF0dXNDb2RlIj09PXQubG9jYXRpb24mJihuW2VdPXBhcnNlSW50KG8uc3RhdHVzQ29kZSwxMCkpfSkpLGUuZGF0YT1ufSxnZW5lcmF0ZVVSSTppfX0seyIuLi91dGlsIjo3NCwiLi9oZWxwZXJzIjo0N31dLDUxOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLG89ZSgiLi9yZXN0IiksaT1lKCIuL2pzb24iKSxzPWUoIi4uL2pzb24vYnVpbGRlciIpLGE9ZSgiLi4vanNvbi9wYXJzZXIiKSxjPVsiR0VUIiwiSEVBRCIsIkRFTEVURSJdO2Z1bmN0aW9uIHUoZSx0KXtpZighZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSl7dmFyIG49dD8iYmluYXJ5L29jdGV0LXN0cmVhbSI6ImFwcGxpY2F0aW9uL2pzb24iO2UuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1UeXBlIl09bn19dC5leHBvcnRzPXtidWlsZFJlcXVlc3Q6ZnVuY3Rpb24oZSl7by5idWlsZFJlcXVlc3QoZSksYy5pbmRleE9mKGUuaHR0cFJlcXVlc3QubWV0aG9kKTwwJiZmdW5jdGlvbihlKXt2YXIgdD1uZXcgcyxuPWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0uaW5wdXQ7aWYobi5wYXlsb2FkKXt2YXIgcixvPW4ubWVtYmVyc1tuLnBheWxvYWRdO3I9ZS5wYXJhbXNbbi5wYXlsb2FkXSwic3RydWN0dXJlIj09PW8udHlwZT8oZS5odHRwUmVxdWVzdC5ib2R5PXQuYnVpbGQocnx8e30sbyksdShlKSk6dm9pZCAwIT09ciYmKGUuaHR0cFJlcXVlc3QuYm9keT1yLCgiYmluYXJ5Ij09PW8udHlwZXx8by5pc1N0cmVhbWluZykmJnUoZSwhMCkpfWVsc2UgZS5odHRwUmVxdWVzdC5ib2R5PXQuYnVpbGQoZS5wYXJhbXMsbiksdShlKX0oZSl9LGV4dHJhY3RFcnJvcjpmdW5jdGlvbihlKXtpLmV4dHJhY3RFcnJvcihlKX0sZXh0cmFjdERhdGE6ZnVuY3Rpb24oZSl7by5leHRyYWN0RGF0YShlKTt2YXIgdD1lLnJlcXVlc3Qsbj10LnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbdC5vcGVyYXRpb25dLHM9dC5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW3Qub3BlcmF0aW9uXS5vdXRwdXR8fHt9O2lmKG4uaGFzRXZlbnRPdXRwdXQscy5wYXlsb2FkKXt2YXIgYz1zLm1lbWJlcnNbcy5wYXlsb2FkXSx1PWUuaHR0cFJlc3BvbnNlLmJvZHk7aWYoYy5pc0V2ZW50U3RyZWFtKWw9bmV3IGEsZS5kYXRhW3BheWxvYWRdPXIuY3JlYXRlRXZlbnRTdHJlYW0oMj09PUFXUy5IdHRwQ2xpZW50LnN0cmVhbXNBcGlWZXJzaW9uP2UuaHR0cFJlc3BvbnNlLnN0cmVhbTp1LGwsYyk7ZWxzZSBpZigic3RydWN0dXJlIj09PWMudHlwZXx8Imxpc3QiPT09Yy50eXBlKXt2YXIgbD1uZXcgYTtlLmRhdGFbcy5wYXlsb2FkXT1sLnBhcnNlKHUsYyl9ZWxzZSJiaW5hcnkiPT09Yy50eXBlfHxjLmlzU3RyZWFtaW5nP2UuZGF0YVtzLnBheWxvYWRdPXU6ZS5kYXRhW3MucGF5bG9hZF09Yy50b1R5cGUodSl9ZWxzZXt2YXIgcD1lLmRhdGE7aS5leHRyYWN0RGF0YShlKSxlLmRhdGE9ci5tZXJnZShwLGUuZGF0YSl9fSx1bnNldENvbnRlbnRMZW5ndGg6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ci5nZXRSZXF1ZXN0UGF5bG9hZFNoYXBlKGUpJiZjLmluZGV4T2YoZS5odHRwUmVxdWVzdC5tZXRob2QpPj0wJiZkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LUxlbmd0aCJdfX19LHsiLi4vanNvbi9idWlsZGVyIjozNywiLi4vanNvbi9wYXJzZXIiOjM4LCIuLi91dGlsIjo3NCwiLi9qc29uIjo0OCwiLi9yZXN0Ijo1MH1dLDUyOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiLi4vdXRpbCIpLGk9ZSgiLi9yZXN0Iik7dC5leHBvcnRzPXtidWlsZFJlcXVlc3Q6ZnVuY3Rpb24oZSl7aS5idWlsZFJlcXVlc3QoZSksWyJHRVQiLCJIRUFEIl0uaW5kZXhPZihlLmh0dHBSZXF1ZXN0Lm1ldGhvZCk8MCYmZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXS5pbnB1dCxuPW5ldyByLlhNTC5CdWlsZGVyLGk9ZS5wYXJhbXMscz10LnBheWxvYWQ7aWYocyl7dmFyIGE9dC5tZW1iZXJzW3NdO2lmKHZvaWQgMD09PShpPWlbc10pKXJldHVybjtpZigic3RydWN0dXJlIj09PWEudHlwZSl7dmFyIGM9YS5uYW1lO2UuaHR0cFJlcXVlc3QuYm9keT1uLnRvWE1MKGksYSxjLCEwKX1lbHNlIGUuaHR0cFJlcXVlc3QuYm9keT1pfWVsc2UgZS5odHRwUmVxdWVzdC5ib2R5PW4udG9YTUwoaSx0LHQubmFtZXx8dC5zaGFwZXx8by5zdHJpbmcudXBwZXJGaXJzdChlLm9wZXJhdGlvbikrIlJlcXVlc3QiKX0oZSl9LGV4dHJhY3RFcnJvcjpmdW5jdGlvbihlKXt2YXIgdDtpLmV4dHJhY3RFcnJvcihlKTt0cnl7dD0obmV3IHIuWE1MLlBhcnNlcikucGFyc2UoZS5odHRwUmVzcG9uc2UuYm9keS50b1N0cmluZygpKX1jYXRjaChuKXt0PXtDb2RlOmUuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUsTWVzc2FnZTplLmh0dHBSZXNwb25zZS5zdGF0dXNNZXNzYWdlfX10LkVycm9ycyYmKHQ9dC5FcnJvcnMpLHQuRXJyb3ImJih0PXQuRXJyb3IpLHQuQ29kZT9lLmVycm9yPW8uZXJyb3IobmV3IEVycm9yLHtjb2RlOnQuQ29kZSxtZXNzYWdlOnQuTWVzc2FnZX0pOmUuZXJyb3I9by5lcnJvcihuZXcgRXJyb3Ise2NvZGU6ZS5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSxtZXNzYWdlOm51bGx9KX0sZXh0cmFjdERhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ7aS5leHRyYWN0RGF0YShlKTt2YXIgbj1lLnJlcXVlc3Qscz1lLmh0dHBSZXNwb25zZS5ib2R5LGE9bi5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW24ub3BlcmF0aW9uXSxjPWEub3V0cHV0LHU9KGEuaGFzRXZlbnRPdXRwdXQsYy5wYXlsb2FkKTtpZih1KXt2YXIgbD1jLm1lbWJlcnNbdV07bC5pc0V2ZW50U3RyZWFtPyh0PW5ldyByLlhNTC5QYXJzZXIsZS5kYXRhW3VdPW8uY3JlYXRlRXZlbnRTdHJlYW0oMj09PXIuSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbj9lLmh0dHBSZXNwb25zZS5zdHJlYW06ZS5odHRwUmVzcG9uc2UuYm9keSx0LGwpKToic3RydWN0dXJlIj09PWwudHlwZT8odD1uZXcgci5YTUwuUGFyc2VyLGUuZGF0YVt1XT10LnBhcnNlKHMudG9TdHJpbmcoKSxsKSk6ImJpbmFyeSI9PT1sLnR5cGV8fGwuaXNTdHJlYW1pbmc/ZS5kYXRhW3VdPXM6ZS5kYXRhW3VdPWwudG9UeXBlKHMpfWVsc2UgaWYocy5sZW5ndGg+MCl7dmFyIHA9KHQ9bmV3IHIuWE1MLlBhcnNlcikucGFyc2Uocy50b1N0cmluZygpLGMpO28udXBkYXRlKGUuZGF0YSxwKX19fX0seyIuLi9jb3JlIjoxOSwiLi4vdXRpbCI6NzQsIi4vcmVzdCI6NTB9XSw1MzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKTtmdW5jdGlvbiBvKCl7fWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGUuaXNRdWVyeU5hbWV8fCJlYzIiIT09ZS5hcGkucHJvdG9jb2w/ZS5uYW1lOmUubmFtZVswXS50b1VwcGVyQ2FzZSgpK2UubmFtZS5zdWJzdHIoMSl9ZnVuY3Rpb24gcyhlLHQsbixvKXtyLmVhY2gobi5tZW1iZXJzLChmdW5jdGlvbihuLHIpe3ZhciBzPXRbbl07aWYobnVsbCE9cyl7dmFyIGM9aShyKTthKGM9ZT9lKyIuIitjOmMscyxyLG8pfX0pKX1mdW5jdGlvbiBhKGUsdCxuLG8pe251bGwhPXQmJigic3RydWN0dXJlIj09PW4udHlwZT9zKGUsdCxuLG8pOiJsaXN0Ij09PW4udHlwZT9mdW5jdGlvbihlLHQsbixvKXt2YXIgcz1uLm1lbWJlcnx8e307MCE9PXQubGVuZ3RoP3IuYXJyYXlFYWNoKHQsKGZ1bmN0aW9uKHQscil7dmFyIGM9Ii4iKyhyKzEpO2lmKCJlYzIiPT09bi5hcGkucHJvdG9jb2wpYys9IiI7ZWxzZSBpZihuLmZsYXR0ZW5lZCl7aWYocy5uYW1lKXt2YXIgdT1lLnNwbGl0KCIuIik7dS5wb3AoKSx1LnB1c2goaShzKSksZT11LmpvaW4oIi4iKX19ZWxzZSBjPSIuIisocy5uYW1lP3MubmFtZToibWVtYmVyIikrYzthKGUrYyx0LHMsbyl9KSk6by5jYWxsKHRoaXMsZSxudWxsKX0oZSx0LG4sbyk6Im1hcCI9PT1uLnR5cGU/ZnVuY3Rpb24oZSx0LG4sbyl7dmFyIGk9MTtyLmVhY2godCwoZnVuY3Rpb24odCxyKXt2YXIgcz0obi5mbGF0dGVuZWQ/Ii4iOiIuZW50cnkuIikraSsrKyIuIixjPXMrKG4ua2V5Lm5hbWV8fCJrZXkiKSx1PXMrKG4udmFsdWUubmFtZXx8InZhbHVlIik7YShlK2MsdCxuLmtleSxvKSxhKGUrdSxyLG4udmFsdWUsbyl9KSl9KGUsdCxuLG8pOm8oZSxuLnRvV2lyZUZvcm1hdCh0KS50b1N0cmluZygpKSl9by5wcm90b3R5cGUuc2VyaWFsaXplPWZ1bmN0aW9uKGUsdCxuKXtzKCIiLGUsdCxuKX0sdC5leHBvcnRzPW99LHsiLi4vdXRpbCI6NzR9XSw1NDpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17bm93OmZ1bmN0aW9uKCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBwZXJmb3JtYW5jZSYmImZ1bmN0aW9uIj09dHlwZW9mIHBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZS5ub3coKTpEYXRlLm5vdygpfX19LHt9XSw1NTpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17aXNGaXBzUmVnaW9uOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmKGUuc3RhcnRzV2l0aCgiZmlwcy0iKXx8ZS5lbmRzV2l0aCgiLWZpcHMiKSl9LGlzR2xvYmFsUmVnaW9uOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmWyJhd3MtZ2xvYmFsIiwiYXdzLXVzLWdvdi1nbG9iYWwiXS5pbmNsdWRlcyhlKX0sZ2V0UmVhbFJlZ2lvbjpmdW5jdGlvbihlKXtyZXR1cm5bImZpcHMtYXdzLWdsb2JhbCIsImF3cy1maXBzIiwiYXdzLWdsb2JhbCJdLmluY2x1ZGVzKGUpPyJ1cy1lYXN0LTEiOlsiZmlwcy1hd3MtdXMtZ292LWdsb2JhbCIsImF3cy11cy1nb3YtZ2xvYmFsIl0uaW5jbHVkZXMoZSk/InVzLWdvdi13ZXN0LTEiOmUucmVwbGFjZSgvZmlwcy0oZGtyLXxwcm9kLSk/fC1maXBzLywiIil9fX0se31dLDU2OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi91dGlsIiksbz1lKCIuL3JlZ2lvbl9jb25maWdfZGF0YS5qc29uIik7ZnVuY3Rpb24gaShlLHQpe3IuZWFjaCh0LChmdW5jdGlvbih0LG4peyJnbG9iYWxFbmRwb2ludCIhPT10JiYodm9pZCAwIT09ZS5jb25maWdbdF0mJm51bGwhPT1lLmNvbmZpZ1t0XXx8KGUuY29uZmlnW3RdPW4pKX0pKX10LmV4cG9ydHM9e2NvbmZpZ3VyZUVuZHBvaW50OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1mdW5jdGlvbihlKXt2YXIgdD1lLmNvbmZpZy5yZWdpb24sbj1mdW5jdGlvbihlKXtpZighZSlyZXR1cm4gbnVsbDt2YXIgdD1lLnNwbGl0KCItIik7cmV0dXJuIHQubGVuZ3RoPDM/bnVsbDp0LnNsaWNlKDAsdC5sZW5ndGgtMikuam9pbigiLSIpKyItKiJ9KHQpLHI9ZS5hcGkuZW5kcG9pbnRQcmVmaXg7cmV0dXJuW1t0LHJdLFtuLHJdLFt0LCIqIl0sW24sIioiXSxbIioiLHJdLFt0LCJpbnRlcm5hbC0qIl0sWyIqIiwiKiJdXS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlWzBdJiZlWzFdP2Uuam9pbigiLyIpOm51bGx9KSl9KGUpLG49ZS5jb25maWcudXNlRmlwc0VuZHBvaW50LHI9ZS5jb25maWcudXNlRHVhbHN0YWNrRW5kcG9pbnQscz0wO3M8dC5sZW5ndGg7cysrKXt2YXIgYT10W3NdO2lmKGEpe3ZhciBjPW4/cj9vLmR1YWxzdGFja0ZpcHNSdWxlczpvLmZpcHNSdWxlczpyP28uZHVhbHN0YWNrUnVsZXM6by5ydWxlcztpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYyxhKSl7dmFyIHU9Y1thXTsic3RyaW5nIj09dHlwZW9mIHUmJih1PW8ucGF0dGVybnNbdV0pLGUuaXNHbG9iYWxFbmRwb2ludD0hIXUuZ2xvYmFsRW5kcG9pbnQsdS5zaWduaW5nUmVnaW9uJiYoZS5zaWduaW5nUmVnaW9uPXUuc2lnbmluZ1JlZ2lvbiksdS5zaWduYXR1cmVWZXJzaW9ufHwodS5zaWduYXR1cmVWZXJzaW9uPSJ2NCIpO3ZhciBsPSJiZWFyZXIiPT09KGUuYXBpJiZlLmFwaS5zaWduYXR1cmVWZXJzaW9uKTtyZXR1cm4gdm9pZCBpKGUsT2JqZWN0LmFzc2lnbih7fSx1LHtzaWduYXR1cmVWZXJzaW9uOmw/ImJlYXJlciI6dS5zaWduYXR1cmVWZXJzaW9ufSkpfX19fSxnZXRFbmRwb2ludFN1ZmZpeDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9eyJeKHVzfGV1fGFwfHNhfGNhfG1lKVxcLVxcdytcXC1cXGQrJCI6ImFtYXpvbmF3cy5jb20iLCJeY25cXC1cXHcrXFwtXFxkKyQiOiJhbWF6b25hd3MuY29tLmNuIiwiXnVzXFwtZ292XFwtXFx3K1xcLVxcZCskIjoiYW1hem9uYXdzLmNvbSIsIl51c1xcLWlzb1xcLVxcdytcXC1cXGQrJCI6ImMycy5pYy5nb3YiLCJedXNcXC1pc29iXFwtXFx3K1xcLVxcZCskIjoic2Mycy5zZ292LmdvdiJ9LG49T2JqZWN0LmtleXModCkscj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgbz1SZWdFeHAobltyXSksaT10W25bcl1dO2lmKG8udGVzdChlKSlyZXR1cm4gaX1yZXR1cm4iYW1hem9uYXdzLmNvbSJ9fX0seyIuL3JlZ2lvbl9jb25maWdfZGF0YS5qc29uIjo1NywiLi91dGlsIjo3NH1dLDU3OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXtydWxlczp7IiovKiI6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LCJjbi0qLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFtYXpvbmF3cy5jb20uY24ifSwidXMtaXNvLSovKiI6InVzSXNvIiwidXMtaXNvYi0qLyoiOiJ1c0lzb2IiLCIqL2J1ZGdldHMiOiJnbG9iYWxTU0wiLCIqL2Nsb3VkZnJvbnQiOiJnbG9iYWxTU0wiLCIqL3N0cyI6Imdsb2JhbFNTTCIsIiovaW1wb3J0ZXhwb3J0Ijp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5hbWF6b25hd3MuY29tIixzaWduYXR1cmVWZXJzaW9uOiJ2MiIsZ2xvYmFsRW5kcG9pbnQ6ITB9LCIqL3JvdXRlNTMiOiJnbG9iYWxTU0wiLCJjbi0qL3JvdXRlNTMiOntlbmRwb2ludDoie3NlcnZpY2V9LmFtYXpvbmF3cy5jb20uY24iLGdsb2JhbEVuZHBvaW50OiEwLHNpZ25pbmdSZWdpb246ImNuLW5vcnRod2VzdC0xIn0sInVzLWdvdi0qL3JvdXRlNTMiOiJnbG9iYWxHb3ZDbG91ZCIsInVzLWlzby0qL3JvdXRlNTMiOntlbmRwb2ludDoie3NlcnZpY2V9LmMycy5pYy5nb3YiLGdsb2JhbEVuZHBvaW50OiEwLHNpZ25pbmdSZWdpb246InVzLWlzby1lYXN0LTEifSwidXMtaXNvYi0qL3JvdXRlNTMiOntlbmRwb2ludDoie3NlcnZpY2V9LnNjMnMuc2dvdi5nb3YiLGdsb2JhbEVuZHBvaW50OiEwLHNpZ25pbmdSZWdpb246InVzLWlzb2ItZWFzdC0xIn0sIiovd2FmIjoiZ2xvYmFsU1NMIiwiKi9pYW0iOiJnbG9iYWxTU0wiLCJjbi0qL2lhbSI6e2VuZHBvaW50OiJ7c2VydmljZX0uY24tbm9ydGgtMS5hbWF6b25hd3MuY29tLmNuIixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJjbi1ub3J0aC0xIn0sInVzLWlzby0qL2lhbSI6e2VuZHBvaW50OiJ7c2VydmljZX0udXMtaXNvLWVhc3QtMS5jMnMuaWMuZ292IixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJ1cy1pc28tZWFzdC0xIn0sInVzLWdvdi0qL2lhbSI6Imdsb2JhbEdvdkNsb3VkIiwiKi9jZSI6e2VuZHBvaW50OiJ7c2VydmljZX0udXMtZWFzdC0xLmFtYXpvbmF3cy5jb20iLGdsb2JhbEVuZHBvaW50OiEwLHNpZ25pbmdSZWdpb246InVzLWVhc3QtMSJ9LCJjbi0qL2NlIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5jbi1ub3J0aHdlc3QtMS5hbWF6b25hd3MuY29tLmNuIixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJjbi1ub3J0aHdlc3QtMSJ9LCJ1cy1nb3YtKi9zdHMiOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFtYXpvbmF3cy5jb20ifSwidXMtZ292LXdlc3QtMS9zMyI6InMzc2lnbmF0dXJlIiwidXMtd2VzdC0xL3MzIjoiczNzaWduYXR1cmUiLCJ1cy13ZXN0LTIvczMiOiJzM3NpZ25hdHVyZSIsImV1LXdlc3QtMS9zMyI6InMzc2lnbmF0dXJlIiwiYXAtc291dGhlYXN0LTEvczMiOiJzM3NpZ25hdHVyZSIsImFwLXNvdXRoZWFzdC0yL3MzIjoiczNzaWduYXR1cmUiLCJhcC1ub3J0aGVhc3QtMS9zMyI6InMzc2lnbmF0dXJlIiwic2EtZWFzdC0xL3MzIjoiczNzaWduYXR1cmUiLCJ1cy1lYXN0LTEvczMiOntlbmRwb2ludDoie3NlcnZpY2V9LmFtYXpvbmF3cy5jb20iLHNpZ25hdHVyZVZlcnNpb246InMzIn0sInVzLWVhc3QtMS9zZGIiOntlbmRwb2ludDoie3NlcnZpY2V9LmFtYXpvbmF3cy5jb20iLHNpZ25hdHVyZVZlcnNpb246InYyIn0sIiovc2RiIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hbWF6b25hd3MuY29tIixzaWduYXR1cmVWZXJzaW9uOiJ2MiJ9LCIqL3Jlc291cmNlLWV4cGxvcmVyLTIiOiJkdWFsc3RhY2tCeURlZmF1bHQiLCIqL2tlbmRyYS1yYW5raW5nIjoiZHVhbHN0YWNrQnlEZWZhdWx0IiwiKi9pbnRlcm5ldG1vbml0b3IiOiJkdWFsc3RhY2tCeURlZmF1bHQiLCIqL2NvZGVjYXRhbHlzdCI6Imdsb2JhbER1YWxzdGFja0J5RGVmYXVsdCJ9LGZpcHNSdWxlczp7IiovKiI6ImZpcHNTdGFuZGFyZCIsInVzLWdvdi0qLyoiOiJmaXBzU3RhbmRhcmQiLCJ1cy1pc28tKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLntyZWdpb259LmMycy5pYy5nb3YifSwidXMtaXNvLSovZG1zIjoidXNJc28iLCJ1cy1pc29iLSovKiI6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy57cmVnaW9ufS5zYzJzLnNnb3YuZ292In0sInVzLWlzb2ItKi9kbXMiOiJ1c0lzb2IiLCJjbi0qLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMue3JlZ2lvbn0uYW1hem9uYXdzLmNvbS5jbiJ9LCIqL2FwaS5lY3IiOiJmaXBzLmFwaS5lY3IiLCIqL2FwaS5zYWdlbWFrZXIiOiJmaXBzLmFwaS5zYWdlbWFrZXIiLCIqL2JhdGNoIjoiZmlwc0RvdFByZWZpeCIsIiovZWtzIjoiZmlwc0RvdFByZWZpeCIsIiovbW9kZWxzLmxleCI6ImZpcHMubW9kZWxzLmxleCIsIiovcnVudGltZS5sZXgiOiJmaXBzLnJ1bnRpbWUubGV4IiwiKi9ydW50aW1lLnNhZ2VtYWtlciI6e2VuZHBvaW50OiJydW50aW1lLWZpcHMuc2FnZW1ha2VyLntyZWdpb259LmFtYXpvbmF3cy5jb20ifSwiKi9pYW0iOiJmaXBzV2l0aG91dFJlZ2lvbiIsIiovcm91dGU1MyI6ImZpcHNXaXRob3V0UmVnaW9uIiwiKi90cmFuc2NyaWJlIjoiZmlwc0RvdFByZWZpeCIsIiovd2FmIjoiZmlwc1dpdGhvdXRSZWdpb24iLCJ1cy1nb3YtKi90cmFuc2NyaWJlIjoiZmlwc0RvdFByZWZpeCIsInVzLWdvdi0qL2FwaS5lY3IiOiJmaXBzLmFwaS5lY3IiLCJ1cy1nb3YtKi9hcGkuc2FnZW1ha2VyIjoiZmlwcy5hcGkuc2FnZW1ha2VyIiwidXMtZ292LSovbW9kZWxzLmxleCI6ImZpcHMubW9kZWxzLmxleCIsInVzLWdvdi0qL3J1bnRpbWUubGV4IjoiZmlwcy5ydW50aW1lLmxleCIsInVzLWdvdi0qL2FjbS1wY2EiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovYmF0Y2giOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovY2xvdWRmb3JtYXRpb24iOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovY29uZmlnIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2VrcyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9lbGFzdGljbWFwcmVkdWNlIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2lkZW50aXR5c3RvcmUiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovZHluYW1vZGIiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovZWxhc3RpY2xvYWRiYWxhbmNpbmciOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovZ3VhcmRkdXR5IjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL21vbml0b3JpbmciOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovcmVzb3VyY2UtZ3JvdXBzIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL3J1bnRpbWUuc2FnZW1ha2VyIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL3NlcnZpY2VjYXRhbG9nLWFwcHJlZ2lzdHJ5IjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL3NlcnZpY2VxdW90YXMiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovc3NtIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL3N0cyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9zdXBwb3J0IjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi13ZXN0LTEvc3RhdGVzIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWlzby1lYXN0LTEvZWxhc3RpY2ZpbGVzeXN0ZW0iOntlbmRwb2ludDoiZWxhc3RpY2ZpbGVzeXN0ZW0tZmlwcy57cmVnaW9ufS5jMnMuaWMuZ292In0sInVzLWdvdi13ZXN0LTEvb3JnYW5pemF0aW9ucyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3Ytd2VzdC0xL3JvdXRlNTMiOntlbmRwb2ludDoicm91dGU1My51cy1nb3YuYW1hem9uYXdzLmNvbSJ9LCIqL3Jlc291cmNlLWV4cGxvcmVyLTIiOiJmaXBzRHVhbHN0YWNrQnlEZWZhdWx0IiwiKi9rZW5kcmEtcmFua2luZyI6ImR1YWxzdGFja0J5RGVmYXVsdCIsIiovaW50ZXJuZXRtb25pdG9yIjoiZHVhbHN0YWNrQnlEZWZhdWx0IiwiKi9jb2RlY2F0YWx5c3QiOiJmaXBzR2xvYmFsRHVhbHN0YWNrQnlEZWZhdWx0In0sZHVhbHN0YWNrUnVsZXM6eyIqLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFwaS5hd3MifSwiY24tKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hcGkuYW1hem9ud2Vic2VydmljZXMuY29tLmNuIn0sIiovczMiOiJkdWFsc3RhY2tMZWdhY3kiLCJjbi0qL3MzIjoiZHVhbHN0YWNrTGVnYWN5Q24iLCIqL3MzLWNvbnRyb2wiOiJkdWFsc3RhY2tMZWdhY3kiLCJjbi0qL3MzLWNvbnRyb2wiOiJkdWFsc3RhY2tMZWdhY3lDbiIsImFwLXNvdXRoLTEvZWMyIjoiZHVhbHN0YWNrTGVnYWN5RWMyIiwiZXUtd2VzdC0xL2VjMiI6ImR1YWxzdGFja0xlZ2FjeUVjMiIsInNhLWVhc3QtMS9lYzIiOiJkdWFsc3RhY2tMZWdhY3lFYzIiLCJ1cy1lYXN0LTEvZWMyIjoiZHVhbHN0YWNrTGVnYWN5RWMyIiwidXMtZWFzdC0yL2VjMiI6ImR1YWxzdGFja0xlZ2FjeUVjMiIsInVzLXdlc3QtMi9lYzIiOiJkdWFsc3RhY2tMZWdhY3lFYzIifSxkdWFsc3RhY2tGaXBzUnVsZXM6eyIqLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMue3JlZ2lvbn0uYXBpLmF3cyJ9LCJjbi0qLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMue3JlZ2lvbn0uYXBpLmFtYXpvbndlYnNlcnZpY2VzLmNvbS5jbiJ9LCIqL3MzIjoiZHVhbHN0YWNrRmlwc0xlZ2FjeSIsImNuLSovczMiOiJkdWFsc3RhY2tGaXBzTGVnYWN5Q24iLCIqL3MzLWNvbnRyb2wiOiJkdWFsc3RhY2tGaXBzTGVnYWN5IiwiY24tKi9zMy1jb250cm9sIjoiZHVhbHN0YWNrRmlwc0xlZ2FjeUNuIn0scGF0dGVybnM6e2dsb2JhbFNTTDp7ZW5kcG9pbnQ6Imh0dHBzOi8ve3NlcnZpY2V9LmFtYXpvbmF3cy5jb20iLGdsb2JhbEVuZHBvaW50OiEwLHNpZ25pbmdSZWdpb246InVzLWVhc3QtMSJ9LGdsb2JhbEdvdkNsb3VkOntlbmRwb2ludDoie3NlcnZpY2V9LnVzLWdvdi5hbWF6b25hd3MuY29tIixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJ1cy1nb3Ytd2VzdC0xIn0sczNzaWduYXR1cmU6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSIsc2lnbmF0dXJlVmVyc2lvbjoiczMifSx1c0lzbzp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5jMnMuaWMuZ292In0sdXNJc29iOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LnNjMnMuc2dvdi5nb3YifSxmaXBzU3RhbmRhcmQ6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sZmlwc0RvdFByZWZpeDp7ZW5kcG9pbnQ6ImZpcHMue3NlcnZpY2V9LntyZWdpb259LmFtYXpvbmF3cy5jb20ifSxmaXBzV2l0aG91dFJlZ2lvbjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLmFtYXpvbmF3cy5jb20ifSwiZmlwcy5hcGkuZWNyIjp7ZW5kcG9pbnQ6ImVjci1maXBzLntyZWdpb259LmFtYXpvbmF3cy5jb20ifSwiZmlwcy5hcGkuc2FnZW1ha2VyIjp7ZW5kcG9pbnQ6ImFwaS1maXBzLnNhZ2VtYWtlci57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sImZpcHMubW9kZWxzLmxleCI6e2VuZHBvaW50OiJtb2RlbHMtZmlwcy5sZXgue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LCJmaXBzLnJ1bnRpbWUubGV4Ijp7ZW5kcG9pbnQ6InJ1bnRpbWUtZmlwcy5sZXgue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LGZpcHNXaXRoU2VydmljZU9ubHk6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LGR1YWxzdGFja0xlZ2FjeTp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5kdWFsc3RhY2sue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LGR1YWxzdGFja0xlZ2FjeUNuOntlbmRwb2ludDoie3NlcnZpY2V9LmR1YWxzdGFjay57cmVnaW9ufS5hbWF6b25hd3MuY29tLmNuIn0sZHVhbHN0YWNrRmlwc0xlZ2FjeTp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLmR1YWxzdGFjay57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sZHVhbHN0YWNrRmlwc0xlZ2FjeUNuOntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMuZHVhbHN0YWNrLntyZWdpb259LmFtYXpvbmF3cy5jb20uY24ifSxkdWFsc3RhY2tMZWdhY3lFYzI6e2VuZHBvaW50OiJhcGkuZWMyLntyZWdpb259LmF3cyJ9LGR1YWxzdGFja0J5RGVmYXVsdDp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hcGkuYXdzIn0sZmlwc0R1YWxzdGFja0J5RGVmYXVsdDp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLntyZWdpb259LmFwaS5hd3MifSxnbG9iYWxEdWFsc3RhY2tCeURlZmF1bHQ6e2VuZHBvaW50OiJ7c2VydmljZX0uZ2xvYmFsLmFwaS5hd3MifSxmaXBzR2xvYmFsRHVhbHN0YWNrQnlEZWZhdWx0OntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMuZ2xvYmFsLmFwaS5hd3MifX19fSx7fV0sNTg6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24odCl7KGZ1bmN0aW9uKCl7dmFyIG49ZSgiLi9jb3JlIikscj1lKCIuL3N0YXRlX21hY2hpbmUiKSxvPW4udXRpbC5pbmhlcml0LGk9bi51dGlsLmRvbWFpbixzPWUoImptZXNwYXRoIiksYT17c3VjY2VzczoxLGVycm9yOjEsY29tcGxldGU6MX0sYz1uZXcgcjtjLnNldHVwU3RhdGVzPWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO24uX2hhbHRIYW5kbGVyc09uRXJyb3I9ITEsbi5lbWl0KG4uX2FzbS5jdXJyZW50U3RhdGUsKGZ1bmN0aW9uKGUpe2lmKGUpaWYocj1uLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLHIuX2FzbS5jdXJyZW50U3RhdGUpKXtpZighKGkmJm4uZG9tYWluIGluc3RhbmNlb2YgaS5Eb21haW4pKXRocm93IGU7ZS5kb21haW5FbWl0dGVyPW4sZS5kb21haW49bi5kb21haW4sZS5kb21haW5UaHJvd249ITEsbi5kb21haW4uZW1pdCgiZXJyb3IiLGUpfWVsc2Ugbi5yZXNwb25zZS5lcnJvcj1lLHQoZSk7ZWxzZSB0KG4ucmVzcG9uc2UuZXJyb3IpO3ZhciByfSkpfTt0aGlzLmFkZFN0YXRlKCJ2YWxpZGF0ZSIsImJ1aWxkIiwiZXJyb3IiLGUpLHRoaXMuYWRkU3RhdGUoImJ1aWxkIiwiYWZ0ZXJCdWlsZCIsInJlc3RhcnQiLGUpLHRoaXMuYWRkU3RhdGUoImFmdGVyQnVpbGQiLCJzaWduIiwicmVzdGFydCIsZSksdGhpcy5hZGRTdGF0ZSgic2lnbiIsInNlbmQiLCJyZXRyeSIsZSksdGhpcy5hZGRTdGF0ZSgicmV0cnkiLCJhZnRlclJldHJ5IiwiYWZ0ZXJSZXRyeSIsZSksdGhpcy5hZGRTdGF0ZSgiYWZ0ZXJSZXRyeSIsInNpZ24iLCJlcnJvciIsZSksdGhpcy5hZGRTdGF0ZSgic2VuZCIsInZhbGlkYXRlUmVzcG9uc2UiLCJyZXRyeSIsZSksdGhpcy5hZGRTdGF0ZSgidmFsaWRhdGVSZXNwb25zZSIsImV4dHJhY3REYXRhIiwiZXh0cmFjdEVycm9yIixlKSx0aGlzLmFkZFN0YXRlKCJleHRyYWN0RXJyb3IiLCJleHRyYWN0RGF0YSIsInJldHJ5IixlKSx0aGlzLmFkZFN0YXRlKCJleHRyYWN0RGF0YSIsInN1Y2Nlc3MiLCJyZXRyeSIsZSksdGhpcy5hZGRTdGF0ZSgicmVzdGFydCIsImJ1aWxkIiwiZXJyb3IiLGUpLHRoaXMuYWRkU3RhdGUoInN1Y2Nlc3MiLCJjb21wbGV0ZSIsImNvbXBsZXRlIixlKSx0aGlzLmFkZFN0YXRlKCJlcnJvciIsImNvbXBsZXRlIiwiY29tcGxldGUiLGUpLHRoaXMuYWRkU3RhdGUoImNvbXBsZXRlIixudWxsLG51bGwsZSl9LGMuc2V0dXBTdGF0ZXMoKSxuLlJlcXVlc3Q9byh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0LG8pe3ZhciBzPWUuZW5kcG9pbnQsYT1lLmNvbmZpZy5yZWdpb24sdT1lLmNvbmZpZy5jdXN0b21Vc2VyQWdlbnQ7ZS5zaWduaW5nUmVnaW9uP2E9ZS5zaWduaW5nUmVnaW9uOmUuaXNHbG9iYWxFbmRwb2ludCYmKGE9InVzLWVhc3QtMSIpLHRoaXMuZG9tYWluPWkmJmkuYWN0aXZlLHRoaXMuc2VydmljZT1lLHRoaXMub3BlcmF0aW9uPXQsdGhpcy5wYXJhbXM9b3x8e30sdGhpcy5odHRwUmVxdWVzdD1uZXcgbi5IdHRwUmVxdWVzdChzLGEpLHRoaXMuaHR0cFJlcXVlc3QuYXBwZW5kVG9Vc2VyQWdlbnQodSksdGhpcy5zdGFydFRpbWU9ZS5nZXRTa2V3Q29ycmVjdGVkRGF0ZSgpLHRoaXMucmVzcG9uc2U9bmV3IG4uUmVzcG9uc2UodGhpcyksdGhpcy5fYXNtPW5ldyByKGMuc3RhdGVzLCJ2YWxpZGF0ZSIpLHRoaXMuX2hhbHRIYW5kbGVyc09uRXJyb3I9ITEsbi5TZXF1ZW50aWFsRXhlY3V0b3IuY2FsbCh0aGlzKSx0aGlzLmVtaXQ9dGhpcy5lbWl0RXZlbnR9LHNlbmQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJih0aGlzLmh0dHBSZXF1ZXN0LmFwcGVuZFRvVXNlckFnZW50KCJjYWxsYmFjayIpLHRoaXMub24oImNvbXBsZXRlIiwoZnVuY3Rpb24odCl7ZS5jYWxsKHQsdC5lcnJvcix0LmRhdGEpfSkpKSx0aGlzLnJ1blRvKCksdGhpcy5yZXNwb25zZX0sYnVpbGQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucnVuVG8oInNlbmQiLGUpfSxydW5UbzpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9hc20ucnVuVG8oZSx0LHRoaXMpLHRoaXN9LGFib3J0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJ2YWxpZGF0ZVJlc3BvbnNlIiksdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoImV4dHJhY3RFcnJvciIpLHRoaXMub24oInZhbGlkYXRlUmVzcG9uc2UiLChmdW5jdGlvbihlKXtlLmVycm9yPW4udXRpbC5lcnJvcihuZXcgRXJyb3IoIlJlcXVlc3QgYWJvcnRlZCBieSB1c2VyIikse2NvZGU6IlJlcXVlc3RBYm9ydGVkRXJyb3IiLHJldHJ5YWJsZTohMX0pfSkpLHRoaXMuaHR0cFJlcXVlc3Quc3RyZWFtJiYhdGhpcy5odHRwUmVxdWVzdC5zdHJlYW0uZGlkQ2FsbGJhY2smJih0aGlzLmh0dHBSZXF1ZXN0LnN0cmVhbS5hYm9ydCgpLHRoaXMuaHR0cFJlcXVlc3QuX2Fib3J0Q2FsbGJhY2s/dGhpcy5odHRwUmVxdWVzdC5fYWJvcnRDYWxsYmFjaygpOnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJzZW5kIikpLHRoaXN9LGVhY2hQYWdlOmZ1bmN0aW9uKGUpe2U9bi51dGlsLmZuLm1ha2VBc3luYyhlLDMpLHRoaXMub24oImNvbXBsZXRlIiwoZnVuY3Rpb24gdChyKXtlLmNhbGwocixyLmVycm9yLHIuZGF0YSwoZnVuY3Rpb24obyl7ITEhPT1vJiYoci5oYXNOZXh0UGFnZSgpP3IubmV4dFBhZ2UoKS5vbigiY29tcGxldGUiLHQpLnNlbmQoKTplLmNhbGwocixudWxsLG51bGwsbi51dGlsLmZuLm5vb3ApKX0pKX0pKS5zZW5kKCl9LGVhY2hJdGVtOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy5lYWNoUGFnZSgoZnVuY3Rpb24ocixvKXtpZihyKXJldHVybiBlKHIsbnVsbCk7aWYobnVsbD09PW8pcmV0dXJuIGUobnVsbCxudWxsKTt2YXIgaT10LnNlcnZpY2UucGFnaW5hdGlvbkNvbmZpZyh0Lm9wZXJhdGlvbikucmVzdWx0S2V5O0FycmF5LmlzQXJyYXkoaSkmJihpPWlbMF0pO3ZhciBhPXMuc2VhcmNoKG8saSksYz0hMDtyZXR1cm4gbi51dGlsLmFycmF5RWFjaChhLChmdW5jdGlvbih0KXtpZighMT09PShjPWUobnVsbCx0KSkpcmV0dXJuIG4udXRpbC5hYm9ydH0pKSxjfSkpfSxpc1BhZ2VhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLnNlcnZpY2UucGFnaW5hdGlvbkNvbmZpZyh0aGlzLm9wZXJhdGlvbil9LGNyZWF0ZVJlYWRTdHJlYW06ZnVuY3Rpb24oKXt2YXIgZT1uLnV0aWwuc3RyZWFtLHI9dGhpcyxvPW51bGw7cmV0dXJuIDI9PT1uLkh0dHBDbGllbnQuc3RyZWFtc0FwaVZlcnNpb24/KG89bmV3IGUuUGFzc1Rocm91Z2gsdC5uZXh0VGljaygoZnVuY3Rpb24oKXtyLnNlbmQoKX0pKSk6KChvPW5ldyBlLlN0cmVhbSkucmVhZGFibGU9ITAsby5zZW50PSExLG8ub24oIm5ld0xpc3RlbmVyIiwoZnVuY3Rpb24oZSl7by5zZW50fHwiZGF0YSIhPT1lfHwoby5zZW50PSEwLHQubmV4dFRpY2soKGZ1bmN0aW9uKCl7ci5zZW5kKCl9KSkpfSkpKSx0aGlzLm9uKCJlcnJvciIsKGZ1bmN0aW9uKGUpe28uZW1pdCgiZXJyb3IiLGUpfSkpLHRoaXMub24oImh0dHBIZWFkZXJzIiwoZnVuY3Rpb24odCxpLHMpe2lmKHQ8MzAwKXtyLnJlbW92ZUxpc3RlbmVyKCJodHRwRGF0YSIsbi5FdmVudExpc3RlbmVycy5Db3JlLkhUVFBfREFUQSksci5yZW1vdmVMaXN0ZW5lcigiaHR0cEVycm9yIixuLkV2ZW50TGlzdGVuZXJzLkNvcmUuSFRUUF9FUlJPUiksci5vbigiaHR0cEVycm9yIiwoZnVuY3Rpb24oZSl7cy5lcnJvcj1lLHMuZXJyb3IucmV0cnlhYmxlPSExfSkpO3ZhciBhLGM9ITE7aWYoIkhFQUQiIT09ci5odHRwUmVxdWVzdC5tZXRob2QmJihhPXBhcnNlSW50KGlbImNvbnRlbnQtbGVuZ3RoIl0sMTApKSx2b2lkIDAhPT1hJiYhaXNOYU4oYSkmJmE+PTApe2M9ITA7dmFyIHU9MH12YXIgbD1mdW5jdGlvbigpe2MmJnUhPT1hP28uZW1pdCgiZXJyb3IiLG4udXRpbC5lcnJvcihuZXcgRXJyb3IoIlN0cmVhbSBjb250ZW50IGxlbmd0aCBtaXNtYXRjaC4gUmVjZWl2ZWQgIit1KyIgb2YgIithKyIgYnl0ZXMuIikse2NvZGU6IlN0cmVhbUNvbnRlbnRMZW5ndGhNaXNtYXRjaCJ9KSk6Mj09PW4uSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbj9vLmVuZCgpOm8uZW1pdCgiZW5kIil9LHA9cy5odHRwUmVzcG9uc2UuY3JlYXRlVW5idWZmZXJlZFN0cmVhbSgpO2lmKDI9PT1uLkh0dHBDbGllbnQuc3RyZWFtc0FwaVZlcnNpb24paWYoYyl7dmFyIGQ9bmV3IGUuUGFzc1Rocm91Z2g7ZC5fd3JpdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubGVuZ3RoJiYodSs9dC5sZW5ndGgpLGUuUGFzc1Rocm91Z2gucHJvdG90eXBlLl93cml0ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGQub24oImVuZCIsbCksby5vbigiZXJyb3IiLChmdW5jdGlvbihlKXtjPSExLHAudW5waXBlKGQpLGQuZW1pdCgiZW5kIiksZC5lbmQoKX0pKSxwLnBpcGUoZCkucGlwZShvLHtlbmQ6ITF9KX1lbHNlIHAucGlwZShvKTtlbHNlIGMmJnAub24oImRhdGEiLChmdW5jdGlvbihlKXtlJiZlLmxlbmd0aCYmKHUrPWUubGVuZ3RoKX0pKSxwLm9uKCJkYXRhIiwoZnVuY3Rpb24oZSl7by5lbWl0KCJkYXRhIixlKX0pKSxwLm9uKCJlbmQiLGwpO3Aub24oImVycm9yIiwoZnVuY3Rpb24oZSl7Yz0hMSxvLmVtaXQoImVycm9yIixlKX0pKX19KSksb30sZW1pdEV2ZW50OmZ1bmN0aW9uKGUsdCxyKXsiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHI9dCx0PW51bGwpLHJ8fChyPWZ1bmN0aW9uKCl7fSksdHx8KHQ9dGhpcy5ldmVudFBhcmFtZXRlcnMoZSx0aGlzLnJlc3BvbnNlKSksbi5TZXF1ZW50aWFsRXhlY3V0b3IucHJvdG90eXBlLmVtaXQuY2FsbCh0aGlzLGUsdCwoZnVuY3Rpb24oZSl7ZSYmKHRoaXMucmVzcG9uc2UuZXJyb3I9ZSksci5jYWxsKHRoaXMsZSl9KSl9LGV2ZW50UGFyYW1ldGVyczpmdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZSJyZXN0YXJ0IjpjYXNlInZhbGlkYXRlIjpjYXNlInNpZ24iOmNhc2UiYnVpbGQiOmNhc2UiYWZ0ZXJWYWxpZGF0ZSI6Y2FzZSJhZnRlckJ1aWxkIjpyZXR1cm5bdGhpc107Y2FzZSJlcnJvciI6cmV0dXJuW3RoaXMucmVzcG9uc2UuZXJyb3IsdGhpcy5yZXNwb25zZV07ZGVmYXVsdDpyZXR1cm5bdGhpcy5yZXNwb25zZV19fSxwcmVzaWduOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fCJmdW5jdGlvbiIhPXR5cGVvZiBlfHwodD1lLGU9bnVsbCksKG5ldyBuLlNpZ25lcnMuUHJlc2lnbikuc2lnbih0aGlzLnRvR2V0KCksZSx0KX0saXNQcmVzaWduZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuaHR0cFJlcXVlc3QuaGVhZGVycywicHJlc2lnbmVkLWV4cGlyZXMiKX0sdG9VbmF1dGhlbnRpY2F0ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdW5BdXRoZW50aWNhdGVkPSEwLHRoaXMucmVtb3ZlTGlzdGVuZXIoInZhbGlkYXRlIixuLkV2ZW50TGlzdGVuZXJzLkNvcmUuVkFMSURBVEVfQ1JFREVOVElBTFMpLHRoaXMucmVtb3ZlTGlzdGVuZXIoInNpZ24iLG4uRXZlbnRMaXN0ZW5lcnMuQ29yZS5TSUdOKSx0aGlzfSx0b0dldDpmdW5jdGlvbigpe3JldHVybiJxdWVyeSIhPT10aGlzLnNlcnZpY2UuYXBpLnByb3RvY29sJiYiZWMyIiE9PXRoaXMuc2VydmljZS5hcGkucHJvdG9jb2x8fCh0aGlzLnJlbW92ZUxpc3RlbmVyKCJidWlsZCIsdGhpcy5idWlsZEFzR2V0KSx0aGlzLmFkZExpc3RlbmVyKCJidWlsZCIsdGhpcy5idWlsZEFzR2V0KSksdGhpc30sYnVpbGRBc0dldDpmdW5jdGlvbihlKXtlLmh0dHBSZXF1ZXN0Lm1ldGhvZD0iR0VUIixlLmh0dHBSZXF1ZXN0LnBhdGg9ZS5zZXJ2aWNlLmVuZHBvaW50LnBhdGgrIj8iK2UuaHR0cFJlcXVlc3QuYm9keSxlLmh0dHBSZXF1ZXN0LmJvZHk9IiIsZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1MZW5ndGgiXSxkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LVR5cGUiXX0saGFsdEhhbmRsZXJzT25FcnJvcjpmdW5jdGlvbigpe3RoaXMuX2hhbHRIYW5kbGVyc09uRXJyb3I9ITB9fSksbi5SZXF1ZXN0LmFkZFByb21pc2VzVG9DbGFzcz1mdW5jdGlvbihlKXt0aGlzLnByb3RvdHlwZS5wcm9taXNlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5odHRwUmVxdWVzdC5hcHBlbmRUb1VzZXJBZ2VudCgicHJvbWlzZSIpLG5ldyBlKChmdW5jdGlvbihlLG4pe3Qub24oImNvbXBsZXRlIiwoZnVuY3Rpb24odCl7dC5lcnJvcj9uKHQuZXJyb3IpOmUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuZGF0YXx8e30sIiRyZXNwb25zZSIse3ZhbHVlOnR9KSl9KSksdC5ydW5UbygpfSkpfX0sbi5SZXF1ZXN0LmRlbGV0ZVByb21pc2VzRnJvbUNsYXNzPWZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMucHJvdG90eXBlLnByb21pc2V9LG4udXRpbC5hZGRQcm9taXNlcyhuLlJlcXVlc3QpLG4udXRpbC5taXhpbihuLlJlcXVlc3Qsbi5TZXF1ZW50aWFsRXhlY3V0b3IpfSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpKX0seyIuL2NvcmUiOjE5LCIuL3N0YXRlX21hY2hpbmUiOjczLF9wcm9jZXNzOjkxLGptZXNwYXRoOjkwfV0sNTk6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0LGk9ZSgiam1lc3BhdGgiKTtmdW5jdGlvbiBzKGUpe3ZhciB0PWUucmVxdWVzdC5fd2FpdGVyLG49dC5jb25maWcuYWNjZXB0b3JzLHI9ITEsbz0icmV0cnkiO24uZm9yRWFjaCgoZnVuY3Rpb24obil7aWYoIXIpe3ZhciBpPXQubWF0Y2hlcnNbbi5tYXRjaGVyXTtpJiZpKGUsbi5leHBlY3RlZCxuLmFyZ3VtZW50KSYmKHI9ITAsbz1uLnN0YXRlKX19KSksIXImJmUuZXJyb3ImJihvPSJmYWlsdXJlIiksInN1Y2Nlc3MiPT09bz90LnNldFN1Y2Nlc3MoZSk6dC5zZXRFcnJvcihlLCJyZXRyeSI9PT1vKX1yLlJlc291cmNlV2FpdGVyPW8oe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCl7dGhpcy5zZXJ2aWNlPWUsdGhpcy5zdGF0ZT10LHRoaXMubG9hZFdhaXRlckNvbmZpZyh0aGlzLnN0YXRlKX0sc2VydmljZTpudWxsLHN0YXRlOm51bGwsY29uZmlnOm51bGwsbWF0Y2hlcnM6e3BhdGg6ZnVuY3Rpb24oZSx0LG4pe3RyeXt2YXIgcj1pLnNlYXJjaChlLmRhdGEsbil9Y2F0Y2goZSl7cmV0dXJuITF9cmV0dXJuIGkuc3RyaWN0RGVlcEVxdWFsKHIsdCl9LHBhdGhBbGw6ZnVuY3Rpb24oZSx0LG4pe3RyeXt2YXIgcj1pLnNlYXJjaChlLmRhdGEsbil9Y2F0Y2goZSl7cmV0dXJuITF9QXJyYXkuaXNBcnJheShyKXx8KHI9W3JdKTt2YXIgbz1yLmxlbmd0aDtpZighbylyZXR1cm4hMTtmb3IodmFyIHM9MDtzPG87cysrKWlmKCFpLnN0cmljdERlZXBFcXVhbChyW3NdLHQpKXJldHVybiExO3JldHVybiEwfSxwYXRoQW55OmZ1bmN0aW9uKGUsdCxuKXt0cnl7dmFyIHI9aS5zZWFyY2goZS5kYXRhLG4pfWNhdGNoKGUpe3JldHVybiExfUFycmF5LmlzQXJyYXkocil8fChyPVtyXSk7Zm9yKHZhciBvPXIubGVuZ3RoLHM9MDtzPG87cysrKWlmKGkuc3RyaWN0RGVlcEVxdWFsKHJbc10sdCkpcmV0dXJuITA7cmV0dXJuITF9LHN0YXR1czpmdW5jdGlvbihlLHQpe3ZhciBuPWUuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGU7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBuJiZuPT09dH0sZXJyb3I6ZnVuY3Rpb24oZSx0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJmUuZXJyb3I/dD09PWUuZXJyb3IuY29kZTp0PT09ISFlLmVycm9yfX0sbGlzdGVuZXJzOihuZXcgci5TZXF1ZW50aWFsRXhlY3V0b3IpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbihlKXtlKCJSRVRSWV9DSEVDSyIsInJldHJ5IiwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXF1ZXN0Ll93YWl0ZXI7ZS5lcnJvciYmIlJlc291cmNlTm90UmVhZHkiPT09ZS5lcnJvci5jb2RlJiYoZS5lcnJvci5yZXRyeURlbGF5PTFlMyoodC5jb25maWcuZGVsYXl8fDApKX0pKSxlKCJDSEVDS19PVVRQVVQiLCJleHRyYWN0RGF0YSIscyksZSgiQ0hFQ0tfRVJST1IiLCJleHRyYWN0RXJyb3IiLHMpfSkpLHdhaXQ6ZnVuY3Rpb24oZSx0KXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksZSYmZS4kd2FpdGVyJiYoIm51bWJlciI9PXR5cGVvZihlPXIudXRpbC5jb3B5KGUpKS4kd2FpdGVyLmRlbGF5JiYodGhpcy5jb25maWcuZGVsYXk9ZS4kd2FpdGVyLmRlbGF5KSwibnVtYmVyIj09dHlwZW9mIGUuJHdhaXRlci5tYXhBdHRlbXB0cyYmKHRoaXMuY29uZmlnLm1heEF0dGVtcHRzPWUuJHdhaXRlci5tYXhBdHRlbXB0cyksZGVsZXRlIGUuJHdhaXRlcik7dmFyIG49dGhpcy5zZXJ2aWNlLm1ha2VSZXF1ZXN0KHRoaXMuY29uZmlnLm9wZXJhdGlvbixlKTtyZXR1cm4gbi5fd2FpdGVyPXRoaXMsbi5yZXNwb25zZS5tYXhSZXRyaWVzPXRoaXMuY29uZmlnLm1heEF0dGVtcHRzLG4uYWRkTGlzdGVuZXJzKHRoaXMubGlzdGVuZXJzKSx0JiZuLnNlbmQodCksbn0sc2V0U3VjY2VzczpmdW5jdGlvbihlKXtlLmVycm9yPW51bGwsZS5kYXRhPWUuZGF0YXx8e30sZS5yZXF1ZXN0LnJlbW92ZUFsbExpc3RlbmVycygiZXh0cmFjdERhdGEiKX0sc2V0RXJyb3I6ZnVuY3Rpb24oZSx0KXtlLmRhdGE9bnVsbCxlLmVycm9yPXIudXRpbC5lcnJvcihlLmVycm9yfHxuZXcgRXJyb3Ise2NvZGU6IlJlc291cmNlTm90UmVhZHkiLG1lc3NhZ2U6IlJlc291cmNlIGlzIG5vdCBpbiB0aGUgc3RhdGUgIit0aGlzLnN0YXRlLHJldHJ5YWJsZTp0fSl9LGxvYWRXYWl0ZXJDb25maWc6ZnVuY3Rpb24oZSl7aWYoIXRoaXMuc2VydmljZS5hcGkud2FpdGVyc1tlXSl0aHJvdyBuZXcgci51dGlsLmVycm9yKG5ldyBFcnJvcix7Y29kZToiU3RhdGVOb3RGb3VuZEVycm9yIixtZXNzYWdlOiJTdGF0ZSAiK2UrIiBub3QgZm91bmQuIn0pO3RoaXMuY29uZmlnPXIudXRpbC5jb3B5KHRoaXMuc2VydmljZS5hcGkud2FpdGVyc1tlXSl9fSl9LHsiLi9jb3JlIjoxOSxqbWVzcGF0aDo5MH1dLDYwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdCxpPWUoImptZXNwYXRoIik7ci5SZXNwb25zZT1vKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXt0aGlzLnJlcXVlc3Q9ZSx0aGlzLmRhdGE9bnVsbCx0aGlzLmVycm9yPW51bGwsdGhpcy5yZXRyeUNvdW50PTAsdGhpcy5yZWRpcmVjdENvdW50PTAsdGhpcy5odHRwUmVzcG9uc2U9bmV3IHIuSHR0cFJlc3BvbnNlLGUmJih0aGlzLm1heFJldHJpZXM9ZS5zZXJ2aWNlLm51bVJldHJpZXMoKSx0aGlzLm1heFJlZGlyZWN0cz1lLnNlcnZpY2UuY29uZmlnLm1heFJlZGlyZWN0cyl9LG5leHRQYWdlOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5yZXF1ZXN0LnNlcnZpY2Usbz10aGlzLnJlcXVlc3Qub3BlcmF0aW9uO3RyeXt0PW4ucGFnaW5hdGlvbkNvbmZpZyhvLCEwKX1jYXRjaChlKXt0aGlzLmVycm9yPWV9aWYoIXRoaXMuaGFzTmV4dFBhZ2UoKSl7aWYoZSllKHRoaXMuZXJyb3IsbnVsbCk7ZWxzZSBpZih0aGlzLmVycm9yKXRocm93IHRoaXMuZXJyb3I7cmV0dXJuIG51bGx9dmFyIGk9ci51dGlsLmNvcHkodGhpcy5yZXF1ZXN0LnBhcmFtcyk7aWYodGhpcy5uZXh0UGFnZVRva2Vucyl7dmFyIHM9dC5pbnB1dFRva2VuOyJzdHJpbmciPT10eXBlb2YgcyYmKHM9W3NdKTtmb3IodmFyIGE9MDthPHMubGVuZ3RoO2ErKylpW3NbYV1dPXRoaXMubmV4dFBhZ2VUb2tlbnNbYV07cmV0dXJuIG4ubWFrZVJlcXVlc3QodGhpcy5yZXF1ZXN0Lm9wZXJhdGlvbixpLGUpfXJldHVybiBlP2UobnVsbCxudWxsKTpudWxsfSxoYXNOZXh0UGFnZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNhY2hlTmV4dFBhZ2VUb2tlbnMoKSwhIXRoaXMubmV4dFBhZ2VUb2tlbnN8fHZvaWQgMD09PXRoaXMubmV4dFBhZ2VUb2tlbnMmJnZvaWQgMH0sY2FjaGVOZXh0UGFnZVRva2VuczpmdW5jdGlvbigpe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLCJuZXh0UGFnZVRva2VucyIpKXJldHVybiB0aGlzLm5leHRQYWdlVG9rZW5zO3RoaXMubmV4dFBhZ2VUb2tlbnM9dm9pZCAwO3ZhciBlPXRoaXMucmVxdWVzdC5zZXJ2aWNlLnBhZ2luYXRpb25Db25maWcodGhpcy5yZXF1ZXN0Lm9wZXJhdGlvbik7aWYoIWUpcmV0dXJuIHRoaXMubmV4dFBhZ2VUb2tlbnM7aWYodGhpcy5uZXh0UGFnZVRva2Vucz1udWxsLGUubW9yZVJlc3VsdHMmJiFpLnNlYXJjaCh0aGlzLmRhdGEsZS5tb3JlUmVzdWx0cykpcmV0dXJuIHRoaXMubmV4dFBhZ2VUb2tlbnM7dmFyIHQ9ZS5vdXRwdXRUb2tlbjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksci51dGlsLmFycmF5RWFjaC5jYWxsKHRoaXMsdCwoZnVuY3Rpb24oZSl7dmFyIHQ9aS5zZWFyY2godGhpcy5kYXRhLGUpO3QmJih0aGlzLm5leHRQYWdlVG9rZW5zPXRoaXMubmV4dFBhZ2VUb2tlbnN8fFtdLHRoaXMubmV4dFBhZ2VUb2tlbnMucHVzaCh0KSl9KSksdGhpcy5uZXh0UGFnZVRva2Vuc319KX0seyIuL2NvcmUiOjE5LGptZXNwYXRoOjkwfV0sNjE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvcmUiKTtyLlNlcXVlbnRpYWxFeGVjdXRvcj1yLnV0aWwuaW5oZXJpdCh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLl9ldmVudHM9e319LGxpc3RlbmVyczpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZXZlbnRzW2VdP3RoaXMuX2V2ZW50c1tlXS5zbGljZSgwKTpbXX0sb246ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLl9ldmVudHNbZV0/bj90aGlzLl9ldmVudHNbZV0udW5zaGlmdCh0KTp0aGlzLl9ldmVudHNbZV0ucHVzaCh0KTp0aGlzLl9ldmVudHNbZV09W3RdLHRoaXN9LG9uQXN5bmM6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0Ll9pc0FzeW5jPSEwLHRoaXMub24oZSx0LG4pfSxyZW1vdmVMaXN0ZW5lcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2V2ZW50c1tlXTtpZihuKXtmb3IodmFyIHI9bi5sZW5ndGgsbz0tMSxpPTA7aTxyOysraSluW2ldPT09dCYmKG89aSk7bz4tMSYmbi5zcGxpY2UobywxKX1yZXR1cm4gdGhpc30scmVtb3ZlQWxsTGlzdGVuZXJzOmZ1bmN0aW9uKGUpe3JldHVybiBlP2RlbGV0ZSB0aGlzLl9ldmVudHNbZV06dGhpcy5fZXZlbnRzPXt9LHRoaXN9LGVtaXQ6ZnVuY3Rpb24oZSx0LG4pe258fChuPWZ1bmN0aW9uKCl7fSk7dmFyIHI9dGhpcy5saXN0ZW5lcnMoZSksbz1yLmxlbmd0aDtyZXR1cm4gdGhpcy5jYWxsTGlzdGVuZXJzKHIsdCxuKSxvPjB9LGNhbGxMaXN0ZW5lcnM6ZnVuY3Rpb24oZSx0LG4sbyl7dmFyIGk9dGhpcyxzPW98fG51bGw7ZnVuY3Rpb24gYShvKXtpZihvJiYocz1yLnV0aWwuZXJyb3Ioc3x8bmV3IEVycm9yLG8pLGkuX2hhbHRIYW5kbGVyc09uRXJyb3IpKXJldHVybiBuLmNhbGwoaSxzKTtpLmNhbGxMaXN0ZW5lcnMoZSx0LG4scyl9Zm9yKDtlLmxlbmd0aD4wOyl7dmFyIGM9ZS5zaGlmdCgpO2lmKGMuX2lzQXN5bmMpcmV0dXJuIHZvaWQgYy5hcHBseShpLHQuY29uY2F0KFthXSkpO3RyeXtjLmFwcGx5KGksdCl9Y2F0Y2goZSl7cz1yLnV0aWwuZXJyb3Ioc3x8bmV3IEVycm9yLGUpfWlmKHMmJmkuX2hhbHRIYW5kbGVyc09uRXJyb3IpcmV0dXJuIHZvaWQgbi5jYWxsKGkscyl9bi5jYWxsKGkscyl9LGFkZExpc3RlbmVyczpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiBlLl9ldmVudHMmJihlPWUuX2V2ZW50cyksci51dGlsLmVhY2goZSwoZnVuY3Rpb24oZSxuKXsiZnVuY3Rpb24iPT10eXBlb2YgbiYmKG49W25dKSxyLnV0aWwuYXJyYXlFYWNoKG4sKGZ1bmN0aW9uKG4pe3Qub24oZSxuKX0pKX0pKSx0fSxhZGROYW1lZExpc3RlbmVyOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzW2VdPW4sdGhpcy5hZGRMaXN0ZW5lcih0LG4sciksdGhpc30sYWRkTmFtZWRBc3luY0xpc3RlbmVyOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBuLl9pc0FzeW5jPSEwLHRoaXMuYWRkTmFtZWRMaXN0ZW5lcihlLHQsbixyKX0sYWRkTmFtZWRMaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gZSgoZnVuY3Rpb24oKXt0LmFkZE5hbWVkTGlzdGVuZXIuYXBwbHkodCxhcmd1bWVudHMpfSksKGZ1bmN0aW9uKCl7dC5hZGROYW1lZEFzeW5jTGlzdGVuZXIuYXBwbHkodCxhcmd1bWVudHMpfSkpLHRoaXN9fSksci5TZXF1ZW50aWFsRXhlY3V0b3IucHJvdG90eXBlLmFkZExpc3RlbmVyPXIuU2VxdWVudGlhbEV4ZWN1dG9yLnByb3RvdHlwZS5vbix0LmV4cG9ydHM9ci5TZXF1ZW50aWFsRXhlY3V0b3J9LHsiLi9jb3JlIjoxOX1dLDYyOltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKG4peyhmdW5jdGlvbigpe3ZhciByPWUoIi4vY29yZSIpLG89ZSgiLi9tb2RlbC9hcGkiKSxpPWUoIi4vcmVnaW9uX2NvbmZpZyIpLHM9ci51dGlsLmluaGVyaXQsYT0wLGM9ZSgiLi9yZWdpb24vdXRpbHMiKTtyLlNlcnZpY2U9cyh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSl7aWYoIXRoaXMubG9hZFNlcnZpY2VDbGFzcyl0aHJvdyByLnV0aWwuZXJyb3IobmV3IEVycm9yLCJTZXJ2aWNlIG11c3QgYmUgY29uc3RydWN0ZWQgd2l0aCBgbmV3JyBvcGVyYXRvciIpO2lmKGUpe2lmKGUucmVnaW9uKXt2YXIgdD1lLnJlZ2lvbjtjLmlzRmlwc1JlZ2lvbih0KSYmKGUucmVnaW9uPWMuZ2V0UmVhbFJlZ2lvbih0KSxlLnVzZUZpcHNFbmRwb2ludD0hMCksYy5pc0dsb2JhbFJlZ2lvbih0KSYmKGUucmVnaW9uPWMuZ2V0UmVhbFJlZ2lvbih0KSl9ImJvb2xlYW4iPT10eXBlb2YgZS51c2VEdWFsc3RhY2smJiJib29sZWFuIiE9dHlwZW9mIGUudXNlRHVhbHN0YWNrRW5kcG9pbnQmJihlLnVzZUR1YWxzdGFja0VuZHBvaW50PWUudXNlRHVhbHN0YWNrKX12YXIgbj10aGlzLmxvYWRTZXJ2aWNlQ2xhc3MoZXx8e30pO2lmKG4pe3ZhciBvPXIudXRpbC5jb3B5KGUpLGk9bmV3IG4oZSk7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLCJfb3JpZ2luYWxDb25maWciLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb30sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxpLl9jbGllbnRJZD0rK2EsaX10aGlzLmluaXRpYWxpemUoZSl9LGluaXRpYWxpemU6ZnVuY3Rpb24oZSl7dmFyIHQ9ci5jb25maWdbdGhpcy5zZXJ2aWNlSWRlbnRpZmllcl07aWYodGhpcy5jb25maWc9bmV3IHIuQ29uZmlnKHIuY29uZmlnKSx0JiZ0aGlzLmNvbmZpZy51cGRhdGUodCwhMCksZSYmdGhpcy5jb25maWcudXBkYXRlKGUsITApLHRoaXMudmFsaWRhdGVTZXJ2aWNlKCksdGhpcy5jb25maWcuZW5kcG9pbnR8fGkuY29uZmlndXJlRW5kcG9pbnQodGhpcyksdGhpcy5jb25maWcuZW5kcG9pbnQ9dGhpcy5lbmRwb2ludEZyb21UZW1wbGF0ZSh0aGlzLmNvbmZpZy5lbmRwb2ludCksdGhpcy5zZXRFbmRwb2ludCh0aGlzLmNvbmZpZy5lbmRwb2ludCksci5TZXF1ZW50aWFsRXhlY3V0b3IuY2FsbCh0aGlzKSxyLlNlcnZpY2UuYWRkRGVmYXVsdE1vbml0b3JpbmdMaXN0ZW5lcnModGhpcyksKHRoaXMuY29uZmlnLmNsaWVudFNpZGVNb25pdG9yaW5nfHxyLlNlcnZpY2UuX2NsaWVudFNpZGVNb25pdG9yaW5nKSYmdGhpcy5wdWJsaXNoZXIpe3ZhciBvPXRoaXMucHVibGlzaGVyO3RoaXMuYWRkTmFtZWRMaXN0ZW5lcigiUFVCTElTSF9BUElfQ0FMTCIsImFwaUNhbGwiLChmdW5jdGlvbihlKXtuLm5leHRUaWNrKChmdW5jdGlvbigpe28uZXZlbnRIYW5kbGVyKGUpfSkpfSkpLHRoaXMuYWRkTmFtZWRMaXN0ZW5lcigiUFVCTElTSF9BUElfQVRURU1QVCIsImFwaUNhbGxBdHRlbXB0IiwoZnVuY3Rpb24oZSl7bi5uZXh0VGljaygoZnVuY3Rpb24oKXtvLmV2ZW50SGFuZGxlcihlKX0pKX0pKX19LHZhbGlkYXRlU2VydmljZTpmdW5jdGlvbigpe30sbG9hZFNlcnZpY2VDbGFzczpmdW5jdGlvbihlKXt2YXIgdD1lO2lmKHIudXRpbC5pc0VtcHR5KHRoaXMuYXBpKSl7aWYodC5hcGlDb25maWcpcmV0dXJuIHIuU2VydmljZS5kZWZpbmVTZXJ2aWNlQXBpKHRoaXMuY29uc3RydWN0b3IsdC5hcGlDb25maWcpO2lmKHRoaXMuY29uc3RydWN0b3Iuc2VydmljZXMpeyh0PW5ldyByLkNvbmZpZyhyLmNvbmZpZykpLnVwZGF0ZShlLCEwKTt2YXIgbj10LmFwaVZlcnNpb25zW3RoaXMuY29uc3RydWN0b3Iuc2VydmljZUlkZW50aWZpZXJdO3JldHVybiBuPW58fHQuYXBpVmVyc2lvbix0aGlzLmdldExhdGVzdFNlcnZpY2VDbGFzcyhuKX1yZXR1cm4gbnVsbH1yZXR1cm4gbnVsbH0sZ2V0TGF0ZXN0U2VydmljZUNsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiBlPXRoaXMuZ2V0TGF0ZXN0U2VydmljZVZlcnNpb24oZSksbnVsbD09PXRoaXMuY29uc3RydWN0b3Iuc2VydmljZXNbZV0mJnIuU2VydmljZS5kZWZpbmVTZXJ2aWNlQXBpKHRoaXMuY29uc3RydWN0b3IsZSksdGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlc1tlXX0sZ2V0TGF0ZXN0U2VydmljZVZlcnNpb246ZnVuY3Rpb24oZSl7aWYoIXRoaXMuY29uc3RydWN0b3Iuc2VydmljZXN8fDA9PT10aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIk5vIHNlcnZpY2VzIGRlZmluZWQgb24gIit0aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VJZGVudGlmaWVyKTtpZihlP3IudXRpbC5pc1R5cGUoZSxEYXRlKSYmKGU9ci51dGlsLmRhdGUuaXNvODYwMShlKS5zcGxpdCgiVCIpWzBdKTplPSJsYXRlc3QiLE9iamVjdC5oYXNPd25Qcm9wZXJ0eSh0aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VzLGUpKXJldHVybiBlO2Zvcih2YXIgdD1PYmplY3Qua2V5cyh0aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VzKS5zb3J0KCksbj1udWxsLG89dC5sZW5ndGgtMTtvPj0wO28tLSlpZigiKiIhPT10W29dW3Rbb10ubGVuZ3RoLTFdJiYobj10W29dKSx0W29dLnN1YnN0cigwLDEwKTw9ZSlyZXR1cm4gbjt0aHJvdyBuZXcgRXJyb3IoIkNvdWxkIG5vdCBmaW5kICIrdGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlSWRlbnRpZmllcisiIEFQSSB0byBzYXRpc2Z5IHZlcnNpb24gY29uc3RyYWludCBgIitlKyInIil9LGFwaTp7fSxkZWZhdWx0UmV0cnlDb3VudDozLGN1c3RvbWl6ZVJlcXVlc3RzOmZ1bmN0aW9uKGUpe2lmKGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjYWxsYmFjayB0eXBlICciK3R5cGVvZiBlKyInIHByb3ZpZGVkIGluIGN1c3RvbWl6ZVJlcXVlc3RzIik7dGhpcy5jdXN0b21SZXF1ZXN0SGFuZGxlcj1lfWVsc2UgdGhpcy5jdXN0b21SZXF1ZXN0SGFuZGxlcj1udWxsfSxtYWtlUmVxdWVzdDpmdW5jdGlvbihlLHQsbil7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJihuPXQsdD1udWxsKSx0PXR8fHt9LHRoaXMuY29uZmlnLnBhcmFtcyl7dmFyIG89dGhpcy5hcGkub3BlcmF0aW9uc1tlXTtvJiYodD1yLnV0aWwuY29weSh0KSxyLnV0aWwuZWFjaCh0aGlzLmNvbmZpZy5wYXJhbXMsKGZ1bmN0aW9uKGUsbil7by5pbnB1dC5tZW1iZXJzW2VdJiYodm9pZCAwIT09dFtlXSYmbnVsbCE9PXRbZV18fCh0W2VdPW4pKX0pKSl9dmFyIGk9bmV3IHIuUmVxdWVzdCh0aGlzLGUsdCk7cmV0dXJuIHRoaXMuYWRkQWxsUmVxdWVzdExpc3RlbmVycyhpKSx0aGlzLmF0dGFjaE1vbml0b3JpbmdFbWl0dGVyKGkpLG4mJmkuc2VuZChuKSxpfSxtYWtlVW5hdXRoZW50aWNhdGVkUmVxdWVzdDpmdW5jdGlvbihlLHQsbil7ImZ1bmN0aW9uIj09dHlwZW9mIHQmJihuPXQsdD17fSk7dmFyIHI9dGhpcy5tYWtlUmVxdWVzdChlLHQpLnRvVW5hdXRoZW50aWNhdGVkKCk7cmV0dXJuIG4/ci5zZW5kKG4pOnJ9LHdhaXRGb3I6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuZXcgci5SZXNvdXJjZVdhaXRlcih0aGlzLGUpLndhaXQodCxuKX0sYWRkQWxsUmVxdWVzdExpc3RlbmVyczpmdW5jdGlvbihlKXtmb3IodmFyIHQ9W3IuZXZlbnRzLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZSx0aGlzLnNlcnZpY2VJbnRlcmZhY2UoKSxyLkV2ZW50TGlzdGVuZXJzLkNvcmVQb3N0XSxuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXSYmZS5hZGRMaXN0ZW5lcnModFtuXSk7dGhpcy5jb25maWcucGFyYW1WYWxpZGF0aW9ufHxlLnJlbW92ZUxpc3RlbmVyKCJ2YWxpZGF0ZSIsci5FdmVudExpc3RlbmVycy5Db3JlLlZBTElEQVRFX1BBUkFNRVRFUlMpLHRoaXMuY29uZmlnLmxvZ2dlciYmZS5hZGRMaXN0ZW5lcnMoci5FdmVudExpc3RlbmVycy5Mb2dnZXIpLHRoaXMuc2V0dXBSZXF1ZXN0TGlzdGVuZXJzKGUpLCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jdXN0b21SZXF1ZXN0SGFuZGxlciYmdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY3VzdG9tUmVxdWVzdEhhbmRsZXIoZSksT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsImN1c3RvbVJlcXVlc3RIYW5kbGVyIikmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmN1c3RvbVJlcXVlc3RIYW5kbGVyJiZ0aGlzLmN1c3RvbVJlcXVlc3RIYW5kbGVyKGUpfSxhcGlDYWxsRXZlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXSxuPXtUeXBlOiJBcGlDYWxsIixBcGk6dD90Lm5hbWU6ZS5vcGVyYXRpb24sVmVyc2lvbjoxLFNlcnZpY2U6ZS5zZXJ2aWNlLmFwaS5zZXJ2aWNlSWR8fGUuc2VydmljZS5hcGkuZW5kcG9pbnRQcmVmaXgsUmVnaW9uOmUuaHR0cFJlcXVlc3QucmVnaW9uLE1heFJldHJpZXNFeGNlZWRlZDowLFVzZXJBZ2VudDplLmh0dHBSZXF1ZXN0LmdldFVzZXJBZ2VudCgpfSxyPWUucmVzcG9uc2U7aWYoci5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSYmKG4uRmluYWxIdHRwU3RhdHVzQ29kZT1yLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlKSxyLmVycm9yKXt2YXIgbz1yLmVycm9yO3IuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGU+Mjk5PyhvLmNvZGUmJihuLkZpbmFsQXdzRXhjZXB0aW9uPW8uY29kZSksby5tZXNzYWdlJiYobi5GaW5hbEF3c0V4Y2VwdGlvbk1lc3NhZ2U9by5tZXNzYWdlKSk6KChvLmNvZGV8fG8ubmFtZSkmJihuLkZpbmFsU2RrRXhjZXB0aW9uPW8uY29kZXx8by5uYW1lKSxvLm1lc3NhZ2UmJihuLkZpbmFsU2RrRXhjZXB0aW9uTWVzc2FnZT1vLm1lc3NhZ2UpKX1yZXR1cm4gbn0sYXBpQXR0ZW1wdEV2ZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0sbj17VHlwZToiQXBpQ2FsbEF0dGVtcHQiLEFwaTp0P3QubmFtZTplLm9wZXJhdGlvbixWZXJzaW9uOjEsU2VydmljZTplLnNlcnZpY2UuYXBpLnNlcnZpY2VJZHx8ZS5zZXJ2aWNlLmFwaS5lbmRwb2ludFByZWZpeCxGcWRuOmUuaHR0cFJlcXVlc3QuZW5kcG9pbnQuaG9zdG5hbWUsVXNlckFnZW50OmUuaHR0cFJlcXVlc3QuZ2V0VXNlckFnZW50KCl9LHI9ZS5yZXNwb25zZTtyZXR1cm4gci5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSYmKG4uSHR0cFN0YXR1c0NvZGU9ci5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSksIWUuX3VuQXV0aGVudGljYXRlZCYmZS5zZXJ2aWNlLmNvbmZpZy5jcmVkZW50aWFscyYmZS5zZXJ2aWNlLmNvbmZpZy5jcmVkZW50aWFscy5hY2Nlc3NLZXlJZCYmKG4uQWNjZXNzS2V5PWUuc2VydmljZS5jb25maWcuY3JlZGVudGlhbHMuYWNjZXNzS2V5SWQpLHIuaHR0cFJlc3BvbnNlLmhlYWRlcnM/KGUuaHR0cFJlcXVlc3QuaGVhZGVyc1sieC1hbXotc2VjdXJpdHktdG9rZW4iXSYmKG4uU2Vzc2lvblRva2VuPWUuaHR0cFJlcXVlc3QuaGVhZGVyc1sieC1hbXotc2VjdXJpdHktdG9rZW4iXSksci5odHRwUmVzcG9uc2UuaGVhZGVyc1sieC1hbXpuLXJlcXVlc3RpZCJdJiYobi5YQW16blJlcXVlc3RJZD1yLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtem4tcmVxdWVzdGlkIl0pLHIuaHR0cFJlc3BvbnNlLmhlYWRlcnNbIngtYW16LXJlcXVlc3QtaWQiXSYmKG4uWEFtelJlcXVlc3RJZD1yLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtei1yZXF1ZXN0LWlkIl0pLHIuaHR0cFJlc3BvbnNlLmhlYWRlcnNbIngtYW16LWlkLTIiXSYmKG4uWEFteklkMj1yLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtei1pZC0yIl0pLG4pOm59LGF0dGVtcHRGYWlsRXZlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5hcGlBdHRlbXB0RXZlbnQoZSksbj1lLnJlc3BvbnNlLHI9bi5lcnJvcjtyZXR1cm4gbi5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZT4yOTk/KHIuY29kZSYmKHQuQXdzRXhjZXB0aW9uPXIuY29kZSksci5tZXNzYWdlJiYodC5Bd3NFeGNlcHRpb25NZXNzYWdlPXIubWVzc2FnZSkpOigoci5jb2RlfHxyLm5hbWUpJiYodC5TZGtFeGNlcHRpb249ci5jb2RlfHxyLm5hbWUpLHIubWVzc2FnZSYmKHQuU2RrRXhjZXB0aW9uTWVzc2FnZT1yLm1lc3NhZ2UpKSx0fSxhdHRhY2hNb25pdG9yaW5nRW1pdHRlcjpmdW5jdGlvbihlKXt2YXIgdCxuLG8saSxzLGEsYz0wLHU9dGhpcztlLm9uKCJ2YWxpZGF0ZSIsKGZ1bmN0aW9uKCl7aT1yLnV0aWwucmVhbENsb2NrLm5vdygpLGE9RGF0ZS5ub3coKX0pLCEwKSxlLm9uKCJzaWduIiwoZnVuY3Rpb24oKXtuPXIudXRpbC5yZWFsQ2xvY2subm93KCksdD1EYXRlLm5vdygpLHM9ZS5odHRwUmVxdWVzdC5yZWdpb24sYysrfSksITApLGUub24oInZhbGlkYXRlUmVzcG9uc2UiLChmdW5jdGlvbigpe289TWF0aC5yb3VuZChyLnV0aWwucmVhbENsb2NrLm5vdygpLW4pfSkpLGUuYWRkTmFtZWRMaXN0ZW5lcigiQVBJX0NBTExfQVRURU1QVCIsInN1Y2Nlc3MiLChmdW5jdGlvbigpe3ZhciBuPXUuYXBpQXR0ZW1wdEV2ZW50KGUpO24uVGltZXN0YW1wPXQsbi5BdHRlbXB0TGF0ZW5jeT1vPj0wP286MCxuLlJlZ2lvbj1zLHUuZW1pdCgiYXBpQ2FsbEF0dGVtcHQiLFtuXSl9KSksZS5hZGROYW1lZExpc3RlbmVyKCJBUElfQ0FMTF9BVFRFTVBUX1JFVFJZIiwicmV0cnkiLChmdW5jdGlvbigpe3ZhciBpPXUuYXR0ZW1wdEZhaWxFdmVudChlKTtpLlRpbWVzdGFtcD10LG89b3x8TWF0aC5yb3VuZChyLnV0aWwucmVhbENsb2NrLm5vdygpLW4pLGkuQXR0ZW1wdExhdGVuY3k9bz49MD9vOjAsaS5SZWdpb249cyx1LmVtaXQoImFwaUNhbGxBdHRlbXB0IixbaV0pfSkpLGUuYWRkTmFtZWRMaXN0ZW5lcigiQVBJX0NBTEwiLCJjb21wbGV0ZSIsKGZ1bmN0aW9uKCl7dmFyIHQ9dS5hcGlDYWxsRXZlbnQoZSk7aWYodC5BdHRlbXB0Q291bnQ9YywhKHQuQXR0ZW1wdENvdW50PD0wKSl7dC5UaW1lc3RhbXA9YTt2YXIgbj1NYXRoLnJvdW5kKHIudXRpbC5yZWFsQ2xvY2subm93KCktaSk7dC5MYXRlbmN5PW4+PTA/bjowO3ZhciBvPWUucmVzcG9uc2U7by5lcnJvciYmby5lcnJvci5yZXRyeWFibGUmJiJudW1iZXIiPT10eXBlb2Ygby5yZXRyeUNvdW50JiYibnVtYmVyIj09dHlwZW9mIG8ubWF4UmV0cmllcyYmby5yZXRyeUNvdW50Pj1vLm1heFJldHJpZXMmJih0Lk1heFJldHJpZXNFeGNlZWRlZD0xKSx1LmVtaXQoImFwaUNhbGwiLFt0XSl9fSkpfSxzZXR1cFJlcXVlc3RMaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7fSxnZXRTaWduaW5nTmFtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFwaS5zaWduaW5nTmFtZXx8dGhpcy5hcGkuZW5kcG9pbnRQcmVmaXh9LGdldFNpZ25lckNsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG49bnVsbCxvPSIiO3JldHVybiBlJiYobz0obj0oZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zfHx7fSlbZS5vcGVyYXRpb25dfHxudWxsKT9uLmF1dGh0eXBlOiIiKSx0PXRoaXMuY29uZmlnLnNpZ25hdHVyZVZlcnNpb24/dGhpcy5jb25maWcuc2lnbmF0dXJlVmVyc2lvbjoidjQiPT09b3x8InY0LXVuc2lnbmVkLWJvZHkiPT09bz8idjQiOiJiZWFyZXIiPT09bz8iYmVhcmVyIjp0aGlzLmFwaS5zaWduYXR1cmVWZXJzaW9uLHIuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLmdldFZlcnNpb24odCl9LHNlcnZpY2VJbnRlcmZhY2U6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5hcGkucHJvdG9jb2wpe2Nhc2UiZWMyIjpjYXNlInF1ZXJ5IjpyZXR1cm4gci5FdmVudExpc3RlbmVycy5RdWVyeTtjYXNlImpzb24iOnJldHVybiByLkV2ZW50TGlzdGVuZXJzLkpzb247Y2FzZSJyZXN0LWpzb24iOnJldHVybiByLkV2ZW50TGlzdGVuZXJzLlJlc3RKc29uO2Nhc2UicmVzdC14bWwiOnJldHVybiByLkV2ZW50TGlzdGVuZXJzLlJlc3RYbWx9aWYodGhpcy5hcGkucHJvdG9jb2wpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHNlcnZpY2UgYHByb3RvY29sJyAiK3RoaXMuYXBpLnByb3RvY29sKyIgaW4gQVBJIGNvbmZpZyIpfSxzdWNjZXNzZnVsUmVzcG9uc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGU8MzAwfSxudW1SZXRyaWVzOmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuY29uZmlnLm1heFJldHJpZXM/dGhpcy5jb25maWcubWF4UmV0cmllczp0aGlzLmRlZmF1bHRSZXRyeUNvdW50fSxyZXRyeURlbGF5czpmdW5jdGlvbihlLHQpe3JldHVybiByLnV0aWwuY2FsY3VsYXRlUmV0cnlEZWxheShlLHRoaXMuY29uZmlnLnJldHJ5RGVsYXlPcHRpb25zLHQpfSxyZXRyeWFibGVFcnJvcjpmdW5jdGlvbihlKXtyZXR1cm4hIXRoaXMudGltZW91dEVycm9yKGUpfHwhIXRoaXMubmV0d29ya2luZ0Vycm9yKGUpfHwhIXRoaXMuZXhwaXJlZENyZWRlbnRpYWxzRXJyb3IoZSl8fCEhdGhpcy50aHJvdHRsZWRFcnJvcihlKXx8ZS5zdGF0dXNDb2RlPj01MDB9LG5ldHdvcmtpbmdFcnJvcjpmdW5jdGlvbihlKXtyZXR1cm4iTmV0d29ya2luZ0Vycm9yIj09PWUuY29kZX0sdGltZW91dEVycm9yOmZ1bmN0aW9uKGUpe3JldHVybiJUaW1lb3V0RXJyb3IiPT09ZS5jb2RlfSxleHBpcmVkQ3JlZGVudGlhbHNFcnJvcjpmdW5jdGlvbihlKXtyZXR1cm4iRXhwaXJlZFRva2VuRXhjZXB0aW9uIj09PWUuY29kZX0sY2xvY2tTa2V3RXJyb3I6ZnVuY3Rpb24oZSl7c3dpdGNoKGUuY29kZSl7Y2FzZSJSZXF1ZXN0VGltZVRvb1NrZXdlZCI6Y2FzZSJSZXF1ZXN0RXhwaXJlZCI6Y2FzZSJJbnZhbGlkU2lnbmF0dXJlRXhjZXB0aW9uIjpjYXNlIlNpZ25hdHVyZURvZXNOb3RNYXRjaCI6Y2FzZSJBdXRoRmFpbHVyZSI6Y2FzZSJSZXF1ZXN0SW5UaGVGdXR1cmUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxnZXRTa2V3Q29ycmVjdGVkRGF0ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgRGF0ZShEYXRlLm5vdygpK3RoaXMuY29uZmlnLnN5c3RlbUNsb2NrT2Zmc2V0KX0sYXBwbHlDbG9ja09mZnNldDpmdW5jdGlvbihlKXtlJiYodGhpcy5jb25maWcuc3lzdGVtQ2xvY2tPZmZzZXQ9ZS1EYXRlLm5vdygpKX0saXNDbG9ja1NrZXdlZDpmdW5jdGlvbihlKXtpZihlKXJldHVybiBNYXRoLmFicyh0aGlzLmdldFNrZXdDb3JyZWN0ZWREYXRlKCkuZ2V0VGltZSgpLWUpPj0zZTV9LHRocm90dGxlZEVycm9yOmZ1bmN0aW9uKGUpe2lmKDQyOT09PWUuc3RhdHVzQ29kZSlyZXR1cm4hMDtzd2l0Y2goZS5jb2RlKXtjYXNlIlByb3Zpc2lvbmVkVGhyb3VnaHB1dEV4Y2VlZGVkRXhjZXB0aW9uIjpjYXNlIlRocm90dGxpbmciOmNhc2UiVGhyb3R0bGluZ0V4Y2VwdGlvbiI6Y2FzZSJSZXF1ZXN0TGltaXRFeGNlZWRlZCI6Y2FzZSJSZXF1ZXN0VGhyb3R0bGVkIjpjYXNlIlJlcXVlc3RUaHJvdHRsZWRFeGNlcHRpb24iOmNhc2UiVG9vTWFueVJlcXVlc3RzRXhjZXB0aW9uIjpjYXNlIlRyYW5zYWN0aW9uSW5Qcm9ncmVzc0V4Y2VwdGlvbiI6Y2FzZSJFQzJUaHJvdHRsZWRFeGNlcHRpb24iOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxlbmRwb2ludEZyb21UZW1wbGF0ZTpmdW5jdGlvbihlKXtpZigic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIGU7dmFyIHQ9ZTtyZXR1cm4gdD0odD0odD10LnJlcGxhY2UoL1x7c2VydmljZVx9L2csdGhpcy5hcGkuZW5kcG9pbnRQcmVmaXgpKS5yZXBsYWNlKC9ce3JlZ2lvblx9L2csdGhpcy5jb25maWcucmVnaW9uKSkucmVwbGFjZSgvXHtzY2hlbWVcfS9nLHRoaXMuY29uZmlnLnNzbEVuYWJsZWQ/Imh0dHBzIjoiaHR0cCIpfSxzZXRFbmRwb2ludDpmdW5jdGlvbihlKXt0aGlzLmVuZHBvaW50PW5ldyByLkVuZHBvaW50KGUsdGhpcy5jb25maWcpfSxwYWdpbmF0aW9uQ29uZmlnOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5hcGkub3BlcmF0aW9uc1tlXS5wYWdpbmF0b3I7aWYoIW4pe2lmKHQpe3ZhciBvPW5ldyBFcnJvcjt0aHJvdyByLnV0aWwuZXJyb3IobywiTm8gcGFnaW5hdGlvbiBjb25maWd1cmF0aW9uIGZvciAiK2UpfXJldHVybiBudWxsfXJldHVybiBufX0pLHIudXRpbC51cGRhdGUoci5TZXJ2aWNlLHtkZWZpbmVNZXRob2RzOmZ1bmN0aW9uKGUpe3IudXRpbC5lYWNoKGUucHJvdG90eXBlLmFwaS5vcGVyYXRpb25zLChmdW5jdGlvbih0KXtlLnByb3RvdHlwZVt0XXx8KCJub25lIj09PWUucHJvdG90eXBlLmFwaS5vcGVyYXRpb25zW3RdLmF1dGh0eXBlP2UucHJvdG90eXBlW3RdPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHRoaXMubWFrZVVuYXV0aGVudGljYXRlZFJlcXVlc3QodCxlLG4pfTplLnByb3RvdHlwZVt0XT1mdW5jdGlvbihlLG4pe3JldHVybiB0aGlzLm1ha2VSZXF1ZXN0KHQsZSxuKX0pfSkpfSxkZWZpbmVTZXJ2aWNlOmZ1bmN0aW9uKGUsdCxuKXtyLlNlcnZpY2UuX3NlcnZpY2VNYXBbZV09ITAsQXJyYXkuaXNBcnJheSh0KXx8KG49dCx0PVtdKTt2YXIgbz1zKHIuU2VydmljZSxufHx7fSk7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtyLlNlcnZpY2UuYWRkVmVyc2lvbnMobyx0KTt2YXIgaT1vLnNlcnZpY2VJZGVudGlmaWVyfHxlO28uc2VydmljZUlkZW50aWZpZXI9aX1lbHNlIG8ucHJvdG90eXBlLmFwaT1lLHIuU2VydmljZS5kZWZpbmVNZXRob2RzKG8pO2lmKHIuU2VxdWVudGlhbEV4ZWN1dG9yLmNhbGwodGhpcy5wcm90b3R5cGUpLCF0aGlzLnByb3RvdHlwZS5wdWJsaXNoZXImJnIudXRpbC5jbGllbnRTaWRlTW9uaXRvcmluZyl7dmFyIGE9ci51dGlsLmNsaWVudFNpZGVNb25pdG9yaW5nLlB1Ymxpc2hlcixjPSgwLHIudXRpbC5jbGllbnRTaWRlTW9uaXRvcmluZy5jb25maWdQcm92aWRlcikoKTt0aGlzLnByb3RvdHlwZS5wdWJsaXNoZXI9bmV3IGEoYyksYy5lbmFibGVkJiYoci5TZXJ2aWNlLl9jbGllbnRTaWRlTW9uaXRvcmluZz0hMCl9cmV0dXJuIHIuU2VxdWVudGlhbEV4ZWN1dG9yLmNhbGwoby5wcm90b3R5cGUpLHIuU2VydmljZS5hZGREZWZhdWx0TW9uaXRvcmluZ0xpc3RlbmVycyhvLnByb3RvdHlwZSksb30sYWRkVmVyc2lvbnM6ZnVuY3Rpb24oZSx0KXtBcnJheS5pc0FycmF5KHQpfHwodD1bdF0pLGUuc2VydmljZXM9ZS5zZXJ2aWNlc3x8e307Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspdm9pZCAwPT09ZS5zZXJ2aWNlc1t0W25dXSYmKGUuc2VydmljZXNbdFtuXV09bnVsbCk7ZS5hcGlWZXJzaW9ucz1PYmplY3Qua2V5cyhlLnNlcnZpY2VzKS5zb3J0KCl9LGRlZmluZVNlcnZpY2VBcGk6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXMoZSx7c2VydmljZUlkZW50aWZpZXI6ZS5zZXJ2aWNlSWRlbnRpZmllcn0pO2Z1bmN0aW9uIGEodCl7dC5pc0FwaT9pLnByb3RvdHlwZS5hcGk9dDppLnByb3RvdHlwZS5hcGk9bmV3IG8odCx7c2VydmljZUlkZW50aWZpZXI6ZS5zZXJ2aWNlSWRlbnRpZmllcn0pfWlmKCJzdHJpbmciPT10eXBlb2YgdCl7aWYobilhKG4pO2Vsc2UgdHJ5e2Eoci5hcGlMb2FkZXIoZS5zZXJ2aWNlSWRlbnRpZmllcix0KSl9Y2F0Y2gobil7dGhyb3cgci51dGlsLmVycm9yKG4se21lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIEFQSSBjb25maWd1cmF0aW9uICIrZS5zZXJ2aWNlSWRlbnRpZmllcisiLSIrdH0pfU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLnNlcnZpY2VzLHQpfHwoZS5hcGlWZXJzaW9ucz1lLmFwaVZlcnNpb25zLmNvbmNhdCh0KS5zb3J0KCkpLGUuc2VydmljZXNbdF09aX1lbHNlIGEodCk7cmV0dXJuIHIuU2VydmljZS5kZWZpbmVNZXRob2RzKGkpLGl9LGhhc1NlcnZpY2U6ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLlNlcnZpY2UuX3NlcnZpY2VNYXAsZSl9LGFkZERlZmF1bHRNb25pdG9yaW5nTGlzdGVuZXJzOmZ1bmN0aW9uKGUpe2UuYWRkTmFtZWRMaXN0ZW5lcigiTU9OSVRPUl9FVkVOVFNfQlVCQkxFIiwiYXBpQ2FsbEF0dGVtcHQiLChmdW5jdGlvbih0KXt2YXIgbj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7bi5fZXZlbnRzJiZuLmVtaXQoImFwaUNhbGxBdHRlbXB0IixbdF0pfSkpLGUuYWRkTmFtZWRMaXN0ZW5lcigiQ0FMTF9FVkVOVFNfQlVCQkxFIiwiYXBpQ2FsbCIsKGZ1bmN0aW9uKHQpe3ZhciBuPU9iamVjdC5nZXRQcm90b3R5cGVPZihlKTtuLl9ldmVudHMmJm4uZW1pdCgiYXBpQ2FsbCIsW3RdKX0pKX0sX3NlcnZpY2VNYXA6e319KSxyLnV0aWwubWl4aW4oci5TZXJ2aWNlLHIuU2VxdWVudGlhbEV4ZWN1dG9yKSx0LmV4cG9ydHM9ci5TZXJ2aWNlfSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpKX0seyIuL2NvcmUiOjE5LCIuL21vZGVsL2FwaSI6NDAsIi4vcmVnaW9uL3V0aWxzIjo1NSwiLi9yZWdpb25fY29uZmlnIjo1NixfcHJvY2Vzczo5MX1dLDYzOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiLi4vY29uZmlnX3JlZ2lvbmFsX2VuZHBvaW50Iik7ci51dGlsLnVwZGF0ZShyLlNUUy5wcm90b3R5cGUse2NyZWRlbnRpYWxzRnJvbTpmdW5jdGlvbihlLHQpe3JldHVybiBlPyh0fHwodD1uZXcgci5UZW1wb3JhcnlDcmVkZW50aWFscyksdC5leHBpcmVkPSExLHQuYWNjZXNzS2V5SWQ9ZS5DcmVkZW50aWFscy5BY2Nlc3NLZXlJZCx0LnNlY3JldEFjY2Vzc0tleT1lLkNyZWRlbnRpYWxzLlNlY3JldEFjY2Vzc0tleSx0LnNlc3Npb25Ub2tlbj1lLkNyZWRlbnRpYWxzLlNlc3Npb25Ub2tlbix0LmV4cGlyZVRpbWU9ZS5DcmVkZW50aWFscy5FeHBpcmF0aW9uLHQpOm51bGx9LGFzc3VtZVJvbGVXaXRoV2ViSWRlbnRpdHk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5tYWtlVW5hdXRoZW50aWNhdGVkUmVxdWVzdCgiYXNzdW1lUm9sZVdpdGhXZWJJZGVudGl0eSIsZSx0KX0sYXNzdW1lUm9sZVdpdGhTQU1MOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubWFrZVVuYXV0aGVudGljYXRlZFJlcXVlc3QoImFzc3VtZVJvbGVXaXRoU0FNTCIsZSx0KX0sc2V0dXBSZXF1ZXN0TGlzdGVuZXJzOmZ1bmN0aW9uKGUpe2UuYWRkTGlzdGVuZXIoInZhbGlkYXRlIix0aGlzLm9wdEluUmVnaW9uYWxFbmRwb2ludCwhMCl9LG9wdEluUmVnaW9uYWxFbmRwb2ludDpmdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2Usbj10LmNvbmZpZztpZihuLnN0c1JlZ2lvbmFsRW5kcG9pbnRzPW8odC5fb3JpZ2luYWxDb25maWcse2VudjoiQVdTX1NUU19SRUdJT05BTF9FTkRQT0lOVFMiLHNoYXJlZENvbmZpZzoic3RzX3JlZ2lvbmFsX2VuZHBvaW50cyIsY2xpZW50Q29uZmlnOiJzdHNSZWdpb25hbEVuZHBvaW50cyJ9KSwicmVnaW9uYWwiPT09bi5zdHNSZWdpb25hbEVuZHBvaW50cyYmdC5pc0dsb2JhbEVuZHBvaW50KXtpZighbi5yZWdpb24pdGhyb3cgci51dGlsLmVycm9yKG5ldyBFcnJvcix7Y29kZToiQ29uZmlnRXJyb3IiLG1lc3NhZ2U6Ik1pc3NpbmcgcmVnaW9uIGluIGNvbmZpZyJ9KTt2YXIgaT1uLmVuZHBvaW50LmluZGV4T2YoIi5hbWF6b25hd3MuY29tIikscz1uLmVuZHBvaW50LnN1YnN0cmluZygwLGkpKyIuIituLnJlZ2lvbituLmVuZHBvaW50LnN1YnN0cmluZyhpKTtlLmh0dHBSZXF1ZXN0LnVwZGF0ZUVuZHBvaW50KHMpLGUuaHR0cFJlcXVlc3QucmVnaW9uPW4ucmVnaW9ufX19KX0seyIuLi9jb25maWdfcmVnaW9uYWxfZW5kcG9pbnQiOjE4LCIuLi9jb3JlIjoxOX1dLDY0OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpO3IuU2lnbmVycy5CZWFyZXI9ci51dGlsLmluaGVyaXQoci5TaWduZXJzLlJlcXVlc3RTaWduZXIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3IuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLmNhbGwodGhpcyxlKX0sYWRkQXV0aG9yaXphdGlvbjpmdW5jdGlvbihlKXt0aGlzLnJlcXVlc3QuaGVhZGVycy5BdXRob3JpemF0aW9uPSJCZWFyZXIgIitlLnRva2VufX0pfSx7Ii4uL2NvcmUiOjE5fV0sNjU6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdCxpPSJwcmVzaWduZWQtZXhwaXJlcyI7ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLmh0dHBSZXF1ZXN0LmhlYWRlcnNbaV0sbj1lLnNlcnZpY2UuZ2V0U2lnbmVyQ2xhc3MoZSk7aWYoZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVyc1siVXNlci1BZ2VudCJdLGRlbGV0ZSBlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIlgtQW16LVVzZXItQWdlbnQiXSxuPT09ci5TaWduZXJzLlY0KXtpZih0PjYwNDgwMCl0aHJvdyByLnV0aWwuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJJbnZhbGlkRXhwaXJ5VGltZSIsbWVzc2FnZToiUHJlc2lnbmluZyBkb2VzIG5vdCBzdXBwb3J0IGV4cGlyeSB0aW1lIGdyZWF0ZXIgdGhhbiBhIHdlZWsgd2l0aCBTaWdWNCBzaWduaW5nLiIscmV0cnlhYmxlOiExfSk7ZS5odHRwUmVxdWVzdC5oZWFkZXJzW2ldPXR9ZWxzZXtpZihuIT09ci5TaWduZXJzLlMzKXRocm93IHIudXRpbC5lcnJvcihuZXcgRXJyb3Ise21lc3NhZ2U6IlByZXNpZ25pbmcgb25seSBzdXBwb3J0cyBTMyBvciBTaWdWNCBzaWduaW5nLiIsY29kZToiVW5zdXBwb3J0ZWRTaWduZXIiLHJldHJ5YWJsZTohMX0pO3ZhciBvPWUuc2VydmljZT9lLnNlcnZpY2UuZ2V0U2tld0NvcnJlY3RlZERhdGUoKTpyLnV0aWwuZGF0ZS5nZXREYXRlKCk7ZS5odHRwUmVxdWVzdC5oZWFkZXJzW2ldPXBhcnNlSW50KHIudXRpbC5kYXRlLnVuaXhUaW1lc3RhbXAobykrdCwxMCkudG9TdHJpbmcoKX19ZnVuY3Rpb24gYShlKXt2YXIgdD1lLmh0dHBSZXF1ZXN0LmVuZHBvaW50LG49ci51dGlsLnVybFBhcnNlKGUuaHR0cFJlcXVlc3QucGF0aCksbz17fTtuLnNlYXJjaCYmKG89ci51dGlsLnF1ZXJ5U3RyaW5nUGFyc2Uobi5zZWFyY2guc3Vic3RyKDEpKSk7dmFyIHM9ZS5odHRwUmVxdWVzdC5oZWFkZXJzLkF1dGhvcml6YXRpb24uc3BsaXQoIiAiKTtpZigiQVdTIj09PXNbMF0pcz1zWzFdLnNwbGl0KCI6Iiksby5TaWduYXR1cmU9cy5wb3AoKSxvLkFXU0FjY2Vzc0tleUlkPXMuam9pbigiOiIpLHIudXRpbC5lYWNoKGUuaHR0cFJlcXVlc3QuaGVhZGVycywoZnVuY3Rpb24oZSx0KXtlPT09aSYmKGU9IkV4cGlyZXMiKSwwPT09ZS5pbmRleE9mKCJ4LWFtei1tZXRhLSIpJiYoZGVsZXRlIG9bZV0sZT1lLnRvTG93ZXJDYXNlKCkpLG9bZV09dH0pKSxkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzW2ldLGRlbGV0ZSBvLkF1dGhvcml6YXRpb24sZGVsZXRlIG8uSG9zdDtlbHNlIGlmKCJBV1M0LUhNQUMtU0hBMjU2Ij09PXNbMF0pe3Muc2hpZnQoKTt2YXIgYT1zLmpvaW4oIiAiKS5tYXRjaCgvU2lnbmF0dXJlPSguKj8pKD86LHxcc3xccj9cbnwkKS8pWzFdO29bIlgtQW16LVNpZ25hdHVyZSJdPWEsZGVsZXRlIG8uRXhwaXJlc310LnBhdGhuYW1lPW4ucGF0aG5hbWUsdC5zZWFyY2g9ci51dGlsLnF1ZXJ5UGFyYW1zVG9TdHJpbmcobyl9ci5TaWduZXJzLlByZXNpZ249byh7c2lnbjpmdW5jdGlvbihlLHQsbil7aWYoZS5odHRwUmVxdWVzdC5oZWFkZXJzW2ldPXR8fDM2MDAsZS5vbigiYnVpbGQiLHMpLGUub24oInNpZ24iLGEpLGUucmVtb3ZlTGlzdGVuZXIoImFmdGVyQnVpbGQiLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZS5TRVRfQ09OVEVOVF9MRU5HVEgpLGUucmVtb3ZlTGlzdGVuZXIoImFmdGVyQnVpbGQiLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZS5DT01QVVRFX1NIQTI1NiksZS5lbWl0KCJiZWZvcmVQcmVzaWduIixbZV0pLCFuKXtpZihlLmJ1aWxkKCksZS5yZXNwb25zZS5lcnJvcil0aHJvdyBlLnJlc3BvbnNlLmVycm9yO3JldHVybiByLnV0aWwudXJsRm9ybWF0KGUuaHR0cFJlcXVlc3QuZW5kcG9pbnQpfWUuYnVpbGQoKGZ1bmN0aW9uKCl7dGhpcy5yZXNwb25zZS5lcnJvcj9uKHRoaXMucmVzcG9uc2UuZXJyb3IpOm4obnVsbCxyLnV0aWwudXJsRm9ybWF0KGUuaHR0cFJlcXVlc3QuZW5kcG9pbnQpKX0pKX19KSx0LmV4cG9ydHM9ci5TaWduZXJzLlByZXNpZ259LHsiLi4vY29yZSI6MTl9XSw2NjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0O3IuU2lnbmVycy5SZXF1ZXN0U2lnbmVyPW8oe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3RoaXMucmVxdWVzdD1lfSxzZXRTZXJ2aWNlQ2xpZW50SWQ6ZnVuY3Rpb24oZSl7dGhpcy5zZXJ2aWNlQ2xpZW50SWQ9ZX0sZ2V0U2VydmljZUNsaWVudElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VydmljZUNsaWVudElkfX0pLHIuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLmdldFZlcnNpb249ZnVuY3Rpb24oZSl7c3dpdGNoKGUpe2Nhc2UidjIiOnJldHVybiByLlNpZ25lcnMuVjI7Y2FzZSJ2MyI6cmV0dXJuIHIuU2lnbmVycy5WMztjYXNlInMzdjQiOmNhc2UidjQiOnJldHVybiByLlNpZ25lcnMuVjQ7Y2FzZSJzMyI6cmV0dXJuIHIuU2lnbmVycy5TMztjYXNlInYzaHR0cHMiOnJldHVybiByLlNpZ25lcnMuVjNIdHRwcztjYXNlImJlYXJlciI6cmV0dXJuIHIuU2lnbmVycy5CZWFyZXJ9dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHNpZ25pbmcgdmVyc2lvbiAiK2UpfSxlKCIuL3YyIiksZSgiLi92MyIpLGUoIi4vdjNodHRwcyIpLGUoIi4vdjQiKSxlKCIuL3MzIiksZSgiLi9wcmVzaWduIiksZSgiLi9iZWFyZXIiKX0seyIuLi9jb3JlIjoxOSwiLi9iZWFyZXIiOjY0LCIuL3ByZXNpZ24iOjY1LCIuL3MzIjo2NywiLi92MiI6NjgsIi4vdjMiOjY5LCIuL3YzaHR0cHMiOjcwLCIuL3Y0Ijo3MX1dLDY3OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQ7ci5TaWduZXJzLlMzPW8oci5TaWduZXJzLlJlcXVlc3RTaWduZXIse3N1YlJlc291cmNlczp7YWNsOjEsYWNjZWxlcmF0ZToxLGFuYWx5dGljczoxLGNvcnM6MSxsaWZlY3ljbGU6MSxkZWxldGU6MSxpbnZlbnRvcnk6MSxsb2NhdGlvbjoxLGxvZ2dpbmc6MSxtZXRyaWNzOjEsbm90aWZpY2F0aW9uOjEscGFydE51bWJlcjoxLHBvbGljeToxLHJlcXVlc3RQYXltZW50OjEscmVwbGljYXRpb246MSxyZXN0b3JlOjEsdGFnZ2luZzoxLHRvcnJlbnQ6MSx1cGxvYWRJZDoxLHVwbG9hZHM6MSx2ZXJzaW9uSWQ6MSx2ZXJzaW9uaW5nOjEsdmVyc2lvbnM6MSx3ZWJzaXRlOjF9LHJlc3BvbnNlSGVhZGVyczp7InJlc3BvbnNlLWNvbnRlbnQtdHlwZSI6MSwicmVzcG9uc2UtY29udGVudC1sYW5ndWFnZSI6MSwicmVzcG9uc2UtZXhwaXJlcyI6MSwicmVzcG9uc2UtY2FjaGUtY29udHJvbCI6MSwicmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbiI6MSwicmVzcG9uc2UtY29udGVudC1lbmNvZGluZyI6MX0sYWRkQXV0aG9yaXphdGlvbjpmdW5jdGlvbihlLHQpe3RoaXMucmVxdWVzdC5oZWFkZXJzWyJwcmVzaWduZWQtZXhwaXJlcyJdfHwodGhpcy5yZXF1ZXN0LmhlYWRlcnNbIlgtQW16LURhdGUiXT1yLnV0aWwuZGF0ZS5yZmM4MjIodCkpLGUuc2Vzc2lvblRva2VuJiYodGhpcy5yZXF1ZXN0LmhlYWRlcnNbIngtYW16LXNlY3VyaXR5LXRva2VuIl09ZS5zZXNzaW9uVG9rZW4pO3ZhciBuPXRoaXMuc2lnbihlLnNlY3JldEFjY2Vzc0tleSx0aGlzLnN0cmluZ1RvU2lnbigpKSxvPSJBV1MgIitlLmFjY2Vzc0tleUlkKyI6IituO3RoaXMucmVxdWVzdC5oZWFkZXJzLkF1dGhvcml6YXRpb249b30sc3RyaW5nVG9TaWduOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yZXF1ZXN0LHQ9W107dC5wdXNoKGUubWV0aG9kKSx0LnB1c2goZS5oZWFkZXJzWyJDb250ZW50LU1ENSJdfHwiIiksdC5wdXNoKGUuaGVhZGVyc1siQ29udGVudC1UeXBlIl18fCIiKSx0LnB1c2goZS5oZWFkZXJzWyJwcmVzaWduZWQtZXhwaXJlcyJdfHwiIik7dmFyIG49dGhpcy5jYW5vbmljYWxpemVkQW16SGVhZGVycygpO3JldHVybiBuJiZ0LnB1c2gobiksdC5wdXNoKHRoaXMuY2Fub25pY2FsaXplZFJlc291cmNlKCkpLHQuam9pbigiXG4iKX0sY2Fub25pY2FsaXplZEFtekhlYWRlcnM6ZnVuY3Rpb24oKXt2YXIgZT1bXTtyLnV0aWwuZWFjaCh0aGlzLnJlcXVlc3QuaGVhZGVycywoZnVuY3Rpb24odCl7dC5tYXRjaCgvXngtYW16LS9pKSYmZS5wdXNoKHQpfSkpLGUuc29ydCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS50b0xvd2VyQ2FzZSgpPHQudG9Mb3dlckNhc2UoKT8tMToxfSkpO3ZhciB0PVtdO3JldHVybiByLnV0aWwuYXJyYXlFYWNoLmNhbGwodGhpcyxlLChmdW5jdGlvbihlKXt0LnB1c2goZS50b0xvd2VyQ2FzZSgpKyI6IitTdHJpbmcodGhpcy5yZXF1ZXN0LmhlYWRlcnNbZV0pKX0pKSx0LmpvaW4oIlxuIil9LGNhbm9uaWNhbGl6ZWRSZXNvdXJjZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVxdWVzdCx0PWUucGF0aC5zcGxpdCgiPyIpLG49dFswXSxvPXRbMV0saT0iIjtpZihlLnZpcnR1YWxIb3N0ZWRCdWNrZXQmJihpKz0iLyIrZS52aXJ0dWFsSG9zdGVkQnVja2V0KSxpKz1uLG8pe3ZhciBzPVtdO3IudXRpbC5hcnJheUVhY2guY2FsbCh0aGlzLG8uc3BsaXQoIiYiKSwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zcGxpdCgiPSIpWzBdLG49ZS5zcGxpdCgiPSIpWzFdO2lmKHRoaXMuc3ViUmVzb3VyY2VzW3RdfHx0aGlzLnJlc3BvbnNlSGVhZGVyc1t0XSl7dmFyIHI9e25hbWU6dH07dm9pZCAwIT09biYmKHRoaXMuc3ViUmVzb3VyY2VzW3RdP3IudmFsdWU9bjpyLnZhbHVlPWRlY29kZVVSSUNvbXBvbmVudChuKSkscy5wdXNoKHIpfX0pKSxzLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUubmFtZTx0Lm5hbWU/LTE6MX0pKSxzLmxlbmd0aCYmKG89W10sci51dGlsLmFycmF5RWFjaChzLChmdW5jdGlvbihlKXt2b2lkIDA9PT1lLnZhbHVlP28ucHVzaChlLm5hbWUpOm8ucHVzaChlLm5hbWUrIj0iK2UudmFsdWUpfSkpLGkrPSI/IitvLmpvaW4oIiYiKSl9cmV0dXJuIGl9LHNpZ246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gci51dGlsLmNyeXB0by5obWFjKGUsdCwiYmFzZTY0Iiwic2hhMSIpfX0pLHQuZXhwb3J0cz1yLlNpZ25lcnMuUzN9LHsiLi4vY29yZSI6MTl9XSw2ODpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0O3IuU2lnbmVycy5WMj1vKHIuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLHthZGRBdXRob3JpemF0aW9uOmZ1bmN0aW9uKGUsdCl7dHx8KHQ9ci51dGlsLmRhdGUuZ2V0RGF0ZSgpKTt2YXIgbj10aGlzLnJlcXVlc3Q7bi5wYXJhbXMuVGltZXN0YW1wPXIudXRpbC5kYXRlLmlzbzg2MDEodCksbi5wYXJhbXMuU2lnbmF0dXJlVmVyc2lvbj0iMiIsbi5wYXJhbXMuU2lnbmF0dXJlTWV0aG9kPSJIbWFjU0hBMjU2IixuLnBhcmFtcy5BV1NBY2Nlc3NLZXlJZD1lLmFjY2Vzc0tleUlkLGUuc2Vzc2lvblRva2VuJiYobi5wYXJhbXMuU2VjdXJpdHlUb2tlbj1lLnNlc3Npb25Ub2tlbiksZGVsZXRlIG4ucGFyYW1zLlNpZ25hdHVyZSxuLnBhcmFtcy5TaWduYXR1cmU9dGhpcy5zaWduYXR1cmUoZSksbi5ib2R5PXIudXRpbC5xdWVyeVBhcmFtc1RvU3RyaW5nKG4ucGFyYW1zKSxuLmhlYWRlcnNbIkNvbnRlbnQtTGVuZ3RoIl09bi5ib2R5Lmxlbmd0aH0sc2lnbmF0dXJlOmZ1bmN0aW9uKGUpe3JldHVybiByLnV0aWwuY3J5cHRvLmhtYWMoZS5zZWNyZXRBY2Nlc3NLZXksdGhpcy5zdHJpbmdUb1NpZ24oKSwiYmFzZTY0Iil9LHN0cmluZ1RvU2lnbjpmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiBlLnB1c2godGhpcy5yZXF1ZXN0Lm1ldGhvZCksZS5wdXNoKHRoaXMucmVxdWVzdC5lbmRwb2ludC5ob3N0LnRvTG93ZXJDYXNlKCkpLGUucHVzaCh0aGlzLnJlcXVlc3QucGF0aG5hbWUoKSksZS5wdXNoKHIudXRpbC5xdWVyeVBhcmFtc1RvU3RyaW5nKHRoaXMucmVxdWVzdC5wYXJhbXMpKSxlLmpvaW4oIlxuIil9fSksdC5leHBvcnRzPXIuU2lnbmVycy5WMn0seyIuLi9jb3JlIjoxOX1dLDY5OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQ7ci5TaWduZXJzLlYzPW8oci5TaWduZXJzLlJlcXVlc3RTaWduZXIse2FkZEF1dGhvcml6YXRpb246ZnVuY3Rpb24oZSx0KXt2YXIgbj1yLnV0aWwuZGF0ZS5yZmM4MjIodCk7dGhpcy5yZXF1ZXN0LmhlYWRlcnNbIlgtQW16LURhdGUiXT1uLGUuc2Vzc2lvblRva2VuJiYodGhpcy5yZXF1ZXN0LmhlYWRlcnNbIngtYW16LXNlY3VyaXR5LXRva2VuIl09ZS5zZXNzaW9uVG9rZW4pLHRoaXMucmVxdWVzdC5oZWFkZXJzWyJYLUFtem4tQXV0aG9yaXphdGlvbiJdPXRoaXMuYXV0aG9yaXphdGlvbihlLG4pfSxhdXRob3JpemF0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiJBV1MzIEFXU0FjY2Vzc0tleUlkPSIrZS5hY2Nlc3NLZXlJZCsiLEFsZ29yaXRobT1IbWFjU0hBMjU2LFNpZ25lZEhlYWRlcnM9Iit0aGlzLnNpZ25lZEhlYWRlcnMoKSsiLFNpZ25hdHVyZT0iK3RoaXMuc2lnbmF0dXJlKGUpfSxzaWduZWRIZWFkZXJzOmZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIHIudXRpbC5hcnJheUVhY2godGhpcy5oZWFkZXJzVG9TaWduKCksKGZ1bmN0aW9uKHQpe2UucHVzaCh0LnRvTG93ZXJDYXNlKCkpfSkpLGUuc29ydCgpLmpvaW4oIjsiKX0sY2Fub25pY2FsSGVhZGVyczpmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVxdWVzdC5oZWFkZXJzLHQ9W107cmV0dXJuIHIudXRpbC5hcnJheUVhY2godGhpcy5oZWFkZXJzVG9TaWduKCksKGZ1bmN0aW9uKG4pe3QucHVzaChuLnRvTG93ZXJDYXNlKCkudHJpbSgpKyI6IitTdHJpbmcoZVtuXSkudHJpbSgpKX0pKSx0LnNvcnQoKS5qb2luKCJcbiIpKyJcbiJ9LGhlYWRlcnNUb1NpZ246ZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4gci51dGlsLmVhY2godGhpcy5yZXF1ZXN0LmhlYWRlcnMsKGZ1bmN0aW9uKHQpeygiSG9zdCI9PT10fHwiQ29udGVudC1FbmNvZGluZyI9PT10fHx0Lm1hdGNoKC9eWC1BbXovaSkpJiZlLnB1c2godCl9KSksZX0sc2lnbmF0dXJlOmZ1bmN0aW9uKGUpe3JldHVybiByLnV0aWwuY3J5cHRvLmhtYWMoZS5zZWNyZXRBY2Nlc3NLZXksdGhpcy5zdHJpbmdUb1NpZ24oKSwiYmFzZTY0Iil9LHN0cmluZ1RvU2lnbjpmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiBlLnB1c2godGhpcy5yZXF1ZXN0Lm1ldGhvZCksZS5wdXNoKCIvIiksZS5wdXNoKCIiKSxlLnB1c2godGhpcy5jYW5vbmljYWxIZWFkZXJzKCkpLGUucHVzaCh0aGlzLnJlcXVlc3QuYm9keSksci51dGlsLmNyeXB0by5zaGEyNTYoZS5qb2luKCJcbiIpKX19KSx0LmV4cG9ydHM9ci5TaWduZXJzLlYzfSx7Ii4uL2NvcmUiOjE5fV0sNzA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdDtlKCIuL3YzIiksci5TaWduZXJzLlYzSHR0cHM9byhyLlNpZ25lcnMuVjMse2F1dGhvcml6YXRpb246ZnVuY3Rpb24oZSl7cmV0dXJuIkFXUzMtSFRUUFMgQVdTQWNjZXNzS2V5SWQ9IitlLmFjY2Vzc0tleUlkKyIsQWxnb3JpdGhtPUhtYWNTSEEyNTYsU2lnbmF0dXJlPSIrdGhpcy5zaWduYXR1cmUoZSl9LHN0cmluZ1RvU2lnbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlcXVlc3QuaGVhZGVyc1siWC1BbXotRGF0ZSJdfX0pLHQuZXhwb3J0cz1yLlNpZ25lcnMuVjNIdHRwc30seyIuLi9jb3JlIjoxOSwiLi92MyI6Njl9XSw3MTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4vdjRfY3JlZGVudGlhbHMiKSxpPXIudXRpbC5pbmhlcml0LHM9InByZXNpZ25lZC1leHBpcmVzIjtyLlNpZ25lcnMuVjQ9aShyLlNpZ25lcnMuUmVxdWVzdFNpZ25lcix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0LG4pe3IuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLmNhbGwodGhpcyxlKSx0aGlzLnNlcnZpY2VOYW1lPXQsbj1ufHx7fSx0aGlzLnNpZ25hdHVyZUNhY2hlPSJib29sZWFuIiE9dHlwZW9mIG4uc2lnbmF0dXJlQ2FjaGV8fG4uc2lnbmF0dXJlQ2FjaGUsdGhpcy5vcGVyYXRpb249bi5vcGVyYXRpb24sdGhpcy5zaWduYXR1cmVWZXJzaW9uPW4uc2lnbmF0dXJlVmVyc2lvbn0sYWxnb3JpdGhtOiJBV1M0LUhNQUMtU0hBMjU2IixhZGRBdXRob3JpemF0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49ci51dGlsLmRhdGUuaXNvODYwMSh0KS5yZXBsYWNlKC9bOlwtXXxcLlxkezN9L2csIiIpO3RoaXMuaXNQcmVzaWduZWQoKT90aGlzLnVwZGF0ZUZvclByZXNpZ25lZChlLG4pOnRoaXMuYWRkSGVhZGVycyhlLG4pLHRoaXMucmVxdWVzdC5oZWFkZXJzLkF1dGhvcml6YXRpb249dGhpcy5hdXRob3JpemF0aW9uKGUsbil9LGFkZEhlYWRlcnM6ZnVuY3Rpb24oZSx0KXt0aGlzLnJlcXVlc3QuaGVhZGVyc1siWC1BbXotRGF0ZSJdPXQsZS5zZXNzaW9uVG9rZW4mJih0aGlzLnJlcXVlc3QuaGVhZGVyc1sieC1hbXotc2VjdXJpdHktdG9rZW4iXT1lLnNlc3Npb25Ub2tlbil9LHVwZGF0ZUZvclByZXNpZ25lZDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY3JlZGVudGlhbFN0cmluZyh0KSxvPXsiWC1BbXotRGF0ZSI6dCwiWC1BbXotQWxnb3JpdGhtIjp0aGlzLmFsZ29yaXRobSwiWC1BbXotQ3JlZGVudGlhbCI6ZS5hY2Nlc3NLZXlJZCsiLyIrbiwiWC1BbXotRXhwaXJlcyI6dGhpcy5yZXF1ZXN0LmhlYWRlcnNbc10sIlgtQW16LVNpZ25lZEhlYWRlcnMiOnRoaXMuc2lnbmVkSGVhZGVycygpfTtlLnNlc3Npb25Ub2tlbiYmKG9bIlgtQW16LVNlY3VyaXR5LVRva2VuIl09ZS5zZXNzaW9uVG9rZW4pLHRoaXMucmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSYmKG9bIkNvbnRlbnQtVHlwZSJdPXRoaXMucmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSksdGhpcy5yZXF1ZXN0LmhlYWRlcnNbIkNvbnRlbnQtTUQ1Il0mJihvWyJDb250ZW50LU1ENSJdPXRoaXMucmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LU1ENSJdKSx0aGlzLnJlcXVlc3QuaGVhZGVyc1siQ2FjaGUtQ29udHJvbCJdJiYob1siQ2FjaGUtQ29udHJvbCJdPXRoaXMucmVxdWVzdC5oZWFkZXJzWyJDYWNoZS1Db250cm9sIl0pLHIudXRpbC5lYWNoLmNhbGwodGhpcyx0aGlzLnJlcXVlc3QuaGVhZGVycywoZnVuY3Rpb24oZSx0KXtpZihlIT09cyYmdGhpcy5pc1NpZ25hYmxlSGVhZGVyKGUpKXt2YXIgbj1lLnRvTG93ZXJDYXNlKCk7MD09PW4uaW5kZXhPZigieC1hbXotbWV0YS0iKT9vW25dPXQ6MD09PW4uaW5kZXhPZigieC1hbXotIikmJihvW2VdPXQpfX0pKTt2YXIgaT10aGlzLnJlcXVlc3QucGF0aC5pbmRleE9mKCI/Iik+PTA/IiYiOiI/Ijt0aGlzLnJlcXVlc3QucGF0aCs9aStyLnV0aWwucXVlcnlQYXJhbXNUb1N0cmluZyhvKX0sYXV0aG9yaXphdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBuPVtdLHI9dGhpcy5jcmVkZW50aWFsU3RyaW5nKHQpO3JldHVybiBuLnB1c2godGhpcy5hbGdvcml0aG0rIiBDcmVkZW50aWFsPSIrZS5hY2Nlc3NLZXlJZCsiLyIrciksbi5wdXNoKCJTaWduZWRIZWFkZXJzPSIrdGhpcy5zaWduZWRIZWFkZXJzKCkpLG4ucHVzaCgiU2lnbmF0dXJlPSIrdGhpcy5zaWduYXR1cmUoZSx0KSksbi5qb2luKCIsICIpfSxzaWduYXR1cmU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1vLmdldFNpZ25pbmdLZXkoZSx0LnN1YnN0cigwLDgpLHRoaXMucmVxdWVzdC5yZWdpb24sdGhpcy5zZXJ2aWNlTmFtZSx0aGlzLnNpZ25hdHVyZUNhY2hlKTtyZXR1cm4gci51dGlsLmNyeXB0by5obWFjKG4sdGhpcy5zdHJpbmdUb1NpZ24odCksImhleCIpfSxzdHJpbmdUb1NpZ246ZnVuY3Rpb24oZSl7dmFyIHQ9W107cmV0dXJuIHQucHVzaCgiQVdTNC1ITUFDLVNIQTI1NiIpLHQucHVzaChlKSx0LnB1c2godGhpcy5jcmVkZW50aWFsU3RyaW5nKGUpKSx0LnB1c2godGhpcy5oZXhFbmNvZGVkSGFzaCh0aGlzLmNhbm9uaWNhbFN0cmluZygpKSksdC5qb2luKCJcbiIpfSxjYW5vbmljYWxTdHJpbmc6ZnVuY3Rpb24oKXt2YXIgZT1bXSx0PXRoaXMucmVxdWVzdC5wYXRobmFtZSgpO3JldHVybiJzMyIhPT10aGlzLnNlcnZpY2VOYW1lJiYiczN2NCIhPT10aGlzLnNpZ25hdHVyZVZlcnNpb24mJih0PXIudXRpbC51cmlFc2NhcGVQYXRoKHQpKSxlLnB1c2godGhpcy5yZXF1ZXN0Lm1ldGhvZCksZS5wdXNoKHQpLGUucHVzaCh0aGlzLnJlcXVlc3Quc2VhcmNoKCkpLGUucHVzaCh0aGlzLmNhbm9uaWNhbEhlYWRlcnMoKSsiXG4iKSxlLnB1c2godGhpcy5zaWduZWRIZWFkZXJzKCkpLGUucHVzaCh0aGlzLmhleEVuY29kZWRCb2R5SGFzaCgpKSxlLmpvaW4oIlxuIil9LGNhbm9uaWNhbEhlYWRlcnM6ZnVuY3Rpb24oKXt2YXIgZT1bXTtyLnV0aWwuZWFjaC5jYWxsKHRoaXMsdGhpcy5yZXF1ZXN0LmhlYWRlcnMsKGZ1bmN0aW9uKHQsbil7ZS5wdXNoKFt0LG5dKX0pKSxlLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbMF0udG9Mb3dlckNhc2UoKTx0WzBdLnRvTG93ZXJDYXNlKCk/LTE6MX0pKTt2YXIgdD1bXTtyZXR1cm4gci51dGlsLmFycmF5RWFjaC5jYWxsKHRoaXMsZSwoZnVuY3Rpb24oZSl7dmFyIG49ZVswXS50b0xvd2VyQ2FzZSgpO2lmKHRoaXMuaXNTaWduYWJsZUhlYWRlcihuKSl7dmFyIG89ZVsxXTtpZihudWxsPT1vfHwiZnVuY3Rpb24iIT10eXBlb2Ygby50b1N0cmluZyl0aHJvdyByLnV0aWwuZXJyb3IobmV3IEVycm9yKCJIZWFkZXIgIituKyIgY29udGFpbnMgaW52YWxpZCB2YWx1ZSIpLHtjb2RlOiJJbnZhbGlkSGVhZGVyIn0pO3QucHVzaChuKyI6Iit0aGlzLmNhbm9uaWNhbEhlYWRlclZhbHVlcyhvLnRvU3RyaW5nKCkpKX19KSksdC5qb2luKCJcbiIpfSxjYW5vbmljYWxIZWFkZXJWYWx1ZXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvXHMrL2csIiAiKS5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9LHNpZ25lZEhlYWRlcnM6ZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4gci51dGlsLmVhY2guY2FsbCh0aGlzLHRoaXMucmVxdWVzdC5oZWFkZXJzLChmdW5jdGlvbih0KXt0PXQudG9Mb3dlckNhc2UoKSx0aGlzLmlzU2lnbmFibGVIZWFkZXIodCkmJmUucHVzaCh0KX0pKSxlLnNvcnQoKS5qb2luKCI7Iil9LGNyZWRlbnRpYWxTdHJpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIG8uY3JlYXRlU2NvcGUoZS5zdWJzdHIoMCw4KSx0aGlzLnJlcXVlc3QucmVnaW9uLHRoaXMuc2VydmljZU5hbWUpfSxoZXhFbmNvZGVkSGFzaDpmdW5jdGlvbihlKXtyZXR1cm4gci51dGlsLmNyeXB0by5zaGEyNTYoZSwiaGV4Iil9LGhleEVuY29kZWRCb2R5SGFzaDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVxdWVzdDtyZXR1cm4gdGhpcy5pc1ByZXNpZ25lZCgpJiZbInMzIiwiczMtb2JqZWN0LWxhbWJkYSJdLmluZGV4T2YodGhpcy5zZXJ2aWNlTmFtZSk+LTEmJiFlLmJvZHk/IlVOU0lHTkVELVBBWUxPQUQiOmUuaGVhZGVyc1siWC1BbXotQ29udGVudC1TaGEyNTYiXT9lLmhlYWRlcnNbIlgtQW16LUNvbnRlbnQtU2hhMjU2Il06dGhpcy5oZXhFbmNvZGVkSGFzaCh0aGlzLnJlcXVlc3QuYm9keXx8IiIpfSx1bnNpZ25hYmxlSGVhZGVyczpbImF1dGhvcml6YXRpb24iLCJjb250ZW50LXR5cGUiLCJjb250ZW50LWxlbmd0aCIsInVzZXItYWdlbnQiLHMsImV4cGVjdCIsIngtYW16bi10cmFjZS1pZCJdLGlzU2lnbmFibGVIZWFkZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigieC1hbXotIil8fHRoaXMudW5zaWduYWJsZUhlYWRlcnMuaW5kZXhPZihlKTwwfSxpc1ByZXNpZ25lZDpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5yZXF1ZXN0LmhlYWRlcnNbc119fSksdC5leHBvcnRzPXIuU2lnbmVycy5WNH0seyIuLi9jb3JlIjoxOSwiLi92NF9jcmVkZW50aWFscyI6NzJ9XSw3MjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPXt9LGk9W10scz0iYXdzNF9yZXF1ZXN0Ijt0LmV4cG9ydHM9e2NyZWF0ZVNjb3BlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5bZS5zdWJzdHIoMCw4KSx0LG4sc10uam9pbigiLyIpfSxnZXRTaWduaW5nS2V5OmZ1bmN0aW9uKGUsdCxuLGEsYyl7dmFyIHU9W3IudXRpbC5jcnlwdG8uaG1hYyhlLnNlY3JldEFjY2Vzc0tleSxlLmFjY2Vzc0tleUlkLCJiYXNlNjQiKSx0LG4sYV0uam9pbigiXyIpO2lmKChjPSExIT09YykmJnUgaW4gbylyZXR1cm4gb1t1XTt2YXIgbD1yLnV0aWwuY3J5cHRvLmhtYWMoIkFXUzQiK2Uuc2VjcmV0QWNjZXNzS2V5LHQsImJ1ZmZlciIpLHA9ci51dGlsLmNyeXB0by5obWFjKGwsbiwiYnVmZmVyIiksZD1yLnV0aWwuY3J5cHRvLmhtYWMocCxhLCJidWZmZXIiKSxoPXIudXRpbC5jcnlwdG8uaG1hYyhkLHMsImJ1ZmZlciIpO3JldHVybiBjJiYob1t1XT1oLGkucHVzaCh1KSxpLmxlbmd0aD41MCYmZGVsZXRlIG9baS5zaGlmdCgpXSksaH0sZW1wdHlDYWNoZTpmdW5jdGlvbigpe289e30saT1bXX19fSx7Ii4uL2NvcmUiOjE5fV0sNzM6W2Z1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKGUsdCl7dGhpcy5jdXJyZW50U3RhdGU9dHx8bnVsbCx0aGlzLnN0YXRlcz1lfHx7fX1yLnByb3RvdHlwZS5ydW5Ubz1mdW5jdGlvbihlLHQsbixyKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9bixuPXQsdD1lLGU9bnVsbCk7dmFyIG89dGhpcyxpPW8uc3RhdGVzW28uY3VycmVudFN0YXRlXTtpLmZuLmNhbGwobnx8byxyLChmdW5jdGlvbihyKXtpZihyKXtpZighaS5mYWlsKXJldHVybiB0P3QuY2FsbChuLHIpOm51bGw7by5jdXJyZW50U3RhdGU9aS5mYWlsfWVsc2V7aWYoIWkuYWNjZXB0KXJldHVybiB0P3QuY2FsbChuKTpudWxsO28uY3VycmVudFN0YXRlPWkuYWNjZXB0fWlmKG8uY3VycmVudFN0YXRlPT09ZSlyZXR1cm4gdD90LmNhbGwobixyKTpudWxsO28ucnVuVG8oZSx0LG4scil9KSl9LHIucHJvdG90eXBlLmFkZFN0YXRlPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0PyhyPXQsdD1udWxsLG49bnVsbCk6ImZ1bmN0aW9uIj09dHlwZW9mIG4mJihyPW4sbj1udWxsKSx0aGlzLmN1cnJlbnRTdGF0ZXx8KHRoaXMuY3VycmVudFN0YXRlPWUpLHRoaXMuc3RhdGVzW2VdPXthY2NlcHQ6dCxmYWlsOm4sZm46cn0sdGhpc30sdC5leHBvcnRzPXJ9LHt9XSw3NDpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbihuLHIpeyhmdW5jdGlvbigpe3ZhciBvLGk9e2Vudmlyb25tZW50OiJub2RlanMiLGVuZ2luZTpmdW5jdGlvbigpe2lmKGkuaXNCcm93c2VyKCkmJiJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yKXJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50O3ZhciBlPW4ucGxhdGZvcm0rIi8iK24udmVyc2lvbjtyZXR1cm4gbi5lbnYuQVdTX0VYRUNVVElPTl9FTlYmJihlKz0iIGV4ZWMtZW52LyIrbi5lbnYuQVdTX0VYRUNVVElPTl9FTlYpLGV9LHVzZXJBZ2VudDpmdW5jdGlvbigpe3ZhciB0PWkuZW52aXJvbm1lbnQsbj0iYXdzLXNkay0iK3QrIi8iK2UoIi4vY29yZSIpLlZFUlNJT047cmV0dXJuIm5vZGVqcyI9PT10JiYobis9IiAiK2kuZW5naW5lKCkpLG59LHVyaUVzY2FwZTpmdW5jdGlvbihlKXt2YXIgdD1lbmNvZGVVUklDb21wb25lbnQoZSk7cmV0dXJuIHQ9KHQ9dC5yZXBsYWNlKC9bXkEtWmEtejAtOV8uflwtJV0rL2csZXNjYXBlKSkucmVwbGFjZSgvWypdL2csKGZ1bmN0aW9uKGUpe3JldHVybiIlIitlLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9KSl9LHVyaUVzY2FwZVBhdGg6ZnVuY3Rpb24oZSl7dmFyIHQ9W107cmV0dXJuIGkuYXJyYXlFYWNoKGUuc3BsaXQoIi8iKSwoZnVuY3Rpb24oZSl7dC5wdXNoKGkudXJpRXNjYXBlKGUpKX0pKSx0LmpvaW4oIi8iKX0sdXJsUGFyc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGkudXJsLnBhcnNlKGUpfSx1cmxGb3JtYXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGkudXJsLmZvcm1hdChlKX0scXVlcnlTdHJpbmdQYXJzZTpmdW5jdGlvbihlKXtyZXR1cm4gaS5xdWVyeXN0cmluZy5wYXJzZShlKX0scXVlcnlQYXJhbXNUb1N0cmluZzpmdW5jdGlvbihlKXt2YXIgdD1bXSxuPWkudXJpRXNjYXBlLHI9T2JqZWN0LmtleXMoZSkuc29ydCgpO3JldHVybiBpLmFycmF5RWFjaChyLChmdW5jdGlvbihyKXt2YXIgbz1lW3JdLHM9bihyKSxhPXMrIj0iO2lmKEFycmF5LmlzQXJyYXkobykpe3ZhciBjPVtdO2kuYXJyYXlFYWNoKG8sKGZ1bmN0aW9uKGUpe2MucHVzaChuKGUpKX0pKSxhPXMrIj0iK2Muc29ydCgpLmpvaW4oIiYiK3MrIj0iKX1lbHNlIG51bGwhPW8mJihhPXMrIj0iK24obykpO3QucHVzaChhKX0pKSx0LmpvaW4oIiYiKX0scmVhZEZpbGVTeW5jOmZ1bmN0aW9uKHQpe3JldHVybiBpLmlzQnJvd3NlcigpP251bGw6ZSgiZnMiKS5yZWFkRmlsZVN5bmModCwidXRmLTgiKX0sYmFzZTY0OntlbmNvZGU6ZnVuY3Rpb24oZSl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IGkuZXJyb3IobmV3IEVycm9yKCJDYW5ub3QgYmFzZTY0IGVuY29kZSBudW1iZXIgIitlKSk7cmV0dXJuIG51bGw9PWU/ZTppLmJ1ZmZlci50b0J1ZmZlcihlKS50b1N0cmluZygiYmFzZTY0Iil9LGRlY29kZTpmdW5jdGlvbihlKXtpZigibnVtYmVyIj09dHlwZW9mIGUpdGhyb3cgaS5lcnJvcihuZXcgRXJyb3IoIkNhbm5vdCBiYXNlNjQgZGVjb2RlIG51bWJlciAiK2UpKTtyZXR1cm4gbnVsbD09ZT9lOmkuYnVmZmVyLnRvQnVmZmVyKGUsImJhc2U2NCIpfX0sYnVmZmVyOnt0b0J1ZmZlcjpmdW5jdGlvbihlLHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBpLkJ1ZmZlci5mcm9tJiZpLkJ1ZmZlci5mcm9tIT09VWludDhBcnJheS5mcm9tP2kuQnVmZmVyLmZyb20oZSx0KTpuZXcgaS5CdWZmZXIoZSx0KX0sYWxsb2M6ZnVuY3Rpb24oZSx0LG4pe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoInNpemUgcGFzc2VkIHRvIGFsbG9jIG11c3QgYmUgYSBudW1iZXIuIik7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGkuQnVmZmVyLmFsbG9jKXJldHVybiBpLkJ1ZmZlci5hbGxvYyhlLHQsbik7dmFyIHI9bmV3IGkuQnVmZmVyKGUpO3JldHVybiB2b2lkIDAhPT10JiYiZnVuY3Rpb24iPT10eXBlb2Ygci5maWxsJiZyLmZpbGwodCx2b2lkIDAsdm9pZCAwLG4pLHJ9LHRvU3RyZWFtOmZ1bmN0aW9uKGUpe2kuQnVmZmVyLmlzQnVmZmVyKGUpfHwoZT1pLmJ1ZmZlci50b0J1ZmZlcihlKSk7dmFyIHQ9bmV3IGkuc3RyZWFtLlJlYWRhYmxlLG49MDtyZXR1cm4gdC5fcmVhZD1mdW5jdGlvbihyKXtpZihuPj1lLmxlbmd0aClyZXR1cm4gdC5wdXNoKG51bGwpO3ZhciBvPW4rcjtvPmUubGVuZ3RoJiYobz1lLmxlbmd0aCksdC5wdXNoKGUuc2xpY2UobixvKSksbj1vfSx0fSxjb25jYXQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPTAsbz0wO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspcis9ZVtuXS5sZW5ndGg7Zm9yKHQ9aS5idWZmZXIuYWxsb2Mociksbj0wO248ZS5sZW5ndGg7bisrKWVbbl0uY29weSh0LG8pLG8rPWVbbl0ubGVuZ3RoO3JldHVybiB0fX0sc3RyaW5nOntieXRlTGVuZ3RoOmZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIDA7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYodD1pLmJ1ZmZlci50b0J1ZmZlcih0KSksIm51bWJlciI9PXR5cGVvZiB0LmJ5dGVMZW5ndGgpcmV0dXJuIHQuYnl0ZUxlbmd0aDtpZigibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKXJldHVybiB0Lmxlbmd0aDtpZigibnVtYmVyIj09dHlwZW9mIHQuc2l6ZSlyZXR1cm4gdC5zaXplO2lmKCJzdHJpbmciPT10eXBlb2YgdC5wYXRoKXJldHVybiBlKCJmcyIpLmxzdGF0U3luYyh0LnBhdGgpLnNpemU7dGhyb3cgaS5lcnJvcihuZXcgRXJyb3IoIkNhbm5vdCBkZXRlcm1pbmUgbGVuZ3RoIG9mICIrdCkse29iamVjdDp0fSl9LHVwcGVyRmlyc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF0udG9VcHBlckNhc2UoKStlLnN1YnN0cigxKX0sbG93ZXJGaXJzdDpmdW5jdGlvbihlKXtyZXR1cm4gZVswXS50b0xvd2VyQ2FzZSgpK2Uuc3Vic3RyKDEpfX0saW5pOntwYXJzZTpmdW5jdGlvbihlKXt2YXIgdCxuPXt9O3JldHVybiBpLmFycmF5RWFjaChlLnNwbGl0KC9ccj9cbi8pLChmdW5jdGlvbihlKXtpZigiWyI9PT0oZT1lLnNwbGl0KC8oXnxccylbOyNdLylbMF0udHJpbSgpKVswXSYmIl0iPT09ZVtlLmxlbmd0aC0xXSl7aWYoIl9fcHJvdG9fXyI9PT0odD1lLnN1YnN0cmluZygxLGUubGVuZ3RoLTEpKXx8Il9fcHJvdG9fXyI9PT10LnNwbGl0KC9ccy8pWzFdKXRocm93IGkuZXJyb3IobmV3IEVycm9yKCJDYW5ub3QgbG9hZCBwcm9maWxlIG5hbWUgJyIrdCsiJyBmcm9tIHNoYXJlZCBpbmkgZmlsZS4iKSl9ZWxzZSBpZih0KXt2YXIgcj1lLmluZGV4T2YoIj0iKSxvPWUubGVuZ3RoLTE7aWYoLTEhPT1yJiYwIT09ciYmciE9PW8pe3ZhciBzPWUuc3Vic3RyaW5nKDAscikudHJpbSgpLGE9ZS5zdWJzdHJpbmcocisxKS50cmltKCk7blt0XT1uW3RdfHx7fSxuW3RdW3NdPWF9fX0pKSxufX0sZm46e25vb3A6ZnVuY3Rpb24oKXt9LGNhbGxiYWNrOmZ1bmN0aW9uKGUpe2lmKGUpdGhyb3cgZX0sbWFrZUFzeW5jOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQmJnQ8PWUubGVuZ3RoP2U6ZnVuY3Rpb24oKXt2YXIgdD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7dC5wb3AoKShlLmFwcGx5KG51bGwsdCkpfX19LGRhdGU6e2dldERhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gb3x8KG89ZSgiLi9jb3JlIikpLG8uY29uZmlnLnN5c3RlbUNsb2NrT2Zmc2V0P25ldyBEYXRlKChuZXcgRGF0ZSkuZ2V0VGltZSgpK28uY29uZmlnLnN5c3RlbUNsb2NrT2Zmc2V0KTpuZXcgRGF0ZX0saXNvODYwMTpmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9aS5kYXRlLmdldERhdGUoKSksZS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1wuXGR7M31aJC8sIloiKX0scmZjODIyOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1pLmRhdGUuZ2V0RGF0ZSgpKSxlLnRvVVRDU3RyaW5nKCl9LHVuaXhUaW1lc3RhbXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPWkuZGF0ZS5nZXREYXRlKCkpLGUuZ2V0VGltZSgpLzFlM30sZnJvbTpmdW5jdGlvbihlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/bmV3IERhdGUoMWUzKmUpOm5ldyBEYXRlKGUpfSxmb3JtYXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8KHQ9Imlzbzg2MDEiKSxpLmRhdGVbdF0oaS5kYXRlLmZyb20oZSkpfSxwYXJzZVRpbWVzdGFtcDpmdW5jdGlvbihlKXtpZigibnVtYmVyIj09dHlwZW9mIGUpcmV0dXJuIG5ldyBEYXRlKDFlMyplKTtpZihlLm1hdGNoKC9eXGQrJC8pKXJldHVybiBuZXcgRGF0ZSgxZTMqZSk7aWYoZS5tYXRjaCgvXlxkezR9LykpcmV0dXJuIG5ldyBEYXRlKGUpO2lmKGUubWF0Y2goL15cd3szfSwvKSlyZXR1cm4gbmV3IERhdGUoZSk7dGhyb3cgaS5lcnJvcihuZXcgRXJyb3IoInVuaGFuZGxlZCB0aW1lc3RhbXAgZm9ybWF0OiAiK2UpLHtjb2RlOiJUaW1lc3RhbXBQYXJzZXJFcnJvciJ9KX19LGNyeXB0bzp7Y3JjMzJUYWJsZTpbMCwxOTk2OTU5ODk0LDM5OTM5MTk3ODgsMjU2NzUyNDc5NCwxMjQ2MzQxMzcsMTg4NjA1NzYxNSwzOTE1NjIxNjg1LDI2NTczOTIwMzUsMjQ5MjY4Mjc0LDIwNDQ1MDgzMjQsMzc3MjExNTIzMCwyNTQ3MTc3ODY0LDE2Mjk0MTk5NSwyMTI1NTYxMDIxLDM4ODc2MDcwNDcsMjQyODQ0NDA0OSw0OTg1MzY1NDgsMTc4OTkyNzY2Niw0MDg5MDE2NjQ4LDIyMjcwNjEyMTQsNDUwNTQ4ODYxLDE4NDMyNTg2MDMsNDEwNzU4MDc1MywyMjExNjc3NjM5LDMyNTg4Mzk5MCwxNjg0Nzc3MTUyLDQyNTExMjIwNDIsMjMyMTkyNjYzNiwzMzU2MzM0ODcsMTY2MTM2NTQ2NSw0MTk1MzAyNzU1LDIzNjYxMTUzMTcsOTk3MDczMDk2LDEyODE5NTM4ODYsMzU3OTg1NTMzMiwyNzI0Njg4MjQyLDEwMDY4ODgxNDUsMTI1ODYwNzY4NywzNTI0MTAxNjI5LDI3Njg5NDI0NDMsOTAxMDk3NzIyLDExMTkwMDA2ODQsMzY4NjUxNzIwNiwyODk4MDY1NzI4LDg1MzA0NDQ1MSwxMTcyMjY2MTAxLDM3MDUwMTU3NTksMjg4MjYxNjY2NSw2NTE3Njc5ODAsMTM3MzUwMzU0NiwzMzY5NTU0MzA0LDMyMTgxMDQ1OTgsNTY1NTA3MjUzLDE0NTQ2MjE3MzEsMzQ4NTExMTcwNSwzMDk5NDM2MzAzLDY3MTI2Njk3NCwxNTk0MTk4MDI0LDMzMjI3MzA5MzAsMjk3MDM0NzgxMiw3OTU4MzU1MjcsMTQ4MzIzMDIyNSwzMjQ0MzY3Mjc1LDMwNjAxNDk1NjUsMTk5NDE0NjE5MiwzMTE1ODUzNCwyNTYzOTA3NzcyLDQwMjM3MTc5MzAsMTkwNzQ1OTQ2NSwxMTI2MzcyMTUsMjY4MDE1MzI1MywzOTA0NDI3MDU5LDIwMTM3NzYyOTAsMjUxNzIyMDM2LDI1MTcyMTUzNzQsMzc3NTgzMDA0MCwyMTM3NjU2NzYzLDE0MTM3NjgxMywyNDM5Mjc3NzE5LDM4NjUyNzEyOTcsMTgwMjE5NTQ0NCw0NzY4NjQ4NjYsMjIzODAwMTM2OCw0MDY2NTA4ODc4LDE4MTIzNzA5MjUsNDUzMDkyNzMxLDIxODE2MjUwMjUsNDExMTQ1MTIyMywxNzA2MDg4OTAyLDMxNDA0MjcwNCwyMzQ0NTMyMjAyLDQyNDAwMTc1MzIsMTY1ODY1ODI3MSwzNjY2MTk5NzcsMjM2MjY3MDMyMyw0MjI0OTk0NDA1LDEzMDM1MzU5NjAsOTg0OTYxNDg2LDI3NDcwMDcwOTIsMzU2OTAzNzUzOCwxMjU2MTcwODE3LDEwMzc2MDQzMTEsMjc2NTIxMDczMywzNTU0MDc5OTk1LDExMzEwMTQ1MDYsODc5Njc5OTk2LDI5MDkyNDM0NjIsMzY2Mzc3MTg1NiwxMTQxMTI0NDY3LDg1NTg0MjI3NywyODUyODAxNjMxLDM3MDg2NDg2NDksMTM0MjUzMzk0OCw2NTQ0NTkzMDYsMzE4ODM5NjA0OCwzMzczMDE1MTc0LDE0NjY0Nzk5MDksNTQ0MTc5NjM1LDMxMTA1MjM5MTMsMzQ2MjUyMjAxNSwxNTkxNjcxMDU0LDcwMjEzODc3NiwyOTY2NDYwNDUwLDMzNTI3OTk0MTIsMTUwNDkxODgwNyw3ODM1NTE4NzMsMzA4MjY0MDQ0MywzMjMzNDQyOTg5LDM5ODgyOTIzODQsMjU5NjI1NDY0Niw2MjMxNzA2OCwxOTU3ODEwODQyLDM5Mzk4NDU5NDUsMjY0NzgxNjExMSw4MTQ3MDk5NywxOTQzODAzNTIzLDM4MTQ5MTg5MzAsMjQ4OTU5NjgwNCwyMjUyNzQ0MzAsMjA1Mzc5MDM3NiwzODI2MTc1NzU1LDI0NjY5MDYwMTMsMTY3ODE2NzQzLDIwOTc2NTEzNzcsNDAyNzU1MjU4MCwyMjY1NDkwMzg2LDUwMzQ0NDA3MiwxNzYyMDUwODE0LDQxNTA0MTcyNDUsMjE1NDEyOTM1NSw0MjY1MjIyMjUsMTg1MjUwNzg3OSw0Mjc1MzEzNTI2LDIzMTIzMTc5MjAsMjgyNzUzNjI2LDE3NDI1NTU4NTIsNDE4OTcwODE0MywyMzk0ODc3OTQ1LDM5NzkxNzc2MywxNjIyMTgzNjM3LDM2MDQzOTA4ODgsMjcxNDg2NjU1OCw5NTM3Mjk3MzIsMTM0MDA3NjYyNiwzNTE4NzE5OTg1LDI3OTczNjA5OTksMTA2ODgyODM4MSwxMjE5NjM4ODU5LDM2MjQ3NDE4NTAsMjkzNjY3NTE0OCw5MDYxODU0NjIsMTA5MDgxMjUxMiwzNzQ3NjcyMDAzLDI4MjUzNzk2NjksODI5MzI5MTM1LDExODEzMzUxNjEsMzQxMjE3NzgwNCwzMTYwODM0ODQyLDYyODA4NTQwOCwxMzgyNjA1MzY2LDM0MjMzNjkxMDksMzEzODA3ODQ2Nyw1NzA1NjIyMzMsMTQyNjQwMDgxNSwzMzE3MzE2NTQyLDI5OTg3MzM2MDgsNzMzMjM5OTU0LDE1NTUyNjE5NTYsMzI2ODkzNTU5MSwzMDUwMzYwNjI1LDc1MjQ1OTQwMywxNTQxMzIwMjIxLDI2MDcwNzE5MjAsMzk2NTk3MzAzMCwxOTY5OTIyOTcyLDQwNzM1NDk4LDI2MTc4MzcyMjUsMzk0MzU3NzE1MSwxOTEzMDg3ODc3LDgzOTA4MzcxLDI1MTIzNDE2MzQsMzgwMzc0MDY5MiwyMDc1MjA4NjIyLDIxMzI2MTExMiwyNDYzMjcyNjAzLDM4NTU5OTAyODUsMjA5NDg1NDA3MSwxOTg5NTg4ODEsMjI2MjAyOTAxMiw0MDU3MjYwNjEwLDE3NTkzNTk5OTIsNTM0NDE0MTkwLDIxNzY3MTg1NDEsNDEzOTMyOTExNSwxODczODM2MDAxLDQxNDY2NDU2NywyMjgyMjQ4OTM0LDQyNzkyMDAzNjgsMTcxMTY4NDU1NCwyODUyODExMTYsMjQwNTgwMTcyNyw0MTY3MjE2NzQ1LDE2MzQ0Njc3OTUsMzc2MjI5NzAxLDI2ODUwNjc4OTYsMzYwODAwNzQwNiwxMzA4OTE4NjEyLDk1NjU0MzkzOCwyODA4NTU1MTA1LDM0OTU5NTgyNjMsMTIzMTYzNjMwMSwxMDQ3NDI3MDM1LDI5MzI5NTk4MTgsMzY1NDcwMzgzNiwxMDg4MzU5MjcwLDkzNjkxOGUzLDI4NDc3MTQ4OTksMzczNjgzNzgyOSwxMjAyOTAwODYzLDgxNzIzMzg5NywzMTgzMzQyMTA4LDM0MDEyMzcxMzAsMTQwNDI3NzU1Miw2MTU4MTgxNTAsMzEzNDIwNzQ5MywzNDUzNDIxMjAzLDE0MjM4NTc0NDksNjAxNDUwNDMxLDMwMDk4Mzc2MTQsMzI5NDcxMDQ1NiwxNTY3MTAzNzQ2LDcxMTkyODcyNCwzMDIwNjY4NDcxLDMyNzIzODAwNjUsMTUxMDMzNDIzNSw3NTUxNjcxMTddLGNyYzMyOmZ1bmN0aW9uKGUpe3ZhciB0PWkuY3J5cHRvLmNyYzMyVGFibGUsbj0tMTsic3RyaW5nIj09dHlwZW9mIGUmJihlPWkuYnVmZmVyLnRvQnVmZmVyKGUpKTtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyluPW4+Pj44XnRbMjU1JihuXmUucmVhZFVJbnQ4KHIpKV07cmV0dXJuKC0xXm4pPj4+MH0saG1hYzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbnx8KG49ImJpbmFyeSIpLCJidWZmZXIiPT09biYmKG49dm9pZCAwKSxyfHwocj0ic2hhMjU2IiksInN0cmluZyI9PXR5cGVvZiB0JiYodD1pLmJ1ZmZlci50b0J1ZmZlcih0KSksaS5jcnlwdG8ubGliLmNyZWF0ZUhtYWMocixlKS51cGRhdGUodCkuZGlnZXN0KG4pfSxtZDU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBpLmNyeXB0by5oYXNoKCJtZDUiLGUsdCxuKX0sc2hhMjU2OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gaS5jcnlwdG8uaGFzaCgic2hhMjU2IixlLHQsbil9LGhhc2g6ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89aS5jcnlwdG8uY3JlYXRlSGFzaChlKTtufHwobj0iYmluYXJ5IiksImJ1ZmZlciI9PT1uJiYobj12b2lkIDApLCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9aS5idWZmZXIudG9CdWZmZXIodCkpO3ZhciBzPWkuYXJyYXlTbGljZUZuKHQpLGE9aS5CdWZmZXIuaXNCdWZmZXIodCk7aWYoaS5pc0Jyb3dzZXIoKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmdCYmdC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciYmKGE9ITApLHImJiJvYmplY3QiPT10eXBlb2YgdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQub24mJiFhKXQub24oImRhdGEiLChmdW5jdGlvbihlKXtvLnVwZGF0ZShlKX0pKSx0Lm9uKCJlcnJvciIsKGZ1bmN0aW9uKGUpe3IoZSl9KSksdC5vbigiZW5kIiwoZnVuY3Rpb24oKXtyKG51bGwsby5kaWdlc3QobikpfSkpO2Vsc2V7aWYoIXJ8fCFzfHxhfHwidW5kZWZpbmVkIj09dHlwZW9mIEZpbGVSZWFkZXIpe2kuaXNCcm93c2VyKCkmJiJvYmplY3QiPT10eXBlb2YgdCYmIWEmJih0PW5ldyBpLkJ1ZmZlcihuZXcgVWludDhBcnJheSh0KSkpO3ZhciBjPW8udXBkYXRlKHQpLmRpZ2VzdChuKTtyZXR1cm4gciYmcihudWxsLGMpLGN9dmFyIHU9MCxsPW5ldyBGaWxlUmVhZGVyO2wub25lcnJvcj1mdW5jdGlvbigpe3IobmV3IEVycm9yKCJGYWlsZWQgdG8gcmVhZCBkYXRhLiIpKX0sbC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgaS5CdWZmZXIobmV3IFVpbnQ4QXJyYXkobC5yZXN1bHQpKTtvLnVwZGF0ZShlKSx1Kz1lLmxlbmd0aCxsLl9jb250aW51ZVJlYWRpbmcoKX0sbC5fY29udGludWVSZWFkaW5nPWZ1bmN0aW9uKCl7aWYodT49dC5zaXplKXIobnVsbCxvLmRpZ2VzdChuKSk7ZWxzZXt2YXIgZT11KzUyNDI4ODtlPnQuc2l6ZSYmKGU9dC5zaXplKSxsLnJlYWRBc0FycmF5QnVmZmVyKHMuY2FsbCh0LHUsZSkpfX0sbC5fY29udGludWVSZWFkaW5nKCl9fSx0b0hleDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bisrKXQucHVzaCgoIjAiK2UuY2hhckNvZGVBdChuKS50b1N0cmluZygxNikpLnN1YnN0cigtMiwyKSk7cmV0dXJuIHQuam9pbigiIil9LGNyZWF0ZUhhc2g6ZnVuY3Rpb24oZSl7cmV0dXJuIGkuY3J5cHRvLmxpYi5jcmVhdGVIYXNoKGUpfX0sYWJvcnQ6e30sZWFjaDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiZ0LmNhbGwodGhpcyxuLGVbbl0pPT09aS5hYm9ydClicmVha30sYXJyYXlFYWNoOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIGUpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikmJnQuY2FsbCh0aGlzLGVbbl0scGFyc2VJbnQobiwxMCkpPT09aS5hYm9ydClicmVha30sdXBkYXRlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGkuZWFjaCh0LChmdW5jdGlvbih0LG4pe2VbdF09bn0pKSxlfSxtZXJnZTpmdW5jdGlvbihlLHQpe3JldHVybiBpLnVwZGF0ZShpLmNvcHkoZSksdCl9LGNvcHk6ZnVuY3Rpb24oZSl7aWYobnVsbD09ZSlyZXR1cm4gZTt2YXIgdD17fTtmb3IodmFyIG4gaW4gZSl0W25dPWVbbl07cmV0dXJuIHR9LGlzRW1wdHk6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0IGluIGUpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCkpcmV0dXJuITE7cmV0dXJuITB9LGFycmF5U2xpY2VGbjpmdW5jdGlvbihlKXt2YXIgdD1lLnNsaWNlfHxlLndlYmtpdFNsaWNlfHxlLm1velNsaWNlO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bnVsbH0saXNUeXBlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PWkudHlwZU5hbWUodCkpLE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKT09PSJbb2JqZWN0ICIrdCsiXSJ9LHR5cGVOYW1lOmZ1bmN0aW9uKGUpe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJuYW1lIikpcmV0dXJuIGUubmFtZTt2YXIgdD1lLnRvU3RyaW5nKCksbj10Lm1hdGNoKC9eXHMqZnVuY3Rpb24gKC4rKVwoLyk7cmV0dXJuIG4/blsxXTp0fSxlcnJvcjpmdW5jdGlvbihlLHQpe3ZhciBuPW51bGw7Zm9yKHZhciByIGluInN0cmluZyI9PXR5cGVvZiBlLm1lc3NhZ2UmJiIiIT09ZS5tZXNzYWdlJiYoInN0cmluZyI9PXR5cGVvZiB0fHx0JiZ0Lm1lc3NhZ2UpJiYoKG49aS5jb3B5KGUpKS5tZXNzYWdlPWUubWVzc2FnZSksZS5tZXNzYWdlPWUubWVzc2FnZXx8bnVsbCwic3RyaW5nIj09dHlwZW9mIHQ/ZS5tZXNzYWdlPXQ6Im9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dCYmKGkudXBkYXRlKGUsdCksdC5tZXNzYWdlJiYoZS5tZXNzYWdlPXQubWVzc2FnZSksKHQuY29kZXx8dC5uYW1lKSYmKGUuY29kZT10LmNvZGV8fHQubmFtZSksdC5zdGFjayYmKGUuc3RhY2s9dC5zdGFjaykpLCJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkmJihPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwibmFtZSIse3dyaXRhYmxlOiEwLGVudW1lcmFibGU6ITF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwibWVzc2FnZSIse2VudW1lcmFibGU6ITB9KSksZS5uYW1lPVN0cmluZyh0JiZ0Lm5hbWV8fGUubmFtZXx8ZS5jb2RlfHwiRXJyb3IiKSxlLnRpbWU9bmV3IERhdGUsbiYmKGUub3JpZ2luYWxFcnJvcj1uKSx0fHx7fSlpZigiWyI9PT1yWzBdJiYiXSI9PT1yW3IubGVuZ3RoLTFdKXtpZigiY29kZSI9PT0ocj1yLnNsaWNlKDEsLTEpKXx8Im1lc3NhZ2UiPT09ciljb250aW51ZTtlWyJbIityKyJdIl09IlNlZSBlcnJvci4iK3IrIiBmb3IgZGV0YWlscy4iLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIse3ZhbHVlOmVbcl18fHQmJnRbcl18fG4mJm5bcl0sZW51bWVyYWJsZTohMSx3cml0YWJsZTohMH0pfXJldHVybiBlfSxpbmhlcml0OmZ1bmN0aW9uKGUsdCl7dmFyIG49bnVsbDtpZih2b2lkIDA9PT10KXQ9ZSxlPU9iamVjdCxuPXt9O2Vsc2V7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLG49bmV3IHJ9cmV0dXJuIHQuY29uc3RydWN0b3I9PT1PYmplY3QmJih0LmNvbnN0cnVjdG9yPWZ1bmN0aW9uKCl7aWYoZSE9PU9iamVjdClyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSx0LmNvbnN0cnVjdG9yLnByb3RvdHlwZT1uLGkudXBkYXRlKHQuY29uc3RydWN0b3IucHJvdG90eXBlLHQpLHQuY29uc3RydWN0b3IuX19zdXBlcl9fPWUsdC5jb25zdHJ1Y3Rvcn0sbWl4aW46ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzWzBdLHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKWZvcih2YXIgbiBpbiBhcmd1bWVudHNbdF0ucHJvdG90eXBlKXt2YXIgcj1hcmd1bWVudHNbdF0ucHJvdG90eXBlW25dOyJjb25zdHJ1Y3RvciIhPT1uJiYoZS5wcm90b3R5cGVbbl09cil9cmV0dXJuIGV9LGhpZGVQcm9wZXJ0aWVzOmZ1bmN0aW9uKGUsdCl7ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSYmaS5hcnJheUVhY2godCwoZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX0pKX0scHJvcGVydHk6ZnVuY3Rpb24oZSx0LG4scixvKXt2YXIgaT17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6dm9pZCAwPT09cnx8cn07ImZ1bmN0aW9uIiE9dHlwZW9mIG58fG8/KGkudmFsdWU9bixpLndyaXRhYmxlPSEwKTppLmdldD1uLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsaSl9LG1lbW9pemVkUHJvcGVydHk6ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89bnVsbDtpLnByb3BlcnR5KGUsdCwoZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09PW8mJihvPW4oKSksb30pLHIpfSxob2lzdFBheWxvYWRNZW1iZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXF1ZXN0LG49dC5vcGVyYXRpb24scj10LnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbbl0sbz1yLm91dHB1dDtpZihvLnBheWxvYWQmJiFyLmhhc0V2ZW50T3V0cHV0KXt2YXIgcz1vLm1lbWJlcnNbby5wYXlsb2FkXSxhPWUuZGF0YVtvLnBheWxvYWRdOyJzdHJ1Y3R1cmUiPT09cy50eXBlJiZpLmVhY2goYSwoZnVuY3Rpb24odCxuKXtpLnByb3BlcnR5KGUuZGF0YSx0LG4sITEpfSkpfX0sY29tcHV0ZVNoYTI1NjpmdW5jdGlvbih0LG4pe2lmKGkuaXNOb2RlKCkpe3ZhciByPWkuc3RyZWFtLlN0cmVhbSxvPWUoImZzIik7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHImJnQgaW5zdGFuY2VvZiByKXtpZigic3RyaW5nIiE9dHlwZW9mIHQucGF0aClyZXR1cm4gbihuZXcgRXJyb3IoIk5vbi1maWxlIHN0cmVhbSBvYmplY3RzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggU2lnVjQiKSk7dmFyIHM9e307Im51bWJlciI9PXR5cGVvZiB0LnN0YXJ0JiYocy5zdGFydD10LnN0YXJ0KSwibnVtYmVyIj09dHlwZW9mIHQuZW5kJiYocy5lbmQ9dC5lbmQpLHQ9by5jcmVhdGVSZWFkU3RyZWFtKHQucGF0aCxzKX19aS5jcnlwdG8uc2hhMjU2KHQsImhleCIsKGZ1bmN0aW9uKGUsdCl7ZT9uKGUpOm4obnVsbCx0KX0pKX0saXNDbG9ja1NrZXdlZDpmdW5jdGlvbihlKXtpZihlKXJldHVybiBpLnByb3BlcnR5KG8uY29uZmlnLCJpc0Nsb2NrU2tld2VkIixNYXRoLmFicygobmV3IERhdGUpLmdldFRpbWUoKS1lKT49M2U1LCExKSxvLmNvbmZpZy5pc0Nsb2NrU2tld2VkfSxhcHBseUNsb2NrT2Zmc2V0OmZ1bmN0aW9uKGUpe2UmJihvLmNvbmZpZy5zeXN0ZW1DbG9ja09mZnNldD1lLShuZXcgRGF0ZSkuZ2V0VGltZSgpKX0sZXh0cmFjdFJlcXVlc3RJZDpmdW5jdGlvbihlKXt2YXIgdD1lLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtei1yZXF1ZXN0LWlkIl18fGUuaHR0cFJlc3BvbnNlLmhlYWRlcnNbIngtYW16bi1yZXF1ZXN0aWQiXTshdCYmZS5kYXRhJiZlLmRhdGEuUmVzcG9uc2VNZXRhZGF0YSYmKHQ9ZS5kYXRhLlJlc3BvbnNlTWV0YWRhdGEuUmVxdWVzdElkKSx0JiYoZS5yZXF1ZXN0SWQ9dCksZS5lcnJvciYmKGUuZXJyb3IucmVxdWVzdElkPXQpfSxhZGRQcm9taXNlczpmdW5jdGlvbihlLHQpe3ZhciBuPSExO3ZvaWQgMD09PXQmJm8mJm8uY29uZmlnJiYodD1vLmNvbmZpZy5nZXRQcm9taXNlc0RlcGVuZGVuY3koKSksdm9pZCAwPT09dCYmInVuZGVmaW5lZCIhPXR5cGVvZiBQcm9taXNlJiYodD1Qcm9taXNlKSwiZnVuY3Rpb24iIT10eXBlb2YgdCYmKG49ITApLEFycmF5LmlzQXJyYXkoZSl8fChlPVtlXSk7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBpPWVbcl07bj9pLmRlbGV0ZVByb21pc2VzRnJvbUNsYXNzJiZpLmRlbGV0ZVByb21pc2VzRnJvbUNsYXNzKCk6aS5hZGRQcm9taXNlc1RvQ2xhc3MmJmkuYWRkUHJvbWlzZXNUb0NsYXNzKHQpfX0scHJvbWlzaWZ5TWV0aG9kOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcyxyPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7cmV0dXJuIG5ldyB0KChmdW5jdGlvbih0LG8pe3IucHVzaCgoZnVuY3Rpb24oZSxuKXtlP28oZSk6dChuKX0pKSxuW2VdLmFwcGx5KG4scil9KSl9fSxpc0R1YWxzdGFja0F2YWlsYWJsZTpmdW5jdGlvbih0KXtpZighdClyZXR1cm4hMTt2YXIgbj1lKCIuLi9hcGlzL21ldGFkYXRhLmpzb24iKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJih0PXQuc2VydmljZUlkZW50aWZpZXIpLCEoInN0cmluZyIhPXR5cGVvZiB0fHwhbi5oYXNPd25Qcm9wZXJ0eSh0KXx8IW5bdF0uZHVhbHN0YWNrQXZhaWxhYmxlKX0sY2FsY3VsYXRlUmV0cnlEZWxheTpmdW5jdGlvbihlLHQsbil7dHx8KHQ9e30pO3ZhciByPXQuY3VzdG9tQmFja29mZnx8bnVsbDtpZigiZnVuY3Rpb24iPT10eXBlb2YgcilyZXR1cm4gcihlLG4pO3ZhciBvPSJudW1iZXIiPT10eXBlb2YgdC5iYXNlP3QuYmFzZToxMDA7cmV0dXJuIE1hdGgucmFuZG9tKCkqKE1hdGgucG93KDIsZSkqbyl9LGhhbmRsZVJlcXVlc3RXaXRoUmV0cmllczpmdW5jdGlvbihlLHQsbil7dHx8KHQ9e30pO3ZhciByPW8uSHR0cENsaWVudC5nZXRJbnN0YW5jZSgpLHM9dC5odHRwT3B0aW9uc3x8e30sYT0wLGM9ZnVuY3Rpb24oZSl7dmFyIHI9dC5tYXhSZXRyaWVzfHwwO2lmKGUmJiJUaW1lb3V0RXJyb3IiPT09ZS5jb2RlJiYoZS5yZXRyeWFibGU9ITApLGUmJmUucmV0cnlhYmxlJiZhPHIpe3ZhciBvPWkuY2FsY3VsYXRlUmV0cnlEZWxheShhLHQucmV0cnlEZWxheU9wdGlvbnMsZSk7aWYobz49MClyZXR1cm4gYSsrLHZvaWQgc2V0VGltZW91dCh1LG8rKGUucmV0cnlBZnRlcnx8MCkpfW4oZSl9LHU9ZnVuY3Rpb24oKXt2YXIgdD0iIjtyLmhhbmRsZVJlcXVlc3QoZSxzLChmdW5jdGlvbihlKXtlLm9uKCJkYXRhIiwoZnVuY3Rpb24oZSl7dCs9ZS50b1N0cmluZygpfSkpLGUub24oImVuZCIsKGZ1bmN0aW9uKCl7dmFyIHI9ZS5zdGF0dXNDb2RlO2lmKHI8MzAwKW4obnVsbCx0KTtlbHNle3ZhciBvPTFlMypwYXJzZUludChlLmhlYWRlcnNbInJldHJ5LWFmdGVyIl0sMTApfHwwLHM9aS5lcnJvcihuZXcgRXJyb3Ise3N0YXR1c0NvZGU6cixyZXRyeWFibGU6cj49NTAwfHw0Mjk9PT1yfSk7byYmcy5yZXRyeWFibGUmJihzLnJldHJ5QWZ0ZXI9byksYyhzKX19KSl9KSxjKX07by51dGlsLmRlZmVyKHUpfSx1dWlkOnt2NDpmdW5jdGlvbigpe3JldHVybiBlKCJ1dWlkIikudjQoKX19LGNvbnZlcnRQYXlsb2FkVG9TdHJpbmc6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXF1ZXN0LG49dC5vcGVyYXRpb24scj10LnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbbl0ub3V0cHV0fHx7fTtyLnBheWxvYWQmJmUuZGF0YVtyLnBheWxvYWRdJiYoZS5kYXRhW3IucGF5bG9hZF09ZS5kYXRhW3IucGF5bG9hZF0udG9TdHJpbmcoKSl9LGRlZmVyOmZ1bmN0aW9uKGUpeyJvYmplY3QiPT10eXBlb2YgbiYmImZ1bmN0aW9uIj09dHlwZW9mIG4ubmV4dFRpY2s/bi5uZXh0VGljayhlKToiZnVuY3Rpb24iPT10eXBlb2Ygcj9yKGUpOnNldFRpbWVvdXQoZSwwKX0sZ2V0UmVxdWVzdFBheWxvYWRTaGFwZTpmdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnM7aWYodCl7dmFyIG49KHR8fHt9KVtlLm9wZXJhdGlvbl07aWYobiYmbi5pbnB1dCYmbi5pbnB1dC5wYXlsb2FkKXJldHVybiBuLmlucHV0Lm1lbWJlcnNbbi5pbnB1dC5wYXlsb2FkXX19LGdldFByb2ZpbGVzRnJvbVNoYXJlZENvbmZpZzpmdW5jdGlvbihlLHQpe3ZhciByPXt9LG89e307bi5lbnZbaS5jb25maWdPcHRJbkVudl0mJihvPWUubG9hZEZyb20oe2lzQ29uZmlnOiEwLGZpbGVuYW1lOm4uZW52W2kuc2hhcmVkQ29uZmlnRmlsZUVudl19KSk7dmFyIHM9e307dHJ5e3M9ZS5sb2FkRnJvbSh7ZmlsZW5hbWU6dHx8bi5lbnZbaS5jb25maWdPcHRJbkVudl0mJm4uZW52W2kuc2hhcmVkQ3JlZGVudGlhbHNGaWxlRW52XX0pfWNhdGNoKGUpe2lmKCFuLmVudltpLmNvbmZpZ09wdEluRW52XSl0aHJvdyBlfWZvcih2YXIgYT0wLGM9T2JqZWN0LmtleXMobyk7YTxjLmxlbmd0aDthKyspcltjW2FdXT11KHJbY1thXV18fHt9LG9bY1thXV0pO2ZvcihhPTAsYz1PYmplY3Qua2V5cyhzKTthPGMubGVuZ3RoO2ErKylyW2NbYV1dPXUocltjW2FdXXx8e30sc1tjW2FdXSk7cmV0dXJuIHI7ZnVuY3Rpb24gdShlLHQpe2Zvcih2YXIgbj0wLHI9T2JqZWN0LmtleXModCk7bjxyLmxlbmd0aDtuKyspZVtyW25dXT10W3Jbbl1dO3JldHVybiBlfX0sQVJOOnt2YWxpZGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmMD09PWUuaW5kZXhPZigiYXJuOiIpJiZlLnNwbGl0KCI6IikubGVuZ3RoPj02fSxwYXJzZTpmdW5jdGlvbihlKXt2YXIgdD1lLnNwbGl0KCI6Iik7cmV0dXJue3BhcnRpdGlvbjp0WzFdLHNlcnZpY2U6dFsyXSxyZWdpb246dFszXSxhY2NvdW50SWQ6dFs0XSxyZXNvdXJjZTp0LnNsaWNlKDUpLmpvaW4oIjoiKX19LGJ1aWxkOmZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWUuc2VydmljZXx8dm9pZCAwPT09ZS5yZWdpb258fHZvaWQgMD09PWUuYWNjb3VudElkfHx2b2lkIDA9PT1lLnJlc291cmNlKXRocm93IGkuZXJyb3IobmV3IEVycm9yKCJJbnB1dCBBUk4gb2JqZWN0IGlzIGludmFsaWQiKSk7cmV0dXJuImFybjoiKyhlLnBhcnRpdGlvbnx8ImF3cyIpKyI6IitlLnNlcnZpY2UrIjoiK2UucmVnaW9uKyI6IitlLmFjY291bnRJZCsiOiIrZS5yZXNvdXJjZX19LGRlZmF1bHRQcm9maWxlOiJkZWZhdWx0Iixjb25maWdPcHRJbkVudjoiQVdTX1NES19MT0FEX0NPTkZJRyIsc2hhcmVkQ3JlZGVudGlhbHNGaWxlRW52OiJBV1NfU0hBUkVEX0NSRURFTlRJQUxTX0ZJTEUiLHNoYXJlZENvbmZpZ0ZpbGVFbnY6IkFXU19DT05GSUdfRklMRSIsaW1kc0Rpc2FibGVkRW52OiJBV1NfRUMyX01FVEFEQVRBX0RJU0FCTEVEIn07dC5leHBvcnRzPWl9KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIiksZSgidGltZXJzIikuc2V0SW1tZWRpYXRlKX0seyIuLi9hcGlzL21ldGFkYXRhLmpzb24iOjQsIi4vY29yZSI6MTksX3Byb2Nlc3M6OTEsZnM6ODIsdGltZXJzOjk5LHV1aWQ6MTAyfV0sNzU6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIiksbz1lKCIuLi9tb2RlbC9zaGFwZSIpO2Z1bmN0aW9uIGkoKXt9ZnVuY3Rpb24gcyhlLHQpe2Zvcih2YXIgbj1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpLHI9MCxvPW4ubGVuZ3RoO3I8bztyKyspaWYobltyXS5wYXJlbnROb2RlPT09ZSlyZXR1cm4gbltyXX1mdW5jdGlvbiBhKGUsdCl7c3dpdGNoKHR8fCh0PXt9KSx0LnR5cGUpe2Nhc2Uic3RydWN0dXJlIjpyZXR1cm4gYyhlLHQpO2Nhc2UibWFwIjpyZXR1cm4gZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49e30scj10LmtleS5uYW1lfHwia2V5IixvPXQudmFsdWUubmFtZXx8InZhbHVlIixpPXQuZmxhdHRlbmVkP3QubmFtZToiZW50cnkiLGM9ZS5maXJzdEVsZW1lbnRDaGlsZDtjOyl7aWYoYy5ub2RlTmFtZT09PWkpe3ZhciB1PXMoYyxyKS50ZXh0Q29udGVudCxsPXMoYyxvKTtuW3VdPWEobCx0LnZhbHVlKX1jPWMubmV4dEVsZW1lbnRTaWJsaW5nfXJldHVybiBufShlLHQpO2Nhc2UibGlzdCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVtdLHI9dC5mbGF0dGVuZWQ/dC5uYW1lOnQubWVtYmVyLm5hbWV8fCJtZW1iZXIiLG89ZS5maXJzdEVsZW1lbnRDaGlsZDtvOylvLm5vZGVOYW1lPT09ciYmbi5wdXNoKGEobyx0Lm1lbWJlcikpLG89by5uZXh0RWxlbWVudFNpYmxpbmc7cmV0dXJuIG59KGUsdCk7Y2FzZSB2b2lkIDA6Y2FzZSBudWxsOnJldHVybiBmdW5jdGlvbihlKXtpZihudWxsPT1lKXJldHVybiIiO2lmKCFlLmZpcnN0RWxlbWVudENoaWxkKXJldHVybiBudWxsPT09ZS5wYXJlbnROb2RlLnBhcmVudE5vZGU/e306MD09PWUuY2hpbGROb2Rlcy5sZW5ndGg/IiI6ZS50ZXh0Q29udGVudDtmb3IodmFyIHQ9e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX0sbj1lLmZpcnN0RWxlbWVudENoaWxkO247KXt2YXIgcj1uLm5vZGVOYW1lO09iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0Lm1lbWJlcnMscik/dC5tZW1iZXJzW3JdLnR5cGU9Imxpc3QiOnQubWVtYmVyc1tyXT17bmFtZTpyfSxuPW4ubmV4dEVsZW1lbnRTaWJsaW5nfXJldHVybiBjKGUsdCl9KGUpO2RlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYoZS5nZXRBdHRyaWJ1dGUpe3ZhciBuPWUuZ2V0QXR0cmlidXRlKCJlbmNvZGluZyIpOyJiYXNlNjQiPT09biYmKHQ9bmV3IG8uY3JlYXRlKHt0eXBlOm59KSl9dmFyIHI9ZS50ZXh0Q29udGVudDtyZXR1cm4iIj09PXImJihyPW51bGwpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LnRvVHlwZT90LnRvVHlwZShyKTpyfShlLHQpfX1mdW5jdGlvbiBjKGUsdCl7dmFyIG49e307cmV0dXJuIG51bGw9PT1lfHxyLmVhY2godC5tZW1iZXJzLChmdW5jdGlvbihyLG8pe2lmKG8uaXNYbWxBdHRyaWJ1dGUpe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLmF0dHJpYnV0ZXMsby5uYW1lKSl7dmFyIGk9ZS5hdHRyaWJ1dGVzW28ubmFtZV0udmFsdWU7bltyXT1hKHt0ZXh0Q29udGVudDppfSxvKX19ZWxzZXt2YXIgYz1vLmZsYXR0ZW5lZD9lOnMoZSxvLm5hbWUpO2M/bltyXT1hKGMsbyk6by5mbGF0dGVuZWR8fCJsaXN0IiE9PW8udHlwZXx8dC5hcGkueG1sTm9EZWZhdWx0TGlzdHN8fChuW3JdPW8uZGVmYXVsdFZhbHVlKX19KSksbn1pLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihlLHQpe2lmKCIiPT09ZS5yZXBsYWNlKC9eXHMrLywiIikpcmV0dXJue307dmFyIG4sbzt0cnl7aWYod2luZG93LkRPTVBhcnNlcil7dHJ5e249KG5ldyBET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhlLCJ0ZXh0L3htbCIpfWNhdGNoKGUpe3Rocm93IHIuZXJyb3IobmV3IEVycm9yKCJQYXJzZSBlcnJvciBpbiBkb2N1bWVudCIpLHtvcmlnaW5hbEVycm9yOmUsY29kZToiWE1MUGFyc2VyRXJyb3IiLHJldHJ5YWJsZTohMH0pfWlmKG51bGw9PT1uLmRvY3VtZW50RWxlbWVudCl0aHJvdyByLmVycm9yKG5ldyBFcnJvcigiQ2Fubm90IHBhcnNlIGVtcHR5IGRvY3VtZW50LiIpLHtjb2RlOiJYTUxQYXJzZXJFcnJvciIscmV0cnlhYmxlOiEwfSk7dmFyIGk9bi5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKVswXTtpZihpJiYoaS5wYXJlbnROb2RlPT09bnx8ImJvZHkiPT09aS5wYXJlbnROb2RlLm5vZGVOYW1lfHxpLnBhcmVudE5vZGUucGFyZW50Tm9kZT09PW58fCJib2R5Ij09PWkucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSl7dmFyIGM9aS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2IilbMF18fGk7dGhyb3cgci5lcnJvcihuZXcgRXJyb3IoYy50ZXh0Q29udGVudHx8IlBhcnNlciBlcnJvciBpbiBkb2N1bWVudCIpLHtjb2RlOiJYTUxQYXJzZXJFcnJvciIscmV0cnlhYmxlOiEwfSl9fWVsc2V7aWYoIXdpbmRvdy5BY3RpdmVYT2JqZWN0KXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGxvYWQgWE1MIHBhcnNlciIpO2lmKChuPW5ldyB3aW5kb3cuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpKS5hc3luYz0hMSwhbi5sb2FkWE1MKGUpKXRocm93IHIuZXJyb3IobmV3IEVycm9yKCJQYXJzZSBlcnJvciBpbiBkb2N1bWVudCIpLHtjb2RlOiJYTUxQYXJzZXJFcnJvciIscmV0cnlhYmxlOiEwfSl9fWNhdGNoKGUpe289ZX1pZihuJiZuLmRvY3VtZW50RWxlbWVudCYmIW8pe3ZhciB1PWEobi5kb2N1bWVudEVsZW1lbnQsdCksbD1zKG4uZG9jdW1lbnRFbGVtZW50LCJSZXNwb25zZU1ldGFkYXRhIik7cmV0dXJuIGwmJih1LlJlc3BvbnNlTWV0YWRhdGE9YShsLHt9KSksdX1pZihvKXRocm93IHIuZXJyb3Iob3x8bmV3IEVycm9yLHtjb2RlOiJYTUxQYXJzZXJFcnJvciIscmV0cnlhYmxlOiEwfSk7cmV0dXJue319LHQuZXhwb3J0cz1pfSx7Ii4uL21vZGVsL3NoYXBlIjo0NSwiLi4vdXRpbCI6NzR9XSw3NjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKSxvPWUoIi4veG1sLW5vZGUiKS5YbWxOb2RlLGk9ZSgiLi94bWwtdGV4dCIpLlhtbFRleHQ7ZnVuY3Rpb24gcygpe31mdW5jdGlvbiBhKGUsdCxuKXtzd2l0Y2gobi50eXBlKXtjYXNlInN0cnVjdHVyZSI6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXtyLmFycmF5RWFjaChuLm1lbWJlck5hbWVzLChmdW5jdGlvbihyKXt2YXIgaT1uLm1lbWJlcnNbcl07aWYoImJvZHkiPT09aS5sb2NhdGlvbil7dmFyIHM9dFtyXSx1PWkubmFtZTtpZihudWxsIT1zKWlmKGkuaXNYbWxBdHRyaWJ1dGUpZS5hZGRBdHRyaWJ1dGUodSxzKTtlbHNlIGlmKGkuZmxhdHRlbmVkKWEoZSxzLGkpO2Vsc2V7dmFyIGw9bmV3IG8odSk7ZS5hZGRDaGlsZE5vZGUobCksYyhsLGkpLGEobCxzLGkpfX19KSl9KGUsdCxuKTtjYXNlIm1hcCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1uLmtleS5uYW1lfHwia2V5IixzPW4udmFsdWUubmFtZXx8InZhbHVlIjtyLmVhY2godCwoZnVuY3Rpb24odCxyKXt2YXIgYz1uZXcgbyhuLmZsYXR0ZW5lZD9uLm5hbWU6ImVudHJ5Iik7ZS5hZGRDaGlsZE5vZGUoYyk7dmFyIHU9bmV3IG8oaSksbD1uZXcgbyhzKTtjLmFkZENoaWxkTm9kZSh1KSxjLmFkZENoaWxkTm9kZShsKSxhKHUsdCxuLmtleSksYShsLHIsbi52YWx1ZSl9KSl9KGUsdCxuKTtjYXNlImxpc3QiOnJldHVybiBmdW5jdGlvbihlLHQsbil7bi5mbGF0dGVuZWQ/ci5hcnJheUVhY2godCwoZnVuY3Rpb24odCl7dmFyIHI9bi5tZW1iZXIubmFtZXx8bi5uYW1lLGk9bmV3IG8ocik7ZS5hZGRDaGlsZE5vZGUoaSksYShpLHQsbi5tZW1iZXIpfSkpOnIuYXJyYXlFYWNoKHQsKGZ1bmN0aW9uKHQpe3ZhciByPW4ubWVtYmVyLm5hbWV8fCJtZW1iZXIiLGk9bmV3IG8ocik7ZS5hZGRDaGlsZE5vZGUoaSksYShpLHQsbi5tZW1iZXIpfSkpfShlLHQsbik7ZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe2UuYWRkQ2hpbGROb2RlKG5ldyBpKG4udG9XaXJlRm9ybWF0KHQpKSl9KGUsdCxuKX19ZnVuY3Rpb24gYyhlLHQsbil7dmFyIHIsbz0ieG1sbnMiO3QueG1sTmFtZXNwYWNlVXJpPyhyPXQueG1sTmFtZXNwYWNlVXJpLHQueG1sTmFtZXNwYWNlUHJlZml4JiYobys9IjoiK3QueG1sTmFtZXNwYWNlUHJlZml4KSk6biYmdC5hcGkueG1sTmFtZXNwYWNlVXJpJiYocj10LmFwaS54bWxOYW1lc3BhY2VVcmkpLHImJmUuYWRkQXR0cmlidXRlKG8scil9cy5wcm90b3R5cGUudG9YTUw9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9bmV3IG8obik7cmV0dXJuIGMoaSx0LCEwKSxhKGksZSx0KSxpLmNoaWxkcmVuLmxlbmd0aD4wfHxyP2kudG9TdHJpbmcoKToiIn0sdC5leHBvcnRzPXN9LHsiLi4vdXRpbCI6NzQsIi4veG1sLW5vZGUiOjc5LCIuL3htbC10ZXh0Ijo4MH1dLDc3OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXtlc2NhcGVBdHRyaWJ1dGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLycvZywiJmFwb3M7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKX19fSx7fV0sNzg6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e2VzY2FwZUVsZW1lbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoL1xyL2csIiYjeDBEOyIpLnJlcGxhY2UoL1xuL2csIiYjeDBBOyIpLnJlcGxhY2UoL1x1MDA4NS9nLCImI3g4NTsiKS5yZXBsYWNlKC9cdTIwMjgvLCImI3gyMDI4OyIpfX19LHt9XSw3OTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vZXNjYXBlLWF0dHJpYnV0ZSIpLmVzY2FwZUF0dHJpYnV0ZTtmdW5jdGlvbiBvKGUsdCl7dm9pZCAwPT09dCYmKHQ9W10pLHRoaXMubmFtZT1lLHRoaXMuY2hpbGRyZW49dCx0aGlzLmF0dHJpYnV0ZXM9e319by5wcm90b3R5cGUuYWRkQXR0cmlidXRlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1tlXT10LHRoaXN9LG8ucHJvdG90eXBlLmFkZENoaWxkTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jaGlsZHJlbi5wdXNoKGUpLHRoaXN9LG8ucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZT1mdW5jdGlvbihlKXtyZXR1cm4gZGVsZXRlIHRoaXMuYXR0cmlidXRlc1tlXSx0aGlzfSxvLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2Zvcih2YXIgZT1Cb29sZWFuKHRoaXMuY2hpbGRyZW4ubGVuZ3RoKSx0PSI8Iit0aGlzLm5hbWUsbj10aGlzLmF0dHJpYnV0ZXMsbz0wLGk9T2JqZWN0LmtleXMobik7bzxpLmxlbmd0aDtvKyspe3ZhciBzPWlbb10sYT1uW3NdO251bGwhPWEmJih0Kz0iICIrcysnPSInK3IoIiIrYSkrJyInKX1yZXR1cm4gdCsoZT8iPiIrdGhpcy5jaGlsZHJlbi5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRvU3RyaW5nKCl9KSkuam9pbigiIikrIjwvIit0aGlzLm5hbWUrIj4iOiIvPiIpfSx0LmV4cG9ydHM9e1htbE5vZGU6b319LHsiLi9lc2NhcGUtYXR0cmlidXRlIjo3N31dLDgwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9lc2NhcGUtZWxlbWVudCIpLmVzY2FwZUVsZW1lbnQ7ZnVuY3Rpb24gbyhlKXt0aGlzLnZhbHVlPWV9by5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gcigiIit0aGlzLnZhbHVlKX0sdC5leHBvcnRzPXtYbWxUZXh0Om99fSx7Ii4vZXNjYXBlLWVsZW1lbnQiOjc4fV0sODE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5ieXRlTGVuZ3RoPWZ1bmN0aW9uKGUpe3ZhciB0PWMoZSksbj10WzBdLHI9dFsxXTtyZXR1cm4gMyoobityKS80LXJ9LG4udG9CeXRlQXJyYXk9ZnVuY3Rpb24oZSl7dmFyIHQsbixyPWMoZSkscz1yWzBdLGE9clsxXSx1PW5ldyBpKGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gMyoodCtuKS80LW59KDAscyxhKSksbD0wLHA9YT4wP3MtNDpzO2ZvcihuPTA7bjxwO24rPTQpdD1vW2UuY2hhckNvZGVBdChuKV08PDE4fG9bZS5jaGFyQ29kZUF0KG4rMSldPDwxMnxvW2UuY2hhckNvZGVBdChuKzIpXTw8NnxvW2UuY2hhckNvZGVBdChuKzMpXSx1W2wrK109dD4+MTYmMjU1LHVbbCsrXT10Pj44JjI1NSx1W2wrK109MjU1JnQ7cmV0dXJuIDI9PT1hJiYodD1vW2UuY2hhckNvZGVBdChuKV08PDJ8b1tlLmNoYXJDb2RlQXQobisxKV0+PjQsdVtsKytdPTI1NSZ0KSwxPT09YSYmKHQ9b1tlLmNoYXJDb2RlQXQobildPDwxMHxvW2UuY2hhckNvZGVBdChuKzEpXTw8NHxvW2UuY2hhckNvZGVBdChuKzIpXT4+Mix1W2wrK109dD4+OCYyNTUsdVtsKytdPTI1NSZ0KSx1fSxuLmZyb21CeXRlQXJyYXk9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49ZS5sZW5ndGgsbz1uJTMsaT1bXSxzPTE2MzgzLGE9MCxjPW4tbzthPGM7YSs9cylpLnB1c2godShlLGEsYStzPmM/YzphK3MpKTtyZXR1cm4gMT09PW8/KHQ9ZVtuLTFdLGkucHVzaChyW3Q+PjJdK3JbdDw8NCY2M10rIj09IikpOjI9PT1vJiYodD0oZVtuLTJdPDw4KStlW24tMV0saS5wdXNoKHJbdD4+MTBdK3JbdD4+NCY2M10rclt0PDwyJjYzXSsiPSIpKSxpLmpvaW4oIiIpfTtmb3IodmFyIHI9W10sbz1bXSxpPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LHM9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGE9MDthPDY0OysrYSlyW2FdPXNbYV0sb1tzLmNoYXJDb2RlQXQoYSldPWE7ZnVuY3Rpb24gYyhlKXt2YXIgdD1lLmxlbmd0aDtpZih0JTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTt2YXIgbj1lLmluZGV4T2YoIj0iKTtyZXR1cm4tMT09PW4mJihuPXQpLFtuLG49PT10PzA6NC1uJTRdfWZ1bmN0aW9uIHUoZSx0LG4pe2Zvcih2YXIgbyxpLHM9W10sYT10O2E8bjthKz0zKW89KGVbYV08PDE2JjE2NzExNjgwKSsoZVthKzFdPDw4JjY1MjgwKSsoMjU1JmVbYSsyXSkscy5wdXNoKHJbKGk9byk+PjE4JjYzXStyW2k+PjEyJjYzXStyW2k+PjYmNjNdK3JbNjMmaV0pO3JldHVybiBzLmpvaW4oIiIpfW9bIi0iLmNoYXJDb2RlQXQoMCldPTYyLG9bIl8iLmNoYXJDb2RlQXQoMCldPTYzfSx7fV0sODI6W2Z1bmN0aW9uKGUsdCxuKXt9LHt9XSw4MzpbZnVuY3Rpb24oZSx0LG4peyJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuY3JlYXRlP3QuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2Uuc3VwZXJfPXQsZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSl9OnQuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2Uuc3VwZXJfPXQ7dmFyIG49ZnVuY3Rpb24oKXt9O24ucHJvdG90eXBlPXQucHJvdG90eXBlLGUucHJvdG90eXBlPW5ldyBuLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWV9fSx7fV0sODQ6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJvYmplY3QiPT10eXBlb2YgZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY29weSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZmlsbCYmImZ1bmN0aW9uIj09dHlwZW9mIGUucmVhZFVJbnQ4fX0se31dLDg1OltmdW5jdGlvbihlLHQscil7KGZ1bmN0aW9uKHQsbil7KGZ1bmN0aW9uKCl7dmFyIG89LyVbc2RqJV0vZztyLmZvcm1hdD1mdW5jdGlvbihlKXtpZighdihlKSl7Zm9yKHZhciB0PVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXQucHVzaChhKGFyZ3VtZW50c1tuXSkpO3JldHVybiB0LmpvaW4oIiAiKX1uPTE7Zm9yKHZhciByPWFyZ3VtZW50cyxpPXIubGVuZ3RoLHM9U3RyaW5nKGUpLnJlcGxhY2UobywoZnVuY3Rpb24oZSl7aWYoIiUlIj09PWUpcmV0dXJuIiUiO2lmKG4+PWkpcmV0dXJuIGU7c3dpdGNoKGUpe2Nhc2UiJXMiOnJldHVybiBTdHJpbmcocltuKytdKTtjYXNlIiVkIjpyZXR1cm4gTnVtYmVyKHJbbisrXSk7Y2FzZSIlaiI6dHJ5e3JldHVybiBKU09OLnN0cmluZ2lmeShyW24rK10pfWNhdGNoKGUpe3JldHVybiJbQ2lyY3VsYXJdIn1kZWZhdWx0OnJldHVybiBlfX0pKSxjPXJbbl07bjxpO2M9clsrK25dKWcoYyl8fCFTKGMpP3MrPSIgIitjOnMrPSIgIithKGMpO3JldHVybiBzfSxyLmRlcHJlY2F0ZT1mdW5jdGlvbihlLG8pe2lmKHkobi5wcm9jZXNzKSlyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gci5kZXByZWNhdGUoZSxvKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2lmKCEwPT09dC5ub0RlcHJlY2F0aW9uKXJldHVybiBlO3ZhciBpPSExO3JldHVybiBmdW5jdGlvbigpe2lmKCFpKXtpZih0LnRocm93RGVwcmVjYXRpb24pdGhyb3cgbmV3IEVycm9yKG8pO3QudHJhY2VEZXByZWNhdGlvbj9jb25zb2xlLnRyYWNlKG8pOmNvbnNvbGUuZXJyb3IobyksaT0hMH1yZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fTt2YXIgaSxzPXt9O2Z1bmN0aW9uIGEoZSx0KXt2YXIgbj17c2VlbjpbXSxzdHlsaXplOnV9O3JldHVybiBhcmd1bWVudHMubGVuZ3RoPj0zJiYobi5kZXB0aD1hcmd1bWVudHNbMl0pLGFyZ3VtZW50cy5sZW5ndGg+PTQmJihuLmNvbG9ycz1hcmd1bWVudHNbM10pLGYodCk/bi5zaG93SGlkZGVuPXQ6dCYmci5fZXh0ZW5kKG4sdCkseShuLnNob3dIaWRkZW4pJiYobi5zaG93SGlkZGVuPSExKSx5KG4uZGVwdGgpJiYobi5kZXB0aD0yKSx5KG4uY29sb3JzKSYmKG4uY29sb3JzPSExKSx5KG4uY3VzdG9tSW5zcGVjdCkmJihuLmN1c3RvbUluc3BlY3Q9ITApLG4uY29sb3JzJiYobi5zdHlsaXplPWMpLGwobixlLG4uZGVwdGgpfWZ1bmN0aW9uIGMoZSx0KXt2YXIgbj1hLnN0eWxlc1t0XTtyZXR1cm4gbj8iG1siK2EuY29sb3JzW25dWzBdKyJtIitlKyIbWyIrYS5jb2xvcnNbbl1bMV0rIm0iOmV9ZnVuY3Rpb24gdShlLHQpe3JldHVybiBlfWZ1bmN0aW9uIGwoZSx0LG4pe2lmKGUuY3VzdG9tSW5zcGVjdCYmdCYmVCh0Lmluc3BlY3QpJiZ0Lmluc3BlY3QhPT1yLmluc3BlY3QmJighdC5jb25zdHJ1Y3Rvcnx8dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUhPT10KSl7dmFyIG89dC5pbnNwZWN0KG4sZSk7cmV0dXJuIHYobyl8fChvPWwoZSxvLG4pKSxvfXZhciBpPWZ1bmN0aW9uKGUsdCl7aWYoeSh0KSlyZXR1cm4gZS5zdHlsaXplKCJ1bmRlZmluZWQiLCJ1bmRlZmluZWQiKTtpZih2KHQpKXt2YXIgbj0iJyIrSlNPTi5zdHJpbmdpZnkodCkucmVwbGFjZSgvXiJ8IiQvZywiIikucmVwbGFjZSgvJy9nLCJcXCciKS5yZXBsYWNlKC9cXCIvZywnIicpKyInIjtyZXR1cm4gZS5zdHlsaXplKG4sInN0cmluZyIpfXJldHVybiBtKHQpP2Uuc3R5bGl6ZSgiIit0LCJudW1iZXIiKTpmKHQpP2Uuc3R5bGl6ZSgiIit0LCJib29sZWFuIik6Zyh0KT9lLnN0eWxpemUoIm51bGwiLCJudWxsIik6dm9pZCAwfShlLHQpO2lmKGkpcmV0dXJuIGk7dmFyIHM9T2JqZWN0LmtleXModCksYT1mdW5jdGlvbihlKXt2YXIgdD17fTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlLG4pe3RbZV09ITB9KSksdH0ocyk7aWYoZS5zaG93SGlkZGVuJiYocz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KSksQyh0KSYmKHMuaW5kZXhPZigibWVzc2FnZSIpPj0wfHxzLmluZGV4T2YoImRlc2NyaXB0aW9uIik+PTApKXJldHVybiBwKHQpO2lmKDA9PT1zLmxlbmd0aCl7aWYoVCh0KSl7dmFyIGM9dC5uYW1lPyI6ICIrdC5uYW1lOiIiO3JldHVybiBlLnN0eWxpemUoIltGdW5jdGlvbiIrYysiXSIsInNwZWNpYWwiKX1pZihFKHQpKXJldHVybiBlLnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLCJyZWdleHAiKTtpZihiKHQpKXJldHVybiBlLnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSwiZGF0ZSIpO2lmKEModCkpcmV0dXJuIHAodCl9dmFyIHUsUz0iIixJPSExLEE9WyJ7IiwifSJdO3JldHVybiBoKHQpJiYoST0hMCxBPVsiWyIsIl0iXSksVCh0KSYmKFM9IiBbRnVuY3Rpb24iKyh0Lm5hbWU/IjogIit0Lm5hbWU6IiIpKyJdIiksRSh0KSYmKFM9IiAiK1JlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSksYih0KSYmKFM9IiAiK0RhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodCkpLEModCkmJihTPSIgIitwKHQpKSwwIT09cy5sZW5ndGh8fEkmJjAhPXQubGVuZ3RoP248MD9FKHQpP2Uuc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCksInJlZ2V4cCIpOmUuc3R5bGl6ZSgiW09iamVjdF0iLCJzcGVjaWFsIik6KGUuc2Vlbi5wdXNoKHQpLHU9ST9mdW5jdGlvbihlLHQsbixyLG8pe2Zvcih2YXIgaT1bXSxzPTAsYT10Lmxlbmd0aDtzPGE7KytzKXcodCxTdHJpbmcocykpP2kucHVzaChkKGUsdCxuLHIsU3RyaW5nKHMpLCEwKSk6aS5wdXNoKCIiKTtyZXR1cm4gby5mb3JFYWNoKChmdW5jdGlvbihvKXtvLm1hdGNoKC9eXGQrJC8pfHxpLnB1c2goZChlLHQsbixyLG8sITApKX0pKSxpfShlLHQsbixhLHMpOnMubWFwKChmdW5jdGlvbihyKXtyZXR1cm4gZChlLHQsbixhLHIsSSl9KSksZS5zZWVuLnBvcCgpLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLnJlZHVjZSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5pbmRleE9mKCJcbiIpLGUrdC5yZXBsYWNlKC9cdTAwMWJcW1xkXGQ/bS9nLCIiKS5sZW5ndGgrMX0pLDApO3JldHVybiByPjYwP25bMF0rKCIiPT09dD8iIjp0KyJcbiAiKSsiICIrZS5qb2luKCIsXG4gICIpKyIgIituWzFdOm5bMF0rdCsiICIrZS5qb2luKCIsICIpKyIgIituWzFdfSh1LFMsQSkpOkFbMF0rUytBWzFdfWZ1bmN0aW9uIHAoZSl7cmV0dXJuIlsiK0Vycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKyJdIn1mdW5jdGlvbiBkKGUsdCxuLHIsbyxpKXt2YXIgcyxhLGM7aWYoKGM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LG8pfHx7dmFsdWU6dFtvXX0pLmdldD9hPWMuc2V0P2Uuc3R5bGl6ZSgiW0dldHRlci9TZXR0ZXJdIiwic3BlY2lhbCIpOmUuc3R5bGl6ZSgiW0dldHRlcl0iLCJzcGVjaWFsIik6Yy5zZXQmJihhPWUuc3R5bGl6ZSgiW1NldHRlcl0iLCJzcGVjaWFsIikpLHcocixvKXx8KHM9IlsiK28rIl0iKSxhfHwoZS5zZWVuLmluZGV4T2YoYy52YWx1ZSk8MD8oYT1nKG4pP2woZSxjLnZhbHVlLG51bGwpOmwoZSxjLnZhbHVlLG4tMSkpLmluZGV4T2YoIlxuIik+LTEmJihhPWk/YS5zcGxpdCgiXG4iKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiIgICIrZX0pKS5qb2luKCJcbiIpLnN1YnN0cigyKToiXG4iK2Euc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbihlKXtyZXR1cm4iICAgIitlfSkpLmpvaW4oIlxuIikpOmE9ZS5zdHlsaXplKCJbQ2lyY3VsYXJdIiwic3BlY2lhbCIpKSx5KHMpKXtpZihpJiZvLm1hdGNoKC9eXGQrJC8pKXJldHVybiBhOyhzPUpTT04uc3RyaW5naWZ5KCIiK28pKS5tYXRjaCgvXiIoW2EtekEtWl9dW2EtekEtWl8wLTldKikiJC8pPyhzPXMuc3Vic3RyKDEscy5sZW5ndGgtMikscz1lLnN0eWxpemUocywibmFtZSIpKToocz1zLnJlcGxhY2UoLycvZywiXFwnIikucmVwbGFjZSgvXFwiL2csJyInKS5yZXBsYWNlKC8oXiJ8IiQpL2csIiciKSxzPWUuc3R5bGl6ZShzLCJzdHJpbmciKSl9cmV0dXJuIHMrIjogIithfWZ1bmN0aW9uIGgoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSl9ZnVuY3Rpb24gZihlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIGcoZSl7cmV0dXJuIG51bGw9PT1lfWZ1bmN0aW9uIG0oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlfWZ1bmN0aW9uIHYoZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlfWZ1bmN0aW9uIHkoZSl7cmV0dXJuIHZvaWQgMD09PWV9ZnVuY3Rpb24gRShlKXtyZXR1cm4gUyhlKSYmIltvYmplY3QgUmVnRXhwXSI9PT1JKGUpfWZ1bmN0aW9uIFMoZSl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZX1mdW5jdGlvbiBiKGUpe3JldHVybiBTKGUpJiYiW29iamVjdCBEYXRlXSI9PT1JKGUpfWZ1bmN0aW9uIEMoZSl7cmV0dXJuIFMoZSkmJigiW29iamVjdCBFcnJvcl0iPT09SShlKXx8ZSBpbnN0YW5jZW9mIEVycm9yKX1mdW5jdGlvbiBUKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIEkoZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiBBKGUpe3JldHVybiBlPDEwPyIwIitlLnRvU3RyaW5nKDEwKTplLnRvU3RyaW5nKDEwKX1yLmRlYnVnbG9nPWZ1bmN0aW9uKGUpe2lmKHkoaSkmJihpPXQuZW52Lk5PREVfREVCVUd8fCIiKSxlPWUudG9VcHBlckNhc2UoKSwhc1tlXSlpZihuZXcgUmVnRXhwKCJcXGIiK2UrIlxcYiIsImkiKS50ZXN0KGkpKXt2YXIgbj10LnBpZDtzW2VdPWZ1bmN0aW9uKCl7dmFyIHQ9ci5mb3JtYXQuYXBwbHkocixhcmd1bWVudHMpO2NvbnNvbGUuZXJyb3IoIiVzICVkOiAlcyIsZSxuLHQpfX1lbHNlIHNbZV09ZnVuY3Rpb24oKXt9O3JldHVybiBzW2VdfSxyLmluc3BlY3Q9YSxhLmNvbG9ycz17Ym9sZDpbMSwyMl0saXRhbGljOlszLDIzXSx1bmRlcmxpbmU6WzQsMjRdLGludmVyc2U6WzcsMjddLHdoaXRlOlszNywzOV0sZ3JleTpbOTAsMzldLGJsYWNrOlszMCwzOV0sYmx1ZTpbMzQsMzldLGN5YW46WzM2LDM5XSxncmVlbjpbMzIsMzldLG1hZ2VudGE6WzM1LDM5XSxyZWQ6WzMxLDM5XSx5ZWxsb3c6WzMzLDM5XX0sYS5zdHlsZXM9e3NwZWNpYWw6ImN5YW4iLG51bWJlcjoieWVsbG93Iixib29sZWFuOiJ5ZWxsb3ciLHVuZGVmaW5lZDoiZ3JleSIsbnVsbDoiYm9sZCIsc3RyaW5nOiJncmVlbiIsZGF0ZToibWFnZW50YSIscmVnZXhwOiJyZWQifSxyLmlzQXJyYXk9aCxyLmlzQm9vbGVhbj1mLHIuaXNOdWxsPWcsci5pc051bGxPclVuZGVmaW5lZD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZX0sci5pc051bWJlcj1tLHIuaXNTdHJpbmc9dixyLmlzU3ltYm9sPWZ1bmN0aW9uKGUpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgZX0sci5pc1VuZGVmaW5lZD15LHIuaXNSZWdFeHA9RSxyLmlzT2JqZWN0PVMsci5pc0RhdGU9YixyLmlzRXJyb3I9QyxyLmlzRnVuY3Rpb249VCxyLmlzUHJpbWl0aXZlPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZXx8ImJvb2xlYW4iPT10eXBlb2YgZXx8Im51bWJlciI9PXR5cGVvZiBlfHwic3RyaW5nIj09dHlwZW9mIGV8fCJzeW1ib2wiPT10eXBlb2YgZXx8dm9pZCAwPT09ZX0sci5pc0J1ZmZlcj1lKCIuL3N1cHBvcnQvaXNCdWZmZXIiKTt2YXIgXz1bIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdO2Z1bmN0aW9uIHcoZSx0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9ci5sb2c9ZnVuY3Rpb24oKXt2YXIgZSx0O2NvbnNvbGUubG9nKCIlcyAtICVzIiwoZT1uZXcgRGF0ZSx0PVtBKGUuZ2V0SG91cnMoKSksQShlLmdldE1pbnV0ZXMoKSksQShlLmdldFNlY29uZHMoKSldLmpvaW4oIjoiKSxbZS5nZXREYXRlKCksX1tlLmdldE1vbnRoKCldLHRdLmpvaW4oIiAiKSksci5mb3JtYXQuYXBwbHkocixhcmd1bWVudHMpKX0sci5pbmhlcml0cz1lKCJpbmhlcml0cyIpLHIuX2V4dGVuZD1mdW5jdGlvbihlLHQpe2lmKCF0fHwhUyh0KSlyZXR1cm4gZTtmb3IodmFyIG49T2JqZWN0LmtleXModCkscj1uLmxlbmd0aDtyLS07KWVbbltyXV09dFtuW3JdXTtyZXR1cm4gZX19KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIiksdm9pZCAwIT09bi5nP24uZzoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7Ii4vc3VwcG9ydC9pc0J1ZmZlciI6ODQsX3Byb2Nlc3M6OTEsaW5oZXJpdHM6ODN9XSw4NjpbZnVuY3Rpb24oZSx0LHIpeyhmdW5jdGlvbih0LG4peyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1lKCJiYXNlNjQtanMiKSxvPWUoImllZWU3NTQiKSxpPWUoImlzYXJyYXkiKTtmdW5jdGlvbiBzKCl7cmV0dXJuIGMuVFlQRURfQVJSQVlfU1VQUE9SVD8yMTQ3NDgzNjQ3OjEwNzM3NDE4MjN9ZnVuY3Rpb24gYShlLHQpe2lmKHMoKTx0KXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCIpO3JldHVybiBjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KGU9bmV3IFVpbnQ4QXJyYXkodCkpLl9fcHJvdG9fXz1jLnByb3RvdHlwZToobnVsbD09PWUmJihlPW5ldyBjKHQpKSxlLmxlbmd0aD10KSxlfWZ1bmN0aW9uIGMoZSx0LG4pe2lmKCEoYy5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0aGlzIGluc3RhbmNlb2YgYykpcmV0dXJuIG5ldyBjKGUsdCxuKTtpZigibnVtYmVyIj09dHlwZW9mIGUpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoIklmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIik7cmV0dXJuIHAodGhpcyxlKX1yZXR1cm4gdSh0aGlzLGUsdCxuKX1mdW5jdGlvbiB1KGUsdCxuLHIpe2lmKCJudW1iZXIiPT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP2Z1bmN0aW9uKGUsdCxuLHIpe2lmKHQuYnl0ZUxlbmd0aCxuPDB8fHQuYnl0ZUxlbmd0aDxuKXRocm93IG5ldyBSYW5nZUVycm9yKCInb2Zmc2V0JyBpcyBvdXQgb2YgYm91bmRzIik7aWYodC5ieXRlTGVuZ3RoPG4rKHJ8fDApKXRocm93IG5ldyBSYW5nZUVycm9yKCInbGVuZ3RoJyBpcyBvdXQgb2YgYm91bmRzIik7cmV0dXJuIHQ9dm9pZCAwPT09biYmdm9pZCAwPT09cj9uZXcgVWludDhBcnJheSh0KTp2b2lkIDA9PT1yP25ldyBVaW50OEFycmF5KHQsbik6bmV3IFVpbnQ4QXJyYXkodCxuLHIpLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8oZT10KS5fX3Byb3RvX189Yy5wcm90b3R5cGU6ZT1kKGUsdCksZX0oZSx0LG4scik6InN0cmluZyI9PXR5cGVvZiB0P2Z1bmN0aW9uKGUsdCxuKXtpZigic3RyaW5nIj09dHlwZW9mIG4mJiIiIT09bnx8KG49InV0ZjgiKSwhYy5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJlbmNvZGluZyIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpO3ZhciByPTB8Zih0LG4pLG89KGU9YShlLHIpKS53cml0ZSh0LG4pO3JldHVybiBvIT09ciYmKGU9ZS5zbGljZSgwLG8pKSxlfShlLHQsbik6ZnVuY3Rpb24oZSx0KXtpZihjLmlzQnVmZmVyKHQpKXt2YXIgbj0wfGgodC5sZW5ndGgpO3JldHVybiAwPT09KGU9YShlLG4pKS5sZW5ndGh8fHQuY29weShlLDAsMCxuKSxlfWlmKHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJsZW5ndGgiaW4gdClyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIHQubGVuZ3RofHwocj10Lmxlbmd0aCkhPXI/YShlLDApOmQoZSx0KTtpZigiQnVmZmVyIj09PXQudHlwZSYmaSh0LmRhdGEpKXJldHVybiBkKGUsdC5kYXRhKX12YXIgcjt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9KGUsdCl9ZnVuY3Rpb24gbChlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKTtpZihlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpfWZ1bmN0aW9uIHAoZSx0KXtpZihsKHQpLGU9YShlLHQ8MD8wOjB8aCh0KSksIWMuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IodmFyIG49MDtuPHQ7KytuKWVbbl09MDtyZXR1cm4gZX1mdW5jdGlvbiBkKGUsdCl7dmFyIG49dC5sZW5ndGg8MD8wOjB8aCh0Lmxlbmd0aCk7ZT1hKGUsbik7Zm9yKHZhciByPTA7cjxuO3IrPTEpZVtyXT0yNTUmdFtyXTtyZXR1cm4gZX1mdW5jdGlvbiBoKGUpe2lmKGU+PXMoKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIrcygpLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8ZX1mdW5jdGlvbiBmKGUsdCl7aWYoYy5pc0J1ZmZlcihlKSlyZXR1cm4gZS5sZW5ndGg7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldyhlKXx8ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm4gZS5ieXRlTGVuZ3RoOyJzdHJpbmciIT10eXBlb2YgZSYmKGU9IiIrZSk7dmFyIG49ZS5sZW5ndGg7aWYoMD09PW4pcmV0dXJuIDA7Zm9yKHZhciByPSExOzspc3dpdGNoKHQpe2Nhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIG47Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlIHZvaWQgMDpyZXR1cm4gQihlKS5sZW5ndGg7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAyKm47Y2FzZSJoZXgiOnJldHVybiBuPj4+MTtjYXNlImJhc2U2NCI6cmV0dXJuIGooZSkubGVuZ3RoO2RlZmF1bHQ6aWYocilyZXR1cm4gQihlKS5sZW5ndGg7dD0oIiIrdCkudG9Mb3dlckNhc2UoKSxyPSEwfX1mdW5jdGlvbiBnKGUsdCxuKXt2YXIgcj0hMTtpZigodm9pZCAwPT09dHx8dDwwKSYmKHQ9MCksdD50aGlzLmxlbmd0aClyZXR1cm4iIjtpZigodm9pZCAwPT09bnx8bj50aGlzLmxlbmd0aCkmJihuPXRoaXMubGVuZ3RoKSxuPD0wKXJldHVybiIiO2lmKChuPj4+PTApPD0odD4+Pj0wKSlyZXR1cm4iIjtmb3IoZXx8KGU9InV0ZjgiKTs7KXN3aXRjaChlKXtjYXNlImhleCI6cmV0dXJuIEwodGhpcyx0LG4pO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIF8odGhpcyx0LG4pO2Nhc2UiYXNjaWkiOnJldHVybiBSKHRoaXMsdCxuKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBrKHRoaXMsdCxuKTtjYXNlImJhc2U2NCI6cmV0dXJuIEEodGhpcyx0LG4pO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gTih0aGlzLHQsbik7ZGVmYXVsdDppZihyKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrZSk7ZT0oZSsiIikudG9Mb3dlckNhc2UoKSxyPSEwfX1mdW5jdGlvbiBtKGUsdCxuKXt2YXIgcj1lW3RdO2VbdF09ZVtuXSxlW25dPXJ9ZnVuY3Rpb24gdihlLHQsbixyLG8pe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIG4/KHI9bixuPTApOm4+MjE0NzQ4MzY0Nz9uPTIxNDc0ODM2NDc6bjwtMjE0NzQ4MzY0OCYmKG49LTIxNDc0ODM2NDgpLG49K24saXNOYU4obikmJihuPW8/MDplLmxlbmd0aC0xKSxuPDAmJihuPWUubGVuZ3RoK24pLG4+PWUubGVuZ3RoKXtpZihvKXJldHVybi0xO249ZS5sZW5ndGgtMX1lbHNlIGlmKG48MCl7aWYoIW8pcmV0dXJuLTE7bj0wfWlmKCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9Yy5mcm9tKHQscikpLGMuaXNCdWZmZXIodCkpcmV0dXJuIDA9PT10Lmxlbmd0aD8tMTp5KGUsdCxuLHIsbyk7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiB0Jj0yNTUsYy5UWVBFRF9BUlJBWV9TVVBQT1JUJiYiZnVuY3Rpb24iPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9vP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChlLHQsbik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChlLHQsbik6eShlLFt0XSxuLHIsbyk7dGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIil9ZnVuY3Rpb24geShlLHQsbixyLG8pe3ZhciBpLHM9MSxhPWUubGVuZ3RoLGM9dC5sZW5ndGg7aWYodm9pZCAwIT09ciYmKCJ1Y3MyIj09PShyPVN0cmluZyhyKS50b0xvd2VyQ2FzZSgpKXx8InVjcy0yIj09PXJ8fCJ1dGYxNmxlIj09PXJ8fCJ1dGYtMTZsZSI9PT1yKSl7aWYoZS5sZW5ndGg8Mnx8dC5sZW5ndGg8MilyZXR1cm4tMTtzPTIsYS89MixjLz0yLG4vPTJ9ZnVuY3Rpb24gdShlLHQpe3JldHVybiAxPT09cz9lW3RdOmUucmVhZFVJbnQxNkJFKHQqcyl9aWYobyl7dmFyIGw9LTE7Zm9yKGk9bjtpPGE7aSsrKWlmKHUoZSxpKT09PXUodCwtMT09PWw/MDppLWwpKXtpZigtMT09PWwmJihsPWkpLGktbCsxPT09YylyZXR1cm4gbCpzfWVsc2UtMSE9PWwmJihpLT1pLWwpLGw9LTF9ZWxzZSBmb3IobitjPmEmJihuPWEtYyksaT1uO2k+PTA7aS0tKXtmb3IodmFyIHA9ITAsZD0wO2Q8YztkKyspaWYodShlLGkrZCkhPT11KHQsZCkpe3A9ITE7YnJlYWt9aWYocClyZXR1cm4gaX1yZXR1cm4tMX1mdW5jdGlvbiBFKGUsdCxuLHIpe249TnVtYmVyKG4pfHwwO3ZhciBvPWUubGVuZ3RoLW47cj8ocj1OdW1iZXIocikpPm8mJihyPW8pOnI9bzt2YXIgaT10Lmxlbmd0aDtpZihpJTIhPTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7cj5pLzImJihyPWkvMik7Zm9yKHZhciBzPTA7czxyOysrcyl7dmFyIGE9cGFyc2VJbnQodC5zdWJzdHIoMipzLDIpLDE2KTtpZihpc05hTihhKSlyZXR1cm4gcztlW24rc109YX1yZXR1cm4gc31mdW5jdGlvbiBTKGUsdCxuLHIpe3JldHVybiBWKEIodCxlLmxlbmd0aC1uKSxlLG4scil9ZnVuY3Rpb24gYihlLHQsbixyKXtyZXR1cm4gVihmdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7KytuKXQucHVzaCgyNTUmZS5jaGFyQ29kZUF0KG4pKTtyZXR1cm4gdH0odCksZSxuLHIpfWZ1bmN0aW9uIEMoZSx0LG4scil7cmV0dXJuIGIoZSx0LG4scil9ZnVuY3Rpb24gVChlLHQsbixyKXtyZXR1cm4gVihqKHQpLGUsbixyKX1mdW5jdGlvbiBJKGUsdCxuLHIpe3JldHVybiBWKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuLHIsbyxpPVtdLHM9MDtzPGUubGVuZ3RoJiYhKCh0LT0yKTwwKTsrK3Mpcj0obj1lLmNoYXJDb2RlQXQocykpPj44LG89biUyNTYsaS5wdXNoKG8pLGkucHVzaChyKTtyZXR1cm4gaX0odCxlLmxlbmd0aC1uKSxlLG4scil9ZnVuY3Rpb24gQShlLHQscil7cmV0dXJuIDA9PT10JiZyPT09ZS5sZW5ndGg/bi5mcm9tQnl0ZUFycmF5KGUpOm4uZnJvbUJ5dGVBcnJheShlLnNsaWNlKHQscikpfWZ1bmN0aW9uIF8oZSx0LG4pe249TWF0aC5taW4oZS5sZW5ndGgsbik7Zm9yKHZhciByPVtdLG89dDtvPG47KXt2YXIgaSxzLGEsYyx1PWVbb10sbD1udWxsLHA9dT4yMzk/NDp1PjIyMz8zOnU+MTkxPzI6MTtpZihvK3A8PW4pc3dpdGNoKHApe2Nhc2UgMTp1PDEyOCYmKGw9dSk7YnJlYWs7Y2FzZSAyOjEyOD09KDE5MiYoaT1lW28rMV0pKSYmKGM9KDMxJnUpPDw2fDYzJmkpPjEyNyYmKGw9Yyk7YnJlYWs7Y2FzZSAzOmk9ZVtvKzFdLHM9ZVtvKzJdLDEyOD09KDE5MiZpKSYmMTI4PT0oMTkyJnMpJiYoYz0oMTUmdSk8PDEyfCg2MyZpKTw8Nnw2MyZzKT4yMDQ3JiYoYzw1NTI5Nnx8Yz41NzM0MykmJihsPWMpO2JyZWFrO2Nhc2UgNDppPWVbbysxXSxzPWVbbysyXSxhPWVbbyszXSwxMjg9PSgxOTImaSkmJjEyOD09KDE5MiZzKSYmMTI4PT0oMTkyJmEpJiYoYz0oMTUmdSk8PDE4fCg2MyZpKTw8MTJ8KDYzJnMpPDw2fDYzJmEpPjY1NTM1JiZjPDExMTQxMTImJihsPWMpfW51bGw9PT1sPyhsPTY1NTMzLHA9MSk6bD42NTUzNSYmKGwtPTY1NTM2LHIucHVzaChsPj4+MTAmMTAyM3w1NTI5NiksbD01NjMyMHwxMDIzJmwpLHIucHVzaChsKSxvKz1wfXJldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtpZih0PD13KXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlKTtmb3IodmFyIG49IiIscj0wO3I8dDspbis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZS5zbGljZShyLHIrPXcpKTtyZXR1cm4gbn0ocil9ci5CdWZmZXI9YyxyLlNsb3dCdWZmZXI9ZnVuY3Rpb24oZSl7cmV0dXJuK2UhPWUmJihlPTApLGMuYWxsb2MoK2UpfSxyLklOU1BFQ1RfTUFYX0JZVEVTPTUwLGMuVFlQRURfQVJSQVlfU1VQUE9SVD12b2lkIDAhPT10LlRZUEVEX0FSUkFZX1NVUFBPUlQ/dC5UWVBFRF9BUlJBWV9TVVBQT1JUOmZ1bmN0aW9uKCl7dHJ5e3ZhciBlPW5ldyBVaW50OEFycmF5KDEpO3JldHVybiBlLl9fcHJvdG9fXz17X19wcm90b19fOlVpbnQ4QXJyYXkucHJvdG90eXBlLGZvbzpmdW5jdGlvbigpe3JldHVybiA0Mn19LDQyPT09ZS5mb28oKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuc3ViYXJyYXkmJjA9PT1lLnN1YmFycmF5KDEsMSkuYnl0ZUxlbmd0aH1jYXRjaChlKXtyZXR1cm4hMX19KCksci5rTWF4TGVuZ3RoPXMoKSxjLnBvb2xTaXplPTgxOTIsYy5fYXVnbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gZS5fX3Byb3RvX189Yy5wcm90b3R5cGUsZX0sYy5mcm9tPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdShudWxsLGUsdCxuKX0sYy5UWVBFRF9BUlJBWV9TVVBQT1JUJiYoYy5wcm90b3R5cGUuX19wcm90b19fPVVpbnQ4QXJyYXkucHJvdG90eXBlLGMuX19wcm90b19fPVVpbnQ4QXJyYXksInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5zcGVjaWVzJiZjW1N5bWJvbC5zcGVjaWVzXT09PWMmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShjLFN5bWJvbC5zcGVjaWVzLHt2YWx1ZTpudWxsLGNvbmZpZ3VyYWJsZTohMH0pKSxjLmFsbG9jPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGwodCksdDw9MD9hKGUsdCk6dm9pZCAwIT09bj8ic3RyaW5nIj09dHlwZW9mIHI/YShlLHQpLmZpbGwobixyKTphKGUsdCkuZmlsbChuKTphKGUsdCl9KG51bGwsZSx0LG4pfSxjLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKGUpe3JldHVybiBwKG51bGwsZSl9LGMuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKGUpe3JldHVybiBwKG51bGwsZSl9LGMuaXNCdWZmZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIShudWxsPT1lfHwhZS5faXNCdWZmZXIpfSxjLmNvbXBhcmU9ZnVuY3Rpb24oZSx0KXtpZighYy5pc0J1ZmZlcihlKXx8IWMuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycyIpO2lmKGU9PT10KXJldHVybiAwO2Zvcih2YXIgbj1lLmxlbmd0aCxyPXQubGVuZ3RoLG89MCxpPU1hdGgubWluKG4scik7bzxpOysrbylpZihlW29dIT09dFtvXSl7bj1lW29dLHI9dFtvXTticmVha31yZXR1cm4gbjxyPy0xOnI8bj8xOjB9LGMuaXNFbmNvZGluZz1mdW5jdGlvbihlKXtzd2l0Y2goU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sYy5jb25jYXQ9ZnVuY3Rpb24oZSx0KXtpZighaShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoMD09PWUubGVuZ3RoKXJldHVybiBjLmFsbG9jKDApO3ZhciBuO2lmKHZvaWQgMD09PXQpZm9yKHQ9MCxuPTA7bjxlLmxlbmd0aDsrK24pdCs9ZVtuXS5sZW5ndGg7dmFyIHI9Yy5hbGxvY1Vuc2FmZSh0KSxvPTA7Zm9yKG49MDtuPGUubGVuZ3RoOysrbil7dmFyIHM9ZVtuXTtpZighYy5pc0J1ZmZlcihzKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7cy5jb3B5KHIsbyksbys9cy5sZW5ndGh9cmV0dXJuIHJ9LGMuYnl0ZUxlbmd0aD1mLGMucHJvdG90eXBlLl9pc0J1ZmZlcj0hMCxjLnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTIhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTIpbSh0aGlzLHQsdCsxKTtyZXR1cm4gdGhpc30sYy5wcm90b3R5cGUuc3dhcDMyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSU0IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cyIpO2Zvcih2YXIgdD0wO3Q8ZTt0Kz00KW0odGhpcyx0LHQrMyksbSh0aGlzLHQrMSx0KzIpO3JldHVybiB0aGlzfSxjLnByb3RvdHlwZS5zd2FwNjQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTghPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTgpbSh0aGlzLHQsdCs3KSxtKHRoaXMsdCsxLHQrNiksbSh0aGlzLHQrMix0KzUpLG0odGhpcyx0KzMsdCs0KTtyZXR1cm4gdGhpc30sYy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT0wfHRoaXMubGVuZ3RoO3JldHVybiAwPT09ZT8iIjowPT09YXJndW1lbnRzLmxlbmd0aD9fKHRoaXMsMCxlKTpnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYy5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKGUpe2lmKCFjLmlzQnVmZmVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PWV8fDA9PT1jLmNvbXBhcmUodGhpcyxlKX0sYy5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciBlPSIiLHQ9ci5JTlNQRUNUX01BWF9CWVRFUztyZXR1cm4gdGhpcy5sZW5ndGg+MCYmKGU9dGhpcy50b1N0cmluZygiaGV4IiwwLHQpLm1hdGNoKC8uezJ9L2cpLmpvaW4oIiAiKSx0aGlzLmxlbmd0aD50JiYoZSs9IiAuLi4gIikpLCI8QnVmZmVyICIrZSsiPiJ9LGMucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24oZSx0LG4scixvKXtpZighYy5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7aWYodm9pZCAwPT09dCYmKHQ9MCksdm9pZCAwPT09biYmKG49ZT9lLmxlbmd0aDowKSx2b2lkIDA9PT1yJiYocj0wKSx2b2lkIDA9PT1vJiYobz10aGlzLmxlbmd0aCksdDwwfHxuPmUubGVuZ3RofHxyPDB8fG8+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpO2lmKHI+PW8mJnQ+PW4pcmV0dXJuIDA7aWYocj49bylyZXR1cm4tMTtpZih0Pj1uKXJldHVybiAxO2lmKHRoaXM9PT1lKXJldHVybiAwO2Zvcih2YXIgaT0obz4+Pj0wKS0ocj4+Pj0wKSxzPShuPj4+PTApLSh0Pj4+PTApLGE9TWF0aC5taW4oaSxzKSx1PXRoaXMuc2xpY2UocixvKSxsPWUuc2xpY2UodCxuKSxwPTA7cDxhOysrcClpZih1W3BdIT09bFtwXSl7aT11W3BdLHM9bFtwXTticmVha31yZXR1cm4gaTxzPy0xOnM8aT8xOjB9LGMucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4tMSE9PXRoaXMuaW5kZXhPZihlLHQsbil9LGMucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2KHRoaXMsZSx0LG4sITApfSxjLnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHYodGhpcyxlLHQsbiwhMSl9LGMucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKHZvaWQgMD09PXQpcj0idXRmOCIsbj10aGlzLmxlbmd0aCx0PTA7ZWxzZSBpZih2b2lkIDA9PT1uJiYic3RyaW5nIj09dHlwZW9mIHQpcj10LG49dGhpcy5sZW5ndGgsdD0wO2Vsc2V7aWYoIWlzRmluaXRlKHQpKXRocm93IG5ldyBFcnJvcigiQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQiKTt0fD0wLGlzRmluaXRlKG4pPyhufD0wLHZvaWQgMD09PXImJihyPSJ1dGY4IikpOihyPW4sbj12b2lkIDApfXZhciBvPXRoaXMubGVuZ3RoLXQ7aWYoKHZvaWQgMD09PW58fG4+bykmJihuPW8pLGUubGVuZ3RoPjAmJihuPDB8fHQ8MCl8fHQ+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7cnx8KHI9InV0ZjgiKTtmb3IodmFyIGk9ITE7Oylzd2l0Y2gocil7Y2FzZSJoZXgiOnJldHVybiBFKHRoaXMsZSx0LG4pO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIFModGhpcyxlLHQsbik7Y2FzZSJhc2NpaSI6cmV0dXJuIGIodGhpcyxlLHQsbik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gQyh0aGlzLGUsdCxuKTtjYXNlImJhc2U2NCI6cmV0dXJuIFQodGhpcyxlLHQsbik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBJKHRoaXMsZSx0LG4pO2RlZmF1bHQ6aWYoaSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3IpO3I9KCIiK3IpLnRvTG93ZXJDYXNlKCksaT0hMH19LGMucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJCdWZmZXIiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07dmFyIHc9NDA5NjtmdW5jdGlvbiBSKGUsdCxuKXt2YXIgcj0iIjtuPU1hdGgubWluKGUubGVuZ3RoLG4pO2Zvcih2YXIgbz10O288bjsrK28pcis9U3RyaW5nLmZyb21DaGFyQ29kZSgxMjcmZVtvXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gayhlLHQsbil7dmFyIHI9IiI7bj1NYXRoLm1pbihlLmxlbmd0aCxuKTtmb3IodmFyIG89dDtvPG47KytvKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoZVtvXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gTChlLHQsbil7dmFyIHIsbz1lLmxlbmd0aDsoIXR8fHQ8MCkmJih0PTApLCghbnx8bjwwfHxuPm8pJiYobj1vKTtmb3IodmFyIGk9IiIscz10O3M8bjsrK3MpaSs9KHI9ZVtzXSk8MTY/IjAiK3IudG9TdHJpbmcoMTYpOnIudG9TdHJpbmcoMTYpO3JldHVybiBpfWZ1bmN0aW9uIE4oZSx0LG4pe2Zvcih2YXIgcj1lLnNsaWNlKHQsbiksbz0iIixpPTA7aTxyLmxlbmd0aDtpKz0yKW8rPVN0cmluZy5mcm9tQ2hhckNvZGUocltpXSsyNTYqcltpKzFdKTtyZXR1cm4gb31mdW5jdGlvbiBPKGUsdCxuKXtpZihlJTEhPTB8fGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib2Zmc2V0IGlzIG5vdCB1aW50Iik7aWYoZSt0Pm4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlRyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgiKX1mdW5jdGlvbiBEKGUsdCxuLHIsbyxpKXtpZighYy5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmZmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7aWYodD5vfHx0PGkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKG4rcj5lLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gUChlLHQsbixyKXt0PDAmJih0PTY1NTM1K3QrMSk7Zm9yKHZhciBvPTAsaT1NYXRoLm1pbihlLmxlbmd0aC1uLDIpO288aTsrK28pZVtuK29dPSh0JjI1NTw8OCoocj9vOjEtbykpPj4+OCoocj9vOjEtbyl9ZnVuY3Rpb24geChlLHQsbixyKXt0PDAmJih0PTQyOTQ5NjcyOTUrdCsxKTtmb3IodmFyIG89MCxpPU1hdGgubWluKGUubGVuZ3RoLW4sNCk7bzxpOysrbyllW24rb109dD4+PjgqKHI/bzozLW8pJjI1NX1mdW5jdGlvbiBNKGUsdCxuLHIsbyxpKXtpZihuK3I+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKG48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gVShlLHQsbixyLGkpe3JldHVybiBpfHxNKGUsMCxuLDQpLG8ud3JpdGUoZSx0LG4sciwyMyw0KSxuKzR9ZnVuY3Rpb24gRihlLHQsbixyLGkpe3JldHVybiBpfHxNKGUsMCxuLDgpLG8ud3JpdGUoZSx0LG4sciw1Miw4KSxuKzh9Yy5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbixyPXRoaXMubGVuZ3RoO2lmKChlPX5+ZSk8MD8oZSs9cik8MCYmKGU9MCk6ZT5yJiYoZT1yKSwodD12b2lkIDA9PT10P3I6fn50KTwwPyh0Kz1yKTwwJiYodD0wKTp0PnImJih0PXIpLHQ8ZSYmKHQ9ZSksYy5UWVBFRF9BUlJBWV9TVVBQT1JUKShuPXRoaXMuc3ViYXJyYXkoZSx0KSkuX19wcm90b19fPWMucHJvdG90eXBlO2Vsc2V7dmFyIG89dC1lO249bmV3IGMobyx2b2lkIDApO2Zvcih2YXIgaT0wO2k8bzsrK2kpbltpXT10aGlzW2krZV19cmV0dXJuIG59LGMucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24oZSx0LG4pe2V8PTAsdHw9MCxufHxPKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbZV0sbz0xLGk9MDsrK2k8dCYmKG8qPTI1Nik7KXIrPXRoaXNbZStpXSpvO3JldHVybiByfSxjLnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKGUsdCxuKXtlfD0wLHR8PTAsbnx8TyhlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW2UrLS10XSxvPTE7dD4wJiYobyo9MjU2KTspcis9dGhpc1tlKy0tdF0qbztyZXR1cm4gcn0sYy5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSwxLHRoaXMubGVuZ3RoKSx0aGlzW2VdfSxjLnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fSxjLnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDh8dGhpc1tlKzFdfSxjLnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDQsdGhpcy5sZW5ndGgpLCh0aGlzW2VdfHRoaXNbZSsxXTw8OHx0aGlzW2UrMl08PDE2KSsxNjc3NzIxNip0aGlzW2UrM119LGMucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1tlXSsodGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdKX0sYy5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKGUsdCxuKXtlfD0wLHR8PTAsbnx8TyhlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW2VdLG89MSxpPTA7KytpPHQmJihvKj0yNTYpOylyKz10aGlzW2UraV0qbztyZXR1cm4gcj49KG8qPTEyOCkmJihyLT1NYXRoLnBvdygyLDgqdCkpLHJ9LGMucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fE8oZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dCxvPTEsaT10aGlzW2UrLS1yXTtyPjAmJihvKj0yNTYpOylpKz10aGlzW2UrLS1yXSpvO3JldHVybiBpPj0obyo9MTI4KSYmKGktPU1hdGgucG93KDIsOCp0KSksaX0sYy5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDEsdGhpcy5sZW5ndGgpLDEyOCZ0aGlzW2VdPy0xKigyNTUtdGhpc1tlXSsxKTp0aGlzW2VdfSxjLnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbihlLHQpe3R8fE8oZSwyLHRoaXMubGVuZ3RoKTt2YXIgbj10aGlzW2VdfHRoaXNbZSsxXTw8ODtyZXR1cm4gMzI3Njgmbj80Mjk0OTAxNzYwfG46bn0sYy5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24oZSx0KXt0fHxPKGUsMix0aGlzLmxlbmd0aCk7dmFyIG49dGhpc1tlKzFdfHRoaXNbZV08PDg7cmV0dXJuIDMyNzY4Jm4/NDI5NDkwMTc2MHxuOm59LGMucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OHx0aGlzW2UrMl08PDE2fHRoaXNbZSszXTw8MjR9LGMucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdPDwyNHx0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM119LGMucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSw0LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyxlLCEwLDIzLDQpfSxjLnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsNCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsZSwhMSwyMyw0KX0sYy5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSw4LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyxlLCEwLDUyLDgpfSxjLnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDgsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLGUsITEsNTIsOCl9LGMucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKGUsdCxuLHIpe2U9K2UsdHw9MCxufD0wLHJ8fEQodGhpcyxlLHQsbixNYXRoLnBvdygyLDgqbiktMSwwKTt2YXIgbz0xLGk9MDtmb3IodGhpc1t0XT0yNTUmZTsrK2k8biYmKG8qPTI1Nik7KXRoaXNbdCtpXT1lL28mMjU1O3JldHVybiB0K259LGMucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKGUsdCxuLHIpe2U9K2UsdHw9MCxufD0wLHJ8fEQodGhpcyxlLHQsbixNYXRoLnBvdygyLDgqbiktMSwwKTt2YXIgbz1uLTEsaT0xO2Zvcih0aGlzW3Qrb109MjU1JmU7LS1vPj0wJiYoaSo9MjU2KTspdGhpc1t0K29dPWUvaSYyNTU7cmV0dXJuIHQrbn0sYy5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDEsMjU1LDApLGMuVFlQRURfQVJSQVlfU1VQUE9SVHx8KGU9TWF0aC5mbG9vcihlKSksdGhpc1t0XT0yNTUmZSx0KzF9LGMucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8RCh0aGlzLGUsdCwyLDY1NTM1LDApLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT0yNTUmZSx0aGlzW3QrMV09ZT4+PjgpOlAodGhpcyxlLHQsITApLHQrMn0sYy5wcm90b3R5cGUud3JpdGVVSW50MTZCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDIsNjU1MzUsMCksYy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj44LHRoaXNbdCsxXT0yNTUmZSk6UCh0aGlzLGUsdCwhMSksdCsyfSxjLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsNCw0Mjk0OTY3Mjk1LDApLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0KzNdPWU+Pj4yNCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCsxXT1lPj4+OCx0aGlzW3RdPTI1NSZlKTp4KHRoaXMsZSx0LCEwKSx0KzR9LGMucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8RCh0aGlzLGUsdCw0LDQyOTQ5NjcyOTUsMCksYy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109MjU1JmUpOngodGhpcyxlLHQsITEpLHQrNH0sYy5wcm90b3R5cGUud3JpdGVJbnRMRT1mdW5jdGlvbihlLHQsbixyKXtpZihlPStlLHR8PTAsIXIpe3ZhciBvPU1hdGgucG93KDIsOCpuLTEpO0QodGhpcyxlLHQsbixvLTEsLW8pfXZhciBpPTAscz0xLGE9MDtmb3IodGhpc1t0XT0yNTUmZTsrK2k8biYmKHMqPTI1Nik7KWU8MCYmMD09PWEmJjAhPT10aGlzW3QraS0xXSYmKGE9MSksdGhpc1t0K2ldPShlL3M+PjApLWEmMjU1O3JldHVybiB0K259LGMucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24oZSx0LG4scil7aWYoZT0rZSx0fD0wLCFyKXt2YXIgbz1NYXRoLnBvdygyLDgqbi0xKTtEKHRoaXMsZSx0LG4sby0xLC1vKX12YXIgaT1uLTEscz0xLGE9MDtmb3IodGhpc1t0K2ldPTI1NSZlOy0taT49MCYmKHMqPTI1Nik7KWU8MCYmMD09PWEmJjAhPT10aGlzW3QraSsxXSYmKGE9MSksdGhpc1t0K2ldPShlL3M+PjApLWEmMjU1O3JldHVybiB0K259LGMucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDEsMTI3LC0xMjgpLGMuVFlQRURfQVJSQVlfU1VQUE9SVHx8KGU9TWF0aC5mbG9vcihlKSksZTwwJiYoZT0yNTUrZSsxKSx0aGlzW3RdPTI1NSZlLHQrMX0sYy5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsMiwzMjc2NywtMzI3NjgpLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT0yNTUmZSx0aGlzW3QrMV09ZT4+PjgpOlAodGhpcyxlLHQsITApLHQrMn0sYy5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsMiwzMjc2NywtMzI3NjgpLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOlAodGhpcyxlLHQsITEpLHQrMn0sYy5wcm90b3R5cGUud3JpdGVJbnQzMkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44LHRoaXNbdCsyXT1lPj4+MTYsdGhpc1t0KzNdPWU+Pj4yNCk6eCh0aGlzLGUsdCwhMCksdCs0fSxjLnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8RCh0aGlzLGUsdCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLGU8MCYmKGU9NDI5NDk2NzI5NStlKzEpLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+MjQsdGhpc1t0KzFdPWU+Pj4xNix0aGlzW3QrMl09ZT4+PjgsdGhpc1t0KzNdPTI1NSZlKTp4KHRoaXMsZSx0LCExKSx0KzR9LGMucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIFUodGhpcyxlLHQsITAsbil9LGMucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIFUodGhpcyxlLHQsITEsbil9LGMucHJvdG90eXBlLndyaXRlRG91YmxlTEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBGKHRoaXMsZSx0LCEwLG4pfSxjLnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gRih0aGlzLGUsdCwhMSxuKX0sYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihlLHQsbixyKXtpZihufHwobj0wKSxyfHwwPT09cnx8KHI9dGhpcy5sZW5ndGgpLHQ+PWUubGVuZ3RoJiYodD1lLmxlbmd0aCksdHx8KHQ9MCkscj4wJiZyPG4mJihyPW4pLHI9PT1uKXJldHVybiAwO2lmKDA9PT1lLmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKG48MHx8bj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7cj50aGlzLmxlbmd0aCYmKHI9dGhpcy5sZW5ndGgpLGUubGVuZ3RoLXQ8ci1uJiYocj1lLmxlbmd0aC10K24pO3ZhciBvLGk9ci1uO2lmKHRoaXM9PT1lJiZuPHQmJnQ8cilmb3Iobz1pLTE7bz49MDstLW8pZVtvK3RdPXRoaXNbbytuXTtlbHNlIGlmKGk8MWUzfHwhYy5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcihvPTA7bzxpOysrbyllW28rdF09dGhpc1tvK25dO2Vsc2UgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoZSx0aGlzLnN1YmFycmF5KG4sbitpKSx0KTtyZXR1cm4gaX0sYy5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbihlLHQsbixyKXtpZigic3RyaW5nIj09dHlwZW9mIGUpe2lmKCJzdHJpbmciPT10eXBlb2YgdD8ocj10LHQ9MCxuPXRoaXMubGVuZ3RoKToic3RyaW5nIj09dHlwZW9mIG4mJihyPW4sbj10aGlzLmxlbmd0aCksMT09PWUubGVuZ3RoKXt2YXIgbz1lLmNoYXJDb2RlQXQoMCk7bzwyNTYmJihlPW8pfWlmKHZvaWQgMCE9PXImJiJzdHJpbmciIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nIik7aWYoInN0cmluZyI9PXR5cGVvZiByJiYhYy5pc0VuY29kaW5nKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrcil9ZWxzZSJudW1iZXIiPT10eXBlb2YgZSYmKGUmPTI1NSk7aWYodDwwfHx0aGlzLmxlbmd0aDx0fHx0aGlzLmxlbmd0aDxuKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPD10KXJldHVybiB0aGlzO3ZhciBpO2lmKHQ+Pj49MCxuPXZvaWQgMD09PW4/dGhpcy5sZW5ndGg6bj4+PjAsZXx8KGU9MCksIm51bWJlciI9PXR5cGVvZiBlKWZvcihpPXQ7aTxuOysraSl0aGlzW2ldPWU7ZWxzZXt2YXIgcz1jLmlzQnVmZmVyKGUpP2U6QihuZXcgYyhlLHIpLnRvU3RyaW5nKCkpLGE9cy5sZW5ndGg7Zm9yKGk9MDtpPG4tdDsrK2kpdGhpc1tpK3RdPXNbaSVhXX1yZXR1cm4gdGhpc307dmFyIHE9L1teK1wvMC05QS1aYS16LV9dL2c7ZnVuY3Rpb24gQihlLHQpe3ZhciBuO3Q9dHx8MS8wO2Zvcih2YXIgcj1lLmxlbmd0aCxvPW51bGwsaT1bXSxzPTA7czxyOysrcyl7aWYoKG49ZS5jaGFyQ29kZUF0KHMpKT41NTI5NSYmbjw1NzM0NCl7aWYoIW8pe2lmKG4+NTYzMTkpeyh0LT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZihzKzE9PT1yKXsodC09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9bz1uO2NvbnRpbnVlfWlmKG48NTYzMjApeyh0LT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KSxvPW47Y29udGludWV9bj02NTUzNisoby01NTI5Njw8MTB8bi01NjMyMCl9ZWxzZSBvJiYodC09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSk7aWYobz1udWxsLG48MTI4KXtpZigodC09MSk8MClicmVhaztpLnB1c2gobil9ZWxzZSBpZihuPDIwNDgpe2lmKCh0LT0yKTwwKWJyZWFrO2kucHVzaChuPj42fDE5Miw2MyZufDEyOCl9ZWxzZSBpZihuPDY1NTM2KXtpZigodC09Myk8MClicmVhaztpLnB1c2gobj4+MTJ8MjI0LG4+PjYmNjN8MTI4LDYzJm58MTI4KX1lbHNle2lmKCEobjwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKCh0LT00KTwwKWJyZWFrO2kucHVzaChuPj4xOHwyNDAsbj4+MTImNjN8MTI4LG4+PjYmNjN8MTI4LDYzJm58MTI4KX19cmV0dXJuIGl9ZnVuY3Rpb24gaihlKXtyZXR1cm4gbi50b0J5dGVBcnJheShmdW5jdGlvbihlKXtpZigoZT1mdW5jdGlvbihlKXtyZXR1cm4gZS50cmltP2UudHJpbSgpOmUucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfShlKS5yZXBsYWNlKHEsIiIpKS5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO2UubGVuZ3RoJTQhPTA7KWUrPSI9IjtyZXR1cm4gZX0oZSkpfWZ1bmN0aW9uIFYoZSx0LG4scil7Zm9yKHZhciBvPTA7bzxyJiYhKG8rbj49dC5sZW5ndGh8fG8+PWUubGVuZ3RoKTsrK28pdFtvK25dPWVbb107cmV0dXJuIG99fSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyx2b2lkIDAhPT1uLmc/bi5nOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSxlKCJidWZmZXIiKS5CdWZmZXIpfSx7ImJhc2U2NC1qcyI6ODEsYnVmZmVyOjg2LGllZWU3NTQ6ODgsaXNhcnJheTo4OX1dLDg3OltmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcigpe3RoaXMuX2V2ZW50cz10aGlzLl9ldmVudHN8fHt9LHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH1mdW5jdGlvbiBvKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZX1mdW5jdGlvbiBzKGUpe3JldHVybiB2b2lkIDA9PT1lfXQuZXhwb3J0cz1yLHIuRXZlbnRFbWl0dGVyPXIsci5wcm90b3R5cGUuX2V2ZW50cz12b2lkIDAsci5wcm90b3R5cGUuX21heExpc3RlbmVycz12b2lkIDAsci5kZWZhdWx0TWF4TGlzdGVuZXJzPTEwLHIucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbihlKXtpZigibnVtYmVyIiE9dHlwZW9mIGV8fGU8MHx8aXNOYU4oZSkpdGhyb3cgVHlwZUVycm9yKCJuIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPWUsdGhpc30sci5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihlKXt2YXIgdCxuLHIsYSxjLHU7aWYodGhpcy5fZXZlbnRzfHwodGhpcy5fZXZlbnRzPXt9KSwiZXJyb3IiPT09ZSYmKCF0aGlzLl9ldmVudHMuZXJyb3J8fGkodGhpcy5fZXZlbnRzLmVycm9yKSYmIXRoaXMuX2V2ZW50cy5lcnJvci5sZW5ndGgpKXtpZigodD1hcmd1bWVudHNbMV0paW5zdGFuY2VvZiBFcnJvcil0aHJvdyB0O3ZhciBsPW5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkICJlcnJvciIgZXZlbnQuICgnK3QrIikiKTt0aHJvdyBsLmNvbnRleHQ9dCxsfWlmKHMobj10aGlzLl9ldmVudHNbZV0pKXJldHVybiExO2lmKG8obikpc3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTpuLmNhbGwodGhpcyk7YnJlYWs7Y2FzZSAyOm4uY2FsbCh0aGlzLGFyZ3VtZW50c1sxXSk7YnJlYWs7Y2FzZSAzOm4uY2FsbCh0aGlzLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pO2JyZWFrO2RlZmF1bHQ6YT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksbi5hcHBseSh0aGlzLGEpfWVsc2UgaWYoaShuKSlmb3IoYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkscj0odT1uLnNsaWNlKCkpLmxlbmd0aCxjPTA7YzxyO2MrKyl1W2NdLmFwcGx5KHRoaXMsYSk7cmV0dXJuITB9LHIucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7dmFyIG47aWYoIW8odCkpdGhyb3cgVHlwZUVycm9yKCJsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24iKTtyZXR1cm4gdGhpcy5fZXZlbnRzfHwodGhpcy5fZXZlbnRzPXt9KSx0aGlzLl9ldmVudHMubmV3TGlzdGVuZXImJnRoaXMuZW1pdCgibmV3TGlzdGVuZXIiLGUsbyh0Lmxpc3RlbmVyKT90Lmxpc3RlbmVyOnQpLHRoaXMuX2V2ZW50c1tlXT9pKHRoaXMuX2V2ZW50c1tlXSk/dGhpcy5fZXZlbnRzW2VdLnB1c2godCk6dGhpcy5fZXZlbnRzW2VdPVt0aGlzLl9ldmVudHNbZV0sdF06dGhpcy5fZXZlbnRzW2VdPXQsaSh0aGlzLl9ldmVudHNbZV0pJiYhdGhpcy5fZXZlbnRzW2VdLndhcm5lZCYmKG49cyh0aGlzLl9tYXhMaXN0ZW5lcnMpP3IuZGVmYXVsdE1heExpc3RlbmVyczp0aGlzLl9tYXhMaXN0ZW5lcnMpJiZuPjAmJnRoaXMuX2V2ZW50c1tlXS5sZW5ndGg+biYmKHRoaXMuX2V2ZW50c1tlXS53YXJuZWQ9ITAsY29uc29sZS5lcnJvcigiKG5vZGUpIHdhcm5pbmc6IHBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJWQgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdC4iLHRoaXMuX2V2ZW50c1tlXS5sZW5ndGgpLCJmdW5jdGlvbiI9PXR5cGVvZiBjb25zb2xlLnRyYWNlJiZjb25zb2xlLnRyYWNlKCkpLHRoaXN9LHIucHJvdG90eXBlLm9uPXIucHJvdG90eXBlLmFkZExpc3RlbmVyLHIucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24oZSx0KXtpZighbyh0KSl0aHJvdyBUeXBlRXJyb3IoImxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpO3ZhciBuPSExO2Z1bmN0aW9uIHIoKXt0aGlzLnJlbW92ZUxpc3RlbmVyKGUsciksbnx8KG49ITAsdC5hcHBseSh0aGlzLGFyZ3VtZW50cykpfXJldHVybiByLmxpc3RlbmVyPXQsdGhpcy5vbihlLHIpLHRoaXN9LHIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixzLGE7aWYoIW8odCkpdGhyb3cgVHlwZUVycm9yKCJsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24iKTtpZighdGhpcy5fZXZlbnRzfHwhdGhpcy5fZXZlbnRzW2VdKXJldHVybiB0aGlzO2lmKHM9KG49dGhpcy5fZXZlbnRzW2VdKS5sZW5ndGgscj0tMSxuPT09dHx8byhuLmxpc3RlbmVyKSYmbi5saXN0ZW5lcj09PXQpZGVsZXRlIHRoaXMuX2V2ZW50c1tlXSx0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLGUsdCk7ZWxzZSBpZihpKG4pKXtmb3IoYT1zO2EtLSA+MDspaWYoblthXT09PXR8fG5bYV0ubGlzdGVuZXImJm5bYV0ubGlzdGVuZXI9PT10KXtyPWE7YnJlYWt9aWYocjwwKXJldHVybiB0aGlzOzE9PT1uLmxlbmd0aD8obi5sZW5ndGg9MCxkZWxldGUgdGhpcy5fZXZlbnRzW2VdKTpuLnNwbGljZShyLDEpLHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsZSx0KX1yZXR1cm4gdGhpc30sci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3ZhciB0LG47aWYoIXRoaXMuX2V2ZW50cylyZXR1cm4gdGhpcztpZighdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKXJldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLl9ldmVudHM9e306dGhpcy5fZXZlbnRzW2VdJiZkZWxldGUgdGhpcy5fZXZlbnRzW2VdLHRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih0IGluIHRoaXMuX2V2ZW50cykicmVtb3ZlTGlzdGVuZXIiIT09dCYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnModCk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz17fSx0aGlzfWlmKG8obj10aGlzLl9ldmVudHNbZV0pKXRoaXMucmVtb3ZlTGlzdGVuZXIoZSxuKTtlbHNlIGlmKG4pZm9yKDtuLmxlbmd0aDspdGhpcy5yZW1vdmVMaXN0ZW5lcihlLG5bbi5sZW5ndGgtMV0pO3JldHVybiBkZWxldGUgdGhpcy5fZXZlbnRzW2VdLHRoaXN9LHIucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZXZlbnRzJiZ0aGlzLl9ldmVudHNbZV0/byh0aGlzLl9ldmVudHNbZV0pP1t0aGlzLl9ldmVudHNbZV1dOnRoaXMuX2V2ZW50c1tlXS5zbGljZSgpOltdfSxyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50PWZ1bmN0aW9uKGUpe2lmKHRoaXMuX2V2ZW50cyl7dmFyIHQ9dGhpcy5fZXZlbnRzW2VdO2lmKG8odCkpcmV0dXJuIDE7aWYodClyZXR1cm4gdC5sZW5ndGh9cmV0dXJuIDB9LHIubGlzdGVuZXJDb3VudD1mdW5jdGlvbihlLHQpe3JldHVybiBlLmxpc3RlbmVyQ291bnQodCl9fSx7fV0sODg6W2Z1bmN0aW9uKGUsdCxuKXtuLnJlYWQ9ZnVuY3Rpb24oZSx0LG4scixvKXt2YXIgaSxzLGE9OCpvLXItMSxjPSgxPDxhKS0xLHU9Yz4+MSxsPS03LHA9bj9vLTE6MCxkPW4/LTE6MSxoPWVbdCtwXTtmb3IocCs9ZCxpPWgmKDE8PC1sKS0xLGg+Pj0tbCxsKz1hO2w+MDtpPTI1NippK2VbdCtwXSxwKz1kLGwtPTgpO2ZvcihzPWkmKDE8PC1sKS0xLGk+Pj0tbCxsKz1yO2w+MDtzPTI1NipzK2VbdCtwXSxwKz1kLGwtPTgpO2lmKDA9PT1pKWk9MS11O2Vsc2V7aWYoaT09PWMpcmV0dXJuIHM/TmFOOjEvMCooaD8tMToxKTtzKz1NYXRoLnBvdygyLHIpLGktPXV9cmV0dXJuKGg/LTE6MSkqcypNYXRoLnBvdygyLGktcil9LG4ud3JpdGU9ZnVuY3Rpb24oZSx0LG4scixvLGkpe3ZhciBzLGEsYyx1PTgqaS1vLTEsbD0oMTw8dSktMSxwPWw+PjEsZD0yMz09PW8/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLGg9cj8wOmktMSxmPXI/MTotMSxnPXQ8MHx8MD09PXQmJjEvdDwwPzE6MDtmb3IodD1NYXRoLmFicyh0KSxpc05hTih0KXx8dD09PTEvMD8oYT1pc05hTih0KT8xOjAscz1sKToocz1NYXRoLmZsb29yKE1hdGgubG9nKHQpL01hdGguTE4yKSx0KihjPU1hdGgucG93KDIsLXMpKTwxJiYocy0tLGMqPTIpLCh0Kz1zK3A+PTE/ZC9jOmQqTWF0aC5wb3coMiwxLXApKSpjPj0yJiYocysrLGMvPTIpLHMrcD49bD8oYT0wLHM9bCk6cytwPj0xPyhhPSh0KmMtMSkqTWF0aC5wb3coMixvKSxzKz1wKTooYT10Kk1hdGgucG93KDIscC0xKSpNYXRoLnBvdygyLG8pLHM9MCkpO28+PTg7ZVtuK2hdPTI1NSZhLGgrPWYsYS89MjU2LG8tPTgpO2ZvcihzPXM8PG98YSx1Kz1vO3U+MDtlW24raF09MjU1JnMsaCs9ZixzLz0yNTYsdS09OCk7ZVtuK2gtZl18PTEyOCpnfX0se31dLDg5OltmdW5jdGlvbihlLHQsbil7dmFyIHI9e30udG9TdHJpbmc7dC5leHBvcnRzPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PXIuY2FsbChlKX19LHt9XSw5MDpbZnVuY3Rpb24oZSx0LG4peyFmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbnVsbCE9PWUmJiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gbihlKXtyZXR1cm4gbnVsbCE9PWUmJiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIHIoZSxvKXtpZihlPT09bylyZXR1cm4hMDtpZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykpcmV0dXJuITE7aWYoITA9PT10KGUpKXtpZihlLmxlbmd0aCE9PW8ubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKWlmKCExPT09cihlW2ldLG9baV0pKXJldHVybiExO3JldHVybiEwfWlmKCEwPT09bihlKSl7dmFyIHM9e307Zm9yKHZhciBhIGluIGUpaWYoaGFzT3duUHJvcGVydHkuY2FsbChlLGEpKXtpZighMT09PXIoZVthXSxvW2FdKSlyZXR1cm4hMTtzW2FdPSEwfWZvcih2YXIgYyBpbiBvKWlmKGhhc093blByb3BlcnR5LmNhbGwobyxjKSYmITAhPT1zW2NdKXJldHVybiExO3JldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIG8oZSl7aWYoIiI9PT1lfHwhMT09PWV8fG51bGw9PT1lKXJldHVybiEwO2lmKHQoZSkmJjA9PT1lLmxlbmd0aClyZXR1cm4hMDtpZihuKGUpKXtmb3IodmFyIHIgaW4gZSlpZihlLmhhc093blByb3BlcnR5KHIpKXJldHVybiExO3JldHVybiEwfXJldHVybiExfXZhciBpO2k9ImZ1bmN0aW9uIj09dHlwZW9mIFN0cmluZy5wcm90b3R5cGUudHJpbUxlZnQ/ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbUxlZnQoKX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUubWF0Y2goL15ccyooLiopLylbMV19O3ZhciBzPTAsYT0xLGM9Mix1PTMsbD00LHA9NixkPTgsaD05LGY9ezA6Im51bWJlciIsMToiYW55IiwyOiJzdHJpbmciLDM6ImFycmF5Iiw0OiJvYmplY3QiLDU6ImJvb2xlYW4iLDY6ImV4cHJlc3Npb24iLDc6Im51bGwiLDg6IkFycmF5PG51bWJlcj4iLDk6IkFycmF5PHN0cmluZz4ifSxnPSJFT0YiLG09IlVucXVvdGVkSWRlbnRpZmllciIsdj0iUXVvdGVkSWRlbnRpZmllciIseT0iUmJyYWNrZXQiLEU9IlJwYXJlbiIsUz0iQ29tbWEiLGI9IkNvbG9uIixDPSJSYnJhY2UiLFQ9Ik51bWJlciIsST0iQ3VycmVudCIsQT0iRXhwcmVmIixfPSJQaXBlIix3PSJPciIsUj0iQW5kIixrPSJFUSIsTD0iR1QiLE49IkxUIixPPSJHVEUiLEQ9IkxURSIsUD0iTkUiLHg9IkZsYXR0ZW4iLE09IlN0YXIiLFU9IkZpbHRlciIsRj0iRG90IixxPSJOb3QiLEI9IkxicmFjZSIsaj0iTGJyYWNrZXQiLFY9IkxwYXJlbiIsVz0iTGl0ZXJhbCIsSD17Ii4iOkYsIioiOk0sIiwiOlMsIjoiOmIsInsiOkIsIn0iOkMsIl0iOnksIigiOlYsIikiOkUsIkAiOkl9LEc9eyI8IjohMCwiPiI6ITAsIj0iOiEwLCIhIjohMH0sej17IiAiOiEwLCJcdCI6ITAsIlxuIjohMH07ZnVuY3Rpb24gSyhlKXtyZXR1cm4gZT49IjAiJiZlPD0iOSJ8fCItIj09PWV9ZnVuY3Rpb24gWCgpe31YLnByb3RvdHlwZT17dG9rZW5pemU6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLG8saT1bXTtmb3IodGhpcy5fY3VycmVudD0wO3RoaXMuX2N1cnJlbnQ8ZS5sZW5ndGg7KWlmKChvPWVbdGhpcy5fY3VycmVudF0pPj0iYSImJm88PSJ6Inx8bz49IkEiJiZvPD0iWiJ8fCJfIj09PW8pdD10aGlzLl9jdXJyZW50LG49dGhpcy5fY29uc3VtZVVucXVvdGVkSWRlbnRpZmllcihlKSxpLnB1c2goe3R5cGU6bSx2YWx1ZTpuLHN0YXJ0OnR9KTtlbHNlIGlmKHZvaWQgMCE9PUhbZVt0aGlzLl9jdXJyZW50XV0paS5wdXNoKHt0eXBlOkhbZVt0aGlzLl9jdXJyZW50XV0sdmFsdWU6ZVt0aGlzLl9jdXJyZW50XSxzdGFydDp0aGlzLl9jdXJyZW50fSksdGhpcy5fY3VycmVudCsrO2Vsc2UgaWYoSyhlW3RoaXMuX2N1cnJlbnRdKSlyPXRoaXMuX2NvbnN1bWVOdW1iZXIoZSksaS5wdXNoKHIpO2Vsc2UgaWYoIlsiPT09ZVt0aGlzLl9jdXJyZW50XSlyPXRoaXMuX2NvbnN1bWVMQnJhY2tldChlKSxpLnB1c2gocik7ZWxzZSBpZignIic9PT1lW3RoaXMuX2N1cnJlbnRdKXQ9dGhpcy5fY3VycmVudCxuPXRoaXMuX2NvbnN1bWVRdW90ZWRJZGVudGlmaWVyKGUpLGkucHVzaCh7dHlwZTp2LHZhbHVlOm4sc3RhcnQ6dH0pO2Vsc2UgaWYoIiciPT09ZVt0aGlzLl9jdXJyZW50XSl0PXRoaXMuX2N1cnJlbnQsbj10aGlzLl9jb25zdW1lUmF3U3RyaW5nTGl0ZXJhbChlKSxpLnB1c2goe3R5cGU6Vyx2YWx1ZTpuLHN0YXJ0OnR9KTtlbHNlIGlmKCJgIj09PWVbdGhpcy5fY3VycmVudF0pe3Q9dGhpcy5fY3VycmVudDt2YXIgcz10aGlzLl9jb25zdW1lTGl0ZXJhbChlKTtpLnB1c2goe3R5cGU6Vyx2YWx1ZTpzLHN0YXJ0OnR9KX1lbHNlIGlmKHZvaWQgMCE9PUdbZVt0aGlzLl9jdXJyZW50XV0paS5wdXNoKHRoaXMuX2NvbnN1bWVPcGVyYXRvcihlKSk7ZWxzZSBpZih2b2lkIDAhPT16W2VbdGhpcy5fY3VycmVudF1dKXRoaXMuX2N1cnJlbnQrKztlbHNlIGlmKCImIj09PWVbdGhpcy5fY3VycmVudF0pdD10aGlzLl9jdXJyZW50LHRoaXMuX2N1cnJlbnQrKywiJiI9PT1lW3RoaXMuX2N1cnJlbnRdPyh0aGlzLl9jdXJyZW50KyssaS5wdXNoKHt0eXBlOlIsdmFsdWU6IiYmIixzdGFydDp0fSkpOmkucHVzaCh7dHlwZTpBLHZhbHVlOiImIixzdGFydDp0fSk7ZWxzZXtpZigifCIhPT1lW3RoaXMuX2N1cnJlbnRdKXt2YXIgYT1uZXcgRXJyb3IoIlVua25vd24gY2hhcmFjdGVyOiIrZVt0aGlzLl9jdXJyZW50XSk7dGhyb3cgYS5uYW1lPSJMZXhlckVycm9yIixhfXQ9dGhpcy5fY3VycmVudCx0aGlzLl9jdXJyZW50KyssInwiPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLGkucHVzaCh7dHlwZTp3LHZhbHVlOiJ8fCIsc3RhcnQ6dH0pKTppLnB1c2goe3R5cGU6Xyx2YWx1ZToifCIsc3RhcnQ6dH0pfXJldHVybiBpfSxfY29uc3VtZVVucXVvdGVkSWRlbnRpZmllcjpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXMuX2N1cnJlbnQ7Zm9yKHRoaXMuX2N1cnJlbnQrKzt0aGlzLl9jdXJyZW50PGUubGVuZ3RoJiYoKHQ9ZVt0aGlzLl9jdXJyZW50XSk+PSJhIiYmdDw9InoifHx0Pj0iQSImJnQ8PSJaInx8dD49IjAiJiZ0PD0iOSJ8fCJfIj09PXQpOyl0aGlzLl9jdXJyZW50Kys7cmV0dXJuIGUuc2xpY2Uobix0aGlzLl9jdXJyZW50KX0sX2NvbnN1bWVRdW90ZWRJZGVudGlmaWVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnQ7dGhpcy5fY3VycmVudCsrO2Zvcih2YXIgbj1lLmxlbmd0aDsnIichPT1lW3RoaXMuX2N1cnJlbnRdJiZ0aGlzLl9jdXJyZW50PG47KXt2YXIgcj10aGlzLl9jdXJyZW50OyJcXCIhPT1lW3JdfHwiXFwiIT09ZVtyKzFdJiYnIichPT1lW3IrMV0/cisrOnIrPTIsdGhpcy5fY3VycmVudD1yfXJldHVybiB0aGlzLl9jdXJyZW50KyssSlNPTi5wYXJzZShlLnNsaWNlKHQsdGhpcy5fY3VycmVudCkpfSxfY29uc3VtZVJhd1N0cmluZ0xpdGVyYWw6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fY3VycmVudDt0aGlzLl9jdXJyZW50Kys7Zm9yKHZhciBuPWUubGVuZ3RoOyInIiE9PWVbdGhpcy5fY3VycmVudF0mJnRoaXMuX2N1cnJlbnQ8bjspe3ZhciByPXRoaXMuX2N1cnJlbnQ7IlxcIiE9PWVbcl18fCJcXCIhPT1lW3IrMV0mJiInIiE9PWVbcisxXT9yKys6cis9Mix0aGlzLl9jdXJyZW50PXJ9cmV0dXJuIHRoaXMuX2N1cnJlbnQrKyxlLnNsaWNlKHQrMSx0aGlzLl9jdXJyZW50LTEpLnJlcGxhY2UoIlxcJyIsIiciKX0sX2NvbnN1bWVOdW1iZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fY3VycmVudDt0aGlzLl9jdXJyZW50Kys7Zm9yKHZhciBuPWUubGVuZ3RoO0soZVt0aGlzLl9jdXJyZW50XSkmJnRoaXMuX2N1cnJlbnQ8bjspdGhpcy5fY3VycmVudCsrO3ZhciByPXBhcnNlSW50KGUuc2xpY2UodCx0aGlzLl9jdXJyZW50KSk7cmV0dXJue3R5cGU6VCx2YWx1ZTpyLHN0YXJ0OnR9fSxfY29uc3VtZUxCcmFja2V0OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnQ7cmV0dXJuIHRoaXMuX2N1cnJlbnQrKywiPyI9PT1lW3RoaXMuX2N1cnJlbnRdPyh0aGlzLl9jdXJyZW50Kysse3R5cGU6VSx2YWx1ZToiWz8iLHN0YXJ0OnR9KToiXSI9PT1lW3RoaXMuX2N1cnJlbnRdPyh0aGlzLl9jdXJyZW50Kysse3R5cGU6eCx2YWx1ZToiW10iLHN0YXJ0OnR9KTp7dHlwZTpqLHZhbHVlOiJbIixzdGFydDp0fX0sX2NvbnN1bWVPcGVyYXRvcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9jdXJyZW50LG49ZVt0XTtyZXR1cm4gdGhpcy5fY3VycmVudCsrLCIhIj09PW4/Ij0iPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLHt0eXBlOlAsdmFsdWU6IiE9IixzdGFydDp0fSk6e3R5cGU6cSx2YWx1ZToiISIsc3RhcnQ6dH06IjwiPT09bj8iPSI9PT1lW3RoaXMuX2N1cnJlbnRdPyh0aGlzLl9jdXJyZW50Kysse3R5cGU6RCx2YWx1ZToiPD0iLHN0YXJ0OnR9KTp7dHlwZTpOLHZhbHVlOiI8IixzdGFydDp0fToiPiI9PT1uPyI9Ij09PWVbdGhpcy5fY3VycmVudF0/KHRoaXMuX2N1cnJlbnQrKyx7dHlwZTpPLHZhbHVlOiI+PSIsc3RhcnQ6dH0pOnt0eXBlOkwsdmFsdWU6Ij4iLHN0YXJ0OnR9OiI9Ij09PW4mJiI9Ij09PWVbdGhpcy5fY3VycmVudF0/KHRoaXMuX2N1cnJlbnQrKyx7dHlwZTprLHZhbHVlOiI9PSIsc3RhcnQ6dH0pOnZvaWQgMH0sX2NvbnN1bWVMaXRlcmFsOmZ1bmN0aW9uKGUpe3RoaXMuX2N1cnJlbnQrKztmb3IodmFyIHQsbj10aGlzLl9jdXJyZW50LHI9ZS5sZW5ndGg7ImAiIT09ZVt0aGlzLl9jdXJyZW50XSYmdGhpcy5fY3VycmVudDxyOyl7dmFyIG89dGhpcy5fY3VycmVudDsiXFwiIT09ZVtvXXx8IlxcIiE9PWVbbysxXSYmImAiIT09ZVtvKzFdP28rKzpvKz0yLHRoaXMuX2N1cnJlbnQ9b312YXIgcz1pKGUuc2xpY2Uobix0aGlzLl9jdXJyZW50KSk7cmV0dXJuIHM9cy5yZXBsYWNlKCJcXGAiLCJgIiksdD10aGlzLl9sb29rc0xpa2VKU09OKHMpP0pTT04ucGFyc2Uocyk6SlNPTi5wYXJzZSgnIicrcysnIicpLHRoaXMuX2N1cnJlbnQrKyx0fSxfbG9va3NMaWtlSlNPTjpmdW5jdGlvbihlKXtpZigiIj09PWUpcmV0dXJuITE7aWYoJ1t7IicuaW5kZXhPZihlWzBdKT49MClyZXR1cm4hMDtpZihbInRydWUiLCJmYWxzZSIsIm51bGwiXS5pbmRleE9mKGUpPj0wKXJldHVybiEwO2lmKCEoIi0wMTIzNDU2Nzg5Ii5pbmRleE9mKGVbMF0pPj0wKSlyZXR1cm4hMTt0cnl7cmV0dXJuIEpTT04ucGFyc2UoZSksITB9Y2F0Y2goZSl7cmV0dXJuITF9fX07dmFyIFk9e307ZnVuY3Rpb24gJCgpe31mdW5jdGlvbiBKKGUpe3RoaXMucnVudGltZT1lfWZ1bmN0aW9uIFEoZSl7dGhpcy5faW50ZXJwcmV0ZXI9ZSx0aGlzLmZ1bmN0aW9uVGFibGU9e2Ficzp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25BYnMsX3NpZ25hdHVyZTpbe3R5cGVzOltzXX1dfSxhdmc6e19mdW5jOnRoaXMuX2Z1bmN0aW9uQXZnLF9zaWduYXR1cmU6W3t0eXBlczpbZF19XX0sY2VpbDp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25DZWlsLF9zaWduYXR1cmU6W3t0eXBlczpbc119XX0sY29udGFpbnM6e19mdW5jOnRoaXMuX2Z1bmN0aW9uQ29udGFpbnMsX3NpZ25hdHVyZTpbe3R5cGVzOltjLHVdfSx7dHlwZXM6W2FdfV19LGVuZHNfd2l0aDp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25FbmRzV2l0aCxfc2lnbmF0dXJlOlt7dHlwZXM6W2NdfSx7dHlwZXM6W2NdfV19LGZsb29yOntfZnVuYzp0aGlzLl9mdW5jdGlvbkZsb29yLF9zaWduYXR1cmU6W3t0eXBlczpbc119XX0sbGVuZ3RoOntfZnVuYzp0aGlzLl9mdW5jdGlvbkxlbmd0aCxfc2lnbmF0dXJlOlt7dHlwZXM6W2MsdSxsXX1dfSxtYXA6e19mdW5jOnRoaXMuX2Z1bmN0aW9uTWFwLF9zaWduYXR1cmU6W3t0eXBlczpbcF19LHt0eXBlczpbdV19XX0sbWF4OntfZnVuYzp0aGlzLl9mdW5jdGlvbk1heCxfc2lnbmF0dXJlOlt7dHlwZXM6W2QsaF19XX0sbWVyZ2U6e19mdW5jOnRoaXMuX2Z1bmN0aW9uTWVyZ2UsX3NpZ25hdHVyZTpbe3R5cGVzOltsXSx2YXJpYWRpYzohMH1dfSxtYXhfYnk6e19mdW5jOnRoaXMuX2Z1bmN0aW9uTWF4QnksX3NpZ25hdHVyZTpbe3R5cGVzOlt1XX0se3R5cGVzOltwXX1dfSxzdW06e19mdW5jOnRoaXMuX2Z1bmN0aW9uU3VtLF9zaWduYXR1cmU6W3t0eXBlczpbZF19XX0sc3RhcnRzX3dpdGg6e19mdW5jOnRoaXMuX2Z1bmN0aW9uU3RhcnRzV2l0aCxfc2lnbmF0dXJlOlt7dHlwZXM6W2NdfSx7dHlwZXM6W2NdfV19LG1pbjp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25NaW4sX3NpZ25hdHVyZTpbe3R5cGVzOltkLGhdfV19LG1pbl9ieTp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25NaW5CeSxfc2lnbmF0dXJlOlt7dHlwZXM6W3VdfSx7dHlwZXM6W3BdfV19LHR5cGU6e19mdW5jOnRoaXMuX2Z1bmN0aW9uVHlwZSxfc2lnbmF0dXJlOlt7dHlwZXM6W2FdfV19LGtleXM6e19mdW5jOnRoaXMuX2Z1bmN0aW9uS2V5cyxfc2lnbmF0dXJlOlt7dHlwZXM6W2xdfV19LHZhbHVlczp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25WYWx1ZXMsX3NpZ25hdHVyZTpbe3R5cGVzOltsXX1dfSxzb3J0OntfZnVuYzp0aGlzLl9mdW5jdGlvblNvcnQsX3NpZ25hdHVyZTpbe3R5cGVzOltoLGRdfV19LHNvcnRfYnk6e19mdW5jOnRoaXMuX2Z1bmN0aW9uU29ydEJ5LF9zaWduYXR1cmU6W3t0eXBlczpbdV19LHt0eXBlczpbcF19XX0sam9pbjp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25Kb2luLF9zaWduYXR1cmU6W3t0eXBlczpbY119LHt0eXBlczpbaF19XX0scmV2ZXJzZTp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25SZXZlcnNlLF9zaWduYXR1cmU6W3t0eXBlczpbYyx1XX1dfSx0b19hcnJheTp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25Ub0FycmF5LF9zaWduYXR1cmU6W3t0eXBlczpbYV19XX0sdG9fc3RyaW5nOntfZnVuYzp0aGlzLl9mdW5jdGlvblRvU3RyaW5nLF9zaWduYXR1cmU6W3t0eXBlczpbYV19XX0sdG9fbnVtYmVyOntfZnVuYzp0aGlzLl9mdW5jdGlvblRvTnVtYmVyLF9zaWduYXR1cmU6W3t0eXBlczpbYV19XX0sbm90X251bGw6e19mdW5jOnRoaXMuX2Z1bmN0aW9uTm90TnVsbCxfc2lnbmF0dXJlOlt7dHlwZXM6W2FdLHZhcmlhZGljOiEwfV19fX1ZW2ddPTAsWVttXT0wLFlbdl09MCxZW3ldPTAsWVtFXT0wLFlbU109MCxZW0NdPTAsWVtUXT0wLFlbSV09MCxZW0FdPTAsWVtfXT0xLFlbd109MixZW1JdPTMsWVtrXT01LFlbTF09NSxZW05dPTUsWVtPXT01LFlbRF09NSxZW1BdPTUsWVt4XT05LFlbTV09MjAsWVtVXT0yMSxZW0ZdPTQwLFlbcV09NDUsWVtCXT01MCxZW2pdPTU1LFlbVl09NjAsJC5wcm90b3R5cGU9e3BhcnNlOmZ1bmN0aW9uKGUpe3RoaXMuX2xvYWRUb2tlbnMoZSksdGhpcy5pbmRleD0wO3ZhciB0PXRoaXMuZXhwcmVzc2lvbigwKTtpZih0aGlzLl9sb29rYWhlYWQoMCkhPT1nKXt2YXIgbj10aGlzLl9sb29rYWhlYWRUb2tlbigwKSxyPW5ldyBFcnJvcigiVW5leHBlY3RlZCB0b2tlbiB0eXBlOiAiK24udHlwZSsiLCB2YWx1ZTogIituLnZhbHVlKTt0aHJvdyByLm5hbWU9IlBhcnNlckVycm9yIixyfXJldHVybiB0fSxfbG9hZFRva2VuczpmdW5jdGlvbihlKXt2YXIgdD0obmV3IFgpLnRva2VuaXplKGUpO3QucHVzaCh7dHlwZTpnLHZhbHVlOiIiLHN0YXJ0OmUubGVuZ3RofSksdGhpcy50b2tlbnM9dH0sZXhwcmVzc2lvbjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9sb29rYWhlYWRUb2tlbigwKTt0aGlzLl9hZHZhbmNlKCk7Zm9yKHZhciBuPXRoaXMubnVkKHQpLHI9dGhpcy5fbG9va2FoZWFkKDApO2U8WVtyXTspdGhpcy5fYWR2YW5jZSgpLG49dGhpcy5sZWQocixuKSxyPXRoaXMuX2xvb2thaGVhZCgwKTtyZXR1cm4gbn0sX2xvb2thaGVhZDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50b2tlbnNbdGhpcy5pbmRleCtlXS50eXBlfSxfbG9va2FoZWFkVG9rZW46ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudG9rZW5zW3RoaXMuaW5kZXgrZV19LF9hZHZhbmNlOmZ1bmN0aW9uKCl7dGhpcy5pbmRleCsrfSxudWQ6ZnVuY3Rpb24oZSl7dmFyIHQsbjtzd2l0Y2goZS50eXBlKXtjYXNlIFc6cmV0dXJue3R5cGU6IkxpdGVyYWwiLHZhbHVlOmUudmFsdWV9O2Nhc2UgbTpyZXR1cm57dHlwZToiRmllbGQiLG5hbWU6ZS52YWx1ZX07Y2FzZSB2OnZhciByPXt0eXBlOiJGaWVsZCIsbmFtZTplLnZhbHVlfTtpZih0aGlzLl9sb29rYWhlYWQoMCk9PT1WKXRocm93IG5ldyBFcnJvcigiUXVvdGVkIGlkZW50aWZpZXIgbm90IGFsbG93ZWQgZm9yIGZ1bmN0aW9uIG5hbWVzLiIpO3JldHVybiByO2Nhc2UgcTpyZXR1cm57dHlwZToiTm90RXhwcmVzc2lvbiIsY2hpbGRyZW46W3Q9dGhpcy5leHByZXNzaW9uKFkuTm90KV19O2Nhc2UgTTpyZXR1cm4gdD1udWxsLHt0eXBlOiJWYWx1ZVByb2plY3Rpb24iLGNoaWxkcmVuOlt7dHlwZToiSWRlbnRpdHkifSx0PXRoaXMuX2xvb2thaGVhZCgwKT09PXk/e3R5cGU6IklkZW50aXR5In06dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKFkuU3RhcildfTtjYXNlIFU6cmV0dXJuIHRoaXMubGVkKGUudHlwZSx7dHlwZToiSWRlbnRpdHkifSk7Y2FzZSBCOnJldHVybiB0aGlzLl9wYXJzZU11bHRpc2VsZWN0SGFzaCgpO2Nhc2UgeDpyZXR1cm57dHlwZToiUHJvamVjdGlvbiIsY2hpbGRyZW46W3t0eXBlOngsY2hpbGRyZW46W3t0eXBlOiJJZGVudGl0eSJ9XX0sdD10aGlzLl9wYXJzZVByb2plY3Rpb25SSFMoWS5GbGF0dGVuKV19O2Nhc2UgajpyZXR1cm4gdGhpcy5fbG9va2FoZWFkKDApPT09VHx8dGhpcy5fbG9va2FoZWFkKDApPT09Yj8odD10aGlzLl9wYXJzZUluZGV4RXhwcmVzc2lvbigpLHRoaXMuX3Byb2plY3RJZlNsaWNlKHt0eXBlOiJJZGVudGl0eSJ9LHQpKTp0aGlzLl9sb29rYWhlYWQoMCk9PT1NJiZ0aGlzLl9sb29rYWhlYWQoMSk9PT15Pyh0aGlzLl9hZHZhbmNlKCksdGhpcy5fYWR2YW5jZSgpLHt0eXBlOiJQcm9qZWN0aW9uIixjaGlsZHJlbjpbe3R5cGU6IklkZW50aXR5In0sdD10aGlzLl9wYXJzZVByb2plY3Rpb25SSFMoWS5TdGFyKV19KTp0aGlzLl9wYXJzZU11bHRpc2VsZWN0TGlzdCgpO2Nhc2UgSTpyZXR1cm57dHlwZTpJfTtjYXNlIEE6cmV0dXJue3R5cGU6IkV4cHJlc3Npb25SZWZlcmVuY2UiLGNoaWxkcmVuOltuPXRoaXMuZXhwcmVzc2lvbihZLkV4cHJlZildfTtjYXNlIFY6Zm9yKHZhciBvPVtdO3RoaXMuX2xvb2thaGVhZCgwKSE9PUU7KXRoaXMuX2xvb2thaGVhZCgwKT09PUk/KG49e3R5cGU6SX0sdGhpcy5fYWR2YW5jZSgpKTpuPXRoaXMuZXhwcmVzc2lvbigwKSxvLnB1c2gobik7cmV0dXJuIHRoaXMuX21hdGNoKEUpLG9bMF07ZGVmYXVsdDp0aGlzLl9lcnJvclRva2VuKGUpfX0sbGVkOmZ1bmN0aW9uKGUsdCl7dmFyIG47c3dpdGNoKGUpe2Nhc2UgRjp2YXIgcj1ZLkRvdDtyZXR1cm4gdGhpcy5fbG9va2FoZWFkKDApIT09TT97dHlwZToiU3ViZXhwcmVzc2lvbiIsY2hpbGRyZW46W3Qsbj10aGlzLl9wYXJzZURvdFJIUyhyKV19Oih0aGlzLl9hZHZhbmNlKCkse3R5cGU6IlZhbHVlUHJvamVjdGlvbiIsY2hpbGRyZW46W3Qsbj10aGlzLl9wYXJzZVByb2plY3Rpb25SSFMocildfSk7Y2FzZSBfOnJldHVybiBuPXRoaXMuZXhwcmVzc2lvbihZLlBpcGUpLHt0eXBlOl8sY2hpbGRyZW46W3Qsbl19O2Nhc2UgdzpyZXR1cm57dHlwZToiT3JFeHByZXNzaW9uIixjaGlsZHJlbjpbdCxuPXRoaXMuZXhwcmVzc2lvbihZLk9yKV19O2Nhc2UgUjpyZXR1cm57dHlwZToiQW5kRXhwcmVzc2lvbiIsY2hpbGRyZW46W3Qsbj10aGlzLmV4cHJlc3Npb24oWS5BbmQpXX07Y2FzZSBWOmZvcih2YXIgbyxpPXQubmFtZSxzPVtdO3RoaXMuX2xvb2thaGVhZCgwKSE9PUU7KXRoaXMuX2xvb2thaGVhZCgwKT09PUk/KG89e3R5cGU6SX0sdGhpcy5fYWR2YW5jZSgpKTpvPXRoaXMuZXhwcmVzc2lvbigwKSx0aGlzLl9sb29rYWhlYWQoMCk9PT1TJiZ0aGlzLl9tYXRjaChTKSxzLnB1c2gobyk7cmV0dXJuIHRoaXMuX21hdGNoKEUpLHt0eXBlOiJGdW5jdGlvbiIsbmFtZTppLGNoaWxkcmVuOnN9O2Nhc2UgVTp2YXIgYT10aGlzLmV4cHJlc3Npb24oMCk7cmV0dXJuIHRoaXMuX21hdGNoKHkpLHt0eXBlOiJGaWx0ZXJQcm9qZWN0aW9uIixjaGlsZHJlbjpbdCxuPXRoaXMuX2xvb2thaGVhZCgwKT09PXg/e3R5cGU6IklkZW50aXR5In06dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKFkuRmlsdGVyKSxhXX07Y2FzZSB4OnJldHVybnt0eXBlOiJQcm9qZWN0aW9uIixjaGlsZHJlbjpbe3R5cGU6eCxjaGlsZHJlbjpbdF19LHRoaXMuX3BhcnNlUHJvamVjdGlvblJIUyhZLkZsYXR0ZW4pXX07Y2FzZSBrOmNhc2UgUDpjYXNlIEw6Y2FzZSBPOmNhc2UgTjpjYXNlIEQ6cmV0dXJuIHRoaXMuX3BhcnNlQ29tcGFyYXRvcih0LGUpO2Nhc2Ugajp2YXIgYz10aGlzLl9sb29rYWhlYWRUb2tlbigwKTtyZXR1cm4gYy50eXBlPT09VHx8Yy50eXBlPT09Yj8obj10aGlzLl9wYXJzZUluZGV4RXhwcmVzc2lvbigpLHRoaXMuX3Byb2plY3RJZlNsaWNlKHQsbikpOih0aGlzLl9tYXRjaChNKSx0aGlzLl9tYXRjaCh5KSx7dHlwZToiUHJvamVjdGlvbiIsY2hpbGRyZW46W3Qsbj10aGlzLl9wYXJzZVByb2plY3Rpb25SSFMoWS5TdGFyKV19KTtkZWZhdWx0OnRoaXMuX2Vycm9yVG9rZW4odGhpcy5fbG9va2FoZWFkVG9rZW4oMCkpfX0sX21hdGNoOmZ1bmN0aW9uKGUpe2lmKHRoaXMuX2xvb2thaGVhZCgwKSE9PWUpe3ZhciB0PXRoaXMuX2xvb2thaGVhZFRva2VuKDApLG49bmV3IEVycm9yKCJFeHBlY3RlZCAiK2UrIiwgZ290OiAiK3QudHlwZSk7dGhyb3cgbi5uYW1lPSJQYXJzZXJFcnJvciIsbn10aGlzLl9hZHZhbmNlKCl9LF9lcnJvclRva2VuOmZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBFcnJvcigiSW52YWxpZCB0b2tlbiAoIitlLnR5cGUrJyk6ICInK2UudmFsdWUrJyInKTt0aHJvdyB0Lm5hbWU9IlBhcnNlckVycm9yIix0fSxfcGFyc2VJbmRleEV4cHJlc3Npb246ZnVuY3Rpb24oKXtpZih0aGlzLl9sb29rYWhlYWQoMCk9PT1ifHx0aGlzLl9sb29rYWhlYWQoMSk9PT1iKXJldHVybiB0aGlzLl9wYXJzZVNsaWNlRXhwcmVzc2lvbigpO3ZhciBlPXt0eXBlOiJJbmRleCIsdmFsdWU6dGhpcy5fbG9va2FoZWFkVG9rZW4oMCkudmFsdWV9O3JldHVybiB0aGlzLl9hZHZhbmNlKCksdGhpcy5fbWF0Y2goeSksZX0sX3Byb2plY3RJZlNsaWNlOmZ1bmN0aW9uKGUsdCl7dmFyIG49e3R5cGU6IkluZGV4RXhwcmVzc2lvbiIsY2hpbGRyZW46W2UsdF19O3JldHVybiJTbGljZSI9PT10LnR5cGU/e3R5cGU6IlByb2plY3Rpb24iLGNoaWxkcmVuOltuLHRoaXMuX3BhcnNlUHJvamVjdGlvblJIUyhZLlN0YXIpXX06bn0sX3BhcnNlU2xpY2VFeHByZXNzaW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtudWxsLG51bGwsbnVsbF0sdD0wLG49dGhpcy5fbG9va2FoZWFkKDApO24hPT15JiZ0PDM7KXtpZihuPT09Yil0KyssdGhpcy5fYWR2YW5jZSgpO2Vsc2V7aWYobiE9PVQpe3ZhciByPXRoaXMuX2xvb2thaGVhZCgwKSxvPW5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bmV4cGVjdGVkIHRva2VuOiAiK3IudmFsdWUrIigiK3IudHlwZSsiKSIpO3Rocm93IG8ubmFtZT0iUGFyc2VyZXJyb3IiLG99ZVt0XT10aGlzLl9sb29rYWhlYWRUb2tlbigwKS52YWx1ZSx0aGlzLl9hZHZhbmNlKCl9bj10aGlzLl9sb29rYWhlYWQoMCl9cmV0dXJuIHRoaXMuX21hdGNoKHkpLHt0eXBlOiJTbGljZSIsY2hpbGRyZW46ZX19LF9wYXJzZUNvbXBhcmF0b3I6ZnVuY3Rpb24oZSx0KXtyZXR1cm57dHlwZToiQ29tcGFyYXRvciIsbmFtZTp0LGNoaWxkcmVuOltlLHRoaXMuZXhwcmVzc2lvbihZW3RdKV19fSxfcGFyc2VEb3RSSFM6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbG9va2FoZWFkKDApO3JldHVyblttLHYsTV0uaW5kZXhPZih0KT49MD90aGlzLmV4cHJlc3Npb24oZSk6dD09PWo/KHRoaXMuX21hdGNoKGopLHRoaXMuX3BhcnNlTXVsdGlzZWxlY3RMaXN0KCkpOnQ9PT1CPyh0aGlzLl9tYXRjaChCKSx0aGlzLl9wYXJzZU11bHRpc2VsZWN0SGFzaCgpKTp2b2lkIDB9LF9wYXJzZVByb2plY3Rpb25SSFM6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoWVt0aGlzLl9sb29rYWhlYWQoMCldPDEwKXQ9e3R5cGU6IklkZW50aXR5In07ZWxzZSBpZih0aGlzLl9sb29rYWhlYWQoMCk9PT1qKXQ9dGhpcy5leHByZXNzaW9uKGUpO2Vsc2UgaWYodGhpcy5fbG9va2FoZWFkKDApPT09VSl0PXRoaXMuZXhwcmVzc2lvbihlKTtlbHNle2lmKHRoaXMuX2xvb2thaGVhZCgwKSE9PUYpe3ZhciBuPXRoaXMuX2xvb2thaGVhZFRva2VuKDApLHI9bmV3IEVycm9yKCJTeXRhbnggZXJyb3IsIHVuZXhwZWN0ZWQgdG9rZW46ICIrbi52YWx1ZSsiKCIrbi50eXBlKyIpIik7dGhyb3cgci5uYW1lPSJQYXJzZXJFcnJvciIscn10aGlzLl9tYXRjaChGKSx0PXRoaXMuX3BhcnNlRG90UkhTKGUpfXJldHVybiB0fSxfcGFyc2VNdWx0aXNlbGVjdExpc3Q6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W107dGhpcy5fbG9va2FoZWFkKDApIT09eTspe3ZhciB0PXRoaXMuZXhwcmVzc2lvbigwKTtpZihlLnB1c2godCksdGhpcy5fbG9va2FoZWFkKDApPT09UyYmKHRoaXMuX21hdGNoKFMpLHRoaXMuX2xvb2thaGVhZCgwKT09PXkpKXRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCB0b2tlbiBSYnJhY2tldCIpfXJldHVybiB0aGlzLl9tYXRjaCh5KSx7dHlwZToiTXVsdGlTZWxlY3RMaXN0IixjaGlsZHJlbjplfX0sX3BhcnNlTXVsdGlzZWxlY3RIYXNoOmZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQsbixyPVtdLG89W20sdl07Oyl7aWYoZT10aGlzLl9sb29rYWhlYWRUb2tlbigwKSxvLmluZGV4T2YoZS50eXBlKTwwKXRocm93IG5ldyBFcnJvcigiRXhwZWN0aW5nIGFuIGlkZW50aWZpZXIgdG9rZW4sIGdvdDogIitlLnR5cGUpO2lmKHQ9ZS52YWx1ZSx0aGlzLl9hZHZhbmNlKCksdGhpcy5fbWF0Y2goYiksbj17dHlwZToiS2V5VmFsdWVQYWlyIixuYW1lOnQsdmFsdWU6dGhpcy5leHByZXNzaW9uKDApfSxyLnB1c2gobiksdGhpcy5fbG9va2FoZWFkKDApPT09Uyl0aGlzLl9tYXRjaChTKTtlbHNlIGlmKHRoaXMuX2xvb2thaGVhZCgwKT09PUMpe3RoaXMuX21hdGNoKEMpO2JyZWFrfX1yZXR1cm57dHlwZToiTXVsdGlTZWxlY3RIYXNoIixjaGlsZHJlbjpyfX19LEoucHJvdG90eXBlPXtzZWFyY2g6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy52aXNpdChlLHQpfSx2aXNpdDpmdW5jdGlvbihlLGkpe3ZhciBzLGEsYyx1LGwscCxkLGgsZjtzd2l0Y2goZS50eXBlKXtjYXNlIkZpZWxkIjpyZXR1cm4gbnVsbCE9PWkmJm4oaSk/dm9pZCAwPT09KHA9aVtlLm5hbWVdKT9udWxsOnA6bnVsbDtjYXNlIlN1YmV4cHJlc3Npb24iOmZvcihjPXRoaXMudmlzaXQoZS5jaGlsZHJlblswXSxpKSxmPTE7ZjxlLmNoaWxkcmVuLmxlbmd0aDtmKyspaWYobnVsbD09PShjPXRoaXMudmlzaXQoZS5jaGlsZHJlblsxXSxjKSkpcmV0dXJuIG51bGw7cmV0dXJuIGM7Y2FzZSJJbmRleEV4cHJlc3Npb24iOnJldHVybiBkPXRoaXMudmlzaXQoZS5jaGlsZHJlblswXSxpKSx0aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0sZCk7Y2FzZSJJbmRleCI6aWYoIXQoaSkpcmV0dXJuIG51bGw7dmFyIGc9ZS52YWx1ZTtyZXR1cm4gZzwwJiYoZz1pLmxlbmd0aCtnKSx2b2lkIDA9PT0oYz1pW2ddKSYmKGM9bnVsbCksYztjYXNlIlNsaWNlIjppZighdChpKSlyZXR1cm4gbnVsbDt2YXIgbT1lLmNoaWxkcmVuLnNsaWNlKDApLHY9dGhpcy5jb21wdXRlU2xpY2VQYXJhbXMoaS5sZW5ndGgsbSkseT12WzBdLEU9dlsxXSxTPXZbMl07aWYoYz1bXSxTPjApZm9yKGY9eTtmPEU7Zis9UyljLnB1c2goaVtmXSk7ZWxzZSBmb3IoZj15O2Y+RTtmKz1TKWMucHVzaChpW2ZdKTtyZXR1cm4gYztjYXNlIlByb2plY3Rpb24iOnZhciBiPXRoaXMudmlzaXQoZS5jaGlsZHJlblswXSxpKTtpZighdChiKSlyZXR1cm4gbnVsbDtmb3IoaD1bXSxmPTA7ZjxiLmxlbmd0aDtmKyspbnVsbCE9PShhPXRoaXMudmlzaXQoZS5jaGlsZHJlblsxXSxiW2ZdKSkmJmgucHVzaChhKTtyZXR1cm4gaDtjYXNlIlZhbHVlUHJvamVjdGlvbiI6aWYoIW4oYj10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSkpKXJldHVybiBudWxsO2g9W107dmFyIEM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49W10scj0wO3I8dC5sZW5ndGg7cisrKW4ucHVzaChlW3Rbcl1dKTtyZXR1cm4gbn0oYik7Zm9yKGY9MDtmPEMubGVuZ3RoO2YrKyludWxsIT09KGE9dGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLENbZl0pKSYmaC5wdXNoKGEpO3JldHVybiBoO2Nhc2UiRmlsdGVyUHJvamVjdGlvbiI6aWYoIXQoYj10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSkpKXJldHVybiBudWxsO3ZhciBUPVtdLHc9W107Zm9yKGY9MDtmPGIubGVuZ3RoO2YrKylvKHM9dGhpcy52aXNpdChlLmNoaWxkcmVuWzJdLGJbZl0pKXx8VC5wdXNoKGJbZl0pO2Zvcih2YXIgUj0wO1I8VC5sZW5ndGg7UisrKW51bGwhPT0oYT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0sVFtSXSkpJiZ3LnB1c2goYSk7cmV0dXJuIHc7Y2FzZSJDb21wYXJhdG9yIjpzd2l0Y2godT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSksbD10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0saSksZS5uYW1lKXtjYXNlIGs6Yz1yKHUsbCk7YnJlYWs7Y2FzZSBQOmM9IXIodSxsKTticmVhaztjYXNlIEw6Yz11Pmw7YnJlYWs7Y2FzZSBPOmM9dT49bDticmVhaztjYXNlIE46Yz11PGw7YnJlYWs7Y2FzZSBEOmM9dTw9bDticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBjb21wYXJhdG9yOiAiK2UubmFtZSl9cmV0dXJuIGM7Y2FzZSB4OnZhciBNPXRoaXMudmlzaXQoZS5jaGlsZHJlblswXSxpKTtpZighdChNKSlyZXR1cm4gbnVsbDt2YXIgVT1bXTtmb3IoZj0wO2Y8TS5sZW5ndGg7ZisrKXQoYT1NW2ZdKT9VLnB1c2guYXBwbHkoVSxhKTpVLnB1c2goYSk7cmV0dXJuIFU7Y2FzZSJJZGVudGl0eSI6cmV0dXJuIGk7Y2FzZSJNdWx0aVNlbGVjdExpc3QiOmlmKG51bGw9PT1pKXJldHVybiBudWxsO2ZvcihoPVtdLGY9MDtmPGUuY2hpbGRyZW4ubGVuZ3RoO2YrKyloLnB1c2godGhpcy52aXNpdChlLmNoaWxkcmVuW2ZdLGkpKTtyZXR1cm4gaDtjYXNlIk11bHRpU2VsZWN0SGFzaCI6aWYobnVsbD09PWkpcmV0dXJuIG51bGw7dmFyIEY7Zm9yKGg9e30sZj0wO2Y8ZS5jaGlsZHJlbi5sZW5ndGg7ZisrKWhbKEY9ZS5jaGlsZHJlbltmXSkubmFtZV09dGhpcy52aXNpdChGLnZhbHVlLGkpO3JldHVybiBoO2Nhc2UiT3JFeHByZXNzaW9uIjpyZXR1cm4gbyhzPXRoaXMudmlzaXQoZS5jaGlsZHJlblswXSxpKSkmJihzPXRoaXMudmlzaXQoZS5jaGlsZHJlblsxXSxpKSkscztjYXNlIkFuZEV4cHJlc3Npb24iOnJldHVybiEwPT09byh1PXRoaXMudmlzaXQoZS5jaGlsZHJlblswXSxpKSk/dTp0aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0saSk7Y2FzZSJOb3RFeHByZXNzaW9uIjpyZXR1cm4gbyh1PXRoaXMudmlzaXQoZS5jaGlsZHJlblswXSxpKSk7Y2FzZSJMaXRlcmFsIjpyZXR1cm4gZS52YWx1ZTtjYXNlIF86cmV0dXJuIGQ9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpLHRoaXMudmlzaXQoZS5jaGlsZHJlblsxXSxkKTtjYXNlIEk6cmV0dXJuIGk7Y2FzZSJGdW5jdGlvbiI6dmFyIHE9W107Zm9yKGY9MDtmPGUuY2hpbGRyZW4ubGVuZ3RoO2YrKylxLnB1c2godGhpcy52aXNpdChlLmNoaWxkcmVuW2ZdLGkpKTtyZXR1cm4gdGhpcy5ydW50aW1lLmNhbGxGdW5jdGlvbihlLm5hbWUscSk7Y2FzZSJFeHByZXNzaW9uUmVmZXJlbmNlIjp2YXIgQj1lLmNoaWxkcmVuWzBdO3JldHVybiBCLmptZXNwYXRoVHlwZT1BLEI7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gbm9kZSB0eXBlOiAiK2UudHlwZSl9fSxjb21wdXRlU2xpY2VQYXJhbXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj10WzBdLHI9dFsxXSxvPXRbMl0saT1bbnVsbCxudWxsLG51bGxdO2lmKG51bGw9PT1vKW89MTtlbHNlIGlmKDA9PT1vKXt2YXIgcz1uZXcgRXJyb3IoIkludmFsaWQgc2xpY2UsIHN0ZXAgY2Fubm90IGJlIDAiKTt0aHJvdyBzLm5hbWU9IlJ1bnRpbWVFcnJvciIsc312YXIgYT1vPDA7cmV0dXJuIG49bnVsbD09PW4/YT9lLTE6MDp0aGlzLmNhcFNsaWNlUmFuZ2UoZSxuLG8pLHI9bnVsbD09PXI/YT8tMTplOnRoaXMuY2FwU2xpY2VSYW5nZShlLHIsbyksaVswXT1uLGlbMV09cixpWzJdPW8saX0sY2FwU2xpY2VSYW5nZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ8MD8odCs9ZSk8MCYmKHQ9bjwwPy0xOjApOnQ+PWUmJih0PW48MD9lLTE6ZSksdH19LFEucHJvdG90eXBlPXtjYWxsRnVuY3Rpb246ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmZ1bmN0aW9uVGFibGVbZV07aWYodm9pZCAwPT09bil0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gZnVuY3Rpb246ICIrZSsiKCkiKTtyZXR1cm4gdGhpcy5fdmFsaWRhdGVBcmdzKGUsdCxuLl9zaWduYXR1cmUpLG4uX2Z1bmMuY2FsbCh0aGlzLHQpfSxfdmFsaWRhdGVBcmdzOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixvLGkscztpZihuW24ubGVuZ3RoLTFdLnZhcmlhZGljKXtpZih0Lmxlbmd0aDxuLmxlbmd0aCl0aHJvdyByPTE9PT1uLmxlbmd0aD8iIGFyZ3VtZW50IjoiIGFyZ3VtZW50cyIsbmV3IEVycm9yKCJBcmd1bWVudEVycm9yOiAiK2UrIigpIHRha2VzIGF0IGxlYXN0IituLmxlbmd0aCtyKyIgYnV0IHJlY2VpdmVkICIrdC5sZW5ndGgpfWVsc2UgaWYodC5sZW5ndGghPT1uLmxlbmd0aCl0aHJvdyByPTE9PT1uLmxlbmd0aD8iIGFyZ3VtZW50IjoiIGFyZ3VtZW50cyIsbmV3IEVycm9yKCJBcmd1bWVudEVycm9yOiAiK2UrIigpIHRha2VzICIrbi5sZW5ndGgrcisiIGJ1dCByZWNlaXZlZCAiK3QubGVuZ3RoKTtmb3IodmFyIGE9MDthPG4ubGVuZ3RoO2ErKyl7cz0hMSxvPW5bYV0udHlwZXMsaT10aGlzLl9nZXRUeXBlTmFtZSh0W2FdKTtmb3IodmFyIGM9MDtjPG8ubGVuZ3RoO2MrKylpZih0aGlzLl90eXBlTWF0Y2hlcyhpLG9bY10sdFthXSkpe3M9ITA7YnJlYWt9aWYoIXMpe3ZhciB1PW8ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZltlXX0pKS5qb2luKCIsIik7dGhyb3cgbmV3IEVycm9yKCJUeXBlRXJyb3I6ICIrZSsiKCkgZXhwZWN0ZWQgYXJndW1lbnQgIisoYSsxKSsiIHRvIGJlIHR5cGUgIit1KyIgYnV0IHJlY2VpdmVkIHR5cGUgIitmW2ldKyIgaW5zdGVhZC4iKX19fSxfdHlwZU1hdGNoZXM6ZnVuY3Rpb24oZSx0LG4pe2lmKHQ9PT1hKXJldHVybiEwO2lmKHQhPT1oJiZ0IT09ZCYmdCE9PXUpcmV0dXJuIGU9PT10O2lmKHQ9PT11KXJldHVybiBlPT09dTtpZihlPT09dSl7dmFyIHI7dD09PWQ/cj1zOnQ9PT1oJiYocj1jKTtmb3IodmFyIG89MDtvPG4ubGVuZ3RoO28rKylpZighdGhpcy5fdHlwZU1hdGNoZXModGhpcy5fZ2V0VHlwZU5hbWUobltvXSkscixuW29dKSlyZXR1cm4hMTtyZXR1cm4hMH19LF9nZXRUeXBlTmFtZTpmdW5jdGlvbihlKXtzd2l0Y2goT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKXtjYXNlIltvYmplY3QgU3RyaW5nXSI6cmV0dXJuIGM7Y2FzZSJbb2JqZWN0IE51bWJlcl0iOnJldHVybiBzO2Nhc2UiW29iamVjdCBBcnJheV0iOnJldHVybiB1O2Nhc2UiW29iamVjdCBCb29sZWFuXSI6cmV0dXJuIDU7Y2FzZSJbb2JqZWN0IE51bGxdIjpyZXR1cm4gNztjYXNlIltvYmplY3QgT2JqZWN0XSI6cmV0dXJuIGUuam1lc3BhdGhUeXBlPT09QT9wOmx9fSxfZnVuY3Rpb25TdGFydHNXaXRoOmZ1bmN0aW9uKGUpe3JldHVybiAwPT09ZVswXS5sYXN0SW5kZXhPZihlWzFdKX0sX2Z1bmN0aW9uRW5kc1dpdGg6ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXSxuPWVbMV07cmV0dXJuLTEhPT10LmluZGV4T2Yobix0Lmxlbmd0aC1uLmxlbmd0aCl9LF9mdW5jdGlvblJldmVyc2U6ZnVuY3Rpb24oZSl7aWYodGhpcy5fZ2V0VHlwZU5hbWUoZVswXSk9PT1jKXtmb3IodmFyIHQ9ZVswXSxuPSIiLHI9dC5sZW5ndGgtMTtyPj0wO3ItLSluKz10W3JdO3JldHVybiBufXZhciBvPWVbMF0uc2xpY2UoMCk7cmV0dXJuIG8ucmV2ZXJzZSgpLG99LF9mdW5jdGlvbkFiczpmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5hYnMoZVswXSl9LF9mdW5jdGlvbkNlaWw6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguY2VpbChlWzBdKX0sX2Z1bmN0aW9uQXZnOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49ZVswXSxyPTA7cjxuLmxlbmd0aDtyKyspdCs9bltyXTtyZXR1cm4gdC9uLmxlbmd0aH0sX2Z1bmN0aW9uQ29udGFpbnM6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF0uaW5kZXhPZihlWzFdKT49MH0sX2Z1bmN0aW9uRmxvb3I6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguZmxvb3IoZVswXSl9LF9mdW5jdGlvbkxlbmd0aDpmdW5jdGlvbihlKXtyZXR1cm4gbihlWzBdKT9PYmplY3Qua2V5cyhlWzBdKS5sZW5ndGg6ZVswXS5sZW5ndGh9LF9mdW5jdGlvbk1hcDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj10aGlzLl9pbnRlcnByZXRlcixyPWVbMF0sbz1lWzFdLGk9MDtpPG8ubGVuZ3RoO2krKyl0LnB1c2gobi52aXNpdChyLG9baV0pKTtyZXR1cm4gdH0sX2Z1bmN0aW9uTWVyZ2U6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXt9LG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtmb3IodmFyIG8gaW4gcil0W29dPXJbb119cmV0dXJuIHR9LF9mdW5jdGlvbk1heDpmdW5jdGlvbihlKXtpZihlWzBdLmxlbmd0aD4wKXtpZih0aGlzLl9nZXRUeXBlTmFtZShlWzBdWzBdKT09PXMpcmV0dXJuIE1hdGgubWF4LmFwcGx5KE1hdGgsZVswXSk7Zm9yKHZhciB0PWVbMF0sbj10WzBdLHI9MTtyPHQubGVuZ3RoO3IrKyluLmxvY2FsZUNvbXBhcmUodFtyXSk8MCYmKG49dFtyXSk7cmV0dXJuIG59cmV0dXJuIG51bGx9LF9mdW5jdGlvbk1pbjpmdW5jdGlvbihlKXtpZihlWzBdLmxlbmd0aD4wKXtpZih0aGlzLl9nZXRUeXBlTmFtZShlWzBdWzBdKT09PXMpcmV0dXJuIE1hdGgubWluLmFwcGx5KE1hdGgsZVswXSk7Zm9yKHZhciB0PWVbMF0sbj10WzBdLHI9MTtyPHQubGVuZ3RoO3IrKyl0W3JdLmxvY2FsZUNvbXBhcmUobik8MCYmKG49dFtyXSk7cmV0dXJuIG59cmV0dXJuIG51bGx9LF9mdW5jdGlvblN1bTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPWVbMF0scj0wO3I8bi5sZW5ndGg7cisrKXQrPW5bcl07cmV0dXJuIHR9LF9mdW5jdGlvblR5cGU6ZnVuY3Rpb24oZSl7c3dpdGNoKHRoaXMuX2dldFR5cGVOYW1lKGVbMF0pKXtjYXNlIHM6cmV0dXJuIm51bWJlciI7Y2FzZSBjOnJldHVybiJzdHJpbmciO2Nhc2UgdTpyZXR1cm4iYXJyYXkiO2Nhc2UgbDpyZXR1cm4ib2JqZWN0IjtjYXNlIDU6cmV0dXJuImJvb2xlYW4iO2Nhc2UgcDpyZXR1cm4iZXhwcmVmIjtjYXNlIDc6cmV0dXJuIm51bGwifX0sX2Z1bmN0aW9uS2V5czpmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmtleXMoZVswXSl9LF9mdW5jdGlvblZhbHVlczpmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZVswXSxuPU9iamVjdC5rZXlzKHQpLHI9W10sbz0wO288bi5sZW5ndGg7bysrKXIucHVzaCh0W25bb11dKTtyZXR1cm4gcn0sX2Z1bmN0aW9uSm9pbjpmdW5jdGlvbihlKXt2YXIgdD1lWzBdO3JldHVybiBlWzFdLmpvaW4odCl9LF9mdW5jdGlvblRvQXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2dldFR5cGVOYW1lKGVbMF0pPT09dT9lWzBdOltlWzBdXX0sX2Z1bmN0aW9uVG9TdHJpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2dldFR5cGVOYW1lKGVbMF0pPT09Yz9lWzBdOkpTT04uc3RyaW5naWZ5KGVbMF0pfSxfZnVuY3Rpb25Ub051bWJlcjpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXMuX2dldFR5cGVOYW1lKGVbMF0pO3JldHVybiBuPT09cz9lWzBdOm4hPT1jfHwodD0rZVswXSxpc05hTih0KSk/bnVsbDp0fSxfZnVuY3Rpb25Ob3ROdWxsOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKWlmKDchPT10aGlzLl9nZXRUeXBlTmFtZShlW3RdKSlyZXR1cm4gZVt0XTtyZXR1cm4gbnVsbH0sX2Z1bmN0aW9uU29ydDpmdW5jdGlvbihlKXt2YXIgdD1lWzBdLnNsaWNlKDApO3JldHVybiB0LnNvcnQoKSx0fSxfZnVuY3Rpb25Tb3J0Qnk6ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXS5zbGljZSgwKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIHQ7dmFyIG49dGhpcy5faW50ZXJwcmV0ZXIscj1lWzFdLG89dGhpcy5fZ2V0VHlwZU5hbWUobi52aXNpdChyLHRbMF0pKTtpZihbcyxjXS5pbmRleE9mKG8pPDApdGhyb3cgbmV3IEVycm9yKCJUeXBlRXJyb3IiKTtmb3IodmFyIGk9dGhpcyxhPVtdLHU9MDt1PHQubGVuZ3RoO3UrKylhLnB1c2goW3UsdFt1XV0pO2Euc29ydCgoZnVuY3Rpb24oZSx0KXt2YXIgcz1uLnZpc2l0KHIsZVsxXSksYT1uLnZpc2l0KHIsdFsxXSk7aWYoaS5fZ2V0VHlwZU5hbWUocykhPT1vKXRocm93IG5ldyBFcnJvcigiVHlwZUVycm9yOiBleHBlY3RlZCAiK28rIiwgcmVjZWl2ZWQgIitpLl9nZXRUeXBlTmFtZShzKSk7aWYoaS5fZ2V0VHlwZU5hbWUoYSkhPT1vKXRocm93IG5ldyBFcnJvcigiVHlwZUVycm9yOiBleHBlY3RlZCAiK28rIiwgcmVjZWl2ZWQgIitpLl9nZXRUeXBlTmFtZShhKSk7cmV0dXJuIHM+YT8xOnM8YT8tMTplWzBdLXRbMF19KSk7Zm9yKHZhciBsPTA7bDxhLmxlbmd0aDtsKyspdFtsXT1hW2xdWzFdO3JldHVybiB0fSxfZnVuY3Rpb25NYXhCeTpmdW5jdGlvbihlKXtmb3IodmFyIHQsbixyPWVbMV0sbz1lWzBdLGk9dGhpcy5jcmVhdGVLZXlGdW5jdGlvbihyLFtzLGNdKSxhPS0xLzAsdT0wO3U8by5sZW5ndGg7dSsrKShuPWkob1t1XSkpPmEmJihhPW4sdD1vW3VdKTtyZXR1cm4gdH0sX2Z1bmN0aW9uTWluQnk6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG4scj1lWzFdLG89ZVswXSxpPXRoaXMuY3JlYXRlS2V5RnVuY3Rpb24ocixbcyxjXSksYT0xLzAsdT0wO3U8by5sZW5ndGg7dSsrKShuPWkob1t1XSkpPGEmJihhPW4sdD1vW3VdKTtyZXR1cm4gdH0sY3JlYXRlS2V5RnVuY3Rpb246ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLHI9dGhpcy5faW50ZXJwcmV0ZXI7cmV0dXJuIGZ1bmN0aW9uKG8pe3ZhciBpPXIudmlzaXQoZSxvKTtpZih0LmluZGV4T2Yobi5fZ2V0VHlwZU5hbWUoaSkpPDApe3ZhciBzPSJUeXBlRXJyb3I6IGV4cGVjdGVkIG9uZSBvZiAiK3QrIiwgcmVjZWl2ZWQgIituLl9nZXRUeXBlTmFtZShpKTt0aHJvdyBuZXcgRXJyb3Iocyl9cmV0dXJuIGl9fX0sZS50b2tlbml6ZT1mdW5jdGlvbihlKXtyZXR1cm4obmV3IFgpLnRva2VuaXplKGUpfSxlLmNvbXBpbGU9ZnVuY3Rpb24oZSl7cmV0dXJuKG5ldyAkKS5wYXJzZShlKX0sZS5zZWFyY2g9ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgJCxyPW5ldyBRLG89bmV3IEoocik7ci5faW50ZXJwcmV0ZXI9bzt2YXIgaT1uLnBhcnNlKHQpO3JldHVybiBvLnNlYXJjaChpLGUpfSxlLnN0cmljdERlZXBFcXVhbD1yfSh2b2lkIDA9PT1uP3RoaXMuam1lc3BhdGg9e306bil9LHt9XSw5MTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByLG8saT10LmV4cG9ydHM9e307ZnVuY3Rpb24gcygpe3Rocm93IG5ldyBFcnJvcigic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIGEoKXt0aHJvdyBuZXcgRXJyb3IoImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIGMoZSl7aWYocj09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQoZSwwKTtpZigocj09PXN8fCFyKSYmc2V0VGltZW91dClyZXR1cm4gcj1zZXRUaW1lb3V0LHNldFRpbWVvdXQoZSwwKTt0cnl7cmV0dXJuIHIoZSwwKX1jYXRjaCh0KXt0cnl7cmV0dXJuIHIuY2FsbChudWxsLGUsMCl9Y2F0Y2godCl7cmV0dXJuIHIuY2FsbCh0aGlzLGUsMCl9fX0hZnVuY3Rpb24oKXt0cnl7cj0iZnVuY3Rpb24iPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0OnN9Y2F0Y2goZSl7cj1zfXRyeXtvPSJmdW5jdGlvbiI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OmF9Y2F0Y2goZSl7bz1hfX0oKTt2YXIgdSxsPVtdLHA9ITEsZD0tMTtmdW5jdGlvbiBoKCl7cCYmdSYmKHA9ITEsdS5sZW5ndGg/bD11LmNvbmNhdChsKTpkPS0xLGwubGVuZ3RoJiZmKCkpfWZ1bmN0aW9uIGYoKXtpZighcCl7dmFyIGU9YyhoKTtwPSEwO2Zvcih2YXIgdD1sLmxlbmd0aDt0Oyl7Zm9yKHU9bCxsPVtdOysrZDx0Oyl1JiZ1W2RdLnJ1bigpO2Q9LTEsdD1sLmxlbmd0aH11PW51bGwscD0hMSxmdW5jdGlvbihlKXtpZihvPT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQoZSk7aWYoKG89PT1hfHwhbykmJmNsZWFyVGltZW91dClyZXR1cm4gbz1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KGUpO3RyeXtyZXR1cm4gbyhlKX1jYXRjaCh0KXt0cnl7cmV0dXJuIG8uY2FsbChudWxsLGUpfWNhdGNoKHQpe3JldHVybiBvLmNhbGwodGhpcyxlKX19fShlKX19ZnVuY3Rpb24gZyhlLHQpe3RoaXMuZnVuPWUsdGhpcy5hcnJheT10fWZ1bmN0aW9uIG0oKXt9aS5uZXh0VGljaz1mdW5jdGlvbihlKXt2YXIgdD1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciBuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0W24tMV09YXJndW1lbnRzW25dO2wucHVzaChuZXcgZyhlLHQpKSwxIT09bC5sZW5ndGh8fHB8fGMoZil9LGcucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe3RoaXMuZnVuLmFwcGx5KG51bGwsdGhpcy5hcnJheSl9LGkudGl0bGU9ImJyb3dzZXIiLGkuYnJvd3Nlcj0hMCxpLmVudj17fSxpLmFyZ3Y9W10saS52ZXJzaW9uPSIiLGkudmVyc2lvbnM9e30saS5vbj1tLGkuYWRkTGlzdGVuZXI9bSxpLm9uY2U9bSxpLm9mZj1tLGkucmVtb3ZlTGlzdGVuZXI9bSxpLnJlbW92ZUFsbExpc3RlbmVycz1tLGkuZW1pdD1tLGkucHJlcGVuZExpc3RlbmVyPW0saS5wcmVwZW5kT25jZUxpc3RlbmVyPW0saS5saXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuW119LGkuYmluZGluZz1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkIil9LGkuY3dkPWZ1bmN0aW9uKCl7cmV0dXJuIi8ifSxpLmNoZGlyPWZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkIil9LGkudW1hc2s9ZnVuY3Rpb24oKXtyZXR1cm4gMH19LHt9XSw5MjpbZnVuY3Rpb24oZSx0LG8peyhmdW5jdGlvbihlKXsoZnVuY3Rpb24oKXshZnVuY3Rpb24oaSl7Im9iamVjdCI9PXR5cGVvZiBvJiZvJiZvLm5vZGVUeXBlLCJvYmplY3QiPT10eXBlb2YgdCYmdCYmdC5ub2RlVHlwZTt2YXIgcz0ib2JqZWN0Ij09dHlwZW9mIGUmJmU7cy5nbG9iYWwhPT1zJiZzLndpbmRvdyE9PXMmJnMuc2VsZjt2YXIgYSxjPTIxNDc0ODM2NDcsdT0zNixsPTEscD0yNixkPTM4LGg9NzAwLGY9NzIsZz0xMjgsbT0iLSIsdj0vXnhuLS0vLHk9L1teXHgyMC1ceDdFXS8sRT0vW1x4MkVcdTMwMDJcdUZGMEVcdUZGNjFdL2csUz17b3ZlcmZsb3c6Ik92ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzIiwibm90LWJhc2ljIjoiSWxsZWdhbCBpbnB1dCA+PSAweDgwIChub3QgYSBiYXNpYyBjb2RlIHBvaW50KSIsImludmFsaWQtaW5wdXQiOiJJbnZhbGlkIGlucHV0In0sYj11LWwsQz1NYXRoLmZsb29yLFQ9U3RyaW5nLmZyb21DaGFyQ29kZTtmdW5jdGlvbiBJKGUpe3Rocm93IG5ldyBSYW5nZUVycm9yKFNbZV0pfWZ1bmN0aW9uIEEoZSx0KXtmb3IodmFyIG49ZS5sZW5ndGgscj1bXTtuLS07KXJbbl09dChlW25dKTtyZXR1cm4gcn1mdW5jdGlvbiBfKGUsdCl7dmFyIG49ZS5zcGxpdCgiQCIpLHI9IiI7cmV0dXJuIG4ubGVuZ3RoPjEmJihyPW5bMF0rIkAiLGU9blsxXSkscitBKChlPWUucmVwbGFjZShFLCIuIikpLnNwbGl0KCIuIiksdCkuam9pbigiLiIpfWZ1bmN0aW9uIHcoZSl7Zm9yKHZhciB0LG4scj1bXSxvPTAsaT1lLmxlbmd0aDtvPGk7KSh0PWUuY2hhckNvZGVBdChvKyspKT49NTUyOTYmJnQ8PTU2MzE5JiZvPGk/NTYzMjA9PSg2NDUxMiYobj1lLmNoYXJDb2RlQXQobysrKSkpP3IucHVzaCgoKDEwMjMmdCk8PDEwKSsoMTAyMyZuKSs2NTUzNik6KHIucHVzaCh0KSxvLS0pOnIucHVzaCh0KTtyZXR1cm4gcn1mdW5jdGlvbiBSKGUpe3JldHVybiBBKGUsKGZ1bmN0aW9uKGUpe3ZhciB0PSIiO3JldHVybiBlPjY1NTM1JiYodCs9VCgoZS09NjU1MzYpPj4+MTAmMTAyM3w1NTI5NiksZT01NjMyMHwxMDIzJmUpLHQrPVQoZSl9KSkuam9pbigiIil9ZnVuY3Rpb24gayhlLHQpe3JldHVybiBlKzIyKzc1KihlPDI2KS0oKDAhPXQpPDw1KX1mdW5jdGlvbiBMKGUsdCxuKXt2YXIgcj0wO2ZvcihlPW4/QyhlL2gpOmU+PjEsZSs9QyhlL3QpO2U+YipwPj4xO3IrPXUpZT1DKGUvYik7cmV0dXJuIEMocisoYisxKSplLyhlK2QpKX1mdW5jdGlvbiBOKGUpe3ZhciB0LG4scixvLGkscyxhLGQsaCx2LHksRT1bXSxTPWUubGVuZ3RoLGI9MCxUPWcsQT1mO2Zvcigobj1lLmxhc3RJbmRleE9mKG0pKTwwJiYobj0wKSxyPTA7cjxuOysrcillLmNoYXJDb2RlQXQocik+PTEyOCYmSSgibm90LWJhc2ljIiksRS5wdXNoKGUuY2hhckNvZGVBdChyKSk7Zm9yKG89bj4wP24rMTowO288Uzspe2ZvcihpPWIscz0xLGE9dTtvPj1TJiZJKCJpbnZhbGlkLWlucHV0IiksKChkPSh5PWUuY2hhckNvZGVBdChvKyspKS00ODwxMD95LTIyOnktNjU8MjY/eS02NTp5LTk3PDI2P3ktOTc6dSk+PXV8fGQ+QygoYy1iKS9zKSkmJkkoIm92ZXJmbG93IiksYis9ZCpzLCEoZDwoaD1hPD1BP2w6YT49QStwP3A6YS1BKSk7YSs9dSlzPkMoYy8odj11LWgpKSYmSSgib3ZlcmZsb3ciKSxzKj12O0E9TChiLWksdD1FLmxlbmd0aCsxLDA9PWkpLEMoYi90KT5jLVQmJkkoIm92ZXJmbG93IiksVCs9QyhiL3QpLGIlPXQsRS5zcGxpY2UoYisrLDAsVCl9cmV0dXJuIFIoRSl9ZnVuY3Rpb24gTyhlKXt2YXIgdCxuLHIsbyxpLHMsYSxkLGgsdix5LEUsUyxiLEEsXz1bXTtmb3IoRT0oZT13KGUpKS5sZW5ndGgsdD1nLG49MCxpPWYscz0wO3M8RTsrK3MpKHk9ZVtzXSk8MTI4JiZfLnB1c2goVCh5KSk7Zm9yKHI9bz1fLmxlbmd0aCxvJiZfLnB1c2gobSk7cjxFOyl7Zm9yKGE9YyxzPTA7czxFOysrcykoeT1lW3NdKT49dCYmeTxhJiYoYT15KTtmb3IoYS10PkMoKGMtbikvKFM9cisxKSkmJkkoIm92ZXJmbG93Iiksbis9KGEtdCkqUyx0PWEscz0wO3M8RTsrK3MpaWYoKHk9ZVtzXSk8dCYmKytuPmMmJkkoIm92ZXJmbG93IikseT09dCl7Zm9yKGQ9bixoPXU7IShkPCh2PWg8PWk/bDpoPj1pK3A/cDpoLWkpKTtoKz11KUE9ZC12LGI9dS12LF8ucHVzaChUKGsoditBJWIsMCkpKSxkPUMoQS9iKTtfLnB1c2goVChrKGQsMCkpKSxpPUwobixTLHI9PW8pLG49MCwrK3J9KytuLCsrdH1yZXR1cm4gXy5qb2luKCIiKX1hPXt2ZXJzaW9uOiIxLjQuMSIsdWNzMjp7ZGVjb2RlOncsZW5jb2RlOlJ9LGRlY29kZTpOLGVuY29kZTpPLHRvQVNDSUk6ZnVuY3Rpb24oZSl7cmV0dXJuIF8oZSwoZnVuY3Rpb24oZSl7cmV0dXJuIHkudGVzdChlKT8ieG4tLSIrTyhlKTplfSkpfSx0b1VuaWNvZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIF8oZSwoZnVuY3Rpb24oZSl7cmV0dXJuIHYudGVzdChlKT9OKGUuc2xpY2UoNCkudG9Mb3dlckNhc2UoKSk6ZX0pKX19LHZvaWQgMD09PShyPWZ1bmN0aW9uKCl7cmV0dXJuIGF9LmNhbGwobyxuLG8sdCkpfHwodC5leHBvcnRzPXIpfSgpfSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyx2b2lkIDAhPT1uLmc/bi5nOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSl9LHt9XSw5MzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfXQuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixpKXt0PXR8fCImIixuPW58fCI9Ijt2YXIgcz17fTtpZigic3RyaW5nIiE9dHlwZW9mIGV8fDA9PT1lLmxlbmd0aClyZXR1cm4gczt2YXIgYT0vXCsvZztlPWUuc3BsaXQodCk7dmFyIGM9MWUzO2kmJiJudW1iZXIiPT10eXBlb2YgaS5tYXhLZXlzJiYoYz1pLm1heEtleXMpO3ZhciB1PWUubGVuZ3RoO2M+MCYmdT5jJiYodT1jKTtmb3IodmFyIGw9MDtsPHU7KytsKXt2YXIgcCxkLGgsZixnPWVbbF0ucmVwbGFjZShhLCIlMjAiKSxtPWcuaW5kZXhPZihuKTttPj0wPyhwPWcuc3Vic3RyKDAsbSksZD1nLnN1YnN0cihtKzEpKToocD1nLGQ9IiIpLGg9ZGVjb2RlVVJJQ29tcG9uZW50KHApLGY9ZGVjb2RlVVJJQ29tcG9uZW50KGQpLHIocyxoKT9vKHNbaF0pP3NbaF0ucHVzaChmKTpzW2hdPVtzW2hdLGZdOnNbaF09Zn1yZXR1cm4gc307dmFyIG89QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX19LHt9XSw5NDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1mdW5jdGlvbihlKXtzd2l0Y2godHlwZW9mIGUpe2Nhc2Uic3RyaW5nIjpyZXR1cm4gZTtjYXNlImJvb2xlYW4iOnJldHVybiBlPyJ0cnVlIjoiZmFsc2UiO2Nhc2UibnVtYmVyIjpyZXR1cm4gaXNGaW5pdGUoZSk/ZToiIjtkZWZhdWx0OnJldHVybiIifX07dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLGEpe3JldHVybiB0PXR8fCImIixuPW58fCI9IixudWxsPT09ZSYmKGU9dm9pZCAwKSwib2JqZWN0Ij09dHlwZW9mIGU/aShzKGUpLChmdW5jdGlvbihzKXt2YXIgYT1lbmNvZGVVUklDb21wb25lbnQocihzKSkrbjtyZXR1cm4gbyhlW3NdKT9pKGVbc10sKGZ1bmN0aW9uKGUpe3JldHVybiBhK2VuY29kZVVSSUNvbXBvbmVudChyKGUpKX0pKS5qb2luKHQpOmErZW5jb2RlVVJJQ29tcG9uZW50KHIoZVtzXSkpfSkpLmpvaW4odCk6YT9lbmNvZGVVUklDb21wb25lbnQocihhKSkrbitlbmNvZGVVUklDb21wb25lbnQocihlKSk6IiJ9O3ZhciBvPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9O2Z1bmN0aW9uIGkoZSx0KXtpZihlLm1hcClyZXR1cm4gZS5tYXAodCk7Zm9yKHZhciBuPVtdLHI9MDtyPGUubGVuZ3RoO3IrKyluLnB1c2godChlW3JdLHIpKTtyZXR1cm4gbn12YXIgcz1PYmplY3Qua2V5c3x8ZnVuY3Rpb24oZSl7dmFyIHQ9W107Zm9yKHZhciBuIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikmJnQucHVzaChuKTtyZXR1cm4gdH19LHt9XSw5NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLmRlY29kZT1uLnBhcnNlPWUoIi4vZGVjb2RlIiksbi5lbmNvZGU9bi5zdHJpbmdpZnk9ZSgiLi9lbmNvZGUiKX0seyIuL2RlY29kZSI6OTMsIi4vZW5jb2RlIjo5NH1dLDk2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLG8pe3Q9dHx8IiYiLG49bnx8Ij0iO3ZhciBpPXt9O2lmKCJzdHJpbmciIT10eXBlb2YgZXx8MD09PWUubGVuZ3RoKXJldHVybiBpO3ZhciBzPS9cKy9nO2U9ZS5zcGxpdCh0KTt2YXIgYT0xZTM7byYmIm51bWJlciI9PXR5cGVvZiBvLm1heEtleXMmJihhPW8ubWF4S2V5cyk7dmFyIGM9ZS5sZW5ndGg7YT4wJiZjPmEmJihjPWEpO2Zvcih2YXIgdT0wO3U8YzsrK3Upe3ZhciBsLHAsZCxoLGY9ZVt1XS5yZXBsYWNlKHMsIiUyMCIpLGc9Zi5pbmRleE9mKG4pO2c+PTA/KGw9Zi5zdWJzdHIoMCxnKSxwPWYuc3Vic3RyKGcrMSkpOihsPWYscD0iIiksZD1kZWNvZGVVUklDb21wb25lbnQobCksaD1kZWNvZGVVUklDb21wb25lbnQocCkscihpLGQpP0FycmF5LmlzQXJyYXkoaVtkXSk/aVtkXS5wdXNoKGgpOmlbZF09W2lbZF0saF06aVtkXT1ofXJldHVybiBpfX0se31dLDk3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWZ1bmN0aW9uKGUpe3N3aXRjaCh0eXBlb2YgZSl7Y2FzZSJzdHJpbmciOnJldHVybiBlO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIGU/InRydWUiOiJmYWxzZSI7Y2FzZSJudW1iZXIiOnJldHVybiBpc0Zpbml0ZShlKT9lOiIiO2RlZmF1bHQ6cmV0dXJuIiJ9fTt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4sbyl7cmV0dXJuIHQ9dHx8IiYiLG49bnx8Ij0iLG51bGw9PT1lJiYoZT12b2lkIDApLCJvYmplY3QiPT10eXBlb2YgZT9PYmplY3Qua2V5cyhlKS5tYXAoKGZ1bmN0aW9uKG8pe3ZhciBpPWVuY29kZVVSSUNvbXBvbmVudChyKG8pKStuO3JldHVybiBBcnJheS5pc0FycmF5KGVbb10pP2Vbb10ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gaStlbmNvZGVVUklDb21wb25lbnQocihlKSl9KSkuam9pbih0KTppK2VuY29kZVVSSUNvbXBvbmVudChyKGVbb10pKX0pKS5qb2luKHQpOm8/ZW5jb2RlVVJJQ29tcG9uZW50KHIobykpK24rZW5jb2RlVVJJQ29tcG9uZW50KHIoZSkpOiIifX0se31dLDk4OltmdW5jdGlvbihlLHQsbil7YXJndW1lbnRzWzRdWzk1XVswXS5hcHBseShuLGFyZ3VtZW50cyl9LHsiLi9kZWNvZGUiOjk2LCIuL2VuY29kZSI6OTcsZHVwOjk1fV0sOTk6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24odCxyKXsoZnVuY3Rpb24oKXt2YXIgbz1lKCJwcm9jZXNzL2Jyb3dzZXIuanMiKS5uZXh0VGljayxpPUZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseSxzPUFycmF5LnByb3RvdHlwZS5zbGljZSxhPXt9LGM9MDtmdW5jdGlvbiB1KGUsdCl7dGhpcy5faWQ9ZSx0aGlzLl9jbGVhckZuPXR9bi5zZXRUaW1lb3V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1KGkuY2FsbChzZXRUaW1lb3V0LHdpbmRvdyxhcmd1bWVudHMpLGNsZWFyVGltZW91dCl9LG4uc2V0SW50ZXJ2YWw9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHUoaS5jYWxsKHNldEludGVydmFsLHdpbmRvdyxhcmd1bWVudHMpLGNsZWFySW50ZXJ2YWwpfSxuLmNsZWFyVGltZW91dD1uLmNsZWFySW50ZXJ2YWw9ZnVuY3Rpb24oZSl7ZS5jbG9zZSgpfSx1LnByb3RvdHlwZS51bnJlZj11LnByb3RvdHlwZS5yZWY9ZnVuY3Rpb24oKXt9LHUucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5fY2xlYXJGbi5jYWxsKHdpbmRvdyx0aGlzLl9pZCl9LG4uZW5yb2xsPWZ1bmN0aW9uKGUsdCl7Y2xlYXJUaW1lb3V0KGUuX2lkbGVUaW1lb3V0SWQpLGUuX2lkbGVUaW1lb3V0PXR9LG4udW5lbnJvbGw9ZnVuY3Rpb24oZSl7Y2xlYXJUaW1lb3V0KGUuX2lkbGVUaW1lb3V0SWQpLGUuX2lkbGVUaW1lb3V0PS0xfSxuLl91bnJlZkFjdGl2ZT1uLmFjdGl2ZT1mdW5jdGlvbihlKXtjbGVhclRpbWVvdXQoZS5faWRsZVRpbWVvdXRJZCk7dmFyIHQ9ZS5faWRsZVRpbWVvdXQ7dD49MCYmKGUuX2lkbGVUaW1lb3V0SWQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtlLl9vblRpbWVvdXQmJmUuX29uVGltZW91dCgpfSksdCkpfSxuLnNldEltbWVkaWF0ZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmZ1bmN0aW9uKGUpe3ZhciB0PWMrKyxyPSEoYXJndW1lbnRzLmxlbmd0aDwyKSYmcy5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gYVt0XT0hMCxvKChmdW5jdGlvbigpe2FbdF0mJihyP2UuYXBwbHkobnVsbCxyKTplLmNhbGwobnVsbCksbi5jbGVhckltbWVkaWF0ZSh0KSl9KSksdH0sbi5jbGVhckltbWVkaWF0ZT0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yOmZ1bmN0aW9uKGUpe2RlbGV0ZSBhW2VdfX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgidGltZXJzIikuc2V0SW1tZWRpYXRlLGUoInRpbWVycyIpLmNsZWFySW1tZWRpYXRlKX0seyJwcm9jZXNzL2Jyb3dzZXIuanMiOjkxLHRpbWVyczo5OX1dLDEwMDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoInB1bnljb2RlIik7ZnVuY3Rpb24gbygpe3RoaXMucHJvdG9jb2w9bnVsbCx0aGlzLnNsYXNoZXM9bnVsbCx0aGlzLmF1dGg9bnVsbCx0aGlzLmhvc3Q9bnVsbCx0aGlzLnBvcnQ9bnVsbCx0aGlzLmhvc3RuYW1lPW51bGwsdGhpcy5oYXNoPW51bGwsdGhpcy5zZWFyY2g9bnVsbCx0aGlzLnF1ZXJ5PW51bGwsdGhpcy5wYXRobmFtZT1udWxsLHRoaXMucGF0aD1udWxsLHRoaXMuaHJlZj1udWxsfW4ucGFyc2U9dixuLnJlc29sdmU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdihlLCExLCEwKS5yZXNvbHZlKHQpfSxuLnJlc29sdmVPYmplY3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT92KGUsITEsITApLnJlc29sdmVPYmplY3QodCk6dH0sbi5mb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHkoZSkmJihlPXYoZSkpLGUgaW5zdGFuY2VvZiBvP2UuZm9ybWF0KCk6by5wcm90b3R5cGUuZm9ybWF0LmNhbGwoZSl9LG4uVXJsPW87dmFyIGk9L14oW2EtejAtOS4rLV0rOikvaSxzPS86WzAtOV0qJC8sYT1bInsiLCJ9IiwifCIsIlxcIiwiXiIsImAiXS5jb25jYXQoWyI8IiwiPiIsJyInLCJgIiwiICIsIlxyIiwiXG4iLCJcdCJdKSxjPVsiJyJdLmNvbmNhdChhKSx1PVsiJSIsIi8iLCI/IiwiOyIsIiMiXS5jb25jYXQoYyksbD1bIi8iLCI/IiwiIyJdLHA9L15bYS16MC05QS1aXy1dezAsNjN9JC8sZD0vXihbYS16MC05QS1aXy1dezAsNjN9KSguKikkLyxoPXtqYXZhc2NyaXB0OiEwLCJqYXZhc2NyaXB0OiI6ITB9LGY9e2phdmFzY3JpcHQ6ITAsImphdmFzY3JpcHQ6IjohMH0sZz17aHR0cDohMCxodHRwczohMCxmdHA6ITAsZ29waGVyOiEwLGZpbGU6ITAsImh0dHA6IjohMCwiaHR0cHM6IjohMCwiZnRwOiI6ITAsImdvcGhlcjoiOiEwLCJmaWxlOiI6ITB9LG09ZSgicXVlcnlzdHJpbmciKTtmdW5jdGlvbiB2KGUsdCxuKXtpZihlJiZFKGUpJiZlIGluc3RhbmNlb2YgbylyZXR1cm4gZTt2YXIgcj1uZXcgbztyZXR1cm4gci5wYXJzZShlLHQsbikscn1mdW5jdGlvbiB5KGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX1mdW5jdGlvbiBFKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWV9ZnVuY3Rpb24gUyhlKXtyZXR1cm4gbnVsbD09PWV9by5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oZSx0LG4pe2lmKCF5KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIlBhcmFtZXRlciAndXJsJyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgIit0eXBlb2YgZSk7dmFyIG89ZTtvPW8udHJpbSgpO3ZhciBzPWkuZXhlYyhvKTtpZihzKXt2YXIgYT0ocz1zWzBdKS50b0xvd2VyQ2FzZSgpO3RoaXMucHJvdG9jb2w9YSxvPW8uc3Vic3RyKHMubGVuZ3RoKX1pZihufHxzfHxvLm1hdGNoKC9eXC9cL1teQFwvXStAW15AXC9dKy8pKXt2YXIgdj0iLy8iPT09by5zdWJzdHIoMCwyKTshdnx8cyYmZltzXXx8KG89by5zdWJzdHIoMiksdGhpcy5zbGFzaGVzPSEwKX1pZighZltzXSYmKHZ8fHMmJiFnW3NdKSl7Zm9yKHZhciBFLFMsYj0tMSxDPTA7QzxsLmxlbmd0aDtDKyspLTEhPT0oVD1vLmluZGV4T2YobFtDXSkpJiYoLTE9PT1ifHxUPGIpJiYoYj1UKTtmb3IoLTEhPT0oUz0tMT09PWI/by5sYXN0SW5kZXhPZigiQCIpOm8ubGFzdEluZGV4T2YoIkAiLGIpKSYmKEU9by5zbGljZSgwLFMpLG89by5zbGljZShTKzEpLHRoaXMuYXV0aD1kZWNvZGVVUklDb21wb25lbnQoRSkpLGI9LTEsQz0wO0M8dS5sZW5ndGg7QysrKXt2YXIgVDstMSE9PShUPW8uaW5kZXhPZih1W0NdKSkmJigtMT09PWJ8fFQ8YikmJihiPVQpfS0xPT09YiYmKGI9by5sZW5ndGgpLHRoaXMuaG9zdD1vLnNsaWNlKDAsYiksbz1vLnNsaWNlKGIpLHRoaXMucGFyc2VIb3N0KCksdGhpcy5ob3N0bmFtZT10aGlzLmhvc3RuYW1lfHwiIjt2YXIgST0iWyI9PT10aGlzLmhvc3RuYW1lWzBdJiYiXSI9PT10aGlzLmhvc3RuYW1lW3RoaXMuaG9zdG5hbWUubGVuZ3RoLTFdO2lmKCFJKWZvcih2YXIgQT10aGlzLmhvc3RuYW1lLnNwbGl0KC9cLi8pLF89KEM9MCxBLmxlbmd0aCk7QzxfO0MrKyl7dmFyIHc9QVtDXTtpZih3JiYhdy5tYXRjaChwKSl7Zm9yKHZhciBSPSIiLGs9MCxMPXcubGVuZ3RoO2s8TDtrKyspdy5jaGFyQ29kZUF0KGspPjEyNz9SKz0ieCI6Uis9d1trXTtpZighUi5tYXRjaChwKSl7dmFyIE49QS5zbGljZSgwLEMpLE89QS5zbGljZShDKzEpLEQ9dy5tYXRjaChkKTtEJiYoTi5wdXNoKERbMV0pLE8udW5zaGlmdChEWzJdKSksTy5sZW5ndGgmJihvPSIvIitPLmpvaW4oIi4iKStvKSx0aGlzLmhvc3RuYW1lPU4uam9pbigiLiIpO2JyZWFrfX19aWYodGhpcy5ob3N0bmFtZS5sZW5ndGg+MjU1P3RoaXMuaG9zdG5hbWU9IiI6dGhpcy5ob3N0bmFtZT10aGlzLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCksIUkpe3ZhciBQPXRoaXMuaG9zdG5hbWUuc3BsaXQoIi4iKSx4PVtdO2ZvcihDPTA7QzxQLmxlbmd0aDsrK0Mpe3ZhciBNPVBbQ107eC5wdXNoKE0ubWF0Y2goL1teQS1aYS16MC05Xy1dLyk/InhuLS0iK3IuZW5jb2RlKE0pOk0pfXRoaXMuaG9zdG5hbWU9eC5qb2luKCIuIil9dmFyIFU9dGhpcy5wb3J0PyI6Iit0aGlzLnBvcnQ6IiIsRj10aGlzLmhvc3RuYW1lfHwiIjt0aGlzLmhvc3Q9RitVLHRoaXMuaHJlZis9dGhpcy5ob3N0LEkmJih0aGlzLmhvc3RuYW1lPXRoaXMuaG9zdG5hbWUuc3Vic3RyKDEsdGhpcy5ob3N0bmFtZS5sZW5ndGgtMiksIi8iIT09b1swXSYmKG89Ii8iK28pKX1pZighaFthXSlmb3IoQz0wLF89Yy5sZW5ndGg7QzxfO0MrKyl7dmFyIHE9Y1tDXSxCPWVuY29kZVVSSUNvbXBvbmVudChxKTtCPT09cSYmKEI9ZXNjYXBlKHEpKSxvPW8uc3BsaXQocSkuam9pbihCKX12YXIgaj1vLmluZGV4T2YoIiMiKTstMSE9PWomJih0aGlzLmhhc2g9by5zdWJzdHIoaiksbz1vLnNsaWNlKDAsaikpO3ZhciBWPW8uaW5kZXhPZigiPyIpO3JldHVybi0xIT09Vj8odGhpcy5zZWFyY2g9by5zdWJzdHIoViksdGhpcy5xdWVyeT1vLnN1YnN0cihWKzEpLHQmJih0aGlzLnF1ZXJ5PW0ucGFyc2UodGhpcy5xdWVyeSkpLG89by5zbGljZSgwLFYpKTp0JiYodGhpcy5zZWFyY2g9IiIsdGhpcy5xdWVyeT17fSksbyYmKHRoaXMucGF0aG5hbWU9byksZ1thXSYmdGhpcy5ob3N0bmFtZSYmIXRoaXMucGF0aG5hbWUmJih0aGlzLnBhdGhuYW1lPSIvIiksKHRoaXMucGF0aG5hbWV8fHRoaXMuc2VhcmNoKSYmKFU9dGhpcy5wYXRobmFtZXx8IiIsTT10aGlzLnNlYXJjaHx8IiIsdGhpcy5wYXRoPVUrTSksdGhpcy5ocmVmPXRoaXMuZm9ybWF0KCksdGhpc30sby5wcm90b3R5cGUuZm9ybWF0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5hdXRofHwiIjtlJiYoZT0oZT1lbmNvZGVVUklDb21wb25lbnQoZSkpLnJlcGxhY2UoLyUzQS9pLCI6IiksZSs9IkAiKTt2YXIgdD10aGlzLnByb3RvY29sfHwiIixuPXRoaXMucGF0aG5hbWV8fCIiLHI9dGhpcy5oYXNofHwiIixvPSExLGk9IiI7dGhpcy5ob3N0P289ZSt0aGlzLmhvc3Q6dGhpcy5ob3N0bmFtZSYmKG89ZSsoLTE9PT10aGlzLmhvc3RuYW1lLmluZGV4T2YoIjoiKT90aGlzLmhvc3RuYW1lOiJbIit0aGlzLmhvc3RuYW1lKyJdIiksdGhpcy5wb3J0JiYobys9IjoiK3RoaXMucG9ydCkpLHRoaXMucXVlcnkmJkUodGhpcy5xdWVyeSkmJk9iamVjdC5rZXlzKHRoaXMucXVlcnkpLmxlbmd0aCYmKGk9bS5zdHJpbmdpZnkodGhpcy5xdWVyeSkpO3ZhciBzPXRoaXMuc2VhcmNofHxpJiYiPyIraXx8IiI7cmV0dXJuIHQmJiI6IiE9PXQuc3Vic3RyKC0xKSYmKHQrPSI6IiksdGhpcy5zbGFzaGVzfHwoIXR8fGdbdF0pJiYhMSE9PW8/KG89Ii8vIisob3x8IiIpLG4mJiIvIiE9PW4uY2hhckF0KDApJiYobj0iLyIrbikpOm98fChvPSIiKSxyJiYiIyIhPT1yLmNoYXJBdCgwKSYmKHI9IiMiK3IpLHMmJiI/IiE9PXMuY2hhckF0KDApJiYocz0iPyIrcyksdCtvKyhuPW4ucmVwbGFjZSgvWz8jXS9nLChmdW5jdGlvbihlKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGUpfSkpKSsocz1zLnJlcGxhY2UoIiMiLCIlMjMiKSkrcn0sby5wcm90b3R5cGUucmVzb2x2ZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZXNvbHZlT2JqZWN0KHYoZSwhMSwhMCkpLmZvcm1hdCgpfSxvLnByb3RvdHlwZS5yZXNvbHZlT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKHkoZSkpe3ZhciB0PW5ldyBvO3QucGFyc2UoZSwhMSwhMCksZT10fXZhciBuPW5ldyBvO2lmKE9iamVjdC5rZXlzKHRoaXMpLmZvckVhY2goKGZ1bmN0aW9uKGUpe25bZV09dGhpc1tlXX0pLHRoaXMpLG4uaGFzaD1lLmhhc2gsIiI9PT1lLmhyZWYpcmV0dXJuIG4uaHJlZj1uLmZvcm1hdCgpLG47aWYoZS5zbGFzaGVzJiYhZS5wcm90b2NvbClyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7InByb3RvY29sIiE9PXQmJihuW3RdPWVbdF0pfSkpLGdbbi5wcm90b2NvbF0mJm4uaG9zdG5hbWUmJiFuLnBhdGhuYW1lJiYobi5wYXRoPW4ucGF0aG5hbWU9Ii8iKSxuLmhyZWY9bi5mb3JtYXQoKSxuO2lmKGUucHJvdG9jb2wmJmUucHJvdG9jb2whPT1uLnByb3RvY29sKXtpZighZ1tlLnByb3RvY29sXSlyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7blt0XT1lW3RdfSkpLG4uaHJlZj1uLmZvcm1hdCgpLG47aWYobi5wcm90b2NvbD1lLnByb3RvY29sLGUuaG9zdHx8ZltlLnByb3RvY29sXSluLnBhdGhuYW1lPWUucGF0aG5hbWU7ZWxzZXtmb3IodmFyIHI9KGUucGF0aG5hbWV8fCIiKS5zcGxpdCgiLyIpO3IubGVuZ3RoJiYhKGUuaG9zdD1yLnNoaWZ0KCkpOyk7ZS5ob3N0fHwoZS5ob3N0PSIiKSxlLmhvc3RuYW1lfHwoZS5ob3N0bmFtZT0iIiksIiIhPT1yWzBdJiZyLnVuc2hpZnQoIiIpLHIubGVuZ3RoPDImJnIudW5zaGlmdCgiIiksbi5wYXRobmFtZT1yLmpvaW4oIi8iKX1pZihuLnNlYXJjaD1lLnNlYXJjaCxuLnF1ZXJ5PWUucXVlcnksbi5ob3N0PWUuaG9zdHx8IiIsbi5hdXRoPWUuYXV0aCxuLmhvc3RuYW1lPWUuaG9zdG5hbWV8fGUuaG9zdCxuLnBvcnQ9ZS5wb3J0LG4ucGF0aG5hbWV8fG4uc2VhcmNoKXt2YXIgaT1uLnBhdGhuYW1lfHwiIixzPW4uc2VhcmNofHwiIjtuLnBhdGg9aStzfXJldHVybiBuLnNsYXNoZXM9bi5zbGFzaGVzfHxlLnNsYXNoZXMsbi5ocmVmPW4uZm9ybWF0KCksbn12YXIgYT1uLnBhdGhuYW1lJiYiLyI9PT1uLnBhdGhuYW1lLmNoYXJBdCgwKSxjPWUuaG9zdHx8ZS5wYXRobmFtZSYmIi8iPT09ZS5wYXRobmFtZS5jaGFyQXQoMCksdT1jfHxhfHxuLmhvc3QmJmUucGF0aG5hbWUsbD11LHA9bi5wYXRobmFtZSYmbi5wYXRobmFtZS5zcGxpdCgiLyIpfHxbXSxkPShyPWUucGF0aG5hbWUmJmUucGF0aG5hbWUuc3BsaXQoIi8iKXx8W10sbi5wcm90b2NvbCYmIWdbbi5wcm90b2NvbF0pO2lmKGQmJihuLmhvc3RuYW1lPSIiLG4ucG9ydD1udWxsLG4uaG9zdCYmKCIiPT09cFswXT9wWzBdPW4uaG9zdDpwLnVuc2hpZnQobi5ob3N0KSksbi5ob3N0PSIiLGUucHJvdG9jb2wmJihlLmhvc3RuYW1lPW51bGwsZS5wb3J0PW51bGwsZS5ob3N0JiYoIiI9PT1yWzBdP3JbMF09ZS5ob3N0OnIudW5zaGlmdChlLmhvc3QpKSxlLmhvc3Q9bnVsbCksdT11JiYoIiI9PT1yWzBdfHwiIj09PXBbMF0pKSxjKW4uaG9zdD1lLmhvc3R8fCIiPT09ZS5ob3N0P2UuaG9zdDpuLmhvc3Qsbi5ob3N0bmFtZT1lLmhvc3RuYW1lfHwiIj09PWUuaG9zdG5hbWU/ZS5ob3N0bmFtZTpuLmhvc3RuYW1lLG4uc2VhcmNoPWUuc2VhcmNoLG4ucXVlcnk9ZS5xdWVyeSxwPXI7ZWxzZSBpZihyLmxlbmd0aClwfHwocD1bXSkscC5wb3AoKSxwPXAuY29uY2F0KHIpLG4uc2VhcmNoPWUuc2VhcmNoLG4ucXVlcnk9ZS5xdWVyeTtlbHNlIGlmKG51bGwhPWUuc2VhcmNoKXJldHVybiBkJiYobi5ob3N0bmFtZT1uLmhvc3Q9cC5zaGlmdCgpLChiPSEhKG4uaG9zdCYmbi5ob3N0LmluZGV4T2YoIkAiKT4wKSYmbi5ob3N0LnNwbGl0KCJAIikpJiYobi5hdXRoPWIuc2hpZnQoKSxuLmhvc3Q9bi5ob3N0bmFtZT1iLnNoaWZ0KCkpKSxuLnNlYXJjaD1lLnNlYXJjaCxuLnF1ZXJ5PWUucXVlcnksUyhuLnBhdGhuYW1lKSYmUyhuLnNlYXJjaCl8fChuLnBhdGg9KG4ucGF0aG5hbWU/bi5wYXRobmFtZToiIikrKG4uc2VhcmNoP24uc2VhcmNoOiIiKSksbi5ocmVmPW4uZm9ybWF0KCksbjtpZighcC5sZW5ndGgpcmV0dXJuIG4ucGF0aG5hbWU9bnVsbCxuLnNlYXJjaD9uLnBhdGg9Ii8iK24uc2VhcmNoOm4ucGF0aD1udWxsLG4uaHJlZj1uLmZvcm1hdCgpLG47Zm9yKHZhciBoPXAuc2xpY2UoLTEpWzBdLG09KG4uaG9zdHx8ZS5ob3N0KSYmKCIuIj09PWh8fCIuLiI9PT1oKXx8IiI9PT1oLHY9MCxFPXAubGVuZ3RoO0U+PTA7RS0tKSIuIj09KGg9cFtFXSk/cC5zcGxpY2UoRSwxKToiLi4iPT09aD8ocC5zcGxpY2UoRSwxKSx2KyspOnYmJihwLnNwbGljZShFLDEpLHYtLSk7aWYoIXUmJiFsKWZvcig7di0tO3YpcC51bnNoaWZ0KCIuLiIpOyF1fHwiIj09PXBbMF18fHBbMF0mJiIvIj09PXBbMF0uY2hhckF0KDApfHxwLnVuc2hpZnQoIiIpLG0mJiIvIiE9PXAuam9pbigiLyIpLnN1YnN0cigtMSkmJnAucHVzaCgiIik7dmFyIGIsQz0iIj09PXBbMF18fHBbMF0mJiIvIj09PXBbMF0uY2hhckF0KDApO3JldHVybiBkJiYobi5ob3N0bmFtZT1uLmhvc3Q9Qz8iIjpwLmxlbmd0aD9wLnNoaWZ0KCk6IiIsKGI9ISEobi5ob3N0JiZuLmhvc3QuaW5kZXhPZigiQCIpPjApJiZuLmhvc3Quc3BsaXQoIkAiKSkmJihuLmF1dGg9Yi5zaGlmdCgpLG4uaG9zdD1uLmhvc3RuYW1lPWIuc2hpZnQoKSkpLCh1PXV8fG4uaG9zdCYmcC5sZW5ndGgpJiYhQyYmcC51bnNoaWZ0KCIiKSxwLmxlbmd0aD9uLnBhdGhuYW1lPXAuam9pbigiLyIpOihuLnBhdGhuYW1lPW51bGwsbi5wYXRoPW51bGwpLFMobi5wYXRobmFtZSkmJlMobi5zZWFyY2gpfHwobi5wYXRoPShuLnBhdGhuYW1lP24ucGF0aG5hbWU6IiIpKyhuLnNlYXJjaD9uLnNlYXJjaDoiIikpLG4uYXV0aD1lLmF1dGh8fG4uYXV0aCxuLnNsYXNoZXM9bi5zbGFzaGVzfHxlLnNsYXNoZXMsbi5ocmVmPW4uZm9ybWF0KCksbn0sby5wcm90b3R5cGUucGFyc2VIb3N0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5ob3N0LHQ9cy5leGVjKGUpO3QmJigiOiIhPT0odD10WzBdKSYmKHRoaXMucG9ydD10LnN1YnN0cigxKSksZT1lLnN1YnN0cigwLGUubGVuZ3RoLXQubGVuZ3RoKSksZSYmKHRoaXMuaG9zdG5hbWU9ZSl9fSx7cHVueWNvZGU6OTIscXVlcnlzdHJpbmc6OTV9XSwxMDE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG4uZGVmYXVsdD12b2lkIDA7Zm9yKHZhciByPVtdLG89MDtvPDI1NjsrK28pcltvXT0obysyNTYpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSk7dmFyIGk9ZnVuY3Rpb24oZSx0KXt2YXIgbj10fHwwLG89cjtyZXR1cm5bb1tlW24rK11dLG9bZVtuKytdXSxvW2VbbisrXV0sb1tlW24rK11dLCItIixvW2VbbisrXV0sb1tlW24rK11dLCItIixvW2VbbisrXV0sb1tlW24rK11dLCItIixvW2VbbisrXV0sb1tlW24rK11dLCItIixvW2VbbisrXV0sb1tlW24rK11dLG9bZVtuKytdXSxvW2VbbisrXV0sb1tlW24rK11dLG9bZVtuKytdXV0uam9pbigiIil9O24uZGVmYXVsdD1pfSx7fV0sMTAyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobiwidjEiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiByLmRlZmF1bHR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sInYzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby5kZWZhdWx0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJ2NCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGkuZGVmYXVsdH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobiwidjUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBzLmRlZmF1bHR9fSk7dmFyIHI9YShlKCIuL3YxLmpzIikpLG89YShlKCIuL3YzLmpzIikpLGk9YShlKCIuL3Y0LmpzIikpLHM9YShlKCIuL3Y1LmpzIikpO2Z1bmN0aW9uIGEoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fX0seyIuL3YxLmpzIjoxMDYsIi4vdjMuanMiOjEwNywiLi92NC5qcyI6MTA5LCIuL3Y1LmpzIjoxMTB9XSwxMDM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3ZhciBuPSg2NTUzNSZlKSsoNjU1MzUmdCk7cmV0dXJuKGU+PjE2KSsodD4+MTYpKyhuPj4xNik8PDE2fDY1NTM1Jm59ZnVuY3Rpb24gbyhlLHQsbixvLGkscyl7cmV0dXJuIHIoKGE9cihyKHQsZSkscihvLHMpKSk8PChjPWkpfGE+Pj4zMi1jLG4pO3ZhciBhLGN9ZnVuY3Rpb24gaShlLHQsbixyLGkscyxhKXtyZXR1cm4gbyh0Jm58fnQmcixlLHQsaSxzLGEpfWZ1bmN0aW9uIHMoZSx0LG4scixpLHMsYSl7cmV0dXJuIG8odCZyfG4mfnIsZSx0LGkscyxhKX1mdW5jdGlvbiBhKGUsdCxuLHIsaSxzLGEpe3JldHVybiBvKHRebl5yLGUsdCxpLHMsYSl9ZnVuY3Rpb24gYyhlLHQsbixyLGkscyxhKXtyZXR1cm4gbyhuXih0fH5yKSxlLHQsaSxzLGEpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9dm9pZCAwO3ZhciB1PWZ1bmN0aW9uKGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl7dmFyIHQ9dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUpKTtlPW5ldyBBcnJheSh0Lmxlbmd0aCk7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZVtuXT10LmNoYXJDb2RlQXQobil9cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0LG4scixvPVtdLGk9MzIqZS5sZW5ndGgscz0iMDEyMzQ1Njc4OWFiY2RlZiI7Zm9yKHQ9MDt0PGk7dCs9OCluPWVbdD4+NV0+Pj50JTMyJjI1NSxyPXBhcnNlSW50KHMuY2hhckF0KG4+Pj40JjE1KStzLmNoYXJBdCgxNSZuKSwxNiksby5wdXNoKHIpO3JldHVybiBvfShmdW5jdGlvbihlLHQpe3ZhciBuLG8sdSxsLHA7ZVt0Pj41XXw9MTI4PDx0JTMyLGVbMTQrKHQrNjQ+Pj45PDw0KV09dDt2YXIgZD0xNzMyNTg0MTkzLGg9LTI3MTczMzg3OSxmPS0xNzMyNTg0MTk0LGc9MjcxNzMzODc4O2ZvcihuPTA7bjxlLmxlbmd0aDtuKz0xNilvPWQsdT1oLGw9ZixwPWcsZD1pKGQsaCxmLGcsZVtuXSw3LC02ODA4NzY5MzYpLGc9aShnLGQsaCxmLGVbbisxXSwxMiwtMzg5NTY0NTg2KSxmPWkoZixnLGQsaCxlW24rMl0sMTcsNjA2MTA1ODE5KSxoPWkoaCxmLGcsZCxlW24rM10sMjIsLTEwNDQ1MjUzMzApLGQ9aShkLGgsZixnLGVbbis0XSw3LC0xNzY0MTg4OTcpLGc9aShnLGQsaCxmLGVbbis1XSwxMiwxMjAwMDgwNDI2KSxmPWkoZixnLGQsaCxlW24rNl0sMTcsLTE0NzMyMzEzNDEpLGg9aShoLGYsZyxkLGVbbis3XSwyMiwtNDU3MDU5ODMpLGQ9aShkLGgsZixnLGVbbis4XSw3LDE3NzAwMzU0MTYpLGc9aShnLGQsaCxmLGVbbis5XSwxMiwtMTk1ODQxNDQxNyksZj1pKGYsZyxkLGgsZVtuKzEwXSwxNywtNDIwNjMpLGg9aShoLGYsZyxkLGVbbisxMV0sMjIsLTE5OTA0MDQxNjIpLGQ9aShkLGgsZixnLGVbbisxMl0sNywxODA0NjAzNjgyKSxnPWkoZyxkLGgsZixlW24rMTNdLDEyLC00MDM0MTEwMSksZj1pKGYsZyxkLGgsZVtuKzE0XSwxNywtMTUwMjAwMjI5MCksZD1zKGQsaD1pKGgsZixnLGQsZVtuKzE1XSwyMiwxMjM2NTM1MzI5KSxmLGcsZVtuKzFdLDUsLTE2NTc5NjUxMCksZz1zKGcsZCxoLGYsZVtuKzZdLDksLTEwNjk1MDE2MzIpLGY9cyhmLGcsZCxoLGVbbisxMV0sMTQsNjQzNzE3NzEzKSxoPXMoaCxmLGcsZCxlW25dLDIwLC0zNzM4OTczMDIpLGQ9cyhkLGgsZixnLGVbbis1XSw1LC03MDE1NTg2OTEpLGc9cyhnLGQsaCxmLGVbbisxMF0sOSwzODAxNjA4MyksZj1zKGYsZyxkLGgsZVtuKzE1XSwxNCwtNjYwNDc4MzM1KSxoPXMoaCxmLGcsZCxlW24rNF0sMjAsLTQwNTUzNzg0OCksZD1zKGQsaCxmLGcsZVtuKzldLDUsNTY4NDQ2NDM4KSxnPXMoZyxkLGgsZixlW24rMTRdLDksLTEwMTk4MDM2OTApLGY9cyhmLGcsZCxoLGVbbiszXSwxNCwtMTg3MzYzOTYxKSxoPXMoaCxmLGcsZCxlW24rOF0sMjAsMTE2MzUzMTUwMSksZD1zKGQsaCxmLGcsZVtuKzEzXSw1LC0xNDQ0NjgxNDY3KSxnPXMoZyxkLGgsZixlW24rMl0sOSwtNTE0MDM3ODQpLGY9cyhmLGcsZCxoLGVbbis3XSwxNCwxNzM1MzI4NDczKSxkPWEoZCxoPXMoaCxmLGcsZCxlW24rMTJdLDIwLC0xOTI2NjA3NzM0KSxmLGcsZVtuKzVdLDQsLTM3ODU1OCksZz1hKGcsZCxoLGYsZVtuKzhdLDExLC0yMDIyNTc0NDYzKSxmPWEoZixnLGQsaCxlW24rMTFdLDE2LDE4MzkwMzA1NjIpLGg9YShoLGYsZyxkLGVbbisxNF0sMjMsLTM1MzA5NTU2KSxkPWEoZCxoLGYsZyxlW24rMV0sNCwtMTUzMDk5MjA2MCksZz1hKGcsZCxoLGYsZVtuKzRdLDExLDEyNzI4OTMzNTMpLGY9YShmLGcsZCxoLGVbbis3XSwxNiwtMTU1NDk3NjMyKSxoPWEoaCxmLGcsZCxlW24rMTBdLDIzLC0xMDk0NzMwNjQwKSxkPWEoZCxoLGYsZyxlW24rMTNdLDQsNjgxMjc5MTc0KSxnPWEoZyxkLGgsZixlW25dLDExLC0zNTg1MzcyMjIpLGY9YShmLGcsZCxoLGVbbiszXSwxNiwtNzIyNTIxOTc5KSxoPWEoaCxmLGcsZCxlW24rNl0sMjMsNzYwMjkxODkpLGQ9YShkLGgsZixnLGVbbis5XSw0LC02NDAzNjQ0ODcpLGc9YShnLGQsaCxmLGVbbisxMl0sMTEsLTQyMTgxNTgzNSksZj1hKGYsZyxkLGgsZVtuKzE1XSwxNiw1MzA3NDI1MjApLGQ9YyhkLGg9YShoLGYsZyxkLGVbbisyXSwyMywtOTk1MzM4NjUxKSxmLGcsZVtuXSw2LC0xOTg2MzA4NDQpLGc9YyhnLGQsaCxmLGVbbis3XSwxMCwxMTI2ODkxNDE1KSxmPWMoZixnLGQsaCxlW24rMTRdLDE1LC0xNDE2MzU0OTA1KSxoPWMoaCxmLGcsZCxlW24rNV0sMjEsLTU3NDM0MDU1KSxkPWMoZCxoLGYsZyxlW24rMTJdLDYsMTcwMDQ4NTU3MSksZz1jKGcsZCxoLGYsZVtuKzNdLDEwLC0xODk0OTg2NjA2KSxmPWMoZixnLGQsaCxlW24rMTBdLDE1LC0xMDUxNTIzKSxoPWMoaCxmLGcsZCxlW24rMV0sMjEsLTIwNTQ5MjI3OTkpLGQ9YyhkLGgsZixnLGVbbis4XSw2LDE4NzMzMTMzNTkpLGc9YyhnLGQsaCxmLGVbbisxNV0sMTAsLTMwNjExNzQ0KSxmPWMoZixnLGQsaCxlW24rNl0sMTUsLTE1NjAxOTgzODApLGg9YyhoLGYsZyxkLGVbbisxM10sMjEsMTMwOTE1MTY0OSksZD1jKGQsaCxmLGcsZVtuKzRdLDYsLTE0NTUyMzA3MCksZz1jKGcsZCxoLGYsZVtuKzExXSwxMCwtMTEyMDIxMDM3OSksZj1jKGYsZyxkLGgsZVtuKzJdLDE1LDcxODc4NzI1OSksaD1jKGgsZixnLGQsZVtuKzldLDIxLC0zNDM0ODU1NTEpLGQ9cihkLG8pLGg9cihoLHUpLGY9cihmLGwpLGc9cihnLHApO3JldHVybltkLGgsZixnXX0oZnVuY3Rpb24oZSl7dmFyIHQsbj1bXTtmb3IoblsoZS5sZW5ndGg+PjIpLTFdPXZvaWQgMCx0PTA7dDxuLmxlbmd0aDt0Kz0xKW5bdF09MDt2YXIgcj04KmUubGVuZ3RoO2Zvcih0PTA7dDxyO3QrPTgpblt0Pj41XXw9KDI1NSZlW3QvOF0pPDx0JTMyO3JldHVybiBufShlKSw4KmUubGVuZ3RoKSl9O24uZGVmYXVsdD11fSx7fV0sMTA0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9ZnVuY3Rpb24oKXtpZighcil0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIHIobyl9O3ZhciByPSJ1bmRlZmluZWQiIT10eXBlb2YgY3J5cHRvJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKXx8InVuZGVmaW5lZCIhPXR5cGVvZiBtc0NyeXB0byYmImZ1bmN0aW9uIj09dHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQobXNDcnlwdG8pLG89bmV3IFVpbnQ4QXJyYXkoMTYpfSx7fV0sMTA1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7c3dpdGNoKGUpe2Nhc2UgMDpyZXR1cm4gdCZuXn50JnI7Y2FzZSAxOmNhc2UgMzpyZXR1cm4gdF5uXnI7Y2FzZSAyOnJldHVybiB0Jm5edCZyXm4mcn19ZnVuY3Rpb24gbyhlLHQpe3JldHVybiBlPDx0fGU+Pj4zMi10fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9dm9pZCAwO3ZhciBpPWZ1bmN0aW9uKGUpe3ZhciB0PVsxNTE4NTAwMjQ5LDE4NTk3NzUzOTMsMjQwMDk1OTcwOCwzMzk1NDY5NzgyXSxuPVsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzgsMzI4NTM3NzUyMF07aWYoInN0cmluZyI9PXR5cGVvZiBlKXt2YXIgaT11bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpO2U9bmV3IEFycmF5KGkubGVuZ3RoKTtmb3IodmFyIHM9MDtzPGkubGVuZ3RoO3MrKyllW3NdPWkuY2hhckNvZGVBdChzKX1lLnB1c2goMTI4KTt2YXIgYT1lLmxlbmd0aC80KzIsYz1NYXRoLmNlaWwoYS8xNiksdT1uZXcgQXJyYXkoYyk7Zm9yKHM9MDtzPGM7cysrKXt1W3NdPW5ldyBBcnJheSgxNik7Zm9yKHZhciBsPTA7bDwxNjtsKyspdVtzXVtsXT1lWzY0KnMrNCpsXTw8MjR8ZVs2NCpzKzQqbCsxXTw8MTZ8ZVs2NCpzKzQqbCsyXTw8OHxlWzY0KnMrNCpsKzNdfWZvcih1W2MtMV1bMTRdPTgqKGUubGVuZ3RoLTEpL01hdGgucG93KDIsMzIpLHVbYy0xXVsxNF09TWF0aC5mbG9vcih1W2MtMV1bMTRdKSx1W2MtMV1bMTVdPTgqKGUubGVuZ3RoLTEpJjQyOTQ5NjcyOTUscz0wO3M8YztzKyspe2Zvcih2YXIgcD1uZXcgQXJyYXkoODApLGQ9MDtkPDE2O2QrKylwW2RdPXVbc11bZF07Zm9yKGQ9MTY7ZDw4MDtkKyspcFtkXT1vKHBbZC0zXV5wW2QtOF1ecFtkLTE0XV5wW2QtMTZdLDEpO3ZhciBoPW5bMF0sZj1uWzFdLGc9blsyXSxtPW5bM10sdj1uWzRdO2ZvcihkPTA7ZDw4MDtkKyspe3ZhciB5PU1hdGguZmxvb3IoZC8yMCksRT1vKGgsNSkrcih5LGYsZyxtKSt2K3RbeV0rcFtkXT4+PjA7dj1tLG09ZyxnPW8oZiwzMCk+Pj4wLGY9aCxoPUV9blswXT1uWzBdK2g+Pj4wLG5bMV09blsxXStmPj4+MCxuWzJdPW5bMl0rZz4+PjAsblszXT1uWzNdK20+Pj4wLG5bNF09bls0XSt2Pj4+MH1yZXR1cm5bblswXT4+MjQmMjU1LG5bMF0+PjE2JjI1NSxuWzBdPj44JjI1NSwyNTUmblswXSxuWzFdPj4yNCYyNTUsblsxXT4+MTYmMjU1LG5bMV0+PjgmMjU1LDI1NSZuWzFdLG5bMl0+PjI0JjI1NSxuWzJdPj4xNiYyNTUsblsyXT4+OCYyNTUsMjU1Jm5bMl0sblszXT4+MjQmMjU1LG5bM10+PjE2JjI1NSxuWzNdPj44JjI1NSwyNTUmblszXSxuWzRdPj4yNCYyNTUsbls0XT4+MTYmMjU1LG5bNF0+PjgmMjU1LDI1NSZuWzRdXX07bi5kZWZhdWx0PWl9LHt9XSwxMDY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG4uZGVmYXVsdD12b2lkIDA7dmFyIHIsbyxpPWEoZSgiLi9ybmcuanMiKSkscz1hKGUoIi4vYnl0ZXNUb1V1aWQuanMiKSk7ZnVuY3Rpb24gYShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19dmFyIGM9MCx1PTAsbD1mdW5jdGlvbihlLHQsbil7dmFyIGE9dCYmbnx8MCxsPXR8fFtdLHA9KGU9ZXx8e30pLm5vZGV8fHIsZD12b2lkIDAhPT1lLmNsb2Nrc2VxP2UuY2xvY2tzZXE6bztpZihudWxsPT1wfHxudWxsPT1kKXt2YXIgaD1lLnJhbmRvbXx8KGUucm5nfHxpLmRlZmF1bHQpKCk7bnVsbD09cCYmKHA9cj1bMXxoWzBdLGhbMV0saFsyXSxoWzNdLGhbNF0saFs1XV0pLG51bGw9PWQmJihkPW89MTYzODMmKGhbNl08PDh8aFs3XSkpfXZhciBmPXZvaWQgMCE9PWUubXNlY3M/ZS5tc2VjczoobmV3IERhdGUpLmdldFRpbWUoKSxnPXZvaWQgMCE9PWUubnNlY3M/ZS5uc2Vjczp1KzEsbT1mLWMrKGctdSkvMWU0O2lmKG08MCYmdm9pZCAwPT09ZS5jbG9ja3NlcSYmKGQ9ZCsxJjE2MzgzKSwobTwwfHxmPmMpJiZ2b2lkIDA9PT1lLm5zZWNzJiYoZz0wKSxnPj0xZTQpdGhyb3cgbmV3IEVycm9yKCJ1dWlkLnYxKCk6IENhbid0IGNyZWF0ZSBtb3JlIHRoYW4gMTBNIHV1aWRzL3NlYyIpO2M9Zix1PWcsbz1kO3ZhciB2PSgxZTQqKDI2ODQzNTQ1NSYoZis9MTIyMTkyOTI4ZTUpKStnKSU0Mjk0OTY3Mjk2O2xbYSsrXT12Pj4+MjQmMjU1LGxbYSsrXT12Pj4+MTYmMjU1LGxbYSsrXT12Pj4+OCYyNTUsbFthKytdPTI1NSZ2O3ZhciB5PWYvNDI5NDk2NzI5NioxZTQmMjY4NDM1NDU1O2xbYSsrXT15Pj4+OCYyNTUsbFthKytdPTI1NSZ5LGxbYSsrXT15Pj4+MjQmMTV8MTYsbFthKytdPXk+Pj4xNiYyNTUsbFthKytdPWQ+Pj44fDEyOCxsW2ErK109MjU1JmQ7Zm9yKHZhciBFPTA7RTw2OysrRSlsW2ErRV09cFtFXTtyZXR1cm4gdHx8KDAscy5kZWZhdWx0KShsKX07bi5kZWZhdWx0PWx9LHsiLi9ieXRlc1RvVXVpZC5qcyI6MTAxLCIuL3JuZy5qcyI6MTA0fV0sMTA3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9dm9pZCAwO3ZhciByPWkoZSgiLi92MzUuanMiKSksbz1pKGUoIi4vbWQ1LmpzIikpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fXZhciBzPSgwLHIuZGVmYXVsdCkoInYzIiw0OCxvLmRlZmF1bHQpO24uZGVmYXVsdD1zfSx7Ii4vbWQ1LmpzIjoxMDMsIi4vdjM1LmpzIjoxMDh9XSwxMDg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG4uZGVmYXVsdD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZnVuY3Rpb24oZSxyLGkscyl7dmFyIGE9aSYmc3x8MDtpZigic3RyaW5nIj09dHlwZW9mIGUmJihlPWZ1bmN0aW9uKGUpe2U9dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUpKTtmb3IodmFyIHQ9bmV3IEFycmF5KGUubGVuZ3RoKSxuPTA7bjxlLmxlbmd0aDtuKyspdFtuXT1lLmNoYXJDb2RlQXQobik7cmV0dXJuIHR9KGUpKSwic3RyaW5nIj09dHlwZW9mIHImJihyPWZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybiBlLnJlcGxhY2UoL1thLWZBLUYwLTldezJ9L2csKGZ1bmN0aW9uKGUpe3QucHVzaChwYXJzZUludChlLDE2KSl9KSksdH0ocikpLCFBcnJheS5pc0FycmF5KGUpKXRocm93IFR5cGVFcnJvcigidmFsdWUgbXVzdCBiZSBhbiBhcnJheSBvZiBieXRlcyIpO2lmKCFBcnJheS5pc0FycmF5KHIpfHwxNiE9PXIubGVuZ3RoKXRocm93IFR5cGVFcnJvcigibmFtZXNwYWNlIG11c3QgYmUgdXVpZCBzdHJpbmcgb3IgYW4gQXJyYXkgb2YgMTYgYnl0ZSB2YWx1ZXMiKTt2YXIgYz1uKHIuY29uY2F0KGUpKTtpZihjWzZdPTE1JmNbNl18dCxjWzhdPTYzJmNbOF18MTI4LGkpZm9yKHZhciB1PTA7dTwxNjsrK3UpaVthK3VdPWNbdV07cmV0dXJuIGl8fCgwLG8uZGVmYXVsdCkoYyl9O3RyeXtyLm5hbWU9ZX1jYXRjaChlKXt9cmV0dXJuIHIuRE5TPWksci5VUkw9cyxyfSxuLlVSTD1uLkROUz12b2lkIDA7dmFyIHIsbz0ocj1lKCIuL2J5dGVzVG9VdWlkLmpzIikpJiZyLl9fZXNNb2R1bGU/cjp7ZGVmYXVsdDpyfTtjb25zdCBpPSI2YmE3YjgxMC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgiO24uRE5TPWk7Y29uc3Qgcz0iNmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4IjtuLlVSTD1zfSx7Ii4vYnl0ZXNUb1V1aWQuanMiOjEwMX1dLDEwOTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PXZvaWQgMDt2YXIgcj1pKGUoIi4vcm5nLmpzIikpLG89aShlKCIuL2J5dGVzVG9VdWlkLmpzIikpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fXZhciBzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10JiZufHwwOyJzdHJpbmciPT10eXBlb2YgZSYmKHQ9ImJpbmFyeSI9PT1lP25ldyBBcnJheSgxNik6bnVsbCxlPW51bGwpO3ZhciBzPShlPWV8fHt9KS5yYW5kb218fChlLnJuZ3x8ci5kZWZhdWx0KSgpO2lmKHNbNl09MTUmc1s2XXw2NCxzWzhdPTYzJnNbOF18MTI4LHQpZm9yKHZhciBhPTA7YTwxNjsrK2EpdFtpK2FdPXNbYV07cmV0dXJuIHR8fCgwLG8uZGVmYXVsdCkocyl9O24uZGVmYXVsdD1zfSx7Ii4vYnl0ZXNUb1V1aWQuanMiOjEwMSwiLi9ybmcuanMiOjEwNH1dLDExMDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PXZvaWQgMDt2YXIgcj1pKGUoIi4vdjM1LmpzIikpLG89aShlKCIuL3NoYTEuanMiKSk7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19dmFyIHM9KDAsci5kZWZhdWx0KSgidjUiLDgwLG8uZGVmYXVsdCk7bi5kZWZhdWx0PXN9LHsiLi9zaGExLmpzIjoxMDUsIi4vdjM1LmpzIjoxMDh9XSwxMTE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWUoIi4vdXRpbHMvTFJVIiksbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dm9pZCAwPT09ZSYmKGU9MWUzKSx0aGlzLm1heFNpemU9ZSx0aGlzLmNhY2hlPW5ldyByLkxSVUNhY2hlKGUpfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInNpemUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYWNoZS5sZW5ndGh9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUucHV0PWZ1bmN0aW9uKHQsbil7dmFyIHI9InN0cmluZyIhPXR5cGVvZiB0P2UuZ2V0S2V5U3RyaW5nKHQpOnQsbz10aGlzLnBvcHVsYXRlVmFsdWUobik7dGhpcy5jYWNoZS5wdXQocixvKX0sZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBuPSJzdHJpbmciIT10eXBlb2YgdD9lLmdldEtleVN0cmluZyh0KTp0LHI9RGF0ZS5ub3coKSxvPXRoaXMuY2FjaGUuZ2V0KG4pO2lmKG8pe2Zvcih2YXIgaT1vLmxlbmd0aC0xO2k+PTA7aS0tKW9baV0uRXhwaXJlPHImJm8uc3BsaWNlKGksMSk7aWYoMD09PW8ubGVuZ3RoKXJldHVybiB2b2lkIHRoaXMuY2FjaGUucmVtb3ZlKG4pfXJldHVybiBvfSxlLmdldEtleVN0cmluZz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj1PYmplY3Qua2V5cyhlKS5zb3J0KCkscj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgbz1uW3JdO3ZvaWQgMCE9PWVbb10mJnQucHVzaChlW29dKX1yZXR1cm4gdC5qb2luKCIgIil9LGUucHJvdG90eXBlLnBvcHVsYXRlVmFsdWU9ZnVuY3Rpb24oZSl7dmFyIHQ9RGF0ZS5ub3coKTtyZXR1cm4gZS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybntBZGRyZXNzOmUuQWRkcmVzc3x8IiIsRXhwaXJlOnQrNjAqKGUuQ2FjaGVQZXJpb2RJbk1pbnV0ZXN8fDEpKjFlM319KSl9LGUucHJvdG90eXBlLmVtcHR5PWZ1bmN0aW9uKCl7dGhpcy5jYWNoZS5lbXB0eSgpfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7dmFyIG49InN0cmluZyIhPXR5cGVvZiB0P2UuZ2V0S2V5U3RyaW5nKHQpOnQ7dGhpcy5jYWNoZS5yZW1vdmUobil9LGV9KCk7bi5FbmRwb2ludENhY2hlPW99LHsiLi91dGlscy9MUlUiOjExMn1dLDExMjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZnVuY3Rpb24oZSx0KXt0aGlzLmtleT1lLHRoaXMudmFsdWU9dH0sbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYodGhpcy5ub2RlTWFwPXt9LHRoaXMuc2l6ZT0wLCJudW1iZXIiIT10eXBlb2YgZXx8ZTwxKXRocm93IG5ldyBFcnJvcigiQ2FjaGUgc2l6ZSBjYW4gb25seSBiZSBwb3NpdGl2ZSBudW1iZXIiKTt0aGlzLnNpemVMaW1pdD1lfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImxlbmd0aCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNpemV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUucHJlcGVuZFRvTGlzdD1mdW5jdGlvbihlKXt0aGlzLmhlYWRlck5vZGU/KHRoaXMuaGVhZGVyTm9kZS5wcmV2PWUsZS5uZXh0PXRoaXMuaGVhZGVyTm9kZSk6dGhpcy50YWlsTm9kZT1lLHRoaXMuaGVhZGVyTm9kZT1lLHRoaXMuc2l6ZSsrfSxlLnByb3RvdHlwZS5yZW1vdmVGcm9tVGFpbD1mdW5jdGlvbigpe2lmKHRoaXMudGFpbE5vZGUpe3ZhciBlPXRoaXMudGFpbE5vZGUsdD1lLnByZXY7cmV0dXJuIHQmJih0Lm5leHQ9dm9pZCAwKSxlLnByZXY9dm9pZCAwLHRoaXMudGFpbE5vZGU9dCx0aGlzLnNpemUtLSxlfX0sZS5wcm90b3R5cGUuZGV0YWNoRnJvbUxpc3Q9ZnVuY3Rpb24oZSl7dGhpcy5oZWFkZXJOb2RlPT09ZSYmKHRoaXMuaGVhZGVyTm9kZT1lLm5leHQpLHRoaXMudGFpbE5vZGU9PT1lJiYodGhpcy50YWlsTm9kZT1lLnByZXYpLGUucHJldiYmKGUucHJldi5uZXh0PWUubmV4dCksZS5uZXh0JiYoZS5uZXh0LnByZXY9ZS5wcmV2KSxlLm5leHQ9dm9pZCAwLGUucHJldj12b2lkIDAsdGhpcy5zaXplLS19LGUucHJvdG90eXBlLmdldD1mdW5jdGlvbihlKXtpZih0aGlzLm5vZGVNYXBbZV0pe3ZhciB0PXRoaXMubm9kZU1hcFtlXTtyZXR1cm4gdGhpcy5kZXRhY2hGcm9tTGlzdCh0KSx0aGlzLnByZXBlbmRUb0xpc3QodCksdC52YWx1ZX19LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihlKXtpZih0aGlzLm5vZGVNYXBbZV0pe3ZhciB0PXRoaXMubm9kZU1hcFtlXTt0aGlzLmRldGFjaEZyb21MaXN0KHQpLGRlbGV0ZSB0aGlzLm5vZGVNYXBbZV19fSxlLnByb3RvdHlwZS5wdXQ9ZnVuY3Rpb24oZSx0KXtpZih0aGlzLm5vZGVNYXBbZV0pdGhpcy5yZW1vdmUoZSk7ZWxzZSBpZih0aGlzLnNpemU9PT10aGlzLnNpemVMaW1pdCl7dmFyIG49dGhpcy5yZW1vdmVGcm9tVGFpbCgpLmtleTtkZWxldGUgdGhpcy5ub2RlTWFwW25dfXZhciBvPW5ldyByKGUsdCk7dGhpcy5ub2RlTWFwW2VdPW8sdGhpcy5wcmVwZW5kVG9MaXN0KG8pfSxlLnByb3RvdHlwZS5lbXB0eT1mdW5jdGlvbigpe2Zvcih2YXIgZT1PYmplY3Qua2V5cyh0aGlzLm5vZGVNYXApLHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIG49ZVt0XSxyPXRoaXMubm9kZU1hcFtuXTt0aGlzLmRldGFjaEZyb21MaXN0KHIpLGRlbGV0ZSB0aGlzLm5vZGVNYXBbbl19fSxlfSgpO24uTFJVQ2FjaGU9b30se31dLDExMzpbZnVuY3Rpb24oZSx0LG4pe2UoIi4vYnJvd3Nlcl9sb2FkZXIiKTt2YXIgcj1lKCIuL2NvcmUiKTsidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmKHdpbmRvdy5BV1M9ciksdm9pZCAwIT09dCYmKHQuZXhwb3J0cz1yKSwidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYmJihzZWxmLkFXUz1yKSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwociwiQ29ubmVjdCIpfHwoci5hcGlMb2FkZXIuc2VydmljZXMuY29ubmVjdD17fSxyLkNvbm5lY3Q9ci5TZXJ2aWNlLmRlZmluZVNlcnZpY2UoImNvbm5lY3QiLFsiMjAxNy0wMi0xNSJdKSksci5hcGlMb2FkZXIuc2VydmljZXMuY29ubmVjdFsiMjAxNy0wMi0xNSJdPWUoIi4uL2FwaXMvY29ubmVjdC0yMDE3LTAyLTE1Lm1pbiIpfSx7Ii4uL2FwaXMvY29ubmVjdC0yMDE3LTAyLTE1Lm1pbiI6MywiLi9icm93c2VyX2xvYWRlciI6MTYsIi4vY29yZSI6MTl9XX0se30sWzExM10pfSw3NTQ6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dCx0LkNsaWVudE1ldGhvZHM9dC5tYWtlRW51bShbImdldEFnZW50U25hcHNob3QiLCJwdXRBZ2VudFN0YXRlIiwiZ2V0QWdlbnRTdGF0ZXMiLCJnZXREaWFsYWJsZUNvdW50cnlDb2RlcyIsImdldFJvdXRpbmdQcm9maWxlUXVldWVzIiwiZ2V0QWdlbnRQZXJtaXNzaW9ucyIsImdldEFnZW50Q29uZmlndXJhdGlvbiIsInVwZGF0ZUFnZW50Q29uZmlndXJhdGlvbiIsImFjY2VwdENvbnRhY3QiLCJjcmVhdGVPdXRib3VuZENvbnRhY3QiLCJjcmVhdGVUYXNrQ29udGFjdCIsImNsZWFyQ29udGFjdCIsImNvbXBsZXRlQ29udGFjdCIsImRlc3Ryb3lDb250YWN0IiwicmVqZWN0Q29udGFjdCIsIm5vdGlmeUNvbnRhY3RJc3N1ZSIsInVwZGF0ZUNvbnRhY3RBdHRyaWJ1dGVzIiwiY3JlYXRlQWRkaXRpb25hbENvbm5lY3Rpb24iLCJkZXN0cm95Q29ubmVjdGlvbiIsImhvbGRDb25uZWN0aW9uIiwicmVzdW1lQ29ubmVjdGlvbiIsInRvZ2dsZUFjdGl2ZUNvbm5lY3Rpb25zIiwiY29uZmVyZW5jZUNvbm5lY3Rpb25zIiwic2VuZENsaWVudExvZ3MiLCJzZW5kRGlnaXRzIiwic2VuZFNvZnRwaG9uZUNhbGxSZXBvcnQiLCJzZW5kU29mdHBob25lQ2FsbE1ldHJpY3MiLCJnZXRFbmRwb2ludHMiLCJnZXROZXdBdXRoVG9rZW4iLCJjcmVhdGVUcmFuc3BvcnQiLCJtdXRlUGFydGljaXBhbnQiLCJ1bm11dGVQYXJ0aWNpcGFudCIsInVwZGF0ZU1vbml0b3JQYXJ0aWNpcGFudFN0YXRlIiwicGF1c2VDb250YWN0IiwicmVzdW1lQ29udGFjdCJdKSx0LkFnZW50QXBwQ2xpZW50TWV0aG9kcz17R0VUX0NPTlRBQ1Q6IkFnZW50QXBwU2VydmljZS5MY21zLmdldENvbnRhY3QiLERFTEVURV9TUEVBS0VSOiJBZ2VudEFwcFNlcnZpY2UuVm9pY2VJZC5kZWxldGVTcGVha2VyIixFTlJPTExfQllfU0VTU0lPTjoiQWdlbnRBcHBTZXJ2aWNlLlZvaWNlSWQuZW5yb2xsQnlTZXNzaW9uIixFVkFMVUFURV9TRVNTSU9OOiJBZ2VudEFwcFNlcnZpY2UuVm9pY2VJZC5ldmFsdWF0ZVNlc3Npb24iLERFU0NSSUJFX1NQRUFLRVI6IkFnZW50QXBwU2VydmljZS5Wb2ljZUlkLmRlc2NyaWJlU3BlYWtlciIsT1BUX09VVF9TUEVBS0VSOiJBZ2VudEFwcFNlcnZpY2UuVm9pY2VJZC5vcHRPdXRTcGVha2VyIixVUERBVEVfVk9JQ0VfSURfREFUQToiQWdlbnRBcHBTZXJ2aWNlLkxjbXMudXBkYXRlVm9pY2VJZERhdGEiLERFU0NSSUJFX1NFU1NJT046IkFnZW50QXBwU2VydmljZS5Wb2ljZUlkLmRlc2NyaWJlU2Vzc2lvbiIsVVBEQVRFX1NFU1NJT046IkFnZW50QXBwU2VydmljZS5Wb2ljZUlkLnVwZGF0ZVNlc3Npb24iLFNUQVJUX1ZPSUNFX0lEX1NFU1NJT046IkFnZW50QXBwU2VydmljZS5OYXNhLnN0YXJ0Vm9pY2VJZFNlc3Npb24iLExJU1RfSU5URUdSQVRJT05fQVNTT0NJQVRJT05TOiJBZ2VudEFwcFNlcnZpY2UuQWNzLmxpc3RJbnRlZ3JhdGlvbkFzc29jaWF0aW9ucyJ9LHQuTWFzdGVyTWV0aG9kcz10Lm1ha2VFbnVtKFsiYmVjb21lTWFzdGVyIiwiY2hlY2tNYXN0ZXIiXSksdC5UYXNrVGVtcGxhdGVzQ2xpZW50TWV0aG9kcz10Lm1ha2VFbnVtKFsibGlzdFRhc2tUZW1wbGF0ZXMiLCJnZXRUYXNrVGVtcGxhdGUiLCJjcmVhdGVUZW1wbGF0ZWRUYXNrIiwidXBkYXRlQ29udGFjdCJdKSx0LkFwaVByb3h5Q2xpZW50TWV0aG9kcz10Lm1ha2VFbnVtKFsicXJJbnRlZ3JhdGlvbkV4aXN0cyIsInFyU2VhcmNoUXVpY2tSZXNwb25zZXMiXSksdC5SZXRyeWFibGVDbGllbnRNZXRob2RzTGlzdD1bdC5DbGllbnRNZXRob2RzLkdFVF9BR0VOVF9TTkFQU0hPVCx0LkNsaWVudE1ldGhvZHMuR0VUX0FHRU5UX0NPTkZJR1VSQVRJT04sdC5DbGllbnRNZXRob2RzLkdFVF9BR0VOVF9QRVJNSVNTSU9OUyx0LkNsaWVudE1ldGhvZHMuR0VUX0FHRU5UX1NUQVRFUyx0LkNsaWVudE1ldGhvZHMuR0VUX0RJQUxBQkxFX0NPVU5UUllfQ09ERVMsdC5DbGllbnRNZXRob2RzLkdFVF9ST1VUSU5HX1BST0ZJTEVfUVVFVUVTXSx0LlJldHJ5YWJsZUVycm9ycz10Lm1ha2VFbnVtKFsidW5hdXRob3JpemVkIiwiYWNjZXNzRGVuaWVkIl0pLHQuUmV0cnlTdGF0dXM9dC5tYWtlRW51bShbInJldHJ5aW5nIiwiZXhoYXVzdGVkIiwibm9uZSJdKTt2YXIgbj1mdW5jdGlvbigpe307bi5FTVBUWV9DQUxMQkFDS1M9e3N1Y2Nlc3M6ZnVuY3Rpb24oKXt9LGZhaWx1cmU6ZnVuY3Rpb24oKXt9fSxuLnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGUscixvKXt0LmFzc2VydE5vdE51bGwoZSwibWV0aG9kIik7dmFyIGk9cnx8e30scz1vfHxuLkVNUFRZX0NBTExCQUNLUzt0aGlzLl9jYWxsSW1wbChlLGkscyl9LG4ucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLG4scil7dGhyb3cgbmV3IHQuTm90SW1wbGVtZW50ZWRFcnJvcn07dmFyIHI9ZnVuY3Rpb24oKXtuLmNhbGwodGhpcyl9OyhyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cixyLnByb3RvdHlwZS5fY2FsbEltcGw9ZnVuY3Rpb24oZSxuLHIpe2lmKHImJnIuZmFpbHVyZSl7dmFyIG89dC5zcHJpbnRmKCJObyBzdWNoIG1ldGhvZCBleGlzdHMgb24gTlVMTCBjbGllbnQ6ICVzIixlKTtyLmZhaWx1cmUobmV3IHQuVmFsdWVFcnJvcihvKSx7bWVzc2FnZTpvfSl9fTt2YXIgbz1mdW5jdGlvbihlLHIsbyl7bi5jYWxsKHRoaXMpLHRoaXMuY29uZHVpdD1lLHRoaXMucmVxdWVzdEV2ZW50PXIsdGhpcy5yZXNwb25zZUV2ZW50PW8sdGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwPXt9LHRoaXMuY29uZHVpdC5vblVwc3RyZWFtKG8sdC5oaXRjaCh0aGlzLHRoaXMuX2hhbmRsZVJlc3BvbnNlKSl9OyhvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9byxvLnByb3RvdHlwZS5fY2FsbEltcGw9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXQuRXZlbnRGYWN0b3J5LmNyZWF0ZVJlcXVlc3QodGhpcy5yZXF1ZXN0RXZlbnQsZSxuKTt0aGlzLl9yZXF1ZXN0SWRDYWxsYmFja3NNYXBbby5yZXF1ZXN0SWRdPXI7Y29uc3QgaT1bdC5DbGllbnRNZXRob2RzLlNFTkRfQ0xJRU5UX0xPR1MsdC5DbGllbnRNZXRob2RzLlNFTkRfU09GVFBIT05FX0NBTExfTUVUUklDUyx0LkNsaWVudE1ldGhvZHMuU0VORF9TT0ZUUEhPTkVfQ0FMTF9SRVBPUlRdO3RyeXtvLmV2ZW50IT09dC5FdmVudFR5cGUuQVBJX1JFUVVFU1R8fGkuaW5jbHVkZXMoby5tZXRob2QpfHx0LmdldExvZygpLnRyYWNlKGBTZW5kaW5nIEFQSV9SRVFVRVNUIGV2ZW50IGZvciAke28ubWV0aG9kfSB0byB1cHN0cmVhbWApLndpdGhPYmplY3Qoe21ldGhvZDpvLm1ldGhvZCxwYXJhbXM6by5wYXJhbXMsc3RhY2s6KG5ldyBFcnJvcikuc3RhY2t9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIlN0YWNrIHRyYWNlIExvZyBGYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9dGhpcy5jb25kdWl0LnNlbmRVcHN0cmVhbShvLmV2ZW50LG8pfSxvLnByb3RvdHlwZS5fZ2V0Q2FsbGJhY2tzRm9yUmVxdWVzdD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9yZXF1ZXN0SWRDYWxsYmFja3NNYXBbZV18fG51bGw7cmV0dXJuIG51bGwhPXQmJmRlbGV0ZSB0aGlzLl9yZXF1ZXN0SWRDYWxsYmFja3NNYXBbZV0sdH0sby5wcm90b3R5cGUuX2hhbmRsZVJlc3BvbnNlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2dldENhbGxiYWNrc0ZvclJlcXVlc3QoZS5yZXF1ZXN0SWQpO251bGwhPXQmJihlLmVyciYmdC5mYWlsdXJlP3QuZmFpbHVyZShlLmVycixlLmRhdGEpOnQuc3VjY2VzcyYmdC5zdWNjZXNzKGUuZGF0YSkpfTt2YXIgaT1mdW5jdGlvbihlKXtvLmNhbGwodGhpcyxlLHQuRXZlbnRUeXBlLkFQSV9SRVFVRVNULHQuRXZlbnRUeXBlLkFQSV9SRVNQT05TRSl9OyhpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9aTt2YXIgcz1mdW5jdGlvbigpe24uY2FsbCh0aGlzKSx0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuQVBJX1BST1hZX1JFU1BPTlNFLHQuaGl0Y2godGhpcyx0aGlzLl9oYW5kbGVSZXNwb25zZSkpLHRoaXMuX3JlcXVlc3RJZENhbGxiYWNrc01hcD17fX07KHMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1zLHMucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLG4scil7dmFyIG89dC5FdmVudEZhY3RvcnkuY3JlYXRlUmVxdWVzdCh0LkV2ZW50VHlwZS5BUElfUFJPWFlfUkVRVUVTVCxlLG4pO3RoaXMuX3JlcXVlc3RJZENhbGxiYWNrc01hcFtvLnJlcXVlc3RJZF09cix0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLkFQSV9QUk9YWV9SRVFVRVNULG8pfSxzLnByb3RvdHlwZS5fZ2V0Q2FsbGJhY2tzRm9yUmVxdWVzdD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9yZXF1ZXN0SWRDYWxsYmFja3NNYXBbZV18fG51bGw7cmV0dXJuIG51bGwhPXQmJmRlbGV0ZSB0aGlzLl9yZXF1ZXN0SWRDYWxsYmFja3NNYXBbZV0sdH0scy5wcm90b3R5cGUuX2hhbmRsZVJlc3BvbnNlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2dldENhbGxiYWNrc0ZvclJlcXVlc3QoZS5yZXF1ZXN0SWQpO251bGwhPXQmJihlLmVyciYmdC5mYWlsdXJlP3QuZmFpbHVyZShlLmVycixlLmRhdGEpOnQuc3VjY2VzcyYmdC5zdWNjZXNzKGUuZGF0YSkpfTt2YXIgYT1mdW5jdGlvbihlKXtvLmNhbGwodGhpcyxlLHQuRXZlbnRUeXBlLk1BU1RFUl9SRVFVRVNULHQuRXZlbnRUeXBlLk1BU1RFUl9SRVNQT05TRSl9OyhhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9YTt2YXIgYz1mdW5jdGlvbihlLHIsbyl7dC5hc3NlcnROb3ROdWxsKGUsImF1dGhDb29raWVOYW1lIiksdC5hc3NlcnROb3ROdWxsKHIsImF1dGhUb2tlbiIpLHQuYXNzZXJ0Tm90TnVsbChvLCJlbmRwb2ludCIpLG4uY2FsbCh0aGlzKSx0aGlzLmVuZHBvaW50VXJsPXQuZ2V0VXJsV2l0aFByb3RvY29sKG8pLHRoaXMuYXV0aFRva2VuPXIsdGhpcy5hdXRoQ29va2llTmFtZT1lfTsoYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWMsYy5wcm90b3R5cGUuX2NhbGxJbXBsPWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10aGlzLGk9e307aVtvLmF1dGhDb29raWVOYW1lXT1vLmF1dGhUb2tlbjt2YXIgcz17bWV0aG9kOiJwb3N0Iixib2R5OkpTT04uc3RyaW5naWZ5KG58fHt9KSxoZWFkZXJzOntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24iLCJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIiwiWC1BbXotdGFyZ2V0IjplLCJYLUFtei1CZWFyZXIiOkpTT04uc3RyaW5naWZ5KGkpfX07dC5mZXRjaChvLmVuZHBvaW50VXJsLHMpLnRoZW4oKGZ1bmN0aW9uKGUpe3Iuc3VjY2VzcyhlKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7Y29uc3QgdD1lLmJvZHkuZ2V0UmVhZGVyKCk7bGV0IG49IiI7Y29uc3Qgbz1uZXcgVGV4dERlY29kZXI7dC5yZWFkKCkudGhlbigoZnVuY3Rpb24gaSh7ZG9uZTpzLHZhbHVlOmF9KXtpZihzKXt2YXIgYz1KU09OLnBhcnNlKG4pO3JldHVybiBjLnN0YXR1cz1lLnN0YXR1cyx2b2lkIHIuZmFpbHVyZShjKX1yZXR1cm4gbis9by5kZWNvZGUoYSksdC5yZWFkKCkudGhlbihpKX0pKX0pKX07dmFyIHU9ZnVuY3Rpb24oZSxyLG8pe3QuYXNzZXJ0Tm90TnVsbChlLCJhdXRoVG9rZW4iKSx0LmFzc2VydE5vdE51bGwociwicmVnaW9uIiksbi5jYWxsKHRoaXMpLEFXUy5jb25maWcuY3JlZGVudGlhbHM9bmV3IEFXUy5DcmVkZW50aWFscyh7fSksQVdTLmNvbmZpZy5yZWdpb249cix0aGlzLmF1dGhUb2tlbj1lO3ZhciBpPXQuZ2V0QmFzZVVybCgpLHM9b3x8KGkuaW5jbHVkZXMoIi5hd3NhcHBzLmNvbSIpP2krIi9jb25uZWN0L2FwaSI6aSsiL2FwaSIpLGE9bmV3IEFXUy5FbmRwb2ludChzKTt0aGlzLmNsaWVudD1uZXcgQVdTLkNvbm5lY3Qoe2VuZHBvaW50OmF9KSx0aGlzLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyPTAsdGhpcy5hY2Nlc3NEZW5pZWRGYWlsQ291bnRlcj0wfTsodS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXUsdS5wcm90b3R5cGUuX2NhbGxJbXBsPWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10aGlzLGk9dC5nZXRMb2coKTtpZih0LmNvbnRhaW5zKHRoaXMuY2xpZW50LGUpKW49dGhpcy5fdHJhbnNsYXRlUGFyYW1zKGUsbiksInBhdXNlQ29udGFjdCIhPT1lJiYicmVzdW1lQ29udGFjdCIhPT1lfHxkZWxldGUgbi5hdXRoZW50aWNhdGlvbixuJiZuLnJlbGF0ZWRDb250YWN0SWQmJm51bGwhPT1uLnJlbGF0ZWRDb250YWN0SWQmJm4ucHJldmlvdXNDb250YWN0SWQmJmRlbGV0ZSBuLnByZXZpb3VzQ29udGFjdElkLGkudHJhY2UoIkFXU0NsaWVudDogLS1ceDNlIENhbGxpbmcgb3BlcmF0aW9uICclcyciLGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy5jbGllbnRbZV0obikub24oImJ1aWxkIiwoZnVuY3Rpb24oZSl7ZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJYLUFtei1CZWFyZXIiXT1vLmF1dGhUb2tlbn0pKS5zZW5kKChmdW5jdGlvbihuLHMpe3RyeXtpZihuKW4uY29kZT09PXQuQ1RJRXhjZXB0aW9ucy5VTkFVVEhPUklaRURfRVhDRVBUSU9OfHw0MDE9PT1uLnN0YXR1c0NvZGU/by5fcmV0cnlNZXRob2QoZSxyLG4scyx0LlJldHJ5YWJsZUVycm9ycy5VTkFVVEhPUklaRUQpOm4uY29kZT09PXQuQ1RJRXhjZXB0aW9ucy5BQ0NFU1NfREVOSUVEX0VYQ0VQVElPTnx8NDAzPT09bi5zdGF0dXNDb2RlP28uX3JldHJ5TWV0aG9kKGUscixuLHMsdC5SZXRyeWFibGVFcnJvcnMuQUNDRVNTX0RFTklFRCk6KG8udW5hdXRob3JpemVkRmFpbENvdW50ZXI9MCxvLmFjY2Vzc0RlbmllZEZhaWxDb3VudGVyPTAsci5mYWlsdXJlKG8uX2Zvcm1hdENhbGxFcnJvcihvLl9hZGRTdGF0dXNDb2RlVG9FcnJvcihuKSkscykpLGkudHJhY2UoIkFXU0NsaWVudDogPC0tIE9wZXJhdGlvbiAnJXMnIGZhaWxlZDogJXMiLGUsSlNPTi5zdHJpbmdpZnkobikpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7ZWxzZXtsZXQgdD17fTtpLnRyYWNlKCJBV1NDbGllbnQ6IDwtLSBPcGVyYXRpb24gJyVzJyBzdWNjZWVkZWQuIixlKS53aXRoT2JqZWN0KHMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksby51bmF1dGhvcml6ZWRGYWlsQ291bnRlcj0wLG8uYWNjZXNzRGVuaWVkRmFpbENvdW50ZXI9MCx0aGlzLmh0dHBSZXNwb25zZSYmdGhpcy5odHRwUmVzcG9uc2UuaGFzT3duUHJvcGVydHkoImJvZHkiKSYmKHQuY29udGVudExlbmd0aD10aGlzLmh0dHBSZXNwb25zZS5ib2R5Lmxlbmd0aCksci5zdWNjZXNzKHMsdCl9fWNhdGNoKG4pe3QuZ2V0TG9nKCkuZXJyb3IoIkZhaWxlZCB0byBoYW5kbGUgQVdTIEFQSSByZXF1ZXN0IGZvciBtZXRob2QgJXMiLGUpLndpdGhFeGNlcHRpb24obikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19KSk7ZWxzZXt2YXIgcz10LnNwcmludGYoIk5vIHN1Y2ggbWV0aG9kIGV4aXN0cyBvbiBBV1MgY2xpZW50OiAlcyIsZSk7ci5mYWlsdXJlKG5ldyB0LlZhbHVlRXJyb3Iocykse21lc3NhZ2U6c30pfX0sdS5wcm90b3R5cGUuX2lzUmV0cnlhYmxlTWV0aG9kPWZ1bmN0aW9uKGUpe3JldHVybiB0LlJldHJ5YWJsZUNsaWVudE1ldGhvZHNMaXN0LmluY2x1ZGVzKGUpfSx1LnByb3RvdHlwZS5fcmV0cnlNZXRob2Q9ZnVuY3Rpb24oZSxuLHIsbyxpKXt2YXIgcz10aGlzLGE9dC5nZXRMb2coKTtjb25zdCBjPWU9PnMuX2Zvcm1hdENhbGxFcnJvcihzLl9hZGRTdGF0dXNDb2RlVG9FcnJvcihlKSk7bGV0IHU9e21heENvdW50OnQuY29yZS5NQVhfVU5BVVRIT1JJWkVEX1JFVFJZX0NPVU5ULGZhaWxDb3VudGVyOnMudW5hdXRob3JpemVkRmFpbENvdW50ZXIsaW5jcmVhc2VDb3VudGVyOigpPT5zLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyKz0xLHJlc2V0Q291bnRlcjooKT0+cy51bmF1dGhvcml6ZWRGYWlsQ291bnRlcj0wLGVycm9yTWVzc2FnZToidW5hdXRob3JpemVkIixleGhhdXN0ZWRSZXRyaWVzOnMudW5hdXRob3JpemVkRmFpbENvdW50ZXI+PXQuY29yZS5NQVhfVU5BVVRIT1JJWkVEX1JFVFJZX0NPVU5ULHJldHJ5Q2FsbGJhY2s6KGUsdCk9Pm4uZmFpbHVyZShjKGUpLHQpLGRlZmF1bHRDYWxsYmFjazooZSx0KT0+bi5hdXRoRmFpbHVyZShjKGUpLHQpfTtzd2l0Y2goaSl7Y2FzZSB0LlJldHJ5YWJsZUVycm9ycy5VTkFVVEhPUklaRUQ6YnJlYWs7Y2FzZSB0LlJldHJ5YWJsZUVycm9ycy5BQ0NFU1NfREVOSUVEOnU9ey4uLnUsbWF4Q291bnQ6dC5jb3JlLk1BWF9BQ0NFU1NfREVOSUVEX1JFVFJZX0NPVU5ULGZhaWxDb3VudGVyOnMuYWNjZXNzRGVuaWVkRmFpbENvdW50ZXIsaW5jcmVhc2VDb3VudGVyOigpPT5zLmFjY2Vzc0RlbmllZEZhaWxDb3VudGVyKz0xLHJlc2V0Q291bnRlcjooKT0+cy5hY2Nlc3NEZW5pZWRGYWlsQ291bnRlcj0wLGVycm9yTWVzc2FnZToiYWNjZXNzIGRlbmllZCIsZXhoYXVzdGVkUmV0cmllczpzLmFjY2Vzc0RlbmllZEZhaWxDb3VudGVyPj10LmNvcmUuTUFYX0FDQ0VTU19ERU5JRURfUkVUUllfQ09VTlQsZGVmYXVsdENhbGxiYWNrOihlLHQpPT5uLmFjY2Vzc0RlbmllZChjKGUpLHQpfX1sZXQgbD17Li4ucixyZXRyeVN0YXR1czp0LlJldHJ5U3RhdHVzLk5PTkV9O2lmKHMuX2lzUmV0cnlhYmxlTWV0aG9kKGUpKXtpZighdS5leGhhdXN0ZWRSZXRyaWVzKXJldHVybiBhLnRyYWNlKGBBV1NDbGllbnQ6IDwtLSBPcGVyYXRpb24gJHtlfSBmYWlsZWQgd2l0aCAke3UuZXJyb3JNZXNzYWdlfSBlcnJvci4gUmV0cnlpbmcgY2FsbCBmb3IgYSAke3UuZmFpbENvdW50ZXIrMX0gdGltZWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdS5pbmNyZWFzZUNvdW50ZXIoKSxsPXsuLi5sLHJldHJ5U3RhdHVzOnQuUmV0cnlTdGF0dXMuUkVUUllJTkd9LHZvaWQgdS5yZXRyeUNhbGxiYWNrKGwsbyk7YS50cmFjZShgQVdTQ2xpZW50OiA8LS0gT3BlcmF0aW9uICR7ZX0gZXhoYXVzdGVkIG1heCAke3UubWF4Q291bnR9IG51bWJlciBvZiByZXRyaWVzIGZvciAke3UuZXJyb3JNZXNzYWdlfSBlcnJvcmApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdS5yZXNldENvdW50ZXIoKSxsPXsuLi5sLHJldHJ5U3RhdHVzOnQuUmV0cnlTdGF0dXMuRVhIQVVTVEVEfX1lbHNlIGEudHJhY2UoYEFXU0NsaWVudDogPC0tIE9wZXJhdGlvbiAke2V9IGZhaWxlZDogJHtKU09OLnN0cmluZ2lmeShyKX1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3UuZGVmYXVsdENhbGxiYWNrKGwsbyl9LHUucHJvdG90eXBlLl9mb3JtYXRDYWxsRXJyb3I9ZnVuY3Rpb24oZSl7Y29uc3Qgbj17dHlwZTplLmNvZGUsbWVzc2FnZTplLm1lc3NhZ2Usc3RhY2s6W10scmV0cnlTdGF0dXM6ZS5yZXRyeVN0YXR1c3x8dC5SZXRyeVN0YXR1cy5OT05FLC4uLmUuc3RhdHVzQ29kZSYme3N0YXR1c0NvZGU6ZS5zdGF0dXNDb2RlfX07aWYoZS5zdGFjayl0cnl7QXJyYXkuaXNBcnJheShlLnN0YWNrKT9uLnN0YWNrPWUuc3RhY2s6Im9iamVjdCI9PXR5cGVvZiBlLnN0YWNrP24uc3RhY2s9W0pTT04uc3RyaW5naWZ5KGUuc3RhY2spXToic3RyaW5nIj09dHlwZW9mIGUuc3RhY2smJihuLnN0YWNrPWUuc3RhY2suc3BsaXQoIlxuIikpfWZpbmFsbHl7fXJldHVybiBufSx1LnByb3RvdHlwZS5fYWRkU3RhdHVzQ29kZVRvRXJyb3I9ZnVuY3Rpb24oZSl7aWYoZS5zdGF0dXNDb2RlKXJldHVybiBlO2NvbnN0IG49ey4uLmV9O2lmKGUuY29kZSlzd2l0Y2gobi5jb2RlKXtjYXNlIHQuQ1RJRXhjZXB0aW9ucy5VTkFVVEhPUklaRURfRVhDRVBUSU9OOm4uc3RhdHVzQ29kZT00MDE7YnJlYWs7Y2FzZSB0LkNUSUV4Y2VwdGlvbnMuQUNDRVNTX0RFTklFRF9FWENFUFRJT046bi5zdGF0dXNDb2RlPTQwM31lbHNlIG4uc3RhdHVzQ29kZT00MDA7cmV0dXJuIG59LHUucHJvdG90eXBlLl9yZXF1aXJlc0F1dGhlbnRpY2F0aW9uUGFyYW09ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT10LkNsaWVudE1ldGhvZHMuQ09NUExFVEVfQ09OVEFDVCYmZSE9PXQuQ2xpZW50TWV0aG9kcy5DTEVBUl9DT05UQUNUJiZlIT09dC5DbGllbnRNZXRob2RzLlJFSkVDVF9DT05UQUNUJiZlIT09dC5DbGllbnRNZXRob2RzLkNSRUFURV9UQVNLX0NPTlRBQ1QmJmUhPT10LkNsaWVudE1ldGhvZHMuVVBEQVRFX01PTklUT1JfUEFSVElDSVBBTlRfU1RBVEV9LHUucHJvdG90eXBlLl90cmFuc2xhdGVQYXJhbXM9ZnVuY3Rpb24oZSxuKXtzd2l0Y2goZSl7Y2FzZSB0LkNsaWVudE1ldGhvZHMuVVBEQVRFX0FHRU5UX0NPTkZJR1VSQVRJT046bi5jb25maWd1cmF0aW9uPXRoaXMuX3RyYW5zbGF0ZUFnZW50Q29uZmlndXJhdGlvbihuLmNvbmZpZ3VyYXRpb24pO2JyZWFrO2Nhc2UgdC5DbGllbnRNZXRob2RzLlNFTkRfU09GVFBIT05FX0NBTExfTUVUUklDUzpuLnNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3M9dGhpcy5fdHJhbnNsYXRlU29mdHBob25lU3RyZWFtU3RhdGlzdGljcyhuLnNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3MpO2JyZWFrO2Nhc2UgdC5DbGllbnRNZXRob2RzLlNFTkRfU09GVFBIT05FX0NBTExfUkVQT1JUOm4ucmVwb3J0PXRoaXMuX3RyYW5zbGF0ZVNvZnRwaG9uZUNhbGxSZXBvcnQobi5yZXBvcnQpfXJldHVybiB0aGlzLl9yZXF1aXJlc0F1dGhlbnRpY2F0aW9uUGFyYW0oZSkmJihuLmF1dGhlbnRpY2F0aW9uPXthdXRoVG9rZW46dGhpcy5hdXRoVG9rZW59KSxufSx1LnByb3RvdHlwZS5fdHJhbnNsYXRlQWdlbnRDb25maWd1cmF0aW9uPWZ1bmN0aW9uKGUpe3JldHVybntuYW1lOmUubmFtZSxzb2Z0cGhvbmVFbmFibGVkOmUuc29mdHBob25lRW5hYmxlZCxzb2Z0cGhvbmVBdXRvQWNjZXB0OmUuc29mdHBob25lQXV0b0FjY2VwdCxleHRlbnNpb246ZS5leHRlbnNpb24scm91dGluZ1Byb2ZpbGU6dGhpcy5fdHJhbnNsYXRlUm91dGluZ1Byb2ZpbGUoZS5yb3V0aW5nUHJvZmlsZSksYWdlbnRQcmVmZXJlbmNlczplLmFnZW50UHJlZmVyZW5jZXN9fSx1LnByb3RvdHlwZS5fdHJhbnNsYXRlUm91dGluZ1Byb2ZpbGU9ZnVuY3Rpb24oZSl7cmV0dXJue25hbWU6ZS5uYW1lLHJvdXRpbmdQcm9maWxlQVJOOmUucm91dGluZ1Byb2ZpbGVBUk4sZGVmYXVsdE91dGJvdW5kUXVldWU6dGhpcy5fdHJhbnNsYXRlUXVldWUoZS5kZWZhdWx0T3V0Ym91bmRRdWV1ZSl9fSx1LnByb3RvdHlwZS5fdHJhbnNsYXRlUXVldWU9ZnVuY3Rpb24oZSl7cmV0dXJue3F1ZXVlQVJOOmUucXVldWVBUk4sbmFtZTplLm5hbWV9fSx1LnByb3RvdHlwZS5fdHJhbnNsYXRlU29mdHBob25lU3RyZWFtU3RhdGlzdGljcz1mdW5jdGlvbihlKXtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXsicGFja2V0c0NvdW50ImluIGUmJihlLnBhY2tldENvdW50PWUucGFja2V0c0NvdW50LGRlbGV0ZSBlLnBhY2tldHNDb3VudCl9KSksZX0sdS5wcm90b3R5cGUuX3RyYW5zbGF0ZVNvZnRwaG9uZUNhbGxSZXBvcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuImhhbmRzaGFraW5nVGltZU1pbGxpcyJpbiBlJiYoZS5oYW5kc2hha2VUaW1lTWlsbGlzPWUuaGFuZHNoYWtpbmdUaW1lTWlsbGlzLGRlbGV0ZSBlLmhhbmRzaGFraW5nVGltZU1pbGxpcyksInByZVRhbGtpbmdUaW1lTWlsbGlzImluIGUmJihlLnByZVRhbGtUaW1lTWlsbGlzPWUucHJlVGFsa2luZ1RpbWVNaWxsaXMsZGVsZXRlIGUucHJlVGFsa2luZ1RpbWVNaWxsaXMpLCJoYW5kc2hha2luZ0ZhaWx1cmUiaW4gZSYmKGUuaGFuZHNoYWtlRmFpbHVyZT1lLmhhbmRzaGFraW5nRmFpbHVyZSxkZWxldGUgZS5oYW5kc2hha2luZ0ZhaWx1cmUpLCJ0YWxraW5nVGltZU1pbGxpcyJpbiBlJiYoZS50YWxrVGltZU1pbGxpcz1lLnRhbGtpbmdUaW1lTWlsbGlzLGRlbGV0ZSBlLnRhbGtpbmdUaW1lTWlsbGlzKSxlLnNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3M9dGhpcy5fdHJhbnNsYXRlU29mdHBob25lU3RyZWFtU3RhdGlzdGljcyhlLnNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3MpLGV9O3ZhciBsPWZ1bmN0aW9uKGUpe2lmKHQuYXNzZXJ0Tm90TnVsbChlLCJlbmRwb2ludCIpLG4uY2FsbCh0aGlzKSxlLmluY2x1ZGVzKCIvdGFzay10ZW1wbGF0ZXMiKSl0aGlzLmVuZHBvaW50VXJsPXQuZ2V0VXJsV2l0aFByb3RvY29sKGUpO2Vsc2V7dmFyIHI9bmV3IEFXUy5FbmRwb2ludChlKSxvPWUuaW5jbHVkZXMoIi5hd3NhcHBzLmNvbSIpPyIvY29ubmVjdCI6IiI7dGhpcy5lbmRwb2ludFVybD10LmdldFVybFdpdGhQcm90b2NvbChgJHtyLmhvc3R9JHtvfS90YXNrLXRlbXBsYXRlcy9hcGkvY2NwYCl9fTsobC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWwsbC5wcm90b3R5cGUuX2NhbGxJbXBsPWZ1bmN0aW9uKGUsbixyKXtuJiZuLnJlbGF0ZWRDb250YWN0SWQmJm51bGwhPT1uLnJlbGF0ZWRDb250YWN0SWQmJm4ucHJldmlvdXNDb250YWN0SWQmJmRlbGV0ZSBuLnByZXZpb3VzQ29udGFjdElkLHQuYXNzZXJ0Tm90TnVsbChlLCJtZXRob2QiKSx0LmFzc2VydE5vdE51bGwobiwicGFyYW1zIik7dmFyIG89e2NyZWRlbnRpYWxzOiJpbmNsdWRlIixtZXRob2Q6IkdFVCIsaGVhZGVyczp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uIiwiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiIsIngtY3NyZi10b2tlbiI6ImNzcmYifX0saT1uLmluc3RhbmNlSWQscz10aGlzLmVuZHBvaW50VXJsLGE9dC5UYXNrVGVtcGxhdGVzQ2xpZW50TWV0aG9kcztzd2l0Y2goZSl7Y2FzZSBhLkxJU1RfVEFTS19URU1QTEFURVM6aWYocys9YC9wcm94eS9pbnN0YW5jZS8ke2l9L3Rhc2svdGVtcGxhdGVgLG4ucXVlcnlQYXJhbXMpe2NvbnN0IGU9bmV3IFVSTFNlYXJjaFBhcmFtcyhuLnF1ZXJ5UGFyYW1zKS50b1N0cmluZygpO2UmJihzKz1gPyR7ZX1gKX1icmVhaztjYXNlIGEuR0VUX1RBU0tfVEVNUExBVEU6dC5hc3NlcnROb3ROdWxsKG4udGVtcGxhdGVQYXJhbXMsInBhcmFtcy50ZW1wbGF0ZVBhcmFtcyIpO2NvbnN0IHI9dC5hc3NlcnROb3ROdWxsKG4udGVtcGxhdGVQYXJhbXMuaWQsInBhcmFtcy50ZW1wbGF0ZVBhcmFtcy5pZCIpLGM9bi50ZW1wbGF0ZVBhcmFtcy52ZXJzaW9uO3MrPWAvcHJveHkvaW5zdGFuY2UvJHtpfS90YXNrL3RlbXBsYXRlLyR7cn1gLGMmJihzKz1gP3NuYXBzaG90VmVyc2lvbj0ke2N9YCk7YnJlYWs7Y2FzZSBhLkNSRUFURV9URU1QTEFURURfVEFTSzpzKz1gLyR7ZX1gLG8uYm9keT1KU09OLnN0cmluZ2lmeShuKSxvLm1ldGhvZD0iUFVUIjticmVhaztjYXNlIGEuVVBEQVRFX0NPTlRBQ1Q6cys9YC8ke2V9YCxvLmJvZHk9SlNPTi5zdHJpbmdpZnkobiksby5tZXRob2Q9IlBPU1QifXQuZmV0Y2gocyxvKS50aGVuKChmdW5jdGlvbihlKXtyLnN1Y2Nlc3MoZSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe2NvbnN0IHQ9ZS5ib2R5LmdldFJlYWRlcigpO2xldCBuPSIiO2NvbnN0IG89bmV3IFRleHREZWNvZGVyO3QucmVhZCgpLnRoZW4oKGZ1bmN0aW9uIGkoe2RvbmU6cyx2YWx1ZTphfSl7aWYocyl7dmFyIGM9SlNPTi5wYXJzZShuKTtyZXR1cm4gYy5zdGF0dXM9ZS5zdGF0dXMsdm9pZCByLmZhaWx1cmUoYyl9cmV0dXJuIG4rPW8uZGVjb2RlKGEpLHQucmVhZCgpLnRoZW4oaSl9KSl9KSl9LHQuQ2xpZW50QmFzZT1uLHQuTnVsbENsaWVudD1yLHQuVXBzdHJlYW1Db25kdWl0Q2xpZW50PWksdC5BcGlQcm94eUNsaWVudD1zLHQuVXBzdHJlYW1Db25kdWl0TWFzdGVyQ2xpZW50PWEsdC5BV1NDbGllbnQ9dSx0LkFnZW50QXBwQ2xpZW50PWMsdC5UYXNrVGVtcGxhdGVzQ2xpZW50PWx9KCl9LDg5NTooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10LHQuY29yZT17fSx0LmNvcmUuaW5pdGlhbGl6ZWQ9ITEsdC52ZXJzaW9uPSIyLjEzLjMiLHQub3V0ZXJDb250ZXh0U3RyZWFtc1ZlcnNpb249bnVsbCx0LkRFRkFVTFRfQkFUQ0hfU0laRT01MDA7dmFyIG49IkFtYXpvbiBDb25uZWN0IENDUCIscj0iaHR0cHM6Ly97YWxpYXN9LmF3c2FwcHMuY29tL2F1dGgvP2NsaWVudF9pZD17Y2xpZW50X2lkfSZyZWRpcmVjdF91cmk9e3JlZGlyZWN0fSIsbz0iMDY5MTlmNGZkOGVkMzI0ZSIsaT0iL2F1dGgvYXV0aG9yaXplIixzPSIvY29ubmVjdC9hdXRoL2F1dGhvcml6ZSIsYT0iSWZyYW1lUmVmcmVzaEF0dGVtcHRzIixjPSJJZnJhbWVSZWZyZXNoQXR0ZW1wdHNEciIsdT0iSWZyYW1lSW5pdGlhbGl6YXRpb25TdWNjZXNzIixsPSJJZnJhbWVJbml0aWFsaXphdGlvblN1Y2Nlc3NEciI7Y29uc3QgcD17IjAtMTAwIjpbMCwxMDBdLCIxMDEtNTAwIjpbMTAxLDUwMF0sIjUwMS0xMDAwIjpbNTAxLDFlM10sIjEwMDAtMzAwMCI6WzEwMDEsM2UzXSwiMzAwMS01MDAwIjpbMzAwMSw1ZTNdLCI1MDAxLTEwMDAwIjpbNTAwMSwxZTRdLCIxMDAwMS0yMDAwMCI6WzEwMDAxLDJlNF0sIjIwMDAwKyI6WzIwMDAxLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXX07dC5udW1iZXJPZkNvbm5lY3RlZENDUHM9MCx0Lm51bWJlck9mQ29ubmVjdGVkQ0NQc0luVGhpc1RhYj0wLHQuY29yZS5NQVhfQVVUSE9SSVpFX1JFVFJZX0NPVU5UX0ZPUl9TRVNTSU9OPTMsdC5jb3JlLk1BWF9DVElfQVVUSF9SRVRSWV9DT1VOVD0xMCx0LmNvcmUuY3RpQXV0aFJldHJ5Q291bnQ9MCx0LmNvcmUuYXV0aG9yaXplVGltZW91dElkPW51bGwsdC5jb3JlLmN0aVRpbWVvdXRJZD1udWxsLHQuY29yZS5NQVhfVU5BVVRIT1JJWkVEX1JFVFJZX0NPVU5UPTIwLHQuY29yZS5NQVhfQUNDRVNTX0RFTklFRF9SRVRSWV9DT1VOVD0xMCx0LlNlc3Npb25TdG9yYWdlS2V5cz10Lm1ha2VFbnVtKFsidGFiX2lkIiwiYXV0aG9yaXplX3JldHJ5X2NvdW50Il0pO2NsYXNzIGR7Y29uc3RydWN0b3IodCl7dGhpcy5rZXk9YCR7dH1QYXJhbXNTdG9yYWdlOjoke2UubG9jYXRpb24ub3JpZ2lufWB9Z2V0KCl7dHJ5e2NvbnN0IHQ9ZS5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmtleSk7cmV0dXJuIHQmJkpTT04ucGFyc2UodCl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcihgJHt0aGlzLmtleX06OiBGYWlsZWQgdG8gZ2V0IHNvZnRwaG9uZSBwYXJhbXMgZnJvbSBsb2NhbCBzdG9yYWdlIWApLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1yZXR1cm4gbnVsbH1zZXQobil7dHJ5e24mJmUubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5rZXksSlNPTi5zdHJpbmdpZnkobikpfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoYCR7dGhpcy5rZXl9OjogRmFpbGVkIHRvIHNldCBzb2Z0cGhvbmUgcGFyYW1zIHRvIGxvY2FsIHN0b3JhZ2UhYCkud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX1jbGVhbigpe2UubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5rZXkpfX1jb25zdCBoPW5ldyBjbGFzcyBleHRlbmRzIGR7Y29uc3RydWN0b3IoKXtzdXBlcigiU29mdHBob25lIil9fSxmPW5ldyBjbGFzcyBleHRlbmRzIGR7Y29uc3RydWN0b3IoKXtzdXBlcigiUmluZ3RvbmUiKX19O2Z1bmN0aW9uIGcoZSl7dmFyIHQ9ZS5tYXRjaCgvXig/Omh0dHBzPzpcL1wvKT8oPzpbXkBcbl0rQCk/KD86d3d3XC4pPyhbXjpcL1xuP10rKS9naSk7cmV0dXJuIHQubGVuZ3RoP3RbMF06IiJ9dC5jb3JlLmNoZWNrTm90SW5pdGlhbGl6ZWQ9ZnVuY3Rpb24oKXt0LmNvcmUuaW5pdGlhbGl6ZWQmJnQuZ2V0TG9nKCkud2FybigiQ29ubmVjdCBjb3JlIGFscmVhZHkgaW5pdGlhbGl6ZWQsIG9ubHkgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgb25jZS4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfTt2YXIgbT1mdW5jdGlvbihlLG4pe3ZhciByPWUuZ2V0QWdlbnRTdGF0ZXMoKS5maW5kKChmdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT09dC5BZ2VudFN0YXRlVHlwZS5PRkZMSU5FfSkpO2Uuc2V0U3RhdGUocixuKX0sdj1mdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gU2lnbmFsIHNoYXJlZHdvcmtlciB0byBzZXQgY29udGFjdHMgc3VwcHJlc3NvciB0byAlcyBmb3IgaW5zdGFuY2UgJXMuIixlLHQuY29yZS5yZWdpb24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5TVVBQUkVTUyx7c3VwcHJlc3M6ZSxzaG91bGRTZW5kRmFpbG92ZXJEb3duc3RyZWFtOiExfSl9LHk9ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmluZm8oIltESVNBU1RFUiBSRUNPVkVSWV0gU2lnbmFsIHNoYXJlZHdvcmtlciB0byBzZXQgZm9yY2VPZmZsaW5lIHRvICVzIGZvciBpbnN0YW5jZSAlcy4iLGUsdC5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZPUkNFX09GRkxJTkUse29mZmxpbmU6ZSxuZXh0QWN0aXZlQXJuOm59KX0sRT1mdW5jdGlvbihlLG4pe3ZhciByPXQuZ2V0TG9nKCk7Y29uc3Qgbz10LmFnZW50LmluaXRpYWxpemVkP3QuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEluc3RhbmNlSWQoKTp0LmNvcmUucmVnaW9uO3IuaW5mbyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBBdHRlbXB0aW5nIHRvIGZvcmNlIGluc3RhbmNlICR7b30gb2ZmbGluZSB1c2luZyAke2U/InNvZnQiOiJoYXJkIn0gZmFpbG92ZXJgKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuYWdlbnQoKGZ1bmN0aW9uKG8pe3ZhciBpPTAscz1vLmdldENvbnRhY3RzKCksYT0hMTtpZihzLmxlbmd0aClmb3IobGV0IGMgb2Ygcyl7aWYoYSlicmVhazshZXx8Yy5nZXRUeXBlKCkhPT10LkNvbnRhY3RUeXBlLlFVRVVFX0NBTExCQUNLJiZjLmdldFR5cGUoKSE9dC5Db250YWN0VHlwZS5WT0lDRT9jLmdldEFnZW50Q29ubmVjdGlvbigpLmRlc3Ryb3koe3N1Y2Nlc3M6ZnVuY3Rpb24oKXsrK2k9PT1zLmxlbmd0aCYmKHkoITEsbiksbShvKSxyLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gSW5zdGFuY2UgJXMgaXMgbm93IG9mZmxpbmUiLHQuY29yZS5yZWdpb24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3Iud2FybigiW0Rpc2FzdGVyIFJlY292ZXJ5XSBBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZm9yY2UgdGhpcyBpbnN0YW5jZSB0byBvZmZsaW5lIGluIHJlZ2lvbiAlcyIsdC5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyLndhcm4oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx5KCEwLG4pLGE9ITB9fSk6KHIuaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBXaWxsIHdhaXQgdG8gY29tcGxldGUgZmFpbG92ZXIgb2YgaW5zdGFuY2UgJXMgdW50aWwgdm9pY2UgY29udGFjdCB3aXRoIElEICVzIGlzIGRlc3Ryb3llZCIsdC5jb3JlLnJlZ2lvbixjLmdldENvbnRhY3RJZCgpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmREb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5GQUlMT1ZFUl9QRU5ESU5HLHtuZXh0QWN0aXZlQXJuOm59KSxjLm9uRGVzdHJveSgoZnVuY3Rpb24oZSl7ci5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIFZvaWNlIGNvbnRhY3Qgd2l0aCBJRCAlcyBkZXN0cm95ZWQsIGNvbnRpbnVpbmcgd2l0aCBmYWlsb3ZlciBpbiBpbnN0YW5jZSAlcyIsZS5nZXRDb250YWN0SWQoKSx0LmNvcmUucmVnaW9uKSxFKCEwLG4pfSkpKX1lbHNlIHkoITEsbiksbShvKSxyLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gSW5zdGFuY2UgJXMgaXMgbm93IG9mZmxpbmUiLHQuY29yZS5yZWdpb24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSl9O3QuY29yZS5pbml0RGlzYXN0ZXJSZWNvdmVyeT1mdW5jdGlvbihlLG4scil7dmFyIG89dC5nZXRMb2coKTt0LmNvcmUucmVnaW9uPWUucmVnaW9uLHQuY29yZS5zdXBwcmVzc0NvbnRhY3RzPW58fHYsdC5jb3JlLmZvcmNlT2ZmbGluZT1yfHxFLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuU0VUX09GRkxJTkUsKGZ1bmN0aW9uKGUpe3QuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuRkFJTE9WRVIsKGZ1bmN0aW9uKCl7dC5jb3JlLmZvcmNlT2ZmbGluZShlJiZlLnNvZnRGYWlsb3Zlcil9KSl9KSksdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRk9SQ0VfT0ZGTElORSwoZnVuY3Rpb24oZSl7dC5pZk1hc3Rlcih0Lk1hc3RlclRvcGljcy5GQUlMT1ZFUiwoZnVuY3Rpb24oKXt0LmNvcmUuZm9yY2VPZmZsaW5lKGUmJmUuc29mdEZhaWxvdmVyLGUmJmUubmV4dEFjdGl2ZUFybil9KSl9KSksdC5pZk1hc3Rlcih0Lk1hc3RlclRvcGljcy5GQUlMT1ZFUiwoZnVuY3Rpb24oKXtvLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gSW5pdGlhbGl6aW5nIHJlZ2lvbiAlcyBhcyBwYXJ0IG9mIGEgRGlzYXN0ZXIgUmVjb3ZlcnkgZmxlZXQiLHQuY29yZS5yZWdpb24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSwoZnVuY3Rpb24oKXtvLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gJXMgYWxyZWFkeSBwYXJ0IG9mIGEgRGlzYXN0ZXIgUmVjb3ZlcnkgZmxlZXQiLHQuY29yZS5yZWdpb24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSksZS5wb2xsRm9yRmFpbG92ZXImJnQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5JTklUX0RSX1BPTExJTkc/dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5JTklUX0RSX1BPTExJTkcse2luc3RhbmNlQXJuOmUuaW5zdGFuY2VBcm4sb3RoZXJBcm46ZS5vdGhlckFybixhdXRoVG9rZW46ZS5hdXRoVG9rZW59KTplLmlzUHJpbWFyeT8odC5jb3JlLnN1cHByZXNzQ29udGFjdHMoITEpLG8uaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSAlcyBpbnN0YW5jZSBpcyBzZXQgdG8gcHJpbWFyeSIsdC5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSk6KHQuY29yZS5zdXBwcmVzc0NvbnRhY3RzKCEwKSx0LmNvcmUuZm9yY2VPZmZsaW5lKCksby5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldICVzIGluc3RhbmNlIGlzIHNldCB0byBzdGFuZC1ieSIsdC5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9LHQuY29yZS5pbml0PWZ1bmN0aW9uKGUpe3QuY29yZS5ldmVudEJ1cz1uZXcgdC5FdmVudEJ1cyx0LmNvcmUuYWdlbnREYXRhUHJvdmlkZXI9bmV3IEkodC5jb3JlLmdldEV2ZW50QnVzKCkpLHQuY29yZS5pbml0Q2xpZW50KGUpLHQuY29yZS5pbml0QWdlbnRBcHBDbGllbnQoZSksdC5jb3JlLmluaXRUYXNrVGVtcGxhdGVzQ2xpZW50KGUpLHQuY29yZS5pbml0aWFsaXplZD0hMH0sdC5jb3JlLmluaXRDbGllbnQ9ZnVuY3Rpb24oZSl7dC5hc3NlcnROb3ROdWxsKGUsInBhcmFtcyIpO3ZhciBuPXQuYXNzZXJ0Tm90TnVsbChlLmF1dGhUb2tlbiwicGFyYW1zLmF1dGhUb2tlbiIpLHI9dC5hc3NlcnROb3ROdWxsKGUucmVnaW9uLCJwYXJhbXMucmVnaW9uIiksbz1lLmVuZHBvaW50fHxudWxsO3QuY29yZS5jbGllbnQ9bmV3IHQuQVdTQ2xpZW50KG4scixvKX0sdC5jb3JlLmluaXRBZ2VudEFwcENsaWVudD1mdW5jdGlvbihlKXt0LmFzc2VydE5vdE51bGwoZSwicGFyYW1zIik7dmFyIG49dC5hc3NlcnROb3ROdWxsKGUuYXV0aFRva2VuLCJwYXJhbXMuYXV0aFRva2VuIikscj10LmFzc2VydE5vdE51bGwoZS5hdXRoQ29va2llTmFtZSwicGFyYW1zLmF1dGhDb29raWVOYW1lIiksbz10LmFzc2VydE5vdE51bGwoZS5hZ2VudEFwcEVuZHBvaW50LCJwYXJhbXMuYWdlbnRBcHBFbmRwb2ludCIpO3QuY29yZS5hZ2VudEFwcENsaWVudD1uZXcgdC5BZ2VudEFwcENsaWVudChyLG4sbyl9LHQuY29yZS5pbml0VGFza1RlbXBsYXRlc0NsaWVudD1mdW5jdGlvbihlKXt0LmFzc2VydE5vdE51bGwoZSwicGFyYW1zIik7dmFyIG49ZS50YXNrVGVtcGxhdGVzRW5kcG9pbnR8fGUuZW5kcG9pbnQ7dC5hc3NlcnROb3ROdWxsKG4sInRhc2tUZW1wbGF0ZXNFbmRwb2ludCIpLHQuY29yZS50YXNrVGVtcGxhdGVzQ2xpZW50PW5ldyB0LlRhc2tUZW1wbGF0ZXNDbGllbnQobil9LHQuY29yZS50ZXJtaW5hdGU9ZnVuY3Rpb24oKXt0LmNvcmUuY2xpZW50PW5ldyB0Lk51bGxDbGllbnQsdC5jb3JlLmFwaVByb3h5Q2xpZW50PW5ldyB0Lk51bGxDbGllbnQsdC5jb3JlLmFnZW50QXBwQ2xpZW50PW5ldyB0Lk51bGxDbGllbnQsdC5jb3JlLnRhc2tUZW1wbGF0ZXNDbGllbnQ9bmV3IHQuTnVsbENsaWVudCx0LmNvcmUubWFzdGVyQ2xpZW50PW5ldyB0Lk51bGxDbGllbnQ7dmFyIGU9dC5jb3JlLmdldEV2ZW50QnVzKCk7ZSYmZS51bnN1YnNjcmliZUFsbCgpLHQuY29yZS5idXM9bmV3IHQuRXZlbnRCdXMsdC5jb3JlLmFnZW50RGF0YVByb3ZpZGVyPW51bGwsdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXI9bnVsbCx0LmNvcmUudXBzdHJlYW09bnVsbCx0LmNvcmUua2VlcGFsaXZlTWFuYWdlcj1udWxsLHQuc3RvcmFnZUFjY2Vzcy5yZXNldFN0b3JhZ2VBY2Nlc3NTdGF0ZSgpLHQuYWdlbnQuaW5pdGlhbGl6ZWQ9ITEsdC5jb3JlLmluaXRpYWxpemVkPSExfSx0LmNvcmUuc29mdHBob25lVXNlck1lZGlhU3RyZWFtPW51bGwsdC5jb3JlLnNldFNvZnRwaG9uZVVzZXJNZWRpYVN0cmVhbT1mdW5jdGlvbihlKXt0LmNvcmUuc29mdHBob25lVXNlck1lZGlhU3RyZWFtPWV9LHQuY29yZS5pbml0UmluZ3RvbmVFbmdpbmVzPWZ1bmN0aW9uKG4scil7dC5nZXRMb2coKS5pbmZvKCJbUmluZ3RvbmUgRW5naW5lXSBpbml0UmluZ3RvbmVFbmdpbmUgc3RhcnRlZCIpLndpdGhPYmplY3Qoe3BhcmFtczpufSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmFzc2VydE5vdE51bGwobiwicGFyYW1zIik7Y29uc3Qgbz1yfHxiO3ZhciBpPWZ1bmN0aW9uKGUpe3QuYXNzZXJ0Tm90TnVsbChlLCJyaW5ndG9uZVNldHRpbmdzIiksdC5hc3NlcnROb3ROdWxsKGUudm9pY2UsInJpbmd0b25lU2V0dGluZ3Mudm9pY2UiKSx0LmFzc2VydFRydWUoZS52b2ljZS5yaW5ndG9uZVVybHx8ZS52b2ljZS5kaXNhYmxlZCwicmluZ3RvbmVTZXR0aW5ncy52b2ljZS5yaW5ndG9uZVVybCBtdXN0IGJlIHByb3ZpZGVkIG9yIHJpbmd0b25lU2V0dGluZ3Mudm9pY2UuZGlzYWJsZWQgbXVzdCBiZSB0cnVlIiksdC5hc3NlcnROb3ROdWxsKGUucXVldWVfY2FsbGJhY2ssInJpbmd0b25lU2V0dGluZ3MucXVldWVfY2FsbGJhY2siKSx0LmFzc2VydFRydWUoZS5xdWV1ZV9jYWxsYmFjay5yaW5ndG9uZVVybHx8ZS5xdWV1ZV9jYWxsYmFjay5kaXNhYmxlZCwicmluZ3RvbmVTZXR0aW5ncy52b2ljZS5yaW5ndG9uZVVybCBtdXN0IGJlIHByb3ZpZGVkIG9yIHJpbmd0b25lU2V0dGluZ3MucXVldWVfY2FsbGJhY2suZGlzYWJsZWQgbXVzdCBiZSB0cnVlIiksdC5jb3JlLnJpbmd0b25lRW5naW5lcz17fSx0LmFnZW50KChmdW5jdGlvbihuKXtuLm9uUmVmcmVzaCgoZnVuY3Rpb24oKXt0LmlmTWFzdGVyKHQuTWFzdGVyVG9waWNzLlJJTkdUT05FLChmdW5jdGlvbigpe2xldCBuPSExO2Uudm9pY2UuZGlzYWJsZWR8fHQuY29yZS5yaW5ndG9uZUVuZ2luZXMudm9pY2V8fCh0LmNvcmUucmluZ3RvbmVFbmdpbmVzLnZvaWNlPW5ldyB0LlZvaWNlUmluZ3RvbmVFbmdpbmUoZS52b2ljZSksbj0hMCx0LmdldExvZygpLmluZm8oIlZvaWNlUmluZ3RvbmVFbmdpbmUgaW5pdGlhbGl6ZWQuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSksZS5jaGF0LmRpc2FibGVkfHx0LmNvcmUucmluZ3RvbmVFbmdpbmVzLmNoYXR8fCh0LmNvcmUucmluZ3RvbmVFbmdpbmVzLmNoYXQ9bmV3IHQuQ2hhdFJpbmd0b25lRW5naW5lKGUuY2hhdCksbj0hMCx0LmdldExvZygpLmluZm8oIkNoYXRSaW5ndG9uZUVuZ2luZSBpbml0aWFsaXplZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKSxlLnRhc2suZGlzYWJsZWR8fHQuY29yZS5yaW5ndG9uZUVuZ2luZXMudGFza3x8KHQuY29yZS5yaW5ndG9uZUVuZ2luZXMudGFzaz1uZXcgdC5UYXNrUmluZ3RvbmVFbmdpbmUoZS50YXNrKSxuPSEwLHQuZ2V0TG9nKCkuaW5mbygiVGFza1Jpbmd0b25lRW5naW5lIGluaXRpYWxpemVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpLGUucXVldWVfY2FsbGJhY2suZGlzYWJsZWR8fHQuY29yZS5yaW5ndG9uZUVuZ2luZXMucXVldWVfY2FsbGJhY2t8fCh0LmNvcmUucmluZ3RvbmVFbmdpbmVzLnF1ZXVlX2NhbGxiYWNrPW5ldyB0LlF1ZXVlQ2FsbGJhY2tSaW5ndG9uZUVuZ2luZShlLnF1ZXVlX2NhbGxiYWNrKSxuPSEwLHQuZ2V0TG9nKCkuaW5mbygiUXVldWVDYWxsYmFja1Jpbmd0b25lRW5naW5lIGluaXRpYWxpemVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpLG4mJnQuY29yZS5fcmluZ2VyRGV2aWNlSWQmJm8oe2RldmljZUlkOnQuY29yZS5fcmluZ2VyRGV2aWNlSWR9KX0pKX0pKX0pKSxTKCl9LHM9ZnVuY3Rpb24oZSxuKXtlLnJpbmd0b25lPWUucmluZ3RvbmV8fHt9LGUucmluZ3RvbmUudm9pY2U9ZS5yaW5ndG9uZS52b2ljZXx8e30sZS5yaW5ndG9uZS5xdWV1ZV9jYWxsYmFjaz1lLnJpbmd0b25lLnF1ZXVlX2NhbGxiYWNrfHx7fSxlLnJpbmd0b25lLmNoYXQ9ZS5yaW5ndG9uZS5jaGF0fHx7ZGlzYWJsZWQ6ITB9LGUucmluZ3RvbmUudGFzaz1lLnJpbmd0b25lLnRhc2t8fHtkaXNhYmxlZDohMH0sbi5zb2Z0cGhvbmUmJihuLnNvZnRwaG9uZS5kaXNhYmxlUmluZ3RvbmUmJihlLnJpbmd0b25lLnZvaWNlLmRpc2FibGVkPSEwLGUucmluZ3RvbmUucXVldWVfY2FsbGJhY2suZGlzYWJsZWQ9ITApLG4uc29mdHBob25lLnJpbmd0b25lVXJsJiYoZS5yaW5ndG9uZS52b2ljZS5yaW5ndG9uZVVybD1uLnNvZnRwaG9uZS5yaW5ndG9uZVVybCxlLnJpbmd0b25lLnF1ZXVlX2NhbGxiYWNrLnJpbmd0b25lVXJsPW4uc29mdHBob25lLnJpbmd0b25lVXJsKSksbi5jaGF0JiYobi5jaGF0LmRpc2FibGVSaW5ndG9uZSYmKGUucmluZ3RvbmUuY2hhdC5kaXNhYmxlZD0hMCksbi5jaGF0LnJpbmd0b25lVXJsJiYoZS5yaW5ndG9uZS5jaGF0LnJpbmd0b25lVXJsPW4uY2hhdC5yaW5ndG9uZVVybCkpLG4ucmluZ3RvbmUmJihlLnJpbmd0b25lLnZvaWNlPXQubWVyZ2UoZS5yaW5ndG9uZS52b2ljZSxuLnJpbmd0b25lLnZvaWNlfHx7fSksZS5yaW5ndG9uZS5xdWV1ZV9jYWxsYmFjaz10Lm1lcmdlKGUucmluZ3RvbmUucXVldWVfY2FsbGJhY2ssbi5yaW5ndG9uZS52b2ljZXx8e30pLGUucmluZ3RvbmUuY2hhdD10Lm1lcmdlKGUucmluZ3RvbmUuY2hhdCxuLnJpbmd0b25lLmNoYXR8fHt9KSl9O2lmKHMobixuKSx0LmlzRnJhbWVkKCkpe2xldCByO3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5DT05GSUdVUkUsKGZ1bmN0aW9uKG8pe2UuY2xlYXJUaW1lb3V0KHIpLHQuZ2V0TG9nKCkuaW5mbygiW1Jpbmd0b25lIEVuZ2luZV0gQ29uZmlndXJlIGV2ZW50IGhhbmRsZXIgZXhlY3V0ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHRoaXMudW5zdWJzY3JpYmUoKSxzKG4sbyksZi5zZXQobi5yaW5ndG9uZSksaShuLnJpbmd0b25lKX0pKTtjb25zdCBvPWYuZ2V0KCk7byYmdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSwoZnVuY3Rpb24obil7biYmbi5pZCYmKHQuZ2V0TG9nKCkuaW5mbygiW1Jpbmd0b25lRW5naW5lXSBFbWJlZGRlZCBDQ1AgaXMgcmVmcmVzaGVkIHN1Y2Nlc3NmdWxseSBhbmQgd2FpdGluZyBmb3IgY29uZmlndXJlIE1lc3NhZ2UgaGFuZGxlciB0byBleGVjdXRlIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0aGlzLnVuc3Vic2NyaWJlKCkscj1lLnNldFRpbWVvdXQoKCgpPT57dC5nZXRMb2coKS5pbmZvKCJbUmluZ3RvbmVFbmdpbmVdIEVtYmVkZGVkIENDUCBpcyByZWZyZXNoZWQgd2l0aG91dCBjb25maWd1cmUgbWVzc2FnZSAmIEluaXRpYWxpemluZyBzZXR1cFJpbmd0b25lRW5naW5lcyAoUmluZ3RvbmUgRW5naW5lKSBmcm9tIGxvY2FsU3RvcmFnZSByaW5ndG9uZSBwYXJhbXMuICIpLndpdGhPYmplY3Qoe3Jpbmd0b25lOm99KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkobyl9KSwxMDApKX0pKX1lbHNlIGkobi5yaW5ndG9uZSl9O3ZhciBTPWZ1bmN0aW9uKCl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQ29uZmlndXJhdGlvbkV2ZW50cy5TRVRfUklOR0VSX0RFVklDRSxiKX0sYj1mdW5jdGlvbihlPXt9KXtjb25zdCBuPWUuZGV2aWNlSWR8fCIiO2lmKHQuZ2V0TG9nKCkuaW5mbyhgW0F1ZGlvIERldmljZSBTZXR0aW5nc10gQXR0ZW1wdGluZyB0byBzZXQgcmluZ2VyIGRldmljZSAke259YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSwwPT09dC5rZXlzKHQuY29yZS5yaW5ndG9uZUVuZ2luZXMpLmxlbmd0aClyZXR1cm4gdC5nZXRMb2coKS5pbmZvKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBzZXRSaW5nZXJEZXZpY2UgY2FsbGVkIGJlZm9yZSByaW5ndG9uZSBlbmdpbmUgaXMgaW5pdGlhbGl6ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHZvaWQobiYmKHQuY29yZS5fcmluZ2VyRGV2aWNlSWQ9bix0LmdldExvZygpLndhcm4oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIHN0b3JlZCBkZXZpY2UgSWQgZm9yIGxhdGVyIHVzZSwgb25jZSByaW5ndG9uZSBlbmdpbmUgaXMgdXAuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6IlNldFJpbmdlckRldmljZUJlZm9yZUluaXRSaW5ndG9uZUVuZ2luZSIsZGF0YTp7Y291bnQ6MX19KSkpO2lmKG4pe2ZvcihsZXQgZSBpbiB0LmNvcmUucmluZ3RvbmVFbmdpbmVzKXQuY29yZS5yaW5ndG9uZUVuZ2luZXNbZV0uc2V0T3V0cHV0RGV2aWNlKG4pLnRoZW4oKGZ1bmN0aW9uKG4pe3QuZ2V0TG9nKCkuaW5mbyhgW0F1ZGlvIERldmljZSBTZXR0aW5nc10gcmluZ3RvbmVUeXBlICR7ZX0gc3VjY2Vzc2Z1bGx5IHNldCB0byBkZXZpY2VpZCAke259YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcihlKX0pKTt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuUklOR0VSX0RFVklDRV9DSEFOR0VELGRhdGE6e2RldmljZUlkOm59fSl9ZWxzZSB0LmdldExvZygpLndhcm4oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIFNldHRpbmcgcmluZ2VyIGRldmljZSBjYW5jZWxsZWQgZHVlIHRvIG1pc3NpbmcgZGV2aWNlSWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfTt0LmNvcmUuaW5pdFNvZnRwaG9uZU1hbmFnZXI9ZnVuY3Rpb24obil7dmFyIHI9bnx8e307dC5nZXRMb2coKS5pbmZvKCJbU29mdHBob25lIE1hbmFnZXJdIGluaXRTb2Z0cGhvbmVNYW5hZ2VyIHN0YXJ0ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBvPWZ1bmN0aW9uKGUpe3ZhciBuPXQubWVyZ2Uoci5zb2Z0cGhvbmV8fHt9LGUpO3QuZ2V0TG9nKCkuaW5mbygiW1NvZnRwaG9uZSBNYW5hZ2VyXSBjb21wZXRlRm9yTWFzdGVyT25BZ2VudFVwZGF0ZSBleGVjdXRlZCIpLndpdGhPYmplY3Qoe3NvZnRwaG9uZVBhcmFtczpufSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmFnZW50KChmdW5jdGlvbihlKXtlLmdldENoYW5uZWxDb25jdXJyZW5jeSh0LkNoYW5uZWxUeXBlLlZPSUNFKSYmZS5vblJlZnJlc2goKGZ1bmN0aW9uKCl7dmFyIHI9dGhpczt0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gYWdlbnQgcmVmcmVzaCBoYW5kbGVyIGV4ZWN1dGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmlmTWFzdGVyKHQuTWFzdGVyVG9waWNzLlNPRlRQSE9ORSwoZnVuY3Rpb24oKXt0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gY29uZmlybWVkIGFzIHNvZnRwaG9uZSBtYXN0ZXIgdG9waWMiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLCF0LmNvcmUuc29mdHBob25lTWFuYWdlciYmZS5pc1NvZnRwaG9uZUVuYWJsZWQoKSYmKHQuYmVjb21lTWFzdGVyKHQuTWFzdGVyVG9waWNzLlNFTkRfTE9HUyksdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXI9bmV3IHQuU29mdHBob25lTWFuYWdlcihuKSxyLnVuc3Vic2NyaWJlKCkpfSkpfSkpfSkpfTtpZih0LmlzRnJhbWVkKCkmJnQuaXNDQ1AoKSl7bGV0IG47dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLkNPTkZJR1VSRSwoZnVuY3Rpb24ocil7ZS5jbGVhclRpbWVvdXQobiksdC5nZXRMb2coKS5pbmZvKCJbU29mdHBob25lIE1hbmFnZXJdIENvbmZpZ3VyZSBldmVudCBoYW5kbGVyIGV4ZWN1dGVkIikud2l0aE9iamVjdCh7ZGF0YTpyfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxoLnNldChyLnNvZnRwaG9uZSksci5zb2Z0cGhvbmUmJnIuc29mdHBob25lLmFsbG93RnJhbWVkU29mdHBob25lJiYodGhpcy51bnN1YnNjcmliZSgpLG8oci5zb2Z0cGhvbmUpKSxpKHIuc29mdHBob25lKX0pKTtsZXQgcj1oLmdldCgpO3ImJnQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuQUNLTk9XTEVER0UsKGZ1bmN0aW9uKHMpe3MmJnMuaWQmJih0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gRW1iZWRkZWQgQ0NQIGlzIHJlZnJlc2hlZCBzdWNjZXNzZnVsbHkgYW5kIHdhaXRpbmcgZm9yIGNvbmZpZ3VyZSBNZXNzYWdlIGhhbmRsZXIgdG8gZXhlY3V0ZSIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy51bnN1YnNjcmliZSgpLG49ZS5zZXRUaW1lb3V0KCgoKT0+e3QuZ2V0TG9nKCkuaW5mbygiW1NvZnRwaG9uZSBNYW5hZ2VyXSBFbWJlZGRlZCBDQ1AgaXMgcmVmcmVzaGVkIHdpdGhvdXQgY29uZmlndXJlIG1lc3NhZ2UgaGFuZGxlciBleGVjdXRpb24iKS53aXRoT2JqZWN0KHtzb2Z0cGhvbmVQYXJhbXNGcm9tTG9jYWxTdG9yYWdlOnJ9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQucHVibGlzaE1ldHJpYyh7bmFtZToiRW1iZWRkZWRDQ1BSZWZyZXNoZWRXaXRob3V0SW5pdENDUCIsZGF0YTp7Y291bnQ6MX19KSxpKHIpLHIuYWxsb3dGcmFtZWRTb2Z0cGhvbmUmJih0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gRW1iZWRkZWQgQ0NQIGlzIHJlZnJlc2hlZCAmIEluaXRpYWxpemluZyBjb21wZXRlRm9yTWFzdGVyT25BZ2VudFVwZGF0ZSAoU29mdHBob25lIG1hbmFnZXIpIGZyb20gbG9jYWxTdG9yYWdlIHNvZnRwaG9uZSBwYXJhbXMiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG8ocikpfSksMTAwKSl9KSl9ZWxzZSBvKHIpLGkocik7ZnVuY3Rpb24gaShlKXt2YXIgbj10Lm1lcmdlKHIuc29mdHBob25lfHx7fSxlKTt0LmNvcmUuc29mdHBob25lUGFyYW1zPW4sdC5pc0ZpcmVmb3hCcm93c2VyKCkmJih0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLk1BU1RFUl9SRVNQT05TRSwoZnVuY3Rpb24oZSl7ZS5kYXRhJiZlLmRhdGEudG9waWM9PT10Lk1hc3RlclRvcGljcy5TT0ZUUEhPTkUmJmUuZGF0YS50YWtlT3ZlciYmZS5kYXRhLm1hc3RlcklkIT09dC5jb3JlLnBvcnRTdHJlYW1JZCYmdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXImJih0LmNvcmUuc29mdHBob25lTWFuYWdlci5vbkluaXRDb250YWN0U3ViLnVuc3Vic2NyaWJlKCksZGVsZXRlIHQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyKX0pKSx0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5Db25uZWN0aW9uRXZlbnRzLlJFQURZX1RPX1NUQVJUX1NFU1NJT04sKGZ1bmN0aW9uKCl7dC5pZk1hc3Rlcih0Lk1hc3RlclRvcGljcy5TT0ZUUEhPTkUsKGZ1bmN0aW9uKCl7dC5jb3JlLnNvZnRwaG9uZU1hbmFnZXImJnQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyLnN0YXJ0U2Vzc2lvbigpfSksKGZ1bmN0aW9uKCl7dC5iZWNvbWVNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuU09GVFBIT05FLChmdW5jdGlvbigpe3QuYWdlbnQoKGZ1bmN0aW9uKGUpeyF0LmNvcmUuc29mdHBob25lTWFuYWdlciYmZS5pc1NvZnRwaG9uZUVuYWJsZWQoKSYmKHQuYmVjb21lTWFzdGVyKHQuTWFzdGVyVG9waWNzLlNFTkRfTE9HUyksdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXI9bmV3IHQuU29mdHBob25lTWFuYWdlcihuKSx0LmNvcmUuc29mdHBob25lTWFuYWdlci5zdGFydFNlc3Npb24oKSl9KSl9KSl9KSl9KSksdC5jb250YWN0KChmdW5jdGlvbihlKXt0LmFnZW50KChmdW5jdGlvbihuKXtlLm9uUmVmcmVzaCgoZnVuY3Rpb24oZSl7aWYodC5oYXNPdGhlckNvbm5lY3RlZENDUHMoKSYmInZpc2libGUiPT09ZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlJiYoZS5nZXRTdGF0dXMoKS50eXBlPT09dC5Db250YWN0U3RhdHVzVHlwZS5DT05ORUNUSU5HfHxlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0dXNUeXBlLklOQ09NSU5HKSl7dmFyIHI9ZS5pc1NvZnRwaG9uZUNhbGwoKSYmIWUuaXNJbmJvdW5kKCksbz1lLmlzU29mdHBob25lQ2FsbCgpJiZuLmdldENvbmZpZ3VyYXRpb24oKS5zb2Z0cGhvbmVBdXRvQWNjZXB0LGk9ZS5nZXRUeXBlKCk9PT10LkNvbnRhY3RUeXBlLlFVRVVFX0NBTExCQUNLOyhyfHxvfHxpKSYmdC5jb3JlLnRyaWdnZXJSZWFkeVRvU3RhcnRTZXNzaW9uRXZlbnQoKX19KSl9KSl9KSkpfXQuYWdlbnQoKGZ1bmN0aW9uKGUpe2UuaXNTb2Z0cGhvbmVFbmFibGVkKCkmJmUuZ2V0Q2hhbm5lbENvbmN1cnJlbmN5KHQuQ2hhbm5lbFR5cGUuVk9JQ0UpJiZ0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkV2ZW50VHlwZS5NVVRFfSl9KSl9LHQuY29yZS50cmlnZ2VyUmVhZHlUb1N0YXJ0U2Vzc2lvbkV2ZW50PWZ1bmN0aW9uKCl7dmFyIGU9dC5jb3JlLnNvZnRwaG9uZVBhcmFtcyYmdC5jb3JlLnNvZnRwaG9uZVBhcmFtcy5hbGxvd0ZyYW1lZFNvZnRwaG9uZTt0LmlzQ0NQKCk/ZT90LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuQ29ubmVjdGlvbkV2ZW50cy5SRUFEWV9UT19TVEFSVF9TRVNTSU9OKTp0LmlzRnJhbWVkKCk/dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZERvd25zdHJlYW0odC5Db25uZWN0aW9uRXZlbnRzLlJFQURZX1RPX1NUQVJUX1NFU1NJT04pOnQuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5Db25uZWN0aW9uRXZlbnRzLlJFQURZX1RPX1NUQVJUX1NFU1NJT04pOmU/dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuQ29ubmVjdGlvbkV2ZW50cy5SRUFEWV9UT19TVEFSVF9TRVNTSU9OKTp0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuQ29ubmVjdGlvbkV2ZW50cy5SRUFEWV9UT19TVEFSVF9TRVNTSU9OKX0sdC5jb3JlLmluaXRQYWdlT3B0aW9ucz1mdW5jdGlvbihlKXtpZih0LmFzc2VydE5vdE51bGwoZSwicGFyYW1zIiksdC5pc0ZyYW1lZCgpKXt2YXIgbj10LmNvcmUuZ2V0RXZlbnRCdXMoKTtuLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5DT05GSUdVUkUsKGZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29uZmlndXJhdGlvbkV2ZW50cy5DT05GSUdVUkUsZGF0YTplfSl9KSksbi5zdWJzY3JpYmUodC5FdmVudFR5cGUuTUVESUFfREVWSUNFX1JFUVVFU1QsKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5NRURJQV9ERVZJQ0VfUkVTUE9OU0UsZSl9bmF2aWdhdG9yJiZuYXZpZ2F0b3IubWVkaWFEZXZpY2VzP25hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpLnRoZW4oKGZ1bmN0aW9uKHQpe2RldmljZXM9dHx8W10sZGV2aWNlcz1kZXZpY2VzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9KU09OKCl9KSksZShkZXZpY2VzKX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7ZSh7ZXJyb3I6dC5tZXNzYWdlfSl9KSk6ZSh7ZXJyb3I6Ik5vIG5hdmlnYXRvciBvciBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzIG9iamVjdCBmb3VuZCJ9KX0pKX19LHQuY29yZS5pbml0QXBpUHJveHlTZXJ2aWNlPWZ1bmN0aW9uKCl7dC5jb3JlLmFwaVByb3h5Q2xpZW50PW5ldyB0LkFwaVByb3h5Q2xpZW50LHQuaXNGcmFtZWQoKSYmKHQuY29yZS5oYW5kbGVBcGlQcm94eVJlcXVlc3Q9ZnVuY3Rpb24oZSl7ZT8ubWV0aG9kJiZ0LmNvcmUuZ2V0QXBpUHJveHlDbGllbnQoKS5jYWxsKGUubWV0aG9kLGUucGFyYW1zLHtzdWNjZXNzOmZ1bmN0aW9uKG4pe2NvbnN0IHI9e2RhdGE6bixyZXF1ZXN0SWQ6ZS5yZXF1ZXN0SWR9O3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFQSV9SRVNQT05TRSxyKX0sZmFpbHVyZTpmdW5jdGlvbihuKXtjb25zdCByPXtlcnI6bixyZXF1ZXN0SWQ6ZS5yZXF1ZXN0SWR9O3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFQSV9SRVNQT05TRSxyKX19KX0pfSx0LmNvcmUuZ2V0RnJhbWVNZWRpYURldmljZXM9ZnVuY3Rpb24oZSl7dmFyIG49bnVsbCxyPWV8fDFlMyxvPW5ldyBQcm9taXNlKChmdW5jdGlvbihlLHQpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dChuZXcgRXJyb3IoIlRpbWVvdXQgZXhjZWVkZWQiKSl9KSxyKX0pKSxpPW5ldyBQcm9taXNlKChmdW5jdGlvbihlLHIpe2lmKHQuaXNDQ1AoKSluYXZpZ2F0b3ImJm5hdmlnYXRvci5tZWRpYURldmljZXM/bmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKCkudGhlbigoZnVuY3Rpb24odCl7ZGV2aWNlcz10fHxbXSxkZXZpY2VzPWRldmljZXMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS50b0pTT04oKX0pKSxlKGRldmljZXMpfSkpOnIobmV3IEVycm9yKCJObyBuYXZpZ2F0b3Igb3IgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcyBvYmplY3QgZm91bmQiKSk7ZWxzZXt2YXIgbz10LmNvcmUuZ2V0RXZlbnRCdXMoKTtuPW8uc3Vic2NyaWJlKHQuRXZlbnRUeXBlLk1FRElBX0RFVklDRV9SRVNQT05TRSwoZnVuY3Rpb24odCl7dC5lcnJvcj9yKG5ldyBFcnJvcih0LmVycm9yKSk6ZSh0KX0pKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuTUVESUFfREVWSUNFX1JFUVVFU1QpfX0pKTtyZXR1cm4gUHJvbWlzZS5yYWNlKFtpLG9dKS5maW5hbGx5KChmdW5jdGlvbigpe24mJm4udW5zdWJzY3JpYmUoKX0pKX0sdC5jb3JlLmF1dGhvcml6ZT1mdW5jdGlvbihlKXt2YXIgbj1lO3JldHVybiBufHwobj10LmNvcmUuaXNMZWdhY3lEb21haW4oKT9zOmkpLHQuZmV0Y2gobix7Y3JlZGVudGlhbHM6ImluY2x1ZGUifSwyZTMsNSl9LHQuY29yZS52ZXJpZnlEb21haW5BY2Nlc3M9ZnVuY3Rpb24oZSxuKXtpZih0LmdldExvZygpLndhcm4oIlRoaXMgQVBJIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIHJlbGVhc2UiKSwhdC5pc0ZyYW1lZCgpKXJldHVybiBQcm9taXNlLnJlc29sdmUoKTt2YXIgcj17aGVhZGVyczp7IlgtQW16LUJlYXJlciI6ZX19LG89bnVsbDtyZXR1cm4gbz1ufHwodC5jb3JlLmlzTGVnYWN5RG9tYWluKCk/Ii9jb25uZWN0L3doaXRlbGlzdGVkLW9yaWdpbnMiOiIvd2hpdGVsaXN0ZWQtb3JpZ2lucyIpLHQuZmV0Y2gobyxyLDJlMyw1KS50aGVuKChmdW5jdGlvbihlKXt2YXIgdD1nKHdpbmRvdy5kb2N1bWVudC5yZWZlcnJlcik7cmV0dXJuIGUud2hpdGVsaXN0ZWRPcmlnaW5zLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiB0PT09ZyhlKX0pKT9Qcm9taXNlLnJlc29sdmUoKTpQcm9taXNlLnJlamVjdCgpfSkpfSx0LmNvcmUuaXNMZWdhY3lEb21haW49ZnVuY3Rpb24oZSl7cmV0dXJuKGU9ZXx8d2luZG93LmxvY2F0aW9uLmhyZWYpLmluY2x1ZGVzKCIuYXdzYXBwcy5jb20iKX0sdC5jb3JlLmluaXRTaGFyZWRXb3JrZXI9ZnVuY3Rpb24obil7aWYodC5jb3JlLmNoZWNrTm90SW5pdGlhbGl6ZWQoKSwhdC5jb3JlLmluaXRpYWxpemVkKXt0LmFzc2VydE5vdE51bGwobiwicGFyYW1zIik7dmFyIHI9dC5hc3NlcnROb3ROdWxsKG4uc2hhcmVkV29ya2VyVXJsLCJwYXJhbXMuc2hhcmVkV29ya2VyVXJsIiksbz10LmFzc2VydE5vdE51bGwobi5hdXRoVG9rZW4sInBhcmFtcy5hdXRoVG9rZW4iKSxhPXQuYXNzZXJ0Tm90TnVsbChuLnJlZnJlc2hUb2tlbiwicGFyYW1zLnJlZnJlc2hUb2tlbiIpLGM9dC5hc3NlcnROb3ROdWxsKG4uYXV0aFRva2VuRXhwaXJhdGlvbiwicGFyYW1zLmF1dGhUb2tlbkV4cGlyYXRpb24iKSx1PXQuYXNzZXJ0Tm90TnVsbChuLnJlZ2lvbiwicGFyYW1zLnJlZ2lvbiIpLGw9bi5lbmRwb2ludHx8bnVsbCxwPW4uYXV0aG9yaXplRW5kcG9pbnQ7cHx8KHA9dC5jb3JlLmlzTGVnYWN5RG9tYWluKCk/czppKTt2YXIgZD1uLmFnZW50QXBwRW5kcG9pbnR8fG51bGwsaD1uLnRhc2tUZW1wbGF0ZXNFbmRwb2ludHx8bnVsbCxmPW4uYXV0aENvb2tpZU5hbWV8fG51bGw7dHJ5e3QuY29yZS5ldmVudEJ1cz1uZXcgdC5FdmVudEJ1cyh7bG9nRXZlbnRzOiEwfSksdC5jb3JlLmFnZW50RGF0YVByb3ZpZGVyPW5ldyBJKHQuY29yZS5nZXRFdmVudEJ1cygpKSx0LmNvcmUubWVkaWFGYWN0b3J5PW5ldyB0Lk1lZGlhRmFjdG9yeShuKTt2YXIgZz1uZXcgU2hhcmVkV29ya2VyKHIsIkNvbm5lY3RTaGFyZWRXb3JrZXIiKSxtPW5ldyB0LkNvbmR1aXQoIkNvbm5lY3RTaGFyZWRXb3JrZXJDb25kdWl0IixuZXcgdC5Qb3J0U3RyZWFtKGcucG9ydCksbmV3IHQuV2luZG93SU9TdHJlYW0od2luZG93LHBhcmVudCkpO3QuY29yZS51cHN0cmVhbT1tLHQuY29yZS53ZWJTb2NrZXRQcm92aWRlcj1uZXcgVCxlLm9udW5sb2FkPWZ1bmN0aW9uKCl7bS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQ0xPU0UpLGcucG9ydC5jbG9zZSgpfSx0LmdldExvZygpLnNjaGVkdWxlVXBzdHJlYW1Mb2dQdXNoKG0pLHQuZ2V0TG9nKCkuc2NoZWR1bGVEb3duc3RyZWFtQ2xpZW50U2lkZUxvZ3NQdXNoKCksbS5vbkFsbFVwc3RyZWFtKHQuY29yZS5nZXRFdmVudEJ1cygpLmJyaWRnZSgpKSxtLm9uQWxsVXBzdHJlYW0obS5wYXNzRG93bnN0cmVhbSgpKSx0LmlzRnJhbWVkKCkmJihtLm9uQWxsRG93bnN0cmVhbSh0LmNvcmUuZ2V0RXZlbnRCdXMoKS5icmlkZ2UoKSksbS5vbkFsbERvd25zdHJlYW0oKGZ1bmN0aW9uKGUsbil7bj09PXQuRXZlbnRUeXBlLkFQSV9SRVFVRVNUJiZ0LmNvbnRhaW5zVmFsdWUodC5BcGlQcm94eUNsaWVudE1ldGhvZHMsZT8ubWV0aG9kKT90LmNvcmUuaGFuZGxlQXBpUHJveHlSZXF1ZXN0KGUpOm0ucGFzc1Vwc3RyZWFtKCkoZSxuKX0pKSksbS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQ09ORklHVVJFLHthdXRoVG9rZW46byxhdXRoVG9rZW5FeHBpcmF0aW9uOmMsZW5kcG9pbnQ6bCxyZWZyZXNoVG9rZW46YSxyZWdpb246dSxhdXRob3JpemVFbmRwb2ludDpwLGFnZW50QXBwRW5kcG9pbnQ6ZCx0YXNrVGVtcGxhdGVzRW5kcG9pbnQ6aCxhdXRoQ29va2llTmFtZTpmLGxvbmdQb2xsaW5nT3B0aW9uczpuLmxvbmdQb2xsaW5nT3B0aW9uc3x8dm9pZCAwfSksbS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkFDS05PV0xFREdFLChmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oIkFja25vd2xlZGdlZCBieSB0aGUgQ29ubmVjdFNoYXJlZFdvcmtlciEiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5pbml0aWFsaXplZD0hMCx0LmNvcmUuX3NldFRhYklkKCksdC5jb3JlLnBvcnRTdHJlYW1JZD1lLmlkLHRoaXMudW5zdWJzY3JpYmUoKX0pKSxtLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuTE9HLChmdW5jdGlvbihlKXtlLmxvZ2dlcklkIT09dC5nZXRMb2coKS5nZXRMb2dnZXJJZCgpJiZ0LmdldExvZygpLmFkZExvZ0VudHJ5KHQuTG9nRW50cnkuZnJvbU9iamVjdChlKSl9KSksbS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLlNFUlZFUl9CT1VORF9JTlRFUk5BTF9MT0csKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuc2VuZEludGVybmFsTG9nRW50cnlUb1NlcnZlcih0LkxvZ0VudHJ5LmZyb21PYmplY3QoZSkpfSkpLG0ub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLlNFUlZFUl9CT1VORF9JTlRFUk5BTF9MT0csKGZ1bmN0aW9uKGUpe3QuaXNGcmFtZWQoKSYmQXJyYXkuaXNBcnJheShlKSYmZS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmdldExvZygpLnNlbmRJbnRlcm5hbExvZ0VudHJ5VG9TZXJ2ZXIodC5Mb2dFbnRyeS5mcm9tT2JqZWN0KGUpKX0pKX0pKSxtLm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5MT0csKGZ1bmN0aW9uKGUpe3QuaXNGcmFtZWQoKSYmZS5sb2dnZXJJZCE9PXQuZ2V0TG9nKCkuZ2V0TG9nZ2VySWQoKSYmdC5nZXRMb2coKS5hZGRMb2dFbnRyeSh0LkxvZ0VudHJ5LmZyb21PYmplY3QoZSkpfSkpLHQuY29yZS5vbkF1dGhGYWlsKHQuaGl0Y2godC5jb3JlLHQuY29yZS5faGFuZGxlQXV0aEZhaWwsbi5sb2dpbkVuZHBvaW50fHxudWxsLHApKSx0LmNvcmUub25BdXRob3JpemVTdWNjZXNzKHQuaGl0Y2godC5jb3JlLHQuY29yZS5faGFuZGxlQXV0aG9yaXplU3VjY2VzcykpLHQuZ2V0TG9nKCkuaW5mbygiVXNlciBBZ2VudDogIituYXZpZ2F0b3IudXNlckFnZW50KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuZ2V0TG9nKCkuaW5mbygiaXNDQ1B2MjogIishMCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmdldExvZygpLmluZm8oImlzRnJhbWVkOiAiK3QuaXNGcmFtZWQoKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUudXBzdHJlYW0ub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLk9VVEVSX0NPTlRFWFRfSU5GTywoZnVuY3Rpb24oZSl7dmFyIG49ZS5zdHJlYW1zVmVyc2lvbnx8bnVsbDt0LmdldExvZygpLmluZm8oIlN0cmVhbXNKUyBWZXJzaW9uOiAiK24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5vdXRlckNvbnRleHRTdHJlYW1zVmVyc2lvbj1ufSkpLG0ub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5VUERBVEVfQ09OTkVDVEVEX0NDUFMsKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiTnVtYmVyIG9mIGNvbm5lY3RlZCBDQ1BzIHVwZGF0ZWQ6ICIrZS5sZW5ndGgpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5udW1iZXJPZkNvbm5lY3RlZENDUHM9ZS5sZW5ndGgsZVt0LmNvcmUudGFiSWRdJiYhaXNOYU4oZVt0LmNvcmUudGFiSWRdLmxlbmd0aCkmJnQubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzSW5UaGlzVGFiIT09ZVt0LmNvcmUudGFiSWRdLmxlbmd0aCYmKHQubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzSW5UaGlzVGFiPWVbdC5jb3JlLnRhYklkXS5sZW5ndGgsdC5udW1iZXJPZkNvbm5lY3RlZENDUHNJblRoaXNUYWI+MSYmdC5nZXRMb2coKS53YXJuKCJUaGVyZSBhcmUgIit0Lm51bWJlck9mQ29ubmVjdGVkQ0NQc0luVGhpc1RhYisiIGNvbm5lY3RlZCBDQ1BzIGluIHRoaXMgdGFiLiBQbGVhc2UgYWRqdXN0IHlvdXIgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgY29tcGxpY2F0aW9ucy4gSWYgeW91IGFyZSBlbWJlZGRpbmcgQ0NQLCBwbGVhc2UgZG8gc28gZXhjbHVzaXZlbHkgd2l0aCBpbml0Q0NQLiBJbml0Q0NQIHdpbGwgbm90IGxldCB5b3UgZW1iZWQgbW9yZSB0aGFuIG9uZSBDQ1AuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6IkNvbm5lY3RlZENDUFNpbmdsZVRhYkNvdW50IixkYXRhOntjb3VudDp0Lm51bWJlck9mQ29ubmVjdGVkQ0NQc0luVGhpc1RhYn19KSksZS50YWJJZCYmZS5zdHJlYW1zVGFic0Fjcm9zc0Jyb3dzZXImJnQuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuTUVUUklDUywoKCk9PnQuYWdlbnQoKCgpPT50LnB1Ymxpc2hNZXRyaWMoe25hbWU6IkNDUFRhYnNBY3Jvc3NCcm93c2VyQ291bnQiLGRhdGE6e3RhYklkOmUudGFiSWQsY291bnQ6ZS5zdHJlYW1zVGFic0Fjcm9zc0Jyb3dzZXJ9fSkpKSkpfSkpLHQuY29yZS5jbGllbnQ9bmV3IHQuVXBzdHJlYW1Db25kdWl0Q2xpZW50KG0pLHQuY29yZS5tYXN0ZXJDbGllbnQ9bmV3IHQuVXBzdHJlYW1Db25kdWl0TWFzdGVyQ2xpZW50KG0pLHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5URVJNSU5BVEUsbS5wYXNzVXBzdHJlYW0oKSksdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLlRFUk1JTkFURUQsKGZ1bmN0aW9uKCl7d2luZG93LmxvY2F0aW9uLnJlbG9hZCghMCl9KSksZy5wb3J0LnN0YXJ0KCksbS5vblVwc3RyZWFtKHQuVm9pY2VJZEV2ZW50cy5VUERBVEVfRE9NQUlOX0lELChmdW5jdGlvbihlKXtlJiZlLmRvbWFpbklkJiYodC5jb3JlLnZvaWNlSWREb21haW5JZD1lLmRvbWFpbklkKX0pKSx0LmFnZW50KChmdW5jdGlvbigpeyhuZXcgdC5Wb2ljZUlkKS5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygidm9pY2VJZCBkb21haW5JZCBzdWNjZXNzZnVsbHkgZmV0Y2hlZCBhdCBhZ2VudCBpbml0aWFsaXphdGlvbjogIitlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLmNhdGNoKChmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oInZvaWNlSWQgZG9tYWluSWQgbm90IGZldGNoZWQgYXQgYWdlbnQgaW5pdGlhbGl6YXRpb24iKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSl9KSksdC5jb3JlLmdldE5vdGlmaWNhdGlvbk1hbmFnZXIoKS5yZXF1ZXN0UGVybWlzc2lvbigpLG0ub25Eb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5JTklUX0RJU0FTVEVSX1JFQ09WRVJZLChmdW5jdGlvbihlKXt0LmNvcmUuaW5pdERpc2FzdGVyUmVjb3ZlcnkoZSl9KSl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIEFQSSBzaGFyZWQgd29ya2VyLCB3ZSdyZSBkZWFkISIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19fSx0LmNvcmUuX3NldFRhYklkPWZ1bmN0aW9uKCl7dHJ5e3QuY29yZS50YWJJZD13aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0LlNlc3Npb25TdG9yYWdlS2V5cy5UQUJfSUQpLHQuY29yZS50YWJJZHx8KHQuY29yZS50YWJJZD10LnJhbmRvbUlkKCksd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odC5TZXNzaW9uU3RvcmFnZUtleXMuVEFCX0lELHQuY29yZS50YWJJZCkpLHQuY29yZS51cHN0cmVhbS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuVEFCX0lELHt0YWJJZDp0LmNvcmUudGFiSWR9KX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJbVGFiIElkXSBUaGVyZSB3YXMgYW4gaXNzdWUgc2V0dGluZyB0aGUgdGFiIElkIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0sdC5jb3JlLmluaXRDQ1A9ZnVuY3Rpb24obixpKXtpZih0LmNvcmUuY2hlY2tOb3RJbml0aWFsaXplZCgpLCF0LmNvcmUuaW5pdGlhbGl6ZWQpe3QuZ2V0TG9nKCkuaW5mbygiSWZyYW1lIGluaXRpYWxpemF0aW9uIHN0YXJ0ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBzPURhdGUubm93KCk7dHJ5e2lmKHQuY29yZS5fZ2V0Q0NQSWZyYW1lKCkpcmV0dXJuIHZvaWQgdC5nZXRMb2coKS5lcnJvcigiQXR0ZW1wdGVkIHRvIGNhbGwgaW5pdENDUCB3aGVuIGFuIGlmcmFtZSBnZW5lcmF0ZWQgYnkgaW5pdENDUCBhbHJlYWR5IGV4aXN0cyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiRXJyb3Igd2hpbGUgY2hlY2tpbmcgaWYgaW5pdENDUCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX12YXIgcD17fTsic3RyaW5nIj09dHlwZW9mIGk/cC5jY3BVcmw9aTpwPWksdC5hc3NlcnROb3ROdWxsKG4sImNvbnRhaW5lckRpdiIpLHQuYXNzZXJ0Tm90TnVsbChwLmNjcFVybCwicGFyYW1zLmNjcFVybCIpLHAuc29mdHBob25lPy5kaXNhYmxlU3RvcmluZ1BhcmFtc0luTG9jYWxTdG9yYWdlfHwoaC5jbGVhbigpLGYuY2xlYW4oKSksdC5zdG9yYWdlQWNjZXNzLmluaXQocC5jY3BVcmwsbixwLnN0b3JhZ2VBY2Nlc3N8fHt9KTt2YXIgZD10LmNvcmUuX2NyZWF0ZUNDUElmcmFtZShuLHApLGc9bmV3IHQuSUZyYW1lQ29uZHVpdChwLmNjcFVybCx3aW5kb3csZCk7dC5jb3JlLnVwc3RyZWFtPWcsdC5jb3JlLmV2ZW50QnVzPW5ldyB0LkV2ZW50QnVzKHtsb2dFdmVudHM6ITF9KSx0LnN0b3JhZ2VBY2Nlc3MuY2FuUmVxdWVzdCgpP3Quc3RvcmFnZUFjY2Vzcy5zZXR1cFJlcXVlc3RIYW5kbGVycyh7b25HcmFudDptfSk6bSgpfWZ1bmN0aW9uIG0oKXt0LmNvcmUuYWdlbnREYXRhUHJvdmlkZXI9bmV3IEkodC5jb3JlLmdldEV2ZW50QnVzKCkpLHQuY29yZS5tZWRpYUZhY3Rvcnk9bmV3IHQuTWVkaWFGYWN0b3J5KHApLHQuY29yZS5fc2VuZElmcmFtZVN0eWxlRGF0YVVwc3RyZWFtQWZ0ZXJSZWFzb25hYmxlV2FpdFRpbWUoZCxnKSx0LmNvcmUud2ViU29ja2V0UHJvdmlkZXI9bmV3IFQsZy5vbkFsbFVwc3RyZWFtKHQuY29yZS5nZXRFdmVudEJ1cygpLmJyaWRnZSgpKSx0LmNvcmUua2VlcGFsaXZlTWFuYWdlcj1uZXcgQyhnLHQuY29yZS5nZXRFdmVudEJ1cygpLHAuY2NwU3luVGltZW91dHx8MWUzLHAuY2NwQWNrVGltZW91dHx8M2UzKSx0LmNvcmUuaWZyYW1lUmVmcmVzaFRpbWVvdXQ9bnVsbCx0LmNvcmUuY2NwTG9hZFRpbWVvdXRJbnN0YW5jZT1lLnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5jb3JlLmNjcExvYWRUaW1lb3V0SW5zdGFuY2U9bnVsbCx0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLkFDS19USU1FT1VUKSx0LmdldExvZygpLmluZm8oIkNDUCBMb2FkVGltZW91dCB0cmlnZ2VyZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkscC5jY3BMb2FkVGltZW91dHx8NWUzKSx0LmdldExvZygpLnNjaGVkdWxlVXBzdHJlYW1PdXRlckNvbnRleHRDQ1BMb2dzUHVzaChnKSx0LmdldExvZygpLnNjaGVkdWxlVXBzdHJlYW1PdXRlckNvbnRleHRDQ1BzZXJ2ZXJCb3VuZExvZ3NQdXNoKGcpLGcub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSwoZnVuY3Rpb24obil7aWYodC5nZXRMb2coKS5pbmZvKCJBY2tub3dsZWRnZWQgYnkgdGhlIENDUCEiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5jbGllbnQ9bmV3IHQuVXBzdHJlYW1Db25kdWl0Q2xpZW50KGcpLHQuY29yZS5tYXN0ZXJDbGllbnQ9bmV3IHQuVXBzdHJlYW1Db25kdWl0TWFzdGVyQ2xpZW50KGcpLHQuY29yZS5wb3J0U3RyZWFtSWQ9bi5pZCwocC5zb2Z0cGhvbmV8fHAuY2hhdHx8cC5wYWdlT3B0aW9uc3x8cC5zaG91bGRBZGROYW1lc3BhY2VUb0xvZ3N8fHAuZGlzYXN0ZXJSZWNvdmVyeU9uKSYmZy5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQ09ORklHVVJFLHtzb2Z0cGhvbmU6cC5zb2Z0cGhvbmUsY2hhdDpwLmNoYXQscGFnZU9wdGlvbnM6cC5wYWdlT3B0aW9ucyxzaG91bGRBZGROYW1lc3BhY2VUb0xvZ3M6cC5zaG91bGRBZGROYW1lc3BhY2VUb0xvZ3MsZGlzYXN0ZXJSZWNvdmVyeU9uOnAuZGlzYXN0ZXJSZWNvdmVyeU9ufSkscC5kaXNhc3RlclJlY292ZXJ5T24mJih0LmNvcmUucmVnaW9uPXAucmVnaW9uLHQuY29yZS5zdXBwcmVzc0NvbnRhY3RzPXYsdC5jb3JlLmZvcmNlT2ZmbGluZT1mdW5jdGlvbihlKXtnLnNlbmRVcHN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuU0VUX09GRkxJTkUsZSl9LGcuc2VuZFVwc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5JTklUX0RJU0FTVEVSX1JFQ09WRVJZLHApKSx0LmNvcmUuY2NwTG9hZFRpbWVvdXRJbnN0YW5jZSYmKGUuY2xlYXJUaW1lb3V0KHQuY29yZS5jY3BMb2FkVGltZW91dEluc3RhbmNlKSx0LmNvcmUuY2NwTG9hZFRpbWVvdXRJbnN0YW5jZT1udWxsKSxnLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5PVVRFUl9DT05URVhUX0lORk8se3N0cmVhbXNWZXJzaW9uOnQudmVyc2lvbn0pLHQuY29yZS5rZWVwYWxpdmVNYW5hZ2VyLnN0YXJ0KCksdGhpcy51bnN1YnNjcmliZSgpLHQuY29yZS5pbml0aWFsaXplZD0hMCx0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLklOSVQpLHMpe3ZhciByPURhdGUubm93KCktcyxvPXQuY29yZS5pZnJhbWVSZWZyZXNoQXR0ZW1wdHx8MDt0LmdldExvZygpLmluZm8oIklmcmFtZSBpbml0aWFsaXphdGlvbiBzdWNjZWVkZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuZ2V0TG9nKCkuaW5mbyhgSWZyYW1lIGluaXRpYWxpemF0aW9uIHRpbWUgJHtyfWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5nZXRMb2coKS5pbmZvKGBJZnJhbWUgcmVmcmVzaCBhdHRlbXB0cyAke299YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxzZXRUaW1lb3V0KCgoKT0+e3QucHVibGlzaE1ldHJpYyh7bmFtZTphLGRhdGE6e2NvdW50Om99fSksdC5wdWJsaXNoTWV0cmljKHtuYW1lOnUsZGF0YTp7Y291bnQ6MX19KSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6IklmcmFtZUluaXRpYWxpemF0aW9uVGltZSIsZGF0YTp7Y291bnQ6cn19KSxwLmRpc2FzdGVyUmVjb3ZlcnlPbiYmKHQucHVibGlzaE1ldHJpYyh7bmFtZTpjLGRhdGE6e2NvdW50Om99fSksdC5wdWJsaXNoTWV0cmljKHtuYW1lOmwsZGF0YTp7Y291bnQ6MX19KSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6IklmcmFtZUluaXRpYWxpemF0aW9uVGltZURyIixkYXRhOntjb3VudDpyfX0pKSxzPW51bGx9KSwxZTMpfX0pKSxnLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuTE9HLChmdW5jdGlvbihlKXtlLmxvZ2dlcklkIT09dC5nZXRMb2coKS5nZXRMb2dnZXJJZCgpJiZ0LmdldExvZygpLmFkZExvZ0VudHJ5KHQuTG9nRW50cnkuZnJvbU9iamVjdChlKSl9KSksdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLkFDS19USU1FT1VULChmdW5jdGlvbigpe2lmKCExIT09cC5sb2dpblBvcHVwKXRyeXt2YXIgaT1mdW5jdGlvbihuKXt2YXIgaT0iaHR0cHM6Ly9saWx5LnVzLWVhc3QtMS5hbWF6b25hd3MuY29tL3Rhdy9hdXRoL2NvZGUiO3JldHVybiB0LmFzc2VydE5vdE51bGwoaSksbi5sb2dpblVybD9uLmxvZ2luVXJsOm4uYWxpYXM/KGxvZy53YXJuKCJUaGUgYGFsaWFzYCBwYXJhbSBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgbm90IGJlIGV4cGVjdGVkIHRvIGZ1bmN0aW9uIHByb3Blcmx5LiBQbGVhc2UgdXNlIGBjY3BVcmxgIG9yIGBsb2dpblVybGAuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW1hem9uLWNvbm5lY3QvYW1hem9uLWNvbm5lY3Qtc3RyZWFtcy9ibG9iL21hc3Rlci9SRUFETUUubWQjY29ubmVjdGNvcmVpbml0Y2NwIGZvciB2YWxpZCBwYXJhbWV0ZXJzLiIpLHIucmVwbGFjZSgie2FsaWFzfSIsbi5hbGlhcykucmVwbGFjZSgie2NsaWVudF9pZH0iLG8pLnJlcGxhY2UoIntyZWRpcmVjdH0iLGUuZW5jb2RlVVJJQ29tcG9uZW50KGkpKSk6bi5jY3BVcmx9KHApO3QuZ2V0TG9nKCkud2FybigiQUNLX1RJTUVPVVQgb2NjdXJyZWQsIGF0dGVtcHRpbmcgdG8gcG9wIHRoZSBsb2dpbiBwYWdlIGlmIG5vdCBhbHJlYWR5IG9wZW4uIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxwLmxvZ2luVXJsJiZ0LmNvcmUuZ2V0UG9wdXBNYW5hZ2VyKCkuY2xlYXIodC5NYXN0ZXJUb3BpY3MuTE9HSU5fUE9QVVApLHQuY29yZS5sb2dpbldpbmRvdz10LmNvcmUuZ2V0UG9wdXBNYW5hZ2VyKCkub3BlbihpLHQuTWFzdGVyVG9waWNzLkxPR0lOX1BPUFVQLHAubG9naW5PcHRpb25zKX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJBQ0tfVElNRU9VVCBvY2N1cnJlZCBidXQgd2UgYXJlIHVuYWJsZSB0byBvcGVuIHRoZSBsb2dpbiBwb3B1cC4iKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9aWYobnVsbD09dC5jb3JlLmlmcmFtZVJlZnJlc2hUaW1lb3V0KXRyeXtnLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuQUNLTk9XTEVER0UsKGZ1bmN0aW9uKCl7dGhpcy51bnN1YnNjcmliZSgpLGUuY2xlYXJUaW1lb3V0KHQuY29yZS5pZnJhbWVSZWZyZXNoVGltZW91dCksdC5jb3JlLmlmcmFtZVJlZnJlc2hUaW1lb3V0PW51bGwsdC5jb3JlLmdldFBvcHVwTWFuYWdlcigpLmNsZWFyKHQuTWFzdGVyVG9waWNzLkxPR0lOX1BPUFVQKSwocC5sb2dpblBvcHVwQXV0b0Nsb3NlfHxwLmxvZ2luT3B0aW9ucyYmcC5sb2dpbk9wdGlvbnMuYXV0b0Nsb3NlKSYmdC5jb3JlLmxvZ2luV2luZG93JiYodC5jb3JlLmxvZ2luV2luZG93LmNsb3NlKCksdC5jb3JlLmxvZ2luV2luZG93PW51bGwpfSkpLHQuY29yZS5fcmVmcmVzaElmcmFtZU9uVGltZW91dChwLG4pfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIkVycm9yIG9jY3VycmVkIHdoaWxlIHJlZnJlc2hpbmcgaWZyYW1lIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0pKSxwLm9uVmlld0NvbnRhY3QmJnQuY29yZS5vblZpZXdDb250YWN0KHAub25WaWV3Q29udGFjdCksZy5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLlVQREFURV9DT05ORUNURURfQ0NQUywoZnVuY3Rpb24oZSl7dC5udW1iZXJPZkNvbm5lY3RlZENDUHM9ZS5sZW5ndGh9KSksZy5vblVwc3RyZWFtKHQuVm9pY2VJZEV2ZW50cy5VUERBVEVfRE9NQUlOX0lELChmdW5jdGlvbihlKXtlJiZlLmRvbWFpbklkJiYodC5jb3JlLnZvaWNlSWREb21haW5JZD1lLmRvbWFpbklkKX0pKSx0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuSUZSQU1FX1JFVFJJRVNfRVhIQVVTVEVELChmdW5jdGlvbigpe2lmKHMpe3ZhciBlPXQuY29yZS5pZnJhbWVSZWZyZXNoQXR0ZW1wdC0xO3QuZ2V0TG9nKCkuaW5mbygiSWZyYW1lIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5nZXRMb2coKS5pbmZvKCJUaW1lIGFmdGVyIGlmcmFtZSBpbml0aWFsaXphdGlvbiBzdGFydGVkICIrKERhdGUubm93KCktcykpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5nZXRMb2coKS5pbmZvKGBJZnJhbWUgcmVmcmVzaCBhdHRlbXB0cyAke2V9YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6YSxkYXRhOntjb3VudDplfX0pLHQucHVibGlzaE1ldHJpYyh7bmFtZTp1LGRhdGE6e2NvdW50OjB9fSkscC5kaXNhc3RlclJlY292ZXJ5T24mJih0LnB1Ymxpc2hNZXRyaWMoe25hbWU6YyxkYXRhOntjb3VudDplfX0pLHQucHVibGlzaE1ldHJpYyh7bmFtZTpsLGRhdGE6e2NvdW50OjB9fSkpLHM9bnVsbH19KSksdC5jb3JlLnNvZnRwaG9uZVBhcmFtcz1wLnNvZnRwaG9uZX19LHQuY29yZS5vbklmcmFtZVJldHJpZXNFeGhhdXN0ZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLklGUkFNRV9SRVRSSUVTX0VYSEFVU1RFRCxlKX0sdC5jb3JlLl9yZWZyZXNoSWZyYW1lT25UaW1lb3V0PWZ1bmN0aW9uKG4scil7dC5hc3NlcnROb3ROdWxsKG4sImluaXRDQ1BQYXJhbXMiKSx0LmFzc2VydE5vdE51bGwociwiY29udGFpbmVyRGl2Iik7dmFyIG89bi5jY3BMb2FkVGltZW91dD9uLmNjcExvYWRUaW1lb3V0Om4uZGlzYXN0ZXJSZWNvdmVyeU9uPzFlNDo1ZTM7ZS5jbGVhclRpbWVvdXQodC5jb3JlLmlmcmFtZVJlZnJlc2hUaW1lb3V0KSx0LmNvcmUuaWZyYW1lUmVmcmVzaFRpbWVvdXQ9ZS5zZXRUaW1lb3V0KChmdW5jdGlvbigpe2lmKHQuY29yZS5pZnJhbWVSZWZyZXNoQXR0ZW1wdD0odC5jb3JlLmlmcmFtZVJlZnJlc2hBdHRlbXB0fHwwKSsxLHQuY29yZS5pZnJhbWVSZWZyZXNoQXR0ZW1wdDw9MTApe3RyeXt2YXIgbz10LmNvcmUuX2dldENDUElmcmFtZSgpO28mJm8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKTt2YXIgaT10LmNvcmUuX2NyZWF0ZUNDUElmcmFtZShyLG4pO3QuY29yZS51cHN0cmVhbS51cHN0cmVhbS5vdXRwdXQ9aS5jb250ZW50V2luZG93LHQuY29yZS5fc2VuZElmcmFtZVN0eWxlRGF0YVVwc3RyZWFtQWZ0ZXJSZWFzb25hYmxlV2FpdFRpbWUoaSx0LmNvcmUudXBzdHJlYW0pfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIkVycm9yIHdoaWxlIGNoZWNraW5nIGZvciwgYW5kIHJlY3JlYXRpbmcsIHRoZSBDQ1AgSUZyYW1lIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfXQuY29yZS5fcmVmcmVzaElmcmFtZU9uVGltZW91dChuLHIpfWVsc2UgdC5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcih0LkV2ZW50VHlwZS5JRlJBTUVfUkVUUklFU19FWEhBVVNURUQpLGUuY2xlYXJUaW1lb3V0KHQuY29yZS5pZnJhbWVSZWZyZXNoVGltZW91dCl9KSxvKX0sdC5jb3JlLl9nZXRDQ1BJZnJhbWU9ZnVuY3Rpb24oKXtmb3IodmFyIGUgb2Ygd2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSlpZihlLm5hbWU9PT1uKXJldHVybiBlO3JldHVybiBudWxsfSx0LmNvcmUuX2NyZWF0ZUNDUElmcmFtZT1mdW5jdGlvbihlLHIpe3QuYXNzZXJ0Tm90TnVsbChyLCJpbml0Q0NQUGFyYW1zIiksdC5hc3NlcnROb3ROdWxsKGUsImNvbnRhaW5lckRpdiIpO3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3JldHVybiBvLnNyYz1yLmNjcFVybCxvLmFsbG93PSJtaWNyb3Bob25lOyBjYW1lcmE7IGF1dG9wbGF5OyBjbGlwYm9hcmQtd3JpdGU7IGlkZW50aXR5LWNyZWRlbnRpYWxzLWdldCIsby5zdHlsZT1yLnN0eWxlfHwid2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJSIsby50aXRsZT1yLmlmcmFtZVRpdGxlfHxuLG8ubmFtZT1uLHQuc3RvcmFnZUFjY2Vzcy5jYW5SZXF1ZXN0KCkmJihvLnNyYz10LnN0b3JhZ2VBY2Nlc3MuZ2V0UmVxdWVzdFN0b3JhZ2VBY2Nlc3NVcmwoKSxvLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLHQuc3RvcmFnZUFjY2Vzcy5yZXF1ZXN0KSksZS5hcHBlbmRDaGlsZChvKSxvfSx0LmNvcmUuX3NlbmRJZnJhbWVTdHlsZURhdGFVcHN0cmVhbUFmdGVyUmVhc29uYWJsZVdhaXRUaW1lPWZ1bmN0aW9uKGUsbil7dC5hc3NlcnROb3ROdWxsKGUsImlmcmFtZSIpLHQuYXNzZXJ0Tm90TnVsbChuLCJjb25kdWl0Iiksc2V0VGltZW91dCgoZnVuY3Rpb24oKXt2YXIgcj17ZGlzcGxheTp3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlLG51bGwpLmRpc3BsYXksb2Zmc2V0V2lkdGg6ZS5vZmZzZXRXaWR0aCxvZmZzZXRIZWlnaHQ6ZS5vZmZzZXRIZWlnaHQsY2xpZW50UmVjdHNMZW5ndGg6ZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aH07bi5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuSUZSQU1FX1NUWUxFLHIpfSksMWU0KX07dmFyIEM9ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5jb25kdWl0PWUsdGhpcy5ldmVudEJ1cz10LHRoaXMuc3luVGltZW91dD1uLHRoaXMuYWNrVGltZW91dD1yLHRoaXMuYWNrVGltZXI9bnVsbCx0aGlzLnN5blRpbWVyPW51bGwsdGhpcy5hY2tTdWI9bnVsbH07Qy5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3RoaXMuY29uZHVpdC5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuU1lOQ0hST05JWkUpLHRoaXMuYWNrU3ViPXRoaXMuY29uZHVpdC5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkFDS05PV0xFREdFLChmdW5jdGlvbigpe3RoaXMudW5zdWJzY3JpYmUoKSxlLmNsZWFyVGltZW91dChuLmFja1RpbWVyKSxuLl9kZWZlclN0YXJ0KCl9KSksdGhpcy5hY2tUaW1lcj1lLnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bi5hY2tTdWIudW5zdWJzY3JpYmUoKSxuLmV2ZW50QnVzLnRyaWdnZXIodC5FdmVudFR5cGUuQUNLX1RJTUVPVVQpLG4uX2RlZmVyU3RhcnQoKX0pLHRoaXMuYWNrVGltZW91dCl9LEMucHJvdG90eXBlLl9kZWZlclN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5zeW5UaW1lcj1lLnNldFRpbWVvdXQodC5oaXRjaCh0aGlzLHRoaXMuc3RhcnQpLHRoaXMuc3luVGltZW91dCl9LEMucHJvdG90eXBlLmRlZmVyU3RhcnQ9ZnVuY3Rpb24oKXtudWxsPT10aGlzLnN5blRpbWVyJiYodGhpcy5zeW5UaW1lcj1lLnNldFRpbWVvdXQodC5oaXRjaCh0aGlzLHRoaXMuc3RhcnQpLHRoaXMuc3luVGltZW91dCkpfTt2YXIgVD1mdW5jdGlvbigpe3ZhciBlPXtpbml0RmFpbHVyZTpuZXcgU2V0LHN1YnNjcmlwdGlvblVwZGF0ZTpuZXcgU2V0LHN1YnNjcmlwdGlvbkZhaWx1cmU6bmV3IFNldCx0b3BpYzpuZXcgTWFwLGFsbE1lc3NhZ2U6bmV3IFNldCxjb25uZWN0aW9uR2FpbjpuZXcgU2V0LGNvbm5lY3Rpb25Mb3N0Om5ldyBTZXQsY29ubmVjdGlvbk9wZW46bmV3IFNldCxjb25uZWN0aW9uQ2xvc2U6bmV3IFNldH0sbj1mdW5jdGlvbihlLHQpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZSh0KX0pKX07dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5JTklUX0ZBSUxVUkUsKGZ1bmN0aW9uKCl7bihlLmluaXRGYWlsdXJlKX0pKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkNPTk5FQ1RJT05fT1BFTiwoZnVuY3Rpb24odCl7bihlLmNvbm5lY3Rpb25PcGVuLHQpfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQ09OTkVDVElPTl9DTE9TRSwoZnVuY3Rpb24odCl7bihlLmNvbm5lY3Rpb25DbG9zZSx0KX0pKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkNPTk5FQ1RJT05fR0FJTiwoZnVuY3Rpb24oKXtuKGUuY29ubmVjdGlvbkdhaW4pfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQ09OTkVDVElPTl9MT1NULChmdW5jdGlvbih0KXtuKGUuY29ubmVjdGlvbkxvc3QsdCl9KSksdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5TVUJTQ1JJUFRJT05fVVBEQVRFLChmdW5jdGlvbih0KXtuKGUuc3Vic2NyaXB0aW9uVXBkYXRlLHQpfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuU1VCU0NSSVBUSU9OX0ZBSUxVUkUsKGZ1bmN0aW9uKHQpe24oZS5zdWJzY3JpcHRpb25GYWlsdXJlLHQpfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQUxMX01FU1NBR0UsKGZ1bmN0aW9uKHQpe24oZS5hbGxNZXNzYWdlLHQpLGUudG9waWMuaGFzKHQudG9waWMpJiZuKGUudG9waWMuZ2V0KHQudG9waWMpLHQpfSkpLHRoaXMuc2VuZE1lc3NhZ2U9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLlNFTkQsZSl9LHRoaXMub25Jbml0RmFpbHVyZT1mdW5jdGlvbihuKXtyZXR1cm4gdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUuaW5pdEZhaWx1cmUuYWRkKG4pLGZ1bmN0aW9uKCl7cmV0dXJuIGUuaW5pdEZhaWx1cmUuZGVsZXRlKG4pfX0sdGhpcy5vbkNvbm5lY3Rpb25PcGVuPWZ1bmN0aW9uKG4pe3JldHVybiB0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5jb25uZWN0aW9uT3Blbi5hZGQobiksZnVuY3Rpb24oKXtyZXR1cm4gZS5jb25uZWN0aW9uT3Blbi5kZWxldGUobil9fSx0aGlzLm9uQ29ubmVjdGlvbkNsb3NlPWZ1bmN0aW9uKG4pe3JldHVybiB0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5jb25uZWN0aW9uQ2xvc2UuYWRkKG4pLGZ1bmN0aW9uKCl7cmV0dXJuIGUuY29ubmVjdGlvbkNsb3NlLmRlbGV0ZShuKX19LHRoaXMub25Db25uZWN0aW9uR2Fpbj1mdW5jdGlvbihuKXtyZXR1cm4gdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUuY29ubmVjdGlvbkdhaW4uYWRkKG4pLGZ1bmN0aW9uKCl7cmV0dXJuIGUuY29ubmVjdGlvbkdhaW4uZGVsZXRlKG4pfX0sdGhpcy5vbkNvbm5lY3Rpb25Mb3N0PWZ1bmN0aW9uKG4pe3JldHVybiB0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5jb25uZWN0aW9uTG9zdC5hZGQobiksZnVuY3Rpb24oKXtyZXR1cm4gZS5jb25uZWN0aW9uTG9zdC5kZWxldGUobil9fSx0aGlzLm9uU3Vic2NyaXB0aW9uVXBkYXRlPWZ1bmN0aW9uKG4pe3JldHVybiB0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5zdWJzY3JpcHRpb25VcGRhdGUuYWRkKG4pLGZ1bmN0aW9uKCl7cmV0dXJuIGUuc3Vic2NyaXB0aW9uVXBkYXRlLmRlbGV0ZShuKX19LHRoaXMub25TdWJzY3JpcHRpb25GYWlsdXJlPWZ1bmN0aW9uKG4pe3JldHVybiB0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5zdWJzY3JpcHRpb25GYWlsdXJlLmFkZChuKSxmdW5jdGlvbigpe3JldHVybiBlLnN1YnNjcmlwdGlvbkZhaWx1cmUuZGVsZXRlKG4pfX0sdGhpcy5zdWJzY3JpYmVUb3BpY3M9ZnVuY3Rpb24oZSl7dC5hc3NlcnROb3ROdWxsKGUsInRvcGljcyIpLHQuYXNzZXJ0VHJ1ZSh0LmlzQXJyYXkoZSksInRvcGljcyBtdXN0IGJlIGEgYXJyYXkiKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuU1VCU0NSSUJFLGUpfSx0aGlzLm9uTWVzc2FnZT1mdW5jdGlvbihuLHIpe3JldHVybiB0LmFzc2VydE5vdE51bGwobiwidG9waWNOYW1lIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihyKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUudG9waWMuaGFzKG4pP2UudG9waWMuZ2V0KG4pLmFkZChyKTplLnRvcGljLnNldChuLG5ldyBTZXQoW3JdKSksZnVuY3Rpb24oKXtyZXR1cm4gZS50b3BpYy5nZXQobikuZGVsZXRlKHIpfX0sdGhpcy5vbkFsbE1lc3NhZ2U9ZnVuY3Rpb24obil7cmV0dXJuIHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksIm1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24iKSxlLmFsbE1lc3NhZ2UuYWRkKG4pLGZ1bmN0aW9uKCl7cmV0dXJuIGUuYWxsTWVzc2FnZS5kZWxldGUobil9fX0sST1mdW5jdGlvbihlKXt0aGlzLmJ1cz1lLHRoaXMuYnVzLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLlVQREFURSx0LmhpdGNoKHRoaXMsdGhpcy51cGRhdGVBZ2VudERhdGEpKX07SS5wcm90b3R5cGUudXBkYXRlQWdlbnREYXRhPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMuYWdlbnREYXRhO3RoaXMuYWdlbnREYXRhPWU7dHJ5e2NvbnN0IHI9RGF0ZS5wYXJzZShlLnNuYXBzaG90LnNuYXBzaG90VGltZXN0YW1wKTtpZighbnx8ciE9PURhdGUucGFyc2Uobi5zbmFwc2hvdC5zbmFwc2hvdFRpbWVzdGFtcCkpe2NvbnN0IG49KG5ldyBEYXRlKS5nZXRUaW1lKCktcjtBKCJTbmFwc2hvdFJlY2VpdmVkQnlDbGllbnQiLG4se0NvbnRlbnRMZW5ndGhJbkJ5dGVzOnQuY29yZS5fY2FsY3VsYXRlU25hcHNob3RTaXppbmdCdWNrZXQoZS5zbmFwc2hvdCksSXNDQ1BMYXllcjp0LmlzQ0NQKCl9KX19Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiW01ldHJpY3NdIEZhaWxlZCB0byBzZW5kIG1ldHJpY3MuIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfW51bGw9PW4mJih0LmFnZW50LmluaXRpYWxpemVkPSEwLHRoaXMuYnVzLnRyaWdnZXIodC5BZ2VudEV2ZW50cy5JTklULG5ldyB0LkFnZW50KSksdGhpcy5idXMudHJpZ2dlcih0LkFnZW50RXZlbnRzLlJFRlJFU0gsbmV3IHQuQWdlbnQpLHRoaXMuX2ZpcmVBZ2VudFVwZGF0ZUV2ZW50cyhuKX0sSS5wcm90b3R5cGUuZ2V0QWdlbnREYXRhPWZ1bmN0aW9uKCl7aWYobnVsbD09dGhpcy5hZ2VudERhdGEpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiTm8gYWdlbnQgZGF0YSBpcyBhdmFpbGFibGUgeWV0ISIpO3JldHVybiB0aGlzLmFnZW50RGF0YX0sSS5wcm90b3R5cGUuZ2V0Q29udGFjdERhdGE9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5nZXRBZ2VudERhdGEoKSxyPXQuZmluZChuLnNuYXBzaG90LmNvbnRhY3RzLChmdW5jdGlvbih0KXtyZXR1cm4gdC5jb250YWN0SWQ9PT1lfSkpO2lmKG51bGw9PXIpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiQ29udGFjdCAlcyBubyBsb25nZXIgZXhpc3RzLiIsZSk7cmV0dXJuIHJ9LEkucHJvdG90eXBlLmdldENvbm5lY3Rpb25EYXRhPWZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpcy5nZXRDb250YWN0RGF0YShlKSxvPXQuZmluZChyLmNvbm5lY3Rpb25zLChmdW5jdGlvbihlKXtyZXR1cm4gZS5jb25uZWN0aW9uSWQ9PT1ufSkpO2lmKG51bGw9PW8pdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiQ29ubmVjdGlvbiAlcyBmb3IgY29udGFjdCAlcyBubyBsb25nZXIgZXhpc3RzLiIsbixlKTtyZXR1cm4gb30sSS5wcm90b3R5cGUuZ2V0SW5zdGFuY2VJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEFnZW50RGF0YSgpLmNvbmZpZ3VyYXRpb24ucm91dGluZ1Byb2ZpbGUucm91dGluZ1Byb2ZpbGVJZC5tYXRjaCgvaW5zdGFuY2VcLyhbMC05YS1mQS1GfC1dKylcLy8pWzFdfSxJLnByb3RvdHlwZS5nZXRBV1NBY2NvdW50SWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRBZ2VudERhdGEoKS5jb25maWd1cmF0aW9uLnJvdXRpbmdQcm9maWxlLnJvdXRpbmdQcm9maWxlSWQubWF0Y2goLzooWzAtOV0rKTppbnN0YW5jZS8pWzFdfSxJLnByb3RvdHlwZS5fZGlmZkNvbnRhY3RzPWZ1bmN0aW9uKGUpe3ZhciBuPXthZGRlZDp7fSxyZW1vdmVkOnt9LGNvbW1vbjp7fSxvbGRNYXA6dC5pbmRleChudWxsPT1lP1tdOmUuc25hcHNob3QuY29udGFjdHMsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNvbnRhY3RJZH0pKSxuZXdNYXA6dC5pbmRleCh0aGlzLmFnZW50RGF0YS5zbmFwc2hvdC5jb250YWN0cywoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29udGFjdElkfSkpLGVuZFRpbWU6MH07cmV0dXJuIHQua2V5cyhuLm9sZE1hcCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5jb250YWlucyhuLm5ld01hcCxlKT9uLmNvbW1vbltlXT1uLm5ld01hcFtlXTpuLnJlbW92ZWRbZV09bi5vbGRNYXBbZV19KSksdC5rZXlzKG4ubmV3TWFwKS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmNvbnRhaW5zKG4ub2xkTWFwLGUpfHwobi5hZGRlZFtlXT1uLm5ld01hcFtlXSl9KSksbi5lbmRUaW1lPXBlcmZvcm1hbmNlLm5vdygpLG59LEkucHJvdG90eXBlLl9maXJlQWdlbnRVcGRhdGVFdmVudHM9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcyxyPW51bGwsbz1udWxsPT1lP3QuQWdlbnRBdmFpbFN0YXRlcy5JTklUOmUuc25hcHNob3Quc3RhdGUubmFtZSxpPXRoaXMuYWdlbnREYXRhLnNuYXBzaG90LnN0YXRlLm5hbWUscz1udWxsPT1lP3QuQWdlbnRTdGF0ZVR5cGUuSU5JVDplLnNuYXBzaG90LnN0YXRlLnR5cGUsYT10aGlzLmFnZW50RGF0YS5zbmFwc2hvdC5zdGF0ZS50eXBlO3MhPT1hJiZ0LmNvcmUuZ2V0QWdlbnRSb3V0aW5nRXZlbnRHcmFwaCgpLmdldEFzc29jaWF0aW9ucyh0aGlzLHMsYSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bi5idXMudHJpZ2dlcihlLG5ldyB0LkFnZW50KX0pKSxvIT09aSYmKHRoaXMuYnVzLnRyaWdnZXIodC5BZ2VudEV2ZW50cy5TVEFURV9DSEFOR0Use2FnZW50Om5ldyB0LkFnZW50LG9sZFN0YXRlOm8sbmV3U3RhdGU6aX0pLHQuY29yZS5nZXRBZ2VudFN0YXRlRXZlbnRHcmFwaCgpLmdldEFzc29jaWF0aW9ucyh0aGlzLG8saSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bi5idXMudHJpZ2dlcihlLG5ldyB0LkFnZW50KX0pKSk7dmFyIGM9ZSYmZS5zbmFwc2hvdC5uZXh0U3RhdGU/ZS5zbmFwc2hvdC5uZXh0U3RhdGUubmFtZTpudWxsLHU9dGhpcy5hZ2VudERhdGEuc25hcHNob3QubmV4dFN0YXRlP3RoaXMuYWdlbnREYXRhLnNuYXBzaG90Lm5leHRTdGF0ZS5uYW1lOm51bGw7YyE9PXUmJnUmJm4uYnVzLnRyaWdnZXIodC5BZ2VudEV2ZW50cy5FTlFVRVVFRF9ORVhUX1NUQVRFLG5ldyB0LkFnZW50KTtjb25zdCBsPXBlcmZvcm1hbmNlLm5vdygpO3I9bnVsbCE9PWU/dGhpcy5fZGlmZkNvbnRhY3RzKGUpOnthZGRlZDp0LmluZGV4KHRoaXMuYWdlbnREYXRhLnNuYXBzaG90LmNvbnRhY3RzLChmdW5jdGlvbihlKXtyZXR1cm4gZS5jb250YWN0SWR9KSkscmVtb3ZlZDp7fSxjb21tb246e30sb2xkTWFwOnt9LG5ld01hcDp0LmluZGV4KHRoaXMuYWdlbnREYXRhLnNuYXBzaG90LmNvbnRhY3RzLChmdW5jdGlvbihlKXtyZXR1cm4gZS5jb250YWN0SWR9KSksZW5kVGltZTpwZXJmb3JtYW5jZS5ub3coKX07Y29uc3QgcD1wZXJmb3JtYW5jZS5ub3coKTt0LnZhbHVlcyhyLmFkZGVkKS5mb3JFYWNoKChmdW5jdGlvbihlKXtuLmJ1cy50cmlnZ2VyKHQuQ29udGFjdEV2ZW50cy5JTklULG5ldyB0LkNvbnRhY3QoZS5jb250YWN0SWQpKSxuLl9maXJlQ29udGFjdFVwZGF0ZUV2ZW50cyhlLmNvbnRhY3RJZCx0LkNvbnRhY3RTdGF0ZVR5cGUuSU5JVCxlLnN0YXRlLnR5cGUpfSkpLHQudmFsdWVzKHIucmVtb3ZlZCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bi5idXMudHJpZ2dlcih0LkNvbnRhY3RFdmVudHMuREVTVFJPWUVELG5ldyB0LkNvbnRhY3RTbmFwc2hvdChlKSksbi5idXMudHJpZ2dlcih0LmNvcmUuZ2V0Q29udGFjdEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuREVTVFJPWUVELGUuY29udGFjdElkKSxuZXcgdC5Db250YWN0U25hcHNob3QoZSkpLG4uX3Vuc3ViQWxsQ29udGFjdEV2ZW50c0ZvckNvbnRhY3QoZS5jb250YWN0SWQpfSkpLHQua2V5cyhyLmNvbW1vbikuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bi5fZmlyZUNvbnRhY3RVcGRhdGVFdmVudHMoZSxyLm9sZE1hcFtlXS5zdGF0ZS50eXBlLHIubmV3TWFwW2VdLnN0YXRlLnR5cGUpfSkpO2NvbnN0IGQ9cGVyZm9ybWFuY2Uubm93KCksaD17Q29udGVudExlbmd0aEluQnl0ZXM6dC5jb3JlLl9jYWxjdWxhdGVTbmFwc2hvdFNpemluZ0J1Y2tldCh0aGlzLmFnZW50RGF0YS5zbmFwc2hvdCksSXNDQ1BMYXllcjp0LmlzQ0NQKCl9O3RyeXtBKCJTbmFwc2hvdENvbXBhcmlzb25TdGVwVGltZSIsci5lbmRUaW1lLWwsaCksQSgiU25hcHNob3RFdmVudFRyaWdnZXJTdGVwVGltZSIsZC1wLGgpLEEoIlNuYXBzaG90VG90YWxQcm9jZXNzaW5nVGltZSIsZC1sLGgpfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIltNZXRyaWNzXSBGYWlsZWQgdG8gc2VuZCBtZXRyaWNzLiIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19O2xldCBBPShlLG4scik9Pnt0LnB1Ymxpc2hNZXRyaWMoe25hbWU6ZSxkYXRhOntsYXRlbmN5Om4sb3B0aW9uYWxEaW1lbnNpb25zOnJ9fSl9O3QuY29yZS5fY2FsY3VsYXRlU25hcHNob3RTaXppbmdCdWNrZXQ9ZnVuY3Rpb24oZSl7aWYoZSYmZS5oYXNPd25Qcm9wZXJ0eSgiY29udGVudExlbmd0aCIpKXtjb25zdCB0PXBhcnNlSW50KGUuY29udGVudExlbmd0aCk7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXMocCkpe2NvbnN0W24scl09cFtlXTtpZih0Pj1uJiZ0PD1yKXJldHVybiBlfX1yZXR1cm4idW5kZWZpbmVkIn0sSS5wcm90b3R5cGUuX2ZpcmVDb250YWN0VXBkYXRlRXZlbnRzPWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10aGlzO24hPT1yJiZ0LmNvcmUuZ2V0Q29udGFjdEV2ZW50R3JhcGgoKS5nZXRBc3NvY2lhdGlvbnModGhpcyxuLHIpLmZvckVhY2goKGZ1bmN0aW9uKG4pe28uYnVzLnRyaWdnZXIobixuZXcgdC5Db250YWN0KGUpKSxvLmJ1cy50cmlnZ2VyKHQuY29yZS5nZXRDb250YWN0RXZlbnROYW1lKG4sZSksbmV3IHQuQ29udGFjdChlKSl9KSksby5idXMudHJpZ2dlcih0LkNvbnRhY3RFdmVudHMuUkVGUkVTSCxuZXcgdC5Db250YWN0KGUpKSxvLmJ1cy50cmlnZ2VyKHQuY29yZS5nZXRDb250YWN0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5SRUZSRVNILGUpLG5ldyB0LkNvbnRhY3QoZSkpfSxJLnByb3RvdHlwZS5fdW5zdWJBbGxDb250YWN0RXZlbnRzRm9yQ29udGFjdD1mdW5jdGlvbihlKXt2YXIgbj10aGlzO3QudmFsdWVzKHQuQ29udGFjdEV2ZW50cykuZm9yRWFjaCgoZnVuY3Rpb24ocil7bi5idXMuZ2V0U3Vic2NyaXB0aW9ucyh0LmNvcmUuZ2V0Q29udGFjdEV2ZW50TmFtZShyLGUpKS5tYXAoKGZ1bmN0aW9uKGUpe2UudW5zdWJzY3JpYmUoKX0pKX0pKX0sdC5jb3JlLm9uVmlld0NvbnRhY3Q9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkNvbnRhY3RFdmVudHMuVklFVyxlKX0sdC5jb3JlLnZpZXdDb250YWN0PWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29udGFjdEV2ZW50cy5WSUVXLGRhdGE6e2NvbnRhY3RJZDplfX0pfSx0LmNvcmUub25BY3RpdmF0ZUNoYW5uZWxXaXRoVmlld1R5cGU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkNoYW5uZWxWaWV3RXZlbnRzLkFDVElWQVRFX0NIQU5ORUxfV0lUSF9WSUVXX1RZUEUsZSl9LHQuY29yZS5hY3RpdmF0ZUNoYW5uZWxXaXRoVmlld1R5cGU9ZnVuY3Rpb24oZSxuLHIsbyl7Y29uc3QgaT17dmlld1R5cGU6ZSxtZWRpYVR5cGU6bn07ciYmKGkuc291cmNlPXIpLG8mJihpLmNhc2VJZD1vKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNoYW5uZWxWaWV3RXZlbnRzLkFDVElWQVRFX0NIQU5ORUxfV0lUSF9WSUVXX1RZUEUsZGF0YTppfSl9LHQuY29yZS50cmlnZ2VyVGFza0NyZWF0ZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkudXBzdHJlYW1CdXMudHJpZ2dlcih0LlRhc2tFdmVudHMuQ1JFQVRFRCxlKX0sdC5jb3JlLm9uQWNjZXNzRGVuaWVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuQUNDRVNTX0RFTklFRCxlKX0sdC5jb3JlLm9uQXV0aEZhaWw9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5BVVRIX0ZBSUwsZSl9LHQuY29yZS5vbkF1dGhvcml6ZVN1Y2Nlc3M9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5BVVRIT1JJWkVfU1VDQ0VTUyxlKX0sdC5jb3JlLl9oYW5kbGVBdXRob3JpemVTdWNjZXNzPWZ1bmN0aW9uKCl7d2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odC5TZXNzaW9uU3RvcmFnZUtleXMuQVVUSE9SSVpFX1JFVFJZX0NPVU5ULDApfSx0LmNvcmUuX2hhbmRsZUF1dGhGYWlsPWZ1bmN0aW9uKGUsbixyKXtyJiZyLmF1dGhvcml6ZT90LmNvcmUuX2hhbmRsZUF1dGhvcml6ZUZhaWwoZSk6dC5jb3JlLl9oYW5kbGVDVElBdXRoRmFpbChuKX0sdC5jb3JlLl9oYW5kbGVBdXRob3JpemVGYWlsPWZ1bmN0aW9uKGUpe2xldCBuPXQuY29yZS5fZ2V0QXV0aFJldHJ5Q291bnQoKTtpZighdC5jb3JlLmF1dGhvcml6ZVRpbWVvdXRJZClpZihuPHQuY29yZS5NQVhfQVVUSE9SSVpFX1JFVFJZX0NPVU5UX0ZPUl9TRVNTSU9OKXt0LmNvcmUuX2luY3JlbWVudEF1dGhSZXRyeUNvdW50KCk7bGV0IHI9QVdTLnV0aWwuY2FsY3VsYXRlUmV0cnlEZWxheShuKzF8fDAse2Jhc2U6MmUzfSk7dC5jb3JlLmF1dGhvcml6ZVRpbWVvdXRJZD1zZXRUaW1lb3V0KCgoKT0+e3QuY29yZS5fcmVkaXJlY3RUb0xvZ2luKGUpfSkscil9ZWxzZSB0LmdldExvZygpLndhcm4oIldlIGhhdmUgZXhoYXVzdGVkIG91ciBhdXRob3JpemF0aW9uIHJldHJpZXMgZHVlIHRvIDQwMXMgZnJvbSB0aGUgYXV0aG9yaXplIGFwaS4gTm8gbW9yZSByZXRyaWVzIHdpbGwgYmUgYXR0ZW1wdGVkIGluIHRoaXMgc2Vzc2lvbiB1bnRpbCB0aGUgYXV0aG9yaXplIGFwaSByZXR1cm5zIDIwMC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5FdmVudFR5cGUuQVVUSE9SSVpFX1JFVFJJRVNfRVhIQVVTVEVEKX0sdC5jb3JlLl9yZWRpcmVjdFRvTG9naW49ZnVuY3Rpb24oZSl7InN0cmluZyI9PXR5cGVvZiBlP2xvY2F0aW9uLmFzc2lnbihlKTpsb2NhdGlvbi5yZWxvYWQoKX0sdC5jb3JlLl9oYW5kbGVDVElBdXRoRmFpbD1mdW5jdGlvbihlKXtpZighdC5jb3JlLmN0aVRpbWVvdXRJZClpZih0LmNvcmUuY3RpQXV0aFJldHJ5Q291bnQ8dC5jb3JlLk1BWF9DVElfQVVUSF9SRVRSWV9DT1VOVCl7dC5jb3JlLmN0aUF1dGhSZXRyeUNvdW50Kys7bGV0IG49QVdTLnV0aWwuY2FsY3VsYXRlUmV0cnlEZWxheSh0LmNvcmUuY3RpQXV0aFJldHJ5Q291bnR8fDAse2Jhc2U6NTAwfSk7dC5jb3JlLmN0aVRpbWVvdXRJZD1zZXRUaW1lb3V0KCgoKT0+e3QuY29yZS5hdXRob3JpemUoZSkudGhlbih0LmNvcmUuX3RyaWdnZXJBdXRob3JpemVTdWNjZXNzLmJpbmQodC5jb3JlKSkuY2F0Y2godC5jb3JlLl90cmlnZ2VyQXV0aEZhaWwuYmluZCh0LmNvcmUse2F1dGhvcml6ZTohMH0pKSx0LmNvcmUuY3RpVGltZW91dElkPW51bGx9KSxuKX1lbHNlIHQuZ2V0TG9nKCkud2FybigiV2UgaGF2ZSBleGhhdXN0ZWQgb3VyIGF1dGhvcml6YXRpb24gcmV0cmllcyBkdWUgdG8gNDAxcyBmcm9tIHRoZSBDVEkgc2VydmljZS4gTm8gbW9yZSByZXRyaWVzIHdpbGwgYmUgYXR0ZW1wdGVkIHVudGlsIHRoZSBwYWdlIGlzIHJlZnJlc2hlZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5FdmVudFR5cGUuQ1RJX0FVVEhPUklaRV9SRVRSSUVTX0VYSEFVU1RFRCl9LHQuY29yZS5fdHJpZ2dlckF1dGhvcml6ZVN1Y2Nlc3M9ZnVuY3Rpb24oKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS51cHN0cmVhbUJ1cy50cmlnZ2VyKHQuRXZlbnRUeXBlLkFVVEhPUklaRV9TVUNDRVNTKX0sdC5jb3JlLl90cmlnZ2VyQXV0aEZhaWw9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkudXBzdHJlYW1CdXMudHJpZ2dlcih0LkV2ZW50VHlwZS5BVVRIX0ZBSUwsZSl9LHQuY29yZS5fZ2V0QXV0aFJldHJ5Q291bnQ9ZnVuY3Rpb24oKXtsZXQgZT13aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0LlNlc3Npb25TdG9yYWdlS2V5cy5BVVRIT1JJWkVfUkVUUllfQ09VTlQpO2lmKG51bGwhPT1lKXtpZihpc05hTihwYXJzZUludChlKSkpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiVGhlIHNlc3Npb24gc3RvcmFnZSB2YWx1ZSBmb3IgYXV0aCByZXRyeSBjb3VudCB3YXMgTmFOIik7cmV0dXJuIHBhcnNlSW50KGUpfXJldHVybiB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0LlNlc3Npb25TdG9yYWdlS2V5cy5BVVRIT1JJWkVfUkVUUllfQ09VTlQsMCksMH0sdC5jb3JlLl9pbmNyZW1lbnRBdXRoUmV0cnlDb3VudD1mdW5jdGlvbigpe3dpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHQuU2Vzc2lvblN0b3JhZ2VLZXlzLkFVVEhPUklaRV9SRVRSWV9DT1VOVCwodC5jb3JlLl9nZXRBdXRoUmV0cnlDb3VudCgpKzEpLnRvU3RyaW5nKCkpfSx0LmNvcmUub25BdXRob3JpemVSZXRyaWVzRXhoYXVzdGVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5BVVRIT1JJWkVfUkVUUklFU19FWEhBVVNURUQsZSl9LHQuY29yZS5vbkNUSUF1dGhvcml6ZVJldHJpZXNFeGhhdXN0ZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLkNUSV9BVVRIT1JJWkVfUkVUUklFU19FWEhBVVNURUQsZSl9LHQuY29yZS5vblNvZnRwaG9uZVNlc3Npb25Jbml0PWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5Db25uZWN0aW9uRXZlbnRzLlNFU1NJT05fSU5JVCxlKX0sdC5jb3JlLm9uQ29uZmlndXJlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5Db25maWd1cmF0aW9uRXZlbnRzLkNPTkZJR1VSRSxlKX0sdC5jb3JlLm9uSW5pdGlhbGl6ZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLklOSVQsZSl9LHQuY29yZS5nZXRDb250YWN0RXZlbnROYW1lPWZ1bmN0aW9uKGUsbil7aWYodC5hc3NlcnROb3ROdWxsKGUsImV2ZW50TmFtZSIpLHQuYXNzZXJ0Tm90TnVsbChuLCJjb250YWN0SWQiKSwhdC5jb250YWlucyh0LnZhbHVlcyh0LkNvbnRhY3RFdmVudHMpLGUpKXRocm93IG5ldyB0LlZhbHVlRXJyb3IoIiVzIGlzIG5vdCBhIHZhbGlkIGNvbnRhY3QgZXZlbnQuIixlKTtyZXR1cm4gdC5zcHJpbnRmKCIlczo6JXMiLGUsbil9LHQuY29yZS5nZXRFdmVudEJ1cz1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZXZlbnRCdXN9LHQuY29yZS5nZXRXZWJTb2NrZXRNYW5hZ2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS53ZWJTb2NrZXRQcm92aWRlcn0sdC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5hZ2VudERhdGFQcm92aWRlcn0sdC5jb3JlLmdldExvY2FsVGltZXN0YW1wPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEFnZW50RGF0YSgpLnNuYXBzaG90LmxvY2FsVGltZXN0YW1wfSx0LmNvcmUuZ2V0U2tldz1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRBZ2VudERhdGEoKS5zbmFwc2hvdC5za2V3fSx0LmNvcmUuZ2V0QWdlbnRSb3V0aW5nRXZlbnRHcmFwaD1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuYWdlbnRSb3V0aW5nRXZlbnRHcmFwaH0sdC5jb3JlLmFnZW50Um91dGluZ0V2ZW50R3JhcGg9KG5ldyB0LkV2ZW50R3JhcGgpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5BZ2VudFN0YXRlVHlwZS5ST1VUQUJMRSx0LkFnZW50RXZlbnRzLlJPVVRBQkxFKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQWdlbnRTdGF0ZVR5cGUuTk9UX1JPVVRBQkxFLHQuQWdlbnRFdmVudHMuTk9UX1JPVVRBQkxFKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQWdlbnRTdGF0ZVR5cGUuT0ZGTElORSx0LkFnZW50RXZlbnRzLk9GRkxJTkUpLHQuY29yZS5nZXRBZ2VudFN0YXRlRXZlbnRHcmFwaD1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuYWdlbnRTdGF0ZUV2ZW50R3JhcGh9LHQuY29yZS5hZ2VudFN0YXRlRXZlbnRHcmFwaD0obmV3IHQuRXZlbnRHcmFwaCkuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LnZhbHVlcyh0LkFnZW50RXJyb3JTdGF0ZXMpLHQuQWdlbnRFdmVudHMuRVJST1IpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5BZ2VudEF2YWlsU3RhdGVzLkFGVEVSX0NBTExfV09SSyx0LkFnZW50RXZlbnRzLkFDVyksdC5jb3JlLmdldENvbnRhY3RFdmVudEdyYXBoPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5jb250YWN0RXZlbnRHcmFwaH0sdC5jb3JlLmNvbnRhY3RFdmVudEdyYXBoPShuZXcgdC5FdmVudEdyYXBoKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQ29udGFjdFN0YXRlVHlwZS5JTkNPTUlORyx0LkNvbnRhY3RFdmVudHMuSU5DT01JTkcpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5Db250YWN0U3RhdGVUeXBlLlBFTkRJTkcsdC5Db250YWN0RXZlbnRzLlBFTkRJTkcpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5Db250YWN0U3RhdGVUeXBlLkNPTk5FQ1RJTkcsdC5Db250YWN0RXZlbnRzLkNPTk5FQ1RJTkcpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5Db250YWN0U3RhdGVUeXBlLkNPTk5FQ1RFRCx0LkNvbnRhY3RFdmVudHMuQ09OTkVDVEVEKS5hc3NvYyh0LkNvbnRhY3RTdGF0ZVR5cGUuQ09OTkVDVElORyx0LkNvbnRhY3RTdGF0ZVR5cGUuRVJST1IsdC5Db250YWN0RXZlbnRzLk1JU1NFRCkuYXNzb2ModC5Db250YWN0U3RhdGVUeXBlLklOQ09NSU5HLHQuQ29udGFjdFN0YXRlVHlwZS5FUlJPUix0LkNvbnRhY3RFdmVudHMuTUlTU0VEKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQ29udGFjdFN0YXRlVHlwZS5FTkRFRCx0LkNvbnRhY3RFdmVudHMuQUNXKS5hc3NvYyh0LnZhbHVlcyh0LkNPTlRBQ1RfQUNUSVZFX1NUQVRFUyksdC52YWx1ZXModC5yZWxhdGl2ZUNvbXBsZW1lbnQodC5DT05UQUNUX0FDVElWRV9TVEFURVMsdC5Db250YWN0U3RhdGVUeXBlKSksdC5Db250YWN0RXZlbnRzLkVOREVEKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQ29udGFjdFN0YXRlVHlwZS5FUlJPUix0LkNvbnRhY3RFdmVudHMuRVJST1IpLmFzc29jKHQuQ29udGFjdFN0YXRlVHlwZS5DT05ORUNUSU5HLHQuQ29udGFjdFN0YXRlVHlwZS5NSVNTRUQsdC5Db250YWN0RXZlbnRzLk1JU1NFRCkuYXNzb2ModC5Db250YWN0U3RhdGVUeXBlLklOQ09NSU5HLHQuQ29udGFjdFN0YXRlVHlwZS5NSVNTRUQsdC5Db250YWN0RXZlbnRzLk1JU1NFRCkuYXNzb2ModC5Db250YWN0U3RhdGVUeXBlLkNPTk5FQ1RJTkcsdC5Db250YWN0U3RhdGVUeXBlLlJFSkVDVEVELHQuQ29udGFjdEV2ZW50cy5NSVNTRUQpLmFzc29jKHQuQ29udGFjdFN0YXRlVHlwZS5JTkNPTUlORyx0LkNvbnRhY3RTdGF0ZVR5cGUuUkVKRUNURUQsdC5Db250YWN0RXZlbnRzLk1JU1NFRCksdC5jb3JlLmdldENsaWVudD1mdW5jdGlvbigpe2lmKCF0LmNvcmUuY2xpZW50KXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIlRoZSBjb25uZWN0IGNvcmUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkISIpO3JldHVybiB0LmNvcmUuY2xpZW50fSx0LmNvcmUuY2xpZW50PW51bGwsdC5jb3JlLmdldEFwaVByb3h5Q2xpZW50PWZ1bmN0aW9uKCl7aWYoIXQuY29yZS5hcGlQcm94eUNsaWVudCl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJUaGUgY29ubmVjdCBhcGlQcm94eSBDbGllbnQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkISIpO3JldHVybiB0LmNvcmUuYXBpUHJveHlDbGllbnR9LHQuY29yZS5hcGlQcm94eUNsaWVudD1udWxsLHQuY29yZS5nZXRBZ2VudEFwcENsaWVudD1mdW5jdGlvbigpe2lmKCF0LmNvcmUuYWdlbnRBcHBDbGllbnQpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiVGhlIGNvbm5lY3QgQWdlbnRBcHAgQ2xpZW50IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCEiKTtyZXR1cm4gdC5jb3JlLmFnZW50QXBwQ2xpZW50fSx0LmNvcmUuYWdlbnRBcHBDbGllbnQ9bnVsbCx0LmNvcmUuZ2V0VGFza1RlbXBsYXRlc0NsaWVudD1mdW5jdGlvbigpe2lmKCF0LmNvcmUudGFza1RlbXBsYXRlc0NsaWVudCl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJUaGUgY29ubmVjdCBUYXNrVGVtcGxhdGVzIENsaWVudCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQhIik7cmV0dXJuIHQuY29yZS50YXNrVGVtcGxhdGVzQ2xpZW50fSx0LmNvcmUudGFza1RlbXBsYXRlc0NsaWVudD1udWxsLHQuY29yZS5nZXRNYXN0ZXJDbGllbnQ9ZnVuY3Rpb24oKXtpZighdC5jb3JlLm1hc3RlckNsaWVudCl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJUaGUgY29ubmVjdCBtYXN0ZXIgY2xpZW50IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCEiKTtyZXR1cm4gdC5jb3JlLm1hc3RlckNsaWVudH0sdC5jb3JlLm1hc3RlckNsaWVudD1udWxsLHQuY29yZS5nZXRTb2Z0cGhvbmVNYW5hZ2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyfSx0LmNvcmUuc29mdHBob25lTWFuYWdlcj1udWxsLHQuY29yZS5nZXROb3RpZmljYXRpb25NYW5hZ2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5ub3RpZmljYXRpb25NYW5hZ2VyfHwodC5jb3JlLm5vdGlmaWNhdGlvbk1hbmFnZXI9bmV3IHQuTm90aWZpY2F0aW9uTWFuYWdlciksdC5jb3JlLm5vdGlmaWNhdGlvbk1hbmFnZXJ9LHQuY29yZS5ub3RpZmljYXRpb25NYW5hZ2VyPW51bGwsdC5jb3JlLmdldFBvcHVwTWFuYWdlcj1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUucG9wdXBNYW5hZ2VyfSx0LmNvcmUucG9wdXBNYW5hZ2VyPW5ldyB0LlBvcHVwTWFuYWdlcix0LmNvcmUuZ2V0VXBzdHJlYW09ZnVuY3Rpb24oKXtpZighdC5jb3JlLnVwc3RyZWFtKXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIlRoZXJlIGlzIG5vIHVwc3RyZWFtIGNvbmR1aXQhIik7cmV0dXJuIHQuY29yZS51cHN0cmVhbX0sdC5jb3JlLnVwc3RyZWFtPW51bGwsdC5jb3JlLkFnZW50RGF0YVByb3ZpZGVyPUl9KCl9LDU5MjooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10O3ZhciBuPSI8PGFsbD4+IixyPXQubWFrZUVudW0oWyJhY2tub3dsZWRnZSIsImFja190aW1lb3V0IiwiaW5pdCIsImFwaV9yZXF1ZXN0IiwiYXBpX3Jlc3BvbnNlIiwiYXV0aF9mYWlsIiwiYWNjZXNzX2RlbmllZCIsImNsb3NlIiwiY29uZmlndXJlIiwibG9nIiwibWFzdGVyX3JlcXVlc3QiLCJtYXN0ZXJfcmVzcG9uc2UiLCJzeW5jaHJvbml6ZSIsInRlcm1pbmF0ZSIsInRlcm1pbmF0ZWQiLCJzZW5kX2xvZ3MiLCJyZWxvYWRfYWdlbnRfY29uZmlndXJhdGlvbiIsImJyb2FkY2FzdCIsImFwaV9tZXRyaWMiLCJjbGllbnRfbWV0cmljIiwic29mdHBob25lX3N0YXRzIiwic29mdHBob25lX3JlcG9ydCIsImNsaWVudF9zaWRlX2xvZ3MiLCJzZXJ2ZXJfYm91bmRfaW50ZXJuYWxfbG9nIiwibXV0ZSIsImlmcmFtZV9zdHlsZSIsImlmcmFtZV9yZXRyaWVzX2V4aGF1c3RlZCIsInVwZGF0ZV9jb25uZWN0ZWRfY2NwcyIsIm91dGVyX2NvbnRleHRfaW5mbyIsIm1lZGlhX2RldmljZV9yZXF1ZXN0IiwibWVkaWFfZGV2aWNlX3Jlc3BvbnNlIiwidGFiX2lkIiwiYXV0aG9yaXplX3N1Y2Nlc3MiLCJhdXRob3JpemVfcmV0cmllc19leGhhdXN0ZWQiLCJjdGlfYXV0aG9yaXplX3JldHJpZXNfZXhoYXVzdGVkIiwiY2xpY2tfc3RyZWFtX2RhdGEiLCJzZXRfcXVpY2tfZ2V0X2FnZW50X3NuYXBzaG90X2ZsYWciLCJhcGlfcHJveHlfcmVxdWVzdCIsImFwaV9wcm94eV9yZXNwb25zZSJdKSxvPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJjb25uZWN0IixbImxvZ2luUG9wdXAiLCJzZW5kTG9ncyIsInNvZnRwaG9uZSIsInJpbmd0b25lIiwibWV0cmljcyIsImZhaWxvdmVyIl0pLGk9dC5tYWtlTmFtZXNwYWNlZEVudW0oImFnZW50IixbImluaXQiLCJ1cGRhdGUiLCJyZWZyZXNoIiwicm91dGFibGUiLCJub3Rfcm91dGFibGUiLCJwZW5kaW5nIiwiY29udGFjdF9wZW5kaW5nIiwib2ZmbGluZSIsImVycm9yIiwic29mdHBob25lX2Vycm9yIiwid2Vic29ja2V0X2Nvbm5lY3Rpb25fbG9zdCIsIndlYnNvY2tldF9jb25uZWN0aW9uX2dhaW5lZCIsInN0YXRlX2NoYW5nZSIsImFjdyIsIm11dGVfdG9nZ2xlIiwibG9jYWxfbWVkaWFfc3RyZWFtX2NyZWF0ZWQiLCJlbnF1ZXVlZF9uZXh0X3N0YXRlIl0pLHM9dC5tYWtlTmFtZXNwYWNlZEVudW0oIndlYlNvY2tldCIsWyJpbml0X2ZhaWx1cmUiLCJjb25uZWN0aW9uX29wZW4iLCJjb25uZWN0aW9uX2Nsb3NlIiwiY29ubmVjdGlvbl9lcnJvciIsImNvbm5lY3Rpb25fZ2FpbiIsImNvbm5lY3Rpb25fbG9zdCIsInN1YnNjcmlwdGlvbl91cGRhdGUiLCJzdWJzY3JpcHRpb25fZmFpbHVyZSIsImFsbF9tZXNzYWdlIiwic2VuZCIsInN1YnNjcmliZSJdKSxhPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJjb250YWN0IixbImluaXQiLCJyZWZyZXNoIiwiZGVzdHJveWVkIiwiaW5jb21pbmciLCJwZW5kaW5nIiwiY29ubmVjdGluZyIsImNvbm5lY3RlZCIsIm1pc3NlZCIsImFjdyIsInZpZXciLCJlbmRlZCIsImVycm9yIiwiYWNjZXB0ZWQiXSksYz10Lm1ha2VOYW1lc3BhY2VkRW51bSgidGFza0xpc3QiLFsiYWN0aXZhdGVfY2hhbm5lbF93aXRoX3ZpZXdfdHlwZSJdKSx1PXQubWFrZU5hbWVzcGFjZWRFbnVtKCJ0YXNrIixbImNyZWF0ZWQiXSksbD10Lm1ha2VOYW1lc3BhY2VkRW51bSgiY29ubmVjdGlvbiIsWyJzZXNzaW9uX2luaXQiLCJyZWFkeV90b19zdGFydF9zZXNzaW9uIl0pLHA9dC5tYWtlTmFtZXNwYWNlZEVudW0oImNvbmZpZ3VyYXRpb24iLFsiY29uZmlndXJlIiwic2V0X3NwZWFrZXJfZGV2aWNlIiwic2V0X21pY3JvcGhvbmVfZGV2aWNlIiwic2V0X3Jpbmdlcl9kZXZpY2UiLCJzcGVha2VyX2RldmljZV9jaGFuZ2VkIiwibWljcm9waG9uZV9kZXZpY2VfY2hhbmdlZCIsInJpbmdlcl9kZXZpY2VfY2hhbmdlZCIsImNhbWVyYV9kZXZpY2VfY2hhbmdlZCIsImJhY2tncm91bmRfYmx1cl9jaGFuZ2VkIl0pLGQ9dC5tYWtlTmFtZXNwYWNlZEVudW0oImRpc2FzdGVyUmVjb3ZlcnkiLFsic3VwcHJlc3MiLCJmb3JjZV9vZmZsaW5lIiwic2V0X29mZmxpbmUiLCJpbml0X2Rpc2FzdGVyX3JlY292ZXJ5IiwiZmFpbG92ZXIiLCJmYWlsb3Zlcl9wZW5kaW5nIiwiaW5pdF9kcl9wb2xsaW5nIl0pLGg9dC5tYWtlTmFtZXNwYWNlZEVudW0oInZvaWNlSWQiLFsidXBkYXRlX2RvbWFpbl9pZCJdKSxmPWZ1bmN0aW9uKCl7fTtmLmNyZWF0ZVJlcXVlc3Q9ZnVuY3Rpb24oZSxuLHIpe3JldHVybntldmVudDplLHJlcXVlc3RJZDp0LnJhbmRvbUlkKCksbWV0aG9kOm4scGFyYW1zOnJ9fSxmLmNyZWF0ZVJlc3BvbnNlPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybntldmVudDplLHJlcXVlc3RJZDp0LnJlcXVlc3RJZCxkYXRhOm4sZXJyOnJ8fG51bGx9fTt2YXIgZz1mdW5jdGlvbihlLG4scil7dGhpcy5zdWJNYXA9ZSx0aGlzLmlkPXQucmFuZG9tSWQoKSx0aGlzLmV2ZW50TmFtZT1uLHRoaXMuZj1yfTtnLnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbigpe3RoaXMuc3ViTWFwLnVuc3Vic2NyaWJlKHRoaXMuZXZlbnROYW1lLHRoaXMuaWQpfTt2YXIgbT1mdW5jdGlvbigpe3RoaXMuc3ViSWRNYXA9e30sdGhpcy5zdWJFdmVudE5hbWVNYXA9e319O20ucHJvdG90eXBlLnN1YnNjcmliZT1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBnKHRoaXMsZSx0KTt0aGlzLnN1YklkTWFwW24uaWRdPW47dmFyIHI9dGhpcy5zdWJFdmVudE5hbWVNYXBbZV18fFtdO3JldHVybiByLnB1c2gobiksdGhpcy5zdWJFdmVudE5hbWVNYXBbZV09cixufSxtLnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbihlLG4pe3QuY29udGFpbnModGhpcy5zdWJFdmVudE5hbWVNYXAsZSkmJih0aGlzLnN1YkV2ZW50TmFtZU1hcFtlXT10aGlzLnN1YkV2ZW50TmFtZU1hcFtlXS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlkIT09bn0pKSx0aGlzLnN1YkV2ZW50TmFtZU1hcFtlXS5sZW5ndGg8MSYmZGVsZXRlIHRoaXMuc3ViRXZlbnROYW1lTWFwW2VdKSx0LmNvbnRhaW5zKHRoaXMuc3ViSWRNYXAsbikmJmRlbGV0ZSB0aGlzLnN1YklkTWFwW25dfSxtLnByb3RvdHlwZS5nZXRBbGxTdWJzY3JpcHRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHQudmFsdWVzKHRoaXMuc3ViRXZlbnROYW1lTWFwKS5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29uY2F0KHQpfSksW10pfSxtLnByb3RvdHlwZS5nZXRTdWJzY3JpcHRpb25zPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnN1YkV2ZW50TmFtZU1hcFtlXXx8W119O3ZhciB2PWZ1bmN0aW9uKGUpe3ZhciB0PWV8fHt9O3RoaXMuc3ViTWFwPW5ldyBtLHRoaXMubG9nRXZlbnRzPXQubG9nRXZlbnRzfHwhMX07di5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChlLCJldmVudE5hbWUiKSx0LmFzc2VydE5vdE51bGwobiwiZiIpLHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksImYgbXVzdCBiZSBhIGZ1bmN0aW9uIiksdGhpcy5zdWJNYXAuc3Vic2NyaWJlKGUsbil9LHYucHJvdG90eXBlLnN1YnNjcmliZUFsbD1mdW5jdGlvbihlKXtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKGUsImYiKSx0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKGUpLCJmIG11c3QgYmUgYSBmdW5jdGlvbiIpLHRoaXMuc3ViTWFwLnN1YnNjcmliZShuLGUpfSx2LnByb3RvdHlwZS5nZXRTdWJzY3JpcHRpb25zPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnN1Yk1hcC5nZXRTdWJzY3JpcHRpb25zKGUpfSx2LnByb3RvdHlwZS50cmlnZ2VyPWZ1bmN0aW9uKGUscil7dC5hc3NlcnROb3ROdWxsKGUsImV2ZW50TmFtZSIpO3ZhciBvPXRoaXMsaT10aGlzLnN1Yk1hcC5nZXRTdWJzY3JpcHRpb25zKG4pLHM9dGhpcy5zdWJNYXAuZ2V0U3Vic2NyaXB0aW9ucyhlKTt0aGlzLmxvZ0V2ZW50cyYmZSE9PXQuRXZlbnRUeXBlLkxPRyYmZSE9PXQuRXZlbnRUeXBlLk1BU1RFUl9SRVNQT05TRSYmZSE9PXQuRXZlbnRUeXBlLkFQSV9NRVRSSUMmJmUhPT10LkV2ZW50VHlwZS5TRVJWRVJfQk9VTkRfSU5URVJOQUxfTE9HJiZ0LmdldExvZygpLnRyYWNlKCJQdWJsaXNoaW5nIGV2ZW50OiAlcyIsZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxlLnN0YXJ0c1dpdGgodC5Db250YWN0RXZlbnRzLkFDQ0VQVEVEKSYmciYmci5jb250YWN0SWQmJiEociBpbnN0YW5jZW9mIHQuQ29udGFjdCkmJihyPW5ldyB0LkNvbnRhY3Qoci5jb250YWN0SWQpKSxpLmNvbmNhdChzKS5mb3JFYWNoKChmdW5jdGlvbihuKXt0cnl7bi5mKHJ8fG51bGwsZSxvKX1jYXRjaChuKXt0LmdldExvZygpLmVycm9yKCInJXMnIGV2ZW50IGhhbmRsZXIgZmFpbGVkLiIsZSkud2l0aEV4Y2VwdGlvbihuKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0pKX0sdi5wcm90b3R5cGUuYnJpZGdlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gZnVuY3Rpb24odCxuKXtlLnRyaWdnZXIobix0KX19LHYucHJvdG90eXBlLnVuc3Vic2NyaWJlQWxsPWZ1bmN0aW9uKCl7dGhpcy5zdWJNYXAuZ2V0QWxsU3Vic2NyaXB0aW9ucygpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UudW5zdWJzY3JpYmUoKX0pKX0sdC5FdmVudEJ1cz12LHQuRXZlbnRGYWN0b3J5PWYsdC5FdmVudFR5cGU9cix0LkFnZW50RXZlbnRzPWksdC5Db25maWd1cmF0aW9uRXZlbnRzPXAsdC5Db25uZWN0aW9uRXZlbnRzPWwsdC5Db25ubmVjdGlvbkV2ZW50cz1sLHQuQ29udGFjdEV2ZW50cz1hLHQuQ2hhbm5lbFZpZXdFdmVudHM9Yyx0LlRhc2tFdmVudHM9dSx0LlZvaWNlSWRFdmVudHM9aCx0LldlYlNvY2tldEV2ZW50cz1zLHQuTWFzdGVyVG9waWNzPW8sdC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzPWR9KCl9LDI4NjooKT0+eyFmdW5jdGlvbihlKXt2YXIgdD17fTtmdW5jdGlvbiBuKHIpe2lmKHRbcl0pcmV0dXJuIHRbcl0uZXhwb3J0czt2YXIgbz10W3JdPXtpOnIsbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gZVtyXS5jYWxsKG8uZXhwb3J0cyxvLG8uZXhwb3J0cyxuKSxvLmw9ITAsby5leHBvcnRzfW4ubT1lLG4uYz10LG4uZD1mdW5jdGlvbihlLHQscil7bi5vKGUsdCl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6ITAsZ2V0OnJ9KX0sbi5yPWZ1bmN0aW9uKGUpeyJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbihlLHQpe2lmKDEmdCYmKGU9bihlKSksOCZ0KXJldHVybiBlO2lmKDQmdCYmIm9iamVjdCI9PXR5cGVvZiBlJiZlJiZlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIHI9T2JqZWN0LmNyZWF0ZShudWxsKTtpZihuLnIociksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsImRlZmF1bHQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOmV9KSwyJnQmJiJzdHJpbmciIT10eXBlb2YgZSlmb3IodmFyIG8gaW4gZSluLmQocixvLGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfS5iaW5kKG51bGwsbykpO3JldHVybiByfSxuLm49ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIG4uZCh0LCJhIix0KSx0fSxuLm89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9LG4ucD0iIixuKG4ucz0yKX0oW2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxKSxvPSJERUJVRyIsaT0iQU1aX1dFQl9TT0NLRVRfTUFOQUdFUjoiLHM9Ik5ldHdvcmsgb2ZmbGluZSIsYT0iTmV0d29yayBvbmxpbmUsIGNvbm5lY3RpbmcgdG8gV2ViU29ja2V0IHNlcnZlciIsYz0iTmV0d29yayBvZmZsaW5lLCBpZ25vcmluZyB0aGlzIGdldFdlYlNvY2tldENvbm5Db25maWcgcmVxdWVzdCIsdT0iSGVhcnRiZWF0IHJlc3BvbnNlIG5vdCByZWNlaXZlZCIsbD0iRmFpbGVkIHRvIHNlbmQgaGVhcnRiZWF0IHNpbmNlIFdlYlNvY2tldCBpcyBub3Qgb3BlbiIscD0iV2ViU29ja2V0IGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQhIixkPSJXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBjbG9zZWQiLGg9IldlYlNvY2tldE1hbmFnZXIgRXJyb3IsIGVycm9yX2V2ZW50OiAiLGY9IlNjaGVkdWxpbmcgV2ViU29ja2V0IHJlaW5pdGlhbGl6YXRpb24sIGFmdGVyIGRlbGF5ICIsZz0iV2ViU29ja2V0IFVSTCBjYW5ub3QgYmUgdXNlZCB0byBlc3RhYmxpc2ggY29ubmVjdGlvbiIsbT0iV2ViU29ja2V0IEluaXRpYWxpemF0aW9uIGZhaWxlZCAtIFRlcm1pbmF0aW5nIGFuZCBjbGVhbmluZyBzdWJzY3JpcHRpb25zIix2PSJGZXRjaGluZyBuZXcgV2ViU29ja2V0IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbiIseT0iU3VjY2Vzc2Z1bGx5IGZldGNoZWQgd2ViU29ja2V0IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbiIsRT0iRmFpbGVkIHRvIGZldGNoIHdlYlNvY2tldCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24iLFM9IlJldHJ5aW5nIGZldGNoaW5nIG5ldyBXZWJTb2NrZXQgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIixiPSJJbml0aWFsaXppbmcgV2Vic29ja2V0IE1hbmFnZXIiLEM9IldlYlNvY2tldE1hbmFnZXIgTWVzc2FnZSBFcnJvciIsVD0iTWVzc2FnZSByZWNlaXZlZCBmb3IgdG9waWMgIixJPSJJbnZhbGlkIGluY29taW5nIG1lc3NhZ2UiLEE9ImF3cy9zdWJzY3JpYmUiLF89ImF3cy9oZWFydGJlYXQiLHc9ImRpc2Nvbm5lY3RlZCI7ZnVuY3Rpb24gUihlKXtyZXR1cm4oUj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZlLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZlIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgZX0pKGUpfXZhciBrPXthc3NlcnRUcnVlOmZ1bmN0aW9uKGUsdCl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKHQpfSxhc3NlcnROb3ROdWxsOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGsuYXNzZXJ0VHJ1ZShudWxsIT09ZSYmdm9pZCAwIT09UihlKSxPYmplY3Qoci5zcHJpbnRmKSgiJXMgbXVzdCBiZSBwcm92aWRlZCIsdHx8IkEgdmFsdWUiKSksZX0saXNOb25FbXB0eVN0cmluZzpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJmUubGVuZ3RoPjB9LGFzc2VydElzTGlzdDpmdW5jdGlvbihlLHQpe2lmKCFBcnJheS5pc0FycmF5KGUpKXRocm93IG5ldyBFcnJvcih0KyIgaXMgbm90IGFuIGFycmF5Iil9LGlzRnVuY3Rpb246ZnVuY3Rpb24oZSl7cmV0dXJuISEoZSYmZS5jb25zdHJ1Y3RvciYmZS5jYWxsJiZlLmFwcGx5KX0saXNPYmplY3Q6ZnVuY3Rpb24oZSl7cmV0dXJuISgib2JqZWN0IiE9PVIoZSl8fG51bGw9PT1lKX0saXNTdHJpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlfSxpc051bWJlcjpmdW5jdGlvbihlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGV9fSxMPW5ldyBSZWdFeHAoIl4od3NzOi8vKVxcdyoiKTtrLnZhbGlkV1NVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIEwudGVzdChlKX0say5nZXRTdWJzY3JpcHRpb25SZXNwb25zZT1mdW5jdGlvbihlLHQsbil7cmV0dXJue3RvcGljOmUsY29udGVudDp7c3RhdHVzOnQ/InN1Y2Nlc3MiOiJmYWlsdXJlIix0b3BpY3M6bn19fSxrLmFzc2VydElzT2JqZWN0PWZ1bmN0aW9uKGUsdCl7aWYoIWsuaXNPYmplY3QoZSkpdGhyb3cgbmV3IEVycm9yKHQrIiBpcyBub3QgYW4gb2JqZWN0ISIpfSxrLmFkZEppdHRlcj1mdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MTt0PU1hdGgubWluKHQsMSk7dmFyIG49TWF0aC5yYW5kb20oKT4uNT8xOi0xO3JldHVybiBNYXRoLmZsb29yKGUrbiplKk1hdGgucmFuZG9tKCkqdCl9LGsuaXNOZXR3b3JrT25saW5lPWZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5vbkxpbmV9LGsuaXNOZXR3b3JrRmFpbHVyZT1mdW5jdGlvbihlKXtyZXR1cm4hKCFlLl9kZWJ1Z3x8IWUuX2RlYnVnLnR5cGUpJiYiTmV0d29ya2luZ0Vycm9yIj09PWUuX2RlYnVnLnR5cGV9O3ZhciBOPWs7ZnVuY3Rpb24gTyhlKXtyZXR1cm4oTz1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKGUpe3JldHVybiBlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpfSkoZSl9ZnVuY3Rpb24gRChlLHQpe3JldHVybihEPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5fX3Byb3RvX189dCxlfSkoZSx0KX1mdW5jdGlvbiBQKGUpe3JldHVybihQPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSkoZSl9ZnVuY3Rpb24geChlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIE0oZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1mdW5jdGlvbiBVKGUsdCxuKXtyZXR1cm4gdCYmTShlLnByb3RvdHlwZSx0KSxuJiZNKGUsbiksZX12YXIgRj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt4KHRoaXMsZSl9cmV0dXJuIFUoZSxbe2tleToiZGVidWciLHZhbHVlOmZ1bmN0aW9uKGUpe319LHtrZXk6ImluZm8iLHZhbHVlOmZ1bmN0aW9uKGUpe319LHtrZXk6Indhcm4iLHZhbHVlOmZ1bmN0aW9uKGUpe319LHtrZXk6ImVycm9yIix2YWx1ZTpmdW5jdGlvbihlKXt9fSx7a2V5OiJhZHZhbmNlZExvZyIsdmFsdWU6ZnVuY3Rpb24oZSl7fX1dKSxlfSgpLHE9aSxCPXtERUJVRzoxMCxJTkZPOjIwLFdBUk46MzAsRVJST1I6NDAsQURWQU5DRURfTE9HOjUwfSxqPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3godGhpcyxlKSx0aGlzLnVwZGF0ZUxvZ2dlckNvbmZpZygpLHRoaXMuY29uc29sZUxvZ2dlcldyYXBwZXI9SCgpfXJldHVybiBVKGUsW3trZXk6IndyaXRlVG9DbGllbnRMb2dnZXIiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7aWYodGhpcy5oYXNDbGllbnRMb2dnZXIoKSlzd2l0Y2goZSl7Y2FzZSBCLkRFQlVHOnJldHVybiB0aGlzLl9jbGllbnRMb2dnZXIuZGVidWcodCl8fHQ7Y2FzZSBCLklORk86cmV0dXJuIHRoaXMuX2NsaWVudExvZ2dlci5pbmZvKHQpfHx0O2Nhc2UgQi5XQVJOOnJldHVybiB0aGlzLl9jbGllbnRMb2dnZXIud2Fybih0KXx8dDtjYXNlIEIuRVJST1I6cmV0dXJuIHRoaXMuX2NsaWVudExvZ2dlci5lcnJvcih0KXx8dDtjYXNlIEIuQURWQU5DRURfTE9HOnJldHVybiB0aGlzLl9hZHZhbmNlZExvZ1dyaXRlcj90aGlzLl9jbGllbnRMb2dnZXJbdGhpcy5fYWR2YW5jZWRMb2dXcml0ZXJdKHQpfHx0OiIifX19LHtrZXk6ImlzTGV2ZWxFbmFibGVkIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZT49dGhpcy5fbGV2ZWx9fSx7a2V5OiJoYXNDbGllbnRMb2dnZXIiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT10aGlzLl9jbGllbnRMb2dnZXJ9fSx7a2V5OiJnZXRMb2dnZXIiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWUucHJlZml4fHxxO3JldHVybiB0aGlzLl9sb2dzRGVzdGluYXRpb249PT1vP3RoaXMuY29uc29sZUxvZ2dlcldyYXBwZXI6bmV3IFcodCl9fSx7a2V5OiJ1cGRhdGVMb2dnZXJDb25maWciLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWV8fHt9O3RoaXMuX2xldmVsPXQubGV2ZWx8fEIuSU5GTyx0aGlzLl9hZHZhbmNlZExvZ1dyaXRlcj0id2FybiIsdC5hZHZhbmNlZExvZ1dyaXRlciYmKHRoaXMuX2FkdmFuY2VkTG9nV3JpdGVyPXQuYWR2YW5jZWRMb2dXcml0ZXIpLHQuY3VzdG9taXplZExvZ2dlciYmIm9iamVjdCI9PT1QKHQuY3VzdG9taXplZExvZ2dlcikmJih0aGlzLnVzZUNsaWVudExvZ2dlcj0hMCksdGhpcy5fY2xpZW50TG9nZ2VyPXQubG9nZ2VyfHx0aGlzLnNlbGVjdExvZ2dlcih0KSx0aGlzLl9sb2dzRGVzdGluYXRpb249Ik5VTEwiLHQuZGVidWcmJih0aGlzLl9sb2dzRGVzdGluYXRpb249byksdC5sb2dnZXImJih0aGlzLl9sb2dzRGVzdGluYXRpb249IkNMSUVOVF9MT0dHRVIiKX19LHtrZXk6InNlbGVjdExvZ2dlciIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY3VzdG9taXplZExvZ2dlciYmIm9iamVjdCI9PT1QKGUuY3VzdG9taXplZExvZ2dlcik/ZS5jdXN0b21pemVkTG9nZ2VyOmUudXNlRGVmYXVsdExvZ2dlcj8odGhpcy5jb25zb2xlTG9nZ2VyV3JhcHBlcj1IKCksdGhpcy5jb25zb2xlTG9nZ2VyV3JhcHBlcik6bnVsbH19XSksZX0oKSxWPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3godGhpcyxlKX1yZXR1cm4gVShlLFt7a2V5OiJkZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24oKXt9fSx7a2V5OiJpbmZvIix2YWx1ZTpmdW5jdGlvbigpe319LHtrZXk6Indhcm4iLHZhbHVlOmZ1bmN0aW9uKCl7fX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7fX0se2tleToiYWR2YW5jZWRMb2ciLHZhbHVlOmZ1bmN0aW9uKCl7fX1dKSxlfSgpLFc9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXt2YXIgbjtyZXR1cm4geCh0aGlzLHQpLChuPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIXR8fCJvYmplY3QiIT09UCh0KSYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiBlfShlKTp0fSh0aGlzLE8odCkuY2FsbCh0aGlzKSkpLnByZWZpeD1lfHxxLG59cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJkQoZSx0KX0odCxWKSxVKHQsW3trZXk6ImRlYnVnIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLl9sb2coQi5ERUJVRyx0KX19LHtrZXk6ImluZm8iLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuX2xvZyhCLklORk8sdCl9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLl9sb2coQi5XQVJOLHQpfX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuX2xvZyhCLkVSUk9SLHQpfX0se2tleToiYWR2YW5jZWRMb2ciLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuX2xvZyhCLkFEVkFOQ0VEX0xPRyx0KX19LHtrZXk6Il9zaG91bGRMb2ciLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBHLmhhc0NsaWVudExvZ2dlcigpJiZHLmlzTGV2ZWxFbmFibGVkKGUpfX0se2tleToiX3dyaXRlVG9DbGllbnRMb2dnZXIiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEcud3JpdGVUb0NsaWVudExvZ2dlcihlLHQpfX0se2tleToiX2xvZyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtpZih0aGlzLl9zaG91bGRMb2coZSkpe3ZhciBuPUcudXNlQ2xpZW50TG9nZ2VyP3Q6dGhpcy5fY29udmVydFRvU2luZ2xlU3RhdGVtZW50KHQsZSk7cmV0dXJuIHRoaXMuX3dyaXRlVG9DbGllbnRMb2dnZXIoZSxuKX19fSx7a2V5OiJfY29udmVydFRvU2luZ2xlU3RhdGVtZW50Iix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBEYXRlKERhdGUubm93KCkpLnRvSVNPU3RyaW5nKCkscj10aGlzLl9nZXRMb2dMZXZlbEJ5VmFsdWUodCksbz0iWyIuY29uY2F0KG4sIl1bIikuY29uY2F0KHIsIl0iKTt0aGlzLnByZWZpeCYmKG8rPXRoaXMucHJlZml4KyIgIiksdGhpcy5vcHRpb25zJiYodGhpcy5vcHRpb25zLnByZWZpeD9vKz0iICIrdGhpcy5vcHRpb25zLnByZWZpeCsiOiI6bys9IiIsdGhpcy5vcHRpb25zLmxvZ01ldGFEYXRhP28rPSIgTWV0YSBkYXRhOiAiK0pTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucy5sb2dNZXRhRGF0YSk6bys9IiIpO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgcz1lW2ldO28rPXRoaXMuX2NvbnZlcnRUb1N0cmluZyhzKSsiICJ9cmV0dXJuIG99fSx7a2V5OiJfZ2V0TG9nTGV2ZWxCeVZhbHVlIix2YWx1ZTpmdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZSAxMDpyZXR1cm4iREVCVUciO2Nhc2UgMjA6cmV0dXJuIklORk8iO2Nhc2UgMzA6cmV0dXJuIldBUk4iO2Nhc2UgNDA6cmV0dXJuIkVSUk9SIjtjYXNlIDUwOnJldHVybiJBRFZBTkNFRF9MT0cifX19LHtrZXk6Il9jb252ZXJ0VG9TdHJpbmciLHZhbHVlOmZ1bmN0aW9uKGUpe3RyeXtpZighZSlyZXR1cm4iIjtpZihOLmlzU3RyaW5nKGUpKXJldHVybiBlO2lmKE4uaXNPYmplY3QoZSkmJk4uaXNGdW5jdGlvbihlLnRvU3RyaW5nKSl7dmFyIHQ9ZS50b1N0cmluZygpO2lmKCJbb2JqZWN0IE9iamVjdF0iIT09dClyZXR1cm4gdH1yZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSl9Y2F0Y2godCl7cmV0dXJuIGNvbnNvbGUuZXJyb3IoIkVycm9yIHdoaWxlIGNvbnZlcnRpbmcgYXJndW1lbnQgdG8gc3RyaW5nIixlLHQpLCIifX19XSksdH0oKSxIPWZ1bmN0aW9uKCl7dmFyIGU9bmV3IFY7cmV0dXJuIGUuZGVidWc9ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gY29uc29sZS5kZWJ1Zy5hcHBseSh3aW5kb3cuY29uc29sZSxbXS5jb25jYXQodCkpfSxlLmluZm89ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gY29uc29sZS5pbmZvLmFwcGx5KHdpbmRvdy5jb25zb2xlLFtdLmNvbmNhdCh0KSl9LGUud2Fybj1mdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiBjb25zb2xlLndhcm4uYXBwbHkod2luZG93LmNvbnNvbGUsW10uY29uY2F0KHQpKX0sZS5lcnJvcj1mdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiBjb25zb2xlLmVycm9yLmFwcGx5KHdpbmRvdy5jb25zb2xlLFtdLmNvbmNhdCh0KSl9LGV9LEc9bmV3IGo7ZnVuY3Rpb24geihlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fXZhciBLPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MmUzOyFmdW5jdGlvbihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLGUpLHRoaXMubnVtQXR0ZW1wdHM9MCx0aGlzLmV4ZWN1dG9yPXQsdGhpcy5oYXNBY3RpdmVSZWNvbm5lY3Rpb249ITEsdGhpcy5kZWZhdWx0UmV0cnk9bn12YXIgdCxuO3JldHVybiB0PWUsKG49W3trZXk6InJldHJ5Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5oYXNBY3RpdmVSZWNvbm5lY3Rpb258fCh0aGlzLmhhc0FjdGl2ZVJlY29ubmVjdGlvbj0hMCxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2UuX2V4ZWN1dGUoKX0pLHRoaXMuX2dldERlbGF5KCkpKX19LHtrZXk6Il9leGVjdXRlIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuaGFzQWN0aXZlUmVjb25uZWN0aW9uPSExLHRoaXMuZXhlY3V0b3IoKSx0aGlzLm51bUF0dGVtcHRzKyt9fSx7a2V5OiJjb25uZWN0ZWQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5udW1BdHRlbXB0cz0wfX0se2tleToiX2dldERlbGF5Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPU1hdGgucG93KDIsdGhpcy5udW1BdHRlbXB0cykqdGhpcy5kZWZhdWx0UmV0cnk7cmV0dXJuIGU8PTNlND9lOjNlNH19LHtrZXk6ImdldElzQ29ubmVjdGVkIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiF0aGlzLm51bUF0dGVtcHRzfX1dKSYmeih0LnByb3RvdHlwZSxuKSxlfSgpO24uZCh0LCJhIiwoZnVuY3Rpb24oKXtyZXR1cm4gWX0pKTt2YXIgWD1mdW5jdGlvbigpe3ZhciBlPUcuZ2V0TG9nZ2VyKHtwcmVmaXg6aX0pLHQ9Ti5pc05ldHdvcmtPbmxpbmUoKSxuPXtwcmltYXJ5Om51bGwsc2Vjb25kYXJ5Om51bGx9LHI9e3JlY29ubmVjdFdlYlNvY2tldDohMCx3ZWJzb2NrZXRJbml0RmFpbGVkOiExLGV4cG9uZW50aWFsQmFja09mZlRpbWU6MWUzLGV4cG9uZW50aWFsVGltZW91dEhhbmRsZTpudWxsLGxpZmVUaW1lVGltZW91dEhhbmRsZTpudWxsLHdlYlNvY2tldEluaXRDaGVja2VyVGltZW91dElkOm51bGwsY29ublN0YXRlOm51bGx9LG89e2Nvbm5lY3RXZWJTb2NrZXRSZXRyeUNvdW50OjAsY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWU6bnVsbCxub09wZW5Db25uZWN0aW9uc1RpbWVzdGFtcDpudWxsfSxSPXtwZW5kaW5nUmVzcG9uc2U6ITEsaW50ZXJ2YWxIYW5kbGU6bnVsbH0saz17aW5pdEZhaWx1cmU6bmV3IFNldCxnZXRXZWJTb2NrZXRUcmFuc3BvcnQ6bnVsbCxzdWJzY3JpcHRpb25VcGRhdGU6bmV3IFNldCxzdWJzY3JpcHRpb25GYWlsdXJlOm5ldyBTZXQsdG9waWM6bmV3IE1hcCxhbGxNZXNzYWdlOm5ldyBTZXQsY29ubmVjdGlvbkdhaW46bmV3IFNldCxjb25uZWN0aW9uTG9zdDpuZXcgU2V0LGNvbm5lY3Rpb25PcGVuOm5ldyBTZXQsY29ubmVjdGlvbkNsb3NlOm5ldyBTZXR9LEw9e2Nvbm5Db25maWc6bnVsbCxwcm9taXNlSGFuZGxlOm51bGwscHJvbWlzZUNvbXBsZXRlZDohMH0sTz17c3Vic2NyaWJlZDpuZXcgU2V0LHBlbmRpbmc6bmV3IFNldCxzdWJzY3JpcHRpb25IaXN0b3J5Om5ldyBTZXR9LEQ9e3Jlc3BvbnNlQ2hlY2tJbnRlcnZhbElkOm51bGwscmVxdWVzdENvbXBsZXRlZDohMCxyZVN1YnNjcmliZUludGVydmFsSWQ6bnVsbCxjb25zZWN1dGl2ZUZhaWxlZFN1YnNjcmliZUF0dGVtcHRzOjAsY29uc2VjdXRpdmVOb1Jlc3BvbnNlUmVxdWVzdDowfSxQPW5ldyBLKChmdW5jdGlvbigpe3NlKCl9KSkseD1uZXcgU2V0KFtBLCJhd3MvdW5zdWJzY3JpYmUiLF9dKSxNPXNldEludGVydmFsKChmdW5jdGlvbigpe2lmKHQhPT1OLmlzTmV0d29ya09ubGluZSgpKXtpZighKHQ9Ti5pc05ldHdvcmtPbmxpbmUoKSkpcmV0dXJuIGUuYWR2YW5jZWRMb2cocyksdm9pZCB1ZShlLmluZm8ocykpO3ZhciBuPVcoKTt0JiYoIW58fEIobixXZWJTb2NrZXQuQ0xPU0lORyl8fEIobixXZWJTb2NrZXQuQ0xPU0VEKSkmJihlLmFkdmFuY2VkTG9nKGEpLHVlKGUuaW5mbyhhKSksc2UoKSl9fSksMjUwKSxVPWZ1bmN0aW9uKHQsbil7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt0cnl7dChuKX1jYXRjaCh0KXt1ZShlLmVycm9yKCJFcnJvciBleGVjdXRpbmcgY2FsbGJhY2siLHQpKX19KSl9LEY9ZnVuY3Rpb24oZSl7aWYobnVsbD09PWUpcmV0dXJuIk5VTEwiO3N3aXRjaChlLnJlYWR5U3RhdGUpe2Nhc2UgV2ViU29ja2V0LkNPTk5FQ1RJTkc6cmV0dXJuIkNPTk5FQ1RJTkciO2Nhc2UgV2ViU29ja2V0Lk9QRU46cmV0dXJuIk9QRU4iO2Nhc2UgV2ViU29ja2V0LkNMT1NJTkc6cmV0dXJuIkNMT1NJTkciO2Nhc2UgV2ViU29ja2V0LkNMT1NFRDpyZXR1cm4iQ0xPU0VEIjtkZWZhdWx0OnJldHVybiJVTkRFRklORUQifX0scT1mdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXToiIjt1ZShlLmRlYnVnKCJbIit0KyJdIFByaW1hcnkgV2ViU29ja2V0OiAiK0Yobi5wcmltYXJ5KSsiIHwgU2Vjb25kYXJ5IFdlYlNvY2tldDogIitGKG4uc2Vjb25kYXJ5KSkpfSxCPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJmUucmVhZHlTdGF0ZT09PXR9LGo9ZnVuY3Rpb24oZSl7cmV0dXJuIEIoZSxXZWJTb2NrZXQuT1BFTil9LFY9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PT1lfHx2b2lkIDA9PT1lLnJlYWR5U3RhdGV8fEIoZSxXZWJTb2NrZXQuQ0xPU0VEKX0sVz1mdW5jdGlvbigpe3JldHVybiBudWxsIT09bi5zZWNvbmRhcnk/bi5zZWNvbmRhcnk6bi5wcmltYXJ5fSxIPWZ1bmN0aW9uKCl7cmV0dXJuIGooVygpKX0sej1mdW5jdGlvbigpe2lmKFIucGVuZGluZ1Jlc3BvbnNlKXJldHVybiBlLmFkdmFuY2VkTG9nKHUpLHVlKGUud2Fybih1KSksY2xlYXJJbnRlcnZhbChSLmludGVydmFsSGFuZGxlKSxSLnBlbmRpbmdSZXNwb25zZT0hMSx2b2lkIHNlKCk7SCgpPyh1ZShlLmRlYnVnKCJTZW5kaW5nIGhlYXJ0YmVhdCIpKSxXKCkuc2VuZChvZShfKSksUi5wZW5kaW5nUmVzcG9uc2U9ITApOihlLmFkdmFuY2VkTG9nKGwpLHVlKGUud2FybihsKSkscSgic2VuZEhlYXJ0QmVhdCIpLHNlKCkpfSxYPWZ1bmN0aW9uKCl7ZS5hZHZhbmNlZExvZygiUmVzZXQgV2Vic29ja2V0IHN0YXRlIiksci5leHBvbmVudGlhbEJhY2tPZmZUaW1lPTFlMyxSLnBlbmRpbmdSZXNwb25zZT0hMSxyLnJlY29ubmVjdFdlYlNvY2tldD0hMCxjbGVhclRpbWVvdXQoci5saWZlVGltZVRpbWVvdXRIYW5kbGUpLGNsZWFySW50ZXJ2YWwoUi5pbnRlcnZhbEhhbmRsZSksY2xlYXJUaW1lb3V0KHIuZXhwb25lbnRpYWxUaW1lb3V0SGFuZGxlKSxjbGVhclRpbWVvdXQoci53ZWJTb2NrZXRJbml0Q2hlY2tlclRpbWVvdXRJZCl9LFk9ZnVuY3Rpb24oKXtELmNvbnNlY3V0aXZlRmFpbGVkU3Vic2NyaWJlQXR0ZW1wdHM9MCxELmNvbnNlY3V0aXZlTm9SZXNwb25zZVJlcXVlc3Q9MCxjbGVhckludGVydmFsKEQucmVzcG9uc2VDaGVja0ludGVydmFsSWQpLGNsZWFySW50ZXJ2YWwoRC5yZVN1YnNjcmliZUludGVydmFsSWQpfSwkPWZ1bmN0aW9uKCl7by5jb25uZWN0V2ViU29ja2V0UmV0cnlDb3VudD0wLG8uY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWU9bnVsbCxvLm5vT3BlbkNvbm5lY3Rpb25zVGltZXN0YW1wPW51bGx9LEo9ZnVuY3Rpb24oKXtQLmNvbm5lY3RlZCgpO3RyeXtlLmFkdmFuY2VkTG9nKHApLHVlKGUuaW5mbyhwKSkscSgid2ViU29ja2V0T25PcGVuIiksbnVsbCE9PXIuY29ublN0YXRlJiZyLmNvbm5TdGF0ZSE9PXd8fFUoay5jb25uZWN0aW9uR2Fpbiksci5jb25uU3RhdGU9ImNvbm5lY3RlZCI7dmFyIHQ9RGF0ZS5ub3coKTtVKGsuY29ubmVjdGlvbk9wZW4se2Nvbm5lY3RXZWJTb2NrZXRSZXRyeUNvdW50Om8uY29ubmVjdFdlYlNvY2tldFJldHJ5Q291bnQsY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWU6by5jb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZSxub09wZW5Db25uZWN0aW9uc1RpbWVzdGFtcDpvLm5vT3BlbkNvbm5lY3Rpb25zVGltZXN0YW1wLGNvbm5lY3Rpb25Fc3RhYmxpc2hlZFRpbWU6dCx0aW1lVG9Db25uZWN0OnQtby5jb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZSx0aW1lV2l0aG91dENvbm5lY3Rpb246by5ub09wZW5Db25uZWN0aW9uc1RpbWVzdGFtcD90LW8ubm9PcGVuQ29ubmVjdGlvbnNUaW1lc3RhbXA6bnVsbH0pLCQoKSxYKCksVygpLm9wZW5UaW1lc3RhbXA9RGF0ZS5ub3coKSwwPT09Ty5zdWJzY3JpYmVkLnNpemUmJmoobi5zZWNvbmRhcnkpJiZ0ZShuLnByaW1hcnksIltQcmltYXJ5IFdlYlNvY2tldF0gQ2xvc2luZyBXZWJTb2NrZXQiKSwoTy5zdWJzY3JpYmVkLnNpemU+MHx8Ty5wZW5kaW5nLnNpemU+MCkmJihqKG4uc2Vjb25kYXJ5KSYmdWUoZS5pbmZvKCJTdWJzY3JpYmluZyBzZWNvbmRhcnkgd2Vic29ja2V0IHRvIHRvcGljcyBvZiBwcmltYXJ5IHdlYnNvY2tldCIpKSxPLnN1YnNjcmliZWQuZm9yRWFjaCgoZnVuY3Rpb24oZSl7Ty5zdWJzY3JpcHRpb25IaXN0b3J5LmFkZChlKSxPLnBlbmRpbmcuYWRkKGUpfSkpLE8uc3Vic2NyaWJlZC5jbGVhcigpLGVlKCkpLHooKSxSLmludGVydmFsSGFuZGxlPXNldEludGVydmFsKHosMWU0KTt2YXIgaT0xZTMqTC5jb25uQ29uZmlnLndlYlNvY2tldFRyYW5zcG9ydC50cmFuc3BvcnRMaWZlVGltZUluU2Vjb25kczt1ZShlLmRlYnVnKCJTY2hlZHVsaW5nIFdlYlNvY2tldCBtYW5hZ2VyIHJlY29ubmVjdGlvbiwgYWZ0ZXIgZGVsYXkgIitpKyIgbXMiKSksci5saWZlVGltZVRpbWVvdXRIYW5kbGU9c2V0VGltZW91dCgoZnVuY3Rpb24oKXt1ZShlLmRlYnVnKCJTdGFydGluZyBzY2hlZHVsZWQgV2ViU29ja2V0IG1hbmFnZXIgcmVjb25uZWN0aW9uIikpLHNlKCl9KSxpKX1jYXRjaCh0KXt1ZShlLmVycm9yKCJFcnJvciBhZnRlciBlc3RhYmxpc2hpbmcgV2ViU29ja2V0IGNvbm5lY3Rpb24iLHQpKX19LFE9ZnVuY3Rpb24odCl7cSgid2ViU29ja2V0T25FcnJvciIpLGUuYWR2YW5jZWRMb2coaCxKU09OLnN0cmluZ2lmeSh0KSksdWUoZS5lcnJvcihoLEpTT04uc3RyaW5naWZ5KHQpKSksUC5nZXRJc0Nvbm5lY3RlZCgpP3NlKCk6UC5yZXRyeSgpfSxaPWZ1bmN0aW9uKHQpe3ZhciByPUpTT04ucGFyc2UodC5kYXRhKTtzd2l0Y2goci50b3BpYyl7Y2FzZSBBOmlmKHVlKGUuZGVidWcoIlN1YnNjcmlwdGlvbiBNZXNzYWdlIHJlY2VpdmVkIGZyb20gd2ViU29ja2V0IHNlcnZlciIsdC5kYXRhKSksRC5yZXF1ZXN0Q29tcGxldGVkPSEwLEQuY29uc2VjdXRpdmVOb1Jlc3BvbnNlUmVxdWVzdD0wLCJzdWNjZXNzIj09PXIuY29udGVudC5zdGF0dXMpRC5jb25zZWN1dGl2ZUZhaWxlZFN1YnNjcmliZUF0dGVtcHRzPTAsci5jb250ZW50LnRvcGljcy5mb3JFYWNoKChmdW5jdGlvbihlKXtPLnN1YnNjcmlwdGlvbkhpc3RvcnkuZGVsZXRlKGUpLE8ucGVuZGluZy5kZWxldGUoZSksTy5zdWJzY3JpYmVkLmFkZChlKX0pKSwwPT09Ty5zdWJzY3JpcHRpb25IaXN0b3J5LnNpemU/aihuLnNlY29uZGFyeSkmJih1ZShlLmluZm8oIlN1Y2Nlc3NmdWxseSBzdWJzY3JpYmVkIHNlY29uZGFyeSB3ZWJzb2NrZXQgdG8gYWxsIHRvcGljcyBvZiBwcmltYXJ5IHdlYnNvY2tldCIpKSx0ZShuLnByaW1hcnksIltQcmltYXJ5IFdlYlNvY2tldF0gQ2xvc2luZyBXZWJTb2NrZXQiKSk6ZWUoKSxVKGsuc3Vic2NyaXB0aW9uVXBkYXRlLHIpO2Vsc2V7aWYoY2xlYXJJbnRlcnZhbChELnJlU3Vic2NyaWJlSW50ZXJ2YWxJZCksKytELmNvbnNlY3V0aXZlRmFpbGVkU3Vic2NyaWJlQXR0ZW1wdHMsNT09PUQuY29uc2VjdXRpdmVGYWlsZWRTdWJzY3JpYmVBdHRlbXB0cylyZXR1cm4gVShrLnN1YnNjcmlwdGlvbkZhaWx1cmUsciksdm9pZChELmNvbnNlY3V0aXZlRmFpbGVkU3Vic2NyaWJlQXR0ZW1wdHM9MCk7RC5yZVN1YnNjcmliZUludGVydmFsSWQ9c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7ZWUoKX0pLDUwMCl9YnJlYWs7Y2FzZSBfOnVlKGUuZGVidWcoIkhlYXJ0YmVhdCByZXNwb25zZSByZWNlaXZlZCIpKSxSLnBlbmRpbmdSZXNwb25zZT0hMTticmVhaztkZWZhdWx0OmlmKHIudG9waWMpe2lmKGUuYWR2YW5jZWRMb2coVCxyLnRvcGljKSx1ZShlLmRlYnVnKFQrci50b3BpYykpLGoobi5wcmltYXJ5KSYmaihuLnNlY29uZGFyeSkmJjA9PT1PLnN1YnNjcmlwdGlvbkhpc3Rvcnkuc2l6ZSYmdGhpcz09PW4ucHJpbWFyeSlyZXR1cm4gdm9pZCB1ZShlLndhcm4oIklnbm9yaW5nIE1lc3NhZ2UgZm9yIFRvcGljICIrci50b3BpYysiLCB0byBhdm9pZCBkdXBsaWNhdGVzIikpO2lmKDA9PT1rLmFsbE1lc3NhZ2Uuc2l6ZSYmMD09PWsudG9waWMuc2l6ZSlyZXR1cm4gdm9pZCB1ZShlLndhcm4oIk5vIHJlZ2lzdGVyZWQgY2FsbGJhY2sgbGlzdGVuZXIgZm9yIFRvcGljIixyLnRvcGljKSk7ZS5hZHZhbmNlZExvZygiV2Vic29ja2V0TWFuYWdlciBpbnZva2UgY2FsbGJhY2tzIGZvciB0b3BpYyBzdWNjZXNzICIsci50b3BpYyksVShrLmFsbE1lc3NhZ2Usciksay50b3BpYy5oYXMoci50b3BpYykmJlUoay50b3BpYy5nZXQoci50b3BpYykscil9ZWxzZSByLm1lc3NhZ2U/KGUuYWR2YW5jZWRMb2coQyxyKSx1ZShlLndhcm4oQyxyKSkpOihlLmFkdmFuY2VkTG9nKEksciksdWUoZS53YXJuKEkscikpKX19LGVlPWZ1bmN0aW9uIHQoKXtpZihELmNvbnNlY3V0aXZlTm9SZXNwb25zZVJlcXVlc3Q+MylyZXR1cm4gdWUoZS53YXJuKCJJZ25vcmluZyBzdWJzY3JpYmVQZW5kaW5nVG9waWNzIHNpbmNlIHdlIGhhdmUgZXhoYXVzdGVkIG1heCBzdWJzY3JpcHRpb24gcmV0cmllcyB3aXRoIG5vIHJlc3BvbnNlIikpLHZvaWQgVShrLnN1YnNjcmlwdGlvbkZhaWx1cmUsTi5nZXRTdWJzY3JpcHRpb25SZXNwb25zZShBLCExLEFycmF5LmZyb20oTy5wZW5kaW5nKSkpO0goKT8wIT09QXJyYXkuZnJvbShPLnBlbmRpbmcpLmxlbmd0aCYmKGNsZWFySW50ZXJ2YWwoRC5yZXNwb25zZUNoZWNrSW50ZXJ2YWxJZCksVygpLnNlbmQob2UoQSx7dG9waWNzOkFycmF5LmZyb20oTy5wZW5kaW5nKX0pKSxELnJlcXVlc3RDb21wbGV0ZWQ9ITEsRC5yZXNwb25zZUNoZWNrSW50ZXJ2YWxJZD1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtELnJlcXVlc3RDb21wbGV0ZWR8fCgrK0QuY29uc2VjdXRpdmVOb1Jlc3BvbnNlUmVxdWVzdCx0KCkpfSksMWUzKSk6dWUoZS53YXJuKCJJZ25vcmluZyBzdWJzY3JpYmVQZW5kaW5nVG9waWNzIGNhbGwgc2luY2UgRGVmYXVsdCBXZWJTb2NrZXQgaXMgbm90IG9wZW4iKSl9LHRlPWZ1bmN0aW9uKHQsbil7Qih0LFdlYlNvY2tldC5DT05ORUNUSU5HKXx8Qih0LFdlYlNvY2tldC5PUEVOKT90LmNsb3NlKDFlMyxuKTp1ZShlLndhcm4oIklnbm9yaW5nIFdlYlNvY2tldCBDbG9zZSByZXF1ZXN0LCBXZWJTb2NrZXQgU3RhdGU6ICIrRih0KSkpfSxuZT1mdW5jdGlvbihlKXt0ZShuLnByaW1hcnksIltQcmltYXJ5XSBXZWJTb2NrZXQgIitlKSx0ZShuLnNlY29uZGFyeSwiW1NlY29uZGFyeV0gV2ViU29ja2V0ICIrZSl9LHJlPWZ1bmN0aW9uKHQpe1goKSxZKCksZS5hZHZhbmNlZExvZyhtLHQpLHVlKGUuZXJyb3IobSkpLHIud2Vic29ja2V0SW5pdEZhaWxlZD0hMCxuZSgiVGVybWluYXRpbmcgV2ViU29ja2V0IE1hbmFnZXIiKSxjbGVhckludGVydmFsKE0pLFUoay5pbml0RmFpbHVyZSx7Y29ubmVjdFdlYlNvY2tldFJldHJ5Q291bnQ6by5jb25uZWN0V2ViU29ja2V0UmV0cnlDb3VudCxjb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZTpvLmNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lLHJlYXNvbjp0fSksJCgpfSxvZT1mdW5jdGlvbihlLHQpe3JldHVybiBKU09OLnN0cmluZ2lmeSh7dG9waWM6ZSxjb250ZW50OnR9KX0saWU9ZnVuY3Rpb24odCl7cmV0dXJuISEoTi5pc09iamVjdCh0KSYmTi5pc09iamVjdCh0LndlYlNvY2tldFRyYW5zcG9ydCkmJk4uaXNOb25FbXB0eVN0cmluZyh0LndlYlNvY2tldFRyYW5zcG9ydC51cmwpJiZOLnZhbGlkV1NVcmwodC53ZWJTb2NrZXRUcmFuc3BvcnQudXJsKSYmMWUzKnQud2ViU29ja2V0VHJhbnNwb3J0LnRyYW5zcG9ydExpZmVUaW1lSW5TZWNvbmRzPj0zZTUpfHwodWUoZS5lcnJvcigiSW52YWxpZCBXZWJTb2NrZXQgQ29ubmVjdGlvbiBDb25maWd1cmF0aW9uIix0KSksITEpfSxzZT1mdW5jdGlvbigpe2lmKCFOLmlzTmV0d29ya09ubGluZSgpKXJldHVybiBlLmFkdmFuY2VkTG9nKGMpLHZvaWQgdWUoZS5pbmZvKGMpKTtpZihyLndlYnNvY2tldEluaXRGYWlsZWQpdWUoZS5kZWJ1ZygiV2ViU29ja2V0IEluaXQgaGFkIGZhaWxlZCwgaWdub3JpbmcgdGhpcyBnZXRXZWJTb2NrZXRDb25uQ29uZmlnIHJlcXVlc3QiKSk7ZWxzZXtpZihMLnByb21pc2VDb21wbGV0ZWQpcmV0dXJuIFgoKSxlLmFkdmFuY2VkTG9nKHYpLHVlKGUuaW5mbyh2KSksby5jb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZT1vLmNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lfHxEYXRlLm5vdygpLEwucHJvbWlzZUNvbXBsZXRlZD0hMSxMLnByb21pc2VIYW5kbGU9ay5nZXRXZWJTb2NrZXRUcmFuc3BvcnQoKSxMLnByb21pc2VIYW5kbGUudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIEwucHJvbWlzZUNvbXBsZXRlZD0hMCxlLmFkdmFuY2VkTG9nKHkpLHVlKGUuZGVidWcoeSx0KSksaWUodCk/KEwuY29ubkNvbmZpZz10LEwuY29ubkNvbmZpZy51cmxDb25uVmFsaWRUaW1lPURhdGUubm93KCkrODVlMyxhZSgpKToocmUoIkludmFsaWQgV2ViU29ja2V0IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbjogIit0KSx7d2ViU29ja2V0Q29ubmVjdGlvbkZhaWxlZDohMH0pfSksKGZ1bmN0aW9uKHQpe3JldHVybiBMLnByb21pc2VDb21wbGV0ZWQ9ITAsZS5hZHZhbmNlZExvZyhFKSx1ZShlLmVycm9yKEUsdCkpLE4uaXNOZXR3b3JrRmFpbHVyZSh0KT8oZS5hZHZhbmNlZExvZyhTK0pTT04uc3RyaW5naWZ5KHQpKSx1ZShlLmluZm8oUytKU09OLnN0cmluZ2lmeSh0KSkpLFAucmV0cnkoKSk6cmUoIkZhaWxlZCB0byBmZXRjaCB3ZWJTb2NrZXQgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uOiAiK0pTT04uc3RyaW5naWZ5KHQpKSx7d2ViU29ja2V0Q29ubmVjdGlvbkZhaWxlZDohMH19KSk7dWUoZS5kZWJ1ZygiVGhlcmUgaXMgYW4gb25nb2luZyBnZXRXZWJTb2NrZXRDb25uQ29uZmlnIHJlcXVlc3QsIHRoaXMgcmVxdWVzdCB3aWxsIGJlIGlnbm9yZWQiKSl9fSxhZT1mdW5jdGlvbigpe2lmKHIud2Vic29ja2V0SW5pdEZhaWxlZClyZXR1cm4gdWUoZS5pbmZvKCJ3ZWItc29ja2V0IGluaXRpYWxpemluZyBoYWQgZmFpbGVkLCBhYm9ydGluZyByZS1pbml0IikpLHt3ZWJTb2NrZXRDb25uZWN0aW9uRmFpbGVkOiEwfTtpZighTi5pc05ldHdvcmtPbmxpbmUoKSlyZXR1cm4gdWUoZS53YXJuKCJTeXN0ZW0gaXMgb2ZmbGluZSBhYm9ydGluZyB3ZWItc29ja2V0IGluaXQiKSkse3dlYlNvY2tldENvbm5lY3Rpb25GYWlsZWQ6ITB9O2UuYWR2YW5jZWRMb2coYiksdWUoZS5pbmZvKGIpKSxxKCJpbml0V2ViU29ja2V0Iik7dHJ5e2lmKGllKEwuY29ubkNvbmZpZykpe3ZhciB0PW51bGw7cmV0dXJuIGoobi5wcmltYXJ5KT8odWUoZS5kZWJ1ZygiUHJpbWFyeSBTb2NrZXQgY29ubmVjdGlvbiBpcyBhbHJlYWR5IG9wZW4iKSksQihuLnNlY29uZGFyeSxXZWJTb2NrZXQuQ09OTkVDVElORyl8fCh1ZShlLmRlYnVnKCJFc3RhYmxpc2hpbmcgYSBzZWNvbmRhcnkgd2ViLXNvY2tldCBjb25uZWN0aW9uIikpLFAubnVtQXR0ZW1wdHM9MCxuLnNlY29uZGFyeT1jZSgpKSx0PW4uc2Vjb25kYXJ5KTooQihuLnByaW1hcnksV2ViU29ja2V0LkNPTk5FQ1RJTkcpfHwodWUoZS5kZWJ1ZygiRXN0YWJsaXNoaW5nIGEgcHJpbWFyeSB3ZWItc29ja2V0IGNvbm5lY3Rpb24iKSksbi5wcmltYXJ5PWNlKCkpLHQ9bi5wcmltYXJ5KSxyLndlYlNvY2tldEluaXRDaGVja2VyVGltZW91dElkPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aih0KXx8ZnVuY3Rpb24oKXtvLmNvbm5lY3RXZWJTb2NrZXRSZXRyeUNvdW50Kys7dmFyIHQ9Ti5hZGRKaXR0ZXIoci5leHBvbmVudGlhbEJhY2tPZmZUaW1lLC4zKTtEYXRlLm5vdygpK3Q8PUwuY29ubkNvbmZpZy51cmxDb25uVmFsaWRUaW1lPyhlLmFkdmFuY2VkTG9nKGYpLHVlKGUuZGVidWcoZit0KyIgbXMiKSksci5leHBvbmVudGlhbFRpbWVvdXRIYW5kbGU9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtyZXR1cm4gYWUoKX0pLHQpLHIuZXhwb25lbnRpYWxCYWNrT2ZmVGltZSo9Mik6KGUuYWR2YW5jZWRMb2coZyksdWUoZS53YXJuKGcpKSxzZSgpKX0oKX0pLDFlMykse3dlYlNvY2tldENvbm5lY3Rpb25GYWlsZWQ6ITF9fX1jYXRjaCh0KXtyZXR1cm4gdWUoZS5lcnJvcigiRXJyb3IgSW5pdGlhbGl6aW5nIHdlYi1zb2NrZXQtbWFuYWdlciIsdCkpLHJlKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBuZXcgV2ViU29ja2V0OiAiK3QubWVzc2FnZSkse3dlYlNvY2tldENvbm5lY3Rpb25GYWlsZWQ6ITB9fX0sY2U9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgV2ViU29ja2V0KEwuY29ubkNvbmZpZy53ZWJTb2NrZXRUcmFuc3BvcnQudXJsKTtyZXR1cm4gdC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIixKKSx0LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLFopLHQuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLFEpLHQuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLChmdW5jdGlvbihpKXtyZXR1cm4gZnVuY3Rpb24odCxpKXtlLmFkdmFuY2VkTG9nKGQsSlNPTi5zdHJpbmdpZnkodCkpLHVlKGUuaW5mbyhkLEpTT04uc3RyaW5naWZ5KHQpKSkscSgid2ViU29ja2V0T25DbG9zZSBiZWZvcmUtY2xlYW51cCIpLFUoay5jb25uZWN0aW9uQ2xvc2Use29wZW5UaW1lc3RhbXA6aS5vcGVuVGltZXN0YW1wLGNsb3NlVGltZXN0YW1wOkRhdGUubm93KCksY29ubmVjdGlvbkR1cmF0aW9uOkRhdGUubm93KCktaS5vcGVuVGltZXN0YW1wLGNvZGU6dC5jb2RlLHJlYXNvbjp0LnJlYXNvbn0pLFYobi5wcmltYXJ5KSYmKG4ucHJpbWFyeT1udWxsKSxWKG4uc2Vjb25kYXJ5KSYmKG4uc2Vjb25kYXJ5PW51bGwpLHIucmVjb25uZWN0V2ViU29ja2V0JiYoaihuLnByaW1hcnkpfHxqKG4uc2Vjb25kYXJ5KT9WKG4ucHJpbWFyeSkmJmoobi5zZWNvbmRhcnkpJiYodWUoZS5pbmZvKCJbUHJpbWFyeV0gV2ViU29ja2V0IENsZWFubHkgQ2xvc2VkIikpLG4ucHJpbWFyeT1uLnNlY29uZGFyeSxuLnNlY29uZGFyeT1udWxsKToodWUoZS53YXJuKCJOZWl0aGVyIHByaW1hcnkgd2Vic29ja2V0IGFuZCBub3Igc2Vjb25kYXJ5IHdlYnNvY2tldCBoYXZlIG9wZW4gY29ubmVjdGlvbnMsIGF0dGVtcHRpbmcgdG8gcmUtZXN0YWJsaXNoIGNvbm5lY3Rpb24iKSksci5jb25uU3RhdGU9PT13P3VlKGUuaW5mbygiSWdub3JpbmcgY29ubmVjdGlvbkxvc3QgY2FsbGJhY2sgaW52b2NhdGlvbiIpKTooVShrLmNvbm5lY3Rpb25Mb3N0LHtvcGVuVGltZXN0YW1wOmkub3BlblRpbWVzdGFtcCxjbG9zZVRpbWVzdGFtcDpEYXRlLm5vdygpLGNvbm5lY3Rpb25EdXJhdGlvbjpEYXRlLm5vdygpLWkub3BlblRpbWVzdGFtcCxjb2RlOnQuY29kZSxyZWFzb246dC5yZWFzb259KSxvLm5vT3BlbkNvbm5lY3Rpb25zVGltZXN0YW1wPURhdGUubm93KCkpLHIuY29ublN0YXRlPXcsc2UoKSkscSgid2ViU29ja2V0T25DbG9zZSBhZnRlci1jbGVhbnVwIikpfShpLHQpfSkpLHR9LHVlPWZ1bmN0aW9uKGUpe3JldHVybiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlciYmZS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGV9O3RoaXMuaW5pdD1mdW5jdGlvbih0KXtpZihOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKHQpLCJ0cmFuc3BvcnRIYW5kbGUgbXVzdCBiZSBhIGZ1bmN0aW9uIiksbnVsbD09PWsuZ2V0V2ViU29ja2V0VHJhbnNwb3J0KXJldHVybiBrLmdldFdlYlNvY2tldFRyYW5zcG9ydD10LHNlKCk7dWUoZS53YXJuKCJXZWIgU29ja2V0IE1hbmFnZXIgd2FzIGFscmVhZHkgaW5pdGlhbGl6ZWQiKSl9LHRoaXMub25Jbml0RmFpbHVyZT1mdW5jdGlvbih0KXtyZXR1cm4gZS5hZHZhbmNlZExvZygiSW5pdGlhbGl6aW5nIFdlYnNvY2tldCBNYW5hZ2VyIEZhaWxlZCEiKSxOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKHQpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxrLmluaXRGYWlsdXJlLmFkZCh0KSxyLndlYnNvY2tldEluaXRGYWlsZWQmJnQoKSxmdW5jdGlvbigpe3JldHVybiBrLmluaXRGYWlsdXJlLmRlbGV0ZSh0KX19LHRoaXMub25Db25uZWN0aW9uT3Blbj1mdW5jdGlvbih0KXtyZXR1cm4gZS5hZHZhbmNlZExvZygiV2Vic29ja2V0IGNvbm5lY3Rpb24gb3BlbiIpLE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24odCksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLGsuY29ubmVjdGlvbk9wZW4uYWRkKHQpLGZ1bmN0aW9uKCl7cmV0dXJuIGsuY29ubmVjdGlvbk9wZW4uZGVsZXRlKHQpfX0sdGhpcy5vbkNvbm5lY3Rpb25DbG9zZT1mdW5jdGlvbih0KXtyZXR1cm4gZS5hZHZhbmNlZExvZygiV2Vic29ja2V0IGNvbm5lY3Rpb24gY2xvc2UiKSxOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKHQpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxrLmNvbm5lY3Rpb25DbG9zZS5hZGQodCksZnVuY3Rpb24oKXtyZXR1cm4gay5jb25uZWN0aW9uQ2xvc2UuZGVsZXRlKHQpfX0sdGhpcy5vbkNvbm5lY3Rpb25HYWluPWZ1bmN0aW9uKHQpe3JldHVybiBlLmFkdmFuY2VkTG9nKCJXZWJzb2NrZXQgY29ubmVjdGlvbiBnYWluIiksTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbih0KSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksay5jb25uZWN0aW9uR2Fpbi5hZGQodCksSCgpJiZ0KCksZnVuY3Rpb24oKXtyZXR1cm4gay5jb25uZWN0aW9uR2Fpbi5kZWxldGUodCl9fSx0aGlzLm9uQ29ubmVjdGlvbkxvc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGUuYWR2YW5jZWRMb2coIldlYnNvY2tldCBjb25uZWN0aW9uIGxvc3QiKSxOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKHQpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxrLmNvbm5lY3Rpb25Mb3N0LmFkZCh0KSxyLmNvbm5TdGF0ZT09PXcmJnQoKSxmdW5jdGlvbigpe3JldHVybiBrLmNvbm5lY3Rpb25Mb3N0LmRlbGV0ZSh0KX19LHRoaXMub25TdWJzY3JpcHRpb25VcGRhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24oZSksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLGsuc3Vic2NyaXB0aW9uVXBkYXRlLmFkZChlKSxmdW5jdGlvbigpe3JldHVybiBrLnN1YnNjcmlwdGlvblVwZGF0ZS5kZWxldGUoZSl9fSx0aGlzLm9uU3Vic2NyaXB0aW9uRmFpbHVyZT1mdW5jdGlvbih0KXtyZXR1cm4gZS5hZHZhbmNlZExvZygiV2Vic29ja2V0IHN1YnNjcmlwdGlvbiBmYWlsdXJlIiksTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbih0KSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksay5zdWJzY3JpcHRpb25GYWlsdXJlLmFkZCh0KSxmdW5jdGlvbigpe3JldHVybiBrLnN1YnNjcmlwdGlvbkZhaWx1cmUuZGVsZXRlKHQpfX0sdGhpcy5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gTi5hc3NlcnROb3ROdWxsKGUsInRvcGljTmFtZSIpLE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24odCksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLGsudG9waWMuaGFzKGUpP2sudG9waWMuZ2V0KGUpLmFkZCh0KTprLnRvcGljLnNldChlLG5ldyBTZXQoW3RdKSksZnVuY3Rpb24oKXtyZXR1cm4gay50b3BpYy5nZXQoZSkuZGVsZXRlKHQpfX0sdGhpcy5vbkFsbE1lc3NhZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24oZSksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLGsuYWxsTWVzc2FnZS5hZGQoZSksZnVuY3Rpb24oKXtyZXR1cm4gay5hbGxNZXNzYWdlLmRlbGV0ZShlKX19LHRoaXMuc3Vic2NyaWJlVG9waWNzPWZ1bmN0aW9uKGUpe04uYXNzZXJ0Tm90TnVsbChlLCJ0b3BpY3MiKSxOLmFzc2VydElzTGlzdChlKSxlLmZvckVhY2goKGZ1bmN0aW9uKGUpe08uc3Vic2NyaWJlZC5oYXMoZSl8fE8ucGVuZGluZy5hZGQoZSl9KSksRC5jb25zZWN1dGl2ZU5vUmVzcG9uc2VSZXF1ZXN0PTAsZWUoKX0sdGhpcy5zZW5kTWVzc2FnZT1mdW5jdGlvbih0KXtpZihOLmFzc2VydElzT2JqZWN0KHQsInBheWxvYWQiKSx2b2lkIDA9PT10LnRvcGljfHx4Lmhhcyh0LnRvcGljKSl1ZShlLndhcm4oIkNhbm5vdCBzZW5kIG1lc3NhZ2UsIEludmFsaWQgdG9waWMiLHQpKTtlbHNle3RyeXt0PUpTT04uc3RyaW5naWZ5KHQpfWNhdGNoKG4pe3JldHVybiB2b2lkIHVlKGUud2FybigiRXJyb3Igc3RyaW5naWZ5IG1lc3NhZ2UiLHQpKX1IKCk/VygpLnNlbmQodCk6dWUoZS53YXJuKCJDYW5ub3Qgc2VuZCBtZXNzYWdlLCB3ZWIgc29ja2V0IGNvbm5lY3Rpb24gaXMgbm90IG9wZW4iKSl9fSx0aGlzLmNsb3NlV2ViU29ja2V0PWZ1bmN0aW9uKCl7WCgpLFkoKSxyLnJlY29ubmVjdFdlYlNvY2tldD0hMSxjbGVhckludGVydmFsKE0pLG5lKCJVc2VyIHJlcXVlc3QgdG8gY2xvc2UgV2ViU29ja2V0Iil9LHRoaXMudGVybWluYXRlV2ViU29ja2V0TWFuYWdlcj1yZX0sWT17Y3JlYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSxzZXRHbG9iYWxDb25maWc6ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5sb2dnZXJDb25maWc7Ry51cGRhdGVMb2dnZXJDb25maWcodCl9LExvZ0xldmVsOkIsTG9nZ2VyOkZ9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI7IWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBvPXtub3Rfc3RyaW5nOi9bXnNdLyxub3RfYm9vbDovW150XS8sbm90X3R5cGU6L1teVF0vLG5vdF9wcmltaXRpdmU6L1tedl0vLG51bWJlcjovW2RpZWZnXS8sbnVtZXJpY19hcmc6L1tiY2RpZWZndXhYXS8sanNvbjovW2pdLyxub3RfanNvbjovW15qXS8sdGV4dDovXlteXHgyNV0rLyxtb2R1bG86L15ceDI1ezJ9LyxwbGFjZWhvbGRlcjovXlx4MjUoPzooWzEtOV1cZCopXCR8XCgoW14pXSspXCkpPyhcKyk/KDB8J1teJF0pPygtKT8oXGQrKT8oPzpcLihcZCspKT8oW2ItZ2lqb3N0VHV2eFhdKS8sa2V5Oi9eKFthLXpfXVthLXpfXGRdKikvaSxrZXlfYWNjZXNzOi9eXC4oW2Etel9dW2Etel9cZF0qKS9pLGluZGV4X2FjY2VzczovXlxbKFxkKylcXS8sc2lnbjovXlsrLV0vfTtmdW5jdGlvbiBpKGUpe3JldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuLHIscyxhLGMsdSxsLHAsZCxoPTEsZj1lLmxlbmd0aCxnPSIiO2ZvcihyPTA7cjxmO3IrKylpZigic3RyaW5nIj09dHlwZW9mIGVbcl0pZys9ZVtyXTtlbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgZVtyXSl7aWYoKGE9ZVtyXSkua2V5cylmb3Iobj10W2hdLHM9MDtzPGEua2V5cy5sZW5ndGg7cysrKXtpZihudWxsPT1uKXRocm93IG5ldyBFcnJvcihpKCdbc3ByaW50Zl0gQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSAiJXMiIG9mIHVuZGVmaW5lZCB2YWx1ZSAiJXMiJyxhLmtleXNbc10sYS5rZXlzW3MtMV0pKTtuPW5bYS5rZXlzW3NdXX1lbHNlIG49YS5wYXJhbV9ubz90W2EucGFyYW1fbm9dOnRbaCsrXTtpZihvLm5vdF90eXBlLnRlc3QoYS50eXBlKSYmby5ub3RfcHJpbWl0aXZlLnRlc3QoYS50eXBlKSYmbiBpbnN0YW5jZW9mIEZ1bmN0aW9uJiYobj1uKCkpLG8ubnVtZXJpY19hcmcudGVzdChhLnR5cGUpJiYibnVtYmVyIiE9dHlwZW9mIG4mJmlzTmFOKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoaSgiW3NwcmludGZdIGV4cGVjdGluZyBudW1iZXIgYnV0IGZvdW5kICVUIixuKSk7c3dpdGNoKG8ubnVtYmVyLnRlc3QoYS50eXBlKSYmKHA9bj49MCksYS50eXBlKXtjYXNlImIiOm49cGFyc2VJbnQobiwxMCkudG9TdHJpbmcoMik7YnJlYWs7Y2FzZSJjIjpuPVN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQobiwxMCkpO2JyZWFrO2Nhc2UiZCI6Y2FzZSJpIjpuPXBhcnNlSW50KG4sMTApO2JyZWFrO2Nhc2UiaiI6bj1KU09OLnN0cmluZ2lmeShuLG51bGwsYS53aWR0aD9wYXJzZUludChhLndpZHRoKTowKTticmVhaztjYXNlImUiOm49YS5wcmVjaXNpb24/cGFyc2VGbG9hdChuKS50b0V4cG9uZW50aWFsKGEucHJlY2lzaW9uKTpwYXJzZUZsb2F0KG4pLnRvRXhwb25lbnRpYWwoKTticmVhaztjYXNlImYiOm49YS5wcmVjaXNpb24/cGFyc2VGbG9hdChuKS50b0ZpeGVkKGEucHJlY2lzaW9uKTpwYXJzZUZsb2F0KG4pO2JyZWFrO2Nhc2UiZyI6bj1hLnByZWNpc2lvbj9TdHJpbmcoTnVtYmVyKG4udG9QcmVjaXNpb24oYS5wcmVjaXNpb24pKSk6cGFyc2VGbG9hdChuKTticmVhaztjYXNlIm8iOm49KHBhcnNlSW50KG4sMTApPj4+MCkudG9TdHJpbmcoOCk7YnJlYWs7Y2FzZSJzIjpuPVN0cmluZyhuKSxuPWEucHJlY2lzaW9uP24uc3Vic3RyaW5nKDAsYS5wcmVjaXNpb24pOm47YnJlYWs7Y2FzZSJ0IjpuPVN0cmluZyghIW4pLG49YS5wcmVjaXNpb24/bi5zdWJzdHJpbmcoMCxhLnByZWNpc2lvbik6bjticmVhaztjYXNlIlQiOm49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG4pLnNsaWNlKDgsLTEpLnRvTG93ZXJDYXNlKCksbj1hLnByZWNpc2lvbj9uLnN1YnN0cmluZygwLGEucHJlY2lzaW9uKTpuO2JyZWFrO2Nhc2UidSI6bj1wYXJzZUludChuLDEwKT4+PjA7YnJlYWs7Y2FzZSJ2IjpuPW4udmFsdWVPZigpLG49YS5wcmVjaXNpb24/bi5zdWJzdHJpbmcoMCxhLnByZWNpc2lvbik6bjticmVhaztjYXNlIngiOm49KHBhcnNlSW50KG4sMTApPj4+MCkudG9TdHJpbmcoMTYpO2JyZWFrO2Nhc2UiWCI6bj0ocGFyc2VJbnQobiwxMCk+Pj4wKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1vLmpzb24udGVzdChhLnR5cGUpP2crPW46KCFvLm51bWJlci50ZXN0KGEudHlwZSl8fHAmJiFhLnNpZ24/ZD0iIjooZD1wPyIrIjoiLSIsbj1uLnRvU3RyaW5nKCkucmVwbGFjZShvLnNpZ24sIiIpKSx1PWEucGFkX2NoYXI/IjAiPT09YS5wYWRfY2hhcj8iMCI6YS5wYWRfY2hhci5jaGFyQXQoMSk6IiAiLGw9YS53aWR0aC0oZCtuKS5sZW5ndGgsYz1hLndpZHRoJiZsPjA/dS5yZXBlYXQobCk6IiIsZys9YS5hbGlnbj9kK24rYzoiMCI9PT11P2QrYytuOmMrZCtuKX1yZXR1cm4gZ30oZnVuY3Rpb24oZSl7aWYoYVtlXSlyZXR1cm4gYVtlXTtmb3IodmFyIHQsbj1lLHI9W10saT0wO247KXtpZihudWxsIT09KHQ9by50ZXh0LmV4ZWMobikpKXIucHVzaCh0WzBdKTtlbHNlIGlmKG51bGwhPT0odD1vLm1vZHVsby5leGVjKG4pKSlyLnB1c2goIiUiKTtlbHNle2lmKG51bGw9PT0odD1vLnBsYWNlaG9sZGVyLmV4ZWMobikpKXRocm93IG5ldyBTeW50YXhFcnJvcigiW3NwcmludGZdIHVuZXhwZWN0ZWQgcGxhY2Vob2xkZXIiKTtpZih0WzJdKXtpfD0xO3ZhciBzPVtdLGM9dFsyXSx1PVtdO2lmKG51bGw9PT0odT1vLmtleS5leGVjKGMpKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIltzcHJpbnRmXSBmYWlsZWQgdG8gcGFyc2UgbmFtZWQgYXJndW1lbnQga2V5Iik7Zm9yKHMucHVzaCh1WzFdKTsiIiE9PShjPWMuc3Vic3RyaW5nKHVbMF0ubGVuZ3RoKSk7KWlmKG51bGwhPT0odT1vLmtleV9hY2Nlc3MuZXhlYyhjKSkpcy5wdXNoKHVbMV0pO2Vsc2V7aWYobnVsbD09PSh1PW8uaW5kZXhfYWNjZXNzLmV4ZWMoYykpKXRocm93IG5ldyBTeW50YXhFcnJvcigiW3NwcmludGZdIGZhaWxlZCB0byBwYXJzZSBuYW1lZCBhcmd1bWVudCBrZXkiKTtzLnB1c2godVsxXSl9dFsyXT1zfWVsc2UgaXw9MjtpZigzPT09aSl0aHJvdyBuZXcgRXJyb3IoIltzcHJpbnRmXSBtaXhpbmcgcG9zaXRpb25hbCBhbmQgbmFtZWQgcGxhY2Vob2xkZXJzIGlzIG5vdCAoeWV0KSBzdXBwb3J0ZWQiKTtyLnB1c2goe3BsYWNlaG9sZGVyOnRbMF0scGFyYW1fbm86dFsxXSxrZXlzOnRbMl0sc2lnbjp0WzNdLHBhZF9jaGFyOnRbNF0sYWxpZ246dFs1XSx3aWR0aDp0WzZdLHByZWNpc2lvbjp0WzddLHR5cGU6dFs4XX0pfW49bi5zdWJzdHJpbmcodFswXS5sZW5ndGgpfXJldHVybiBhW2VdPXJ9KGUpLGFyZ3VtZW50cyl9ZnVuY3Rpb24gcyhlLHQpe3JldHVybiBpLmFwcGx5KG51bGwsW2VdLmNvbmNhdCh0fHxbXSkpfXZhciBhPU9iamVjdC5jcmVhdGUobnVsbCk7dC5zcHJpbnRmPWksdC52c3ByaW50Zj1zLCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYod2luZG93LnNwcmludGY9aSx3aW5kb3cudnNwcmludGY9cyx2b2lkIDA9PT0ocj1mdW5jdGlvbigpe3JldHVybntzcHJpbnRmOmksdnNwcmludGY6c319LmNhbGwodCxuLHQsZSkpfHwoZS5leHBvcnRzPXIpKX0oKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLnIodCksZnVuY3Rpb24oZSl7bi5kKHQsIldlYlNvY2tldE1hbmFnZXIiLChmdW5jdGlvbigpe3JldHVybiBvfSkpO3ZhciByPW4oMCk7ZS5jb25uZWN0PWUuY29ubmVjdHx8e30sY29ubmVjdC5XZWJTb2NrZXRNYW5hZ2VyPXIuYTt2YXIgbz1yLmF9LmNhbGwodGhpcyxuKDMpKX0sZnVuY3Rpb24oZSx0KXt2YXIgbjtuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7dHJ5e249bnx8bmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9Y2F0Y2goZSl7Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJihuPXdpbmRvdyl9ZS5leHBvcnRzPW59XSl9LDE1MTooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10O3ZhciBuPXtURVNUOiJURVNUIixUUkFDRToiVFJBQ0UiLERFQlVHOiJERUJVRyIsSU5GTzoiSU5GTyIsTE9HOiJMT0ciLFdBUk46IldBUk4iLEVSUk9SOiJFUlJPUiIsQ1JJVElDQUw6IkNSSVRJQ0FMIn0scj17Q0NQOiJjY3AiLFNPRlRQSE9ORToic29mdHBob25lIixDSEFUOiJjaGF0IixUQVNLOiJ0YXNrIn0sbz17VEVTVDowLFRSQUNFOjEwLERFQlVHOjIwLElORk86MzAsTE9HOjQwLFdBUk46NTAsRVJST1I6MTAwLENSSVRJQ0FMOjIwMH0saT0iQ0NQIixzPSJTaGFyZWRXb3JrZXIiLGE9IkNSTSIsYz17VFJBQ0U6ZnVuY3Rpb24oZSl7Y29uc29sZS5pbmZvKGUpfSxERUJVRzpmdW5jdGlvbihlKXtjb25zb2xlLmluZm8oZSl9LElORk86ZnVuY3Rpb24oZSl7Y29uc29sZS5pbmZvKGUpfSxMT0c6ZnVuY3Rpb24oZSl7Y29uc29sZS5sb2coZSl9LFRFU1Q6ZnVuY3Rpb24oZSl7Y29uc29sZS5sb2coZSl9LFdBUk46ZnVuY3Rpb24oZSl7Y29uc29sZS53YXJuKGUpfSxFUlJPUjpmdW5jdGlvbihlKXtjb25zb2xlLmVycm9yKGUpfSxDUklUSUNBTDpmdW5jdGlvbihlKXtjb25zb2xlLmVycm9yKGUpfX0sdT1mdW5jdGlvbihlKXt2YXIgdCxuLG89QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSwwKSxpPW8uc2hpZnQoKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuLTEhPT1PYmplY3QudmFsdWVzKHIpLmluZGV4T2YoZSl9KGkpPyhuPWksdD1vLnNoaWZ0KCkpOih0PWksbj1yLkNDUCkse2Zvcm1hdDp0LGNvbXBvbmVudDpuLGFyZ3M6b319LGw9ZnVuY3Rpb24oZSxuLHIsbyxjLHUpe3RoaXMuY29tcG9uZW50PWUsdGhpcy5sZXZlbD1uLHRoaXMudGV4dD1yLHRoaXMudGltZT1uZXcgRGF0ZSx0aGlzLnRhYklkPW51bGw9PT1jP251bGw6Y3x8dC5jb3JlLnRhYklkLHRoaXMuZXhjZXB0aW9uPW51bGwsdGhpcy5vYmplY3RzPVtdLHRoaXMubGluZT0wLHRoaXMuYWdlbnRSZXNvdXJjZUlkPW51bGw7dHJ5e3QuYWdlbnQuaW5pdGlhbGl6ZWQmJih0aGlzLmFnZW50UmVzb3VyY2VJZD0obmV3IHQuQWdlbnQpLl9nZXRSZXNvdXJjZUlkKCkpfWNhdGNoKGUpe2NvbnNvbGUubG9nKCJJc3N1ZSBmaW5kaW5nIGFnZW50UmVzb3VyY2VJZDogIixlKX10aGlzLmxvZ2dlcklkPW8sdT90aGlzLmNvbnRleHRMYXllcj11OnQuaXNTaGFyZWRXb3JrZXIoKT90aGlzLmNvbnRleHRMYXllcj1zOnQuaXNDUk0oKT90aGlzLmNvbnRleHRMYXllcj1hOnQuaXNDQ1AoKSYmKHRoaXMuY29udGV4dExheWVyPWkpfTtsLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YWJJZHx8bnVsbCxuPWUuY29udGV4dExheWVyfHxudWxsLG89bmV3IGwoci5DQ1AsZS5sZXZlbCxlLnRleHQsZS5sb2dnZXJJZCx0LG4pO3JldHVybiJbb2JqZWN0IERhdGVdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLnRpbWUpP28udGltZT1uZXcgRGF0ZShlLnRpbWUuZ2V0VGltZSgpKToibnVtYmVyIj09dHlwZW9mIGUudGltZT9vLnRpbWU9bmV3IERhdGUoZS50aW1lKToic3RyaW5nIj09dHlwZW9mIGUudGltZT9vLnRpbWU9RGF0ZS5wYXJzZShlLnRpbWUpOm8udGltZT1uZXcgRGF0ZSxvLmV4Y2VwdGlvbj1lLmV4Y2VwdGlvbixvLm9iamVjdHM9ZS5vYmplY3RzLG99O3ZhciBwPWZ1bmN0aW9uKGUpe3ZhciB0PS9BdXRoVG9rZW4uKlw9L2c7ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiZPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChmdW5jdGlvbihuKXsib2JqZWN0Ij09dHlwZW9mIGVbbl0/cChlW25dKToic3RyaW5nIj09dHlwZW9mIGVbbl0mJigidXJsIj09PW58fCJ0ZXh0Ij09PW4/ZVtuXT1lW25dLnJlcGxhY2UodCwiW3JlZGFjdGVkXSIpOlsicXVpY2tDb25uZWN0TmFtZSJdLmluY2x1ZGVzKG4pP2Vbbl09IltyZWRhY3RlZF0iOlsiY3VzdG9tZXJJZCIsIkN1c3RvbWVySWQiLCJTcGVha2VySWQiLCJDdXN0b21lclNwZWFrZXJJZCJdLmluY2x1ZGVzKG4pJiYoZVtuXT1gW29iZnVzY2F0ZWQgdmFsdWVdICR7bWQ1KGVbbl0pfWApKX0pKX0sZD1mdW5jdGlvbihlKXtpZih0aGlzLnR5cGU9ZSBpbnN0YW5jZW9mIEVycm9yP2UubmFtZTplLmNvZGV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSx0aGlzLm1lc3NhZ2U9ZS5tZXNzYWdlLHRoaXMuc3RhY2s9W10sZS5zdGFjayl0cnl7QXJyYXkuaXNBcnJheShlLnN0YWNrKT90aGlzLnN0YWNrPWUuc3RhY2s6Im9iamVjdCI9PXR5cGVvZiBlLnN0YWNrP3RoaXMuc3RhY2s9W0pTT04uc3RyaW5naWZ5KGUuc3RhY2spXToic3RyaW5nIj09dHlwZW9mIGUuc3RhY2smJih0aGlzLnN0YWNrPWUuc3RhY2suc3BsaXQoIlxuIikpfWNhdGNoe319O2wucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHQuc3ByaW50ZigiWyVzXSBbJXNdIFslc106ICVzIix0aGlzLmdldFRpbWUoKSYmdGhpcy5nZXRUaW1lKCkudG9JU09TdHJpbmc/dGhpcy5nZXRUaW1lKCkudG9JU09TdHJpbmcoKToiPz8/Iix0aGlzLmdldExldmVsKCksdGhpcy5nZXRBZ2VudFJlc291cmNlSWQoKSx0aGlzLmdldFRleHQoKSl9LGwucHJvdG90eXBlLmdldFRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aW1lfSxsLnByb3RvdHlwZS5nZXRBZ2VudFJlc291cmNlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZ2VudFJlc291cmNlSWR9LGwucHJvdG90eXBlLmdldFRhYklkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFiSWR9LGwucHJvdG90eXBlLmdldENvbnRleHRMYXllcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRleHRMYXllcn0sbC5wcm90b3R5cGUuZ2V0TGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZXZlbH0sbC5wcm90b3R5cGUuZ2V0VGV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRleHR9LGwucHJvdG90eXBlLmdldENvbXBvbmVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbXBvbmVudH0sbC5wcm90b3R5cGUud2l0aEV4Y2VwdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5leGNlcHRpb249bmV3IGQoZSksdGhpc30sbC5wcm90b3R5cGUud2l0aE9iamVjdD1mdW5jdGlvbihlKXt2YXIgbj10LmRlZXBjb3B5KGUpO3JldHVybiBwKG4pLHRoaXMub2JqZWN0cy5wdXNoKG4pLHRoaXN9LGwucHJvdG90eXBlLndpdGhDcm9zc09yaWdpbkV2ZW50T2JqZWN0PWZ1bmN0aW9uKGUpe3ZhciBuPXQuZGVlcGNvcHlDcm9zc09yaWdpbkV2ZW50KGUpO3JldHVybiBwKG4pLHRoaXMub2JqZWN0cy5wdXNoKG4pLHRoaXN9LGwucHJvdG90eXBlLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuZ2V0TG9nKCkuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLnB1c2godGhpcyksdGhpc307dmFyIGg9ZnVuY3Rpb24oKXt0aGlzLl9sb2dzPVtdLHRoaXMuX3JvbGxlZExvZ3M9W10sdGhpcy5fbG9nc1RvUHVzaD1bXSx0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncz1bXSx0aGlzLl9lY2hvTGV2ZWw9by5JTkZPLHRoaXMuX2xvZ0xldmVsPW8uSU5GTyx0aGlzLl9saW5lQ291bnQ9MCx0aGlzLl9sb2dSb2xsSW50ZXJ2YWw9MCx0aGlzLl9sb2dSb2xsVGltZXI9bnVsbCx0aGlzLl9sb2dnZXJJZD0obmV3IERhdGUpLmdldFRpbWUoKSsiLSIrTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiksdGhpcy5zZXRMb2dSb2xsSW50ZXJ2YWwoMThlNSksdGhpcy5fc3RhcnRMb2dJbmRleFRvUHVzaD0wfTtoLnByb3RvdHlwZS5zZXRMb2dSb2xsSW50ZXJ2YWw9ZnVuY3Rpb24odCl7dmFyIG49dGhpczt0aGlzLl9sb2dSb2xsVGltZXImJnQ9PT10aGlzLl9sb2dSb2xsSW50ZXJ2YWw/dGhpcy53YXJuKCJMb2dnZXIgaXMgYWxyZWFkeSBzZXQgdG8gdGhlIGdpdmVuIGludGVydmFsOiAlZCIsdGhpcy5fbG9nUm9sbEludGVydmFsKToodGhpcy5fbG9nUm9sbFRpbWVyJiZlLmNsZWFySW50ZXJ2YWwodGhpcy5fbG9nUm9sbFRpbWVyKSx0aGlzLl9sb2dSb2xsSW50ZXJ2YWw9dCx0aGlzLl9sb2dSb2xsVGltZXI9ZS5zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtuLl9yb2xsZWRMb2dzPW4uX2xvZ3Msbi5fbG9ncz1bXSxuLl9zdGFydExvZ0luZGV4VG9QdXNoPTAsbi5pbmZvKCJMb2cgcm9sbCBpbnRlcnZhbCBvY2N1cnJlZC4iKX0pLHRoaXMuX2xvZ1JvbGxJbnRlcnZhbCkpfSxoLnByb3RvdHlwZS5zZXRMb2dMZXZlbD1mdW5jdGlvbihlKXtpZighKGUgaW4gbykpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGxvZ2dpbmcgbGV2ZWw6ICIrZSk7dGhpcy5fbG9nTGV2ZWw9b1tlXX0saC5wcm90b3R5cGUuc2V0RWNob0xldmVsPWZ1bmN0aW9uKGUpe2lmKCEoZSBpbiBvKSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gbG9nZ2luZyBsZXZlbDogIitlKTt0aGlzLl9lY2hvTGV2ZWw9b1tlXX0saC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW5ldyBsKGUsdCxuLHRoaXMuZ2V0TG9nZ2VySWQoKSk7cmV0dXJuIHAociksdGhpcy5hZGRMb2dFbnRyeShyKSxyfSxoLnByb3RvdHlwZS5hZGRMb2dFbnRyeT1mdW5jdGlvbihlKXtwKGUpLHRoaXMuX2xvZ3MucHVzaChlKSxyLlNPRlRQSE9ORT09PWUuY29tcG9uZW50JiZ0aGlzLl9sb2dzVG9QdXNoLnB1c2goZSksZS5sZXZlbCBpbiBvJiZvW2UubGV2ZWxdPj10aGlzLl9sb2dMZXZlbCYmKG9bZS5sZXZlbF0+PXRoaXMuX2VjaG9MZXZlbCYmY1tlLmdldExldmVsKCldKGUudG9TdHJpbmcoKSksZS5saW5lPXRoaXMuX2xpbmVDb3VudCsrKX0saC5wcm90b3R5cGUuc2VuZEludGVybmFsTG9nRW50cnlUb1NlcnZlcj1mdW5jdGlvbihlKXt0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncy5wdXNoKGUpLGUubGV2ZWwgaW4gbyYmb1tlLmxldmVsXT49dGhpcy5fbG9nTGV2ZWwmJihvW2UubGV2ZWxdPj10aGlzLl9lY2hvTGV2ZWwmJmNbZS5nZXRMZXZlbCgpXShlLnRvU3RyaW5nKCkpLGUubGluZT10aGlzLl9saW5lQ291bnQrKyl9LGgucHJvdG90eXBlLmNsZWFyT2JqZWN0cz1mdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8dGhpcy5fbG9ncy5sZW5ndGg7ZSsrKXRoaXMuX2xvZ3NbZV0ub2JqZWN0cyYmZGVsZXRlIHRoaXMuX2xvZ3NbZV0ub2JqZWN0c30saC5wcm90b3R5cGUuY2xlYXJFeGNlcHRpb25zPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9sb2dzLmxlbmd0aDtlKyspdGhpcy5fbG9nc1tlXS5leGNlcHRpb24mJmRlbGV0ZSB0aGlzLl9sb2dzW2VdLmV4Y2VwdGlvbn0saC5wcm90b3R5cGUudHJhY2U9ZnVuY3Rpb24oKXt2YXIgZT11KGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMud3JpdGUoZS5jb21wb25lbnQsbi5UUkFDRSx0LnZzcHJpbnRmKGUuZm9ybWF0LGUuYXJncykpfSxoLnByb3RvdHlwZS5kZWJ1Zz1mdW5jdGlvbigpe3ZhciBlPXUoYXJndW1lbnRzKTtyZXR1cm4gdGhpcy53cml0ZShlLmNvbXBvbmVudCxuLkRFQlVHLHQudnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLmluZm89ZnVuY3Rpb24oKXt2YXIgZT11KGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMud3JpdGUoZS5jb21wb25lbnQsbi5JTkZPLHQudnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLmxvZz1mdW5jdGlvbigpe3ZhciBlPXUoYXJndW1lbnRzKTtyZXR1cm4gdGhpcy53cml0ZShlLmNvbXBvbmVudCxuLkxPRyx0LnZzcHJpbnRmKGUuZm9ybWF0LGUuYXJncykpfSxoLnByb3RvdHlwZS50ZXN0PWZ1bmN0aW9uKCl7dmFyIGU9dShhcmd1bWVudHMpO3JldHVybiB0aGlzLndyaXRlKGUuY29tcG9uZW50LG4uVEVTVCx0LnZzcHJpbnRmKGUuZm9ybWF0LGUuYXJncykpfSxoLnByb3RvdHlwZS53YXJuPWZ1bmN0aW9uKCl7dmFyIGU9dShhcmd1bWVudHMpO3JldHVybiB0aGlzLndyaXRlKGUuY29tcG9uZW50LG4uV0FSTix0LnZzcHJpbnRmKGUuZm9ybWF0LGUuYXJncykpfSxoLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbigpe3ZhciBlPXUoYXJndW1lbnRzKTtyZXR1cm4gdGhpcy53cml0ZShlLmNvbXBvbmVudCxuLkVSUk9SLHQudnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLmNyaXRpY2FsPWZ1bmN0aW9uKCl7dmFyIGU9dShhcmd1bWVudHMpO3JldHVybiB0aGlzLndyaXRlKGUuY29tcG9uZW50LG4uRVJST1IsdC52c3ByaW50ZihlLmZvcm1hdCxlLmFyZ3MpKX0saC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wO3Q8dGhpcy5fbG9ncy5sZW5ndGg7dCsrKWUucHVzaCh0aGlzLl9sb2dzW3RdLnRvU3RyaW5nKCkpO3JldHVybiBlLmpvaW4oIlxuIil9LGgucHJvdG90eXBlLmRvd25sb2FkPWZ1bmN0aW9uKHQpe3ZhciBuPSJhZ2VudC1sb2ciLHI9ITE7Im9iamVjdCI9PXR5cGVvZiB0PyhuPXQubG9nTmFtZXx8bixyPXQuZmlsdGVyQnlMb2dMZXZlbHx8cik6InN0cmluZyI9PXR5cGVvZiB0JiYobj10fHxuKTt2YXIgaT10aGlzLHM9dGhpcy5fcm9sbGVkTG9ncy5jb25jYXQodGhpcy5fbG9ncyk7ciYmKHM9cy5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBvW2UubGV2ZWxdPj1pLl9sb2dMZXZlbH0pKSk7dmFyIGE9bmV3IGUuQmxvYihbSlNPTi5zdHJpbmdpZnkocyx2b2lkIDAsNCldLFsidGV4dC9wbGFpbiJdKSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtuPW58fCJhZ2VudC1sb2ciLGMuaHJlZj1lLlVSTC5jcmVhdGVPYmplY3RVUkwoYSksYy5kb3dubG9hZD1uKyIudHh0Iixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGMpLGMuY2xpY2soKSxkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGMpfSxoLnByb3RvdHlwZS5zY2hlZHVsZVVwc3RyZWFtTG9nUHVzaD1mdW5jdGlvbihuKXt0LnVwc3RyZWFtTG9nUHVzaFNjaGVkdWxlZHx8KHQudXBzdHJlYW1Mb2dQdXNoU2NoZWR1bGVkPSEwLGUuc2V0SW50ZXJ2YWwodC5oaXRjaCh0aGlzLHRoaXMucmVwb3J0TWFzdGVyTG9nc1VwU3RyZWFtLG4pLDVlMykpfSxoLnByb3RvdHlwZS5yZXBvcnRNYXN0ZXJMb2dzVXBTdHJlYW09ZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5fbG9nc1RvUHVzaC5zbGljZSgpO3RoaXMuX2xvZ3NUb1B1c2g9W10sdC5pZk1hc3Rlcih0Lk1hc3RlclRvcGljcy5TRU5EX0xPR1MsKGZ1bmN0aW9uKCl7bi5sZW5ndGg+MCYmZS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuU0VORF9MT0dTLG4pfSkpfSxoLnByb3RvdHlwZS5zY2hlZHVsZVVwc3RyZWFtT3V0ZXJDb250ZXh0Q0NQc2VydmVyQm91bmRMb2dzUHVzaD1mdW5jdGlvbihuKXtlLnNldEludGVydmFsKHQuaGl0Y2godGhpcyx0aGlzLnB1c2hPdXRlckNvbnRleHRDQ1BzZXJ2ZXJCb3VuZExvZ3NVcHN0cmVhbSxuKSwxZTMpfSxoLnByb3RvdHlwZS5zY2hlZHVsZVVwc3RyZWFtT3V0ZXJDb250ZXh0Q0NQTG9nc1B1c2g9ZnVuY3Rpb24obil7ZS5zZXRJbnRlcnZhbCh0LmhpdGNoKHRoaXMsdGhpcy5wdXNoT3V0ZXJDb250ZXh0Q0NQTG9nc1Vwc3RyZWFtLG4pLDFlMyl9LGgucHJvdG90eXBlLnB1c2hPdXRlckNvbnRleHRDQ1BzZXJ2ZXJCb3VuZExvZ3NVcHN0cmVhbT1mdW5jdGlvbihlKXtpZih0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncy5sZW5ndGg+MCl7Zm9yKHZhciBuPTA7bjx0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncy5sZW5ndGg7bisrKXRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzW25dLnRleHQ9dGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3Nbbl0udGV4dDtlLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5TRVJWRVJfQk9VTkRfSU5URVJOQUxfTE9HLHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzKSx0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncz1bXX19LGgucHJvdG90eXBlLnB1c2hPdXRlckNvbnRleHRDQ1BMb2dzVXBzdHJlYW09ZnVuY3Rpb24oZSl7Zm9yKHZhciBuPXRoaXMuX3N0YXJ0TG9nSW5kZXhUb1B1c2g7bjx0aGlzLl9sb2dzLmxlbmd0aDtuKyspdGhpcy5fbG9nc1tuXS5sb2dnZXJJZD09PXRoaXMuX2xvZ2dlcklkJiZlLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5MT0csdGhpcy5fbG9nc1tuXSk7dGhpcy5fc3RhcnRMb2dJbmRleFRvUHVzaD10aGlzLl9sb2dzLmxlbmd0aH0saC5wcm90b3R5cGUuZ2V0TG9nZ2VySWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbG9nZ2VySWR9LGgucHJvdG90eXBlLnNjaGVkdWxlRG93bnN0cmVhbUNsaWVudFNpZGVMb2dzUHVzaD1mdW5jdGlvbigpe2Uuc2V0SW50ZXJ2YWwodC5oaXRjaCh0aGlzLHRoaXMucHVzaENsaWVudFNpZGVMb2dzRG93bnN0cmVhbSksNWUzKX0saC5wcm90b3R5cGUucHVzaENsaWVudFNpZGVMb2dzRG93bnN0cmVhbT1mdW5jdGlvbigpe3ZhciBlPVtdO3RoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLmxlbmd0aDw1MHx8KHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLmxlbmd0aD41MDA/ZT10aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncy5zcGxpY2UoMCw1MDApOihlPXRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzPVtdKSx0LnB1Ymxpc2hDbGllbnRTaWRlTG9ncyhlKSl9O3ZhciBmPWZ1bmN0aW9uKG4pe2guY2FsbCh0aGlzKSx0aGlzLmNvbmR1aXQ9bixlLnNldEludGVydmFsKHQuaGl0Y2godGhpcyx0aGlzLl9wdXNoTG9nc0Rvd25zdHJlYW0pLGYuTE9HX1BVU0hfSU5URVJWQUwpLGUuY2xlYXJJbnRlcnZhbCh0aGlzLl9sb2dSb2xsVGltZXIpLHRoaXMuX2xvZ1JvbGxUaW1lcj1udWxsfTtmLkxPR19QVVNIX0lOVEVSVkFMPTFlMyxmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGgucHJvdG90eXBlKSxmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1mLGYucHJvdG90eXBlLnB1c2hMb2dzRG93bnN0cmVhbT1mdW5jdGlvbihlKXt2YXIgbj10aGlzO2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkxPRyxlKX0pKX0sZi5wcm90b3R5cGUuX3B1c2hMb2dzRG93bnN0cmVhbT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5fbG9ncy5mb3JFYWNoKChmdW5jdGlvbihuKXtlLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuTE9HLG4pfSkpLHRoaXMuX2xvZ3M9W107Zm9yKHZhciBuPTA7bjx0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncy5sZW5ndGg7bisrKXRoaXMuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5TRVJWRVJfQk9VTkRfSU5URVJOQUxfTE9HLHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzW25dKTt0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncz1bXX07dmFyIGc9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dHJ5e3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1jYXRjaChlKXtjLkVSUk9SKGUpfX19O3Qucm9vdExvZ2dlcj1uZXcgaCxmdW5jdGlvbihlKXtmb3IodmFyIHQgaW4gZSkiZnVuY3Rpb24iPT10eXBlb2YgZVt0XSYmKGVbdF09ZyhlW3RdKSl9KHQucm9vdExvZ2dlciksKHQ9dHx8e30pLmdldExvZz1mdW5jdGlvbigpe3JldHVybiB0LnJvb3RMb2dnZXJ9LHQuTG9nRW50cnk9bCx0LkxvZ2dlcj1oLHQuTG9nTGV2ZWw9bix0LkxvZ0NvbXBvbmVudD1yLHQuRG93bnN0cmVhbUNvbmR1aXRMb2dnZXI9Zn0oKX0sMTYzOmZ1bmN0aW9uKCl7IWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSx0KXt2YXIgbj0oNjU1MzUmZSkrKDY1NTM1JnQpO3JldHVybihlPj4xNikrKHQ+PjE2KSsobj4+MTYpPDwxNnw2NTUzNSZufWZ1bmN0aW9uIG4oZSxuLHIsbyxpLHMpe3JldHVybiB0KChhPXQodChuLGUpLHQobyxzKSkpPDwoYz1pKXxhPj4+MzItYyxyKTt2YXIgYSxjfWZ1bmN0aW9uIHIoZSx0LHIsbyxpLHMsYSl7cmV0dXJuIG4odCZyfH50Jm8sZSx0LGkscyxhKX1mdW5jdGlvbiBvKGUsdCxyLG8saSxzLGEpe3JldHVybiBuKHQmb3xyJn5vLGUsdCxpLHMsYSl9ZnVuY3Rpb24gaShlLHQscixvLGkscyxhKXtyZXR1cm4gbih0XnJebyxlLHQsaSxzLGEpfWZ1bmN0aW9uIHMoZSx0LHIsbyxpLHMsYSl7cmV0dXJuIG4ocl4odHx+byksZSx0LGkscyxhKX1mdW5jdGlvbiBhKGUsbil7dmFyIGEsYyx1LGwscDtlW24+PjVdfD0xMjg8PG4lMzIsZVsxNCsobis2ND4+Pjk8PDQpXT1uO3ZhciBkPTE3MzI1ODQxOTMsaD0tMjcxNzMzODc5LGY9LTE3MzI1ODQxOTQsZz0yNzE3MzM4Nzg7Zm9yKGE9MDthPGUubGVuZ3RoO2ErPTE2KWM9ZCx1PWgsbD1mLHA9ZyxkPXIoZCxoLGYsZyxlW2FdLDcsLTY4MDg3NjkzNiksZz1yKGcsZCxoLGYsZVthKzFdLDEyLC0zODk1NjQ1ODYpLGY9cihmLGcsZCxoLGVbYSsyXSwxNyw2MDYxMDU4MTkpLGg9cihoLGYsZyxkLGVbYSszXSwyMiwtMTA0NDUyNTMzMCksZD1yKGQsaCxmLGcsZVthKzRdLDcsLTE3NjQxODg5NyksZz1yKGcsZCxoLGYsZVthKzVdLDEyLDEyMDAwODA0MjYpLGY9cihmLGcsZCxoLGVbYSs2XSwxNywtMTQ3MzIzMTM0MSksaD1yKGgsZixnLGQsZVthKzddLDIyLC00NTcwNTk4MyksZD1yKGQsaCxmLGcsZVthKzhdLDcsMTc3MDAzNTQxNiksZz1yKGcsZCxoLGYsZVthKzldLDEyLC0xOTU4NDE0NDE3KSxmPXIoZixnLGQsaCxlW2ErMTBdLDE3LC00MjA2MyksaD1yKGgsZixnLGQsZVthKzExXSwyMiwtMTk5MDQwNDE2MiksZD1yKGQsaCxmLGcsZVthKzEyXSw3LDE4MDQ2MDM2ODIpLGc9cihnLGQsaCxmLGVbYSsxM10sMTIsLTQwMzQxMTAxKSxmPXIoZixnLGQsaCxlW2ErMTRdLDE3LC0xNTAyMDAyMjkwKSxkPW8oZCxoPXIoaCxmLGcsZCxlW2ErMTVdLDIyLDEyMzY1MzUzMjkpLGYsZyxlW2ErMV0sNSwtMTY1Nzk2NTEwKSxnPW8oZyxkLGgsZixlW2ErNl0sOSwtMTA2OTUwMTYzMiksZj1vKGYsZyxkLGgsZVthKzExXSwxNCw2NDM3MTc3MTMpLGg9byhoLGYsZyxkLGVbYV0sMjAsLTM3Mzg5NzMwMiksZD1vKGQsaCxmLGcsZVthKzVdLDUsLTcwMTU1ODY5MSksZz1vKGcsZCxoLGYsZVthKzEwXSw5LDM4MDE2MDgzKSxmPW8oZixnLGQsaCxlW2ErMTVdLDE0LC02NjA0NzgzMzUpLGg9byhoLGYsZyxkLGVbYSs0XSwyMCwtNDA1NTM3ODQ4KSxkPW8oZCxoLGYsZyxlW2ErOV0sNSw1Njg0NDY0MzgpLGc9byhnLGQsaCxmLGVbYSsxNF0sOSwtMTAxOTgwMzY5MCksZj1vKGYsZyxkLGgsZVthKzNdLDE0LC0xODczNjM5NjEpLGg9byhoLGYsZyxkLGVbYSs4XSwyMCwxMTYzNTMxNTAxKSxkPW8oZCxoLGYsZyxlW2ErMTNdLDUsLTE0NDQ2ODE0NjcpLGc9byhnLGQsaCxmLGVbYSsyXSw5LC01MTQwMzc4NCksZj1vKGYsZyxkLGgsZVthKzddLDE0LDE3MzUzMjg0NzMpLGQ9aShkLGg9byhoLGYsZyxkLGVbYSsxMl0sMjAsLTE5MjY2MDc3MzQpLGYsZyxlW2ErNV0sNCwtMzc4NTU4KSxnPWkoZyxkLGgsZixlW2ErOF0sMTEsLTIwMjI1NzQ0NjMpLGY9aShmLGcsZCxoLGVbYSsxMV0sMTYsMTgzOTAzMDU2MiksaD1pKGgsZixnLGQsZVthKzE0XSwyMywtMzUzMDk1NTYpLGQ9aShkLGgsZixnLGVbYSsxXSw0LC0xNTMwOTkyMDYwKSxnPWkoZyxkLGgsZixlW2ErNF0sMTEsMTI3Mjg5MzM1MyksZj1pKGYsZyxkLGgsZVthKzddLDE2LC0xNTU0OTc2MzIpLGg9aShoLGYsZyxkLGVbYSsxMF0sMjMsLTEwOTQ3MzA2NDApLGQ9aShkLGgsZixnLGVbYSsxM10sNCw2ODEyNzkxNzQpLGc9aShnLGQsaCxmLGVbYV0sMTEsLTM1ODUzNzIyMiksZj1pKGYsZyxkLGgsZVthKzNdLDE2LC03MjI1MjE5NzkpLGg9aShoLGYsZyxkLGVbYSs2XSwyMyw3NjAyOTE4OSksZD1pKGQsaCxmLGcsZVthKzldLDQsLTY0MDM2NDQ4NyksZz1pKGcsZCxoLGYsZVthKzEyXSwxMSwtNDIxODE1ODM1KSxmPWkoZixnLGQsaCxlW2ErMTVdLDE2LDUzMDc0MjUyMCksZD1zKGQsaD1pKGgsZixnLGQsZVthKzJdLDIzLC05OTUzMzg2NTEpLGYsZyxlW2FdLDYsLTE5ODYzMDg0NCksZz1zKGcsZCxoLGYsZVthKzddLDEwLDExMjY4OTE0MTUpLGY9cyhmLGcsZCxoLGVbYSsxNF0sMTUsLTE0MTYzNTQ5MDUpLGg9cyhoLGYsZyxkLGVbYSs1XSwyMSwtNTc0MzQwNTUpLGQ9cyhkLGgsZixnLGVbYSsxMl0sNiwxNzAwNDg1NTcxKSxnPXMoZyxkLGgsZixlW2ErM10sMTAsLTE4OTQ5ODY2MDYpLGY9cyhmLGcsZCxoLGVbYSsxMF0sMTUsLTEwNTE1MjMpLGg9cyhoLGYsZyxkLGVbYSsxXSwyMSwtMjA1NDkyMjc5OSksZD1zKGQsaCxmLGcsZVthKzhdLDYsMTg3MzMxMzM1OSksZz1zKGcsZCxoLGYsZVthKzE1XSwxMCwtMzA2MTE3NDQpLGY9cyhmLGcsZCxoLGVbYSs2XSwxNSwtMTU2MDE5ODM4MCksaD1zKGgsZixnLGQsZVthKzEzXSwyMSwxMzA5MTUxNjQ5KSxkPXMoZCxoLGYsZyxlW2ErNF0sNiwtMTQ1NTIzMDcwKSxnPXMoZyxkLGgsZixlW2ErMTFdLDEwLC0xMTIwMjEwMzc5KSxmPXMoZixnLGQsaCxlW2ErMl0sMTUsNzE4Nzg3MjU5KSxoPXMoaCxmLGcsZCxlW2ErOV0sMjEsLTM0MzQ4NTU1MSksZD10KGQsYyksaD10KGgsdSksZj10KGYsbCksZz10KGcscCk7cmV0dXJuW2QsaCxmLGddfWZ1bmN0aW9uIGMoZSl7dmFyIHQsbj0iIixyPTMyKmUubGVuZ3RoO2Zvcih0PTA7dDxyO3QrPTgpbis9U3RyaW5nLmZyb21DaGFyQ29kZShlW3Q+PjVdPj4+dCUzMiYyNTUpO3JldHVybiBufWZ1bmN0aW9uIHUoZSl7dmFyIHQsbj1bXTtmb3IoblsoZS5sZW5ndGg+PjIpLTFdPXZvaWQgMCx0PTA7dDxuLmxlbmd0aDt0Kz0xKW5bdF09MDt2YXIgcj04KmUubGVuZ3RoO2Zvcih0PTA7dDxyO3QrPTgpblt0Pj41XXw9KDI1NSZlLmNoYXJDb2RlQXQodC84KSk8PHQlMzI7cmV0dXJuIG59ZnVuY3Rpb24gbChlKXt2YXIgdCxuLHI9IjAxMjM0NTY3ODlhYmNkZWYiLG89IiI7Zm9yKG49MDtuPGUubGVuZ3RoO24rPTEpdD1lLmNoYXJDb2RlQXQobiksbys9ci5jaGFyQXQodD4+PjQmMTUpK3IuY2hhckF0KDE1JnQpO3JldHVybiBvfWZ1bmN0aW9uIHAoZSl7cmV0dXJuIHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlKSl9ZnVuY3Rpb24gZChlKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGMoYSh1KGUpLDgqZS5sZW5ndGgpKX0ocChlKSl9ZnVuY3Rpb24gaChlLHQpe3JldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuLHIsbz11KGUpLGk9W10scz1bXTtmb3IoaVsxNV09c1sxNV09dm9pZCAwLG8ubGVuZ3RoPjE2JiYobz1hKG8sOCplLmxlbmd0aCkpLG49MDtuPDE2O24rPTEpaVtuXT05MDk1MjI0ODZeb1tuXSxzW25dPTE1NDk1NTY4Mjheb1tuXTtyZXR1cm4gcj1hKGkuY29uY2F0KHUodCkpLDUxMis4KnQubGVuZ3RoKSxjKGEocy5jb25jYXQociksNjQwKSl9KHAoZSkscCh0KSl9KHRoaXN8fGdsb2JhbFRoaXMpLm1kNT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ/bj9oKHQsZSk6bChoKHQsZSkpOm4/ZChlKTpsKGQoZSkpfX0oKX0sNDM5OigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsdC5DaGF0TWVkaWFDb250cm9sbGVyPWZ1bmN0aW9uKGUsbil7dmFyIHI9dC5nZXRMb2coKSxvPXQuTG9nQ29tcG9uZW50LkNIQVQsaT1mdW5jdGlvbihuLHIpe3QucHVibGlzaE1ldHJpYyh7bmFtZTpuLGNvbnRhY3RJZDplLmNvbnRhY3RJZCxkYXRhOnJ8fGV9KX0scz1mdW5jdGlvbihlKXtlLm9uQ29ubmVjdGlvbkJyb2tlbigoZnVuY3Rpb24oZSl7ci5lcnJvcihvLCJDaGF0IFNlc3Npb24gY29ubmVjdGlvbiBicm9rZW4iKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaSgiQ2hhdCBTZXNzaW9uIGNvbm5lY3Rpb24gYnJva2VuIixlKX0pKSxlLm9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKChmdW5jdGlvbihlKXtyLmluZm8obywiQ2hhdCBTZXNzaW9uIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaSgiQ2hhdCBTZXNzaW9uIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQiLGUpfSkpfTtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7aSgiQ2hhdCBtZWRpYSBjb250cm9sbGVyIGluaXQiLGUuY29udGFjdElkKSxyLmluZm8obywiQ2hhdCBtZWRpYSBjb250cm9sbGVyIGluaXQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5DaGF0U2Vzc2lvbi5zZXRHbG9iYWxDb25maWcoe2xvZ2dlckNvbmZpZzp7bG9nZ2VyOnJ9LHJlZ2lvbjpuLnJlZ2lvbn0pO3ZhciBhPXQuQ2hhdFNlc3Npb24uY3JlYXRlKHtjaGF0RGV0YWlsczplLHR5cGU6IkFHRU5UIix3ZWJzb2NrZXRNYW5hZ2VyOnQuY29yZS5nZXRXZWJTb2NrZXRNYW5hZ2VyKCl9KTtyZXR1cm4gcyhhKSxhLmNvbm5lY3QoKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gci5pbmZvKG8sIkNoYXQgU2Vzc2lvbiBTdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQgZm9yIGNvbnRhY3RJZCAlcyIsZS5jb250YWN0SWQpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaSgiQ2hhdCBTZXNzaW9uIFN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZCIsZS5jb250YWN0SWQpLGF9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe3Rocm93IHIuZXJyb3IobywiQ2hhdCBTZXNzaW9uIGVzdGFibGlzaGVtZW50IGZhaWxlZCBmb3IgY29udGFjdCAlcyIsZS5jb250YWN0SWQpLndpdGhFeGNlcHRpb24odCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKCJDaGF0IFNlc3Npb24gZXN0YWJsaXNoZW1lbnQgZmFpbGVkIixlLmNvbnRhY3RJZCx0KSx0fSkpfSgpfX19fSgpfSwyNzk6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCx0Lk1lZGlhRmFjdG9yeT1mdW5jdGlvbihlKXt2YXIgbj17fSxyPW5ldyBTZXQsbz10LmdldExvZygpLGk9dC5Mb2dDb21wb25lbnQuQ0hBVCxzPXQubWVyZ2Uoe30sZSl8fHt9O3MucmVnaW9uPXMucmVnaW9ufHwidXMtd2VzdC0yIjt2YXIgYT1mdW5jdGlvbihlKXtuW2VdJiYhci5oYXMoZSkmJihvLmluZm8oaSwiRGVzdHJveWluZyBtZWRpYUNvbnRyb2xsZXIgZm9yICVzIixlKSxyLmFkZChlKSxuW2VdLnRoZW4oKGZ1bmN0aW9uKHQpeyJmdW5jdGlvbiI9PXR5cGVvZiB0LmNsZWFuVXAmJnQuY2xlYW5VcCgpLGRlbGV0ZSBuW2VdLHIuZGVsZXRlKGUpfSkpLmNhdGNoKChmdW5jdGlvbigpe2RlbGV0ZSBuW2VdLHIuZGVsZXRlKGUpfSkpKX07cmV0dXJue2dldDpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXNBY3RpdmUoKX0oZSk/ZnVuY3Rpb24oZSl7dmFyIHI9ZS5nZXRDb25uZWN0aW9uSWQoKTtpZighZS5nZXRNZWRpYUluZm8oKSlyZXR1cm4gby5lcnJvcihpLCJNZWRpYSBpbmZvIGRvZXMgbm90IGV4aXN0IGZvciBhIG1lZGlhIHR5cGUgJXMiLGUuZ2V0TWVkaWFUeXBlKCkpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxQcm9taXNlLnJlamVjdCgiTWVkaWEgaW5mbyBkb2VzIG5vdCBleGlzdCBmb3IgdGhpcyBjb25uZWN0aW9uIik7aWYobltyXSlyZXR1cm4gbltyXTtzd2l0Y2goby5pbmZvKGksIm1lZGlhIGNvbnRyb2xsZXIgb2YgdHlwZSAlcyBpbml0IixlLmdldE1lZGlhVHlwZSgpKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksZS5nZXRNZWRpYVR5cGUoKSl7Y2FzZSB0Lk1lZGlhVHlwZS5DSEFUOnJldHVybiBuW3JdPW5ldyB0LkNoYXRNZWRpYUNvbnRyb2xsZXIoZS5nZXRNZWRpYUluZm8oKSxzKS5nZXQoKTtjYXNlIHQuTWVkaWFUeXBlLlNPRlRQSE9ORTpyZXR1cm4gbltyXT1uZXcgdC5Tb2Z0cGhvbmVNZWRpYUNvbnRyb2xsZXIoZS5nZXRNZWRpYUluZm8oKSkuZ2V0KCk7Y2FzZSB0Lk1lZGlhVHlwZS5UQVNLOnJldHVybiBuW3JdPW5ldyB0LlRhc2tNZWRpYUNvbnRyb2xsZXIoZS5nZXRNZWRpYUluZm8oKSkuZ2V0KCk7ZGVmYXVsdDpyZXR1cm4gby5lcnJvcihpLCJVbnJlY29nbml6ZWQgbWVkaWEgdHlwZSAlcyAiLGUuZ2V0TWVkaWFUeXBlKCkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksUHJvbWlzZS5yZWplY3QoKX19KGUpOihhKGUuZ2V0Q29ubmVjdGlvbklkKCkpLFByb21pc2UucmVqZWN0KCJNZWRpYSBDb250cm9sbGVyIGlzIG5vIGxvbmdlciBhdmFpbGFibGUgZm9yIHRoaXMgY29ubmVjdGlvbiIpKX0sZGVzdHJveTphfX19KCl9LDQxODooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LHQuU29mdHBob25lTWVkaWFDb250cm9sbGVyPWZ1bmN0aW9uKGUpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUpfX19fSgpfSwxODc6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCx0LlRhc2tNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oZSl7dmFyIG49dC5nZXRMb2coKSxyPXQuTG9nQ29tcG9uZW50LlRBU0ssbz1mdW5jdGlvbihuLHIpe3QucHVibGlzaE1ldHJpYyh7bmFtZTpuLGNvbnRhY3RJZDplLmNvbnRhY3RJZCxkYXRhOnJ8fGV9KX0saT1mdW5jdGlvbihlKXtlLm9uQ29ubmVjdGlvbkJyb2tlbigoZnVuY3Rpb24oZSl7bi5lcnJvcihyLCJUYXNrIFNlc3Npb24gY29ubmVjdGlvbiBicm9rZW4iKS53aXRoRXhjZXB0aW9uKGUpLG8oIlRhc2sgU2Vzc2lvbiBjb25uZWN0aW9uIGJyb2tlbiIsZSl9KSksZS5vbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCgoZnVuY3Rpb24oZSl7bi5pbmZvKHIsIlRhc2sgU2Vzc2lvbiBjb25uZWN0aW9uIGVzdGFibGlzaGVkIikud2l0aE9iamVjdChlKSxvKCJUYXNrIFNlc3Npb24gY29ubmVjdGlvbiBlc3RhYmxpc2hlZCIsZSl9KSl9O3JldHVybntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXtvKCJUYXNrIG1lZGlhIGNvbnRyb2xsZXIgaW5pdCIsZS5jb250YWN0SWQpLG4uaW5mbyhyLCJUYXNrIG1lZGlhIGNvbnRyb2xsZXIgaW5pdCIpLndpdGhPYmplY3QoZSk7dmFyIHM9dC5UYXNrU2Vzc2lvbi5jcmVhdGUoe2NvbnRhY3RJZDplLmNvbnRhY3RJZCxpbml0aWFsQ29udGFjdElkOmUuaW5pdGlhbENvbnRhY3RJZCx3ZWJzb2NrZXRNYW5hZ2VyOnQuY29yZS5nZXRXZWJTb2NrZXRNYW5hZ2VyKCl9KTtyZXR1cm4gaShzKSxzLmNvbm5lY3QoKS50aGVuKChmdW5jdGlvbigpe3JldHVybiBuLmluZm8ociwiVGFzayBTZXNzaW9uIFN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZCBmb3IgY29udGFjdElkICVzIixlLmNvbnRhY3RJZCksbygiVGFzayBTZXNzaW9uIFN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZCIsZS5jb250YWN0SWQpLHN9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe3Rocm93IG4uZXJyb3IociwiVGFzayBTZXNzaW9uIGVzdGFibGlzaGVtZW50IGZhaWxlZCBmb3IgY29udGFjdCAlcyIsZS5jb250YWN0SWQpLndpdGhFeGNlcHRpb24odCksbygiQ2hhdCBTZXNzaW9uIGVzdGFibGlzaGVtZW50IGZhaWxlZCIsZS5jb250YWN0SWQsdCksdH0pKX0oKX19fX0oKX0sMTYxOigpPT57IWZ1bmN0aW9uKCl7Y29uc3QgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dDtjb25zdCBuPSIvcmVxdWVzdC1zdG9yYWdlLWFjY2VzcyIscj17Y2FuUmVxdWVzdDohMCxtb2RlOiJkZWZhdWx0IixjdXN0b206e2hpZGVDQ1A6ITB9fTtsZXQgbyxpPXt9LHM9IiIsYT1udWxsLGM9ITE7Y29uc3QgdT17SU5JVDoic3RvcmFnZUFjY2Vzczo6aW5pdCIsR1JBTlRFRDoic3RvcmFnZUFjY2Vzczo6Z3JhbnRlZCIsREVOSUVEOiJzdG9yYWdlQWNjZXNzOjpkZW5pZWQiLFJFUVVFU1Q6InN0b3JhZ2VBY2Nlc3M6OnJlcXVlc3QifSxsPSgpPT4oe3Nob3c6KCk9PnthLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0saGlkZTooKT0+e2Euc3R5bGUuZGlzcGxheT0ibm9uZSJ9fSkscD0oKT0+aSYmImN1c3RvbSI9PT1pLm1vZGUsZD1lPT5lLm1hdGNoKC8uY29ubmVjdC5hd3MuYTJ6LmNvbXwubXkuY29ubmVjdC5hd3N8LmdvdmNsb3VkLmNvbm5lY3QuYXdzfC5hd3NhcHBzLmNvbS8pLGg9ZT0+e2NvbnN0e29yaWdpbjp0LHBhdGhuYW1lOnJ9PW5ldyBVUkwoZSk7aWYodC5tYXRjaCgvLmF3c2FwcHMuY29tLykpe2xldCBlPSJjb25uZWN0IjtyZXR1cm4gci5zdGFydHNXaXRoKCIvY29ubmVjdC1nYW1tYSIpJiYoZT0iY29ubmVjdC1nYW1tYSIpLGAke3R9LyR7ZX0ke259YH1yZXR1cm5gJHt0fSR7bn1gfSxmPWU9PmUubWF0Y2goL15odHRwcz86XC9cL2xvY2FsaG9zdC8pLGc9KCk9PntpZighcyl0aHJvdyBuZXcgRXJyb3IoIltTdG9yYWdlQWNjZXNzXSBbZ2V0bGFuZEF0UGF0aF0gSW52b2tlIGNvbm5lY3Quc3RvcmFnZUFjY2Vzcy5pbml0IGZpcnN0Iik7aWYoZChzKXx8ZihzKSl7Y29uc3R7cGF0aG5hbWU6ZX09bmV3IFVSTChzKTtyZXR1cm4gZX1yZXR1cm4iL2Nvbm5lY3QvY2NwLXYyIn0sbT0oe29uSW5pdDplLG9uRGVueTpuLG9uR3JhbnQ6cn0pPT57ZnVuY3Rpb24gbyh7ZGF0YTppLHNvdXJjZTpzfSl7aWYodC5jb3JlLl9nZXRDQ1BJZnJhbWUoKS5jb250ZW50V2luZG93IT09cylyZXR1cm4hMTtzd2l0Y2godC5jb3JlLmluaXRpYWxpemVkJiZ3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbyksaS5ldmVudCl7Y2FzZSB1LklOSVQ6dC5nZXRMb2coKS5pbmZvKCJbU3RvcmFnZUFjY2Vzc11bSU5JVF0gbWVzc2FnZSByZWNpZXZlZCIpLndpdGhPYmplY3QoaSksZSYmZShpKTticmVhaztjYXNlIHUuR1JBTlRFRDp0LmdldExvZygpLmluZm8oIltTdG9yYWdlQWNjZXNzXVtHUkFOVEVEXSBtZXNzYWdlIHJlY2lldmVkIikud2l0aE9iamVjdChpKSxyJiZyKGkpO2JyZWFrO2Nhc2UgdS5ERU5JRUQ6dC5nZXRMb2coKS5pbmZvKCJbU3RvcmFnZUFjY2Vzc11bREVOSUVEXSBtZXNzYWdlIHJlY2lldmVkIikud2l0aE9iamVjdChpKSxuJiZuKGkpO2JyZWFrO2RlZmF1bHQ6dC5jb3JlLmluaXRpYWxpemVkJiZ3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbyl9fXJldHVybiBpLmNhblJlcXVlc3QmJndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixvKSx7dW5zdWJzY3JpYmU6KCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbyl9fX07dC5zdG9yYWdlQWNjZXNzPU9iamVjdC5mcmVlemUoe2NhblJlcXVlc3Q6KCk9PmkuY2FuUmVxdWVzdCxvcHRPdXRGcm9tUmVxdWVzdEFjY2VzczooKT0+e3IuY2FuUmVxdWVzdD0hMX0sb3B0SW5Gb3JSZXF1ZXN0QWNjZXNzOigpPT57ci5jYW5SZXF1ZXN0PSEwfSxpbml0OihlLG4sbz17fSk9Pnt0LmFzc2VydE5vdE51bGwoZSwiY2NwVXJsIiksdC5hc3NlcnROb3ROdWxsKG4sImNvbnRhaW5lciIpLGE9bixzPWUsKChlPXt9KT0+e2UuY3VzdG9tPWUuY3VzdG9tfHx7fSxpPXsuLi5yLC4uLmUsY3VzdG9tOnsuLi5yLmN1c3RvbSwuLi5lLmN1c3RvbX19LGkuY2FuUmVxdWVzdD0hKCJmYWxzZSI9PT1pLmNhblJlcXVlc3R8fCExPT09aS5jYW5SZXF1ZXN0KX0pKG8pLHQuZ2V0TG9nKCkuaW5mbyhgW1N0b3JhZ2VBY2Nlc3NdW2luaXRdIFJlcXVlc3QgU3RvcmFnZSBBY2NjZXNzIGluaXQgY2FsbGVkIHdpdGggY2NwVXJsIC0gJHtlfSAtICR7aS5jYW5SZXF1ZXN0PyJQcm9jZWVkaW5nIHdpdGggcmVxdWVzdGluZyBzdG9yYWdlIGFjY2VzcyI6InVzZXIgaGFzIG9wdGVkIG91dCwgc2tpcHBpbmcgcmVxdWVzdCBzdG9yYWdlIGFjY2VzcyJ9YCkud2l0aE9iamVjdChpKX0sc2V0dXBSZXF1ZXN0SGFuZGxlcnM6KHtvbkdyYW50OmV9KT0+e28mJm8udW5zdWJzY3JpYmUoKSxvPW0oe29uSW5pdDplPT57Y29uc29sZS5sb2coIiVjW1N0b3JhZ2VBY2Nlc3NdW0lOSVRdIiwiYmFja2dyb3VuZDp5ZWxsb3c7IGNvbG9yOmJsYWNrOyBmb250LXNpemU6bGFyZ2UiKSx0LmdldExvZygpLmluZm8oIltTdG9yYWdlQWNjZXNzXVtvbkluaXRdIGNhbGxiYWNrIGV4ZWN1dGVkIikud2l0aE9iamVjdChlPy5kYXRhKSwhZT8uZGF0YS5oYXNBY2Nlc3MmJnAoKSYmbCgpLnNob3coKX0sb25EZW55OigpPT57Y29uc29sZS5sb2coIiVjW1N0b3JhZ2VBY2Nlc3NdW0RFTklFRF0iLCJiYWNrZ3JvdW5kOnJlZDsgY29sb3I6YmxhY2s7IGZvbnQtc2l6ZTpsYXJnZSIpLHQuZ2V0TG9nKCkuaW5mbygiW1N0b3JhZ2VBY2Nlc3NdW29uRGVueV0gY2FsbGJhY2sgZXhlY3V0ZWQiKSxwKCkmJmwoKS5zaG93KCl9LG9uR3JhbnQ6KCk9Pntjb25zb2xlLmxvZygiJWNbU3RvcmFnZUFjY2Vzc11bR1JBTlRFRF0iLCJiYWNrZ3JvdW5kOmxpbWU7IGNvbG9yOmJsYWNrOyBmb250LXNpemU6bGFyZ2UiKSx0LmdldExvZygpLmluZm8oIltTdG9yYWdlQWNjZXNzXVtvbkdyYW50XSBjYWxsYmFjayBleGVjdXRlZCIpLHAoKSYmaT8uY3VzdG9tPy5oaWRlQ0NQJiZsKCkuaGlkZSgpLGN8fChlKCksYz0hMCl9fSl9LGdldFJlcXVlc3RTdG9yYWdlQWNjZXNzVXJsOigpPT57aWYoIXMpdGhyb3cgbmV3IEVycm9yKCJbU3RvcmFnZUFjY2Vzc10gW2dldFJlcXVlc3RTdG9yYWdlQWNjZXNzVXJsXSBJbnZva2UgY29ubmVjdC5zdG9yYWdlQWNjZXNzLmluaXQgZmlyc3QiKTtpZihkKHMpKXJldHVybiBoKHMpO2lmKGYocykpcmV0dXJuIHQuZ2V0TG9nKCkuaW5mbygiW1N0b3JhZ2VBY2Nlc3NdIFtDQ1BdIExvY2FsIHRlc3RpbmciKSxgJHtzfSR7bn1gO2lmKGkuaW5zdGFuY2VVcmwmJmQoaS5pbnN0YW5jZVVybCkpcmV0dXJuIHQuZ2V0TG9nKCkuaW5mbyhgW1N0b3JhZ2VBY2Nlc3NdIFtnZXRSZXF1ZXN0U3RvcmFnZUFjY2Vzc1VybF0gQ3VzdG9tZXIgaGFzIHByb3ZpZGVkIHN0b3JhZ2VQYXJhbXMuaW5zdGFuY2VVcmwgJHtpLmluc3RhbmNlVXJsfWApLGgoaS5pbnN0YW5jZVVybCk7aWYoaS5pbnN0YW5jZVVybCYmZihpLmluc3RhbmNlVXJsKSlyZXR1cm4gdC5nZXRMb2coKS5pbmZvKCJbU3RvcmFnZUFjY2Vzc10gW2dldFJlcXVlc3RTdG9yYWdlQWNjZXNzVXJsXSBMb2NhbCB0ZXN0aW5nIiksYCR7aS5pbnN0YW5jZVVybH0ke259YDt0aHJvdyB0LmdldExvZygpLmVycm9yKCJbU3RvcmFnZUFjY2Vzc10gW2dldFJlcXVlc3RTdG9yYWdlQWNjZXNzVXJsXSBJbnZhbGlkIENvbm5lY3QgaW5zdGFuY2UvQ0NQIFVSTCBwcm92aWRlZCwgcGxlYXNlIHBhc3MgdGhlIGNvcnJlY3QgY2NwVXJsIG9yIHN0b3JhZ2VBY2Nlc3MuaW5zdGFuY2VVcmwgcGFyYW1ldGVycyIpLG5ldyBFcnJvcigiW1N0b3JhZ2VBY2Nlc3NdIFtnZXRSZXF1ZXN0U3RvcmFnZUFjY2Vzc1VybF0gSW52YWxpZCBDb25uZWN0IGluc3RhbmNlL0NDUCBVUkwgcHJvdmlkZWQsIHBsZWFzZSBwYXNzIHRoZSB2YWxpZCBDb25uZWN0IENDUCBVUkwgb3IgaW4gY2FzZSBDQ1AgVVJMIGlzIGNvbmZpZ3VyZWQgdG8gYmUgdGhlIFNTTyBVUkwgdGhlbiB1c2Ugc3RvcmFnZUFjY2Vzcy5pbnN0YW5jZVVybCBhbmQgcGFzcyB0aGUgQ29ubmVjdCBDQ1AgVVJMIil9LHN0b3JhZ2VBY2Nlc3NFdmVudHM6dSxyZXNldFN0b3JhZ2VBY2Nlc3NTdGF0ZTooKT0+e2k9e30scz0iIixhPW51bGwsYz0hMX0sZ2V0T25HcmFudENhbGxiYWNrSW52b2tlZDooKT0+YyxnZXRTdG9yYWdlQWNjZXNzUGFyYW1zOigpPT5pLG9uUmVxdWVzdDptLHJlcXVlc3Q6KCk9Pnt0LmNvcmUuX2dldENDUElmcmFtZSgpLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2Uoe2V2ZW50OnUuUkVRVUVTVCxkYXRhOnsuLi5pLGxhbmRhdDpnKCl9fSwiKiIpfX0pfSgpfSw3NDM6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dDt2YXIgbj1mdW5jdGlvbihuKXt2YXIgcj10aGlzO2lmKHRoaXMuX3ByZXZDb250YWN0SWQ9bnVsbCx0LmFzc2VydE5vdE51bGwobiwicmluZ3RvbmVDb25maWciKSwhbi5yaW5ndG9uZVVybCl0aHJvdyBuZXcgRXJyb3IoInJpbmd0b25lVXJsIGlzIHJlcXVpcmVkISIpO2UuQXVkaW8mJnZvaWQgMCE9PWUuUHJvbWlzZT90aGlzLl9wbGF5YWJsZUF1ZGlvUHJvbWlzZT1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxvKXtyLl9hdWRpbz1uZXcgQXVkaW8obi5yaW5ndG9uZVVybCksci5fYXVkaW8ubG9vcD0hMCxyLl9hdWRpby5hZGRFdmVudExpc3RlbmVyKCJjYW5wbGF5IiwoZnVuY3Rpb24oKXt0LmdldExvZygpLmluZm8oIlJpbmd0b25lIGlzIHJlYWR5IHRvIHBsYXk6ICIsK24ucmluZ3RvbmVVcmwpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5fYXVkaW9QbGF5YWJsZT0hMCxlKHIuX2F1ZGlvKX0pKX0pKToodGhpcy5fYXVkaW89bnVsbCx0LmdldExvZygpLmVycm9yKCJVbmFibGUgdG8gcHJvdmlkZSBhIHJpbmd0b25lLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpLHIuX2RyaXZlUmluZ3RvbmUoKX07bi5wcm90b3R5cGUuX2RyaXZlUmluZ3RvbmU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZC4iKX0sbi5wcm90b3R5cGUuX3N0YXJ0UmluZ3RvbmU9ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt0aGlzLl9hdWRpbyYmKHRoaXMuX2F1ZGlvLnBsYXkoKS50aGVuKChmdW5jdGlvbigpe24uX3B1Ymxpc2hUZWxlbWV0cnlFdmVudCgiUmluZ3RvbmUgU3RhcnQiLGUpLHQuZ2V0TG9nKCkuaW5mbygiUmluZ3RvbmUgU3RhcnQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLmNhdGNoKChmdW5jdGlvbihyKXtuLl9wdWJsaXNoVGVsZW1ldHJ5RXZlbnQoIlJpbmd0b25lIFBsYXliYWNrIEZhaWx1cmUiLGUpLHQuZ2V0TG9nKCkuZXJyb3IoIlJpbmd0b25lIFBsYXliYWNrIEZhaWx1cmUiKS53aXRoRXhjZXB0aW9uKHIpLndpdGhPYmplY3Qoe2N1cnJlbnRTcmM6bi5fYXVkaW8uY3VycmVudFNyYyxzaW5rSWQ6bi5fYXVkaW8uc2lua0lkLHZvbHVtZTpuLl9hdWRpby52b2x1bWV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLHQuZ2V0TG9nKCkuaW5mbyhgQXR0ZW1wdGluZyB0byBzdGFydCByaW5ndG9uZSB0byBkZXZpY2UgJHt0aGlzLl9hdWRpby5zaW5rSWR8fCInJyJ9YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9LG4ucHJvdG90eXBlLl9zdG9wUmluZ3RvbmU9ZnVuY3Rpb24oZSl7dGhpcy5fYXVkaW8mJih0aGlzLl9hdWRpby5wYXVzZSgpLHRoaXMuX2F1ZGlvLmN1cnJlbnRUaW1lPTAsdGhpcy5fcHVibGlzaFRlbGVtZXRyeUV2ZW50KCJSaW5ndG9uZSBTdG9wIixlKSx0LmdldExvZygpLmluZm8oIlJpbmd0b25lIFN0b3AiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKX0sbi5wcm90b3R5cGUuc3RvcFJpbmd0b25lPWZ1bmN0aW9uKCl7dGhpcy5fc3RvcFJpbmd0b25lKCl9LG4ucHJvdG90eXBlLl9yaW5ndG9uZVNldHVwPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7dC5pZk1hc3Rlcih0Lk1hc3RlclRvcGljcy5SSU5HVE9ORSwoZnVuY3Rpb24oKXtuLl9zdGFydFJpbmd0b25lKGUpLG4uX3ByZXZDb250YWN0SWQ9ZS5nZXRDb250YWN0SWQoKSxlLm9uQ29ubmVjdGVkKGxpbHkuaGl0Y2gobixuLl9zdG9wUmluZ3RvbmUpKSxlLm9uQWNjZXB0ZWQobGlseS5oaXRjaChuLG4uX3N0b3BSaW5ndG9uZSkpLGUub25FbmRlZChsaWx5LmhpdGNoKG4sbi5fc3RvcFJpbmd0b25lKSksZS5vblJlZnJlc2goKGZ1bmN0aW9uKGUpe2UuZ2V0U3RhdHVzKCkudHlwZSE9PXQuQ29udGFjdFN0YXR1c1R5cGUuQ09OTkVDVElORyYmZS5nZXRTdGF0dXMoKS50eXBlIT09dC5Db250YWN0U3RhdHVzVHlwZS5JTkNPTUlORyYmbi5fc3RvcFJpbmd0b25lKCl9KSl9KSl9LG4ucHJvdG90eXBlLl9wdWJsaXNoVGVsZW1ldHJ5RXZlbnQ9ZnVuY3Rpb24oZSxuKXtuJiZuLmdldENvbnRhY3RJZCgpJiZ0LnB1Ymxpc2hNZXRyaWMoe25hbWU6ZSxjb250YWN0SWQ6bi5nZXRDb250YWN0SWQoKX0pfSxuLnByb3RvdHlwZS5zZXRPdXRwdXREZXZpY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BsYXlhYmxlQXVkaW9Qcm9taXNlP1Byb21pc2UucmFjZShbdGhpcy5fcGxheWFibGVBdWRpb1Byb21pc2UsbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQsbil7ZS5zZXRUaW1lb3V0KChmdW5jdGlvbigpe24oIlRpbWVkIG91dCB3YWl0aW5nIGZvciBwbGF5YWJsZSBhdWRpbyIpfSksM2UzKX0pKV0pLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLnNldFNpbmtJZD9lLnNldFNpbmtJZCh0KS50aGVuKChmdW5jdGlvbigpe3JldHVybiBQcm9taXNlLnJlc29sdmUodCl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3JldHVybiBQcm9taXNlLnJlamVjdChgUmluZ3RvbmVFbmdpbmVCYXNlLnNldE91dHB1dERldmljZSBmYWlsZWQ6IGF1ZGlvLnNldFNpbmtJZCgpIGZhaWxlZCB3aXRoIGVycm9yICR7ZX1gKX0pKTpQcm9taXNlLnJlamVjdChgUmluZ3RvbmVFbmdpbmVCYXNlLnNldE91dHB1dERldmljZSBmYWlsZWQ6ICR7ZT8iYXVkaW8iOiJhdWRpby5zZXRTaW5rSWQifSBub3QgZm91bmQuYCl9KSk6ZS5Qcm9taXNlP1Byb21pc2UucmVqZWN0KCJOb3QgZWxpZ2libGUgcmluZ3RvbmUgb3duZXIiKTp2b2lkIDB9O3ZhciByPWZ1bmN0aW9uKGUpe24uY2FsbCh0aGlzLGUpfTsoci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXIsci5wcm90b3R5cGUuX2RyaXZlUmluZ3RvbmU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49ZnVuY3Rpb24obil7bi5nZXRUeXBlKCk9PT1saWx5LkNvbnRhY3RUeXBlLlZPSUNFJiZuLmlzU29mdHBob25lQ2FsbCgpJiZuLmlzSW5ib3VuZCgpJiYoZS5fcmluZ3RvbmVTZXR1cChuKSxlLl9wdWJsaXNoVGVsZW1ldHJ5RXZlbnQoIlJpbmd0b25lIENvbm5lY3RpbmciLG4pLHQuZ2V0TG9nKCkuaW5mbygiUmluZ3RvbmUgQ29ubmVjdGluZyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfTt0LmNvbnRhY3QoKGZ1bmN0aW9uKGUpe2Uub25Db25uZWN0aW5nKG4pfSkpLChuZXcgdC5BZ2VudCkuZ2V0Q29udGFjdHMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0dXNUeXBlLkNPTk5FQ1RJTkcmJm4oZSl9KSl9O3ZhciBvPWZ1bmN0aW9uKGUpe24uY2FsbCh0aGlzLGUpfTsoby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPW8sby5wcm90b3R5cGUuX2RyaXZlUmluZ3RvbmU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49ZnVuY3Rpb24obil7bi5nZXRUeXBlKCk9PT1saWx5LkNvbnRhY3RUeXBlLkNIQVQmJm4uaXNJbmJvdW5kKCkmJjA9PT1uLmdldENvbm5lY3Rpb25zKCkuZmlsdGVyKChlPT5lLmdldFR5cGUoKT09PXQuQ29ubmVjdGlvblR5cGUuQUdFTlQmJmUuaXNTaWxlbnRNb25pdG9yKCkpKS5sZW5ndGgmJihlLl9yaW5ndG9uZVNldHVwKG4pLGUuX3B1Ymxpc2hUZWxlbWV0cnlFdmVudCgiQ2hhdCBSaW5ndG9uZSBDb25uZWN0aW5nIixuKSx0LmdldExvZygpLmluZm8oIkNoYXQgUmluZ3RvbmUgQ29ubmVjdGluZyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfTt0LmNvbnRhY3QoKGZ1bmN0aW9uKGUpe2Uub25Db25uZWN0aW5nKG4pfSkpfTt2YXIgaT1mdW5jdGlvbihlKXtuLmNhbGwodGhpcyxlKX07KGkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1pLGkucHJvdG90eXBlLl9kcml2ZVJpbmd0b25lPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPWZ1bmN0aW9uKG4pe24uZ2V0VHlwZSgpPT09bGlseS5Db250YWN0VHlwZS5UQVNLJiZuLmlzSW5ib3VuZCgpJiYoZS5fcmluZ3RvbmVTZXR1cChuKSxlLl9wdWJsaXNoVGVsZW1ldHJ5RXZlbnQoIlRhc2sgUmluZ3RvbmUgQ29ubmVjdGluZyIsbiksdC5nZXRMb2coKS5pbmZvKCJUYXNrIFJpbmd0b25lIENvbm5lY3RpbmciKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKX07dC5jb250YWN0KChmdW5jdGlvbihlKXtlLm9uQ29ubmVjdGluZyhuKX0pKX07dmFyIHM9ZnVuY3Rpb24oZSl7bi5jYWxsKHRoaXMsZSl9OyhzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cyxzLnByb3RvdHlwZS5fZHJpdmVSaW5ndG9uZT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dC5jb250YWN0KChmdW5jdGlvbihuKXtuLm9uSW5jb21pbmcoKGZ1bmN0aW9uKCl7bi5nZXRUeXBlKCk9PT1saWx5LkNvbnRhY3RUeXBlLlFVRVVFX0NBTExCQUNLJiYoZS5fcmluZ3RvbmVTZXR1cChuKSxlLl9wdWJsaXNoVGVsZW1ldHJ5RXZlbnQoIkNhbGxiYWNrIFJpbmd0b25lIENvbm5lY3RpbmciLG4pLHQuZ2V0TG9nKCkuaW5mbygiQ2FsbGJhY2sgUmluZ3RvbmUgQ29ubmVjdGluZyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfSkpfSkpfSx0LlZvaWNlUmluZ3RvbmVFbmdpbmU9cix0LkNoYXRSaW5ndG9uZUVuZ2luZT1vLHQuVGFza1Jpbmd0b25lRW5naW5lPWksdC5RdWV1ZUNhbGxiYWNrUmluZ3RvbmVFbmdpbmU9c30oKX0sNjQyOigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQsZS5jY3BWZXJzaW9uPSJWMiI7Y29uc3Qgbj0iQ0lUUklYIjt2YXIgcj17fTtyW3QuU29mdHBob25lQ2FsbFR5cGUuQVVESU9fT05MWV09IkF1ZGlvIixyW3QuU29mdHBob25lQ2FsbFR5cGUuVklERU9fT05MWV09IlZpZGVvIixyW3QuU29mdHBob25lQ2FsbFR5cGUuQVVESU9fVklERU9dPSJBdWRpb1ZpZGVvIixyW3QuU29mdHBob25lQ2FsbFR5cGUuTk9ORV09Ik5vbmUiO3ZhciBvPSJhdWRpb19pbnB1dCIsaT0iYXVkaW9fb3V0cHV0Ijsoe30pW3QuQ29udGFjdFR5cGUuVk9JQ0VdPSJWb2ljZSI7dmFyIHM9W10sYT1bXSxjPVtdLHU9e30sbD17fSxwPTAsZD0wLGg9MCxmPTAsZz0wLG09bnVsbCx2PW51bGwseT1udWxsLEU9dC5Tb2Z0cGhvbmVFcnJvclR5cGVzLFM9e30sYj10LnJhbmRvbUlkKCksQz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG4scil7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLkNSRUFURV9UUkFOU1BPUlQsZSx7c3VjY2VzczpmdW5jdGlvbihlKXtuKGUuc29mdHBob25lVHJhbnNwb3J0LnNvZnRwaG9uZU1lZGlhQ29ubmVjdGlvbnMpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe2UubWVzc2FnZSYmZS5tZXNzYWdlLmluY2x1ZGVzKCJTb2Z0cGhvbmVDb25uZWN0aW9uTGltaXRCcmVhY2hlZEV4Y2VwdGlvbiIpJiZNKCJtdWx0aXBsZV9zb2Z0cGhvbmVfYWN0aXZlX3Nlc3Npb25zIiwiTnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9ucyBhcmUgbW9yZSB0aGVuIGFsbG93ZWQgbGltaXQuIiwiIikscihFcnJvcigicmVxdWVzdEljZUFjY2VzcyBmYWlsZWQiKSl9LGF1dGhGYWlsdXJlOmZ1bmN0aW9uKCl7cihFcnJvcigiQXV0aGVudGljYXRpb24gZmFpbGVkIHdoaWxlIHJlcXVlc3RJY2VBY2Nlc3MiKSl9LGFjY2Vzc0RlbmllZDpmdW5jdGlvbigpe3IoRXJyb3IoIkFjY2VzcyBEZW5pZWQgd2hpbGUgcmVxdWVzdEljZUFjY2VzcyIpKX19KX0pKX0sVD1mdW5jdGlvbihlPXt9KXt2YXIgcj10aGlzO2xldCBvO2lmKCh5PW5ldyBRKHQuZ2V0TG9nKCkpKS5pbmZvKCJbU29mdHBob25lIE1hbmFnZXJdIHNvZnRwaG9uZSBtYW5hZ2VyIGluaXRpYWxpemF0aW9uIGhhcyBiZWd1biIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkseS5pbmZvKGBbU29mdHBob25lTWFuYWdlcl0gQ2xpZW50IFByb3ZpZGVkIFN0cmF0ZWd5OiAke2UuVkRJUGxhdGZvcm19YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxlLlZESVBsYXRmb3JtKXRyeXtpZihlLlZESVBsYXRmb3JtIT09bil0aHJvdyBuZXcgRXJyb3IoIlZESSBTdHJhdGVneSBub3Qgc3VwcG9ydGVkIik7bz1uZXcgdC5DaXRyaXhWRElTdHJhdGVneSx5LmluZm8oYFtTb2Z0cGhvbmVNYW5hZ2VyXSBTdHJhdGVneSBjb25zdHJ1Y3RvciByZXRyaWV2ZWQ6ICR7b31gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWNhdGNoKGUpe3Rocm93IlZESSBTdHJhdGVneSBub3Qgc3VwcG9ydGVkIj09PWUubWVzc2FnZT8oTShFLlZESV9TVFJBVEVHWV9OT1RfU1VQUE9SVEVELGUubWVzc2FnZSwiIiksZSk6IkNpdHJpeCBXZWJSVEMgcmVkaXJlY3Rpb24gZmVhdHVyZSBpcyBOT1Qgc3VwcG9ydGVkISI9PT1lLm1lc3NhZ2U/KE0oRS5WRElfUkVESVJfTk9UX1NVUFBPUlRFRCxlLm1lc3NhZ2UsIiIpLGUpOihNKEUuT1RIRVIsZS5tZXNzYWdlLCIiKSxlKX12YXIgaTt0LlJ0Y1BlZXJDb25uZWN0aW9uRmFjdG9yeSYmKGk9bz9uZXcgdC5SdGNQZWVyQ29ubmVjdGlvbkZhY3RvcnkoeSx0LmNvcmUuZ2V0V2ViU29ja2V0TWFuYWdlcigpLGIsdC5oaXRjaChyLEMse3RyYW5zcG9ydFR5cGU6InNvZnRwaG9uZSIsc29mdHBob25lQ2xpZW50SWQ6Yn0pLHQuaGl0Y2gocixNKSxvKTpuZXcgdC5SdGNQZWVyQ29ubmVjdGlvbkZhY3RvcnkoeSx0LmNvcmUuZ2V0V2ViU29ja2V0TWFuYWdlcigpLGIsdC5oaXRjaChyLEMse3RyYW5zcG9ydFR5cGU6InNvZnRwaG9uZSIsc29mdHBob25lQ2xpZW50SWQ6Yn0pLHQuaGl0Y2gocixNKSkpLFQuaXNCcm93c2VyU29mdFBob25lU3VwcG9ydGVkKCl8fE0oRS5VTlNVUFBPUlRFRF9CUk9XU0VSLCJDb25uZWN0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBicm93c2VyLiBTb21lIGZ1bmN0aW9uYWxpdHkgbWF5IG5vdCB3b3JrLiAiLCIiKSx4KHtzdWNjZXNzOmZ1bmN0aW9uKGUpe0YoIkNvbm5lY3Rpdml0eUNoZWNrUmVzdWx0IixudWxsLHtjb25uZWN0aXZpdHlDaGVja1R5cGU6Ik1pY3JvcGhvbmVQZXJtaXNzaW9uIixzdGF0dXM6ImdyYW50ZWQifSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7TShlLCJZb3VyIG1pY3JvcGhvbmUgaXMgbm90IGVuYWJsZWQgaW4geW91ciBicm93c2VyLiAiLCIiKSxGKCJDb25uZWN0aXZpdHlDaGVja1Jlc3VsdCIsbnVsbCx7Y29ubmVjdGl2aXR5Q2hlY2tUeXBlOiJNaWNyb3Bob25lUGVybWlzc2lvbiIsc3RhdHVzOiJkZW5pZWQifSl9fSk7Y29uc3Qgcz1BKCksYT1fKCksYz13KCFlLmRpc2FibGVFY2hvQ2FuY2VsbGF0aW9uKTtSKCksdGhpcy5yaW5ndG9uZUVuZ2luZT1udWxsO3ZhciB1PXt9LGw9e30scD0hMSxkPW51bGwsaD1udWxsLGY9ZnVuY3Rpb24oKXtwPSExLGQ9bnVsbCxoPW51bGx9O3RoaXMuZ2V0U2Vzc2lvbj1mdW5jdGlvbihlKXtyZXR1cm4gdVtlXX0sdGhpcy5yZXBsYWNlTG9jYWxNZWRpYVRyYWNrPWZ1bmN0aW9uKGUsdCl7dmFyIG49U1tlXS5zdHJlYW07aWYobil7dmFyIHI9bi5nZXRBdWRpb1RyYWNrcygpWzBdO3QuZW5hYmxlZD1yLmVuYWJsZWQsci5lbmFibGVkPSExLG4ucmVtb3ZlVHJhY2sociksbi5hZGRUcmFjayh0KX19O3ZhciBnPWZ1bmN0aW9uKGUpe2lmKHUuaGFzT3duUHJvcGVydHkoZSkpe3ZhciB0PXVbZV07bmV3IFByb21pc2UoKGZ1bmN0aW9uKG4scil7ZGVsZXRlIHVbZV0sZGVsZXRlIGxbZV0sdC5oYW5ndXAoKX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7bGlseS5nZXRMb2coKS53YXJuKCJDbGVhbiB1cCB0aGUgc2Vzc2lvbiBsb2NhbGx5ICIrZSx0Lm1lc3NhZ2UpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSl9fTt0aGlzLnN0YXJ0U2Vzc2lvbj1mdW5jdGlvbihuLHIpe3ZhciBzPXA/ZDpuLGE9cD9oOnI7aWYocyYmYSl7ZigpLGxbYV09ITAseS5pbmZvKCJTb2Z0cGhvbmUgY2FsbCBkZXRlY3RlZDoiLCJjb250YWN0SWQgIitzLmdldENvbnRhY3RJZCgpLCJhZ2VudCBjb25uZWN0aW9uSWQgIithKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGZ1bmN0aW9uKGUpe2lmKE9iamVjdC5rZXlzKGUpLmxlbmd0aD4wKXtmb3IodmFyIHQgaW4gZSllLmhhc093blByb3BlcnR5KHQpJiYocSgiTXVsdGlTZXNzaW9uSGFuZ1VwIixlW3RdLmNhbGxJZCx0KSxnKHQpKTt0aHJvdyBuZXcgRXJyb3IoImR1cGxpY2F0ZSBzZXNzaW9uIGRldGVjdGVkLCByZWZ1c2luZyB0byBzZXR1cCBuZXcgY29ubmVjdGlvbiIpfX0odSkscy5nZXRTdGF0dXMoKS50eXBlPT09dC5Db250YWN0U3RhdHVzVHlwZS5DT05ORUNUSU5HJiZGKCJTb2Z0cGhvbmUgQ29ubmVjdGluZyIscy5nZXRDb250YWN0SWQoKSksVygpO3ZhciBjLG0sdj1zLmdldEFnZW50Q29ubmVjdGlvbigpLmdldFNvZnRwaG9uZU1lZGlhSW5mbygpLEU9UCh2LmNhbGxDb25maWdKc29uKTtFLnVzZVdlYlNvY2tldFByb3ZpZGVyJiYoYz10LmNvcmUuZ2V0V2ViU29ja2V0TWFuYWdlcigpKSwobT1vP25ldyB0LlJUQ1Nlc3Npb24oRS5zaWduYWxpbmdFbmRwb2ludCxFLmljZVNlcnZlcnMsdi5jYWxsQ29udGV4dFRva2VuLHkscy5nZXRDb250YWN0SWQoKSxhLGMsbyk6bmV3IHQuUlRDU2Vzc2lvbihFLnNpZ25hbGluZ0VuZHBvaW50LEUuaWNlU2VydmVycyx2LmNhbGxDb250ZXh0VG9rZW4seSxzLmdldENvbnRhY3RJZCgpLGEsYykpLmVjaG9DYW5jZWxsYXRpb249IWUuZGlzYWJsZUVjaG9DYW5jZWxsYXRpb24sdVthXT1tLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29ubmVjdGlvbkV2ZW50cy5TRVNTSU9OX0lOSVQsZGF0YTp7Y29ubmVjdGlvbklkOmF9fSksbS5vblNlc3Npb25GYWlsZWQ9ZnVuY3Rpb24oZSx0KXtkZWxldGUgdVthXSxkZWxldGUgbFthXSxEKGUsdCksVShzLmdldENvbnRhY3RJZCgpLHQpLFkocyxlLnNlc3Npb25SZXBvcnQpfSxtLm9uU2Vzc2lvbkNvbm5lY3RlZD1mdW5jdGlvbihlKXtGKCJTb2Z0cGhvbmUgU2Vzc2lvbiBDb25uZWN0ZWQiLHMuZ2V0Q29udGFjdElkKCkpLHQuYmVjb21lTWFzdGVyKHQuTWFzdGVyVG9waWNzLlNFTkRfTE9HUyksaihlKSxWKHMpLEkocyl9LG0ub25TZXNzaW9uQ29tcGxldGVkPWZ1bmN0aW9uKGUpe0YoIlNvZnRwaG9uZSBTZXNzaW9uIENvbXBsZXRlZCIscy5nZXRDb250YWN0SWQoKSksZGVsZXRlIHVbYV0sZGVsZXRlIGxbYV0sWShzLGUuc2Vzc2lvblJlcG9ydCksayhhKX0sbS5vbkxvY2FsU3RyZWFtQWRkZWQ9ZnVuY3Rpb24oZSxuKXtTW2FdPXtzdHJlYW06bn0sdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5BZ2VudEV2ZW50cy5MT0NBTF9NRURJQV9TVFJFQU1fQ1JFQVRFRCxkYXRhOntjb25uZWN0aW9uSWQ6YX19KX0sbS5yZW1vdGVBdWRpb0VsZW1lbnQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlbW90ZS1hdWRpbyIpfHx3aW5kb3cucGFyZW50LnBhcmVudC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVtb3RlLWF1ZGlvIiksaT9tLmNvbm5lY3QoaS5nZXQoRS5pY2VTZXJ2ZXJzKSk6bS5jb25uZWN0KCl9fTt2YXIgbT1mdW5jdGlvbihlLG4pe3Vbbl0mJmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0dXNUeXBlLkVOREVEfHxlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0dXNUeXBlLkVSUk9SfHxlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0dXNUeXBlLk1JU1NFRH0oZSkmJihnKG4pLGYoKSksIWUuaXNTb2Z0cGhvbmVDYWxsKCl8fGxbbl18fGUuZ2V0U3RhdHVzKCkudHlwZSE9PXQuQ29udGFjdFN0YXR1c1R5cGUuQ09OTkVDVElORyYmZS5nZXRTdGF0dXMoKS50eXBlIT09dC5Db250YWN0U3RhdHVzVHlwZS5JTkNPTUlOR3x8KHQuaXNGaXJlZm94QnJvd3NlcigpJiZ0Lmhhc090aGVyQ29ubmVjdGVkQ0NQcygpP2Z1bmN0aW9uKGUsdCl7cD0hMCxkPWUsaD10fShlLG4pOnIuc3RhcnRTZXNzaW9uKGUsbikpfSx2PWZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0QWdlbnRDb25uZWN0aW9uKCkuY29ubmVjdGlvbklkO3kuaW5mbygiQ29udGFjdCBkZXRlY3RlZDoiLCJjb250YWN0SWQgIitlLmdldENvbnRhY3RJZCgpLCJhZ2VudCBjb25uZWN0aW9uSWQgIit0KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGxbdF18fChlLm9uUmVmcmVzaCgoZnVuY3Rpb24oKXttKGUsdCl9KSksZS5vbkRlc3Ryb3koKGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKGUpe3VbZV0mJmcoZSl9KHQpfSkpKX07ci5vbkluaXRDb250YWN0U3ViPXQuY29udGFjdCh2KSwobmV3IHQuQWdlbnQpLmdldENvbnRhY3RzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRBZ2VudENvbm5lY3Rpb24oKS5jb25uZWN0aW9uSWQ7eS5pbmZvKCJDb250YWN0IGV4aXN0IGluIHRoZSBzbmFwc2hvdC4gUmVpbml0aWF0ZSB0aGUgQ29udGFjdCBhbmQgUlRDIHNlc3Npb24gY3JlYXRpb24gZm9yIGNvbnRhY3RJZCIrZS5nZXRDb250YWN0SWQoKSwiYWdlbnQgY29ubmVjdGlvbklkICIrdCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx2KGUpLG0oZSx0KX0pKSx0aGlzLnRlcm1pbmF0ZT0oKT0+e3Iub25Jbml0Q29udGFjdFN1YiYmci5vbkluaXRDb250YWN0U3ViLnVuc3Vic2NyaWJlJiZyLm9uSW5pdENvbnRhY3RTdWIudW5zdWJzY3JpYmUoKSxzJiZzLnVuc3Vic2NyaWJlJiZzLnVuc3Vic2NyaWJlKCksYSYmYS51bnN1YnNjcmliZSYmYS51bnN1YnNjcmliZSgpLGMmJmMudW5zdWJzY3JpYmUmJmMudW5zdWJzY3JpYmUoKSxpLmNsZWFySWRsZVJ0Y1BlZXJDb25uZWN0aW9uVGltZXJJZCYmaS5jbGVhcklkbGVSdGNQZWVyQ29ubmVjdGlvblRpbWVySWQoKSxpPW51bGx9fSxJPWZ1bmN0aW9uKGUpe3ZhciBuPXQuY29yZS5nZXRVcHN0cmVhbSgpLHI9ZS5nZXRBZ2VudENvbm5lY3Rpb24oKTtpZihyKXt2YXIgbz1yLmdldFNvZnRwaG9uZU1lZGlhSW5mbygpO28/ITA9PT1vLmF1dG9BY2NlcHQ/KHkuaW5mbygiQXV0by1hY2NlcHQgaXMgZW5hYmxlZCwgc2VuZGluZyBvdXQgQWNjZXB0ZWQgZXZlbnQgdG8gc3RvcCByaW5ndG9uZS4uIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29udGFjdEV2ZW50cy5BQ0NFUFRFRCxkYXRhOm5ldyB0LkNvbnRhY3QoZS5jb250YWN0SWQpfSksbi5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LmNvcmUuZ2V0Q29udGFjdEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuQUNDRVBURUQsZS5jb250YWN0SWQpLGRhdGE6bmV3IHQuQ29udGFjdChlLmNvbnRhY3RJZCl9KSk6eS5pbmZvKCJBdXRvLWFjY2VwdCBpcyBkaXNhYmxlZCwgcmluZ3RvbmUgd2lsbCBiZSBzdG9wcGVkIGJ5IHVzZXIgYWN0aW9uLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk6eS5pbmZvKCJOb3QgYWJsZSB0byByZXRyaWV2ZSB0aGUgYXV0by1hY2NlcHQgc2V0dGluZyBmcm9tIG51bGwgU29mdHBob25lTWVkaWFJbmZvLCBpZ25vcmluZyBldmVudCBwdWJsaXNoLi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWVsc2UgeS5pbmZvKCJOb3QgYWJsZSB0byByZXRyaWV2ZSB0aGUgYXV0by1hY2NlcHQgc2V0dGluZyBmcm9tIG51bGwgQWdlbnRDb25uZWN0aW9uLCBpZ25vcmluZyBldmVudCBwdWJsaXNoLi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxBPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5NVVRFLEwpfSxfPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbmZpZ3VyYXRpb25FdmVudHMuU0VUX1NQRUFLRVJfREVWSUNFLE4pfSx3PWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5Db25maWd1cmF0aW9uRXZlbnRzLlNFVF9NSUNST1BIT05FX0RFVklDRSwodD0+Tyh7Li4udCxlbmFibGVFY2hvQ2FuY2VsbGF0aW9uOmV9KSkpfSxSPWZ1bmN0aW9uKCl7dHJ5e3QuaXNDaHJvbWVCcm93c2VyKCkmJnQuZ2V0Q2hyb21lQnJvd3NlclZlcnNpb24oKT40MyYmbmF2aWdhdG9yLnBlcm1pc3Npb25zLnF1ZXJ5KHtuYW1lOiJtaWNyb3Bob25lIn0pLnRoZW4oKGZ1bmN0aW9uKGUpe2Uub25jaGFuZ2U9ZnVuY3Rpb24oKXt5LmluZm8oIk1pY3JvcGhvbmUgUGVybWlzc2lvbjogIitlLnN0YXRlKSxGKCJDb25uZWN0aXZpdHlDaGVja1Jlc3VsdCIsbnVsbCx7Y29ubmVjdGl2aXR5Q2hlY2tUeXBlOiJNaWNyb3Bob25lUGVybWlzc2lvbiIsc3RhdHVzOmUuc3RhdGV9KSwiZGVuaWVkIj09PWUuc3RhdGUmJk0oRS5NSUNST1BIT05FX05PVF9TSEFSRUQsIllvdXIgbWljcm9waG9uZSBpcyBub3QgZW5hYmxlZCBpbiB5b3VyIGJyb3dzZXIuICIsIiIpfX0pKX1jYXRjaChlKXt5LmVycm9yKCJGYWlsZWQgaW4gZGV0ZWN0aW5nIG1pY3JvcGhvbmUgcGVybWlzc2lvbiBzdGF0dXM6ICIrZSl9fSxrPWZ1bmN0aW9uKGUpe2RlbGV0ZSBTW2VdLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQWdlbnRFdmVudHMuTVVURV9UT0dHTEUsZGF0YTp7bXV0ZWQ6ITF9fSl9LEw9ZnVuY3Rpb24oZSl7dmFyIG47aWYoMCE9PXQua2V5cyhTKS5sZW5ndGgpe2Zvcih2YXIgciBpbiBlJiZ2b2lkIDAhPT1lLm11dGUmJihuPWUubXV0ZSksUylpZihTLmhhc093blByb3BlcnR5KHIpKXt2YXIgbz1TW3JdLnN0cmVhbTtpZihvKXt2YXIgaT1vLmdldEF1ZGlvVHJhY2tzKClbMF07dm9pZCAwIT09bj8oaS5lbmFibGVkPSFuLFNbcl0ubXV0ZWQ9bixuP3kuaW5mbygiQWdlbnQgaGFzIG11dGVkIHRoZSBjb250YWN0LCBjb25uZWN0aW9uSWQgLSAgIityKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpOnkuaW5mbygiQWdlbnQgaGFzIHVubXV0ZWQgdGhlIGNvbnRhY3QsIGNvbm5lY3Rpb25JZCAtICIrcikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSk6bj1TW3JdLm11dGVkfHwhMX19dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5BZ2VudEV2ZW50cy5NVVRFX1RPR0dMRSxkYXRhOnttdXRlZDpufX0pfX0sTj1mdW5jdGlvbihlPXt9KXtjb25zdCBuPWUuZGV2aWNlSWR8fCIiO2lmKHQuZ2V0TG9nKCkuaW5mbyhgW0F1ZGlvIERldmljZSBTZXR0aW5nc10gQXR0ZW1wdGluZyB0byBzZXQgc3BlYWtlciBkZXZpY2UgJHtufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbil7dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlbW90ZS1hdWRpbyIpfHx3aW5kb3cucGFyZW50LnBhcmVudC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVtb3RlLWF1ZGlvIik7ciYmImZ1bmN0aW9uIj09dHlwZW9mIHIuc2V0U2lua0lkP3Iuc2V0U2lua0lkKG4pLnRoZW4oKCgpPT57dC5nZXRMb2coKS5pbmZvKGBbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBTcGVha2VyIGRldmljZSAke259IHN1Y2Nlc3NmdWxseSBzZXQgdG8gc3BlYWtlciBhdWRpbyBlbGVtZW50YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuU1BFQUtFUl9ERVZJQ0VfQ0hBTkdFRCxkYXRhOntkZXZpY2VJZDpufX0pfSkpLmNhdGNoKChlPT57dC5nZXRMb2coKS5lcnJvcigiW0F1ZGlvIERldmljZSBTZXR0aW5nc10gRmFpbGVkIHRvIHNldCBzcGVha2VyIGRldmljZSAiK24pLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKTp0LmdldExvZygpLndhcm4oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIFNldHRpbmcgc3BlYWtlciBkZXZpY2UgY2FuY2VsbGVkIGR1ZSB0byBtaXNzaW5nIHJlbW90ZUF1ZGlvRWxlbWVudCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9ZWxzZSB0LmdldExvZygpLndhcm4oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIFNldHRpbmcgc3BlYWtlciBkZXZpY2UgY2FuY2VsbGVkIGR1ZSB0byBtaXNzaW5nIGRldmljZUlkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0sTz1mdW5jdGlvbihlPXt9KXtjb25zdCBuPWUuZGV2aWNlSWR8fCIiO2lmKHQuZ2V0TG9nKCkuaW5mbyhgW0F1ZGlvIERldmljZSBTZXR0aW5nc10gQXR0ZW1wdGluZyB0byBzZXQgbWljcm9waG9uZSBkZXZpY2UgJHtufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksMCE9PXQua2V5cyhTKS5sZW5ndGgpaWYobil7dmFyIHI9dC5jb3JlLmdldFNvZnRwaG9uZU1hbmFnZXIoKSxvPXthdWRpbzp7ZGV2aWNlSWQ6e2V4YWN0Om59fX07ZS5lbmFibGVFY2hvQ2FuY2VsbGF0aW9ufHwoby5hdWRpby5lY2hvQ2FuY2VsbGF0aW9uPSExKSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6ImVjaG9DYW5jZWxsYXRpb25DaGVjayIsZGF0YTp7Y291bnQ6MSxkaXNhYmxlRWNob0NhbmNlbGxhdGlvbjohZS5lbmFibGVFY2hvQ2FuY2VsbGF0aW9ufX0pLG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKG8pLnRoZW4oKGU9Pnt0cnl7dmFyIG89ZS5nZXRBdWRpb1RyYWNrcygpWzBdO2Zvcih2YXIgaSBpbiBTKVMuaGFzT3duUHJvcGVydHkoaSkmJihTW2ldLnN0cmVhbSxyLmdldFNlc3Npb24oaSkuX3BjLmdldFNlbmRlcnMoKVswXS5yZXBsYWNlVHJhY2sobykudGhlbigoZnVuY3Rpb24oKXtyLnJlcGxhY2VMb2NhbE1lZGlhVHJhY2soaSxvKSx0LmdldExvZygpLmluZm8oYFtBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIE1pY3JvcGhvbmUgZGV2aWNlICR7bn0gc3VjY2Vzc2Z1bGx5IHNldCB0byBsb2NhbCBtZWRpYSBzdHJlYW0gaW4gUlRDUnRwU2VuZGVyYCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKSl9Y2F0Y2goZSl7cmV0dXJuIHZvaWQgdC5nZXRMb2coKS5lcnJvcigiW0F1ZGlvIERldmljZSBTZXR0aW5nc10gRmFpbGVkIHRvIHNldCBtaWNyb3Bob25lIGRldmljZSAiK24pLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX10LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuTUlDUk9QSE9ORV9ERVZJQ0VfQ0hBTkdFRCxkYXRhOntkZXZpY2VJZDpufX0pfSkpLmNhdGNoKChlPT57dC5nZXRMb2coKS5lcnJvcigiW0F1ZGlvIERldmljZSBTZXR0aW5nc10gRmFpbGVkIHRvIHNldCBtaWNyb3Bob25lIGRldmljZSAiK24pLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKX1lbHNlIHQuZ2V0TG9nKCkud2FybigiW0F1ZGlvIERldmljZSBTZXR0aW5nc10gU2V0dGluZyBtaWNyb3Bob25lIGRldmljZSBjYW5jZWxsZWQgZHVlIHRvIG1pc3NpbmcgZGV2aWNlSWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO2Vsc2UgdC5nZXRMb2coKS53YXJuKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBTZXR0aW5nIG1pY3JvcGhvbmUgZGV2aWNlIGNhbmNlbGxlZCBkdWUgdG8gbWlzc2luZyBsb2NhbE1lZGlhU3RyZWFtIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0sRD1mdW5jdGlvbihlLG4pe2lmKG49PT10LlJUQ0Vycm9ycy5JQ0VfQ09MTEVDVElPTl9USU1FT1VUKXtmb3IodmFyIHI9IlxuIixvPTA7bzxlLl9pY2VTZXJ2ZXJzLmxlbmd0aDtvKyspZm9yKHZhciBpPTA7aTxlLl9pY2VTZXJ2ZXJzW29dLnVybHMubGVuZ3RoO2krKylyPXIrZS5faWNlU2VydmVyc1tvXS51cmxzW2ldKyJcbiI7TShFLklDRV9DT0xMRUNUSU9OX1RJTUVPVVQsIkljZSBjb2xsZWN0aW9uIHRpbWVkb3V0LiAiLHIpfWVsc2Ugbj09PXQuUlRDRXJyb3JzLlVTRVJfQlVTWT9NKEUuVVNFUl9CVVNZX0VSUk9SLCJTb2Z0cGhvbmUgY2FsbCBVc2VyQnVzeSBlcnJvci4gIiwiIik6bj09PXQuUlRDRXJyb3JzLlNJR05BTExJTkdfSEFORFNIQUtFX0ZBSUxVUkU/TShFLlNJR05BTExJTkdfSEFORFNIQUtFX0ZBSUxVUkUsIkhhbmRzaGFraW5nIHdpdGggU2lnbmFsbGluZyBTZXJ2ZXIgIitlLl9zaWduYWxpbmdVcmkrIiBmYWlsZWQuICIsZS5fc2lnbmFsaW5nVXJpKTpuPT09dC5SVENFcnJvcnMuR1VNX1RJTUVPVVRfRkFJTFVSRXx8bj09PXQuUlRDRXJyb3JzLkdVTV9PVEhFUl9GQUlMVVJFP00oRS5NSUNST1BIT05FX05PVF9TSEFSRUQsIllvdXIgbWljcm9waG9uZSBpcyBub3QgZW5hYmxlZCBpbiB5b3VyIGJyb3dzZXIuICIsIiIpOm49PT10LlJUQ0Vycm9ycy5TSUdOQUxMSU5HX0NPTk5FQ1RJT05fRkFJTFVSRT9NKEUuU0lHTkFMTElOR19DT05ORUNUSU9OX0ZBSUxVUkUsIlVSTCAiK2UuX3NpZ25hbGluZ1VyaSsiIGNhbm5vdCBiZSByZWFjaGVkLiAiLGUuX3NpZ25hbGluZ1VyaSk6bj09PXQuUlRDRXJyb3JzLkNBTExfTk9UX0ZPVU5EP3kuZXJyb3IoIlNvZnRwaG9uZSBjYWxsIGZhaWxlZCBkdWUgdG8gQ2FsbE5vdEZvdW5kRXhjZXB0aW9uLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk6TShFLldFQlJUQ19FUlJPUiwid2VicnRjIHN5c3RlbSBlcnJvci4gIiwiIil9LFA9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKC8mcXVvdDsvZywnIicpO3JldHVybiBKU09OLnBhcnNlKHQpfSx4PWZ1bmN0aW9uKGUpe3ZhciB0PWV8fHt9O3Quc3VjY2Vzcz10LnN1Y2Nlc3N8fGZ1bmN0aW9uKCl7fSx0LmZhaWx1cmU9dC5mYWlsdXJlfHxmdW5jdGlvbigpe307dmFyIG49e2F1ZGlvOiEwfSxyPW51bGw7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb21pc2Upe2lmKCJvYmplY3QiPT10eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcyYmImZ1bmN0aW9uIj09dHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKXI9bmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEobik7ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2YgbmF2aWdhdG9yLndlYmtpdEdldFVzZXJNZWRpYSlyZXR1cm4gdm9pZCB0LmZhaWx1cmUoRS5VTlNVUFBPUlRFRF9CUk9XU0VSKTtyPW5ldyBQcm9taXNlKChmdW5jdGlvbihlLHQpe25hdmlnYXRvci53ZWJraXRHZXRVc2VyTWVkaWEobixlLHQpfSkpfXJldHVybiByLnRoZW4oKGZ1bmN0aW9uKGUpe3ZhciBuPWUuZ2V0QXVkaW9UcmFja3MoKTtuJiZuLmxlbmd0aD4wP3Quc3VjY2VzcyhlKTp0LmZhaWx1cmUoRS5NSUNST1BIT05FX05PVF9TSEFSRUQpfSksKGZ1bmN0aW9uKGUpe3QuZmFpbHVyZShFLk1JQ1JPUEhPTkVfTk9UX1NIQVJFRCl9KSkscn10LmZhaWx1cmUoRS5VTlNVUFBPUlRFRF9CUk9XU0VSKX0sTT1mdW5jdGlvbihlLG4scil7eS5lcnJvcigiU29mdHBob25lIGVycm9yIG9jY3VycmVkIDogIixlLG58fCIiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQWdlbnRFdmVudHMuU09GVFBIT05FX0VSUk9SLGRhdGE6bmV3IHQuU29mdHBob25lRXJyb3IoZSxuLHIpfSl9LFU9ZnVuY3Rpb24oZSx0KXtGKCJTb2Z0cGhvbmUgU2Vzc2lvbiBGYWlsZWQiLGUse2ZhaWxlZFJlYXNvbjp0fSl9LEY9ZnVuY3Rpb24oZSxuLHIpe3QucHVibGlzaE1ldHJpYyh7bmFtZTplLGNvbnRhY3RJZDpuLGRhdGE6cn0pfSxxPWZ1bmN0aW9uKGUsdCxuKXtGKGUsdCxbe25hbWU6IkFnZW50Q29ubmVjdGlvbklkIix2YWx1ZTpufV0pLHkuaW5mbygiUHVibGlzaCBtdWx0aXBsZSBzZXNzaW9uIGVycm9yIG1ldHJpY3MiLGUsImNvbnRhY3RJZCAiK3QsImFnZW50IGNvbm5lY3Rpb25JZCAiK24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9O1QuaXNCcm93c2VyU29mdFBob25lU3VwcG9ydGVkPWZ1bmN0aW9uKCl7cmV0dXJuISEodC5pc09wZXJhQnJvd3NlcigpJiZ0LmdldE9wZXJhQnJvd3NlclZlcnNpb24oKT4xNyl8fCEhKHQuaXNDaHJvbWVCcm93c2VyKCkmJnQuZ2V0Q2hyb21lQnJvd3NlclZlcnNpb24oKT4yMil8fCEhKHQuaXNGaXJlZm94QnJvd3NlcigpJiZ0LmdldEZpcmVmb3hCcm93c2VyVmVyc2lvbigpPjIxKX07dmFyIEI9ZnVuY3Rpb24oZSl7dmFyIHQ9cy5zbGljZSgpO3M9W10sdC5sZW5ndGg+MCYmZS5zZW5kU29mdHBob25lTWV0cmljcyh0LHtzdWNjZXNzOmZ1bmN0aW9uKCl7eS5pbmZvKCJzZW5kU29mdHBob25lTWV0cmljcyBzdWNjZXNzIitKU09OLnN0cmluZ2lmeSh0KSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt5LmVycm9yKCJzZW5kU29mdHBob25lTWV0cmljcyBmYWlsZWQuIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0pfSxqPWZ1bmN0aW9uKGUpe209d2luZG93LnNldEludGVydmFsKChmdW5jdGlvbigpe2UuZ2V0VXNlckF1ZGlvU3RhdHMoKS50aGVuKChmdW5jdGlvbihlKXt2YXIgdD11LG49SCh1PWUsdCxvKTtzLnB1c2gobiksRyhuKX0pLChmdW5jdGlvbihlKXt5LmRlYnVnKCJGYWlsZWQgdG8gZ2V0IHVzZXIgYXVkaW8gc3RhdHMuIixlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLGUuZ2V0UmVtb3RlQXVkaW9TdGF0cygpLnRoZW4oKGZ1bmN0aW9uKGUpe3ZhciB0PWwsbj1IKGw9ZSx0LGkpO3MucHVzaChuKSxHKG4pfSksKGZ1bmN0aW9uKGUpe3kuZGVidWcoIkZhaWxlZCB0byBnZXQgcmVtb3RlIGF1ZGlvIHN0YXRzLiIsZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKX0pLDFlMyl9LFY9ZnVuY3Rpb24oZSl7dj13aW5kb3cuc2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7QihlKX0pLDNlNCl9LFc9ZnVuY3Rpb24oKXt1PW51bGwsbD1udWxsLHM9W10sYT1bXSxjPVtdLG09bnVsbCx2PW51bGwscD0wLGQ9MCxoPTAsZj0wLGc9MH0sSD1mdW5jdGlvbihlLHQsbil7aWYodCYmZSl7dmFyIHI9ZS5wYWNrZXRzTG9zdD50LnBhY2tldHNMb3N0P2UucGFja2V0c0xvc3QtdC5wYWNrZXRzTG9zdDowLG89ZS5wYWNrZXRzQ291bnQ+dC5wYWNrZXRzQ291bnQ/ZS5wYWNrZXRzQ291bnQtdC5wYWNrZXRzQ291bnQ6MDtyZXR1cm4geihvLG4pLEsoZS5hdWRpb0xldmVsLG4pLG5ldyAkKGUudGltZXN0YW1wLHIsbyxuLGUuYXVkaW9MZXZlbCxlLmpiTWlsbGlzZWNvbmRzLGUucnR0TWlsbGlzZWNvbmRzKX1yZXR1cm4gbmV3ICQoZS50aW1lc3RhbXAsZS5wYWNrZXRzTG9zdCxlLnBhY2tldHNDb3VudCxuLGUuYXVkaW9MZXZlbCxlLmpiTWlsbGlzZWNvbmRzLGUucnR0TWlsbGlzZWNvbmRzKX0sRz1mdW5jdGlvbihlKXtpZihlLnNvZnRwaG9uZVN0cmVhbVR5cGU9PT1vKXtmb3IoO2EubGVuZ3RoPj0xMDgwMDspYS5zaGlmdCgpO2EucHVzaChlKX1lbHNlIGlmKGUuc29mdHBob25lU3RyZWFtVHlwZT09PWkpe2Zvcig7Yy5sZW5ndGg+PTEwODAwOyljLnNoaWZ0KCk7Yy5wdXNoKGUpfX0sej1mdW5jdGlvbihlLHQpe3Q9PT1vPyhnKyssZTw9MD9wKys6cD0wKTp0PT09aSYmKGU8PTA/aCsrOmg9MCl9LEs9ZnVuY3Rpb24oZSx0KXt0PT09bz9udWxsIT09ZSYmZTw9MT9kKys6ZD0wOnQ9PT1pJiYobnVsbCE9PWUmJmU8PTE/ZisrOmY9MCl9LFg9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPT1lJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbChlKSxudWxsfSxZPWZ1bmN0aW9uKG4scil7bT1YKG0pLHY9WCh2KSxmdW5jdGlvbihuLHIscyx1KXtyLnN0cmVhbVN0YXRzPVtKKHMsbyksSih1LGkpXTt2YXIgbD17Y2FsbFN0YXJ0VGltZTpyLnNlc3Npb25TdGFydFRpbWUsY2FsbEVuZFRpbWU6ci5zZXNzaW9uRW5kVGltZSxndW1UaW1lTWlsbGlzOnIuZ3VtVGltZU1pbGxpcyxpbml0aWFsaXphdGlvblRpbWVNaWxsaXM6ci5pbml0aWFsaXphdGlvblRpbWVNaWxsaXMsaWNlQ29sbGVjdGlvblRpbWVNaWxsaXM6ci5pY2VDb2xsZWN0aW9uVGltZU1pbGxpcyxzaWduYWxsaW5nQ29ubmVjdFRpbWVNaWxsaXM6ci5zaWduYWxsaW5nQ29ubmVjdFRpbWVNaWxsaXMsaGFuZHNoYWtpbmdUaW1lTWlsbGlzOnIuaGFuZHNoYWtpbmdUaW1lTWlsbGlzLHByZVRhbGtpbmdUaW1lTWlsbGlzOnIucHJlVGFsa2luZ1RpbWVNaWxsaXMsdGFsa2luZ1RpbWVNaWxsaXM6ci50YWxraW5nVGltZU1pbGxpcyxjbGVhbnVwVGltZU1pbGxpczpyLmNsZWFudXBUaW1lTWlsbGlzLGljZUNvbGxlY3Rpb25GYWlsdXJlOnIuaWNlQ29sbGVjdGlvbkZhaWx1cmUsc2lnbmFsbGluZ0Nvbm5lY3Rpb25GYWlsdXJlOnIuc2lnbmFsbGluZ0Nvbm5lY3Rpb25GYWlsdXJlLGhhbmRzaGFraW5nRmFpbHVyZTpyLmhhbmRzaGFraW5nRmFpbHVyZSxndW1PdGhlckZhaWx1cmU6ci5ndW1PdGhlckZhaWx1cmUsZ3VtVGltZW91dEZhaWx1cmU6ci5ndW1UaW1lb3V0RmFpbHVyZSxjcmVhdGVPZmZlckZhaWx1cmU6ci5jcmVhdGVPZmZlckZhaWx1cmUsc2V0TG9jYWxEZXNjcmlwdGlvbkZhaWx1cmU6ci5zZXRMb2NhbERlc2NyaXB0aW9uRmFpbHVyZSx1c2VyQnVzeUZhaWx1cmU6ci51c2VyQnVzeUZhaWx1cmUsaW52YWxpZFJlbW90ZVNEUEZhaWx1cmU6ci5pbnZhbGlkUmVtb3RlU0RQRmFpbHVyZSxub1JlbW90ZUljZUNhbmRpZGF0ZUZhaWx1cmU6ci5ub1JlbW90ZUljZUNhbmRpZGF0ZUZhaWx1cmUsc2V0UmVtb3RlRGVzY3JpcHRpb25GYWlsdXJlOnIuc2V0UmVtb3RlRGVzY3JpcHRpb25GYWlsdXJlLHNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3M6ci5zdHJlYW1TdGF0c307bi5zZW5kU29mdHBob25lUmVwb3J0KGwse3N1Y2Nlc3M6ZnVuY3Rpb24oKXt5LmluZm8oInNlbmRTb2Z0cGhvbmVSZXBvcnQgc3VjY2VzcyIrSlNPTi5zdHJpbmdpZnkobCkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7eS5lcnJvcigic2VuZFNvZnRwaG9uZVJlcG9ydCBmYWlsZWQuIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0pO3ZhciBtPXtBVURJT19JTlBVVDp7cGFja2V0c0NvdW50OmEubWFwKChlPT5lLnBhY2tldHNDb3VudCkpLHBhY2tldHNMb3N0OmEubWFwKChlPT5lLnBhY2tldHNMb3N0KSksYXVkaW9MZXZlbDphLm1hcCgoZT0+ZS5hdWRpb0xldmVsKSksaml0dGVyQnVmZmVyTWlsbGlzOmEubWFwKChlPT5lLmppdHRlckJ1ZmZlck1pbGxpcykpfSxBVURJT19PVVRQVVQ6e3BhY2tldHNDb3VudDpjLm1hcCgoZT0+ZS5wYWNrZXRzQ291bnQpKSxwYWNrZXRzTG9zdDpjLm1hcCgoZT0+ZS5wYWNrZXRzTG9zdCkpLGF1ZGlvTGV2ZWw6Yy5tYXAoKGU9PmUuYXVkaW9MZXZlbCkpLGppdHRlckJ1ZmZlck1pbGxpczpjLm1hcCgoZT0+ZS5qaXR0ZXJCdWZmZXJNaWxsaXMpKSxyb3VuZFRyaXBUaW1lTWlsbGlzOmMubWFwKChlPT5lLnJvdW5kVHJpcFRpbWVNaWxsaXMpKX19LHY9ey4uLmwsc29mdHBob25lU3RyZWFtUGVyU2Vjb25kU3RhdGlzdGljczptLGljZUNvbm5lY3Rpb25zTG9zdDpyLmljZUNvbm5lY3Rpb25zTG9zdCxpY2VDb25uZWN0aW9uc0ZhaWxlZDpyLmljZUNvbm5lY3Rpb25zRmFpbGVkfHxudWxsLHBlZXJDb25uZWN0aW9uRmFpbGVkOnIucGVlckNvbm5lY3Rpb25GYWlsZWR8fG51bGwscnRjSnNWZXJzaW9uOnIucnRjSnNWZXJzaW9ufHxudWxsLGNvbnNlY3V0aXZlTm9BdWRpb0lucHV0UGFja2V0czpwLGNvbnNlY3V0aXZlTG93SW5wdXRBdWRpb0xldmVsOmQsY29uc2VjdXRpdmVOb0F1ZGlvT3V0cHV0UGFja2V0czpoLGNvbnNlY3V0aXZlTG93T3V0cHV0QXVkaW9MZXZlbDpmLGF1ZGlvSW5wdXRDb25uZWN0ZWREdXJhdGlvblNlY29uZHM6Z307dC5wdWJsaXNoU29mdHBob25lUmVwb3J0KHtjb250YWN0SWQ6bi5nZXRDb250YWN0SWQoKSxjY3BWZXJzaW9uOmUuY2NwVmVyc2lvbixyZXBvcnQ6dn0pLHkuaW5mbygic2VudCBUZWxlbWV0cnlDYWxsUmVwb3J0ICIrSlNPTi5zdHJpbmdpZnkodikpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KG4scixKKHUsbyksSihsLGkpKSxCKG4pfSwkPWZ1bmN0aW9uKGUsdCxuLHIsbyxpLHMpe3RoaXMuc29mdHBob25lU3RyZWFtVHlwZT1yLHRoaXMudGltZXN0YW1wPWUsdGhpcy5wYWNrZXRzTG9zdD10LHRoaXMucGFja2V0c0NvdW50PW4sdGhpcy5hdWRpb0xldmVsPW8sdGhpcy5qaXR0ZXJCdWZmZXJNaWxsaXM9aSx0aGlzLnJvdW5kVHJpcFRpbWVNaWxsaXM9c30sSj1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgJCgoZT1lfHx7fSkudGltZXN0YW1wLGUucGFja2V0c0xvc3QsZS5wYWNrZXRzQ291bnQsdCxlLmF1ZGlvTGV2ZWwpfSxRPWZ1bmN0aW9uKGUpe3RoaXMuX29yaWdpbmFsTG9nZ2VyPWU7dmFyIG49dGhpczt0aGlzLl90ZWU9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHNbMF0pLG89IiI7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oKXtvKz0iICVzIn0pKSxyLmFwcGx5KG4uX29yaWdpbmFsTG9nZ2VyLFt0LkxvZ0NvbXBvbmVudC5TT0ZUUEhPTkUsb10uY29uY2F0KGUpKX19fTtRLnByb3RvdHlwZS5kZWJ1Zz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90ZWUoMSx0aGlzLl9vcmlnaW5hbExvZ2dlci5kZWJ1ZykoYXJndW1lbnRzKX0sUS5wcm90b3R5cGUuaW5mbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90ZWUoMix0aGlzLl9vcmlnaW5hbExvZ2dlci5pbmZvKShhcmd1bWVudHMpfSxRLnByb3RvdHlwZS5sb2c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGVlKDMsdGhpcy5fb3JpZ2luYWxMb2dnZXIubG9nKShhcmd1bWVudHMpfSxRLnByb3RvdHlwZS53YXJuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RlZSg0LHRoaXMuX29yaWdpbmFsTG9nZ2VyLndhcm4pKGFyZ3VtZW50cyl9LFEucHJvdG90eXBlLmVycm9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RlZSg1LHRoaXMuX29yaWdpbmFsTG9nZ2VyLmVycm9yKShhcmd1bWVudHMpfSx0LlNvZnRwaG9uZU1hbmFnZXI9VH0oKX0sOTQ0OigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWZ1bmN0aW9uKCl7cmV0dXJuIHQuY2FjaGUuaGFzT3duUHJvcGVydHkoYXJndW1lbnRzWzBdKXx8KHQuY2FjaGVbYXJndW1lbnRzWzBdXT10LnBhcnNlKGFyZ3VtZW50c1swXSkpLHQuZm9ybWF0LmNhbGwobnVsbCx0LmNhY2hlW2FyZ3VtZW50c1swXV0sYXJndW1lbnRzKX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsLTEpLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gcihlLHQpe2Zvcih2YXIgbj1bXTt0PjA7blstLXRdPWUpO3JldHVybiBuLmpvaW4oIiIpfXQuZm9ybWF0PWZ1bmN0aW9uKGUsbyl7dmFyIGkscyxhLGMsdSxsLHAsZD0xLGg9ZS5sZW5ndGgsZj0iIixnPVtdO2ZvcihzPTA7czxoO3MrKylpZigic3RyaW5nIj09PShmPW4oZVtzXSkpKWcucHVzaChlW3NdKTtlbHNlIGlmKCJhcnJheSI9PT1mKXtpZigoYz1lW3NdKVsyXSlmb3IoaT1vW2RdLGE9MDthPGNbMl0ubGVuZ3RoO2ErKyl7aWYoIWkuaGFzT3duUHJvcGVydHkoY1syXVthXSkpdGhyb3cgdCgnW3NwcmludGZdIHByb3BlcnR5ICIlcyIgZG9lcyBub3QgZXhpc3QnLGNbMl1bYV0pO2k9aVtjWzJdW2FdXX1lbHNlIGk9Y1sxXT9vW2NbMV1dOm9bZCsrXTtpZigvW15zXS8udGVzdChjWzhdKSYmIm51bWJlciIhPW4oaSkpdGhyb3cgdCgiW3NwcmludGZdIGV4cGVjdGluZyBudW1iZXIgYnV0IGZvdW5kICVzIixuKGkpKTtzd2l0Y2goY1s4XSl7Y2FzZSJiIjppPWkudG9TdHJpbmcoMik7YnJlYWs7Y2FzZSJjIjppPVN0cmluZy5mcm9tQ2hhckNvZGUoaSk7YnJlYWs7Y2FzZSJkIjppPXBhcnNlSW50KGksMTApO2JyZWFrO2Nhc2UiZSI6aT1jWzddP2kudG9FeHBvbmVudGlhbChjWzddKTppLnRvRXhwb25lbnRpYWwoKTticmVhaztjYXNlImYiOmk9Y1s3XT9wYXJzZUZsb2F0KGkpLnRvRml4ZWQoY1s3XSk6cGFyc2VGbG9hdChpKTticmVhaztjYXNlIm8iOmk9aS50b1N0cmluZyg4KTticmVhaztjYXNlInMiOmk9KGk9U3RyaW5nKGkpKSYmY1s3XT9pLnN1YnN0cmluZygwLGNbN10pOmk7YnJlYWs7Y2FzZSJ1IjppPj4+PTA7YnJlYWs7Y2FzZSJ4IjppPWkudG9TdHJpbmcoMTYpO2JyZWFrO2Nhc2UiWCI6aT1pLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfWk9L1tkZWZdLy50ZXN0KGNbOF0pJiZjWzNdJiZpPj0wPyIrIitpOmksbD1jWzRdPyIwIj09Y1s0XT8iMCI6Y1s0XS5jaGFyQXQoMSk6IiAiLHA9Y1s2XS1TdHJpbmcoaSkubGVuZ3RoLHU9Y1s2XT9yKGwscCk6IiIsZy5wdXNoKGNbNV0/aSt1OnUraSl9cmV0dXJuIGcuam9pbigiIil9LHQuY2FjaGU9e30sdC5wYXJzZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ZSxuPVtdLHI9W10sbz0wO3Q7KXtpZihudWxsIT09KG49L15bXlx4MjVdKy8uZXhlYyh0KSkpci5wdXNoKG5bMF0pO2Vsc2UgaWYobnVsbCE9PShuPS9eXHgyNXsyfS8uZXhlYyh0KSkpci5wdXNoKCIlIik7ZWxzZXtpZihudWxsPT09KG49L15ceDI1KD86KFsxLTldXGQqKVwkfFwoKFteXCldKylcKSk/KFwrKT8oMHwnW14kXSk/KC0pPyhcZCspPyg/OlwuKFxkKykpPyhbYi1mb3N1eFhdKS8uZXhlYyh0KSkpdGhyb3ciW3NwcmludGZdIGh1aD8iO2lmKG5bMl0pe298PTE7dmFyIGk9W10scz1uWzJdLGE9W107aWYobnVsbD09PShhPS9eKFthLXpfXVthLXpfXGRdKikvaS5leGVjKHMpKSl0aHJvdyJbc3ByaW50Zl0gaHVoPyI7Zm9yKGkucHVzaChhWzFdKTsiIiE9PShzPXMuc3Vic3RyaW5nKGFbMF0ubGVuZ3RoKSk7KWlmKG51bGwhPT0oYT0vXlwuKFthLXpfXVthLXpfXGRdKikvaS5leGVjKHMpKSlpLnB1c2goYVsxXSk7ZWxzZXtpZihudWxsPT09KGE9L15cWyhcZCspXF0vLmV4ZWMocykpKXRocm93IltzcHJpbnRmXSBodWg/IjtpLnB1c2goYVsxXSl9blsyXT1pfWVsc2Ugb3w9MjtpZigzPT09byl0aHJvdyJbc3ByaW50Zl0gbWl4aW5nIHBvc2l0aW9uYWwgYW5kIG5hbWVkIHBsYWNlaG9sZGVycyBpcyBub3QgKHlldCkgc3VwcG9ydGVkIjtyLnB1c2gobil9dD10LnN1YnN0cmluZyhuWzBdLmxlbmd0aCl9cmV0dXJuIHJ9LGUuc3ByaW50Zj10LGUudnNwcmludGY9ZnVuY3Rpb24oZSxuLHIpe3JldHVybihyPW4uc2xpY2UoMCkpLnNwbGljZSgwLDAsZSksdC5hcHBseShudWxsLHIpfX0oKX0sODI6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dDt2YXIgbj1mdW5jdGlvbigpe307bi5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt0aHJvdyBuZXcgdC5Ob3RJbXBsZW1lbnRlZEVycm9yfSxuLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IHQuTm90SW1wbGVtZW50ZWRFcnJvcn07dmFyIHI9ZnVuY3Rpb24oKXtuLmNhbGwodGhpcyl9OyhyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cixyLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7fSxyLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKGUpe307dmFyIG89ZnVuY3Rpb24oZSx0KXtuLmNhbGwodGhpcyksdGhpcy53aW5kb3c9ZSx0aGlzLmRvbWFpbj10fHwiKiJ9OyhvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9byxvLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKGUpe3RoaXMud2luZG93LnBvc3RNZXNzYWdlKGUsdGhpcy5kb21haW4pfSxvLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZSl9O3ZhciBpPWZ1bmN0aW9uKGUsdCxyKXtuLmNhbGwodGhpcyksdGhpcy5pbnB1dD1lLHRoaXMub3V0cHV0PXQsdGhpcy5kb21haW49cnx8IioifTsoaS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWksaS5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt0aGlzLm91dHB1dC5wb3N0TWVzc2FnZShlLHRoaXMuZG9tYWluKX0saS5wcm90b3R5cGUub25NZXNzYWdlPWZ1bmN0aW9uKGUpe3RoaXMuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsKHQ9Pnt0LnNvdXJjZT09PXRoaXMub3V0cHV0JiZlKHQpfSkpfTt2YXIgcz1mdW5jdGlvbihlKXtuLmNhbGwodGhpcyksdGhpcy5wb3J0PWUsdGhpcy5pZD10LnJhbmRvbUlkKCl9OyhzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cyxzLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKGUpe3RoaXMucG9ydC5wb3N0TWVzc2FnZShlKX0scy5wcm90b3R5cGUub25NZXNzYWdlPWZ1bmN0aW9uKGUpe3RoaXMucG9ydC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixlKX0scy5wcm90b3R5cGUuZ2V0SWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH07dmFyIGE9ZnVuY3Rpb24oZSl7bi5jYWxsKHRoaXMpLHRoaXMuc3RyZWFtTWFwPWU/dC5pbmRleChlLChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRJZCgpfSkpOnt9LHRoaXMubWVzc2FnZUxpc3RlbmVycz1bXX07KGEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1hLGEucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24oZSl7dGhpcy5nZXRTdHJlYW1zKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dHJ5e3Quc2VuZChlKX1jYXRjaChlKXt9fSkpfSxhLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dGhpcy5tZXNzYWdlTGlzdGVuZXJzLnB1c2goZSksdGhpcy5nZXRTdHJlYW1zKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5vbk1lc3NhZ2UoZSl9KSl9LGEucHJvdG90eXBlLmFkZFN0cmVhbT1mdW5jdGlvbihlKXt0aGlzLnN0cmVhbU1hcFtlLmdldElkKCldPWUsdGhpcy5tZXNzYWdlTGlzdGVuZXJzLmZvckVhY2goKGZ1bmN0aW9uKHQpe2Uub25NZXNzYWdlKHQpfSkpfSxhLnByb3RvdHlwZS5yZW1vdmVTdHJlYW09ZnVuY3Rpb24oZSl7ZGVsZXRlIHRoaXMuc3RyZWFtTWFwW2UuZ2V0SWQoKV19LGEucHJvdG90eXBlLmdldFN0cmVhbXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHQudmFsdWVzKHRoaXMuc3RyZWFtTWFwKX0sYS5wcm90b3R5cGUuZ2V0U3RyZWFtRm9yUG9ydD1mdW5jdGlvbihlKXtyZXR1cm4gdC5maW5kKHRoaXMuZ2V0U3RyZWFtcygpLChmdW5jdGlvbih0KXtyZXR1cm4gdC5wb3J0PT09ZX0pKX07dmFyIGM9ZnVuY3Rpb24oZSxuLG8pe3RoaXMubmFtZT1lLHRoaXMudXBzdHJlYW09bnx8bmV3IHIsdGhpcy5kb3duc3RyZWFtPW98fG5ldyByLHRoaXMuZG93bnN0cmVhbUJ1cz1uZXcgdC5FdmVudEJ1cyx0aGlzLnVwc3RyZWFtQnVzPW5ldyB0LkV2ZW50QnVzLHRoaXMudXBzdHJlYW0ub25NZXNzYWdlKHQuaGl0Y2godGhpcyx0aGlzLl9kaXNwYXRjaEV2ZW50LHRoaXMudXBzdHJlYW1CdXMpKSx0aGlzLmRvd25zdHJlYW0ub25NZXNzYWdlKHQuaGl0Y2godGhpcyx0aGlzLl9kaXNwYXRjaEV2ZW50LHRoaXMuZG93bnN0cmVhbUJ1cykpfTtjLnByb3RvdHlwZS5vblVwc3RyZWFtPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChlLCJldmVudE5hbWUiKSx0LmFzc2VydE5vdE51bGwobiwiZiIpLHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksImYgbXVzdCBiZSBhIGZ1bmN0aW9uIiksdGhpcy51cHN0cmVhbUJ1cy5zdWJzY3JpYmUoZSxuKX0sYy5wcm90b3R5cGUub25BbGxVcHN0cmVhbT1mdW5jdGlvbihlKXtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKGUsImYiKSx0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKGUpLCJmIG11c3QgYmUgYSBmdW5jdGlvbiIpLHRoaXMudXBzdHJlYW1CdXMuc3Vic2NyaWJlQWxsKGUpfSxjLnByb3RvdHlwZS5vbkRvd25zdHJlYW09ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKGUsImV2ZW50TmFtZSIpLHQuYXNzZXJ0Tm90TnVsbChuLCJmIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwiZiBtdXN0IGJlIGEgZnVuY3Rpb24iKSx0aGlzLmRvd25zdHJlYW1CdXMuc3Vic2NyaWJlKGUsbil9LGMucHJvdG90eXBlLm9uQWxsRG93bnN0cmVhbT1mdW5jdGlvbihlKXtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKGUsImYiKSx0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKGUpLCJmIG11c3QgYmUgYSBmdW5jdGlvbiIpLHRoaXMuZG93bnN0cmVhbUJ1cy5zdWJzY3JpYmVBbGwoZSl9LGMucHJvdG90eXBlLnNlbmRVcHN0cmVhbT1mdW5jdGlvbihlLG4pe3QuYXNzZXJ0Tm90TnVsbChlLCJldmVudE5hbWUiKSx0aGlzLnVwc3RyZWFtLnNlbmQoe2V2ZW50OmUsZGF0YTpufSl9LGMucHJvdG90eXBlLnNlbmREb3duc3RyZWFtPWZ1bmN0aW9uKGUsbil7dC5hc3NlcnROb3ROdWxsKGUsImV2ZW50TmFtZSIpLHRoaXMuZG93bnN0cmVhbS5zZW5kKHtldmVudDplLGRhdGE6bn0pfSxjLnByb3RvdHlwZS5fZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihlLHQpe3ZhciBuPXQuZGF0YTtuLmV2ZW50JiZlLnRyaWdnZXIobi5ldmVudCxuLmRhdGEpfSxjLnByb3RvdHlwZS5wYXNzVXBzdHJlYW09ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiBmdW5jdGlvbih0LG4pe2UudXBzdHJlYW0uc2VuZCh7ZXZlbnQ6bixkYXRhOnR9KX19LGMucHJvdG90eXBlLnBhc3NEb3duc3RyZWFtPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gZnVuY3Rpb24odCxuKXtlLmRvd25zdHJlYW0uc2VuZCh7ZXZlbnQ6bixkYXRhOnR9KX19LGMucHJvdG90eXBlLnNodXRkb3duPWZ1bmN0aW9uKCl7dGhpcy51cHN0cmVhbUJ1cy51bnN1YnNjcmliZUFsbCgpLHRoaXMuZG93bnN0cmVhbUJ1cy51bnN1YnNjcmliZUFsbCgpfTt2YXIgdT1mdW5jdGlvbihlLHQsbixyKXtjLmNhbGwodGhpcyxlLG5ldyBpKHQsbi5jb250ZW50V2luZG93LHJ8fCIqIiksbnVsbCl9Oyh1LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGMucHJvdG90eXBlKSkuY29uc3RydWN0b3I9dSx0LlN0cmVhbT1uLHQuTnVsbFN0cmVhbT1yLHQuV2luZG93U3RyZWFtPW8sdC5XaW5kb3dJT1N0cmVhbT1pLHQuUG9ydFN0cmVhbT1zLHQuU3RyZWFtTXVsdGlwbGV4ZXI9YSx0LkNvbmR1aXQ9Yyx0LklGcmFtZUNvbmR1aXQ9dX0oKX0sODMzOigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQ7dmFyIG49ZnVuY3Rpb24oZSxuKXt0LmFzc2VydE5vdE51bGwoZSwiZnJvbVN0YXRlIiksdC5hc3NlcnROb3ROdWxsKG4sInRvU3RhdGUiKSx0aGlzLmZyb21TdGF0ZT1lLHRoaXMudG9TdGF0ZT1ufTtuLnByb3RvdHlwZS5nZXRBc3NvY2lhdGlvbnM9ZnVuY3Rpb24oZSl7dGhyb3cgdC5Ob3RJbXBsZW1lbnRlZEVycm9yKCl9LG4ucHJvdG90eXBlLmdldEZyb21TdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZyb21TdGF0ZX0sbi5wcm90b3R5cGUuZ2V0VG9TdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRvU3RhdGV9O3ZhciByPWZ1bmN0aW9uKGUscixvKXt0LmFzc2VydE5vdE51bGwoZSwiZnJvbVN0YXRlIiksdC5hc3NlcnROb3ROdWxsKHIsInRvU3RhdGUiKSx0LmFzc2VydE5vdE51bGwobywiYXNzb2NpYXRpb25zIiksbi5jYWxsKHRoaXMsZSxyKSx0aGlzLmFzc29jaWF0aW9ucz1vfTsoci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXIsci5wcm90b3R5cGUuZ2V0QXNzb2NpYXRpb25zPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmFzc29jaWF0aW9uc307dmFyIG89ZnVuY3Rpb24oZSxyLG8pe3QuYXNzZXJ0Tm90TnVsbChlLCJmcm9tU3RhdGUiKSx0LmFzc2VydE5vdE51bGwociwidG9TdGF0ZSIpLHQuYXNzZXJ0Tm90TnVsbChvLCJjbG9zdXJlIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihvKSwiY2xvc3VyZSBtdXN0IGJlIGEgZnVuY3Rpb24iKSxuLmNhbGwodGhpcyxlLHIpLHRoaXMuY2xvc3VyZT1vfTsoby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPW8sby5wcm90b3R5cGUuZ2V0QXNzb2NpYXRpb25zPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNsb3N1cmUoZSx0aGlzLmdldEZyb21TdGF0ZSgpLHRoaXMuZ2V0VG9TdGF0ZSgpKX07dmFyIGk9ZnVuY3Rpb24oKXt0aGlzLmZyb21NYXA9e319O2kuQU5ZPSI8PGFueT4+IixpLnByb3RvdHlwZS5hc3NvYz1mdW5jdGlvbihlLHQsbil7dmFyIGk9dGhpcztpZighZSl0aHJvdyBuZXcgRXJyb3IoImZyb21TdGF0ZU9iaiBpcyBub3QgZGVmaW5lZC4iKTtpZighdCl0aHJvdyBuZXcgRXJyb3IoInRvU3RhdGVPYmogaXMgbm90IGRlZmluZWQuIik7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJhc3NvY09iaiBpcyBub3QgZGVmaW5lZC4iKTtyZXR1cm4gZSBpbnN0YW5jZW9mIEFycmF5P2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aS5hc3NvYyhlLHQsbil9KSk6dCBpbnN0YW5jZW9mIEFycmF5P3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7aS5hc3NvYyhlLHQsbil9KSk6ImZ1bmN0aW9uIj09dHlwZW9mIG4/dGhpcy5fYWRkQXNzb2NpYXRpb24obmV3IG8oZSx0LG4pKTpuIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5fYWRkQXNzb2NpYXRpb24obmV3IHIoZSx0LG4pKTp0aGlzLl9hZGRBc3NvY2lhdGlvbihuZXcgcihlLHQsW25dKSksdGhpc30saS5wcm90b3R5cGUuZ2V0QXNzb2NpYXRpb25zPWZ1bmN0aW9uKGUsbixyKXt0LmFzc2VydE5vdE51bGwobiwiZnJvbVN0YXRlIiksdC5hc3NlcnROb3ROdWxsKHIsInRvU3RhdGUiKTt2YXIgbz1bXSxzPXRoaXMuZnJvbU1hcFtpLkFOWV18fHt9LGE9dGhpcy5mcm9tTWFwW25dfHx7fTtyZXR1cm4gbz0obz1vLmNvbmNhdCh0aGlzLl9nZXRBc3NvY2lhdGlvbnNGcm9tTWFwKHMsZSxuLHIpKSkuY29uY2F0KHRoaXMuX2dldEFzc29jaWF0aW9uc0Zyb21NYXAoYSxlLG4scikpfSxpLnByb3RvdHlwZS5fYWRkQXNzb2NpYXRpb249ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5mcm9tTWFwW2UuZ2V0RnJvbVN0YXRlKCldO3R8fCh0PXRoaXMuZnJvbU1hcFtlLmdldEZyb21TdGF0ZSgpXT17fSk7dmFyIG49dFtlLmdldFRvU3RhdGUoKV07bnx8KG49dFtlLmdldFRvU3RhdGUoKV09W10pLG4ucHVzaChlKX0saS5wcm90b3R5cGUuX2dldEFzc29jaWF0aW9uc0Zyb21NYXA9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuKGVbaS5BTlldfHxbXSkuY29uY2F0KGVbcl18fFtdKS5yZWR1Y2UoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGUuY29uY2F0KG4uZ2V0QXNzb2NpYXRpb25zKHQpKX0pLFtdKX0sdC5FdmVudEdyYXBoPWl9KCl9LDg5MTooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10O3ZhciBuPW5hdmlnYXRvci51c2VyQWdlbnQscj1bImJ1YmJsZXMiLCJjYW5jZWxCdWJibGUiLCJjYW5jZWxhYmxlIiwiY29tcG9zZWQiLCJkYXRhIiwiZGVmYXVsdFByZXZlbnRlZCIsImV2ZW50UGhhc2UiLCJpc1RydXN0ZWQiLCJsYXN0RXZlbnRJZCIsIm9yaWdpbiIsInJldHVyblZhbHVlIiwidGltZVN0YW1wIiwidHlwZSJdO3Quc3ByaW50Zj1lLnNwcmludGYsdC52c3ByaW50Zj1lLnZzcHJpbnRmLGRlbGV0ZSBlLnNwcmludGYsZGVsZXRlIGUudnNwcmludGYsdC5IVFRQX1NUQVRVU19DT0RFUz17U1VDQ0VTUzoyMDAsVU5BVVRIT1JJWkVEOjQwMSxBQ0NFU1NfREVOSUVEOjQwMyxUT09fTUFOWV9SRVFVRVNUUzo0MjksSU5URVJOQUxfU0VSVkVSX0VSUk9SOjUwMH0sdC5UUkFOU1BPUlRfVFlQRVM9e0NIQVRfVE9LRU46ImNoYXRfdG9rZW4iLFdFQl9TT0NLRVQ6IndlYl9zb2NrZXQiLEFHRU5UX0RJU0NPVkVSWToiYWdlbnRfZGlzY292ZXJ5IixXRUJfUlRDOiJ3ZWJfcnRjIn0sdC5oaXRjaD1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksbj1lLnNoaWZ0KCkscj1lLnNoaWZ0KCk7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChuLCJzY29wZSIpLHQuYXNzZXJ0Tm90TnVsbChyLCJtZXRob2QiKSx0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKHIpLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZnVuY3Rpb24oKXt2YXIgdD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3JldHVybiByLmFwcGx5KG4sZS5jb25jYXQodCkpfX0sdC5pc0Z1bmN0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiEhKGUmJmUuY29uc3RydWN0b3ImJmUuY2FsbCYmZS5hcHBseSl9LHQuaXNBcnJheT1mdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfSx0LmtleXM9ZnVuY3Rpb24oZSl7dmFyIG49W107Zm9yKHZhciByIGluIHQuYXNzZXJ0Tm90TnVsbChlLCJtYXAiKSxlKW4ucHVzaChyKTtyZXR1cm4gbn0sdC52YWx1ZXM9ZnVuY3Rpb24oZSl7dmFyIG49W107Zm9yKHZhciByIGluIHQuYXNzZXJ0Tm90TnVsbChlLCJtYXAiKSxlKW4ucHVzaChlW3JdKTtyZXR1cm4gbn0sdC5lbnRyaWVzPWZ1bmN0aW9uKGUpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiBlKXQucHVzaCh7a2V5Om4sdmFsdWU6ZVtuXX0pO3JldHVybiB0fSx0Lm1lcmdlPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLG49e307cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5lbnRyaWVzKGUpLmZvckVhY2goKGZ1bmN0aW9uKGUpe25bZS5rZXldPWUudmFsdWV9KSl9KSksbn0sdC5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sdC5maW5kPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspaWYodChlW25dKSlyZXR1cm4gZVtuXTtyZXR1cm4gbnVsbH0sdC5jb250YWlucz1mdW5jdGlvbihlLG4pe3JldHVybiBlIGluc3RhbmNlb2YgQXJyYXk/bnVsbCE9dC5maW5kKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09bn0pKTpuIGluIGV9LHQuY29udGFpbnNWYWx1ZT1mdW5jdGlvbihlLG4pe3JldHVybiBlIGluc3RhbmNlb2YgQXJyYXk/bnVsbCE9dC5maW5kKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09bn0pKTpudWxsIT10LmZpbmQodC52YWx1ZXMoZSksKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09bn0pKX0sdC5yYW5kb21JZD1mdW5jdGlvbigpe3JldHVybiB0LnNwcmludGYoIiVzLSVzIix0Lm5vdygpLE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpKX0sdC5tYWtlRW51bT1mdW5jdGlvbihlKXt2YXIgdD17fTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1lLnJlcGxhY2UoL1wuPyhbYS16XSspXz8vZywoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpKyJfIn0pKS5yZXBsYWNlKC9fJC8sIiIpO3Rbbl09ZX0pKSx0fSx0Lm1ha2VOYW1lc3BhY2VkRW51bT1mdW5jdGlvbihlLG4pe3ZhciByPXQubWFrZUVudW0obik7cmV0dXJuIHQua2V5cyhyKS5mb3JFYWNoKChmdW5jdGlvbihuKXtyW25dPXQuc3ByaW50ZigiJXM6OiVzIixlLHJbbl0pfSkpLHJ9LHQubWFrZUdlbmVyaWNOYW1lc3BhY2VkRW51bT1mdW5jdGlvbihlLG4scil7dmFyIG89dC5tYWtlRW51bShuKTtyZXR1cm4gdC5rZXlzKG8pLmZvckVhY2goKGZ1bmN0aW9uKG4pe29bbl09dC5zcHJpbnRmKCIlcyIrcisiJXMiLGUsb1tuXSl9KSksb30sdC5pc0Nocm9tZUJyb3dzZXI9ZnVuY3Rpb24oKXtyZXR1cm4tMSE9PW4uaW5kZXhPZigiQ2hyb21lIil9LHQuaXNGaXJlZm94QnJvd3Nlcj1mdW5jdGlvbigpe3JldHVybi0xIT09bi5pbmRleE9mKCJGaXJlZm94Iil9LHQuaXNPcGVyYUJyb3dzZXI9ZnVuY3Rpb24oKXtyZXR1cm4tMSE9PW4uaW5kZXhPZigiT3BlcmEiKX0sdC5pc0VkZ2VCcm93c2VyPWZ1bmN0aW9uKCl7cmV0dXJuLTEhPT1uLmluZGV4T2YoIkVkZyIpfSx0LmdldENocm9tZUJyb3dzZXJWZXJzaW9uPWZ1bmN0aW9uKCl7dmFyIGU9bi5zdWJzdHJpbmcobi5pbmRleE9mKCJDaHJvbWUiKSs3KTtyZXR1cm4gZT9wYXJzZUZsb2F0KGUpOi0xfSx0LmdldEZpcmVmb3hCcm93c2VyVmVyc2lvbj1mdW5jdGlvbigpe3ZhciBlPW4uc3Vic3RyaW5nKG4uaW5kZXhPZigiRmlyZWZveCIpKzgpO3JldHVybiBlP3BhcnNlRmxvYXQoZSk6LTF9LHQuaXNWYWxpZExvY2FsZT1mdW5jdGlvbihlKXtyZXR1cm5be2lkOiJlbl9VUyIsbGFiZWw6IkVuZ2xpc2gifSx7aWQ6ImRlX0RFIixsYWJlbDoiRGV1dHNjaCJ9LHtpZDoiZXNfRVMiLGxhYmVsOiJFc3Bhw7FvbCJ9LHtpZDoiZnJfRlIiLGxhYmVsOiJGcmFuw6dhaXMifSx7aWQ6ImphX0pQIixsYWJlbDoi5pel5pys6KqeIn0se2lkOiJpdF9JVCIsbGFiZWw6Ikl0YWxpYW5vIn0se2lkOiJrb19LUiIsbGFiZWw6Iu2VnOq1reyWtCJ9LHtpZDoicHRfQlIiLGxhYmVsOiJQb3J0dWd1w6pzIn0se2lkOiJ6aF9DTiIsbGFiZWw6IuS4reaWhyjnroDkvZMpIn0se2lkOiJ6aF9UVyIsbGFiZWw6IuS4reaWhyjnuYHpq5QpIn1dLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaWR9KSkuaW5jbHVkZXMoZSl9LHQuZ2V0T3BlcmFCcm93c2VyVmVyc2lvbj1mdW5jdGlvbigpe3ZhciBlPW4uaW5kZXhPZigiT3BlcmEiKSx0PS0xIT09bi5pbmRleE9mKCJWZXJzaW9uIik/bi5zdWJzdHJpbmcoZSs4KTpuLnN1YnN0cmluZyhlKzYpO3JldHVybiB0P3BhcnNlRmxvYXQodCk6LTF9LHQuaW5kZXg9ZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXtuW3QoZSldPWV9KSksbn0sdC5zZXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dFtlXT0xfSkpLHR9LHQucmVsYXRpdmVDb21wbGVtZW50PWZ1bmN0aW9uKGUsbil7dmFyIHI9e307cmV0dXJuIHQua2V5cyhuKS5mb3JFYWNoKChmdW5jdGlvbih0KXt0IGluIGV8fChyW3RdPW5bdF0pfSkpLHJ9LHQuYXNzZXJ0VHJ1ZT1mdW5jdGlvbihlLG4pe2lmKCFlKXRocm93IG5ldyB0LlZhbHVlRXJyb3Iobil9LHQuYXNzZXJ0Tm90TnVsbD1mdW5jdGlvbihlLG4pe3JldHVybiB0LmFzc2VydFRydWUobnVsbCE9ZSYmdm9pZCAwIT09dHlwZW9mIGUsdC5zcHJpbnRmKCIlcyBtdXN0IGJlIHByb3ZpZGVkIixufHwiQSB2YWx1ZSIpKSxlfSx0LmRlZXBjb3B5PWZ1bmN0aW9uKGUpe3JldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKX0sdC5kZWVwY29weUNyb3NzT3JpZ2luRXZlbnQ9ZnVuY3Rpb24oZSl7Y29uc3Qgbj17fTtyZXR1cm4gci5mb3JFYWNoKChyPT57dHJ5e25bcl09ZVtyXX1jYXRjaChlKXt0LmdldExvZygpLmluZm8oImRlZXBjb3B5Q3Jvc3NPcmlnaW5FdmVudCBmYWlsZWQgb24ga2V5OiAiLHIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSkpLHQuZGVlcGNvcHkobil9LHQuZ2V0QmFzZVVybD1mdW5jdGlvbigpe3ZhciBuPWUubG9jYXRpb247cmV0dXJuIHQuc3ByaW50ZigiJXMvLyVzOiVzIixuLnByb3RvY29sLG4uaG9zdG5hbWUsbi5wb3J0KX0sdC5nZXRVcmxXaXRoUHJvdG9jb2w9ZnVuY3Rpb24obil7dmFyIHI9ZS5sb2NhdGlvbi5wcm90b2NvbDtyZXR1cm4gbi5zdWJzdHIoMCxyLmxlbmd0aCkhPT1yP3Quc3ByaW50ZigiJXMvLyVzIixyLG4pOm59LHQuaXNGcmFtZWQ9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIHdpbmRvdy5zZWxmIT09d2luZG93LnRvcH1jYXRjaChlKXtyZXR1cm4hMH19LHQuaGFzT3RoZXJDb25uZWN0ZWRDQ1BzPWZ1bmN0aW9uKCl7cmV0dXJuIHQubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzPjF9LHQuZmV0Y2g9ZnVuY3Rpb24oZSxuLHIsbyl7cmV0dXJuIG89b3x8NSxyPXJ8fDFlMyxuPW58fHt9LG5ldyBQcm9taXNlKChmdW5jdGlvbihpLHMpeyFmdW5jdGlvbiBvKGEpe2ZldGNoKGUsbikudGhlbigoZnVuY3Rpb24oZSl7ZS5zdGF0dXM9PT10LkhUVFBfU1RBVFVTX0NPREVTLlNVQ0NFU1M/ZS5qc29uKCkudGhlbigoZT0+aShlKSkpLmNhdGNoKCgoKT0+aSh7fSkpKToxIT09YSYmKGUuc3RhdHVzPj10LkhUVFBfU1RBVFVTX0NPREVTLklOVEVSTkFMX1NFUlZFUl9FUlJPUnx8ZS5zdGF0dXM9PT10LkhUVFBfU1RBVFVTX0NPREVTLlRPT19NQU5ZX1JFUVVFU1RTKT9zZXRUaW1lb3V0KChmdW5jdGlvbigpe28oLS1hKX0pLHIpOnMoZSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3MoZSl9KSl9KG8pfSkpfSx0LmZldGNoV2l0aFRpbWVvdXQ9YXN5bmMgZnVuY3Rpb24oZSxuLHIsbyxpKXtpZihyPXJ8fHt9LCFuKXJldHVybiB0LmZldGNoKGUscixvLGkpO2NvbnN0IHM9bmV3IEFib3J0Q29udHJvbGxlcixhPXNldFRpbWVvdXQoKCgpPT5zLmFib3J0KCkpLG4pLGM9YXdhaXQgdC5mZXRjaChlLHsuLi5yLHNpZ25hbDpzLnNpZ25hbH0sbyxpKTtyZXR1cm4gY2xlYXJUaW1lb3V0KGEpLGN9LHQuYmFja29mZj1mdW5jdGlvbihuLHIsbyxpKXt0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJmdW5jIG11c3QgYmUgYSBGdW5jdGlvbiIpO3ZhciBzPXRoaXM7bih7c3VjY2VzczpmdW5jdGlvbihlKXtpJiZpLnN1Y2Nlc3MmJmkuc3VjY2VzcyhlKX0sZmFpbHVyZTpmdW5jdGlvbih0LGEpe2lmKG8+MCl7dmFyIGM9MipyKk1hdGgucmFuZG9tKCk7ZS5zZXRUaW1lb3V0KChmdW5jdGlvbigpe3MuYmFja29mZihuLDIqYywtLW8saSl9KSxjKX1lbHNlIGkmJmkuZmFpbHVyZSYmaS5mYWlsdXJlKHQsYSl9fSl9LHQucHVibGlzaE1ldHJpYz1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkV2ZW50VHlwZS5DTElFTlRfTUVUUklDLGRhdGE6ZX0pfSx0LnB1Ymxpc2hTb2Z0cGhvbmVTdGF0cz1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkV2ZW50VHlwZS5TT0ZUUEhPTkVfU1RBVFMsZGF0YTplfSl9LHQucHVibGlzaFNvZnRwaG9uZVJlcG9ydD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkV2ZW50VHlwZS5TT0ZUUEhPTkVfUkVQT1JULGRhdGE6ZX0pfSx0LnB1Ymxpc2hDbGlja1N0cmVhbURhdGE9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5FdmVudFR5cGUuQ0xJQ0tfU1RSRUFNX0RBVEEsZGF0YTplfSl9LHQucHVibGlzaENsaWVudFNpZGVMb2dzPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5FdmVudFR5cGUuQ0xJRU5UX1NJREVfTE9HUyxlKX0sdC5hZGROYW1lc3BhY2VUb0xvZ3M9ZnVuY3Rpb24oZSl7WyJsb2ciLCJlcnJvciIsIndhcm4iLCJpbmZvIiwiZGVidWciXS5mb3JFYWNoKCh0PT57Y29uc3Qgbj13aW5kb3cuY29uc29sZVt0XTt3aW5kb3cuY29uc29sZVt0XT1mdW5jdGlvbigpe2NvbnN0IHQ9QXJyYXkuZnJvbShhcmd1bWVudHMpO3QudW5zaGlmdChgWyR7ZX1dYCksbi5hcHBseSh3aW5kb3cuY29uc29sZSx0KX19KSl9LHQuUG9wdXBNYW5hZ2VyPWZ1bmN0aW9uKCl7fSx0LlBvcHVwTWFuYWdlci5wcm90b3R5cGUub3Blbj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5fZ2V0TGFzdE9wZW5lZFRpbWVzdGFtcCh0KSxvPShuZXcgRGF0ZSkuZ2V0VGltZSgpLGk9bnVsbDtpZihvLXI+ODY0ZTUpe2lmKG4pe3ZhciBzPW4uaGVpZ2h0fHw1NzgsYT1uLndpZHRofHw0MzMsYz1uLnRvcHx8MCx1PW4ubGVmdHx8MDsoaT13aW5kb3cub3BlbigiIix0LCJ3aWR0aD0iK2ErIiwgaGVpZ2h0PSIrcysiLCB0b3A9IitjKyIsIGxlZnQ9Iit1KSkubG9jYXRpb24hPT1lJiYoaT13aW5kb3cub3BlbihlLHQsIndpZHRoPSIrYSsiLCBoZWlnaHQ9IitzKyIsIHRvcD0iK2MrIiwgbGVmdD0iK3UpKX1lbHNlKGk9d2luZG93Lm9wZW4oIiIsdCkpLmxvY2F0aW9uIT09ZSYmKGk9d2luZG93Lm9wZW4oZSx0KSk7dGhpcy5fc2V0TGFzdE9wZW5lZFRpbWVzdGFtcCh0LG8pfXJldHVybiBpfSx0LlBvcHVwTWFuYWdlci5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fZ2V0TG9jYWxTdG9yYWdlS2V5KHQpO2UubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0obil9LHQuUG9wdXBNYW5hZ2VyLnByb3RvdHlwZS5fZ2V0TGFzdE9wZW5lZFRpbWVzdGFtcD1mdW5jdGlvbih0KXt2YXIgbj10aGlzLl9nZXRMb2NhbFN0b3JhZ2VLZXkodCkscj1lLmxvY2FsU3RvcmFnZS5nZXRJdGVtKG4pO3JldHVybiByP3BhcnNlSW50KHIsMTApOjB9LHQuUG9wdXBNYW5hZ2VyLnByb3RvdHlwZS5fc2V0TGFzdE9wZW5lZFRpbWVzdGFtcD1mdW5jdGlvbih0LG4pe3ZhciByPXRoaXMuX2dldExvY2FsU3RvcmFnZUtleSh0KTtlLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHIsIiIrbil9LHQuUG9wdXBNYW5hZ2VyLnByb3RvdHlwZS5fZ2V0TG9jYWxTdG9yYWdlS2V5PWZ1bmN0aW9uKGUpe3JldHVybiJjb25uZWN0UG9wdXBNYW5hZ2VyOjoiK2V9O3ZhciBvPXQubWFrZUVudW0oWyJncmFudGVkIiwiZGVuaWVkIiwiZGVmYXVsdCJdKTt0Lk5vdGlmaWNhdGlvbk1hbmFnZXI9ZnVuY3Rpb24oKXt0aGlzLnF1ZXVlPVtdLHRoaXMucGVybWlzc2lvbj1vLkRFRkFVTFR9LHQuTm90aWZpY2F0aW9uTWFuYWdlci5wcm90b3R5cGUucmVxdWVzdFBlcm1pc3Npb249ZnVuY3Rpb24oKXt2YXIgbj10aGlzOyJOb3RpZmljYXRpb24iaW4gZT9lLk5vdGlmaWNhdGlvbi5wZXJtaXNzaW9uPT09by5ERU5JRUQ/KHQuZ2V0TG9nKCkud2FybigiVGhlIHVzZXIgaGFzIHJlcXVlc3RlZCB0byBub3QgcmVjZWl2ZSBub3RpZmljYXRpb25zLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy5wZXJtaXNzaW9uPW8uREVOSUVEKTp0aGlzLnBlcm1pc3Npb24hPT1vLkdSQU5URUQmJmUuTm90aWZpY2F0aW9uLnJlcXVlc3RQZXJtaXNzaW9uKCkudGhlbigoZnVuY3Rpb24oZSl7bi5wZXJtaXNzaW9uPWUsZT09PW8uR1JBTlRFRD9uLl9zaG93UXVldWVkKCk6bi5xdWV1ZT1bXX0pKToodC5nZXRMb2coKS53YXJuKCJUaGlzIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IG5vdGlmaWNhdGlvbnMuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0aGlzLnBlcm1pc3Npb249by5ERU5JRUQpfSx0Lk5vdGlmaWNhdGlvbk1hbmFnZXIucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oZSxuKXtpZih0aGlzLnBlcm1pc3Npb249PT1vLkdSQU5URUQpcmV0dXJuIHRoaXMuX3Nob3dJbXBsKHt0aXRsZTplLG9wdGlvbnM6bn0pO2lmKHRoaXMucGVybWlzc2lvbj09PW8uREVOSUVEKXQuZ2V0TG9nKCkud2FybigiVW5hYmxlIHRvIHNob3cgbm90aWZpY2F0aW9uLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7dGl0bGU6ZSxvcHRpb25zOm59KTtlbHNle3ZhciByPXt0aXRsZTplLG9wdGlvbnM6bn07dC5nZXRMb2coKS53YXJuKCJEZWZlcnJpbmcgbm90aWZpY2F0aW9uIHVudGlsIHVzZXIgZGVjaWRlcyB0byBhbGxvdyBvciBkZW55LiIpLndpdGhPYmplY3Qocikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0aGlzLnF1ZXVlLnB1c2gocil9fSx0Lk5vdGlmaWNhdGlvbk1hbmFnZXIucHJvdG90eXBlLl9zaG93UXVldWVkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMucXVldWUubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fc2hvd0ltcGwodCl9KSk7cmV0dXJuIHRoaXMucXVldWU9W10sdH0sdC5Ob3RpZmljYXRpb25NYW5hZ2VyLnByb3RvdHlwZS5fc2hvd0ltcGw9ZnVuY3Rpb24odCl7dmFyIG49bmV3IGUuTm90aWZpY2F0aW9uKHQudGl0bGUsdC5vcHRpb25zKTtyZXR1cm4gdC5vcHRpb25zLmNsaWNrZWQmJihuLm9uY2xpY2s9ZnVuY3Rpb24oKXt0Lm9wdGlvbnMuY2xpY2tlZC5jYWxsKG4pfSksbn0sdC5WYWx1ZUVycm9yPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLG49ZS5zaGlmdCgpLHI9bmV3IEVycm9yKHQudnNwcmludGYobixlKSk7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihyLHQuVmFsdWVFcnJvci5wcm90b3R5cGUpLHJ9LE9iamVjdC5zZXRQcm90b3R5cGVPZih0LlZhbHVlRXJyb3IucHJvdG90eXBlLEVycm9yLnByb3RvdHlwZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKHQuVmFsdWVFcnJvcixFcnJvciksdC5WYWx1ZUVycm9yLnByb3RvdHlwZS5uYW1lPSJWYWx1ZUVycm9yIix0Lk5vdEltcGxlbWVudGVkRXJyb3I9ZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCksbj1lLnNoaWZ0KCkscj1uZXcgRXJyb3IodC52c3ByaW50ZihuLGUpKTtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKHIsdC5Ob3RJbXBsZW1lbnRlZEVycm9yLnByb3RvdHlwZSkscn0sT2JqZWN0LnNldFByb3RvdHlwZU9mKHQuTm90SW1wbGVtZW50ZWRFcnJvci5wcm90b3R5cGUsRXJyb3IucHJvdG90eXBlKSxPYmplY3Quc2V0UHJvdG90eXBlT2YodC5Ob3RJbXBsZW1lbnRlZEVycm9yLEVycm9yKSx0Lk5vdEltcGxlbWVudGVkRXJyb3IucHJvdG90eXBlLm5hbWU9Ik5vdEltcGxlbWVudGVkRXJyb3IiLHQuU3RhdGVFcnJvcj1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSxuPWUuc2hpZnQoKSxyPW5ldyBFcnJvcih0LnZzcHJpbnRmKG4sZSkpO3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Yocix0LlN0YXRlRXJyb3IucHJvdG90eXBlKSxyfSxPYmplY3Quc2V0UHJvdG90eXBlT2YodC5TdGF0ZUVycm9yLnByb3RvdHlwZSxFcnJvci5wcm90b3R5cGUpLE9iamVjdC5zZXRQcm90b3R5cGVPZih0LlN0YXRlRXJyb3IsRXJyb3IpLHQuU3RhdGVFcnJvci5wcm90b3R5cGUubmFtZT0iU3RhdGVFcnJvciIsdC5Wb2ljZUlkRXJyb3I9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9O3JldHVybiByLnR5cGU9ZSxyLm1lc3NhZ2U9dCxyLnN0YWNrPUVycm9yKHQpLnN0YWNrLHIuZXJyPW4scn0sdC5pc0NDUD1mdW5jdGlvbigpe3JldHVybiEhdC5jb3JlLnVwc3RyZWFtJiYiQ29ubmVjdFNoYXJlZFdvcmtlckNvbmR1aXQiPT09dC5jb3JlLmdldFVwc3RyZWFtKCkubmFtZX0sdC5pc1NoYXJlZFdvcmtlcj1mdW5jdGlvbigpe3JldHVybiB0LndvcmtlciYmISF0Lndvcmtlci5jbGllbnRFbmdpbmV9LHQuaXNDUk09ZnVuY3Rpb24oKXtyZXR1cm4hIXQuY29yZS51cHN0cmVhbSYmdC5jb3JlLmdldFVwc3RyZWFtKClpbnN0YW5jZW9mIHQuSUZyYW1lQ29uZHVpdH19KCl9LDczNjooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10LHQud29ya2VyPXt9O3ZhciBuPSJMQURTLkdldEFnZW50RmFpbG92ZXJDb25maWd1cmF0aW9uIjtjb25zdCByPXtjcmVhdGVUYXNrQ29udGFjdDoiY3JlYXRlVGFza0NvbnRhY3QiLGNyZWF0ZU91dGJvdW5kQ29udGFjdDoiY3JlYXRlT3V0Ym91bmRDb250YWN0IixjcmVhdGVUZW1wbGF0ZWRUYXNrOiJjcmVhdGVUZW1wbGF0ZWRUYXNrIn07dmFyIG89ZnVuY3Rpb24oKXt0aGlzLnRvcGljTWFzdGVyTWFwPXt9fTtvLnByb3RvdHlwZS5nZXRNYXN0ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChlLCJ0b3BpYyIpLHRoaXMudG9waWNNYXN0ZXJNYXBbZV18fG51bGx9LG8ucHJvdG90eXBlLnNldE1hc3Rlcj1mdW5jdGlvbihlLG4pe3QuYXNzZXJ0Tm90TnVsbChlLCJ0b3BpYyIpLHQuYXNzZXJ0Tm90TnVsbChuLCJpZCIpLHRoaXMudG9waWNNYXN0ZXJNYXBbZV09bn0sby5wcm90b3R5cGUucmVtb3ZlTWFzdGVyPWZ1bmN0aW9uKGUpe3QuYXNzZXJ0Tm90TnVsbChlLCJpZCIpO3ZhciBuPXRoaXM7dC5lbnRyaWVzKHRoaXMudG9waWNNYXN0ZXJNYXApLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQudmFsdWU9PT1lfSkpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2RlbGV0ZSBuLnRvcGljTWFzdGVyTWFwW2Uua2V5XX0pKX07dmFyIGk9ZnVuY3Rpb24oZSl7dC5DbGllbnRCYXNlLmNhbGwodGhpcyksdGhpcy5jb25kdWl0PWV9OyhpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQuQ2xpZW50QmFzZS5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1pLGkucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLG4scil7dmFyIG89dGhpcyxpPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3QuY29udGFpbnNWYWx1ZSh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcyxlKT90LmNvcmUuZ2V0QWdlbnRBcHBDbGllbnQoKS5fY2FsbEltcGwoZSxuLHtzdWNjZXNzOmZ1bmN0aW9uKHQpe28uX3JlY29yZEFQSUxhdGVuY3koZSxpLG4pLHIuc3VjY2Vzcyh0KX0sZmFpbHVyZTpmdW5jdGlvbih0KXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSxuLHQpLHIuZmFpbHVyZSh0KX19KTp0LmNvbnRhaW5zVmFsdWUodC5UYXNrVGVtcGxhdGVzQ2xpZW50TWV0aG9kcyxlKT90LmNvcmUuZ2V0VGFza1RlbXBsYXRlc0NsaWVudCgpLl9jYWxsSW1wbChlLG4se3N1Y2Nlc3M6ZnVuY3Rpb24odCl7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGksbiksci5zdWNjZXNzKHQpfSxmYWlsdXJlOmZ1bmN0aW9uKHQpe28uX3JlY29yZEFQSUxhdGVuY3koZSxpLG4sdCksci5mYWlsdXJlKHQpfX0pOnQuY29yZS5nZXRDbGllbnQoKS5fY2FsbEltcGwoZSxuLHtzdWNjZXNzOmZ1bmN0aW9uKHQscyl7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGksbiksci5zdWNjZXNzKHQscyl9LGZhaWx1cmU6ZnVuY3Rpb24odCxzKXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSxuLHQpLHIuZmFpbHVyZSh0LHMpfSxhdXRoRmFpbHVyZTpmdW5jdGlvbih0LHMpe28uX3JlY29yZEFQSUxhdGVuY3koZSxpLG4sdCksci5hdXRoRmFpbHVyZSgpfSxhY2Nlc3NEZW5pZWQ6ZnVuY3Rpb24odCxzKXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSxuLHQpLHIuYWNjZXNzRGVuaWVkJiZyLmFjY2Vzc0RlbmllZCgpfX0pfSxpLnByb3RvdHlwZS5fcmVjb3JkQVBJTGF0ZW5jeT1mdW5jdGlvbihlLHQsbixyKXt2YXIgbz0obmV3IERhdGUpLmdldFRpbWUoKS10O3RoaXMuX3NlbmRBUElNZXRyaWNzKGUsbyxuLHIpfSxpLnByb3RvdHlwZS5fc2VuZEFQSU1ldHJpY3M9ZnVuY3Rpb24oZSxuLG8saSl7bGV0IHM9e25hbWU6ZSx0aW1lOm4sZXJyb3I6aSxlcnJvcjV4eDowfTtjb25zdCBhPVt7bmFtZToiQ2F0ZWdvcnkiLHZhbHVlOiJBUEkifV0sYz1pJiZpLnN0YXR1c0NvZGV8fDIwMCx1PWkmJmkucmV0cnlTdGF0dXN8fHQuUmV0cnlTdGF0dXMuTk9ORSxsPVt7bmFtZToiSHR0cFN0YXR1c0NvZGUiLHZhbHVlOmN9LHtuYW1lOiJIdHRwR2VuZXJpY1N0YXR1c0NvZGUiLHZhbHVlOmAke2MudG9TdHJpbmcoKS5jaGFyQXQoMCl9WFhgfSx7bmFtZToiUmV0cnlTdGF0dXMiLHZhbHVlOnV9XTtpZigiNSI9PT1jLnRvU3RyaW5nKCkuY2hhckF0KDApJiYocy5lcnJvcjV4eD0xKSwiNSI9PT1jLnRvU3RyaW5nKCkuY2hhckF0KDApP3MuZmF1bHQ9MToiMiI9PT1jLnRvU3RyaW5nKCkuY2hhckF0KDApJiYocy5mYXVsdD0wKSxyW2VdJiZvJiZvLnJlbGF0ZWRDb250YWN0SWQpe2xldCBuPXtuYW1lOmAke2V9V2l0aFJlbGF0ZWRDb250YWN0SWRgLHRpbWU6cy50aW1lLGVycm9yOnMuZXJyb3IsZXJyb3I1eHg6cy5lcnJvcjV4eH07dGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFQSV9NRVRSSUMsey4uLm4sZGltZW5zaW9uczphLG9wdGlvbmFsRGltZW5zaW9uczpsfSl9dGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFQSV9NRVRSSUMsey4uLnMsZGltZW5zaW9uczphLG9wdGlvbmFsRGltZW5zaW9uczpsfSl9O3ZhciBzPWZ1bmN0aW9uKCl7dmFyIG49dGhpczt0aGlzLm11bHRpcGxleGVyPW5ldyB0LlN0cmVhbU11bHRpcGxleGVyLHRoaXMuY29uZHVpdD1uZXcgdC5Db25kdWl0KCJBbWF6b25Db25uZWN0U2hhcmVkV29ya2VyIixudWxsLHRoaXMubXVsdGlwbGV4ZXIpLHRoaXMuY2xpZW50PW5ldyBpKHRoaXMuY29uZHVpdCksdGhpcy50aW1lb3V0PW51bGwsdGhpcy5hZ2VudD1udWxsLHRoaXMubmV4dFRva2VuPW51bGwsdGhpcy5pbml0RGF0YT17fSx0aGlzLnBvcnRDb25kdWl0TWFwPXt9LHRoaXMuc3RyZWFtTWFwQnlUYWJJZD17fSx0aGlzLm1hc3RlckNvb3JkPW5ldyBvLHRoaXMubG9nc0J1ZmZlcj1bXSx0aGlzLnN1cHByZXNzPSExLHRoaXMuZm9yY2VPZmZsaW5lPSExLHRoaXMubG9uZ1BvbGxpbmdPcHRpb25zPXthbGxvd0xvbmdQb2xsaW5nU2hhZG93TW9kZTohMSxhbGxvd0xvbmdQb2xsaW5nV2Vic29ja2V0T25seU1vZGU6ITF9LHRoaXMuZHJQb2xsaW5nVXJsPW51bGwsdGhpcy50aGlzQXJuPW51bGwsdGhpcy5vdGhlckFybj1udWxsLHRoaXMucGVuZGluZ0ZhaWxvdmVyPW51bGw7dmFyIHI9bnVsbDt0LnJvb3RMb2dnZXI9bmV3IHQuRG93bnN0cmVhbUNvbmR1aXRMb2dnZXIodGhpcy5jb25kdWl0KSx0aGlzLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLlNFTkRfTE9HUywoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5wdXNoTG9nc0Rvd25zdHJlYW0oZSksbi5sb2dzQnVmZmVyPW4ubG9nc0J1ZmZlci5jb25jYXQoZSksbi5sb2dzQnVmZmVyLmxlbmd0aD40MDAmJm4uaGFuZGxlU2VuZExvZ3NSZXF1ZXN0KG4ubG9nc0J1ZmZlcil9KSksdGhpcy5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuU1VQUFJFU1MsKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZGVidWcoIltEaXNhc3RlciBSZWNvdmVyeV0gU2V0dGluZyBTdXBwcmVzcyB0byAlcyIsZS5zdXBwcmVzcykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLnN1cHByZXNzPWUuc3VwcHJlc3N8fCExLG4uc3VwcHJlc3N8fChuLmZvcmNlT2ZmbGluZT0hMSksKHZvaWQgMD09PWUuc2hvdWxkU2VuZEZhaWxvdmVyRG93bnN0cmVhbXx8ZS5zaG91bGRTZW5kRmFpbG92ZXJEb3duc3RyZWFtKSYmbi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5GQUlMT1ZFUix7aXNQcmltYXJ5OiFuLnN1cHByZXNzfSl9KSksdGhpcy5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRk9SQ0VfT0ZGTElORSwoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5kZWJ1ZygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBTZXR0aW5nIEZPUkNFX09GRkxJTkUgdG8gJXMiLGUub2ZmbGluZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLmZvcmNlT2ZmbGluZXx8KG4ucGVuZGluZ0ZhaWxvdmVyPSExLG4uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRkFJTE9WRVIse2lzUHJpbWFyeTohMSxuZXh0QWN0aXZlQXJuOmUubmV4dEFjdGl2ZUFybn0pKSxuLmZvcmNlT2ZmbGluZT1lLm9mZmxpbmV8fCExfSkpLHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5JTklUX0RSX1BPTExJTkcmJnRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLklOSVRfRFJfUE9MTElORywoZnVuY3Rpb24oZSl7dmFyIHI9dC5nZXRMb2coKTtuLmRyUG9sbGluZ1VybD8oci5kZWJ1ZyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBBZGRpbmcgbmV3IENDUCB0byBhY3RpdmUgcmVnaW9uIHBvbGxpbmcgZm9yIGluc3RhbmNlICR7ZS5pbnN0YW5jZUFybn1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4ucG9sbEZvckFjdGl2ZVJlZ2lvbighMCwhMSkpOihyLmluZm8oYFtEaXNhc3RlciBSZWNvdmVyeV0gSW5pdGlhbGl6aW5nIGFjdGl2ZSByZWdpb24gcG9sbGluZyBmb3IgaW5zdGFuY2UgJHtlLmluc3RhbmNlQXJufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi50aGlzQXJuPWUuaW5zdGFuY2VBcm4sbi5vdGhlckFybj1lLm90aGVyQXJuLG4uZ2V0UHJlc2lnbmVkRGlzY292ZXJ5VXJsKCkudGhlbigoZT0+e24uZHJQb2xsaW5nVXJsPWUsbi5wb2xsRm9yQWN0aXZlUmVnaW9uKCEwLCEwKX0pLCh0PT57ci5lcnJvcihgW0Rpc2FzdGVyIFJlY292ZXJ5XSBGYWlsZWQgdG8gZ2V0IHByZXNpZ25lZCBVUkwgZm9yIGluc3RhbmNlICR7ZS5pbnN0YW5jZUFybn07IHN1cHByZXNzaW5nIGNvbnRhY3RzYCkud2l0aEV4Y2VwdGlvbih0KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uc3VwcHJlc3M9ITB9KSkpfSkpLHRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuQ09ORklHVVJFLChmdW5jdGlvbihvKXtjb25zb2xlLmxvZygiQEBAIGNvbmZpZ3VyZSBldmVudCBoYW5kbGVyIixvKTt0cnl7by5hdXRoVG9rZW4mJm8uYXV0aFRva2VuIT09bi5pbml0RGF0YS5hdXRoVG9rZW4mJihuLmluaXREYXRhPW8sdC5jb3JlLmluaXQobyksby5sb25nUG9sbGluZ09wdGlvbnMmJigiYm9vbGVhbiI9PXR5cGVvZiBvLmxvbmdQb2xsaW5nT3B0aW9ucy5hbGxvd0xvbmdQb2xsaW5nU2hhZG93TW9kZSYmKG4ubG9uZ1BvbGxpbmdPcHRpb25zLmFsbG93TG9uZ1BvbGxpbmdTaGFkb3dNb2RlPW8ubG9uZ1BvbGxpbmdPcHRpb25zLmFsbG93TG9uZ1BvbGxpbmdTaGFkb3dNb2RlKSwiYm9vbGVhbiI9PXR5cGVvZiBvLmxvbmdQb2xsaW5nT3B0aW9ucy5hbGxvd0xvbmdQb2xsaW5nV2Vic29ja2V0T25seU1vZGUmJihuLmxvbmdQb2xsaW5nT3B0aW9ucy5hbGxvd0xvbmdQb2xsaW5nV2Vic29ja2V0T25seU1vZGU9by5sb25nUG9sbGluZ09wdGlvbnMuYWxsb3dMb25nUG9sbGluZ1dlYnNvY2tldE9ubHlNb2RlKSkscj90LmdldExvZygpLmluZm8oIk5vdCBJbml0aWFsaXppbmcgYSBuZXcgV2Vic29ja2V0TWFuYWdlciBpbnN0YW5jZSwgc2luY2Ugb25lIGFscmVhZHkgZXhpc3RzIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKToodC5nZXRMb2coKS5pbmZvKCJDcmVhdGluZyBhIG5ldyBXZWJzb2NrZXQgY29ubmVjdGlvbiBmb3IgQ0NQIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LldlYlNvY2tldE1hbmFnZXIuc2V0R2xvYmFsQ29uZmlnKHtsb2dnZXJDb25maWc6e2xvZ2dlcjp0LmdldExvZygpLGFkdmFuY2VkTG9nV3JpdGVyOiJpbmZvIixsZXZlbDoxMH19KSwocj10LldlYlNvY2tldE1hbmFnZXIuY3JlYXRlKCkpLm9uSW5pdEZhaWx1cmUoKGZ1bmN0aW9uKCl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLklOSVRfRkFJTFVSRSl9KSksci5vbkNvbm5lY3Rpb25PcGVuKChmdW5jdGlvbihlKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQ09OTkVDVElPTl9PUEVOLGUpfSkpLHIub25Db25uZWN0aW9uQ2xvc2UoKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5DT05ORUNUSU9OX0NMT1NFLGUpfSkpLHIub25Db25uZWN0aW9uR2FpbigoZnVuY3Rpb24oKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5BZ2VudEV2ZW50cy5XRUJTT0NLRVRfQ09OTkVDVElPTl9HQUlORUQpLG4uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5DT05ORUNUSU9OX0dBSU4pfSkpLHIub25Db25uZWN0aW9uTG9zdCgoZnVuY3Rpb24oZSl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuQWdlbnRFdmVudHMuV0VCU09DS0VUX0NPTk5FQ1RJT05fTE9TVCxlKSxuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQ09OTkVDVElPTl9MT1NULGUpfSkpLHIub25TdWJzY3JpcHRpb25VcGRhdGUoKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5TVUJTQ1JJUFRJT05fVVBEQVRFLGUpfSkpLHIub25TdWJzY3JpcHRpb25GYWlsdXJlKChmdW5jdGlvbihlKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuU1VCU0NSSVBUSU9OX0ZBSUxVUkUsZSl9KSksci5vbkFsbE1lc3NhZ2UoKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5BTExfTUVTU0FHRSxlKX0pKSxuLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLlNFTkQsKGZ1bmN0aW9uKGUpe3Iuc2VuZE1lc3NhZ2UoZSl9KSksbi5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5TVUJTQ1JJQkUsKGZ1bmN0aW9uKGUpe3Iuc3Vic2NyaWJlVG9waWNzKGUpfSkpLHIuaW5pdCh0LmhpdGNoKG4sbi5nZXRXZWJTb2NrZXRVcmwpKS50aGVuKChmdW5jdGlvbihyKXt0cnl7aWYociYmIXIud2ViU29ja2V0Q29ubmVjdGlvbkZhaWxlZCl0LmdldExvZygpLmluZm8oIktpY2tpbmcgb2ZmIGFnZW50IHBvbGxpbmciKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4ucG9sbEZvckFnZW50KCksdC5nZXRMb2coKS5pbmZvKCJLaWNraW5nIG9mZiBjb25maWcgcG9sbGluZyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5wb2xsRm9yQWdlbnRDb25maWd1cmF0aW9uKHtyZXBlYXRGb3JldmVyOiEwfSksdC5nZXRMb2coKS5pbmZvKCJLaWNraW5nIG9mZiBhdXRoIHRva2VuIHBvbGxpbmciKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGUuc2V0SW50ZXJ2YWwodC5oaXRjaChuLG4uY2hlY2tBdXRoVG9rZW4pLDNlNSk7ZWxzZSBpZighdC53ZWJTb2NrZXRJbml0RmFpbGVkKXtjb25zdCBlPXQuV2ViU29ja2V0RXZlbnRzLklOSVRfRkFJTFVSRTt0aHJvdyBuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0oZSksdC53ZWJTb2NrZXRJbml0RmFpbGVkPSEwLG5ldyBFcnJvcihlKX19Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiV2ViU29ja2V0IGZhaWxlZCB0byBpbml0aWFsaXplIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0pKSkpfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoIkBAQCBlcnJvciIsZSl9fSkpLHRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuVEVSTUlOQVRFLChmdW5jdGlvbigpe24uaGFuZGxlU2VuZExvZ3NSZXF1ZXN0KG4ubG9nc0J1ZmZlciksdC5jb3JlLnRlcm1pbmF0ZSgpLG4uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5URVJNSU5BVEVEKX0pKSx0aGlzLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLlNZTkNIUk9OSVpFLChmdW5jdGlvbigpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSl9KSksdGhpcy5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1QsKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbShlLmV2ZW50LGUuZGF0YSl9KSksZS5vbmNvbm5lY3Q9ZnVuY3Rpb24oZSl7dmFyIHI9ZS5wb3J0c1swXSxvPW5ldyB0LlBvcnRTdHJlYW0ocik7bi5tdWx0aXBsZXhlci5hZGRTdHJlYW0obyksci5zdGFydCgpO3ZhciBpPW5ldyB0LkNvbmR1aXQoby5nZXRJZCgpLG51bGwsbyk7aS5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSx7aWQ6by5nZXRJZCgpfSksbi5wb3J0Q29uZHVpdE1hcFtvLmdldElkKCldPWksbi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLlVQREFURV9DT05ORUNURURfQ0NQUyx7bGVuZ3RoOk9iamVjdC5rZXlzKG4ucG9ydENvbmR1aXRNYXApLmxlbmd0aH0pLG51bGwhPT1uLmFnZW50JiZuLnVwZGF0ZUFnZW50KCksaS5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuQVBJX1JFUVVFU1QsdC5oaXRjaChuLG4uaGFuZGxlQVBJUmVxdWVzdCxpKSksaS5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuTUFTVEVSX1JFUVVFU1QsdC5oaXRjaChuLG4uaGFuZGxlTWFzdGVyUmVxdWVzdCxpLG8uZ2V0SWQoKSkpLGkub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLlJFTE9BRF9BR0VOVF9DT05GSUdVUkFUSU9OLHQuaGl0Y2gobixuLnBvbGxGb3JBZ2VudENvbmZpZ3VyYXRpb24pKSxpLm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5UQUJfSUQsdC5oaXRjaChuLG4uaGFuZGxlVGFiSWRFdmVudCxvKSksaS5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuQ0xPU0UsdC5oaXRjaChuLG4uaGFuZGxlQ2xvc2VFdmVudCxvKSl9fTtzLnByb3RvdHlwZS5wb2xsRm9yQWN0aXZlUmVnaW9uPWZ1bmN0aW9uKHIsbyl7dmFyIGk9dGhpcyxzPXQuZ2V0TG9nKCk7aWYoIWkuZHJQb2xsaW5nVXJsKXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIltEaXNhc3RlciBSZWNvdmVyeV0gVHJpZWQgdG8gcG9sbCBmb3IgYWN0aXZlIHJlZ2lvbiB3aXRob3V0IGZpcnN0IGluaXRpYWxpemluZyBEUiBwb2xsaW5nIGluIHRoZSB3b3JrZXIuIik7cy5kZWJ1ZyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBQb2xsaW5nIGZvciBmYWlsb3ZlciB3aXRoIHByZXNpZ25lZCBVUkwgZm9yIGluc3RhbmNlICR7aS50aGlzQXJufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIGE9KG5ldyBEYXRlKS5nZXRUaW1lKCk7cmV0dXJuIHQuZmV0Y2hXaXRoVGltZW91dChpLmRyUG9sbGluZ1VybCwxZTQpLmNhdGNoKChlPT57aWYoZS5zdGF0dXMpe2lmKGkuY2xpZW50Ll9yZWNvcmRBUElMYXRlbmN5KG4sYSx7c3RhdHVzQ29kZTplLnN0YXR1c30pLFt0LkhUVFBfU1RBVFVTX0NPREVTLkFDQ0VTU19ERU5JRUQsdC5IVFRQX1NUQVRVU19DT0RFUy5VTkFVVEhPUklaRURdLmluY2x1ZGVzKGUuc3RhdHVzKSlyZXR1cm4gcy5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEFjdGl2ZSByZWdpb24gcG9sbGluZyBmYWlsZWQ7IHRyeWluZyB0byBnZXQgYSBuZXcgVVJMIGZvciBwb2xsaW5nLiIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpLmdldFByZXNpZ25lZERpc2NvdmVyeVVybCgpLnRoZW4oKGU9PntpLmRyUG9sbGluZ1VybD1lfSkpLnRoZW4oKCgpPT4oYT0obmV3IERhdGUpLmdldFRpbWUoKSx0LmZldGNoV2l0aFRpbWVvdXQoaS5kclBvbGxpbmdVcmwsMWU0KSkpKTt2YXIgcj1gW0Rpc2FzdGVyIFJlY292ZXJ5XSBGYWlsZWQgdG8gcG9sbCBmb3IgZmFpbG92ZXIgZm9yIGluc3RhbmNlICR7aS50aGlzQXJufSwgcmVjZWl2ZWQgdW5leHBlY3RlZCByZXNwb25zZSBjb2RlICR7ZS5zdGF0dXN9YDt0aHJvdyBzLmVycm9yKHIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuZXcgRXJyb3Iocil9dGhyb3cgcj1gW0Rpc2FzdGVyIFJlY292ZXJ5XSBGYWlsZWQgdG8gcG9sbCBmb3IgZmFpbG92ZXIgZm9yIGluc3RhbmNlICR7aS50aGlzQXJufSwgcmVxdWVzdCB0aW1lZCBvdXQgb3IgYWJvcnRlZGAsaS5jbGllbnQuX3JlY29yZEFQSUxhdGVuY3kobixhLHtzdGF0dXNDb2RlOi0xfSkscy5lcnJvcihyKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbmV3IEVycm9yKHIpfSkpLnRoZW4oKGU9PntpZihpLmNsaWVudC5fcmVjb3JkQVBJTGF0ZW5jeShuLGEpLCJib29sZWFuIj09dHlwZW9mIGUuVGVybWluYXRlQWN0aXZlQ29udGFjdHMpe3ZhciBjPSFlLlRlcm1pbmF0ZUFjdGl2ZUNvbnRhY3RzO2lmKGUuSW5zdGFuY2VBcm4paWYocy5kZWJ1ZyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBTdWNjZXNzZnVsbHkgcG9sbGVkIGZvciBhY3RpdmUgcmVnaW9uLiBQcmltYXJ5IGluc3RhbmNlIEFSTiBpcyAke2UuSW5zdGFuY2VBcm59IGFuZCBzb2Z0IGZhaWxvdmVyIGlzIGArKGM/ImVuYWJsZWQiOiJkaXNhYmxlZCIpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkudGhpc0Fybj09PWUuSW5zdGFuY2VBcm4mJiFpLnN1cHByZXNzJiZyKXMuZGVidWcoYFtEaXNhc3RlciBSZWNvdmVyeV0gSW5zdGFuY2UgJHtpLnRoaXNBcm59IGlzIGJlaW5nIHNldCB0byBwcmltYXJ5YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZBSUxPVkVSLHtuZXh0QWN0aXZlQXJuOmUuSW5zdGFuY2VBcm59KTtlbHNlIGlmKGkub3RoZXJBcm49PT1lLkluc3RhbmNlQXJuKXtpZighY3x8b3x8IXJ8fGkuc3VwcHJlc3MmJiFpLnBlbmRpbmdGYWlsb3Zlcnx8aS5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5GQUlMT1ZFUix7bmV4dEFjdGl2ZUFybjppLnRoaXNBcm59KSwhaS5zdXBwcmVzcyl7aS5zdXBwcmVzcz0hMDtjb25zdCBuPWMmJiFvO24/KGkucGVuZGluZ0ZhaWxvdmVyPSEwLHMuZGVidWcoYFtEaXNhc3RlciBSZWNvdmVyeV0gSW5zdGFuY2UgJHtpLnRoaXNBcm59IHdpbGwgYmUgc2V0IHRvIHN0YW5kLWJ5IHVzaW5nIHNvZnQgZmFpbG92ZXJgKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKTpzLmRlYnVnKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEluc3RhbmNlICR7aS50aGlzQXJufSBpcyBiZWluZyBzZXQgdG8gc3RhbmQtYnkgaW1tZWRpYXRlbHlgKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRk9SQ0VfT0ZGTElORSx7c29mdEZhaWxvdmVyOm4sbmV4dEFjdGl2ZUFybjplLkluc3RhbmNlQXJufSl9fWVsc2VbaS50aGlzQXJuLGkub3RoZXJBcm5dLmluY2x1ZGVzKGUuSW5zdGFuY2VBcm4pfHxzLmVycm9yKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIFRoZSBjdXJyZW50IHByaW1hcnkgaW5zdGFuY2UgaW4gdGhpcyBhZ2VudCdzIGZhaWxvdmVyIGdyb3VwICR7ZS5JbnN0YW5jZUFybn0gZG9lc24ndCBtYXRjaCB0aGlzIGluc3RhbmNlICR7aS50aGlzQXJufSBvciB0aGUgb3RoZXIgaW5zdGFuY2UgJHtpLm90aGVyQXJufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7ZWxzZSBzLmVycm9yKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIERSIHBvbGxpbmcgcmVzcG9uc2UgZGlkIG5vdCBjb250YWluIGEgdHJ1dGh5IGFjdGl2ZSBpbnN0YW5jZSBBUk4uIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWVsc2Ugcy5lcnJvcigiW0Rpc2FzdGVyIFJlY292ZXJ5XSBEUiBwb2xsaW5nIHJlc3BvbnNlIGRpZCBub3QgY29udGFpbiBhIHZhbGlkIHZhbHVlIGZvciBUZXJtaW5hdGVBY3RpdmVDb250YWN0cy4iKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSkuY2F0Y2goKGU9PntlLnN0YXR1cyYmaS5jbGllbnQuX3JlY29yZEFQSUxhdGVuY3kobixhLHsuLi5lLHN0YXR1c0NvZGU6ZS5zdGF0dXN9KSxzLmVycm9yKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEFjdGl2ZSByZWdpb24gcG9sbGluZyBmYWlsZWQgZm9yIGluc3RhbmNlICR7aS50aGlzQXJufS5gKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSkuZmluYWxseSgoKCk9PnshbyYmcnx8ZS5zZXRUaW1lb3V0KHQuaGl0Y2goaSxpLnBvbGxGb3JBY3RpdmVSZWdpb24pLDZlNCl9KSl9LHMucHJvdG90eXBlLmdldFByZXNpZ25lZERpc2NvdmVyeVVybD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKCgobixyKT0+e3QuZ2V0TG9nKCkuaW5mbyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBHZXR0aW5nIHByZXNpZ25lZCBVUkwgZm9yIGluc3RhbmNlICR7ZS50aGlzQXJufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy5jbGllbnQuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX1RSQU5TUE9SVCx7dHJhbnNwb3J0VHlwZTp0LlRSQU5TUE9SVF9UWVBFUy5BR0VOVF9ESVNDT1ZFUll9LHtzdWNjZXNzOmZ1bmN0aW9uKGUpe2UmJmUuYWdlbnREaXNjb3ZlcnlUcmFuc3BvcnQmJmUuYWdlbnREaXNjb3ZlcnlUcmFuc3BvcnQucHJlc2lnbmVkVXJsPyh0LmdldExvZygpLmluZm8oImdldFByZXNpZ25lZERpc2NvdmVyeVVybCBzdWNjZWVkZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4oZS5hZ2VudERpc2NvdmVyeVRyYW5zcG9ydC5wcmVzaWduZWRVcmwpKToodC5nZXRMb2coKS5pbmZvKCJnZXRQcmVzaWduZWREaXNjb3ZlcnlVcmwgcmVjZWl2ZWQgZW1wdHkvaW52YWxpZCBkYXRhIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoRXJyb3IoImdldFByZXNpZ25lZERpc2NvdmVyeVVybCByZWNlaXZlZCBlbXB0eS9pbnZhbGlkIGRhdGEiKSkpfSxmYWlsdXJlOmZ1bmN0aW9uKG4sbyl7dC5nZXRMb2coKS5lcnJvcihgW0Rpc2FzdGVyIFJlY292ZXJ5XSBGYWlsZWQgdG8gZ2V0IHByZXNpZ25lZCBVUkwgZm9yIGluc3RhbmNlICR7ZS50aGlzQXJufWApLndpdGhFeGNlcHRpb24obikud2l0aE9iamVjdChvKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIobmV3IEVycm9yKCJGYWlsZWQgdG8gZ2V0IHByZXNpZ25lZCBVUkwiKSl9LGF1dGhGYWlsdXJlOmZ1bmN0aW9uKCl7dC5oaXRjaChlLGUuaGFuZGxlQXV0aEZhaWwpKCkscihuZXcgRXJyb3IoIkVuY291bnRlcmVkIGF1dGggZmFpbHVyZSB3aGVuIGdldHRpbmcgcHJlc2lnbmVkIFVSTCIpKX0sYWNjZXNzRGVuaWVkOmZ1bmN0aW9uKCl7dC5oaXRjaChlLGUuaGFuZGxlQWNjZXNzRGVuaWVkKSgpLHIobmV3IEVycm9yKCJFbmNvdW50ZXJlZCBhY2Nlc3MgZGVuaWVkIHdoZW4gZ2V0dGluZyBwcmVzaWduZWQgVVJMIikpfX0pfSkpfSxzLnByb3RvdHlwZS5wb2xsRm9yQWdlbnQ9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLHI9dC5oaXRjaChuLG4uaGFuZGxlUG9sbGluZ0F1dGhGYWlsKTt0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfU05BUFNIT1Qse25leHRUb2tlbjpuLm5leHRUb2tlbix0aW1lb3V0OjNlNH0se3N1Y2Nlc3M6ZnVuY3Rpb24ocixvKXt0cnl7bi5hZ2VudD1uLmFnZW50fHx7fSxuLmFnZW50LnNuYXBzaG90PXIuc25hcHNob3Qsbi5hZ2VudC5zbmFwc2hvdC5sb2NhbFRpbWVzdGFtcD10Lm5vdygpLG4uYWdlbnQuc25hcHNob3Quc2tldz1uLmFnZW50LnNuYXBzaG90LnNuYXBzaG90VGltZXN0YW1wLW4uYWdlbnQuc25hcHNob3QubG9jYWxUaW1lc3RhbXAsbi5uZXh0VG9rZW49ci5uZXh0VG9rZW4sbyYmby5oYXNPd25Qcm9wZXJ0eSgiY29udGVudExlbmd0aCIpJiYobi5hZ2VudC5zbmFwc2hvdC5jb250ZW50TGVuZ3RoPW8uY29udGVudExlbmd0aCksdC5nZXRMb2coKS50cmFjZSgiR0VUX0FHRU5UX1NOQVBTSE9UIHN1Y2NlZWRlZC4iKS53aXRoT2JqZWN0KHIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi51cGRhdGVBZ2VudCgpfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIkxvbmcgcG9sbCBmYWlsZWQgdG8gdXBkYXRlIGFnZW50LiIpLndpdGhPYmplY3Qocikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWZpbmFsbHl7ZS5zZXRUaW1lb3V0KHQuaGl0Y2gobixuLnBvbGxGb3JBZ2VudCksMTAwKX19LGZhaWx1cmU6ZnVuY3Rpb24ocixvKXt0cnl7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGdldCBhZ2VudCBkYXRhLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOnIsZGF0YTpvfSl9ZmluYWxseXtlLnNldFRpbWVvdXQodC5oaXRjaChuLG4ucG9sbEZvckFnZW50KSw1ZTMpfX0sYXV0aEZhaWx1cmU6ZnVuY3Rpb24oKXtyKCl9LGFjY2Vzc0RlbmllZDp0LmhpdGNoKG4sbi5oYW5kbGVBY2Nlc3NEZW5pZWQpfSl9LHMucHJvdG90eXBlLnBvbGxGb3JBZ2VudENvbmZpZ3VyYXRpb249ZnVuY3Rpb24obil7dmFyIHI9dGhpcyxvPW58fHt9LGk9dC5oaXRjaChyLHIuaGFuZGxlUG9sbGluZ0F1dGhGYWlsKTt0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfQ09ORklHVVJBVElPTix7fSx7c3VjY2VzczpmdW5jdGlvbihuKXt2YXIgaT1uLmNvbmZpZ3VyYXRpb247ci5wb2xsRm9yQWdlbnRQZXJtaXNzaW9ucyhpKSxyLnBvbGxGb3JBZ2VudFN0YXRlcyhpKSxyLnBvbGxGb3JEaWFsYWJsZUNvdW50cnlDb2RlcyhpKSxyLnBvbGxGb3JSb3V0aW5nUHJvZmlsZVF1ZXVlcyhpKSxvLnJlcGVhdEZvcmV2ZXImJmUuc2V0VGltZW91dCh0LmhpdGNoKHIsci5wb2xsRm9yQWdlbnRDb25maWd1cmF0aW9uLG8pLDNlNCl9LGZhaWx1cmU6ZnVuY3Rpb24obixpKXt0cnl7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGZldGNoIGFnZW50IGNvbmZpZ3VyYXRpb24gZGF0YS4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjpuLGRhdGE6aX0pfWZpbmFsbHl7by5yZXBlYXRGb3JldmVyJiZlLnNldFRpbWVvdXQodC5oaXRjaChyLHIucG9sbEZvckFnZW50Q29uZmlndXJhdGlvbiksM2U0LG8pfX0sYXV0aEZhaWx1cmU6ZnVuY3Rpb24oKXtpKCl9LGFjY2Vzc0RlbmllZDp0LmhpdGNoKHIsci5oYW5kbGVBY2Nlc3NEZW5pZWQpfSl9LHMucHJvdG90eXBlLnBvbGxGb3JBZ2VudFN0YXRlcz1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXMsbz1ufHx7fTtvLm1heFJlc3VsdHM9by5tYXhSZXN1bHRzfHx0LkRFRkFVTFRfQkFUQ0hfU0laRSx0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfU1RBVEVTLHtuZXh0VG9rZW46by5uZXh0VG9rZW58fG51bGwsbWF4UmVzdWx0czpvLm1heFJlc3VsdHN9LHtzdWNjZXNzOmZ1bmN0aW9uKHQpe3QubmV4dFRva2VuP3IucG9sbEZvckFnZW50U3RhdGVzKGUse3N0YXRlczooby5zdGF0ZXN8fFtdKS5jb25jYXQodC5zdGF0ZXMpLG5leHRUb2tlbjp0Lm5leHRUb2tlbixtYXhSZXN1bHRzOm8ubWF4UmVzdWx0c30pOihlLmFnZW50U3RhdGVzPShvLnN0YXRlc3x8W10pLmNvbmNhdCh0LnN0YXRlcyksci51cGRhdGVBZ2VudENvbmZpZ3VyYXRpb24oZSkpfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGZldGNoIGFnZW50IHN0YXRlcyBsaXN0LiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOmUsZGF0YTpufSl9LGF1dGhGYWlsdXJlOnQuaGl0Y2gocixyLmhhbmRsZVBvbGxpbmdBdXRoRmFpbCksYWNjZXNzRGVuaWVkOnQuaGl0Y2gocixyLmhhbmRsZUFjY2Vzc0RlbmllZCl9KX0scy5wcm90b3R5cGUucG9sbEZvckFnZW50UGVybWlzc2lvbnM9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzLG89bnx8e307by5tYXhSZXN1bHRzPW8ubWF4UmVzdWx0c3x8dC5ERUZBVUxUX0JBVENIX1NJWkUsdGhpcy5jbGllbnQuY2FsbCh0LkNsaWVudE1ldGhvZHMuR0VUX0FHRU5UX1BFUk1JU1NJT05TLHtuZXh0VG9rZW46by5uZXh0VG9rZW58fG51bGwsbWF4UmVzdWx0czpvLm1heFJlc3VsdHN9LHtzdWNjZXNzOmZ1bmN0aW9uKHQpe3QubmV4dFRva2VuP3IucG9sbEZvckFnZW50UGVybWlzc2lvbnMoZSx7cGVybWlzc2lvbnM6KG8ucGVybWlzc2lvbnN8fFtdKS5jb25jYXQodC5wZXJtaXNzaW9ucyksbmV4dFRva2VuOnQubmV4dFRva2VuLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSk6KGUucGVybWlzc2lvbnM9KG8ucGVybWlzc2lvbnN8fFtdKS5jb25jYXQodC5wZXJtaXNzaW9ucyksci51cGRhdGVBZ2VudENvbmZpZ3VyYXRpb24oZSkpfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGZldGNoIGFnZW50IHBlcm1pc3Npb25zIGxpc3QuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoT2JqZWN0KHtlcnI6ZSxkYXRhOm59KX0sYXV0aEZhaWx1cmU6dC5oaXRjaChyLHIuaGFuZGxlUG9sbGluZ0F1dGhGYWlsKSxhY2Nlc3NEZW5pZWQ6dC5oaXRjaChyLHIuaGFuZGxlQWNjZXNzRGVuaWVkKX0pfSxzLnByb3RvdHlwZS5wb2xsRm9yRGlhbGFibGVDb3VudHJ5Q29kZXM9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzLG89bnx8e307by5tYXhSZXN1bHRzPW8ubWF4UmVzdWx0c3x8dC5ERUZBVUxUX0JBVENIX1NJWkUsdGhpcy5jbGllbnQuY2FsbCh0LkNsaWVudE1ldGhvZHMuR0VUX0RJQUxBQkxFX0NPVU5UUllfQ09ERVMse25leHRUb2tlbjpvLm5leHRUb2tlbnx8bnVsbCxtYXhSZXN1bHRzOm8ubWF4UmVzdWx0c30se3N1Y2Nlc3M6ZnVuY3Rpb24odCl7dC5uZXh0VG9rZW4/ci5wb2xsRm9yRGlhbGFibGVDb3VudHJ5Q29kZXMoZSx7Y291bnRyeUNvZGVzOihvLmNvdW50cnlDb2Rlc3x8W10pLmNvbmNhdCh0LmNvdW50cnlDb2RlcyksbmV4dFRva2VuOnQubmV4dFRva2VuLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSk6KGUuZGlhbGFibGVDb3VudHJpZXM9KG8uY291bnRyeUNvZGVzfHxbXSkuY29uY2F0KHQuY291bnRyeUNvZGVzKSxyLnVwZGF0ZUFnZW50Q29uZmlndXJhdGlvbihlKSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggZGlhbGFibGUgY291bnRyeSBjb2RlcyBsaXN0LiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOmUsZGF0YTpufSl9LGF1dGhGYWlsdXJlOnQuaGl0Y2gocixyLmhhbmRsZVBvbGxpbmdBdXRoRmFpbCksYWNjZXNzRGVuaWVkOnQuaGl0Y2gocixyLmhhbmRsZUFjY2Vzc0RlbmllZCl9KX0scy5wcm90b3R5cGUucG9sbEZvclJvdXRpbmdQcm9maWxlUXVldWVzPWZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpcyxvPW58fHt9O28ubWF4UmVzdWx0cz1vLm1heFJlc3VsdHN8fHQuREVGQVVMVF9CQVRDSF9TSVpFLHRoaXMuY2xpZW50LmNhbGwodC5DbGllbnRNZXRob2RzLkdFVF9ST1VUSU5HX1BST0ZJTEVfUVVFVUVTLHtyb3V0aW5nUHJvZmlsZUFSTjplLnJvdXRpbmdQcm9maWxlLnJvdXRpbmdQcm9maWxlQVJOLG5leHRUb2tlbjpvLm5leHRUb2tlbnx8bnVsbCxtYXhSZXN1bHRzOm8ubWF4UmVzdWx0c30se3N1Y2Nlc3M6ZnVuY3Rpb24odCl7dC5uZXh0VG9rZW4/ci5wb2xsRm9yUm91dGluZ1Byb2ZpbGVRdWV1ZXMoZSx7Y291bnRyeUNvZGVzOihvLnF1ZXVlc3x8W10pLmNvbmNhdCh0LnF1ZXVlcyksbmV4dFRva2VuOnQubmV4dFRva2VuLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSk6KGUucm91dGluZ1Byb2ZpbGUucXVldWVzPShvLnF1ZXVlc3x8W10pLmNvbmNhdCh0LnF1ZXVlcyksci51cGRhdGVBZ2VudENvbmZpZ3VyYXRpb24oZSkpfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGZldGNoIHJvdXRpbmcgcHJvZmlsZSBxdWV1ZXMgbGlzdC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjplLGRhdGE6bn0pfSxhdXRoRmFpbHVyZTp0LmhpdGNoKHIsci5oYW5kbGVQb2xsaW5nQXV0aEZhaWwpLGFjY2Vzc0RlbmllZDp0LmhpdGNoKHIsci5oYW5kbGVBY2Nlc3NEZW5pZWQpfSl9LHMucHJvdG90eXBlLmhhbmRsZUFQSVJlcXVlc3Q9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzO3RoaXMuY2xpZW50LmNhbGwobi5tZXRob2Qsbi5wYXJhbXMse3N1Y2Nlc3M6ZnVuY3Rpb24ocil7dmFyIG89dC5FdmVudEZhY3RvcnkuY3JlYXRlUmVzcG9uc2UodC5FdmVudFR5cGUuQVBJX1JFU1BPTlNFLG4scik7ZS5zZW5kRG93bnN0cmVhbShvLmV2ZW50LG8pfSxmYWlsdXJlOmZ1bmN0aW9uKG8saSl7dmFyIHM9dC5FdmVudEZhY3RvcnkuY3JlYXRlUmVzcG9uc2UodC5FdmVudFR5cGUuQVBJX1JFU1BPTlNFLG4saSxKU09OLnN0cmluZ2lmeShvKSk7ZS5zZW5kRG93bnN0cmVhbShzLmV2ZW50LHMpLHQuZ2V0TG9nKCkuZXJyb3IoIiclcycgQVBJIHJlcXVlc3QgZmFpbGVkIixuLm1ldGhvZCkud2l0aE9iamVjdCh7cmVxdWVzdDpyLmZpbHRlckF1dGhUb2tlbihuKSxyZXNwb25zZTpzfSkud2l0aEV4Y2VwdGlvbihvKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxhdXRoRmFpbHVyZTp0LmhpdGNoKHIsci5oYW5kbGVBdXRoRmFpbCx7YXV0aG9yaXplOiEwfSl9KX0scy5wcm90b3R5cGUuaGFuZGxlTWFzdGVyUmVxdWVzdD1mdW5jdGlvbihlLG4scil7dmFyIG89dGhpcy5jb25kdWl0LGk9bnVsbDtzd2l0Y2goci5tZXRob2Qpe2Nhc2UgdC5NYXN0ZXJNZXRob2RzLkJFQ09NRV9NQVNURVI6dmFyIHM9dGhpcy5tYXN0ZXJDb29yZC5nZXRNYXN0ZXIoci5wYXJhbXMudG9waWMpLGE9Qm9vbGVhbihzKSYmcyE9PW47dGhpcy5tYXN0ZXJDb29yZC5zZXRNYXN0ZXIoci5wYXJhbXMudG9waWMsbiksaT10LkV2ZW50RmFjdG9yeS5jcmVhdGVSZXNwb25zZSh0LkV2ZW50VHlwZS5NQVNURVJfUkVTUE9OU0Uscix7bWFzdGVySWQ6bix0YWtlT3ZlcjphLHRvcGljOnIucGFyYW1zLnRvcGljfSksYSYmby5zZW5kRG93bnN0cmVhbShpLmV2ZW50LGkpO2JyZWFrO2Nhc2UgdC5NYXN0ZXJNZXRob2RzLkNIRUNLX01BU1RFUjoocz10aGlzLm1hc3RlckNvb3JkLmdldE1hc3RlcihyLnBhcmFtcy50b3BpYykpfHxyLnBhcmFtcy5zaG91bGROb3RCZWNvbWVNYXN0ZXJJZk5vbmV8fCh0aGlzLm1hc3RlckNvb3JkLnNldE1hc3RlcihyLnBhcmFtcy50b3BpYyxuKSxzPW4pLGk9dC5FdmVudEZhY3RvcnkuY3JlYXRlUmVzcG9uc2UodC5FdmVudFR5cGUuTUFTVEVSX1JFU1BPTlNFLHIse21hc3RlcklkOnMsaXNNYXN0ZXI6bj09PXMsdG9waWM6ci5wYXJhbXMudG9waWN9KTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBtYXN0ZXIgbWV0aG9kOiAiK3IubWV0aG9kKX1lLnNlbmREb3duc3RyZWFtKGkuZXZlbnQsaSl9LHMucHJvdG90eXBlLmhhbmRsZVRhYklkRXZlbnQ9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzO3RyeXtsZXQgbz1uLnRhYklkLGk9ci5zdHJlYW1NYXBCeVRhYklkW29dLHM9ZS5nZXRJZCgpLGE9T2JqZWN0LmtleXMoci5zdHJlYW1NYXBCeVRhYklkKS5maWx0ZXIoKGU9PnIuc3RyZWFtTWFwQnlUYWJJZFtlXS5sZW5ndGg+MCkpLmxlbmd0aDtpZihpJiZpLmxlbmd0aD4wKXtpZighaS5pbmNsdWRlcyhzKSl7ci5zdHJlYW1NYXBCeVRhYklkW29dLnB1c2gocyk7bGV0IGU9e2xlbmd0aDpPYmplY3Qua2V5cyhyLnBvcnRDb25kdWl0TWFwKS5sZW5ndGgsdGFiSWQ6byxzdHJlYW1zVGFic0Fjcm9zc0Jyb3dzZXI6YX07ZVtvXT17bGVuZ3RoOmkubGVuZ3RofSxyLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuVVBEQVRFX0NPTk5FQ1RFRF9DQ1BTLGUpfX1lbHNle3Iuc3RyZWFtTWFwQnlUYWJJZFtvXT1bZS5nZXRJZCgpXTtsZXQgbj17bGVuZ3RoOk9iamVjdC5rZXlzKHIucG9ydENvbmR1aXRNYXApLmxlbmd0aCx0YWJJZDpvLHN0cmVhbXNUYWJzQWNyb3NzQnJvd3NlcjphKzF9O25bb109e2xlbmd0aDpyLnN0cmVhbU1hcEJ5VGFiSWRbb10ubGVuZ3RofSxyLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuVVBEQVRFX0NPTk5FQ1RFRF9DQ1BTLG4pfX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJbVGFiIElkc10gSXNzdWUgdXBkYXRpbmcgY29ubmVjdGVkIENDUHMgd2l0aGluIHRoZSBzYW1lIHRhYiIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19LHMucHJvdG90eXBlLmhhbmRsZUNsb3NlRXZlbnQ9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztuLm11bHRpcGxleGVyLnJlbW92ZVN0cmVhbShlKSxkZWxldGUgbi5wb3J0Q29uZHVpdE1hcFtlLmdldElkKCldLG4ubWFzdGVyQ29vcmQucmVtb3ZlTWFzdGVyKGUuZ2V0SWQoKSk7bGV0IHI9e2xlbmd0aDpPYmplY3Qua2V5cyhuLnBvcnRDb25kdWl0TWFwKS5sZW5ndGh9LG89T2JqZWN0LmtleXMobi5zdHJlYW1NYXBCeVRhYklkKTt0cnl7bGV0IHQ9by5maW5kKCh0PT5uLnN0cmVhbU1hcEJ5VGFiSWRbdF0uaW5jbHVkZXMoZS5nZXRJZCgpKSkpO2lmKHQpe2xldCBvPW4uc3RyZWFtTWFwQnlUYWJJZFt0XS5maW5kSW5kZXgoKHQ9PmUuZ2V0SWQoKT09PXQpKTtuLnN0cmVhbU1hcEJ5VGFiSWRbdF0uc3BsaWNlKG8sMSk7bGV0IGk9bi5zdHJlYW1NYXBCeVRhYklkW3RdP24uc3RyZWFtTWFwQnlUYWJJZFt0XS5sZW5ndGg6MDtyW3RdPXtsZW5ndGg6aX0sci50YWJJZD10fWxldCBpPW8uZmlsdGVyKChlPT5uLnN0cmVhbU1hcEJ5VGFiSWRbZV0ubGVuZ3RoPjApKS5sZW5ndGg7ci5zdHJlYW1zVGFic0Fjcm9zc0Jyb3dzZXI9aX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJbVGFiIElkc10gSXNzdWUgdXBkYXRpbmcgdGFiSWQtc3BlY2lmaWMgc3RyZWFtIGRhdGEiKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLlVQREFURV9DT05ORUNURURfQ0NQUyxyKX0scy5wcm90b3R5cGUudXBkYXRlQWdlbnRDb25maWd1cmF0aW9uPWZ1bmN0aW9uKGUpe2UucGVybWlzc2lvbnMmJmUuZGlhbGFibGVDb3VudHJpZXMmJmUuYWdlbnRTdGF0ZXMmJmUucm91dGluZ1Byb2ZpbGUucXVldWVzPyh0aGlzLmFnZW50PXRoaXMuYWdlbnR8fHt9LHRoaXMuYWdlbnQuY29uZmlndXJhdGlvbj1lLHRoaXMudXBkYXRlQWdlbnQoKSk6dC5nZXRMb2coKS50cmFjZSgiV2FpdGluZyB0byB1cGRhdGUgYWdlbnQgY29uZmlndXJhdGlvbiB1bnRpbCBhbGwgY29uZmlnIGRhdGEgaGFzIGJlZW4gZmV0Y2hlZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxzLnByb3RvdHlwZS51cGRhdGVBZ2VudD1mdW5jdGlvbigpe3RoaXMuYWdlbnQ/dGhpcy5hZ2VudC5zbmFwc2hvdD90aGlzLmFnZW50LmNvbmZpZ3VyYXRpb24/KHRoaXMuYWdlbnQuc25hcHNob3Quc3RhdHVzPXRoaXMuYWdlbnQuc3RhdGUsdGhpcy5hZ2VudC5zbmFwc2hvdC5jb250YWN0cyYmdGhpcy5hZ2VudC5zbmFwc2hvdC5jb250YWN0cy5sZW5ndGg+MSYmdGhpcy5hZ2VudC5zbmFwc2hvdC5jb250YWN0cy5zb3J0KChmdW5jdGlvbihlLHQpe3JldHVybiBlLnN0YXRlLnRpbWVzdGFtcC5nZXRUaW1lKCktdC5zdGF0ZS50aW1lc3RhbXAuZ2V0VGltZSgpfSkpLHRoaXMuYWdlbnQuc25hcHNob3QuY29udGFjdHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5zdGF0dXM9ZS5zdGF0ZSxlLmNvbm5lY3Rpb25zLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuYWRkcmVzcz1lLmVuZHBvaW50fSkpfSkpLHRoaXMuYWdlbnQuY29uZmlndXJhdGlvbi5yb3V0aW5nUHJvZmlsZS5kZWZhdWx0T3V0Ym91bmRRdWV1ZS5xdWV1ZUlkPXRoaXMuYWdlbnQuY29uZmlndXJhdGlvbi5yb3V0aW5nUHJvZmlsZS5kZWZhdWx0T3V0Ym91bmRRdWV1ZS5xdWV1ZUFSTix0aGlzLmFnZW50LmNvbmZpZ3VyYXRpb24ucm91dGluZ1Byb2ZpbGUucXVldWVzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UucXVldWVJZD1lLnF1ZXVlQVJOfSkpLHRoaXMuYWdlbnQuc25hcHNob3QuY29udGFjdHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dm9pZCAwIT09ZS5xdWV1ZSYmKGUucXVldWUucXVldWVJZD1lLnF1ZXVlLnF1ZXVlQVJOKX0pKSx0aGlzLmFnZW50LmNvbmZpZ3VyYXRpb24ucm91dGluZ1Byb2ZpbGUucm91dGluZ1Byb2ZpbGVJZD10aGlzLmFnZW50LmNvbmZpZ3VyYXRpb24ucm91dGluZ1Byb2ZpbGUucm91dGluZ1Byb2ZpbGVBUk4sdGhpcy5zdXBwcmVzcyYmKHRoaXMuYWdlbnQuc25hcHNob3QuY29udGFjdHM9dGhpcy5hZ2VudC5zbmFwc2hvdC5jb250YWN0cy5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnN0YXRlLnR5cGU9PXQuQ29udGFjdFN0YXRlVHlwZS5DT05ORUNURUR8fGUuc3RhdGUudHlwZT09dC5Db250YWN0U3RhdGVUeXBlLkVOREVEfSkpLHRoaXMuZm9yY2VPZmZsaW5lJiZ0aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZPUkNFX09GRkxJTkUpKSx0aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5BZ2VudEV2ZW50cy5VUERBVEUsdGhpcy5hZ2VudCkpOnQuZ2V0TG9nKCkudHJhY2UoIldhaXRpbmcgdG8gdXBkYXRlIGFnZW50IHVudGlsIHRoZSBhZ2VudCBjb25maWd1cmF0aW9uIGlzIGF2YWlsYWJsZS4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpOnQuZ2V0TG9nKCkudHJhY2UoIldhaXRpbmcgdG8gdXBkYXRlIGFnZW50IHVudGlsIHRoZSBhZ2VudCBzbmFwc2hvdCBpcyBhdmFpbGFibGUuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTp0LmdldExvZygpLnRyYWNlKCJXYWl0aW5nIHRvIHVwZGF0ZSBhZ2VudCB1bnRpbCB0aGUgYWdlbnQgaGFzIGJlZW4gZnVsbHkgY29uc3RydWN0ZWQuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0scy5wcm90b3R5cGUuZ2V0V2ViU29ja2V0VXJsPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPXQuY29yZS5nZXRDbGllbnQoKSxyPXQuaGl0Y2goZSxlLmhhbmRsZUF1dGhGYWlsKSxvPXQuaGl0Y2goZSxlLmhhbmRsZUFjY2Vzc0RlbmllZCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihlLGkpe24uY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX1RSQU5TUE9SVCx7dHJhbnNwb3J0VHlwZTp0LlRSQU5TUE9SVF9UWVBFUy5XRUJfU09DS0VUfSx7c3VjY2VzczpmdW5jdGlvbihuKXt0LmdldExvZygpLmluZm8oImdldFdlYlNvY2tldFVybCBzdWNjZWVkZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGUobil9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJnZXRXZWJTb2NrZXRVcmwgZmFpbGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoT2JqZWN0KHtlcnI6ZSxkYXRhOm59KSxpKHtyZWFzb246ImdldFdlYlNvY2tldFVybCBmYWlsZWQiLF9kZWJ1ZzplfSl9LGF1dGhGYWlsdXJlOmZ1bmN0aW9uKCl7dC5nZXRMb2coKS5lcnJvcigiZ2V0V2ViU29ja2V0VXJsIEF1dGggRmFpbHVyZSIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaShFcnJvcigiQXV0aGVudGljYXRpb24gZmFpbGVkIHdoaWxlIGdldHRpbmcgZ2V0V2ViU29ja2V0VXJsIikpLHIoKX0sYWNjZXNzRGVuaWVkOmZ1bmN0aW9uKCl7dC5nZXRMb2coKS5lcnJvcigiZ2V0V2ViU29ja2V0VXJsIEFjY2VzcyBEZW5pZWQgRmFpbHVyZSIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaShFcnJvcigiQWNjZXNzIERlbmllZCBGYWlsdXJlIHdoaWxlIGdldHRpbmcgZ2V0V2ViU29ja2V0VXJsIikpLG8oKX19KX0pKX0scy5wcm90b3R5cGUuaGFuZGxlU2VuZExvZ3NSZXF1ZXN0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPVtdLHI9ZS5sb2dzQnVmZmVyLnNsaWNlKCk7ZS5sb2dzQnVmZmVyPVtdLHIuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bi5wdXNoKHt0aW1lc3RhbXA6ZS50aW1lLGNvbXBvbmVudDplLmNvbXBvbmVudCxtZXNzYWdlOmUudGV4dH0pfSkpLHRoaXMuY2xpZW50LmNhbGwodC5DbGllbnRNZXRob2RzLlNFTkRfQ0xJRU5UX0xPR1Mse2xvZ0V2ZW50czpufSx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oIlNlbmRMb2dzIHJlcXVlc3Qgc3VjY2VlZGVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJTZW5kTG9ncyByZXF1ZXN0IGZhaWxlZC4iKS53aXRoT2JqZWN0KG4pLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0sYXV0aEZhaWx1cmU6dC5oaXRjaChlLGUuaGFuZGxlQXV0aEZhaWwpfSl9LHMucHJvdG90eXBlLmhhbmRsZUF1dGhGYWlsPWZ1bmN0aW9uKGUpe2U/dGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFVVEhfRkFJTCxlKTp0aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuQVVUSF9GQUlMKX0scy5wcm90b3R5cGUuaGFuZGxlUG9sbGluZ0F1dGhGYWlsPWZ1bmN0aW9uKCl7dGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkNUSV9BVVRIT1JJWkVfUkVUUklFU19FWEhBVVNURUQpfSxzLnByb3RvdHlwZS5oYW5kbGVBY2Nlc3NEZW5pZWQ9ZnVuY3Rpb24oKXt0aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuQUNDRVNTX0RFTklFRCl9LHMucHJvdG90eXBlLmNoZWNrQXV0aFRva2VuPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPW5ldyBEYXRlKGUuaW5pdERhdGEuYXV0aFRva2VuRXhwaXJhdGlvbikscj0obmV3IERhdGUpLmdldFRpbWUoKTtuLmdldFRpbWUoKTxyKzE4ZTUmJih0LmdldExvZygpLmluZm8oIkF1dGggdG9rZW4gZXhwaXJlcyBhdCAiK24rIiBTdGFydCByZWZyZXNoaW5nIHRva2VuIHdpdGggcmV0cnkuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmJhY2tvZmYodC5oaXRjaChlLGUuYXV0aG9yaXplKSwxZTQsNCkpfSxzLnByb3RvdHlwZS5hdXRob3JpemU9ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt0LmNvcmUuYXV0aG9yaXplKHRoaXMuaW5pdERhdGEuYXV0aG9yaXplRW5kcG9pbnQpLnRoZW4oKGZ1bmN0aW9uKHIpe3ZhciBvPW5ldyBEYXRlKHIuZXhwaXJhdGlvbik7dC5nZXRMb2coKS5pbmZvKCJBdXRob3JpemF0aW9uIHN1Y2NlZWRlZCBhbmQgdGhlIHRva2VuIGV4cGlyZXMgYXQgJXMiLG8pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5pbml0RGF0YS5hdXRoVG9rZW49ci5hY2Nlc3NUb2tlbixuLmluaXREYXRhLmF1dGhUb2tlbkV4cGlyYXRpb249byx0LmNvcmUuaW5pdENsaWVudChuLmluaXREYXRhKSx0LmNvcmUuaW5pdEFnZW50QXBwQ2xpZW50KG4uaW5pdERhdGEpLGUuc3VjY2VzcygpfSkpLmNhdGNoKChmdW5jdGlvbihyKXt0LmdldExvZygpLmVycm9yKCJBdXRob3JpemF0aW9uIGZhaWxlZCB3aXRoIGNvZGUgJXMiLHIuc3RhdHVzKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLDQwMT09PXIuc3RhdHVzP24uaGFuZGxlQXV0aEZhaWwoKTplLmZhaWx1cmUoKX0pKX0scy5wcm90b3R5cGUuZmlsdGVyQXV0aFRva2VuPWZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Zvcih2YXIgbiBpbiBlKWlmKCJwYXJhbXMiPT09bil7dmFyIHI9e307Zm9yKHZhciBvIGluIGUucGFyYW1zKSJhdXRoZW50aWNhdGlvbiIhPT1vJiYocltvXT1lLnBhcmFtc1tvXSk7dC5wYXJhbXM9cn1lbHNlIHRbbl09ZVtuXTtyZXR1cm4gdH0sdC53b3JrZXIubWFpbj1mdW5jdGlvbigpe3Qud29ya2VyLmNsaWVudEVuZ2luZT1uZXcgc319KCl9fSx0PXt9O2Z1bmN0aW9uIG4ocil7dmFyIG89dFtyXTtpZih2b2lkIDAhPT1vKXJldHVybiBvLmV4cG9ydHM7dmFyIGk9dFtyXT17ZXhwb3J0czp7fX07cmV0dXJuIGVbcl0uY2FsbChpLmV4cG9ydHMsaSxpLmV4cG9ydHMsbiksaS5leHBvcnRzfW4uZz1mdW5jdGlvbigpe2lmKCJvYmplY3QiPT10eXBlb2YgZ2xvYmFsVGhpcylyZXR1cm4gZ2xvYmFsVGhpczt0cnl7cmV0dXJuIHRoaXN8fG5ldyBGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfWNhdGNoKGUpe2lmKCJvYmplY3QiPT10eXBlb2Ygd2luZG93KXJldHVybiB3aW5kb3d9fSgpLG4oODI3KSxuKDE2Myksbig5NDQpLG4oMTUxKSxuKDg5MSksbig1OTIpLG4oODIpLG4oNzU0KSxuKDgzMyksbigxNjEpLG4oOTY1KSxuKDI4Niksbig4OTUpLG4oNzQzKSxuKDY0Miksbig3MzYpLG4oNDM5KSxuKDI3OSksbig0MTgpLG4oMTg3KSxuKDgyMSksbig1MDApfSkoKTs="),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["","","","
","