UNPKG

amazon-connect-streams

Version:
1 lines 882 kB
(()=>{var l;(l={296:()=>{!function(){var l=this||globalThis,Z=l.connect||{};l.connect=Z,l.globalConnect={},l.lily=Z,globalConnect.Container=null;var b=window.atob("KCgpPT57dmFyIGU9ezQ2MzooZSx0LG4pPT57InVzZSBzdHJpY3QiO2xldCByO2Z1bmN0aW9uIG8oZSl7aWYoIXIpdGhyb3cgbmV3IEVycm9yKG51bGwhPWU/ZToiQXR0ZW1wdGVkIHRvIGdldCBHbG9iYWwgQW1hem9uQ29ubmVjdFByb3ZpZGVyIHRoYXQgaGFzIG5vdCBiZWVuIHNldC4iKTtyZXR1cm4gcn1uLnIodCksbi5kKHQse0FtYXpvbkNvbm5lY3RHUlN0cmVhbXNTaXRlOigpPT5VLEFtYXpvbkNvbm5lY3RTdHJlYW1zU2l0ZTooKT0+UCxHbG9iYWxSZXNpbGllbmN5UmVnaW9uOigpPT5UfSk7Y2xhc3MgaSBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHtyZWFzb246ZSxuYW1lc3BhY2U6dCxlcnJvcktleTpuLGRldGFpbHM6cn0pe3N1cGVyKGBDb25uZWN0RXJyb3Igd2l0aCBlcnJvciBrZXkgIiR7bn0iYCksdGhpcy5lcnJvclR5cGU9aS5FcnJvclR5cGUsdGhpcy5uYW1lc3BhY2U9dCx0aGlzLmVycm9yS2V5PW4sdGhpcy5yZWFzb249ZSx0aGlzLmRldGFpbHM9bnVsbCE9cj9yOnt9fX1pLkVycm9yVHlwZT0iQ29ubmVjdEVycm9yIjtjbGFzcyBhe2NvbnN0cnVjdG9yKHtwcm92aWRlcjplLGxvZ2dlcktleTp0fSl7dGhpcy5ldmVudHM9bmV3IE1hcCx0aGlzLmxvZ2dlcj1uZXcgTyh7cHJvdmlkZXI6ZSxzb3VyY2U6ImVtaXR0ZXIiLG1peGluOigpPT4oe2VtaXR0ZXJMb2dnZXJLZXk6dH0pfSl9b24oZSx0KXtjb25zdCBuPXRoaXMuZXZlbnRzLmdldChlKTtuP24uYWRkKHQpOnRoaXMuZXZlbnRzLnNldChlLG5ldyBTZXQoW3RdKSl9b2ZmKGUsdCl7Y29uc3Qgbj10aGlzLmV2ZW50cy5nZXQoZSk7biYmKG4uZGVsZXRlKHQpLG4uc2l6ZTwxJiZ0aGlzLmV2ZW50cy5kZWxldGUoZSkpfWdldEhhbmRsZXJzKGUpe3ZhciB0O3JldHVybiBBcnJheS5mcm9tKG51bGwhPT0odD10aGlzLmV2ZW50cy5nZXQoZSkpJiZ2b2lkIDAhPT10P3Q6W10pfX12YXIgcz1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbmV3KG58fChuPVByb21pc2UpKSgoZnVuY3Rpb24obyxpKXtmdW5jdGlvbiBhKGUpe3RyeXtjKHIubmV4dChlKSl9Y2F0Y2goZSl7aShlKX19ZnVuY3Rpb24gcyhlKXt0cnl7YyhyLnRocm93KGUpKX1jYXRjaChlKXtpKGUpfX1mdW5jdGlvbiBjKGUpe3ZhciB0O2UuZG9uZT9vKGUudmFsdWUpOih0PWUudmFsdWUsdCBpbnN0YW5jZW9mIG4/dDpuZXcgbigoZnVuY3Rpb24oZSl7ZSh0KX0pKSkudGhlbihhLHMpfWMoKHI9ci5hcHBseShlLHR8fFtdKSkubmV4dCgpKX0pKX07Y2xhc3MgYyBleHRlbmRzIGF7ZW1pdChlLHQpe3JldHVybiBzKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3Qgbj10aGlzLmdldEhhbmRsZXJzKGUpO3lpZWxkIFByb21pc2UuYWxsU2V0dGxlZChuLm1hcCgobj0+cyh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RyeXt5aWVsZCBuKHQpfWNhdGNoKHQpe3RoaXMubG9nZ2VyLmVycm9yKCJBbiBlcnJvciBvY2N1cnJlZCB3aGVuIGludm9raW5nIGV2ZW50IGhhbmRsZXIiLHtlcnJvcjp0LHBhcmFtZXRlcjplfSl9fSkpKSkpfSkpfX1mdW5jdGlvbiB1KCl7cmV0dXJuInJhbmRvbVVVSUQiaW4gY3J5cHRvP2NyeXB0by5yYW5kb21VVUlEKCk6IjEwMDAwMDAwLTEwMDAtNDAwMC04MDAwLTEwMDAwMDAwMDAwMCIucmVwbGFjZSgvWzAxOF0vZywoZT0+e2NvbnN0IHQ9cGFyc2VJbnQoZSk7cmV0dXJuKHReY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxKSlbMF0mMTU+PnQvNCkudG9TdHJpbmcoMTYpfSkpfWZ1bmN0aW9uIGwoKXt2YXIgZSx0LG4scjtyZXR1cm57b3JpZ2luOm51bGwhPT0odD1udWxsPT09KGU9bnVsbD09PWRvY3VtZW50fHx2b2lkIDA9PT1kb2N1bWVudD92b2lkIDA6ZG9jdW1lbnQubG9jYXRpb24pfHx2b2lkIDA9PT1lP3ZvaWQgMDplLm9yaWdpbikmJnZvaWQgMCE9PXQ/dDoidW5rbm93biIscGF0aDpudWxsIT09KHI9bnVsbD09PShuPW51bGw9PT1kb2N1bWVudHx8dm9pZCAwPT09ZG9jdW1lbnQ/dm9pZCAwOmRvY3VtZW50LmxvY2F0aW9uKXx8dm9pZCAwPT09bj92b2lkIDA6bi5wYXRobmFtZSkmJnZvaWQgMCE9PXI/cjoidW5rbm93biJ9fWNsYXNzIHB7Y29uc3RydWN0b3IoKXt0aGlzLmlkc0J5SGFuZGxlcj1uZXcgTWFwLHRoaXMuaGFuZGxlcnNCeUlkPW5ldyBNYXB9YWRkKGUpe2NvbnN0IHQ9dGhpcy5pZHNCeUhhbmRsZXIuZ2V0KGUpO2lmKHQpcmV0dXJue2hhbmRsZXJJZDp0fTtjb25zdCBuPXUoKTtyZXR1cm4gdGhpcy5pZHNCeUhhbmRsZXIuc2V0KGUsbiksdGhpcy5oYW5kbGVyc0J5SWQuc2V0KG4sZSkse2hhbmRsZXJJZDpufX1nZXRJZEJ5SGFuZGxlcihlKXt2YXIgdDtyZXR1cm4gbnVsbCE9PSh0PXRoaXMuaWRzQnlIYW5kbGVyLmdldChlKSkmJnZvaWQgMCE9PXQ/dDpudWxsfWdldEhhbmRsZXJCeUlkKGUpe3ZhciB0O3JldHVybiBudWxsIT09KHQ9dGhpcy5oYW5kbGVyc0J5SWQuZ2V0KGUpKSYmdm9pZCAwIT09dD90Om51bGx9Z2V0KCl7cmV0dXJuWy4uLnRoaXMuaWRzQnlIYW5kbGVyLmVudHJpZXMoKV0ubWFwKCgoW2UsdF0pPT4oe2hhbmRsZXI6ZSxoYW5kbGVySWQ6dH0pKSl9ZGVsZXRlKGUpe2NvbnN0IHQ9dGhpcy5pZHNCeUhhbmRsZXIuZ2V0KGUpO3JldHVybiB0JiZ0aGlzLmhhbmRsZXJzQnlJZC5kZWxldGUodCksdGhpcy5pZHNCeUhhbmRsZXIuZGVsZXRlKGUpLHtpc0VtcHR5OnRoaXMuaWRzQnlIYW5kbGVyLnNpemU8MX19c2l6ZSgpe3JldHVybiB0aGlzLmlkc0J5SGFuZGxlci5zaXplfX1jbGFzcyBke2NvbnN0cnVjdG9yKCl7dGhpcy5zaW1wbGVTdWJzY3JpcHRpb25zPW5ldyBNYXAsdGhpcy5wYXJhbVN1YnNjcmlwdGlvbnM9bmV3IE1hcH1hZGQoe25hbWVzcGFjZTplLGtleTp0LHBhcmFtZXRlcjpufSxyKXt2YXIgbyxpLGEscyxjO2lmKG4pe2lmKCF0aGlzLnBhcmFtU3Vic2NyaXB0aW9ucy5oYXMoZSkpcmV0dXJuIHZvaWQgdGhpcy5wYXJhbVN1YnNjcmlwdGlvbnMuc2V0KGUsbmV3IE1hcChbW3QsbmV3IE1hcChbW24scl1dKV1dKSk7aWYoIShudWxsPT09KG89dGhpcy5wYXJhbVN1YnNjcmlwdGlvbnMuZ2V0KGUpKXx8dm9pZCAwPT09bz92b2lkIDA6by5oYXModCkpKXJldHVybiB2b2lkKG51bGw9PT0oaT10aGlzLnBhcmFtU3Vic2NyaXB0aW9ucy5nZXQoZSkpfHx2b2lkIDA9PT1pfHxpLnNldCh0LG5ldyBNYXAoW1tuLHJdXSkpKTtudWxsPT09KHM9bnVsbD09PShhPXRoaXMucGFyYW1TdWJzY3JpcHRpb25zLmdldChlKSl8fHZvaWQgMD09PWE/dm9pZCAwOmEuZ2V0KHQpKXx8dm9pZCAwPT09c3x8cy5zZXQobixyKX1lbHNle2lmKCF0aGlzLnNpbXBsZVN1YnNjcmlwdGlvbnMuaGFzKGUpKXJldHVybiB2b2lkIHRoaXMuc2ltcGxlU3Vic2NyaXB0aW9ucy5zZXQoZSxuZXcgTWFwKFtbdCxyXV0pKTtudWxsPT09KGM9dGhpcy5zaW1wbGVTdWJzY3JpcHRpb25zLmdldChlKSl8fHZvaWQgMD09PWN8fGMuc2V0KHQscil9fWRlbGV0ZSh7bmFtZXNwYWNlOmUsa2V5OnQscGFyYW1ldGVyOm59KXt2YXIgcixvLGksYTtuPyhudWxsPT09KG89bnVsbD09PShyPXRoaXMucGFyYW1TdWJzY3JpcHRpb25zLmdldChlKSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuZ2V0KHQpKXx8dm9pZCAwPT09bz92b2lkIDA6by5kZWxldGUobikpJiZ0aGlzLnBhcmFtU3Vic2NyaXB0aW9ucy5nZXQoZSkuZ2V0KHQpLnNpemU8MSYmKG51bGw9PT0oaT10aGlzLnBhcmFtU3Vic2NyaXB0aW9ucy5nZXQoZSkpfHx2b2lkIDA9PT1pfHxpLmRlbGV0ZSh0KSx0aGlzLnBhcmFtU3Vic2NyaXB0aW9ucy5nZXQoZSkuc2l6ZTwxJiZ0aGlzLnBhcmFtU3Vic2NyaXB0aW9ucy5kZWxldGUoZSkpOihudWxsPT09KGE9dGhpcy5zaW1wbGVTdWJzY3JpcHRpb25zLmdldChlKSl8fHZvaWQgMD09PWE/dm9pZCAwOmEuZGVsZXRlKHQpKSYmdGhpcy5zaW1wbGVTdWJzY3JpcHRpb25zLmdldChlKS5zaXplPDEmJnRoaXMuc2ltcGxlU3Vic2NyaXB0aW9ucy5kZWxldGUoZSl9Z2V0KHtuYW1lc3BhY2U6ZSxrZXk6dCxwYXJhbWV0ZXI6bn0pe3ZhciByLG8saTtyZXR1cm4gbj9udWxsPT09KGk9bnVsbD09PShvPXRoaXMucGFyYW1TdWJzY3JpcHRpb25zLmdldChlKSl8fHZvaWQgMD09PW8/dm9pZCAwOm8uZ2V0KHQpKXx8dm9pZCAwPT09aT92b2lkIDA6aS5nZXQobik6bnVsbD09PShyPXRoaXMuc2ltcGxlU3Vic2NyaXB0aW9ucy5nZXQoZSkpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLmdldCh0KX1nZXRPckFkZChlLHQpe2xldCBuPXRoaXMuZ2V0KGUpO3JldHVybiBufHwobj10KCksdGhpcy5hZGQoZSxuKSksbn1hZGRPclVwZGF0ZShlLHQsbil7bGV0IHI9dGhpcy5nZXQoZSk7cmV0dXJuIHI9cj9uKHIpOnQoKSx0aGlzLmFkZChlLHIpLHJ9Z2V0QWxsU3Vic2NyaXB0aW9ucygpe3JldHVyblsuLi5BcnJheS5mcm9tKHRoaXMuc2ltcGxlU3Vic2NyaXB0aW9ucy5rZXlzKCkpLmZsYXRNYXAoKGU9PkFycmF5LmZyb20odGhpcy5zaW1wbGVTdWJzY3JpcHRpb25zLmdldChlKS5rZXlzKCkpLmZsYXRNYXAoKHQ9Pih7bmFtZXNwYWNlOmUsa2V5OnR9KSkpKSksLi4uQXJyYXkuZnJvbSh0aGlzLnBhcmFtU3Vic2NyaXB0aW9ucy5rZXlzKCkpLmZsYXRNYXAoKGU9PkFycmF5LmZyb20odGhpcy5wYXJhbVN1YnNjcmlwdGlvbnMuZ2V0KGUpLmtleXMoKSkuZmxhdE1hcCgodD0+QXJyYXkuZnJvbSh0aGlzLnBhcmFtU3Vic2NyaXB0aW9ucy5nZXQoZSkuZ2V0KHQpLmtleXMoKSkuZmxhdE1hcCgobj0+KHtuYW1lc3BhY2U6ZSxrZXk6dCxwYXJhbWV0ZXI6bn0pKSkpKSkpXX19Y2xhc3MgaHtjb25zdHJ1Y3Rvcigpe3RoaXMuc3Vic2NyaXB0aW9ucz1uZXcgZH1hZGQoZSx0KXtyZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25zLmdldE9yQWRkKGUsKCgpPT5uZXcgcCkpLmFkZCh0KX1nZXQoZSl7dmFyIHQsbjtyZXR1cm4gbnVsbCE9PShuPW51bGw9PT0odD10aGlzLnN1YnNjcmlwdGlvbnMuZ2V0KGUpKXx8dm9pZCAwPT09dD92b2lkIDA6dC5nZXQoKSkmJnZvaWQgMCE9PW4/bjpbXX1nZXRCeUlkKGUsdCl7dmFyIG4scjtyZXR1cm4gbnVsbCE9PShyPW51bGw9PT0obj10aGlzLnN1YnNjcmlwdGlvbnMuZ2V0KGUpKXx8dm9pZCAwPT09bj92b2lkIDA6bi5nZXRIYW5kbGVyQnlJZCh0KSkmJnZvaWQgMCE9PXI/cjpudWxsfWRlbGV0ZShlLHQpe3ZhciBuLHI7bnVsbCE9PShyPW51bGw9PT0obj10aGlzLnN1YnNjcmlwdGlvbnMuZ2V0KGUpKXx8dm9pZCAwPT09bj92b2lkIDA6bi5kZWxldGUodCkuaXNFbXB0eSkmJnZvaWQgMCE9PXImJnImJnRoaXMuc3Vic2NyaXB0aW9ucy5kZWxldGUoZSl9c2l6ZShlKXt2YXIgdCxuO3JldHVybiBudWxsIT09KG49bnVsbD09PSh0PXRoaXMuc3Vic2NyaXB0aW9ucy5nZXQoZSkpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LnNpemUoKSkmJnZvaWQgMCE9PW4/bjowfWlzRW1wdHkoZSl7cmV0dXJuIDA9PT10aGlzLnNpemUoZSl9Z2V0QWxsU3Vic2NyaXB0aW9ucygpe3JldHVybiB0aGlzLnN1YnNjcmlwdGlvbnMuZ2V0QWxsU3Vic2NyaXB0aW9ucygpfWdldEFsbFN1YnNjcmlwdGlvbkhhbmRsZXJJZHMoKXtyZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25zLmdldEFsbFN1YnNjcmlwdGlvbnMoKS5yZWR1Y2UoKChlLHQpPT5lLmNvbmNhdCh0aGlzLmdldCh0KS5tYXAoKCh7aGFuZGxlcklkOmV9KT0+KHt0b3BpYzp0LGhhbmRsZXJJZDplfSkpKSkpLFtdKX19Y29uc3QgZj0iY2xpZW50VGltZW91dCI7ZnVuY3Rpb24gZyhlLHQsbixyKXtjb25zdCBvPU1hdGgubWF4KDEsbnVsbCE9cj9yOjNlNCk7cmV0dXJuIG5ldyBQcm9taXNlKCgocixhKT0+e2xldCBzPSExO2NvbnN0IGM9c2V0VGltZW91dCgoKCk9PntuKHt0aW1lb3V0TXM6byxyZXF1ZXN0OmV9KSxhKGZ1bmN0aW9uKGUsdCl7Y29uc3R7bmFtZXNwYWNlOm4sY29tbWFuZDpyLGRhdGE6b309ZTtyZXR1cm57bmFtZXNwYWNlOm4scmVhc29uOiJDbGllbnQgVGltZW91dCIsZGV0YWlsczp7Y29tbWFuZDpyLHJlcXVlc3REYXRhOm8sdGltZW91dE1zOnR9LGVycm9yS2V5OmZ9fShlLG8pKSxzPSEwfSksbyk7dCgoZT0+e2NsZWFyVGltZW91dChjKSxzfHwoZS5pc0Vycm9yP2EobmV3IGkoZSkpOnIoZS5kYXRhKSl9KSl9KSl9Y2xhc3MgbXtjb25zdHJ1Y3RvcihlKXt0aGlzLnJlcXVlc3RNYXA9bmV3IE1hcCx0aGlzLmxvZ2dlcj1uZXcgTyh7cHJvdmlkZXI6ZSxzb3VyY2U6ImNvcmUucmVxdWVzdE1hbmFnZXIifSl9cHJvY2Vzc1JlcXVlc3QoZSl7Y29uc3R7cmVxdWVzdElkOnR9PWU7cmV0dXJuIGcoZSwoZT0+dGhpcy5yZXF1ZXN0TWFwLnNldCh0LGUpKSwoKHtyZXF1ZXN0OmUsdGltZW91dE1zOnR9KT0+dGhpcy5oYW5kbGVUaW1lb3V0KGUsdCkpKX1wcm9jZXNzUmVzcG9uc2UoZSl7Y29uc3R7cmVxdWVzdElkOnR9PWUsbj10aGlzLnJlcXVlc3RNYXAuZ2V0KHQpO24/KG4oZSksdGhpcy5yZXF1ZXN0TWFwLmRlbGV0ZSh0KSk6dGhpcy5sb2dnZXIuZXJyb3IoIlJldHVybmVkIGEgcmVzcG9uc2UgbWVzc2FnZSB3aXRoIG5vIGhhbmRsZXIiLHttZXNzYWdlOmV9KX1oYW5kbGVUaW1lb3V0KGUsdCl7Y29uc3R7cmVxdWVzdElkOm4sbmFtZXNwYWNlOnIsY29tbWFuZDpvfT1lO3RoaXMucmVxdWVzdE1hcC5kZWxldGUobiksdGhpcy5sb2dnZXIuZXJyb3IoIkNsaWVudCByZXF1ZXN0IHRpbWVvdXQiLHtyZXF1ZXN0SWQ6bixuYW1lc3BhY2U6cixjb21tYW5kOm8sdGltZW91dE1zOnR9KX19dmFyIHY9ZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtmb3IodmFyIHIgaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmdC5pbmRleE9mKHIpPDAmJihuW3JdPWVbcl0pO2lmKG51bGwhPWUmJiJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgbz0wO2ZvcihyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7bzxyLmxlbmd0aDtvKyspdC5pbmRleE9mKHJbb10pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLHJbb10pJiYobltyW29dXT1lW3Jbb11dKX1yZXR1cm4gbn07ZnVuY3Rpb24geShlKXt0cnl7c3dpdGNoKGUudHlwZSl7Y2FzZSJhY2tub3dsZWRnZSI6Y2FzZSJlcnJvciI6Y2FzZSJjaGlsZENvbm5lY3Rpb25DbG9zZSI6ZGVmYXVsdDpyZXR1cm4gZTtjYXNlImNoaWxkRG93bnN0cmVhbU1lc3NhZ2UiOnJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSkse21lc3NhZ2U6eShlLm1lc3NhZ2UpfSk7Y2FzZSJwdWJsaXNoIjp7Y29uc3R7ZGF0YTp0fT1lLG49dihlLFsiZGF0YSJdKTtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSxuKX1jYXNlInJlc3BvbnNlIjppZihlLmlzRXJyb3IpcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7ZGV0YWlsczp7Y29tbWFuZDplLmRldGFpbHMuY29tbWFuZH19KTt7Y29uc3R7ZGF0YTp0fT1lLG49dihlLFsiZGF0YSJdKTtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSxuKX19fWNhdGNoKHQpe3JldHVybnttZXNzYWdlRGV0YWlsczoiZXJyb3Igd2hlbiBzYW5pdGl6aW5nIGRvd25zdHJlYW0gbWVzc2FnZSIsbWVzc2FnZTplLGVycm9yOnR9fX1jbGFzcyBie2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5wcm92aWRlcj1lLHRoaXMucmVsYXlDaGlsZFVwc3RyZWFtTWVzc2FnZT10LHRoaXMuY2hhbm5lbHM9bmV3IE1hcCx0aGlzLmxvZ2dlcj1uZXcgTyh7cHJvdmlkZXI6ZSxzb3VyY2U6ImNoaWxkQ29ubmVjdGlvbk1hbmFnZXIifSl9YWRkQ2hhbm5lbChlKXtjb25zdHtjb25uZWN0aW9uSWQ6dH09ZTt0aGlzLmNoYW5uZWxzLmhhcyh0KT90aGlzLmxvZ2dlci5lcnJvcigiQXR0ZW1wdGVkIHRvIGFkZCBjaGlsZCBjb25uZWN0aW9uIHRoYXQgYWxyZWFkeSBleGlzdHMuIE5vIGFjdGlvbiIse2Nvbm5lY3Rpb25JZDp0fSk6KCJpZnJhbWUiPT09ZS50eXBlP3RoaXMuc2V0dXBJZnJhbWUoZSk6dGhpcy5zZXR1cENvbXBvbmVudChlKSx0aGlzLmxvZ2dlci5kZWJ1ZygiQ2hpbGQgY2hhbm5lbCBhZGRlZCIse2Nvbm5lY3Rpb25JZDp0LHR5cGU6ZS50eXBlfSkpfXVwZGF0ZUNoYW5uZWxQb3J0KGUpe2NvbnN0e2Nvbm5lY3Rpb25JZDp0fT1lLG49dGhpcy5jaGFubmVscy5nZXQodCk7aWYoIW4pcmV0dXJuIHZvaWQgdGhpcy5sb2dnZXIuZXJyb3IoIkF0dGVtcHRlZCB0byB1cGRhdGUgY2hpbGQgY29ubmVjdGlvbiB0aGF0IGRvZXMgbm90IGV4aXN0IE5vIGFjdGlvbiIse2Nvbm5lY3Rpb25JZDp0fSk7aWYoImNvbXBvbmVudCI9PT1uLnR5cGUpcmV0dXJuIHZvaWQgdGhpcy5sb2dnZXIuZXJyb3IoIkF0dGVtcHRlZCB0byB1cGRhdGUgYSBjb21wb25lbnQgY2hhbm5lbCBjb25uZWN0aW9uIGFzIE1lc3NhZ2VQb3J0LiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuIix7Y29ubmVjdGlvbklkOnR9KTtjb25zdCByPW47ci5wb3J0Lm9ubWVzc2FnZT1udWxsLHIucG9ydC5jbG9zZSgpO2NvbnN0IG89T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHt0eXBlOiJpZnJhbWUifSk7dGhpcy5zZXR1cElmcmFtZShvKSx0aGlzLmxvZ2dlci5pbmZvKCJVcGRhdGVkIGNoaWxkIHBvcnQiLHtjb25uZWN0aW9uSWQ6dH0pfXNldHVwSWZyYW1lKGUpe2NvbnN0e2Nvbm5lY3Rpb25JZDp0LHBvcnQ6bixwcm92aWRlcklkOnJ9PWUsbz10aGlzLmNyZWF0ZU1lc3NhZ2VIYW5kbGVyKHQscik7bi5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixvKSxuLnN0YXJ0KCksdGhpcy5jaGFubmVscy5zZXQodCx7dHlwZToiaWZyYW1lIixwb3J0Om4saGFuZGxlcjpvLHByb3ZpZGVySWQ6cn0pLHRoaXMucmVsYXlDaGlsZFVwc3RyZWFtTWVzc2FnZSh7dHlwZToiY2hpbGRVcHN0cmVhbSIsY29ubmVjdGlvbklkOnQsc291cmNlUHJvdmlkZXJJZDpyLHBhcmVudFByb3ZpZGVySWQ6dGhpcy5wcm92aWRlci5pZCxtZXNzYWdlOnt0eXBlOiJjaGlsZENvbm5lY3Rpb25SZWFkeSJ9fSl9c2V0dXBDb21wb25lbnQoZSl7Y29uc3R7Y29ubmVjdGlvbklkOnQscHJvdmlkZXJJZDpuLHNlbmREb3duc3RyZWFtTWVzc2FnZTpyLHNldFVwc3RyZWFtTWVzc2FnZUhhbmRsZXI6b309ZTtvKChlPT57dGhpcy5yZWxheUNoaWxkVXBzdHJlYW1NZXNzYWdlKHt0eXBlOiJjaGlsZFVwc3RyZWFtIixzb3VyY2VQcm92aWRlcklkOm4scGFyZW50UHJvdmlkZXJJZDp0aGlzLnByb3ZpZGVyLmlkLGNvbm5lY3Rpb25JZDp0LG1lc3NhZ2U6ZX0pfSkpLHRoaXMuY2hhbm5lbHMuc2V0KHQse3R5cGU6ImNvbXBvbmVudCIscHJvdmlkZXJJZDpuLHNlbmREb3duc3RyZWFtTWVzc2FnZTpyLHNldFVwc3RyZWFtTWVzc2FnZUhhbmRsZXI6b30pLHRoaXMucmVsYXlDaGlsZFVwc3RyZWFtTWVzc2FnZSh7dHlwZToiY2hpbGRVcHN0cmVhbSIsY29ubmVjdGlvbklkOnQsc291cmNlUHJvdmlkZXJJZDpuLHBhcmVudFByb3ZpZGVySWQ6dGhpcy5wcm92aWRlci5pZCxtZXNzYWdlOnt0eXBlOiJjaGlsZENvbm5lY3Rpb25SZWFkeSJ9fSl9aGFuZGxlRG93bnN0cmVhbU1lc3NhZ2Uoe2Nvbm5lY3Rpb25JZDplLG1lc3NhZ2U6dCx0YXJnZXRQcm92aWRlcklkOm59KXtjb25zdCByPXRoaXMuY2hhbm5lbHMuZ2V0KGUpO2lmKCFyKXJldHVybiB2b2lkIHRoaXMubG9nZ2VyLndhcm4oIkF0dGVtcHRlZCB0byByb3V0ZSBkb3duc3RyZWFtIG1lc3NhZ2UgdG8gY2hpbGQgY2hhbm5lbCB0aGF0IGRvZXMgbm90IGV4aXN0Iix7Y29ubmVjdGlvbklkOmUsbWVzc2FnZTp5KHQpfSk7Y29uc3R7cHJvdmlkZXJJZDpvfT1yO28mJm8hPT1uP3RoaXMubG9nZ2VyLmVycm9yKCJEb3duc3RyZWFtIHRhcmdldCBtZXNzYWdlIGRpZCBub3QgbWF0Y2ggdGFyZ2V0IHByb3ZpZGVyIGlkLiBOb3Qgc2VuZGluZyBtZXNzYWdlLiIse2Nvbm5lY3Rpb25JZDplLHRhcmdldFByb3ZpZGVySWQ6bixhY3R1YWxQcm92aWRlcklkOm8sbWVzc2FnZTp5KHQpfSk6ImlmcmFtZSI9PT1yLnR5cGU/ci5wb3J0LnBvc3RNZXNzYWdlKHQpOnIuc2VuZERvd25zdHJlYW1NZXNzYWdlKHQpfWhhbmRsZUNsb3NlTWVzc2FnZSh7Y29ubmVjdGlvbklkOmV9KXtjb25zdCB0PXRoaXMuY2hhbm5lbHMuZ2V0KGUpO2lmKHQpe2lmKCJpZnJhbWUiPT09dC50eXBlKXtjb25zdHtwb3J0OmUsaGFuZGxlcjpufT10O2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbiksZS5jbG9zZSgpfXRoaXMuY2hhbm5lbHMuZGVsZXRlKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJSZW1vdmVkIGNoaWxkIGNoYW5uZWwiLHtjb25uZWN0aW9uSWQ6ZSx0eXBlOnQudHlwZX0pfWVsc2UgdGhpcy5sb2dnZXIud2FybigiQXR0ZW1wdGVkIHRvIGNsb3NlIGNoaWxkIGNoYW5uZWwgdGhhdCB3YXMgbm90IGZvdW5kIix7Y29ubmVjdGlvbklkOmV9KX1jcmVhdGVNZXNzYWdlSGFuZGxlcihlLHQpe3JldHVybiBuPT50aGlzLnJlbGF5Q2hpbGRVcHN0cmVhbU1lc3NhZ2Uoe3R5cGU6ImNoaWxkVXBzdHJlYW0iLHNvdXJjZVByb3ZpZGVySWQ6dCxwYXJlbnRQcm92aWRlcklkOnRoaXMucHJvdmlkZXIuaWQsY29ubmVjdGlvbklkOmUsbWVzc2FnZTpuLmRhdGF9KX19Y2xhc3MgU3tjb25zdHJ1Y3RvcihlKXt0aGlzLmVycm9ySGFuZGxlcnM9bmV3IFNldCx0aGlzLmxvZ2dlcj1uZXcgTyh7cHJvdmlkZXI6ZSxzb3VyY2U6ImNvcmUucHJveHkuZXJyb3IifSl9aW52b2tlKGUpe2NvbnN0e21lc3NhZ2U6dCxrZXk6bixkZXRhaWxzOnIsaXNGYXRhbDpvLGNvbm5lY3Rpb25TdGF0dXM6aX09ZTt0aGlzLmxvZ2dlci5lcnJvcih0LHtrZXk6bixkZXRhaWxzOnIsaXNGYXRhbDpvLGNvbm5lY3Rpb25TdGF0dXM6aX0se2R1cGxpY2F0ZU1lc3NhZ2VUb0NvbnNvbGU6ITAscmVtb3RlSWdub3JlOiEwfSksWy4uLnRoaXMuZXJyb3JIYW5kbGVyc10uZm9yRWFjaCgodD0+e3RyeXt0KGUpfWNhdGNoKHQpe3RoaXMubG9nZ2VyLmVycm9yKCJBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gYSBBbWF6b25Db25uZWN0RXJyb3JIYW5kbGVyIix7aGFuZGxlckVycm9yOnQsb3JpZ2luYWxFcnJvcjplfSl9fSkpfW9uRXJyb3IoZSl7dGhpcy5lcnJvckhhbmRsZXJzLmFkZChlKX1vZmZFcnJvcihlKXt0aGlzLmVycm9ySGFuZGxlcnMuZGVsZXRlKGUpfX1jbGFzcyBFe2NvbnN0cnVjdG9yKHtwcm92aWRlcjplLHNlbmRIZWFsdGhDaGVjazp0LGdldFVwc3RyZWFtTWVzc2FnZU9yaWdpbjpufSl7dGhpcy5jb25uZWN0aW9uSWQ9bnVsbCx0aGlzLmhlYWx0aENoZWNrSW50ZXJ2YWw9bnVsbCx0aGlzLmhlYWx0aENoZWNrVGltZW91dD1udWxsLHRoaXMuc2VuZEhlYWx0aENoZWNrPXQsdGhpcy5nZXRVcHN0cmVhbU1lc3NhZ2VPcmlnaW49bix0aGlzLnNlbmRIZWFsdGhDaGVja0ludGVydmFsPW51bGwsdGhpcy5sYXN0SGVhbHRoQ2hlY2tSZXNwb25zZT1udWxsLHRoaXMuX3N0YXR1cz0idW5rbm93biIsdGhpcy5sb2dnZXI9bmV3IE8oe3NvdXJjZToiY29yZS5wcm94eS5oZWFsdGgtY2hlY2siLHByb3ZpZGVyOmUsbWl4aW46KCk9Pih7Y29ubmVjdGlvbklkOnRoaXMuY29ubmVjdGlvbklkfSl9KSx0aGlzLmV2ZW50cz1uZXcgYyh7cHJvdmlkZXI6ZSxsb2dnZXJLZXk6ImNvcmUucHJveHkuaGVhbHRoLWNoZWNrIn0pfWdldCBzdGF0dXMoKXtyZXR1cm4gdGhpcy5fc3RhdHVzfWdldCBpc1J1bm5pbmcoKXtyZXR1cm4gbnVsbCE9PXRoaXMuc2VuZEhlYWx0aENoZWNrSW50ZXJ2YWx9Z2V0IGxhc3RDaGVja0NvdW50ZXIoKXt2YXIgZSx0O3JldHVybiBudWxsIT09KHQ9bnVsbD09PShlPXRoaXMubGFzdEhlYWx0aENoZWNrUmVzcG9uc2UpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmNvdW50ZXIpJiZ2b2lkIDAhPT10P3Q6bnVsbH1nZXQgbGFzdENoZWNrVGltZSgpe3ZhciBlLHQ7cmV0dXJuIG51bGwhPT0odD1udWxsPT09KGU9dGhpcy5sYXN0SGVhbHRoQ2hlY2tSZXNwb25zZSl8fHZvaWQgMD09PWU/dm9pZCAwOmUudGltZSkmJnZvaWQgMCE9PXQ/dDpudWxsfXN0YXJ0KHtoZWFsdGhDaGVja0ludGVydmFsOmUsY29ubmVjdGlvbklkOnR9KXt0aGlzLmNvbm5lY3Rpb25JZD10LHRoaXMuaGVhbHRoQ2hlY2tJbnRlcnZhbD1lLHRoaXMuY2xlYXJJbnRlcnZhbCgpLGU8PTA/dGhpcy5sb2dnZXIuZGVidWcoIkhlYWx0aCBjaGVjayBkaXNhYmxlZCIpOmU8MWUzP3RoaXMubG9nZ2VyLmVycm9yKCJIZWFsdGggY2hlY2sgaW50ZXJ2YWwgaXMgbGVzcyB0aGFuIDEgc2Vjb25kLiBOb3QgcnVubmluZyIse2ludGVydmFsOmV9KToodGhpcy5zZW5kSGVhbHRoQ2hlY2tNZXNzYWdlKCksdGhpcy5zZW5kSGVhbHRoQ2hlY2tJbnRlcnZhbD1zZXRJbnRlcnZhbCgoKCk9PnRoaXMuc2VuZEhlYWx0aENoZWNrTWVzc2FnZSgpKSxlKSx0aGlzLnN0YXJ0VGltZW91dCgpKX1zdG9wKCl7dGhpcy5jbGVhckludGVydmFsKCksdGhpcy5jbGVhclRpbWVvdXQoKX1oYW5kbGVSZXNwb25zZShlKXt0aGlzLnNldEhlYWx0aHkoe3RpbWU6ZS50aW1lLGNvdW50ZXI6ZS5jb3VudGVyfSl9c2VuZEhlYWx0aENoZWNrTWVzc2FnZSgpe3RoaXMuc2VuZEhlYWx0aENoZWNrKHt0eXBlOiJoZWFsdGhDaGVjayIsbWVzc2FnZU9yaWdpbjp0aGlzLmdldFVwc3RyZWFtTWVzc2FnZU9yaWdpbigpfSl9c3RhcnRUaW1lb3V0KCl7dGhpcy5oZWFsdGhDaGVja0ludGVydmFsPyh0aGlzLmNsZWFyVGltZW91dCgpLHRoaXMuaGVhbHRoQ2hlY2tUaW1lb3V0PXNldFRpbWVvdXQoKCgpPT57dGhpcy5zZXRVbmhlYWx0aHkoKX0pLDMqdGhpcy5oZWFsdGhDaGVja0ludGVydmFsKSk6dGhpcy5sb2dnZXIuZXJyb3IoIkhlYWx0aCBjaGVjayBpbnRlcnZhbCBub3Qgc2V0LiBDYW5ub3Qgc3RhcnQgdGltZW91dCIpfWNsZWFySW50ZXJ2YWwoKXt0aGlzLnNlbmRIZWFsdGhDaGVja0ludGVydmFsJiYoY2xlYXJJbnRlcnZhbCh0aGlzLnNlbmRIZWFsdGhDaGVja0ludGVydmFsKSx0aGlzLnNlbmRIZWFsdGhDaGVja0ludGVydmFsPW51bGwpfWNsZWFyVGltZW91dCgpe3RoaXMuaGVhbHRoQ2hlY2tUaW1lb3V0JiYoY2xlYXJUaW1lb3V0KHRoaXMuaGVhbHRoQ2hlY2tUaW1lb3V0KSx0aGlzLmhlYWx0aENoZWNrVGltZW91dD1udWxsKX1zZXRVbmhlYWx0aHkoKXtpZigidW5oZWFsdGh5IiE9PXRoaXMuX3N0YXR1cyl7Y29uc3QgZT10aGlzLl9zdGF0dXM7dGhpcy5sb2dnZXIuaW5mbygiQ29ubmVjdGlvbiB1bmhlYWx0aHkiLHtwcmV2aW91c1N0YXR1czplfSksdGhpcy5fc3RhdHVzPSJ1bmhlYWx0aHkiLHRoaXMuZW1pdFN0YXR1c0NoYW5nZWQoInVuaGVhbHRoeSIsZSl9fXNldEhlYWx0aHkoZSl7aWYodGhpcy5sYXN0SGVhbHRoQ2hlY2tSZXNwb25zZT1PYmplY3QuYXNzaWduKHt9LGUpLCJoZWFsdGh5IiE9PXRoaXMuX3N0YXR1cyl7Y29uc3QgZT10aGlzLl9zdGF0dXM7dGhpcy5sb2dnZXIuZGVidWcoIkNvbm5lY3Rpb24gaGVhbHRoeSIse3ByZXZpb3VzU3RhdHVzOmV9KSx0aGlzLl9zdGF0dXM9ImhlYWx0aHkiLHRoaXMuZW1pdFN0YXR1c0NoYW5nZWQoImhlYWx0aHkiLGUpfXRoaXMuc3RhcnRUaW1lb3V0KCl9ZW1pdFN0YXR1c0NoYW5nZWQoZSx0KXt2YXIgbixyLG8saTt0aGlzLmV2ZW50cy5lbWl0KEUuc3RhdHVzQ2hhbmdlZEtleSx7c3RhdHVzOmUscHJldmlvdXNTdGF0dXM6dCxsYXN0Q2hlY2tUaW1lOm51bGwhPT0ocj1udWxsPT09KG49dGhpcy5sYXN0SGVhbHRoQ2hlY2tSZXNwb25zZSl8fHZvaWQgMD09PW4/dm9pZCAwOm4udGltZSkmJnZvaWQgMCE9PXI/cjpudWxsLGxhc3RDaGVja0NvdW50ZXI6bnVsbCE9PShpPW51bGw9PT0obz10aGlzLmxhc3RIZWFsdGhDaGVja1Jlc3BvbnNlKXx8dm9pZCAwPT09bz92b2lkIDA6by5jb3VudGVyKSYmdm9pZCAwIT09aT9pOm51bGx9KX1vblN0YXR1c0NoYW5nZWQoZSl7dGhpcy5ldmVudHMub24oRS5zdGF0dXNDaGFuZ2VkS2V5LGUpfW9mZlN0YXR1c0NoYW5nZWQoZSl7dGhpcy5ldmVudHMub2ZmKEUuc3RhdHVzQ2hhbmdlZEtleSxlKX19RS5zdGF0dXNDaGFuZ2VkS2V5PSJzdGF0dXNDaGFuZ2VkIjtjbGFzcyBDe2NvbnN0cnVjdG9yKGUpe3RoaXMuc3RhdHVzPSJub3RDb25uZWN0ZWQiLHRoaXMuY2hhbmdlSGFuZGxlcnM9bmV3IFNldCx0aGlzLmxvZ2dlcj1uZXcgTyh7c291cmNlOiJjb3JlLnByb3h5LmNvbm5lY3Rpb24tc3RhdHVzLW1hbmFnZXIiLHByb3ZpZGVyOmUsbWl4aW46KCk9Pih7c3RhdHVzOnRoaXMuc3RhdHVzfSl9KX1nZXRTdGF0dXMoKXtyZXR1cm4gdGhpcy5zdGF0dXN9dXBkYXRlKGUpe3RoaXMuc3RhdHVzPWUuc3RhdHVzLHRoaXMubG9nZ2VyLnRyYWNlKCJQcm94eSBDb25uZWN0aW9uIFN0YXR1cyBDaGFuZ2VkIix7c3RhdHVzOmUuc3RhdHVzfSksWy4uLnRoaXMuY2hhbmdlSGFuZGxlcnNdLmZvckVhY2goKHQ9Pnt0cnl7dChlKX1jYXRjaChlKXt0aGlzLmxvZ2dlci5lcnJvcigiQW4gZXJyb3Igb2NjdXJyZWQgd2l0aGluIGEgUHJveHlDb25uZWN0aW9uQ2hhbmdlZEhhbmRsZXIiLHtlcnJvcjplfSl9fSkpfW9uQ2hhbmdlKGUpe3RoaXMuY2hhbmdlSGFuZGxlcnMuYWRkKGUpfW9mZkNoYW5nZShlKXt0aGlzLmNoYW5nZUhhbmRsZXJzLmRlbGV0ZShlKX19dmFyIEksVCx3PWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBuZXcobnx8KG49UHJvbWlzZSkpKChmdW5jdGlvbihvLGkpe2Z1bmN0aW9uIGEoZSl7dHJ5e2Moci5uZXh0KGUpKX1jYXRjaChlKXtpKGUpfX1mdW5jdGlvbiBzKGUpe3RyeXtjKHIudGhyb3coZSkpfWNhdGNoKGUpe2koZSl9fWZ1bmN0aW9uIGMoZSl7dmFyIHQ7ZS5kb25lP28oZS52YWx1ZSk6KHQ9ZS52YWx1ZSx0IGluc3RhbmNlb2Ygbj90Om5ldyBuKChmdW5jdGlvbihlKXtlKHQpfSkpKS50aGVuKGEscyl9Yygocj1yLmFwcGx5KGUsdHx8W10pKS5uZXh0KCkpfSkpfSxBPWZ1bmN0aW9uKGUsdCl7dmFyIG49e307Zm9yKHZhciByIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJnQuaW5kZXhPZihyKTwwJiYobltyXT1lW3JdKTtpZihudWxsIT1lJiYiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG89MDtmb3Iocj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO288ci5sZW5ndGg7bysrKXQuaW5kZXhPZihyW29dKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyW29dKSYmKG5bcltvXV09ZVtyW29dXSl9cmV0dXJuIG59O2NsYXNzIF97Y29uc3RydWN0b3IoZSl7dGhpcy5wcm92aWRlcj1lLHRoaXMubG9nZ2VyPW5ldyBPKHtzb3VyY2U6ImNvcmUucHJveHkiLHByb3ZpZGVyOmUsbWl4aW46KCk9Pih7cHJveHlUeXBlOnRoaXMucHJveHlUeXBlLGNvbm5lY3Rpb25JZDp0aGlzLmNvbm5lY3Rpb25JZH0pfSksdGhpcy5yZXF1ZXN0TWFuYWdlcj1uZXcgbShlKSx0aGlzLnN0YXR1cz1uZXcgQyhlKSx0aGlzLmVycm9yU2VydmljZT1uZXcgUyhlKSx0aGlzLnVwc3RyZWFtTWVzc2FnZVF1ZXVlPVtdLHRoaXMuY29ubmVjdGlvbkVzdGFibGlzaGVkPSExLHRoaXMuaXNJbml0aWFsaXplZD0hMSx0aGlzLnN1YnNjcmlwdGlvbnM9bmV3IGgsdGhpcy5jb25uZWN0aW9uSWQ9bnVsbCx0aGlzLmNoYW5uZWxNYW5hZ2VyPW5ldyBiKGUsdGhpcy5zZW5kT3JRdWV1ZU1lc3NhZ2VUb1N1YmplY3QuYmluZCh0aGlzKSksdGhpcy5oZWFsdGhDaGVjaz1uZXcgRSh7cHJvdmlkZXI6ZSxzZW5kSGVhbHRoQ2hlY2s6dGhpcy5zZW5kT3JRdWV1ZU1lc3NhZ2VUb1N1YmplY3QuYmluZCh0aGlzKSxnZXRVcHN0cmVhbU1lc3NhZ2VPcmlnaW46dGhpcy5nZXRVcHN0cmVhbU1lc3NhZ2VPcmlnaW4uYmluZCh0aGlzKX0pfWluaXQoKXtpZih0aGlzLmlzSW5pdGlhbGl6ZWQpdGhyb3cgbmV3IEVycm9yKCJQcm94eSBhbHJlYWR5IGluaXRpYWxpemVkIik7dGhpcy5pc0luaXRpYWxpemVkPSEwLHRoaXMuaW5pdFByb3h5KCl9cmVxdWVzdChlLHQsbixyKXtjb25zdCBvPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybnt0eXBlOiJyZXF1ZXN0IixuYW1lc3BhY2U6ZSxjb21tYW5kOnQscmVxdWVzdElkOnUoKSxkYXRhOm4sbWVzc2FnZU9yaWdpbjpyfX0oZSx0LG4sbnVsbCE9cj9yOnRoaXMuZ2V0VXBzdHJlYW1NZXNzYWdlT3JpZ2luKCkpLGk9dGhpcy5yZXF1ZXN0TWFuYWdlci5wcm9jZXNzUmVxdWVzdChvKTtyZXR1cm4gdGhpcy5zZW5kT3JRdWV1ZU1lc3NhZ2VUb1N1YmplY3QobyksaX1zdWJzY3JpYmUoZSx0LG4pe2NvbnN0e2hhbmRsZXJJZDpyfT10aGlzLnN1YnNjcmlwdGlvbnMuYWRkKGUsdCksbz17dHlwZToic3Vic2NyaWJlIix0b3BpYzplLG1lc3NhZ2VPcmlnaW46bnVsbCE9bj9uOnRoaXMuZ2V0VXBzdHJlYW1NZXNzYWdlT3JpZ2luKCksaGFuZGxlcklkOnJ9O3RoaXMuc2VuZE9yUXVldWVNZXNzYWdlVG9TdWJqZWN0KG8pfXVuc3Vic2NyaWJlKGUsdCxuKXtpZih0aGlzLnN1YnNjcmlwdGlvbnMuZGVsZXRlKGUsdCksdGhpcy5zdWJzY3JpcHRpb25zLmlzRW1wdHkoZSkpe2NvbnN0IHQ9e3R5cGU6InVuc3Vic2NyaWJlIix0b3BpYzplLG1lc3NhZ2VPcmlnaW46bnVsbCE9bj9uOnRoaXMuZ2V0VXBzdHJlYW1NZXNzYWdlT3JpZ2luKCl9O3RoaXMuc2VuZE9yUXVldWVNZXNzYWdlVG9TdWJqZWN0KHQpfX1sb2coZSl7Y29uc3QgdD1mdW5jdGlvbih7bGV2ZWw6ZSxzb3VyY2U6dCxtZXNzYWdlOm4sbG9nZ2VySWQ6cixkYXRhOm99LGEscyl7Y29uc3QgYz1mdW5jdGlvbihlKXtpZihlKXRyeXtyZXR1cm4gZnVuY3Rpb24oZSl7dHJ5e3JldHVybiBzdHJ1Y3R1cmVkQ2xvbmUoZSl9Y2F0Y2godCl7dHJ5e3JldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKX1jYXRjaChlKXt0aHJvdyBuZXcgaSh7ZXJyb3JLZXk6ImRlZXBDbG9uZUZhaWxlZCIsZGV0YWlsczp7YWN0dWFsRXJyb3I6ZX19KX19fShlKX1jYXRjaChlKXtyZXR1cm57ZXJyb3I6IkRhdGEgZmFpbGVkIHRvIHNhbml0aXplLiBUaGUgb3JpZ2luYWwgZGF0YSBpcyBub3QgYXZhaWxhYmxlIn19fShvKTtyZXR1cm57dHlwZToibG9nIixsZXZlbDplLHRpbWU6bmV3IERhdGUsc291cmNlOnQsbWVzc2FnZTpuLGxvZ2dlcklkOnIsZGF0YTpjLGNvbnRleHQ6YSxtZXNzYWdlT3JpZ2luOnN9fShlLHRoaXMuYWRkQ29udGV4dFRvTG9nZ2VyKCksdGhpcy5nZXRVcHN0cmVhbU1lc3NhZ2VPcmlnaW4oKSk7dGhpcy5zZW5kT3JRdWV1ZU1lc3NhZ2VUb1N1YmplY3QodCl9c2VuZExvZ01lc3NhZ2UoZSl7ImxvZyI9PT1lLnR5cGU/KGUuY29udGV4dD1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZS5jb250ZXh0KSx0aGlzLmFkZENvbnRleHRUb0xvZ2dlcigpKSx0aGlzLnNlbmRPclF1ZXVlTWVzc2FnZVRvU3ViamVjdChlKSk6dGhpcy5sb2dnZXIuZXJyb3IoIkF0dGVtcHRlZCB0byBzZW5kIGludmFsaWQgbG9nIG1lc3NhZ2UiLHttZXNzYWdlOmV9KX1zZW5kTWV0cmljKHttZXRyaWNEYXRhOmUsdGltZTp0LG5hbWVzcGFjZTpufSl7Y29uc3Qgcj1mdW5jdGlvbih7bWV0cmljRGF0YTplLHRpbWU6dCxuYW1lc3BhY2U6bn0scil7dmFyIG8saTtyZXR1cm57dHlwZToibWV0cmljIixuYW1lc3BhY2U6bixtZXRyaWNOYW1lOmUubWV0cmljTmFtZSx1bml0OmUudW5pdCx2YWx1ZTplLnZhbHVlLHRpbWU6dCxkaW1lbnNpb25zOm51bGwhPT0obz1lLmRpbWVuc2lvbnMpJiZ2b2lkIDAhPT1vP286e30sb3B0aW9uYWxEaW1lbnNpb25zOm51bGwhPT0oaT1lLm9wdGlvbmFsRGltZW5zaW9ucykmJnZvaWQgMCE9PWk/aTp7fSxtZXNzYWdlT3JpZ2luOnJ9fSh7bWV0cmljRGF0YTplLHRpbWU6dCxuYW1lc3BhY2U6bn0sdGhpcy5nZXRVcHN0cmVhbU1lc3NhZ2VPcmlnaW4oKSk7dGhpcy5zZW5kT3JRdWV1ZU1lc3NhZ2VUb1N1YmplY3Qocil9c2VuZE1ldHJpY01lc3NhZ2UoZSl7Im1ldHJpYyI9PT1lLnR5cGU/dGhpcy5zZW5kT3JRdWV1ZU1lc3NhZ2VUb1N1YmplY3QoZSk6dGhpcy5sb2dnZXIuZXJyb3IoIkF0dGVtcHRlZCB0byBzZW5kIGludmFsaWQgbWV0cmljIG1lc3NhZ2UiLHttZXRyaWNNZXNzYWdlOmV9KX1zZW5kT3JRdWV1ZU1lc3NhZ2VUb1N1YmplY3QoZSl7dGhpcy5jb25uZWN0aW9uRXN0YWJsaXNoZWQ/dGhpcy5zZW5kTWVzc2FnZVRvU3ViamVjdChlKTp0aGlzLnVwc3RyZWFtTWVzc2FnZVF1ZXVlLnB1c2goZSl9Y29uc3VtZXJNZXNzYWdlSGFuZGxlcihlKXtpZighdGhpcy5pc0luaXRpYWxpemVkKXJldHVybiB2b2lkIHRoaXMubG9nZ2VyLmVycm9yKCJBdHRlbXB0ZWQgdG8gcHJvY2VzcyBtZXNzYWdlIGZyb20gc3ViamVjdCBwcmlvciB0byBwcm94eSBiZWluZyBpbml0aWFsaXppbmcuIE1lc3NhZ2Ugbm90IHByb2Nlc3NlZCIse29yaWdpbmFsTWVzc2FnZUV2ZW50RGF0YTplLmRhdGF9KTtjb25zdHtkYXRhOnR9PWU7aWYoISgidHlwZSJpbiB0KSlyZXR1cm4gdm9pZCB0aGlzLmxvZ2dlci53YXJuKCJVbmtub3duIGluYm91bmQgbWVzc2FnZSIse29yaWdpbmFsTWVzc2FnZUV2ZW50RGF0YTp0fSk7Y29uc3Qgbj10O3RoaXMuaGFuZGxlTWVzc2FnZUZyb21TdWJqZWN0KG4pfWhhbmRsZU1lc3NhZ2VGcm9tU3ViamVjdChlKXt0aGlzLmhhbmRsZURlZmF1bHRNZXNzYWdlRnJvbVN1YmplY3QoZSl9aGFuZGxlRGVmYXVsdE1lc3NhZ2VGcm9tU3ViamVjdChlKXtzd2l0Y2goZS50eXBlKXtjYXNlImFja25vd2xlZGdlIjp0aGlzLmhhbmRsZUNvbm5lY3Rpb25BY2tub3dsZWRnZShlKTticmVhaztjYXNlInJlc3BvbnNlIjp0aGlzLmhhbmRsZVJlc3BvbnNlKGUpO2JyZWFrO2Nhc2UicHVibGlzaCI6dGhpcy5oYW5kbGVQdWJsaXNoKGUpO2JyZWFrO2Nhc2UiZXJyb3IiOnRoaXMuaGFuZGxlRXJyb3IoZSk7YnJlYWs7Y2FzZSJjaGlsZERvd25zdHJlYW1NZXNzYWdlIjp0aGlzLmNoYW5uZWxNYW5hZ2VyLmhhbmRsZURvd25zdHJlYW1NZXNzYWdlKGUpO2JyZWFrO2Nhc2UiY2hpbGRDb25uZWN0aW9uQ2xvc2UiOnRoaXMuY2hhbm5lbE1hbmFnZXIuaGFuZGxlQ2xvc2VNZXNzYWdlKGUpO2JyZWFrO2Nhc2UiaGVhbHRoQ2hlY2tSZXNwb25zZSI6dGhpcy5oZWFsdGhDaGVjay5oYW5kbGVSZXNwb25zZShlKTticmVhaztkZWZhdWx0OnJldHVybiB2b2lkIHRoaXMubG9nZ2VyLmVycm9yKCJVbmtub3duIGluYm91bmQgbWVzc2FnZSIse29yaWdpbmFsTWVzc2FnZUV2ZW50RGF0YTplfSl9fWhhbmRsZUNvbm5lY3Rpb25BY2tub3dsZWRnZShlKXtmb3IodGhpcy5jb25uZWN0aW9uSWQ9ZS5jb25uZWN0aW9uSWQsdGhpcy5zdGF0dXMudXBkYXRlKHtzdGF0dXM6InJlYWR5Iixjb25uZWN0aW9uSWQ6ZS5jb25uZWN0aW9uSWR9KSx0aGlzLmNvbm5lY3Rpb25Fc3RhYmxpc2hlZD0hMDt0aGlzLnVwc3RyZWFtTWVzc2FnZVF1ZXVlLmxlbmd0aDspe2NvbnN0IGU9dGhpcy51cHN0cmVhbU1lc3NhZ2VRdWV1ZS5zaGlmdCgpO3RoaXMuc2VuZE1lc3NhZ2VUb1N1YmplY3QoZSl9dGhpcy5oZWFsdGhDaGVjay5zdGFydChlKX1oYW5kbGVSZXNwb25zZShlKXt0aGlzLnJlcXVlc3RNYW5hZ2VyLnByb2Nlc3NSZXNwb25zZShlKX1oYW5kbGVQdWJsaXNoKGUpe2NvbnN0e2hhbmRsZXJJZDp0LHRvcGljOm59PWU7aWYodCl7Y29uc3Qgcj10aGlzLnN1YnNjcmlwdGlvbnMuZ2V0QnlJZChuLHQpO3ImJnRoaXMuaGFuZGxlQXN5bmNTdWJzY3JpcHRpb25IYW5kbGVySW52b2tlKHtoYW5kbGVyOnIsaGFuZGxlcklkOnR9LGUpfWVsc2UgdGhpcy5zdWJzY3JpcHRpb25zLmdldChuKS5tYXAoKHQ9Pnt0aGlzLmhhbmRsZUFzeW5jU3Vic2NyaXB0aW9uSGFuZGxlckludm9rZSh0LGUpfSkpfWhhbmRsZUVycm9yKGUpe2lmKGUuaXNGYXRhbCl7Y29uc3R7bWVzc2FnZTp0LHR5cGU6bn09ZSxyPUEoZSxbIm1lc3NhZ2UiLCJ0eXBlIl0pO3RoaXMuc3RhdHVzLnVwZGF0ZSh7c3RhdHVzOiJlcnJvciIscmVhc29uOnQsZGV0YWlsczpyfSl9dGhpcy5wdWJsaXNoRXJyb3Ioe21lc3NhZ2U6ZS5tZXNzYWdlLGtleTplLmtleSxkZXRhaWxzOmUuZGV0YWlscyxpc0ZhdGFsOmUuaXNGYXRhbCxwcm94eVN0YXR1czplLnN0YXR1c30pfXB1Ymxpc2hFcnJvcihlKXtjb25zdCB0PU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7Y29ubmVjdGlvblN0YXR1czp0aGlzLmNvbm5lY3Rpb25TdGF0dXN9KTt0aGlzLmVycm9yU2VydmljZS5pbnZva2UodCl9aGFuZGxlQXN5bmNTdWJzY3JpcHRpb25IYW5kbGVySW52b2tlKGUsdCl7cmV0dXJuIHcodGhpcyxhcmd1bWVudHMsdm9pZCAwLChmdW5jdGlvbiooe2hhbmRsZXI6ZSxoYW5kbGVySWQ6dH0se3RvcGljOm4sZGF0YTpyfSl7dHJ5e3lpZWxkIGUocil9Y2F0Y2goZSl7dGhpcy5sb2dnZXIuZXJyb3IoIkFuIGVycm9yIG9jY3VycmVkIHdoZW4gaGFuZGxpbmcgc3Vic2NyaXB0aW9uIix7dG9waWM6bixlcnJvcjplLGhhbmRsZXJJZDp0fSl9fSkpfWdldCBjb25uZWN0aW9uU3RhdHVzKCl7cmV0dXJuIHRoaXMuc3RhdHVzLmdldFN0YXR1cygpfW9uRXJyb3IoZSl7dGhpcy5lcnJvclNlcnZpY2Uub25FcnJvcihlKX1vZmZFcnJvcihlKXt0aGlzLmVycm9yU2VydmljZS5vZmZFcnJvcihlKX1vbkNvbm5lY3Rpb25TdGF0dXNDaGFuZ2UoZSl7dGhpcy5zdGF0dXMub25DaGFuZ2UoZSl9b2ZmQ29ubmVjdGlvblN0YXR1c0NoYW5nZShlKXt0aGlzLnN0YXR1cy5vZmZDaGFuZ2UoZSl9b25IZWFsdGhDaGVja1N0YXR1c0NoYW5nZWQoZSl7dGhpcy5oZWFsdGhDaGVjay5vblN0YXR1c0NoYW5nZWQoZSl9b2ZmSGVhbHRoQ2hlY2tTdGF0dXNDaGFuZ2VkKGUpe3RoaXMuaGVhbHRoQ2hlY2sub2ZmU3RhdHVzQ2hhbmdlZChlKX1hZGRDaGlsZENoYW5uZWwoZSl7dGhpcy5hZGRDaGlsZElmcmFtZUNoYW5uZWwoZSl9YWRkQ2hpbGRJZnJhbWVDaGFubmVsKGUpe3RoaXMuY2hhbm5lbE1hbmFnZXIuYWRkQ2hhbm5lbChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSkse3R5cGU6ImlmcmFtZSJ9KSl9YWRkQ2hpbGRDb21wb25lbnRDaGFubmVsKGUpe3RoaXMuY2hhbm5lbE1hbmFnZXIuYWRkQ2hhbm5lbChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSkse3R5cGU6ImNvbXBvbmVudCJ9KSl9dXBkYXRlQ2hpbGRJZnJhbWVDaGFubmVsUG9ydChlKXt0aGlzLmNoYW5uZWxNYW5hZ2VyLnVwZGF0ZUNoYW5uZWxQb3J0KGUpfXVwZGF0ZUNoaWxkQ2hhbm5lbFBvcnQoZSl7dGhpcy51cGRhdGVDaGlsZElmcmFtZUNoYW5uZWxQb3J0KGUpfWdldENvbm5lY3Rpb25JZCgpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25JZD9Qcm9taXNlLnJlc29sdmUodGhpcy5jb25uZWN0aW9uSWQpOm5ldyBQcm9taXNlKCgoZSx0KT0+e2xldCBuO2NvbnN0IHI9dD0+eyJyZWFkeSI9PT10LnN0YXR1cyYmKHRoaXMub2ZmQ29ubmVjdGlvblN0YXR1c0NoYW5nZShyKSxjbGVhckludGVydmFsKG4pLGUodC5jb25uZWN0aW9uSWQpKX07bj1zZXRUaW1lb3V0KCgoKT0+e3RoaXMubG9nZ2VyLmVycm9yKCJUaW1lb3V0IGdldHRpbmcgY29ubmVjdGlvbiBpZCIpLHRoaXMub2ZmQ29ubmVjdGlvblN0YXR1c0NoYW5nZShyKSx0KG5ldyBFcnJvcigiVGltZW91dCBnZXR0aW5nIGNvbm5lY3Rpb25JZCIpKX0pLDFlNCksdGhpcy5vbkNvbm5lY3Rpb25TdGF0dXNDaGFuZ2Uocil9KSl9cmVzZXRDb25uZWN0aW9uKGUpe3RoaXMuY29ubmVjdGlvbkVzdGFibGlzaGVkPSExLHRoaXMuc3RhdHVzLnVwZGF0ZSh7c3RhdHVzOiJyZXNldCIscmVhc29uOmV9KTtjb25zdHtzdWJzY3JpcHRpb25IYW5kbGVyQ291bnQ6dH09dGhpcy5yZXN0b3JlQWxsSGFuZGxlcigpO3RoaXMubG9nZ2VyLmluZm8oIlJlc2V0dGluZyBwcm94eSIse3JlYXNvbjplLHN1YnNjcmlwdGlvbkhhbmRsZXJDb3VudDp0fSl9cmVzdG9yZUFsbEhhbmRsZXIoKXt2YXIgZTtjb25zdCB0PXRoaXMuc3Vic2NyaXB0aW9ucy5nZXRBbGxTdWJzY3JpcHRpb25IYW5kbGVySWRzKCk7cmV0dXJuIG51bGw9PXR8fHQubWFwKCgoe3RvcGljOmUsaGFuZGxlcklkOnR9KT0+KHt0eXBlOiJzdWJzY3JpYmUiLHRvcGljOmUsbWVzc2FnZU9yaWdpbjp0aGlzLmdldFVwc3RyZWFtTWVzc2FnZU9yaWdpbigpLGhhbmRsZXJJZDp0fSkpKS5mb3JFYWNoKChlPT50aGlzLnNlbmRPclF1ZXVlTWVzc2FnZVRvU3ViamVjdChlKSkpLHtzdWJzY3JpcHRpb25IYW5kbGVyQ291bnQ6bnVsbCE9PShlPW51bGw9PXQ/dm9pZCAwOnQubGVuZ3RoKSYmdm9pZCAwIT09ZT9lOi0xfX11bnN1YnNjcmliZUFsbEhhbmRsZXJzKCl7dmFyIGU7Y29uc3QgdD10aGlzLnN1YnNjcmlwdGlvbnMuZ2V0QWxsU3Vic2NyaXB0aW9uSGFuZGxlcklkcygpO3RoaXMubG9nZ2VyLmluZm8oIlVuc3Vic2NyaWJpbmcgYWxsIGhhbmRsZXJzIGZyb20gcHJveHkiLHtzdWJzY3JpcHRpb25IYW5kbGVyQ291bnQ6bnVsbCE9PShlPW51bGw9PXQ/dm9pZCAwOnQubGVuZ3RoKSYmdm9pZCAwIT09ZT9lOi0xfSksbnVsbD09dHx8dC5tYXAoKCh7dG9waWM6ZX0pPT4oe3R5cGU6InVuc3Vic2NyaWJlIix0b3BpYzplLG1lc3NhZ2VPcmlnaW46dGhpcy5nZXRVcHN0cmVhbU1lc3NhZ2VPcmlnaW4oKX0pKSkuZm9yRWFjaCgoZT0+dGhpcy5zZW5kT3JRdWV1ZU1lc3NhZ2VUb1N1YmplY3QoZSkpKX19IWZ1bmN0aW9uKGUpe2VbZS50cmFjZT0xXT0idHJhY2UiLGVbZS5kZWJ1Zz0yXT0iZGVidWciLGVbZS5pbmZvPTNdPSJpbmZvIixlW2Uud2Fybj00XT0id2FybiIsZVtlLmVycm9yPTVdPSJlcnJvciJ9KEl8fChJPXt9KSk7Y2xhc3MgUntjb25zdHJ1Y3RvcihlKXt0aGlzLm1peGluPWV9Z2V0VHJhbnNmb3JtZWREYXRhKGUsdCl7cmV0dXJuIHRoaXMubWl4aW4/T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG51bGwhPXQ/dDp7fSksdGhpcy5taXhpbihudWxsIT10P3Q6e30sZSkpOnR9fWNsYXNzIE97Y29uc3RydWN0b3IoZSl7dGhpcy5fcHJveHk9bnVsbCx0aGlzLl9sb2dUb0NvbnNvbGVMZXZlbD1udWxsLHRoaXMubG9nZ2VySWQ9ZnVuY3Rpb24oZSl7Y29uc3QgdD1uZXcgVWludDhBcnJheShNYXRoLmNlaWwoZS8yKSk7cmV0dXJuIGNyeXB0by5nZXRSYW5kb21WYWx1ZXModCksQXJyYXkuZnJvbSh0LChlPT5lLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIikpKS5qb2luKCIiKS5zdWJzdHJpbmcoMCxlKX0oOCksInN0cmluZyI9PXR5cGVvZiBlPyh0aGlzLnNvdXJjZT1lLHRoaXMuZGF0YVRyYW5zZm9ybWVyPW5ldyBSKHZvaWQgMCkpOih0aGlzLnNvdXJjZT1lLnNvdXJjZSxlLnByb3ZpZGVyJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5wcm92aWRlcj90aGlzLnByb3ZpZGVyRmFjdG9yeT1lLnByb3ZpZGVyOnRoaXMucHJvdmlkZXI9ZS5wcm92aWRlcix0aGlzLmRhdGFUcmFuc2Zvcm1lcj1uZXcgUihlLm1peGluKSx0aGlzLmxvZ09wdGlvbnM9ZS5vcHRpb25zKX10cmFjZShlLHQsbil7dGhpcy5sb2coSS50cmFjZSxlLHQsbil9ZGVidWcoZSx0LG4pe3RoaXMubG9nKEkuZGVidWcsZSx0LG4pfWluZm8oZSx0LG4pe3RoaXMubG9nKEkuaW5mbyxlLHQsbil9d2FybihlLHQsbil7dGhpcy5sb2coSS53YXJuLGUsdCxuKX1lcnJvcihlLHQsbil7dGhpcy5sb2coSS5lcnJvcixlLHQsbil9bG9nKGUsdCxuLHIpe2NvbnN0IG89dGhpcy5kYXRhVHJhbnNmb3JtZXIuZ2V0VHJhbnNmb3JtZWREYXRhKGUsbik7dGhpcy5pZ25vcmVSZW1vdGUocil8fHRoaXMuZ2V0UHJveHkoKS5sb2coe2xldmVsOmUsc291cmNlOnRoaXMuc291cmNlLGxvZ2dlcklkOnRoaXMubG9nZ2VySWQsbWVzc2FnZTp0LGRhdGE6b30pLHRoaXMuYXBwbHlEdXBsaWNhdGVNZXNzYWdlVG9Db25zb2xlKGUscikmJmZ1bmN0aW9uKGUsdCxuKXtpZihuKXN3aXRjaChlKXtjYXNlIEkuZXJyb3I6Y29uc29sZS5lcnJvcih0LG4pO2JyZWFrO2Nhc2UgSS53YXJuOmNvbnNvbGUud2Fybih0LG4pO2JyZWFrO2Nhc2UgSS5pbmZvOmNvbnNvbGUuaW5mbyh0LG4pO2JyZWFrO2Nhc2UgSS5kZWJ1Zzpjb25zb2xlLmRlYnVnKHQsbik7YnJlYWs7Y2FzZSBJLnRyYWNlOmNvbnNvbGUudHJhY2UodCxuKTticmVhaztkZWZhdWx0OmNvbnNvbGUubG9nKHQsbil9ZWxzZSBzd2l0Y2goZSl7Y2FzZSBJLmVycm9yOmNvbnNvbGUuZXJyb3IodCk7YnJlYWs7Y2FzZSBJLndhcm46Y29uc29sZS53YXJuKHQpO2JyZWFrO2Nhc2UgSS5pbmZvOmNvbnNvbGUuaW5mbyh0KTticmVhaztjYXNlIEkuZGVidWc6Y29uc29sZS5kZWJ1Zyh0KTticmVhaztjYXNlIEkudHJhY2U6Y29uc29sZS50cmFjZSh0KTticmVhaztkZWZhdWx0OmNvbnNvbGUubG9nKHQpfX0oZSx0LG8pfWdldFByb3ZpZGVyKCl7cmV0dXJuIHRoaXMucHJvdmlkZXJ8fCh0aGlzLnByb3ZpZGVyPXRoaXMucHJvdmlkZXJGYWN0b3J5P3RoaXMucHJvdmlkZXJGYWN0b3J5KCk6bygpKSx0aGlzLnByb3ZpZGVyfWdldFByb3h5KCl7cmV0dXJuIHRoaXMuX3Byb3h5fHwodGhpcy5fcHJveHk9dGhpcy5nZXRQcm92aWRlcigpLmdldFByb3h5KCkpLHRoaXMuX3Byb3h5fWFwcGx5RHVwbGljYXRlTWVzc2FnZVRvQ29uc29sZShlLHQpe3JldHVybihudWxsPT10P3ZvaWQgMDp0LmR1cGxpY2F0ZU1lc3NhZ2VUb0NvbnNvbGUpfHx0aGlzLmdldExvZ0NvbnNvbGVMZXZlbCgpPD1lfWdldExvZ0NvbnNvbGVMZXZlbCgpe3ZhciBlLHQsbixyO3JldHVybiB0aGlzLl9sb2dUb0NvbnNvbGVMZXZlbHx8KHRoaXMuX2xvZ1RvQ29uc29sZUxldmVsPShudWxsPT09KGU9dGhpcy5sb2dPcHRpb25zKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5taW5Mb2dUb0NvbnNvbGVMZXZlbE92ZXJyaWRlKT90aGlzLmxvZ09wdGlvbnMubWluTG9nVG9Db25zb2xlTGV2ZWxPdmVycmlkZTpudWxsIT09KHI9bnVsbD09PShuPW51bGw9PT0odD10aGlzLmdldFByb3ZpZGVyKCkuY29uZmlnKXx8dm9pZCAwPT09dD92b2lkIDA6dC5sb2dnaW5nKXx8dm9pZCAwPT09bj92b2lkIDA6bi5taW5Mb2dUb0NvbnNvbGVMZXZlbCkmJnZvaWQgMCE9PXI/cjpJLmVycm9yKSx0aGlzLl9sb2dUb0NvbnNvbGVMZXZlbH1pZ25vcmVSZW1vdGUoZSl7dmFyIHQsbixyO3JldHVybiBudWxsIT09KG49bnVsbD09PSh0PXRoaXMubG9nT3B0aW9ucyl8fHZvaWQgMD09PXQ/dm9pZCAwOnQucmVtb3RlSWdub3JlKSYmdm9pZCAwIT09biYmbnx8bnVsbCE9PShyPW51bGw9PWU/dm9pZCAwOmUucmVtb3RlSWdub3JlKSYmdm9pZCAwIT09ciYmcn19Y2xhc3MgTHtjb25zdHJ1Y3Rvcih7Y29uZmlnOmUscHJveHlGYWN0b3J5OnR9KXtpZih0aGlzLl9pZD11KCksIXQpdGhyb3cgbmV3IEVycm9yKCJBdHRlbXB0ZWQgdG8gZ2V0IFByb3h5IGJlZm9yZSBzZXR0aW5nIHVwIGZhY3RvcnkiKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIkZhaWxlZCB0byBpbmNsdWRlIGNvbmZpZyIpO3RoaXMucHJveHlGYWN0b3J5PXQsdGhpcy5fY29uZmlnPWV9Z2V0IGlkKCl7cmV0dXJuIHRoaXMuX2lkfWdldFByb3h5KCl7cmV0dXJuIHRoaXMucHJveHl8fCh0aGlzLnByb3h5PXRoaXMucHJveHlGYWN0b3J5KHRoaXMpLHRoaXMucHJveHkuaW5pdCgpKSx0aGlzLnByb3h5fWdldCBjb25maWcoKXtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSx0aGlzLl9jb25maWcpfW9uRXJyb3IoZSl7dGhpcy5nZXRQcm94eSgpLm9uRXJyb3IoZSl9b2ZmRXJyb3IoZSl7dGhpcy5nZXRQcm94eSgpLm9mZkVycm9yKGUpfXN0YXRpYyBpbml0aWFsaXplUHJvdmlkZXIoZSl7aWYodGhpcy5pc0luaXRpYWxpemVkKXtjb25zdCBlPSJBdHRlbXB0ZWQgdG8gaW5pdGlhbGl6ZSBwcm92aWRlciBtb3JlIHRoYW4gb25lIHRpbWUuIix0PXt9O3RyeXtjb25zdCB0PW8oKTtuZXcgTyh7c291cmNlOiJjb3JlLmFtYXpvbkNvbm5lY3RQcm92aWRlci5pbml0Iixwcm92aWRlcjp0fSkuZXJyb3IoZSl9Y2F0Y2goZSl7dC5sb2dnaW5nRXJyb3I9bnVsbD09ZT92b2lkIDA6ZS5tZXNzYWdlfXRocm93IG5ldyBpKHtlcnJvcktleToiYXR0ZW1wdEluaXRpYWxpemVNdWx0aXBsZVByb3ZpZGVycyIscmVhc29uOmUsZGV0YWlsczp0fSl9cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKHIpdGhyb3cgbmV3IEVycm9yKCJHbG9iYWwgUHJvdmlkZXIgaXMgYWxyZWFkeSBzZXQiKTtyPWV9KGUpLHRoaXMuaXNJbml0aWFsaXplZD0hMCxlLmdldFByb3h5KCksZX19TC5pc0luaXRpYWxpemVkPSExO2NsYXNzIGsgZXh0ZW5kcyBfe2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSksdGhpcy5pbnN0YW5jZVVybD12b2lkIDAhPT10P3Q6ZS5jb25maWcuaW5zdGFuY2VVcmwsdGhpcy5wb3N0TWVzc2FnZUhhbmRsZXI9dGhpcy5saXN0ZW5Gb3JJbml0aWFsTWVzc2FnZS5iaW5kKHRoaXMpLHRoaXMucHJveHlMb2dnZXI9bmV3IE8oe3NvdXJjZToic2l0ZVByb3h5Iixwcm92aWRlcjplfSl9aW5pdFByb3h5KCl7dGhpcy5zdGF0dXMudXBkYXRlKHtzdGF0dXM6ImNvbm5lY3RpbmcifSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMucG9zdE1lc3NhZ2VIYW5kbGVyKX1yZXNldENvbm5lY3Rpb24oZSl7c3VwZXIucmVzZXRDb25uZWN0aW9uKGUpLHRoaXMubWVzc2FnZVBvcnQ9dm9pZCAwLHRoaXMuc3RhdHVzLnVwZGF0ZSh7c3RhdHVzOiJjb25uZWN0aW5nIn0pfXNlbmRNZXNzYWdlVG9TdWJqZWN0KGUpe3RoaXMubWVzc2FnZVBvcnQ/dGhpcy5tZXNzYWdlUG9ydC5wb3N0TWVzc2FnZShlKTp0aGlzLnByb3h5TG9nZ2VyLmVycm9yKCJGYWlsZWQgdG8gc2VuZCBVcHN0cmVhbU1lc3NhZ2UuIE1lc3NhZ2VQb3J0IG5vdCBzZXQiLHttZXNzYWdlVHlwZTplLnR5cGV9KX1hZGRDb250ZXh0VG9Mb2dnZXIoKXtyZXR1cm57fX1saXN0ZW5Gb3JJbml0aWFsTWVzc2FnZShlKXtpZih0aGlzLnZlcmlmeU9yaWdpbihlKSYmdGhpcy52ZXJpZnlFdmVudFNvdXJjZShlKSl7aWYoImNyb3NzLWRvbWFpbi1hZGFwdGVyLWluaXQiIT09ZS5kYXRhLnR5cGUpcmV0dXJuIHZvaWQgdGhpcy5pbnZhbGlkSW5pdE1lc3NhZ2VIYW5kbGVyKGUuZGF0YSk7aWYodGhpcy5tZXNzYWdlUG9ydCYmKHRoaXMucmVzZXRDb25uZWN0aW9uKCJTdWJzZXF1ZW50IE1lc3NhZ2UgUG9ydCBEZXRlY3RlZCIpLHRoaXMucHJveHlMb2dnZXIuaW5mbygiU3Vic2VxdWVudCBtZXNzYWdlIHBvcnQgcmVjZWl2ZWQuIFJlc2V0dGluZyBjb25uZWN0aW9uIikpLHRoaXMubWVzc2FnZVBvcnQ9ZS5wb3J0c1swXSwhdGhpcy5tZXNzYWdlUG9ydCl0aHJvdyBuZXcgRXJyb3IoIm1lc3NhZ2UgcG9ydCBub3QgcHJvdmlkZWQgYnkgaWZyYW1lIik7dGhpcy5tZXNzYWdlUG9ydC5vbm1lc3NhZ2U9dGhpcy5jb25zdW1lck1lc3NhZ2VIYW5kbGVyLmJpbmQodGhpcyksdGhpcy5zdGF0dXMudXBkYXRlKHtzdGF0dXM6ImluaXRpYWxpemluZyJ9KSx0aGlzLm1lc3NhZ2VQb3J0LnBvc3RNZXNzYWdlKHt0eXBlOiJjcm9zcy1kb21haW4tc2l0ZS1yZWFkeSIscHJvdmlkZXJJZDp0aGlzLnByb3ZpZGVyLmlkfSksdGhpcy5wcm94eUxvZ2dlci5kZWJ1ZygiQ0RBIFBvc3QgbWVzc2FnZSBoYW5kbGVyIHJlbW92ZWQiKX19dmVyaWZ5T3JpZ2luKGUpe2NvbnN0IHQ9ZS5vcmlnaW47aWYoIXQpcmV0dXJuIHRoaXMucHJveHlMb2dnZXIud2FybigiTm8gb3JpZ2luIHByb3ZpZGVkIGluIGV2ZW50LiBJZ25vcmluZyBldmVudC4iKSwhMTtsZXQgbjt0cnl7bj1uZXcgVVJMKHRoaXMuaW5zdGFuY2VVcmwpLm9yaWdpbn1jYXRjaChlKXtyZXR1cm4gdGhpcy5wcm94eUxvZ2dlci5lcnJvcigiVW5hYmxlIHRvIHBhcnNlIGV4cGVjdGVkIG9yaWdpbiBmcm9tIGluc3RhbmNlVXJsLiBDYW5ub3QgbWF0Y2giLHtlcnJvcjplLGV2ZW50T3JpZ2luOnQsaW5zdGFuY2VVcmw6dGhpcy5pbnN0YW5jZVVybH0se2R1cGxpY2F0ZU1lc3NhZ2VUb0NvbnNvbGU6ITB9KSwhMX1yZXR1cm4gdD09PW58fCgiY3Jvc3MtZG9tYWluLWFkYXB0ZXItaW5pdCI9PT1lLmRhdGEudHlwZSYmdGhpcy5wcm94eUxvZ2dlci53YXJuKCJPcmlnaW4gb2YgbWVzc2FnZSB3aXRoIHR5cGUgJ2Nyb3NzLWRvbWFpbi1hZGFwdGVyLWluaXQnIGRpZCBub3QgZXhwZWN0ZWQgaW5zdGFuY2UgdmFsdWUuIElnbm9yaW5nIix7ZXhwZWN0ZWRPcmlnaW46bixldmVudE9yaWdpbjp0fSx7ZHVwbGljYXRlTWVzc2FnZVRvQ29uc29sZTohMH0pLCExKX19Y2xhc3MgTiBleHRlbmRzIGt7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5jY3BJRnJhbWU9bnVsbCx0aGlzLnVuZXhwZWN0ZWRJZnJhbWVXYXJuaW5nQ291bnQ9MH1nZXQgcHJveHlUeXBlKCl7cmV0dXJuInN0cmVhbXMtc2l0ZSJ9c2V0Q0NQSWZyYW1lKGUpe2NvbnN0IHQ9Qm9vbGVhbih0aGlzLmNjcElGcmFtZSk7dGhpcy5jY3BJRnJhbWU9ZSx0aGlzLnVuZXhwZWN0ZWRJZnJhbWVXYXJuaW5nQ291bnQ9MCx0JiZ0aGlzLnJlc2V0Q29ubmVjdGlvbigiQ0NQIElGcmFtZSBVcGRhdGVkIil9Z2V0VXBzdHJlYW1NZXNzYWdlT3JpZ2luKCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oe190eXBlOiJzdHJlYW1zLXNpdGUiLHByb3ZpZGVySWQ6dGhpcy5wcm92aWRlci5pZH0sbCgpKX12ZXJpZnlFdmVudFNvdXJjZShlKXtjb25zdCB0PXRoaXMuY2NwSUZyYW1lO2lmKCF0KXJldHVybiB0aGlzLnByb3h5TG9nZ2VyLmVycm9yKCJDQ1AgSWZyYW1lIG5vdCBwcm92aWRlZCB0byBwcm94eS4gVW5hYmxlIHRvIHZlcmlmeSBldmVudCB0byBDb25uZWN0IHRvIENDUC4iLHtvcmlnaW46ZS5vcmlnaW59KSwhMTtjb25zdCBuPWUuc291cmNlPT09dC5jb250ZW50V2luZG93O3JldHVybiBufHwodGhpcy51bmV4cGVjdGVkSWZyYW1lV2FybmluZ0NvdW50KyssdGhpcy51bmV4cGVjdGVkSWZyYW1lV2FybmluZ0NvdW50PDUmJnRoaXMucHJveHlMb2dnZXIud2FybigiTWVzc2FnZSBjYW1lIGZyb20gdW5leHBlY3RlZCBpZnJhbWUuIE5vdCBhIHZhbGlkIENDUC4gV2lsbCBub3QgY29ubmVjdCIse29yaWdpbjplLm9yaWdpbix1bmV4cGVjdGVkSWZyYW1lV2FybmluZ0NvdW50OnRoaXMudW5leHBlY3RlZElmcmFtZVdhcm5pbmdDb3VudH0pKSxufWludmFsaWRJbml0TWVzc2FnZUhhbmRsZXIoKXt9fWNsYXNzIFAgZXh0ZW5kcyBMe2NvbnN0cnVjdG9yKGUpe3N1cGVyKHtjb25maWc6ZSxwcm94eUZhY3Rvcnk6ZT0+bmV3IE4oZSl9KX1zdGF0aWMgaW5pdChlKXtjb25zdCB0PW5ldyBQKGUpO3JldHVybiBQLmluaXRpYWxpemVQcm92aWRlcih0KSx7cHJvdmlkZXI6dH19c3RhdGljIGdldCBkZWZhdWx0KCl7cmV0dXJuIG8oIkFtYXpvbkNvbm5lY3RTdHJlYW1zU2l0ZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQiKX1zZXRDQ1BJZnJhbWUoZSl7dGhpcy5nZXRQcm94eSgpLnNldENDUElmcmFtZShlKX19IWZ1bmN0aW9uKGUpe2UuUHJpbWFyeT0icHJpbWFyeSIsZS5TZWNvbmRhcnk9InNlY29uZGFyeSJ9KFR8fChUPXt9KSk7Y2xhc3MgRCBleHRlbmRzIGt7Y29uc3RydWN0b3Ioe3Byb3ZpZGVyOmUscmVnaW9uOnQsZ2V0VXBzdHJlYW1NZXNzYWdlT3JpZ2luOm4scmVsYXlUb0dsb2JhbFJlc2lsaWVuY3lQcm94eTpyfSl7c3VwZXIoZSx0PT09VC5QcmltYXJ5P2UuY29uZmlnLnByaW1hcnlJbnN0YW5jZVVybDplLmNvbmZpZy5zZWNvbmRhcnlJbnN0YW5jZVVybCksdGhpcy5nZXRQYXJlbnRVcHN0cmVhbU1lc3NhZ2VPcmlnaW49bix0aGlzLnJlbGF5VG9HbG9iYWxSZXNpbGllbmN5UHJveHk9cix0aGlzLmNjcElGcmFtZT1udWxsLHRoaXMucmVnaW9uPXQsdGhpcy51bmV4cGVjdGVkSWZyYW1lV2FybmluZ0NvdW50PTB9Z2V0IHByb3h5VHlwZSgpe3JldHVybiJhY2dyLXJlZ2lvbmFsLXByb3h5In1zZXRDQ1BJZnJhbWUoZSl7Y29uc3QgdD1Cb29sZWFuKHRoaXMuY2NwSUZyYW1lKTt0aGlzLmNjcElGcmFtZT1lLHRoaXMudW5leHBlY3RlZElmcmFtZVdhcm5pbmdDb3VudD0wLHQmJnRoaXMucmVzZXRDb25uZWN0aW9uKCJDQ1AgSUZyYW1lIFVwZGF0ZWQiKX1oYW5kbGVNZXNzYWdlRnJvbVN1YmplY3QoZSl7c3dpdGNoKGUudHlwZSl7Y2FzZSJyZXNwb25zZSI6Y2FzZSJwdWJsaXNoIjpjYXNlImVycm9yIjp0aGlzLnJlbGF5VG9HbG9iYWxSZXNpbGllbmN5UHJveHkoZSk7YnJlYWs7ZGVmYXVsdDpzdXBlci5oYW5kbGVNZXNzYWdlRnJvbVN1YmplY3QoZSl9fWdldFVwc3RyZWFtTWVzc2FnZU9yaWdpbigpe3JldHVybiB0aGlzLmdldFBhcmVudFVwc3RyZWFtTWVzc2FnZU9yaWdpbigpfXZlcmlmeUV2ZW50U291cmNlKGUpe2NvbnN0IHQ9dGhpcy5jY3BJRnJhbWU7aWYoIXQpcmV0dXJuIHRoaXMucHJveHlMb2dnZXIuZXJyb3IoIkNDUCBJZnJhbWUgbm90IHByb3ZpZGVkIHRvIHByb3h5LiBVbmFibGUgdG8gdmVyaWZ5IGV2ZW50IHRvIENvbm5lY3QgdG8gQ0NQLiIse29yaWdpbjplLm9yaWdpbn0pLCExO2NvbnN0IG49ZS5zb3VyY2U9PT10LmNvbnRlbnRXaW5kb3c7cmV0dXJuIG58fCh0aGlzLnVuZXhwZWN0ZWRJZnJhbWVXYXJuaW5nQ291bnQrKyx0aGlzLnVuZXhwZWN0ZWRJZnJhbWVXYXJuaW5nQ291bnQ8NSYmdGhpcy5wcm94eUxvZ2dlci53YXJuKCJNZXNzYWdlIGNhbWUgZnJvbSB1bmV4cGVjdGVkIGlmcmFtZS4gTm90IGEgdmFsaWQgQ0NQLiBXaWxsIG5vdCBjb25uZWN0Iix7b3JpZ2luOmUub3JpZ2luLHVuZXhwZWN0ZWRJZnJhbWVXYXJuaW5nQ291bnQ6dGhpcy51bmV4cGVjdGVkSWZyYW1lV2FybmluZ0NvdW50fSkpLG59c2VuZE9yUXVldWVNZXNzYWdlVG9TdWJqZWN0KGUpe3N1cGVyLnNlbmRPclF1ZXVlTWVzc2FnZVRvU3ViamVjdChlKX1pbnZhbGlkSW5pdE1lc3NhZ2VIYW5kbGVyKCl7fX1mdW5jdGlvbiB4KGUpe2NvbnN0IHQ9T2JqZWN0LnZhbHVlcyhUKTtpZighdC5pbmNsdWRlcyhlKSl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmVnaW9uOiAke2V9LiBWYWxpZCByZWdpb25zIGFyZTogJHt0LmpvaW4oIiwgIil9YCl9Y2xhc3MgTSBleHRlbmRzIF97Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5hY3RpdmVSZWdpb249VC5QcmltYXJ5LHRoaXMucmVnaW9uUHJveGllcz17W1QuUHJpbWFyeV06bmV3IEQoe3Byb3ZpZGVyOmUscmVnaW9uOlQuUHJpbWFyeSxnZXRVcHN0cmVhbU1lc3NhZ2VPcmlnaW46dGhpcy5nZXRVcHN0cmVhbU1lc3NhZ2VPcmlnaW4uYmluZCh0aGlzKSxyZWxheVRvR2xvYmFsUmVzaWxpZW5jeVByb3h5OnRoaXMuaGFuZGxlTWVzc2FnZUZyb21TdWJqZWN0LmJpbmQodGhpcyl9KSxbVC5TZWNvbmRhcnldOm5ldyBEKHtwcm92aWRlcjplLHJlZ2lvbjpULlNlY29uZGFyeSxnZXRVcHN0cmVhbU1lc3NhZ2VPcmlnaW46dGhpcy5nZXRVcHN0cmVhbU1lc3NhZ2VPcmlnaW4uYmluZCh0aGlzKSxyZWxheVRvR2xvYmFsUmVzaWxpZW5jeVByb3h5OnRoaXMuaGFuZGxlTWVzc2FnZUZyb21TdWJqZWN0LmJpbmQodGhpcyl9KX0sdGhpcy5wcm94eUxvZ2dlcj1uZXcgTyh7c291cmNlOiJnbG9iYWxSZXNpbGllbmN5UHJveHkiLHByb3ZpZGVyOmV9KX1pbml0UHJveHkoKXtPYmplY3QudmFsdWVzKHRoaXMucmVnaW9uUHJveGllcykuZm9yRWFjaCgoZT0+ZS5pbml0KCkpKX1zZXRDQ1BJZnJhbWUoe2lmcmFtZTplLHJlZ2lvbjp0fSl7eCh0KSx0aGlzLnJlZ2lvblByb3hpZXNbdF0uc2V0Q0NQSWZyYW1lKGUpfXNldEFjdGl2ZVJlZ2lvbihlKXtpZih4KGUpLGUhPT10aGlzLmFjdGl2ZVJlZ2lvbil7Y29uc3QgdD10aGlzLnJlZ2lvblByb3hpZXNbdGhpcy5hY3RpdmVSZWdpb25dLG49dGhpcy5yZWdpb25Qcm94aWVzW2VdO3RoaXMudW5zdWJzY3JpYmVBbGxIYW5kbGVycygpLHRoaXMucHJveHlMb2dnZXIuaW5mbygiQWN0aXZlIHJlZ2lvbiBjaGFuZ2VkIix7Y3VycmVudDplLGluc3RhbmNlVXJsOm4uaW5zdGFuY2VVcmwscHJldmlvdXNJbnN0YW5jZVVybDp0Lmluc3RhbmNlVXJsfSksdGhpcy5hY3RpdmVSZWdpb249ZSx0aGlzLnJlc3RvcmVBbGxIYW5kbGVyKCk7Y29uc3Qgcj10aGlzLnN0YXR1cy5nZXRTdGF0dXMoKSxvPW4uY29ubmVjdGlvblN0YXR1cztzd2l0Y2gobyl7Y2FzZSJyZWFkeSI6dGhpcy5wcm94eUxvZ2dlci5pbmZvKCJBY3RpdmUgcmVnaW9uIGlzIHJlYWR5Iix7YWN0aXZlUmVnaW9uU3RhdHVzOm99KSx0aGlzLnN0YXR1cy51cGRhdGUoe3N0YXR1czoicmVhZHkiLGNvbm5lY3Rpb25JZDpuLmNvbm5lY3Rpb25JZH0pO2JyZWFrO2Nhc2UiY29ubmVjdGluZyI6Y2FzZSJpbml0aWFsaXppbmciOnIhPT1vJiZ0aGlzLnN0YXR1cy51cGRhdGUoe3N0YXR1czpvfSk7YnJlYWs7Y2FzZSJlcnJvciI6ciE9PW8mJnRoaXMuc3RhdHVzLnVwZGF0ZSh7c3RhdHVzOiJlcnJvciIscmVhc29uOiJuZXcgYWN0aXZlIHJlZ2lvbiBpbiBlcnJvciBvbiB0cmFuc2l0aW9uIixkZXRhaWxzOntyZWdpb246dGhpcy5hY3RpdmVSZWdpb259fSl9fX1nZXQgcHJveHlUeXBlKCl7cmV0dXJuImdsb2JhbC1yZXNpbGllbmN5LXByb3h5In1zZW5kT3JRdWV1ZU1lc3NhZ2VUb1N1YmplY3QoZSl7dGhpcy5yZWdpb25Qcm94aWVzW3RoaXMuYWN0aXZlUmVnaW9uXS5zZW5kT3JRdWV1ZU1lc3NhZ2VUb1N1YmplY3QoZSl9YWRkQ29udGV4dFRvTG9nZ2VyKCl7cmV0dXJue2FjdGl2ZVJlZ2lvbjp0aGlzLmFjdGl2ZVJlZ2lvbn19c2VuZE1lc3NhZ2VUb1N1YmplY3QoZSl7dGhpcy5yZWdpb25Qcm94aWVzW3RoaXMuYWN0aXZlUmVnaW9uXS5zZW5kT3JRdWV1ZU1lc3NhZ2VUb1N1YmplY3QoZSl9Z2V0VXBzdHJlYW1NZXNzYWdlT3JpZ2luKCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7X3R5cGU6Imdsb2JhbC1yZXNpbGllbmN5LXN0cmVhbXMtc2l0ZSIscHJvdmlkZXJJZDp0aGlzLnByb3ZpZGVyLmlkfSxsKCkpLHthY3RpdmVSZWdpb246dGhpcy5hY3RpdmVSZWdpb259KX1hZGRDaGlsZElmcmFtZUNoYW5uZWwoZSl7dGhpcy5yZWdpb25Qcm94aWVzW3RoaXMuYWN0aXZlUmVnaW9uXS5hZGRDaGlsZElmcmFtZUNoYW5uZWwoZSl9YWRkQ2hpbGRDb21wb25lbnRDaGFubmVsKGUpe3RoaXMucmVnaW9uUHJveGllc1t0aGlzLmFjdGl2ZVJlZ2lvbl0uYWRkQ2hpbGRDb21wb25lbnRDaGFubmVsKGUpfXVwZGF0ZUNoaWxkSWZyYW1lQ2hhbm5lbFBvcnQoZSl7dGhpcy5yZWdpb25Qcm94aWVzW3RoaXMuYWN0aXZlUmVnaW9uXS51cGRhdGVDaGlsZElmcmFtZUNoYW5uZWxQb3J0KGUpfX1jbGFzcyBVIGV4dGVuZHMgTHtjb25zdHJ1Y3RvcihlKXtzdXBlcih7Y29uZmlnOmUscHJveHlGYWN0b3J5OmU9Pm5ldyBNKGUpfSl9c3RhdGljIGluaXQoZSl7Y29uc3QgdD1uZXcgVShlKTtyZXR1cm4gVS5pbml0aWFsaXplUHJvdmlkZXIodCkse3Byb3ZpZGVyOnR9fXN0YXRpYyBnZXQgZGVmYXVsdCgpe3JldHVybiBvKCJBbWF6b25Db25uZWN0R1JTdHJlYW1zU2l0ZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQiKX1zZXRDQ1BJZnJhbWUoZSl7dGhpcy5nZXRQcm94eSgpLnNldENDUElmcmFtZShlKX1zZXRBY3RpdmVSZWdpb24oZSl7dGhpcy5nZXRQcm94eSgpLnNldEFjdGl2ZVJlZ2lvbihlKX19fSw4MjU6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dCx0LmFnZW50QXBwPXt9O3ZhciBuPXtDQ1A6ImNjcCIsR1VJREVTOiJjdXN0b212aWV3cyJ9O3QuYWdlbnRBcHAuaW5pdENDUD10LmNvcmUuaW5pdENDUCx0LmFnZW50QXBwLmlzSW5pdGlhbGl6ZWQ9ZnVuY3Rpb24oZSl7fSx0LmFnZW50QXBwLmluaXRBcHBDb21tdW5pY2F0aW9uPWZ1bmN0aW9uKGUsbil7dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSksbz1uZXcgdC5JRnJhbWVDb25kdWl0KG4sd2luZG93LHIpLGk9W3QuQWdlbnRFdmVudHMuVVBEQVRFLHQuQ29udGFjdEV2ZW50cy5WSUVXLHQuRXZlbnRUeXBlLkFDS05PV0xFREdFLHQuRXZlbnRUeXBlLlRFUk1JTkFURUQsdC5UYXNrRXZlbnRzLkNSRUFURUQsdC5FbWFpbEV2ZW50cy5DUkVBVEVEXTtyLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbihlKXtpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0oZSwoZnVuY3Rpb24odCl7by5zZW5kVXBzdHJlYW0oZSx0KX0pKX0pKX0pKX07dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pbmRleE9mKCJjY3AtdjIiKTtyZXR1cm4gZS5zbGljZSgwLHQtMSl9LG89ZnVuY3Rpb24oZSxyLG8pe3ZhciBhLHMsYyx1PW8uY3VzdG9tVmlld3NQYXJhbXMsbD11LmNvbnRhY3QscD11LmRpc2FibGVBdXRvRGVzdHJveSxkPXUuaWZyYW1lU3VmZml4LGg9dS50ZXJtaW5hdGVDdXN0b21WaWV3T3B0aW9ucyxmPXZvaWQgMD09PWg/e306aCxnPXUuZGVkdXBsaWNhdGUsbT12b2lkIDA9PT1nfHxnLHY9by5jdXN0b21WaWV3c1BhcmFtcy5jb250YWN0Rmxvd0lkLHk9aShsKTtjPWZ1bmN0aW9uKG8pe28mJihzPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4gZS50b1NuYXBzaG90KCkuY29udGFjdERhdGEuc3RhdGUudHlwZX1jYXRjaChlKXtyZXR1cm4gdm9pZCBjb25zb2xlLndhcm4oIltDdXN0b21WaWV3c10gRmFpbGVkIHRvIGV4dHJhY3QgY29udGFjdCBzdGF0dXMuIil9fShvKSx5PWkobyksYT1mdW5jdGlvbihlKXt0cnl7dmFyIHQ9ZS50b1NuYXBzaG90KCkuY29udGFjdERhdGEuY29ubmVjdGlvbnMuZmluZCgoZnVuY3Rpb24oZSl7cmV0dXJuImFnZW50Ij09PWUudHlwZX0pKTtyZXR1cm4gbnVsbD09dD92b2lkIDA6dC5jb25uZWN0aW9uSWR9Y2F0Y2goZSl7cmV0dXJuIHZvaWQgY29uc29sZS53YXJuKCJbQ3VzdG9tVmlld3NdIEZhaWxlZCB0byBleHRyYWN0IGFnZW50Q29ubmVjdGlvbklkLiIpfX0obyksYSYmY29uc29sZS5kZWJ1ZygiW0N1c3RvbVZpZXdzXSBBZ2VudCBjb25uZWN0aW9uIElEIGRlcml2ZWQgZnJvbSBjb250YWN0IG9iamVjdCIpLGZ1bmN0aW9uKG4pe3B8fChuLm9uRGVzdHJveSgoZnVuY3Rpb24oKXt2YXIgbixyLG87dC5jb3JlLnRlcm1pbmF0ZUN1c3RvbVZpZXcoZSxkLHt0aW1lb3V0Om51bGwhPT0obj1mLnRpbWVvdXQpJiZ2b2lkIDAhPT1uP246NWUzLGhpZGVJZnJhbWU6bnVsbD09PShyPWYuaGlkZUlmcmFtZSl8fHZvaWQgMD09PXJ8fHIscmVzb2x2ZUlmcmFtZTpudWxsPT09KG89Zi5yZXNvbHZlSWZyYW1lKXx8dm9pZCAwPT09b3x8b30pfSkpLGNvbnNvbGUuZGVidWcoIltDdXN0b21WaWV3c10gb25EZXN0cm95IGhhbmRsZXIgcmVnaXN0ZXJlZC4iKSl9KG8pKSxmdW5jdGlvbih0LG8saSl7dmFyIGEscz1kPyIiLmNvbmNhdChuLkdVSURFUykuY29uY2F0KGQpOm4uR1VJREVTLGM9KG51bGw9PXI/dm9pZCAwOnIucXVlcnlTZWxlY3RvcigiaWZyYW1lW2lkPSciLmNvbmNhdChzLCInXSIpKSl8fGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHMpfHwobnVsbD09PShhPXdpbmRvdy50b3ApfHx2b2lkIDA9PT1hP3ZvaWQgMDphLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHMpKTtpZighYyl0aHJvdyBuZXcgRXJyb3IoIltDdXN0b21WaWV3c10gSWZyYW1lIG5vdCBmb3VuZCBmb3IgYXBwOiAiLmNvbmNhdChzKSk7dmFyIHU9QVdTLnV0aWwudXVpZC52NCgpLGw9bmV3IFVSTFNlYXJjaFBhcmFtcyh7YWdlbnRBcHBUYWJJZDoiIi5jb25jYXQodSwiLXRhYiIpfSk7diYmbC5zZXQoImNvbnRhY3RGbG93SWQiLHYpLHQmJmwuc2V0KCJjdXJyZW50Q29udGFjdElkIix0KSxvJiZsLnNldCgiYWdlbnRDb25uZWN0aW9uSWQiLG8pO3ZhciBwPW0/aT9pLnRvVXBwZXJDYXNlKCk6IkRFRkFVTFQiOiJBREhPQyI7bC5zZXQoImR1cGxpY2F0ZUN1c3RvbVZpZXdzQXBwSWQiLHApLGMuc3JjPSIiLmNvbmNhdChlLCI/IikuY29uY2F0KGwudG9TdHJpbmcoKSksY29uc29sZS5kZWJ1ZygiW0N1c3RvbVZpZXdzXSBJZnJhbWUgc291cmNlIGluaXRpYWxpemVkIHdpdGggc3RhdGUgaWRlbnRpZmllcjogIixwKX0oeSxhLHMpfSwic3RyaW5nIj09dHlwZW9mIGw/KGNvbnNvbGUuZGVidWcoIltDdXN0b21WaWV3c10gUmVzb2x2aW5nIGNvbnRhY3QgSUQgc3RyaW5nLi4uIiksdC5hZ2VudCgoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRDb250YWN0cygpLmZpbmQoKGZ1bmN0aW9uKGUpe3RyeXt2YXIgdDtyZXR1cm4obnVsbD09PSh0PWUuZ2V0Q29udGFjdElkKXx8dm9pZCAwPT09dD92b2lkIDA6dC5jYWxsKGUpKT09PWx9Y2F0Y2goZSl7cmV0dXJuITF9fSkpO3R8fGNvbnNvbGUud2FybigiW0N1c3RvbVZpZXdzXSBVbmFibGUgdG8gcmVzb2x2ZSBjb250YWN0IElEIHRvIGxpdmUgY29udGFjdCBvYmplY3QuIiksYyh0KX0pKSk6YyhsKX0saT1mdW5jdGlvbihlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIGU7dHJ5e3JldHVybiBlLmdldENvbnRhY3RJZCgpfWNhdGNoKHQpe3JldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIltDdXN0b21WaWV3c106IEludmFsaWQgQ29udGFjdCBQcm92aWRlZDogIixlKX19O3QuYWdlbnRBcHAuaW5pdEFwcD1mdW5jdGlvbihlLGksYSxzKXtzPXN8fHt9O3ZhciBjLHU9YS5lbmRzV2l0aCgiLyIpfHwvWz8mXT9bXj0/Jl0rPVtePT8mXSsvZy50ZXN0KGEpP2E6YSsiLyIsbD1zLm9uTG9hZD9zLm9uTG9hZDpudWxsLHA9e2VuZHBvaW50OnUsc3R5bGU6cy5zdHlsZSxvbkxvYWQ6bH07aWYoZT09PW4uQ0NQX0RSKWM9bi5DQ1A7ZWxzZSBpZihlPT09bi5HVUlERVMmJnMuY3VzdG9tVmlld3NQYXJhbXMpe3ZhciBkPXMuY3VzdG9tVmlld3NQYXJhbXMuaWZyYW1lU3VmZml4O2lmKGM9ZD8iIi5jb25jYXQobi5HVUlERVMpLmNvbmNhdChkKToiIi5jb25jYXQobi5HVUlERVMpLHZvaWQgMCE9PXQuYWdlbnRBcHAuQXBwUmVnaXN0cnkuZ2V0KGMpKXRocm93IG5ldyBFcnJvcigiW0N1c3RvbVZpZXdzXTogQ3VzdG9tIHZpZXdzIGFwcGxpY2F0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4gUGxlYXNlIHByb3ZpZGUgYSBkaWZmZXJlbnQgaWZyYW1lU3VmZml4IGZvciB0aGUgY3VzdG9tIHZpZXdzIGFwcGxpY2F0aW9uLiIpfWVsc2UgYz1lO3ZhciBoPSJzdHJpbmciPT10eXBlb2YgaT9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKTppO3QuYWdlbnRBcHAuQXBwUmVnaXN0cnkucmVnaXN0ZXIoYyxwLGgpLHQuYWdlbnRBcHAuQXBwUmVnaXN0cnkuc3RhcnQoYywoZnVuY3Rpb24oaSl7dmFyIGE9aS5lbmRwb2ludCx1PWkuY29udGFpbmVyRE9NO3JldHVybntpbml0OmZ1bmN0aW9uKCl7c3dpdGNoKGUpe2Nhc2Ugbi5DQ1A6cmV0dXJuIHMuY2NwUGFyYW1zPXMuY2NwUGFyYW1zP3MuY2NwUGFyYW1zOnt9LHMuc3R5bGUmJihzLmNjcFBhcmFtcy5zdHlsZT1zLnN0eWxlKSxmdW5jdGlvbihlLG4sbyl7dmFyIGk9e2NjcFVybDplLGNjcExvYWRUaW1lb3V0OjFlNCxsb2dpblBvcHVwOiEwLGxvZ2luVXJsOnIoZSkrIi9sb2dpbiIsc29mdHBob25lOnthbGxvd0ZyYW1lZFNvZnRwaG9uZTohMCxkaXNhYmxlUmluZ3RvbmU6ITEsYWxsb3dGcmFtZWRWaWRlb0NhbGw6ITAsYWxsb3dGcmFtZWRTY3JlZW5TaGFyaW5nOiEwLGFsbG93RnJhbWVkU2NyZWVuU2hhcmluZ1BvcFVwOiExfX0sYT10Lm1lcmdlKGksby5jY3BQYXJhbXMpO3QuY29yZS5pbml0Q0NQKG4sYSl9KGEsdSxzKTtjYXNlIG4uR1VJREVTOnJldHVybiB2b2lkIDAhPT1zLmN1c3RvbVZpZXdzUGFyYW1zPyh0LmFnZW50QXBwLmluaXRBcHBDb21tdW5pY2F0aW9uKGMsYSx1KSxvKGEsdSxzKSk6dC5hZ2VudEFwcC5pbml0QXBwQ29tbXVuaWNhdGlvbihjLGEsdSk7ZGVmYXVsdDpyZXR1cm4gdC5hZ2VudEFwcC5pbml0QXBwQ29tbXVuaWNhdGlvbihjLGEsdSl9fSxkZXN0cm95OmZ1bmN0aW9uKCl7c3dpdGNoKGUpe2Nhc2Ugbi5DQ1A6cmV0dXJuIGk9cihhKSsiL2xvZ291dCIsdC5mZXRjaChpLHtjcmVkZW50aWFsczoiaW5jbHVkZSJ9KS50aGVuKChmdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLlRFUk1JTkFURSksITB9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3JldHVybiB0LmdldExvZygpLmVycm9yKCJBbiBl