helibee.com page update 3/30/2018


helibee.com

Facebook : Joel Stolarski

Belong to several groups, can messenger , since Facebook is checked regularly.



Collect, buy and sell antiques, jewelry, gold, militaria, baseball cards, football cards, toys, GiJoe, women, knives etc. 

WTB WTT Trade, Horse Trading friendly

912-245-8433 leave message or no call back,

LEAVE

1) NAME

2) WHAT YOU GOT TO SELL OR TRADE 

3) LOCAL PREFERRED 30474 ( WITHIN 20-30 MILES )



helibee.com 3/30/2018


Contact: Regularly checked email

joestolars@yahoo.com

oaXMuJDR9KX07YS5wcm90b3R5cGUuJDEzPWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3JldHVybiBiKCJSZWFjdCIpLmNyZWF0ZUVsZW1lbnQoYigiSW1hZ2UucmVhY3QiKSx7Y2xhc3NOYW1lOiJfOV9tIixzcmM6dGhpcy5wcm9wcy5hbmltYXRlZFNyYyx3aWR0aDp0aGlzLnByb3BzLndpZHRoLGhlaWdodDp0aGlzLnByb3BzLmhlaWdodCxvbkNsaWNrOnRoaXMuJDR9KX07YS5wcm90b3R5cGUuJDE0PWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3JldHVybiF0aGlzLnN0YXRlLmlzUGxheWluZ3x8IXRoaXMuc3RhdGUuaXNMb2FkZWR8fCF0aGlzLnByb3BzLmlzUGxheWFibGVJbmxpbmU/dGhpcy4kMTIoKTp0aGlzLiQxMygpfTthLnByb3RvdHlwZS4kMTU9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7cmV0dXJuIXRoaXMucHJvcHMudmlkZW9FbGVtZW50P251bGw6YigiUmVhY3QiKS5jcmVhdGVFbGVtZW50KCJzcGFuIixudWxsLGIoIlJlYWN0IikuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZTp0aGlzLnN0YXRlLmhhc1BsYXllZEF0bGVhc3RPbmNlPyIiOiJoaWRkZW5fZWxlbSJ9LGIoIlJlYWN0IikuY3JlYXRlRWxlbWVudChiKCJET01Db250YWluZXIucmVhY3QiKSx7cmVmOiJ2aWRlb1BsYXllciJ9LHRoaXMucHJvcHMudmlkZW9FbGVtZW50KSksYigiUmVhY3QiKS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOnRoaXMuc3RhdGUuaGFzUGxheWVkQXRsZWFzdE9uY2U/ImhpZGRlbl9lbGVtIjoiIn0sdGhpcy4kMTIoKSkpfTthLnByb3RvdHlwZS4kMTY9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7aWYoIXRoaXMuc3RhdGUuaXNQbGF5aW5nKWlmKHRoaXMucHJvcHMub3ZlcmxheU5vZGUpcmV0dXJuIHRoaXMucHJvcHMub3ZlcmxheU5vZGU7ZWxzZSBpZih0aGlzLnByb3BzLm92ZXJsYXkpcmV0dXJuIGIoIlJlYWN0IikuY3JlYXRlRWxlbWVudChiKCJET01Db250YWluZXIucmVhY3QiKSxudWxsLHRoaXMucHJvcHMub3ZlcmxheSk7cmV0dXJuIG51bGx9O2EucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0Ijt0aGlzLnNldFN0YXRlKHtpc1BsYXlpbmc6ITF9KSx0aGlzLnByb3BzLnZpZGVvQ29udHJvbGxlciYmdGhpcy5wcm9wcy52aWRlb0NvbnRyb2xsZXIucGF1c2UoYSl9O2EucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT0tMSoodGhpcy5wcm9wcy5oZWlnaHQqaS8xMDApO3JldHVybiBiKCJSZWFjdCIpLmNyZWF0ZUVsZW1lbnQoYigiT25WaXNpYmxlLnJlYWN0Iikse29uVmlzaWJsZTp0aGlzLiQ2LG9uSGlkZGVuOnRoaXMuJDUsYnVmZmVyOmF9LGIoIlJlYWN0IikuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLHRoaXMuJDE1KCl8fHRoaXMuJDE0KCksdGhpcy4kOSgpLHRoaXMuJDE2KCkpKX07YS5wcm9wVHlwZXM9e2FuaW1hdGVkU3JjOmMuc3RyaW5nLGF1dG9wbGF5OmMuYm9vbCxmYmlkOmMuc3RyaW5nLGhlaWdodDpjLm51bWJlci5pc1JlcXVpcmVkLGhyZWY6Yy5zdHJpbmcsaXNQbGF5YWJsZUlubGluZTpjLmJvb2wsb3ZlcmxheTpjLm9iamVjdCxvdmVybGF5Tm9kZTpjLm5vZGUsc3RhdGljU3JjOmMuc3RyaW5nLHZpZGVvQ29udHJvbGxlcjpjLm9iamVjdCx2aWRlb0VsZW1lbnQ6Yy5vYmplY3Qsd2lkdGg6Yy5udW1iZXIuaXNSZXF1aXJlZCxkaXNhYmxlQ2xpY2tUb1BsYXlCdXR0b246Yy5ib29sfTthLmRlZmF1bHRQcm9wcz17YXV0b3BsYXk6ITEsaXNQbGF5YWJsZUlubGluZTohMX07ZS5leHBvcnRzPWF9KSxudWxsKTs="},"+4sWy":{type:"js",src:"data:application/x-javascript; charset=utf-8;base64,aWYgKHNlbGYuQ2F2YWxyeUxvZ2dlcikgeyBDYXZhbHJ5TG9nZ2VyLnN0YXJ0X2pzKFsiKzRzV3kiXSk7IH0vKioKICogQHByb3ZpZGVzTW9kdWxlIFNoYWthCiAqIEBwcmVzZXJ2ZS13aGl0ZXNwYWNlCiAqIEBub3BhY2thZ2UKICogQGdlbmVyYXRlZAogKi8KX19kKCJTaGFrYSIsWyJQcm9taXNlIiwiRXZlbnRMaXN0ZW5lciIsIlZpZGVvUGxheWVyU2hha2FQZXJmb3JtYW5jZUxvZ2dlciIsIlZpZGVvUHVzaFBhcmFtZXRlcnNIZWxwZXIiLCJUaW1lU2xpY2UiLCJWaWRlb1BsYXllckxvY2FsQmFuZHdpZHRoRXN0aW1hdG9yIiwiVmlkZW9QbGF5ZXJSZXNvdXJjZVRpbWVyIiwiU2hha2FTZWdtZW50UmVmZXJlbmNlSGVscGVyIiwiU2VnbWVudFJlcXVlc3RNYW5hZ2VyIiwiY29uY2F0QXJyYXlCdWZmZXIiLCJCdWZmZXJSZXBsYWNlbWVudEhlbHBlciIsImxvZ0xvbmdBa2FtYWlSZXF1ZXN0IiwidGhyb3R0bGUiLCJWaWV3cG9ydFByaW9yaXR5QWRqdXN0ZXIiLCJGaXJzdExvYWRlZFZpZGVvUHJpb3JpdHlBZGp1c3RlciIsIlZpZGVvUHJpb3JpdHlDYWxjdWxhdG9yIiwiVmlkZW9TdHJlYW1pbmdNYW5hZ2VyIiwiTXVsdGlwbGVTZWdtZW50c1Byb3ZpZGVyIiwiTG9jYWxCaXRyYXRlSGVscGVyIiwiVW5pdENvbnN0YW50cyIsIkJ1ZmZlclZlbG9jaXR5IiwiVmlkZW9QbGF5ZXJCaXRyYXRlRXN0aW1hdG9yIiwiVmlkZW9QbGF5ZXJTaGFrYUdsb2JhbENvbmZpZyIsImdldFNlZWtSYW5nZUdhcHNGcm9tU2hha2FSZWZlcmVuY2VzIiwibWVyZ2VTZWVrUmFuZ2VHYXBzIiwiTmV0d29ya1N0YXR1c0RldGVjdG9yIiwiTW9zVXRpbHMiLCJzZXRUaW1lb3V0QWNyb3NzVHJhbnNpdGlvbnMiLCJzZXRUaW1lb3V0Iiwic2V0SW50ZXJ2YWxBY3Jvc3NUcmFuc2l0aW9ucyIsInNldEludGVydmFsIiwic2V0SW1tZWRpYXRlQWNyb3NzVHJhbnNpdGlvbnMiLCJzZXRJbW1lZGlhdGUiLCJjbGVhclRpbWVvdXQiLCJjbGVhckludGVydmFsIiwiY2xlYXJJbW1lZGlhdGUiLCJkaXNwYXRjaEV2ZW50IiwiRXZlbnRMaXN0ZW5lciIsIkV2ZW50IiwiZXh0cmFjdENFQTYwOCIsInBlcmZvcm1hbmNlTm93IiwiY2FuVXNlRmV0Y2hTdHJlYW0iLCJTdWJzY3JpcHRpb25zSGFuZGxlciJdLChmdW5jdGlvbiAkbW9kdWxlX1NoYWthKGdsb2JhbCxyZXF1aXJlLHJlcXVpcmVEeW5hbWljLHJlcXVpcmVMYXp5LG1vZHVsZSxleHBvcnRzKXsKCi8vIHRvIHJlZ2VuZXJhdGUgdGhpcyBmaWxlLCBydW4gYGFyYyByZWJ1aWxkIHNoYWthLXBsYXllcmAKCnZhciBQcm9taXNlID0gcmVxdWlyZSgnUHJvbWlzZScpOwp2YXIgRXZlbnRMaXN0ZW5lciA9IHJlcXVpcmUoJ0V2ZW50TGlzdGVuZXInKTsKdmFyIFZpZGVvUGxheWVyU2hha2FQZXJmb3JtYW5jZUxvZ2dlciA9IHJlcXVpcmUoJ1ZpZGVvUGxheWVyU2hha2FQZXJmb3JtYW5jZUxvZ2dlcicpOwp2YXIgVmlkZW9QdXNoUGFyYW1ldGVyc0hlbHBlciA9IHJlcXVpcmUoJ1ZpZGVvUHVzaFBhcmFtZXRlcnNIZWxwZXInKTsKdmFyIFRpbWVTbGljZSA9IHJlcXVpcmUoJ1RpbWVTbGljZScpOwp2YXIgVmlkZW9QbGF5ZXJMb2NhbEJhbmR3aWR0aEVzdGltYXRvciA9IHJlcXVpcmUoJ1ZpZGVvUGxheWVyTG9jYWxCYW5kd2lkdGhFc3RpbWF0b3InKTsKdmFyIFZpZGVvUGxheWVyUmVzb3VyY2VUaW1lciA9IHJlcXVpcmUoJ1ZpZGVvUGxheWVyUmVzb3VyY2VUaW1lcicpOwp2YXIgU2hha2FTZWdtZW50UmVmZXJlbmNlSGVscGVyID0gcmVxdWlyZSgnU2hha2FTZWdtZW50UmVmZXJlbmNlSGVscGVyJyk7CnZhciBTZWdtZW50UmVxdWVzdE1hbmFnZXIgPSByZXF1aXJlKCdTZWdtZW50UmVxdWVzdE1hbmFnZXInKTsKdmFyIGNvbmNhdEFycmF5QnVmZmVyID0gcmVxdWlyZSgnY29uY2F0QXJyYXlCdWZmZXInKTsKdmFyIEJ1ZmZlclJlcGxhY2VtZW50SGVscGVyID0gcmVxdWlyZSgnQnVmZmVyUmVwbGFjZW1lbnRIZWxwZXInKTsKdmFyIGxvZ0xvbmdBa2FtYWlSZXF1ZXN0ID0gcmVxdWlyZSgnbG9nTG9uZ0FrYW1haVJlcXVlc3QnKTsKdmFyIHRocm90dGxlID0gcmVxdWlyZSgndGhyb3R0bGUnKTsKdmFyIFZpZXdwb3J0UHJpb3JpdHlBZGp1c3RlciA9IHJlcXVpcmUoJ1ZpZXdwb3J0UHJpb3JpdHlBZGp1c3RlcicpOwp2YXIgRmlyc3RMb2FkZWRWaWRlb1ByaW9yaXR5QWRqdXN0ZXIgPSByZXF1aXJlKCdGaXJzdExvYWRlZFZpZGVvUHJpb3JpdHlBZGp1c3RlcicpOwp2YXIgVmlkZW9Qcmlvcml0eUNhbGN1bGF0b3IgPSByZXF1aXJlKCdWaWRlb1ByaW9yaXR5Q2FsY3VsYXRvcicpOwp2YXIgVmlkZW9TdHJlYW1pbmdNYW5hZ2VyID0gcmVxdWlyZSgnVmlkZW9TdHJlYW1pbmdNYW5hZ2VyJyk7CnZhciBNdWx0aXBsZVNlZ21lbnRzUHJvdmlkZXIgPSByZXF1aXJlKCdNdWx0aXBsZVNlZ21lbnRzUHJvdmlkZXInKTsKdmFyIExvY2FsQml0cmF0ZUhlbHBlciA9IHJlcXVpcmUoJ0xvY2FsQml0cmF0ZUhlbHBlcicpOwp2YXIgVW5pdENvbnN0YW50cyA9IHJlcXVpcmUoJ1VuaXRDb25zdGFudHMnKTsKdmFyIEJ1ZmZlclZlbG9jaXR5ID0gcmVxdWlyZSgnQnVmZmVyVmVsb2NpdHknKTsKdmFyIFZpZGVvUGxheWVyQml0cmF0ZUVzdGltYXRvciA9IHJlcXVpcmUoJ1ZpZGVvUGxheWVyQml0cmF0ZUVzdGltYXRvcicpOwp2YXIgVmlkZW9QbGF5ZXJTaGFrYUdsb2JhbENvbmZpZyA9IHJlcXVpcmUoJ1ZpZGVvUGxheWVyU2hha2FHbG9iYWxDb25maWcnKTsKdmFyIGdldFNlZWtSYW5nZUdhcHNGcm9tU2hha2FSZWZlcmVuY2VzID0gcmVxdWlyZSgnZ2V0U2Vla1JhbmdlR2Fwc0Zyb21TaGFrYVJlZmVyZW5jZXMnKTsKdmFyIG1lcmdlU2Vla1JhbmdlR2FwcyA9IHJlcXVpcmUoJ21lcmdlU2Vla1JhbmdlR2FwcycpOwp2YXIgTmV0d29ya1N0YXR1c0RldGVjdG9yID0gcmVxdWlyZSgnTmV0d29ya1N0YXR1c0RldGVjdG9yJyk7CnZhciBNb3NVdGlscyA9IHJlcXVpcmUoJ01vc1V0aWxzJyk7Cgp2YXIgc2V0VGltZW91dCA9IFZpZGVvUGxheWVyU2hha2FHbG9iYWxDb25maWcuZ2V0Qm9vbCgKICAgICd0aW1lb3V0c19wZXJzaXN0X29uX3BhZ2VfdHJhbnNpdGlvbicsCiAgICB0cnVlCiAgKSA/CiAgcmVxdWlyZSgnc2V0VGltZW91dEFjcm9zc1RyYW5zaXRpb25zJykgOgogIHJlcXVpcmUoJ3NldFRpbWVvdXQnKTsKdmFyIHNldEludGVydmFsID0gVmlkZW9QbGF5ZXJTaGFrYUdsb2JhbENvbmZpZy5nZXRCb29sKAogICAgJ3RpbWVvdXRzX3BlcnNpc3Rfb25fcGFnZV90cmFuc2l0aW9uJywKICAgIHRydWUKICApID8KICByZXF1aXJlKCdzZXRJbnRlcnZhbEFjcm9zc1RyYW5zaXRpb25zJykgOgogIHJlcXVpcmUoJ3NldEludGVydmFsJyk7CnZhciBzZXRJbW1lZGlhdGUgPSBWaWRlb1BsYXllclNoYWthR2xvYmFsQ29uZmlnLmdldEJvb2woCiAgICAndGltZW91dHNfcGVyc2lzdF9vbl9wYWdlX3RyYW5zaXRpb24nLAogICAgdHJ1ZQogICkgPwogIHJlcXVpcmUoJ3NldEltbWVkaWF0ZUFjcm9zc1RyYW5zaXRpb25zJykgOgogIHJlcXVpcmUoJ3NldEltbWVkaWF0ZScpOwoKdmFyIGNsZWFyVGltZW91dCA9IHJlcXVpcmUoJ2NsZWFyVGltZW91dCcpOwp2YXIgY2xlYXJJbnRlcnZhbCA9IHJlcXVpcmUoJ2NsZWFySW50ZXJ2YWwnKTsKdmFyIGNsZWFySW1tZWRpYXRlID0gcmVxdWlyZSgnY2xlYXJJbW1lZGlhdGUnKTsKCnZhciBkaXNwYXRjaERvbUV2ZW50ID0gcmVxdWlyZSgnZGlzcGF0Y2hFdmVudCcpOwp2YXIgZXZlbnRMaXN0ZW5lckNhcHR1cmUgPSByZXF1aXJlKCdFdmVudExpc3RlbmVyJykuY2FwdHVyZTsKdmFyIGV2ZW50S2lsbCA9IHJlcXVpcmUoJ0V2ZW50Jykua2lsbDsKCnZhciBleHRyYWN0Q0VBNjA4ID0gcmVxdWlyZSgnZXh0cmFjdENFQTYwOCcpOwp2YXIgcGVyZm9ybWFuY2VOb3cgPSByZXF1aXJlKCdwZXJmb3JtYW5jZU5vdycpOwoKdmFyIGNhblVzZUZldGNoU3RyZWFtID0gcmVxdWlyZSgnY2FuVXNlRmV0Y2hTdHJlYW0nKTsKdmFyIFN1YnNjcmlwdGlvbnNIYW5kbGVyID0gcmVxdWlyZSgnU3Vic2NyaXB0aW9uc0hhbmRsZXInKTsKCmZ1bmN0aW9uIHNldEV2ZW50UHJvcGVydHkob2JqLCBuYW1lLCBoYW5kbGVyKSB7CiAgb2JqW25hbWVdID0gVGltZVNsaWNlLmd1YXJkKGhhbmRsZXIsICdzaGFrYSAnICsgbmFtZSk7Cn07CgppZiAoCiAgVmlkZW9QbGF5ZXJTaGFrYUdsb2JhbENvbmZpZy5nZXRCb29sKCdzaGFrYV9uYXRpdmVfcHJvbWlzZScsIGZhbHNlKSAmJgogIFZpZGVvUGxheWVyU2hha2FHbG9iYWxDb25maWcuZ2V0Qm9vbCgndXNlX25hdGl2ZV9wcm9taXNlJywgdHJ1ZSkKKSB7CiAgUHJvbWlzZSA9IHdpbmRvdy5Qcm9taXNlOwp9Cgp2YXIgZyA9IHt9OwoKKGZ1bmN0aW9uKHdpbmRvdyl7dmFyIG4sYWE9dGhpcztmdW5jdGlvbiBxKGEsYil7dmFyIGM9YS5zcGxpdCgiLiIpLGQ9YWE7Y1swXWluIGR8fCFkLmV4ZWNTY3JpcHR8fGQuZXhlY1NjcmlwdCgidmFyICIrY1swXSk7Zm9yKHZhciBlO2MubGVuZ3RoJiYoZT1jLnNoaWZ0KCkpOyljLmxlbmd0aHx8dm9pZCAwPT09Yj9kW2VdP2Q9ZFtlXTpkPWRbZV09e306ZFtlXT1ifWZ1bmN0aW9uIHIoYSxiKXtmdW5jdGlvbiBjKCl7fWMucHJvdG90eXBlPWIucHJvdG90eXBlO2EuZmQ9Yi5wcm90b3R5cGU7YS5wcm90b3R5cGU9bmV3IGM7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YTthLmRkPWZ1bmN0aW9uKGEsYyxmKXtyZXR1cm4gYi5wcm90b3R5cGVbY10uYXBwbHkoYSxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfX07LyoKCiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLgoKIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoqLwpmdW5jdGlvbiBkYSgpe307ZnVuY3Rpb24gZWEoKXt9ZnVuY3Rpb24gZmEoYSl7dmFyIGI9Y29uc29sZVthXTtiP2IuYmluZHx8KGNvbnNvbGVbYV09ZnVuY3Rpb24oKXtiLmFwcGx5KGNvbnNvbGUsYXJndW1lbnRzKX0pOmNvbnNvbGVbYV09ZnVuY3Rpb24oKXt9fWZhKCJlcnJvciIpO2ZhKCJ3YXJuIik7ZmEoImluZm8iKTtmYSgibG9nIik7ZmEoImRlYnVnIik7ZnVuY3Rpb24gZ2EoYSl7aGFbYV09e0dhOmlhKCksZW5kOk5hTn19ZnVuY3Rpb24gamEoYSl7aWYoYT1oYVthXSlhLmVuZD1pYSgpfWZ1bmN0aW9uIGthKCl7dmFyIGE9aGEuYnVmZmVyaW5nO3JldHVybiBhJiZhLmVuZD9hLmVuZC1hLkdhOk5hTn12YXIgaWE9d2luZG93LnBlcmZvcm1hbmNlJiZ3aW5kb3cucGVyZm9ybWFuY2Uubm93P3dpbmRvdy5wZXJmb3JtYW5jZS5ub3cuYmluZCh3aW5kb3cucGVyZm9ybWFuY2UpOkRhdGUubm93LGhhPXt9O2Z1bmN0aW9uIGxhKGEsYixjLGQsZSxmLGcsaCl7dGhpcy5pZD1hO3RoaXMuYmFuZHdpZHRoPWJ8fDA7dGhpcy5sYW5nPWN8fCJ1bmtub3duIjt0aGlzLnN0cmVhbUluZm9JRD1kO3RoaXMubWltZVR5cGU9ZXx8IiI7dGhpcy5jb2RlY3M9Znx8IiI7dGhpcy5jaGFubmVscz1nfHxudWxsO3RoaXMuc2FtcGxpbmdSYXRlPWh8fG51bGw7dGhpcy5hY3RpdmU9ITF9cSgic2hha2EucGxheWVyLkF1ZGlvVHJhY2suY29tcGFyZSIsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5sYW5nPGIubGFuZz8tMTphLmxhbmc+Yi5sYW5nPzE6YS5iYW5kd2lkdGg8Yi5iYW5kd2lkdGg/LTE6YS5iYW5kd2lkdGg+Yi5iYW5kd2lkdGg/MTowfSk7dmFyIG1hPVZpZGVvUGxheWVyU2hha2FHbG9iYWxDb25maWcuZ2V0TnVtYmVyKCJzaGFrYV9kZWZhdWx0X2FqYXhfcmVxdWVzdF90aW1lb3V0IiwwKSxuYT1WaWRlb1BsYXllclNoYWthR2xvYmFsQ29uZmlnLmdldE51bWJlcigic2hha2FfZGVmYXVsdF9hamF4X3JlcXVlc3RfdGltZW91dCIsMCksb2E9VmlkZW9QbGF5ZXJTaGFrYUdsb2JhbENvbmZpZy5nZXROdW1iZXIoInNoYWthX2RlZmF1bHRfYWpheF9yZXF1ZXN0X3RpbWVvdXQiLDApO2Z1bmN0aW9uIHBhKCl7dGhpcy5taW5CYW5kd2lkdGg9dGhpcy5tYXhCYW5kd2lkdGg9dGhpcy5tYXhXaWR0aD10aGlzLm1pbkhlaWdodD10aGlzLm1heEhlaWdodD1udWxsfXBhLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciBhPW5ldyBwYTthLm1heEhlaWdodD10aGlzLm1heEhlaWdodDthLm1pbkhlaWdodD10aGlzLm1pbkhlaWdodDthLm1heFdpZHRoPXRoaXMubWF4V2lkdGg7YS5tYXhCYW5kd2lkdGg9dGhpcy5tYXhCYW5kd2lkdGg7YS5taW5CYW5kd2lkdGg9dGhpcy5taW5CYW5kd2lkdGg7cmV0dXJuIGF9O2Z1bmN0aW9uIHFhKCl7dGhpcy5mb250U2l6ZT0iMTAwJSI7dGhpcy5mb250Q29sb3I9cmE7dGhpcy5mb250T3BhY2l0eT1zYTt0aGlzLmJhY2tncm91bmRDb2xvcj11YTt0aGlzLmJhY2tncm91bmRPcGFjaXR5PXNhO3RoaXMuZm9udEVkZ2U9dmF9cSgic2hha2EucGxheWVyLlRleHRTdHlsZSIscWEpOwpmdW5jdGlvbiB3YShhKXt2YXIgYj1bXTtiLnB1c2goImZvbnQtc2l6ZTogIithLmZvbnRTaXplKTtiLnB1c2goImNvbG9yOiAiK3hhKGEuZm9udENvbG9yLGEuZm9udE9wYWNpdHkpKTtiLnB1c2goImJhY2tncm91bmQtY29sb3I6ICIreGEoYS5iYWNrZ3JvdW5kQ29sb3IsYS5iYWNrZ3JvdW5kT3BhY2l0eSkpO2Zvcih2YXIgYz1bXSxkPTA7ZDxhLmZvbnRFZGdlLmxlbmd0aDsrK2Qpe3ZhciBlPWEuZm9udEVkZ2VbZF0uc2xpY2UoMyw2KTtjLnB1c2goeGEoYS5mb250RWRnZVtkXS5zbGljZSgwLDMpLGEuZm9udE9wYWNpdHkpKyIgIitlLmpvaW4oInB4ICIpKyJweCIpfWIucHVzaCgidGV4dC1zaGFkb3c6ICIrYy5qb2luKCIsIikpO3JldHVybiBiLmpvaW4oIjsgIil9ZnVuY3Rpb24geGEoYSxiKXtyZXR1cm4icmdiYSgiK2EuY29uY2F0KGIpLmpvaW4oIiwiKSsiKSJ9dmFyIHJhPVsyNTUsMjU1LDI1NV0sdWE9WzAsMCwwXTsKcWEuU3RhbmRhcmRDb2xvcnM9e1dISVRFOnJhLEJMQUNLOnVhLFJFRDpbMjU1LDAsMF0sR1JFRU46WzAsMjU1LDBdLEJMVUU6WzAsMCwyNTVdLFlFTExPVzpbMjU1LDI1NSwwXSxNQUdFTlRBOlsyNTUsMCwyNTVdLENZQU46WzAsMjU1LDI1NV19O3ZhciBzYT0xO3FhLlN0YW5kYXJkT3BhY2l0aWVzPXtPUEFRVUU6c2EsU0VNSV9ISUdIOi43NSxTRU1JX0xPVzouMjUsVFJBTlNQQVJFTlQ6MH07dmFyIHZhPVtdOwpxYS5FZGdlU3R5bGVzPXtOT05FOnZhLFJBSVNFRDpbWzM0LDM0LDM0LDEsMSwwXSxbMzQsMzQsMzQsMiwyLDBdLFszNCwzNCwzNCwzLDMsMF1dLERFUFJFU1NFRDpbWzIwNCwyMDQsMjA0LDEsMSwwXSxbMjA0LDIwNCwyMDQsMCwxLDBdLFszNCwzNCwzNCwtMSwtMSwwXSxbMzQsMzQsMzQsMCwtMSwwXV0sVU5JRk9STTpbWzM0LDM0LDM0LDAsMCw0XSxbMzQsMzQsMzQsMCwwLDRdLFszNCwzNCwzNCwwLDAsNF0sWzM0LDM0LDM0LDAsMCw0XV0sRFJPUDpbWzM0LDM0LDM0LDIsMiwzXSxbMzQsMzQsMzQsMiwyLDRdLFszNCwzNCwzNCwyLDIsNV1dfTtmdW5jdGlvbiB5YShhLGIpe3RoaXMuaWQ9YTt0aGlzLmxhbmc9Ynx8InVua25vd24iO3RoaXMuZW5hYmxlZD10aGlzLmFjdGl2ZT0hMX1xKCJzaGFrYS5wbGF5ZXIuVGV4dFRyYWNrLmNvbXBhcmUiLGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEubGFuZzxiLmxhbmc/LTE6YS5sYW5nPmIubGFuZz8xOjB9KTtmdW5jdGlvbiB6YShhLGIsYyxkLGUsZixnLGgsayxsLG0scCx2KXt0aGlzLmlkPWE7dGhpcy5iYW5kd2lkdGg9Ynx8MDt0aGlzLndpZHRoPWN8fDA7dGhpcy5oZWlnaHQ9ZHx8MDt0aGlzLnN0cmVhbUluZm9JRD1lO3RoaXMuZmJRdWFsaXR5TGFiZWw9Zjt0aGlzLmZiUXVhbGl0eUNsYXNzPWc7YT1bXTtoJiYoYT1oLnNwbGl0KCIsIikpO3RoaXMuZnJhbWVSYXRlPWt8fCIiO3RoaXMubWltZVR5cGU9bHx8IiI7dGhpcy5jb2RlY3M9bXx8IiI7dGhpcy5pc0hWUT0tMTxhLmluZGV4T2YoImh2cSIpO3RoaXMuaXNJbmxpbmVIVlE9LTE8YS5pbmRleE9mKCJodnFfd3d3X2lubGluZSIpO3RoaXMuYWN0aXZlPSExO3RoaXMucGxheWJhY2tSZXNvbHV0aW9uTW9zPXB8fG51bGw7dGhpcy5wbGF5YmFja1Jlc29sdXRpb25Nb3NDb25maWRlbmNlTGV2ZWw9dnx8bnVsbH0KZnVuY3Rpb24gQWEoYSxiKXt2YXIgYz1hLndpZHRoKmEuaGVpZ2h0LGQ9Yi53aWR0aCpiLmhlaWdodDtyZXR1cm4gYzxkPy0xOmM+ZD8xOmEuYmFuZHdpZHRoPGIuYmFuZHdpZHRoPy0xOmEuYmFuZHdpZHRoPmIuYmFuZHdpZHRoPzE6MH1xKCJzaGFrYS5wbGF5ZXIuVmlkZW9UcmFjay5jb21wYXJlIixBYSk7ZnVuY3Rpb24gQmEoYSl7Zm9yKHZhciBiPUNhLGM9W10sZD0wO2Q8YS5sZW5ndGg7KytkKXtmb3IodmFyIGU9ITEsZj0wO2Y8Yy5sZW5ndGgmJiEoZT1iP2IoYVtkXSxjW2ZdKTphW2RdPT09Y1tmXSk7KytmKTtlfHxjLnB1c2goYVtkXSl9cmV0dXJuIGN9O3ZhciBEYT0wO2Z1bmN0aW9uIEVhKGEpe3RoaXMuYj1hO3RoaXMuYz0wPT1GYTt0aGlzLmE9MH12YXIgRmE9MTtmdW5jdGlvbiBHYShhKXtyZXR1cm4gYS5hPGEuYi5ieXRlTGVuZ3RofWZ1bmN0aW9uIEhhKGEpe3ZhciBiPWEuYi5nZXRVaW50OChhLmEpO2EuYSs9MTtyZXR1cm4gYn1mdW5jdGlvbiB0KGEpe3ZhciBiPWEuYi5nZXRVaW50MzIoYS5hLGEuYyk7YS5hKz00O3JldHVybiBifWZ1bmN0aW9uIElhKGEpe3ZhciBiLGM7YS5jPyhiPWEuYi5nZXRVaW50MzIoYS5hLCEwKSxjPWEuYi5nZXRVaW50MzIoYS5hKzQsITApKTooYz1hLmIuZ2V0VWludDMyKGEuYSwhMSksYj1hLmIuZ2V0VWludDMyKGEuYSs0LCExKSk7aWYoMjA5NzE1MTxjKXRocm93IG5ldyBSYW5nZUVycm9yKCJEYXRhVmlld1JlYWRlcjogT3ZlcmZsb3cgcmVhZGluZyA2NC1iaXQgdmFsdWUuIik7YS5hKz04O3JldHVybiBjKk1hdGgucG93KDIsMzIpK2J9CmZ1bmN0aW9uIEthKGEpe2lmKGEuYSsxNj5hLmIuYnl0ZUxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGF0YVZpZXdSZWFkZXI6IFJlYWQgcGFzdCBlbmQgb2YgRGF0YVZpZXcuIik7dmFyIGI9bmV3IFVpbnQ4QXJyYXkoYS5iLmJ1ZmZlcixhLmEsMTYpO2EuYSs9MTY7cmV0dXJuIGJ9ZnVuY3Rpb24gTGEoYSxiKXtpZihhLmErYj5hLmIuYnl0ZUxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGF0YVZpZXdSZWFkZXI6IFNraXAgcGFzdCBlbmQgb2YgRGF0YVZpZXcuIik7YS5hKz1ifTtmdW5jdGlvbiBNYShhKXt0aGlzLmI9YTt0aGlzLmE9bmV3IEVhKGEpO05hfHwoTmE9W25ldyBVaW50OEFycmF5KFsyNTVdKSxuZXcgVWludDhBcnJheShbMTI3LDI1NV0pLG5ldyBVaW50OEFycmF5KFs2MywyNTUsMjU1XSksbmV3IFVpbnQ4QXJyYXkoWzMxLDI1NSwyNTUsMjU1XSksbmV3IFVpbnQ4QXJyYXkoWzE1LDI1NSwyNTUsMjU1LDI1NV0pLG5ldyBVaW50OEFycmF5KFs3LDI1NSwyNTUsMjU1LDI1NSwyNTVdKSxuZXcgVWludDhBcnJheShbMywyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0pLG5ldyBVaW50OEFycmF5KFsxLDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NV0pXSl9dmFyIE5hOwpmdW5jdGlvbiBPYShhKXt2YXIgYjtiPVBhKGEpO2lmKDc8Yi5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkVibWxQYXJzZXI6IEVCTUwgSUQgbXVzdCBiZSBhdCBtb3N0IDcgYnl0ZXMuIik7Zm9yKHZhciBjPTAsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9MjU2KmMrYltkXTtiPWM7Yz1QYShhKTthOntmb3IoZD0wO2Q8TmEubGVuZ3RoO2QrKylpZihRYShjLE5hW2RdKSl7ZD0hMDticmVhayBhfWQ9ITF9aWYoZCljPWEuYi5ieXRlTGVuZ3RoLWEuYS5hO2Vsc2V7aWYoOD09Yy5sZW5ndGgmJmNbMV0mMjI0KXRocm93IG5ldyBSYW5nZUVycm9yKCJFYm1sUGFyc2VyOiBWYXJpYWJsZSBzaXplZCBpbnRlZ2VyIHZhbHVlIG11c3QgYmUgYXQgbW9zdCA1MyBiaXRzLiIpO2Zvcih2YXIgZD1jWzBdJigxPDw4LWMubGVuZ3RoKS0xLGU9MTtlPGMubGVuZ3RoO2UrKylkPTI1NipkK2NbZV07Yz1kfWM9YS5hLmErYzw9YS5iLmJ5dGVMZW5ndGg/YzphLmIuYnl0ZUxlbmd0aC1hLmEuYTtkPW5ldyBEYXRhVmlldyhhLmIuYnVmZmVyLAphLmIuYnl0ZU9mZnNldCthLmEuYSxjKTtMYShhLmEsYyk7cmV0dXJuIG5ldyBSYShiLGQpfWZ1bmN0aW9uIFBhKGEpe3ZhciBiPUhhKGEuYSksYztmb3IoYz0xOzg+PWMmJiEoYiYxPDw4LWMpO2MrKyk7aWYoODxjKXRocm93IG5ldyBSYW5nZUVycm9yKCJFYm1sUGFyc2VyOiBWYXJpYWJsZSBzaXplZCBpbnRlZ2VyIG11c3QgZml0IHdpdGhpbiA4IGJ5dGVzLiIpO3ZhciBkPW5ldyBVaW50OEFycmF5KGMpO2RbMF09Yjtmb3IoYj0xO2I8YztiKyspZFtiXT1IYShhLmEpO3JldHVybiBkfWZ1bmN0aW9uIFJhKGEsYil7dGhpcy5pZD1hO3RoaXMuYT1ifQpmdW5jdGlvbiBTYShhKXtpZig4PGEuYS5ieXRlTGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJFYm1sRWxlbWVudDogVW5zaWduZWQgaW50ZWdlciBoYXMgdG9vIG1hbnkgYnl0ZXMuIik7aWYoOD09YS5hLmJ5dGVMZW5ndGgmJmEuYS5nZXRVaW50OCgwKSYyMjQpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkVibWxQYXJzZXI6IFVuc2lnbmVkIGludGVnZXIgbXVzdCBiZSBhdCBtb3N0IDUzIGJpdHMuIik7Zm9yKHZhciBiPTAsYz0wO2M8YS5hLmJ5dGVMZW5ndGg7YysrKXZhciBkPWEuYS5nZXRVaW50OChjKSxiPTI1NipiK2Q7cmV0dXJuIGJ9O3ZhciBUYT17Im91dHB1dC1yZXN0cmljdGVkIjoiVGhlIHJlcXVpcmVkIG91dHB1dCBwcm90ZWN0aW9uIGlzIG5vdCBhdmFpbGFibGUuIiwib3V0cHV0LW5vdC1hbGxvd2VkIjoiVGhlIHJlcXVpcmVkIG91dHB1dCBwcm90ZWN0aW9uIGlzIG5vdCBhdmFpbGFibGUuIixleHBpcmVkOiJUaGUgZGVjcnlwdGlvbiBrZXkgaGFzIGV4cGlyZWQuIiwiaW50ZXJuYWwtZXJyb3IiOiJUaGUga2V5IHN5c3RlbSBoYXMgZW5jb3VudGVyZWQgYW4gdW5zcGVjaWZpZWQgZXJyb3IuIn07ZnVuY3Rpb24gdShhKXt0aGlzLmI9TWF0aC5leHAoTWF0aC5sb2coLjUpL2EpO3RoaXMuY2I9dGhpcy5NYT10aGlzLmE9MH1xKCJzaGFrYS51dGlsLkVXTUEiLHUpO3UucHJvdG90eXBlLnNhbXBsZT1mdW5jdGlvbihhLGIpe3ZhciBjPU1hdGgucG93KHRoaXMuYixhKTt0aGlzLmE9YiooMS1jKStjKnRoaXMuYTt0aGlzLk1hKz1hO3RoaXMuY2IrPTF9O3UucHJvdG90eXBlLnNhbXBsZT11LnByb3RvdHlwZS5zYW1wbGU7dS5wcm90b3R5cGUuYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLk1hfTt1LnByb3RvdHlwZS5nZXRUb3RhbFdlaWdodD11LnByb3RvdHlwZS5jO3UucHJvdG90eXBlLmdldEVzdGltYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS8oMS1NYXRoLnBvdyh0aGlzLmIsdGhpcy5NYSkpfTt1LnByb3RvdHlwZS5nZXRFc3RpbWF0ZT11LnByb3RvdHlwZS5nZXRFc3RpbWF0ZTt1LnByb3RvdHlwZS5mPWZ1bmN0aW9uKCl7dGhpcy5jYj10aGlzLk1hPXRoaXMuYT0wfTsKdS5wcm90b3R5cGUucmVzZXQ9dS5wcm90b3R5cGUuZjt2YXIgVWE9d2luZG93LkN1c3RvbUV2ZW50OyJmdW5jdGlvbiIhPT10eXBlb2YgVWEmJihVYT1mdW5jdGlvbihhLGIpe2I9Ynx8e2J1YmJsZXM6ITEsY2FuY2VsYWJsZTohMSxkZXRhaWw6dm9pZCAwfTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKTtjLmluaXRDdXN0b21FdmVudChhLGIuYnViYmxlcyxiLmNhbmNlbGFibGUsYi5kZXRhaWwpO3JldHVybiBjfSxVYS5wcm90b3R5cGU9d2luZG93LkV2ZW50LnByb3RvdHlwZSk7ZnVuY3Rpb24geChhKXt2YXIgYj1uZXcgVWEoYS50eXBlLHtkZXRhaWw6YS5kZXRhaWwsYnViYmxlczohIWEuYnViYmxlc30pLGM7Zm9yKGMgaW4gYSljIGluIGJ8fChiW2NdPWFbY10pO3JldHVybiBifWZ1bmN0aW9uIHkoYSl7cmV0dXJuIG5ldyBVYSgiZXJyb3IiLHtkZXRhaWw6YSxidWJibGVzOiEwfSl9O2Z1bmN0aW9uIFZhKGEsYixjKXtXYShiKTtXYShjKTtyZXR1cm4gYz09Ynx8YT49WWEmJmM9PWIuc3BsaXQoIi0iKVswXXx8YT49WmEmJmMuc3BsaXQoIi0iKVswXT09Yi5zcGxpdCgiLSIpWzBdPyEwOiExfXZhciBZYT0xLFphPTI7ZnVuY3Rpb24gV2EoYSl7YT1hLnRvTG93ZXJDYXNlKCkuc3BsaXQoIi0iKTt2YXIgYj0kYVthWzBdXTtiJiYoYVswXT1iKTtyZXR1cm4gYS5qb2luKCItIil9CnZhciAkYT17YWFyOiJhYSIsYWJrOiJhYiIsYWZyOiJhZiIsYWthOiJhayIsYWxiOiJzcSIsYW1oOiJhbSIsYXJhOiJhciIsYXJnOiJhbiIsYXJtOiJoeSIsYXNtOiJhcyIsYXZhOiJhdiIsYXZlOiJhZSIsYXltOiJheSIsYXplOiJheiIsYmFrOiJiYSIsYmFtOiJibSIsYmFxOiJldSIsYmVsOiJiZSIsYmVuOiJibiIsYmloOiJiaCIsYmlzOiJiaSIsYm9kOiJibyIsYm9zOiJicyIsYnJlOiJiciIsYnVsOiJiZyIsYnVyOiJteSIsY2F0OiJjYSIsY2VzOiJjcyIsY2hhOiJjaCIsY2hlOiJjZSIsY2hpOiJ6aCIsY2h1OiJjdSIsY2h2OiJjdiIsY29yOiJrdyIsY29zOiJjbyIsY3JlOiJjciIsY3ltOiJjeSIsY3plOiJjcyIsZGFuOiJkYSIsZGV1OiJkZSIsZGl2OiJkdiIsZHV0OiJubCIsZHpvOiJkeiIsZWxsOiJlbCIsZW5nOiJlbiIsZXBvOiJlbyIsZXN0OiJldCIsZXVzOiJldSIsZXdlOiJlZSIsZmFvOiJmbyIsZmFzOiJmYSIsZmlqOiJmaiIsZmluOiJmaSIsZnJhOiJmciIsZnJlOiJmciIsCmZyeToiZnkiLGZ1bDoiZmYiLGdlbzoia2EiLGdlcjoiZGUiLGdsYToiZ2QiLGdsZToiZ2EiLGdsZzoiZ2wiLGdsdjoiZ3YiLGdyZToiZWwiLGdybjoiZ24iLGd1ajoiZ3UiLGhhdDoiaHQiLGhhdToiaGEiLGhlYjoiaGUiLGhlcjoiaHoiLGhpbjoiaGkiLGhtbzoiaG8iLGhydjoiaHIiLGh1bjoiaHUiLGh5ZToiaHkiLGlibzoiaWciLGljZToiaXMiLGlkbzoiaW8iLGlpaToiaWkiLGlrdToiaXUiLGlsZToiaWUiLGluYToiaWEiLGluZDoiaWQiLGlwazoiaWsiLGlzbDoiaXMiLGl0YToiaXQiLGphdjoianYiLGpwbjoiamEiLGthbDoia2wiLGthbjoia24iLGthczoia3MiLGthdDoia2EiLGthdToia3IiLGthejoia2siLGtobToia20iLGtpazoia2kiLGtpbjoicnciLGtpcjoia3kiLGtvbToia3YiLGtvbjoia2ciLGtvcjoia28iLGt1YToia2oiLGt1cjoia3UiLGxhbzoibG8iLGxhdDoibGEiLGxhdjoibHYiLGxpbToibGkiLGxpbjoibG4iLGxpdDoibHQiLGx0ejoibGIiLGx1YjoibHUiLApsdWc6ImxnIixtYWM6Im1rIixtYWg6Im1oIixtYWw6Im1sIixtYW86Im1pIixtYXI6Im1yIixtYXk6Im1zIixta2Q6Im1rIixtbGc6Im1nIixtbHQ6Im10Iixtb246Im1uIixtcmk6Im1pIixtc2E6Im1zIixteWE6Im15IixuYXU6Im5hIixuYXY6Im52IixuYmw6Im5yIixuZGU6Im5kIixuZG86Im5nIixuZXA6Im5lIixubGQ6Im5sIixubm86Im5uIixub2I6Im5iIixub3I6Im5vIixueWE6Im55IixvY2k6Im9jIixvamk6Im9qIixvcmk6Im9yIixvcm06Im9tIixvc3M6Im9zIixwYW46InBhIixwZXI6ImZhIixwbGk6InBpIixwb2w6InBsIixwb3I6InB0IixwdXM6InBzIixxdWU6InF1Iixyb2g6InJtIixyb246InJvIixydW06InJvIixydW46InJuIixydXM6InJ1IixzYWc6InNnIixzYW46InNhIixzaW46InNpIixzbGs6InNrIixzbG86InNrIixzbHY6InNsIixzbWU6InNlIixzbW86InNtIixzbmE6InNuIixzbmQ6InNkIixzb206InNvIixzb3Q6InN0IixzcGE6ImVzIixzcWk6InNxIiwKc3JkOiJzYyIsc3JwOiJzciIsc3N3OiJzcyIsc3VuOiJzdSIsc3dhOiJzdyIsc3dlOiJzdiIsdGFoOiJ0eSIsdGFtOiJ0YSIsdGF0OiJ0dCIsdGVsOiJ0ZSIsdGdrOiJ0ZyIsdGdsOiJ0bCIsdGhhOiJ0aCIsdGliOiJibyIsdGlyOiJ0aSIsdG9uOiJ0byIsdHNuOiJ0biIsdHNvOiJ0cyIsdHVrOiJ0ayIsdHVyOiJ0ciIsdHdpOiJ0dyIsdWlnOiJ1ZyIsdWtyOiJ1ayIsdXJkOiJ1ciIsdXpiOiJ1eiIsdmVuOiJ2ZSIsdmllOiJ2aSIsdm9sOiJ2byIsd2VsOiJjeSIsd2xuOiJ3YSIsd29sOiJ3byIseGhvOiJ4aCIseWlkOiJ5aSIseW9yOiJ5byIsemhhOiJ6YSIsemhvOiJ6aCIsenVsOiJ6dSJ9O2Z1bmN0aW9uIGFiKGEpe3JldHVybiBPYmplY3Qua2V5cyhhKS5tYXAoZnVuY3Rpb24oYil7cmV0dXJuIGFbYl19KX1mdW5jdGlvbiB6KGEsYil7cmV0dXJuIGJiKGEsYiwiYm9vbGVhbiIpfWZ1bmN0aW9uIEEoYSxiLGMpe2E9YmIoYSxiLCJudW1iZXIiKTtpZihudWxsPT1hKXJldHVybiBudWxsO2lmKGlzTmFOKGEpfHxhPT1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFl8fGE9PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJyIrYisiJyBtdXN0IGJlIGZpbml0ZS4iKTtpZihudWxsIT1jJiZhPGMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIiciK2IrIicgbXVzdCBiZSA+PSAiK2MpO3JldHVybiBhfWZ1bmN0aW9uIGNiKGEsYil7cmV0dXJuIGJiKGEsYiwic3RyaW5nIil9CmZ1bmN0aW9uIGJiKGEsYixjKXthPWFbYl07aWYobnVsbD09YSlyZXR1cm4gbnVsbDtpZih0eXBlb2YgYSE9Yyl0aHJvdyBuZXcgVHlwZUVycm9yKCInIitiKyInIG11c3QgYmUgYSAiK2MrIi4iKTtyZXR1cm4gYX1mdW5jdGlvbiBkYihhLGIsYyl7YT1hW2JdO2lmKG51bGw9PWEpcmV0dXJuIG51bGw7aWYoIShhIGluc3RhbmNlb2YgYykpdGhyb3cgbmV3IFR5cGVFcnJvcigiJyIrYisiJyBtdXN0IGJlIGFuIGluc3RhbmNlIG9mICIrYy5uYW1lKyIuIik7cmV0dXJuIGF9O2Z1bmN0aW9uIEMoKXt0aGlzLmE9e319Qy5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihhLGIpe3RoaXMuYS5oYXNPd25Qcm9wZXJ0eShhKT90aGlzLmFbYV0ucHVzaChiKTp0aGlzLmFbYV09W2JdfTtDLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oYSxiKXt0aGlzLmFbYV09Yn07Qy5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGEpe3JldHVybihhPXRoaXMuYVthXSk/YS5zbGljZSgpOm51bGx9O2Z1bmN0aW9uIGViKGEpe3ZhciBiPVtdLGM7Zm9yKGMgaW4gYS5hKWIucHVzaC5hcHBseShiLGEuYVtjXSk7cmV0dXJuIGJ9Qy5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5hW2FdO2lmKGMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDsrK2QpY1tkXT09YiYmKGMuc3BsaWNlKGQsMSksLS1kKX07ZnVuY3Rpb24gZmIoYSl7dmFyIGI9W10sYztmb3IoYyBpbiBhLmEpYi5wdXNoKGMpO3JldHVybiBifTtmdW5jdGlvbiBnYigpe3RoaXMuYT1uZXcgQ31nYi5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2hiKHRoaXMpO3RoaXMuYT1udWxsfTtmdW5jdGlvbiBEKGEsYixjLGQpe2I9bmV3IGliKGIsYyxkKTthLmEucHVzaChjLGIpfWdiLnByb3RvdHlwZS5UYT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz10aGlzLmEuZ2V0KGIpfHxbXSxkPTA7ZDxjLmxlbmd0aDsrK2Qpe3ZhciBlPWNbZF07ZS50YXJnZXQ9PWEmJihlLlRhKCksdGhpcy5hLnJlbW92ZShiLGUpKX19O2Z1bmN0aW9uIGhiKGEpe2Zvcih2YXIgYj1lYihhLmEpLGM9MDtjPGIubGVuZ3RoOysrYyliW2NdLlRhKCk7YS5hLmE9e319ZnVuY3Rpb24gaWIoYSxiLGMpe3RoaXMudGFyZ2V0PWE7dGhpcy50eXBlPWI7dGhpcy5hPWM7dGhpcy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihiLGMsITEpfQppYi5wcm90b3R5cGUuVGE9ZnVuY3Rpb24oKXt0aGlzLnRhcmdldCYmKHRoaXMudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy50eXBlLHRoaXMuYSwhMSksdGhpcy5hPXRoaXMudGFyZ2V0PW51bGwpfTtmdW5jdGlvbiBFKGEpe3RoaXMuamI9bmV3IEM7dGhpcy56YT1hfXEoInNoYWthLnV0aWwuRmFrZUV2ZW50VGFyZ2V0IixFKTtuPUUucHJvdG90eXBlO24uYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIpe3RoaXMuamIucHVzaChhLGIpfTtuLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiKXt0aGlzLmpiLnJlbW92ZShhLGIpfTsKbi5kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGEpe2EuaGFzT3duUHJvcGVydHkoInNyY0VsZW1lbnQiKXx8KGRlbGV0ZSBhLnNyY0VsZW1lbnQsT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsInNyY0VsZW1lbnQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH19KSk7aWYoYS5oYXNPd25Qcm9wZXJ0eSgidGFyZ2V0IikpYS50YXJnZXQ9dGhpcztlbHNle2RlbGV0ZSBhLnRhcmdldDt2YXIgYj10aGlzO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJ0YXJnZXQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYn0sc2V0OmZ1bmN0aW9uKGEpe2I9YX19KX1pZihhLmhhc093blByb3BlcnR5KCJjdXJyZW50VGFyZ2V0IikpYS5jdXJyZW50VGFyZ2V0PW51bGw7ZWxzZXtkZWxldGUgYS5jdXJyZW50VGFyZ2V0O3ZhciBjPW51bGw7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsImN1cnJlbnRUYXJnZXQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY30sc2V0OmZ1bmN0aW9uKGEpe2M9YX19KX1yZXR1cm4gamIodGhpcywKYSl9O24uVWI9ITE7bi5BYT1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoeCh7dHlwZToiZGVidWcvc2hha2FFdmVudCIsYnViYmxlczohMCxkZXRhaWw6e3R5cGU6YSxldmVudDpifX0pKX07ZnVuY3Rpb24gamIoYSxiKXtiLmN1cnJlbnRUYXJnZXQ9YTtmb3IodmFyIGM9YS5qYi5nZXQoYi50eXBlKXx8W10sZD0wO2Q8Yy5sZW5ndGg7KytkKXt2YXIgZT1jW2RdO3RyeXtlLmhhbmRsZUV2ZW50P2UuaGFuZGxlRXZlbnQoYik6ZS5jYWxsKGEsYil9Y2F0Y2goZil7fX1hLnphJiZiLmJ1YmJsZXMmJmpiKGEuemEsYik7cmV0dXJuIGIuZGVmYXVsdFByZXZlbnRlZH07ZnVuY3Rpb24gRihhKXtFLmNhbGwodGhpcyxudWxsKTt0aGlzLmE9e1dhOntIYTpuZXcgdShWaWRlb1BsYXllclNoYWthR2xvYmFsQ29uZmlnLmdldE51bWJlcigiZmFzdF9tb3ZpbmdfYXZlcmFnZV9oYWxmX2xpZmUiLDMpKSxiYjpuZXcgdShWaWRlb1BsYXllclNoYWthR2xvYmFsQ29uZmlnLmdldE51bWJlcigic2xvd19tb3ZpbmdfYXZlcmFnZV9oYWxmX2xpZmUiLDEwKSl9LE9hOntIYTpuZXcgdShWaWRlb1BsYXllclNoYWthR2xvYmFsQ29uZmlnLmdldE51bWJlcigiYWdncmVzc2l2ZV9mYXN0X21vdmluZ19hdmVyYWdlX2hhbGZfbGlmZSIsMUUtNCkpLGJiOm5ldyB1KFZpZGVvUGxheWVyU2hha2FHbG9iYWxDb25maWcuZ2V0TnVtYmVyKCJhZ2dyZXNzaXZlX3Nsb3dfbW92aW5nX2F2ZXJhZ2VfaGFsZl9saWZlIiw5LjIzMzUwODc5MTc3NDUpKX19O3RoaXMuaD1hfHw1RTU7dGhpcy5qPVZpZGVvUGxheWVyU2hha2FHbG9iYWxDb25maWcuZ2V0TnVtYmVyKCJtaW5fc2FtcGxlX2NvdW50IiwKMUU0KTt0aGlzLmI9MDt0aGlzLmM9W107dGhpcy5pPVZpZGVvUGxheWVyU2hha2FHbG9iYWxDb25maWcuZ2V0TnVtYmVyKCJtYXhfcmVjZW50X2JhbmR3aWR0aF9zYW1wbGVzIiwwKX1yKEYsRSk7cSgic2hha2EudXRpbC5FV01BQmFuZHdpZHRoRXN0aW1hdG9yIixGKTsKRi5wcm90b3R5cGUuc2FtcGxlPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZihWaWRlb1BsYXllclNoYWthR2xvYmFsQ29uZmlnLmdldEJvb2woImNoYW5nZV9hYnJfYXVkaW9fZXhjbHVzaW9uX2xvZ2ljIiwhMCk/IWM6NjU1MzY+YillJiZlLnNldEV2ZW50KCJ1bnNhbXBsZWQiKS5zZXRSZWFzb24oImF1ZGlvIikubG9nKCk7ZWxzZXtpZihWaWRlb1BsYXllclNoYWthR2xvYmFsQ29uZmlnLmdldEJvb2woInVzZV9yZXNvdXJjZV90aW1pbmdfZW50cnlfZm9yX2JhbmR3aWR0aCIsITApKXtpZighZCl7ZSYmZS5zZXRFdmVudCgidW5zYW1wbGVkIikuc2V0UmVhc29uKCJyZXNvdXJjZV90aW1pbmdfZW50cnlfbWlzc2luZyIpLmxvZygpO3JldHVybn1hPWQudGltZVRvTGFzdEJ5dGU7aWYoMD5hKXtlJiZlLnNldEV2ZW50KCJ1bnNhbXBsZWQiKS5zZXRSZWFzb24oInJlc291cmNlX3RpbWluZ19lbnRyeV9pbnZhbGlkIikubG9nKCk7cmV0dXJufX1hPU1hdGgubWF4KGEsNTApO2M9MUUzKlVuaXRDb25zdGFudHMuQklUU19JTl9CWVRFKgpiL2E7dmFyIGc9YS8xRTM7dGhpcy5hLk9hLkhhLnNhbXBsZShnLGMsZCk7dGhpcy5hLk9hLmJiLnNhbXBsZShnLGMsZCk7dGhpcy5hLldhLkhhLnNhbXBsZShnLGMsZCk7dGhpcy5hLldhLmJiLnNhbXBsZShnLGMsZCk7dGhpcy5kaXNwYXRjaEV2ZW50KHgoe3R5cGU6ImJhbmR3aWR0aCJ9KSk7dGhpcy5iPURhdGUubm93KCk7ZD1wYXJzZUludChhLDEwKTtpZigwPHRoaXMuaSlmb3IodGhpcy5jLnB1c2goW2IsZF0pO3RoaXMuYy5sZW5ndGg+dGhpcy5pOyl0aGlzLmMuc2hpZnQoKTtlJiZlLnNldEV2ZW50KCJzYW1wbGVkIikuc2V0Qnl0ZXMoYikuc2V0RGVsYXlNcyhkKS5sb2coKTtmJiZmLmdldEV2ZW50TG9nZ2VyKCJiYW5kd2lkdGhfc2FtcGxlZCIpLnNldExlbmd0aChiKS5zZXRDbGllbnRUaW1lQmVnaW4odGhpcy5iLWQpLnNldENsaWVudFRpbWVFbmQodGhpcy5iKS5sb2coKX19OwpGLnByb3RvdHlwZS5nZXRCYW5kd2lkdGg9ZnVuY3Rpb24oYSl7YT0iYWdncmVzc2l2ZSI9PT1hP3RoaXMuYS5PYTp0aGlzLmEuV2E7cmV0dXJuIHRoaXMuY2FuVHJ1c3RFc3RpbWF0ZSgpP01hdGgubWluKGEuSGEuZ2V0RXN0aW1hdGUoKSxhLmJiLmdldEVzdGltYXRlKCkpOnRoaXMuaH07Ri5wcm90b3R5cGUuZ2V0RmFzdE1vdmluZ0JhbmR3aWR0aD1mdW5jdGlvbihhKXthPSJhZ2dyZXNzaXZlIj09PWE/dGhpcy5hLk9hOnRoaXMuYS5XYTtyZXR1cm4gdGhpcy5jYW5UcnVzdEVzdGltYXRlKCk/YS5IYS5nZXRFc3RpbWF0ZSgpOnRoaXMuaH07Ri5wcm90b3R5cGUuZ2V0RGF0YUFnZT1mdW5jdGlvbigpe3JldHVybihEYXRlLm5vdygpLXRoaXMuYikvMUUzfTtGLnByb3RvdHlwZS5jYW5UcnVzdEVzdGltYXRlPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYS5PYS5IYTtyZXR1cm4gYi5NYT49KHZvaWQgMD09PWE/LjU6YSl8fGIuY2I+PXRoaXMuan07CkYucHJvdG90eXBlLnN1cHBvcnRzQ2FjaGluZz1mdW5jdGlvbigpe3JldHVybiExfTtGLnByb3RvdHlwZS5zZXRSZXByZXNlbnRhdGlvbklEPWZ1bmN0aW9uKCl7fTtGLnByb3RvdHlwZS5mbHVzaEFCUkV2YWx1YXRpb25TZXQ9ZnVuY3Rpb24oKXtyZXR1cm5bXX07Ri5wcm90b3R5cGUuZ2V0UmVjZW50U2FtcGxlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmN9Oy8qCgogQ29weXJpZ2h0IDIwMTUgRmFjZWJvb2sgSW5jLgoKIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoqLwpmdW5jdGlvbiBrYihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7dGhpcy5nPWF8fDA7dGhpcy5mPXZvaWQgMD09PWI/SW5maW5pdHk6Yn1yKGtiLEYpO3EoInNoYWthLnV0aWwuRVdNQUNhY2hlQmFuZHdpZHRoRXN0aW1hdG9yIixrYik7a2IucHJvdG90eXBlLnNhbXBsZT1mdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9OEUzKmIvYTtlJiZlLnNldEJ5dGVzKGIpLnNldERlbGF5TXMocGFyc2VJbnQoYSwxMCkpO2E8PXRoaXMuZyYmZz50aGlzLmY/ZSYmZS5zZXRFdmVudCgidW5zYW1wbGVkIikuc2V0UmVhc29uKCJjYWNoZWQiKS5sb2coKTpGLnByb3RvdHlwZS5zYW1wbGUuY2FsbCh0aGlzLGEsYixjLGQsZSxmKX07a2IucHJvdG90eXBlLnN1cHBvcnRzQ2FjaGluZz1mdW5jdGlvbigpe3JldHVybiBJbmZpbml0eSE9PXRoaXMuZiYmISF0aGlzLmd9O2tiLnByb3RvdHlwZS5zZXRSZXByZXNlbnRhdGlvbklEPWZ1bmN0aW9uKCl7fTsKa2IucHJvdG90eXBlLmZsdXNoQUJSRXZhbHVhdGlvblNldD1mdW5jdGlvbigpe3JldHVybltdfTtmdW5jdGlvbiBsYigpe0YuY2FsbCh0aGlzKX1yKGxiLEYpO3EoInNoYWthLnV0aWwuRVdNQVNpZ25lZFVSTEJhbmR3aWR0aEVzdGltYXRvciIsbGIpO2xiLnByb3RvdHlwZS5zdXBwb3J0c0NhY2hpbmc9ZnVuY3Rpb24oKXtyZXR1cm4hMH07ZnVuY3Rpb24gRygpe3ZhciBhLGIsYz1uZXcgUHJvbWlzZShmdW5jdGlvbihjLGUpe2E9YztiPWV9KTtjLnJlc29sdmU9YTtjLnJlamVjdD1iO2MuZGVzdHJveT1HLnByb3RvdHlwZS5kZXN0cm95O3JldHVybiBjfUcucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmNhdGNoKGZ1bmN0aW9uKCl7fSk7dmFyIGE9RXJyb3IoIkRlc3Ryb3llZCEiKTthLnR5cGU9ImRlc3Ryb3kiO3RoaXMucmVqZWN0KGEpfTtmdW5jdGlvbiBtYihhKXthLnNwbGl0KCIiKS5yZWR1Y2UoZnVuY3Rpb24oYSxjLGQpe3JldHVybiBhKyhkJiYwPT1kJTQ/IiAiK2M6Yyl9KX07ZnVuY3Rpb24gbmIoKXt0aGlzLlNhPW5ldyBHO3RoaXMuYz0hMTt0aGlzLnNhPW51bGw7dGhpcy5hPVtdO3RoaXMuYj1udWxsfWZ1bmN0aW9uIG9iKGEsYil7aWYoYS5jKXRocm93IEVycm9yKCJDYW5ub3QgYXBwZW5kIHRvIGEgcnVubmluZyB0YXNrISIpO2EuYS5wdXNoKGIpfW5iLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbigpe2lmKHRoaXMuYyl0aHJvdyBFcnJvcigiVGFzayBhbHJlYWR5IHN0YXJ0ZWQhIik7dGhpcy5jPSEwO3RoaXMuYS51bnNoaWZ0KGZ1bmN0aW9uKCl7fSk7cGIodGhpcyx2b2lkIDApfTtuYi5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKCl7dGhpcy5hLnNwbGljZSgxKX07CmZ1bmN0aW9uIHBiKGEsYil7dmFyIGM9YS5hWzBdKGIpLGQ7Yz8oZD1jWzBdLGEuYj1jWzFdKTooZD1Qcm9taXNlLnJlc29sdmUoKSxhLmI9bnVsbCk7ZC50aGVuKEgoYSxmdW5jdGlvbihhKXt0aGlzLnNhPyh0aGlzLmE9W10sdGhpcy5iPW51bGwscWIodGhpcykpOih0aGlzLmEuc2hpZnQoKSx0aGlzLmEubGVuZ3RoP3BiKHRoaXMsYSk6KHRoaXMuU2EucmVzb2x2ZShhKSx0aGlzLmI9bnVsbCkpfSkpLmNhdGNoKEgoYSxmdW5jdGlvbihhKXt0aGlzLmE9W107dGhpcy5iPW51bGw7dGhpcy5zYT9xYih0aGlzKTp0aGlzLlNhLnJlamVjdChhKX0pKX0KZnVuY3Rpb24gcWIoYSl7ZnVuY3Rpb24gYigpe3ZhciBhPUVycm9yKCJUYXNrIGFib3J0ZWQuIik7YS50eXBlPSJhYm9ydGVkIjt0aGlzLlNhLnJlamVjdChhKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYS5yZXNvbHZlKCk7dGhpcy5zYT1udWxsfS5iaW5kKHRoaXMpLDUpfWEuZj9hLmYudGhlbihmdW5jdGlvbigpe3RoaXMuZj1udWxsO2IuY2FsbCh0aGlzKX0uYmluZChhKSk6Yi5jYWxsKGEpfTtmdW5jdGlvbiBIKGEsYil7cmV0dXJuIGIuYmluZChhKX07ZnVuY3Rpb24gcmIoYSxiLGMsZCxlLGYpe01lZGlhU291cmNlLmlzVHlwZVN1cHBvcnRlZChjKTtFLmNhbGwodGhpcyxlKTtlPWIuYWRkU291cmNlQnVmZmVyKGMpO3RoaXMuZz1hO3RoaXMuQT1iO3RoaXMuYj1lO3RoaXMuSD1kO3RoaXMuQj1uZXcgZ2I7dGhpcy5GPXRoaXMubT10aGlzLlQ9bnVsbDt0aGlzLk09ITE7dGhpcy5LPXRoaXMuST10aGlzLko9MDt0aGlzLkQ9bnVsbDt0aGlzLlI9dGhpcy5DPSExO3RoaXMuVz1mO3RoaXMuYT1bXTt0aGlzLlA9MDt0aGlzLmw9dGhpcy5jPXRoaXMuZj1udWxsO3RoaXMuTz1vYTt0aGlzLm89dGhpcy5zPTA7dGhpcy52PXRoaXMuTj0hMTt0aGlzLmg9YyYmYy5jaGFyQXQoMCk7RCh0aGlzLkIsdGhpcy5iLCJ1cGRhdGVlbmQiLHRoaXMuVi5iaW5kKHRoaXMpKTt0aGlzLmcuZ2V0Qm9vbCgibGlzdGVuX2Zvcl9hc3luY19hcHBlbmRfYnVmZmVyX2Vycm9ycyIsITApJiZEKHRoaXMuQix0aGlzLmIsImVycm9yIix0aGlzLlUuYmluZCh0aGlzKSk7CnRoaXMuaj1udWxsfXIocmIsRSk7cmIucHJvdG90eXBlLnZhPWZ1bmN0aW9uKCl7cmV0dXJue1NvdXJjZUJ1ZmZlcjp0aGlzLmJ9fTtmdW5jdGlvbiBzYihhLGIsYyl7YS5VYiYmYS5BYShiLHt0eXBlOmEuaC5jaGFyQXQoMCksc2VnbWVudDpjLHNvdXJjZUJ1ZmZlcjphLmJ9KX12YXIgdGI9MS82MDtyYi5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ViKHRoaXMpLmNhdGNoKGZ1bmN0aW9uKCl7fSk7dGhpcy5jJiZ0aGlzLmMuZGVzdHJveSgpO3RoaXMuYT10aGlzLmY9dGhpcy5jPW51bGw7dGhpcy5CLmRlc3Ryb3koKTt0aGlzLkE9dGhpcy5iPXRoaXMuQj1udWxsfTtmdW5jdGlvbiB2YihhLGIpe2Zvcih2YXIgYz1hLmIuYnVmZmVyZWQsZD0wO2Q8Yy5sZW5ndGg7KytkKXt2YXIgZT1jLnN0YXJ0KGQpLXRiLGY9Yy5lbmQoZCkrdGI7aWYoYj49ZSYmYjw9ZilyZXR1cm4gYy5lbmQoZCktYn1yZXR1cm4gMH0KZnVuY3Rpb24gd2IoYSxiLGMpe2I9Yi5lbmRUaW1lP2IuZW5kVGltZS1iLnN0YXJ0VGltZToxO3ZhciBkPW5ldyB4YjtkLmI9MztkLmo9MUUzKmI7ZC5mPTFFMyphLk87ZC52PWEuVDtkLmw9YztkLlo9YS5XO2QubWltZVR5cGU9YS5oO3JldHVybiBkfQpyYi5wcm90b3R5cGUuZmV0Y2g9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoKXt2YXIgayxsPWY/InJlcGxhY2luZ19sb3dlcl9xdWFsaXR5X2J1ZmZlciI6bnVsbDtpZih0aGlzLm0pe3ZhciBtPXRoaXMuYVt0aGlzLmEubGVuZ3RoLTFdLHA9bnVsbDttJiYocD0xRTMqKGEuc3RhcnRUaW1lLW0uZW5kVGltZSkpO2s9dGhpcy5tLmdldE9wZXJhdGlvbkxvZ2dlcigiZmV0Y2giKS5zZXRSZWFzb24obCkuc2V0UmVzb3VyY2UoeWIoYS51cmwpKS5zZXRUeXBlKHpiKHRoaXMpKS5zZXRMZW5ndGgoTWF0aC5yb3VuZCgxRTMqKGEuZW5kVGltZS1hLnN0YXJ0VGltZSkpKS5zZXRTZWdtZW50U3RhcnRUaW1lKDFFMyphLnN0YXJ0VGltZSkuc2V0U2VnbWVudEVuZFRpbWUoMUUzKmEuZW5kVGltZSkuc2V0U2VnbWVudFRpbWVHYXAocCkuc3RhcnQoKX10aGlzLmo9aztpZih0aGlzLmYpe2lmKHRoaXMuZy5nZXRCb29sKCJzYm1fZW5hYmxlX2NvbmN1cnJlbnRfZmV0Y2hfcmVxdWVzdHMiLCExKSl7dmFyIHY9CltdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtyZXR1cm4gdGhpcy5mLlNhLnRoZW4oSCh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmV0Y2guYXBwbHkodGhpcyx2KX0pLGZ1bmN0aW9uKGEpe3Rocm93IGE7fSl9bT1FcnJvcigiQ2Fubm90IGZldGNoICgiK3RoaXMuaCsiKTogcHJldmlvdXMgb3BlcmF0aW9uIG5vdCBjb21wbGV0ZS4iKTt0aGlzLnM+PXRoaXMuSj8obS50eXBlPSJzdHJlYW0iLGsmJmsuc2V0RXJyb3IobSkubG9nKCksdGhpcy5zPTApOih0aGlzLnMrKyxtLnR5cGU9ImFib3J0ZWQiKTtyZXR1cm4gUHJvbWlzZS5yZWplY3QobSl9dGhpcy5mPW5ldyBuYjtjIT10aGlzLmIudGltZXN0YW1wT2Zmc2V0JiYodGhpcy5iLnRpbWVzdGFtcE9mZnNldD1jKTt2YXIgbT13Yih0aGlzLGEsZSkscD10aGlzLmcuZ2V0Qm9vbCgiZW5hYmxlX3N0cmVhbWluZ19jb2RlX3BhdGgiLCEwKSx3O3c9cD9hLnVybC5zdHJlYW0obSx0aGlzLkgsdGhpcy5tLHRoaXMuaix0aGlzLkYsemIodGhpcyksCmwsZyxoKTphLnVybC5mZXRjaChtLHRoaXMuSCx0aGlzLm0sdGhpcy5qLHRoaXMuRix6Yih0aGlzKSxsLGcpO3NiKHRoaXMsIlNlZ21lbnRGZXRjaGluZyIsYSk7dmFyIEI9SS5wcm90b3R5cGUuTmEuYmluZChhLnVybCk7dGhpcy5EJiZ0aGlzLkMmJihkPXRoaXMuRCk7dmFyIFA9MCxiYT1udWxsO2QmJih0aGlzLkQ9ZCx0aGlzLkM9ITEsb2IodGhpcy5mLGZ1bmN0aW9uKCl7cmV0dXJuW2QudGhlbihmdW5jdGlvbihhKXthLkthPlAmJihQPWEuS2EpO3JldHVybiBBYih0aGlzLGEsbnVsbCl9LmJpbmQodGhpcykpLHRoaXMuaS5iaW5kKHRoaXMpXX0uYmluZCh0aGlzKSkpO3ZhciBjYT1mdW5jdGlvbihhKXthLkthPlAmJihQPWEuS2EpO2JhPWEuYnl0ZUxlbmd0aDtlYSgodGhpcy5ILmdldEJhbmR3aWR0aCgpLzFFNikudG9GaXhlZCgyKSk7aWYodGhpcy5OKXt2YXIgYzt0aGlzLm0mJihjPXRoaXMubS5nZXRPcGVyYXRpb25Mb2dnZXIoImNlYTYwOF9leHRyYWN0aW9uIikuc3RhcnQoKSk7CmV4dHJhY3RDRUE2MDgoYSxiKS50aGVuKGZ1bmN0aW9uKGEpe2MmJmMuc2V0TGVuZ3RoKGEubGVuZ3RoKS5sb2coKTthLmxlbmd0aCYmdGhpcy5kaXNwYXRjaEV2ZW50KHgoe3R5cGU6ImNlYTYwOC1jYXB0aW9ucyIsYnViYmxlczohMCxkZXRhaWw6e2NhcHRpb25zOmF9fSkpfS5iaW5kKHRoaXMpKS5jYXRjaChmdW5jdGlvbihhKXtjb25zb2xlLmVycm9yKGEpfSl9fS5iaW5kKHRoaXMpO3A/b2IodGhpcy5mLEgodGhpcyxmdW5jdGlvbigpe3ZhciBiPW51bGwsYz1NYXRoLm1heCgwLChhLnVybC5lbmRCeXRlfHwwKS1hLnVybC5zdGFydEJ5dGUpLGQ9dGhpcy5nLmdldE51bWJlcigic3RyZWFtaW5nX2FwcGVuZF9wZXJfc2VnbWVudCIsMyksZT0wPT09ZD8wOmMvZDtyZXR1cm5bdy50aGVuKGZ1bmN0aW9uKGMpe2I9Yzt0aGlzLnY9ITE7cmV0dXJuIEJiKHRoaXMsYyxhLGUpfS5iaW5kKHRoaXMpKS50aGVuKGZ1bmN0aW9uKGEpe2I9bnVsbDtyZXR1cm4gYX0pLnRoZW4oY2EpLmNhdGNoKGZ1bmN0aW9uKGEpe3RoaXMuZy5nZXRCb29sKCJhYm9ydF9mZXRjaF9vbl9uZXRfZXJyb3IiLAohMSkmJmgmJih0aGlzLmIuYWJvcnQoKSx0aGlzLnY9ITApO3JldHVybiBQcm9taXNlLnJlamVjdChhKX0uYmluZCh0aGlzKSksZnVuY3Rpb24oKXtzYih0aGlzLCJTZWdtZW50RmFpbGVkIixhKTtiJiYoYi5jYW5jZWwoImFib3J0IiksYj1udWxsLGgmJih0aGlzLmIuYWJvcnQoKSx0aGlzLnY9ITApKTtCKCk7cmV0dXJuIHRoaXMuaSgpfS5iaW5kKHRoaXMpXX0pKTpvYih0aGlzLmYsSCh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuW3cudGhlbihmdW5jdGlvbihiKXtzYih0aGlzLCJTZWdtZW50RmV0Y2hlZCIsYSk7Y2EoYik7cmV0dXJuIEFiKHRoaXMsYixhLGwpfS5iaW5kKHRoaXMpKSxmdW5jdGlvbigpe3NiKHRoaXMsIlNlZ21lbnRGYWlsZWQiLGEpO0IoKTtyZXR1cm4gdGhpcy5pKCl9LmJpbmQodGhpcyldfSkpO3ZhciB0YT0wPT10aGlzLmIuYnVmZmVyZWQubGVuZ3RoJiYwPT10aGlzLmEubGVuZ3RoLFhhPW51bGw7b2IodGhpcy5mLGZ1bmN0aW9uKCl7aWYoMD09dGhpcy5iLmJ1ZmZlcmVkLmxlbmd0aCYmCiF0aGlzLlIpe3ZhciBiPUVycm9yKCJGYWlsZWQgdG8gYnVmZmVyIHNlZ21lbnQgKCIrdGhpcy5oKyIpLiIpO2IudHlwZT0ic3RyZWFtIjtyZXR1cm5bUHJvbWlzZS5yZWplY3QoYildfXRoaXMuYi5idWZmZXJlZC5sZW5ndGgmJnRhJiYoYj1hLnN0YXJ0VGltZSxYYT10aGlzLmIuYnVmZmVyZWQuc3RhcnQoMCktYik7aWYodGhpcy5nLmdldEJvb2woImVuYWJsZV9zZWdtZW50X3JlZmVyZW5jZV9lcHNpbG9uIiwhMSkpe3ZhciBiPVNoYWthU2VnbWVudFJlZmVyZW5jZUhlbHBlci5pbnNlcnRSZWZlcmVuY2UodGhpcy5hLGEpLGM9dGhpcy5nLmdldEJvb2woInJlbW92ZV90cmFpbGluZ19pbnNlcnRlZF9yZWZlcmVuY2VzIiwhMSk/dGhpcy5hLmxlbmd0aC1iOjA7dGhpcy5hLnNwbGljZShiLGMpfWVsc2UgYj1DYih0aGlzLmEsYS5zdGFydFRpbWUpLDA8PWI/dGhpcy5hLnNwbGljZShiKzEsMCxhKTp0aGlzLmEucHVzaChhKX0uYmluZCh0aGlzKSk7dGhpcy5zPTA7cmV0dXJuIERiKHRoaXMpLnRoZW4oZnVuY3Rpb24oKXtrJiYKay5sb2coKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtyYTpYYSxHYzpQLEc6YS5lbmRUaW1lLWEuc3RhcnRUaW1lLGZjOmJhfSl9LmJpbmQodGhpcyksZnVuY3Rpb24oYSl7ayYmay5zZXRFcnJvcihhKS5sb2coKTthPUViKGEsInRhc2siLCJBbiB1bmtub3duIHRhc2sgZXJyb3Igb2NjdXJyZWQuIik7cmV0dXJuIFByb21pc2UucmVqZWN0KGEpfS5iaW5kKHRoaXMpKX07CmZ1bmN0aW9uIEJiKGEsYixjLGQpe3ZhciBlPW5ldyBBcnJheUJ1ZmZlcigwKSxmPW5ldyBBcnJheUJ1ZmZlcigwKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIGIucmVhZCgpLnRoZW4oZnVuY3Rpb24oYSl7dmFyIGI9YS52YWx1ZTthPWEuZG9uZTtpZih0aGlzLnZ8fGEmJjA9PT1mLmJ5dGVMZW5ndGgpcmV0dXJuIGU7aWYoIWEmJiFiKXJldHVybiBnKCk7YiYmKGIgaW5zdGFuY2VvZiBVaW50OEFycmF5JiYoYj1iLmJ1ZmZlciksZj1jb25jYXRBcnJheUJ1ZmZlcihmLGIpKTtyZXR1cm4gZi5ieXRlTGVuZ3RoPj1kfHxhPyhzYih0aGlzLCJTZWdtZW50RmV0Y2hlZCIsYyksZT1jb25jYXRBcnJheUJ1ZmZlcihlLGYpLGI9ZixmPW5ldyBBcnJheUJ1ZmZlcigwKSxBYih0aGlzLGIsYykudGhlbihnKSk6ZygpfS5iaW5kKHRoaXMpKX0uYmluZChhKTtyZXR1cm4gZygpfQpmdW5jdGlvbiBGYihhKXtpZihhLmYpe3ZhciBiPUVycm9yKCJDYW5ub3QgY2xlYXIgKCIrYS5oKyIpOiBwcmV2aW91cyBvcGVyYXRpb24gbm90IGNvbXBsZXRlLiIpO2Eubz49YS5JPyhiLnR5cGU9InN0cmVhbSIsYS5vPTApOihhLm8rKyxiLnR5cGU9ImFib3J0ZWQiKTtyZXR1cm4gUHJvbWlzZS5yZWplY3QoYil9YS5mPW5ldyBuYjtvYihhLmYsZnVuY3Rpb24oKXt2YXIgYTthOmlmKDA9PXRoaXMuYi5idWZmZXJlZC5sZW5ndGgpYT1Qcm9taXNlLnJlc29sdmUoKTtlbHNle3RyeXt0aGlzLmIucmVtb3ZlKDAsdGhpcy5BLmR1cmF0aW9uKX1jYXRjaChiKXtiPUViKGIsImNsZWFyX2J1ZmZlciIsIkFuIGVycm9yIG9jY3VyZWQgd2hlbiBjbGVhcmluZyB0aGUgYnVmZmVyLiIpO2E9UHJvbWlzZS5yZWplY3QoYik7YnJlYWsgYX10aGlzLmE9W107YT10aGlzLmM9bmV3IEd9cmV0dXJuW2EsdGhpcy5pLmJpbmQodGhpcyldfS5iaW5kKGEpKTthLm89MDtyZXR1cm4gRGIoYSl9CmZ1bmN0aW9uIEdiKGEsYil7aWYoYS5mKXt2YXIgYz1FcnJvcigiQ2Fubm90IGNsZWFyQWZ0ZXIgKCIrYS5oKyIpOiBwcmV2aW91cyBvcGVyYXRpb24gbm90IGNvbXBsZXRlLiIpO2MudHlwZT0ic3RyZWFtIjtyZXR1cm4gUHJvbWlzZS5yZWplY3QoYyl9YS5mPW5ldyBuYjtvYihhLmYsZnVuY3Rpb24oKXtyZXR1cm5bSGIodGhpcyxiKSx0aGlzLmkuYmluZCh0aGlzKV19LmJpbmQoYSkpO3JldHVybiBEYihhKX1mdW5jdGlvbiBJYihhLGIpe2EuYz1uZXcgRzt2YXIgYz1iLTU7aWYoMDxjKXt0cnl7YS5iLnJlbW92ZSgwLGMpfWNhdGNoKGQpe3JldHVybiBkPUViKGQsImNsZWFyX2J1ZmZlciIsIkFuIGVycm9yIG9jY3VyZWQgd2hlbiBjbGVhcmluZyB0aGUgYnVmZmVyLiIpLFByb21pc2UucmVqZWN0KGQpfWM9Q2IoYS5hLGMpOzA8YyYmKGEuYT1hLmEuc2xpY2UoYyxhLmEubGVuZ3RoKSl9ZWxzZSBhLmMucmVzb2x2ZSgpO3JldHVybiBhLmN9CmZ1bmN0aW9uIHViKGEpe2EuZj8oYT1hLmYsYS5zYT9hPWEuc2E6YS5jPyhhLmImJihhLmY9YS5iKCkpLGEuc2E9bmV3IEcsYT1hLnNhKTooYS5jPSEwLGE9UHJvbWlzZS5yZXNvbHZlKCkpKTphPVByb21pc2UucmVzb2x2ZSgpO3JldHVybiBhfWZ1bmN0aW9uIEpiKGEpe2Zvcih2YXIgYj1hLmN1cnJlbnRUaW1lLGM9YixkPTA7ZDxhLmJ1ZmZlcmVkLmxlbmd0aDtkKyspaWYoYjw9YS5idWZmZXJlZC5zdGFydChkKSl7Yz1hLmJ1ZmZlcmVkLnN0YXJ0KGQpO2JyZWFrfXJldHVybiBjfWZ1bmN0aW9uIEtiKGEsYil7Zm9yKHZhciBjPWIuY3VycmVudFRpbWUsZD0wO2Q8Yi5idWZmZXJlZC5sZW5ndGg7ZCsrKWlmKGM+PWIuYnVmZmVyZWQuc3RhcnQoZCkmJmM8PWIuYnVmZmVyZWQuZW5kKGQpLWEuSylyZXR1cm4hMTtyZXR1cm4hMH0KZnVuY3Rpb24gRGIoYSl7YS5mLnN0YXJ0KCk7cmV0dXJuIGEuZi5TYS50aGVuKEgoYSxmdW5jdGlvbigpe3RoaXMuZj1udWxsfSkpLmNhdGNoKEgoYSxmdW5jdGlvbihhKXt0aGlzLmY9bnVsbDthPUViKGEsInRhc2siLCJBbiB1bmtub3duIHRhc2sgZXJyb3Igb2NjdXJyZWQuIik7cmV0dXJuIFByb21pc2UucmVqZWN0KGEpfSkpfQpmdW5jdGlvbiBBYihhLGIsYyxkKXt2YXIgZTtpZihhLm0pe3ZhciBmPWM/eWIoYy51cmwpOiJpbml0IjtlPWEubS5nZXRPcGVyYXRpb25Mb2dnZXIoImFwcGVuZCIpLnNldFJlYXNvbihkKS5zZXRSZXNvdXJjZShmKS5zZXRUeXBlKHpiKGEpKS5zZXRMZW5ndGgoYi5ieXRlTGVuZ3RoKS5zdGFydCgpO251bGwhPT1jJiYoZT1lLnNldFNlZ21lbnRTdGFydFRpbWUoMUUzKmMuc3RhcnRUaW1lKS5zZXRTZWdtZW50RW5kVGltZSgxRTMqYy5lbmRUaW1lKSk7YS5qJiYoZT1lLnNldFBhcmVudExvZ2dlcihhLmopKX10cnl7YS5iLmFwcGVuZEJ1ZmZlcihiKX1jYXRjaChnKXtyZXR1cm4gYS5nLmdldEJvb2woIm51a2Vfc291cmNlX2J1ZmZlcl9vbl9xdW90YV9leGNlZWRlZF9lcnIiLCEwKSYmZyBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiYmZy5jb2RlPT09RE9NRXhjZXB0aW9uLlFVT1RBX0VYQ0VFREVEX0VSUiYmZy5tZXNzYWdlLm1hdGNoKC9eLipTb3VyY2VCdWZmZXIuKmZ1bGwuKmZyZWVcc3NwYWNlLiokLykmJgooZy50eXBlPSJzb3VyY2VidWZmZXJfZnVsbCIpLGUmJmUuc2V0RXJyb3IoZykubG9nKCksUHJvbWlzZS5yZWplY3QoZyl9YS5jPW5ldyBHO2EubD1jO3JldHVybiBhLmMudGhlbihmdW5jdGlvbigpe2UmJmUubG9nKCl9LGZ1bmN0aW9uKGEpe2UmJmUuc2V0RXJyb3IoYSkubG9nKCk7cmV0dXJuIFByb21pc2UucmVqZWN0KGEpfSl9cmIucHJvdG90eXBlLlU9ZnVuY3Rpb24oYSl7YT1hLmVycm9yfHxFcnJvcigiQ2FsbCB0byBhcHBlbmRCdWZmZXIgZmFpbGVkIHRvIGFwcGVuZCB0aGUgc2VnbWVudC4iKTthPUViKGEsInN0cmVhbSIsIkNhbGwgdG8gYXBwZW5kQnVmZmVyIGZhaWxlZCB0byBhcHBlbmQgdGhlIHNlZ21lbnQuIik7dGhpcy5jJiZ0aGlzLmMucmVqZWN0KGEpfTsKZnVuY3Rpb24gSGIoYSxiKXtpZigwPT1hLmIuYnVmZmVyZWQubGVuZ3RoKXJldHVybiBQcm9taXNlLnJlc29sdmUoKTt2YXIgYz1DYihhLmEsYik7aWYoLTE9PWN8fGM9PWEuYS5sZW5ndGgtMSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7dHJ5e2EuYi5yZW1vdmUoYS5hW2MrMV0uc3RhcnRUaW1lLGEuQS5kdXJhdGlvbil9Y2F0Y2goZCl7cmV0dXJuIFByb21pc2UucmVqZWN0KGQpfWEuYT1hLmEuc2xpY2UoMCxjKzEpO2EuYz1uZXcgRztyZXR1cm4gYS5jfXJiLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7aWYodGhpcy5jKXtpZigib3BlbiI9PXRoaXMuQS5yZWFkeVN0YXRlKXt2YXIgYT1FcnJvcigiUHJldmlvdXMgb3BlcmF0aW9uIGFib3J0ZWQuIik7YS50eXBlPSJhYm9ydGVkIjt0aGlzLmMucmVqZWN0KGEpO3RoaXMuYi5hYm9ydCgpO3RoaXMuTSYmKHRoaXMuQz0hMCk7dGhpcy5jPW5ldyBHfXJldHVybiB0aGlzLmN9cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpfTsKcmIucHJvdG90eXBlLlY9ZnVuY3Rpb24oKXt0aGlzLmMmJih0aGlzLmwmJihzYih0aGlzLCJTZWdtZW50QXBwZW5kZWQiLHRoaXMubCksdGhpcy5sPW51bGwpLHRoaXMuYy5yZXNvbHZlKCksdGhpcy5jPW51bGwpfTtmdW5jdGlvbiB6YihhKXtyZXR1cm4idiI9PT1hLmguY2hhckF0KDApPyJ2aWRlbyI6ImEiPT09YS5oLmNoYXJBdCgwKT8iYXVkaW8iOm51bGx9ZnVuY3Rpb24gRWIoYSxiLGMpe2F8fChhPUVycm9yKGMpKTthLnR5cGV8fChhLnR5cGU9Yik7YS5tZXNzYWdlfHwoYS5tZXNzYWdlPWMpO3JldHVybiBhfTtmdW5jdGlvbiBMYihhKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGEpfXEoInNoYWthLnV0aWwuVWludDhBcnJheVV0aWxzLnRvU3RyaW5nIixMYik7ZnVuY3Rpb24gTWIoYSl7Zm9yKHZhciBiPW5ldyBVaW50OEFycmF5KGEubGVuZ3RoKSxjPTA7YzxhLmxlbmd0aDsrK2MpYltjXT1hLmNoYXJDb2RlQXQoYyk7cmV0dXJuIGJ9cSgic2hha2EudXRpbC5VaW50OEFycmF5VXRpbHMuZnJvbVN0cmluZyIsTWIpO3EoInNoYWthLnV0aWwuVWludDhBcnJheVV0aWxzLnRvQmFzZTY0IixmdW5jdGlvbihhLGIpe3ZhciBjPXZvaWQgMD09Yj8hMDpiLGQ9d2luZG93LmJ0b2EoTGIoYSkpLnJlcGxhY2UoL1wrL2csIi0iKS5yZXBsYWNlKC9cLy9nLCJfIik7cmV0dXJuIGM/ZDpkLnJlcGxhY2UoLz0qJC8sIiIpfSk7ZnVuY3Rpb24gTmIoYSl7cmV0dXJuIE1iKHdpbmRvdy5hdG9iKGEucmVwbGFjZSgvLS9nLCIrIikucmVwbGFjZSgvXy9nLCIvIikpKX0KcSgic2hha2EudXRpbC5VaW50OEFycmF5VXRpbHMuZnJvbUJhc2U2NCIsTmIpO3EoInNoYWthLnV0aWwuVWludDhBcnJheVV0aWxzLmZyb21IZXgiLGZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1uZXcgVWludDhBcnJheShhLmxlbmd0aC8yKSxjPTA7YzxhLmxlbmd0aDtjKz0yKWJbYy8yXT13aW5kb3cucGFyc2VJbnQoYS5zdWJzdHIoYywyKSwxNik7cmV0dXJuIGJ9KTtmdW5jdGlvbiBPYihhKXtmb3IodmFyIGI9IiIsYz0wO2M8YS5sZW5ndGg7KytjKXt2YXIgZD1hW2NdLnRvU3RyaW5nKDE2KTsxPT1kLmxlbmd0aCYmKGQ9IjAiK2QpO2IrPWR9cmV0dXJuIGJ9cSgic2hha2EudXRpbC5VaW50OEFycmF5VXRpbHMudG9IZXgiLE9iKTtmdW5jdGlvbiBRYShhLGIpe2lmKCFhJiYhYilyZXR1cm4hMDtpZighYXx8IWJ8fGEubGVuZ3RoIT1iLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoOysrYylpZihhW2NdIT1iW2NdKXJldHVybiExO3JldHVybiEwfTtmdW5jdGlvbiBQYigpe3RoaXMuaD10aGlzLmE9IiI7dGhpcy5sPSExO3RoaXMucz10aGlzLm89bnVsbDt0aGlzLmk9dGhpcy5nPSExO3RoaXMuaj10aGlzLmY9IiI7dGhpcy5jPW51bGw7dGhpcy5iPVtdfWZ1bmN0aW9uIFFiKGEsYil7dmFyIGM9bmV3IFBiO2MuYT1hLmE7Yy5oPWEuaDtjLmw9YS5sO2Mubz1hLm87Yy5zPWEucztjLmc9YS5nO2MuaT1hLmk7Yy5mPWEuZjtjLmo9YS5qO2MuYz1hLmM/bmV3IFVpbnQ4QXJyYXkoYS5jLmJ1ZmZlcik6bnVsbDtSYihjLGEuYik7UmIoYyxiLmIpO3JldHVybiBjfWZ1bmN0aW9uIFJiKGEsYil7dmFyIGM9YS5iLmNvbmNhdChiLm1hcChmdW5jdGlvbihhKXtyZXR1cm57aW5pdERhdGE6bmV3IFVpbnQ4QXJyYXkoYS5pbml0RGF0YS5idWZmZXIpLGluaXREYXRhVHlwZTphLmluaXREYXRhVHlwZX19KSk7YS5iPUJhKGMpfQpmdW5jdGlvbiBDYShhLGIpe3JldHVybiBhLmluaXREYXRhVHlwZT09Yi5pbml0RGF0YVR5cGUmJlFhKGEuaW5pdERhdGEsYi5pbml0RGF0YSl9O2Z1bmN0aW9uIFNiKGEsYixjLGQpe3RoaXMuYT1bXTtkJiZ0aGlzLmEucHVzaChkKX1xKCJzaGFrYS5wbGF5ZXIuRHJtU2NoZW1lSW5mbyIsU2IpO1NiLkRpc3RpbmN0aXZlSWRlbnRpZmllcj17T1BUSU9OQUw6MCxSRVFVSVJFRDoxfTtTYi5QZXJzaXN0ZW50U3RhdGU9e09QVElPTkFMOjAsUkVRVUlSRUQ6MX07U2IuY3JlYXRlVW5lbmNyeXB0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNiKDAsMCwwLG51bGwpfTtmdW5jdGlvbiBUYihhKXt0aGlzLnN5c3RlbUlkcz1bXTt0aGlzLmNlbmNLZXlJZHM9W107dGhpcy5hPVtdO2E9bmV3IEVhKG5ldyBEYXRhVmlldyhhLmJ1ZmZlcikpO3RyeXtmb3IoO0dhKGEpOyl7dmFyIGI9YS5hLGM9dChhKSxkPXQoYSk7MT09Yz9jPUlhKGEpOjA9PWMmJihjPWEuYi5ieXRlTGVuZ3RoLWIpO2lmKDE4ODY2MTQzNzYhPWQpTGEoYSxjLShhLmEtYikpO2Vsc2V7dmFyIGU9SGEoYSk7aWYoMTxlKUxhKGEsYy0oYS5hLWIpKTtlbHNle0xhKGEsMyk7dmFyIGY9T2IoS2EoYSkpLGc9W107aWYoMDxlKWZvcih2YXIgaD10KGEpLGs9MDtrPGg7KytrKXt2YXIgbD1PYihLYShhKSk7Zy5wdXNoKGwpfXZhciBtPXQoYSk7TGEoYSxtKTt0aGlzLmNlbmNLZXlJZHMucHVzaC5hcHBseSh0aGlzLmNlbmNLZXlJZHMsZyk7dGhpcy5zeXN0ZW1JZHMucHVzaChmKTt0aGlzLmEucHVzaCh7c3RhcnQ6YixlbmQ6YS5hLTF9KTthLmEhPWIrYyYmTGEoYSxjLShhLmEtYikpfX19fWNhdGNoKHApe319Cjt2YXIgVWI9L14oPzooW146Lz8jLl0rKTopPyg/OlwvXC8oPzooW14vPyNdKilAKT8oW14vIz9dKj8pKD86OihbMC05XSspKT8oPz1bLyM/XXwkKSk/KFtePyNdKyk/KD86XD8oW14jXSopKT8oPzojKC4qKSk/JC87ZnVuY3Rpb24gSihhKXt2YXIgYjthIGluc3RhbmNlb2YgSj8oVmIodGhpcyxhLnFhKSx0aGlzLkZhPWEuRmEsdGhpcy5lYT1hLmVhLFdiKHRoaXMsYS5KYSksdGhpcy5mYT1hLmZhLFhiKHRoaXMsYS5hLmNsb25lKCkpLHRoaXMuQmE9YS5CYSk6YSYmKGI9U3RyaW5nKGEpLm1hdGNoKFViKSk/KFZiKHRoaXMsYlsxXXx8IiIsITApLHRoaXMuRmE9WWIoYlsyXXx8IiIpLHRoaXMuZWE9WWIoYlszXXx8IiIsITApLFdiKHRoaXMsYls0XSksdGhpcy5mYT1ZYihiWzVdfHwiIiwhMCksWGIodGhpcyxiWzZdfHwiIiwhMCksdGhpcy5CYT1ZYihiWzddfHwiIikpOnRoaXMuYT1uZXcgWmIobnVsbCl9bj1KLnByb3RvdHlwZTtuLnFhPSIiO24uRmE9IiI7bi5lYT0iIjtuLkphPW51bGw7bi5mYT0iIjtuLkJhPSIiOwpuLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGE9W10sYj10aGlzLnFhO2ImJmEucHVzaCgkYihiLGFjLCEwKSwiOiIpO2lmKGI9dGhpcy5lYSl7YS5wdXNoKCIvLyIpO3ZhciBjPXRoaXMuRmE7YyYmYS5wdXNoKCRiKGMsYWMsITApLCJAIik7YS5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChiKS5yZXBsYWNlKC8lMjUoWzAtOWEtZkEtRl17Mn0pL2csIiUkMSIpKTtiPXRoaXMuSmE7bnVsbCE9YiYmYS5wdXNoKCI6IixTdHJpbmcoYikpfWlmKGI9dGhpcy5mYSl0aGlzLmVhJiYiLyIhPWIuY2hhckF0KDApJiZhLnB1c2goIi8iKSxhLnB1c2goJGIoYiwiLyI9PWIuY2hhckF0KDApP2JjOmNjLCEwKSk7KGI9dGhpcy5hLnRvU3RyaW5nKCkpJiZhLnB1c2goIj8iLGIpOyhiPXRoaXMuQmEpJiZhLnB1c2goIiMiLCRiKGIsZGMpKTtyZXR1cm4gYS5qb2luKCIiKX07Cm4ucmVzb2x2ZT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmNsb25lKCk7ImRhdGEiPT09Yi5xYSYmKGI9bmV3IEopO3ZhciBjPSEhYS5xYTtjP1ZiKGIsYS5xYSk6Yz0hIWEuRmE7Yz9iLkZhPWEuRmE6Yz0hIWEuZWE7Yz9iLmVhPWEuZWE6Yz1udWxsIT1hLkphO3ZhciBkPWEuZmE7aWYoYylXYihiLGEuSmEpO2Vsc2UgaWYoYz0hIWEuZmEpe2lmKCIvIiE9ZC5jaGFyQXQoMCkpaWYodGhpcy5lYSYmIXRoaXMuZmEpZD0iLyIrZDtlbHNle3ZhciBlPWIuZmEubGFzdEluZGV4T2YoIi8iKTstMSE9ZSYmKGQ9Yi5mYS5zdWJzdHIoMCxlKzEpK2QpfWlmKCIuLiI9PWR8fCIuIj09ZClkPSIiO2Vsc2UgaWYoLTEhPWQuaW5kZXhPZigiLi8iKXx8LTEhPWQuaW5kZXhPZigiLy4iKSl7Zm9yKHZhciBlPTA9PWQubGFzdEluZGV4T2YoIi8iLDApLGQ9ZC5zcGxpdCgiLyIpLGY9W10sZz0wO2c8ZC5sZW5ndGg7KXt2YXIgaD1kW2crK107Ii4iPT1oP2UmJmc9PWQubGVuZ3RoJiZmLnB1c2goIiIpOiIuLiI9PQpoPygoMTxmLmxlbmd0aHx8MT09Zi5sZW5ndGgmJiIiIT1mWzBdKSYmZi5wb3AoKSxlJiZnPT1kLmxlbmd0aCYmZi5wdXNoKCIiKSk6KGYucHVzaChoKSxlPSEwKX1kPWYuam9pbigiLyIpfX1jP2IuZmE9ZDpjPSIiIT09YS5hLnRvU3RyaW5nKCk7Yz9YYihiLGEuYS5jbG9uZSgpKTpjPSEhYS5CYTtjJiYoYi5CYT1hLkJhKTtyZXR1cm4gYn07bi5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgSih0aGlzKX07ZnVuY3Rpb24gVmIoYSxiLGMpe2EucWE9Yz9ZYihiLCEwKTpiO2EucWEmJihhLnFhPWEucWEucmVwbGFjZSgvOiQvLCIiKSl9ZnVuY3Rpb24gV2IoYSxiKXtpZihiKXtiPU51bWJlcihiKTtpZihpc05hTihiKXx8MD5iKXRocm93IEVycm9yKCJCYWQgcG9ydCBudW1iZXIgIitiKTthLkphPWJ9ZWxzZSBhLkphPW51bGx9ZnVuY3Rpb24gWGIoYSxiLGMpe2IgaW5zdGFuY2VvZiBaYj9hLmE9YjooY3x8KGI9JGIoYixlYykpLGEuYT1uZXcgWmIoYikpfQpmdW5jdGlvbiBZYihhLGIpe3JldHVybiBhP2I/ZGVjb2RlVVJJKGEpOmRlY29kZVVSSUNvbXBvbmVudChhKToiIn1mdW5jdGlvbiAkYihhLGIsYyl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBhPyhhPWVuY29kZVVSSShhKS5yZXBsYWNlKGIsZmMpLGMmJihhPWEucmVwbGFjZSgvJTI1KFswLTlhLWZBLUZdezJ9KS9nLCIlJDEiKSksYSk6bnVsbH1mdW5jdGlvbiBmYyhhKXthPWEuY2hhckNvZGVBdCgwKTtyZXR1cm4iJSIrKGE+PjQmMTUpLnRvU3RyaW5nKDE2KSsoYSYxNSkudG9TdHJpbmcoMTYpfXZhciBhYz0vWyNcL1w/QF0vZyxjYz0vW1wjXD86XS9nLGJjPS9bXCNcP10vZyxlYz0vW1wjXD9AXS9nLGRjPS8jL2c7ZnVuY3Rpb24gWmIoYSl7dGhpcy5iPWF8fG51bGx9WmIucHJvdG90eXBlLmE9bnVsbDtaYi5wcm90b3R5cGUuYz1udWxsOwpmdW5jdGlvbiBnYyhhLGIsYyl7aWYoIWEuYSYmKGEuYT17fSxhLmM9MCxhLmIpKWZvcih2YXIgZD1hLmIuc3BsaXQoIiYiKSxlPTA7ZTxkLmxlbmd0aDtlKyspe3ZhciBmPWRbZV0uaW5kZXhPZigiPSIpLGc9bnVsbCxoPW51bGw7MDw9Zj8oZz1kW2VdLnN1YnN0cmluZygwLGYpLGg9ZFtlXS5zdWJzdHJpbmcoZisxKSk6Zz1kW2VdO2c9ZGVjb2RlVVJJQ29tcG9uZW50KGcucmVwbGFjZSgvXCsvZywiICIpKTtoPWh8fCIiO2djKGEsZyxkZWNvZGVVUklDb21wb25lbnQoaC5yZXBsYWNlKC9cKy9nLCIgIikpKX1hLmI9bnVsbDsoZD1hLmEuaGFzT3duUHJvcGVydHkoYikmJmEuYVtiXSl8fChhLmFbYl09ZD1bXSk7ZC5wdXNoKGMpO2EuYysrfQpaYi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtpZih0aGlzLmIpcmV0dXJuIHRoaXMuYjtpZighdGhpcy5hKXJldHVybiIiO3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5hKWZvcih2YXIgYz1lbmNvZGVVUklDb21wb25lbnQoYiksZD10aGlzLmFbYl0sZT0wO2U8ZC5sZW5ndGg7ZSsrKXt2YXIgZj1jOyIiIT09ZFtlXSYmKGYrPSI9IitlbmNvZGVVUklDb21wb25lbnQoZFtlXSkpO2EucHVzaChmKX1yZXR1cm4gdGhpcy5iPWEuam9pbigiJiIpfTtaYi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgWmI7YS5iPXRoaXMuYjtpZih0aGlzLmEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gdGhpcy5hKWJbY109dGhpcy5hW2NdLmNvbmNhdCgpO2EuYT1iO2EuYz10aGlzLmN9cmV0dXJuIGF9O2Z1bmN0aW9uIGhjKGEsYixjKXt2YXIgZD1hLmluZGV4T2YoIjw/eG1sIik7MDw9ZCYmKGE9YS5zdWJzdHIoZCkpO2E9KG5ldyBET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpO2lmKCFhKXJldHVybiBudWxsOyJzdHJpbmciPT09dHlwZW9mIGImJihiPVtuZXcgSihiKV0pO2I9Ynx8W25ldyBKKCIiKV07Yz1jfHxbbmV3IEooIiIpXTtyZXR1cm4gSyh7ZGM6YixiYXNlVXJsOmN9LGEsaWMpfXEoInNoYWthLmRhc2gubXBkLnBhcnNlTXBkIixoYyk7ZnVuY3Rpb24gaWMoKXt0aGlzLmlkPXRoaXMudXJsPW51bGw7dGhpcy50eXBlPSJzdGF0aWMiO3RoaXMuRkJJc0xpdmVUZW1wbGF0ZWQ9dGhpcy5GQldhc0xpdmU9ITE7dGhpcy5iPXRoaXMuaj10aGlzLmJhc2VVcmw9dGhpcy5kYz1udWxsO3RoaXMuaD01O3RoaXMuZj10aGlzLmM9dGhpcy5nPW51bGw7dGhpcy5pPTE7dGhpcy5hPVtdfQpmdW5jdGlvbiBqYygpe3RoaXMuZj10aGlzLmM9dGhpcy5iPXRoaXMuYmFzZVVybD10aGlzLmR1cmF0aW9uPXRoaXMuc3RhcnQ9dGhpcy5pZD1udWxsO3RoaXMuYT1bXX1mdW5jdGlvbiBrYygpe3RoaXMuYz10aGlzLmNvZGVjcz10aGlzLm1pbWVUeXBlPXRoaXMuaGVpZ2h0PXRoaXMud2lkdGg9dGhpcy5jb250ZW50VHlwZT10aGlzLmxhbmc9dGhpcy5ncm91cD10aGlzLmlkPW51bGw7dGhpcy5mPSExO3RoaXMuaT10aGlzLmg9dGhpcy5nPXRoaXMuYmFzZVVybD1udWxsO3RoaXMuaj1bXTt0aGlzLmE9W107dGhpcy5iPW51bGx9ZnVuY3Rpb24gbGMoKXt0aGlzLnZhbHVlPW51bGx9ZnVuY3Rpb24gbWMoKXt0aGlzLmxhbmc9dGhpcy5hPW51bGx9ZnVuY3Rpb24gbmMoKXt0aGlzLmNvbnRlbnRUeXBlPXRoaXMubGFuZz10aGlzLmlkPW51bGx9ZnVuY3Rpb24gb2MoKXt0aGlzLmRhdGE9bnVsbH1mdW5jdGlvbiBwYygpe3RoaXMuZGF0YT1udWxsfQpmdW5jdGlvbiBxYygpe3RoaXMuYT10aGlzLmI9dGhpcy5mPXRoaXMuaT10aGlzLmJhc2VVcmw9dGhpcy5qPXRoaXMuZnJhbWVSYXRlPXRoaXMucz10aGlzLm89dGhpcy5sPXRoaXMuZmJRdWFsaXR5Q2xhc3M9dGhpcy5mYlF1YWxpdHlMYWJlbD10aGlzLmg9dGhpcy5nPXRoaXMuY29kZWNzPXRoaXMubWltZVR5cGU9dGhpcy5oZWlnaHQ9dGhpcy53aWR0aD10aGlzLmJhbmR3aWR0aD10aGlzLmxhbmc9dGhpcy5pZD1udWxsO3RoaXMuYz1bXX1mdW5jdGlvbiByYygpe3RoaXMudmFsdWU9dGhpcy5hPW51bGx9cmMucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGE9bmV3IHJjO2EuYT10aGlzLmE7YS52YWx1ZT10aGlzLnZhbHVlO3JldHVybiBhfTtyYy5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oYSxiKXt0aGlzLmE9TChiLCJzY2hlbWVJZFVyaSIsTSx0aGlzLmEpO3RoaXMudmFsdWU9TChiLCJ2YWx1ZSIsTSx0aGlzLnZhbHVlKX07CmZ1bmN0aW9uIHNjKCl7dGhpcy5iPXRoaXMuYT10aGlzLmY9dGhpcy5jPW51bGx9ZnVuY3Rpb24gdGMoKXt0aGlzLnBhcnNlZFBzc2g9dGhpcy5wc3NoQm94PW51bGx9ZnVuY3Rpb24gdWMoKXt0aGlzLnVybD1udWxsfWZ1bmN0aW9uIHZjKCl7dGhpcy51cmw9bnVsbH1mdW5jdGlvbiB3Yygpe3RoaXMuYmFzZVVybD1udWxsO3RoaXMuYj0xO3RoaXMuZj10aGlzLmM9dGhpcy5nPXRoaXMuYT10aGlzLmg9bnVsbH13Yy5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgd2M7YS5iYXNlVXJsPXhjKHRoaXMuYmFzZVVybCk7YS5iPXRoaXMuYjthLmg9dGhpcy5oO2EuYT1OKHRoaXMuYSk7YS5nPU4odGhpcy5nKTthLmM9Tih0aGlzLmMpO2EuZj1OKHRoaXMuZik7cmV0dXJuIGF9O2Z1bmN0aW9uIHljKCl7dGhpcy5hPXRoaXMudXJsPW51bGx9CnljLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciBhPW5ldyB5YzthLnVybD14Yyh0aGlzLnVybCk7YS5hPU4odGhpcy5hKTtyZXR1cm4gYX07ZnVuY3Rpb24gemMoKXt0aGlzLmE9dGhpcy51cmw9bnVsbH16Yy5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgemM7YS51cmw9eGModGhpcy51cmwpO2EuYT1OKHRoaXMuYSk7cmV0dXJuIGF9O2Z1bmN0aW9uIEFjKCl7dGhpcy5iYXNlVXJsPW51bGw7dGhpcy5iPTE7dGhpcy5HPXRoaXMuZj1udWxsO3RoaXMuaD0wO3RoaXMuZz1udWxsO3RoaXMuYz1bXTt0aGlzLmE9bnVsbH1BYy5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgQWM7YS5iYXNlVXJsPXhjKHRoaXMuYmFzZVVybCk7YS5iPXRoaXMuYjthLmY9dGhpcy5mO2EuRz10aGlzLkc7YS5oPXRoaXMuaDthLmc9Tih0aGlzLmcpO2EuYz14Yyh0aGlzLmMpfHxbXTthLmE9Tih0aGlzLmEpO3JldHVybiBhfTsKZnVuY3Rpb24gQ2MoKXt0aGlzLmE9dGhpcy5iPW51bGx9Q2MucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGE9bmV3IENjO2EuYj14Yyh0aGlzLmIpO2EuYT1OKHRoaXMuYSk7cmV0dXJuIGF9O2Z1bmN0aW9uIERjKCl7dGhpcy5iPTE7dGhpcy5HPXRoaXMuaD1udWxsO3RoaXMuaT0wO3RoaXMuYT10aGlzLmY9dGhpcy5jPXRoaXMuZz1udWxsfURjLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciBhPW5ldyBEYzthLmI9dGhpcy5iO2EuaD10aGlzLmg7YS5HPXRoaXMuRzthLmk9dGhpcy5pO2EuZz10aGlzLmc7YS5jPXRoaXMuYzthLmY9dGhpcy5mO2EuYT1OKHRoaXMuYSk7cmV0dXJuIGF9O2Z1bmN0aW9uIEVjKCl7dGhpcy5hPVtdfUVjLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciBhPW5ldyBFYzthLmE9eGModGhpcy5hKXx8W107cmV0dXJuIGF9O2Z1bmN0aW9uIEZjKCl7dGhpcy5hPXRoaXMuZHVyYXRpb249dGhpcy5zdGFydFRpbWU9bnVsbH0KRmMucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGE9bmV3IEZjO2Euc3RhcnRUaW1lPXRoaXMuc3RhcnRUaW1lO2EuZHVyYXRpb249dGhpcy5kdXJhdGlvbjthLmE9dGhpcy5hO3JldHVybiBhfTtmdW5jdGlvbiBHYyhhLGIpe3RoaXMuR2E9YTt0aGlzLmVuZD1ifUdjLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgR2ModGhpcy5HYSx0aGlzLmVuZCl9O2ljLlRBR19OQU1FPSJNUEQiO2pjLlRBR19OQU1FPSJQZXJpb2QiO2tjLlRBR19OQU1FPSJBZGFwdGF0aW9uU2V0IjtsYy5UQUdfTkFNRT0iUm9sZSI7bWMuVEFHX05BTUU9IkFjY2Vzc2liaWxpdHkiO25jLlRBR19OQU1FPSJDb250ZW50Q29tcG9uZW50IjtxYy5UQUdfTkFNRT0iUmVwcmVzZW50YXRpb24iO3NjLlRBR19OQU1FPSJDb250ZW50UHJvdGVjdGlvbiI7dGMuVEFHX05BTUU9ImNlbmM6cHNzaCI7dWMuVEFHX05BTUU9IkJhc2VVUkwiO3JjLlRBR19OQU1FPSJBdWRpb0NoYW5uZWxDb25maWd1cmF0aW9uIjsKdmMuVEFHX05BTUU9IkxvY2F0aW9uIjt3Yy5UQUdfTkFNRT0iU2VnbWVudEJhc2UiO3ljLlRBR19OQU1FPSJSZXByZXNlbnRhdGlvbkluZGV4IjtvYy5UQUdfTkFNRT0iRkJJbml0aWFsaXphdGlvbkJpbmFyeSI7cGMuVEFHX05BTUU9IkZCU2VnbWVudEluZGV4QmluYXJ5Ijt6Yy5UQUdfTkFNRT0iSW5pdGlhbGl6YXRpb24iO0FjLlRBR19OQU1FPSJTZWdtZW50TGlzdCI7Q2MuVEFHX05BTUU9IlNlZ21lbnRVUkwiO0RjLlRBR19OQU1FPSJTZWdtZW50VGVtcGxhdGUiO0VjLlRBR19OQU1FPSJTZWdtZW50VGltZWxpbmUiO0ZjLlRBR19OQU1FPSJTIjsKaWMucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGEsYil7dGhpcy51cmw9YS5kYzt0aGlzLmlkPUwoYiwiaWQiLE0pO3RoaXMudHlwZT1MKGIsInR5cGUiLE0pfHwic3RhdGljIjt0aGlzLkZCV2FzTGl2ZT1MKGIsIkZCV2FzTGl2ZSIsSGMpfHwhMTt0aGlzLkZCSXNMaXZlVGVtcGxhdGVkPUwoYiwiRkJJc0xpdmVUZW1wbGF0ZWQiLEhjKXx8ITE7dGhpcy5iPUwoYiwibWVkaWFQcmVzZW50YXRpb25EdXJhdGlvbiIsSWMpO3RoaXMuaD1MKGIsIm1pbkJ1ZmZlclRpbWUiLEljLHRoaXMuaCk7dGhpcy5nPUwoYiwibWluaW11bVVwZGF0ZVBlcmlvZCIsSWMsdGhpcy5nKTt0aGlzLmM9TChiLCJhdmFpbGFiaWxpdHlTdGFydFRpbWUiLEpjLHRoaXMuYyk7dGhpcy5mPUwoYiwidGltZVNoaWZ0QnVmZmVyRGVwdGgiLEljLHRoaXMuZik7dGhpcy5mPW51bGw7dGhpcy5pPUwoYiwic3VnZ2VzdGVkUHJlc2VudGF0aW9uRGVsYXkiLEljLHRoaXMuaSk7dmFyIGM9YS5iYXNlVXJsLGQ9S2ModGhpcyxiLAp1Yyk7dGhpcy5iYXNlVXJsPUxjKGMsZCk7aWYoZD1LKHRoaXMsYix2YykpdGhpcy5qPU1jKGMsZC51cmwpO3RoaXMuYT1LYyh0aGlzLGIsamMpfTtmdW5jdGlvbiBOYyhhLGIsYyxkKXtpZigwIT09YS5hLmxlbmd0aCl7dmFyIGU9bmV3IGtjO2UuY29udGVudFR5cGU9InRleHQiO2UubGFuZz1jfHwiZW4iO2UuZj0hMDtjPW5ldyBxYztjLmJhbmR3aWR0aD0wO2MubWltZVR5cGU9ZHx8InRleHQvdnR0IjtjLmJhc2VVcmw9W25ldyBKKGIpXTtlLmEucHVzaChjKTthLmFbMF0uYS5wdXNoKGUpO09jKGEuYVswXSl9fQpqYy5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oYSxiKXt0aGlzLmlkPUwoYiwiaWQiLE0pO3RoaXMuc3RhcnQ9TChiLCJzdGFydCIsSWMpO3RoaXMuZHVyYXRpb249TChiLCJkdXJhdGlvbiIsSWMpO3ZhciBjPUtjKHRoaXMsYix1Yyk7dGhpcy5iYXNlVXJsPUxjKGEuYmFzZVVybCxjKTt0aGlzLmI9Syh0aGlzLGIsd2MpO3RoaXMuYz1LKHRoaXMsYixBYyk7dGhpcy5mPUsodGhpcyxiLERjKTt0aGlzLmE9S2ModGhpcyxiLGtjKTtPYyh0aGlzKX07ZnVuY3Rpb24gT2MoYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEuYS5sZW5ndGg7KytjKXt2YXIgZD1hLmFbY107bnVsbCE9ZC5ncm91cCYmKGJbZC5ncm91cF09ITApfWZvcihjPTA7YzxhLmEubGVuZ3RoOysrYylpZihkPWEuYVtjXSxudWxsPT1kLmdyb3VwKXtmb3IodmFyIGU9MTsxPT1iW2VdOykrK2U7YltlXT0hMDtkLmdyb3VwPWV9fQprYy5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oYSxiKXt2YXIgYz1LKHRoaXMsYixuYyl8fHt9LGQ9Syh0aGlzLGIsbGMpO3RoaXMuaWQ9TChiLCJpZCIsTSk7dGhpcy5ncm91cD1MKGIsImdyb3VwIixPKTt0aGlzLmxhbmc9TChiLCJsYW5nIixNLGMubGFuZyk7dGhpcy5jb250ZW50VHlwZT1MKGIsImNvbnRlbnRUeXBlIixNLGMuY29udGVudFR5cGUpO3RoaXMud2lkdGg9TChiLCJ3aWR0aCIsUSk7dGhpcy5oZWlnaHQ9TChiLCJoZWlnaHQiLFEpO3RoaXMubWltZVR5cGU9TChiLCJtaW1lVHlwZSIsTSk7dGhpcy5jb2RlY3M9TChiLCJjb2RlY3MiLE0pO3RoaXMuYz1MKGIsIkZCUHJvamVjdGlvbiIsTSk7dGhpcy5mPWQmJiJtYWluIj09ZC52YWx1ZTt0aGlzLmxhbmcmJih0aGlzLmxhbmc9V2EodGhpcy5sYW5nKSk7Yz1LYyh0aGlzLGIsdWMpO3RoaXMuYmFzZVVybD1MYyhhLmJhc2VVcmwsYyk7dGhpcy5qPUtjKHRoaXMsYixzYyk7IXRoaXMuY29udGVudFR5cGUmJnRoaXMubWltZVR5cGUmJgoodGhpcy5jb250ZW50VHlwZT10aGlzLm1pbWVUeXBlLnNwbGl0KCIvIilbMF0pO3RoaXMuZz1hLmI/UGModGhpcyxiLGEuYik6Syh0aGlzLGIsd2MpO3RoaXMuaD1hLmM/UGModGhpcyxiLGEuYyk6Syh0aGlzLGIsQWMpO3RoaXMuaT1hLmY/UGModGhpcyxiLGEuZik6Syh0aGlzLGIsRGMpO3RoaXMuYT1LYyh0aGlzLGIscWMpO3RoaXMuYj1LKHRoaXMsYixtYyk7IXRoaXMubWltZVR5cGUmJnRoaXMuYS5sZW5ndGgmJih0aGlzLm1pbWVUeXBlPXRoaXMuYVswXS5taW1lVHlwZSwhdGhpcy5jb250ZW50VHlwZSYmdGhpcy5taW1lVHlwZSYmKHRoaXMuY29udGVudFR5cGU9dGhpcy5taW1lVHlwZS5zcGxpdCgiLyIpWzBdKSl9O2xjLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihhLGIpe3RoaXMudmFsdWU9TChiLCJ2YWx1ZSIsTSl9O21jLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihhLGIpe3RoaXMuYT1MKGIsInNjaGVtZUlkVXJpIixNKTt0aGlzLmxhbmc9TChiLCJsYW5nIixNKX07Cm5jLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihhLGIpe3RoaXMuaWQ9TChiLCJpZCIsTSk7dGhpcy5sYW5nPUwoYiwibGFuZyIsTSk7dGhpcy5jb250ZW50VHlwZT1MKGIsImNvbnRlbnRUeXBlIixNKTt0aGlzLmxhbmcmJih0aGlzLmxhbmc9V2EodGhpcy5sYW5nKSl9OwpxYy5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oYSxiKXt0aGlzLmlkPUwoYiwiaWQiLE0pO3RoaXMuYmFuZHdpZHRoPUwoYiwiYmFuZHdpZHRoIixRKTt0aGlzLndpZHRoPUwoYiwid2lkdGgiLFEsYS53aWR0aCk7dGhpcy5oZWlnaHQ9TChiLCJoZWlnaHQiLFEsYS5oZWlnaHQpO3RoaXMubWltZVR5cGU9TChiLCJtaW1lVHlwZSIsTSxhLm1pbWVUeXBlKTt0aGlzLmNvZGVjcz1MKGIsImNvZGVjcyIsTSxhLmNvZGVjcyk7dGhpcy5mYlF1YWxpdHlMYWJlbD1MKGIsIkZCUXVhbGl0eUxhYmVsIixNKTt0aGlzLmZiUXVhbGl0eUNsYXNzPUwoYiwiRkJRdWFsaXR5Q2xhc3MiLE0pO3RoaXMubD1MKGIsIkZCQWJyUG9saWN5VGFncyIsTSk7VmlkZW9QbGF5ZXJTaGFrYUdsb2JhbENvbmZpZy5nZXRCb29sKCJtcGRfcGFyc2VfbW9zX2F0dHJpYnV0ZXMiLCExKSYmKHRoaXMubz1MKGIsIkZCUGxheWJhY2tSZXNvbHV0aW9uTW9zIixNb3NVdGlscy5wYXJzZVBsYXliYWNrTW9zKSx0aGlzLnM9TChiLAoiRkJQbGF5YmFja1Jlc29sdXRpb25Nb3NDb25maWRlbmNlTGV2ZWwiLE0pKTtWaWRlb1BsYXllclNoYWthR2xvYmFsQ29uZmlnLmdldEJvb2woIm1wZF9wYXJzZV9mcmFtZV9hbmRfYXVkaW9fc2FtcGxpbmdfcmF0ZSIsITEpJiYodGhpcy5mcmFtZVJhdGU9TChiLCJmcmFtZVJhdGUiLE0pLHRoaXMuaj1MKGIsImF1ZGlvU2FtcGxpbmdSYXRlIixRKSk7dGhpcy5sYW5nPWEubGFuZzt2YXIgYz1LYyh0aGlzLGIsdWMpO3RoaXMuYmFzZVVybD1MYyhhLmJhc2VVcmwsYyk7VmlkZW9QbGF5ZXJTaGFrYUdsb2JhbENvbmZpZy5nZXRCb29sKCJhZGRfaW5saW5lX2luaXRpYWxpemF0aW9uX3Jlc291cmNlcyIsITEpJiYodGhpcy5nPUsodGhpcyxiLG9jKSx0aGlzLmg9Syh0aGlzLGIscGMpKTt0aGlzLmM9S2ModGhpcyxiLHNjKTt0aGlzLmk9Syh0aGlzLGIscmMpO3RoaXMuZj1hLmc/UGModGhpcyxiLGEuZyk6Syh0aGlzLGIsd2MpO3RoaXMuYj1hLmg/UGModGhpcyxiLGEuaCk6Syh0aGlzLGIsCkFjKTt0aGlzLmE9YS5pP1BjKHRoaXMsYixhLmkpOksodGhpcyxiLERjKTt0aGlzLmM9dGhpcy5jLmNvbmNhdChhLmopfTtvYy5wcm90b3R5cGUucGFyc2U9cGMucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGEsYil7aWYoYiYmYi5maXJzdENoaWxkKXt2YXIgYz1RYyhiKTtudWxsIT1jJiYodGhpcy5kYXRhPU5iKGMpLmJ1ZmZlcil9fTtzYy5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oYSxiKXt0aGlzLmM9Yjt0aGlzLmY9TChiLCJzY2hlbWVJZFVyaSIsTSk7dmFyIGM9TChiLCJjZW5jOmRlZmF1bHRfS0lEIixNKTtjJiYodGhpcy5iPWMucmVwbGFjZSgvWy1dL2csIiIpKTt0aGlzLmE9Syh0aGlzLGIsdGMpfTsKdGMucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGEsYil7dmFyIGM9UWMoYik7aWYoYyl7dGhpcy5wc3NoQm94PU5iKGMpO3RyeXt0aGlzLnBhcnNlZFBzc2g9bmV3IFRiKHRoaXMucHNzaEJveCl9Y2F0Y2goZCl7aWYoIShkIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikpdGhyb3cgZDt9fX07dWMucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGEsYil7dmFyIGM9Yi5jaGlsZE5vZGVzLGQ9IiI7aWYoMT09Yy5sZW5ndGgpZD1RYyhiKTtlbHNlIGZvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKWNbZV0ubm9kZVR5cGU9PU5vZGUuVEVYVF9OT0RFJiYoZCs9Y1tlXS5ub2RlVmFsdWUpO3RoaXMudXJsPWR9O3ZjLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihhLGIpe3RoaXMudXJsPVFjKGIpfTsKd2MucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGEsYil7dGhpcy5iYXNlVXJsPWEuYmFzZVVybHx8dGhpcy5iYXNlVXJsO3RoaXMuYj1MKGIsInRpbWVzY2FsZSIsUSx0aGlzLmIpO3RoaXMuaD1MKGIsInByZXNlbnRhdGlvblRpbWVPZmZzZXQiLE8sdGhpcy5oKTt0aGlzLmE9TChiLCJpbmRleFJhbmdlIixSYyx0aGlzLmEpO3RoaXMuZz1MKGIsIkZCRmlyc3RTZWdtZW50UmFuZ2UiLFJjLHRoaXMuZyk7dGhpcy5jPUsodGhpcyxiLHljKXx8dGhpcy5jO3RoaXMuZj1LKHRoaXMsYix6Yyl8fHRoaXMuZn07eWMucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGEsYil7dmFyIGM9TChiLCJzb3VyY2VVUkwiLE0pO3RoaXMudXJsPU1jKGEuYmFzZVVybCxjKTt0aGlzLmE9TChiLCJyYW5nZSIsUmMsTihhLmEpKX07CnpjLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihhLGIpe3ZhciBjPUwoYiwic291cmNlVVJMIixNKTt0aGlzLnVybD1NYyhhLmJhc2VVcmwsYyk7dGhpcy5hPUwoYiwicmFuZ2UiLFJjKX07CkFjLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihhLGIpe3RoaXMuYmFzZVVybD1hLmJhc2VVcmx8fHRoaXMuYmFzZVVybDt0aGlzLmI9TChiLCJ0aW1lc2NhbGUiLFEsdGhpcy5iKTt0aGlzLmY9TChiLCJwcmVzZW50YXRpb25UaW1lT2Zmc2V0IixPLHRoaXMuZik7dGhpcy5HPUwoYiwiZHVyYXRpb24iLFEsdGhpcy5HKTt2YXIgYz1MKGIsInN0YXJ0TnVtYmVyIixRKTtudWxsIT1jJiYodGhpcy5oPWMpO3RoaXMuZz1LKHRoaXMsYix6Yyl8fHRoaXMuZzt0aGlzLmM9KGM9S2ModGhpcyxiLENjKSkmJjA8Yy5sZW5ndGg/Yzp0aGlzLmM7dGhpcy5hPUsodGhpcyxiLEVjKXx8dGhpcy5hO1ZpZGVvUGxheWVyU2hha2FHbG9iYWxDb25maWcuZ2V0Qm9vbCgiY2FsY3VsYXRlX3F1aWNrX2Rhc2hfcHJlc2VudGF0aW9uX3RpbWVfb2Zmc2V0X2Zyb21fdGltZWxpbmUiLCExKSYmKGM9VmlkZW9QbGF5ZXJTaGFrYUdsb2JhbENvbmZpZy5nZXROdW1iZXIoImNhbGN1bGF0ZV9xdWlja19kYXNoX3ByZXNlbnRhdGlvbl90aW1lX29mZnNldF9lcHNpbG9uX21zIiwKMjUwKSx0aGlzLmEmJnRoaXMuYS5hWzBdJiYodGhpcy5mPTFFMzx0aGlzLmEuYVswXS5zdGFydFRpbWU/dGhpcy5hLmFbMF0uc3RhcnRUaW1lLWM6dGhpcy5mKSl9O0NjLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihhLGIpe3ZhciBjPUwoYiwibWVkaWEiLE0pO3RoaXMuYj1NYyhhLmJhc2VVcmwsYyk7dGhpcy5hPUwoYiwibWVkaWFSYW5nZSIsUmMpfTsKRGMucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGEsYil7dGhpcy5iPUwoYiwidGltZXNjYWxlIixRLHRoaXMuYik7dGhpcy5oPUwoYiwicHJlc2VudGF0aW9uVGltZU9mZnNldCIsTyx0aGlzLmgpO3RoaXMuRz1MKGIsImR1cmF0aW9uIixRLHRoaXMuRyk7dmFyIGM9TChiLCJzdGFydE51bWJlciIsTyk7bnVsbCE9YyYmKHRoaXMuaT1jKTt0aGlzLmc9TChiLCJtZWRpYSIsTSx0aGlzLmcpO3RoaXMuYz1MKGIsImluZGV4IixNLHRoaXMuYyk7dGhpcy5mPUwoYiwiaW5pdGlhbGl6YXRpb24iLE0sdGhpcy5mKTt0aGlzLmE9Syh0aGlzLGIsRWMpfHx0aGlzLmF9O0VjLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihhLGIpe3RoaXMuYT1LYyh0aGlzLGIsRmMpfTtGYy5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oYSxiKXt0aGlzLnN0YXJ0VGltZT1MKGIsInQiLE8pO3RoaXMuZHVyYXRpb249TChiLCJkIixPKTt0aGlzLmE9TChiLCJyIixTYyl9OwpmdW5jdGlvbiBMYyhhLGIpe2lmKCFifHwwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKHZhciBjPVtdLGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9YltkXS51cmw7bnVsbD09YXx8MD09PWEubGVuZ3RoP2MucHVzaChuZXcgSihlKSk6KGU9TWMoYS5zbGljZSgwLDEpLGUpLGMucHVzaChlWzBdKSl9cmV0dXJuIGN9ZnVuY3Rpb24gTWMoYSxiKXtpZighYilyZXR1cm4gYTt2YXIgYz1uZXcgSihiKTtyZXR1cm4gYT9hLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXNvbHZlKGMpfSk6W2NdfWZ1bmN0aW9uIFBjKGEsYixjKXt2YXIgZD1OKGMpOyhiPVRjKGIsYy5jb25zdHJ1Y3Rvci5UQUdfTkFNRSkpJiZkLnBhcnNlKGEsYik7cmV0dXJuIGR9ZnVuY3Rpb24gSyhhLGIsYyl7dmFyIGQ9bnVsbDtpZihiPVRjKGIsYy5UQUdfTkFNRSkpZD1uZXcgYyxkLnBhcnNlKGEsYik7cmV0dXJuIGR9CmZ1bmN0aW9uIFRjKGEsYil7Zm9yKHZhciBjPW51bGwsZD0wO2Q8YS5jaGlsZE5vZGVzLmxlbmd0aDtkKyspaWYoYS5jaGlsZE5vZGVzW2RdLnRhZ05hbWU9PWIpe2lmKGMpcmV0dXJuIG51bGw7Yz1hLmNoaWxkTm9kZXNbZF19cmV0dXJuIGN9ZnVuY3Rpb24gS2MoYSxiLGMpe2Zvcih2YXIgZD1bXSxlPTA7ZTxiLmNoaWxkTm9kZXMubGVuZ3RoO2UrKylpZihiLmNoaWxkTm9kZXNbZV0udGFnTmFtZT09Yy5UQUdfTkFNRSl7dmFyIGY9bmV3IGM7Zi5wYXJzZS5jYWxsKGYsYSxiLmNoaWxkTm9kZXNbZV0pO2QucHVzaChmKX1yZXR1cm4gZH1mdW5jdGlvbiBRYyhhKXthPWEuZmlyc3RDaGlsZDtyZXR1cm4gYS5ub2RlVHlwZSE9Tm9kZS5URVhUX05PREU/bnVsbDphLm5vZGVWYWx1ZX1mdW5jdGlvbiB4YyhhKXtyZXR1cm4gYT9hLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS5jbG9uZSgpfSk6bnVsbH1mdW5jdGlvbiBOKGEpe3JldHVybiBhP2EuY2xvbmUoKTpudWxsfQpmdW5jdGlvbiBMKGEsYixjLGQpe2E9YS5oYXNBdHRyaWJ1dGUoYik/YyhhLmdldEF0dHJpYnV0ZShiKSk6bnVsbDtyZXR1cm4gbnVsbCE9YT9hOnZvaWQgMCE9PWQ/ZDpudWxsfWZ1bmN0aW9uIEpjKGEpe2lmKCFhKXJldHVybiBudWxsO2E9RGF0ZS5wYXJzZShhKTtyZXR1cm4gaXNOYU4oYSk/bnVsbDpNYXRoLmZsb29yKGEvMUUzKX0KZnVuY3Rpb24gSWMoYSl7aWYoIWEpcmV0dXJuIG51bGw7dmFyIGI9L15QKD86KFswLTldKilZKT8oPzooWzAtOV0qKU0pPyg/OihbMC05XSopRCk/KD86VCg/OihbMC05XSopSCk/KD86KFswLTldKilNKT8oPzooWzAtOS5dKilTKT8pPyQvLmV4ZWMoYSk7aWYoIWIpcmV0dXJuIG51bGw7YT0wO3ZhciBjPU8oYlsxXSk7YyYmKGErPTMxNTM2RTMqYyk7KGM9TyhiWzJdKSkmJihhKz0yNTkyRTMqYyk7KGM9TyhiWzNdKSkmJihhKz04NjQwMCpjKTsoYz1PKGJbNF0pKSYmKGErPTM2MDAqYyk7KGM9TyhiWzVdKSkmJihhKz02MCpjKTtiPXdpbmRvdy5wYXJzZUZsb2F0KGJbNl0pOyhiPWlzTmFOKGIpP251bGw6YikmJihhKz1iKTtyZXR1cm4gYX0KZnVuY3Rpb24gUmMoYSl7dmFyIGI9LyhbMC05XSspLShbMC05XSspLy5leGVjKGEpO2lmKCFiKXJldHVybiBudWxsO2E9TyhiWzFdKTtpZihudWxsPT1hKXJldHVybiBudWxsO2I9TyhiWzJdKTtyZXR1cm4gbnVsbD09Yj9udWxsOm5ldyBHYyhhLGIpfWZ1bmN0aW9uIFNjKGEpe2E9d2luZG93LnBhcnNlSW50KGEsMTApO3JldHVybiBpc05hTihhKT9udWxsOmF9ZnVuY3Rpb24gUShhKXthPXdpbmRvdy5wYXJzZUludChhLDEwKTtyZXR1cm4gMDxhP2E6bnVsbH1mdW5jdGlvbiBPKGEpe2E9d2luZG93LnBhcnNlSW50KGEsMTApO3JldHVybiAwPD1hP2E6bnVsbH1mdW5jdGlvbiBIYyhhKXtzd2l0Y2goYS50b0xvd2VyQ2FzZSgpKXtjYXNlICJ0cnVlIjpyZXR1cm4hMDtjYXNlICJmYWxzZSI6cmV0dXJuITE7ZGVmYXVsdDpyZXR1cm4gbnVsbH19ZnVuY3Rpb24gTShhKXtyZXR1cm4gYX07ZnVuY3Rpb24gVWMoYSxiKXt0aGlzLnVybD1hO3RoaXMuYj1ifHxuZXcgeGI7dGhpcy5qPTA7dGhpcy5nPS0xO3RoaXMuaD10aGlzLmk9MDt0aGlzLmE9bnVsbDt0aGlzLmM9bmV3IEc7dGhpcy5mPW51bGw7dGhpcy5vPXRoaXMuYi5pO3RoaXMubT10aGlzLmIub31xKCJzaGFrYS51dGlsLkFqYXhSZXF1ZXN0IixVYyk7ZnVuY3Rpb24geGIoKXt0aGlzLmJvZHk9bnVsbDt0aGlzLmI9MTt0aGlzLmo9MUUzO3RoaXMuZj0wO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZz0iYXJyYXlidWZmZXIiO3RoaXMuYz17fTt0aGlzLmg9dGhpcy5zPSExO3RoaXMuWj10aGlzLmE9dGhpcy52PW51bGw7dGhpcy5sPSExO3RoaXMubz10aGlzLmk9dGhpcy5taW1lVHlwZT1udWxsfXZhciBWYz0hMDtmdW5jdGlvbiBXYyhhKXtYYyhhKTtZYyhhKTthLmIuYm9keT1udWxsO2EuYy5kZXN0cm95KCk7YS5jPW51bGw7YS5mPW51bGx9CmZ1bmN0aW9uIFljKGEpe2EuYSYmKGEuYS5vbmxvYWQ9bnVsbCxhLmEub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsYS5hLm9uZXJyb3I9bnVsbCxhLmEub250aW1lb3V0PW51bGwpO2EuYT1udWxsfWZ1bmN0aW9uIFhjKGEpey0xIT09YS5nJiYoY2xlYXJUaW1lb3V0KGEuZyksYS5nPS0xKX12YXIgWmM9LyguKilcLih4eHxmbmEpXC5mYmNkblwubmV0LywkYz0vbGl2ZXN0cmVhbS1sb29rYXNpZGVcLmZhY2Vib29rXC5jb20kLzsKVWMucHJvdG90eXBlLmw9ZnVuY3Rpb24oKXtpZih0aGlzLmEpcmV0dXJuIHRoaXMuYztpZigwPT10aGlzLnVybC5sYXN0SW5kZXhPZigiZGF0YToiLDApKXt2YXIgYT10aGlzLnVybC5zcGxpdCgiOiIpWzFdLnNwbGl0KCI7IikucG9wKCkuc3BsaXQoIiwiKSxiPWEucG9wKCksYj0iYmFzZTY0Ij09YS5wb3AoKT93aW5kb3cuYXRvYihiLnJlcGxhY2UoLy0vZywiKyIpLnJlcGxhY2UoL18vZywiLyIpKTp3aW5kb3cuZGVjb2RlVVJJQ29tcG9uZW50KGIpOyJhcnJheWJ1ZmZlciI9PXRoaXMuYi5nJiYoYj1NYihiKS5idWZmZXIpO2E9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShuZXcgWE1MSHR0cFJlcXVlc3QpKTthLnJlc3BvbnNlPWI7YS5yZXNwb25zZVRleHQ9Yi50b1N0cmluZygpO2I9dGhpcy5jO2IucmVzb2x2ZShhKTtXYyh0aGlzKTtyZXR1cm4gYn1pZigwPT10aGlzLnVybC5sYXN0SW5kZXhPZigiaWRiOiIsMCkpcmV0dXJuIHRoaXMucygpO3RoaXMuaisrO3RoaXMuaT1wZXJmb3JtYW5jZU5vdygpOwp0aGlzLmh8fCh0aGlzLmg9dGhpcy5iLmopO3RoaXMuYT1uZXcgWE1MSHR0cFJlcXVlc3Q7dmFyIGM9dGhpcy51cmwsYT1uZXcgSihjKTtWYyYmKHRoaXMuZiYmIXRoaXMuZi5zdXBwb3J0c0NhY2hpbmcoKXx8dGhpcy5iLmgpJiZnYyhhLmEsIl8iLERhdGUubm93KCkpO2M9WmMudGVzdChjKTtpZihudWxsIT10aGlzLmIuYSYmYyl7dmFyIGQ9dGhpcy5iLmEsZT1hLmE7bnVsbCE9ZC5hJiYoZC5oPWQuYS5nZXRTZWdtZW50c1RvUHVzaCgpLGQuZj1kLmEuZ2V0U2VnbWVudFN0YXJ0VGltZSgpLGQuZz1kLmEuZ2V0U2VnbWVudE9mZnNldCgpLGQuYz1kLmEuZ2V0UHVzaFZpZGVvUmVwcmVzZW50YXRpb25JRCgpLGQuYj1kLmEuZ2V0UHVzaEF1ZGlvUmVwcmVzZW50YXRpb25JRCgpLGQuaj1kLmEuZ2V0VXNlTG9uZ0NhY2hlRm9yTWFuaWZlc3QoKSk7bnVsbCE9ZC5oJiZnYyhlLCJfbmNfcF9uIixkLmgpO251bGwhPWQuZj9nYyhlLCJfbmNfcF90cyIsZC5mKTpudWxsIT1kLmcmJmdjKGUsIl9uY19wX28iLApkLmcpO251bGwhPWQuYyYmbnVsbCE9ZC5iJiYoZ2MoZSwiX25jX3BfcmlkIixkLmMpLGdjKGUsIl9uY19wX2FyaWQiLGQuYikpO2QuaSYmZ2MoZSwiX25jX3BfZGJnIiwiMSIpO2QuaiYmZ2MoZSwiX25jX25jIiwiMSIpfTE9PXRoaXMuYi5sJiZjJiZnYyhhLmEsIl9uY19wbGF5aW5nIiwxKTtjPWEudG9TdHJpbmcoKTthPSRjLnRlc3QoYS5lYSk7dGhpcy5hLm9wZW4odGhpcy5iLm1ldGhvZCxjLCEwKTt0aGlzLmEucmVzcG9uc2VUeXBlPXRoaXMuYi5nO3RoaXMuYS50aW1lb3V0PXRoaXMuYi5mO3RoaXMuYS53aXRoQ3JlZGVudGlhbHM9dGhpcy5iLnN8fGE7c2V0RXZlbnRQcm9wZXJ0eSh0aGlzLmEsIm9ubG9hZCIsdGhpcy5NYy5iaW5kKHRoaXMpKTtzZXRFdmVudFByb3BlcnR5KHRoaXMuYSwib25yZWFkeXN0YXRlY2hhbmdlIix0aGlzLlJjLmJpbmQodGhpcykpO3NldEV2ZW50UHJvcGVydHkodGhpcy5hLCJvbmVycm9yIix0aGlzLktjLmJpbmQodGhpcykpO3NldEV2ZW50UHJvcGVydHkodGhpcy5hLAoib250aW1lb3V0Iix0aGlzLlVjLmJpbmQodGhpcykpO3NldEV2ZW50UHJvcGVydHkodGhpcy5hLCJvbmFib3J0Iix0aGlzLkhjLmJpbmQodGhpcykpO2ZvcihiIGluIHRoaXMuYi5jKXRoaXMuYS5zZXRSZXF1ZXN0SGVhZGVyKGIsdGhpcy5iLmNbYl0pO3RoaXMuYS5zZW5kKHRoaXMuYi5ib2R5KTtyZXR1cm4gdGhpcy5jfTtVYy5wcm90b3R5cGUuc2VuZD1VYy5wcm90b3R5cGUubDtmdW5jdGlvbiBhZChhLGIsYyl7Yj1FcnJvcihiKTtiLnR5cGU9YztiLnN0YXR1cz1hLmEuc3RhdHVzO2IudXJsPWEudXJsO2IubWV0aG9kPWEuYi5tZXRob2Q7Yi5ib2R5PWEuYi5ib2R5O3JldHVybiBifW49VWMucHJvdG90eXBlOwpuLkhjPWZ1bmN0aW9uKCl7aWYoVmlkZW9QbGF5ZXJTaGFrYUdsb2JhbENvbmZpZy5nZXRCb29sKCJmaXhfc2hha2FfdXRpbF9hamF4X3JlcXVlc3RfYWJvcnQiLCEwKSl7dmFyIGE9YWQodGhpcywiUmVxdWVzdCBhYm9ydGVkLiIsImFib3J0ZWQiKTt0aGlzLmMucmVqZWN0KGEpO1djKHRoaXMpfX07Cm4uTWM9ZnVuY3Rpb24oYSl7aWYodGhpcy5mKXt2YXIgYj1WaWRlb1BsYXllclJlc291cmNlVGltZXIuZ2V0UmVzb3VyY2VUaW1pbmdFbnRyeSh0aGlzLnVybCx0aGlzLmkscGVyZm9ybWFuY2VOb3coKSk7dGhpcy5mLnNhbXBsZShwZXJmb3JtYW5jZU5vdygpLXRoaXMuaSxhLmxvYWRlZHx8dGhpcy5hLnJlc3BvbnNlJiZ0aGlzLmEucmVzcG9uc2UuYnl0ZUxlbmd0aHx8MCx0aGlzLmIubWltZVR5cGU/InYiPT09dGhpcy5iLm1pbWVUeXBlLmNoYXJBdCgwKTohMSxiLHRoaXMubyx0aGlzLm0pfWE9WzQwM107MjAwPD10aGlzLmEuc3RhdHVzJiYyOTk+PXRoaXMuYS5zdGF0dXM/KHRoaXMuYy5yZXNvbHZlKHRoaXMuYSksV2ModGhpcykpOiFWaWRlb1BsYXllclNoYWthR2xvYmFsQ29uZmlnLmdldEJvb2woInJlbW92ZV9hamF4X3Jlc2VuZF9pbnRlcm5hbCIsITApJiZ0aGlzLmo8dGhpcy5iLmImJi0xPT09YS5pbmRleE9mKHRoaXMuYS5zdGF0dXMpP2JkKHRoaXMpOihhPWFkKHRoaXMsIkhUVFAgZXJyb3IuIiwKIm5ldCIpLHRoaXMuYy5yZWplY3QoYSksV2ModGhpcykpfTtuLlJjPWZ1bmN0aW9uKCl7aWYodGhpcy5hLnJlYWR5U3RhdGU9PVhNTEh0dHBSZXF1ZXN0LkhFQURFUlNfUkVDRUlWRUQmJih0aGlzLmEuS2E9RGF0ZS5ub3coKS10aGlzLmksdGhpcy5iLmEmJnRoaXMuYi5aJiZjZCh0aGlzLmIuWix0aGlzLmEpLHRoaXMuYi5oKSl7dmFyIGE9RGF0ZS5wYXJzZSh0aGlzLmEuZ2V0UmVzcG9uc2VIZWFkZXIoIkRhdGUiKSk7YSYmKERhPWEtRGF0ZS5ub3coKSl9fTtuLktjPWZ1bmN0aW9uKCl7dmFyIGE9YWQodGhpcywiTmV0d29yayBmYWlsdXJlLiIsIm5ldCIpO3RoaXMuYy5yZWplY3QoYSk7V2ModGhpcyl9OwpuLlVjPWZ1bmN0aW9uKCl7aWYoIVZpZGVvUGxheWVyU2hha2FHbG9iYWxDb25maWcuZ2V0Qm9vbCgicmVtb3ZlX2FqYXhfcmVzZW5kX2ludGVybmFsIiwhMCkmJnRoaXMuajx0aGlzLmIuYiliZCh0aGlzKTtlbHNle3ZhciBhPWFkKHRoaXMsIlJlcXVlc3QgdGltZWQgb3V0LiIsIm5ldCIpO3RoaXMuYy5yZWplY3QoYSk7V2ModGhpcyl9fTtmdW5jdGlvbiBiZChhKXtZYyhhKTthLmc9c2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZz0tMTt0aGlzLmwoKX0uYmluZChhKSxhLmgqKDErLjUqKDIqTWF0aC5yYW5kb20oKS0xKSkpO2EuaCo9Mn1mdW5jdGlvbiBkZCgpe3RoaXMuYT1uZXcgTWFwO3RoaXMuYj0hMX0KZnVuY3Rpb24gY2QoYSxiKXt2YXIgYz1iLmdldFJlc3BvbnNlSGVhZGVyKCJYLUZCLURlYnVnLU51bS1QdXNoZWQiKSxkPWIuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtRkItRGVidWctTGlzdC1QdXNoZWQiKTtudWxsIT1kJiZudWxsIT1jJiYoYz1wYXJzZUludChjLDEwKSxkPWQuc3BsaXQoIiwiKSxjIT1kLmxlbmd0aCYmY29uc29sZS53YXJuKCJJbmNvbnNpc3RlbnQgcHVzaCBkZWJ1ZyBoZWFkZXJzLiIsYyxkKSxjJiYoLTE8ZFswXS5pbmRleE9mKCIvIikmJihhLmI9ITApLGQuZm9yRWFjaChmdW5jdGlvbihhKXt0aGlzLmEuc2V0KGEsKHRoaXMuYS5nZXQoYSl8fDApKzEpfS5iaW5kKGEpKSkpfXZhciBlZD0vXC8oW15cL10rKSQvLGZkPS9cLyhbXlwvXStcL1teXC9dKykkLztmdW5jdGlvbiBnZChhLGIpe3ZhciBjO2M9KG5ldyBKKGIpKS5mYTtjPShhLmI/ZmQ6ZWQpLmV4ZWMoYyk7aWYoIWMpcmV0dXJuIDA7Yz1jWzFdO3JldHVybiBhLmEuZ2V0KGMpfHwwfTtmdW5jdGlvbiBJKGEsYixjLGQpe3RoaXMuYz1iO3RoaXMuc3RhcnRCeXRlPWN8fDA7dGhpcy5iYXNlVXJsPXRoaXMudG9TdHJpbmcoKTt0aGlzLmVuZEJ5dGU9bnVsbCE9ZD9kOm51bGw7dGhpcy5nPXRoaXMuZj1udWxsO3RoaXMuaj1hO3RoaXMuaD1udWxsO3RoaXMuaT0hMTt0aGlzLmI9dGhpcy5hPW51bGx9dmFyIGhkO3EoInNoYWthLnV0aWwuRmFpbG92ZXJVcmkiLEkpO0kucHJvdG90eXBlLm89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydEJ5dGV9O0kucHJvdG90eXBlLmdldFN0YXJ0Qnl0ZT1JLnByb3RvdHlwZS5vO0kucHJvdG90eXBlLmw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmRCeXRlfTtJLnByb3RvdHlwZS5nZXRFbmRCeXRlPUkucHJvdG90eXBlLmw7ZnVuY3Rpb24gaWQoYSxiKXtyZXR1cm4gYSYmMCE9PWEubGVuZ3RoP2EubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhLnJlc29sdmUoYil9KTpbYl19Ckkuc2V0UHJlZmV0Y2hDYWNoZVZhbHVlR2V0dGVyPWZ1bmN0aW9uKGEpe2hkPWF9O249SS5wcm90b3R5cGU7bi5mZXRjaD1mdW5jdGlvbihhLGIsYyxkLGUsZixnLGgpe3JldHVybiB0aGlzLmY/dGhpcy5mOnRoaXMuZj1qZCh0aGlzLDAsYXx8bmV3IHhiLGIsYyxkLGUsZixnLGgpfTtuLnN0cmVhbT1mdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsayl7cmV0dXJuIGtkKHRoaXMsMCxhfHxuZXcgeGIsYixjLGQsZSxmLGcsaCxrKX07CmZ1bmN0aW9uIGpkKGEsYixjLGQsZSxmLGcsaCxrLGwpe3JldHVybiBrZChhLGIsYyxkLGUsZixnLGgsayxsKS50aGVuKGZ1bmN0aW9uKGEpe3ZhciBiLGM9ZnVuY3Rpb24oKXtyZXR1cm4gYS5yZWFkKCkudGhlbihmdW5jdGlvbihhKXt2YXIgZD1hLnZhbHVlO2lmKGEuZG9uZSlyZXR1cm4gYnx8bmV3IEFycmF5QnVmZmVyKDApO2QmJigic3RyaW5nIj09PXR5cGVvZiBkP2I9KGJ8fCIiKStkOmI9Y29uY2F0QXJyYXlCdWZmZXIoYnx8bmV3IEFycmF5QnVmZmVyKDApLGQpKTtyZXR1cm4gYygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKTtyZXR1cm4gYygpfSl9Cm4uTmE9ZnVuY3Rpb24oKXtpZih0aGlzLmcpe3RoaXMuYT10aGlzLmY9bnVsbDt2YXIgYT10aGlzLmc7WGMoYSk7aWYoYS5hJiZhLmEucmVhZHlTdGF0ZSE9WE1MSHR0cFJlcXVlc3QuRE9ORSYmKGEuYS5hYm9ydCgpLCFWaWRlb1BsYXllclNoYWthR2xvYmFsQ29uZmlnLmdldEJvb2woImZpeF9zaGFrYV91dGlsX2FqYXhfcmVxdWVzdF9hYm9ydCIsITApKSl7dmFyIGI9YWQoYSwiUmVxdWVzdCBhYm9ydGVkLiIsImFib3J0ZWQiKTthLmMucmVqZWN0KGIpO1djKGEpfXRoaXMuaD10aGlzLmc9bnVsbH10aGlzLmImJih0aGlzLmIuYWJvcnRSZXF1ZXN0KG9kKHRoaXMpKSxWaWRlb1BsYXllclNoYWthR2xvYmFsQ29uZmlnLmdldEJvb2woImZpeGluZ19zY2hlZHVsZXJfZGlzYWJsZV9sZWFrcyIsITApJiYodGhpcy5iPW51bGwpKX07CmZ1bmN0aW9uIGtkKGEsYixjLGQsZSxmLGcsaCxrLGwsbSl7YS5iPWx8fG51bGw7dmFyIHA7ZSYmKGMuYSYmKGMuYS5pPSEwKSxsPTAsYy5aJiYobD1nZChjLlosYS5jW2JdLnRvU3RyaW5nKCkpKSwocD1lLmdldE9wZXJhdGlvbkxvZ2dlcigicmVxdWVzdCIpKSYmcC5zZXRSZWFzb24oa3x8bnVsbCkuc2V0UHVzaGVkKGwpLnNldFR5cGUoaHx8bnVsbCkuc2V0SW5pdGlhdG9yKCJzaGFrYSIpLnN0YXJ0KCksZiYmKHA9cC5zZXRQYXJlbnRMb2dnZXIoZikpKTt2YXIgdj1wZXJmb3JtYW5jZU5vdygpO2EuYT1udWxsO2cmJihjLmk9Zyk7ZSYmKGMubz1lKTt2YXIgdz1wZChhLGEuY1tiXSxjKTtnPW51bGw7YS5pPSExO3ZhciBCO2hkJiYoQj1oZCh3KSkmJihnPUIsYS5pPSEwLHAmJnAuc2V0SW5pdGlhdG9yKCJwcmVmZXRjaCIpKTtpZighQiYmbSlyZXR1cm4gbS5nZXRTdHJlYW0ob2QoYSkpLnRoZW4oZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0UmVhZGVyKCl9LmJpbmQoYSkpO209bnVsbDsKaWYoYS5iJiYhYS5iLmlzRGlzYWJsZWQoKSYmIWcpdHJ5eyhnPW09YS5iLmdldFByb21pc2Uob2QoYSkpKT9wPW51bGw6YS5iLmRpc2FibGUoKX1jYXRjaChQKXtlJiZlLmdldEV2ZW50TG9nZ2VyKCJyZXF1ZXN0X2luZm9fbm90X2ZvdW5kIikuc2V0UmVzb3VyY2UodykubG9nKCl9Z3x8KGEuZz1uZXcgVWModyxjKSxkJiYoYS5nLmY9ZCksZz1hLmcubCgpKTtwJiZwLnNldFJlc291cmNlKHcpO2YmJmYuc2V0UmVzb3VyY2Uodyk7dmFyIGJhPSExLGNhPWcudGhlbihIKGEsZnVuY3Rpb24oYSl7IXRoaXMuYnx8dGhpcy5iLmlzRGlzYWJsZWQoKXx8dGhpcy5hP3RoaXMuYXx8KHRoaXMuYT1WaWRlb1BsYXllclJlc291cmNlVGltZXIuZ2V0UmVzb3VyY2VUaW1pbmdFbnRyeSh3LHRoaXMuaT8wOnYscGVyZm9ybWFuY2VOb3coKSkpOnRoaXMuYT10aGlzLmIuZ2V0UmVzb3VyY2VUaW1pbmdFbnRyeSh3KTt0aGlzLmI9dGhpcy5oPXRoaXMuZz10aGlzLmY9bnVsbDt0aGlzLmg9YS5hP25ldyBKKGEuYSk6CnRoaXMuY1tiXTthLnJlc3BvbnNlLkthPWEuS2E7cCYmKHA9cC5zZXRMZW5ndGgoYS5yZXNwb25zZS5ieXRlTGVuZ3RofHxhLnJlc3BvbnNlLmxlbmd0aCkuc2V0V2FzUHJlZmV0Y2hDYWNoZUhpdCh0aGlzLmkpLG51bGwhPXRoaXMuYSYmKHA9cC5zZXRUaW1lVG9MYXN0Qnl0ZShNYXRoLnJvdW5kKHRoaXMuYS50aW1lVG9MYXN0Qnl0ZSkpLnNldFRpbWVUb0ZpcnN0Qnl0ZShNYXRoLnJvdW5kKHRoaXMuYS50aW1lVG9GaXJzdEJ5dGUpKS5zZXRUaW1lVG9SZXF1ZXN0U3RhcnQoTWF0aC5yb3VuZCh0aGlzLmEudGltZVRvUmVxdWVzdFN0YXJ0KSksMkUzPD10aGlzLmEudGltZVRvRmlyc3RCeXRlJiYtMTx3LmluZGV4T2YoImFrYW1haWhkIikmJmxvZ0xvbmdBa2FtYWlSZXF1ZXN0KGEuZ2V0UmVzcG9uc2VIZWFkZXIoIkRlYnVnLUluZm8iKSsiLCBUVEZCLT4gIit0aGlzLmEudGltZVRvRmlyc3RCeXRlKyIsIFRUUlMtPiAiK3RoaXMuYS50aW1lVG9SZXF1ZXN0U3RhcnQpKSxwLmxvZygpKTsKcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7dmFsdWU6YS5yZXNwb25zZSxkb25lOiExfSl9KSksY2E9Y2EuY2F0Y2goSChhLGZ1bmN0aW9uKGEpe2lmKHRoaXMuZiYmYisxPHRoaXMuYy5sZW5ndGgpcmV0dXJuIHRoaXMuZj1qZCh0aGlzLGIrMSxjLGQpO3RoaXMuYj10aGlzLmE9dGhpcy5mPXRoaXMuZz1udWxsO3AmJnAuc2V0RXJyb3IoYSkubG9nKCk7cmV0dXJuIFByb21pc2UucmVqZWN0KGEpfSkpO3JldHVybiBQcm9taXNlLnJlc29sdmUoe2NhbmNlbDpmdW5jdGlvbigpe30scmVhZDpmdW5jdGlvbigpe3JldHVybiBiYT9Qcm9taXNlLnJlc29sdmUoe3ZhbHVlOm51bGwsZG9uZTohMH0pOmNhLnRoZW4oZnVuY3Rpb24oYSl7YmE9ITA7cmV0dXJuIGF9KX0uYmluZChhKX0pfWZ1bmN0aW9uIG9kKGEpe3JldHVybntiYXNlVXJsOmEudG9TdHJpbmcoKSxzdGFydEJ5dGU6YS5zdGFydEJ5dGUsZW5kQnl0ZTphLmVuZEJ5dGV9fQpuLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBJKHRoaXMuaix0aGlzLmMubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhLmNsb25lKCl9KSx0aGlzLnN0YXJ0Qnl0ZSx0aGlzLmVuZEJ5dGUpfTtuLmdldFJlc291cmNlVGltaW5nRW50cnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTtmdW5jdGlvbiBwZChhLGIsYyl7dmFyIGQ9Yi50b1N0cmluZygpO2lmKGEuc3RhcnRCeXRlfHxhLmVuZEJ5dGUpYj1iLmVhLCFiLmVuZHNXaXRoKCJmYmNkbi5uZXQiKXx8Yi5zdGFydHNXaXRoKCJpbnRlcm5jYWNoZSIpfHxiLmVuZHNXaXRoKCJhay5mYmNkbi5uZXQiKT9jJiYoYy5jLlJhbmdlPSJieXRlcz0iKyhhLnN0YXJ0Qnl0ZSsiLSIrKG51bGwhPWEuZW5kQnl0ZT9hLmVuZEJ5dGU6IiIpKSk6KGQrPSImYnl0ZXN0YXJ0PSIrYS5zdGFydEJ5dGUsZCs9bnVsbCE9PWEuZW5kQnl0ZT8iJmJ5dGVlbmQ9IithLmVuZEJ5dGU6IiIpO2EuaiYmYyYmKGQ9YS5qKGQsYy5jKXx8ZCk7cmV0dXJuIGR9CmZ1bmN0aW9uIHliKGEpe3JldHVybiBwZChhLGEuY1swXSl9bi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNbMF0udG9TdHJpbmcoKX07ZnVuY3Rpb24gcWQoYSxiLGMsZCl7dGhpcy5hPW5ldyB4YjtiPW51bGwhPWI/YjpuYTt0aGlzLmEuZz0idGV4dCI7dGhpcy5hLmI9Mzt0aGlzLmEuZj0xRTMqYjtjJiYodGhpcy5hLmE9Yyk7ZCYmKHRoaXMuYS5aPWQpO3RoaXMuYS5oPSEwO3RoaXMuYj1hfWZ1bmN0aW9uIHJkKGEsYil7dmFyIGM9YS5iO3JldHVybiBjLmZldGNoKGEuYSxudWxsLGIsbnVsbCxudWxsLCJtYW5pZmVzdCIpLnRoZW4oZnVuY3Rpb24oYSl7YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyJiYoYT1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsbmV3IFVpbnQ4QXJyYXkoYSkpKTtpZihhPWhjKGEsYy5jLFtjLmhdKSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGEpO2E9RXJyb3IoIk1QRCBwYXJzZSBmYWlsdXJlLiIpO2EudHlwZT0iZGFzaCI7cmV0dXJuIFByb21pc2UucmVqZWN0KGEpfSl9CmZ1bmN0aW9uIHNkKGEpe3RoaXMuYT1udWxsO3RoaXMuaD1hO3RoaXMuYz10aGlzLmc9dGhpcy5mPW51bGw7dGhpcy5pPSExO3RoaXMuaj10aGlzLmI9bnVsbH07ZnVuY3Rpb24gdGQoYSxiKXt0aGlzLmE9YTt0aGlzLmI9Ynx8bnVsbH10ZC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuYSYmKHRoaXMuYS5OYSgpLHRoaXMuYT1udWxsKTt0aGlzLmI9bnVsbH07dGQucHJvdG90eXBlLmNyZWF0ZT1mdW5jdGlvbihhLGIpe3ZhciBjPW51bGw7YiYmKGM9bmV3IHhiLGMuWj1iKTtyZXR1cm4hdGhpcy5iJiZ0aGlzLmE/dGhpcy5hLmZldGNoKGMsbnVsbCxhLG51bGwsbnVsbCwiaW5pdCIpOlByb21pc2UucmVzb2x2ZSh0aGlzLmIpfTt0ZC5wcm90b3R5cGUuYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9O3RkLnByb3RvdHlwZS5nZXRGYWlsb3ZlclVyaT10ZC5wcm90b3R5cGUuYztmdW5jdGlvbiB1ZChhLGIpe3RoaXMuc2VnbWVudE9yaWdpbmFsRW5kVGltZT1hO3RoaXMuZ2FwRGlzdGFuY2U9Yn1mdW5jdGlvbiB2ZChhLGIsYyxkLGUpe3RoaXMuc3RhcnRUaW1lPWE7dGhpcy5lbmRUaW1lPWI7dGhpcy51cmw9Yzt0aGlzLnVuc2NhbGVkU3RhcnRUaW1lPW51bGwhPWQ/ZDpudWxsO3RoaXMuZGVidWdJbmZvPSh0aGlzLnRpbWVzY2FsZWRHYXBJbmZvPWV8fG51bGwpP3tlbmRUaW1lOnRoaXMudGltZXNjYWxlZEdhcEluZm8uc2VnbWVudE9yaWdpbmFsRW5kVGltZSxkZWx0YTp0aGlzLnRpbWVzY2FsZWRHYXBJbmZvLmdhcERpc3RhbmNlfTpudWxsfWZ1bmN0aW9uIHdkKGEsYixjKXtyZXR1cm4gbmV3IHZkKGIsYyxhLnVybCxudWxsIT1hLnVuc2NhbGVkU3RhcnRUaW1lP2EudW5zY2FsZWRTdGFydFRpbWU6dm9pZCAwLGEudGltZXNjYWxlZEdhcEluZm8pfQpmdW5jdGlvbiBDYihhLGIpe2Zvcih2YXIgYz1hLmxlbmd0aC0xOzA8PWM7LS1jKXt2YXIgZD1hW2NdO2lmKGI+PWQuc3RhcnRUaW1lJiYobnVsbD09ZC5lbmRUaW1lfHxiPGQuZW5kVGltZSkpcmV0dXJuIGN9cmV0dXJuLTF9ZnVuY3Rpb24geGQoYSxiKXtyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIHdkKGEsYS5zdGFydFRpbWUrYixudWxsIT1hLmVuZFRpbWU/YS5lbmRUaW1lK2I6bnVsbCl9KX07ZnVuY3Rpb24geWQoYSxiLGMsZCl7Zm9yKHZhciBlPWIuYSxmPVtdLGc9MDtnPGQ7KytnKXt2YXIgaD1nK2Msaz0oaC0xKSplLkcsbD1rL2UuYixtPShrK2UuRykvZS5iLGg9emQoYSxiLGUuaStoLTEsayk7aWYoIWgpcmV0dXJuIG51bGw7Zi5wdXNoKG5ldyB2ZChsLG0saCxrKSl9cmV0dXJuIGZ9ZnVuY3Rpb24gemQoYSxiLGMsZCl7aWYoIWIuYSlyZXR1cm4gbnVsbDt2YXIgZT1iLmEuZztpZighZSlyZXR1cm4gYi5iYXNlVXJsP25ldyBJKGEsYi5iYXNlVXJsLDAsbnVsbCk6bnVsbDtjPUFkKGUsYi5pZCxjLGIuYmFuZHdpZHRoLGQpO2lmKCFjKXJldHVybiBudWxsO2I9aWQoYi5iYXNlVXJsLGMpO3JldHVybiBuZXcgSShhLGIsMCxudWxsKX0KZnVuY3Rpb24gQWQoYSxiLGMsZCxlKXt2YXIgZj17UmVwcmVzZW50YXRpb25JRDpiLE51bWJlcjpjLEJhbmR3aWR0aDpkLFRpbWU6ZX07YT1hLnJlcGxhY2UoL1wkKFJlcHJlc2VudGF0aW9uSUR8TnVtYmVyfEJhbmR3aWR0aHxUaW1lKT8oPzolMChbMC05XSspZCk/XCQvZyxmdW5jdGlvbihhLGIsYyl7aWYoIiQkIj09YSlyZXR1cm4iJCI7dmFyIGQ9ZltiXTtpZihudWxsPT1kKXJldHVybiBhOyJSZXByZXNlbnRhdGlvbklEIj09YiYmYyYmKGM9dm9pZCAwKTthPWQudG9TdHJpbmcoKTtjPXdpbmRvdy5wYXJzZUludChjLDEwKXx8MTtjPU1hdGgubWF4KDAsYy1hLmxlbmd0aCk7cmV0dXJuIEFycmF5KGMrMSkuam9pbigiMCIpK2F9KTt0cnl7cmV0dXJuIG5ldyBKKGEpfWNhdGNoKGcpe2lmKGcgaW5zdGFuY2VvZiBVUklFcnJvcilyZXR1cm4gbnVsbDt0aHJvdyBnO319CmZ1bmN0aW9uIEJkKGEsYixjKXt2YXIgZD0wO2MqPWI7YT1hLmE7Zm9yKHZhciBlPVtdLGY9MDtmPGEubGVuZ3RoJiZhW2ZdLmR1cmF0aW9uOysrZil7dmFyIGc9YVtmXS5zdGFydFRpbWUsZz1udWxsIT1nP2c6ZCxoPWFbZl0uYXx8MDtpZigwPmgpaWYoaD1hW2ZdLmR1cmF0aW9uLGYrMT09PWEubGVuZ3RoKXZhciBrPWFbMF0uc3RhcnRUaW1lK2MtZyxoPU1hdGguY2VpbChrL2gpLTE7ZWxzZSBoPU1hdGguY2VpbCgoYVtmKzFdLnN0YXJ0VGltZS1nKS9oKS0xO2lmKDA8ZS5sZW5ndGgmJmchPWQpe3ZhciBrPWctZCxsPWVbZS5sZW5ndGgtMV07bC50aW1lc2NhbGVkR2FwSW5mbz1uZXcgdWQoZC9iLGsvYik7bC5lbmQ9Z31mb3Ioaz0wO2s8PWg7KytrKWQ9ZythW2ZdLmR1cmF0aW9uLGUucHVzaCh7c3RhcnQ6ZyxlbmQ6ZH0pLGc9ZH1yZXR1cm4gZX07ZnVuY3Rpb24gQ2QoKXt9CkNkLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPW51bGw7dHJ5e2E6e3ZhciBnPVtdLGg9bmV3IEVhKGEpLGs9dChoKTtpZigxOTM2Mjg2ODQwIT10KGgpKWY9bnVsbDtlbHNlezE9PWsmJihrPUlhKGgpKTt2YXIgbD1IYShoKTtMYShoLDMpO0xhKGgsNCk7dmFyIG09dChoKTtpZigwPT1tKWY9bnVsbDtlbHNle3ZhciBwLHY7MD09bD8ocD10KGgpLHY9dChoKSk6KHA9SWEoaCksdj1JYShoKSk7TGEoaCwyKTt2YXIgdz1oLmIuZ2V0VWludDE2KGguYSxoLmMpO2guYSs9MjthPXA7Yj1iK2srdjtmb3Iodj1rPTA7djx3O3YrKyl7dmFyIEI9dChoKTtwPShCJjIxNDc0ODM2NDgpPj4+MzE7dmFyIGw9QiYyMTQ3NDgzNjQ3LFA9dChoKTt0KGgpO2lmKDE9PXApe2Y9bnVsbDticmVhayBhfXZhciBiYTtiYT0wPT12JiZlP2U6bmV3IEkoZCxjLGIsYitsLTEpO3A9YS9tO3ZhciBjYT0oYStQKS9tOzA9PT12JiYoaz1wKTtnLnB1c2gobmV3IHZkKHAtayxjYS1rLGJhKSk7CmErPVA7Yis9bH1nLmI9bTtmPWd9fX19Y2F0Y2godGEpe2lmKCEodGEgaW5zdGFuY2VvZiBSYW5nZUVycm9yKSl0aHJvdyB0YTt9cmV0dXJuIGZ9O2Z1bmN0aW9uIFIoYSxiKXt0aGlzLmE9YTt0aGlzLnJhPTA7dGhpcy5iPWI7dGhpcy5oPVtdO3RoaXMuZWI9ITE7dGhpcy5CPWZ1bmN0aW9uKCl7fX1SLnByb3RvdHlwZS5KPWZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLmhbdGhpcy5oLmxlbmd0aC0xXX07Ui5wcm90b3R5cGUubGFzdFBvbGxIYWRDaGFuZ2VzPVIucHJvdG90eXBlLko7Ui5wcm90b3R5cGUuST1mdW5jdGlvbigpe3ZhciBhPXRoaXMuaCxiPWEubGFzdEluZGV4T2YoITApO2lmKDE+YilyZXR1cm4gMDthPWEubGFzdEluZGV4T2YoITAsYi0xKTtyZXR1cm4gMD5hPzA6Yi1hLTF9O1IucHJvdG90eXBlLmdldEZldGNoZXNCZXR3ZWVuUmVjZW50Q2hhbmdlcz1SLnByb3RvdHlwZS5JO1IucHJvdG90eXBlLkE9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5mbG9vcigodGhpcy5oLmxlbmd0aC0xLXRoaXMuaC5sYXN0SW5kZXhPZighMCkpLzIpfTtSLnByb3RvdHlwZS5nZXRDb25zZWN1dGl2ZVVwZGF0ZXNXaXRob3V0Q2hhbmdlcz1SLnByb3RvdHlwZS5BOwpSLnByb3RvdHlwZS5IPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaC5sZW5ndGgtMS10aGlzLmgubGFzdEluZGV4T2YoITEpfTtSLnByb3RvdHlwZS5nZXRDb25zZWN1dGl2ZVVwZGF0ZXNXaXRoQ2hhbmdlcz1SLnByb3RvdHlwZS5IO1IucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmE9bnVsbH07Ui5wcm90b3R5cGUubGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5sZW5ndGh9O1IucHJvdG90eXBlLmw9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5hfHxbXSkuc2xpY2UoKX07Ui5wcm90b3R5cGUuZ2V0U2VnbWVudHM9Ui5wcm90b3R5cGUubDtmdW5jdGlvbiBTKGEpe2lmKDA9PWEuYS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlNlZ21lbnRJbmRleDogVGhlcmUgaXMgbm8gZmlyc3QgU2VnbWVudFJlZmVyZW5jZS4iKTtyZXR1cm4gYS5hWzBdfQpSLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7aWYoMD09dGhpcy5hLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiU2VnbWVudEluZGV4OiBUaGVyZSBpcyBubyBsYXN0IFNlZ21lbnRSZWZlcmVuY2UuIik7cmV0dXJuIHRoaXMuYVt0aGlzLmEubGVuZ3RoLTFdfTtSLnByb3RvdHlwZS5sYXN0PVIucHJvdG90eXBlLnc7bj1SLnByb3RvdHlwZTtuLmdldD1mdW5jdGlvbihhKXtpZigwPmF8fGE+PXRoaXMuYS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlNlZ21lbnRJbmRleDogVGhlIHNwZWNpZmllZCBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuIik7cmV0dXJuIHRoaXMuYVthXX07bi5maW5kSW5kZXhCeVN0YXJ0VGltZT1mdW5jdGlvbihhKXtyZXR1cm4gU2hha2FTZWdtZW50UmVmZXJlbmNlSGVscGVyLmZpbmRJbmRleEJ5U3RhcnRUaW1lKHRoaXMuYSxhKX07bi5pYj1mdW5jdGlvbihhKXtEZCh0aGlzLGEpO3JldHVybiEwfTsKZnVuY3Rpb24gRGQoYSxiKXthLnJhIT1iLnJhJiYoYj1uZXcgUih4ZChiLmEsYS5yYS1iLnJhKSxiLmIpKTtpZigwPT1hLmxlbmd0aCgpKWEuYT1iLmEuc2xpY2UoMCk7ZWxzZSBpZigwIT1iLmxlbmd0aCgpJiZudWxsIT1hLncoKS5lbmRUaW1lKWlmKG51bGwhPWIudygpLmVuZFRpbWUmJmIudygpLmVuZFRpbWU8YS53KCkuZW5kVGltZSlWaWRlb1BsYXllclNoYWthR2xvYmFsQ29uZmlnLmdldEJvb2woImZpeF9tYW5pZmVzdF93cmFwcGVkIiwhMCk/Yi53KCkuZW5kVGltZTxTKGEpLnN0YXJ0VGltZSYmKGEuZWI9ITApOmEuZWI9ITA7ZWxzZXthLmViPSExO2lmKGEudygpLmVuZFRpbWU8PVMoYikuc3RhcnRUaW1lKXZhciBjPXdkKGEudygpLGEudygpLnN0YXJ0VGltZSxTKGIpLnN0YXJ0VGltZSksYz1hLmEuc2xpY2UoMCwtMSkuY29uY2F0KFtjXSk7ZWxzZXt2YXIgZDtmb3IoZD0wO2Q8YS5hLmxlbmd0aCYmIShhLmFbZF0uZW5kVGltZT49UyhiKS5zdGFydFRpbWUpOysrZCk7YS5hW2RdLnN0YXJ0VGltZTwKUyhiKS5zdGFydFRpbWU/KGM9d2QoYS5hW2RdLGEuYVtkXS5zdGFydFRpbWUsUyhiKS5zdGFydFRpbWUpLGM9YS5hLnNsaWNlKDAsZCkuY29uY2F0KFtjXSkpOihTKGEpLnN0YXJ0VGltZT5TKGIpLnN0YXJ0VGltZXx8UyhiKSxjPWEuYS5zbGljZSgwLGQpKX1hLmE9Yy5jb25jYXQoYi5hKTthLkIoYi5hKX19bi5FYT1mdW5jdGlvbihhKXt2YXIgYj1hLXRoaXMucmE7aWYoMD09YilyZXR1cm4gMDt0aGlzLmE9eGQodGhpcy5hLGIpO3RoaXMucmE9YTtyZXR1cm4gYn07bi5nYj1mdW5jdGlvbigpe3JldHVybiAwPHRoaXMubGVuZ3RoKCk/e3N0YXJ0OlModGhpcykuc3RhcnRUaW1lLGVuZDp0aGlzLncoKS5lbmRUaW1lfTp7c3RhcnQ6MCxlbmQ6MH19O24uWmI9ZnVuY3Rpb24oKXtyZXR1cm4gZ2V0U2Vla1JhbmdlR2Fwc0Zyb21TaGFrYVJlZmVyZW5jZXModGhpcy5hLHRoaXMuYil9O1IucHJvdG90eXBlLmdldFNlZWtSYW5nZUdhcHM9Ui5wcm90b3R5cGUuWmI7CmZ1bmN0aW9uIEVkKGEsYil7dmFyIGM9W107aWYobnVsbD09PWJ8fHZvaWQgMD09PWIpYz1hLmE7ZWxzZXtmb3IodmFyIGQ9MDtkPGEuYS5sZW5ndGg7ZCsrKXt2YXIgZT1hLmFbYS5hLmxlbmd0aC1kLTFdO2Uuc3RhcnRUaW1lPj1iJiZjLnB1c2goZSl9Yy5yZXZlcnNlKCl9cmV0dXJuIGMubWFwKGZ1bmN0aW9uKGEsYil7cmV0dXJuIEZkKGEsYil9LmJpbmQoYSkpfWZ1bmN0aW9uIEZkKGEsYil7cmV0dXJue3N0YXJ0VGltZTphLnN0YXJ0VGltZSxlbmRUaW1lOm51bGw9PT1hLmVuZFRpbWU/TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOmEuZW5kVGltZSxzZWdtZW50SUQ6YixyZXF1ZXN0SW5mbzpvZChhLnVybCl9fWZ1bmN0aW9uIEdkKGEsYil7YS5CPWJ9ZnVuY3Rpb24gSGQoYSl7YS5CPWZ1bmN0aW9uKCl7fX07ZnVuY3Rpb24gVChhLGIsYyxkLGUpe1IuY2FsbCh0aGlzLGEsYik7dGhpcy5qPWM7dGhpcy5EPWQ7dGhpcy5pPWU7dGhpcy5kdXJhdGlvbj10aGlzLmouYnx8dGhpcy5qLmEucmVkdWNlKGZ1bmN0aW9uKGEsYil7cmV0dXJuIG51bGw9PWIuZHVyYXRpb24/TmFOOmErYi5kdXJhdGlvbn0sMCl8fDA7dGhpcy5jPXRoaXMudj10aGlzLmc9bnVsbDtJZCh0aGlzKX1yKFQsUik7VC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuRD10aGlzLmo9bnVsbDtSLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyl9O1QucHJvdG90eXBlLmliPWZ1bmN0aW9uKGEpe2lmKCEoYSBpbnN0YW5jZW9mIFQpKXJldHVybiExO0RkKHRoaXMsYSk7dGhpcy5kdXJhdGlvbj1NYXRoLm1heCh0aGlzLmR1cmF0aW9uLGEuZHVyYXRpb24pO251bGw9PXRoaXMuZz8odGhpcy5pPWEuaSxJZCh0aGlzKSk6SmQodGhpcyk7cmV0dXJuITB9OwpmdW5jdGlvbiBJZChhKXtKZChhKTtpZigwIT1hLmxlbmd0aCgpKXthLmxlbmd0aCgpO3ZhciBiPW51bGwhPWEudygpLmVuZFRpbWU/YS53KCkuZW5kVGltZTphLncoKS5zdGFydFRpbWU7aWYoYS5qLmM+YS5pKWEuZz1iO2Vsc2V7dmFyIGM9YS5pLShhLmouYythLkQuc3RhcnQpOzA+Yz9hLmc9YjpjPE1hdGgubWF4KGEudygpLnN0YXJ0VGltZSxhLncoKS5lbmRUaW1lfHwwKT8oYS53KCksYS5nPWIpOmEuZz1jfWEudj1hLncoKS5zdGFydFRpbWU7YS5jPVMoYSkuc3RhcnRUaW1lfX1ULnByb3RvdHlwZS5FYT1mdW5jdGlvbihhKXthPVIucHJvdG90eXBlLkVhLmNhbGwodGhpcyxhKTtNYXRoLm1pbi5hcHBseShudWxsLHRoaXMuYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEuZW5kVGltZX0pLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS5lbmRUaW1lLWEuc3RhcnRUaW1lfSkpO251bGwhPXRoaXMuZyYmKHRoaXMudis9YSx0aGlzLmMrPWEsdGhpcy5nKz1hKTtyZXR1cm4gYX07ClQucHJvdG90eXBlLmdiPWZ1bmN0aW9uKCl7cmV0dXJuIEtkKHRoaXMsKERhdGUubm93KCkrRGEpLzFFMyl9OwpmdW5jdGlvbiBLZChhLGIpe0pkKGEpO2lmKG51bGwhPWEuai5mKWlmKG51bGw9PWEuZylhLmxlbmd0aCgpO2Vsc2V7Zm9yKHZhciBjPWEuZysoYi1hLmkpLGQ9MCxlPTA7ZTxhLmEubGVuZ3RoOysrZSl7dmFyIGY9bnVsbDtlPGEuYS5sZW5ndGgtMT9mPWEuYVtlKzFdLmVuZFRpbWU6KGY9YS5hW2VdLGY9bnVsbCE9Zi5lbmRUaW1lP2YuZW5kVGltZSsoZi5lbmRUaW1lLWYuc3RhcnRUaW1lKTpudWxsKTtpZihudWxsIT1mJiZmPGMtYS5qLmYpKytkO2Vsc2UgYnJlYWt9MDxkJiZhLmEuc3BsaWNlKDAsZCl9aWYobnVsbD09YS5nfHxudWxsPT1hLnZ8fG51bGw9PWEuYylyZXR1cm57c3RhcnQ6MCxlbmQ6MH07Yz1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7YS5kdXJhdGlvbiYmKGM9YS5kdXJhdGlvbik7ZD1iLWEuaTtlPWEuZytkO251bGwhPWEuai5mJiYoZT1lLWEuYy1hLmouZiwwPGUmJihhLmMrPWUpKTthLmM9TWF0aC5taW4oYS5jLGMpO2Q9YS52K2Q7aWYoZDxhLmMpcmV0dXJue3N0YXJ0OmEuYywKZW5kOmEuY307ZD0wPGEubGVuZ3RoKCk/bnVsbCE9YS53KCkuZW5kVGltZT9NYXRoLm1pbihkLGEudygpLmVuZFRpbWUpOmQ6YS5jO2Q9TWF0aC5tYXgoZCxhLmMpO2Q9TWF0aC5taW4oZCxjKTtyZXR1cm57c3RhcnQ6YS5jLGVuZDpkfX1mdW5jdGlvbiBKZChhKXtpZihhLmR1cmF0aW9uKXtmb3IodmFyIGI9MCxjPWEuYS5sZW5ndGgtMTswPD1jOy0tYylpZihhLmFbY10uc3RhcnRUaW1lPmEuZHVyYXRpb24pKytiO2Vsc2UgYnJlYWs7MDxiJiZhLmEuc3BsaWNlKC1iKX19O2Z1bmN0aW9uIExkKGEsYixjLGQsZSl7dmFyIGY9MSxnPTAsaDtpZihhLmM+ZCloPW51bGw7ZWxzZXt2YXIgaz1hLml8fDAsbD1hLmZ8fDA7aD1jLmE7aD1oLkcvaC5iO3ZhciBtPWQtKGEuYytiLnN0YXJ0KTswPm0/aD1udWxsOihsPW0tMipoLWwsMD5sJiYobD0wKSxsPU1hdGguY2VpbChsL2gpKmgsbS09aCwwPm0/aD1udWxsOihrPU1hdGguZmxvb3IobS9oKSpoLWssMD5rJiYoaz0wKSxrPU1hdGguZmxvb3Ioay9oKSpoLGg9e1hiOmwvaCsxLGN1cnJlbnQ6KGs+PWw/azpsKS9oKzF9KSl9aCYmKGY9aC5YYixnPWguY3VycmVudC1oLlhiKzEpO2Y9eWQoZSxjLGYsZyk7aWYobnVsbD09Zil0aHJvdyBhPUVycm9yKCJGYWlsZWQgdG8gZ2VuZXJhdGUgU2VnbWVudFJlZmVyZW5jZXMuIiksYS50eXBlPSJzdHJlYW0iLGE7VC5jYWxsKHRoaXMsZixjLmEuYnx8MSxhLGIsZCk7dGhpcy5DPWM7dGhpcy5zPXRoaXMuZj0wPHRoaXMubGVuZ3RoKCk/YS5jK2Iuc3RhcnQrdGhpcy53KCkuZW5kVGltZToKbnVsbDt0aGlzLm89aD9oLmN1cnJlbnQrMTpudWxsO3RoaXMuRj1lfXIoTGQsVCk7TGQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLkY9dGhpcy5DPW51bGw7VC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpfTtMZC5wcm90b3R5cGUuaWI9ZnVuY3Rpb24oYSl7aWYobnVsbCE9dGhpcy5mfHwhKGEgaW5zdGFuY2VvZiBMZCl8fG51bGw9PWEuZilyZXR1cm4hMTt0aGlzLmY9YS5mO3RoaXMucz1hLnM7dGhpcy5vPWEubzt0aGlzLmk9YS5pO3RoaXMuZHVyYXRpb249YS5kdXJhdGlvbjtEZCh0aGlzLGEpO01kKHRoaXMsKERhdGUubm93KCkrRGEpLzFFMyk7SWQodGhpcyk7cmV0dXJuITB9O0xkLnByb3RvdHlwZS5FYT1mdW5jdGlvbihhKXthPVQucHJvdG90eXBlLkVhLmNhbGwodGhpcyxhKTtudWxsIT10aGlzLmYmJih0aGlzLmYrPWEsdGhpcy5zKz1hKTtyZXR1cm4gYX07CkxkLnByb3RvdHlwZS5nYj1mdW5jdGlvbigpe3ZhciBhPShEYXRlLm5vdygpK0RhKS8xRTM7TWQodGhpcyxhKTtyZXR1cm4gS2QodGhpcyxhKX07ZnVuY3Rpb24gTWQoYSxiKXtpZihudWxsIT1hLmYmJm51bGwhPWEucyYmbnVsbCE9YS5vKXt2YXIgYz1hLkMuYSxjPWMuRy9jLmIsZD1NYXRoLmZsb29yKChhLnMrKGItYS5pKS1hLmYpL2MpO2lmKDAhPWQpe3ZhciBlPXlkKGEuRixhLkMsYS5vLGQpO0FycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGEuYSx4ZChlLGEucmEpKTthLmYrPWQqYzthLm8rPWR9fX07ZnVuY3Rpb24gTmQoYSxiLGMsZCxlKXt0aGlzLmc9YTt0aGlzLmY9Yjt0aGlzLmM9Yzt0aGlzLmk9ZDt0aGlzLmE9bnVsbDt0aGlzLmg9ZX1OZC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuaD10aGlzLmM9dGhpcy5mPXRoaXMuZz1udWxsO3RoaXMuYSYmKHRoaXMuYS5kZXN0cm95KCksdGhpcy5hPW51bGwpfTsKTmQucHJvdG90eXBlLmNyZWF0ZT1mdW5jdGlvbigpe2lmKHRoaXMuYSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYSk7aWYoImR5bmFtaWMiPT10aGlzLmcudHlwZSl0cnl7dGhpcy5hPW5ldyBMZCh0aGlzLmcsdGhpcy5mLHRoaXMuYyx0aGlzLmksdGhpcy5oKX1jYXRjaChhKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoYSl9ZWxzZXt2YXIgYjtiPXRoaXMuYy5hO2lmKGI9eWQodGhpcy5oLHRoaXMuYywxLE1hdGguY2VpbCh0aGlzLmYuZHVyYXRpb24vKGIuRy9iLmIpKSkpe2lmKDA8Yi5sZW5ndGgpe3ZhciBjPWJbYi5sZW5ndGgtMV07YltiLmxlbmd0aC0xXT13ZChjLGMuc3RhcnRUaW1lLHRoaXMuZi5kdXJhdGlvbil9Yj1uZXcgUihiLHRoaXMuYy5hLmJ8fDEpfWVsc2UgYj1udWxsO3RoaXMuYT1iO2lmKCF0aGlzLmEpcmV0dXJuIGI9RXJyb3IoIkZhaWxlZCB0byBnZW5lcmF0ZSBTZWdtZW50UmVmZXJlbmNlcyIpLGIudHlwZT0ic3RyZWFtIixQcm9taXNlLnJlamVjdChiKX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYSl9OwpOZC5wcm90b3R5cGUuYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9O2Z1bmN0aW9uIE9kKGEsYixjLGQsZSl7dGhpcy5mPWE7dGhpcy5jPWI7dGhpcy5oPWM7dGhpcy5hPW51bGw7dGhpcy5pPWQ7dGhpcy5nPWV9T2QucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmc9dGhpcy5oPXRoaXMuYz10aGlzLmY9bnVsbDt0aGlzLmEmJih0aGlzLmEuZGVzdHJveSgpLHRoaXMuYT1udWxsKX07Ck9kLnByb3RvdHlwZS5jcmVhdGU9ZnVuY3Rpb24oKXtpZih0aGlzLmEpcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmEpO3ZhciBhPXRoaXMuaC5iLGI9W107YS5hJiYoYj1CZChhLmEsYS5ifHwxLHRoaXMuYy5kdXJhdGlvbnx8MCkpO3ZhciBjPTA7YS5HJiZhLmg/Yz0oYS5oLTEpKmEuRzowPGIubGVuZ3RoJiYoYz1iWzBdLnN0YXJ0LShhLmZ8fDApKTt2YXIgZD1jLGU9YS5jLmxlbmd0aDswPGIubGVuZ3RoJiZiLmxlbmd0aCE9YS5jLmxlbmd0aCYmKGU9TWF0aC5taW4oYi5sZW5ndGgsYS5jLmxlbmd0aCkpO2Zvcih2YXIgZj1bXSxnPTA7ZzxlOysrZyl7dmFyIGg9YS5jW2ddLGs9Yy9hLmIsbD1udWxsLG09bnVsbCxwO2EuRz8obD1jK2EuRyxtPWwvYS5iKTowPGIubGVuZ3RoPyhwPWJbZ10udGltZXNjYWxlZEdhcEluZm8sbD1iW2ddLmVuZC0oYS5mfHwwKSxtPWwvYS5iKToobT1rK3RoaXMuYy5kdXJhdGlvbixsPW0qYS5iKTt2YXIgYz1sLGw9MCx2PW51bGw7aC5hJiYobD1oLmEuR2EsCnY9aC5hLmVuZCk7bT1NYXRoLm1pbih0aGlzLmMuZHVyYXRpb24rZC9hLmIsbSk7Zi5wdXNoKG5ldyB2ZChrLG0sbmV3IEkodGhpcy5nLGguYixsLHYpLG51bGwscHx8bnVsbCkpfSJkeW5hbWljIj09dGhpcy5mLnR5cGU/dGhpcy5hPW5ldyBUKGYsYS5ifHwxLHRoaXMuZix0aGlzLmMsdGhpcy5pKTp0aGlzLmE9bmV3IFIoZixhLmJ8fDEpO3JldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5hKX07T2QucHJvdG90eXBlLmI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTtmdW5jdGlvbiBQZChhLGIsYyxkLGUpe3RoaXMuYz1hO3RoaXMuZj1iO3RoaXMuZz1jO3RoaXMuaT1kO3RoaXMuYT1udWxsO3RoaXMuaD1lfVBkLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5oPXRoaXMuZz10aGlzLmY9dGhpcy5jPW51bGw7dGhpcy5hJiYodGhpcy5hLmRlc3Ryb3koKSx0aGlzLmE9bnVsbCl9OwpQZC5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKCl7aWYodGhpcy5hKXJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5hKTtmb3IodmFyIGE9dGhpcy5nLmEsYj1CZChhLmEsYS5ifHwxLHRoaXMuZi5kdXJhdGlvbnx8MCksYz1bXSxkPTA7ZDxiLmxlbmd0aDsrK2Qpe3ZhciBlPWJbZF0uc3RhcnQsZj1iW2RdLnRpbWVzY2FsZWRHYXBJbmZvLGc9ZS9hLmIsaD1iW2RdLmVuZC9hLmIsaz16ZCh0aGlzLmgsdGhpcy5nLGQrYS5pLGUpO2lmKCFrKXJldHVybiBhPUVycm9yKCJGYWlsZWQgdG8gZ2VuZXJhdGUgbWVkaWEgVVJMLiIpLGEudHlwZT0iZGFzaCIsUHJvbWlzZS5yZWplY3QoYSk7dmFyIGw9KGEuaHx8MCkvYS5iO2MucHVzaChuZXcgdmQoZy1sLGgtbCxrLGUsZnx8bnVsbCkpfSJkeW5hbWljIj09dGhpcy5jLnR5cGU/dGhpcy5hPW5ldyBUKGMsYS5ifHwxLHRoaXMuYyx0aGlzLmYsdGhpcy5pKTp0aGlzLmE9bmV3IFIoYyxhLmJ8fDEpO3JldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5hKX07ClBkLnByb3RvdHlwZS5iPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYX07ZnVuY3Rpb24gUWQoKXt0aGlzLlM9UmQrKzt0aGlzLmlkPXRoaXMuWD10aGlzLkw9bnVsbDt0aGlzLmE9MDt0aGlzLmhlaWdodD10aGlzLndpZHRoPXRoaXMuYmFuZHdpZHRoPW51bGw7dGhpcy5jb2RlY3M9dGhpcy5taW1lVHlwZT0iIjt0aGlzLmY9dGhpcy5mYlF1YWxpdHlDbGFzcz10aGlzLmZiUXVhbGl0eUxhYmVsPW51bGw7dGhpcy5mcmFtZVJhdGU9IiI7dGhpcy5zd2l0Y2hSZWFzb249dGhpcy5oPXRoaXMuZz10aGlzLmM9bnVsbDt0aGlzLmI9W107dGhpcy5qYT0hMTt0aGlzLlk9ITB9dmFyIFJkPTA7UWQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLkwmJih0aGlzLkwuZGVzdHJveSgpLHRoaXMuTD1udWxsKTt0aGlzLlgmJih0aGlzLlguZGVzdHJveSgpLHRoaXMuWD1udWxsKX07ZnVuY3Rpb24gU2QoYSl7cmV0dXJuIGEubWltZVR5cGUuc3BsaXQoIi8iKVswXX0KZnVuY3Rpb24gVGQoYSl7dmFyIGI9YS5taW1lVHlwZXx8IiI7YS5jb2RlY3MmJihiKz0nOyBjb2RlY3M9IicrYS5jb2RlY3MrJyInKTtyZXR1cm4gYn1mdW5jdGlvbiBVZCgpe3RoaXMuUz1WZCsrO3RoaXMuaWQ9bnVsbDt0aGlzLmNvbnRlbnRUeXBlPXRoaXMubGFuZz0iIjt0aGlzLmY9dGhpcy5iPSExO3RoaXMuYz1udWxsO3RoaXMudT1bXTt0aGlzLmE9W119dmFyIFZkPTA7VWQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMudS5sZW5ndGg7KythKXRoaXMudVthXS5kZXN0cm95KCk7dGhpcy5hPXRoaXMudT1udWxsfTtmdW5jdGlvbiBhZShhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5hLmxlbmd0aDsrK2Mpe3ZhciBkPW5ldyBiZTtkLmlkPWEuUztkLmE9YS5hW2NdO2QuY29udGVudFR5cGU9YS5jb250ZW50VHlwZTtkLmI9YS51Lmxlbmd0aD9UZChhLnVbMF0pOiIiO2IucHVzaChkKX1yZXR1cm4gYn0KZnVuY3Rpb24gY2UoKXt0aGlzLmlkPW51bGw7dGhpcy5zdGFydD0wO3RoaXMuZHVyYXRpb249bnVsbDt0aGlzLmE9W119Y2UucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuYS5sZW5ndGg7KythKXRoaXMuYVthXS5kZXN0cm95KCk7dGhpcy5hPW51bGx9O2Z1bmN0aW9uIGRlKCl7dGhpcy5zPXRoaXMubz10aGlzLmI9ITE7dGhpcy5pPXRoaXMuZz10aGlzLmY9bnVsbDt0aGlzLmM9MDt0aGlzLmE9W107dGhpcy5oPSExO3RoaXMubD0ibm9uZSI7dGhpcy5qPW51bGx9ZGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuYS5sZW5ndGg7KythKXRoaXMuYVthXS5kZXN0cm95KCk7dGhpcy5hPW51bGx9O2Z1bmN0aW9uIGJlKCl7dGhpcy5pZD0wO3RoaXMuYT1udWxsO3RoaXMuYj10aGlzLmNvbnRlbnRUeXBlPSIifTtmdW5jdGlvbiBVKGEsYixjLGQsZSxmLGcsaCxrLGwsbSxwLHYpe0UuY2FsbCh0aGlzLGEpO3RoaXMuYj1iO3RoaXMuYT1jO3RoaXMuYz1uZXcgcmIoYyxkLGUsZix0aGlzLGgpO3RoaXMuQ2E9aDt0aGlzLnM9e307dGhpcy5uYT1mO3RoaXMub2E9MDt0aGlzLmJhPXRoaXMuZz10aGlzLmY9bnVsbDt0aGlzLmlhPSExO3RoaXMudj10aGlzLlU9bnVsbDt0aGlzLko9ITE7dGhpcy4kPTA7dGhpcy5hYT0hMTt0aGlzLkM9bnVsbDt0aGlzLlA9dGhpcy5WPXRoaXMuaD0hMTt0aGlzLkY9bmV3IEc7dGhpcy5EPXRoaXMuTT10aGlzLkI9ITE7dGhpcy5JPTA7dGhpcy5XPTE1O3RoaXMueGE9dGhpcy5rYT10aGlzLk49ITE7dGhpcy5SPWc7dGhpcy5tYT0hMTt0aGlzLm09bnVsbDt0aGlzLnlhPSExO3RoaXMuaGE9bnVsbDt0aGlzLmk9bXx8bnVsbDt0aGlzLks9cHx8bnVsbDt0aGlzLmw9dnx8bnVsbDt0aGlzLk89bnVsbDt0aGlzLlQ9ITE7dGhpcy50YT17fTt0aGlzLndhPWs7dGhpcy5qPW51bGw7CnRoaXMuY2E9ITE7dGhpcy51YT0wO3RoaXMucGE9ZT9lLnNwbGl0KCI7IilbMF06IiI7dGhpcy5IPSExO3RoaXMuZ2E9bDt0aGlzLkE9dGhpcy5vPW51bGx9cihVLEUpO1UucHJvdG90eXBlLnZhPWZ1bmN0aW9uKCl7cmV0dXJue1NvdXJjZUJ1ZmZlck1hbmFnZXI6dGhpcy5jfX07VS5wcm90b3R5cGUuZ2V0RGVidWc9VS5wcm90b3R5cGUudmE7ZnVuY3Rpb24gZWUoYSxiKXtyZXR1cm4gbmV3IFZpZGVvUGxheWVyQml0cmF0ZUVzdGltYXRvcihuZXcgdShhLmEuZ2V0TnVtYmVyKCJsaXZlX2JpdHJhdGVfZXN0aW1hdGVzX2hhbGZfbGlmZSIsMikpLGIsYS5hLmdldE51bWJlcigibGl2ZV9iaXRyYXRlX2VzdGltYXRlc19taW5pbXVtX3NhbXBsZV9jb3VudCIsMSksYS5hLmdldE51bWJlcigibGl2ZV9iaXRyYXRlX2VzdGltYXRlc19sYXJnZV9zYW1wbGVfd2VpZ2h0X2ZhY3RvciIsMTApKX0KVS5wcm90b3R5cGUuZGE9ZnVuY3Rpb24oYSl7bnVsbCE9YS5pbml0aWFsU3RyZWFtQnVmZmVyU2l6ZSYmKHRoaXMuST1OdW1iZXIoYS5pbml0aWFsU3RyZWFtQnVmZmVyU2l6ZSkpO3ZhciBiPXRoaXMuYS5nZXROdW1iZXIoImluaXRpYWxfc3RyZWFtX2J1ZmZlcl9zaXplX2Zvcl92aWRlb19zdHJlYW0iLDApOzA8YiYmLTEhPT10aGlzLnBhLmluZGV4T2YoInYiKSYmKHRoaXMuST1iKTtudWxsIT1hLmR5bmFtaWNTdHJlYW1CdWZmZXJTaXplJiYodGhpcy4kPU51bWJlcihhLmR5bmFtaWNTdHJlYW1CdWZmZXJTaXplKSk7bnVsbCE9YS5zbWFydEJ1ZmZlckFkanVzdG1lbnRQYXJhbXMmJih0aGlzLnRhPWEuc21hcnRCdWZmZXJBZGp1c3RtZW50UGFyYW1zKTtudWxsIT1hLnNtYXJ0QnVmZmVyQWRqdXN0bWVudEVuYWJsZWQmJih0aGlzLlQ9Qm9vbGVhbihhLnNtYXJ0QnVmZmVyQWRqdXN0bWVudEVuYWJsZWQpKTtudWxsIT1hLnN0cmVhbUJ1ZmZlclNpemUmJih0aGlzLlc9TnVtYmVyKGEuc3RyZWFtQnVmZmVyU2l6ZSkpOwpudWxsIT1hLmZpeEJ1ZmZlcmluZ0dvYWxEZXRlcm1pbmF0aW9uJiYodGhpcy5OPUJvb2xlYW4oYS5maXhCdWZmZXJpbmdHb2FsRGV0ZXJtaW5hdGlvbikpO251bGwhPWEuYWRkQ2RuRGVidWdRdWVyeVBhcmFtZXRlcnMmJih0aGlzLmthPUJvb2xlYW4oYS5hZGRDZG5EZWJ1Z1F1ZXJ5UGFyYW1ldGVycykpO251bGwhPWEudXNlSW5pdGlhbEJ1ZmZlclNpemVXaGVuUGF1c2VkJiYodGhpcy54YT1Cb29sZWFuKGEudXNlSW5pdGlhbEJ1ZmZlclNpemVXaGVuUGF1c2VkKSk7bnVsbCE9YS5zZWdtZW50UmVxdWVzdFRpbWVvdXQmJih0aGlzLmMuTz1OdW1iZXIoYS5zZWdtZW50UmVxdWVzdFRpbWVvdXQpKTtudWxsIT1hLnJlc29sdmVWaWRlb1RpbWVVcGRhdGVPbkZyYWdtZW50ZWRUaW1lUmFuZ2VzJiYodGhpcy5tYT1Cb29sZWFuKGEucmVzb2x2ZVZpZGVvVGltZVVwZGF0ZU9uRnJhZ21lbnRlZFRpbWVSYW5nZXMpKTtudWxsIT1hLnBlcmZvcm1hbmNlTG9nZ2VyJiYodGhpcy5tPXRoaXMucy5wZXJmb3JtYW5jZUxvZ2dlcj0KYS5wZXJmb3JtYW5jZUxvZ2dlcik7bnVsbCE9YS5hYnJMb2dnZXImJih0aGlzLnMuYWJyTG9nZ2VyPWEuYWJyTG9nZ2VyKTtudWxsIT1hLnJlYXBwZW5kSW5pdFNlZ21lbnRBZnRlckFib3J0JiYodGhpcy5zLnJlYXBwZW5kSW5pdFNlZ21lbnRBZnRlckFib3J0PUJvb2xlYW4oYS5yZWFwcGVuZEluaXRTZWdtZW50QWZ0ZXJBYm9ydCkpO251bGwhPWEubGl2ZURhdGFGZXRjaE1heFJldHJpZXMmJih0aGlzLnMubGl2ZURhdGFGZXRjaE1heFJldHJpZXM9TnVtYmVyKGEubGl2ZURhdGFGZXRjaE1heFJldHJpZXMpKTtudWxsIT1hLmxpdmVTb3VyY2VCdWZmZXJDbGVhck1heFJldHJpZXMmJih0aGlzLnMubGl2ZVNvdXJjZUJ1ZmZlckNsZWFyTWF4UmV0cmllcz1OdW1iZXIoYS5saXZlU291cmNlQnVmZmVyQ2xlYXJNYXhSZXRyaWVzKSk7bnVsbCE9YS5za2lwRW1wdHlTZWdtZW50cyYmKHRoaXMucy5za2lwRW1wdHlTZWdtZW50cz1Cb29sZWFuKGEuc2tpcEVtcHR5U2VnbWVudHMpKTtudWxsIT0KYS5wbGF5aGVhZEZyYWdtZW50ZWRHYXBEaWZmQWxsb3dhbmNlJiYodGhpcy5zLnBsYXloZWFkRnJhZ21lbnRlZEdhcERpZmZBbGxvd2FuY2U9TnVtYmVyKGEucGxheWhlYWRGcmFnbWVudGVkR2FwRGlmZkFsbG93YW5jZSkpO251bGwhPWEudXNlTWljcm9UYXNrVGltZW91dHMmJih0aGlzLnlhPUJvb2xlYW4oYS51c2VNaWNyb1Rhc2tUaW1lb3V0cykpO2E9dGhpcy5jO2I9dGhpcy5zO251bGwhPWIucmVhcHBlbmRJbml0U2VnbWVudEFmdGVyQWJvcnQmJihhLk09Qm9vbGVhbihiLnJlYXBwZW5kSW5pdFNlZ21lbnRBZnRlckFib3J0KSk7bnVsbCE9Yi5wZXJmb3JtYW5jZUxvZ2dlciYmKGEubT1iLnBlcmZvcm1hbmNlTG9nZ2VyKTtudWxsIT1iLmFickxvZ2dlciYmKGEuRj1iLmFickxvZ2dlcik7bnVsbCE9Yi5saXZlRGF0YUZldGNoTWF4UmV0cmllcyYmKGEuSj1iLmxpdmVEYXRhRmV0Y2hNYXhSZXRyaWVzKTtudWxsIT1iLmxpdmVTb3VyY2VCdWZmZXJDbGVhck1heFJldHJpZXMmJihhLkk9CmIubGl2ZVNvdXJjZUJ1ZmZlckNsZWFyTWF4UmV0cmllcyk7bnVsbCE9Yi5wbGF5aGVhZEZyYWdtZW50ZWRHYXBEaWZmQWxsb3dhbmNlJiYoYS5LPWIucGxheWhlYWRGcmFnbWVudGVkR2FwRGlmZkFsbG93YW5jZSk7bnVsbCE9Yi5za2lwRW1wdHlTZWdtZW50cyYmKGEuUj1iLnNraXBFbXB0eVNlZ21lbnRzKX07VS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2ZlKHRoaXMpO3RoaXMuRi5kZXN0cm95KCk7dGhpcy5uYT10aGlzLmY9dGhpcy5GPW51bGw7dGhpcy5jLmRlc3Ryb3koKTt0aGlzLmI9dGhpcy5jPW51bGw7dGhpcy5hLmdldEJvb2woImZpeGluZ19zY2hlZHVsZXJfZGlzYWJsZV9sZWFrcyIsITApJiYodGhpcy5pPW51bGwpO3RoaXMuemE9bnVsbH07bj1VLnByb3RvdHlwZTtuLklhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZn07bi5yYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9OwpuLmpjPWZ1bmN0aW9uKGEpe3RoaXMuQnx8YS50aGVuKGZ1bmN0aW9uKCl7dGhpcy5CPSEwO3RoaXMudnx8Vih0aGlzLDApfS5iaW5kKHRoaXMpKS5jYXRjaChmdW5jdGlvbigpe30pO3JldHVybiB0aGlzLkZ9O24uaGI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5EfTsKbi5SYT1mdW5jdGlvbihhLGIsYyxkKXtpZihhIT10aGlzLmYpe3ZhciBlPTE7dGhpcy5hLmdldEJvb2woInVzZV9saXZlX2JpdHJhdGVfZXN0aW1hdGVzIiwhMSkmJm51bGwhPT10aGlzLm8mJjA8dGhpcy5mLmJhbmR3aWR0aCYmKGU9dGhpcy5vLmdldEVzdGltYXRlKCkvdGhpcy5mLmJhbmR3aWR0aCk7dmFyIGY9YS5YO2YmJih0aGlzLmJhPWYuY3JlYXRlKHRoaXMubSx0aGlzLkNhKSk7dGhpcy5tJiZ0aGlzLm0uc2V0Qml0cmF0ZShhLmJhbmR3aWR0aCk7dGhpcy5QPSEwO2EuTC5jcmVhdGUoKS50aGVuKEgodGhpcyxmdW5jdGlvbihmKXtpZih0aGlzLmIpe3RoaXMuUD0hMTt2YXIgaD10aGlzLmY7dGhpcy5mPWE7dGhpcy5hLmdldEJvb2woInVzZV9saXZlX2JpdHJhdGVfZXN0aW1hdGVzIiwhMSkmJih0aGlzLm89ZWUodGhpcywoYS5iYW5kd2lkdGh8fDApKmUpKTt2YXIgaz10aGlzLmc7dGhpcy5nPWY7ayYmSGQoayk7R2QodGhpcy5nLGZ1bmN0aW9uKCl7dGhpcy5sJiZ0aGlzLmwuc2V0U2VnbWVudHModGhpcy5nLmwoKSk7CnRoaXMuaSYmZ2UodGhpcyx0aGlzLmYuaWR8fCIiLHRoaXMuZyl9LmJpbmQodGhpcykpO3RoaXMubCYmdGhpcy5sLnNldFNlZ21lbnRzKHRoaXMuZy5sKCkpO3RoaXMuaSYmZ2UodGhpcyxhLmlkfHwiIixmKTt0aGlzLmlhPSEwO3RoaXMuVT1kP2Q6bnVsbDt0aGlzLkp8fCh0aGlzLmEuZ2V0Qm9vbCgibWFrZV9lYXJseV90cmFja19zZWxlY3Rpb24iLCExKSYmdGhpcy5oJiYhdGhpcy5IJiYhdGhpcy52P1YodGhpcywwKTpoP2ImJmhlKHRoaXMsITAsYyk6Vih0aGlzLDApKX19KSkuY2F0Y2goSCh0aGlzLGZ1bmN0aW9uKGEpe3RoaXMuUD0hMTsiYWJvcnRlZCIhPWEudHlwZSYmKHRoaXMuQj8oYT15KGEpLHRoaXMuZGlzcGF0Y2hFdmVudChhKSk6dGhpcy5GLnJlamVjdChhKSl9KSl9fTtuLmVjPWZ1bmN0aW9uKGEpe3JldHVybiBoZSh0aGlzLCEhYSl9O24uZ2M9ZnVuY3Rpb24oKXt0aGlzLmFhPSEwfTtuLmljPWZ1bmN0aW9uKGEpe3RoaXMudWE9YX07CmZ1bmN0aW9uIGdlKGEsYixjKXtpZihhLmEuZ2V0Qm9vbCgidXNlX3VwZGF0ZV9zZWdtZW50c19ieV9zaGFrYV9yZWZlcmVuY2UiLCEwKSlhLmkudXBkYXRlU2VnbWVudHNCeVNoYWthUmVmZXJlbmNlcyhiLGMubCgpKTtlbHNle3ZhciBkOyhkPTA9PT1jLmEubGVuZ3RoP251bGw6RmQoYy53KCksYy5hLmxlbmd0aC0xKSkmJiFhLmkuaGFzU2VnbWVudChkKSYmKGQ9MDxhLmkuZ2V0U2VnbWVudHMoYikubGVuZ3RoP2EuYi5jdXJyZW50VGltZS0xMDpudWxsLGEuaS51cGRhdGVTZWdtZW50cyhiLEVkKGMsZCkpKX19CmZ1bmN0aW9uIGhlKGEsYixjKXthLmYmJiFhLkomJihhLko9ITAsZmUoYSksYS5NPSExLG51bGwhPT1hLkEmJmEuQS5yZXNldCgpLHViKGEuYykudGhlbihIKGEsZnVuY3Rpb24oKXt2YXIgYT10aGlzLmIuY3VycmVudFRpbWU7dGhpcy5hLmdldEJvb2woInNldF9jdXJyZW50X3RpbWVfaW5fcmVzeW5jIiwhMSkmJjA9PWEmJihhPVModGhpcy5nKS5zdGFydFRpbWUpO2lmKCFiJiYwPHZiKHRoaXMuYyxhKSYmMDw9Q2IodGhpcy5jLmEsYSkpcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO2lmKGMpcmV0dXJuIEdiKHRoaXMuYyx0aGlzLmIuY3VycmVudFRpbWUrYyk7dGhpcy5jYT0hMDtyZXR1cm4gRmIodGhpcy5jKX0pKS50aGVuKEgoYSxmdW5jdGlvbigpe3RoaXMuSj0hMTtWKHRoaXMsMCl9KSkuY2F0Y2goSChhLGZ1bmN0aW9uKGEpe3RoaXMuSj0hMTsiYWJvcnRlZCIhPWEudHlwZSYmKHRoaXMuQj8oYT15KGEpLHRoaXMuZGlzcGF0Y2hFdmVudChhKSk6dGhpcy5GLnJlamVjdChhKSl9KSkpfQpuLmhjPWZ1bmN0aW9uKGEpe3JldHVybiAwPHZiKHRoaXMuYyxhKSYmMDw9Q2IodGhpcy5jLmEsYSl9O24uJGE9ZnVuY3Rpb24oKXt9O24uZmI9ZnVuY3Rpb24oKXtyZXR1cm4hMH07CmZ1bmN0aW9uIGllKGEpe2EuVj1hLlZ8fCFhLmIucGF1c2VkO2EuYi5wYXVzZWR8fGEuVHx8KGEuTz1EYXRlLm5vdygpLGEuVD0hMCk7dmFyIGI9YS50YSxjPW51bGw7aWYoYi5pbkV4cGVyaW1lbnQpaWYoYi51c2VTbWFydEJ1ZmZlcmluZyl7aWYoYS5UJiZhLk8pe3ZhciBjPShEYXRlLm5vdygpLWEuTykvMUUzLGQ9bnVsbDsxPmM/Yz1udWxsOihkPTM+Yz9iLmJ1ZmZlclNpemVfMDBfdG9fMDM6MTA+Yz9iLmJ1ZmZlclNpemVfMDNfdG9fMTA6MzA+Yz9iLmJ1ZmZlclNpemVfMTBfdG9fMzA6NjA+Yz9iLmJ1ZmZlclNpemVfMzBfdG9fNjA6Yi5idWZmZXJTaXplX2Fib3ZlXzYwLGM9TWF0aC5taW4oZCxhLmIuZHVyYXRpb24pKX19ZWxzZSBhLk8mJihjPWIubm9uU21hcnRCdWZmZXJTaXplKTtjfHwoYz1hLnhhJiZhLmIucGF1c2VkP2EuSTphLlcsYS4kJiYhYS5iLnBhdXNlZCYmKGM9TWF0aC5tYXgoTWF0aC5taW4oYS5nLncoKS5lbmRUaW1lLWEuYi5jdXJyZW50VGltZSxhLiQpLGEuVykpKTsKYz0oYS5OP2EuaCYmYS5WOmEuaCk/TWF0aC5tYXgoYS5JLGMpOmEuSTswPGEuYS5nZXROdW1iZXIoImF1ZGlvX3ZpZGVvX2J1ZmZlcl9kaWZmX3RocmVzaG9sZCIsMTQ0MDApJiYoYj1hLmIuYnVmZmVyZWQubGVuZ3RoP2EuYi5idWZmZXJlZC5lbmQoYS5iLmJ1ZmZlcmVkLmxlbmd0aC0xKTowLGI9TWF0aC5tYXgoMCxiLWEuYi5jdXJyZW50VGltZSksYz1NYXRoLm1pbihjLGIrYS5hLmdldE51bWJlcigiYXVkaW9fdmlkZW9fYnVmZmVyX2RpZmZfdGhyZXNob2xkIiwxNDQwMCkpKTtyZXR1cm4gY31mdW5jdGlvbiBqZShhLGIpe3JldHVybiB2YihhLmMsYS5oP2I6YisoYS5DfHwwKSl9CmZ1bmN0aW9uIGtlKGEpe2lmKGEuaCYmIWEuQnx8YS5hLmdldEJvb2woIm1ha2VfZWFybHlfdHJhY2tfc2VsZWN0aW9uIiwhMSkmJmEuUHx8YS5hLmdldEJvb2woInByZXZlbnRfZmV0Y2hfd2hpbGVfZmV0Y2hpbmdfaW5fc3RyZWFtIiwhMSkmJmEuSClyZXR1cm4gYS52PW51bGwsUHJvbWlzZS5yZXNvbHZlKCk7dmFyIGI7aWYoYj1hLkImJiFhLkQpYj0xPGEuYy5iLmJ1ZmZlcmVkLmxlbmd0aD8hMDohMTtpZihiJiYoYS5hYXx8S2IoYS5jLGEuYikpKXJldHVybiBhLm1hJiYoYS5iLmN1cnJlbnRUaW1lPUpiKGEuYikpLGEuYWE9ITEsaGUoYSwhMCksUHJvbWlzZS5yZXNvbHZlKCk7YS5hLmdldE51bWJlcigiZGVjb3VwbGVfc3RyZWFtX29uX3VwZGF0ZV9sb29wX2Zyb21fcmVxdWVzdF9sb29wX2ludCIsMCl8fChhLnY9bnVsbCk7Yj1hLmY7dmFyIGM9YS5nLGQ9YS5iLmN1cnJlbnRUaW1lO2EuYS5nZXRCb29sKCJ1c2VfcGVuZGluZ19zZWVrX3Bvc2l0aW9uX2Zvcl9yZWZlcmVuY2UiLAohMSkmJjA9PT1hLmIucmVhZHlTdGF0ZSYmIWQmJmEuaGEmJihkPWEuaGEpO2lmKGEuTiYmIWEuaCYmamUoYSxkKT49YS5hLmdldE51bWJlcigic3RhcnRfc3RyZWFtX2J1ZmZlcl9zaXplIiwxKSlyZXR1cm4gYS5hLmdldEJvb2woImZpeF9jaHJvbWVfbXNlX3JlZ3Jlc3Npb24iLCExKSYmMT09PWEuYi5yZWFkeVN0YXRlJiYwPGEuYi5idWZmZXJlZC5sZW5ndGgmJihhLmIuY3VycmVudFRpbWU9YS5iLmN1cnJlbnRUaW1lKSxsZShhKSxWKGEsMCksUHJvbWlzZS5yZXNvbHZlKCk7dmFyIGU9bnVsbCxmPVtdO2lmKGplKGEsZCk+PWllKGEpKWlmKGEuTT0hMCxhLk58fGxlKGEpLGY9bWUoYSk/bmUoYSxkKTpbXSwwPGYubGVuZ3RoKWU9ZlswXTtlbHNlIHJldHVybiBWKGEsMUUzLyg1KihNYXRoLmFicyhhLmIucGxheWJhY2tSYXRlKXx8MSkpKSxQcm9taXNlLnJlc29sdmUoKTtlbHNle2U9MTthLmwmJihlPWEubC5nZXROdW1iZXJPZlNlZ21lbnRzKCkpO3ZhciBnPW9lKGEsZCxjLGUpLGU9CmdbMF07YS5sJiYoYS5sLnNldEZ1dHVyZVNlZ21lbnRzKGcpLGEubC5zZXRCdWZmZXJpbmdHb2FsKGllKGEpLWplKGEsZCkpKTshZSYmbWUoYSkmJihmPW5lKGEsZCksMDxmLmxlbmd0aCYmKGU9ZlswXSkpfWlmKCFlKXJldHVybiBsZShhKSxhLkImJiFhLkQmJihhLkQ9ITAscGUoYSkpLFYoYSwyMDApLFByb21pc2UucmVzb2x2ZSgpO2lmKGEuaXx8YS5LKWc9YS5oP2Q6ZCsoYS5DfHwwKSxnPXthZGRpdGlvbmFsU2VnbWVudHNSZXF1aXJlZDpmLHBsYXloZWFkOmQsYnVmZmVyU3RhcnQ6ZyxidWZmZXJFbmQ6amUoYSxkKStnLGJ1ZmZlcmluZ0dvYWw6aWUoYSksaXNQbGF5aW5nOiFhLmIucGF1c2VkfSxhLmkmJmEuaS51cGRhdGVQbGF5ZXJTdGF0ZShiLmlkfHwiIixnKSxhLksmJmEuSy5nZXRQcmlvcml0eVVwZGF0ZXIoKS51cGRhdGVQcmlvcml0eVdpdGhOZXdQbGF5ZXJTdGF0ZShnKTthLmEuZ2V0Qm9vbCgicmVmcmVzaF9zZWdtZW50X3JlZmVyZW5jZV9mYWlsb3Zlcl91cmkiLCEwKSYmCihlLnVybD1lLnVybC5jbG9uZSgpKTthLkg9ITA7InZpZGVvIj09PWIubWltZVR5cGUuc3BsaXQoIi8iKVswXSYmYS5uYS5zZXRSZXByZXNlbnRhdGlvbklEKGIuaWQpO2M9YS5jLmZldGNoKGUsYy5iLGIuYSthLnVhLGEuYmEsYS5rYSYmIWEuYi5wYXVzZWQsMDxmLmxlbmd0aCxhLmksYS5LKTtjPWMudGhlbihIKGEsZnVuY3Rpb24oYSl7dGhpcy5nYS5pbmZvcm1OZXR3b3JrUmVzdW1lZCgpO3JldHVybiBhfSkpO2EuUiYmInZpZGVvIj09PWIubWltZVR5cGUuc3BsaXQoIi8iKVswXSYmYS5SLmFkZChlLnN0YXJ0VGltZXx8MCxlLmVuZFRpbWV8fDAse2lkOmIuaWQscmVhc29uOmEuVSxwZXJmb3JtYW5jZUxvZ2dlcjphLm0/YS5tLmdldE9wZXJhdGlvbkxvZ2dlcigic3RyZWFtX3N3aXRjaCIpOm51bGx9KTthLmJhPW51bGw7YS5pYSYmKGEuaWE9ITEsZT1hLlUsYS5VPW51bGwscWUoYSxiLGUpKTthLkQ9ITE7cmV0dXJuIGMudGhlbihIKGEsZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5nZXRCb29sKCJjbGVhcl9vbGRfYnVmZmVyIiwKITEpP0liKHRoaXMuYyx0aGlzLmIuY3VycmVudFRpbWUpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gYX0pOmF9KSkudGhlbihIKGEsZnVuY3Rpb24oYSl7dmFyIGI9YS5yYSxjPWEuR2M7dGhpcy5ofHwodGhpcy5vYT1jKTt0aGlzLmEuZ2V0Qm9vbCgidXNlX2xpdmVfYml0cmF0ZV9lc3RpbWF0ZXMiLCExKSYmbnVsbCE9YSYmMDxhLmZjJiYwPGEuRyYmKG51bGw9PT10aGlzLm8mJih0aGlzLm89ZWUodGhpcyx0aGlzLmYuYmFuZHdpZHRofHwwKSksdGhpcy5vLnNhbXBsZSg4KmEuZmMsYS5HKSk7YT10aGlzLmEuZ2V0TnVtYmVyKCJidWZmZXJfdmVsb2NpdHlfdGltZV9pbl9wYXN0X3RvX2NvbnNpZGVyIiwwKTswPGEmJm51bGwhPT10aGlzLmYmJiJ2aWRlbyI9PT1TZCh0aGlzLmYpJiYobnVsbD09PXRoaXMuQSYmKHRoaXMuQT1uZXcgQnVmZmVyVmVsb2NpdHkoYSkpLHRoaXMuQS5yZWNvcmRCdWZmZXJBaGVhZCh2Yih0aGlzLmMsdGhpcy5iLmN1cnJlbnRUaW1lKSkpO3RoaXMuSD0hMTtudWxsPT0KdGhpcy5DJiYodGhpcy5DPWIpO3RoaXMuY2EmJjA8dmIodGhpcy5jLGQpJiYodGhpcy5jYT0hMSx0aGlzLmEuZ2V0Qm9vbCgiZGlzYWJsZV9udWRnZSIsITEpfHwoYj14KHt0eXBlOiJzaG91bGRfbnVkZ2UifSksdGhpcy5kaXNwYXRjaEV2ZW50KGIpKSk7Vih0aGlzLDApfSkpLmNhdGNoKEgoYSxmdW5jdGlvbihhKXt0aGlzLkg9ITE7cmV0dXJuIFByb21pc2UucmVqZWN0KGEpfSkpfWZ1bmN0aW9uIHJlKGEsYixjKXt2YXIgZD1udWxsIT09YS5qJiYtMTxhLmomJmEuajxjLmxlbmd0aCgpLTE/Yy5nZXQoYS5qKTpudWxsLGU9bnVsbDtpZihudWxsPT09YS5qfHwhZHx8ZC5zdGFydFRpbWU+YilyZXR1cm4gZT1DYihjLmEsYiksYS5qPWU7Zm9yKGQ9YS5qO2Q8PWEuaisxO2QrKylpZihlPWMuZ2V0KGQpLGUuc3RhcnRUaW1lPD1iJiZlLmVuZFRpbWU+YilyZXR1cm4gYS5qPWQ7ZT1DYihjLmEsYik7cmV0dXJuKGEuaj1lKXx8LTF9CmZ1bmN0aW9uIG1lKGEpe3JldHVybiBhLmEuZ2V0Qm9vbCgicmVwbGFjZV9sb3dlcl9xdWFsaXR5X2J1ZmZlciIsITEpJiZudWxsPT09YS5LJiZhLlYmJm51bGwhPT1hLlImJiJ2aWRlbyI9PT1TZChhLmYpJiZudWxsIT09YS5nfQpmdW5jdGlvbiBuZShhLGIpe2lmKCFhLndhfHwhYS5mLmlkfHwhYS5nKXJldHVybltdO3ZhciBjPXJlKGEsYixhLmcpO3JldHVybi0xPT09Yz9bXTpCdWZmZXJSZXBsYWNlbWVudEhlbHBlci5nZXRTZWdtZW50c1RvUmVwbGFjZUxvd2VyUXVhbGl0eShhLmcubCgpLGIsYyxhLmYuaWQsYS53YSxhLlIse3RocmVzaG9sZEJlZm9yZTphLmEuZ2V0TnVtYmVyKCJidWZmZXJfcmVwbGFjZW1lbnRfYmVoaW5kX3RocmVzaG9sZCIsNSksdGhyZXNob2xkQWZ0ZXI6YS5hLmdldE51bWJlcigiYnVmZmVyX3JlcGxhY2VtZW50X2FoZWFkX3RocmVzaG9sZCIsMTUpLHdyYXBSZXBsYWNlbWVudFBhc3RFbmQ6YS5hLmdldEJvb2woIndyYXBfcmVwbGFjZW1lbnRfcGFzdF9lbmQiLCExKX0pfQpuLmNjPWZ1bmN0aW9uKCl7dmFyIGE7dGhpcy5hLmdldE51bWJlcigiZGVjb3VwbGVfc3RyZWFtX29uX3VwZGF0ZV9sb29wX2Zyb21fcmVxdWVzdF9sb29wX2ludCIsMCkmJlYodGhpcyx0aGlzLmEuZ2V0TnVtYmVyKCJkZWNvdXBsZV9zdHJlYW1fb25fdXBkYXRlX2xvb3BfZnJvbV9yZXF1ZXN0X2xvb3BfaW50IiwwKSk7dGhpcy5hLmdldEJvb2woImNhdGNoX3N0cmVhbV91cGRhdGVfc3luY19jb2RlX2Vycm9yIiwhMSk/YT1uZXcgUHJvbWlzZShmdW5jdGlvbihhLGMpe3RyeXtrZSh0aGlzKS50aGVuKGEpLmNhdGNoKGMpfWNhdGNoKGQpe2QudHlwZT0idW5jYXVnaHQiLGMoZCl9fS5iaW5kKHRoaXMpKTphPWtlKHRoaXMpO2EuY2F0Y2goSCh0aGlzLGZ1bmN0aW9uKGEpe2lmKCJhYm9ydGVkIiE9YS50eXBlKXtpZigic291cmNlYnVmZmVyX2Z1bGwiPT09YS50eXBlKXJldHVybiBGYih0aGlzLmMpLnRoZW4oSCh0aGlzLGZ1bmN0aW9uKCl7Vih0aGlzLDApfSkpO3ZhciBjPS0xPT09WzAsCjQwNCw0MTAsNTAyLDUwMyw1MDRdLmluZGV4T2YoYS5zdGF0dXMpO2lmKCJuZXQiPT09YS50eXBlJiYhYyYmdGhpcy5mKWlmKHRoaXMuYS5nZXRCb29sKCJhbGxvd19pbmZpbml0ZV9yZXRyeV9vbl9uZXRfZXJyIiwhMCkpc3dpdGNoKGEuc3RhdHVzKXtjYXNlIDQwNDpWKHRoaXMsMkUzKTticmVhaztjYXNlIDQxMDp0aGlzLkQ9ITA7cGUodGhpcyk7YnJlYWs7ZGVmYXVsdDpWKHRoaXMsMUUzKX1lbHNlIFYodGhpcywxRTMpLGM9ITA7MD09PWEuc3RhdHVzP3RoaXMuZ2EuaW5mb3JtTmV0d29ya0ludGVycnVwdGVkKCk6dGhpcy5nYS5pbmZvcm1OZXR3b3JrUmVzdW1lZCgpO2lmKCF0aGlzLmEuZ2V0Qm9vbCgiYWxsb3dfaW5maW5pdGVfcmV0cnlfb25fbmV0X2VyciIsITApfHxjKWM9eShhKSx0aGlzLmRpc3BhdGNoRXZlbnQoYyksdGhpcy5tJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGM9dGhpcy5tLmdldEV2ZW50TG9nZ2VyKCJzdHJlYW1fZXJyb3JfZmFsbGJhY2siKS5zZXRFcnJvcihhKS5zZXRUeXBlKHRoaXMucGEuc3BsaXQoIi8iKVswXSk7CnRoaXMuYj9jLnNldFJlc3VsdCgiZmFpbGVkIik6Yy5zZXRSZXN1bHQoInN1Y2Nlc3MiKTtjLmxvZygpfS5iaW5kKHRoaXMpLDApfX0pKX07ZnVuY3Rpb24gb2UoYSxiLGMsZCl7dmFyIGUsZj1hLmM7ZT1mLmEubGVuZ3RoO2U9MDxlP2YuYVtlLTFdOm51bGw7Zj0tMTtudWxsIT1lP2Y9YS5hLmdldEJvb2woImVuYWJsZV9zZWdtZW50X3JlZmVyZW5jZV9lcHNpbG9uIiwhMSk/bnVsbCE9ZS5lbmRUaW1lP2MuZmluZEluZGV4QnlTdGFydFRpbWUoZS5lbmRUaW1lKTotMTpudWxsIT1lLmVuZFRpbWU/Q2IoYy5hLGUuZW5kVGltZSk6LTE6KGY9cmUoYSxiLGMpLDA+ZiYmKGY9Yy5sZW5ndGgoKT9jLmxlbmd0aCgpLTE6LTEpKTtpZigwPmYpcmV0dXJuW107YT1bXTtmb3IoYj1mO2I8ZitkJiZiPGMubGVuZ3RoKCk7YisrKWEucHVzaChjLmdldChiKSk7cmV0dXJuIGF9CmZ1bmN0aW9uIGxlKGEpe2lmKCFhLmgmJm51bGwhPWEuQyl7YS5oPSEwO3ZhciBiPWEuYyxjPWEuQyxkPWMtYi5QOzAhPWQmJihiLmE9eGQoYi5hLGQpLGIuUD1jKTthLkYucmVzb2x2ZShhLkMpfX1uLkJjPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaH07VS5wcm90b3R5cGUuaGFzU3RhcnRlZD1VLnByb3RvdHlwZS5CYztVLnByb3RvdHlwZS5RYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLk19O1UucHJvdG90eXBlLmhhc0hpdEJ1ZmZlcmluZ0dvYWw9VS5wcm90b3R5cGUuUWE7VS5wcm90b3R5cGUubGE9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09PXRoaXMubz9udWxsOnRoaXMuby5nZXRFc3RpbWF0ZSgpfTtVLnByb3RvdHlwZS5nZXRCaXRyYXRlRXN0aW1hdGU9VS5wcm90b3R5cGUubGE7VS5wcm90b3R5cGUuWWE9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09PXRoaXMuQT9udWxsOnRoaXMuQS5nZXRWZWxvY2l0eSgpfTtVLnByb3RvdHlwZS5nZXRCdWZmZXJWZWxvY2l0eT1VLnByb3RvdHlwZS5ZYTsKZnVuY3Rpb24gcWUoYSxiLGMpe3ZhciBkPWIubWltZVR5cGUuc3BsaXQoIi8iKVswXTtiPXgoe3R5cGU6ImFkYXB0YXRpb24iLGlkOmIuaWQsYnViYmxlczohMCxjb250ZW50VHlwZTpkLHNpemU6InZpZGVvIiE9ZD9udWxsOnt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0sYmFuZHdpZHRoOmIuYmFuZHdpZHRoLHJlYXNvbjpjfSk7YS5kaXNwYXRjaEV2ZW50KGIpfWZ1bmN0aW9uIHBlKGEpe3ZhciBiPXgoe3R5cGU6ImVuZGVkIn0pO2EuZGlzcGF0Y2hFdmVudChiKX1mdW5jdGlvbiBWKGEsYil7ZmUoYSk7IWImJmEueWE/UHJvbWlzZS5yZXNvbHZlKCkudGhlbihhLmNjLmJpbmQoYSkpOmEudj1zZXRUaW1lb3V0KGEuY2MuYmluZChhKSxiKX1mdW5jdGlvbiBmZShhKXtudWxsIT1hLnYmJihjbGVhclRpbWVvdXQoYS52KSxhLnY9bnVsbCl9VS5wcm90b3R5cGUuWmE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vYX07ZnVuY3Rpb24gc2UoYSl7dGhpcy5jPWE7dGhpcy5hPW51bGx9c2UucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmEmJih0aGlzLmEuZGVzdHJveSgpLHRoaXMuYT1udWxsKX07c2UucHJvdG90eXBlLmNyZWF0ZT1mdW5jdGlvbigpe2lmKHRoaXMuYSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYSk7dmFyIGE9bmV3IHZkKDAsbnVsbCx0aGlzLmMpO3RoaXMuYT1uZXcgUihbYV0sMSk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmEpfTtzZS5wcm90b3R5cGUuYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9O2Z1bmN0aW9uIHRlKGEsYil7RS5jYWxsKHRoaXMsYSk7dGhpcy5iPWI7dGhpcy5pPSEwO3RoaXMuaj10aGlzLmc9bnVsbDt0aGlzLmY9bmV3IEc7dGhpcy5hPW51bGx9cih0ZSxFKTt0ZS5wcm90b3R5cGUuZGE9ZnVuY3Rpb24oKXt9O3RlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5hJiZ0aGlzLmIucmVtb3ZlQ2hpbGQodGhpcy5hKTt0aGlzLmYuZGVzdHJveSgpO3RoaXMuemE9dGhpcy5iPXRoaXMuZz10aGlzLmo9dGhpcy5hPXRoaXMuZj1udWxsfTtuPXRlLnByb3RvdHlwZTtuLklhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bi5yYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmp9O24uamM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mfTtuLmhiPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpuLlJhPWZ1bmN0aW9uKGEpe2EuTC5jcmVhdGUoKS50aGVuKEgodGhpcyxmdW5jdGlvbihiKXtpZih0aGlzLmIpe2lmKDA9PWIubGVuZ3RoKCkpcmV0dXJuIFByb21pc2UucmVqZWN0KEVycm9yKCJObyBzdWJ0aXRsZXMgVVJMIGF2YWlsYWJsZS4iKSk7dmFyIGM9dGhpcy5nO3RoaXMuZz1hO3RoaXMuaj1iO2I9UyhiKS51cmwuY1swXS50b1N0cmluZygpO3ZhciBkPXRoaXMuZmIoKTt0aGlzLmEmJih0aGlzLiRhKCExKSx0aGlzLmIucmVtb3ZlQ2hpbGQodGhpcy5hKSk7dGhpcy5hPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyYWNrIik7dGhpcy5iLmFwcGVuZENoaWxkKHRoaXMuYSk7dGhpcy5hLnNyYz1iO3RoaXMuJGEoZCk7Yj14KHt0eXBlOiJhZGFwdGF0aW9uIixidWJibGVzOiEwLGNvbnRlbnRUeXBlOiJ0ZXh0IixzaXplOm51bGwsYmFuZHdpZHRoOmEuYmFuZHdpZHRofSk7dGhpcy5kaXNwYXRjaEV2ZW50KGIpO2N8fHRoaXMuZi5yZXNvbHZlKDApfX0pKX07bi5lYz1mdW5jdGlvbigpe307Cm4uZ2M9ZnVuY3Rpb24oKXt9O24uaGM9ZnVuY3Rpb24oKXtyZXR1cm4hMH07bi4kYT1mdW5jdGlvbihhKXt0aGlzLmk9YTt0aGlzLmEmJih0aGlzLmEudHJhY2subW9kZT1hPyJzaG93aW5nIjoiZGlzYWJsZWQiKX07bi5mYj1mdW5jdGlvbigpe3RoaXMuYSYmKHRoaXMuaT0ic2hvd2luZyI9PXRoaXMuYS50cmFjay5tb2RlKTtyZXR1cm4gdGhpcy5pfTtuLlphPWZ1bmN0aW9uKCl7cmV0dXJuIDB9O24uaWM9ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIHVlKCl7fQp1ZS5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bnVsbDt0cnl7dmFyIGY7dmFyIGc9bmV3IE1hKGIpO2lmKDQ0MDc4Njg1MSE9T2EoZykuaWQpZj1udWxsO2Vsc2V7dmFyIGg9T2EoZyk7aWYoNDA4MTI1NTQzIT1oLmlkKWY9bnVsbDtlbHNle3ZhciBrPWguYS5ieXRlT2Zmc2V0LGw7dmFyIG09bmV3IE1hKGguYSk7Zm9yKGI9bnVsbDtHYShtLmEpOyl7dmFyIHA9T2EobSk7aWYoMzU3MTQ5MDMwPT1wLmlkKXtiPXA7YnJlYWt9fWlmKGIpe2Zvcih2YXIgdj1uZXcgTWEoYi5hKSxwPTFFNixtPW51bGw7R2Eodi5hKTspe3ZhciB3PU9hKHYpO2lmKDI4MDc3Mjk9PXcuaWQpcD1TYSh3KTtlbHNlIGlmKDE3NTQ1PT13LmlkKWlmKGI9dyw0PT1iLmEuYnl0ZUxlbmd0aCltPWIuYS5nZXRGbG9hdDMyKDApO2Vsc2UgaWYoOD09Yi5hLmJ5dGVMZW5ndGgpbT1iLmEuZ2V0RmxvYXQ2NCgwKTtlbHNlIHRocm93IG5ldyBSYW5nZUVycm9yKCJFYm1sRWxlbWVudDogZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBtdXN0IGJlIDQgb3IgOCBieXRlcy4iKTt9bnVsbD09Cm0/bD1udWxsOih2PXAvMUU5LGw9e3RiOnYsZHVyYXRpb246bSp2fSl9ZWxzZSBsPW51bGw7Zj1sP3tZYzprLHRiOmwudGIsZHVyYXRpb246bC5kdXJhdGlvbn06bnVsbH19aWYoZil7dmFyIEI9T2EobmV3IE1hKGEpKTtpZig0NzUyNDk1MTUhPUIuaWQpZT1udWxsO2Vsc2V7dmFyIFA9Zi5ZYyxiYT1mLnRiLGNhPWYuZHVyYXRpb247YT1bXTt2YXIgdGE9bmV3IE1hKEIuYSk7Zm9yKGY9Qj0tMTtHYSh0YS5hKTspe3ZhciBYYT1PYSh0YSk7aWYoMTg3PT1YYS5pZCl7dmFyIEphO3ZhciBsZD1uZXcgTWEoWGEuYSksbWQ9T2EobGQpO2lmKDE3OSE9bWQuaWQpSmE9bnVsbDtlbHNle3ZhciBNZT1TYShtZCksbmQ9T2EobGQpO2lmKDE4MyE9bmQuaWQpSmE9bnVsbDtlbHNle2Zvcih2YXIgV2Q9bmV3IE1hKG5kLmEpLGs9MDtHYShXZC5hKTspe3ZhciBYZD1PYShXZCk7aWYoMjQxPT1YZC5pZCl7az1TYShYZCk7YnJlYWt9fUphPXtjZDpNZSxYYzprfX19aWYoSmEpe3ZhciBZZD1iYSpKYS5jZCwKWmQ9UCtKYS5YYztpZigwPD1CKXt2YXIgQmM9bmV3IEkoZCxjLGYsWmQtMSk7YS5wdXNoKG5ldyB2ZChCLFlkLEJjKSl9Qj1ZZDtmPVpkfX19MDw9QiYmKEJjPW5ldyBJKGQsYyxmLG51bGwpLGEucHVzaChuZXcgdmQoQixjYSxCYykpKTtlPWF9fWVsc2UgZT1udWxsfWNhdGNoKCRkKXtpZighKCRkIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikpdGhyb3cgJGQ7fXJldHVybiBlfTtmdW5jdGlvbiB2ZShhLGIsYyxkLGUsZixnLGgsayxsLG0pe3RoaXMuaD1hO3RoaXMubz1iO3RoaXMuYz1jO3RoaXMubD1sfHxudWxsO3RoaXMuaj1tfHxudWxsO3RoaXMuYT1kO3RoaXMuZz1lO3RoaXMuZj1mO3RoaXMudj1nO3RoaXMuRGE9bnVsbDt0aGlzLmk9aDt0aGlzLm09a3x8bnVsbDt0aGlzLnM9bnVsbH12ZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuaT10aGlzLm89dGhpcy5oPW51bGw7dGhpcy5hLk5hKCk7dGhpcy5hPW51bGw7dGhpcy5mJiYodGhpcy5mLk5hKCksdGhpcy5mPW51bGwpO3RoaXMuZyYmKHRoaXMuZy5OYSgpLHRoaXMuZz1udWxsKTt0aGlzLkRhPW51bGx9O3ZlLnByb3RvdHlwZS5BYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLkRhfTt2ZS5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHdlKHRoaXMpfTt2ZS5wcm90b3R5cGUuWGE9ZnVuY3Rpb24oKXtyZXR1cm4gd2UodGhpcyl9OwpmdW5jdGlvbiB3ZShhKXtpZihhLkRhKXJldHVybiBhLkRhO3ZhciBiPW51bGw7YS5tJiYoYj1hLm0uZ2V0T3BlcmF0aW9uTG9nZ2VyKCJjcmVhdGVfY29udGFpbmVyX3NlZ21lbnRfaW5kZXhfc291cmNlIikuc3RhcnQoKSk7aWYobnVsbCE9PWEubCYmKG51bGwhPT1hLmp8fCJ3ZWJtIiE9PWEuYykpcmV0dXJuIHhlKGEsYS5sLGEuaixiKTt2YXIgYz1bYS5hLmZldGNoKG51bGwsbnVsbCxhLm0sYildOyJ3ZWJtIj09YS5jJiZjLnB1c2goYS5nLmZldGNoKG51bGwsbnVsbCxhLm0sYikpO2EuRGE9UHJvbWlzZS5hbGwoYykudGhlbihIKGEsZnVuY3Rpb24oYSl7cmV0dXJuIHhlKHRoaXMsYVswXSxhWzFdfHxudWxsLGIpfSkpO3JldHVybiBhLkRhfQpmdW5jdGlvbiB4ZShhLGIsYyxkKXt2YXIgZT1udWxsOyJtcDQiPT1hLmM/KGU9bmV3IENkLGU9ZS5wYXJzZShuZXcgRGF0YVZpZXcoYiksYS5hLnN0YXJ0Qnl0ZSxhLmEuYyxhLmksYS5mKSk6IndlYm0iPT1hLmMmJihlPW5ldyB1ZSxlPWUucGFyc2UobmV3IERhdGFWaWV3KGIpLG5ldyBEYXRhVmlldyhjKSxhLmEuYyxhLmkpKTtpZighZSlyZXR1cm4gYT1FcnJvcigiRmFpbGVkIHRvIHBhcnNlIFNlZ21lbnRSZWZlcmVuY2VzIGZyb20gIithLmEudG9TdHJpbmcoKSsiIChvciBvbmUgb2YgaXRzIGZhbGxiYWNrcykuIiksYS50eXBlPSJzdHJlYW0iLFByb21pc2UucmVqZWN0KGEpO3ZhciBmOyJkeW5hbWljIj09YS5oLnR5cGU/Zj1uZXcgVChlLGUuYixhLmgsYS5vLGEudik6Zj1uZXcgUihlLGUuYik7ZCYmZC5sb2coKTthLnM9ZjtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGYpfXZlLnByb3RvdHlwZS5iPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc307ZnVuY3Rpb24geWUoYSxiKXt0aGlzLmE9YTt0aGlzLm09Ynx8bnVsbH0KZnVuY3Rpb24gemUoYSxiLGMpe2Zvcih2YXIgZD0oRGF0ZS5ub3coKStEYSkvMUUzLGU9MDtlPGIuYS5sZW5ndGg7KytlKWZvcih2YXIgZj1iLmFbZV0sZz0wO2c8Zi5hLmxlbmd0aDsrK2cpe3ZhciBoPWYuYVtnXTtpZigidGV4dCIhPWguY29udGVudFR5cGUpZm9yKHZhciBrPTA7azxoLmEubGVuZ3RoOysrayl7dmFyIGw9aC5hW2tdLG09MCxtPW0rKGwuZj8xOjApLG09bSsobC5iPzE6MCksbT1tKyhsLmE/MTowKTswPT1tPyhoLmEuc3BsaWNlKGssMSksLS1rKToxIT1tJiYobC5mPyhsLmI9bnVsbCxsLmE9bnVsbCk6bC5iJiYobC5hPW51bGwpKX19QWUoYik7Zm9yKGU9MDtlPGIuYS5sZW5ndGg7KytlKWZvcihmPWIuYVtlXSxnPTA7ZzxmLmEubGVuZ3RoOysrZyl7az1oPWYuYVtnXTtsPW51bGw7Zm9yKG09MDttPGsuYS5sZW5ndGg7KyttKXt2YXIgcD1rLmFbbV0ubWltZVR5cGV8fCIiO2w/cCE9bCYmKGsuYS5zcGxpY2UobSwxKSwtLW0pOmw9cH0wPT1oLmEubGVuZ3RoJiYoZi5hLnNwbGljZShnLAoxKSwtLWcpfSJkeW5hbWljIj09Yi50eXBlJiZudWxsPT1iLmMmJihiLmM9ZCk7ZT1uZXcgZGU7ImR5bmFtaWMiPT1iLnR5cGUmJihlLmI9ITAsZS5mPWIuZyxlLmc9bmV3IEkoYyxiLmp8fGIudXJsKSxlLmk9Yi5jKTtlLmM9Yi5ofHw1O2ZvcihmPTA7ZjxiLmEubGVuZ3RoOysrZil7Zz1iLmFbZl07aWYobnVsbD09Zy5zdGFydClicmVhaztnPUJlKGEsYixnLGQsYyk7ZS5hLnB1c2goZyl9ZS5vPWIuRkJJc0xpdmVUZW1wbGF0ZWQ7ZS5zPWIuRkJXYXNMaXZlO2E9bnVsbDtjPSJub25lIjtmb3IoZj0wO2Y8Yi5hLmxlbmd0aDtmKyspZm9yKGc9Yi5hW2ZdLGQ9MDtkPGcuYS5sZW5ndGg7ZCsrKWZvcihoPWcuYVtkXSxrPTA7azxoLmEubGVuZ3RoO2srKylsPWguYVtrXS5pLG51bGwhPWwmJm51bGwhPWwudmFsdWUmJihhPWM9bC52YWx1ZSwidXJuOm1wZWc6ZGFzaDoyMzAwMzozOmF1ZGlvX2NoYW5uZWxfY29uZmlndXJhdGlvbjoyMDExIj09PWwuYSYmKCIxIj09PWE/Yz0ibW9ubyI6IjIiPT09CmEmJihjPSJzdGVyZW8iKSkpO2UubD1jO2E9cGFyc2VJbnQoYSwxMCk7ZS5qPTA8YT9hOm51bGw7cmV0dXJuIGV9CmZ1bmN0aW9uIEFlKGEpe2lmKGEuYS5sZW5ndGgpe251bGw9PWEuYVswXS5zdGFydCYmKGEuYVswXS5zdGFydD0wKTt2YXIgYj1mdW5jdGlvbihhKXtyZXR1cm4gMD09YXx8ISFhfTsiZHluYW1pYyI9PWEudHlwZSYmKGEuYj1udWxsKTtiKGEuYikmJjE9PWEuYS5sZW5ndGgmJiFiKGEuYVswXS5kdXJhdGlvbikmJihhLmFbMF0uZHVyYXRpb249YS5iKTtmb3IodmFyIGM9MCxkPSEwLGU9MDtlPGEuYS5sZW5ndGg7KytlKXt2YXIgZj1hLmFbZS0xXSxnPWEuYVtlXSxoPWEuYVtlKzFdfHx7c3RhcnQ6YS5ifTshYihnLnN0YXJ0KSYmZiYmYihmLnN0YXJ0KSYmYihmLmR1cmF0aW9uKSYmKGcuc3RhcnQ9Zi5zdGFydCtmLmR1cmF0aW9uKTshYihnLmR1cmF0aW9uKSYmYihoLnN0YXJ0KSYmKGcuZHVyYXRpb249aC5zdGFydC1nLnN0YXJ0KTtudWxsIT1nLnN0YXJ0JiZudWxsIT1nLmR1cmF0aW9uP2MrPWcuZHVyYXRpb246ZD0hMX1iKGEuYil8fChlPWEuYVthLmEubGVuZ3RoLTFdLGQ/YS5iPQpjOmIoZS5zdGFydCkmJmIoZS5kdXJhdGlvbik/YS5iPWUuc3RhcnQrZS5kdXJhdGlvbjoiZHluYW1pYyIhPWEudHlwZSYmKGEuYj1jKSl9fQpmdW5jdGlvbiBCZShhLGIsYyxkLGUpe3ZhciBmPW5ldyBjZTtmLmlkPWMuaWQ7Zi5zdGFydD1jLnN0YXJ0O2YuZHVyYXRpb249Yy5kdXJhdGlvbjt2YXIgZz1uZXcgQztjLmEuZm9yRWFjaChmdW5jdGlvbihhKXtnLnB1c2goYS5jb250ZW50VHlwZXx8IiIsYSl9KTtmb3IodmFyIGg9ZmIoZyksaz0wO2s8aC5sZW5ndGg7KytrKXt2YXIgbD1uZXcgQztnLmdldChoW2tdKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2wucHVzaChhLmdyb3VwLGEpfSk7Zm9yKHZhciBtPWZiKGwpLHA9MDtwPG0ubGVuZ3RoOysrcCl7dmFyIHY9bmV3IEM7bC5nZXQobVtwXSkuZm9yRWFjaChmdW5jdGlvbihhKXt2LnB1c2goYS5sYW5nLGEpfSk7Zm9yKHZhciB3PWZiKHYpLEI9MDtCPHcubGVuZ3RoOysrQil7dmFyIFA9di5nZXQod1tCXSksUD1DZShhLGIsYyxQLGQsZSk7Zi5hLnB1c2goUCl9fX1yZXR1cm4gZn0KZnVuY3Rpb24gQ2UoYSxiLGMsZCxlLGYpe2RhKGQuZXZlcnkoZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3JvdXA9PWRbMF0uZ3JvdXAmJihhLmxhbmd8fCIiKT09KGRbMF0ubGFuZ3x8IiIpJiYoYS5jb250ZW50VHlwZXx8IiIpPT0oZFswXS5jb250ZW50VHlwZXx8IiIpfSkpO3ZhciBnPW5ldyBVZCxoPWQuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hLmlkfSk7aC5sZW5ndGg9PWQubGVuZ3RoJiYoZy5pZD1oLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS5pZH0pLnNvcnQoKS5yZWR1Y2UoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSsiLCIrYn0pKTtnLmI9ISghZFswXS5ifHwidXJuOnNjdGU6ZGFzaDpjYzpjZWEtNjA4OjIwMTUiIT09ZFswXS5iLmEpO2cubGFuZz1kWzBdLmxhbmd8fCIiO2cuY29udGVudFR5cGU9ZFswXS5jb250ZW50VHlwZXx8IiI7Zy5mPWQuc29tZShmdW5jdGlvbihhKXtyZXR1cm4gYS5mfSk7Zm9yKHZhciBoPXt9LGs9MDtrPGQubGVuZ3RoOysrayl7dmFyIGw9CmRba107bC5jJiYoZy5jPWwuYyk7Zm9yKHZhciBtPTA7bTxsLmEubGVuZ3RoOysrbSl7dmFyIHA9bC5hW21dLHY9RGUoYSxwKSx3PWcuYS5zbGljZSgwKTtFZSh2LHcpOzA9PXcubGVuZ3RoJiYwPGcuYS5sZW5ndGh8fCEocD1GZShhLGIsYyxwLGUsZikpfHwoZy51LnB1c2gocCksZy5hPXcsaFtwLlNdPWwpfX1pZihnLmEuc29tZShmdW5jdGlvbihhKXtyZXR1cm4iIj09YS5hfSkpcmV0dXJuIGcudS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuamE9ITB9KSxnO2E9R2UoZCk7Zm9yKGs9MDtrPGcudS5sZW5ndGg7KytrKXA9Zy51W2tdLGw9aFtwLlNdLGw9PWEmJihwLmphPSEwKTtyZXR1cm4gZ30KZnVuY3Rpb24gR2UoYSl7Zm9yKHZhciBiPW51bGwsYz1udWxsLGQ9MDtkPGEubGVuZ3RoOysrZClmb3IodmFyIGU9YVtkXSxmPTA7ZjxlLmEubGVuZ3RoOysrZil7dmFyIGc9ZS5hW2ZdLGc9KGcud2lkdGh8fDEpKihnLmhlaWdodHx8MSkqKGcuYmFuZHdpZHRofHwxKTtpZihudWxsPT1ifHxnPGIpYj1nLGM9ZX1yZXR1cm4gY31mdW5jdGlvbiBFZShhLGIpe2lmKDA9PWIubGVuZ3RoKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGIsYSk7ZWxzZSBmb3IodmFyIGM9MDtjPGIubGVuZ3RoOysrYyl7Zm9yKHZhciBkPSExLGU9MDtlPGEubGVuZ3RoOysrZSl7dmFyIGY9YltjXSxnPWFbZV07aWYoZi5hPT1nLmEmJmYuaD09Zy5oJiZmLmw9PWcubCYmZi5nPT1nLmcmJmYuaT09Zy5pJiZmLmY9PWcuZiYmZi5qPT1nLmomJlFhKGYuYyxnLmMpKXtkPSEwO1JiKGJbY10sYVtlXS5iKTticmVha319ZHx8KGIuc3BsaWNlKGMsMSksLS1jKX19CmZ1bmN0aW9uIERlKGEsYil7dmFyIGM9W107aWYoMD09Yi5jLmxlbmd0aCljLnB1c2gobmV3IFBiKTtlbHNlIGlmKGEuYSlmb3IodmFyIGQ9MDtkPGIuYy5sZW5ndGg7KytkKWMucHVzaC5hcHBseShjLEhlKGEsYi5jW2RdKSk7cmV0dXJuIGN9CmZ1bmN0aW9uIEhlKGEsYil7dmFyIGM9W107aWYoMiE9YS5hLmxlbmd0aClyZXR1cm5bXTt2YXIgZD1hLmEoYi5mfHwiIixiLmMpO2lmKCEoZCYmZCBpbnN0YW5jZW9mIEFycmF5KSlyZXR1cm5bXTtmb3IodmFyIGU9MDtlPGQubGVuZ3RoOysrZSl7dmFyIGY7dmFyIGc9ZFtlXTtmPW5ldyBQYjtpZihnKXt2YXIgaD1jYihnLCJrZXlTeXN0ZW0iKTtpZihudWxsIT1oKWYuYT1oO2Vsc2UgdGhyb3cgRXJyb3IoIidrZXlTeXN0ZW0nIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBrPWNiKGcsImxpY2Vuc2VTZXJ2ZXJVcmwiKTtpZihudWxsIT1rKWYuaD1rO2Vsc2UgaWYoaCl0aHJvdyBFcnJvcigiRm9yIGVuY3J5cHRlZCBzdHJlYW1pbmcgY29udGVudCwgJ2xpY2Vuc2VTZXJ2ZXJVcmwnIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5LiIpO2g9eihnLCJ3aXRoQ3JlZGVudGlhbHMiKTtudWxsIT1oJiYoZi5sPWgpO2g9ZGIoZywibGljZW5zZVBvc3RQcm9jZXNzb3IiLEZ1bmN0aW9uKTtudWxsIT1oJiYKKGYubz1oKTtoPWRiKGcsImxpY2Vuc2VQcmVQcm9jZXNzb3IiLEZ1bmN0aW9uKTtudWxsIT1oJiYoZi5zPWgpO2g9eihnLCJkaXN0aW5jdGl2ZUlkZW50aWZpZXJSZXF1aXJlZCIpO251bGwhPWgmJihmLmc9aCk7aD16KGcsInBlcnNpc3RlbnRTdGF0ZVJlcXVpcmVkIik7bnVsbCE9aCYmKGYuaT1oKTtoPWNiKGcsImF1ZGlvUm9idXN0bmVzcyIpO251bGwhPWgmJihmLmY9aCk7aD1jYihnLCJ2aWRlb1JvYnVzdG5lc3MiKTtudWxsIT1oJiYoZi5qPWgpO2g9ZGIoZywic2VydmVyQ2VydGlmaWNhdGUiLFVpbnQ4QXJyYXkpO251bGwhPWgmJihmLmM9aCk7aWYoaD1kYihnLCJpbml0RGF0YSIsT2JqZWN0KSl7Zz1kYihoLCJpbml0RGF0YSIsVWludDhBcnJheSk7aWYobnVsbD09Zyl0aHJvdyBFcnJvcigiJ2luaXREYXRhLmluaXREYXRhJyBjYW5ub3QgYmUgbnVsbC4iKTtoPWNiKGgsImluaXREYXRhVHlwZSIpO2lmKG51bGw9PWgpdGhyb3cgRXJyb3IoIidpbml0RGF0YS5pbml0RGF0YVR5cGUnIGNhbm5vdCBiZSBudWxsLiIpOwpmLmIucHVzaCh7aW5pdERhdGE6bmV3IFVpbnQ4QXJyYXkoZy5idWZmZXIpLGluaXREYXRhVHlwZTpofSl9fTA9PWYuYi5sZW5ndGgmJmIuYSYmYi5hLnBzc2hCb3gmJlJiKGYsW3tpbml0RGF0YTpiLmEucHNzaEJveCxpbml0RGF0YVR5cGU6ImNlbmMifV0pO2MucHVzaChmKX1yZXR1cm4gY30KZnVuY3Rpb24gRmUoYSxiLGMsZCxlLGYpe2lmKCFkLmJhc2VVcmx8fDA9PT1kLmJhc2VVcmwubGVuZ3RoKXJldHVybiBudWxsO3ZhciBnPW51bGwsaD0xLGs9MDtpZihkLmYpe2c9ZC5taW1lVHlwZS5zcGxpdCgiLyIpWzFdO2lmKCJtcDQiIT1nJiYid2VibSIhPWcpZz1udWxsO2Vsc2V7dmFyIGw9ZC5mO2lmKCJ3ZWJtIiE9Z3x8bC5mKWlmKGwuYXx8bC5jJiZsLmMuYSl7aD1sLmM7aHx8KGg9bmV3IHljLGgudXJsPWQuYmFzZVVybCxoLmE9bC5hP2wuYS5jbG9uZSgpOm51bGwpO2s9SWUoaCxmKTtoPWwuZj9JZShsLmYsZik6bnVsbDtsLmc/KGw9bC5nLGw9bmV3IEkoZixkLmJhc2VVcmwsbC5HYSxsLmVuZCkpOmw9bnVsbDt2YXIgbT1sLHA9VmlkZW9QbGF5ZXJTaGFrYUdsb2JhbENvbmZpZy5nZXRCb29sKCJhZGRfaW5saW5lX2luaXRpYWxpemF0aW9uX3Jlc291cmNlcyIsITEpJiZkLmgmJmQuaC5kYXRhP2QuaC5kYXRhOm51bGwsbD1WaWRlb1BsYXllclNoYWthR2xvYmFsQ29uZmlnLmdldEJvb2woImFkZF9pbmxpbmVfaW5pdGlhbGl6YXRpb25fcmVzb3VyY2VzIiwKITEpJiZkLmcmJmQuZy5kYXRhP2QuZy5kYXRhOm51bGw7Yj1uZXcgdmUoYixjLGcsayxoLG0sZSxmLGEubSxwLGwpO2M9bmV3IHRkKGgsbCk7ZT1uZXcgUWQ7ZS5MPWI7ZS5YPWM7Zz1lfWVsc2UgZz1udWxsO2Vsc2UgZz1udWxsfWg9ZC5mLmI7az1kLmYuaH1lbHNlIGlmKGQuYilhPWQuYiwhYS5HJiYhYS5hJiYxPGEuYy5sZW5ndGg/Zz1udWxsOmEuR3x8Yy5kdXJhdGlvbnx8YS5hfHwxIT1hLmMubGVuZ3RoP2EuYSYmMD09PWEuYS5hLmxlbmd0aD9nPW51bGw6KGE9YS5nP0llKGEuZyxmKTpudWxsLGI9bmV3IE9kKGIsYyxkLGUsZiksYz1uZXcgdGQoYSksZT1uZXcgUWQsZS5MPWIsZS5YPWMsZz1lKTpnPW51bGwsaD1kLmIuYixrPWQuYi5mO2Vsc2UgaWYoZC5hKXthOmlmKGc9ZC5hLGg9MCsoZy5jPzE6MCksaCs9Zy5hPzE6MCxoKz1nLkc/MTowLDA9PWg/aD0hMTooMSE9aCYmKGcuYz8oZy5hPW51bGwsZy5HPW51bGwpOmcuYSYmKGcuRz1udWxsKSksaD0hMCksaCl7aD1udWxsO2lmKGcuZiYmCihoPShnPWQuYS5mKT9KZShkLGcsemMpOm51bGwsIWgpKXtnPW51bGw7YnJlYWsgYX1nPWg/SWUoaCxmKTpudWxsO2g9ZC5hO2guYz8oaD1kLm1pbWVUeXBlLnNwbGl0KCIvIilbMV0sIm1wNCIhPWgmJiJ3ZWJtIiE9aD9iPW51bGw6IndlYm0iIT1ofHxnP3pkKGYsZCwxLDApPyhrPShrPWQuYS5jKT9KZShkLGsseWMpOm51bGwpPyhrPUllKGssZiksYj1uZXcgdmUoYixjLGgsayxnLG51bGwsZSxmLGEubSkpOmI9bnVsbDpiPW51bGw6Yj1udWxsKTpiPWguZz9oLmE/bmV3IFBkKGIsYyxkLGUsZik6aC5HPyJkeW5hbWljIiE9Yi50eXBlJiZudWxsPT1jLmR1cmF0aW9uP251bGw6bmV3IE5kKGIsYyxkLGUsZik6bnVsbDpudWxsO2I/KGM9bmV3IHRkKGcpLGU9bmV3IFFkLGUuTD1iLGUuWD1jLGc9ZSk6Zz1udWxsfWVsc2UgZz1udWxsO2g9ZC5hLmI7az1kLmEuaH1lbHNlInRleHQiPT1kLm1pbWVUeXBlLnNwbGl0KCIvIilbMF0mJihnPW5ldyBRZCxnLkw9bmV3IHNlKG5ldyBJKGYsZC5iYXNlVXJsKSkpOwppZighZylyZXR1cm4gbnVsbDtnLmlkPWQuaWQ7ayYmKGcuYT0tMSprL2gpO2cuYmFuZHdpZHRoPWQuYmFuZHdpZHRoO2cud2lkdGg9ZC53aWR0aDtnLmhlaWdodD1kLmhlaWdodDtnLm1pbWVUeXBlPWQubWltZVR5cGV8fCIiO2cuY29kZWNzPWQuY29kZWNzfHwiIjtnLmc9ZC5vfHxudWxsO2cuaD1kLnN8fG51bGw7Zy5mYlF1YWxpdHlMYWJlbD1kLmZiUXVhbGl0eUxhYmVsfHxudWxsO2cuZmJRdWFsaXR5Q2xhc3M9ZC5mYlF1YWxpdHlDbGFzc3x8bnVsbDtnLmY9ZC5sfHxudWxsO2cuZnJhbWVSYXRlPWQuZnJhbWVSYXRlfHwiIjtnLmM9ZC5qfHxudWxsO2ZvcihiPTA7YjxkLmMubGVuZ3RoOysrYiljPWQuY1tiXSxjLmImJmcuYi5wdXNoKGMuYik7cmV0dXJuIGd9ZnVuY3Rpb24gSmUoYSxiLGMpe2I9QWQoYixhLmlkLG51bGwsYS5iYW5kd2lkdGgsbnVsbCk7aWYoIWIpcmV0dXJuIG51bGw7Yz1uZXcgYztjLnVybD1pZChhLmJhc2VVcmwsYik7cmV0dXJuIGN9CmZ1bmN0aW9uIEllKGEsYil7dmFyIGM9YS51cmwsZD0wLGU9bnVsbDthLmEmJihkPWEuYS5HYSxlPWEuYS5lbmQpO3JldHVybiBuZXcgSShiLGMsZCxlKX07ZnVuY3Rpb24gS2UoYSxiLGMsZCxlLGYpe3RoaXMuYj1uZXcgSShudWxsLFtuZXcgSihhKV0pO3RoaXMuYT1uZXcgeGI7dGhpcy5hLmJvZHk9Yjt0aGlzLmEubWV0aG9kPWM7dGhpcy5hLmI9Mzt0aGlzLmEucz1kO3RoaXMuYS5mPTFFMyoobnVsbCE9Zj9mOm1hKTthPWV8fHt9O2Zvcih2YXIgZyBpbiBhKXRoaXMuYS5jW2ddPWFbZ119ZnVuY3Rpb24gTGUoYSl7cmV0dXJuIGEuYi5mZXRjaChhLmEpLnRoZW4oZnVuY3Rpb24oYSl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgVWludDhBcnJheShhKSl9KX07ZnVuY3Rpb24gTmUoYSxiLGMpe0UuY2FsbCh0aGlzLGEpO3RoaXMuYz1iO3RoaXMuaj1jO3RoaXMuYT10aGlzLmg9bnVsbDt0aGlzLmk9bmV3IGdiO3RoaXMuYj1bXTt0aGlzLmY9W107dGhpcy5vPTA7dGhpcy5nPW5ldyBHO3RoaXMubD1udWxsO3RoaXMuQT1tYX1yKE5lLEUpO05lLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy56YT1udWxsO2Zvcih2YXIgYT0wO2E8dGhpcy5mLmxlbmd0aDsrK2EpdGhpcy5mW2FdLmNsb3NlKCkuY2F0Y2goZnVuY3Rpb24oKXt9KTt0aGlzLmY9W107dGhpcy5iPXRoaXMuYT10aGlzLmg9bnVsbDt0aGlzLmcuZGVzdHJveSgpO3RoaXMuZz1udWxsO3RoaXMuaS5kZXN0cm95KCk7dGhpcy5pPW51bGw7dGhpcy5sJiYoY2xlYXJUaW1lb3V0KHRoaXMubCksdGhpcy5sPW51bGwpO3RoaXMuYz10aGlzLmo9bnVsbH07Ck5lLnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPW5ldyBDLGI9T2UodGhpcy5qKSxjPTA7YzxiLmxlbmd0aDsrK2Mpe3ZhciBkPWJbY107ZC5hLmF8fGQuYiYmIVBlKGQuYil8fGEucHVzaChkLmNvbnRlbnRUeXBlLGQpfWZvcih2YXIgYz17fSxkPSExLGU9MDtlPGIubGVuZ3RoOysrZSl7dmFyIGY9YltlXTtpZihmLmEuYSYmIWEuYS5oYXNPd25Qcm9wZXJ0eShmLmNvbnRlbnRUeXBlKSl7dmFyIGc9Zi5hLmEsaD1jW2ddO2h8fChoPWYuYSxoPXthdWRpb0NhcGFiaWxpdGllczp2b2lkIDAsdmlkZW9DYXBhYmlsaXRpZXM6dm9pZCAwLGluaXREYXRhVHlwZXM6dm9pZCAwLGRpc3RpbmN0aXZlSWRlbnRpZmllcjpoLmc/InJlcXVpcmVkIjoib3B0aW9uYWwiLHBlcnNpc3RlbnRTdGF0ZTpoLmk/InJlcXVpcmVkIjoib3B0aW9uYWwiLHNlc3Npb25UeXBlczpbInRlbXBvcmFyeSJdfSxjW2ddPWgpO2lmKGYuYiYmKGc9Zi5jb250ZW50VHlwZSsiQ2FwYWJpbGl0aWVzIiwKZyBpbiBoKSl7ZD0hMDtoW2ddfHwoaFtnXT1bXSk7dmFyIGs7ImF1ZGlvIj09Zi5jb250ZW50VHlwZT9rPWYuYS5mOiJ2aWRlbyI9PWYuY29udGVudFR5cGUmJihrPWYuYS5qKTtoW2ddLnB1c2goe2NvbnRlbnRUeXBlOmYuYixyb2J1c3RuZXNzOmt9KX19fWlmKCFkKWlmKGIubGVuZ3RoKXRoaXMuYT1iWzBdLmE7ZWxzZSB0aHJvdyBhPUVycm9yKCJObyBEcm1JbmZvIGV4aXN0cyEiKSxhLnR5cGU9ImRybSIsYTtpZigwPT1PYmplY3Qua2V5cyhjKS5sZW5ndGgpcmV0dXJuIFFlKHRoaXMuaixhKSx0aGlzLmcucmVzb2x2ZSgpLFByb21pc2UucmVzb2x2ZSgpO2s9bmV3IEc7Yz1SZShjLGspO2M9Yy50aGVuKHRoaXMudi5iaW5kKHRoaXMsYixhKSk7ay5yZWplY3QobnVsbCk7cmV0dXJuIGN9OwpmdW5jdGlvbiBSZShhLGIpe2Zvcih2YXIgYyBpbiBhKWI9Yi5jYXRjaChmdW5jdGlvbihhLGIpe3JldHVybiBuYXZpZ2F0b3IucmVxdWVzdE1lZGlhS2V5U3lzdGVtQWNjZXNzKGEsW2JdKX0uYmluZChudWxsLGMsYVtjXSkpO3JldHVybiBifQpOZS5wcm90b3R5cGUudj1mdW5jdGlvbihhLGIsYyl7aWYoIXRoaXMuYylyZXR1cm4gU2UoKTtmb3IodmFyIGQ9Yy5rZXlTeXN0ZW0sZT1jLmdldENvbmZpZ3VyYXRpb24oKSxmPVsiYXVkaW8iLCJ2aWRlbyJdLGc9MDtnPGYubGVuZ3RoOysrZyl7dmFyIGg9ZltnXTtpZighYi5hLmhhc093blByb3BlcnR5KGgpKXt2YXIgaz1lW2grIkNhcGFiaWxpdGllcyJdO2lmKGspe2Zvcih2YXIgaz1rWzBdLGw9W10sbT17fSxwPTA7cDxhLmxlbmd0aDsrK3Ape3ZhciB2PWFbcF0sdz1rP3YuYj09ay5jb250ZW50VHlwZTp2LmNvbnRlbnRUeXBlPT1oO3YuYS5hIT1kfHwhd3x8di5pZCBpbiBtfHwobC5wdXNoKHYpLG1bdi5pZF09ITAsdGhpcy5hPXRoaXMuYT9RYih0aGlzLmEsdi5hKTp2LmEpfWIuc2V0KGgsbCl9fX1RZSh0aGlzLmosYik7cmV0dXJuIGMuY3JlYXRlTWVkaWFLZXlzKCkudGhlbihmdW5jdGlvbihhKXt0aGlzLmg9YX0uYmluZCh0aGlzKSl9OwpmdW5jdGlvbiBUZShhKXtyZXR1cm4gYS5jP2EuaD9hLmMuc2V0TWVkaWFLZXlzKGEuaCkudGhlbihIKGEsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jP3RoaXMuYS5jP3RoaXMuaC5zZXRTZXJ2ZXJDZXJ0aWZpY2F0ZSh0aGlzLmEuYyk6UHJvbWlzZS5yZXNvbHZlKCk6U2UoKX0pKS50aGVuKEgoYSxmdW5jdGlvbigpe2lmKCF0aGlzLmMpcmV0dXJuIFNlKCk7Zm9yKHZhciBhPTA7YTx0aGlzLmEuYi5sZW5ndGg7KythKXt2YXIgYz10aGlzLmEuYlthXTt0aGlzLnMoe3R5cGU6ImVuY3J5cHRlZCIsaW5pdERhdGFUeXBlOmMuaW5pdERhdGFUeXBlLGluaXREYXRhOmMuaW5pdERhdGF9KX0wPT10aGlzLmEuYi5sZW5ndGgmJkQodGhpcy5pLHRoaXMuYywiZW5jcnlwdGVkIix0aGlzLnMuYmluZCh0aGlzKSl9KSk6UHJvbWlzZS5yZXNvbHZlKCk6U2UoKX0KZnVuY3Rpb24gU2UoKXt2YXIgYT1FcnJvcigiRW1lTWFuYWdlciBkZXN0cm95ZWQiKTthLnR5cGU9ImRlc3Ryb3kiO3JldHVybiBQcm9taXNlLnJlamVjdChhKX0KTmUucHJvdG90eXBlLnM9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPW5ldyBVaW50OEFycmF5KGEuaW5pdERhdGEpLGM9MDtjPHRoaXMuYi5sZW5ndGg7KytjKWlmKFFhKGIsdGhpcy5iW2NdLmRhdGEpKXJldHVybjt0cnl7dmFyIGQ9VWUodGhpcyl9Y2F0Y2goZSl7Yj15KGUpO3RoaXMuZGlzcGF0Y2hFdmVudChiKTt0aGlzLmcucmVqZWN0KGUpO3JldHVybn1hPWQuZ2VuZXJhdGVSZXF1ZXN0KGEuaW5pdERhdGFUeXBlLGEuaW5pdERhdGEpO3RoaXMuYi5wdXNoKHtkYXRhOmIscWI6ZH0pO2EuY2F0Y2goSCh0aGlzLGZ1bmN0aW9uKGEpe2lmKHRoaXMuYyl7Zm9yKHZhciBiPTA7Yjx0aGlzLmIubGVuZ3RoOysrYilpZih0aGlzLmJbYl0ucWI9PWQpe3RoaXMuYi5zcGxpY2UoYiwxKTticmVha31iPXkoYSk7dGhpcy5kaXNwYXRjaEV2ZW50KGIpO3RoaXMuZy5yZWplY3QoYSl9fSkpO3RoaXMuZi5wdXNoKGQpfTsKZnVuY3Rpb24gVWUoYSl7dmFyIGI9bnVsbCxiPWEuaC5jcmVhdGVTZXNzaW9uKCk7RChhLmksYiwibWVzc2FnZSIsYS5DLmJpbmQoYSkpO0QoYS5pLGIsImtleXN0YXR1c2VzY2hhbmdlIixhLkIuYmluZChhKSk7cmV0dXJuIGJ9TmUucHJvdG90eXBlLkM9ZnVuY3Rpb24oYSl7VmUodGhpcyxhLnRhcmdldCx0aGlzLmEsYS5tZXNzYWdlKX07Ck5lLnByb3RvdHlwZS5CPWZ1bmN0aW9uKGEpe2E9YS50YXJnZXQ7dmFyIGI9e307YS5rZXlTdGF0dXNlcy5mb3JFYWNoKGZ1bmN0aW9uKGEsYyl7aWYoInN0cmluZyI9PXR5cGVvZiBhKXt2YXIgZj1hO2E9YztjPWZ9aWYoImNvbS5taWNyb3NvZnQucGxheXJlYWR5Ij09dGhpcy5hLmEmJjE2PT1hLmJ5dGVMZW5ndGgpe3ZhciBmPW5ldyBEYXRhVmlldyhhKSxnPWYuZ2V0VWludDMyKDAsITApLGg9Zi5nZXRVaW50MTYoNCwhMCksaz1mLmdldFVpbnQxNig2LCEwKTtmLnNldFVpbnQzMigwLGcsITEpO2Yuc2V0VWludDE2KDQsaCwhMSk7Zi5zZXRVaW50MTYoNixrLCExKX1mPU9iKG5ldyBVaW50OEFycmF5KGEpKTtiW2ZdPWN9LmJpbmQodGhpcykpO2lmKGEuZXhwaXJhdGlvbjxEYXRlLm5vdygpKXtmb3IodmFyIGM9MDtjPHRoaXMuYi5sZW5ndGg7KytjKWlmKHRoaXMuYltjXS5xYj09YSl7dGhpcy5iLnNwbGljZShjLDEpO2JyZWFrfWEuY2xvc2UoKTt0aGlzLmYuc3BsaWNlKHRoaXMuZi5pbmRleE9mKGEpLAoxKX1XZSh0aGlzLmosYil9O2Z1bmN0aW9uIFZlKGEsYixjLGQpe2Q9WGUoYyxkKTtMZShuZXcgS2UoZC51cmwsZC5ib2R5LGQubWV0aG9kLGMubCxkLmhlYWRlcnMsYS5BKSkudGhlbihIKGEsZnVuY3Rpb24oYSl7Yy5vJiYoYT1jLm8oYSkpO3JldHVybiBiLnVwZGF0ZShhKX0pKS50aGVuKEgoYSxmdW5jdGlvbigpe3ZhciBhPXgoe3R5cGU6InNlc3Npb25SZWFkeSIsZGV0YWlsOmJ9KTt0aGlzLmRpc3BhdGNoRXZlbnQoYSk7dGhpcy5vKys7dGhpcy5vPj10aGlzLmYubGVuZ3RoJiZ0aGlzLmcucmVzb2x2ZSgpfSkpLmNhdGNoKEgoYSxmdW5jdGlvbihhKXthLnFiPWI7YT15KGEpO3RoaXMuZGlzcGF0Y2hFdmVudChhKX0pKX0KZnVuY3Rpb24gWGUoYSxiKXt2YXIgYz17dXJsOmEuaCxib2R5OmIuc2xpY2UoMCksbWV0aG9kOiJQT1NUIixoZWFkZXJzOnt9fTtpZigiY29tLm1pY3Jvc29mdC5wbGF5cmVhZHkiPT09YS5hKXtmb3IodmFyIGQ9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLG5ldyBVaW50MTZBcnJheShjLmJvZHkpKSxkPShuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoZCwiYXBwbGljYXRpb24veG1sIiksZT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJuYW1lIiksZj1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2YWx1ZSIpLGc9MDtnPGUubGVuZ3RoO2crKyljLmhlYWRlcnNbZVtnXS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZV09ZltnXS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZTtjLmJvZHk9d2luZG93LmF0b2IoZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2hhbGxlbmdlIilbMF0uY2hpbGROb2Rlc1swXS5ub2RlVmFsdWUpfWlmKCFhLnMpcmV0dXJuIGM7YS5zKGMpO2MudXJsPWNiKGMsCiJ1cmwiKTtpZihudWxsPT1jLnVybCl0aHJvdyBFcnJvcigiJ3VybCcgY2Fubm90IGJlIG51bGwuIik7aWYoIShjLmJvZHkgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8InN0cmluZyI9PXR5cGVvZiBjLmJvZHl8fG51bGw9PWMuYm9keSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ2JvZHknIG11c3QgYmUgYW4gQXJyYXlCdWZmZXIsIGEgc3RyaW5nLCBvciBudWxsLiIpO2MubWV0aG9kPWNiKGMsIm1ldGhvZCIpO2lmKCJHRVQiIT1jLm1ldGhvZCYmIlBPU1QiIT1jLm1ldGhvZCl0aHJvdyBFcnJvcigiJ21ldGhvZCcgbXVzdCBiZSBlaXRoZXIgJ0dFVCcgb3IgJ1BPU1QnLiIpO2MuaGVhZGVycz1kYihjLCJoZWFkZXJzIixPYmplY3QpO2lmKG51bGw9PWMuaGVhZGVycyl0aHJvdyBFcnJvcigiJ2hlYWRlcnMnIGNhbm5vdCBiZSBudWxsLiIpO3JldHVybiBjfTtmdW5jdGlvbiBXKGEsYixjLGQsZSl7RS5jYWxsKHRoaXMsbnVsbCk7dGhpcy5jPWE7dGhpcy5mPWI7dGhpcy5hPW51bGw7dGhpcy5nPW5ldyBnYjt0aGlzLmw9dGhpcy5pPW51bGw7dGhpcy5DPTA7dGhpcy5IPXRoaXMuTj10aGlzLlU9dGhpcy5WPW51bGw7dGhpcy5KPXRoaXMuaD0hMTt0aGlzLlI9dGhpcy5UPSEwO3RoaXMuST0hMTt0aGlzLmI9e2VuYWJsZUFkYXB0YXRpb246ITAsc3RyZWFtQnVmZmVyU2l6ZToxNSxsaXZlU3RyZWFtRW5kVGltZW91dDoxNSxsaWNlbnNlUmVxdWVzdFRpbWVvdXQ6bWEsbXBkUmVxdWVzdFRpbWVvdXQ6bmEsc2VnbWVudFJlcXVlc3RUaW1lb3V0Om9hLHByZWZlcnJlZExhbmd1YWdlOiJlbiIscmVzdHJpY3Rpb25zOm5ldyBwYX07dGhpcy5tPWM7dGhpcy5EPWQ7dGhpcy5XPWU7dGhpcy5vPW51bGw7dGhpcy5qPTE7dGhpcy5PPW51bGw7dGhpcy5zPXRoaXMuQT10aGlzLnY9ITE7dGhpcy5NPW51bGx9cihXLEUpOwpxKCJzaGFrYS5wbGF5ZXIuUGxheWVyIixXKTtXLnZlcnNpb249InYxLjYuNC1mYiI7Vy5pc0Jyb3dzZXJTdXBwb3J0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hIXdpbmRvdy5NZWRpYVNvdXJjZSYmISF3aW5kb3cuVWludDhBcnJheX07ClcucHJvdG90eXBlLnZhPWZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLmE7aWYoYil7dmFyIGM9Yi5CYigpO2EuQmFuZHdpZHRoRXN0aW1hdG9yPWMuQmFuZHdpZHRoRXN0aW1hdG9yO3ZhciBkPWMuVmlkZW9Tb3VyY2VTdHJlYW07ZCYmKGEuVmlkZW9Tb3VyY2VTdHJlYW09ZCwoZD1hLlZpZGVvQnVmZmVyTWFuYWdlcj1kLnZhKCkuU291cmNlQnVmZmVyTWFuYWdlcikmJihhLlZpZGVvU291cmNlQnVmZmVyPWQudmEoKS5Tb3VyY2VCdWZmZXIpKTsoZD1hLkF1ZGlvU291cmNlU3RyZWFtPWMuQXVkaW9Tb3VyY2VTdHJlYW0pJiYoZD1hLkF1ZGlvQnVmZmVyTWFuYWdlcj1kLnZhKCkuU291cmNlQnVmZmVyTWFuYWdlcikmJihhLkF1ZGlvU291cmNlQnVmZmVyPWQudmEoKS5Tb3VyY2VCdWZmZXIpO2EuVGV4dFNvdXJjZVN0cmVhbT1jLlRleHRTb3VyY2VTdHJlYW07YS5nZXRNYW5pZmVzdD1iLnBjLmJpbmQoYil9ZWxzZSBhLmdldE1hbmlmZXN0PWZ1bmN0aW9uKCl7fTthLmVkPSEwO3JldHVybiBhfTsKVy5wcm90b3R5cGUuZ2V0RGVidWc9Vy5wcm90b3R5cGUudmE7Vy5wcm90b3R5cGUuaWE9ZnVuY3Rpb24oYSl7dGhpcy5UPWF9O1cucHJvdG90eXBlLnNldFJlc3VtZUFmdGVyQnVmZmVyaW5nPVcucHJvdG90eXBlLmlhO2Z1bmN0aW9uIFBlKGEpe3JldHVybiJ0ZXh0L3Z0dCI9PWE/ISF3aW5kb3cuVlRUQ3VlOk1lZGlhU291cmNlLmlzVHlwZVN1cHBvcnRlZChhKX1XLmlzVHlwZVN1cHBvcnRlZD1QZTtXLnNldFRleHRTdHlsZT1mdW5jdGlvbihhKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiU2hha2FQbGF5ZXJUZXh0U3R5bGUiKTtifHwoYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpLGIuaWQ9IlNoYWthUGxheWVyVGV4dFN0eWxlIixkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGIpKTtmb3IoYj1iLnNoZWV0O2IuY3NzUnVsZXMubGVuZ3RoOyliLmRlbGV0ZVJ1bGUoMCk7Yi5pbnNlcnRSdWxlKCI6OmN1ZSB7ICIrd2EoYSkrIiB9IiwwKX07ClcucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5QKCkudGhlbihIKHRoaXMsZnVuY3Rpb24oKXt0aGlzLmcuZGVzdHJveSgpO3RoaXMuYz10aGlzLmc9bnVsbDt0aGlzLk0mJnRoaXMuTS5yZW1vdmUoKX0pKS5jYXRjaChmdW5jdGlvbigpe30pfTtXLnByb3RvdHlwZS5kZXN0cm95PVcucHJvdG90eXBlLmRlc3Ryb3k7Vy5wcm90b3R5cGUuUD1mdW5jdGlvbigpe3RoaXMuST0hMDtyZXR1cm4gWWUodGhpcyl9O1cucHJvdG90eXBlLnVubG9hZD1XLnByb3RvdHlwZS5QOwpmdW5jdGlvbiBZZShhKXt2YXIgYjthLm0mJihiPWEubS5nZXRPcGVyYXRpb25Mb2dnZXIoInVubG9hZCIpLnN0YXJ0KCkpO2lmKCFhLmEpcmV0dXJuIGImJmIubG9nKCksUHJvbWlzZS5yZXNvbHZlKCk7YS5oJiZaZShhLCJ1bmxvYWRpbmciKTthLmMucGF1c2UoKTtoYihhLmcpOyRlKGEpO2FmKGEpO2EuaSYmKGEuaS5kZXN0cm95KCksYS5pPW51bGwpO2EuYSYmKGEuYS5kZXN0cm95KCksYS5hPW51bGwpO2EuYy5zcmM9IiI7dmFyIGM9UHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe2ImJmIubG9nKCl9KTthLmg9ITE7YS5KPSExO2EuQT0hMTthLnM9ITE7cmV0dXJuIGN9ZnVuY3Rpb24gYmYoYSxiKXtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXS5jb250ZW50VHlwZSxhW2NdKX1XLnByb3RvdHlwZS51YT1mdW5jdGlvbihhKXtyZXR1cm4gY2YodGhpcyxhKX07Vy5wcm90b3R5cGUubG9hZD1XLnByb3RvdHlwZS51YTsKZnVuY3Rpb24gY2YoYSxiKXt2YXIgYzthLm0mJihjPWEubS5nZXRPcGVyYXRpb25Mb2dnZXIoImxvYWQiKS5zZXRTdGF0ZSgibG9hZGluZyIpLnN0YXJ0KCksYi5tPWIuZy5wZXJmb3JtYW5jZUxvZ2dlcj1hLm0pO2EuRCYmKGIudWI9Yi5nLmFickxvZ2dlcj1hLkQpO2EuVyYmKGIuSD1hLlcpO2RmKGIsYS5jKTt2YXIgZD1udWxsO2EuST0hMTthLmEmJihkPVllKGEpLnRoZW4oSChhLGZ1bmN0aW9uKCl7cmV0dXJuIGIuYWIoKX0pKSk7YS5jLmF1dG9wbGF5JiYoZ2EoImxvYWQiKSxEKGEuZyxhLmMsInRpbWV1cGRhdGUiLGEuTGMuYmluZChhKSkpO2IuTmIoYS5iKTtiLkY9YS5PO2EuTz1udWxsO2R8fChkPWIuYWIoKSk7YS5mLmdldEJvb2woImZpeF9zaGFrYV9wbGF5ZXJfbG9hZF9yYWNlX2NvbmRpdGlvbiIsITEpJiYoYS5hPWIpO2QuY2F0Y2goSChhLGZ1bmN0aW9uKGEpe2IuZGVzdHJveSgpO3JldHVybiBQcm9taXNlLnJlamVjdChhKX0pKTtyZXR1cm4gZC50aGVuKEgoYSxmdW5jdGlvbigpe2lmKGVmKHRoaXMsCmIpKXJldHVybiBmZigpO3RoaXMuYT1iO0QodGhpcy5nLHRoaXMuYSwic2Vla3JhbmdlY2hhbmdlZCIsdGhpcy5nYS5iaW5kKHRoaXMpKTtEKHRoaXMuZyx0aGlzLmEsImFsbFN0cmVhbXNTdGFydGVkIix0aGlzLmFkLmJpbmQodGhpcykpO3ZhciBhPW5ldyBDO2JmKE9lKHRoaXMuYSksYSk7UWUodGhpcy5hLGEpO2E9dGhpcy4kKCk7YyYmMDxhLmxlbmd0aCYmKGE9YS5yZWR1Y2UoZnVuY3Rpb24oYSxiKXtpZihudWxsPT09YXx8Yi5iYW5kd2lkdGg8YS5iYW5kd2lkdGgpYT1iO3JldHVybiBhfSxudWxsKSxjLnNldExvd2VzdFF1YWxpdHlSZXByZXNlbnRhdGlvbklEKGEuc3RyZWFtSW5mb0lEKSk7aWYoIXRoaXMuYi5lbmFibGVDb250ZW50UHJvdGVjdGlvbilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7dmFyIGQ7dGhpcy5tJiYoZD10aGlzLm0uZ2V0T3BlcmF0aW9uTG9nZ2VyKCJlbWVfaW5pdCIpKTt0aGlzLmk9bmV3IE5lKHRoaXMsdGhpcy5jLHRoaXMuYSk7cmV0dXJuIHRoaXMuaS5pbml0aWFsaXplKCkudGhlbihmdW5jdGlvbigpe2QmJgpkLmxvZygpfSl9KSkudGhlbihIKGEsZnVuY3Rpb24oKXtpZihlZih0aGlzLGIpKXJldHVybiBmZigpO2dmKHRoaXMpO0QodGhpcy5nLHRoaXMuYywicGxheWluZyIsdGhpcy5RYy5iaW5kKHRoaXMpKTtEKHRoaXMuZyx0aGlzLmMsInBhdXNlIix0aGlzLmNhLmJpbmQodGhpcykpO0QodGhpcy5nLHRoaXMuYywid2FpdGluZyIsdGhpcy5XYy5iaW5kKHRoaXMpKTtEKHRoaXMuZyx0aGlzLmMsInBsYXkiLHRoaXMuZGEuYmluZCh0aGlzKSk7cmV0dXJuIGhmKHRoaXMuYSx0aGlzLHRoaXMuYyl9KSkudGhlbihIKGEsZnVuY3Rpb24oKXtpZihlZih0aGlzLGIpKXJldHVybiBmZigpO2lmKHRoaXMuYi5lbmFibGVDb250ZW50UHJvdGVjdGlvbil7dmFyIGE7dGhpcy5tJiYoYT10aGlzLm0uZ2V0T3BlcmF0aW9uTG9nZ2VyKCJlbWVfYXR0YWNoIikpO3JldHVybiBUZSh0aGlzLmkpLnRoZW4oZnVuY3Rpb24oKXthJiZhLmxvZygpfSl9cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpfSkpLnRoZW4oSChhLApmdW5jdGlvbigpe2lmKGVmKHRoaXMsYikpcmV0dXJuIGZmKCk7amYodGhpcyk7YyYmYy51cGRhdGVTdGF0ZSgicmVhZHkiKS5sb2coKX0pKS5jYXRjaChIKGEsZnVuY3Rpb24oYSl7YyYmYy5zZXRFcnJvcihKU09OLnN0cmluZ2lmeShhKSkubG9nKCk7aWYoZWYodGhpcyxiKSlyZXR1cm4gZmYoKTtpZigiZGVzdHJveSIhPWEudHlwZSl7dmFyIGQ9eShhKTt0aGlzLmRpc3BhdGNoRXZlbnQoZCl9cmV0dXJuIHRoaXMuUCgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoYSl9KX0pKX1mdW5jdGlvbiBlZihhLGIpe3JldHVybiFhLmN8fGEuSXx8YS5mLmdldEJvb2woImZpeF9zaGFrYV9wbGF5ZXJfbG9hZF9yYWNlX2NvbmRpdGlvbiIsITEpJiZiIT09YS5hfW49Vy5wcm90b3R5cGU7bi5hZD1mdW5jdGlvbigpe3RoaXMuSj0hMDt0aGlzLmg/dGhpcy5CKCk6dGhpcy5jLnBsYXliYWNrUmF0ZT10aGlzLmp9OwpmdW5jdGlvbiBmZigpe3ZhciBhPUVycm9yKCJQbGF5ZXIgZGVzdHJveWVkIik7YS50eXBlPSJkZXN0cm95IjtyZXR1cm4gUHJvbWlzZS5yZWplY3QoYSl9ZnVuY3Rpb24gZ2YoYSl7dmFyIGI9YS5jLnBhcmVudE5vZGU7YiYmYS5mLmdldEJvb2woInByZXZlbnRfcGxheWluZ19vbl9pbnN1ZmZpY2llbnRfYnVmZmVyIiwhMSkmJihhLk09ZXZlbnRMaXN0ZW5lckNhcHR1cmUoYiwicGxheWluZyIsZnVuY3Rpb24oYSl7YS50YXJnZXQ9PT10aGlzLmMmJnRoaXMuQihhKX0uYmluZChhKSkpfW4uTGM9ZnVuY3Rpb24oKXtqYSgibG9hZCIpO3RoaXMuZy5UYSh0aGlzLmMsInRpbWV1cGRhdGUiKX07bi5XYz1mdW5jdGlvbihhKXtrZih0aGlzKTt0aGlzLmYuZ2V0Qm9vbCgidW5pZnlfc3RyZWFtX3N0YXJ0X3dpdGhfYnVmZmVyX2RldGVjdG9yIiwhMSkmJiF0aGlzLmgmJnRoaXMuQihhKX07Cm4uUWM9ZnVuY3Rpb24oKXtnYSgicGxheWluZyIpO3RoaXMubSYmdGhpcy5tLmdldEV2ZW50TG9nZ2VyKCJwbGF5aW5nIikuc2V0U3RhdGUoInBsYXlpbmciKS5sb2coKTshdGhpcy5sJiYwPnRoaXMuaiYmKHRoaXMuYy5wbGF5YmFja1JhdGU9MCx0aGlzLksodGhpcy5jLmN1cnJlbnRUaW1lLERhdGUubm93KCksdGhpcy5qKSk7dGhpcy5oJiYhdGhpcy5SJiZaZSh0aGlzLCJwbGF5aW5nIil9O24uWmM9ZnVuY3Rpb24oYSl7dGhpcy5zPWF9O1cucHJvdG90eXBlLnNldFBlbmRpbmdQbGF5UmVxdWVzdD1XLnByb3RvdHlwZS5aYztXLnByb3RvdHlwZS5kYT1mdW5jdGlvbigpe3RoaXMucz0hMH07Vy5wcm90b3R5cGUuY2E9ZnVuY3Rpb24oKXt0aGlzLm0mJnRoaXMubS5nZXRFdmVudExvZ2dlcigicGF1c2UiKS5zZXRTdGF0ZSgicGF1c2VkIikubG9nKCk7amEoInBsYXlpbmciKTthZih0aGlzKX07ClcucHJvdG90eXBlLmdhPWZ1bmN0aW9uKGEpe3RoaXMuQz1hLnN0YXJ0O3RoaXMuVj1hLmxhc3Q7dGhpcy5VPWEuZW5kO3RoaXMuTj1hLnNlZWtSYW5nZUdhcHM7dGhpcy5mLmdldEJvb2woIm5vX3NraXBfZ2Fwc19vbl9zZWVrX3JhbmdlX2NoYW5nZWQiLCExKXx8a2YodGhpcyl9O1cucHJvdG90eXBlLiQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hP3RoaXMuYS5VKCk6W119O1cucHJvdG90eXBlLmdldFZpZGVvVHJhY2tzPVcucHJvdG90eXBlLiQ7Vy5wcm90b3R5cGUubmE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hP3RoaXMuYS5uYSgpOltdfTtXLnByb3RvdHlwZS5nZXRBdWRpb1RyYWNrcz1XLnByb3RvdHlwZS5uYTtXLnByb3RvdHlwZS5wYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmE/dGhpcy5hLk9iKCk6W119O1cucHJvdG90eXBlLmdldFRleHRUcmFja3M9Vy5wcm90b3R5cGUucGE7ClcucHJvdG90eXBlLnNlbGVjdFZpZGVvVHJhY2s9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5hP3RoaXMuYS5zZWxlY3RWaWRlb1RyYWNrKGEsdm9pZCAwPT1iPyEwOmIpOiExfTtXLnByb3RvdHlwZS5zZWxlY3RWaWRlb1RyYWNrPVcucHJvdG90eXBlLnNlbGVjdFZpZGVvVHJhY2s7Vy5wcm90b3R5cGUud2E9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLmE/bGYodGhpcy5hLCJhdWRpbyIsYSx2b2lkIDA9PWI/ITA6YixjKTohMX07Vy5wcm90b3R5cGUuc2VsZWN0QXVkaW9UcmFjaz1XLnByb3RvdHlwZS53YTtXLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hP2xmKHRoaXMuYSwidGV4dCIsYSwhMSk6ITF9O1cucHJvdG90eXBlLnNlbGVjdFRleHRUcmFjaz1XLnByb3RvdHlwZS54YTtXLnByb3RvdHlwZS5tYT1mdW5jdGlvbihhKXt0aGlzLmEmJm1mKHRoaXMuYSxhKX07Vy5wcm90b3R5cGUuZW5hYmxlVGV4dFRyYWNrPVcucHJvdG90eXBlLm1hOwpXLnByb3RvdHlwZS5oYT1mdW5jdGlvbihhKXthZih0aGlzKTt0aGlzLnYmJnRoaXMuaHx8ISgwPD1hKT90aGlzLmMucGF1c2VkfHwodGhpcy5jLnBsYXliYWNrUmF0ZT0wLHRoaXMuSyh0aGlzLmMuY3VycmVudFRpbWUsRGF0ZS5ub3coKSxhKSk6dGhpcy5jLnBsYXliYWNrUmF0ZT1hO3RoaXMuaj1hfTtXLnByb3RvdHlwZS5zZXRQbGF5YmFja1JhdGU9Vy5wcm90b3R5cGUuaGE7Vy5wcm90b3R5cGUuYWE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qfTtXLnByb3RvdHlwZS5nZXRQbGF5YmFja1JhdGU9Vy5wcm90b3R5cGUuYWE7Vy5wcm90b3R5cGUuQ2E9ZnVuY3Rpb24oYSl7dGhpcy5PPWF9O1cucHJvdG90eXBlLnNldFBsYXliYWNrU3RhcnRUaW1lPVcucHJvdG90eXBlLkNhO1cucHJvdG90eXBlLkY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hPyEhdGhpcy5hLk0oKTohMX07Vy5wcm90b3R5cGUuaXNMaXZlPVcucHJvdG90eXBlLkY7ClcucHJvdG90eXBlLmxhPWZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiPXooYSwiZW5hYmxlQWRhcHRhdGlvbiIpO251bGwhPWImJih0aGlzLmIuZW5hYmxlQWRhcHRhdGlvbj1iKTtiPXooYSwiZW5kQnVmZmVyaW5nT25QbGF5aW5nIik7bnVsbCE9YiYmKHRoaXMuUj1iKTtiPXooYSwidXNlUGxheWJhY2tSYXRlRm9yQnVmZmVyaW5nIik7bnVsbCE9YiYmKHRoaXMudj1iKTtiPUEoYSwic3RyZWFtQnVmZmVyU2l6ZSIsMCk7bnVsbCE9YiYmKHRoaXMuYi5zdHJlYW1CdWZmZXJTaXplPWIpO2I9QShhLCJkeW5hbWljU3RyZWFtQnVmZmVyU2l6ZSIsMCk7bnVsbCE9YiYmKHRoaXMuYi5keW5hbWljU3RyZWFtQnVmZmVyU2l6ZT1iKTtudWxsIT1hLnNtYXJ0QnVmZmVyQWRqdXN0bWVudFBhcmFtcyYmKHRoaXMuYi5zbWFydEJ1ZmZlckFkanVzdG1lbnRQYXJhbXM9YS5zbWFydEJ1ZmZlckFkanVzdG1lbnRQYXJhbXMpO2I9eihhLCJhZGRDZG5EZWJ1Z1F1ZXJ5UGFyYW1ldGVycyIpO251bGwhPWImJgoodGhpcy5iLmFkZENkbkRlYnVnUXVlcnlQYXJhbWV0ZXJzPWIpO2I9QShhLCJpbml0aWFsU3RyZWFtQnVmZmVyU2l6ZSIsMCk7bnVsbCE9YiYmKHRoaXMuYi5pbml0aWFsU3RyZWFtQnVmZmVyU2l6ZT1iKTtiPXooYSwiaW5jbHVkZVN0cmVhbUJ1ZmZlclNpemVJblN0YXJ0T2Zmc2V0Iik7bnVsbCE9YiYmKHRoaXMuYi5pbmNsdWRlU3RyZWFtQnVmZmVyU2l6ZUluU3RhcnRPZmZzZXQ9Yik7Yj1BKGEsImp1bXBUb0xpdmVUaHJlc2hvbGQiKTtudWxsIT1iJiYodGhpcy5iLmp1bXBUb0xpdmVUaHJlc2hvbGQ9Yik7Yj1BKGEsImxpdmVTdHJlYW1FbmRUaW1lb3V0IiwwKTtudWxsIT1iJiYodGhpcy5iLmxpdmVTdHJlYW1FbmRUaW1lb3V0PWIpO2I9QShhLCJsaWNlbnNlUmVxdWVzdFRpbWVvdXQiLDApO251bGwhPWImJih0aGlzLmIubGljZW5zZVJlcXVlc3RUaW1lb3V0PWIpO2I9QShhLCJtcGRSZXF1ZXN0VGltZW91dCIsMCk7bnVsbCE9YiYmKHRoaXMuYi5tcGRSZXF1ZXN0VGltZW91dD0KYik7Yj1BKGEsIm1pbk1wZFJlZnJlc2hJbnRlcnZhbCIsMCk7bnVsbCE9YiYmKHRoaXMuYi5taW5NcGRSZWZyZXNoSW50ZXJ2YWw9Yik7Yj16KGEsImVuYWJsZUxpdmVJbnRlcnJ1cHRpb25EZXRlY3Rpb24iKTtudWxsIT1iJiYodGhpcy5iLmVuYWJsZUxpdmVJbnRlcnJ1cHRpb25EZXRlY3Rpb249Yik7Yj16KGEsImVuYWJsZU1hbmlmZXN0RGVidWciKTtudWxsIT1iJiYodGhpcy5iLmVuYWJsZU1hbmlmZXN0RGVidWc9YixFLnByb3RvdHlwZS5VYj1iLGJ8fChFLnByb3RvdHlwZS5BYT1mdW5jdGlvbigpe30pKTtiPXooYSwicmVzb2x2ZVZpZGVvVGltZVVwZGF0ZU9uRnJhZ21lbnRlZFRpbWVSYW5nZXMiKTtudWxsIT1iJiYodGhpcy5iLnJlc29sdmVWaWRlb1RpbWVVcGRhdGVPbkZyYWdtZW50ZWRUaW1lUmFuZ2VzPWIpO2I9QShhLCJsaXZlSW50ZXJydXB0aW9uQ29uc2VjdXRpdmVVcGRhdGVzV2l0aG91dENoYW5nZSIpO251bGwhPWImJih0aGlzLmIubGl2ZUludGVycnVwdGlvbkNvbnNlY3V0aXZlVXBkYXRlc1dpdGhvdXRDaGFuZ2U9CmIpO2I9QShhLCJsaXZlSW50ZXJydXB0aW9uQ29uc2VjdXRpdmVVcGRhdGVzV2l0aENoYW5nZSIpO251bGwhPWImJih0aGlzLmIubGl2ZUludGVycnVwdGlvbkNvbnNlY3V0aXZlVXBkYXRlc1dpdGhDaGFuZ2U9Yik7Yj16KGEsInJlYXBwZW5kSW5pdFNlZ21lbnRBZnRlckFib3J0Iik7bnVsbCE9YiYmKHRoaXMuYi5yZWFwcGVuZEluaXRTZWdtZW50QWZ0ZXJBYm9ydD1iKTtiPXooYSwibGl2ZVNlbmRQdXNoSGVhZGVycyIpO251bGwhPWImJih0aGlzLmIubGl2ZVNlbmRQdXNoSGVhZGVycz1iKTtiPUEoYSwibGl2ZU1heE1hbmlmZXN0RmV0Y2hlc1dpdGhQdXNoIik7bnVsbCE9YiYmKHRoaXMuYi5saXZlTWF4TWFuaWZlc3RGZXRjaGVzV2l0aFB1c2g9Yik7Yj1BKGEsImxpdmVNYXhTZWdtZW50c1RvUHVzaCIpO251bGwhPWImJih0aGlzLmIubGl2ZU1heFNlZ21lbnRzVG9QdXNoPWIpO2I9QShhLCJzZWdtZW50UmVxdWVzdFRpbWVvdXQiLDApO251bGwhPWImJih0aGlzLmIuc2VnbWVudFJlcXVlc3RUaW1lb3V0PQpiKTtiPWNiKGEsInByZWZlcnJlZExhbmd1YWdlIik7bnVsbCE9YiYmKHRoaXMuYi5wcmVmZXJyZWRMYW5ndWFnZT1iKTtiPWRiKGEsInJlc3RyaWN0aW9ucyIscGEpO251bGwhPWImJih0aGlzLmIucmVzdHJpY3Rpb25zPWIuY2xvbmUoKSk7Yj1hLmxpdmVJbml0aWFsUHVzaFJlcHJlc2VudGF0aW9uO251bGwhPWImJih0aGlzLmIubGl2ZUluaXRpYWxQdXNoUmVwcmVzZW50YXRpb249Yik7Yj1hLmxpdmVBdWRpb1B1c2hSZXByZXNlbnRhdGlvbjtudWxsIT1iJiYodGhpcy5iLmxpdmVBdWRpb1B1c2hSZXByZXNlbnRhdGlvbj1iKTtiPWEudXNlSW5saW5lSW5pdFNlZ21lbnQ7bnVsbCE9YiYmKHRoaXMuYi51c2VJbmxpbmVJbml0U2VnbWVudD1iKTtiPXooYSwiZGlzYWJsZUNhY2hlQnVzdGluZ0V2ZW5UaG91Z2hJdE1heUFmZmVjdEJhbmR3aWR0aEVzdGltYXRpb24iKTtudWxsIT1iJiYoVmM9IWIpO2I9eihhLCJjdXJyZW50VGltZUR1cmluZ1JlYWR5U3RhdGVaZXJvVGhyb3dzIik7bnVsbCE9CmImJih0aGlzLmIuY3VycmVudFRpbWVEdXJpbmdSZWFkeVN0YXRlWmVyb1Rocm93cz1iKTtiPUEoYSwibGl2ZURhdGFGZXRjaE1heFJldHJpZXMiKTtudWxsIT1iJiYodGhpcy5iLmxpdmVEYXRhRmV0Y2hNYXhSZXRyaWVzPWIpO2I9QShhLCJsaXZlU291cmNlQnVmZmVyQ2xlYXJNYXhSZXRyaWVzIik7bnVsbCE9YiYmKHRoaXMuYi5saXZlU291cmNlQnVmZmVyQ2xlYXJNYXhSZXRyaWVzPWIpO2I9eihhLCJ1c2VMb25nQ2FjaGVGb3JNYW5pZmVzdCIpO251bGwhPWImJih0aGlzLmIudXNlTG9uZ0NhY2hlRm9yTWFuaWZlc3Q9Yik7Yj16KGEsImp1bXBUb0VhcmxpZXN0UG9zaXRpb25JbkN1cnJlbnRCbG9jayIpO251bGwhPWImJih0aGlzLmIuanVtcFRvRWFybGllc3RQb3NpdGlvbkluQ3VycmVudEJsb2NrPWIpO2I9eihhLCJpZ25vcmVNaW5CdWZmZXJUaW1lIik7bnVsbCE9YiYmKHRoaXMuYi5pZ25vcmVNaW5CdWZmZXJUaW1lPWIpO2I9QShhLCJwbGF5aGVhZEZyYWdtZW50ZWRHYXBEaWZmQWxsb3dhbmNlIik7Cm51bGwhPWImJih0aGlzLmIucGxheWhlYWRGcmFnbWVudGVkR2FwRGlmZkFsbG93YW5jZT1iKTtiPXooYSwiZml4QnVmZmVyaW5nR29hbERldGVybWluYXRpb24iKTtudWxsIT1iJiYodGhpcy5iLmZpeEJ1ZmZlcmluZ0dvYWxEZXRlcm1pbmF0aW9uPWIpO2I9eihhLCJza2lwRW1wdHlTZWdtZW50cyIpO251bGwhPWImJih0aGlzLmIuc2tpcEVtcHR5U2VnbWVudHM9Yik7KGI9eihhLCJ1c2VNaWNyb1Rhc2tUaW1lb3V0cyIpKSYmKHRoaXMuYi51c2VNaWNyb1Rhc2tUaW1lb3V0cz1iKTsoYj16KGEsImVuYWJsZVJlcXVlc3RQaXBlbGluaW5nIikpJiYodGhpcy5iLmVuYWJsZVJlcXVlc3RQaXBlbGluaW5nPWIpOyhiPXooYSwiZW5hYmxlU3RyZWFtaW5nIikpJiYodGhpcy5iLmVuYWJsZVN0cmVhbWluZz1iKTsoYT16KGEsImVuYWJsZUNvbnRlbnRQcm90ZWN0aW9uIikpJiYodGhpcy5iLmVuYWJsZUNvbnRlbnRQcm90ZWN0aW9uPWEpO3RoaXMuYSYmdGhpcy5hLk5iKHRoaXMuYil9fTsKVy5wcm90b3R5cGUuY29uZmlndXJlPVcucHJvdG90eXBlLmxhO1cucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEpe3RoaXMuYSYmdGhpcy5hLlNiKGEpfTtXLnByb3RvdHlwZS5zZXRFbmFibGVMaXZlaGVhZENhdGNodXA9Vy5wcm90b3R5cGUueWE7Vy5wcm90b3R5cGUudGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hP3RoaXMuYS5oYTohMX07Vy5wcm90b3R5cGUuaXNMaXZlaGVhZENhdGNodXBFbmFibGVkPVcucHJvdG90eXBlLnRhOwpmdW5jdGlvbiBrZihhKXtpZihhLmYuZ2V0Qm9vbCgic2tpcF9tYW5pZmVzdF9nYXBfYmFzZWRfb25fc3RyZWFtX2xpbWl0cyIsITEpJiYoIWEuRigpfHwhYS5mLmdldEJvb2woIm5vX3NraXBfbWFuaWZlc3RfZ2Fwc19pZl9saXZlIiwhMSkpKXt2YXIgYjthLmYuZ2V0Qm9vbCgic2tpcF9tYW5pZmVzdF9nYXBzX3VzZV9jYWNoZWRfc3RyZWFtX2xpbWl0cyIsITEpP2EuYSYmbnVsbCE9PWEuTj9iPXtzdGFydDphLkMsZW5kOmEuVSx3OmEuVixMYTphLk59OmI9YS5hP2EuYS5WYSgpOm51bGw6Yj1hLmE/YS5hLlZhKCk6bnVsbDtpZihiKWZvcih2YXIgYz1hLmYuZ2V0TnVtYmVyKCJza2lwX21hbmlmZXN0X2dhcF9ib3VuZGFyeV9wcmVjaXNpb25fbXMiLDFFMykvMUUzLGQ9Yi5MYSxlPWEuYy5wbGF5YmFja1JhdGUsZj1hLmMuY3VycmVudFRpbWUsZz0wO2c8ZC5sZW5ndGg7KytnKXt2YXIgaD1kW2ddLnN0YXJ0VGltZS1jLGs9ZFtnXS5lbmRUaW1lK2M7Zjw9ayYmZj49aCYmKGEuZi5nZXRCb29sKCJmaXhfc2Vla19yYW5nZV9nYXBfYm91bmRhcnkiLAohMSl8fChoPWRbZ10uc3RhcnRUaW1lLGs9ZFtnXS5lbmRUaW1lKSwwPD1lP2IuZW5kPmsmJihhLmMuY3VycmVudFRpbWU9ayk6Yi5zdGFydDxoJiYoYS5jLmN1cnJlbnRUaW1lPWgpKX19fVcucHJvdG90eXBlLmJhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hJiZ0aGlzLmEuVmEoKTtyZXR1cm4oYT1hJiZ7c3RhcnQ6YS5zdGFydCxlbmQ6YS5lbmQsbGFzdDphLncsc2Vla1JhbmdlR2FwczphLkxhfSl8fG51bGx9O1cucHJvdG90eXBlLmdldFZpZGVvU291cmNlU3RyZWFtTGltaXRzPVcucHJvdG90eXBlLmJhO1cucHJvdG90eXBlLm9hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYn07Vy5wcm90b3R5cGUuZ2V0Q29uZmlndXJhdGlvbj1XLnByb3RvdHlwZS5vYTtmdW5jdGlvbiBhZihhKXthLmwmJihjbGVhclRpbWVvdXQoYS5sKSxhLmw9bnVsbCl9ZnVuY3Rpb24gamYoYSl7JGUoYSk7YS5IPXNldFRpbWVvdXQoYS5CLmJpbmQoYSksMTAwKX0KZnVuY3Rpb24gJGUoYSl7YS5IJiYoY2xlYXJUaW1lb3V0KGEuSCksYS5IPW51bGwpfVcucHJvdG90eXBlLks9ZnVuY3Rpb24oYSxiLGMpe3RoaXMubD1udWxsO3ZhciBkPShEYXRlLm5vdygpLWIpLzFFMypjO3RoaXMuYy5jdXJyZW50VGltZTx0aGlzLkMrKHRoaXMuRigpPzE6LjA1KT90aGlzLmMucGF1c2UoKTooZD1NYXRoLm1heCh0aGlzLkMsYStkKSx0aGlzLmMuY3VycmVudFRpbWU9ZCx0aGlzLmw9c2V0VGltZW91dCh0aGlzLksuYmluZCh0aGlzLGEsYixjKSwyNTApKX07ZnVuY3Rpb24gbmYoYSl7cmV0dXJuIGEuZi5nZXRCb29sKCJ1bmlmeV9zdHJlYW1fc3RhcnRfd2l0aF9idWZmZXJfZGV0ZWN0b3IiLCExKSYmIWEuSn0KZnVuY3Rpb24gWmUoYSxiKXtpZighbmYoYSkpe2phKCJidWZmZXJpbmciKTthLm8mJihhLm8uc2V0Q29uY2x1ZGVyKGIpLmxvZygpLGEubz1udWxsKTtpZihhLkQpe3ZhciBjPURhdGUubm93KCk7YS5ELnNldEV2ZW50KCJidWZmZXJpbmciKS5zZXRDbGllbnRUaW1lQmVnaW4oTWF0aC5yb3VuZChjLWthKCkpKS5zZXRDbGllbnRUaW1lRW5kKE1hdGgucm91bmQoYykpLmxvZygpfWEudiYmKGEuYy5wbGF5YmFja1JhdGU9YS5qKTthLmg9ITE7YS5kaXNwYXRjaEV2ZW50KHgoe3R5cGU6ImJ1ZmZlcmluZ0VuZCJ9KSk7YS5BJiYoYS5BPSExLGRpc3BhdGNoRG9tRXZlbnQoYS5jLCJwbGF5aW5nIikpO2Eucz0hMX19ClcucHJvdG90eXBlLkI9ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZi5nZXRCb29sKCJwcmV2ZW50X3BsYXlpbmdfb25faW5zdWZmaWNpZW50X2J1ZmZlciIsITEpfHwhdGhpcy5JKXtqZih0aGlzKTt2YXIgYj1hP2EudHlwZToiIixjPSJ3YWl0aW5nIj09PWI7aWYoIXRoaXMuYy5lbmRlZCYmIXRoaXMuYy5zZWVraW5nfHxjKXt2YXIgZD10aGlzLmMuYnVmZmVyZWQsZT1kLmxlbmd0aD9kLmVuZChkLmxlbmd0aC0xKTowLGQ9TWF0aC5tYXgoZS10aGlzLmMuY3VycmVudFRpbWUsMCksZj10aGlzLmMuY3VycmVudFRpbWUsZz10aGlzLkYoKT90aGlzLmYuZ2V0TnVtYmVyKCJsaXZlX2J1ZmZlcmluZ191bmRlcmZsb3dfdGhyZXNob2xkIiwuNSk6dGhpcy5mLmdldE51bWJlcigiYnVmZmVyaW5nX3VuZGVyZmxvd190aHJlc2hvbGQiLDApLGg9dGhpcy5jLmR1cmF0aW9uLGg9aXNOYU4oaCk/MDpNYXRoLm1heChoLS4wNSwwKSxlPWU+PWh8fGY+PWgsYj1ifHwid2F0Y2hkb2dfdGltZXIiO2lmKHRoaXMuaCl7aWYob2YodGhpcywKYSksYT1wZih0aGlzLmEpLGQ+YXx8cWYodGhpcy5hKXx8dGhpcy5mLmdldEJvb2woImZpeF9idWZmZXJpbmdfYXRfdGhlX2VuZF9vZl9wbGF5YmFjayIsITApJiZlKVplKHRoaXMsYiksdGhpcy5UJiYhdGhpcy52JiZ0aGlzLmMucGxheSgpfWVsc2UgdGhpcy5jLnBhdXNlZCYmIWN8fCEoIWUmJmQ8Z3x8bmYodGhpcykpfHwodGhpcy5oPSEwLHRoaXMudj90aGlzLmMucGxheWJhY2tSYXRlPTA6dGhpcy5jLnBhdXNlKCksdGhpcy5tJiYhdGhpcy5vJiYoYz10aGlzLmMuYnVmZmVyZWQsYz1jLmxlbmd0aD9jLmVuZChjLmxlbmd0aC0xKTowLGM9TWF0aC5tYXgoYy10aGlzLmMuY3VycmVudFRpbWUsMCksYz0xRTMqKHBmKHRoaXMuYSktYyksdGhpcy5vPXRoaXMubS5nZXRPcGVyYXRpb25Mb2dnZXIoImJ1ZmZlcmluZyIpLnNldExlbmd0aChNYXRoLnJvdW5kKGMpKS5zZXRUeXBlKHRoaXMucz8ic3RhcnQvdW5wYXVzZSI6ImluX3BsYXkiKS5zZXRJbml0aWF0b3IoYikuc3RhcnQoKSksZ2EoImJ1ZmZlcmluZyIpLAp0aGlzLmRpc3BhdGNoRXZlbnQoeCh7dHlwZToiYnVmZmVyaW5nU3RhcnQifSkpLHRoaXMuZi5nZXRCb29sKCJub19za2lwX2dhcHNfb25fYnVmZmVyaW5nIiwhMSl8fGtmKHRoaXMpLG9mKHRoaXMsYSkpLHFmKHRoaXMuYSkmJlplKHRoaXMsYil9fX07ZnVuY3Rpb24gb2YoYSxiKXtiJiYicGxheWluZyI9PT1iLnR5cGUmJihhLkE9ITAsZXZlbnRLaWxsKGIpKX1XLnByb3RvdHlwZS5rYT1mdW5jdGlvbihhKXtpZih0aGlzLmEpe3ZhciBiPXRoaXMuYTtiLmMudmlkZW8mJmIuYy52aWRlby5pYyhhKX19O1cucHJvdG90eXBlLnNldFZpZGVvU3RyZWFtT2Zmc2V0PVcucHJvdG90eXBlLmthO2Z1bmN0aW9uIHJmKGEpe2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7KytiKWZvcih2YXIgYz1hW2JdLGQ9MDtkPGMuYS5sZW5ndGg7KytkKXtmb3IodmFyIGU9Yy5hW2RdLGY9ZSxnPSExLGg9MDtoPGYudS5sZW5ndGg7KytoKXt2YXIgaz1mLnVbaF07UGUoVGQoaykpPyd2aWRlby93ZWJtOyBjb2RlY3M9ImF2MSInPT09VGQoaykmJihnPSEwKTooZi51LnNwbGljZShoLDEpLC0taCl9aWYoZylmb3IoaD0wO2g8Zi51Lmxlbmd0aDsrK2gpaz1mLnVbaF0sJ3ZpZGVvL3dlYm07IGNvZGVjcz0iYXYxIichPT1UZChrKSYmKGYudS5zcGxpY2UoaCwxKSwtLWgpOzA9PWUudS5sZW5ndGgmJihjLmEuc3BsaWNlKGQsMSksLS1kKX1mb3IoYj0wO2I8YS5sZW5ndGg7KytiKWZvcihjPWFbYl0sZD0wO2Q8Yy5hLmxlbmd0aDsrK2QpYy5hW2RdLnUuc29ydChzZil9CmZ1bmN0aW9uIHNmKGEsYil7dmFyIGM9YS5iYW5kd2lkdGh8fE51bWJlci5NQVhfVkFMVUUsZD1iLmJhbmR3aWR0aHx8TnVtYmVyLk1BWF9WQUxVRTtyZXR1cm4gYzxkPy0xOmM+ZD8xOjB9O2Z1bmN0aW9uIHRmKGEpe3RoaXMuYT1hfXRmLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5hLmRlc3Ryb3koKTt0aGlzLmE9bnVsbH07dGYucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihhKXt2YXIgYj11ZihhKSxjPXVmKHRoaXMuYSk7cmV0dXJuIFByb21pc2UuYWxsKFtiLGNdKS50aGVuKEgodGhpcyxmdW5jdGlvbihiKXt2YXIgYz1iWzBdO2I9YlsxXTtyZih0aGlzLmEuYSk7YS5iJiYhdGhpcy5hLmImJihhLmg9ITApO2EuZj10aGlzLmEuZjthLmc9dGhpcy5hLmc/dGhpcy5hLmcuY2xvbmUoKTpudWxsO2EuYz10aGlzLmEuYzt2YXIgZj1bXTt2ZihhLHRoaXMuYSxjLGIsZik7cmYoYS5hKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGYpfSkpfTsKZnVuY3Rpb24gdWYoYSl7ZnVuY3Rpb24gYihhLGIpe3JldHVybiBhLmNvbmNhdChiKX12YXIgYz1hLmEubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhLmF9KS5yZWR1Y2UoYixbXSkubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhLnV9KS5yZWR1Y2UoYixbXSk7YT1jLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS5MLmNyZWF0ZSgpfSk7cmV0dXJuIFByb21pc2UuYWxsKGEpLnRoZW4oZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGY9MDtmPGMubGVuZ3RoOysrZiliW2NbZl0uU109YVtmXTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGIpfSl9CmZ1bmN0aW9uIHZmKGEsYixjLGQsZSl7dmFyIGY9bmV3IEM7YS5hLmZvckVhY2goZnVuY3Rpb24oYSxiKXtmLnB1c2goYS5pZHx8IiIrYixhKX0pO3ZhciBnPW5ldyBDO2IuYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYil7Zy5wdXNoKGEuaWR8fCIiK2IsYSl9KTthPWZiKGYpO2ZvcihiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBoPWFbYl0saz1mLmdldChoKTsxPGsubGVuZ3RofHwoaD1nLmdldChoKSkmJjAhPWgubGVuZ3RoJiYxPT1oLmxlbmd0aCYmKHdmKGtbMF0saFswXSxjLGQsZSksa1swXS5kdXJhdGlvbj1oWzBdLmR1cmF0aW9uKX19CmZ1bmN0aW9uIHdmKGEsYixjLGQsZSl7dmFyIGY9bmV3IEM7YS5hLmZvckVhY2goZnVuY3Rpb24oYSxiKXtmLnB1c2goYS5pZHx8IiIrYixhKX0pO3ZhciBnPW5ldyBDO2IuYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYil7Zy5wdXNoKGEuaWR8fCIiK2IsYSl9KTthPWZiKGYpO2ZvcihiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBoPWFbYl0saz1mLmdldChoKTsxPGsubGVuZ3RofHwoaD1nLmdldChoKSkmJjAhPWgubGVuZ3RoJiYxPT1oLmxlbmd0aCYmeGYoa1swXSxoWzBdLGMsZCxlKX19CmZ1bmN0aW9uIHhmKGEsYixjLGQsZSl7dmFyIGY9bmV3IEM7YS51LmZvckVhY2goZnVuY3Rpb24oYSxiKXtmLnB1c2goYS5pZHx8IiIrYixhKX0pO3ZhciBnPW5ldyBDO2IudS5mb3JFYWNoKGZ1bmN0aW9uKGEsYil7Zy5wdXNoKGEuaWR8fCIiK2IsYSl9KTtiPXt9O2Zvcih2YXIgaD1mYihmKSxrPTA7azxoLmxlbmd0aDsrK2spe3ZhciBsPWhba107YltsXT1sO3ZhciBtPWYuZ2V0KGwpOzE8bS5sZW5ndGh8fCgobD1nLmdldChsKSkmJjAhPWwubGVuZ3RoPzE9PWwubGVuZ3RoJiYoeWYobVswXSxsWzBdLGMsZCksbVswXS5YPWxbMF0uWCxsWzBdLlg9bnVsbCxtWzBdLmE9bFswXS5hLFZpZGVvUGxheWVyU2hha2FHbG9iYWxDb25maWcuZ2V0Qm9vbCgicmVmcmVzaF9iYW5kd2lkdGhfZnJvbV9saXZlX21hbmlmZXN0IiwhMSkmJihtWzBdLmJhbmR3aWR0aD1sWzBdLmJhbmR3aWR0aCkpOihlLnB1c2gobVswXSksYS51LnNwbGljZShhLnUuaW5kZXhPZihtWzBdKSwxKSkpfWg9ZmIoZyk7Zm9yKGs9CjA7azxoLmxlbmd0aDsrK2spbD1oW2tdLGJbbF18fChiW2xdPWwsbD1nLmdldChsKSxhLnUucHVzaChsWzBdKSl9ZnVuY3Rpb24geWYoYSxiLGMsZCl7YT1jW2EuU107ZD1kW2IuU107Yj1hLmxlbmd0aCgpO2EuaWIoZCkmJihkPWEubGVuZ3RoKCksYS5oLnB1c2goYiE9PWQpLDUwPGEuaC5sZW5ndGgmJmEuaC5zaGlmdCgpKX07ZnVuY3Rpb24gWCgpe3RoaXMuYT10aGlzLmI9bnVsbDt0aGlzLmY9bmV3IGdiO3RoaXMuYz1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7dGhpcy5pPSEwO3RoaXMuZz0hMX1xKCJzaGFrYS5tZWRpYS5TaW1wbGVBYnJNYW5hZ2VyIixYKTtYLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5mLmRlc3Ryb3koKTt0aGlzLmE9dGhpcy5iPXRoaXMuZj1udWxsfTtYLnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKGEsYil7dGhpcy5ifHx0aGlzLmF8fCh0aGlzLmI9YSx0aGlzLmE9Yil9OwpYLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbigpe3RoaXMuYiYmdGhpcy5hJiYhdGhpcy5nJiYodGhpcy5jPURhdGUubm93KCkrNEUzLEQodGhpcy5mLHRoaXMuYi5nZXRFc3RpbWF0b3IoKSwiYmFuZHdpZHRoIix0aGlzLmwuYmluZCh0aGlzKSksRCh0aGlzLmYsdGhpcy5hLCJhZGFwdGF0aW9uIix0aGlzLmouYmluZCh0aGlzKSksRCh0aGlzLmYsdGhpcy5hLCJ0cmFja3NjaGFuZ2VkIix0aGlzLmguYmluZCh0aGlzKSksdGhpcy5nPSEwKX07WC5wcm90b3R5cGUuZW5hYmxlPWZ1bmN0aW9uKGEpe3RoaXMuaT1hfTtYLnByb3RvdHlwZS5nZXRJbml0aWFsVmlkZW9UcmFja0lkPWZ1bmN0aW9uKCl7aWYoIXRoaXMuYnx8IXRoaXMuYSlyZXR1cm4gbnVsbDt2YXIgYT16Zih0aGlzKTtyZXR1cm4gYT9hLmlkOm51bGx9O1gucHJvdG90eXBlLmdldEluaXRpYWxTd2l0Y2hSZWFzb249ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH07WC5wcm90b3R5cGUuZ2V0SW5pdGlhbEF1ZGlvVHJhY2tJZD1mdW5jdGlvbigpe3JldHVybiBudWxsfTsKWC5wcm90b3R5cGUuc2VsZWN0VmlkZW9UcmFjaz1mdW5jdGlvbihhLGIsYyl7dGhpcy5nJiZ0aGlzLmEuc2VsZWN0VmlkZW9UcmFjayhhLmlkLGIsYyl9O1gucHJvdG90eXBlLmw9ZnVuY3Rpb24oKXtEYXRlLm5vdygpPHRoaXMuY3x8dGhpcy5oKCl9O1gucHJvdG90eXBlLmg9ZnVuY3Rpb24oKXtpZih0aGlzLmkpe3ZhciBhPXpmKHRoaXMpO2lmKGEpe2lmKGEuYWN0aXZlKXt0aGlzLmM9RGF0ZS5ub3coKSszRTM7cmV0dXJufXRoaXMuc2VsZWN0VmlkZW9UcmFjayhhLCExKX10aGlzLmM9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZfX07WC5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuYz09TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZJiYodGhpcy5jPURhdGUubm93KCkrM0U0KX07CmZ1bmN0aW9uIHpmKGEpe3ZhciBiPWEuYS5VKCk7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIG51bGw7Yi5zb3J0KEFhKTt2YXIgYzthOntjPWEuYS5uYSgpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7KytkKWlmKGNbZF0uYWN0aXZlKXtjPWNbZF07YnJlYWsgYX1jPW51bGx9Yz1jP2MuYmFuZHdpZHRoOjA7YT1hLmIuZ2V0QmFuZHdpZHRoKCk7Zm9yKHZhciBkPWJbMF0sZT0wO2U8Yi5sZW5ndGg7KytlKXt2YXIgZj1iW2VdLGc9ZSsxPGIubGVuZ3RoP2JbZSsxXTp7YmFuZHdpZHRoOk51bWJlci5QT1NJVElWRV9JTkZJTklUWX07aWYoZi5iYW5kd2lkdGgmJihnPShnLmJhbmR3aWR0aCtjKS8uODUsYT49KGYuYmFuZHdpZHRoK2MpLy45NSYmYTw9ZyYmKGQ9ZixkLmFjdGl2ZSkpKWJyZWFrfXJldHVybiBkfTtmdW5jdGlvbiBZKGEsYixjLGQpe0UuY2FsbCh0aGlzLG51bGwpO3RoaXMuYT1hO3RoaXMuYj1iO3RoaXMub2E9Yzt0aGlzLm1iPW5ldyBWaWRlb1BsYXllckxvY2FsQmFuZHdpZHRoRXN0aW1hdG9yKHRoaXMsYyxiKTt0aGlzLmg9bmV3IGdiO3RoaXMuaT1uZXcgTWVkaWFTb3VyY2U7dGhpcy5XPXRoaXMudmlkZW89bnVsbDt0aGlzLndiPTA7dGhpcy5RYj10aGlzLkNiPSExO3RoaXMucGI9bmE7dGhpcy51Yj10aGlzLm09bnVsbDt0aGlzLm9iPTM7dGhpcy5rYj10aGlzLkRiPXRoaXMud2E9ITE7dGhpcy5rYT1udWxsO3RoaXMuUWE9MDt0aGlzLlo9bmV3IGRkO3RoaXMuJD1udWxsO3RoaXMuS2I9MTt0aGlzLkliPUluZmluaXR5O3RoaXMueGI9dGhpcy5vYz0hMTt0aGlzLmlhPXRoaXMuQ2E9bnVsbDt0aGlzLnpiPXRoaXMueWI9dGhpcy54YT10aGlzLkViPXRoaXMuZGE9ITE7dGhpcy5mPW5ldyBDO3RoaXMuQT1kO3RoaXMuQS5pbml0aWFsaXplKHRoaXMubWIsdGhpcyk7dGhpcy5LPSExOwp0aGlzLk89ImVuIjt0aGlzLnBhPSExO3RoaXMuST1uZXcgRzt0aGlzLm5iPW5ldyBHO3RoaXMubD1uZXcgcGE7dGhpcy5DPW51bGw7dGhpcy5NYj0xO3RoaXMuYz17fTt0aGlzLmxhPW5ldyBHO3RoaXMuYWE9MDt0aGlzLmxiPTE1RTM7dGhpcy5qPW51bGw7dGhpcy5HYj0hMTt0aGlzLkZiPTA7dGhpcy50YT0hMTt0aGlzLkI9e307dGhpcy5GPXRoaXMuY2E9dGhpcy5zPW51bGw7dGhpcy5nPXt9O3RoaXMuVj0hMTt0aGlzLkhiPTA7dGhpcy5KPXRoaXMuYi5nZXROdW1iZXIoImJ1ZmZlcmluZ19vdmVyZmxvd190aHJlc2hvbGQiLDApO3RoaXMuUmI9bnVsbDt0aGlzLm89e307dGhpcy52PXt9O3RoaXMuTj1udWxsO3RoaXMuYmE9W107dGhpcy5QPXRoaXMuSD1udWxsO3RoaXMuRD1uZXcgTmV0d29ya1N0YXR1c0RldGVjdG9yO3RoaXMuSmI9ITE7dGhpcy5oYT0hMDt0aGlzLmdhPSExO3RoaXMuVGI9bmV3IFN1YnNjcmlwdGlvbnNIYW5kbGVyO3RoaXMuYi5nZXRCb29sKCJhbGxvd19pbmZpbml0ZV9yZXRyeV9vbl9uZXRfZXJyIiwKITApJiZ0aGlzLlRiLmFkZFN1YnNjcmlwdGlvbnModGhpcy5ELmFkZExpc3RlbmVyKCJuZXR3b3JrSW50ZXJydXB0ZWQiLHRoaXMucWMsdGhpcyksdGhpcy5ELmFkZExpc3RlbmVyKCJuZXR3b3JrUmVzdW1lZCIsdGhpcy51Yyx0aGlzKSx0aGlzLkQuYWRkTGlzdGVuZXIoInN5c3RlbVdha2UiLHRoaXMudmMsdGhpcykpfXIoWSxFKTtxKCJzaGFrYS5wbGF5ZXIuU3RyZWFtVmlkZW9Tb3VyY2UiLFkpO1kucHJvdG90eXBlLkJiPWZ1bmN0aW9uKCl7cmV0dXJue1ZpZGVvU291cmNlU3RyZWFtOnRoaXMuYy52aWRlbyxBdWRpb1NvdXJjZVN0cmVhbTp0aGlzLmMuYXVkaW8sVGV4dFNvdXJjZVN0cmVhbTp0aGlzLmMudGV4dCxCYW5kd2lkdGhFc3RpbWF0b3I6dGhpcy5vYX19O1kucHJvdG90eXBlLmdldFN0cmVhbURlYnVnPVkucHJvdG90eXBlLkJiO1kucHJvdG90eXBlLnNjPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYT90aGlzLmEubDoibm9uZSJ9OwpZLnByb3RvdHlwZS5nZXRNcGRBdWRpb0NvbmZpZz1ZLnByb3RvdHlwZS5zYzsKWS5wcm90b3R5cGUuTmI9ZnVuY3Rpb24oYSl7bnVsbCE9YS5zdHJlYW1CdWZmZXJTaXplJiYodGhpcy5nLnN0cmVhbUJ1ZmZlclNpemU9YS5zdHJlYW1CdWZmZXJTaXplKTtudWxsIT1hLmluaXRpYWxTdHJlYW1CdWZmZXJTaXplJiYodGhpcy5nLmluaXRpYWxTdHJlYW1CdWZmZXJTaXplPWEuaW5pdGlhbFN0cmVhbUJ1ZmZlclNpemUpO251bGwhPWEuZHluYW1pY1N0cmVhbUJ1ZmZlclNpemUmJih0aGlzLmcuZHluYW1pY1N0cmVhbUJ1ZmZlclNpemU9YS5keW5hbWljU3RyZWFtQnVmZmVyU2l6ZSk7bnVsbCE9YS5zbWFydEJ1ZmZlckFkanVzdG1lbnRQYXJhbXMmJih0aGlzLmcuc21hcnRCdWZmZXJBZGp1c3RtZW50UGFyYW1zPWEuc21hcnRCdWZmZXJBZGp1c3RtZW50UGFyYW1zKTtudWxsIT1hLmFkZENkbkRlYnVnUXVlcnlQYXJhbWV0ZXJzJiYodGhpcy5nLmFkZENkbkRlYnVnUXVlcnlQYXJhbWV0ZXJzPWEuYWRkQ2RuRGVidWdRdWVyeVBhcmFtZXRlcnMpO251bGwhPWEuc2VnbWVudFJlcXVlc3RUaW1lb3V0JiYKKHRoaXMuZy5zZWdtZW50UmVxdWVzdFRpbWVvdXQ9YS5zZWdtZW50UmVxdWVzdFRpbWVvdXQpO251bGwhPWEucmVzb2x2ZVZpZGVvVGltZVVwZGF0ZU9uRnJhZ21lbnRlZFRpbWVSYW5nZXMmJih0aGlzLmcucmVzb2x2ZVZpZGVvVGltZVVwZGF0ZU9uRnJhZ21lbnRlZFRpbWVSYW5nZXM9YS5yZXNvbHZlVmlkZW9UaW1lVXBkYXRlT25GcmFnbWVudGVkVGltZVJhbmdlcyk7bnVsbCE9YS5yZWFwcGVuZEluaXRTZWdtZW50QWZ0ZXJBYm9ydCYmKHRoaXMuZy5yZWFwcGVuZEluaXRTZWdtZW50QWZ0ZXJBYm9ydD1hLnJlYXBwZW5kSW5pdFNlZ21lbnRBZnRlckFib3J0KTtudWxsIT1hLmxpdmVEYXRhRmV0Y2hNYXhSZXRyaWVzJiYodGhpcy5nLmxpdmVEYXRhRmV0Y2hNYXhSZXRyaWVzPWEubGl2ZURhdGFGZXRjaE1heFJldHJpZXMpO251bGwhPWEubGl2ZVNvdXJjZUJ1ZmZlckNsZWFyTWF4UmV0cmllcyYmKHRoaXMuZy5saXZlU291cmNlQnVmZmVyQ2xlYXJNYXhSZXRyaWVzPWEubGl2ZVNvdXJjZUJ1ZmZlckNsZWFyTWF4UmV0cmllcyk7Cm51bGwhPWEucGxheWhlYWRGcmFnbWVudGVkR2FwRGlmZkFsbG93YW5jZSYmKHRoaXMuZy5wbGF5aGVhZEZyYWdtZW50ZWRHYXBEaWZmQWxsb3dhbmNlPWEucGxheWhlYWRGcmFnbWVudGVkR2FwRGlmZkFsbG93YW5jZSk7bnVsbCE9YS5maXhCdWZmZXJpbmdHb2FsRGV0ZXJtaW5hdGlvbiYmKHRoaXMuZy5maXhCdWZmZXJpbmdHb2FsRGV0ZXJtaW5hdGlvbj1hLmZpeEJ1ZmZlcmluZ0dvYWxEZXRlcm1pbmF0aW9uKTtudWxsIT1hLnNraXBFbXB0eVNlZ21lbnRzJiYodGhpcy5nLnNraXBFbXB0eVNlZ21lbnRzPWEuc2tpcEVtcHR5U2VnbWVudHMpO251bGwhPWEudXNlTWljcm9UYXNrVGltZW91dHMmJih0aGlzLmcudXNlTWljcm9UYXNrVGltZW91dHM9YS51c2VNaWNyb1Rhc2tUaW1lb3V0cyk7QWYodGhpcyk7bnVsbCE9YS5pbmNsdWRlU3RyZWFtQnVmZmVyU2l6ZUluU3RhcnRPZmZzZXQmJih0aGlzLkNiPUJvb2xlYW4oYS5pbmNsdWRlU3RyZWFtQnVmZmVyU2l6ZUluU3RhcnRPZmZzZXQpKTsKbnVsbCE9YS5saXZlQXVkaW9QdXNoUmVwcmVzZW50YXRpb24mJih0aGlzLmlhPVN0cmluZyhhLmxpdmVBdWRpb1B1c2hSZXByZXNlbnRhdGlvbikpO251bGwhPWEubGl2ZUluaXRpYWxQdXNoUmVwcmVzZW50YXRpb24mJih0aGlzLkNhPVN0cmluZyhhLmxpdmVJbml0aWFsUHVzaFJlcHJlc2VudGF0aW9uKSk7bnVsbCE9YS5lbmFibGVBZGFwdGF0aW9uJiZ0aGlzLkEuZW5hYmxlKEJvb2xlYW4oYS5lbmFibGVBZGFwdGF0aW9uKSk7bnVsbCE9YS5tcGRSZXF1ZXN0VGltZW91dCYmKHRoaXMucGI9TnVtYmVyKGEubXBkUmVxdWVzdFRpbWVvdXQpKTtudWxsIT1hLm1pbk1wZFJlZnJlc2hJbnRlcnZhbCYmKHRoaXMub2I9TnVtYmVyKGEubWluTXBkUmVmcmVzaEludGVydmFsKS8xRTMpO251bGwhPWEuZW5hYmxlTWFuaWZlc3REZWJ1ZyYmKHRoaXMueGI9ISFhLmVuYWJsZU1hbmlmZXN0RGVidWcpO251bGwhPWEubGl2ZVN0cmVhbUVuZFRpbWVvdXQmJih0aGlzLmxiPU51bWJlcihhLmxpdmVTdHJlYW1FbmRUaW1lb3V0KSk7Cm51bGwhPWEucHJlZmVycmVkTGFuZ3VhZ2UmJih0aGlzLk89V2EoU3RyaW5nKGEucHJlZmVycmVkTGFuZ3VhZ2UpKSk7bnVsbCE9YS5saXZlU2VuZFB1c2hIZWFkZXJzJiYodGhpcy5rYj1Cb29sZWFuKGEubGl2ZVNlbmRQdXNoSGVhZGVycykpO251bGwhPWEubGl2ZU1heE1hbmlmZXN0RmV0Y2hlc1dpdGhQdXNoJiYodGhpcy5RYT1OdW1iZXIoYS5saXZlTWF4TWFuaWZlc3RGZXRjaGVzV2l0aFB1c2gpKTtudWxsIT1hLmN1cnJlbnRUaW1lRHVyaW5nUmVhZHlTdGF0ZVplcm9UaHJvd3MmJih0aGlzLm9jPUJvb2xlYW4oYS5jdXJyZW50VGltZUR1cmluZ1JlYWR5U3RhdGVaZXJvVGhyb3dzKSk7bnVsbCE9YS5saXZlTWF4U2VnbWVudHNUb1B1c2gmJih0aGlzLkliPU51bWJlcihhLmxpdmVNYXhTZWdtZW50c1RvUHVzaCkpO251bGwhPWEuanVtcFRvTGl2ZVRocmVzaG9sZCYmKHRoaXMuRmI9TnVtYmVyKGEuanVtcFRvTGl2ZVRocmVzaG9sZCkpO251bGwhPWEucmVzdHJpY3Rpb25zJiYodGhpcy5sPQphLnJlc3RyaWN0aW9ucyx0aGlzLksmJkJmKHRoaXMpKTtudWxsIT1hLnVzZUxvbmdDYWNoZUZvck1hbmlmZXN0JiYodGhpcy5kYT1Cb29sZWFuKGEudXNlTG9uZ0NhY2hlRm9yTWFuaWZlc3QpKTtudWxsIT1hLmp1bXBUb0VhcmxpZXN0UG9zaXRpb25JbkN1cnJlbnRCbG9jayYmKHRoaXMuRWI9Qm9vbGVhbihhLmp1bXBUb0VhcmxpZXN0UG9zaXRpb25JbkN1cnJlbnRCbG9jaykpO251bGwhPWEuaWdub3JlTWluQnVmZmVyVGltZSYmKHRoaXMueGE9Qm9vbGVhbihhLmlnbm9yZU1pbkJ1ZmZlclRpbWUpKTtudWxsIT09YS5lbmFibGVSZXF1ZXN0UGlwZWxpbmluZyYmKHRoaXMueWI9Qm9vbGVhbihhLmVuYWJsZVJlcXVlc3RQaXBlbGluaW5nKSk7bnVsbCE9PWEuZW5hYmxlU3RyZWFtaW5nJiYodGhpcy56Yj1Cb29sZWFuKGEuZW5hYmxlU3RyZWFtaW5nKSl9OwpZLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5JLmRlc3Ryb3koKTt0aGlzLmxhLmRlc3Ryb3koKTt0aGlzLmxhPXRoaXMuST1udWxsO3RoaXMuY2EmJihjbGVhclRpbWVvdXQodGhpcy5jYSksdGhpcy5jYT1udWxsKTt0aGlzLnMmJihjbGVhclRpbWVvdXQodGhpcy5zKSx0aGlzLnM9bnVsbCk7dGhpcy5CPW51bGw7dGhpcy5oLmRlc3Ryb3koKTt0aGlzLmg9bnVsbDthYih0aGlzLmMpLmZvckVhY2goZnVuY3Rpb24oYSl7YS5kZXN0cm95KCl9KTt0aGlzLmY9dGhpcy5jPW51bGw7dGhpcy5hJiYodGhpcy5hLmRlc3Ryb3koKSx0aGlzLmE9bnVsbCk7dGhpcy5BLmRlc3Ryb3koKTt0aGlzLnphPXRoaXMubD10aGlzLnZpZGVvPXRoaXMuaT10aGlzLm9hPXRoaXMuQT1udWxsO3RoaXMuYi5nZXRCb29sKCJmaXhpbmdfc2NoZWR1bGVyX2Rpc2FibGVfbGVha3MiLCEwKSYmKE9iamVjdC5rZXlzKHRoaXMubykuZm9yRWFjaChmdW5jdGlvbihhKXsoYT10aGlzLm9bYV0pJiZhLmRpc2FibGUoKX0uYmluZCh0aGlzKSksCnRoaXMubz17fSk7T2JqZWN0LmtleXModGhpcy52KS5mb3JFYWNoKGZ1bmN0aW9uKGEpeyhhPXRoaXMudlthXSkmJmEuZGVzdHJveSgpfS5iaW5kKHRoaXMpKTt0aGlzLnY9e307dGhpcy5IJiYodGhpcy5ILmRpc2FibGUoKSx0aGlzLkg9bnVsbCk7dGhpcy5OJiYodGhpcy5OLmNsZWFudXAoKSx0aGlzLk49bnVsbCk7Zm9yKHZhciBhPTA7YTx0aGlzLmJhLmxlbmd0aDthKyspdGhpcy5iYVthXS5jbGVhbnVwKCk7dGhpcy5iYT1bXTt0aGlzLlRiLnJlbGVhc2UoKX07ZnVuY3Rpb24gZGYoYSxiKXtpZihhLm0pe3ZhciBjPWEubS5nZXRPcGVyYXRpb25Mb2dnZXIoIm1lZGlhX3NvdXJjZV9vcGVuIikuc3RhcnQoKTthLm5iLnRoZW4oZnVuY3Rpb24oKXtjLmxvZygpfSl9RChhLmgsYS5pLCJzb3VyY2VvcGVuIixhLk9jLmJpbmQoYSkpO2Iuc3JjPXdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGEuaSl9bj1ZLnByb3RvdHlwZTtuLlliPWZ1bmN0aW9uKCl7fTsKZnVuY3Rpb24gaGYoYSxiLGMpe3ZhciBkO2EubSYmKGQ9YS5tLmdldE9wZXJhdGlvbkxvZ2dlcigic291cmNlX2F0dGFjaCIpLnN0YXJ0KCkpO2lmKCFhLkspcmV0dXJuIGE9RXJyb3IoIkNhbm5vdCBjYWxsIGF0dGFjaCgpIHJpZ2h0IG5vdy4iKSxhLnR5cGU9ImFwcCIsZCYmZC5zZXRFcnJvcihhKS5sb2coKSxQcm9taXNlLnJlamVjdChhKTthLnphPWI7YS52aWRlbz1jO2EuVz1udWxsO2EuYi5nZXRCb29sKCJlbmFibGVfdmlld3BvcnRfcHJpb3JpdHlfYWRqdXN0bWVudCIsITEpJiYoYS5OPW5ldyBWaWV3cG9ydFByaW9yaXR5QWRqdXN0ZXIoYS52aWRlbyksYS5OLnNldE9uUHJpb3JpdHlDaGFuZ2VkKGZ1bmN0aW9uKGEpe09iamVjdC5rZXlzKHRoaXMubykuZm9yRWFjaChmdW5jdGlvbihiKXt0aGlzLm9bYl0udXBkYXRlUHJpb3JpdHlXaXRoTmV3QWRqdXN0bWVudChhKX0uYmluZCh0aGlzKSl9LmJpbmQoYSkpKTthLmIuZ2V0Qm9vbCgiZW5hYmxlX2ZpcnN0X3ZpZGVvX3ByaW9yaXR5X2FkanVzdG1lbnQiLAohMSkmJmEuYmEucHVzaChuZXcgRmlyc3RMb2FkZWRWaWRlb1ByaW9yaXR5QWRqdXN0ZXIoYS52aWRlbykpO0QoYS5oLGEudmlkZW8sImxvYWRlZG1ldGFkYXRhIixhLk5jLmJpbmQoYSkpO0QoYS5oLGEub2EsImJhbmR3aWR0aCIsYS5iZC5iaW5kKGEpKTtpZihhLmEuYnx8YS5iLmdldEJvb2woImJhY2tfb2ZmX2J1ZmZlcmluZ19vdmVyZmxvdyIsITEpKUQoYS5oLGIsImJ1ZmZlcmluZ1N0YXJ0IixhLkpjLmJpbmQoYSkpLEQoYS5oLGIsImJ1ZmZlcmluZ0VuZCIsYS5JYy5iaW5kKGEpKTtiPWEuYi5nZXRCb29sKCJlbmFibGVfY29udGVudF9wcm90ZWN0aW9uIiwhMSk/KGI9YS52aWRlby5tZWRpYUtleXMpJiZhLnZpZGVvLnNldE1lZGlhS2V5cz9hLnZpZGVvLnNldE1lZGlhS2V5cyhiKTpQcm9taXNlLnJlc29sdmUoKTpQcm9taXNlLnJlc29sdmUoKTtDZihhKS50aGVuKEgoYSxmdW5jdGlvbigpe2QmJnRoaXMuTSgpJiZkLnNldExpdmVoZWFkUG9zaXRpb24oRGYoRWYodGhpcykpKTsKdGhpcy5JJiZ0aGlzLkkucmVzb2x2ZSgpO3RoaXMuWWIoKX0pKS5jYXRjaChIKGEsZnVuY3Rpb24oYSl7dGhpcy5JJiZ0aGlzLkkucmVqZWN0KGEpfSkpO3JldHVybiBQcm9taXNlLmFsbChbYS5JLGJdKS50aGVuKGZ1bmN0aW9uKCl7ZCYmZC5sb2coKX0pfQpuLmFiPWZ1bmN0aW9uKCl7aWYodGhpcy5LKXt2YXIgYT1FcnJvcigiQ2Fubm90IGNhbGwgbG9hZCgpIHJpZ2h0IG5vdy4iKTthLnR5cGU9ImFwcCI7cmV0dXJuIFByb21pc2UucmVqZWN0KGEpfWlmKCF0aGlzLmF8fDA9PXRoaXMuYS5hLmxlbmd0aClyZXR1cm4gYT1FcnJvcigiVGhlIG1hbmlmZXN0IGRvZXMgbm90IHNwZWNpZnkgYW55IGNvbnRlbnQuIiksYS50eXBlPSJzdHJlYW0iLFByb21pc2UucmVqZWN0KGEpO3JmKHRoaXMuYS5hKTtpZigwPT10aGlzLmEuYS5sZW5ndGh8fDA9PXRoaXMuYS5hWzBdLmEubGVuZ3RofHwhdGhpcy5hLmFbMF0uYS5zb21lKGZ1bmN0aW9uKGEpe3JldHVybiJ2aWRlbyI9PT1hLmNvbnRlbnRUeXBlfSkpcmV0dXJuIGE9RXJyb3IoIlRoZSBtYW5pZmVzdCBzcGVjaWZpZXMgY29udGVudCB0aGF0IGNhbm5vdCBiZSBkaXNwbGF5ZWQgb24gdGhpcyBicm93c2VyL3BsYXRmb3JtLiIpLGEudHlwZT0ic3RyZWFtIixQcm9taXNlLnJlamVjdChhKTt0aGlzLks9CiEwO3RoaXMueGF8fCh0aGlzLmcuaW5pdGlhbFN0cmVhbUJ1ZmZlclNpemU9TWF0aC5tYXgodGhpcy5nLmluaXRpYWxTdHJlYW1CdWZmZXJTaXplfHwwLHRoaXMuYS5jKSk7QWYodGhpcyk7QmYodGhpcyk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpfTtmdW5jdGlvbiBGZihhKXt2YXIgYj14KHt0eXBlOiJtYW5pZmVzdHdyYXBwZWQiLGJ1YmJsZXM6ITB9KTthLmRpc3BhdGNoRXZlbnQoYil9ZnVuY3Rpb24gR2YoYSxiKXt2YXIgYz14KHt0eXBlOiJsaXZlaGVhZElkbGVBdCIsc2Vjb25kczpiLGJ1YmJsZXM6ITB9KTthLmRpc3BhdGNoRXZlbnQoYyl9ZnVuY3Rpb24gRGYoYSl7cmV0dXJuIE1hdGgubWluLmFwcGx5KE1hdGgsYS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RoKCk/YS53KCkuZW5kVGltZTpudWxsfSkuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiEhYX0pKX0Kbi52Yj1mdW5jdGlvbihhLGIpe3ZhciBjO3RoaXMuYi5nZXRCb29sKCJkZWNvdXBsZV9tcGRfdXBkYXRlX2xvb3BfZnJvbV9yZXF1ZXN0X2xvb3AiLCExKSYmSGYodGhpcywwKTt0aGlzLm0mJihjPXRoaXMubS5nZXRPcGVyYXRpb25Mb2dnZXIoInVwZGF0ZV9tYW5pZmVzdCIpLnN0YXJ0KCkpO2lmKCFifHx0aGlzLkspe3ZhciBkPURhdGUubm93KCk7dGhpcy5iLmdldEJvb2woImRlY291cGxlX21wZF91cGRhdGVfbG9vcF9mcm9tX3JlcXVlc3RfbG9vcCIsITEpfHwodGhpcy5zPW51bGwpO3ZhciBlPW51bGwsZixnO2lmKHRoaXMua2ImJighdGhpcy5RYXx8dGhpcy5RYT50aGlzLktiKSl7Zj1NYXRoLmZsb29yKElmKHRoaXMpKSsxO2Y9TWF0aC5taW4oZix0aGlzLkliKTt2YXIgaD10aGlzLmMudmlkZW87aWYoaD1oP2gucmIoKTpudWxsKWg9aC53KCksbnVsbCE9aC51bnNjYWxlZFN0YXJ0VGltZSYmKGc9aC51bnNjYWxlZFN0YXJ0VGltZSk7aWYodGhpcy52aWRlby5wYXVzZWR8fHRoaXMuVilmPQowfWYmJnRoaXMuS2IrKztoPXRoaXMuYS5nO2g9dGhpcy5iLmdldEJvb2woImVuYWJsZV9jbGVhbl9mYWlsb3Zlcl91cmlfb25fbXBkX3JlcXVlc3RzIiwhMCk/aC5jbG9uZSgpOmg7YyYmIWEmJmMuc2V0UmVzb3VyY2UoaC50b1N0cmluZygpKTsoYT90aGlzLmFjKCk6dGhpcy5iYyhoLGYsZykpLnRoZW4oSCh0aGlzLGZ1bmN0aW9uKGIpe2F8fHRoaXMuRC5pbmZvcm1OZXR3b3JrUmVzdW1lZCgpO2U9bmV3IHRmKGIpO3JldHVybiBlLnVwZGF0ZSh0aGlzLmEpfSkpLnRoZW4oSCh0aGlzLGZ1bmN0aW9uKGEpe2lmKHRoaXMubSl7dmFyIGY9SmYodGhpcyk7bnVsbCE9ZiYmdGhpcy5tLnNldEJpdHJhdGUoZi5iYW5kd2lkdGgpfWUuZGVzdHJveSgpO2U9bnVsbDtmPUVmKHRoaXMpO3RoaXMuQWEoIlNlZ21lbnRJbmRleGVzVXBkYXRlZCIsZik7aWYodGhpcy5iLmdldEJvb2woImVtaXRfbGl2ZV9wbGF5aGVhZF9pZGxlX2Zyb21fY2xpZW50IiwhMCkpe3ZhciBoPXRoaXMuYi5nZXROdW1iZXIoImxpdmVfcGxheWhlYWRfaWRsZV9hbGxfc3RyZWFtX3RocmVzaG9sZCIsCjQpLGc9dGhpcy5iLmdldE51bWJlcigibGl2ZV9wbGF5aGVhZF9pZGxlX3NpbmdsZV9zdHJlYW1fdGhyZXNob2xkIiw1KTtpZihFZih0aGlzKS5ldmVyeShmdW5jdGlvbihhKXtyZXR1cm4gYS5BKCk+PWh9KXx8RWYodGhpcykuc29tZShmdW5jdGlvbihhKXtyZXR1cm4gYS5BKCk+PWd9KSl7dmFyIHY9RGYoZik7R2YodGhpcyx2KX19Zi5zb21lKGZ1bmN0aW9uKGEpe3JldHVybiBhLmVifSkmJkZmKHRoaXMpO3Y9S2YodGhpcyxmKTtjJiZ0aGlzLk0oKSYmYy5zZXRMaXZlaGVhZFBvc2l0aW9uKERmKGYpKTtjJiZjLnNldE1hbmlmZXN0VHlwZSh0aGlzLmEuYj8iZHluYW1pYyI6InN0YXRpYyIpO3RoaXMuaGEmJkxmKHRoaXMsdik7dGhpcy5iLmdldEJvb2woInNraXBfcmVtYWluaW5nX2J1ZmZlcmVkX29uX3N0cmVhbV9lbmQiLCExKSYmdiYmdGhpcy5hLmImJnRoaXMuYS5oJiZ0aGlzLnZpZGVvLnBhdXNlZCYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9dGhpcy5hYS0uMSk7aWYocWYodGhpcykpcmV0dXJuIGMmJgpjLmxvZygpLHRoaXMuUGEoKTtmb3IoZj0wO2Y8YS5sZW5ndGg7KytmKU1mKHRoaXMsYVtmXSk7dGhpcy54YXx8KHRoaXMuZy5pbml0aWFsU3RyZWFtQnVmZmVyU2l6ZT1NYXRoLm1heCh0aGlzLmcuaW5pdGlhbFN0cmVhbUJ1ZmZlclNpemV8fDAsdGhpcy5hLmMpKTt0aGlzLmcudXNlSW5pdGlhbEJ1ZmZlclNpemVXaGVuUGF1c2VkPXRoaXMuYS5iO0FmKHRoaXMpO0JmKHRoaXMpOzA9PU9iamVjdC5rZXlzKHRoaXMuYykubGVuZ3RoP0NmKHRoaXMpOihhPURhdGUubm93KCksYnx8SGYodGhpcywoYS1kKS8xRTMpKTtjJiZjLmxvZygpfSkpLmNhdGNoKEgodGhpcyxmdW5jdGlvbihhKXtjJiZjLnNldEVycm9yKGEpLmxvZygpO2UmJihlLmRlc3Ryb3koKSxlPW51bGwpO2lmKCFiKXt2YXIgZD1bMCw0MTBdO3RoaXMuYS5vJiYoZD1kLmNvbmNhdChbNTAyLDUwM10pKTtkPXRoaXMuYi5nZXRCb29sKCJmaXhfbGl2ZV9zdHJlYW1fZ29uZV9vbl9tYW5pZmVzdF91cGRhdGUiLCEwKT8tMT09PWQuaW5kZXhPZihhLnN0YXR1cyk6CjAhPT1hLnN0YXR1cztpZih0aGlzLmIuZ2V0Qm9vbCgiYWxsb3dfaW5maW5pdGVfcmV0cnlfb25fbmV0X2VyciIsITApJiYibmV0Ij09PWEudHlwZSYmIWQpc3dpdGNoKGEuc3RhdHVzKXtjYXNlIDQxMDp0aGlzLkpiPSEwO3RoaXMuaiYmKGNsZWFyVGltZW91dCh0aGlzLmopLHRoaXMuaj1udWxsKTt0aGlzLlBhKCk7YnJlYWs7ZGVmYXVsdDpOZih0aGlzKX0wPT09YS5zdGF0dXM/dGhpcy5ELmluZm9ybU5ldHdvcmtJbnRlcnJ1cHRlZCgpOnRoaXMuRC5pbmZvcm1OZXR3b3JrUmVzdW1lZCgpO2lmKCJkZWxheSI9PWEudHlwZSlyZXR1cm4gTmYodGhpcyk7dGhpcy5iLmdldEJvb2woImFsbG93X2luZmluaXRlX3JldHJ5X29uX25ldF9lcnIiLCEwKSYmIWR8fCJhYm9ydGVkIj09YS50eXBlfHwoYT15KGEpLHRoaXMuZGlzcGF0Y2hFdmVudChhKSx0aGlzLmEmJk5mKHRoaXMpKX19KSl9fTtuLmJjPWZ1bmN0aW9uKCl7cmV0dXJuIFByb21pc2UucmVqZWN0KCJDYW5ub3QgdXBkYXRlIG1hbmlmZXN0IHdpdGggdGhpcyBWaWRlb1NvdXJjZSBpbXBsZW1lbnRhdGlvbi4iKX07Cm4uYWM9ZnVuY3Rpb24oKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoIkNhbm5vdCB1cGRhdGUgbWFuaWZlc3Qgd2l0aCB0aGlzIFZpZGVvU291cmNlIGltcGxlbWVudGF0aW9uLiIpfTtmdW5jdGlvbiBMZihhLGIpe2lmKGImJmEuYSYmYS5hLmIpe3ZhciBjPWEuYi5nZXRCb29sKCJzZWVrX292ZXJfdW5hdmFpbGFibGVfc2VnbWVudHNfb25fbWFuaWZlc3RfdXBkYXRlIiwhMSkmJmEuZ2E7KGEudmlkZW8ucGF1c2VkfHxjKSYmYi5lbmQ+YS52aWRlby5jdXJyZW50VGltZSsxMCYmKCFhLmIuZ2V0Qm9vbCgidXNlX29uX2RlbWFuZF9saXZlaGVhZF9jYXRjaHVwIiwhMSl8fGM/KGEuZ2E9ITEsYS52aWRlby5jdXJyZW50VGltZT1iLmVuZCk6YS5rYT1iLmVuZCl9fQpmdW5jdGlvbiBIZihhLGIpe2lmKG51bGwhPWEuYS5mKXtpZihhLmIuZ2V0Qm9vbCgiZGVjb3VwbGVfbXBkX3VwZGF0ZV9sb29wX2Zyb21fcmVxdWVzdF9sb29wIiwhMSkmJihhLnMmJihjbGVhclRpbWVvdXQoYS5zKSxhLnM9bnVsbCkscWYoYSkpKXJldHVybjt2YXIgYz1NYXRoLm1heChhLmEuZixhLm9iKSxjPU1hdGgubWF4KGMtYiwwKSxkPWEudmIuYmluZChhLCExKTshYyYmYS5nLnVzZU1pY3JvVGFza1RpbWVvdXRzP1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oZCk6YS5zPXNldFRpbWVvdXQoZCwxRTMqYyl9fQpmdW5jdGlvbiBNZihhLGIpe3ZhciBjPVNkKGIpLGQ9YS5jW2NdO2lmKGQmJmQuSWEoKT09Yil7dmFyIGU9YS5mLmdldChTZChiKSkubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhLnV9KS5yZWR1Y2UoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jb25jYXQoYil9LFtdKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuamEmJmEuWX0pO2lmKDA9PWUubGVuZ3RoKXtjPUVycm9yKCJBbGwgdXNhYmxlIHN0cmVhbXMgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbWFuaWZlc3QuIik7Yy50eXBlPSJhcHAiO2M9eShjKTthLmRpc3BhdGNoRXZlbnQoYyk7cmV0dXJufWEuQltjXS5rYz09YiYmZGVsZXRlIGEuQltjXTtkLlJhKGVbMF0sITApO2IuZGVzdHJveSgpfWIuZGVzdHJveSgpfW4uJGM9ZnVuY3Rpb24oYSl7dGhpcy5SYj1hfTtZLnByb3RvdHlwZS5zZXRUYWdnZWRUaW1lUmFuZ2VzPVkucHJvdG90eXBlLiRjOwpZLnByb3RvdHlwZS5EYz1mdW5jdGlvbigpe3JldHVybiAwPT09T2JqZWN0LmtleXModGhpcy5jKS5sZW5ndGg/ITE6WyJhdWRpbyIsInZpZGVvIl0uZXZlcnkoSCh0aGlzLGZ1bmN0aW9uKGEpe3JldHVybiF0aGlzLmNbYV18fHRoaXMuY1thXS5NfSkpfTtZLnByb3RvdHlwZS5oYXNIaXRCdWZmZXJpbmdHb2FsPVkucHJvdG90eXBlLkRjOwpZLnByb3RvdHlwZS5VPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLmZ8fCF0aGlzLmYuYS5oYXNPd25Qcm9wZXJ0eSgidmlkZW8iKSlyZXR1cm5bXTthPWEmJmEudXNlTG9jYWxCaXRyYXRlfHwhMTt2YXIgYj10aGlzLmMudmlkZW8sYz1iP2IuSWEoKTpudWxsLGQ9Yz9jLlM6MCxlPTEsZj1udWxsO3RoaXMuYi5nZXRCb29sKCJ1c2VfbGl2ZV9iaXRyYXRlX2VzdGltYXRlcyIsITEpJiZ0aGlzLk0oKSYmbnVsbCE9YiYmKGY9Yi5sYSgpLG51bGwhPWMmJjA8Yy5iYW5kd2lkdGgmJihlPWYvYy5iYW5kd2lkdGgpKTtmb3IodmFyIGM9W10sZz10aGlzLmYuZ2V0KCJ2aWRlbyIpLGg9MDtoPGcubGVuZ3RoOysraClmb3IodmFyIGs9Z1toXSxsPTA7bDxrLnUubGVuZ3RoOysrbCl7dmFyIG09ay51W2xdO2lmKG0uamEmJm0uWSl7dmFyIHA9bnVsbDtpZihhJiZudWxsIT09bS5MKXt2YXIgdj1tLkwuYigpLHc9YjtpZih0aGlzLk0oKXx8bnVsbD09PXZ8fG51bGw9PT13KXA9bnVsbDtlbHNle3ZhciBwPXJlKHcsCnRoaXMudmlkZW8uY3VycmVudFRpbWUsdiksQj12LmwoKTt0aGlzLmIuZ2V0Qm9vbCgic3RhcnRfbG9jYWxfYml0cmF0ZV9hdF9idWZmZXJfZW5kIiwhMSkmJih3PUxvY2FsQml0cmF0ZUhlbHBlci5nZXRCdWZmZXJFbmRTZWdtZW50SW5kZXgoQixwLHRoaXMudmlkZW8uY3VycmVudFRpbWUramUodyx0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSksbnVsbCE9PXcmJihwPXcpKTtwPUxvY2FsQml0cmF0ZUhlbHBlci5nZXRMb2NhbEJpdHJhdGUodi5sKCkscCx0aGlzLmIuZ2V0TnVtYmVyKCJsb2NhbF9iaXRyYXRlX3NlZ21lbnRzX2FoZWFkIiwxMCkpfXRoaXMuYi5nZXRCb29sKCJ1c2VfbWF4X2xvY2FsX2JpdHJhdGUiLCExKSYmKHA9TWF0aC5tYXgocCxtLmJhbmR3aWR0aCkpfXY9bS5TO3A9cHx8bS5iYW5kd2lkdGg7dGhpcy5iLmdldEJvb2woInVzZV9saXZlX2JpdHJhdGVfZXN0aW1hdGVzIiwhMSkmJm51bGwhPWYmJih2PT09ZD9wPU1hdGgubWF4KHAsZik6MTxlJiYocD1wKmUpLHA9TWF0aC5yb3VuZChwKSk7Cm09bmV3IHphKHYscCxtLndpZHRoLG0uaGVpZ2h0LG0uaWQsbS5mYlF1YWxpdHlMYWJlbCxtLmZiUXVhbGl0eUNsYXNzLG0uZixtLmZyYW1lUmF0ZSxtLm1pbWVUeXBlLG0uY29kZWNzLG0uZyxtLmgpO3Y9PWQmJihtLmFjdGl2ZT0hMCk7Yy5wdXNoKG0pfX1yZXR1cm4gY307WS5wcm90b3R5cGUuZ2V0VmlkZW9UcmFja3M9WS5wcm90b3R5cGUuVTtZLnByb3RvdHlwZS50Yz1mdW5jdGlvbigpe2lmKHRoaXMuJClyZXR1cm4gdGhpcy4kO2lmKCF0aGlzLmEpcmV0dXJuIG51bGw7Zm9yKHZhciBhPTA7YTx0aGlzLmEuYS5sZW5ndGg7KythKWZvcih2YXIgYj10aGlzLmEuYVthXSxjPTA7YzxiLmEubGVuZ3RoOysrYylpZih0aGlzLiQ9Yi5hW2NdLmMpcmV0dXJuIHRoaXMuJDtyZXR1cm4gbnVsbH07WS5wcm90b3R5cGUuZ2V0VmlkZW9Qcm9qZWN0aW9uPVkucHJvdG90eXBlLnRjO1kucHJvdG90eXBlLnJjPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWJ9OwpZLnByb3RvdHlwZS5nZXRMb2NhbEVzdGltYXRvcj1ZLnByb3RvdHlwZS5yYztmdW5jdGlvbiBKZihhKXthPWEuVSgpO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWlmKGFbYl0uYWN0aXZlKXJldHVybiBhW2JdfVkucHJvdG90eXBlLm5hPWZ1bmN0aW9uKCl7aWYoIXRoaXMuZnx8IXRoaXMuZi5hLmhhc093blByb3BlcnR5KCJhdWRpbyIpKXJldHVybltdO2Zvcih2YXIgYT10aGlzLmMuYXVkaW8sYT0oYT1hP2EuSWEoKTpudWxsKT9hLlM6MCxiPVtdLGM9dGhpcy5mLmdldCgiYXVkaW8iKSxkPTA7ZDxjLmxlbmd0aDsrK2QpZm9yKHZhciBlPWNbZF0sZj1lLmxhbmcsZz0wO2c8ZS51Lmxlbmd0aDsrK2cpe3ZhciBoPWUudVtnXTtpZihoLmphJiZoLlkpe3ZhciBrPWguUyxoPW5ldyBsYShrLGguYmFuZHdpZHRoLGYsaC5pZCxoLm1pbWVUeXBlLGguY29kZWNzLHRoaXMuYS5qLGguYyk7az09YSYmKGguYWN0aXZlPSEwKTtiLnB1c2goaCl9fXJldHVybiBifTsKWS5wcm90b3R5cGUuZ2V0QXVkaW9UcmFja3M9WS5wcm90b3R5cGUubmE7WS5wcm90b3R5cGUuT2I9ZnVuY3Rpb24oKXtpZighdGhpcy5mfHwhdGhpcy5mLmEuaGFzT3duUHJvcGVydHkoInRleHQiKSlyZXR1cm5bXTtmb3IodmFyIGE9dGhpcy5jLnRleHQsYj1hP2EuSWEoKTpudWxsLGI9Yj9iLlM6MCxjPVtdLGQ9dGhpcy5mLmdldCgidGV4dCIpLGU9MDtlPGQubGVuZ3RoOysrZSlmb3IodmFyIGY9ZFtlXSxnPWYubGFuZyxoPTA7aDxmLnUubGVuZ3RoOysraCl7dmFyIGs9Zi51W2hdLlMsbD1uZXcgeWEoayxnKTtrPT1iJiYobC5hY3RpdmU9ITAsbC5lbmFibGVkPWEuZmIoKSk7Yy5wdXNoKGwpfXJldHVybiBjfTtZLnByb3RvdHlwZS5nZXRUZXh0VHJhY2tzPVkucHJvdG90eXBlLk9iOwpmdW5jdGlvbiBwZihhKXt2YXIgYj1OdW1iZXIoYS5nLmluaXRpYWxTdHJlYW1CdWZmZXJTaXplKTthLmcuZml4QnVmZmVyaW5nR29hbERldGVybWluYXRpb24mJihiPTEpO2lmKGEuYi5nZXRCb29sKCJiYWNrX29mZl9idWZmZXJpbmdfb3ZlcmZsb3ciLCExKSliPWEuSjtlbHNle3ZhciBjPWEuYi5nZXROdW1iZXIoImJ1ZmZlcmluZ19vdmVyZmxvd190aHJlc2hvbGQiLDApOzA8YyYmKGI9Yyl9cmV0dXJuIGEuRGI/TnVtYmVyKGEuZy5zdHJlYW1CdWZmZXJTaXplKTpifWZ1bmN0aW9uIE9lKGEpe2lmKGEuSyl7YT1hLmEuYVswXTtmb3IodmFyIGI9W10sYz0wO2M8YS5hLmxlbmd0aDsrK2MpYi5wdXNoLmFwcGx5KGIsYWUoYS5hW2NdKSk7YT1ifWVsc2UgYT1bXTtyZXR1cm4gYX0KZnVuY3Rpb24gUWUoYSxiKXtpZihhLkspe2Zvcih2YXIgYz17fSxkPWEuYS5hWzBdLGU9MDtlPGQuYS5sZW5ndGg7KytlKXt2YXIgZj1kLmFbZV07Y1tmLlNdPWZ9YS5mLmE9e307ZD1mYihiKTtmb3IoZT0wO2U8ZC5sZW5ndGg7KytlKXt2YXIgZj1kW2VdLGc9Yi5nZXQoZik7aWYoInZpZGVvIj09Zil7dmFyIGg9Z1swXS5pZDthLmYucHVzaChmLGNbaF0pfWVsc2UgaWYoImF1ZGlvIj09Zilmb3IodmFyIGg9Z1swXS5iLnNwbGl0KCI7IilbMF0saz0wO2s8Zy5sZW5ndGg7KytrKXt2YXIgbD1nW2tdO2wuYi5zcGxpdCgiOyIpWzBdPT1oJiZhLmYucHVzaChmLGNbbC5pZF0pfWVsc2UgZm9yKGs9MDtrPGcubGVuZ3RoOysrayloPWdba10uaWQsYS5mLnB1c2goZixjW2hdKX1hLnBhPSEwO2lmKGM9YS5mLmdldCgiYXVkaW8iKSlPZihhLGMpLGEuZi5zZXQoImF1ZGlvIixjKSxjPWNbMF0ubGFuZ3x8YS5PLFZhKDIsYS5PLGMpJiYoYS5wYT0hMSk7aWYoYz1hLmYuZ2V0KCJ0ZXh0IikpT2YoYSwKYyksYS5mLnNldCgidGV4dCIsYyksYz1jWzBdLmxhbmd8fGEuTyxWYSgyLGEuTyxjKXx8KGEucGE9ITEpfX1ZLnByb3RvdHlwZS53Yz1mdW5jdGlvbigpe3RoaXMud2E9ITB9O1kucHJvdG90eXBlLnNldENsZWFyQnVmZmVyQWZ0ZXJTZWVraW5nPVkucHJvdG90eXBlLndjO1kucHJvdG90eXBlLnNlbGVjdFZpZGVvVHJhY2s9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGxmKHRoaXMsInZpZGVvIixhLGIsYyxkKX07ZnVuY3Rpb24gbWYoYSxiKXt2YXIgYz1hLmMudGV4dDtjJiZjLiRhKGIpfQpmdW5jdGlvbiBCZihhKXtpZihhLmwpe2Zvcih2YXIgYj0hMSxjPTA7YzxhLmEuYS5sZW5ndGg7KytjKWZvcih2YXIgZD1hLmEuYVtjXSxlPTA7ZTxkLmEubGVuZ3RoOysrZSl7dmFyIGY9ZC5hW2VdO2lmKCJ2aWRlbyI9PWYuY29udGVudFR5cGUpZm9yKHZhciBnPTA7ZzxmLnUubGVuZ3RoOysrZyl7dmFyIGg9Zi51W2ddLGs9aC5ZO2guWT0hMDthLmwubWF4V2lkdGgmJmgud2lkdGg+YS5sLm1heFdpZHRoJiYoaC5ZPSExKTthLmwubWF4SGVpZ2h0JiZoLmhlaWdodD5hLmwubWF4SGVpZ2h0JiYoaC5ZPSExKTthLmwubWluSGVpZ2h0JiZoLmhlaWdodDxhLmwubWluSGVpZ2h0JiYoaC5ZPSExKTthLmwubWF4QmFuZHdpZHRoJiZoLmJhbmR3aWR0aD5hLmwubWF4QmFuZHdpZHRoJiYoaC5ZPSExKTthLmwubWluQmFuZHdpZHRoJiZoLmJhbmR3aWR0aDxhLmwubWluQmFuZHdpZHRoJiYoaC5ZPSExKTtrIT1oLlkmJihiPSEwKX19MCE9ZWIoYS5mKS5sZW5ndGgmJmImJihQZihhKSwwPGEuVSgpLmxlbmd0aHx8CihiPUVycm9yKCJUaGUgYXBwbGljYXRpb24gaGFzIHJlc3RyaWN0ZWQgYWxsIHZpZGVvIHRyYWNrcyEiKSxiLnR5cGU9ImFwcCIsYj15KGIpLGEuZGlzcGF0Y2hFdmVudChiKSkpfX1ZLnByb3RvdHlwZS5NPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYT90aGlzLmEuYjpudWxsfTtZLnByb3RvdHlwZS5pc0xpdmU9WS5wcm90b3R5cGUuTTtZLnByb3RvdHlwZS54Yz1mdW5jdGlvbihhKXt0aGlzLkRiPWF9O1kucHJvdG90eXBlLnNldElzTGl2ZUludGVycnVwdGVkPVkucHJvdG90eXBlLnhjO1kucHJvdG90eXBlLkNjPWZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIHRoaXMuYyl0aGlzLmNbYV0uZ2MoKX07WS5wcm90b3R5cGUuZm9yY2VSZXN5bmNWaWRlb0J1ZmZlcj1ZLnByb3RvdHlwZS5DYzsKZnVuY3Rpb24gV2UoYSxiKXtmb3IodmFyIGMsZD0hMSxlPW5ldyBDLGY9ZWIoYS5mKSxnPTA7ZzxmLmxlbmd0aDsrK2cpZm9yKHZhciBoPWZbZ10saz0wO2s8aC51Lmxlbmd0aDsrK2spe3ZhciBsPWgudVtrXTtsLmIuZm9yRWFjaChmdW5jdGlvbihhKXtlLnB1c2goYSxsKX0pfWZvcihjIGluIGIpaWYoZj1UYVtiW2NdXXx8bnVsbCxoPWUuZ2V0KGMpKWZvcihnPTA7ZzxoLmxlbmd0aDsrK2cpbD1oW2ddLGs9bC5qYSxsLmphPSFmLGshPWwuamEmJihkPSEwKTtlbHNlIG1iKGMpO2QmJihQZihhKSxkPWEubmEoKSxjPWEuVSgpLGQ9YS5mLmEuaGFzT3duUHJvcGVydHkoImF1ZGlvIikmJjA9PWQubGVuZ3RoLGM9YS5mLmEuaGFzT3duUHJvcGVydHkoInZpZGVvIikmJjA9PWMubGVuZ3RoLGR8fGMpJiYoYz1FcnJvcigiVGhlIGtleSBzeXN0ZW0gaGFzIHJlc3RyaWN0ZWQgYWxsICIrKGQmJmM/ImF1ZGlvIGFuZCB2aWRlbyB0cmFja3MuIjpkPyJhdWRpbyB0cmFja3MuIjoidmlkZW8gdHJhY2tzLiIpKSwKYy50eXBlPSJkcm0iLGM9eShjKSxhLmRpc3BhdGNoRXZlbnQoYykpfWZ1bmN0aW9uIFBmKGEpe3ZhciBiPXgoe3R5cGU6InRyYWNrc2NoYW5nZWQiLGJ1YmJsZXM6ITB9KTthLmRpc3BhdGNoRXZlbnQoYil9ZnVuY3Rpb24gbGYoYSxiLGMsZCxlLGYpe2lmKCFhLmYuYS5oYXNPd25Qcm9wZXJ0eShiKXx8IWEuY1tiXSlyZXR1cm4hMTtmb3IodmFyIGc9YS5mLmdldChiKSxoPTA7aDxnLmxlbmd0aDsrK2gpZm9yKHZhciBrPWdbaF0sbD0wO2w8ay51Lmxlbmd0aDsrK2wpe3ZhciBtPWsudVtsXTtpZihtLlM9PWMpe2lmKCFtLmphfHwhbS5ZKXJldHVybiExO2lmKCJ0ZXh0IiE9YiYmIWEudGEpcmV0dXJuIGM9YS5CW2JdLGEuQltiXT17a2M6bSxWYjpudWxsIT1jJiZjLlZifHxkLFdiOm51bGwhPWMmJmMuV2J8fGUsc3dpdGNoUmVhc29uOmZ9LCEwO2EuY1tiXS5SYShtLGQsZSxmKTtyZXR1cm4hMH19cmV0dXJuITF9CmZ1bmN0aW9uIE9mKGEsYil7Zm9yKHZhciBjPTA7Mj49YzsrK2MpZm9yKHZhciBkPTA7ZDxiLmxlbmd0aDsrK2Qpe3ZhciBlPWJbZF07aWYoVmEoYyxhLk8sZS5sYW5nKSl7Yi5zcGxpY2UoZCwxKTtiLnNwbGljZSgwLDAsZSk7cmV0dXJufX1mb3IoZD0wO2Q8Yi5sZW5ndGg7KytkKWlmKGU9YltkXSxlLmYpe2Iuc3BsaWNlKGQsMSk7Yi5zcGxpY2UoMCwwLGUpO2JyZWFrfX1uPVkucHJvdG90eXBlO24uT2M9ZnVuY3Rpb24oKXt0aGlzLmguVGEodGhpcy5pLCJzb3VyY2VvcGVuIik7dGhpcy5uYi5yZXNvbHZlKCl9OwpmdW5jdGlvbiBDZihhKXt2YXIgYjthLm0mJihiPWEubS5nZXRPcGVyYXRpb25Mb2dnZXIoInN0YXJ0X3N0cmVhbXMiKS5zdGFydCgpKTtmb3IodmFyIGM9W10sZD1bImF1ZGlvIiwidmlkZW8iLCJ0ZXh0Il0sZT0wO2U8ZC5sZW5ndGg7KytlKXt2YXIgZj1kW2VdO2EuZi5hLmhhc093blByb3BlcnR5KGYpJiZjLnB1c2goYS5mLmdldChmKVswXSl9Zm9yKHZhciBnPVFmKGEsYyksZT0wO2U8ZC5sZW5ndGg7KytlKWlmKGY9ZFtlXSxhLmYuYS5oYXNPd25Qcm9wZXJ0eShmKSYmIWdbZl0pcmV0dXJuIGE9RXJyb3IoIlVuYWJsZSB0byBzZWxlY3QgYW4gaW5pdGlhbCAiK2YrIiBzdHJlYW06IGFsbCAiK2YrIiBzdHJlYW1zIGhhdmUgYmVlbiByZXN0cmljdGVkIChieSB0aGUgYXBwbGljYXRpb24gb3IgYnkgdGhlIGtleSBzeXN0ZW0pLiIpLGEudHlwZT0ic3RyZWFtIixiJiZiLnNldEVycm9yKGEpLmxvZygpLFByb21pc2UucmVqZWN0KGEpO2M9YWIoZykubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhLkwuY3JlYXRlKCl9KTsKYy5wdXNoKGEubmIpO3JldHVybiBQcm9taXNlLmFsbChjKS50aGVuKEgoYSxmdW5jdGlvbihhKXthLnBvcCgpO2lmKCFhLmV2ZXJ5KGZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aCgpfSkpcmV0dXJuIGE9RXJyb3IoIlNvbWUgc3RyZWFtcyBhcmUgbm90IGF2YWlsYWJsZS4iKSxhLnR5cGU9InN0cmVhbSIsUHJvbWlzZS5yZWplY3QoYSk7YT1LZih0aGlzLGEpO2lmKCFhKXJldHVybiBhPUVycm9yKCJTb21lIHN0cmVhbXMgYXJlIG5vdCBhdmFpbGFibGUuIiksYS50eXBlPSJzdHJlYW0iLFByb21pc2UucmVqZWN0KGEpO2lmKCFSZih0aGlzLGcpKXJldHVybiBhPUVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIFN0cmVhbSBvYmplY3RzLiIpLGEudHlwZT0ic3RyZWFtIixQcm9taXNlLnJlamVjdChhKTt0aGlzLkEuc3RhcnQoKTtTZih0aGlzLGcsYSk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpfSkpLnRoZW4oZnVuY3Rpb24oKXtiJiZiLmxvZygpfSkuY2F0Y2goSChhLGZ1bmN0aW9uKGEpe2lmKCJhYm9ydGVkIj09CmEudHlwZSliJiZiLnNldEVycm9yKGEpLmxvZygpO2Vsc2V7T2JqZWN0LmtleXModGhpcy5jKTtpZih0aGlzLmEuYilyZXR1cm4gRGF0ZS5ub3coKStEYTx0aGlzLmEuaT8oYT1NYXRoLm1heCh0aGlzLmEuaS1EYXRlLm5vdygpLzFFMyx0aGlzLm9iKSx0aGlzLnM9c2V0VGltZW91dCh0aGlzLnZiLmJpbmQodGhpcywhMCksMUUzKmEpKTpIZih0aGlzLDApLGImJmIubG9nKCksUHJvbWlzZS5yZXNvbHZlKCk7YiYmYi5zZXRFcnJvcihhKS5sb2coKTtyZXR1cm4gUHJvbWlzZS5yZWplY3QoYSl9fSkpfQpmdW5jdGlvbiBRZihhLGIpe2Zvcih2YXIgYz17fSxkPTA7ZDxiLmxlbmd0aDsrK2Qpe3ZhciBlPWJbZF0sZj1udWxsO2lmKCJ2aWRlbyI9PWUuY29udGVudFR5cGUpe3ZhciBnPWEuQS5nZXRJbml0aWFsVmlkZW9UcmFja0lkKCk7aWYobnVsbD09Zyljb250aW51ZTtmPWUudS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuUz09Z30pO2lmKDA9PWYubGVuZ3RoKWNvbnRpbnVlO2Y9ZlswXX1lbHNlIGlmKCJhdWRpbyI9PWUuY29udGVudFR5cGUpaWYoZz1hLkEuZ2V0SW5pdGlhbEF1ZGlvVHJhY2tJZCgpLGY9ZS51LmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS5TPT1nfSksMD09Zi5sZW5ndGgpe2Y9ZS51LmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS5qYSYmYS5ZfSk7aWYoMD09Zi5sZW5ndGgpY29udGludWU7Zj1lLnVbTWF0aC5mbG9vcihmLmxlbmd0aC8yKV19ZWxzZSBmPWZbMF07ZWxzZSAwPGUudS5sZW5ndGgmJihmPWUudVswXSk7Y1tlLmNvbnRlbnRUeXBlXT1mfXJldHVybiBjfQpmdW5jdGlvbiBSZihhLGIpe3ZhciBjPXt9LGQ7Zm9yKGQgaW4gYil7dmFyIGU9YltkXSxlPSJ0ZXh0Ij09ZD9uZXcgdGUoYSxhLnZpZGVvKTpUZihhLGUpO2lmKCFlKXJldHVybiBhYihjKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuZGVzdHJveSgpfSksITE7Y1tkXT1lfWEuUGIoYS5RYik7YS5jPWM7cmV0dXJuITB9CmZ1bmN0aW9uIFRmKGEsYil7dmFyIGM9VGQoYiksZD1VZihjLnNwbGl0KCI7IilbMF0pLGU9bnVsbCxmPWEuYi5nZXRCb29sKCJ1c2VfbG9jYWxfZXN0aW1hdG9yX2Zvcl9hYnJfc2FtcGxpbmciLCEwKT9hLm1iOmEub2EsZz1udWxsLGg9bnVsbDthLnpiJiZjYW5Vc2VGZXRjaFN0cmVhbSgpPyhoPW5ldyBNdWx0aXBsZVNlZ21lbnRzUHJvdmlkZXIoYS5iLmdldE51bWJlcigic3RyZWFtaW5nX3NlZ21lbnRfc2l6ZSIsNCkpLGc9VmYoYSxoLGQsZikpOmEueWImJihlPVdmKGEsZCxmKSk7dmFyIGs9bnVsbCxsPWEuZi5nZXQoZCk7InZpZGVvIj09PWQmJjA8bC5sZW5ndGgmJihrPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPW51bGwsZD1udWxsLGU9MDtlPGxbMF0udS5sZW5ndGg7ZSsrKWxbMF0udVtlXS5pZD09PWE/Yz1sWzBdLnVbZV06bFswXS51W2VdLmlkPT09YiYmKGQ9bFswXS51W2VdKTtyZXR1cm4gbnVsbD09PWN8fG51bGw9PT1kPzA6Yy5iYW5kd2lkdGg+ZC5iYW5kd2lkdGg/MToKLTF9KTtjPW5ldyBVKGEsYS52aWRlbyxhLmIsYS5pLGMsZixhLlJiLGEuWixrLGEuRCxlLGcsaCk7Yy5kYShhLmcpO3JldHVybiBjfWZ1bmN0aW9uIFZmKGEsYixjLGQpe3ZhciBlPWEudltjXSxmPSJhdWRpbyI9PT1jJiZhLmIuZ2V0Qm9vbCgiZGlzYWJsZV9hdWRpb19zdHJlYW1pbmciLCEwKTtpZighZSYmIWYpe3ZhciBlPW5ldyBWaWRlb1N0cmVhbWluZ01hbmFnZXIoYS5iLGIsYyxhLm0sYS5iYSksZz0idmlkZW8iPT09YztnJiZlLmFkZExpc3RlbmVyKCJiYW5kd2lkdGhVcGRhdGUiLGZ1bmN0aW9uKGEpe2Quc2FtcGxlKGEudGltZVRha2VuLGEuYnl0ZXNSZWFkLGcse3RpbWVUb0xhc3RCeXRlOmEudGltZVRha2VufSx0aGlzLnViLHRoaXMubSl9LmJpbmQoYSkpfWUmJihhLnZbY109ZSk7cmV0dXJuIGV8fG51bGx9CmZ1bmN0aW9uIFdmKGEsYixjKXtpZigidmlkZW8iPT09Ynx8ImF1ZGlvIj09PWImJmEuYi5nZXRCb29sKCJlbmFibGVfcmVxdWVzdF9waXBlbGluaW5nX2Zvcl92b2RfYXVkaW9zIiwhMSkpe3ZhciBkPWEub1tiXTtkfHwoZD1uZXcgU2VnbWVudFJlcXVlc3RNYW5hZ2VyKGEuYixiLGEuTSgpP1ZpZGVvUHJpb3JpdHlDYWxjdWxhdG9yLmNhbGN1bGF0ZUxpdmU6VmlkZW9Qcmlvcml0eUNhbGN1bGF0b3IuY2FsY3VsYXRlLGEubSxjLGEudWIpLGEuTiYmZC51cGRhdGVQcmlvcml0eVdpdGhOZXdBZGp1c3RtZW50KGEuTi5nZXRQcmlvcml0eUFkanVzdG1lbnQoKSksYS5vW2JdPWQpO3JldHVybiBkfXJldHVybiBudWxsfWZ1bmN0aW9uIFhmKGEsYil7YS52aWRlby5jdXJyZW50VGltZT1iO2EuQz1ifQpmdW5jdGlvbiBTZihhLGIsYyl7YS5NYj1hLnZpZGVvLnBsYXliYWNrUmF0ZTthLnZpZGVvLnBsYXliYWNrUmF0ZT0wO1lmKGEsYyk7dmFyIGQ7YS5GJiZhLkY8PWMuZW5kJiZhLkY+PWMuc3RhcnQ/ZD1hLkY6YS5hLmI/KGQ9Yy5lbmQsYS5iLmdldEJvb2woImFib3J0X2xvYWRpbmdfbGl2ZV9oZWFkX2FzX2N1cnJlbnRfdGltZSIsITEpJiZjLmVuZD49YS5GJiYoZD1jLmVuZC1hLkYsZD1hLkYrKGQtZCUxMCkpLGEuR2I9ITApOmQ9Yy5zdGFydDtEKGEuaCxhLnZpZGVvLCJzZWVraW5nIixhLlNjLmJpbmQoYSkpO2EuSD8oYS5ILnNldE9uUGxheWluZyhhLlVhLmJpbmQoYSwhMCkpLGEuSC5zZXRPblBhdXNlZChhLlVhLmJpbmQoYSwhMSkpLGEuSC5lbmFibGUoKSk6KEQoYS5oLGEudmlkZW8sInBsYXlpbmciLGEuVWEuYmluZChhLCEwKSksYS5iLmdldEJvb2woInVwZGF0ZV9wcmlvcml0eV9vbl9wbGF5X2V2ZW50IiwhMCkmJkQoYS5oLGEudmlkZW8sInBsYXkiLGEuVWEuYmluZChhLCEwKSksCkQoYS5oLGEudmlkZW8sInBhdXNlIixhLlVhLmJpbmQoYSwhMSkpKTtEKGEuaCxhLnZpZGVvLCJzZWVraW5nIixhLmxjLmJpbmQoYSkpO0QoYS5oLGEudmlkZW8sInRpbWV1cGRhdGUiLHRocm90dGxlKGEubGMuYmluZChhKSxhLmIuZ2V0TnVtYmVyKCJzY2hlZHVsZXJfcHJpb3JpdHlfdXBkYXRlX2ludGVydmFsIiwxRTMpKSk7aWYoYS52aWRlby5jdXJyZW50VGltZSE9ZClpZihhLm9jKTAhPT1hLnZpZGVvLnJlYWR5U3RhdGU/WGYoYSxkKTpaZihhLGQpO2Vsc2UgdHJ5e1hmKGEsZCl9Y2F0Y2goZSl7WmYoYSxkKX0kZihhLGMuc3RhcnQsYy5lbmQsYy53LGMuTGEpO3ZhciBmPVtdLGc7Zm9yKGcgaW4gYS5jKXtjPWEuY1tnXTtIKGEsZnVuY3Rpb24oYSl7Zi5wdXNoKGEuamModGhpcy5sYSkudGhlbihIKHRoaXMsZnVuY3Rpb24oYil7dmFyIGM9YS5aYSgpO2M+dGhpcy53YiYmKHRoaXMud2I9Yyk7cmV0dXJuIGJ9KSkpfSkoYyk7RChhLmgsYywiZW5kZWQiLGEuVGMuYmluZChhKSk7RChhLmgsCmMsInNob3VsZF9udWRnZSIsYS5QYy5iaW5kKGEpKTtkPWJbZ107dmFyIGg9YS5BLmdldEluaXRpYWxTd2l0Y2hSZWFzb24oKXx8dm9pZCAwO2MuUmEoZCwhMSx2b2lkIDAsaCl9UHJvbWlzZS5hbGwoZikudGhlbihIKGEsZnVuY3Rpb24oYSl7dGhpcy5iLmdldEJvb2woInByZXZlbnRfc3RyZWFtX3N0YXJ0X2lmX3N0cmVhbXNfY2hhbmdlIiwhMSkmJiFhZyh0aGlzKXx8YmcodGhpcyxhKX0pKS5jYXRjaChIKGEsZnVuY3Rpb24oYSl7ImRlc3Ryb3kiIT1hLnR5cGUmJihhPXkoYSksdGhpcy5kaXNwYXRjaEV2ZW50KGEpKX0pKTttZihhLGEucGEpfQpuLlVhPWZ1bmN0aW9uKGEpe09iamVjdC5rZXlzKHRoaXMubykuZm9yRWFjaChmdW5jdGlvbihiKXt0aGlzLm9bYl0udXBkYXRlUHJpb3JpdHlXaXRoTmV3UGxheWluZ1N0YXRlKGEpfS5iaW5kKHRoaXMpKTtPYmplY3Qua2V5cyh0aGlzLnYpLmZvckVhY2goZnVuY3Rpb24oYil7dGhpcy52W2JdLmdldFByaW9yaXR5VXBkYXRlcigpLnVwZGF0ZVByaW9yaXR5V2l0aE5ld1BsYXlpbmdTdGF0ZShhKX0uYmluZCh0aGlzKSk7aWYoYSYmbnVsbCE9PXRoaXMua2Epe3ZhciBiPXRoaXMua2E7dGhpcy5rYT1udWxsO3RoaXMudmlkZW8uY3VycmVudFRpbWU9Yn19O24ubGM9ZnVuY3Rpb24oKXt0aGlzLnZpZGVvJiYoT2JqZWN0LmtleXModGhpcy5vKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RoaXMub1thXS51cGRhdGVQcmlvcml0eVdpdGhOZXdQbGF5aGVhZCh0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKX0uYmluZCh0aGlzKSksT2JqZWN0LmtleXModGhpcy52KS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RoaXMudlthXS5nZXRQcmlvcml0eVVwZGF0ZXIoKS51cGRhdGVQcmlvcml0eVdpdGhOZXdQbGF5aGVhZCh0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKX0uYmluZCh0aGlzKSkpfTsKZnVuY3Rpb24gWmYoYSxiKXthLlc9Yjtmb3IodmFyIGMgaW4gYS5jKXt2YXIgZD1hLmNbY107YS5XJiYoZC5oYT1hLlcpfX1mdW5jdGlvbiBhZyhhKXtyZXR1cm4hT2JqZWN0LmtleXMoYS5jKS5zb21lKEgoYSxmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5jW2FdJiYhdGhpcy5jW2FdLmh9KSl9CmZ1bmN0aW9uIGJnKGEsYil7ZGEoYiYmYi5sZW5ndGg9PU9iamVjdC5rZXlzKGEuYykubGVuZ3RoKTtmb3IodmFyIGM9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGQ9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLGU9MDtlPGIubGVuZ3RoOysrZSl2YXIgZj1iW2VdLGM9TWF0aC5taW4oYyxmKSxkPU1hdGgubWF4KGQsZik7Yz1FZihhKTtmb3IoZT0wO2U8Yy5sZW5ndGg7KytlKWNbZV0uRWEoZCk7YS5iLmdldEJvb2woInByb2Nlc3NfZGVmZXJyZWRfc3dpdGNoZXNfZWFybHkiLCExKSYmY2coYSk7ZGcoYSxjLGQpO3ZhciBnPWFiKGEuYykubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhLklhKCkuaWR9KTthLmIuZ2V0Qm9vbCgic2VxdWVudGlhbGx5X2xvYWRfc3RyZWFtcyIsITEpP2VnKGEsZyxkKTooZT1lYihhLmYpLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS51fSkucmVkdWNlKGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuY29uY2F0KGIpfSxbXSkuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiF+Zy5pbmRleE9mKGEuaWQpfSkubWFwKGZ1bmN0aW9uKGEpe3ZhciBiPQpbYS5MLlhhP2EuTC5YYSgpOmEuTC5jcmVhdGUoKV07YS5YJiZiLnB1c2goYS5YLmNyZWF0ZSh0aGlzLm0sdGhpcy5aKSk7cmV0dXJuIFByb21pc2UuYWxsKGIpfSksUHJvbWlzZS5hbGwoZSkudGhlbihIKGEsZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2IpYVtiXVswXS5FYShkKTt0aGlzLnRhPSEwO2NnKHRoaXMpfSkpLmNhdGNoKEgoYSxmdW5jdGlvbihhKXsiYWJvcnRlZCIhPWEudHlwZSYmKGE9eShhKSx0aGlzLmRpc3BhdGNoRXZlbnQoYSkpfSkpKX0KZnVuY3Rpb24gZWcoYSxiLGMpe3ZhciBkPVByb21pc2UucmVzb2x2ZSgpO2ViKGEuZikubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhLnV9KS5yZWR1Y2UoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jb25jYXQoYil9LFtdKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIX5iLmluZGV4T2YoYS5pZCl9KS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2Q9ZC50aGVuKEgodGhpcyxmdW5jdGlvbihiKXtiJiZiWzBdLkVhKGMpO2I9W2EuTC5YYT9hLkwuWGEoKTphLkwuY3JlYXRlKCldO2EuWCYmYi5wdXNoKGEuWC5jcmVhdGUodGhpcy5tLHRoaXMuWikpO3JldHVybiBQcm9taXNlLmFsbChiKX0pKS5jYXRjaChmdW5jdGlvbihhKXt0aHJvdyBhO30pfSk7ZC50aGVuKEgoYSxmdW5jdGlvbigpe3RoaXMudGE9ITA7Y2codGhpcyl9KSkuY2F0Y2goSChhLGZ1bmN0aW9uKGEpeyJhYm9ydGVkIiE9YS50eXBlJiYoYT15KGEpLHRoaXMuZGlzcGF0Y2hFdmVudChhKSl9KSl9CmZ1bmN0aW9uIGNnKGEpe2Zvcih2YXIgYiBpbiBhLkIpe3ZhciBjPWEuQltiXTthLmNbYl0uUmEoYy5rYyxjLlZiLGMuV2IsYy5zd2l0Y2hSZWFzb24pfWEuQj17fX0KZnVuY3Rpb24gZGcoYSxiLGMpe2lmKGI9S2YoYSxiKSlZZihhLGIpLCRmKGEsYi5zdGFydCxiLmVuZCxiLncsYi5MYSk7aWYoMCE9YyliPWEudmlkZW8uY3VycmVudFRpbWUrYyxhLnZpZGVvLmN1cnJlbnRUaW1lPWIsYS5DPWI7ZWxzZSBpZihhLkdiJiZiKXtjPWIuZW5kO2lmKGEuRWIpe3ZhciBkPWEudmlkZW8uY3VycmVudFRpbWU7ZD49Yi5zdGFydCYmZDw9Yi5lbmQmJmQ8YyYmKGM9ZCl9Yj1jO01hdGguYWJzKGItYS52aWRlby5jdXJyZW50VGltZSk+PWEuRmImJihhLnZpZGVvLmN1cnJlbnRUaW1lPWIpfWEuYi5nZXRCb29sKCJ1bmlmeV9zdHJlYW1fc3RhcnRfd2l0aF9idWZmZXJfZGV0ZWN0b3IiLCExKT8oYj14KHt0eXBlOiJhbGxTdHJlYW1zU3RhcnRlZCIsYnViYmxlczohMH0pLGEuZGlzcGF0Y2hFdmVudChiKSk6YS52aWRlby5wbGF5YmFja1JhdGU9YS5NYjthLmEuYiYmbnVsbCE9YS5hLmYmJkhmKGEsMCk7ZmcoYSk7YS5sYS5yZXNvbHZlKCl9CmZ1bmN0aW9uIFlmKGEsYil7aWYoYS5hLmIpaXNOYU4oYS5pLmR1cmF0aW9uKSYmKGEuaS5kdXJhdGlvbj1iLmVuZCsyNTkyRTMpO2Vsc2UgaWYoaXNOYU4oYS5pLmR1cmF0aW9uKXx8Yi5lbmQ+YS5pLmR1cmF0aW9uKXthLmkuZHVyYXRpb249Yi5lbmQ7Zm9yKHZhciBjPTA7YzxhLmkuc291cmNlQnVmZmVycy5sZW5ndGg7KytjKWEuaS5zb3VyY2VCdWZmZXJzW2NdLmFwcGVuZFdpbmRvd0VuZD1iLmVuZH19bi5WYz1mdW5jdGlvbigpe3RoaXMuY2E9bnVsbDtmZyh0aGlzKTt2YXIgYT1LZih0aGlzLEVmKHRoaXMpKTthJiYodGhpcy5hLmImJnRoaXMuYWEhPWEudyYmKHRoaXMuYWE9YS53LG51bGwhPXRoaXMuaiYmKGNsZWFyVGltZW91dCh0aGlzLmopLHRoaXMuaj1udWxsKSksJGYodGhpcyxhLnN0YXJ0LGEuZW5kLGEudyxhLkxhKSx0aGlzLnZpZGVvLnBhdXNlZHx8Z2codGhpcyx0aGlzLnZpZGVvLmN1cnJlbnRUaW1lLGEuc3RhcnQsYS5lbmQpKX07CmZ1bmN0aW9uICRmKGEsYixjLGQsZSl7Yj14KHt0eXBlOiJzZWVrcmFuZ2VjaGFuZ2VkIixidWJibGVzOiEwLHN0YXJ0OmIsZW5kOmMsbGFzdDpkLHNlZWtSYW5nZUdhcHM6ZX0pO2EuZGlzcGF0Y2hFdmVudChiKX0Kbi5TYz1mdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW8uY3VycmVudFRpbWU7aWYobnVsbCE9dGhpcy5DKXtpZihhPj10aGlzLkMtLjAxJiZhPD10aGlzLkMrLjAxKXt0aGlzLkM9bnVsbDtyZXR1cm59dGhpcy5DPW51bGx9dmFyIGI9S2YodGhpcyxFZih0aGlzKSk7aWYoYil7dmFyIGM9Yi5zdGFydCxiPWIuZW5kO3RoaXMuYi5nZXRCb29sKCJza2lwX3JlbWFpbmluZ19idWZmZXJlZF9vbl9zdHJlYW1fZW5kIiwhMSkmJnRoaXMuYS5iJiZ0aGlzLmEuaCYmdGhpcy52aWRlby5wYXVzZWQmJihiPXRoaXMuYWEpOyhjPWdnKHRoaXMsYSxjLGIpKXx8KGM9YixhPD1jKy4wMXx8dGhpcy5hLmImJiFoZyh0aGlzLGMpP2M9ITE6KHRoaXMudmlkZW8uY3VycmVudFRpbWU9YyxjPSEwKSk7aWYoIWMpe2Zvcih2YXIgZCBpbiB0aGlzLmMpdGhpcy5jW2RdLmVjKHRoaXMud2EpO3RoaXMud2E9ITF9fX07CmZ1bmN0aW9uIGdnKGEsYixjLGQpe2lmKGI+PWMtLjAxKXJldHVybiExO2I9MDthLmEuYiYmKGI9LjUsaGcoYSxjK2IpfHwoYj1hLmEuYykpO2EudmlkZW8uY3VycmVudFRpbWU9TWF0aC5taW4oYytiLGQpO3JldHVybiEwfWZ1bmN0aW9uIGhnKGEsYil7Zm9yKHZhciBjIGluIGEuYylpZighYS5jW2NdLmhjKGIpKXJldHVybiExO3JldHVybiEwfW4uVGM9ZnVuY3Rpb24oKXtpZighdGhpcy5hLmIpe2Zvcih2YXIgYSBpbiB0aGlzLmMpaWYoIXRoaXMuY1thXS5oYigpKXJldHVybjt0aGlzLlBhKCl9fTtuLlBjPWZ1bmN0aW9uKCl7dGhpcy5iLmdldEJvb2woImlnbm9yZV9zZWVrX3doZW5fbnVkZ2luZyIsITApJiYodGhpcy5DPXRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMudmlkZW8uY3VycmVudFRpbWUrPS4wMDF9OwpuLiRiPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hLGI9bnVsbCxjPW51bGw7YSYmYS5hJiZhLmFbMF0mJihiPWEuYVswXSk7YiYmYi5hJiZiLmFbMF0mJihjPWIuYVswXSk7cmV0dXJuISFjJiZjLmJ9O1kucHJvdG90eXBlLmhhc0lubGluZWRDZWE2MDhTdWJ0aXRsZXM9WS5wcm90b3R5cGUuJGI7WS5wcm90b3R5cGUuUGI9ZnVuY3Rpb24oYSl7dGhpcy5RYj1hO3ZhciBiPXRoaXMuYzsidmlkZW8iaW4gYiYmKGIudmlkZW8uYy5OPWEmJnRoaXMuJGIoKSl9O1kucHJvdG90eXBlLnNldEVuYWJsZUNlYTYwOFBhcnNpbmc9WS5wcm90b3R5cGUuUGI7ZnVuY3Rpb24gcWYoYSl7dmFyIGI9YS5iLmdldE51bWJlcigibGl2ZV9idWZmZXJpbmdfdW5kZXJmbG93X3RocmVzaG9sZCIsLjUpO3JldHVybiBhLmIuZ2V0Qm9vbCgiZml4X2xpdmVfc3RyZWFtX2dvbmVfb25fbWFuaWZlc3RfdXBkYXRlIiwhMCkmJmEuSmJ8fGEuYS5oJiZhLnZpZGVvLmN1cnJlbnRUaW1lK2I+YS5hYX1uPVkucHJvdG90eXBlOwpuLkpjPWZ1bmN0aW9uKCl7dGhpcy5WPSEwO2lmKHRoaXMuYSYmdGhpcy5hLmIpe2lmKHFmKHRoaXMpKXJldHVybiB0aGlzLlBhKCk7dGhpcy5iLmdldEJvb2woImFsbG93X2luZmluaXRlX3JldHJ5X29uX25ldF9lcnIiLCEwKSYmdGhpcy5ELmlzTmV0d29ya0ludGVycnVwdGVkKCl8fCFhYih0aGlzLmMpLmV2ZXJ5KGZ1bmN0aW9uKGEpe3JldHVybiBhLmhiKCl9KXx8aWcodGhpcyx0aGlzLmxiKX10aGlzLmIuZ2V0Qm9vbCgiYmFja19vZmZfYnVmZmVyaW5nX292ZXJmbG93IiwhMSkmJihudWxsPT09dGhpcy5KfHxEYXRlLm5vdygpLXRoaXMuSGI+dGhpcy5iLmdldE51bWJlcigiYmFja19vZmZfYnVmZmVyaW5nX292ZXJmbG93X3RpbWVfd2luZG93IiwyRTMpP3RoaXMuSj10aGlzLmIuZ2V0TnVtYmVyKCJidWZmZXJpbmdfb3ZlcmZsb3dfdGhyZXNob2xkIiwwKTp0aGlzLkoqPXRoaXMuYi5nZXROdW1iZXIoImJhY2tfb2ZmX2J1ZmZlcmluZ19vdmVyZmxvd190aW1lX2ZhY3RvciIsMiksCnRoaXMuSj1NYXRoLm1pbih0aGlzLkosdGhpcy5iLmdldE51bWJlcigiYmFja19vZmZfYnVmZmVyaW5nX292ZXJmbG93X21heCIsNSkpKX07ZnVuY3Rpb24gaWcoYSxiKXthLmo9c2V0VGltZW91dChhLlBhLmJpbmQoYSksYil9bi5JYz1mdW5jdGlvbigpe3RoaXMuVj0hMTt0aGlzLmIuZ2V0Qm9vbCgiYmFja19vZmZfYnVmZmVyaW5nX292ZXJmbG93IiwhMSkmJih0aGlzLkhiPURhdGUubm93KCkpO251bGwhPXRoaXMuaiYmKGNsZWFyVGltZW91dCh0aGlzLmopLHRoaXMuaj1udWxsKX07bi5OYz1mdW5jdGlvbigpe251bGwhPT10aGlzLlcmJihYZih0aGlzLHRoaXMuVyksWmYodGhpcyxudWxsKSl9O24uYmQ9ZnVuY3Rpb24oKXt9OwpuLlBhPWZ1bmN0aW9uKCl7dGhpcy5WPSExO3RoaXMuaj1udWxsO3ZhciBhO2lmKGE9dGhpcy5iLmdldEJvb2woInRlc3Rfc291cmNlX2J1ZmZlcnNfbm90X3VwZGF0aW5nX2VuZF9vZl9zdHJlYW0iLCExKSlhOntmb3IoYT0wO2E8dGhpcy5pLnNvdXJjZUJ1ZmZlcnMubGVuZ3RoOysrYSlpZih0aGlzLmkuc291cmNlQnVmZmVyc1thXS51cGRhdGluZyl7YT0hMDticmVhayBhfWE9ITF9aWYoYSlyZXR1cm4gaWcodGhpcywxRTMpO3RoaXMuaS5lbmRPZlN0cmVhbSgpfTtmdW5jdGlvbiBFZihhKXtyZXR1cm4gYWIoYS5jKS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGEucmIoKX0pLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YX0pfWZ1bmN0aW9uIElmKGEpe3JldHVybiBNYXRoLm1heChhLmE/YS5hLmM6MSxhLkNiP2EuZy5zdHJlYW1CdWZmZXJTaXplfHwwOjApfQpmdW5jdGlvbiBLZihhLGIpe2Zvcih2YXIgYz0wLGQ9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGY9W10sZz0wO2c8Yi5sZW5ndGg7KytnKXt2YXIgaD1iW2ddLmdiKCksZj1mLmNvbmNhdChiW2ddLlpiKCkpLGM9TWF0aC5tYXgoYyxoLnN0YXJ0KTtudWxsIT1oLmVuZCYmKGQ9TWF0aC5taW4oZCxoLmVuZCkpO2JbZ10ubGVuZ3RoKCkmJihlPU1hdGgubWluKGUsYltnXS53KCkuZW5kVGltZSkpfWY9bWVyZ2VTZWVrUmFuZ2VHYXBzKGYpO2lmKGQ9PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSlpZihkPWEuYS5hWzBdLGQuZHVyYXRpb24pZD0oZC5zdGFydHx8MCkrZC5kdXJhdGlvbjtlbHNlIHJldHVybiBudWxsO2EuYS5iJiYoZz1JZihhKSxkPU1hdGgubWF4KGQtZyxjKSk7aWYoYz5kKXJldHVybiBudWxsO2Q9TWF0aC5mbG9vcigxRTUqZCkvMUU1O3JldHVybntzdGFydDpjLGVuZDpkLHc6ZSxMYTpmfX0Kbi5WYT1mdW5jdGlvbigpe3JldHVybiBLZih0aGlzLEVmKHRoaXMpKX07WS5wcm90b3R5cGUuY29tcHV0ZVN0cmVhbUxpbWl0cz1ZLnByb3RvdHlwZS5WYTtmdW5jdGlvbiBmZyhhKXthLmEuYiYmKGEuY2E9c2V0VGltZW91dChhLlZjLmJpbmQoYSksMUUzKSl9ZnVuY3Rpb24gQWYoYSl7Zm9yKHZhciBiIGluIGEuYylhLmNbYl0uZGEoYS5nKX1ZLnByb3RvdHlwZS5aYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLndifTtZLnByb3RvdHlwZS5nZXRMb25nZXN0SW5pdFJlc3BvbnNlVGltZT1ZLnByb3RvdHlwZS5aYTtmdW5jdGlvbiBVZihhKXtyZXR1cm4idiI9PT1hLmNoYXJBdCgwKT8idmlkZW8iOiJhIj09PWEuY2hhckF0KDApPyJhdWRpbyI6bnVsbH0KWS5wcm90b3R5cGUucWM9ZnVuY3Rpb24oKXt2YXIgYT14KHt0eXBlOiJuZXR3b3JraW50ZXJydXB0ZWQiLGJ1YmJsZXM6ITB9KTt0aGlzLmRpc3BhdGNoRXZlbnQoYSk7dGhpcy5QPXRoaXMuUHx8RGF0ZS5ub3coKTt0aGlzLlYmJnRoaXMuaiYmY2xlYXJUaW1lb3V0KHRoaXMuail9O1kucHJvdG90eXBlLnVjPWZ1bmN0aW9uKCl7dmFyIGE9eCh7dHlwZToibmV0d29ya3Jlc3VtZWQiLGJ1YmJsZXM6ITB9KTt0aGlzLmRpc3BhdGNoRXZlbnQoYSk7YT10aGlzLmIuZ2V0TnVtYmVyKCJtYXhfbmV0d29ya19pbnRlcnJ1cHRlZF90aW1lX2JlZm9yZV9zZWVrIiwxRTQpO251bGwhPT10aGlzLlAmJkRhdGUubm93KCktdGhpcy5QPj1hJiYodGhpcy5QPW51bGwsdGhpcy5nYT0hMCk7dGhpcy5iLmdldEJvb2woImZpeF9uZXR3b3JrX2ludGVycnVwdGVkX3N0YXJ0X25vdF9udWxsZWQiLCExKSYmKHRoaXMuUD1udWxsKTt0aGlzLlYmJmlnKHRoaXMsdGhpcy5sYil9OwpZLnByb3RvdHlwZS52Yz1mdW5jdGlvbigpe3RoaXMuZ2E9ITB9O2Z1bmN0aW9uIE5mKGEpe2EuYi5nZXRCb29sKCJkZWNvdXBsZV9tcGRfdXBkYXRlX2xvb3BfZnJvbV9yZXF1ZXN0X2xvb3AiLCExKXx8SGYoYSwwKX1ZLnByb3RvdHlwZS5TYj1mdW5jdGlvbihhKXt0aGlzLmhhPWF9O1kucHJvdG90eXBlLnNldEVuYWJsZUxpdmVoZWFkQ2F0Y2h1cD1ZLnByb3RvdHlwZS5TYjtZLnByb3RvdHlwZS5FYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhhfTtZLnByb3RvdHlwZS5pc0xpdmVoZWFkQ2F0Y2h1cEVuYWJsZWQ9WS5wcm90b3R5cGUuRWM7WS5wcm90b3R5cGUuWWE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jLnZpZGVvP3RoaXMuYy52aWRlby5ZYSgpOm51bGx9O1kucHJvdG90eXBlLmdldEJ1ZmZlclZlbG9jaXR5PVkucHJvdG90eXBlLllhO2Z1bmN0aW9uIFooYSxiLGMsZCxlKXtkfHwoZD1uZXcgRik7ZXx8KGU9bmV3IFgpO1kuY2FsbCh0aGlzLG51bGwsYixkLGUpOyJzdHJpbmciPT09dHlwZW9mIGE/dGhpcy5MYj1hOnRoaXMuc2I9YTt0aGlzLlI9bnVsbDt0aGlzLm1hPWM7dGhpcy51YT1bXTt0aGlzLm1jPVtdO3RoaXMubmM9W107dGhpcy55YT0wO3RoaXMuVD1udWxsfXIoWixZKTtxKCJzaGFrYS5wbGF5ZXIuRGFzaFZpZGVvU291cmNlIixaKTtaLnByb3RvdHlwZS5GYz1mdW5jdGlvbihhKXt0aGlzLlI9YTt0aGlzLnZiKCEwLCEwKX07Wi5wcm90b3R5cGUudXBkYXRlTWFuaWZlc3Q9Wi5wcm90b3R5cGUuRmM7Wi5wcm90b3R5cGUuQWI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zYnx8dGhpcy5SfTtaLnByb3RvdHlwZS5nZXRNYW5pZmVzdD1aLnByb3RvdHlwZS5BYjtaLnByb3RvdHlwZS5wYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLkFiKCl9O1oucHJvdG90eXBlLmRlYnVnR2V0TWFuaWZlc3Q9Wi5wcm90b3R5cGUucGM7CloucHJvdG90eXBlLnljPWZ1bmN0aW9uKGEsYixjKXt0aGlzLnVhLnB1c2goYSk7dGhpcy5tYy5wdXNoKGJ8fCIiKTt0aGlzLm5jLnB1c2goY3x8IiIpfTtaLnByb3RvdHlwZS5hZGRFeHRlcm5hbENhcHRpb25zPVoucHJvdG90eXBlLnljO1oucHJvdG90eXBlLnpjPWZ1bmN0aW9uKGEpe3RoaXMuVD1hfTtaLnByb3RvdHlwZS5zZXROZXR3b3JrQ2FsbGJhY2s9Wi5wcm90b3R5cGUuemM7Wi5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuUj10aGlzLlQ9dGhpcy5tYT1udWxsO1kucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKX07CloucHJvdG90eXBlLmFiPWZ1bmN0aW9uKCl7dmFyIGE7dGhpcy5tJiYoYT10aGlzLm0uZ2V0T3BlcmF0aW9uTG9nZ2VyKCJzb3VyY2VfbG9hZCIpLnN0YXJ0KCkpO3ZhciBiLGM9SCh0aGlzLGZ1bmN0aW9uKGMpe3RoaXMuQWEoIk1QREZldGNoRHVyYXRpb24iLChEYXRlLm5vdygpLWIpLzFFMyk7dGhpcy5SPWM7Zm9yKHZhciBkPTA7ZDx0aGlzLnVhLmxlbmd0aDtkKyspTmMoYyx0aGlzLnVhW2RdLHRoaXMubWNbZF0sdGhpcy5uY1tkXSk7dGhpcy5hPXplKG5ldyB5ZSh0aGlzLm1hLHRoaXMubSksYyx0aGlzLlQpO2EmJmEuc2V0TWFuaWZlc3RUeXBlKHRoaXMuYS5iPyJkeW5hbWljIjoic3RhdGljIik7cmV0dXJuIFkucHJvdG90eXBlLmFiLmNhbGwodGhpcykudGhlbihmdW5jdGlvbigpe2EmJmEubG9nKCl9KX0pO2lmKHRoaXMuc2IpcmV0dXJuIGI9RGF0ZS5ub3coKSxjKHRoaXMuc2IpO3ZhciBkPVtuZXcgSih0aGlzLkxiKV0sZTtpZih0aGlzLmtiKXt2YXIgZj1uZXcgVmlkZW9QdXNoUGFyYW1ldGVyc0hlbHBlcih0aGlzLkxiKTsKZi5zZXRTdHJlYW1FbmRPZmZzZXQoSWYodGhpcykpO3RoaXMuQ2EmJmYuc2V0UHVzaFZpZGVvUmVwcmVzZW50YXRpb25JRCh0aGlzLkNhKTt0aGlzLmlhJiZmLnNldFB1c2hBdWRpb1JlcHJlc2VudGF0aW9uSUQodGhpcy5pYSk7dGhpcy5kYSYmZi5zZXRVc2VMb25nQ2FjaGVGb3JNYW5pZmVzdCh0aGlzLmRhKTtlPW5ldyBzZChudWxsKTtlLmE9Zn1kPW5ldyBJKHRoaXMuVCxkKTtlPW5ldyBxZChkLHRoaXMucGIsZSx0aGlzLlopO2I9RGF0ZS5ub3coKTtyZXR1cm4gcmQoZSx0aGlzLm0pLnRoZW4oYyl9OwpaLnByb3RvdHlwZS5ZYj1mdW5jdGlvbigpe2lmKHRoaXMueGIpe3ZhciBhPXRoaXMuYTtpZihhPShhPWEmJmEuYSkmJmFbMF0pe3ZhciBhPWEuYS5yZWR1Y2UoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jb25jYXQoYi51KX0sW10pLGI9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWF9O1Byb21pc2UuYWxsKGEubWFwKGZ1bmN0aW9uKGEpe2E9YS5MO3JldHVybiBhLkFjP2EuRGE6YS5jcmVhdGUoKX0pKS50aGVuKGZ1bmN0aW9uKGEpe2E9YS5maWx0ZXIoYik7dGhpcy5BYSgiSW5pdGlhbFNlZ21lbnRJbmRleGVzIixhKX0uYmluZCh0aGlzKSk7UHJvbWlzZS5hbGwoYS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGEuWH0pKS50aGVuKGZ1bmN0aW9uKGEpe2E9YS5maWx0ZXIoYik7dGhpcy5BYSgiU2VnbWVudEluaXRTb3VyY2VzIixhKX0uYmluZCh0aGlzKSl9fX07CloucHJvdG90eXBlLmJjPWZ1bmN0aW9uKGEsYixjKXtpZih0aGlzLnZpZGVvLnBhdXNlZCYmdGhpcy55YSsxRTQ+RGF0ZS5ub3coKSYmdGhpcy5hKXJldHVybiBQcm9taXNlLnJlamVjdCh7dHlwZToiZGVsYXkifSk7dmFyIGQ7aWYoYiYmdm9pZCAwIT1jKWQ9bmV3IHNkKGIpLGQuZj1jLGI9SmYodGhpcyksbnVsbCE9YiYmKGQuYz1iLnN0cmVhbUluZm9JRCxkLmI9dGhpcy5pYSk7ZWxzZSBmb3IoYj1hLmMsYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZT1uZXcgVmlkZW9QdXNoUGFyYW1ldGVyc0hlbHBlcihiW2NdLnRvU3RyaW5nKCkpO3RoaXMuZGEmJmUuc2V0VXNlTG9uZ0NhY2hlRm9yTWFuaWZlc3QodGhpcy5kYSk7YltjXT1uZXcgSihlLmdldFVSTCgpKX1hPW5ldyBxZChhLHRoaXMucGIsZCx0aGlzLlopO3ZhciBmPURhdGUubm93KCk7cmV0dXJuIHJkKGEsdGhpcy5tKS50aGVuKEgodGhpcyxmdW5jdGlvbihhKXt0aGlzLnlhPURhdGUubm93KCk7dGhpcy5BYSgiTVBERmV0Y2hEdXJhdGlvbiIsCih0aGlzLnlhLWYpLzFFMyk7dGhpcy5SPWE7YT16ZShuZXcgeWUodGhpcy5tYSx0aGlzLm0pLGEsdGhpcy5UKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGEpfSkpfTtaLnByb3RvdHlwZS5hYz1mdW5jdGlvbigpe3ZhciBhPXplKG5ldyB5ZSh0aGlzLm1hKSx0aGlzLlIsdGhpcy5UKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGEpfTt9LmJpbmQoZywgZ2xvYmFsKSkoKTsKCm1vZHVsZS5leHBvcnRzID