Skip to content

Instantly share code, notes, and snippets.

@Kocal
Created January 25, 2021 20:43
Show Gist options
  • Save Kocal/c055a9ea3fcbc4df1d99c86270af4ca9 to your computer and use it in GitHub Desktop.
Save Kocal/c055a9ea3fcbc4df1d99c86270af4ca9 to your computer and use it in GitHub Desktop.
link of the source-map-analyzer (https://github.com/Kocal/vue-web-extension/issues/658)
http://sokra.github.io/source-map-visualization/#base64,KGZ1bmN0aW9uKGUpe3ZhciByPXt9O2Z1bmN0aW9uIHQobil7aWYocltuXSlyZXR1cm4gcltuXS5leHBvcnRzO3ZhciBvPXJbbl09e2k6bixsOiExLGV4cG9ydHM6e319O3JldHVybiBlW25dLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLHQpLG8ubD0hMCxvLmV4cG9ydHN9dC5tPWUsdC5jPXIsdC5kPWZ1bmN0aW9uKGUscixuKXt0Lm8oZSxyKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGUscix7ZW51bWVyYWJsZTohMCxnZXQ6bn0pfSx0LnI9ZnVuY3Rpb24oZSl7InVuZGVmaW5lZCIhPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9LHQudD1mdW5jdGlvbihlLHIpe2lmKDEmciYmKGU9dChlKSksOCZyKXJldHVybiBlO2lmKDQmciYmIm9iamVjdCI9PT10eXBlb2YgZSYmZSYmZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCk7aWYodC5yKG4pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJkZWZhdWx0Iix7ZW51bWVyYWJsZTohMCx2YWx1ZTplfSksMiZyJiYic3RyaW5nIiE9dHlwZW9mIGUpZm9yKHZhciBvIGluIGUpdC5kKG4sbyxmdW5jdGlvbihyKXtyZXR1cm4gZVtyXX0uYmluZChudWxsLG8pKTtyZXR1cm4gbn0sdC5uPWZ1bmN0aW9uKGUpe3ZhciByPWUmJmUuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiBlWyJkZWZhdWx0Il19OmZ1bmN0aW9uKCl7cmV0dXJuIGV9O3JldHVybiB0LmQociwiYSIscikscn0sdC5vPWZ1bmN0aW9uKGUscil7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpfSx0LnA9Ii8iLHQodC5zPTEpfSkoeyIwMGVlIjpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiYjYyMiIpLG89bigidG9TdHJpbmdUYWciKSxpPXt9O2lbb109InoiLGUuZXhwb3J0cz0iW29iamVjdCB6XSI9PT1TdHJpbmcoaSl9LCIwMzY2IjpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiMWMwYiIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHIsdCl7aWYobihlKSx2b2lkIDA9PT1yKXJldHVybiBlO3N3aXRjaCh0KXtjYXNlIDA6cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuY2FsbChyKX07Y2FzZSAxOnJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5jYWxsKHIsdCl9O2Nhc2UgMjpyZXR1cm4gZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5jYWxsKHIsdCxuKX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbih0LG4sbyl7cmV0dXJuIGUuY2FsbChyLHQsbixvKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkocixhcmd1bWVudHMpfX19LCIwNmNmIjpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiODNhYiIpLG89dCgiZDFlNyIpLGk9dCgiNWM2YyIpLGE9dCgiZmM2YSIpLHM9dCgiYzA0ZSIpLGM9dCgiNTEzNSIpLHU9dCgiMGNmYiIpLGY9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtyLmY9bj9mOmZ1bmN0aW9uKGUscil7aWYoZT1hKGUpLHI9cyhyLCEwKSx1KXRyeXtyZXR1cm4gZihlLHIpfWNhdGNoKHQpe31pZihjKGUscikpcmV0dXJuIGkoIW8uZi5jYWxsKGUsciksZVtyXSl9fSwiMGNmYiI6ZnVuY3Rpb24oZSxyLHQpe3ZhciBuPXQoIjgzYWIiKSxvPXQoImQwMzkiKSxpPXQoImNjMTIiKTtlLmV4cG9ydHM9IW4mJiFvKChmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoaSgiZGl2IiksImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSkpfSwxOmZ1bmN0aW9uKGUscix0KXtlLmV4cG9ydHM9dCgiZmU3NyIpfSwiMTlhYSI6ZnVuY3Rpb24oZSxyKXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSxyLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHIpKXRocm93IFR5cGVFcnJvcigiSW5jb3JyZWN0ICIrKHQ/dCsiICI6IiIpKyJpbnZvY2F0aW9uIik7cmV0dXJuIGV9fSwiMWJlNCI6ZnVuY3Rpb24oZSxyLHQpe3ZhciBuPXQoImQwNjYiKTtlLmV4cG9ydHM9bigiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiKX0sIjFjMGIiOmZ1bmN0aW9uKGUscil7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IFR5cGVFcnJvcihTdHJpbmcoZSkrIiBpcyBub3QgYSBmdW5jdGlvbiIpO3JldHVybiBlfX0sIjFjN2UiOmZ1bmN0aW9uKGUscix0KXt2YXIgbj10KCJiNjIyIiksbz1uKCJpdGVyYXRvciIpLGk9ITE7dHJ5e3ZhciBhPTAscz17bmV4dDpmdW5jdGlvbigpe3JldHVybntkb25lOiEhYSsrfX0scmV0dXJuOmZ1bmN0aW9uKCl7aT0hMH19O3Nbb109ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sQXJyYXkuZnJvbShzLChmdW5jdGlvbigpe3Rocm93IDJ9KSl9Y2F0Y2goYyl7fWUuZXhwb3J0cz1mdW5jdGlvbihlLHIpe2lmKCFyJiYhaSlyZXR1cm4hMTt2YXIgdD0hMTt0cnl7dmFyIG49e307bltvXT1mdW5jdGlvbigpe3JldHVybntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6dD0hMH19fX0sZShuKX1jYXRjaChjKXt9cmV0dXJuIHR9fSwiMWNkYyI6ZnVuY3Rpb24oZSxyLHQpe3ZhciBuPXQoIjM0MmYiKTtlLmV4cG9ydHM9LyhpcGhvbmV8aXBvZHxpcGFkKS4qYXBwbGV3ZWJraXQvaS50ZXN0KG4pfSwiMWQ4MCI6ZnVuY3Rpb24oZSxyKXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYodm9pZCAwPT1lKXRocm93IFR5cGVFcnJvcigiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIitlKTtyZXR1cm4gZX19LDIyNjY6ZnVuY3Rpb24oZSxyLHQpe3ZhciBuPXQoIjgyNWEiKSxvPXQoImU5NWEiKSxpPXQoIjUwYzQiKSxhPXQoIjAzNjYiKSxzPXQoIjM1YTEiKSxjPXQoIjJhNjIiKSx1PWZ1bmN0aW9uKGUscil7dGhpcy5zdG9wcGVkPWUsdGhpcy5yZXN1bHQ9cn07ZS5leHBvcnRzPWZ1bmN0aW9uKGUscix0KXt2YXIgZixnLGwsbSxwLGQsQSx2PXQmJnQudGhhdCx4PSEoIXR8fCF0LkFTX0VOVFJJRVMpLGI9ISghdHx8IXQuSVNfSVRFUkFUT1IpLGg9ISghdHx8IXQuSU5URVJSVVBURUQpLHk9YShyLHYsMSt4K2gpLHc9ZnVuY3Rpb24oZSl7cmV0dXJuIGYmJmMoZiksbmV3IHUoITAsZSl9LGo9ZnVuY3Rpb24oZSl7cmV0dXJuIHg/KG4oZSksaD95KGVbMF0sZVsxXSx3KTp5KGVbMF0sZVsxXSkpOmg/eShlLHcpOnkoZSl9O2lmKGIpZj1lO2Vsc2V7aWYoZz1zKGUpLCJmdW5jdGlvbiIhPXR5cGVvZiBnKXRocm93IFR5cGVFcnJvcigiVGFyZ2V0IGlzIG5vdCBpdGVyYWJsZSIpO2lmKG8oZykpe2ZvcihsPTAsbT1pKGUubGVuZ3RoKTttPmw7bCsrKWlmKHA9aihlW2xdKSxwJiZwIGluc3RhbmNlb2YgdSlyZXR1cm4gcDtyZXR1cm4gbmV3IHUoITEpfWY9Zy5jYWxsKGUpfWQ9Zi5uZXh0O3doaWxlKCEoQT1kLmNhbGwoZikpLmRvbmUpe3RyeXtwPWooQS52YWx1ZSl9Y2F0Y2goTyl7dGhyb3cgYyhmKSxPfWlmKCJvYmplY3QiPT10eXBlb2YgcCYmcCYmcCBpbnN0YW5jZW9mIHUpcmV0dXJuIHB9cmV0dXJuIG5ldyB1KCExKX19LCIyM2NiIjpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiYTY5MSIpLG89TWF0aC5tYXgsaT1NYXRoLm1pbjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSxyKXt2YXIgdD1uKGUpO3JldHVybiB0PDA/byh0K3IsMCk6aSh0LHIpfX0sIjIzZTciOmZ1bmN0aW9uKGUscix0KXt2YXIgbj10KCJkYTg0Iiksbz10KCIwNmNmIikuZixpPXQoIjkxMTIiKSxhPXQoIjZlZWIiKSxzPXQoImNlNGUiKSxjPXQoImU4OTMiKSx1PXQoIjk0Y2EiKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSxyKXt2YXIgdCxmLGcsbCxtLHAsZD1lLnRhcmdldCxBPWUuZ2xvYmFsLHY9ZS5zdGF0O2lmKGY9QT9uOnY/bltkXXx8cyhkLHt9KToobltkXXx8e30pLnByb3RvdHlwZSxmKWZvcihnIGluIHIpe2lmKG09cltnXSxlLm5vVGFyZ2V0R2V0PyhwPW8oZixnKSxsPXAmJnAudmFsdWUpOmw9ZltnXSx0PXUoQT9nOmQrKHY/Ii4iOiIjIikrZyxlLmZvcmNlZCksIXQmJnZvaWQgMCE9PWwpe2lmKHR5cGVvZiBtPT09dHlwZW9mIGwpY29udGludWU7YyhtLGwpfShlLnNoYW18fGwmJmwuc2hhbSkmJmkobSwic2hhbSIsITApLGEoZixnLG0sZSl9fX0sIjI0MWMiOmZ1bmN0aW9uKGUscix0KXt2YXIgbj10KCJjYTg0Iiksbz10KCI3ODM5IiksaT1vLmNvbmNhdCgibGVuZ3RoIiwicHJvdG90eXBlIik7ci5mPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzfHxmdW5jdGlvbihlKXtyZXR1cm4gbihlLGkpfX0sMjYyNjpmdW5jdGlvbihlLHIsdCl7InVzZSBzdHJpY3QiO3ZhciBuPXQoImQwNjYiKSxvPXQoIjliZjIiKSxpPXQoImI2MjIiKSxhPXQoIjgzYWIiKSxzPWkoInNwZWNpZXMiKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHI9bihlKSx0PW8uZjthJiZyJiYhcltzXSYmdChyLHMse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319KX19LCIyYTYyIjpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiODI1YSIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgcj1lWyJyZXR1cm4iXTtpZih2b2lkIDAhPT1yKXJldHVybiBuKHIuY2FsbChlKSkudmFsdWV9fSwiMmNmNCI6ZnVuY3Rpb24oZSxyLHQpe3ZhciBuLG8saSxhPXQoImRhODQiKSxzPXQoImQwMzkiKSxjPXQoIjAzNjYiKSx1PXQoIjFiZTQiKSxmPXQoImNjMTIiKSxnPXQoIjFjZGMiKSxsPXQoIjYwNWQiKSxtPWEubG9jYXRpb24scD1hLnNldEltbWVkaWF0ZSxkPWEuY2xlYXJJbW1lZGlhdGUsQT1hLnByb2Nlc3Msdj1hLk1lc3NhZ2VDaGFubmVsLHg9YS5EaXNwYXRjaCxiPTAsaD17fSx5PSJvbnJlYWR5c3RhdGVjaGFuZ2UiLHc9ZnVuY3Rpb24oZSl7aWYoaC5oYXNPd25Qcm9wZXJ0eShlKSl7dmFyIHI9aFtlXTtkZWxldGUgaFtlXSxyKCl9fSxqPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3coZSl9fSxPPWZ1bmN0aW9uKGUpe3coZS5kYXRhKX0saz1mdW5jdGlvbihlKXthLnBvc3RNZXNzYWdlKGUrIiIsbS5wcm90b2NvbCsiLy8iK20uaG9zdCl9O3AmJmR8fChwPWZ1bmN0aW9uKGUpe3ZhciByPVtdLHQ9MTt3aGlsZShhcmd1bWVudHMubGVuZ3RoPnQpci5wdXNoKGFyZ3VtZW50c1t0KytdKTtyZXR1cm4gaFsrK2JdPWZ1bmN0aW9uKCl7KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6RnVuY3Rpb24oZSkpLmFwcGx5KHZvaWQgMCxyKX0sbihiKSxifSxkPWZ1bmN0aW9uKGUpe2RlbGV0ZSBoW2VdfSxsP249ZnVuY3Rpb24oZSl7QS5uZXh0VGljayhqKGUpKX06eCYmeC5ub3c/bj1mdW5jdGlvbihlKXt4Lm5vdyhqKGUpKX06diYmIWc/KG89bmV3IHYsaT1vLnBvcnQyLG8ucG9ydDEub25tZXNzYWdlPU8sbj1jKGkucG9zdE1lc3NhZ2UsaSwxKSk6YS5hZGRFdmVudExpc3RlbmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgcG9zdE1lc3NhZ2UmJiFhLmltcG9ydFNjcmlwdHMmJm0mJiJmaWxlOiIhPT1tLnByb3RvY29sJiYhcyhrKT8obj1rLGEuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsTywhMSkpOm49eSBpbiBmKCJzY3JpcHQiKT9mdW5jdGlvbihlKXt1LmFwcGVuZENoaWxkKGYoInNjcmlwdCIpKVt5XT1mdW5jdGlvbigpe3UucmVtb3ZlQ2hpbGQodGhpcyksdyhlKX19OmZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoaihlKSwwKX0pLGUuZXhwb3J0cz17c2V0OnAsY2xlYXI6ZH19LCIyZDAwIjpmdW5jdGlvbihlLHIsdCl7dmFyIG4sbyxpPXQoImRhODQiKSxhPXQoIjM0MmYiKSxzPWkucHJvY2VzcyxjPXMmJnMudmVyc2lvbnMsdT1jJiZjLnY4O3U/KG49dS5zcGxpdCgiLiIpLG89blswXStuWzFdKTphJiYobj1hLm1hdGNoKC9FZGdlXC8oXGQrKS8pLCghbnx8blsxXT49NzQpJiYobj1hLm1hdGNoKC9DaHJvbWVcLyhcZCspLyksbiYmKG89blsxXSkpKSxlLmV4cG9ydHM9byYmK299LCIzNDJmIjpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiZDA2NiIpO2UuZXhwb3J0cz1uKCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiKXx8IiJ9LCIzNWExIjpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiZjVkZiIpLG89dCgiM2Y4YyIpLGk9dCgiYjYyMiIpLGE9aSgiaXRlcmF0b3IiKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYodm9pZCAwIT1lKXJldHVybiBlW2FdfHxlWyJAQGl0ZXJhdG9yIl18fG9bbihlKV19fSwiMzdlOCI6ZnVuY3Rpb24oZSxyLHQpe3ZhciBuPXQoIjgzYWIiKSxvPXQoIjliZjIiKSxpPXQoIjgyNWEiKSxhPXQoImRmNzUiKTtlLmV4cG9ydHM9bj9PYmplY3QuZGVmaW5lUHJvcGVydGllczpmdW5jdGlvbihlLHIpe2koZSk7dmFyIHQsbj1hKHIpLHM9bi5sZW5ndGgsYz0wO3doaWxlKHM+YylvLmYoZSx0PW5bYysrXSxyW3RdKTtyZXR1cm4gZX19LCIzYmJlIjpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiODYxZCIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZighbihlKSYmbnVsbCE9PWUpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBzZXQgIitTdHJpbmcoZSkrIiBhcyBhIHByb3RvdHlwZSIpO3JldHVybiBlfX0sIjNmOGMiOmZ1bmN0aW9uKGUscil7ZS5leHBvcnRzPXt9fSwiNDI4ZiI6ZnVuY3Rpb24oZSxyLHQpe3ZhciBuPXQoImRhODQiKTtlLmV4cG9ydHM9bn0sIjQ0YWQiOmZ1bmN0aW9uKGUscix0KXt2YXIgbj10KCJkMDM5Iiksbz10KCJjNmI2IiksaT0iIi5zcGxpdDtlLmV4cG9ydHM9bigoZnVuY3Rpb24oKXtyZXR1cm4hT2JqZWN0KCJ6IikucHJvcGVydHlJc0VudW1lcmFibGUoMCl9KSk/ZnVuY3Rpb24oZSl7cmV0dXJuIlN0cmluZyI9PW8oZSk/aS5jYWxsKGUsIiIpOk9iamVjdChlKX06T2JqZWN0fSwiNDRkMiI6ZnVuY3Rpb24oZSxyLHQpe3ZhciBuPXQoImI2MjIiKSxvPXQoIjdjNzMiKSxpPXQoIjliZjIiKSxhPW4oInVuc2NvcGFibGVzIikscz1BcnJheS5wcm90b3R5cGU7dm9pZCAwPT1zW2FdJiZpLmYocyxhLHtjb25maWd1cmFibGU6ITAsdmFsdWU6byhudWxsKX0pLGUuZXhwb3J0cz1mdW5jdGlvbihlKXtzW2FdW2VdPSEwfX0sIjQ0ZGUiOmZ1bmN0aW9uKGUscix0KXt2YXIgbj10KCJkYTg0Iik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUscil7dmFyIHQ9bi5jb25zb2xlO3QmJnQuZXJyb3ImJigxPT09YXJndW1lbnRzLmxlbmd0aD90LmVycm9yKGUpOnQuZXJyb3IoZSxyKSl9fSw0ODQwOmZ1bmN0aW9uKGUscix0KXt2YXIgbj10KCI4MjVhIiksbz10KCIxYzBiIiksaT10KCJiNjIyIiksYT1pKCJzcGVjaWVzIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUscil7dmFyIHQsaT1uKGUpLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT1pfHx2b2lkIDA9PSh0PW4oaSlbYV0pP3I6byh0KX19LDQ5MzA6ZnVuY3Rpb24oZSxyLHQpe3ZhciBuPXQoImQwMzkiKTtlLmV4cG9ydHM9ISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYhbigoZnVuY3Rpb24oKXtyZXR1cm4hU3RyaW5nKFN5bWJvbCgpKX0pKX0sIjRkNjQiOmZ1bmN0aW9uKGUscix0KXt2YXIgbj10KCJmYzZhIiksbz10KCI1MGM0IiksaT10KCIyM2NiIiksYT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24ocix0LGEpe3ZhciBzLGM9bihyKSx1PW8oYy5sZW5ndGgpLGY9aShhLHUpO2lmKGUmJnQhPXQpe3doaWxlKHU+ZilpZihzPWNbZisrXSxzIT1zKXJldHVybiEwfWVsc2UgZm9yKDt1PmY7ZisrKWlmKChlfHxmIGluIGMpJiZjW2ZdPT09dClyZXR1cm4gZXx8Znx8MDtyZXR1cm4hZSYmLTF9fTtlLmV4cG9ydHM9e2luY2x1ZGVzOmEoITApLGluZGV4T2Y6YSghMSl9fSwiNTBjNCI6ZnVuY3Rpb24oZSxyLHQpe3ZhciBuPXQoImE2OTEiKSxvPU1hdGgubWluO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gZT4wP28obihlKSw5MDA3MTk5MjU0NzQwOTkxKTowfX0sNTEzNTpmdW5jdGlvbihlLHIpe3ZhciB0PXt9Lmhhc093blByb3BlcnR5O2UuZXhwb3J0cz1mdW5jdGlvbihlLHIpe3JldHVybiB0LmNhbGwoZSxyKX19LDU2OTI6ZnVuY3Rpb24oZSxyLHQpe3ZhciBuPXQoImM0MzAiKSxvPXQoImM2Y2QiKTsoZS5leHBvcnRzPWZ1bmN0aW9uKGUscil7cmV0dXJuIG9bZV18fChvW2VdPXZvaWQgMCE9PXI/cjp7fSl9KSgidmVyc2lvbnMiLFtdKS5wdXNoKHt2ZXJzaW9uOiIzLjguMyIsbW9kZTpuPyJwdXJlIjoiZ2xvYmFsIixjb3B5cmlnaHQ6IsKpIDIwMjEgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSkifSl9LCI1NmVmIjpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiZDA2NiIpLG89dCgiMjQxYyIpLGk9dCgiNzQxOCIpLGE9dCgiODI1YSIpO2UuZXhwb3J0cz1uKCJSZWZsZWN0Iiwib3duS2V5cyIpfHxmdW5jdGlvbihlKXt2YXIgcj1vLmYoYShlKSksdD1pLmY7cmV0dXJuIHQ/ci5jb25jYXQodChlKSk6cn19LCI1YzZjIjpmdW5jdGlvbihlLHIpe2UuZXhwb3J0cz1mdW5jdGlvbihlLHIpe3JldHVybntlbnVtZXJhYmxlOiEoMSZlKSxjb25maWd1cmFibGU6ISgyJmUpLHdyaXRhYmxlOiEoNCZlKSx2YWx1ZTpyfX19LCI2MDVkIjpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiYzZiNiIpLG89dCgiZGE4NCIpO2UuZXhwb3J0cz0icHJvY2VzcyI9PW4oby5wcm9jZXNzKX0sIjYwZGEiOmZ1bmN0aW9uKGUscix0KXsidXNlIHN0cmljdCI7dmFyIG49dCgiODNhYiIpLG89dCgiZDAzOSIpLGk9dCgiZGY3NSIpLGE9dCgiNzQxOCIpLHM9dCgiZDFlNyIpLGM9dCgiN2IwYiIpLHU9dCgiNDRhZCIpLGY9T2JqZWN0LmFzc2lnbixnPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTtlLmV4cG9ydHM9IWZ8fG8oKGZ1bmN0aW9uKCl7aWYobiYmMSE9PWYoe2I6MX0sZihnKHt9LCJhIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtnKHRoaXMsImIiLHt2YWx1ZTozLGVudW1lcmFibGU6ITF9KX19KSx7YjoyfSkpLmIpcmV0dXJuITA7dmFyIGU9e30scj17fSx0PVN5bWJvbCgpLG89ImFiY2RlZmdoaWprbG1ub3BxcnN0IjtyZXR1cm4gZVt0XT03LG8uc3BsaXQoIiIpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JbZV09ZX0pKSw3IT1mKHt9LGUpW3RdfHxpKGYoe30scikpLmpvaW4oIiIpIT1vfSkpP2Z1bmN0aW9uKGUscil7dmFyIHQ9YyhlKSxvPWFyZ3VtZW50cy5sZW5ndGgsZj0xLGc9YS5mLGw9cy5mO3doaWxlKG8+Zil7dmFyIG0scD11KGFyZ3VtZW50c1tmKytdKSxkPWc/aShwKS5jb25jYXQoZyhwKSk6aShwKSxBPWQubGVuZ3RoLHY9MDt3aGlsZShBPnYpbT1kW3YrK10sbiYmIWwuY2FsbChwLG0pfHwodFttXT1wW21dKX1yZXR1cm4gdH06Zn0sIjY5ZjMiOmZ1bmN0aW9uKGUscix0KXt2YXIgbixvLGksYT10KCI3ZjlhIikscz10KCJkYTg0IiksYz10KCI4NjFkIiksdT10KCI5MTEyIiksZj10KCI1MTM1IiksZz10KCJjNmNkIiksbD10KCJmNzcyIiksbT10KCJkMDEyIikscD1zLldlYWtNYXAsZD1mdW5jdGlvbihlKXtyZXR1cm4gaShlKT9vKGUpOm4oZSx7fSl9LEE9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciB0O2lmKCFjKHIpfHwodD1vKHIpKS50eXBlIT09ZSl0aHJvdyBUeXBlRXJyb3IoIkluY29tcGF0aWJsZSByZWNlaXZlciwgIitlKyIgcmVxdWlyZWQiKTtyZXR1cm4gdH19O2lmKGEpe3ZhciB2PWcuc3RhdGV8fChnLnN0YXRlPW5ldyBwKSx4PXYuZ2V0LGI9di5oYXMsaD12LnNldDtuPWZ1bmN0aW9uKGUscil7cmV0dXJuIHIuZmFjYWRlPWUsaC5jYWxsKHYsZSxyKSxyfSxvPWZ1bmN0aW9uKGUpe3JldHVybiB4LmNhbGwodixlKXx8e319LGk9ZnVuY3Rpb24oZSl7cmV0dXJuIGIuY2FsbCh2LGUpfX1lbHNle3ZhciB5PWwoInN0YXRlIik7bVt5XT0hMCxuPWZ1bmN0aW9uKGUscil7cmV0dXJuIHIuZmFjYWRlPWUsdShlLHkscikscn0sbz1mdW5jdGlvbihlKXtyZXR1cm4gZihlLHkpP2VbeV06e319LGk9ZnVuY3Rpb24oZSl7cmV0dXJuIGYoZSx5KX19ZS5leHBvcnRzPXtzZXQ6bixnZXQ6byxoYXM6aSxlbmZvcmNlOmQsZ2V0dGVyRm9yOkF9fSwiNmVlYiI6ZnVuY3Rpb24oZSxyLHQpe3ZhciBuPXQoImRhODQiKSxvPXQoIjkxMTIiKSxpPXQoIjUxMzUiKSxhPXQoImNlNGUiKSxzPXQoIjg5MjUiKSxjPXQoIjY5ZjMiKSx1PWMuZ2V0LGY9Yy5lbmZvcmNlLGc9U3RyaW5nKFN0cmluZykuc3BsaXQoIlN0cmluZyIpOyhlLmV4cG9ydHM9ZnVuY3Rpb24oZSxyLHQscyl7dmFyIGMsdT0hIXMmJiEhcy51bnNhZmUsbD0hIXMmJiEhcy5lbnVtZXJhYmxlLG09ISFzJiYhIXMubm9UYXJnZXRHZXQ7ImZ1bmN0aW9uIj09dHlwZW9mIHQmJigic3RyaW5nIiE9dHlwZW9mIHJ8fGkodCwibmFtZSIpfHxvKHQsIm5hbWUiLHIpLGM9Zih0KSxjLnNvdXJjZXx8KGMuc291cmNlPWcuam9pbigic3RyaW5nIj09dHlwZW9mIHI/cjoiIikpKSxlIT09bj8odT8hbSYmZVtyXSYmKGw9ITApOmRlbGV0ZSBlW3JdLGw/ZVtyXT10Om8oZSxyLHQpKTpsP2Vbcl09dDphKHIsdCl9KShGdW5jdGlvbi5wcm90b3R5cGUsInRvU3RyaW5nIiwoZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdGhpcyYmdSh0aGlzKS5zb3VyY2V8fHModGhpcyl9KSl9LDc0MTg6ZnVuY3Rpb24oZSxyKXtyLmY9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc30sNzgzOTpmdW5jdGlvbihlLHIpe2UuZXhwb3J0cz1bImNvbnN0cnVjdG9yIiwiaGFzT3duUHJvcGVydHkiLCJpc1Byb3RvdHlwZU9mIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJ0b0xvY2FsZVN0cmluZyIsInRvU3RyaW5nIiwidmFsdWVPZiJdfSwiN2IwYiI6ZnVuY3Rpb24oZSxyLHQpe3ZhciBuPXQoIjFkODAiKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdChuKGUpKX19LCI3YzczIjpmdW5jdGlvbihlLHIsdCl7dmFyIG4sbz10KCI4MjVhIiksaT10KCIzN2U4IiksYT10KCI3ODM5Iikscz10KCJkMDEyIiksYz10KCIxYmU0IiksdT10KCJjYzEyIiksZj10KCJmNzcyIiksZz0iPiIsbD0iPCIsbT0icHJvdG90eXBlIixwPSJzY3JpcHQiLGQ9ZigiSUVfUFJPVE8iKSxBPWZ1bmN0aW9uKCl7fSx2PWZ1bmN0aW9uKGUpe3JldHVybiBsK3ArZytlK2wrIi8iK3ArZ30seD1mdW5jdGlvbihlKXtlLndyaXRlKHYoIiIpKSxlLmNsb3NlKCk7dmFyIHI9ZS5wYXJlbnRXaW5kb3cuT2JqZWN0O3JldHVybiBlPW51bGwscn0sYj1mdW5jdGlvbigpe3ZhciBlLHI9dSgiaWZyYW1lIiksdD0iamF2YSIrcCsiOiI7cmV0dXJuIHIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYy5hcHBlbmRDaGlsZChyKSxyLnNyYz1TdHJpbmcodCksZT1yLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQsZS5vcGVuKCksZS53cml0ZSh2KCJkb2N1bWVudC5GPU9iamVjdCIpKSxlLmNsb3NlKCksZS5GfSxoPWZ1bmN0aW9uKCl7dHJ5e249ZG9jdW1lbnQuZG9tYWluJiZuZXcgQWN0aXZlWE9iamVjdCgiaHRtbGZpbGUiKX1jYXRjaChyKXt9aD1uP3gobik6YigpO3ZhciBlPWEubGVuZ3RoO3doaWxlKGUtLSlkZWxldGUgaFttXVthW2VdXTtyZXR1cm4gaCgpfTtzW2RdPSEwLGUuZXhwb3J0cz1PYmplY3QuY3JlYXRlfHxmdW5jdGlvbihlLHIpe3ZhciB0O3JldHVybiBudWxsIT09ZT8oQVttXT1vKGUpLHQ9bmV3IEEsQVttXT1udWxsLHRbZF09ZSk6dD1oKCksdm9pZCAwPT09cj90OmkodCxyKX19LCI3ZGQwIjpmdW5jdGlvbihlLHIsdCl7InVzZSBzdHJpY3QiO3ZhciBuPXQoIjIzZTciKSxvPXQoIjllZDMiKSxpPXQoImUxNjMiKSxhPXQoImQyYmIiKSxzPXQoImQ0NGUiKSxjPXQoIjkxMTIiKSx1PXQoIjZlZWIiKSxmPXQoImI2MjIiKSxnPXQoImM0MzAiKSxsPXQoIjNmOGMiKSxtPXQoImFlOTMiKSxwPW0uSXRlcmF0b3JQcm90b3R5cGUsZD1tLkJVR0dZX1NBRkFSSV9JVEVSQVRPUlMsQT1mKCJpdGVyYXRvciIpLHY9ImtleXMiLHg9InZhbHVlcyIsYj0iZW50cmllcyIsaD1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSxyLHQsZixtLHksdyl7byh0LHIsZik7dmFyIGosTyxrLFA9ZnVuY3Rpb24oZSl7aWYoZT09PW0mJl8pcmV0dXJuIF87aWYoIWQmJmUgaW4gVClyZXR1cm4gVFtlXTtzd2l0Y2goZSl7Y2FzZSB2OnJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgdCh0aGlzLGUpfTtjYXNlIHg6cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0KHRoaXMsZSl9O2Nhc2UgYjpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQodGhpcyxlKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0KHRoaXMpfX0sUz1yKyIgSXRlcmF0b3IiLEU9ITEsVD1lLnByb3RvdHlwZSxDPVRbQV18fFRbIkBAaXRlcmF0b3IiXXx8bSYmVFttXSxfPSFkJiZDfHxQKG0pLEk9IkFycmF5Ij09ciYmVC5lbnRyaWVzfHxDO2lmKEkmJihqPWkoSS5jYWxsKG5ldyBlKSkscCE9PU9iamVjdC5wcm90b3R5cGUmJmoubmV4dCYmKGd8fGkoaik9PT1wfHwoYT9hKGoscCk6ImZ1bmN0aW9uIiE9dHlwZW9mIGpbQV0mJmMoaixBLGgpKSxzKGosUywhMCwhMCksZyYmKGxbU109aCkpKSxtPT14JiZDJiZDLm5hbWUhPT14JiYoRT0hMCxfPWZ1bmN0aW9uKCl7cmV0dXJuIEMuY2FsbCh0aGlzKX0pLGcmJiF3fHxUW0FdPT09X3x8YyhULEEsXyksbFtyXT1fLG0paWYoTz17dmFsdWVzOlAoeCksa2V5czp5P186UCh2KSxlbnRyaWVzOlAoYil9LHcpZm9yKGsgaW4gTykoZHx8RXx8IShrIGluIFQpKSYmdShULGssT1trXSk7ZWxzZSBuKHt0YXJnZXQ6cixwcm90bzohMCxmb3JjZWQ6ZHx8RX0sTyk7cmV0dXJuIE99fSwiN2Y5YSI6ZnVuY3Rpb24oZSxyLHQpe3ZhciBuPXQoImRhODQiKSxvPXQoIjg5MjUiKSxpPW4uV2Vha01hcDtlLmV4cG9ydHM9ImZ1bmN0aW9uIj09PXR5cGVvZiBpJiYvbmF0aXZlIGNvZGUvLnRlc3QobyhpKSl9LCI4MjVhIjpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiODYxZCIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZighbihlKSl0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKGUpKyIgaXMgbm90IGFuIG9iamVjdCIpO3JldHVybiBlfX0sIjgzYWIiOmZ1bmN0aW9uKGUscix0KXt2YXIgbj10KCJkMDM5Iik7ZS5leHBvcnRzPSFuKChmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sMSx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSlbMV19KSl9LCI4NjFkIjpmdW5jdGlvbihlLHIpe2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4ib2JqZWN0Ij09PXR5cGVvZiBlP251bGwhPT1lOiJmdW5jdGlvbiI9PT10eXBlb2YgZX19LDg5MjU6ZnVuY3Rpb24oZSxyLHQpe3ZhciBuPXQoImM2Y2QiKSxvPUZ1bmN0aW9uLnRvU3RyaW5nOyJmdW5jdGlvbiIhPXR5cGVvZiBuLmluc3BlY3RTb3VyY2UmJihuLmluc3BlY3RTb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIG8uY2FsbChlKX0pLGUuZXhwb3J0cz1uLmluc3BlY3RTb3VyY2V9LCI5MGUzIjpmdW5jdGlvbihlLHIpe3ZhciB0PTAsbj1NYXRoLnJhbmRvbSgpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4iU3ltYm9sKCIrU3RyaW5nKHZvaWQgMD09PWU/IiI6ZSkrIilfIisoKyt0K24pLnRvU3RyaW5nKDM2KX19LDkxMTI6ZnVuY3Rpb24oZSxyLHQpe3ZhciBuPXQoIjgzYWIiKSxvPXQoIjliZjIiKSxpPXQoIjVjNmMiKTtlLmV4cG9ydHM9bj9mdW5jdGlvbihlLHIsdCl7cmV0dXJuIG8uZihlLHIsaSgxLHQpKX06ZnVuY3Rpb24oZSxyLHQpe3JldHVybiBlW3JdPXQsZX19LCI5NGNhIjpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiZDAzOSIpLG89LyN8XC5wcm90b3R5cGVcLi8saT1mdW5jdGlvbihlLHIpe3ZhciB0PXNbYShlKV07cmV0dXJuIHQ9PXV8fHQhPWMmJigiZnVuY3Rpb24iPT10eXBlb2Ygcj9uKHIpOiEhcil9LGE9aS5ub3JtYWxpemU9ZnVuY3Rpb24oZSl7cmV0dXJuIFN0cmluZyhlKS5yZXBsYWNlKG8sIi4iKS50b0xvd2VyQ2FzZSgpfSxzPWkuZGF0YT17fSxjPWkuTkFUSVZFPSJOIix1PWkuUE9MWUZJTEw9IlAiO2UuZXhwb3J0cz1pfSw5ODQ1OmZ1bmN0aW9uKGUscix0KXt2YXIgbixvLGksYT12b2lkIDA7KGZ1bmN0aW9uKHQsYSl7bz1bZV0sbj1hLGk9ImZ1bmN0aW9uIj09PXR5cGVvZiBuP24uYXBwbHkocixvKTpuLHZvaWQgMD09PWl8fChlLmV4cG9ydHM9aSl9KSgwLChmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7aWYoInVuZGVmaW5lZCI9PT10eXBlb2YgYXx8T2JqZWN0LmdldFByb3RvdHlwZU9mKGEpIT09T2JqZWN0LnByb3RvdHlwZSl7Y29uc3Qgcj0iVGhlIG1lc3NhZ2UgcG9ydCBjbG9zZWQgYmVmb3JlIGEgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkLiIsdD0iUmV0dXJuaW5nIGEgUHJvbWlzZSBpcyB0aGUgcHJlZmVycmVkIHdheSB0byBzZW5kIGEgcmVwbHkgZnJvbSBhbiBvbk1lc3NhZ2Uvb25NZXNzYWdlRXh0ZXJuYWwgbGlzdGVuZXIsIGFzIHRoZSBzZW5kUmVzcG9uc2Ugd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIHNwZWNzIChTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9Nb3ppbGxhL0FkZC1vbnMvV2ViRXh0ZW5zaW9ucy9BUEkvcnVudGltZS9vbk1lc3NhZ2UpIixuPWU9Pntjb25zdCBuPXthbGFybXM6e2NsZWFyOnttaW5BcmdzOjAsbWF4QXJnczoxfSxjbGVhckFsbDp7bWluQXJnczowLG1heEFyZ3M6MH0sZ2V0OnttaW5BcmdzOjAsbWF4QXJnczoxfSxnZXRBbGw6e21pbkFyZ3M6MCxtYXhBcmdzOjB9fSxib29rbWFya3M6e2NyZWF0ZTp7bWluQXJnczoxLG1heEFyZ3M6MX0sZ2V0OnttaW5BcmdzOjEsbWF4QXJnczoxfSxnZXRDaGlsZHJlbjp7bWluQXJnczoxLG1heEFyZ3M6MX0sZ2V0UmVjZW50OnttaW5BcmdzOjEsbWF4QXJnczoxfSxnZXRTdWJUcmVlOnttaW5BcmdzOjEsbWF4QXJnczoxfSxnZXRUcmVlOnttaW5BcmdzOjAsbWF4QXJnczowfSxtb3ZlOnttaW5BcmdzOjIsbWF4QXJnczoyfSxyZW1vdmU6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LHJlbW92ZVRyZWU6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LHNlYXJjaDp7bWluQXJnczoxLG1heEFyZ3M6MX0sdXBkYXRlOnttaW5BcmdzOjIsbWF4QXJnczoyfX0sYnJvd3NlckFjdGlvbjp7ZGlzYWJsZTp7bWluQXJnczowLG1heEFyZ3M6MSxmYWxsYmFja1RvTm9DYWxsYmFjazohMH0sZW5hYmxlOnttaW5BcmdzOjAsbWF4QXJnczoxLGZhbGxiYWNrVG9Ob0NhbGxiYWNrOiEwfSxnZXRCYWRnZUJhY2tncm91bmRDb2xvcjp7bWluQXJnczoxLG1heEFyZ3M6MX0sZ2V0QmFkZ2VUZXh0OnttaW5BcmdzOjEsbWF4QXJnczoxfSxnZXRQb3B1cDp7bWluQXJnczoxLG1heEFyZ3M6MX0sZ2V0VGl0bGU6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LG9wZW5Qb3B1cDp7bWluQXJnczowLG1heEFyZ3M6MH0sc2V0QmFkZ2VCYWNrZ3JvdW5kQ29sb3I6e21pbkFyZ3M6MSxtYXhBcmdzOjEsZmFsbGJhY2tUb05vQ2FsbGJhY2s6ITB9LHNldEJhZGdlVGV4dDp7bWluQXJnczoxLG1heEFyZ3M6MSxmYWxsYmFja1RvTm9DYWxsYmFjazohMH0sc2V0SWNvbjp7bWluQXJnczoxLG1heEFyZ3M6MX0sc2V0UG9wdXA6e21pbkFyZ3M6MSxtYXhBcmdzOjEsZmFsbGJhY2tUb05vQ2FsbGJhY2s6ITB9LHNldFRpdGxlOnttaW5BcmdzOjEsbWF4QXJnczoxLGZhbGxiYWNrVG9Ob0NhbGxiYWNrOiEwfX0sYnJvd3NpbmdEYXRhOntyZW1vdmU6e21pbkFyZ3M6MixtYXhBcmdzOjJ9LHJlbW92ZUNhY2hlOnttaW5BcmdzOjEsbWF4QXJnczoxfSxyZW1vdmVDb29raWVzOnttaW5BcmdzOjEsbWF4QXJnczoxfSxyZW1vdmVEb3dubG9hZHM6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LHJlbW92ZUZvcm1EYXRhOnttaW5BcmdzOjEsbWF4QXJnczoxfSxyZW1vdmVIaXN0b3J5OnttaW5BcmdzOjEsbWF4QXJnczoxfSxyZW1vdmVMb2NhbFN0b3JhZ2U6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LHJlbW92ZVBhc3N3b3Jkczp7bWluQXJnczoxLG1heEFyZ3M6MX0scmVtb3ZlUGx1Z2luRGF0YTp7bWluQXJnczoxLG1heEFyZ3M6MX0sc2V0dGluZ3M6e21pbkFyZ3M6MCxtYXhBcmdzOjB9fSxjb21tYW5kczp7Z2V0QWxsOnttaW5BcmdzOjAsbWF4QXJnczowfX0sY29udGV4dE1lbnVzOntyZW1vdmU6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LHJlbW92ZUFsbDp7bWluQXJnczowLG1heEFyZ3M6MH0sdXBkYXRlOnttaW5BcmdzOjIsbWF4QXJnczoyfX0sY29va2llczp7Z2V0OnttaW5BcmdzOjEsbWF4QXJnczoxfSxnZXRBbGw6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LGdldEFsbENvb2tpZVN0b3Jlczp7bWluQXJnczowLG1heEFyZ3M6MH0scmVtb3ZlOnttaW5BcmdzOjEsbWF4QXJnczoxfSxzZXQ6e21pbkFyZ3M6MSxtYXhBcmdzOjF9fSxkZXZ0b29sczp7aW5zcGVjdGVkV2luZG93OntldmFsOnttaW5BcmdzOjEsbWF4QXJnczoyLHNpbmdsZUNhbGxiYWNrQXJnOiExfX0scGFuZWxzOntjcmVhdGU6e21pbkFyZ3M6MyxtYXhBcmdzOjMsc2luZ2xlQ2FsbGJhY2tBcmc6ITB9fX0sZG93bmxvYWRzOntjYW5jZWw6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LGRvd25sb2FkOnttaW5BcmdzOjEsbWF4QXJnczoxfSxlcmFzZTp7bWluQXJnczoxLG1heEFyZ3M6MX0sZ2V0RmlsZUljb246e21pbkFyZ3M6MSxtYXhBcmdzOjJ9LG9wZW46e21pbkFyZ3M6MSxtYXhBcmdzOjEsZmFsbGJhY2tUb05vQ2FsbGJhY2s6ITB9LHBhdXNlOnttaW5BcmdzOjEsbWF4QXJnczoxfSxyZW1vdmVGaWxlOnttaW5BcmdzOjEsbWF4QXJnczoxfSxyZXN1bWU6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LHNlYXJjaDp7bWluQXJnczoxLG1heEFyZ3M6MX0sc2hvdzp7bWluQXJnczoxLG1heEFyZ3M6MSxmYWxsYmFja1RvTm9DYWxsYmFjazohMH19LGV4dGVuc2lvbjp7aXNBbGxvd2VkRmlsZVNjaGVtZUFjY2Vzczp7bWluQXJnczowLG1heEFyZ3M6MH0saXNBbGxvd2VkSW5jb2duaXRvQWNjZXNzOnttaW5BcmdzOjAsbWF4QXJnczowfX0saGlzdG9yeTp7YWRkVXJsOnttaW5BcmdzOjEsbWF4QXJnczoxfSxkZWxldGVBbGw6e21pbkFyZ3M6MCxtYXhBcmdzOjB9LGRlbGV0ZVJhbmdlOnttaW5BcmdzOjEsbWF4QXJnczoxfSxkZWxldGVVcmw6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LGdldFZpc2l0czp7bWluQXJnczoxLG1heEFyZ3M6MX0sc2VhcmNoOnttaW5BcmdzOjEsbWF4QXJnczoxfX0saTE4bjp7ZGV0ZWN0TGFuZ3VhZ2U6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LGdldEFjY2VwdExhbmd1YWdlczp7bWluQXJnczowLG1heEFyZ3M6MH19LGlkZW50aXR5OntsYXVuY2hXZWJBdXRoRmxvdzp7bWluQXJnczoxLG1heEFyZ3M6MX19LGlkbGU6e3F1ZXJ5U3RhdGU6e21pbkFyZ3M6MSxtYXhBcmdzOjF9fSxtYW5hZ2VtZW50OntnZXQ6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LGdldEFsbDp7bWluQXJnczowLG1heEFyZ3M6MH0sZ2V0U2VsZjp7bWluQXJnczowLG1heEFyZ3M6MH0sc2V0RW5hYmxlZDp7bWluQXJnczoyLG1heEFyZ3M6Mn0sdW5pbnN0YWxsU2VsZjp7bWluQXJnczowLG1heEFyZ3M6MX19LG5vdGlmaWNhdGlvbnM6e2NsZWFyOnttaW5BcmdzOjEsbWF4QXJnczoxfSxjcmVhdGU6e21pbkFyZ3M6MSxtYXhBcmdzOjJ9LGdldEFsbDp7bWluQXJnczowLG1heEFyZ3M6MH0sZ2V0UGVybWlzc2lvbkxldmVsOnttaW5BcmdzOjAsbWF4QXJnczowfSx1cGRhdGU6e21pbkFyZ3M6MixtYXhBcmdzOjJ9fSxwYWdlQWN0aW9uOntnZXRQb3B1cDp7bWluQXJnczoxLG1heEFyZ3M6MX0sZ2V0VGl0bGU6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LGhpZGU6e21pbkFyZ3M6MSxtYXhBcmdzOjEsZmFsbGJhY2tUb05vQ2FsbGJhY2s6ITB9LHNldEljb246e21pbkFyZ3M6MSxtYXhBcmdzOjF9LHNldFBvcHVwOnttaW5BcmdzOjEsbWF4QXJnczoxLGZhbGxiYWNrVG9Ob0NhbGxiYWNrOiEwfSxzZXRUaXRsZTp7bWluQXJnczoxLG1heEFyZ3M6MSxmYWxsYmFja1RvTm9DYWxsYmFjazohMH0sc2hvdzp7bWluQXJnczoxLG1heEFyZ3M6MSxmYWxsYmFja1RvTm9DYWxsYmFjazohMH19LHBlcm1pc3Npb25zOntjb250YWluczp7bWluQXJnczoxLG1heEFyZ3M6MX0sZ2V0QWxsOnttaW5BcmdzOjAsbWF4QXJnczowfSxyZW1vdmU6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LHJlcXVlc3Q6e21pbkFyZ3M6MSxtYXhBcmdzOjF9fSxydW50aW1lOntnZXRCYWNrZ3JvdW5kUGFnZTp7bWluQXJnczowLG1heEFyZ3M6MH0sZ2V0QnJvd3NlckluZm86e21pbkFyZ3M6MCxtYXhBcmdzOjB9LGdldFBsYXRmb3JtSW5mbzp7bWluQXJnczowLG1heEFyZ3M6MH0sb3Blbk9wdGlvbnNQYWdlOnttaW5BcmdzOjAsbWF4QXJnczowfSxyZXF1ZXN0VXBkYXRlQ2hlY2s6e21pbkFyZ3M6MCxtYXhBcmdzOjB9LHNlbmRNZXNzYWdlOnttaW5BcmdzOjEsbWF4QXJnczozfSxzZW5kTmF0aXZlTWVzc2FnZTp7bWluQXJnczoyLG1heEFyZ3M6Mn0sc2V0VW5pbnN0YWxsVVJMOnttaW5BcmdzOjEsbWF4QXJnczoxfX0sc2Vzc2lvbnM6e2dldERldmljZXM6e21pbkFyZ3M6MCxtYXhBcmdzOjF9LGdldFJlY2VudGx5Q2xvc2VkOnttaW5BcmdzOjAsbWF4QXJnczoxfSxyZXN0b3JlOnttaW5BcmdzOjAsbWF4QXJnczoxfX0sc3RvcmFnZTp7bG9jYWw6e2NsZWFyOnttaW5BcmdzOjAsbWF4QXJnczowfSxnZXQ6e21pbkFyZ3M6MCxtYXhBcmdzOjF9LGdldEJ5dGVzSW5Vc2U6e21pbkFyZ3M6MCxtYXhBcmdzOjF9LHJlbW92ZTp7bWluQXJnczoxLG1heEFyZ3M6MX0sc2V0OnttaW5BcmdzOjEsbWF4QXJnczoxfX0sbWFuYWdlZDp7Z2V0OnttaW5BcmdzOjAsbWF4QXJnczoxfSxnZXRCeXRlc0luVXNlOnttaW5BcmdzOjAsbWF4QXJnczoxfX0sc3luYzp7Y2xlYXI6e21pbkFyZ3M6MCxtYXhBcmdzOjB9LGdldDp7bWluQXJnczowLG1heEFyZ3M6MX0sZ2V0Qnl0ZXNJblVzZTp7bWluQXJnczowLG1heEFyZ3M6MX0scmVtb3ZlOnttaW5BcmdzOjEsbWF4QXJnczoxfSxzZXQ6e21pbkFyZ3M6MSxtYXhBcmdzOjF9fX0sdGFiczp7Y2FwdHVyZVZpc2libGVUYWI6e21pbkFyZ3M6MCxtYXhBcmdzOjJ9LGNyZWF0ZTp7bWluQXJnczoxLG1heEFyZ3M6MX0sZGV0ZWN0TGFuZ3VhZ2U6e21pbkFyZ3M6MCxtYXhBcmdzOjF9LGRpc2NhcmQ6e21pbkFyZ3M6MCxtYXhBcmdzOjF9LGR1cGxpY2F0ZTp7bWluQXJnczoxLG1heEFyZ3M6MX0sZXhlY3V0ZVNjcmlwdDp7bWluQXJnczoxLG1heEFyZ3M6Mn0sZ2V0OnttaW5BcmdzOjEsbWF4QXJnczoxfSxnZXRDdXJyZW50OnttaW5BcmdzOjAsbWF4QXJnczowfSxnZXRab29tOnttaW5BcmdzOjAsbWF4QXJnczoxfSxnZXRab29tU2V0dGluZ3M6e21pbkFyZ3M6MCxtYXhBcmdzOjF9LGhpZ2hsaWdodDp7bWluQXJnczoxLG1heEFyZ3M6MX0saW5zZXJ0Q1NTOnttaW5BcmdzOjEsbWF4QXJnczoyfSxtb3ZlOnttaW5BcmdzOjIsbWF4QXJnczoyfSxxdWVyeTp7bWluQXJnczoxLG1heEFyZ3M6MX0scmVsb2FkOnttaW5BcmdzOjAsbWF4QXJnczoyfSxyZW1vdmU6e21pbkFyZ3M6MSxtYXhBcmdzOjF9LHJlbW92ZUNTUzp7bWluQXJnczoxLG1heEFyZ3M6Mn0sc2VuZE1lc3NhZ2U6e21pbkFyZ3M6MixtYXhBcmdzOjN9LHNldFpvb206e21pbkFyZ3M6MSxtYXhBcmdzOjJ9LHNldFpvb21TZXR0aW5nczp7bWluQXJnczoxLG1heEFyZ3M6Mn0sdXBkYXRlOnttaW5BcmdzOjEsbWF4QXJnczoyfX0sdG9wU2l0ZXM6e2dldDp7bWluQXJnczowLG1heEFyZ3M6MH19LHdlYk5hdmlnYXRpb246e2dldEFsbEZyYW1lczp7bWluQXJnczoxLG1heEFyZ3M6MX0sZ2V0RnJhbWU6e21pbkFyZ3M6MSxtYXhBcmdzOjF9fSx3ZWJSZXF1ZXN0OntoYW5kbGVyQmVoYXZpb3JDaGFuZ2VkOnttaW5BcmdzOjAsbWF4QXJnczowfX0sd2luZG93czp7Y3JlYXRlOnttaW5BcmdzOjAsbWF4QXJnczoxfSxnZXQ6e21pbkFyZ3M6MSxtYXhBcmdzOjJ9LGdldEFsbDp7bWluQXJnczowLG1heEFyZ3M6MX0sZ2V0Q3VycmVudDp7bWluQXJnczowLG1heEFyZ3M6MX0sZ2V0TGFzdEZvY3VzZWQ6e21pbkFyZ3M6MCxtYXhBcmdzOjF9LHJlbW92ZTp7bWluQXJnczoxLG1heEFyZ3M6MX0sdXBkYXRlOnttaW5BcmdzOjIsbWF4QXJnczoyfX19O2lmKDA9PT1PYmplY3Qua2V5cyhuKS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJhcGktbWV0YWRhdGEuanNvbiBoYXMgbm90IGJlZW4gaW5jbHVkZWQgaW4gYnJvd3Nlci1wb2x5ZmlsbCIpO2NsYXNzIG8gZXh0ZW5kcyBXZWFrTWFwe2NvbnN0cnVjdG9yKGUscil7c3VwZXIociksdGhpcy5jcmVhdGVJdGVtPWV9Z2V0KGUpe3JldHVybiB0aGlzLmhhcyhlKXx8dGhpcy5zZXQoZSx0aGlzLmNyZWF0ZUl0ZW0oZSkpLHN1cGVyLmdldChlKX19Y29uc3QgaT1lPT5lJiYib2JqZWN0Ij09PXR5cGVvZiBlJiYiZnVuY3Rpb24iPT09dHlwZW9mIGUudGhlbixhPShyLHQpPT4oLi4ubik9PntlLnJ1bnRpbWUubGFzdEVycm9yP3IucmVqZWN0KGUucnVudGltZS5sYXN0RXJyb3IpOnQuc2luZ2xlQ2FsbGJhY2tBcmd8fG4ubGVuZ3RoPD0xJiYhMSE9PXQuc2luZ2xlQ2FsbGJhY2tBcmc/ci5yZXNvbHZlKG5bMF0pOnIucmVzb2x2ZShuKX0scz1lPT4xPT1lPyJhcmd1bWVudCI6ImFyZ3VtZW50cyIsYz0oZSxyKT0+ZnVuY3Rpb24odCwuLi5uKXtpZihuLmxlbmd0aDxyLm1pbkFyZ3MpdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCAke3IubWluQXJnc30gJHtzKHIubWluQXJncyl9IGZvciAke2V9KCksIGdvdCAke24ubGVuZ3RofWApO2lmKG4ubGVuZ3RoPnIubWF4QXJncyl0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGF0IG1vc3QgJHtyLm1heEFyZ3N9ICR7cyhyLm1heEFyZ3MpfSBmb3IgJHtlfSgpLCBnb3QgJHtuLmxlbmd0aH1gKTtyZXR1cm4gbmV3IFByb21pc2UoKG8saSk9PntpZihyLmZhbGxiYWNrVG9Ob0NhbGxiYWNrKXRyeXt0W2VdKC4uLm4sYSh7cmVzb2x2ZTpvLHJlamVjdDppfSxyKSl9Y2F0Y2gocyl7Y29uc29sZS53YXJuKGUrIiBBUEkgbWV0aG9kIGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IHRoZSBjYWxsYmFjayBwYXJhbWV0ZXIsIGZhbGxpbmcgYmFjayB0byBjYWxsIGl0IHdpdGhvdXQgYSBjYWxsYmFjazogIixzKSx0W2VdKC4uLm4pLHIuZmFsbGJhY2tUb05vQ2FsbGJhY2s9ITEsci5ub0NhbGxiYWNrPSEwLG8oKX1lbHNlIHIubm9DYWxsYmFjaz8odFtlXSguLi5uKSxvKCkpOnRbZV0oLi4ubixhKHtyZXNvbHZlOm8scmVqZWN0Oml9LHIpKX0pfSx1PShlLHIsdCk9Pm5ldyBQcm94eShyLHthcHBseShyLG4sbyl7cmV0dXJuIHQuY2FsbChuLGUsLi4ubyl9fSk7bGV0IGY9RnVuY3Rpb24uY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO2NvbnN0IGc9KGUscj17fSx0PXt9KT0+e2xldCBuPU9iamVjdC5jcmVhdGUobnVsbCksbz17aGFzKHIsdCl7cmV0dXJuIHQgaW4gZXx8dCBpbiBufSxnZXQobyxpLGEpe2lmKGkgaW4gbilyZXR1cm4gbltpXTtpZighKGkgaW4gZSkpcmV0dXJuO2xldCBzPWVbaV07aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBzKWlmKCJmdW5jdGlvbiI9PT10eXBlb2YgcltpXSlzPXUoZSxlW2ldLHJbaV0pO2Vsc2UgaWYoZih0LGkpKXtsZXQgcj1jKGksdFtpXSk7cz11KGUsZVtpXSxyKX1lbHNlIHM9cy5iaW5kKGUpO2Vsc2V7aWYoIm9iamVjdCIhPT10eXBlb2Ygc3x8bnVsbD09PXN8fCFmKHIsaSkmJiFmKHQsaSkpcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLGkse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldCgpe3JldHVybiBlW2ldfSxzZXQocil7ZVtpXT1yfX0pLHM7cz1nKHMscltpXSx0W2ldKX1yZXR1cm4gbltpXT1zLHN9LHNldChyLHQsbyxpKXtyZXR1cm4gdCBpbiBuP25bdF09bzplW3RdPW8sITB9LGRlZmluZVByb3BlcnR5KGUscix0KXtyZXR1cm4gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShuLHIsdCl9LGRlbGV0ZVByb3BlcnR5KGUscil7cmV0dXJuIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkobixyKX19LGk9T2JqZWN0LmNyZWF0ZShlKTtyZXR1cm4gbmV3IFByb3h5KGksbyl9LGw9ZT0+KHthZGRMaXN0ZW5lcihyLHQsLi4ubil7ci5hZGRMaXN0ZW5lcihlLmdldCh0KSwuLi5uKX0saGFzTGlzdGVuZXIocix0KXtyZXR1cm4gci5oYXNMaXN0ZW5lcihlLmdldCh0KSl9LHJlbW92ZUxpc3RlbmVyKHIsdCl7ci5yZW1vdmVMaXN0ZW5lcihlLmdldCh0KSl9fSk7bGV0IG09ITE7Y29uc3QgcD1uZXcgbyhlPT4iZnVuY3Rpb24iIT09dHlwZW9mIGU/ZTpmdW5jdGlvbihyLG4sbyl7bGV0IGEscyxjPSExLHU9bmV3IFByb21pc2UoZT0+e2E9ZnVuY3Rpb24ocil7bXx8KGNvbnNvbGUud2Fybih0LChuZXcgRXJyb3IpLnN0YWNrKSxtPSEwKSxjPSEwLGUocil9fSk7dHJ5e3M9ZShyLG4sYSl9Y2F0Y2gobCl7cz1Qcm9taXNlLnJlamVjdChsKX1jb25zdCBmPSEwIT09cyYmaShzKTtpZighMCE9PXMmJiFmJiYhYylyZXR1cm4hMTtjb25zdCBnPWU9PntlLnRoZW4oZT0+e28oZSl9LGU9PntsZXQgcjtyPWUmJihlIGluc3RhbmNlb2YgRXJyb3J8fCJzdHJpbmciPT09dHlwZW9mIGUubWVzc2FnZSk/ZS5tZXNzYWdlOiJBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkIixvKHtfX21veldlYkV4dGVuc2lvblBvbHlmaWxsUmVqZWN0X186ITAsbWVzc2FnZTpyfSl9KS5jYXRjaChlPT57Y29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHNlbmQgb25NZXNzYWdlIHJlamVjdGVkIHJlcGx5IixlKX0pfTtyZXR1cm4gZyhmP3M6dSksITB9KSxkPSh7cmVqZWN0OnQscmVzb2x2ZTpufSxvKT0+e2UucnVudGltZS5sYXN0RXJyb3I/ZS5ydW50aW1lLmxhc3RFcnJvci5tZXNzYWdlPT09cj9uKCk6dChlLnJ1bnRpbWUubGFzdEVycm9yKTpvJiZvLl9fbW96V2ViRXh0ZW5zaW9uUG9seWZpbGxSZWplY3RfXz90KG5ldyBFcnJvcihvLm1lc3NhZ2UpKTpuKG8pfSxBPShlLHIsdCwuLi5uKT0+e2lmKG4ubGVuZ3RoPHIubWluQXJncyl0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0ICR7ci5taW5BcmdzfSAke3Moci5taW5BcmdzKX0gZm9yICR7ZX0oKSwgZ290ICR7bi5sZW5ndGh9YCk7aWYobi5sZW5ndGg+ci5tYXhBcmdzKXRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYXQgbW9zdCAke3IubWF4QXJnc30gJHtzKHIubWF4QXJncyl9IGZvciAke2V9KCksIGdvdCAke24ubGVuZ3RofWApO3JldHVybiBuZXcgUHJvbWlzZSgoZSxyKT0+e2NvbnN0IG89ZC5iaW5kKG51bGwse3Jlc29sdmU6ZSxyZWplY3Q6cn0pO24ucHVzaChvKSx0LnNlbmRNZXNzYWdlKC4uLm4pfSl9LHY9e3J1bnRpbWU6e29uTWVzc2FnZTpsKHApLG9uTWVzc2FnZUV4dGVybmFsOmwocCksc2VuZE1lc3NhZ2U6QS5iaW5kKG51bGwsInNlbmRNZXNzYWdlIix7bWluQXJnczoxLG1heEFyZ3M6M30pfSx0YWJzOntzZW5kTWVzc2FnZTpBLmJpbmQobnVsbCwic2VuZE1lc3NhZ2UiLHttaW5BcmdzOjIsbWF4QXJnczozfSl9fSx4PXtjbGVhcjp7bWluQXJnczoxLG1heEFyZ3M6MX0sZ2V0OnttaW5BcmdzOjEsbWF4QXJnczoxfSxzZXQ6e21pbkFyZ3M6MSxtYXhBcmdzOjF9fTtyZXR1cm4gbi5wcml2YWN5PXtuZXR3b3JrOntuZXR3b3JrUHJlZGljdGlvbkVuYWJsZWQ6eCx3ZWJSVENJUEhhbmRsaW5nUG9saWN5Onh9LHNlcnZpY2VzOntwYXNzd29yZFNhdmluZ0VuYWJsZWQ6eH0sd2Vic2l0ZXM6e2h5cGVybGlua0F1ZGl0aW5nRW5hYmxlZDp4LHJlZmVycmVyc0VuYWJsZWQ6eH19LGcoZSx2LG4pfTtlLmV4cG9ydHM9bihjaHJvbWUpfWVsc2UgZS5leHBvcnRzPWF9KSl9LCI5YmYyIjpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiODNhYiIpLG89dCgiMGNmYiIpLGk9dCgiODI1YSIpLGE9dCgiYzA0ZSIpLHM9T2JqZWN0LmRlZmluZVByb3BlcnR5O3IuZj1uP3M6ZnVuY3Rpb24oZSxyLHQpe2lmKGkoZSkscj1hKHIsITApLGkodCksbyl0cnl7cmV0dXJuIHMoZSxyLHQpfWNhdGNoKG4pe31pZigiZ2V0ImluIHR8fCJzZXQiaW4gdCl0aHJvdyBUeXBlRXJyb3IoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuInZhbHVlImluIHQmJihlW3JdPXQudmFsdWUpLGV9fSwiOWVkMyI6ZnVuY3Rpb24oZSxyLHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj10KCJhZTkzIikuSXRlcmF0b3JQcm90b3R5cGUsbz10KCI3YzczIiksaT10KCI1YzZjIiksYT10KCJkNDRlIikscz10KCIzZjhjIiksYz1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSxyLHQpe3ZhciB1PXIrIiBJdGVyYXRvciI7cmV0dXJuIGUucHJvdG90eXBlPW8obix7bmV4dDppKDEsdCl9KSxhKGUsdSwhMSwhMCksc1t1XT1jLGV9fSxhNGI0OmZ1bmN0aW9uKGUscix0KXt2YXIgbj10KCIzNDJmIik7ZS5leHBvcnRzPS93ZWIwcyg/IS4qY2hyb21lKS9pLnRlc3Qobil9LGE2OTE6ZnVuY3Rpb24oZSxyKXt2YXIgdD1NYXRoLmNlaWwsbj1NYXRoLmZsb29yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gaXNOYU4oZT0rZSk/MDooZT4wP246dCkoZSl9fSxhNzlkOmZ1bmN0aW9uKGUscix0KXsidXNlIHN0cmljdCI7dmFyIG49dCgiMjNlNyIpLG89dCgiYzQzMCIpLGk9dCgiZmVhOSIpLGE9dCgiZDAzOSIpLHM9dCgiZDA2NiIpLGM9dCgiNDg0MCIpLHU9dCgiY2RmOSIpLGY9dCgiNmVlYiIpLGc9ISFpJiZhKChmdW5jdGlvbigpe2kucHJvdG90eXBlWyJmaW5hbGx5Il0uY2FsbCh7dGhlbjpmdW5jdGlvbigpe319LChmdW5jdGlvbigpe30pKX0pKTtuKHt0YXJnZXQ6IlByb21pc2UiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOmd9LHtmaW5hbGx5OmZ1bmN0aW9uKGUpe3ZhciByPWModGhpcyxzKCJQcm9taXNlIikpLHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU7cmV0dXJuIHRoaXMudGhlbih0P2Z1bmN0aW9uKHQpe3JldHVybiB1KHIsZSgpKS50aGVuKChmdW5jdGlvbigpe3JldHVybiB0fSkpfTplLHQ/ZnVuY3Rpb24odCl7cmV0dXJuIHUocixlKCkpLnRoZW4oKGZ1bmN0aW9uKCl7dGhyb3cgdH0pKX06ZSl9fSksb3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGl8fGkucHJvdG90eXBlWyJmaW5hbGx5Il18fGYoaS5wcm90b3R5cGUsImZpbmFsbHkiLHMoIlByb21pc2UiKS5wcm90b3R5cGVbImZpbmFsbHkiXSl9LGFlOTM6ZnVuY3Rpb24oZSxyLHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgbixvLGksYT10KCJkMDM5Iikscz10KCJlMTYzIiksYz10KCI5MTEyIiksdT10KCI1MTM1IiksZj10KCJiNjIyIiksZz10KCJjNDMwIiksbD1mKCJpdGVyYXRvciIpLG09ITEscD1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtbXS5rZXlzJiYoaT1bXS5rZXlzKCksIm5leHQiaW4gaT8obz1zKHMoaSkpLG8hPT1PYmplY3QucHJvdG90eXBlJiYobj1vKSk6bT0hMCk7dmFyIGQ9dm9pZCAwPT1ufHxhKChmdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiBuW2xdLmNhbGwoZSkhPT1lfSkpO2QmJihuPXt9KSxnJiYhZHx8dShuLGwpfHxjKG4sbCxwKSxlLmV4cG9ydHM9e0l0ZXJhdG9yUHJvdG90eXBlOm4sQlVHR1lfU0FGQVJJX0lURVJBVE9SUzptfX0sYjU3NTpmdW5jdGlvbihlLHIsdCl7dmFyIG4sbyxpLGEscyxjLHUsZixnPXQoImRhODQiKSxsPXQoIjA2Y2YiKS5mLG09dCgiMmNmNCIpLnNldCxwPXQoIjFjZGMiKSxkPXQoImE0YjQiKSxBPXQoIjYwNWQiKSx2PWcuTXV0YXRpb25PYnNlcnZlcnx8Zy5XZWJLaXRNdXRhdGlvbk9ic2VydmVyLHg9Zy5kb2N1bWVudCxiPWcucHJvY2VzcyxoPWcuUHJvbWlzZSx5PWwoZywicXVldWVNaWNyb3Rhc2siKSx3PXkmJnkudmFsdWU7d3x8KG49ZnVuY3Rpb24oKXt2YXIgZSxyO0EmJihlPWIuZG9tYWluKSYmZS5leGl0KCk7d2hpbGUobyl7cj1vLmZuLG89by5uZXh0O3RyeXtyKCl9Y2F0Y2godCl7dGhyb3cgbz9hKCk6aT12b2lkIDAsdH19aT12b2lkIDAsZSYmZS5lbnRlcigpfSxwfHxBfHxkfHwhdnx8IXg/aCYmaC5yZXNvbHZlPyh1PWgucmVzb2x2ZSh2b2lkIDApLGY9dS50aGVuLGE9ZnVuY3Rpb24oKXtmLmNhbGwodSxuKX0pOmE9QT9mdW5jdGlvbigpe2IubmV4dFRpY2sobil9OmZ1bmN0aW9uKCl7bS5jYWxsKGcsbil9OihzPSEwLGM9eC5jcmVhdGVUZXh0Tm9kZSgiIiksbmV3IHYobikub2JzZXJ2ZShjLHtjaGFyYWN0ZXJEYXRhOiEwfSksYT1mdW5jdGlvbigpe2MuZGF0YT1zPSFzfSkpLGUuZXhwb3J0cz13fHxmdW5jdGlvbihlKXt2YXIgcj17Zm46ZSxuZXh0OnZvaWQgMH07aSYmKGkubmV4dD1yKSxvfHwobz1yLGEoKSksaT1yfX0sYjYyMjpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiZGE4NCIpLG89dCgiNTY5MiIpLGk9dCgiNTEzNSIpLGE9dCgiOTBlMyIpLHM9dCgiNDkzMCIpLGM9dCgiZmRiZiIpLHU9bygid2tzIiksZj1uLlN5bWJvbCxnPWM/ZjpmJiZmLndpdGhvdXRTZXR0ZXJ8fGE7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBpKHUsZSl8fChzJiZpKGYsZSk/dVtlXT1mW2VdOnVbZV09ZygiU3ltYm9sLiIrZSkpLHVbZV19fSxjMDRlOmZ1bmN0aW9uKGUscix0KXt2YXIgbj10KCI4NjFkIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUscil7aWYoIW4oZSkpcmV0dXJuIGU7dmFyIHQsbztpZihyJiYiZnVuY3Rpb24iPT10eXBlb2YodD1lLnRvU3RyaW5nKSYmIW4obz10LmNhbGwoZSkpKXJldHVybiBvO2lmKCJmdW5jdGlvbiI9PXR5cGVvZih0PWUudmFsdWVPZikmJiFuKG89dC5jYWxsKGUpKSlyZXR1cm4gbztpZighciYmImZ1bmN0aW9uIj09dHlwZW9mKHQ9ZS50b1N0cmluZykmJiFuKG89dC5jYWxsKGUpKSlyZXR1cm4gbzt0aHJvdyBUeXBlRXJyb3IoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpfX0sYzQzMDpmdW5jdGlvbihlLHIpe2UuZXhwb3J0cz0hMX0sYzZiNjpmdW5jdGlvbihlLHIpe3ZhciB0PXt9LnRvU3RyaW5nO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gdC5jYWxsKGUpLnNsaWNlKDgsLTEpfX0sYzZjZDpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiZGE4NCIpLG89dCgiY2U0ZSIpLGk9Il9fY29yZS1qc19zaGFyZWRfXyIsYT1uW2ldfHxvKGkse30pO2UuZXhwb3J0cz1hfSxjYTg0OmZ1bmN0aW9uKGUscix0KXt2YXIgbj10KCI1MTM1Iiksbz10KCJmYzZhIiksaT10KCI0ZDY0IikuaW5kZXhPZixhPXQoImQwMTIiKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSxyKXt2YXIgdCxzPW8oZSksYz0wLHU9W107Zm9yKHQgaW4gcykhbihhLHQpJiZuKHMsdCkmJnUucHVzaCh0KTt3aGlsZShyLmxlbmd0aD5jKW4ocyx0PXJbYysrXSkmJih+aSh1LHQpfHx1LnB1c2godCkpO3JldHVybiB1fX0sY2MxMjpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiZGE4NCIpLG89dCgiODYxZCIpLGk9bi5kb2N1bWVudCxhPW8oaSkmJm8oaS5jcmVhdGVFbGVtZW50KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGE/aS5jcmVhdGVFbGVtZW50KGUpOnt9fX0sY2NhNjpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiMjNlNyIpLG89dCgiNjBkYSIpO24oe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpPYmplY3QuYXNzaWduIT09b30se2Fzc2lnbjpvfSl9LGNkZjk6ZnVuY3Rpb24oZSxyLHQpe3ZhciBuPXQoIjgyNWEiKSxvPXQoIjg2MWQiKSxpPXQoImYwNjkiKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSxyKXtpZihuKGUpLG8ocikmJnIuY29uc3RydWN0b3I9PT1lKXJldHVybiByO3ZhciB0PWkuZihlKSxhPXQucmVzb2x2ZTtyZXR1cm4gYShyKSx0LnByb21pc2V9fSxjZTRlOmZ1bmN0aW9uKGUscix0KXt2YXIgbj10KCJkYTg0Iiksbz10KCI5MTEyIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUscil7dHJ5e28obixlLHIpfWNhdGNoKHQpe25bZV09cn1yZXR1cm4gcn19LGQwMTI6ZnVuY3Rpb24oZSxyKXtlLmV4cG9ydHM9e319LGQwMzk6ZnVuY3Rpb24oZSxyKXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dHJ5e3JldHVybiEhZSgpfWNhdGNoKHIpe3JldHVybiEwfX19LGQwNjY6ZnVuY3Rpb24oZSxyLHQpe3ZhciBuPXQoIjQyOGYiKSxvPXQoImRhODQiKSxpPWZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6dm9pZCAwfTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP2kobltlXSl8fGkob1tlXSk6bltlXSYmbltlXVtyXXx8b1tlXSYmb1tlXVtyXX19LGQxZTc6ZnVuY3Rpb24oZSxyLHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj17fS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsaT1vJiYhbi5jYWxsKHsxOjJ9LDEpO3IuZj1pP2Z1bmN0aW9uKGUpe3ZhciByPW8odGhpcyxlKTtyZXR1cm4hIXImJnIuZW51bWVyYWJsZX06bn0sZDJiYjpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiODI1YSIpLG89dCgiM2JiZSIpO2UuZXhwb3J0cz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fCgiX19wcm90b19fImlue30/ZnVuY3Rpb24oKXt2YXIgZSxyPSExLHQ9e307dHJ5e2U9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCJfX3Byb3RvX18iKS5zZXQsZS5jYWxsKHQsW10pLHI9dCBpbnN0YW5jZW9mIEFycmF5fWNhdGNoKGkpe31yZXR1cm4gZnVuY3Rpb24odCxpKXtyZXR1cm4gbih0KSxvKGkpLHI/ZS5jYWxsKHQsaSk6dC5fX3Byb3RvX189aSx0fX0oKTp2b2lkIDApfSxkNDRlOmZ1bmN0aW9uKGUscix0KXt2YXIgbj10KCI5YmYyIikuZixvPXQoIjUxMzUiKSxpPXQoImI2MjIiKSxhPWkoInRvU3RyaW5nVGFnIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUscix0KXtlJiYhbyhlPXQ/ZTplLnByb3RvdHlwZSxhKSYmbihlLGEse2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTpyfSl9fSxkYTg0OmZ1bmN0aW9uKGUscil7dmFyIHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuTWF0aD09TWF0aCYmZX07ZS5leHBvcnRzPXQoIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzKXx8dCgib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93KXx8dCgib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYpfHx0KCJvYmplY3QiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cpfHxmdW5jdGlvbigpe3JldHVybiB0aGlzfSgpfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfSxkZjc1OmZ1bmN0aW9uKGUscix0KXt2YXIgbj10KCJjYTg0Iiksbz10KCI3ODM5Iik7ZS5leHBvcnRzPU9iamVjdC5rZXlzfHxmdW5jdGlvbihlKXtyZXR1cm4gbihlLG8pfX0sZTE2MzpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiNTEzNSIpLG89dCgiN2IwYiIpLGk9dCgiZjc3MiIpLGE9dCgiZTE3NyIpLHM9aSgiSUVfUFJPVE8iKSxjPU9iamVjdC5wcm90b3R5cGU7ZS5leHBvcnRzPWE/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKGUpe3JldHVybiBlPW8oZSksbihlLHMpP2Vbc106ImZ1bmN0aW9uIj09dHlwZW9mIGUuY29uc3RydWN0b3ImJmUgaW5zdGFuY2VvZiBlLmNvbnN0cnVjdG9yP2UuY29uc3RydWN0b3IucHJvdG90eXBlOmUgaW5zdGFuY2VvZiBPYmplY3Q/YzpudWxsfX0sZTE3NzpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiZDAzOSIpO2UuZXhwb3J0cz0hbigoZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7fXJldHVybiBlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1udWxsLE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgZSkhPT1lLnByb3RvdHlwZX0pKX0sZTI2MDpmdW5jdGlvbihlLHIsdCl7InVzZSBzdHJpY3QiO3ZhciBuPXQoImZjNmEiKSxvPXQoIjQ0ZDIiKSxpPXQoIjNmOGMiKSxhPXQoIjY5ZjMiKSxzPXQoIjdkZDAiKSxjPSJBcnJheSBJdGVyYXRvciIsdT1hLnNldCxmPWEuZ2V0dGVyRm9yKGMpO2UuZXhwb3J0cz1zKEFycmF5LCJBcnJheSIsKGZ1bmN0aW9uKGUscil7dSh0aGlzLHt0eXBlOmMsdGFyZ2V0Om4oZSksaW5kZXg6MCxraW5kOnJ9KX0pLChmdW5jdGlvbigpe3ZhciBlPWYodGhpcykscj1lLnRhcmdldCx0PWUua2luZCxuPWUuaW5kZXgrKztyZXR1cm4hcnx8bj49ci5sZW5ndGg/KGUudGFyZ2V0PXZvaWQgMCx7dmFsdWU6dm9pZCAwLGRvbmU6ITB9KToia2V5cyI9PXQ/e3ZhbHVlOm4sZG9uZTohMX06InZhbHVlcyI9PXQ/e3ZhbHVlOnJbbl0sZG9uZTohMX06e3ZhbHVlOltuLHJbbl1dLGRvbmU6ITF9fSksInZhbHVlcyIpLGkuQXJndW1lbnRzPWkuQXJyYXksbygia2V5cyIpLG8oInZhbHVlcyIpLG8oImVudHJpZXMiKX0sZTJjYzpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiNmVlYiIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHIsdCl7Zm9yKHZhciBvIGluIHIpbihlLG8scltvXSx0KTtyZXR1cm4gZX19LGU2Njc6ZnVuY3Rpb24oZSxyKXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dHJ5e3JldHVybntlcnJvcjohMSx2YWx1ZTplKCl9fWNhdGNoKHIpe3JldHVybntlcnJvcjohMCx2YWx1ZTpyfX19fSxlNmNmOmZ1bmN0aW9uKGUscix0KXsidXNlIHN0cmljdCI7dmFyIG4sbyxpLGEscz10KCIyM2U3IiksYz10KCJjNDMwIiksdT10KCJkYTg0IiksZj10KCJkMDY2IiksZz10KCJmZWE5IiksbD10KCI2ZWViIiksbT10KCJlMmNjIikscD10KCJkNDRlIiksZD10KCIyNjI2IiksQT10KCI4NjFkIiksdj10KCIxYzBiIikseD10KCIxOWFhIiksYj10KCI4OTI1IiksaD10KCIyMjY2IikseT10KCIxYzdlIiksdz10KCI0ODQwIiksaj10KCIyY2Y0Iikuc2V0LE89dCgiYjU3NSIpLGs9dCgiY2RmOSIpLFA9dCgiNDRkZSIpLFM9dCgiZjA2OSIpLEU9dCgiZTY2NyIpLFQ9dCgiNjlmMyIpLEM9dCgiOTRjYSIpLF89dCgiYjYyMiIpLEk9dCgiNjA1ZCIpLE09dCgiMmQwMCIpLFI9Xygic3BlY2llcyIpLE49IlByb21pc2UiLEY9VC5nZXQsTD1ULnNldCwkPVQuZ2V0dGVyRm9yKE4pLEI9ZyxVPXUuVHlwZUVycm9yLEQ9dS5kb2N1bWVudCxXPXUucHJvY2Vzcyx6PWYoImZldGNoIikscT1TLmYsRz1xLEg9ISEoRCYmRC5jcmVhdGVFdmVudCYmdS5kaXNwYXRjaEV2ZW50KSxaPSJmdW5jdGlvbiI9PXR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQsVj0idW5oYW5kbGVkcmVqZWN0aW9uIixZPSJyZWplY3Rpb25oYW5kbGVkIixLPTAsWD0xLEo9MixRPTEsZWU9MixyZT1DKE4sKGZ1bmN0aW9uKCl7dmFyIGU9YihCKSE9PVN0cmluZyhCKTtpZighZSl7aWYoNjY9PT1NKXJldHVybiEwO2lmKCFJJiYhWilyZXR1cm4hMH1pZihjJiYhQi5wcm90b3R5cGVbImZpbmFsbHkiXSlyZXR1cm4hMDtpZihNPj01MSYmL25hdGl2ZSBjb2RlLy50ZXN0KEIpKXJldHVybiExO3ZhciByPUIucmVzb2x2ZSgxKSx0PWZ1bmN0aW9uKGUpe2UoKGZ1bmN0aW9uKCl7fSksKGZ1bmN0aW9uKCl7fSkpfSxuPXIuY29uc3RydWN0b3I9e307cmV0dXJuIG5bUl09dCwhKHIudGhlbigoZnVuY3Rpb24oKXt9KSlpbnN0YW5jZW9mIHQpfSkpLHRlPXJlfHwheSgoZnVuY3Rpb24oZSl7Qi5hbGwoZSlbImNhdGNoIl0oKGZ1bmN0aW9uKCl7fSkpfSkpLG5lPWZ1bmN0aW9uKGUpe3ZhciByO3JldHVybiEoIUEoZSl8fCJmdW5jdGlvbiIhPXR5cGVvZihyPWUudGhlbikpJiZyfSxvZT1mdW5jdGlvbihlLHIpe2lmKCFlLm5vdGlmaWVkKXtlLm5vdGlmaWVkPSEwO3ZhciB0PWUucmVhY3Rpb25zO08oKGZ1bmN0aW9uKCl7dmFyIG49ZS52YWx1ZSxvPWUuc3RhdGU9PVgsaT0wO3doaWxlKHQubGVuZ3RoPmkpe3ZhciBhLHMsYyx1PXRbaSsrXSxmPW8/dS5vazp1LmZhaWwsZz11LnJlc29sdmUsbD11LnJlamVjdCxtPXUuZG9tYWluO3RyeXtmPyhvfHwoZS5yZWplY3Rpb249PT1lZSYmY2UoZSksZS5yZWplY3Rpb249USksITA9PT1mP2E9bjoobSYmbS5lbnRlcigpLGE9ZihuKSxtJiYobS5leGl0KCksYz0hMCkpLGE9PT11LnByb21pc2U/bChVKCJQcm9taXNlLWNoYWluIGN5Y2xlIikpOihzPW5lKGEpKT9zLmNhbGwoYSxnLGwpOmcoYSkpOmwobil9Y2F0Y2gocCl7bSYmIWMmJm0uZXhpdCgpLGwocCl9fWUucmVhY3Rpb25zPVtdLGUubm90aWZpZWQ9ITEsciYmIWUucmVqZWN0aW9uJiZhZShlKX0pKX19LGllPWZ1bmN0aW9uKGUscix0KXt2YXIgbixvO0g/KG49RC5jcmVhdGVFdmVudCgiRXZlbnQiKSxuLnByb21pc2U9cixuLnJlYXNvbj10LG4uaW5pdEV2ZW50KGUsITEsITApLHUuZGlzcGF0Y2hFdmVudChuKSk6bj17cHJvbWlzZTpyLHJlYXNvbjp0fSwhWiYmKG89dVsib24iK2VdKT9vKG4pOmU9PT1WJiZQKCJVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24iLHQpfSxhZT1mdW5jdGlvbihlKXtqLmNhbGwodSwoZnVuY3Rpb24oKXt2YXIgcix0PWUuZmFjYWRlLG49ZS52YWx1ZSxvPXNlKGUpO2lmKG8mJihyPUUoKGZ1bmN0aW9uKCl7ST9XLmVtaXQoInVuaGFuZGxlZFJlamVjdGlvbiIsbix0KTppZShWLHQsbil9KSksZS5yZWplY3Rpb249SXx8c2UoZSk/ZWU6USxyLmVycm9yKSl0aHJvdyByLnZhbHVlfSkpfSxzZT1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZWplY3Rpb24hPT1RJiYhZS5wYXJlbnR9LGNlPWZ1bmN0aW9uKGUpe2ouY2FsbCh1LChmdW5jdGlvbigpe3ZhciByPWUuZmFjYWRlO0k/Vy5lbWl0KCJyZWplY3Rpb25IYW5kbGVkIixyKTppZShZLHIsZS52YWx1ZSl9KSl9LHVlPWZ1bmN0aW9uKGUscix0KXtyZXR1cm4gZnVuY3Rpb24obil7ZShyLG4sdCl9fSxmZT1mdW5jdGlvbihlLHIsdCl7ZS5kb25lfHwoZS5kb25lPSEwLHQmJihlPXQpLGUudmFsdWU9cixlLnN0YXRlPUosb2UoZSwhMCkpfSxnZT1mdW5jdGlvbihlLHIsdCl7aWYoIWUuZG9uZSl7ZS5kb25lPSEwLHQmJihlPXQpO3RyeXtpZihlLmZhY2FkZT09PXIpdGhyb3cgVSgiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGYiKTt2YXIgbj1uZShyKTtuP08oKGZ1bmN0aW9uKCl7dmFyIHQ9e2RvbmU6ITF9O3RyeXtuLmNhbGwocix1ZShnZSx0LGUpLHVlKGZlLHQsZSkpfWNhdGNoKG8pe2ZlKHQsbyxlKX19KSk6KGUudmFsdWU9cixlLnN0YXRlPVgsb2UoZSwhMSkpfWNhdGNoKG8pe2ZlKHtkb25lOiExfSxvLGUpfX19O3JlJiYoQj1mdW5jdGlvbihlKXt4KHRoaXMsQixOKSx2KGUpLG4uY2FsbCh0aGlzKTt2YXIgcj1GKHRoaXMpO3RyeXtlKHVlKGdlLHIpLHVlKGZlLHIpKX1jYXRjaCh0KXtmZShyLHQpfX0sbj1mdW5jdGlvbihlKXtMKHRoaXMse3R5cGU6Tixkb25lOiExLG5vdGlmaWVkOiExLHBhcmVudDohMSxyZWFjdGlvbnM6W10scmVqZWN0aW9uOiExLHN0YXRlOkssdmFsdWU6dm9pZCAwfSl9LG4ucHJvdG90eXBlPW0oQi5wcm90b3R5cGUse3RoZW46ZnVuY3Rpb24oZSxyKXt2YXIgdD0kKHRoaXMpLG49cSh3KHRoaXMsQikpO3JldHVybiBuLm9rPSJmdW5jdGlvbiIhPXR5cGVvZiBlfHxlLG4uZmFpbD0iZnVuY3Rpb24iPT10eXBlb2YgciYmcixuLmRvbWFpbj1JP1cuZG9tYWluOnZvaWQgMCx0LnBhcmVudD0hMCx0LnJlYWN0aW9ucy5wdXNoKG4pLHQuc3RhdGUhPUsmJm9lKHQsITEpLG4ucHJvbWlzZX0sY2F0Y2g6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudGhlbih2b2lkIDAsZSl9fSksbz1mdW5jdGlvbigpe3ZhciBlPW5ldyBuLHI9RihlKTt0aGlzLnByb21pc2U9ZSx0aGlzLnJlc29sdmU9dWUoZ2UsciksdGhpcy5yZWplY3Q9dWUoZmUscil9LFMuZj1xPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09Qnx8ZT09PWk/bmV3IG8oZSk6RyhlKX0sY3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGd8fChhPWcucHJvdG90eXBlLnRoZW4sbChnLnByb3RvdHlwZSwidGhlbiIsKGZ1bmN0aW9uKGUscil7dmFyIHQ9dGhpcztyZXR1cm4gbmV3IEIoKGZ1bmN0aW9uKGUscil7YS5jYWxsKHQsZSxyKX0pKS50aGVuKGUscil9KSx7dW5zYWZlOiEwfSksImZ1bmN0aW9uIj09dHlwZW9mIHomJnMoe2dsb2JhbDohMCxlbnVtZXJhYmxlOiEwLGZvcmNlZDohMH0se2ZldGNoOmZ1bmN0aW9uKGUpe3JldHVybiBrKEIsei5hcHBseSh1LGFyZ3VtZW50cykpfX0pKSkscyh7Z2xvYmFsOiEwLHdyYXA6ITAsZm9yY2VkOnJlfSx7UHJvbWlzZTpCfSkscChCLE4sITEsITApLGQoTiksaT1mKE4pLHMoe3RhcmdldDpOLHN0YXQ6ITAsZm9yY2VkOnJlfSx7cmVqZWN0OmZ1bmN0aW9uKGUpe3ZhciByPXEodGhpcyk7cmV0dXJuIHIucmVqZWN0LmNhbGwodm9pZCAwLGUpLHIucHJvbWlzZX19KSxzKHt0YXJnZXQ6TixzdGF0OiEwLGZvcmNlZDpjfHxyZX0se3Jlc29sdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIGsoYyYmdGhpcz09PWk/Qjp0aGlzLGUpfX0pLHMoe3RhcmdldDpOLHN0YXQ6ITAsZm9yY2VkOnRlfSx7YWxsOmZ1bmN0aW9uKGUpe3ZhciByPXRoaXMsdD1xKHIpLG49dC5yZXNvbHZlLG89dC5yZWplY3QsaT1FKChmdW5jdGlvbigpe3ZhciB0PXYoci5yZXNvbHZlKSxpPVtdLGE9MCxzPTE7aChlLChmdW5jdGlvbihlKXt2YXIgYz1hKyssdT0hMTtpLnB1c2godm9pZCAwKSxzKyssdC5jYWxsKHIsZSkudGhlbigoZnVuY3Rpb24oZSl7dXx8KHU9ITAsaVtjXT1lLC0tc3x8bihpKSl9KSxvKX0pKSwtLXN8fG4oaSl9KSk7cmV0dXJuIGkuZXJyb3ImJm8oaS52YWx1ZSksdC5wcm9taXNlfSxyYWNlOmZ1bmN0aW9uKGUpe3ZhciByPXRoaXMsdD1xKHIpLG49dC5yZWplY3Qsbz1FKChmdW5jdGlvbigpe3ZhciBvPXYoci5yZXNvbHZlKTtoKGUsKGZ1bmN0aW9uKGUpe28uY2FsbChyLGUpLnRoZW4odC5yZXNvbHZlLG4pfSkpfSkpO3JldHVybiBvLmVycm9yJiZuKG8udmFsdWUpLHQucHJvbWlzZX19KX0sZTg5MzpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiNTEzNSIpLG89dCgiNTZlZiIpLGk9dCgiMDZjZiIpLGE9dCgiOWJmMiIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHIpe2Zvcih2YXIgdD1vKHIpLHM9YS5mLGM9aS5mLHU9MDt1PHQubGVuZ3RoO3UrKyl7dmFyIGY9dFt1XTtuKGUsZil8fHMoZSxmLGMocixmKSl9fX0sZTk1YTpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiYjYyMiIpLG89dCgiM2Y4YyIpLGk9bigiaXRlcmF0b3IiKSxhPUFycmF5LnByb3RvdHlwZTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PWUmJihvLkFycmF5PT09ZXx8YVtpXT09PWUpfX0sZjA2OTpmdW5jdGlvbihlLHIsdCl7InVzZSBzdHJpY3QiO3ZhciBuPXQoIjFjMGIiKSxvPWZ1bmN0aW9uKGUpe3ZhciByLHQ7dGhpcy5wcm9taXNlPW5ldyBlKChmdW5jdGlvbihlLG4pe2lmKHZvaWQgMCE9PXJ8fHZvaWQgMCE9PXQpdGhyb3cgVHlwZUVycm9yKCJCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvciIpO3I9ZSx0PW59KSksdGhpcy5yZXNvbHZlPW4ociksdGhpcy5yZWplY3Q9bih0KX07ZS5leHBvcnRzLmY9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBvKGUpfX0sZjVkZjpmdW5jdGlvbihlLHIsdCl7dmFyIG49dCgiMDBlZSIpLG89dCgiYzZiNiIpLGk9dCgiYjYyMiIpLGE9aSgidG9TdHJpbmdUYWciKSxzPSJBcmd1bWVudHMiPT1vKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSksYz1mdW5jdGlvbihlLHIpe3RyeXtyZXR1cm4gZVtyXX1jYXRjaCh0KXt9fTtlLmV4cG9ydHM9bj9vOmZ1bmN0aW9uKGUpe3ZhciByLHQsbjtyZXR1cm4gdm9pZCAwPT09ZT8iVW5kZWZpbmVkIjpudWxsPT09ZT8iTnVsbCI6InN0cmluZyI9PXR5cGVvZih0PWMocj1PYmplY3QoZSksYSkpP3Q6cz9vKHIpOiJPYmplY3QiPT0obj1vKHIpKSYmImZ1bmN0aW9uIj09dHlwZW9mIHIuY2FsbGVlPyJBcmd1bWVudHMiOm59fSxmNzcyOmZ1bmN0aW9uKGUscix0KXt2YXIgbj10KCI1NjkyIiksbz10KCI5MGUzIiksaT1uKCJrZXlzIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBpW2VdfHwoaVtlXT1vKGUpKX19LGZjNmE6ZnVuY3Rpb24oZSxyLHQpe3ZhciBuPXQoIjQ0YWQiKSxvPXQoIjFkODAiKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIG4obyhlKSl9fSxmZGJmOmZ1bmN0aW9uKGUscix0KXt2YXIgbj10KCI0OTMwIik7ZS5leHBvcnRzPW4mJiFTeW1ib2wuc2hhbSYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3J9LGZlNzc6ZnVuY3Rpb24oZSxyLHQpeyhmdW5jdGlvbihlKXt0KCJlMjYwIiksdCgiZTZjZiIpLHQoImNjYTYiKSx0KCJhNzlkIiksZS5ydW50aW1lLm9uTWVzc2FnZS5hZGRMaXN0ZW5lcigoZnVuY3Rpb24ocix0LG4pe2NvbnNvbGUubG9nKCJIZWxsbyBmcm9tIHRoZSBiYWNrZ3JvdW5kIiksZS50YWJzLmV4ZWN1dGVTY3JpcHQoe2ZpbGU6ImpzL2NvbnRlbnQtc2NyaXB0LmpzIn0pfSkpfSkuY2FsbCh0aGlzLHQoIjk4NDUiKSl9LGZlYTk6ZnVuY3Rpb24oZSxyLHQpe3ZhciBuPXQoImRhODQiKTtlLmV4cG9ydHM9bi5Qcm9taXNlfX0pOwovLyMgc291cmNlTWFwcGluZ1VSTD1iYWNrZ3JvdW5kLmpzLm1hcA==,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pZTgtZG9tLWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2h0bWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXNwZWNpZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90YXNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGF0aC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtc3ltYm9sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb3duLWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWFzc2lnbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy93ZWJleHRlbnNpb24tcG9seWZpbGwvZGlzdC9icm93c2VyLXBvbHlmaWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy13ZWJvcy13ZWJraXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmZpbmFsbHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9taWNyb3Rhc2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQtc3RvcmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LWdsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wZXJmb3JtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYmFja2dyb3VuZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3IuanMiXSwibmFtZXMiOlsiaW5zdGFsbGVkTW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImV4cG9ydHMiLCJtb2R1bGUiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJ3ZWxsS25vd25TeW1ib2wiLCJUT19TVFJJTkdfVEFHIiwidGVzdCIsIlN0cmluZyIsImFGdW5jdGlvbiIsImZuIiwidGhhdCIsImxlbmd0aCIsInVuZGVmaW5lZCIsImEiLCJiIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJERVNDUklQVE9SUyIsInByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlIiwiY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yIiwidG9JbmRleGVkT2JqZWN0IiwidG9QcmltaXRpdmUiLCJoYXMiLCJJRThfRE9NX0RFRklORSIsIm5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImYiLCJPIiwiUCIsImVycm9yIiwiZmFpbHMiLCJjcmVhdGVFbGVtZW50IiwiaXQiLCJDb25zdHJ1Y3RvciIsIlR5cGVFcnJvciIsImdldEJ1aWx0SW4iLCJJVEVSQVRPUiIsIlNBRkVfQ0xPU0lORyIsImNhbGxlZCIsIml0ZXJhdG9yV2l0aFJldHVybiIsIm5leHQiLCJkb25lIiwidGhpcyIsIkFycmF5IiwiZnJvbSIsImV4ZWMiLCJTS0lQX0NMT1NJTkciLCJJVEVSQVRJT05fU1VQUE9SVCIsInVzZXJBZ2VudCIsImFuT2JqZWN0IiwiaXNBcnJheUl0ZXJhdG9yTWV0aG9kIiwidG9MZW5ndGgiLCJnZXRJdGVyYXRvck1ldGhvZCIsIml0ZXJhdG9yQ2xvc2UiLCJSZXN1bHQiLCJzdG9wcGVkIiwicmVzdWx0IiwiaXRlcmFibGUiLCJ1bmJvdW5kRnVuY3Rpb24iLCJvcHRpb25zIiwiaXRlcmF0b3IiLCJpdGVyRm4iLCJpbmRleCIsInN0ZXAiLCJBU19FTlRSSUVTIiwiSVNfSVRFUkFUT1IiLCJJTlRFUlJVUFRFRCIsInN0b3AiLCJjb25kaXRpb24iLCJjYWxsRm4iLCJ0b0ludGVnZXIiLCJtYXgiLCJNYXRoIiwibWluIiwiaW50ZWdlciIsImdsb2JhbCIsImNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSIsInJlZGVmaW5lIiwic2V0R2xvYmFsIiwiY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyIsImlzRm9yY2VkIiwic291cmNlIiwiRk9SQ0VEIiwidGFyZ2V0IiwidGFyZ2V0UHJvcGVydHkiLCJzb3VyY2VQcm9wZXJ0eSIsImRlc2NyaXB0b3IiLCJUQVJHRVQiLCJHTE9CQUwiLCJTVEFUSUMiLCJzdGF0Iiwibm9UYXJnZXRHZXQiLCJmb3JjZWQiLCJzaGFtIiwiaW50ZXJuYWxPYmplY3RLZXlzIiwiZW51bUJ1Z0tleXMiLCJoaWRkZW5LZXlzIiwiY29uY2F0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImRlZmluZVByb3BlcnR5TW9kdWxlIiwiU1BFQ0lFUyIsIkNPTlNUUlVDVE9SX05BTUUiLCJjb25maWd1cmFibGUiLCJyZXR1cm5NZXRob2QiLCJkZWZlciIsImNoYW5uZWwiLCJwb3J0IiwiaHRtbCIsIklTX0lPUyIsIklTX05PREUiLCJsb2NhdGlvbiIsInNldCIsInNldEltbWVkaWF0ZSIsImNsZWFyIiwiY2xlYXJJbW1lZGlhdGUiLCJwcm9jZXNzIiwiTWVzc2FnZUNoYW5uZWwiLCJEaXNwYXRjaCIsImNvdW50ZXIiLCJxdWV1ZSIsIk9OUkVBRFlTVEFURUNIQU5HRSIsInJ1biIsImlkIiwicnVubmVyIiwibGlzdGVuZXIiLCJldmVudCIsImRhdGEiLCJwb3N0IiwicG9zdE1lc3NhZ2UiLCJwcm90b2NvbCIsImhvc3QiLCJhcmdzIiwicHVzaCIsIkZ1bmN0aW9uIiwibmV4dFRpY2siLCJub3ciLCJwb3J0MiIsInBvcnQxIiwib25tZXNzYWdlIiwiYWRkRXZlbnRMaXN0ZW5lciIsImltcG9ydFNjcmlwdHMiLCJhcHBlbmRDaGlsZCIsInJlbW92ZUNoaWxkIiwic2V0VGltZW91dCIsIm1hdGNoIiwidmVyc2lvbiIsInZlcnNpb25zIiwidjgiLCJzcGxpdCIsImNsYXNzb2YiLCJJdGVyYXRvcnMiLCJvYmplY3RLZXlzIiwiZGVmaW5lUHJvcGVydGllcyIsIlByb3BlcnRpZXMiLCJrZXlzIiwiaXNPYmplY3QiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsIlVOU0NPUEFCTEVTIiwiQXJyYXlQcm90b3R5cGUiLCJjb25zb2xlIiwiZGVmYXVsdENvbnN0cnVjdG9yIiwiUyIsIkMiLCJjb25zdHJ1Y3RvciIsImdldE93blByb3BlcnR5U3ltYm9scyIsInRvQWJzb2x1dGVJbmRleCIsImNyZWF0ZU1ldGhvZCIsIklTX0lOQ0xVREVTIiwiJHRoaXMiLCJlbCIsImZyb21JbmRleCIsImluY2x1ZGVzIiwiaW5kZXhPZiIsImFyZ3VtZW50IiwiSVNfUFVSRSIsInN0b3JlIiwiY29weXJpZ2h0IiwiZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSIsImdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSIsImJpdG1hcCIsIndyaXRhYmxlIiwidG9PYmplY3QiLCJJbmRleGVkT2JqZWN0IiwibmF0aXZlQXNzaWduIiwiYXNzaWduIiwiQSIsIkIiLCJzeW1ib2wiLCJhbHBoYWJldCIsImZvckVhY2giLCJjaHIiLCJqb2luIiwiVCIsImFyZ3VtZW50c0xlbmd0aCIsImoiLCJOQVRJVkVfV0VBS19NQVAiLCJvYmplY3RIYXMiLCJzaGFyZWQiLCJzaGFyZWRLZXkiLCJXZWFrTWFwIiwiZW5mb3JjZSIsImdldHRlckZvciIsIlRZUEUiLCJzdGF0ZSIsInR5cGUiLCJ3bWdldCIsIndtaGFzIiwid21zZXQiLCJtZXRhZGF0YSIsImZhY2FkZSIsIlNUQVRFIiwiaW5zcGVjdFNvdXJjZSIsIkludGVybmFsU3RhdGVNb2R1bGUiLCJnZXRJbnRlcm5hbFN0YXRlIiwiZW5mb3JjZUludGVybmFsU3RhdGUiLCJURU1QTEFURSIsInVuc2FmZSIsInNpbXBsZSIsInJlcXVpcmVPYmplY3RDb2VyY2libGUiLCJhY3RpdmVYRG9jdW1lbnQiLCJkb2N1bWVudENyZWF0ZUVsZW1lbnQiLCJHVCIsIkxUIiwiUFJPVE9UWVBFIiwiU0NSSVBUIiwiSUVfUFJPVE8iLCJFbXB0eUNvbnN0cnVjdG9yIiwic2NyaXB0VGFnIiwiY29udGVudCIsIk51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgiLCJ3cml0ZSIsImNsb3NlIiwidGVtcCIsInBhcmVudFdpbmRvdyIsIk51bGxQcm90b09iamVjdFZpYUlGcmFtZSIsImlmcmFtZURvY3VtZW50IiwiaWZyYW1lIiwiSlMiLCJzdHlsZSIsImRpc3BsYXkiLCJzcmMiLCJjb250ZW50V2luZG93IiwiZG9jdW1lbnQiLCJvcGVuIiwiRiIsIk51bGxQcm90b09iamVjdCIsImRvbWFpbiIsIkFjdGl2ZVhPYmplY3QiLCIkIiwiY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciIsImdldFByb3RvdHlwZU9mIiwic2V0UHJvdG90eXBlT2YiLCJzZXRUb1N0cmluZ1RhZyIsIkl0ZXJhdG9yc0NvcmUiLCJJdGVyYXRvclByb3RvdHlwZSIsIkJVR0dZX1NBRkFSSV9JVEVSQVRPUlMiLCJLRVlTIiwiVkFMVUVTIiwiRU5UUklFUyIsInJldHVyblRoaXMiLCJJdGVyYWJsZSIsIk5BTUUiLCJJdGVyYXRvckNvbnN0cnVjdG9yIiwiREVGQVVMVCIsIklTX1NFVCIsIkN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSIsIm1ldGhvZHMiLCJLRVkiLCJnZXRJdGVyYXRpb25NZXRob2QiLCJLSU5EIiwiZGVmYXVsdEl0ZXJhdG9yIiwiSXRlcmFibGVQcm90b3R5cGUiLCJJTkNPUlJFQ1RfVkFMVUVTX05BTUUiLCJuYXRpdmVJdGVyYXRvciIsImFueU5hdGl2ZUl0ZXJhdG9yIiwiZW50cmllcyIsInZhbHVlcyIsInByb3RvIiwiZnVuY3Rpb25Ub1N0cmluZyIsInRvU3RyaW5nIiwicG9zdGZpeCIsInJhbmRvbSIsInJlcGxhY2VtZW50IiwiZmVhdHVyZSIsImRldGVjdGlvbiIsIm5vcm1hbGl6ZSIsIlBPTFlGSUxMIiwiTkFUSVZFIiwic3RyaW5nIiwicmVwbGFjZSIsInRvTG93ZXJDYXNlIiwiYnJvd3NlciIsImZhY3RvcnkiLCJDSFJPTUVfU0VORF9NRVNTQUdFX0NBTExCQUNLX05PX1JFU1BPTlNFX01FU1NBR0UiLCJTRU5EX1JFU1BPTlNFX0RFUFJFQ0FUSU9OX1dBUk5JTkciLCJ3cmFwQVBJcyIsImV4dGVuc2lvbkFQSXMiLCJhcGlNZXRhZGF0YSIsIkVycm9yIiwiRGVmYXVsdFdlYWtNYXAiLCJjcmVhdGVJdGVtIiwiaXRlbXMiLCJzdXBlciIsImlzVGhlbmFibGUiLCJ0aGVuIiwibWFrZUNhbGxiYWNrIiwicHJvbWlzZSIsImNhbGxiYWNrQXJncyIsInJ1bnRpbWUiLCJsYXN0RXJyb3IiLCJyZWplY3QiLCJzaW5nbGVDYWxsYmFja0FyZyIsInJlc29sdmUiLCJwbHVyYWxpemVBcmd1bWVudHMiLCJudW1BcmdzIiwid3JhcEFzeW5jRnVuY3Rpb24iLCJtaW5BcmdzIiwibWF4QXJncyIsIlByb21pc2UiLCJmYWxsYmFja1RvTm9DYWxsYmFjayIsImNiRXJyb3IiLCJ3YXJuIiwibm9DYWxsYmFjayIsIndyYXBNZXRob2QiLCJtZXRob2QiLCJ3cmFwcGVyIiwiUHJveHkiLCJ0YXJnZXRNZXRob2QiLCJ0aGlzT2JqIiwid3JhcE9iamVjdCIsIndyYXBwZXJzIiwiY2FjaGUiLCJoYW5kbGVycyIsInByb3h5VGFyZ2V0IiwicHJvcCIsInJlY2VpdmVyIiwiZGVzYyIsIlJlZmxlY3QiLCJkZWxldGVQcm9wZXJ0eSIsIndyYXBFdmVudCIsIndyYXBwZXJNYXAiLCJhZGRMaXN0ZW5lciIsImhhc0xpc3RlbmVyIiwicmVtb3ZlTGlzdGVuZXIiLCJsb2dnZWRTZW5kUmVzcG9uc2VEZXByZWNhdGlvbldhcm5pbmciLCJvbk1lc3NhZ2VXcmFwcGVycyIsIm1lc3NhZ2UiLCJzZW5kZXIiLCJzZW5kUmVzcG9uc2UiLCJ3cmFwcGVkU2VuZFJlc3BvbnNlIiwiZGlkQ2FsbFNlbmRSZXNwb25zZSIsInNlbmRSZXNwb25zZVByb21pc2UiLCJyZXNwb25zZSIsInN0YWNrIiwiZXJyIiwiaXNSZXN1bHRUaGVuYWJsZSIsInNlbmRQcm9taXNlZFJlc3VsdCIsIm1zZyIsIl9fbW96V2ViRXh0ZW5zaW9uUG9seWZpbGxSZWplY3RfXyIsImNhdGNoIiwid3JhcHBlZFNlbmRNZXNzYWdlQ2FsbGJhY2siLCJyZXBseSIsIndyYXBwZWRTZW5kTWVzc2FnZSIsImFwaU5hbWVzcGFjZU9iaiIsIndyYXBwZWRDYiIsInNlbmRNZXNzYWdlIiwic3RhdGljV3JhcHBlcnMiLCJvbk1lc3NhZ2UiLCJvbk1lc3NhZ2VFeHRlcm5hbCIsInRhYnMiLCJzZXR0aW5nTWV0YWRhdGEiLCJwcml2YWN5IiwibmV0d29yayIsIm5ldHdvcmtQcmVkaWN0aW9uRW5hYmxlZCIsIndlYlJUQ0lQSGFuZGxpbmdQb2xpY3kiLCJzZXJ2aWNlcyIsInBhc3N3b3JkU2F2aW5nRW5hYmxlZCIsIndlYnNpdGVzIiwiaHlwZXJsaW5rQXVkaXRpbmdFbmFibGVkIiwicmVmZXJyZXJzRW5hYmxlZCIsImNocm9tZSIsIm5hdGl2ZURlZmluZVByb3BlcnR5IiwiQXR0cmlidXRlcyIsImNlaWwiLCJmbG9vciIsImlzTmFOIiwiTmF0aXZlUHJvbWlzZSIsInNwZWNpZXNDb25zdHJ1Y3RvciIsInByb21pc2VSZXNvbHZlIiwiTk9OX0dFTkVSSUMiLCJyZWFsIiwib25GaW5hbGx5IiwiaXNGdW5jdGlvbiIsIngiLCJlIiwiUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlIiwiYXJyYXlJdGVyYXRvciIsIk5FV19JVEVSQVRPUl9QUk9UT1RZUEUiLCJmbHVzaCIsImhlYWQiLCJsYXN0Iiwibm90aWZ5IiwidG9nZ2xlIiwibm9kZSIsIm1hY3JvdGFzayIsIklTX1dFQk9TX1dFQktJVCIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJXZWJLaXRNdXRhdGlvbk9ic2VydmVyIiwicXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yIiwicXVldWVNaWNyb3Rhc2siLCJwYXJlbnQiLCJleGl0IiwiZW50ZXIiLCJjcmVhdGVUZXh0Tm9kZSIsIm9ic2VydmUiLCJjaGFyYWN0ZXJEYXRhIiwidGFzayIsInVpZCIsIk5BVElWRV9TWU1CT0wiLCJVU0VfU1lNQk9MX0FTX1VJRCIsIldlbGxLbm93blN5bWJvbHNTdG9yZSIsImNyZWF0ZVdlbGxLbm93blN5bWJvbCIsIndpdGhvdXRTZXR0ZXIiLCJpbnB1dCIsIlBSRUZFUlJFRF9TVFJJTkciLCJ2YWwiLCJ2YWx1ZU9mIiwic2xpY2UiLCJTSEFSRUQiLCJuYW1lcyIsIkVYSVNUUyIsIm5ld1Byb21pc2VDYXBhYmlsaXR5IiwicHJvbWlzZUNhcGFiaWxpdHkiLCJwYXRoIiwidmFyaWFibGUiLCJuYW1lc3BhY2UiLCJuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSIsIk5BU0hPUk5fQlVHIiwiMSIsIlYiLCJhUG9zc2libGVQcm90b3R5cGUiLCJzZXR0ZXIiLCJDT1JSRUNUX1NFVFRFUiIsIl9fcHJvdG9fXyIsIlRBRyIsImNoZWNrIiwiZ2xvYmFsVGhpcyIsIndpbmRvdyIsInNlbGYiLCJDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIiLCJPYmplY3RQcm90b3R5cGUiLCJhZGRUb1Vuc2NvcGFibGVzIiwiZGVmaW5lSXRlcmF0b3IiLCJBUlJBWV9JVEVSQVRPUiIsInNldEludGVybmFsU3RhdGUiLCJpdGVyYXRlZCIsImtpbmQiLCJBcmd1bWVudHMiLCJJbnRlcm5hbCIsIk93blByb21pc2VDYXBhYmlsaXR5IiwiUHJvbWlzZVdyYXBwZXIiLCJuYXRpdmVUaGVuIiwicmVkZWZpbmVBbGwiLCJzZXRTcGVjaWVzIiwiYW5JbnN0YW5jZSIsIml0ZXJhdGUiLCJjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24iLCJtaWNyb3Rhc2siLCJob3N0UmVwb3J0RXJyb3JzIiwibmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUiLCJwZXJmb3JtIiwiVjhfVkVSU0lPTiIsIlBST01JU0UiLCJnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSIsIlByb21pc2VDb25zdHJ1Y3RvciIsIiRmZXRjaCIsIm5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSIsIkRJU1BBVENIX0VWRU5UIiwiY3JlYXRlRXZlbnQiLCJkaXNwYXRjaEV2ZW50IiwiTkFUSVZFX1JFSkVDVElPTl9FVkVOVCIsIlByb21pc2VSZWplY3Rpb25FdmVudCIsIlVOSEFORExFRF9SRUpFQ1RJT04iLCJSRUpFQ1RJT05fSEFORExFRCIsIlBFTkRJTkciLCJGVUxGSUxMRUQiLCJSRUpFQ1RFRCIsIkhBTkRMRUQiLCJVTkhBTkRMRUQiLCJHTE9CQUxfQ09SRV9KU19QUk9NSVNFIiwiRmFrZVByb21pc2UiLCJJTkNPUlJFQ1RfSVRFUkFUSU9OIiwiYWxsIiwiaXNSZWplY3QiLCJub3RpZmllZCIsImNoYWluIiwicmVhY3Rpb25zIiwib2siLCJleGl0ZWQiLCJyZWFjdGlvbiIsImhhbmRsZXIiLCJmYWlsIiwicmVqZWN0aW9uIiwib25IYW5kbGVVbmhhbmRsZWQiLCJvblVuaGFuZGxlZCIsInJlYXNvbiIsImluaXRFdmVudCIsIklTX1VOSEFORExFRCIsImlzVW5oYW5kbGVkIiwiZW1pdCIsInVud3JhcCIsImludGVybmFsUmVqZWN0IiwiaW50ZXJuYWxSZXNvbHZlIiwiZXhlY3V0b3IiLCJvbkZ1bGZpbGxlZCIsIm9uUmVqZWN0ZWQiLCJmZXRjaCIsIndyYXAiLCJjYXBhYmlsaXR5IiwiJHByb21pc2VSZXNvbHZlIiwicmVtYWluaW5nIiwiYWxyZWFkeUNhbGxlZCIsInJhY2UiLCJvd25LZXlzIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlIiwiUHJvbWlzZUNhcGFiaWxpdHkiLCIkJHJlc29sdmUiLCIkJHJlamVjdCIsIlRPX1NUUklOR19UQUdfU1VQUE9SVCIsImNsYXNzb2ZSYXciLCJDT1JSRUNUX0FSR1VNRU5UUyIsInRyeUdldCIsInRhZyIsImNhbGxlZSIsIl9yZXF1ZXN0IiwiX3NlbmRlciIsIl9zZW5kUmVzcG9uc2UiLCJsb2ciLCJleGVjdXRlU2NyaXB0IiwiZmlsZSJdLCJtYXBwaW5ncyI6ImFBQ0UsSUFBSUEsRUFBbUIsR0FHdkIsU0FBU0MsRUFBb0JDLEdBRzVCLEdBQUdGLEVBQWlCRSxHQUNu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Q0NKVixJQUFJaGQsRUFBUyxFQUFRLFFBRXJCeEcsRUFBT0QsUUFBVXlHLEVBQU9tUCIsImZpbGUiOiJqcy9iYWNrZ3JvdW5kLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCIvXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxKTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgdGVzdCA9IHt9O1xuXG50ZXN0W1RPX1NUUklOR19UQUddID0gJ3onO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmluZyh0ZXN0KSA9PT0gJ1tvYmplY3Qgel0nO1xuIiwidmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG5cbi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQsIGxlbmd0aCkge1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZiAodGhhdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZm47XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCk7XG4gICAgfTtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xuXG52YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yXG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIE8gPSB0b0luZGV4ZWRPYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKGhhcyhPLCBQKSkgcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcighcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcblxuLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjcmVhdGVFbGVtZW50KCdkaXYnKSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9XG4gIH0pLmEgIT0gNztcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIENvbnN0cnVjdG9yLCBuYW1lKSB7XG4gIGlmICghKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvcnJlY3QgJyArIChuYW1lID8gbmFtZSArICcgJyA6ICcnKSArICdpbnZvY2F0aW9uJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsInZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ2RvY3VtZW50JywgJ2RvY3VtZW50RWxlbWVudCcpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgY2FsbGVkID0gMDtcbiAgdmFyIGl0ZXJhdG9yV2l0aFJldHVybiA9IHtcbiAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4geyBkb25lOiAhIWNhbGxlZCsrIH07XG4gICAgfSxcbiAgICAncmV0dXJuJzogZnVuY3Rpb24gKCkge1xuICAgICAgU0FGRV9DTE9TSU5HID0gdHJ1ZTtcbiAgICB9XG4gIH07XG4gIGl0ZXJhdG9yV2l0aFJldHVybltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsXG4gIEFycmF5LmZyb20oaXRlcmF0b3JXaXRoUmV0dXJuLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjLCBTS0lQX0NMT1NJTkcpIHtcbiAgaWYgKCFTS0lQX0NMT1NJTkcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgSVRFUkFUSU9OX1NVUFBPUlQgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgb2JqZWN0ID0ge307XG4gICAgb2JqZWN0W0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4geyBkb25lOiBJVEVSQVRJT05fU1VQUE9SVCA9IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIGV4ZWMob2JqZWN0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gSVRFUkFUSU9OX1NVUFBPUlQ7XG59O1xuIiwidmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IC8oaXBob25lfGlwb2R8aXBhZCkuKmFwcGxld2Via2l0L2kudGVzdCh1c2VyQWdlbnQpO1xuIiwiLy8gYFJlcXVpcmVPYmplY3RDb2VyY2libGVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZXF1aXJlb2JqZWN0Y29lcmNpYmxlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgaXRlcmF0b3JDbG9zZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jbG9zZScpO1xuXG52YXIgUmVzdWx0ID0gZnVuY3Rpb24gKHN0b3BwZWQsIHJlc3VsdCkge1xuICB0aGlzLnN0b3BwZWQgPSBzdG9wcGVkO1xuICB0aGlzLnJlc3VsdCA9IHJlc3VsdDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCB1bmJvdW5kRnVuY3Rpb24sIG9wdGlvbnMpIHtcbiAgdmFyIHRoYXQgPSBvcHRpb25zICYmIG9wdGlvbnMudGhhdDtcbiAgdmFyIEFTX0VOVFJJRVMgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuQVNfRU5UUklFUyk7XG4gIHZhciBJU19JVEVSQVRPUiA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5JU19JVEVSQVRPUik7XG4gIHZhciBJTlRFUlJVUFRFRCA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5JTlRFUlJVUFRFRCk7XG4gIHZhciBmbiA9IGJpbmQodW5ib3VuZEZ1bmN0aW9uLCB0aGF0LCAxICsgQVNfRU5UUklFUyArIElOVEVSUlVQVEVEKTtcbiAgdmFyIGl0ZXJhdG9yLCBpdGVyRm4sIGluZGV4LCBsZW5ndGgsIHJlc3VsdCwgbmV4dCwgc3RlcDtcblxuICB2YXIgc3RvcCA9IGZ1bmN0aW9uIChjb25kaXRpb24pIHtcbiAgICBpZiAoaXRlcmF0b3IpIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IpO1xuICAgIHJldHVybiBuZXcgUmVzdWx0KHRydWUsIGNvbmRpdGlvbik7XG4gIH07XG5cbiAgdmFyIGNhbGxGbiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmIChBU19FTlRSSUVTKSB7XG4gICAgICBhbk9iamVjdCh2YWx1ZSk7XG4gICAgICByZXR1cm4gSU5URVJSVVBURUQgPyBmbih2YWx1ZVswXSwgdmFsdWVbMV0sIHN0b3ApIDogZm4odmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICB9IHJldHVybiBJTlRFUlJVUFRFRCA/IGZuKHZhbHVlLCBzdG9wKSA6IGZuKHZhbHVlKTtcbiAgfTtcblxuICBpZiAoSVNfSVRFUkFUT1IpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhYmxlO1xuICB9IGVsc2Uge1xuICAgIGl0ZXJGbiA9IGdldEl0ZXJhdG9yTWV0aG9kKGl0ZXJhYmxlKTtcbiAgICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoJ1RhcmdldCBpcyBub3QgaXRlcmFibGUnKTtcbiAgICAvLyBvcHRpbWlzYXRpb24gZm9yIGFycmF5IGl0ZXJhdG9yc1xuICAgIGlmIChpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlckZuKSkge1xuICAgICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICAgIHJlc3VsdCA9IGNhbGxGbihpdGVyYWJsZVtpbmRleF0pO1xuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdCBpbnN0YW5jZW9mIFJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpO1xuICAgIH1cbiAgICBpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTtcbiAgfVxuXG4gIG5leHQgPSBpdGVyYXRvci5uZXh0O1xuICB3aGlsZSAoIShzdGVwID0gbmV4dC5jYWxsKGl0ZXJhdG9yKSkuZG9uZSkge1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBjYWxsRm4oc3RlcC52YWx1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVzdWx0ID09ICdvYmplY3QnICYmIHJlc3VsdCAmJiByZXN1bHQgaW5zdGFuY2VvZiBSZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpO1xufTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlcicpO1xuXG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIEhlbHBlciBmb3IgYSBwb3B1bGFyIHJlcGVhdGluZyBjYXNlIG9mIHRoZSBzcGVjOlxuLy8gTGV0IGludGVnZXIgYmUgPyBUb0ludGVnZXIoaW5kZXgpLlxuLy8gSWYgaW50ZWdlciA8IDAsIGxldCByZXN1bHQgYmUgbWF4KChsZW5ndGggKyBpbnRlZ2VyKSwgMCk7IGVsc2UgbGV0IHJlc3VsdCBiZSBtaW4oaW50ZWdlciwgbGVuZ3RoKS5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGluZGV4LCBsZW5ndGgpIHtcbiAgdmFyIGludGVnZXIgPSB0b0ludGVnZXIoaW5kZXgpO1xuICByZXR1cm4gaW50ZWdlciA8IDAgPyBtYXgoaW50ZWdlciArIGxlbmd0aCwgMCkgOiBtaW4oaW50ZWdlciwgbGVuZ3RoKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG5cbi8qXG4gIG9wdGlvbnMudGFyZ2V0ICAgICAgLSBuYW1lIG9mIHRoZSB0YXJnZXQgb2JqZWN0XG4gIG9wdGlvbnMuZ2xvYmFsICAgICAgLSB0YXJnZXQgaXMgdGhlIGdsb2JhbCBvYmplY3RcbiAgb3B0aW9ucy5zdGF0ICAgICAgICAtIGV4cG9ydCBhcyBzdGF0aWMgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5wcm90byAgICAgICAtIGV4cG9ydCBhcyBwcm90b3R5cGUgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5yZWFsICAgICAgICAtIHJlYWwgcHJvdG90eXBlIG1ldGhvZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMuZm9yY2VkICAgICAgLSBleHBvcnQgZXZlbiBpZiB0aGUgbmF0aXZlIGZlYXR1cmUgaXMgYXZhaWxhYmxlXG4gIG9wdGlvbnMuYmluZCAgICAgICAgLSBiaW5kIG1ldGhvZHMgdG8gdGhlIHRhcmdldCwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLndyYXAgICAgICAgIC0gd3JhcCBjb25zdHJ1Y3RvcnMgdG8gcHJldmVudGluZyBnbG9iYWwgcG9sbHV0aW9uLCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMudW5zYWZlICAgICAgLSB1c2UgdGhlIHNpbXBsZSBhc3NpZ25tZW50IG9mIHByb3BlcnR5IGluc3RlYWQgb2YgZGVsZXRlICsgZGVmaW5lUHJvcGVydHlcbiAgb3B0aW9ucy5zaGFtICAgICAgICAtIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgb3B0aW9ucy5lbnVtZXJhYmxlICAtIGV4cG9ydCBhcyBlbnVtZXJhYmxlIHByb3BlcnR5XG4gIG9wdGlvbnMubm9UYXJnZXRHZXQgLSBwcmV2ZW50IGNhbGxpbmcgYSBnZXR0ZXIgb24gdGFyZ2V0XG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7XG4gIHZhciBUQVJHRVQgPSBvcHRpb25zLnRhcmdldDtcbiAgdmFyIEdMT0JBTCA9IG9wdGlvbnMuZ2xvYmFsO1xuICB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0O1xuICB2YXIgRk9SQ0VELCB0YXJnZXQsIGtleSwgdGFyZ2V0UHJvcGVydHksIHNvdXJjZVByb3BlcnR5LCBkZXNjcmlwdG9yO1xuICBpZiAoR0xPQkFMKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKFNUQVRJQykge1xuICAgIHRhcmdldCA9IGdsb2JhbFtUQVJHRVRdIHx8IHNldEdsb2JhbChUQVJHRVQsIHt9KTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQgPSAoZ2xvYmFsW1RBUkdFVF0gfHwge30pLnByb3RvdHlwZTtcbiAgfVxuICBpZiAodGFyZ2V0KSBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICBzb3VyY2VQcm9wZXJ0eSA9IHNvdXJjZVtrZXldO1xuICAgIGlmIChvcHRpb25zLm5vVGFyZ2V0R2V0KSB7XG4gICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbiAgICAgIHRhcmdldFByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0gZWxzZSB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldO1xuICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7XG4gICAgLy8gY29udGFpbmVkIGluIHRhcmdldFxuICAgIGlmICghRk9SQ0VEICYmIHRhcmdldFByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT09IHR5cGVvZiB0YXJnZXRQcm9wZXJ0eSkgY29udGludWU7XG4gICAgICBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzKHNvdXJjZVByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eSk7XG4gICAgfVxuICAgIC8vIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgICBpZiAob3B0aW9ucy5zaGFtIHx8ICh0YXJnZXRQcm9wZXJ0eSAmJiB0YXJnZXRQcm9wZXJ0eS5zaGFtKSkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHNvdXJjZVByb3BlcnR5LCAnc2hhbScsIHRydWUpO1xuICAgIH1cbiAgICAvLyBleHRlbmQgZ2xvYmFsXG4gICAgcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNvdXJjZVByb3BlcnR5LCBvcHRpb25zKTtcbiAgfVxufTtcbiIsInZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbnZhciBoaWRkZW5LZXlzID0gZW51bUJ1Z0tleXMuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eW5hbWVzXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1JfTkFNRSkge1xuICB2YXIgQ29uc3RydWN0b3IgPSBnZXRCdWlsdEluKENPTlNUUlVDVE9SX05BTUUpO1xuICB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mO1xuXG4gIGlmIChERVNDUklQVE9SUyAmJiBDb25zdHJ1Y3RvciAmJiAhQ29uc3RydWN0b3JbU1BFQ0lFU10pIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgU1BFQ0lFUywge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9XG4gICAgfSk7XG4gIH1cbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yKSB7XG4gIHZhciByZXR1cm5NZXRob2QgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gIGlmIChyZXR1cm5NZXRob2QgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBhbk9iamVjdChyZXR1cm5NZXRob2QuY2FsbChpdGVyYXRvcikpLnZhbHVlO1xuICB9XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9odG1sJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIElTX0lPUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtaW9zJyk7XG52YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZScpO1xuXG52YXIgbG9jYXRpb24gPSBnbG9iYWwubG9jYXRpb247XG52YXIgc2V0ID0gZ2xvYmFsLnNldEltbWVkaWF0ZTtcbnZhciBjbGVhciA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgTWVzc2FnZUNoYW5uZWwgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWw7XG52YXIgRGlzcGF0Y2ggPSBnbG9iYWwuRGlzcGF0Y2g7XG52YXIgY291bnRlciA9IDA7XG52YXIgcXVldWUgPSB7fTtcbnZhciBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJztcbnZhciBkZWZlciwgY2hhbm5lbCwgcG9ydDtcblxudmFyIHJ1biA9IGZ1bmN0aW9uIChpZCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gIGlmIChxdWV1ZS5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xuXG52YXIgcnVubmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcnVuKGlkKTtcbiAgfTtcbn07XG5cbnZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkge1xuICBydW4oZXZlbnQuZGF0YSk7XG59O1xuXG52YXIgcG9zdCA9IGZ1bmN0aW9uIChpZCkge1xuICAvLyBvbGQgZW5naW5lcyBoYXZlIG5vdCBsb2NhdGlvbi5vcmlnaW5cbiAgZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsIGxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIGxvY2F0aW9uLmhvc3QpO1xufTtcblxuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYgKCFzZXQgfHwgIWNsZWFyKSB7XG4gIHNldCA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbikge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgdmFyIGkgPSAxO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgICAodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSkuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhciA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKSB7XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgfTtcbiAgLy8gTm9kZS5qcyAwLjgtXG4gIGlmIChJU19OT0RFKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2socnVubmVyKGlkKSk7XG4gICAgfTtcbiAgLy8gU3BoZXJlIChKUyBnYW1lIGVuZ2luZSkgRGlzcGF0Y2ggQVBJXG4gIH0gZWxzZSBpZiAoRGlzcGF0Y2ggJiYgRGlzcGF0Y2gubm93KSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIERpc3BhdGNoLm5vdyhydW5uZXIoaWQpKTtcbiAgICB9O1xuICAvLyBCcm93c2VycyB3aXRoIE1lc3NhZ2VDaGFubmVsLCBpbmNsdWRlcyBXZWJXb3JrZXJzXG4gIC8vIGV4Y2VwdCBpT1MgLSBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjI0XG4gIH0gZWxzZSBpZiAoTWVzc2FnZUNoYW5uZWwgJiYgIUlTX0lPUykge1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gYmluZChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0LCAxKTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZiAoXG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIgJiZcbiAgICB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJlxuICAgICFnbG9iYWwuaW1wb3J0U2NyaXB0cyAmJlxuICAgIGxvY2F0aW9uICYmIGxvY2F0aW9uLnByb3RvY29sICE9PSAnZmlsZTonICYmXG4gICAgIWZhaWxzKHBvc3QpXG4gICkge1xuICAgIGRlZmVyID0gcG9zdDtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmIChPTlJFQURZU1RBVEVDSEFOR0UgaW4gY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgaHRtbC5hcHBlbmRDaGlsZChjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgc2V0VGltZW91dChydW5uZXIoaWQpLCAwKTtcbiAgICB9O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldCxcbiAgY2xlYXI6IGNsZWFyXG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQnKTtcblxudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciB2ZXJzaW9ucyA9IHByb2Nlc3MgJiYgcHJvY2Vzcy52ZXJzaW9ucztcbnZhciB2OCA9IHZlcnNpb25zICYmIHZlcnNpb25zLnY4O1xudmFyIG1hdGNoLCB2ZXJzaW9uO1xuXG5pZiAodjgpIHtcbiAgbWF0Y2ggPSB2OC5zcGxpdCgnLicpO1xuICB2ZXJzaW9uID0gbWF0Y2hbMF0gKyBtYXRjaFsxXTtcbn0gZWxzZSBpZiAodXNlckFnZW50KSB7XG4gIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9FZGdlXFwvKFxcZCspLyk7XG4gIGlmICghbWF0Y2ggfHwgbWF0Y2hbMV0gPj0gNzQpIHtcbiAgICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXFwvKFxcZCspLyk7XG4gICAgaWYgKG1hdGNoKSB2ZXJzaW9uID0gbWF0Y2hbMV07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB2ZXJzaW9uICYmICt2ZXJzaW9uO1xuIiwidmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignbmF2aWdhdG9yJywgJ3VzZXJBZ2VudCcpIHx8ICcnO1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcblxuLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnRpZXNcbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsZW5ndGggPiBpbmRleCkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXkgPSBrZXlzW2luZGV4KytdLCBQcm9wZXJ0aWVzW2tleV0pO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpICYmIGl0ICE9PSBudWxsKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3Qgc2V0IFwiICsgU3RyaW5nKGl0KSArICcgYXMgYSBwcm90b3R5cGUnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsO1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG52YXIgc3BsaXQgPSAnJy5zcGxpdDtcblxuLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3Ncbm1vZHVsZS5leHBvcnRzID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyB0aHJvd3MgYW4gZXJyb3IgaW4gcmhpbm8sIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9yaGluby9pc3N1ZXMvMzQ2XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgcmV0dXJuICFPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKTtcbn0pID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBjbGFzc29mKGl0KSA9PSAnU3RyaW5nJyA/IHNwbGl0LmNhbGwoaXQsICcnKSA6IE9iamVjdChpdCk7XG59IDogT2JqZWN0O1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG52YXIgVU5TQ09QQUJMRVMgPSB3ZWxsS25vd25TeW1ib2woJ3Vuc2NvcGFibGVzJyk7XG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbi8vIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuaWYgKEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXSA9PSB1bmRlZmluZWQpIHtcbiAgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihBcnJheVByb3RvdHlwZSwgVU5TQ09QQUJMRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWU6IGNyZWF0ZShudWxsKVxuICB9KTtcbn1cblxuLy8gYWRkIGEga2V5IHRvIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gIHZhciBjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGU7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gY29uc29sZS5lcnJvcihhKSA6IGNvbnNvbGUuZXJyb3IoYSwgYik7XG4gIH1cbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxuLy8gYFNwZWNpZXNDb25zdHJ1Y3RvcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNwZWNpZXNjb25zdHJ1Y3RvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgZGVmYXVsdENvbnN0cnVjdG9yKSB7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3I7XG4gIHZhciBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IGRlZmF1bHRDb25zdHJ1Y3RvciA6IGFGdW5jdGlvbihTKTtcbn07XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gQ2hyb21lIDM4IFN5bWJvbCBoYXMgaW5jb3JyZWN0IHRvU3RyaW5nIGNvbnZlcnNpb25cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHJldHVybiAhU3RyaW5nKFN5bWJvbCgpKTtcbn0pO1xuIiwidmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgaW5kZXhPZiwgaW5jbHVkZXMgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChJU19JTkNMVURFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBlbCwgZnJvbUluZGV4KSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoJHRoaXMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBpZiAoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpIHdoaWxlIChsZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICBpZiAoKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pICYmIE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xuICBpbmNsdWRlczogY3JlYXRlTWV0aG9kKHRydWUpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmluZGV4T2ZgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmRleG9mXG4gIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZChmYWxzZSlcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcblxudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBgVG9MZW5ndGhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2xlbmd0aFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGFyZ3VtZW50ID4gMCA/IG1pbih0b0ludGVnZXIoYXJndW1lbnQpLCAweDFGRkZGRkZGRkZGRkZGKSA6IDA7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG4iLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07XG4iLCJ2YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgc3RvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pO1xufSkoJ3ZlcnNpb25zJywgW10pLnB1c2goe1xuICB2ZXJzaW9uOiAnMy44LjMnLFxuICBtb2RlOiBJU19QVVJFID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMjEgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiIsInZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG4vLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ1JlZmxlY3QnLCAnb3duS2V5cycpIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpIHtcbiAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlLmYoYW5PYmplY3QoaXQpKTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICByZXR1cm4gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8ga2V5cy5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSkgOiBrZXlzO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzc29mKGdsb2JhbC5wcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xuXG52YXIgbmF0aXZlQXNzaWduID0gT2JqZWN0LmFzc2lnbjtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuLy8gYE9iamVjdC5hc3NpZ25gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuYXNzaWduXG5tb2R1bGUuZXhwb3J0cyA9ICFuYXRpdmVBc3NpZ24gfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBzaG91bGQgaGF2ZSBjb3JyZWN0IG9yZGVyIG9mIG9wZXJhdGlvbnMgKEVkZ2UgYnVnKVxuICBpZiAoREVTQ1JJUFRPUlMgJiYgbmF0aXZlQXNzaWduKHsgYjogMSB9LCBuYXRpdmVBc3NpZ24oZGVmaW5lUHJvcGVydHkoe30sICdhJywge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYicsIHtcbiAgICAgICAgdmFsdWU6IDMsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gIH0pLCB7IGI6IDIgfSkpLmIgIT09IDEpIHJldHVybiB0cnVlO1xuICAvLyBzaG91bGQgd29yayB3aXRoIHN5bWJvbHMgYW5kIHNob3VsZCBoYXZlIGRldGVybWluaXN0aWMgcHJvcGVydHkgb3JkZXIgKFY4IGJ1ZylcbiAgdmFyIEEgPSB7fTtcbiAgdmFyIEIgPSB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHZhciBzeW1ib2wgPSBTeW1ib2woKTtcbiAgdmFyIGFscGhhYmV0ID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0JztcbiAgQVtzeW1ib2xdID0gNztcbiAgYWxwaGFiZXQuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGNocikgeyBCW2Nocl0gPSBjaHI7IH0pO1xuICByZXR1cm4gbmF0aXZlQXNzaWduKHt9LCBBKVtzeW1ib2xdICE9IDcgfHwgb2JqZWN0S2V5cyhuYXRpdmVBc3NpZ24oe30sIEIpKS5qb2luKCcnKSAhPSBhbHBoYWJldDtcbn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIFQgPSB0b09iamVjdCh0YXJnZXQpO1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICB2YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mO1xuICB3aGlsZSAoYXJndW1lbnRzTGVuZ3RoID4gaW5kZXgpIHtcbiAgICB2YXIgUyA9IEluZGV4ZWRPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5U3ltYm9scyA/IG9iamVjdEtleXMoUykuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhTKSkgOiBvYmplY3RLZXlzKFMpO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaikge1xuICAgICAga2V5ID0ga2V5c1tqKytdO1xuICAgICAgaWYgKCFERVNDUklQVE9SUyB8fCBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKFMsIGtleSkpIFRba2V5XSA9IFNba2V5XTtcbiAgICB9XG4gIH0gcmV0dXJuIFQ7XG59IDogbmF0aXZlQXNzaWduO1xuIiwidmFyIE5BVElWRV9XRUFLX01BUCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIG9iamVjdEhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG5cbnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7XG52YXIgc2V0LCBnZXQsIGhhcztcblxudmFyIGVuZm9yY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGhhcyhpdCkgPyBnZXQoaXQpIDogc2V0KGl0LCB7fSk7XG59O1xuXG52YXIgZ2V0dGVyRm9yID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBzdGF0ZTtcbiAgICBpZiAoIWlzT2JqZWN0KGl0KSB8fCAoc3RhdGUgPSBnZXQoaXQpKS50eXBlICE9PSBUWVBFKSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29tcGF0aWJsZSByZWNlaXZlciwgJyArIFRZUEUgKyAnIHJlcXVpcmVkJyk7XG4gICAgfSByZXR1cm4gc3RhdGU7XG4gIH07XG59O1xuXG5pZiAoTkFUSVZFX1dFQUtfTUFQKSB7XG4gIHZhciBzdG9yZSA9IHNoYXJlZC5zdGF0ZSB8fCAoc2hhcmVkLnN0YXRlID0gbmV3IFdlYWtNYXAoKSk7XG4gIHZhciB3bWdldCA9IHN0b3JlLmdldDtcbiAgdmFyIHdtaGFzID0gc3RvcmUuaGFzO1xuICB2YXIgd21zZXQgPSBzdG9yZS5zZXQ7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBtZXRhZGF0YS5mYWNhZGUgPSBpdDtcbiAgICB3bXNldC5jYWxsKHN0b3JlLCBpdCwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHdtZ2V0LmNhbGwoc3RvcmUsIGl0KSB8fCB7fTtcbiAgfTtcbiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHdtaGFzLmNhbGwoc3RvcmUsIGl0KTtcbiAgfTtcbn0gZWxzZSB7XG4gIHZhciBTVEFURSA9IHNoYXJlZEtleSgnc3RhdGUnKTtcbiAgaGlkZGVuS2V5c1tTVEFURV0gPSB0cnVlO1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGl0LCBTVEFURSwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIG9iamVjdEhhcyhpdCwgU1RBVEUpID8gaXRbU1RBVEVdIDoge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBvYmplY3RIYXMoaXQsIFNUQVRFKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBnZXQ6IGdldCxcbiAgaGFzOiBoYXMsXG4gIGVuZm9yY2U6IGVuZm9yY2UsXG4gIGdldHRlckZvcjogZ2V0dGVyRm9yXG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7XG52YXIgaW5zcGVjdFNvdXJjZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZScpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTtcbnZhciBURU1QTEFURSA9IFN0cmluZyhTdHJpbmcpLnNwbGl0KCdTdHJpbmcnKTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgdmFyIHVuc2FmZSA9IG9wdGlvbnMgPyAhIW9wdGlvbnMudW5zYWZlIDogZmFsc2U7XG4gIHZhciBzaW1wbGUgPSBvcHRpb25zID8gISFvcHRpb25zLmVudW1lcmFibGUgOiBmYWxzZTtcbiAgdmFyIG5vVGFyZ2V0R2V0ID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5ub1RhcmdldEdldCA6IGZhbHNlO1xuICB2YXIgc3RhdGU7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmICh0eXBlb2Yga2V5ID09ICdzdHJpbmcnICYmICFoYXModmFsdWUsICduYW1lJykpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSh2YWx1ZSwgJ25hbWUnLCBrZXkpO1xuICAgIH1cbiAgICBzdGF0ZSA9IGVuZm9yY2VJbnRlcm5hbFN0YXRlKHZhbHVlKTtcbiAgICBpZiAoIXN0YXRlLnNvdXJjZSkge1xuICAgICAgc3RhdGUuc291cmNlID0gVEVNUExBVEUuam9pbih0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8ga2V5IDogJycpO1xuICAgIH1cbiAgfVxuICBpZiAoTyA9PT0gZ2xvYmFsKSB7XG4gICAgaWYgKHNpbXBsZSkgT1trZXldID0gdmFsdWU7XG4gICAgZWxzZSBzZXRHbG9iYWwoa2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKCF1bnNhZmUpIHtcbiAgICBkZWxldGUgT1trZXldO1xuICB9IGVsc2UgaWYgKCFub1RhcmdldEdldCAmJiBPW2tleV0pIHtcbiAgICBzaW1wbGUgPSB0cnVlO1xuICB9XG4gIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICBlbHNlIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShPLCBrZXksIHZhbHVlKTtcbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgJiYgZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zb3VyY2UgfHwgaW5zcGVjdFNvdXJjZSh0aGlzKTtcbn0pO1xuIiwiZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbiIsIi8vIElFOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSBbXG4gICdjb25zdHJ1Y3RvcicsXG4gICdoYXNPd25Qcm9wZXJ0eScsXG4gICdpc1Byb3RvdHlwZU9mJyxcbiAgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcbiAgJ3RvTG9jYWxlU3RyaW5nJyxcbiAgJ3RvU3RyaW5nJyxcbiAgJ3ZhbHVlT2YnXG5dO1xuIiwidmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbi8vIGBUb09iamVjdGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvb2JqZWN0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpKTtcbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZGVmaW5lUHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaHRtbCcpO1xudmFyIGRvY3VtZW50Q3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG5cbnZhciBHVCA9ICc+JztcbnZhciBMVCA9ICc8JztcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBTQ1JJUFQgPSAnc2NyaXB0JztcbnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTtcblxudmFyIEVtcHR5Q29uc3RydWN0b3IgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG5cbnZhciBzY3JpcHRUYWcgPSBmdW5jdGlvbiAoY29udGVudCkge1xuICByZXR1cm4gTFQgKyBTQ1JJUFQgKyBHVCArIGNvbnRlbnQgKyBMVCArICcvJyArIFNDUklQVCArIEdUO1xufTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIEFjdGl2ZVggT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYID0gZnVuY3Rpb24gKGFjdGl2ZVhEb2N1bWVudCkge1xuICBhY3RpdmVYRG9jdW1lbnQud3JpdGUoc2NyaXB0VGFnKCcnKSk7XG4gIGFjdGl2ZVhEb2N1bWVudC5jbG9zZSgpO1xuICB2YXIgdGVtcCA9IGFjdGl2ZVhEb2N1bWVudC5wYXJlbnRXaW5kb3cuT2JqZWN0O1xuICBhY3RpdmVYRG9jdW1lbnQgPSBudWxsOyAvLyBhdm9pZCBtZW1vcnkgbGVha1xuICByZXR1cm4gdGVtcDtcbn07XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBOdWxsUHJvdG9PYmplY3RWaWFJRnJhbWUgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSBkb2N1bWVudENyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICB2YXIgSlMgPSAnamF2YScgKyBTQ1JJUFQgKyAnOic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGh0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzQ3NVxuICBpZnJhbWUuc3JjID0gU3RyaW5nKEpTKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJ2RvY3VtZW50LkY9T2JqZWN0JykpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICByZXR1cm4gaWZyYW1lRG9jdW1lbnQuRjtcbn07XG5cbi8vIENoZWNrIGZvciBkb2N1bWVudC5kb21haW4gYW5kIGFjdGl2ZSB4IHN1cHBvcnRcbi8vIE5vIG5lZWQgdG8gdXNlIGFjdGl2ZSB4IGFwcHJvYWNoIHdoZW4gZG9jdW1lbnQuZG9tYWluIGlzIG5vdCBzZXRcbi8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW0vaXNzdWVzLzE1MFxuLy8gdmFyaWF0aW9uIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9raXRjYW1icmlkZ2UvZXM1LXNoaW0vY29tbWl0LzRmNzM4YWMwNjYzNDZcbi8vIGF2b2lkIElFIEdDIGJ1Z1xudmFyIGFjdGl2ZVhEb2N1bWVudDtcbnZhciBOdWxsUHJvdG9PYmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgLyogZ2xvYmFsIEFjdGl2ZVhPYmplY3QgKi9cbiAgICBhY3RpdmVYRG9jdW1lbnQgPSBkb2N1bWVudC5kb21haW4gJiYgbmV3IEFjdGl2ZVhPYmplY3QoJ2h0bWxmaWxlJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGlnbm9yZSAqLyB9XG4gIE51bGxQcm90b09iamVjdCA9IGFjdGl2ZVhEb2N1bWVudCA/IE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgoYWN0aXZlWERvY3VtZW50KSA6IE51bGxQcm90b09iamVjdFZpYUlGcmFtZSgpO1xuICB2YXIgbGVuZ3RoID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB3aGlsZSAobGVuZ3RoLS0pIGRlbGV0ZSBOdWxsUHJvdG9PYmplY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tsZW5ndGhdXTtcbiAgcmV0dXJuIE51bGxQcm90b09iamVjdCgpO1xufTtcblxuaGlkZGVuS2V5c1tJRV9QUk9UT10gPSB0cnVlO1xuXG4vLyBgT2JqZWN0LmNyZWF0ZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5jcmVhdGVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoTyAhPT0gbnVsbCkge1xuICAgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eUNvbnN0cnVjdG9yKCk7XG4gICAgRW1wdHlDb25zdHJ1Y3RvcltQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBOdWxsUHJvdG9PYmplY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRlZmluZVByb3BlcnRpZXMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3RvcicpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciBJdGVyYXRvcnNDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJyk7XG5cbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IEl0ZXJhdG9yc0NvcmUuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IEl0ZXJhdG9yc0NvcmUuQlVHR1lfU0FGQVJJX0lURVJBVE9SUztcbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xudmFyIEVOVFJJRVMgPSAnZW50cmllcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmFibGUsIE5BTUUsIEl0ZXJhdG9yQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7XG4gIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG5cbiAgdmFyIGdldEl0ZXJhdGlvbk1ldGhvZCA9IGZ1bmN0aW9uIChLSU5EKSB7XG4gICAgaWYgKEtJTkQgPT09IERFRkFVTFQgJiYgZGVmYXVsdEl0ZXJhdG9yKSByZXR1cm4gZGVmYXVsdEl0ZXJhdG9yO1xuICAgIGlmICghQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBLSU5EIGluIEl0ZXJhYmxlUHJvdG90eXBlKSByZXR1cm4gSXRlcmFibGVQcm90b3R5cGVbS0lORF07XG4gICAgc3dpdGNoIChLSU5EKSB7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBFTlRSSUVTOiByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMpOyB9O1xuICB9O1xuXG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gZmFsc2U7XG4gIHZhciBJdGVyYWJsZVByb3RvdHlwZSA9IEl0ZXJhYmxlLnByb3RvdHlwZTtcbiAgdmFyIG5hdGl2ZUl0ZXJhdG9yID0gSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdXG4gICAgfHwgSXRlcmFibGVQcm90b3R5cGVbJ0BAaXRlcmF0b3InXVxuICAgIHx8IERFRkFVTFQgJiYgSXRlcmFibGVQcm90b3R5cGVbREVGQVVMVF07XG4gIHZhciBkZWZhdWx0SXRlcmF0b3IgPSAhQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBuYXRpdmVJdGVyYXRvciB8fCBnZXRJdGVyYXRpb25NZXRob2QoREVGQVVMVCk7XG4gIHZhciBhbnlOYXRpdmVJdGVyYXRvciA9IE5BTUUgPT0gJ0FycmF5JyA/IEl0ZXJhYmxlUHJvdG90eXBlLmVudHJpZXMgfHwgbmF0aXZlSXRlcmF0b3IgOiBuYXRpdmVJdGVyYXRvcjtcbiAgdmFyIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgbWV0aG9kcywgS0VZO1xuXG4gIC8vIGZpeCBuYXRpdmVcbiAgaWYgKGFueU5hdGl2ZUl0ZXJhdG9yKSB7XG4gICAgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoYW55TmF0aXZlSXRlcmF0b3IuY2FsbChuZXcgSXRlcmFibGUoKSkpO1xuICAgIGlmIChJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUubmV4dCkge1xuICAgICAgaWYgKCFJU19QVVJFICYmIGdldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSkgIT09IEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgIHNldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSXRlcmF0b3JQcm90b3R5cGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICBpZiAoSVNfUFVSRSkgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgICB9XG4gIH1cblxuICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG4gIGlmIChERUZBVUxUID09IFZBTFVFUyAmJiBuYXRpdmVJdGVyYXRvciAmJiBuYXRpdmVJdGVyYXRvci5uYW1lICE9PSBWQUxVRVMpIHtcbiAgICBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgPSB0cnVlO1xuICAgIGRlZmF1bHRJdGVyYXRvciA9IGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5hdGl2ZUl0ZXJhdG9yLmNhbGwodGhpcyk7IH07XG4gIH1cblxuICAvLyBkZWZpbmUgaXRlcmF0b3JcbiAgaWYgKCghSVNfUFVSRSB8fCBGT1JDRUQpICYmIEl0ZXJhYmxlUHJvdG90eXBlW0lURVJBVE9SXSAhPT0gZGVmYXVsdEl0ZXJhdG9yKSB7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhYmxlUHJvdG90eXBlLCBJVEVSQVRPUiwgZGVmYXVsdEl0ZXJhdG9yKTtcbiAgfVxuICBJdGVyYXRvcnNbTkFNRV0gPSBkZWZhdWx0SXRlcmF0b3I7XG5cbiAgLy8gZXhwb3J0IGFkZGl0aW9uYWwgbWV0aG9kc1xuICBpZiAoREVGQVVMVCkge1xuICAgIG1ldGhvZHMgPSB7XG4gICAgICB2YWx1ZXM6IGdldEl0ZXJhdGlvbk1ldGhvZChWQUxVRVMpLFxuICAgICAga2V5czogSVNfU0VUID8gZGVmYXVsdEl0ZXJhdG9yIDogZ2V0SXRlcmF0aW9uTWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogZ2V0SXRlcmF0aW9uTWV0aG9kKEVOVFJJRVMpXG4gICAgfTtcbiAgICBpZiAoRk9SQ0VEKSBmb3IgKEtFWSBpbiBtZXRob2RzKSB7XG4gICAgICBpZiAoQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfHwgIShLRVkgaW4gSXRlcmFibGVQcm90b3R5cGUpKSB7XG4gICAgICAgIHJlZGVmaW5lKEl0ZXJhYmxlUHJvdG90eXBlLCBLRVksIG1ldGhvZHNbS0VZXSk7XG4gICAgICB9XG4gICAgfSBlbHNlICQoeyB0YXJnZXQ6IE5BTUUsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgfHwgSU5DT1JSRUNUX1ZBTFVFU19OQU1FIH0sIG1ldGhvZHMpO1xuICB9XG5cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG5cbnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7XG5cbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KGluc3BlY3RTb3VyY2UoV2Vha01hcCkpO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG4vLyBEZXRlY3QgSUU4J3MgaW5jb21wbGV0ZSBkZWZpbmVQcm9wZXJ0eSBpbXBsZW1lbnRhdGlvblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAxLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KVsxXSAhPSA3O1xufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTtcbiIsInZhciBzdG9yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcblxudmFyIGZ1bmN0aW9uVG9TdHJpbmcgPSBGdW5jdGlvbi50b1N0cmluZztcblxuLy8gdGhpcyBoZWxwZXIgYnJva2VuIGluIGAzLjQuMS0zLjQuNGAsIHNvIHdlIGNhbid0IHVzZSBgc2hhcmVkYCBoZWxwZXJcbmlmICh0eXBlb2Ygc3RvcmUuaW5zcGVjdFNvdXJjZSAhPSAnZnVuY3Rpb24nKSB7XG4gIHN0b3JlLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb25Ub1N0cmluZy5jYWxsKGl0KTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdG9yZS5pbnNwZWN0U291cmNlO1xuIiwidmFyIGlkID0gMDtcbnZhciBwb3N0Zml4ID0gTWF0aC5yYW5kb20oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcgKyBTdHJpbmcoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSkgKyAnKV8nICsgKCsraWQgKyBwb3N0Zml4KS50b1N0cmluZygzNik7XG59O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIGtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG52YXIgcmVwbGFjZW1lbnQgPSAvI3xcXC5wcm90b3R5cGVcXC4vO1xuXG52YXIgaXNGb3JjZWQgPSBmdW5jdGlvbiAoZmVhdHVyZSwgZGV0ZWN0aW9uKSB7XG4gIHZhciB2YWx1ZSA9IGRhdGFbbm9ybWFsaXplKGZlYXR1cmUpXTtcbiAgcmV0dXJuIHZhbHVlID09IFBPTFlGSUxMID8gdHJ1ZVxuICAgIDogdmFsdWUgPT0gTkFUSVZFID8gZmFsc2VcbiAgICA6IHR5cGVvZiBkZXRlY3Rpb24gPT0gJ2Z1bmN0aW9uJyA/IGZhaWxzKGRldGVjdGlvbilcbiAgICA6ICEhZGV0ZWN0aW9uO1xufTtcblxudmFyIG5vcm1hbGl6ZSA9IGlzRm9yY2VkLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgcmV0dXJuIFN0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVwbGFjZW1lbnQsICcuJykudG9Mb3dlckNhc2UoKTtcbn07XG5cbnZhciBkYXRhID0gaXNGb3JjZWQuZGF0YSA9IHt9O1xudmFyIE5BVElWRSA9IGlzRm9yY2VkLk5BVElWRSA9ICdOJztcbnZhciBQT0xZRklMTCA9IGlzRm9yY2VkLlBPTFlGSUxMID0gJ1AnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRm9yY2VkO1xuIiwiLyoqKiBJTVBPUlRTIEZST00gaW1wb3J0cy1sb2FkZXIgKioqL1xudmFyIGJyb3dzZXIgPSB1bmRlZmluZWQ7XG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShcIndlYmV4dGVuc2lvbi1wb2x5ZmlsbFwiLCBbXCJtb2R1bGVcIl0sIGZhY3RvcnkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgZmFjdG9yeShtb2R1bGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBtb2QgPSB7XG4gICAgICBleHBvcnRzOiB7fVxuICAgIH07XG4gICAgZmFjdG9yeShtb2QpO1xuICAgIGdsb2JhbC5icm93c2VyID0gbW9kLmV4cG9ydHM7XG4gIH1cbn0pKHRoaXMsIGZ1bmN0aW9uIChtb2R1bGUpIHtcbiAgLyogd2ViZXh0ZW5zaW9uLXBvbHlmaWxsIC0gdjAuNC4wIC0gV2VkIEZlYiAwNiAyMDE5IDExOjU4OjMxICovXG4gIC8qIC0qLSBNb2RlOiBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IGpzLWluZGVudC1sZXZlbDogMiAtKi0gKi9cbiAgLyogdmltOiBzZXQgc3RzPTIgc3c9MiBldCB0dz04MDogKi9cbiAgLyogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICAgKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gICAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uICovXG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIGlmICh0eXBlb2YgYnJvd3NlciA9PT0gXCJ1bmRlZmluZWRcIiB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYnJvd3NlcikgIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICBjb25zdCBDSFJPTUVfU0VORF9NRVNTQUdFX0NBTExCQUNLX05PX1JFU1BPTlNFX01FU1NBR0UgPSBcIlRoZSBtZXNzYWdlIHBvcnQgY2xvc2VkIGJlZm9yZSBhIHJlc3BvbnNlIHdhcyByZWNlaXZlZC5cIjtcbiAgICBjb25zdCBTRU5EX1JFU1BPTlNFX0RFUFJFQ0FUSU9OX1dBUk5JTkcgPSBcIlJldHVybmluZyBhIFByb21pc2UgaXMgdGhlIHByZWZlcnJlZCB3YXkgdG8gc2VuZCBhIHJlcGx5IGZyb20gYW4gb25NZXNzYWdlL29uTWVzc2FnZUV4dGVybmFsIGxpc3RlbmVyLCBhcyB0aGUgc2VuZFJlc3BvbnNlIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBzcGVjcyAoU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvTW96aWxsYS9BZGQtb25zL1dlYkV4dGVuc2lvbnMvQVBJL3J1bnRpbWUvb25NZXNzYWdlKVwiO1xuXG4gICAgLy8gV3JhcHBpbmcgdGhlIGJ1bGsgb2YgdGhpcyBwb2x5ZmlsbCBpbiBhIG9uZS10aW1lLXVzZSBmdW5jdGlvbiBpcyBhIG1pbm9yXG4gICAgLy8gb3B0aW1pemF0aW9uIGZvciBGaXJlZm94LiBTaW5jZSBTcGlkZXJtb25rZXkgZG9lcyBub3QgZnVsbHkgcGFyc2UgdGhlXG4gICAgLy8gY29udGVudHMgb2YgYSBmdW5jdGlvbiB1bnRpbCB0aGUgZmlyc3QgdGltZSBpdCdzIGNhbGxlZCwgYW5kIHNpbmNlIGl0IHdpbGxcbiAgICAvLyBuZXZlciBhY3R1YWxseSBuZWVkIHRvIGJlIGNhbGxlZCwgdGhpcyBhbGxvd3MgdGhlIHBvbHlmaWxsIHRvIGJlIGluY2x1ZGVkXG4gICAgLy8gaW4gRmlyZWZveCBuZWFybHkgZm9yIGZyZWUuXG4gICAgY29uc3Qgd3JhcEFQSXMgPSBleHRlbnNpb25BUElzID0+IHtcbiAgICAgIC8vIE5PVEU6IGFwaU1ldGFkYXRhIGlzIGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGFwaS1tZXRhZGF0YS5qc29uIGZpbGVcbiAgICAgIC8vIGF0IGJ1aWxkIHRpbWUgYnkgcmVwbGFjaW5nIHRoZSBmb2xsb3dpbmcgXCJpbmNsdWRlXCIgd2l0aCB0aGUgY29udGVudCBvZiB0aGVcbiAgICAgIC8vIEpTT04gZmlsZS5cbiAgICAgIGNvbnN0IGFwaU1ldGFkYXRhID0ge1xuICAgICAgICBcImFsYXJtc1wiOiB7XG4gICAgICAgICAgXCJjbGVhclwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImNsZWFyQWxsXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZ2V0XCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZ2V0QWxsXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYm9va21hcmtzXCI6IHtcbiAgICAgICAgICBcImNyZWF0ZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImdldFwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImdldENoaWxkcmVuXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZ2V0UmVjZW50XCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZ2V0U3ViVHJlZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImdldFRyZWVcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJtb3ZlXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAyLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVtb3ZlVHJlZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInNlYXJjaFwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInVwZGF0ZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImJyb3dzZXJBY3Rpb25cIjoge1xuICAgICAgICAgIFwiZGlzYWJsZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJmYWxsYmFja1RvTm9DYWxsYmFja1wiOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImVuYWJsZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJmYWxsYmFja1RvTm9DYWxsYmFja1wiOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImdldEJhZGdlQmFja2dyb3VuZENvbG9yXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZ2V0QmFkZ2VUZXh0XCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZ2V0UG9wdXBcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJnZXRUaXRsZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIm9wZW5Qb3B1cFwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInNldEJhZGdlQmFja2dyb3VuZENvbG9yXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgICBcImZhbGxiYWNrVG9Ob0NhbGxiYWNrXCI6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2V0QmFkZ2VUZXh0XCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgICBcImZhbGxiYWNrVG9Ob0NhbGxiYWNrXCI6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2V0SWNvblwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInNldFBvcHVwXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgICBcImZhbGxiYWNrVG9Ob0NhbGxiYWNrXCI6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2V0VGl0bGVcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwiZmFsbGJhY2tUb05vQ2FsbGJhY2tcIjogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJicm93c2luZ0RhdGFcIjoge1xuICAgICAgICAgIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAyLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVtb3ZlQ2FjaGVcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZW1vdmVDb29raWVzXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVtb3ZlRG93bmxvYWRzXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVtb3ZlRm9ybURhdGFcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZW1vdmVIaXN0b3J5XCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVtb3ZlTG9jYWxTdG9yYWdlXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVtb3ZlUGFzc3dvcmRzXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVtb3ZlUGx1Z2luRGF0YVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInNldHRpbmdzXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiY29tbWFuZHNcIjoge1xuICAgICAgICAgIFwiZ2V0QWxsXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiY29udGV4dE1lbnVzXCI6IHtcbiAgICAgICAgICBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlbW92ZUFsbFwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInVwZGF0ZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImNvb2tpZXNcIjoge1xuICAgICAgICAgIFwiZ2V0XCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZ2V0QWxsXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZ2V0QWxsQ29va2llU3RvcmVzXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2V0XCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiZGV2dG9vbHNcIjoge1xuICAgICAgICAgIFwiaW5zcGVjdGVkV2luZG93XCI6IHtcbiAgICAgICAgICAgIFwiZXZhbFwiOiB7XG4gICAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgICBcIm1heEFyZ3NcIjogMixcbiAgICAgICAgICAgICAgXCJzaW5nbGVDYWxsYmFja0FyZ1wiOiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJwYW5lbHNcIjoge1xuICAgICAgICAgICAgXCJjcmVhdGVcIjoge1xuICAgICAgICAgICAgICBcIm1pbkFyZ3NcIjogMyxcbiAgICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDMsXG4gICAgICAgICAgICAgIFwic2luZ2xlQ2FsbGJhY2tBcmdcIjogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb3dubG9hZHNcIjoge1xuICAgICAgICAgIFwiY2FuY2VsXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZG93bmxvYWRcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJlcmFzZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImdldEZpbGVJY29uXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwib3BlblwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJmYWxsYmFja1RvTm9DYWxsYmFja1wiOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInBhdXNlXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVtb3ZlRmlsZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3VtZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInNlYXJjaFwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInNob3dcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwiZmFsbGJhY2tUb05vQ2FsbGJhY2tcIjogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJleHRlbnNpb25cIjoge1xuICAgICAgICAgIFwiaXNBbGxvd2VkRmlsZVNjaGVtZUFjY2Vzc1wiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImlzQWxsb3dlZEluY29nbml0b0FjY2Vzc1wiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImhpc3RvcnlcIjoge1xuICAgICAgICAgIFwiYWRkVXJsXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZGVsZXRlQWxsXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZGVsZXRlUmFuZ2VcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJkZWxldGVVcmxcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJnZXRWaXNpdHNcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJzZWFyY2hcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJpMThuXCI6IHtcbiAgICAgICAgICBcImRldGVjdExhbmd1YWdlXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZ2V0QWNjZXB0TGFuZ3VhZ2VzXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiaWRlbnRpdHlcIjoge1xuICAgICAgICAgIFwibGF1bmNoV2ViQXV0aEZsb3dcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJpZGxlXCI6IHtcbiAgICAgICAgICBcInF1ZXJ5U3RhdGVcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJtYW5hZ2VtZW50XCI6IHtcbiAgICAgICAgICBcImdldFwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImdldEFsbFwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImdldFNlbGZcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJzZXRFbmFibGVkXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAyLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwidW5pbnN0YWxsU2VsZlwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcIm5vdGlmaWNhdGlvbnNcIjoge1xuICAgICAgICAgIFwiY2xlYXJcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJjcmVhdGVcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJnZXRBbGxcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJnZXRQZXJtaXNzaW9uTGV2ZWxcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ1cGRhdGVcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDIsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJwYWdlQWN0aW9uXCI6IHtcbiAgICAgICAgICBcImdldFBvcHVwXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZ2V0VGl0bGVcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJoaWRlXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgICBcImZhbGxiYWNrVG9Ob0NhbGxiYWNrXCI6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2V0SWNvblwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInNldFBvcHVwXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgICBcImZhbGxiYWNrVG9Ob0NhbGxiYWNrXCI6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2V0VGl0bGVcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwiZmFsbGJhY2tUb05vQ2FsbGJhY2tcIjogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJzaG93XCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgICBcImZhbGxiYWNrVG9Ob0NhbGxiYWNrXCI6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwicGVybWlzc2lvbnNcIjoge1xuICAgICAgICAgIFwiY29udGFpbnNcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJnZXRBbGxcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZW1vdmVcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwicnVudGltZVwiOiB7XG4gICAgICAgICAgXCJnZXRCYWNrZ3JvdW5kUGFnZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImdldEJyb3dzZXJJbmZvXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZ2V0UGxhdGZvcm1JbmZvXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwib3Blbk9wdGlvbnNQYWdlXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVxdWVzdFVwZGF0ZUNoZWNrXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2VuZE1lc3NhZ2VcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogM1xuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJzZW5kTmF0aXZlTWVzc2FnZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInNldFVuaW5zdGFsbFVSTFwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInNlc3Npb25zXCI6IHtcbiAgICAgICAgICBcImdldERldmljZXNcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJnZXRSZWNlbnRseUNsb3NlZFwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlc3RvcmVcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzdG9yYWdlXCI6IHtcbiAgICAgICAgICBcImxvY2FsXCI6IHtcbiAgICAgICAgICAgIFwiY2xlYXJcIjoge1xuICAgICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImdldFwiOiB7XG4gICAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZ2V0Qnl0ZXNJblVzZVwiOiB7XG4gICAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZXRcIjoge1xuICAgICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwibWFuYWdlZFwiOiB7XG4gICAgICAgICAgICBcImdldFwiOiB7XG4gICAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZ2V0Qnl0ZXNJblVzZVwiOiB7XG4gICAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJzeW5jXCI6IHtcbiAgICAgICAgICAgIFwiY2xlYXJcIjoge1xuICAgICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImdldFwiOiB7XG4gICAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZ2V0Qnl0ZXNJblVzZVwiOiB7XG4gICAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZXRcIjoge1xuICAgICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwidGFic1wiOiB7XG4gICAgICAgICAgXCJjYXB0dXJlVmlzaWJsZVRhYlwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImNyZWF0ZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImRldGVjdExhbmd1YWdlXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZGlzY2FyZFwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImR1cGxpY2F0ZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImV4ZWN1dGVTY3JpcHRcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJnZXRcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJnZXRDdXJyZW50XCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZ2V0Wm9vbVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImdldFpvb21TZXR0aW5nc1wiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImhpZ2hsaWdodFwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImluc2VydENTU1wiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIm1vdmVcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDIsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJxdWVyeVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlbG9hZFwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlbW92ZUNTU1wiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInNlbmRNZXNzYWdlXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAyLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDNcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2V0Wm9vbVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInNldFpvb21TZXR0aW5nc1wiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInVwZGF0ZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInRvcFNpdGVzXCI6IHtcbiAgICAgICAgICBcImdldFwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcIndlYk5hdmlnYXRpb25cIjoge1xuICAgICAgICAgIFwiZ2V0QWxsRnJhbWVzXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZ2V0RnJhbWVcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJ3ZWJSZXF1ZXN0XCI6IHtcbiAgICAgICAgICBcImhhbmRsZXJCZWhhdmlvckNoYW5nZWRcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJ3aW5kb3dzXCI6IHtcbiAgICAgICAgICBcImNyZWF0ZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImdldFwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImdldEFsbFwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImdldEN1cnJlbnRcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJnZXRMYXN0Rm9jdXNlZFwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInVwZGF0ZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAoT2JqZWN0LmtleXMoYXBpTWV0YWRhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhcGktbWV0YWRhdGEuanNvbiBoYXMgbm90IGJlZW4gaW5jbHVkZWQgaW4gYnJvd3Nlci1wb2x5ZmlsbFwiKTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBBIFdlYWtNYXAgc3ViY2xhc3Mgd2hpY2ggY3JlYXRlcyBhbmQgc3RvcmVzIGEgdmFsdWUgZm9yIGFueSBrZXkgd2hpY2ggZG9lc1xuICAgICAgICogbm90IGV4aXN0IHdoZW4gYWNjZXNzZWQsIGJ1dCBiZWhhdmVzIGV4YWN0bHkgYXMgYW4gb3JkaW5hcnkgV2Vha01hcFxuICAgICAgICogb3RoZXJ3aXNlLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNyZWF0ZUl0ZW1cbiAgICAgICAqICAgICAgICBBIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgdmFsdWUgZm9yIGFueVxuICAgICAgICogICAgICAgIGtleSB3aGljaCBkb2VzIG5vdCBleGlzdCwgdGhlIGZpcnN0IHRpbWUgaXQgaXMgYWNjZXNzZWQuIFRoZVxuICAgICAgICogICAgICAgIGZ1bmN0aW9uIHJlY2VpdmVzLCBhcyBpdHMgb25seSBhcmd1bWVudCwgdGhlIGtleSBiZWluZyBjcmVhdGVkLlxuICAgICAgICovXG4gICAgICBjbGFzcyBEZWZhdWx0V2Vha01hcCBleHRlbmRzIFdlYWtNYXAge1xuICAgICAgICBjb25zdHJ1Y3RvcihjcmVhdGVJdGVtLCBpdGVtcyA9IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHN1cGVyKGl0ZW1zKTtcbiAgICAgICAgICB0aGlzLmNyZWF0ZUl0ZW0gPSBjcmVhdGVJdGVtO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0KGtleSkge1xuICAgICAgICAgIGlmICghdGhpcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB0aGlzLmNyZWF0ZUl0ZW0oa2V5KSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN1cGVyLmdldChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgYW4gb2JqZWN0IHdpdGggYSBgdGhlbmAgbWV0aG9kLCBhbmQgY2FuXG4gICAgICAgKiB0aGVyZWZvcmUgYmUgYXNzdW1lZCB0byBiZWhhdmUgYXMgYSBQcm9taXNlLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3QuXG4gICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdGhlbmFibGUuXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGlzVGhlbmFibGUgPSB2YWx1ZSA9PiB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgIH07XG5cbiAgICAgIC8qKlxuICAgICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHdoaWNoLCB3aGVuIGNhbGxlZCwgd2lsbCByZXNvbHZlIG9yIHJlamVjdFxuICAgICAgICogdGhlIGdpdmVuIHByb21pc2UgYmFzZWQgb24gaG93IGl0IGlzIGNhbGxlZDpcbiAgICAgICAqXG4gICAgICAgKiAtIElmLCB3aGVuIGNhbGxlZCwgYGNocm9tZS5ydW50aW1lLmxhc3RFcnJvcmAgY29udGFpbnMgYSBub24tbnVsbCBvYmplY3QsXG4gICAgICAgKiAgIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkIHdpdGggdGhhdCB2YWx1ZS5cbiAgICAgICAqIC0gSWYgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGV4YWN0bHkgb25lIGFyZ3VtZW50LCB0aGUgcHJvbWlzZSBpc1xuICAgICAgICogICByZXNvbHZlZCB0byB0aGF0IHZhbHVlLlxuICAgICAgICogLSBPdGhlcndpc2UsIHRoZSBwcm9taXNlIGlzIHJlc29sdmVkIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZVxuICAgICAgICogICBmdW5jdGlvbidzIGFyZ3VtZW50cy5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge29iamVjdH0gcHJvbWlzZVxuICAgICAgICogICAgICAgIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSByZXNvbHV0aW9uIGFuZCByZWplY3Rpb24gZnVuY3Rpb25zIG9mIGFcbiAgICAgICAqICAgICAgICBwcm9taXNlLlxuICAgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gcHJvbWlzZS5yZXNvbHZlXG4gICAgICAgKiAgICAgICAgVGhlIHByb21pc2UncyByZXNvbHV0aW9uIGZ1bmN0aW9uLlxuICAgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gcHJvbWlzZS5yZWplY3Rpb25cbiAgICAgICAqICAgICAgICBUaGUgcHJvbWlzZSdzIHJlamVjdGlvbiBmdW5jdGlvbi5cbiAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBtZXRhZGF0YVxuICAgICAgICogICAgICAgIE1ldGFkYXRhIGFib3V0IHRoZSB3cmFwcGVkIG1ldGhvZCB3aGljaCBoYXMgY3JlYXRlZCB0aGUgY2FsbGJhY2suXG4gICAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IG1ldGFkYXRhLm1heFJlc29sdmVkQXJnc1xuICAgICAgICogICAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhcmd1bWVudHMgd2hpY2ggbWF5IGJlIHBhc3NlZCB0byB0aGVcbiAgICAgICAqICAgICAgICBjYWxsYmFjayBjcmVhdGVkIGJ5IHRoZSB3cmFwcGVkIGFzeW5jIGZ1bmN0aW9uLlxuICAgICAgICpcbiAgICAgICAqIEByZXR1cm5zIHtmdW5jdGlvbn1cbiAgICAgICAqICAgICAgICBUaGUgZ2VuZXJhdGVkIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAgICovXG4gICAgICBjb25zdCBtYWtlQ2FsbGJhY2sgPSAocHJvbWlzZSwgbWV0YWRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuICguLi5jYWxsYmFja0FyZ3MpID0+IHtcbiAgICAgICAgICBpZiAoZXh0ZW5zaW9uQVBJcy5ydW50aW1lLmxhc3RFcnJvcikge1xuICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXh0ZW5zaW9uQVBJcy5ydW50aW1lLmxhc3RFcnJvcik7XG4gICAgICAgICAgfSBlbHNlIGlmIChtZXRhZGF0YS5zaW5nbGVDYWxsYmFja0FyZyB8fCBjYWxsYmFja0FyZ3MubGVuZ3RoIDw9IDEgJiYgbWV0YWRhdGEuc2luZ2xlQ2FsbGJhY2tBcmcgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBwcm9taXNlLnJlc29sdmUoY2FsbGJhY2tBcmdzWzBdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJvbWlzZS5yZXNvbHZlKGNhbGxiYWNrQXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfTtcblxuICAgICAgY29uc3QgcGx1cmFsaXplQXJndW1lbnRzID0gbnVtQXJncyA9PiBudW1BcmdzID09IDEgPyBcImFyZ3VtZW50XCIgOiBcImFyZ3VtZW50c1wiO1xuXG4gICAgICAvKipcbiAgICAgICAqIENyZWF0ZXMgYSB3cmFwcGVyIGZ1bmN0aW9uIGZvciBhIG1ldGhvZCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBtZXRhZGF0YS5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAgICogICAgICAgIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgd2hpY2ggaXMgYmVpbmcgd3JhcHBlZC5cbiAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBtZXRhZGF0YVxuICAgICAgICogICAgICAgIE1ldGFkYXRhIGFib3V0IHRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZC5cbiAgICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gbWV0YWRhdGEubWluQXJnc1xuICAgICAgICogICAgICAgIFRoZSBtaW5pbXVtIG51bWJlciBvZiBhcmd1bWVudHMgd2hpY2ggbXVzdCBiZSBwYXNzZWQgdG8gdGhlXG4gICAgICAgKiAgICAgICAgZnVuY3Rpb24uIElmIGNhbGxlZCB3aXRoIGZld2VyIHRoYW4gdGhpcyBudW1iZXIgb2YgYXJndW1lbnRzLCB0aGVcbiAgICAgICAqICAgICAgICB3cmFwcGVyIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uLlxuICAgICAgICogQHBhcmFtIHtpbnRlZ2VyfSBtZXRhZGF0YS5tYXhBcmdzXG4gICAgICAgKiAgICAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cyB3aGljaCBtYXkgYmUgcGFzc2VkIHRvIHRoZVxuICAgICAgICogICAgICAgIGZ1bmN0aW9uLiBJZiBjYWxsZWQgd2l0aCBtb3JlIHRoYW4gdGhpcyBudW1iZXIgb2YgYXJndW1lbnRzLCB0aGVcbiAgICAgICAqICAgICAgICB3cmFwcGVyIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uLlxuICAgICAgICogQHBhcmFtIHtpbnRlZ2VyfSBtZXRhZGF0YS5tYXhSZXNvbHZlZEFyZ3NcbiAgICAgICAqICAgICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXJndW1lbnRzIHdoaWNoIG1heSBiZSBwYXNzZWQgdG8gdGhlXG4gICAgICAgKiAgICAgICAgY2FsbGJhY2sgY3JlYXRlZCBieSB0aGUgd3JhcHBlZCBhc3luYyBmdW5jdGlvbi5cbiAgICAgICAqXG4gICAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24ob2JqZWN0LCAuLi4qKX1cbiAgICAgICAqICAgICAgIFRoZSBnZW5lcmF0ZWQgd3JhcHBlciBmdW5jdGlvbi5cbiAgICAgICAqL1xuICAgICAgY29uc3Qgd3JhcEFzeW5jRnVuY3Rpb24gPSAobmFtZSwgbWV0YWRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGFzeW5jRnVuY3Rpb25XcmFwcGVyKHRhcmdldCwgLi4uYXJncykge1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IG1ldGFkYXRhLm1pbkFyZ3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3QgJHttZXRhZGF0YS5taW5BcmdzfSAke3BsdXJhbGl6ZUFyZ3VtZW50cyhtZXRhZGF0YS5taW5BcmdzKX0gZm9yICR7bmFtZX0oKSwgZ290ICR7YXJncy5sZW5ndGh9YCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gbWV0YWRhdGEubWF4QXJncykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhdCBtb3N0ICR7bWV0YWRhdGEubWF4QXJnc30gJHtwbHVyYWxpemVBcmd1bWVudHMobWV0YWRhdGEubWF4QXJncyl9IGZvciAke25hbWV9KCksIGdvdCAke2FyZ3MubGVuZ3RofWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEuZmFsbGJhY2tUb05vQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBBUEkgbWV0aG9kIGhhcyBjdXJyZW50bHkgbm8gY2FsbGJhY2sgb24gQ2hyb21lLCBidXQgaXQgcmV0dXJuIGEgcHJvbWlzZSBvbiBGaXJlZm94LFxuICAgICAgICAgICAgICAvLyBhbmQgc28gdGhlIHBvbHlmaWxsIHdpbGwgdHJ5IHRvIGNhbGwgaXQgd2l0aCBhIGNhbGxiYWNrIGZpcnN0LCBhbmQgaXQgd2lsbCBmYWxsYmFja1xuICAgICAgICAgICAgICAvLyB0byBub3QgcGFzc2luZyB0aGUgY2FsbGJhY2sgaWYgdGhlIGZpcnN0IGNhbGwgZmFpbHMuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W25hbWVdKC4uLmFyZ3MsIG1ha2VDYWxsYmFjayh7IHJlc29sdmUsIHJlamVjdCB9LCBtZXRhZGF0YSkpO1xuICAgICAgICAgICAgICB9IGNhdGNoIChjYkVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGAke25hbWV9IEFQSSBtZXRob2QgZG9lc24ndCBzZWVtIHRvIHN1cHBvcnQgdGhlIGNhbGxiYWNrIHBhcmFtZXRlciwgYCArIFwiZmFsbGluZyBiYWNrIHRvIGNhbGwgaXQgd2l0aG91dCBhIGNhbGxiYWNrOiBcIiwgY2JFcnJvcik7XG5cbiAgICAgICAgICAgICAgICB0YXJnZXRbbmFtZV0oLi4uYXJncyk7XG5cbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIEFQSSBtZXRob2QgbWV0YWRhdGEsIHNvIHRoYXQgdGhlIG5leHQgQVBJIGNhbGxzIHdpbGwgbm90IHRyeSB0b1xuICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgdW5zdXBwb3J0ZWQgY2FsbGJhY2sgYW55bW9yZS5cbiAgICAgICAgICAgICAgICBtZXRhZGF0YS5mYWxsYmFja1RvTm9DYWxsYmFjayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhLm5vQ2FsbGJhY2sgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGFkYXRhLm5vQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgdGFyZ2V0W25hbWVdKC4uLmFyZ3MpO1xuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0YXJnZXRbbmFtZV0oLi4uYXJncywgbWFrZUNhbGxiYWNrKHsgcmVzb2x2ZSwgcmVqZWN0IH0sIG1ldGFkYXRhKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICB9O1xuXG4gICAgICAvKipcbiAgICAgICAqIFdyYXBzIGFuIGV4aXN0aW5nIG1ldGhvZCBvZiB0aGUgdGFyZ2V0IG9iamVjdCwgc28gdGhhdCBjYWxscyB0byBpdCBhcmVcbiAgICAgICAqIGludGVyY2VwdGVkIGJ5IHRoZSBnaXZlbiB3cmFwcGVyIGZ1bmN0aW9uLiBUaGUgd3JhcHBlciBmdW5jdGlvbiByZWNlaXZlcyxcbiAgICAgICAqIGFzIGl0cyBmaXJzdCBhcmd1bWVudCwgdGhlIG9yaWdpbmFsIGB0YXJnZXRgIG9iamVjdCwgZm9sbG93ZWQgYnkgZWFjaCBvZlxuICAgICAgICogdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIG9yaWdpbmFsIG1ldGhvZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0XG4gICAgICAgKiAgICAgICAgVGhlIG9yaWdpbmFsIHRhcmdldCBvYmplY3QgdGhhdCB0aGUgd3JhcHBlZCBtZXRob2QgYmVsb25ncyB0by5cbiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IG1ldGhvZFxuICAgICAgICogICAgICAgIFRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZC4gVGhpcyBpcyB1c2VkIGFzIHRoZSB0YXJnZXQgb2YgdGhlIFByb3h5XG4gICAgICAgKiAgICAgICAgb2JqZWN0IHdoaWNoIGlzIGNyZWF0ZWQgdG8gd3JhcCB0aGUgbWV0aG9kLlxuICAgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gd3JhcHBlclxuICAgICAgICogICAgICAgIFRoZSB3cmFwcGVyIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBpbiBwbGFjZSBvZiBhIGRpcmVjdCBpbnZvY2F0aW9uXG4gICAgICAgKiAgICAgICAgb2YgdGhlIHdyYXBwZWQgbWV0aG9kLlxuICAgICAgICpcbiAgICAgICAqIEByZXR1cm5zIHtQcm94eTxmdW5jdGlvbj59XG4gICAgICAgKiAgICAgICAgQSBQcm94eSBvYmplY3QgZm9yIHRoZSBnaXZlbiBtZXRob2QsIHdoaWNoIGludm9rZXMgdGhlIGdpdmVuIHdyYXBwZXJcbiAgICAgICAqICAgICAgICBtZXRob2QgaW4gaXRzIHBsYWNlLlxuICAgICAgICovXG4gICAgICBjb25zdCB3cmFwTWV0aG9kID0gKHRhcmdldCwgbWV0aG9kLCB3cmFwcGVyKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkobWV0aG9kLCB7XG4gICAgICAgICAgYXBwbHkodGFyZ2V0TWV0aG9kLCB0aGlzT2JqLCBhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm4gd3JhcHBlci5jYWxsKHRoaXNPYmosIHRhcmdldCwgLi4uYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGxldCBoYXNPd25Qcm9wZXJ0eSA9IEZ1bmN0aW9uLmNhbGwuYmluZChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcblxuICAgICAgLyoqXG4gICAgICAgKiBXcmFwcyBhbiBvYmplY3QgaW4gYSBQcm94eSB3aGljaCBpbnRlcmNlcHRzIGFuZCB3cmFwcyBjZXJ0YWluIG1ldGhvZHNcbiAgICAgICAqIGJhc2VkIG9uIHRoZSBnaXZlbiBgd3JhcHBlcnNgIGFuZCBgbWV0YWRhdGFgIG9iamVjdHMuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtvYmplY3R9IHRhcmdldFxuICAgICAgICogICAgICAgIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHdyYXAuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtvYmplY3R9IFt3cmFwcGVycyA9IHt9XVxuICAgICAgICogICAgICAgIEFuIG9iamVjdCB0cmVlIGNvbnRhaW5pbmcgd3JhcHBlciBmdW5jdGlvbnMgZm9yIHNwZWNpYWwgY2FzZXMuIEFueVxuICAgICAgICogICAgICAgIGZ1bmN0aW9uIHByZXNlbnQgaW4gdGhpcyBvYmplY3QgdHJlZSBpcyBjYWxsZWQgaW4gcGxhY2Ugb2YgdGhlXG4gICAgICAgKiAgICAgICAgbWV0aG9kIGluIHRoZSBzYW1lIGxvY2F0aW9uIGluIHRoZSBgdGFyZ2V0YCBvYmplY3QgdHJlZS4gVGhlc2VcbiAgICAgICAqICAgICAgICB3cmFwcGVyIG1ldGhvZHMgYXJlIGludm9rZWQgYXMgZGVzY3JpYmVkIGluIHtAc2VlIHdyYXBNZXRob2R9LlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbbWV0YWRhdGEgPSB7fV1cbiAgICAgICAqICAgICAgICBBbiBvYmplY3QgdHJlZSBjb250YWluaW5nIG1ldGFkYXRhIHVzZWQgdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZVxuICAgICAgICogICAgICAgIFByb21pc2UtYmFzZWQgd3JhcHBlciBmdW5jdGlvbnMgZm9yIGFzeW5jaHJvbm91cy4gQW55IGZ1bmN0aW9uIGluXG4gICAgICAgKiAgICAgICAgdGhlIGB0YXJnZXRgIG9iamVjdCB0cmVlIHdoaWNoIGhhcyBhIGNvcnJlc3BvbmRpbmcgbWV0YWRhdGEgb2JqZWN0XG4gICAgICAgKiAgICAgICAgaW4gdGhlIHNhbWUgbG9jYXRpb24gaW4gdGhlIGBtZXRhZGF0YWAgdHJlZSBpcyByZXBsYWNlZCB3aXRoIGFuXG4gICAgICAgKiAgICAgICAgYXV0b21hdGljYWxseS1nZW5lcmF0ZWQgd3JhcHBlciBmdW5jdGlvbiwgYXMgZGVzY3JpYmVkIGluXG4gICAgICAgKiAgICAgICAge0BzZWUgd3JhcEFzeW5jRnVuY3Rpb259XG4gICAgICAgKlxuICAgICAgICogQHJldHVybnMge1Byb3h5PG9iamVjdD59XG4gICAgICAgKi9cbiAgICAgIGNvbnN0IHdyYXBPYmplY3QgPSAodGFyZ2V0LCB3cmFwcGVycyA9IHt9LCBtZXRhZGF0YSA9IHt9KSA9PiB7XG4gICAgICAgIGxldCBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGxldCBoYW5kbGVycyA9IHtcbiAgICAgICAgICBoYXMocHJveHlUYXJnZXQsIHByb3ApIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9wIGluIHRhcmdldCB8fCBwcm9wIGluIGNhY2hlO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBnZXQocHJveHlUYXJnZXQsIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgICAgICAgICBpZiAocHJvcCBpbiBjYWNoZSkge1xuICAgICAgICAgICAgICByZXR1cm4gY2FjaGVbcHJvcF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghKHByb3AgaW4gdGFyZ2V0KSkge1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSB0YXJnZXRbcHJvcF07XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgbWV0aG9kIG9uIHRoZSB1bmRlcmx5aW5nIG9iamVjdC4gQ2hlY2sgaWYgd2UgbmVlZCB0byBkb1xuICAgICAgICAgICAgICAvLyBhbnkgd3JhcHBpbmcuXG5cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3cmFwcGVyc1twcm9wXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIHNwZWNpYWwtY2FzZSB3cmFwcGVyIGZvciB0aGlzIG1ldGhvZC5cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHdyYXBNZXRob2QodGFyZ2V0LCB0YXJnZXRbcHJvcF0sIHdyYXBwZXJzW3Byb3BdKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChoYXNPd25Qcm9wZXJ0eShtZXRhZGF0YSwgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGFuIGFzeW5jIG1ldGhvZCB0aGF0IHdlIGhhdmUgbWV0YWRhdGEgZm9yLiBDcmVhdGUgYVxuICAgICAgICAgICAgICAgIC8vIFByb21pc2Ugd3JhcHBlciBmb3IgaXQuXG4gICAgICAgICAgICAgICAgbGV0IHdyYXBwZXIgPSB3cmFwQXN5bmNGdW5jdGlvbihwcm9wLCBtZXRhZGF0YVtwcm9wXSk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB3cmFwTWV0aG9kKHRhcmdldCwgdGFyZ2V0W3Byb3BdLCB3cmFwcGVyKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgbWV0aG9kIHRoYXQgd2UgZG9uJ3Qga25vdyBvciBjYXJlIGFib3V0LiBSZXR1cm4gdGhlXG4gICAgICAgICAgICAgICAgLy8gb3JpZ2luYWwgbWV0aG9kLCBib3VuZCB0byB0aGUgdW5kZXJseWluZyBvYmplY3QuXG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5iaW5kKHRhcmdldCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmIChoYXNPd25Qcm9wZXJ0eSh3cmFwcGVycywgcHJvcCkgfHwgaGFzT3duUHJvcGVydHkobWV0YWRhdGEsIHByb3ApKSkge1xuICAgICAgICAgICAgICAvLyBUaGlzIGlzIGFuIG9iamVjdCB0aGF0IHdlIG5lZWQgdG8gZG8gc29tZSB3cmFwcGluZyBmb3IgdGhlIGNoaWxkcmVuXG4gICAgICAgICAgICAgIC8vIG9mLiBDcmVhdGUgYSBzdWItb2JqZWN0IHdyYXBwZXIgZm9yIGl0IHdpdGggdGhlIGFwcHJvcHJpYXRlIGNoaWxkXG4gICAgICAgICAgICAgIC8vIG1ldGFkYXRhLlxuICAgICAgICAgICAgICB2YWx1ZSA9IHdyYXBPYmplY3QodmFsdWUsIHdyYXBwZXJzW3Byb3BdLCBtZXRhZGF0YVtwcm9wXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGRvIGFueSB3cmFwcGluZyBmb3IgdGhpcyBwcm9wZXJ0eSxcbiAgICAgICAgICAgICAgLy8gc28ganVzdCBmb3J3YXJkIGFsbCBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgb2JqZWN0LlxuICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2FjaGUsIHByb3AsIHtcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0W3Byb3BdO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FjaGVbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgc2V0KHByb3h5VGFyZ2V0LCBwcm9wLCB2YWx1ZSwgcmVjZWl2ZXIpIHtcbiAgICAgICAgICAgIGlmIChwcm9wIGluIGNhY2hlKSB7XG4gICAgICAgICAgICAgIGNhY2hlW3Byb3BdID0gdmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0YXJnZXRbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBkZWZpbmVQcm9wZXJ0eShwcm94eVRhcmdldCwgcHJvcCwgZGVzYykge1xuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoY2FjaGUsIHByb3AsIGRlc2MpO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBkZWxldGVQcm9wZXJ0eShwcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoY2FjaGUsIHByb3ApO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBQZXIgY29udHJhY3Qgb2YgdGhlIFByb3h5IEFQSSwgdGhlIFwiZ2V0XCIgcHJveHkgaGFuZGxlciBtdXN0IHJldHVybiB0aGVcbiAgICAgICAgLy8gb3JpZ2luYWwgdmFsdWUgb2YgdGhlIHRhcmdldCBpZiB0aGF0IHZhbHVlIGlzIGRlY2xhcmVkIHJlYWQtb25seSBhbmRcbiAgICAgICAgLy8gbm9uLWNvbmZpZ3VyYWJsZS4gRm9yIHRoaXMgcmVhc29uLCB3ZSBjcmVhdGUgYW4gb2JqZWN0IHdpdGggdGhlXG4gICAgICAgIC8vIHByb3RvdHlwZSBzZXQgdG8gYHRhcmdldGAgaW5zdGVhZCBvZiB1c2luZyBgdGFyZ2V0YCBkaXJlY3RseS5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIGNhbm5vdCByZXR1cm4gYSBjdXN0b20gb2JqZWN0IGZvciBBUElzIHRoYXRcbiAgICAgICAgLy8gYXJlIGRlY2xhcmVkIHJlYWQtb25seSBhbmQgbm9uLWNvbmZpZ3VyYWJsZSwgc3VjaCBhcyBgY2hyb21lLmRldnRvb2xzYC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlIHByb3h5IGhhbmRsZXJzIHRoZW1zZWx2ZXMgd2lsbCBzdGlsbCB1c2UgdGhlIG9yaWdpbmFsIGB0YXJnZXRgXG4gICAgICAgIC8vIGluc3RlYWQgb2YgdGhlIGBwcm94eVRhcmdldGAsIHNvIHRoYXQgdGhlIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgYXJlXG4gICAgICAgIC8vIGRlcmVmZXJlbmNlZCB2aWEgdGhlIG9yaWdpbmFsIHRhcmdldHMuXG4gICAgICAgIGxldCBwcm94eVRhcmdldCA9IE9iamVjdC5jcmVhdGUodGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eShwcm94eVRhcmdldCwgaGFuZGxlcnMpO1xuICAgICAgfTtcblxuICAgICAgLyoqXG4gICAgICAgKiBDcmVhdGVzIGEgc2V0IG9mIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBhbiBldmVudCBvYmplY3QsIHdoaWNoIGhhbmRsZXNcbiAgICAgICAqIHdyYXBwaW5nIG9mIGxpc3RlbmVyIGZ1bmN0aW9ucyB0aGF0IHRob3NlIG1lc3NhZ2VzIGFyZSBwYXNzZWQuXG4gICAgICAgKlxuICAgICAgICogQSBzaW5nbGUgd3JhcHBlciBpcyBjcmVhdGVkIGZvciBlYWNoIGxpc3RlbmVyIGZ1bmN0aW9uLCBhbmQgc3RvcmVkIGluIGFcbiAgICAgICAqIG1hcC4gU3Vic2VxdWVudCBjYWxscyB0byBgYWRkTGlzdGVuZXJgLCBgaGFzTGlzdGVuZXJgLCBvciBgcmVtb3ZlTGlzdGVuZXJgXG4gICAgICAgKiByZXRyaWV2ZSB0aGUgb3JpZ2luYWwgd3JhcHBlciwgc28gdGhhdCAgYXR0ZW1wdHMgdG8gcmVtb3ZlIGFcbiAgICAgICAqIHByZXZpb3VzbHktYWRkZWQgbGlzdGVuZXIgd29yayBhcyBleHBlY3RlZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge0RlZmF1bHRXZWFrTWFwPGZ1bmN0aW9uLCBmdW5jdGlvbj59IHdyYXBwZXJNYXBcbiAgICAgICAqICAgICAgICBBIERlZmF1bHRXZWFrTWFwIG9iamVjdCB3aGljaCB3aWxsIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgd3JhcHBlclxuICAgICAgICogICAgICAgIGZvciBhIGdpdmVuIGxpc3RlbmVyIGZ1bmN0aW9uIHdoZW4gb25lIGRvZXMgbm90IGV4aXN0LCBhbmQgcmV0cmlldmVcbiAgICAgICAqICAgICAgICBhbiBleGlzdGluZyBvbmUgd2hlbiBpdCBkb2VzLlxuICAgICAgICpcbiAgICAgICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAgICAgKi9cbiAgICAgIGNvbnN0IHdyYXBFdmVudCA9IHdyYXBwZXJNYXAgPT4gKHtcbiAgICAgICAgYWRkTGlzdGVuZXIodGFyZ2V0LCBsaXN0ZW5lciwgLi4uYXJncykge1xuICAgICAgICAgIHRhcmdldC5hZGRMaXN0ZW5lcih3cmFwcGVyTWFwLmdldChsaXN0ZW5lciksIC4uLmFyZ3MpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGhhc0xpc3RlbmVyKHRhcmdldCwgbGlzdGVuZXIpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0Lmhhc0xpc3RlbmVyKHdyYXBwZXJNYXAuZ2V0KGxpc3RlbmVyKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVtb3ZlTGlzdGVuZXIodGFyZ2V0LCBsaXN0ZW5lcikge1xuICAgICAgICAgIHRhcmdldC5yZW1vdmVMaXN0ZW5lcih3cmFwcGVyTWFwLmdldChsaXN0ZW5lcikpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gS2VlcCB0cmFjayBpZiB0aGUgZGVwcmVjYXRpb24gd2FybmluZyBoYXMgYmVlbiBsb2dnZWQgYXQgbGVhc3Qgb25jZS5cbiAgICAgIGxldCBsb2dnZWRTZW5kUmVzcG9uc2VEZXByZWNhdGlvbldhcm5pbmcgPSBmYWxzZTtcblxuICAgICAgY29uc3Qgb25NZXNzYWdlV3JhcHBlcnMgPSBuZXcgRGVmYXVsdFdlYWtNYXAobGlzdGVuZXIgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXR1cm4gbGlzdGVuZXI7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogV3JhcHMgYSBtZXNzYWdlIGxpc3RlbmVyIGZ1bmN0aW9uIHNvIHRoYXQgaXQgbWF5IHNlbmQgcmVzcG9uc2VzIGJhc2VkIG9uXG4gICAgICAgICAqIGl0cyByZXR1cm4gdmFsdWUsIHJhdGhlciB0aGFuIGJ5IHJldHVybmluZyBhIHNlbnRpbmVsIHZhbHVlIGFuZCBjYWxsaW5nIGFcbiAgICAgICAgICogY2FsbGJhY2suIElmIHRoZSBsaXN0ZW5lciBmdW5jdGlvbiByZXR1cm5zIGEgUHJvbWlzZSwgdGhlIHJlc3BvbnNlIGlzXG4gICAgICAgICAqIHNlbnQgd2hlbiB0aGUgcHJvbWlzZSBlaXRoZXIgcmVzb2x2ZXMgb3IgcmVqZWN0cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHsqfSBtZXNzYWdlXG4gICAgICAgICAqICAgICAgICBUaGUgbWVzc2FnZSBzZW50IGJ5IHRoZSBvdGhlciBlbmQgb2YgdGhlIGNoYW5uZWwuXG4gICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBzZW5kZXJcbiAgICAgICAgICogICAgICAgIERldGFpbHMgYWJvdXQgdGhlIHNlbmRlciBvZiB0aGUgbWVzc2FnZS5cbiAgICAgICAgICogQHBhcmFtIHtmdW5jdGlvbigqKX0gc2VuZFJlc3BvbnNlXG4gICAgICAgICAqICAgICAgICBBIGNhbGxiYWNrIHdoaWNoLCB3aGVuIGNhbGxlZCB3aXRoIGFuIGFyYml0cmFyeSBhcmd1bWVudCwgc2VuZHNcbiAgICAgICAgICogICAgICAgIHRoYXQgdmFsdWUgYXMgYSByZXNwb25zZS5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICAgICAqICAgICAgICBUcnVlIGlmIHRoZSB3cmFwcGVkIGxpc3RlbmVyIHJldHVybmVkIGEgUHJvbWlzZSwgd2hpY2ggd2lsbCBsYXRlclxuICAgICAgICAgKiAgICAgICAgeWllbGQgYSByZXNwb25zZS4gRmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAgICAgKi9cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG9uTWVzc2FnZShtZXNzYWdlLCBzZW5kZXIsIHNlbmRSZXNwb25zZSkge1xuICAgICAgICAgIGxldCBkaWRDYWxsU2VuZFJlc3BvbnNlID0gZmFsc2U7XG5cbiAgICAgICAgICBsZXQgd3JhcHBlZFNlbmRSZXNwb25zZTtcbiAgICAgICAgICBsZXQgc2VuZFJlc3BvbnNlUHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgd3JhcHBlZFNlbmRSZXNwb25zZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICBpZiAoIWxvZ2dlZFNlbmRSZXNwb25zZURlcHJlY2F0aW9uV2FybmluZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihTRU5EX1JFU1BPTlNFX0RFUFJFQ0FUSU9OX1dBUk5JTkcsIG5ldyBFcnJvcigpLnN0YWNrKTtcbiAgICAgICAgICAgICAgICBsb2dnZWRTZW5kUmVzcG9uc2VEZXByZWNhdGlvbldhcm5pbmcgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRpZENhbGxTZW5kUmVzcG9uc2UgPSB0cnVlO1xuICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHQgPSBsaXN0ZW5lcihtZXNzYWdlLCBzZW5kZXIsIHdyYXBwZWRTZW5kUmVzcG9uc2UpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmVzdWx0ID0gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpc1Jlc3VsdFRoZW5hYmxlID0gcmVzdWx0ICE9PSB0cnVlICYmIGlzVGhlbmFibGUocmVzdWx0KTtcblxuICAgICAgICAgIC8vIElmIHRoZSBsaXN0ZW5lciBkaWRuJ3QgcmV0dXJuZWQgdHJ1ZSBvciBhIFByb21pc2UsIG9yIGNhbGxlZFxuICAgICAgICAgIC8vIHdyYXBwZWRTZW5kUmVzcG9uc2Ugc3luY2hyb25vdXNseSwgd2UgY2FuIGV4aXQgZWFybGllclxuICAgICAgICAgIC8vIGJlY2F1c2UgdGhlcmUgd2lsbCBiZSBubyByZXNwb25zZSBzZW50IGZyb20gdGhpcyBsaXN0ZW5lci5cbiAgICAgICAgICBpZiAocmVzdWx0ICE9PSB0cnVlICYmICFpc1Jlc3VsdFRoZW5hYmxlICYmICFkaWRDYWxsU2VuZFJlc3BvbnNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQSBzbWFsbCBoZWxwZXIgdG8gc2VuZCB0aGUgbWVzc2FnZSBpZiB0aGUgcHJvbWlzZSByZXNvbHZlc1xuICAgICAgICAgIC8vIGFuZCBhbiBlcnJvciBpZiB0aGUgcHJvbWlzZSByZWplY3RzIChhIHdyYXBwZWQgc2VuZE1lc3NhZ2UgaGFzXG4gICAgICAgICAgLy8gdG8gdHJhbnNsYXRlIHRoZSBtZXNzYWdlIGludG8gYSByZXNvbHZlZCBwcm9taXNlIG9yIGEgcmVqZWN0ZWRcbiAgICAgICAgICAvLyBwcm9taXNlKS5cbiAgICAgICAgICBjb25zdCBzZW5kUHJvbWlzZWRSZXN1bHQgPSBwcm9taXNlID0+IHtcbiAgICAgICAgICAgIHByb21pc2UudGhlbihtc2cgPT4ge1xuICAgICAgICAgICAgICAvLyBzZW5kIHRoZSBtZXNzYWdlIHZhbHVlLlxuICAgICAgICAgICAgICBzZW5kUmVzcG9uc2UobXNnKTtcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgLy8gU2VuZCBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGlmIHRoZSByZWplY3RlZCB2YWx1ZVxuICAgICAgICAgICAgICAvLyBpcyBhbiBpbnN0YW5jZSBvZiBlcnJvciwgb3IgdGhlIG9iamVjdCBpdHNlbGYgb3RoZXJ3aXNlLlxuICAgICAgICAgICAgICBsZXQgbWVzc2FnZTtcbiAgICAgICAgICAgICAgaWYgKGVycm9yICYmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiBlcnJvci5tZXNzYWdlID09PSBcInN0cmluZ1wiKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBcIkFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWRcIjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNlbmRSZXNwb25zZSh7XG4gICAgICAgICAgICAgICAgX19tb3pXZWJFeHRlbnNpb25Qb2x5ZmlsbFJlamVjdF9fOiB0cnVlLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAvLyBQcmludCBhbiBlcnJvciBvbiB0aGUgY29uc29sZSBpZiB1bmFibGUgdG8gc2VuZCB0aGUgcmVzcG9uc2UuXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gc2VuZCBvbk1lc3NhZ2UgcmVqZWN0ZWQgcmVwbHlcIiwgZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBJZiB0aGUgbGlzdGVuZXIgcmV0dXJuZWQgYSBQcm9taXNlLCBzZW5kIHRoZSByZXNvbHZlZCB2YWx1ZSBhcyBhXG4gICAgICAgICAgLy8gcmVzdWx0LCBvdGhlcndpc2Ugd2FpdCB0aGUgcHJvbWlzZSByZWxhdGVkIHRvIHRoZSB3cmFwcGVkU2VuZFJlc3BvbnNlXG4gICAgICAgICAgLy8gY2FsbGJhY2sgdG8gcmVzb2x2ZSBhbmQgc2VuZCBpdCBhcyBhIHJlc3BvbnNlLlxuICAgICAgICAgIGlmIChpc1Jlc3VsdFRoZW5hYmxlKSB7XG4gICAgICAgICAgICBzZW5kUHJvbWlzZWRSZXN1bHQocmVzdWx0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VuZFByb21pc2VkUmVzdWx0KHNlbmRSZXNwb25zZVByb21pc2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIExldCBDaHJvbWUga25vdyB0aGF0IHRoZSBsaXN0ZW5lciBpcyByZXBseWluZy5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB3cmFwcGVkU2VuZE1lc3NhZ2VDYWxsYmFjayA9ICh7IHJlamVjdCwgcmVzb2x2ZSB9LCByZXBseSkgPT4ge1xuICAgICAgICBpZiAoZXh0ZW5zaW9uQVBJcy5ydW50aW1lLmxhc3RFcnJvcikge1xuICAgICAgICAgIC8vIERldGVjdCB3aGVuIG5vbmUgb2YgdGhlIGxpc3RlbmVycyByZXBsaWVkIHRvIHRoZSBzZW5kTWVzc2FnZSBjYWxsIGFuZCByZXNvbHZlXG4gICAgICAgICAgLy8gdGhlIHByb21pc2UgdG8gdW5kZWZpbmVkIGFzIGluIEZpcmVmb3guXG4gICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3dlYmV4dGVuc2lvbi1wb2x5ZmlsbC9pc3N1ZXMvMTMwXG4gICAgICAgICAgaWYgKGV4dGVuc2lvbkFQSXMucnVudGltZS5sYXN0RXJyb3IubWVzc2FnZSA9PT0gQ0hST01FX1NFTkRfTUVTU0FHRV9DQUxMQkFDS19OT19SRVNQT05TRV9NRVNTQUdFKSB7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlamVjdChleHRlbnNpb25BUElzLnJ1bnRpbWUubGFzdEVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocmVwbHkgJiYgcmVwbHkuX19tb3pXZWJFeHRlbnNpb25Qb2x5ZmlsbFJlamVjdF9fKSB7XG4gICAgICAgICAgLy8gQ29udmVydCBiYWNrIHRoZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBpbnRvXG4gICAgICAgICAgLy8gYW4gRXJyb3IgaW5zdGFuY2UuXG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihyZXBseS5tZXNzYWdlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZShyZXBseSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHdyYXBwZWRTZW5kTWVzc2FnZSA9IChuYW1lLCBtZXRhZGF0YSwgYXBpTmFtZXNwYWNlT2JqLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IG1ldGFkYXRhLm1pbkFyZ3MpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0ICR7bWV0YWRhdGEubWluQXJnc30gJHtwbHVyYWxpemVBcmd1bWVudHMobWV0YWRhdGEubWluQXJncyl9IGZvciAke25hbWV9KCksIGdvdCAke2FyZ3MubGVuZ3RofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gbWV0YWRhdGEubWF4QXJncykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYXQgbW9zdCAke21ldGFkYXRhLm1heEFyZ3N9ICR7cGx1cmFsaXplQXJndW1lbnRzKG1ldGFkYXRhLm1heEFyZ3MpfSBmb3IgJHtuYW1lfSgpLCBnb3QgJHthcmdzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgY29uc3Qgd3JhcHBlZENiID0gd3JhcHBlZFNlbmRNZXNzYWdlQ2FsbGJhY2suYmluZChudWxsLCB7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICBhcmdzLnB1c2god3JhcHBlZENiKTtcbiAgICAgICAgICBhcGlOYW1lc3BhY2VPYmouc2VuZE1lc3NhZ2UoLi4uYXJncyk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgc3RhdGljV3JhcHBlcnMgPSB7XG4gICAgICAgIHJ1bnRpbWU6IHtcbiAgICAgICAgICBvbk1lc3NhZ2U6IHdyYXBFdmVudChvbk1lc3NhZ2VXcmFwcGVycyksXG4gICAgICAgICAgb25NZXNzYWdlRXh0ZXJuYWw6IHdyYXBFdmVudChvbk1lc3NhZ2VXcmFwcGVycyksXG4gICAgICAgICAgc2VuZE1lc3NhZ2U6IHdyYXBwZWRTZW5kTWVzc2FnZS5iaW5kKG51bGwsIFwic2VuZE1lc3NhZ2VcIiwgeyBtaW5BcmdzOiAxLCBtYXhBcmdzOiAzIH0pXG4gICAgICAgIH0sXG4gICAgICAgIHRhYnM6IHtcbiAgICAgICAgICBzZW5kTWVzc2FnZTogd3JhcHBlZFNlbmRNZXNzYWdlLmJpbmQobnVsbCwgXCJzZW5kTWVzc2FnZVwiLCB7IG1pbkFyZ3M6IDIsIG1heEFyZ3M6IDMgfSlcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHNldHRpbmdNZXRhZGF0YSA9IHtcbiAgICAgICAgY2xlYXI6IHsgbWluQXJnczogMSwgbWF4QXJnczogMSB9LFxuICAgICAgICBnZXQ6IHsgbWluQXJnczogMSwgbWF4QXJnczogMSB9LFxuICAgICAgICBzZXQ6IHsgbWluQXJnczogMSwgbWF4QXJnczogMSB9XG4gICAgICB9O1xuICAgICAgYXBpTWV0YWRhdGEucHJpdmFjeSA9IHtcbiAgICAgICAgbmV0d29yazoge1xuICAgICAgICAgIG5ldHdvcmtQcmVkaWN0aW9uRW5hYmxlZDogc2V0dGluZ01ldGFkYXRhLFxuICAgICAgICAgIHdlYlJUQ0lQSGFuZGxpbmdQb2xpY3k6IHNldHRpbmdNZXRhZGF0YVxuICAgICAgICB9LFxuICAgICAgICBzZXJ2aWNlczoge1xuICAgICAgICAgIHBhc3N3b3JkU2F2aW5nRW5hYmxlZDogc2V0dGluZ01ldGFkYXRhXG4gICAgICAgIH0sXG4gICAgICAgIHdlYnNpdGVzOiB7XG4gICAgICAgICAgaHlwZXJsaW5rQXVkaXRpbmdFbmFibGVkOiBzZXR0aW5nTWV0YWRhdGEsXG4gICAgICAgICAgcmVmZXJyZXJzRW5hYmxlZDogc2V0dGluZ01ldGFkYXRhXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB3cmFwT2JqZWN0KGV4dGVuc2lvbkFQSXMsIHN0YXRpY1dyYXBwZXJzLCBhcGlNZXRhZGF0YSk7XG4gICAgfTtcblxuICAgIC8vIFRoZSBidWlsZCBwcm9jZXNzIGFkZHMgYSBVTUQgd3JhcHBlciBhcm91bmQgdGhpcyBmaWxlLCB3aGljaCBtYWtlcyB0aGVcbiAgICAvLyBgbW9kdWxlYCB2YXJpYWJsZSBhdmFpbGFibGUuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSB3cmFwQVBJcyhjaHJvbWUpO1xuICB9IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0gYnJvd3NlcjtcbiAgfVxufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1icm93c2VyLXBvbHlmaWxsLmpzLm1hcFxuXG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xuXG52YXIgbmF0aXZlRGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydHlcbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gbmF0aXZlRGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuIG5hdGl2ZURlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgaWYgKCd2YWx1ZScgaW4gQXR0cmlidXRlcykgT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gIHJldHVybiBPO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMtY29yZScpLkl0ZXJhdG9yUHJvdG90eXBlO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCkge1xuICB2YXIgVE9fU1RSSU5HX1RBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJztcbiAgSXRlcmF0b3JDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHsgbmV4dDogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIG5leHQpIH0pO1xuICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvckNvbnN0cnVjdG9yLCBUT19TVFJJTkdfVEFHLCBmYWxzZSwgdHJ1ZSk7XG4gIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7XG4gIHJldHVybiBJdGVyYXRvckNvbnN0cnVjdG9yO1xufTtcbiIsInZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAvd2ViMHMoPyEuKmNocm9tZSkvaS50ZXN0KHVzZXJBZ2VudCk7XG4iLCJ2YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbi8vIGBUb0ludGVnZXJgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2ludGVnZXJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBpc05hTihhcmd1bWVudCA9ICthcmd1bWVudCkgPyAwIDogKGFyZ3VtZW50ID4gMCA/IGZsb29yIDogY2VpbCkoYXJndW1lbnQpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIE5hdGl2ZVByb21pc2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3InKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xuXG4vLyBTYWZhcmkgYnVnIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDA4MjlcbnZhciBOT05fR0VORVJJQyA9ICEhTmF0aXZlUHJvbWlzZSAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIE5hdGl2ZVByb21pc2UucHJvdG90eXBlWydmaW5hbGx5J10uY2FsbCh7IHRoZW46IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSB9LCBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSk7XG5cbi8vIGBQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUuZmluYWxseVxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBOT05fR0VORVJJQyB9LCB7XG4gICdmaW5hbGx5JzogZnVuY3Rpb24gKG9uRmluYWxseSkge1xuICAgIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIGdldEJ1aWx0SW4oJ1Byb21pc2UnKSk7XG4gICAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2Ygb25GaW5hbGx5ID09ICdmdW5jdGlvbic7XG4gICAgcmV0dXJuIHRoaXMudGhlbihcbiAgICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4geDsgfSk7XG4gICAgICB9IDogb25GaW5hbGx5LFxuICAgICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHRocm93IGU7IH0pO1xuICAgICAgfSA6IG9uRmluYWxseVxuICAgICk7XG4gIH1cbn0pO1xuXG4vLyBwYXRjaCBuYXRpdmUgUHJvbWlzZS5wcm90b3R5cGUgZm9yIG5hdGl2ZSBhc3luYyBmdW5jdGlvbnNcbmlmICghSVNfUFVSRSAmJiB0eXBlb2YgTmF0aXZlUHJvbWlzZSA9PSAnZnVuY3Rpb24nICYmICFOYXRpdmVQcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddKSB7XG4gIHJlZGVmaW5lKE5hdGl2ZVByb21pc2UucHJvdG90eXBlLCAnZmluYWxseScsIGdldEJ1aWx0SW4oJ1Byb21pc2UnKS5wcm90b3R5cGVbJ2ZpbmFsbHknXSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gZmFsc2U7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxuLy8gYCVJdGVyYXRvclByb3RvdHlwZSVgIG9iamVjdFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0laXRlcmF0b3Jwcm90b3R5cGUlLW9iamVjdFxudmFyIEl0ZXJhdG9yUHJvdG90eXBlLCBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUsIGFycmF5SXRlcmF0b3I7XG5cbmlmIChbXS5rZXlzKSB7XG4gIGFycmF5SXRlcmF0b3IgPSBbXS5rZXlzKCk7XG4gIC8vIFNhZmFyaSA4IGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuICBpZiAoISgnbmV4dCcgaW4gYXJyYXlJdGVyYXRvcikpIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSB0cnVlO1xuICBlbHNlIHtcbiAgICBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihnZXRQcm90b3R5cGVPZihhcnJheUl0ZXJhdG9yKSk7XG4gICAgaWYgKFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkgSXRlcmF0b3JQcm90b3R5cGUgPSBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cbn1cblxudmFyIE5FV19JVEVSQVRPUl9QUk9UT1RZUEUgPSBJdGVyYXRvclByb3RvdHlwZSA9PSB1bmRlZmluZWQgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgdGVzdCA9IHt9O1xuICAvLyBGRjQ0LSBsZWdhY3kgaXRlcmF0b3JzIGNhc2VcbiAgcmV0dXJuIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXS5jYWxsKHRlc3QpICE9PSB0ZXN0O1xufSk7XG5cbmlmIChORVdfSVRFUkFUT1JfUFJPVE9UWVBFKSBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxuaWYgKCghSVNfUFVSRSB8fCBORVdfSVRFUkFUT1JfUFJPVE9UWVBFKSAmJiAhaGFzKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUikpIHtcbiAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBJdGVyYXRvclByb3RvdHlwZTogSXRlcmF0b3JQcm90b3R5cGUsXG4gIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlNcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdGFzaycpLnNldDtcbnZhciBJU19JT1MgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcycpO1xudmFyIElTX1dFQk9TX1dFQktJVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtd2Vib3Mtd2Via2l0Jyk7XG52YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZScpO1xuXG52YXIgTXV0YXRpb25PYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBQcm9taXNlID0gZ2xvYmFsLlByb21pc2U7XG4vLyBOb2RlLmpzIDExIHNob3dzIEV4cGVyaW1lbnRhbFdhcm5pbmcgb24gZ2V0dGluZyBgcXVldWVNaWNyb3Rhc2tgXG52YXIgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGdsb2JhbCwgJ3F1ZXVlTWljcm90YXNrJyk7XG52YXIgcXVldWVNaWNyb3Rhc2sgPSBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IgJiYgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yLnZhbHVlO1xuXG52YXIgZmx1c2gsIGhlYWQsIGxhc3QsIG5vdGlmeSwgdG9nZ2xlLCBub2RlLCBwcm9taXNlLCB0aGVuO1xuXG4vLyBtb2Rlcm4gZW5naW5lcyBoYXZlIHF1ZXVlTWljcm90YXNrIG1ldGhvZFxuaWYgKCFxdWV1ZU1pY3JvdGFzaykge1xuICBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZiAoSVNfTk9ERSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKSBwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlIChoZWFkKSB7XG4gICAgICBmbiA9IGhlYWQuZm47XG4gICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChoZWFkKSBub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyLCBleGNlcHQgaU9TIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzMzOVxuICAvLyBhbHNvIGV4Y2VwdCBXZWJPUyBXZWJraXQgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg5OFxuICBpZiAoIUlTX0lPUyAmJiAhSVNfTk9ERSAmJiAhSVNfV0VCT1NfV0VCS0lUICYmIE11dGF0aW9uT2JzZXJ2ZXIgJiYgZG9jdW1lbnQpIHtcbiAgICB0b2dnbGUgPSB0cnVlO1xuICAgIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmIChQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSkge1xuICAgIC8vIFByb21pc2UucmVzb2x2ZSB3aXRob3V0IGFuIGFyZ3VtZW50IHRocm93cyBhbiBlcnJvciBpbiBMRyBXZWJPUyAyXG4gICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIHRoZW4gPSBwcm9taXNlLnRoZW47XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhlbi5jYWxsKHByb21pc2UsIGZsdXNoKTtcbiAgICB9O1xuICAvLyBOb2RlLmpzIHdpdGhvdXQgcHJvbWlzZXNcbiAgfSBlbHNlIGlmIChJU19OT0RFKSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjpcbiAgLy8gLSBzZXRJbW1lZGlhdGVcbiAgLy8gLSBNZXNzYWdlQ2hhbm5lbFxuICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHN0cmFuZ2UgSUUgKyB3ZWJwYWNrIGRldiBzZXJ2ZXIgYnVnIC0gdXNlIC5jYWxsKGdsb2JhbClcbiAgICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBxdWV1ZU1pY3JvdGFzayB8fCBmdW5jdGlvbiAoZm4pIHtcbiAgdmFyIHRhc2sgPSB7IGZuOiBmbiwgbmV4dDogdW5kZWZpbmVkIH07XG4gIGlmIChsYXN0KSBsYXN0Lm5leHQgPSB0YXNrO1xuICBpZiAoIWhlYWQpIHtcbiAgICBoZWFkID0gdGFzaztcbiAgICBub3RpZnkoKTtcbiAgfSBsYXN0ID0gdGFzaztcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbCcpO1xudmFyIFVTRV9TWU1CT0xfQVNfVUlEID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkJyk7XG5cbnZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpO1xudmFyIFN5bWJvbCA9IGdsb2JhbC5TeW1ib2w7XG52YXIgY3JlYXRlV2VsbEtub3duU3ltYm9sID0gVVNFX1NZTUJPTF9BU19VSUQgPyBTeW1ib2wgOiBTeW1ib2wgJiYgU3ltYm9sLndpdGhvdXRTZXR0ZXIgfHwgdWlkO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGlmICghaGFzKFdlbGxLbm93blN5bWJvbHNTdG9yZSwgbmFtZSkpIHtcbiAgICBpZiAoTkFUSVZFX1NZTUJPTCAmJiBoYXMoU3ltYm9sLCBuYW1lKSkgV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdID0gU3ltYm9sW25hbWVdO1xuICAgIGVsc2UgV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdID0gY3JlYXRlV2VsbEtub3duU3ltYm9sKCdTeW1ib2wuJyArIG5hbWUpO1xuICB9IHJldHVybiBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV07XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG4vLyBgVG9QcmltaXRpdmVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b3ByaW1pdGl2ZVxuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgUFJFRkVSUkVEX1NUUklORykge1xuICBpZiAoIWlzT2JqZWN0KGlucHV0KSkgcmV0dXJuIGlucHV0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFBSRUZFUlJFRF9TVFJJTkcgJiYgdHlwZW9mIChmbiA9IGlucHV0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGlucHV0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaW5wdXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVBSRUZFUlJFRF9TVFJJTkcgJiYgdHlwZW9mIChmbiA9IGlucHV0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGlucHV0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZhbHNlO1xuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xuXG52YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7XG52YXIgc3RvcmUgPSBnbG9iYWxbU0hBUkVEXSB8fCBzZXRHbG9iYWwoU0hBUkVELCB7fSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RvcmU7XG4iLCJ2YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGluZGV4T2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKS5pbmRleE9mO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgIWhhcyhoaWRkZW5LZXlzLCBrZXkpICYmIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+aW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIEVYSVNUUyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEVYSVNUUyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgYXNzaWduID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1hc3NpZ24nKTtcblxuLy8gYE9iamVjdC5hc3NpZ25gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuYXNzaWduXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBPYmplY3QuYXNzaWduICE9PSBhc3NpZ24gfSwge1xuICBhc3NpZ246IGFzc2lnblxufSk7XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7XG4gIGFuT2JqZWN0KEMpO1xuICBpZiAoaXNPYmplY3QoeCkgJiYgeC5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIHg7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7XG4gIHZhciByZXNvbHZlID0gcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgcmVzb2x2ZSh4KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdHJ5IHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoZ2xvYmFsLCBrZXksIHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBnbG9iYWxba2V5XSA9IHZhbHVlO1xuICB9IHJldHVybiB2YWx1ZTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiIsInZhciBwYXRoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BhdGgnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbnZhciBhRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFyaWFibGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YXJpYWJsZSA9PSAnZnVuY3Rpb24nID8gdmFyaWFibGUgOiB1bmRlZmluZWQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lc3BhY2UsIG1ldGhvZCkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBhRnVuY3Rpb24ocGF0aFtuYW1lc3BhY2VdKSB8fCBhRnVuY3Rpb24oZ2xvYmFsW25hbWVzcGFjZV0pXG4gICAgOiBwYXRoW25hbWVzcGFjZV0gJiYgcGF0aFtuYW1lc3BhY2VdW21ldGhvZF0gfHwgZ2xvYmFsW25hbWVzcGFjZV0gJiYgZ2xvYmFsW25hbWVzcGFjZV1bbWV0aG9kXTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBOYXNob3JuIH4gSkRLOCBidWdcbnZhciBOQVNIT1JOX0JVRyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiAhbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh7IDE6IDIgfSwgMSk7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eWlzZW51bWVyYWJsZVxuZXhwb3J0cy5mID0gTkFTSE9STl9CVUcgPyBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpO1xuICByZXR1cm4gISFkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZTtcbn0gOiBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBhUG9zc2libGVQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUnKTtcblxuLy8gYE9iamVjdC5zZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5zZXRwcm90b3R5cGVvZlxuLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKCdfX3Byb3RvX18nIGluIHt9ID8gZnVuY3Rpb24gKCkge1xuICB2YXIgQ09SUkVDVF9TRVRURVIgPSBmYWxzZTtcbiAgdmFyIHRlc3QgPSB7fTtcbiAgdmFyIHNldHRlcjtcbiAgdHJ5IHtcbiAgICBzZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQ7XG4gICAgc2V0dGVyLmNhbGwodGVzdCwgW10pO1xuICAgIENPUlJFQ1RfU0VUVEVSID0gdGVzdCBpbnN0YW5jZW9mIEFycmF5O1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90bykge1xuICAgIGFuT2JqZWN0KE8pO1xuICAgIGFQb3NzaWJsZVByb3RvdHlwZShwcm90byk7XG4gICAgaWYgKENPUlJFQ1RfU0VUVEVSKSBzZXR0ZXIuY2FsbChPLCBwcm90byk7XG4gICAgZWxzZSBPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgIHJldHVybiBPO1xuICB9O1xufSgpIDogdW5kZWZpbmVkKTtcbiIsInZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgVEFHLCBTVEFUSUMpIHtcbiAgaWYgKGl0ICYmICFoYXMoaXQgPSBTVEFUSUMgPyBpdCA6IGl0LnByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShpdCwgVE9fU1RSSU5HX1RBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBUQUcgfSk7XG4gIH1cbn07XG4iLCJ2YXIgY2hlY2sgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICYmIGl0Lk1hdGggPT0gTWF0aCAmJiBpdDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG5tb2R1bGUuZXhwb3J0cyA9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICBjaGVjayh0eXBlb2YgZ2xvYmFsVGhpcyA9PSAnb2JqZWN0JyAmJiBnbG9iYWxUaGlzKSB8fFxuICBjaGVjayh0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdykgfHxcbiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZikgfHxcbiAgY2hlY2sodHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSkoKSB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuIiwidmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxuLy8gYE9iamVjdC5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmtleXNcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgZW51bUJ1Z0tleXMpO1xufTtcbiIsInZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyJyk7XG5cbnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTtcbnZhciBPYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuXG4vLyBgT2JqZWN0LmdldFByb3RvdHlwZU9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldHByb3RvdHlwZW9mXG5tb2R1bGUuZXhwb3J0cyA9IENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIChPKSB7XG4gIE8gPSB0b09iamVjdChPKTtcbiAgaWYgKGhhcyhPLCBJRV9QUk9UTykpIHJldHVybiBPW0lFX1BST1RPXTtcbiAgaWYgKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90b3R5cGUgOiBudWxsO1xufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEYoKSB7IC8qIGVtcHR5ICovIH1cbiAgRi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBudWxsO1xuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBGKCkpICE9PSBGLnByb3RvdHlwZTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3InKTtcblxudmFyIEFSUkFZX0lURVJBVE9SID0gJ0FycmF5IEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKEFSUkFZX0lURVJBVE9SKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmVudHJpZXNcbi8vIGBBcnJheS5wcm90b3R5cGUua2V5c2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5rZXlzXG4vLyBgQXJyYXkucHJvdG90eXBlLnZhbHVlc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS52YWx1ZXNcbi8vIGBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEBpdGVyYXRvclxuLy8gYENyZWF0ZUFycmF5SXRlcmF0b3JgIGludGVybmFsIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGVhcnJheWl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmluZUl0ZXJhdG9yKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogQVJSQVlfSVRFUkFUT1IsXG4gICAgdGFyZ2V0OiB0b0luZGV4ZWRPYmplY3QoaXRlcmF0ZWQpLCAvLyB0YXJnZXRcbiAgICBpbmRleDogMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgICBraW5kOiBraW5kICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpbmRcbiAgfSk7XG4vLyBgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0lYXJyYXlpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgdGFyZ2V0ID0gc3RhdGUudGFyZ2V0O1xuICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4Kys7XG4gIGlmICghdGFyZ2V0IHx8IGluZGV4ID49IHRhcmdldC5sZW5ndGgpIHtcbiAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG4gIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHsgdmFsdWU6IGluZGV4LCBkb25lOiBmYWxzZSB9O1xuICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHsgdmFsdWU6IHRhcmdldFtpbmRleF0sIGRvbmU6IGZhbHNlIH07XG4gIHJldHVybiB7IHZhbHVlOiBbaW5kZXgsIHRhcmdldFtpbmRleF1dLCBkb25lOiBmYWxzZSB9O1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyVcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRldW5tYXBwZWRhcmd1bWVudHNvYmplY3Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRlbWFwcGVkYXJndW1lbnRzb2JqZWN0XG5JdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcbiIsInZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgb3B0aW9ucykge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSByZWRlZmluZSh0YXJnZXQsIGtleSwgc3JjW2tleV0sIG9wdGlvbnMpO1xuICByZXR1cm4gdGFyZ2V0O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlcnJvcjogZmFsc2UsIHZhbHVlOiBleGVjKCkgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSwgdmFsdWU6IGVycm9yIH07XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBOYXRpdmVQcm9taXNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1wcm9taXNlLWNvbnN0cnVjdG9yJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZS1hbGwnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9taWNyb3Rhc2snKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcbnZhciBob3N0UmVwb3J0RXJyb3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycycpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZScpO1xudmFyIFY4X1ZFUlNJT04gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXY4LXZlcnNpb24nKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcbnZhciBQUk9NSVNFID0gJ1Byb21pc2UnO1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihQUk9NSVNFKTtcbnZhciBQcm9taXNlQ29uc3RydWN0b3IgPSBOYXRpdmVQcm9taXNlO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyICRmZXRjaCA9IGdldEJ1aWx0SW4oJ2ZldGNoJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xudmFyIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5O1xudmFyIERJU1BBVENIX0VWRU5UID0gISEoZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRXZlbnQgJiYgZ2xvYmFsLmRpc3BhdGNoRXZlbnQpO1xudmFyIE5BVElWRV9SRUpFQ1RJT05fRVZFTlQgPSB0eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50ID09ICdmdW5jdGlvbic7XG52YXIgVU5IQU5ETEVEX1JFSkVDVElPTiA9ICd1bmhhbmRsZWRyZWplY3Rpb24nO1xudmFyIFJFSkVDVElPTl9IQU5ETEVEID0gJ3JlamVjdGlvbmhhbmRsZWQnO1xudmFyIFBFTkRJTkcgPSAwO1xudmFyIEZVTEZJTExFRCA9IDE7XG52YXIgUkVKRUNURUQgPSAyO1xudmFyIEhBTkRMRUQgPSAxO1xudmFyIFVOSEFORExFRCA9IDI7XG52YXIgSW50ZXJuYWwsIE93blByb21pc2VDYXBhYmlsaXR5LCBQcm9taXNlV3JhcHBlciwgbmF0aXZlVGhlbjtcblxudmFyIEZPUkNFRCA9IGlzRm9yY2VkKFBST01JU0UsIGZ1bmN0aW9uICgpIHtcbiAgdmFyIEdMT0JBTF9DT1JFX0pTX1BST01JU0UgPSBpbnNwZWN0U291cmNlKFByb21pc2VDb25zdHJ1Y3RvcikgIT09IFN0cmluZyhQcm9taXNlQ29uc3RydWN0b3IpO1xuICBpZiAoIUdMT0JBTF9DT1JFX0pTX1BST01JU0UpIHtcbiAgICAvLyBWOCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzXG4gICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9ODMwNTY1XG4gICAgLy8gV2UgY2FuJ3QgZGV0ZWN0IGl0IHN5bmNocm9ub3VzbHksIHNvIGp1c3QgY2hlY2sgdmVyc2lvbnNcbiAgICBpZiAoVjhfVkVSU0lPTiA9PT0gNjYpIHJldHVybiB0cnVlO1xuICAgIC8vIFVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgICBpZiAoIUlTX05PREUgJiYgIU5BVElWRV9SRUpFQ1RJT05fRVZFTlQpIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIFdlIG5lZWQgUHJvbWlzZSNmaW5hbGx5IGluIHRoZSBwdXJlIHZlcnNpb24gZm9yIHByZXZlbnRpbmcgcHJvdG90eXBlIHBvbGx1dGlvblxuICBpZiAoSVNfUFVSRSAmJiAhUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZVsnZmluYWxseSddKSByZXR1cm4gdHJ1ZTtcbiAgLy8gV2UgY2FuJ3QgdXNlIEBAc3BlY2llcyBmZWF0dXJlIGRldGVjdGlvbiBpbiBWOCBzaW5jZSBpdCBjYXVzZXNcbiAgLy8gZGVvcHRpbWl6YXRpb24gYW5kIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzlcbiAgaWYgKFY4X1ZFUlNJT04gPj0gNTEgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KFByb21pc2VDb25zdHJ1Y3RvcikpIHJldHVybiBmYWxzZTtcbiAgLy8gRGV0ZWN0IGNvcnJlY3RuZXNzIG9mIHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgdmFyIHByb21pc2UgPSBQcm9taXNlQ29uc3RydWN0b3IucmVzb2x2ZSgxKTtcbiAgdmFyIEZha2VQcm9taXNlID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgICBleGVjKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbiAgfTtcbiAgdmFyIGNvbnN0cnVjdG9yID0gcHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9O1xuICBjb25zdHJ1Y3RvcltTUEVDSUVTXSA9IEZha2VQcm9taXNlO1xuICByZXR1cm4gIShwcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlKTtcbn0pO1xuXG52YXIgSU5DT1JSRUNUX0lURVJBVElPTiA9IEZPUkNFRCB8fCAhY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkge1xuICBQcm9taXNlQ29uc3RydWN0b3IuYWxsKGl0ZXJhYmxlKVsnY2F0Y2gnXShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSk7XG5cbi8vIGhlbHBlcnNcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xuXG52YXIgbm90aWZ5ID0gZnVuY3Rpb24gKHN0YXRlLCBpc1JlamVjdCkge1xuICBpZiAoc3RhdGUubm90aWZpZWQpIHJldHVybjtcbiAgc3RhdGUubm90aWZpZWQgPSB0cnVlO1xuICB2YXIgY2hhaW4gPSBzdGF0ZS5yZWFjdGlvbnM7XG4gIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdmFyIG9rID0gc3RhdGUuc3RhdGUgPT0gRlVMRklMTEVEO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhciByZWFjdGlvbiA9IGNoYWluW2luZGV4KytdO1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gICAgICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICAgICAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUucmVqZWN0aW9uID09PSBVTkhBTkRMRUQpIG9uSGFuZGxlVW5oYW5kbGVkKHN0YXRlKTtcbiAgICAgICAgICAgIHN0YXRlLnJlamVjdGlvbiA9IEhBTkRMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYW5kbGVyID09PSB0cnVlKSByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkb21haW4pIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7IC8vIGNhbiB0aHJvd1xuICAgICAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgICAgICBkb21haW4uZXhpdCgpO1xuICAgICAgICAgICAgICBleGl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKSB7XG4gICAgICAgICAgICByZWplY3QoVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChkb21haW4gJiYgIWV4aXRlZCkgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RhdGUucmVhY3Rpb25zID0gW107XG4gICAgc3RhdGUubm90aWZpZWQgPSBmYWxzZTtcbiAgICBpZiAoaXNSZWplY3QgJiYgIXN0YXRlLnJlamVjdGlvbikgb25VbmhhbmRsZWQoc3RhdGUpO1xuICB9KTtcbn07XG5cbnZhciBkaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIHByb21pc2UsIHJlYXNvbikge1xuICB2YXIgZXZlbnQsIGhhbmRsZXI7XG4gIGlmIChESVNQQVRDSF9FVkVOVCkge1xuICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZlbnQucHJvbWlzZSA9IHByb21pc2U7XG4gICAgZXZlbnQucmVhc29uID0gcmVhc29uO1xuICAgIGV2ZW50LmluaXRFdmVudChuYW1lLCBmYWxzZSwgdHJ1ZSk7XG4gICAgZ2xvYmFsLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9IGVsc2UgZXZlbnQgPSB7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcmVhc29uIH07XG4gIGlmICghTkFUSVZFX1JFSkVDVElPTl9FVkVOVCAmJiAoaGFuZGxlciA9IGdsb2JhbFsnb24nICsgbmFtZV0pKSBoYW5kbGVyKGV2ZW50KTtcbiAgZWxzZSBpZiAobmFtZSA9PT0gVU5IQU5ETEVEX1JFSkVDVElPTikgaG9zdFJlcG9ydEVycm9ycygnVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgcmVhc29uKTtcbn07XG5cbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBzdGF0ZS5mYWNhZGU7XG4gICAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdmFyIElTX1VOSEFORExFRCA9IGlzVW5oYW5kbGVkKHN0YXRlKTtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGlmIChJU19VTkhBTkRMRUQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoSVNfTk9ERSkge1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChVTkhBTkRMRURfUkVKRUNUSU9OLCBwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBub3QgdHJpZ2dlciBgcmVqZWN0aW9uSGFuZGxlZGAgZXZlbnQgaWYgaXQgd2FzIGhhbmRsZWQgaGVyZSwgTm9kZUpTIC0gc2hvdWxkXG4gICAgICBzdGF0ZS5yZWplY3Rpb24gPSBJU19OT0RFIHx8IGlzVW5oYW5kbGVkKHN0YXRlKSA/IFVOSEFORExFRCA6IEhBTkRMRUQ7XG4gICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyByZXN1bHQudmFsdWU7XG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUucmVqZWN0aW9uICE9PSBIQU5ETEVEICYmICFzdGF0ZS5wYXJlbnQ7XG59O1xuXG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gc3RhdGUuZmFjYWRlO1xuICAgIGlmIChJU19OT0RFKSB7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChSRUpFQ1RJT05fSEFORExFRCwgcHJvbWlzZSwgc3RhdGUudmFsdWUpO1xuICB9KTtcbn07XG5cbnZhciBiaW5kID0gZnVuY3Rpb24gKGZuLCBzdGF0ZSwgdW53cmFwKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBmbihzdGF0ZSwgdmFsdWUsIHVud3JhcCk7XG4gIH07XG59O1xuXG52YXIgaW50ZXJuYWxSZWplY3QgPSBmdW5jdGlvbiAoc3RhdGUsIHZhbHVlLCB1bndyYXApIHtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjtcbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwO1xuICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICBzdGF0ZS5zdGF0ZSA9IFJFSkVDVEVEO1xuICBub3RpZnkoc3RhdGUsIHRydWUpO1xufTtcblxudmFyIGludGVybmFsUmVzb2x2ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHRyeSB7XG4gICAgaWYgKHN0YXRlLmZhY2FkZSA9PT0gdmFsdWUpIHRocm93IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIHZhciB0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSk7XG4gICAgaWYgKHRoZW4pIHtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3cmFwcGVyID0geyBkb25lOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSxcbiAgICAgICAgICAgIGJpbmQoaW50ZXJuYWxSZXNvbHZlLCB3cmFwcGVyLCBzdGF0ZSksXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVqZWN0LCB3cmFwcGVyLCBzdGF0ZSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGludGVybmFsUmVqZWN0KHdyYXBwZXIsIGVycm9yLCBzdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgc3RhdGUuc3RhdGUgPSBGVUxGSUxMRUQ7XG4gICAgICBub3RpZnkoc3RhdGUsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaW50ZXJuYWxSZWplY3QoeyBkb25lOiBmYWxzZSB9LCBlcnJvciwgc3RhdGUpO1xuICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RvciBwb2x5ZmlsbFxuaWYgKEZPUkNFRCkge1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICBQcm9taXNlQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCBQcm9taXNlQ29uc3RydWN0b3IsIFBST01JU0UpO1xuICAgIGFGdW5jdGlvbihleGVjdXRvcik7XG4gICAgSW50ZXJuYWwuY2FsbCh0aGlzKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihiaW5kKGludGVybmFsUmVzb2x2ZSwgc3RhdGUpLCBiaW5kKGludGVybmFsUmVqZWN0LCBzdGF0ZSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChzdGF0ZSwgZXJyb3IpO1xuICAgIH1cbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIEludGVybmFsID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgICAgdHlwZTogUFJPTUlTRSxcbiAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgbm90aWZpZWQ6IGZhbHNlLFxuICAgICAgcGFyZW50OiBmYWxzZSxcbiAgICAgIHJlYWN0aW9uczogW10sXG4gICAgICByZWplY3Rpb246IGZhbHNlLFxuICAgICAgc3RhdGU6IFBFTkRJTkcsXG4gICAgICB2YWx1ZTogdW5kZWZpbmVkXG4gICAgfSk7XG4gIH07XG4gIEludGVybmFsLnByb3RvdHlwZSA9IHJlZGVmaW5lQWxsKFByb21pc2VDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHtcbiAgICAvLyBgUHJvbWlzZS5wcm90b3R5cGUudGhlbmAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS50aGVuXG4gICAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUodGhpcyk7XG4gICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yKSk7XG4gICAgICByZWFjdGlvbi5vayA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PSAnZnVuY3Rpb24nID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCA9IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IElTX05PREUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgICAgIHN0YXRlLnBhcmVudCA9IHRydWU7XG4gICAgICBzdGF0ZS5yZWFjdGlvbnMucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAoc3RhdGUuc3RhdGUgIT0gUEVORElORykgbm90aWZ5KHN0YXRlLCBmYWxzZSk7XG4gICAgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTtcbiAgICB9LFxuICAgIC8vIGBQcm9taXNlLnByb3RvdHlwZS5jYXRjaGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS5jYXRjaFxuICAgICdjYXRjaCc6IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICB9KTtcbiAgT3duUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBuZXcgSW50ZXJuYWwoKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHByb21pc2UpO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gYmluZChpbnRlcm5hbFJlc29sdmUsIHN0YXRlKTtcbiAgICB0aGlzLnJlamVjdCA9IGJpbmQoaW50ZXJuYWxSZWplY3QsIHN0YXRlKTtcbiAgfTtcbiAgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgICByZXR1cm4gQyA9PT0gUHJvbWlzZUNvbnN0cnVjdG9yIHx8IEMgPT09IFByb21pc2VXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG5cbiAgaWYgKCFJU19QVVJFICYmIHR5cGVvZiBOYXRpdmVQcm9taXNlID09ICdmdW5jdGlvbicpIHtcbiAgICBuYXRpdmVUaGVuID0gTmF0aXZlUHJvbWlzZS5wcm90b3R5cGUudGhlbjtcblxuICAgIC8vIHdyYXAgbmF0aXZlIFByb21pc2UjdGhlbiBmb3IgbmF0aXZlIGFzeW5jIGZ1bmN0aW9uc1xuICAgIHJlZGVmaW5lKE5hdGl2ZVByb21pc2UucHJvdG90eXBlLCAndGhlbicsIGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgbmF0aXZlVGhlbi5jYWxsKHRoYXQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjQwXG4gICAgfSwgeyB1bnNhZmU6IHRydWUgfSk7XG5cbiAgICAvLyB3cmFwIGZldGNoIHJlc3VsdFxuICAgIGlmICh0eXBlb2YgJGZldGNoID09ICdmdW5jdGlvbicpICQoeyBnbG9iYWw6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIGZldGNoOiBmdW5jdGlvbiBmZXRjaChpbnB1dCAvKiAsIGluaXQgKi8pIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKFByb21pc2VDb25zdHJ1Y3RvciwgJGZldGNoLmFwcGx5KGdsb2JhbCwgYXJndW1lbnRzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuJCh7IGdsb2JhbDogdHJ1ZSwgd3JhcDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICBQcm9taXNlOiBQcm9taXNlQ29uc3RydWN0b3Jcbn0pO1xuXG5zZXRUb1N0cmluZ1RhZyhQcm9taXNlQ29uc3RydWN0b3IsIFBST01JU0UsIGZhbHNlLCB0cnVlKTtcbnNldFNwZWNpZXMoUFJPTUlTRSk7XG5cblByb21pc2VXcmFwcGVyID0gZ2V0QnVpbHRJbihQUk9NSVNFKTtcblxuLy8gc3RhdGljc1xuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICAvLyBgUHJvbWlzZS5yZWplY3RgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmVqZWN0XG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO1xuICAgIGNhcGFiaWxpdHkucmVqZWN0LmNhbGwodW5kZWZpbmVkLCByKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcblxuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIHx8IEZPUkNFRCB9LCB7XG4gIC8vIGBQcm9taXNlLnJlc29sdmVgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmVzb2x2ZVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpIHtcbiAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoSVNfUFVSRSAmJiB0aGlzID09PSBQcm9taXNlV3JhcHBlciA/IFByb21pc2VDb25zdHJ1Y3RvciA6IHRoaXMsIHgpO1xuICB9XG59KTtcblxuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgLy8gYFByb21pc2UuYWxsYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLmFsbFxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHByb21pc2VSZXNvbHZlID0gYUZ1bmN0aW9uKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgICRwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gYFByb21pc2UucmFjZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5yYWNlXG4gIHJhY2U6IGZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFGdW5jdGlvbihDLnJlc29sdmUpO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgJHByb21pc2VSZXNvbHZlLmNhbGwoQywgcHJvbWlzZSkudGhlbihjYXBhYmlsaXR5LnJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsInZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgb3duS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vd24ta2V5cycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuICB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbiAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoIWhhcyh0YXJnZXQsIGtleSkpIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgfVxufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b3R5cGVbSVRFUkFUT1JdID09PSBpdCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG5cbnZhciBQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7XG4gIHZhciByZXNvbHZlLCByZWplY3Q7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDKGZ1bmN0aW9uICgkJHJlc29sdmUsICQkcmVqZWN0KSB7XG4gICAgaWYgKHJlc29sdmUgIT09IHVuZGVmaW5lZCB8fCByZWplY3QgIT09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBhRnVuY3Rpb24ocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ID0gYUZ1bmN0aW9uKHJlamVjdCk7XG59O1xuXG4vLyAyNS40LjEuNSBOZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIChDKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG59O1xuIiwidmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciBjbGFzc29mUmF3ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBDT1JSRUNUX0FSR1VNRU5UUyA9IGNsYXNzb2ZSYXcoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbi8vIGdldHRpbmcgdGFnIGZyb20gRVM2KyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2Bcbm1vZHVsZS5leHBvcnRzID0gVE9fU1RSSU5HX1RBR19TVVBQT1JUID8gY2xhc3NvZlJhdyA6IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgdGFnLCByZXN1bHQ7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mICh0YWcgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRPX1NUUklOR19UQUcpKSA9PSAnc3RyaW5nJyA/IHRhZ1xuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQ09SUkVDVF9BUkdVTUVOVFMgPyBjbGFzc29mUmF3KE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKHJlc3VsdCA9IGNsYXNzb2ZSYXcoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiByZXN1bHQ7XG59O1xuIiwidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG5cbnZhciBrZXlzID0gc2hhcmVkKCdrZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4ga2V5c1trZXldIHx8IChrZXlzW2tleV0gPSB1aWQoa2V5KSk7XG59O1xuIiwiLy8gdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEluZGV4ZWRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShpdCkpO1xufTtcbiIsInZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1zeW1ib2wnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfU1lNQk9MXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAmJiAhU3ltYm9sLnNoYW1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT0gJ3N5bWJvbCc7XG4iLCJicm93c2VyLnJ1bnRpbWUub25NZXNzYWdlLmFkZExpc3RlbmVyKChfcmVxdWVzdCwgX3NlbmRlciwgX3NlbmRSZXNwb25zZSkgPT4ge1xuICBjb25zb2xlLmxvZyhcIkhlbGxvIGZyb20gdGhlIGJhY2tncm91bmRcIik7XG5cbiAgYnJvd3Nlci50YWJzLmV4ZWN1dGVTY3JpcHQoe1xuICAgIGZpbGU6IFwianMvY29udGVudC1zY3JpcHQuanNcIlxuICB9KTtcbn0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuUHJvbWlzZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=,IAkvLyBUaGUgbW9kdWxlIGNhY2hlCiAJdmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTsKCiAJLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KIAlmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7CgogCQkvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGUKIAkJaWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHsKIAkJCXJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzOwogCQl9CiAJCS8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpCiAJCXZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHsKIAkJCWk6IG1vZHVsZUlkLAogCQkJbDogZmFsc2UsCiAJCQlleHBvcnRzOiB7fQogCQl9OwoKIAkJLy8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uCiAJCW1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pOwoKIAkJLy8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZAogCQltb2R1bGUubCA9IHRydWU7CgogCQkvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZQogCQlyZXR1cm4gbW9kdWxlLmV4cG9ydHM7CiAJfQoKCiAJLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXykKIAlfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzOwoKIAkvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZQogCV9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7CgogCS8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0cwogCV9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikgewogCQlpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7CiAJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTsKIAkJfQogCX07CgogCS8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHMKIAlfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7CiAJCWlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykgewogCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7CiAJCX0KIAkJT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsKIAl9OwoKIAkvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3QKIAkvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXQKIAkvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnMKIAkvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3QKIAkvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlCiAJX193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHsKIAkJaWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7CiAJCWlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7CiAJCWlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7CiAJCXZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAJCV9fd2VicGFja19yZXF1aXJlX18ucihucyk7CiAJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTsKIAkJaWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpOwogCQlyZXR1cm4gbnM7CiAJfTsKCiAJLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXMKIAlfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHsKIAkJdmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/CiAJCQlmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOgogCQkJZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTsKIAkJX193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpOwogCQlyZXR1cm4gZ2V0dGVyOwogCX07CgogCS8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbAogCV9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTsKCiAJLy8gX193ZWJwYWNrX3B1YmxpY19wYXRoX18KIAlfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSAiLyI7CgoKIAkvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHMKIAlyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxKTsK,dmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpOwoKdmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7CnZhciB0ZXN0ID0ge307Cgp0ZXN0W1RPX1NUUklOR19UQUddID0gJ3onOwoKbW9kdWxlLmV4cG9ydHMgPSBTdHJpbmcodGVzdCkgPT09ICdbb2JqZWN0IHpdJzsK,dmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7CgovLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmcKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQsIGxlbmd0aCkgewogIGFGdW5jdGlvbihmbik7CiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuOwogIHN3aXRjaCAobGVuZ3RoKSB7CiAgICBjYXNlIDA6IHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQpOwogICAgfTsKICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uIChhKSB7CiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpOwogICAgfTsKICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpOwogICAgfTsKICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7CiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpOwogICAgfTsKICB9CiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7CiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTsKICB9Owp9Owo=,dmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7CnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpOwp2YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7CnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTsKdmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpOwp2YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpOwp2YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUnKTsKCnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOwoKLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IKZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkgewogIE8gPSB0b0luZGV4ZWRPYmplY3QoTyk7CiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpOwogIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHsKICAgIHJldHVybiBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7CiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfQogIGlmIChoYXMoTywgUCkpIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoIXByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmYuY2FsbChPLCBQKSwgT1tQXSk7Cn07Cg==,dmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7CnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpOwp2YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpOwoKLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eQptb2R1bGUuZXhwb3J0cyA9ICFERVNDUklQVE9SUyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkgewogIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3JlYXRlRWxlbWVudCgnZGl2JyksICdhJywgewogICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9CiAgfSkuYSAhPSA3Owp9KTsK,bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIENvbnN0cnVjdG9yLCBuYW1lKSB7CiAgaWYgKCEoaXQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsKICAgIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0ICcgKyAobmFtZSA/IG5hbWUgKyAnICcgOiAnJykgKyAnaW52b2NhdGlvbicpOwogIH0gcmV0dXJuIGl0Owp9Owo=,dmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7Cgptb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ2RvY3VtZW50JywgJ2RvY3VtZW50RWxlbWVudCcpOwo=,bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKICBpZiAodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpIHsKICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgYSBmdW5jdGlvbicpOwogIH0gcmV0dXJuIGl0Owp9Owo=,dmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpOwoKdmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOwp2YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7Cgp0cnkgewogIHZhciBjYWxsZWQgPSAwOwogIHZhciBpdGVyYXRvcldpdGhSZXR1cm4gPSB7CiAgICBuZXh0OiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB7IGRvbmU6ICEhY2FsbGVkKysgfTsKICAgIH0sCiAgICAncmV0dXJuJzogZnVuY3Rpb24gKCkgewogICAgICBTQUZFX0NMT1NJTkcgPSB0cnVlOwogICAgfQogIH07CiAgaXRlcmF0b3JXaXRoUmV0dXJuW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHsKICAgIHJldHVybiB0aGlzOwogIH07CiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWwKICBBcnJheS5mcm9tKGl0ZXJhdG9yV2l0aFJldHVybiwgZnVuY3Rpb24gKCkgeyB0aHJvdyAyOyB9KTsKfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfQoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYywgU0tJUF9DTE9TSU5HKSB7CiAgaWYgKCFTS0lQX0NMT1NJTkcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlOwogIHZhciBJVEVSQVRJT05fU1VQUE9SVCA9IGZhbHNlOwogIHRyeSB7CiAgICB2YXIgb2JqZWN0ID0ge307CiAgICBvYmplY3RbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gewogICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiB7IGRvbmU6IElURVJBVElPTl9TVVBQT1JUID0gdHJ1ZSB9OwogICAgICAgIH0KICAgICAgfTsKICAgIH07CiAgICBleGVjKG9iamVjdCk7CiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfQogIHJldHVybiBJVEVSQVRJT05fU1VQUE9SVDsKfTsK,dmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpOwoKbW9kdWxlLmV4cG9ydHMgPSAvKGlwaG9uZXxpcG9kfGlwYWQpLiphcHBsZXdlYmtpdC9pLnRlc3QodXNlckFnZW50KTsK,Ly8gYFJlcXVpcmVPYmplY3RDb2VyY2libGVgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlcXVpcmVvYmplY3Rjb2VyY2libGUKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKICBpZiAoaXQgPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoIkNhbid0IGNhbGwgbWV0aG9kIG9uICIgKyBpdCk7CiAgcmV0dXJuIGl0Owp9Owo=,dmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpOwp2YXIgaXNBcnJheUl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZCcpOwp2YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7CnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpOwp2YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpOwp2YXIgaXRlcmF0b3JDbG9zZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jbG9zZScpOwoKdmFyIFJlc3VsdCA9IGZ1bmN0aW9uIChzdG9wcGVkLCByZXN1bHQpIHsKICB0aGlzLnN0b3BwZWQgPSBzdG9wcGVkOwogIHRoaXMucmVzdWx0ID0gcmVzdWx0Owp9OwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIHVuYm91bmRGdW5jdGlvbiwgb3B0aW9ucykgewogIHZhciB0aGF0ID0gb3B0aW9ucyAmJiBvcHRpb25zLnRoYXQ7CiAgdmFyIEFTX0VOVFJJRVMgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuQVNfRU5UUklFUyk7CiAgdmFyIElTX0lURVJBVE9SID0gISEob3B0aW9ucyAmJiBvcHRpb25zLklTX0lURVJBVE9SKTsKICB2YXIgSU5URVJSVVBURUQgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSU5URVJSVVBURUQpOwogIHZhciBmbiA9IGJpbmQodW5ib3VuZEZ1bmN0aW9uLCB0aGF0LCAxICsgQVNfRU5UUklFUyArIElOVEVSUlVQVEVEKTsKICB2YXIgaXRlcmF0b3IsIGl0ZXJGbiwgaW5kZXgsIGxlbmd0aCwgcmVzdWx0LCBuZXh0LCBzdGVwOwoKICB2YXIgc3RvcCA9IGZ1bmN0aW9uIChjb25kaXRpb24pIHsKICAgIGlmIChpdGVyYXRvcikgaXRlcmF0b3JDbG9zZShpdGVyYXRvcik7CiAgICByZXR1cm4gbmV3IFJlc3VsdCh0cnVlLCBjb25kaXRpb24pOwogIH07CgogIHZhciBjYWxsRm4gPSBmdW5jdGlvbiAodmFsdWUpIHsKICAgIGlmIChBU19FTlRSSUVTKSB7CiAgICAgIGFuT2JqZWN0KHZhbHVlKTsKICAgICAgcmV0dXJuIElOVEVSUlVQVEVEID8gZm4odmFsdWVbMF0sIHZhbHVlWzFdLCBzdG9wKSA6IGZuKHZhbHVlWzBdLCB2YWx1ZVsxXSk7CiAgICB9IHJldHVybiBJTlRFUlJVUFRFRCA/IGZuKHZhbHVlLCBzdG9wKSA6IGZuKHZhbHVlKTsKICB9OwoKICBpZiAoSVNfSVRFUkFUT1IpIHsKICAgIGl0ZXJhdG9yID0gaXRlcmFibGU7CiAgfSBlbHNlIHsKICAgIGl0ZXJGbiA9IGdldEl0ZXJhdG9yTWV0aG9kKGl0ZXJhYmxlKTsKICAgIGlmICh0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcignVGFyZ2V0IGlzIG5vdCBpdGVyYWJsZScpOwogICAgLy8gb3B0aW1pc2F0aW9uIGZvciBhcnJheSBpdGVyYXRvcnMKICAgIGlmIChpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlckZuKSkgewogICAgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHsKICAgICAgICByZXN1bHQgPSBjYWxsRm4oaXRlcmFibGVbaW5kZXhdKTsKICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdCBpbnN0YW5jZW9mIFJlc3VsdCkgcmV0dXJuIHJlc3VsdDsKICAgICAgfSByZXR1cm4gbmV3IFJlc3VsdChmYWxzZSk7CiAgICB9CiAgICBpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTsKICB9CgogIG5leHQgPSBpdGVyYXRvci5uZXh0OwogIHdoaWxlICghKHN0ZXAgPSBuZXh0LmNhbGwoaXRlcmF0b3IpKS5kb25lKSB7CiAgICB0cnkgewogICAgICByZXN1bHQgPSBjYWxsRm4oc3RlcC52YWx1ZSk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTsKICAgICAgdGhyb3cgZXJyb3I7CiAgICB9CiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PSAnb2JqZWN0JyAmJiByZXN1bHQgJiYgcmVzdWx0IGluc3RhbmNlb2YgUmVzdWx0KSByZXR1cm4gcmVzdWx0OwogIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpOwp9Owo=,dmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7Cgp2YXIgbWF4ID0gTWF0aC5tYXg7CnZhciBtaW4gPSBNYXRoLm1pbjsKCi8vIEhlbHBlciBmb3IgYSBwb3B1bGFyIHJlcGVhdGluZyBjYXNlIG9mIHRoZSBzcGVjOgovLyBMZXQgaW50ZWdlciBiZSA/IFRvSW50ZWdlcihpbmRleCkuCi8vIElmIGludGVnZXIgPCAwLCBsZXQgcmVzdWx0IGJlIG1heCgobGVuZ3RoICsgaW50ZWdlciksIDApOyBlbHNlIGxldCByZXN1bHQgYmUgbWluKGludGVnZXIsIGxlbmd0aCkuCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGluZGV4LCBsZW5ndGgpIHsKICB2YXIgaW50ZWdlciA9IHRvSW50ZWdlcihpbmRleCk7CiAgcmV0dXJuIGludGVnZXIgPCAwID8gbWF4KGludGVnZXIgKyBsZW5ndGgsIDApIDogbWluKGludGVnZXIsIGxlbmd0aCk7Cn07Cg==,dmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTsKdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjsKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTsKdmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7CnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpOwp2YXIgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMnKTsKdmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpOwoKLyoKICBvcHRpb25zLnRhcmdldCAgICAgIC0gbmFtZSBvZiB0aGUgdGFyZ2V0IG9iamVjdAogIG9wdGlvbnMuZ2xvYmFsICAgICAgLSB0YXJnZXQgaXMgdGhlIGdsb2JhbCBvYmplY3QKICBvcHRpb25zLnN0YXQgICAgICAgIC0gZXhwb3J0IGFzIHN0YXRpYyBtZXRob2RzIG9mIHRhcmdldAogIG9wdGlvbnMucHJvdG8gICAgICAgLSBleHBvcnQgYXMgcHJvdG90eXBlIG1ldGhvZHMgb2YgdGFyZ2V0CiAgb3B0aW9ucy5yZWFsICAgICAgICAtIHJlYWwgcHJvdG90eXBlIG1ldGhvZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uCiAgb3B0aW9ucy5mb3JjZWQgICAgICAtIGV4cG9ydCBldmVuIGlmIHRoZSBuYXRpdmUgZmVhdHVyZSBpcyBhdmFpbGFibGUKICBvcHRpb25zLmJpbmQgICAgICAgIC0gYmluZCBtZXRob2RzIHRvIHRoZSB0YXJnZXQsIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb24KICBvcHRpb25zLndyYXAgICAgICAgIC0gd3JhcCBjb25zdHJ1Y3RvcnMgdG8gcHJldmVudGluZyBnbG9iYWwgcG9sbHV0aW9uLCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uCiAgb3B0aW9ucy51bnNhZmUgICAgICAtIHVzZSB0aGUgc2ltcGxlIGFzc2lnbm1lbnQgb2YgcHJvcGVydHkgaW5zdGVhZCBvZiBkZWxldGUgKyBkZWZpbmVQcm9wZXJ0eQogIG9wdGlvbnMuc2hhbSAgICAgICAgLSBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzCiAgb3B0aW9ucy5lbnVtZXJhYmxlICAtIGV4cG9ydCBhcyBlbnVtZXJhYmxlIHByb3BlcnR5CiAgb3B0aW9ucy5ub1RhcmdldEdldCAtIHByZXZlbnQgY2FsbGluZyBhIGdldHRlciBvbiB0YXJnZXQKKi8KbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7CiAgdmFyIFRBUkdFVCA9IG9wdGlvbnMudGFyZ2V0OwogIHZhciBHTE9CQUwgPSBvcHRpb25zLmdsb2JhbDsKICB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0OwogIHZhciBGT1JDRUQsIHRhcmdldCwga2V5LCB0YXJnZXRQcm9wZXJ0eSwgc291cmNlUHJvcGVydHksIGRlc2NyaXB0b3I7CiAgaWYgKEdMT0JBTCkgewogICAgdGFyZ2V0ID0gZ2xvYmFsOwogIH0gZWxzZSBpZiAoU1RBVElDKSB7CiAgICB0YXJnZXQgPSBnbG9iYWxbVEFSR0VUXSB8fCBzZXRHbG9iYWwoVEFSR0VULCB7fSk7CiAgfSBlbHNlIHsKICAgIHRhcmdldCA9IChnbG9iYWxbVEFSR0VUXSB8fCB7fSkucHJvdG90eXBlOwogIH0KICBpZiAodGFyZ2V0KSBmb3IgKGtleSBpbiBzb3VyY2UpIHsKICAgIHNvdXJjZVByb3BlcnR5ID0gc291cmNlW2tleV07CiAgICBpZiAob3B0aW9ucy5ub1RhcmdldEdldCkgewogICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTsKICAgICAgdGFyZ2V0UHJvcGVydHkgPSBkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IudmFsdWU7CiAgICB9IGVsc2UgdGFyZ2V0UHJvcGVydHkgPSB0YXJnZXRba2V5XTsKICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7CiAgICAvLyBjb250YWluZWQgaW4gdGFyZ2V0CiAgICBpZiAoIUZPUkNFRCAmJiB0YXJnZXRQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT09IHR5cGVvZiB0YXJnZXRQcm9wZXJ0eSkgY29udGludWU7CiAgICAgIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoc291cmNlUHJvcGVydHksIHRhcmdldFByb3BlcnR5KTsKICAgIH0KICAgIC8vIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHMKICAgIGlmIChvcHRpb25zLnNoYW0gfHwgKHRhcmdldFByb3BlcnR5ICYmIHRhcmdldFByb3BlcnR5LnNoYW0pKSB7CiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShzb3VyY2VQcm9wZXJ0eSwgJ3NoYW0nLCB0cnVlKTsKICAgIH0KICAgIC8vIGV4dGVuZCBnbG9iYWwKICAgIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzb3VyY2VQcm9wZXJ0eSwgb3B0aW9ucyk7CiAgfQp9Owo=,dmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpOwp2YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpOwoKdmFyIGhpZGRlbktleXMgPSBlbnVtQnVnS2V5cy5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTsKCi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5bmFtZXMKZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7CiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBoaWRkZW5LZXlzKTsKfTsK,J3VzZSBzdHJpY3QnOwp2YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTsKdmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpOwp2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTsKCnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUl9OQU1FKSB7CiAgdmFyIENvbnN0cnVjdG9yID0gZ2V0QnVpbHRJbihDT05TVFJVQ1RPUl9OQU1FKTsKICB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mOwoKICBpZiAoREVTQ1JJUFRPUlMgJiYgQ29uc3RydWN0b3IgJiYgIUNvbnN0cnVjdG9yW1NQRUNJRVNdKSB7CiAgICBkZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgU1BFQ0lFUywgewogICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfQogICAgfSk7CiAgfQp9Owo=,dmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IpIHsKICB2YXIgcmV0dXJuTWV0aG9kID0gaXRlcmF0b3JbJ3JldHVybiddOwogIGlmIChyZXR1cm5NZXRob2QgIT09IHVuZGVmaW5lZCkgewogICAgcmV0dXJuIGFuT2JqZWN0KHJldHVybk1ldGhvZC5jYWxsKGl0ZXJhdG9yKSkudmFsdWU7CiAgfQp9Owo=,dmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTsKdmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7CnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpOwp2YXIgaHRtbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9odG1sJyk7CnZhciBjcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7CnZhciBJU19JT1MgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcycpOwp2YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZScpOwoKdmFyIGxvY2F0aW9uID0gZ2xvYmFsLmxvY2F0aW9uOwp2YXIgc2V0ID0gZ2xvYmFsLnNldEltbWVkaWF0ZTsKdmFyIGNsZWFyID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlOwp2YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzOwp2YXIgTWVzc2FnZUNoYW5uZWwgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWw7CnZhciBEaXNwYXRjaCA9IGdsb2JhbC5EaXNwYXRjaDsKdmFyIGNvdW50ZXIgPSAwOwp2YXIgcXVldWUgPSB7fTsKdmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnOwp2YXIgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7Cgp2YXIgcnVuID0gZnVuY3Rpb24gKGlkKSB7CiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGlucwogIGlmIChxdWV1ZS5oYXNPd25Qcm9wZXJ0eShpZCkpIHsKICAgIHZhciBmbiA9IHF1ZXVlW2lkXTsKICAgIGRlbGV0ZSBxdWV1ZVtpZF07CiAgICBmbigpOwogIH0KfTsKCnZhciBydW5uZXIgPSBmdW5jdGlvbiAoaWQpIHsKICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgcnVuKGlkKTsKICB9Owp9OwoKdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgcnVuKGV2ZW50LmRhdGEpOwp9OwoKdmFyIHBvc3QgPSBmdW5jdGlvbiAoaWQpIHsKICAvLyBvbGQgZW5naW5lcyBoYXZlIG5vdCBsb2NhdGlvbi5vcmlnaW4KICBnbG9iYWwucG9zdE1lc3NhZ2UoaWQgKyAnJywgbG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgbG9jYXRpb24uaG9zdCk7Cn07CgovLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6CmlmICghc2V0IHx8ICFjbGVhcikgewogIHNldCA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbikgewogICAgdmFyIGFyZ3MgPSBbXTsKICAgIHZhciBpID0gMTsKICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTsKICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuYwogICAgICAodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSkuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTsKICAgIH07CiAgICBkZWZlcihjb3VudGVyKTsKICAgIHJldHVybiBjb3VudGVyOwogIH07CiAgY2xlYXIgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCkgewogICAgZGVsZXRlIHF1ZXVlW2lkXTsKICB9OwogIC8vIE5vZGUuanMgMC44LQogIGlmIChJU19OT0RFKSB7CiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkgewogICAgICBwcm9jZXNzLm5leHRUaWNrKHJ1bm5lcihpZCkpOwogICAgfTsKICAvLyBTcGhlcmUgKEpTIGdhbWUgZW5naW5lKSBEaXNwYXRjaCBBUEkKICB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykgewogICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHsKICAgICAgRGlzcGF0Y2gubm93KHJ1bm5lcihpZCkpOwogICAgfTsKICAvLyBCcm93c2VycyB3aXRoIE1lc3NhZ2VDaGFubmVsLCBpbmNsdWRlcyBXZWJXb3JrZXJzCiAgLy8gZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82MjQKICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsICYmICFJU19JT1MpIHsKICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTsKICAgIHBvcnQgPSBjaGFubmVsLnBvcnQyOwogICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0ZW5lcjsKICAgIGRlZmVyID0gYmluZChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0LCAxKTsKICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnMKICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0JwogIH0gZWxzZSBpZiAoCiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJgogICAgdHlwZW9mIHBvc3RNZXNzYWdlID09ICdmdW5jdGlvbicgJiYKICAgICFnbG9iYWwuaW1wb3J0U2NyaXB0cyAmJgogICAgbG9jYXRpb24gJiYgbG9jYXRpb24ucHJvdG9jb2wgIT09ICdmaWxlOicgJiYKICAgICFmYWlscyhwb3N0KQogICkgewogICAgZGVmZXIgPSBwb3N0OwogICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBsaXN0ZW5lciwgZmFsc2UpOwogIC8vIElFOC0KICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkgewogICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHsKICAgICAgaHRtbC5hcHBlbmRDaGlsZChjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpOwogICAgICAgIHJ1bihpZCk7CiAgICAgIH07CiAgICB9OwogIC8vIFJlc3Qgb2xkIGJyb3dzZXJzCiAgfSBlbHNlIHsKICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7CiAgICAgIHNldFRpbWVvdXQocnVubmVyKGlkKSwgMCk7CiAgICB9OwogIH0KfQoKbW9kdWxlLmV4cG9ydHMgPSB7CiAgc2V0OiBzZXQsCiAgY2xlYXI6IGNsZWFyCn07Cg==,dmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTsKdmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpOwoKdmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzczsKdmFyIHZlcnNpb25zID0gcHJvY2VzcyAmJiBwcm9jZXNzLnZlcnNpb25zOwp2YXIgdjggPSB2ZXJzaW9ucyAmJiB2ZXJzaW9ucy52ODsKdmFyIG1hdGNoLCB2ZXJzaW9uOwoKaWYgKHY4KSB7CiAgbWF0Y2ggPSB2OC5zcGxpdCgnLicpOwogIHZlcnNpb24gPSBtYXRjaFswXSArIG1hdGNoWzFdOwp9IGVsc2UgaWYgKHVzZXJBZ2VudCkgewogIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9FZGdlXC8oXGQrKS8pOwogIGlmICghbWF0Y2ggfHwgbWF0Y2hbMV0gPj0gNzQpIHsKICAgIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcLyhcZCspLyk7CiAgICBpZiAobWF0Y2gpIHZlcnNpb24gPSBtYXRjaFsxXTsKICB9Cn0KCm1vZHVsZS5leHBvcnRzID0gdmVyc2lvbiAmJiArdmVyc2lvbjsK,dmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7Cgptb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ25hdmlnYXRvcicsICd1c2VyQWdlbnQnKSB8fCAnJzsK,dmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpOwp2YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7Cgp2YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgewogIGlmIChpdCAhPSB1bmRlZmluZWQpIHJldHVybiBpdFtJVEVSQVRPUl0KICAgIHx8IGl0WydAQGl0ZXJhdG9yJ10KICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07Cn07Cg==,dmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7CnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7CnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTsKdmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTsKCi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnRpZXMKbW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7CiAgYW5PYmplY3QoTyk7CiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKFByb3BlcnRpZXMpOwogIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDsKICB2YXIgaW5kZXggPSAwOwogIHZhciBrZXk7CiAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKE8sIGtleSA9IGtleXNbaW5kZXgrK10sIFByb3BlcnRpZXNba2V5XSk7CiAgcmV0dXJuIE87Cn07Cg==,dmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKICBpZiAoIWlzT2JqZWN0KGl0KSAmJiBpdCAhPT0gbnVsbCkgewogICAgdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBzZXQgIiArIFN0cmluZyhpdCkgKyAnIGFzIGEgcHJvdG90eXBlJyk7CiAgfSByZXR1cm4gaXQ7Cn07Cg==,bW9kdWxlLmV4cG9ydHMgPSB7fTsK,dmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTsKCm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsOwo=,dmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7CnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7Cgp2YXIgc3BsaXQgPSAnJy5zcGxpdDsKCi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzCm1vZHVsZS5leHBvcnRzID0gZmFpbHMoZnVuY3Rpb24gKCkgewogIC8vIHRocm93cyBhbiBlcnJvciBpbiByaGlubywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3JoaW5vL2lzc3Vlcy8zNDYKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zCiAgcmV0dXJuICFPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKTsKfSkgPyBmdW5jdGlvbiAoaXQpIHsKICByZXR1cm4gY2xhc3NvZihpdCkgPT0gJ1N0cmluZycgPyBzcGxpdC5jYWxsKGl0LCAnJykgOiBPYmplY3QoaXQpOwp9IDogT2JqZWN0Owo=,dmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpOwp2YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTsKdmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTsKCnZhciBVTlNDT1BBQkxFUyA9IHdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTsKdmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlOwoKLy8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXMKaWYgKEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXSA9PSB1bmRlZmluZWQpIHsKICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKEFycmF5UHJvdG90eXBlLCBVTlNDT1BBQkxFUywgewogICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgdmFsdWU6IGNyZWF0ZShudWxsKQogIH0pOwp9CgovLyBhZGQgYSBrZXkgdG8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkgewogIEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTsKfTsK,dmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGEsIGIpIHsKICB2YXIgY29uc29sZSA9IGdsb2JhbC5jb25zb2xlOwogIGlmIChjb25zb2xlICYmIGNvbnNvbGUuZXJyb3IpIHsKICAgIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBjb25zb2xlLmVycm9yKGEpIDogY29uc29sZS5lcnJvcihhLCBiKTsKICB9Cn07Cg==,dmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpOwp2YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpOwoKdmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTsKCi8vIGBTcGVjaWVzQ29uc3RydWN0b3JgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNwZWNpZXNjb25zdHJ1Y3Rvcgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBkZWZhdWx0Q29uc3RydWN0b3IpIHsKICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yOwogIHZhciBTOwogIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gZGVmYXVsdENvbnN0cnVjdG9yIDogYUZ1bmN0aW9uKFMpOwp9Owo=,dmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7Cgptb2R1bGUuZXhwb3J0cyA9ICEhT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkgewogIC8vIENocm9tZSAzOCBTeW1ib2wgaGFzIGluY29ycmVjdCB0b1N0cmluZyBjb252ZXJzaW9uCiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmCiAgcmV0dXJuICFTdHJpbmcoU3ltYm9sKCkpOwp9KTsK,dmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpOwp2YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7CnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXgnKTsKCi8vIGBBcnJheS5wcm90b3R5cGUueyBpbmRleE9mLCBpbmNsdWRlcyB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uCnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHsKICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBlbCwgZnJvbUluZGV4KSB7CiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdCgkdGhpcyk7CiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpOwogICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTsKICAgIHZhciB2YWx1ZTsKICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG0KICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUKICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7CiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTsKICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZQogICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlOwogICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdAogICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7CiAgICAgIGlmICgoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTykgJiYgT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDsKICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTsKICB9Owp9OwoKbW9kdWxlLmV4cG9ydHMgPSB7CiAgLy8gYEFycmF5LnByb3RvdHlwZS5pbmNsdWRlc2AgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5jbHVkZXMKICBpbmNsdWRlczogY3JlYXRlTWV0aG9kKHRydWUpLAogIC8vIGBBcnJheS5wcm90b3R5cGUuaW5kZXhPZmAgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5kZXhvZgogIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZChmYWxzZSkKfTsK,dmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7Cgp2YXIgbWluID0gTWF0aC5taW47CgovLyBgVG9MZW5ndGhgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvbGVuZ3RoCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7CiAgcmV0dXJuIGFyZ3VtZW50ID4gMCA/IG1pbih0b0ludGVnZXIoYXJndW1lbnQpLCAweDFGRkZGRkZGRkZGRkZGKSA6IDA7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTEKfTsK,dmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwga2V5KSB7CiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7Cn07Cg==,dmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpOwp2YXIgc3RvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7CgoobW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pOwp9KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7CiAgdmVyc2lvbjogJzMuOC4zJywKICBtb2RlOiBJU19QVVJFID8gJ3B1cmUnIDogJ2dsb2JhbCcsCiAgY29weXJpZ2h0OiAnwqkgMjAyMSBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KScKfSk7Cg==,dmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7CnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7CnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpOwp2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7CgovLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzCm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdvd25LZXlzJykgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCkgewogIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mKGFuT2JqZWN0KGl0KSk7CiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mOwogIHJldHVybiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBrZXlzLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpKSA6IGtleXM7Cn07Cg==,bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkgewogIHJldHVybiB7CiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLAogICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLAogICAgd3JpdGFibGU6ICEoYml0bWFwICYgNCksCiAgICB2YWx1ZTogdmFsdWUKICB9Owp9Owo=,dmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTsKdmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTsKCm1vZHVsZS5leHBvcnRzID0gY2xhc3NvZihnbG9iYWwucHJvY2VzcykgPT0gJ3Byb2Nlc3MnOwo=,J3VzZSBzdHJpY3QnOwp2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTsKdmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7CnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7CnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpOwp2YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKTsKdmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpOwp2YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpOwoKdmFyIG5hdGl2ZUFzc2lnbiA9IE9iamVjdC5hc3NpZ247CnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKCi8vIGBPYmplY3QuYXNzaWduYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuYXNzaWduCm1vZHVsZS5leHBvcnRzID0gIW5hdGl2ZUFzc2lnbiB8fCBmYWlscyhmdW5jdGlvbiAoKSB7CiAgLy8gc2hvdWxkIGhhdmUgY29ycmVjdCBvcmRlciBvZiBvcGVyYXRpb25zIChFZGdlIGJ1ZykKICBpZiAoREVTQ1JJUFRPUlMgJiYgbmF0aXZlQXNzaWduKHsgYjogMSB9LCBuYXRpdmVBc3NpZ24oZGVmaW5lUHJvcGVydHkoe30sICdhJywgewogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYicsIHsKICAgICAgICB2YWx1ZTogMywKICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZQogICAgICB9KTsKICAgIH0KICB9KSwgeyBiOiAyIH0pKS5iICE9PSAxKSByZXR1cm4gdHJ1ZTsKICAvLyBzaG91bGQgd29yayB3aXRoIHN5bWJvbHMgYW5kIHNob3VsZCBoYXZlIGRldGVybWluaXN0aWMgcHJvcGVydHkgb3JkZXIgKFY4IGJ1ZykKICB2YXIgQSA9IHt9OwogIHZhciBCID0ge307CiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmCiAgdmFyIHN5bWJvbCA9IFN5bWJvbCgpOwogIHZhciBhbHBoYWJldCA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7CiAgQVtzeW1ib2xdID0gNzsKICBhbHBoYWJldC5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAoY2hyKSB7IEJbY2hyXSA9IGNocjsgfSk7CiAgcmV0dXJuIG5hdGl2ZUFzc2lnbih7fSwgQSlbc3ltYm9sXSAhPSA3IHx8IG9iamVjdEtleXMobmF0aXZlQXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gYWxwaGFiZXQ7Cn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICB2YXIgVCA9IHRvT2JqZWN0KHRhcmdldCk7CiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgdmFyIGluZGV4ID0gMTsKICB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7CiAgdmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZjsKICB3aGlsZSAoYXJndW1lbnRzTGVuZ3RoID4gaW5kZXgpIHsKICAgIHZhciBTID0gSW5kZXhlZE9iamVjdChhcmd1bWVudHNbaW5kZXgrK10pOwogICAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBvYmplY3RLZXlzKFMpLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoUykpIDogb2JqZWN0S2V5cyhTKTsKICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDsKICAgIHZhciBqID0gMDsKICAgIHZhciBrZXk7CiAgICB3aGlsZSAobGVuZ3RoID4gaikgewogICAgICBrZXkgPSBrZXlzW2orK107CiAgICAgIGlmICghREVTQ1JJUFRPUlMgfHwgcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChTLCBrZXkpKSBUW2tleV0gPSBTW2tleV07CiAgICB9CiAgfSByZXR1cm4gVDsKfSA6IG5hdGl2ZUFzc2lnbjsK,dmFyIE5BVElWRV9XRUFLX01BUCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAnKTsKdmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTsKdmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpOwp2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpOwp2YXIgb2JqZWN0SGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpOwp2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZScpOwp2YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTsKdmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTsKCnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7CnZhciBzZXQsIGdldCwgaGFzOwoKdmFyIGVuZm9yY2UgPSBmdW5jdGlvbiAoaXQpIHsKICByZXR1cm4gaGFzKGl0KSA/IGdldChpdCkgOiBzZXQoaXQsIHt9KTsKfTsKCnZhciBnZXR0ZXJGb3IgPSBmdW5jdGlvbiAoVFlQRSkgewogIHJldHVybiBmdW5jdGlvbiAoaXQpIHsKICAgIHZhciBzdGF0ZTsKICAgIGlmICghaXNPYmplY3QoaXQpIHx8IChzdGF0ZSA9IGdldChpdCkpLnR5cGUgIT09IFRZUEUpIHsKICAgICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCcpOwogICAgfSByZXR1cm4gc3RhdGU7CiAgfTsKfTsKCmlmIChOQVRJVkVfV0VBS19NQVApIHsKICB2YXIgc3RvcmUgPSBzaGFyZWQuc3RhdGUgfHwgKHNoYXJlZC5zdGF0ZSA9IG5ldyBXZWFrTWFwKCkpOwogIHZhciB3bWdldCA9IHN0b3JlLmdldDsKICB2YXIgd21oYXMgPSBzdG9yZS5oYXM7CiAgdmFyIHdtc2V0ID0gc3RvcmUuc2V0OwogIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHsKICAgIG1ldGFkYXRhLmZhY2FkZSA9IGl0OwogICAgd21zZXQuY2FsbChzdG9yZSwgaXQsIG1ldGFkYXRhKTsKICAgIHJldHVybiBtZXRhZGF0YTsKICB9OwogIGdldCA9IGZ1bmN0aW9uIChpdCkgewogICAgcmV0dXJuIHdtZ2V0LmNhbGwoc3RvcmUsIGl0KSB8fCB7fTsKICB9OwogIGhhcyA9IGZ1bmN0aW9uIChpdCkgewogICAgcmV0dXJuIHdtaGFzLmNhbGwoc3RvcmUsIGl0KTsKICB9Owp9IGVsc2UgewogIHZhciBTVEFURSA9IHNoYXJlZEtleSgnc3RhdGUnKTsKICBoaWRkZW5LZXlzW1NUQVRFXSA9IHRydWU7CiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkgewogICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7CiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoaXQsIFNUQVRFLCBtZXRhZGF0YSk7CiAgICByZXR1cm4gbWV0YWRhdGE7CiAgfTsKICBnZXQgPSBmdW5jdGlvbiAoaXQpIHsKICAgIHJldHVybiBvYmplY3RIYXMoaXQsIFNUQVRFKSA/IGl0W1NUQVRFXSA6IHt9OwogIH07CiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7CiAgICByZXR1cm4gb2JqZWN0SGFzKGl0LCBTVEFURSk7CiAgfTsKfQoKbW9kdWxlLmV4cG9ydHMgPSB7CiAgc2V0OiBzZXQsCiAgZ2V0OiBnZXQsCiAgaGFzOiBoYXMsCiAgZW5mb3JjZTogZW5mb3JjZSwKICBnZXR0ZXJGb3I6IGdldHRlckZvcgp9Owo=,dmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTsKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTsKdmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTsKdmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7CnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7CnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7Cgp2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0Owp2YXIgZW5mb3JjZUludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmVuZm9yY2U7CnZhciBURU1QTEFURSA9IFN0cmluZyhTdHJpbmcpLnNwbGl0KCdTdHJpbmcnKTsKCihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBrZXksIHZhbHVlLCBvcHRpb25zKSB7CiAgdmFyIHVuc2FmZSA9IG9wdGlvbnMgPyAhIW9wdGlvbnMudW5zYWZlIDogZmFsc2U7CiAgdmFyIHNpbXBsZSA9IG9wdGlvbnMgPyAhIW9wdGlvbnMuZW51bWVyYWJsZSA6IGZhbHNlOwogIHZhciBub1RhcmdldEdldCA9IG9wdGlvbnMgPyAhIW9wdGlvbnMubm9UYXJnZXRHZXQgOiBmYWxzZTsKICB2YXIgc3RhdGU7CiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7CiAgICBpZiAodHlwZW9mIGtleSA9PSAnc3RyaW5nJyAmJiAhaGFzKHZhbHVlLCAnbmFtZScpKSB7CiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSh2YWx1ZSwgJ25hbWUnLCBrZXkpOwogICAgfQogICAgc3RhdGUgPSBlbmZvcmNlSW50ZXJuYWxTdGF0ZSh2YWx1ZSk7CiAgICBpZiAoIXN0YXRlLnNvdXJjZSkgewogICAgICBzdGF0ZS5zb3VyY2UgPSBURU1QTEFURS5qb2luKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyBrZXkgOiAnJyk7CiAgICB9CiAgfQogIGlmIChPID09PSBnbG9iYWwpIHsKICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlOwogICAgZWxzZSBzZXRHbG9iYWwoa2V5LCB2YWx1ZSk7CiAgICByZXR1cm47CiAgfSBlbHNlIGlmICghdW5zYWZlKSB7CiAgICBkZWxldGUgT1trZXldOwogIH0gZWxzZSBpZiAoIW5vVGFyZ2V0R2V0ICYmIE9ba2V5XSkgewogICAgc2ltcGxlID0gdHJ1ZTsKICB9CiAgaWYgKHNpbXBsZSkgT1trZXldID0gdmFsdWU7CiAgZWxzZSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoTywga2V5LCB2YWx1ZSk7Ci8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZQp9KShGdW5jdGlvbi5wcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkgewogIHJldHVybiB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nICYmIGdldEludGVybmFsU3RhdGUodGhpcykuc291cmNlIHx8IGluc3BlY3RTb3VyY2UodGhpcyk7Cn0pOwo=,ZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sczsK,Ly8gSUU4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzCm1vZHVsZS5leHBvcnRzID0gWwogICdjb25zdHJ1Y3RvcicsCiAgJ2hhc093blByb3BlcnR5JywKICAnaXNQcm90b3R5cGVPZicsCiAgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywKICAndG9Mb2NhbGVTdHJpbmcnLAogICd0b1N0cmluZycsCiAgJ3ZhbHVlT2YnCl07Cg==,dmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7CgovLyBgVG9PYmplY3RgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvb2JqZWN0Cm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7CiAgcmV0dXJuIE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KSk7Cn07Cg==,dmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpOwp2YXIgZGVmaW5lUHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMnKTsKdmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTsKdmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTsKdmFyIGh0bWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaHRtbCcpOwp2YXIgZG9jdW1lbnRDcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7CnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpOwoKdmFyIEdUID0gJz4nOwp2YXIgTFQgPSAnPCc7CnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJzsKdmFyIFNDUklQVCA9ICdzY3JpcHQnOwp2YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7Cgp2YXIgRW1wdHlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTsKCnZhciBzY3JpcHRUYWcgPSBmdW5jdGlvbiAoY29udGVudCkgewogIHJldHVybiBMVCArIFNDUklQVCArIEdUICsgY29udGVudCArIExUICsgJy8nICsgU0NSSVBUICsgR1Q7Cn07CgovLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgQWN0aXZlWCBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZQp2YXIgTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWCA9IGZ1bmN0aW9uIChhY3RpdmVYRG9jdW1lbnQpIHsKICBhY3RpdmVYRG9jdW1lbnQud3JpdGUoc2NyaXB0VGFnKCcnKSk7CiAgYWN0aXZlWERvY3VtZW50LmNsb3NlKCk7CiAgdmFyIHRlbXAgPSBhY3RpdmVYRG9jdW1lbnQucGFyZW50V2luZG93Lk9iamVjdDsKICBhY3RpdmVYRG9jdW1lbnQgPSBudWxsOyAvLyBhdm9pZCBtZW1vcnkgbGVhawogIHJldHVybiB0ZW1wOwp9OwoKLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZQp2YXIgTnVsbFByb3RvT2JqZWN0VmlhSUZyYW1lID0gZnVuY3Rpb24gKCkgewogIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnCiAgdmFyIGlmcmFtZSA9IGRvY3VtZW50Q3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7CiAgdmFyIEpTID0gJ2phdmEnICsgU0NSSVBUICsgJzonOwogIHZhciBpZnJhbWVEb2N1bWVudDsKICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICBodG1sLmFwcGVuZENoaWxkKGlmcmFtZSk7CiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzQ3NQogIGlmcmFtZS5zcmMgPSBTdHJpbmcoSlMpOwogIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7CiAgaWZyYW1lRG9jdW1lbnQub3BlbigpOwogIGlmcmFtZURvY3VtZW50LndyaXRlKHNjcmlwdFRhZygnZG9jdW1lbnQuRj1PYmplY3QnKSk7CiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTsKICByZXR1cm4gaWZyYW1lRG9jdW1lbnQuRjsKfTsKCi8vIENoZWNrIGZvciBkb2N1bWVudC5kb21haW4gYW5kIGFjdGl2ZSB4IHN1cHBvcnQKLy8gTm8gbmVlZCB0byB1c2UgYWN0aXZlIHggYXBwcm9hY2ggd2hlbiBkb2N1bWVudC5kb21haW4gaXMgbm90IHNldAovLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltL2lzc3Vlcy8xNTAKLy8gdmFyaWF0aW9uIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9raXRjYW1icmlkZ2UvZXM1LXNoaW0vY29tbWl0LzRmNzM4YWMwNjYzNDYKLy8gYXZvaWQgSUUgR0MgYnVnCnZhciBhY3RpdmVYRG9jdW1lbnQ7CnZhciBOdWxsUHJvdG9PYmplY3QgPSBmdW5jdGlvbiAoKSB7CiAgdHJ5IHsKICAgIC8qIGdsb2JhbCBBY3RpdmVYT2JqZWN0ICovCiAgICBhY3RpdmVYRG9jdW1lbnQgPSBkb2N1bWVudC5kb21haW4gJiYgbmV3IEFjdGl2ZVhPYmplY3QoJ2h0bWxmaWxlJyk7CiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogaWdub3JlICovIH0KICBOdWxsUHJvdG9PYmplY3QgPSBhY3RpdmVYRG9jdW1lbnQgPyBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYKGFjdGl2ZVhEb2N1bWVudCkgOiBOdWxsUHJvdG9PYmplY3RWaWFJRnJhbWUoKTsKICB2YXIgbGVuZ3RoID0gZW51bUJ1Z0tleXMubGVuZ3RoOwogIHdoaWxlIChsZW5ndGgtLSkgZGVsZXRlIE51bGxQcm90b09iamVjdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2xlbmd0aF1dOwogIHJldHVybiBOdWxsUHJvdG9PYmplY3QoKTsKfTsKCmhpZGRlbktleXNbSUVfUFJPVE9dID0gdHJ1ZTsKCi8vIGBPYmplY3QuY3JlYXRlYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuY3JlYXRlCm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykgewogIHZhciByZXN1bHQ7CiAgaWYgKE8gIT09IG51bGwpIHsKICAgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pOwogICAgcmVzdWx0ID0gbmV3IEVtcHR5Q29uc3RydWN0b3IoKTsKICAgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IG51bGw7CiAgICAvLyBhZGQgIl9fcHJvdG9fXyIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbAogICAgcmVzdWx0W0lFX1BST1RPXSA9IE87CiAgfSBlbHNlIHJlc3VsdCA9IE51bGxQcm90b09iamVjdCgpOwogIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCwgUHJvcGVydGllcyk7Cn07Cg==,J3VzZSBzdHJpY3QnOwp2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTsKdmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yJyk7CnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpOwp2YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTsKdmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7CnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7CnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7CnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTsKdmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTsKdmFyIEl0ZXJhdG9yc0NvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUnKTsKCnZhciBJdGVyYXRvclByb3RvdHlwZSA9IEl0ZXJhdG9yc0NvcmUuSXRlcmF0b3JQcm90b3R5cGU7CnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gSXRlcmF0b3JzQ29yZS5CVUdHWV9TQUZBUklfSVRFUkFUT1JTOwp2YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7CnZhciBLRVlTID0gJ2tleXMnOwp2YXIgVkFMVUVTID0gJ3ZhbHVlcyc7CnZhciBFTlRSSUVTID0gJ2VudHJpZXMnOwoKdmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9OwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmFibGUsIE5BTUUsIEl0ZXJhdG9yQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7CiAgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTsKCiAgdmFyIGdldEl0ZXJhdGlvbk1ldGhvZCA9IGZ1bmN0aW9uIChLSU5EKSB7CiAgICBpZiAoS0lORCA9PT0gREVGQVVMVCAmJiBkZWZhdWx0SXRlcmF0b3IpIHJldHVybiBkZWZhdWx0SXRlcmF0b3I7CiAgICBpZiAoIUJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgJiYgS0lORCBpbiBJdGVyYWJsZVByb3RvdHlwZSkgcmV0dXJuIEl0ZXJhYmxlUHJvdG90eXBlW0tJTkRdOwogICAgc3dpdGNoIChLSU5EKSB7CiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTsKICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTsKICAgICAgY2FzZSBFTlRSSUVTOiByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9OwogICAgfSByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcyk7IH07CiAgfTsKCiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7CiAgdmFyIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IGZhbHNlOwogIHZhciBJdGVyYWJsZVByb3RvdHlwZSA9IEl0ZXJhYmxlLnByb3RvdHlwZTsKICB2YXIgbmF0aXZlSXRlcmF0b3IgPSBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl0KICAgIHx8IEl0ZXJhYmxlUHJvdG90eXBlWydAQGl0ZXJhdG9yJ10KICAgIHx8IERFRkFVTFQgJiYgSXRlcmFibGVQcm90b3R5cGVbREVGQVVMVF07CiAgdmFyIGRlZmF1bHRJdGVyYXRvciA9ICFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIG5hdGl2ZUl0ZXJhdG9yIHx8IGdldEl0ZXJhdGlvbk1ldGhvZChERUZBVUxUKTsKICB2YXIgYW55TmF0aXZlSXRlcmF0b3IgPSBOQU1FID09ICdBcnJheScgPyBJdGVyYWJsZVByb3RvdHlwZS5lbnRyaWVzIHx8IG5hdGl2ZUl0ZXJhdG9yIDogbmF0aXZlSXRlcmF0b3I7CiAgdmFyIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgbWV0aG9kcywgS0VZOwoKICAvLyBmaXggbmF0aXZlCiAgaWYgKGFueU5hdGl2ZUl0ZXJhdG9yKSB7CiAgICBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihhbnlOYXRpdmVJdGVyYXRvci5jYWxsKG5ldyBJdGVyYWJsZSgpKSk7CiAgICBpZiAoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHsKICAgICAgaWYgKCFJU19QVVJFICYmIGdldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSkgIT09IEl0ZXJhdG9yUHJvdG90eXBlKSB7CiAgICAgICAgaWYgKHNldFByb3RvdHlwZU9mKSB7CiAgICAgICAgICBzZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIEl0ZXJhdG9yUHJvdG90eXBlKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdICE9ICdmdW5jdGlvbicpIHsKICAgICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9ycwogICAgICBzZXRUb1N0cmluZ1RhZyhDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIHRydWUsIHRydWUpOwogICAgICBpZiAoSVNfUFVSRSkgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpczsKICAgIH0KICB9CgogIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkYKICBpZiAoREVGQVVMVCA9PSBWQUxVRVMgJiYgbmF0aXZlSXRlcmF0b3IgJiYgbmF0aXZlSXRlcmF0b3IubmFtZSAhPT0gVkFMVUVTKSB7CiAgICBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgPSB0cnVlOwogICAgZGVmYXVsdEl0ZXJhdG9yID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmF0aXZlSXRlcmF0b3IuY2FsbCh0aGlzKTsgfTsKICB9CgogIC8vIGRlZmluZSBpdGVyYXRvcgogIGlmICgoIUlTX1BVUkUgfHwgRk9SQ0VEKSAmJiBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl0gIT09IGRlZmF1bHRJdGVyYXRvcikgewogICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhYmxlUHJvdG90eXBlLCBJVEVSQVRPUiwgZGVmYXVsdEl0ZXJhdG9yKTsKICB9CiAgSXRlcmF0b3JzW05BTUVdID0gZGVmYXVsdEl0ZXJhdG9yOwoKICAvLyBleHBvcnQgYWRkaXRpb25hbCBtZXRob2RzCiAgaWYgKERFRkFVTFQpIHsKICAgIG1ldGhvZHMgPSB7CiAgICAgIHZhbHVlczogZ2V0SXRlcmF0aW9uTWV0aG9kKFZBTFVFUyksCiAgICAgIGtleXM6IElTX1NFVCA/IGRlZmF1bHRJdGVyYXRvciA6IGdldEl0ZXJhdGlvbk1ldGhvZChLRVlTKSwKICAgICAgZW50cmllczogZ2V0SXRlcmF0aW9uTWV0aG9kKEVOVFJJRVMpCiAgICB9OwogICAgaWYgKEZPUkNFRCkgZm9yIChLRVkgaW4gbWV0aG9kcykgewogICAgICBpZiAoQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfHwgIShLRVkgaW4gSXRlcmFibGVQcm90b3R5cGUpKSB7CiAgICAgICAgcmVkZWZpbmUoSXRlcmFibGVQcm90b3R5cGUsIEtFWSwgbWV0aG9kc1tLRVldKTsKICAgICAgfQogICAgfSBlbHNlICQoeyB0YXJnZXQ6IE5BTUUsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgfHwgSU5DT1JSRUNUX1ZBTFVFU19OQU1FIH0sIG1ldGhvZHMpOwogIH0KCiAgcmV0dXJuIG1ldGhvZHM7Cn07Cg==,dmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTsKdmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTsKCnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7Cgptb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nICYmIC9uYXRpdmUgY29kZS8udGVzdChpbnNwZWN0U291cmNlKFdlYWtNYXApKTsK,dmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKICBpZiAoIWlzT2JqZWN0KGl0KSkgewogICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhbiBvYmplY3QnKTsKICB9IHJldHVybiBpdDsKfTsK,dmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7CgovLyBEZXRlY3QgSUU4J3MgaW5jb21wbGV0ZSBkZWZpbmVQcm9wZXJ0eSBpbXBsZW1lbnRhdGlvbgptb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7CiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgMSwgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSlbMV0gIT0gNzsKfSk7Cg==,bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nOwp9Owo=,dmFyIHN0b3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZScpOwoKdmFyIGZ1bmN0aW9uVG9TdHJpbmcgPSBGdW5jdGlvbi50b1N0cmluZzsKCi8vIHRoaXMgaGVscGVyIGJyb2tlbiBpbiBgMy40LjEtMy40LjRgLCBzbyB3ZSBjYW4ndCB1c2UgYHNoYXJlZGAgaGVscGVyCmlmICh0eXBlb2Ygc3RvcmUuaW5zcGVjdFNvdXJjZSAhPSAnZnVuY3Rpb24nKSB7CiAgc3RvcmUuaW5zcGVjdFNvdXJjZSA9IGZ1bmN0aW9uIChpdCkgewogICAgcmV0dXJuIGZ1bmN0aW9uVG9TdHJpbmcuY2FsbChpdCk7CiAgfTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBzdG9yZS5pbnNwZWN0U291cmNlOwo=,dmFyIGlkID0gMDsKdmFyIHBvc3RmaXggPSBNYXRoLnJhbmRvbSgpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7CiAgcmV0dXJuICdTeW1ib2woJyArIFN0cmluZyhrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5KSArICcpXycgKyAoKytpZCArIHBvc3RmaXgpLnRvU3RyaW5nKDM2KTsKfTsK,dmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7CnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7CnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTsKCm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7CiAgcmV0dXJuIGRlZmluZVByb3BlcnR5TW9kdWxlLmYob2JqZWN0LCBrZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCB2YWx1ZSkpOwp9IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkgewogIG9iamVjdFtrZXldID0gdmFsdWU7CiAgcmV0dXJuIG9iamVjdDsKfTsK,dmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7Cgp2YXIgcmVwbGFjZW1lbnQgPSAvI3xcLnByb3RvdHlwZVwuLzsKCnZhciBpc0ZvcmNlZCA9IGZ1bmN0aW9uIChmZWF0dXJlLCBkZXRlY3Rpb24pIHsKICB2YXIgdmFsdWUgPSBkYXRhW25vcm1hbGl6ZShmZWF0dXJlKV07CiAgcmV0dXJuIHZhbHVlID09IFBPTFlGSUxMID8gdHJ1ZQogICAgOiB2YWx1ZSA9PSBOQVRJVkUgPyBmYWxzZQogICAgOiB0eXBlb2YgZGV0ZWN0aW9uID09ICdmdW5jdGlvbicgPyBmYWlscyhkZXRlY3Rpb24pCiAgICA6ICEhZGV0ZWN0aW9uOwp9OwoKdmFyIG5vcm1hbGl6ZSA9IGlzRm9yY2VkLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHsKICByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpOwp9OwoKdmFyIGRhdGEgPSBpc0ZvcmNlZC5kYXRhID0ge307CnZhciBOQVRJVkUgPSBpc0ZvcmNlZC5OQVRJVkUgPSAnTic7CnZhciBQT0xZRklMTCA9IGlzRm9yY2VkLlBPTFlGSUxMID0gJ1AnOwoKbW9kdWxlLmV4cG9ydHMgPSBpc0ZvcmNlZDsK,LyoqKiBJTVBPUlRTIEZST00gaW1wb3J0cy1sb2FkZXIgKioqLwp2YXIgYnJvd3NlciA9IHVuZGVmaW5lZDsKCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7CiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgewogICAgZGVmaW5lKCJ3ZWJleHRlbnNpb24tcG9seWZpbGwiLCBbIm1vZHVsZSJdLCBmYWN0b3J5KTsKICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAidW5kZWZpbmVkIikgewogICAgZmFjdG9yeShtb2R1bGUpOwogIH0gZWxzZSB7CiAgICB2YXIgbW9kID0gewogICAgICBleHBvcnRzOiB7fQogICAgfTsKICAgIGZhY3RvcnkobW9kKTsKICAgIGdsb2JhbC5icm93c2VyID0gbW9kLmV4cG9ydHM7CiAgfQp9KSh0aGlzLCBmdW5jdGlvbiAobW9kdWxlKSB7CiAgLyogd2ViZXh0ZW5zaW9uLXBvbHlmaWxsIC0gdjAuNC4wIC0gV2VkIEZlYiAwNiAyMDE5IDExOjU4OjMxICovCiAgLyogLSotIE1vZGU6IGluZGVudC10YWJzLW1vZGU6IG5pbDsganMtaW5kZW50LWxldmVsOiAyIC0qLSAqLwogIC8qIHZpbTogc2V0IHN0cz0yIHN3PTIgZXQgdHc9ODA6ICovCiAgLyogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpYwogICAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXMKICAgKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLiAqLwogICJ1c2Ugc3RyaWN0IjsKCiAgaWYgKHR5cGVvZiBicm93c2VyID09PSAidW5kZWZpbmVkIiB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYnJvd3NlcikgIT09IE9iamVjdC5wcm90b3R5cGUpIHsKICAgIGNvbnN0IENIUk9NRV9TRU5EX01FU1NBR0VfQ0FMTEJBQ0tfTk9fUkVTUE9OU0VfTUVTU0FHRSA9ICJUaGUgbWVzc2FnZSBwb3J0IGNsb3NlZCBiZWZvcmUgYSByZXNwb25zZSB3YXMgcmVjZWl2ZWQuIjsKICAgIGNvbnN0IFNFTkRfUkVTUE9OU0VfREVQUkVDQVRJT05fV0FSTklORyA9ICJSZXR1cm5pbmcgYSBQcm9taXNlIGlzIHRoZSBwcmVmZXJyZWQgd2F5IHRvIHNlbmQgYSByZXBseSBmcm9tIGFuIG9uTWVzc2FnZS9vbk1lc3NhZ2VFeHRlcm5hbCBsaXN0ZW5lciwgYXMgdGhlIHNlbmRSZXNwb25zZSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgc3BlY3MgKFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL01vemlsbGEvQWRkLW9ucy9XZWJFeHRlbnNpb25zL0FQSS9ydW50aW1lL29uTWVzc2FnZSkiOwoKICAgIC8vIFdyYXBwaW5nIHRoZSBidWxrIG9mIHRoaXMgcG9seWZpbGwgaW4gYSBvbmUtdGltZS11c2UgZnVuY3Rpb24gaXMgYSBtaW5vcgogICAgLy8gb3B0aW1pemF0aW9uIGZvciBGaXJlZm94LiBTaW5jZSBTcGlkZXJtb25rZXkgZG9lcyBub3QgZnVsbHkgcGFyc2UgdGhlCiAgICAvLyBjb250ZW50cyBvZiBhIGZ1bmN0aW9uIHVudGlsIHRoZSBmaXJzdCB0aW1lIGl0J3MgY2FsbGVkLCBhbmQgc2luY2UgaXQgd2lsbAogICAgLy8gbmV2ZXIgYWN0dWFsbHkgbmVlZCB0byBiZSBjYWxsZWQsIHRoaXMgYWxsb3dzIHRoZSBwb2x5ZmlsbCB0byBiZSBpbmNsdWRlZAogICAgLy8gaW4gRmlyZWZveCBuZWFybHkgZm9yIGZyZWUuCiAgICBjb25zdCB3cmFwQVBJcyA9IGV4dGVuc2lvbkFQSXMgPT4gewogICAgICAvLyBOT1RFOiBhcGlNZXRhZGF0YSBpcyBhc3NvY2lhdGVkIHRvIHRoZSBjb250ZW50IG9mIHRoZSBhcGktbWV0YWRhdGEuanNvbiBmaWxlCiAgICAgIC8vIGF0IGJ1aWxkIHRpbWUgYnkgcmVwbGFjaW5nIHRoZSBmb2xsb3dpbmcgImluY2x1ZGUiIHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlCiAgICAgIC8vIEpTT04gZmlsZS4KICAgICAgY29uc3QgYXBpTWV0YWRhdGEgPSB7CiAgICAgICAgImFsYXJtcyI6IHsKICAgICAgICAgICJjbGVhciI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAwLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAiY2xlYXJBbGwiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMCwKICAgICAgICAgICAgIm1heEFyZ3MiOiAwCiAgICAgICAgICB9LAogICAgICAgICAgImdldCI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAwLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAiZ2V0QWxsIjogewogICAgICAgICAgICAibWluQXJncyI6IDAsCiAgICAgICAgICAgICJtYXhBcmdzIjogMAogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImJvb2ttYXJrcyI6IHsKICAgICAgICAgICJjcmVhdGUiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgImdldCI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAiZ2V0Q2hpbGRyZW4iOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgImdldFJlY2VudCI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAiZ2V0U3ViVHJlZSI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAiZ2V0VHJlZSI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAwLAogICAgICAgICAgICAibWF4QXJncyI6IDAKICAgICAgICAgIH0sCiAgICAgICAgICAibW92ZSI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAyLAogICAgICAgICAgICAibWF4QXJncyI6IDIKICAgICAgICAgIH0sCiAgICAgICAgICAicmVtb3ZlIjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgfSwKICAgICAgICAgICJyZW1vdmVUcmVlIjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgfSwKICAgICAgICAgICJzZWFyY2giOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgInVwZGF0ZSI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAyLAogICAgICAgICAgICAibWF4QXJncyI6IDIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJicm93c2VyQWN0aW9uIjogewogICAgICAgICAgImRpc2FibGUiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMCwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxLAogICAgICAgICAgICAiZmFsbGJhY2tUb05vQ2FsbGJhY2siOiB0cnVlCiAgICAgICAgICB9LAogICAgICAgICAgImVuYWJsZSI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAwLAogICAgICAgICAgICAibWF4QXJncyI6IDEsCiAgICAgICAgICAgICJmYWxsYmFja1RvTm9DYWxsYmFjayI6IHRydWUKICAgICAgICAgIH0sCiAgICAgICAgICAiZ2V0QmFkZ2VCYWNrZ3JvdW5kQ29sb3IiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgImdldEJhZGdlVGV4dCI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAiZ2V0UG9wdXAiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgImdldFRpdGxlIjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgfSwKICAgICAgICAgICJvcGVuUG9wdXAiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMCwKICAgICAgICAgICAgIm1heEFyZ3MiOiAwCiAgICAgICAgICB9LAogICAgICAgICAgInNldEJhZGdlQmFja2dyb3VuZENvbG9yIjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMSwKICAgICAgICAgICAgImZhbGxiYWNrVG9Ob0NhbGxiYWNrIjogdHJ1ZQogICAgICAgICAgfSwKICAgICAgICAgICJzZXRCYWRnZVRleHQiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxLAogICAgICAgICAgICAiZmFsbGJhY2tUb05vQ2FsbGJhY2siOiB0cnVlCiAgICAgICAgICB9LAogICAgICAgICAgInNldEljb24iOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgInNldFBvcHVwIjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMSwKICAgICAgICAgICAgImZhbGxiYWNrVG9Ob0NhbGxiYWNrIjogdHJ1ZQogICAgICAgICAgfSwKICAgICAgICAgICJzZXRUaXRsZSI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEsCiAgICAgICAgICAgICJmYWxsYmFja1RvTm9DYWxsYmFjayI6IHRydWUKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJicm93c2luZ0RhdGEiOiB7CiAgICAgICAgICAicmVtb3ZlIjogewogICAgICAgICAgICAibWluQXJncyI6IDIsCiAgICAgICAgICAgICJtYXhBcmdzIjogMgogICAgICAgICAgfSwKICAgICAgICAgICJyZW1vdmVDYWNoZSI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAicmVtb3ZlQ29va2llcyI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAicmVtb3ZlRG93bmxvYWRzIjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgfSwKICAgICAgICAgICJyZW1vdmVGb3JtRGF0YSI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAicmVtb3ZlSGlzdG9yeSI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAicmVtb3ZlTG9jYWxTdG9yYWdlIjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgfSwKICAgICAgICAgICJyZW1vdmVQYXNzd29yZHMiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgInJlbW92ZVBsdWdpbkRhdGEiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgInNldHRpbmdzIjogewogICAgICAgICAgICAibWluQXJncyI6IDAsCiAgICAgICAgICAgICJtYXhBcmdzIjogMAogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImNvbW1hbmRzIjogewogICAgICAgICAgImdldEFsbCI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAwLAogICAgICAgICAgICAibWF4QXJncyI6IDAKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJjb250ZXh0TWVudXMiOiB7CiAgICAgICAgICAicmVtb3ZlIjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgfSwKICAgICAgICAgICJyZW1vdmVBbGwiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMCwKICAgICAgICAgICAgIm1heEFyZ3MiOiAwCiAgICAgICAgICB9LAogICAgICAgICAgInVwZGF0ZSI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAyLAogICAgICAgICAgICAibWF4QXJncyI6IDIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJjb29raWVzIjogewogICAgICAgICAgImdldCI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAiZ2V0QWxsIjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgfSwKICAgICAgICAgICJnZXRBbGxDb29raWVTdG9yZXMiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMCwKICAgICAgICAgICAgIm1heEFyZ3MiOiAwCiAgICAgICAgICB9LAogICAgICAgICAgInJlbW92ZSI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAic2V0IjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImRldnRvb2xzIjogewogICAgICAgICAgImluc3BlY3RlZFdpbmRvdyI6IHsKICAgICAgICAgICAgImV2YWwiOiB7CiAgICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAgICJtYXhBcmdzIjogMiwKICAgICAgICAgICAgICAic2luZ2xlQ2FsbGJhY2tBcmciOiBmYWxzZQogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgInBhbmVscyI6IHsKICAgICAgICAgICAgImNyZWF0ZSI6IHsKICAgICAgICAgICAgICAibWluQXJncyI6IDMsCiAgICAgICAgICAgICAgIm1heEFyZ3MiOiAzLAogICAgICAgICAgICAgICJzaW5nbGVDYWxsYmFja0FyZyI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImRvd25sb2FkcyI6IHsKICAgICAgICAgICJjYW5jZWwiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgImRvd25sb2FkIjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgfSwKICAgICAgICAgICJlcmFzZSI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAiZ2V0RmlsZUljb24iOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAyCiAgICAgICAgICB9LAogICAgICAgICAgIm9wZW4iOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxLAogICAgICAgICAgICAiZmFsbGJhY2tUb05vQ2FsbGJhY2siOiB0cnVlCiAgICAgICAgICB9LAogICAgICAgICAgInBhdXNlIjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgfSwKICAgICAgICAgICJyZW1vdmVGaWxlIjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgfSwKICAgICAgICAgICJyZXN1bWUiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgInNlYXJjaCI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAic2hvdyI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEsCiAgICAgICAgICAgICJmYWxsYmFja1RvTm9DYWxsYmFjayI6IHRydWUKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJleHRlbnNpb24iOiB7CiAgICAgICAgICAiaXNBbGxvd2VkRmlsZVNjaGVtZUFjY2VzcyI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAwLAogICAgICAgICAgICAibWF4QXJncyI6IDAKICAgICAgICAgIH0sCiAgICAgICAgICAiaXNBbGxvd2VkSW5jb2duaXRvQWNjZXNzIjogewogICAgICAgICAgICAibWluQXJncyI6IDAsCiAgICAgICAgICAgICJtYXhBcmdzIjogMAogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImhpc3RvcnkiOiB7CiAgICAgICAgICAiYWRkVXJsIjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgfSwKICAgICAgICAgICJkZWxldGVBbGwiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMCwKICAgICAgICAgICAgIm1heEFyZ3MiOiAwCiAgICAgICAgICB9LAogICAgICAgICAgImRlbGV0ZVJhbmdlIjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgfSwKICAgICAgICAgICJkZWxldGVVcmwiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgImdldFZpc2l0cyI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAic2VhcmNoIjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImkxOG4iOiB7CiAgICAgICAgICAiZGV0ZWN0TGFuZ3VhZ2UiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgImdldEFjY2VwdExhbmd1YWdlcyI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAwLAogICAgICAgICAgICAibWF4QXJncyI6IDAKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJpZGVudGl0eSI6IHsKICAgICAgICAgICJsYXVuY2hXZWJBdXRoRmxvdyI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJpZGxlIjogewogICAgICAgICAgInF1ZXJ5U3RhdGUiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAibWFuYWdlbWVudCI6IHsKICAgICAgICAgICJnZXQiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgImdldEFsbCI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAwLAogICAgICAgICAgICAibWF4QXJncyI6IDAKICAgICAgICAgIH0sCiAgICAgICAgICAiZ2V0U2VsZiI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAwLAogICAgICAgICAgICAibWF4QXJncyI6IDAKICAgICAgICAgIH0sCiAgICAgICAgICAic2V0RW5hYmxlZCI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAyLAogICAgICAgICAgICAibWF4QXJncyI6IDIKICAgICAgICAgIH0sCiAgICAgICAgICAidW5pbnN0YWxsU2VsZiI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAwLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJub3RpZmljYXRpb25zIjogewogICAgICAgICAgImNsZWFyIjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgfSwKICAgICAgICAgICJjcmVhdGUiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAyCiAgICAgICAgICB9LAogICAgICAgICAgImdldEFsbCI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAwLAogICAgICAgICAgICAibWF4QXJncyI6IDAKICAgICAgICAgIH0sCiAgICAgICAgICAiZ2V0UGVybWlzc2lvbkxldmVsIjogewogICAgICAgICAgICAibWluQXJncyI6IDAsCiAgICAgICAgICAgICJtYXhBcmdzIjogMAogICAgICAgICAgfSwKICAgICAgICAgICJ1cGRhdGUiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMiwKICAgICAgICAgICAgIm1heEFyZ3MiOiAyCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicGFnZUFjdGlvbiI6IHsKICAgICAgICAgICJnZXRQb3B1cCI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAiZ2V0VGl0bGUiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgImhpZGUiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxLAogICAgICAgICAgICAiZmFsbGJhY2tUb05vQ2FsbGJhY2siOiB0cnVlCiAgICAgICAgICB9LAogICAgICAgICAgInNldEljb24iOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgInNldFBvcHVwIjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMSwKICAgICAgICAgICAgImZhbGxiYWNrVG9Ob0NhbGxiYWNrIjogdHJ1ZQogICAgICAgICAgfSwKICAgICAgICAgICJzZXRUaXRsZSI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEsCiAgICAgICAgICAgICJmYWxsYmFja1RvTm9DYWxsYmFjayI6IHRydWUKICAgICAgICAgIH0sCiAgICAgICAgICAic2hvdyI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEsCiAgICAgICAgICAgICJmYWxsYmFja1RvTm9DYWxsYmFjayI6IHRydWUKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJwZXJtaXNzaW9ucyI6IHsKICAgICAgICAgICJjb250YWlucyI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAiZ2V0QWxsIjogewogICAgICAgICAgICAibWluQXJncyI6IDAsCiAgICAgICAgICAgICJtYXhBcmdzIjogMAogICAgICAgICAgfSwKICAgICAgICAgICJyZW1vdmUiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgInJlcXVlc3QiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicnVudGltZSI6IHsKICAgICAgICAgICJnZXRCYWNrZ3JvdW5kUGFnZSI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAwLAogICAgICAgICAgICAibWF4QXJncyI6IDAKICAgICAgICAgIH0sCiAgICAgICAgICAiZ2V0QnJvd3NlckluZm8iOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMCwKICAgICAgICAgICAgIm1heEFyZ3MiOiAwCiAgICAgICAgICB9LAogICAgICAgICAgImdldFBsYXRmb3JtSW5mbyI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAwLAogICAgICAgICAgICAibWF4QXJncyI6IDAKICAgICAgICAgIH0sCiAgICAgICAgICAib3Blbk9wdGlvbnNQYWdlIjogewogICAgICAgICAgICAibWluQXJncyI6IDAsCiAgICAgICAgICAgICJtYXhBcmdzIjogMAogICAgICAgICAgfSwKICAgICAgICAgICJyZXF1ZXN0VXBkYXRlQ2hlY2siOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMCwKICAgICAgICAgICAgIm1heEFyZ3MiOiAwCiAgICAgICAgICB9LAogICAgICAgICAgInNlbmRNZXNzYWdlIjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMwogICAgICAgICAgfSwKICAgICAgICAgICJzZW5kTmF0aXZlTWVzc2FnZSI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAyLAogICAgICAgICAgICAibWF4QXJncyI6IDIKICAgICAgICAgIH0sCiAgICAgICAgICAic2V0VW5pbnN0YWxsVVJMIjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInNlc3Npb25zIjogewogICAgICAgICAgImdldERldmljZXMiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMCwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgImdldFJlY2VudGx5Q2xvc2VkIjogewogICAgICAgICAgICAibWluQXJncyI6IDAsCiAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgfSwKICAgICAgICAgICJyZXN0b3JlIjogewogICAgICAgICAgICAibWluQXJncyI6IDAsCiAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInN0b3JhZ2UiOiB7CiAgICAgICAgICAibG9jYWwiOiB7CiAgICAgICAgICAgICJjbGVhciI6IHsKICAgICAgICAgICAgICAibWluQXJncyI6IDAsCiAgICAgICAgICAgICAgIm1heEFyZ3MiOiAwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJnZXQiOiB7CiAgICAgICAgICAgICAgIm1pbkFyZ3MiOiAwLAogICAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgICB9LAogICAgICAgICAgICAiZ2V0Qnl0ZXNJblVzZSI6IHsKICAgICAgICAgICAgICAibWluQXJncyI6IDAsCiAgICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZW1vdmUiOiB7CiAgICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgICB9LAogICAgICAgICAgICAic2V0IjogewogICAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJtYW5hZ2VkIjogewogICAgICAgICAgICAiZ2V0IjogewogICAgICAgICAgICAgICJtaW5BcmdzIjogMCwKICAgICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImdldEJ5dGVzSW5Vc2UiOiB7CiAgICAgICAgICAgICAgIm1pbkFyZ3MiOiAwLAogICAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgInN5bmMiOiB7CiAgICAgICAgICAgICJjbGVhciI6IHsKICAgICAgICAgICAgICAibWluQXJncyI6IDAsCiAgICAgICAgICAgICAgIm1heEFyZ3MiOiAwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJnZXQiOiB7CiAgICAgICAgICAgICAgIm1pbkFyZ3MiOiAwLAogICAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgICB9LAogICAgICAgICAgICAiZ2V0Qnl0ZXNJblVzZSI6IHsKICAgICAgICAgICAgICAibWluQXJncyI6IDAsCiAgICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZW1vdmUiOiB7CiAgICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgICB9LAogICAgICAgICAgICAic2V0IjogewogICAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInRhYnMiOiB7CiAgICAgICAgICAiY2FwdHVyZVZpc2libGVUYWIiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMCwKICAgICAgICAgICAgIm1heEFyZ3MiOiAyCiAgICAgICAgICB9LAogICAgICAgICAgImNyZWF0ZSI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAiZGV0ZWN0TGFuZ3VhZ2UiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMCwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgImRpc2NhcmQiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMCwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgImR1cGxpY2F0ZSI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAiZXhlY3V0ZVNjcmlwdCI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDIKICAgICAgICAgIH0sCiAgICAgICAgICAiZ2V0IjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgfSwKICAgICAgICAgICJnZXRDdXJyZW50IjogewogICAgICAgICAgICAibWluQXJncyI6IDAsCiAgICAgICAgICAgICJtYXhBcmdzIjogMAogICAgICAgICAgfSwKICAgICAgICAgICJnZXRab29tIjogewogICAgICAgICAgICAibWluQXJncyI6IDAsCiAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgfSwKICAgICAgICAgICJnZXRab29tU2V0dGluZ3MiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMCwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgImhpZ2hsaWdodCI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAiaW5zZXJ0Q1NTIjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMgogICAgICAgICAgfSwKICAgICAgICAgICJtb3ZlIjogewogICAgICAgICAgICAibWluQXJncyI6IDIsCiAgICAgICAgICAgICJtYXhBcmdzIjogMgogICAgICAgICAgfSwKICAgICAgICAgICJxdWVyeSI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAicmVsb2FkIjogewogICAgICAgICAgICAibWluQXJncyI6IDAsCiAgICAgICAgICAgICJtYXhBcmdzIjogMgogICAgICAgICAgfSwKICAgICAgICAgICJyZW1vdmUiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgInJlbW92ZUNTUyI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDIKICAgICAgICAgIH0sCiAgICAgICAgICAic2VuZE1lc3NhZ2UiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMiwKICAgICAgICAgICAgIm1heEFyZ3MiOiAzCiAgICAgICAgICB9LAogICAgICAgICAgInNldFpvb20iOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAyCiAgICAgICAgICB9LAogICAgICAgICAgInNldFpvb21TZXR0aW5ncyI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDIKICAgICAgICAgIH0sCiAgICAgICAgICAidXBkYXRlIjogewogICAgICAgICAgICAibWluQXJncyI6IDEsCiAgICAgICAgICAgICJtYXhBcmdzIjogMgogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInRvcFNpdGVzIjogewogICAgICAgICAgImdldCI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAwLAogICAgICAgICAgICAibWF4QXJncyI6IDAKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJ3ZWJOYXZpZ2F0aW9uIjogewogICAgICAgICAgImdldEFsbEZyYW1lcyI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAiZ2V0RnJhbWUiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAid2ViUmVxdWVzdCI6IHsKICAgICAgICAgICJoYW5kbGVyQmVoYXZpb3JDaGFuZ2VkIjogewogICAgICAgICAgICAibWluQXJncyI6IDAsCiAgICAgICAgICAgICJtYXhBcmdzIjogMAogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgIndpbmRvd3MiOiB7CiAgICAgICAgICAiY3JlYXRlIjogewogICAgICAgICAgICAibWluQXJncyI6IDAsCiAgICAgICAgICAgICJtYXhBcmdzIjogMQogICAgICAgICAgfSwKICAgICAgICAgICJnZXQiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMSwKICAgICAgICAgICAgIm1heEFyZ3MiOiAyCiAgICAgICAgICB9LAogICAgICAgICAgImdldEFsbCI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAwLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAiZ2V0Q3VycmVudCI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAwLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAiZ2V0TGFzdEZvY3VzZWQiOiB7CiAgICAgICAgICAgICJtaW5BcmdzIjogMCwKICAgICAgICAgICAgIm1heEFyZ3MiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgInJlbW92ZSI6IHsKICAgICAgICAgICAgIm1pbkFyZ3MiOiAxLAogICAgICAgICAgICAibWF4QXJncyI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAidXBkYXRlIjogewogICAgICAgICAgICAibWluQXJncyI6IDIsCiAgICAgICAgICAgICJtYXhBcmdzIjogMgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKCiAgICAgIGlmIChPYmplY3Qua2V5cyhhcGlNZXRhZGF0YSkubGVuZ3RoID09PSAwKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJhcGktbWV0YWRhdGEuanNvbiBoYXMgbm90IGJlZW4gaW5jbHVkZWQgaW4gYnJvd3Nlci1wb2x5ZmlsbCIpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQSBXZWFrTWFwIHN1YmNsYXNzIHdoaWNoIGNyZWF0ZXMgYW5kIHN0b3JlcyBhIHZhbHVlIGZvciBhbnkga2V5IHdoaWNoIGRvZXMKICAgICAgICogbm90IGV4aXN0IHdoZW4gYWNjZXNzZWQsIGJ1dCBiZWhhdmVzIGV4YWN0bHkgYXMgYW4gb3JkaW5hcnkgV2Vha01hcAogICAgICAgKiBvdGhlcndpc2UuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNyZWF0ZUl0ZW0KICAgICAgICogICAgICAgIEEgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBjYWxsZWQgaW4gb3JkZXIgdG8gY3JlYXRlIHRoZSB2YWx1ZSBmb3IgYW55CiAgICAgICAqICAgICAgICBrZXkgd2hpY2ggZG9lcyBub3QgZXhpc3QsIHRoZSBmaXJzdCB0aW1lIGl0IGlzIGFjY2Vzc2VkLiBUaGUKICAgICAgICogICAgICAgIGZ1bmN0aW9uIHJlY2VpdmVzLCBhcyBpdHMgb25seSBhcmd1bWVudCwgdGhlIGtleSBiZWluZyBjcmVhdGVkLgogICAgICAgKi8KICAgICAgY2xhc3MgRGVmYXVsdFdlYWtNYXAgZXh0ZW5kcyBXZWFrTWFwIHsKICAgICAgICBjb25zdHJ1Y3RvcihjcmVhdGVJdGVtLCBpdGVtcyA9IHVuZGVmaW5lZCkgewogICAgICAgICAgc3VwZXIoaXRlbXMpOwogICAgICAgICAgdGhpcy5jcmVhdGVJdGVtID0gY3JlYXRlSXRlbTsKICAgICAgICB9CgogICAgICAgIGdldChrZXkpIHsKICAgICAgICAgIGlmICghdGhpcy5oYXMoa2V5KSkgewogICAgICAgICAgICB0aGlzLnNldChrZXksIHRoaXMuY3JlYXRlSXRlbShrZXkpKTsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0KGtleSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgYW4gb2JqZWN0IHdpdGggYSBgdGhlbmAgbWV0aG9kLCBhbmQgY2FuCiAgICAgICAqIHRoZXJlZm9yZSBiZSBhc3N1bWVkIHRvIGJlaGF2ZSBhcyBhIFByb21pc2UuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3QuCiAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyB0aGVuYWJsZS4KICAgICAgICovCiAgICAgIGNvbnN0IGlzVGhlbmFibGUgPSB2YWx1ZSA9PiB7CiAgICAgICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gIm9iamVjdCIgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT09ICJmdW5jdGlvbiI7CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHdoaWNoLCB3aGVuIGNhbGxlZCwgd2lsbCByZXNvbHZlIG9yIHJlamVjdAogICAgICAgKiB0aGUgZ2l2ZW4gcHJvbWlzZSBiYXNlZCBvbiBob3cgaXQgaXMgY2FsbGVkOgogICAgICAgKgogICAgICAgKiAtIElmLCB3aGVuIGNhbGxlZCwgYGNocm9tZS5ydW50aW1lLmxhc3RFcnJvcmAgY29udGFpbnMgYSBub24tbnVsbCBvYmplY3QsCiAgICAgICAqICAgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWQgd2l0aCB0aGF0IHZhbHVlLgogICAgICAgKiAtIElmIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBleGFjdGx5IG9uZSBhcmd1bWVudCwgdGhlIHByb21pc2UgaXMKICAgICAgICogICByZXNvbHZlZCB0byB0aGF0IHZhbHVlLgogICAgICAgKiAtIE90aGVyd2lzZSwgdGhlIHByb21pc2UgaXMgcmVzb2x2ZWQgdG8gYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlCiAgICAgICAqICAgZnVuY3Rpb24ncyBhcmd1bWVudHMuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBwcm9taXNlCiAgICAgICAqICAgICAgICBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcmVzb2x1dGlvbiBhbmQgcmVqZWN0aW9uIGZ1bmN0aW9ucyBvZiBhCiAgICAgICAqICAgICAgICBwcm9taXNlLgogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBwcm9taXNlLnJlc29sdmUKICAgICAgICogICAgICAgIFRoZSBwcm9taXNlJ3MgcmVzb2x1dGlvbiBmdW5jdGlvbi4KICAgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gcHJvbWlzZS5yZWplY3Rpb24KICAgICAgICogICAgICAgIFRoZSBwcm9taXNlJ3MgcmVqZWN0aW9uIGZ1bmN0aW9uLgogICAgICAgKiBAcGFyYW0ge29iamVjdH0gbWV0YWRhdGEKICAgICAgICogICAgICAgIE1ldGFkYXRhIGFib3V0IHRoZSB3cmFwcGVkIG1ldGhvZCB3aGljaCBoYXMgY3JlYXRlZCB0aGUgY2FsbGJhY2suCiAgICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gbWV0YWRhdGEubWF4UmVzb2x2ZWRBcmdzCiAgICAgICAqICAgICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXJndW1lbnRzIHdoaWNoIG1heSBiZSBwYXNzZWQgdG8gdGhlCiAgICAgICAqICAgICAgICBjYWxsYmFjayBjcmVhdGVkIGJ5IHRoZSB3cmFwcGVkIGFzeW5jIGZ1bmN0aW9uLgogICAgICAgKgogICAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb259CiAgICAgICAqICAgICAgICBUaGUgZ2VuZXJhdGVkIGNhbGxiYWNrIGZ1bmN0aW9uLgogICAgICAgKi8KICAgICAgY29uc3QgbWFrZUNhbGxiYWNrID0gKHByb21pc2UsIG1ldGFkYXRhKSA9PiB7CiAgICAgICAgcmV0dXJuICguLi5jYWxsYmFja0FyZ3MpID0+IHsKICAgICAgICAgIGlmIChleHRlbnNpb25BUElzLnJ1bnRpbWUubGFzdEVycm9yKSB7CiAgICAgICAgICAgIHByb21pc2UucmVqZWN0KGV4dGVuc2lvbkFQSXMucnVudGltZS5sYXN0RXJyb3IpOwogICAgICAgICAgfSBlbHNlIGlmIChtZXRhZGF0YS5zaW5nbGVDYWxsYmFja0FyZyB8fCBjYWxsYmFja0FyZ3MubGVuZ3RoIDw9IDEgJiYgbWV0YWRhdGEuc2luZ2xlQ2FsbGJhY2tBcmcgIT09IGZhbHNlKSB7CiAgICAgICAgICAgIHByb21pc2UucmVzb2x2ZShjYWxsYmFja0FyZ3NbMF0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHJvbWlzZS5yZXNvbHZlKGNhbGxiYWNrQXJncyk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfTsKCiAgICAgIGNvbnN0IHBsdXJhbGl6ZUFyZ3VtZW50cyA9IG51bUFyZ3MgPT4gbnVtQXJncyA9PSAxID8gImFyZ3VtZW50IiA6ICJhcmd1bWVudHMiOwoKICAgICAgLyoqCiAgICAgICAqIENyZWF0ZXMgYSB3cmFwcGVyIGZ1bmN0aW9uIGZvciBhIG1ldGhvZCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUKICAgICAgICogICAgICAgIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgd2hpY2ggaXMgYmVpbmcgd3JhcHBlZC4KICAgICAgICogQHBhcmFtIHtvYmplY3R9IG1ldGFkYXRhCiAgICAgICAqICAgICAgICBNZXRhZGF0YSBhYm91dCB0aGUgbWV0aG9kIGJlaW5nIHdyYXBwZWQuCiAgICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gbWV0YWRhdGEubWluQXJncwogICAgICAgKiAgICAgICAgVGhlIG1pbmltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cyB3aGljaCBtdXN0IGJlIHBhc3NlZCB0byB0aGUKICAgICAgICogICAgICAgIGZ1bmN0aW9uLiBJZiBjYWxsZWQgd2l0aCBmZXdlciB0aGFuIHRoaXMgbnVtYmVyIG9mIGFyZ3VtZW50cywgdGhlCiAgICAgICAqICAgICAgICB3cmFwcGVyIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uLgogICAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IG1ldGFkYXRhLm1heEFyZ3MKICAgICAgICogICAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhcmd1bWVudHMgd2hpY2ggbWF5IGJlIHBhc3NlZCB0byB0aGUKICAgICAgICogICAgICAgIGZ1bmN0aW9uLiBJZiBjYWxsZWQgd2l0aCBtb3JlIHRoYW4gdGhpcyBudW1iZXIgb2YgYXJndW1lbnRzLCB0aGUKICAgICAgICogICAgICAgIHdyYXBwZXIgd2lsbCByYWlzZSBhbiBleGNlcHRpb24uCiAgICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gbWV0YWRhdGEubWF4UmVzb2x2ZWRBcmdzCiAgICAgICAqICAgICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXJndW1lbnRzIHdoaWNoIG1heSBiZSBwYXNzZWQgdG8gdGhlCiAgICAgICAqICAgICAgICBjYWxsYmFjayBjcmVhdGVkIGJ5IHRoZSB3cmFwcGVkIGFzeW5jIGZ1bmN0aW9uLgogICAgICAgKgogICAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24ob2JqZWN0LCAuLi4qKX0KICAgICAgICogICAgICAgVGhlIGdlbmVyYXRlZCB3cmFwcGVyIGZ1bmN0aW9uLgogICAgICAgKi8KICAgICAgY29uc3Qgd3JhcEFzeW5jRnVuY3Rpb24gPSAobmFtZSwgbWV0YWRhdGEpID0+IHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gYXN5bmNGdW5jdGlvbldyYXBwZXIodGFyZ2V0LCAuLi5hcmdzKSB7CiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPCBtZXRhZGF0YS5taW5BcmdzKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3QgJHttZXRhZGF0YS5taW5BcmdzfSAke3BsdXJhbGl6ZUFyZ3VtZW50cyhtZXRhZGF0YS5taW5BcmdzKX0gZm9yICR7bmFtZX0oKSwgZ290ICR7YXJncy5sZW5ndGh9YCk7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gbWV0YWRhdGEubWF4QXJncykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGF0IG1vc3QgJHttZXRhZGF0YS5tYXhBcmdzfSAke3BsdXJhbGl6ZUFyZ3VtZW50cyhtZXRhZGF0YS5tYXhBcmdzKX0gZm9yICR7bmFtZX0oKSwgZ290ICR7YXJncy5sZW5ndGh9YCk7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgICAgaWYgKG1ldGFkYXRhLmZhbGxiYWNrVG9Ob0NhbGxiYWNrKSB7CiAgICAgICAgICAgICAgLy8gVGhpcyBBUEkgbWV0aG9kIGhhcyBjdXJyZW50bHkgbm8gY2FsbGJhY2sgb24gQ2hyb21lLCBidXQgaXQgcmV0dXJuIGEgcHJvbWlzZSBvbiBGaXJlZm94LAogICAgICAgICAgICAgIC8vIGFuZCBzbyB0aGUgcG9seWZpbGwgd2lsbCB0cnkgdG8gY2FsbCBpdCB3aXRoIGEgY2FsbGJhY2sgZmlyc3QsIGFuZCBpdCB3aWxsIGZhbGxiYWNrCiAgICAgICAgICAgICAgLy8gdG8gbm90IHBhc3NpbmcgdGhlIGNhbGxiYWNrIGlmIHRoZSBmaXJzdCBjYWxsIGZhaWxzLgogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICB0YXJnZXRbbmFtZV0oLi4uYXJncywgbWFrZUNhbGxiYWNrKHsgcmVzb2x2ZSwgcmVqZWN0IH0sIG1ldGFkYXRhKSk7CiAgICAgICAgICAgICAgfSBjYXRjaCAoY2JFcnJvcikgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGAke25hbWV9IEFQSSBtZXRob2QgZG9lc24ndCBzZWVtIHRvIHN1cHBvcnQgdGhlIGNhbGxiYWNrIHBhcmFtZXRlciwgYCArICJmYWxsaW5nIGJhY2sgdG8gY2FsbCBpdCB3aXRob3V0IGEgY2FsbGJhY2s6ICIsIGNiRXJyb3IpOwoKICAgICAgICAgICAgICAgIHRhcmdldFtuYW1lXSguLi5hcmdzKTsKCiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIEFQSSBtZXRob2QgbWV0YWRhdGEsIHNvIHRoYXQgdGhlIG5leHQgQVBJIGNhbGxzIHdpbGwgbm90IHRyeSB0bwogICAgICAgICAgICAgICAgLy8gdXNlIHRoZSB1bnN1cHBvcnRlZCBjYWxsYmFjayBhbnltb3JlLgogICAgICAgICAgICAgICAgbWV0YWRhdGEuZmFsbGJhY2tUb05vQ2FsbGJhY2sgPSBmYWxzZTsKICAgICAgICAgICAgICAgIG1ldGFkYXRhLm5vQ2FsbGJhY2sgPSB0cnVlOwoKICAgICAgICAgICAgICAgIHJlc29sdmUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0YWRhdGEubm9DYWxsYmFjaykgewogICAgICAgICAgICAgIHRhcmdldFtuYW1lXSguLi5hcmdzKTsKICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGFyZ2V0W25hbWVdKC4uLmFyZ3MsIG1ha2VDYWxsYmFjayh7IHJlc29sdmUsIHJlamVjdCB9LCBtZXRhZGF0YSkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIFdyYXBzIGFuIGV4aXN0aW5nIG1ldGhvZCBvZiB0aGUgdGFyZ2V0IG9iamVjdCwgc28gdGhhdCBjYWxscyB0byBpdCBhcmUKICAgICAgICogaW50ZXJjZXB0ZWQgYnkgdGhlIGdpdmVuIHdyYXBwZXIgZnVuY3Rpb24uIFRoZSB3cmFwcGVyIGZ1bmN0aW9uIHJlY2VpdmVzLAogICAgICAgKiBhcyBpdHMgZmlyc3QgYXJndW1lbnQsIHRoZSBvcmlnaW5hbCBgdGFyZ2V0YCBvYmplY3QsIGZvbGxvd2VkIGJ5IGVhY2ggb2YKICAgICAgICogdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIG9yaWdpbmFsIG1ldGhvZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtvYmplY3R9IHRhcmdldAogICAgICAgKiAgICAgICAgVGhlIG9yaWdpbmFsIHRhcmdldCBvYmplY3QgdGhhdCB0aGUgd3JhcHBlZCBtZXRob2QgYmVsb25ncyB0by4KICAgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gbWV0aG9kCiAgICAgICAqICAgICAgICBUaGUgbWV0aG9kIGJlaW5nIHdyYXBwZWQuIFRoaXMgaXMgdXNlZCBhcyB0aGUgdGFyZ2V0IG9mIHRoZSBQcm94eQogICAgICAgKiAgICAgICAgb2JqZWN0IHdoaWNoIGlzIGNyZWF0ZWQgdG8gd3JhcCB0aGUgbWV0aG9kLgogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSB3cmFwcGVyCiAgICAgICAqICAgICAgICBUaGUgd3JhcHBlciBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgaW4gcGxhY2Ugb2YgYSBkaXJlY3QgaW52b2NhdGlvbgogICAgICAgKiAgICAgICAgb2YgdGhlIHdyYXBwZWQgbWV0aG9kLgogICAgICAgKgogICAgICAgKiBAcmV0dXJucyB7UHJveHk8ZnVuY3Rpb24+fQogICAgICAgKiAgICAgICAgQSBQcm94eSBvYmplY3QgZm9yIHRoZSBnaXZlbiBtZXRob2QsIHdoaWNoIGludm9rZXMgdGhlIGdpdmVuIHdyYXBwZXIKICAgICAgICogICAgICAgIG1ldGhvZCBpbiBpdHMgcGxhY2UuCiAgICAgICAqLwogICAgICBjb25zdCB3cmFwTWV0aG9kID0gKHRhcmdldCwgbWV0aG9kLCB3cmFwcGVyKSA9PiB7CiAgICAgICAgcmV0dXJuIG5ldyBQcm94eShtZXRob2QsIHsKICAgICAgICAgIGFwcGx5KHRhcmdldE1ldGhvZCwgdGhpc09iaiwgYXJncykgewogICAgICAgICAgICByZXR1cm4gd3JhcHBlci5jYWxsKHRoaXNPYmosIHRhcmdldCwgLi4uYXJncyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH07CgogICAgICBsZXQgaGFzT3duUHJvcGVydHkgPSBGdW5jdGlvbi5jYWxsLmJpbmQoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7CgogICAgICAvKioKICAgICAgICogV3JhcHMgYW4gb2JqZWN0IGluIGEgUHJveHkgd2hpY2ggaW50ZXJjZXB0cyBhbmQgd3JhcHMgY2VydGFpbiBtZXRob2RzCiAgICAgICAqIGJhc2VkIG9uIHRoZSBnaXZlbiBgd3JhcHBlcnNgIGFuZCBgbWV0YWRhdGFgIG9iamVjdHMuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXQKICAgICAgICogICAgICAgIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHdyYXAuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbd3JhcHBlcnMgPSB7fV0KICAgICAgICogICAgICAgIEFuIG9iamVjdCB0cmVlIGNvbnRhaW5pbmcgd3JhcHBlciBmdW5jdGlvbnMgZm9yIHNwZWNpYWwgY2FzZXMuIEFueQogICAgICAgKiAgICAgICAgZnVuY3Rpb24gcHJlc2VudCBpbiB0aGlzIG9iamVjdCB0cmVlIGlzIGNhbGxlZCBpbiBwbGFjZSBvZiB0aGUKICAgICAgICogICAgICAgIG1ldGhvZCBpbiB0aGUgc2FtZSBsb2NhdGlvbiBpbiB0aGUgYHRhcmdldGAgb2JqZWN0IHRyZWUuIFRoZXNlCiAgICAgICAqICAgICAgICB3cmFwcGVyIG1ldGhvZHMgYXJlIGludm9rZWQgYXMgZGVzY3JpYmVkIGluIHtAc2VlIHdyYXBNZXRob2R9LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge29iamVjdH0gW21ldGFkYXRhID0ge31dCiAgICAgICAqICAgICAgICBBbiBvYmplY3QgdHJlZSBjb250YWluaW5nIG1ldGFkYXRhIHVzZWQgdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZQogICAgICAgKiAgICAgICAgUHJvbWlzZS1iYXNlZCB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgYXN5bmNocm9ub3VzLiBBbnkgZnVuY3Rpb24gaW4KICAgICAgICogICAgICAgIHRoZSBgdGFyZ2V0YCBvYmplY3QgdHJlZSB3aGljaCBoYXMgYSBjb3JyZXNwb25kaW5nIG1ldGFkYXRhIG9iamVjdAogICAgICAgKiAgICAgICAgaW4gdGhlIHNhbWUgbG9jYXRpb24gaW4gdGhlIGBtZXRhZGF0YWAgdHJlZSBpcyByZXBsYWNlZCB3aXRoIGFuCiAgICAgICAqICAgICAgICBhdXRvbWF0aWNhbGx5LWdlbmVyYXRlZCB3cmFwcGVyIGZ1bmN0aW9uLCBhcyBkZXNjcmliZWQgaW4KICAgICAgICogICAgICAgIHtAc2VlIHdyYXBBc3luY0Z1bmN0aW9ufQogICAgICAgKgogICAgICAgKiBAcmV0dXJucyB7UHJveHk8b2JqZWN0Pn0KICAgICAgICovCiAgICAgIGNvbnN0IHdyYXBPYmplY3QgPSAodGFyZ2V0LCB3cmFwcGVycyA9IHt9LCBtZXRhZGF0YSA9IHt9KSA9PiB7CiAgICAgICAgbGV0IGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICBsZXQgaGFuZGxlcnMgPSB7CiAgICAgICAgICBoYXMocHJveHlUYXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgcmV0dXJuIHByb3AgaW4gdGFyZ2V0IHx8IHByb3AgaW4gY2FjaGU7CiAgICAgICAgICB9LAoKICAgICAgICAgIGdldChwcm94eVRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHsKICAgICAgICAgICAgaWYgKHByb3AgaW4gY2FjaGUpIHsKICAgICAgICAgICAgICByZXR1cm4gY2FjaGVbcHJvcF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghKHByb3AgaW4gdGFyZ2V0KSkgewogICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRhcmdldFtwcm9wXTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgbWV0aG9kIG9uIHRoZSB1bmRlcmx5aW5nIG9iamVjdC4gQ2hlY2sgaWYgd2UgbmVlZCB0byBkbwogICAgICAgICAgICAgIC8vIGFueSB3cmFwcGluZy4KCiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3cmFwcGVyc1twcm9wXSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIHNwZWNpYWwtY2FzZSB3cmFwcGVyIGZvciB0aGlzIG1ldGhvZC4KICAgICAgICAgICAgICAgIHZhbHVlID0gd3JhcE1ldGhvZCh0YXJnZXQsIHRhcmdldFtwcm9wXSwgd3JhcHBlcnNbcHJvcF0pOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFzT3duUHJvcGVydHkobWV0YWRhdGEsIHByb3ApKSB7CiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGFuIGFzeW5jIG1ldGhvZCB0aGF0IHdlIGhhdmUgbWV0YWRhdGEgZm9yLiBDcmVhdGUgYQogICAgICAgICAgICAgICAgLy8gUHJvbWlzZSB3cmFwcGVyIGZvciBpdC4KICAgICAgICAgICAgICAgIGxldCB3cmFwcGVyID0gd3JhcEFzeW5jRnVuY3Rpb24ocHJvcCwgbWV0YWRhdGFbcHJvcF0pOwogICAgICAgICAgICAgICAgdmFsdWUgPSB3cmFwTWV0aG9kKHRhcmdldCwgdGFyZ2V0W3Byb3BdLCB3cmFwcGVyKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG1ldGhvZCB0aGF0IHdlIGRvbid0IGtub3cgb3IgY2FyZSBhYm91dC4gUmV0dXJuIHRoZQogICAgICAgICAgICAgICAgLy8gb3JpZ2luYWwgbWV0aG9kLCBib3VuZCB0byB0aGUgdW5kZXJseWluZyBvYmplY3QuCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmJpbmQodGFyZ2V0KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAib2JqZWN0IiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAoaGFzT3duUHJvcGVydHkod3JhcHBlcnMsIHByb3ApIHx8IGhhc093blByb3BlcnR5KG1ldGFkYXRhLCBwcm9wKSkpIHsKICAgICAgICAgICAgICAvLyBUaGlzIGlzIGFuIG9iamVjdCB0aGF0IHdlIG5lZWQgdG8gZG8gc29tZSB3cmFwcGluZyBmb3IgdGhlIGNoaWxkcmVuCiAgICAgICAgICAgICAgLy8gb2YuIENyZWF0ZSBhIHN1Yi1vYmplY3Qgd3JhcHBlciBmb3IgaXQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY2hpbGQKICAgICAgICAgICAgICAvLyBtZXRhZGF0YS4KICAgICAgICAgICAgICB2YWx1ZSA9IHdyYXBPYmplY3QodmFsdWUsIHdyYXBwZXJzW3Byb3BdLCBtZXRhZGF0YVtwcm9wXSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBkbyBhbnkgd3JhcHBpbmcgZm9yIHRoaXMgcHJvcGVydHksCiAgICAgICAgICAgICAgLy8gc28ganVzdCBmb3J3YXJkIGFsbCBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgb2JqZWN0LgogICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjYWNoZSwgcHJvcCwgewogICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBzZXQodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FjaGVbcHJvcF0gPSB2YWx1ZTsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgfSwKCiAgICAgICAgICBzZXQocHJveHlUYXJnZXQsIHByb3AsIHZhbHVlLCByZWNlaXZlcikgewogICAgICAgICAgICBpZiAocHJvcCBpbiBjYWNoZSkgewogICAgICAgICAgICAgIGNhY2hlW3Byb3BdID0gdmFsdWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9LAoKICAgICAgICAgIGRlZmluZVByb3BlcnR5KHByb3h5VGFyZ2V0LCBwcm9wLCBkZXNjKSB7CiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmRlZmluZVByb3BlcnR5KGNhY2hlLCBwcm9wLCBkZXNjKTsKICAgICAgICAgIH0sCgogICAgICAgICAgZGVsZXRlUHJvcGVydHkocHJveHlUYXJnZXQsIHByb3ApIHsKICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoY2FjaGUsIHByb3ApOwogICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIC8vIFBlciBjb250cmFjdCBvZiB0aGUgUHJveHkgQVBJLCB0aGUgImdldCIgcHJveHkgaGFuZGxlciBtdXN0IHJldHVybiB0aGUKICAgICAgICAvLyBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgdGFyZ2V0IGlmIHRoYXQgdmFsdWUgaXMgZGVjbGFyZWQgcmVhZC1vbmx5IGFuZAogICAgICAgIC8vIG5vbi1jb25maWd1cmFibGUuIEZvciB0aGlzIHJlYXNvbiwgd2UgY3JlYXRlIGFuIG9iamVjdCB3aXRoIHRoZQogICAgICAgIC8vIHByb3RvdHlwZSBzZXQgdG8gYHRhcmdldGAgaW5zdGVhZCBvZiB1c2luZyBgdGFyZ2V0YCBkaXJlY3RseS4KICAgICAgICAvLyBPdGhlcndpc2Ugd2UgY2Fubm90IHJldHVybiBhIGN1c3RvbSBvYmplY3QgZm9yIEFQSXMgdGhhdAogICAgICAgIC8vIGFyZSBkZWNsYXJlZCByZWFkLW9ubHkgYW5kIG5vbi1jb25maWd1cmFibGUsIHN1Y2ggYXMgYGNocm9tZS5kZXZ0b29sc2AuCiAgICAgICAgLy8KICAgICAgICAvLyBUaGUgcHJveHkgaGFuZGxlcnMgdGhlbXNlbHZlcyB3aWxsIHN0aWxsIHVzZSB0aGUgb3JpZ2luYWwgYHRhcmdldGAKICAgICAgICAvLyBpbnN0ZWFkIG9mIHRoZSBgcHJveHlUYXJnZXRgLCBzbyB0aGF0IHRoZSBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIGFyZQogICAgICAgIC8vIGRlcmVmZXJlbmNlZCB2aWEgdGhlIG9yaWdpbmFsIHRhcmdldHMuCiAgICAgICAgbGV0IHByb3h5VGFyZ2V0ID0gT2JqZWN0LmNyZWF0ZSh0YXJnZXQpOwogICAgICAgIHJldHVybiBuZXcgUHJveHkocHJveHlUYXJnZXQsIGhhbmRsZXJzKTsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIGEgc2V0IG9mIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBhbiBldmVudCBvYmplY3QsIHdoaWNoIGhhbmRsZXMKICAgICAgICogd3JhcHBpbmcgb2YgbGlzdGVuZXIgZnVuY3Rpb25zIHRoYXQgdGhvc2UgbWVzc2FnZXMgYXJlIHBhc3NlZC4KICAgICAgICoKICAgICAgICogQSBzaW5nbGUgd3JhcHBlciBpcyBjcmVhdGVkIGZvciBlYWNoIGxpc3RlbmVyIGZ1bmN0aW9uLCBhbmQgc3RvcmVkIGluIGEKICAgICAgICogbWFwLiBTdWJzZXF1ZW50IGNhbGxzIHRvIGBhZGRMaXN0ZW5lcmAsIGBoYXNMaXN0ZW5lcmAsIG9yIGByZW1vdmVMaXN0ZW5lcmAKICAgICAgICogcmV0cmlldmUgdGhlIG9yaWdpbmFsIHdyYXBwZXIsIHNvIHRoYXQgIGF0dGVtcHRzIHRvIHJlbW92ZSBhCiAgICAgICAqIHByZXZpb3VzbHktYWRkZWQgbGlzdGVuZXIgd29yayBhcyBleHBlY3RlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtEZWZhdWx0V2Vha01hcDxmdW5jdGlvbiwgZnVuY3Rpb24+fSB3cmFwcGVyTWFwCiAgICAgICAqICAgICAgICBBIERlZmF1bHRXZWFrTWFwIG9iamVjdCB3aGljaCB3aWxsIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgd3JhcHBlcgogICAgICAgKiAgICAgICAgZm9yIGEgZ2l2ZW4gbGlzdGVuZXIgZnVuY3Rpb24gd2hlbiBvbmUgZG9lcyBub3QgZXhpc3QsIGFuZCByZXRyaWV2ZQogICAgICAgKiAgICAgICAgYW4gZXhpc3Rpbmcgb25lIHdoZW4gaXQgZG9lcy4KICAgICAgICoKICAgICAgICogQHJldHVybnMge29iamVjdH0KICAgICAgICovCiAgICAgIGNvbnN0IHdyYXBFdmVudCA9IHdyYXBwZXJNYXAgPT4gKHsKICAgICAgICBhZGRMaXN0ZW5lcih0YXJnZXQsIGxpc3RlbmVyLCAuLi5hcmdzKSB7CiAgICAgICAgICB0YXJnZXQuYWRkTGlzdGVuZXIod3JhcHBlck1hcC5nZXQobGlzdGVuZXIpLCAuLi5hcmdzKTsKICAgICAgICB9LAoKICAgICAgICBoYXNMaXN0ZW5lcih0YXJnZXQsIGxpc3RlbmVyKSB7CiAgICAgICAgICByZXR1cm4gdGFyZ2V0Lmhhc0xpc3RlbmVyKHdyYXBwZXJNYXAuZ2V0KGxpc3RlbmVyKSk7CiAgICAgICAgfSwKCiAgICAgICAgcmVtb3ZlTGlzdGVuZXIodGFyZ2V0LCBsaXN0ZW5lcikgewogICAgICAgICAgdGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHdyYXBwZXJNYXAuZ2V0KGxpc3RlbmVyKSk7CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIC8vIEtlZXAgdHJhY2sgaWYgdGhlIGRlcHJlY2F0aW9uIHdhcm5pbmcgaGFzIGJlZW4gbG9nZ2VkIGF0IGxlYXN0IG9uY2UuCiAgICAgIGxldCBsb2dnZWRTZW5kUmVzcG9uc2VEZXByZWNhdGlvbldhcm5pbmcgPSBmYWxzZTsKCiAgICAgIGNvbnN0IG9uTWVzc2FnZVdyYXBwZXJzID0gbmV3IERlZmF1bHRXZWFrTWFwKGxpc3RlbmVyID0+IHsKICAgICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICByZXR1cm4gbGlzdGVuZXI7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBXcmFwcyBhIG1lc3NhZ2UgbGlzdGVuZXIgZnVuY3Rpb24gc28gdGhhdCBpdCBtYXkgc2VuZCByZXNwb25zZXMgYmFzZWQgb24KICAgICAgICAgKiBpdHMgcmV0dXJuIHZhbHVlLCByYXRoZXIgdGhhbiBieSByZXR1cm5pbmcgYSBzZW50aW5lbCB2YWx1ZSBhbmQgY2FsbGluZyBhCiAgICAgICAgICogY2FsbGJhY2suIElmIHRoZSBsaXN0ZW5lciBmdW5jdGlvbiByZXR1cm5zIGEgUHJvbWlzZSwgdGhlIHJlc3BvbnNlIGlzCiAgICAgICAgICogc2VudCB3aGVuIHRoZSBwcm9taXNlIGVpdGhlciByZXNvbHZlcyBvciByZWplY3RzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHsqfSBtZXNzYWdlCiAgICAgICAgICogICAgICAgIFRoZSBtZXNzYWdlIHNlbnQgYnkgdGhlIG90aGVyIGVuZCBvZiB0aGUgY2hhbm5lbC4KICAgICAgICAgKiBAcGFyYW0ge29iamVjdH0gc2VuZGVyCiAgICAgICAgICogICAgICAgIERldGFpbHMgYWJvdXQgdGhlIHNlbmRlciBvZiB0aGUgbWVzc2FnZS4KICAgICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCopfSBzZW5kUmVzcG9uc2UKICAgICAgICAgKiAgICAgICAgQSBjYWxsYmFjayB3aGljaCwgd2hlbiBjYWxsZWQgd2l0aCBhbiBhcmJpdHJhcnkgYXJndW1lbnQsIHNlbmRzCiAgICAgICAgICogICAgICAgIHRoYXQgdmFsdWUgYXMgYSByZXNwb25zZS4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgICAgICAgKiAgICAgICAgVHJ1ZSBpZiB0aGUgd3JhcHBlZCBsaXN0ZW5lciByZXR1cm5lZCBhIFByb21pc2UsIHdoaWNoIHdpbGwgbGF0ZXIKICAgICAgICAgKiAgICAgICAgeWllbGQgYSByZXNwb25zZS4gRmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIHJldHVybiBmdW5jdGlvbiBvbk1lc3NhZ2UobWVzc2FnZSwgc2VuZGVyLCBzZW5kUmVzcG9uc2UpIHsKICAgICAgICAgIGxldCBkaWRDYWxsU2VuZFJlc3BvbnNlID0gZmFsc2U7CgogICAgICAgICAgbGV0IHdyYXBwZWRTZW5kUmVzcG9uc2U7CiAgICAgICAgICBsZXQgc2VuZFJlc3BvbnNlUHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gewogICAgICAgICAgICB3cmFwcGVkU2VuZFJlc3BvbnNlID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgaWYgKCFsb2dnZWRTZW5kUmVzcG9uc2VEZXByZWNhdGlvbldhcm5pbmcpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihTRU5EX1JFU1BPTlNFX0RFUFJFQ0FUSU9OX1dBUk5JTkcsIG5ldyBFcnJvcigpLnN0YWNrKTsKICAgICAgICAgICAgICAgIGxvZ2dlZFNlbmRSZXNwb25zZURlcHJlY2F0aW9uV2FybmluZyA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGRpZENhbGxTZW5kUmVzcG9uc2UgPSB0cnVlOwogICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpOwogICAgICAgICAgICB9OwogICAgICAgICAgfSk7CgogICAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGxpc3RlbmVyKG1lc3NhZ2UsIHNlbmRlciwgd3JhcHBlZFNlbmRSZXNwb25zZSk7CiAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgcmVzdWx0ID0gUHJvbWlzZS5yZWplY3QoZXJyKTsKICAgICAgICAgIH0KCiAgICAgICAgICBjb25zdCBpc1Jlc3VsdFRoZW5hYmxlID0gcmVzdWx0ICE9PSB0cnVlICYmIGlzVGhlbmFibGUocmVzdWx0KTsKCiAgICAgICAgICAvLyBJZiB0aGUgbGlzdGVuZXIgZGlkbid0IHJldHVybmVkIHRydWUgb3IgYSBQcm9taXNlLCBvciBjYWxsZWQKICAgICAgICAgIC8vIHdyYXBwZWRTZW5kUmVzcG9uc2Ugc3luY2hyb25vdXNseSwgd2UgY2FuIGV4aXQgZWFybGllcgogICAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSB3aWxsIGJlIG5vIHJlc3BvbnNlIHNlbnQgZnJvbSB0aGlzIGxpc3RlbmVyLgogICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSAmJiAhaXNSZXN1bHRUaGVuYWJsZSAmJiAhZGlkQ2FsbFNlbmRSZXNwb25zZSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gQSBzbWFsbCBoZWxwZXIgdG8gc2VuZCB0aGUgbWVzc2FnZSBpZiB0aGUgcHJvbWlzZSByZXNvbHZlcwogICAgICAgICAgLy8gYW5kIGFuIGVycm9yIGlmIHRoZSBwcm9taXNlIHJlamVjdHMgKGEgd3JhcHBlZCBzZW5kTWVzc2FnZSBoYXMKICAgICAgICAgIC8vIHRvIHRyYW5zbGF0ZSB0aGUgbWVzc2FnZSBpbnRvIGEgcmVzb2x2ZWQgcHJvbWlzZSBvciBhIHJlamVjdGVkCiAgICAgICAgICAvLyBwcm9taXNlKS4KICAgICAgICAgIGNvbnN0IHNlbmRQcm9taXNlZFJlc3VsdCA9IHByb21pc2UgPT4gewogICAgICAgICAgICBwcm9taXNlLnRoZW4obXNnID0+IHsKICAgICAgICAgICAgICAvLyBzZW5kIHRoZSBtZXNzYWdlIHZhbHVlLgogICAgICAgICAgICAgIHNlbmRSZXNwb25zZShtc2cpOwogICAgICAgICAgICB9LCBlcnJvciA9PiB7CiAgICAgICAgICAgICAgLy8gU2VuZCBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGlmIHRoZSByZWplY3RlZCB2YWx1ZQogICAgICAgICAgICAgIC8vIGlzIGFuIGluc3RhbmNlIG9mIGVycm9yLCBvciB0aGUgb2JqZWN0IGl0c2VsZiBvdGhlcndpc2UuCiAgICAgICAgICAgICAgbGV0IG1lc3NhZ2U7CiAgICAgICAgICAgICAgaWYgKGVycm9yICYmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiBlcnJvci5tZXNzYWdlID09PSAic3RyaW5nIikpIHsKICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBtZXNzYWdlID0gIkFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQiOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgc2VuZFJlc3BvbnNlKHsKICAgICAgICAgICAgICAgIF9fbW96V2ViRXh0ZW5zaW9uUG9seWZpbGxSZWplY3RfXzogdHJ1ZSwKICAgICAgICAgICAgICAgIG1lc3NhZ2UKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHsKICAgICAgICAgICAgICAvLyBQcmludCBhbiBlcnJvciBvbiB0aGUgY29uc29sZSBpZiB1bmFibGUgdG8gc2VuZCB0aGUgcmVzcG9uc2UuCiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHNlbmQgb25NZXNzYWdlIHJlamVjdGVkIHJlcGx5IiwgZXJyKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9OwoKICAgICAgICAgIC8vIElmIHRoZSBsaXN0ZW5lciByZXR1cm5lZCBhIFByb21pc2UsIHNlbmQgdGhlIHJlc29sdmVkIHZhbHVlIGFzIGEKICAgICAgICAgIC8vIHJlc3VsdCwgb3RoZXJ3aXNlIHdhaXQgdGhlIHByb21pc2UgcmVsYXRlZCB0byB0aGUgd3JhcHBlZFNlbmRSZXNwb25zZQogICAgICAgICAgLy8gY2FsbGJhY2sgdG8gcmVzb2x2ZSBhbmQgc2VuZCBpdCBhcyBhIHJlc3BvbnNlLgogICAgICAgICAgaWYgKGlzUmVzdWx0VGhlbmFibGUpIHsKICAgICAgICAgICAgc2VuZFByb21pc2VkUmVzdWx0KHJlc3VsdCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZW5kUHJvbWlzZWRSZXN1bHQoc2VuZFJlc3BvbnNlUHJvbWlzZSk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gTGV0IENocm9tZSBrbm93IHRoYXQgdGhlIGxpc3RlbmVyIGlzIHJlcGx5aW5nLgogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfTsKICAgICAgfSk7CgogICAgICBjb25zdCB3cmFwcGVkU2VuZE1lc3NhZ2VDYWxsYmFjayA9ICh7IHJlamVjdCwgcmVzb2x2ZSB9LCByZXBseSkgPT4gewogICAgICAgIGlmIChleHRlbnNpb25BUElzLnJ1bnRpbWUubGFzdEVycm9yKSB7CiAgICAgICAgICAvLyBEZXRlY3Qgd2hlbiBub25lIG9mIHRoZSBsaXN0ZW5lcnMgcmVwbGllZCB0byB0aGUgc2VuZE1lc3NhZ2UgY2FsbCBhbmQgcmVzb2x2ZQogICAgICAgICAgLy8gdGhlIHByb21pc2UgdG8gdW5kZWZpbmVkIGFzIGluIEZpcmVmb3guCiAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvd2ViZXh0ZW5zaW9uLXBvbHlmaWxsL2lzc3Vlcy8xMzAKICAgICAgICAgIGlmIChleHRlbnNpb25BUElzLnJ1bnRpbWUubGFzdEVycm9yLm1lc3NhZ2UgPT09IENIUk9NRV9TRU5EX01FU1NBR0VfQ0FMTEJBQ0tfTk9fUkVTUE9OU0VfTUVTU0FHRSkgewogICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZWplY3QoZXh0ZW5zaW9uQVBJcy5ydW50aW1lLmxhc3RFcnJvcik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChyZXBseSAmJiByZXBseS5fX21veldlYkV4dGVuc2lvblBvbHlmaWxsUmVqZWN0X18pIHsKICAgICAgICAgIC8vIENvbnZlcnQgYmFjayB0aGUgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgaW50bwogICAgICAgICAgLy8gYW4gRXJyb3IgaW5zdGFuY2UuCiAgICAgICAgICByZWplY3QobmV3IEVycm9yKHJlcGx5Lm1lc3NhZ2UpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzb2x2ZShyZXBseSk7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgY29uc3Qgd3JhcHBlZFNlbmRNZXNzYWdlID0gKG5hbWUsIG1ldGFkYXRhLCBhcGlOYW1lc3BhY2VPYmosIC4uLmFyZ3MpID0+IHsKICAgICAgICBpZiAoYXJncy5sZW5ndGggPCBtZXRhZGF0YS5taW5BcmdzKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0ICR7bWV0YWRhdGEubWluQXJnc30gJHtwbHVyYWxpemVBcmd1bWVudHMobWV0YWRhdGEubWluQXJncyl9IGZvciAke25hbWV9KCksIGdvdCAke2FyZ3MubGVuZ3RofWApOwogICAgICAgIH0KCiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gbWV0YWRhdGEubWF4QXJncykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhdCBtb3N0ICR7bWV0YWRhdGEubWF4QXJnc30gJHtwbHVyYWxpemVBcmd1bWVudHMobWV0YWRhdGEubWF4QXJncyl9IGZvciAke25hbWV9KCksIGdvdCAke2FyZ3MubGVuZ3RofWApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgIGNvbnN0IHdyYXBwZWRDYiA9IHdyYXBwZWRTZW5kTWVzc2FnZUNhbGxiYWNrLmJpbmQobnVsbCwgeyByZXNvbHZlLCByZWplY3QgfSk7CiAgICAgICAgICBhcmdzLnB1c2god3JhcHBlZENiKTsKICAgICAgICAgIGFwaU5hbWVzcGFjZU9iai5zZW5kTWVzc2FnZSguLi5hcmdzKTsKICAgICAgICB9KTsKICAgICAgfTsKCiAgICAgIGNvbnN0IHN0YXRpY1dyYXBwZXJzID0gewogICAgICAgIHJ1bnRpbWU6IHsKICAgICAgICAgIG9uTWVzc2FnZTogd3JhcEV2ZW50KG9uTWVzc2FnZVdyYXBwZXJzKSwKICAgICAgICAgIG9uTWVzc2FnZUV4dGVybmFsOiB3cmFwRXZlbnQob25NZXNzYWdlV3JhcHBlcnMpLAogICAgICAgICAgc2VuZE1lc3NhZ2U6IHdyYXBwZWRTZW5kTWVzc2FnZS5iaW5kKG51bGwsICJzZW5kTWVzc2FnZSIsIHsgbWluQXJnczogMSwgbWF4QXJnczogMyB9KQogICAgICAgIH0sCiAgICAgICAgdGFiczogewogICAgICAgICAgc2VuZE1lc3NhZ2U6IHdyYXBwZWRTZW5kTWVzc2FnZS5iaW5kKG51bGwsICJzZW5kTWVzc2FnZSIsIHsgbWluQXJnczogMiwgbWF4QXJnczogMyB9KQogICAgICAgIH0KICAgICAgfTsKICAgICAgY29uc3Qgc2V0dGluZ01ldGFkYXRhID0gewogICAgICAgIGNsZWFyOiB7IG1pbkFyZ3M6IDEsIG1heEFyZ3M6IDEgfSwKICAgICAgICBnZXQ6IHsgbWluQXJnczogMSwgbWF4QXJnczogMSB9LAogICAgICAgIHNldDogeyBtaW5BcmdzOiAxLCBtYXhBcmdzOiAxIH0KICAgICAgfTsKICAgICAgYXBpTWV0YWRhdGEucHJpdmFjeSA9IHsKICAgICAgICBuZXR3b3JrOiB7CiAgICAgICAgICBuZXR3b3JrUHJlZGljdGlvbkVuYWJsZWQ6IHNldHRpbmdNZXRhZGF0YSwKICAgICAgICAgIHdlYlJUQ0lQSGFuZGxpbmdQb2xpY3k6IHNldHRpbmdNZXRhZGF0YQogICAgICAgIH0sCiAgICAgICAgc2VydmljZXM6IHsKICAgICAgICAgIHBhc3N3b3JkU2F2aW5nRW5hYmxlZDogc2V0dGluZ01ldGFkYXRhCiAgICAgICAgfSwKICAgICAgICB3ZWJzaXRlczogewogICAgICAgICAgaHlwZXJsaW5rQXVkaXRpbmdFbmFibGVkOiBzZXR0aW5nTWV0YWRhdGEsCiAgICAgICAgICByZWZlcnJlcnNFbmFibGVkOiBzZXR0aW5nTWV0YWRhdGEKICAgICAgICB9CiAgICAgIH07CgogICAgICByZXR1cm4gd3JhcE9iamVjdChleHRlbnNpb25BUElzLCBzdGF0aWNXcmFwcGVycywgYXBpTWV0YWRhdGEpOwogICAgfTsKCiAgICAvLyBUaGUgYnVpbGQgcHJvY2VzcyBhZGRzIGEgVU1EIHdyYXBwZXIgYXJvdW5kIHRoaXMgZmlsZSwgd2hpY2ggbWFrZXMgdGhlCiAgICAvLyBgbW9kdWxlYCB2YXJpYWJsZSBhdmFpbGFibGUuCiAgICBtb2R1bGUuZXhwb3J0cyA9IHdyYXBBUElzKGNocm9tZSk7CiAgfSBlbHNlIHsKICAgIG1vZHVsZS5leHBvcnRzID0gYnJvd3NlcjsKICB9Cn0pOwovLyMgc291cmNlTWFwcGluZ1VSTD1icm93c2VyLXBvbHlmaWxsLmpzLm1hcAoK,dmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7CnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpOwp2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7CnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTsKCnZhciBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKCi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0eQpleHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IG5hdGl2ZURlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykgewogIGFuT2JqZWN0KE8pOwogIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTsKICBhbk9iamVjdChBdHRyaWJ1dGVzKTsKICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7CiAgICByZXR1cm4gbmF0aXZlRGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7CiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfQogIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQnKTsKICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTsKICByZXR1cm4gTzsKfTsK,J3VzZSBzdHJpY3QnOwp2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUnKS5JdGVyYXRvclByb3RvdHlwZTsKdmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7CnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTsKdmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7CnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7Cgp2YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7CiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7CiAgSXRlcmF0b3JDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHsgbmV4dDogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIG5leHQpIH0pOwogIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yQ29uc3RydWN0b3IsIFRPX1NUUklOR19UQUcsIGZhbHNlLCB0cnVlKTsKICBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzOwogIHJldHVybiBJdGVyYXRvckNvbnN0cnVjdG9yOwp9Owo=,dmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpOwoKbW9kdWxlLmV4cG9ydHMgPSAvd2ViMHMoPyEuKmNocm9tZSkvaS50ZXN0KHVzZXJBZ2VudCk7Cg==,dmFyIGNlaWwgPSBNYXRoLmNlaWw7CnZhciBmbG9vciA9IE1hdGguZmxvb3I7CgovLyBgVG9JbnRlZ2VyYCBhYnN0cmFjdCBvcGVyYXRpb24KLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2ludGVnZXIKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHsKICByZXR1cm4gaXNOYU4oYXJndW1lbnQgPSArYXJndW1lbnQpID8gMCA6IChhcmd1bWVudCA+IDAgPyBmbG9vciA6IGNlaWwpKGFyZ3VtZW50KTsKfTsK,J3VzZSBzdHJpY3QnOwp2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTsKdmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpOwp2YXIgTmF0aXZlUHJvbWlzZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtcHJvbWlzZS1jb25zdHJ1Y3RvcicpOwp2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTsKdmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7CnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvcicpOwp2YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlJyk7CnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpOwoKLy8gU2FmYXJpIGJ1ZyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjAwODI5CnZhciBOT05fR0VORVJJQyA9ICEhTmF0aXZlUHJvbWlzZSAmJiBmYWlscyhmdW5jdGlvbiAoKSB7CiAgTmF0aXZlUHJvbWlzZS5wcm90b3R5cGVbJ2ZpbmFsbHknXS5jYWxsKHsgdGhlbjogZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9IH0sIGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7Cn0pOwoKLy8gYFByb21pc2UucHJvdG90eXBlLmZpbmFsbHlgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLmZpbmFsbHkKJCh7IHRhcmdldDogJ1Byb21pc2UnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBOT05fR0VORVJJQyB9LCB7CiAgJ2ZpbmFsbHknOiBmdW5jdGlvbiAob25GaW5hbGx5KSB7CiAgICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBnZXRCdWlsdEluKCdQcm9taXNlJykpOwogICAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2Ygb25GaW5hbGx5ID09ICdmdW5jdGlvbic7CiAgICByZXR1cm4gdGhpcy50aGVuKAogICAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKHgpIHsKICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4geDsgfSk7CiAgICAgIH0gOiBvbkZpbmFsbHksCiAgICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoZSkgewogICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHRocm93IGU7IH0pOwogICAgICB9IDogb25GaW5hbGx5CiAgICApOwogIH0KfSk7CgovLyBwYXRjaCBuYXRpdmUgUHJvbWlzZS5wcm90b3R5cGUgZm9yIG5hdGl2ZSBhc3luYyBmdW5jdGlvbnMKaWYgKCFJU19QVVJFICYmIHR5cGVvZiBOYXRpdmVQcm9taXNlID09ICdmdW5jdGlvbicgJiYgIU5hdGl2ZVByb21pc2UucHJvdG90eXBlWydmaW5hbGx5J10pIHsKICByZWRlZmluZShOYXRpdmVQcm9taXNlLnByb3RvdHlwZSwgJ2ZpbmFsbHknLCBnZXRCdWlsdEluKCdQcm9taXNlJykucHJvdG90eXBlWydmaW5hbGx5J10pOwp9Cg==,J3VzZSBzdHJpY3QnOwp2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTsKdmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7CnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7CnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7CnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTsKdmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpOwoKdmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOwp2YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IGZhbHNlOwoKdmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9OwoKLy8gYCVJdGVyYXRvclByb3RvdHlwZSVgIG9iamVjdAovLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVpdGVyYXRvcnByb3RvdHlwZSUtb2JqZWN0CnZhciBJdGVyYXRvclByb3RvdHlwZSwgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlLCBhcnJheUl0ZXJhdG9yOwoKaWYgKFtdLmtleXMpIHsKICBhcnJheUl0ZXJhdG9yID0gW10ua2V5cygpOwogIC8vIFNhZmFyaSA4IGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YAogIGlmICghKCduZXh0JyBpbiBhcnJheUl0ZXJhdG9yKSkgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IHRydWU7CiAgZWxzZSB7CiAgICBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihnZXRQcm90b3R5cGVPZihhcnJheUl0ZXJhdG9yKSk7CiAgICBpZiAoUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSBJdGVyYXRvclByb3RvdHlwZSA9IFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZTsKICB9Cn0KCnZhciBORVdfSVRFUkFUT1JfUFJPVE9UWVBFID0gSXRlcmF0b3JQcm90b3R5cGUgPT0gdW5kZWZpbmVkIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHsKICB2YXIgdGVzdCA9IHt9OwogIC8vIEZGNDQtIGxlZ2FjeSBpdGVyYXRvcnMgY2FzZQogIHJldHVybiBJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0uY2FsbCh0ZXN0KSAhPT0gdGVzdDsKfSk7CgppZiAoTkVXX0lURVJBVE9SX1BST1RPVFlQRSkgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTsKCi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpCmlmICgoIUlTX1BVUkUgfHwgTkVXX0lURVJBVE9SX1BST1RPVFlQRSkgJiYgIWhhcyhJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IpKSB7CiAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7Cn0KCm1vZHVsZS5leHBvcnRzID0gewogIEl0ZXJhdG9yUHJvdG90eXBlOiBJdGVyYXRvclByb3RvdHlwZSwKICBCVUdHWV9TQUZBUklfSVRFUkFUT1JTOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTCn07Cg==,dmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTsKdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjsKdmFyIG1hY3JvdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90YXNrJykuc2V0Owp2YXIgSVNfSU9TID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MnKTsKdmFyIElTX1dFQk9TX1dFQktJVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtd2Vib3Mtd2Via2l0Jyk7CnZhciBJU19OT0RFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlJyk7Cgp2YXIgTXV0YXRpb25PYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyOwp2YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7CnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7CnZhciBQcm9taXNlID0gZ2xvYmFsLlByb21pc2U7Ci8vIE5vZGUuanMgMTEgc2hvd3MgRXhwZXJpbWVudGFsV2FybmluZyBvbiBnZXR0aW5nIGBxdWV1ZU1pY3JvdGFza2AKdmFyIHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihnbG9iYWwsICdxdWV1ZU1pY3JvdGFzaycpOwp2YXIgcXVldWVNaWNyb3Rhc2sgPSBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IgJiYgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yLnZhbHVlOwoKdmFyIGZsdXNoLCBoZWFkLCBsYXN0LCBub3RpZnksIHRvZ2dsZSwgbm9kZSwgcHJvbWlzZSwgdGhlbjsKCi8vIG1vZGVybiBlbmdpbmVzIGhhdmUgcXVldWVNaWNyb3Rhc2sgbWV0aG9kCmlmICghcXVldWVNaWNyb3Rhc2spIHsKICBmbHVzaCA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBwYXJlbnQsIGZuOwogICAgaWYgKElTX05PREUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSkgcGFyZW50LmV4aXQoKTsKICAgIHdoaWxlIChoZWFkKSB7CiAgICAgIGZuID0gaGVhZC5mbjsKICAgICAgaGVhZCA9IGhlYWQubmV4dDsKICAgICAgdHJ5IHsKICAgICAgICBmbigpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGlmIChoZWFkKSBub3RpZnkoKTsKICAgICAgICBlbHNlIGxhc3QgPSB1bmRlZmluZWQ7CiAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgIH0KICAgIH0gbGFzdCA9IHVuZGVmaW5lZDsKICAgIGlmIChwYXJlbnQpIHBhcmVudC5lbnRlcigpOwogIH07CgogIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlciwgZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMzkKICAvLyBhbHNvIGV4Y2VwdCBXZWJPUyBXZWJraXQgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg5OAogIGlmICghSVNfSU9TICYmICFJU19OT0RFICYmICFJU19XRUJPU19XRUJLSVQgJiYgTXV0YXRpb25PYnNlcnZlciAmJiBkb2N1bWVudCkgewogICAgdG9nZ2xlID0gdHJ1ZTsKICAgIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7CiAgICBuZXcgTXV0YXRpb25PYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7CiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7CiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7CiAgICB9OwogIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlCiAgfSBlbHNlIGlmIChQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSkgewogICAgLy8gUHJvbWlzZS5yZXNvbHZlIHdpdGhvdXQgYW4gYXJndW1lbnQgdGhyb3dzIGFuIGVycm9yIGluIExHIFdlYk9TIDIKICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTsKICAgIHRoZW4gPSBwcm9taXNlLnRoZW47CiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHRoZW4uY2FsbChwcm9taXNlLCBmbHVzaCk7CiAgICB9OwogIC8vIE5vZGUuanMgd2l0aG91dCBwcm9taXNlcwogIH0gZWxzZSBpZiAoSVNfTk9ERSkgewogICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkgewogICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTsKICAgIH07CiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjoKICAvLyAtIHNldEltbWVkaWF0ZQogIC8vIC0gTWVzc2FnZUNoYW5uZWwKICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnCiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2UKICAvLyAtIHNldFRpbWVvdXQKICB9IGVsc2UgewogICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkgewogICAgICAvLyBzdHJhbmdlIElFICsgd2VicGFjayBkZXYgc2VydmVyIGJ1ZyAtIHVzZSAuY2FsbChnbG9iYWwpCiAgICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpOwogICAgfTsKICB9Cn0KCm1vZHVsZS5leHBvcnRzID0gcXVldWVNaWNyb3Rhc2sgfHwgZnVuY3Rpb24gKGZuKSB7CiAgdmFyIHRhc2sgPSB7IGZuOiBmbiwgbmV4dDogdW5kZWZpbmVkIH07CiAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7CiAgaWYgKCFoZWFkKSB7CiAgICBoZWFkID0gdGFzazsKICAgIG5vdGlmeSgpOwogIH0gbGFzdCA9IHRhc2s7Cn07Cg==,dmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTsKdmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTsKdmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTsKdmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTsKdmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbCcpOwp2YXIgVVNFX1NZTUJPTF9BU19VSUQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQnKTsKCnZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpOwp2YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDsKdmFyIGNyZWF0ZVdlbGxLbm93blN5bWJvbCA9IFVTRV9TWU1CT0xfQVNfVUlEID8gU3ltYm9sIDogU3ltYm9sICYmIFN5bWJvbC53aXRob3V0U2V0dGVyIHx8IHVpZDsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHsKICBpZiAoIWhhcyhXZWxsS25vd25TeW1ib2xzU3RvcmUsIG5hbWUpKSB7CiAgICBpZiAoTkFUSVZFX1NZTUJPTCAmJiBoYXMoU3ltYm9sLCBuYW1lKSkgV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdID0gU3ltYm9sW25hbWVdOwogICAgZWxzZSBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBjcmVhdGVXZWxsS25vd25TeW1ib2woJ1N5bWJvbC4nICsgbmFtZSk7CiAgfSByZXR1cm4gV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdOwp9Owo=,dmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpOwoKLy8gYFRvUHJpbWl0aXZlYCBhYnN0cmFjdCBvcGVyYXRpb24KLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b3ByaW1pdGl2ZQovLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZQovLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZwptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgUFJFRkVSUkVEX1NUUklORykgewogIGlmICghaXNPYmplY3QoaW5wdXQpKSByZXR1cm4gaW5wdXQ7CiAgdmFyIGZuLCB2YWw7CiAgaWYgKFBSRUZFUlJFRF9TVFJJTkcgJiYgdHlwZW9mIChmbiA9IGlucHV0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGlucHV0KSkpIHJldHVybiB2YWw7CiAgaWYgKHR5cGVvZiAoZm4gPSBpbnB1dC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGlucHV0KSkpIHJldHVybiB2YWw7CiAgaWYgKCFQUkVGRVJSRURfU1RSSU5HICYmIHR5cGVvZiAoZm4gPSBpbnB1dC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKSByZXR1cm4gdmFsOwogIHRocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIik7Cn07Cg==,bW9kdWxlLmV4cG9ydHMgPSBmYWxzZTsK,dmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgewogIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7Cn07Cg==,dmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTsKdmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7Cgp2YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7CnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IHNldEdsb2JhbChTSEFSRUQsIHt9KTsKCm1vZHVsZS5leHBvcnRzID0gc3RvcmU7Cg==,dmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTsKdmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpOwp2YXIgaW5kZXhPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcycpLmluZGV4T2Y7CnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7CiAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3Qob2JqZWN0KTsKICB2YXIgaSA9IDA7CiAgdmFyIHJlc3VsdCA9IFtdOwogIHZhciBrZXk7CiAgZm9yIChrZXkgaW4gTykgIWhhcyhoaWRkZW5LZXlzLCBrZXkpICYmIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7CiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5cwogIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKSB7CiAgICB+aW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfTsK,dmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTsKdmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpOwoKdmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50OwovLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUUKdmFyIEVYSVNUUyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CiAgcmV0dXJuIEVYSVNUUyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307Cn07Cg==,dmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7CnZhciBhc3NpZ24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWFzc2lnbicpOwoKLy8gYE9iamVjdC5hc3NpZ25gIG1ldGhvZAovLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5hc3NpZ24KJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogT2JqZWN0LmFzc2lnbiAhPT0gYXNzaWduIH0sIHsKICBhc3NpZ246IGFzc2lnbgp9KTsK,dmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpOwp2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7CnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7CiAgYW5PYmplY3QoQyk7CiAgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4OwogIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7CiAgdmFyIHJlc29sdmUgPSBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlOwogIHJlc29sdmUoeCk7CiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7Cn07Cg==,dmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTsKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICB0cnkgewogICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGdsb2JhbCwga2V5LCB2YWx1ZSk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIGdsb2JhbFtrZXldID0gdmFsdWU7CiAgfSByZXR1cm4gdmFsdWU7Cn07Cg==,bW9kdWxlLmV4cG9ydHMgPSB7fTsK,bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykgewogIHRyeSB7CiAgICByZXR1cm4gISFleGVjKCk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIHJldHVybiB0cnVlOwogIH0KfTsK,dmFyIHBhdGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpOwp2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpOwoKdmFyIGFGdW5jdGlvbiA9IGZ1bmN0aW9uICh2YXJpYWJsZSkgewogIHJldHVybiB0eXBlb2YgdmFyaWFibGUgPT0gJ2Z1bmN0aW9uJyA/IHZhcmlhYmxlIDogdW5kZWZpbmVkOwp9OwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZXNwYWNlLCBtZXRob2QpIHsKICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBhRnVuY3Rpb24ocGF0aFtuYW1lc3BhY2VdKSB8fCBhRnVuY3Rpb24oZ2xvYmFsW25hbWVzcGFjZV0pCiAgICA6IHBhdGhbbmFtZXNwYWNlXSAmJiBwYXRoW25hbWVzcGFjZV1bbWV0aG9kXSB8fCBnbG9iYWxbbmFtZXNwYWNlXSAmJiBnbG9iYWxbbmFtZXNwYWNlXVttZXRob2RdOwp9Owo=,J3VzZSBzdHJpY3QnOwp2YXIgbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTsKdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CgovLyBOYXNob3JuIH4gSkRLOCBidWcKdmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICFuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHsgMTogMiB9LCAxKTsKCi8vIGBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlYCBtZXRob2QgaW1wbGVtZW50YXRpb24KLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLnByb3BlcnR5aXNlbnVtZXJhYmxlCmV4cG9ydHMuZiA9IE5BU0hPUk5fQlVHID8gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikgewogIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpOwogIHJldHVybiAhIWRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci5lbnVtZXJhYmxlOwp9IDogbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGU7Cg==,dmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpOwp2YXIgYVBvc3NpYmxlUHJvdG90eXBlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlJyk7CgovLyBgT2JqZWN0LnNldFByb3RvdHlwZU9mYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3Quc2V0cHJvdG90eXBlb2YKLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuCi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovCm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IGZ1bmN0aW9uICgpIHsKICB2YXIgQ09SUkVDVF9TRVRURVIgPSBmYWxzZTsKICB2YXIgdGVzdCA9IHt9OwogIHZhciBzZXR0ZXI7CiAgdHJ5IHsKICAgIHNldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LnByb3RvdHlwZSwgJ19fcHJvdG9fXycpLnNldDsKICAgIHNldHRlci5jYWxsKHRlc3QsIFtdKTsKICAgIENPUlJFQ1RfU0VUVEVSID0gdGVzdCBpbnN0YW5jZW9mIEFycmF5OwogIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH0KICByZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHsKICAgIGFuT2JqZWN0KE8pOwogICAgYVBvc3NpYmxlUHJvdG90eXBlKHByb3RvKTsKICAgIGlmIChDT1JSRUNUX1NFVFRFUikgc2V0dGVyLmNhbGwoTywgcHJvdG8pOwogICAgZWxzZSBPLl9fcHJvdG9fXyA9IHByb3RvOwogICAgcmV0dXJuIE87CiAgfTsKfSgpIDogdW5kZWZpbmVkKTsK,dmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mOwp2YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7Cgp2YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBUQUcsIFNUQVRJQykgewogIGlmIChpdCAmJiAhaGFzKGl0ID0gU1RBVElDID8gaXQgOiBpdC5wcm90b3R5cGUsIFRPX1NUUklOR19UQUcpKSB7CiAgICBkZWZpbmVQcm9wZXJ0eShpdCwgVE9fU1RSSU5HX1RBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBUQUcgfSk7CiAgfQp9Owo=,dmFyIGNoZWNrID0gZnVuY3Rpb24gKGl0KSB7CiAgcmV0dXJuIGl0ICYmIGl0Lk1hdGggPT0gTWF0aCAmJiBpdDsKfTsKCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4Cm1vZHVsZS5leHBvcnRzID0KICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWYKICBjaGVjayh0eXBlb2YgZ2xvYmFsVGhpcyA9PSAnb2JqZWN0JyAmJiBnbG9iYWxUaGlzKSB8fAogIGNoZWNrKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93KSB8fAogIGNoZWNrKHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYpIHx8CiAgY2hlY2sodHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwpIHx8CiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jCiAgKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0pKCkgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTsK,dmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpOwp2YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpOwoKLy8gYE9iamVjdC5rZXlzYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3Qua2V5cwptb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykgewogIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgZW51bUJ1Z0tleXMpOwp9Owo=,dmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTsKdmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpOwp2YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTsKdmFyIENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXInKTsKCnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTsKdmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7CgovLyBgT2JqZWN0LmdldFByb3RvdHlwZU9mYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0cHJvdG90eXBlb2YKbW9kdWxlLmV4cG9ydHMgPSBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiAoTykgewogIE8gPSB0b09iamVjdChPKTsKICBpZiAoaGFzKE8sIElFX1BST1RPKSkgcmV0dXJuIE9bSUVfUFJPVE9dOwogIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7CiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7CiAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvdHlwZSA6IG51bGw7Cn07Cg==,dmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7Cgptb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7CiAgZnVuY3Rpb24gRigpIHsgLyogZW1wdHkgKi8gfQogIEYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnVsbDsKICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBGKCkpICE9PSBGLnByb3RvdHlwZTsKfSk7Cg==,J3VzZSBzdHJpY3QnOwp2YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7CnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcycpOwp2YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpOwp2YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpOwp2YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yJyk7Cgp2YXIgQVJSQVlfSVRFUkFUT1IgPSAnQXJyYXkgSXRlcmF0b3InOwp2YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0Owp2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKEFSUkFZX0lURVJBVE9SKTsKCi8vIGBBcnJheS5wcm90b3R5cGUuZW50cmllc2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmVudHJpZXMKLy8gYEFycmF5LnByb3RvdHlwZS5rZXlzYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUua2V5cwovLyBgQXJyYXkucHJvdG90eXBlLnZhbHVlc2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnZhbHVlcwovLyBgQXJyYXkucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEBpdGVyYXRvcgovLyBgQ3JlYXRlQXJyYXlJdGVyYXRvcmAgaW50ZXJuYWwgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRlYXJyYXlpdGVyYXRvcgptb2R1bGUuZXhwb3J0cyA9IGRlZmluZUl0ZXJhdG9yKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHsKICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHsKICAgIHR5cGU6IEFSUkFZX0lURVJBVE9SLAogICAgdGFyZ2V0OiB0b0luZGV4ZWRPYmplY3QoaXRlcmF0ZWQpLCAvLyB0YXJnZXQKICAgIGluZGV4OiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleAogICAga2luZDoga2luZCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBraW5kCiAgfSk7Ci8vIGAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJWFycmF5aXRlcmF0b3Jwcm90b3R5cGUlLm5leHQKfSwgZnVuY3Rpb24gKCkgewogIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7CiAgdmFyIHRhcmdldCA9IHN0YXRlLnRhcmdldDsKICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7CiAgdmFyIGluZGV4ID0gc3RhdGUuaW5kZXgrKzsKICBpZiAoIXRhcmdldCB8fCBpbmRleCA+PSB0YXJnZXQubGVuZ3RoKSB7CiAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7CiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07CiAgfQogIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHsgdmFsdWU6IGluZGV4LCBkb25lOiBmYWxzZSB9OwogIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4geyB2YWx1ZTogdGFyZ2V0W2luZGV4XSwgZG9uZTogZmFsc2UgfTsKICByZXR1cm4geyB2YWx1ZTogW2luZGV4LCB0YXJnZXRbaW5kZXhdXSwgZG9uZTogZmFsc2UgfTsKfSwgJ3ZhbHVlcycpOwoKLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRldW5tYXBwZWRhcmd1bWVudHNvYmplY3QKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGVtYXBwZWRhcmd1bWVudHNvYmplY3QKSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTsKCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXMKYWRkVG9VbnNjb3BhYmxlcygna2V5cycpOwphZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTsKYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpOwo=,dmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgb3B0aW9ucykgewogIGZvciAodmFyIGtleSBpbiBzcmMpIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzcmNba2V5XSwgb3B0aW9ucyk7CiAgcmV0dXJuIHRhcmdldDsKfTsK,bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykgewogIHRyeSB7CiAgICByZXR1cm4geyBlcnJvcjogZmFsc2UsIHZhbHVlOiBleGVjKCkgfTsKICB9IGNhdGNoIChlcnJvcikgewogICAgcmV0dXJuIHsgZXJyb3I6IHRydWUsIHZhbHVlOiBlcnJvciB9OwogIH0KfTsK,J3VzZSBzdHJpY3QnOwp2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTsKdmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpOwp2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpOwp2YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTsKdmFyIE5hdGl2ZVByb21pc2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3InKTsKdmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7CnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZS1hbGwnKTsKdmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7CnZhciBzZXRTcGVjaWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1zcGVjaWVzJyk7CnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTsKdmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7CnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7CnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7CnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTsKdmFyIGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24nKTsKdmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7CnZhciB0YXNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Rhc2snKS5zZXQ7CnZhciBtaWNyb3Rhc2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbWljcm90YXNrJyk7CnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTsKdmFyIGhvc3RSZXBvcnRFcnJvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzJyk7CnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7CnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTsKdmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTsKdmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7CnZhciBJU19OT0RFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlJyk7CnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uJyk7Cgp2YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpOwp2YXIgUFJPTUlTRSA9ICdQcm9taXNlJzsKdmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDsKdmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDsKdmFyIGdldEludGVybmFsUHJvbWlzZVN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoUFJPTUlTRSk7CnZhciBQcm9taXNlQ29uc3RydWN0b3IgPSBOYXRpdmVQcm9taXNlOwp2YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjsKdmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50Owp2YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzOwp2YXIgJGZldGNoID0gZ2V0QnVpbHRJbignZmV0Y2gnKTsKdmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZjsKdmFyIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5Owp2YXIgRElTUEFUQ0hfRVZFTlQgPSAhIShkb2N1bWVudCAmJiBkb2N1bWVudC5jcmVhdGVFdmVudCAmJiBnbG9iYWwuZGlzcGF0Y2hFdmVudCk7CnZhciBOQVRJVkVfUkVKRUNUSU9OX0VWRU5UID0gdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nOwp2YXIgVU5IQU5ETEVEX1JFSkVDVElPTiA9ICd1bmhhbmRsZWRyZWplY3Rpb24nOwp2YXIgUkVKRUNUSU9OX0hBTkRMRUQgPSAncmVqZWN0aW9uaGFuZGxlZCc7CnZhciBQRU5ESU5HID0gMDsKdmFyIEZVTEZJTExFRCA9IDE7CnZhciBSRUpFQ1RFRCA9IDI7CnZhciBIQU5ETEVEID0gMTsKdmFyIFVOSEFORExFRCA9IDI7CnZhciBJbnRlcm5hbCwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFByb21pc2VXcmFwcGVyLCBuYXRpdmVUaGVuOwoKdmFyIEZPUkNFRCA9IGlzRm9yY2VkKFBST01JU0UsIGZ1bmN0aW9uICgpIHsKICB2YXIgR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSA9IGluc3BlY3RTb3VyY2UoUHJvbWlzZUNvbnN0cnVjdG9yKSAhPT0gU3RyaW5nKFByb21pc2VDb25zdHJ1Y3Rvcik7CiAgaWYgKCFHTE9CQUxfQ09SRV9KU19QUk9NSVNFKSB7CiAgICAvLyBWOCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzCiAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD04MzA1NjUKICAgIC8vIFdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zCiAgICBpZiAoVjhfVkVSU0lPTiA9PT0gNjYpIHJldHVybiB0cnVlOwogICAgLy8gVW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdAogICAgaWYgKCFJU19OT0RFICYmICFOQVRJVkVfUkVKRUNUSU9OX0VWRU5UKSByZXR1cm4gdHJ1ZTsKICB9CiAgLy8gV2UgbmVlZCBQcm9taXNlI2ZpbmFsbHkgaW4gdGhlIHB1cmUgdmVyc2lvbiBmb3IgcHJldmVudGluZyBwcm90b3R5cGUgcG9sbHV0aW9uCiAgaWYgKElTX1BVUkUgJiYgIVByb21pc2VDb25zdHJ1Y3Rvci5wcm90b3R5cGVbJ2ZpbmFsbHknXSkgcmV0dXJuIHRydWU7CiAgLy8gV2UgY2FuJ3QgdXNlIEBAc3BlY2llcyBmZWF0dXJlIGRldGVjdGlvbiBpbiBWOCBzaW5jZSBpdCBjYXVzZXMKICAvLyBkZW9wdGltaXphdGlvbiBhbmQgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24KICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjc5CiAgaWYgKFY4X1ZFUlNJT04gPj0gNTEgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KFByb21pc2VDb25zdHJ1Y3RvcikpIHJldHVybiBmYWxzZTsKICAvLyBEZXRlY3QgY29ycmVjdG5lc3Mgb2Ygc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydAogIHZhciBwcm9taXNlID0gUHJvbWlzZUNvbnN0cnVjdG9yLnJlc29sdmUoMSk7CiAgdmFyIEZha2VQcm9taXNlID0gZnVuY3Rpb24gKGV4ZWMpIHsKICAgIGV4ZWMoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pOwogIH07CiAgdmFyIGNvbnN0cnVjdG9yID0gcHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9OwogIGNvbnN0cnVjdG9yW1NQRUNJRVNdID0gRmFrZVByb21pc2U7CiAgcmV0dXJuICEocHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZSk7Cn0pOwoKdmFyIElOQ09SUkVDVF9JVEVSQVRJT04gPSBGT1JDRUQgfHwgIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHsKICBQcm9taXNlQ29uc3RydWN0b3IuYWxsKGl0ZXJhYmxlKVsnY2F0Y2gnXShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pOwp9KTsKCi8vIGhlbHBlcnMKdmFyIGlzVGhlbmFibGUgPSBmdW5jdGlvbiAoaXQpIHsKICB2YXIgdGhlbjsKICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7Cn07Cgp2YXIgbm90aWZ5ID0gZnVuY3Rpb24gKHN0YXRlLCBpc1JlamVjdCkgewogIGlmIChzdGF0ZS5ub3RpZmllZCkgcmV0dXJuOwogIHN0YXRlLm5vdGlmaWVkID0gdHJ1ZTsKICB2YXIgY2hhaW4gPSBzdGF0ZS5yZWFjdGlvbnM7CiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHsKICAgIHZhciB2YWx1ZSA9IHN0YXRlLnZhbHVlOwogICAgdmFyIG9rID0gc3RhdGUuc3RhdGUgPT0gRlVMRklMTEVEOwogICAgdmFyIGluZGV4ID0gMDsKICAgIC8vIHZhcmlhYmxlIGxlbmd0aCAtIGNhbid0IHVzZSBmb3JFYWNoCiAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gaW5kZXgpIHsKICAgICAgdmFyIHJlYWN0aW9uID0gY2hhaW5baW5kZXgrK107CiAgICAgIHZhciBoYW5kbGVyID0gb2sgPyByZWFjdGlvbi5vayA6IHJlYWN0aW9uLmZhaWw7CiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTsKICAgICAgdmFyIHJlamVjdCA9IHJlYWN0aW9uLnJlamVjdDsKICAgICAgdmFyIGRvbWFpbiA9IHJlYWN0aW9uLmRvbWFpbjsKICAgICAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkOwogICAgICB0cnkgewogICAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgICBpZiAoIW9rKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZS5yZWplY3Rpb24gPT09IFVOSEFORExFRCkgb25IYW5kbGVVbmhhbmRsZWQoc3RhdGUpOwogICAgICAgICAgICBzdGF0ZS5yZWplY3Rpb24gPSBIQU5ETEVEOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGhhbmRsZXIgPT09IHRydWUpIHJlc3VsdCA9IHZhbHVlOwogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmIChkb21haW4pIGRvbWFpbi5lbnRlcigpOwogICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTsgLy8gY2FuIHRocm93CiAgICAgICAgICAgIGlmIChkb21haW4pIHsKICAgICAgICAgICAgICBkb21haW4uZXhpdCgpOwogICAgICAgICAgICAgIGV4aXRlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2UpIHsKICAgICAgICAgICAgcmVqZWN0KFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTsKICAgICAgICAgIH0gZWxzZSBpZiAodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSkgewogICAgICAgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpOwogICAgICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTsKICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBpZiAoZG9tYWluICYmICFleGl0ZWQpIGRvbWFpbi5leGl0KCk7CiAgICAgICAgcmVqZWN0KGVycm9yKTsKICAgICAgfQogICAgfQogICAgc3RhdGUucmVhY3Rpb25zID0gW107CiAgICBzdGF0ZS5ub3RpZmllZCA9IGZhbHNlOwogICAgaWYgKGlzUmVqZWN0ICYmICFzdGF0ZS5yZWplY3Rpb24pIG9uVW5oYW5kbGVkKHN0YXRlKTsKICB9KTsKfTsKCnZhciBkaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIHByb21pc2UsIHJlYXNvbikgewogIHZhciBldmVudCwgaGFuZGxlcjsKICBpZiAoRElTUEFUQ0hfRVZFTlQpIHsKICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7CiAgICBldmVudC5wcm9taXNlID0gcHJvbWlzZTsKICAgIGV2ZW50LnJlYXNvbiA9IHJlYXNvbjsKICAgIGV2ZW50LmluaXRFdmVudChuYW1lLCBmYWxzZSwgdHJ1ZSk7CiAgICBnbG9iYWwuZGlzcGF0Y2hFdmVudChldmVudCk7CiAgfSBlbHNlIGV2ZW50ID0geyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHJlYXNvbiB9OwogIGlmICghTkFUSVZFX1JFSkVDVElPTl9FVkVOVCAmJiAoaGFuZGxlciA9IGdsb2JhbFsnb24nICsgbmFtZV0pKSBoYW5kbGVyKGV2ZW50KTsKICBlbHNlIGlmIChuYW1lID09PSBVTkhBTkRMRURfUkVKRUNUSU9OKSBob3N0UmVwb3J0RXJyb3JzKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCByZWFzb24pOwp9OwoKdmFyIG9uVW5oYW5kbGVkID0gZnVuY3Rpb24gKHN0YXRlKSB7CiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkgewogICAgdmFyIHByb21pc2UgPSBzdGF0ZS5mYWNhZGU7CiAgICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTsKICAgIHZhciBJU19VTkhBTkRMRUQgPSBpc1VuaGFuZGxlZChzdGF0ZSk7CiAgICB2YXIgcmVzdWx0OwogICAgaWYgKElTX1VOSEFORExFRCkgewogICAgICByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoSVNfTk9ERSkgewogICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7CiAgICAgICAgfSBlbHNlIGRpc3BhdGNoRXZlbnQoVU5IQU5ETEVEX1JFSkVDVElPTiwgcHJvbWlzZSwgdmFsdWUpOwogICAgICB9KTsKICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGQKICAgICAgc3RhdGUucmVqZWN0aW9uID0gSVNfTk9ERSB8fCBpc1VuaGFuZGxlZChzdGF0ZSkgPyBVTkhBTkRMRUQgOiBIQU5ETEVEOwogICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyByZXN1bHQudmFsdWU7CiAgICB9CiAgfSk7Cn07Cgp2YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHsKICByZXR1cm4gc3RhdGUucmVqZWN0aW9uICE9PSBIQU5ETEVEICYmICFzdGF0ZS5wYXJlbnQ7Cn07Cgp2YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHsKICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7CiAgICB2YXIgcHJvbWlzZSA9IHN0YXRlLmZhY2FkZTsKICAgIGlmIChJU19OT0RFKSB7CiAgICAgIHByb2Nlc3MuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpOwogICAgfSBlbHNlIGRpc3BhdGNoRXZlbnQoUkVKRUNUSU9OX0hBTkRMRUQsIHByb21pc2UsIHN0YXRlLnZhbHVlKTsKICB9KTsKfTsKCnZhciBiaW5kID0gZnVuY3Rpb24gKGZuLCBzdGF0ZSwgdW53cmFwKSB7CiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkgewogICAgZm4oc3RhdGUsIHZhbHVlLCB1bndyYXApOwogIH07Cn07Cgp2YXIgaW50ZXJuYWxSZWplY3QgPSBmdW5jdGlvbiAoc3RhdGUsIHZhbHVlLCB1bndyYXApIHsKICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuOwogIHN0YXRlLmRvbmUgPSB0cnVlOwogIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwOwogIHN0YXRlLnZhbHVlID0gdmFsdWU7CiAgc3RhdGUuc3RhdGUgPSBSRUpFQ1RFRDsKICBub3RpZnkoc3RhdGUsIHRydWUpOwp9OwoKdmFyIGludGVybmFsUmVzb2x2ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdmFsdWUsIHVud3JhcCkgewogIGlmIChzdGF0ZS5kb25lKSByZXR1cm47CiAgc3RhdGUuZG9uZSA9IHRydWU7CiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7CiAgdHJ5IHsKICAgIGlmIChzdGF0ZS5mYWNhZGUgPT09IHZhbHVlKSB0aHJvdyBUeXBlRXJyb3IoIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmIik7CiAgICB2YXIgdGhlbiA9IGlzVGhlbmFibGUodmFsdWUpOwogICAgaWYgKHRoZW4pIHsKICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgd3JhcHBlciA9IHsgZG9uZTogZmFsc2UgfTsKICAgICAgICB0cnkgewogICAgICAgICAgdGhlbi5jYWxsKHZhbHVlLAogICAgICAgICAgICBiaW5kKGludGVybmFsUmVzb2x2ZSwgd3JhcHBlciwgc3RhdGUpLAogICAgICAgICAgICBiaW5kKGludGVybmFsUmVqZWN0LCB3cmFwcGVyLCBzdGF0ZSkKICAgICAgICAgICk7CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgIGludGVybmFsUmVqZWN0KHdyYXBwZXIsIGVycm9yLCBzdGF0ZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIHN0YXRlLnZhbHVlID0gdmFsdWU7CiAgICAgIHN0YXRlLnN0YXRlID0gRlVMRklMTEVEOwogICAgICBub3RpZnkoc3RhdGUsIGZhbHNlKTsKICAgIH0KICB9IGNhdGNoIChlcnJvcikgewogICAgaW50ZXJuYWxSZWplY3QoeyBkb25lOiBmYWxzZSB9LCBlcnJvciwgc3RhdGUpOwogIH0KfTsKCi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsCmlmIChGT1JDRUQpIHsKICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKQogIFByb21pc2VDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHsKICAgIGFuSW5zdGFuY2UodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yLCBQUk9NSVNFKTsKICAgIGFGdW5jdGlvbihleGVjdXRvcik7CiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpOwogICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTsKICAgIHRyeSB7CiAgICAgIGV4ZWN1dG9yKGJpbmQoaW50ZXJuYWxSZXNvbHZlLCBzdGF0ZSksIGJpbmQoaW50ZXJuYWxSZWplY3QsIHN0YXRlKSk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBpbnRlcm5hbFJlamVjdChzdGF0ZSwgZXJyb3IpOwogICAgfQogIH07CiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzCiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7CiAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHsKICAgICAgdHlwZTogUFJPTUlTRSwKICAgICAgZG9uZTogZmFsc2UsCiAgICAgIG5vdGlmaWVkOiBmYWxzZSwKICAgICAgcGFyZW50OiBmYWxzZSwKICAgICAgcmVhY3Rpb25zOiBbXSwKICAgICAgcmVqZWN0aW9uOiBmYWxzZSwKICAgICAgc3RhdGU6IFBFTkRJTkcsCiAgICAgIHZhbHVlOiB1bmRlZmluZWQKICAgIH0pOwogIH07CiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVkZWZpbmVBbGwoUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZSwgewogICAgLy8gYFByb21pc2UucHJvdG90eXBlLnRoZW5gIG1ldGhvZAogICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS50aGVuCiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7CiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUHJvbWlzZVN0YXRlKHRoaXMpOwogICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yKSk7CiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7CiAgICAgIHJlYWN0aW9uLmZhaWwgPSB0eXBlb2Ygb25SZWplY3RlZCA9PSAnZnVuY3Rpb24nICYmIG9uUmVqZWN0ZWQ7CiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IElTX05PREUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDsKICAgICAgc3RhdGUucGFyZW50ID0gdHJ1ZTsKICAgICAgc3RhdGUucmVhY3Rpb25zLnB1c2gocmVhY3Rpb24pOwogICAgICBpZiAoc3RhdGUuc3RhdGUgIT0gUEVORElORykgbm90aWZ5KHN0YXRlLCBmYWxzZSk7CiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlOwogICAgfSwKICAgIC8vIGBQcm9taXNlLnByb3RvdHlwZS5jYXRjaGAgbWV0aG9kCiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLmNhdGNoCiAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWplY3RlZCkgewogICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7CiAgICB9CiAgfSk7CiAgT3duUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgcHJvbWlzZSA9IG5ldyBJbnRlcm5hbCgpOwogICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZShwcm9taXNlKTsKICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7CiAgICB0aGlzLnJlc29sdmUgPSBiaW5kKGludGVybmFsUmVzb2x2ZSwgc3RhdGUpOwogICAgdGhpcy5yZWplY3QgPSBiaW5kKGludGVybmFsUmVqZWN0LCBzdGF0ZSk7CiAgfTsKICBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykgewogICAgcmV0dXJuIEMgPT09IFByb21pc2VDb25zdHJ1Y3RvciB8fCBDID09PSBQcm9taXNlV3JhcHBlcgogICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKQogICAgICA6IG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eShDKTsKICB9OwoKICBpZiAoIUlTX1BVUkUgJiYgdHlwZW9mIE5hdGl2ZVByb21pc2UgPT0gJ2Z1bmN0aW9uJykgewogICAgbmF0aXZlVGhlbiA9IE5hdGl2ZVByb21pc2UucHJvdG90eXBlLnRoZW47CgogICAgLy8gd3JhcCBuYXRpdmUgUHJvbWlzZSN0aGVuIGZvciBuYXRpdmUgYXN5bmMgZnVuY3Rpb25zCiAgICByZWRlZmluZShOYXRpdmVQcm9taXNlLnByb3RvdHlwZSwgJ3RoZW4nLCBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7CiAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlQ29uc3RydWN0b3IoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgIG5hdGl2ZVRoZW4uY2FsbCh0aGF0LCByZXNvbHZlLCByZWplY3QpOwogICAgICB9KS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTsKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NDAKICAgIH0sIHsgdW5zYWZlOiB0cnVlIH0pOwoKICAgIC8vIHdyYXAgZmV0Y2ggcmVzdWx0CiAgICBpZiAodHlwZW9mICRmZXRjaCA9PSAnZnVuY3Rpb24nKSAkKHsgZ2xvYmFsOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwgewogICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgZmV0Y2g6IGZ1bmN0aW9uIGZldGNoKGlucHV0IC8qICwgaW5pdCAqLykgewogICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShQcm9taXNlQ29uc3RydWN0b3IsICRmZXRjaC5hcHBseShnbG9iYWwsIGFyZ3VtZW50cykpOwogICAgICB9CiAgICB9KTsKICB9Cn0KCiQoeyBnbG9iYWw6IHRydWUsIHdyYXA6IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHsKICBQcm9taXNlOiBQcm9taXNlQ29uc3RydWN0b3IKfSk7CgpzZXRUb1N0cmluZ1RhZyhQcm9taXNlQ29uc3RydWN0b3IsIFBST01JU0UsIGZhbHNlLCB0cnVlKTsKc2V0U3BlY2llcyhQUk9NSVNFKTsKClByb21pc2VXcmFwcGVyID0gZ2V0QnVpbHRJbihQUk9NSVNFKTsKCi8vIHN0YXRpY3MKJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwgewogIC8vIGBQcm9taXNlLnJlamVjdGAgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJlamVjdAogIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHsKICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcyk7CiAgICBjYXBhYmlsaXR5LnJlamVjdC5jYWxsKHVuZGVmaW5lZCwgcik7CiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlOwogIH0KfSk7CgokKHsgdGFyZ2V0OiBQUk9NSVNFLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfHwgRk9SQ0VEIH0sIHsKICAvLyBgUHJvbWlzZS5yZXNvbHZlYCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmVzb2x2ZQogIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkgewogICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKElTX1BVUkUgJiYgdGhpcyA9PT0gUHJvbWlzZVdyYXBwZXIgPyBQcm9taXNlQ29uc3RydWN0b3IgOiB0aGlzLCB4KTsKICB9Cn0pOwoKJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHsKICAvLyBgUHJvbWlzZS5hbGxgIG1ldGhvZAogIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbGwKICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSkgewogICAgdmFyIEMgPSB0aGlzOwogICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTsKICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlOwogICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0OwogICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkgewogICAgICB2YXIgJHByb21pc2VSZXNvbHZlID0gYUZ1bmN0aW9uKEMucmVzb2x2ZSk7CiAgICAgIHZhciB2YWx1ZXMgPSBbXTsKICAgICAgdmFyIGNvdW50ZXIgPSAwOwogICAgICB2YXIgcmVtYWluaW5nID0gMTsKICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHsKICAgICAgICB2YXIgaW5kZXggPSBjb3VudGVyKys7CiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTsKICAgICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpOwogICAgICAgIHJlbWFpbmluZysrOwogICAgICAgICRwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuOwogICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7CiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0gdmFsdWU7CiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7CiAgICAgICAgfSwgcmVqZWN0KTsKICAgICAgfSk7CiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTsKICAgIH0pOwogICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7CiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlOwogIH0sCiAgLy8gYFByb21pc2UucmFjZWAgbWV0aG9kCiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJhY2UKICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7CiAgICB2YXIgQyA9IHRoaXM7CiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpOwogICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0OwogICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkgewogICAgICB2YXIgJHByb21pc2VSZXNvbHZlID0gYUZ1bmN0aW9uKEMucmVzb2x2ZSk7CiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7CiAgICAgICAgJHByb21pc2VSZXNvbHZlLmNhbGwoQywgcHJvbWlzZSkudGhlbihjYXBhYmlsaXR5LnJlc29sdmUsIHJlamVjdCk7CiAgICAgIH0pOwogICAgfSk7CiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTsKICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7CiAgfQp9KTsK,dmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTsKdmFyIG93bktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb3duLWtleXMnKTsKdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7CnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkgewogIHZhciBrZXlzID0gb3duS2V5cyhzb3VyY2UpOwogIHZhciBkZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7CiAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mOwogIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAgdmFyIGtleSA9IGtleXNbaV07CiAgICBpZiAoIWhhcyh0YXJnZXQsIGtleSkpIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsKICB9Cn07Cg==,dmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpOwp2YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpOwoKdmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOwp2YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7CgovLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b3R5cGVbSVRFUkFUT1JdID09PSBpdCk7Cn07Cg==,J3VzZSBzdHJpY3QnOwp2YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTsKCnZhciBQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7CiAgdmFyIHJlc29sdmUsIHJlamVjdDsKICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbiAoJCRyZXNvbHZlLCAkJHJlamVjdCkgewogICAgaWYgKHJlc29sdmUgIT09IHVuZGVmaW5lZCB8fCByZWplY3QgIT09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpOwogICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTsKICAgIHJlamVjdCA9ICQkcmVqZWN0OwogIH0pOwogIHRoaXMucmVzb2x2ZSA9IGFGdW5jdGlvbihyZXNvbHZlKTsKICB0aGlzLnJlamVjdCA9IGFGdW5jdGlvbihyZWplY3QpOwp9OwoKLy8gMjUuNC4xLjUgTmV3UHJvbWlzZUNhcGFiaWxpdHkoQykKbW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIChDKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTsKfTsK,dmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTsKdmFyIGNsYXNzb2ZSYXcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpOwoKdmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7Ci8vIEVTMyB3cm9uZyBoZXJlCnZhciBDT1JSRUNUX0FSR1VNRU5UUyA9IGNsYXNzb2ZSYXcoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnOwoKLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3IKdmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7CiAgdHJ5IHsKICAgIHJldHVybiBpdFtrZXldOwogIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH0KfTsKCi8vIGdldHRpbmcgdGFnIGZyb20gRVM2KyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AKbW9kdWxlLmV4cG9ydHMgPSBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPyBjbGFzc29mUmF3IDogZnVuY3Rpb24gKGl0KSB7CiAgdmFyIE8sIHRhZywgcmVzdWx0OwogIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJwogICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlCiAgICA6IHR5cGVvZiAodGFnID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUT19TVFJJTkdfVEFHKSkgPT0gJ3N0cmluZycgPyB0YWcKICAgIC8vIGJ1aWx0aW5UYWcgY2FzZQogICAgOiBDT1JSRUNUX0FSR1VNRU5UUyA/IGNsYXNzb2ZSYXcoTykKICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2sKICAgIDogKHJlc3VsdCA9IGNsYXNzb2ZSYXcoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiByZXN1bHQ7Cn07Cg==,dmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTsKdmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTsKCnZhciBrZXlzID0gc2hhcmVkKCdrZXlzJyk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHsKICByZXR1cm4ga2V5c1trZXldIHx8IChrZXlzW2tleV0gPSB1aWQoa2V5KSk7Cn07Cg==,Ly8gdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3MKdmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTsKdmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgewogIHJldHVybiBJbmRleGVkT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoaXQpKTsKfTsK,dmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbCcpOwoKbW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfU1lNQk9MCiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmCiAgJiYgIVN5bWJvbC5zaGFtCiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmCiAgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJzsK,YnJvd3Nlci5ydW50aW1lLm9uTWVzc2FnZS5hZGRMaXN0ZW5lcigoX3JlcXVlc3QsIF9zZW5kZXIsIF9zZW5kUmVzcG9uc2UpID0+IHsKICBjb25zb2xlLmxvZygiSGVsbG8gZnJvbSB0aGUgYmFja2dyb3VuZCIpOwoKICBicm93c2VyLnRhYnMuZXhlY3V0ZVNjcmlwdCh7CiAgICBmaWxlOiAianMvY29udGVudC1zY3JpcHQuanMiCiAgfSk7Cn0pOwo=,dmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTsKCm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLlByb21pc2U7Cg==,
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment